1311 lines
25 KiB
NASM
1311 lines
25 KiB
NASM
;Copyright (C) 1997-2007 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
|
|
;
|
|
;http://www.zsnes.com
|
|
;http://sourceforge.net/projects/zsnes
|
|
;https://zsnes.bountysource.com
|
|
;
|
|
;This program is free software; you can redistribute it and/or
|
|
;modify it under the terms of the GNU General Public License
|
|
;version 2 as published by the Free Software Foundation.
|
|
;
|
|
;This program is distributed in the hope that it will be useful,
|
|
;but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
;GNU General Public License for more details.
|
|
;
|
|
;You should have received a copy of the GNU General Public License
|
|
;along with this program; if not, write to the Free Software
|
|
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
%include "macros.mac"
|
|
|
|
EXTSYM memtabler8,regptw,snesmap2,snesmmap,memtablew8,regptr,memtabler16
|
|
EXTSYM dmadata,hdmatype,nexthdma,resolutn,curhdma,curypos,hdmadata
|
|
EXTSYM hdmadelay,hdmarestart,nohdmaframe,INTEnab,HIRQLoc
|
|
|
|
;*******************************************************
|
|
; Transfer DMA Inits & Transfers DMA
|
|
;*******************************************************
|
|
; DMA transfer register
|
|
|
|
section .bss
|
|
NEWSYM AddrNoIncr, resb 1
|
|
section .text
|
|
|
|
%macro ExecSPCCycles 0
|
|
movzx ebx,word[esi+5]
|
|
inc bx
|
|
inc ebx
|
|
shr ebx,2
|
|
mov [soundcycleft],ebx
|
|
or ebx,ebx
|
|
jz .nocycles
|
|
xor ebx,ebx
|
|
xor ecx,ecx
|
|
call pexecs2
|
|
.nocycles
|
|
%endmacro
|
|
|
|
NEWSYM transdma
|
|
push eax
|
|
cmp word[esi+5],480h
|
|
jne .no
|
|
; mov byte[debstop3],1
|
|
.no
|
|
; ExecSPCCycles
|
|
|
|
mov al,[esi]
|
|
test al,80h
|
|
jnz near transdmappu2cpu
|
|
|
|
; set address increment value
|
|
mov dword[.addrincr],0
|
|
test al,00001000b
|
|
jnz .skipaddrincr
|
|
test al,00010000b
|
|
jnz .autodec
|
|
mov dword[.addrincr],1
|
|
jmp .skipaddrincr
|
|
.autodec
|
|
mov dword[.addrincr],0FFFFFFFFh
|
|
.skipaddrincr
|
|
|
|
mov byte[AddrNoIncr],0
|
|
cmp dword[.addrincr],0
|
|
jne .notzero
|
|
mov byte[AddrNoIncr],1
|
|
.notzero
|
|
; get address order to be written
|
|
xor ebx,ebx
|
|
and al,00000111b
|
|
cmp al,5
|
|
jne .notmode5dma
|
|
sub al,4
|
|
.notmode5dma
|
|
mov bl,al
|
|
shl bl,3
|
|
add ebx,.addrwrite
|
|
mov edi,ebx
|
|
|
|
; get pointer #1
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi]
|
|
shl ebx,2
|
|
add ebx,[regptw]
|
|
mov eax,[ebx]
|
|
mov [.regptra],eax
|
|
|
|
; get pointer #2
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi+2]
|
|
shl ebx,2
|
|
add ebx,[regptw]
|
|
mov eax,[ebx]
|
|
mov [.regptrb],eax
|
|
|
|
; get pointer #3
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi+4]
|
|
shl ebx,2
|
|
add ebx,[regptw]
|
|
mov eax,[ebx]
|
|
mov [.regptrc],eax
|
|
|
|
; get pointer #4
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi+6]
|
|
shl ebx,2
|
|
add ebx,[regptw]
|
|
mov eax,[ebx]
|
|
mov [.regptrd],eax
|
|
|
|
mov dx,[esi+5] ; Number of bytes to transfer
|
|
movzx ebx,byte[esi+4] ; Bank #
|
|
mov ecx,[esi+2] ; address offset #
|
|
and ecx,0FFFFh
|
|
mov [.curbank],bl
|
|
mov word[esi+5],0
|
|
|
|
mov ebx,[.curbank]
|
|
mov eax,snesmap2
|
|
test ecx,8000h
|
|
jz .nomap1
|
|
mov eax,snesmmap
|
|
.nomap1
|
|
and edx,0FFFFh
|
|
mov ebx,[eax+ebx*4]
|
|
|
|
push esi
|
|
mov esi,ebx
|
|
movzx ebx,byte[.curbank]
|
|
; do loop
|
|
cmp edx,0
|
|
jne .no0
|
|
mov edx,65536
|
|
.no0
|
|
mov ebx,[memtabler8+ebx*4]
|
|
mov [.readaddr],ebx
|
|
movzx ebx,byte[.curbank]
|
|
mov [.cebx],ebx
|
|
.againloop
|
|
cmp edx,4
|
|
jbe .deccheckloop
|
|
mov ebx,[.cebx]
|
|
call dword near [.readaddr]
|
|
add cx,[.addrincr]
|
|
call dword near [.regptra]
|
|
mov ebx,[.cebx]
|
|
call dword near [.readaddr]
|
|
add cx,[.addrincr]
|
|
call dword near [.regptrb]
|
|
mov ebx,[.cebx]
|
|
call dword near [.readaddr]
|
|
add cx,[.addrincr]
|
|
call dword near [.regptrc]
|
|
mov ebx,[.cebx]
|
|
call dword near [.readaddr]
|
|
add cx,[.addrincr]
|
|
call dword near [.regptrd]
|
|
sub edx,4
|
|
jmp .againloop
|
|
.deccheckloop
|
|
mov ebx,[.cebx]
|
|
call dword near [.readaddr]
|
|
add cx,[.addrincr]
|
|
call dword near [.regptra]
|
|
dec edx
|
|
jz .findma
|
|
mov ebx,[.cebx]
|
|
call dword near [.readaddr]
|
|
add cx,[.addrincr]
|
|
call dword near [.regptrb]
|
|
dec edx
|
|
jz .findma
|
|
mov ebx,[.cebx]
|
|
call dword near [.readaddr]
|
|
add cx,[.addrincr]
|
|
call dword near [.regptrc]
|
|
dec edx
|
|
jz .findma
|
|
mov ebx,[.cebx]
|
|
call dword near [.readaddr]
|
|
add cx,[.addrincr]
|
|
call dword near [.regptrd]
|
|
.findma
|
|
pop esi
|
|
mov [esi+2],cx
|
|
pop eax
|
|
mov byte[AddrNoIncr],0
|
|
ret
|
|
|
|
section .data
|
|
ALIGN32
|
|
|
|
.curbank dd 0
|
|
.addrincr dd 0
|
|
.addrwrite dw 0,0,0,0, 0,1,0,1, 0,0,0,0, 0,0,1,1, 0,1,2,3, 0,1,2,3, 0,1,2,3
|
|
dw 0,1,2,3
|
|
; pointer address of registers
|
|
.regptra dd 0
|
|
.regptrb dd 0
|
|
.regptrc dd 0
|
|
.regptrd dd 0
|
|
.readaddr dd 0
|
|
.cebx dd 0
|
|
section .text
|
|
|
|
NEWSYM transdmappu2cpu
|
|
; set address increment value
|
|
mov dword[.addrincr],0
|
|
test al,00001000b
|
|
jnz .skipaddrincr
|
|
test al,00010000b
|
|
jnz .autodec
|
|
mov dword[.addrincr],1
|
|
jmp .skipaddrincr
|
|
.autodec
|
|
mov dword[.addrincr],0FFFFFFFFh
|
|
.skipaddrincr
|
|
|
|
; get address order to be written
|
|
and al,00000111b
|
|
movzx ebx,al
|
|
shl bl,3
|
|
add ebx,.addrwrite
|
|
mov edi,ebx
|
|
|
|
; get pointer #1
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi]
|
|
shl ebx,2
|
|
add ebx,[regptr]
|
|
mov eax,[ebx]
|
|
mov [.regptra],eax
|
|
|
|
; get pointer #2
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi+2]
|
|
shl ebx,2
|
|
add ebx,[regptr]
|
|
mov eax,[ebx]
|
|
mov [.regptrb],eax
|
|
|
|
; get pointer #3
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi+4]
|
|
shl ebx,2
|
|
add ebx,[regptr]
|
|
mov eax,[ebx]
|
|
mov [.regptrc],eax
|
|
|
|
; get pointer #4
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi+6]
|
|
shl ebx,2
|
|
add ebx,[regptr]
|
|
mov eax,[ebx]
|
|
mov [.regptrd],eax
|
|
|
|
mov dx,[esi+5] ; Number of bytes to transfer
|
|
movzx ebx,byte[esi+4] ; Bank #
|
|
mov ecx,[esi+2] ; address offset #
|
|
and ecx,0FFFFh
|
|
mov [.curbank],bl
|
|
mov word[esi+5],0
|
|
|
|
mov ebx,[.curbank]
|
|
mov eax,snesmap2
|
|
test ecx,8000h
|
|
jz .nomap1
|
|
mov eax,snesmmap
|
|
.nomap1
|
|
and edx,0FFFFh
|
|
mov ebx,[eax+ebx*4]
|
|
|
|
push esi
|
|
mov esi,ebx
|
|
movzx ebx,byte[.curbank]
|
|
; do loop
|
|
cmp edx,0
|
|
jne .no0
|
|
mov edx,65536
|
|
.no0
|
|
mov ebx,[memtablew8+ebx*4]
|
|
mov [.writeaddr],ebx
|
|
movzx ebx,byte[.curbank]
|
|
mov [.cebx],ebx
|
|
.againloop
|
|
cmp edx,4
|
|
jbe .deccheckloop
|
|
call dword near [.regptra]
|
|
mov ebx,[.cebx]
|
|
call dword near [.writeaddr]
|
|
add cx,[.addrincr]
|
|
call dword near [.regptrb]
|
|
mov ebx,[.cebx]
|
|
call dword near [.writeaddr]
|
|
add cx,[.addrincr]
|
|
call dword near [.regptrc]
|
|
mov ebx,[.cebx]
|
|
call dword near [.writeaddr]
|
|
add cx,[.addrincr]
|
|
call dword near [.regptrd]
|
|
mov ebx,[.cebx]
|
|
call dword near [.writeaddr]
|
|
add cx,[.addrincr]
|
|
sub edx,4
|
|
jmp .againloop
|
|
.deccheckloop
|
|
call dword near [.regptra]
|
|
mov ebx,[.cebx]
|
|
call dword near [.writeaddr]
|
|
add cx,[.addrincr]
|
|
dec edx
|
|
jz .findma
|
|
call dword near [.regptrb]
|
|
mov ebx,[.cebx]
|
|
call dword near [.writeaddr]
|
|
add cx,[.addrincr]
|
|
dec edx
|
|
jz .findma
|
|
call dword near [.regptrc]
|
|
mov ebx,[.cebx]
|
|
call dword near [.writeaddr]
|
|
add cx,[.addrincr]
|
|
dec edx
|
|
jz .findma
|
|
call dword near [.regptrd]
|
|
mov ebx,[.cebx]
|
|
call dword near [.writeaddr]
|
|
add cx,[.addrincr]
|
|
.findma
|
|
pop esi
|
|
mov [esi+2],cx
|
|
pop eax
|
|
ret
|
|
|
|
section .data
|
|
ALIGN32
|
|
|
|
.curbank dd 0
|
|
.addrincr dd 0
|
|
.addrwrite dw 0,0,0,0, 0,1,0,1, 0,0,0,0, 0,0,1,1, 0,1,2,3, 0,1,2,3, 0,1,2,3
|
|
dw 0,1,2,3
|
|
; pointer address of registers
|
|
.regptra dd 0
|
|
.regptrb dd 0
|
|
.regptrc dd 0
|
|
.regptrd dd 0
|
|
.writeaddr dd 0
|
|
.cebx dd 0
|
|
section .text
|
|
|
|
%macro TestDMA 0
|
|
%endmacro
|
|
|
|
; DMA enable register
|
|
; use dmadata for input on dma
|
|
NEWSYM reg420Bw
|
|
push eax
|
|
push esi
|
|
push edi
|
|
push ecx
|
|
push edx
|
|
mov esi,dmadata
|
|
test al,01h
|
|
jz .notransa
|
|
TestDMA
|
|
call transdma
|
|
.notransa
|
|
add esi,16
|
|
test al,02h
|
|
jz .notransb
|
|
TestDMA
|
|
call transdma
|
|
.notransb
|
|
add esi,16
|
|
test al,04h
|
|
jz .notransc
|
|
TestDMA
|
|
call transdma
|
|
.notransc
|
|
add esi,16
|
|
test al,08h
|
|
jz .notransd
|
|
TestDMA
|
|
call transdma
|
|
.notransd
|
|
add esi,16
|
|
test al,10h
|
|
jz .notranse
|
|
TestDMA
|
|
call transdma
|
|
.notranse
|
|
add esi,16
|
|
test al,20h
|
|
jz .notransf
|
|
TestDMA
|
|
call transdma
|
|
.notransf
|
|
add esi,16
|
|
test al,40h
|
|
jz .notransg
|
|
TestDMA
|
|
call transdma
|
|
.notransg
|
|
add esi,16
|
|
test al,80h
|
|
jz .notransh
|
|
TestDMA
|
|
call transdma
|
|
.notransh
|
|
pop edx
|
|
pop ecx
|
|
pop edi
|
|
pop esi
|
|
pop eax
|
|
ret
|
|
|
|
;*******************************************************
|
|
; HDMA Settings
|
|
;*******************************************************
|
|
NEWSYM setuphdma
|
|
push eax
|
|
|
|
; transfer old address to new address
|
|
mov ax,[esi+2]
|
|
mov [esi+8],ax
|
|
mov [edx+17],ax
|
|
; get address order to be written
|
|
xor ebx,ebx
|
|
xor ecx,ecx
|
|
movzx eax,byte[esi]
|
|
and al,00000111b
|
|
cmp al,5
|
|
jb .notmode567dma
|
|
sub al,4
|
|
.notmode567dma
|
|
mov ah,[.addrnumt+eax]
|
|
mov [edx+16],ah
|
|
mov bl,al
|
|
shl bl,3
|
|
add ebx,.addrwrite
|
|
mov edi,ebx
|
|
|
|
; get pointer #1
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi]
|
|
cmp bx,2118h
|
|
je .notnormalhdma1
|
|
cmp bx,2119h
|
|
je .notnormalhdma1
|
|
jmp .normalhdma1
|
|
.notnormalhdma1
|
|
mov bx,2200h ; bad hack _Demo_
|
|
.normalhdma1
|
|
shl ebx,2
|
|
add ebx,[regptw]
|
|
mov eax,[ebx]
|
|
mov [edx],eax
|
|
|
|
; get pointer #2
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi+2]
|
|
cmp bx,2118h
|
|
je .notnormalhdma2
|
|
cmp bx,2119h
|
|
je .notnormalhdma2
|
|
jmp .normalhdma2
|
|
.notnormalhdma2
|
|
mov bx,2200h ; bad hack _Demo_
|
|
.normalhdma2
|
|
shl ebx,2
|
|
add ebx,[regptw]
|
|
mov eax,[ebx]
|
|
mov [edx+4],eax
|
|
|
|
; get pointer #3
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi+4]
|
|
cmp bx,2118h
|
|
je .notnormalhdma3
|
|
cmp bx,2119h
|
|
je .notnormalhdma3
|
|
jmp .normalhdma3
|
|
.notnormalhdma3
|
|
mov bx,2200h ; bad hack _Demo_
|
|
.normalhdma3
|
|
shl ebx,2
|
|
add ebx,[regptw]
|
|
mov eax,[ebx]
|
|
mov [edx+8],eax
|
|
|
|
; get pointer #4
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi+6]
|
|
cmp bx,2118h
|
|
je .notnormalhdma4
|
|
cmp bx,2119h
|
|
je .notnormalhdma4
|
|
jmp .normalhdma4
|
|
.notnormalhdma4
|
|
mov bx,2200h ; bad hack _Demo_
|
|
.normalhdma4
|
|
shl ebx,2
|
|
add ebx,[regptw]
|
|
mov eax,[ebx]
|
|
mov [edx+12],eax
|
|
|
|
xor ebx,ebx
|
|
mov byte[esi+10],0
|
|
pop eax
|
|
or [hdmatype],ah
|
|
ret
|
|
|
|
section .data
|
|
.addrwrite dw 0,0,0,0, 0,1,0,1, 0,0,0,0, 0,0,1,1, 0,1,2,3, 0,1,2,3, 0,1,2,3
|
|
dw 0,1,2,3
|
|
.addrnumt db 1,2,2,4,4,4,4,4
|
|
section .text
|
|
|
|
NEWSYM setuphdmars
|
|
push eax
|
|
|
|
; get address order to be written
|
|
xor ebx,ebx
|
|
xor ecx,ecx
|
|
movzx eax,byte[esi]
|
|
and al,00000111b
|
|
cmp al,5
|
|
jb .notmode567dma
|
|
sub al,4
|
|
.notmode567dma
|
|
mov ah,[.addrnumt+eax]
|
|
mov [edx+16],ah
|
|
mov bl,al
|
|
shl bl,3
|
|
add ebx,.addrwrite
|
|
mov edi,ebx
|
|
|
|
; get pointer #1
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi]
|
|
cmp bx,2118h
|
|
je .notnormalhdma1
|
|
cmp bx,2119h
|
|
je .notnormalhdma1
|
|
jmp .normalhdma1
|
|
.notnormalhdma1
|
|
mov bx,2200h ; bad hack _Demo_
|
|
.normalhdma1
|
|
shl ebx,2
|
|
add ebx,[regptw]
|
|
mov eax,[ebx]
|
|
mov [edx],eax
|
|
|
|
; get pointer #2
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi+2]
|
|
cmp bx,2118h
|
|
je .notnormalhdma2
|
|
cmp bx,2119h
|
|
je .notnormalhdma2
|
|
jmp .normalhdma2
|
|
.notnormalhdma2
|
|
mov bx,2200h ; bad hack _Demo_
|
|
.normalhdma2
|
|
shl ebx,2
|
|
add ebx,[regptw]
|
|
mov eax,[ebx]
|
|
mov [edx+4],eax
|
|
|
|
; get pointer #3
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi+4]
|
|
cmp bx,2118h
|
|
je .notnormalhdma3
|
|
cmp bx,2119h
|
|
je .notnormalhdma3
|
|
jmp .normalhdma3
|
|
.notnormalhdma3
|
|
mov bx,2200h ; bad hack _Demo_
|
|
.normalhdma3
|
|
shl ebx,2
|
|
add ebx,[regptw]
|
|
mov eax,[ebx]
|
|
mov [edx+8],eax
|
|
|
|
; get pointer #4
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi+6]
|
|
cmp bx,2118h
|
|
je .notnormalhdma4
|
|
cmp bx,2119h
|
|
je .notnormalhdma4
|
|
jmp .normalhdma4
|
|
.notnormalhdma4
|
|
mov bx,2200h ; bad hack _Demo_
|
|
.normalhdma4
|
|
shl ebx,2
|
|
add ebx,[regptw]
|
|
mov eax,[ebx]
|
|
mov [edx+12],eax
|
|
|
|
xor ebx,ebx
|
|
pop eax
|
|
ret
|
|
|
|
section .data
|
|
.addrwrite dw 0,0,0,0, 0,1,0,1, 0,0,0,0, 0,0,1,1, 0,1,2,3, 0,1,2,3, 0,1,2,3
|
|
dw 0,1,2,3
|
|
.addrnumt db 1,2,2,4,4,4,4,4
|
|
section .text
|
|
|
|
NEWSYM setuphdma2
|
|
push eax
|
|
|
|
cmp byte[esi+10],0
|
|
je near .nohdma
|
|
|
|
; transfer old address to new address
|
|
mov ax,[esi+8]
|
|
mov [edx+17],ax
|
|
; get address order to be written
|
|
xor ebx,ebx
|
|
xor ecx,ecx
|
|
movzx eax,byte[esi]
|
|
and al,00000111b
|
|
cmp al,5
|
|
jb .notmode567dma
|
|
sub al,4
|
|
.notmode567dma
|
|
mov ah,[.addrnumt+eax]
|
|
mov [edx+16],ah
|
|
mov bl,al
|
|
shl bl,3
|
|
add ebx,.addrwrite
|
|
mov edi,ebx
|
|
|
|
; get pointer #1
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi]
|
|
cmp bx,2118h
|
|
je .notnormalhdma1
|
|
cmp bx,2119h
|
|
je .notnormalhdma1
|
|
jmp .normalhdma1
|
|
.notnormalhdma1
|
|
mov bx,2200h ; bad hack _Demo_
|
|
.normalhdma1
|
|
shl ebx,2
|
|
add ebx,[regptw]
|
|
mov eax,[ebx]
|
|
mov [edx],eax
|
|
|
|
; get pointer #2
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi+2]
|
|
cmp bx,2118h
|
|
je .notnormalhdma2
|
|
cmp bx,2119h
|
|
je .notnormalhdma2
|
|
jmp .normalhdma2
|
|
.notnormalhdma2
|
|
mov bx,2200h ; bad hack _Demo_
|
|
.normalhdma2
|
|
shl ebx,2
|
|
add ebx,[regptw]
|
|
mov eax,[ebx]
|
|
mov [edx+4],eax
|
|
|
|
; get pointer #3
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi+4]
|
|
cmp bx,2118h
|
|
je .notnormalhdma3
|
|
cmp bx,2119h
|
|
je .notnormalhdma3
|
|
jmp .normalhdma3
|
|
.notnormalhdma3
|
|
mov bx,2200h ; bad hack _Demo_
|
|
.normalhdma3
|
|
shl ebx,2
|
|
add ebx,[regptw]
|
|
mov eax,[ebx]
|
|
mov [edx+8],eax
|
|
|
|
; get pointer #4
|
|
movzx ebx,byte[esi+1] ; PPU memory - 21xx
|
|
mov bh,21h
|
|
add bx,[edi+6]
|
|
cmp bx,2118h
|
|
je .notnormalhdma4
|
|
cmp bx,2119h
|
|
je .notnormalhdma4
|
|
jmp .normalhdma4
|
|
.notnormalhdma4
|
|
mov bx,2200h ; bad hack _Demo_
|
|
.normalhdma4
|
|
shl ebx,2
|
|
add ebx,[regptw]
|
|
mov eax,[ebx]
|
|
mov [edx+12],eax
|
|
|
|
xor ebx,ebx
|
|
pop eax
|
|
and [hdmatype],ah
|
|
ret
|
|
.nohdma
|
|
pop eax
|
|
and [nexthdma],ah
|
|
ret
|
|
|
|
section .data
|
|
.addrwrite dw 0,0,0,0, 0,1,0,1, 0,0,0,0, 0,0,1,1, 0,1,2,3, 0,1,2,3, 0,1,2,3
|
|
dw 0,1,2,3
|
|
.addrnumt db 1,2,2,4,4,4,4,4
|
|
|
|
section .text
|
|
|
|
NEWSYM reg420Cw
|
|
mov [curhdma],al
|
|
mov bx,[resolutn]
|
|
cmp word[curypos],bx
|
|
jae near .nohdma
|
|
mov al,[curhdma]
|
|
mov bx,[HIRQLoc]
|
|
test byte[INTEnab],10h
|
|
jz .skipcheck
|
|
cmp bx,80
|
|
jb near .nohdma
|
|
cmp bx,176
|
|
ja near .nohdma
|
|
.skipcheck
|
|
mov bl,[nexthdma]
|
|
and bl,al
|
|
jnz near .nohdma
|
|
mov [nexthdma],al
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
push ecx
|
|
push edx
|
|
mov esi,dmadata
|
|
mov edx,hdmadata
|
|
mov ah,01h
|
|
test al,01h
|
|
jz .notransa
|
|
call setuphdma
|
|
.notransa
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,02h
|
|
test al,02h
|
|
jz .notransb
|
|
call setuphdma
|
|
.notransb
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,04h
|
|
test al,04h
|
|
jz .notransc
|
|
call setuphdma
|
|
.notransc
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,08h
|
|
test al,08h
|
|
jz .notransd
|
|
call setuphdma
|
|
.notransd
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,10h
|
|
test al,10h
|
|
jz .notranse
|
|
call setuphdma
|
|
.notranse
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,20h
|
|
test al,20h
|
|
jz .notransf
|
|
call setuphdma
|
|
.notransf
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,40h
|
|
test al,40h
|
|
jz .notransg
|
|
call setuphdma
|
|
.notransg
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,80h
|
|
test al,80h
|
|
jz .notransh
|
|
call setuphdma
|
|
.notransh
|
|
pop edx
|
|
pop ecx
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
; call exechdma
|
|
; call exechdma
|
|
.nohdma
|
|
cmp byte[nohdmaframe],1
|
|
jne .notframe
|
|
inc byte[hdmadelay]
|
|
.notframe
|
|
mov byte[hdmarestart],0
|
|
ret
|
|
|
|
; HDMA enable register
|
|
NEWSYM starthdma
|
|
mov al,[curhdma]
|
|
NEWSYM startnexthdma
|
|
mov [nexthdma],al
|
|
cmp al,0
|
|
je near .nohdma
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
push ecx
|
|
push edx
|
|
mov esi,dmadata
|
|
mov edx,hdmadata
|
|
mov ah,01h
|
|
test al,01h
|
|
jz .notransa
|
|
call setuphdma
|
|
.notransa
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,02h
|
|
test al,02h
|
|
jz .notransb
|
|
call setuphdma
|
|
.notransb
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,04h
|
|
test al,04h
|
|
jz .notransc
|
|
call setuphdma
|
|
.notransc
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,08h
|
|
test al,08h
|
|
jz .notransd
|
|
call setuphdma
|
|
.notransd
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,10h
|
|
test al,10h
|
|
jz .notranse
|
|
call setuphdma
|
|
.notranse
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,20h
|
|
test al,20h
|
|
jz .notransf
|
|
call setuphdma
|
|
.notransf
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,40h
|
|
test al,40h
|
|
jz .notransg
|
|
call setuphdma
|
|
.notransg
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,80h
|
|
test al,80h
|
|
jz .notransh
|
|
call setuphdma
|
|
.notransh
|
|
pop edx
|
|
pop ecx
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
.nohdma
|
|
ret
|
|
|
|
NEWSYM dohdma
|
|
xor ebx,ebx
|
|
test byte[esi],40h
|
|
jnz near indirectaddr
|
|
push eax
|
|
test byte[esi+10],07Fh
|
|
jnz near .nozero
|
|
test byte[esi+10],80h
|
|
jnz near .noincr
|
|
test [hdmatype],ah
|
|
jnz .noincr
|
|
mov bl,[edx+16]
|
|
add word[edx+17],bx
|
|
.noincr
|
|
mov bl,ah
|
|
not bl
|
|
and [hdmatype],bl
|
|
mov bl,[esi+4]
|
|
mov cx,[edx+17]
|
|
call dword near [memtabler8+ebx*4]
|
|
inc word[edx+17]
|
|
mov [esi+10],al
|
|
test al,0FFh
|
|
jnz .yeszero
|
|
xor [nexthdma],ah
|
|
jmp .finhdma2
|
|
.yeszero
|
|
cmp byte[esi+10],80h
|
|
ja near hdmatype2
|
|
mov al,[edx+16]
|
|
mov [.tempdecr],al
|
|
movzx ebx,byte[esi+4]
|
|
movzx ecx,word[edx+17] ; increment/decrement/keep pointer location
|
|
call dword near [memtabler8+ebx*4]
|
|
call dword near [edx]
|
|
dec byte[.tempdecr]
|
|
jz .finhdma
|
|
movzx ebx,byte[esi+4]
|
|
mov cx,[edx+17] ; increment/decrement/keep pointer location
|
|
inc cx
|
|
call dword near [memtabler8+ebx*4]
|
|
call dword near [edx+4]
|
|
dec byte[.tempdecr]
|
|
jz .finhdma
|
|
movzx ebx,byte[esi+4]
|
|
mov cx,[edx+17] ; increment/decrement/keep pointer location
|
|
add cx,2
|
|
call dword near [memtabler8+ebx*4]
|
|
call dword near [edx+8]
|
|
dec byte[.tempdecr]
|
|
jz .finhdma
|
|
movzx ebx,byte[esi+4]
|
|
mov cx,[edx+17] ; increment/decrement/keep pointer location
|
|
add cx,3
|
|
call dword near [memtabler8+ebx*4]
|
|
call dword near [edx+12]
|
|
jmp .finhdma
|
|
.nozero
|
|
test byte[esi+10],80h
|
|
jnz near hdmatype2
|
|
.finhdma
|
|
mov ax,[edx+17]
|
|
mov [esi+8],ax
|
|
pop eax
|
|
dec byte[esi+10]
|
|
ret
|
|
.finhdma2
|
|
mov ax,[edx+17]
|
|
mov [esi+8],ax
|
|
pop eax
|
|
ret
|
|
|
|
section .bss
|
|
.tempdecr resd 1
|
|
section .text
|
|
|
|
NEWSYM hdmatype2
|
|
mov al,[edx+16]
|
|
mov [.tempdecr],al
|
|
movzx ebx,byte[esi+4]
|
|
movzx ecx,word[edx+17] ; increment/decrement/keep pointer location
|
|
inc word[edx+17]
|
|
call dword near [memtabler8+ebx*4]
|
|
call dword near [edx]
|
|
dec byte[.tempdecr]
|
|
jz .finhdma
|
|
movzx ebx,byte[esi+4]
|
|
mov cx,[edx+17] ; increment/decrement/keep pointer location
|
|
inc word[edx+17]
|
|
call dword near [memtabler8+ebx*4]
|
|
call dword near [edx+4]
|
|
dec byte[.tempdecr]
|
|
jz .finhdma
|
|
movzx ebx,byte[esi+4]
|
|
mov cx,[edx+17] ; increment/decrement/keep pointer location
|
|
inc word[edx+17]
|
|
call dword near [memtabler8+ebx*4]
|
|
call dword near [edx+8]
|
|
dec byte[.tempdecr]
|
|
jz .finhdma
|
|
movzx ebx,byte[esi+4]
|
|
mov cx,[edx+17] ; increment/decrement/keep pointer location
|
|
inc word[edx+17]
|
|
call dword near [memtabler8+ebx*4]
|
|
call dword near [edx+12]
|
|
.finhdma
|
|
mov ax,[edx+17]
|
|
mov [esi+8],ax
|
|
pop eax
|
|
dec byte[esi+10]
|
|
ret
|
|
|
|
section .bss
|
|
.tempdecr resd 1
|
|
section .text
|
|
|
|
NEWSYM indirectaddr
|
|
push eax
|
|
test byte[esi+10],07Fh
|
|
jnz near .nozero
|
|
test [hdmatype],ah
|
|
jnz .noincr
|
|
add word[edx+17],2
|
|
.noincr
|
|
mov bl,ah
|
|
not bl
|
|
and [hdmatype],bl
|
|
mov bl,[esi+4]
|
|
mov cx,[edx+17]
|
|
call dword near [memtabler8+ebx*4]
|
|
inc word[edx+17]
|
|
mov [esi+10],al
|
|
push eax
|
|
mov bl,[esi+4]
|
|
mov cx,[edx+17]
|
|
call dword near [memtabler16+ebx*4]
|
|
mov [esi+5],ax
|
|
pop eax
|
|
test al,0FFh
|
|
jnz .yeszero
|
|
xor [nexthdma],ah
|
|
jmp .finhdma2
|
|
.yeszero
|
|
cmp byte[esi+10],80h
|
|
ja near hdmatype2indirect
|
|
mov al,[edx+16]
|
|
mov [.tempdecr],al
|
|
movzx ebx,byte[esi+7]
|
|
movzx ecx,word[esi+5] ; increment/decrement/keep pointer location
|
|
call dword near [memtabler8+ebx*4]
|
|
call dword near [edx]
|
|
dec byte[.tempdecr]
|
|
jz .finhdma
|
|
movzx ebx,byte[esi+7]
|
|
mov cx,[esi+5] ; increment/decrement/keep pointer location
|
|
inc cx
|
|
call dword near [memtabler8+ebx*4]
|
|
call dword near [edx+4]
|
|
dec byte[.tempdecr]
|
|
jz .finhdma
|
|
movzx ebx,byte[esi+7]
|
|
mov cx,[esi+5] ; increment/decrement/keep pointer location
|
|
add cx,2
|
|
call dword near [memtabler8+ebx*4]
|
|
call dword near [edx+8]
|
|
dec byte[.tempdecr]
|
|
jz .finhdma
|
|
movzx ebx,byte[esi+7]
|
|
mov cx,[esi+5] ; increment/decrement/keep pointer location
|
|
add cx,3
|
|
call dword near [memtabler8+ebx*4]
|
|
call dword near [edx+12]
|
|
jmp .finhdma
|
|
.nozero
|
|
test byte[esi+10],80h
|
|
jnz near hdmatype2indirect
|
|
.finhdma
|
|
mov ax,[edx+17]
|
|
mov [esi+8],ax
|
|
pop eax
|
|
dec byte[esi+10]
|
|
ret
|
|
.finhdma2
|
|
mov ax,[edx+17]
|
|
mov [esi+8],ax
|
|
pop eax
|
|
ret
|
|
|
|
section .bss
|
|
.tempdecr resd 1
|
|
|
|
section .data
|
|
.fname2 db 9,'vram2.dat',0
|
|
section .text
|
|
|
|
NEWSYM hdmatype2indirect
|
|
mov al,[edx+16]
|
|
mov [.tempdecr],al
|
|
movzx ebx,byte[esi+7]
|
|
movzx ecx,word[esi+5] ; increment/decrement/keep pointer location
|
|
inc word[esi+5]
|
|
call dword near [memtabler8+ebx*4]
|
|
call dword near [edx]
|
|
dec byte[.tempdecr]
|
|
jz .finhdma
|
|
movzx ebx,byte[esi+7]
|
|
mov cx,[esi+5] ; increment/decrement/keep pointer location
|
|
inc word[esi+5]
|
|
call dword near [memtabler8+ebx*4]
|
|
call dword near [edx+4]
|
|
dec byte[.tempdecr]
|
|
jz .finhdma
|
|
movzx ebx,byte[esi+7]
|
|
mov cx,[esi+5] ; increment/decrement/keep pointer location
|
|
inc word[esi+5]
|
|
call dword near [memtabler8+ebx*4]
|
|
call dword near [edx+8]
|
|
dec byte[.tempdecr]
|
|
jz .finhdma
|
|
movzx ebx,byte[esi+7]
|
|
mov cx,[esi+5] ; increment/decrement/keep pointer location
|
|
inc word[esi+5]
|
|
call dword near [memtabler8+ebx*4]
|
|
call dword near [edx+12]
|
|
.finhdma
|
|
pop eax
|
|
dec byte[esi+10]
|
|
ret
|
|
|
|
section .bss
|
|
.tempdecr resd 1
|
|
.dest resd 1
|
|
section .text
|
|
|
|
NEWSYM exechdma
|
|
cmp byte[hdmarestart],1
|
|
je near exechdmars
|
|
mov al,[nexthdma]
|
|
cmp al,0
|
|
je near .nohdma
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
push ecx
|
|
push edx
|
|
mov esi,dmadata
|
|
mov edx,hdmadata
|
|
mov ah,01h
|
|
test al,01h
|
|
jz .notransa
|
|
call dohdma
|
|
.notransa
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,02h
|
|
test al,02h
|
|
jz .notransb
|
|
call dohdma
|
|
.notransb
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,04h
|
|
test al,04h
|
|
jz .notransc
|
|
call dohdma
|
|
.notransc
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,08h
|
|
test al,08h
|
|
jz .notransd
|
|
call dohdma
|
|
.notransd
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,10h
|
|
test al,10h
|
|
jz .notranse
|
|
call dohdma
|
|
.notranse
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,20h
|
|
test al,20h
|
|
jz .notransf
|
|
call dohdma
|
|
.notransf
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,40h
|
|
test al,40h
|
|
jz .notransg
|
|
call dohdma
|
|
.notransg
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,80h
|
|
test al,80h
|
|
jz .notransh
|
|
call dohdma
|
|
.notransh
|
|
pop edx
|
|
pop ecx
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
.nohdma
|
|
ret
|
|
|
|
NEWSYM exechdmars
|
|
mov al,[nexthdma]
|
|
cmp al,0
|
|
je near .nohdma
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
push ecx
|
|
push edx
|
|
mov esi,dmadata
|
|
mov edx,hdmadata
|
|
mov ah,01h
|
|
test al,01h
|
|
jz .notransa
|
|
call setuphdmars
|
|
call dohdma
|
|
.notransa
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,02h
|
|
test al,02h
|
|
jz .notransb
|
|
call setuphdmars
|
|
call dohdma
|
|
.notransb
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,04h
|
|
test al,04h
|
|
jz .notransc
|
|
call setuphdmars
|
|
call dohdma
|
|
.notransc
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,08h
|
|
test al,08h
|
|
jz .notransd
|
|
call setuphdmars
|
|
call dohdma
|
|
.notransd
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,10h
|
|
test al,10h
|
|
jz .notranse
|
|
call setuphdmars
|
|
call dohdma
|
|
.notranse
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,20h
|
|
test al,20h
|
|
jz .notransf
|
|
call setuphdmars
|
|
call dohdma
|
|
.notransf
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,40h
|
|
test al,40h
|
|
jz .notransg
|
|
call setuphdmars
|
|
call dohdma
|
|
.notransg
|
|
add esi,16
|
|
add edx,19
|
|
mov ah,80h
|
|
test al,80h
|
|
jz .notransh
|
|
call setuphdmars
|
|
call dohdma
|
|
.notransh
|
|
pop edx
|
|
pop ecx
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
.nohdma
|
|
mov byte[hdmarestart],0
|
|
ret
|
|
|
|
|