home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / C-ASM_VI.ARJ / PROGASM.ZIP / PROG085P.ASM < prev    next >
Assembly Source File  |  1988-05-25  |  5KB  |  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+14]
  16. y0    EQU    [BP+12]
  17. x1    EQU    [BP+10]
  18. y1    EQU    [BP+8]
  19. Color    EQU    [BP+6]
  20.  
  21.     PUBLIC    Solid_Box
  22.  
  23. Solid_Box    PROC FAR
  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
  93.     AND    CX,07h         ; by checking that x0 is not a multiple of 8
  94.     JZ    endlead
  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 this byte
  105.     DEC    AX
  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(to 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 on in this strip
  172.     ADD    DI,CX
  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 (this is done 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    10
  227. Solid_Box    ENDP
  228.