home *** CD-ROM | disk | FTP | other *** search
-
- ;************************************************************************
- ; solid_box(x0,y0,x1,y1,color) fill a rectangle defined by *
- ; upper-left 'x0,y0', and lower-right 'x1,y1' *
- ; with the specified color 'Color'. *
- ; Each pixel on the display corresponds to one bit in memory. *
- ; Thus one byte represents 8 different pixles. *
- ; A rectangle, in general, will consist of three vertical *
- ; strips. The midle strip will be composed entirely from pixels *
- ; forming a complete byte. The left strip has pixels only in *
- ; last few bits of a byte, and right strip only in first few bits *
- ; This routine will draw each strip in a separate loop. *
- ;************************************************************************
-
- x0 EQU [BP+4]
- y0 EQU [BP+6]
- x1 EQU [BP+8]
- y1 EQU [BP+10]
- Color EQU [BP+12]
-
- PUBLIC _Solid_Box
-
- _Solid_Box PROC NEAR
- PUSH BP
- MOV BP,SP
- PUSH DI ;Preserve segment registers
- PUSH SI
- PUSH DS
- PUSH ES
-
- ;--- Rearrange corners so that x0<x1 and y0<y1
-
- MOV AX,X1 ; make x0 < x1
- MOV BX,X0
- CMP AX,BX
- JGE xfine
- MOV X0,AX
- MOV X1,BX
- xfine: MOV AX,Y1 ; make y0 < y1
- MOV BX,Y0
- CMP AX,BX
- JGE yfine
- MOV Y0,AX
- MOV Y1,BX
- yfine:
-
- ;--- COMPUTE ADDRESS AND MASK FOR FIRST PIXEL -------------
-
- MOV cl,4 ; offset = 80 * y + x/8
- MOV AX,Y0
- SHL AX,CL
- MOV BX,AX
- SHL AX,1
- SHL AX,1
- ADD AX,BX
- MOV BX,X0 ; + x/8
- MOV CL,3
- SHR BX,CL
- ADD AX,BX
- MOV DI,AX ; save offset in register di
-
- ;--- Load SET/RESET registers with current color
-
- MOV DX,03CEh ; move color into reset register
- XOR AL,AL
- OUT DX,AL
- INC DX
- MOV AL,Color
- OUT DX,AL
- DEC DX ; enable use of reset register
- MOV AL,1
- OUT DX,AL
- INC DX
- MOV AL,0Fh
- OUT DX,AL
- MOV DX,03C4h ; enable all four planes for writing
- MOV AL,2
- OUT DX,AL
- INC DX
- MOV AL,0Fh
- OUT DX,al
-
- ;--- load segment register
-
- MOV DX,0A000h
- MOV ES,DX
- MOV DX,DX
-
- ;------------------- FILL LEADING PARTIAL BYTES ------------------------
- ; in this section first strip of the rectangle is drawn
-
- MOV CX,X0 ; check for partial leading byte by
- AND CX,07h ; checking that x0 is not a multiple
- JZ endlead ; of 8
-
- MOV AX,X0 ; update x0 to start in the middle strip
- SUB AX,CX
- ADD AX,8
- MOV X0,AX ;...and save it for later
-
- MOV BX,0FFh ; compute the mask (bits to change)
- SHR BX,CL
-
- SUB AX,X1 ; check if whole rectangle is in
- DEC AX ; this byte
- JLE bitmask ; modify mask if it is the only byte
- MOV CX,AX
- SHR BX,CL
- SHL BX,CL
-
- bitmask:MOV DX,03CEh ; set the mask in EGA control registers
- MOV AL,08h
- OUT DX,AL
- INC DX
- MOV AL,BL
- OUT DX,AL
- ; Loop to fill the whole strip
- MOV CX,Y1 ; set counter over rasters
- SUB CX,Y0
- INC CX
- MOV BX,80 ; byte in next raster is 80 bytes further
- PUSH DI
- looplead:
- MOV AH,[DI] ; latch data(preserve unused bits in a byte)
- MOV [DI],AL ; write new data(mask register will do right bits)
- ADD DI,BX ; address of byte in next raster
- LOOP looplead
-
- POP DI
- INC DI ; address next to first byte in this strip
- endlead:
- ;----------------- FILL FULL BYTES --------------------------------------
- ; in this section the strip containing full bytes is drawn
-
- MOV CX,X1 ; check if any more to do
- SUB CX,X0
- JL endtrail
- INC CX ; check if any full bytes
- CMP CX,8
- JL endfull
-
- MOV BX,Y1 ; set counter of rasters to fill
- SUB BX,Y0
- INC BX
-
- SHR CX,1 ;Converts bits fill into bytes to fill
- SHR CX,1
- SHR CX,1
-
- MOV DX,03CEh ; set the mask in EGA control registers
- MOV AL,08h
- OUT DX,AL
- INC DX
- MOV AL,0FFH
- OUT DX,AL
-
- MOV DX,80 ; byte in next raster is 80 bytes further
- PUSH DI
- loopfull:
- PUSH CX ; loop over rasters
- PUSH DI
-
- REP STOSB ; set all full bytes in the same raster
-
- POP DI ; address of first byte in next raster
- ADD DI,DX
- POP CX ; restore counter of bytes in a raster
- DEC BX ; check if more rasters to do
- JG loopfull
-
- POP DI ; address of byte next to last one
- ADD DI,CX ; in this strip
- endfull:
- ;------------------- FILL TRAILING PARTIAL BYTES -----------------------
-
- MOV CX,X1 ; check for trailing partial byte
- INC CX
- AND CX,07h
- JZ endtrail
-
- MOV AX,00FFh ; compute mask
- ROR AX,CL
-
-
- MOV DX,03CEh ; set the mask
- MOV AL,08h
- OUT DX,AL
- INC DX
- MOV AL,AH
- OUT DX,AL
-
- MOV CX,Y1 ; set counters
- SUB CX,Y0
- INC CX
- MOV BX,80
- looptrail:
- MOV AL,[DI] ; latch data (to preserve other bits)
- MOV [DI],AL ; set new data
- ADD DI,BX
- LOOP looptrail
-
- ;--- Restore PLANE ENABLE and BIT MASK registers
- endtrail:
- MOV DX,03CEh ; Enable all 8-bits in a byte for write
- MOV AL,08h ; by setting BIT MASK register to Fhex
- OUT DX,AL
- INC DX
- MOV AL,0FFh
- OUT DX,AL
-
- DEC DX ; Disable SET/RESET function
- MOV AL,1
- OUT DX,AL
- INC DX
- XOR AX,AX
- OUT DX,AL
-
- ;------------- CLEAN UP AND EXIT ------------------------------------------
-
- POP ES
- POP DS
- POP SI
- POP DI
- MOV SP,BP
- POP BP
- RET
- _Solid_Box ENDP