|
|
1.1 root 1: // Screen Conversion, Medium Res to 640x8Bit
2:
3: void ConvertMediumRes_640x8Bit_YLoop(void);
4: void Line_ConvertMediumRes_640x8Bit(void);
5:
6: void ConvertMediumRes_640x8Bit(void)
7: {
8: fprintf(stderr,"FIXME: Screen Conversion, Medium Res to 640x8Bit\n");
9: /* FIXME */
10: /*
11: __asm {
12: push ebp
13: push edi
14: push esi
15: push ebx
16:
17: xor edx,edx // Clear index for loop
18:
19: call Convert_StartFrame // Start frame, track palettes
20: mov eax,[STScreenStartHorizLine]
21: mov [ScrY],eax // Starting line in ST screen
22: jmp ConvertMediumRes_640x8Bit_YLoop
23: }
24: */
25: }
26: /*
27: NAKED void ConvertMediumRes_640x8Bit_YLoop(void)
28: {
29: __asm {
30: // Get screen addresses, 'edi'-ST screen, 'ebp'-Previous ST screen, 'esi'-PC screen
31: mov eax,[ScrY]
32: mov eax,STScreenLineOffset[eax*4] // Offset for this line
33: add eax,[STScreenLeftSkipBytes] // Amount to skip on left hand side
34: mov edi,[pSTScreen] // ST format screen 4-plane 16 colours
35: add edi,eax
36: mov ebp,[pSTScreenCopy] // Previous ST format screen
37: add ebp,eax
38: mov esi,[pPCScreenDest] // PC format screen, byte per pixel 256 colours
39:
40: call AdjustLinePaletteRemap // Change palette table, DO NOT corrupt edx,edi,esi or ebp!
41: test eax,0x00030000
42: je Line_ConvertLowRes_640x8Bit // resolution change(MUST be first)
43: jmp Line_ConvertMediumRes_640x8Bit // 0 palette same, can do check tests
44: }
45: }
46: NAKED void Line_ConvertMediumRes_640x8Bit(void)
47: {
48: __asm {
49: mov eax,[STScreenWidthBytes] // Amount to draw across
50: shr eax,2 // in 16-pixels(4 bytes)
51: mov [ScrX],eax
52: x_loop:
53: #ifdef TEST_SCREEN_UPDATE
54: mov BYTE PTR [esi+0],0
55: mov BYTE PTR [esi+2],0
56: mov BYTE PTR [esi+4],0
57: mov BYTE PTR [esi+6],0
58: mov BYTE PTR [esi+8],0
59: mov BYTE PTR [esi+10],0
60: mov BYTE PTR [esi+12],0
61: mov BYTE PTR [esi+14],0
62: #endif //TEST_SCREEN_UPDATE
63:
64: // Do 16 pixels at one time
65: mov ebx,[edi]
66: // Full update? or just test changes?
67: test [ScrUpdateFlag],0xe0000000
68: jne copy_word // Force
69: // Does differ?
70: cmp ebx,[ebp]
71: je next_word // Pixels are same as last frame, so ignore
72:
73: copy_word:
74: mov [bScreenContentsChanged],TRUE
75:
76: // Plot in 'wrong-order', as ebx is 68000 endian
77: push ebp
78: cmp [bScrDoubleY],TRUE // Double on Y?
79: je double_y
80:
81: MED_BUILD_PIXELS_0 // Generate 'ecx' as pixels [4,5,6,7]
82: PLOT_MED_640_8BIT(4)
83: MED_BUILD_PIXELS_1 // Generate 'ecx' as pixels [12,13,14,15]
84: PLOT_MED_640_8BIT(12)
85: MED_BUILD_PIXELS_2 // Generate 'ecx' as pixels [0,1,2,3]
86: PLOT_MED_640_8BIT(0)
87: MED_BUILD_PIXELS_3 // Generate 'ecx' as pixels [8,9,10,11]
88: PLOT_MED_640_8BIT(8)
89:
90: jmp done_word
91:
92: double_y:
93: push ebp
94: mov ebp,[PCScreenBytesPerLine]
95: MED_BUILD_PIXELS_0 // Generate 'ecx' as pixels [4,5,6,7]
96: PLOT_MED_640_8BIT_DOUBLE_Y(4)
97: MED_BUILD_PIXELS_1 // Generate 'ecx' as pixels [12,13,14,15]
98: PLOT_MED_640_8BIT_DOUBLE_Y(12)
99: MED_BUILD_PIXELS_2 // Generate 'ecx' as pixels [0,1,2,3]
100: PLOT_MED_640_8BIT_DOUBLE_Y(0)
101: MED_BUILD_PIXELS_3 // Generate 'ecx' as pixels [8,9,10,11]
102: PLOT_MED_640_8BIT_DOUBLE_Y(8)
103: pop ebp
104: done_word:
105:
106: pop ebp
107:
108: next_word:
109: add esi,16 // Next PC pixels
110: add edi,4 // Next ST pixels
111: add ebp,4 // Next ST copy pixels
112:
113: dec [ScrX]
114: jne x_loop // Loop on X
115:
116: mov eax,[pPCScreenDest]
117: add eax,[PCScreenBytesPerLine] // Offset to next line
118: add eax,[PCScreenBytesPerLine]
119: mov [pPCScreenDest],eax
120:
121: inc [ScrY]
122: mov eax,[STScreenEndHorizLine]
123: cmp [ScrY],eax
124: jne ConvertMediumRes_640x8Bit_YLoop // And on Y
125:
126: pop ebx
127: pop esi
128: pop edi
129: pop ebp
130:
131: ret
132: }
133: }
134: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.