home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 15
/
CD_ASCQ_15_070894.iso
/
news
/
sorcpak
/
fpoly256
/
gxsppt.asm
< prev
next >
Wrap
Assembly Source File
|
1991-12-17
|
5KB
|
333 lines
TITLE GSPPT - 320x200x16 mode support
NAME GSPPT
COMMENT $
Name: GXSPPT
Written and (c) by Dave Stampe 9/11/91
Not for commercial use, so get permission
before marketing code using this stuff!
For private PD use only.
$
.MODEL large
.CODE
;
; void vsync(); /* waits for vert. sync pulse */
;
PUBLIC _vsync
_vsync proc far
push bp
mov bp,sp
mov dx,03DAh
in al,dx ; test if 0
test al,8
je short @11@218
@11@122:
in al,dx
nop
test al,8 ; wait for 0
jne short @11@122
@11@218:
in al,dx
nop
test al,8 ; wait for 1
je short @11@218
pop bp
ret
_vsync endp
;
; void setup_hdwe(int mode); /* sets up VGA for line, poly draw */
; /* modes are: 0=PUT, 1=OR, */
; /* 2=AND, 3=XOR */
; /* only PUT for X-mode */
PUBLIC _setup_hdwe
_setup_hdwe proc far
push bp
mov bp,sp
mov dx,03CEH
mov ax,00008h ; all display copy bits
out dx,ax
mov dx,03c4h ; prepare plane mask reg. for access
mov ax,0f02h
out dx,ax
pop bp
ret
_setup_hdwe endp
;
; void reset_hdwe()
;
PUBLIC _reset_hdwe
_reset_hdwe proc far
push bp
mov bp,sp
mov dx,03CEH
mov ax,0FF08h ; all CPU data bits
out dx,ax
mov dx,03c4h ; prepare plane mask reg. for access
mov ax,0f02h
out dx,al
pop bp
ret
_reset_hdwe endp
;
; int clr_page(int page, int color); /* clear page to color */
;
; /* returns 0 if OK, 1 if bad page */
PUBLIC _clr_page
_clr_page proc far
push bp
mov bp,sp
dec sp
dec sp
push di
cld
mov cx,word ptr [bp+6]
cmp cx,3 ; check for valid page
jle short @14@74
mov ax,65535
jmp short @14@482
@14@74:
call far ptr _setup_hdwe ; reset to default VGA mode
cld
mov ax,0A000h
mov es,ax
mov bl,BYTE PTR [bp+8]
mov bh,0ffh ; figure what entry to read
mov al,es:[bx] ; read entry into latches
mov ax,word ptr [bp+6]
mov cx,16000
mul cx
mov di,ax
rep stosb
call far ptr _reset_hdwe
xor ax,ax
@14@482:
pop di
mov sp,bp
pop bp
ret
_clr_page endp
;
; int copy_page(int source, int dest)
;
; /* returns 0 if OK, 1 if bad page */
PUBLIC _copy_page
_copy_page proc far
push bp
mov bp,sp
sub sp,4
push si
push di
cmp word ptr [bp+6],3
jg short @15@74 ; check for valid page #'s
cmp word ptr [bp+8],3
jle short @15@98
@15@74:
mov ax,65535
jmp short @15@506
@15@98:
call far ptr _setup_hdwe ; write VGA state
push ds
cld
mov ax,0A000h
mov es,ax
mov ds,ax
mov cx,16000
mov ax,word ptr [bp+6] ; compute source address
mul cx
mov si,ax
mov ax,word ptr [bp+8] ; compute dest. address
mul cx
mov di,ax
rep movsb
call far ptr _reset_hdwe
pop ds
xor ax,ax
@15@506:
pop di
pop si
mov sp,bp
pop bp
ret
_copy_page endp
;
; void vga_reg(int reg) /* integer: lsby=reg(0=color), msby=value */
;
PUBLIC _vga_reg
_vga_reg proc far
push bp
mov bp,sp
mov dx,03CEH
mov ax,WORD PTR [bp+6]
out dx,ax
pop bp
ret
_vga_reg endp
;
; void load_color(int color) /* integer: loads latches with color */
;
PUBLIC _load_color
_load_color proc far
push bp
mov bp,sp
mov ax,0a000h
mov es,ax
mov bl,BYTE PTR [bp+6]
mov bh,0ffh ; figure what entry to read
mov al,es:[bx] ; read entry into latches
pop bp
ret
_load_color endp
;
; void _set_vmode(int mode) /* enters video mode thru BIOS */
; /* mode: clear if MSB not 0 */
; /* mode 14h = X-mode */
PUBLIC _set_vmode
_set_vmode proc far
push bp
mov bp,sp
mov ah,0
mov al,BYTE PTR [bp+6]
mov bl,al
and bl,07fh
cmp bl,14h
jz setxmode
int 10h
pop bp
ret
setxmode:
mov ah,0 ; set 256-color mode
mov al,13h
int 10h
mov dx,03c4h ; convert to X-mode addressing
mov ax,0604h ; chain mode off
out dx,ax
mov dx,03d4h
mov ax,0014h ; doubleword off
out dx,ax
mov ax,0E317h ; byte mode on
out dx,ax
call far ptr _reset_hdwe
mov ax,WORD PTR[bp+6]
test al,080h
jnz dontclear
mov ax,0f02h
out dx,ax ; clear all planes at once
mov ax,0a000h
mov es,ax
xor di,di
mov cx,0ffffh
xor ax,ax
rep stosb
mov di,0ff00h ; setup latch color table
mov cx,100h
xor al,al
ctloop: stosb
inc al
loop ctloop
dontclear:
pop bp
ret
_set_vmode endp
;
; void _set_vpage(int page) /* sets video page */
;
PUBLIC _set_vpage
_set_vpage proc far
push bp
mov bp,sp
mov ah,5
mov al,BYTE PTR [bp+6]
xor ah,ah
cmp al,4 ; check page #
jae badpage
mov bx,16000
mul bx
mov bh,ah
mov ah,al ; page # -> address
mov al,0dh
mov bl,0ch
mov dx,03d4h ; set CRTC address
out dx,ax
mov ax,bx
out dx,ax
badpage:
pop bp
ret
_set_vpage endp
end