quickdev16/tools/zsnes/src/debugasm.asm
2009-04-22 20:04:28 +02:00

263 lines
5.6 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.
; Stuff that looked like too much trouble to port
%include "macros.mac"
EXTSYM snesmmap, snesmap2, memtabler8, memtablew8, regaccessbankr8, dmadata
EXTSYM initaddrl, spcPCRam, UpdateDPage, pdh, numinst, writeon
EXTSYM xp, xpb, xpc, curcyc, Curtableaddr, splitflags, execsingle, joinflags
;;; from debugger.c
EXTSYM PrevBreakPt_page, PrevBreakPt_offset, my_getch_ret, my_getch
SECTION .text
;; Wrapper for calls to routines in memtabler8
NEWSYM memtabler8_wrapper
push ebp
mov ebp, esp
push ebx
push edi
push esi
movzx ebx, BYTE [ebp+8]
movzx ecx, WORD [ebp+12]
xor eax, eax
mov al, bl
call DWORD [memtabler8+eax*4]
and eax, 255
pop esi
pop edi
pop ebx
pop ebp
ret
NEWSYM memtablew8_wrapper
push ebp
mov ebp, esp
push ebx
push edi
push esi
movzx ebx, BYTE [ebp+8]
movzx ecx, WORD [ebp+12]
movzx eax, BYTE [ebp+16]
mov byte[writeon],1
call DWORD [memtablew8+ebx*4]
mov byte[writeon],0
and eax, 255
pop esi
pop edi
pop ebx
pop ebp
ret
NEWSYM breakops_wrapper
push ebp
mov ebp, esp
pushad
movzx ebx, BYTE [PrevBreakPt_page]
movzx ecx, WORD [PrevBreakPt_offset]
call breakops
popad
pop ebp
ret
;*******************************************************
; BreakOps Breaks at Breakpoint
;*******************************************************
NEWSYM breakops
; set cursor to (12,60)
mov [PrevBreakPt_offset],cx
mov [PrevBreakPt_page],bl
; push ebx
; mov ah,02h
; mov bl,0
; mov dh,12
; mov dl,60
; int 10h
; pop ebx
test cx,8000h
jz .loweraddr2
mov esi,[snesmmap+ebx*4]
jmp .skiplower2
.loweraddr2
mov esi,[snesmap2+ebx*4]
.skiplower2
add esi,ecx ; add program counter to address
mov [breakarea],esi
;; factored out
; mov byte[wx],14
; mov byte[wx2],65
; mov byte[wy],11
; mov byte[wy2],13
; call drawwindow
; mov ax,[selcB800]
; mov es,ax
; mov edi,12*160+18*2
; mov esi,.message1
; mov ecx,42
; mov ah,31
; .loopb
; lodsb
; stosw
; dec ecx
; jnz .loopb
xor eax,eax
xor ebx,ebx
xor ecx,ecx
xor edx,edx
mov bl,[xpb]
mov ax,[xpc]
test ax,8000h
jz .loweraddr
mov esi,[snesmmap+ebx*4]
jmp .skiplower
.loweraddr
cmp ax,4300h
jb .lower
cmp dword[memtabler8+ebx*4],regaccessbankr8
je .dma
.lower
mov esi,[snesmap2+ebx*4]
jmp .skiplower
.dma
mov esi,dmadata-4300h
.skiplower
mov [initaddrl],esi
add esi,eax ; add program counter to address
mov ebp,[spcPCRam]
mov dl,[xp] ; set flags
mov dh,[curcyc] ; set cycles
mov edi,[Curtableaddr]
call UpdateDPage
; execute
.loopa
call splitflags
call execsingle
call joinflags
mov dh,[pdh]
inc dword[numinst]
cmp byte[numinst],0
jne .skipa
;; not DOS anymore
; mov ah,0bh
; int 21h
; test al,0FFh
; jz .skipa
; mov ah,07h
; int 21h
pushad
call my_getch
popad
mov eax, [my_getch_ret]
cmp eax,27
je .skipc
.skipa
cmp esi,[breakarea]
jne .loopa
.skipc
; copy back data
mov [spcPCRam],ebp
mov [Curtableaddr],edi
mov [xp],dl
mov [curcyc],dh
mov eax,[initaddrl]
sub esi,eax ; subtract program counter by address
mov [xpc],si
ret
SECTION .data
NEWSYM breakarea, dd 0
SECTION .text
;*******************************************************
; Execute Next Opcode
;*******************************************************
NEWSYM execnextop
xor eax,eax
xor ebx,ebx
xor ecx,ecx
xor edx,edx
mov bl,[xpb]
mov ax,[xpc]
test ax,8000h
jz .loweraddr
mov esi,[snesmmap+ebx*4]
jmp .skiplower
.loweraddr
cmp ax,4300h
jb .lower
cmp dword[memtabler8+ebx*4],regaccessbankr8
je .dma
.lower
mov esi,[snesmap2+ebx*4]
jmp .skiplower
.dma
mov esi,dmadata-4300h
.skiplower
mov [initaddrl],esi
add esi,eax ; add program counter to address
mov ebp,[spcPCRam]
mov dl,[xp] ; set flags
mov dh,[curcyc] ; set cycles
mov edi,[Curtableaddr]
call splitflags
call execsingle
call joinflags
call UpdateDPage
; execute
; copy back data
mov [spcPCRam],ebp
mov [Curtableaddr],edi
mov [xp],dl
mov dh,[pdh]
mov [curcyc],dh
mov eax,[initaddrl]
sub esi,eax ; subtract program counter by address
mov [xpc],si
inc dword[numinst]
ret