|
|
1.1 root 1: // Screen Conversion, Low Res to 640x16Bit
2:
3: void ConvertLowRes_640x16Bit_YLoop(void);
4: void Line_ConvertLowRes_640x16Bit(void);
5:
6: void ConvertLowRes_640x16Bit(void)
7: {
8: fprintf(stderr,"FIXME: Screen Conversion, Low Res to 640x16Bit\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 ConvertLowRes_640x16Bit_YLoop
23: }
24: */
25: }
26: /*
27: NAKED void ConvertLowRes_640x16Bit_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: jne Line_ConvertMediumRes_640x16Bit // resolution change(MUST be first)
43: jmp Line_ConvertLowRes_640x16Bit // 0 palette same, can do check tests
44: }
45: }
46: NAKED void Line_ConvertLowRes_640x16Bit(void)
47: {
48: __asm {
49: mov eax,[STScreenWidthBytes] // Amount to draw across
50: shr eax,3 // in 16-pixels(8 bytes)
51: mov [ScrX],eax
52: x_loop:
53: #ifdef TEST_SCREEN_UPDATE
54: mov DWORD PTR [esi+0],0
55: mov DWORD PTR [esi+8],0
56: mov DWORD PTR [esi+16],0
57: mov DWORD PTR [esi+24],0
58: mov DWORD PTR [esi+32],0
59: mov DWORD PTR [esi+40],0
60: mov DWORD PTR [esi+48],0
61: mov DWORD PTR [esi+56],0
62: #endif //TEST_SCREEN_UPDATE
63:
64: // Do 16 pixels at one time
65: mov ebx,[edi]
66: mov ecx,4[edi]
67: // Full update? or just test changes?
68: test [ScrUpdateFlag],0xe0000000
69: jne copy_word // Force
70: // Does differ?
71: cmp ebx,[ebp]
72: jne copy_word
73: cmp ecx,4[ebp]
74: je next_word // Pixels are same as last frame, so ignore
75:
76: copy_word:
77: mov [bScreenContentsChanged],TRUE
78:
79: // Double up on Y?
80: cmp [bScrDoubleY],TRUE
81: je double_y
82:
83: // Plot pixels
84: LOW_BUILD_PIXELS_0 // Generate 'ecx' as pixels [4,5,6,7]
85: PLOT_LOW_640_16BIT(16)
86: LOW_BUILD_PIXELS_1 // Generate 'ecx' as pixels [12,13,14,15]
87: PLOT_LOW_640_16BIT(48)
88: LOW_BUILD_PIXELS_2 // Generate 'ecx' as pixels [0,1,2,3]
89: PLOT_LOW_640_16BIT(0)
90: LOW_BUILD_PIXELS_3 // Generate 'ecx' as pixels [8,9,10,11]
91: PLOT_LOW_640_16BIT(32)
92:
93: jmp done_word
94:
95: double_y:
96: push ebp
97: mov ebp,[PCScreenBytesPerLine]
98: // Plot pixels
99: LOW_BUILD_PIXELS_0 // Generate 'ecx' as pixels [4,5,6,7]
100: PLOT_LOW_640_16BIT_DOUBLE_Y(16)
101: LOW_BUILD_PIXELS_1 // Generate 'ecx' as pixels [12,13,14,15]
102: PLOT_LOW_640_16BIT_DOUBLE_Y(48)
103: LOW_BUILD_PIXELS_2 // Generate 'ecx' as pixels [0,1,2,3]
104: PLOT_LOW_640_16BIT_DOUBLE_Y(0)
105: LOW_BUILD_PIXELS_3 // Generate 'ecx' as pixels [8,9,10,11]
106: PLOT_LOW_640_16BIT_DOUBLE_Y(32)
107: pop ebp
108: done_word:
109:
110: next_word:
111: add esi,16*4 // Next PC pixels
112: add edi,8 // Next ST pixels
113: add ebp,8 // Next ST copy pixels
114:
115: dec [ScrX]
116: jne x_loop // Loop on X
117:
118: mov eax,[pPCScreenDest]
119: add eax,[PCScreenBytesPerLine] // Offset to next line
120: add eax,[PCScreenBytesPerLine]
121: mov [pPCScreenDest],eax
122:
123: inc [ScrY]
124: mov eax,[STScreenEndHorizLine]
125: cmp [ScrY],eax
126: jne ConvertLowRes_640x16Bit_YLoop // And on Y
127:
128: pop ebx
129: pop esi
130: pop edi
131: pop ebp
132:
133: ret
134: }
135: }
136: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.