home *** CD-ROM | disk | FTP | other *** search
/ Graphics Programming Black Book (Special Edition) / BlackBook.bin / disk1 / source / chapter28 / l28-2.asm < prev    next >
Assembly Source File  |  1997-06-18  |  5KB  |  166 lines

  1. ; *** Listing 6.2 ***
  2. ;
  3. ; Program to illustrate use of read mode 1 (color compare mode)
  4. ; to detect collisions in display memory. Draws a yellow line on a
  5. ; blue background, then draws a perpendicular green line until the
  6. ; yellow line is reached.
  7. ;
  8. ; Assembled with TASM 4.0, linked with TLINK 6.10
  9. ; Checked by Jim Mischel 11/21/94
  10. ;
  11. stack    segment    word stack 'STACK'
  12.     db    512 dup (?)
  13. stack    ends
  14. ;
  15. VGA_SEGMENT    EQU    0a000h
  16. SCREEN_WIDTH    EQU    80    ;in bytes
  17. GC_INDEX        EQU    3ceh    ;Graphics Controller Index register
  18. SET_RESET    EQU    0    ;Set/Reset register index in GC
  19. ENABLE_SET_RESET EQU    1    ;Enable Set/Reset register index in GC
  20. COLOR_COMPARE    EQU    2    ;Color Compare register index in GC
  21. GRAPHICS_MODE    EQU    5    ;Graphics Mode register index in GC
  22. BIT_MASK        EQU    8    ;Bit Mask register index in GC
  23. ;
  24. code    segment    word 'CODE'
  25.     assume    cs:code
  26. Start    proc    near
  27.     cld
  28. ;
  29. ; Select graphics mode 10h.
  30. ;
  31.     mov    ax,10h
  32.     int    10h
  33. ;
  34. ; Fill the screen with blue.
  35. ;
  36.     mov    al,1        ;blue is color 1
  37.     call    SelectSetResetColor ;set to draw in blue
  38.     mov    ax,VGA_SEGMENT
  39.     mov    es,ax
  40.     sub    di,di
  41.     mov    cx,7000h
  42.     rep    stosb        ;the value written actually doesn't
  43.                 ; matter, since set/reset is providing
  44.                 ; the data written to display memory
  45. ;
  46. ; Draw a vertical yellow line.
  47. ;
  48.     mov    al,14        ;yellow is color 14
  49.     call    SelectSetResetColor ;set to draw in yellow
  50.     mov    dx,GC_INDEX
  51.     mov    al,BIT_MASK
  52.     out    dx,al        ;point GC Index to Bit Mask
  53.     inc    dx        ;point to GC Data
  54.     mov    al,10h
  55.     out    dx,al        ;set Bit Mask to 10h
  56.     mov    di,40        ;start in the middle of the top line
  57.     mov    cx,350        ;do full height of screen
  58. VLineLoop:
  59.     mov    al,es:[di]    ;load the latches
  60.     stosb            ;write next pixel of yellow line (set/reset
  61.                 ; provides the data written to display
  62.                 ; memory, and AL is actually ignored)
  63.     add    di,SCREEN_WIDTH-1 ;point to the next scan line
  64.     loop    VLineLoop
  65. ;
  66. ; Select write mode 0 and read mode 1.
  67. ;
  68.     mov    dx,GC_INDEX
  69.     mov    al,GRAPHICS_MODE
  70.     out    dx,al        ;point GC Index to Graphics Mode register
  71.     inc    dx        ;point to GC Data
  72.     mov    al,00001000b    ;bit 3=1 is read mode 1, bits 1 & 0=00
  73.                 ; is write mode 0
  74.     out    dx,al        ;set Graphics Mode to read mode 1,
  75.                 ; write mode 0
  76. ;
  77. ; Draw a horizontal green line, one pixel at a time, from left
  78. ; to right until color compare reports a yellow pixel is encountered.
  79. ;
  80. ; Draw in green.
  81. ;
  82.     mov    al,2        ;green is color 2
  83.     call    SelectSetResetColor ;set to draw in green
  84. ;
  85. ; Set color compare to look for yellow.
  86. ;
  87.     mov    dx,GC_INDEX
  88.     mov    al,COLOR_COMPARE
  89.     out    dx,al        ;point GC Index to Color Compare register
  90.     inc    dx        ;point to GC Data
  91.     mov    al,14        ;we're looking for yellow, color 14
  92.     out    dx,al        ;set color compare to look for yellow
  93.     dec    dx        ;point to GC Index
  94. ;
  95. ; Set up for quick access to Bit Mask register.
  96. ;
  97.     mov    al,BIT_MASK
  98.     out    dx,al        ;point GC Index to Bit Mask register
  99.     inc    dx        ;point to GC Data
  100. ;
  101. ; Set initial pixel mask and display memory offset.
  102. ;
  103.     mov    al,80h        ;initial pixel mask
  104.     mov    di,100*SCREEN_WIDTH
  105.                 ;start at left edge of scan line 100
  106. HLineLoop:
  107.     mov    ah,es:[di]    ;do a read mode 1 (color compare) read.
  108.                 ; This also loads the latches.
  109.     and    ah,al        ;is the pixel of current interest yellow?
  110.     jnz    WaitKeyAndDone    ;yes-we've reached the yellow line, so we're
  111.                 ; done
  112.     out    dx,al        ;set the Bit Mask register so that we
  113.                 ; modify only the pixel of interest
  114.     mov    es:[di],al    ;draw the pixel. The value written is
  115.                 ; irrelevant, since set/reset is providing
  116.                 ; the data written to display memory
  117.     ror    al,1        ;shift pixel mask to the next pixel
  118.     adc    di,0        ;advance the display memory offset if
  119.                 ; the pixel mask wrapped
  120. ;
  121. ; Slow things down a bit for visibility (adjust as needed).
  122. ;
  123.     mov    cx,0
  124. DelayLoop:
  125.     loop    DelayLoop
  126.  
  127.     jmp    HLineLoop
  128. ;
  129. ; Wait for a key to be pressed to end, then return to text mode and
  130. ; return to DOS.
  131. ;
  132. WaitKeyAndDone:
  133. WaitKeyLoop:
  134.     mov    ah,1
  135.     int    16h
  136.     jz    WaitKeyLoop
  137.     sub    ah,ah
  138.     int    16h        ;clear the key
  139.     mov    ax,3
  140.     int    10h        ;return to text mode
  141.     mov    ah,4ch
  142.     int    21h        ;done
  143. Start    endp
  144. ;
  145. ; Enables set/reset for all planes, and sets the set/reset color
  146. ; to AL.
  147. ;
  148. SelectSetResetColor    proc    near
  149.     mov    dx,GC_INDEX
  150.     push    ax        ;preserve color
  151.     mov    al,SET_RESET
  152.     out    dx,al        ;point GC Index to Set/Reset register
  153.     inc    dx        ;point to GC Data
  154.     pop    ax        ;get back color
  155.     out    dx,al        ;set Set/Reset register to selected color
  156.     dec    dx        ;point to GC Index
  157.     mov    al,ENABLE_SET_RESET
  158.     out    dx,al        ;point GC Index to Enable Set/Reset register
  159.     inc    dx        ;point to GC Data
  160.     mov    al,0fh
  161.     out    dx,al        ;enable set/reset for all planes
  162.     ret
  163. SelectSetResetColor    endp
  164. code    ends
  165.     end    Start
  166.