SecondReality/VISU/AVIDM1.ASM
2017-09-24 01:45:36 +02:00

282 lines
5 KiB
NASM

;/****************************************************************************
;** MODULE: avidm1.asm
;** AUTHOR: Sami Tammilehto / Fennosoftec OY
;** DOCUMENT: ?
;** VERSION: 1.0
;** REFERENCE: -
;** REVISED BY: -
;*****************************************************************************
;**
;** Video driver for 320x200x256 (tweak)
;** included to avid.asm
;**
;****************************************************************************/
;======== public routines ========
m1_init PROC NEAR
mov ds:_vramseg,0a000h
call tweak320x200
mov dx,320/4
mov cx,200
call setrows
mov ds:vr[PSET],OFFSET m1_pset
mov ds:vr[CLEAR],OFFSET m1_clear
mov ds:vr[SWITCH],OFFSET m1_switch
mov ds:vr[WAITB],OFFSET m1_waitb
mov ds:_projclipz[CLIPMIN],256
mov ds:_projclipz[CLIPMAX],1000000000
;these affected by oversampling
mov ds:_projclipx[CLIPMIN],0
mov ds:_projclipx[CLIPMAX],319
mov ds:_projclipy[CLIPMIN],0
mov ds:_projclipy[CLIPMAX],199
mov ds:_projmulx,250
mov ds:_projmuly,220
mov ds:_projaddx,160
mov ds:_projaddy,100
mov ds:_projoversampleshr,0
;
mov ds:_projaspect,225
ret
m1_init ENDP
m11_init PROC NEAR
mov ds:_vramseg,0a000h
; call tweak320x200
mov dx,320/4
mov cx,200
call setrows
mov ds:vr[PSET],OFFSET m1_pset
mov ds:vr[CLEAR],OFFSET m1_clear
mov ds:vr[SWITCH],OFFSET m1_switch
mov ds:vr[WAITB],OFFSET m1_waitb
mov ds:_projclipz[CLIPMIN],256
mov ds:_projclipz[CLIPMAX],1000000000
;these affected by oversampling
mov ds:_projclipx[CLIPMIN],0
mov ds:_projclipx[CLIPMAX],319
mov ds:_projclipy[CLIPMIN],0
mov ds:_projclipy[CLIPMAX],199
mov ds:_projmulx,250
mov ds:_projmuly,220
mov ds:_projaddx,160
mov ds:_projaddy,100
mov ds:_projoversampleshr,0
;
mov ds:_projaspect,225
ret
m11_init ENDP
m1o_init PROC NEAR ;oversampling version
mov ds:_vramseg,0a000h
;call tweak320x200
mov dx,320/4
mov cx,200
call setrows
mov ds:vr[PSET],OFFSET m1_pset
mov ds:vr[CLEAR],OFFSET m1_clear
mov ds:vr[SWITCH],OFFSET m1_switch
mov ds:vr[WAITB],OFFSET m1_waitb
mov ds:_projclipz[CLIPMIN],256
mov ds:_projclipz[CLIPMAX],1000000000
;these affected by oversampling
mov ds:_projclipx[CLIPMIN],0
mov ds:_projclipx[CLIPMAX],319
mov ds:_projclipy[CLIPMIN],0
mov ds:_projclipy[CLIPMAX],199
mov ds:_projmulx,250
mov ds:_projmuly,220
mov ds:_projaddx,160
mov ds:_projaddy,100
mov ds:_projoversampleshr,0
;
mov ds:_projaspect,225
ret
m1o_init ENDP
;======== public routines called through the vr[] pointers ========
;dx=X, bx=Y, ah=color
m1_pset PROC NEAR
;requires ES=vram, OUT 3C4,2 [set by vidstart]
shl bx,1
mov bx,ds:_rows[bx]
mov cx,3
and cx,dx
sar dx,2
add bx,dx
mov al,1
shl al,cl
mov dx,3c5h
out dx,al
mov es:[bx],ah
ret
m1_pset ENDP
m1_waitb PROC NEAR
mov dx,3dah
@@1: in al,dx
test al,8
jnz @@1
@@2: in al,dx
test al,8
jz @@2
ret
m1_waitb ENDP
m1_clear PROC NEAR ;clear current page
push di
cmp ax,9
je @@bgd
cmp ax,2
je @@bgc
mov dx,3c4h
mov ax,0f02h
out dx,ax
xor di,di
xor eax,eax
mov cx,200
@@1: REPT 320/4/4
mov es:[di],eax
add di,4
ENDM
dec cx
jnz @@1
pop di
ret
@@bgd: mov dx,3c4h
mov ax,0f02h
out dx,ax
xor di,di
mov eax,0ffffffffh
mov cx,200
@@9: REPT 320/4/4
mov es:[di],eax
add di,4
ENDM
dec cx
jnz @@9
pop di
ret
@@bgc: zzpl=1
push ds
mov ax,fs
mov ds,ax
REPT 4
local l1
push di
mov dx,3c4h
mov ax,02h+100h*zzpl
out dx,ax
xor di,di
xor eax,eax
mov cx,200
l1: REPT 320/4/4
mov eax,ds:[si]
add si,4
mov es:[di],eax
add di,4
ENDM
loop l1
pop di
zzpl=zzpl*2
ENDM
pop ds
pop di
ret
m1_clear ENDP
m1_switch PROC NEAR
mov ax,ds:_vramseg
cmp ax,0a140h
jne @@1
;---[
mov ds:_vramseg,0a5f0h
mov ah,014h
;---]
jmp @@0
@@1: cmp ax,0a5f0h
jne @@2
;---[
mov ds:_vramseg,0aaa0h
mov ah,05fh
;---]
jmp @@0
@@2: ;---[
mov ds:_vramseg,0a140h
mov ah,0aah
;---]
@@0: mov dx,3d4h
mov al,0ch
out dx,ax
ret
m1_switch ENDP
;======== internal routines ========
;sets up 320x200x256 tweak
tweak320x200 PROC NEAR
mov ax,0013h
int 10h
mov dx,3c8h
mov al,0
out dx,al
inc dx
mov cx,768
@@1: out dx,al
loop @@1
mov dx,3c4h
mov al,4
out dx,al
inc dx
in al,dx
and al,not 08h
or al,04h
out dx,al
mov dx,3ceh
mov al,5
out dx,al
inc dx
in al,dx
and al,not 10h
out dx,al
dec dx
mov al,6
out dx,al
inc dx
in al,dx
and al,not 02h
out dx,al
mov dx,3d4h
mov al,9
inc dx
and al,not 5fh
or al,1
dec dx
mov al,14h
out dx,al
inc dx
in al,dx
and al,not 40h
out dx,al
dec dx
mov al,17h
out dx,al
inc dx
in al,dx
or al,40h
out dx,al
;clear vram
mov dx,3c4h
mov ax,0f02h
out dx,ax
mov cx,32768
mov ax,ds:_vramseg
mov es,ax
xor di,di
xor ax,ax
rep stosw
ret
tweak320x200 ENDP