; Mode X (320x240, 256 colors) write pixel routine. Works on all VGAs. ; No clipping is performed. ; C near-callable as: ; ; void WritePixelX(int X, int Y, unsigned int PageBase, int Color); SC_INDEX equ 03c4h ;Sequence Controller Index MAP_MASK equ 02h ;index in SC of Map Mask register SCREEN_SEG equ 0a000h ;segment of display memory in mode X SCREEN_WIDTH equ 80 ;width of screen in bytes from one scan line ; to the next parms struc dw 2 dup (?) ;pushed BP and return address X dw ? ;X coordinate of pixel to draw Y dw ? ;Y coordinate of pixel to draw PageBase dw ? ;base offset in display memory of page in ; which to draw pixel Color dw ? ;color in which to draw pixel parms ends .model small .code public _WritePixelX _WritePixelX proc near push bp ;preserve caller's stack frame mov bp,sp ;point to local stack frame mov ax,SCREEN_WIDTH mul [bp+Y] ;offset of pixel's scan line in page mov bx,[bp+X] shr bx,1 shr bx,1 ;X/4 = offset of pixel in scan line add bx,ax ;offset of pixel in page add bx,[bp+PageBase] ;offset of pixel in display memory mov ax,SCREEN_SEG mov es,ax ;point ES:BX to the pixel's address mov cl,byte ptr [bp+X] and cl,011b ;CL = pixel's plane mov ax,0100h + MAP_MASK ;AL = index in SC of Map Mask reg shl ah,cl ;set only the bit for the pixel's plane to 1 mov dx,SC_INDEX ;set the Map Mask to enable only the out dx,ax ; pixel's plane mov al,byte ptr [bp+Color] mov es:[bx],al ;draw the pixel in the desired color pop bp ;restore caller's stack frame ret _WritePixelX endp end