home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / C-ASM_VI.ARJ / PROGASM.ZIP / PROG085.ASM < prev    next >
Assembly Source File  |  1988-05-15  |  8KB  |  228 lines

  1.  
  2. ;************************************************************************
  3. ; solid_box(x0,y0,x1,y1,color)   fill a rectangle defined by            *
  4. ;       upper-left 'x0,y0', and lower-right 'x1,y1'                     *
  5. ;       with the specified color 'Color'.                               *
  6. ;       Each pixel on the display corresponds to one bit in memory.     *
  7. ;       Thus one byte represents 8 different pixles.                    *
  8. ;       A rectangle, in general, will consist of three vertical         *
  9. ;       strips. The midle strip will be composed entirely from pixels   *
  10. ;       forming a complete byte. The left strip has pixels only in      *
  11. ;       last few bits of a byte, and right strip only in first few bits *
  12. ;       This routine will draw each strip in a separate loop.           *
  13. ;************************************************************************
  14.  
  15. x0      EQU     [BP+4]
  16. y0      EQU     [BP+6]
  17. x1      EQU     [BP+8]
  18. y1      EQU     [BP+10]
  19. Color   EQU     [BP+12]
  20.  
  21.         PUBLIC  _Solid_Box
  22.  
  23. _Solid_Box      PROC NEAR
  24.         PUSH    BP
  25.         MOV     BP,SP
  26.         PUSH    DI                      ;Preserve segment registers
  27.         PUSH    SI
  28.         PUSH    DS
  29.         PUSH    ES
  30.  
  31.         ;--- Rearrange corners so that x0<x1 and y0<y1
  32.  
  33.         MOV     AX,X1                   ; make x0 < x1
  34.         MOV     BX,X0
  35.         CMP     AX,BX
  36.         JGE     xfine
  37.         MOV     X0,AX
  38.         MOV     X1,BX
  39. xfine:  MOV     AX,Y1                   ; make y0 < y1
  40.         MOV     BX,Y0
  41.         CMP     AX,BX
  42.         JGE     yfine
  43.         MOV     Y0,AX
  44.         MOV     Y1,BX
  45. yfine:
  46.  
  47.         ;--- COMPUTE ADDRESS AND MASK FOR FIRST PIXEL -------------
  48.  
  49.         MOV     cl,4                    ; offset = 80 * y + x/8
  50.         MOV     AX,Y0
  51.         SHL     AX,CL
  52.         MOV     BX,AX
  53.         SHL     AX,1
  54.         SHL     AX,1
  55.         ADD     AX,BX
  56.         MOV     BX,X0                   ; + x/8
  57.         MOV     CL,3
  58.         SHR     BX,CL
  59.         ADD     AX,BX
  60.         MOV     DI,AX                   ; save offset in register di
  61.  
  62.        ;--- Load SET/RESET registers with current color
  63.  
  64.         MOV     DX,03CEh                ; move color into reset register
  65.         XOR     AL,AL
  66.         OUT     DX,AL
  67.         INC     DX
  68.         MOV     AL,Color
  69.         OUT     DX,AL
  70.         DEC     DX                      ; enable use of reset register
  71.         MOV     AL,1
  72.         OUT     DX,AL
  73.         INC     DX
  74.         MOV     AL,0Fh
  75.         OUT     DX,AL
  76.         MOV     DX,03C4h                ; enable all four planes for writing
  77.         MOV     AL,2
  78.         OUT     DX,AL
  79.         INC     DX
  80.         MOV     AL,0Fh
  81.         OUT     DX,al
  82.  
  83.         ;---    load segment register
  84.  
  85.         MOV     DX,0A000h
  86.         MOV     ES,DX
  87.         MOV     DX,DX
  88.  
  89. ;------------------- FILL LEADING PARTIAL BYTES ------------------------
  90. ; in this section first strip of the rectangle is drawn
  91.  
  92.         MOV     CX,X0                   ; check for partial leading byte by
  93.         AND     CX,07h                  ; checking that x0 is not a multiple
  94.         JZ      endlead                 ; of 8
  95.  
  96.         MOV     AX,X0                   ; update x0 to start in the middle strip
  97.         SUB     AX,CX
  98.         ADD     AX,8
  99.         MOV     X0,AX                   ;...and save it for later
  100.  
  101.         MOV     BX,0FFh                 ; compute the mask (bits to change)
  102.         SHR     BX,CL
  103.  
  104.         SUB     AX,X1                   ; check if whole rectangle is in
  105.         DEC     AX                      ; this byte
  106.         JLE     bitmask                 ; modify mask if it is the only byte
  107.         MOV     CX,AX
  108.         SHR     BX,CL
  109.         SHL     BX,CL
  110.  
  111. bitmask:MOV     DX,03CEh                ; set the mask in EGA control registers
  112.         MOV     AL,08h
  113.         OUT     DX,AL
  114.         INC     DX
  115.         MOV     AL,BL
  116.         OUT     DX,AL
  117.                                         ; Loop to fill the whole strip
  118.         MOV     CX,Y1                   ; set counter over rasters
  119.         SUB     CX,Y0
  120.         INC     CX
  121.         MOV     BX,80                   ; byte in next raster is 80 bytes further
  122.         PUSH    DI
  123. looplead:
  124.         MOV     AH,[DI]                 ; latch data(preserve unused bits in a byte)
  125.         MOV     [DI],AL                 ; write new data(mask register will do right bits)
  126.         ADD     DI,BX                   ; address of byte in next raster
  127.         LOOP    looplead
  128.  
  129.         POP     DI
  130.         INC     DI                      ; address next to first byte in this strip
  131. endlead:
  132. ;----------------- FILL FULL BYTES --------------------------------------
  133. ; in this section the strip containing  full bytes is drawn
  134.  
  135.         MOV     CX,X1                   ; check if any more to do
  136.         SUB     CX,X0
  137.         JL      endtrail
  138.         INC     CX                      ; check if any full bytes
  139.         CMP     CX,8
  140.         JL      endfull
  141.  
  142.         MOV     BX,Y1                   ; set counter of rasters to fill
  143.         SUB     BX,Y0
  144.         INC     BX
  145.  
  146.         SHR     CX,1                    ;Converts bits fill into bytes to fill
  147.         SHR     CX,1
  148.         SHR     CX,1
  149.  
  150.         MOV     DX,03CEh                ; set the mask in EGA control registers
  151.         MOV     AL,08h
  152.         OUT     DX,AL
  153.         INC     DX
  154.         MOV     AL,0FFH
  155.         OUT     DX,AL
  156.  
  157.         MOV     DX,80                   ; byte in next raster is 80 bytes further
  158.         PUSH    DI
  159. loopfull:
  160.         PUSH    CX                      ; loop over rasters
  161.         PUSH    DI
  162.  
  163.         REP     STOSB                   ; set all full bytes in the same raster
  164.  
  165.         POP     DI                      ; address of first byte in next raster
  166.         ADD     DI,DX
  167.         POP     CX                      ; restore counter of bytes in a raster
  168.         DEC     BX                      ; check if more rasters to do
  169.         JG      loopfull
  170.  
  171.         POP     DI                      ; address of byte next to last one
  172.         ADD     DI,CX                   ; in this strip
  173. endfull:
  174. ;------------------- FILL TRAILING PARTIAL BYTES -----------------------
  175.  
  176.         MOV     CX,X1                   ; check for trailing partial byte
  177.         INC     CX
  178.         AND     CX,07h
  179.         JZ      endtrail
  180.  
  181.         MOV     AX,00FFh                ; compute mask
  182.         ROR     AX,CL
  183.  
  184.  
  185.         MOV     DX,03CEh                ; set the mask
  186.         MOV     AL,08h
  187.         OUT     DX,AL
  188.         INC     DX
  189.         MOV     AL,AH
  190.         OUT     DX,AL
  191.  
  192.         MOV     CX,Y1                   ; set counters
  193.         SUB     CX,Y0
  194.         INC     CX
  195.         MOV     BX,80
  196. looptrail:
  197.         MOV     AL,[DI]                 ; latch data (to preserve other bits)
  198.         MOV     [DI],AL                 ; set new data
  199.         ADD     DI,BX
  200.         LOOP    looptrail
  201.  
  202.         ;--- Restore PLANE ENABLE and BIT MASK registers
  203. endtrail:
  204.         MOV     DX,03CEh                ; Enable all 8-bits in a byte for write
  205.         MOV     AL,08h                  ; by setting BIT MASK register to Fhex
  206.         OUT     DX,AL
  207.         INC     DX
  208.         MOV     AL,0FFh
  209.         OUT     DX,AL
  210.  
  211.         DEC     DX                      ; Disable SET/RESET function
  212.         MOV     AL,1
  213.         OUT     DX,AL
  214.         INC     DX
  215.         XOR     AX,AX
  216.         OUT     DX,AL
  217.  
  218. ;------------- CLEAN UP AND EXIT ------------------------------------------
  219.  
  220.         POP     ES
  221.         POP     DS
  222.         POP     SI
  223.         POP     DI
  224.         MOV     SP,BP
  225.         POP     BP
  226.         RET
  227. _Solid_Box      ENDP
  228.