SecondReality/MAIN/VMODE.ASM
2017-09-24 01:45:36 +02:00

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