home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GRIPS 2: Government Rast…rocessing Software & Data
/
GRIPS_2.cdr
/
dos
/
seq
/
src
/
ega.asm
< prev
next >
Wrap
Assembly Source File
|
1990-01-07
|
14KB
|
441 lines
;
; EGA GRAPHICS DRIVER
;
; supports raster graphics on the Enhanced Adapter
;
; Tim Krauskopf Spring 1986
;
; National Center for Supercomputing Applications, University of Illinois
; 153 Water Resources Building
; 605 E. Springfield
; Champaign, IL 61820
; (217) 244-0072
;
;
TITLE EGA GRAPHICS RASTER DRIVER
NAME EGA
INCLUDE DOS.MAC
SETX
;
; Define where the registers are
;
SEQ EQU 03C4H
MAPREG EQU 2
MAPMASK EQU 03C5H
GCHIP EQU 03CEH
DRREG EQU 3
MODEREG EQU 5
BITREG EQU 8
BITMASK EQU 03CFH
;
DSEG
FLAG DB 0 ; HAVE WE SET REGS UP
ENDDS
PSEG
PUBLIC EGAPOINT,EGALINE,EGALINE2,EGALINEA
PUBLIC INITEGA,RESETEGA,EGAPAL
;******************************************************************
; INITEGA
; use the BIOS to set mode 10 on the EGA board
;
INITEGA PROC FAR
MOV AX,10H ; set to hi-res mode for EGA
INT 10h ; video
RET
INITEGA ENDP
RESETEGA PROC FAR
MOV AX,3 ; set to color character mode
INT 10h
RET
RESETEGA ENDP
;*******************************************************************
; PALETTE
; set one element of the EGA's palette select
;
; usage: egapal(reg,setting);
; reg (0-15) EGA's palette regs
; setting one byte, what to write there
;
EGAPAL PROC FAR
PUSH BP
MOV BP,SP
MOV BL,[BP+X] ; register #
MOV BH,[BP+X+2] ; value
MOV AX,01000H ; set palette element
INT 10h
POP BP
RET
EGAPAL ENDP
;*****************************************************************
; Puts an absolute pixel in the given color
;
; usage: egapoint(x,y,color,table)
; x,y = point location
; color = integer color number 0 to 255
; table = translation table of 256 bytes for XLAT
;
; BUG: will only write on black background, see egaline for
; clearing all four planes before writing to specified planes
; in that color
;
EGAPOINT PROC FAR
PUSH BP
MOV BP,SP
MOV AL,FLAG
OR AL,AL
JNZ NOSETUP
CALL SETUPG ; set up the mask regs
MOV FLAG,1 ; set the flag
NOSETUP:
MOV CX,[BP+X+8] ; get segment of transtable
MOV BX,[BP+X+6] ; get offset of transtable
MOV AX,[BP+X+4] ; get the color param = 3rd param
PUSH DS
MOV DS,CX ; set ds for the transtable
XLATB ; pick up translated color
POP DS
MOV DX,MAPMASK
OUT DX,AL ; set the mask to this color
MOV AX,0A000H
MOV ES,AX ; set for addressing
MOV AX,[BP+X+2] ; get y value 0 < y < 350
MOV BX,80
MUL BX ; multiply by 80 bytes/line
MOV DI,AX ; put in DI
MOV AX,[BP+X] ; get x value 0 < x < 640
MOV BX,AX ; save it
MOV CL,3
SHR AX,CL ; divide by 8
ADD DI,AX ; add it to di = byte offset
;
MOV CX,BX
AND CX,0007H ; save only the right three bits
MOV BL,80H ; here's a bit
SHR BL,CL ; move it over some
MOV DX,BITMASK ; set the mask
MOV AL,BL
OUT DX,AL ; send it
;
MOV AL,0FFH ; set all bits
MOV AH,ES:[DI] ; latch the bytes
STOSB ; place that bit on bit mask
POP BP
RET
EGAPOINT ENDP
SETUPG:
MOV DX,GCHIP
MOV AL,MODEREG
OUT DX,AL ; choose write mode 0
INC DX
MOV AL,0
OUT DX,AL ; clear mode reg to 0
DEC DX
MOV AL,DRREG ; clear function select = Replace
OUT DX,AL
INC DX
MOV AL,0h ; clear all
OUT DX,AL
;
MOV AL,MAPREG ; want to access mapreg from
MOV DX,SEQ ; sequencer set of regs
OUT DX,AL
MOV AL,BITREG ; want to access bitreg from
MOV DX,GCHIP ; graphics chip's regs
OUT DX,AL
MOV DX,BITMASK ; set up the bitmask = no masking
MOV AL,0FFH ; all bits on
OUT DX,AL
RET
;
;**************************************************************************
; EGALINE
;
; Write a stream of colors (represented by bytes) to the EGA, with
; a translation table for the EGA color map.
;
; Usage: egaline(x,y,colorbuffer,n,table)
; x,y = point to start line
; colorbuffer = 4 byte pointer to stream of
; n bytes.
; table = 4 byte pointer to translation table, 256 bytes
; long for XLAT instruction
EGALINE PROC FAR
PUSH BP
MOV BP,SP
MOV AL,FLAG
OR AL,AL
JNZ NOSETUP2
CALL SETUPG ; set up the mask regs
MOV FLAG,1 ; set the flag
NOSETUP2:
PUSH DS ; save our ds
MOV AX,[BP+X+6] ; get color table segment
MOV DS,AX ; use it now
MOV AX,0A000H
MOV ES,AX ; set for addressing
MOV AX,[BP+X+2] ; get y value 0 < y < 350
MOV BX,80
MUL BX ; multiply by 80 bytes/line
MOV DI,AX ; put in DI
MOV AX,[BP+X] ; get x value 0 < x < 640
MOV BX,AX ; save it
MOV CL,3
SHR AX,CL ; divide by 8
ADD DI,AX ; add it to di = byte offset
;
MOV CX,BX
AND CX,0007H ; save only the right three bits
MOV BL,080H ; here's a bit
ROR BL,CL ; move it over some
;
; At this point, bl has the bit mask for the first bit in the line
; Keep rotating it and set the mask for each bit to write
;
MOV CX,[BP+X+8] ; get count of bytes
MOV SI,[BP+X+4] ; where to get the new colors
MOV AH,BL ; keep bit rotation in ah
MOV DX,[BP+X+12] ; get segment of transtable
MOV BX,[BP+X+10] ; get offset of transtable
NEXTBIT:
LODSB ; get the next color to al
PUSH DS
MOV DS,DX ; set ds for the transtable
XLATB ; pick up translated color to al
PUSH AX ; need it later
MOV DX,BITMASK ; set the bitmask to current rotation
MOV AL,AH
OUT DX,AL ; send it
MOV DX,MAPMASK
MOV AL,0FH ; open all bit planes
OUT DX,AL ; send it
MOV AL,ES:[DI] ; latch the whole set of bytes
MOV BYTE PTR ES:[DI],0H ; clear all four planes to 0 at this bit
POP AX ; get real color back
OUT DX,AL ; send it to set the color planes
MOV DX,DS ; recover what was in dx
POP DS
;
MOV AL,0FFH ; set all bits
CMP AH,01 ; see if we are at end of byte
JZ INCSTORE
NONINC:
MOV ES:[DI],AL ; write the bit from bitmask
ROR AH,1 ; rotate me
LOOP NEXTBIT ; go back for next one
JMP LINEDONE
INCSTORE:
STOSB ; place that bit on bit mask and next byte
ROR AH,1 ; rotate me
LOOP NEXTBIT
LINEDONE:
POP DS
POP BP
RET
EGALINE ENDP
EGALINE2 PROC FAR
PUSH BP
MOV BP,SP
MOV AL,FLAG
OR AL,AL
JNZ NO2SETUP2
CALL SETUPG ; set up the mask regs
MOV FLAG,1 ; set the flag
NO2SETUP2:
PUSH DS ; save our ds
MOV AX,[BP+X+6] ; get color table segment
MOV DS,AX ; use it now
MOV AX,0A000H
MOV ES,AX ; set for addressing
MOV AX,[BP+X+2] ; get y value 0 < y < 350
MOV BX,80
MUL BX ; multiply by 80 bytes/line
MOV DI,AX ; put in DI
MOV AX,[BP+X] ; get x value 0 < x < 640
MOV BX,AX ; save it
MOV CL,3
SHR AX,CL ; divide by 8
ADD DI,AX ; add it to di = byte offset
;
MOV CX,BX
AND CX,0007H ; save only the right three bits
MOV BL,0C0H ; here's 2 bits
ROR BL,CL ; move it over some
;
; At this point, bl has the bit mask for the first bit in the line
; Keep rotating it and set the mask for each bit to write
;
MOV CX,[BP+X+8] ; get count of bytes
MOV SI,[BP+X+4] ; where to get the new colors
MOV AH,BL ; keep bit rotation in ah
MOV DX,[BP+X+12] ; get segment of transtable
MOV BX,[BP+X+10] ; get offset of transtable
NEXT2BIT:
LODSB ; get the next color to al
PUSH DS
MOV DS,DX ; set ds for the transtable
XLATB ; pick up translated color to al
PUSH AX ; need it later
MOV DX,BITMASK ; set the bitmask to current rotation
MOV AL,AH
OUT DX,AL ; send it
MOV DX,MAPMASK
MOV AL,0FH ; open all bit planes
OUT DX,AL ; send it
MOV AL,ES:[DI] ; latch the whole set of bytes
MOV BYTE PTR ES:[DI],0H ; clear all four planes to 0 at this bit
POP AX ; get real color back
OUT DX,AL ; send it to set the color planes
MOV DX,DS ; recover what was in dx
POP DS
;
MOV AL,0FFH ; set all bits
CMP AH,03 ; see if we are at end of byte
JZ INC2STORE
NON2INC:
MOV ES:[DI],AL ; write the bit from bitmask
ROR AH,1 ; rotate me
ROR AH,1 ; rotate me
LOOP NEXT2BIT ; go back for next one
JMP LINE2DONE
INC2STORE:
STOSB ; place that bit on bit mask and next byte
ROR AH,1 ; rotate me
ROR AH,1 ; again
LOOP NEXT2BIT
LINE2DONE:
POP DS
POP BP
RET
EGALINE2 ENDP
;**************************************************************************
; EGALINEA
;
; Write a stream of colors (represented by bytes) to the EGA, with
; a translation table for the EGA color map. This one includes arbitrary
; width expansion.
;
; Usage: egaline(x,y,colorbuffer,n,table,expansion)
; x,y = point to start line
; colorbuffer = 4 byte pointer to stream of
; n bytes.
; table = 4 byte pointer to translation table, 256 bytes
; long for XLAT instruction
; expansion = how much horizontal pixel expansion you want
;
EGALINEA PROC FAR
PUSH BP
MOV BP,SP
MOV AL,FLAG
OR AL,AL
JNZ NOSETA
CALL SETUPG ; set up the mask regs
MOV FLAG,1 ; set the flag
NOSETA:
PUSH DS ; save our ds
MOV AX,[BP+X+6] ; get color table segment
MOV DS,AX ; use it now
MOV AX,0A000H
MOV ES,AX ; set for addressing
MOV AX,[BP+X+2] ; get y value 0 < y < 350
MOV BX,80
MUL BX ; multiply by 80 bytes/line
MOV DI,AX ; put in DI
MOV AX,[BP+X] ; get x value 0 < x < 640
MOV BX,AX ; save it
MOV CL,3
SHR AX,CL ; divide by 8
ADD DI,AX ; add it to di = byte offset
;
MOV CX,BX
AND CX,0007H ; save only the right three bits
MOV BL,080H ; here's a bit
ROR BL,CL ; move it over some
;
; At this point, bl has the bit mask for the first bit in the line
; Keep rotating it and set the mask for each bit to write
;
MOV SI,[BP+X+4] ; where to get the new colors
MOV AH,BL ; keep bit rotation in ah
MOV DX,[BP+X+12] ; get segment of transtable
MOV BX,[BP+X+10] ; get offset of transtable
NEXTBYTE:
MOV CX,[BP+X+14] ; pixel expansion number
LODSB ; the next color to write
PUSH DS
MOV DS,DX ; get the seg for xlat from dx
XLATB ; color translation
MOV [BP+X],AL ; used as a local var for translated color
NEXTP:
MOV DX,BITMASK ; set the bitmask to current rotation
MOV AL,AH
OUT DX,AL ; send it
MOV DX,MAPMASK
MOV AL,0FH ; open all bit planes
OUT DX,AL ; send it
MOV AL,ES:[DI] ; latch the whole set of bytes
MOV BYTE PTR ES:[DI],0H ; clear all four planes to 0 at this bit
MOV AL,[BP+X] ; get real color from local var
OUT DX,AL ; send it to set the color planes
;
MOV AL,0FFH ; set all bits
MOV ES:[DI],AL ; set it!
CMP AH,01 ; see if we are at end of byte
JNZ SAMEBYTE
INC DI ; get us to the next destination byte
SAMEBYTE:
ROR AH,1 ; rotate me
LOOP NEXTP ; go back for next one
MOV DX,DS ; reset xlat segment into dx
POP DS ; get data input seg back
DEC WORD PTR [BP+X+8] ; number of data points
JNZ NEXTBYTE ; do another, if necessary
POP DS
POP BP
RET
EGALINEA ENDP
ENDPS
END