339 lines
4.6 KiB
NASM
339 lines
4.6 KiB
NASM
|
|
ALIGN 16
|
|
mode0d db 256 dup(0)
|
|
mode0e db 256 dup(0)
|
|
mode13 db 256 dup(0)
|
|
vid_oldint dd 0
|
|
vid_curmode dw -1
|
|
|
|
vid_intti PROC NEAR
|
|
cmp ah,0fh
|
|
je @@f
|
|
cmp ah,0
|
|
je @@1
|
|
@@nn: jmp cs:vid_oldint
|
|
@@f: cmp cs:vid_curmode,-1
|
|
je @@nn
|
|
mov ax,cs:vid_curmode
|
|
mov ah,40
|
|
mov bh,0
|
|
iret
|
|
@@1: nop
|
|
; cmp al,13h
|
|
; je @@mode13
|
|
; cmp al,13h+80h
|
|
; je @@mode13noclr
|
|
; cmp al,0dh
|
|
; je @@mode0d
|
|
; cmp al,0dh+80h
|
|
; je @@mode0dnoclr
|
|
; cmp al,0eh
|
|
; je @@mode0e
|
|
cmp al,4
|
|
ja @@gn
|
|
cmp cs:notextmode,0
|
|
je @@gn
|
|
iret
|
|
@@gn: mov cs:vid_curmode,-1
|
|
jmp cs:vid_oldint
|
|
@@mode13:
|
|
mov cs:vid_curmode,13h
|
|
pusha
|
|
push ds
|
|
push es
|
|
call clearpalette
|
|
mov ax,cs
|
|
mov ds,ax
|
|
mov si,OFFSET mode13
|
|
call loadvmode
|
|
call clearvram
|
|
pop es
|
|
pop ds
|
|
popa
|
|
iret
|
|
@@mode13noclr:
|
|
mov cs:vid_curmode,13h
|
|
pusha
|
|
push ds
|
|
push es
|
|
;call clearpalette
|
|
mov ax,cs
|
|
mov ds,ax
|
|
mov si,OFFSET mode13
|
|
call loadvmode
|
|
pop es
|
|
pop ds
|
|
popa
|
|
iret
|
|
@@mode0d:
|
|
mov cs:vid_curmode,0dh
|
|
pusha
|
|
push ds
|
|
push es
|
|
call clearpalette
|
|
mov ax,cs
|
|
mov ds,ax
|
|
mov si,OFFSET mode0d
|
|
call loadvmode
|
|
call clearvram
|
|
pop es
|
|
pop ds
|
|
popa
|
|
iret
|
|
@@mode0dnoclr:
|
|
mov cs:vid_curmode,13h
|
|
pusha
|
|
push ds
|
|
push es
|
|
call clearpalette
|
|
mov ax,cs
|
|
mov ds,ax
|
|
mov si,OFFSET mode0d
|
|
call loadvmode
|
|
pop es
|
|
pop ds
|
|
popa
|
|
iret
|
|
@@mode0e:
|
|
mov cs:vid_curmode,0eh
|
|
pusha
|
|
push ds
|
|
push es
|
|
call clearpalette
|
|
mov ax,cs
|
|
mov ds,ax
|
|
mov si,OFFSET mode0e
|
|
call loadvmode
|
|
call clearvram
|
|
pop es
|
|
pop ds
|
|
popa
|
|
iret
|
|
vid_intti ENDP
|
|
|
|
vmode_deinit PROC NEAR
|
|
xor ax,ax
|
|
mov ds,ax
|
|
mov ax,word ptr cs:vid_oldint[0]
|
|
mov bx,word ptr cs:vid_oldint[2]
|
|
mov word ptr ds:[010h*4+0],ax
|
|
mov word ptr ds:[010h*4+2],bx
|
|
ret
|
|
vmode_deinit ENDP
|
|
|
|
vmode_init PROC NEAR
|
|
pusha
|
|
push ds
|
|
push es
|
|
push fs
|
|
push gs
|
|
|
|
IF 0
|
|
mov ax,0dh ;320x200x16
|
|
int 10h
|
|
mov ax,cs
|
|
mov ds,ax
|
|
mov si,OFFSET mode0d
|
|
call savevmode
|
|
mov ax,13h ;320x200x256
|
|
int 10h
|
|
mov ax,cs
|
|
mov ds,ax
|
|
mov si,OFFSET mode13
|
|
call savevmode
|
|
mov ax,0eh ;640x350x16
|
|
int 10h
|
|
mov ax,cs
|
|
mov ds,ax
|
|
mov si,OFFSET mode0e
|
|
call savevmode
|
|
mov ax,3
|
|
int 10h
|
|
ENDIF
|
|
|
|
xor ax,ax
|
|
mov ds,ax
|
|
mov ax,word ptr ds:[010h*4+0]
|
|
mov bx,word ptr ds:[010h*4+2]
|
|
mov word ptr cs:vid_oldint[0],ax
|
|
mov word ptr cs:vid_oldint[2],bx
|
|
mov word ptr ds:[010h*4+0],OFFSET vid_intti
|
|
mov word ptr ds:[010h*4+2],cs
|
|
|
|
pop gs
|
|
pop fs
|
|
pop es
|
|
pop ds
|
|
popa
|
|
ret
|
|
vmode_init ENDP
|
|
|
|
VSAL MACRO
|
|
mov ds:[si],al
|
|
inc si
|
|
ENDM
|
|
|
|
;vmode data to DS:SI
|
|
savevmode PROC NEAR
|
|
mov dx,3cch
|
|
in al,dx
|
|
VSAL
|
|
;Read Sequencer (3C4)
|
|
mov dx,3c4h
|
|
xor ah,ah
|
|
mov cx,04h+1
|
|
@@r1: mov al,ah
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
VSAL
|
|
dec dx
|
|
inc ah
|
|
loop @@r1
|
|
;Read CRTC (3D4)
|
|
mov dx,3d4h
|
|
xor ah,ah
|
|
mov cx,18h+1
|
|
@@r2: mov al,ah
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
VSAL
|
|
dec dx
|
|
inc ah
|
|
LOOP @@r2
|
|
;Read GFX controller (3CE)
|
|
mov dx,3ceh
|
|
xor ah,ah
|
|
mov cx,08h+1
|
|
@@r3: mov al,ah
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
VSAL
|
|
dec dx
|
|
inc ah
|
|
loop @@r3
|
|
;Read Attribute controller (3C0)
|
|
xor ah,ah
|
|
mov cx,14h+1
|
|
@@r4: mov dx,3dah
|
|
in al,dx
|
|
mov dx,3c0h
|
|
mov al,ah
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
VSAL
|
|
dec dx
|
|
out dx,al
|
|
mov al,20h
|
|
out dx,al
|
|
inc ah
|
|
loop @@r4
|
|
ret
|
|
savevmode ENDP
|
|
|
|
;vmode data from DS:SI
|
|
loadvmode PROC NEAR
|
|
mov dx,3dah
|
|
@@1: in al,dx
|
|
test al,8
|
|
jnz @@1
|
|
@@2: in al,dx
|
|
test al,8
|
|
jz @@2
|
|
;Syncronous reset
|
|
mov dx,3c4h
|
|
mov ax,0200h
|
|
out dx,ax
|
|
;Clear CRTC protection flag
|
|
mov dx,3d4h
|
|
mov al,011h
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
and al,not 128
|
|
out dx,al
|
|
;Set misc register
|
|
mov al,ds:[si]
|
|
inc si
|
|
mov dx,3c2h
|
|
out dx,al
|
|
;Set Sequencer (3C4)
|
|
mov dx,3c4h
|
|
xor al,al
|
|
mov cx,04h+1
|
|
@@w1: mov ah,ds:[si]
|
|
inc si
|
|
out dx,ax
|
|
inc al
|
|
loop @@w1
|
|
;Set CRTC (3D4)
|
|
mov dx,3d4h
|
|
xor al,al
|
|
mov cx,18h+1
|
|
@@w2: mov ah,ds:[si]
|
|
inc si
|
|
out dx,ax
|
|
inc al
|
|
loop @@w2
|
|
;Set GFX controller (3CE)
|
|
mov dx,3ceh
|
|
xor al,al
|
|
mov cx,08h+1
|
|
@@w3: mov ah,ds:[si]
|
|
inc si
|
|
out dx,ax
|
|
inc al
|
|
loop @@w3
|
|
;Set Attribute controller (3C0)
|
|
mov dx,3dah
|
|
in al,dx
|
|
mov dx,3c0h
|
|
xor ah,ah
|
|
mov cx,14h+1
|
|
@@w4: mov al,ah
|
|
out dx,al
|
|
mov al,ds:[si]
|
|
out dx,al
|
|
inc si
|
|
inc ah
|
|
loop @@w4
|
|
;Enable display, enable PEL mask
|
|
mov dx,3c0h
|
|
mov al,20h
|
|
out dx,al
|
|
mov dx,3c6h
|
|
mov al,0ffh
|
|
out dx,al
|
|
ret
|
|
loadvmode ENDP
|
|
|
|
clearvram PROC NEAR
|
|
push es
|
|
push di
|
|
mov dx,3c4h
|
|
mov ax,0f02h
|
|
out dx,ax
|
|
mov ax,0a000h
|
|
mov es,ax
|
|
xor di,di
|
|
xor eax,eax
|
|
mov cx,16384
|
|
rep stosd
|
|
pop di
|
|
pop es
|
|
ret
|
|
clearvram ENDP
|
|
|
|
clearpalette PROC NEAR
|
|
mov dx,3c8h
|
|
xor al,al
|
|
out dx,al
|
|
inc dx
|
|
mov cx,768
|
|
@@1: out dx,al
|
|
loop @@1
|
|
ret
|
|
clearpalette ENDP
|