|
|
1.1 root 1: // Screen Conversion, Spec512 to 640x16Bit
2:
3: void ConvertSpec512_640x16Bit_YLoop(void);
4: void Line_ConvertSpec512_640x16Bit(void);
5:
6: void ConvertSpec512_640x16Bit(void)
7: {
8: fprintf(stderr,"FIXME: Screen Conversion, Spec512 to 640x16Bit\n");
9: /* FIXME */
10: /*
11: __asm {
12: push ebp
13: push edi
14: push esi
15: push ebx
16:
17: call Spec512_StartFrame // Start frame, track palettes
18:
19: xor edx,edx // Clear index for loop
20:
21: mov eax,[STScreenStartHorizLine]
22: mov [ScrY],eax // Starting line in ST screen
23: jmp ConvertSpec512_640x16Bit_YLoop
24: }
25: */
26: }
27: /*
28: NAKED void ConvertSpec512_640x16Bit_YLoop(void)
29: {
30: __asm {
31: call Spec512_StartScanLine // Build up palettes for every 4 pixels, store in 'ScanLinePalettes'
32: xor edx,edx // Clear index for loop
33:
34: // Get screen addresses, 'edi'-ST screen, 'ebp'-Previous ST screen, 'esi'-PC screen
35: mov eax,[ScrY]
36: mov eax,STScreenLineOffset[eax*4] // Offset for this line
37: add eax,[STScreenLeftSkipBytes] // Amount to skip on left hand side
38: mov edi,[pSTScreen] // ST format screen 4-plane 16 colours
39: add edi,eax
40: mov ebp,[pSTScreenCopy] // Previous ST format screen
41: add ebp,eax
42: mov esi,[pPCScreenDest] // PC format screen, byte per pixel 256 colours
43:
44: jmp Line_ConvertSpec512_640x16Bit
45: }
46: }
47: NAKED void Line_ConvertSpec512_640x16Bit(void)
48: {
49: __asm {
50: mov eax,[STScreenWidthBytes] // Amount to draw across
51: shr eax,3 // in 16-pixels(8 bytes)
52: mov [ScrX],eax
53: x_loop:
54:
55: // Do 16 pixels at one time
56: mov ebx,[edi]
57: mov ecx,4[edi]
58:
59: // Convert planes to byte indices - as works in wrong order store to workspace so can read back in order!
60: LOW_BUILD_PIXELS_0 // Generate 'ecx' as pixels [4,5,6,7]
61: mov [PixelWorkspace+4],ecx
62: LOW_BUILD_PIXELS_1 // Generate 'ecx' as pixels [12,13,14,15]
63: mov [PixelWorkspace+12],ecx
64: LOW_BUILD_PIXELS_2 // Generate 'ecx' as pixels [0,1,2,3]
65: mov [PixelWorkspace],ecx
66: LOW_BUILD_PIXELS_3 // Generate 'ecx' as pixels [8,9,10,11]
67: mov [PixelWorkspace+8],ecx
68:
69: // Plot in 'wrong-order', as ebx is 68000 endian
70: push ebp
71: cmp [bScrDoubleY],TRUE // Double on Y?
72: je double_y
73:
74: // And plot, the Spec512 is offset by 1 pixel and works on 'chunks' of 4 pixels
75: // So, we plot 1_4_4_3 to give 16 pixels, changing palette between(last one is used for first of next 16-pixels)
76: mov ecx,[PixelWorkspace]
77: PLOT_SPEC512_LEFT_LOW_640_16BIT(0)
78: call Spec512_UpdatePaletteSpan
79: mov ecx,[PixelWorkspace+1]
80: PLOT_SPEC512_MID_640_16BIT(4)
81: call Spec512_UpdatePaletteSpan
82: mov ecx,[PixelWorkspace+5]
83: PLOT_SPEC512_MID_640_16BIT(20)
84: call Spec512_UpdatePaletteSpan
85: mov ecx,[PixelWorkspace+9]
86: PLOT_SPEC512_MID_640_16BIT(36)
87: call Spec512_UpdatePaletteSpan
88: mov ecx,[PixelWorkspace+13]
89: PLOT_SPEC512_END_LOW_640_16BIT(52)
90:
91: jmp done_word
92:
93: double_y:
94:
95: // And plot, 4 pixels at a time each with a new palette
96: push ebp
97: mov ebp,[PCScreenBytesPerLine]
98: mov ecx,[PixelWorkspace]
99: PLOT_SPEC512_LEFT_LOW_640_16BIT_DOUBLE_Y(0)
100: call Spec512_UpdatePaletteSpan
101: mov ecx,[PixelWorkspace+1]
102: PLOT_SPEC512_MID_640_16BIT_DOUBLE_Y(4)
103: call Spec512_UpdatePaletteSpan
104: mov ecx,[PixelWorkspace+5]
105: PLOT_SPEC512_MID_640_16BIT_DOUBLE_Y(20)
106: call Spec512_UpdatePaletteSpan
107: mov ecx,[PixelWorkspace+9]
108: PLOT_SPEC512_MID_640_16BIT_DOUBLE_Y(36)
109: call Spec512_UpdatePaletteSpan
110: mov ecx,[PixelWorkspace+13]
111: PLOT_SPEC512_END_LOW_640_16BIT_DOUBLE_Y(52)
112: pop ebp
113: done_word:
114:
115: pop ebp
116:
117: add esi,16*4 // Next PC pixels
118: add edi,8 // Next ST pixels
119: add ebp,8 // Next ST copy pixels
120:
121: dec [ScrX]
122: jne x_loop // Loop on X
123:
124: call Spec512_EndScanLine
125:
126: mov eax,[pPCScreenDest]
127: add eax,[PCScreenBytesPerLine] // Offset to next line
128: add eax,[PCScreenBytesPerLine]
129: mov [pPCScreenDest],eax
130:
131: inc [ScrY]
132: mov eax,[STScreenEndHorizLine]
133: cmp [ScrY],eax
134: jne ConvertSpec512_640x16Bit_YLoop // And on Y
135:
136: mov [bScreenContentsChanged],TRUE
137:
138: pop ebx
139: pop esi
140: pop edi
141: pop ebp
142:
143: ret
144: }
145: }
146: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.