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

  1. ; *** Listing 6.3 ***
  2. ;
  3. ; Program that draws a diagonal line to illustrate the use of a
  4. ; Color Don't Care register setting of 0FFh to support fast
  5. ; read-modify-write operations to VGA memory in write mode 3 by
  6. ; drawing a diagonal line.
  7. ;
  8. ; Note: Works on VGAs only.
  9. ;
  10. ; Assembled with TASM 4.0, linked with TLINK 6.10
  11. ; Checked by Jim Mischel 11/21/94
  12. ;
  13. stack    segment    word stack 'STACK'
  14.     db    512 dup (?)
  15. stack    ends
  16. ;
  17. VGA_SEGMENT    EQU    0a000h
  18. SCREEN_WIDTH    EQU    80    ;in bytes
  19. GC_INDEX        EQU    3ceh    ;Graphics Controller Index register
  20. SET_RESET    EQU    0    ;Set/Reset register index in GC
  21. ENABLE_SET_RESET EQU    1    ;Enable Set/Reset register index in GC
  22. GRAPHICS_MODE    EQU    5    ;Graphics Mode register index in GC
  23. COLOR_DONT_CARE    EQU    7    ;Color Don't Care register index in GC
  24. ;
  25. code    segment    word 'CODE'
  26.     assume    cs:code
  27. Start    proc    near
  28. ;
  29. ; Select graphics mode 12h.
  30. ;
  31.     mov    ax,12h
  32.     int    10h
  33. ;
  34. ; Select write mode 3 and read mode 1.
  35. ;
  36.     mov    dx,GC_INDEX
  37.     mov    al,GRAPHICS_MODE
  38.     out    dx,al
  39.     inc    dx
  40.     in    al,dx        ;VGA registers are readable, bless them!
  41.     or    al,00001011b    ;bit 3=1 selects read mode 1, and
  42.                 ; bits 1 & 0=11 selects write mode 3
  43.     jmp    $+2        ;delay between IN and OUT to same port
  44.     out    dx,al
  45.     dec    dx
  46. ;
  47. ; Set up set/reset to always draw in white.
  48. ;
  49.     mov    al,SET_RESET
  50.     out    dx,al
  51.     inc    dx
  52.     mov    al,0fh
  53.     out    dx,al
  54.     dec    dx
  55.     mov    al,ENABLE_SET_RESET
  56.     out    dx,al
  57.     inc    dx
  58.     mov    al,0fh
  59.     out    dx,al
  60.     dec    dx
  61. ;
  62. ; Set Color Don't Care to 0, so reads of VGA memory always return 0FFh.
  63. ;
  64.     mov    al,COLOR_DONT_CARE
  65.     out    dx,al
  66.     inc    dx
  67.     sub    al,al
  68.     out    dx,al
  69. ;
  70. ; Set up the initial memory pointer and pixel mask.
  71. ;
  72.     mov    ax,VGA_SEGMENT
  73.     mov    ds,ax
  74.     sub    bx,bx
  75.     mov    al,80h
  76. ;
  77. ; Draw 400 points on a diagonal line sloping down and to the right.
  78. ;
  79.     mov    cx,400
  80. DrawDiagonalLoop:
  81.     and    [bx],al        ;reads display memory, loading the latches,
  82.                 ; then writes AL to the VGA. AL becomes the
  83.                 ; bit mask, and set/reset provides the
  84.                 ; actual data written
  85.     add    bx,SCREEN_WIDTH
  86.                 ; point to the next scan line
  87.     ror    al,1        ;move the pixel mask one pixel to the right
  88.     adc    bx,0        ;advance to the next byte if the pixel mask wrapped
  89.     loop    DrawDiagonalLoop
  90. ;
  91. ; Wait for a key to be pressed to end, then return to text mode and
  92. ; return to DOS.
  93. ;
  94. WaitKeyLoop:
  95.     mov    ah,1
  96.     int    16h
  97.     jz    WaitKeyLoop
  98.     sub    ah,ah
  99.     int    16h        ;clear the key
  100.     mov    ax,3
  101.     int    10h        ;return to text mode
  102.     mov    ah,4ch
  103.     int    21h        ;done
  104. Start    endp
  105. code    ends
  106.     end    Start
  107.