3849 lines
73 KiB
NASM
3849 lines
73 KiB
NASM
;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com )
|
||
;
|
||
;This program is free software; you can redistribute it and/or
|
||
;modify it under the terms of the GNU General Public License
|
||
;as published by the Free Software Foundation; either
|
||
;version 2 of the License, or (at your option) any later
|
||
;version.
|
||
;
|
||
;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 DosExit,curblank,previdmode,start65816,wramdata,C4Ram,cnetplaybuf
|
||
EXTSYM UpdateDPage,SA1Enable,splitflags,joinflags,delay
|
||
EXTSYM Open_File,Read_File,Create_File,Write_File,Close_File,romdata
|
||
EXTSYM Check_Key,Get_Key
|
||
EXTSYM SDD1Array, SDD1Entry
|
||
EXTSYM LastLog
|
||
EXTSYM fulladdtab
|
||
EXTSYM DecompArray,DecompAPtr
|
||
EXTSYM endprog
|
||
EXTSYM printhex
|
||
EXTSYM vesa2_rpos,vesa2_rfull,vesa2_rtrcl,vesa2_rtrcla
|
||
EXTSYM vesa2_gpos,vesa2_gfull,vesa2_gtrcl,vesa2_gtrcla
|
||
EXTSYM vesa2_bpos,vesa2_bfull,vesa2_btrcl,vesa2_btrcla
|
||
EXTSYM BRRBuffer,DSPMem,ResetState,PHdspsave,printnum,PHspcsave
|
||
EXTSYM ssdatst,timeron,timincr0,timincr1,timincr2,timinl0
|
||
EXTSYM timinl1,timinl2,vram
|
||
EXTSYM spcnumread
|
||
EXTSYM Curtableaddr,fnamest,procexecloop,stateloader,tableA
|
||
EXTSYM versn,vidmemch2
|
||
EXTSYM statesaver
|
||
EXTSYM memtablew8,printhex8,writeon,SetAddressingModesSA1
|
||
EXTSYM curcyc,dmadata,execsingle,initaddrl,memtabler8,pdh
|
||
EXTSYM regaccessbankr8,selcB800,snesmap2,snesmmap
|
||
EXTSYM ram7f
|
||
EXTSYM StringLength
|
||
EXTSYM exiter
|
||
EXTSYM SA1Status,CurrentCPU
|
||
EXTSYM curypos,xa,xd,xdb,xe,xp,xpb,xpc,xs,xx,xy
|
||
EXTSYM SA1xpb,SA1xpc,SA1xa,SA1xx,SA1xy,SA1xd,SA1xdb,SA1xs
|
||
EXTSYM cycpbl,debugbuf,soundon,spcA,spcNZ,spcP,spcPCRam
|
||
EXTSYM spcRam,spcRamDP,spcS,spcX,spcY
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
; debstop at regsw.asm 2118/2119
|
||
|
||
NEWSYM startdebugger
|
||
mov byte[curblank],40h
|
||
mov byte[debuggeron],1
|
||
mov ax,0003h
|
||
int 10h
|
||
|
||
; mov edx,.fname3+1
|
||
; call Open_File
|
||
; mov bx,ax
|
||
; mov ecx,480h
|
||
; mov edx,[romdata]
|
||
; add edx,65536*13h
|
||
; call Read_File
|
||
; call Close_File
|
||
|
||
mov byte[execut],0
|
||
call startdisplay
|
||
call debugloop
|
||
call cleardisplay
|
||
; sort SDD1
|
||
jmp .noSDD1
|
||
mov ecx,[SDD1Entry]
|
||
cmp ecx,8
|
||
jbe near .noSDD1
|
||
sub ecx,8
|
||
.next2
|
||
xor esi,esi
|
||
xor ebx,ebx
|
||
.next
|
||
xor eax,eax
|
||
xor edx,edx
|
||
mov al,[SDD1Array+ebx]
|
||
shl eax,16
|
||
mov ah,[SDD1Array+ebx+1]
|
||
mov al,[SDD1Array+ebx+2]
|
||
mov dl,[SDD1Array+ebx+8]
|
||
shl edx,16
|
||
mov dh,[SDD1Array+ebx+9]
|
||
mov dl,[SDD1Array+ebx+10]
|
||
cmp edx,eax
|
||
ja .noswap
|
||
mov eax,dword[SDD1Array+ebx]
|
||
mov edx,dword[SDD1Array+ebx+8]
|
||
mov dword[SDD1Array+ebx+8],eax
|
||
mov dword[SDD1Array+ebx],edx
|
||
mov eax,dword[SDD1Array+ebx+4]
|
||
mov edx,dword[SDD1Array+ebx+12]
|
||
mov dword[SDD1Array+ebx+12],eax
|
||
mov dword[SDD1Array+ebx+4],edx
|
||
mov esi,1
|
||
.noswap
|
||
add ebx,8
|
||
cmp ebx,ecx
|
||
jne near .next
|
||
or esi,esi
|
||
jnz near .next2
|
||
|
||
xor ebx,ebx
|
||
.next3
|
||
mov al,[SDD1Array+ebx]
|
||
mov ah,[SDD1Array+ebx+8]
|
||
cmp al,ah
|
||
jne .notequal
|
||
mov ah,[SDD1Array+ebx+9]
|
||
mov al,[SDD1Array+ebx+10]
|
||
mov dh,[SDD1Array+ebx+1]
|
||
mov dl,[SDD1Array+ebx+2]
|
||
sub ax,dx
|
||
mov [SDD1Array+ebx+5],ah
|
||
mov [SDD1Array+ebx+6],al
|
||
.notequal
|
||
add ebx,8
|
||
cmp ebx,ecx
|
||
jne near .next3
|
||
|
||
.noSDD1
|
||
|
||
pushad
|
||
call LastLog
|
||
; cmp dword[DecompAPtr],0
|
||
; je near .nofile
|
||
mov edx,.fname2+1
|
||
call Create_File
|
||
xor ecx,ecx
|
||
mov bx,ax
|
||
; mov ecx,65536
|
||
; mov edx,[vram]
|
||
; mov ecx,2048*4
|
||
; mov edx,[C4Ram]
|
||
; mov ecx,32768
|
||
; mov edx,[romdata]
|
||
; add edx,65536*13h
|
||
; mov ecx,2EFh
|
||
; mov edx,SDD1Array
|
||
; mov ecx,[SDD1Entry]
|
||
; mov edx,[romdata]
|
||
; add edx,32768*40
|
||
; mov edx,cnetplaybuf
|
||
; mov ecx,512
|
||
; mov edx,[sfxramdata]
|
||
; add edx,65536
|
||
; mov edx,fxtrace
|
||
; mov ecx,65536
|
||
; mov edx,[wramdata]
|
||
; mov ecx,544
|
||
; mov edx,oamram
|
||
; mov ecx,256
|
||
; mov edx,DSPFuncUsed
|
||
|
||
; mov edx,fulladdtab
|
||
; mov ecx,65536*2
|
||
|
||
; mov ecx,17*4
|
||
; mov edx,_ViewerZ
|
||
; mov ecx,512
|
||
; mov edx,cgram
|
||
; mov ecx,256*4
|
||
; mov edx,fxtrace
|
||
;NEWSYM DecompArray, times 65536 db 0
|
||
;NEWSYM DecompAPtr, dd 0
|
||
; mov edx,DecompArray
|
||
; mov ecx,[DecompAPtr]
|
||
; shl ecx,3
|
||
; mov edx,[romdata]
|
||
; add edx,3E5CCEh
|
||
; mov ecx,0022h
|
||
or ecx,ecx
|
||
jz .nofilecontents
|
||
call Write_File
|
||
.nofilecontents
|
||
call Close_File
|
||
.nofile
|
||
popad
|
||
|
||
cmp byte[execut],1
|
||
je near start65816
|
||
; mov al,[previdmode]
|
||
; mov ah,0
|
||
; int 10h
|
||
; jmp DosExit
|
||
|
||
jmp endprog
|
||
jmp DosExit
|
||
|
||
|
||
mov ax,3
|
||
int 10h
|
||
|
||
mov ax,[vesa2_rfull]
|
||
call printhex
|
||
mov ax,[vesa2_rtrcl]
|
||
call printhex
|
||
mov ax,[vesa2_gfull]
|
||
call printhex
|
||
mov ax,[vesa2_gtrcl]
|
||
call printhex
|
||
mov ax,[vesa2_bfull]
|
||
call printhex
|
||
mov ax,[vesa2_btrcl]
|
||
call printhex
|
||
|
||
jmp DosExit
|
||
|
||
.fname2 db 9,'vram.dat',0
|
||
.fname3 db 9,'vram2.dat',0
|
||
|
||
SECTION .data
|
||
; global variables
|
||
NEWSYM debugh, dw 0 ; debug head
|
||
NEWSYM debugt, dw 0 ; debug tail
|
||
NEWSYM debugv, dw 0 ; debug view
|
||
NEWSYM debugds, db 0 ; debug disable (bit 0 = 65816, bit 1 = SPC)
|
||
NEWSYM numinst, dd 0 ; # of instructions
|
||
NEWSYM wx, db 0
|
||
NEWSYM wy, db 0
|
||
NEWSYM wx2, db 0
|
||
NEWSYM wy2, db 0
|
||
NEWSYM execut, db 0
|
||
NEWSYM debuggeron, db 1
|
||
NEWSYM debstop, db 0
|
||
NEWSYM debstop2, db 0
|
||
NEWSYM debstop3, db 0
|
||
NEWSYM debstop4, db 0
|
||
SECTION .text
|
||
|
||
|
||
NEWSYM loadtempstuff
|
||
; Load stuff
|
||
mov edx,.spcfname
|
||
call Open_File
|
||
mov bx,ax
|
||
; mov ecx,64
|
||
; mov edx,ssdatst
|
||
; call Read_File
|
||
; Load SPC stuff
|
||
mov ecx,[PHspcsave]
|
||
mov edx,spcRam
|
||
call Read_File
|
||
; Load DSP stuff
|
||
mov ecx,[PHdspsave]
|
||
mov edx,BRRBuffer
|
||
call Read_File
|
||
mov ecx,256
|
||
mov edx,DSPMem
|
||
call Read_File
|
||
call Close_File
|
||
add dword[spcPCRam],spcRam
|
||
add dword[spcRamDP],spcRam
|
||
call ResetState
|
||
ret
|
||
mov dword[spcPCRam],0
|
||
xor eax,eax
|
||
mov ax,[ssdatst+37]
|
||
mov [spcPCRam],ax
|
||
call printnum
|
||
mov al,[ssdatst+39]
|
||
mov [spcA],al
|
||
mov al,[ssdatst+40]
|
||
mov [spcX],al
|
||
mov al,[ssdatst+41]
|
||
mov [spcY],al
|
||
mov al,[ssdatst+42]
|
||
mov [spcP],al
|
||
mov al,[ssdatst+43]
|
||
mov [spcS],al
|
||
add dword[spcPCRam],spcRam
|
||
; Assemble N/Z flags into P
|
||
mov byte[spcNZ],0
|
||
test byte[spcP],02h
|
||
jnz .zero
|
||
mov byte[spcNZ],1
|
||
.zero
|
||
test byte[spcP],80h
|
||
jz .noneg
|
||
or byte[spcNZ],80h
|
||
.noneg
|
||
; Init separate variables
|
||
xor eax,eax
|
||
mov al,[spcRam+0F1h]
|
||
mov byte[timeron],al
|
||
mov al,[spcRam+0FAh]
|
||
mov [timincr0],al
|
||
mov [timinl0],al
|
||
mov al,[spcRam+0FBh]
|
||
mov [timincr1],al
|
||
mov [timinl1],al
|
||
mov al,[spcRam+0FCh]
|
||
mov [timincr2],al
|
||
mov [timinl2],al
|
||
ret
|
||
|
||
.spcfname db 'temp.spc',0
|
||
|
||
;*******************************************************
|
||
; Debug Loop
|
||
;*******************************************************
|
||
|
||
NEWSYM debugloop
|
||
NEWSYM debugloopa
|
||
test byte[debugds],02h
|
||
jnz .no65816
|
||
call nextopcode
|
||
.no65816
|
||
test byte[debugds],01h
|
||
jnz .nospc
|
||
call nextspcopcode
|
||
.nospc
|
||
|
||
NEWSYM debugloopb
|
||
call showdd
|
||
.loopb
|
||
mov byte[spcnumread],0
|
||
; wait for key
|
||
mov ah,07h
|
||
int 21h
|
||
; capitalize
|
||
cmp al,'a'
|
||
jb .nocap
|
||
cmp al,'z'
|
||
ja .nocap
|
||
sub al,'a'-'A'
|
||
.nocap
|
||
cmp al,0
|
||
jne .loopc
|
||
mov ah,07h
|
||
int 21h
|
||
cmp al,59
|
||
je .execute65816
|
||
cmp al,62
|
||
je near debugloadstate
|
||
cmp al,60
|
||
je near debugsavestate
|
||
jmp .loopd
|
||
.loopc
|
||
cmp al,27
|
||
je .exit
|
||
cmp al,13
|
||
je near .loope
|
||
cmp al,'C'
|
||
je near .clear
|
||
cmp al,'M'
|
||
je near modify
|
||
cmp al,'B'
|
||
je near breakpoint
|
||
cmp al,'R'
|
||
je near repeatbreakpoint
|
||
cmp al,'S'
|
||
je near SPCbreakpoint
|
||
cmp al,'A'
|
||
je near SPCmodify
|
||
cmp al,'T'
|
||
je near trace
|
||
cmp al,'D'
|
||
je near debugdump
|
||
cmp al,'W'
|
||
je near breakatsign
|
||
cmp al,'L'
|
||
je near breakatsignlog
|
||
cmp al,'1'
|
||
je .disableSPC
|
||
cmp al,'2'
|
||
je .disable65816
|
||
.loopd
|
||
jmp .loopb
|
||
.execute65816
|
||
mov byte[execut],1
|
||
.exit
|
||
ret
|
||
|
||
.disableSPC
|
||
xor byte[debugds],01h
|
||
jmp debugloopa
|
||
|
||
.disable65816
|
||
xor byte[debugds],02h
|
||
jmp debugloopa
|
||
|
||
.clear
|
||
; call loadtempstuff
|
||
mov dword[numinst],0
|
||
; mov byte[DSPDet],0
|
||
; mov esi,fxtrace
|
||
; mov ecx,16384
|
||
;.n
|
||
; mov dword[esi],0
|
||
; add esi,4
|
||
; dec ecx
|
||
; jnz .n
|
||
jmp debugloopa
|
||
|
||
.loope
|
||
call execnextop
|
||
cmp byte[soundon],0
|
||
je .nosnd
|
||
test byte[debugds],02h
|
||
jz .nosnd
|
||
cmp dword[cycpbl],55
|
||
jnb .loope
|
||
.nosnd
|
||
jmp debugloopa
|
||
|
||
;*******************************************************
|
||
; Debug dump
|
||
;*******************************************************
|
||
|
||
NEWSYM debugdump
|
||
; Dump SPCRam
|
||
mov edx,.fname
|
||
call Create_File
|
||
mov bx,ax
|
||
mov ecx,65536
|
||
mov edx,spcRam
|
||
call Write_File
|
||
call Close_File
|
||
mov edx,.fname2
|
||
call Create_File
|
||
mov bx,ax
|
||
mov ecx,256
|
||
mov edx,DSPMem
|
||
call Write_File
|
||
call Close_File
|
||
jmp debugloopb
|
||
.fname db 'SPCRAM.DMP',0
|
||
.fname2 db 'DSP.DMP',0
|
||
|
||
;*******************************************************
|
||
; Debug save/load states
|
||
;*******************************************************
|
||
NEWSYM debugloadstate
|
||
; Load State
|
||
mov edx,fnamest+1
|
||
call Open_File
|
||
jc near .nofile
|
||
call stateloader
|
||
; Clear Cache Check
|
||
mov esi,vidmemch2
|
||
mov ecx,4096+4096+4096
|
||
.next
|
||
mov byte[esi],1
|
||
inc esi
|
||
dec ecx
|
||
jnz .next
|
||
cmp byte[versn],60
|
||
jne near .convert
|
||
jmp .noconvert
|
||
.convert
|
||
mov byte[versn],60
|
||
mov byte[versn-2],'6'
|
||
.noconvert
|
||
add dword[Curtableaddr],tableA
|
||
add dword[spcPCRam],spcRam
|
||
add dword[spcRamDP],spcRam
|
||
call ResetState
|
||
call procexecloop
|
||
.nofile
|
||
jmp debugloopa
|
||
|
||
NEWSYM debugsavestate
|
||
call statesaver
|
||
jmp debugloopb
|
||
|
||
;*******************************************************
|
||
; DrawWindow Draws a Window using WX,WY,WX2,WY2
|
||
;*******************************************************
|
||
|
||
NEWSYM drawwindow
|
||
push es
|
||
mov ax,[selcB800]
|
||
mov es,ax
|
||
xor eax,eax
|
||
xor ebx,ebx
|
||
xor edi,edi
|
||
mov al,[wy]
|
||
mov bl,160
|
||
mul bx
|
||
mov edi,eax
|
||
xor eax,eax
|
||
mov al,[wx]
|
||
shl al,1
|
||
add edi,eax
|
||
mov ah,[wx2]
|
||
shl ah,1
|
||
sub ah,al
|
||
mov dl,ah
|
||
mov al,160
|
||
sub al,dl
|
||
mov dh,al
|
||
mov bl,[wy]
|
||
shr dl,1
|
||
.loopa
|
||
mov ah,31
|
||
xor ecx,ecx
|
||
mov cl,dl
|
||
; check if first, middle or last line
|
||
cmp bl,[wy]
|
||
je .first
|
||
cmp bl,[wy2]
|
||
je .last
|
||
; middle
|
||
mov al,'<27>'
|
||
stosw
|
||
mov al,' '
|
||
sub cx,2
|
||
rep stosw
|
||
mov al,'<27>'
|
||
stosw
|
||
jmp .addnext
|
||
.first
|
||
; first
|
||
mov al,218
|
||
stosw
|
||
mov al,196
|
||
sub cx,2
|
||
rep stosw
|
||
mov al,191
|
||
stosw
|
||
.addnext
|
||
inc bl
|
||
xor eax,eax
|
||
mov al,dh
|
||
add edi,eax
|
||
jmp .loopa
|
||
.last
|
||
; last
|
||
mov al,192
|
||
stosw
|
||
mov al,196
|
||
sub cx,2
|
||
rep stosw
|
||
mov al,217
|
||
stosw
|
||
pop es
|
||
ret
|
||
|
||
;*******************************************************
|
||
; GetString Inputs String
|
||
;*******************************************************
|
||
NEWSYM getstring
|
||
mov edi,numstr
|
||
mov ecx,9
|
||
mov al,[clearchar]
|
||
.nz
|
||
mov [edi],al
|
||
inc edi
|
||
loop .nz
|
||
xor ebx,ebx
|
||
.tryinputagain
|
||
; input string
|
||
mov ah,07h
|
||
int 21h
|
||
cmp al,27
|
||
je near .exit
|
||
cmp al,13
|
||
je near .trynextentry
|
||
cmp al,8
|
||
je near .trybackspace
|
||
; capitalize
|
||
cmp al,'a'
|
||
jb .nocap
|
||
cmp al,'z'
|
||
ja .nocap
|
||
sub al,'a'-'A'
|
||
.nocap
|
||
cmp al,'0'
|
||
jb .tryinputagain
|
||
cmp al,'F'
|
||
ja .tryinputagain
|
||
cmp al,'9'
|
||
jbe .okinput
|
||
cmp byte[hexok],0
|
||
je .tryinputagain
|
||
cmp al,'A'
|
||
jae .okinput
|
||
jmp .tryinputagain
|
||
.okinput
|
||
cmp bl,0
|
||
jne .skipnextc
|
||
cmp al,'0'
|
||
je .tryinputagain
|
||
.skipnextc
|
||
cmp bl,[maxstrchar]
|
||
jae .tryinputagain
|
||
mov [numstr+ebx],al
|
||
mov edi,[charmemloc]
|
||
mov esi,numstr
|
||
xor eax,eax
|
||
mov al,bl
|
||
add esi,eax
|
||
mov ecx,eax
|
||
inc ecx
|
||
.okloop
|
||
mov al,[esi]
|
||
dec esi
|
||
mov [es:edi],al
|
||
sub edi,2
|
||
loop .okloop
|
||
inc bl
|
||
jmp .tryinputagain
|
||
.trybackspace
|
||
cmp bl,0
|
||
je near .tryinputagain
|
||
dec bl
|
||
mov edi,[charmemloc]
|
||
mov esi,numstr
|
||
xor eax,eax
|
||
mov al,bl
|
||
add esi,eax
|
||
mov dl,'0'
|
||
mov byte[esi],dl
|
||
dec esi
|
||
mov ecx,eax
|
||
cmp bl,0
|
||
je .noloop
|
||
.okloop2
|
||
mov al,[esi]
|
||
dec esi
|
||
mov [es:edi],al
|
||
sub edi,2
|
||
loop .okloop2
|
||
.noloop
|
||
mov dl,[clearchar]
|
||
mov byte[es:edi],dl
|
||
jmp .tryinputagain
|
||
.trynextentry
|
||
mov al,0
|
||
.exit
|
||
ret
|
||
|
||
SECTION .data
|
||
NEWSYM numstr, db '000000000'
|
||
NEWSYM maxstrchar, db 0
|
||
NEWSYM charmemloc, dd 0
|
||
NEWSYM clearchar, db 0
|
||
NEWSYM hexok, db 0
|
||
SECTION .text
|
||
|
||
;*******************************************************
|
||
; Modify Draws Window and Allows Input
|
||
;*******************************************************
|
||
NEWSYM modify
|
||
mov byte[clearchar],'0'
|
||
mov byte[hexok],1
|
||
mov byte[wx],32
|
||
mov byte[wx2],48
|
||
mov byte[wy],11
|
||
mov byte[wy2],13
|
||
mov ecx,3
|
||
.loopa
|
||
push ecx
|
||
mov cx,4000
|
||
call delay
|
||
call drawwindow
|
||
dec byte[wy]
|
||
inc byte[wy2]
|
||
sub byte[wx],4
|
||
add byte[wx2],4
|
||
pop ecx
|
||
loop .loopa
|
||
push es
|
||
mov ax,[selcB800]
|
||
mov es,ax
|
||
mov edi,10*160+29*2
|
||
mov esi,.message1
|
||
mov ecx,22
|
||
mov ah,31
|
||
.loopb
|
||
lodsb
|
||
stosw
|
||
loop .loopb
|
||
mov edi,12*160+29*2
|
||
mov esi,.message2
|
||
mov ecx,18
|
||
mov ah,31
|
||
.loopc
|
||
lodsb
|
||
stosw
|
||
loop .loopc
|
||
mov edi,14*160+29*2
|
||
mov esi,.message3
|
||
mov ecx,18
|
||
mov ah,31
|
||
.loopd
|
||
lodsb
|
||
stosw
|
||
loop .loopd
|
||
; set cursor to (10,50)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,10
|
||
mov dl,50
|
||
int 10h
|
||
mov byte[maxstrchar],6
|
||
mov dword[charmemloc],10*160+50*2
|
||
call getstring
|
||
cmp al,27
|
||
je near .exit
|
||
; convert to number
|
||
mov cl,bl
|
||
mov ch,bl
|
||
xor edx,edx
|
||
xor eax,eax
|
||
xor ebx,ebx
|
||
cmp cl,4
|
||
jna .nextnum2
|
||
mov cl,4
|
||
.nextnum2
|
||
sub ch,cl
|
||
mov bl,ch
|
||
cmp cl,0
|
||
je .skipconv2
|
||
.nextnum
|
||
shl dx,4
|
||
mov al,[numstr+ebx]
|
||
inc ebx
|
||
call converthex2num
|
||
add dx,ax
|
||
dec cl
|
||
jnz .nextnum
|
||
.skipconv2
|
||
; if ch = 1, then [numstr] is the value
|
||
; if ch = 2, then [numstr] SHL 4+[numstr+1] is the value
|
||
xor al,al
|
||
cmp ch,1
|
||
jne .check2
|
||
mov al,[numstr]
|
||
call converthex2num
|
||
jmp .endcheck
|
||
.check2
|
||
cmp ch,2
|
||
jne .endcheck
|
||
mov al,[numstr]
|
||
call converthex2num
|
||
shl al,4
|
||
mov ah,al
|
||
mov al,[numstr+1]
|
||
call converthex2num
|
||
add al,ah
|
||
.endcheck
|
||
xor ecx,ecx
|
||
xor ebx,ebx
|
||
mov bl,al
|
||
mov cx,dx
|
||
mov [.value],cx
|
||
mov [.bank],bl
|
||
call dword near [memtabler8+ebx*4]
|
||
; set cursor to (12,45)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,12
|
||
mov dl,45
|
||
int 10h
|
||
call printhex8
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,14
|
||
mov dl,46
|
||
int 10h
|
||
mov byte[maxstrchar],2
|
||
mov dword[charmemloc],14*160+46*2
|
||
call getstring
|
||
cmp al,27
|
||
je near .exit
|
||
xor al,al
|
||
cmp bl,1
|
||
jne .checktwo
|
||
mov al,[numstr]
|
||
call converthex2num
|
||
jmp .endconv
|
||
.checktwo
|
||
cmp bl,2
|
||
jne .endconv
|
||
mov al,[numstr]
|
||
call converthex2num
|
||
shl al,4
|
||
mov ah,al
|
||
mov al,[numstr+1]
|
||
call converthex2num
|
||
add al,ah
|
||
.endconv
|
||
xor ebx,ebx
|
||
xor ecx,ecx
|
||
mov cx,[.value]
|
||
mov bl,[.bank]
|
||
mov byte[writeon],1
|
||
call dword near [memtablew8+ebx*4]
|
||
mov byte[writeon],0
|
||
.exit
|
||
pop es
|
||
; set cursor to (0,0)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,0
|
||
mov dl,0
|
||
int 10h
|
||
; cmp byte[sfxdebugon],1
|
||
; je .sfx
|
||
jmp debugloopb
|
||
.sfx
|
||
; jmp dosfxdebug.keyboardloop
|
||
|
||
SECTION .data
|
||
.message1 db 'Enter Address : 000000'
|
||
.message2 db 'Previous Value: 00'
|
||
.message3 db 'Enter Value : 00'
|
||
.value dw 0
|
||
.bank db 0
|
||
SECTION .text
|
||
|
||
;*******************************************************
|
||
; SPCModify Draws Window and Allows Input
|
||
;*******************************************************
|
||
|
||
NEWSYM SPCmodify
|
||
mov byte[clearchar],'0'
|
||
mov byte[hexok],1
|
||
mov byte[wx],32
|
||
mov byte[wx2],48
|
||
mov byte[wy],11
|
||
mov byte[wy2],13
|
||
mov ecx,3
|
||
.loopa
|
||
push ecx
|
||
mov cx,4000
|
||
call delay
|
||
call drawwindow
|
||
dec byte[wy]
|
||
inc byte[wy2]
|
||
sub byte[wx],4
|
||
add byte[wx2],4
|
||
pop ecx
|
||
loop .loopa
|
||
push es
|
||
mov ax,[selcB800]
|
||
mov es,ax
|
||
mov edi,10*160+30*2
|
||
mov esi,.message1
|
||
mov ecx,20
|
||
mov ah,31
|
||
.loopb
|
||
lodsb
|
||
stosw
|
||
loop .loopb
|
||
mov edi,12*160+30*2
|
||
mov esi,.message2
|
||
mov ecx,18
|
||
mov ah,31
|
||
.loopc
|
||
lodsb
|
||
stosw
|
||
loop .loopc
|
||
mov edi,14*160+30*2
|
||
mov esi,.message3
|
||
mov ecx,18
|
||
mov ah,31
|
||
.loopd
|
||
lodsb
|
||
stosw
|
||
loop .loopd
|
||
; set cursor to (10,50)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,10
|
||
mov dl,49
|
||
int 10h
|
||
mov byte[maxstrchar],4
|
||
mov dword[charmemloc],10*160+49*2
|
||
call getstring
|
||
cmp al,27
|
||
je near .exit
|
||
; convert to number
|
||
mov cl,bl
|
||
mov ch,bl
|
||
xor edx,edx
|
||
xor eax,eax
|
||
xor ebx,ebx
|
||
cmp cl,4
|
||
jna .nextnum2
|
||
mov cl,4
|
||
.nextnum2
|
||
sub ch,cl
|
||
mov bl,ch
|
||
cmp cl,0
|
||
je .skipconv2
|
||
.nextnum
|
||
shl dx,4
|
||
mov al,[numstr+ebx]
|
||
inc ebx
|
||
call converthex2num
|
||
add dx,ax
|
||
dec cl
|
||
jnz .nextnum
|
||
.skipconv2
|
||
; if ch = 1, then [numstr] is the value
|
||
; if ch = 2, then [numstr] SHL 4+[numstr+1] is the value
|
||
xor al,al
|
||
cmp ch,1
|
||
jne .check2
|
||
mov al,[numstr]
|
||
call converthex2num
|
||
jmp .endcheck
|
||
.check2
|
||
cmp ch,2
|
||
jne .endcheck
|
||
mov al,[numstr]
|
||
call converthex2num
|
||
shl al,4
|
||
mov ah,al
|
||
mov al,[numstr+1]
|
||
call converthex2num
|
||
add al,ah
|
||
.endcheck
|
||
xor ecx,ecx
|
||
xor ebx,ebx
|
||
mov cx,dx
|
||
mov bx,dx
|
||
add ebx,spcRam
|
||
mov [.value],cx
|
||
mov al,[ebx]
|
||
; set cursor to (12,46)
|
||
xor bh,bh
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,12
|
||
mov dl,46
|
||
int 10h
|
||
call printhex8
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,14
|
||
mov dl,47
|
||
int 10h
|
||
mov byte[maxstrchar],2
|
||
mov dword[charmemloc],14*160+47*2
|
||
call getstring
|
||
cmp al,27
|
||
je near .exit
|
||
xor al,al
|
||
cmp bl,1
|
||
jne .checktwo
|
||
mov al,[numstr]
|
||
call converthex2num
|
||
jmp .endconv
|
||
.checktwo
|
||
cmp bl,2
|
||
jne .endconv
|
||
mov al,[numstr]
|
||
call converthex2num
|
||
shl al,4
|
||
mov ah,al
|
||
mov al,[numstr+1]
|
||
call converthex2num
|
||
add al,ah
|
||
.endconv
|
||
xor ebx,ebx
|
||
xor ecx,ecx
|
||
mov bx,[.value]
|
||
add ebx,spcRam
|
||
mov [ebx],al
|
||
.exit
|
||
pop es
|
||
; set cursor to (0,0)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,0
|
||
mov dl,0
|
||
int 10h
|
||
jmp debugloopb
|
||
|
||
SECTION .data
|
||
.message1 db 'Enter Address : 0000'
|
||
.message2 db 'Previous Value: 00'
|
||
.message3 db 'Enter Value : 00'
|
||
.value dw 0
|
||
.bank db 0
|
||
SECTION .text
|
||
|
||
;*******************************************************
|
||
; SPCBreakPoint Draws Window and Input Breakpoint
|
||
;*******************************************************
|
||
|
||
NEWSYM SPCbreakpoint
|
||
mov byte[clearchar],'0'
|
||
mov byte[hexok],1
|
||
mov byte[wx],24
|
||
mov byte[wx2],56
|
||
mov byte[wy],11
|
||
mov byte[wy2],13
|
||
mov cx,4000
|
||
call delay
|
||
call drawwindow
|
||
push es
|
||
mov ax,[selcB800]
|
||
mov es,ax
|
||
mov edi,12*160+30*2
|
||
mov esi,.message1
|
||
mov ecx,20
|
||
mov ah,31
|
||
.loopb
|
||
lodsb
|
||
stosw
|
||
loop .loopb
|
||
; set cursor to (10,50)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,12
|
||
mov dl,49
|
||
int 10h
|
||
mov byte[maxstrchar],4
|
||
mov dword[charmemloc],12*160+49*2
|
||
xor ebx,ebx
|
||
call getstring
|
||
cmp al,27
|
||
je near .exit
|
||
; convert to number
|
||
mov cl,bl
|
||
mov ch,bl
|
||
xor edx,edx
|
||
xor eax,eax
|
||
xor ebx,ebx
|
||
cmp cl,4
|
||
jna .nextnum2
|
||
mov cl,4
|
||
.nextnum2
|
||
sub ch,cl
|
||
mov bl,ch
|
||
cmp cl,0
|
||
je .skipconv2
|
||
.nextnum
|
||
shl dx,4
|
||
mov al,[numstr+ebx]
|
||
inc ebx
|
||
call converthex2num
|
||
add dx,ax
|
||
dec cl
|
||
jnz .nextnum
|
||
.skipconv2
|
||
; if ch = 1, then [numstr] is the value
|
||
; if ch = 2, then [numstr] SHL 4+[numstr+1] is the value
|
||
xor al,al
|
||
cmp ch,1
|
||
jne .check2
|
||
mov al,[numstr]
|
||
call converthex2num
|
||
jmp .endcheck
|
||
.check2
|
||
cmp ch,2
|
||
jne .endcheck
|
||
mov al,[numstr]
|
||
call converthex2num
|
||
shl al,4
|
||
mov ah,al
|
||
mov al,[numstr+1]
|
||
call converthex2num
|
||
add al,ah
|
||
.endcheck
|
||
xor ecx,ecx
|
||
xor ebx,ebx
|
||
mov cx,dx
|
||
call SPCbreakops
|
||
pop es
|
||
; set cursor to (0,0)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,0
|
||
mov dl,0
|
||
int 10h
|
||
jmp debugloopa
|
||
.exit
|
||
pop es
|
||
; set cursor to (0,0)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,0
|
||
mov dl,0
|
||
int 10h
|
||
jmp debugloopb
|
||
|
||
SECTION .data
|
||
.message1 db 'Enter Address : 0000'
|
||
SECTION .text
|
||
|
||
PrevBreakPt dd 0
|
||
|
||
NEWSYM repeatbreakpoint
|
||
push es
|
||
mov ax,[selcB800]
|
||
mov es,ax
|
||
xor ecx,ecx
|
||
xor ebx,ebx
|
||
mov cx,[PrevBreakPt]
|
||
mov bl,[PrevBreakPt+2]
|
||
call breakops
|
||
; set cursor to (0,0)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,0
|
||
mov dl,0
|
||
int 10h
|
||
pop es
|
||
jmp debugloopa
|
||
|
||
;*******************************************************
|
||
; BreakPoint Draws Window and Input Breakpoint
|
||
;*******************************************************
|
||
|
||
NEWSYM breakpoint
|
||
mov byte[clearchar],'0'
|
||
mov byte[hexok],1
|
||
mov byte[wx],24
|
||
mov byte[wx2],56
|
||
mov byte[wy],11
|
||
mov byte[wy2],13
|
||
mov cx,4000
|
||
call delay
|
||
call drawwindow
|
||
push es
|
||
mov ax,[selcB800]
|
||
mov es,ax
|
||
mov edi,12*160+29*2
|
||
mov esi,.message1
|
||
mov ecx,22
|
||
mov ah,31
|
||
.loopb
|
||
lodsb
|
||
stosw
|
||
loop .loopb
|
||
; set cursor to (10,50)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,12
|
||
mov dl,50
|
||
int 10h
|
||
mov byte[maxstrchar],6
|
||
mov dword[charmemloc],12*160+50*2
|
||
call getstring
|
||
cmp al,27
|
||
je near .exit
|
||
; convert to number
|
||
mov cl,bl
|
||
mov ch,bl
|
||
xor edx,edx
|
||
xor eax,eax
|
||
xor ebx,ebx
|
||
cmp cl,4
|
||
jna .nextnum2
|
||
mov cl,4
|
||
.nextnum2
|
||
sub ch,cl
|
||
mov bl,ch
|
||
cmp cl,0
|
||
je .skipconv2
|
||
.nextnum
|
||
shl dx,4
|
||
mov al,[numstr+ebx]
|
||
inc ebx
|
||
call converthex2num
|
||
add dx,ax
|
||
dec cl
|
||
jnz .nextnum
|
||
.skipconv2
|
||
; if ch = 1, then [numstr] is the value
|
||
; if ch = 2, then [numstr] SHL 4+[numstr+1] is the value
|
||
xor al,al
|
||
cmp ch,1
|
||
jne .check2
|
||
mov al,[numstr]
|
||
call converthex2num
|
||
jmp .endcheck
|
||
.check2
|
||
cmp ch,2
|
||
jne .endcheck
|
||
mov al,[numstr]
|
||
call converthex2num
|
||
shl al,4
|
||
mov ah,al
|
||
mov al,[numstr+1]
|
||
call converthex2num
|
||
add al,ah
|
||
.endcheck
|
||
xor ecx,ecx
|
||
xor ebx,ebx
|
||
mov bl,al
|
||
mov cx,dx
|
||
call breakops
|
||
pop es
|
||
; set cursor to (0,0)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,0
|
||
mov dl,0
|
||
int 10h
|
||
jmp debugloopa
|
||
.exit
|
||
pop es
|
||
; set cursor to (0,0)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,0
|
||
mov dl,0
|
||
int 10h
|
||
jmp debugloopb
|
||
|
||
SECTION .data
|
||
.message1 db 'Enter Address : 000000'
|
||
SECTION .text
|
||
|
||
;*******************************************************
|
||
; Trace Draws Window and Inputs # of instructions
|
||
;*******************************************************
|
||
|
||
NEWSYM trace
|
||
mov byte[clearchar],32
|
||
mov byte[hexok],0
|
||
mov byte[wx],14
|
||
mov byte[wx2],65
|
||
mov byte[wy],11
|
||
mov byte[wy2],13
|
||
call drawwindow
|
||
push es
|
||
mov ax,[selcB800]
|
||
mov es,ax
|
||
mov edi,12*160+17*2
|
||
mov esi,.message1
|
||
mov ecx,34
|
||
mov ah,31
|
||
.loopb
|
||
lodsb
|
||
stosw
|
||
loop .loopb
|
||
mov edi,12*160+52*2
|
||
mov al,32
|
||
mov ah,79
|
||
mov ecx,9
|
||
rep stosw
|
||
; set cursor to (12,60)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,12
|
||
mov dl,60
|
||
int 10h
|
||
mov byte[maxstrchar],9
|
||
mov dword[charmemloc],12*160+60*2
|
||
call getstring
|
||
cmp al,27
|
||
je .notrace
|
||
cmp bl,0
|
||
je .notrace
|
||
; convert to string
|
||
mov esi,numstr
|
||
xor eax,eax
|
||
mov cl,bl
|
||
mov ebx,10
|
||
.loopc
|
||
mul ebx
|
||
xor edx,edx
|
||
mov dl,[esi]
|
||
sub dl,30h
|
||
inc esi
|
||
add eax,edx
|
||
dec cl
|
||
jnz .loopc
|
||
mov [num2trace], eax
|
||
; start tracing
|
||
call traceops
|
||
pop es
|
||
; set cursor to (0,0)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,0
|
||
mov dl,0
|
||
int 10h
|
||
jmp debugloopa
|
||
.notrace
|
||
pop es
|
||
; set cursor to (0,0)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,0
|
||
mov dl,0
|
||
int 10h
|
||
jmp debugloopb
|
||
|
||
SECTION .data
|
||
.message1 db 'Enter # of Instructions to Trace :'
|
||
NEWSYM num2trace, dd 0
|
||
SECTION .text
|
||
;*******************************************************
|
||
; Convert Hex 2 Num Converts Hex ASCII to Hex in AL
|
||
;*******************************************************
|
||
|
||
NEWSYM converthex2num
|
||
sub al,'0'
|
||
cmp al,9
|
||
jna .skipconv
|
||
sub al,'A'-'9'-1
|
||
.skipconv
|
||
ret
|
||
|
||
;*******************************************************
|
||
; TraceOps Traces [num2trace] # of opcodes
|
||
;*******************************************************
|
||
|
||
NEWSYM traceops
|
||
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+20*2
|
||
mov esi,.message1
|
||
mov ecx,28
|
||
mov ah,31
|
||
.loopb
|
||
lodsb
|
||
stosw
|
||
loop .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
|
||
mov ah,0bh
|
||
int 21h
|
||
test al,0FFh
|
||
jz .skipa
|
||
mov ah,07h
|
||
int 21h
|
||
cmp al,27
|
||
je .skipc
|
||
.skipa
|
||
dec dword[num2trace]
|
||
jnz .loopa
|
||
.skipc
|
||
; copy back data
|
||
mov [spcPCRam],ebp
|
||
mov [Curtableaddr],edi
|
||
mov [xp],dl
|
||
mov [curcyc],dh
|
||
|
||
mov bl,[xpb]
|
||
mov eax,[initaddrl]
|
||
sub esi,eax ; subtract program counter by address
|
||
mov [xpc],si
|
||
ret
|
||
|
||
.message1 db 'Tracing. Press ESC to stop.'
|
||
|
||
;*******************************************************
|
||
; SPCBreakOps Breaks at Breakpoint @ SPC
|
||
;*******************************************************
|
||
|
||
NEWSYM SPCbreakops
|
||
; set cursor to (12,60)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,12
|
||
mov dl,60
|
||
int 10h
|
||
xor eax,eax
|
||
mov ax,cx
|
||
add eax,spcRam
|
||
mov [breakarea],eax
|
||
|
||
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
|
||
loop .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
|
||
mov ah,0bh
|
||
int 21h
|
||
test al,0FFh
|
||
jz .skipa
|
||
mov ah,07h
|
||
int 21h
|
||
cmp al,27
|
||
je .skipc
|
||
.skipa
|
||
mov eax,[breakarea]
|
||
cmp ebp,eax
|
||
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
|
||
|
||
.message1 db 'Locating Breakpoint ... Press ESC to stop.'
|
||
|
||
;*******************************************************
|
||
; BreakatSign Breaks whenever debstop = 1
|
||
;*******************************************************
|
||
|
||
NEWSYM breakatsign
|
||
push es
|
||
mov byte[debstop3],0
|
||
; set cursor to (12,60)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,12
|
||
mov dl,60
|
||
int 10h
|
||
xor eax,eax
|
||
mov ax,cx
|
||
add eax,spcRam
|
||
mov [breakarea],eax
|
||
|
||
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
|
||
loop .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
|
||
mov ah,0bh
|
||
int 21h
|
||
test al,0FFh
|
||
jz .skipa
|
||
mov ah,07h
|
||
int 21h
|
||
cmp al,27
|
||
je .skipc
|
||
.skipa
|
||
mov al,[dmadata+01h]
|
||
and al,0F0h
|
||
cmp al,40h
|
||
je .skipc2
|
||
mov al,[dmadata+11h]
|
||
and al,0F0h
|
||
cmp al,40h
|
||
je .skipc2
|
||
mov al,[dmadata+21h]
|
||
and al,0F0h
|
||
cmp al,40h
|
||
je .skipc2
|
||
mov al,[dmadata+31h]
|
||
and al,0F0h
|
||
cmp al,40h
|
||
je .skipc2
|
||
mov al,[dmadata+41h]
|
||
and al,0F0h
|
||
cmp al,40h
|
||
je .skipc2
|
||
mov al,[dmadata+51h]
|
||
and al,0F0h
|
||
cmp al,40h
|
||
je .skipc2
|
||
mov al,[dmadata+61h]
|
||
and al,0F0h
|
||
cmp al,40h
|
||
je .skipc2
|
||
mov al,[dmadata+71h]
|
||
and al,0F0h
|
||
cmp al,40h
|
||
je .skipc2
|
||
.skipc2
|
||
mov eax,[ram7f]
|
||
cmp byte[debstop3],1
|
||
jne near .loopa
|
||
mov byte[debstop3],0
|
||
.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
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,0
|
||
mov dl,0
|
||
int 10h
|
||
pop es
|
||
jmp debugloopa
|
||
|
||
.message1 db 'Waiting for Signal .... Press ESC to stop.'
|
||
|
||
;*******************************************************
|
||
; BreakatSign&Log Breaks whenever debstop = 1
|
||
;*******************************************************
|
||
|
||
NEWSYM breakatsignlog
|
||
push es
|
||
mov byte[debstop3],0
|
||
; set cursor to (12,60)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,12
|
||
mov dl,60
|
||
int 10h
|
||
xor eax,eax
|
||
mov ax,cx
|
||
add eax,spcRam
|
||
mov [breakarea],eax
|
||
|
||
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
|
||
loop .loopb
|
||
|
||
pushad
|
||
mov ax,ds
|
||
mov es,ax
|
||
mov edx,.logfname
|
||
call Create_File
|
||
mov [.handle],ax
|
||
popad
|
||
|
||
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
|
||
|
||
pushad
|
||
mov ax,ds
|
||
mov es,ax
|
||
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
|
||
mov edi,.loggeddata
|
||
call nextopcode.outputbuffer
|
||
mov byte[edi],13
|
||
mov byte[edi+1],10
|
||
mov byte[edi+2],0
|
||
mov eax,.loggeddata
|
||
call StringLength
|
||
mov edx,.loggeddata
|
||
mov bx,[.handle]
|
||
call Write_File
|
||
popad
|
||
|
||
call splitflags
|
||
call execsingle
|
||
call joinflags
|
||
mov dh,[pdh]
|
||
inc dword[numinst]
|
||
cmp byte[numinst],0
|
||
jne .skipa
|
||
mov ah,0bh
|
||
int 21h
|
||
test al,0FFh
|
||
jz .skipa
|
||
mov ah,07h
|
||
int 21h
|
||
cmp al,27
|
||
je .skipc
|
||
.skipa
|
||
; cmp byte[spcRam+6],40h
|
||
; je .skipc
|
||
mov eax,[ram7f]
|
||
jmp .loopa
|
||
; cmp byte[debstop3],1
|
||
; jne .loopa
|
||
.skipc
|
||
mov byte[debstop3],0
|
||
; 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
|
||
|
||
mov bx,[.handle]
|
||
call Close_File
|
||
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,0
|
||
mov dl,0
|
||
int 10h
|
||
pop es
|
||
jmp debugloopa
|
||
|
||
|
||
; mov edx,.logfname
|
||
; call Create_File
|
||
; mov [.handle],ax
|
||
|
||
|
||
jmp .blah
|
||
pushad
|
||
mov ax,ds
|
||
mov es,ax
|
||
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
|
||
mov edi,.loggeddata
|
||
call nextopcode.outputbuffer
|
||
mov byte[edi],13
|
||
mov byte[edi+1],10
|
||
mov byte[edi+2],0
|
||
mov eax,.loggeddata
|
||
call StringLength
|
||
mov edx,.loggeddata
|
||
mov bx,[.handle]
|
||
call Write_File
|
||
popad
|
||
.blah
|
||
|
||
mov bx,[.handle]
|
||
call Close_File
|
||
|
||
.loggeddata times 128 db 0
|
||
.message1 db 'Waiting for Signal .... Press ESC to stop.',0
|
||
.handle dw 0
|
||
.logfname db 'debug.log',0
|
||
|
||
;*******************************************************
|
||
; BreakatSignB Breaks whenever keyonsn = 1
|
||
;*******************************************************
|
||
|
||
NEWSYM keyonsn, db 0
|
||
NEWSYM prbreak, db 0
|
||
|
||
NEWSYM breakatsignb
|
||
mov byte[keyonsn],0
|
||
mov byte[prbreak],0
|
||
mov byte[debuggeron],1
|
||
|
||
mov byte[exiter],01h
|
||
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
|
||
call Check_Key
|
||
test al,0FFh
|
||
jz .skipa
|
||
call Get_Key
|
||
cmp al,27
|
||
je .skipc
|
||
.skipa
|
||
cmp byte[spcRam+6],40h
|
||
je .skipc
|
||
cmp byte[keyonsn],1
|
||
jne .loopa
|
||
jmp .noesc
|
||
.skipc
|
||
mov byte[prbreak],1
|
||
.noesc
|
||
; 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
|
||
mov byte[exiter],0
|
||
mov byte[debuggeron],0
|
||
ret
|
||
|
||
;*******************************************************
|
||
; BreakatSignC Breaks whenever sndwrit = 1
|
||
;*******************************************************
|
||
|
||
NEWSYM sndwrit, db 0
|
||
|
||
NEWSYM breakatsignc
|
||
mov byte[prbreak],0
|
||
mov byte[sndwrit],0
|
||
mov byte[debuggeron],1
|
||
|
||
mov byte[exiter],01h
|
||
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
|
||
mov ah,0bh
|
||
int 21h
|
||
test al,0FFh
|
||
jz .skipa
|
||
mov ah,07h
|
||
int 21h
|
||
cmp al,27
|
||
je .skipc
|
||
.skipa
|
||
cmp byte[spcRam+6],40h
|
||
je .skipc
|
||
cmp byte[sndwrit],1
|
||
jne .loopa
|
||
jmp .noesc
|
||
.skipc
|
||
mov byte[prbreak],1
|
||
.noesc
|
||
; 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
|
||
mov byte[exiter],0
|
||
mov byte[debuggeron],0
|
||
ret
|
||
|
||
;*******************************************************
|
||
; BreakOps Breaks at Breakpoint
|
||
;*******************************************************
|
||
|
||
NEWSYM breakops
|
||
; set cursor to (12,60)
|
||
mov [PrevBreakPt],cx
|
||
mov [PrevBreakPt+2],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
|
||
|
||
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
|
||
loop .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
|
||
mov ah,0bh
|
||
int 21h
|
||
test al,0FFh
|
||
jz .skipa
|
||
mov ah,07h
|
||
int 21h
|
||
cmp al,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
|
||
.message1 db 'Locating Breakpoint ... Press ESC to stop.'
|
||
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
|
||
|
||
;*******************************************************
|
||
; Start Display
|
||
;*******************************************************
|
||
; use [debugbuf], 1000 pages of 77
|
||
|
||
NEWSYM startdisplay
|
||
push es
|
||
mov ax,[selcB800]
|
||
mov es,ax
|
||
; clear the screen
|
||
mov edi,0
|
||
mov ecx,1000
|
||
mov eax,0F000F00h
|
||
rep stosd
|
||
; draw to screen
|
||
mov edi,0
|
||
mov ax,0F00h
|
||
stosw
|
||
mov edi,160
|
||
mov al,213
|
||
mov al,[CurrentCPU]
|
||
add al,48
|
||
mov ah,31
|
||
stosw
|
||
mov al,205
|
||
mov cx,15
|
||
rep stosw
|
||
mov al,32
|
||
stosw
|
||
mov al,'C'
|
||
stosw
|
||
stosw
|
||
mov al,':'
|
||
stosw
|
||
mov al,' '
|
||
mov cl,4
|
||
rep stosw
|
||
mov al,'Y'
|
||
stosw
|
||
mov al,':'
|
||
stosw
|
||
mov al,' '
|
||
mov cl,4
|
||
rep stosw
|
||
mov al,205
|
||
mov cx,19
|
||
rep stosw
|
||
mov al,32
|
||
stosw
|
||
mov al,'-'
|
||
mov cx,11
|
||
rep stosw
|
||
mov al,32
|
||
stosw
|
||
mov al,205
|
||
mov cx,16
|
||
rep stosw
|
||
mov al,184
|
||
stosw
|
||
mov edi,320
|
||
mov bl,20
|
||
.loopa
|
||
mov al,179
|
||
stosw
|
||
mov al,32
|
||
mov cx,77
|
||
rep stosw
|
||
mov al,179
|
||
stosw
|
||
mov al,177
|
||
mov ah,7
|
||
stosw
|
||
mov ah,31
|
||
dec bl
|
||
jnz .loopa
|
||
mov al,192
|
||
stosw
|
||
mov al,196
|
||
mov cx,77
|
||
rep stosw
|
||
mov al,217
|
||
stosw
|
||
mov ah,7
|
||
mov al,177
|
||
stosw
|
||
add edi,2
|
||
mov cx,79
|
||
rep stosw
|
||
; print debugger information
|
||
mov edi,4
|
||
mov esi,.debuginfo
|
||
mov ah,15
|
||
call .printinfo
|
||
mov edi,160+8 ; (X:4,Y:1)
|
||
mov esi,.D65816
|
||
mov ah,31
|
||
call .printinfo
|
||
mov edi,160*24 ; (X:0,Y:24)
|
||
mov esi,.mbar
|
||
mov ah,15
|
||
call .printinfo
|
||
pop es
|
||
ret
|
||
|
||
.printinfo
|
||
.loopprint
|
||
lodsb
|
||
cmp al,'$'
|
||
je .doneprint
|
||
cmp al,'@'
|
||
je .changecol
|
||
stosw
|
||
jmp .loopprint
|
||
.changecol
|
||
lodsb
|
||
mov ah,al
|
||
sub ah,40
|
||
jmp .loopprint
|
||
.doneprint
|
||
ret
|
||
|
||
.debuginfo db '- @5Z@4S@3N@2E@6S@7 debugger -$'
|
||
.D65816 db ' 65816 $'
|
||
.mbar db '@4(@6T@4)@7race for @4(@6B@4)@7reakpoint '
|
||
db '@4(@6Enter@4)@7 Next '
|
||
db '@4(@6M@4)@7odify @4(@6F9@4)@7 Signal @4(@6F1@4)@7 Run$'
|
||
|
||
;*******************************************************
|
||
; Next Opcode Writes the next opcode & regs
|
||
;*******************************************************
|
||
; 008000 STZ $123456,x A:0000 X:0000 Y:0000 S:01FF DB:00 D:0000 P:33 E+
|
||
NEWSYM nextopcode
|
||
push es
|
||
mov es,[selcB800]
|
||
mov edi,160+100
|
||
mov eax,[numinst]
|
||
mov byte[.addernum],11
|
||
mov byte[.charprin],'-'
|
||
call .printnum
|
||
xor eax,eax
|
||
mov al,byte[curcyc]
|
||
mov byte[.addernum],3
|
||
mov edi,160+40
|
||
mov byte[.charprin],' '
|
||
call .printnum
|
||
mov edi,160+52
|
||
mov ax,word[curypos]
|
||
call .printnum
|
||
pop es
|
||
; set output pointer
|
||
mov edi,[debugbuf] ; set write pointer
|
||
inc edi
|
||
xor eax,eax
|
||
mov ax,[debugt]
|
||
push bx
|
||
mov bx,77
|
||
mul bx
|
||
pop bx
|
||
add edi,eax
|
||
|
||
call .outputbuffer
|
||
|
||
; increment tail/head
|
||
call .addtail
|
||
cmp word[debugh],0
|
||
jne .changeview
|
||
cmp word[debugt],21
|
||
jb .nochangeview
|
||
.changeview
|
||
mov ax,[debugt]
|
||
sub ax,20
|
||
jns .notneg
|
||
add ax,100
|
||
.notneg
|
||
mov [debugv],ax
|
||
jmp .finchangeview
|
||
.nochangeview
|
||
mov word[debugv],0
|
||
.finchangeview
|
||
; set cursor to (1,1)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,0
|
||
mov dl,0
|
||
int 10h
|
||
ret
|
||
|
||
.outputbuffer
|
||
; output pb/pc
|
||
mov al,[xpb]
|
||
call .printhex8
|
||
mov ax,[xpc]
|
||
call .printhex16
|
||
mov al,32
|
||
stosb
|
||
|
||
; output instruction
|
||
xor ebx,ebx
|
||
mov bl,[xpb]
|
||
xor eax,eax
|
||
mov ax,[xpc]
|
||
test ax,8000h
|
||
jz .loweraddr
|
||
mov ebx,[snesmmap+ebx*4]
|
||
jmp .skiplower
|
||
.loweraddr
|
||
cmp ax,4300h
|
||
jb .lower
|
||
cmp dword[memtabler8+ebx*4],regaccessbankr8
|
||
je .dma
|
||
.lower
|
||
mov ebx,[snesmap2+ebx*4]
|
||
jmp .skiplower
|
||
.dma
|
||
mov ebx,dmadata-4300h
|
||
.skiplower
|
||
add ebx,eax ; add program counter to address
|
||
xor ah,ah
|
||
mov al,[ebx] ; get instruction number
|
||
mov esi,ocname
|
||
shl eax,2
|
||
add esi,eax
|
||
mov ecx,4
|
||
rep movsb
|
||
call .outaddrmode
|
||
|
||
; output registers
|
||
mov al,'A'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov ax,[xa]
|
||
call .printhex16
|
||
mov al,32
|
||
stosb
|
||
mov al,'X'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov ax,[xx]
|
||
call .printhex16
|
||
mov al,32
|
||
stosb
|
||
mov al,'Y'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov ax,[xy]
|
||
call .printhex16
|
||
mov al,32
|
||
stosb
|
||
mov al,'S'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov ax,[xs]
|
||
call .printhex16
|
||
mov al,32
|
||
stosb
|
||
mov al,'D'
|
||
stosb
|
||
mov al,'B'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov al,[xdb]
|
||
call .printhex8
|
||
mov al,32
|
||
stosb
|
||
mov al,'D'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov ax,[xd]
|
||
call .printhex16
|
||
mov al,32
|
||
stosb
|
||
mov al,'P'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov al,[xp]
|
||
call .printhex8
|
||
mov al,32
|
||
stosb
|
||
mov al,'E'
|
||
stosb
|
||
mov al,'-'
|
||
cmp byte[xe],1
|
||
jne .nopos
|
||
mov al,'+'
|
||
.nopos
|
||
stosb
|
||
ret
|
||
|
||
.addtail
|
||
inc word[debugt]
|
||
cmp word[debugt],100
|
||
jne .nowrap
|
||
mov word[debugt],0
|
||
.nowrap
|
||
mov ax,[debugt]
|
||
cmp ax,[debugh]
|
||
jne .nohead
|
||
inc word[debugh]
|
||
.nohead
|
||
cmp word[debugh],100
|
||
jne .nowrap2
|
||
mov word[debugh],0
|
||
.nowrap2
|
||
ret
|
||
|
||
SECTION .data
|
||
.addernum db 0
|
||
.charprin db 0
|
||
SECTION .text
|
||
|
||
.printnum
|
||
; process through each digit
|
||
push edx
|
||
push eax
|
||
push ebx
|
||
push cx
|
||
xor ebx,ebx ; quotent variable
|
||
xor edx,edx ; clear high byte
|
||
xor cx,cx ; clear counter variable
|
||
mov ebx,10
|
||
.loopa2
|
||
div ebx ; get quotent and remainder
|
||
push dx ; store number to stack
|
||
inc cl
|
||
xor edx,edx
|
||
test eax,0FFFFFFFFh
|
||
jnz .loopa2
|
||
xor eax,eax
|
||
mov al,byte[.addernum]
|
||
xor ah,ah
|
||
sub ax,cx
|
||
cmp ax,0
|
||
je .loopb4
|
||
.loopb3
|
||
push ax
|
||
mov al,[.charprin]
|
||
mov ah,31
|
||
stosw
|
||
pop ax
|
||
dec ax
|
||
jnz .loopb3
|
||
.loopb4
|
||
.loopb2
|
||
pop ax ; get number back from stack
|
||
add al,30h ; adjust to ASCII value
|
||
mov ah,31
|
||
stosw
|
||
dec cl
|
||
jnz .loopb2
|
||
pop cx
|
||
pop ebx
|
||
pop eax
|
||
pop edx
|
||
ret
|
||
|
||
; Outputs the rest of the instruction depending on the address mode
|
||
|
||
.outaddrmode
|
||
mov esi,ebx
|
||
xor ebx,ebx
|
||
mov bl,[esi]
|
||
mov ah,[addrmode+ebx]
|
||
cmp ah,0
|
||
jne .check1
|
||
jmp .out0
|
||
.check1
|
||
cmp ah,1
|
||
jne .check2
|
||
jmp .out1
|
||
.check2
|
||
cmp ah,2
|
||
jne .check3
|
||
jmp .out2
|
||
.check3
|
||
cmp ah,3
|
||
jne .check4
|
||
jmp .out3
|
||
.check4
|
||
cmp ah,4
|
||
jne .check5
|
||
jmp .out4
|
||
.check5
|
||
cmp ah,5
|
||
jne .check6
|
||
jmp .out5
|
||
.check6
|
||
cmp ah,6
|
||
jne .check7
|
||
jmp .out6
|
||
.check7
|
||
cmp ah,7
|
||
jne .check8
|
||
jmp .out7
|
||
.check8
|
||
cmp ah,8
|
||
jne .check9
|
||
jmp .out8
|
||
.check9
|
||
cmp ah,10
|
||
jne .check11
|
||
jmp .out10
|
||
.check11
|
||
cmp ah,11
|
||
jne .check12
|
||
jmp .out11
|
||
.check12
|
||
cmp ah,12
|
||
jne .check13
|
||
jmp .out12
|
||
.check13
|
||
cmp ah,13
|
||
jne .check14
|
||
jmp .out13
|
||
.check14
|
||
cmp ah,14
|
||
jne .check15
|
||
jmp .out14
|
||
.check15
|
||
cmp ah,15
|
||
jne .check16
|
||
jmp .out15
|
||
.check16
|
||
cmp ah,16
|
||
jne .check17
|
||
jmp .out16
|
||
.check17
|
||
cmp ah,17
|
||
jne .check18
|
||
jmp .out17
|
||
.check18
|
||
cmp ah,18
|
||
jne .check19
|
||
jmp .out18
|
||
.check19
|
||
cmp ah,19
|
||
jne .check20
|
||
jmp .out19
|
||
.check20
|
||
cmp ah,20
|
||
jne .check21
|
||
jmp .out20
|
||
.check21
|
||
cmp ah,21
|
||
jne .check22
|
||
jmp .out21
|
||
.check22
|
||
cmp ah,22
|
||
jne .check23
|
||
jmp .out22
|
||
.check23
|
||
cmp ah,23
|
||
jne .check24
|
||
jmp .out23
|
||
.check24
|
||
cmp ah,24
|
||
jne .check25
|
||
jmp .out24
|
||
.check25
|
||
cmp ah,25
|
||
jne .check26
|
||
jmp .out25
|
||
.check26
|
||
jmp .out26
|
||
ret
|
||
|
||
; each mode must output 10 characters
|
||
|
||
.out0 ;
|
||
mov al,32
|
||
mov ecx,10
|
||
rep stosb
|
||
ret
|
||
|
||
.out1 ; #$12,#$1234 (M-flag)
|
||
mov al,'#'
|
||
stosb
|
||
mov al,'$'
|
||
stosb
|
||
test byte[xp],20h
|
||
jz .out116b
|
||
mov al,[esi+1]
|
||
call .printhex8
|
||
mov ecx,6
|
||
mov al,32
|
||
rep stosb
|
||
ret
|
||
.out116b
|
||
mov ax,[esi+1]
|
||
call .printhex16
|
||
mov ecx,4
|
||
mov al,32
|
||
rep stosb
|
||
ret
|
||
|
||
.out2 ; $1234
|
||
mov al,'$'
|
||
stosb
|
||
mov ax,[esi+1]
|
||
call .printhex16
|
||
mov al,32
|
||
mov ecx,5
|
||
rep stosb
|
||
ret
|
||
|
||
.out3 ; $123456
|
||
mov al,'$'
|
||
stosb
|
||
mov al,[esi+3]
|
||
call .printhex8
|
||
mov ax,[esi+1]
|
||
call .printhex16
|
||
mov al,32
|
||
mov ecx,3
|
||
rep stosb
|
||
ret
|
||
|
||
.out4 ; $12
|
||
mov al,'$'
|
||
stosb
|
||
mov al,[esi+1]
|
||
call .printhex8
|
||
mov al,32
|
||
mov ecx,7
|
||
rep stosb
|
||
ret
|
||
|
||
.out5 ; A
|
||
mov al,'A'
|
||
stosb
|
||
mov ecx,9
|
||
mov al,32
|
||
rep stosb
|
||
ret
|
||
|
||
.out6 ; i
|
||
mov al,32
|
||
mov ecx,10
|
||
rep stosb
|
||
ret
|
||
|
||
.out7 ; ($12),y
|
||
mov al,'('
|
||
stosb
|
||
mov al,'$'
|
||
stosb
|
||
mov al,[esi+1]
|
||
call .printhex8
|
||
mov al,')'
|
||
stosb
|
||
mov al,','
|
||
stosb
|
||
mov al,'y'
|
||
stosb
|
||
mov al,32
|
||
mov ecx,3
|
||
rep stosb
|
||
ret
|
||
|
||
.out8 ; [$12],y
|
||
mov al,'['
|
||
stosb
|
||
mov al,'$'
|
||
stosb
|
||
mov al,[esi+1]
|
||
call .printhex8
|
||
mov al,']'
|
||
stosb
|
||
mov al,','
|
||
stosb
|
||
mov al,'y'
|
||
stosb
|
||
mov al,32
|
||
mov ecx,3
|
||
rep stosb
|
||
ret
|
||
|
||
.out9 ; ($12,x)
|
||
mov al,'('
|
||
stosb
|
||
mov al,'$'
|
||
stosb
|
||
mov al,[esi+1]
|
||
call .printhex8
|
||
mov al,','
|
||
stosb
|
||
mov al,'x'
|
||
stosb
|
||
mov al,')'
|
||
stosb
|
||
mov al,32
|
||
mov ecx,3
|
||
rep stosb
|
||
ret
|
||
|
||
.out10 ; $12,x
|
||
mov al,'$'
|
||
stosb
|
||
mov al,[esi+1]
|
||
call .printhex8
|
||
mov al,','
|
||
stosb
|
||
mov al,'x'
|
||
stosb
|
||
mov al,32
|
||
mov ecx,5
|
||
rep stosb
|
||
ret
|
||
|
||
.out11 ; $12,y
|
||
mov al,'$'
|
||
stosb
|
||
mov al,[esi+1]
|
||
call .printhex8
|
||
mov al,','
|
||
stosb
|
||
mov al,'y'
|
||
stosb
|
||
mov al,32
|
||
mov ecx,5
|
||
rep stosb
|
||
ret
|
||
|
||
.out12 ; $1234,x
|
||
mov al,'$'
|
||
stosb
|
||
mov ax,[esi+1]
|
||
call .printhex16
|
||
mov al,','
|
||
stosb
|
||
mov al,'x'
|
||
stosb
|
||
mov al,32
|
||
mov ecx,3
|
||
rep stosb
|
||
ret
|
||
|
||
.out13 ; $1234,y
|
||
mov al,'$'
|
||
stosb
|
||
mov ax,[esi+1]
|
||
call .printhex16
|
||
mov al,','
|
||
stosb
|
||
mov al,'y'
|
||
stosb
|
||
mov al,32
|
||
mov ecx,3
|
||
rep stosb
|
||
ret
|
||
|
||
.out14 ; $123456,x
|
||
mov al,'$'
|
||
stosb
|
||
mov al,[esi+3]
|
||
call .printhex8
|
||
mov ax,[esi+1]
|
||
call .printhex16
|
||
mov al,','
|
||
stosb
|
||
mov al,'x'
|
||
stosb
|
||
mov al,32
|
||
mov ecx,1
|
||
rep stosb
|
||
ret
|
||
|
||
.out15 ; +-$12 / $1234
|
||
mov al,'$'
|
||
stosb
|
||
mov al,[esi+1]
|
||
cbw
|
||
add ax,[xpc]
|
||
add ax,2
|
||
call .printhex16
|
||
mov al,32
|
||
mov ecx,5
|
||
rep stosb
|
||
ret
|
||
|
||
.out16 ; +-$1234 / $1234
|
||
mov al,'$'
|
||
stosb
|
||
mov ax,[esi+1]
|
||
add ax,[xpc]
|
||
call .printhex16
|
||
mov al,32
|
||
mov ecx,5
|
||
rep stosb
|
||
ret
|
||
|
||
.out17 ; ($1234)
|
||
mov al,'('
|
||
stosb
|
||
mov al,'$'
|
||
stosb
|
||
mov ax,[esi+1]
|
||
call .printhex16
|
||
mov al,')'
|
||
stosb
|
||
mov al,32
|
||
mov ecx,3
|
||
rep stosb
|
||
ret
|
||
|
||
.out18 ; ($12)
|
||
mov al,'('
|
||
stosb
|
||
mov al,'$'
|
||
stosb
|
||
mov al,[esi+1]
|
||
call .printhex8
|
||
mov al,')'
|
||
stosb
|
||
mov al,32
|
||
mov ecx,5
|
||
rep stosb
|
||
ret
|
||
|
||
.out19 ; [$12]
|
||
mov al,'['
|
||
stosb
|
||
mov al,'$'
|
||
stosb
|
||
mov al,[esi+1]
|
||
call .printhex8
|
||
mov al,']'
|
||
stosb
|
||
mov al,32
|
||
mov ecx,5
|
||
rep stosb
|
||
ret
|
||
|
||
.out20 ; ($1234,x)
|
||
mov al,'('
|
||
stosb
|
||
mov al,'$'
|
||
stosb
|
||
mov ax,[esi+1]
|
||
call .printhex16
|
||
mov al,','
|
||
stosb
|
||
mov al,'x'
|
||
stosb
|
||
mov al,')'
|
||
stosb
|
||
mov al,32
|
||
mov ecx,1
|
||
rep stosb
|
||
ret
|
||
|
||
.out21 ; s
|
||
mov al,32
|
||
mov ecx,10
|
||
rep stosb
|
||
ret
|
||
|
||
.out22 ; d,s
|
||
mov al,'$'
|
||
stosb
|
||
mov al,[esi+1]
|
||
call .printhex8
|
||
mov al,','
|
||
stosb
|
||
mov al,'s'
|
||
stosb
|
||
mov al,32
|
||
mov ecx,5
|
||
rep stosb
|
||
ret
|
||
|
||
.out23 ; (d,s),y
|
||
mov al,'('
|
||
stosb
|
||
mov al,'$'
|
||
stosb
|
||
mov al,[esi+1]
|
||
call .printhex8
|
||
mov al,','
|
||
stosb
|
||
mov al,'s'
|
||
stosb
|
||
mov al,')'
|
||
stosb
|
||
mov al,','
|
||
stosb
|
||
mov al,'y'
|
||
stosb
|
||
mov al,32
|
||
mov ecx,1
|
||
rep stosb
|
||
ret
|
||
|
||
.out24 ; xyc - $1234
|
||
mov al,'$'
|
||
stosb
|
||
mov ax,[esi+1]
|
||
call .printhex16
|
||
mov al,32
|
||
mov ecx,5
|
||
rep stosb
|
||
ret
|
||
|
||
.out25 ; #$12 (Flag Operations)
|
||
mov al,'#'
|
||
stosb
|
||
mov al,'$'
|
||
stosb
|
||
mov al,[esi+1]
|
||
call .printhex8
|
||
mov ecx,6
|
||
mov al,32
|
||
rep stosb
|
||
ret
|
||
|
||
.out26 ; #$12,#$1234 (X-flag)
|
||
mov al,'#'
|
||
stosb
|
||
mov al,'$'
|
||
stosb
|
||
test byte[xp],10h
|
||
jz .out2616b
|
||
mov al,[esi+1]
|
||
call .printhex8
|
||
mov ecx,6
|
||
mov al,32
|
||
rep stosb
|
||
ret
|
||
|
||
.out2616b
|
||
mov ax,[esi+1]
|
||
call .printhex16
|
||
mov ecx,4
|
||
mov al,32
|
||
rep stosb
|
||
ret
|
||
|
||
.printhex16
|
||
mov ecx,4
|
||
.loopa
|
||
xor ebx,ebx
|
||
mov bx,ax
|
||
and bx,0F000h
|
||
shr bx,12
|
||
push ax
|
||
mov al,[.hexdat+ebx]
|
||
stosb
|
||
pop ax
|
||
shl ax,4
|
||
loop .loopa
|
||
ret
|
||
|
||
.printhex8
|
||
xor ah,ah
|
||
mov ecx,2
|
||
.loopb
|
||
xor ebx,ebx
|
||
mov bx,ax
|
||
and bx,0F0h
|
||
shr bx,4
|
||
push ax
|
||
mov al,[.hexdat+ebx]
|
||
stosb
|
||
pop ax
|
||
shl ax,4
|
||
loop .loopb
|
||
ret
|
||
|
||
.hexdat db '0123456789ABCDEF'
|
||
|
||
NEWSYM nextopcodesa1
|
||
push es
|
||
mov [.blah],dl
|
||
mov es,[selcB800]
|
||
mov edi,160+100
|
||
mov eax,[numinst]
|
||
mov byte[nextopcode.addernum],11
|
||
mov byte[nextopcode.charprin],'-'
|
||
call nextopcode.printnum
|
||
xor eax,eax
|
||
mov al,byte[curcyc]
|
||
mov byte[nextopcode.addernum],3
|
||
mov edi,160+40
|
||
mov byte[nextopcode.charprin],' '
|
||
call nextopcode.printnum
|
||
mov edi,160+52
|
||
mov ax,word[curypos]
|
||
call nextopcode.printnum
|
||
pop es
|
||
; set output pointer
|
||
mov edi,[debugbuf] ; set write pointer
|
||
inc edi
|
||
xor eax,eax
|
||
mov ax,[debugt]
|
||
push bx
|
||
mov bx,77
|
||
mul bx
|
||
pop bx
|
||
add edi,eax
|
||
|
||
call .outputtobuffer
|
||
|
||
mov al,' '
|
||
stosb
|
||
stosb
|
||
stosb
|
||
|
||
; increment tail/head
|
||
call nextopcode.addtail
|
||
cmp word[debugh],0
|
||
jne .changeview
|
||
cmp word[debugt],21
|
||
jb .nochangeview
|
||
.changeview
|
||
mov ax,[debugt]
|
||
sub ax,20
|
||
jns .notneg
|
||
add ax,100
|
||
.notneg
|
||
mov [debugv],ax
|
||
jmp .finchangeview
|
||
.nochangeview
|
||
mov word[debugv],0
|
||
.finchangeview
|
||
; set cursor to (1,1)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,0
|
||
mov dl,0
|
||
int 10h
|
||
ret
|
||
.blah db 0
|
||
|
||
.outputtobuffer
|
||
; output pb/pc
|
||
mov al,[SA1xpb]
|
||
call nextopcode.printhex8
|
||
mov ax,[SA1xpc]
|
||
call nextopcode.printhex16
|
||
mov al,'-'
|
||
stosb
|
||
|
||
; output instruction
|
||
xor ebx,ebx
|
||
mov bl,[SA1xpb]
|
||
xor eax,eax
|
||
mov ax,[SA1xpc]
|
||
test ax,8000h
|
||
jz .loweraddr
|
||
mov ebx,[snesmmap+ebx*4]
|
||
jmp .skiplower
|
||
.loweraddr
|
||
cmp ax,4300h
|
||
jb .lower
|
||
cmp dword[memtabler8+ebx*4],regaccessbankr8
|
||
je .dma
|
||
.lower
|
||
mov ebx,[snesmap2+ebx*4]
|
||
jmp .skiplower
|
||
.dma
|
||
mov ebx,dmadata-4300h
|
||
.skiplower
|
||
add ebx,eax ; add program counter to address
|
||
xor ah,ah
|
||
mov al,[ebx] ; get instruction number
|
||
mov esi,ocname
|
||
shl eax,2
|
||
add esi,eax
|
||
mov ecx,4
|
||
rep movsb
|
||
call nextopcode.outaddrmode
|
||
|
||
; output registers
|
||
mov al,'A'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov ax,[SA1xa]
|
||
call nextopcode.printhex16
|
||
mov al,32
|
||
stosb
|
||
mov al,'X'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov ax,[SA1xx]
|
||
call nextopcode.printhex16
|
||
mov al,32
|
||
stosb
|
||
mov al,'Y'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov ax,[SA1xy]
|
||
call nextopcode.printhex16
|
||
mov al,32
|
||
stosb
|
||
mov al,'S'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov ax,[SA1xs]
|
||
call nextopcode.printhex16
|
||
mov al,32
|
||
stosb
|
||
mov al,'D'
|
||
stosb
|
||
mov al,'B'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov al,[SA1xdb]
|
||
call nextopcode.printhex8
|
||
mov al,32
|
||
stosb
|
||
mov al,'D'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov ax,[SA1xd]
|
||
call nextopcode.printhex16
|
||
mov al,32
|
||
stosb
|
||
mov al,'P'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov al,[.blah]
|
||
call nextopcode.printhex8
|
||
ret
|
||
|
||
|
||
;*******************************************************
|
||
; Show Debug Display
|
||
;*******************************************************
|
||
|
||
NEWSYM showdd
|
||
; copy debug buffer on to screen
|
||
push es
|
||
mov es,[selcB800]
|
||
mov edi,160
|
||
mov al,[CurrentCPU]
|
||
add al,48
|
||
mov ah,31
|
||
stosw
|
||
|
||
mov edi,2*160+2 ; (X:2,Y:2)
|
||
mov esi,[debugbuf]
|
||
mov eax,0
|
||
mov ax,[debugv]
|
||
mov bx,77
|
||
mul bx
|
||
mov dx,[debugv]
|
||
add esi,eax
|
||
mov bl,20
|
||
.loopb
|
||
mov ah,31
|
||
mov ecx,77
|
||
.loopa
|
||
lodsb
|
||
stosw
|
||
loop .loopa
|
||
add edi,6
|
||
; check if exceeded limit
|
||
inc dx
|
||
cmp dx,100
|
||
jb .skipadd
|
||
xor dx,dx
|
||
sub esi,7700
|
||
.skipadd
|
||
dec bl
|
||
jnz .loopb
|
||
pop es
|
||
ret
|
||
|
||
;*******************************************************
|
||
; Clear Display Clears the Display
|
||
;*******************************************************
|
||
|
||
NEWSYM cleardisplay
|
||
push es
|
||
mov ax,[selcB800]
|
||
mov es,ax
|
||
; clear the screen
|
||
mov edi,0
|
||
mov ecx,1000
|
||
mov eax,07000700h
|
||
rep stosd
|
||
pop es
|
||
; set cursor to (0,0)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,0
|
||
mov dl,0
|
||
int 10h
|
||
ret
|
||
|
||
;*******************************************************
|
||
; Next SPC Opcode Writes the next opcode & regs
|
||
;*******************************************************
|
||
; 008000 STZ $123456,x A:0000 X:0000 Y:0000 S:01FF DB:00 D:0000 P:33 E+
|
||
NEWSYM nextspcopcode
|
||
cmp byte[soundon],0
|
||
jne .noret
|
||
ret
|
||
.noret
|
||
cmp byte[cycpbl],55
|
||
jb .noretb
|
||
ret
|
||
.noretb
|
||
; set output pointer
|
||
mov edi,[debugbuf] ; set write pointer
|
||
inc edi
|
||
xor eax,eax
|
||
mov ax,[debugt]
|
||
push bx
|
||
mov bx,77
|
||
mul bx
|
||
pop bx
|
||
add edi,eax
|
||
|
||
; output spc pc & opcode #
|
||
mov eax,[spcPCRam]
|
||
sub eax,spcRam
|
||
call .printhex16
|
||
mov al,'/'
|
||
stosb
|
||
mov ebx,[spcPCRam]
|
||
mov al,[ebx]
|
||
call .printhex8
|
||
mov al,32
|
||
stosb
|
||
|
||
; output instruction
|
||
mov ebx,[spcPCRam]
|
||
xor eax,eax
|
||
mov al,[ebx] ; get instruction number
|
||
mov esi,spcnametab
|
||
shl eax,3
|
||
add esi,eax
|
||
mov ecx,6
|
||
rep movsb
|
||
call .outaddrmode
|
||
|
||
mov al,'A'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov al,[spcA]
|
||
call .printhex8
|
||
mov al,32
|
||
stosb
|
||
mov al,'X'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov al,[spcX]
|
||
call .printhex8
|
||
mov al,32
|
||
stosb
|
||
mov al,'Y'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov al,[spcY]
|
||
call .printhex8
|
||
mov al,32
|
||
stosb
|
||
mov al,'S'
|
||
stosb
|
||
mov al,':'
|
||
stosb
|
||
mov al,[spcS]
|
||
call .printhex8
|
||
mov al,32
|
||
stosb
|
||
mov al,'N'
|
||
stosb
|
||
mov al,'+'
|
||
test byte[spcNZ],80h
|
||
jnz .noflaga
|
||
mov al,'-'
|
||
.noflaga
|
||
stosb
|
||
mov al,'O'
|
||
stosb
|
||
mov al,'+'
|
||
test byte[spcP],40h
|
||
jnz .noflagb
|
||
mov al,'-'
|
||
.noflagb
|
||
stosb
|
||
mov al,'D'
|
||
stosb
|
||
mov al,'+'
|
||
test byte[spcP],20h
|
||
jnz .noflagc
|
||
mov al,'-'
|
||
.noflagc
|
||
stosb
|
||
mov al,'?'
|
||
stosb
|
||
mov al,'+'
|
||
test byte[spcP],10h
|
||
jnz .noflagd
|
||
mov al,'-'
|
||
.noflagd
|
||
stosb
|
||
mov al,'H'
|
||
stosb
|
||
mov al,'+'
|
||
test byte[spcP],08h
|
||
jnz .noflage
|
||
mov al,'-'
|
||
.noflage
|
||
stosb
|
||
mov al,'I'
|
||
stosb
|
||
mov al,'+'
|
||
test byte[spcP],04h
|
||
jnz .noflagf
|
||
mov al,'-'
|
||
.noflagf
|
||
stosb
|
||
mov al,'Z'
|
||
stosb
|
||
mov al,'+'
|
||
test byte[spcNZ],0FFh
|
||
jz .noflagg
|
||
mov al,'-'
|
||
.noflagg
|
||
stosb
|
||
mov al,'C'
|
||
stosb
|
||
mov al,'+'
|
||
test byte[spcP],01h
|
||
jnz .noflagh
|
||
mov al,'-'
|
||
.noflagh
|
||
stosb
|
||
mov al,32
|
||
stosb
|
||
stosb
|
||
stosb
|
||
stosb
|
||
stosb
|
||
; increment tail/head
|
||
call .addtail
|
||
cmp word[debugh],0
|
||
jne .changeview
|
||
cmp word[debugt],21
|
||
jb .nochangeview
|
||
.changeview
|
||
mov ax,[debugt]
|
||
sub ax,20
|
||
jns .notneg
|
||
add ax,100
|
||
.notneg
|
||
mov [debugv],ax
|
||
jmp .finchangeview
|
||
.nochangeview
|
||
mov word[debugv],0
|
||
.finchangeview
|
||
; set cursor to (1,1)
|
||
mov ah,02h
|
||
mov bl,0
|
||
mov dh,0
|
||
mov dl,0
|
||
int 10h
|
||
ret
|
||
|
||
.addtail
|
||
inc word[debugt]
|
||
cmp word[debugt],100
|
||
jne .nowrap
|
||
mov word[debugt],0
|
||
.nowrap
|
||
mov ax,[debugt]
|
||
cmp ax,[debugh]
|
||
jne .nohead
|
||
inc word[debugh]
|
||
.nohead
|
||
cmp word[debugh],100
|
||
jne .nowrap2
|
||
mov word[debugh],0
|
||
.nowrap2
|
||
ret
|
||
|
||
.outaddrmode
|
||
mov ebx,[spcPCRam]
|
||
xor eax,eax
|
||
mov al,[ebx]
|
||
mov al,[ArgumentTable+eax]
|
||
shl eax,4
|
||
mov esi,AddressTable
|
||
add esi,eax
|
||
mov ecx,15
|
||
.nextop
|
||
mov al,[esi]
|
||
cmp al,'%'
|
||
je .doperc
|
||
mov [edi],al
|
||
inc esi
|
||
inc edi
|
||
.donext
|
||
dec ecx
|
||
jnz .nextop
|
||
ret
|
||
.doperc
|
||
dec ecx
|
||
inc esi
|
||
mov al,[esi]
|
||
inc esi
|
||
cmp al,'1'
|
||
je near .firstbyte
|
||
cmp al,'2'
|
||
je near .secondbyte
|
||
cmp al,'3'
|
||
je near .hinib
|
||
cmp al,'4'
|
||
je near .hinib2
|
||
cmp al,'5'
|
||
je near .rela2pc2
|
||
cmp al,'6'
|
||
je near .dp
|
||
cmp al,'8'
|
||
je near .memorybit
|
||
cmp al,'9'
|
||
je near .memorybitlow
|
||
cmp al,'A'
|
||
je near .rela2pc1
|
||
cmp al,'B'
|
||
je near .rela2pc1at2
|
||
jmp .donext
|
||
.firstbyte
|
||
mov ebx,[spcPCRam]
|
||
mov al,[ebx+1]
|
||
call .printhex8
|
||
jmp .donext
|
||
.secondbyte
|
||
mov ebx,[spcPCRam]
|
||
mov al,[ebx+2]
|
||
call .printhex8
|
||
jmp .donext
|
||
.hinib
|
||
mov ebx,[spcPCRam]
|
||
mov al,[ebx]
|
||
shr al,4
|
||
add al,48
|
||
mov [edi],al
|
||
inc edi
|
||
mov byte[edi],32
|
||
inc edi
|
||
jmp .donext
|
||
.hinib2
|
||
mov ebx,[spcPCRam]
|
||
mov al,[ebx]
|
||
shr al,5
|
||
and al,07h
|
||
add al,48
|
||
mov [edi],al
|
||
inc edi
|
||
mov byte[edi],32
|
||
inc edi
|
||
jmp .donext
|
||
.rela2pc2
|
||
mov ebx,[spcPCRam]
|
||
movsx eax,byte[ebx+1]
|
||
add eax,2
|
||
add eax,[spcPCRam]
|
||
sub eax,spcRam
|
||
call .printhex16
|
||
add esi,3
|
||
jmp .donext
|
||
.dp
|
||
mov al,'$'
|
||
mov [edi],al
|
||
inc edi
|
||
mov al,'0'
|
||
test byte[spcP],20h
|
||
jz .nodp
|
||
mov al,'1'
|
||
.nodp
|
||
mov [edi],al
|
||
inc edi
|
||
jmp .donext
|
||
.memorybit
|
||
mov ebx,[spcPCRam]
|
||
mov ax,[ebx+1]
|
||
shr ax,3
|
||
call .printhex16
|
||
add esi,2
|
||
jmp .donext
|
||
.memorybitlow
|
||
mov al,','
|
||
mov [edi],al
|
||
inc edi
|
||
mov ebx,[spcPCRam]
|
||
mov al,[ebx+1]
|
||
and al,07h
|
||
add al,48
|
||
mov [edi],al
|
||
inc edi
|
||
jmp .donext
|
||
.rela2pc1
|
||
mov ebx,[spcPCRam]
|
||
movsx eax,byte[ebx+1]
|
||
add eax,2
|
||
add eax,[spcPCRam]
|
||
sub eax,spcRam
|
||
call .printhex16
|
||
add esi,2
|
||
jmp .donext
|
||
.rela2pc1at2
|
||
mov ebx,[spcPCRam]
|
||
movsx eax,byte[ebx+2]
|
||
add eax,2
|
||
add eax,[spcPCRam]
|
||
sub eax,spcRam
|
||
call .printhex16
|
||
add esi,2
|
||
jmp .donext
|
||
|
||
; %1 = Byte, %2 = Second Byte, %3 = high nibble of opcode #,
|
||
; %4 = high nibble of opcode # and 07h, %5 = relative to PC+2
|
||
; %6 = dp ($0/$1)
|
||
; %7 = memory SHR 3 Low, %8 = memory SHR 3 High, %9 = ,memory AND 7h
|
||
; %A = relative to PC+1, %B = relative to PC+1 at second byte
|
||
;AddressTable
|
||
|
||
.printhex16
|
||
push ecx
|
||
mov ecx,4
|
||
.loopa
|
||
xor ebx,ebx
|
||
mov bx,ax
|
||
and bx,0F000h
|
||
shr bx,12
|
||
push ax
|
||
mov al,[.hexdat+ebx]
|
||
stosb
|
||
pop ax
|
||
shl ax,4
|
||
loop .loopa
|
||
pop ecx
|
||
sub ecx,2
|
||
ret
|
||
|
||
.printhex8
|
||
push ecx
|
||
xor ah,ah
|
||
mov ecx,2
|
||
.loopb
|
||
xor ebx,ebx
|
||
mov bx,ax
|
||
and bx,0F0h
|
||
shr bx,4
|
||
push ax
|
||
mov al,[.hexdat+ebx]
|
||
stosb
|
||
pop ax
|
||
shl ax,4
|
||
loop .loopb
|
||
pop ecx
|
||
ret
|
||
|
||
.hexdat db '0123456789ABCDEF'
|
||
|
||
;*******************************************************
|
||
; Debugger OpCode Information
|
||
;*******************************************************
|
||
|
||
NEWSYM ocname
|
||
db 'BRK ORA COP ORA TSB ORA ASL ORA PHP ORA ASL PHD TSB ORA ASL ORA '
|
||
db 'BPL ORA ORA ORA TRB ORA ASL ORA CLC ORA INC TCS TRB ORA ASL ORA '
|
||
db 'JSR AND JSL AND BIT AND ROL AND PLP AND ROL PLD BIT AND ROL AND '
|
||
db 'BMI AND AND AND BIT AND ROL AND SEC AND DEC TSC BIT AND ROL AND '
|
||
db 'RTI EOR WDM EOR MVP EOR LSR EOR PHA EOR LSR PHK JMP EOR LSR EOR '
|
||
db 'BVC EOR EOR EOR MVN EOR LSR EOR CLI EOR PHY TCD JMP EOR LSR EOR '
|
||
db 'RTS ADC PER ADC STZ ADC ROR ADC PLA ADC ROR RTL JMP ADC ROR ADC '
|
||
db 'BVS ADC ADC ADC STZ ADC ROR ADC SEI ADC PLY TDC JMP ADC ROR ADC '
|
||
db 'BRA STA BRL STA STY STA STX STA DEY BIT TXA PHB STY STA STX STA '
|
||
db 'BCC STA STA STA STY STA STX STA TYA STA TXS TXY STZ STA STZ STA '
|
||
db 'LDY LDA LDX LDA LDY LDA LDX LDA TAY LDA TAX PLB LDY LDA LDX LDA '
|
||
db 'BCS LDA LDA LDA LDY LDA LDX LDA CLV LDA TSX TYX LDY LDA LDX LDA '
|
||
db 'CPY CMP REP CMP CPY CMP DEC CMP INY CMP DEX WAI CPY CMP DEC CMP '
|
||
db 'BNE CMP CMP CMP PEI CMP DEC CMP CLD CMP PHX STP JML CMP DEC CMP '
|
||
db 'CPX SBC SEP SBC CPX SBC INC SBC INX SBC NOP XBA CPX SBC INC SBC '
|
||
db 'BEQ SBC SBC SBC PEA SBC INC SBC SED SBC PLX XCE JSR SBC INC SBC '
|
||
|
||
; Immediate Addressing Modes :
|
||
; 09 - ORA-M, 29 - AND-M, 49 - EOR-M, 69 - ADC-M, 89 - BIT-M,
|
||
; A0 - LDY-X, A2 - LDX-X, A9 - LDA-M, C0 - CPY-X, C2 - REP-B,
|
||
; C9 - CMP-M, E0 - CPX-X, E2 - SEP-B, E9 - SBC-M
|
||
; Extra Addressing Mode Values : B(1-byte only) = 25, X(by X flag) = 26
|
||
|
||
NEWSYM addrmode
|
||
db 25,09,25,22,04,04,04,19,21,01,05,21,02,02,02,03
|
||
db 15,07,18,23,04,10,10,08,06,13,05,06,02,12,12,14
|
||
db 02,09,03,22,04,04,04,19,21,01,05,21,02,02,02,03
|
||
db 15,07,18,23,10,10,10,08,06,13,05,06,12,12,12,14
|
||
db 21,09,00,22,24,04,04,19,21,01,05,21,02,02,02,03
|
||
db 15,07,18,23,24,10,10,08,06,13,21,06,03,12,12,14
|
||
db 21,09,02,22,04,04,04,19,21,01,05,21,17,02,02,03
|
||
db 15,07,18,23,10,10,10,08,06,13,21,06,20,12,12,14
|
||
db 15,09,16,22,04,04,04,19,06,01,06,21,02,02,02,03
|
||
db 15,07,18,23,10,10,11,08,06,13,06,06,02,12,12,14
|
||
db 26,09,26,22,04,04,04,19,06,01,06,21,02,02,02,03
|
||
db 15,07,18,23,10,10,11,08,06,13,06,06,12,12,13,14
|
||
db 26,09,25,22,04,04,04,19,06,01,06,06,02,02,02,03
|
||
db 15,07,18,23,18,10,10,08,06,13,21,06,17,12,12,14
|
||
db 26,09,25,22,04,04,04,19,06,01,06,06,02,02,02,03
|
||
db 15,07,18,23,02,10,10,08,06,13,21,06,20,12,12,14
|
||
|
||
NEWSYM spcnametab
|
||
db 'NOP TCALL SET1 BBS '
|
||
db 'OR OR OR OR '
|
||
db 'OR OR OR1 ASL '
|
||
db 'ASL PUSH TSET1 BRK '
|
||
|
||
db 'BPL TCALL CLR1 BBC '
|
||
db 'OR OR OR OR '
|
||
db 'OR OR DECW ASL '
|
||
db 'ASL DEC CMP JMP '
|
||
|
||
db 'CLRP TCALL SET1 BBS '
|
||
db 'AND AND AND AND '
|
||
db 'AND AND OR1 ROL '
|
||
db 'ROL PUSH CBNE BRA '
|
||
|
||
db 'BMI TCALL CLR1 BBC '
|
||
db 'AND AND AND AND '
|
||
db 'AND AND INCW ROL '
|
||
db 'ROL INC CMP CALL '
|
||
|
||
db 'SETP TCALL SET1 BBS '
|
||
db 'EOR EOR EOR EOR '
|
||
db 'EOR EOR AND1 LSR '
|
||
db 'LSR PUSH TCLR1 PCALL '
|
||
|
||
db 'BVC TCALL CLR1 BBC '
|
||
db 'EOR EOR EOR EOR '
|
||
db 'EOR EOR CMPW LSR '
|
||
db 'LSR MOV CMP JMP '
|
||
|
||
db 'CLRC TCALL SET1 BBS '
|
||
db 'CMP CMP CMP CMP '
|
||
db 'CMP CMP AND1 ROR '
|
||
db 'ROR PUSH DBNZ RET '
|
||
|
||
db 'BVS TCALL CLR1 BBC '
|
||
db 'CMP CMP CMP CMP '
|
||
db 'CMP CMP ADDW ROR '
|
||
db 'ROR MOV CMP RET1 '
|
||
|
||
db 'SETC TCALL SET1 BBS '
|
||
db 'ADC ADC ADC ADC '
|
||
db 'ADC ADC EOR1 DEC '
|
||
db 'DEC MOV POP MOV '
|
||
|
||
db 'BCC TCALL CLR1 BBC '
|
||
db 'ADC ADC ADC ADC '
|
||
db 'ADC ADC SUBW DEC '
|
||
db 'DEC MOV DIV XCN '
|
||
|
||
db 'EI TCALL SET1 BBS '
|
||
db 'SBC SBC SBC SBC '
|
||
db 'SBC SBC MOV1 INC '
|
||
db 'INC CMP POP MOV '
|
||
|
||
db 'BCS TCALL CLR1 BBC '
|
||
db 'SBC SBC SBC SBC '
|
||
db 'SBC SBC MOVW INC '
|
||
db 'INC MOV DAS MOV '
|
||
|
||
db 'DI TCALL SET1 BBS '
|
||
db 'MOV MOV MOV MOV '
|
||
db 'CMP MOV MOV1 MOV '
|
||
db 'MOV MOV POP MUL '
|
||
|
||
db 'BNE TCALL CLR1 BBC '
|
||
db 'MOV MOV MOV MOV '
|
||
db 'MOV MOV MOVW MOV '
|
||
db 'DEC MOV CBNE DAA '
|
||
|
||
db 'CLRV TCALL SET1 BBS '
|
||
db 'MOV MOV MOV MOV '
|
||
db 'MOV MOV NOT1 MOV '
|
||
db 'MOV NOTC POP SLEEP '
|
||
|
||
db 'BEQ TCALL CLR1 BBC '
|
||
db 'MOV MOV MOV MOV '
|
||
db 'MOV MOV MOV MOV '
|
||
db 'INC MOV DBNZ STOP '
|
||
|
||
; %1 = Byte, %2 = Second Byte, %3 = high nibble of opcode #,
|
||
; %4 = high nibble of opcode # and 07h, %5 = relative to PC+2
|
||
; %6 = dp ($0/$1)
|
||
; %7 = memory SHR 3 Low, %8 = memory SHR 3 High, %9 = ,memory AND 7h
|
||
; %A = relative to PC+1, %B = relative to PC+1 at second byte
|
||
NEWSYM AddressTable
|
||
; 1 1 1
|
||
db ' %3 %6%1,%4 B%4 %6%1,$%B+1 '
|
||
; 0 : nothing
|
||
; 1 : the high nibble
|
||
; 2 : the high nibble first 3 bit (and 0111000 then shift)
|
||
; 3 : 2 + relative
|
||
db 'A,%6%1 A,$%2%1 A,(X) A,(%6%1+x) '
|
||
; 4 : A,dp
|
||
; 5 : A,labs
|
||
; 6 : A,(X)
|
||
; 7 : A,(dp+X)
|
||
db 'A,#$%1 (%6%2),(%6%1) CF,mbit%8%7%9 %6%1 '
|
||
; 8 : A,#inm
|
||
; 9 : dp(d),dp(s) (two dp)
|
||
; 10 : Carry flag, memory bit (can only access from 0 to 1fff)
|
||
; 11 : dp
|
||
db '$%2%1 PSW $%A A,%6%1+X '
|
||
; 12 : labs
|
||
; 13 : PSW
|
||
; 14 : rel
|
||
; 15 : A,dp+X
|
||
db 'A,$%2%1+X A,$%2%1+Y A,(%6%1)+Y %6%2,#$%1 '
|
||
; 16 : A,labs+X
|
||
; 17 : A,labs+Y
|
||
; 18 : A,(dp)+Y
|
||
; 19 : dp,#inm
|
||
db '(X),(Y) %6%1+X A X '
|
||
; 20 : (X),(Y)
|
||
; 21 : dp+X
|
||
; 22 : A
|
||
; 23 : X
|
||
db 'X,%2%1 ($%2%1+X) CF,/(mb%8%7%9) %6%1 '
|
||
; 24 : X,labs
|
||
; 25 : (labs+X)
|
||
; 26 : C,/mem.bit
|
||
; 27 : upage (same as dp but for a call)
|
||
db 'YA,%6%1 X,A Y,$%2%1 Y '
|
||
; 28 : YA,dp
|
||
; 29 : X,A
|
||
; 30 : Y,labs
|
||
; 31 : Y
|
||
db 'Y,%6%1 Y,#$%1 %6%1,$%B X,%6%1 '
|
||
; 32 : Y,dp
|
||
; 33 : Y,#inm
|
||
; 34 : dp,rel
|
||
; 35 : X,dp
|
||
db 'A,X %6%2,#$%1 X,SP YA,X '
|
||
; 36 : A,X
|
||
; 37 : dp,#inm
|
||
; 38 : X,SP
|
||
; 39 : YA,X
|
||
db '(X)+,A SP,X A,(X)+ %6%1,A '
|
||
; 40 : (X)+,A
|
||
; 41 : SP,X
|
||
; 42 : A,(X)+
|
||
; 43 : dp,A
|
||
db '$%2%1,A (X),A %6%1+X,A X,#$%1 '
|
||
; 44 : labs,A
|
||
; 45 : (X),A
|
||
; 46 : (dp+X),A
|
||
; 47 : X,#inm
|
||
db '$%2%1,X mb%8%7%9,CF %6%1,Y $%2%1,Y '
|
||
; 48 : labs,X
|
||
; 49 : mem.bit,C
|
||
; 50 : dp,Y
|
||
; 51 : labs,Y
|
||
db 'YA %6%1+X,A $%2%1+X,A $%2%1+Y,A '
|
||
; 52 : YA
|
||
; 53 : dp+X,A
|
||
; 54 : labs+X,A
|
||
; 55 : labs+Y,A
|
||
db '(%6%1)+Y,A %6%1,X %6%1+Y,X %6%1,YA '
|
||
; 56 : (dp)+Y,A
|
||
; 57 : dp,X
|
||
; 58 : dp+Y,X
|
||
; 59 : dp,YA
|
||
db '%6%1+X,Y A,Y %6%2+X,$%A mb%8%7%9,CF '
|
||
; 60 : dp+X,Y
|
||
; 61 : A,Y
|
||
; 62 : dp+X,rel
|
||
; 63 : mem.bit
|
||
db 'X,%6%1+Y Y,%6%1+X Y,A Y,$%A '
|
||
; 64 : X,dp+Y
|
||
; 65 : Y,dp+X
|
||
; 66 : Y,A
|
||
; 67 : Y,rel
|
||
|
||
|
||
NEWSYM ArgumentTable
|
||
; 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
|
||
db 00,01,02,03,04,05,06,07,08,09,10,11,12,13,12,00
|
||
; 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
|
||
db 14,01,02,03,15,16,17,18,19,20,11,21,22,23,24,25
|
||
; 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
|
||
db 00,01,02,03,04,05,06,07,08,09,26,11,12,22,34,14
|
||
; 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
|
||
db 14,01,02,03,15,16,17,18,19,20,11,21,22,23,35,12
|
||
; 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
|
||
db 00,01,02,03,04,05,06,07,08,09,10,11,12,23,12,27
|
||
; 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
|
||
db 14,01,02,03,15,16,17,18,19,20,28,21,22,29,30,12
|
||
; 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
|
||
db 00,01,02,03,04,05,06,07,08,09,26,11,12,31,34,00
|
||
; 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
|
||
db 14,01,02,03,15,16,17,18,19,20,28,21,22,36,32,00
|
||
; 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
|
||
db 00,01,02,03,04,05,06,07,08,09,10,11,12,33,13,37
|
||
; 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
|
||
db 14,01,02,03,15,16,17,18,19,20,28,21,22,38,39,22
|
||
; A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
||
db 00,01,02,03,04,05,06,07,08,09,10,11,12,33,22,40
|
||
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
|
||
db 14,01,02,03,15,16,17,18,19,20,28,21,22,41,22,42
|
||
; C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
|
||
db 00,01,02,03,43,44,45,46,47,48,49,50,51,47,23,52
|
||
; D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
|
||
db 14,01,02,03,53,54,55,56,57,58,59,60,31,61,62,22
|
||
; E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
|
||
db 00,01,02,03,04,05,06,07,08,24,63,32,30,00,31,00
|
||
; F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
|
||
db 14,01,02,03,15,16,17,18,35,64,09,65,31,66,67,00
|