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

  1. ;
  2. ; *** Listing 5.2 ***
  3. ;
  4. ; Program to illustrate one use of write mode 2 of the VGA and EGA by
  5. ; drawing lines in color patterns.
  6. ;
  7. ; Assembled with TASM 4.0, linked with TLINK 6.10
  8. ; Checked by Jim Mischel 11/21/94
  9. ;
  10. Stack   segment para stack 'STACK'
  11.         db      512 dup(0)
  12. Stack   ends
  13.  
  14. SCREEN_WIDTH_IN_BYTES       equ     80
  15. GRAPHICS_SEGMENT     equ    0a000h  ;mode 10 bit-map segment
  16. SC_INDEX                equ     3c4h    ;Sequence Controller Index register
  17. MAP_MASK                equ     2       ;index of Map Mask register
  18. GC_INDEX                equ     03ceh   ;Graphics Controller Index reg
  19. GRAPHICS_MODE           equ     5       ;index of Graphics Mode reg
  20. BIT_MASK                equ     8       ;index of Bit Mask reg
  21.  
  22. Data    segment para common 'DATA'
  23. Pattern0        db      16
  24.                 db      0, 1, 2, 3, 4, 5, 6, 7, 8
  25.                 db      9, 10, 11, 12, 13, 14, 15
  26. Pattern1        db      6
  27.                 db      2, 2, 2, 10, 10, 10
  28. Pattern2        db      8
  29.                 db      15, 15, 15, 0, 0, 15, 0, 0
  30. Pattern3        db      9
  31.                 db      1, 1, 1, 2, 2, 2, 4, 4, 4
  32. Data    ends
  33.  
  34. Code    segment para public 'CODE'
  35.         assume  cs:Code, ds:Data
  36. Start   proc    near
  37.         mov     ax,Data
  38.         mov     ds,ax
  39.         mov     ax,10h
  40.         int     10h             ;select video mode 10h (640x350)
  41. ;
  42. ; Draw 8 radial lines in upper left quadrant in pattern 0.
  43. ;
  44.         mov     bx,0
  45.         mov     cx,0
  46.         mov     si,offset Pattern0
  47.         call    QuadrantUp
  48. ;
  49. ; Draw 8 radial lines in upper right quadrant in pattern 1.
  50. ;
  51.         mov     bx,320
  52.         mov     cx,0
  53.         mov     si,offset Pattern1
  54.         call    QuadrantUp
  55. ;
  56. ; Draw 8 radial lines in lower left quadrant in pattern 2.
  57. ;
  58.         mov     bx,0
  59.         mov     cx,175
  60.         mov     si,offset Pattern2
  61.         call    QuadrantUp
  62. ;
  63. ; Draw 8 radial lines in lower right quadrant in pattern 3.
  64. ;
  65.         mov     bx,320
  66.         mov     cx,175
  67.         mov     si,offset Pattern3
  68.         call    QuadrantUp
  69. ;
  70. ; Wait for a key before returning to text mode and ending.
  71. ;
  72.         mov     ah,01h
  73.         int     21h
  74.         mov     ax,03h
  75.         int     10h
  76.         mov     ah,4ch
  77.         int     21h
  78. ;
  79. ; Draws 8 radial lines with specified pattern in specified mode 10h
  80. ; quadrant.
  81. ;
  82. ; Input:
  83. ;       BX = X coordinate of upper left corner of quadrant
  84. ;       CX = Y coordinate of upper left corner of quadrant
  85. ;       SI = pointer to pattern, in following form:
  86. ;               Byte 0: Length of pattern
  87. ;               Byte 1: Start of pattern, one color per byte
  88. ;
  89. ; AX, BX, CX, DX destroyed
  90. ;
  91. QuadrantUp      proc    near
  92.         add     bx,160
  93.         add     cx,87           ;point to the center of the quadrant
  94.         mov     ax,0
  95.         mov     dx,160
  96.         call    LineUp          ;draw horizontal line to right edge
  97.         mov     ax,1
  98.         mov     dx,88
  99.         call    LineUp          ;draw diagonal line to upper right
  100.         mov     ax,2
  101.         mov     dx,88
  102.         call    LineUp          ;draw vertical line to top edge
  103.         mov     ax,3
  104.         mov     dx,88
  105.         call    LineUp          ;draw diagonal line to upper left
  106.         mov     ax,4
  107.         mov     dx,161
  108.         call    LineUp          ;draw horizontal line to left edge
  109.         mov     ax,5
  110.         mov     dx,88
  111.         call    LineUp          ;draw diagonal line to lower left
  112.         mov     ax,6
  113.         mov     dx,88
  114.         call    LineUp          ;draw vertical line to bottom edge
  115.         mov     ax,7
  116.         mov     dx,88
  117.         call    LineUp          ;draw diagonal line to bottom right
  118.         ret
  119. QuadrantUp      endp
  120. ;
  121. ; Draws a horizontal, vertical, or diagonal line (one of the eight
  122. ; possible radial lines) of the specified length from the specified
  123. ; starting point.
  124. ;
  125. ; Input:
  126. ;       AX = line direction, as follows:
  127. ;               3  2  1
  128. ;               4  *  0
  129. ;               5  6  7
  130. ;       BX = X coordinate of starting point
  131. ;       CX = Y coordinate of starting point
  132. ;       DX = length of line (number of pixels drawn)
  133. ;
  134. ; All registers preserved.
  135. ;
  136. ; Table of vectors to routines for each of the 8 possible lines.
  137. ;
  138. LineUpVectors   label   word
  139.         dw      LineUp0, LineUp1, LineUp2, LineUp3
  140.         dw      LineUp4, LineUp5, LineUp6, LineUp7
  141.  
  142. ;
  143. ; Macro to draw horizontal, vertical, or diagonal line.
  144. ;
  145. ; Input:
  146. ;       XParm = 1 to draw right, -1 to draw left, 0 to not move horz.
  147. ;       YParm = 1 to draw up, -1 to draw down, 0 to not move vert.
  148. ;       BX = X start location
  149. ;       CX = Y start location
  150. ;       DX = number of pixels to draw
  151. ;       DS:SI = line pattern
  152. ;
  153. MLineUp macro   XParm, YParm
  154.         local   LineUpLoop, CheckMoreLine
  155.         mov     di,si           ;set aside start offset of pattern
  156.         lodsb                   ;get length of pattern
  157.         mov     ah,al
  158.  
  159. LineUpLoop:
  160.         lodsb                   ;get color of this pixel...
  161.         call    DotUpInColor    ;...and draw it
  162. if XParm EQ 1
  163.         inc     bx
  164. endif
  165. if XParm EQ -1
  166.         dec     bx
  167. endif
  168. if YParm EQ 1
  169.         inc     cx
  170. endif
  171. if YParm EQ -1
  172.         dec     cx
  173. endif
  174.         dec     ah              ;at end of pattern?
  175.         jnz     CheckMoreLine
  176.         mov     si,di           ;get back start of pattern
  177.         lodsb
  178.         mov     ah,al           ;reset pattern count
  179.  
  180. CheckMoreLine:
  181.         dec     dx
  182.         jnz     LineUpLoop
  183.         jmp     LineUpEnd
  184.         endm
  185.  
  186. LineUp  proc    near
  187.         push    ax
  188.         push    bx
  189.         push    cx
  190.         push    dx
  191.         push    si
  192.         push    di
  193.         push    es
  194.  
  195.         mov     di,ax
  196.  
  197.         mov     ax,GRAPHICS_SEGMENT
  198.         mov     es,ax
  199.  
  200.         push    dx              ;save line length
  201. ;
  202. ; Enable writes to all planes.
  203. ;
  204.         mov     dx,SC_INDEX
  205.         mov     al,MAP_MASK
  206.         out     dx,al
  207.         inc     dx
  208.         mov     al,0fh
  209.         out     dx,al
  210. ;
  211. ; Select write mode 2.
  212. ;
  213.         mov     dx,GC_INDEX
  214.         mov     al,GRAPHICS_MODE
  215.         out     dx,al
  216.         inc     dx
  217.         mov     al,02h
  218.         out     dx,al
  219. ;
  220. ; Vector to proper routine.
  221. ;
  222.         pop     dx              ;get back line length
  223.  
  224.         shl     di,1
  225.         jmp     cs:[LineUpVectors+di]
  226. ;
  227. ; Horizontal line to right.
  228. ;
  229. LineUp0:
  230.         MLineUp 1, 0
  231. ;
  232. ; Diagonal line to upper right.
  233. ;
  234. LineUp1:
  235.         MLineUp 1, -1
  236. ;
  237. ; Vertical line to top.
  238. ;
  239. LineUp2:
  240.         MLineUp 0, -1
  241. ;
  242. ; Diagonal line to upper left.
  243. ;
  244. LineUp3:
  245.         MLineUp -1, -1
  246. ;
  247. ; Horizontal line to left.
  248. ;
  249. LineUp4:
  250.         MLineUp -1, 0
  251. ;
  252. ; Diagonal line to bottom left.
  253. ;
  254. LineUp5:
  255.         MLineUp -1, 1
  256. ;
  257. ; Vertical line to bottom.
  258. ;
  259. LineUp6:
  260.         MLineUp 0, 1
  261. ;
  262. ; Diagonal line to bottom right.
  263. ;
  264. LineUp7:
  265.         MLineUp 1, 1
  266.  
  267. LineUpEnd:
  268.         pop     es
  269.         pop     di
  270.         pop     si
  271.         pop     dx
  272.         pop     cx
  273.         pop     bx
  274.         pop     ax
  275.         ret
  276. LineUp  endp
  277. ;
  278. ; Draws a dot in the specified color at the specified location.
  279. ; Assumes that the VGA is in write mode 2 with writes to all planes
  280. ; enabled and that ES points to display memory.
  281. ;
  282. ; Input:
  283. ;       AL = dot color
  284. ;       BX = X coordinate of dot
  285. ;       CX = Y coordinate of dot
  286. ;       ES = display memory segment
  287. ;
  288. ; All registers preserved.
  289. ;
  290. DotUpInColor    proc    near
  291.         push    bx
  292.         push    cx
  293.         push    dx
  294.         push    di
  295. ;
  296. ; Point ES:DI to the display memory byte in which the pixel goes, with
  297. ; the bit mask set up to access that pixel within the addressed byte.
  298. ;
  299.         push    ax              ;preserve dot color
  300.         mov     ax,SCREEN_WIDTH_IN_BYTES        
  301.         mul     cx              ;offset of start of top scan line
  302.         mov     di,ax
  303.         mov     cl,bl
  304.         and     cl,111b
  305.         mov     dx,GC_INDEX
  306.         mov     al,BIT_MASK
  307.         out     dx,al
  308.         inc     dx
  309.         mov     al,80h
  310.         shr     al,cl
  311.         out     dx,al           ;set the bit mask for the pixel
  312.         shr     bx,1
  313.         shr     bx,1
  314.         shr     bx,1            ;X in bytes
  315.         add     di,bx           ;offset of byte pixel is in
  316.         mov     al,es:[di]      ;load latches
  317.         pop     ax              ;get back dot color
  318.         stosb                   ;write dot in desired color
  319.  
  320.         pop     di
  321.         pop     dx
  322.         pop     cx
  323.         pop     bx
  324.         ret
  325. DotUpInColor    endp
  326. Start   endp
  327. Code    ends
  328.         end     Start
  329.  
  330.