[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]
{
NV> Could somebody tell me how to use mode 640x480x16? I
NV> don't mean using it with int 10, 'cause it's too slow,
NV> but writing directly to VGA memory. So how do I draw a
NV> pixel and how do I read a pixel?
well, you set the mode with:
ASM MOV AX, 12h; INT 10h; END;
and then draw a pixel with: }
PROCEDURE plot_640x480x16(x, y : WORD; c : BYTE); ASSEMBLER;
ASM
{$IFDEF DPMI}
MOV ES, SEGA000
{$ELSE}
MOV AX, $A000
MOV ES, AX
{$ENDIF}
MOV DI, x
MOV CX, DI
SHR DI, 3
MOV AX, 80
MUL y
ADD DI, AX
AND CL, $07
MOV AH, $80
SHR AH, CL
MOV AL, $08
MOV DX, $03CE
OUT DX, AX
MOV AL, c
MOV AH, [ES:DI]
MOV [ES:DI], AL
END;
{ and read a pixel with: }
FUNCTION point_640x480x16(x, y : WORD) : BYTE; ASSEMBLER;
ASM
MOV AX, 80
MUL y
MOV SI, x
MOV CX, SI
SHR SI, 3
ADD SI, AX
AND CL, $07
XOR CL, $07
MOV CH, 1
SHL CH, CL
{$IFDEF DPMI}
MOV ES, SEGA000
{$ELSE}
MOV AX, $A000
MOV ES, AX
{$ENDIF}
MOV DX, $03CE
MOV AX, 772
XOR BL, BL
@gp1:
OUT DX, AX
MOV BH, ES:[SI]
AND BH, CH
NEG BH
ROL BX, $0001
DEC AH
JGE @gp1
MOV AL, BL
END;
[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]