📄 dma.asm
字号:
shl ebx,2
add ebx,[regptw]
mov eax,[ebx]
mov [edx+8],eax
; get pointer #4
xor ebx,ebx
mov bl,[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
.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
NEWSYM hdmastartsc, db 0
NEWSYM hdmarestart, db 0
NEWSYM reg420Cw
mov [curhdma],al
mov bx,[resolutn]
cmp word[curypos],bx
jae near .nohdma
cmp byte[disablehdma],0
jne near .nohdma
; jmp starthdma
mov al,[curhdma]
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
mov bl,[hdmaearlstart]
mov [hdmadelay],bl
pop edx
pop ecx
pop edi
pop esi
pop ebx
; call exechdma
; call exechdma
.nohdma
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 byte[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
xor ebx,ebx
xor ecx,ecx
mov bl,[esi+4]
mov cx,[edx+17] ; increment/decrement/keep pointer location
call dword near [memtabler8+ebx*4]
call dword near [edx]
dec byte[.tempdecr]
jz .finhdma
xor ebx,ebx
mov bl,[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
xor ebx,ebx
mov bl,[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
xor ebx,ebx
mov bl,[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
.tempdecr db 0
NEWSYM hdmatype2
mov al,[edx+16]
mov [.tempdecr],al
xor ebx,ebx
xor ecx,ecx
mov bl,[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]
dec byte[.tempdecr]
jz .finhdma
xor ebx,ebx
mov bl,[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
xor ebx,ebx
mov bl,[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
xor ebx,ebx
mov bl,[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
.tempdecr db 0
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 byte[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
xor ebx,ebx
xor ecx,ecx
mov bl,[esi+7]
mov cx,[esi+5] ; increment/decrement/keep pointer location
call dword near [memtabler8+ebx*4]
call dword near [edx]
dec byte[.tempdecr]
jz .finhdma
xor ebx,ebx
mov bl,[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
xor ebx,ebx
mov bl,[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
xor ebx,ebx
mov bl,[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
.tempdecr db 0
.fname2 db 9,'vram2.dat',0
NEWSYM hdmatype2indirect
mov al,[edx+16]
mov [.tempdecr],al
xor ebx,ebx
xor ecx,ecx
mov bl,[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]
dec byte[.tempdecr]
jz .finhdma
xor ebx,ebx
mov bl,[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
xor ebx,ebx
mov bl,[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
xor ebx,ebx
mov bl,[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
.tempdecr db 0
NEWSYM dohdma2
; new hdma routines
xor ebx,ebx
push eax
test [hdmatype],ah
jz .nostart
xor ah,0FFh
xor ecx,ecx
and [hdmatype],ah
test byte[esi],40h
jnz near .indir
mov bl,[esi+4]
mov cx,[esi+8]
call dword near [memtabler8+ebx*4]
inc word[esi+8]
xor ebx,ebx
mov [esi+10],al
jmp .nostart
.indir
mov bl,[esi+4]
mov [esi+7],bl
mov cx,[esi+2]
mov [esi+5],cx
call dword near [memtabler8+ebx*4]
xor ebx,ebx
inc word[esi+5]
mov bl,[esi+7]
mov [esi+10],al
mov cx,[esi+5]
call dword near [memtabler8+ebx*4]
xor ebx,ebx
inc word[esi+5]
mov bl,[esi+7]
mov [esi+8],al
mov cx,[esi+5]
call dword near [memtabler8+ebx*4]
inc word[esi+5]
mov [esi+9],al
xor ebx,ebx
.nostart
cmp byte[esi+10],0
je near .endhdma
mov bl,[esi+4]
mov al,[edx+16]
mov [.tempdecr],al
xor ecx,ecx
mov bl,[esi+4]
mov cx,[esi+8] ; increment/decrement/keep pointer location
call dword near [memtabler8+ebx*4]
call dword near [edx]
dec byte[.tempdecr]
jz .nomorehdma
xor ebx,ebx
mov cx,[esi+8] ; increment/decrement/keep pointer location
mov bl,[esi+4]
inc cx
call dword near [memtabler8+ebx*4]
call dword near [edx+4]
dec byte[.tempdecr]
jz .nomorehdma
xor ebx,ebx
mov cx,[esi+8] ; increment/decrement/keep pointer location
mov bl,[esi+4]
add cx,2
call dword near [memtabler8+ebx*4]
call dword near [edx+8]
dec byte[.tempdecr]
jz .nomorehdma
xor ebx,ebx
mov cx,[esi+8] ; increment/decrement/keep pointer location
mov bl,[esi+4]
add cx,3
call dword near [memtabler8+ebx*4]
call dword near [edx+12]
.nomorehdma
dec byte[esi+10]
test byte[esi+10],7Fh
jz .zeroed
test byte[esi+10],80h
jz .noadd
xor ebx,ebx
mov bl,[edx+16]
add [esi+8],bx
.noadd
pop eax
ret
.zeroed
test byte[esi],40h
jnz near .indirzero
xor ebx,ebx
mov bl,[edx+16]
add [esi+8],bx
mov bl,[esi+4]
mov cx,[esi+8]
call dword near [memtabler8+ebx*4]
inc word[esi+8]
mov [esi+10],al
pop eax
ret
.indirzero
xor ebx,ebx
mov bl,[esi+7]
mov cx,[esi+5]
call dword near [memtabler8+ebx*4]
xor ebx,ebx
inc word[esi+5]
mov bl,[esi+7]
mov [esi+10],al
mov cx,[esi+5]
call dword near [memtabler8+ebx*4]
xor ebx,ebx
inc word[esi+5]
mov bl,[esi+7]
mov [esi+8],al
mov cx,[esi+5]
call dword near [memtabler8+ebx*4]
inc word[esi+5]
mov [esi+9],al
pop eax
ret
.endhdma
pop eax
xor [nexthdma],ah
ret
.tempdecr db 0
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
NEWSYM DmaAsmEnd
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -