Files
ZSNES/zsnes/src/cpu/spc700.asm

2787 lines
62 KiB
NASM

;Copyright (C) 1997-2005 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
;
;http://www.zsnes.com
;http://sourceforge.net/projects/zsnes
;
;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 DSPMem,spcWptr,disablespcclr,SPCSkipXtraROM,SPC700sh,cycpbl,spcRptr
EXTSYM spc700read,dspWptr,curexecstate,tableadb
%include "cpu/regsw.mac"
%include "cpu/spcdef.inc"
%include "cpu/spcaddr.inc"
; SPC 700 Emulation by _Demo_
; Version 2.0
; Little info on functions :
; Write byte : write al at [ebx]
; Read byte : read al from [ebx]
; update timer : update the timers, called every scanline
SECTION .data
ALIGN32
;spcBuffer times 65536*4 db 0 ; The buffer of brr blocks... 4 bits -> 16 bits
;spcRamcmp times 65536 db 0 ; SPC Ram compare buffer
;spcPrevbf times 65536 db 0 ; SPC PrevX compare buffer
NEWSYM spcRam, times 65472 db 0FFh ; Pointer to the SPC's RAM
; copy #1
; THE SPC ROM :)
db 0CDh,0EFh,0BDh,0E8h,000h,0C6h,01Dh,0D0h,0FCh,08Fh,0AAh,0F4h,08Fh,0BBh,0F5h,078h
db 0CCh,0F4h,0D0h,0FBh,02Fh,019h,0EBh,0F4h,0D0h,0FCh,07Eh,0F4h,0D0h,00Bh,0E4h,0F5h
db 0CBh,0F4h,0D7h,000h,0FCh,0D0h,0F3h,0ABh,001h,010h,0EFh,07Eh,0F4h,010h,0EBh,0BAh
db 0F6h,0DAh,000h,0BAh,0F4h,0C4h,0F4h,0DDh,05Dh,0D0h,0DBh,01Fh,000h,000h,0C0h,0FFh
db 0AAh,0BBh,0CCh,0DDh,0EEh,0FFh,000h,011h,022h,033h,044h,055h,066h,077h,088h,099h
NEWSYM spcPCRam,
dd 0 ; Program Counter (with spcRam added)
NEWSYM spcA,
db 0 ; The A register (general purpose)
db 0
db 0
db 0
NEWSYM spcX,
db 0 ; The X register (general purpose)
db 0
db 0
db 0
NEWSYM spcY,
db 0 ; The Y register (general purpose)
db 0
db 0
db 0
NEWSYM spcP,
db 0 ; The processor status byte (Removed for each flags)
db 0 ; NZ are not always processed...
db 0
db 0
NEWSYM spcNZ,
db 0 ; The processor NZ flag (little speed up hack :) )
db 0
db 0
db 0
;spcNF db 0 ; The Negative Flag 128 or 127
;spcOF db 0 ; The Overflow Flag 64 or 191
;spcDPF db 0 ; Direct Page Flag 32 or 223
;spcUF db 0 ; The Unused Flag ? 16 or 239
;spcHCF db 0 ; The Half Carry Flag 8 or 247
;spcIF db 0 ; The interrupt flag 4 or 251
;spcZF db 0 ; The Zero Flag 2 or 253
;spcCF db 0 ; The Carry Flag 1 or 254
NEWSYM spcS, dd 1FFh ; The stack pointer (always from 100 to 1FF) (added Ram)
NEWSYM spcRamDP, dd 0 ; The direct page pointer
NEWSYM spcCycle, dd 0 ; The Cycle Counter
NEWSYM reg1read, db 0 ; read from 65816
NEWSYM reg2read, db 0 ; read from 65816
NEWSYM reg3read, db 0 ; read from 65816
NEWSYM reg4read, db 0 ; read from 65816
NEWSYM timeron, db 0 ; timer0 on
NEWSYM timincr0, db 0 ; # of ticks before incrementing
NEWSYM timincr1, db 0 ; # of ticks before incrementing
NEWSYM timincr2, db 0 ; # of ticks before incrementing
NEWSYM timinl0, db 0 ; ticks left before incrementing
NEWSYM timinl1, db 0 ; ticks left before incrementing
NEWSYM timinl2, db 0 ; ticks left before incrementing
NEWSYM timrcall, db 0 ; alternating bit 0 to correctly timer timer1 & 2 to 8000hz
NEWSYM spcextraram, times 64 db 0 ; extra ram, used for tcall
NEWSYM FutureExpandS, times 256-64 db 0
spcsave equ $-spcRam
; pharos equ hack *sigh*
NEWSYM PHspcsave, dd spcsave
; copy #2
NEWSYM SPCROM
db 0CDh,0EFh,0BDh,0E8h,000h,0C6h,01Dh,0D0h,0FCh,08Fh,0AAh,0F4h,08Fh,0BBh,0F5h,078h
db 0CCh,0F4h,0D0h,0FBh,02Fh,019h,0EBh,0F4h,0D0h,0FCh,07Eh,0F4h,0D0h,00Bh,0E4h,0F5h
db 0CBh,0F4h,0D7h,000h,0FCh,0D0h,0F3h,0ABh,001h,010h,0EFh,07Eh,0F4h,010h,0EBh,0BAh
db 0F6h,0DAh,000h,0BAh,0F4h,0C4h,0F4h,0DDh,05Dh,0D0h,0DBh,01Fh,000h,000h,0C0h,0FFh
SECTION .text
%macro WriteByte 0
cmp ebx,0ffh+spcRam
ja %%extramem
cmp ebx,0f0h+spcRam
jb %%normalmem
sub ebx,spcRam
push dword %%finished
jmp dword near [spcWptr+ebx*4-0f0h*4]
; call dword near [spcWptr+ebx*4-0f0h*4]
; jmp .finished
%%extramem
cmp ebx,0ffc0h+spcRam
jb %%normalmem
mov [spcextraram+ebx-0FFC0h-spcRam],al
test byte[spcRam+0F1h],80h
jnz %%finished
; push ecx
; mov cl,[DSPMem+06Ch]
; test cl,20h
; pop ecx
; jz .finished
%%normalmem
mov [ebx],al
%%finished
%endmacro
%macro ReadByte 0
cmp ebx,0f0h+spcRam
jb %%normalmem2
cmp ebx,0ffh+spcRam
ja %%normalmem
sub ebx,spcRam
push dword %%finished
jmp dword near [spcRptr+ebx*4-0f0h*4]
; call dword near [spcRptr+ebx*4-0f0h*4]
; jmp .rfinished
%%normalmem
; cmp ebx,0ffc0h+spcRam
; jb .rnormalmem2
; test byte [DSPMem+6Ch],10h
; jz .rnormalmem2
; mov al,[spcextraram+ebx-0FFC0h-spcRam]
; jmp .rfinished
%%normalmem2
mov al,[ebx]
%%finished
%endmacro
%macro ReadByte2 0
cmp ebx,0f0h+spcRam
jb %%normalmem2
cmp ebx,0ffh+spcRam
ja %%normalmem
sub ebx,spcRam
call dword near [spcRptr+ebx*4-0f0h*4]
add ebx,spcRam
jmp %%finished
%%normalmem
; cmp ebx,0ffc0h+spcRam
; jb .rnormalmem2
; test byte [DSPMem+6Ch],10h
; jz .rnormalmem2
; mov al,[spcextraram+ebx-0FFC0h-spcRam]
; jmp .rfinished
%%normalmem2
mov al,[ebx]
%%finished
%endmacro
SECTION .data
NEWSYM timer2upd, dd 0
SECTION .text
; This function is called every scanline (262*60 times/sec)
; Make it call 0.9825 times (393/400) (skip when divisible by 64)
; 2 8khz, 1 64khz
NEWSYM updatetimer
; inc dword[timer2upd]
; cmp dword[timer2upd],400
; jne .nowrap
; mov dword[timer2upd],0
;.nowrap
;.again
; mov eax,dword[timer2upd]
; shr eax,6
; shl eax,6
; cmp eax,dword[timer2upd]
; je near .noin2d
.another
xor byte[timrcall],01h
test byte[timrcall],01h
jz near .notimer
test byte[timeron],1
jz .noin0
dec byte[timinl0]
jnz .noin0
inc byte[spcRam+0FDh]
mov al,[timincr0]
mov [timinl0],al
cmp byte[spcRam+0FDh],1
jne .noin0
cmp byte[spchalted],0
jz .noin0
reenablespc
mov dword[cycpbl],0
.noin0
test byte[timeron],2
jz .noin1
dec byte[timinl1]
jnz .noin1
inc byte[spcRam+0FEh]
mov al,[timincr1]
mov [timinl1],al
cmp byte[spcRam+0FEh],1
jne .noin1
cmp byte[spchalted+1],0
jz .noin1
reenablespc
mov dword[cycpbl],0
.noin1
.notimer
test byte[timeron],4
jz near .noin2d2
dec byte[timinl2]
jnz .noin2
inc byte[spcRam+0FFh]
mov al,[timincr2]
mov [timinl2],al
cmp byte[spcRam+0FFh],1
jne .noin2
cmp byte[spchalted+2],0
jz .noin2
reenablespc
mov dword[cycpbl],0
.noin2
dec byte[timinl2]
jnz .noin2b
inc byte[spcRam+0FFh]
mov al,[timincr2]
mov [timinl2],al
cmp byte[spcRam+0FFh],1
jne .noin2b
cmp byte[spchalted+2],0
jz .noin2b
reenablespc
mov dword[cycpbl],0
.noin2b
dec byte[timinl2]
jnz .noin2c
inc byte[spcRam+0FFh]
mov al,[timincr2]
mov [timinl2],al
cmp byte[spcRam+0FFh],1
jne .noin2c
cmp byte[spchalted+2],0
jz .noin2c
reenablespc
mov dword[cycpbl],0
.noin2c
dec byte[timinl2]
jnz .noin2d
inc byte[spcRam+0FFh]
mov al,[timincr2]
mov [timinl2],al
cmp byte[spcRam+0FFh],1
jne .noin2d
cmp byte[spchalted+2],0
jz .noin2d
reenablespc
mov dword[cycpbl],0
.noin2d
.noin2d2
; inc dword[timer2upd]
; cmp dword[timer2upd],31
; jne .nowrap
; mov dword[timer2upd],0
; jmp .again
;.nowrap
inc dword[timer2upd]
cmp dword[timer2upd],60
jne .noanother
mov dword[timer2upd],0
jmp .another
.noanother
ret
; SPC Write Registers
; DO NOT MODIFY DX OR ECX!
NEWSYM SPCRegF0
mov [spcRam+0F0h],al
ret
NEWSYM SPCRegF1
cmp byte[disablespcclr],1
je .No23Clear
test al,10h
jz .No01Clear
mov byte [spcRam+0F4h],0
mov byte [spcRam+0F5h],0
.No01Clear
test al,20h
jz .No23Clear
mov byte [spcRam+0F6h],0
mov byte [spcRam+0F7h],0
.No23Clear
cmp byte[SPCSkipXtraROM],1
je near .AfterNoROM
test al,80h
jz .NoROM
push eax
push ebx
xor eax,eax
.loopa
mov bl,[SPCROM+eax]
mov [spcRam+0FFC0h+eax],bl
inc eax
cmp eax,040h
jne .loopa
pop ebx
pop eax
jmp .AfterNoROM
.NoROM
push eax
push ebx
xor eax,eax
.loopb
mov bl,[spcextraram+eax]
mov [spcRam+0FFC0h+eax],bl
inc eax
cmp eax,040h
jne .loopb
pop ebx
pop eax
.AfterNoROM
mov [spcRam+0F1h],al
and al,0Fh
mov [timeron],al
ret
NEWSYM SPCRegF2
mov [spcRam+0F2h],al
push eax
push ebx
xor eax,eax
mov al,[spcRam+0F2h]
mov bl,[DSPMem+eax]
mov [spcRam+0F3h],bl
pop ebx
pop eax
ret
NEWSYM SPCRegF3
push ebx
xor ebx,ebx
mov bl,[spcRam+0F2h]
and bl,07fh
call dword near [dspWptr+ebx*4]
pop ebx
mov [spcRam+ebx],al
ret
NEWSYM SPCRegF4
mov [reg1read],al
inc dword[spc700read]
ret
NEWSYM SPCRegF5
mov [reg2read],al
inc dword[spc700read]
ret
NEWSYM SPCRegF6
mov [reg3read],al
inc dword[spc700read]
ret
NEWSYM SPCRegF7
mov [reg4read],al
inc dword[spc700read]
ret
NEWSYM SPCRegF8
mov [spcRam+ebx],al
ret
NEWSYM SPCRegF9
mov [spcRam+ebx],al
ret
NEWSYM SPCRegFA
mov [timincr0],al
test byte[timinl0],0FFh
jne .nowrite
mov [timinl0],al
.nowrite
mov [spcRam+ebx],al
ret
NEWSYM SPCRegFB
mov [timincr1],al
test byte[timinl1],0FFh
jne .nowrite
mov [timinl1],al
.nowrite
mov [spcRam+ebx],al
ret
NEWSYM SPCRegFC
mov [timincr2],al
test byte[timinl2],0FFh
jne .nowrite
mov [timinl2],al
.nowrite
mov [spcRam+ebx],al
ret
NEWSYM SPCRegFD
ret
NEWSYM SPCRegFE
ret
NEWSYM SPCRegFF
ret
; SPC Read Registers
; DO NOT MODIFY ANY REG!
; return data true al
NEWSYM RSPCRegF0
mov al,[spcRam+0f0h]
ret
NEWSYM RSPCRegF1
mov al,[spcRam+0f1h]
ret
NEWSYM RSPCRegF2
mov al,[spcRam+0f2h]
ret
NEWSYM RSPCRegF3
mov al,[spcRam+0f3h]
ret
%ifdef SPCDUMP
SECTION .bss
ALIGNB 4
NEWSYM SPCSave_start, resd 2
NEWSYM SPCSave_buffer, resb 4
NEWSYM SPCSave_ports, resb 4
SECTION .text
EXTSYM SPCSave_dump, SPCSave_handle, Write_File
%macro spcdump 1
cmp byte[SPCSave_dump], 1
jne %%nodump
inc dword[SPCSave_buffer]
cmp [SPCSave_ports+%1], al
je %%nodump
mov [SPCSave_ports+%1], al
pushad
mov byte[SPCSave_buffer+2], %1
mov byte[SPCSave_buffer+3], al
mov ebx, [SPCSave_handle]
mov ecx, 4
mov edx, SPCSave_buffer
call Write_File
xor eax, eax
mov [SPCSave_buffer], eax
popad
%%nodump
%endmacro
%endif
NEWSYM RSPCRegF4
mov al,[spcRam+0f4h]
%ifdef SPCDUMP
spcdump 0
%endif
ret
NEWSYM RSPCRegF5
mov al,[spcRam+0f5h]
%ifdef SPCDUMP
spcdump 1
%endif
ret
NEWSYM RSPCRegF6
mov al,[spcRam+0f6h]
%ifdef SPCDUMP
spcdump 2
%endif
ret
NEWSYM RSPCRegF7
mov al,[spcRam+0f7h]
%ifdef SPCDUMP
spcdump 3
%endif
ret
NEWSYM RSPCRegF8
mov al,0 ;[spcRam+0f8h]
ret
NEWSYM RSPCRegF9
mov al,0 ;[spcRam+0f9h]
ret
NEWSYM RSPCRegFA
mov al,[spcRam+0fah]
ret
NEWSYM RSPCRegFB
mov al,[spcRam+0fbh]
ret
NEWSYM RSPCRegFC
mov al,[spcRam+0fch]
ret
%macro skipmacro 1
.spcnextskip
test byte[timeron],1<<%1
je .ret
cmp byte[timincr0+%1],0
je .ret
;cmp byte[SpeedHack],0
;je .ret
inc byte[spcnumread+%1]
cmp byte[spcnumread+%1],8h
je near haltspc
.ret
ret
%endmacro
ALIGN16
NEWSYM haltspc
cmp byte[SPC700sh],1
je .nochangestate
mov dword[cycpbl],0FFFFFFFFh
test byte[curexecstate],02h
jz .nochangestate
and byte[curexecstate],0FDh
push ebx
mov ebx,[spcnumread]
mov [spchalted],ebx
xor ebx,ebx
mov bl,dl
mov edi,[tableadb+ebx*4]
pop ebx
.nochangestate
mov dword[spcnumread],0
ret
NEWSYM RSPCRegFD
mov al,[spcRam+0fdh]
and al,0Fh
cmp byte[spcRam+0fdh],0
je .spcnextskip
mov byte [spcRam+0fdh],0
mov byte [spcnumread],0
ret
skipmacro 0
NEWSYM RSPCRegFE
mov al,[spcRam+0feh]
and al,0Fh
cmp byte[spcRam+0feh],0
je .spcnextskip
mov byte [spcRam+0feh],0
mov byte [spcnumread+1],0
ret
skipmacro 1
NEWSYM RSPCRegFF
mov al,[spcRam+0ffh]
and al,0Fh
cmp byte[spcRam+0ffh],0
je .spcnextskip
mov byte [spcRam+0ffh],0
mov byte [spcnumread+2],0
ret
skipmacro 2
%if 0
NEWSYM spcnextskip
inc byte[spcnumread]
cmp byte[spcnumread],5
je near haltspc
ret
NEWSYM haltspc
cmp byte[SPC700sh],1
je .nochangestate
mov dword[cycpbl],0FFFFFFFFh
test byte[curexecstate],02h
jz .nochangestate
and byte[curexecstate],0FDh
push ebx
xor ebx,ebx
mov bl,dl
mov edi,[tableadb+ebx*4]
pop ebx
.nochangestate
mov byte[spcnumread],0
ret
%endif
SECTION .data
NEWSYM spcnumread, dd 0
NEWSYM spchalted, dd 0
SECTION .text
%macro SPCSetFlagnzc 0
js .setsignflag
jz .setzeroflag
mov byte [spcNZ],1
jc .setcarryflag
and byte [spcP],0FEh
ret
.setsignflag
mov byte [spcNZ],80h
jc .setcarryflag
and byte [spcP],0FEh
ret
.setzeroflag
mov byte [spcNZ],0
jc .setcarryflag
and byte [spcP],0FEh
ret
.setcarryflag
or byte [spcP],1
ret
%endmacro
%macro SPCSetFlagnzcnoret 0
js .setsignflag
jz .setzeroflag
mov byte [spcNZ],1
jc .setcarryflag
and byte [spcP],0FEh
jmp .skipflags
.setsignflag
mov byte [spcNZ],80h
jc .setcarryflag
and byte [spcP],0FEh
jmp .skipflags
.setzeroflag
mov byte [spcNZ],0
jc .setcarryflag
and byte [spcP],0FEh
jmp .skipflags
.setcarryflag
or byte [spcP],1
.skipflags
%endmacro
%macro SPCSetFlagnvhzc 0
lahf
js .setsignflag
jz .setzeroflag
mov byte [spcNZ],1
jo .setoverflowflag
and byte [spcP],0BFh
jmp .skipflags
.setsignflag
mov byte [spcNZ],80h
jo .setoverflowflag
and byte [spcP],0BFh
jmp .skipflags
.setzeroflag
mov byte [spcNZ],0
jo .setoverflowflag
and byte [spcP],0BFh
jmp .skipflags
.setoverflowflag
or byte [spcP],40h
.skipflags
and byte [spcP],0F6h
test ah,01h
jz .noCarry
or byte [spcP],1
.noCarry
test ah,10h
jz .nohf
or byte [spcP],8
.nohf
ret
%endmacro
%macro SPCSetFlagnvhzcnoret 0
lahf
js .setsignflag
jz .setzeroflag
mov byte [spcNZ],1
jo .setoverflowflag
and byte [spcP],0BFh
jmp .skipflags
.setsignflag
mov byte [spcNZ],80h
jo .setoverflowflag
and byte [spcP],0BFh
jmp .skipflags
.setzeroflag
mov byte [spcNZ],0
jo .setoverflowflag
and byte [spcP],0BFh
jmp .skipflags
.setoverflowflag
or byte [spcP],40h
.skipflags
and byte [spcP],0F6h
test ah,01h
jz .noCarry
or byte [spcP],1
.noCarry
test ah,10h
jz .nohf
or byte [spcP],8
.nohf
%endmacro
;************************************************
; Misc Opcodes
;************************************************
NEWSYM Op00 ; NOP
ret
NEWSYM OpEF ; SLEEP standby SLEEP mode .........
dec ebp
ret
NEWSYM OpFF ; STOP standby STOP mode .........
inc dword[spc700read]
dec ebp
ret
NEWSYM Op9F ; XCN A A(7-4) <-> A(3-0) N......Z.
ror byte [spcA],4
mov al,byte[spcA]
mov [spcNZ],al
ret
;************************************************
; Branch Stuff
;************************************************
NEWSYM Op10 ; BPL Branch on N=0
test byte [spcNZ],128
jz .branch
spcbrancher
NEWSYM Op30 ; BMI Branch on N=1
test byte [spcNZ],128
jnz .branch
spcbrancher
NEWSYM Op50 ; BVC Branch on V=0
test byte [spcP],64
jz .branch
spcbrancher
NEWSYM Op70 ; BVS Branch on V=1
test byte [spcP],64
jnz .branch
spcbrancher
NEWSYM Op90 ; BCC Branc on c=0
test byte [spcP],1
jz .branch
spcbrancher
NEWSYM OpB0 ; BCS Branch on C=1
test byte [spcP],1
jnz .branch
spcbrancher
NEWSYM OpD0 ; BNE branch on Z=0
test byte [spcNZ],255
jnz .branch
spcbrancher
NEWSYM OpF0 ; BEQ Branch on Z=1
test byte [spcNZ],0FFh
jz .branch
spcbrancher
NEWSYM Op2F ; BRA rel branch always ...
movsx ebx,byte [ebp]
inc ebp
add ebp,ebx
ret
;************************************************
; Clear/Set Flag bits
;************************************************
; CLRP 20 1 2 clear direct page flag ..0.....
NEWSYM Op20 ; CLRP Clear direct page flag
and byte [spcP],11011111b
mov dword [spcRamDP],spcRam
ret
; SETP 40 1 2 set dorect page flag ..1..0..
NEWSYM Op40 ; SETP Set Direct Page Flag (Also clear interupt flag?)
or byte [spcP],00100000b
and byte [spcP],11111011b
mov dword [spcRamDP],spcRam
add dword [spcRamDP],100h
ret
; CLRC 60 1 2 clear carry flag .......0
NEWSYM Op60 ; CLRC Clear carry flag
and byte [spcP],11111110b
ret
; SETC 80 1 2 set carry flag .......1
NEWSYM Op80 ; SETC Set carry flag
or byte [spcP],00000001b
ret
; EI A0 1 3 set interrup enable flag .....1..
NEWSYM OpA0 ; EI set interrupt flag
or byte [spcP],00000100b
ret
; DI C0 1 3 clear interrup enable flag .....0..
NEWSYM OpC0 ; DI clear interrupt flag
and byte [spcP],11111011b
ret
; CLRV E0 1 2 clear V and H .0..0...
NEWSYM OpE0 ; CLRV clear V and H
and byte [spcP],10110111b
ret
; NOTC ED 1 3 complement carry flag .......C
NEWSYM OpED ; NOTC complement carry flag .......C
xor byte [spcP],00000001b
ret
;************************************************
; TCALL instructions (Verified)
;************************************************
NEWSYM Op01 ; TCALL 0
spctcall 30
NEWSYM Op11 ; TCALL 1
spctcall 28
NEWSYM Op21 ; TCALL 2
spctcall 26
NEWSYM Op31 ; TCALL 3
spctcall 24
NEWSYM Op41 ; TCALL 4
spctcall 22
NEWSYM Op51 ; TCALL 5
spctcall 20
NEWSYM Op61 ; TCALL 6
spctcall 18
NEWSYM Op71 ; TCALL 7
spctcall 16
NEWSYM Op81 ; TCALL 8
spctcall 14
NEWSYM Op91 ; TCALL 9
spctcall 12
NEWSYM OpA1 ; TCALL A
spctcall 10
NEWSYM OpB1 ; TCALL B
spctcall 08
NEWSYM OpC1 ; TCALL C
spctcall 06
NEWSYM OpD1 ; TCALL D
spctcall 04
NEWSYM OpE1 ; TCALL E
spctcall 02
NEWSYM OpF1 ; TCALL F
spctcall 00
;************************************************
; SET1 instructions (Verified)
;************************************************
NEWSYM Op02 ; SET1 direct page bit 0
set1 1
NEWSYM Op22 ; SET1 direct page bit 1
set1 2
NEWSYM Op42 ; SET1 direct page bit 2
set1 4
NEWSYM Op62 ; SET1 direct page bit 3
set1 8
NEWSYM Op82 ; SET1 direct page bit 4
set1 16
NEWSYM OpA2 ; SET1 direct page bit 5
set1 32
NEWSYM OpC2 ; SET1 direct page bit 6
set1 64
NEWSYM OpE2 ; SET1 direct page bit 7
set1 128
;************************************************
; CLR1 instructions (Verified)
;************************************************
NEWSYM Op12 ; CLR1 direct page bit 0
clr1 255-1
NEWSYM Op32 ; CLR1 direct page bit 1
clr1 255-2
NEWSYM Op52 ; CLR1 direct page bit 2
clr1 255-4
NEWSYM Op72 ; CLR1 direct page bit 3
clr1 255-8
NEWSYM Op92 ; CLR1 direct page bit 4
clr1 255-16
NEWSYM OpB2 ; CLR1 direct page bit 5
clr1 255-32
NEWSYM OpD2 ; CLR1 direct page bit 6
clr1 255-64
NEWSYM OpF2 ; CLR1 direct page bit 7
clr1 255-128
;************************************************
; BBS instructions (Verified)
;************************************************
NEWSYM Op03 ; BBS direct page bit 0
bbs 1
NEWSYM Op23 ; BBS direct page bit 1
bbs 2
NEWSYM Op43 ; BBS direct page bit 2
bbs 4
NEWSYM Op63 ; BBS direct page bit 3
bbs 8
NEWSYM Op83 ; BBS direct page bit 4
bbs 16
NEWSYM OpA3 ; BBS direct page bit 5
bbs 32
NEWSYM OpC3 ; BBS direct page bit 6
bbs 64
NEWSYM OpE3 ; BBS direct page bit 7
bbs 128
;************************************************
; BBC instructions (Verified)
;************************************************
NEWSYM Op13 ; BBC direct page bit 0
bbc 1
NEWSYM Op33 ; BBC direct page bit 1
bbc 2
NEWSYM Op53 ; BBC direct page bit 2
bbc 4
NEWSYM Op73 ; BBC direct page bit 3
bbc 8
NEWSYM Op93 ; BBC direct page bit 4
bbc 16
NEWSYM OpB3 ; BBC direct page bit 5
bbc 32
NEWSYM OpD3 ; BBC direct page bit 6
bbc 64
NEWSYM OpF3 ; BBC direct page bit 7
bbc 128
;************************************************
; OR A,instructions
;************************************************
NEWSYM Op04 ; OR A,dp A <- A OR (dp) N.....Z.
SPCaddr_DP
SPC_OR_A
NEWSYM Op14 ; OR A,dp+X A <- A OR (dp+X) N.....Z.
SPCaddr_DP_X
SPC_OR_A
NEWSYM Op05 ; OR A,labs A <- A OR (abs) N.....Z.
SPCaddr_LABS
SPC_OR_A
NEWSYM Op15 ; OR A,labs+x A <- A OR (abs+X) N.....Z.
SPCaddr_LABS_X
SPC_OR_A
NEWSYM Op06 ; OR A,(X) A <- A OR (X) N.....Z.
SPCaddr__X_
SPC_OR_A
NEWSYM Op16 ; OR A,labs+Y A <- A OR (abs+Y) N......Z.
SPCaddr_LABS_Y
SPC_OR_A
NEWSYM Op07 ; OR A,(dp+X) A <- A OR ((dp+X+1)(dp+X)) N......Z.
SPCaddr_bDP_Xb
SPC_OR_A
NEWSYM Op17 ; OR A,(dp)+Y A <- A OR ((dp+1)(dp)+Y) N......Z.
SPCaddr_bDPb_Y
SPC_OR_A
NEWSYM Op08 ; OR A,#inm A <- A OR inm N......Z.
mov al,[ebp]
inc ebp
SPC_OR_A
;************************************************
; AND A, instructions
;************************************************
NEWSYM Op24 ; AND A,dp A <- A AND (dp) N.....Z.
SPCaddr_DP
SPC_AND_A
NEWSYM Op34 ; AND A,dp+x A <- A AND (dp+X) N.....Z.
SPCaddr_DP_X
SPC_AND_A
NEWSYM Op25 ; AND A,labs A <- A AND (abs) N.....Z.
SPCaddr_LABS
SPC_AND_A
NEWSYM Op35 ; AND A,labs+X A <- A AND (abs+X) N.....Z.
SPCaddr_LABS_X
SPC_AND_A
NEWSYM Op26 ; AND A,(X) A <- A AND (X) N......Z.
SPCaddr__X_
SPC_AND_A
NEWSYM Op36 ; AND A,labs+Y A <- A AND (abs+Y) N......Z.
SPCaddr_LABS_Y
SPC_AND_A
NEWSYM Op27 ; AND A,(dp+X) A <- A AND ((dp+X+1)(dp+X)) N......Z.
SPCaddr_bDP_Xb
SPC_AND_A
NEWSYM Op37 ; AND A,(dp)+Y A <- A AND ((dp+1)(dp)+Y) N......Z.
SPCaddr_bDPb_Y
SPC_AND_A
NEWSYM Op28 ; AND A,#inm A <- A AND inm N......Z.
mov al,[ebp]
inc ebp
SPC_AND_A
;************************************************
; EOR A, instructions
;************************************************
NEWSYM Op44 ; EOR A,dp A <- A EOR (dp) N.....Z.
SPCaddr_DP
SPC_EOR_A
NEWSYM Op54 ; EOR A,dp+x A <- A EOR (dp+X) N.....Z.
SPCaddr_DP_X
SPC_EOR_A
NEWSYM Op45 ; EOR A,labs A <- A EOR (abs) N.....Z.
SPCaddr_LABS
SPC_EOR_A
NEWSYM Op55 ; EOR A,labs+X A <- A EOR (abs+X) N.....Z.
SPCaddr_LABS_X
SPC_EOR_A
NEWSYM Op46 ; EOR A,(X) A <- A EOR (X) N......Z.
SPCaddr__X_
SPC_EOR_A
NEWSYM Op56 ; EOR A,labs+Y A <- A EOR (abs+Y) N......Z.
SPCaddr_LABS_Y
SPC_EOR_A
NEWSYM Op47 ; EOR A,(dp+X) A <- A EOR ((dp+X+1)(dp+X)) N......Z.
SPCaddr_bDP_Xb
SPC_EOR_A
NEWSYM Op57 ; EOR A,(dp)+Y A <- A EOR ((dp+1)(dp)+Y) N......Z.
SPCaddr_bDPb_Y
SPC_EOR_A
NEWSYM Op48 ; EOR A,#inm A <- A EOR inm N......Z.
mov al,[ebp]
inc ebp
SPC_EOR_A
;************************************************
; CMP A, instructions
;************************************************
NEWSYM Op64 ; CMP A,dp A-(dp) N.....ZC
SPCaddr_DP
SPC_CMP_A
NEWSYM Op74 ; CMP A,dp+x A-(dp+X) N.....ZC
SPCaddr_DP_X
SPC_CMP_A
NEWSYM Op65 ; CMP A,labs A-(abs) N.....ZC
SPCaddr_LABS
SPC_CMP_A
NEWSYM Op75 ; CMP A,labs+X A-(abs+X) N.....ZC
SPCaddr_LABS_X
SPC_CMP_A
NEWSYM Op66 ; CMP A,(X) A-(X) N......ZC
SPCaddr__X_
SPC_CMP_A
NEWSYM Op76 ; CMP A,labs+Y A-(abs+Y) N......ZC
SPCaddr_LABS_Y
SPC_CMP_A
NEWSYM Op67 ; CMP A,(dp+X) A-((dp+X+1)(dp+X)) N......ZC
SPCaddr_bDP_Xb
SPC_CMP_A
NEWSYM Op77 ; CMP A,(dp)+Y A-((dp+1)(dp)+Y) N......ZC
SPCaddr_bDPb_Y
SPC_CMP_A
NEWSYM Op68 ; CMP A,#inm A-inm N......ZC
mov al,[ebp]
inc ebp
SPC_CMP_A
;************************************************
; ADC A, instructions
;************************************************
NEWSYM Op84 ; ADC A,dp A <- A+(dp)+C NV..H.ZC
SPCaddr_DP
SPC_ADC_A
NEWSYM Op94 ; ADC A,dp+x A <- A+(dp+X)+C NV..H.ZC
SPCaddr_DP_X
SPC_ADC_A
NEWSYM Op85 ; ADC A,labs A <- A+(abs)+C NV..H.ZC
SPCaddr_LABS
SPC_ADC_A
NEWSYM Op95 ; ADC A,labs+X A <- A+(abs+X)+C NV..H.ZC
SPCaddr_LABS_X
SPC_ADC_A
NEWSYM Op86 ; ADC A,(X) A <- A+(X)+C NV..H..ZC
SPCaddr__X_
SPC_ADC_A
NEWSYM Op96 ; ADC A,labs+Y A <- A+(abs+Y)+C NV..H..ZC
SPCaddr_LABS_Y
SPC_ADC_A
NEWSYM Op87 ; ADC A,(dp+X) A <- A+((dp+X+1)(dp+X)) NV..H..ZC
SPCaddr_bDP_Xb
SPC_ADC_A
NEWSYM Op97 ; ADC A,(dp)+Y A <- A+((dp+1)(dp)+Y) NV..H..ZC
SPCaddr_bDPb_Y
SPC_ADC_A
NEWSYM Op88 ; ADC A,#inm A <- A+inm+C NV..H..ZC
mov al,[ebp]
inc ebp
SPC_ADC_A
;************************************************
; SBC A, instructions
;************************************************
NEWSYM OpA4 ; SBC A,dp A <- A-(dp)-!C NV..H.ZC
SPCaddr_DP
SPC_SBC_A
NEWSYM OpB4 ; SBC A,dp+x A <- A-(dp+X)-!C NV..H.ZC
SPCaddr_DP_X
SPC_SBC_A
NEWSYM OpA5 ; SBC A,labs A <- A-(abs)-!C NV..H.ZC
SPCaddr_LABS
SPC_SBC_A
NEWSYM OpB5 ; SBC A,labs+x A <- A-(abs+X)-!C NV..H.ZC
SPCaddr_LABS_X
SPC_SBC_A
NEWSYM OpA6 ; SBC A,(X) A <- A-(X)-!C NV..H..ZC
SPCaddr__X_
SPC_SBC_A
NEWSYM OpB6 ; SBC A,labs+Y A <- A-(abs+Y)-!C NV..H..ZC
SPCaddr_LABS_Y
SPC_SBC_A
NEWSYM OpA7 ; SBC A,(dp+X) A <- A-((dp+X+1)(dp+X))-!C NV..H..ZC
SPCaddr_bDP_Xb
SPC_SBC_A
NEWSYM OpB7 ; SBC A,(dp)+Y A <- A-((dp+1)(dp)+Y)-!C NV..H..ZC
SPCaddr_bDPb_Y
SPC_SBC_A
NEWSYM OpA8 ; SBC A,#inm A <- A-inm-!C NV..H..ZC
mov al,[ebp]
inc ebp
SPC_SBC_A
;************************************************
; MOV A, instructions
;************************************************
NEWSYM OpE4 ; MOV A,dp A <- (dp) N......Z
SPCaddr_DP
SPC_MOV_A
NEWSYM OpF4 ; MOV A,dp+x A <- (dp+X) N......Z
SPCaddr_DP_X
SPC_MOV_A
NEWSYM OpE5 ; MOV A,labs A <- (abs) N......Z
SPCaddr_LABS
SPC_MOV_A
NEWSYM OpF5 ; MOV A,labs+X A <- (abs+X) N......Z
SPCaddr_LABS_X
SPC_MOV_A
NEWSYM OpE6 ; MOV A,(X) A <- (X) N......Z
SPCaddr__X_
SPC_MOV_A
NEWSYM OpF6 ; MOV A,labs+Y A <- (abs+Y) N......Z
SPCaddr_LABS_Y
SPC_MOV_A
NEWSYM OpE7 ; MOV A,(dp+X) A <- ((dp+X+1)(dp+X)) N......Z
SPCaddr_bDP_Xb
SPC_MOV_A
NEWSYM OpF7 ; MOV A,(dp)+Y A <- ((dp+1)(dp)+Y) N......Z
SPCaddr_bDPb_Y
SPC_MOV_A
NEWSYM OpE8 ; MOV A,#inm A <- inm N......Z
mov al,[ebp]
inc ebp
SPC_MOV_A
;************************************************
; DP,#imm instructions
;************************************************
%macro spcgetdp_imm 0
mov bl,[ebp+1]
mov ah,[ebp]
add ebx,[spcRamDP]
ReadByte2
add ebp,2
%endmacro
NEWSYM OpB8 ; SBC dp,#inm (dp) <- (dp)-inm-!C NV..H..ZC
spcgetdp_imm ; bl<-[ebp+1], ah<-[ebp], ebx+[spcRamDP],Readbyte,ebp+2
mov cl,[spcP]
xor cl,1
shr cl,1
sbb al,ah
cmc
SPCSetFlagnvhzcnoret
WriteByte
ret
NEWSYM Op98 ; ADC dp,#inm (dp) <- (dp)+inm+C NV..H..ZC
spcgetdp_imm ; bl<-[ebp+1], ah<-[ebp], ebx+[spcRamDP],Readbyte,ebp+2
mov cl,[spcP]
shr cl,1
adc al,ah
SPCSetFlagnvhzcnoret
WriteByte
ret
NEWSYM Op78 ; CMP dp,#inm (dp)-inm N......ZC
mov bl,[ebp+1]
mov ah,[ebp]
add ebx,[spcRamDP]
ReadByte
add ebp,2
cmp al,ah
cmc
SPCSetFlagnzcnoret
ret
NEWSYM Op58 ; EOR dp,#inm (dp) <- (dp) EOR inm N......Z.
spcgetdp_imm ; bl<-[ebp+1], ah<-[ebp], ebx+[spcRamDP],Readbyte,ebp+2
xor al,ah
mov [spcNZ], al
WriteByte
ret
NEWSYM Op38 ; AND dp,#inm (dp) <- (dp) AND inm N......Z.
spcgetdp_imm ; bl<-[ebp+1], ah<-[ebp], ebx+[spcRamDP],Readbyte,ebp+2
and al,ah
mov [spcNZ], al
WriteByte
ret
NEWSYM Op18 ; OR dp,#inm (dp) <- (dp) OR inm N......Z.
spcgetdp_imm ; bl<-[ebp+1], ah<-[ebp], ebx+[spcRamDP],Readbyte,ebp+2
or al,ah
mov [spcNZ],al
WriteByte
ret
;************************************************
; DP(D),DP(S) instructions
;************************************************
%macro spcaddrDPbDb_DPbSb 1
xor ecx,ecx
mov bl,[ebp+1]
mov cl,[ebp]
add ebx,[spcRamDP]
add ebp,2
add ecx,[spcRamDP]
push ebx
ReadByte
mov ebx,ecx
mov cl,al
%1
ReadByte
mov ah,al
mov al,cl
pop ebx
%endmacro
NEWSYM Op09 ; OR dp(d),dp(s) (dp(d))<-(dp(d)) OR (dp(s)) N......Z.
spcaddrDPbDb_DPbSb Op09b:
or al,ah
mov [spcNZ], al
WriteByte
xor ecx,ecx
ret
NEWSYM Op29 ; AND dp(d),dp(s) (dp(d))<-(dp(d)) AND (dp(s)) N......Z.
spcaddrDPbDb_DPbSb Op29b:
and al,ah
mov [spcNZ], al
WriteByte
xor ecx,ecx
ret
NEWSYM Op49 ; EOR dp(d),dp(s) (dp(d))<-(dp(d)) EOR (dp(s)) N......Z.
spcaddrDPbDb_DPbSb Op49b:
xor al,ah
mov [spcNZ], al
WriteByte
xor ecx,ecx
ret
NEWSYM Op69 ; CMP dp(d),dp(s) (dp(d))-(dp(s)) N......ZC
spcaddrDPbDb_DPbSb Op69b:
cmp al,ah
cmc
SPCSetFlagnzcnoret
xor ecx,ecx
ret
NEWSYM Op89 ; ADC dp(d),dp(s) (dp(d))<-(dp(d))+(dp(s))+C NV..H..ZC
spcaddrDPbDb_DPbSb Op89b
mov cl,[spcP]
shr cl,1
adc al,ah
SPCSetFlagnvhzcnoret
WriteByte
xor ecx,ecx
ret
NEWSYM OpA9 ; SBC dp(d),dp(s) (dp(d))<-(dp(d))-(dp(s))-!C NV..H..ZC
spcaddrDPbDb_DPbSb OpA9b
mov cl,[spcP]
xor cl,1
shr cl,1
sbb al,ah
cmc
SPCSetFlagnvhzcnoret
WriteByte
xor ecx,ecx
ret
NEWSYM OpFA ; MOV dp(d),dp(s) (dp(d)) <- (dp(s)) ........
xor ecx,ecx
mov bl,[ebp+1]
mov cl,[ebp]
add ebx,[spcRamDP]
add ecx,[spcRamDP]
add ebp,2
push ebx
mov ebx,ecx
ReadByte
pop ebx
WriteByte
xor ecx,ecx
ret
;************************************************
; (X),(Y) instructions
;************************************************
%macro spcaddrDPbXb_bYb 1
mov bl,[spcY]
add ebx,[spcRamDP]
ReadByte
xor ebx,ebx
mov ah,al
mov bl,[spcX]
add ebx,[spcRamDP]
%1
ReadByte
%endmacro
NEWSYM Op19 ; OR (X),(Y) (X) <- (X) OR (Y) N......Z.
spcaddrDPbXb_bYb Op19b:
or al, ah
mov [spcNZ],al
WriteByte
ret
NEWSYM Op39 ; AND (X),(Y) (X) <- (X) AND (Y) N......Z.
spcaddrDPbXb_bYb Op39b:
and al, ah
mov [spcNZ],al
WriteByte
ret
NEWSYM Op59 ; EOR (X),(Y) (X) <- (X) EOR (Y) N......Z.
spcaddrDPbXb_bYb Op59b:
xor al, ah
mov [spcNZ],al
WriteByte
ret
NEWSYM Op79 ; CMP (X),(Y) (X)-(Y) N......ZC
spcaddrDPbXb_bYb Op79b:
cmp al, ah
cmc
SPCSetFlagnzc
NEWSYM Op99 ; ADC (X),(Y) (X) <- (X)+(Y)+C NV..H..ZC
spcaddrDPbXb_bYb Op99b:
mov cl,[spcP]
shr cl,1
adc al,ah
SPCSetFlagnvhzcnoret
WriteByte
ret
NEWSYM OpB9 ; SBC (X),(Y) (X) <- (X)-(Y)-!C NV..H..ZC
spcaddrDPbXb_bYb OpB9b:
mov cl,[spcP]
xor cl,1
shr cl,1
sbb al,ah
cmc
SPCSetFlagnvhzcnoret
WriteByte
ret
;************************************************
; MOV ,A instructions (Verified)
;************************************************
NEWSYM OpC4 ; MOV dp,A A -> (dp) ........
mov bl,[ebp]
mov al, byte [spcA]
add ebx,[spcRamDP]
inc ebp
WriteByte
ret
NEWSYM OpD4 ; MOV dp+x,A A -> (dp+X) ........
mov bl,[ebp]
add bl,[spcX]
mov al, byte [spcA]
add ebx,[spcRamDP]
inc ebp
WriteByte
ret
NEWSYM OpC5 ; MOV labs,A A -> (abs) ........
mov bx,[ebp]
mov al, byte [spcA]
add ebp,2
add ebx,spcRam
WriteByte
ret
NEWSYM OpD5 ; MOV labs+X,A A -> (abs+X) ........
mov bl,[spcX]
add bx,[ebp]
mov al, byte [spcA]
add ebp,2
add ebx,spcRam
WriteByte
ret
NEWSYM OpC6 ; MOV (X),A A -> (X) ........
mov bl,[spcX]
add ebx,[spcRamDP]
mov al, byte [spcA]
WriteByte
ret
NEWSYM OpD6 ; MOV labs+Y,A A -> (abs+Y) ........
mov bl,[spcY]
mov al, byte [spcA]
add bx,[ebp]
add ebp,2
add ebx,spcRam
WriteByte
ret
NEWSYM OpC7 ; MOV (dp+X),A A -> ((dp+X+1)(dp+X)) ........
mov bl,[ebp]
add bl,[spcX]
xor eax,eax
add ebx,[spcRamDP]
inc ebp
mov ax, word [ebx]
mov ebx,eax
add ebx,spcRam
mov al, byte [spcA]
WriteByte
ret
NEWSYM OpD7 ; MOV (dp)+Y,A A -> ((dp+1)(dp)+Y) ........
mov bl,[ebp]
xor eax,eax
add ebx,[spcRamDP]
inc ebp
mov ax, word [ebx]
add ax,[spcY]
mov ebx,eax
add ebx,spcRam
mov al, byte [spcA]
WriteByte
ret
;************************************************
; MOV instructions (Verified)
;************************************************
NEWSYM OpD8 ; MOV dp,X X -> (dp) ........
mov bl,[ebp]
mov al, byte [spcX]
add ebx,[spcRamDP]
inc ebp
WriteByte
ret
NEWSYM OpF8 ; MOV X,dp X <- (dp) N......Z
mov bl,[ebp]
inc ebp
add ebx,[spcRamDP]
ReadByte
mov byte [spcX], al
mov [spcNZ],al
ret
NEWSYM OpC9 ; MOV labs,X X -> (abs) ........
mov bx,[ebp]
mov al, byte [spcX]
add ebp,2
add ebx,spcRam
WriteByte
ret
NEWSYM OpE9 ; MOV X,labs X <- (abs) N......Z
mov bx,[ebp]
add ebx,spcRam
ReadByte
add ebp,2
mov byte [spcX], al
mov [spcNZ],al
ret
NEWSYM OpD9 ; MOV dp+Y,X X -> (dp+Y) ........
mov bl,[ebp]
mov al, byte [spcX]
add bl,[spcY]
inc ebp
add ebx,[spcRamDP]
WriteByte
ret
NEWSYM OpF9 ; MOV X,dp+Y X <- (dp+Y) N......Z
mov bl,[ebp]
add bl,[spcY]
inc ebp
add ebx,[spcRamDP]
ReadByte
mov byte [spcX], al
mov [spcNZ],al
ret
NEWSYM OpCB ; MOV dp,Y Y -> (dp) ........
mov bl,[ebp]
mov al, byte [spcY]
add ebx,[spcRamDP]
inc ebp
WriteByte
ret
NEWSYM OpEB ; MOV Y,dp Y <- (dp) N......Z
mov bl,[ebp]
add ebx,[spcRamDP]
inc ebp
ReadByte
mov byte [spcY], al
mov [spcNZ],al
ret
NEWSYM OpDB ; MOV dp+X,Y X -> (dp+X) ........
mov bl,[ebp]
add bl,[spcX]
mov al, byte [spcY]
add ebx,[spcRamDP]
inc ebp
WriteByte
ret
NEWSYM OpFB ; MOV Y,dp+X Y <- (dp+X) N......Z
mov bl,[ebp]
add bl,[spcX]
inc ebp
add ebx,[spcRamDP]
ReadByte
mov byte [spcY], al
mov [spcNZ],al
ret
NEWSYM OpCC ; MOV labs,Y Y -> (abs) ........
mov bx,[ebp]
mov al, byte [spcY]
add ebp,2
add ebx,spcRam
WriteByte
ret
NEWSYM OpEC ; MOV Y,labs Y <- (abs) N......Z
mov bx,[ebp]
add ebx,spcRam
ReadByte
add ebp,2
mov byte [spcY],al
mov [spcNZ],al
ret
NEWSYM Op5D ; MOV X,A X <- A N......Z
mov al,[spcA]
mov [spcX],al
mov [spcNZ],al
ret
NEWSYM Op7D ; MOV A,X A <- X N......Z
mov al,[spcX]
mov [spcA],al
mov [spcNZ],al
ret
NEWSYM Op8D ; MOV Y,#inm Y <- inm N......Z
mov bl,[ebp]
mov [spcY],bl
inc ebp
mov [spcNZ],bl
ret
NEWSYM OpCD ; MOV X,#inm X <- inm N......Z
mov bl,[ebp]
mov [spcX],bl
inc ebp
mov [spcNZ],bl
ret
NEWSYM Op8F ; MOV dp,#inm (dp) <- inm ........
mov bl,[ebp+1]
mov al,[ebp]
add ebx,[spcRamDP]
add ebp,2
WriteByte
ret
NEWSYM Op9D ; MOV X,SP X <- SP N......Z
mov al,[spcS]
mov [spcX],al
mov [spcNZ],al
ret
NEWSYM OpBD ; MOV SP,X SP <- X ........
mov al,[spcX]
mov [spcS],al
ret
NEWSYM OpDD ; MOV A,Y A <- Y N......Z
mov al,[spcY]
mov [spcA],al
mov [spcNZ],al
ret
NEWSYM OpFD ; MOV Y,A Y <- A N......Z
mov al,[spcA]
mov [spcY],al
mov [spcNZ],al
ret
NEWSYM OpAF ; MOV (X)+,A A -> (X) with auto inc ........
mov bl,[spcX]
add ebx,[spcRamDP]
mov al, byte [spcA]
inc byte [spcX]
WriteByte
ret
NEWSYM OpBF ; MOV A,(X)+ A <- (X) with auto inc N......Z
mov bl,[spcX]
add ebx,[spcRamDP]
ReadByte
inc byte [spcX]
mov byte [spcA],al
mov [spcNZ],al
ret
;************************************************
; CMP instructions (Verified)
;************************************************
NEWSYM OpC8 ; CMP X,#inm X-inm N......ZC
mov bl,[ebp]
inc ebp
cmp [spcX],bl
cmc
SPCSetFlagnzc
NEWSYM OpAD ; CMP Y,#inm Y-inm N......ZC
mov bl,[ebp]
inc ebp
cmp [spcY],bl
cmc
SPCSetFlagnzc
NEWSYM Op1E ; CMP X,labs X-(abs) N......ZC
mov bx,[ebp]
add ebp,2
add ebx,spcRam
ReadByte
cmp byte [spcX], al
cmc
SPCSetFlagnzc
NEWSYM Op3E ; CMP X,dp X-(dp) N......ZC
mov bl,[ebp]
add ebx,[spcRamDP]
inc ebp
ReadByte
cmp byte [spcX], al
cmc
SPCSetFlagnzc
NEWSYM Op5E ; CMP Y,labs Y-(abs) N......ZC
mov bx,[ebp]
add ebx,spcRam
ReadByte
add ebp,2
cmp byte [spcY], al
cmc
SPCSetFlagnzc
NEWSYM Op7E ; CMP Y,dp Y-(dp) N......ZC
mov bl,[ebp]
add ebx,[spcRamDP]
inc ebp
ReadByte
cmp byte [spcY], al
cmc
SPCSetFlagnzc
;************************************************
; Word Instructions (Verified)
;************************************************
NEWSYM Op1A ; DECW dp Decrement dp memory pair N......Z.
mov bl,[ebp]
add ebx,[spcRamDP]
inc ebp
inc ebx
ReadByte2
mov ah,al
dec ebx
NEWSYM Op1AB
ReadByte2
dec ax
test ax,8000h
jnz .YesNeg
cmp ax,0000h
je .YesZero
mov byte [spcNZ],1
jmp .SkipFlag
.YesNeg
mov byte [spcNZ],80h
jmp .SkipFlag
.YesZero
mov byte [spcNZ],0
.SkipFlag
push ebx
WriteByte
pop ebx
NEWSYM Op1Ab
inc ebx
mov al,ah
WriteByte
ret
NEWSYM Op3A ; INCW dp Increment dp memory pair N......Z.
mov bl,[ebp]
add ebx,[spcRamDP]
inc ebp
inc ebx
ReadByte2
mov ah,al
dec ebx
NEWSYM Op3AB
ReadByte2
inc ax
test ax,8000h
jnz .YesNeg
cmp ax,0000h
je .YesZero
mov byte [spcNZ],1
jmp .SkipFlag
.YesNeg
mov byte [spcNZ],80h
jmp .SkipFlag
.YesZero
mov byte [spcNZ],0
.SkipFlag
push ebx
WriteByte
pop ebx
NEWSYM Op3Ab
inc ebx
mov al,ah
WriteByte
ret
; looks like there is the Carry flag checked in op5a..
NEWSYM Op5A ; CMPW YA,dp YA - (dp+1)(dp) N......ZC
mov bl,[ebp]
add ebx,[spcRamDP]
inc ebp
inc ebx
ReadByte2
mov ah,al
dec ebx
NEWSYM Op5AB
ReadByte
mov bl,[spcA]
mov bh,[spcY]
cmp bx,ax
cmc
SPCSetFlagnzc
NEWSYM Op7A ; ADDW YA,dp YA <- YA + (dp+1)(dp) NV..H..ZC
mov bl,[ebp]
add ebx,[spcRamDP]
inc ebp
inc ebx
ReadByte2
mov ah,al
dec ebx
NEWSYM Op7AB
ReadByte
mov bl,[spcA]
mov bh,[spcY]
add bx,ax
mov [spcA],bl
mov [spcY],bh
SPCSetFlagnvhzc
NEWSYM Op9A ; SUBW YA,dp YA <- YA - (dp+1)(dp) NV..H..ZC
mov bl,[ebp]
add ebx,[spcRamDP]
inc ebp
inc ebx
ReadByte2
mov ah,al
dec ebx
NEWSYM Op9AB
ReadByte
mov bl,[spcA]
mov bh,[spcY]
sub bx,ax
cmc
mov [spcA],bl
mov [spcY],bh
SPCSetFlagnvhzc
NEWSYM OpBA ; MOVW YA,dp YA - (dp+1)(dp) N......Z.
mov bl,[ebp]
add ebx,[spcRamDP]
inc ebp
inc ebx
ReadByte2
mov ah,al
dec ebx
NEWSYM OpBAb
ReadByte
mov [spcA],al
mov [spcY],ah
test ax,8000h
jnz .YesNeg
cmp ax,0000h
je .YesZero
mov byte [spcNZ],1
ret
.YesNeg
mov byte [spcNZ],80h
ret
.YesZero
mov byte [spcNZ],0
ret
NEWSYM OpDA ; MOVW dp,YA (dp+1)(dp) - YA .........
mov bl,[ebp]
mov al,[spcA]
add ebx,[spcRamDP]
inc ebp
push ebx
WriteByte
pop ebx
inc ebx
mov al,[spcY]
NEWSYM OpDAb
WriteByte
ret
;************************************************
; mem.bit instructions (Verified)
;************************************************
%macro spcaddrmembit 0
mov bx,[ebp]
mov cl,bh
add ebp,2
shr cl,5
and bx,1FFFh
; mov cl,bl
; add ebp,2
; shr bx,3
; and cl,00000111b
add ebx,spcRam
ReadByte
shr al,cl
and al,01h
%endmacro
NEWSYM Op0A ; OR1 C,mem.bit C <- C OR (mem.bit) ........C
spcaddrmembit
or [spcP],al
ret
NEWSYM Op2A ; OR1 C,/mem.bit C <- C OR !(mem.bit) ........C
spcaddrmembit
xor al,01h
or [spcP],al
ret
NEWSYM Op4A ; AND1 C,mem.bit C <- C AND (mem.bit) ........C
mov bx,[ebp]
mov cl,bh
add ebp,2
shr cl,5
and bx,1FFFh
; mov cl,bl
; add ebp,2
; shr bx,3
; and cl,00000111b
add ebx,spcRam
ReadByte
shr al,cl
or al,0FEh
and [spcP],al
ret
NEWSYM Op6A ; AND1 C,/mem.bit C <- C AND !(mem.bit) ........C
mov bx,[ebp]
mov cl,bh
add ebp,2
shr cl,5
and bx,1FFFh
; mov cl,bl
; add ebp,2
; shr bx,3
; and cl,00000111b
add ebx,spcRam
ReadByte
shr al,cl
or al,0FEh
xor al,01h
and [spcP],al
ret
NEWSYM Op8A ; EOR1 C,mem.bit C <- C EOR (mem.bit) ........C
spcaddrmembit
xor [spcP],al
ret
NEWSYM OpAA ; MOV1 C,mem.bit C <- (mem.bit)
spcaddrmembit
and byte[spcP],0FEh
or [spcP],al
ret
NEWSYM OpCA ; MOV1 mem.bit,C C -> (mem.bit) .........
mov bx,[ebp]
mov al,[spcP]
mov cl,bh
mov ah,01h
shr cl,5
and bx,1FFFh
; mov cl,bl
; mov ah,01h
; and cl,00000111b
; shr bx,3
shl ah,cl
and al,01h
add ebp,2
shl al,cl
add ebx,spcRam
; al = carry flag positioned in correct location, ah = 1 positioned
mov cl,al
xor ah,0FFh
ReadByte2
and al,ah
or al,cl
WriteByte
ret
NEWSYM OpEA ; NOT1 mem.bit complement (mem.bit) .........
mov bx,[ebp]
mov cl,bh
mov ah,01h
shr cl,5
and bx,1FFFh
; mov cl,bl
; mov ah,01h
; and cl,00000111b
; shr bx,3
shl ah,cl
add ebp,2
add ebx,spcRam
ReadByte2
xor al,ah
WriteByte
ret
;************************************************
; Shift Instructions (Verified)
;************************************************
NEWSYM Op0B ; ASL dp C << (dp) <<0 N......ZC
mov bl,[ebp]
add ebx,[spcRamDP]
inc ebp
ReadByte2
shl al,1
SPCSetFlagnzcnoret
WriteByte
ret
NEWSYM Op4B ; LSR dp 0 >> (dp) <<C N......ZC
mov bl,[ebp]
add ebx,[spcRamDP]
inc ebp
ReadByte2
shr al,1
SPCSetFlagnzcnoret
WriteByte
ret
NEWSYM Op1B ; ASL dp+X C << (dp+X) <<0 N......ZC
mov bl,[ebp]
add bl,[spcX]
inc ebp
add ebx,[spcRamDP]
ReadByte2
shl al,1
SPCSetFlagnzcnoret
WriteByte
ret
NEWSYM Op5B ; LSR dp+X 0 >> (dp+X) <<C N......ZC
mov bl,[ebp]
add bl,[spcX]
inc ebp
add ebx,[spcRamDP]
ReadByte2
shr al,1
SPCSetFlagnzcnoret
WriteByte
ret
NEWSYM Op0C ; ASL labs C << (abs) <<0 N......ZC
mov bx,[ebp]
add ebx,spcRam
add ebp,2
ReadByte2
shl al,1
SPCSetFlagnzcnoret
WriteByte
ret
NEWSYM Op4C ; LSR labs 0 >> (abs) <<C N......ZC
mov bx,[ebp]
add ebx,spcRam
add ebp,2
ReadByte2
shr al,1
SPCSetFlagnzcnoret
WriteByte
ret
NEWSYM Op1C ; ASL A C << A <<0 N......ZC
shl byte [spcA],1
SPCSetFlagnzc
NEWSYM Op5C ; LSR A 0 >> A <<C N......ZC
shr byte [spcA],1
SPCSetFlagnzc
%macro spcROLstuff 0
rcl al,1
jc .setcarryflag
and byte[spcP],0FEh
mov [spcNZ],al
jmp .skipflags
.setcarryflag
or byte[spcP],01h
mov [spcNZ],al
.skipflags
%endmacro
%macro spcRORstuff 0
rcr al,1
jc .setcarryflag
and byte[spcP],0FEh
mov [spcNZ],al
jmp .skipflags
.setcarryflag
or byte[spcP],01h
mov [spcNZ],al
.skipflags
%endmacro
NEWSYM Op2B ; ROL dp C << (dp) <<C N......ZC
mov bl,[ebp]
add ebx,[spcRamDP]
inc ebp
test byte [spcP],01h
jnz near Op2Bb
ReadByte2
clc
spcROLstuff
WriteByte
ret
NEWSYM Op2Bb
ReadByte2
stc
spcROLstuff
WriteByte
ret
NEWSYM Op6B ; ROR dp C >> (dp) <<C N......ZC
mov bl,[ebp]
add ebx,[spcRamDP]
inc ebp
test byte [spcP],01h
jnz near Op6Bb
ReadByte2
clc
spcRORstuff
WriteByte
ret
NEWSYM Op6Bb
ReadByte2
stc
spcRORstuff
WriteByte
ret
NEWSYM Op3B ; ROL dp+X C << (dp+X) <<C N......ZC
mov bl,[ebp]
add bl,[spcX]
add ebx,[spcRamDP]
inc ebp
test byte [spcP],01h
jnz near Op3Bb
ReadByte2
clc
spcROLstuff
WriteByte
ret
NEWSYM Op3Bb
ReadByte2
stc
spcROLstuff
WriteByte
ret
NEWSYM Op7B ; ROR dp+X C >> (dp+X) <<C N......ZC
mov bl,[ebp]
add bl,[spcX]
add ebx,[spcRamDP]
inc ebp
test byte [spcP],01h
jnz near Op7Bb
ReadByte2
clc
spcRORstuff
WriteByte
ret
NEWSYM Op7Bb
ReadByte2
stc
spcRORstuff
WriteByte
ret
NEWSYM Op2C ; ROL labs C << (abs) <<C N......ZC
mov bx,[ebp]
add ebx,spcRam
add ebp,2
test byte [spcP],01h
jnz near Op2Cb
ReadByte2
clc
spcROLstuff
WriteByte
ret
NEWSYM Op2Cb
ReadByte2
stc
spcROLstuff
WriteByte
ret
NEWSYM Op6C ; ROR labs C >> (abs) <<C N......ZC
mov bx,[ebp]
add ebx,spcRam
add ebp,2
test byte [spcP],01h
jnz near Op6Cb
ReadByte2
clc
spcRORstuff
WriteByte
ret
NEWSYM Op6Cb
ReadByte2
stc
spcRORstuff
WriteByte
ret
NEWSYM Op3C ; ROL A C << A <<C N......ZC
test byte [spcP],01h
jnz near Op3Cb
clc
rcl byte [spcA],1
mov al,[spcA]
jc .setcarryflag
and byte[spcP],0FEh
mov [spcNZ],al
ret
.setcarryflag
or byte[spcP],01h
mov [spcNZ],al
ret
NEWSYM Op3Cb
stc
rcl byte [spcA],1
mov al,[spcA]
jc .setcarryflag
and byte[spcP],0FEh
mov [spcNZ],al
ret
.setcarryflag
or byte[spcP],01h
mov [spcNZ],al
ret
NEWSYM Op7C ; ROR A C >> A <<C N......ZC
test byte [spcP],01h
jnz near Op7Cb
clc
rcr byte [spcA],1
mov al,[spcA]
jc .setcarryflag
and byte[spcP],0FEh
mov [spcNZ],al
ret
.setcarryflag
or byte[spcP],01h
mov [spcNZ],al
ret
NEWSYM Op7Cb
stc
rcr byte [spcA],1
mov al,[spcA]
jc .setcarryflag
and byte[spcP],0FEh
mov [spcNZ],al
ret
.setcarryflag
or byte[spcP],01h
mov [spcNZ],al
ret
;************************************************
; INC/DEC instructions (Verified)
;************************************************
NEWSYM Op8B ; DEC dp -- (dp) N......Z.
mov bl,[ebp]
add ebx,[spcRamDP]
inc ebp
ReadByte2
dec al
mov [spcNZ], al
WriteByte
ret
NEWSYM OpAB ; INC dp ++ (dp) N......Z.
mov bl,[ebp]
add ebx,[spcRamDP]
inc ebp
ReadByte2
inc al
mov [spcNZ], al
WriteByte
ret
NEWSYM Op9B ; DEC dp+X -- (dp+X) N......Z.
mov bl,[ebp]
add bl,[spcX]
add ebx,[spcRamDP]
inc ebp
ReadByte2
dec al
mov [spcNZ], al
WriteByte
ret
NEWSYM OpBB ; INC dp+X ++ (dp+X) N......Z.
mov bl,[ebp]
add bl,[spcX]
add ebx,[spcRamDP]
inc ebp
ReadByte2
inc al
mov [spcNZ], al
WriteByte
ret
NEWSYM Op8C ; DEC labs -- (abs) N......Z.
mov bx,[ebp]
add ebx,spcRam
add ebp,2
ReadByte2
dec al
mov [spcNZ], al
WriteByte
ret
NEWSYM OpAC ; INC labs ++ (abs) N......Z.
mov bx,[ebp]
add ebx,spcRam
add ebp,2
ReadByte2
inc al
mov [spcNZ], al
WriteByte
ret
NEWSYM Op9C ; DEC A -- A N......Z.
dec byte [spcA]
mov al,byte [spcA]
mov [spcNZ],al
ret
NEWSYM OpBC ; INC A ++ A N......Z.
inc byte [spcA]
mov al,byte [spcA]
mov [spcNZ],al
ret
NEWSYM OpDC ; DEC Y -- Y N......Z.
dec byte [spcY]
mov al,byte [spcY]
mov [spcNZ],al
ret
NEWSYM OpFC ; INC Y ++ Y N......Z.
inc byte [spcY]
mov al,byte [spcY]
mov [spcNZ],al
ret
NEWSYM Op1D ; DEC X -- X N......Z.
dec byte [spcX]
mov al,byte [spcX]
mov [spcNZ],al
ret
NEWSYM Op3D ; INC X ++ X N......Z.
inc byte [spcX]
mov al,byte [spcX]
mov [spcNZ],al
ret
;************************************************
; PUSH/POP instructions (Verified)
;************************************************
NEWSYM Op0D ; PUSH PSW push PSW to stack .........
mov eax,[spcS]
mov bl,[spcP]
and bl,01111101b
test byte [spcNZ],80h
jnz .NegSet
cmp byte [spcNZ],0
je .ZeroSet
dec byte [spcS]
mov [spcRam+eax],bl
ret
.NegSet
or bl,80h
dec byte [spcS]
mov [spcRam+eax],bl
ret
.ZeroSet
or bl,02h
dec byte [spcS]
mov [spcRam+eax],bl
ret
NEWSYM Op2D ; PUSH A push A to stack .........
mov eax,[spcS]
mov bl,[spcA]
dec byte [spcS]
mov [spcRam+eax],bl
ret
NEWSYM Op4D ; PUSH X push X to stack .........
mov eax,[spcS]
mov bl,[spcX]
dec byte [spcS]
mov [spcRam+eax],bl
ret
NEWSYM Op6D ; PUSH Y push Y to stack .........
mov eax,[spcS]
mov bl,[spcY]
dec byte [spcS]
mov [spcRam+eax],bl
ret
NEWSYM Op8E ; POP PSW pop PSW from stack (Restored)
inc byte [spcS]
mov eax,[spcS]
mov byte [spcNZ],0
mov bl,[spcRam+eax]
mov [spcP],bl
test byte [spcP],2
jnz .ZeroYes
mov byte [spcNZ],1
test byte [spcP],80h
jz .NoNeg
or byte [spcNZ],80h
.NoNeg
.ZeroYes
mov dword [spcRamDP],spcRam
test byte[spcP],32
jnz .setpage1
ret
.setpage1
add dword [spcRamDP],100h
ret
NEWSYM OpAE ; POP A pop A from stack .........
inc byte [spcS]
mov eax,[spcS]
mov bl,[spcRam+eax]
mov [spcA],bl
ret
NEWSYM OpCE ; POP X pop X from stack .........
inc byte [spcS]
mov eax,[spcS]
mov bl,[spcRam+eax]
mov [spcX],bl
ret
NEWSYM OpEE ; POP Y pop Y from stack .........
inc byte [spcS]
mov eax,[spcS]
mov bl,[spcRam+eax]
mov [spcY],bl
ret
;************************************************
; Test & set bits Instructions (Verified?)
;************************************************
NEWSYM Op0E ; TSET1 labs test and set bits with A N......Z.
mov bx,[ebp]
add ebx,spcRam
add ebp,2
ReadByte2
mov ah,al
and ah,[spcA]
mov [spcNZ],ah
or al,[spcA]
WriteByte
ret
NEWSYM Op4E ; TCLR1 test and clear bits with A N......Z.
mov bx,[ebp]
add ebx,[spcRamDP]
add ebp,2
ReadByte2
mov ah,al
and ah,[spcA]
mov [spcNZ],ah
mov ah,[spcA]
not ah
and al,ah
WriteByte
ret
;************************************************
; Compare/Decrement & Branch Instructions (Verified)
;************************************************
NEWSYM Op2E ; CBNE dp,rel compare A with (dp) then BNE ...
mov bl,[ebp]
add ebx,[spcRamDP]
ReadByte2
cmp byte [spcA], al
jne .Jump
add ebp,2
ret
.Jump
movsx ebx,byte [ebp+1]
add ebp,ebx
add ebp,2
ret
NEWSYM OpDE ; CBNE dp+X,rel compare A with (dp+X) then BNE ...
mov bl,[ebp]
add bl,[spcX]
add ebx,[spcRamDP]
ReadByte2
cmp byte [spcA], al
jne .Jump
add ebp,2
ret
.Jump
movsx ebx,byte [ebp+1]
add ebp,ebx
add ebp,2
ret
NEWSYM Op6E ; DBNZ decrement memory (dp) then JNZ ...
mov bl,[ebp]
add ebx,[spcRamDP]
ReadByte2
dec al
jnz .Jump
add ebp,2
WriteByte
ret
.Jump
NEWSYM Op6Eb
push ebx
movsx ebx,byte [ebp+1]
add ebp,ebx
add ebp,2
pop ebx
WriteByte
ret
NEWSYM OpFE ; DBNZ Y,rel decrement Y then JNZ ...
dec byte [spcY]
jnz .Jump
inc ebp
ret
.Jump
movsx ebx,byte [ebp]
add ebp,ebx
inc ebp
ret
;************************************************
; Jump/Subroutine Instructions
;************************************************
NEWSYM Op0F ; BRK software interrupt ...1.0..
inc dword[spc700read]
dec ebp
ret
NEWSYM Op1F ; JMP (labs+X) PC <- (abs+X+1)(abs+X) ...
mov bx,[ebp]
add bx,[spcX]
xor eax,eax
add ebp,2
mov ax, word [spcRam+ebx]
mov ebp,spcRam
add ebp,eax
ret
NEWSYM Op3F ; CALL labs subroutine call ........
; calculate PC
mov ecx,ebp
add ecx,2
sub ecx,spcRam
mov eax,[spcS]
mov [spcRam+eax],ch
dec byte [spcS]
mov eax,[spcS]
mov [spcRam+eax],cl
dec byte [spcS]
; set new PC
mov cx,[ebp]
add ecx,spcRam
mov ebp,ecx
xor ecx,ecx
ret
NEWSYM Op4F ; PCALL upage upage call ........
; calculate PC
mov ecx,ebp
inc ecx
sub ecx,spcRam
mov eax,[spcS]
mov [spcRam+eax],ch
dec byte [spcS]
mov eax,[spcS]
mov [spcRam+eax],cl
dec byte [spcS]
; set new PC
xor ecx,ecx
mov cl,[ebp]
add ecx,spcRam
add ecx,0ff00h
mov ebp,ecx
xor ecx,ecx
ret
; I'm not sure about this one and JMP labs+X...
NEWSYM Op5F ; JMP labs jump to new location ...
mov bx,[ebp]
add ebp,2
mov ebp,spcRam
add ebp,ebx
ret
NEWSYM Op6F ; ret ret from subroutine ........
xor ecx,ecx
inc byte [spcS]
mov eax,[spcS]
mov cl,[spcRam+eax]
inc byte [spcS]
mov eax,[spcS]
mov ch,[spcRam+eax]
add ecx,spcRam
mov ebp,ecx
xor ecx,ecx
ret
NEWSYM Op7F ; ret1 return from interrupt (Restored)
dec ebp
ret
xor ecx,ecx
inc byte [spcS]
mov eax,[spcS]
mov cl,[spcRam+eax]
mov [spcP],cl
test byte [spcP],80h
jz .NoNeg
or byte [spcNZ],80h
.NoNeg
test byte [spcP],2
jz .NoZero
mov byte [spcNZ],0
jmp .YesZero
.NoZero
or byte [spcNZ],1
.YesZero
inc byte [spcS]
mov eax,[spcS]
mov cl,[spcRam+eax]
inc byte [spcS]
mov eax,[spcS]
mov ch,[spcRam+eax]
add ecx,spcRam
mov ebp,ecx
; set direct page
mov dword [spcRamDP],spcRam
test byte[spcP],32
jz .nodp
add dword [spcRamDP],100h
.nodp
xor ecx,ecx
ret
;************************************************
; Divide/Multiply Instructions
;************************************************
NEWSYM Op9E ; DIV YA,X Q:A B:Y <- YA / X NV..H..Z.
push edx
mov ah,[spcY]
mov al,[spcA]
xor bh,bh
xor dx,dx
mov bl,[spcX]
cmp bl,0
je NoDiv
div bx
mov byte[spcA],al
mov byte[spcY],dl
cmp ah,0
jne Over
and byte [spcP],191-16
pop edx
mov [spcNZ],al
ret
NEWSYM NoDiv
mov byte [spcA],0ffh
mov byte [spcY],0ffh
or byte [spcP],16
and byte[spcP],255-64
pop edx
ret
NEWSYM Over
or byte [spcP],64
and byte[spcP],255-16
pop edx
mov [spcNZ],al
ret
NEWSYM OpCF ; MUL YA YA(16 bits) <- Y * A N......Z.
mov al,[spcA]
mov bl,[spcY]
mul bl
mov [spcA],al
mov [spcY],ah
; ??? (Is the n flag set on YA or A?)
test ax,8000h
jnz .YesNeg
cmp ax,0000h
je .YesZero
mov byte [spcNZ],1
ret
.YesNeg
mov byte [spcNZ],80h
ret
.YesZero
mov byte [spcNZ],0
ret
;************************************************
; Decimal Operations
;************************************************
NEWSYM OpBE ; DAS A decimal adjust for sub N......ZC
; ret
; copy al flags into AH
xor ah,ah
test byte[spcNZ],80h
jz .noneg
or ah,10000000b
.noneg
test byte[spcP],01h
jz .nocarry
or ah,00000001b
.nocarry
test byte[spcNZ],0FFh
jnz .nozero
or ah,01000000b
.nozero
test byte[spcP],08h
jz .nohcarry
or ah,00010000b
.nohcarry
mov al,[spcA]
sahf
das
mov [spcA],al
SPCSetFlagnzc
NEWSYM OpDF ; DAA A decimal adjust for add N......ZC
; copy al flags into AH
xor ah,ah
test byte[spcNZ],80h
jz .noneg
or ah,10000000b
.noneg
test byte[spcP],01h
jz .nocarry
or ah,00000001b
.nocarry
test byte[spcNZ],0FFh
jnz .nozero
or ah,01000000b
.nozero
test byte[spcP],08h
jz .nohcarry
or ah,00010000b
.nohcarry
mov al,[spcA]
sahf
daa
mov [spcA],al
SPCSetFlagnzc
NEWSYM Invalidopcode ; Invalid Opcode
dec ebp
ret