|
|
1.1 ! root 1: // Screen Conversion, Low Res to 320x16Bit ! 2: ! 3: #include <endian.h> ! 4: ! 5: void ConvertLowRes_320x16Bit_YLoop(void); ! 6: void Line_ConvertLowRes_320x16Bit(void); ! 7: ! 8: void ConvertLowRes_320x16Bit(void) ! 9: { ! 10: unsigned long *edi, *ebp; ! 11: unsigned short *esi; ! 12: register unsigned long eax, ebx, ecx, edx; ! 13: ! 14: edx=0; ! 15: ! 16: Convert_StartFrame(); /* Start frame, track palettes */ ! 17: ScrY = STScreenStartHorizLine; /* Starting line in ST screen */ ! 18: ! 19: do /* y-loop */ ! 20: { ! 21: eax = STScreenLineOffset[ScrY] + STScreenLeftSkipBytes; /* Offset for this line + Amount to skip on left hand side */ ! 22: edi = (unsigned long *)((char *)pSTScreen + eax); /* ST format screen 4-plane 16 colours */ ! 23: ebp = (unsigned long *)((char *)pSTScreenCopy + eax); /* Previous ST format screen */ ! 24: esi = (unsigned short *)pPCScreenDest; ! 25: ! 26: #if __BYTE_ORDER == 4321 ! 27: AdjustLinePaletteRemapBIGENDIAN(); ! 28: #else ! 29: AdjustLinePaletteRemap(); ! 30: #endif ! 31: ! 32: /* ! 33: __asm { ! 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: call AdjustLinePaletteRemap // Change palette table, DO NOT corrupt edx,edi,esi or ebp! ! 45: jmp Line_ConvertLowRes_320x16Bit // 0 palette same, can do check tests ! 46: } ! 47: } ! 48: */ ! 49: ! 50: /* ! 51: NAKED void Line_ConvertLowRes_320x16Bit(void) ! 52: { ! 53: */ ! 54: ! 55: ScrX=STScreenWidthBytes>>3; /* Amount to draw across in 16-pixels(8 bytes) */ ! 56: /* ! 57: __asm { ! 58: mov eax,[STScreenWidthBytes] // Amount to draw across ! 59: shr eax,3 // in 16-pixels(8 bytes) ! 60: mov [ScrX],eax ! 61: */ ! 62: ! 63: do /* x-loop */ ! 64: { ! 65: /* Do 16 pixels at one time */ ! 66: ebx=*edi; ! 67: ecx=*(edi+1); ! 68: /* ScrUpdateFlag seems not to be set correctly?! - Thothy */ ! 69: if( 1||(ScrUpdateFlag&0xe0000000) || ebx!=*ebp || ecx!=*(ebp+1) ) /* Does differ? */ ! 70: { /* copy word */ ! 71: /* ! 72: x_loop: ! 73: ! 74: // Do 16 pixels at one time ! 75: mov ebx,[edi] ! 76: mov ecx,4[edi] ! 77: // Full update? or just test changes? ! 78: test [ScrUpdateFlag],0xe0000000 ! 79: jne copy_word // Force ! 80: // Does differ? ! 81: cmp ebx,[ebp] ! 82: jne copy_word ! 83: cmp ecx,4[ebp] ! 84: je next_word // Pixels are same as last frame, so ignore ! 85: */ ! 86: ! 87: bScreenContentsChanged=TRUE; ! 88: ! 89: /* ! 90: copy_word: ! 91: mov [bScreenContentsChanged],TRUE ! 92: */ ! 93: ! 94: #if __BYTE_ORDER == 4321 ! 95: /* Plot pixels */ ! 96: LOW_BUILD_PIXELS_0 ; /* Generate 'ecx' as pixels [4,5,6,7] */ ! 97: PLOT_LOW_320_16BIT(12) ; ! 98: LOW_BUILD_PIXELS_1 ; /* Generate 'ecx' as pixels [12,13,14,15] */ ! 99: PLOT_LOW_320_16BIT(4) ; ! 100: LOW_BUILD_PIXELS_2 ; /* Generate 'ecx' as pixels [0,1,2,3] */ ! 101: PLOT_LOW_320_16BIT(8) ; ! 102: LOW_BUILD_PIXELS_3 ; /* Generate 'ecx' as pixels [8,9,10,11] */ ! 103: PLOT_LOW_320_16BIT(0) ; ! 104: #else ! 105: /* Plot pixels */ ! 106: LOW_BUILD_PIXELS_0 ; /* Generate 'ecx' as pixels [4,5,6,7] */ ! 107: PLOT_LOW_320_16BIT(4) ; ! 108: LOW_BUILD_PIXELS_1 ; /* Generate 'ecx' as pixels [12,13,14,15] */ ! 109: PLOT_LOW_320_16BIT(12) ; ! 110: LOW_BUILD_PIXELS_2 ; /* Generate 'ecx' as pixels [0,1,2,3] */ ! 111: PLOT_LOW_320_16BIT(0) ; ! 112: LOW_BUILD_PIXELS_3 ; /* Generate 'ecx' as pixels [8,9,10,11] */ ! 113: PLOT_LOW_320_16BIT(8) ; ! 114: #endif ! 115: } ! 116: ! 117: esi += 16; /* Next PC pixels */ ! 118: edi += 2; /* Next ST pixels */ ! 119: ebp += 2; /* Next ST copy pixels */ ! 120: } ! 121: while( --ScrX ); /* Loop on X */ ! 122: /* ! 123: next_word: ! 124: add esi,16*2 // Next PC pixels ! 125: add edi,8 // Next ST pixels ! 126: add ebp,8 // Next ST copy pixels ! 127: ! 128: dec [ScrX] ! 129: jne x_loop // Loop on X ! 130: */ ! 131: ! 132: pPCScreenDest = (void *)(((unsigned char *)pPCScreenDest)+PCScreenBytesPerLine); /* Offset to next line */ ! 133: ScrY += 1; ! 134: } ! 135: while( ScrY < STScreenEndHorizLine ); /* Loop on Y */ ! 136: /* ! 137: mov eax,[pPCScreenDest] ! 138: add eax,[PCScreenBytesPerLine] // Offset to next line ! 139: mov [pPCScreenDest],eax ! 140: ! 141: inc [ScrY] ! 142: mov eax,[STScreenEndHorizLine] ! 143: cmp [ScrY],eax ! 144: jne ConvertLowRes_320x16Bit_YLoop // And on Y ! 145: ! 146: pop ebx ! 147: pop esi ! 148: pop edi ! 149: pop ebp ! 150: ! 151: ret ! 152: } ! 153: */ ! 154: } ! 155:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.