Cleaned up the VGA video mode source code.

This commit is contained in:
stainless
2001-09-08 21:50:42 +00:00
parent 24d81b18cc
commit 0d1e02c9bb
4 changed files with 154 additions and 531 deletions

View File

@@ -1039,7 +1039,7 @@ db ' ',0
; Left side starts with Video Mode 0
NEWSYM GUI16VID, db 0,0,0,0,1,0,1,0,1,0,1,0,1,0 ; 16-bit mode
NEWSYM GUINGVID, db 1,1,1,1,1,1,1,1,0,1,1,1,1,0 ; New Graphics Mode Available
NEWSYM GUISLVID, db 0,0,0,0,1,0,0,1,1,0,0,1,1,0 ; Scanlines
NEWSYM GUISLVID, db 0,0,1,0,1,0,0,1,1,0,0,1,1,0 ; Scanlines
NEWSYM GUIINVID, db 0,0,0,0,0,0,0,0,0,0,0,0,1,0 ; Interpolation
NEWSYM GUIEAVID, db 0,0,0,0,0,0,0,0,0,0,0,1,0,0 ; Eagle
NEWSYM GUIIEVID, db 0,0,0,0,0,0,0,0,0,0,0,1,1,0 ; (Interp | Eagle)

View File

@@ -21,19 +21,14 @@ EXTSYM AddSub256,InitVesa2,cbitmode,cvidmode,makepal
EXTSYM scanlines,selcA000,vesa2_bits,vesa2_bpos,vesa2_clbit
EXTSYM vesa2_gpos,vesa2_rpos,vesa2_usbit,vesa2_x,vesa2_y
EXTSYM vesa2selec,InitVesa12,videotroub
%ifdef __MSDOS__
EXTSYM cscopymodeq
EXTSYM cscopymodeq,cscopymodex
%endif
NEWSYM InitVidAsmStart
;NEWSYM clearfilter, dw 0
;NEWSYM res640, db 0
;NEWSYM res480, db 0
SECTION .bss
NEWSYM clearfilter, resw 1
@@ -44,7 +39,7 @@ NEWSYM res480, resb 1
SECTION .text
NEWSYM dosinitvideo2
jmp dosinitvideo.noaddsub
; jmp dosinitvideo.noaddsub
;*******************************************************
; InitVideo
@@ -81,63 +76,42 @@ NEWSYM dosinitvideo
je near .initvesa2640x480x16
ret
%include "dos/vga.inc"
;*******************************************************
; InitModeX Sets up 320x240 unchained mode
;*******************************************************
.initmodex
mov byte[cbitmode],0
mov ax,0013h
int 10h
%ifdef __MSDOS__
SetVGAMode .Mode320x240
call cscopymodex
%endif
call makepal
ret
mov dx,03C4h
mov ax,0604h
out dx,ax
mov dx,03D4h
mov ax,0E317h
out dx,ax
mov ax,0014h
out dx,ax
mov dx,03C4h
mov ax,0F02h
out dx,ax
;*******************************************************
; InitModeQ224 Sets up 256x224 chained mode
;*******************************************************
mov dx,03C2h
mov al,0E3h
out dx,al
mov dx,03D4h
mov ax,2C11h
out dx,ax
mov ax,0D06h
out dx,ax
mov ax,3E07h
out dx,ax
mov ax,0EA10h
out dx,ax
mov ax,0AC11h
out dx,ax
mov ax,0DF12h
out dx,ax
mov ax,0E715h
out dx,ax
mov ax,0616h
out dx,ax
.initmodeq224
%ifdef __MSDOS__
SetVGAMode .Mode256x224c
call cscopymodeq
%endif
call makepal
ret
mov dx,03C6h
mov al,0FFh
out dx,al
mov dx,03C4h
; select all 4 planes and clear
mov ax,0F02h
out dx,ax
push es
mov ax,[selcA000]
mov es,ax
xor edi,edi
mov ecx,65536/4
xor eax,eax
rep stosd
pop es
;*******************************************************
; InitModeQ240 Sets up 256x240 chained mode
;*******************************************************
.initmodeq240
%ifdef __MSDOS__
SetVGAMode .Mode256x240c
call cscopymodeq
%endif
call makepal
ret
@@ -146,481 +120,20 @@ NEWSYM dosinitvideo
;*******************************************************
.initmodeq
mov byte[cbitmode],0
cmp byte[AddSub256],1
jne .noaddsub
mov byte[cbitmode],1
.noaddsub
mov byte[vesa2_rpos],11 ; Red bit position 128,256,512,1024,2048
mov byte[vesa2_gpos],6 ; Green bit position 2^6 = 64
mov byte[vesa2_bpos],0 ; Blue bit position
mov word[vesa2_usbit],0020h ; Unused bit in proper bit location
mov word[vesa2_clbit],0F7DFh ; clear all bit 0's if AND is used
mov word[clearfilter],0F7DFh ; Filter out unnecessary bits
; cmp byte[scanlines],1
; je near .scanlines
mov ax,0013h
int 10h
mov dx,03D4h
mov al,11h
out dx,al
inc dx
in al,dx
and al,7Fh
mov ah,al
dec dx
mov al,11h
out dx,al
inc dx
mov al,ah
out dx,al
mov dx,03C2h
mov al,0E3h
out dx,al
mov dx,03D4h
mov ax,5F00h
out dx,ax
mov ax,3F01h
out dx,ax
mov ax,4002h
out dx,ax
mov ax,8203h
out dx,ax
mov ax,4A04h
out dx,ax
mov ax,9A05h
out dx,ax
mov ax,2306h
out dx,ax
mov ax,0B207h
out dx,ax
mov ax,0008h
out dx,ax
mov ax,6109h
out dx,ax
mov ax,0A10h
out dx,ax
mov ax,0AC11h
out dx,ax
mov ax,0FF12h
out dx,ax
mov ax,2013h
out dx,ax
mov ax,4014h
out dx,ax
mov ax,0715h
out dx,ax
mov ax,1A16h
out dx,ax
mov ax,0A317h
out dx,ax
mov dx,03C4h
mov ax,0101h
out dx,ax
mov ax,0E04h
out dx,ax
mov dx,03CEh
mov ax,4005h
out dx,ax
mov ax,0506h
out dx,ax
mov dx,03DAh
in al,dx
mov dx,03C0h
mov al,30h
out dx,al
mov al,41h
out dx,al
mov dx,03DAh
in al,dx
mov dx,03C0h
mov al,33h
out dx,al
mov al,0h
out dx,al
mov dx,03C6h
mov al,0FFh
out dx,al
cmp byte[cbitmode],1
je .nopal
call makepal
.nopal
; clear screen
push es
mov ax,[selcA000]
mov es,ax
xor edi,edi
mov ecx,256*64
xor eax,eax
rep stosd
pop es
ret
;.scanlines
; mov ax,0013h
; int 10h
; mov dx,03D4h
; mov al,11h
; out dx,al
;
; inc dx
; in al,dx
; and al,7Fh
; mov ah,al
; dec dx
; mov al,11h
; out dx,al
; inc dx
; mov al,ah
; out dx,al
;
; mov dx,03C2h
; mov al,0E3h
; out dx,al
; mov dx,03D4h
; mov ax,5F00h
; out dx,ax
; mov ax,3F01h
; out dx,ax
; mov ax,4002h
; out dx,ax
; mov ax,8203h
; out dx,ax
; mov ax,4A04h
; out dx,ax
; mov ax,9A05h
; out dx,ax
; mov ax,2306h
; out dx,ax
; mov ax,01D07h
; out dx,ax
; mov ax,0008h
; out dx,ax
; mov ax,6009h
; out dx,ax
; mov ax,0A10h
; out dx,ax
; mov ax,0AC11h
; out dx,ax
; mov ax,0FF12h
; out dx,ax
; mov ax,2013h
; out dx,ax
; mov ax,4014h
; out dx,ax
; mov ax,0715h
; out dx,ax
; mov ax,1A16h
; out dx,ax
; mov ax,0A317h
; out dx,ax
; mov dx,03C4h
; mov ax,0101h
; out dx,ax
; mov ax,0E04h
; out dx,ax
; mov dx,03CEh
; mov ax,4005h
; out dx,ax
; mov ax,0506h
; out dx,ax
;
; mov dx,03DAh
; in al,dx
; mov dx,03C0h
; mov al,30h
; out dx,al
; mov al,41h
; out dx,al
;
; mov dx,03DAh
; in al,dx
; mov dx,03C0h
; mov al,33h
; out dx,al
; mov al,0h
; out dx,al
;
; mov dx,03C6h
; mov al,0FFh
; out dx,al
; cmp byte[cbitmode],1
; je .nopalb
; call makepal
;.nopalb
; ; clear screen
; push es
; mov ax,[selcA000]
; mov es,ax
; xor edi,edi
; mov ecx,256*64
; xor eax,eax
; rep stosd
; pop es
; ret
;*******************************************************
; InitModeQ224 Sets up 256x224 chained mode
;*******************************************************
.initmodeq224
mov byte[cbitmode],0
mov ax,0013h
int 10h
; enable writes
mov dx,03d4h
mov ax,0011h
out dx,ax
inc dx
in ax,dx
and ax,007fh
push ax
mov dx,03d4h
mov ax,0011h
out dx,ax
inc dx
pop ax
out dx,ax
; tweak regs
mov dx,03c2h
mov ax,00e3h
out dx,ax
mov dx,03d4h
mov ax,1
out dx,ax
inc dx
mov ax,003fh
out dx,ax
mov dx,03d4h
mov ax,2
out dx,ax
inc dx
mov ax,0040h
out dx,ax
mov dx,03d4h
mov ax,4
out dx,ax
inc dx
mov ax,004ah
out dx,ax
mov dx,03d4h
mov ax,5
out dx,ax
inc dx
mov ax,009ah
out dx,ax
mov dx,03d4h
mov ax,6
out dx,ax
inc dx
mov ax,000bh
out dx,ax
mov dx,03d4h
mov ax,7
out dx,ax
inc dx
mov ax,003eh
out dx,ax
mov dx,03d4h
mov ax,9
out dx,ax
inc dx
mov ax,0061h
out dx,ax
mov dx,03d4h
mov ax,0010h
out dx,ax
inc dx
mov ax,00dah
out dx,ax
mov dx,03d4h
mov ax,0011h
out dx,ax
inc dx
mov ax,009ah
out dx,ax
mov dx,03d4h
mov ax,0012h
out dx,ax
inc dx
mov ax,00bfh
out dx,ax
mov dx,03d4h
mov ax,0013h
out dx,ax
inc dx
mov ax,0020h
out dx,ax
mov dx,03d4h
mov ax,0015h
out dx,ax
inc dx
mov ax,0007h
out dx,ax
mov dx,03d4h
mov ax,0016h
out dx,ax
inc dx
mov ax,001ah
out dx,ax
%ifdef __MSDOS__
cmp byte[scanlines],1
jnz .noscanlines
jmp .scanlines
.noscanlines
SetVGAMode .Mode256x256c
jmp .done
.scanlines
SetVGAMode .Mode256x256cs
jmp .done
.done
call cscopymodeq
%endif
call makepal
ret
;*******************************************************
; InitModeQ240 Sets up 256x240 chained mode
;*******************************************************
.initmodeq240
mov byte[cbitmode],0
mov ax,0013h
int 10h
; enable writes
mov dx,03d4h
mov ax,0011h
out dx,ax
inc dx
in ax,dx
and ax,007fh
push ax
mov dx,03d4h
mov ax,0011h
out dx,ax
inc dx
pop ax
out dx,ax
; tweak regs
mov dx,03c2h
mov ax,00e3h
out dx,ax
mov dx,03d4h
mov ax,1
out dx,ax
inc dx
mov ax,003fh
out dx,ax
mov dx,03d4h
mov ax,2
out dx,ax
inc dx
mov ax,0040h
out dx,ax
mov dx,03d4h
mov ax,4
out dx,ax
inc dx
mov ax,004ah
out dx,ax
mov dx,03d4h
mov ax,5
out dx,ax
inc dx
mov ax,009ah
out dx,ax
mov dx,03d4h
mov ax,6
out dx,ax
inc dx
mov ax,000dh
out dx,ax
mov dx,03d4h
mov ax,7
out dx,ax
inc dx
mov ax,003eh
out dx,ax
mov dx,03d4h
mov ax,9
out dx,ax
inc dx
mov ax,0041h
out dx,ax
mov dx,03d4h
mov ax,0010h
out dx,ax
inc dx
mov ax,00eah
out dx,ax
mov dx,03d4h
mov ax,0011h
out dx,ax
inc dx
mov ax,00ach
out dx,ax
mov dx,03d4h
mov ax,0012h
out dx,ax
inc dx
mov ax,00dfh
out dx,ax
mov dx,03d4h
mov ax,0013h
out dx,ax
inc dx
mov ax,0020h
out dx,ax
mov dx,03d4h
mov ax,0015h
out dx,ax
inc dx
mov ax,00e7h
out dx,ax
mov dx,03d4h
mov ax,0016h
out dx,ax
inc dx
mov ax,0006h
out dx,ax
%ifdef __MSDOS__
call cscopymodeq
%endif
call makepal
ret
;*******************************************************

110
zsnes/src/dos/vga.inc Normal file
View File

@@ -0,0 +1,110 @@
%ifdef __MSDOS__
%macro SetVGAMode 1
mov byte[cbitmode],0
mov ax,0013h
int 10h
mov dx,03d4h
mov ax,0011h
out dx,ax
inc edx
in al,dx
and al,07fh
mov ah,al
mov al,11h
dec edx
out dx,ax
xor ecx,ecx
jmp %%start
%%loop
add ecx,4
%%start
mov eax,[%1+ecx]
or eax,eax
jz %%end
cmp ax,03c0h
je %%3c0
cmp ax,03c2h
je %%3c2
cmp ax,03c3h
je %%3c2
jmp %%default
%%3c0
mov dx,03dah
in al,dx
mov dl,0c0h
shr eax,16
or al,20h
out dx,al
shr eax,8
out dx,al
jmp %%loop
%%3c2
mov dx,ax
rol eax,8
out dx,al
jmp %%loop
%%default
mov dx,ax
shr eax,16
out dx,ax
jmp %%loop
%%end
%endmacro
SECTION .data
.Mode256x224c
dw 03c2h,0e300h,03d4h,05f00h,03d4h,03f01h,03d4h,04002h,03d4h,08203h
dw 03d4h,04a04h,03d4h,09a05h,03d4h,00b06h,03d4h,03e07h,03d4h,00008h
dw 03d4h,06109h,03d4h,0da10h,03d4h,0ac11h,03d4h,0bf12h,03d4h,02013h
dw 03d4h,04014h,03d4h,00715h,03d4h,01a16h,03d4h,0a317h,03c4h,00101h
dw 03c4h,00e04h,03cEh,04005h,03ceh,00506h,03c0h,04110h,03c0h,00013h
dd 0
.Mode256x240c
dw 03c2h,0e300h,03d4h,05f00h,03d4h,03f01h,03d4h,04002h,03d4h,08203h
dw 03d4h,04a04h,03d4h,09a05h,03d4h,00d06h,03d4h,03e07h,03d4h,00008h
dw 03d4h,04109h,03d4h,0ea10h,03d4h,0ac11h,03d4h,0df12h,03d4h,02013h
dw 03d4h,04014h,03d4h,0e715h,03d4h,00616h,03d4h,0a317h,03c4h,00101h
dw 03c4h,00e04h,03ceh,04005h,03ceh,00506h,03c0h,04110h,03c0h,00013h
dd 0
.Mode256x256c
dw 03c2h,0e300h,03d4h,05f00h,03d4h,03f01h,03d4h,04002h,03d4h,08203h
dw 03d4h,04a04h,03d4h,09a05h,03d4h,02306h,03d4h,0b207h,03d4h,00008h
dw 03d4h,06109h,03d4h,00a10h,03d4h,0ac11h,03d4h,0FF12h,03d4h,02013h
dw 03d4h,04014h,03d4h,00715h,03d4h,01a16h,03d4h,0a317h,03c4h,00101h
dw 03c4h,00e04h,03ceh,04005h,03ceh,00506h,03c0h,04110h,03c0h,00013h
dd 0
.Mode256x256cs
dw 03c2h,0e300h,03d4h,05f00h,03d4h,03f01h,03d4h,04002h,03d4h,08203h
dw 03d4h,04a04h,03d4h,09a05h,03d4h,02306h,03d4h,01d07h,03d4h,00008h
dw 03d4h,06009h,03d4h,00a10h,03d4h,0ac11h,03d4h,0ff12h,03d4h,02013h
dw 03d4h,04014h,03d4h,00715h,03d4h,01a16h,03d4h,0a317h,03c4h,00101h
dw 03c4h,00e04h,03ceh,04005h,03cEh,00506h,03c0h,04110h,03c0h,00013h
dd 0
.Mode320x240
dw 03c2h,0e300h,03d4h,05f00h,03d4h,04f01h,03d4h,05002h,03d4h,08203h
dw 03d4h,05404h,03d4h,08005h,03d4h,00d06h,03d4h,03e07h,03d4h,00008h
dw 03d4h,04109h,03d4h,0ea10h,03d4h,0ac11h,03d4h,0df12h,03d4h,02813h
dw 03d4h,00014h,03d4h,0e715h,03d4h,00616h,03d4h,0e317h,03c4h,00101h
dw 03c4h,00604h,03ceh,04005h,03ceh,00506h,03c0h,04110h,03c0h,00013h
dd 0
SECTION .text
%endif

View File

@@ -59,7 +59,7 @@ MAINOBJ=cfgload.o endmem.o fixsin.o init.o ui.o vcache.o water.o
OBJS=${CHIPSOBJ} ${CPUOBJ} ${DOSOBJ} ${GUIOBJ} ${VIDEOBJ} ${PREOBJ} ${MAINOBJ} ${ZIPOBJ}
LIBS=-Lobj -lz -lm -lpng
CFLAGS=-O2 -g -Wall -D__MSDOS__
CFLAGS=-Id:/zsnes/zlib -O2 -g -Wall -D__MSDOS__
ASM=nasm
ASMFLAGS=-f coff -g -D__MSDOS__
CC=gcc
@@ -123,7 +123,7 @@ ${CPUDIR}/memory.o: ${CPUDIR}/memory.asm macros.mac
${CPUDIR}/dma.o: ${CPUDIR}/dma.asm macros.mac
${DOSDIR}/dosintrf.o: ${DOSDIR}/dosintrf.asm macros.mac
vcache.o:vcache.asm macros.mac
${DOSDIR}/initvid.o:${DOSDIR}/initvid.asm macros.mac
${DOSDIR}/initvid.o:${DOSDIR}/initvid.asm macros.mac ${DOSDIR}/vga.inc
${VIDEODIR}/makevid.o: ${VIDEODIR}/makevid.asm ${VIDEODIR}/vidmacro.mac\
macros.mac
${VIDEODIR}/makev16b.o: ${VIDEODIR}/makev16b.asm ${VIDEODIR}/vidmacro.mac\