--- C:/Users/pavilion/AppData/Local/Temp/vidbios.c-revBASE.svn004.tmp.c Âñ íîÿ 8 01:07:12 2015 +++ C:/Users/pavilion/Documents/roswcb/subsystems/mvdm/ntvdm/bios/vidbios.c Ñð äåê 23 07:56:04 2015 @@ -3170,6 +3170,149 @@ VOID WINAPI VidBiosVideoService(LPWORD Stack) break; } + + case 0x0C: /* set pixel */ + { + BYTE Page=getBH(); + UINT phx=getCX(); + UINT phy=getDX(); + BYTE pxmem=getAL(); + BYTE sorc=0; + BYTE left=0; + BYTE vm=0; + if(Bda->VideoMode<0x0D) + { + vm=0; + if(Bda->VideoMode<0x07) + { + vm=1; + if(Bda->VideoMode<0x04) + { + vm=2; + } + } + } + else + { + switch(Bda->VideoMode) + { + case 0x0D: case 0x0E: case 0x10: case 0x12: + vm=2; + break; + case 0x0F: case 0x11: + vm=0; + break; + case 0x13: + vm=3; + break; + } + } + if(vm==1) Page=0; + if(vm==3) Page=0; + if(Page>=BIOS_MAX_PAGES) + break; + switch(vm) + { + case 0: + left=(phy*Bda->ScreenColumns+phx)%8; + sorc=pxmem<VideoPageSize + (phy * Bda->ScreenColumns + phx)/8) * sizeof(BYTE))), + (LPVOID)&pxmem, sizeof(BYTE)); + break; + case 1: + left=(phy*Bda->ScreenColumns+phx)%4; + sorc=pxmem<VideoPageSize + (phy * Bda->ScreenColumns + phx)/4) * sizeof(BYTE))), + (LPVOID)&pxmem, sizeof(BYTE)); + break; + case 2: + left=(phy*Bda->ScreenColumns+phx)%2; + sorc=pxmem<VideoPageSize + (phy * Bda->ScreenColumns + phx)/2) * sizeof(BYTE))), + (LPVOID)&pxmem, sizeof(BYTE)); + break; + case 3: + sorc=pxmem; + if(pxmem & 0xF0) /* change condition if more modes appear */ + { + EmulatorReadMemory(&EmulatorContext, + TO_LINEAR(GRAPHICS_VIDEO_SEG, ((Page * Bda->VideoPageSize + phy * Bda->ScreenColumns + phx) * sizeof(BYTE))), + (LPVOID)&pxmem, sizeof(BYTE)); + if(!pxmem) + { + pxmem=sorc; + } + } + EmulatorWriteMemory(&EmulatorContext, + TO_LINEAR(GRAPHICS_VIDEO_SEG, ((Page * Bda->VideoPageSize + phy * Bda->ScreenColumns + phx) * sizeof(BYTE))), + (LPVOID)&pxmem, sizeof(BYTE)); + } + break; + } + case 0x0D: /* get pixel */ + { + BYTE Page=getBH(); + UINT phx=getCX(); + UINT phy=getDX(); + BYTE pxmem=0; + BYTE vm=0; + if(Page>=BIOS_MAX_PAGES) + break; + EmulatorReadMemory(&EmulatorContext, + TO_LINEAR(GRAPHICS_VIDEO_SEG, ((Page * Bda->VideoPageSize + phy * Bda->ScreenColumns + phx) * sizeof(BYTE))), + (LPVOID)&pxmem, + sizeof(BYTE)); + if(Bda->VideoMode<0x0D) + { + vm=0; + if(Bda->VideoMode<0x07) + { + vm=1; + if(Bda->VideoMode<0x04) + { + vm=2; + } + } + } + else + { + switch(Bda->VideoMode) + { + case 0x0D: case 0x0E: case 0x10: case 0x12: + vm=2; + break; + case 0x0F: case 0x11: + vm=0; + break; + case 0x13: + vm=3; + break; + } + } + switch(vm) + { + case 0: + pxmem&=(1<<((phy*Bda->ScreenColumns+phx)%8)); + break; + case 1: + pxmem&=(3<<((phy*Bda->ScreenColumns+phx)%4)); + break; + case 2: + pxmem&=(7<<((phy*Bda->ScreenColumns+phx)%2)); + break; + } + setAL(pxmem); + break; + } /* Teletype Output */ case 0x0E: