home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GRIPS 2: Government Rast…rocessing Software & Data
/
GRIPS_2.cdr
/
dos
/
seq
/
src
/
pga.asm
< prev
next >
Wrap
Assembly Source File
|
1990-01-07
|
9KB
|
343 lines
;
; National Center for Supercomputing Applications, University of Illinois
; 153 Water Resources Building
; 605 E. Springfield Ave.
; Champaign, IL 61820
;
; (217)244-0072
;
; Code by Alex Wong Spring 1986
; C interface by Tim Krauskopf
;
TITLE PGA GRAPHICS RASTER DRIVER
NAME PGA
INCLUDE DOS.MAC
SETX
DSEG
;
otbase equ 6000h ;base location of output buffer
otwptr equ 6300h ;output write pointer
otrptr equ 6301h ;output read pointer
pgaoff equ 0c000h ;offset to DMA location
cboot equ 6306h ;cold restart flag location
wboot equ 6307h ;warm restart flag location
errf equ 6308h ;error enable flag
;
hreset db 43h,58h,20h,0dh ;CX--set to hex mode
resetf db 04h ;RESETF--reset flags
displa db 0d0h,00h ;DISPLAY--set display mode
lutint db 0ech ;LUTINT--initialize color LUT
db 02h ;state 2
clears db 0fh ;CLEARS--clear screen
db 00h ;black background
normal db 0d0h,01h
;
temp db 0 ;temporary storage
buf db 100 dup(0)
;
ENDDS
PSEG
PUBLIC INITPGA,RESTPGA,PGALINEA,MAPCOLOR,PGACLEAR
;**************************************************************************
; PGALINEA for the IBM PGA
;
; Write a stream of colors (represented by bytes) to the PGA
;
; Usage: pgalinea(x,y,colorbuffer,n,expansion)
; x,y = point to start line
; colorbuffer = 4 byte pointer to stream of
; n bytes.
; expansion = how much horizontal pixel expansion you want
;
PGALINEA PROC FAR
PUSH BP
MOV BP,SP
MOV AX,[BP+X+6] ; get color table segment
MOV ES,AX ; use it now
MOV BX,479
mov ax,[BP+X+2] ; get y value 0 < y < 480
sub bx,ax
jnb getx
xor bx,bx ; if less than 0, set = 0
getx:
MOV AX,[BP+X] ; get x value 0 < x < 640
;
MOV SI,[BP+X+4] ; where to get the new colors
MOV CX,[BP+X+8] ; number
MOV DX,[BP+X+10] ; expansion factor, must be >= 1
CALL PGALINE
POP BP
RET
PGALINEA ENDP
;
;
; PGA routines
;
; Alex Wong
; March 1986
;
;
; outspga
;
; output a sting of bytes to the PGA buffer
;
; INPUT: si => start of data
; cx = number of bytes to send
;
; OUTPUT: si => 1 byte past end of data
;
outspga proc near
push bx ;save regs
push di
push bp
push es
push dx
;
mov bx,pgaoff
mov es,bx ;es = offset to pga i/o
mov bp,otrptr ;bp => output read pointer
mov di,otwptr ;di => output write pointer
;
outs: mov bl,es:[di] ;write pointer
inc bl
cmp bl,es:[bp] ;compare write with read
je outs ;wait for buffer space if full
;
mov bl,[si] ;get the byte to output
;
push bp
mov bp,otbase
mov dh,0
mov dl,es:[di]
add bp,dx
mov es:[bp],bl ;output to PGA buffer
pop bp
;
inc si ;inc ptr to data
inc byte ptr es:[di] ;inc wptr MOD 255
loop outs
;
pop dx
pop es
pop bp
pop di
pop bx
ret ;--return
outspga endp
;
;
; setpga
;
; initializes the PGA display and sets default colors
;
;
;
initpga proc FAR
push bx
push cx
push si
;
push es
push di
mov bx,pgaoff
mov es,bx
mov di,wboot
mov byte ptr es:[di],1 ;set warm boot flag
mov di,errf
mov byte ptr es:[di],1 ;set error enable flag
pop di
pop es
;
mov cx,9000 ;wait for initializations
iwait: mov cx,cx ;delay loop
loop iwait
;
mov si,offset hreset
mov cx,11
call outspga ;clear screen, high function
;
pop si
pop cx
pop bx
ret ;--return
initpga endp
;
; restpga
;
; restores the PGA to the original (emulator) display
;
restpga proc FAR
mov si,offset normal
mov cx,2
call outspga ;set to emulator screen
ret ;--return
restpga endp
;
; pgaline
;
; output a line of pixels to the display
;
; INPUT: ax = starting X location
; bx = starting Y location
; cx = number of pixels to write
; dl = expansion factor
; es:si => sequence of pixel values in bytes, from 0-255
; (grey scale)
;
; OUTPUT: data sent to PGA
;
; note: image write command format: D9 lline hline
; lowx1 highx1
; lowx2 highx2
; data
;
pgaline proc near
push si
push di
push ax
push bx
push cx
push dx
;
push si
push cx
;
mov si,offset buf
mov byte ptr [si],0d9h ;image write command
inc si
mov [si],bx ;line number
inc si
inc si
mov [si],ax ;starting x
inc si
inc si
multi: add ax,cx ;ending x
dec dl
jnz multi ;add if multiple occurances
dec ax ;still 1 too many
mov [si],ax
mov si,offset buf ;reset to beginning
mov cx,7
call outspga ;send iwrite header
pop dx ;restore number of pixels
pop di ;di => pixel data
newpix: mov bl,es:[di] ;get a pixel
mov al,-1
;
same: inc di ;di => next pixel
inc al ;al = number of same pixels - 1
dec dx
cmp al,127
je ddone ;overflow
cmp dx,0
jz ddone ;end of data
cmp bl,es:[di] ;compare current pixel with next pixel
je same
;
ddone: mov si,offset buf
inc al ;al = number of pixels to show
pop cx ;get expansion factor
push cx ;put it back on the stack
mul cl ;ax = total number of pixels
dec ax ;want count-1
nxtblk: cmp ax,128
jl fits ;just do it once if it fits
mov byte ptr [si],127 ;block of 127+1 pixels
mov [si+1],bl ;pixel color
mov cx,2
call outspga ;output to buffer
sub ax,128
jmp nxtblk
fits: mov [si],al ;put count into buffer
mov [si+1],bl ;put pixel color into buffer
mov cx,2
call outspga ;output this block
cmp dx,0
jg newpix
;
pop dx
pop cx
pop bx
pop ax
pop di
pop si
;
ret ;--return
pgaline endp
;
;
; C interface to mapcolor
;
; usage: mapcolor(entry,r,g,b) all ints (0-15)
;
MAPCOLOR PROC FAR
PUSH BP
MOV BP,SP
MOV CL,[BP+X]
MOV CH,[BP+X+2]
MOV DL,[BP+X+4]
MOV DH,[BP+X+6]
CALL SETPAL
POP BP
RET
MAPCOLOR ENDP
; setpal
;
; sets a color in the look up table
;
; cl table entry number (0-255)
; ch red intensity (0-15)
; dl green intensity (0-15)
; dh blue intensity (0-15)
;
setpal proc near
push si
push cx
mov si,offset buf
mov byte ptr [si],0eeh ;LUT
mov [si+1],cl ;entry number
mov [si+2],ch ;red intensity
mov [si+3],dl ;green intensity
mov [si+4],dh ;blue intensity
mov cx,5 ;set count for outspga
call outspga ;output LUT command
pop cx
pop si
ret ;--return
setpal endp
PGACLEAR PROC FAR
; clears the screen in high function mode
;
push bp
mov bp,sp
push si
push cx
mov si,offset clears
mov cx,2
call outspga
pop cx
pop si
pop bp
ret ;return
PGACLEAR ENDP
ENDPS
END