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

272 lines
4.3 KiB
NASM

;/****************************************************************************
;** MODULE: avidm2.asm
;** AUTHOR: Sami Tammilehto / Fennosoftec OY
;** DOCUMENT: ?
;** VERSION: 1.0
;** REFERENCE: -
;** REVISED BY: -
;*****************************************************************************
;**
;** Video driver for 640x400x256 (tweak)
;** included to avid.asm
;**
;****************************************************************************/
;======== public routines ========
m2_init PROC NEAR
mov ds:_vramseg,0a000h
call tweak640x400
mov dx,640/4
mov cx,400
call setrows
mov ds:vr[PSET],OFFSET m2_pset
mov ds:vr[CLEAR],OFFSET m2_clear
mov ds:vr[SWITCH],OFFSET m2_switch
mov ds:vr[WAITB],OFFSET m2_waitb
mov ds:_projclipx[CLIPMIN],0
mov ds:_projclipx[CLIPMAX],639
mov ds:_projclipy[CLIPMIN],0
mov ds:_projclipy[CLIPMAX],399
mov ds:_projclipz[CLIPMIN],512*1
mov ds:_projclipz[CLIPMAX],1000000000
mov ds:_projmulx,480*1
mov ds:_projmuly,400*1
mov ds:_projaddx,320
mov ds:_projaddy,200
mov ds:_projaspect,256
ret
m2_init ENDP
;======== public routines called through the vr[] pointers ========
;dx=X, bx=Y, ah=color
m2_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
m2_pset ENDP
m2_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
m2_waitb ENDP
ALIGN 2
tmptest dw 0
m2_clear PROC NEAR ;clear current page
inc cs:tmptest
push di
cmp ax,1
je @@sky
mov dx,3c4h
mov ax,0f02h
out dx,ax
mov cx,640*400/4/4
xor di,di
xor eax,eax
rep stosd
pop di
ret
@@sky: mov dx,3c4h
mov ax,0f02h
out dx,ax
mov cx,400
xor di,di
@@1: mov al,fs:[si]
cmp al,1
je @@colr
cmp al,2
je @@bitm
cmp al,4
je @@depth
jmp @@noth
@@depth:
push si
push ds
mov dx,3c4h
mov ax,0f02h
out dx,ax
mov ax,fs:[si+2]
xor dx,dx
mov bx,320
div bx
lds ax,fs:[si+4]
mov si,ax
add si,dx
zzz=0;
REPT 640/4/4
mov eax,ds:[si+zzz]
mov es:[di+zzz],eax
zzz=zzz+4
ENDM
pop ds
pop si
jmp @@noth
@@colr: mov al,fs:[si+2]
mov ah,al
mov bx,ax
shl eax,16
mov ax,bx
zzz=0;
REPT 640/4/4
mov es:[di+zzz],eax
zzz=zzz+4
ENDM
jmp @@noth
@@bitm: push cx
push ds
push si
@@bc: lds ax,fs:[si+4]
mov si,ax
mov ax,cs:tmptest
mov dx,ax
shr dx,2
add si,dx
and ax,3
shl ax,11
add si,ax
mov cx,4
mov ax,0102h
@@b1: push ax
mov dx,3c4h
out dx,ax
zzz=0
REPT 640/4/4
mov eax,ds:[si+zzz]
mov es:[di+zzz],eax
zzz=zzz+4
ENDM
add si,2048
cmp si,8192
jb @@b3
sub si,8192-1
@@b3: pop ax
shl ah,1
loop @@b1
pop si
pop ds
pop cx
mov dx,3c4h
mov ax,0f02h
out dx,ax
jmp @@noth
@@noth: add di,640/4
add si,8
loop @@1
pop di
ret
m2_clear ENDP
ALIGN 2
pagep dw 0
wpage dw 1,2,3
spage dw 3,1,2
m2_switch PROC NEAR
mov ax,0a000h
mov ds:_vramseg,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
m2_switch ENDP
;======== internal routines ========
;sets up 640x400x256 tweak
tweak640x400 PROC NEAR
mov ax,002fh
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
ret
tweak640x400 ENDP