nelson@IMAGE.SOE.CLARKSON.EDU (Russ Nelson) (01/18/90)
The following code will write a single pixel to a Trident VGA in mode 60,
that's 1024 x 768. It's a disassembly of the same function from the VGA bios.
It should be usable to write general-purpose access functions.
-russ
comment \
INT 10 - VIDEO - WRITE DOT ON SCREEN
AH = 0Ch
AL = color of dot (0/1 in mode 6, 0-3 in modes 4 and 5)
if bit 7 set, new color will be XORed with current pixel
BH = display page (ignored if mode only supports one page)
CX = column
DX = row
Note: only valid in graphics modes
SeeAlso: AH=0Dh
---------------------------------------------
\
;write a dot in video mode 60h (Trident)
write_dot_mode_60:
CALL l082A ;clear sequencer register b.
MOV BL,AL ;get the color.
CALL l26BC ;map the color.
MOV SI,AX ;save it in si for a while.
CALL l2681
MOV AL,08 ;output the mask register.
OUT DX,AX
XCHG BX,SI ;get si into bx, and our memory
; address into si.
MOV AX,0205h ;select write mode 2.
OUT DX,AX
OR BL,BL ;is the color signed? (should we
JNS 25BA ; xor the existing bit?) go if not.
MOV AX,1803h ;set the function to XOR.
OUT DX,AX
25ba:
MOV AL,[SI] ;load the latches
MOV AL,BL
MOV [SI],AL ;store the new pixel's value.
MOV AX,0FF08h ;reset graphics controller bit mask
OUT DX,AX
MOV AX,0005h ;reset to mode zero.
OUT DX,AX
CALL l2344
JMP 2525
l2344:
MOV AX,0003 ;reset function and rotate.
MOV DX,03CEh
OUT DX,AX
MOV AX,0F02h ;store F into CRT controller reg. 2.
MOV DL,0C4h
OUT DX,AX
RET
;this video mode puts odd bytes on odd pages, even bytes on even pages.
graphics_addr dw 0a000h
l2681:
;enter with cx = x, dx = y.
;exit with dx pointing to the graphics controller,
; ds -> screen memory,
; ah = bit of byte in memory.
MOV BX,CX ;Isolate the X byte.
SHR BX,1
SHR BX,1
SHR BX,1
SHR BX,1
MOV AX,DX
MOV DX,[044Ah] ;get the screen width in bytes.
SHR DX,1
MUL DX ;multiply the Y by the width.
ADD BX,AX ;accumulate the address.
AND CL,0Fh ;get the X position
MOV AX,8000h ;shift the bit over.
SHR AX,CL
OR AH,AH ;Did we shift it off?
MOV CH,AH ;assume no -- put bit in ch,
MOV AH,5 ; and page value.
JNZ 26AB
MOV AH,10 ;yes, get page value,
MOV CH,AL ; and put bit in ch.
26ab:
MOV DX,3C4h ;set CRT controller register 2.
MOV AL,2
OUT DX,AX
MOV AH,CH ;get the bit into ah.
MOV DS,CS:graphics_addr ;get the screen address into ds
MOV DX,3CEh ;get the graphics controller into dx.
RET
l26C0 db 0, 3, 12, 15
;map colors 0 through 3 into 0, 3, 12, and 15.
l26bc:
PUSH BX
AND BL,3
XOR BH,BH
MOV AL,CS:l26c0[BX]
POP BX
RET
l082a:
PUSH AX ;clear sequencer register b.
PUSH DX
MOV DX,3C4h
MOV AX,000Bh
OUT DX,AX
POP DX
POP AX
RET
--
--russ (nelson@clutx [.bitnet | .clarkson.edu]) Russ.Nelson@$315.268.6667
Violence never solves problems, it just changes them into more subtle problems