'===========================================================================
' Subject: WRITING PIXELS IN MODE 12H         Date: 06-22-96 (00:00)       
'  Author: Kurt Kuzba                         Code: QB, QBasic, PDS        
'  Origin: FidoNet QUIK_BAS Echo            Packet: EGAVGA.ABC
'===========================================================================
'   I also worked out a pixel location algorithm for 4-plane
'graphics memory and designed a mode 12h putpixel with it.
'Notice that there is a four-step process in the pix12 routine
'which could be served by a FOR/NEXT loop. Unrolling such loops
'is a standard method of speed optimization.

'_|_|_|   PUTPIX12.BAS
'_|_|_|   An example of writing pixels in video mode 12h.
'_|_|_|   No warrantees or guarantees are given or implied.
'_|_|_|   Released to   PUBLIC DOMAIN   by Kurt Kuzba.  (6/22/96)
DEFINT A-Z
DECLARE SUB pix12 (vertical%, horizontal%, c%)
DIM SHARED bitfield(7) AS INTEGER
   bitfield(0) = 128: bitfield(1) = 64: bitfield(2) = 32
   bitfield(3) = 16: bitfield(4) = 8: bitfield(5) = 4
   bitfield(6) = 2: bitfield(7) = 1
SCREEN 12
FOR y = 0 TO 639: pix12 y / 1.3, y, 5: NEXT
FOR y = 0 TO 639: pix12 479 - (y / 1.3), y, 14: NEXT
FOR y = 0 TO 639: pix12 y / 1.3, y, 14: NEXT
FOR y = 0 TO 639: pix12 479 - (y / 1.3), y, 5: NEXT
FOR c = 15 TO 0 STEP -1
   FOR y = 308 - 5 * c TO 316 + 5 * c
      FOR x = 234 - 5 * c TO 242 + 5 * c
         pix12 x, y, c: IF INKEY$ <> "" THEN SCREEN 0: END
      NEXT
   NEXT
NEXT: WHILE INKEY$ = "": WEND: SCREEN 0
SUB pix12 (vertical%, horizontal%, c%)
   IF (vertical% < 0) OR (horizontal% < 0) THEN EXIT SUB
   IF (vertical% > 479) OR (horizontal% > 639) THEN EXIT SUB
   DEF SEG = &HA000: OUT &H3CE, 4: OUT &H3C4, 2
   P& = vertical%: P& = P& * 80 + horizontal% \ 8
   bit% = bitfield(horizontal% AND 7): bitmask% = 255 - bit%
   OUT &H3CF, 0: OUT &H3C5, 1: B% = PEEK(P&) AND bitmask%
   IF (c% AND 1) <> 0 THEN B% = B% OR bit%
   POKE P&, B%
   OUT &H3CF, 1: OUT &H3C5, 2: B% = PEEK(P&) AND bitmask%
   IF (c% AND 2) <> 0 THEN B% = B% OR bit%
   POKE P&, B%
   OUT &H3CF, 2: OUT &H3C5, 4: B% = PEEK(P&) AND bitmask%
   IF (c% AND 4) <> 0 THEN B% = B% OR bit%
   POKE P&, B%
   OUT &H3CF, 3: OUT &H3C5, 8: B% = PEEK(P&) AND bitmask%
   IF (c% AND 8) <> 0 THEN B% = B% OR bit%
   POKE P&, B%
END SUB
'_|_|_|   end   PUTPIX12.BAS
