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

  1. ; Mode X (320x240, 256 colors) rectangle fill routine. Works on all
  2. ; VGAs. Uses medium-speed approach that selects each plane only once
  3. ; per rectangle; this results in a fade-in effect for large
  4. ; rectangles. Fills up to but not including the column at EndX and the
  5. ; row at EndY. No clipping is performed.
  6. ; Tested with TASM 4.0 by Jim Mischel 12/16/94.
  7. ; C near-callable as:
  8. ;
  9. ;    void FillRectangleX(int StartX, int StartY, int EndX, int EndY,
  10. ;       unsigned int PageBase, int Color);
  11.  
  12. SC_INDEX equ    03c4h   ;Sequence Controller Index
  13. MAP_MASK equ    02h     ;index in SC of Map Mask register
  14. SCREEN_SEG equ  0a000h  ;segment of display memory in mode X
  15. SCREEN_WIDTH equ 80     ;width of screen in bytes from one scan line
  16.                         ; to the next
  17. parms struc
  18.         dw      2 dup (?) ;pushed BP and return address
  19. StartX  dw      ?       ;X coordinate of upper left corner of rect
  20. StartY  dw      ?       ;Y coordinate of upper left corner of rect
  21. EndX    dw      ?       ;X coordinate of lower right corner of rect
  22.                         ; (the row at EndX is not filled)
  23. EndY    dw      ?       ;Y coordinate of lower right corner of rect
  24.                         ; (the column at EndY is not filled)
  25. PageBase dw     ?       ;base offset in display memory of page in
  26.                         ; which to fill rectangle
  27. Color   dw      ?       ;color in which to draw pixel
  28. parms ends
  29.  
  30. StartOffset equ  -2     ;local storage for start offset of rectangle
  31. Width    equ     -4     ;local storage for address width of rectangle
  32. Height   equ     -6     ;local storage for height of rectangle
  33. PlaneInfo equ    -8     ;local storage for plane # and plane mask
  34. STACK_FRAME_SIZE equ 8
  35.  
  36.         .model  small
  37.         .code
  38.         public  _FillRectangleX
  39. _FillRectangleX proc    near
  40.         push    bp      ;preserve caller's stack frame
  41.         mov     bp,sp   ;point to local stack frame
  42.         sub     sp,STACK_FRAME_SIZE ;allocate space for local vars
  43.         push    si      ;preserve caller's register variables
  44.         push    di
  45.  
  46.         cld
  47.         mov     ax,SCREEN_WIDTH
  48.         mul     [bp+StartY] ;offset in page of top rectangle scan line
  49.         mov     di,[bp+StartX]
  50.         shr     di,1
  51.         shr     di,1    ;X/4 = offset of first rectangle pixel in scan
  52.                         ; line
  53.         add     di,ax   ;offset of first rectangle pixel in page
  54.         add     di,[bp+PageBase] ;offset of first rectangle pixel in
  55.                         ; display memory
  56.         mov     ax,SCREEN_SEG
  57.         mov     es,ax   ;point ES:DI to the first rectangle pixel's
  58.         mov     [bp+StartOffset],di ; address
  59.         mov     dx,SC_INDEX ;set the Sequence Controller Index to
  60.         mov     al,MAP_MASK ; point to the Map Mask register
  61.         out     dx,al
  62.         mov     bx,[bp+EndY]
  63.         sub     bx,[bp+StartY]  ;BX = height of rectangle
  64.         jle     FillDone        ;skip if 0 or negative height
  65.         mov     [bp+Height],bx
  66.         mov     dx,[bp+EndX]
  67.         mov     cx,[bp+StartX]
  68.         cmp     dx,cx
  69.         jle     FillDone        ;skip if 0 or negative width
  70.         dec     dx
  71.         and     cx,not 011b
  72.         sub     dx,cx
  73.         shr     dx,1
  74.         shr     dx,1
  75.         inc     dx      ;# of addresses across rectangle to fill
  76.         mov     [bp+Width],dx
  77.         mov     word ptr [bp+PlaneInfo],0001h
  78.                            ;lower byte = plane mask for plane 0,
  79.                            ; upper byte = plane # for plane 0
  80. FillPlanesLoop:
  81.         mov     ax,word ptr [bp+PlaneInfo]
  82.         mov     dx,SC_INDEX+1 ;point DX to the SC Data register
  83.         out     dx,al   ;set the plane for this pixel
  84.         mov     di,[bp+StartOffset] ;point ES:DI to rectangle start
  85.         mov     dx,[bp+Width]
  86.         mov     cl,byte ptr [bp+StartX]
  87.         and     cl,011b ;plane # of first pixel in initial byte
  88.         cmp     ah,cl   ;do we draw this plane in the initial byte?
  89.         jae     InitAddrSet ;yes
  90.         dec     dx      ;no, so skip the initial byte
  91.         jz      FillLoopBottom ;skip this plane if no pixels in it
  92.         inc     di
  93. InitAddrSet:
  94.         mov     cl,byte ptr [bp+EndX]
  95.         dec     cl
  96.         and     cl,011b ;plane # of last pixel in final byte
  97.         cmp     ah,cl   ;do we draw this plane in the final byte?
  98.         jbe     WidthSet ;yes
  99.         dec     dx      ;no, so skip the final byte
  100.         jz      FillLoopBottom ;skip this planes if no pixels in it
  101. WidthSet:
  102.         mov     si,SCREEN_WIDTH
  103.         sub     si,dx   ;distance from end of one scan line to start
  104.                         ; of next
  105.         mov     bx,[bp+Height] ;# of lines to fill
  106.         mov     al,byte ptr [bp+Color] ;color with which to fill
  107. FillRowsLoop:
  108.         mov     cx,dx   ;# of bytes across scan line
  109.         rep     stosb   ;fill the scan line in this plane
  110.         add     di,si   ;point to the start of the next scan
  111.                         ; line of the rectangle
  112.         dec     bx      ;count down scan lines
  113.         jnz     FillRowsLoop
  114. FillLoopBottom:
  115.         mov     ax,word ptr [bp+PlaneInfo]
  116.         shl     al,1    ;set the plane bit to the next plane
  117.         inc     ah      ;increment the plane #
  118.         mov     word ptr [bp+PlaneInfo],ax
  119.         cmp     ah,4    ;have we done all planes?
  120.         jnz     FillPlanesLoop ;continue if any more planes
  121. FillDone:
  122.         pop     di      ;restore caller's register variables
  123.         pop     si
  124.         mov     sp,bp   ;discard storage for local variables
  125.         pop     bp      ;restore caller's stack frame
  126.         ret
  127. _FillRectangleX endp
  128.         end
  129.  
  130.