|
|
1.1.1.2 root 1: /* Screen Conversion, Low Res to 640x16Bit */
1.1 root 2:
1.1.1.4 root 3: static void Line_ConvertLowRes_640x16Bit(Uint32 *edi, Uint32 *ebp, Uint32 *esi, Uint32 eax)
1.1 root 4: {
1.1.1.2 root 5: Uint32 edx;
1.1.1.4 root 6: Uint32 ebx, ecx;
7: int x;
1.1 root 8:
1.1.1.4 root 9: x = STScreenWidthBytes>>3; /* Amount to draw across in 16-pixels(8 bytes) */
1.1.1.2 root 10:
11: do /* x-loop */
12: {
13: /* Do 16 pixels at one time */
14: ebx=*edi;
15: ecx=*(edi+1);
16:
17: if( (ScrUpdateFlag&0xe0000000) || ebx!=*ebp || ecx!=*(ebp+1) ) /* Does differ? */
18: { /* copy word */
19:
20: bScreenContentsChanged=TRUE;
21:
22: #if SDL_BYTEORDER == SDL_BIG_ENDIAN
23: /* Plot in 'right-order' on big endian systems */
24: if( !bScrDoubleY ) /* Double on Y? */
25: {
26: /* Plot pixels */
27: LOW_BUILD_PIXELS_0 ; /* Generate 'ecx' as pixels [4,5,6,7] */
28: PLOT_LOW_640_16BIT(12) ;
29: LOW_BUILD_PIXELS_1 ; /* Generate 'ecx' as pixels [12,13,14,15] */
30: PLOT_LOW_640_16BIT(4) ;
31: LOW_BUILD_PIXELS_2 ; /* Generate 'ecx' as pixels [0,1,2,3] */
32: PLOT_LOW_640_16BIT(8) ;
33: LOW_BUILD_PIXELS_3 ; /* Generate 'ecx' as pixels [8,9,10,11] */
34: PLOT_LOW_640_16BIT(0) ;
35: }
36: else
37: {
38: /* Plot pixels */
39: LOW_BUILD_PIXELS_0 ; /* Generate 'ecx' as pixels [4,5,6,7] */
40: PLOT_LOW_640_16BIT_DOUBLE_Y(12) ;
41: LOW_BUILD_PIXELS_1 ; /* Generate 'ecx' as pixels [12,13,14,15] */
42: PLOT_LOW_640_16BIT_DOUBLE_Y(4) ;
43: LOW_BUILD_PIXELS_2 ; /* Generate 'ecx' as pixels [0,1,2,3] */
44: PLOT_LOW_640_16BIT_DOUBLE_Y(8) ;
45: LOW_BUILD_PIXELS_3 ; /* Generate 'ecx' as pixels [8,9,10,11] */
46: PLOT_LOW_640_16BIT_DOUBLE_Y(0)
47: }
48: #else
49: /* Plot in 'wrong-order', as ebx is 68000 endian */
50: if( !bScrDoubleY ) /* Double on Y? */
51: {
52: /* Plot pixels */
53: LOW_BUILD_PIXELS_0 ; /* Generate 'ecx' as pixels [4,5,6,7] */
54: PLOT_LOW_640_16BIT(4) ;
55: LOW_BUILD_PIXELS_1 ; /* Generate 'ecx' as pixels [12,13,14,15] */
56: PLOT_LOW_640_16BIT(12) ;
57: LOW_BUILD_PIXELS_2 ; /* Generate 'ecx' as pixels [0,1,2,3] */
58: PLOT_LOW_640_16BIT(0) ;
59: LOW_BUILD_PIXELS_3 ; /* Generate 'ecx' as pixels [8,9,10,11] */
60: PLOT_LOW_640_16BIT(8) ;
61: }
62: else
63: {
64: /* Plot pixels */
65: LOW_BUILD_PIXELS_0 ; /* Generate 'ecx' as pixels [4,5,6,7] */
66: PLOT_LOW_640_16BIT_DOUBLE_Y(4) ;
67: LOW_BUILD_PIXELS_1 ; /* Generate 'ecx' as pixels [12,13,14,15] */
68: PLOT_LOW_640_16BIT_DOUBLE_Y(12) ;
69: LOW_BUILD_PIXELS_2 ; /* Generate 'ecx' as pixels [0,1,2,3] */
70: PLOT_LOW_640_16BIT_DOUBLE_Y(0) ;
71: LOW_BUILD_PIXELS_3 ; /* Generate 'ecx' as pixels [8,9,10,11] */
72: PLOT_LOW_640_16BIT_DOUBLE_Y(8)
73: }
74: #endif
75:
76: }
77:
78: esi += 16; /* Next PC pixels */
79: edi += 2; /* Next ST pixels */
80: ebp += 2; /* Next ST copy pixels */
1.1 root 81: }
1.1.1.4 root 82: while( --x ); /* Loop on X */
83:
84: }
85:
86: static void ConvertLowRes_640x16Bit(void)
87: {
88: Uint32 *edi, *ebp;
89: Uint32 *esi;
90: Uint32 eax;
91: int y;
92:
93: Convert_StartFrame(); /* Start frame, track palettes */
94:
95: for (y = STScreenStartHorizLine; y < STScreenEndHorizLine; y++) {
96:
97: /* Get screen addresses */
98: eax = STScreenLineOffset[y] + STScreenLeftSkipBytes; /* Offset for this line + Amount to skip on left hand side */
99: edi = (Uint32 *)((Uint8 *)pSTScreen + eax); /* ST format screen 4-plane 16 colours */
100: ebp = (Uint32 *)((Uint8 *)pSTScreenCopy + eax); /* Previous ST format screen */
101: esi = (Uint32 *)pPCScreenDest; /* PC format screen */
102:
103: if( (AdjustLinePaletteRemap(y) & 0x00030000)==0 ) /* Change palette table */
104: Line_ConvertLowRes_640x16Bit(edi, ebp, esi, eax);
105: else
106: Line_ConvertMediumRes_640x16Bit(edi, ebp, (Uint16 *)esi, eax);
1.1.1.2 root 107:
1.1.1.5 ! root 108: pPCScreenDest = (((Uint8 *)pPCScreenDest)+PCScreenBytesPerLine*2); /* Offset to next line */
1.1.1.4 root 109: }
1.1 root 110: }
1.1.1.4 root 111:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.