Code:
;DECLARE SUB pix12 (BYVAL vertical%, BYVAL horizontal%, BYVAL c%)
public pix12
pix12 proc, vertical:sword, horizontal:sword, col:word
; IF (vertical% < 0) OR (horizontal% < 0) THEN EXIT SUB
.if vertical < 0 || horizontal < 0
ret
.endif
; IF (vertical% > 479) OR (horizontal% > 639) THEN EXIT SUB
.if vertical > 479 || horizontal > 639
ret
.endif
; DEF SEG = &HA000
mov ax, 0A000h
mov es, ax
; OUT &H3CE, 4: OUT &H3C4, 2
mov dx, 03CEh
mov al, 4
out dx, al
mov dl, 0C4h
mov al, 2
out dx, al
; P& = vertical%: P& = P& * 80 + horizontal% \ 8
mov ax, vertical
mov di, ax
shl ax, 6 ; ax = vertical * 64
shl di, 4 ; di = vertical * 16
add di, ax ; di = vertical * 80
mov ax, horizontal
shr ax, 3
add di, ax
; bit% = bitfield(horizontal% AND 7): bitmask% = 255 - bit%
mov cl, horizontal
and cl, 00000111b
mov bh, 10000000b
shr bh, cl
mov ch, bh
not ch
; OUT &H3CF, 0: OUT &H3C5, 1
mov dx, 03CFh
xor al, al
out dx, al
mov dl, 0C5h
inc al
out dx, al
; B% = PEEK(P&) AND bitmask%
mov al, es:[di]
and al, ch
; IF (c% AND 1) <> 0 THEN B% = B% OR bit%
mov cl, byte ptr col
.if cl & 0001b
or al, bh
.endif
; POKE P&, B%
mov es:[di], al
; OUT &H3CF, 1: OUT &H3C5, 2
mov dx, 03CFh
mov al, 1
out dx, al
mov dl, 0C5h
inc al
out dx, al
; B% = PEEK(P&) AND bitmask%
mov al, es:[di]
and al, ch
; IF (c% AND 2) <> 0 THEN B% = B% OR bit%
.if cl & 0010b
or al, bh
.endif
; POKE P&, B%
mov es:[di], al
; OUT &H3CF, 2: OUT &H3C5, 4
mov dx, 03CFh
mov al, 2
out dx, al
mov dl, 0C5h
mov al, 4
out dx, al
; B% = PEEK(P&) AND bitmask%
mov al, es:[di]
and al, ch
; IF (c% AND 4) <> 0 THEN B% = B% OR bit%
.if cl & 0100b
or al, bh
.endif
; POKE P&, B%
mov es:[di], al
; OUT &H3CF, 3: OUT &H3C5, 8
mov dx, 03CFh
mov al, 3
out dx, al
mov dl, 0C5h
mov al, 8
out dx, al
; B% = PEEK(P&) AND bitmask%
mov al, es:[di]
and al, ch
; IF (c% AND 8) <> 0 THEN B% = B% OR bit%
.if cl & 1000b
or al, bh
.endif
; POKE P&, B%
mov es:[di], al
;END SUB
ret
pix12 endp