home *** CD-ROM | disk | FTP | other *** search
/ Graphics Programming Black Book (Special Edition) / BlackBook.bin / disk1 / source / chapter24 / l24-1.asm next >
Assembly Source File  |  1997-06-18  |  10KB  |  254 lines

  1. ; Program to illustrate operation of ALUs and latches of the VGA's
  2. ;  Graphics Controller.  Draws a variety of patterns against
  3. ;  a horizontally striped background, using each of the 4 available
  4. ;  logical functions (data unmodified, AND, OR, XOR) in turn to combine
  5. ;  the images with the background.
  6. ; Assembled with TASM 4.0, linked with TLINK 6.10
  7. ; Checked by Jim Mischel, 11/21/94
  8. ;
  9. stack   segment para stack 'STACK'
  10.         db      512 dup(?)
  11. stack   ends
  12. ;
  13. VGA_VIDEO_SEGMENT       equ     0a000h  ;VGA display memory segment
  14. SCREEN_HEIGHT           equ     350
  15. SCREEN_WIDTH_IN_BYTES   equ     80
  16. DEMO_AREA_HEIGHT        equ     336     ;# of scan lines in area
  17.                                         ; logical function operation
  18.                                         ; is demonstrated in
  19. DEMO_AREA_WIDTH_IN_BYTES equ    40      ;width in bytes of area
  20.                                         ; logical function operation
  21.                                         ; is demonstrated in
  22. VERTICAL_BOX_WIDTH_IN_BYTES equ 10      ;width in bytes of the box used to
  23.                                         ; demonstrate each logical function
  24. ;
  25. ; VGA register equates.
  26. ;
  27. GC_INDEX        equ     3ceh    ;GC index register
  28. GC_ROTATE       equ     3       ;GC data rotate/logical function
  29.                                 ; register index
  30. GC_MODE         equ     5       ;GC mode register index
  31. ;
  32. dseg    segment para common 'DATA'
  33. ;
  34. ; String used to label logical functions.
  35. ;
  36. LabelString     label   byte
  37.         db      'UNMODIFIED    AND       OR        XOR   '
  38. LABEL_STRING_LENGTH     equ     $-LabelString
  39. ;
  40. ; Strings used to label fill patterns.
  41. ;
  42. FillPatternFF   db      'Fill Pattern: 0FFh'
  43. FILL_PATTERN_FF_LENGTH  equ     $ - FillPatternFF
  44. FillPattern00   db      'Fill Pattern: 000h'
  45. FILL_PATTERN_00_LENGTH  equ     $ - FillPattern00
  46. FillPatternVert db      'Fill Pattern: Vertical Bar'
  47. FILL_PATTERN_VERT_LENGTH        equ     $ - FillPatternVert
  48. FillPatternHorz db      'Fill Pattern: Horizontal Bar'
  49. FILL_PATTERN_HORZ_LENGTH equ    $ - FillPatternHorz
  50. ;
  51. dseg    ends
  52. ;
  53. ; Macro to set indexed register INDEX of GC chip to SETTING.
  54. ;
  55. SETGC   macro   INDEX, SETTING
  56.         mov     dx,GC_INDEX
  57.         mov     ax,(SETTING SHL 8) OR INDEX
  58.         out     dx,ax
  59.         endm
  60. ;
  61. ;
  62. ; Macro to call BIOS write string function to display text string
  63. ;  TEXT_STRING, of length TEXT_LENGTH, at location ROW,COLUMN.
  64. ;
  65. TEXT_UP macro   TEXT_STRING, TEXT_LENGTH, ROW, COLUMN
  66.         mov     ah,13h                  ;BIOS write string function
  67.         mov     bp,offset TEXT_STRING   ;ES:BP points to string
  68.         mov     cx,TEXT_LENGTH
  69.         mov     dx,(ROW SHL 8) OR COLUMN        ;position
  70.         sub     al,al           ;string is chars only, cursor not moved
  71.         mov     bl,7            ;text attribute is white (light gray)
  72.         int     10h
  73.         endm
  74. ;
  75. cseg    segment para public 'CODE'
  76.         assume  cs:cseg, ds:dseg
  77. start   proc    near
  78.         mov     ax,dseg
  79.         mov     ds,ax
  80. ;
  81. ; Select 640x350 graphics mode.
  82. ;
  83.         mov     ax,010h
  84.         int     10h
  85. ;
  86. ; ES points to VGA memory.
  87. ;
  88.         mov     ax,VGA_VIDEO_SEGMENT
  89.         mov     es,ax
  90. ;
  91. ; Draw background of horizontal bars.
  92. ;
  93.         mov     dx,SCREEN_HEIGHT/4
  94.                                 ;# of bars to draw (each 4 pixels high)
  95.         sub     di,di           ;start at offset 0 in display memory
  96.         mov     ax,0ffffh       ;fill pattern for light areas of bars
  97.         mov     bx,DEMO_AREA_WIDTH_IN_BYTES / 2 ;length of each bar
  98.         mov     si,SCREEN_WIDTH_IN_BYTES - DEMO_AREA_WIDTH_IN_BYTES
  99.         mov     bp,(SCREEN_WIDTH_IN_BYTES * 3) - DEMO_AREA_WIDTH_IN_BYTES
  100. BackgroundLoop:
  101.         mov     cx,bx           ;length of bar
  102.     rep stosw                   ;draw top half of bar
  103.         add     di,si           ;point to start of bottom half of bar
  104.         mov     cx,bx           ;length of bar
  105.     rep stosw                   ;draw bottom half of bar
  106.         add     di,bp           ;point to start of top of next bar
  107.         dec     dx
  108.         jnz     BackgroundLoop
  109. ;
  110. ; Draw vertical boxes filled with a variety of fill patterns
  111. ;  using each of the 4 logical functions in turn.
  112.         SETGC   GC_ROTATE, 0            ;select data unmodified
  113.                                         ; logical function...
  114.         mov     di,0
  115.         call    DrawVerticalBox         ;...and draw box
  116. ;
  117.         SETGC   GC_ROTATE, 08h          ;select AND logical function...
  118.         mov     di,10
  119.         call    DrawVerticalBox         ;...and draw box
  120. ;
  121.         SETGC   GC_ROTATE, 10h          ;select OR logical function...
  122.         mov     di,20
  123.         call    DrawVerticalBox         ;...and draw box
  124. ;
  125.         SETGC   GC_ROTATE, 18h          ;select XOR logical function...
  126.         mov     di,30
  127.         call    DrawVerticalBox         ;...and draw box
  128. ;
  129. ; Reset the logical function to data unmodified, the default state.
  130. ;
  131.         SETGC   GC_ROTATE, 0
  132. ;
  133. ; Label the screen.
  134. ;
  135.         push    ds
  136.         pop     es      ;strings we'll display are passed to BIOS
  137.                         ; by pointing ES:BP to them
  138. ;
  139. ; Label the logical functions, using the VGA BIOS's
  140. ;  write string function.
  141. ;
  142.         TEXT_UP LabelString, LABEL_STRING_LENGTH, 24, 0
  143. ;
  144. ; Label the fill patterns, using the VGA BIOS's
  145. ;  write string function.
  146. ;
  147.         TEXT_UP FillPatternFF, FILL_PATTERN_FF_LENGTH, 3, 42
  148.         TEXT_UP FillPattern00, FILL_PATTERN_00_LENGTH, 9, 42
  149.         TEXT_UP FillPatternVert, FILL_PATTERN_VERT_LENGTH, 15, 42
  150.         TEXT_UP FillPatternHorz, FILL_PATTERN_HORZ_LENGTH, 21, 42
  151. ;
  152. ; Wait until a key's been hit to reset screen mode & exit.
  153. ;
  154. WaitForKey:
  155.         mov     ah,1
  156.         int     16h
  157.         jz      WaitForKey
  158. ;
  159. ; Finished.  Clear key, reset screen mode and exit.
  160. ;
  161. Done:
  162.         mov     ah,0    ;clear key that we just detected
  163.         int     16h
  164. ;
  165.         mov     ax,3    ;reset to text mode
  166.         int     10h
  167. ;
  168.         mov     ah,4ch  ;exit to DOS
  169.         int     21h
  170. ;
  171. start   endp
  172. ; Subroutine to draw a box 80x336 in size, using currently selected
  173. ;  logical function, with upper left corner at the display memory offset
  174. ;  in DI.  Box is filled with four patterns.  Top quarter of area is
  175. ;  filled with 0FFh (solid) pattern, next quarter is filled with 00h
  176. ;  (empty) pattern, next quarter is filled with 33h (double pixel wide
  177. ;  vertical bar) pattern, and bottom quarter is filled with double pixel
  178. ;  high horizontal bar pattern.
  179. ;
  180. ; Macro to draw a column of the specified width in bytes, one- quarter
  181. ;  of the height of the box, with the specified fill pattern.
  182. ;
  183. DRAW_BOX_QUARTER        macro   FILL, WIDTH
  184.         local   RowLoop, ColumnLoop
  185.         mov     al,FILL                 ;fill pattern
  186.         mov     dx,DEMO_AREA_HEIGHT / 4 ;1/4 of the full box height
  187. RowLoop:
  188.         mov     cx,WIDTH
  189. ColumnLoop:
  190.         mov     ah,es:[di]      ;load display memory contents into
  191.                                 ; GC latches (we don't actually care
  192.                                 ; about value read into AH)
  193.         stosb                   ;write pattern, which is logically
  194.                                 ; combined with latch contents for each
  195.                                 ; plane and then written to display
  196.                                 ; memory
  197.         loop    ColumnLoop
  198.         add     di,SCREEN_WIDTH_IN_BYTES - WIDTH
  199.                                 ;point to start of next line down in box
  200.         dec     dx
  201.         jnz     RowLoop
  202.         endm
  203. ;
  204. DrawVerticalBox proc    near
  205.         DRAW_BOX_QUARTER        0ffh, VERTICAL_BOX_WIDTH_IN_BYTES
  206.                                         ;first fill pattern: solid fill
  207.         DRAW_BOX_QUARTER        0, VERTICAL_BOX_WIDTH_IN_BYTES
  208.                                         ;second fill pattern: empty fill
  209.         DRAW_BOX_QUARTER        033h, VERTICAL_BOX_WIDTH_IN_BYTES
  210.                                         ;third fill pattern: double-pixel
  211.                                         ; wide vertical bars
  212.         mov     dx,DEMO_AREA_HEIGHT / 4 / 4
  213.                                 ;fourth fill pattern: horizontal bars in
  214.                                 ; sets of 4 scan lines
  215.         sub     ax,ax
  216.         mov     si,VERTICAL_BOX_WIDTH_IN_BYTES  ;width of fill area
  217. HorzBarLoop:
  218.         dec     ax              ;0ffh fill (faster to do word than byte DEC)
  219.         mov     cx,si           ;width to fill
  220. HBLoop1:
  221.         mov     bl,es:[di]      ;load latches (don't care about value)
  222.         stosb                   ;write solid pattern, through ALUs
  223.         loop    HBLoop1
  224.         add     di,SCREEN_WIDTH_IN_BYTES - VERTICAL_BOX_WIDTH_IN_BYTES
  225.         mov     cx,si           ;width to fill
  226. HBLoop2:
  227.         mov     bl,es:[di]      ;load latches
  228.         stosb                   ;write solid pattern, through ALUs
  229.         loop    HBLoop2
  230.         add     di,SCREEN_WIDTH_IN_BYTES - VERTICAL_BOX_WIDTH_IN_BYTES
  231.         inc     ax              ;0 fill (faster to do word than byte DEC)
  232.         mov     cx,si           ;width to fill
  233. HBLoop3:
  234.         mov     bl,es:[di]      ;load latches
  235.         stosb                   ;write empty pattern, through ALUs
  236.         loop    HBLoop3
  237.         add     di,SCREEN_WIDTH_IN_BYTES - VERTICAL_BOX_WIDTH_IN_BYTES
  238.         mov     cx,si           ;width to fill
  239. HBLoop4:
  240.         mov     bl,es:[di]      ;load latches
  241.         stosb                   ;write empty pattern, through ALUs
  242.         loop    HBLoop4
  243.         add     di,SCREEN_WIDTH_IN_BYTES - VERTICAL_BOX_WIDTH_IN_BYTES
  244.         dec     dx
  245.         jnz     HorzBarLoop
  246. ;       
  247.         ret
  248. DrawVerticalBox endp
  249. cseg    ends
  250.         end     start
  251.  
  252.