|
|
1.1 ! root 1: // Screen Conversion, Spec512 to 320x16Bit ! 2: ! 3: void ConvertSpec512_320x16Bit_YLoop(void); ! 4: void Line_ConvertSpec512_320x16Bit(void); ! 5: ! 6: void ConvertSpec512_320x16Bit(void) ! 7: { ! 8: fprintf(stderr,"FIXME: Screen Conversion, Spec512 to 320x16Bit\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_320x16Bit_YLoop ! 24: } ! 25: */ ! 26: } ! 27: /* ! 28: NAKED void ConvertSpec512_320x16Bit_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_320x16Bit ! 45: } ! 46: } ! 47: ! 48: NAKED void Line_ConvertSpec512_320x16Bit(void) ! 49: { ! 50: __asm { ! 51: mov eax,[STScreenWidthBytes] // Amount to draw across ! 52: shr eax,3 // in 16-pixels(8 bytes) ! 53: mov [ScrX],eax ! 54: x_loop: ! 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: // And plot, the Spec512 is offset by 1 pixel and works on 'chunks' of 4 pixels ! 70: // So, we plot 1_4_4_3 to give 16 pixels, changing palette between(last one is used for first of next 16-pixels) ! 71: mov ecx,[PixelWorkspace] ! 72: PLOT_SPEC512_LEFT_LOW_320_16BIT(0) ! 73: call Spec512_UpdatePaletteSpan ! 74: mov ecx,[PixelWorkspace+1] ! 75: PLOT_SPEC512_MID_320_16BIT(2) ! 76: call Spec512_UpdatePaletteSpan ! 77: mov ecx,[PixelWorkspace+5] ! 78: PLOT_SPEC512_MID_320_16BIT(10) ! 79: call Spec512_UpdatePaletteSpan ! 80: mov ecx,[PixelWorkspace+9] ! 81: PLOT_SPEC512_MID_320_16BIT(18) ! 82: call Spec512_UpdatePaletteSpan ! 83: mov ecx,[PixelWorkspace+13] ! 84: PLOT_SPEC512_END_LOW_320_16BIT(26) ! 85: ! 86: add esi,16*2 // Next PC pixels ! 87: add edi,8 // Next ST pixels ! 88: add ebp,8 // Next ST copy pixels ! 89: ! 90: dec [ScrX] ! 91: jne x_loop // Loop on X ! 92: ! 93: call Spec512_EndScanLine ! 94: ! 95: mov eax,[pPCScreenDest] ! 96: add eax,[PCScreenBytesPerLine] // Offset to next line ! 97: mov [pPCScreenDest],eax ! 98: ! 99: inc [ScrY] ! 100: mov eax,[STScreenEndHorizLine] ! 101: cmp [ScrY],eax ! 102: jne ConvertSpec512_320x16Bit_YLoop // And on Y ! 103: ! 104: mov [bScreenContentsChanged],TRUE ! 105: ! 106: pop ebx ! 107: pop esi ! 108: pop edi ! 109: pop ebp ! 110: ! 111: ret ! 112: } ! 113: } ! 114: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.