409 lines
No EOL
7 KiB
NASM
409 lines
No EOL
7 KiB
NASM
include asm.inc
|
|
|
|
;publics:
|
|
;setvmode()
|
|
|
|
extrn _bgpic:far
|
|
|
|
text__vid SEGMENT para public 'CODE'
|
|
ASSUME cs:text__vid
|
|
|
|
.386
|
|
|
|
modes dw OFFSET v320x200x256
|
|
dw OFFSET v320x350x256
|
|
dw OFFSET v320x350x256
|
|
dw OFFSET v320x240x256
|
|
dw OFFSET vtseng640x400x256
|
|
|
|
PUBLIC setvmode
|
|
setvmode PROC FAR
|
|
;ax=mode => ds:si
|
|
mov bx,ax
|
|
shl bx,1
|
|
mov bx,cs:modes[bx]
|
|
mov cx,16
|
|
@@1: mov ax,cs:[bx]
|
|
mov ds:[si],ax
|
|
mov word ptr ds:[si+2],cs
|
|
add si,4
|
|
add bx,2
|
|
loop @@1
|
|
ret
|
|
setvmode ENDP
|
|
|
|
;video mode structure
|
|
v320x200x256 LABEL WORD
|
|
dw OFFSET init320x200 ;init routine
|
|
dw OFFSET switch320x200 ;page switcher
|
|
dw OFFSET clear64k ;clear all screens
|
|
dw OFFSET twpset
|
|
dw OFFSET twlineto
|
|
dw OFFSET twhline
|
|
dw OFFSET twhlinegroup
|
|
dw OFFSET twthlinegroup
|
|
dw OFFSET polygroup
|
|
dw OFFSET clearpage
|
|
dw OFFSET fwaitborder
|
|
v320x350x256 LABEL WORD
|
|
dw OFFSET init320x350 ;init routine
|
|
dw OFFSET switch320x350 ;page switcher
|
|
dw OFFSET clear64k ;clear all screens
|
|
dw OFFSET twpset
|
|
dw OFFSET twlineto
|
|
dw OFFSET twhline
|
|
dw OFFSET twhlinegroup
|
|
dw OFFSET twthlinegroup
|
|
dw OFFSET polygroup
|
|
dw OFFSET clearpage
|
|
dw OFFSET fwaitborder
|
|
v320x350x256unr LABEL WORD
|
|
dw OFFSET init320x350unr ;init routine
|
|
dw OFFSET switch320x350 ;page switcher
|
|
dw OFFSET clear64k ;clear all screens
|
|
dw OFFSET twpset
|
|
dw OFFSET twlineto
|
|
dw OFFSET twhline
|
|
dw OFFSET twhlinegroup
|
|
dw OFFSET twthlinegroup
|
|
dw OFFSET polygroup
|
|
dw OFFSET clearpage
|
|
dw OFFSET fwaitborder
|
|
v320x240x256 LABEL WORD
|
|
dw OFFSET init320x240 ;init routine
|
|
dw OFFSET switch320x240 ;page switcher
|
|
dw OFFSET clear64k ;clear all screens
|
|
dw OFFSET twpset
|
|
dw OFFSET twlineto
|
|
dw OFFSET twhline
|
|
dw OFFSET twhlinegroup
|
|
dw OFFSET twthlinegroup
|
|
dw OFFSET polygroup
|
|
dw OFFSET clearpage
|
|
dw OFFSET fwaitborder
|
|
vtseng640x400x256 LABEL WORD
|
|
dw OFFSET init640x400 ;init routine
|
|
dw OFFSET switch640x400 ;page switcher
|
|
dw OFFSET clear640x400 ;clear all screens
|
|
dw OFFSET twpset
|
|
dw OFFSET twlineto
|
|
dw OFFSET twhline
|
|
dw OFFSET twhlinegroup
|
|
dw OFFSET twthlinegroup
|
|
dw OFFSET polygroup
|
|
dw OFFSET clearpage
|
|
dw OFFSET fwaitborder
|
|
|
|
include vidmisc.asm
|
|
include vidinit.asm
|
|
include vidtwe.asm
|
|
include vidnrm.asm
|
|
include vidpoly.asm
|
|
|
|
;****************************************************************
|
|
|
|
setrows PROC NEAR
|
|
mov cs:rowsadd,dx
|
|
mov cs:truerowsadd,dx
|
|
xor ax,ax
|
|
mov bx,OFFSET rows
|
|
ain1: mov ds:[bx],ax
|
|
add ax,dx
|
|
add bx,2
|
|
loop ain1
|
|
ret
|
|
setrows ENDP
|
|
|
|
ALIGN 2
|
|
pagep dw 0
|
|
wpage dw 0,1,2
|
|
wpage2 dw 0,4,8
|
|
spage dw 2,0,1
|
|
|
|
init640x400 PROC FAR
|
|
LOADDS
|
|
mov ds:projxmul,256*2
|
|
mov ds:projymul,213*2
|
|
mov ds:projxadd,320
|
|
mov ds:projyadd,200
|
|
mov ds:projminz,128
|
|
mov ds:projminzshr,7
|
|
mov ds:wminx,0
|
|
mov ds:wminy,0
|
|
mov ds:wmaxx,639
|
|
mov ds:wmaxy,399
|
|
mov ds:framerate10,700 ;70 frames/sec
|
|
;
|
|
mov ax,11h ;640x480/mono
|
|
int 10h
|
|
call tweak640x400
|
|
mov cx,400
|
|
mov dx,160
|
|
call setrows
|
|
ret
|
|
init640x400 ENDP
|
|
|
|
switch640x400 PROC FAR
|
|
swipa2: mov ax,0a000h
|
|
mov cs:vram,ax
|
|
mov cs:truevram,ax
|
|
mov bx,cs:pagep
|
|
inc bx
|
|
cmp bx,3
|
|
jb sws1
|
|
xor bx,bx
|
|
sws1: mov cs:pagep,bx
|
|
shl bx,1
|
|
mov dx,3d4h
|
|
mov al,33h
|
|
mov ah,byte ptr cs:spage[bx]
|
|
out dx,ax ;spage
|
|
;set wpage
|
|
mov al,byte ptr cs:wpage[bx]
|
|
mov ah,al
|
|
rol ah,4
|
|
or al,ah
|
|
mov dx,3cdh
|
|
out dx,al
|
|
;page low offset
|
|
mov dx,3d4h
|
|
mov ax,000dh
|
|
out dx,ax
|
|
mov ax,000ch
|
|
out dx,ax
|
|
ret
|
|
switch640x400 ENDP
|
|
|
|
clear640x400 PROC FAR
|
|
call switch640x400
|
|
call clear64k
|
|
call switch640x400
|
|
call clear64k
|
|
call switch640x400
|
|
call clear64k
|
|
call switch640x400
|
|
call clear64k
|
|
ret
|
|
clear640x400 ENDP
|
|
|
|
;****************************************************************
|
|
|
|
ALIGN 2
|
|
t324v dw 0a5f0h
|
|
t324v1 dw 0aaa0h
|
|
t324v2 dw 0a140h
|
|
t324vout dw 01400h
|
|
t324vout1 dw 05f00h
|
|
t324vout2 dw 0aa00h
|
|
|
|
init320x200 PROC FAR
|
|
LOADDS
|
|
mov ds:projxmul,256
|
|
mov ds:projymul,213
|
|
mov ds:projxadd,160
|
|
mov ds:projyadd,130
|
|
mov ds:projminz,128
|
|
mov ds:projminzshr,7
|
|
mov ds:wminx,0
|
|
mov ds:wminy,0
|
|
mov ds:wmaxx,319
|
|
mov ds:wmaxy,199
|
|
mov ds:framerate10,700
|
|
;
|
|
; call tweak320x200
|
|
mov cx,200
|
|
mov dx,80
|
|
call setrows
|
|
ret
|
|
init320x200 ENDP
|
|
|
|
init320x240 PROC FAR
|
|
LOADDS
|
|
mov ds:projxmul,256
|
|
mov ds:projymul,256
|
|
mov ds:projxadd,160
|
|
mov ds:projyadd,120
|
|
mov ds:projminz,128
|
|
mov ds:projminzshr,7
|
|
mov ds:wminx,0
|
|
mov ds:wminy,0
|
|
mov ds:wmaxx,319
|
|
mov ds:wmaxy,239
|
|
mov ds:framerate10,610 ;60 frames/sec
|
|
;
|
|
call tweak320x200
|
|
LOADDS
|
|
mov si,OFFSET hseq1
|
|
call sethseq ;to 240 mode
|
|
mov cx,240
|
|
mov dx,80
|
|
call setrows
|
|
ret
|
|
init320x240 ENDP
|
|
|
|
switch320x240b PROC FAR
|
|
LOADDS
|
|
mov ax,cs:t324v
|
|
mov bx,cs:t324v1
|
|
mov cs:t324v,bx
|
|
mov cs:t324v1,ax
|
|
mov ds:vram,bx
|
|
mov ds:truevram,bx
|
|
mov bx,cs:t324vout1
|
|
mov cx,cs:t324vout2
|
|
mov cs:t324vout1,cx
|
|
mov cs:t324vout2,bx
|
|
mov dx,3d4h
|
|
mov al,0ch
|
|
mov ah,bh
|
|
out dx,ax
|
|
ret
|
|
switch320x240b ENDP
|
|
|
|
switch320x240 PROC FAR
|
|
switch320x200:
|
|
LOADDS
|
|
mov ax,cs:t324v
|
|
mov bx,cs:t324v1
|
|
mov cx,cs:t324v2
|
|
mov cs:t324v,bx
|
|
mov cs:t324v1,cx
|
|
mov cs:t324v2,ax
|
|
mov ds:vram,bx
|
|
mov ds:truevram,bx
|
|
mov ax,cs:t324vout
|
|
mov bx,cs:t324vout1
|
|
mov cx,cs:t324vout2
|
|
mov cs:t324vout,bx
|
|
mov cs:t324vout1,cx
|
|
mov cs:t324vout2,ax
|
|
mov dx,3d4h
|
|
mov al,0ch
|
|
mov ah,bh
|
|
out dx,ax
|
|
ret
|
|
switch320x240 ENDP
|
|
|
|
clear64k PROC FAR
|
|
cld
|
|
mov dx,3c4h
|
|
mov ax,0f02h
|
|
out dx,ax
|
|
mov ax,0a000h
|
|
mov es,ax
|
|
mov cx,32768
|
|
xor ax,ax
|
|
xor di,di
|
|
rep stosw
|
|
ret
|
|
clear64k ENDP
|
|
|
|
;****************************************************************
|
|
|
|
init320x350unr PROC FAR
|
|
LOADDS
|
|
mov ds:projxmul,256
|
|
mov ds:projymul,420
|
|
mov ds:projxadd,180
|
|
mov ds:projyadd,175
|
|
mov ds:projminz,128
|
|
mov ds:projminzshr,7
|
|
mov ds:wminx,0
|
|
mov ds:wminy,32
|
|
mov ds:wmaxx,359
|
|
mov ds:wmaxy,349-32
|
|
mov ds:framerate10,700 ;70 frames/sec
|
|
;
|
|
call tweak320x350
|
|
mov cx,350
|
|
mov dx,92
|
|
call setrows
|
|
ret
|
|
init320x350unr ENDP
|
|
|
|
init320x350 PROC FAR
|
|
LOADDS
|
|
mov ds:projxmul,256
|
|
mov ds:projymul,420
|
|
mov ds:projxadd,180
|
|
mov ds:projyadd,175
|
|
mov ds:projminz,128
|
|
mov ds:projminzshr,7
|
|
mov ds:wminx,0
|
|
mov ds:wminy,0
|
|
mov ds:wmaxx,359
|
|
mov ds:wmaxy,349
|
|
mov ds:framerate10,700 ;70 frames/sec
|
|
;
|
|
call tweak360x350
|
|
mov cx,350
|
|
mov dx,92
|
|
call setrows
|
|
ret
|
|
init320x350 ENDP
|
|
|
|
ALIGN 2
|
|
t365v dw 0a000h
|
|
t365v1 dw 0a800h
|
|
t365vo dw 08000h
|
|
t365vo1 dw 00000h
|
|
|
|
switch320x350 PROC FAR
|
|
LOADDS
|
|
mov ax,cs:t365v
|
|
xchg ax,cs:t365v1
|
|
mov cs:t365v,ax
|
|
mov ds:vram,ax
|
|
mov ds:truevram,ax
|
|
mov bx,cs:t365vo
|
|
xchg bx,cs:t365vo1
|
|
mov cs:t365vo,bx
|
|
mov dx,3d4h
|
|
mov al,0ch
|
|
mov ah,bh
|
|
out dx,ax
|
|
call waitborder
|
|
ret
|
|
switch320x350 ENDP
|
|
|
|
justret PROC FAR
|
|
ret
|
|
justret ENDP
|
|
|
|
clearpage PROC FAR
|
|
push ax
|
|
mov dx,3c4h
|
|
mov ax,0f02h
|
|
out dx,ax
|
|
mov es,ds:vram
|
|
mov di,ds:wminy
|
|
shl di,1
|
|
mov di,ds:rows[di]
|
|
mov ax,ds:wminx
|
|
mov dx,ds:wmaxx
|
|
sub dx,ax
|
|
shr ax,2
|
|
add di,ax
|
|
add dx,7
|
|
shr dx,4
|
|
mov cx,ds:wmaxy
|
|
sub cx,ds:wminy
|
|
inc cx
|
|
pop ax
|
|
push ax
|
|
shl eax,16
|
|
pop ax
|
|
@@1: push cx
|
|
push di
|
|
mov cx,dx
|
|
rep stosd
|
|
pop di
|
|
pop cx
|
|
add di,ds:rowsadd
|
|
loop @@1
|
|
ret
|
|
clearpage ENDP
|
|
|
|
text__vid ENDS
|
|
END
|
|
|