diff --git a/bsnes/Makefile b/bsnes/Makefile deleted file mode 100644 index f9bf879a..00000000 --- a/bsnes/Makefile +++ /dev/null @@ -1,43 +0,0 @@ -CC = cl -CFLAGS = /nologo /O2 -OBJS = main.obj timing.obj g65816.obj d65816.obj spc700.obj dspc700.obj memory.obj mmio.obj bridge.obj gui.obj libstr.obj -LIBS = kernel32.lib user32.lib gdi32.lib comdlg32.lib ddraw.lib - -all: $(OBJS) - $(CC) /Febsnes.exe $(CFLAGS) $(OBJS) $(LIBS) - -clean: - del *.obj - -main.obj: main.cpp main.h - $(CC) $(CFLAGS) /c main.cpp - -timing.obj: timing/timing.cpp timing/timing.h - $(CC) $(CFLAGS) /c timing/timing.cpp - -g65816.obj: cpu/g65816*.cpp cpu/g65816.h - $(CC) $(CFLAGS) /c cpu/g65816.cpp - -d65816.obj: cpu/d65816.cpp - $(CC) $(CFLAGS) /c cpu/d65816.cpp - -spc700.obj: apu/spc700*.cpp apu/spc700*.h - $(CC) $(CFLAGS) /c apu/spc700.cpp - -dspc700.obj: apu/dspc700.cpp - $(CC) $(CFLAGS) /c apu/dspc700.cpp - -memory.obj: mem/memory.cpp - $(CC) $(CFLAGS) /c mem/memory.cpp - -mmio.obj: ppu/mmio.cpp ppu/ppu*.cpp - $(CC) $(CFLAGS) /c ppu/mmio.cpp - -bridge.obj: bridge/bridge.cpp bridge/bridge.h - $(CC) $(CFLAGS) /c bridge/bridge.cpp - -gui.obj: win/gui*.cpp win/render*.cpp - $(CC) $(CFLAGS) /c win/gui.cpp - -libstr.obj: misc/libstr.cpp - $(CC) $(CFLAGS) /c misc/libstr.cpp diff --git a/bsnes/apu/dspc700.cpp b/bsnes/apu/dspc700.cpp deleted file mode 100644 index 2359ac59..00000000 --- a/bsnes/apu/dspc700.cpp +++ /dev/null @@ -1,314 +0,0 @@ -#include "../base.h" -#include "spc700.h" -extern sony_spc700 *spc700; -extern debugstate debugger; - -char __disas_spc700_str[256]; - -word __disas_spc700_relb(byte arg, byte offset) { -word r = spc700->regs.pc + (signed char)arg; - r += offset; - return r; -} - -void __disas_spc700_op(byte op, byte op0, byte op1) { -char *s = (char*)__disas_spc700_str; -word opw = (op1 << 8) | (op0); - switch(op) { - case 0x00:sprintf(s, "nop");break; - case 0x01:sprintf(s, "tcall 0");break; - case 0x02:sprintf(s, "set0 $%0.2x", op0);break; - case 0x03:sprintf(s, "bbs0 $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0x04:sprintf(s, "or a,$%0.2x", op0);break; - case 0x05:sprintf(s, "or a,$%0.4x", opw);break; - case 0x06:sprintf(s, "or a,(x)");break; - case 0x07:sprintf(s, "or a,($%0.2x+x)", op0);break; - case 0x08:sprintf(s, "or a,#$%0.2x", op0);break; - case 0x09:sprintf(s, "or ($%0.2x),($%0.2x)", op1, op0);break; - case 0x0a:sprintf(s, "or1 c,$%0.4x,%d", opw & 0x1fff, opw >> 13);break; - case 0x0b:sprintf(s, "asl $%0.2x", op0);break; - case 0x0c:sprintf(s, "mov $%0.4x,y", opw);break; - case 0x0d:sprintf(s, "push psw");break; - case 0x0e:sprintf(s, "tset1 $%0.4x", opw);break; - case 0x0f:sprintf(s, "brk");break; - case 0x10:sprintf(s, "bpl $%0.4x", __disas_spc700_relb(op0, 2));break; - case 0x11:sprintf(s, "tcall 1");break; - case 0x12:sprintf(s, "clr0 $%0.2x", op0);break; - case 0x13:sprintf(s, "bbc0 $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0x14:sprintf(s, "or a,$%0.2x+x", op0);break; - case 0x15:sprintf(s, "or a,$%0.4x+x", opw);break; - case 0x16:sprintf(s, "or a,$%0.4x+y", opw);break; - case 0x17:sprintf(s, "or a,($%0.2x)+y", op0);break; - case 0x18:sprintf(s, "or $%0.2x,#$%0.2x", op1, op0);break; - case 0x19:sprintf(s, "or (x),(y)");break; - case 0x1a:sprintf(s, "decw $%0.2x", op0);break; - case 0x1b:sprintf(s, "asl $%0.2x+x", op0);break; - case 0x1c:sprintf(s, "asl a");break; - case 0x1d:sprintf(s, "dec x");break; - case 0x1e:sprintf(s, "cmp x,$%0.4x", opw);break; - case 0x1f:sprintf(s, "jmp ($%0.4x+x)", opw);break; - case 0x20:sprintf(s, "clrp");break; - case 0x21:sprintf(s, "tcall 2");break; - case 0x22:sprintf(s, "set1 $%0.2x", op0);break; - case 0x23:sprintf(s, "bbs1 $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0x24:sprintf(s, "and a,$%0.2x", op0);break; - case 0x25:sprintf(s, "and a,$%0.4x", opw);break; - case 0x26:sprintf(s, "and a,(x)", op0);break; - case 0x27:sprintf(s, "and a,($%0.2x+x)", op0);break; - case 0x28:sprintf(s, "and a,#$%0.2x", op0);break; - case 0x29:sprintf(s, "and ($%0.2x),($%0.2x)", op1, op0);break; - case 0x2a:sprintf(s, "or1 c,!$%0.4x,%d", opw & 0x1fff, opw >> 13);break; - case 0x2b:sprintf(s, "rol $%0.2x", op0);break; - case 0x2c:sprintf(s, "rol $%0.4x", opw);break; - case 0x2d:sprintf(s, "push a");break; - case 0x2e:sprintf(s, "cbne $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0x2f:sprintf(s, "bra $%0.4x", __disas_spc700_relb(op0, 2));break; - case 0x30:sprintf(s, "bmi $%0.4x", __disas_spc700_relb(op0, 2));break; - case 0x31:sprintf(s, "tcall 3");break; - case 0x32:sprintf(s, "clr1 $%0.2x", op0);break; - case 0x33:sprintf(s, "bbc1 $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0x34:sprintf(s, "and a,$%0.2x+x", op0);break; - case 0x35:sprintf(s, "and a,$%0.4x+x", opw);break; - case 0x36:sprintf(s, "and a,$%0.4x+y", opw);break; - case 0x37:sprintf(s, "and a,($%0.2x)+y", op0);break; - case 0x38:sprintf(s, "and $%0.2x,#$%0.2x", op1, op0);break; - case 0x39:sprintf(s, "and (x),(y)");break; - case 0x3a:sprintf(s, "incw $%0.2x", op0);break; - case 0x3b:sprintf(s, "rol $%0.2x+x", op0);break; - case 0x3c:sprintf(s, "rol a");break; - case 0x3d:sprintf(s, "inc x");break; - case 0x3e:sprintf(s, "cmp x,$%0.2x", op0);break; - case 0x3f:sprintf(s, "call $%0.4x", opw);break; - case 0x40:sprintf(s, "setp");break; - case 0x41:sprintf(s, "tcall 4");break; - case 0x42:sprintf(s, "set2 $%0.2x", op0);break; - case 0x43:sprintf(s, "bbs2 $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0x44:sprintf(s, "eor a,$%0.2x", op0);break; - case 0x45:sprintf(s, "eor a,$%0.4x", opw);break; - case 0x46:sprintf(s, "eor a,(x)");break; - case 0x47:sprintf(s, "eor a,($%0.2x+x)", op0);break; - case 0x48:sprintf(s, "eor a,#$%0.2x", op0);break; - case 0x49:sprintf(s, "eor ($%0.2x),($%0.2x)", op1, op0);break; - case 0x4a:sprintf(s, "and1 c,$%0.4x,%d", opw & 0x1fff, opw >> 13);break; - case 0x4b:sprintf(s, "lsr $%0.2x", op0);break; - case 0x4c:sprintf(s, "lsr $%0.4x", opw);break; - case 0x4d:sprintf(s, "push x");break; - case 0x4e:sprintf(s, "tclr1 $%0.4x", opw);break; - case 0x4f:sprintf(s, "pcall $%0.2x", op0);break; - case 0x50:sprintf(s, "bvc $%0.4x", __disas_spc700_relb(op0, 2));break; - case 0x51:sprintf(s, "tcall 5");break; - case 0x52:sprintf(s, "clr2 $%0.2x", op0);break; - case 0x53:sprintf(s, "bbc2 $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0x54:sprintf(s, "eor a,$%0.2x+x", op0);break; - case 0x55:sprintf(s, "eor a,$%0.4x+x", opw);break; - case 0x56:sprintf(s, "eor a,$%0.4x+y", opw);break; - case 0x57:sprintf(s, "eor a,($%0.2x)+y", op0);break; - case 0x58:sprintf(s, "eor $%0.2x,#$%0.2x", op1, op0);break; - case 0x59:sprintf(s, "eor (x),(y)", op0);break; - case 0x5a:sprintf(s, "cmpw ya,$%0.2x", op0);break; - case 0x5b:sprintf(s, "lsr $%0.2x+x", op0);break; - case 0x5c:sprintf(s, "lsr a");break; - case 0x5d:sprintf(s, "mov x,a");break; - case 0x5e:sprintf(s, "cmp y,$%0.4x", opw);break; - case 0x5f:sprintf(s, "jmp $%0.4x", opw);break; - case 0x60:sprintf(s, "clrc");break; - case 0x61:sprintf(s, "tcall 6");break; - case 0x62:sprintf(s, "set3 $%0.2x", op0);break; - case 0x63:sprintf(s, "bbs3 $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0x64:sprintf(s, "cmp a,$%0.2x", op0);break; - case 0x65:sprintf(s, "cmp a,$%0.4x", opw);break; - case 0x66:sprintf(s, "cmp a,(x)", op0);break; - case 0x67:sprintf(s, "cmp a,($%0.2x+x)", op0);break; - case 0x68:sprintf(s, "cmp a,#$%0.2x", op0);break; - case 0x69:sprintf(s, "cmp ($%0.2x),($%0.2x)", op1, op0);break; - case 0x6a:sprintf(s, "and1 c,!$%0.4x,%d", opw & 0x1fff, opw >> 13);break; - case 0x6b:sprintf(s, "ror $%0.2x", op0);break; - case 0x6c:sprintf(s, "ror $%0.4x", opw);break; - case 0x6d:sprintf(s, "push y");break; - case 0x6e:sprintf(s, "dbnz $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0x6f:sprintf(s, "ret");break; - case 0x70:sprintf(s, "bvs $%0.4x", __disas_spc700_relb(op0, 2));break; - case 0x71:sprintf(s, "tcall 7");break; - case 0x72:sprintf(s, "clr3 $%0.2x", op0);break; - case 0x73:sprintf(s, "bbc3 $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0x74:sprintf(s, "cmp a,$%0.2x+x", op0);break; - case 0x75:sprintf(s, "cmp a,$%0.4x+x", opw);break; - case 0x76:sprintf(s, "cmp a,$%0.4x+y", opw);break; - case 0x77:sprintf(s, "cmp a,($%0.2x)+y", op0);break; - case 0x78:sprintf(s, "cmp $%0.2x,#$%0.2x", op1, op0);break; - case 0x79:sprintf(s, "cmp (x),(y)");break; - case 0x7a:sprintf(s, "addw ya,$%0.2x", op0);break; - case 0x7b:sprintf(s, "ror $%0.2x+x", op0);break; - case 0x7c:sprintf(s, "ror a");break; - case 0x7d:sprintf(s, "mov a,x");break; - case 0x7e:sprintf(s, "cmp y,$%0.2x", op0);break; - case 0x7f:sprintf(s, "reti");break; - case 0x80:sprintf(s, "setc");break; - case 0x81:sprintf(s, "tcall 8");break; - case 0x82:sprintf(s, "set4 $%0.2x", op0);break; - case 0x83:sprintf(s, "bbs4 $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0x84:sprintf(s, "adc a,$%0.2x", op0);break; - case 0x85:sprintf(s, "adc a,$%0.4x", opw);break; - case 0x86:sprintf(s, "adc a,(x)", op0);break; - case 0x87:sprintf(s, "adc a,($%0.2x+x)", op0);break; - case 0x88:sprintf(s, "adc a,#$%0.2x", op0);break; - case 0x89:sprintf(s, "adc ($%0.2x),($%0.2x)", op1, op0);break; - case 0x8a:sprintf(s, "eor1 c,$%0.4x,%d", opw & 0x1fff, opw >> 13);break; - case 0x8b:sprintf(s, "dec $%0.2x", op0);break; - case 0x8c:sprintf(s, "dec $%0.4x", opw);break; - case 0x8d:sprintf(s, "mov y,#$%0.2x", op0);break; - case 0x8e:sprintf(s, "pop psw");break; - case 0x8f:sprintf(s, "mov $%0.2x,#$%0.2x", op1, op0);break; - case 0x90:sprintf(s, "bcc $%0.4x", __disas_spc700_relb(op0, 2));break; - case 0x91:sprintf(s, "tcall 9");break; - case 0x92:sprintf(s, "clr4 $%0.2x", op0);break; - case 0x93:sprintf(s, "bbc4 $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0x94:sprintf(s, "adc a,$%0.2x+x", op0);break; - case 0x95:sprintf(s, "adc a,$%0.4x+x", opw);break; - case 0x96:sprintf(s, "adc a,$%0.4x+y", opw);break; - case 0x97:sprintf(s, "adc a,($%0.2x)+y", op0);break; - case 0x98:sprintf(s, "adc $%0.2x,#$%0.2x", op1, op0);break; - case 0x99:sprintf(s, "adc (x),(y)", op0);break; - case 0x9a:sprintf(s, "subw ya,$%0.2x", op0);break; - case 0x9b:sprintf(s, "dec $%0.2x+x", op0);break; - case 0x9c:sprintf(s, "dec a");break; - case 0x9d:sprintf(s, "mov x,sp");break; - case 0x9e:sprintf(s, "div ya,x");break; - case 0x9f:sprintf(s, "xcn a");break; - case 0xa0:sprintf(s, "ei");break; - case 0xa1:sprintf(s, "tcall 10");break; - case 0xa2:sprintf(s, "set5 $%0.2x", op0);break; - case 0xa3:sprintf(s, "bbs5 $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0xa4:sprintf(s, "sbc a,$%0.2x", op0);break; - case 0xa5:sprintf(s, "sbc a,$%0.4x", opw);break; - case 0xa6:sprintf(s, "sbc a,(x)", op0);break; - case 0xa7:sprintf(s, "sbc a,($%0.2x+x)", op0);break; - case 0xa8:sprintf(s, "sbc a,#$%0.2x", op0);break; - case 0xa9:sprintf(s, "sbc ($%0.2x),($%0.2x)", op1, op0);break; - case 0xaa:sprintf(s, "mov1 c,$%0.4x,%d", opw & 0x1fff, opw >> 13);break; - case 0xab:sprintf(s, "inc $%0.2x", op0);break; - case 0xac:sprintf(s, "inc $%0.4x", opw);break; - case 0xad:sprintf(s, "cmp y,#$%0.2x", op0);break; - case 0xae:sprintf(s, "pop a");break; - case 0xaf:sprintf(s, "mov (x)+,a");break; - case 0xb0:sprintf(s, "bcs $%0.4x", __disas_spc700_relb(op0, 2));break; - case 0xb1:sprintf(s, "tcall 11");break; - case 0xb2:sprintf(s, "clr5 $%0.2x", op0);break; - case 0xb3:sprintf(s, "bbc5 $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0xb4:sprintf(s, "sbc a,$%0.2x+x", op0);break; - case 0xb5:sprintf(s, "sbc a,$%0.4x+x", opw);break; - case 0xb6:sprintf(s, "sbc a,$%0.4x+y", opw);break; - case 0xb7:sprintf(s, "sbc a,($%0.2x)+y", op0);break; - case 0xb8:sprintf(s, "sbc $%0.2x,#$%0.2x", op1, op0);break; - case 0xb9:sprintf(s, "sbc (x),(y)", op0);break; - case 0xba:sprintf(s, "movw ya,$%0.2x", op0);break; - case 0xbb:sprintf(s, "inc $%0.2x+x", op0);break; - case 0xbc:sprintf(s, "inc a");break; - case 0xbd:sprintf(s, "mov sp,x");break; - case 0xbe:sprintf(s, "das a");break; - case 0xbf:sprintf(s, "mov a,(x)+");break; - case 0xc0:sprintf(s, "di");break; - case 0xc1:sprintf(s, "tcall 12");break; - case 0xc2:sprintf(s, "set6 $%0.2x", op0);break; - case 0xc3:sprintf(s, "bbs6 $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0xc4:sprintf(s, "mov $%0.2x,a", op0);break; - case 0xc5:sprintf(s, "mov $%0.4x,a", opw);break; - case 0xc6:sprintf(s, "mov (x),a");break; - case 0xc7:sprintf(s, "mov ($%0.2x+x),a", op0);break; - case 0xc8:sprintf(s, "cmp x,#$%0.2x", op0);break; - case 0xc9:sprintf(s, "mov $%0.4x,x", opw);break; - case 0xca:sprintf(s, "mov1 $%0.4x,%d,c", opw & 0x1fff, opw >> 13);break; - case 0xcb:sprintf(s, "mov $%0.2x,y", op0);break; - case 0xcc:sprintf(s, "asl $%0.4x", opw);break; - case 0xcd:sprintf(s, "mov x,#$%0.2x", op0);break; - case 0xce:sprintf(s, "pop x");break; - case 0xcf:sprintf(s, "mul ya");break; - case 0xd0:sprintf(s, "bne $%0.4x", __disas_spc700_relb(op0, 2));break; - case 0xd1:sprintf(s, "tcall 13");break; - case 0xd2:sprintf(s, "clr6 $%0.2x", op0);break; - case 0xd3:sprintf(s, "bbc6 $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0xd4:sprintf(s, "mov $%0.2x+x,a", op0);break; - case 0xd5:sprintf(s, "mov $%0.4x+x,a", opw);break; - case 0xd6:sprintf(s, "mov $%0.4x+y,a", opw);break; - case 0xd7:sprintf(s, "mov ($%0.2x)+y,a", op0);break; - case 0xd8:sprintf(s, "mov $%0.2x,x", op0);break; - case 0xd9:sprintf(s, "mov $%0.2x+y,x", op0);break; - case 0xda:sprintf(s, "movw $%0.2x,ya", op0);break; - case 0xdb:sprintf(s, "mov $%0.2x+x,y", op0);break; - case 0xdc:sprintf(s, "dec y");break; - case 0xdd:sprintf(s, "mov a,y");break; - case 0xde:sprintf(s, "cbne $%0.2x+x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0xdf:sprintf(s, "daa a");break; - case 0xe0:sprintf(s, "clrv");break; - case 0xe1:sprintf(s, "tcall 14");break; - case 0xe2:sprintf(s, "set7 $%0.2x", op0);break; - case 0xe3:sprintf(s, "bbs7 $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0xe4:sprintf(s, "mov a,$%0.2x", op0);break; - case 0xe5:sprintf(s, "mov a,$%0.4x", opw);break; - case 0xe6:sprintf(s, "mov a,(x)");break; - case 0xe7:sprintf(s, "mov a,($%0.2x+x)", op0);break; - case 0xe8:sprintf(s, "mov a,#$%0.2x", op0);break; - case 0xe9:sprintf(s, "mov x,$%0.4x", opw);break; - case 0xea:sprintf(s, "not1 $%0.4x,%d", opw & 0x1fff, opw >> 13);break; - case 0xeb:sprintf(s, "mov y,$%0.2x", op0);break; - case 0xec:sprintf(s, "mov y,$%0.4x", opw);break; - case 0xed:sprintf(s, "notc");break; - case 0xee:sprintf(s, "pop y");break; - case 0xef:sprintf(s, "sleep");break; - case 0xf0:sprintf(s, "beq $%0.4x", __disas_spc700_relb(op0, 2));break; - case 0xf1:sprintf(s, "tcall 15");break; - case 0xf2:sprintf(s, "clr7 $%0.2x", op0);break; - case 0xf3:sprintf(s, "bbc7 $%0.2x,$%0.4x", op0, __disas_spc700_relb(op1, 3));break; - case 0xf4:sprintf(s, "mov a,$%0.2x+x", op0);break; - case 0xf5:sprintf(s, "mov a,$%0.4x+x", opw);break; - case 0xf6:sprintf(s, "mov a,$%0.4x+y", opw);break; - case 0xf7:sprintf(s, "mov a,($%0.2x)+y", op0);break; - case 0xf8:sprintf(s, "mov x,$%0.2x", op0);break; - case 0xf9:sprintf(s, "mov x,$%0.2x+y", op0);break; - case 0xfa:sprintf(s, "mov ($%0.2x),($%0.2x)", op1, op0);break; - case 0xfb:sprintf(s, "mov y,$%0.2x+x", op0);break; - case 0xfc:sprintf(s, "inc y");break; - case 0xfd:sprintf(s, "mov y,a");break; - case 0xfe:sprintf(s, "dbnz y,$%0.4x", __disas_spc700_relb(op0, 2));break; - case 0xff:sprintf(s, "stop");break; - } -} - -void disas_spc700_op(void) { -byte op; -byte op0, op1; -word offset; -char flags[256]; -char *s = (char*)__disas_spc700_str; -int i; - if(debug_write_status() == DEBUGWRITE_NONE)return; - -//use offset instead of spc700->regs.pc + n to avoid going above 65535 - offset = spc700->regs.pc; - op = spc700->ram[offset++]; - op0 = spc700->ram[offset++]; - op1 = spc700->ram[offset ]; - - strcpy(__disas_spc700_str, "???"); - __disas_spc700_op(op, op0, op1); - i = strlen(s); - while(i < 23) { - s[i++] = ' '; - s[i] = 0; - } - - sprintf(flags, "%c%c%c%c%c%c%c%c", - (spc700->regs.p & 0x80)?'N':'n', - (spc700->regs.p & 0x40)?'V':'v', - (spc700->regs.p & 0x20)?'P':'p', - (spc700->regs.p & 0x10)?'B':'b', - (spc700->regs.p & 0x08)?'H':'h', - (spc700->regs.p & 0x04)?'I':'i', - (spc700->regs.p & 0x02)?'Z':'z', - (spc700->regs.p & 0x01)?'C':'c'); - - dprintf(DEBUGMSG_APU, "--%0.4x %s A:%0.2x X:%0.2x Y:%0.2x SP:%0.2x YA:%0.4x %s", - spc700->regs.pc, __disas_spc700_str, - spc700->regs.a, spc700->regs.x, spc700->regs.y, spc700->regs.sp, - (spc700->regs.y << 8) | (spc700->regs.a), flags); -} diff --git a/bsnes/apu/spc700.cpp b/bsnes/apu/spc700.cpp deleted file mode 100644 index f203de3e..00000000 --- a/bsnes/apu/spc700.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include "../base.h" -#include "../timing/timing.h" -#include "../bridge/bridge.h" -#include "spc700_iplrom.h" -#include "spc700.h" - -extern snes_timer *snes_time; -extern debugstate debugger; -extern port_bridge *cpu_apu_bridge; -sony_spc700 *spc700; - -#include "spc700_ops.cpp" - -void sony_spc700::Reset(void) { - memset(ram, 0, 65536); - memcpy(ram + 0xffc0, spc700_iplrom, 64); - regs.pc = 0xffc0; - regs.a = regs.x = regs.y = regs.sp = 0x00; - regs.p = 0x02; - regs.dp = 0x0000; -} - -void sony_spc700::exec_op(void) { -byte op; - op = spc700->ram[spc700->regs.pc]; - spc700_optbl[op](); - debugger.apu_op_executed = true; - debugger.disas_apu_op = true; - - debug_test_bp(BPSRC_SPCRAM, BP_EXEC, spc700->regs.pc, 0); -} - -void sony_spc700::Run(void) { - if(snes_time->bridge.cpu_cycles >= snes_time->bridge.apu_cycles) { - exec_op(); - } - if(snes_time->bridge.cpu_cycles >= 65536 && snes_time->bridge.apu_cycles >= 65536) { - snes_time->bridge.cpu_cycles &= 65535; - snes_time->bridge.apu_cycles &= 65535; - } -} - -sony_spc700::sony_spc700() { - ram = (byte*)malloc(65536); -} - -sony_spc700::~sony_spc700() { - if(ram)free(ram); -} diff --git a/bsnes/apu/spc700.h b/bsnes/apu/spc700.h deleted file mode 100644 index c07924e7..00000000 --- a/bsnes/apu/spc700.h +++ /dev/null @@ -1,24 +0,0 @@ -class sony_spc700 { -public: - struct { - word pc; - byte a, x, y, sp, p; - word dp; - }regs; - byte *ram; - - void Reset(void); - void Run(void); - - void exec_op(void); - word convert_address(byte mode, word addr); - byte mem_getbyte(word addr); - void mem_putbyte(word addr, byte value); - word mem_read(byte mode, byte size, word addr); - void mem_write(byte mode, byte size, word addr, word value); - byte stack_read(void); - void stack_write(byte value); - - sony_spc700(); - ~sony_spc700(); -}; diff --git a/bsnes/apu/spc700_iplrom.h b/bsnes/apu/spc700_iplrom.h deleted file mode 100644 index e4b71093..00000000 --- a/bsnes/apu/spc700_iplrom.h +++ /dev/null @@ -1,35 +0,0 @@ -byte spc700_iplrom[64] = { -/*ffc0*/ 0xcd, 0xef, //mov x,#$ef -/*ffc2*/ 0xbd, //mov sp,x -/*ffc3*/ 0xe8, 0x00, //mov a,#$00 -/*ffc5*/ 0xc6, //mov (x),a -/*ffc6*/ 0x1d, //dec x -/*ffc7*/ 0xd0, 0xfc, //bne $ffc5 -/*ffc9*/ 0x8f, 0xaa, 0xf4, //mov $f4,#$aa -/*ffcc*/ 0x8f, 0xbb, 0xf5, //mov $f5,#$bb -/*ffcf*/ 0x78, 0xcc, 0xf4, //cmp $f4,#$cc -/*ffd2*/ 0xd0, 0xfb, //bne $ffcf -/*ffd4*/ 0x2f, 0x19, //bra $ffef -/*ffd6*/ 0xeb, 0xf4, //mov y,$f4 -/*ffd8*/ 0xd0, 0xfc, //bne $ffd6 -/*ffda*/ 0x7e, 0xf4, //cmp y,$f4 -/*ffdc*/ 0xd0, 0x0b, //bne $ffe9 -/*ffde*/ 0xe4, 0xf5, //mov a,$f5 -/*ffe0*/ 0xcb, 0xf4, //mov $f4,y -/*ffe2*/ 0xd7, 0x00, //mov ($00)+y,a -/*ffe4*/ 0xfc, //inc y -/*ffe5*/ 0xd0, 0xf3, //bne $ffda -/*ffe7*/ 0xab, 0x01, //inc $01 -/*ffe9*/ 0x10, 0xef, //bpl $ffda -/*ffeb*/ 0x7e, 0xf4, //cmp y,$f4 -/*ffed*/ 0x10, 0xeb, //bpl $ffda -/*ffef*/ 0xba, 0xf6, //movw ya,$f6 -/*fff1*/ 0xda, 0x00, //movw $00,ya -/*fff3*/ 0xba, 0xf4, //movw ya,$f4 -/*fff5*/ 0xc4, 0xf4, //mov $f4,a -/*fff7*/ 0xdd, //mov a,y -/*fff8*/ 0x5d, //mov x,a -/*fff9*/ 0xd0, 0xdb, //bne $ffd6 -/*fffb*/ 0x1f, 0x00, 0x00, //jmp ($0000+x) -/*fffe*/ 0xc0, 0xff //---reset vector location ($ffc0) -}; diff --git a/bsnes/apu/spc700_ops.cpp b/bsnes/apu/spc700_ops.cpp deleted file mode 100644 index a3307d46..00000000 --- a/bsnes/apu/spc700_ops.cpp +++ /dev/null @@ -1,194 +0,0 @@ -#define spc700_setn() spc700->regs.p |= SPF_N -#define spc700_clrn() spc700->regs.p &= ~SPF_N -#define spc700_setv() spc700->regs.p |= SPF_V -#define spc700_clrv() spc700->regs.p &= ~SPF_V -#define spc700_setp() spc700->regs.p |= SPF_P;spc700->regs.dp = 0x0100 -#define spc700_clrp() spc700->regs.p &= ~SPF_P;spc700->regs.dp = 0x0000 -#define spc700_setb() spc700->regs.p |= SPF_B -#define spc700_clrb() spc700->regs.p &= ~SPF_B -#define spc700_seth() spc700->regs.p |= SPF_H -#define spc700_clrh() spc700->regs.p &= ~SPF_H -#define spc700_seti() spc700->regs.p |= SPF_I -#define spc700_clri() spc700->regs.p &= ~SPF_I -#define spc700_setz() spc700->regs.p |= SPF_Z -#define spc700_clrz() spc700->regs.p &= ~SPF_Z -#define spc700_setc() spc700->regs.p |= SPF_C -#define spc700_clrc() spc700->regs.p &= ~SPF_C -#define spc700_testn(x) if(x)spc700_setn(); else spc700_clrn() -#define spc700_testv(x) if(x)spc700_setv(); else spc700_clrv() -#define spc700_testp(x) if(x)spc700_setp(); else spc700_clrp() -#define spc700_testb(x) if(x)spc700_setb(); else spc700_clrb() -#define spc700_testh(x) if(x)spc700_seth(); else spc700_clrh() -#define spc700_testi(x) if(x)spc700_seti(); else spc700_clri() -#define spc700_testz(x) if(x)spc700_setz(); else spc700_clrz() -#define spc700_testc(x) if(x)spc700_setc(); else spc700_clrc() - -#define spc700_incpc(__n) spc700->regs.pc += __n - -#define spc700_prefetchb() \ - byte arg = spc700->ram[(spc700->regs.pc + 1) & 0xffff] - -#define spc700_prefetch2b() \ - byte arg0 = spc700->ram[(spc700->regs.pc + 1) & 0xffff]; \ - byte arg1 = spc700->ram[(spc700->regs.pc + 2) & 0xffff] - -#define spc700_prefetchw() \ - word arg = spc700->ram[(spc700->regs.pc + 1) & 0xffff] | (spc700->ram[(spc700->regs.pc + 2) & 0xffff] << 8) - -#define APUMODE_NONE 0 -#define APUMODE_DP 1 -#define APUMODE_DPX 2 -#define APUMODE_DPY 3 -#define APUMODE_IDP 4 -#define APUMODE_ADDR 5 -#define APUMODE_IX 6 -#define APUMODE_ADDRX 7 -#define APUMODE_ADDRY 8 -#define APUMODE_IDPX 9 -#define APUMODE_IDPY 10 -#define APUMODE_IADDRX 11 -#define APUMODE_IY 12 - -word sony_spc700::convert_address(byte mode, word addr) { -word r; - switch(mode) { - case APUMODE_NONE: - r = addr; - case APUMODE_DP: - r = spc700->regs.dp | (byte)addr; - break; - case APUMODE_DPX: - r = spc700->regs.dp | (byte)(addr + spc700->regs.x); - break; - case APUMODE_DPY: - r = spc700->regs.dp | (byte)(addr + spc700->regs.y); - break; - case APUMODE_IDP: - r = spc700->regs.dp | (byte)addr; - r = spc700->ram[r] | (spc700->ram[r + 1] << 8); - break; - case APUMODE_ADDR: - r = addr; - break; - case APUMODE_IX: - r = spc700->regs.dp | spc700->regs.x; - break; - case APUMODE_ADDRX: - r = addr + spc700->regs.x; - break; - case APUMODE_ADDRY: - r = addr + spc700->regs.y; - break; - case APUMODE_IDPX: - r = spc700->regs.dp | (byte)(addr + spc700->regs.x); - r = spc700->ram[r] | (spc700->ram[r + 1] << 8); - break; - case APUMODE_IDPY: - r = spc700->regs.dp | (byte)addr; - r = spc700->ram[r] | (spc700->ram[r + 1] << 8); - r += spc700->regs.y; - break; - case APUMODE_IADDRX: - r = (spc700->ram[(addr + spc700->regs.x )]) | - (spc700->ram[(addr + spc700->regs.x + 1)] << 8); - break; - case APUMODE_IY: - r = spc700->regs.dp | spc700->regs.y; - break; - } - return r; -} - -byte sony_spc700::mem_getbyte(word addr) { - if(addr >= 0x00f4 && addr <= 0x00f7) { - return cpu_apu_bridge->apu_read(addr - 0x00f4); - } else { - return spc700->ram[addr]; - } -} - -void sony_spc700::mem_putbyte(word addr, byte value) { - if(addr >= 0x00f4 && addr <= 0x00f7) { - cpu_apu_bridge->apu_write(addr - 0x00f4, value); - } else if(addr < 0xffc0) { - spc700->ram[addr] = value; - } -} - -word sony_spc700::mem_read(byte mode, byte size, word addr) { -word r; - addr = convert_address(mode, addr); - switch(size) { - case MEMSIZE_BYTE: - r = mem_getbyte(addr); - break; - case MEMSIZE_WORD: - r = mem_getbyte(addr) | (mem_getbyte(addr + 1) << 8); - break; - } - return r; -} - -void sony_spc700::mem_write(byte mode, byte size, word addr, word value) { - addr = convert_address(mode, addr); - switch(size) { - case MEMSIZE_BYTE: - mem_putbyte(addr, value); - break; - case MEMSIZE_WORD: - mem_putbyte(addr , value); - mem_putbyte(addr + 1, value >> 8); - break; - } -} - -byte sony_spc700::stack_read(void) { -word addr; - spc700->regs.sp++; - addr = 0x0100 | spc700->regs.sp; - return mem_getbyte(addr); -} - -void sony_spc700::stack_write(byte value) { -word addr; - addr = 0x0100 | spc700->regs.sp; - spc700->regs.sp--; - mem_putbyte(addr, value); -} - -#include "spc700_ops_adc.cpp" -#include "spc700_ops_and.cpp" -#include "spc700_ops_cmp.cpp" -#include "spc700_ops_eor.cpp" -#include "spc700_ops_flags.cpp" -#include "spc700_ops_incdec.cpp" -#include "spc700_ops_misc.cpp" -#include "spc700_ops_mov.cpp" -#include "spc700_ops_or.cpp" -#include "spc700_ops_pc.cpp" -#include "spc700_ops_sbc.cpp" -#include "spc700_ops_shift.cpp" -#include "spc700_ops_stack.cpp" - -vfunc spc700_optbl[256] = { - // -----------------------------x0, -----------------------------x1, -----------------------------x2, -----------------------------x3, -------- -----------------------------x4, -----------------------------x5, -----------------------------x6, -----------------------------x7, -------- -----------------------------x8, -----------------------------x9, -----------------------------xa, -----------------------------xb, -------- -----------------------------xc, -----------------------------xd, -----------------------------xe, -----------------------------xf, -/* 0x */ spc700_op_nop, spc700_op_tcall_0, spc700_op_set0_dp, spc700_op_bbc0, /* 0x */ spc700_op_or_a_dp, spc700_op_or_a_addr, spc700_op_or_a_ix, spc700_op_or_a_idpx, /* 0x */ spc700_op_or_a_const, spc700_op_or_dp_dp, spc700_op_or1_bit, spc700_op_asl_dp, /* 0x */ spc700_op_mov_addr_y, spc700_op_push_p, spc700_op_tset1_addr, spc700_op_brk, -/* 1x */ spc700_op_bpl, spc700_op_tcall_1, spc700_op_clr0_dp, spc700_op_bbs0, /* 1x */ spc700_op_or_a_dpx, spc700_op_or_a_addrx, spc700_op_or_a_addry, spc700_op_or_a_idpy, /* 1x */ spc700_op_or_dp_imm, spc700_op_or_ix_iy, spc700_op_decw_dp, spc700_op_asl_dpx, /* 1x */ spc700_op_asl_a, spc700_op_dec_x, spc700_op_cmp_x_addr, spc700_op_jmp_iaddrx, -/* 2x */ spc700_op_clrp, spc700_op_tcall_2, spc700_op_set1_dp, spc700_op_bbc1, /* 2x */ spc700_op_and_a_dp, spc700_op_and_a_addr, spc700_op_and_a_ix, spc700_op_and_a_idpx, /* 2x */ spc700_op_and_a_const, spc700_op_and_dp_dp, spc700_op_or1_notbit, spc700_op_rol_dp, /* 2x */ spc700_op_rol_addr, spc700_op_push_a, spc700_op_cbne_dp, spc700_op_bra, -/* 3x */ spc700_op_bmi, spc700_op_tcall_3, spc700_op_clr1_dp, spc700_op_bbs1, /* 3x */ spc700_op_and_a_dpx, spc700_op_and_a_addrx, spc700_op_and_a_addry, spc700_op_and_a_idpy, /* 3x */ spc700_op_and_dp_imm, spc700_op_and_ix_iy, spc700_op_incw_dp, spc700_op_rol_dpx, /* 3x */ spc700_op_rol_a, spc700_op_inc_x, spc700_op_cmp_x_dp, spc700_op_call, - -/* 4x */ spc700_op_setp, spc700_op_tcall_4, spc700_op_set2_dp, spc700_op_bbc2, /* 4x */ spc700_op_eor_a_dp, spc700_op_eor_a_addr, spc700_op_eor_a_ix, spc700_op_eor_a_idpx, /* 4x */ spc700_op_eor_a_const, spc700_op_eor_dp_dp, spc700_op_and1_bit, spc700_op_lsr_dp, /* 4x */ spc700_op_lsr_addr, spc700_op_push_x, spc700_op_tclr1_addr, spc700_op_pcall, -/* 5x */ spc700_op_bvc, spc700_op_tcall_5, spc700_op_clr2_dp, spc700_op_bbs2, /* 5x */ spc700_op_eor_a_dpx, spc700_op_eor_a_addrx, spc700_op_eor_a_addry, spc700_op_eor_a_idpy, /* 5x */ spc700_op_eor_dp_imm, spc700_op_eor_ix_iy, spc700_op_cmpw_ya_dp, spc700_op_lsr_dpx, /* 5x */ spc700_op_lsr_a, spc700_op_mov_x_a, spc700_op_cmp_y_addr, spc700_op_jmp_addr, -/* 6x */ spc700_op_clrc, spc700_op_tcall_6, spc700_op_set3_dp, spc700_op_bbc3, /* 6x */ spc700_op_cmp_a_dp, spc700_op_cmp_a_addr, spc700_op_cmp_a_ix, spc700_op_cmp_a_idpx, /* 6x */ spc700_op_cmp_a_const, spc700_op_cmp_dp_dp, spc700_op_and1_notbit, spc700_op_ror_dp, /* 6x */ spc700_op_ror_addr, spc700_op_push_y, spc700_op_dbnz_dp, spc700_op_ret, -/* 7x */ spc700_op_bvs, spc700_op_tcall_7, spc700_op_clr3_dp, spc700_op_bbs3, /* 7x */ spc700_op_cmp_a_dpx, spc700_op_cmp_a_addrx, spc700_op_cmp_a_addry, spc700_op_cmp_a_idpy, /* 7x */ spc700_op_cmp_dp_imm, spc700_op_cmp_ix_iy, spc700_op_addw_ya_dp, spc700_op_ror_dpx, /* 7x */ spc700_op_ror_a, spc700_op_mov_a_x, spc700_op_cmp_y_dp, spc700_op_reti, - -/* 8x */ spc700_op_setc, spc700_op_tcall_8, spc700_op_set4_dp, spc700_op_bbc4, /* 8x */ spc700_op_adc_a_dp, spc700_op_adc_a_addr, spc700_op_adc_a_ix, spc700_op_adc_a_idpx, /* 8x */ spc700_op_adc_a_const, spc700_op_adc_dp_dp, spc700_op_eor1_bit, spc700_op_dec_dp, /* 8x */ spc700_op_dec_addr, spc700_op_mov_y_const, spc700_op_pop_p, spc700_op_mov_dp_imm, -/* 9x */ spc700_op_bcc, spc700_op_tcall_9, spc700_op_clr4_dp, spc700_op_bbs4, /* 9x */ spc700_op_adc_a_dpx, spc700_op_adc_a_addrx, spc700_op_adc_a_addry, spc700_op_adc_a_idpy, /* 9x */ spc700_op_adc_dp_imm, spc700_op_adc_ix_iy, spc700_op_subw_ya_dp, spc700_op_dec_dpx, /* 9x */ spc700_op_dec_a, spc700_op_mov_x_sp, spc700_op_div_ya_x, spc700_op_xcn_a, -/* ax */ spc700_op_ei, spc700_op_tcall_10, spc700_op_set5_dp, spc700_op_bbc5, /* ax */ spc700_op_sbc_a_dp, spc700_op_sbc_a_addr, spc700_op_sbc_a_ix, spc700_op_sbc_a_idpx, /* ax */ spc700_op_sbc_a_const, spc700_op_sbc_dp_dp, spc700_op_mov1_c_bit, spc700_op_inc_dp, /* ax */ spc700_op_inc_addr, spc700_op_cmp_y_const, spc700_op_pop_a, spc700_op_mov_ixinc_a, -/* bx */ spc700_op_bcs, spc700_op_tcall_11, spc700_op_clr5_dp, spc700_op_bbs5, /* bx */ spc700_op_sbc_a_dpx, spc700_op_sbc_a_addrx, spc700_op_sbc_a_addry, spc700_op_sbc_a_idpy, /* bx */ spc700_op_sbc_dp_imm, spc700_op_sbc_ix_iy, spc700_op_mov_ya_dp, spc700_op_inc_dpx, /* bx */ spc700_op_inc_a, spc700_op_mov_sp_x, spc700_op_das_a, spc700_op_mov_a_ixinc, - -/* cx */ spc700_op_di, spc700_op_tcall_12, spc700_op_set6_dp, spc700_op_bbc6, /* cx */ spc700_op_mov_dp_a, spc700_op_mov_addr_a, spc700_op_mov_ix_a, spc700_op_mov_idpx_a, /* cx */ spc700_op_cmp_x_const, spc700_op_mov_addr_x, spc700_op_mov1_bit_c, spc700_op_mov_dp_y, /* cx */ spc700_op_asl_addr, spc700_op_mov_x_const, spc700_op_pop_x, spc700_op_mul_ya, -/* dx */ spc700_op_bne, spc700_op_tcall_13, spc700_op_clr6_dp, spc700_op_bbs6, /* dx */ spc700_op_mov_dpx_a, spc700_op_mov_addrx_a, spc700_op_mov_addry_a, spc700_op_mov_idpy_a, /* dx */ spc700_op_mov_dp_x, spc700_op_mov_dpy_x, spc700_op_mov_dp_ya, spc700_op_mov_dpx_y, /* dx */ spc700_op_dec_y, spc700_op_mov_a_y, spc700_op_cbne_dpx, spc700_op_daa_a, -/* ex */ spc700_op_clrv, spc700_op_tcall_14, spc700_op_set7_dp, spc700_op_bbc7, /* ex */ spc700_op_mov_a_dp, spc700_op_mov_a_addr, spc700_op_mov_a_ix, spc700_op_mov_a_idpx, /* ex */ spc700_op_mov_a_const, spc700_op_mov_x_addr, spc700_op_not1_bit, spc700_op_mov_y_dp, /* ex */ spc700_op_mov_y_addr, spc700_op_notc, spc700_op_pop_y, spc700_op_sleep, -/* fx */ spc700_op_beq, spc700_op_tcall_15, spc700_op_clr7_dp, spc700_op_bbs7, /* fx */ spc700_op_mov_a_dpx, spc700_op_mov_a_addrx, spc700_op_mov_a_addry, spc700_op_mov_a_idpy, /* fx */ spc700_op_mov_x_dp, spc700_op_mov_x_dpy, spc700_op_mov_dp_dp, spc700_op_mov_y_dpx, /* fx */ spc700_op_inc_y, spc700_op_mov_y_a, spc700_op_dbnz_y, spc700_op_stop -}; diff --git a/bsnes/apu/spc700_ops_adc.cpp b/bsnes/apu/spc700_ops_adc.cpp deleted file mode 100644 index e403903e..00000000 --- a/bsnes/apu/spc700_ops_adc.cpp +++ /dev/null @@ -1,114 +0,0 @@ -byte spc700_op_adc(byte x, byte y) { -word r = x + y + (spc700->regs.p & SPF_C); - spc700_testn(r & 0x80); - spc700_testv((~(x ^ y) & (y ^ (byte)r) & 0x80)); - spc700_testh((x ^ y ^ (byte)r) & 0x10); - spc700_testz((byte)r == 0); - spc700_testc(r >= 0x100); - return (byte)r; -} - -void spc700_op_adc_a_const(void) { -spc700_prefetchb(); - spc700->regs.a = spc700_op_adc(spc700->regs.a, arg); - spc700_incpc(2); - add_apu_cycles(2); -} - -void spc700_op_adc_a_ix(void) { - spc700->regs.a = spc700_op_adc(spc700->regs.a, spc700->mem_read(APUMODE_IX, MEMSIZE_BYTE, 0)); - spc700_incpc(1); - add_apu_cycles(3); -} - -void spc700_op_adc_a_dp(void) { -spc700_prefetchb(); - spc700->regs.a = spc700_op_adc(spc700->regs.a, spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg)); - spc700_incpc(2); - add_apu_cycles(3); -} - -void spc700_op_adc_a_dpx(void) { -spc700_prefetchb(); - spc700->regs.a = spc700_op_adc(spc700->regs.a, spc700->mem_read(APUMODE_DPX, MEMSIZE_BYTE, arg)); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_adc_a_addr(void) { -spc700_prefetchw(); - spc700->regs.a = spc700_op_adc(spc700->regs.a, spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg)); - spc700_incpc(3); - add_apu_cycles(4); -} - -void spc700_op_adc_a_addrx(void) { -spc700_prefetchw(); - spc700->regs.a = spc700_op_adc(spc700->regs.a, spc700->mem_read(APUMODE_ADDRX, MEMSIZE_BYTE, arg)); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_adc_a_addry(void) { -spc700_prefetchw(); - spc700->regs.a += spc700->mem_read(APUMODE_ADDRY, MEMSIZE_BYTE, arg); - spc700->regs.a += (spc700->regs.p & PF_C); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_adc_a_idpx(void) { -spc700_prefetchb(); -word i; - spc700->regs.a = spc700_op_adc(spc700->regs.a, spc700->mem_read(APUMODE_IDPX, MEMSIZE_BYTE, arg)); - spc700_incpc(2); - add_apu_cycles(6); -} - -void spc700_op_adc_a_idpy(void) { -spc700_prefetchb(); - spc700->regs.a = spc700_op_adc(spc700->regs.a, spc700->mem_read(APUMODE_IDPY, MEMSIZE_BYTE, arg)); - spc700_incpc(2); - add_apu_cycles(6); -} - -void spc700_op_adc_ix_iy(void) { -byte x = spc700_op_adc(spc700->mem_read(APUMODE_IX, MEMSIZE_BYTE, 0), spc700->mem_read(APUMODE_IY, MEMSIZE_BYTE, 0)); - spc700->mem_write(APUMODE_IX, MEMSIZE_BYTE, 0, x); - spc700_incpc(1); - add_apu_cycles(5); -} - -void spc700_op_adc_dp_dp(void) { -spc700_prefetch2b(); -byte x = spc700_op_adc(spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg1), spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg0)); - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg1, x); - spc700_incpc(3); - add_apu_cycles(6); -} - -void spc700_op_adc_dp_imm(void) { -spc700_prefetch2b(); -byte x = spc700_op_adc(spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg1), arg0); - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg1, x); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_addw_ya_dp(void) { -spc700_prefetchb(); -word ya = (spc700->regs.y << 8) | spc700->regs.a; -word dp = spc700->mem_read(APUMODE_DP, MEMSIZE_WORD, arg); -ulong r = ya + dp; - spc700_testn(r & 0x8000); - spc700_testv(~(ya ^ dp) & (dp ^ (word)r) & 0x8000); - spc700_testh((ya ^ dp ^ (word)r) & 0x1000); - spc700_testz((word)r == 0); - spc700_testc(r >= 0x10000); - spc700->regs.a = r; - spc700->regs.y = r >> 8; - spc700_incpc(2); - add_apu_cycles(5); -} diff --git a/bsnes/apu/spc700_ops_and.cpp b/bsnes/apu/spc700_ops_and.cpp deleted file mode 100644 index 08600be2..00000000 --- a/bsnes/apu/spc700_ops_and.cpp +++ /dev/null @@ -1,147 +0,0 @@ -void spc700_op_and_a_const(void) { -spc700_prefetchb(); - spc700->regs.a &= arg; - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(2); -} - -void spc700_op_and_a_ix(void) { - spc700->regs.a &= spc700->mem_read(APUMODE_IX, MEMSIZE_BYTE, 0); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(1); - add_apu_cycles(3); -} - -void spc700_op_and_a_dp(void) { -spc700_prefetchb(); - spc700->regs.a &= spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(3); -} - -void spc700_op_and_a_dpx(void) { -spc700_prefetchb(); - spc700->regs.a &= spc700->mem_read(APUMODE_DPX, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_and_a_addr(void) { -spc700_prefetchw(); - spc700->regs.a &= spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(3); - add_apu_cycles(4); -} - -void spc700_op_and_a_addrx(void) { -spc700_prefetchw(); - spc700->regs.a &= spc700->mem_read(APUMODE_ADDRX, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_and_a_addry(void) { -spc700_prefetchw(); - spc700->regs.a &= spc700->mem_read(APUMODE_ADDRY, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_and_a_idpx(void) { -spc700_prefetchb(); -word i; - spc700->regs.a &= spc700->mem_read(APUMODE_IDPX, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(6); -} - -void spc700_op_and_a_idpy(void) { -spc700_prefetchb(); -word i; - spc700->regs.a &= spc700->mem_read(APUMODE_IDPY, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(6); -} - -void spc700_op_and_ix_iy(void) { -word i; -byte x; - x = spc700->mem_read(APUMODE_IX, MEMSIZE_BYTE, 0); - x &= spc700->mem_read(APUMODE_IY, MEMSIZE_BYTE, 0); - spc700->mem_write(APUMODE_IX, MEMSIZE_BYTE, 0, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(1); - add_apu_cycles(5); -} - -void spc700_op_and_dp_dp(void) { -spc700_prefetch2b(); -byte x; - x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg1); - x &= spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg0); - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg1, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(3); - add_apu_cycles(6); -} - -void spc700_op_and_dp_imm(void) { -spc700_prefetch2b(); -byte x; - x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg1); - x &= arg0; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg1, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_and1_bit(void) { -spc700_prefetchw(); -word addr = arg & 0x1fff; -byte bit = arg >> 13; -byte x; - if(spc700->regs.p & SPF_C) { - x = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, addr); - if(!(x & (1 << bit))) { - spc700_clrc(); - } - } - spc700_incpc(3); - add_apu_cycles(4); -} - -void spc700_op_and1_notbit(void) { -spc700_prefetchw(); -word addr = arg & 0x1fff; -byte bit = arg >> 13; -byte x; - if(spc700->regs.p & SPF_C) { - x = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, addr); - if(x & (1 << bit)) { - spc700_clrc(); - } - } - spc700_incpc(3); - add_apu_cycles(4); -} diff --git a/bsnes/apu/spc700_ops_cmp.cpp b/bsnes/apu/spc700_ops_cmp.cpp deleted file mode 100644 index 43c52ec3..00000000 --- a/bsnes/apu/spc700_ops_cmp.cpp +++ /dev/null @@ -1,142 +0,0 @@ -void spc700_op_cmp(byte x, byte y) { -short r = (short)x - (short)y; - spc700_testn(r & 0x80); - spc700_testz((byte)r == 0); - spc700_testc(r >= 0); -} - -void spc700_op_cmp_a_const(void) { -spc700_prefetchb(); - spc700_op_cmp(spc700->regs.a, arg); - spc700_incpc(2); - add_apu_cycles(2); -} - -void spc700_op_cmp_a_ix(void) { - spc700_op_cmp(spc700->regs.a, spc700->mem_read(APUMODE_IX, MEMSIZE_BYTE, 0)); - spc700_incpc(1); - add_apu_cycles(3); -} - -void spc700_op_cmp_a_dp(void) { -spc700_prefetchb(); - spc700_op_cmp(spc700->regs.a, spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg)); - spc700_incpc(2); - add_apu_cycles(3); -} - -void spc700_op_cmp_a_dpx(void) { -spc700_prefetchb(); - spc700_op_cmp(spc700->regs.a, spc700->mem_read(APUMODE_DPX, MEMSIZE_BYTE, arg)); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_cmp_a_addr(void) { -spc700_prefetchw(); - spc700_op_cmp(spc700->regs.a, spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg)); - spc700_incpc(3); - add_apu_cycles(4); -} - -void spc700_op_cmp_a_addrx(void) { -spc700_prefetchw(); - spc700_op_cmp(spc700->regs.a, spc700->mem_read(APUMODE_ADDRX, MEMSIZE_BYTE, arg)); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_cmp_a_addry(void) { -spc700_prefetchw(); - spc700_op_cmp(spc700->regs.a, spc700->mem_read(APUMODE_ADDRY, MEMSIZE_BYTE, arg)); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_cmp_a_idpx(void) { -spc700_prefetchb(); - spc700_op_cmp(spc700->regs.a, spc700->mem_read(APUMODE_IDPX, MEMSIZE_BYTE, arg)); - spc700_incpc(2); - add_apu_cycles(6); -} - -void spc700_op_cmp_a_idpy(void) { -spc700_prefetchb(); - spc700_op_cmp(spc700->regs.a, spc700->mem_read(APUMODE_IDPY, MEMSIZE_BYTE, arg)); - spc700_incpc(2); - add_apu_cycles(6); -} - -void spc700_op_cmp_ix_iy(void) { - spc700_op_cmp(spc700->mem_read(APUMODE_IX, MEMSIZE_BYTE, 0), spc700->mem_read(APUMODE_IY, MEMSIZE_BYTE, 0)); - spc700_incpc(1); - add_apu_cycles(5); -} - -void spc700_op_cmp_dp_dp(void) { -spc700_prefetch2b(); - spc700_op_cmp(spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg1), spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg0)); - spc700_incpc(3); - add_apu_cycles(6); -} - -void spc700_op_cmp_dp_imm(void) { -spc700_prefetch2b(); - spc700_op_cmp(spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg1), arg0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_cmp_x_const(void) { -spc700_prefetchb(); - spc700_op_cmp(spc700->regs.x, arg); - spc700_incpc(2); - add_apu_cycles(2); -} - -void spc700_op_cmp_x_dp(void) { -spc700_prefetchb(); - spc700_op_cmp(spc700->regs.x, spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg)); - spc700_incpc(2); - add_apu_cycles(3); -} - -void spc700_op_cmp_x_addr(void) { -spc700_prefetchw(); - spc700_op_cmp(spc700->regs.x, spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg)); - spc700_incpc(3); - add_apu_cycles(4); -} - -void spc700_op_cmp_y_const(void) { -spc700_prefetchb(); - spc700_op_cmp(spc700->regs.y, arg); - spc700_incpc(2); - add_apu_cycles(2); -} - -void spc700_op_cmp_y_dp(void) { -spc700_prefetchb(); - spc700_op_cmp(spc700->regs.y, spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg)); - spc700_incpc(2); - add_apu_cycles(3); -} - -void spc700_op_cmp_y_addr(void) { -spc700_prefetchw(); - spc700_op_cmp(spc700->regs.y, spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg)); - spc700_incpc(3); - add_apu_cycles(4); -} - -void spc700_op_cmpw_ya_dp(void) { -spc700_prefetchb(); -word ya = ((spc700->regs.y << 8) | spc700->regs.a); -word dp = spc700->mem_read(APUMODE_DP, MEMSIZE_WORD, arg); -long r = (long)ya - (long)dp; - spc700_testn(r & 0x8000); - spc700_testz((word)r == 0); - spc700_testc(r >= 0); - spc700_incpc(2); - add_apu_cycles(5); -} diff --git a/bsnes/apu/spc700_ops_eor.cpp b/bsnes/apu/spc700_ops_eor.cpp deleted file mode 100644 index a4e42377..00000000 --- a/bsnes/apu/spc700_ops_eor.cpp +++ /dev/null @@ -1,148 +0,0 @@ -void spc700_op_eor_a_const(void) { -spc700_prefetchb(); - spc700->regs.a ^= arg; - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(2); -} - -void spc700_op_eor_a_ix(void) { - spc700->regs.a ^= spc700->mem_read(APUMODE_IX, MEMSIZE_BYTE, 0); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(1); - add_apu_cycles(3); -} - -void spc700_op_eor_a_dp(void) { -spc700_prefetchb(); - spc700->regs.a ^= spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(3); -} - -void spc700_op_eor_a_dpx(void) { -spc700_prefetchb(); - spc700->regs.a ^= spc700->mem_read(APUMODE_DPX, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_eor_a_addr(void) { -spc700_prefetchw(); - spc700->regs.a ^= spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(3); - add_apu_cycles(4); -} - -void spc700_op_eor_a_addrx(void) { -spc700_prefetchw(); - spc700->regs.a ^= spc700->mem_read(APUMODE_ADDRX, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_eor_a_addry(void) { -spc700_prefetchw(); - spc700->regs.a ^= spc700->mem_read(APUMODE_ADDRY, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_eor_a_idpx(void) { -spc700_prefetchb(); -word i; - spc700->regs.a ^= spc700->mem_read(APUMODE_IDPX, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(6); -} - -void spc700_op_eor_a_idpy(void) { -spc700_prefetchb(); -word i; - spc700->regs.a ^= spc700->mem_read(APUMODE_IDPY, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(6); -} - -void spc700_op_eor_ix_iy(void) { -word i; -byte x; - x = spc700->mem_read(APUMODE_IX, MEMSIZE_BYTE, 0); - x ^= spc700->mem_read(APUMODE_IY, MEMSIZE_BYTE, 0); - spc700->mem_write(APUMODE_IX, MEMSIZE_BYTE, 0, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(1); - add_apu_cycles(5); -} - -void spc700_op_eor_dp_dp(void) { -spc700_prefetch2b(); -byte x; - x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg1); - x ^= spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg0); - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg1, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(3); - add_apu_cycles(6); -} - -void spc700_op_eor_dp_imm(void) { -spc700_prefetch2b(); -byte x; - x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg1); - x ^= arg0; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg1, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_eor1_bit(void) { -spc700_prefetchw(); -word addr = arg & 0x1fff; -byte bit = arg >> 13; -byte x; - x = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, addr); - if(spc700->regs.p & SPF_C) { - if(x & (1 << bit)) { - spc700_clrc(); - } - } else { - if(x & (1 << bit)) { - spc700_setc(); - } - } - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_not1_bit(void) { -spc700_prefetchw(); -word addr = arg & 0x1fff; -byte bit = arg >> 13; -byte x; - x = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, addr); - x ^= (1 << bit); - spc700->mem_write(APUMODE_ADDR, MEMSIZE_BYTE, addr, x); - spc700_incpc(3); - add_apu_cycles(5); -} diff --git a/bsnes/apu/spc700_ops_flags.cpp b/bsnes/apu/spc700_ops_flags.cpp deleted file mode 100644 index b2c2db06..00000000 --- a/bsnes/apu/spc700_ops_flags.cpp +++ /dev/null @@ -1,48 +0,0 @@ -void spc700_op_clrc(void) { - spc700_clrc(); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_setc(void) { - spc700_setc(); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_notc(void) { - spc700->regs.p ^= SPF_C; - spc700_incpc(1); - add_apu_cycles(3); -} - -void spc700_op_clrv(void) { - spc700_clrv(); - spc700_clrh(); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_clrp(void) { - spc700_clrp(); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_setp(void) { - spc700_setp(); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_di(void) { - spc700_clri(); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_ei(void) { - spc700_seti(); - spc700_incpc(1); - add_apu_cycles(2); -} diff --git a/bsnes/apu/spc700_ops_incdec.cpp b/bsnes/apu/spc700_ops_incdec.cpp deleted file mode 100644 index 271a1ee5..00000000 --- a/bsnes/apu/spc700_ops_incdec.cpp +++ /dev/null @@ -1,135 +0,0 @@ -void spc700_op_inc_a(void) { - spc700->regs.a++; - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_inc_x(void) { - spc700->regs.x++; - spc700_testn(spc700->regs.x & 0x80); - spc700_testz(spc700->regs.x == 0); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_inc_y(void) { - spc700->regs.y++; - spc700_testn(spc700->regs.y & 0x80); - spc700_testz(spc700->regs.y == 0); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_inc_dp(void) { -spc700_prefetchb(); -byte r; - r = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg) + 1; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, r); - spc700_testn(r & 0x80); - spc700_testz(r == 0); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_inc_dpx(void) { -spc700_prefetchb(); -byte r; - r = spc700->mem_read(APUMODE_DPX, MEMSIZE_BYTE, arg) + 1; - spc700->mem_write(APUMODE_DPX, MEMSIZE_BYTE, arg, r); - spc700_testn(r & 0x80); - spc700_testz(r == 0); - spc700_incpc(2); - add_apu_cycles(5); -} - -void spc700_op_inc_addr(void) { -spc700_prefetchw(); -byte r; - r = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg) + 1; - spc700->mem_write(APUMODE_ADDR, MEMSIZE_BYTE, arg, r); - spc700_testn(r & 0x80); - spc700_testz(r == 0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_dec_a(void) { - spc700->regs.a--; - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_dec_x(void) { - spc700->regs.x--; - spc700_testn(spc700->regs.x & 0x80); - spc700_testz(spc700->regs.x == 0); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_dec_y(void) { - spc700->regs.y--; - spc700_testn(spc700->regs.y & 0x80); - spc700_testz(spc700->regs.y == 0); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_dec_dp(void) { -spc700_prefetchb(); -byte r; - r = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg) - 1; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, r); - spc700_testn(r & 0x80); - spc700_testz(r == 0); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_dec_dpx(void) { -spc700_prefetchb(); -byte r; - r = spc700->mem_read(APUMODE_DPX, MEMSIZE_BYTE, arg) - 1; - spc700->mem_write(APUMODE_DPX, MEMSIZE_BYTE, arg, r); - spc700_testn(r & 0x80); - spc700_testz(r == 0); - spc700_incpc(2); - add_apu_cycles(5); -} - -void spc700_op_dec_addr(void) { -spc700_prefetchw(); -byte r; - r = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg) - 1; - spc700->mem_write(APUMODE_ADDR, MEMSIZE_BYTE, arg, r); - spc700_testn(r & 0x80); - spc700_testz(r == 0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_incw_dp(void) { -spc700_prefetchb(); -word r; - r = spc700->mem_read(APUMODE_DP, MEMSIZE_WORD, arg) + 1; - spc700->mem_write(APUMODE_DP, MEMSIZE_WORD, arg, r); - spc700_testn(r & 0x8000); - spc700_testz(r == 0); - spc700_incpc(2); - add_apu_cycles(6); -} - -void spc700_op_decw_dp(void) { -spc700_prefetchb(); -word r; - r = spc700->mem_read(APUMODE_DP, MEMSIZE_WORD, arg) - 1; - spc700->mem_write(APUMODE_DP, MEMSIZE_WORD, arg, r); - spc700_testn(r & 0x8000); - spc700_testz(r == 0); - spc700_incpc(2); - add_apu_cycles(6); -} diff --git a/bsnes/apu/spc700_ops_misc.cpp b/bsnes/apu/spc700_ops_misc.cpp deleted file mode 100644 index 02a0a9a0..00000000 --- a/bsnes/apu/spc700_ops_misc.cpp +++ /dev/null @@ -1,241 +0,0 @@ -void spc700_op_nop(void) { - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_sleep(void) { - add_apu_cycles(3); -} - -void spc700_op_stop(void) { - add_apu_cycles(3); -} - -void spc700_op_xcn_a(void) { - spc700->regs.a = (spc700->regs.a >> 4) | (spc700->regs.a << 4); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(1); - add_apu_cycles(5); -} - -void spc700_op_daa_a(void) { -int a = spc700->regs.a; - if(((a ) & 15) > 9)a += 6; - if(((a >> 4) & 15) > 9)a += 6 << 4; - spc700->regs.a = a; - spc700_testn(a & 0x80); - spc700_testz(a == 0); - spc700_testc(a >= 0x0100); - spc700_incpc(1); - add_apu_cycles(3); -} - -void spc700_op_das_a(void) { -int a = spc700->regs.a; - if(((a ) & 15) > 9)a -= 6; - if(((a >> 4) & 15) > 9)a -= 6 << 4; - spc700->regs.a = a; - spc700_testn(a & 0x80); - spc700_testz(a == 0); - spc700_testc(a < 0); - spc700_incpc(1); - add_apu_cycles(3); -} - -void spc700_op_set0_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - x |= 0x01; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_clr0_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - x &= ~0x01; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_set1_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - x |= 0x02; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_clr1_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - x &= ~0x02; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_set2_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - x |= 0x04; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_clr2_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - x &= ~0x04; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_set3_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - x |= 0x08; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_clr3_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - x &= ~0x08; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_set4_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - x |= 0x10; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_clr4_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - x &= ~0x10; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_set5_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - x |= 0x20; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_clr5_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - x &= ~0x20; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_set6_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - x |= 0x40; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_clr6_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - x &= ~0x40; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_set7_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - x |= 0x80; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_clr7_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - x &= ~0x80; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_tset1_addr(void) { -spc700_prefetchw(); -byte x = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg); - x |= spc700->regs.a; - spc700->mem_write(APUMODE_ADDR, MEMSIZE_BYTE, arg, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(3); - add_apu_cycles(6); -} - -void spc700_op_tclr1_addr(void) { -spc700_prefetchw(); -byte x = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg); - x &= ~spc700->regs.a; - spc700->mem_write(APUMODE_ADDR, MEMSIZE_BYTE, arg, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(3); - add_apu_cycles(6); -} - -void spc700_op_mul_ya(void) { -word ya; - ya = spc700->regs.y * spc700->regs.a; - spc700->regs.a = ya; - spc700->regs.y = ya >> 8; - spc700_testn(ya & 0x8000); - spc700_testz(ya == 0); - spc700_incpc(1); - add_apu_cycles(9); -} - -/* - v/h flags not set, may have result backwards - (a and y may need to be swapped) -*/ -void spc700_op_div_ya_x(void) { -word ya = (spc700->regs.y << 8) | spc700->regs.a; - if(spc700->regs.x == 0) { - spc700->regs.a = 0; - spc700->regs.y = 0; - } else { - spc700->regs.a = ya / spc700->regs.x; - spc700->regs.y = ya % spc700->regs.x; - } - ya = (spc700->regs.y << 8) | spc700->regs.a; - spc700_testn(ya & 0x8000); - spc700_testz(ya == 0); - spc700_incpc(1); - add_apu_cycles(12); -} diff --git a/bsnes/apu/spc700_ops_mov.cpp b/bsnes/apu/spc700_ops_mov.cpp deleted file mode 100644 index c3f8ed48..00000000 --- a/bsnes/apu/spc700_ops_mov.cpp +++ /dev/null @@ -1,377 +0,0 @@ -void spc700_op_mov_a_x(void) { - spc700->regs.a = spc700->regs.x; - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_mov_a_y(void) { - spc700->regs.a = spc700->regs.y; - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_mov_x_a(void) { - spc700->regs.x = spc700->regs.a; - spc700_testn(spc700->regs.x & 0x80); - spc700_testz(spc700->regs.x == 0); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_mov_y_a(void) { - spc700->regs.y = spc700->regs.a; - spc700_testn(spc700->regs.y & 0x80); - spc700_testz(spc700->regs.y == 0); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_mov_x_sp(void) { - spc700->regs.x = spc700->regs.sp; - spc700_testn(spc700->regs.x & 0x80); - spc700_testz(spc700->regs.x == 0); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_mov_sp_x(void) { - spc700->regs.sp = spc700->regs.x; - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_mov_dp_dp(void) { -spc700_prefetch2b(); -byte x; - x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg0); - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg1, x); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_mov_dp_imm(void) { -spc700_prefetch2b(); - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg1, arg0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_mov_a_const(void) { -spc700_prefetchb(); - spc700->regs.a = arg; - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(2); -} - -void spc700_op_mov_x_const(void) { -spc700_prefetchb(); - spc700->regs.x = arg; - spc700_testn(spc700->regs.x & 0x80); - spc700_testz(spc700->regs.x == 0); - spc700_incpc(2); - add_apu_cycles(2); -} - -void spc700_op_mov_y_const(void) { -spc700_prefetchb(); - spc700->regs.y = arg; - spc700_testn(spc700->regs.y & 0x80); - spc700_testz(spc700->regs.y == 0); - spc700_incpc(2); - add_apu_cycles(2); -} - -void spc700_op_mov_ix_a(void) { - spc700->mem_write(APUMODE_IX, MEMSIZE_BYTE, 0, spc700->regs.a); - spc700_incpc(1); - add_apu_cycles(4); -} - -void spc700_op_mov_ixinc_a(void) { - spc700->mem_write(APUMODE_IX, MEMSIZE_BYTE, 0, spc700->regs.a); - spc700->regs.x++; - spc700_incpc(1); - add_apu_cycles(4); -} - -void spc700_op_mov_dp_a(void) { -spc700_prefetchb(); - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, spc700->regs.a); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_mov_dpx_a(void) { -spc700_prefetchb(); - spc700->mem_write(APUMODE_DPX, MEMSIZE_BYTE, arg, spc700->regs.a); - spc700_incpc(2); - add_apu_cycles(5); -} - -void spc700_op_mov_addr_a(void) { -spc700_prefetchw(); - spc700->mem_write(APUMODE_ADDR, MEMSIZE_BYTE, arg, spc700->regs.a); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_mov_addrx_a(void) { -spc700_prefetchw(); - spc700->mem_write(APUMODE_ADDRX, MEMSIZE_BYTE, arg, spc700->regs.a); - spc700_incpc(3); - add_apu_cycles(6); -} - -void spc700_op_mov_addry_a(void) { -spc700_prefetchw(); - spc700->mem_write(APUMODE_ADDRY, MEMSIZE_BYTE, arg, spc700->regs.a); - spc700_incpc(3); - add_apu_cycles(6); -} - -void spc700_op_mov_idpx_a(void) { -spc700_prefetchb(); -word i; - spc700->mem_write(APUMODE_IDPX, MEMSIZE_BYTE, arg, spc700->regs.a); - spc700_incpc(2); - add_apu_cycles(7); -} - -void spc700_op_mov_idpy_a(void) { -spc700_prefetchb(); -word i; - spc700->mem_write(APUMODE_IDPY, MEMSIZE_BYTE, arg, spc700->regs.a); - spc700_incpc(2); - add_apu_cycles(7); -} - -void spc700_op_mov_dp_x(void) { -spc700_prefetchb(); - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, spc700->regs.x); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_mov_dpy_x(void) { -spc700_prefetchb(); - spc700->mem_write(APUMODE_DPY, MEMSIZE_BYTE, arg, spc700->regs.x); - spc700_incpc(2); - add_apu_cycles(5); -} - -void spc700_op_mov_addr_x(void) { -spc700_prefetchw(); - spc700->mem_write(APUMODE_ADDR, MEMSIZE_BYTE, arg, spc700->regs.x); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_mov_dp_y(void) { -spc700_prefetchb(); - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, spc700->regs.y); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_mov_dpx_y(void) { -spc700_prefetchb(); - spc700->mem_write(APUMODE_DPX, MEMSIZE_BYTE, arg, spc700->regs.y); - spc700_incpc(2); - add_apu_cycles(5); -} - -void spc700_op_mov_addr_y(void) { -spc700_prefetchw(); - spc700->mem_write(APUMODE_ADDR, MEMSIZE_BYTE, arg, spc700->regs.y); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_mov_a_ix(void) { - spc700->regs.a = spc700->mem_read(APUMODE_IX, MEMSIZE_BYTE, 0); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(1); - add_apu_cycles(3); -} - -void spc700_op_mov_a_ixinc(void) { - spc700->regs.a = spc700->mem_read(APUMODE_IX, MEMSIZE_BYTE, 0); - spc700->regs.x++; - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(1); - add_apu_cycles(4); -} - -void spc700_op_mov_a_dp(void) { -spc700_prefetchb(); - spc700->regs.a = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(3); -} - -void spc700_op_mov_a_dpx(void) { -spc700_prefetchb(); - spc700->regs.a = spc700->mem_read(APUMODE_DPX, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_mov_a_addr(void) { -spc700_prefetchw(); - spc700->regs.a = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(3); - add_apu_cycles(4); -} - -void spc700_op_mov_a_addrx(void) { -spc700_prefetchw(); - spc700->regs.a = spc700->mem_read(APUMODE_ADDRX, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_mov_a_addry(void) { -spc700_prefetchw(); - spc700->regs.a = spc700->mem_read(APUMODE_ADDRY, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_mov_a_idpx(void) { -spc700_prefetchb(); -word i; - spc700->regs.a = spc700->mem_read(APUMODE_IDPX, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(6); -} - -void spc700_op_mov_a_idpy(void) { -spc700_prefetchb(); -word i; - spc700->regs.a = spc700->mem_read(APUMODE_IDPY, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(6); -} - -void spc700_op_mov_x_dp(void) { -spc700_prefetchb(); - spc700->regs.x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.x & 0x80); - spc700_testz(spc700->regs.x == 0); - spc700_incpc(2); - add_apu_cycles(3); -} - -void spc700_op_mov_x_dpy(void) { -spc700_prefetchb(); - spc700->regs.x = spc700->mem_read(APUMODE_DPY, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.x & 0x80); - spc700_testz(spc700->regs.x == 0); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_mov_x_addr(void) { -spc700_prefetchw(); - spc700->regs.x = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.x & 0x80); - spc700_testz(spc700->regs.x == 0); - spc700_incpc(3); - add_apu_cycles(4); -} - -void spc700_op_mov_y_dp(void) { -spc700_prefetchb(); - spc700->regs.y = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.y & 0x80); - spc700_testz(spc700->regs.y == 0); - spc700_incpc(2); - add_apu_cycles(3); -} - -void spc700_op_mov_y_dpx(void) { -spc700_prefetchb(); - spc700->regs.y = spc700->mem_read(APUMODE_DPX, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.y & 0x80); - spc700_testz(spc700->regs.y == 0); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_mov_y_addr(void) { -spc700_prefetchw(); - spc700->regs.y = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.y & 0x80); - spc700_testz(spc700->regs.y == 0); - spc700_incpc(3); - add_apu_cycles(4); -} - -void spc700_op_mov_ya_dp(void) { -spc700_prefetchb(); -word ya; - ya = spc700->mem_read(APUMODE_DP, MEMSIZE_WORD, arg); - spc700->regs.a = ya; - spc700->regs.y = ya >> 8; - spc700_testn(ya & 0x8000); - spc700_testz(ya == 0); - spc700_incpc(2); - add_apu_cycles(5); -} - -void spc700_op_mov_dp_ya(void) { -spc700_prefetchb(); -word ya = (spc700->regs.y << 8) | spc700->regs.a; - spc700->mem_write(APUMODE_DP, MEMSIZE_WORD, arg, ya); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_mov1_c_bit(void) { -spc700_prefetchw(); -word addr = arg & 0x1fff; -byte bit = arg >> 13; -byte x; - x = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, addr); - spc700_testc(x & (1 << bit)); - spc700_incpc(3); - add_apu_cycles(4); -} - -void spc700_op_mov1_bit_c(void) { -spc700_prefetchw(); -word addr = arg & 0x1fff; -byte bit = arg >> 13; -byte x; - x = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, addr); - if(spc700->regs.p & SPF_C) { - x |= (1 << bit); - } else { - x &= ~(1 << bit); - } - spc700->mem_write(APUMODE_ADDR, MEMSIZE_BYTE, addr, x); - spc700_incpc(3); - add_apu_cycles(5); -} diff --git a/bsnes/apu/spc700_ops_or.cpp b/bsnes/apu/spc700_ops_or.cpp deleted file mode 100644 index 22b89192..00000000 --- a/bsnes/apu/spc700_ops_or.cpp +++ /dev/null @@ -1,147 +0,0 @@ -void spc700_op_or_a_const(void) { -spc700_prefetchb(); - spc700->regs.a |= arg; - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(2); -} - -void spc700_op_or_a_ix(void) { - spc700->regs.a |= spc700->mem_read(APUMODE_IX, MEMSIZE_BYTE, 0); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(1); - add_apu_cycles(3); -} - -void spc700_op_or_a_dp(void) { -spc700_prefetchb(); - spc700->regs.a |= spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(3); -} - -void spc700_op_or_a_dpx(void) { -spc700_prefetchb(); - spc700->regs.a |= spc700->mem_read(APUMODE_DPX, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_or_a_addr(void) { -spc700_prefetchw(); - spc700->regs.a |= spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(3); - add_apu_cycles(4); -} - -void spc700_op_or_a_addrx(void) { -spc700_prefetchw(); - spc700->regs.a |= spc700->mem_read(APUMODE_ADDRX, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_or_a_addry(void) { -spc700_prefetchw(); - spc700->regs.a |= spc700->mem_read(APUMODE_ADDRY, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_or_a_idpx(void) { -spc700_prefetchb(); -word i; - spc700->regs.a |= spc700->mem_read(APUMODE_IDPX, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(6); -} - -void spc700_op_or_a_idpy(void) { -spc700_prefetchb(); -word i; - spc700->regs.a |= spc700->mem_read(APUMODE_IDPY, MEMSIZE_BYTE, arg); - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(2); - add_apu_cycles(6); -} - -void spc700_op_or_ix_iy(void) { -word i; -byte x; - x = spc700->mem_read(APUMODE_IX, MEMSIZE_BYTE, 0); - x |= spc700->mem_read(APUMODE_IY, MEMSIZE_BYTE, 0); - spc700->mem_write(APUMODE_IX, MEMSIZE_BYTE, 0, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(1); - add_apu_cycles(5); -} - -void spc700_op_or_dp_dp(void) { -spc700_prefetch2b(); -byte x; - x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg1); - x |= spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg0); - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg1, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(3); - add_apu_cycles(6); -} - -void spc700_op_or_dp_imm(void) { -spc700_prefetch2b(); -byte x; - x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg1); - x |= arg0; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg1, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_or1_bit(void) { -spc700_prefetchw(); -word addr = arg & 0x1fff; -byte bit = arg >> 13; -byte x; - if(!(spc700->regs.p & SPF_C)) { - x = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, addr); - if(x & (1 << bit)) { - spc700_setc(); - } - } - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_or1_notbit(void) { -spc700_prefetchw(); -word addr = arg & 0x1fff; -byte bit = arg >> 13; -byte x; - if(!(spc700->regs.p & SPF_C)) { - x = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, addr); - if(!(x & (1 << bit))) { - spc700_setc(); - } - } - spc700_incpc(3); - add_apu_cycles(5); -} diff --git a/bsnes/apu/spc700_ops_pc.cpp b/bsnes/apu/spc700_ops_pc.cpp deleted file mode 100644 index c422f7af..00000000 --- a/bsnes/apu/spc700_ops_pc.cpp +++ /dev/null @@ -1,342 +0,0 @@ -void spc700_op_bra(void) { -spc700_prefetchb(); - spc700->regs.pc += (signed char)arg; - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_bcc(void) { -spc700_prefetchb(); - if(!(spc700->regs.p & SPF_C)) { - spc700->regs.pc += (signed char)arg; - add_apu_cycles(4); - } else { - add_apu_cycles(2); - } - spc700_incpc(2); -} - -void spc700_op_bcs(void) { -spc700_prefetchb(); - if((spc700->regs.p & SPF_C)) { - spc700->regs.pc += (signed char)arg; - add_apu_cycles(4); - } else { - add_apu_cycles(2); - } - spc700_incpc(2); -} - -void spc700_op_beq(void) { -spc700_prefetchb(); - if((spc700->regs.p & SPF_Z)) { - spc700->regs.pc += (signed char)arg; - add_apu_cycles(4); - } else { - add_apu_cycles(2); - } - spc700_incpc(2); -} - -void spc700_op_bmi(void) { -spc700_prefetchb(); - if((spc700->regs.p & SPF_N)) { - spc700->regs.pc += (signed char)arg; - add_apu_cycles(4); - } else { - add_apu_cycles(2); - } - spc700_incpc(2); -} - -void spc700_op_bne(void) { -spc700_prefetchb(); - if(!(spc700->regs.p & SPF_Z)) { - spc700->regs.pc += (signed char)arg; - add_apu_cycles(4); - } else { - add_apu_cycles(2); - } - spc700_incpc(2); -} - -void spc700_op_bpl(void) { -spc700_prefetchb(); - if(!(spc700->regs.p & SPF_N)) { - spc700->regs.pc += (signed char)arg; - add_apu_cycles(4); - } else { - add_apu_cycles(2); - } - spc700_incpc(2); -} - -void spc700_op_bvc(void) { -spc700_prefetchb(); - if(!(spc700->regs.p & SPF_V)) { - spc700->regs.pc += (signed char)arg; - add_apu_cycles(4); - } else { - add_apu_cycles(2); - } - spc700_incpc(2); -} - -void spc700_op_bvs(void) { -spc700_prefetchb(); - if((spc700->regs.p & SPF_V)) { - spc700->regs.pc += (signed char)arg; - add_apu_cycles(4); - } else { - add_apu_cycles(2); - } - spc700_incpc(2); -} - -#define spc700_op_bbc(__n) \ - void spc700_op_bbc##__n##(void) { \ - spc700_prefetch2b(); \ - byte r; \ - r = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg0); \ - if(!(r & (1 << __n))) { \ - spc700->regs.pc += (signed char)arg1; \ - add_apu_cycles(7); \ - } else { \ - add_apu_cycles(5); \ - } \ - spc700_incpc(3); \ - } - -#define spc700_op_bbs(__n) \ - void spc700_op_bbs##__n##(void) { \ - spc700_prefetch2b(); \ - byte r; \ - r = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg0); \ - if(r & (1 << __n)) { \ - spc700->regs.pc += (signed char)arg1; \ - add_apu_cycles(7); \ - } else { \ - add_apu_cycles(5); \ - } \ - spc700_incpc(3); \ - } - -spc700_op_bbc(0) -spc700_op_bbc(1) -spc700_op_bbc(2) -spc700_op_bbc(3) -spc700_op_bbc(4) -spc700_op_bbc(5) -spc700_op_bbc(6) -spc700_op_bbc(7) - -spc700_op_bbs(0) -spc700_op_bbs(1) -spc700_op_bbs(2) -spc700_op_bbs(3) -spc700_op_bbs(4) -spc700_op_bbs(5) -spc700_op_bbs(6) -spc700_op_bbs(7) - -void spc700_op_cbne_dp(void) { -spc700_prefetch2b(); -byte r; - r = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg0); - if(r != spc700->regs.a) { - spc700->regs.pc += (signed char)arg1; - add_apu_cycles(7); - } else { - add_apu_cycles(5); - } - spc700_incpc(3); -} - -void spc700_op_cbne_dpx(void) { -spc700_prefetch2b(); -byte r; - r = spc700->mem_read(APUMODE_DPX, MEMSIZE_BYTE, arg0); - if(r != spc700->regs.a) { - spc700->regs.pc += (signed char)arg1; - add_apu_cycles(8); - } else { - add_apu_cycles(6); - } - spc700_incpc(3); -} - -void spc700_op_dbnz_dp(void) { -spc700_prefetch2b(); -byte r; - r = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg0) - 1; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg0, r); - if(r != 0) { - spc700->regs.pc += (signed char)arg1; - add_apu_cycles(7); - } else { - add_apu_cycles(5); - } - spc700_incpc(3); -} - -void spc700_op_dbnz_y(void) { -spc700_prefetchb(); - spc700->regs.y--; - if(spc700->regs.y != 0) { - spc700->regs.pc += (signed char)arg; - add_apu_cycles(6); - } else { - add_apu_cycles(4); - } - spc700_incpc(2); -} - -void spc700_op_jmp_addr(void) { -spc700_prefetchw(); - spc700->regs.pc = arg; - add_apu_cycles(3); -} - -void spc700_op_jmp_iaddrx(void) { -spc700_prefetchw(); - spc700->regs.pc = spc700->mem_read(APUMODE_IADDRX, MEMSIZE_WORD, arg); - add_apu_cycles(3); -} - -void spc700_op_call(void) { -spc700_prefetchw(); -word r = spc700->regs.pc + 3; - spc700_incpc(3); - spc700->stack_write(r); - spc700->stack_write(r >> 8); - spc700->regs.pc = arg; - add_apu_cycles(8); -} - -void spc700_op_pcall(void) { -spc700_prefetchb(); -word r = spc700->regs.pc + 2; - spc700->stack_write(r); - spc700->stack_write(r >> 8); - spc700->regs.pc = 0xff00 | arg; - add_apu_cycles(6); -} - -void spc700_op_tcall_0(void) { - dprintf("* spc700 opcode tcall 0 not implemented"); - spc700_incpc(1); - add_apu_cycles(8); -} - -void spc700_op_tcall_1(void) { - dprintf("* spc700 opcode tcall 1 not implemented"); - spc700_incpc(1); - add_apu_cycles(8); -} - -void spc700_op_tcall_2(void) { - dprintf("* spc700 opcode tcall 2 not implemented"); - spc700_incpc(1); - add_apu_cycles(8); -} - -void spc700_op_tcall_3(void) { - dprintf("* spc700 opcode tcall 3 not implemented"); - spc700_incpc(1); - add_apu_cycles(8); -} - -void spc700_op_tcall_4(void) { - dprintf("* spc700 opcode tcall 4 not implemented"); - spc700_incpc(1); - add_apu_cycles(8); -} - -void spc700_op_tcall_5(void) { - dprintf("* spc700 opcode tcall 5 not implemented"); - spc700_incpc(1); - add_apu_cycles(8); -} - -void spc700_op_tcall_6(void) { - dprintf("* spc700 opcode tcall 6 not implemented"); - spc700_incpc(1); - add_apu_cycles(8); -} - -void spc700_op_tcall_7(void) { - dprintf("* spc700 opcode tcall 7 not implemented"); - spc700_incpc(1); - add_apu_cycles(8); -} - -void spc700_op_tcall_8(void) { - dprintf("* spc700 opcode tcall 8 not implemented"); - spc700_incpc(1); - add_apu_cycles(8); -} - -void spc700_op_tcall_9(void) { - dprintf("* spc700 opcode tcall 9 not implemented"); - spc700_incpc(1); - add_apu_cycles(8); -} - -void spc700_op_tcall_10(void) { - dprintf("* spc700 opcode tcall 10 not implemented"); - spc700_incpc(1); - add_apu_cycles(8); -} - -void spc700_op_tcall_11(void) { - dprintf("* spc700 opcode tcall 11 not implemented"); - spc700_incpc(1); - add_apu_cycles(8); -} - -void spc700_op_tcall_12(void) { - dprintf("* spc700 opcode tcall 12 not implemented"); - spc700_incpc(1); - add_apu_cycles(8); -} - -void spc700_op_tcall_13(void) { - dprintf("* spc700 opcode tcall 13 not implemented"); - spc700_incpc(1); - add_apu_cycles(8); -} - -void spc700_op_tcall_14(void) { - dprintf("* spc700 opcode tcall 14 not implemented"); - spc700_incpc(1); - add_apu_cycles(8); -} - -void spc700_op_tcall_15(void) { - dprintf("* spc700 opcode tcall 15 not implemented"); - spc700_incpc(1); - add_apu_cycles(8); -} - -void spc700_op_brk(void) { - dprintf("* spc700 opcode brk not implemented"); - spc700_incpc(1); - add_apu_cycles(8); -} - -void spc700_op_ret(void) { -word r; - r = spc700->stack_read(); - r |= spc700->stack_read() << 8; - spc700->regs.pc = r; - add_apu_cycles(5); -} - -void spc700_op_reti(void) { -word r; - spc700->regs.p = spc700->stack_read(); - r = spc700->stack_read(); - r |= spc700->stack_read() << 8; - spc700->regs.pc = r; - add_apu_cycles(6); -} diff --git a/bsnes/apu/spc700_ops_sbc.cpp b/bsnes/apu/spc700_ops_sbc.cpp deleted file mode 100644 index cd726a19..00000000 --- a/bsnes/apu/spc700_ops_sbc.cpp +++ /dev/null @@ -1,111 +0,0 @@ -byte spc700_op_sbc(byte x, byte y) { -short r = (short)x - (short)y - (short)(!(spc700->regs.p & SPF_C)); - spc700_testn(r & 0x80); - spc700_testv(((x ^ y) & 0x80) && ((x ^ (byte)r) & 0x80)); - spc700_testh(((x ^ y ^ (byte)r) & 0x10) == 0); - spc700_testz((byte)r == 0); - spc700_testc(r >= 0); - return (byte)r; -} - -void spc700_op_sbc_a_const(void) { -spc700_prefetchb(); - spc700->regs.a = spc700_op_sbc(spc700->regs.a, arg); - spc700_incpc(2); - add_apu_cycles(2); -} - -void spc700_op_sbc_a_ix(void) { - spc700->regs.a = spc700_op_sbc(spc700->regs.a, spc700->mem_read(APUMODE_IX, MEMSIZE_BYTE, 0)); - spc700_incpc(1); - add_apu_cycles(3); -} - -void spc700_op_sbc_a_dp(void) { -spc700_prefetchb(); - spc700->regs.a = spc700_op_sbc(spc700->regs.a, spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg)); - spc700_incpc(2); - add_apu_cycles(3); -} - -void spc700_op_sbc_a_dpx(void) { -spc700_prefetchb(); - spc700->regs.a = spc700_op_sbc(spc700->regs.a, spc700->mem_read(APUMODE_DPX, MEMSIZE_BYTE, arg)); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_sbc_a_addr(void) { -spc700_prefetchw(); - spc700->regs.a = spc700_op_sbc(spc700->regs.a, spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg)); - spc700_incpc(3); - add_apu_cycles(4); -} - -void spc700_op_sbc_a_addrx(void) { -spc700_prefetchw(); - spc700->regs.a = spc700_op_sbc(spc700->regs.a, spc700->mem_read(APUMODE_ADDRX, MEMSIZE_BYTE, arg)); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_sbc_a_addry(void) { -spc700_prefetchw(); - spc700->regs.a = spc700_op_sbc(spc700->regs.a, spc700->mem_read(APUMODE_ADDRY, MEMSIZE_BYTE, arg)); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_sbc_a_idpx(void) { -spc700_prefetchb(); - spc700->regs.a = spc700_op_sbc(spc700->regs.a, spc700->mem_read(APUMODE_IDPX, MEMSIZE_BYTE, arg)); - spc700_incpc(2); - add_apu_cycles(6); -} - -void spc700_op_sbc_a_idpy(void) { -spc700_prefetchb(); -word i; - spc700->regs.a = spc700_op_sbc(spc700->regs.a, spc700->mem_read(APUMODE_IDPY, MEMSIZE_BYTE, arg)); - spc700_incpc(2); - add_apu_cycles(6); -} - -void spc700_op_sbc_ix_iy(void) { -byte x = spc700_op_sbc(spc700->mem_read(APUMODE_IX, MEMSIZE_BYTE, 0), spc700->mem_read(APUMODE_IY, MEMSIZE_BYTE, 0)); - spc700->mem_write(APUMODE_IX, MEMSIZE_BYTE, 0, x); - spc700_incpc(1); - add_apu_cycles(5); -} - -void spc700_op_sbc_dp_dp(void) { -spc700_prefetch2b(); -byte x = spc700_op_sbc(spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg1), spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg0)); - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg1, x); - spc700_incpc(3); - add_apu_cycles(6); -} - -void spc700_op_sbc_dp_imm(void) { -spc700_prefetch2b(); -byte x = spc700_op_sbc(spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg1), arg0); - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg1, x); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_subw_ya_dp(void) { -spc700_prefetchb(); -word ya = (spc700->regs.y << 8) | spc700->regs.a; -word dp = spc700->mem_read(APUMODE_DP, MEMSIZE_WORD, arg); -long r = (long)ya - (long)dp; - spc700_testn(r & 0x8000); - spc700_testv(((ya ^ dp) & 0x8000) && ((ya ^ (word)r) & 0x8000)); - spc700_testh(((ya ^ dp ^ (word)r) & 0x1000) == 0); - spc700_testz((word)r == 0); - spc700_testc(r >= 0); - spc700->regs.a = r; - spc700->regs.y = r >> 8; - spc700_incpc(2); - add_apu_cycles(5); -} diff --git a/bsnes/apu/spc700_ops_shift.cpp b/bsnes/apu/spc700_ops_shift.cpp deleted file mode 100644 index fb46fac6..00000000 --- a/bsnes/apu/spc700_ops_shift.cpp +++ /dev/null @@ -1,195 +0,0 @@ -void spc700_op_asl_a(void) { - spc700_testc(spc700->regs.a & 0x80); - spc700->regs.a <<= 1; - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_asl_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - spc700_testc(x & 0x80); - x <<= 1; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_asl_dpx(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DPX, MEMSIZE_BYTE, arg); - spc700_testc(x & 0x80); - x <<= 1; - spc700->mem_write(APUMODE_DPX, MEMSIZE_BYTE, arg, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(2); - add_apu_cycles(5); -} - -void spc700_op_asl_addr(void) { -spc700_prefetchw(); -byte x = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg); - spc700_testc(x & 0x80); - x <<= 1; - spc700->mem_write(APUMODE_ADDR, MEMSIZE_BYTE, arg, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_lsr_a(void) { - spc700_testc(spc700->regs.a & 0x01); - spc700->regs.a >>= 1; - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_lsr_dp(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - spc700_testc(x & 0x01); - x >>= 1; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_lsr_dpx(void) { -spc700_prefetchb(); -byte x = spc700->mem_read(APUMODE_DPX, MEMSIZE_BYTE, arg); - spc700_testc(x & 0x01); - x >>= 1; - spc700->mem_write(APUMODE_DPX, MEMSIZE_BYTE, arg, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(2); - add_apu_cycles(5); -} - -void spc700_op_lsr_addr(void) { -spc700_prefetchw(); -byte x = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg); - spc700_testc(x & 0x01); - x >>= 1; - spc700->mem_write(APUMODE_ADDR, MEMSIZE_BYTE, arg, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_rol_a(void) { -byte c = (spc700->regs.p & SPF_C)?0x80:0x00; - spc700_testc(spc700->regs.a & 0x80); - spc700->regs.a <<= 1; - spc700->regs.a |= c; - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_rol_dp(void) { -spc700_prefetchb(); -byte c = (spc700->regs.p & SPF_C)?0x80:0x00; -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - spc700_testc(x & 0x80); - x <<= 1; - x |= c; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_rol_dpx(void) { -spc700_prefetchb(); -byte c = (spc700->regs.p & SPF_C)?0x80:0x00; -byte x = spc700->mem_read(APUMODE_DPX, MEMSIZE_BYTE, arg); - spc700_testc(x & 0x80); - x <<= 1; - x |= c; - spc700->mem_write(APUMODE_DPX, MEMSIZE_BYTE, arg, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(2); - add_apu_cycles(5); -} - -void spc700_op_rol_addr(void) { -spc700_prefetchw(); -byte c = (spc700->regs.p & SPF_C)?0x80:0x00; -byte x = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg); - spc700_testc(x & 0x80); - x <<= 1; - x |= c; - spc700->mem_write(APUMODE_ADDR, MEMSIZE_BYTE, arg, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(3); - add_apu_cycles(5); -} - -void spc700_op_ror_a(void) { -byte c = (spc700->regs.p & SPF_C)?0x01:0x00; - spc700_testc(spc700->regs.a & 0x01); - spc700->regs.a >>= 1; - spc700->regs.a |= c; - spc700_testn(spc700->regs.a & 0x80); - spc700_testz(spc700->regs.a == 0); - spc700_incpc(1); - add_apu_cycles(2); -} - -void spc700_op_ror_dp(void) { -spc700_prefetchb(); -byte c = (spc700->regs.p & SPF_C)?0x01:0x00; -byte x = spc700->mem_read(APUMODE_DP, MEMSIZE_BYTE, arg); - spc700_testc(x & 0x01); - x >>= 1; - x |= c; - spc700->mem_write(APUMODE_DP, MEMSIZE_BYTE, arg, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(2); - add_apu_cycles(4); -} - -void spc700_op_ror_dpx(void) { -spc700_prefetchb(); -byte c = (spc700->regs.p & SPF_C)?0x01:0x00; -byte x = spc700->mem_read(APUMODE_DPX, MEMSIZE_BYTE, arg); - spc700_testc(x & 0x01); - x >>= 1; - x |= c; - spc700->mem_write(APUMODE_DPX, MEMSIZE_BYTE, arg, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(2); - add_apu_cycles(5); -} - -void spc700_op_ror_addr(void) { -spc700_prefetchw(); -byte c = (spc700->regs.p & SPF_C)?0x01:0x00; -byte x = spc700->mem_read(APUMODE_ADDR, MEMSIZE_BYTE, arg); - spc700_testc(x & 0x01); - x >>= 1; - x |= c; - spc700->mem_write(APUMODE_ADDR, MEMSIZE_BYTE, arg, x); - spc700_testn(x & 0x80); - spc700_testz(x == 0); - spc700_incpc(3); - add_apu_cycles(5); -} diff --git a/bsnes/apu/spc700_ops_stack.cpp b/bsnes/apu/spc700_ops_stack.cpp deleted file mode 100644 index b397a0e5..00000000 --- a/bsnes/apu/spc700_ops_stack.cpp +++ /dev/null @@ -1,48 +0,0 @@ -void spc700_op_push_a(void) { - spc700->stack_write(spc700->regs.a); - spc700_incpc(1); - add_apu_cycles(4); -} - -void spc700_op_push_x(void) { - spc700->stack_write(spc700->regs.x); - spc700_incpc(1); - add_apu_cycles(4); -} - -void spc700_op_push_y(void) { - spc700->stack_write(spc700->regs.y); - spc700_incpc(1); - add_apu_cycles(4); -} - -void spc700_op_push_p(void) { - spc700->stack_write(spc700->regs.p); - spc700_incpc(1); - add_apu_cycles(4); -} - -void spc700_op_pop_a(void) { - spc700->regs.a = spc700->stack_read(); - spc700_incpc(1); - add_apu_cycles(4); -} - -void spc700_op_pop_x(void) { - spc700->regs.x = spc700->stack_read(); - spc700_incpc(1); - add_apu_cycles(4); -} - -void spc700_op_pop_y(void) { - spc700->regs.y = spc700->stack_read(); - spc700_incpc(1); - add_apu_cycles(4); -} - -void spc700_op_pop_p(void) { - spc700->regs.p = spc700->stack_read(); - spc700_incpc(1); - add_apu_cycles(4); - spc700->regs.dp = (spc700->regs.p & SPF_P)?0x0100:0x0000; -} diff --git a/bsnes/base.h b/bsnes/base.h deleted file mode 100644 index 7a3403f8..00000000 --- a/bsnes/base.h +++ /dev/null @@ -1,424 +0,0 @@ -#define NO_SPC700 - -#include -#include -#include -#include - -#define null 0xffffffff -typedef unsigned char byte; -typedef unsigned short word; -typedef unsigned long ulong; -typedef void (*vfunc)(void); - -#define SH_2 1 -#define SH_4 2 -#define SH_8 3 -#define SH_16 4 -#define SH_32 5 -#define SH_64 6 -#define SH_128 7 -#define SH_256 8 -#define SH_512 9 -#define SH_1024 10 -#define SH_2048 11 -#define SH_4096 12 - -/************************* - *** general functions *** - ************************/ - -void alert(char *s, ...); - -/************************ - *** joypad functions *** - ***********************/ - -void UpdateJoypad(void); - -typedef struct { - byte a, b, x, y; - byte l, r; - byte select, start; - byte up, down, left, right; - - byte read_pos; -}joypad_state; - -/****************** - *** deprecated *** - *****************/ - -typedef struct { - bool rom_loaded; - ulong sram_save_tick_count; - char rom_name[4096], sram_name[4096]; -}emustate; - -/*********************** - *** video functions *** - **********************/ - -void video_setmode(bool fullscreen, word width, word height); -void video_setsnesmode(void); - -#define LINE_DOUBLEWIDTH 1 -#define LINE_DOUBLEHEIGHT 2 - -//global export: render -typedef struct { - word display_width, display_height; - word snes_width, snes_height; - bool fullscreen; - bool show_menu; - - byte frame_skip; - byte frame_count; - - bool bg1_enabled[3], bg2_enabled[3], bg3_enabled[3], bg4_enabled[3], oam_enabled[5]; - - byte line[239]; -}videostate; - -/*************************** - *** debugging functions *** - **************************/ - -#define DEBUGMSG_INFO 0 -#define DEBUGMSG_CPU 1 -#define DEBUGMSG_APU 2 - -#define DEBUGWRITE_NONE 0 -#define DEBUGWRITE_CONSOLE 1 -#define DEBUGWRITE_TRACE 2 - -enum { - DEBUGMODE_DISABLED = 0, - DEBUGMODE_WAIT, - DEBUGMODE_RUN, - DEBUGMODE_CPUSTEP, - DEBUGMODE_APUSTEP, - DEBUGMODE_PROCEED -}; - -#define DEBUG_BGENABLED_ALL 0 -#define DEBUG_BGENABLED_PRI0 1 -#define DEBUG_BGENABLED_PRI1 2 -#define DEBUG_BGENABLED_PRI2 3 -#define DEBUG_BGENABLED_PRI3 4 - -#define BP_OFF 0 -#define BP_READ 1 -#define BP_WRITE 2 -#define BP_EXEC 4 -#define BP_VAL 8 - -#define BPSRC_MEM 0 -#define BPSRC_VRAM 1 -#define BPSRC_CGRAM 2 -#define BPSRC_OAM 3 -#define BPSRC_SPCRAM 4 - -void debug_test_breakpoint(byte source, byte flag, ulong offset, byte value); -#define debug_get_state() debugger.mode -#define debugger_enabled() ((debugger.mode == DEBUGMODE_DISABLED)?false:true) -#define debug_test_bp(__source, __flag, __offset, __value) \ - if(debug_get_state() != DEBUGMODE_DISABLED) { \ - debug_test_breakpoint(__source, __flag, __offset, __value); \ - } -void debug_set_state(byte state); -void dprintf(char *s, ...); -void dprintf(ulong msg_type, char *s, ...); -void debug_refresh_mem(void); -void debug_refresh_bp(void); -void debug_update_status(void); -ulong debug_write_status(void); - -typedef struct { - byte mode; - - ulong mem_ptr; //position of wram ptr for debug window - bool disas_cpu_op, disas_apu_op; - bool refresh_mem; - bool refresh_bp; - bool refresh_status; - - bool cpu_op_executed; - bool apu_op_executed; - - bool output_cpu_instrs; - bool output_apu_instrs; - bool output_debug_info; - bool trace_enabled; - bool trace_output_enabled; - - bool lock_up, lock_down, lock_left, lock_right; - bool lock_a, lock_b, lock_x, lock_y; - bool lock_l, lock_r, lock_select, lock_start; - - struct { - ulong offset; - byte flags; - byte source; - byte value; - ulong hit_count; - }bp_list[16]; - - FILE *trace_fp; -}debugstate; - -/********************* - *** ppu functions *** - ********************/ - -#define BG1 0x00 -#define BG2 0x01 -#define BG3 0x02 -#define BG4 0x03 -#define OAM 0x04 -#define SS_BG1 0x80 -#define SS_BG2 0x81 -#define SS_BG3 0x82 -#define SS_BG4 0x83 -#define SS_OAM 0x84 -#define BACK 0x05 - -#define CLIPMODE_IN 0 -#define CLIPMODE_OUT 1 - -#define WINDOWMASK_OR 0 -#define WINDOWMASK_AND 1 -#define WINDOWMASK_XOR 2 -#define WINDOWMASK_XNOR 3 - -#define COLORMODE_ADD 0 -#define COLORMODE_SUB 1 - -typedef struct { - word *screen; //internal buffer used to render 512x448 screen - byte *vram; //65536 bytes - byte *cgram; //512 bytes - byte *oam; //544 bytes mirrored as 1024 bytes (512-543 are mirrored to 544-1023) - word *light_table; //16 * 32768 -- applies display_brightness to bgr555 color data -//ppu.mosaic_table[ppu.mosaic_size][x] == (x / (ppu.mosaic_size + 1)) * (ppu.mosaic_size + 1) - word *mosaic_table[16]; - - ulong ppu_cycles, ppu_prev_cycles; //used in ppu_update_scanline() - - bool display_disable; //$2100 bit 7 - byte display_brightness; //$2100 bits 0-3 - - bool overscan; - byte visible_scanlines; - bool sprite_halve; - bool interlace, toggle_interlace; - byte interlace_frame; //0 or 1, used to alternate between scanlines rendered - - bool bg_enabled[5]; - bool ss_bg_enabled[5]; - byte mosaic_size; - bool mosaic_enabled[4]; - word bg_tilemap_loc[4]; - byte bg_tile_size[4]; - byte bg_tilemap_size[4]; - word bg_tiledata_loc[4]; - word oam_tiledata_loc; - byte bg_priority_mode; - byte oam_base_size; - byte oam_name_sel; - byte bg_mode; - - word hline_pos; //0-255: inside vblank, 256-339: outside vblank - word vline_pos; //0-223: inside vblank, 224-261: outside vblank, 180 cycles/scanline - bool irq_triggered; //for $4211 read - bool virq_triggered; //prevent recursive calling - bool hirq_triggered; //prevent recursive calling - word vram_write_pos; //holds value at $2116 - word vram_write_buffer; - word vram_read_buffer; - word vram_remap_mode; - word vram_inc_size; //amount to increment vram_write_pos by - byte vram_inc_reg; //increment on 2118 (0) or 2119 (1) - word cgram_write_pos; //holds value at $2121 (multiplied by 2) - word oam_write_pos; //holds value at $2102/$2103 (multiplied by 2) - ulong wram_write_pos; //holds value at $2181-$2183 - - word bg_hscroll_pos[4]; //$210d-$2114 - word bg_vscroll_pos[4]; - word m7hofs, m7vofs; - - byte mul_a, mul_b; - word div_a; - byte div_b; - word r_4214, r_4216; - ulong r_2134; - - bool bg_window1_enabled[5]; - bool bg_window2_enabled[5]; - byte bg_window1_clipmode[5]; - byte bg_window2_clipmode[5]; - - byte window1_left, window1_right; - byte window2_left, window2_right; - - bool bg_windowing_enabled[5]; - bool ss_bg_windowing_enabled[5]; - byte bg_window_mask[5]; - - bool color_window1_enabled, color_window2_enabled; - bool color_window1_clipmode, color_window2_clipmode; - byte color_window_mask; - byte color_mask, ss_color_mask; - byte addsub_mode; - byte color_mode, color_halve; - bool bg_color_enabled[6]; - byte color_r, color_g, color_b; - - byte active_hdma_channels; - word hdma_scanlines_remaining[8]; - word hdma_index_pointer[8]; - bool hdma_completed[8]; - - bool vcounter_enabled, hcounter_enabled; - word hirq_pos, virq_pos; - - bool auto_joypad_read; - byte joypad_strobe_value; - - byte latch_toggle; - word latch_vpos, latch_hpos; - - word m7a, m7b, m7c, m7d, m7x, m7y; - - byte mode7_repeat; - bool mode7_extbg; - bool mode7_vflip, mode7_hflip; - - byte io4201; - bool counter_latched; - - byte mmio_mem_43xx[0x80]; -}ppustate; - -/********************* - *** cpu functions *** - ********************/ - -#define CPUSTATE_RUN 0 -#define CPUSTATE_DMA 1 -#define CPUSTATE_STP 2 - -#define MEMSPEED_SLOWROM 0 -#define MEMSPEED_FASTROM 1 - -void add_apu_cycles(int n); - -//g65816 cpu flags -#define PF_N 0x80 -#define PF_V 0x40 -#define PF_M 0x20 -#define PF_X 0x10 -#define PF_D 0x08 -#define PF_I 0x04 -#define PF_Z 0x02 -#define PF_C 0x01 - -//spc700 cpu flags -#define SPF_N 0x80 -#define SPF_V 0x40 -#define SPF_P 0x20 -#define SPF_B 0x10 -#define SPF_H 0x08 -#define SPF_I 0x04 -#define SPF_Z 0x02 -#define SPF_C 0x01 - -/************************ - *** memory functions *** - ***********************/ - -#define MEMSPEED_FAST 6 -#define MEMSPEED_SLOW 8 -#define MEMSPEED_XSLOW 12 - -#define MEMMAP_HIROM 0x01 -#define MEMMAP_LOROM 0x02 - -#define MEMACCESS_NORMAL 0 -#define MEMACCESS_CPU 1 -#define MEMACCESS_DEBUGGER 1 - -enum { - MEMMODE_NONE = 0, //(no address translation) - MEMMODE_DP, //dp - MEMMODE_DPX, //dp,x - MEMMODE_DPY, //dp,y - MEMMODE_IDP, //(dp) - MEMMODE_IDPX, //(dp,x) - MEMMODE_IDPY, //(dp),y - MEMMODE_ILDP, //[dp] - MEMMODE_ILDPY, //[dp],y - MEMMODE_ADDR, //addr - MEMMODE_ADDRX, //addr,x - MEMMODE_ADDRY, //addr,y - MEMMODE_IADDRX, //(addr,x) - MEMMODE_ILADDR, //[addr] - MEMMODE_LONG, //long - MEMMODE_LONGX, //long, x - MEMMODE_SR, //sr,s - MEMMODE_ISRY, //(sr,s),y -//exchanges pbr for dbr, disables address mirroring - MEMMODE_ADDR_PC, //addr - MEMMODE_IADDR_PC, //(addr) - MEMMODE_IADDRX_PC, //(addr,x) - MEMMODE_ILADDR_PC, //[addr] -//opcode memory access types - OPMODE_DBR, - OPMODE_PBR, - OPMODE_LONG, - OPMODE_DP, - OPMODE_SP, - OPMODE_ADDR -}; - -#define MEMSIZE_BYTE 1 -#define MEMSIZE_WORD 2 -#define MEMSIZE_LONG 3 - -/*********************** - *** misc. functions *** - **********************/ - -//main.cpp -void InitSNES(void); -void RunSNES(void); -void ResetSNES(void); - -//cpu/g65816_ops_stack.cpp -//ulong g65816_stackread(byte size); -//void g65816_stackwrite(byte size, ulong value); - -//cpu/d65816.cpp -void disas_g65816_op(void); - -//apu/dspc700.cpp -void disas_spc700_op(void); - -//ppu/mmio.cpp -byte mmio_read(word addr); -void mmio_write(word addr, byte value); - -//ppu/ppu.cpp -void ppu_render_scanline(void); -void ppu_update_scanline(void); -byte oam_read(word addr); -void oam_write(word addr, byte value); -void PPUInit(byte first_time); -void ppu_update_dma(void); - -//win/render.cpp -void UpdateDisplay(void); - -//misc/libstr.cpp -ulong strhex(char *str); -ulong strdec(char *str); diff --git a/bsnes/bridge/bridge.cpp b/bsnes/bridge/bridge.cpp deleted file mode 100644 index bf490b36..00000000 --- a/bsnes/bridge/bridge.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "../base.h" -#include "bridge.h" -port_bridge *cpu_apu_bridge; - -port_bridge::port_bridge() { - cputoapu_port[0] = cputoapu_port[1] = - cputoapu_port[2] = cputoapu_port[3] = - aputocpu_port[0] = aputocpu_port[1] = - aputocpu_port[2] = aputocpu_port[3] = 0; -} - -byte port_bridge::cpu_read(byte port) { - return aputocpu_port[port & 3]; -} - -byte port_bridge::apu_read(byte port) { - return cputoapu_port[port & 3]; -} - -void port_bridge::cpu_write(byte port, byte value) { - cputoapu_port[port & 3] = value; -} - -void port_bridge::apu_write(byte port, byte value) { - aputocpu_port[port & 3] = value; -} diff --git a/bsnes/bridge/bridge.h b/bsnes/bridge/bridge.h deleted file mode 100644 index 2690ebaa..00000000 --- a/bsnes/bridge/bridge.h +++ /dev/null @@ -1,11 +0,0 @@ -class port_bridge { -public: - byte cputoapu_port[4]; //holds values written to CPU at $2140-$2143 - byte aputocpu_port[4]; //holds values written to APU at $f4-$f7 - - port_bridge(); - byte cpu_read(byte port); - byte apu_read(byte port); - void cpu_write(byte port, byte value); - void apu_write(byte port, byte value); -}; diff --git a/bsnes/bsnes.exe b/bsnes/bsnes.exe deleted file mode 100644 index 614ef29b..00000000 Binary files a/bsnes/bsnes.exe and /dev/null differ diff --git a/bsnes/cc.bat b/bsnes/cc.bat deleted file mode 100644 index 5a1afd6a..00000000 --- a/bsnes/cc.bat +++ /dev/null @@ -1,2 +0,0 @@ -@nmake /NOLOGO -@pause \ No newline at end of file diff --git a/bsnes/clean.bat b/bsnes/clean.bat deleted file mode 100644 index 02d7e1df..00000000 --- a/bsnes/clean.bat +++ /dev/null @@ -1 +0,0 @@ -@nmake /NOLOGO clean \ No newline at end of file diff --git a/bsnes/cpu/d65816.cpp b/bsnes/cpu/d65816.cpp deleted file mode 100644 index 2077055e..00000000 --- a/bsnes/cpu/d65816.cpp +++ /dev/null @@ -1,339 +0,0 @@ -#include "../base.h" -#include "g65816.h" -extern g65816 *gx816; -extern debugstate debugger; - -ulong _disas_relb(byte addr) { - return gx816->regs.pc + (signed char)(addr + 2); -} - -ulong _disas_relw(word addr) { - return gx816->regs.pc + (signed short)(addr + 3); -} - -char __disas_op_str[256]; -void __disas_op(byte op, byte op0, byte op1, byte op2) { -char *s = (char*)__disas_op_str; - switch(op) { - case 0x00:sprintf(s, "brk #$%0.2x ", op0);break; - case 0x01:sprintf(s, "ora ($%0.2x,x) [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDPX, op0));break; - case 0x02:sprintf(s, "cop #$%0.2x ", op0);break; - case 0x03:sprintf(s, "ora $%0.2x,s [$%0.6x]", op0, gx816->convert_offset(MEMMODE_SR, op0));break; - case 0x04:sprintf(s, "tsb $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0x05:sprintf(s, "ora $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0x06:sprintf(s, "asl $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0x07:sprintf(s, "ora [$%0.2x] [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ILDP, op0));break; - case 0x08:sprintf(s, "php ");break; - case 0x09: - if(gx816->regs.e == true || (gx816->regs.e == false && (gx816->regs.p & 0x20)))sprintf(s, "ora #$%0.2x ", op0); - else sprintf(s, "ora #$%0.4x ", op0|op1<<8);break; - case 0x0a:sprintf(s, "asl a ");break; - case 0x0b:sprintf(s, "phd ");break; - case 0x0c:sprintf(s, "tsb $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0x0d:sprintf(s, "ora $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0x0e:sprintf(s, "asl $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0x0f:sprintf(s, "ora $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONG, (op0|op1<<8|op2<<16)));break; - case 0x10:sprintf(s, "bpl $%0.4x [$%0.6x]", _disas_relb(op0)&0xffff, _disas_relb(op0)&0xffffff);break; - case 0x11:sprintf(s, "ora ($%0.2x),y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDPY, op0));break; - case 0x12:sprintf(s, "ora ($%0.2x) [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDP, op0));break; - case 0x13:sprintf(s, "ora ($%0.2x,s),y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ISRY, op0));break; - case 0x14:sprintf(s, "trb $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0x15:sprintf(s, "ora $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0x16:sprintf(s, "asl $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0x17:sprintf(s, "ora [$%0.2x],y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ILDPY, op0));break; - case 0x18:sprintf(s, "clc ");break; - case 0x19:sprintf(s, "ora $%0.4x,y [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRY, (op0|op1<<8)));break; - case 0x1a:sprintf(s, "inc ");break; - case 0x1b:sprintf(s, "tcs ");break; - case 0x1c:sprintf(s, "trb $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0x1d:sprintf(s, "ora $%0.4x,x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRX, (op0|op1<<8)));break; - case 0x1e:sprintf(s, "asl $%0.4x,x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRX, (op0|op1<<8)));break; - case 0x1f:sprintf(s, "ora $%0.6x,x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONGX, (op0|op1<<8|op2<<16)));break; - case 0x20:sprintf(s, "jsr $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR_PC, (op0|op1<<8)));break; - case 0x21:sprintf(s, "and ($%0.2x,x) [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDPX, op0));break; - case 0x22:sprintf(s, "jsl $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONG, (op0|op1<<8|op2<<16)));break; - case 0x23:sprintf(s, "and $%0.2x,s [$%0.6x]", op0, gx816->convert_offset(MEMMODE_SR, op0));break; - case 0x24:sprintf(s, "bit $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0x25:sprintf(s, "and $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0x26:sprintf(s, "rol $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0x27:sprintf(s, "and [$%0.2x] [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ILDP, op0));break; - case 0x28:sprintf(s, "plp ");break; - case 0x29: - if(gx816->regs.e == true || (gx816->regs.e == false && (gx816->regs.p & 0x20)))sprintf(s, "and #$%0.2x ", op0); - else sprintf(s, "and #$%0.4x ", op0|op1<<8);break; - case 0x2a:sprintf(s, "rol a ");break; - case 0x2b:sprintf(s, "pld ");break; - case 0x2c:sprintf(s, "bit $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0x2d:sprintf(s, "and $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0x2e:sprintf(s, "rol $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0x2f:sprintf(s, "and $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONG, (op0|op1<<8|op2<<16)));break; - case 0x30:sprintf(s, "bmi $%0.4x [$%0.6x]", _disas_relb(op0)&0xffff, _disas_relb(op0)&0xffffff);break; - case 0x31:sprintf(s, "and ($%0.2x),y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDPY, op0));break; - case 0x32:sprintf(s, "and ($%0.2x) [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDP, op0));break; - case 0x33:sprintf(s, "and ($%0.2x,s),y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ISRY, op0));break; - case 0x34:sprintf(s, "bit $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0x35:sprintf(s, "and $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0x36:sprintf(s, "rol $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0x37:sprintf(s, "and [$%0.2x],y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ILDPY, op0));break; - case 0x38:sprintf(s, "sec ");break; - case 0x39:sprintf(s, "and $%0.4x,y [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRY, (op0|op1<<8)));break; - case 0x3a:sprintf(s, "dec ");break; - case 0x3b:sprintf(s, "tsc ");break; - case 0x3c:sprintf(s, "bit $%0.4x,x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRX, (op0|op1<<8)));break; - case 0x3d:sprintf(s, "and $%0.4x,x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRX, (op0|op1<<8)));break; - case 0x3e:sprintf(s, "rol $%0.4x,x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRX, (op0|op1<<8)));break; - case 0x3f:sprintf(s, "and $%0.6x,x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONGX, (op0|op1<<8|op2<<16)));break; - case 0x40:sprintf(s, "rti ");break; - case 0x41:sprintf(s, "eor ($%0.2x,x) [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDPX, op0));break; - case 0x42:sprintf(s, "wdm ");break; - case 0x43:sprintf(s, "eor $%0.2x,s [$%0.6x]", op0, gx816->convert_offset(MEMMODE_SR, op0));break; - case 0x44:sprintf(s, "mvp $%0.2x,$%0.2x ", op1, op0);break; - case 0x45:sprintf(s, "eor $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0x46:sprintf(s, "lsr $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0x47:sprintf(s, "eor [$%0.2x] [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ILDP, op0));break; - case 0x48:sprintf(s, "pha ");break; - case 0x49: - if(gx816->regs.e == true || (gx816->regs.e == false && (gx816->regs.p & 0x20)))sprintf(s, "eor #$%0.2x ", op0); - else sprintf(s, "eor #$%0.4x ", op0|op1<<8);break; - case 0x4a:sprintf(s, "lsr a ");break; - case 0x4b:sprintf(s, "phk ");break; - case 0x4c:sprintf(s, "jmp $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR_PC, (op0|op1<<8)));break; - case 0x4d:sprintf(s, "eor $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0x4e:sprintf(s, "lsr $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0x4f:sprintf(s, "eor $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONG, (op0|op1<<8|op2<<16)));break; - case 0x50:sprintf(s, "bvc $%0.4x [$%0.6x]", _disas_relb(op0)&0xffff, _disas_relb(op0)&0xffffff);break; - case 0x51:sprintf(s, "eor ($%0.2x),y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDPY, op0));break; - case 0x52:sprintf(s, "eor ($%0.2x) [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDP, op0));break; - case 0x53:sprintf(s, "eor ($%0.2x,s),y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ISRY, op0));break; - case 0x54:sprintf(s, "mvn $%0.2x,$%0.2x ", op1, op0);break; - case 0x55:sprintf(s, "eor $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0x56:sprintf(s, "lsr $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0x57:sprintf(s, "eor [$%0.2x],y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ILDPY, op0));break; - case 0x58:sprintf(s, "cli ");break; - case 0x59:sprintf(s, "eor $%0.4x,y [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRY, (op0|op1<<8)));break; - case 0x5a:sprintf(s, "phy ");break; - case 0x5b:sprintf(s, "tcd ");break; - case 0x5c:sprintf(s, "jml $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONG, (op0|op1<<8|op2<<16)));break; - case 0x5d:sprintf(s, "eor $%0.4x,x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRX, (op0|op1<<8)));break; - case 0x5e:sprintf(s, "lsr $%0.4x,x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRX, (op0|op1<<8)));break; - case 0x5f:sprintf(s, "eor $%0.6x,x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONGX, (op0|op1<<8|op2<<16)));break; - case 0x60:sprintf(s, "rts ");break; - case 0x61:sprintf(s, "adc ($%0.2x,x) [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDPX, op0));break; - case 0x62:sprintf(s, "per $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0x63:sprintf(s, "adc $%0.2x,s [$%0.6x]", op0, gx816->convert_offset(MEMMODE_SR, op0));break; - case 0x64:sprintf(s, "stz $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0x65:sprintf(s, "adc $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0x66:sprintf(s, "ror $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0x67:sprintf(s, "adc [$%0.2x] [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ILDP, op0));break; - case 0x68:sprintf(s, "pla ");break; - case 0x69: - if(gx816->regs.e == true || (gx816->regs.e == false && (gx816->regs.p & 0x20)))sprintf(s, "adc #$%0.2x ", op0); - else sprintf(s, "adc #$%0.4x ", op0|op1<<8);break; - case 0x6a:sprintf(s, "ror a ");break; - case 0x6b:sprintf(s, "rtl ");break; - case 0x6c:sprintf(s, "jmp ($%0.4x) [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_IADDR_PC, (op0|op1<<8)));break; - case 0x6d:sprintf(s, "adc $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0x6e:sprintf(s, "ror $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0x6f:sprintf(s, "adc $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONG, (op0|op1<<8|op2<<16)));break; - case 0x70:sprintf(s, "bvs $%0.4x [$%0.6x]", _disas_relb(op0)&0xffff, _disas_relb(op0)&0xffffff);break; - case 0x71:sprintf(s, "adc ($%0.2x),y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDPY, op0));break; - case 0x72:sprintf(s, "adc ($%0.2x) [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDP, op0));break; - case 0x73:sprintf(s, "adc ($%0.2x,s),y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ISRY, op0));break; - case 0x74:sprintf(s, "stz $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0x75:sprintf(s, "adc $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0x76:sprintf(s, "ror $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0x77:sprintf(s, "adc [$%0.2x],y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ILDPY, op0));break; - case 0x78:sprintf(s, "sei ");break; - case 0x79:sprintf(s, "adc $%0.4x,y [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRY, (op0|op1<<8)));break; - case 0x7a:sprintf(s, "ply ");break; - case 0x7b:sprintf(s, "tdc ");break; - case 0x7c:sprintf(s, "jmp ($%0.4x,x) [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_IADDRX_PC, (op0|op1<<8)));break; - case 0x7d:sprintf(s, "adc $%0.4x,x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRX, (op0|op1<<8)));break; - case 0x7e:sprintf(s, "ror $%0.4x,x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRX, (op0|op1<<8)));break; - case 0x7f:sprintf(s, "adc $%0.6x,x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONGX, (op0|op1<<8|op2<<16)));break; - case 0x80:sprintf(s, "bra $%0.4x [$%0.6x]", _disas_relb(op0)&0xffff, _disas_relb(op0)&0xffffff);break; - case 0x81:sprintf(s, "sta ($%0.2x,x) [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDPX, op0));break; - case 0x82:sprintf(s, "brl $%0.4x [$%0.6x]", _disas_relw(op0|op1<<8)&0xffff, _disas_relw(op0|op1<<8)&0xffffff);break; - case 0x83:sprintf(s, "sta $%0.2x,s [$%0.6x]", op0, gx816->convert_offset(MEMMODE_SR, op0));break; - case 0x84:sprintf(s, "sty $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0x85:sprintf(s, "sta $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0x86:sprintf(s, "stx $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0x87:sprintf(s, "sta [$%0.2x] [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ILDP, op0));break; - case 0x88:sprintf(s, "dey ");break; - case 0x89: - if(gx816->regs.e == true || (gx816->regs.e == false && (gx816->regs.p & 0x20)))sprintf(s, "bit #$%0.2x ", op0); - else sprintf(s, "bit #$%0.4x ", op0|op1<<8);break; - case 0x8a:sprintf(s, "txa ");break; - case 0x8b:sprintf(s, "phb ");break; - case 0x8c:sprintf(s, "sty $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0x8d:sprintf(s, "sta $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0x8e:sprintf(s, "stx $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0x8f:sprintf(s, "sta $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONG, (op0|op1<<8|op2<<16)));break; - case 0x90:sprintf(s, "bcc $%0.4x [$%0.6x]", _disas_relb(op0)&0xffff, _disas_relb(op0)&0xffffff);break; - case 0x91:sprintf(s, "sta ($%0.2x),y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDPY, op0));break; - case 0x92:sprintf(s, "sta ($%0.2x) [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDP, op0));break; - case 0x93:sprintf(s, "sta ($%0.2x,s),y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ISRY, op0));break; - case 0x94:sprintf(s, "sty $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0x95:sprintf(s, "sta $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0x96:sprintf(s, "stx $%0.2x,y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPY, op0));break; - case 0x97:sprintf(s, "sta [$%0.2x],y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ILDPY, op0));break; - case 0x98:sprintf(s, "tya ");break; - case 0x99:sprintf(s, "sta $%0.4x,y [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRY, (op0|op1<<8)));break; - case 0x9a:sprintf(s, "txs ");break; - case 0x9b:sprintf(s, "txy ");break; - case 0x9c:sprintf(s, "stz $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0x9d:sprintf(s, "sta $%0.4x,x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRX, (op0|op1<<8)));break; - case 0x9e:sprintf(s, "stz $%0.4x,x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRX, (op0|op1<<8)));break; - case 0x9f:sprintf(s, "sta $%0.6x,x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONGX, (op0|op1<<8|op2<<16)));break; - case 0xa0: - if(gx816->regs.e == true || (gx816->regs.e == false && (gx816->regs.p & PF_X)))sprintf(s, "ldy #$%0.2x ", op0); - else sprintf(s, "ldy #$%0.4x ", op0|op1<<8);break; - case 0xa1:sprintf(s, "lda ($%0.2x,x) [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDPX, op0));break; - case 0xa2: - if(gx816->regs.e == true || (gx816->regs.e == false && (gx816->regs.p & PF_X)))sprintf(s, "ldx #$%0.2x ", op0); - else sprintf(s, "ldx #$%0.4x ", op0|op1<<8);break; - case 0xa3:sprintf(s, "lda $%0.2x,s [$%0.6x]", op0, gx816->convert_offset(MEMMODE_SR, op0));break; - case 0xa4:sprintf(s, "ldy $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0xa5:sprintf(s, "lda $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0xa6:sprintf(s, "ldx $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0xa7:sprintf(s, "lda [$%0.2x] [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ILDP, op0));break; - case 0xa8:sprintf(s, "tay ");break; - case 0xa9: - if(gx816->regs.e == true || (gx816->regs.e == false && (gx816->regs.p & 0x20)))sprintf(s, "lda #$%0.2x ", op0); - else sprintf(s, "lda #$%0.4x ", op0|op1<<8);break; - case 0xaa:sprintf(s, "tax ");break; - case 0xab:sprintf(s, "plb ");break; - case 0xac:sprintf(s, "ldy $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0xad:sprintf(s, "lda $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0xae:sprintf(s, "ldx $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0xaf:sprintf(s, "lda $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONG, (op0|op1<<8|op2<<16)));break; - case 0xb0:sprintf(s, "bcs $%0.4x [$%0.6x]", _disas_relb(op0)&0xffff, _disas_relb(op0)&0xffffff);break; - case 0xb1:sprintf(s, "lda ($%0.2x),y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDPY, op0));break; - case 0xb2:sprintf(s, "lda ($%0.2x) [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDP, op0));break; - case 0xb3:sprintf(s, "lda ($%0.2x,s),y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ISRY, op0));break; - case 0xb4:sprintf(s, "ldy $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0xb5:sprintf(s, "lda $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0xb6:sprintf(s, "ldx $%0.2x,y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPY, op0));break; - case 0xb7:sprintf(s, "lda [$%0.2x],y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ILDPY, op0));break; - case 0xb8:sprintf(s, "clv ");break; - case 0xb9:sprintf(s, "lda $%0.4x,y [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRY, (op0|op1<<8)));break; - case 0xba:sprintf(s, "tsx ");break; - case 0xbb:sprintf(s, "tyx ");break; - case 0xbc:sprintf(s, "ldy $%0.4x,x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRX, (op0|op1<<8)));break; - case 0xbd:sprintf(s, "lda $%0.4x,x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRX, (op0|op1<<8)));break; - case 0xbe:sprintf(s, "ldx $%0.4x,y [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRY, (op0|op1<<8)));break; - case 0xbf:sprintf(s, "lda $%0.6x,x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONGX, (op0|op1<<8|op2<<16)));break; - case 0xc0: - if(gx816->regs.e == true || (gx816->regs.e == false && (gx816->regs.p & PF_X)))sprintf(s, "cpy #$%0.2x ", op0); - else sprintf(s, "cpy #$%0.4x ", op0|op1<<8);break; - case 0xc1:sprintf(s, "cmp ($%0.2x,x) [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDPX, op0));break; - case 0xc2:sprintf(s, "rep #$%0.2x ", op0);break; - case 0xc3:sprintf(s, "cmp $%0.2x,s [$%0.6x]", op0, gx816->convert_offset(MEMMODE_SR, op0));break; - case 0xc4:sprintf(s, "cpy $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0xc5:sprintf(s, "cmp $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0xc6:sprintf(s, "dec $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0xc7:sprintf(s, "cmp [$%0.2x] [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ILDP, op0));break; - case 0xc8:sprintf(s, "iny ");break; - case 0xc9: - if(gx816->regs.e == true || (gx816->regs.e == false && (gx816->regs.p & 0x20)))sprintf(s, "cmp #$%0.2x ", op0); - else sprintf(s, "cmp #$%0.4x ", op0|op1<<8);break; - case 0xca:sprintf(s, "dex ");break; - case 0xcb:sprintf(s, "wai ");break; - case 0xcc:sprintf(s, "cpy $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0xcd:sprintf(s, "cmp $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0xce:sprintf(s, "dec $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0xcf:sprintf(s, "cmp $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONG, (op0|op1<<8|op2<<16)));break; - case 0xd0:sprintf(s, "bne $%0.4x [$%0.6x]", _disas_relb(op0)&0xffff, _disas_relb(op0)&0xffffff);break; - case 0xd1:sprintf(s, "cmp ($%0.2x),y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDPY, op0));break; - case 0xd2:sprintf(s, "cmp ($%0.2x) [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDP, op0));break; - case 0xd3:sprintf(s, "cmp ($%0.2x,s),y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ISRY, op0));break; - case 0xd4:sprintf(s, "pei ($%0.2x) [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDP, op0));break; - case 0xd5:sprintf(s, "cmp $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0xd6:sprintf(s, "dec $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0xd7:sprintf(s, "cmp [$%0.2x],y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ILDPY, op0));break; - case 0xd8:sprintf(s, "cld ");break; - case 0xd9:sprintf(s, "cmp $%0.4x,y [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRY, (op0|op1<<8)));break; - case 0xda:sprintf(s, "phx ");break; - case 0xdb:sprintf(s, "stp ");break; - case 0xdc:sprintf(s, "jmp [$%0.4x] [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ILADDR_PC, (op0|op1<<8)));break; - case 0xdd:sprintf(s, "cmp $%0.4x,x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRX, (op0|op1<<8)));break; - case 0xde:sprintf(s, "dec $%0.4x,x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRX, (op0|op1<<8)));break; - case 0xdf:sprintf(s, "cmp $%0.6x,x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONGX, (op0|op1<<8|op2<<16)));break; - case 0xe0: - if(gx816->regs.e == true || (gx816->regs.e == false && (gx816->regs.p & PF_X)))sprintf(s, "cpx #$%0.2x ", op0); - else sprintf(s, "cpx #$%0.4x ", op0|op1<<8);break; - case 0xe1:sprintf(s, "sbc ($%0.2x,x) [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDPX, op0));break; - case 0xe2:sprintf(s, "sep #$%0.2x ", op0);break; - case 0xe3:sprintf(s, "sbc $%0.2x,s [$%0.6x]", op0, gx816->convert_offset(MEMMODE_SR, op0));break; - case 0xe4:sprintf(s, "cpx $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0xe5:sprintf(s, "sbc $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0xe6:sprintf(s, "inc $%0.2x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DP, op0));break; - case 0xe7:sprintf(s, "sbc [$%0.2x] [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ILDP, op0));break; - case 0xe8:sprintf(s, "inx ");break; - case 0xe9: - if(gx816->regs.e == true || (gx816->regs.e == false && (gx816->regs.p & 0x20)))sprintf(s, "sbc #$%0.2x ", op0); - else sprintf(s, "sbc #$%0.4x ", op0|op1<<8);break; - case 0xea:sprintf(s, "nop ");break; - case 0xeb:sprintf(s, "xba ");break; - case 0xec:sprintf(s, "cpx $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0xed:sprintf(s, "sbc $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0xee:sprintf(s, "inc $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0xef:sprintf(s, "sbc $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONG, (op0|op1<<8|op2<<16)));break; - case 0xf0:sprintf(s, "beq $%0.4x [$%0.6x]", _disas_relb(op0)&0xffff, _disas_relb(op0)&0xffffff);break; - case 0xf1:sprintf(s, "sbc ($%0.2x),y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDPY, op0));break; - case 0xf2:sprintf(s, "sbc ($%0.2x) [$%0.6x]", op0, gx816->convert_offset(MEMMODE_IDP, op0));break; - case 0xf3:sprintf(s, "sbc ($%0.2x,s),y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ISRY, op0));break; - case 0xf4:sprintf(s, "pea $%0.4x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDR, (op0|op1<<8)));break; - case 0xf5:sprintf(s, "sbc $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0xf6:sprintf(s, "inc $%0.2x,x [$%0.6x]", op0, gx816->convert_offset(MEMMODE_DPX, op0));break; - case 0xf7:sprintf(s, "sbc [$%0.2x],y [$%0.6x]", op0, gx816->convert_offset(MEMMODE_ILDPY, op0));break; - case 0xf8:sprintf(s, "sed ");break; - case 0xf9:sprintf(s, "sbc $%0.4x,y [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRY, (op0|op1<<8)));break; - case 0xfa:sprintf(s, "plx ");break; - case 0xfb:sprintf(s, "xce ");break; - case 0xfc:sprintf(s, "jsr ($%0.4x,x) [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_IADDRX_PC, (op0|op1<<8)));break; - case 0xfd:sprintf(s, "sbc $%0.4x,x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRX, (op0|op1<<8)));break; - case 0xfe:sprintf(s, "inc $%0.4x,x [$%0.6x]", op0|op1<<8, gx816->convert_offset(MEMMODE_ADDRX, (op0|op1<<8)));break; - case 0xff:sprintf(s, "sbc $%0.6x,x [$%0.6x]", op0|op1<<8|op2<<16, gx816->convert_offset(MEMMODE_LONGX, (op0|op1<<8|op2<<16)));break; - } -} - -void disas_g65816_op(void) { -byte op, op0, op1, op2; -char str0[256], str1[256], str2[256]; - if(debug_write_status() == DEBUGWRITE_NONE)return; - - op = gx816->mem_read(MEMMODE_NONE, MEMSIZE_BYTE, gx816->regs.pc, MEMACCESS_DEBUGGER); - op0 = gx816->mem_read(MEMMODE_NONE, MEMSIZE_BYTE, gx816->regs.pc + 1, MEMACCESS_DEBUGGER); - op1 = gx816->mem_read(MEMMODE_NONE, MEMSIZE_BYTE, gx816->regs.pc + 2, MEMACCESS_DEBUGGER); - op2 = gx816->mem_read(MEMMODE_NONE, MEMSIZE_BYTE, gx816->regs.pc + 3, MEMACCESS_DEBUGGER); - - strcpy(__disas_op_str, "??? "); - __disas_op(op, op0, op1, op2); - - if(gx816->regs.e == true) { - sprintf(str1, "%c%c%c%c%c%c%c%c E", - (gx816->regs.p & 0x80)?'N':'n', - (gx816->regs.p & 0x40)?'V':'v', - (gx816->regs.p & 0x20)?'1':'0', - (gx816->regs.p & 0x10)?'B':'b', - (gx816->regs.p & 0x08)?'D':'d', - (gx816->regs.p & 0x04)?'I':'i', - (gx816->regs.p & 0x02)?'Z':'z', - (gx816->regs.p & 0x01)?'C':'c'); - } else { - sprintf(str1, "%c%c%c%c%c%c%c%c N", - (gx816->regs.p & 0x80)?'N':'n', - (gx816->regs.p & 0x40)?'V':'v', - (gx816->regs.p & 0x20)?'M':'m', - (gx816->regs.p & 0x10)?'X':'x', - (gx816->regs.p & 0x08)?'D':'d', - (gx816->regs.p & 0x04)?'I':'i', - (gx816->regs.p & 0x02)?'Z':'z', - (gx816->regs.p & 0x01)?'C':'c'); - } - - dprintf(DEBUGMSG_CPU, "%0.6x %s A:%0.4x X:%0.4x Y:%0.4x S:%0.4x D:%0.4x DB:%0.2x %s", gx816->regs.pc, __disas_op_str, - gx816->regs.a.w, gx816->regs.x, gx816->regs.y, gx816->regs.s, - gx816->regs.d, gx816->regs.db, str1); -} diff --git a/bsnes/cpu/g65816.cpp b/bsnes/cpu/g65816.cpp deleted file mode 100644 index 99f95e55..00000000 --- a/bsnes/cpu/g65816.cpp +++ /dev/null @@ -1,240 +0,0 @@ -#include "../base.h" -#include "../timing/timing.h" -#include "g65816.h" - -extern emustate emu_state; -extern debugstate debugger; -extern ppustate ppu; -extern snes_timer *snes_time; -g65816 *gx816; - -#include "g65816_ops.cpp" - -void g65816::LoadROM(void) { -FILE *fp; -ulong fsize; -word header_offset = 0; -word cksum, icksum; -byte t; -int i; - dprintf("* Loading [%s]...", emu_state.rom_name); - - fp = fopen(emu_state.rom_name, "rb"); - if(!fp)return; - - fseek(fp, 0, SEEK_END); - fsize = ftell(fp); - fseek(fp, 0, SEEK_SET); - - map = MEMMAP_LOROM; - - if((fsize & 0x000fff) == 0x000200)header_offset = 512; - - fseek(fp, 0x7fdc + header_offset, SEEK_SET); - cksum = fgetc(fp) | fgetc(fp) << 8; - icksum = fgetc(fp) | fgetc(fp) << 8; - if(cksum + icksum == 0xffff)map = MEMMAP_LOROM; - - fseek(fp, 0xffdc + header_offset, SEEK_SET); - cksum = fgetc(fp) | fgetc(fp) << 8; - icksum = fgetc(fp) | fgetc(fp) << 8; - if(cksum + icksum == 0xffff)map = MEMMAP_HIROM; - - fseek(fp, 0 + header_offset, SEEK_SET); - fsize -= header_offset; - - dprintf("* ROM detected as: %s", (map == MEMMAP_LOROM)?"LoROM":"HiROM"); - - InitializeROM(map); - - fread(rom, 1, fsize, fp); - - t = (mem_read(MEMMODE_NONE, MEMSIZE_BYTE, 0x00ffd8) & 7); - switch(t) { - case 0: sram_size = 0; break; - case 1: sram_size = 2 * 1024;break; - case 2: sram_size = 4 * 1024;break; - case 3: sram_size = 8 * 1024;break; - case 4: sram_size = 16 * 1024;break; - case 5: sram_size = 32 * 1024;break; - case 6: sram_size = 64 * 1024;break; - case 7: sram_size = 128 * 1024;break; - default:sram_size = 0; break; - } - dprintf("* SRAM Size: %dkb", sram_size / 1024); - -//pbr is loaded with 00, and 16-bit pc is loaded with reset vector at 0xfffc -//upon power on and at first reset - regs.pc = mem_read(MEMMODE_LONG, MEMSIZE_WORD, 0x00fffc); - - fclose(fp); - - if(sram_size != 0) { - fp = fopen(emu_state.sram_name, "rb"); - -//create sram file if it does not exist - if(!fp) { - fp = fopen(emu_state.sram_name, "wb"); - for(i=0;imaster_cycles = 0; - memory_speed = MEMSPEED_SLOWROM; - wai_interrupt_occurred = false; - - InitializeWRAM(0x00); - PPUInit(first_time); - UpdateDisplay(); - snes_time->set_speed_map(MEMSPEED_SLOWROM); - cpu_state = CPUSTATE_RUN; -} - -void g65816::Reset(void) { - regs.x &= 0xff; - regs.y &= 0xff; - regs.s = 0x0100 | (regs.s & 0xff); - regs.d = 0x0000; - regs.db = 0x00; - regs.p = 0x34; - regs.e = true; - regs.pc = mem_read(MEMMODE_LONG, MEMSIZE_WORD, 0x00fffc); - snes_time->master_cycles = 0; - memory_speed = MEMSPEED_SLOWROM; - wai_interrupt_occurred = false; - - PPUInit(0); //0 blocks reallocating memory for vram, cgram, etc. - UpdateDisplay(); - snes_time->set_speed_map(MEMSPEED_SLOWROM); - cpu_state = CPUSTATE_RUN; -} - -/*********** - *** IRQ *** - *********** -cycles: - [1] pbr,pc ; io - [2] pbr,pc ; io - [3] 0,s ; pbr - [4] 0,s-1 ; pch - [5] 0,s-2 ; pcl - [6] 0,s-3 ; p - [7] 0,va ; aavl - [8] 0,va+1 ; aavh -*/ - -void g65816::InvokeIRQ(word addr) { - snes_time->add_cpu_icycles(2); //1,2 [i/o] - gx816->stack_write(gx816->regs.pc >> 16); //3 [write pbr] - gx816->stack_write(gx816->regs.pc >> 8); //4 [write pch] - gx816->stack_write(gx816->regs.pc); //5 [write pcl] - gx816->stack_write(gx816->regs.p); //6 [write p] - gx816->op.r.p.l = gx816->op_read(OPMODE_ADDR, addr); //7 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_ADDR, addr + 1); //8 [read high] - - gx816->regs.pc = gx816->op.r.w; - gx816->regs.p |= PF_I; - wai_interrupt_occurred = true; - snes_time->update_timer(); -} - -void g65816::exec_op(void) { -FILE *fp; -byte op; -int i; -static ulong sram_save_tick = 0; - if(cpu_state == CPUSTATE_RUN || cpu_state == CPUSTATE_STP) { - op = mem_read(MEMMODE_NONE, MEMSIZE_BYTE, gx816->regs.pc); - if(regs.e == true)g65816_optbl_e[op](); - else switch((regs.p & 0x30)) { - case 0x30:g65816_optbl_MX[op]();break; - case 0x20:g65816_optbl_Mx[op]();break; - case 0x10:g65816_optbl_mX[op]();break; - case 0x00:g65816_optbl_mx[op]();break; - } - debugger.cpu_op_executed = true; - debugger.disas_cpu_op = true; - snes_time->update_timer(); - } else if(cpu_state == CPUSTATE_DMA) { - ppu_update_dma(); - snes_time->update_timer(); - } - - snes_time->update_timer_events(); - ppu_update_scanline(); - -//see if we need to backup sram to a file yet... - if(sram_size != 0) { - sram_save_tick++; - if(sram_save_tick >= emu_state.sram_save_tick_count) { - sram_save_tick = 0; - fp = fopen(emu_state.sram_name, "wb"); - fwrite(sram, 1, sram_size, fp); - fclose(fp); - } - } - - debug_test_bp(BPSRC_MEM, BP_EXEC, gx816->regs.pc, 0); -} - -void g65816::Run(void) { - if(snes_time->bridge.apu_cycles >= snes_time->bridge.cpu_cycles) { - exec_op(); - } - if(snes_time->bridge.cpu_cycles >= 65536 && snes_time->bridge.apu_cycles >= 65536) { - snes_time->bridge.cpu_cycles &= 65535; - snes_time->bridge.apu_cycles &= 65535; - } -} - -g65816::g65816() { -int i; - rom = (byte*)malloc(0x600000); - wram = (byte*)malloc(0x020000); - sram = (byte*)malloc(0x0e0000); - nmi_enabled = false; - nmi_pin = 0; - - op.dp = op.sp = 0x00; - op.r.l = 0x000000; - op.aa.l = 0x000000; -} - -g65816::~g65816() { - if(rom)free(rom); - if(wram)free(wram); - if(sram)free(sram); -} diff --git a/bsnes/cpu/g65816.h b/bsnes/cpu/g65816.h deleted file mode 100644 index accc6956..00000000 --- a/bsnes/cpu/g65816.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - regs.dc is not a real register. it is used to store the data counter - for reading from / writing to memory locations. it is also needed - to emulate slowrom / fastrom, as the speed varies depending on the - location where the memory was accessed. -*/ - -class g65816 { -public: -//cpu declarations - byte cpu_state; - struct { - ulong pc; - union { - byte b; - word w; - struct { byte l, h; }p; - }a; - word x, y, d, s; - byte db, p; - bool e; - }regs; - struct { - byte dp, sp; - union { - byte b; - word w; - ulong l; - struct { byte l, h, b; }p; - }r; - union { - word w; - ulong l; - struct { byte l, h, b; }p; - }aa; - ulong addr, iaddr; - bool c2, c4; - }op; - byte memory_speed; - - byte nmi_pin; - bool nmi_enabled; - - bool wai_interrupt_occurred; - -//memory declarations - byte *wram, *sram, *rom; - ulong map; - ulong sram_size; - -//cpu functions (cpu/g65816.cpp) - void Run(void); - void LoadROM(void); - void PowerOn(byte first_time); - void Reset(void); - void InvokeIRQ(word addr); - -//memory functions (mem/memory.cpp) - void exec_op(void); - void InitializeROM(byte memory_map); - void InitializeWRAM(byte value); - ulong mirror_offset(ulong offset); - ulong convert_offset(byte read_mode, ulong addr, bool mirror = true); -//ulong adjust_base_offset(byte read_mode, ulong addr); -//ulong read_indirect_address(byte read_mode, ulong addr); -//ulong get_dc(byte read_mode, ulong addr); - - byte mem_getbyte_direct(ulong addr, byte access_mode = MEMACCESS_NORMAL); - byte mem_getbyte(ulong addr, byte access_mode = MEMACCESS_NORMAL); - void mem_putbyte_direct(ulong addr, byte value, byte access_mode = MEMACCESS_NORMAL); - void mem_putbyte(ulong addr, byte value, byte access_mode = MEMACCESS_NORMAL); - ulong mem_read(byte read_mode, byte read_size, ulong addr, byte access_mode = MEMACCESS_NORMAL); - void mem_write(byte write_mode, byte write_size, ulong addr, ulong value, byte access_mode = MEMACCESS_NORMAL); - - ulong read_operand(byte size); - byte op_read(byte mode, ulong addr); - void op_write(byte mode, ulong addr, byte value); - byte stack_read(void); - void stack_write(byte value); - void op_cond(byte c, ulong n0 = 0, ulong n1 = 0); - - ulong rom_read(ulong addr, byte read_size); - void rom_write(ulong addr, ulong v, byte write_size); - - g65816(); - ~g65816(); -}; diff --git a/bsnes/cpu/g65816_ops.cpp b/bsnes/cpu/g65816_ops.cpp deleted file mode 100644 index 211e09a3..00000000 --- a/bsnes/cpu/g65816_ops.cpp +++ /dev/null @@ -1,162 +0,0 @@ -#define g65816_setn() gx816->regs.p |= PF_N -#define g65816_clrn() gx816->regs.p &= ~PF_N -#define g65816_setv() gx816->regs.p |= PF_V -#define g65816_clrv() gx816->regs.p &= ~PF_V -#define g65816_setm() gx816->regs.p |= PF_M -#define g65816_clrm() gx816->regs.p &= ~PF_M -#define g65816_setx() gx816->regs.p |= PF_X -#define g65816_clrx() gx816->regs.p &= ~PF_X -#define g65816_setd() gx816->regs.p |= PF_D -#define g65816_clrd() gx816->regs.p &= ~PF_D -#define g65816_seti() gx816->regs.p |= PF_I -#define g65816_clri() gx816->regs.p &= ~PF_I -#define g65816_setz() gx816->regs.p |= PF_Z -#define g65816_clrz() gx816->regs.p &= ~PF_Z -#define g65816_setc() gx816->regs.p |= PF_C -#define g65816_clrc() gx816->regs.p &= ~PF_C -#define g65816_testn(x) if(x)g65816_setn(); else g65816_clrn() -#define g65816_testv(x) if(x)g65816_setv(); else g65816_clrv() -#define g65816_testd(x) if(x)g65816_setd(); else g65816_clrd() -#define g65816_testi(x) if(x)g65816_seti(); else g65816_clri() -#define g65816_testz(x) if(x)g65816_setz(); else g65816_clrz() -#define g65816_testc(x) if(x)g65816_setc(); else g65816_clrc() - -//increment program counter, wrap around pbr -#define g65816_incpc(__n) gx816->regs.pc = (gx816->regs.pc & 0xff0000) | (word)(gx816->regs.pc + __n) - -/* - vpa = 1, vda = 1 -> add_cpu_pcycles (opcode fetch) - vpa = 1, vda = 0 -> add_cpu_pcycles (operand fetch) - vpa = 0, vda = 1 -> add_cpu_dcycles (memory fetch) - vpa = 0, vda = 0 -> add_cpu_icycles (internal operation) -*/ - -//opcode functions -#include "g65816_ops_adc.cpp" -#include "g65816_ops_and.cpp" -#include "g65816_ops_cmp.cpp" -#include "g65816_ops_eor.cpp" -#include "g65816_ops_lda.cpp" -#include "g65816_ops_ora.cpp" -#include "g65816_ops_sbc.cpp" -#include "g65816_ops_sta.cpp" -#include "g65816_ops_incdec.cpp" -#include "g65816_ops_shift.cpp" -#include "g65816_ops_stack.cpp" -#include "g65816_ops_pc.cpp" -#include "g65816_ops_misc.cpp" - -vfunc g65816_optbl_e[256] = { // g65816_optbl_e, g65816_optbl_e, g65816_optbl_e, - // ----------------------x0, ----------------------x1, ----------------------x2, ----------------------x3, -------- ----------------------x4, ----------------------x5, ----------------------x6, ----------------------x7, -------- ----------------------x8, ----------------------x9, ----------------------xa, ----------------------xb, -------- ----------------------xc, ----------------------xd, ----------------------xe, ----------------------xf, -/* 0x */ g65816_op_brk, g65816_op_ora_idpxb, g65816_op_cop, g65816_op_ora_srb, /* 0x */ g65816_op_tsb_dpb, g65816_op_ora_dpb, g65816_op_asl_dpb, g65816_op_ora_ildpb, /* 0x */ g65816_op_php, g65816_op_ora_constb, g65816_op_aslb, g65816_op_phd, /* 0x */ g65816_op_tsb_addrb, g65816_op_ora_addrb, g65816_op_asl_addrb, g65816_op_ora_longb, -/* 1x */ g65816_op_bpl, g65816_op_ora_idpyb, g65816_op_ora_idpb, g65816_op_ora_isryb, /* 1x */ g65816_op_trb_dpb, g65816_op_ora_dpxb, g65816_op_asl_dpxb, g65816_op_ora_ildpyb, /* 1x */ g65816_op_clc, g65816_op_ora_addryb, g65816_op_incb, g65816_op_tcse, /* 1x */ g65816_op_trb_addrb, g65816_op_ora_addrxb, g65816_op_asl_addrxb, g65816_op_ora_longxb, -/* 2x */ g65816_op_jsr_addr, g65816_op_and_idpxb, g65816_op_jsr_long, g65816_op_and_srb, /* 2x */ g65816_op_bit_dpb, g65816_op_and_dpb, g65816_op_rol_dpb, g65816_op_and_ildpb, /* 2x */ g65816_op_plp, g65816_op_and_constb, g65816_op_rolb, g65816_op_pld, /* 2x */ g65816_op_bit_addrb, g65816_op_and_addrb, g65816_op_rol_addrb, g65816_op_and_longb, -/* 3x */ g65816_op_bmi, g65816_op_and_idpyb, g65816_op_and_idpb, g65816_op_and_isryb, /* 3x */ g65816_op_bit_dpxb, g65816_op_and_dpxb, g65816_op_rol_dpxb, g65816_op_and_ildpyb, /* 3x */ g65816_op_sec, g65816_op_and_addryb, g65816_op_decb, g65816_op_tsce, /* 3x */ g65816_op_bit_addrxb, g65816_op_and_addrxb, g65816_op_rol_addrxb, g65816_op_and_longxb, - -/* 4x */ g65816_op_rtie, g65816_op_eor_idpxb, g65816_op_wdm, g65816_op_eor_srb, /* 4x */ g65816_op_mvp, g65816_op_eor_dpb, g65816_op_lsr_dpb, g65816_op_eor_ildpb, /* 4x */ g65816_op_phab, g65816_op_eor_constb, g65816_op_lsrb, g65816_op_phk, /* 4x */ g65816_op_jmp_addr, g65816_op_eor_addrb, g65816_op_lsr_addrb, g65816_op_eor_longb, -/* 5x */ g65816_op_bvc, g65816_op_eor_idpyb, g65816_op_eor_idpb, g65816_op_eor_isryb, /* 5x */ g65816_op_mvn, g65816_op_eor_dpxb, g65816_op_lsr_dpxb, g65816_op_eor_ildpyb, /* 5x */ g65816_op_cli, g65816_op_eor_addryb, g65816_op_phyb, g65816_op_tcd, /* 5x */ g65816_op_jmp_long, g65816_op_eor_addrxb, g65816_op_lsr_addrxb, g65816_op_eor_longxb, -/* 6x */ g65816_op_rts, g65816_op_adc_idpxb, g65816_op_per, g65816_op_adc_srb, /* 6x */ g65816_op_stz_dpb, g65816_op_adc_dpb, g65816_op_ror_dpb, g65816_op_adc_ildpb, /* 6x */ g65816_op_plab, g65816_op_adc_constb, g65816_op_rorb, g65816_op_rtl, /* 6x */ g65816_op_jmp_iaddr, g65816_op_adc_addrb, g65816_op_ror_addrb, g65816_op_adc_longb, -/* 7x */ g65816_op_bvs, g65816_op_adc_idpyb, g65816_op_adc_idpb, g65816_op_adc_isryb, /* 7x */ g65816_op_stz_dpxb, g65816_op_adc_dpxb, g65816_op_ror_dpxb, g65816_op_adc_ildpyb, /* 7x */ g65816_op_sei, g65816_op_adc_addryb, g65816_op_plyb, g65816_tdc, /* 7x */ g65816_op_jmp_iaddrx, g65816_op_adc_addrxb, g65816_op_ror_addrxb, g65816_op_adc_longxb, - -/* 8x */ g65816_op_bra, g65816_op_sta_idpxb, g65816_op_brl, g65816_op_sta_srb, /* 8x */ g65816_op_sty_dpb, g65816_op_sta_dpb, g65816_op_stx_dpb, g65816_op_sta_ildpb, /* 8x */ g65816_op_deyb, g65816_op_bit_constb, g65816_op_txab, g65816_op_phb, /* 8x */ g65816_op_sty_addrb, g65816_op_sta_addrb, g65816_op_stx_addrb, g65816_op_sta_longb, -/* 9x */ g65816_op_bcc, g65816_op_sta_idpyb, g65816_op_sta_idpb, g65816_op_sta_isryb, /* 9x */ g65816_op_sty_dpxb, g65816_op_sta_dpxb, g65816_op_stx_dpyb, g65816_op_sta_ildpyb, /* 9x */ g65816_op_tyab, g65816_op_sta_addryb, g65816_op_txsb, g65816_op_txyb, /* 9x */ g65816_op_stz_addrb, g65816_op_sta_addrxb, g65816_op_stz_addrxb, g65816_op_sta_longxb, -/* ax */ g65816_op_ldy_constb, g65816_op_lda_idpxb, g65816_op_ldx_constb, g65816_op_lda_srb, /* ax */ g65816_op_ldy_dpb, g65816_op_lda_dpb, g65816_op_ldx_dpb, g65816_op_lda_ildpb, /* ax */ g65816_op_tayb, g65816_op_lda_constb, g65816_op_taxb, g65816_op_plb, /* ax */ g65816_op_ldy_addrb, g65816_op_lda_addrb, g65816_op_ldx_addrb, g65816_op_lda_longb, -/* bx */ g65816_op_bcs, g65816_op_lda_idpyb, g65816_op_lda_idpb, g65816_op_lda_isryb, /* bx */ g65816_op_ldy_dpxb, g65816_op_lda_dpxb, g65816_op_ldx_dpyb, g65816_op_lda_ildpyb, /* bx */ g65816_op_clv, g65816_op_lda_addryb, g65816_op_tsxb, g65816_op_tyxb, /* bx */ g65816_op_ldy_addrxb, g65816_op_lda_addrxb, g65816_op_ldx_addryb, g65816_op_lda_longxb, - -/* cx */ g65816_op_cpy_constb, g65816_op_cmp_idpxb, g65816_op_rep, g65816_op_cmp_srb, /* cx */ g65816_op_cpy_dpb, g65816_op_cmp_dpb, g65816_op_dec_dpb, g65816_op_cmp_ildpb, /* cx */ g65816_op_inyb, g65816_op_cmp_constb, g65816_op_dexb, g65816_op_wai, /* cx */ g65816_op_cpy_addrb, g65816_op_cmp_addrb, g65816_op_dec_addrb, g65816_op_cmp_longb, -/* dx */ g65816_op_bne, g65816_op_cmp_idpyb, g65816_op_cmp_idpb, g65816_op_cmp_isryb, /* dx */ g65816_op_pei, g65816_op_cmp_dpxb, g65816_op_dec_dpxb, g65816_op_cmp_ildpyb, /* dx */ g65816_op_cld, g65816_op_cmp_addryb, g65816_op_phxb, g65816_op_stp, /* dx */ g65816_op_jmp_iladdr, g65816_op_cmp_addrxb, g65816_op_dec_addrxb, g65816_op_cmp_longxb, -/* ex */ g65816_op_cpx_constb, g65816_op_sbc_idpxb, g65816_op_sep, g65816_op_sbc_srb, /* ex */ g65816_op_cpx_dpb, g65816_op_sbc_dpb, g65816_op_inc_dpb, g65816_op_sbc_ildpb, /* ex */ g65816_op_inxb, g65816_op_sbc_constb, g65816_op_nop, g65816_op_xba, /* ex */ g65816_op_cpx_addrb, g65816_op_sbc_addrb, g65816_op_inc_addrb, g65816_op_sbc_longb, -/* fx */ g65816_op_beq, g65816_op_sbc_idpyb, g65816_op_sbc_idpb, g65816_op_sbc_isryb, /* fx */ g65816_op_pea, g65816_op_sbc_dpxb, g65816_op_inc_dpxb, g65816_op_sbc_ildpyb, /* fx */ g65816_op_sed, g65816_op_sbc_addryb, g65816_op_plxb, g65816_op_xce, /* fx */ g65816_op_jsr_iaddrx, g65816_op_sbc_addrxb, g65816_op_inc_addrxb, g65816_op_sbc_longxb -}; - -vfunc g65816_optbl_MX[256] = { // g65816_optbl_MX, g65816_optbl_MX, g65816_optbl_MX, - // ----------------------x0, ----------------------x1, ----------------------x2, ----------------------x3, -------- ----------------------x4, ----------------------x5, ----------------------x6, ----------------------x7, -------- ----------------------x8, ----------------------x9, ----------------------xa, ----------------------xb, -------- ----------------------xc, ----------------------xd, ----------------------xe, ----------------------xf, -/* 0x */ g65816_op_brk, g65816_op_ora_idpxb, g65816_op_cop, g65816_op_ora_srb, /* 0x */ g65816_op_tsb_dpb, g65816_op_ora_dpb, g65816_op_asl_dpb, g65816_op_ora_ildpb, /* 0x */ g65816_op_php, g65816_op_ora_constb, g65816_op_aslb, g65816_op_phd, /* 0x */ g65816_op_tsb_addrb, g65816_op_ora_addrb, g65816_op_asl_addrb, g65816_op_ora_longb, -/* 1x */ g65816_op_bpl, g65816_op_ora_idpyb, g65816_op_ora_idpb, g65816_op_ora_isryb, /* 1x */ g65816_op_trb_dpb, g65816_op_ora_dpxb, g65816_op_asl_dpxb, g65816_op_ora_ildpyb, /* 1x */ g65816_op_clc, g65816_op_ora_addryb, g65816_op_incb, g65816_op_tcsn, /* 1x */ g65816_op_trb_addrb, g65816_op_ora_addrxb, g65816_op_asl_addrxb, g65816_op_ora_longxb, -/* 2x */ g65816_op_jsr_addr, g65816_op_and_idpxb, g65816_op_jsr_long, g65816_op_and_srb, /* 2x */ g65816_op_bit_dpb, g65816_op_and_dpb, g65816_op_rol_dpb, g65816_op_and_ildpb, /* 2x */ g65816_op_plp, g65816_op_and_constb, g65816_op_rolb, g65816_op_pld, /* 2x */ g65816_op_bit_addrb, g65816_op_and_addrb, g65816_op_rol_addrb, g65816_op_and_longb, -/* 3x */ g65816_op_bmi, g65816_op_and_idpyb, g65816_op_and_idpb, g65816_op_and_isryb, /* 3x */ g65816_op_bit_dpxb, g65816_op_and_dpxb, g65816_op_rol_dpxb, g65816_op_and_ildpyb, /* 3x */ g65816_op_sec, g65816_op_and_addryb, g65816_op_decb, g65816_op_tscn, /* 3x */ g65816_op_bit_addrxb, g65816_op_and_addrxb, g65816_op_rol_addrxb, g65816_op_and_longxb, - -/* 4x */ g65816_op_rtin, g65816_op_eor_idpxb, g65816_op_wdm, g65816_op_eor_srb, /* 4x */ g65816_op_mvp, g65816_op_eor_dpb, g65816_op_lsr_dpb, g65816_op_eor_ildpb, /* 4x */ g65816_op_phab, g65816_op_eor_constb, g65816_op_lsrb, g65816_op_phk, /* 4x */ g65816_op_jmp_addr, g65816_op_eor_addrb, g65816_op_lsr_addrb, g65816_op_eor_longb, -/* 5x */ g65816_op_bvc, g65816_op_eor_idpyb, g65816_op_eor_idpb, g65816_op_eor_isryb, /* 5x */ g65816_op_mvn, g65816_op_eor_dpxb, g65816_op_lsr_dpxb, g65816_op_eor_ildpyb, /* 5x */ g65816_op_cli, g65816_op_eor_addryb, g65816_op_phyb, g65816_op_tcd, /* 5x */ g65816_op_jmp_long, g65816_op_eor_addrxb, g65816_op_lsr_addrxb, g65816_op_eor_longxb, -/* 6x */ g65816_op_rts, g65816_op_adc_idpxb, g65816_op_per, g65816_op_adc_srb, /* 6x */ g65816_op_stz_dpb, g65816_op_adc_dpb, g65816_op_ror_dpb, g65816_op_adc_ildpb, /* 6x */ g65816_op_plab, g65816_op_adc_constb, g65816_op_rorb, g65816_op_rtl, /* 6x */ g65816_op_jmp_iaddr, g65816_op_adc_addrb, g65816_op_ror_addrb, g65816_op_adc_longb, -/* 7x */ g65816_op_bvs, g65816_op_adc_idpyb, g65816_op_adc_idpb, g65816_op_adc_isryb, /* 7x */ g65816_op_stz_dpxb, g65816_op_adc_dpxb, g65816_op_ror_dpxb, g65816_op_adc_ildpyb, /* 7x */ g65816_op_sei, g65816_op_adc_addryb, g65816_op_plyb, g65816_tdc, /* 7x */ g65816_op_jmp_iaddrx, g65816_op_adc_addrxb, g65816_op_ror_addrxb, g65816_op_adc_longxb, - -/* 8x */ g65816_op_bra, g65816_op_sta_idpxb, g65816_op_brl, g65816_op_sta_srb, /* 8x */ g65816_op_sty_dpb, g65816_op_sta_dpb, g65816_op_stx_dpb, g65816_op_sta_ildpb, /* 8x */ g65816_op_deyb, g65816_op_bit_constb, g65816_op_txab, g65816_op_phb, /* 8x */ g65816_op_sty_addrb, g65816_op_sta_addrb, g65816_op_stx_addrb, g65816_op_sta_longb, -/* 9x */ g65816_op_bcc, g65816_op_sta_idpyb, g65816_op_sta_idpb, g65816_op_sta_isryb, /* 9x */ g65816_op_sty_dpxb, g65816_op_sta_dpxb, g65816_op_stx_dpyb, g65816_op_sta_ildpyb, /* 9x */ g65816_op_tyab, g65816_op_sta_addryb, g65816_op_txsb, g65816_op_txyb, /* 9x */ g65816_op_stz_addrb, g65816_op_sta_addrxb, g65816_op_stz_addrxb, g65816_op_sta_longxb, -/* ax */ g65816_op_ldy_constb, g65816_op_lda_idpxb, g65816_op_ldx_constb, g65816_op_lda_srb, /* ax */ g65816_op_ldy_dpb, g65816_op_lda_dpb, g65816_op_ldx_dpb, g65816_op_lda_ildpb, /* ax */ g65816_op_tayb, g65816_op_lda_constb, g65816_op_taxb, g65816_op_plb, /* ax */ g65816_op_ldy_addrb, g65816_op_lda_addrb, g65816_op_ldx_addrb, g65816_op_lda_longb, -/* bx */ g65816_op_bcs, g65816_op_lda_idpyb, g65816_op_lda_idpb, g65816_op_lda_isryb, /* bx */ g65816_op_ldy_dpxb, g65816_op_lda_dpxb, g65816_op_ldx_dpyb, g65816_op_lda_ildpyb, /* bx */ g65816_op_clv, g65816_op_lda_addryb, g65816_op_tsxb, g65816_op_tyxb, /* bx */ g65816_op_ldy_addrxb, g65816_op_lda_addrxb, g65816_op_ldx_addryb, g65816_op_lda_longxb, - -/* cx */ g65816_op_cpy_constb, g65816_op_cmp_idpxb, g65816_op_rep, g65816_op_cmp_srb, /* cx */ g65816_op_cpy_dpb, g65816_op_cmp_dpb, g65816_op_dec_dpb, g65816_op_cmp_ildpb, /* cx */ g65816_op_inyb, g65816_op_cmp_constb, g65816_op_dexb, g65816_op_wai, /* cx */ g65816_op_cpy_addrb, g65816_op_cmp_addrb, g65816_op_dec_addrb, g65816_op_cmp_longb, -/* dx */ g65816_op_bne, g65816_op_cmp_idpyb, g65816_op_cmp_idpb, g65816_op_cmp_isryb, /* dx */ g65816_op_pei, g65816_op_cmp_dpxb, g65816_op_dec_dpxb, g65816_op_cmp_ildpyb, /* dx */ g65816_op_cld, g65816_op_cmp_addryb, g65816_op_phxb, g65816_op_stp, /* dx */ g65816_op_jmp_iladdr, g65816_op_cmp_addrxb, g65816_op_dec_addrxb, g65816_op_cmp_longxb, -/* ex */ g65816_op_cpx_constb, g65816_op_sbc_idpxb, g65816_op_sep, g65816_op_sbc_srb, /* ex */ g65816_op_cpx_dpb, g65816_op_sbc_dpb, g65816_op_inc_dpb, g65816_op_sbc_ildpb, /* ex */ g65816_op_inxb, g65816_op_sbc_constb, g65816_op_nop, g65816_op_xba, /* ex */ g65816_op_cpx_addrb, g65816_op_sbc_addrb, g65816_op_inc_addrb, g65816_op_sbc_longb, -/* fx */ g65816_op_beq, g65816_op_sbc_idpyb, g65816_op_sbc_idpb, g65816_op_sbc_isryb, /* fx */ g65816_op_pea, g65816_op_sbc_dpxb, g65816_op_inc_dpxb, g65816_op_sbc_ildpyb, /* fx */ g65816_op_sed, g65816_op_sbc_addryb, g65816_op_plxb, g65816_op_xce, /* fx */ g65816_op_jsr_iaddrx, g65816_op_sbc_addrxb, g65816_op_inc_addrxb, g65816_op_sbc_longxb -}; - -vfunc g65816_optbl_Mx[256] = { // g65816_optbl_Mx, g65816_optbl_Mx, g65816_optbl_Mx, - // ----------------------x0, ----------------------x1, ----------------------x2, ----------------------x3, -------- ----------------------x4, ----------------------x5, ----------------------x6, ----------------------x7, -------- ----------------------x8, ----------------------x9, ----------------------xa, ----------------------xb, -------- ----------------------xc, ----------------------xd, ----------------------xe, ----------------------xf, -/* 0x */ g65816_op_brk, g65816_op_ora_idpxb, g65816_op_cop, g65816_op_ora_srb, /* 0x */ g65816_op_tsb_dpb, g65816_op_ora_dpb, g65816_op_asl_dpb, g65816_op_ora_ildpb, /* 0x */ g65816_op_php, g65816_op_ora_constb, g65816_op_aslb, g65816_op_phd, /* 0x */ g65816_op_tsb_addrb, g65816_op_ora_addrb, g65816_op_asl_addrb, g65816_op_ora_longb, -/* 1x */ g65816_op_bpl, g65816_op_ora_idpyb, g65816_op_ora_idpb, g65816_op_ora_isryb, /* 1x */ g65816_op_trb_dpb, g65816_op_ora_dpxb, g65816_op_asl_dpxb, g65816_op_ora_ildpyb, /* 1x */ g65816_op_clc, g65816_op_ora_addryb, g65816_op_incb, g65816_op_tcsn, /* 1x */ g65816_op_trb_addrb, g65816_op_ora_addrxb, g65816_op_asl_addrxb, g65816_op_ora_longxb, -/* 2x */ g65816_op_jsr_addr, g65816_op_and_idpxb, g65816_op_jsr_long, g65816_op_and_srb, /* 2x */ g65816_op_bit_dpb, g65816_op_and_dpb, g65816_op_rol_dpb, g65816_op_and_ildpb, /* 2x */ g65816_op_plp, g65816_op_and_constb, g65816_op_rolb, g65816_op_pld, /* 2x */ g65816_op_bit_addrb, g65816_op_and_addrb, g65816_op_rol_addrb, g65816_op_and_longb, -/* 3x */ g65816_op_bmi, g65816_op_and_idpyb, g65816_op_and_idpb, g65816_op_and_isryb, /* 3x */ g65816_op_bit_dpxb, g65816_op_and_dpxb, g65816_op_rol_dpxb, g65816_op_and_ildpyb, /* 3x */ g65816_op_sec, g65816_op_and_addryb, g65816_op_decb, g65816_op_tscn, /* 3x */ g65816_op_bit_addrxb, g65816_op_and_addrxb, g65816_op_rol_addrxb, g65816_op_and_longxb, - -/* 4x */ g65816_op_rtin, g65816_op_eor_idpxb, g65816_op_wdm, g65816_op_eor_srb, /* 4x */ g65816_op_mvp, g65816_op_eor_dpb, g65816_op_lsr_dpb, g65816_op_eor_ildpb, /* 4x */ g65816_op_phab, g65816_op_eor_constb, g65816_op_lsrb, g65816_op_phk, /* 4x */ g65816_op_jmp_addr, g65816_op_eor_addrb, g65816_op_lsr_addrb, g65816_op_eor_longb, -/* 5x */ g65816_op_bvc, g65816_op_eor_idpyb, g65816_op_eor_idpb, g65816_op_eor_isryb, /* 5x */ g65816_op_mvn, g65816_op_eor_dpxb, g65816_op_lsr_dpxb, g65816_op_eor_ildpyb, /* 5x */ g65816_op_cli, g65816_op_eor_addryb, g65816_op_phyw, g65816_op_tcd, /* 5x */ g65816_op_jmp_long, g65816_op_eor_addrxb, g65816_op_lsr_addrxb, g65816_op_eor_longxb, -/* 6x */ g65816_op_rts, g65816_op_adc_idpxb, g65816_op_per, g65816_op_adc_srb, /* 6x */ g65816_op_stz_dpb, g65816_op_adc_dpb, g65816_op_ror_dpb, g65816_op_adc_ildpb, /* 6x */ g65816_op_plab, g65816_op_adc_constb, g65816_op_rorb, g65816_op_rtl, /* 6x */ g65816_op_jmp_iaddr, g65816_op_adc_addrb, g65816_op_ror_addrb, g65816_op_adc_longb, -/* 7x */ g65816_op_bvs, g65816_op_adc_idpyb, g65816_op_adc_idpb, g65816_op_adc_isryb, /* 7x */ g65816_op_stz_dpxb, g65816_op_adc_dpxb, g65816_op_ror_dpxb, g65816_op_adc_ildpyb, /* 7x */ g65816_op_sei, g65816_op_adc_addryb, g65816_op_plyw, g65816_tdc, /* 7x */ g65816_op_jmp_iaddrx, g65816_op_adc_addrxb, g65816_op_ror_addrxb, g65816_op_adc_longxb, - -/* 8x */ g65816_op_bra, g65816_op_sta_idpxb, g65816_op_brl, g65816_op_sta_srb, /* 8x */ g65816_op_sty_dpw, g65816_op_sta_dpb, g65816_op_stx_dpw, g65816_op_sta_ildpb, /* 8x */ g65816_op_deyw, g65816_op_bit_constb, g65816_op_txab, g65816_op_phb, /* 8x */ g65816_op_sty_addrw, g65816_op_sta_addrb, g65816_op_stx_addrw, g65816_op_sta_longb, -/* 9x */ g65816_op_bcc, g65816_op_sta_idpyb, g65816_op_sta_idpb, g65816_op_sta_isryb, /* 9x */ g65816_op_sty_dpxw, g65816_op_sta_dpxb, g65816_op_stx_dpyw, g65816_op_sta_ildpyb, /* 9x */ g65816_op_tyab, g65816_op_sta_addryb, g65816_op_txsw, g65816_op_txyw, /* 9x */ g65816_op_stz_addrb, g65816_op_sta_addrxb, g65816_op_stz_addrxb, g65816_op_sta_longxb, -/* ax */ g65816_op_ldy_constw, g65816_op_lda_idpxb, g65816_op_ldx_constw, g65816_op_lda_srb, /* ax */ g65816_op_ldy_dpw, g65816_op_lda_dpb, g65816_op_ldx_dpw, g65816_op_lda_ildpb, /* ax */ g65816_op_tayw, g65816_op_lda_constb, g65816_op_taxw, g65816_op_plb, /* ax */ g65816_op_ldy_addrw, g65816_op_lda_addrb, g65816_op_ldx_addrw, g65816_op_lda_longb, -/* bx */ g65816_op_bcs, g65816_op_lda_idpyb, g65816_op_lda_idpb, g65816_op_lda_isryb, /* bx */ g65816_op_ldy_dpxw, g65816_op_lda_dpxb, g65816_op_ldx_dpyw, g65816_op_lda_ildpyb, /* bx */ g65816_op_clv, g65816_op_lda_addryb, g65816_op_tsxw, g65816_op_tyxw, /* bx */ g65816_op_ldy_addrxw, g65816_op_lda_addrxb, g65816_op_ldx_addryw, g65816_op_lda_longxb, - -/* cx */ g65816_op_cpy_constw, g65816_op_cmp_idpxb, g65816_op_rep, g65816_op_cmp_srb, /* cx */ g65816_op_cpy_dpw, g65816_op_cmp_dpb, g65816_op_dec_dpb, g65816_op_cmp_ildpb, /* cx */ g65816_op_inyw, g65816_op_cmp_constb, g65816_op_dexw, g65816_op_wai, /* cx */ g65816_op_cpy_addrw, g65816_op_cmp_addrb, g65816_op_dec_addrb, g65816_op_cmp_longb, -/* dx */ g65816_op_bne, g65816_op_cmp_idpyb, g65816_op_cmp_idpb, g65816_op_cmp_isryb, /* dx */ g65816_op_pei, g65816_op_cmp_dpxb, g65816_op_dec_dpxb, g65816_op_cmp_ildpyb, /* dx */ g65816_op_cld, g65816_op_cmp_addryb, g65816_op_phxw, g65816_op_stp, /* dx */ g65816_op_jmp_iladdr, g65816_op_cmp_addrxb, g65816_op_dec_addrxb, g65816_op_cmp_longxb, -/* ex */ g65816_op_cpx_constw, g65816_op_sbc_idpxb, g65816_op_sep, g65816_op_sbc_srb, /* ex */ g65816_op_cpx_dpw, g65816_op_sbc_dpb, g65816_op_inc_dpb, g65816_op_sbc_ildpb, /* ex */ g65816_op_inxw, g65816_op_sbc_constb, g65816_op_nop, g65816_op_xba, /* ex */ g65816_op_cpx_addrw, g65816_op_sbc_addrb, g65816_op_inc_addrb, g65816_op_sbc_longb, -/* fx */ g65816_op_beq, g65816_op_sbc_idpyb, g65816_op_sbc_idpb, g65816_op_sbc_isryb, /* fx */ g65816_op_pea, g65816_op_sbc_dpxb, g65816_op_inc_dpxb, g65816_op_sbc_ildpyb, /* fx */ g65816_op_sed, g65816_op_sbc_addryb, g65816_op_plxw, g65816_op_xce, /* fx */ g65816_op_jsr_iaddrx, g65816_op_sbc_addrxb, g65816_op_inc_addrxb, g65816_op_sbc_longxb -}; - -vfunc g65816_optbl_mX[256] = { // g65816_optbl_mX, g65816_optbl_mX, g65816_optbl_mX, - // ----------------------x0, ----------------------x1, ----------------------x2, ----------------------x3, -------- ----------------------x4, ----------------------x5, ----------------------x6, ----------------------x7, -------- ----------------------x8, ----------------------x9, ----------------------xa, ----------------------xb, -------- ----------------------xc, ----------------------xd, ----------------------xe, ----------------------xf, -/* 0x */ g65816_op_brk, g65816_op_ora_idpxw, g65816_op_cop, g65816_op_ora_srw, /* 0x */ g65816_op_tsb_dpw, g65816_op_ora_dpw, g65816_op_asl_dpw, g65816_op_ora_ildpw, /* 0x */ g65816_op_php, g65816_op_ora_constw, g65816_op_aslw, g65816_op_phd, /* 0x */ g65816_op_tsb_addrw, g65816_op_ora_addrw, g65816_op_asl_addrw, g65816_op_ora_longw, -/* 1x */ g65816_op_bpl, g65816_op_ora_idpyw, g65816_op_ora_idpw, g65816_op_ora_isryw, /* 1x */ g65816_op_trb_dpw, g65816_op_ora_dpxw, g65816_op_asl_dpxw, g65816_op_ora_ildpyw, /* 1x */ g65816_op_clc, g65816_op_ora_addryw, g65816_op_incw, g65816_op_tcsn, /* 1x */ g65816_op_trb_addrw, g65816_op_ora_addrxw, g65816_op_asl_addrxw, g65816_op_ora_longxw, -/* 2x */ g65816_op_jsr_addr, g65816_op_and_idpxw, g65816_op_jsr_long, g65816_op_and_srw, /* 2x */ g65816_op_bit_dpw, g65816_op_and_dpw, g65816_op_rol_dpw, g65816_op_and_ildpw, /* 2x */ g65816_op_plp, g65816_op_and_constw, g65816_op_rolw, g65816_op_pld, /* 2x */ g65816_op_bit_addrw, g65816_op_and_addrw, g65816_op_rol_addrw, g65816_op_and_longw, -/* 3x */ g65816_op_bmi, g65816_op_and_idpyw, g65816_op_and_idpw, g65816_op_and_isryw, /* 3x */ g65816_op_bit_dpxw, g65816_op_and_dpxw, g65816_op_rol_dpxw, g65816_op_and_ildpyw, /* 3x */ g65816_op_sec, g65816_op_and_addryw, g65816_op_decw, g65816_op_tscn, /* 3x */ g65816_op_bit_addrxw, g65816_op_and_addrxw, g65816_op_rol_addrxw, g65816_op_and_longxw, - -/* 4x */ g65816_op_rtin, g65816_op_eor_idpxw, g65816_op_wdm, g65816_op_eor_srw, /* 4x */ g65816_op_mvp, g65816_op_eor_dpw, g65816_op_lsr_dpw, g65816_op_eor_ildpw, /* 4x */ g65816_op_phaw, g65816_op_eor_constw, g65816_op_lsrw, g65816_op_phk, /* 4x */ g65816_op_jmp_addr, g65816_op_eor_addrw, g65816_op_lsr_addrw, g65816_op_eor_longw, -/* 5x */ g65816_op_bvc, g65816_op_eor_idpyw, g65816_op_eor_idpw, g65816_op_eor_isryw, /* 5x */ g65816_op_mvn, g65816_op_eor_dpxw, g65816_op_lsr_dpxw, g65816_op_eor_ildpyw, /* 5x */ g65816_op_cli, g65816_op_eor_addryw, g65816_op_phyb, g65816_op_tcd, /* 5x */ g65816_op_jmp_long, g65816_op_eor_addrxw, g65816_op_lsr_addrxw, g65816_op_eor_longxw, -/* 6x */ g65816_op_rts, g65816_op_adc_idpxw, g65816_op_per, g65816_op_adc_srw, /* 6x */ g65816_op_stz_dpw, g65816_op_adc_dpw, g65816_op_ror_dpw, g65816_op_adc_ildpw, /* 6x */ g65816_op_plaw, g65816_op_adc_constw, g65816_op_rorw, g65816_op_rtl, /* 6x */ g65816_op_jmp_iaddr, g65816_op_adc_addrw, g65816_op_ror_addrw, g65816_op_adc_longw, -/* 7x */ g65816_op_bvs, g65816_op_adc_idpyw, g65816_op_adc_idpw, g65816_op_adc_isryw, /* 7x */ g65816_op_stz_dpxw, g65816_op_adc_dpxw, g65816_op_ror_dpxw, g65816_op_adc_ildpyw, /* 7x */ g65816_op_sei, g65816_op_adc_addryw, g65816_op_plyb, g65816_tdc, /* 7x */ g65816_op_jmp_iaddrx, g65816_op_adc_addrxw, g65816_op_ror_addrxw, g65816_op_adc_longxw, - -/* 8x */ g65816_op_bra, g65816_op_sta_idpxw, g65816_op_brl, g65816_op_sta_srw, /* 8x */ g65816_op_sty_dpb, g65816_op_sta_dpw, g65816_op_stx_dpb, g65816_op_sta_ildpw, /* 8x */ g65816_op_deyb, g65816_op_bit_constw, g65816_op_txaw, g65816_op_phb, /* 8x */ g65816_op_sty_addrb, g65816_op_sta_addrw, g65816_op_stx_addrb, g65816_op_sta_longw, -/* 9x */ g65816_op_bcc, g65816_op_sta_idpyw, g65816_op_sta_idpw, g65816_op_sta_isryw, /* 9x */ g65816_op_sty_dpxb, g65816_op_sta_dpxw, g65816_op_stx_dpyb, g65816_op_sta_ildpyw, /* 9x */ g65816_op_tyaw, g65816_op_sta_addryw, g65816_op_txsb, g65816_op_txyb, /* 9x */ g65816_op_stz_addrw, g65816_op_sta_addrxw, g65816_op_stz_addrxw, g65816_op_sta_longxw, -/* ax */ g65816_op_ldy_constb, g65816_op_lda_idpxw, g65816_op_ldx_constb, g65816_op_lda_srw, /* ax */ g65816_op_ldy_dpb, g65816_op_lda_dpw, g65816_op_ldx_dpb, g65816_op_lda_ildpw, /* ax */ g65816_op_tayb, g65816_op_lda_constw, g65816_op_taxb, g65816_op_plb, /* ax */ g65816_op_ldy_addrb, g65816_op_lda_addrw, g65816_op_ldx_addrb, g65816_op_lda_longw, -/* bx */ g65816_op_bcs, g65816_op_lda_idpyw, g65816_op_lda_idpw, g65816_op_lda_isryw, /* bx */ g65816_op_ldy_dpxb, g65816_op_lda_dpxw, g65816_op_ldx_dpyb, g65816_op_lda_ildpyw, /* bx */ g65816_op_clv, g65816_op_lda_addryw, g65816_op_tsxb, g65816_op_tyxb, /* bx */ g65816_op_ldy_addrxb, g65816_op_lda_addrxw, g65816_op_ldx_addryb, g65816_op_lda_longxw, - -/* cx */ g65816_op_cpy_constb, g65816_op_cmp_idpxw, g65816_op_rep, g65816_op_cmp_srw, /* cx */ g65816_op_cpy_dpb, g65816_op_cmp_dpw, g65816_op_dec_dpw, g65816_op_cmp_ildpw, /* cx */ g65816_op_inyb, g65816_op_cmp_constw, g65816_op_dexb, g65816_op_wai, /* cx */ g65816_op_cpy_addrb, g65816_op_cmp_addrw, g65816_op_dec_addrw, g65816_op_cmp_longw, -/* dx */ g65816_op_bne, g65816_op_cmp_idpyw, g65816_op_cmp_idpw, g65816_op_cmp_isryw, /* dx */ g65816_op_pei, g65816_op_cmp_dpxw, g65816_op_dec_dpxw, g65816_op_cmp_ildpyw, /* dx */ g65816_op_cld, g65816_op_cmp_addryw, g65816_op_phxb, g65816_op_stp, /* dx */ g65816_op_jmp_iladdr, g65816_op_cmp_addrxw, g65816_op_dec_addrxw, g65816_op_cmp_longxw, -/* ex */ g65816_op_cpx_constb, g65816_op_sbc_idpxw, g65816_op_sep, g65816_op_sbc_srw, /* ex */ g65816_op_cpx_dpb, g65816_op_sbc_dpw, g65816_op_inc_dpw, g65816_op_sbc_ildpw, /* ex */ g65816_op_inxb, g65816_op_sbc_constw, g65816_op_nop, g65816_op_xba, /* ex */ g65816_op_cpx_addrb, g65816_op_sbc_addrw, g65816_op_inc_addrw, g65816_op_sbc_longw, -/* fx */ g65816_op_beq, g65816_op_sbc_idpyw, g65816_op_sbc_idpw, g65816_op_sbc_isryw, /* fx */ g65816_op_pea, g65816_op_sbc_dpxw, g65816_op_inc_dpxw, g65816_op_sbc_ildpyw, /* fx */ g65816_op_sed, g65816_op_sbc_addryw, g65816_op_plxb, g65816_op_xce, /* fx */ g65816_op_jsr_iaddrx, g65816_op_sbc_addrxw, g65816_op_inc_addrxw, g65816_op_sbc_longxw -}; - -vfunc g65816_optbl_mx[256] = { // g65816_optbl_mx, g65816_optbl_mx, g65816_optbl_mx, - // ----------------------x0, ----------------------x1, ----------------------x2, ----------------------x3, -------- ----------------------x4, ----------------------x5, ----------------------x6, ----------------------x7, -------- ----------------------x8, ----------------------x9, ----------------------xa, ----------------------xb, -------- ----------------------xc, ----------------------xd, ----------------------xe, ----------------------xf, -/* 0x */ g65816_op_brk, g65816_op_ora_idpxw, g65816_op_cop, g65816_op_ora_srw, /* 0x */ g65816_op_tsb_dpw, g65816_op_ora_dpw, g65816_op_asl_dpw, g65816_op_ora_ildpw, /* 0x */ g65816_op_php, g65816_op_ora_constw, g65816_op_aslw, g65816_op_phd, /* 0x */ g65816_op_tsb_addrw, g65816_op_ora_addrw, g65816_op_asl_addrw, g65816_op_ora_longw, -/* 1x */ g65816_op_bpl, g65816_op_ora_idpyw, g65816_op_ora_idpw, g65816_op_ora_isryw, /* 1x */ g65816_op_trb_dpw, g65816_op_ora_dpxw, g65816_op_asl_dpxw, g65816_op_ora_ildpyw, /* 1x */ g65816_op_clc, g65816_op_ora_addryw, g65816_op_incw, g65816_op_tcsn, /* 1x */ g65816_op_trb_addrw, g65816_op_ora_addrxw, g65816_op_asl_addrxw, g65816_op_ora_longxw, -/* 2x */ g65816_op_jsr_addr, g65816_op_and_idpxw, g65816_op_jsr_long, g65816_op_and_srw, /* 2x */ g65816_op_bit_dpw, g65816_op_and_dpw, g65816_op_rol_dpw, g65816_op_and_ildpw, /* 2x */ g65816_op_plp, g65816_op_and_constw, g65816_op_rolw, g65816_op_pld, /* 2x */ g65816_op_bit_addrw, g65816_op_and_addrw, g65816_op_rol_addrw, g65816_op_and_longw, -/* 3x */ g65816_op_bmi, g65816_op_and_idpyw, g65816_op_and_idpw, g65816_op_and_isryw, /* 3x */ g65816_op_bit_dpxw, g65816_op_and_dpxw, g65816_op_rol_dpxw, g65816_op_and_ildpyw, /* 3x */ g65816_op_sec, g65816_op_and_addryw, g65816_op_decw, g65816_op_tscn, /* 3x */ g65816_op_bit_addrxw, g65816_op_and_addrxw, g65816_op_rol_addrxw, g65816_op_and_longxw, - -/* 4x */ g65816_op_rtin, g65816_op_eor_idpxw, g65816_op_wdm, g65816_op_eor_srw, /* 4x */ g65816_op_mvp, g65816_op_eor_dpw, g65816_op_lsr_dpw, g65816_op_eor_ildpw, /* 4x */ g65816_op_phaw, g65816_op_eor_constw, g65816_op_lsrw, g65816_op_phk, /* 4x */ g65816_op_jmp_addr, g65816_op_eor_addrw, g65816_op_lsr_addrw, g65816_op_eor_longw, -/* 5x */ g65816_op_bvc, g65816_op_eor_idpyw, g65816_op_eor_idpw, g65816_op_eor_isryw, /* 5x */ g65816_op_mvn, g65816_op_eor_dpxw, g65816_op_lsr_dpxw, g65816_op_eor_ildpyw, /* 5x */ g65816_op_cli, g65816_op_eor_addryw, g65816_op_phyw, g65816_op_tcd, /* 5x */ g65816_op_jmp_long, g65816_op_eor_addrxw, g65816_op_lsr_addrxw, g65816_op_eor_longxw, -/* 6x */ g65816_op_rts, g65816_op_adc_idpxw, g65816_op_per, g65816_op_adc_srw, /* 6x */ g65816_op_stz_dpw, g65816_op_adc_dpw, g65816_op_ror_dpw, g65816_op_adc_ildpw, /* 6x */ g65816_op_plaw, g65816_op_adc_constw, g65816_op_rorw, g65816_op_rtl, /* 6x */ g65816_op_jmp_iaddr, g65816_op_adc_addrw, g65816_op_ror_addrw, g65816_op_adc_longw, -/* 7x */ g65816_op_bvs, g65816_op_adc_idpyw, g65816_op_adc_idpw, g65816_op_adc_isryw, /* 7x */ g65816_op_stz_dpxw, g65816_op_adc_dpxw, g65816_op_ror_dpxw, g65816_op_adc_ildpyw, /* 7x */ g65816_op_sei, g65816_op_adc_addryw, g65816_op_plyw, g65816_tdc, /* 7x */ g65816_op_jmp_iaddrx, g65816_op_adc_addrxw, g65816_op_ror_addrxw, g65816_op_adc_longxw, - -/* 8x */ g65816_op_bra, g65816_op_sta_idpxw, g65816_op_brl, g65816_op_sta_srw, /* 8x */ g65816_op_sty_dpw, g65816_op_sta_dpw, g65816_op_stx_dpw, g65816_op_sta_ildpw, /* 8x */ g65816_op_deyw, g65816_op_bit_constw, g65816_op_txaw, g65816_op_phb, /* 8x */ g65816_op_sty_addrw, g65816_op_sta_addrw, g65816_op_stx_addrw, g65816_op_sta_longw, -/* 9x */ g65816_op_bcc, g65816_op_sta_idpyw, g65816_op_sta_idpw, g65816_op_sta_isryw, /* 9x */ g65816_op_sty_dpxw, g65816_op_sta_dpxw, g65816_op_stx_dpyw, g65816_op_sta_ildpyw, /* 9x */ g65816_op_tyaw, g65816_op_sta_addryw, g65816_op_txsw, g65816_op_txyw, /* 9x */ g65816_op_stz_addrw, g65816_op_sta_addrxw, g65816_op_stz_addrxw, g65816_op_sta_longxw, -/* ax */ g65816_op_ldy_constw, g65816_op_lda_idpxw, g65816_op_ldx_constw, g65816_op_lda_srw, /* ax */ g65816_op_ldy_dpw, g65816_op_lda_dpw, g65816_op_ldx_dpw, g65816_op_lda_ildpw, /* ax */ g65816_op_tayw, g65816_op_lda_constw, g65816_op_taxw, g65816_op_plb, /* ax */ g65816_op_ldy_addrw, g65816_op_lda_addrw, g65816_op_ldx_addrw, g65816_op_lda_longw, -/* bx */ g65816_op_bcs, g65816_op_lda_idpyw, g65816_op_lda_idpw, g65816_op_lda_isryw, /* bx */ g65816_op_ldy_dpxw, g65816_op_lda_dpxw, g65816_op_ldx_dpyw, g65816_op_lda_ildpyw, /* bx */ g65816_op_clv, g65816_op_lda_addryw, g65816_op_tsxw, g65816_op_tyxw, /* bx */ g65816_op_ldy_addrxw, g65816_op_lda_addrxw, g65816_op_ldx_addryw, g65816_op_lda_longxw, - -/* cx */ g65816_op_cpy_constw, g65816_op_cmp_idpxw, g65816_op_rep, g65816_op_cmp_srw, /* cx */ g65816_op_cpy_dpw, g65816_op_cmp_dpw, g65816_op_dec_dpw, g65816_op_cmp_ildpw, /* cx */ g65816_op_inyw, g65816_op_cmp_constw, g65816_op_dexw, g65816_op_wai, /* cx */ g65816_op_cpy_addrw, g65816_op_cmp_addrw, g65816_op_dec_addrw, g65816_op_cmp_longw, -/* dx */ g65816_op_bne, g65816_op_cmp_idpyw, g65816_op_cmp_idpw, g65816_op_cmp_isryw, /* dx */ g65816_op_pei, g65816_op_cmp_dpxw, g65816_op_dec_dpxw, g65816_op_cmp_ildpyw, /* dx */ g65816_op_cld, g65816_op_cmp_addryw, g65816_op_phxw, g65816_op_stp, /* dx */ g65816_op_jmp_iladdr, g65816_op_cmp_addrxw, g65816_op_dec_addrxw, g65816_op_cmp_longxw, -/* ex */ g65816_op_cpx_constw, g65816_op_sbc_idpxw, g65816_op_sep, g65816_op_sbc_srw, /* ex */ g65816_op_cpx_dpw, g65816_op_sbc_dpw, g65816_op_inc_dpw, g65816_op_sbc_ildpw, /* ex */ g65816_op_inxw, g65816_op_sbc_constw, g65816_op_nop, g65816_op_xba, /* ex */ g65816_op_cpx_addrw, g65816_op_sbc_addrw, g65816_op_inc_addrw, g65816_op_sbc_longw, -/* fx */ g65816_op_beq, g65816_op_sbc_idpyw, g65816_op_sbc_idpw, g65816_op_sbc_isryw, /* fx */ g65816_op_pea, g65816_op_sbc_dpxw, g65816_op_inc_dpxw, g65816_op_sbc_ildpyw, /* fx */ g65816_op_sed, g65816_op_sbc_addryw, g65816_op_plxw, g65816_op_xce, /* fx */ g65816_op_jsr_iaddrx, g65816_op_sbc_addrxw, g65816_op_inc_addrxw, g65816_op_sbc_longxw -}; diff --git a/bsnes/cpu/g65816_ops_adc.cpp b/bsnes/cpu/g65816_ops_adc.cpp deleted file mode 100644 index 5ad972e3..00000000 --- a/bsnes/cpu/g65816_ops_adc.cpp +++ /dev/null @@ -1,526 +0,0 @@ -void g65816_flags_adc_b(void) { -int r = gx816->regs.a.b + gx816->op.r.b + (gx816->regs.p & PF_C); -//bcd - if(gx816->regs.p & PF_D) { - if(((r ) & 15) > 9)r += 6; - if(((r >> 4) & 15) > 9)r += 6 << 4; - } - - g65816_testn(r & 0x80); - g65816_testv(~(gx816->regs.a.b ^ gx816->op.r.b) & (gx816->regs.a.b ^ (byte)r) & 0x80); - g65816_testz((byte)r == 0); - g65816_testc(r > 0xff); - gx816->regs.a.b = r; -} - -void g65816_flags_adc_w(void) { -int r = gx816->regs.a.w + gx816->op.r.w + (gx816->regs.p & PF_C); -//bcd - if(gx816->regs.p & PF_D) { - if(((r ) & 15) > 9)r += 6; - if(((r >> 4) & 15) > 9)r += 6 << 4; - if(((r >> 8) & 15) > 9)r += 6 << 8; - if(((r >> 12) & 15) > 9)r += 6 << 12; - } - - g65816_testn(r & 0x8000); - g65816_testv(~(gx816->regs.a.w ^ gx816->op.r.w) & (gx816->regs.a.w ^ (word)r) & 0x8000); - g65816_testz((word)r == 0); - g65816_testc(r > 0xffff); - gx816->regs.a.w = r; -} - -/************************ - *** 0x69: adc #const *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; idl - [2a] pbr,pc+2 ; idh [1] -*/ - -void g65816_op_adc_constb(void) { - gx816->op.r.b = gx816->read_operand(1); //1,2 [op fetch] - - g65816_flags_adc_b(); - g65816_incpc(2); -} - -void g65816_op_adc_constw(void) { - gx816->op.r.w = gx816->read_operand(2); //1,2,2a [op fetch] - - g65816_flags_adc_w(); - g65816_incpc(3); -} - -/********************** - *** 0x6d: adc addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_adc_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - - g65816_flags_adc_b(); - g65816_incpc(3); -} - -void g65816_op_adc_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - - g65816_flags_adc_w(); - g65816_incpc(3); -} - -/************************ - *** 0x7d: adc addr,x *** - ************************ -cycles: - [1 ] pbr,pc ; operadc - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+xl ; io [4] - [4 ] dbr,aa+x ; data low - [4a] dbr,aa+x+1 ; data high [1] -*/ - -void g65816_op_adc_addrxb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read] - - g65816_flags_adc_b(); - g65816_incpc(3); -} - -void g65816_op_adc_addrxw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1); //4a [read high] - - g65816_flags_adc_w(); - g65816_incpc(3); -} - -/******************** - *** 0x65: adc dp *** - ******************** -cycles: - [1 ] pbr,pc ; operadc - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] -*/ - -void g65816_op_adc_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - - g65816_flags_adc_b(); - g65816_incpc(2); -} - -void g65816_op_adc_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - - g65816_flags_adc_w(); - g65816_incpc(2); -} - -/********************** - *** 0x72: adc (dp) *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] dbr,aa ; data low - [5a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_adc_idpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //5 [read] - - g65816_flags_adc_b(); - g65816_incpc(2); -} - -void g65816_op_adc_idpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //5 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //5a [read high] - - g65816_flags_adc_w(); - g65816_incpc(2); -} - -/********************** - *** 0x67: adc [dp] *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] 0,d+dp+2 ; aab - [6 ] aab,aa ; data low - [6a] aab,aa+1 ; data high [1] -*/ - -void g65816_op_adc_ildpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->op.r.b = gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //6 [read] - - g65816_flags_adc_b(); - g65816_incpc(2); -} - -void g65816_op_adc_ildpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->op.r.p.l = gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //6 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + 1); //6a [read high] - - g65816_flags_adc_w(); - g65816_incpc(2); -} - -/********************** - *** 0x6f: adc long *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] pbr,pc+3 ; aab - [5 ] aab,aa ; data low - [5a] aab,aa+1 ; data high -*/ - -void g65816_op_adc_longb(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //5 [read] - - g65816_flags_adc_b(); - g65816_incpc(4); -} - -void g65816_op_adc_longw(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //5 [read] - gx816->op.r.p.h = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + 1); //5a [read] - - g65816_flags_adc_w(); - g65816_incpc(4); -} - -/************************ - *** 0x7f: adc long,x *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] pbr,pc+3 ; aab - [5 ] aab,aa+x ; data low - [5a] aab,aa+x+1 ; data high -*/ - -void g65816_op_adc_longxb(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x); //5 [read] - - g65816_flags_adc_b(); - g65816_incpc(4); -} - -void g65816_op_adc_longxw(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x); //5 [read] - gx816->op.r.p.h = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x + 1); //5a [read] - - g65816_flags_adc_w(); - g65816_incpc(4); -} - -/************************ - *** 0x79: adc addr,y *** - ************************ -cycles: - [1 ] pbr,pc ; operadc - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+yl ; io [4] - [4 ] dbr,aa+y ; data low - [4a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_adc_addryb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //3a [pbc or p.x=0] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //4 [read] - - g65816_flags_adc_b(); - g65816_incpc(3); -} - -void g65816_op_adc_addryw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //3a [pbc or p.x=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //4a [read high] - - g65816_flags_adc_w(); - g65816_incpc(3); -} - -/********************** - *** 0x75: adc dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high -*/ - -void g65816_op_adc_dpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read] - - g65816_flags_adc_b(); - g65816_incpc(2); -} - -void g65816_op_adc_dpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //4a [read high] - - g65816_flags_adc_w(); - g65816_incpc(2); -} - -/************************ - *** 0x61: adc (dp,x) *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; aal - [5 ] 0,d+dp+x+1 ; aah - [6 ] dbr,aa ; data low - [6a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_adc_idpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //5 [aah] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //6 [read] - - g65816_flags_adc_b(); - g65816_incpc(2); -} - -void g65816_op_adc_idpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //5 [aah] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //6 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //6 [read high] - - g65816_flags_adc_w(); - g65816_incpc(2); -} - -/************************ - *** 0x71: adc (dp),y *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [4a] dbr,aah,aal+yl ; io [4] - [5 ] dbr,aa+y ; data low - [5a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_adc_idpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //4a [pbc or p.x=0] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //5 [read] - - g65816_flags_adc_b(); - g65816_incpc(2); -} - -void g65816_op_adc_idpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //4a [pbc or p.x=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //5 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //5a [read high] - - g65816_flags_adc_w(); - g65816_incpc(2); -} - -/************************ - *** 0x77: adc [dp],y *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] 0,d+dp+2 ; aab - [6 ] aab,aa+y ; data low - [6a] aab,aa+y+1 ; data high [1] -*/ - -void g65816_op_adc_ildpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->op.r.b = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y); //6 [read] - - g65816_flags_adc_b(); - g65816_incpc(2); -} - -void g65816_op_adc_ildpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->op.r.p.l = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y); //6 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y + 1); //6a [read high] - - g65816_flags_adc_w(); - g65816_incpc(2); -} - -/********************** - *** 0x63: adc sr,s *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; sp - [3 ] pbr,pc+1 ; io - [4 ] 0,s+sp ; data low - [4a] 0,s+sp+1 ; data high [1] -*/ - -void g65816_op_adc_srb(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [read] - - g65816_flags_adc_b(); - g65816_incpc(2); -} - -void g65816_op_adc_srw(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //4a [read high] - - g65816_flags_adc_w(); - g65816_incpc(2); -} - -/************************** - *** 0x73: adc (sr,s),y *** - ************************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; sp - [3 ] pbr,pc+1 ; io - [4 ] 0,s+sp ; aal - [5 ] 0,s+sp+1 ; aah - [6 ] 0,s+sp+1 ; io - [7 ] dbr,aa+y ; data low - [7a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_adc_isryb(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //5 [aah] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //7 [read] - - g65816_flags_adc_b(); - g65816_incpc(2); -} - -void g65816_op_adc_isryw(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //5 [aah] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //7 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //7a [read high] - - g65816_flags_adc_w(); - g65816_incpc(2); -} diff --git a/bsnes/cpu/g65816_ops_and.cpp b/bsnes/cpu/g65816_ops_and.cpp deleted file mode 100644 index 90734f0c..00000000 --- a/bsnes/cpu/g65816_ops_and.cpp +++ /dev/null @@ -1,504 +0,0 @@ -void g65816_flags_and_b() { - g65816_testn(gx816->regs.a.b & 0x80); - g65816_testz(gx816->regs.a.b == 0); -} - -void g65816_flags_and_w() { - g65816_testn(gx816->regs.a.w & 0x8000); - g65816_testz(gx816->regs.a.w == 0); -} - -/************************ - *** 0x29: and #const *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; idl - [2a] pbr,pc+2 ; idh [1] -*/ - -void g65816_op_and_constb(void) { - gx816->regs.a.b &= gx816->read_operand(1); //1,2 [op fetch] - - g65816_flags_and_b(); - g65816_incpc(2); -} - -void g65816_op_and_constw(void) { - gx816->regs.a.w &= gx816->read_operand(2); //1,2,2a [op fetch] - - g65816_flags_and_w(); - g65816_incpc(3); -} - -/********************** - *** 0x2d: and addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_and_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->regs.a.b &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - - g65816_flags_and_b(); - g65816_incpc(3); -} - -void g65816_op_and_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->regs.a.p.l &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->regs.a.p.h &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - - g65816_flags_and_w(); - g65816_incpc(3); -} - -/************************ - *** 0x3d: and addr,x *** - ************************ -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+xl ; io [4] - [4 ] dbr,aa+x ; data low - [4a] dbr,aa+x+1 ; data high [1] -*/ - -void g65816_op_and_addrxb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->regs.a.b &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read] - - g65816_flags_and_b(); - g65816_incpc(3); -} - -void g65816_op_and_addrxw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->regs.a.p.l &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read low] - gx816->regs.a.p.h &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1); //4a [read high] - - g65816_flags_and_w(); - g65816_incpc(3); -} - -/******************** - *** 0x25: and dp *** - ******************** -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] -*/ - -void g65816_op_and_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->regs.a.b &= gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - - g65816_flags_and_b(); - g65816_incpc(2); -} - -void g65816_op_and_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->regs.a.p.l &= gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->regs.a.p.h &= gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - - g65816_flags_and_w(); - g65816_incpc(2); -} - -/********************** - *** 0x32: and (dp) *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] dbr,aa ; data low - [5a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_and_idpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->regs.a.b &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //5 [read] - - g65816_flags_and_b(); - g65816_incpc(2); -} - -void g65816_op_and_idpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->regs.a.p.l &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //5 [read low] - gx816->regs.a.p.h &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //5a [read high] - - g65816_flags_and_w(); - g65816_incpc(2); -} - -/********************** - *** 0x27: and [dp] *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] 0,d+dp+2 ; aab - [6 ] aab,aa ; data low - [6a] aab,aa+1 ; data high [1] -*/ - -void g65816_op_and_ildpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->regs.a.b &= gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //6 [read] - - g65816_flags_and_b(); - g65816_incpc(2); -} - -void g65816_op_and_ildpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->regs.a.p.l &= gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //6 [read low] - gx816->regs.a.p.h &= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + 1); //6a [read high] - - g65816_flags_and_w(); - g65816_incpc(2); -} - -/********************** - *** 0x2f: and long *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] pbr,pc+3 ; aab - [5 ] aab,aa ; data low - [5a] aab,aa+1 ; data high -*/ - -void g65816_op_and_longb(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->regs.a.b &= gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //5 [read] - - g65816_flags_and_b(); - g65816_incpc(4); -} - -void g65816_op_and_longw(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->regs.a.p.l &= gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //5 [read] - gx816->regs.a.p.h &= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + 1); //5a [read] - - g65816_flags_and_w(); - g65816_incpc(4); -} - -/************************ - *** 0x3f: and long,x *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] pbr,pc+3 ; aab - [5 ] aab,aa+x ; data low - [5a] aab,aa+x+1 ; data high -*/ - -void g65816_op_and_longxb(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->regs.a.b &= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x); //5 [read] - - g65816_flags_and_b(); - g65816_incpc(4); -} - -void g65816_op_and_longxw(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->regs.a.p.l &= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x); //5 [read] - gx816->regs.a.p.h &= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x + 1); //5a [read] - - g65816_flags_and_w(); - g65816_incpc(4); -} - -/************************ - *** 0x39: and addr,y *** - ************************ -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+yl ; io [4] - [4 ] dbr,aa+y ; data low - [4a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_and_addryb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //3a [pbc or p.x=0] - gx816->regs.a.b &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //4 [read] - - g65816_flags_and_b(); - g65816_incpc(3); -} - -void g65816_op_and_addryw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //3a [pbc or p.x=0] - gx816->regs.a.p.l &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //4 [read low] - gx816->regs.a.p.h &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //4a [read high] - - g65816_flags_and_w(); - g65816_incpc(3); -} - -/********************** - *** 0x35: and dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high -*/ - -void g65816_op_and_dpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.a.b &= gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read] - - g65816_flags_and_b(); - g65816_incpc(2); -} - -void g65816_op_and_dpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.a.p.l &= gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read low] - gx816->regs.a.p.h &= gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //4a [read high] - - g65816_flags_and_w(); - g65816_incpc(2); -} - -/************************ - *** 0x21: and (dp,x) *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; aal - [5 ] 0,d+dp+x+1 ; aah - [6 ] dbr,aa ; data low - [6a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_and_idpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //5 [aah] - gx816->regs.a.b &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //6 [read] - - g65816_flags_and_b(); - g65816_incpc(2); -} - -void g65816_op_and_idpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //5 [aah] - gx816->regs.a.p.l &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //6 [read low] - gx816->regs.a.p.h &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //6 [read high] - - g65816_flags_and_w(); - g65816_incpc(2); -} - -/************************ - *** 0x31: and (dp),y *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [4a] dbr,aah,aal+yl ; io [4] - [5 ] dbr,aa+y ; data low - [5a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_and_idpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //4a [pbc or p.x=0] - gx816->regs.a.b &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //5 [read] - - g65816_flags_and_b(); - g65816_incpc(2); -} - -void g65816_op_and_idpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //4a [pbc or p.x=0] - gx816->regs.a.p.l &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //5 [read low] - gx816->regs.a.p.h &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //5a [read high] - - g65816_flags_and_w(); - g65816_incpc(2); -} - -/************************ - *** 0x37: and [dp],y *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] 0,d+dp+2 ; aab - [6 ] aab,aa+y ; data low - [6a] aab,aa+y+1 ; data high [1] -*/ - -void g65816_op_and_ildpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->regs.a.b &= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y); //6 [read] - - g65816_flags_and_b(); - g65816_incpc(2); -} - -void g65816_op_and_ildpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->regs.a.p.l &= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y); //6 [read low] - gx816->regs.a.p.h &= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y + 1); //6a [read high] - - g65816_flags_and_w(); - g65816_incpc(2); -} - -/********************** - *** 0x23: and sr,s *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; sp - [3 ] pbr,pc+1 ; io - [4 ] 0,s+sp ; data low - [4a] 0,s+sp+1 ; data high [1] -*/ - -void g65816_op_and_srb(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.a.b &= gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [read] - - g65816_flags_and_b(); - g65816_incpc(2); -} - -void g65816_op_and_srw(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.a.p.l &= gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [read low] - gx816->regs.a.p.h &= gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //4a [read high] - - g65816_flags_and_w(); - g65816_incpc(2); -} - -/************************** - *** 0x33: and (sr,s),y *** - ************************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; sp - [3 ] pbr,pc+1 ; io - [4 ] 0,s+sp ; aal - [5 ] 0,s+sp+1 ; aah - [6 ] 0,s+sp+1 ; io - [7 ] dbr,aa+y ; data low - [7a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_and_isryb(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //5 [aah] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->regs.a.b &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //7 [read] - - g65816_flags_and_b(); - g65816_incpc(2); -} - -void g65816_op_and_isryw(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //5 [aah] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->regs.a.p.l &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //7 [read low] - gx816->regs.a.p.h &= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //7a [read high] - - g65816_flags_and_w(); - g65816_incpc(2); -} diff --git a/bsnes/cpu/g65816_ops_cmp.cpp b/bsnes/cpu/g65816_ops_cmp.cpp deleted file mode 100644 index 33e2bc14..00000000 --- a/bsnes/cpu/g65816_ops_cmp.cpp +++ /dev/null @@ -1,508 +0,0 @@ -void g65816_flags_cmp_b() { -int r = gx816->regs.a.b - gx816->op.r.b; - g65816_testn(r & 0x80); - g65816_testz((byte)r == 0); - g65816_testc(r >= 0); -} - -void g65816_flags_cmp_w() { -int r = gx816->regs.a.w - gx816->op.r.w; - g65816_testn(r & 0x8000); - g65816_testz((word)r == 0); - g65816_testc(r >= 0); -} - -/************************ - *** 0xc9: cmp #const *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; idl - [2a] pbr,pc+2 ; idh [1] -*/ - -void g65816_op_cmp_constb(void) { - gx816->op.r.b = gx816->read_operand(1); //1,2 [op fetch] - - g65816_flags_cmp_b(); - g65816_incpc(2); -} - -void g65816_op_cmp_constw(void) { - gx816->op.r.w = gx816->read_operand(2); //1,2,2a [op fetch] - - g65816_flags_cmp_w(); - g65816_incpc(3); -} - -/********************** - *** 0xcd: cmp addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_cmp_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - - g65816_flags_cmp_b(); - g65816_incpc(3); -} - -void g65816_op_cmp_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - - g65816_flags_cmp_w(); - g65816_incpc(3); -} - -/************************ - *** 0xdd: cmp addr,x *** - ************************ -cycles: - [1 ] pbr,pc ; opercmp - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+xl ; io [4] - [4 ] dbr,aa+x ; data low - [4a] dbr,aa+x+1 ; data high [1] -*/ - -void g65816_op_cmp_addrxb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read] - - g65816_flags_cmp_b(); - g65816_incpc(3); -} - -void g65816_op_cmp_addrxw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1); //4a [read high] - - g65816_flags_cmp_w(); - g65816_incpc(3); -} - -/******************** - *** 0xc5: cmp dp *** - ******************** -cycles: - [1 ] pbr,pc ; opercmp - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] -*/ - -void g65816_op_cmp_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - - g65816_flags_cmp_b(); - g65816_incpc(2); -} - -void g65816_op_cmp_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - - g65816_flags_cmp_w(); - g65816_incpc(2); -} - -/********************** - *** 0xd2: cmp (dp) *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] dbr,aa ; data low - [5a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_cmp_idpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //5 [read] - - g65816_flags_cmp_b(); - g65816_incpc(2); -} - -void g65816_op_cmp_idpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //5 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //5a [read high] - - g65816_flags_cmp_w(); - g65816_incpc(2); -} - -/********************** - *** 0xc7: cmp [dp] *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] 0,d+dp+2 ; aab - [6 ] aab,aa ; data low - [6a] aab,aa+1 ; data high [1] -*/ - -void g65816_op_cmp_ildpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->op.r.b = gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //6 [read] - - g65816_flags_cmp_b(); - g65816_incpc(2); -} - -void g65816_op_cmp_ildpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->op.r.p.l = gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //6 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + 1); //6a [read high] - - g65816_flags_cmp_w(); - g65816_incpc(2); -} - -/********************** - *** 0xcf: cmp long *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] pbr,pc+3 ; aab - [5 ] aab,aa ; data low - [5a] aab,aa+1 ; data high -*/ - -void g65816_op_cmp_longb(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //5 [read] - - g65816_flags_cmp_b(); - g65816_incpc(4); -} - -void g65816_op_cmp_longw(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //5 [read] - gx816->op.r.p.h = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + 1); //5a [read] - - g65816_flags_cmp_w(); - g65816_incpc(4); -} - -/************************ - *** 0xdf: cmp long,x *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] pbr,pc+3 ; aab - [5 ] aab,aa+x ; data low - [5a] aab,aa+x+1 ; data high -*/ - -void g65816_op_cmp_longxb(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x); //5 [read] - - g65816_flags_cmp_b(); - g65816_incpc(4); -} - -void g65816_op_cmp_longxw(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x); //5 [read] - gx816->op.r.p.h = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x + 1); //5a [read] - - g65816_flags_cmp_w(); - g65816_incpc(4); -} - -/************************ - *** 0xd9: cmp addr,y *** - ************************ -cycles: - [1 ] pbr,pc ; opercmp - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+yl ; io [4] - [4 ] dbr,aa+y ; data low - [4a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_cmp_addryb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //3a [pbc or p.x=0] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //4 [read] - - g65816_flags_cmp_b(); - g65816_incpc(3); -} - -void g65816_op_cmp_addryw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //3a [pbc or p.x=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //4a [read high] - - g65816_flags_cmp_w(); - g65816_incpc(3); -} - -/********************** - *** 0xd5: cmp dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high -*/ - -void g65816_op_cmp_dpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read] - - g65816_flags_cmp_b(); - g65816_incpc(2); -} - -void g65816_op_cmp_dpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //4a [read high] - - g65816_flags_cmp_w(); - g65816_incpc(2); -} - -/************************ - *** 0xc1: cmp (dp,x) *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; aal - [5 ] 0,d+dp+x+1 ; aah - [6 ] dbr,aa ; data low - [6a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_cmp_idpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //5 [aah] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //6 [read] - - g65816_flags_cmp_b(); - g65816_incpc(2); -} - -void g65816_op_cmp_idpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //5 [aah] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //6 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //6 [read high] - - g65816_flags_cmp_w(); - g65816_incpc(2); -} - -/************************ - *** 0xd1: cmp (dp),y *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [4a] dbr,aah,aal+yl ; io [4] - [5 ] dbr,aa+y ; data low - [5a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_cmp_idpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //4a [pbc or p.x=0] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //5 [read] - - g65816_flags_cmp_b(); - g65816_incpc(2); -} - -void g65816_op_cmp_idpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //4a [pbc or p.x=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //5 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //5a [read high] - - g65816_flags_cmp_w(); - g65816_incpc(2); -} - -/************************ - *** 0xd7: cmp [dp],y *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] 0,d+dp+2 ; aab - [6 ] aab,aa+y ; data low - [6a] aab,aa+y+1 ; data high [1] -*/ - -void g65816_op_cmp_ildpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->op.r.b = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y); //6 [read] - - g65816_flags_cmp_b(); - g65816_incpc(2); -} - -void g65816_op_cmp_ildpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->op.r.p.l = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y); //6 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y + 1); //6a [read high] - - g65816_flags_cmp_w(); - g65816_incpc(2); -} - -/********************** - *** 0xc3: cmp sr,s *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; sp - [3 ] pbr,pc+1 ; io - [4 ] 0,s+sp ; data low - [4a] 0,s+sp+1 ; data high [1] -*/ - -void g65816_op_cmp_srb(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [read] - - g65816_flags_cmp_b(); - g65816_incpc(2); -} - -void g65816_op_cmp_srw(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //4a [read high] - - g65816_flags_cmp_w(); - g65816_incpc(2); -} - -/************************** - *** 0xd3: cmp (sr,s),y *** - ************************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; sp - [3 ] pbr,pc+1 ; io - [4 ] 0,s+sp ; aal - [5 ] 0,s+sp+1 ; aah - [6 ] 0,s+sp+1 ; io - [7 ] dbr,aa+y ; data low - [7a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_cmp_isryb(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //5 [aah] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //7 [read] - - g65816_flags_cmp_b(); - g65816_incpc(2); -} - -void g65816_op_cmp_isryw(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //5 [aah] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //7 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //7a [read high] - - g65816_flags_cmp_w(); - g65816_incpc(2); -} diff --git a/bsnes/cpu/g65816_ops_eor.cpp b/bsnes/cpu/g65816_ops_eor.cpp deleted file mode 100644 index c60f28a6..00000000 --- a/bsnes/cpu/g65816_ops_eor.cpp +++ /dev/null @@ -1,504 +0,0 @@ -void g65816_flags_eor_b() { - g65816_testn(gx816->regs.a.b & 0x80); - g65816_testz(gx816->regs.a.b == 0); -} - -void g65816_flags_eor_w() { - g65816_testn(gx816->regs.a.w & 0x8000); - g65816_testz(gx816->regs.a.w == 0); -} - -/************************ - *** 0x49: eor #const *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; idl - [2a] pbr,pc+2 ; idh [1] -*/ - -void g65816_op_eor_constb(void) { - gx816->regs.a.b ^= gx816->read_operand(1); //1,2 [op fetch] - - g65816_flags_eor_b(); - g65816_incpc(2); -} - -void g65816_op_eor_constw(void) { - gx816->regs.a.w ^= gx816->read_operand(2); //1,2,2a [op fetch] - - g65816_flags_eor_w(); - g65816_incpc(3); -} - -/********************** - *** 0x4d: eor addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_eor_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->regs.a.b ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - - g65816_flags_eor_b(); - g65816_incpc(3); -} - -void g65816_op_eor_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->regs.a.p.l ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->regs.a.p.h ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - - g65816_flags_eor_w(); - g65816_incpc(3); -} - -/************************ - *** 0x5d: eor addr,x *** - ************************ -cycles: - [1 ] pbr,pc ; opereor - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+xl ; io [4] - [4 ] dbr,aa+x ; data low - [4a] dbr,aa+x+1 ; data high [1] -*/ - -void g65816_op_eor_addrxb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->regs.a.b ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read] - - g65816_flags_eor_b(); - g65816_incpc(3); -} - -void g65816_op_eor_addrxw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->regs.a.p.l ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read low] - gx816->regs.a.p.h ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1); //4a [read high] - - g65816_flags_eor_w(); - g65816_incpc(3); -} - -/******************** - *** 0x45: eor dp *** - ******************** -cycles: - [1 ] pbr,pc ; opereor - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] -*/ - -void g65816_op_eor_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->regs.a.b ^= gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - - g65816_flags_eor_b(); - g65816_incpc(2); -} - -void g65816_op_eor_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->regs.a.p.l ^= gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->regs.a.p.h ^= gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - - g65816_flags_eor_w(); - g65816_incpc(2); -} - -/********************** - *** 0x52: eor (dp) *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] dbr,aa ; data low - [5a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_eor_idpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->regs.a.b ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //5 [read] - - g65816_flags_eor_b(); - g65816_incpc(2); -} - -void g65816_op_eor_idpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->regs.a.p.l ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //5 [read low] - gx816->regs.a.p.h ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //5a [read high] - - g65816_flags_eor_w(); - g65816_incpc(2); -} - -/********************** - *** 0x47: eor [dp] *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] 0,d+dp+2 ; aab - [6 ] aab,aa ; data low - [6a] aab,aa+1 ; data high [1] -*/ - -void g65816_op_eor_ildpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->regs.a.b ^= gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //6 [read] - - g65816_flags_eor_b(); - g65816_incpc(2); -} - -void g65816_op_eor_ildpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->regs.a.p.l ^= gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //6 [read low] - gx816->regs.a.p.h ^= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + 1); //6a [read high] - - g65816_flags_eor_w(); - g65816_incpc(2); -} - -/********************** - *** 0x4f: eor long *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] pbr,pc+3 ; aab - [5 ] aab,aa ; data low - [5a] aab,aa+1 ; data high -*/ - -void g65816_op_eor_longb(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->regs.a.b ^= gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //5 [read] - - g65816_flags_eor_b(); - g65816_incpc(4); -} - -void g65816_op_eor_longw(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->regs.a.p.l ^= gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //5 [read] - gx816->regs.a.p.h ^= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + 1); //5a [read] - - g65816_flags_eor_w(); - g65816_incpc(4); -} - -/************************ - *** 0x5f: eor long,x *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] pbr,pc+3 ; aab - [5 ] aab,aa+x ; data low - [5a] aab,aa+x+1 ; data high -*/ - -void g65816_op_eor_longxb(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->regs.a.b ^= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x); //5 [read] - - g65816_flags_eor_b(); - g65816_incpc(4); -} - -void g65816_op_eor_longxw(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->regs.a.p.l ^= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x); //5 [read] - gx816->regs.a.p.h ^= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x + 1); //5a [read] - - g65816_flags_eor_w(); - g65816_incpc(4); -} - -/************************ - *** 0x59: eor addr,y *** - ************************ -cycles: - [1 ] pbr,pc ; opereor - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+yl ; io [4] - [4 ] dbr,aa+y ; data low - [4a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_eor_addryb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //3a [pbc or p.x=0] - gx816->regs.a.b ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //4 [read] - - g65816_flags_eor_b(); - g65816_incpc(3); -} - -void g65816_op_eor_addryw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //3a [pbc or p.x=0] - gx816->regs.a.p.l ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //4 [read low] - gx816->regs.a.p.h ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //4a [read high] - - g65816_flags_eor_w(); - g65816_incpc(3); -} - -/********************** - *** 0x55: eor dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high -*/ - -void g65816_op_eor_dpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.a.b ^= gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read] - - g65816_flags_eor_b(); - g65816_incpc(2); -} - -void g65816_op_eor_dpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.a.p.l ^= gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read low] - gx816->regs.a.p.h ^= gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //4a [read high] - - g65816_flags_eor_w(); - g65816_incpc(2); -} - -/************************ - *** 0x41: eor (dp,x) *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; aal - [5 ] 0,d+dp+x+1 ; aah - [6 ] dbr,aa ; data low - [6a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_eor_idpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //5 [aah] - gx816->regs.a.b ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //6 [read] - - g65816_flags_eor_b(); - g65816_incpc(2); -} - -void g65816_op_eor_idpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //5 [aah] - gx816->regs.a.p.l ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //6 [read low] - gx816->regs.a.p.h ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //6 [read high] - - g65816_flags_eor_w(); - g65816_incpc(2); -} - -/************************ - *** 0x51: eor (dp),y *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [4a] dbr,aah,aal+yl ; io [4] - [5 ] dbr,aa+y ; data low - [5a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_eor_idpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //4a [pbc or p.x=0] - gx816->regs.a.b ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //5 [read] - - g65816_flags_eor_b(); - g65816_incpc(2); -} - -void g65816_op_eor_idpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //4a [pbc or p.x=0] - gx816->regs.a.p.l ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //5 [read low] - gx816->regs.a.p.h ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //5a [read high] - - g65816_flags_eor_w(); - g65816_incpc(2); -} - -/************************ - *** 0x57: eor [dp],y *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] 0,d+dp+2 ; aab - [6 ] aab,aa+y ; data low - [6a] aab,aa+y+1 ; data high [1] -*/ - -void g65816_op_eor_ildpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->regs.a.b ^= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y); //6 [read] - - g65816_flags_eor_b(); - g65816_incpc(2); -} - -void g65816_op_eor_ildpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->regs.a.p.l ^= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y); //6 [read low] - gx816->regs.a.p.h ^= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y + 1); //6a [read high] - - g65816_flags_eor_w(); - g65816_incpc(2); -} - -/********************** - *** 0x43: eor sr,s *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; sp - [3 ] pbr,pc+1 ; io - [4 ] 0,s+sp ; data low - [4a] 0,s+sp+1 ; data high [1] -*/ - -void g65816_op_eor_srb(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.a.b ^= gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [read] - - g65816_flags_eor_b(); - g65816_incpc(2); -} - -void g65816_op_eor_srw(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.a.p.l ^= gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [read low] - gx816->regs.a.p.h ^= gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //4a [read high] - - g65816_flags_eor_w(); - g65816_incpc(2); -} - -/************************** - *** 0x53: eor (sr,s),y *** - ************************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; sp - [3 ] pbr,pc+1 ; io - [4 ] 0,s+sp ; aal - [5 ] 0,s+sp+1 ; aah - [6 ] 0,s+sp+1 ; io - [7 ] dbr,aa+y ; data low - [7a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_eor_isryb(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //5 [aah] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->regs.a.b ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //7 [read] - - g65816_flags_eor_b(); - g65816_incpc(2); -} - -void g65816_op_eor_isryw(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //5 [aah] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->regs.a.p.l ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //7 [read low] - gx816->regs.a.p.h ^= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //7a [read high] - - g65816_flags_eor_w(); - g65816_incpc(2); -} diff --git a/bsnes/cpu/g65816_ops_incdec.cpp b/bsnes/cpu/g65816_ops_incdec.cpp deleted file mode 100644 index a9a26722..00000000 --- a/bsnes/cpu/g65816_ops_incdec.cpp +++ /dev/null @@ -1,511 +0,0 @@ -/***************** - *** 0x1a: inc *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_incb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - gx816->regs.a.b++; - g65816_testn(gx816->regs.a.b & 0x80); - g65816_testz(gx816->regs.a.b == 0); - g65816_incpc(1); -} - -void g65816_op_incw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - gx816->regs.a.w++; - g65816_testn(gx816->regs.a.w & 0x8000); - g65816_testz(gx816->regs.a.w == 0); - g65816_incpc(1); -} - -/********************** - *** 0xee: inc addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] - [5 ] dbr,aa+1 ; io - [6a] dbr,aa+1 ; data high [1] - [6 ] dbr,aa ; data low -*/ - -void g65816_op_inc_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - snes_time->add_cpu_icycles(1); //5 [i/o] - gx816->op.r.b++; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->op.r.b); //6 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(3); -} - -void g65816_op_inc_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - snes_time->add_cpu_icycles(1); //5 [i/o] - gx816->op.r.w++; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + 1, gx816->op.r.p.h); //6a [write high] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->op.r.p.l); //6 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(3); -} - -/************************ - *** 0xfe: inc addr,x *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aah,aal+xl ; io - [5 ] dbr,aa+x ; data low - [5a] dbr,aa+x+1 ; data high [1] - [6 ] dbr,aa+x+1 ; io - [7a] dbr,aa+x+1 ; data high [1] - [7 ] dbr,aa+x ; data low -*/ - -void g65816_op_inc_addrxb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //5 [read] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->op.r.b++; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x, gx816->op.r.b); //7 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(3); -} - -void g65816_op_inc_addrxw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //5 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1); //5a [read high] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->op.r.w++; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1, gx816->op.r.p.h); //7a [write high] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x, gx816->op.r.p.l); //7 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(3); -} - -/******************** - *** 0xe6: inc dp *** - ******************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] - [4 ] 0,d+dp+1 ; io - [5a] 0,d+dp+1 ; data high [1] - [5 ] 0,d+dp ; data low -*/ - -void g65816_op_inc_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->op.r.b++; - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->op.r.b); //5 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(2); -} - -void g65816_op_inc_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->op.r.w++; - gx816->op_write(OPMODE_DP, gx816->op.dp + 1, gx816->op.r.p.h); //5a [write high] - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->op.r.p.l); //5 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(2); -} - -/********************** - *** 0xf6: inc dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high [1] - [5 ] 0,d+dp+x+1 ; io - [6a] 0,d+dp+x+1 ; data high [1] - [6 ] 0,d+dp+x ; data low -*/ - -void g65816_op_inc_dpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read] - snes_time->add_cpu_icycles(1); //5 [i/o] - gx816->op.r.b++; - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, gx816->op.r.b); //6 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(2); -} - -void g65816_op_inc_dpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //4a [read high] - snes_time->add_cpu_icycles(1); //5 [i/o] - gx816->op.r.w++; - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1, gx816->op.r.p.h); //6a [write high] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, gx816->op.r.p.l); //6 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(2); -} - -/***************** - *** 0xe8: inx *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_inxb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - gx816->regs.x++; - gx816->regs.x &= 0xff; - g65816_testn(gx816->regs.x & 0x80); - g65816_testz(gx816->regs.x == 0); - g65816_incpc(1); -} - -void g65816_op_inxw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - gx816->regs.x++; - g65816_testn(gx816->regs.x & 0x8000); - g65816_testz(gx816->regs.x == 0); - g65816_incpc(1); -} - -/***************** - *** 0xc8: iny *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_inyb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - gx816->regs.y++; - gx816->regs.y &= 0xff; - g65816_testn(gx816->regs.y & 0x80); - g65816_testz(gx816->regs.y == 0); - g65816_incpc(1); -} - -void g65816_op_inyw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - gx816->regs.y++; - g65816_testn(gx816->regs.y & 0x8000); - g65816_testz(gx816->regs.y == 0); - g65816_incpc(1); -} - -/***************** - *** 0x3a: dec *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_decb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - gx816->regs.a.b--; - g65816_testn(gx816->regs.a.b & 0x80); - g65816_testz(gx816->regs.a.b == 0); - g65816_incpc(1); -} - -void g65816_op_decw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - gx816->regs.a.w--; - g65816_testn(gx816->regs.a.w & 0x8000); - g65816_testz(gx816->regs.a.w == 0); - g65816_incpc(1); -} - -/********************** - *** 0xce: dec addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] - [5 ] dbr,aa+1 ; io - [6a] dbr,aa+1 ; data high [1] - [6 ] dbr,aa ; data low -*/ - -void g65816_op_dec_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - snes_time->add_cpu_icycles(1); //5 [i/o] - gx816->op.r.b--; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->op.r.b); //6 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(3); -} - -void g65816_op_dec_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - snes_time->add_cpu_icycles(1); //5 [i/o] - gx816->op.r.w--; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + 1, gx816->op.r.p.h); //6a [write high] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->op.r.p.l); //6 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(3); -} - -/************************ - *** 0xde: dec addr,x *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aah,aal+xl ; io - [5 ] dbr,aa+x ; data low - [5a] dbr,aa+x+1 ; data high [1] - [6 ] dbr,aa+x+1 ; io - [7a] dbr,aa+x+1 ; data high [1] - [7 ] dbr,aa+x ; data low -*/ - -void g65816_op_dec_addrxb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //5 [read] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->op.r.b--; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x, gx816->op.r.b); //7 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(3); -} - -void g65816_op_dec_addrxw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //5 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1); //5a [read high] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->op.r.w--; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1, gx816->op.r.p.h); //7a [write high] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x, gx816->op.r.p.l); //7 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(3); -} - -/******************** - *** 0xc6: dec dp *** - ******************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] - [4 ] 0,d+dp+1 ; io - [5a] 0,d+dp+1 ; data high [1] - [5 ] 0,d+dp ; data low -*/ - -void g65816_op_dec_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->op.r.b--; - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->op.r.b); //5 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(2); -} - -void g65816_op_dec_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->op.r.w--; - gx816->op_write(OPMODE_DP, gx816->op.dp + 1, gx816->op.r.p.h); //5a [write high] - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->op.r.p.l); //5 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(2); -} - -/********************** - *** 0xd6: dec dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high [1] - [5 ] 0,d+dp+x+1 ; io - [6a] 0,d+dp+x+1 ; data high [1] - [6 ] 0,d+dp+x ; data low -*/ - -void g65816_op_dec_dpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read] - snes_time->add_cpu_icycles(1); //5 [i/o] - gx816->op.r.b--; - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, gx816->op.r.b); //6 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(2); -} - -void g65816_op_dec_dpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //4a [read high] - snes_time->add_cpu_icycles(1); //5 [i/o] - gx816->op.r.w--; - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1, gx816->op.r.p.h); //6a [write high] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, gx816->op.r.p.l); //6 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(2); -} - -/***************** - *** 0xca: dex *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_dexb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - gx816->regs.x--; - gx816->regs.x &= 0xff; - g65816_testn(gx816->regs.x & 0x80); - g65816_testz(gx816->regs.x == 0); - g65816_incpc(1); -} - -void g65816_op_dexw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - gx816->regs.x--; - g65816_testn(gx816->regs.x & 0x8000); - g65816_testz(gx816->regs.x == 0); - g65816_incpc(1); -} - -/***************** - *** 0x88: dey *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_deyb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - gx816->regs.y--; - gx816->regs.y &= 0xff; - g65816_testn(gx816->regs.y & 0x80); - g65816_testz(gx816->regs.y == 0); - g65816_incpc(1); -} - -void g65816_op_deyw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - gx816->regs.y--; - g65816_testn(gx816->regs.y & 0x8000); - g65816_testz(gx816->regs.y == 0); - g65816_incpc(1); -} diff --git a/bsnes/cpu/g65816_ops_lda.cpp b/bsnes/cpu/g65816_ops_lda.cpp deleted file mode 100644 index bacc7fdd..00000000 --- a/bsnes/cpu/g65816_ops_lda.cpp +++ /dev/null @@ -1,504 +0,0 @@ -void g65816_flags_lda_b(void) { - g65816_testn(gx816->regs.a.b & 0x80); - g65816_testz(gx816->regs.a.b == 0); -} - -void g65816_flags_lda_w(void) { - g65816_testn(gx816->regs.a.w & 0x8000); - g65816_testz(gx816->regs.a.w == 0); -} - -/************************ - *** 0xa9: lda #const *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; idl - [2a] pbr,pc+2 ; idh [1] -*/ - -void g65816_op_lda_constb(void) { - gx816->regs.a.b = gx816->read_operand(1); //1,2 [op fetch] - - g65816_flags_lda_b(); - g65816_incpc(2); -} - -void g65816_op_lda_constw(void) { - gx816->regs.a.w = gx816->read_operand(2); //1,2,2a [op fetch] - - g65816_flags_lda_w(); - g65816_incpc(3); -} - -/********************** - *** 0xad: lda addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_lda_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->regs.a.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - - g65816_flags_lda_b(); - g65816_incpc(3); -} - -void g65816_op_lda_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->regs.a.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->regs.a.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - - g65816_flags_lda_w(); - g65816_incpc(3); -} - -/************************ - *** 0xbd: lda addr,x *** - ************************ -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+xl ; io [4] - [4 ] dbr,aa+x ; data low - [4a] dbr,aa+x+1 ; data high [1] -*/ - -void g65816_op_lda_addrxb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->regs.a.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read] - - g65816_flags_lda_b(); - g65816_incpc(3); -} - -void g65816_op_lda_addrxw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->regs.a.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read low] - gx816->regs.a.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1); //4a [read high] - - g65816_flags_lda_w(); - g65816_incpc(3); -} - -/******************** - *** 0xa5: lda dp *** - ******************** -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] -*/ - -void g65816_op_lda_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->regs.a.b = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - - g65816_flags_lda_b(); - g65816_incpc(2); -} - -void g65816_op_lda_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->regs.a.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->regs.a.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - - g65816_flags_lda_w(); - g65816_incpc(2); -} - -/********************** - *** 0xb2: lda (dp) *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] dbr,aa ; data low - [5a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_lda_idpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->regs.a.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //5 [read] - - g65816_flags_lda_b(); - g65816_incpc(2); -} - -void g65816_op_lda_idpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->regs.a.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //5 [read low] - gx816->regs.a.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //5a [read high] - - g65816_flags_lda_w(); - g65816_incpc(2); -} - -/********************** - *** 0xa7: lda [dp] *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] 0,d+dp+2 ; aab - [6 ] aab,aa ; data low - [6a] aab,aa+1 ; data high [1] -*/ - -void g65816_op_lda_ildpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->regs.a.b = gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //6 [read] - - g65816_flags_lda_b(); - g65816_incpc(2); -} - -void g65816_op_lda_ildpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->regs.a.p.l = gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //6 [read low] - gx816->regs.a.p.h = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + 1); //6a [read high] - - g65816_flags_lda_w(); - g65816_incpc(2); -} - -/********************** - *** 0xaf: lda long *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] pbr,pc+3 ; aab - [5 ] aab,aa ; data low - [5a] aab,aa+1 ; data high -*/ - -void g65816_op_lda_longb(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->regs.a.b = gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //5 [read] - - g65816_flags_lda_b(); - g65816_incpc(4); -} - -void g65816_op_lda_longw(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->regs.a.p.l = gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //5 [read] - gx816->regs.a.p.h = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + 1); //5a [read] - - g65816_flags_lda_w(); - g65816_incpc(4); -} - -/************************ - *** 0xbf: lda long,x *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] pbr,pc+3 ; aab - [5 ] aab,aa+x ; data low - [5a] aab,aa+x+1 ; data high -*/ - -void g65816_op_lda_longxb(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->regs.a.b = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x); //5 [read] - - g65816_flags_lda_b(); - g65816_incpc(4); -} - -void g65816_op_lda_longxw(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->regs.a.p.l = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x); //5 [read] - gx816->regs.a.p.h = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x + 1); //5a [read] - - g65816_flags_lda_w(); - g65816_incpc(4); -} - -/************************ - *** 0xb9: lda addr,y *** - ************************ -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+yl ; io [4] - [4 ] dbr,aa+y ; data low - [4a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_lda_addryb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //3a [pbc or p.x=0] - gx816->regs.a.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //4 [read] - - g65816_flags_lda_b(); - g65816_incpc(3); -} - -void g65816_op_lda_addryw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //3a [pbc or p.x=0] - gx816->regs.a.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //4 [read low] - gx816->regs.a.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //4a [read high] - - g65816_flags_lda_w(); - g65816_incpc(3); -} - -/********************** - *** 0xb5: lda dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high -*/ - -void g65816_op_lda_dpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.a.b = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read] - - g65816_flags_lda_b(); - g65816_incpc(2); -} - -void g65816_op_lda_dpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.a.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read low] - gx816->regs.a.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //4a [read high] - - g65816_flags_lda_w(); - g65816_incpc(2); -} - -/************************ - *** 0xa1: lda (dp,x) *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; aal - [5 ] 0,d+dp+x+1 ; aah - [6 ] dbr,aa ; data low - [6a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_lda_idpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //5 [aah] - gx816->regs.a.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //6 [read] - - g65816_flags_lda_b(); - g65816_incpc(2); -} - -void g65816_op_lda_idpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //5 [aah] - gx816->regs.a.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //6 [read low] - gx816->regs.a.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //6 [read high] - - g65816_flags_lda_w(); - g65816_incpc(2); -} - -/************************ - *** 0xb1: lda (dp),y *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [4a] dbr,aah,aal+yl ; io [4] - [5 ] dbr,aa+y ; data low - [5a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_lda_idpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //4a [pbc or p.x=0] - gx816->regs.a.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //5 [read] - - g65816_flags_lda_b(); - g65816_incpc(2); -} - -void g65816_op_lda_idpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //4a [pbc or p.x=0] - gx816->regs.a.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //5 [read low] - gx816->regs.a.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //5a [read high] - - g65816_flags_lda_w(); - g65816_incpc(2); -} - -/************************ - *** 0xb7: lda [dp],y *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] 0,d+dp+2 ; aab - [6 ] aab,aa+y ; data low - [6a] aab,aa+y+1 ; data high [1] -*/ - -void g65816_op_lda_ildpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->regs.a.b = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y); //6 [read] - - g65816_flags_lda_b(); - g65816_incpc(2); -} - -void g65816_op_lda_ildpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->regs.a.p.l = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y); //6 [read low] - gx816->regs.a.p.h = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y + 1); //6a [read high] - - g65816_flags_lda_w(); - g65816_incpc(2); -} - -/********************** - *** 0xa3: lda sr,s *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; sp - [3 ] pbr,pc+1 ; io - [4 ] 0,s+sp ; data low - [4a] 0,s+sp+1 ; data high [1] -*/ - -void g65816_op_lda_srb(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.a.b = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [read] - - g65816_flags_lda_b(); - g65816_incpc(2); -} - -void g65816_op_lda_srw(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.a.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [read low] - gx816->regs.a.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //4a [read high] - - g65816_flags_lda_w(); - g65816_incpc(2); -} - -/************************** - *** 0xb3: lda (sr,s),y *** - ************************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; sp - [3 ] pbr,pc+1 ; io - [4 ] 0,s+sp ; aal - [5 ] 0,s+sp+1 ; aah - [6 ] 0,s+sp+1 ; io - [7 ] dbr,aa+y ; data low - [7a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_lda_isryb(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //5 [aah] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->regs.a.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //7 [read] - - g65816_flags_lda_b(); - g65816_incpc(2); -} - -void g65816_op_lda_isryw(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //5 [aah] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->regs.a.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //7 [read low] - gx816->regs.a.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //7a [read high] - - g65816_flags_lda_w(); - g65816_incpc(2); -} diff --git a/bsnes/cpu/g65816_ops_misc.cpp b/bsnes/cpu/g65816_ops_misc.cpp deleted file mode 100644 index d8d8b2d4..00000000 --- a/bsnes/cpu/g65816_ops_misc.cpp +++ /dev/null @@ -1,1692 +0,0 @@ -void g65816_flags_bit_b(void) { - g65816_testn(gx816->op.r.b & 0x80); - g65816_testv(gx816->op.r.b & 0x40); - g65816_testz((gx816->op.r.b & gx816->regs.a.b) == 0); -} - -void g65816_flags_bit_w(void) { - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testv(gx816->op.r.w & 0x4000); - g65816_testz((gx816->op.r.w & gx816->regs.a.w) == 0); -} - -/************************ - *** 0x89: bit #const *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; idl - [2a] pbr,pc+2 ; idh [1] -*/ - -void g65816_op_bit_constb(void) { - gx816->op.r.b = gx816->read_operand(1); //1,2 [op fetch] - g65816_flags_bit_b(); - g65816_incpc(2); -} - -void g65816_op_bit_constw(void) { - gx816->op.r.w = gx816->read_operand(2); //1,2,2a [op fetch] - g65816_flags_bit_w(); - g65816_incpc(3); -} - -/********************** - *** 0x2c: bit addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_bit_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - g65816_flags_bit_b(); - g65816_incpc(3); -} - -void g65816_op_bit_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - g65816_flags_bit_w(); - g65816_incpc(3); -} - -/************************ - *** 0x3c: bit addr,x *** - ************************ -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+xl ; io [4] - [4 ] dbr,aa+x ; data low - [4a] dbr,aa+x+1 ; data high [1] -*/ - -void g65816_op_bit_addrxb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read] - g65816_flags_bit_b(); - g65816_incpc(3); -} - -void g65816_op_bit_addrxw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1); //4a [read high] - g65816_flags_bit_w(); - g65816_incpc(3); -} - -/******************** - *** 0x24: bit dp *** - ******************** -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] -*/ - -void g65816_op_bit_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - g65816_flags_bit_b(); - g65816_incpc(2); -} - -void g65816_op_bit_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - g65816_flags_bit_w(); - g65816_incpc(2); -} - -/********************** - *** 0x34: bit dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high -*/ - -void g65816_op_bit_dpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read] - g65816_flags_bit_b(); - g65816_incpc(2); -} - -void g65816_op_bit_dpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //4a [read high] - g65816_flags_bit_w(); - g65816_incpc(2); -} - -void g65816_flags_cpx_b(void) { -int r = gx816->regs.x - gx816->op.r.b; - g65816_testn(r & 0x80); - g65816_testz((byte)r == 0); - g65816_testc(r >= 0); -} - -void g65816_flags_cpx_w(void) { -int r = gx816->regs.x - gx816->op.r.w; - g65816_testn(r & 0x8000); - g65816_testz((word)r == 0); - g65816_testc(r >= 0); -} - -/************************ - *** 0xe0: cpx #const *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; idl - [2a] pbr,pc+2 ; idh [1] -*/ - -void g65816_op_cpx_constb(void) { - gx816->op.r.b = gx816->read_operand(1); //1,2 [op fetch] - g65816_flags_cpx_b(); - g65816_incpc(2); -} - -void g65816_op_cpx_constw(void) { - gx816->op.r.w = gx816->read_operand(2); //1,2,2a [op fetch] - g65816_flags_cpx_w(); - g65816_incpc(3); -} - -/********************** - *** 0xec: cpx addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_cpx_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - g65816_flags_cpx_b(); - g65816_incpc(3); -} - -void g65816_op_cpx_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - g65816_flags_cpx_w(); - g65816_incpc(3); -} - -/******************** - *** 0xe4: cpx dp *** - ******************** -cycles: - [1 ] pbr,pc ; opercmp - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] -*/ - -void g65816_op_cpx_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - g65816_flags_cpx_b(); - g65816_incpc(2); -} - -void g65816_op_cpx_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - g65816_flags_cpx_w(); - g65816_incpc(2); -} - -void g65816_flags_cpy_b(void) { -int r = gx816->regs.y - gx816->op.r.b; - g65816_testn(r & 0x80); - g65816_testz((byte)r == 0); - g65816_testc(r >= 0); -} - -void g65816_flags_cpy_w(void) { -int r = gx816->regs.y - gx816->op.r.w; - g65816_testn(r & 0x8000); - g65816_testz((word)r == 0); - g65816_testc(r >= 0); -} - -/************************ - *** 0xc0: cpy #const *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; idl - [2a] pbr,pc+2 ; idh [1] -*/ - -void g65816_op_cpy_constb(void) { - gx816->op.r.b = gx816->read_operand(1); //1,2 [op fetch] - g65816_flags_cpy_b(); - g65816_incpc(2); -} - -void g65816_op_cpy_constw(void) { - gx816->op.r.w = gx816->read_operand(2); //1,2,2a [op fetch] - g65816_flags_cpy_w(); - g65816_incpc(3); -} - -/********************** - *** 0xcc: cpy addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_cpy_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - g65816_flags_cpy_b(); - g65816_incpc(3); -} - -void g65816_op_cpy_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - g65816_flags_cpy_w(); - g65816_incpc(3); -} - -/******************** - *** 0xc4: cpy dp *** - ******************** -cycles: - [1 ] pbr,pc ; opercmp - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] -*/ - -void g65816_op_cpy_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - g65816_flags_cpy_b(); - g65816_incpc(2); -} - -void g65816_op_cpy_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - g65816_flags_cpy_w(); - g65816_incpc(2); -} - -void g65816_flags_ldx_b(void) { - g65816_testn(gx816->regs.x & 0x80); - g65816_testz(gx816->regs.x == 0); -} - -void g65816_flags_ldx_w(void) { - g65816_testn(gx816->regs.x & 0x8000); - g65816_testz(gx816->regs.x == 0); -} - -/************************ - *** 0xa2: ldx #const *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; idl - [2a] pbr,pc+2 ; idh [1] -*/ - -void g65816_op_ldx_constb(void) { - gx816->regs.x = gx816->read_operand(1); //1,2 [op fetch] - g65816_flags_ldx_b(); - g65816_incpc(2); -} - -void g65816_op_ldx_constw(void) { - gx816->regs.x = gx816->read_operand(2); //1,2,2a [op fetch] - g65816_flags_ldx_w(); - g65816_incpc(3); -} - -/********************** - *** 0xae: ldx addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_ldx_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->regs.x = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - g65816_flags_ldx_b(); - g65816_incpc(3); -} - -void g65816_op_ldx_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->regs.x = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->regs.x |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1) << 8; //4a [read high] - g65816_flags_ldx_w(); - g65816_incpc(3); -} - -/************************ - *** 0xbe: ldx addr,y *** - ************************ -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+xl ; io [4] - [4 ] dbr,aa+x ; data low - [4a] dbr,aa+x+1 ; data high [1] -*/ - -void g65816_op_ldx_addryb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //3a [pbc or p.x=0] - gx816->regs.x = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //4 [read] - g65816_flags_ldx_b(); - g65816_incpc(3); -} - -void g65816_op_ldx_addryw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //3a [pbc or p.x=0] - gx816->regs.x = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //4 [read low] - gx816->regs.x |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1) << 8; //4a [read high] - g65816_flags_ldx_w(); - g65816_incpc(3); -} - -/******************** - *** 0xa6: ldx dp *** - ******************** -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] -*/ - -void g65816_op_ldx_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->regs.x = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - g65816_flags_ldx_b(); - g65816_incpc(2); -} - -void g65816_op_ldx_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->regs.x = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->regs.x |= gx816->op_read(OPMODE_DP, gx816->op.dp + 1) << 8; //3a [read high] - g65816_flags_ldx_w(); - g65816_incpc(2); -} - -/********************** - *** 0xb6: ldx dp,y *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high -*/ - -void g65816_op_ldx_dpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.x = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.y); //4 [read] - g65816_flags_ldx_b(); - g65816_incpc(2); -} - -void g65816_op_ldx_dpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.x = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.y); //4 [read low] - gx816->regs.x |= gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.y + 1) << 8; //4a [read high] - g65816_flags_ldx_w(); - g65816_incpc(2); -} - -void g65816_flags_ldy_b(void) { - g65816_testn(gx816->regs.y & 0x80); - g65816_testz(gx816->regs.y == 0); -} - -void g65816_flags_ldy_w(void) { - g65816_testn(gx816->regs.y & 0x8000); - g65816_testz(gx816->regs.y == 0); -} - -/************************ - *** 0xa0: ldy #const *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; idl - [2a] pbr,pc+2 ; idh [1] -*/ - -void g65816_op_ldy_constb(void) { - gx816->regs.y = gx816->read_operand(1); //1,2 [op fetch] - g65816_flags_ldy_b(); - g65816_incpc(2); -} - -void g65816_op_ldy_constw(void) { - gx816->regs.y = gx816->read_operand(2); //1,2,2a [op fetch] - g65816_flags_ldy_w(); - g65816_incpc(3); -} - -/********************** - *** 0xac: ldy addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_ldy_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->regs.y = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - g65816_flags_ldy_b(); - g65816_incpc(3); -} - -void g65816_op_ldy_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->regs.y = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->regs.y |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1) << 8; //4a [read high] - g65816_flags_ldy_w(); - g65816_incpc(3); -} - -/************************ - *** 0xbc: ldy addr,x *** - ************************ -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+xl ; io [4] - [4 ] dbr,aa+x ; data low - [4a] dbr,aa+x+1 ; data high [1] -*/ - -void g65816_op_ldy_addrxb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->regs.y = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read] - g65816_flags_ldy_b(); - g65816_incpc(3); -} - -void g65816_op_ldy_addrxw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->regs.y = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read low] - gx816->regs.y |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1) << 8; //4a [read high] - g65816_flags_ldy_w(); - g65816_incpc(3); -} - -/******************** - *** 0xa4: ldy dp *** - ******************** -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] -*/ - -void g65816_op_ldy_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->regs.y = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - g65816_flags_ldy_b(); - g65816_incpc(2); -} - -void g65816_op_ldy_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->regs.y = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->regs.y |= gx816->op_read(OPMODE_DP, gx816->op.dp + 1) << 8; //3a [read high] - g65816_flags_ldy_w(); - g65816_incpc(2); -} - -/********************** - *** 0xb4: ldy dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high -*/ - -void g65816_op_ldy_dpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.y = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read] - g65816_flags_ldy_b(); - g65816_incpc(2); -} - -void g65816_op_ldy_dpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.y = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read low] - gx816->regs.y |= gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1) << 8; //4a [read high] - g65816_flags_ldy_w(); - g65816_incpc(2); -} - -/********************** - *** 0x8e: stx addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_stx_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->regs.x); //4 [write] - g65816_incpc(3); -} - -void g65816_op_stx_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->regs.x); //4 [write low] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + 1, gx816->regs.x >> 8); //4a [write high] - g65816_incpc(3); -} - -/******************** - *** 0x86: stx dp *** - ******************** -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] -*/ - -void g65816_op_stx_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->regs.x); //3 [write] - g65816_incpc(2); -} - -void g65816_op_stx_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->regs.x); //3 [write low] - gx816->op_write(OPMODE_DP, gx816->op.dp + 1, gx816->regs.x >> 8); //3a [write high] - g65816_incpc(2); -} - -/********************** - *** 0x96: stx dp,y *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high -*/ - -void g65816_op_stx_dpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.y, gx816->regs.x); //4 [write] - g65816_incpc(2); -} - -void g65816_op_stx_dpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.y, gx816->regs.x); //4 [write low] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.y + 1, gx816->regs.x >> 8); //4a [write high] - g65816_incpc(2); -} - -/********************** - *** 0x8c: sty addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_sty_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->regs.y); //4 [write] - g65816_incpc(3); -} - -void g65816_op_sty_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->regs.y); //4 [write low] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + 1, gx816->regs.y >> 8); //4a [write high] - g65816_incpc(3); -} - -/******************** - *** 0x84: sty dp *** - ******************** -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] -*/ - -void g65816_op_sty_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->regs.y); //3 [write] - g65816_incpc(2); -} - -void g65816_op_sty_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->regs.y); //3 [write low] - gx816->op_write(OPMODE_DP, gx816->op.dp + 1, gx816->regs.y >> 8); //3a [write high] - g65816_incpc(2); -} - -/********************** - *** 0x94: sty dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high -*/ - -void g65816_op_sty_dpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, gx816->regs.y); //4 [write] - g65816_incpc(2); -} - -void g65816_op_sty_dpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, gx816->regs.y); //4 [write low] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1, gx816->regs.y >> 8); //4a [write high] - g65816_incpc(2); -} - -/********************** - *** 0x9c: stz addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_stz_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, 0); //4 [write] - g65816_incpc(3); -} - -void g65816_op_stz_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, 0); //4 [write low] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + 1, 0); //4a [write high] - g65816_incpc(3); -} - -/************************ - *** 0x9e: stz addr,x *** - ************************ -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+xl ; io [4] - [4 ] dbr,aa+x ; data low - [4a] dbr,aa+x+1 ; data high [1] -*/ - -void g65816_op_stz_addrxb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //3a [write i/o] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x, 0); //4 [write] - g65816_incpc(3); -} - -void g65816_op_stz_addrxw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //3a [write i/o] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x, 0); //4 [write low] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1, 0); //4a [write high] - g65816_incpc(3); -} - -/******************** - *** 0x64: stz dp *** - ******************** -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] -*/ - -void g65816_op_stz_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op_write(OPMODE_DP, gx816->op.dp, 0); //3 [write] - g65816_incpc(2); -} - -void g65816_op_stz_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op_write(OPMODE_DP, gx816->op.dp, 0); //3 [write low] - gx816->op_write(OPMODE_DP, gx816->op.dp + 1, 0); //3a [write high] - g65816_incpc(2); -} - -/********************** - *** 0x74: stz dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high -*/ - -void g65816_op_stz_dpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, 0); //4 [write] - g65816_incpc(2); -} - -void g65816_op_stz_dpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, 0); //4 [write low] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1, 0); //4a [write high] - g65816_incpc(2); -} - -/***************** - *** 0xeb: xba *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io - [3] pbr,pc+1 ; io -*/ - -void g65816_op_xba(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(2); //2,3 [i/o] - gx816->regs.a.p.l ^= gx816->regs.a.p.h; - gx816->regs.a.p.h ^= gx816->regs.a.p.l; - gx816->regs.a.p.l ^= gx816->regs.a.p.h; - g65816_testn(gx816->regs.a.b & 0x80); - g65816_testz(gx816->regs.a.b == 0); - g65816_incpc(1); -} - -/********************** - *** 0x1c: trb addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] - [5 ] dbr,aa+1 ; io - [6a] dbr,aa+1 ; data high [1] - [6 ] dbr,aa ; data low -*/ - -void g65816_op_trb_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testz((gx816->op.r.b & gx816->regs.a.b) == 0); - gx816->op.r.b &= ~gx816->regs.a.b; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->op.r.b); //6 [write] - g65816_incpc(3); -} - -void g65816_op_trb_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testz((gx816->op.r.w & gx816->regs.a.w) == 0); - gx816->op.r.w &= ~gx816->regs.a.w; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + 1, gx816->op.r.p.h); //6a [write high] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->op.r.p.l); //6 [write low] - g65816_incpc(3); -} - -/******************** - *** 0x14: trb dp *** - ******************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] - [4 ] 0,d+dp+1 ; io - [5a] 0,d+dp+1 ; data high [1] - [5 ] 0,d+dp ; data low -*/ - -void g65816_op_trb_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - snes_time->add_cpu_icycles(1); //4 [i/o] - g65816_testz((gx816->op.r.b & gx816->regs.a.b) == 0); - gx816->op.r.b &= ~gx816->regs.a.b; - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->op.r.b); //5 [write] - g65816_incpc(2); -} - -void g65816_op_trb_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - snes_time->add_cpu_icycles(1); //4 [i/o] - g65816_testz((gx816->op.r.w & gx816->regs.a.w) == 0); - gx816->op.r.w &= ~gx816->regs.a.w; - gx816->op_write(OPMODE_DP, gx816->op.dp + 1, gx816->op.r.p.h); //5a [write high] - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->op.r.p.l); //5 [write low] - g65816_incpc(2); -} - -/********************** - *** 0x0c: tsb addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] - [5 ] dbr,aa+1 ; io - [6a] dbr,aa+1 ; data high [1] - [6 ] dbr,aa ; data low -*/ - -void g65816_op_tsb_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testz((gx816->op.r.b & gx816->regs.a.b) == 0); - gx816->op.r.b |= gx816->regs.a.b; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->op.r.b); //6 [write] - g65816_incpc(3); -} - -void g65816_op_tsb_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testz((gx816->op.r.w & gx816->regs.a.w) == 0); - gx816->op.r.w |= gx816->regs.a.w; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + 1, gx816->op.r.p.h); //6a [write high] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->op.r.p.l); //6 [write low] - g65816_incpc(3); -} - -/******************** - *** 0x04: tsb dp *** - ******************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] - [4 ] 0,d+dp+1 ; io - [5a] 0,d+dp+1 ; data high [1] - [5 ] 0,d+dp ; data low -*/ - -void g65816_op_tsb_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - snes_time->add_cpu_icycles(1); //4 [i/o] - g65816_testz((gx816->op.r.b & gx816->regs.a.b) == 0); - gx816->op.r.b |= gx816->regs.a.b; - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->op.r.b); //5 [write] - g65816_incpc(2); -} - -void g65816_op_tsb_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - snes_time->add_cpu_icycles(1); //4 [i/o] - g65816_testz((gx816->op.r.w & gx816->regs.a.w) == 0); - gx816->op.r.w |= gx816->regs.a.w; - gx816->op_write(OPMODE_DP, gx816->op.dp + 1, gx816->op.r.p.h); //5a [write high] - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->op.r.p.l); //5 [write low] - g65816_incpc(2); -} - -/************************** - *** 0x54: mvn src,dest *** - ************************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; dba - [3] pbr,pc+2 ; sba - [4] sba,x ; src data - [5] dba,y ; dest data - [6] dba,y ; io - [7] dba,y ; io -*/ - -void g65816_op_mvn(void) { -ulong sp, dp; - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->regs.a.w--; - dp = (gx816->op.aa.p.l << 16) | gx816->regs.y; - sp = (gx816->op.aa.p.h << 16) | gx816->regs.x; - gx816->op.r.b = gx816->op_read(OPMODE_LONG, sp); //4 [src data] - gx816->op_write(OPMODE_LONG, dp, gx816->op.r.b); //5 [dest data] - gx816->regs.x++; - gx816->regs.y++; - if(gx816->regs.e == true || (gx816->regs.p & PF_X)) { - gx816->regs.x &= 0xff; - gx816->regs.y &= 0xff; - } - if(gx816->regs.a.w == 0xffff) { - g65816_incpc(3); - } - snes_time->add_cpu_icycles(2); //6,7 [i/o] -} - -/************************** - *** 0x44: mvp src,dest *** - ************************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; dba - [3] pbr,pc+2 ; sba - [4] sba,x ; src data - [5] dba,y ; dest data - [6] dba,y ; io - [7] dba,y ; io -*/ - -void g65816_op_mvp(void) { -ulong sp, dp; - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->regs.a.w--; - dp = (gx816->op.aa.p.l << 16) | gx816->regs.y; - sp = (gx816->op.aa.p.h << 16) | gx816->regs.x; - gx816->op.r.b = gx816->op_read(OPMODE_LONG, sp); //4 [src data] - gx816->op_write(OPMODE_LONG, dp, gx816->op.r.b); //5 [dest data] - gx816->regs.x--; - gx816->regs.y--; - if(gx816->regs.e == true || (gx816->regs.p & PF_X)) { - gx816->regs.x &= 0xff; - gx816->regs.y &= 0xff; - } - if(gx816->regs.a.w == 0xffff) { - g65816_incpc(3); - } - snes_time->add_cpu_icycles(2); //6,7 [i/o] -} - -/************************ - *** 0x00: brk #const *** - ************************ -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; signature -* [3] 0,s ; pbr [3] - [4] 0,s-1 ; pch - [5] 0,s-2 ; pcl - [6] 0,s-3 ; p - [7] 0,va ; aavl - [8] 0,va+1 ; aavh -*/ - -void g65816_op_brk(void) { - snes_time->add_cpu_pcycles(2); //1,2 [op fetch] - gx816->stack_write(gx816->regs.pc >> 16); //3 [pbr] - gx816->stack_write(gx816->regs.pc >> 8); //4 [pch] - gx816->stack_write(gx816->regs.pc); //5 [pcl] - gx816->stack_write(gx816->regs.p); //6 [p] - gx816->op.aa.p.l = gx816->op_read(OPMODE_LONG, 0xffe6); //7 [aavl] - gx816->op.aa.p.h = gx816->op_read(OPMODE_LONG, 0xffe7); //8 [aavh] - gx816->regs.pc = gx816->op.aa.w; - g65816_seti(); - g65816_clrd(); -} - -/************************ - *** 0x02: cop #const *** - ************************ -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; signature -* [3] 0,s ; pbr [3] - [4] 0,s-1 ; pch - [5] 0,s-2 ; pcl - [6] 0,s-3 ; p - [7] 0,va ; aavl - [8] 0,va+1 ; aavh -*/ - -void g65816_op_cop(void) { - snes_time->add_cpu_pcycles(2); //1,2 [op fetch] - gx816->stack_write(gx816->regs.pc >> 16); //3 [pbr] - gx816->stack_write(gx816->regs.pc >> 8); //4 [pch] - gx816->stack_write(gx816->regs.pc); //5 [pcl] - gx816->stack_write(gx816->regs.p); //6 [p] - gx816->op.aa.p.l = gx816->op_read(OPMODE_LONG, 0xfff4); //7 [aavl] - gx816->op.aa.p.h = gx816->op_read(OPMODE_LONG, 0xfff5); //8 [aavh] - gx816->regs.pc = gx816->op.aa.w; - g65816_seti(); - g65816_clrd(); -} - -/***************** - *** 0xdb: stp *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io - [3] pbr,pc+1 ; io -*/ - -void g65816_op_stp(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(2); //2,3 [i/o] - gx816->cpu_state = CPUSTATE_STP; -} - -/***************** - *** 0xcb: wai *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io - [3] pbr,pc+1 ; io -*/ - -void g65816_op_wai(void) { -byte i = 0; - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(2); //2,3 [i/o] - if(gx816->nmi_enabled == true)i = 1; - if((ppu.vcounter_enabled == true || ppu.hcounter_enabled == true) && !(gx816->regs.p & PF_I))i = 1; - if(gx816->wai_interrupt_occurred == true || i == 0) { - gx816->wai_interrupt_occurred = false; - g65816_incpc(1); - } -} - -/***************** - *** 0xfb: xce *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_xce(void) { -bool t = gx816->regs.e; - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - if(gx816->regs.p & PF_C) { - gx816->regs.e = true; - } else { - gx816->regs.e = false; - } - g65816_setm(); - g65816_setx(); - g65816_testc(t == true); - if(gx816->regs.e == true) { - gx816->regs.s = 0x0100 | (gx816->regs.s & 0xff); - gx816->regs.x &= 0xff; - gx816->regs.y &= 0xff; - } - g65816_incpc(1); -} - -/***************** - *** 0xea: nop *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_nop(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - g65816_incpc(1); -} - -/***************** - *** 0x42: wdm *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_wdm(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - g65816_incpc(2); -} - -/***************** - *** 0x18: clc *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_clc(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - g65816_clrc(); - g65816_incpc(1); -} - -/***************** - *** 0xd8: cld *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_cld(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - g65816_clrd(); - g65816_incpc(1); -} - -/***************** - *** 0x58: cli *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_cli(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - g65816_clri(); - g65816_incpc(1); -} - -/***************** - *** 0xb8: clv *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_clv(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - g65816_clrv(); - g65816_incpc(1); -} - -/***************** - *** 0x38: sec *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_sec(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - g65816_setc(); - g65816_incpc(1); -} - -/***************** - *** 0xf8: sed *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_sed(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - g65816_setd(); - g65816_incpc(1); -} - -/***************** - *** 0x78: sei *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_sei(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - g65816_seti(); - g65816_incpc(1); -} - -/************************ - *** 0xc2: rep #const *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; idl - [2a] pbr,pc+1 ; idl -*/ - -void g65816_op_rep(void) { - gx816->op.r.b = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //2a [i/o] - gx816->regs.p &= ~gx816->op.r.b; - g65816_incpc(2); - if(gx816->regs.e == true) { - gx816->regs.p |= 0x30; - } -} - -/************************ - *** 0xe2: sep #const *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; idl - [2a] pbr,pc+1 ; idl -*/ - -void g65816_op_sep(void) { - gx816->op.r.b = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //2a [i/o] - gx816->regs.p |= gx816->op.r.b; - if(gx816->regs.p & 0x10) { - gx816->regs.x &= 0xff; - gx816->regs.y &= 0xff; - } - g65816_incpc(2); -} - -/***************** - *** 0xaa: tax *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_taxb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.x = gx816->regs.a.b; - g65816_testn(gx816->regs.a.b & 0x80); - g65816_testz(gx816->regs.a.b == 0); - g65816_incpc(1); -} - -void g65816_op_taxw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.x = gx816->regs.a.w; - g65816_testn(gx816->regs.a.w & 0x8000); - g65816_testz(gx816->regs.a.w == 0); - g65816_incpc(1); -} - -/***************** - *** 0xa8: tay *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_tayb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.y = gx816->regs.a.b; - g65816_testn(gx816->regs.a.b & 0x80); - g65816_testz(gx816->regs.a.b == 0); - g65816_incpc(1); -} - -void g65816_op_tayw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.y = gx816->regs.a.w; - g65816_testn(gx816->regs.a.w & 0x8000); - g65816_testz(gx816->regs.a.w == 0); - g65816_incpc(1); -} - -/***************** - *** 0x5b: tcd *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_tcd(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.d = gx816->regs.a.w; - g65816_testn(gx816->regs.a.w & 0x8000); - g65816_testz(gx816->regs.a.w == 0); - g65816_incpc(1); -} - -/***************** - *** 0x1b: tcs *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_tcse(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.s = 0x0100 | gx816->regs.a.b; - g65816_incpc(1); -} - -void g65816_op_tcsn(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.s = gx816->regs.a.w; - g65816_incpc(1); -} - -/***************** - *** 0x7b: tdc *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_tdc(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.a.w = gx816->regs.d; - g65816_testn(gx816->regs.d & 0x8000); - g65816_testz(gx816->regs.d == 0); - g65816_incpc(1); -} - -/***************** - *** 0x3b: tsc *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_tsce(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.a.w = gx816->regs.s; - g65816_testn(gx816->regs.a.b & 0x80); - g65816_testz(gx816->regs.a.b == 0); - g65816_incpc(1); -} - -void g65816_op_tscn(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.a.w = gx816->regs.s; - g65816_testn(gx816->regs.a.w & 0x8000); - g65816_testz(gx816->regs.a.w == 0); - g65816_incpc(1); -} - -/***************** - *** 0xba: tsx *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_tsxb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.x = gx816->regs.s & 0xff; - g65816_testn(gx816->regs.s & 0x80); - g65816_testz((gx816->regs.s & 0xff) == 0); - g65816_incpc(1); -} - -void g65816_op_tsxw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.x = gx816->regs.s; - g65816_testn(gx816->regs.s & 0x8000); - g65816_testz(gx816->regs.s == 0); - g65816_incpc(1); -} - -/***************** - *** 0x8a: txa *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_txab(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.a.b = gx816->regs.x; - g65816_testn(gx816->regs.a.b & 0x80); - g65816_testz(gx816->regs.a.b == 0); - g65816_incpc(1); -} - -void g65816_op_txaw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.a.w = gx816->regs.x; - g65816_testn(gx816->regs.a.w & 0x8000); - g65816_testz(gx816->regs.a.w == 0); - g65816_incpc(1); -} - -/***************** - *** 0x9a: txs *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_txsb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.s = gx816->regs.x; - g65816_testn(gx816->regs.x & 0x80); - g65816_testz((gx816->regs.x & 0xff) == 0); - g65816_incpc(1); -} - -void g65816_op_txsw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.s = gx816->regs.x; - g65816_testn(gx816->regs.x & 0x8000); - g65816_testz(gx816->regs.x == 0); - g65816_incpc(1); -} - -/***************** - *** 0x9b: txy *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_txyb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.y = gx816->regs.x; - g65816_testn(gx816->regs.x & 0x80); - g65816_testz((gx816->regs.x & 0xff) == 0); - g65816_incpc(1); -} - -void g65816_op_txyw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.y = gx816->regs.x; - g65816_testn(gx816->regs.x & 0x8000); - g65816_testz(gx816->regs.x == 0); - g65816_incpc(1); -} - -/***************** - *** 0x98: tya *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_tyab(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.a.b = gx816->regs.y; - g65816_testn(gx816->regs.a.b & 0x80); - g65816_testz(gx816->regs.a.b == 0); - g65816_incpc(1); -} - -void g65816_op_tyaw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.a.w = gx816->regs.y; - g65816_testn(gx816->regs.a.w & 0x8000); - g65816_testz(gx816->regs.a.w == 0); - g65816_incpc(1); -} - -/***************** - *** 0xbb: tyx *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_tyxb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.x = gx816->regs.y; - g65816_testn(gx816->regs.y & 0x80); - g65816_testz((gx816->regs.y & 0xff) == 0); - g65816_incpc(1); -} - -void g65816_op_tyxw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->regs.x = gx816->regs.y; - g65816_testn(gx816->regs.y & 0x8000); - g65816_testz(gx816->regs.y == 0); - g65816_incpc(1); -} diff --git a/bsnes/cpu/g65816_ops_ora.cpp b/bsnes/cpu/g65816_ops_ora.cpp deleted file mode 100644 index 7134d999..00000000 --- a/bsnes/cpu/g65816_ops_ora.cpp +++ /dev/null @@ -1,504 +0,0 @@ -void g65816_flags_ora_b() { - g65816_testn(gx816->regs.a.b & 0x80); - g65816_testz(gx816->regs.a.b == 0); -} - -void g65816_flags_ora_w() { - g65816_testn(gx816->regs.a.w & 0x8000); - g65816_testz(gx816->regs.a.w == 0); -} - -/************************ - *** 0x09: ora #const *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; idl - [2a] pbr,pc+2 ; idh [1] -*/ - -void g65816_op_ora_constb(void) { - gx816->regs.a.b |= gx816->read_operand(1); //1,2 [op fetch] - - g65816_flags_ora_b(); - g65816_incpc(2); -} - -void g65816_op_ora_constw(void) { - gx816->regs.a.w |= gx816->read_operand(2); //1,2,2a [op fetch] - - g65816_flags_ora_w(); - g65816_incpc(3); -} - -/********************** - *** 0x0d: ora addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_ora_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->regs.a.b |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - - g65816_flags_ora_b(); - g65816_incpc(3); -} - -void g65816_op_ora_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->regs.a.p.l |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->regs.a.p.h |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - - g65816_flags_ora_w(); - g65816_incpc(3); -} - -/************************ - *** 0x1d: ora addr,x *** - ************************ -cycles: - [1 ] pbr,pc ; operora - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+xl ; io [4] - [4 ] dbr,aa+x ; data low - [4a] dbr,aa+x+1 ; data high [1] -*/ - -void g65816_op_ora_addrxb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->regs.a.b |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read] - - g65816_flags_ora_b(); - g65816_incpc(3); -} - -void g65816_op_ora_addrxw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->regs.a.p.l |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read low] - gx816->regs.a.p.h |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1); //4a [read high] - - g65816_flags_ora_w(); - g65816_incpc(3); -} - -/******************** - *** 0x05: ora dp *** - ******************** -cycles: - [1 ] pbr,pc ; operora - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] -*/ - -void g65816_op_ora_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->regs.a.b |= gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - - g65816_flags_ora_b(); - g65816_incpc(2); -} - -void g65816_op_ora_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->regs.a.p.l |= gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->regs.a.p.h |= gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - - g65816_flags_ora_w(); - g65816_incpc(2); -} - -/********************** - *** 0x12: ora (dp) *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] dbr,aa ; data low - [5a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_ora_idpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->regs.a.b |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //5 [read] - - g65816_flags_ora_b(); - g65816_incpc(2); -} - -void g65816_op_ora_idpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->regs.a.p.l |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //5 [read low] - gx816->regs.a.p.h |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //5a [read high] - - g65816_flags_ora_w(); - g65816_incpc(2); -} - -/********************** - *** 0x07: ora [dp] *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] 0,d+dp+2 ; aab - [6 ] aab,aa ; data low - [6a] aab,aa+1 ; data high [1] -*/ - -void g65816_op_ora_ildpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->regs.a.b |= gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //6 [read] - - g65816_flags_ora_b(); - g65816_incpc(2); -} - -void g65816_op_ora_ildpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->regs.a.p.l |= gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //6 [read low] - gx816->regs.a.p.h |= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + 1); //6a [read high] - - g65816_flags_ora_w(); - g65816_incpc(2); -} - -/********************** - *** 0x0f: ora long *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] pbr,pc+3 ; aab - [5 ] aab,aa ; data low - [5a] aab,aa+1 ; data high -*/ - -void g65816_op_ora_longb(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->regs.a.b |= gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //5 [read] - - g65816_flags_ora_b(); - g65816_incpc(4); -} - -void g65816_op_ora_longw(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->regs.a.p.l |= gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //5 [read] - gx816->regs.a.p.h |= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + 1); //5a [read] - - g65816_flags_ora_w(); - g65816_incpc(4); -} - -/************************ - *** 0x1f: ora long,x *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] pbr,pc+3 ; aab - [5 ] aab,aa+x ; data low - [5a] aab,aa+x+1 ; data high -*/ - -void g65816_op_ora_longxb(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->regs.a.b |= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x); //5 [read] - - g65816_flags_ora_b(); - g65816_incpc(4); -} - -void g65816_op_ora_longxw(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->regs.a.p.l |= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x); //5 [read] - gx816->regs.a.p.h |= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x + 1); //5a [read] - - g65816_flags_ora_w(); - g65816_incpc(4); -} - -/************************ - *** 0x19: ora addr,y *** - ************************ -cycles: - [1 ] pbr,pc ; operora - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+yl ; io [4] - [4 ] dbr,aa+y ; data low - [4a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_ora_addryb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //3a [pbc or p.x=0] - gx816->regs.a.b |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //4 [read] - - g65816_flags_ora_b(); - g65816_incpc(3); -} - -void g65816_op_ora_addryw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //3a [pbc or p.x=0] - gx816->regs.a.p.l |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //4 [read low] - gx816->regs.a.p.h |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //4a [read high] - - g65816_flags_ora_w(); - g65816_incpc(3); -} - -/********************** - *** 0x15: ora dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high -*/ - -void g65816_op_ora_dpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.a.b |= gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read] - - g65816_flags_ora_b(); - g65816_incpc(2); -} - -void g65816_op_ora_dpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.a.p.l |= gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read low] - gx816->regs.a.p.h |= gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //4a [read high] - - g65816_flags_ora_w(); - g65816_incpc(2); -} - -/************************ - *** 0x01: ora (dp,x) *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; aal - [5 ] 0,d+dp+x+1 ; aah - [6 ] dbr,aa ; data low - [6a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_ora_idpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //5 [aah] - gx816->regs.a.b |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //6 [read] - - g65816_flags_ora_b(); - g65816_incpc(2); -} - -void g65816_op_ora_idpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //5 [aah] - gx816->regs.a.p.l |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //6 [read low] - gx816->regs.a.p.h |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //6 [read high] - - g65816_flags_ora_w(); - g65816_incpc(2); -} - -/************************ - *** 0x11: ora (dp),y *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [4a] dbr,aah,aal+yl ; io [4] - [5 ] dbr,aa+y ; data low - [5a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_ora_idpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //4a [pbc or p.x=0] - gx816->regs.a.b |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //5 [read] - - g65816_flags_ora_b(); - g65816_incpc(2); -} - -void g65816_op_ora_idpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //4a [pbc or p.x=0] - gx816->regs.a.p.l |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //5 [read low] - gx816->regs.a.p.h |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //5a [read high] - - g65816_flags_ora_w(); - g65816_incpc(2); -} - -/************************ - *** 0x17: ora [dp],y *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] 0,d+dp+2 ; aab - [6 ] aab,aa+y ; data low - [6a] aab,aa+y+1 ; data high [1] -*/ - -void g65816_op_ora_ildpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->regs.a.b |= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y); //6 [read] - - g65816_flags_ora_b(); - g65816_incpc(2); -} - -void g65816_op_ora_ildpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->regs.a.p.l |= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y); //6 [read low] - gx816->regs.a.p.h |= gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y + 1); //6a [read high] - - g65816_flags_ora_w(); - g65816_incpc(2); -} - -/********************** - *** 0x03: ora sr,s *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; sp - [3 ] pbr,pc+1 ; io - [4 ] 0,s+sp ; data low - [4a] 0,s+sp+1 ; data high [1] -*/ - -void g65816_op_ora_srb(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.a.b |= gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [read] - - g65816_flags_ora_b(); - g65816_incpc(2); -} - -void g65816_op_ora_srw(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->regs.a.p.l |= gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [read low] - gx816->regs.a.p.h |= gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //4a [read high] - - g65816_flags_ora_w(); - g65816_incpc(2); -} - -/************************** - *** 0x13: ora (sr,s),y *** - ************************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; sp - [3 ] pbr,pc+1 ; io - [4 ] 0,s+sp ; aal - [5 ] 0,s+sp+1 ; aah - [6 ] 0,s+sp+1 ; io - [7 ] dbr,aa+y ; data low - [7a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_ora_isryb(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //5 [aah] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->regs.a.b |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //7 [read] - - g65816_flags_ora_b(); - g65816_incpc(2); -} - -void g65816_op_ora_isryw(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //5 [aah] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->regs.a.p.l |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //7 [read low] - gx816->regs.a.p.h |= gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //7a [read high] - - g65816_flags_ora_w(); - g65816_incpc(2); -} diff --git a/bsnes/cpu/g65816_ops_pc.cpp b/bsnes/cpu/g65816_ops_pc.cpp deleted file mode 100644 index f527fdab..00000000 --- a/bsnes/cpu/g65816_ops_pc.cpp +++ /dev/null @@ -1,497 +0,0 @@ -/********************** - *** 0x4c: jmp addr *** - ********************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; new pcl - [3] pbr,pc+2 ; new pch -*/ - -void g65816_op_jmp_addr(void) { - gx816->op.r.w = gx816->read_operand(2); //1-3 [op fetch] - - gx816->regs.pc = (gx816->regs.pc & 0xff0000) | gx816->op.r.w; -} - -/********************** - *** 0x5c: jml long *** - ********************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; new pcl - [3] pbr,pc+2 ; new pch - [4] pbr,pc+3 ; new pbr -*/ - -void g65816_op_jmp_long(void) { - gx816->regs.pc = gx816->read_operand(3); //1-4 [op fetch] -} - -/************************ - *** 0x6c: jmp (addr) *** - ************************ -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; aal - [3] pbr,pc+2 ; aah - [4] 0,aa ; new pcl - [5] 0,aa+1 ; new pch -*/ - -void g65816_op_jmp_iaddr(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_ADDR, gx816->op.aa.w); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_ADDR, gx816->op.aa.w + 1); //5 [read high] - - gx816->regs.pc = (gx816->regs.pc & 0xff0000) | gx816->op.r.w; -} - -/************************** - *** 0x7c: jmp (addr,x) *** - ************************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; aal - [3] pbr,pc+2 ; aah - [4] pbr,pc+2 ; io - [5] pbr,aa+x ; new pcl - [6] pbr,aa+x+1 ; new pch -*/ - -void g65816_op_jmp_iaddrx(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_PBR, gx816->op.aa.w + gx816->regs.x); //5 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_PBR, gx816->op.aa.w + gx816->regs.x + 1); //6 [read high] - - gx816->regs.pc = (gx816->regs.pc & 0xff0000) | gx816->op.r.w; -} - -/************************ - *** 0xdc: jmp [addr] *** - ************************ -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; aal - [3] pbr,pc+2 ; aah - [4] 0,aa ; new pcl - [5] 0,aa+1 ; new pch - [6] 0,aa+2 ; new pbr -*/ - -void g65816_op_jmp_iladdr(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_ADDR, gx816->op.aa.w); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_ADDR, gx816->op.aa.w + 1); //5 [read high] - gx816->op.r.p.b = gx816->op_read(OPMODE_ADDR, gx816->op.aa.w + 2); //6 [read bank] - - gx816->regs.pc = gx816->op.r.l; -} - -/********************** - *** 0x20: jsr addr *** - ********************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; new pcl - [3] pbr,pc+2 ; new pch - [4] pbr,pc+2 ; io - [5] 0,s ; pch - [6] 0,s-1 ; pcl -*/ - -void g65816_op_jsr_addr(void) { - gx816->op.r.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->regs.pc += 2; - gx816->stack_write(gx816->regs.pc >> 8); //5 [write high] - gx816->stack_write(gx816->regs.pc); //6 [write low] - - gx816->regs.pc = (gx816->regs.pc & 0xff0000) | gx816->op.r.w; -} - -/********************** - *** 0x22: jsl long *** - ********************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; new pcl - [3] pbr,pc+2 ; new pch - [4] 0,s ; pbr - [5] 0,s ; io - [6] pbr,pc+3 ; new pbr - [7] 0,s-1 ; pch - [8] 0,s-2 ; pcl -*/ - -void g65816_op_jsr_long(void) { - gx816->op.r.l = gx816->read_operand(3); //1-3,6 [op fetch] - gx816->regs.pc += 3; - gx816->stack_write(gx816->regs.pc >> 16); //4 [write bank] - snes_time->add_cpu_icycles(1); //5 [i/o] - gx816->stack_write(gx816->regs.pc >> 8); //7 [write high] - gx816->stack_write(gx816->regs.pc); //8 [write low] - - gx816->regs.pc = gx816->op.r.l; -} - -/************************** - *** 0xfc: jsr (addr,x) *** - ************************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; aal - [3] 0,s ; pch - [4] 0,s-1 ; pcl - [5] pbr,pc+2 ; aah - [6] pbr,pc+2 ; io - [7] pbr,aa+x ; new pcl - [8] pbr,aa+x+1 ; new pch -*/ - -void g65816_op_jsr_iaddrx(void) { - gx816->op.aa.w = gx816->read_operand(2); //1,2,5 [op fetch] - gx816->regs.pc += 2; - gx816->stack_write(gx816->regs.pc >> 8); //3 [write high] - gx816->stack_write(gx816->regs.pc); //4 [write low] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_PBR, gx816->op.aa.w + gx816->regs.x); //7 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_PBR, gx816->op.aa.w + gx816->regs.x + 1); //8 [read high] - - gx816->regs.pc = (gx816->regs.pc & 0xff0000) | gx816->op.r.w; -} - -/***************** - *** 0x40: rti *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io - [3] pbr,pc+1 ; io - [4] 0,s+1 ; p - [5] 0,s+2 ; new pcl - [6] 0,s+3 ; new pch - [7] 0,s+4 ; pbr [7] -*/ - -void g65816_op_rtie(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(2); //2,3 [i/o] - gx816->regs.p = gx816->stack_read(); //4 [read p] - gx816->op.r.p.l = gx816->stack_read(); //5 [read pcl] - gx816->op.r.p.h = gx816->stack_read(); //6 [read pch] - - gx816->regs.pc = (gx816->regs.pc & 0xff0000) | gx816->op.r.w; - if(gx816->regs.p & PF_X) { gx816->regs.x &= 0xff; gx816->regs.y &= 0xff; } - gx816->regs.p &= ~ PF_I; -} - -void g65816_op_rtin(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(2); //2,3 [i/o] - gx816->regs.p = gx816->stack_read(); //4 [read p] - gx816->op.r.p.l = gx816->stack_read(); //5 [read pcl] - gx816->op.r.p.h = gx816->stack_read(); //6 [read pch] - gx816->op.r.p.b = gx816->stack_read(); //7 [read pbr] - - gx816->regs.pc = gx816->op.r.l; - if(gx816->regs.p & PF_X) { gx816->regs.x &= 0xff; gx816->regs.y &= 0xff; } - gx816->regs.p &= ~ PF_I; -} - -/***************** - *** 0x60: rts *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io - [3] pbr,pc+1 ; io - [4] 0,s+1 ; pcl - [5] 0,s+2 ; pch - [6] 0,s+2 ; io -*/ - -void g65816_op_rts(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(2); //2,3 [i/o] - gx816->op.r.p.l = gx816->stack_read(); //4 [read low] - gx816->op.r.p.h = gx816->stack_read(); //5 [read high] - snes_time->add_cpu_icycles(1); //6 [i/o] - - gx816->regs.pc = (gx816->regs.pc & 0xff0000) | gx816->op.r.w; - g65816_incpc(1); -} - -/***************** - *** 0x6b: rtl *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io - [3] pbr,pc+1 ; io - [4] 0,s+1 ; pcl - [5] 0,s+2 ; pch - [6] 0,s+3 ; pbr -*/ - -void g65816_op_rtl(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(2); //2,3 [i/o] - gx816->op.r.p.l = gx816->stack_read(); //4 [read low] - gx816->op.r.p.h = gx816->stack_read(); //5 [read high] - gx816->op.r.p.b = gx816->stack_read(); //6 [read bank] - - gx816->regs.pc = gx816->op.r.l; - g65816_incpc(1); -} - -/********************** - *** 0x80: bra near *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; offset - [2a] pbr,pc+1 ; io [5] - [2b] pbr,pc+1 ; io [6] -*/ - -void g65816_op_bra(void) { -word r; - gx816->op.r.b = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //2a [i/o] - r = gx816->regs.pc + (signed char)gx816->op.r.b; - if(gx816->regs.e == true) { - if((gx816->regs.pc & 0xff00) != ((r + 2) & 0xff00)) { - snes_time->add_cpu_icycles(1); //2b [i/o] - } - } - gx816->regs.pc = (gx816->regs.pc & 0xff0000) | r; - g65816_incpc(2); -} - -/********************* - *** 0x82: brl far *** - ********************* -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; offset low - [3] pbr,pc+2 ; offset high - [4] pbr,pc+2 ; io -*/ - -void g65816_op_brl(void) { -word r; - gx816->op.r.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //4 [i/o] - r = gx816->regs.pc + (signed short)gx816->op.r.w; - gx816->regs.pc = (gx816->regs.pc & 0xff0000) | r; - g65816_incpc(3); -} - -/********************** - *** 0x90: bcc near *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; offset - [2a] pbr,pc+1 ; io [5] - [2b] pbr,pc+1 ; io [6] -*/ - -void g65816_op_bcc(void) { -word r; - gx816->op.r.b = gx816->read_operand(1); //1,2 [op fetch] - if(!(gx816->regs.p & PF_C)) { - snes_time->add_cpu_icycles(1); //2a [i/o] - r = gx816->regs.pc + (signed char)gx816->op.r.b; - if(gx816->regs.e == true) { - if((gx816->regs.pc & 0xff00) != ((r + 2) & 0xff00)) { - snes_time->add_cpu_icycles(1); //2b [i/o] - } - } - gx816->regs.pc = (gx816->regs.pc & 0xff0000) | r; - } - g65816_incpc(2); -} - -/********************** - *** 0xb0: bcs near *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; offset - [2a] pbr,pc+1 ; io [5] - [2b] pbr,pc+1 ; io [6] -*/ - -void g65816_op_bcs(void) { -word r; - gx816->op.r.b = gx816->read_operand(1); //1,2 [op fetch] - if(gx816->regs.p & PF_C) { - snes_time->add_cpu_icycles(1); //2a [i/o] - r = gx816->regs.pc + (signed char)gx816->op.r.b; - if(gx816->regs.e == true) { - if((gx816->regs.pc & 0xff00) != ((r + 2) & 0xff00)) { - snes_time->add_cpu_icycles(1); //2b [i/o] - } - } - gx816->regs.pc = (gx816->regs.pc & 0xff0000) | r; - } - g65816_incpc(2); -} - -/********************** - *** 0xd0: bne near *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; offset - [2a] pbr,pc+1 ; io [5] - [2b] pbr,pc+1 ; io [6] -*/ - -void g65816_op_bne(void) { -word r; - gx816->op.r.b = gx816->read_operand(1); //1,2 [op fetch] - if(!(gx816->regs.p & PF_Z)) { - snes_time->add_cpu_icycles(1); //2a [i/o] - r = gx816->regs.pc + (signed char)gx816->op.r.b; - if(gx816->regs.e == true) { - if((gx816->regs.pc & 0xff00) != ((r + 2) & 0xff00)) { - snes_time->add_cpu_icycles(1); //2b [i/o] - } - } - gx816->regs.pc = (gx816->regs.pc & 0xff0000) | r; - } - g65816_incpc(2); -} - -/********************** - *** 0xf0: beq near *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; offset - [2a] pbr,pc+1 ; io [5] - [2b] pbr,pc+1 ; io [6] -*/ - -void g65816_op_beq(void) { -word r; - gx816->op.r.b = gx816->read_operand(1); //1,2 [op fetch] - if(gx816->regs.p & PF_Z) { - snes_time->add_cpu_icycles(1); //2a [i/o] - r = gx816->regs.pc + (signed char)gx816->op.r.b; - if(gx816->regs.e == true) { - if((gx816->regs.pc & 0xff00) != ((r + 2) & 0xff00)) { - snes_time->add_cpu_icycles(1); //2b [i/o] - } - } - gx816->regs.pc = (gx816->regs.pc & 0xff0000) | r; - } - g65816_incpc(2); -} - -/********************** - *** 0x10: bpl near *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; offset - [2a] pbr,pc+1 ; io [5] - [2b] pbr,pc+1 ; io [6] -*/ - -void g65816_op_bpl(void) { -word r; - gx816->op.r.b = gx816->read_operand(1); //1,2 [op fetch] - if(!(gx816->regs.p & PF_N)) { - snes_time->add_cpu_icycles(1); //2a [i/o] - r = gx816->regs.pc + (signed char)gx816->op.r.b; - if(gx816->regs.e == true) { - if((gx816->regs.pc & 0xff00) != ((r + 2) & 0xff00)) { - snes_time->add_cpu_icycles(1); //2b [i/o] - } - } - gx816->regs.pc = (gx816->regs.pc & 0xff0000) | r; - } - g65816_incpc(2); -} - -/********************** - *** 0x30: bmi near *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; offset - [2a] pbr,pc+1 ; io [5] - [2b] pbr,pc+1 ; io [6] -*/ - -void g65816_op_bmi(void) { -word r; - gx816->op.r.b = gx816->read_operand(1); //1,2 [op fetch] - if(gx816->regs.p & PF_N) { - snes_time->add_cpu_icycles(1); //2a [i/o] - r = gx816->regs.pc + (signed char)gx816->op.r.b; - if(gx816->regs.e == true) { - if((gx816->regs.pc & 0xff00) != ((r + 2) & 0xff00)) { - snes_time->add_cpu_icycles(1); //2b [i/o] - } - } - gx816->regs.pc = (gx816->regs.pc & 0xff0000) | r; - } - g65816_incpc(2); -} - -/********************** - *** 0x50: bvc near *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; offset - [2a] pbr,pc+1 ; io [5] - [2b] pbr,pc+1 ; io [6] -*/ - -void g65816_op_bvc(void) { -word r; - gx816->op.r.b = gx816->read_operand(1); //1,2 [op fetch] - if(!(gx816->regs.p & PF_V)) { - snes_time->add_cpu_icycles(1); //2a [i/o] - r = gx816->regs.pc + (signed char)gx816->op.r.b; - if(gx816->regs.e == true) { - if((gx816->regs.pc & 0xff00) != ((r + 2) & 0xff00)) { - snes_time->add_cpu_icycles(1); //2b [i/o] - } - } - gx816->regs.pc = (gx816->regs.pc & 0xff0000) | r; - } - g65816_incpc(2); -} - -/********************** - *** 0x70: bvs near *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; offset - [2a] pbr,pc+1 ; io [5] - [2b] pbr,pc+1 ; io [6] -*/ - -void g65816_op_bvs(void) { -word r; - gx816->op.r.b = gx816->read_operand(1); //1,2 [op fetch] - if(gx816->regs.p & PF_V) { - snes_time->add_cpu_icycles(1); //2a [i/o] - r = gx816->regs.pc + (signed char)gx816->op.r.b; - if(gx816->regs.e == true) { - if((gx816->regs.pc & 0xff00) != ((r + 2) & 0xff00)) { - snes_time->add_cpu_icycles(1); //2b [i/o] - } - } - gx816->regs.pc = (gx816->regs.pc & 0xff0000) | r; - } - g65816_incpc(2); -} diff --git a/bsnes/cpu/g65816_ops_sbc.cpp b/bsnes/cpu/g65816_ops_sbc.cpp deleted file mode 100644 index 1f467f3a..00000000 --- a/bsnes/cpu/g65816_ops_sbc.cpp +++ /dev/null @@ -1,526 +0,0 @@ -void g65816_flags_sbc_b() { -int r = gx816->regs.a.b - gx816->op.r.b - !(gx816->regs.p & PF_C); -//bcd - if(gx816->regs.p & PF_D) { - if(((r ) & 15) > 9)r -= 6; - if(((r >> 4) & 15) > 9)r -= 6 << 4; - } - - g65816_testn(r & 0x80); - g65816_testv((gx816->regs.a.b ^ gx816->op.r.b) & (gx816->regs.a.b ^ (byte)r) & 0x80); - g65816_testz((byte)r == 0); - g65816_testc(r >= 0); - gx816->regs.a.b = r; -} - -void g65816_flags_sbc_w() { -int r = gx816->regs.a.w - gx816->op.r.w - !(gx816->regs.p & PF_C); -//bcd - if(gx816->regs.p & PF_D) { - if(((r ) & 15) > 9)r -= 6; - if(((r >> 4) & 15) > 9)r -= 6 << 4; - if(((r >> 8) & 15) > 9)r -= 6 << 8; - if(((r >> 12) & 15) > 9)r -= 6 << 12; - } - - g65816_testn(r & 0x8000); - g65816_testv((gx816->regs.a.w ^ gx816->op.r.w) & (gx816->regs.a.w ^ (word)r) & 0x8000); - g65816_testz((word)r == 0); - g65816_testc(r >= 0); - gx816->regs.a.w = r; -} - -/************************ - *** 0xe9: sbc #const *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; idl - [2a] pbr,pc+2 ; idh [1] -*/ - -void g65816_op_sbc_constb(void) { - gx816->op.r.b = gx816->read_operand(1); //1,2 [op fetch] - - g65816_flags_sbc_b(); - g65816_incpc(2); -} - -void g65816_op_sbc_constw(void) { - gx816->op.r.w = gx816->read_operand(2); //1,2,2a [op fetch] - - g65816_flags_sbc_w(); - g65816_incpc(3); -} - -/********************** - *** 0xed: sbc addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_sbc_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - - g65816_flags_sbc_b(); - g65816_incpc(3); -} - -void g65816_op_sbc_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - - g65816_flags_sbc_w(); - g65816_incpc(3); -} - -/************************ - *** 0xfd: sbc addr,x *** - ************************ -cycles: - [1 ] pbr,pc ; opersbc - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+xl ; io [4] - [4 ] dbr,aa+x ; data low - [4a] dbr,aa+x+1 ; data high [1] -*/ - -void g65816_op_sbc_addrxb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read] - - g65816_flags_sbc_b(); - g65816_incpc(3); -} - -void g65816_op_sbc_addrxw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.x); //3a [pbc or p.x=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1); //4a [read high] - - g65816_flags_sbc_w(); - g65816_incpc(3); -} - -/******************** - *** 0xe5: sbc dp *** - ******************** -cycles: - [1 ] pbr,pc ; opersbc - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] -*/ - -void g65816_op_sbc_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - - g65816_flags_sbc_b(); - g65816_incpc(2); -} - -void g65816_op_sbc_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - - g65816_flags_sbc_w(); - g65816_incpc(2); -} - -/********************** - *** 0xf2: sbc (dp) *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] dbr,aa ; data low - [5a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_sbc_idpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //5 [read] - - g65816_flags_sbc_b(); - g65816_incpc(2); -} - -void g65816_op_sbc_idpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //5 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //5a [read high] - - g65816_flags_sbc_w(); - g65816_incpc(2); -} - -/********************** - *** 0xe7: sbc [dp] *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] 0,d+dp+2 ; aab - [6 ] aab,aa ; data low - [6a] aab,aa+1 ; data high [1] -*/ - -void g65816_op_sbc_ildpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->op.r.b = gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //6 [read] - - g65816_flags_sbc_b(); - g65816_incpc(2); -} - -void g65816_op_sbc_ildpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->op.r.p.l = gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //6 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + 1); //6a [read high] - - g65816_flags_sbc_w(); - g65816_incpc(2); -} - -/********************** - *** 0xef: sbc long *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] pbr,pc+3 ; aab - [5 ] aab,aa ; data low - [5a] aab,aa+1 ; data high -*/ - -void g65816_op_sbc_longb(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //5 [read] - - g65816_flags_sbc_b(); - g65816_incpc(4); -} - -void g65816_op_sbc_longw(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_LONG, gx816->op.aa.l); //5 [read] - gx816->op.r.p.h = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + 1); //5a [read] - - g65816_flags_sbc_w(); - g65816_incpc(4); -} - -/************************ - *** 0xff: sbc long,x *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] pbr,pc+3 ; aab - [5 ] aab,aa+x ; data low - [5a] aab,aa+x+1 ; data high -*/ - -void g65816_op_sbc_longxb(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x); //5 [read] - - g65816_flags_sbc_b(); - g65816_incpc(4); -} - -void g65816_op_sbc_longxw(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x); //5 [read] - gx816->op.r.p.h = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x + 1); //5a [read] - - g65816_flags_sbc_w(); - g65816_incpc(4); -} - -/************************ - *** 0xf9: sbc addr,y *** - ************************ -cycles: - [1 ] pbr,pc ; opersbc - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+yl ; io [4] - [4 ] dbr,aa+y ; data low - [4a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_sbc_addryb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //3a [pbc or p.x=0] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //4 [read] - - g65816_flags_sbc_b(); - g65816_incpc(3); -} - -void g65816_op_sbc_addryw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //3a [pbc or p.x=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //4a [read high] - - g65816_flags_sbc_w(); - g65816_incpc(3); -} - -/********************** - *** 0xf5: sbc dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high -*/ - -void g65816_op_sbc_dpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read] - - g65816_flags_sbc_b(); - g65816_incpc(2); -} - -void g65816_op_sbc_dpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //4a [read high] - - g65816_flags_sbc_w(); - g65816_incpc(2); -} - -/************************ - *** 0xe1: sbc (dp,x) *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; aal - [5 ] 0,d+dp+x+1 ; aah - [6 ] dbr,aa ; data low - [6a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_sbc_idpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //5 [aah] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //6 [read] - - g65816_flags_sbc_b(); - g65816_incpc(2); -} - -void g65816_op_sbc_idpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //5 [aah] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //6 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //6 [read high] - - g65816_flags_sbc_w(); - g65816_incpc(2); -} - -/************************ - *** 0xf1: sbc (dp),y *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [4a] dbr,aah,aal+yl ; io [4] - [5 ] dbr,aa+y ; data low - [5a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_sbc_idpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //4a [pbc or p.x=0] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //5 [read] - - g65816_flags_sbc_b(); - g65816_incpc(2); -} - -void g65816_op_sbc_idpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op_cond(4, gx816->op.aa.w, gx816->op.aa.w + gx816->regs.y); //4a [pbc or p.x=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //5 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //5a [read high] - - g65816_flags_sbc_w(); - g65816_incpc(2); -} - -/************************ - *** 0xf7: sbc [dp],y *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] 0,d+dp+2 ; aab - [6 ] aab,aa+y ; data low - [6a] aab,aa+y+1 ; data high [1] -*/ - -void g65816_op_sbc_ildpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->op.r.b = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y); //6 [read] - - g65816_flags_sbc_b(); - g65816_incpc(2); -} - -void g65816_op_sbc_ildpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->op.r.p.l = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y); //6 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y + 1); //6a [read high] - - g65816_flags_sbc_w(); - g65816_incpc(2); -} - -/********************** - *** 0xe3: sbc sr,s *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; sp - [3 ] pbr,pc+1 ; io - [4 ] 0,s+sp ; data low - [4a] 0,s+sp+1 ; data high [1] -*/ - -void g65816_op_sbc_srb(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [read] - - g65816_flags_sbc_b(); - g65816_incpc(2); -} - -void g65816_op_sbc_srw(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //4a [read high] - - g65816_flags_sbc_w(); - g65816_incpc(2); -} - -/************************** - *** 0xf3: sbc (sr,s),y *** - ************************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; sp - [3 ] pbr,pc+1 ; io - [4 ] 0,s+sp ; aal - [5 ] 0,s+sp+1 ; aah - [6 ] 0,s+sp+1 ; io - [7 ] dbr,aa+y ; data low - [7a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_sbc_isryb(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //5 [aah] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //7 [read] - - g65816_flags_sbc_b(); - g65816_incpc(2); -} - -void g65816_op_sbc_isryw(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //5 [aah] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y); //7 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1); //7a [read high] - - g65816_flags_sbc_w(); - g65816_incpc(2); -} diff --git a/bsnes/cpu/g65816_ops_shift.cpp b/bsnes/cpu/g65816_ops_shift.cpp deleted file mode 100644 index a71f06ec..00000000 --- a/bsnes/cpu/g65816_ops_shift.cpp +++ /dev/null @@ -1,873 +0,0 @@ -/***************** - *** 0x0a: asl *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_aslb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - g65816_testc(gx816->regs.a.b & 0x80); - gx816->regs.a.b <<= 1; - g65816_testn(gx816->regs.a.b & 0x80); - g65816_testz(gx816->regs.a.b == 0); - g65816_incpc(1); -} - -void g65816_op_aslw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - g65816_testc(gx816->regs.a.w & 0x8000); - gx816->regs.a.w <<= 1; - g65816_testn(gx816->regs.a.w & 0x8000); - g65816_testz(gx816->regs.a.w == 0); - g65816_incpc(1); -} - -/********************** - *** 0x0e: asl addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] - [5 ] dbr,aa+1 ; io - [6a] dbr,aa+1 ; data high [1] - [6 ] dbr,aa ; data low -*/ - -void g65816_op_asl_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testc(gx816->op.r.b & 0x80); - gx816->op.r.b <<= 1; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->op.r.b); //6 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(3); -} - -void g65816_op_asl_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testc(gx816->op.r.w & 0x8000); - gx816->op.r.w <<= 1; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + 1, gx816->op.r.p.h); //6a [write high] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->op.r.p.l); //6 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(3); -} - -/************************ - *** 0x1e: asl addr,x *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aah,aal+xl ; io - [5 ] dbr,aa+x ; data low - [5a] dbr,aa+x+1 ; data high [1] - [6 ] dbr,aa+x+1 ; io - [7a] dbr,aa+x+1 ; data high [1] - [7 ] dbr,aa+x ; data low -*/ - -void g65816_op_asl_addrxb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //5 [read] - snes_time->add_cpu_icycles(1); //6 [i/o] - g65816_testc(gx816->op.r.b & 0x80); - gx816->op.r.b <<= 1; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x, gx816->op.r.b); //7 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(3); -} - -void g65816_op_asl_addrxw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //5 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1); //5a [read high] - snes_time->add_cpu_icycles(1); //6 [i/o] - g65816_testc(gx816->op.r.w & 0x8000); - gx816->op.r.w <<= 1; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1, gx816->op.r.p.h); //7a [write high] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x, gx816->op.r.p.l); //7 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(3); -} - -/******************** - *** 0x06: asl dp *** - ******************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] - [4 ] 0,d+dp+1 ; io - [5a] 0,d+dp+1 ; data high [1] - [5 ] 0,d+dp ; data low -*/ - -void g65816_op_asl_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - snes_time->add_cpu_icycles(1); //4 [i/o] - g65816_testc(gx816->op.r.b & 0x80); - gx816->op.r.b <<= 1; - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->op.r.b); //5 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(2); -} - -void g65816_op_asl_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - snes_time->add_cpu_icycles(1); //4 [i/o] - g65816_testc(gx816->op.r.w & 0x8000); - gx816->op.r.w <<= 1; - gx816->op_write(OPMODE_DP, gx816->op.dp + 1, gx816->op.r.p.h); //5a [write high] - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->op.r.p.l); //5 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(2); -} - -/********************** - *** 0x16: asl dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high [1] - [5 ] 0,d+dp+x+1 ; io - [6a] 0,d+dp+x+1 ; data high [1] - [6 ] 0,d+dp+x ; data low -*/ - -void g65816_op_asl_dpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testc(gx816->op.r.b & 0x80); - gx816->op.r.b <<= 1; - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, gx816->op.r.b); //6 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(2); -} - -void g65816_op_asl_dpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //4a [read high] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testc(gx816->op.r.w & 0x8000); - gx816->op.r.w <<= 1; - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1, gx816->op.r.p.h); //6a [write high] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, gx816->op.r.p.l); //6 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(2); -} - -/***************** - *** 0x4a: lsr *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_lsrb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - g65816_testc(gx816->regs.a.b & 0x01); - gx816->regs.a.b >>= 1; - g65816_clrn(); - g65816_testz(gx816->regs.a.b == 0); - g65816_incpc(1); -} - -void g65816_op_lsrw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - g65816_testc(gx816->regs.a.w & 0x0001); - gx816->regs.a.w >>= 1; - g65816_clrn(); - g65816_testz(gx816->regs.a.w == 0); - g65816_incpc(1); -} - - -/********************** - *** 0x4e: lsr addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] - [5 ] dbr,aa+1 ; io - [6a] dbr,aa+1 ; data high [1] - [6 ] dbr,aa ; data low -*/ - -void g65816_op_lsr_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testc(gx816->op.r.b & 0x01); - gx816->op.r.b >>= 1; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->op.r.b); //6 [write] - - g65816_clrn(); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(3); -} - -void g65816_op_lsr_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testc(gx816->op.r.w & 0x0001); - gx816->op.r.w >>= 1; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + 1, gx816->op.r.p.h); //6a [write high] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->op.r.p.l); //6 [write low] - - g65816_clrn(); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(3); -} - -/************************ - *** 0x5e: lsr addr,x *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aah,aal+xl ; io - [5 ] dbr,aa+x ; data low - [5a] dbr,aa+x+1 ; data high [1] - [6 ] dbr,aa+x+1 ; io - [7a] dbr,aa+x+1 ; data high [1] - [7 ] dbr,aa+x ; data low -*/ - -void g65816_op_lsr_addrxb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //5 [read] - snes_time->add_cpu_icycles(1); //6 [i/o] - g65816_testc(gx816->op.r.b & 0x01); - gx816->op.r.b >>= 1; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x, gx816->op.r.b); //7 [write] - - g65816_clrn(); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(3); -} - -void g65816_op_lsr_addrxw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //5 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1); //5a [read high] - snes_time->add_cpu_icycles(1); //6 [i/o] - g65816_testc(gx816->op.r.w & 0x0001); - gx816->op.r.w >>= 1; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1, gx816->op.r.p.h); //7a [write high] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x, gx816->op.r.p.l); //7 [write low] - - g65816_clrn(); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(3); -} - -/******************** - *** 0x46: lsr dp *** - ******************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] - [4 ] 0,d+dp+1 ; io - [5a] 0,d+dp+1 ; data high [1] - [5 ] 0,d+dp ; data low -*/ - -void g65816_op_lsr_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - snes_time->add_cpu_icycles(1); //4 [i/o] - g65816_testc(gx816->op.r.b & 0x01); - gx816->op.r.b >>= 1; - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->op.r.b); //5 [write] - - g65816_clrn(); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(2); -} - -void g65816_op_lsr_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - snes_time->add_cpu_icycles(1); //4 [i/o] - g65816_testc(gx816->op.r.w & 0x0001); - gx816->op.r.w >>= 1; - gx816->op_write(OPMODE_DP, gx816->op.dp + 1, gx816->op.r.p.h); //5a [write high] - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->op.r.p.l); //5 [write low] - - g65816_clrn(); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(2); -} - -/********************** - *** 0x56: lsr dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high [1] - [5 ] 0,d+dp+x+1 ; io - [6a] 0,d+dp+x+1 ; data high [1] - [6 ] 0,d+dp+x ; data low -*/ - -void g65816_op_lsr_dpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testc(gx816->op.r.b & 0x80); - gx816->op.r.b >>= 1; - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, gx816->op.r.b); //6 [write] - - g65816_clrn(); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(2); -} - -void g65816_op_lsr_dpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //4a [read high] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testc(gx816->op.r.w & 0x001); - gx816->op.r.w >>= 1; - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1, gx816->op.r.p.h); //6a [write high] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, gx816->op.r.p.l); //6 [write low] - - g65816_clrn(); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(2); -} - -/***************** - *** 0x2a: rol *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_rolb(void) { -byte c = (gx816->regs.p & PF_C)?0x01:0x00; - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - g65816_testc(gx816->regs.a.b & 0x80); - gx816->regs.a.b <<= 1; - gx816->regs.a.b |= c; - g65816_testn(gx816->regs.a.b & 0x80); - g65816_testz(gx816->regs.a.b == 0); - g65816_incpc(1); -} - -void g65816_op_rolw(void) { -word c = (gx816->regs.p & PF_C)?0x0001:0x0000; - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - g65816_testc(gx816->regs.a.w & 0x8000); - gx816->regs.a.w <<= 1; - gx816->regs.a.w |= c; - g65816_testn(gx816->regs.a.w & 0x8000); - g65816_testz(gx816->regs.a.w == 0); - g65816_incpc(1); -} - -/********************** - *** 0x2e: rol addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] - [5 ] dbr,aa+1 ; io - [6a] dbr,aa+1 ; data high [1] - [6 ] dbr,aa ; data low -*/ - -void g65816_op_rol_addrb(void) { -byte c = (gx816->regs.p & PF_C)?0x01:0x00; - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testc(gx816->op.r.b & 0x80); - gx816->op.r.b <<= 1; - gx816->op.r.b |= c; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->op.r.b); //6 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(3); -} - -void g65816_op_rol_addrw(void) { -word c = (gx816->regs.p & PF_C)?0x0001:0x0000; - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testc(gx816->op.r.w & 0x8000); - gx816->op.r.w <<= 1; - gx816->op.r.w |= c; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + 1, gx816->op.r.p.h); //6a [write high] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->op.r.p.l); //6 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(3); -} - -/************************ - *** 0x3e: rol addr,x *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aah,aal+xl ; io - [5 ] dbr,aa+x ; data low - [5a] dbr,aa+x+1 ; data high [1] - [6 ] dbr,aa+x+1 ; io - [7a] dbr,aa+x+1 ; data high [1] - [7 ] dbr,aa+x ; data low -*/ - -void g65816_op_rol_addrxb(void) { -byte c = (gx816->regs.p & PF_C)?0x01:0x00; - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //5 [read] - snes_time->add_cpu_icycles(1); //6 [i/o] - g65816_testc(gx816->op.r.b & 0x80); - gx816->op.r.b <<= 1; - gx816->op.r.b |= c; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x, gx816->op.r.b); //7 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(3); -} - -void g65816_op_rol_addrxw(void) { -word c = (gx816->regs.p & PF_C)?0x0001:0x0000; - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //5 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1); //5a [read high] - snes_time->add_cpu_icycles(1); //6 [i/o] - g65816_testc(gx816->op.r.w & 0x8000); - gx816->op.r.w <<= 1; - gx816->op.r.w |= c; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1, gx816->op.r.p.h); //7a [write high] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x, gx816->op.r.p.l); //7 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(3); -} - -/******************** - *** 0x26: rol dp *** - ******************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] - [4 ] 0,d+dp+1 ; io - [5a] 0,d+dp+1 ; data high [1] - [5 ] 0,d+dp ; data low -*/ - -void g65816_op_rol_dpb(void) { -byte c = (gx816->regs.p & PF_C)?0x01:0x00; - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - snes_time->add_cpu_icycles(1); //4 [i/o] - g65816_testc(gx816->op.r.b & 0x80); - gx816->op.r.b <<= 1; - gx816->op.r.b |= c; - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->op.r.b); //5 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(2); -} - -void g65816_op_rol_dpw(void) { -word c = (gx816->regs.p & PF_C)?0x0001:0x0000; - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - snes_time->add_cpu_icycles(1); //4 [i/o] - g65816_testc(gx816->op.r.w & 0x8000); - gx816->op.r.w <<= 1; - gx816->op.r.w |= c; - gx816->op_write(OPMODE_DP, gx816->op.dp + 1, gx816->op.r.p.h); //5a [write high] - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->op.r.p.l); //5 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(2); -} - -/********************** - *** 0x36: rol dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high [1] - [5 ] 0,d+dp+x+1 ; io - [6a] 0,d+dp+x+1 ; data high [1] - [6 ] 0,d+dp+x ; data low -*/ - -void g65816_op_rol_dpxb(void) { -byte c = (gx816->regs.p & PF_C)?0x01:0x00; - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testc(gx816->op.r.b & 0x80); - gx816->op.r.b <<= 1; - gx816->op.r.b |= c; - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, gx816->op.r.b); //6 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(2); -} - -void g65816_op_rol_dpxw(void) { -word c = (gx816->regs.p & PF_C)?0x0001:0x0000; - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //4a [read high] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testc(gx816->op.r.w & 0x8000); - gx816->op.r.w <<= 1; - gx816->op.r.w |= c; - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1, gx816->op.r.p.h); //6a [write high] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, gx816->op.r.p.l); //6 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(2); -} - -/***************** - *** 0x6a: ror *** - ***************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; io -*/ - -void g65816_op_rorb(void) { -byte c = (gx816->regs.p & PF_C)?0x80:0x00; - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - g65816_testc(gx816->regs.a.b & 0x01); - gx816->regs.a.b >>= 1; - gx816->regs.a.b |= c; - g65816_testn(gx816->regs.a.b & 0x80); - g65816_testz(gx816->regs.a.b == 0); - g65816_incpc(1); -} - -void g65816_op_rorw(void) { -word c = (gx816->regs.p & PF_C)?0x8000:0x0000; - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - - g65816_testc(gx816->regs.a.w & 0x0001); - gx816->regs.a.w >>= 1; - gx816->regs.a.w |= c; - g65816_testn(gx816->regs.a.w & 0x8000); - g65816_testz(gx816->regs.a.w == 0); - g65816_incpc(1); -} - - -/********************** - *** 0x6e: ror addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] - [5 ] dbr,aa+1 ; io - [6a] dbr,aa+1 ; data high [1] - [6 ] dbr,aa ; data low -*/ - -void g65816_op_ror_addrb(void) { -byte c = (gx816->regs.p & PF_C)?0x80:0x00; - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testc(gx816->op.r.b & 0x01); - gx816->op.r.b >>= 1; - gx816->op.r.b |= c; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->op.r.b); //6 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(3); -} - -void g65816_op_ror_addrw(void) { -word c = (gx816->regs.p & PF_C)?0x8000:0x0000; - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + 1); //4a [read high] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testc(gx816->op.r.w & 0x0001); - gx816->op.r.w >>= 1; - gx816->op.r.w |= c; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + 1, gx816->op.r.p.h); //6a [write high] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->op.r.p.l); //6 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(3); -} - -/************************ - *** 0x7e: ror addr,x *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aah,aal+xl ; io - [5 ] dbr,aa+x ; data low - [5a] dbr,aa+x+1 ; data high [1] - [6 ] dbr,aa+x+1 ; io - [7a] dbr,aa+x+1 ; data high [1] - [7 ] dbr,aa+x ; data low -*/ - -void g65816_op_ror_addrxb(void) { -byte c = (gx816->regs.p & PF_C)?0x80:0x00; - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //5 [read] - snes_time->add_cpu_icycles(1); //6 [i/o] - g65816_testc(gx816->op.r.b & 0x01); - gx816->op.r.b >>= 1; - gx816->op.r.b |= c; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x, gx816->op.r.b); //7 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(3); -} - -void g65816_op_ror_addrxw(void) { -word c = (gx816->regs.p & PF_C)?0x8000:0x0000; - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //4 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x); //5 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1); //5a [read high] - snes_time->add_cpu_icycles(1); //6 [i/o] - g65816_testc(gx816->op.r.w & 0x0001); - gx816->op.r.w >>= 1; - gx816->op.r.w |= c; - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1, gx816->op.r.p.h); //7a [write high] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x, gx816->op.r.p.l); //7 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(3); -} - -/******************** - *** 0x66: ror dp *** - ******************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] - [4 ] 0,d+dp+1 ; io - [5a] 0,d+dp+1 ; data high [1] - [5 ] 0,d+dp ; data low -*/ - -void g65816_op_ror_dpb(void) { -byte c = (gx816->regs.p & PF_C)?0x80:0x00; - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read] - snes_time->add_cpu_icycles(1); //4 [i/o] - g65816_testc(gx816->op.r.b & 0x01); - gx816->op.r.b >>= 1; - gx816->op.r.b |= c; - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->op.r.b); //5 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(2); -} - -void g65816_op_ror_dpw(void) { -word c = (gx816->regs.p & PF_C)?0x8000:0x0000; - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //3a [read high] - snes_time->add_cpu_icycles(1); //4 [i/o] - g65816_testc(gx816->op.r.w & 0x0001); - gx816->op.r.w >>= 1; - gx816->op.r.w |= c; - gx816->op_write(OPMODE_DP, gx816->op.dp + 1, gx816->op.r.p.h); //5a [write high] - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->op.r.p.l); //5 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(2); -} - -/********************** - *** 0x76: ror dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high [1] - [5 ] 0,d+dp+x+1 ; io - [6a] 0,d+dp+x+1 ; data high [1] - [6 ] 0,d+dp+x ; data low -*/ - -void g65816_op_ror_dpxb(void) { -byte c = (gx816->regs.p & PF_C)?0x80:0x00; - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.b = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testc(gx816->op.r.b & 0x80); - gx816->op.r.b >>= 1; - gx816->op.r.b |= c; - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, gx816->op.r.b); //6 [write] - - g65816_testn(gx816->op.r.b & 0x80); - g65816_testz(gx816->op.r.b == 0); - g65816_incpc(2); -} - -void g65816_op_ror_dpxw(void) { -word c = (gx816->regs.p & PF_C)?0x8000:0x0000; - gx816->op.dp = gx816->read_operand(1); //1-2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.r.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [read low] - gx816->op.r.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //4a [read high] - snes_time->add_cpu_icycles(1); //5 [i/o] - g65816_testc(gx816->op.r.w & 0x001); - gx816->op.r.w >>= 1; - gx816->op.r.w |= c; - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1, gx816->op.r.p.h); //6a [write high] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, gx816->op.r.p.l); //6 [write low] - - g65816_testn(gx816->op.r.w & 0x8000); - g65816_testz(gx816->op.r.w == 0); - g65816_incpc(2); -} diff --git a/bsnes/cpu/g65816_ops_sta.cpp b/bsnes/cpu/g65816_ops_sta.cpp deleted file mode 100644 index 96b7846b..00000000 --- a/bsnes/cpu/g65816_ops_sta.cpp +++ /dev/null @@ -1,443 +0,0 @@ -/********************** - *** 0x8d: sta addr *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] dbr,aa ; data low - [4a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_sta_addrb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->regs.a.b); //4 [write] - - g65816_incpc(3); -} - -void g65816_op_sta_addrw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->regs.a.p.l); //4 [write low] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + 1, gx816->regs.a.p.h); //4a [write high] - - g65816_incpc(3); -} - -/************************ - *** 0x9d: sta addr,x *** - ************************ -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+xl ; io [4] - [4 ] dbr,aa+x ; data low - [4a] dbr,aa+x+1 ; data high [1] -*/ - -void g65816_op_sta_addrxb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //3a [write i/o] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x, gx816->regs.a.b); //4 [write] - - g65816_incpc(3); -} - -void g65816_op_sta_addrxw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //3a [write i/o] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x, gx816->regs.a.p.l); //4 [write low] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.x + 1, gx816->regs.a.p.h); //4a [write high] - - g65816_incpc(3); -} - -/******************** - *** 0x85: sta dp *** - ******************** -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; data low - [3a] 0,d+dp+1 ; data high [1] -*/ - -void g65816_op_sta_dpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->regs.a.b); //3 [write] - - g65816_incpc(2); -} - -void g65816_op_sta_dpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op_write(OPMODE_DP, gx816->op.dp, gx816->regs.a.p.l); //3 [write low] - gx816->op_write(OPMODE_DP, gx816->op.dp + 1, gx816->regs.a.p.h); //3a [write high] - - g65816_incpc(2); -} - -/********************** - *** 0x92: sta (dp) *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] dbr,aa ; data low - [5a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_sta_idpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->regs.a.b); //5 [write] - - g65816_incpc(2); -} - -void g65816_op_sta_idpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->regs.a.p.l); //5 [write low] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + 1, gx816->regs.a.p.h); //5a [write high] - - g65816_incpc(2); -} - -/********************** - *** 0x87: sta [dp] *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] 0,d+dp+2 ; aab - [6 ] aab,aa ; data low - [6a] aab,aa+1 ; data high [1] -*/ - -void g65816_op_sta_ildpb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->op_write(OPMODE_LONG, gx816->op.aa.l, gx816->regs.a.b); //6 [write] - - g65816_incpc(2); -} - -void g65816_op_sta_ildpw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->op_write(OPMODE_LONG, gx816->op.aa.l, gx816->regs.a.p.l); //6 [write low] - gx816->op_write(OPMODE_LONG, gx816->op.aa.l + 1, gx816->regs.a.p.h); //6a [write high] - - g65816_incpc(2); -} - -/********************** - *** 0x8f: sta long *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] pbr,pc+3 ; aab - [5 ] aab,aa ; data low - [5a] aab,aa+1 ; data high -*/ - -void g65816_op_sta_longb(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->op_write(OPMODE_LONG, gx816->op.aa.l, gx816->regs.a.b); //5 [write] - - g65816_incpc(4); -} - -void g65816_op_sta_longw(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->op_write(OPMODE_LONG, gx816->op.aa.l, gx816->regs.a.p.l); //5 [write] - gx816->op_write(OPMODE_LONG, gx816->op.aa.l + 1, gx816->regs.a.p.h); //5a [write] - - g65816_incpc(4); -} - -/************************ - *** 0x9f: sta long,x *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [4 ] pbr,pc+3 ; aab - [5 ] aab,aa+x ; data low - [5a] aab,aa+x+1 ; data high -*/ - -void g65816_op_sta_longxb(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->op_write(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x, gx816->regs.a.b); //5 [write] - - g65816_incpc(4); -} - -void g65816_op_sta_longxw(void) { - gx816->op.aa.l = gx816->read_operand(3); //1-4 [op fetch] - gx816->op_write(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x, gx816->regs.a.p.l); //5 [write] - gx816->op_write(OPMODE_LONG, gx816->op.aa.l + gx816->regs.x + 1, gx816->regs.a.p.h); //5a [write] - - g65816_incpc(4); -} - -/************************ - *** 0x99: sta addr,y *** - ************************ -cycles: - [1 ] pbr,pc ; operand - [2 ] pbr,pc+1 ; aal - [3 ] pbr,pc+2 ; aah - [3a] dbr,aah,aal+yl ; io [4] - [4 ] dbr,aa+y ; data low - [4a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_sta_addryb(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //3a [write i/o] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y, gx816->regs.a.b); //4 [write] - - g65816_incpc(3); -} - -void g65816_op_sta_addryw(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //3a [write i/o] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y, gx816->regs.a.p.l); //4 [write low] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1, gx816->regs.a.p.h); //4a [write high] - - g65816_incpc(3); -} - -/********************** - *** 0x95: sta dp,x *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; data low - [4a] 0,d+dp+x+1 ; data high -*/ - -void g65816_op_sta_dpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, gx816->regs.a.b); //4 [write] - - g65816_incpc(2); -} - -void g65816_op_sta_dpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x, gx816->regs.a.p.l); //4 [write low] - gx816->op_write(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1, gx816->regs.a.p.h); //4a [write high] - - g65816_incpc(2); -} - -/************************ - *** 0x81: sta (dp,x) *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] pbr,pc+1 ; io - [4 ] 0,d+dp+x ; aal - [5 ] 0,d+dp+x+1 ; aah - [6 ] dbr,aa ; data low - [6a] dbr,aa+1 ; data high [1] -*/ - -void g65816_op_sta_idpxb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //5 [aah] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->regs.a.b); //6 [write] - - g65816_incpc(2); -} - -void g65816_op_sta_idpxw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + gx816->regs.x + 1); //5 [aah] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w, gx816->regs.a.p.l); //6 [write low] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + 1, gx816->regs.a.p.h); //6 [write high] - - g65816_incpc(2); -} - -/************************ - *** 0x91: sta (dp),y *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [4a] dbr,aah,aal+yl ; io [4] - [5 ] dbr,aa+y ; data low - [5a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_sta_idpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - snes_time->add_cpu_icycles(1); //4a [write i/o] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y, gx816->regs.a.b); //5 [write] - - g65816_incpc(2); -} - -void g65816_op_sta_idpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - snes_time->add_cpu_icycles(1); //4a [write i/o] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y, gx816->regs.a.p.l); //5 [write low] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1, gx816->regs.a.p.h); //5a [write high] - - g65816_incpc(2); -} - -/************************ - *** 0x97: sta [dp],y *** - ************************ -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io [2] - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] 0,d+dp+2 ; aab - [6 ] aab,aa+y ; data low - [6a] aab,aa+y+1 ; data high [1] -*/ - -void g65816_op_sta_ildpyb(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->op_write(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y, gx816->regs.a.b); //6 [write] - - g65816_incpc(2); -} - -void g65816_op_sta_ildpyw(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [dl!=0] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [aah] - gx816->op.aa.p.b = gx816->op_read(OPMODE_DP, gx816->op.dp + 2); //5 [aab] - gx816->op_write(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y, gx816->regs.a.p.l); //6 [write low] - gx816->op_write(OPMODE_LONG, gx816->op.aa.l + gx816->regs.y + 1, gx816->regs.a.p.h); //6a [write high] - - g65816_incpc(2); -} - -/********************** - *** 0x83: sta sr,s *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; sp - [3 ] pbr,pc+1 ; io - [4 ] 0,s+sp ; data low - [4a] 0,s+sp+1 ; data high [1] -*/ - -void g65816_op_sta_srb(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op_write(OPMODE_SP, gx816->op.sp, gx816->regs.a.b); //4 [write] - - g65816_incpc(2); -} - -void g65816_op_sta_srw(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op_write(OPMODE_SP, gx816->op.sp, gx816->regs.a.p.l); //4 [write low] - gx816->op_write(OPMODE_SP, gx816->op.sp + 1, gx816->regs.a.p.h); //4a [write high] - - g65816_incpc(2); -} - -/************************** - *** 0x93: sta (sr,s),y *** - ************************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; sp - [3 ] pbr,pc+1 ; io - [4 ] 0,s+sp ; aal - [5 ] 0,s+sp+1 ; aah - [6 ] 0,s+sp+1 ; io - [7 ] dbr,aa+y ; data low - [7a] dbr,aa+y+1 ; data high [1] -*/ - -void g65816_op_sta_isryb(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //5 [aah] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y, gx816->regs.a.b); //7 [write] - - g65816_incpc(2); -} - -void g65816_op_sta_isryw(void) { - gx816->op.sp = gx816->read_operand(1); //1,2 [op fetch] - snes_time->add_cpu_icycles(1); //3 [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_SP, gx816->op.sp); //4 [aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_SP, gx816->op.sp + 1); //5 [aah] - snes_time->add_cpu_icycles(1); //6 [i/o] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y, gx816->regs.a.p.l); //7 [write low] - gx816->op_write(OPMODE_DBR, gx816->op.aa.w + gx816->regs.y + 1, gx816->regs.a.p.h); //7a [write high] - - g65816_incpc(2); -} diff --git a/bsnes/cpu/g65816_ops_stack.cpp b/bsnes/cpu/g65816_ops_stack.cpp deleted file mode 100644 index efa412a0..00000000 --- a/bsnes/cpu/g65816_ops_stack.cpp +++ /dev/null @@ -1,357 +0,0 @@ -/***************** - *** 0x48: pha *** - ***************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; io - [3a] 0,s ; reg high [1] - [3 ] 0,s-1 ; reg low -*/ - -void g65816_op_phab(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->stack_write(gx816->regs.a.b); //3 [reg low] - g65816_incpc(1); -} - -void g65816_op_phaw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->stack_write(gx816->regs.a.p.h); //3a [reg high] - gx816->stack_write(gx816->regs.a.p.l); //3 [reg low] - g65816_incpc(1); -} - -/***************** - *** 0x8b: phb *** - ***************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; io - [3a] 0,s ; reg high [1] - [3 ] 0,s-1 ; reg low -*/ - -void g65816_op_phb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->stack_write(gx816->regs.db); //3 [reg low] - g65816_incpc(1); -} - -/***************** - *** 0x0b: phd *** - ***************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; io - [3a] 0,s ; reg high [1] - [3 ] 0,s-1 ; reg low -*/ - -void g65816_op_phd(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->stack_write(gx816->regs.d >> 8); //3a [reg high] - gx816->stack_write(gx816->regs.d); //3 [reg low] - g65816_incpc(1); -} - -/***************** - *** 0x4b: phk *** - ***************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; io - [3a] 0,s ; reg high [1] - [3 ] 0,s-1 ; reg low -*/ - -void g65816_op_phk(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->stack_write(gx816->regs.pc >> 16); //3 [reg low] - g65816_incpc(1); -} - -/***************** - *** 0x08: php *** - ***************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; io - [3a] 0,s ; reg high [1] - [3 ] 0,s-1 ; reg low -*/ - -void g65816_op_php(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->stack_write(gx816->regs.p); //3 [reg low] - g65816_incpc(1); -} - -/***************** - *** 0xda: phx *** - ***************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; io - [3a] 0,s ; reg high [1] - [3 ] 0,s-1 ; reg low -*/ - -void g65816_op_phxb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->stack_write(gx816->regs.x); //3 [reg low] - g65816_incpc(1); -} - -void g65816_op_phxw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->stack_write(gx816->regs.x >> 8); //3a [reg high] - gx816->stack_write(gx816->regs.x); //3 [reg low] - g65816_incpc(1); -} - -/***************** - *** 0x5a: phy *** - ***************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; io - [3a] 0,s ; reg high [1] - [3 ] 0,s-1 ; reg low -*/ - -void g65816_op_phyb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->stack_write(gx816->regs.y); //3 [reg low] - g65816_incpc(1); -} - -void g65816_op_phyw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(1); //2 [i/o] - gx816->stack_write(gx816->regs.y >> 8); //3a [reg high] - gx816->stack_write(gx816->regs.y); //3 [reg low] - g65816_incpc(1); -} - -/***************** - *** 0x68: pla *** - ***************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,s+1 ; reg low - [4a] 0,s+2 ; reg high [1] -*/ - -void g65816_op_plab(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(2); //2,3 [i/o] - gx816->regs.a.b = gx816->stack_read(); //4 [reg low] - g65816_testn(gx816->regs.a.b & 0x80); - g65816_testz(gx816->regs.a.b == 0); - g65816_incpc(1); -} - -void g65816_op_plaw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(2); //2,3 [i/o] - gx816->regs.a.p.l = gx816->stack_read(); //4 [reg low] - gx816->regs.a.p.h = gx816->stack_read(); //4a [reg high] - g65816_testn(gx816->regs.a.w & 0x8000); - g65816_testz(gx816->regs.a.w == 0); - g65816_incpc(1); -} - -/***************** - *** 0xab: plb *** - ***************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,s+1 ; reg low - [4a] 0,s+2 ; reg high [1] -*/ - -void g65816_op_plb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(2); //2,3 [i/o] - gx816->regs.db = gx816->stack_read(); //4 [reg low] - g65816_testn(gx816->regs.db & 0x80); - g65816_testz(gx816->regs.db == 0); - g65816_incpc(1); -} - -/***************** - *** 0x2b: pld *** - ***************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,s+1 ; reg low - [4a] 0,s+2 ; reg high [1] -*/ - -void g65816_op_pld(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(2); //2,3 [i/o] - gx816->regs.d = gx816->stack_read(); //4 [reg low] - gx816->regs.d |= gx816->stack_read() << 8; //4a [reg high] - g65816_testn(gx816->regs.d & 0x8000); - g65816_testz(gx816->regs.d == 0); - g65816_incpc(1); -} - -/***************** - *** 0x28: plp *** - ***************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,s+1 ; reg low - [4a] 0,s+2 ; reg high [1] -*/ - -void g65816_op_plp(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(2); //2,3 [i/o] - gx816->regs.p = gx816->stack_read(); //4 [reg low] - g65816_incpc(1); - if(gx816->regs.e == true)gx816->regs.p |= 0x30; - if(gx816->regs.p & PF_X) { gx816->regs.x &= 0xff; gx816->regs.y &= 0xff; } -} - -/***************** - *** 0xfa: plx *** - ***************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,s+1 ; reg low - [4a] 0,s+2 ; reg high [1] -*/ - -void g65816_op_plxb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(2); //2,3 [i/o] - gx816->regs.x = gx816->stack_read(); //4 [reg low] - g65816_testn(gx816->regs.x & 0x80); - g65816_testz(gx816->regs.x == 0); - g65816_incpc(1); -} - -void g65816_op_plxw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(2); //2,3 [i/o] - gx816->regs.x = gx816->stack_read(); //4 [reg low] - gx816->regs.x |= gx816->stack_read() << 8; //4a [reg high] - g65816_testn(gx816->regs.x & 0x8000); - g65816_testz(gx816->regs.x == 0); - g65816_incpc(1); -} - -/***************** - *** 0x7a: ply *** - ***************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; io - [3 ] pbr,pc+1 ; io - [4 ] 0,s+1 ; reg low - [4a] 0,s+2 ; reg high [1] -*/ - -void g65816_op_plyb(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(2); //2,3 [i/o] - gx816->regs.y = gx816->stack_read(); //4 [reg low] - g65816_testn(gx816->regs.y & 0x80); - g65816_testz(gx816->regs.y == 0); - g65816_incpc(1); -} - -void g65816_op_plyw(void) { - snes_time->add_cpu_pcycles(1); //1 [op fetch] - snes_time->add_cpu_icycles(2); //2,3 [i/o] - gx816->regs.y = gx816->stack_read(); //4 [reg low] - gx816->regs.y |= gx816->stack_read() << 8; //4a [reg high] - g65816_testn(gx816->regs.y & 0x8000); - g65816_testz(gx816->regs.y == 0); - g65816_incpc(1); -} - -/********************** - *** 0xf4: pea addr *** - ********************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; aal - [3] pbr,pc+2 ; aah - [4] 0,s ; aah - [5] 0,s-1 ; aal -*/ - -void g65816_op_pea(void) { - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - gx816->stack_write(gx816->op.aa.p.h); //4 [write high] - gx816->stack_write(gx816->op.aa.p.l); //5 [write low] - g65816_incpc(3); -} - -/********************** - *** 0xd4: pei (dp) *** - ********************** -cycles: - [1 ] pbr,pc ; opcode - [2 ] pbr,pc+1 ; dp - [2a] pbr,pc+1 ; io - [3 ] 0,d+dp ; aal - [4 ] 0,d+dp+1 ; aah - [5 ] 0,s ; aah - [6 ] 0,s-1 ; aal -*/ - -void g65816_op_pei(void) { - gx816->op.dp = gx816->read_operand(1); //1,2 [op fetch] - gx816->op_cond(2); //2a [i/o] - gx816->op.aa.p.l = gx816->op_read(OPMODE_DP, gx816->op.dp); //3 [read aal] - gx816->op.aa.p.h = gx816->op_read(OPMODE_DP, gx816->op.dp + 1); //4 [read aah] - gx816->stack_write(gx816->op.aa.p.h); //5 [write aah] - gx816->stack_write(gx816->op.aa.p.l); //6 [write aal] - g65816_incpc(2); -} - -/********************** - *** 0x62: per addr *** - ********************** -cycles: - [1] pbr,pc ; opcode - [2] pbr,pc+1 ; offset low - [3] pbr,pc+2 ; offset high - [4] pbr,pc+2 ; io - [5] 0,s ; pch+offset - [6] 0,s-1 ; pcl+offset -*/ - -void g65816_op_per(void) { -word r; - gx816->op.aa.w = gx816->read_operand(2); //1-3 [op fetch] - snes_time->add_cpu_icycles(1); //4 [i/o] - r = (gx816->regs.pc + (signed short)gx816->op.aa.w + 3); - gx816->stack_write(r >> 8); //5 [write pch] - gx816->stack_write(r); //6 [write pcl] - g65816_incpc(3); -} diff --git a/bsnes/main.cpp b/bsnes/main.cpp deleted file mode 100644 index d21abf20..00000000 --- a/bsnes/main.cpp +++ /dev/null @@ -1,214 +0,0 @@ -/* bsnes - project started: 10/14/2004 - author: byuu */ - -#include "base.h" -#include "main.h" -#include "timing/timing.h" -#include "cpu/g65816.h" -#include "apu/spc700.h" -#include "bridge/bridge.h" -extern snes_timer *snes_time; -extern g65816 *gx816; -extern sony_spc700 *spc700; -extern ppustate ppu; -extern port_bridge *cpu_apu_bridge; -debugstate debugger; - -void debug_test_breakpoint_hit(byte source, byte flag, ulong offset, byte value, int i) { - dprintf("* breakpoint %d hit", i); - debugger.bp_list[i].hit_count++; - debugger.refresh_bp = true; - debug_set_state(DEBUGMODE_WAIT); - if(source == BPSRC_SPCRAM) { - disas_spc700_op(); - } else { - disas_g65816_op(); - } -} - -void debug_test_breakpoint(byte source, byte flag, ulong offset, byte value) { -int i; - if(debug_get_state() == DEBUGMODE_DISABLED)return; - - for(i=0;i<16;i++) { - if(debugger.bp_list[i].source != source)continue; - if(debugger.bp_list[i].flags & flag) { - if(debugger.bp_list[i].offset == offset) { - if(debugger.bp_list[i].flags & BP_VAL) { - if(debugger.bp_list[i].value == value) { - debug_test_breakpoint_hit(source, flag, offset, value, i); - } - } else { - debug_test_breakpoint_hit(source, flag, offset, value, i); - } - } - } - } -} - -ulong debug_write_status(void) { - if(debugger_enabled() == false)return DEBUGWRITE_NONE; - - if(debug_get_state() == DEBUGMODE_RUN) { - if(debugger.trace_enabled == false)return DEBUGWRITE_NONE; - if(debugger.trace_output_enabled == true) { - return DEBUGWRITE_CONSOLE | DEBUGWRITE_TRACE; - } - return DEBUGWRITE_TRACE; - } - - return DEBUGWRITE_CONSOLE; -} - -void init_debugstate(void) { - debugger.mode = DEBUGMODE_DISABLED; - - debugger.mem_ptr = 0x7e0000; - debugger.disas_cpu_op = true; - debugger.disas_apu_op = true; - debugger.refresh_mem = true; - debugger.refresh_bp = true; - debugger.refresh_status = true; - - debugger.cpu_op_executed = false; - debugger.apu_op_executed = false; - - debugger.output_cpu_instrs = true; - debugger.output_apu_instrs = true; - debugger.output_debug_info = true; - debugger.trace_enabled = false; - debugger.trace_output_enabled = false; - - debugger.lock_up = debugger.lock_down = debugger.lock_left = debugger.lock_right = false; - debugger.lock_a = debugger.lock_b = debugger.lock_x = debugger.lock_y = false; - debugger.lock_l = debugger.lock_r = debugger.lock_select = debugger.lock_start = false; -} - -void RunSNES(void) { - if(emu_state.rom_loaded == false)return; - - if(debugger_enabled() == false) { - gx816->Run(); - spc700->Run(); - return; - } - - if(debug_get_state() == DEBUGMODE_RUN) { - gx816->Run(); - spc700->Run(); - if(debugger.trace_enabled == true) { - if(debugger.disas_cpu_op == true) { - disas_g65816_op(); - debugger.disas_cpu_op = false; - } - if(debugger.disas_apu_op == true) { - disas_spc700_op(); - debugger.disas_apu_op = false; - } - } - } else { - if(debugger.disas_cpu_op == true) { - disas_g65816_op(); - debugger.disas_cpu_op = false; - } - if(debugger.disas_apu_op == true) { - disas_spc700_op(); - debugger.disas_apu_op = false; - } - if(debugger.refresh_mem == true) { - debug_refresh_mem(); - debugger.refresh_mem = false; - } - if(debugger.refresh_bp == true) { - debug_refresh_bp(); - debugger.refresh_bp = false; - } - if(debugger.refresh_status == true) { - debug_update_status(); - debugger.refresh_status = false; - } - if(debug_get_state() == DEBUGMODE_WAIT)return; - - if(debug_get_state() == DEBUGMODE_CPUSTEP) { - gx816->Run(); - spc700->Run(); - if(debugger.cpu_op_executed == true) { - debug_set_state(DEBUGMODE_WAIT); - } - } - - if(debug_get_state() == DEBUGMODE_APUSTEP) { - gx816->Run(); - spc700->Run(); - if(debugger.apu_op_executed == true) { - debug_set_state(DEBUGMODE_WAIT); - } - } - } - debug_update_status(); -} - -extern vfunc spc700_optbl[256]; - -void InitSNES(void) { -int i, z; - snes_time = new snes_timer(); - gx816 = new g65816(); - gx816->PowerOn(1); - spc700 = new sony_spc700(); - spc700->Reset(); - snes_time->reset_clock(); - cpu_apu_bridge = new port_bridge(); - if(*emu_state.rom_name == 0) { - emu_state.rom_loaded = false; - } else { - gx816->LoadROM(); - emu_state.rom_loaded = true; - } - for(i=0;i<16;i++) { - debugger.bp_list[i].offset = 0; - debugger.bp_list[i].flags = BP_OFF; - debugger.bp_list[i].source = BPSRC_MEM; - debugger.bp_list[i].value = 0; - debugger.bp_list[i].hit_count = 0; - } -} - -void ResetSNES(void) { -int i; - gx816->Reset(); - spc700->Reset(); - snes_time->reset_clock(); - for(i=0;i<16;i++) { - debugger.bp_list[i].offset = 0; - debugger.bp_list[i].flags = BP_OFF; - debugger.bp_list[i].source = BPSRC_MEM; - debugger.bp_list[i].value = 0; - debugger.bp_list[i].hit_count = 0; - } -} - -#include -int __stdcall WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) { -char fn[MAX_PATH]; - strcpy(fn, lpcmdline); -//remove quotes from filename, if neccesary (if path contains spaces, quotes will be around command line arg) - if(*fn == '\"') { - strcpy(emu_state.rom_name, fn + 1); - emu_state.rom_name[strlen(emu_state.rom_name) - 1] = 0; - } else { - strcpy(emu_state.rom_name, fn); - } -//create save ram file name - strcpy(emu_state.sram_name, emu_state.rom_name); - if(strlen(emu_state.sram_name) > 4) { - emu_state.sram_name[strlen(emu_state.sram_name) - 4] = 0; - } - strcat(emu_state.sram_name, ".srm"); - - init_debugstate(); - __winmain(); //located in win/gui.cpp - - return 0; -} diff --git a/bsnes/main.h b/bsnes/main.h deleted file mode 100644 index 9d92669a..00000000 --- a/bsnes/main.h +++ /dev/null @@ -1,25 +0,0 @@ -void __winmain(void); - -/* - *1 - how many instructions to execute before saving sram data - to emu_state.sram_name -*/ -emustate emu_state = { - false, //rom loaded - 20000000, //sram save tick count *1 - "", "" //rom name, sram name -}; - -videostate render = { - 512, 448, //display resolution - 256, 224, //snes internal resolution - false, //fullscreen - true, //show menu - 0, //frame skip - 0, //frame count - { true, true, true }, //bg1 enable - { true, true, true }, //bg2 enable - { true, true, true }, //bg3 enable - { true, true, true }, //bg4 enable - { true, true, true, true, true } //oam enable -}; diff --git a/bsnes/mem/memory.cpp b/bsnes/mem/memory.cpp deleted file mode 100644 index 07035c6d..00000000 --- a/bsnes/mem/memory.cpp +++ /dev/null @@ -1,434 +0,0 @@ -#include "../base.h" -#include "../cpu/g65816.h" -#include "../timing/timing.h" -extern g65816 *gx816; -extern emustate emu_state; -extern debugstate debugger; -extern snes_timer *snes_time; - -void g65816::InitializeROM(byte memory_map) { - memset(rom, 0, 0x600000); - map = memory_map; -} - -void g65816::InitializeWRAM(byte value) { - memset(wram, value, 0x020000); - memset(sram, 0x00, 0x0e0000); -} - -/*********************** - *** SNES Memory Map *** - ************************************************** - *** 00-3f 0000-1fff First 8k WRAM *** - *** 2000-5fff MMIO *** - *** 6000-7fff Expansion RAM (Unmapped) *** - *** 8000-ffff Cartridge ROM *** - *** 40-7d 0000-ffff Cartridge ROM *** - *** 7e-7f 0000-ffff 128k WRAM *** - *** 80-bf 0000-1fff First 8k WRAM *** - *** 2000-5fff MMIO *** - *** 6000-7fff Expansion RAM (Unmapped) *** - *** 8000-ffff Cartridge ROM *** - *** c0-ff 0000-ffff Cartridge ROM *** -**************************************************/ - -ulong g65816::mirror_offset(ulong addr) { -byte db; -word a; -ulong r = 0; - db = (addr >> 16) & 0xff; - a = (addr & 0xffff); - if(db >= 0x00 && db <= 0x3f) { - if(a >= 0x0000 && a <= 0x1fff) { - r = 0x7e0000 | (a & 0x1fff); - } else if(a >= 0x2000 && a <= 0x5fff) { - r = a; - } else if(a >= 0x6000 && a <= 0x7fff) { - r = (db << 16) | a; - } else if(a >= 0x8000 && a <= 0xffff) { - r = (db << 16) | a; - } - } else if(db >= 0x40 && db <= 0x7d) { - r = (db << 16) | a; - } else if(db >= 0x7e && db <= 0x7f) { - r = addr; - } else if(db >= 0x80 && db <= 0xbf) { - if(a >= 0x0000 && a <= 0x1fff) { - r = 0x7e0000 | (a & 0x1fff); - } else if(a >= 0x2000 && a <= 0x5fff) { - r = a; - } else if(a >= 0x6000 && a <= 0x7fff) { - r = (db << 16) | a; - } else if(a >= 0x8000 && a <= 0xffff) { - r = ((db & 0x7f) << 16) | a; - } - } else if(db >= 0xc0 && db <= 0xff) { - r = addr; - } - - return r; -} - -ulong g65816::convert_offset(byte read_mode, ulong addr, bool mirror) { -byte db; - switch(read_mode) { - case MEMMODE_DP: - addr = (regs.d + (addr & 0xffff)) & 0xffff; - break; - case MEMMODE_DPX: - addr = (regs.d + regs.x + (addr & 0xffff)) & 0xffff; - break; - case MEMMODE_DPY: - addr = (regs.d + regs.y + (addr & 0xffff)) & 0xffff; - break; - case MEMMODE_IDP: - addr = (regs.d + (addr & 0xffff)) & 0xffff; - addr = mem_read(MEMMODE_LONG, MEMSIZE_WORD, addr); - addr |= (regs.db << 16); - break; - case MEMMODE_IDPX: - addr = (regs.d + regs.x + (addr & 0xffff)) & 0xffff; - addr = mem_read(MEMMODE_LONG, MEMSIZE_WORD, addr); - addr |= (regs.db << 16); - break; - case MEMMODE_IDPY: - addr = (regs.d + (addr & 0xffff)) & 0xffff; - addr = mem_read(MEMMODE_LONG, MEMSIZE_WORD, addr); - addr += (regs.db << 16) + regs.y; - break; - case MEMMODE_ILDP: - addr = (regs.d + (addr & 0xffff)); - addr = mem_read(MEMMODE_LONG, MEMSIZE_LONG, addr); - break; - case MEMMODE_ILDPY: - addr = (regs.d + (addr & 0xffff)); - addr = mem_read(MEMMODE_LONG, MEMSIZE_LONG, addr); - addr += regs.y; - break; - case MEMMODE_ADDR: - addr = addr & 0xffff; - addr |= (regs.db << 16); - break; - case MEMMODE_ADDR_PC: - addr = addr & 0xffff; - addr |= (regs.pc & 0xff0000); - break; - case MEMMODE_ADDRX: - addr = (regs.db << 16) + (addr & 0xffff); - addr += regs.x; - break; - case MEMMODE_ADDRY: - addr = (regs.db << 16) + (addr & 0xffff); - addr += regs.y; - break; - case MEMMODE_IADDRX: - addr += regs.x; - addr = mem_read(MEMMODE_LONG, MEMSIZE_WORD, (addr & 0x00ffff)); - addr |= (regs.pc & 0xff0000); - break; - case MEMMODE_ILADDR: - addr = mem_read(MEMMODE_LONG, MEMSIZE_LONG, addr); - break; - case MEMMODE_IADDR_PC: - addr |= (regs.pc & 0xff0000); - break; - case MEMMODE_IADDRX_PC: - addr += regs.x; - addr |= (regs.pc & 0xff0000); - break; - case MEMMODE_ILADDR_PC: - break; - case MEMMODE_LONG: - break; - case MEMMODE_LONGX: - addr += regs.x; - break; - case MEMMODE_SR: - addr = (regs.s + (addr & 0xff)) & 0xffff; - break; - case MEMMODE_ISRY: - addr = (regs.s + (addr & 0xff)) & 0xffff; - addr = mem_read(MEMMODE_LONG, MEMSIZE_WORD, addr); - addr += (regs.db << 16) + regs.y; - break; - - case OPMODE_ADDR: - addr &= 0xffff; - break; - case OPMODE_LONG: - addr &= 0xffffff; - break; - case OPMODE_DBR: - addr = (regs.db << 16) + addr; - break; - case OPMODE_PBR: - addr = (regs.pc & 0xff0000) | (addr & 0xffff); - break; - case OPMODE_DP: - addr = (regs.d + (addr & 0xffff)) & 0xffff; - break; - case OPMODE_SP: - addr = (regs.s + (addr & 0xffff)) & 0xffff; - break; - } - - if(mirror == true) { - return mirror_offset(addr); - } else { - return addr; - } -} - -ulong g65816::read_operand(byte size) { -ulong r; - r = gx816->mem_read(MEMMODE_NONE, size, gx816->regs.pc + 1); -//add size + 1 cycles. the extra cycle is for the actual opcode -//byte itself being read in by the main cpu emulation routine. - snes_time->add_cpu_pcycles(size + 1); - return r; -} - -byte g65816::mem_getbyte_direct(ulong addr, byte access_mode) { -byte db; -word a; - db = (addr >> 16) & 0xff; - a = (addr & 0xffff); - if(db == 0x00 && a >= 0x2000 && a <= 0x5fff) { - if(access_mode == MEMACCESS_DEBUGGER) { - return 0x00; - } else { - return mmio_read(addr); - } - } - - if(db == 0x7e || db == 0x7f) { - return wram[addr & 0x01ffff]; - } else if(db != 0x7e && db != 0x7f && a >= 0x8000 && a <= 0xffff) { - return rom_read(addr, MEMSIZE_BYTE); - } else if(db >= 0x30 && db <= 0x3f) { - if(a >= 0x6000 && a <= 0x7fff) { - addr = ((db - 0x30) * 0x2000) + (a - 0x6000); - addr &= (sram_size - 1); - return sram[addr]; - } - } else if(db >= 0x70 && db <= 0x7d) { - addr -= 0x700000; - addr &= (sram_size - 1); - return sram[addr]; - } else if(db >= 0xc0 && db <= 0xff) { - return rom_read(addr, MEMSIZE_BYTE); - } - return 0; -} - -byte g65816::mem_getbyte(ulong addr, byte access_mode) { -int i; -byte r; - r = mem_getbyte_direct(addr, access_mode); - - if(debug_get_state() == DEBUGMODE_DISABLED)return r; - if(access_mode == MEMACCESS_DEBUGGER)return r; //don't report breakpoint hits from debugger - - debug_test_bp(BPSRC_MEM, BP_READ, addr, r); - return r; -} - -void g65816::mem_putbyte_direct(ulong addr, byte value, byte access_mode) { -byte db; -word a; - db = (addr >> 16) & 0xff; - a = (addr & 0xffff); - if(db == 0x00 && a >= 0x2000 && a <= 0x5fff) { - mmio_write(a, value); - } else if(db == 0x7e || db == 0x7f) { - wram[addr & 0x01ffff] = value; - } else if(db >= 0x30 && db <= 0x3f) { - if(a >= 0x6000 && a <= 0x7fff) { - addr = ((db - 0x30) * 0x2000) + (a - 0x6000); - addr &= (sram_size - 1); - sram[addr] = value; - } - } else if(db >= 0x70 && db <= 0x7d) { - addr -= 0x700000; - addr &= (sram_size - 1); - sram[addr] = value; - } - - if(access_mode == MEMACCESS_DEBUGGER) { - if(gx816->map == MEMMAP_LOROM) { - if((db >= 0x00 && db <= 0x5f) || (db >= 0x80 && db <= 0xdf)) { - if(addr >= 0x8000 && addr <= 0xffff) { - rom_write(addr, value, MEMSIZE_BYTE); - } - } - } else if(gx816->map == MEMMAP_HIROM) { - if(db >= 0xc0 && db <= 0xff) { - rom_write(addr, value, MEMSIZE_BYTE); - } - } - } -} - -void g65816::mem_putbyte(ulong addr, byte value, byte access_mode) { -int i; - mem_putbyte_direct(addr, value, access_mode); - - if(debug_get_state() == DEBUGMODE_DISABLED)return; - if(access_mode == MEMACCESS_DEBUGGER)return; //don't report breakpoint hits from debugger - - debug_test_bp(BPSRC_MEM, BP_WRITE, addr, value); -} - -ulong g65816::mem_read(byte read_mode, byte read_size, ulong addr, byte access_mode) { -ulong r; - addr = convert_offset(read_mode, addr); - - switch(read_size) { - case MEMSIZE_BYTE: - r = mem_getbyte(addr, access_mode); - break; - case MEMSIZE_WORD: - r = mem_getbyte(addr, access_mode) | - mem_getbyte(addr+1, access_mode)<<8; - break; - case MEMSIZE_LONG: - r = mem_getbyte(addr, access_mode) | - mem_getbyte(addr+1, access_mode)<<8 | - mem_getbyte(addr+2, access_mode)<<16; - break; - } - - return r; -} - -void g65816::mem_write(byte write_mode, byte write_size, ulong addr, ulong value, byte access_mode) { - addr = convert_offset(write_mode, addr); - - switch(write_size) { - case MEMSIZE_BYTE: - mem_putbyte(addr, value, access_mode); - break; - case MEMSIZE_WORD: - mem_putbyte(addr, value, access_mode); - mem_putbyte(addr+1, value>>8, access_mode); - break; - case MEMSIZE_LONG: - mem_putbyte(addr, value, access_mode); - mem_putbyte(addr+1, value>>8, access_mode); - mem_putbyte(addr+2, value>>16, access_mode); - break; - } - - debugger.refresh_mem = true; -} - -/* - todo: move address mirroring into mem_getbyte - in case there are different memory speeds depending - on pre-mirrored addresses. -*/ -byte g65816::op_read(byte mode, ulong addr) { -byte r; - addr = convert_offset(mode, addr); - r = mem_getbyte(addr); - snes_time->add_cpu_mcycles(1, addr); - return r; -} - -void g65816::op_write(byte mode, ulong addr, byte value) { - mem_putbyte(convert_offset(mode, addr), value); - snes_time->add_cpu_mcycles(1, addr); -} - -byte g65816::stack_read(void) { -byte r; - gx816->regs.s++; - if(gx816->regs.e == true) { - gx816->regs.s = 0x0100 | (gx816->regs.s & 0xff); - } - r = mem_getbyte(convert_offset(OPMODE_SP, 0)); - snes_time->add_cpu_mcycles(1, gx816->regs.s); - return r; -} - -void g65816::stack_write(byte value) { - mem_putbyte(convert_offset(OPMODE_SP, 0), value); - gx816->regs.s--; - if(gx816->regs.e == true) { - gx816->regs.s = 0x0100 | (gx816->regs.s & 0xff); - } - snes_time->add_cpu_mcycles(1, gx816->regs.s); -} - -/* - note: case 4 (write) condition is handled directly - in the opcode, since it is always true. -*/ -void g65816::op_cond(byte c, ulong n0, ulong n1) { - switch(c) { - case 2: //dl != 0 - if((regs.d & 0xff) != 0x00) { - snes_time->add_cpu_icycles(1); - } - break; - case 4: //read across page boundaries, write, or x=0 - if((n0 & 0xff00) != (n1 & 0xff00) || !(gx816->regs.p & PF_X)) { - snes_time->add_cpu_icycles(1); - } - break; - } -} - -ulong g65816::rom_read(ulong addr, byte read_size) { -ulong r; - if(map == MEMMAP_LOROM) { - if(read_size == MEMSIZE_BYTE) { - r = rom[((addr & 0x7f0000) >> 1) | (addr & 0x7fff)]; - } else if(read_size == MEMSIZE_WORD) { - r = rom[((addr & 0x7f0000) >> 1) | (addr & 0x7fff)] | - rom[(((addr + 1) & 0x7f0000) >> 1) | ((addr + 1) & 0x7fff)] << 8; - } else if(read_size == MEMSIZE_LONG) { - r = rom[((addr & 0x7f0000) >> 1) | (addr & 0x7fff)] | - rom[(((addr + 1) & 0x7f0000) >> 1) | ((addr + 1) & 0x7fff)] << 8 | - rom[(((addr + 2) & 0x7f0000) >> 1) | ((addr + 2) & 0x7fff)] << 16; - } - } else if(map == MEMMAP_HIROM) { - if(read_size == MEMSIZE_BYTE) { - r = rom[addr & 0x3fffff]; - } else if(read_size == MEMSIZE_WORD) { - r = rom[addr & 0x3fffff] | - rom[(addr + 1) & 0x3fffff] << 8; - } else if(read_size == MEMSIZE_LONG) { - r = rom[addr & 0x3fffff] | - rom[(addr + 1) & 0x3fffff] << 8 | - rom[(addr + 2) & 0x3fffff] << 16; - } - } - return r; -} - -void g65816::rom_write(ulong addr, ulong v, byte write_size) { - if(map == MEMMAP_LOROM) { - if(write_size == MEMSIZE_BYTE) { - rom[((addr & 0x7f0000) >> 1) | (addr & 0x7fff)] = v; - } else if(write_size == MEMSIZE_WORD) { - rom[((addr & 0x7f0000) >> 1) | (addr & 0x7fff)] = v; - rom[(((addr + 1) & 0x7f0000) >> 1) | ((addr + 1) & 0x7fff)] = v >> 8; - } else if(write_size == MEMSIZE_LONG) { - rom[((addr & 0x7f0000) >> 1) | (addr & 0x7fff)] = v; - rom[(((addr + 1) & 0x7f0000) >> 1) | ((addr + 1) & 0x7fff)] = v >> 8; - rom[(((addr + 2) & 0x7f0000) >> 1) | ((addr + 2) & 0x7fff)] = v >> 16; - } - } else if(map == MEMMAP_HIROM) { - if(write_size == MEMSIZE_BYTE) { - rom[addr & 0x3fffff] = v; - } else if(write_size == MEMSIZE_WORD) { - rom[addr & 0x3fffff] = v; - rom[(addr + 1) & 0x3fffff] = v >> 8; - } else if(write_size == MEMSIZE_LONG) { - rom[addr & 0x3fffff] = v; - rom[(addr + 1) & 0x3fffff] = v >> 8; - rom[(addr + 2) & 0x3fffff] = v >> 16; - } - } -} diff --git a/bsnes/misc/libstr.cpp b/bsnes/misc/libstr.cpp deleted file mode 100644 index a9ba0b40..00000000 --- a/bsnes/misc/libstr.cpp +++ /dev/null @@ -1,393 +0,0 @@ -#include "../base.h" -#include "libvlist.cpp" - -typedef struct { -char *s; -ulong size; -}string; - -typedef struct { -vectorlist list; -ulong count; -}stringlist; - -/*********************** -string library functions -***********************/ - -void strresize(string *str, ulong size) { -char *t; -int sl; - if(str->size == size)return; - sl = strlen(str->s); - t = (char*)malloc(size + 1); - strncpy(t, str->s, size); - free(str->s); - str->s = t; - str->size = size; -} - -string *newstr(void) { -string *s; - s = (string*)malloc(sizeof(string)); - s->size = 16; - s->s = (char*)malloc(s->size + 1); - *s->s = 0; - return s; -} - -void memfree(string *s) { - if(s->s)free(s->s); - free(s); -} - -/*************************** -stringlist library functions -***************************/ - -void stradd(stringlist *sl, ulong num) { -int i; -string *s; - while(sl->count < (num + 1)) { - s = newstr(); - sl->list.add((ulong)s); - sl->count++; - } -} - -string *strget(stringlist *sl, ulong num) { -string *s; - if(sl->count < (num + 1)) { stradd(sl, num); } - s = (string*)sl->list.get(num); - return s; -} - -stringlist *newstrlist(void) { -stringlist *sl; - sl = (stringlist*)malloc(sizeof(stringlist)); - sl->count = 0; - stradd(sl, 1); - return sl; -} - -ulong count(stringlist *sl) { - return sl->count; -} - -/**************************** -string manipulation functions -****************************/ - -char *strptr(string *s) { return s->s; } -char *strptr(stringlist *sl, ulong num) { return strget(sl, num)->s; } - -void strcpy(string *dest, char *src) { -int srclen = strlen(src); - if(srclen > dest->size) { strresize(dest, srclen); } - strncpy(dest->s, src, dest->size); -} -void strcpy(string *dest, string *src) { strcpy(dest, src->s); } -void strcpy(stringlist *dest, ulong num, char *src) { strcpy(strget(dest, num), src); } -void strcpy(stringlist *dest, ulong num, string *src) { strcpy(strget(dest, num), src->s); } -void strcpy(stringlist *dest, ulong destnum, stringlist *src, ulong srcnum) { strcpy(strget(dest, destnum), strptr(src, srcnum)); } - -void strset(string *dest, ulong pos, byte c) { -char *s; - if(pos > dest->size) { strresize(dest, pos); } - dest->s[pos] = c; -} -void strset(stringlist *dest, ulong num, ulong pos, byte c) { strset(strget(dest, num), pos, c); } - -void strcat(string *dest, char *src) { -int srclen, destlen; - srclen = strlen(src); - destlen = strlen(dest->s); - if(srclen + destlen > dest->size) { strresize(dest, srclen + destlen); } - strncat(dest->s, src, srclen + destlen); -} -void strcat(string *dest, string *src) { strcat(dest, src->s); } -void strcat(stringlist *dest, ulong num, char *src) { strcat(strget(dest, num), src); } -void strcat(stringlist *dest, ulong num, string *src) { strcat(strget(dest, num), src->s); } -void strcat(stringlist *dest, ulong destnum, stringlist *src, ulong srcnum) { strcat(strget(dest, destnum), strptr(src, srcnum)); } - -ulong strlen(string *s) { return strlen(s->s); } -ulong strlen(stringlist *sl, ulong num) { return strlen(strget(sl, num)->s); } - -void strinsert(string *dest, char *src, ulong pos) { -string *s = newstr(); - strcpy(s, strptr(dest)+pos); - strset(dest, pos, 0); - strcat(dest, src); - strcat(dest, s); - memfree(s); -} -void strinsert(string *dest, string *src, ulong pos) { strinsert(dest, src->s, pos); } -void strinsert(stringlist *dest, ulong num, char *src, ulong pos) { strinsert(strget(dest, num), src, pos); } -void strinsert(stringlist *dest, ulong num, string *src, ulong pos) { strinsert(strget(dest, num), src->s, pos); } -void strinsert(stringlist *dest, ulong destnum, stringlist *src, ulong srcnum, ulong pos) { strinsert(strget(dest, destnum), strptr(src, srcnum), pos); } - -void strremove(string *dest, ulong start, ulong length = 0) { -int destlen; -char *s; -int i, sl = strlen(dest->s); - if(start > dest->size) { strresize(dest, start); } - if(!length) { - strset(dest, start, 0); - return; - } - s = strptr(dest); - for(i=start;is, src); } -ulong strcmp(string *dest, string *src) { return strcmp(dest->s, src->s); } -ulong strcmp(stringlist *dest, ulong num, char *src) { return strcmp(strget(dest, num)->s, src); } -ulong strcmp(stringlist *dest, ulong num, string *src) { return strcmp(strget(dest, num)->s, src->s); } -ulong strcmp(stringlist *dest, ulong destnum, stringlist *src, ulong srcnum) { return strcmp(strget(dest, destnum)->s, strptr(src, srcnum)); } - -ulong stricmp(char *dest, char *src) { -int i, sl = strlen(dest); - if(sl != strlen(src))return 1; - for(i=0;i= 'A' && dest[i] <= 'Z') { - if(dest[i]!=src[i] && dest[i]+0x20!=src[i])return 1; - } else if(dest[i] >='a' && dest[i] <= 'z') { - if(dest[i]!=src[i] && dest[i]-0x20!=src[i])return 1; - } else { - if(dest[i] != src[i])return 1; - } - } - return 0; -} -ulong stricmp(string *dest, char *src) { return stricmp(dest->s, src); } -ulong stricmp(string *dest, string *src) { return stricmp(dest->s, src->s); } -ulong stricmp(stringlist *dest, ulong num, char *src) { return stricmp(strget(dest, num)->s, src); } -ulong stricmp(stringlist *dest, ulong num, string *src) { return stricmp(strget(dest, num)->s, src->s); } -ulong stricmp(stringlist *dest, ulong destnum, stringlist *src, ulong srcnum) { return stricmp(strget(dest, destnum)->s, strptr(src, srcnum)); } - -void strlower(char *str) { -int i, sl = strlen(str); - for(i=0;i= 'A' && str[i] <= 'Z')str[i] += 0x20; } -} -void strlower(string *str) { strlower(str->s); } -void strlower(stringlist *sl, ulong num) { strlower(strptr(sl, num)); } - -void strupper(char *str) { -int i, sl = strlen(str); - for(i=0;i='a' && str[i] <='z')str[i] -= 0x20; } -} -void strupper(string *str) { strupper(str->s); } -void strupper(stringlist *sl, ulong num) { strupper(strptr(sl, num)); } - -ulong strpos(char *str, char *key) { -int i, ssl = strlen(str), ksl = strlen(key); - if(ksl > ssl)return null; - for(i=0;i<=ssl-ksl;i++) { - if(!memcmp(str+i, key, ksl))return i; - } - return null; -} -ulong strpos(string *dest, char *src) { return strpos(dest->s, src); } -ulong strpos(string *dest, string *src) { return strpos(dest->s, src->s); } -ulong strpos(stringlist *dest, ulong num, char *src) { return strpos(strget(dest, num)->s, src); } -ulong strpos(stringlist *dest, ulong num, string *src) { return strpos(strget(dest, num)->s, src->s); } -ulong strpos(stringlist *dest, ulong destnum, stringlist *src, ulong srcnum) { return strpos(strget(dest, destnum)->s, strptr(src, srcnum)); } - -ulong strpos_q(char *str, char *key) { -int i, z, ssl = strlen(str), ksl = strlen(key); -byte x; - if(ksl > ssl)return null; - for(i=0;i<=ssl-ksl;) { - x = str[i]; - if(x == '\"' || x == '\'') { - z = i++; - while(str[i] != x && i < ssl)i++; - if(i >= ssl)i = z; - } - if(!memcmp(str+i, key, ksl)) { - return i; - } else { - i++; - } - } - return null; -} -ulong strpos_q(string *dest, char *src) { return strpos_q(dest->s, src); } -ulong strpos_q(string *dest, string *src) { return strpos_q(dest->s, src->s); } -ulong strpos_q(stringlist *dest, ulong num, char *src) { return strpos_q(strget(dest, num)->s, src); } -ulong strpos_q(stringlist *dest, ulong num, string *src) { return strpos_q(strget(dest, num)->s, src->s); } -ulong strpos_q(stringlist *dest, ulong destnum, stringlist *src, ulong srcnum) { return strpos_q(strget(dest, destnum)->s, strptr(src, srcnum)); } - -void strtr(char *dest, char *before, char *after) { -int i, l, sl = strlen(dest), bsl = strlen(before), asl = strlen(after); - if((bsl != asl) || bsl == 0)return; - for(i=0;is, before, after); } -void strtr(stringlist *dest, ulong num, char *before, char *after) { strtr(strptr(dest, num), before, after); } - -ulong strbegin(char *str, char *key) { -int i, ssl = strlen(str), ksl = strlen(key); - if(ksl > ssl)return 1; - if(!memcmp(str, key, ksl))return 0; - return 1; -} -ulong strbegin(string *str, char *key) { return strbegin(str->s, key); } -ulong strbegin(stringlist *str, ulong num, char *key) { return strbegin(strptr(str, num), key); } - -ulong stribegin(char *str, char *key) { -int i, ssl = strlen(str), ksl = strlen(key); - if(ksl > ssl)return 1; - for(i=0;i= 'A' && str[i] <= 'Z') { - if(str[i] != key[i] && str[i]+0x20 != key[i])return 1; - } else if(str[i] >= 'a' && str[i] <= 'z') { - if(str[i] != key[i] && str[i]-0x20 != key[i])return 1; - } else { - if(str[i] != key[i])return 1; - } - } - return 0; -} -ulong stribegin(string *str, char *key) { return stribegin(str->s, key); } -ulong stribegin(stringlist *str, ulong num, char *key) { return stribegin(strptr(str, num), key); } - -ulong strend(char *str, char *key) { -int i, ssl = strlen(str), ksl = strlen(key); - if(ksl > ssl)return 1; - if(!memcmp(str + ssl - ksl, key, ksl))return 0; - return 1; -} -ulong strend(string *str, char *key) { return strend(str->s, key); } -ulong strend(stringlist *str, ulong num, char *key) { return strend(strptr(str, num), key); } - -ulong striend(char *str, char *key) { -int i, z, ssl = strlen(str), ksl = strlen(key); - if(ksl > ssl)return 1; - for(i=ssl-ksl, z=0;i= 'A' && str[i] <= 'Z') { - if(str[i] != key[z] && str[i]+0x20 != key[z])return 1; - } else if(str[i] >= 'a' && str[i] <= 'z') { - if(str[i] != key[z] && str[i]-0x20 != key[z])return 1; - } else { - if(str[i] != key[z])return 1; - } - } - return 0; -} -ulong striend(string *str, char *key) { return striend(str->s, key); } -ulong striend(stringlist *str, ulong num, char *key) { return striend(strptr(str, num), key); } - -void strltrim(char *str, char *key) { -int i, ssl = strlen(str), ksl = strlen(key); - if(ksl > ssl)return; - if(!strbegin(str, key)) { - for(i=0;is, key); } -void strltrim(stringlist *str, ulong num, char *key) { strltrim(strptr(str, num), key); } - -void striltrim(char *str, char *key) { -int i, ssl = strlen(str), ksl = strlen(key); - if(ksl > ssl)return; - if(!stribegin(str, key)) { - for(i=0;is, key); } -void striltrim(stringlist *str, ulong num, char *key) { striltrim(strptr(str, num), key); } - -void strrtrim(char *str, char *key) { -int ssl = strlen(str), ksl = strlen(key); - if(ksl > ssl)return; - if(!strend(str, key)) { - str[ssl - ksl] = 0; - } -} -void strrtrim(string *str, char *key) { strrtrim(str->s, key); } -void strrtrim(stringlist *str, ulong num, char *key) { strrtrim(strptr(str, num), key); } - -void strirtrim(char *str, char *key) { -int ssl = strlen(str), ksl = strlen(key); - if(ksl > ssl)return; - if(!striend(str, key)) { - str[ssl - ksl] = 0; - } -} -void strirtrim(string *str, char *key) { strirtrim(str->s, key); } -void strirtrim(stringlist *str, ulong num, char *key) { strirtrim(strptr(str, num), key); } - -ulong strhex(char *str) { -ulong r = 0, m = 0; -int i, ssl = strlen(str); -byte x; - for(i=0;i= '0' && str[i] <= '9'); - else if(str[i] >= 'A' && str[i] <= 'F'); - else if(str[i] >= 'a' && str[i] <= 'f'); - else break; - } - for(--i;i>=0;i--, m+=4) { - x = str[i]; - if(x >= '0' && x <= '9')x -= '0'; - else if(x >= 'A' && x <= 'F')x -= 'A' - 0x0a; - else if(x >= 'a' && x <= 'f')x -= 'a' - 0x0a; - else return r; - r |= x << m; - } - return r; -} -ulong strhex(string *str) { return strhex(str->s); } -ulong strhex(stringlist *str, ulong num) { return strhex(strptr(str, num)); } - -ulong strdec(char *str) { -ulong r = 0, m = 1; -int i, ssl = strlen(str); -byte x; - for(i=0;i= '0' && str[i] <= '9'); - else break; - } - for(--i;i>=0;i--, m*=10) { - x = str[i]; - if(x >= '0' && x <= '9')x -= '0'; - else return r; - r += x * m; - } - return r; -} -ulong strdec(string *str) { return strdec(str->s); } -ulong strdec(stringlist *str, ulong num) { return strdec(strptr(str, num)); } - -ulong strbin(char *str) { -ulong r = 0, m = 0; -int i, ssl = strlen(str); -byte x; - for(i=0;i=0;i--, m++) { - x = str[i]; - if(str[i] == '0' || str[i] == '1')x -= '0'; - else return r; - r |= x << m; - } - return r; -} -ulong strbin(string *str) { return strbin(str->s); } -ulong strbin(stringlist *str, ulong num) { return strbin(strptr(str, num)); } - -#include "libstr_math.cpp" -#include "libstr_split.cpp" -#include "libstr_replace.cpp" -#include "libstr_sprintf.cpp" diff --git a/bsnes/misc/libstr_math.cpp b/bsnes/misc/libstr_math.cpp deleted file mode 100644 index 7bfedea5..00000000 --- a/bsnes/misc/libstr_math.cpp +++ /dev/null @@ -1,181 +0,0 @@ -#define STRMATH_ADD 1 -#define STRMATH_SUB 2 -#define STRMATH_MUL 3 -#define STRMATH_DIV 4 -#define STRMATH_MOD 5 -#define STRMATH_AND 6 -#define STRMATH_OR 7 -#define STRMATH_XOR 8 -#define STRMATH_SHL 9 -#define STRMATH_SHR 10 - -#define STRMATH_LINKED 64 - -#define STRMATHMODE_NEG 1 -#define STRMATHMODE_NOT 2 - -#define __strunktonum() \ - if (s1[0] == '0' && s1[1] == 'x')r = strhex(s1 + 2); \ - else if(s1[0] == '0' && s1[1] == 'b')r = strbin(s1 + 2); \ - else r = strdec(s1) - -#define __strmath_setmode() \ - if (str[i] == '-') { mode = STRMATHMODE_NEG; i++; } \ - else if(str[i] == '~') { mode = STRMATHMODE_NOT; i++; } \ - else if(str[i] == '+') { i++; } \ - else mode=0 - -#define __strmath_modeset() \ - if (mode == STRMATHMODE_NEG)r *= -1; \ - else if(mode == STRMATHMODE_NOT)r =~ r - -#define __strmath_set(__x) \ - s1[z] = 0; \ - z = 0; \ - __strunktonum(); \ - __strmath_modeset(); \ - array[array_size++] = r; \ - array_gate[array_size] = __x - -/*************************************** -strmath(str) - resolves all math entities from within - str, and returns numerical result - example: strmath("5+5")=10 -***************************************/ -ulong p_strmath(char *str) { -int i = 0, ssl = strlen(str); -byte x, mode = 0; -ulong r, array[128], array_size = 0, z = 0; -byte array_gate[128]; -char *s1; - if(!ssl)return 0; - s1 = (char*)malloc(ssl + 1); - __strmath_setmode(); - while(i < ssl) { - x = str[i++]; - if (x == '+') { __strmath_set(STRMATH_ADD); __strmath_setmode(); } - else if(x == '-') { __strmath_set(STRMATH_SUB); __strmath_setmode(); } - else if(x == '*') { __strmath_set(STRMATH_MUL); __strmath_setmode(); } - else if(x == '/') { __strmath_set(STRMATH_DIV); __strmath_setmode(); } - else if(x == '%') { __strmath_set(STRMATH_MOD); __strmath_setmode(); } - else if(x == '&') { __strmath_set(STRMATH_AND); __strmath_setmode(); } - else if(x == '|') { __strmath_set(STRMATH_OR ); __strmath_setmode(); } - else if(x == '^') { __strmath_set(STRMATH_XOR); __strmath_setmode(); } - else if(x == '<' && str[i] == '<') { __strmath_set(STRMATH_SHL); i++; __strmath_setmode(); } - else if(x == '>' && str[i] == '>') { __strmath_set(STRMATH_SHR); i++; __strmath_setmode(); } - else s1[z++] = x; - } - s1[z] = 0; - __strunktonum(); - __strmath_modeset(); - array[array_size++] = r; - free(s1); - - for(i=1;i>= array[i]; array_gate[i] = STRMATH_LINKED; } - } - - for(i=1;i maxpdepth)maxpdepth = pdepth; - } else if(str[i]==')') { - if(pdepth == 0) { - free(str); - return null; //error! too many )'s - } - pdepth --; - } - } - - if(pdepth != 0) { - free(str); - return null; //error! unequal ('s to )'s - } - - pdepth = maxpdepth; - while(pdepth) { - cpdepth = 0; - for(i=0;is); } -ulong strmath(stringlist *str, ulong num) { return strmath(strptr(str, num)); } - -ulong strmathentity(char *str) { -int i, ssl = strlen(str); - for(i=0;i' && str[i+1] == '>'))return 1; - } - return 0; -} -ulong strmathentity(string *str) { return strmathentity(str->s); } -ulong strmathentity(stringlist *str, ulong num) { return strmathentity(strptr(str, num)); } diff --git a/bsnes/misc/libstr_replace.cpp b/bsnes/misc/libstr_replace.cpp deleted file mode 100644 index 415ea3d4..00000000 --- a/bsnes/misc/libstr_replace.cpp +++ /dev/null @@ -1,82 +0,0 @@ -void replace(string *str, char *key, char *token) { -int i, z, ksl = strlen(key), tsl = strlen(token), ssl = strlen(str); -ulong replace_count = 0, size; -char *data; - if(ksl > ssl)return; - if(tsl > ksl) { //the new string may be longer than the old string... - for(i=0;i<=ssl-ksl;) { //so let's find out how big of a string we'll need... - if(!memcmp(str->s + i, key, ksl)) { - replace_count++; - i += ksl; - } else i++; - } - size = ssl + ((tsl - ksl) * replace_count); - if(size > str->size)strresize(str, size); - } - data = (char*)malloc(size + 1); - for(i=z=0;is + i, key, ksl)) { - memcpy(data + z, token, tsl); - z += tsl; - i += ksl; - } else data[z++] = str->s[i++]; - } else data[z++] = str->s[i++]; - } - data[z] = 0; - strcpy(str, data); - free(data); -} - -void replace_q(string *str, char *key, char *token) { -int i, l, z, ksl = strlen(key), tsl = strlen(token), ssl = strlen(str); -byte x; -ulong replace_count = 0, size; -char *data; - if(ksl > ssl)return; - if(tsl > ksl) { - for(i=0;i<=ssl-ksl;) { - x = str->s[i]; - if(x == '\"' || x == '\'') { - l = i; - i++; - while(str->s[i++] != x) { - if(i == ssl) { - i = l; - break; - } - } - } - if(!memcmp(str->s + i, key, ksl)) { - replace_count++; - i += ksl; - } else i++; - } - size = ssl + ((tsl - ksl) * replace_count); - if(size > str->size)strresize(str, size); - } - data = (char*)malloc(size + 1); - for(i=z=0;is[i]; - if(x == '\"' || x == '\'') { - l = i++; - while(str->s[i] != x && i < ssl)i++; - if(i >= ssl)i = l; - else { - memcpy(data + z, str->s + l, i - l); - z += i - l; - } - } - if(i <= ssl - ksl) { - if(!memcmp(str->s + i, key, ksl)) { - memcpy(data + z, token, tsl); - z += tsl; - i += ksl; - replace_count++; - } else data[z++] = str->s[i++]; - } else data[z++] = str->s[i++]; - } - data[z] = 0; - strcpy(str, data); - free(data); -} diff --git a/bsnes/misc/libstr_split.cpp b/bsnes/misc/libstr_split.cpp deleted file mode 100644 index 91f9ff1e..00000000 --- a/bsnes/misc/libstr_split.cpp +++ /dev/null @@ -1,41 +0,0 @@ -void split(stringlist *dest, char *key, char *src) { -int i, ssl = strlen(src), ksl = strlen(key); -byte x; -ulong lp = 0, split_count = 0; - for(i=0;i<=ssl-ksl;) { - if(!memcmp(src + i, key, ksl)) { - x = src[i]; - src[i] = 0; - strcpy(dest, split_count++, src + lp); - src[i] = x; - i += ksl; - lp = i; - } else i++; - } - strcpy(dest, split_count++, src + lp); -} -void split(stringlist *dest, char *key, string *src) { split(dest, key, src->s); } - -void split_q(stringlist *dest, char *key, char *src) { -int i, z, ssl = strlen(src), ksl = strlen(key); -byte x; -ulong lp = 0, split_count = 0; - for(i=0;i<=ssl-ksl;) { - x = src[i]; - if(x=='\"' || x=='\'') { - z = i++; - while(src[i] != x && i < ssl)i++; - if(i >= ssl)i = z; - } - if(!memcmp(src + i, key, ksl)) { - x = src[i]; - src[i] = 0; - strcpy(dest, split_count++, src + lp); - src[i] = x; - i += ksl; - lp = i; - } else i++; - } - strcpy(dest, split_count++, src + lp); -} -void split_q(stringlist *dest, char *key, string *src) { split_q(dest, key, src->s); } diff --git a/bsnes/misc/libstr_sprintf.cpp b/bsnes/misc/libstr_sprintf.cpp deleted file mode 100644 index 30a67a2d..00000000 --- a/bsnes/misc/libstr_sprintf.cpp +++ /dev/null @@ -1,130 +0,0 @@ -void numtobin(char *s, ulong num) { -ulong mask = 0x80000000, len = 0, z = 0; - for(;mask;mask>>=1,len++) { if(num&mask)break; } - len = 32 - len; - do { - if(num&(1<<(len-1)))s[z++] = '1'; - else s[z++] = '0'; - }while(--len); - s[z] = 0; -} - -void sprintf(string *str, char *s, ...) { -va_list args; -char t[2], n[256]; -int i, l, sl, z; -byte pad_type, pad_len; -ulong num; -char *r; - va_start(args, s); - strcpy(str, ""); - for(i=0;i= '0' && s[i+2] <= '9')) { - pad_type = 1; - if(s[i+3] >= '0' && s[i+3] <= '9') { pad_len = (s[i+2]-'0')*10 + (s[i+3]-'0'); i+=4; } - else { pad_len = (s[i+2]-'0'); i+=3; } - } - else if(s[i] >= '0' && s[i] <= '9') { - pad_type = 2; - if(s[i+1] >= '0' && s[i+1] <= '9') { pad_len = (s[i]-'0')*10 + (s[i+1]-'0'); i+=2; } - else { pad_len = (s[i]-'0'); i+=1; } - } - else { pad_type = 0; } - - if(s[i] == 'd') { - num = va_arg(args, ulong); - sprintf(n, "%d", num); - } else if(s[i] == 'x') { - num = va_arg(args, ulong); - sprintf(n, "%x", num); - } else if(s[i] == 'b') { - num = va_arg(args, ulong); - numtobin(n, num); - } else if(s[i] == 's') { - r = va_arg(args, char*); - } - - if(pad_type != 0) { - if(s[i] == 's')sl = strlen(r); - else sl = strlen(n); - if(sl < pad_len) { - while(sl < pad_len) { - strcat(str, (pad_type == 1)?"0":" "); - sl++; - } - } - } - - if(s[i] == 's')strcat(str, r); - else strcat(str, n); - } else { - t[0] = s[i]; - t[1] = 0; - strcat(str, t); - } - } - va_end(args); -} - - -void sprintf(stringlist *str_list, ulong str_num, char *s, ...) { -va_list args; -char t[2], n[256]; -int i, l, sl, z; -byte pad_type, pad_len; -ulong num; -char *r; -string *str = strget(str_list, str_num); - va_start(args, s); - strcpy(str, ""); - for(i=0;i= '0' && s[i+2] <= '9')) { - pad_type = 1; - if(s[i+3] >= '0' && s[i+3] <= '9') { pad_len = (s[i+2]-'0')*10 + (s[i+3]-'0'); i+=4; } - else { pad_len = (s[i+2]-'0'); i+=3; } - } - else if(s[i] >= '0' && s[i] <= '9') { - pad_type = 2; - if(s[i+1] >= '0' && s[i+1] <= '9') { pad_len = (s[i]-'0')*10 + (s[i+1]-'0'); i+=2; } - else { pad_len = (s[i]-'0'); i+=1; } - } - else { pad_type = 0; } - - if(s[i] == 'd') { - num = va_arg(args, ulong); - sprintf(n, "%d", num); - } else if(s[i] == 'x') { - num = va_arg(args, ulong); - sprintf(n, "%x", num); - } else if(s[i] == 'b') { - num = va_arg(args, ulong); - numtobin(n, num); - } else if(s[i] == 's') { - r = va_arg(args, char*); - } - - if(pad_type != 0) { - if(s[i] == 's')sl = strlen(r); - else sl = strlen(n); - if(sl < pad_len) { - while(sl < pad_len) { - strcat(str, (pad_type == 1)?"0":" "); - sl++; - } - } - } - - if(s[i] == 's')strcat(str, r); - else strcat(str, n); - } else { - t[0] = s[i]; - t[1] = 0; - strcat(str, t); - } - } - va_end(args); -} diff --git a/bsnes/misc/libvlist.cpp b/bsnes/misc/libvlist.cpp deleted file mode 100644 index d5825364..00000000 --- a/bsnes/misc/libvlist.cpp +++ /dev/null @@ -1,55 +0,0 @@ -ulong __vector_resize(ulong val) -{ -int i; - for(i=0;i<32;i++) { - if((1<= val)break; - } -//if the value is >2 million, this will fail, in which case, -//just use value. otherwise, use the power of 2. - if((1< val)val = 1< max_size)alloc(size + 1); - list[size - 1] = val; - } - - void set(ulong num, ulong val) { - if(num >= max_size)alloc(num + 1); - list[num] = val; - if(++num > size)size = num; - } - - ulong get(ulong num) { - if(num >= max_size)return 0; - return list[num]; - } - - vectorlist() { - list = 0; - size = 0; - max_size = 8; - list = (ulong*)malloc(8*4); - } - - ~vectorlist() { - if(list)free(list); - } - -}; diff --git a/bsnes/ppu/mmio.cpp b/bsnes/ppu/mmio.cpp deleted file mode 100644 index 3d3a549a..00000000 --- a/bsnes/ppu/mmio.cpp +++ /dev/null @@ -1,260 +0,0 @@ -#include "../base.h" -#include "../timing/timing.h" -#include "../cpu/g65816.h" -#include "../bridge/bridge.h" - -extern g65816 *gx816; -extern snes_timer *snes_time; -extern videostate render; -extern debugstate debugger; -extern port_bridge *cpu_apu_bridge; -ppustate ppu; - -#include "ppu_cache.cpp" - -#include "ppu_spc.cpp" -#include "ppu_dma.cpp" -#include "ppu_screen.cpp" -#include "ppu_vram.cpp" -#include "ppu_palette.cpp" -#include "ppu_timing.cpp" -#include "ppu_oam.cpp" -#include "ppu_wram.cpp" -#include "ppu_mode7.cpp" -#include "ppu_scroll.cpp" -#include "ppu_muldiv.cpp" -#include "ppu_window.cpp" -#include "ppu_addsub.cpp" -#include "ppu_joypad.cpp" -#include "ppu_misc.cpp" - -#include "ppu.cpp" - -byte mmio_read(word addr) { - snes_time->update_timer(); - - if((snes_time->hscan_pos >= 274 || snes_time->vscan_pos >= (ppu.visible_scanlines + 1)) || ppu.display_disable == true) { - switch(addr) { - case 0x2139:return mmio_r2139(); - case 0x213a:return mmio_r213a(); - case 0x213b:return mmio_r213b(); - } - } - - switch(addr) { - case 0x2134:return mmio_r2134(); - case 0x2135:return mmio_r2135(); - case 0x2136:return mmio_r2136(); - case 0x2137:return mmio_r2137(); - case 0x2138:return mmio_r2138(); - case 0x213c:return mmio_r213c(); - case 0x213d:return mmio_r213d(); - case 0x213e:return mmio_r213e(); - case 0x213f:return mmio_r213f(); - } - - switch(addr) { - case 0x2140:case 0x2141:case 0x2142:case 0x2143: - case 0x2144:case 0x2145:case 0x2146:case 0x2147: - case 0x2148:case 0x2149:case 0x214a:case 0x214b: - case 0x214c:case 0x214d:case 0x214e:case 0x214f: - case 0x2150:case 0x2151:case 0x2152:case 0x2153: - case 0x2154:case 0x2155:case 0x2156:case 0x2157: - case 0x2158:case 0x2159:case 0x215a:case 0x215b: - case 0x215c:case 0x215d:case 0x215e:case 0x215f: - case 0x2160:case 0x2161:case 0x2162:case 0x2163: - case 0x2164:case 0x2165:case 0x2166:case 0x2167: - case 0x2168:case 0x2169:case 0x216a:case 0x216b: - case 0x216c:case 0x216d:case 0x216e:case 0x216f: - case 0x2170:case 0x2171:case 0x2172:case 0x2173: - case 0x2174:case 0x2175:case 0x2176:case 0x2177: - case 0x2178:case 0x2179:case 0x217a:case 0x217b: - case 0x217c:case 0x217d:case 0x217e:case 0x217f: - return mmio_rspc((addr & 3)); - break; - - case 0x2180:return mmio_r2180(); - - case 0x21c2:return mmio_r21c2(); - case 0x21c3:return mmio_r21c3(); - - case 0x4016:return mmio_r4016(); - case 0x4210:return mmio_r4210(); - case 0x4211:return mmio_r4211(); - case 0x4212:return mmio_r4212(); - case 0x4214:return mmio_r4214(); - case 0x4215:return mmio_r4215(); - case 0x4216:return mmio_r4216(); - case 0x4217:return mmio_r4217(); - case 0x4218:return mmio_r4218(); - case 0x4219:return mmio_r4219(); - default: -/* - dprintf("* mmio: unknown read [%0.4x]", addr); - debug_set_state(DEBUGMODE_WAIT); - disas_g65816_op(); -*/ - break; - } - - if(addr >= 0x4300 && addr <= 0x437f) { - if((addr & 0xf) == 0x8)return mmio_r43x8((addr >> 4) & 7); - if((addr & 0xf) == 0x9)return mmio_r43x9((addr >> 4) & 7); - if((addr & 0xf) == 0xa)return mmio_r43xa((addr >> 4) & 7); - return ppu.mmio_mem_43xx[addr & 0x7f]; - } - - return 0x00; -} - -void mmio_write(word addr, byte value) { - snes_time->update_timer(); - - if((snes_time->hscan_pos >= 274 || snes_time->vscan_pos >= (ppu.visible_scanlines + 1)) || ppu.display_disable == true) { - switch(addr) { - case 0x2118:mmio_w2118(value);break; - case 0x2119:mmio_w2119(value);break; - case 0x2122:mmio_w2122(value);break; - } - } - - switch(addr) { - case 0x2100:mmio_w2100(value);break; - case 0x2101:mmio_w2101(value);break; - case 0x2102:mmio_w2102(value);break; - case 0x2103:mmio_w2103(value);break; - case 0x2104:mmio_w2104(value);break; - case 0x2105:mmio_w2105(value);break; - case 0x2106:mmio_w2106(value);break; - case 0x2107:mmio_w2107(value);break; - case 0x2108:mmio_w2108(value);break; - case 0x2109:mmio_w2109(value);break; - case 0x210a:mmio_w210a(value);break; - case 0x210b:mmio_w210b(value);break; - case 0x210c:mmio_w210c(value);break; - case 0x210d:mmio_w210d(value);break; - case 0x210e:mmio_w210e(value);break; - case 0x210f:mmio_w210f(value);break; - case 0x2110:mmio_w2110(value);break; - case 0x2111:mmio_w2111(value);break; - case 0x2112:mmio_w2112(value);break; - case 0x2113:mmio_w2113(value);break; - case 0x2114:mmio_w2114(value);break; - case 0x2115:mmio_w2115(value);break; - case 0x2116:mmio_w2116(value);break; - case 0x2117:mmio_w2117(value);break; - case 0x211a:mmio_w211a(value);break; - case 0x211b:mmio_w211b(value);break; - case 0x211c:mmio_w211c(value);break; - case 0x211d:mmio_w211d(value);break; - case 0x211e:mmio_w211e(value);break; - case 0x211f:mmio_w211f(value);break; - case 0x2120:mmio_w2120(value);break; - case 0x2121:mmio_w2121(value);break; - case 0x2123:mmio_w2123(value);break; - case 0x2124:mmio_w2124(value);break; - case 0x2125:mmio_w2125(value);break; - case 0x2126:mmio_w2126(value);break; - case 0x2127:mmio_w2127(value);break; - case 0x2128:mmio_w2128(value);break; - case 0x2129:mmio_w2129(value);break; - case 0x212a:mmio_w212a(value);break; - case 0x212b:mmio_w212b(value);break; - case 0x212c:mmio_w212c(value);break; - case 0x212d:mmio_w212d(value);break; - case 0x212e:mmio_w212e(value);break; - case 0x212f:mmio_w212f(value);break; - case 0x2130:mmio_w2130(value);break; - case 0x2131:mmio_w2131(value);break; - case 0x2132:mmio_w2132(value);break; - case 0x2133:mmio_w2133(value);break; - } - - if(addr >= 0x2140 && addr <= 0x217f) { - mmio_wspc(addr & 3, value); - } - - switch(addr) { - case 0x2180:mmio_w2180(value);break; - case 0x2181:mmio_w2181(value);break; - case 0x2182:mmio_w2182(value);break; - case 0x2183:mmio_w2183(value);break; - } - - switch(addr) { - case 0x4016:mmio_w4016(value);break; - case 0x4200:mmio_w4200(value);break; - case 0x4201:mmio_w4201(value);break; - case 0x4202:mmio_w4202(value);break; - case 0x4203:mmio_w4203(value);break; - case 0x4204:mmio_w4204(value);break; - case 0x4205:mmio_w4205(value);break; - case 0x4206:mmio_w4206(value);break; - case 0x4207:mmio_w4207(value);break; - case 0x4208:mmio_w4208(value);break; - case 0x4209:mmio_w4209(value);break; - case 0x420a:mmio_w420a(value);break; - case 0x420b:mmio_w420b(value);break; - case 0x420c:mmio_w420c(value);break; - case 0x420d:mmio_w420d(value);break; - - case 0x4300:case 0x4310:case 0x4320:case 0x4330: - case 0x4340:case 0x4350:case 0x4360:case 0x4370: - mmio_w43x0((addr >> 4) & 7, value); - break; - - case 0x4301:case 0x4311:case 0x4321:case 0x4331: - case 0x4341:case 0x4351:case 0x4361:case 0x4371: - mmio_w43x1((addr >> 4) & 7, value); - break; - - case 0x4302:case 0x4312:case 0x4322:case 0x4332: - case 0x4342:case 0x4352:case 0x4362:case 0x4372: - mmio_w43x2((addr >> 4) & 7, value); - break; - - case 0x4303:case 0x4313:case 0x4323:case 0x4333: - case 0x4343:case 0x4353:case 0x4363:case 0x4373: - mmio_w43x3((addr >> 4) & 7, value); - break; - - case 0x4304:case 0x4314:case 0x4324:case 0x4334: - case 0x4344:case 0x4354:case 0x4364:case 0x4374: - mmio_w43x4((addr >> 4) & 7, value); - break; - - case 0x4305:case 0x4315:case 0x4325:case 0x4335: - case 0x4345:case 0x4355:case 0x4365:case 0x4375: - mmio_w43x5((addr >> 4) & 7, value); - break; - - case 0x4306:case 0x4316:case 0x4326:case 0x4336: - case 0x4346:case 0x4356:case 0x4366:case 0x4376: - mmio_w43x6((addr >> 4) & 7, value); - break; - - case 0x4307:case 0x4317:case 0x4327:case 0x4337: - case 0x4347:case 0x4357:case 0x4367:case 0x4377: - mmio_w43x7((addr >> 4) & 7, value); - break; - - case 0x4308:case 0x4318:case 0x4328:case 0x4338: - case 0x4348:case 0x4358:case 0x4368:case 0x4378: - mmio_w43x8((addr >> 4) & 7, value); - break; - - case 0x4309:case 0x4319:case 0x4329:case 0x4339: - case 0x4349:case 0x4359:case 0x4369:case 0x4379: - mmio_w43x9((addr >> 4) & 7, value); - break; - - case 0x430a:case 0x431a:case 0x432a:case 0x433a: - case 0x434a:case 0x435a:case 0x436a:case 0x437a: - mmio_w43xa((addr >> 4) & 7, value); - break; - } - - if(addr >= 0x4300 && addr <= 0x437f) { - ppu.mmio_mem_43xx[addr & 0x7f] = value; - } -} diff --git a/bsnes/ppu/ppu.cpp b/bsnes/ppu/ppu.cpp deleted file mode 100644 index 88f8ddb5..00000000 --- a/bsnes/ppu/ppu.cpp +++ /dev/null @@ -1,412 +0,0 @@ -#define RENDER_MAIN 0 -#define RENDER_SUB 1 - -#include "ppu_render.cpp" - -byte layer_bg_lookup_mode0[12] = { - BG4, BG3, OAM, BG4, BG3, OAM, BG2, BG1, OAM, BG2, BG1, OAM -}; - -void ppu_render_line_mode0(void) { - ppu_render_line_bg (7, 10, COLORDEPTH_4, BG1); - ppu_render_line_bg (6, 9, COLORDEPTH_4, BG2); - ppu_render_line_bg (1, 4, COLORDEPTH_4, BG3); - ppu_render_line_bg (0, 3, COLORDEPTH_4, BG4); - ppu_render_line_oam(2, 5, 8, 11); - ppu_set_layer_pixels(12, layer_bg_lookup_mode0); -} - -byte layer_bg_lookup_mode1_pri0[10] = { - BG3, OAM, BG3, OAM, BG2, BG1, OAM, BG2, BG1, OAM -}; - -byte layer_bg_lookup_mode1_pri1[10] = { - BG3, OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM, BG3 -}; - -void ppu_render_line_mode1(void) { - switch(ppu.bg_priority_mode) { - case 0: - ppu_render_line_bg (5, 8, COLORDEPTH_16, BG1); - ppu_render_line_bg (4, 7, COLORDEPTH_16, BG2); - ppu_render_line_bg (0, 2, COLORDEPTH_4, BG3); - ppu_render_line_oam(1, 3, 6, 9); - ppu_set_layer_pixels(10, layer_bg_lookup_mode1_pri0); - break; - case 1: - ppu_render_line_bg (4, 7, COLORDEPTH_16, BG1); - ppu_render_line_bg (3, 6, COLORDEPTH_16, BG2); - ppu_render_line_bg (0, 9, COLORDEPTH_4, BG3); - ppu_render_line_oam(1, 2, 5, 8); - ppu_set_layer_pixels(10, layer_bg_lookup_mode1_pri1); - break; - } -} - -byte layer_bg_lookup_mode2[8] = { - OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM -}; - -void ppu_render_line_mode2(void) { - ppu_render_line_bg (3, 6, COLORDEPTH_16, BG1); - ppu_render_line_bg (2, 5, COLORDEPTH_16, BG2); - ppu_render_line_oam(0, 1, 4, 7); - ppu_set_layer_pixels(8, layer_bg_lookup_mode2); -} - -byte layer_bg_lookup_mode3[8] = { - OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM -}; - -void ppu_render_line_mode3(void) { - ppu_render_line_bg (3, 6, COLORDEPTH_256, BG1); - ppu_render_line_bg (2, 5, COLORDEPTH_16, BG2); - ppu_render_line_oam(0, 1, 4, 7); - ppu_set_layer_pixels(8, layer_bg_lookup_mode3); -} - -byte layer_bg_lookup_mode4[8] = { - OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM -}; - -void ppu_render_line_mode4(void) { - ppu_render_line_bg (3, 6, COLORDEPTH_256, BG1); - ppu_render_line_bg (2, 5, COLORDEPTH_4, BG2); - ppu_render_line_oam(0, 1, 4, 7); - ppu_set_layer_pixels(8, layer_bg_lookup_mode4); -} - -byte layer_bg_lookup_mode5[8] = { - OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM -}; - -void ppu_render_line_mode5(void) { - ppu_render_line_bg (3, 6, COLORDEPTH_16, BG1); - ppu_render_line_bg (2, 5, COLORDEPTH_4, BG2); - ppu_render_line_oam(0, 1, 4, 7); - ppu_set_layer_pixels(8, layer_bg_lookup_mode5); -} - -byte layer_bg_lookup_mode6[6] = { - OAM, OAM, BG1, OAM, BG1, OAM -}; - -void ppu_render_line_mode6(void) { - ppu_render_line_bg (2, 4, COLORDEPTH_16, BG1); - ppu_render_line_oam(0, 1, 3, 5); - ppu_set_layer_pixels(8, layer_bg_lookup_mode6); -} - -byte layer_bg_lookup_mode7[5] = { - OAM, BG1, OAM, OAM, OAM -}; - -byte layer_bg_lookup_mode7_extbg[6] = { - BG2, OAM, OAM, BG2, OAM, OAM -}; - -void ppu_render_line_mode7(void) { - if(ppu.mode7_extbg == false) { - ppu_render_line_m7 (1, 0, 0); //bg2 priorities are ignored - ppu_render_line_oam(0, 2, 3, 4); - ppu_set_layer_pixels(5, layer_bg_lookup_mode7); - } else { - ppu_render_line_m7 (0, 0, 3); //bg1 priority is ignored - ppu_render_line_oam(1, 2, 4, 5); - ppu_set_layer_pixels(6, layer_bg_lookup_mode7_extbg); - } -} - -void ppu_render_scanline(void) { -int x, y; - ppu.vline_pos = snes_time->vscan_pos; - ppu.hirq_triggered = false; - -//new screen initialize - if(ppu.vline_pos == 0) { - hdma_initialize(); - ppu.virq_triggered = false; - gx816->nmi_pin = 1; - } - -//screen refresh - if(ppu.vline_pos == ppu.visible_scanlines) { - if(render.frame_count == 0) { - UpdateDisplay(); - } - render.frame_count++; - if(render.frame_count >= render.frame_skip) { - render.frame_count = 0; - } - } - -//automatic joypad read - if(ppu.vline_pos == (ppu.visible_scanlines + 1) && ppu.auto_joypad_read == true) { - UpdateJoypad(); - } - - y = ppu.vline_pos; - if(y > 0 && y < ppu.visible_scanlines && (render.frame_skip == 0 || render.frame_count == 0)) { - if(ppu.display_disable == true) { - memset(ppu.screen + (y << 1) * 512, 0, 2048); - } else { - ppu_clear_layer_cache(); - ppu_clear_pixel_cache(); - switch(ppu.bg_mode) { - case 0:ppu_render_line_mode0();break; - case 1:ppu_render_line_mode1();break; - case 2:ppu_render_line_mode2();break; - case 3:ppu_render_line_mode3();break; - case 4:ppu_render_line_mode4();break; - case 5:ppu_render_line_mode5();break; - case 6:ppu_render_line_mode6();break; - case 7:ppu_render_line_mode7();break; - } - ppu_render_line_to_screen(); - } - } -} - -void ppu_update_scanline(void) { -static bool hdma_triggered = false; -word current_vscan_pos; -//starting a new screen? - if(snes_time->vscan_wrapped == true) { - snes_time->vscan_wrapped = false; - } - - if(snes_time->hscan_wrapped == true) { - snes_time->hscan_wrapped = false; - hdma_triggered = false; - ppu_render_scanline(); - } - - if(snes_time->hscan_pos >= 278 && hdma_triggered == false) { - hdma_update(); - hdma_triggered = true; - } - - if(gx816->cpu_state == CPUSTATE_STP)return; - - if(!(gx816->regs.p & PF_I)) { - if(ppu.vcounter_enabled == true && ppu.hcounter_enabled == true) { - if(snes_time->vscan_pos == ppu.virq_pos && ppu.virq_triggered == false) { - if(snes_time->hscan_pos >= ppu.hirq_pos && ppu.hirq_triggered == false) { - ppu.irq_triggered = true; - ppu.virq_triggered = true; - ppu.hirq_triggered = true; - gx816->InvokeIRQ(0xffee); - } - } - } else if(ppu.vcounter_enabled == true) { - if(snes_time->vscan_pos == ppu.virq_pos && ppu.virq_triggered == false) { - ppu.irq_triggered = true; - ppu.virq_triggered = true; - gx816->InvokeIRQ(0xffee); - } - } else if(ppu.hcounter_enabled == true) { - if(snes_time->hscan_pos >= ppu.hirq_pos && ppu.hirq_triggered == false) { - ppu.irq_triggered = true; - ppu.hirq_triggered = true; - gx816->InvokeIRQ(0xffee); - } - } - } -} - -byte oam_read(word addr) { -byte r; - addr &= 1023; - if(addr >= 512) { - addr &= 31; - r = ppu.oam[addr + 512]; - debug_test_bp(BPSRC_OAM, BP_READ, addr + 512, r); - } else { - r = ppu.oam[addr]; - debug_test_bp(BPSRC_OAM, BP_READ, addr, r); - } - return r; -} - -void oam_write(word addr, byte value) { - addr &= 1023; - if(addr >= 512) { - addr &= 31; - ppu.oam[addr + 512] = value; - debug_test_bp(BPSRC_OAM, BP_WRITE, addr + 512, value); - } else { - ppu.oam[addr] = value; - debug_test_bp(BPSRC_OAM, BP_WRITE, addr, value); - } -} - -void PPUInit(byte first_time) { -int i, l; -byte r, g, b; -double m; -word *ptr; - if(first_time == 1) { - ppu.screen = (word*)malloc(512 * 478 * 2); - ppu.vram = (byte*)malloc(0x10000); - ppu.cgram = (byte*)malloc(512); - ppu.oam = (byte*)malloc(544); - ppu.light_table = (word*)malloc(16 * 65536 * 2); - ppu_init_tiledata_cache(); - - for(l=0;l<16;l++) { - ppu.mosaic_table[l] = (word*)malloc(4096 * 2); - for(i=0;i<4096;i++) { - ppu.mosaic_table[l][i] = (i / (l + 1)) * (l + 1); - } - } - - ptr = (word*)ppu.light_table; - for(l=0;l<16;l++) { - m = (double)l / 15.0; - for(i=0;i<65536;i++) { - r = (i ) & 31; - g = (i >> 5) & 31; - b = (i >> 10) & 31; - if(l == 0) { r = g = b = 0; } - else if(l == 15); - else { - r = (double)r * m; - g = (double)g * m; - b = (double)b * m; - } - *ptr++ = (r) | (g << 5) | (b << 10); - } - } - } - ppu_clear_tiledata_cache(); - memset(ppu.screen, 0, 512 * 478 * 2); - memset(ppu.vram, 0, 0x10000); - memset(ppu.cgram, 0, 512); - memset(ppu.oam, 0, 544); - ppu.ppu_cycles = 0; - ppu.ppu_prev_cycles = 0; - ppu.display_disable = true; - ppu.display_brightness = 15; - -//ppu.interlace/ppu.interlace_frame initialized in timing/timing.cpp - ppu.overscan = false; - ppu.visible_scanlines = 224; - ppu.sprite_halve = false; - ppu.hline_pos = 0; - ppu.vline_pos = 0; - ppu.irq_triggered = false; - ppu.virq_triggered = false; - ppu.hirq_triggered = false; - ppu.vram_write_pos = 0; - ppu.vram_read_buffer = 0; - ppu.vram_write_buffer = 0; - ppu.cgram_write_pos = 0; - ppu.wram_write_pos = 0; - ppu.vram_remap_mode = 0; - ppu.vram_inc_size = 2; - ppu.vram_inc_reg = 0; - ppu.oam_write_pos = 0; - ppu.oam_tiledata_loc = 0; - - ppu.bg_enabled[OAM] = false; - ppu.ss_bg_enabled[OAM] = false; - ppu.mosaic_size = 0; - ppu.mosaic_enabled[BG4] = false; - ppu.mosaic_enabled[BG3] = false; - ppu.mosaic_enabled[BG2] = false; - ppu.mosaic_enabled[BG1] = false; - ppu.bg_windowing_enabled[OAM] = false; - ppu.ss_bg_windowing_enabled[OAM] = false; - ppu.bg_window1_enabled[OAM] = false; - ppu.bg_window2_enabled[OAM] = false; - ppu.bg_window1_clipmode[OAM] = false; - ppu.bg_window2_clipmode[OAM] = false; - ppu.bg_window_mask[OAM] = false; - - for(i=0;i<4;i++) { - ppu.bg_enabled[i] = false; - ppu.ss_bg_enabled[i] = false; - ppu.bg_window1_enabled[i] = false; - ppu.bg_window2_enabled[i] = false; - ppu.bg_windowing_enabled[i] = false; - ppu.ss_bg_windowing_enabled[i] = false; - ppu.bg_window1_clipmode[i] = 0; - ppu.bg_window2_clipmode[i] = 0; - ppu.bg_window_mask[i] = 0; - ppu.bg_tilemap_loc[i] = 0; - ppu.bg_tiledata_loc[i] = 0; - ppu.bg_hscroll_pos[i] = 0; - ppu.bg_vscroll_pos[i] = 0; - } - ppu.bg_priority_mode = 0; - ppu.oam_base_size = 0; - ppu.oam_name_sel = 0; - ppu.bg_mode = 0; - - ppu.mul_a = 0; - ppu.mul_b = 0; - ppu.div_a = 0; - ppu.div_b = 0; - ppu.r_4214 = 0; - ppu.r_4216 = 0; - ppu.r_2134 = 0; - - ppu.window1_left = 0; - ppu.window1_right = 0; - ppu.window2_left = 0; - ppu.window2_right = 0; - - ppu.color_window1_enabled = 0; - ppu.color_window2_enabled = 0; - ppu.color_window1_clipmode = 0; - ppu.color_window2_clipmode = 0; - ppu.color_window_mask = 0; - ppu.color_mask = 0; - ppu.ss_color_mask = 0; - ppu.addsub_mode = 0; - ppu.color_mode = 0; - ppu.color_halve = 0; - for(i=0;i<6;i++) { - ppu.bg_color_enabled[i] = false; - } - ppu.color_r = 0; - ppu.color_g = 0; - ppu.color_b = 0; - - ppu.active_hdma_channels = 0; - for(i=0;i<8;i++) { - memset(&dma_channel[i], 0, sizeof(dmachannel)); - ppu.hdma_completed[i] = false; - ppu.hdma_scanlines_remaining[i] = 0; - ppu.hdma_index_pointer[i] = 0; - } - hdma_initialize(); - - ppu.vcounter_enabled = false; - ppu.hcounter_enabled = false; - ppu.hirq_pos = 0; - ppu.virq_pos = 0; - - ppu.auto_joypad_read = false; - ppu.joypad_strobe_value = 0; - - ppu.latch_toggle = 0; - ppu.latch_vpos = 0; - ppu.latch_hpos = 0; - - ppu.m7a = ppu.m7b = - ppu.m7c = ppu.m7d = - ppu.m7x = ppu.m7y = 0; - - ppu.m7hofs = ppu.m7vofs = 0x0000; - - ppu.mode7_repeat = 0; - ppu.mode7_extbg = false; - ppu.mode7_hflip = false; - ppu.mode7_vflip = false; - - ppu.io4201 = 0xff; - ppu.counter_latched = false; - - memset(ppu.mmio_mem_43xx, 0, 0x80); -} diff --git a/bsnes/ppu/ppu_addsub.cpp b/bsnes/ppu/ppu_addsub.cpp deleted file mode 100644 index bd711235..00000000 --- a/bsnes/ppu/ppu_addsub.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - $2130 : fixed color / screen add sub - abcd--ef - - ab: main - cd: subscreen - 00: all the time - 01: inside window only - 10: outside window only - 11: all the time - e: 0 = enable addsub for fixed color - 1 = enable addsub for sub screen - f: color / chardata = direct color - (mode3, 4, 7 only) -*/ -void mmio_w2130(byte value) { - ppu.color_mask = (value >> 6) & 3; - ppu.ss_color_mask = (value >> 4) & 3; - ppu.addsub_mode = (value & 0x02)?1:0; -} - -/* - $2131 : addsub designation - mrgsdcba - - m: 0 = enable add color data mode - 1 = enable sub color data mode - r: 1/2 color mode - g: Backarea enable - s: OAM enable - d: BG4 enable - c: BG3 enable - b: BG2 enable - a: BG1 enable -*/ -void mmio_w2131(byte value) { - ppu.color_mode = (value & 0x80)?COLORMODE_SUB:COLORMODE_ADD; - ppu.color_halve = (value & 0x40)?1:0; - ppu.bg_color_enabled[BACK] = (value & 0x20)?true:false; - ppu.bg_color_enabled[OAM] = (value & 0x10)?true:false; - ppu.bg_color_enabled[BG4] = (value & 0x08)?true:false; - ppu.bg_color_enabled[BG3] = (value & 0x04)?true:false; - ppu.bg_color_enabled[BG2] = (value & 0x02)?true:false; - ppu.bg_color_enabled[BG1] = (value & 0x01)?true:false; -} - -/* - $2132 : addsub settings - bgrddddd - - b: affect blue - g: affect green - r: affect red - d: color constant -*/ -void mmio_w2132(byte value) { - if(value & 0x80)ppu.color_b = (value & 0x1f); - if(value & 0x40)ppu.color_g = (value & 0x1f); - if(value & 0x20)ppu.color_r = (value & 0x1f); -} diff --git a/bsnes/ppu/ppu_cache.cpp b/bsnes/ppu/ppu_cache.cpp deleted file mode 100644 index 113d865a..00000000 --- a/bsnes/ppu/ppu_cache.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#define BLENDTYPE_BACK 0 -#define BLENDTYPE_MAIN 1 -#define BLENDTYPE_SUB 2 -#define BLENDTYPE_COMBINE 3 - -#define COLORDEPTH_4 0 -#define COLORDEPTH_16 1 -#define COLORDEPTH_256 2 - -struct { - byte color_main, color_sub; - byte src_main, src_sub; - byte blend_type; -}ppu_pixel_cache[512]; - -byte ppu_layer_cache[512 * 12]; - -#define TILE_2BIT 0 -#define TILE_4BIT 1 -#define TILE_8BIT 2 - -byte *ppu_bg_tiledata[3]; -byte *ppu_bg_tiledata_state[3]; - -//this should be reset once every scanline -void ppu_clear_pixel_cache(void) { -int i; - for(i=0;imem_read(MEMMODE_NONE, MEMSIZE_BYTE, dma_channel[c].src_addr); - dma_mmio_write(dma_channel[c].dest_addr + a, x); - if(dma_channel[c].fixed_address == false) { - dma_channel[c].src_addr = (dma_channel[c].src_addr & 0xff0000) | ((dma_channel[c].src_addr + dma_channel[c].write_dir) & 0xffff); - } - snes_time->add_cpu_cycles(1, 8); - return --dma_channel[c].transfer_size; -} - -word dma_mmiotocpu(byte c, byte a) { -byte x; - x = dma_mmio_read(dma_channel[c].dest_addr + a); - gx816->mem_write(MEMMODE_NONE, MEMSIZE_BYTE, dma_channel[c].src_addr, x); - if(dma_channel[c].fixed_address == false) { - dma_channel[c].src_addr = (dma_channel[c].src_addr & 0xff0000) | ((dma_channel[c].src_addr + dma_channel[c].write_dir) & 0xffff); - } - snes_time->add_cpu_cycles(1, 8); - return --dma_channel[c].transfer_size; -} - -void dma_transfer_type0(byte c) { - if(dma_channel[c].transfer_mode == DMATRANSFER_CPUTOMMIO) { - if(dma_cputommio(c, 0) == 0)return; - } else if(dma_channel[c].transfer_mode == DMATRANSFER_MMIOTOCPU) { - if(dma_mmiotocpu(c, 0) == 0)return; - } -} - -void dma_transfer_type1(byte c) { - if(dma_channel[c].transfer_mode == DMATRANSFER_CPUTOMMIO) { - if(dma_cputommio(c, 0) == 0)return; - if(dma_cputommio(c, 1) == 0)return; - } else if(dma_channel[c].transfer_mode == DMATRANSFER_MMIOTOCPU) { - if(dma_mmiotocpu(c, 0) == 0)return; - if(dma_mmiotocpu(c, 1) == 0)return; - } -} - -void dma_transfer_type2(byte c) { - if(dma_channel[c].transfer_mode == DMATRANSFER_CPUTOMMIO) { - if(dma_cputommio(c, 0) == 0)return; - } else if(dma_channel[c].transfer_mode == DMATRANSFER_MMIOTOCPU) { - if(dma_mmiotocpu(c, 0) == 0)return; - } -} - -void dma_transfer_type3(byte c) { - if(dma_channel[c].transfer_mode == DMATRANSFER_CPUTOMMIO) { - if(dma_cputommio(c, 0) == 0)return; - if(dma_cputommio(c, 0) == 0)return; - if(dma_cputommio(c, 1) == 0)return; - if(dma_cputommio(c, 1) == 0)return; - } else if(dma_channel[c].transfer_mode == DMATRANSFER_MMIOTOCPU) { - if(dma_mmiotocpu(c, 0) == 0)return; - if(dma_mmiotocpu(c, 0) == 0)return; - if(dma_mmiotocpu(c, 1) == 0)return; - if(dma_mmiotocpu(c, 1) == 0)return; - } -} - -void dma_transfer_type4(byte c) { - if(dma_channel[c].transfer_mode == DMATRANSFER_CPUTOMMIO) { - if(dma_cputommio(c, 0) == 0)return; - if(dma_cputommio(c, 1) == 0)return; - if(dma_cputommio(c, 2) == 0)return; - if(dma_cputommio(c, 3) == 0)return; - } else if(dma_channel[c].transfer_mode == DMATRANSFER_MMIOTOCPU) { - if(dma_mmiotocpu(c, 0) == 0)return; - if(dma_mmiotocpu(c, 1) == 0)return; - if(dma_mmiotocpu(c, 2) == 0)return; - if(dma_mmiotocpu(c, 3) == 0)return; - } -} - -void dma_transfer_type5(byte c) { - if(dma_channel[c].transfer_mode == DMATRANSFER_CPUTOMMIO) { - if(dma_cputommio(c, 0) == 0)return; - if(dma_cputommio(c, 1) == 0)return; - if(dma_cputommio(c, 0) == 0)return; - if(dma_cputommio(c, 1) == 0)return; - } else if(dma_channel[c].transfer_mode == DMATRANSFER_MMIOTOCPU) { - if(dma_mmiotocpu(c, 0) == 0)return; - if(dma_mmiotocpu(c, 1) == 0)return; - if(dma_mmiotocpu(c, 0) == 0)return; - if(dma_mmiotocpu(c, 1) == 0)return; - } -} - -/* - This function is called consecutively until all DMA transfers are completed. - Rather than transfer all of the DMA data immediately, control is returned to - the main loop after each DMA transfer so that the APU, PPU, renderer, etc. - can keep in sync. Otherwise, a transfer of 65536 bytes could prevent the renderer - from drawing all scanlines, for example. - Each DMA channel must be completed incrementally. The entire transfer from channel 0 - must complete before any data is transferred for channel 1, etc. -*/ -void ppu_update_dma(void) { -int i, z; - z = 0; - for(i=0;i<8;i++) { - if(dma_channel[i].active == false)continue; - switch(dma_channel[i].transfer_type) { - case 0:dma_transfer_type0(i);break; - case 1:dma_transfer_type1(i);break; - case 2:dma_transfer_type2(i);break; - case 3:dma_transfer_type3(i);break; - case 4:dma_transfer_type4(i);break; - case 5:dma_transfer_type5(i);break; - case 6:dma_transfer_type2(i);break; //6 is the same as 2 - case 7:dma_transfer_type3(i);break; //7 is the same as 3 - } - if(dma_channel[i].transfer_size == 0) { - dma_channel[i].active = false; - } - return; - } - gx816->cpu_state = CPUSTATE_RUN; -} - -/* - $420b : DMA enable - $420c : HDMA enable - - Each bit corresponds to the respecting DMA channel (7,6,5,4,3,2,1,0) - Setting a bit in this register will perform the DMA transfer. Multiple - transfers can be done at once. Requires one cycle per byte transferred. -*/ -void mmio_w420b(byte value) { -int i; - ppu.active_hdma_channels &= ~value; - for(i=0;i<8;i++) { - if(value & (1 << i)) { - dma_channel[i].active = true; - gx816->cpu_state = CPUSTATE_DMA; - } - } -} - -void mmio_w420c(byte value) { - ppu.active_hdma_channels = value; -} - -byte hdma_transfer_lentbl[8] = { 1, 2, 2, 4, 4, 4, 2, 4 }; - -void hdma_write_byte(byte i, byte l, byte x) { - switch(dma_channel[i].transfer_type) { - case 0: - dma_mmio_write(dma_channel[i].dest_addr, x); - break; - case 1: - dma_mmio_write(dma_channel[i].dest_addr + l, x); - break; - case 2: - dma_mmio_write(dma_channel[i].dest_addr, x); - break; - case 3: - dma_mmio_write(dma_channel[i].dest_addr + (l >> 1), x); - break; - case 4: - dma_mmio_write(dma_channel[i].dest_addr + l, x); - break; - case 5: - dma_mmio_write(dma_channel[i].dest_addr + (l & 1), x); - break; - case 6: - dma_mmio_write(dma_channel[i].dest_addr, x); - break; - case 7: - dma_mmio_write(dma_channel[i].dest_addr + (l >> 1), x); - break; - } -} - -void hdma_update(void) { -int i, l; -byte x, channels_active = 0; - if(snes_time->vscan_pos > ppu.visible_scanlines)return; - for(i=0;i<8;i++) { - if(dma_channel[i].completed == true)continue; - snes_time->add_cpu_cycles(1, 8); - channels_active++; - if(dma_channel[i].line_counter == 0) { - dma_channel[i].line_counter = gx816->mem_read(MEMMODE_NONE, MEMSIZE_BYTE, dma_channel[i].address++); - dma_channel[i].r43x8 = dma_channel[i].address; - if(dma_channel[i].line_counter == 0) { - dma_channel[i].completed = true; - continue; - } - - if(dma_channel[i].line_counter > 0x80) { - dma_channel[i].repeat = true; - dma_channel[i].line_counter -= 0x80; - } else { - dma_channel[i].repeat = false; - } - - dma_channel[i].first_line = true; - if(dma_channel[i].indirect == false) { - dma_channel[i].iaddress = dma_channel[i].address; - } else { - dma_channel[i].iaddress = gx816->mem_read(MEMMODE_NONE, MEMSIZE_WORD, dma_channel[i].address); - dma_channel[i].iaddress |= (dma_channel[i].indirect_bank << 16); - dma_channel[i].address += 2; - snes_time->add_cpu_cycles(1, 16); - } - } - - dma_channel[i].line_counter--; - if(dma_channel[i].first_line == false && dma_channel[i].repeat == false)continue; - dma_channel[i].first_line = false; - - if(dma_channel[i].indirect == false) { - dma_channel[i].iaddress = dma_channel[i].address; - } - - for(l=0;lmem_read(MEMMODE_NONE, MEMSIZE_BYTE, dma_channel[i].iaddress++); - if(dma_channel[i].indirect == false) { - dma_channel[i].address++; - } - hdma_write_byte(i, l, x); - snes_time->add_cpu_cycles(1, 8); - } - } - if(channels_active != 0) { - snes_time->add_cpu_cycles(1, 18); - } -} - -void hdma_initialize(void) { -int i, active_channels = 0; - for(i=0;i<8;i++) { - if((ppu.active_hdma_channels & (1 << i)) == 0) { - dma_channel[i].completed = true; - continue; - } - active_channels++; - dma_channel[i].first_line = true; - dma_channel[i].repeat = false; - dma_channel[i].line_counter = 0; - dma_channel[i].address = dma_channel[i].src_addr; - dma_channel[i].completed = false; - if(dma_channel[i].indirect == false) { - snes_time->add_cpu_cycles(1, 8); - } else { - snes_time->add_cpu_cycles(1, 24); - } - } - if(active_channels != 0) { - snes_time->add_cpu_cycles(1, 18); - } -} - -byte mmio_r43x8(byte c) { - return (dma_channel[c].r43x8); -} - -byte mmio_r43x9(byte c) { - return (dma_channel[c].r43x8 >> 8); -} - -byte mmio_r43xa(byte c) { - return (dma_channel[c].line_counter + 1); -} - -void mmio_w43x8(byte c, byte x) { - dma_channel[c].address = (dma_channel[c].address & 0xff00) | x; -} - -void mmio_w43x9(byte c, byte x) { - dma_channel[c].address = (dma_channel[c].address & 0x00ff) | (x << 8); -} - -void mmio_w43xa(byte c, byte x) { - dma_channel[c].line_counter = x; -} diff --git a/bsnes/ppu/ppu_joypad.cpp b/bsnes/ppu/ppu_joypad.cpp deleted file mode 100644 index 082325d0..00000000 --- a/bsnes/ppu/ppu_joypad.cpp +++ /dev/null @@ -1,67 +0,0 @@ -joypad_state joypad1; - -/* - *1 - The joypad contains a small bit shifter that has 16 bits. - Reading from 4016 reads one bit from this buffer, then moves - the buffer left one, and adds a '1' to the rightmost bit. - Writing a one to $4016 will fill the buffer with the current - joypad button states, and lock the bit shifter at position - zero. All reads will be the first buffer state, or 'B'. - A zero must be written back to $4016 to unlock the buffer, - so that reads will increment the bit shifting position. -*/ -byte mmio_r4016(void) { -byte r = 0; - if(ppu.joypad_strobe_value == 1) { //*1 - r |= joypad1.b; - } else { - if (joypad1.read_pos == 0)r |= joypad1.b; - else if(joypad1.read_pos == 1)r |= joypad1.y; - else if(joypad1.read_pos == 2)r |= joypad1.select; - else if(joypad1.read_pos == 3)r |= joypad1.start; - else if(joypad1.read_pos == 4)r |= joypad1.up; - else if(joypad1.read_pos == 5)r |= joypad1.down; - else if(joypad1.read_pos == 6)r |= joypad1.left; - else if(joypad1.read_pos == 7)r |= joypad1.right; - else if(joypad1.read_pos == 8)r |= joypad1.a; - else if(joypad1.read_pos == 9)r |= joypad1.x; - else if(joypad1.read_pos == 10)r |= joypad1.l; - else if(joypad1.read_pos == 11)r |= joypad1.r; - else if(joypad1.read_pos == 16)r |= 1; //joypad connected bit (1=yes, 0=no) - else r |= 1; //after 16th read, all subsequent reads return 1 - if(++joypad1.read_pos > 17)joypad1.read_pos = 17; - } - return r; -} - -byte mmio_r4218(void) { -byte r; - if(ppu.auto_joypad_read == false) return 0x00; //cannot read joypad if auto joypad read not enabled - if(ppu.vline_pos >= 225 && ppu.vline_pos <= 227)return 0x00; //cannot read joypad while SNES is polling the joypad data - r = joypad1.a << 7 | - joypad1.x << 6 | - joypad1.l << 5 | - joypad1.r << 4; - return r; -} - -byte mmio_r4219(void) { -byte r; - if(ppu.auto_joypad_read == false) return 0x00; //cannot read joypad if auto joypad read not enabled - if(ppu.vline_pos >= 225 && ppu.vline_pos <= 227)return 0x00; //cannot read joypad while SNES is polling the joypad data - r = joypad1.b << 7 | - joypad1.y << 6 | - joypad1.select << 5 | - joypad1.start << 4 | - joypad1.up << 3 | - joypad1.down << 2 | - joypad1.left << 1 | - joypad1.right; - return r; -} - -void mmio_w4016(byte value) { - ppu.joypad_strobe_value = value; - if(value == 1)UpdateJoypad(); - if(value == 0)joypad1.read_pos = 0; -} diff --git a/bsnes/ppu/ppu_misc.cpp b/bsnes/ppu/ppu_misc.cpp deleted file mode 100644 index 80d1cf91..00000000 --- a/bsnes/ppu/ppu_misc.cpp +++ /dev/null @@ -1,15 +0,0 @@ -/* - $21c2/$21c3 - - These seem to be version information registers... I don't know - what their purpose is, but I do know that the SNES demo rom - expects these values to be returned in order to proceed through - the character test. -*/ -byte mmio_r21c2(void) { - return 0x20; -} - -byte mmio_r21c3(void) { - return 0x00; -} diff --git a/bsnes/ppu/ppu_mode7.cpp b/bsnes/ppu/ppu_mode7.cpp deleted file mode 100644 index c9b44940..00000000 --- a/bsnes/ppu/ppu_mode7.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - $211a : mode7 settings register - ab0000yx - - ab: - 00 = use screen repetition if outside screen area - 01 = ??? - 10 = use character 0x00 repetition if outside screen area - 11 = use back color if outside screen area - y: vertical screen flip - x: horizontal screen flip -*/ -void mmio_w211a(byte value) { - ppu.mode7_repeat = (value >> 6) & 3; - ppu.mode7_vflip = (value & 0x02)?true:false; - ppu.mode7_hflip = (value & 0x01)?true:false; -} - -/* - $211b : m7a / 16-bit source operand for signed multiplication -*/ -void mmio_w211b(byte value) { - ppu.m7a = (value << 8) | (ppu.m7a >> 8); -} - -/* - $211c : m7b / 8-bit source operand for signed multiplication -*/ -void mmio_w211c(byte value) { - ppu.m7b = (value << 8) | (ppu.m7b >> 8); -} - -/* - $211d : m7c -*/ -void mmio_w211d(byte value) { - ppu.m7c = (value << 8) | (ppu.m7c >> 8); -} - -/* - $211e : m7d -*/ -void mmio_w211e(byte value) { - ppu.m7d = (value << 8) | (ppu.m7d >> 8); -} - -/* - $211f : m7x -*/ -void mmio_w211f(byte value) { - ppu.m7x = (value << 8) | (ppu.m7x >> 8); -} - -/* - $2120 : m7y -*/ -void mmio_w2120(byte value) { - ppu.m7y = (value << 8) | (ppu.m7y >> 8); -} diff --git a/bsnes/ppu/ppu_muldiv.cpp b/bsnes/ppu/ppu_muldiv.cpp deleted file mode 100644 index 3f82876d..00000000 --- a/bsnes/ppu/ppu_muldiv.cpp +++ /dev/null @@ -1,54 +0,0 @@ -byte mmio_r2134(void) { -ulong r = ((signed short)ppu.m7a * (signed char)(ppu.m7b >> 8)); - return (r); -} - -byte mmio_r2135(void) { -ulong r = ((signed short)ppu.m7a * (signed char)(ppu.m7b >> 8)); - return (r >> 8); -} - -byte mmio_r2136(void) { -ulong r = ((signed short)ppu.m7a * (signed char)(ppu.m7b >> 8)); - return (r >> 16); -} - -void mmio_w4202(byte value) { - ppu.mul_a = value; -} - -void mmio_w4203(byte value) { - ppu.mul_b = value; - ppu.r_4216 = ppu.mul_a * ppu.mul_b; -} - -void mmio_w4204(byte value) { - ppu.div_a = (ppu.div_a & 0xff00) | value; -} - -void mmio_w4205(byte value) { - ppu.div_a = (ppu.div_a & 0x00ff) | (value << 8); -} - -void mmio_w4206(byte value) { - ppu.div_b = value; - - ppu.r_4214 = (ppu.div_b)?ppu.div_a / ppu.div_b : 0; - ppu.r_4216 = (ppu.div_b)?ppu.div_a % ppu.div_b : 0; -} - -byte mmio_r4214(void) { - return ppu.r_4214; -} - -byte mmio_r4215(void) { - return ppu.r_4214 >> 8; -} - -byte mmio_r4216(void) { - return ppu.r_4216; -} - -byte mmio_r4217(void) { - return ppu.r_4216 >> 8; -} diff --git a/bsnes/ppu/ppu_oam.cpp b/bsnes/ppu/ppu_oam.cpp deleted file mode 100644 index 162c6d83..00000000 --- a/bsnes/ppu/ppu_oam.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - $2101 : OAM settings - sssnnbbb - - s: base sprite size - small : large - 000: 8x8 : 16x16 - 001: 8x8 : 32x32 - 010: 8x8 : 64x64 - 011: 16x16 : 32x32 - 100: 16x16 : 64x64 - 101: 32x32 : 64x64 - 110: 16x32 : 32x64 - 111: 16x32 : 32x32 - small/large is determined by oam size bit - n: name selection (0-3) - b: oam tiledata location (>>14) -- highest bit ignored -*/ -void mmio_w2101(byte value) { - ppu.oam_base_size = (value >> 5); - ppu.oam_name_sel = (value >> 3) & 3; - ppu.oam_tiledata_loc = (value & 3) << 14; -} - -/* - $2102/$2103 : OAM access address - $2102: llllllll - $2103: ???????h - - 9-bit address, h = bit 8, l = bits 7-0 -*/ -byte ppu_oam_write_posl = 0x00, ppu_oam_write_posh = 0x00; - -void mmio_w2102(byte value) { - ppu_oam_write_posl = value; - ppu.oam_write_pos = ((ppu_oam_write_posh << 8) | (ppu_oam_write_posl)) * 2; -} - -void mmio_w2103(byte value) { - ppu_oam_write_posh = value & 0x01; - ppu.oam_write_pos = ((ppu_oam_write_posh << 8) | (ppu_oam_write_posl)) * 2; -} - -byte ppu_oam_latch_data = 0; - -/* - $2104 : OAM write - - write one byte to OAM data. even writes (bit 0 = 0) are cached - to the OAM latch, and no data is transferred to OAM ram. odd writes - (bit 0 = 1) write the latch value, and then the requested value (2 bytes) - to oam data. writes to OAM address 0x0200 and above (priority / x bit 8 table) - always write, but even writes still update the latch data. -*/ -void mmio_w2104(byte value) { - if(ppu.oam_write_pos >= 0x0200) { - if((ppu.oam_write_pos & 1) == 0) { - ppu_oam_latch_data = value; - } - oam_write(ppu.oam_write_pos, value); - } else if((ppu.oam_write_pos & 1) == 0) { - ppu_oam_latch_data = value; - } else { - oam_write((ppu.oam_write_pos & 0x03fe), ppu_oam_latch_data); - oam_write((ppu.oam_write_pos & 0x03fe) + 1, value); - } - ppu.oam_write_pos++; - ppu.oam_write_pos &= 0x03ff; -} - -/* - $2138 : OAM read - - read one byte from OAM data. if address is even (bit 0 = 0), - latch data is updated. -*/ -byte mmio_r2138(void) { -byte r; - r = oam_read(ppu.oam_write_pos); - if((ppu.oam_write_pos & 1) == 0) { - ppu_oam_latch_data = r; - } - ppu.oam_write_pos++; - ppu.oam_write_pos &= 0x03ff; - return r; -} diff --git a/bsnes/ppu/ppu_palette.cpp b/bsnes/ppu/ppu_palette.cpp deleted file mode 100644 index 9a78568a..00000000 --- a/bsnes/ppu/ppu_palette.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/* - $2121 : cgram write position - - takes an 8-bit value that indexes into color palette cgram data. - multiply value by 2 to get actual offset into ppu.cgram -*/ -void mmio_w2121(byte value) { - ppu.cgram_write_pos = value << 1; -} - -/* - $2122 : cgram write - - writes to cgram using cgram_write_pos * 2 as an index -*/ -void mmio_w2122(byte value) { - ppu.cgram[ppu.cgram_write_pos] = value; - - debug_test_bp(BPSRC_CGRAM, BP_WRITE, ppu.cgram_write_pos, value); - - ppu.cgram_write_pos++; - ppu.cgram_write_pos &= 0x01ff; -} - -/* - $213b : cgram read - - read from cgram using cgram_write_pos * 2 as an index -*/ -byte mmio_r213b(void) { -byte r; - r = ppu.cgram[ppu.cgram_write_pos]; - - debug_test_bp(BPSRC_CGRAM, BP_READ, ppu.cgram_write_pos, r); - - ppu.cgram_write_pos++; - ppu.cgram_write_pos &= 0x01ff; - return r; -} diff --git a/bsnes/ppu/ppu_render.cpp b/bsnes/ppu/ppu_render.cpp deleted file mode 100644 index 904ddc2d..00000000 --- a/bsnes/ppu/ppu_render.cpp +++ /dev/null @@ -1,901 +0,0 @@ -byte ppu_addsub_adjust_buffer_full[96] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31 -}; - -byte ppu_addsub_adjust_buffer_half[96] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 -}; - -#define ppu_pal_pixel(__i) \ - (*((word*)ppu.cgram + __i)) - -word ppu_addsub_pixels(byte x, byte cdest_index, byte cdest_bg, byte csrc_index, byte csrc_bg) { -int r, g, b; -word cdest = ppu_pal_pixel(cdest_index); -word csrc = ppu_pal_pixel(csrc_index); -word res; -//oam palettes 0-3 are not affected by color add/sub - if(cdest_bg == OAM) { - if(cdest_index < 192) { - return cdest; - } - } - switch(ppu.color_mode) { - case COLORMODE_ADD: - if(ppu.bg_color_enabled[cdest_bg] == true && ppu.color_halve == 1) { - r = *(ppu_addsub_adjust_buffer_half + 32 + ( ((cdest ) & 31) + ((csrc ) & 31) )) >> 1; - g = *(ppu_addsub_adjust_buffer_half + 32 + ( ((cdest >> 5) & 31) + ((csrc >> 5) & 31) )) >> 1; - b = *(ppu_addsub_adjust_buffer_half + 32 + ( ((cdest >> 10) & 31) + ((csrc >> 10) & 31) )) >> 1; - } else { - r = *(ppu_addsub_adjust_buffer_full + 32 + ( ((cdest ) & 31) + ((csrc ) & 31) )); - g = *(ppu_addsub_adjust_buffer_full + 32 + ( ((cdest >> 5) & 31) + ((csrc >> 5) & 31) )); - b = *(ppu_addsub_adjust_buffer_full + 32 + ( ((cdest >> 10) & 31) + ((csrc >> 10) & 31) )); - } - break; - case COLORMODE_SUB: - if(ppu.bg_color_enabled[cdest_bg] == true && ppu.color_halve == 1) { - r = *(ppu_addsub_adjust_buffer_half + 32 + ( ((cdest ) & 31) + ((csrc ) & 31) )) >> 1; - g = *(ppu_addsub_adjust_buffer_half + 32 + ( ((cdest >> 5) & 31) + ((csrc >> 5) & 31) )) >> 1; - b = *(ppu_addsub_adjust_buffer_half + 32 + ( ((cdest >> 10) & 31) + ((csrc >> 10) & 31) )) >> 1; - } else { - r = *(ppu_addsub_adjust_buffer_full + 32 + ( ((cdest ) & 31) - ((csrc ) & 31) )); - g = *(ppu_addsub_adjust_buffer_full + 32 + ( ((cdest >> 5) & 31) - ((csrc >> 5) & 31) )); - b = *(ppu_addsub_adjust_buffer_full + 32 + ( ((cdest >> 10) & 31) - ((csrc >> 10) & 31) )); - } - break; - } - return ((r) | (g << 5) | (b << 10)); -} - -word ppu_addsub_pixel(byte x, byte cdest_index, byte cdest_bg) { -int r, g, b; -word cdest = ppu_pal_pixel(cdest_index); -word csrc = (ppu.color_r) | (ppu.color_g << 5) | (ppu.color_b << 10); -word res; -//only oam palettes 4-7 are affected by color add/sub - if(cdest_bg == OAM) { - if(cdest_index < 192) { - return cdest; - } - } - switch(ppu.color_mode) { - case COLORMODE_ADD: - if(ppu.bg_color_enabled[cdest_bg] == true && ppu.color_halve == 1 && ppu.addsub_mode == 0) { - r = *(ppu_addsub_adjust_buffer_half + 32 + ( ((cdest ) & 31) + ((csrc ) & 31) )) >> 1; - g = *(ppu_addsub_adjust_buffer_half + 32 + ( ((cdest >> 5) & 31) + ((csrc >> 5) & 31) )) >> 1; - b = *(ppu_addsub_adjust_buffer_half + 32 + ( ((cdest >> 10) & 31) + ((csrc >> 10) & 31) )) >> 1; - } else { - r = *(ppu_addsub_adjust_buffer_full + 32 + ( ((cdest ) & 31) + ((csrc ) & 31) )); - g = *(ppu_addsub_adjust_buffer_full + 32 + ( ((cdest >> 5) & 31) + ((csrc >> 5) & 31) )); - b = *(ppu_addsub_adjust_buffer_full + 32 + ( ((cdest >> 10) & 31) + ((csrc >> 10) & 31) )); - } - break; - case COLORMODE_SUB: - if(ppu.bg_color_enabled[cdest_bg] == true && ppu.color_halve == 1 && ppu.addsub_mode == 0) { - r = *(ppu_addsub_adjust_buffer_half + 32 + ( ((cdest ) & 31) + ((csrc ) & 31) )) >> 1; - g = *(ppu_addsub_adjust_buffer_half + 32 + ( ((cdest >> 5) & 31) + ((csrc >> 5) & 31) )) >> 1; - b = *(ppu_addsub_adjust_buffer_half + 32 + ( ((cdest >> 10) & 31) + ((csrc >> 10) & 31) )) >> 1; - } else { - r = *(ppu_addsub_adjust_buffer_full + 32 + ( ((cdest ) & 31) - ((csrc ) & 31) )); - g = *(ppu_addsub_adjust_buffer_full + 32 + ( ((cdest >> 5) & 31) - ((csrc >> 5) & 31) )); - b = *(ppu_addsub_adjust_buffer_full + 32 + ( ((cdest >> 10) & 31) - ((csrc >> 10) & 31) )); - } - break; - } - return ((r) | (g << 5) | (b << 10)); -} - -#define ppu_render_bg_tile_line_4(__m) \ - col = 0; \ - if(d0 & __m)col += 1; \ - if(d1 & __m)col += 2; \ - *dest++ = col -#define ppu_render_bg_tile_line_16(__m) \ - col = 0; \ - if(d0 & __m)col += 1; \ - if(d1 & __m)col += 2; \ - if(d2 & __m)col += 4; \ - if(d3 & __m)col += 8; \ - *dest++ = col -#define ppu_render_bg_tile_line_256(__m) \ - col = 0; \ - if(d0 & __m)col += 1; \ - if(d1 & __m)col += 2; \ - if(d2 & __m)col += 4; \ - if(d3 & __m)col += 8; \ - if(d4 & __m)col += 16; \ - if(d5 & __m)col += 32; \ - if(d6 & __m)col += 64; \ - if(d7 & __m)col += 128; \ - *dest++ = col - -void ppu_render_bg_tile(byte color_depth, byte bg, word tile_num) { -byte mask, d0, d1, d2, d3, d4, d5, d6, d7, col; -int x, y; -ulong pos; -byte *dest; - switch(color_depth) { - case COLORDEPTH_4: - dest = (byte*)ppu_bg_tiledata[TILE_2BIT] + tile_num * 64; - pos = tile_num * 16; - y = 8; - while(y--) { - d0 = ppu.vram[pos ]; - d1 = ppu.vram[pos + 1]; - ppu_render_bg_tile_line_4(0x80); - ppu_render_bg_tile_line_4(0x40); - ppu_render_bg_tile_line_4(0x20); - ppu_render_bg_tile_line_4(0x10); - ppu_render_bg_tile_line_4(0x08); - ppu_render_bg_tile_line_4(0x04); - ppu_render_bg_tile_line_4(0x02); - ppu_render_bg_tile_line_4(0x01); - pos += 2; - } - ppu_bg_tiledata_state[TILE_2BIT][tile_num] = 0; - break; - case COLORDEPTH_16: - dest = (byte*)ppu_bg_tiledata[TILE_4BIT] + tile_num * 64; - pos = tile_num * 32; - y = 8; - while(y--) { - d0 = ppu.vram[pos ]; - d1 = ppu.vram[pos + 1]; - d2 = ppu.vram[pos + 16]; - d3 = ppu.vram[pos + 17]; - ppu_render_bg_tile_line_16(0x80); - ppu_render_bg_tile_line_16(0x40); - ppu_render_bg_tile_line_16(0x20); - ppu_render_bg_tile_line_16(0x10); - ppu_render_bg_tile_line_16(0x08); - ppu_render_bg_tile_line_16(0x04); - ppu_render_bg_tile_line_16(0x02); - ppu_render_bg_tile_line_16(0x01); - pos += 2; - } - ppu_bg_tiledata_state[TILE_4BIT][tile_num] = 0; - break; - case COLORDEPTH_256: - dest = (byte*)ppu_bg_tiledata[TILE_8BIT] + tile_num * 64; - pos = tile_num * 64; - y = 8; - while(y--) { - d0 = ppu.vram[pos ]; - d1 = ppu.vram[pos + 1]; - d2 = ppu.vram[pos + 16]; - d3 = ppu.vram[pos + 17]; - d4 = ppu.vram[pos + 32]; - d5 = ppu.vram[pos + 33]; - d6 = ppu.vram[pos + 48]; - d7 = ppu.vram[pos + 49]; - ppu_render_bg_tile_line_256(0x80); - ppu_render_bg_tile_line_256(0x40); - ppu_render_bg_tile_line_256(0x20); - ppu_render_bg_tile_line_256(0x10); - ppu_render_bg_tile_line_256(0x08); - ppu_render_bg_tile_line_256(0x04); - ppu_render_bg_tile_line_256(0x02); - ppu_render_bg_tile_line_256(0x01); - pos += 2; - } - ppu_bg_tiledata_state[TILE_8BIT][tile_num] = 0; - break; - } -} - -#define PPU_MAIN 0 -#define PPU_SUB 1 - -bool windows_not_obstructing(byte layer, byte bg, word x); -bool color_windows_not_obstructing(word x, byte color_mask_type); - -void ppu_render_line_to_screen(void) { -int x, x1; -word *ptr, *ptri, *light_table, *light_tablei; -word c, cx, cy; -word screen_width = render.snes_width; - - if(ppu.interlace == false) { - ptr = (word*)ppu.screen + ((ppu.vline_pos << 1) ) * 512; - ptri = (word*)ppu.screen + ((ppu.vline_pos << 1) + 1) * 512; - } else { - ptr = (word*)ppu.screen + ((ppu.vline_pos << 1) + ppu.interlace_frame) * 512; - } - light_table = (word*)ppu.light_table + (ppu.display_brightness * 65536); - - for(x=x1=0;x= 192)) { - if(ppu.bg_color_enabled[ppu_pixel_cache[x].src_main] == true) { - ppu_pixel_cache[x].blend_type = BLENDTYPE_COMBINE; - } - } - } - } -} - -void ppu_set_layer_pixels(byte layer_count, byte *layer_bg_lookup) { -int layer, x = 0, x1; -byte pal; - do { - layer = 0; - x1 = x * 12; - do { - pal = ppu_layer_cache[x1 + layer]; - if(pal) { - ppu_set_pixel(layer_bg_lookup[layer], x, pal); - } - layer++; - } while(layer < layer_count); - x++; - } while(x < render.snes_width); -} - -#define ppu_set_layer_pixel(__x, __c) ppu_layer_cache[(__x) * 12 + layer_pos] = __c - -struct { - byte num; - byte width, height; - word x, y; - word character; - byte v_flip, h_flip; - byte palette; - byte priority; -}current_sprite; - -void ppu_set_sprite_attributes(byte sprite_num) { -ulong t; -byte size, b; -word x; - t = *((ulong*)ppu.oam + sprite_num); - b = ppu.oam[512 + (sprite_num >> 2)]; - - switch(sprite_num & 3) { - case 0: size = (b & 0x02)?1:0; x = (b & 0x01)?0x100:0; break; - case 1: size = (b & 0x08)?1:0; x = (b & 0x04)?0x100:0; break; - case 2: size = (b & 0x20)?1:0; x = (b & 0x10)?0x100:0; break; - case 3: size = (b & 0x80)?1:0; x = (b & 0x40)?0x100:0; break; - } - - current_sprite.num = sprite_num; - current_sprite.priority = (t >> 28) & 3; - current_sprite.x = x | (t & 0xff); - current_sprite.y = ((t >> 8) + 1) & 0xff; - current_sprite.v_flip = (t & 0x80000000)?1:0; - current_sprite.h_flip = (t & 0x40000000)?1:0; - current_sprite.palette = (t >> 25) & 7; - current_sprite.character = (t >> 16) & 0x01ff; - -//size: 0 = small, 1 = large - switch(ppu.oam_base_size) { - case 0: - if(!size) { current_sprite.width = 8; current_sprite.height = 8; } - else { current_sprite.width = 16; current_sprite.height = 16; } - break; - case 1: - if(!size) { current_sprite.width = 8; current_sprite.height = 8; } - else { current_sprite.width = 32; current_sprite.height = 32; } - break; - case 2: - if(!size) { current_sprite.width = 8; current_sprite.height = 8; } - else { current_sprite.width = 64; current_sprite.height = 64; } - break; - case 3: - if(!size) { current_sprite.width = 16; current_sprite.height = 16; } - else { current_sprite.width = 32; current_sprite.height = 32; } - break; - case 4: - if(!size) { current_sprite.width = 16; current_sprite.height = 16; } - else { current_sprite.width = 64; current_sprite.height = 64; } - break; - case 5: - if(!size) { current_sprite.width = 32; current_sprite.height = 32; } - else { current_sprite.width = 64; current_sprite.height = 64; } - break; - case 6: - if(!size) { current_sprite.width = 16; current_sprite.height = 32; } - else { current_sprite.width = 32; current_sprite.height = 64; } - break; - case 7: - if(!size) { current_sprite.width = 16; current_sprite.height = 32; } - else { current_sprite.width = 32; current_sprite.height = 32; } - break; - } -} - -bool windows_not_obstructing(byte layer, byte bg, word x) { -byte w1_mask, w2_mask; //1 = masked, 0 = not masked -word window1_left, window1_right, window2_left, window2_right; - if(layer == PPU_MAIN) { - if(ppu.bg_windowing_enabled[bg] == false)return true; - } else if(layer == PPU_SUB) { - if(ppu.ss_bg_windowing_enabled[bg] == false)return true; - } - - window1_left = ppu.window1_left; - window1_right = ppu.window1_right; - window2_left = ppu.window2_left; - window2_right = ppu.window2_right; - - if(ppu.bg_mode == 5 || ppu.bg_mode == 6) { - window1_left <<= 1; - window1_right <<= 1; - window2_left <<= 1; - window2_right <<= 1; - } - - if(ppu.bg_window1_enabled[bg] == true && ppu.bg_window2_enabled[bg] == false) { - if(ppu.bg_window1_clipmode[bg] == CLIPMODE_IN) { - if(x >= window1_left && x <= window1_right)return false; - return true; - } else { - if(x < window1_left || x > window1_right)return false; - return true; - } - } else if(ppu.bg_window2_enabled[bg] == true && ppu.bg_window1_enabled[bg] == false) { - if(ppu.bg_window2_clipmode[bg] == CLIPMODE_IN) { - if(x >= window2_left && x <= window2_right)return false; - return true; - } else { - if(x < window2_left || x > window2_right)return false; - return true; - } - } else if(ppu.bg_window1_enabled[bg] == true && ppu.bg_window2_enabled[bg] == true) { - if(ppu.bg_window1_clipmode[bg] == CLIPMODE_IN) { - if(x >= window1_left && x <= window1_right)w1_mask = 1; - else w1_mask = 0; - } else { - if(x < window1_left || x > window1_right)w1_mask = 1; - else w1_mask = 0; - } - - if(ppu.bg_window2_clipmode[bg] == CLIPMODE_IN) { - if(x >= window2_left && x <= window2_right)w2_mask = 1; - else w2_mask = 0; - } else { - if(x < window2_left || x > window2_right)w2_mask = 1; - else w2_mask = 0; - } - - switch(ppu.bg_window_mask[bg]) { - case WINDOWMASK_OR: - if((w1_mask | w2_mask) == 1)return false; - return true; - case WINDOWMASK_AND: - if((w1_mask & w2_mask) == 1)return false; - return true; - case WINDOWMASK_XOR: - if((w1_mask ^ w2_mask) == 1)return false; - return true; - case WINDOWMASK_XNOR: - if((w1_mask ^ w2_mask) == 0)return false; - return true; - } - } - return true; -} - -bool color_windows_not_obstructing(word x, byte color_mask_type) { -byte w1_mask, w2_mask; //1 = masked, 0 = not masked -byte color_mask; -bool r; -word window1_left, window1_right, window2_left, window2_right; - if(color_mask_type == PPU_MAIN)color_mask = ppu.color_mask; - else color_mask = ppu.ss_color_mask; - - if(color_mask == 0)return false; - if(color_mask == 3)return true; - - window1_left = ppu.window1_left; - window1_right = ppu.window1_right; - window2_left = ppu.window2_left; - window2_right = ppu.window2_right; - - if(ppu.bg_mode == 5 || ppu.bg_mode == 6) { - window1_left <<= 1; - window1_right <<= 1; - window2_left <<= 1; - window2_right <<= 1; - } - - if(ppu.color_window1_enabled == false && ppu.color_window2_enabled == false) { - r = true; - } else if(ppu.color_window1_enabled == true && ppu.color_window2_enabled == false) { - if(ppu.color_window1_clipmode == CLIPMODE_IN) { - if(x >= window1_left && x <= window1_right)r = false; - else r = true; - } else { - if(x < window1_left || x > window1_right)r = false; - else r = true; - } - } else if(ppu.color_window1_enabled == false && ppu.color_window2_enabled == true) { - if(ppu.color_window2_clipmode == CLIPMODE_IN) { - if(x >= window2_left && x <= window2_right)r = false; - else r = true; - } else { - if(x < window2_left || x > window2_right)r = false; - else r = true; - } - } else if(ppu.color_window1_enabled == true && ppu.color_window2_enabled == true) { - if(ppu.color_window1_clipmode == CLIPMODE_IN) { - if(x >= window1_left && x <= window1_right)w1_mask = 1; - else w1_mask = 0; - } else { - if(x < window1_left || x > window1_right)w1_mask = 1; - else w1_mask = 0; - } - - if(ppu.color_window2_clipmode == CLIPMODE_IN) { - if(x >= window2_left && x <= window2_right)w2_mask = 1; - else w2_mask = 0; - } else { - if(x < window2_left || x > window2_right)w2_mask = 1; - else w2_mask = 0; - } - - switch(ppu.color_window_mask) { - case WINDOWMASK_OR: - if((w1_mask | w2_mask) == 1)r = false; - else r = true; - break; - case WINDOWMASK_AND: - if((w1_mask & w2_mask) == 1)r = false; - else r = true; - break; - case WINDOWMASK_XOR: - if((w1_mask ^ w2_mask) == 1)r = false; - else r = true; - break; - case WINDOWMASK_XNOR: - if((w1_mask ^ w2_mask) == 0)r = false; - else r = true; - break; - } - } - - if(color_mask == 2) { - r = (r == true)?false:true; - } - - return r; -} - -/* - *1 - When bit 8 of a sprite's character number is set, such that character data - is read from the upper half (upper 8k) of sprite vram, bits 4-3 of $2101 - are added to bits 14-13 of the tiledata location. The address wraps around - the 64k bank. Why this happens, or what it's for, I have no idea. - *2 - The sprite tiledata is stored with 16 tiles making up the first row, followed - by 16 tiles making up the second row, and so on. Therefore, to get the - correct y tile, y / 8 * 1 row (16 tiles) must be used. -*/ - -#define OAM_PRI_NONE 4 -byte ppu_oam_line_pal[512], ppu_oam_line_pri[512]; - -void ppu_render_oam_sprite(void) { -word pos, col, chr, tiledata_inc; -byte d0, d1, d2, d3, pal_index; -int x, y, z, x1, mx, mask, p; -int tile_width; - if(ppu.bg_enabled[OAM] == false && ppu.ss_bg_enabled[OAM] == false)return; - - tile_width = current_sprite.width >> SH_8; //e.x. 16x16 sprite = 2x2 tiles - - if(ppu.interlace == true && (ppu.bg_mode == 5 || ppu.bg_mode == 6)) { - y = (ppu.vline_pos << SH_2) + ppu.interlace_frame; - } else { - y = ppu.vline_pos; - } - - x = current_sprite.x; - if(render.snes_width == 512) { - x <<= SH_2; - } - - if(current_sprite.v_flip) { - y = ((current_sprite.height - 1) - (ppu.vline_pos - current_sprite.y)); - } else { - y = (ppu.vline_pos - current_sprite.y); - } - y &= 255; - if(ppu.sprite_halve == true) { - y <<= 1; - y += ppu.interlace_frame; - } - - chr = current_sprite.character; - tiledata_inc = (chr & 0x100)?(ppu.oam_name_sel << 13):0; //*1 - chr += (y >> SH_8) << SH_16; //*2 - pal_index = (current_sprite.palette << SH_16); - for(x1=0;x1> z; - } - x &= 511; - if(x < render.snes_width) { - col = 0; - if(d0 & mask)col += 1; - if(d1 & mask)col += 2; - if(d2 & mask)col += 4; - if(d3 & mask)col += 8; - if(col) { - col += pal_index; - col += 128; - if(ppu_oam_line_pri[x] == OAM_PRI_NONE) { - ppu_oam_line_pal[x] = col; - ppu_oam_line_pri[x] = current_sprite.priority; - } - if(render.snes_width == 512) { - if(ppu_oam_line_pri[x + 1] == OAM_PRI_NONE) { - ppu_oam_line_pal[x + 1] = col; - ppu_oam_line_pri[x + 1] = current_sprite.priority; - } - } - } - } - x++; - if(render.snes_width == 512) { - x++; - } - } - } -} - -/* - -*/ - -void ppu_render_line_oam(byte layer_pos_pri0, byte layer_pos_pri1, byte layer_pos_pri2, byte layer_pos_pri3) { -int i, s; -byte layer_pos; - if(ppu.bg_enabled[OAM] != true && ppu.ss_bg_enabled[OAM] != true)return; - - memset(ppu_oam_line_pri, OAM_PRI_NONE, 512); - for(s=0;s<128;s++) { - ppu_set_sprite_attributes(s); - if(ppu.sprite_halve == false) { - if(ppu.vline_pos >= current_sprite.y && ppu.vline_pos < (current_sprite.y + current_sprite.height)) { - ppu_render_oam_sprite(); - } else if((current_sprite.y + current_sprite.height) >= 256 && ppu.vline_pos < ((current_sprite.y + current_sprite.height) & 255)) { - ppu_render_oam_sprite(); - } - } else { - if(ppu.vline_pos >= current_sprite.y && ppu.vline_pos < (current_sprite.y + (current_sprite.height >> 1))) { - ppu_render_oam_sprite(); - } else if((current_sprite.y + current_sprite.height) >= 256 && ppu.vline_pos < ((current_sprite.y + (current_sprite.height >> 1)) & 255)) { - ppu_render_oam_sprite(); - } - } - } - - for(i=0;i> SH_16); - } else { - tile_x = (mosaic_table[screen_x + (hscroll & 7)] >> SH_8); - } - hoffset = hscroll; - voffset = vscroll; - if(tile_x != 0) { - tile_x = (tile_x - 1) & 31; - if(ppu.bg_mode == 4) { - pos = ppu.bg_tilemap_loc[BG3] + (tile_x << SH_2); - t = *((word*)ppu.vram + (pos >> SH_2)); - if(t & opt_valid_bit) { - if(!(t & 0x8000)) { - hoffset = ((t & 0x1ff8) | (hscroll & 7)) & screen_width_mask; - } else { - voffset = (t & 0x1fff) & screen_height_mask; - } - } - } else { - pos = ppu.bg_tilemap_loc[BG3] + (tile_x << SH_2); - t = *((word*)ppu.vram + (pos >> SH_2)); - if(t & opt_valid_bit) { - hoffset = ((t & 0x1ff8) | (hscroll & 7)) & screen_width_mask; - } - pos = ppu.bg_tilemap_loc[BG3] + 64 + (tile_x << SH_2); - t = *((word*)ppu.vram + (pos >> SH_2)); - if(t & opt_valid_bit) { - voffset = (t & 0x1fff) & screen_height_mask; - } - } - } - mosaic_x = mosaic_table[(screen_x + hoffset) & screen_width_mask ]; - mosaic_y = mosaic_table[(screen_y + voffset) & screen_height_mask]; - } - - switch(ppu.bg_tilemap_size[bg]) { - case 0: - map_index = 0; - break; - case 1: - map_index = ((mosaic_x >> tile_size) >> SH_32) << SH_2048; - break; - case 2: - map_index = ((mosaic_y >> tile_size) >> SH_32) << SH_2048; - break; - case 3: - map_index = ((mosaic_x >> tile_size) >> SH_32) << SH_2048 | - ((mosaic_y >> tile_size) >> SH_32) << SH_4096; - break; - } - - base_xpos = ((mosaic_x >> SH_8) & 31); - base_pos = (((mosaic_y >> tile_height) & 31) << SH_32) + ((mosaic_x >> tile_width) & 31); - pos = ppu.bg_tilemap_loc[bg] + map_index + (base_pos << SH_2); - t = *((word*)ppu.vram + (pos >> SH_2)); - mirror_y = (t & 0x8000)?1:0; - mirror_x = (t & 0x4000)?1:0; - - if((t & 0x2000) == 0) { - layer_pos = layer_pos_pri0; - } else { - layer_pos = layer_pos_pri1; - } - - tile_num = t & 0x03ff; - if(tile_width == SH_16) { - if(((mosaic_x & 15) >= 8 && !mirror_x) || - ((mosaic_x & 15) < 8 && mirror_x))tile_num++; - tile_num &= 0x03ff; - } - if(tile_height == SH_16) { - if(((mosaic_y & 15) >= 8 && !mirror_y) || - ((mosaic_y & 15) < 8 && mirror_y))tile_num += 16; - tile_num &= 0x03ff; - } - tile_num += (ppu.bg_tiledata_loc[bg] >> tiledata_size); - - if(bg_tiledata_state[tile_num] == 1) { - ppu_render_bg_tile(color_depth, bg, tile_num); - } - - pal_index = ((t >> 10) & 7) * pal_size; - - if(mirror_y) { ypos = (7 - (mosaic_y & 7)); } - else { ypos = ( (mosaic_y & 7)); } - -//loop while we are rendering from the same tile, as there's no need to do all of the above work -//unless we have rendered all of the visible tile, taking mosaic into account. - tile_ptr = (byte*)bg_tiledata + (tile_num << SH_64) + (ypos << SH_8); - while(1) { - if(mirror_x) { xpos = (7 - (mosaic_x & 7)); } - else { xpos = ( (mosaic_x & 7)); } - col = *(tile_ptr + xpos); - if(col) { - ppu_set_layer_pixel(screen_x, col + pal_index); - } - - bg_x++; - bg_x &= screen_width_mask; - mosaic_x = mosaic_table[bg_x]; - - if(base_xpos != ((mosaic_x >> SH_8) & 31))break; - screen_x++; - if(screen_x >= render.snes_width)break; - } - } -} - -#include "ppu_render_mode7.cpp" diff --git a/bsnes/ppu/ppu_render_mode7.cpp b/bsnes/ppu/ppu_render_mode7.cpp deleted file mode 100644 index 8b8d02d5..00000000 --- a/bsnes/ppu/ppu_render_mode7.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - The algorithm in this file was derived from the snes9x source code. - The snes9x source code is not public domain. If you wish to use this - code, you must abide by the terms of the snes9x license. If you do not - wish to abide by the snes9x licensing terms, please define the precompiler - variable PUBLIC_DOMAIN so that ppu_render_mode7f.cpp is used instead of - this file. You must also remove this file from any work that you release - that does not follow the snes9x license. - See license.txt for more info on the license of this software and snes9x. -*/ - -#define CLIP_10BIT_SIGNED(x) \ - ((x) & ((1 << 10) - 1)) + (((((x) & (1 << 13)) ^ (1 << 13)) - (1 << 13)) >> 3) - -#define CAST_WORDTOINT(x) \ - (int)(((x & 0x8000)?(x | 0xffff0000):(x & 0x00007fff))) - -void ppu_render_line_m7(byte layer_pos_bg1, byte layer_pos_bg2_pri0, byte layer_pos_bg2_pri1) { -int x; -int step_m7a, step_m7c, m7a, m7b, m7c, m7d; -int hoffset, voffset; -int centerx, centery; -int xx, yy; -int px, py; -int tx, ty, tile, palette, priority; -byte layer_pos; - hoffset = (CAST_WORDTOINT(ppu.m7hofs) << 7) >> 7; - voffset = (CAST_WORDTOINT(ppu.m7vofs) << 7) >> 7; - - centerx = (CAST_WORDTOINT(ppu.m7x) << 7) >> 7; - centery = (CAST_WORDTOINT(ppu.m7y) << 7) >> 7; - - if(ppu.mode7_vflip == true) { - yy = 223 - ppu.vline_pos; - } else { - yy = ppu.vline_pos; - } - yy += CLIP_10BIT_SIGNED(voffset - centery); - - m7b = CAST_WORDTOINT(ppu.m7b) * yy + (centerx << 8); - m7d = CAST_WORDTOINT(ppu.m7d) * yy + (centery << 8); - - step_m7a = CAST_WORDTOINT(ppu.m7a); - step_m7c = CAST_WORDTOINT(ppu.m7c); - - xx = CLIP_10BIT_SIGNED(hoffset - centerx); - - m7a = CAST_WORDTOINT(ppu.m7a) * xx; - m7c = CAST_WORDTOINT(ppu.m7c) * xx; - - for(x=0;x<256;x++) { - px = ((m7a + m7b) >> 8); - py = ((m7c + m7d) >> 8); - - switch(ppu.mode7_repeat) { - case 0: //screen repitition outside of screen area - case 1: //same as case 0 - px &= 1023; - py &= 1023; - tx = ((px >> SH_8) & 127); - ty = ((py >> SH_8) & 127); - tile = ppu.vram[(ty * 128 + tx) << 1]; - palette = ppu.vram[(((tile << SH_64) + ((py & 7) << SH_8) + (px & 7)) << 1) + 1]; - break; - case 2: //character 0 repetition outside of screen area - if(px < 0 || px > 1023 || py < 0 || py > 1023) { - tx = 0; - ty = 0; - } else { - px &= 1023; - py &= 1023; - tx = ((px >> SH_8) & 127); - ty = ((py >> SH_8) & 127); - } - tile = ppu.vram[(ty * 128 + tx) << 1]; - palette = ppu.vram[(((tile << SH_64) + ((py & 7) << SH_8) + (px & 7)) << 1) + 1]; - break; - case 3: //palette color 0 outside of screen area - if(px < 0 || px > 1023 || py < 0 || py > 1023) { - palette = 0; - } else { - px &= 1023; - py &= 1023; - tx = ((px >> SH_8) & 127); - ty = ((py >> SH_8) & 127); - tile = ppu.vram[(ty * 128 + tx) << 1]; - palette = ppu.vram[(((tile << SH_64) + ((py & 7) << SH_8) + (px & 7)) << 1) + 1]; - } - break; - } - - if(ppu.mode7_extbg == false) { - if(palette) { - layer_pos = layer_pos_bg1; - if(ppu.mode7_hflip == true) { - ppu_set_layer_pixel(255 - x, palette); - } else { - ppu_set_layer_pixel(x, palette); - } - } - } else { - priority = (palette >> 7); - palette &= 0x7f; - if(palette) { - if(priority == 0) { - layer_pos = layer_pos_bg2_pri0; - } else { - layer_pos = layer_pos_bg2_pri1; - } - if(ppu.mode7_hflip == true) { - ppu_set_layer_pixel(255 - x, palette); - } else { - ppu_set_layer_pixel(x, palette); - } - } - } - - m7a += step_m7a; - m7c += step_m7c; - } -} diff --git a/bsnes/ppu/ppu_screen.cpp b/bsnes/ppu/ppu_screen.cpp deleted file mode 100644 index 75db08bd..00000000 --- a/bsnes/ppu/ppu_screen.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/* - $2100 : screen brightness / enable - d---bbbb - - d: display (0=on, 1=off) - b: brightness (0-15) -*/ -extern emustate emu_state; - -void mmio_w2100(byte value) { - ppu.display_disable = (value & 0x80)?true:false; - ppu.display_brightness = (value & 0x0f); -} - -/* - $2105 : screen mode register - dcbapmmm - - d: bg4 tile size (0=8x8, 1=16x16) - c: bg3 tile size (0=8x8, 1=16x16) - b: bg2 tile size (0=8x8, 1=16x16) - a: bg1 tile size (0=8x8, 1=16x16) - p: bg priority mode - m: screen mode -*/ -void mmio_w2105(byte value) { -static byte prev_mode = 0x00; - ppu.bg_tile_size[BG4] = (value & 0x80)?1:0; - ppu.bg_tile_size[BG3] = (value & 0x40)?1:0; - ppu.bg_tile_size[BG2] = (value & 0x20)?1:0; - ppu.bg_tile_size[BG1] = (value & 0x10)?1:0; - ppu.bg_priority_mode = (value & 0x08)?1:0; - ppu.bg_mode = (value & 0x07); - if(prev_mode != ppu.bg_mode) { - video_setsnesmode(); - prev_mode = ppu.bg_mode; - } -} - -/* - $2106 : mosaic - ssssdcba - - s: size (0=smallest, 15=largest) - d: affect bg4 - c: affect bg3 - b: affect bg2 - a: affect bg1 -*/ -void mmio_w2106(byte value) { - ppu.mosaic_size = (value >> 4) & 15; - ppu.mosaic_enabled[BG4] = (value & 0x08)?true:false; - ppu.mosaic_enabled[BG3] = (value & 0x04)?true:false; - ppu.mosaic_enabled[BG2] = (value & 0x02)?true:false; - ppu.mosaic_enabled[BG1] = (value & 0x01)?true:false; -} - -/* - $212c : main screen desgination - $212d : sub screen designation - ---sdcba - - s: oam enable - d: bg4 enable - c: bg3 enable - b: bg2 enable - a: bg1 enable -*/ -void mmio_w212c(byte value) { - ppu.bg_enabled[OAM] = (value & 0x10)?true:false; - ppu.bg_enabled[BG4] = (value & 0x08)?true:false; - ppu.bg_enabled[BG3] = (value & 0x04)?true:false; - ppu.bg_enabled[BG2] = (value & 0x02)?true:false; - ppu.bg_enabled[BG1] = (value & 0x01)?true:false; -} - -void mmio_w212d(byte value) { - ppu.ss_bg_enabled[OAM] = (value & 0x10)?true:false; - ppu.ss_bg_enabled[BG4] = (value & 0x08)?true:false; - ppu.ss_bg_enabled[BG3] = (value & 0x04)?true:false; - ppu.ss_bg_enabled[BG2] = (value & 0x02)?true:false; - ppu.ss_bg_enabled[BG1] = (value & 0x01)?true:false; -} - -/* - $2133 : screen mode settings - ?m???ohi - - m: mode7 extbg (0 = off, 1 = on) - o: overscan (0 = off, 1 = on) - h: sprite halve (0 = off, 1 = on) - i: interlace (0 = off, 1 = on) -*/ -void mmio_w2133(byte value) { - ppu.mode7_extbg = (value & 0x40)?true:false; - ppu.overscan = (value & 0x04)?true:false; - ppu.visible_scanlines = (value & 0x04)?239:224; - ppu.sprite_halve = (value & 0x02)?true:false; - ppu.toggle_interlace = (value & 0x01)?true:false; - video_setsnesmode(); -} diff --git a/bsnes/ppu/ppu_scroll.cpp b/bsnes/ppu/ppu_scroll.cpp deleted file mode 100644 index fd7908b5..00000000 --- a/bsnes/ppu/ppu_scroll.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - $210d-$2114 : Scroll registers - - 210d/210e: bg1 hscroll/bg1 vscroll - 210f/2110: bg2 hscroll/bg2 vscroll - 2111/2112: bg3 hscroll/bg3 vscroll - 2113/2114: bg4 hscroll/bg4 vscroll - - you must write to this register twice to write the full address. - starting positions are 0, 0. only 11 bits of the address are used. -*/ -void mmio_w210d(byte value) { - ppu.bg_hscroll_pos[BG1] = (value << 8) | (ppu.bg_hscroll_pos[BG1] >> 8); - ppu.m7hofs = (value << 8) | (ppu.m7hofs >> 8); -} - -void mmio_w210e(byte value) { - ppu.bg_vscroll_pos[BG1] = (value << 8) | (ppu.bg_vscroll_pos[BG1] >> 8); - ppu.m7vofs = (value << 8) | (ppu.m7vofs >> 8); -} - -void mmio_w210f(byte value) { - ppu.bg_hscroll_pos[BG2] = (value << 8) | (ppu.bg_hscroll_pos[BG2] >> 8); -} - -void mmio_w2110(byte value) { - ppu.bg_vscroll_pos[BG2] = (value << 8) | (ppu.bg_vscroll_pos[BG2] >> 8); -} - -void mmio_w2111(byte value) { - ppu.bg_hscroll_pos[BG3] = (value << 8) | (ppu.bg_hscroll_pos[BG3] >> 8); -} - -void mmio_w2112(byte value) { - ppu.bg_vscroll_pos[BG3] = (value << 8) | (ppu.bg_vscroll_pos[BG3] >> 8); -} - -void mmio_w2113(byte value) { - ppu.bg_hscroll_pos[BG4] = (value << 8) | (ppu.bg_hscroll_pos[BG4] >> 8); -} - -void mmio_w2114(byte value) { - ppu.bg_vscroll_pos[BG4] = (value << 8) | (ppu.bg_vscroll_pos[BG4] >> 8); -} diff --git a/bsnes/ppu/ppu_spc.cpp b/bsnes/ppu/ppu_spc.cpp deleted file mode 100644 index 7d4a7e5e..00000000 --- a/bsnes/ppu/ppu_spc.cpp +++ /dev/null @@ -1,34 +0,0 @@ -byte mmio_rspc(byte port) { -#ifndef NO_SPC700 - return cpu_apu_bridge->cpu_read(port); -#else -static byte t = 0, counter = 0; -byte x; - if(rand() & 1) { - x = rand() & 7; - if(x == 0) { - if(!(port & 1))t = gx816->regs.a.w; - else t = gx816->regs.a.w >> 8; - } - else if(x == 1) { - if(!(port & 1))t = gx816->regs.x; - else t = gx816->regs.x >> 8; - } - else if(x == 2) { - if(!(port & 1))t = gx816->regs.y; - else t = gx816->regs.y >> 8; - } - else if(x == 3)t = 0xaa; - else if(x == 4)t = 0xbb; - else if(x == 5)t = 0xcc; - else { t = counter++; } - } - return t; -#endif -} - -void mmio_wspc(byte port, byte value) { -#ifndef NO_SPC700 - cpu_apu_bridge->cpu_write(port, value); -#endif -} diff --git a/bsnes/ppu/ppu_timing.cpp b/bsnes/ppu/ppu_timing.cpp deleted file mode 100644 index 59a36077..00000000 --- a/bsnes/ppu/ppu_timing.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/* - $2137 : counter latch - - reading from this register will latch the x/y - counter positions, but only if bit 7 of $4201 - is set. the default state of this register is - $ff on snes power on/reset. -*/ -byte mmio_r2137(void) { - if(ppu.io4201 & 0x80) { - snes_time->set_scan_pos(snes_time->master_cycles, false); - ppu.latch_toggle = 0; - ppu.latch_vpos = snes_time->vscan_pos; - ppu.latch_hpos = snes_time->hscan_pos; - ppu.counter_latched = true; - } - return 0x00; -} - -byte mmio_r213c(void) { -word r; - r = ppu.latch_hpos; - if(ppu.latch_toggle)r >>= 8; - ppu.latch_toggle ^= 1; - return r; -} - -byte mmio_r213d(void) { -word r; - r = ppu.latch_vpos; - if(ppu.latch_toggle)r >>= 8; - ppu.latch_toggle ^= 1; - return r; -} - -/* - $213e : ppu1 status register - trm-vvvv - - t: time over (?) - r: range over (?) - m: master/slave mode select (?) - -: open bus (?) - v: PPU1 (5c77) version number [1] -*/ -byte mmio_r213e(void) { -byte r = 0x00; - r |= 0x01; //ppu1 version # - return r; -} - -/* - $213f : ppu2 status register - ilcmvvvv - - i: interlace frame (0=even, 1=odd) - l: counter latched - c: open bus complement - m: ntsc/pal mode (0=ntsc, 1=pal) - v: PPU2 (5c78) version number [3] - -notes: - bit 6 (l): counter is latched by reading $2137, - or a 1->0 transition of $4201 bit 7. - - bit 5 (c): this is not implemented correctly. basically, - my copier (super ufo 8.3j) breaks the snes open bus. - as a result, 0x00 is always returned instead of the - open bus values. since this is the complement of that - value, 1 is always returned. I am emulating what my - copier returns until I can get a copier that supports - open bus correctly. -*/ -byte mmio_r213f(void) { -byte r = 0x00; - r |= ppu.interlace_frame << 7; - if(!(ppu.io4201 & 0x80)) { - r |= 1 << 6; - } else if(ppu.counter_latched == true) { - r |= 1 << 6; - ppu.counter_latched = false; - } - r |= 1 << 5; - r |= 0x03; //ppu2 version # - return r; -} - -/* - $4200 : counter enable - n-vh---j - - n: nmi enable - v: vertical counter enable - h: horizontal counter enable - j: automatic joypad enable - - the v/h counters must be enabled to invoke IRQs. the vertical - counter will override the horizontal counter. in other words, - if both v+h are set, only vertical IRQs will be performed. -*/ -void mmio_w4200(byte value) { - gx816->nmi_enabled = (value & 0x80)?true:false; - ppu.vcounter_enabled = (value & 0x20)?true:false; - ppu.hcounter_enabled = (value & 0x10)?true:false; - ppu.auto_joypad_read = (value & 0x01)?true:false; -} - -/* - $4201 : programmable i/o port - l??????? - - l: counter latch - - upon power on/reset, this value is set to 0xff. - clearing bit 7 will result in the x/y dot position - being set in $213c/$213d. the counters cannot be - latched again by writing a 0 to bit 7 until a 1 is - written to this bit first. reading $2137 while bit 7 - is cleared will not latch the counters. - - examples (+ = counter latched, - = counter not latched): - $00->$4201+ - $80->$4201- - $00->$4201+ $00->$4201- $80->$4201- $00->$4201+ - $2137->a+ $00->$4201+ $2137->a- -*/ -void mmio_w4201(byte value) { - if((ppu.io4201 & 0x80) && !(value & 0x80)) { - snes_time->set_scan_pos(snes_time->master_cycles + 4, false); - ppu.latch_toggle = 0; - ppu.latch_vpos = snes_time->vscan_pos; - ppu.latch_hpos = snes_time->hscan_pos; - ppu.counter_latched = true; - } - ppu.io4201 = value; -} - -/* - $4207/$4208 : horizontal counter position - - 9-bit value, used to invoke horizontal IRQs - horizontal range: 0-339 -*/ -void mmio_w4207(byte value) { - ppu.hirq_pos = (ppu.hirq_pos & 0x0100) | value; -} -void mmio_w4208(byte value) { - ppu.hirq_pos = (ppu.hirq_pos & 0x00ff) | (value & 1) << 8; -} - -/* - $4209/$420a : vertical counter position - - 9-bit value, used to invoke vertical IRQs - vertical range: 0-261 -*/ -void mmio_w4209(byte value) { - ppu.virq_pos = (ppu.virq_pos & 0x0100) | value; -} -void mmio_w420a(byte value) { - ppu.virq_pos = (ppu.virq_pos & 0x00ff) | (value & 1) << 8; -} - -/* - $420d : memory speed - 0000000x - - x: 0 = SlowROM - 1 = FastROM -*/ -void mmio_w420d(byte value) { - gx816->memory_speed = (value) & 0x01; - snes_time->set_speed_map(gx816->memory_speed); -} - -/* - $4210 : nmi status - n---vvvv - - n: nmi occurred (0=no, 1=yes) - -: open bus (?) - v: CPU (5a22) version number [2] - - value is set/cleared regardless of whether or not - NMIs are enabled in $4200 bit 7. -*/ -byte mmio_r4210(void) { -byte r = 0x00; - r |= (gx816->nmi_pin ^ 1)?0x80:0x00; - r |= 0x02; //cpu version # - gx816->nmi_pin = 1; - return r; -} - -/* - $4211 : irq toggle - i?------ - - i: irq state (1=in irq, 0=not in irq)? - ?: unknown, always return 1? -*/ -byte mmio_r4211(void) { -byte r = 0x00; - r |= 0x40; - if(ppu.irq_triggered == true)r |= 0x80; - ppu.irq_triggered = false; - return r; -} - -/* - $4212 : video status - vh-----j - - v: vblank (0=no, 1=yes) - h: hblank (0=no, 1=yes) - j: joypad ready (for auto joypad mode) -*/ -byte mmio_r4212(void) { -byte r; - r = 0x00; - -//set when the SNES is updating the joypad data automatically - if(snes_time->vscan_pos >= (ppu.visible_scanlines + 1) && snes_time->vscan_pos <= (ppu.visible_scanlines + 3))r |= 0x01; - -//set when the SNES is in hblank/vblank - if(snes_time->hcycle_pos <= 4 || snes_time->hcycle_pos >= 1098)r |= 0x40; - if(snes_time->vscan_pos == 0 || snes_time->vscan_pos >= (ppu.visible_scanlines + 1)) { - if(snes_time->vscan_pos == 0) { - if(snes_time->hcycle_pos < 2)r |= 0x80; - } else if(snes_time->vscan_pos == (ppu.visible_scanlines + 1)) { - if(snes_time->hcycle_pos >= 2)r |= 0x80; - } else { - r |= 0x80; - } - } - - return r; -} diff --git a/bsnes/ppu/ppu_vram.cpp b/bsnes/ppu/ppu_vram.cpp deleted file mode 100644 index b4708a51..00000000 --- a/bsnes/ppu/ppu_vram.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* - $2107-$210a : bg1-4 tilemap location - bbbbbbss - - b: location of bg tilemap - highest bit is ignored - s: tilemap size (00 = 32x32, 01 = 64x32, 10 = 32x64, 11 = 64x64) -*/ -void mmio_w2107(byte value) { - ppu.bg_tilemap_loc[BG1] = (value & 0x7c) << 9; - ppu.bg_tilemap_size[BG1] = value & 3; -} -void mmio_w2108(byte value) { - ppu.bg_tilemap_loc[BG2] = (value & 0x7c) << 9; - ppu.bg_tilemap_size[BG2] = value & 3; -} -void mmio_w2109(byte value) { - ppu.bg_tilemap_loc[BG3] = (value & 0x7c) << 9; - ppu.bg_tilemap_size[BG3] = value & 3; -} -void mmio_w210a(byte value) { - ppu.bg_tilemap_loc[BG4] = (value & 0x7c) << 9; - ppu.bg_tilemap_size[BG4] = value & 3; -} - -/* - $210b/$210c: bg1-4 tiledata location - bbbbaaaa - - a: bg1/3 tiledata location (210b/210c) - b: bg2/4 tiledata location (210b/210c) -*/ -void mmio_w210b(byte value) { - ppu.bg_tiledata_loc[BG1] = (value & 0x07) << 13; - ppu.bg_tiledata_loc[BG2] = (value & 0x70) << 9; -} -void mmio_w210c(byte value) { - ppu.bg_tiledata_loc[BG3] = (value & 0x07) << 13; - ppu.bg_tiledata_loc[BG4] = (value & 0x70) << 9; -} - -/* - $2115 : vram write counter - i---mmrr - - i: 0 = increment on $2118/$2139 - 1 = increment on $2119/$213a - m: address remapping - 00 = no remapping - 01 = aaaaaaaaBBBccccc -> aaaaaaaacccccBBB - 10 = aaaaaaaBBBcccccc -> aaaaaaaccccccBBB - 11 = aaaaaaBBBccccccc -> aaaaaacccccccBBB - r: increment rate - 00 = increment by 1 - 01 = increment by 32 - 10 = increment by 128 - 11 = increment by 128 -*/ -void mmio_w2115(byte value) { - ppu.vram_inc_reg = (value & 0x80)?1:0; - ppu.vram_remap_mode = (value >> 2) & 3; - switch(value & 3) { - case 0x00:ppu.vram_inc_size = 1;break; - case 0x01:ppu.vram_inc_size = 32;break; - case 0x02:ppu.vram_inc_size = 128;break; - case 0x03:ppu.vram_inc_size = 128;break; - } -} - -/* - $2116/$2117 : vram write position - - 15-bit value ($2116/$2117) determining position in vram to write to using $2118 - this value is doubled to get true write position (0000-ffff) -*/ -void mmio_w2116(byte value) { - ppu.vram_write_pos = ((ppu.vram_write_pos & 0xff00) | value); -} -void mmio_w2117(byte value) { - ppu.vram_write_pos = ((value << 8) | (ppu.vram_write_pos & 0xff)); -} - -word mmio_vram_remap(void) { -word addr, t; - addr = (ppu.vram_write_pos << 1); - switch(ppu.vram_remap_mode) { - case 0: - break; - case 1: - t = (addr >> 5) & 7; - addr = (addr & 0xff00) | ((addr & 0x001f) << 3) | t; - break; - case 2: - t = (addr >> 6) & 7; - addr = (addr & 0xfe00) | ((addr & 0x003f) << 3) | t; - break; - case 3: - t = (addr >> 7) & 7; - addr = (addr & 0xfc00) | ((addr & 0x007f) << 3) | t; - } - return addr; -} - -/* - $2118/$2119 : vram write - - $2118/$2119 write to vram using vram_write_pos, this is then incremented based on - the settings of $2115 (vram_inc_size / vram_inc_reg) -*/ -void mmio_w2118(byte value) { -word w; - w = mmio_vram_remap(); - ppu.vram[w] = value; - if(ppu.vram_inc_reg == 0) { - ppu.vram_write_pos += ppu.vram_inc_size; - } - ppu_bg_tiledata_state[TILE_2BIT][(w >> 4)] = 1; - ppu_bg_tiledata_state[TILE_4BIT][(w >> 5)] = 1; - ppu_bg_tiledata_state[TILE_8BIT][(w >> 6)] = 1; - - debug_test_bp(BPSRC_VRAM, BP_WRITE, w, value); -} - -void mmio_w2119(byte value) { -word w; - w = mmio_vram_remap() + 1; - ppu.vram[w] = value; - if(ppu.vram_inc_reg == 1) { - ppu.vram_write_pos += ppu.vram_inc_size; - } - ppu_bg_tiledata_state[TILE_2BIT][(w >> 4)] = 1; - ppu_bg_tiledata_state[TILE_4BIT][(w >> 5)] = 1; - ppu_bg_tiledata_state[TILE_8BIT][(w >> 6)] = 1; - - debug_test_bp(BPSRC_VRAM, BP_WRITE, w, value); -} - -/* - $2139/$213a : vram read -*/ -byte mmio_r2139(void) { -byte r; -word w; - w = mmio_vram_remap(); - r = ppu.vram_read_buffer; - if(ppu.vram_inc_reg == 0) { - ppu.vram_read_buffer = *((word*)ppu.vram + (w >> 1)); - ppu.vram_write_pos += ppu.vram_inc_size; - } - - debug_test_bp(BPSRC_VRAM, BP_READ, w, r); - return r; -} - -byte mmio_r213a(void) { -byte r; -word w; - w = mmio_vram_remap() + 1; - r = ppu.vram_read_buffer >> 8; - if(ppu.vram_inc_reg == 1) { - ppu.vram_read_buffer = *((word*)ppu.vram + (w >> 1)); - ppu.vram_write_pos += ppu.vram_inc_size; - } - - debug_test_bp(BPSRC_VRAM, BP_READ, w, r); - return r; -} diff --git a/bsnes/ppu/ppu_window.cpp b/bsnes/ppu/ppu_window.cpp deleted file mode 100644 index a7a012cf..00000000 --- a/bsnes/ppu/ppu_window.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - $2123/$2124/$2125 : window mask settings - - $2123: - hgfedcba - (bg2) - h: enable window 2 - g: clip window 2 (0=in, 1=out) - f: enable window 1 - e: clip window 1 (0=in, 1=out) - (bg1) - h: enable window 2 - g: clip window 2 (0=in, 1=out) - f: enable window 1 - e: clip window 1 (0=in, 1=out) - $2124: same as $2123, but with bg4/3 - $2125: - hgfedcba - h: enable color window 2 - g: clip window 2 (0=in, 1=out) - f: enable color window 1 - e: clip window 1 (0=in, 1=out) - d: enable OAM window 2 - c: clip window 2 (0=in, 1=out) - b: enable OAM window 1 - a: clip window 1 (0=in, 1=out) -*/ -void mmio_w2123(byte value) { - ppu.bg_window2_enabled [BG2] = (value & 0x80)?true:false; - ppu.bg_window2_clipmode[BG2] = (value & 0x40)?CLIPMODE_OUT:CLIPMODE_IN; - ppu.bg_window1_enabled [BG2] = (value & 0x20)?true:false; - ppu.bg_window1_clipmode[BG2] = (value & 0x10)?CLIPMODE_OUT:CLIPMODE_IN; - ppu.bg_window2_enabled [BG1] = (value & 0x08)?true:false; - ppu.bg_window2_clipmode[BG1] = (value & 0x04)?CLIPMODE_OUT:CLIPMODE_IN; - ppu.bg_window1_enabled [BG1] = (value & 0x02)?true:false; - ppu.bg_window1_clipmode[BG1] = (value & 0x01)?CLIPMODE_OUT:CLIPMODE_IN; -} - -void mmio_w2124(byte value) { - ppu.bg_window2_enabled [BG4] = (value & 0x80)?true:false; - ppu.bg_window2_clipmode[BG4] = (value & 0x40)?CLIPMODE_OUT:CLIPMODE_IN; - ppu.bg_window1_enabled [BG4] = (value & 0x20)?true:false; - ppu.bg_window1_clipmode[BG4] = (value & 0x10)?CLIPMODE_OUT:CLIPMODE_IN; - ppu.bg_window2_enabled [BG3] = (value & 0x08)?true:false; - ppu.bg_window2_clipmode[BG3] = (value & 0x04)?CLIPMODE_OUT:CLIPMODE_IN; - ppu.bg_window1_enabled [BG3] = (value & 0x02)?true:false; - ppu.bg_window1_clipmode[BG3] = (value & 0x01)?CLIPMODE_OUT:CLIPMODE_IN; -} - -void mmio_w2125(byte value) { - ppu.color_window2_enabled = (value & 0x80)?true:false; - ppu.color_window2_clipmode = (value & 0x40)?CLIPMODE_OUT:CLIPMODE_IN; - ppu.color_window1_enabled = (value & 0x20)?true:false; - ppu.color_window1_clipmode = (value & 0x10)?CLIPMODE_OUT:CLIPMODE_IN; - ppu.bg_window2_enabled [OAM] = (value & 0x08)?true:false; - ppu.bg_window2_clipmode[OAM] = (value & 0x04)?CLIPMODE_OUT:CLIPMODE_IN; - ppu.bg_window1_enabled [OAM] = (value & 0x02)?true:false; - ppu.bg_window1_clipmode[OAM] = (value & 0x01)?CLIPMODE_OUT:CLIPMODE_IN; -} - -/* - $2126-$2129 : window position settings - - $2126: window 1 left - $2127: window 1 right - $2128: window 2 left - $2129: window 2 right -*/ -void mmio_w2126(byte value) { ppu.window1_left = value; } -void mmio_w2127(byte value) { ppu.window1_right = value; } -void mmio_w2128(byte value) { ppu.window2_left = value; } -void mmio_w2129(byte value) { ppu.window2_right = value; } - -/* - $212a/$212b : window mask settings - $212a: ddccbbaa (d=bg4, c=bg3, b=bg2, a=bg1) - $212b: ----ccss (c=color add/sub, s=oam) - - 00=or - 01=and - 10=xor - 11=xnor -*/ -void mmio_w212a(byte value) { - ppu.bg_window_mask[BG4] = (value >> 6) & 3; - ppu.bg_window_mask[BG3] = (value >> 4) & 3; - ppu.bg_window_mask[BG2] = (value >> 2) & 3; - ppu.bg_window_mask[BG1] = (value ) & 3; -} - -void mmio_w212b(byte value) { - ppu.color_window_mask = (value >> 2) & 3; - ppu.bg_window_mask[OAM] = (value ) & 3; -} - -/* - $212e/$212f : main window designation - - ---odcba - - o: OAM enable - d: BG4 enable - c: BG3 enable - b: BG2 enable - a: BG1 enable -*/ -void mmio_w212e(byte value) { - ppu.bg_windowing_enabled[OAM] = (value & 0x10)?true:false; - ppu.bg_windowing_enabled[BG4] = (value & 0x08)?true:false; - ppu.bg_windowing_enabled[BG3] = (value & 0x04)?true:false; - ppu.bg_windowing_enabled[BG2] = (value & 0x02)?true:false; - ppu.bg_windowing_enabled[BG1] = (value & 0x01)?true:false; -} - -void mmio_w212f(byte value) { - ppu.ss_bg_windowing_enabled[OAM] = (value & 0x10)?true:false; - ppu.ss_bg_windowing_enabled[BG4] = (value & 0x08)?true:false; - ppu.ss_bg_windowing_enabled[BG3] = (value & 0x04)?true:false; - ppu.ss_bg_windowing_enabled[BG2] = (value & 0x02)?true:false; - ppu.ss_bg_windowing_enabled[BG1] = (value & 0x01)?true:false; -} diff --git a/bsnes/ppu/ppu_wram.cpp b/bsnes/ppu/ppu_wram.cpp deleted file mode 100644 index af47708d..00000000 --- a/bsnes/ppu/ppu_wram.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/* - $2180 : wram read/write - - write byte to wram write pointer ($2181-$2183), then increment pointer. - always stays within 7e0000-7fffff, high 7 bits of 24-bit offset ignored. -*/ -byte mmio_r2180(void) { -byte r; - r = gx816->mem_read(MEMMODE_NONE, MEMSIZE_BYTE, 0x7e0000 | ppu.wram_write_pos); - ppu.wram_write_pos++; - ppu.wram_write_pos &= 0x01ffff; - return r; -} - -void mmio_w2180(byte value) { - gx816->mem_write(MEMMODE_NONE, MEMSIZE_BYTE, 0x7e0000 | ppu.wram_write_pos, value); - ppu.wram_write_pos++; - ppu.wram_write_pos &= 0x01ffff; -} - -/* - $2181-$2183: wram write pointer set -*/ -void mmio_w2181(byte value) { - ppu.wram_write_pos = ((ppu.wram_write_pos & 0xffff00) | value) & 0x01ffff; -} -void mmio_w2182(byte value) { - ppu.wram_write_pos = ((ppu.wram_write_pos & 0xff00ff) | (value << 8)) & 0x01ffff; -} -void mmio_w2183(byte value) { - ppu.wram_write_pos = ((ppu.wram_write_pos & 0x00ffff) | (value << 16)) & 0x01ffff; -} diff --git a/bsnes/qc.bat b/bsnes/qc.bat deleted file mode 100644 index 76e3786d..00000000 --- a/bsnes/qc.bat +++ /dev/null @@ -1,3 +0,0 @@ -del c:\root\bsnes_testrom\bsnes.exe -copy bsnes.exe c:\root\bsnes_testrom\bsnes.exe -@pause \ No newline at end of file diff --git a/bsnes/timing/timing.cpp b/bsnes/timing/timing.cpp deleted file mode 100644 index 5508de23..00000000 --- a/bsnes/timing/timing.cpp +++ /dev/null @@ -1,370 +0,0 @@ -#include "../base.h" -#include "../cpu/g65816.h" -#include "timing.h" - -extern g65816 *gx816; -extern ppustate ppu; -extern debugstate debugger; -snes_timer *snes_time; - -/* - apu_cycles is incremented to keep in sync with master_cycles. - (n << 5) is only a guess that one apu cycle is equivalent to - 32 cpu cycles. -*/ -void add_apu_cycles(int n) { - snes_time->apu_cycles += n; - snes_time->bridge.apu_cycles += (n << 5); -} - -void snes_timer::add_cpu_cycles(byte count, byte speed) { -ulong cycles = count * speed; - master_cycles += cycles; - bridge.cpu_cycles += cycles; -} - -void snes_timer::add_cpu_pcycles(byte count) { -ulong speed = mem_speed_map[(gx816->regs.pc & 0xffffff) >> 9]; -ulong cycles = count * speed; - master_cycles += cycles; - bridge.cpu_cycles += cycles; -} - -void snes_timer::add_cpu_mcycles(byte count, ulong addr) { -ulong speed = mem_speed_map[(addr & 0xffffff) >> 9]; -ulong cycles = count * speed; - master_cycles += cycles; - bridge.cpu_cycles += cycles; -} - -void snes_timer::add_cpu_scycles(byte count) { -ulong cycles = (count << 3); //count * 8 - master_cycles += cycles; - bridge.cpu_cycles += cycles; -} - -void snes_timer::add_cpu_icycles(byte count) { -ulong cycles = (count << 2) + (count << 1); //count * 6 - master_cycles += cycles; - bridge.cpu_cycles += cycles; -} - -void snes_timer::set_speed_map(byte speed) { - if(speed == MEMSPEED_SLOWROM) { - mem_speed_map = sm_slowrom; - } else { //speed == MEMSPEED_FASTROM - mem_speed_map = sm_fastrom; - } -} - -void snes_timer::build_speed_map(void) { -int i; -byte db; -word addr; -ulong z; - sm_slowrom = (byte*)malloc(0x8000); - sm_fastrom = (byte*)malloc(0x8000); - for(i=0;i<0x8000;i++) { - z = (i << 9); - db = (z >> 16); - addr = (z & 0xffff); - if(db >= 0x00 && db <= 0x3f) { - if (addr >= 0x0000 && addr <= 0x1fff) { - sm_slowrom[i] = MEMSPEED_SLOW; - sm_fastrom[i] = MEMSPEED_SLOW; - } - else if(addr >= 0x2000 && addr <= 0x3fff) { - sm_slowrom[i] = MEMSPEED_FAST; - sm_fastrom[i] = MEMSPEED_FAST; - } - else if(addr >= 0x4000 && addr <= 0x41ff) { - sm_slowrom[i] = MEMSPEED_XSLOW; - sm_fastrom[i] = MEMSPEED_XSLOW; - } - else if(addr >= 0x4200 && addr <= 0x5fff) { - sm_slowrom[i] = MEMSPEED_FAST; - sm_fastrom[i] = MEMSPEED_FAST; - } - else { //(addr >= 0x6000 && addr <= 0xffff) - sm_slowrom[i] = MEMSPEED_SLOW; - sm_fastrom[i] = MEMSPEED_SLOW; - } - } else if(db >= 0x40 && db <= 0x7f) { - sm_slowrom[i] = MEMSPEED_SLOW; - sm_fastrom[i] = MEMSPEED_SLOW; - } else if(db >= 0x80 && db <= 0xbf) { - if (addr >= 0x0000 && addr <= 0x1fff) { - sm_slowrom[i] = MEMSPEED_SLOW; - sm_fastrom[i] = MEMSPEED_SLOW; - } - else if(addr >= 0x2000 && addr <= 0x3fff) { - sm_slowrom[i] = MEMSPEED_FAST; - sm_fastrom[i] = MEMSPEED_FAST; - } - else if(addr >= 0x4000 && addr <= 0x41ff) { - sm_slowrom[i] = MEMSPEED_XSLOW; - sm_fastrom[i] = MEMSPEED_XSLOW; - } - else if(addr >= 0x4200 && addr <= 0x5fff) { - sm_slowrom[i] = MEMSPEED_FAST; - sm_fastrom[i] = MEMSPEED_FAST; - } - else if(addr >= 0x6000 && addr <= 0x7fff) { - sm_slowrom[i] = MEMSPEED_SLOW; - sm_fastrom[i] = MEMSPEED_SLOW; - } - else { //(addr >= 0x8000 && addr <= 0xffff) - sm_slowrom[i] = MEMSPEED_SLOW; - sm_fastrom[i] = MEMSPEED_FAST; - } - } else { //(db >= 0xc0 && db <= 0xff) - sm_slowrom[i] = MEMSPEED_SLOW; - sm_fastrom[i] = MEMSPEED_FAST; - } - } -} - -/* - all dots are 4 cycles long, except dots 322 and 326. dots 322 and 326 - are 6 cycles long. this holds true for all scanlines except scanline - 240 on non-interlace odd frames. the reason for this is because this - scanline is only 1360 cycles long, instead of 1364 like all other - scanlines. - this makes the effective range of hscan_pos 0-339 at all times. - dot 322 range = { 1288, 1290, 1292 } - dot 326 range = { 1306, 1308, 1310 } - - latch_table_a is used for interlace-even, interlace-odd, and - non-interlace-even frames. this is done to conserve memory. - interlace-even frames have one extra scanline, but the - cycle-to-x/y positions are still identical. - latch_table_b is used for non-interlace-odd, because these - frames have one scanline that is 4 master cycles shorter than - the others. this would offset all x/y positions from (322,240) - and onward without a separate table. - - both tables are one scanline longer than the snes allows so that - if the x/y positions are refreshed and the cycle position used - goes beyond the end of the frame, it won't access an invalid - memory address. the routine will then see that the y position - is higher than the current frame allows, and it will reset the - y position at that time. -*/ -void snes_timer::build_dot_map(void) { -int x, y, cycle; -int ptr; - latch_table_a = (latch_pos*)malloc(264 * (1364 / 2) * sizeof(latch_pos)); - latch_table_b = (latch_pos*)malloc(263 * (1364 / 2) * sizeof(latch_pos)); - - ptr = 0; - for(y=0;y<264;y++) { - for(x=cycle=0;x<340;x++) { - latch_table_a[ptr].cx = cycle; - latch_table_a[ptr].x = x; - latch_table_a[ptr].y = y; - ptr++; - cycle += 2; - latch_table_a[ptr].cx = cycle; - latch_table_a[ptr].x = x; - latch_table_a[ptr].y = y; - ptr++; - cycle += 2; - if(x == 322 || x == 326) { - latch_table_a[ptr].cx = cycle; - latch_table_a[ptr].x = x; - latch_table_a[ptr].y = y; - ptr++; - cycle += 2; - } - } - } - - ptr = 0; - for(y=0;y<263;y++) { - for(x=cycle=0;x<340;x++) { - latch_table_b[ptr].cx = cycle; - latch_table_b[ptr].x = x; - latch_table_b[ptr].y = y; - ptr++; - cycle += 2; - latch_table_b[ptr].cx = cycle; - latch_table_b[ptr].x = x; - latch_table_b[ptr].y = y; - ptr++; - cycle += 2; - if(y != 240 && (x == 322 || x == 326)) { - latch_table_b[ptr].cx = cycle; - latch_table_b[ptr].x = x; - latch_table_b[ptr].y = y; - ptr++; - cycle += 2; - } - } - } -} - -void snes_timer::reset_clock(void) { - mem_speed_map = sm_slowrom; - -//upon SNES reset, starts at scanline 0 non-interlace - frame_cycles = 262 * 1364; - frame_lines = 262; - line_cycles = 1364; - ppu.interlace = false; - ppu.toggle_interlace = false; - ppu.interlace_frame = 0; - latch_table = latch_table_a; - - vscan_pos = 0; - hscan_pos = 0; - hcycle_pos = 0; - - dram_refresh_pos = 538; - dram_refreshed = false; - - nmi_triggered = false; - - apu_cycles = 0; - bridge.cpu_cycles = 0; - bridge.apu_cycles = 0; - -/* - Initial latch values for $213c/$213d - 0035:0000 (53.0 -> 212) [lda $2137] - 0038:0000 (56.5 -> 226) [nop : lda $2137] -*/ - master_cycles = 188; - prev_master_cycles = 0; - update_timer(); -} - -snes_timer::snes_timer() { - build_speed_map(); - build_dot_map(); -} - -snes_timer::~snes_timer() { - if(mem_speed_map)free(mem_speed_map); - if(latch_table_a)free(latch_table_a); - if(latch_table_b)free(latch_table_b); -} - -/* - all scanlines are 1364 cycles long, except scanline 240 - on non-interlace odd-frames, which is 1360 cycles long. - interlace mode has 525 scanlines: 263 on the even frame, - and 262 on the odd. - non-interlace mode has 524 scanlines: 262 scanlines on - both even and odd frames. -*/ -void snes_timer::inc_vscan_pos(void) { - if(vscan_pos >= frame_lines) { - master_cycles -= frame_cycles; - vscan_pos = 0; - nmi_triggered = false; - - ppu.interlace = ppu.toggle_interlace; - ppu.interlace_frame ^= 1; - if(ppu.interlace == true) { - if(ppu.interlace_frame == 0) { - frame_cycles = 263 * 1364; - frame_lines = 263; - } else { - frame_cycles = 262 * 1364; - frame_lines = 262; - } - latch_table = latch_table_a; - } else { //ppu.interlace == false - if(ppu.interlace_frame == 0) { - frame_cycles = 262 * 1364; - frame_lines = 262; - latch_table = latch_table_a; - } else { - frame_cycles = (262 * 1364) - 4; - frame_lines = 262; - latch_table = latch_table_b; - } - } - vscan_wrapped = true; - } - - if(ppu.interlace == false && ppu.interlace_frame == 1 && vscan_pos == 240) { - line_cycles = 1360; - } else { - line_cycles = 1364; - } - - hscan_wrapped = true; - dram_refreshed = false; -} - -void snes_timer::update_dram_refresh_pos(void) { - if(ppu.interlace == false && ppu.interlace_frame == 1 && vscan_pos == 240) { - //dram refresh position doesn't change - } else { - if(dram_refresh_pos == 534) { - dram_refresh_pos = 538; - } else { - dram_refresh_pos = 534; - } - } -} - -/* - this routine is *not* designed to seek to any scan position passed to it. - it is intended that cycle_pos is no more than 40 master cycles above the - previous cycle_pos given to this routine. the routine has two purposes, - one is to actually update the screen x/y positions and trigger system - events; the other is to allow the 4 master cycle difference between latching - the x/y counters from reading $2137 and writing $4201. - the former passes update_frame_info as true, as the changes should be permanent. - the latter passes update_frame_info as false, as the real cycle counter will - not be incremented at that time (that is handled within the opcodes themselves). - - the cycle_pos passed is divided by 2 because the smallest possible cpu clock - frequency is 2 master cycles, and this allows the latch tables to consume only - half as much memory. -*/ -void snes_timer::set_scan_pos(ulong cycle_pos, bool update_frame_info) { -int y; - y = vscan_pos; - cycle_pos >>= 1; - vscan_pos = latch_table[cycle_pos].y; - hscan_pos = latch_table[cycle_pos].x; - hcycle_pos = latch_table[cycle_pos].cx; - if(update_frame_info == true) { - if(vscan_pos > y) { - inc_vscan_pos(); - } - } else { - if(vscan_pos >= frame_lines) { - vscan_pos -= frame_lines; - } - } - - if(dram_refreshed == false && hcycle_pos >= dram_refresh_pos) { - if(update_frame_info == true) { - add_cpu_cycles(1, 40); - dram_refreshed = true; - update_dram_refresh_pos(); - } - hcycle_pos += 40; - hscan_pos += 10; - } -} - -void snes_timer::update_timer(void) { - set_scan_pos(master_cycles, true); -} - -void snes_timer::update_timer_events(void) { - if(gx816->cpu_state == CPUSTATE_STP)return; - - if(snes_time->vscan_pos == (ppu.visible_scanlines + 1) && snes_time->hcycle_pos >= 12 && nmi_triggered == false) { - nmi_triggered = true; - gx816->nmi_pin = 0; - if(gx816->nmi_enabled == true) { - gx816->InvokeIRQ(0xffea); - } - } -} diff --git a/bsnes/timing/timing.h b/bsnes/timing/timing.h deleted file mode 100644 index 37a7c9e5..00000000 --- a/bsnes/timing/timing.h +++ /dev/null @@ -1,43 +0,0 @@ -//mask table (powers of 2) -#define TIMING_NONE 0x00 -#define TIMING_CONDITION2 0x01 //DL != 0 -#define TIMING_CONDITION4 0x02 //crossed page boundary or p.x = 0 - -typedef struct { - word cx, x, y; -}latch_pos; - -class snes_timer { -public: -ulong apu_cycles; -ulong master_cycles, prev_master_cycles; -struct { - ulong cpu_cycles, apu_cycles; -}bridge; -word hcycle_pos, vscan_pos, hscan_pos; -bool vscan_wrapped, hscan_wrapped; -bool dram_refreshed, nmi_triggered; -byte *mem_speed_map, *sm_slowrom, *sm_fastrom; -ulong frame_cycles, frame_lines, line_cycles; -word dram_refresh_pos; -latch_pos *latch_table_a, *latch_table_b, *latch_table; - - void add_cpu_cycles (byte count, byte speed); - void add_cpu_pcycles(byte count); - void add_cpu_mcycles(byte count, ulong addr); - void add_cpu_scycles(byte count); - void add_cpu_icycles(byte count); - - ulong get_master_cycle_count(ulong offset); - void build_speed_map(void); - void build_dot_map(void); - void reset_clock(void); - void inc_vscan_pos(void); - void set_scan_pos(ulong cycle_pos, bool update_frame_info); - void set_speed_map(byte speed); - void update_dram_refresh_pos(void); - void update_timer(void); - void update_timer_events(void); - snes_timer(); - ~snes_timer(); -}; diff --git a/bsnes/win/gui.cpp b/bsnes/win/gui.cpp deleted file mode 100644 index cabc86a8..00000000 --- a/bsnes/win/gui.cpp +++ /dev/null @@ -1,459 +0,0 @@ -#include "../base.h" -#include "../timing/timing.h" -extern snes_timer *snes_time; -#include "../cpu/g65816.h" -#include "../apu/spc700.h" -extern g65816 *gx816; -extern sony_spc700 *spc700; -extern emustate emu_state; -extern debugstate debugger; -extern videostate render; -extern ppustate ppu; -#include - -#define BSNES_TITLE "bsnes v0.0.005a" - -enum { - MENU_FILE_LOAD = 100, - MENU_FILE_RESET, - MENU_FILE_EXIT, - MENU_SETTINGS_VIDEOMODE_256x224w, - MENU_SETTINGS_VIDEOMODE_512x448w, - MENU_SETTINGS_VIDEOMODE_640x480f, - MENU_SETTINGS_FRAMESKIP_OFF, - MENU_SETTINGS_FRAMESKIP_1, - MENU_SETTINGS_FRAMESKIP_2, - MENU_SETTINGS_FRAMESKIP_3, - MENU_SETTINGS_FRAMESKIP_4, - MENU_SETTINGS_FRAMESKIP_5, - MENU_SETTINGS_FRAMESKIP_6, - MENU_SETTINGS_FRAMESKIP_7, - MENU_SETTINGS_FRAMESKIP_8, - MENU_SETTINGS_FRAMESKIP_9, - MENU_SETTINGS_DEBUGGER, - MENU_HELP_ABOUT -}; - -HWND hwndMain = 0; -HMENU hmenuMain; -HFONT hFontFixed, hFont; - -extern joypad_state joypad1; - -#define KEY_UP VK_UP -#define KEY_DOWN VK_DOWN -#define KEY_LEFT VK_LEFT -#define KEY_RIGHT VK_RIGHT -#define KEY_SHIFT VK_RSHIFT -#define KEY_ENTER VK_RETURN -#define KEY_A 'A' -#define KEY_S 'S' -#define KEY_D 'D' -#define KEY_Z 'Z' -#define KEY_X 'X' -#define KEY_C 'C' - -#define KeyState(key) ((GetAsyncKeyState(key) & 0x8000)?1:0) - -void UpdateJoypad(void) { - joypad1.up = KeyState(KEY_UP ); - joypad1.down = (joypad1.up)?0:KeyState(KEY_DOWN); - joypad1.left = KeyState(KEY_LEFT ); - joypad1.right = (joypad1.left)?0:KeyState(KEY_RIGHT); - joypad1.select = KeyState(KEY_SHIFT); - joypad1.start = KeyState(KEY_ENTER); - joypad1.y = KeyState(KEY_A ); - joypad1.b = KeyState(KEY_Z ); - joypad1.x = KeyState(KEY_S ); - joypad1.a = KeyState(KEY_X ); - joypad1.l = KeyState(KEY_D ); - joypad1.r = KeyState(KEY_C ); - - if(debugger_enabled() == false)return; - if(debugger.lock_up == true)joypad1.up = 1; - if(debugger.lock_down == true)joypad1.down = 1; - if(debugger.lock_left == true)joypad1.left = 1; - if(debugger.lock_right == true)joypad1.right = 1; - if(debugger.lock_a == true)joypad1.a = 1; - if(debugger.lock_b == true)joypad1.b = 1; - if(debugger.lock_x == true)joypad1.x = 1; - if(debugger.lock_y == true)joypad1.y = 1; - if(debugger.lock_l == true)joypad1.l = 1; - if(debugger.lock_r == true)joypad1.r = 1; - if(debugger.lock_select == true)joypad1.select = 1; - if(debugger.lock_start == true)joypad1.start = 1; -} - -void alert(char *s, ...) { -char str[4096]; -va_list args; - va_start(args, s); - vsprintf(str, s, args); - va_end(args); - MessageBox(0, str, "bsnes", MB_OK); -} - -void FixWindowSize(HWND hwnd, ulong width, ulong height, ulong px = null, ulong py = null) { -RECT rc; -ulong x, y, wx, wy; - ShowWindow(hwnd, SW_HIDE); - SetWindowPos(hwnd, 0, 0, 0, width, height, SWP_NOZORDER); - GetClientRect(hwnd, &rc); - x = width + width - (rc.right - rc.left); - y = height + height - (rc.bottom - rc.top); - wx = (GetSystemMetrics(SM_CXSCREEN) - x) / 2; - wy = (GetSystemMetrics(SM_CYSCREEN) - y) / 2; - if(px == null || py == null) { - SetWindowPos(hwnd, 0, wx, wy, x, y, SWP_NOZORDER); - } else { - SetWindowPos(hwnd, 0, px, py, x, y, SWP_NOZORDER); - } -} - -HBRUSH black_brush; - -long __stdcall wndprocMain(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam); - -void RegisterMainWindow() { -WNDCLASS wc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hbrBackground = black_brush; - wc.hCursor = LoadCursor(0, IDC_ARROW); - wc.hIcon = LoadIcon(0, IDI_APPLICATION); - wc.hInstance = GetModuleHandle(0); - wc.lpfnWndProc = wndprocMain; - wc.lpszClassName = "bsnes"; - wc.lpszMenuName = 0; - wc.style = CS_HREDRAW | CS_VREDRAW; - RegisterClass(&wc); -} - -void CreateMainMenu(void) { -HMENU hsubmenu, hbranchmenu; - hmenuMain = CreateMenu(); - - hsubmenu = CreatePopupMenu(); - AppendMenu(hsubmenu, MF_STRING, MENU_FILE_LOAD, "&Load ROM"); - AppendMenu(hsubmenu, MF_STRING, MENU_FILE_RESET, "&Reset"); - AppendMenu(hsubmenu, MF_SEPARATOR, 0, ""); - AppendMenu(hsubmenu, MF_STRING, MENU_FILE_EXIT, "E&xit"); - AppendMenu(hmenuMain, MF_STRING | MF_POPUP, (unsigned int)hsubmenu, "&File"); - - hsubmenu = CreatePopupMenu(); - - hbranchmenu = CreatePopupMenu(); - AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_VIDEOMODE_256x224w, "256x224 Windowed"); - AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_VIDEOMODE_512x448w, "512x448 Windowed"); - AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_VIDEOMODE_640x480f, "640x480 Fullscreen"); - AppendMenu(hsubmenu, MF_STRING | MF_POPUP, (unsigned int)hbranchmenu, "&Video Mode"); - - hbranchmenu = CreatePopupMenu(); - AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_OFF, "Off"); - AppendMenu(hbranchmenu, MF_SEPARATOR, 0, ""); - AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_1, "1"); - AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_2, "2"); - AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_3, "3"); - AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_4, "4"); - AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_5, "5"); - AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_6, "6"); - AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_7, "7"); - AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_8, "8"); - AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_9, "9"); - AppendMenu(hsubmenu, MF_STRING | MF_POPUP, (unsigned int)hbranchmenu, "&Frameskip"); - - AppendMenu(hsubmenu, MF_SEPARATOR, 0, ""); - AppendMenu(hsubmenu, MF_STRING | (debug_get_state() == DEBUGMODE_WAIT)?MF_CHECKED:MF_UNCHECKED, MENU_SETTINGS_DEBUGGER, "&Debug Mode"); - AppendMenu(hmenuMain, MF_STRING | MF_POPUP, (unsigned int)hsubmenu, "&Settings"); - - hsubmenu = CreatePopupMenu(); - AppendMenu(hsubmenu, MF_STRING, MENU_HELP_ABOUT, "&About"); - AppendMenu(hmenuMain, MF_STRING | MF_POPUP, (unsigned int)hsubmenu, "&Help"); - - CheckMenuItem(hmenuMain, MENU_SETTINGS_VIDEOMODE_512x448w, MF_CHECKED); - CheckMenuItem(hmenuMain, MENU_SETTINGS_FRAMESKIP_OFF + render.frame_skip, MF_CHECKED); -} - -void CreateMainWindow(void) { - hwndMain = CreateWindow("bsnes", BSNES_TITLE, WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, - 0, 0, 640, 480, 0, 0, GetModuleHandle(0), 0); - CreateMainMenu(); -} - -void SetMainWindowPos(bool update_style) { - if(render.fullscreen == true) { - if(update_style == true) { - SetWindowLong(hwndMain, GWL_STYLE, WS_POPUP); - SetWindowLong(hwndMain, GWL_EXSTYLE, WS_EX_TOPMOST); - SetWindowPos(hwndMain, HWND_TOPMOST, 0, 0, 640, 480, 0); - } - if(render.show_menu == true) { - ShowCursor(TRUE); - } else { - ShowCursor(FALSE); - } - } else { - if(update_style == true) { - SetWindowLong(hwndMain, GWL_STYLE, WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX); - SetWindowLong(hwndMain, GWL_EXSTYLE, 0); - } - FixWindowSize(hwndMain, render.display_width, render.display_height); - } -} - -void UpdateMainWindowStyle(bool update_style) { - if(render.fullscreen == false) { - ShowWindow(hwndMain, SW_HIDE); - } - - if(render.show_menu == true) { - SetMenu(hwndMain, hmenuMain); - SetMainWindowPos(update_style); - } else { - SetMenu(hwndMain, 0); - SetMainWindowPos(update_style); - } - - if(render.fullscreen == false) { - ShowWindow(hwndMain, SW_NORMAL); - } -} - -HWND NewWindow(WNDPROC wndproc, char *classname, char *title, ulong color, ulong width, ulong height) { -WNDCLASS wc; -HWND hwnd; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hbrBackground = (color == null)?(HBRUSH)(COLOR_WINDOW):black_brush; - wc.hCursor = LoadCursor(0, IDC_ARROW); - wc.hIcon = LoadIcon(0, IDI_APPLICATION); - wc.hInstance = GetModuleHandle(0); - wc.lpfnWndProc = wndproc; - wc.lpszClassName = classname; - wc.lpszMenuName = 0; - wc.style = CS_HREDRAW | CS_VREDRAW; - RegisterClass(&wc); - - hwnd = CreateWindow(classname, title, WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, - 0, 0, width, height, 0, 0, wc.hInstance, 0); - return hwnd; -} - -#include "render.cpp" - -bool GUIOpenFile(char *fn) { -OPENFILENAME ofn; - memset(&ofn, 0, sizeof(ofn)); - - ofn.lStructSize = sizeof(ofn); - ofn.hwndOwner = hwndMain; - ofn.lpstrFilter = "SNES ROM Images (*.smc;*.swc;*.fig;*.ufo;*.gd3;*.078)\0*.smc;*.swc;*.fig;*.ufo;*.gd3;*.078\0All Files (*.*)\0*.*\0"; - ofn.lpstrFile = fn; - ofn.nMaxFile = MAX_PATH; - ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST; - ofn.lpstrDefExt = "smc"; - - if(GetOpenFileName(&ofn)) { - return true; - } else { - return false; - } -} - -void EnableDebugger(byte first_time); -void DisableDebugger(void); - -long __stdcall wndprocMain(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { -char fn[MAX_PATH]; -bool result; - switch(msg) { - case WM_DESTROY: - PostQuitMessage(0); - break; - case WM_PAINT: - DrawScene(); - break; - case WM_KEYDOWN: - switch(wparam) { - case VK_ESCAPE: - if(render.show_menu == true) { - render.show_menu = false; - } else { - render.show_menu = true; - } - UpdateMainWindowStyle(false); - break; - } - break; - case WM_COMMAND: - switch(LOWORD(wparam)) { - case MENU_FILE_LOAD: - strcpy(fn, ""); - result = GUIOpenFile(fn); - if(result == true) { - emu_state.rom_loaded = true; - strcpy(emu_state.rom_name, fn); - fn[strlen(fn) - 4] = 0; - strcat(fn, ".srm"); - strcpy(emu_state.sram_name, fn); - gx816->PowerOn(0); - gx816->LoadROM(); - ResetSNES(); - if(debugger_enabled() == true) { - debug_set_state(DEBUGMODE_WAIT); - } - } - break; - case MENU_FILE_RESET: - ResetSNES(); - break; - case MENU_FILE_EXIT: - PostQuitMessage(0); - break; - case MENU_SETTINGS_VIDEOMODE_256x224w: - video_setmode(false, 256, 224); - CheckMenuItem(hmenuMain, MENU_SETTINGS_VIDEOMODE_256x224w, MF_CHECKED); - CheckMenuItem(hmenuMain, MENU_SETTINGS_VIDEOMODE_512x448w, MF_UNCHECKED); - CheckMenuItem(hmenuMain, MENU_SETTINGS_VIDEOMODE_640x480f, MF_UNCHECKED); - break; - case MENU_SETTINGS_VIDEOMODE_512x448w: - video_setmode(false, 512, 448); - CheckMenuItem(hmenuMain, MENU_SETTINGS_VIDEOMODE_256x224w, MF_UNCHECKED); - CheckMenuItem(hmenuMain, MENU_SETTINGS_VIDEOMODE_512x448w, MF_CHECKED); - CheckMenuItem(hmenuMain, MENU_SETTINGS_VIDEOMODE_640x480f, MF_UNCHECKED); - break; - case MENU_SETTINGS_VIDEOMODE_640x480f: - video_setmode(true, 512, 448); - CheckMenuItem(hmenuMain, MENU_SETTINGS_VIDEOMODE_256x224w, MF_UNCHECKED); - CheckMenuItem(hmenuMain, MENU_SETTINGS_VIDEOMODE_512x448w, MF_UNCHECKED); - CheckMenuItem(hmenuMain, MENU_SETTINGS_VIDEOMODE_640x480f, MF_CHECKED); - break; - case MENU_SETTINGS_FRAMESKIP_OFF: - case MENU_SETTINGS_FRAMESKIP_1: - case MENU_SETTINGS_FRAMESKIP_2: - case MENU_SETTINGS_FRAMESKIP_3: - case MENU_SETTINGS_FRAMESKIP_4: - case MENU_SETTINGS_FRAMESKIP_5: - case MENU_SETTINGS_FRAMESKIP_6: - case MENU_SETTINGS_FRAMESKIP_7: - case MENU_SETTINGS_FRAMESKIP_8: - case MENU_SETTINGS_FRAMESKIP_9: - CheckMenuItem(hmenuMain, MENU_SETTINGS_FRAMESKIP_OFF + render.frame_skip, MF_UNCHECKED); - render.frame_skip = LOWORD(wparam) - MENU_SETTINGS_FRAMESKIP_OFF; - render.frame_count = 0; - CheckMenuItem(hmenuMain, MENU_SETTINGS_FRAMESKIP_OFF + render.frame_skip, MF_CHECKED); - break; - case MENU_SETTINGS_DEBUGGER: - if(debugger_enabled() == false) { - CheckMenuItem(hmenuMain, MENU_SETTINGS_DEBUGGER, MF_CHECKED); - EnableDebugger(0); - } else { - CheckMenuItem(hmenuMain, MENU_SETTINGS_DEBUGGER, MF_UNCHECKED); - DisableDebugger(); - } - break; - case MENU_HELP_ABOUT: - MessageBox(hwndMain, "bsnes -- written by byuu", "About", MB_OK); - break; - } - break; - } - - return DefWindowProc(hwnd, msg, wparam, lparam); -} - -void CreateFonts(void) { -HDC hdc; -long height; - hdc = GetDC(0); - height = -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72); - ReleaseDC(0, hdc); - hFontFixed = CreateFont(height, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Courier New"); - - hdc = GetDC(0); - height = -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72); - ReleaseDC(0, hdc); - hFont = CreateFont(height, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Tahoma"); -} - -#include "gui_cpu.cpp" -#include "gui_mem.cpp" -#include "gui_bp.cpp" -#include "gui_bgtoggle.cpp" - -void EnableDebugger(byte first_time) { - debug_set_state(DEBUGMODE_WAIT); - - hwndDCPU = NewWindow(wndprocDCPU, "bsnes_cpu", "console", null, DCPU_WIDTH, DCPU_HEIGHT); - CreateDCPU(); - FixWindowSize(hwndDCPU, DCPU_WIDTH, DCPU_HEIGHT, 0, 1024 - 410); - - hwndDMEM = NewWindow(wndprocDMEM, "bsnes_mem", "memory editor", null, DMEM_WIDTH, DMEM_HEIGHT); - CreateDMEM(); - FixWindowSize(hwndDMEM, DMEM_WIDTH, DMEM_HEIGHT, 386, 321); - - hwndDBP = NewWindow(wndprocDBP, "bsnes_bp", "breakpoint editor", null, DBP_WIDTH, DBP_HEIGHT); - CreateDBP(); - FixWindowSize(hwndDBP, DBP_WIDTH, DBP_HEIGHT, 0, 346); - - hwndDBGToggle = NewWindow(wndprocDBGToggle, "bsnes_bgtoggle", "ppu bg toggle", null, 275, 90); - CreateDBGToggle(); - FixWindowSize(hwndDBGToggle, 275, 90, 0, 231); - - FixWindowSize(hwndMain, 256, 223, 871, 1024 - 410); - - ShowWindow(hwndDCPU, SW_NORMAL); - ShowWindow(hwndDMEM, SW_NORMAL); - ShowWindow(hwndDBP, SW_NORMAL); - ShowWindow(hwndDBGToggle, SW_NORMAL); - ShowWindow(hwndMain, SW_NORMAL); - - if(first_time == 0) { - debug_refresh_mem(); - debug_refresh_bp(); - debug_update_status(); - dprintf("* Debugger Enabled"); - UpdateDisplay(); - } -} - -void DisableDebugger(void) { - debug_set_state(DEBUGMODE_DISABLED); - - DestroyWindow(hwndDCPU); - DestroyWindow(hwndDBP); - DestroyWindow(hwndDMEM); - DestroyWindow(hwndDBGToggle); -} - -void __winmain(void) { -MSG msg; - CreateFonts(); - black_brush = CreateSolidBrush(RGB(0, 0, 0)); - RegisterMainWindow(); - CreateMainWindow(); - UpdateMainWindowStyle(false); - - if(debug_get_state() == DEBUGMODE_WAIT) { - EnableDebugger(1); - } - video_setmode(render.fullscreen, render.display_width, render.display_height); - - InitDisplay(); - CreateColorTable(); - - InitSNES(); - - UpdateDisplay(); - UpdateDisplay(); - - while(1) { - if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { - if(msg.message == WM_QUIT)break; - TranslateMessage(&msg); - DispatchMessage(&msg); - } else { - RunSNES(); - } - } -} diff --git a/bsnes/win/gui_bgtoggle.cpp b/bsnes/win/gui_bgtoggle.cpp deleted file mode 100644 index 40a05344..00000000 --- a/bsnes/win/gui_bgtoggle.cpp +++ /dev/null @@ -1,149 +0,0 @@ -#define DBGTOGGLE_BG1ENABLE 100 -#define DBGTOGGLE_BG1ENABLE0 101 -#define DBGTOGGLE_BG1ENABLE1 102 -#define DBGTOGGLE_BG2ENABLE 103 -#define DBGTOGGLE_BG2ENABLE0 104 -#define DBGTOGGLE_BG2ENABLE1 105 -#define DBGTOGGLE_BG3ENABLE 106 -#define DBGTOGGLE_BG3ENABLE0 107 -#define DBGTOGGLE_BG3ENABLE1 108 -#define DBGTOGGLE_BG4ENABLE 109 -#define DBGTOGGLE_BG4ENABLE0 110 -#define DBGTOGGLE_BG4ENABLE1 111 -#define DBGTOGGLE_OAMENABLE 112 -#define DBGTOGGLE_OAMENABLE0 113 -#define DBGTOGGLE_OAMENABLE1 114 -#define DBGTOGGLE_OAMENABLE2 115 -#define DBGTOGGLE_OAMENABLE3 116 - -#define BGTOGGLE_CLICK(src, val) \ - case src: \ - state = SendDlgItemMessage(hwndDBGToggle, src, BM_GETCHECK, 0, 0); \ - if(state == 0) { \ - val = true; \ - SendDlgItemMessage(hwndDBGToggle, src, BM_SETCHECK, 1, 0); \ - } else { \ - val = false; \ - SendDlgItemMessage(hwndDBGToggle, src, BM_SETCHECK, 0, 0); \ - } \ - break - -HWND hwndDBGToggle; - -long __stdcall wndprocDBGToggle(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { -int state; - if(msg == WM_DESTROY || msg == WM_CLOSE)return 0; - if(msg == WM_COMMAND) { - if(HIWORD(wparam) == BN_CLICKED) { - switch(LOWORD(wparam)) { - BGTOGGLE_CLICK(DBGTOGGLE_BG1ENABLE, render.bg1_enabled[DEBUG_BGENABLED_ALL ]); - BGTOGGLE_CLICK(DBGTOGGLE_BG1ENABLE0, render.bg1_enabled[DEBUG_BGENABLED_PRI0]); - BGTOGGLE_CLICK(DBGTOGGLE_BG1ENABLE1, render.bg1_enabled[DEBUG_BGENABLED_PRI1]); - BGTOGGLE_CLICK(DBGTOGGLE_BG2ENABLE, render.bg2_enabled[DEBUG_BGENABLED_ALL ]); - BGTOGGLE_CLICK(DBGTOGGLE_BG2ENABLE0, render.bg2_enabled[DEBUG_BGENABLED_PRI0]); - BGTOGGLE_CLICK(DBGTOGGLE_BG2ENABLE1, render.bg2_enabled[DEBUG_BGENABLED_PRI1]); - BGTOGGLE_CLICK(DBGTOGGLE_BG3ENABLE, render.bg3_enabled[DEBUG_BGENABLED_ALL ]); - BGTOGGLE_CLICK(DBGTOGGLE_BG3ENABLE0, render.bg3_enabled[DEBUG_BGENABLED_PRI0]); - BGTOGGLE_CLICK(DBGTOGGLE_BG3ENABLE1, render.bg3_enabled[DEBUG_BGENABLED_PRI1]); - BGTOGGLE_CLICK(DBGTOGGLE_BG4ENABLE, render.bg4_enabled[DEBUG_BGENABLED_ALL ]); - BGTOGGLE_CLICK(DBGTOGGLE_BG4ENABLE0, render.bg4_enabled[DEBUG_BGENABLED_PRI0]); - BGTOGGLE_CLICK(DBGTOGGLE_BG4ENABLE1, render.bg4_enabled[DEBUG_BGENABLED_PRI1]); - BGTOGGLE_CLICK(DBGTOGGLE_OAMENABLE, render.oam_enabled[DEBUG_BGENABLED_ALL ]); - BGTOGGLE_CLICK(DBGTOGGLE_OAMENABLE0, render.oam_enabled[DEBUG_BGENABLED_PRI0]); - BGTOGGLE_CLICK(DBGTOGGLE_OAMENABLE1, render.oam_enabled[DEBUG_BGENABLED_PRI1]); - BGTOGGLE_CLICK(DBGTOGGLE_OAMENABLE2, render.oam_enabled[DEBUG_BGENABLED_PRI2]); - BGTOGGLE_CLICK(DBGTOGGLE_OAMENABLE3, render.oam_enabled[DEBUG_BGENABLED_PRI3]); - } - } - } - return DefWindowProc(hwnd, msg, wparam, lparam); -} - -void CreateDBGToggle(void) { -int x, y, wl, wr, h; - x = 5; - y = 5; - wl = 90; - wr = 45; - h = 16; - CreateWindow("BUTTON", "Enable BG1", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x, y, wl, h, - hwndDBGToggle, (HMENU)DBGTOGGLE_BG1ENABLE, GetModuleHandle(0), 0); - x += wl; - CreateWindow("BUTTON", "Pri 0", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x, y, wr, h, - hwndDBGToggle, (HMENU)DBGTOGGLE_BG1ENABLE0, GetModuleHandle(0), 0); - x += wr; - CreateWindow("BUTTON", "Pri 1", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x, y, wr, h, - hwndDBGToggle, (HMENU)DBGTOGGLE_BG1ENABLE1, GetModuleHandle(0), 0); - - x = 5; - y += h; - CreateWindow("BUTTON", "Enable BG2", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x, y, wl, h, - hwndDBGToggle, (HMENU)DBGTOGGLE_BG2ENABLE, GetModuleHandle(0), 0); - x += wl; - CreateWindow("BUTTON", "Pri 0", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x, y, wr, h, - hwndDBGToggle, (HMENU)DBGTOGGLE_BG2ENABLE0, GetModuleHandle(0), 0); - x += wr; - CreateWindow("BUTTON", "Pri 1", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x, y, wr, h, - hwndDBGToggle, (HMENU)DBGTOGGLE_BG2ENABLE1, GetModuleHandle(0), 0); - - x = 5; - y += h; - CreateWindow("BUTTON", "Enable BG3", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x, y, wl, h, - hwndDBGToggle, (HMENU)DBGTOGGLE_BG3ENABLE, GetModuleHandle(0), 0); - x += wl; - CreateWindow("BUTTON", "Pri 0", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x, y, wr, h, - hwndDBGToggle, (HMENU)DBGTOGGLE_BG3ENABLE0, GetModuleHandle(0), 0); - x += wr; - CreateWindow("BUTTON", "Pri 1", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x, y, wr, h, - hwndDBGToggle, (HMENU)DBGTOGGLE_BG3ENABLE1, GetModuleHandle(0), 0); - - x = 5; - y += h; - CreateWindow("BUTTON", "Enable BG4", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x, y, wl, h, - hwndDBGToggle, (HMENU)DBGTOGGLE_BG4ENABLE, GetModuleHandle(0), 0); - x += wl; - CreateWindow("BUTTON", "Pri 0", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x, y, wr, h, - hwndDBGToggle, (HMENU)DBGTOGGLE_BG4ENABLE0, GetModuleHandle(0), 0); - x += wr; - CreateWindow("BUTTON", "Pri 1", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x, y, wr, h, - hwndDBGToggle, (HMENU)DBGTOGGLE_BG4ENABLE1, GetModuleHandle(0), 0); - - x = 5; - y += h; - CreateWindow("BUTTON", "Enable OAM", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x, y, wl, h, - hwndDBGToggle, (HMENU)DBGTOGGLE_OAMENABLE, GetModuleHandle(0), 0); - x += wl; - CreateWindow("BUTTON", "Pri 0", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x, y, wr, h, - hwndDBGToggle, (HMENU)DBGTOGGLE_OAMENABLE0, GetModuleHandle(0), 0); - x += wr; - CreateWindow("BUTTON", "Pri 1", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x, y, wr, h, - hwndDBGToggle, (HMENU)DBGTOGGLE_OAMENABLE1, GetModuleHandle(0), 0); - x += wr; - CreateWindow("BUTTON", "Pri 2", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x, y, wr, h, - hwndDBGToggle, (HMENU)DBGTOGGLE_OAMENABLE2, GetModuleHandle(0), 0); - x += wr; - CreateWindow("BUTTON", "Pri 3", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x, y, wr, h, - hwndDBGToggle, (HMENU)DBGTOGGLE_OAMENABLE3, GetModuleHandle(0), 0); - - SendDlgItemMessage(hwndDBGToggle, DBGTOGGLE_BG1ENABLE, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBGToggle, DBGTOGGLE_BG1ENABLE0, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBGToggle, DBGTOGGLE_BG1ENABLE1, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBGToggle, DBGTOGGLE_BG2ENABLE, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBGToggle, DBGTOGGLE_BG2ENABLE0, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBGToggle, DBGTOGGLE_BG2ENABLE1, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBGToggle, DBGTOGGLE_BG3ENABLE, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBGToggle, DBGTOGGLE_BG3ENABLE0, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBGToggle, DBGTOGGLE_BG3ENABLE1, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBGToggle, DBGTOGGLE_BG4ENABLE, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBGToggle, DBGTOGGLE_BG4ENABLE0, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBGToggle, DBGTOGGLE_BG4ENABLE1, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBGToggle, DBGTOGGLE_OAMENABLE, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBGToggle, DBGTOGGLE_OAMENABLE0, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBGToggle, DBGTOGGLE_OAMENABLE1, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBGToggle, DBGTOGGLE_OAMENABLE2, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBGToggle, DBGTOGGLE_OAMENABLE3, WM_SETFONT, (WPARAM)hFont, TRUE); - - for(int i=DBGTOGGLE_BG1ENABLE;i<=DBGTOGGLE_OAMENABLE3;i++) { - SendDlgItemMessage(hwndDBGToggle, i, BM_SETCHECK, 1, 0); - } -} diff --git a/bsnes/win/gui_bp.cpp b/bsnes/win/gui_bp.cpp deleted file mode 100644 index c0ca3624..00000000 --- a/bsnes/win/gui_bp.cpp +++ /dev/null @@ -1,227 +0,0 @@ -#define DBP_WIDTH 380 -#define DBP_HEIGHT 243 - -#define DBP_LIST 100 -#define DBP_ADDBP 101 -#define DBP_REMBP 102 -#define DBP_CLRBP 103 -#define DBP_STATIC1 104 -#define DBP_BPNUM 105 -#define DBP_BPOFFSET 106 -#define DBP_BPR 107 -#define DBP_BPW 108 -#define DBP_BPX 109 -#define DBP_BPV 110 -#define DBP_BPVAL 111 -#define DBP_STATIC2 112 -#define DBP_SRCMEM 113 -#define DBP_SRCVRAM 114 -#define DBP_SRCCGRAM 115 -#define DBP_SRCOAM 116 -#define DBP_SRCSPCRAM 117 -#define DBP_SRCMODE 118 - -HWND hwndDBP; -byte debug_bp_src; - -void debug_refresh_bp(void) { -char str[128*16], t[128]; - if(debugger_enabled() == false)return; - - strcpy(str, ""); - for(int i=0;i<16;i++) { - sprintf(t, "%0.2d: ", i); - strcat(str, t); - if(debugger.bp_list[i].flags == BP_OFF) { - strcat(str, "------ ---- -- ------ (Disabled)"); - } else { - sprintf(t, "%0.6x %c%c%c%c ", debugger.bp_list[i].offset, - (debugger.bp_list[i].flags & BP_READ )?'R':'r', - (debugger.bp_list[i].flags & BP_WRITE)?'W':'w', - (debugger.bp_list[i].flags & BP_EXEC )?'X':'x', - (debugger.bp_list[i].flags & BP_VAL )?'V':'v'); - strcat(str, t); - if(debugger.bp_list[i].flags & BP_VAL) { - sprintf(t, "%0.2x ", debugger.bp_list[i].value); - strcat(str, t); - } else strcat(str, "-- "); - - switch(debugger.bp_list[i].source) { - case BPSRC_MEM: strcat(str, "DRAM ");break; - case BPSRC_VRAM: strcat(str, "VRAM ");break; - case BPSRC_CGRAM: strcat(str, "CGRAM ");break; - case BPSRC_OAM: strcat(str, "OAM ");break; - case BPSRC_SPCRAM:strcat(str, "SPCRAM ");break; - } - - sprintf(t, "%10d", debugger.bp_list[i].hit_count); - strcat(str, t); - } - if(i != 15)strcat(str, "\r\n"); - } - - SetDlgItemText(hwndDBP, DBP_LIST, str); -} - -long __stdcall wndprocDBP(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { -char str[256]; -ulong num, offset, val, flags; -int i, pos; - if(msg == WM_DESTROY || msg == WM_CLOSE)return 0; //don't allow debugger to be closed (yet) - - if(msg == WM_COMMAND) { - switch(LOWORD(wparam)) { - case DBP_BPNUM: - if(HIWORD(wparam) == CBN_SELCHANGE) { - num = SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_GETCURSEL, 0, 0); - sprintf(str, "%0.6x", debugger.bp_list[num].offset); - SetDlgItemText(hwndDBP, DBP_BPOFFSET, str); - sprintf(str, "%0.2x", debugger.bp_list[num].value); - SetDlgItemText(hwndDBP, DBP_BPVAL, str); - switch(debugger.bp_list[num].source) { - case BPSRC_MEM: pos = 0; break; - case BPSRC_VRAM: pos = 1; break; - case BPSRC_CGRAM: pos = 2; break; - case BPSRC_OAM: pos = 3; break; - case BPSRC_SPCRAM: pos = 4; break; - } - SendDlgItemMessage(hwndDBP, DBP_SRCMODE, CB_SETCURSEL, (WPARAM)pos, 0); - SendDlgItemMessage(hwndDBP, DBP_BPR, BM_SETCHECK, (debugger.bp_list[num].flags & BP_READ )?1:0, 0); - SendDlgItemMessage(hwndDBP, DBP_BPW, BM_SETCHECK, (debugger.bp_list[num].flags & BP_WRITE)?1:0, 0); - SendDlgItemMessage(hwndDBP, DBP_BPX, BM_SETCHECK, (debugger.bp_list[num].flags & BP_EXEC )?1:0, 0); - SendDlgItemMessage(hwndDBP, DBP_BPV, BM_SETCHECK, (debugger.bp_list[num].flags & BP_VAL )?1:0, 0); - } - break; - case DBP_ADDBP: - num = SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_GETCURSEL, 0, 0); - GetDlgItemText(hwndDBP, DBP_BPOFFSET, str, 255); - offset = strhex(str) & 0xffffff; - GetDlgItemText(hwndDBP, DBP_BPVAL, str, 255); - val = strhex(str); - - flags = 0; - if(SendDlgItemMessage(hwndDBP, DBP_BPR, BM_GETCHECK, 0, 0))flags |= BP_READ; - if(SendDlgItemMessage(hwndDBP, DBP_BPW, BM_GETCHECK, 0, 0))flags |= BP_WRITE; - if(SendDlgItemMessage(hwndDBP, DBP_BPX, BM_GETCHECK, 0, 0))flags |= BP_EXEC; - if(SendDlgItemMessage(hwndDBP, DBP_BPV, BM_GETCHECK, 0, 0))flags |= BP_VAL; - - debugger.bp_list[num].offset = offset; - debugger.bp_list[num].flags = flags; - debugger.bp_list[num].source = debug_bp_src; - if(debugger.bp_list[num].flags & BP_VAL) { - debugger.bp_list[num].value = val; - } else { - debugger.bp_list[num].value = 0; - } - debugger.bp_list[num].hit_count = 0; - debugger.refresh_bp = true; - break; - case DBP_REMBP: - num = SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_GETCURSEL, 0, 0); - debugger.bp_list[num].offset = 0; - debugger.bp_list[num].flags = BP_OFF; - debugger.bp_list[num].source = BPSRC_MEM; - debugger.bp_list[num].value = 0; - debugger.bp_list[num].hit_count = 0; - debugger.refresh_bp = true; - break; - case DBP_CLRBP: - for(i=0;i<16;i++) { - debugger.bp_list[i].offset = 0; - debugger.bp_list[i].flags = BP_OFF; - debugger.bp_list[i].source = BPSRC_MEM; - debugger.bp_list[i].value = 0; - debugger.bp_list[i].hit_count = 0; - } - debugger.refresh_bp = true; - break; - case DBP_SRCMODE: - if(HIWORD(wparam) == CBN_SELCHANGE) { - pos = SendDlgItemMessage(hwndDBP, DBP_SRCMODE, CB_GETCURSEL, 0, 0); - if(pos == 0) { - debug_bp_src = BPSRC_MEM; - } else if(pos == 1) { - debug_bp_src = BPSRC_VRAM; - } else if(pos == 2) { - debug_bp_src = BPSRC_CGRAM; - } else if(pos == 3) { - debug_bp_src = BPSRC_OAM; - } else if(pos == 4) { - debug_bp_src = BPSRC_SPCRAM; - } - } - break; - } - } - - return DefWindowProc(hwnd, msg, wparam, lparam); -} - -void CreateDBP(void) { - CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", - WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_READONLY, - 5, 5, 260, 233, hwndDBP, (HMENU)DBP_LIST, GetModuleHandle(0), 0); - - CreateWindow("STATIC", "BP #: Offset:", WS_CHILD|WS_VISIBLE, 270, 5, 90, 15, hwndDBP, (HMENU)DBP_STATIC1, GetModuleHandle(0), 0); - - CreateWindow("COMBOBOX", "", - WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|CBS_HASSTRINGS, - 270, 20, 45, 300, hwndDBP, (HMENU)DBP_BPNUM, GetModuleHandle(0), 0); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_ADDSTRING, 0, (LPARAM)"00"); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_ADDSTRING, 0, (LPARAM)"01"); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_ADDSTRING, 0, (LPARAM)"02"); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_ADDSTRING, 0, (LPARAM)"03"); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_ADDSTRING, 0, (LPARAM)"04"); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_ADDSTRING, 0, (LPARAM)"05"); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_ADDSTRING, 0, (LPARAM)"06"); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_ADDSTRING, 0, (LPARAM)"07"); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_ADDSTRING, 0, (LPARAM)"08"); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_ADDSTRING, 0, (LPARAM)"09"); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_ADDSTRING, 0, (LPARAM)"10"); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_ADDSTRING, 0, (LPARAM)"11"); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_ADDSTRING, 0, (LPARAM)"12"); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_ADDSTRING, 0, (LPARAM)"13"); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_ADDSTRING, 0, (LPARAM)"14"); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_ADDSTRING, 0, (LPARAM)"15"); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, CB_SETCURSEL, 0, 0); - - CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "000000", WS_CHILD|WS_VISIBLE, 315, 20, 60, 23, hwndDBP, (HMENU)DBP_BPOFFSET, GetModuleHandle(0), 0); - CreateWindow("BUTTON", "R", WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX, 270, 44, 30, 18, hwndDBP, (HMENU)DBP_BPR, GetModuleHandle(0), 0); - CreateWindow("BUTTON", "W", WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX, 300, 44, 30, 18, hwndDBP, (HMENU)DBP_BPW, GetModuleHandle(0), 0); - CreateWindow("BUTTON", "X", WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX, 330, 44, 30, 18, hwndDBP, (HMENU)DBP_BPX, GetModuleHandle(0), 0); - CreateWindow("BUTTON", "V", WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX, 270, 65, 30, 18, hwndDBP, (HMENU)DBP_BPV, GetModuleHandle(0), 0); - CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "00", WS_CHILD|WS_VISIBLE, 300, 62, 30, 23, hwndDBP, (HMENU)DBP_BPVAL, GetModuleHandle(0), 0); - - CreateWindow("STATIC", "Source:", WS_CHILD|WS_VISIBLE, 270, 85, 90, 15, hwndDBP, (HMENU)DBP_STATIC2, GetModuleHandle(0), 0); - CreateWindow("COMBOBOX", "", - WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|CBS_HASSTRINGS, - 270, 100, 105, 200, hwndDBP, (HMENU)DBP_SRCMODE, GetModuleHandle(0), 0); - SendDlgItemMessage(hwndDBP, DBP_SRCMODE, CB_ADDSTRING, 0, (LPARAM)"DRAM"); - SendDlgItemMessage(hwndDBP, DBP_SRCMODE, CB_ADDSTRING, 0, (LPARAM)"VRAM"); - SendDlgItemMessage(hwndDBP, DBP_SRCMODE, CB_ADDSTRING, 0, (LPARAM)"CGRAM"); - SendDlgItemMessage(hwndDBP, DBP_SRCMODE, CB_ADDSTRING, 0, (LPARAM)"OAM"); - SendDlgItemMessage(hwndDBP, DBP_SRCMODE, CB_ADDSTRING, 0, (LPARAM)"SPCRAM"); - SendDlgItemMessage(hwndDBP, DBP_SRCMODE, CB_SETCURSEL, 0, 0); - - CreateWindow("BUTTON", "Set BP", WS_CHILD|WS_VISIBLE, 270, 125, 105, 20, hwndDBP, (HMENU)DBP_ADDBP, GetModuleHandle(0), 0); - CreateWindow("BUTTON", "Clear BP", WS_CHILD|WS_VISIBLE, 270, 145, 105, 20, hwndDBP, (HMENU)DBP_REMBP, GetModuleHandle(0), 0); - CreateWindow("BUTTON", "Clear All BPs", WS_CHILD|WS_VISIBLE, 270, 165, 105, 20, hwndDBP, (HMENU)DBP_CLRBP, GetModuleHandle(0), 0); - - SendDlgItemMessage(hwndDBP, DBP_LIST, WM_SETFONT, (WPARAM)hFontFixed, TRUE); - SendDlgItemMessage(hwndDBP, DBP_STATIC1, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBP, DBP_BPNUM, WM_SETFONT, (WPARAM)hFontFixed, TRUE); - SendDlgItemMessage(hwndDBP, DBP_BPOFFSET, WM_SETFONT, (WPARAM)hFontFixed, TRUE); - SendDlgItemMessage(hwndDBP, DBP_BPR, WM_SETFONT, (WPARAM)hFontFixed, TRUE); - SendDlgItemMessage(hwndDBP, DBP_BPW, WM_SETFONT, (WPARAM)hFontFixed, TRUE); - SendDlgItemMessage(hwndDBP, DBP_BPX, WM_SETFONT, (WPARAM)hFontFixed, TRUE); - SendDlgItemMessage(hwndDBP, DBP_BPV, WM_SETFONT, (WPARAM)hFontFixed, TRUE); - SendDlgItemMessage(hwndDBP, DBP_BPVAL, WM_SETFONT, (WPARAM)hFontFixed, TRUE); - SendDlgItemMessage(hwndDBP, DBP_SRCMODE, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBP, DBP_STATIC2, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBP, DBP_ADDBP, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBP, DBP_REMBP, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDBP, DBP_CLRBP, WM_SETFONT, (WPARAM)hFont, TRUE); - - SendDlgItemMessage(hwndDBP, DBP_SRCMEM, BM_SETCHECK, 1, 0); - debug_bp_src = BPSRC_MEM; -} diff --git a/bsnes/win/gui_cpu.cpp b/bsnes/win/gui_cpu.cpp deleted file mode 100644 index f03879c1..00000000 --- a/bsnes/win/gui_cpu.cpp +++ /dev/null @@ -1,409 +0,0 @@ -#define DCPU_WIDTH 865 -#define DCPU_HEIGHT 385 - -enum { - DCPU_DISAS = 100, - DCPU_CPUGROUP, - DCPU_CPUSTEP, - DCPU_CPUPROCEED, - DCPU_CPUSKIP, - DCPU_CPUTRACENUM, - DCPU_CPUTRACE, - DCPU_CPUDISABLE, - DCPU_APUGROUP, - DCPU_APUSTEP, - DCPU_APUPROCEED, - DCPU_APUSKIP, - DCPU_APUTRACENUM, - DCPU_APUTRACE, - DCPU_APUDISABLE, - DCPU_SYSGROUP, - DCPU_SYSRUN, - DCPU_SYSRUNTOFRAME, - DCPU_SYSRUNTOVBLANK, - DCPU_SYSRUNTONMI, - DCPU_SYSRUNTOIRQ, - DCPU_SYSRUNTOINT, - DCPU_CFGGROUP, - DCPU_CFGCPUOUT, - DCPU_CFGAPUOUT, - DCPU_CFGDBGOUT, - DCPU_CFGTRACE, - DCPU_CFGTRACEPRINT, - DCPU_CFGREGTYPE, - DCPU_CFGREGNUM, - DCPU_CFGREGVAL, - DCPU_CFGREGSET, - DCPU_CFGLOCK, - DCPU_CFGLOCKUP, - DCPU_CFGLOCKDOWN, - DCPU_CFGLOCKLEFT, - DCPU_CFGLOCKRIGHT, - DCPU_CFGLOCKA, - DCPU_CFGLOCKB, - DCPU_CFGLOCKX, - DCPU_CFGLOCKY, - DCPU_CFGLOCKL, - DCPU_CFGLOCKR, - DCPU_CFGLOCKSELECT, - DCPU_CFGLOCKSTART, - DCPU_STATUS -}; - -HWND hwndDCPU; -#define DEBUG_CONSOLE_LINES 250 -char dcpu_disas_mem[DEBUG_CONSOLE_LINES][256]; - -void debug_update_console(void) { -int i; -char str[256 * DEBUG_CONSOLE_LINES]; - if(debug_write_status() == DEBUGWRITE_NONE)return; - - strcpy(str, ""); - for(i=0;ivscan_pos, snes_time->hcycle_pos, snes_time->hscan_pos, snes_time->master_cycles, - (gx816->nmi_enabled == true)?" Enabled":"Disabled", - (ppu.vcounter_enabled == true)?" Enabled":"Disabled", - (ppu.hcounter_enabled == true)?" Enabled":"Disabled", - ppu.virq_pos, ppu.hirq_pos, - gx816->regs.pc, gx816->regs.a.w, gx816->regs.x, gx816->regs.y, - gx816->regs.s, gx816->regs.d, gx816->regs.db, - spc700->regs.pc, spc700->regs.a, spc700->regs.x, spc700->regs.y, - spc700->regs.sp, (spc700->regs.y << 8) | spc700->regs.a); - SetDlgItemText(hwndDCPU, DCPU_STATUS, str); -} - -void debug_write(ulong msg_type, char *s) { -int i; - if(debugger_enabled() == false)return; - - switch(msg_type) { - case DEBUGMSG_INFO: - if(debugger.output_debug_info == false)return; - break; - case DEBUGMSG_CPU: - if(debugger.output_cpu_instrs == false)return; - break; - case DEBUGMSG_APU: - if(debugger.output_apu_instrs == false)return; - break; - } - - if(debugger.trace_enabled == true) { - fprintf(debugger.trace_fp, "%s\r\n", s); - } - - if(debug_write_status() & DEBUGWRITE_CONSOLE) { - for(i=0;imem_read(MEMMODE_LONG, MEMSIZE_BYTE, ptr++, MEMACCESS_DEBUGGER)); - ptr &= 0xffffff; - strcat(str, t); - if(x != 15)strcat(str, " "); - } - if(y != 15)strcat(str, "\r\n"); - } - } else if(dmem_mode == DMEMMODE_VRAM) { - ptr &= 0xffff; - for(y=0;y<16;y++) { - sprintf(t, "--%0.4x: ", ptr); - strcat(str, t); - for(x=0;x<16;x++) { - sprintf(t, "%0.2x", ppu.vram[ptr++]); - ptr &= 0xffff; - strcat(str, t); - if(x != 15)strcat(str, " "); - } - if(y != 15)strcat(str, "\r\n"); - } - } else if(dmem_mode == DMEMMODE_CGRAM) { - ptr &= 0x01ff; - for(y=0;y<16;y++) { - sprintf(t, "---%0.3x: ", ptr); - strcat(str, t); - for(x=0;x<16;x++) { - sprintf(t, "%0.2x", ppu.cgram[ptr++]); - ptr &= 0x01ff; - strcat(str, t); - if(x != 15)strcat(str, " "); - } - if(y != 15)strcat(str, "\r\n"); - } - } else if(dmem_mode == DMEMMODE_OAM) { - ptr &= 0x03ff; - for(y=0;y<16;y++) { - sprintf(t, "---%0.3x: ", ptr); - strcat(str, t); - for(x=0;x<16;x++) { - sprintf(t, "%0.2x", oam_read(ptr++)); - ptr &= 0x03ff; - strcat(str, t); - if(x != 15)strcat(str, " "); - } - if(y != 15)strcat(str, "\r\n"); - } - } else if(dmem_mode == DMEMMODE_SPCRAM) { - ptr &= 0xffff; - for(y=0;y<16;y++) { - sprintf(t, "--%0.4x: ", ptr); - strcat(str, t); - for(x=0;x<16;x++) { - sprintf(t, "%0.2x", spc700->ram[ptr++]); - ptr &= 0xffff; - strcat(str, t); - if(x != 15)strcat(str, " "); - } - if(y != 15)strcat(str, "\r\n"); - } - } - - SetDlgItemText(hwndDMEM, DMEM_VIEW, str); -} - -void __mask_mem_ptr(void) { - if(dmem_mode == DMEMMODE_WRAM )debugger.mem_ptr &= 0xffffff; - if(dmem_mode == DMEMMODE_VRAM )debugger.mem_ptr &= 0x00ffff; - if(dmem_mode == DMEMMODE_CGRAM )debugger.mem_ptr &= 0x0001ff; - if(dmem_mode == DMEMMODE_OAM )debugger.mem_ptr &= 0x0003ff; - if(dmem_mode == DMEMMODE_SPCRAM)debugger.mem_ptr &= 0x00ffff; -} - -long __stdcall wndprocDMEM(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { -char str[256]; -ulong pos, val; - if(msg == WM_DESTROY || msg == WM_CLOSE) { - return 0; //don't allow debugger to be closed (yet) - } - - if(emu_state.rom_loaded == false) { - return DefWindowProc(hwnd, msg, wparam, lparam); - } - - if(msg == WM_COMMAND) { - switch(LOWORD(wparam)) { - case DMEM_EDITWRAM: - GetDlgItemText(hwndDMEM, DMEM_EDITLOC, str, 255); - pos = strhex(str); - GetDlgItemText(hwndDMEM, DMEM_EDITVAL, str, 255); - val = strhex(str); - if(dmem_mode == DMEMMODE_WRAM) { - gx816->mem_write(MEMMODE_LONG, MEMSIZE_BYTE, pos & 0xffffff, val, MEMACCESS_DEBUGGER); - } else if(dmem_mode == DMEMMODE_VRAM) { - ppu.vram[pos & 0xffff] = val; - } else if(dmem_mode == DMEMMODE_CGRAM) { - ppu.cgram[pos & 0x01ff] = val; - } else if(dmem_mode == DMEMMODE_OAM) { - oam_write(pos, val); - } else if(dmem_mode == DMEMMODE_SPCRAM) { - spc700->ram[pos & 0xffff] = val; - } - debug_refresh_mem(); - break; - case DMEM_UP40: - debugger.mem_ptr -= 0x40; - debug_refresh_mem(); - __mask_mem_ptr(); - break; - case DMEM_DOWN40: - debugger.mem_ptr += 0x40; - debug_refresh_mem(); - __mask_mem_ptr(); - break; - case DMEM_UP400: - debugger.mem_ptr -= 0x400; - debug_refresh_mem(); - __mask_mem_ptr(); - break; - case DMEM_DOWN400: - debugger.mem_ptr += 0x400; - debug_refresh_mem(); - __mask_mem_ptr(); - break; - case DMEM_UP4000: - debugger.mem_ptr -= 0x4000; - debug_refresh_mem(); - __mask_mem_ptr(); - break; - case DMEM_DOWN4000: - debugger.mem_ptr += 0x4000; - debug_refresh_mem(); - __mask_mem_ptr(); - break; - case DMEM_UP40000: - debugger.mem_ptr -= 0x40000; - debug_refresh_mem(); - __mask_mem_ptr(); - break; - case DMEM_DOWN40000: - debugger.mem_ptr += 0x40000; - debug_refresh_mem(); - __mask_mem_ptr(); - break; - case DMEM_VIEWMODE: - if(HIWORD(wparam) == CBN_SELCHANGE) { - pos = SendDlgItemMessage(hwndDMEM, DMEM_VIEWMODE, CB_GETCURSEL, 0, 0); - if(pos == 0) { - dmem_mode = DMEMMODE_WRAM; - debugger.mem_ptr = 0x7e0000; - } else if(pos == 1) { - dmem_mode = DMEMMODE_WRAM; - if (gx816->map == MEMMAP_LOROM)debugger.mem_ptr = 0x008000; - else if(gx816->map == MEMMAP_HIROM)debugger.mem_ptr = 0xc00000; - } else if(pos == 2) { - dmem_mode = DMEMMODE_WRAM; - if (gx816->map == MEMMAP_LOROM)debugger.mem_ptr = 0x306000; - else if(gx816->map == MEMMAP_HIROM)debugger.mem_ptr = 0x700000; - } else if(pos == 3) { - dmem_mode = DMEMMODE_VRAM; - debugger.mem_ptr = 0x0000; - } else if(pos == 4) { - dmem_mode = DMEMMODE_CGRAM; - debugger.mem_ptr = 0x0000; - } else if(pos == 5) { - dmem_mode = DMEMMODE_OAM; - debugger.mem_ptr = 0x0000; - } else if(pos == 6) { - dmem_mode = DMEMMODE_SPCRAM; - debugger.mem_ptr = 0x0000; - } - debug_refresh_mem(); - } - break; - case DMEM_GOTO: - GetDlgItemText(hwndDMEM, DMEM_GOTOADDR, str, 255); - debugger.mem_ptr = strhex(str); - __mask_mem_ptr(); - debug_refresh_mem(); - break; - } - } - - return DefWindowProc(hwnd, msg, wparam, lparam); -} - -void CreateDMEM(void) { - CreateWindow("COMBOBOX", "", - WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|CBS_HASSTRINGS, - 5, 5, 200, 200, hwndDMEM, (HMENU)DMEM_VIEWMODE, GetModuleHandle(0), 0); - CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "000000", WS_CHILD|WS_VISIBLE, 210, 5, 60, 21, hwndDMEM, (HMENU)DMEM_GOTOADDR, GetModuleHandle(0), 0); - CreateWindow("BUTTON", "Goto", WS_CHILD|WS_VISIBLE, 270, 5, 50, 20, hwndDMEM, (HMENU)DMEM_GOTO, GetModuleHandle(0), 0); - - CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", - WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_READONLY, - 5, 30, 395, 233, hwndDMEM, (HMENU)DMEM_VIEW, GetModuleHandle(0), 0); - - CreateWindow("STATIC", "Offset: Val:", WS_CHILD|WS_VISIBLE, 405, 15, 100, 15, hwndDMEM, (HMENU)DMEM_STATIC1, GetModuleHandle(0), 0); - CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "000000", WS_CHILD|WS_VISIBLE, 405, 30, 60, 23, hwndDMEM, (HMENU)DMEM_EDITLOC, GetModuleHandle(0), 0); - CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "00", WS_CHILD|WS_VISIBLE, 465, 30, 30, 23, hwndDMEM, (HMENU)DMEM_EDITVAL, GetModuleHandle(0), 0); - CreateWindow("BUTTON", "Edit Memory", WS_CHILD|WS_VISIBLE, 405, 55, 90, 20, hwndDMEM, (HMENU)DMEM_EDITWRAM, GetModuleHandle(0), 0); - CreateWindow("BUTTON", "-40", WS_CHILD|WS_VISIBLE, 405, 80, 45, 20, hwndDMEM, (HMENU)DMEM_UP40, GetModuleHandle(0), 0); - CreateWindow("BUTTON", "+40", WS_CHILD|WS_VISIBLE, 450, 80, 45, 20, hwndDMEM, (HMENU)DMEM_DOWN40, GetModuleHandle(0), 0); - CreateWindow("BUTTON", "-400", WS_CHILD|WS_VISIBLE, 405, 100, 45, 20, hwndDMEM, (HMENU)DMEM_UP400, GetModuleHandle(0), 0); - CreateWindow("BUTTON", "+400", WS_CHILD|WS_VISIBLE, 450, 100, 45, 20, hwndDMEM, (HMENU)DMEM_DOWN400, GetModuleHandle(0), 0); - CreateWindow("BUTTON", "-4000", WS_CHILD|WS_VISIBLE, 405, 120, 45, 20, hwndDMEM, (HMENU)DMEM_UP4000, GetModuleHandle(0), 0); - CreateWindow("BUTTON", "+4000", WS_CHILD|WS_VISIBLE, 450, 120, 45, 20, hwndDMEM, (HMENU)DMEM_DOWN4000, GetModuleHandle(0), 0); - CreateWindow("BUTTON", "-40000", WS_CHILD|WS_VISIBLE, 405, 140, 45, 20, hwndDMEM, (HMENU)DMEM_UP40000, GetModuleHandle(0), 0); - CreateWindow("BUTTON", "+40000", WS_CHILD|WS_VISIBLE, 450, 140, 45, 20, hwndDMEM, (HMENU)DMEM_DOWN40000, GetModuleHandle(0), 0); - - SendDlgItemMessage(hwndDMEM, DMEM_VIEWMODE, CB_ADDSTRING, 0, (LPARAM)"DRAM [7e0000-7fffff]"); - SendDlgItemMessage(hwndDMEM, DMEM_VIEWMODE, CB_ADDSTRING, 0, (LPARAM)"ROM [008000/c00000]"); - SendDlgItemMessage(hwndDMEM, DMEM_VIEWMODE, CB_ADDSTRING, 0, (LPARAM)"SRAM [306000/700000]"); - SendDlgItemMessage(hwndDMEM, DMEM_VIEWMODE, CB_ADDSTRING, 0, (LPARAM)"VRAM [0000-ffff]"); - SendDlgItemMessage(hwndDMEM, DMEM_VIEWMODE, CB_ADDSTRING, 0, (LPARAM)"CGRAM [0000-01ff]"); - SendDlgItemMessage(hwndDMEM, DMEM_VIEWMODE, CB_ADDSTRING, 0, (LPARAM)"OAM [0000-03ff]"); - SendDlgItemMessage(hwndDMEM, DMEM_VIEWMODE, CB_ADDSTRING, 0, (LPARAM)"SPCRAM [0000-ffff]"); - SendDlgItemMessage(hwndDMEM, DMEM_VIEWMODE, CB_SETCURSEL, 0, 0); - - SendDlgItemMessage(hwndDMEM, DMEM_GOTOADDR, WM_SETFONT, (WPARAM)hFontFixed, TRUE); - SendDlgItemMessage(hwndDMEM, DMEM_VIEW, WM_SETFONT, (WPARAM)hFontFixed, TRUE); - SendDlgItemMessage(hwndDMEM, DMEM_EDITLOC, WM_SETFONT, (WPARAM)hFontFixed, TRUE); - SendDlgItemMessage(hwndDMEM, DMEM_EDITVAL, WM_SETFONT, (WPARAM)hFontFixed, TRUE); - SendDlgItemMessage(hwndDMEM, DMEM_GOTO, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDMEM, DMEM_STATIC1, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDMEM, DMEM_EDITWRAM, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDMEM, DMEM_UP40, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDMEM, DMEM_DOWN40, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDMEM, DMEM_UP400, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDMEM, DMEM_DOWN400, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDMEM, DMEM_UP4000, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDMEM, DMEM_DOWN4000, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDMEM, DMEM_UP40000, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDMEM, DMEM_DOWN40000, WM_SETFONT, (WPARAM)hFont, TRUE); - SendDlgItemMessage(hwndDMEM, DMEM_VIEWMODE, WM_SETFONT, (WPARAM)hFontFixed, TRUE); -} diff --git a/bsnes/win/render.cpp b/bsnes/win/render.cpp deleted file mode 100644 index c5598d60..00000000 --- a/bsnes/win/render.cpp +++ /dev/null @@ -1,213 +0,0 @@ -#include - -LPDIRECTDRAW lpdd = 0; -LPDIRECTDRAWSURFACE lpdds = 0, lpddsb = 0; -LPDIRECTDRAWCLIPPER lpddc = 0; -DDSURFACEDESC ddsd; -DDSCAPS ddscaps; - -void DestroyDDraw(void) { - if(lpddc) { - lpddc->Release(); - lpddc = 0; - } - if(lpddsb) { - lpddsb->Release(); - lpddsb = 0; - } - if(lpdds) { - lpdds->Release(); - lpdds = 0; - } - if(lpdd) { - lpdd->Release(); - lpdd = 0; - } -} - -void CreateDDraw_Win(void) { - DestroyDDraw(); - - DirectDrawCreate(0, &lpdd, 0); - lpdd->SetCooperativeLevel(hwndMain, DDSCL_NORMAL); - - memset(&ddsd, 0, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - lpdd->CreateSurface(&ddsd, &lpdds, 0); - - lpdd->CreateClipper(0, &lpddc, 0); - lpddc->SetHWnd(0, hwndMain); - lpdds->SetClipper(lpddc); - - memset(&ddsd, 0, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; - ddsd.dwWidth = 512; - ddsd.dwHeight = 478; - lpdd->CreateSurface(&ddsd, &lpddsb, 0); -} - -void CreateDDraw_Full(void) { - DestroyDDraw(); - - DirectDrawCreate(0, &lpdd, 0); - lpdd->SetCooperativeLevel(hwndMain, DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE); - lpdd->SetDisplayMode(640, 480, 16); - - memset(&ddsd, 0, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - lpdd->CreateSurface(&ddsd, &lpdds, 0); - - lpdd->CreateClipper(0, &lpddc, 0); - lpddc->SetHWnd(0, hwndMain); - lpdds->SetClipper(lpddc); - - memset(&ddsd, 0, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; - ddsd.dwWidth = 512; - ddsd.dwHeight = 478; - lpdd->CreateSurface(&ddsd, &lpddsb, 0); -} - -void InitDisplay(void) { - CreateDDraw_Win(); -} - -//size is doubled (mirrored) to prevent having to mask the top unused bit of snes color data -ulong render_color_lookup[65536]; - -void InitColorTable16(void) { -int i, r, g, b; - for(i=0;i<65536;i++) { - r = (i ) & 31; - g = (i >> 5) & 31; - b = (i >> 10) & 31; - render_color_lookup[i] = (r << 11) | (g << 6) | (b); - } -} - -void InitColorTable24(void) { -int i, r, g, b; - for(i=0;i<65536;i++) { - r = (i ) & 31; - g = (i >> 5) & 31; - b = (i >> 10) & 31; - render_color_lookup[i] = (r << 19) | (g << 11) | (b << 3); - } -} - -vfunc RenderScene; - -#include "render_modes.cpp" - -//sets up color table and sets render proc -void CreateColorTable(void) { - lpdds->GetSurfaceDesc(&ddsd); - switch(ddsd.ddpfPixelFormat.dwRGBBitCount) { - case 16: - InitColorTable16(); - RenderScene = RenderScene16; - break; - case 32: - InitColorTable24(); - RenderScene = RenderScene32; - break; - default: - alert("Error: Bit depth [%d] unsupported (supported depths: 16, 32)", ddsd.ddpfPixelFormat.dwRGBBitCount); - exit(0); - break; - } -} - -void DrawScene(void) { -RECT rsrc, rdest; -POINT p; -HRESULT hr; - p.x = p.y = 0; - if(render.fullscreen == true) { - SetRect(&rdest, 0, 0, 512, 448); - OffsetRect(&rdest, (640 - 512) / 2, (480 - 448) / 2); - } else { - ClientToScreen(hwndMain, &p); - GetClientRect(hwndMain, &rdest); - OffsetRect(&rdest, p.x, p.y); - } - - if(ppu.overscan == false) { - SetRect(&rsrc, 0, 2, 512, 448); - } else { - SetRect(&rsrc, 0, 2 + 15, 512, 448 + 15); - } - - hr = lpdds->Blt(&rdest, lpddsb, &rsrc, DDBLT_WAIT, 0); - if(hr == DDERR_SURFACELOST) { - lpdds->Restore(); - lpddsb->Restore(); - } -} - -void UpdateDisplay(void) { - RenderScene(); - DrawScene(); -} - -void video_setmode(bool fullscreen, word width, word height) { -bool prev_mode = render.fullscreen; - if(debug_get_state() != DEBUGMODE_DISABLED)return; - render.fullscreen = fullscreen; - render.display_width = width; - render.display_height = height; - -//remove top scanline that is not rendered - if (height == 224)height = 223; - else if(height == 239)height = 238; - else if(height == 448)height = 446; - else if(height == 478)height = 476; - - FixWindowSize(hwndMain, width, height); - ShowWindow(hwndMain, SW_NORMAL); - - if(prev_mode != fullscreen) { - if(fullscreen == true) { - render.show_menu = false; - UpdateMainWindowStyle(true); - CreateDDraw_Full(); - ShowWindow(hwndMain, SW_NORMAL); - } else { - render.show_menu = true; - UpdateMainWindowStyle(true); - CreateDDraw_Win(); - FixWindowSize(hwndMain, width, height); - ShowWindow(hwndMain, SW_NORMAL); - } - CreateColorTable(); - } -} - -void video_setsnesmode(void) { - if(ppu.bg_mode == 5 || ppu.bg_mode == 6) { - render.snes_width = 512; - } else { - render.snes_width = 256; - } - if(ppu.interlace == false) { - if(ppu.overscan == false) { - render.snes_height = 224; - } else { - render.snes_height = 239; - } - } else { - if(ppu.overscan == false) { - render.snes_height = 448; - } else { - render.snes_height = 478; - } - } -} diff --git a/bsnes/win/render_modes.cpp b/bsnes/win/render_modes.cpp deleted file mode 100644 index 79076e41..00000000 --- a/bsnes/win/render_modes.cpp +++ /dev/null @@ -1,84 +0,0 @@ -void RenderScene16(void) { -HRESULT hr; - hr = lpddsb->Lock(0, &ddsd, DDLOCK_WAIT, 0); - if(hr != DD_OK)return; - __asm { - mov edi,ddsd.lpSurface - mov edx,ddsd.lPitch - add edi,edx - add edi,edx - sub edx,1024 - mov esi,ppu.screen - add esi,2048 - mov ebx,478-2 - xor eax,eax - loop_y: - mov ecx,512 - loop_x: - lodsw - mov eax,dword ptr[render_color_lookup+eax*4] - stosw - dec ecx - jnz loop_x - add edi,edx - dec ebx - jnz loop_y - } -/* -word *screen, *src; -word pitch; -int x, y; - pitch = ddsd.lPitch >> 1; - for(y=2;y<478;y++) { - screen = (word*)ddsd.lpSurface + (pitch * y); - src = (word*)ppu.screen + y * 512; - for(x=0;x<512;x++) { - *screen++ = render_color_lookup[*src++]; - } - } -*/ - lpddsb->Unlock(0); -} - -void RenderScene32(void) { -HRESULT hr; - hr = lpddsb->Lock(0, &ddsd, DDLOCK_WAIT, 0); - if(hr != DD_OK)return; - __asm { - mov edi,ddsd.lpSurface - mov edx,ddsd.lPitch - add edi,edx - add edi,edx - sub edx,2048 - mov esi,ppu.screen - add esi,2048 - mov ebx,478-2 - loop_y: - mov ecx,512 - loop_x: - lodsw - and eax,0xffff - mov eax,dword ptr[render_color_lookup+eax*4] - stosd - dec ecx - jnz loop_x - add edi,edx - dec ebx - jnz loop_y - } -/* -ulong *screen; -word *src; -word pitch; -int x, y; - pitch = ddsd.lPitch >> 2; - for(y=2;y<478;y++) { - screen = (ulong*)ddsd.lpSurface + (pitch * y); - src = (word*)ppu.screen + y * 512; - for(x=0;x<512;x++) { - *screen++ = render_color_lookup[*src++]; - } - } -*/ - lpddsb->Unlock(0); -} diff --git a/bsnes_g2.exe b/bsnes_g2.exe new file mode 100644 index 00000000..02e0cd26 Binary files /dev/null and b/bsnes_g2.exe differ diff --git a/license.txt b/license.txt new file mode 100644 index 00000000..8f1afb6f --- /dev/null +++ b/license.txt @@ -0,0 +1,10 @@ +bsnes Licensing Agreement: + +You are free to redistribute this software, and its source code; provided +there is no charge for the software, nor any charge for the medium used to +distribute the software. You are also free to use and modify the source code +as you desire for personal use only. No publically-released derivative works +of this source code are permitted without my permission. You must also abide +by the terms of any additional source code licenses contained within my code. +At present, this only includes the mode7 renderer, which was derived from the +snes9x mode7 renderer. diff --git a/src/base.h b/src/base.h new file mode 100644 index 00000000..0e35f1c8 --- /dev/null +++ b/src/base.h @@ -0,0 +1,32 @@ +//platform-independant includes +#include +#include +#include + +//typecasts +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned long ulong; + +typedef unsigned char uint8; +typedef unsigned short uint16; +typedef unsigned long uint32; + +typedef signed char int8; +typedef signed short int16; +typedef signed long int32; + +//structs +typedef struct { +uint8 *data; +uint32 size; +}lfile; + +//platform-specific global functions +void *memalloc(uint32 size, char *name = 0, ...); +void memfree(void *mem, char *name = 0, ...); +void alert(char *s, ...); +void dprintf(char *s, ...); + +//various class interfaces +#include "interface.h" diff --git a/src/clock/bclock/bclock.cpp b/src/clock/bclock/bclock.cpp new file mode 100644 index 00000000..b46ccf8f --- /dev/null +++ b/src/clock/bclock/bclock.cpp @@ -0,0 +1,205 @@ +#include "../../base.h" + +void bClock::frameskip_update_status() { + if(frameskip.changed == true) { + frameskip.changed = false; + frameskip.count = frameskip.new_count; + frameskip.pos = 0; + } else { + frameskip.pos++; + frameskip.pos %= (frameskip.count + 1); + } + + frameskip.notify_ppu = (frameskip.pos == 0)?true:false; +} + +void bClock::dram_refresh_test() { + if(cc1.dram_refreshed == false && status.hcycles >= cc1.dram_refresh_pos) { + cc1.dram_refreshed = true; + + if(status.interlace != false || status.interlace_field != 1 || status.vcounter != 240) { + if(cc1.dram_refresh_pos == 534) { + cc1.dram_refresh_pos = 538; + } else { //cc1.dram_refresh_pos == 538 + cc1.dram_refresh_pos = 534; + } + } + + cc1.pos += 40; + cc1.frame_pos += 40; + status.hcycles += 40; + } +} + +/* + all scanlines are 1364 cycles long, except scanline 240 + on non-interlace odd-frames, which is 1360 cycles long. + interlace mode has 525 scanlines: 263 on the even frame, + and 262 on the odd. + non-interlace mode has 524 scanlines: 262 scanlines on + both even and odd frames. + + cycles per frame: + 263 * 1364 = 358732 + 262 * 1364 = 357368 + 262 * 1364 - 4 = 357364 +*/ +void bClock::inc_vcounter() { + status.hcycles -= cc1.line_cycles; + + status.vcounter++; + if(status.vcounter >= cc1.frame_lines) { + frameskip_update_status(); + + cc1.frame_pos -= cc1.frame_cycles; + status.vcounter = 0; + status.interlace_field ^= 1; + if(status.interlace == true) { + if(status.interlace_field == 0) { + cc1.frame_cycles = 263 * 1364; + cc1.frame_lines = 263; + } else { + cc1.frame_cycles = 262 * 1364; + cc1.frame_lines = 262; + } + } else { + if(status.interlace_field == 0) { + cc1.frame_cycles = 262 * 1364; + cc1.frame_lines = 262; + } else { + cc1.frame_cycles = (262 * 1364) - 4; + cc1.frame_lines = 262; + } + } + cc1.render_frame = true; + cpu->frame(); + if(frameskip.notify_ppu == true)ppu->frame(); + } + + if(status.interlace == false && status.interlace_field == 1 && status.vcounter == 240) { + cc1.line_cycles = 1360; + } else { + cc1.line_cycles = 1364; + } + + cc1.dram_refreshed = false; + + cpu->scanline(); + if(frameskip.notify_ppu == true)ppu->scanline(); + +//if(status.vcounter == visible_scanlines()) { +// cc1.render_frame = true; +//} +} + +/* + all dots are 4 cycles long, except dots 322 and 326. dots 322 and 326 + are 6 cycles long. this holds true for all scanlines except scanline + 240 on non-interlace odd frames. the reason for this is because this + scanline is only 1360 cycles long, instead of 1364 like all other + scanlines. + this makes the effective range of hscan_pos 0-339 at all times. + dot 322 range = { 1288, 1290, 1292 } + dot 326 range = { 1306, 1308, 1310 } +*/ +void bClock::sync() { +uint32 new_cycles, cycles; + new_cycles = cc1.pos - cc1.last_pos; + while(new_cycles) { + if(new_cycles > 40) { + cycles = 40; + new_cycles -= 40; + } else { + cycles = new_cycles; + new_cycles = 0; + } + + status.hcycles += cycles; + cc1.frame_pos += cycles; + dram_refresh_test(); + if(status.hcycles >= cc1.line_cycles) { + inc_vcounter(); + } + } + cc1.last_pos = cc1.pos; + + if(cc1.pos > cc1.frequency) { + cc1.pos -= cc1.frequency; + cc1.last_pos -= cc1.frequency; + } + + if(status.interlace == false && status.interlace_field == 1 && status.vcounter == 240) { + status.hcounter = status.hcycles >> 2; + } else { + //1288 = 322 * 4, 1306 = 326 * 4 + 2 + status.hcounter = (status.hcycles - ((status.hcycles > 1288) << 1) - ((status.hcycles > 1306) << 1)) >> 2; + } +} + +void bClock::set_frameskip(uint8 fs) { + frameskip.changed = true; + frameskip.new_count = fs; +} + +bool bClock::update_frame() { + if(cc1.render_frame == true) { + cc1.render_frame = false; + return true; + } + return false; +} + +void bClock::power() { + reset(); +} + +void bClock::reset() { + cc1.render_frame = false; + +//upon SNES reset, start at scanline 0 non-interlace + cc1.frame_cycles = 262 * 1364; + cc1.frame_lines = 262; + cc1.line_cycles = 1364; + +/* + Initial latch values for $213c/$213d + 0035:0000 (53.0 -> 212) [lda $2137] + 0038:0000 (56.5 -> 226) [nop : lda $2137] +*/ + cc1.pos = 188; + cc1.last_pos = 0; + cc1.frame_pos = 0; + status.vcounter = 0; + status.hcounter = 0; + status.hcycles = 0; + + cc1.dram_refresh_pos = 538; + cc1.dram_refreshed = false; + + cc2.pos = 0; + + sync(); +} + +void bClock::run() { + cpu->run(); + if(frameskip.notify_ppu == true)ppu->run(); + sync(); +} + +void bClock::add_cc1_cycles(uint32 cycles) { + cc1.pos += cycles; +} + +void bClock::add_cc2_cycles(uint32 cycles) { + cc2.pos += cycles; +} + +bClock::bClock() { + cc1.frequency = 21477272; + cc2.frequency = 24576000; + + frameskip.changed = false; + frameskip.count = 0; + frameskip.pos = 0; +} diff --git a/src/clock/bclock/bclock.h b/src/clock/bclock/bclock.h new file mode 100644 index 00000000..befb6448 --- /dev/null +++ b/src/clock/bclock/bclock.h @@ -0,0 +1,39 @@ +class bClock : public Clock { +private: +struct { +bool changed, notify_ppu; +uint8 count, new_count, pos; +}frameskip; + void frameskip_update_status(); + void inc_vcounter(); + void dram_refresh_test(); + +public: + struct { + uint32 frequency; + uint32 pos, last_pos; + uint32 frame_cycles, frame_lines, frame_pos; + uint16 line_cycles; + bool dram_refreshed; //whether or not dram has been refreshed on this line + uint16 dram_refresh_pos; + + bool render_frame; + }cc1; + struct { + uint32 frequency; + uint32 pos, last_pos; + }cc2; + + void set_frameskip(uint8 fs); + bool update_frame(); + + void add_cc1_cycles(uint32 cycles); + void add_cc2_cycles(uint32 cycles); + void sync(); + void run(); + void power(); + void reset(); + + bClock(); + ~bClock(); +}; diff --git a/src/clock/clock.cpp b/src/clock/clock.cpp new file mode 100644 index 00000000..5bfc6823 --- /dev/null +++ b/src/clock/clock.cpp @@ -0,0 +1,49 @@ +#include "../base.h" + +void Clock::enable_overscan(bool n) { + status.overscan = n; +} + +void Clock::enable_interlace(bool n) { + status.interlace = n; +} + +bool Clock::overscan() { + return status.overscan; +} + +bool Clock::interlace() { + return status.interlace; +} + +bool Clock::interlace_field() { + return status.interlace_field; +} + +uint16 Clock::vcounter() { + return status.vcounter; +} + +uint16 Clock::hcounter() { + return status.hcounter; +} + +uint16 Clock::hcycles() { + return status.hcycles; +} + +uint16 Clock::visible_scanlines() { + return (status.overscan)?239:224; +} + +void Clock::set_frameskip(uint8 fs) {} + +Clock::Clock() { + status.overscan = false; + status.interlace = false; + status.interlace_field = 0; + + status.vcounter = 0; + status.hcounter = 0; + status.hcycles = 0; +} diff --git a/src/clock/clock.h b/src/clock/clock.h new file mode 100644 index 00000000..551a1eb1 --- /dev/null +++ b/src/clock/clock.h @@ -0,0 +1,37 @@ +class Clock { +private: +struct { + bool overscan; + bool interlace; + bool interlace_field; + + uint16 vcounter; + uint16 hcounter; + uint16 hcycles; +}status; + +public: + virtual void enable_overscan(bool n); + virtual void enable_interlace(bool n); + virtual bool overscan(); + virtual bool interlace(); + virtual bool interlace_field(); + virtual uint16 vcounter(); + virtual uint16 hcounter(); + virtual uint16 hcycles(); + virtual uint16 visible_scanlines(); + + virtual void set_frameskip(uint8 fs); + virtual bool update_frame() = 0; + + virtual void add_cc1_cycles(uint32 cycles) = 0; + virtual void add_cc2_cycles(uint32 cycles) = 0; + virtual void sync() = 0; + virtual void run() = 0; + virtual void power() = 0; + virtual void reset() = 0; + + Clock(); + + friend class bClock; +}; diff --git a/src/cpu/bcpu/bcpu.cpp b/src/cpu/bcpu/bcpu.cpp new file mode 100644 index 00000000..bc9d9c0d --- /dev/null +++ b/src/cpu/bcpu/bcpu.cpp @@ -0,0 +1,298 @@ +#include "../../base.h" + +#include "bcpu_op_adc.cpp" +#include "bcpu_op_and.cpp" +#include "bcpu_op_cmp.cpp" +#include "bcpu_op_eor.cpp" +#include "bcpu_op_incdec.cpp" +#include "bcpu_op_lda.cpp" +#include "bcpu_op_misc.cpp" +#include "bcpu_op_ora.cpp" +#include "bcpu_op_pc.cpp" +#include "bcpu_op_sbc.cpp" +#include "bcpu_op_shift.cpp" +#include "bcpu_op_sta.cpp" +#include "bcpu_op_stack.cpp" +#include "bcpu_exec.cpp" +#include "bcpu_mmio.cpp" + +uint8 bCPU::pio_status() { + return status.pio; +} + +/*********** + *** IRQ *** + *********** +cycles: + [1] pbr,pc ; io + [2] pbr,pc ; io + [3] 0,s ; pbr + [4] 0,s-1 ; pch + [5] 0,s-2 ; pcl + [6] 0,s-3 ; p + [7] 0,va ; aavl + [8] 0,va+1 ; aavh +*/ +void bCPU::irq(uint16 addr) { + if(cpustate == CPUSTATE_WAI) { + regs.pc.w++; + cpustate = CPUSTATE_RUN; + } + + clock->add_cc1_cycles(mem_bus->speed(regs.pc)); //1 + clock->add_cc1_cycles(6); //2 + stack_write(regs.pc.b); //3 + stack_write(regs.pc.h); //4 + stack_write(regs.pc.l); //5 + stack_write(regs.p); //6 + rd.l = op_read(OPMODE_ADDR, addr); //7 + rd.h = op_read(OPMODE_ADDR, addr + 1); //8 + regs.pc.b = 0x00; + regs.pc.w = rd.w; + + regs.p.d = 0; + regs.p.i = 1; + + snes->notify(SNES::CPU_EXEC_OPCODE); +} + +void bCPU::run() { +uint16 v, h, hc, vs; + switch(cpustate) { + case CPUSTATE_RUN: + case CPUSTATE_WAI: + v = clock->vcounter(); + h = clock->hcounter(); + hc = clock->hcycles(); + vs = clock->visible_scanlines(); + + //NMI test + if(v >= (vs + 1) && status.nmi_triggered == false) { + if((v == (vs + 1) && hc >= 12) || (v >= (vs + 1))) { + status.nmi_triggered = true; + status.nmi_pin = 0; + if(status.nmi_enabled == true) { + irq(0xffea); + return; + } + } + } + + //IRQ test + if(!regs.p.i) { + if(status.virq_enabled == true && status.virq_enabled == true) { + if(v == status.virq_pos && h >= status.hirq_pos && status.irq_pin == 1) { + status.irq_triggered = true; + status.irq_pin = 0; + irq(0xffee); + return; + } + } else if(status.virq_enabled == true) { + if(v == status.virq_pos && status.irq_pin == 1) { + status.irq_triggered = true; + status.irq_pin = 0; + irq(0xffee); + return; + } + } else if(status.hirq_enabled == true) { + if(h >= status.hirq_pos && status.irq_pin == 1) { + status.irq_triggered = true; + status.irq_pin = 0; + irq(0xffee); + return; + } + } + } + + //HDMA test + if(v < vs && h >= 278 && dma->hdma_triggered == false) { + dma->hdma_run(); + dma->hdma_triggered = true; + } + + exec_opcode(); + break; + case CPUSTATE_DMA: + dma->run(); + break; + case CPUSTATE_STP: + exec_opcode(); + break; + } +} + +void bCPU::scanline() { +uint16 v = clock->vcounter(); + if(v == 225 && status.auto_joypad_poll == true) { + snes->poll_input(); + } + if(status.virq_enabled == false) { + status.irq_pin = 1; + } + dma->hdma_triggered = false; +} + +void bCPU::frame() { + status.nmi_triggered = false; + status.r4210_read = false; + + status.irq_pin = 1; + + dma->hdma_initialize(); +} + +void bCPU::power() { + regs.a = regs.x = regs.y = 0x0000; + regs.s = 0x01ff; + reset(); +} + +void bCPU::reset() { +/* reset vector location */ + regs.pc = mem_bus->read(0xfffc) | (mem_bus->read(0xfffd) << 8); + +/* registers are not fully reset by SNES */ + regs.x.h = 0x00; + regs.y.h = 0x00; + regs.s.h = 0x01; + regs.d = 0x0000; + regs.db = 0x00; + regs.p = 0x34; + regs.e = 1; + + cpustate = CPUSTATE_RUN; + + dma->reset(); + mmio_reset(); + + status.nmi_triggered = false; + status.nmi_pin = 1; + status.r4210_read = false; + + status.irq_triggered = false; + status.irq_pin = 1; +} + +void bCPU::cpu_c2() { + if(regs.d.l != 0x00) { + clock->add_cc1_cycles(6); + } +} + +void bCPU::cpu_c4(uint16 a, uint16 b) { + if(((a & 0xff00) != (b & 0xff00)) || !regs.p.x) { + clock->add_cc1_cycles(6); + } +} + +void bCPU::cpu_c6(uint16 a) { + if(regs.e) { + if((regs.pc.w & 0xff00) != (a & 0xff00)) { + clock->add_cc1_cycles(6); + } + } +} + +void bCPU::cpu_io() { + clock->add_cc1_cycles(6); +} + +uint8 bCPU::op_read() { +uint8 r; + r = mem_bus->read(regs.pc); + clock->add_cc1_cycles(mem_bus->speed(regs.pc)); + regs.pc.w++; + return r; +} + +uint8 bCPU::op_read(uint8 mode, uint32 addr) { +uint8 r; + switch(mode) { + case OPMODE_ADDR: + addr &= 0xffff; + break; + case OPMODE_LONG: + addr &= 0xffffff; + break; + case OPMODE_DBR: + addr &= 0xffffff; + addr = (regs.db << 16) + addr; + break; + case OPMODE_PBR: + addr &= 0xffff; + addr = (regs.pc.b << 16) | addr; + break; + case OPMODE_DP: + addr &= 0xffff; + addr = (regs.d + addr) & 0xffff; + break; + case OPMODE_SP: + addr &= 0xffff; + addr = (regs.s + addr) & 0xffff; + break; + } + r = mem_bus->read(addr); + clock->add_cc1_cycles(mem_bus->speed(addr)); + return r; +} + +void bCPU::op_write(uint8 mode, uint32 addr, uint8 value) { + switch(mode) { + case OPMODE_ADDR: + addr &= 0xffff; + break; + case OPMODE_LONG: + addr &= 0xffffff; + break; + case OPMODE_DBR: + addr &= 0xffffff; + addr = (regs.db << 16) + addr; + break; + case OPMODE_PBR: + addr &= 0xffff; + addr = (regs.pc.b << 16) | addr; + break; + case OPMODE_DP: + addr &= 0xffff; + addr = (regs.d + addr) & 0xffff; + break; + case OPMODE_SP: + addr &= 0xffff; + addr = (regs.s + addr) & 0xffff; + break; + } + mem_bus->write(addr, value); + clock->add_cc1_cycles(mem_bus->speed(addr)); +} + +uint8 bCPU::stack_read() { +byte r; + if(regs.e) { + regs.s.l++; + } else { + regs.s.w++; + } + r = mem_bus->read(regs.s); + clock->add_cc1_cycles(mem_bus->speed(regs.s)); + return r; +} + +void bCPU::stack_write(uint8 value) { + mem_bus->write(regs.s, value); + clock->add_cc1_cycles(mem_bus->speed(regs.s)); + if(regs.e) { + regs.s.l--; + } else { + regs.s.w--; + } +} + +bCPU::bCPU() { + dma = new bDMA(this); + mmio = new bCPUMMIO(this); +} + +bCPU::~bCPU() { + delete(mmio); + delete(dma); +} diff --git a/src/cpu/bcpu/bcpu.h b/src/cpu/bcpu/bcpu.h new file mode 100644 index 00000000..bb66f18b --- /dev/null +++ b/src/cpu/bcpu/bcpu.h @@ -0,0 +1,880 @@ +class bCPU; + +class bDMA { +public: +bCPU *cpu; +struct { +//$420b + bool active; +//$420c + bool hdma_active; +//$43x0 + bool direction; + bool hdma_indirect; + int8 incmode; + bool fixedxfer; + uint8 xfermode; +//$43x1 + uint8 destaddr; +//$43x2-$43x4 + uint32 srcaddr; +//$43x5-$43x6 + uint16 xfersize; +//$43x7 + uint8 hdma_indirect_bank; + +//hdma-specific + bool hdma_first_line; + bool hdma_repeat; + uint16 hdma_line_counter; + uint32 hdma_address, hdma_iaddress; + bool hdma_completed; +}channel[8]; +bool hdma_triggered; + + void hdma_write(uint8 i, uint8 l, uint8 x); + void hdma_run(); + void hdma_initialize(); + void run(); + void reset(); + uint16 dma_cputommio(uint8 i, uint8 index); + uint16 dma_mmiotocpu(uint8 i, uint8 index); + void dma_xfer_type0(uint8 i); + void dma_xfer_type1(uint8 i); + void dma_xfer_type2(uint8 i); + void dma_xfer_type3(uint8 i); + void dma_xfer_type4(uint8 i); + void dma_xfer_type5(uint8 i); + + bDMA(bCPU *_cpu); +}; + +class bCPUMMIO : public MMIO { +public: +bCPU *cpu; + uint8 read (uint32 addr); + void write(uint32 addr, uint8 value); + bCPUMMIO(bCPU *_cpu); +}; + +class bCPU : public CPU { +public: +enum { CPUSTATE_RUN = 0, CPUSTATE_DMA, CPUSTATE_WAI, CPUSTATE_STP }; +uint8 cpustate; + +bDMA *dma; + enum { + OPMODE_ADDR = 1, OPMODE_LONG = 2, + OPMODE_DBR = 3, OPMODE_PBR = 4, + OPMODE_DP = 5, OPMODE_SP = 6 + }; +CPUReg24 aa, rd; +uint8 dp, sp; + +struct { + bool nmi_triggered; + bool nmi_pin; + bool r4210_read; + + bool irq_triggered; + bool irq_pin; + +//$2181-$2183 + uint32 wram_addr; + +//$4016 + uint8 joypad1_strobe_value; + uint8 joypad1_read_pos; + +//$4200 + bool nmi_enabled; + bool hirq_enabled, virq_enabled; + bool auto_joypad_poll; + +//$4201 + uint8 pio; + +//$4202-$4203 + uint8 mul_a, mul_b; + +//$4204-$4206 + uint16 div_a; + uint8 div_b; + +//$4207-$420a + uint16 hirq_pos, virq_pos; + +//$4214-$4216 + uint16 r4214; + uint16 r4216; +}status; + + uint8 pio_status(); + void irq(uint16 addr); + void run(); + void scanline(); + void frame(); + void power(); + void reset(); + +//mmio commands + void mmio_reset(); + uint8 mmio_r2180(); + uint8 mmio_r21c2(); + uint8 mmio_r21c3(); + uint8 mmio_r4016(); + uint8 mmio_r4210(); + uint8 mmio_r4211(); + uint8 mmio_r4212(); + uint8 mmio_r4213(); + uint8 mmio_r4214(); + uint8 mmio_r4215(); + uint8 mmio_r4216(); + uint8 mmio_r4217(); + uint8 mmio_r4218(); + uint8 mmio_r4219(); + void mmio_w2180(uint8 value); + void mmio_w2181(uint8 value); + void mmio_w2182(uint8 value); + void mmio_w2183(uint8 value); + void mmio_w4016(uint8 value); + void mmio_w4200(uint8 value); + void mmio_w4201(uint8 value); + void mmio_w4202(uint8 value); + void mmio_w4203(uint8 value); + void mmio_w4204(uint8 value); + void mmio_w4205(uint8 value); + void mmio_w4206(uint8 value); + void mmio_w4207(uint8 value); + void mmio_w4208(uint8 value); + void mmio_w4209(uint8 value); + void mmio_w420a(uint8 value); + void mmio_w420b(uint8 value); + void mmio_w420c(uint8 value); + void mmio_w420d(uint8 value); + void mmio_w43x0(uint8 value, uint8 i); + void mmio_w43x1(uint8 value, uint8 i); + void mmio_w43x2(uint8 value, uint8 i); + void mmio_w43x3(uint8 value, uint8 i); + void mmio_w43x4(uint8 value, uint8 i); + void mmio_w43x5(uint8 value, uint8 i); + void mmio_w43x6(uint8 value, uint8 i); + void mmio_w43x7(uint8 value, uint8 i); + + void exec_opcode(); + + uint8 op_read (); + uint8 op_read (uint8 mode, uint32 addr); + void op_write(uint8 mode, uint32 addr, uint8 value); + uint8 stack_read (); + void stack_write(uint8 value); + +//cpu extra-cycle conditions + void cpu_c2(); + void cpu_c4(uint16 a, uint16 b); + void cpu_c6(uint16 a); + void cpu_io(); + +//op_adc + void flags_adc_b(); + void flags_adc_w(); + void op_adc_constb(); + void op_adc_constw(); + void op_adc_const(); + void op_adc_addrb(); + void op_adc_addrw(); + void op_adc_addr(); + void op_adc_addrxb(); + void op_adc_addrxw(); + void op_adc_addrx(); + void op_adc_dpb(); + void op_adc_dpw(); + void op_adc_dp(); + void op_adc_idpb(); + void op_adc_idpw(); + void op_adc_idp(); + void op_adc_ildpb(); + void op_adc_ildpw(); + void op_adc_ildp(); + void op_adc_longb(); + void op_adc_longw(); + void op_adc_long(); + void op_adc_longxb(); + void op_adc_longxw(); + void op_adc_longx(); + void op_adc_addryb(); + void op_adc_addryw(); + void op_adc_addry(); + void op_adc_dpxb(); + void op_adc_dpxw(); + void op_adc_dpx(); + void op_adc_idpxb(); + void op_adc_idpxw(); + void op_adc_idpx(); + void op_adc_idpyb(); + void op_adc_idpyw(); + void op_adc_idpy(); + void op_adc_ildpyb(); + void op_adc_ildpyw(); + void op_adc_ildpy(); + void op_adc_srb(); + void op_adc_srw(); + void op_adc_sr(); + void op_adc_isryb(); + void op_adc_isryw(); + void op_adc_isry(); +//op_and + void flags_and_b(); + void flags_and_w(); + void op_and_constb(); + void op_and_constw(); + void op_and_const(); + void op_and_addrb(); + void op_and_addrw(); + void op_and_addr(); + void op_and_addrxb(); + void op_and_addrxw(); + void op_and_addrx(); + void op_and_dpb(); + void op_and_dpw(); + void op_and_dp(); + void op_and_idpb(); + void op_and_idpw(); + void op_and_idp(); + void op_and_ildpb(); + void op_and_ildpw(); + void op_and_ildp(); + void op_and_longb(); + void op_and_longw(); + void op_and_long(); + void op_and_longxb(); + void op_and_longxw(); + void op_and_longx(); + void op_and_addryb(); + void op_and_addryw(); + void op_and_addry(); + void op_and_dpxb(); + void op_and_dpxw(); + void op_and_dpx(); + void op_and_idpxb(); + void op_and_idpxw(); + void op_and_idpx(); + void op_and_idpyb(); + void op_and_idpyw(); + void op_and_idpy(); + void op_and_ildpyb(); + void op_and_ildpyw(); + void op_and_ildpy(); + void op_and_srb(); + void op_and_srw(); + void op_and_sr(); + void op_and_isryb(); + void op_and_isryw(); + void op_and_isry(); +//op_cmp + void flags_cmp_b(); + void flags_cmp_w(); + void op_cmp_constb(); + void op_cmp_constw(); + void op_cmp_const(); + void op_cmp_addrb(); + void op_cmp_addrw(); + void op_cmp_addr(); + void op_cmp_addrxb(); + void op_cmp_addrxw(); + void op_cmp_addrx(); + void op_cmp_dpb(); + void op_cmp_dpw(); + void op_cmp_dp(); + void op_cmp_idpb(); + void op_cmp_idpw(); + void op_cmp_idp(); + void op_cmp_ildpb(); + void op_cmp_ildpw(); + void op_cmp_ildp(); + void op_cmp_longb(); + void op_cmp_longw(); + void op_cmp_long(); + void op_cmp_longxb(); + void op_cmp_longxw(); + void op_cmp_longx(); + void op_cmp_addryb(); + void op_cmp_addryw(); + void op_cmp_addry(); + void op_cmp_dpxb(); + void op_cmp_dpxw(); + void op_cmp_dpx(); + void op_cmp_idpxb(); + void op_cmp_idpxw(); + void op_cmp_idpx(); + void op_cmp_idpyb(); + void op_cmp_idpyw(); + void op_cmp_idpy(); + void op_cmp_ildpyb(); + void op_cmp_ildpyw(); + void op_cmp_ildpy(); + void op_cmp_srb(); + void op_cmp_srw(); + void op_cmp_sr(); + void op_cmp_isryb(); + void op_cmp_isryw(); + void op_cmp_isry(); +//op_eor + void flags_eor_b(); + void flags_eor_w(); + void op_eor_constb(); + void op_eor_constw(); + void op_eor_const(); + void op_eor_addrb(); + void op_eor_addrw(); + void op_eor_addr(); + void op_eor_addrxb(); + void op_eor_addrxw(); + void op_eor_addrx(); + void op_eor_dpb(); + void op_eor_dpw(); + void op_eor_dp(); + void op_eor_idpb(); + void op_eor_idpw(); + void op_eor_idp(); + void op_eor_ildpb(); + void op_eor_ildpw(); + void op_eor_ildp(); + void op_eor_longb(); + void op_eor_longw(); + void op_eor_long(); + void op_eor_longxb(); + void op_eor_longxw(); + void op_eor_longx(); + void op_eor_addryb(); + void op_eor_addryw(); + void op_eor_addry(); + void op_eor_dpxb(); + void op_eor_dpxw(); + void op_eor_dpx(); + void op_eor_idpxb(); + void op_eor_idpxw(); + void op_eor_idpx(); + void op_eor_idpyb(); + void op_eor_idpyw(); + void op_eor_idpy(); + void op_eor_ildpyb(); + void op_eor_ildpyw(); + void op_eor_ildpy(); + void op_eor_srb(); + void op_eor_srw(); + void op_eor_sr(); + void op_eor_isryb(); + void op_eor_isryw(); + void op_eor_isry(); +//op_incdec + void op_incb(); + void op_incw(); + void op_inc(); + void op_inc_addrb(); + void op_inc_addrw(); + void op_inc_addr(); + void op_inc_addrxb(); + void op_inc_addrxw(); + void op_inc_addrx(); + void op_inc_dpb(); + void op_inc_dpw(); + void op_inc_dp(); + void op_inc_dpxb(); + void op_inc_dpxw(); + void op_inc_dpx(); + void op_inxb(); + void op_inxw(); + void op_inx(); + void op_inyb(); + void op_inyw(); + void op_iny(); + void op_decb(); + void op_decw(); + void op_dec(); + void op_dec_addrb(); + void op_dec_addrw(); + void op_dec_addr(); + void op_dec_addrxb(); + void op_dec_addrxw(); + void op_dec_addrx(); + void op_dec_dpb(); + void op_dec_dpw(); + void op_dec_dp(); + void op_dec_dpxb(); + void op_dec_dpxw(); + void op_dec_dpx(); + void op_dexb(); + void op_dexw(); + void op_dex(); + void op_deyb(); + void op_deyw(); + void op_dey(); +//op_lda + void flags_lda_b(); + void flags_lda_w(); + void op_lda_constb(); + void op_lda_constw(); + void op_lda_const(); + void op_lda_addrb(); + void op_lda_addrw(); + void op_lda_addr(); + void op_lda_addrxb(); + void op_lda_addrxw(); + void op_lda_addrx(); + void op_lda_dpb(); + void op_lda_dpw(); + void op_lda_dp(); + void op_lda_idpb(); + void op_lda_idpw(); + void op_lda_idp(); + void op_lda_ildpb(); + void op_lda_ildpw(); + void op_lda_ildp(); + void op_lda_longb(); + void op_lda_longw(); + void op_lda_long(); + void op_lda_longxb(); + void op_lda_longxw(); + void op_lda_longx(); + void op_lda_addryb(); + void op_lda_addryw(); + void op_lda_addry(); + void op_lda_dpxb(); + void op_lda_dpxw(); + void op_lda_dpx(); + void op_lda_idpxb(); + void op_lda_idpxw(); + void op_lda_idpx(); + void op_lda_idpyb(); + void op_lda_idpyw(); + void op_lda_idpy(); + void op_lda_ildpyb(); + void op_lda_ildpyw(); + void op_lda_ildpy(); + void op_lda_srb(); + void op_lda_srw(); + void op_lda_sr(); + void op_lda_isryb(); + void op_lda_isryw(); + void op_lda_isry(); +//op_misc + void flags_bit_b(); + void flags_bit_w(); + void op_bit_constb(); + void op_bit_constw(); + void op_bit_const(); + void op_bit_addrb(); + void op_bit_addrw(); + void op_bit_addr(); + void op_bit_addrxb(); + void op_bit_addrxw(); + void op_bit_addrx(); + void op_bit_dpb(); + void op_bit_dpw(); + void op_bit_dp(); + void op_bit_dpxb(); + void op_bit_dpxw(); + void op_bit_dpx(); + void flags_cpx_b(); + void flags_cpx_w(); + void op_cpx_constb(); + void op_cpx_constw(); + void op_cpx_const(); + void op_cpx_addrb(); + void op_cpx_addrw(); + void op_cpx_addr(); + void op_cpx_dpb(); + void op_cpx_dpw(); + void op_cpx_dp(); + void flags_cpy_b(); + void flags_cpy_w(); + void op_cpy_constb(); + void op_cpy_constw(); + void op_cpy_const(); + void op_cpy_addrb(); + void op_cpy_addrw(); + void op_cpy_addr(); + void op_cpy_dpb(); + void op_cpy_dpw(); + void op_cpy_dp(); + void flags_ldx_b(); + void flags_ldx_w(); + void op_ldx_constb(); + void op_ldx_constw(); + void op_ldx_const(); + void op_ldx_addrb(); + void op_ldx_addrw(); + void op_ldx_addr(); + void op_ldx_addryb(); + void op_ldx_addryw(); + void op_ldx_addry(); + void op_ldx_dpb(); + void op_ldx_dpw(); + void op_ldx_dp(); + void op_ldx_dpyb(); + void op_ldx_dpyw(); + void op_ldx_dpy(); + void flags_ldy_b(); + void flags_ldy_w(); + void op_ldy_constb(); + void op_ldy_constw(); + void op_ldy_const(); + void op_ldy_addrb(); + void op_ldy_addrw(); + void op_ldy_addr(); + void op_ldy_addrxb(); + void op_ldy_addrxw(); + void op_ldy_addrx(); + void op_ldy_dpb(); + void op_ldy_dpw(); + void op_ldy_dp(); + void op_ldy_dpxb(); + void op_ldy_dpxw(); + void op_ldy_dpx(); + void op_stx_addrb(); + void op_stx_addrw(); + void op_stx_addr(); + void op_stx_dpb(); + void op_stx_dpw(); + void op_stx_dp(); + void op_stx_dpyb(); + void op_stx_dpyw(); + void op_stx_dpy(); + void op_sty_addrb(); + void op_sty_addrw(); + void op_sty_addr(); + void op_sty_dpb(); + void op_sty_dpw(); + void op_sty_dp(); + void op_sty_dpxb(); + void op_sty_dpxw(); + void op_sty_dpx(); + void op_stz_addrb(); + void op_stz_addrw(); + void op_stz_addr(); + void op_stz_addrxb(); + void op_stz_addrxw(); + void op_stz_addrx(); + void op_stz_dpb(); + void op_stz_dpw(); + void op_stz_dp(); + void op_stz_dpxb(); + void op_stz_dpxw(); + void op_stz_dpx(); + void op_xba(); + void op_trb_addrb(); + void op_trb_addrw(); + void op_trb_addr(); + void op_trb_dpb(); + void op_trb_dpw(); + void op_trb_dp(); + void op_tsb_addrb(); + void op_tsb_addrw(); + void op_tsb_addr(); + void op_tsb_dpb(); + void op_tsb_dpw(); + void op_tsb_dp(); + void op_mvn(); + void op_mvp(); + void op_brk(); + void op_cop(); + void op_stp(); + void op_wai(); + void op_xce(); + void op_nop(); + void op_wdm(); + void op_clc(); + void op_cld(); + void op_cli(); + void op_clv(); + void op_sec(); + void op_sed(); + void op_sei(); + void op_rep(); + void op_sep(); + void op_taxb(); + void op_taxw(); + void op_tax(); + void op_tayb(); + void op_tayw(); + void op_tay(); + void op_tcd(); + void op_tcs(); + void op_tdc(); + void op_tsc(); + void op_tsxb(); + void op_tsxw(); + void op_tsx(); + void op_txab(); + void op_txaw(); + void op_txa(); + void op_txsb(); + void op_txsw(); + void op_txs(); + void op_txyb(); + void op_txyw(); + void op_txy(); + void op_tyab(); + void op_tyaw(); + void op_tya(); + void op_tyxb(); + void op_tyxw(); + void op_tyx(); +//op_ora + void flags_ora_b(); + void flags_ora_w(); + void op_ora_constb(); + void op_ora_constw(); + void op_ora_const(); + void op_ora_addrb(); + void op_ora_addrw(); + void op_ora_addr(); + void op_ora_addrxb(); + void op_ora_addrxw(); + void op_ora_addrx(); + void op_ora_dpb(); + void op_ora_dpw(); + void op_ora_dp(); + void op_ora_idpb(); + void op_ora_idpw(); + void op_ora_idp(); + void op_ora_ildpb(); + void op_ora_ildpw(); + void op_ora_ildp(); + void op_ora_longb(); + void op_ora_longw(); + void op_ora_long(); + void op_ora_longxb(); + void op_ora_longxw(); + void op_ora_longx(); + void op_ora_addryb(); + void op_ora_addryw(); + void op_ora_addry(); + void op_ora_dpxb(); + void op_ora_dpxw(); + void op_ora_dpx(); + void op_ora_idpxb(); + void op_ora_idpxw(); + void op_ora_idpx(); + void op_ora_idpyb(); + void op_ora_idpyw(); + void op_ora_idpy(); + void op_ora_ildpyb(); + void op_ora_ildpyw(); + void op_ora_ildpy(); + void op_ora_srb(); + void op_ora_srw(); + void op_ora_sr(); + void op_ora_isryb(); + void op_ora_isryw(); + void op_ora_isry(); +//op_pc + void op_jmp_addr(); + void op_jmp_long(); + void op_jmp_iaddr(); + void op_jmp_iaddrx(); + void op_jmp_iladdr(); + void op_jsr_addr(); + void op_jsr_long(); + void op_jsr_iaddrx(); + void op_rtie(); + void op_rtin(); + void op_rti(); + void op_rts(); + void op_rtl(); + void op_bra(); + void op_brl(); + void op_bcc(); + void op_bcs(); + void op_bne(); + void op_beq(); + void op_bpl(); + void op_bmi(); + void op_bvc(); + void op_bvs(); +//op_sbc + void flags_sbc_b(); + void flags_sbc_w(); + void op_sbc_constb(); + void op_sbc_constw(); + void op_sbc_const(); + void op_sbc_addrb(); + void op_sbc_addrw(); + void op_sbc_addr(); + void op_sbc_addrxb(); + void op_sbc_addrxw(); + void op_sbc_addrx(); + void op_sbc_dpb(); + void op_sbc_dpw(); + void op_sbc_dp(); + void op_sbc_idpb(); + void op_sbc_idpw(); + void op_sbc_idp(); + void op_sbc_ildpb(); + void op_sbc_ildpw(); + void op_sbc_ildp(); + void op_sbc_longb(); + void op_sbc_longw(); + void op_sbc_long(); + void op_sbc_longxb(); + void op_sbc_longxw(); + void op_sbc_longx(); + void op_sbc_addryb(); + void op_sbc_addryw(); + void op_sbc_addry(); + void op_sbc_dpxb(); + void op_sbc_dpxw(); + void op_sbc_dpx(); + void op_sbc_idpxb(); + void op_sbc_idpxw(); + void op_sbc_idpx(); + void op_sbc_idpyb(); + void op_sbc_idpyw(); + void op_sbc_idpy(); + void op_sbc_ildpyb(); + void op_sbc_ildpyw(); + void op_sbc_ildpy(); + void op_sbc_srb(); + void op_sbc_srw(); + void op_sbc_sr(); + void op_sbc_isryb(); + void op_sbc_isryw(); + void op_sbc_isry(); +//op_shift + void op_aslb(); + void op_aslw(); + void op_asl(); + void op_asl_addrb(); + void op_asl_addrw(); + void op_asl_addr(); + void op_asl_addrxb(); + void op_asl_addrxw(); + void op_asl_addrx(); + void op_asl_dpb(); + void op_asl_dpw(); + void op_asl_dp(); + void op_asl_dpxb(); + void op_asl_dpxw(); + void op_asl_dpx(); + void op_lsrb(); + void op_lsrw(); + void op_lsr(); + void op_lsr_addrb(); + void op_lsr_addrw(); + void op_lsr_addr(); + void op_lsr_addrxb(); + void op_lsr_addrxw(); + void op_lsr_addrx(); + void op_lsr_dpb(); + void op_lsr_dpw(); + void op_lsr_dp(); + void op_lsr_dpxb(); + void op_lsr_dpxw(); + void op_lsr_dpx(); + void op_rolb(); + void op_rolw(); + void op_rol(); + void op_rol_addrb(); + void op_rol_addrw(); + void op_rol_addr(); + void op_rol_addrxb(); + void op_rol_addrxw(); + void op_rol_addrx(); + void op_rol_dpb(); + void op_rol_dpw(); + void op_rol_dp(); + void op_rol_dpxb(); + void op_rol_dpxw(); + void op_rol_dpx(); + void op_rorb(); + void op_rorw(); + void op_ror(); + void op_ror_addrb(); + void op_ror_addrw(); + void op_ror_addr(); + void op_ror_addrxb(); + void op_ror_addrxw(); + void op_ror_addrx(); + void op_ror_dpb(); + void op_ror_dpw(); + void op_ror_dp(); + void op_ror_dpxb(); + void op_ror_dpxw(); + void op_ror_dpx(); +//op_sta + void op_sta_addrb(); + void op_sta_addrw(); + void op_sta_addr(); + void op_sta_addrxb(); + void op_sta_addrxw(); + void op_sta_addrx(); + void op_sta_dpb(); + void op_sta_dpw(); + void op_sta_dp(); + void op_sta_idpb(); + void op_sta_idpw(); + void op_sta_idp(); + void op_sta_ildpb(); + void op_sta_ildpw(); + void op_sta_ildp(); + void op_sta_longb(); + void op_sta_longw(); + void op_sta_long(); + void op_sta_longxb(); + void op_sta_longxw(); + void op_sta_longx(); + void op_sta_addryb(); + void op_sta_addryw(); + void op_sta_addry(); + void op_sta_dpxb(); + void op_sta_dpxw(); + void op_sta_dpx(); + void op_sta_idpxb(); + void op_sta_idpxw(); + void op_sta_idpx(); + void op_sta_idpyb(); + void op_sta_idpyw(); + void op_sta_idpy(); + void op_sta_ildpyb(); + void op_sta_ildpyw(); + void op_sta_ildpy(); + void op_sta_srb(); + void op_sta_srw(); + void op_sta_sr(); + void op_sta_isryb(); + void op_sta_isryw(); + void op_sta_isry(); +//op_stack + void op_phab(); + void op_phaw(); + void op_pha(); + void op_phb(); + void op_phd(); + void op_phk(); + void op_php(); + void op_phxb(); + void op_phxw(); + void op_phx(); + void op_phyb(); + void op_phyw(); + void op_phy(); + void op_plab(); + void op_plaw(); + void op_pla(); + void op_plb(); + void op_pld(); + void op_plp(); + void op_plxb(); + void op_plxw(); + void op_plx(); + void op_plyb(); + void op_plyw(); + void op_ply(); + void op_pea(); + void op_pei(); + void op_per(); + + bCPU(); + ~bCPU(); +}; diff --git a/src/cpu/bcpu/bcpu_exec.cpp b/src/cpu/bcpu/bcpu_exec.cpp new file mode 100644 index 00000000..5b147ef5 --- /dev/null +++ b/src/cpu/bcpu/bcpu_exec.cpp @@ -0,0 +1,280 @@ +void bCPU::exec_opcode() { +byte op; + op = op_read(); + switch(op) { +/* 0x */ + case 0x00:op_brk(); break; + case 0x01:op_ora_idpx(); break; + case 0x02:op_cop(); break; + case 0x03:op_ora_sr(); break; + case 0x04:op_tsb_dp(); break; + case 0x05:op_ora_dp(); break; + case 0x06:op_asl_dp(); break; + case 0x07:op_ora_ildp(); break; + case 0x08:op_php(); break; + case 0x09:op_ora_const();break; + case 0x0a:op_asl(); break; + case 0x0b:op_phd(); break; + case 0x0c:op_tsb_addr(); break; + case 0x0d:op_ora_addr(); break; + case 0x0e:op_asl_addr(); break; + case 0x0f:op_ora_long(); break; +/* 1x */ + case 0x10:op_bpl(); break; + case 0x11:op_ora_idpy(); break; + case 0x12:op_ora_idp(); break; + case 0x13:op_ora_isry(); break; + case 0x14:op_trb_dp(); break; + case 0x15:op_ora_dpx(); break; + case 0x16:op_asl_dpx(); break; + case 0x17:op_ora_ildpy();break; + case 0x18:op_clc(); break; + case 0x19:op_ora_addry();break; + case 0x1a:op_inc(); break; + case 0x1b:op_tcs(); break; + case 0x1c:op_trb_addr(); break; + case 0x1d:op_ora_addrx();break; + case 0x1e:op_asl_addrx();break; + case 0x1f:op_ora_longx();break; +/* 2x */ + case 0x20:op_jsr_addr(); break; + case 0x21:op_and_idpx(); break; + case 0x22:op_jsr_long(); break; + case 0x23:op_and_sr(); break; + case 0x24:op_bit_dp(); break; + case 0x25:op_and_dp(); break; + case 0x26:op_rol_dp(); break; + case 0x27:op_and_ildp(); break; + case 0x28:op_plp(); break; + case 0x29:op_and_const();break; + case 0x2a:op_rol(); break; + case 0x2b:op_pld(); break; + case 0x2c:op_bit_addr(); break; + case 0x2d:op_and_addr(); break; + case 0x2e:op_rol_addr(); break; + case 0x2f:op_and_long(); break; +/* 3x */ + case 0x30:op_bmi(); break; + case 0x31:op_and_idpy(); break; + case 0x32:op_and_idp(); break; + case 0x33:op_and_isry(); break; + case 0x34:op_bit_dpx(); break; + case 0x35:op_and_dpx(); break; + case 0x36:op_rol_dpx(); break; + case 0x37:op_and_ildpy();break; + case 0x38:op_sec(); break; + case 0x39:op_and_addry();break; + case 0x3a:op_dec(); break; + case 0x3b:op_tsc(); break; + case 0x3c:op_bit_addrx();break; + case 0x3d:op_and_addrx();break; + case 0x3e:op_rol_addrx();break; + case 0x3f:op_and_longx();break; +/* 4x */ + case 0x40:op_rti(); break; + case 0x41:op_eor_idpx(); break; + case 0x42:op_wdm(); break; + case 0x43:op_eor_sr(); break; + case 0x44:op_mvp(); break; + case 0x45:op_eor_dp(); break; + case 0x46:op_lsr_dp(); break; + case 0x47:op_eor_ildp(); break; + case 0x48:op_pha(); break; + case 0x49:op_eor_const();break; + case 0x4a:op_lsr(); break; + case 0x4b:op_phk(); break; + case 0x4c:op_jmp_addr(); break; + case 0x4d:op_eor_addr(); break; + case 0x4e:op_lsr_addr(); break; + case 0x4f:op_eor_long(); break; +/* 5x */ + case 0x50:op_bvc(); break; + case 0x51:op_eor_idpy(); break; + case 0x52:op_eor_idp(); break; + case 0x53:op_eor_isry(); break; + case 0x54:op_mvn(); break; + case 0x55:op_eor_dpx(); break; + case 0x56:op_lsr_dpx(); break; + case 0x57:op_eor_ildpy();break; + case 0x58:op_cli(); break; + case 0x59:op_eor_addry();break; + case 0x5a:op_phy(); break; + case 0x5b:op_tcd(); break; + case 0x5c:op_jmp_long(); break; + case 0x5d:op_eor_addrx();break; + case 0x5e:op_lsr_addrx();break; + case 0x5f:op_eor_longx();break; +/* 6x */ + case 0x60:op_rts(); break; + case 0x61:op_adc_idpx(); break; + case 0x62:op_per(); break; + case 0x63:op_adc_sr(); break; + case 0x64:op_stz_dp(); break; + case 0x65:op_adc_dp(); break; + case 0x66:op_ror_dp(); break; + case 0x67:op_adc_ildp(); break; + case 0x68:op_pla(); break; + case 0x69:op_adc_const();break; + case 0x6a:op_ror(); break; + case 0x6b:op_rtl(); break; + case 0x6c:op_jmp_iaddr();break; + case 0x6d:op_adc_addr(); break; + case 0x6e:op_ror_addr(); break; + case 0x6f:op_adc_long(); break; +/* 7x */ + case 0x70:op_bvs(); break; + case 0x71:op_adc_idpy(); break; + case 0x72:op_adc_idp(); break; + case 0x73:op_adc_isry(); break; + case 0x74:op_stz_dpx(); break; + case 0x75:op_adc_dpx(); break; + case 0x76:op_ror_dpx(); break; + case 0x77:op_adc_ildpy(); break; + case 0x78:op_sei(); break; + case 0x79:op_adc_addry(); break; + case 0x7a:op_ply(); break; + case 0x7b:op_tdc(); break; + case 0x7c:op_jmp_iaddrx();break; + case 0x7d:op_adc_addrx(); break; + case 0x7e:op_ror_addrx(); break; + case 0x7f:op_adc_longx(); break; +/* 8x */ + case 0x80:op_bra(); break; + case 0x81:op_sta_idpx(); break; + case 0x82:op_brl(); break; + case 0x83:op_sta_sr(); break; + case 0x84:op_sty_dp(); break; + case 0x85:op_sta_dp(); break; + case 0x86:op_stx_dp(); break; + case 0x87:op_sta_ildp(); break; + case 0x88:op_dey(); break; + case 0x89:op_bit_const();break; + case 0x8a:op_txa(); break; + case 0x8b:op_phb(); break; + case 0x8c:op_sty_addr(); break; + case 0x8d:op_sta_addr(); break; + case 0x8e:op_stx_addr(); break; + case 0x8f:op_sta_long(); break; +/* 9x */ + case 0x90:op_bcc(); break; + case 0x91:op_sta_idpy(); break; + case 0x92:op_sta_idp(); break; + case 0x93:op_sta_isry(); break; + case 0x94:op_sty_dpx(); break; + case 0x95:op_sta_dpx(); break; + case 0x96:op_stx_dpy(); break; + case 0x97:op_sta_ildpy();break; + case 0x98:op_tya(); break; + case 0x99:op_sta_addry();break; + case 0x9a:op_txs(); break; + case 0x9b:op_txy(); break; + case 0x9c:op_stz_addr(); break; + case 0x9d:op_sta_addrx();break; + case 0x9e:op_stz_addrx();break; + case 0x9f:op_sta_longx();break; +/* ax */ + case 0xa0:op_ldy_const();break; + case 0xa1:op_lda_idpx(); break; + case 0xa2:op_ldx_const();break; + case 0xa3:op_lda_sr(); break; + case 0xa4:op_ldy_dp(); break; + case 0xa5:op_lda_dp(); break; + case 0xa6:op_ldx_dp(); break; + case 0xa7:op_lda_ildp(); break; + case 0xa8:op_tay(); break; + case 0xa9:op_lda_const();break; + case 0xaa:op_tax(); break; + case 0xab:op_plb(); break; + case 0xac:op_ldy_addr(); break; + case 0xad:op_lda_addr(); break; + case 0xae:op_ldx_addr(); break; + case 0xaf:op_lda_long(); break; +/* bx */ + case 0xb0:op_bcs(); break; + case 0xb1:op_lda_idpy(); break; + case 0xb2:op_lda_idp(); break; + case 0xb3:op_lda_isry(); break; + case 0xb4:op_ldy_dpx(); break; + case 0xb5:op_lda_dpx(); break; + case 0xb6:op_ldx_dpy(); break; + case 0xb7:op_lda_ildpy();break; + case 0xb8:op_clv(); break; + case 0xb9:op_lda_addry();break; + case 0xba:op_tsx(); break; + case 0xbb:op_tyx(); break; + case 0xbc:op_ldy_addrx();break; + case 0xbd:op_lda_addrx();break; + case 0xbe:op_ldx_addry();break; + case 0xbf:op_lda_longx();break; +/* cx */ + case 0xc0:op_cpy_const();break; + case 0xc1:op_cmp_idpx(); break; + case 0xc2:op_rep(); break; + case 0xc3:op_cmp_sr(); break; + case 0xc4:op_cpy_dp(); break; + case 0xc5:op_cmp_dp(); break; + case 0xc6:op_dec_dp(); break; + case 0xc7:op_cmp_ildp(); break; + case 0xc8:op_iny(); break; + case 0xc9:op_cmp_const();break; + case 0xca:op_dex(); break; + case 0xcb:op_wai(); break; + case 0xcc:op_cpy_addr(); break; + case 0xcd:op_cmp_addr(); break; + case 0xce:op_dec_addr(); break; + case 0xcf:op_cmp_long(); break; +/* dx */ + case 0xd0:op_bne(); break; + case 0xd1:op_cmp_idpy(); break; + case 0xd2:op_cmp_idp(); break; + case 0xd3:op_cmp_isry(); break; + case 0xd4:op_pei(); break; + case 0xd5:op_cmp_dpx(); break; + case 0xd6:op_dec_dpx(); break; + case 0xd7:op_cmp_ildpy(); break; + case 0xd8:op_cld(); break; + case 0xd9:op_cmp_addry(); break; + case 0xda:op_phx(); break; + case 0xdb:op_stp(); break; + case 0xdc:op_jmp_iladdr();break; + case 0xdd:op_cmp_addrx(); break; + case 0xde:op_dec_addrx(); break; + case 0xdf:op_cmp_longx(); break; +/* ex */ + case 0xe0:op_cpx_const();break; + case 0xe1:op_sbc_idpx(); break; + case 0xe2:op_sep(); break; + case 0xe3:op_sbc_sr(); break; + case 0xe4:op_cpx_dp(); break; + case 0xe5:op_sbc_dp(); break; + case 0xe6:op_inc_dp(); break; + case 0xe7:op_sbc_ildp(); break; + case 0xe8:op_inx(); break; + case 0xe9:op_sbc_const();break; + case 0xea:op_nop(); break; + case 0xeb:op_xba(); break; + case 0xec:op_cpx_addr(); break; + case 0xed:op_sbc_addr(); break; + case 0xee:op_inc_addr(); break; + case 0xef:op_sbc_long(); break; +/* fx */ + case 0xf0:op_beq(); break; + case 0xf1:op_sbc_idpy(); break; + case 0xf2:op_sbc_idp(); break; + case 0xf3:op_sbc_isry(); break; + case 0xf4:op_pea(); break; + case 0xf5:op_sbc_dpx(); break; + case 0xf6:op_inc_dpx(); break; + case 0xf7:op_sbc_ildpy(); break; + case 0xf8:op_sed(); break; + case 0xf9:op_sbc_addry(); break; + case 0xfa:op_plx(); break; + case 0xfb:op_xce(); break; + case 0xfc:op_jsr_iaddrx();break; + case 0xfd:op_sbc_addrx(); break; + case 0xfe:op_inc_addrx(); break; + case 0xff:op_sbc_longx(); break; + } + + snes->notify(SNES::CPU_EXEC_OPCODE); +} diff --git a/src/cpu/bcpu/bcpu_mmio.cpp b/src/cpu/bcpu/bcpu_mmio.cpp new file mode 100644 index 00000000..6d4df3f3 --- /dev/null +++ b/src/cpu/bcpu/bcpu_mmio.cpp @@ -0,0 +1,698 @@ +void bCPU::mmio_reset() { +//$2181-$2183 + status.wram_addr = 0x000000; + +//$4016 + status.joypad1_strobe_value = 0x00; + status.joypad1_read_pos = 0; + +//$4200 + status.nmi_enabled = false; + status.hirq_enabled = false; + status.virq_enabled = false; + status.auto_joypad_poll = false; + +//$4201 + status.pio = 0xff; + +//$4202-$4203 + status.mul_a = 0x00; + status.mul_b = 0x00; + +//$4204-$4206 + status.div_a = 0x0000; + status.div_b = 0x00; + +//$4207-$420a + status.hirq_pos = 0; + status.virq_pos = 0; + +//$4214-$4217 + status.r4214 = 0x0000; + status.r4216 = 0x0000; +} + +//WMDATA +uint8 bCPU::mmio_r2180() { +uint8 r; + r = mem_bus->read(0x7e0000 | status.wram_addr); + status.wram_addr++; + status.wram_addr &= 0x01ffff; + return r; +} + +//??? +uint8 bCPU::mmio_r21c2() { + return 0x20; +} + +//??? +uint8 bCPU::mmio_r21c3() { + return 0x00; +} + +/* + The joypad contains a small bit shifter that has 16 bits. + Reading from 4016 reads one bit from this buffer, then moves + the buffer left one, and adds a '1' to the rightmost bit. + Writing a one to $4016 will fill the buffer with the current + joypad button states, and lock the bit shifter at position + zero. All reads will be the first buffer state, or 'B'. + A zero must be written back to $4016 to unlock the buffer, + so that reads will increment the bit shifting position. +*/ +//JOYSER0 +uint8 bCPU::mmio_r4016() { +uint8 r = 0x00; + if(status.joypad1_strobe_value == 1) { + r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_B); + } else { + switch(status.joypad1_read_pos) { + case 0:r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_B); break; + case 1:r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_Y); break; + case 2:r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_SELECT);break; + case 3:r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_START); break; + case 4:r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_UP); break; + case 5:r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_DOWN); break; + case 6:r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_LEFT); break; + case 7:r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_RIGHT); break; + case 8:r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_A); break; + case 9:r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_X); break; + case 10:r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_L); break; + case 11:r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_R); break; + case 16:r |= 1;break; //joypad connected bit + default:r |= 1;break; //after 16th read, all subsequent reads return 1 + } + if(++status.joypad1_read_pos > 17)status.joypad1_read_pos = 17; + } + return r; +} + +//RDNMI +uint8 bCPU::mmio_r4210() { +uint8 r = 0x00; +uint16 v, h, hcycles, visible_scanlines; + v = clock->vcounter(); + h = clock->hcounter(); + hcycles = clock->hcycles(); + visible_scanlines = clock->visible_scanlines(); + if(status.r4210_read == false) { + if(v == 0 && hcycles < 2) { + r |= 0x80; + status.r4210_read = true; + } else if(v == (visible_scanlines + 1) && hcycles >= 2) { + r |= 0x80; + status.r4210_read = true; + } else if(v >= (visible_scanlines + 1)) { + r |= 0x80; + status.r4210_read = true; + } + } + r |= 0x40; + r |= 0x02; //cpu version number + status.nmi_pin = 1; + return r; +} + +//TIMEUP +uint8 bCPU::mmio_r4211() { +uint8 r = 0x00; + r |= 0x40; + if(status.irq_triggered == true)r |= 0x80; + status.irq_triggered = false; + return r; +} + +//HVBJOY +uint8 bCPU::mmio_r4212() { +uint8 r; +uint16 v, h, hcycles, visible_scanlines; + r = 0x00; + + v = clock->vcounter(); + h = clock->hcounter(); + hcycles = clock->hcycles(); + visible_scanlines = clock->visible_scanlines(); + +//auto joypad polling + if(v >= (visible_scanlines + 1) && v <= (visible_scanlines + 3))r |= 0x01; + +//hblank + if(hcycles <= 4 || hcycles >= 1098)r |= 0x40; + +//vblank + if(v == 0 && hcycles < 2)r |= 0x80; + if(v == (visible_scanlines + 1) && hcycles >= 2)r |= 0x80; + if(v > (visible_scanlines + 1))r |= 0x80; + return r; +} + +//RDIO +uint8 bCPU::mmio_r4213() { + return status.pio; +} + +//RDDIVL +uint8 bCPU::mmio_r4214() { + return status.r4214; +} + +//RDDIVH +uint8 bCPU::mmio_r4215() { + return status.r4214 >> 8; +} + +//RDMPYL +uint8 bCPU::mmio_r4216() { + return status.r4216; +} + +//RDMPYH +uint8 bCPU::mmio_r4217() { + return status.r4216 >> 8; +} + +//JOY1L +uint8 bCPU::mmio_r4218() { +uint8 r = 0x00; +uint16 v = clock->vcounter(); + if(status.auto_joypad_poll == false)return 0x00; //can't read joypad if auto polling not enabled + if(v >= 225 && v <= 227)return 0x00; //can't read joypad while SNES is polling input + r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_A) << 7; + r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_X) << 6; + r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_L) << 5; + r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_R) << 4; + return r; +} + +//JOY1H +uint8 bCPU::mmio_r4219() { +uint8 r = 0x00; +uint16 v = clock->vcounter(); + if(status.auto_joypad_poll == false)return 0x00; //can't read joypad if auto polling not enabled + if(v >= 225 && v <= 227)return 0x00; //can't read joypad while SNES is polling input + r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_B) << 7; + r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_Y) << 6; + r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_SELECT) << 5; + r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_START) << 4; + r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_UP) << 3; + r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_DOWN) << 2; + r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_LEFT) << 1; + r |= (uint8)snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_RIGHT); + return r; +} + +uint8 bCPUMMIO::read(uint32 addr) { + clock->sync(); + switch(addr) { + case 0x2180:return cpu->mmio_r2180(); //WMDATA + case 0x21c2:return cpu->mmio_r21c2(); //??? + case 0x21c3:return cpu->mmio_r21c3(); //??? + case 0x4016:return cpu->mmio_r4016(); //JOYSER0 + case 0x4210:return cpu->mmio_r4210(); //RDNMI + case 0x4211:return cpu->mmio_r4211(); //TIMEUP + case 0x4212:return cpu->mmio_r4212(); //HVBJOY + case 0x4213:return cpu->mmio_r4213(); //RDIO + case 0x4214:return cpu->mmio_r4214(); //RDDIVL + case 0x4215:return cpu->mmio_r4215(); //RDDIVH + case 0x4216:return cpu->mmio_r4216(); //RDMPYL + case 0x4217:return cpu->mmio_r4217(); //RDMPYH + case 0x4218:return cpu->mmio_r4218(); //JOY1L + case 0x4219:return cpu->mmio_r4219(); //JOY1H + } + return 0x00; +} + +//WMDATA +void bCPU::mmio_w2180(uint8 value) { + mem_bus->write(0x7e0000 | status.wram_addr, value); + status.wram_addr++; + status.wram_addr &= 0x01ffff; +} + +//WMADDL +void bCPU::mmio_w2181(uint8 value) { + status.wram_addr = (status.wram_addr & 0xffff00) | value; + status.wram_addr &= 0x01ffff; +} + +//WMADDM +void bCPU::mmio_w2182(uint8 value) { + status.wram_addr = (status.wram_addr & 0xff00ff) | (value << 8); + status.wram_addr &= 0x01ffff; +} + +//WMADDH +void bCPU::mmio_w2183(uint8 value) { + status.wram_addr = (status.wram_addr & 0x00ffff) | (value << 16); + status.wram_addr &= 0x01ffff; +} + +//JOYSER0 +void bCPU::mmio_w4016(uint8 value) { + status.joypad1_strobe_value = value; + if(value == 1)snes->poll_input(); + if(value == 0)status.joypad1_read_pos = 0; +} + +//NMITIMEN +void bCPU::mmio_w4200(uint8 value) { + status.nmi_enabled = !!(value & 0x80); + status.virq_enabled = !!(value & 0x20); + status.hirq_enabled = !!(value & 0x10); + status.auto_joypad_poll = !!(value & 0x01); +} + +//WRIO +void bCPU::mmio_w4201(uint8 value) { + if((status.pio & 0x80) && !(value & 0x80)) { + ppu->latch_counters(); + } + status.pio = value; +} + +//WRMPYA +void bCPU::mmio_w4202(uint8 value) { + status.mul_a = value; +} + +void bCPU::mmio_w4203(uint8 value) { + status.mul_b = value; + status.r4216 = status.mul_a * status.mul_b; +} + +//WRDIVL +void bCPU::mmio_w4204(uint8 value) { + status.div_a = (status.div_a & 0xff00) | value; +} + +//WRDIVH +void bCPU::mmio_w4205(uint8 value) { + status.div_a = (status.div_a & 0x00ff) | (value << 8); +} + +//WRDIVB +void bCPU::mmio_w4206(uint8 value) { + status.div_b = value; + status.r4214 = (status.div_b)?status.div_a / status.div_b:0; + status.r4216 = (status.div_b)?status.div_a % status.div_b:0; +} + +//HTIMEL +void bCPU::mmio_w4207(uint8 value) { + status.hirq_pos = (status.hirq_pos & 0xff00) | value; +} + +//HTIMEH +void bCPU::mmio_w4208(uint8 value) { + status.hirq_pos = (status.hirq_pos & 0x00ff) | (value << 8); +} + +//VTIMEL +void bCPU::mmio_w4209(uint8 value) { + status.virq_pos = (status.virq_pos & 0xff00) | value; +} + +//VTIMEH +void bCPU::mmio_w420a(uint8 value) { + status.virq_pos = (status.virq_pos & 0x00ff) | (value << 8); +} + +//DMAEN +void bCPU::mmio_w420b(uint8 value) { + for(int i=0;i<8;i++) { + dma->channel[i].active = !!(value & (1 << i)); + if(dma->channel[i].active == true) { + dma->channel[i].hdma_active = false; + } + } + cpustate = CPUSTATE_DMA; +} + +//HDMAEN +void bCPU::mmio_w420c(uint8 value) { + for(int i=0;i<8;i++) { + dma->channel[i].hdma_active = !!(value & (1 << i)); + if(dma->channel[i].hdma_active == true) { + dma->channel[i].active = false; + } + } +} + +//MEMSEL +void bCPU::mmio_w420d(uint8 value) { + mem_bus->fastROM = value & 1; +} + +//DMAPx +void bCPU::mmio_w43x0(uint8 value, uint8 i) { + dma->channel[i].direction = !!(value & 0x80); + dma->channel[i].hdma_indirect = !!(value & 0x40); + dma->channel[i].incmode = (value & 0x10)?-1:1; + dma->channel[i].fixedxfer = !!(value & 0x08); + dma->channel[i].xfermode = value & 7; +} + +//BBADx +void bCPU::mmio_w43x1(uint8 value, uint8 i) { + dma->channel[i].destaddr = value; +} + +//A1TxL +void bCPU::mmio_w43x2(uint8 value, uint8 i) { + dma->channel[i].srcaddr = (dma->channel[i].srcaddr & 0xffff00) | value; +} + +//A1TxH +void bCPU::mmio_w43x3(uint8 value, uint8 i) { + dma->channel[i].srcaddr = (dma->channel[i].srcaddr & 0xff00ff) | (value << 8); +} + +//A1Bx +void bCPU::mmio_w43x4(uint8 value, uint8 i) { + dma->channel[i].srcaddr = (dma->channel[i].srcaddr & 0x00ffff) | (value << 16); +} + +//DASxL +void bCPU::mmio_w43x5(uint8 value, uint8 i) { + dma->channel[i].xfersize = (dma->channel[i].xfersize & 0xff00) | value; +} + +//DASxH +void bCPU::mmio_w43x6(uint8 value, uint8 i) { + dma->channel[i].xfersize = (dma->channel[i].xfersize & 0x00ff) | (value << 8); +} + +//DASBx +void bCPU::mmio_w43x7(uint8 value, uint8 i) { + dma->channel[i].hdma_indirect_bank = value; +} + +void bCPUMMIO::write(uint32 addr, uint8 value) { +int i; + clock->sync(); + switch(addr) { + case 0x2180:cpu->mmio_w2180(value);return; //WMDATA + case 0x2181:cpu->mmio_w2181(value);return; //WMADDL + case 0x2182:cpu->mmio_w2182(value);return; //WMADDM + case 0x2183:cpu->mmio_w2183(value);return; //WMADDH + case 0x4016:cpu->mmio_w4016(value);return; //JOYSER0 + case 0x4200:cpu->mmio_w4200(value);return; //NMITIMEN + case 0x4201:cpu->mmio_w4201(value);return; //WRIO + case 0x4202:cpu->mmio_w4202(value);return; //WRMPYA + case 0x4203:cpu->mmio_w4203(value);return; //WRMPYB + case 0x4204:cpu->mmio_w4204(value);return; //WRDIVL + case 0x4205:cpu->mmio_w4205(value);return; //WRDIVH + case 0x4206:cpu->mmio_w4206(value);return; //WRDIVB + case 0x4207:cpu->mmio_w4207(value);return; //HTIMEL + case 0x4208:cpu->mmio_w4208(value);return; //HTIMEH + case 0x4209:cpu->mmio_w4209(value);return; //VTIMEL + case 0x420a:cpu->mmio_w420a(value);return; //VTIMEH + case 0x420b:cpu->mmio_w420b(value);return; //DMAEN + case 0x420c:cpu->mmio_w420c(value);return; //HDMAEN + case 0x420d:cpu->mmio_w420d(value);return; //MEMSEL +//DMAPx + case 0x4300:case 0x4310:case 0x4320:case 0x4330: + case 0x4340:case 0x4350:case 0x4360:case 0x4370: + cpu->mmio_w43x0(value, (addr >> 4) & 7); + return; +//BBADx + case 0x4301:case 0x4311:case 0x4321:case 0x4331: + case 0x4341:case 0x4351:case 0x4361:case 0x4371: + cpu->mmio_w43x1(value, (addr >> 4) & 7); + return; +//A1TxL + case 0x4302:case 0x4312:case 0x4322:case 0x4332: + case 0x4342:case 0x4352:case 0x4362:case 0x4372: + cpu->mmio_w43x2(value, (addr >> 4) & 7); + return; +//A1TxH + case 0x4303:case 0x4313:case 0x4323:case 0x4333: + case 0x4343:case 0x4353:case 0x4363:case 0x4373: + cpu->mmio_w43x3(value, (addr >> 4) & 7); + return; +//A1Bx + case 0x4304:case 0x4314:case 0x4324:case 0x4334: + case 0x4344:case 0x4354:case 0x4364:case 0x4374: + cpu->mmio_w43x4(value, (addr >> 4) & 7); + return; +//DASxL + case 0x4305:case 0x4315:case 0x4325:case 0x4335: + case 0x4345:case 0x4355:case 0x4365:case 0x4375: + cpu->mmio_w43x5(value, (addr >> 4) & 7); + return; +//DASxH + case 0x4306:case 0x4316:case 0x4326:case 0x4336: + case 0x4346:case 0x4356:case 0x4366:case 0x4376: + cpu->mmio_w43x6(value, (addr >> 4) & 7); + return; +//DASBx + case 0x4307:case 0x4317:case 0x4327:case 0x4337: + case 0x4347:case 0x4357:case 0x4367:case 0x4377: + cpu->mmio_w43x7(value, (addr >> 4) & 7); + return; + } +} + +bCPUMMIO::bCPUMMIO(bCPU *_cpu) { + cpu = _cpu; +} + +uint16 bDMA::dma_cputommio(uint8 i, uint8 index) { +uint8 x; + x = mem_bus->read(channel[i].srcaddr); + mem_bus->write(0x2100 | ((channel[i].destaddr + index) & 0xff), x); + if(channel[i].fixedxfer == false) { + channel[i].srcaddr = (channel[i].srcaddr & 0xff0000) + ((channel[i].srcaddr + channel[i].incmode) & 0xffff); + } + clock->add_cc1_cycles(8); + return --channel[i].xfersize; +} + +uint16 bDMA::dma_mmiotocpu(uint8 i, uint8 index) { +uint8 x; + x = mem_bus->read(0x2100 | ((channel[i].destaddr + index) & 0xff)); + mem_bus->write(channel[i].srcaddr, x); + if(channel[i].fixedxfer == false) { + channel[i].srcaddr = (channel[i].srcaddr & 0xff0000) + ((channel[i].srcaddr + channel[i].incmode) & 0xffff); + } + clock->add_cc1_cycles(8); + return --channel[i].xfersize; +} + +void bDMA::dma_xfer_type0(uint8 i) { + if(channel[i].direction == 0) { + if(dma_cputommio(i, 0) == 0)return; + } else { + if(dma_mmiotocpu(i, 0) == 0)return; + } +} + +void bDMA::dma_xfer_type1(uint8 i) { + if(channel[i].direction == 0) { + if(dma_cputommio(i, 0) == 0)return; + if(dma_cputommio(i, 1) == 0)return; + } else { + if(dma_mmiotocpu(i, 0) == 0)return; + if(dma_mmiotocpu(i, 1) == 0)return; + } +} + +void bDMA::dma_xfer_type2(uint8 i) { + if(channel[i].direction == 0) { + if(dma_cputommio(i, 0) == 0)return; + if(dma_cputommio(i, 0) == 0)return; + } else { + if(dma_mmiotocpu(i, 0) == 0)return; + if(dma_mmiotocpu(i, 0) == 0)return; + } +} + +void bDMA::dma_xfer_type3(uint8 i) { + if(channel[i].direction == 0) { + if(dma_cputommio(i, 0) == 0)return; + if(dma_cputommio(i, 0) == 0)return; + if(dma_cputommio(i, 1) == 0)return; + if(dma_cputommio(i, 1) == 0)return; + } else { + if(dma_mmiotocpu(i, 0) == 0)return; + if(dma_mmiotocpu(i, 0) == 0)return; + if(dma_mmiotocpu(i, 1) == 0)return; + if(dma_mmiotocpu(i, 1) == 0)return; + } +} + +void bDMA::dma_xfer_type4(uint8 i) { + if(channel[i].direction == 0) { + if(dma_cputommio(i, 0) == 0)return; + if(dma_cputommio(i, 1) == 0)return; + if(dma_cputommio(i, 2) == 0)return; + if(dma_cputommio(i, 3) == 0)return; + } else { + if(dma_mmiotocpu(i, 0) == 0)return; + if(dma_mmiotocpu(i, 1) == 0)return; + if(dma_mmiotocpu(i, 2) == 0)return; + if(dma_mmiotocpu(i, 3) == 0)return; + } +} + +void bDMA::dma_xfer_type5(uint8 i) { + if(channel[i].direction == 0) { + if(dma_cputommio(i, 0) == 0)return; + if(dma_cputommio(i, 1) == 0)return; + if(dma_cputommio(i, 0) == 0)return; + if(dma_cputommio(i, 1) == 0)return; + } else { + if(dma_mmiotocpu(i, 0) == 0)return; + if(dma_mmiotocpu(i, 1) == 0)return; + if(dma_mmiotocpu(i, 0) == 0)return; + if(dma_mmiotocpu(i, 1) == 0)return; + } +} + +void bDMA::run() { + for(int i=0;i<8;i++) { + if(channel[i].active == false)continue; + switch(channel[i].xfermode) { + case 0:dma_xfer_type0(i);break; + case 1:dma_xfer_type1(i);break; + case 2:dma_xfer_type2(i);break; + case 3:dma_xfer_type3(i);break; + case 4:dma_xfer_type4(i);break; + case 5:dma_xfer_type5(i);break; + case 6:dma_xfer_type2(i);break; + case 7:dma_xfer_type3(i);break; + } + if(channel[i].xfersize == 0) { + channel[i].active = false; + } + return; + } + cpu->cpustate = bCPU::CPUSTATE_RUN; +} + +void bDMA::hdma_write(uint8 i, uint8 l, uint8 x) { + switch(channel[i].xfermode) { + case 0:mem_bus->write(0x2100 | ((channel[i].destaddr) & 0xff), x);break; + case 1:mem_bus->write(0x2100 | ((channel[i].destaddr + l) & 0xff), x);break; + case 2:mem_bus->write(0x2100 | ((channel[i].destaddr) & 0xff), x);break; + case 3:mem_bus->write(0x2100 | ((channel[i].destaddr + (l >> 1)) & 0xff), x);break; + case 4:mem_bus->write(0x2100 | ((channel[i].destaddr + l) & 0xff), x);break; + case 5:mem_bus->write(0x2100 | ((channel[i].destaddr + (l & 1)) & 0xff), x);break; + case 6:mem_bus->write(0x2100 | ((channel[i].destaddr) & 0xff), x);break; + case 7:mem_bus->write(0x2100 | ((channel[i].destaddr + (l >> 1)) & 0xff), x);break; + } +} + +void bDMA::hdma_run() { +int l, xferlen; +uint8 x, active_channels = 0; + for(int i=0;i<8;i++) { + if(channel[i].hdma_completed == true)continue; + clock->add_cc1_cycles(8); + active_channels++; + if(channel[i].hdma_line_counter == 0) { + channel[i].hdma_line_counter = mem_bus->read(channel[i].hdma_address++); +// channel[i].r43x8 = channel[i].hdma_address; + if(channel[i].hdma_line_counter == 0) { + channel[i].hdma_completed = true; + continue; + } + + if(channel[i].hdma_line_counter > 0x80) { + channel[i].hdma_repeat = true; + channel[i].hdma_line_counter -= 0x80; + } else { + channel[i].hdma_repeat = false; + } + + channel[i].hdma_first_line = true; + if(channel[i].hdma_indirect == false) { + channel[i].hdma_iaddress = channel[i].hdma_address; + } else { + channel[i].hdma_iaddress = mem_bus->read(channel[i].hdma_address++); + channel[i].hdma_iaddress |= mem_bus->read(channel[i].hdma_address++) << 8; + channel[i].hdma_iaddress |= channel[i].hdma_indirect_bank << 16; + clock->add_cc1_cycles(16); + } + } + + channel[i].hdma_line_counter--; + if(channel[i].hdma_first_line == false && channel[i].hdma_repeat == false)continue; + channel[i].hdma_first_line = false; + + if(channel[i].hdma_indirect == false) { + channel[i].hdma_iaddress = channel[i].hdma_address; + } + + switch(channel[i].xfermode) { + case 0: xferlen = 1;break; + case 1:case 2:case 6: xferlen = 2;break; + case 3:case 4:case 5:case 7:xferlen = 4;break; + } + + for(l=0;lread(channel[i].hdma_iaddress++); + if(channel[i].hdma_indirect == false) { + channel[i].hdma_address++; + } + hdma_write(i, l, x); + clock->add_cc1_cycles(8); + } + } + if(active_channels != 0) { + clock->add_cc1_cycles(18); + } +} + +void bDMA::hdma_initialize() { +uint8 active_channels = 0; + for(int i=0;i<8;i++) { + if(!channel[i].hdma_active) { + channel[i].hdma_completed = true; + continue; + } + active_channels++; + channel[i].hdma_first_line = true; + channel[i].hdma_repeat = false; + channel[i].hdma_line_counter = 0; + channel[i].hdma_address = channel[i].srcaddr; + channel[i].hdma_completed = false; + if(channel[i].hdma_indirect == false) { + clock->add_cc1_cycles(8); + } else { + clock->add_cc1_cycles(24); + } + } + if(active_channels != 0) { + clock->add_cc1_cycles(18); + } +} + +void bDMA::reset() { + for(int i=0;i<8;i++) { + channel[i].active = false; + channel[i].hdma_active = false; + channel[i].direction = 0; + channel[i].hdma_indirect = false; + channel[i].incmode = 1; + channel[i].fixedxfer = false; + channel[i].xfermode = 0; + channel[i].destaddr = 0; + channel[i].srcaddr = 0; + channel[i].xfersize = 0; + channel[i].hdma_indirect_bank = 0; + channel[i].hdma_first_line = false; + channel[i].hdma_repeat = false; + channel[i].hdma_line_counter = 0; + channel[i].hdma_address = 0; + channel[i].hdma_iaddress = 0; + channel[i].hdma_completed = false; + } + hdma_triggered = false; +} + +bDMA::bDMA(bCPU *_cpu) { + cpu = _cpu; + reset(); +} diff --git a/src/cpu/bcpu/bcpu_op_adc.cpp b/src/cpu/bcpu/bcpu_op_adc.cpp new file mode 100644 index 00000000..2bfe4ab6 --- /dev/null +++ b/src/cpu/bcpu/bcpu_op_adc.cpp @@ -0,0 +1,494 @@ +void bCPU::flags_adc_b() { +int32 r = regs.a.l + rd.l + regs.p.c; +//bcd + if(regs.p.d) { + if(((r ) & 15) > 9)r += 6; + if(((r >> 4) & 15) > 9)r += 6 << 4; + } + regs.p.n = !!(r & 0x80); + regs.p.v = !!(~(regs.a.l ^ rd.l) & (regs.a.l ^ r) & 0x80); + regs.p.z = ((byte)r == 0); + regs.p.c = (r > 0xff); + regs.a.l = r; +} + +void bCPU::flags_adc_w() { +int32 r = regs.a.w + rd.w + regs.p.c; +//bcd + if(regs.p.d) { + if(((r ) & 15) > 9)r += 6; + if(((r >> 4) & 15) > 9)r += 6 << 4; + if(((r >> 8) & 15) > 9)r += 6 << 8; + if(((r >> 12) & 15) > 9)r += 6 << 12; + } + regs.p.n = !!(r & 0x8000); + regs.p.v = !!(~(regs.a.w ^ rd.w) & (regs.a.w ^ r) & 0x8000); + regs.p.z = ((word)r == 0); + regs.p.c = (r > 0xffff); + regs.a.w = r; +} + +/************************ + *** 0x69: adc #const *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; idl + [2a] pbr,pc+2 ; idh [1] +*/ +void bCPU::op_adc_constb() { + rd.l = op_read(); //2 + flags_adc_b(); +} + +void bCPU::op_adc_constw() { + rd.l = op_read(); //2 + rd.h = op_read(); //2a + flags_adc_w(); +} + +void bCPU::op_adc_const() { (regs.p.m)?op_adc_constb():op_adc_constw(); } + +/********************** + *** 0x6d: adc addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_adc_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + flags_adc_b(); +} + +void bCPU::op_adc_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a + flags_adc_w(); +} + +void bCPU::op_adc_addr() { (regs.p.m)?op_adc_addrb():op_adc_addrw(); } + +/************************ + *** 0x7d: adc addr,x *** + ************************ +cycles: + [1 ] pbr,pc ; operadc + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+xl ; io [4] + [4 ] dbr,aa+x ; data low + [4a] dbr,aa+x+1 ; data high [1] +*/ +void bCPU::op_adc_addrxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + flags_adc_b(); +} + +void bCPU::op_adc_addrxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //4a + flags_adc_w(); +} + +void bCPU::op_adc_addrx() { (regs.p.m)?op_adc_addrxb():op_adc_addrxw(); } + +/******************** + *** 0x65: adc dp *** + ******************** +cycles: + [1 ] pbr,pc ; operadc + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] +*/ +void bCPU::op_adc_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + flags_adc_b(); +} + +void bCPU::op_adc_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + rd.h = op_read(OPMODE_DP, dp + 1); //3a + flags_adc_w(); +} + +void bCPU::op_adc_dp() { (regs.p.m)?op_adc_dpb():op_adc_dpw(); } + +/********************** + *** 0x72: adc (dp) *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] dbr,aa ; data low + [5a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_adc_idpb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + rd.l = op_read(OPMODE_DBR, aa.w); //5 + flags_adc_b(); +} + +void bCPU::op_adc_idpw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + rd.l = op_read(OPMODE_DBR, aa.w); //5 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //5 + flags_adc_w(); +} + +void bCPU::op_adc_idp() { (regs.p.m)?op_adc_idpb():op_adc_idpw(); } + +/********************** + *** 0x67: adc [dp] *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] 0,d+dp+2 ; aab + [6 ] aab,aa ; data low + [6a] aab,aa+1 ; data high [1] +*/ +void bCPU::op_adc_ildpb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + rd.l = op_read(OPMODE_LONG, aa.d); //6 + flags_adc_b(); +} + +void bCPU::op_adc_ildpw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + rd.l = op_read(OPMODE_LONG, aa.d); //6 + rd.h = op_read(OPMODE_LONG, aa.d + 1); //6a + flags_adc_w(); +} + +void bCPU::op_adc_ildp() { (regs.p.m)?op_adc_ildpb():op_adc_ildpw(); } + +/********************** + *** 0x6f: adc long *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] pbr,pc+3 ; aab + [5 ] aab,aa ; data low + [5a] aab,aa+1 ; data high +*/ +void bCPU::op_adc_longb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + rd.l = op_read(OPMODE_LONG, aa.d); //5 + flags_adc_b(); +} + +void bCPU::op_adc_longw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + rd.l = op_read(OPMODE_LONG, aa.d); //5 + rd.h = op_read(OPMODE_LONG, aa.d + 1); //5a + flags_adc_w(); +} + +void bCPU::op_adc_long() { (regs.p.m)?op_adc_longb():op_adc_longw(); } + +/************************ + *** 0x7f: adc long,x *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] pbr,pc+3 ; aab + [5 ] aab,aa+x ; data low + [5a] aab,aa+x+1 ; data high +*/ +void bCPU::op_adc_longxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + rd.l = op_read(OPMODE_LONG, aa.d + regs.x.w); //5 + flags_adc_b(); +} + +void bCPU::op_adc_longxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + rd.l = op_read(OPMODE_LONG, aa.d + regs.x.w); //5 + rd.h = op_read(OPMODE_LONG, aa.d + regs.x.w + 1); //5a + flags_adc_w(); +} + +void bCPU::op_adc_longx() { (regs.p.m)?op_adc_longxb():op_adc_longxw(); } + +/************************ + *** 0x79: adc addr,y *** + ************************ +cycles: + [1 ] pbr,pc ; operadc + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+yl ; io [4] + [4 ] dbr,aa+y ; data low + [4a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_adc_addryb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //4 + flags_adc_b(); +} + +void bCPU::op_adc_addryw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //4a + flags_adc_w(); +} + +void bCPU::op_adc_addry() { (regs.p.m)?op_adc_addryb():op_adc_addryw(); } + +/********************** + *** 0x75: adc dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high +*/ +void bCPU::op_adc_dpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + flags_adc_b(); +} + +void bCPU::op_adc_dpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //4a + flags_adc_w(); +} + +void bCPU::op_adc_dpx() { (regs.p.m)?op_adc_dpxb():op_adc_dpxw(); } + +/************************ + *** 0x61: adc (dp,x) *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; aal + [5 ] 0,d+dp+x+1 ; aah + [6 ] dbr,aa ; data low + [6a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_adc_idpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5 + rd.l = op_read(OPMODE_DBR, aa.w); //6 + flags_adc_b(); +} + +void bCPU::op_adc_idpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5 + rd.l = op_read(OPMODE_DBR, aa.w); //6 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //6a + flags_adc_w(); +} + +void bCPU::op_adc_idpx() { (regs.p.m)?op_adc_idpxb():op_adc_idpxw(); } + +/************************ + *** 0x71: adc (dp),y *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [4a] dbr,aah,aal+yl ; io [4] + [5 ] dbr,aa+y ; data low + [5a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_adc_idpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + cpu_c4(aa.w, aa.w + regs.y.w); //4a + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //5 + flags_adc_b(); +} + +void bCPU::op_adc_idpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + cpu_c4(aa.w, aa.w + regs.y.w); //4a + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //5 + rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //5a + flags_adc_w(); +} + +void bCPU::op_adc_idpy() { (regs.p.m)?op_adc_idpyb():op_adc_idpyw(); } + +/************************ + *** 0x77: adc [dp],y *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] 0,d+dp+2 ; aab + [6 ] aab,aa+y ; data low + [6a] aab,aa+y+1 ; data high [1] +*/ +void bCPU::op_adc_ildpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + rd.l = op_read(OPMODE_LONG, aa.d + regs.y.w); //6 + flags_adc_b(); +} + +void bCPU::op_adc_ildpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + rd.l = op_read(OPMODE_LONG, aa.d + regs.y.w); //6 + rd.h = op_read(OPMODE_LONG, aa.d + regs.y.w + 1); //6a + flags_adc_w(); +} + +void bCPU::op_adc_ildpy() { (regs.p.m)?op_adc_ildpyb():op_adc_ildpyw(); } + +/********************** + *** 0x63: adc sr,s *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; sp + [3 ] pbr,pc+1 ; io + [4 ] 0,s+sp ; data low + [4a] 0,s+sp+1 ; data high [1] +*/ +void bCPU::op_adc_srb() { + sp = op_read(); //2 + cpu_io(); //3 + rd.l = op_read(OPMODE_SP, sp); //4 + flags_adc_b(); +} + +void bCPU::op_adc_srw() { + sp = op_read(); //2 + cpu_io(); //3 + rd.l = op_read(OPMODE_SP, sp); //4 + rd.h = op_read(OPMODE_SP, sp + 1); //4a + flags_adc_w(); +} + +void bCPU::op_adc_sr() { (regs.p.m)?op_adc_srb():op_adc_srw(); } + +/************************** + *** 0x73: adc (sr,s),y *** + ************************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; sp + [3 ] pbr,pc+1 ; io + [4 ] 0,s+sp ; aal + [5 ] 0,s+sp+1 ; aah + [6 ] 0,s+sp+1 ; io + [7 ] dbr,aa+y ; data low + [7a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_adc_isryb() { + sp = op_read(); //2 + cpu_io(); //3 + aa.l = op_read(OPMODE_SP, sp); //4 + aa.h = op_read(OPMODE_SP, sp + 1); //5 + cpu_io(); //6 + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //7 + flags_adc_b(); +} + +void bCPU::op_adc_isryw() { + sp = op_read(); //2 + cpu_io(); //3 + aa.l = op_read(OPMODE_SP, sp); //4 + aa.h = op_read(OPMODE_SP, sp + 1); //5 + cpu_io(); //6 + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //7 + rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //7a + flags_adc_w(); +} + +void bCPU::op_adc_isry() { (regs.p.m)?op_adc_isryb():op_adc_isryw(); } diff --git a/src/cpu/bcpu/bcpu_op_and.cpp b/src/cpu/bcpu/bcpu_op_and.cpp new file mode 100644 index 00000000..c6d0f3b3 --- /dev/null +++ b/src/cpu/bcpu/bcpu_op_and.cpp @@ -0,0 +1,474 @@ +void bCPU::flags_and_b() { + regs.p.n = !!(regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void bCPU::flags_and_w() { + regs.p.n = !!(regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +/************************ + *** 0x29: and #const *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; idl + [2a] pbr,pc+2 ; idh [1] +*/ +void bCPU::op_and_constb() { + regs.a.l &= op_read(); //2 + flags_and_b(); +} + +void bCPU::op_and_constw() { + regs.a.l &= op_read(); //2 + regs.a.h &= op_read(); //2a + flags_and_w(); +} + +void bCPU::op_and_const() { (regs.p.m)?op_and_constb():op_and_constw(); } + +/********************** + *** 0x2d: and addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_and_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + regs.a.l &= op_read(OPMODE_DBR, aa.w); //4 + flags_and_b(); +} + +void bCPU::op_and_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + regs.a.l &= op_read(OPMODE_DBR, aa.w); //4 + regs.a.h &= op_read(OPMODE_DBR, aa.w + 1); //4a + flags_and_w(); +} + +void bCPU::op_and_addr() { (regs.p.m)?op_and_addrb():op_and_addrw(); } + +/************************ + *** 0x3d: and addr,x *** + ************************ +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+xl ; io [4] + [4 ] dbr,aa+x ; data low + [4a] dbr,aa+x+1 ; data high [1] +*/ +void bCPU::op_and_addrxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + regs.a.l &= op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + flags_and_b(); +} + +void bCPU::op_and_addrxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + regs.a.l &= op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + regs.a.h &= op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //4a + flags_and_w(); +} + +void bCPU::op_and_addrx() { (regs.p.m)?op_and_addrxb():op_and_addrxw(); } + +/******************** + *** 0x25: and dp *** + ******************** +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] +*/ +void bCPU::op_and_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + regs.a.l &= op_read(OPMODE_DP, dp); //3 + flags_and_b(); +} + +void bCPU::op_and_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + regs.a.l &= op_read(OPMODE_DP, dp); //3 + regs.a.h &= op_read(OPMODE_DP, dp + 1); //3a + flags_and_w(); +} + +void bCPU::op_and_dp() { (regs.p.m)?op_and_dpb():op_and_dpw(); } + +/********************** + *** 0x32: and (dp) *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] dbr,aa ; data low + [5a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_and_idpb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + regs.a.l &= op_read(OPMODE_DBR, aa.w); //5 + flags_and_b(); +} + +void bCPU::op_and_idpw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + regs.a.l &= op_read(OPMODE_DBR, aa.w); //5 + regs.a.h &= op_read(OPMODE_DBR, aa.w + 1); //5 + flags_and_w(); +} + +void bCPU::op_and_idp() { (regs.p.m)?op_and_idpb():op_and_idpw(); } + +/********************** + *** 0x27: and [dp] *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] 0,d+dp+2 ; aab + [6 ] aab,aa ; data low + [6a] aab,aa+1 ; data high [1] +*/ +void bCPU::op_and_ildpb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + regs.a.l &= op_read(OPMODE_LONG, aa.d); //6 + flags_and_b(); +} + +void bCPU::op_and_ildpw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + regs.a.l &= op_read(OPMODE_LONG, aa.d); //6 + regs.a.h &= op_read(OPMODE_LONG, aa.d + 1); //6a + flags_and_w(); +} + +void bCPU::op_and_ildp() { (regs.p.m)?op_and_ildpb():op_and_ildpw(); } + +/********************** + *** 0x2f: and long *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] pbr,pc+3 ; aab + [5 ] aab,aa ; data low + [5a] aab,aa+1 ; data high +*/ +void bCPU::op_and_longb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + regs.a.l &= op_read(OPMODE_LONG, aa.d); //5 + flags_and_b(); +} + +void bCPU::op_and_longw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + regs.a.l &= op_read(OPMODE_LONG, aa.d); //5 + regs.a.h &= op_read(OPMODE_LONG, aa.d + 1); //5a + flags_and_w(); +} + +void bCPU::op_and_long() { (regs.p.m)?op_and_longb():op_and_longw(); } + +/************************ + *** 0x3f: and long,x *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] pbr,pc+3 ; aab + [5 ] aab,aa+x ; data low + [5a] aab,aa+x+1 ; data high +*/ +void bCPU::op_and_longxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + regs.a.l &= op_read(OPMODE_LONG, aa.d + regs.x.w); //5 + flags_and_b(); +} + +void bCPU::op_and_longxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + regs.a.l &= op_read(OPMODE_LONG, aa.d + regs.x.w); //5 + regs.a.h &= op_read(OPMODE_LONG, aa.d + regs.x.w + 1); //5a + flags_and_w(); +} + +void bCPU::op_and_longx() { (regs.p.m)?op_and_longxb():op_and_longxw(); } + +/************************ + *** 0x39: and addr,y *** + ************************ +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+yl ; io [4] + [4 ] dbr,aa+y ; data low + [4a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_and_addryb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + regs.a.l &= op_read(OPMODE_DBR, aa.w + regs.y.w); //4 + flags_and_b(); +} + +void bCPU::op_and_addryw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + regs.a.l &= op_read(OPMODE_DBR, aa.w + regs.y.w); //4 + regs.a.h &= op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //4a + flags_and_w(); +} + +void bCPU::op_and_addry() { (regs.p.m)?op_and_addryb():op_and_addryw(); } + +/********************** + *** 0x35: and dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high +*/ +void bCPU::op_and_dpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + regs.a.l &= op_read(OPMODE_DP, dp + regs.x.w); //4 + flags_and_b(); +} + +void bCPU::op_and_dpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + regs.a.l &= op_read(OPMODE_DP, dp + regs.x.w); //4 + regs.a.h &= op_read(OPMODE_DP, dp + regs.x.w + 1); //4a + flags_and_w(); +} + +void bCPU::op_and_dpx() { (regs.p.m)?op_and_dpxb():op_and_dpxw(); } + +/************************ + *** 0x21: and (dp,x) *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; aal + [5 ] 0,d+dp+x+1 ; aah + [6 ] dbr,aa ; data low + [6a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_and_idpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5 + regs.a.l &= op_read(OPMODE_DBR, aa.w); //6 + flags_and_b(); +} + +void bCPU::op_and_idpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5 + regs.a.l &= op_read(OPMODE_DBR, aa.w); //6 + regs.a.h &= op_read(OPMODE_DBR, aa.w + 1); //6a + flags_and_w(); +} + +void bCPU::op_and_idpx() { (regs.p.m)?op_and_idpxb():op_and_idpxw(); } + +/************************ + *** 0x31: and (dp),y *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [4a] dbr,aah,aal+yl ; io [4] + [5 ] dbr,aa+y ; data low + [5a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_and_idpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + cpu_c4(aa.w, aa.w + regs.y.w); //4a + regs.a.l &= op_read(OPMODE_DBR, aa.w + regs.y.w); //5 + flags_and_b(); +} + +void bCPU::op_and_idpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + cpu_c4(aa.w, aa.w + regs.y.w); //4a + regs.a.l &= op_read(OPMODE_DBR, aa.w + regs.y.w); //5 + regs.a.h &= op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //5a + flags_and_w(); +} + +void bCPU::op_and_idpy() { (regs.p.m)?op_and_idpyb():op_and_idpyw(); } + +/************************ + *** 0x37: and [dp],y *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] 0,d+dp+2 ; aab + [6 ] aab,aa+y ; data low + [6a] aab,aa+y+1 ; data high [1] +*/ +void bCPU::op_and_ildpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + regs.a.l &= op_read(OPMODE_LONG, aa.d + regs.y.w); //6 + flags_and_b(); +} + +void bCPU::op_and_ildpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + regs.a.l &= op_read(OPMODE_LONG, aa.d + regs.y.w); //6 + regs.a.h &= op_read(OPMODE_LONG, aa.d + regs.y.w + 1); //6a + flags_and_w(); +} + +void bCPU::op_and_ildpy() { (regs.p.m)?op_and_ildpyb():op_and_ildpyw(); } + +/********************** + *** 0x23: and sr,s *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; sp + [3 ] pbr,pc+1 ; io + [4 ] 0,s+sp ; data low + [4a] 0,s+sp+1 ; data high [1] +*/ +void bCPU::op_and_srb() { + sp = op_read(); //2 + cpu_io(); //3 + regs.a.l &= op_read(OPMODE_SP, sp); //4 + flags_and_b(); +} + +void bCPU::op_and_srw() { + sp = op_read(); //2 + cpu_io(); //3 + regs.a.l &= op_read(OPMODE_SP, sp); //4 + regs.a.h &= op_read(OPMODE_SP, sp + 1); //4a + flags_and_w(); +} + +void bCPU::op_and_sr() { (regs.p.m)?op_and_srb():op_and_srw(); } + +/************************** + *** 0x33: and (sr,s),y *** + ************************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; sp + [3 ] pbr,pc+1 ; io + [4 ] 0,s+sp ; aal + [5 ] 0,s+sp+1 ; aah + [6 ] 0,s+sp+1 ; io + [7 ] dbr,aa+y ; data low + [7a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_and_isryb() { + sp = op_read(); //2 + cpu_io(); //3 + aa.l = op_read(OPMODE_SP, sp); //4 + aa.h = op_read(OPMODE_SP, sp + 1); //5 + cpu_io(); //6 + regs.a.l &= op_read(OPMODE_DBR, aa.w + regs.y.w); //7 + flags_and_b(); +} + +void bCPU::op_and_isryw() { + sp = op_read(); //2 + cpu_io(); //3 + aa.l = op_read(OPMODE_SP, sp); //4 + aa.h = op_read(OPMODE_SP, sp + 1); //5 + cpu_io(); //6 + regs.a.l &= op_read(OPMODE_DBR, aa.w + regs.y.w); //7 + regs.a.h &= op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //7a + flags_and_w(); +} + +void bCPU::op_and_isry() { (regs.p.m)?op_and_isryb():op_and_isryw(); } diff --git a/src/cpu/bcpu/bcpu_op_cmp.cpp b/src/cpu/bcpu/bcpu_op_cmp.cpp new file mode 100644 index 00000000..af58527a --- /dev/null +++ b/src/cpu/bcpu/bcpu_op_cmp.cpp @@ -0,0 +1,478 @@ +void bCPU::flags_cmp_b() { +int32 r = regs.a.l - rd.l; + regs.p.n = !!(r & 0x80); + regs.p.z = ((uint8)r == 0); + regs.p.c = (r >= 0); +} + +void bCPU::flags_cmp_w() { +int32 r = regs.a.w - rd.w; + regs.p.n = !!(r & 0x8000); + regs.p.z = ((uint16)r == 0); + regs.p.c = (r >= 0); +} + +/************************ + *** 0xc9: cmp #const *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; idl + [2a] pbr,pc+2 ; idh [1] +*/ +void bCPU::op_cmp_constb() { + rd.l = op_read(); //2 + flags_cmp_b(); +} + +void bCPU::op_cmp_constw() { + rd.l = op_read(); //2 + rd.h = op_read(); //2a + flags_cmp_w(); +} + +void bCPU::op_cmp_const() { (regs.p.m)?op_cmp_constb():op_cmp_constw(); } + +/********************** + *** 0xcd: cmp addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_cmp_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + flags_cmp_b(); +} + +void bCPU::op_cmp_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a + flags_cmp_w(); +} + +void bCPU::op_cmp_addr() { (regs.p.m)?op_cmp_addrb():op_cmp_addrw(); } + +/************************ + *** 0xdd: cmp addr,x *** + ************************ +cycles: + [1 ] pbr,pc ; opercmp + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+xl ; io [4] + [4 ] dbr,aa+x ; data low + [4a] dbr,aa+x+1 ; data high [1] +*/ +void bCPU::op_cmp_addrxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + flags_cmp_b(); +} + +void bCPU::op_cmp_addrxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //4a + flags_cmp_w(); +} + +void bCPU::op_cmp_addrx() { (regs.p.m)?op_cmp_addrxb():op_cmp_addrxw(); } + +/******************** + *** 0xc5: cmp dp *** + ******************** +cycles: + [1 ] pbr,pc ; opercmp + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] +*/ +void bCPU::op_cmp_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + flags_cmp_b(); +} + +void bCPU::op_cmp_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + rd.h = op_read(OPMODE_DP, dp + 1); //3a + flags_cmp_w(); +} + +void bCPU::op_cmp_dp() { (regs.p.m)?op_cmp_dpb():op_cmp_dpw(); } + +/********************** + *** 0xd2: cmp (dp) *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] dbr,aa ; data low + [5a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_cmp_idpb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + rd.l = op_read(OPMODE_DBR, aa.w); //5 + flags_cmp_b(); +} + +void bCPU::op_cmp_idpw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + rd.l = op_read(OPMODE_DBR, aa.w); //5 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //5 + flags_cmp_w(); +} + +void bCPU::op_cmp_idp() { (regs.p.m)?op_cmp_idpb():op_cmp_idpw(); } + +/********************** + *** 0xc7: cmp [dp] *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] 0,d+dp+2 ; aab + [6 ] aab,aa ; data low + [6a] aab,aa+1 ; data high [1] +*/ +void bCPU::op_cmp_ildpb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + rd.l = op_read(OPMODE_LONG, aa.d); //6 + flags_cmp_b(); +} + +void bCPU::op_cmp_ildpw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + rd.l = op_read(OPMODE_LONG, aa.d); //6 + rd.h = op_read(OPMODE_LONG, aa.d + 1); //6a + flags_cmp_w(); +} + +void bCPU::op_cmp_ildp() { (regs.p.m)?op_cmp_ildpb():op_cmp_ildpw(); } + +/********************** + *** 0xcf: cmp long *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] pbr,pc+3 ; aab + [5 ] aab,aa ; data low + [5a] aab,aa+1 ; data high +*/ +void bCPU::op_cmp_longb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + rd.l = op_read(OPMODE_LONG, aa.d); //5 + flags_cmp_b(); +} + +void bCPU::op_cmp_longw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + rd.l = op_read(OPMODE_LONG, aa.d); //5 + rd.h = op_read(OPMODE_LONG, aa.d + 1); //5a + flags_cmp_w(); +} + +void bCPU::op_cmp_long() { (regs.p.m)?op_cmp_longb():op_cmp_longw(); } + +/************************ + *** 0xdf: cmp long,x *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] pbr,pc+3 ; aab + [5 ] aab,aa+x ; data low + [5a] aab,aa+x+1 ; data high +*/ +void bCPU::op_cmp_longxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + rd.l = op_read(OPMODE_LONG, aa.d + regs.x.w); //5 + flags_cmp_b(); +} + +void bCPU::op_cmp_longxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + rd.l = op_read(OPMODE_LONG, aa.d + regs.x.w); //5 + rd.h = op_read(OPMODE_LONG, aa.d + regs.x.w + 1); //5a + flags_cmp_w(); +} + +void bCPU::op_cmp_longx() { (regs.p.m)?op_cmp_longxb():op_cmp_longxw(); } + +/************************ + *** 0xd9: cmp addr,y *** + ************************ +cycles: + [1 ] pbr,pc ; opercmp + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+yl ; io [4] + [4 ] dbr,aa+y ; data low + [4a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_cmp_addryb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //4 + flags_cmp_b(); +} + +void bCPU::op_cmp_addryw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //4a + flags_cmp_w(); +} + +void bCPU::op_cmp_addry() { (regs.p.m)?op_cmp_addryb():op_cmp_addryw(); } + +/********************** + *** 0xd5: cmp dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high +*/ +void bCPU::op_cmp_dpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + flags_cmp_b(); +} + +void bCPU::op_cmp_dpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //4a + flags_cmp_w(); +} + +void bCPU::op_cmp_dpx() { (regs.p.m)?op_cmp_dpxb():op_cmp_dpxw(); } + +/************************ + *** 0xc1: cmp (dp,x) *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; aal + [5 ] 0,d+dp+x+1 ; aah + [6 ] dbr,aa ; data low + [6a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_cmp_idpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5 + rd.l = op_read(OPMODE_DBR, aa.w); //6 + flags_cmp_b(); +} + +void bCPU::op_cmp_idpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5 + rd.l = op_read(OPMODE_DBR, aa.w); //6 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //6a + flags_cmp_w(); +} + +void bCPU::op_cmp_idpx() { (regs.p.m)?op_cmp_idpxb():op_cmp_idpxw(); } + +/************************ + *** 0xd1: cmp (dp),y *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [4a] dbr,aah,aal+yl ; io [4] + [5 ] dbr,aa+y ; data low + [5a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_cmp_idpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + cpu_c4(aa.w, aa.w + regs.y.w); //4a + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //5 + flags_cmp_b(); +} + +void bCPU::op_cmp_idpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + cpu_c4(aa.w, aa.w + regs.y.w); //4a + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //5 + rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //5a + flags_cmp_w(); +} + +void bCPU::op_cmp_idpy() { (regs.p.m)?op_cmp_idpyb():op_cmp_idpyw(); } + +/************************ + *** 0xd7: cmp [dp],y *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] 0,d+dp+2 ; aab + [6 ] aab,aa+y ; data low + [6a] aab,aa+y+1 ; data high [1] +*/ +void bCPU::op_cmp_ildpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + rd.l = op_read(OPMODE_LONG, aa.d + regs.y.w); //6 + flags_cmp_b(); +} + +void bCPU::op_cmp_ildpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + rd.l = op_read(OPMODE_LONG, aa.d + regs.y.w); //6 + rd.h = op_read(OPMODE_LONG, aa.d + regs.y.w + 1); //6a + flags_cmp_w(); +} + +void bCPU::op_cmp_ildpy() { (regs.p.m)?op_cmp_ildpyb():op_cmp_ildpyw(); } + +/********************** + *** 0xc3: cmp sr,s *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; sp + [3 ] pbr,pc+1 ; io + [4 ] 0,s+sp ; data low + [4a] 0,s+sp+1 ; data high [1] +*/ +void bCPU::op_cmp_srb() { + sp = op_read(); //2 + cpu_io(); //3 + rd.l = op_read(OPMODE_SP, sp); //4 + flags_cmp_b(); +} + +void bCPU::op_cmp_srw() { + sp = op_read(); //2 + cpu_io(); //3 + rd.l = op_read(OPMODE_SP, sp); //4 + rd.h = op_read(OPMODE_SP, sp + 1); //4a + flags_cmp_w(); +} + +void bCPU::op_cmp_sr() { (regs.p.m)?op_cmp_srb():op_cmp_srw(); } + +/************************** + *** 0xd3: cmp (sr,s),y *** + ************************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; sp + [3 ] pbr,pc+1 ; io + [4 ] 0,s+sp ; aal + [5 ] 0,s+sp+1 ; aah + [6 ] 0,s+sp+1 ; io + [7 ] dbr,aa+y ; data low + [7a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_cmp_isryb() { + sp = op_read(); //2 + cpu_io(); //3 + aa.l = op_read(OPMODE_SP, sp); //4 + aa.h = op_read(OPMODE_SP, sp + 1); //5 + cpu_io(); //6 + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //7 + flags_cmp_b(); +} + +void bCPU::op_cmp_isryw() { + sp = op_read(); //2 + cpu_io(); //3 + aa.l = op_read(OPMODE_SP, sp); //4 + aa.h = op_read(OPMODE_SP, sp + 1); //5 + cpu_io(); //6 + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //7 + rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //7a + flags_cmp_w(); +} + +void bCPU::op_cmp_isry() { (regs.p.m)?op_cmp_isryb():op_cmp_isryw(); } diff --git a/src/cpu/bcpu/bcpu_op_eor.cpp b/src/cpu/bcpu/bcpu_op_eor.cpp new file mode 100644 index 00000000..0f444c14 --- /dev/null +++ b/src/cpu/bcpu/bcpu_op_eor.cpp @@ -0,0 +1,474 @@ +void bCPU::flags_eor_b() { + regs.p.n = !!(regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void bCPU::flags_eor_w() { + regs.p.n = !!(regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +/************************ + *** 0x49: eor #const *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; idl + [2a] pbr,pc+2 ; idh [1] +*/ +void bCPU::op_eor_constb() { + regs.a.l ^= op_read(); //2 + flags_eor_b(); +} + +void bCPU::op_eor_constw() { + regs.a.l ^= op_read(); //2 + regs.a.h ^= op_read(); //2a + flags_eor_w(); +} + +void bCPU::op_eor_const() { (regs.p.m)?op_eor_constb():op_eor_constw(); } + +/********************** + *** 0x4d: eor addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_eor_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + regs.a.l ^= op_read(OPMODE_DBR, aa.w); //4 + flags_eor_b(); +} + +void bCPU::op_eor_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + regs.a.l ^= op_read(OPMODE_DBR, aa.w); //4 + regs.a.h ^= op_read(OPMODE_DBR, aa.w + 1); //4a + flags_eor_w(); +} + +void bCPU::op_eor_addr() { (regs.p.m)?op_eor_addrb():op_eor_addrw(); } + +/************************ + *** 0x5d: eor addr,x *** + ************************ +cycles: + [1 ] pbr,pc ; opereor + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+xl ; io [4] + [4 ] dbr,aa+x ; data low + [4a] dbr,aa+x+1 ; data high [1] +*/ +void bCPU::op_eor_addrxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + regs.a.l ^= op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + flags_eor_b(); +} + +void bCPU::op_eor_addrxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + regs.a.l ^= op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + regs.a.h ^= op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //4a + flags_eor_w(); +} + +void bCPU::op_eor_addrx() { (regs.p.m)?op_eor_addrxb():op_eor_addrxw(); } + +/******************** + *** 0x45: eor dp *** + ******************** +cycles: + [1 ] pbr,pc ; opereor + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] +*/ +void bCPU::op_eor_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + regs.a.l ^= op_read(OPMODE_DP, dp); //3 + flags_eor_b(); +} + +void bCPU::op_eor_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + regs.a.l ^= op_read(OPMODE_DP, dp); //3 + regs.a.h ^= op_read(OPMODE_DP, dp + 1); //3a + flags_eor_w(); +} + +void bCPU::op_eor_dp() { (regs.p.m)?op_eor_dpb():op_eor_dpw(); } + +/********************** + *** 0x52: eor (dp) *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] dbr,aa ; data low + [5a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_eor_idpb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + regs.a.l ^= op_read(OPMODE_DBR, aa.w); //5 + flags_eor_b(); +} + +void bCPU::op_eor_idpw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + regs.a.l ^= op_read(OPMODE_DBR, aa.w); //5 + regs.a.h ^= op_read(OPMODE_DBR, aa.w + 1); //5 + flags_eor_w(); +} + +void bCPU::op_eor_idp() { (regs.p.m)?op_eor_idpb():op_eor_idpw(); } + +/********************** + *** 0x47: eor [dp] *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] 0,d+dp+2 ; aab + [6 ] aab,aa ; data low + [6a] aab,aa+1 ; data high [1] +*/ +void bCPU::op_eor_ildpb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + regs.a.l ^= op_read(OPMODE_LONG, aa.d); //6 + flags_eor_b(); +} + +void bCPU::op_eor_ildpw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + regs.a.l ^= op_read(OPMODE_LONG, aa.d); //6 + regs.a.h ^= op_read(OPMODE_LONG, aa.d + 1); //6a + flags_eor_w(); +} + +void bCPU::op_eor_ildp() { (regs.p.m)?op_eor_ildpb():op_eor_ildpw(); } + +/********************** + *** 0x4f: eor long *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] pbr,pc+3 ; aab + [5 ] aab,aa ; data low + [5a] aab,aa+1 ; data high +*/ +void bCPU::op_eor_longb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + regs.a.l ^= op_read(OPMODE_LONG, aa.d); //5 + flags_eor_b(); +} + +void bCPU::op_eor_longw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + regs.a.l ^= op_read(OPMODE_LONG, aa.d); //5 + regs.a.h ^= op_read(OPMODE_LONG, aa.d + 1); //5a + flags_eor_w(); +} + +void bCPU::op_eor_long() { (regs.p.m)?op_eor_longb():op_eor_longw(); } + +/************************ + *** 0x5f: eor long,x *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] pbr,pc+3 ; aab + [5 ] aab,aa+x ; data low + [5a] aab,aa+x+1 ; data high +*/ +void bCPU::op_eor_longxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + regs.a.l ^= op_read(OPMODE_LONG, aa.d + regs.x.w); //5 + flags_eor_b(); +} + +void bCPU::op_eor_longxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + regs.a.l ^= op_read(OPMODE_LONG, aa.d + regs.x.w); //5 + regs.a.h ^= op_read(OPMODE_LONG, aa.d + regs.x.w + 1); //5a + flags_eor_w(); +} + +void bCPU::op_eor_longx() { (regs.p.m)?op_eor_longxb():op_eor_longxw(); } + +/************************ + *** 0x59: eor addr,y *** + ************************ +cycles: + [1 ] pbr,pc ; opereor + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+yl ; io [4] + [4 ] dbr,aa+y ; data low + [4a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_eor_addryb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + regs.a.l ^= op_read(OPMODE_DBR, aa.w + regs.y.w); //4 + flags_eor_b(); +} + +void bCPU::op_eor_addryw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + regs.a.l ^= op_read(OPMODE_DBR, aa.w + regs.y.w); //4 + regs.a.h ^= op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //4a + flags_eor_w(); +} + +void bCPU::op_eor_addry() { (regs.p.m)?op_eor_addryb():op_eor_addryw(); } + +/********************** + *** 0x55: eor dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high +*/ +void bCPU::op_eor_dpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + regs.a.l ^= op_read(OPMODE_DP, dp + regs.x.w); //4 + flags_eor_b(); +} + +void bCPU::op_eor_dpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + regs.a.l ^= op_read(OPMODE_DP, dp + regs.x.w); //4 + regs.a.h ^= op_read(OPMODE_DP, dp + regs.x.w + 1); //4a + flags_eor_w(); +} + +void bCPU::op_eor_dpx() { (regs.p.m)?op_eor_dpxb():op_eor_dpxw(); } + +/************************ + *** 0x41: eor (dp,x) *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; aal + [5 ] 0,d+dp+x+1 ; aah + [6 ] dbr,aa ; data low + [6a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_eor_idpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5 + regs.a.l ^= op_read(OPMODE_DBR, aa.w); //6 + flags_eor_b(); +} + +void bCPU::op_eor_idpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5 + regs.a.l ^= op_read(OPMODE_DBR, aa.w); //6 + regs.a.h ^= op_read(OPMODE_DBR, aa.w + 1); //6a + flags_eor_w(); +} + +void bCPU::op_eor_idpx() { (regs.p.m)?op_eor_idpxb():op_eor_idpxw(); } + +/************************ + *** 0x51: eor (dp),y *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [4a] dbr,aah,aal+yl ; io [4] + [5 ] dbr,aa+y ; data low + [5a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_eor_idpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + cpu_c4(aa.w, aa.w + regs.y.w); //4a + regs.a.l ^= op_read(OPMODE_DBR, aa.w + regs.y.w); //5 + flags_eor_b(); +} + +void bCPU::op_eor_idpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + cpu_c4(aa.w, aa.w + regs.y.w); //4a + regs.a.l ^= op_read(OPMODE_DBR, aa.w + regs.y.w); //5 + regs.a.h ^= op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //5a + flags_eor_w(); +} + +void bCPU::op_eor_idpy() { (regs.p.m)?op_eor_idpyb():op_eor_idpyw(); } + +/************************ + *** 0x57: eor [dp],y *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] 0,d+dp+2 ; aab + [6 ] aab,aa+y ; data low + [6a] aab,aa+y+1 ; data high [1] +*/ +void bCPU::op_eor_ildpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + regs.a.l ^= op_read(OPMODE_LONG, aa.d + regs.y.w); //6 + flags_eor_b(); +} + +void bCPU::op_eor_ildpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + regs.a.l ^= op_read(OPMODE_LONG, aa.d + regs.y.w); //6 + regs.a.h ^= op_read(OPMODE_LONG, aa.d + regs.y.w + 1); //6a + flags_eor_w(); +} + +void bCPU::op_eor_ildpy() { (regs.p.m)?op_eor_ildpyb():op_eor_ildpyw(); } + +/********************** + *** 0x43: eor sr,s *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; sp + [3 ] pbr,pc+1 ; io + [4 ] 0,s+sp ; data low + [4a] 0,s+sp+1 ; data high [1] +*/ +void bCPU::op_eor_srb() { + sp = op_read(); //2 + cpu_io(); //3 + regs.a.l ^= op_read(OPMODE_SP, sp); //4 + flags_eor_b(); +} + +void bCPU::op_eor_srw() { + sp = op_read(); //2 + cpu_io(); //3 + regs.a.l ^= op_read(OPMODE_SP, sp); //4 + regs.a.h ^= op_read(OPMODE_SP, sp + 1); //4a + flags_eor_w(); +} + +void bCPU::op_eor_sr() { (regs.p.m)?op_eor_srb():op_eor_srw(); } + +/************************** + *** 0x53: eor (sr,s),y *** + ************************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; sp + [3 ] pbr,pc+1 ; io + [4 ] 0,s+sp ; aal + [5 ] 0,s+sp+1 ; aah + [6 ] 0,s+sp+1 ; io + [7 ] dbr,aa+y ; data low + [7a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_eor_isryb() { + sp = op_read(); //2 + cpu_io(); //3 + aa.l = op_read(OPMODE_SP, sp); //4 + aa.h = op_read(OPMODE_SP, sp + 1); //5 + cpu_io(); //6 + regs.a.l ^= op_read(OPMODE_DBR, aa.w + regs.y.w); //7 + flags_eor_b(); +} + +void bCPU::op_eor_isryw() { + sp = op_read(); //2 + cpu_io(); //3 + aa.l = op_read(OPMODE_SP, sp); //4 + aa.h = op_read(OPMODE_SP, sp + 1); //5 + cpu_io(); //6 + regs.a.l ^= op_read(OPMODE_DBR, aa.w + regs.y.w); //7 + regs.a.h ^= op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //7a + flags_eor_w(); +} + +void bCPU::op_eor_isry() { (regs.p.m)?op_eor_isryb():op_eor_isryw(); } diff --git a/src/cpu/bcpu/bcpu_op_incdec.cpp b/src/cpu/bcpu/bcpu_op_incdec.cpp new file mode 100644 index 00000000..fe34ae2a --- /dev/null +++ b/src/cpu/bcpu/bcpu_op_incdec.cpp @@ -0,0 +1,461 @@ +/***************** + *** 0x1a: inc *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_incb() { + cpu_io(); //2 + regs.a.l++; + regs.p.n = !!(regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void bCPU::op_incw() { + cpu_io(); //2 + regs.a.w++; + regs.p.n = !!(regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +void bCPU::op_inc() { (regs.p.m)?op_incb():op_incw(); } + +/********************** + *** 0xee: inc addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] + [5 ] dbr,aa+1 ; io + [6a] dbr,aa+1 ; data high [1] + [6 ] dbr,aa ; data low +*/ +void bCPU::op_inc_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + rd.l++; + cpu_io(); //5 + op_write(OPMODE_DBR, aa.w, rd.l); //6 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_inc_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a + rd.w++; + cpu_io(); //5 + op_write(OPMODE_DBR, aa.w + 1, rd.h); //6a + op_write(OPMODE_DBR, aa.w, rd.l); //6 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_inc_addr() { (regs.p.m)?op_inc_addrb():op_inc_addrw(); } + +/************************ + *** 0xfe: inc addr,x *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aah,aal+xl ; io + [5 ] dbr,aa+x ; data low + [5a] dbr,aa+x+1 ; data high [1] + [6 ] dbr,aa+x+1 ; io + [7a] dbr,aa+x+1 ; data high [1] + [7 ] dbr,aa+x ; data low +*/ +void bCPU::op_inc_addrxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_io(); //4 + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5 + rd.l++; + cpu_io(); //6 + op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_inc_addrxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_io(); //4 + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5 + rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //5a + rd.w++; + cpu_io(); //6 + op_write(OPMODE_DBR, aa.w + regs.x.w + 1, rd.h); //7a + op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_inc_addrx() { (regs.p.m)?op_inc_addrxb():op_inc_addrxw(); } + +/******************** + *** 0xe6: inc dp *** + ******************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] + [4 ] 0,d+dp+1 ; io + [5a] 0,d+dp+1 ; data high [1] + [5 ] 0,d+dp ; data low +*/ +void bCPU::op_inc_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + rd.l++; + cpu_io(); //4 + op_write(OPMODE_DP, dp, rd.l); //5 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_inc_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + rd.h = op_read(OPMODE_DP, dp + 1); //3a + rd.w++; + cpu_io(); //4 + op_write(OPMODE_DP, dp + 1, rd.h); //5a + op_write(OPMODE_DP, dp, rd.l); //5 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_inc_dp() { (regs.p.m)?op_inc_dpb():op_inc_dpw(); } + +/********************** + *** 0xf6: inc dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high [1] + [5 ] 0,d+dp+x+1 ; io + [6a] 0,d+dp+x+1 ; data high [1] + [6 ] 0,d+dp+x ; data low +*/ +void bCPU::op_inc_dpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + rd.l++; + cpu_io(); //5 + op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_inc_dpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //4a + rd.w++; + cpu_io(); //5 + op_write(OPMODE_DP, dp + regs.x.w + 1, rd.h); //6a + op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_inc_dpx() { (regs.p.m)?op_inc_dpxb():op_inc_dpxw(); } + +/***************** + *** 0xe8: inx *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_inxb() { + cpu_io(); //2 + regs.x.l++; + regs.p.n = !!(regs.x.l & 0x80); + regs.p.z = (regs.x.l == 0); +} + +void bCPU::op_inxw() { + cpu_io(); //2 + regs.x.w++; + regs.p.n = !!(regs.x.w & 0x8000); + regs.p.z = (regs.x.w == 0); +} + +void bCPU::op_inx() { (regs.p.x)?op_inxb():op_inxw(); } + +/***************** + *** 0xc8: iny *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_inyb() { + cpu_io(); //2 + regs.y.l++; + regs.p.n = !!(regs.y.l & 0x80); + regs.p.z = (regs.y.l == 0); +} + +void bCPU::op_inyw() { + cpu_io(); //2 + regs.y.w++; + regs.p.n = !!(regs.y.w & 0x8000); + regs.p.z = (regs.y.w == 0); +} + +void bCPU::op_iny() { (regs.p.x)?op_inyb():op_inyw(); } + +/***************** + *** 0x3a: dec *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_decb() { + cpu_io(); //2 + regs.a.l--; + regs.p.n = !!(regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void bCPU::op_decw() { + cpu_io(); //2 + regs.a.w--; + regs.p.n = !!(regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +void bCPU::op_dec() { (regs.p.m)?op_decb():op_decw(); } + +/********************** + *** 0xce: dec addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] + [5 ] dbr,aa+1 ; io + [6a] dbr,aa+1 ; data high [1] + [6 ] dbr,aa ; data low +*/ +void bCPU::op_dec_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + rd.l--; + cpu_io(); //5 + op_write(OPMODE_DBR, aa.w, rd.l); //6 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_dec_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a + rd.w--; + cpu_io(); //5 + op_write(OPMODE_DBR, aa.w + 1, rd.h); //6a + op_write(OPMODE_DBR, aa.w, rd.l); //6 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_dec_addr() { (regs.p.m)?op_dec_addrb():op_dec_addrw(); } + +/************************ + *** 0xde: dec addr,x *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aah,aal+xl ; io + [5 ] dbr,aa+x ; data low + [5a] dbr,aa+x+1 ; data high [1] + [6 ] dbr,aa+x+1 ; io + [7a] dbr,aa+x+1 ; data high [1] + [7 ] dbr,aa+x ; data low +*/ +void bCPU::op_dec_addrxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_io(); //4 + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5 + rd.l--; + cpu_io(); //6 + op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_dec_addrxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_io(); //4 + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5 + rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //5a + rd.w--; + cpu_io(); //6 + op_write(OPMODE_DBR, aa.w + regs.x.w + 1, rd.h); //7a + op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_dec_addrx() { (regs.p.m)?op_dec_addrxb():op_dec_addrxw(); } + +/******************** + *** 0xc6: dec dp *** + ******************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] + [4 ] 0,d+dp+1 ; io + [5a] 0,d+dp+1 ; data high [1] + [5 ] 0,d+dp ; data low +*/ +void bCPU::op_dec_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + rd.l--; + cpu_io(); //4 + op_write(OPMODE_DP, dp, rd.l); //5 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_dec_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + rd.h = op_read(OPMODE_DP, dp + 1); //3a + rd.w--; + cpu_io(); //4 + op_write(OPMODE_DP, dp + 1, rd.h); //5a + op_write(OPMODE_DP, dp, rd.l); //5 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_dec_dp() { (regs.p.m)?op_dec_dpb():op_dec_dpw(); } + +/********************** + *** 0xd6: dec dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high [1] + [5 ] 0,d+dp+x+1 ; io + [6a] 0,d+dp+x+1 ; data high [1] + [6 ] 0,d+dp+x ; data low +*/ +void bCPU::op_dec_dpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + rd.l--; + cpu_io(); //5 + op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_dec_dpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //4a + rd.w--; + cpu_io(); //5 + op_write(OPMODE_DP, dp + regs.x.w + 1, rd.h); //6a + op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_dec_dpx() { (regs.p.m)?op_dec_dpxb():op_dec_dpxw(); } + +/***************** + *** 0xca: dex *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_dexb() { + cpu_io(); //2 + regs.x.l--; + regs.p.n = !!(regs.x.l & 0x80); + regs.p.z = (regs.x.l == 0); +} + +void bCPU::op_dexw() { + cpu_io(); //2 + regs.x.w--; + regs.p.n = !!(regs.x.w & 0x8000); + regs.p.z = (regs.x.w == 0); +} + +void bCPU::op_dex() { (regs.p.x)?op_dexb():op_dexw(); } + +/***************** + *** 0x88: dey *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_deyb() { + cpu_io(); //2 + regs.y.l--; + regs.p.n = !!(regs.y.l & 0x80); + regs.p.z = (regs.y.l == 0); +} + +void bCPU::op_deyw() { + cpu_io(); //2 + regs.y.w--; + regs.p.n = !!(regs.y.w & 0x8000); + regs.p.z = (regs.y.w == 0); +} + +void bCPU::op_dey() { (regs.p.x)?op_deyb():op_deyw(); } diff --git a/src/cpu/bcpu/bcpu_op_lda.cpp b/src/cpu/bcpu/bcpu_op_lda.cpp new file mode 100644 index 00000000..568a0cc8 --- /dev/null +++ b/src/cpu/bcpu/bcpu_op_lda.cpp @@ -0,0 +1,474 @@ +void bCPU::flags_lda_b() { + regs.p.n = !!(regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void bCPU::flags_lda_w() { + regs.p.n = !!(regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +/************************ + *** 0xa9: lda #const *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; idl + [2a] pbr,pc+2 ; idh [1] +*/ +void bCPU::op_lda_constb() { + regs.a.l = op_read(); //2 + flags_lda_b(); +} + +void bCPU::op_lda_constw() { + regs.a.l = op_read(); //2 + regs.a.h = op_read(); //2a + flags_lda_w(); +} + +void bCPU::op_lda_const() { (regs.p.m)?op_lda_constb():op_lda_constw(); } + +/********************** + *** 0xad: lda addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_lda_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + regs.a.l = op_read(OPMODE_DBR, aa.w); //4 + flags_lda_b(); +} + +void bCPU::op_lda_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + regs.a.l = op_read(OPMODE_DBR, aa.w); //4 + regs.a.h = op_read(OPMODE_DBR, aa.w + 1); //4a + flags_lda_w(); +} + +void bCPU::op_lda_addr() { (regs.p.m)?op_lda_addrb():op_lda_addrw(); } + +/************************ + *** 0xbd: lda addr,x *** + ************************ +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+xl ; io [4] + [4 ] dbr,aa+x ; data low + [4a] dbr,aa+x+1 ; data high [1] +*/ +void bCPU::op_lda_addrxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + regs.a.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + flags_lda_b(); +} + +void bCPU::op_lda_addrxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + regs.a.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + regs.a.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //4a + flags_lda_w(); +} + +void bCPU::op_lda_addrx() { (regs.p.m)?op_lda_addrxb():op_lda_addrxw(); } + +/******************** + *** 0xa5: lda dp *** + ******************** +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] +*/ +void bCPU::op_lda_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + regs.a.l = op_read(OPMODE_DP, dp); //3 + flags_lda_b(); +} + +void bCPU::op_lda_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + regs.a.l = op_read(OPMODE_DP, dp); //3 + regs.a.h = op_read(OPMODE_DP, dp + 1); //3a + flags_lda_w(); +} + +void bCPU::op_lda_dp() { (regs.p.m)?op_lda_dpb():op_lda_dpw(); } + +/********************** + *** 0xb2: lda (dp) *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] dbr,aa ; data low + [5a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_lda_idpb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + regs.a.l = op_read(OPMODE_DBR, aa.w); //5 + flags_lda_b(); +} + +void bCPU::op_lda_idpw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + regs.a.l = op_read(OPMODE_DBR, aa.w); //5 + regs.a.h = op_read(OPMODE_DBR, aa.w + 1); //5 + flags_lda_w(); +} + +void bCPU::op_lda_idp() { (regs.p.m)?op_lda_idpb():op_lda_idpw(); } + +/********************** + *** 0xa7: lda [dp] *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] 0,d+dp+2 ; aab + [6 ] aab,aa ; data low + [6a] aab,aa+1 ; data high [1] +*/ +void bCPU::op_lda_ildpb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + regs.a.l = op_read(OPMODE_LONG, aa.d); //6 + flags_lda_b(); +} + +void bCPU::op_lda_ildpw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + regs.a.l = op_read(OPMODE_LONG, aa.d); //6 + regs.a.h = op_read(OPMODE_LONG, aa.d + 1); //6a + flags_lda_w(); +} + +void bCPU::op_lda_ildp() { (regs.p.m)?op_lda_ildpb():op_lda_ildpw(); } + +/********************** + *** 0xaf: lda long *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] pbr,pc+3 ; aab + [5 ] aab,aa ; data low + [5a] aab,aa+1 ; data high +*/ +void bCPU::op_lda_longb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + regs.a.l = op_read(OPMODE_LONG, aa.d); //5 + flags_lda_b(); +} + +void bCPU::op_lda_longw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + regs.a.l = op_read(OPMODE_LONG, aa.d); //5 + regs.a.h = op_read(OPMODE_LONG, aa.d + 1); //5a + flags_lda_w(); +} + +void bCPU::op_lda_long() { (regs.p.m)?op_lda_longb():op_lda_longw(); } + +/************************ + *** 0xbf: lda long,x *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] pbr,pc+3 ; aab + [5 ] aab,aa+x ; data low + [5a] aab,aa+x+1 ; data high +*/ +void bCPU::op_lda_longxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + regs.a.l = op_read(OPMODE_LONG, aa.d + regs.x.w); //5 + flags_lda_b(); +} + +void bCPU::op_lda_longxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + regs.a.l = op_read(OPMODE_LONG, aa.d + regs.x.w); //5 + regs.a.h = op_read(OPMODE_LONG, aa.d + regs.x.w + 1); //5a + flags_lda_w(); +} + +void bCPU::op_lda_longx() { (regs.p.m)?op_lda_longxb():op_lda_longxw(); } + +/************************ + *** 0xb9: lda addr,y *** + ************************ +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+yl ; io [4] + [4 ] dbr,aa+y ; data low + [4a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_lda_addryb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + regs.a.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //4 + flags_lda_b(); +} + +void bCPU::op_lda_addryw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + regs.a.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //4 + regs.a.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //4a + flags_lda_w(); +} + +void bCPU::op_lda_addry() { (regs.p.m)?op_lda_addryb():op_lda_addryw(); } + +/********************** + *** 0xb5: lda dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high +*/ +void bCPU::op_lda_dpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + regs.a.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + flags_lda_b(); +} + +void bCPU::op_lda_dpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + regs.a.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + regs.a.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //4a + flags_lda_w(); +} + +void bCPU::op_lda_dpx() { (regs.p.m)?op_lda_dpxb():op_lda_dpxw(); } + +/************************ + *** 0xa1: lda (dp,x) *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; aal + [5 ] 0,d+dp+x+1 ; aah + [6 ] dbr,aa ; data low + [6a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_lda_idpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5 + regs.a.l = op_read(OPMODE_DBR, aa.w); //6 + flags_lda_b(); +} + +void bCPU::op_lda_idpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5 + regs.a.l = op_read(OPMODE_DBR, aa.w); //6 + regs.a.h = op_read(OPMODE_DBR, aa.w + 1); //6a + flags_lda_w(); +} + +void bCPU::op_lda_idpx() { (regs.p.m)?op_lda_idpxb():op_lda_idpxw(); } + +/************************ + *** 0xb1: lda (dp),y *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [4a] dbr,aah,aal+yl ; io [4] + [5 ] dbr,aa+y ; data low + [5a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_lda_idpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + cpu_c4(aa.w, aa.w + regs.y.w); //4a + regs.a.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //5 + flags_lda_b(); +} + +void bCPU::op_lda_idpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + cpu_c4(aa.w, aa.w + regs.y.w); //4a + regs.a.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //5 + regs.a.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //5a + flags_lda_w(); +} + +void bCPU::op_lda_idpy() { (regs.p.m)?op_lda_idpyb():op_lda_idpyw(); } + +/************************ + *** 0xb7: lda [dp],y *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] 0,d+dp+2 ; aab + [6 ] aab,aa+y ; data low + [6a] aab,aa+y+1 ; data high [1] +*/ +void bCPU::op_lda_ildpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + regs.a.l = op_read(OPMODE_LONG, aa.d + regs.y.w); //6 + flags_lda_b(); +} + +void bCPU::op_lda_ildpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + regs.a.l = op_read(OPMODE_LONG, aa.d + regs.y.w); //6 + regs.a.h = op_read(OPMODE_LONG, aa.d + regs.y.w + 1); //6a + flags_lda_w(); +} + +void bCPU::op_lda_ildpy() { (regs.p.m)?op_lda_ildpyb():op_lda_ildpyw(); } + +/********************** + *** 0xa3: lda sr,s *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; sp + [3 ] pbr,pc+1 ; io + [4 ] 0,s+sp ; data low + [4a] 0,s+sp+1 ; data high [1] +*/ +void bCPU::op_lda_srb() { + sp = op_read(); //2 + cpu_io(); //3 + regs.a.l = op_read(OPMODE_SP, sp); //4 + flags_lda_b(); +} + +void bCPU::op_lda_srw() { + sp = op_read(); //2 + cpu_io(); //3 + regs.a.l = op_read(OPMODE_SP, sp); //4 + regs.a.h = op_read(OPMODE_SP, sp + 1); //4a + flags_lda_w(); +} + +void bCPU::op_lda_sr() { (regs.p.m)?op_lda_srb():op_lda_srw(); } + +/************************** + *** 0xb3: lda (sr,s),y *** + ************************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; sp + [3 ] pbr,pc+1 ; io + [4 ] 0,s+sp ; aal + [5 ] 0,s+sp+1 ; aah + [6 ] 0,s+sp+1 ; io + [7 ] dbr,aa+y ; data low + [7a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_lda_isryb() { + sp = op_read(); //2 + cpu_io(); //3 + aa.l = op_read(OPMODE_SP, sp); //4 + aa.h = op_read(OPMODE_SP, sp + 1); //5 + cpu_io(); //6 + regs.a.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //7 + flags_lda_b(); +} + +void bCPU::op_lda_isryw() { + sp = op_read(); //2 + cpu_io(); //3 + aa.l = op_read(OPMODE_SP, sp); //4 + aa.h = op_read(OPMODE_SP, sp + 1); //5 + cpu_io(); //6 + regs.a.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //7 + regs.a.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //7a + flags_lda_w(); +} + +void bCPU::op_lda_isry() { (regs.p.m)?op_lda_isryb():op_lda_isryw(); } diff --git a/src/cpu/bcpu/bcpu_op_misc.cpp b/src/cpu/bcpu/bcpu_op_misc.cpp new file mode 100644 index 00000000..fab75e4c --- /dev/null +++ b/src/cpu/bcpu/bcpu_op_misc.cpp @@ -0,0 +1,1614 @@ +void bCPU::flags_bit_b() { + regs.p.n = !!(rd.l & 0x80); + regs.p.v = !!(rd.l & 0x40); + regs.p.z = ((rd.l & regs.a.l) == 0); +} + +void bCPU::flags_bit_w() { + regs.p.n = !!(rd.w & 0x8000); + regs.p.v = !!(rd.w & 0x4000); + regs.p.z = ((rd.w & regs.a.w) == 0); +} + +/************************ + *** 0x89: bit #const *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; idl + [2a] pbr,pc+2 ; idh [1] +*/ +void bCPU::op_bit_constb() { + rd.l = op_read(); //2 + flags_bit_b(); +} + +void bCPU::op_bit_constw() { + rd.l = op_read(); //2 + rd.h = op_read(); //2a + flags_bit_w(); +} + +void bCPU::op_bit_const() { (regs.p.m)?op_bit_constb():op_bit_constw(); } + +/********************** + *** 0x2c: bit addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_bit_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + flags_bit_b(); +} + +void bCPU::op_bit_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a + flags_bit_w(); +} + +void bCPU::op_bit_addr() { (regs.p.m)?op_bit_addrb():op_bit_addrw(); } + +/************************ + *** 0x3c: bit addr,x *** + ************************ +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+xl ; io [4] + [4 ] dbr,aa+x ; data low + [4a] dbr,aa+x+1 ; data high [1] +*/ +void bCPU::op_bit_addrxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + flags_bit_b(); +} + +void bCPU::op_bit_addrxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //4a + flags_bit_w(); +} + +void bCPU::op_bit_addrx() { (regs.p.m)?op_bit_addrxb():op_bit_addrxw(); } + +/******************** + *** 0x24: bit dp *** + ******************** +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] +*/ +void bCPU::op_bit_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + flags_bit_b(); +} + +void bCPU::op_bit_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + rd.h = op_read(OPMODE_DP, dp + 1); //3a + flags_bit_w(); +} + +void bCPU::op_bit_dp() { (regs.p.m)?op_bit_dpb():op_bit_dpw(); } + +/********************** + *** 0x34: bit dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high +*/ +void bCPU::op_bit_dpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + flags_bit_b(); +} + +void bCPU::op_bit_dpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //4a + flags_bit_w(); +} + +void bCPU::op_bit_dpx() { (regs.p.m)?op_bit_dpxb():op_bit_dpxw(); } + +void bCPU::flags_cpx_b() { +int32 r = regs.x.l - rd.l; + regs.p.n = !!(r & 0x80); + regs.p.z = ((uint8)r == 0); + regs.p.c = (r >= 0); +} + +void bCPU::flags_cpx_w() { +int32 r = regs.x.w - rd.w; + regs.p.n = !!(r & 0x8000); + regs.p.z = ((uint16)r == 0); + regs.p.c = (r >= 0); +} + +/************************ + *** 0xe0: cpx #const *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; idl + [2a] pbr,pc+2 ; idh [1] +*/ +void bCPU::op_cpx_constb() { + rd.l = op_read(); //2 + flags_cpx_b(); +} + +void bCPU::op_cpx_constw() { + rd.l = op_read(); //2 + rd.h = op_read(); //2a + flags_cpx_w(); +} + +void bCPU::op_cpx_const() { (regs.p.x)?op_cpx_constb():op_cpx_constw(); } + +/********************** + *** 0xec: cpx addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_cpx_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + flags_cpx_b(); +} + +void bCPU::op_cpx_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a + flags_cpx_w(); +} + +void bCPU::op_cpx_addr() { (regs.p.x)?op_cpx_addrb():op_cpx_addrw(); } + +/******************** + *** 0xe4: cpx dp *** + ******************** +cycles: + [1 ] pbr,pc ; opercmp + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] +*/ +void bCPU::op_cpx_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + flags_cpx_b(); +} + +void bCPU::op_cpx_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + rd.h = op_read(OPMODE_DP, dp + 1); //3a + flags_cpx_w(); +} + +void bCPU::op_cpx_dp() { (regs.p.x)?op_cpx_dpb():op_cpx_dpw(); } + +void bCPU::flags_cpy_b() { +int32 r = regs.y.l - rd.l; + regs.p.n = !!(r & 0x80); + regs.p.z = ((uint8)r == 0); + regs.p.c = (r >= 0); +} + +void bCPU::flags_cpy_w() { +int32 r = regs.y.w - rd.w; + regs.p.n = !!(r & 0x8000); + regs.p.z = ((uint16)r == 0); + regs.p.c = (r >= 0); +} + +/************************ + *** 0xc0: cpy #const *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; idl + [2a] pbr,pc+2 ; idh [1] +*/ +void bCPU::op_cpy_constb() { + rd.l = op_read(); //2 + flags_cpy_b(); +} + +void bCPU::op_cpy_constw() { + rd.l = op_read(); //2 + rd.h = op_read(); //2a + flags_cpy_w(); +} + +void bCPU::op_cpy_const() { (regs.p.x)?op_cpy_constb():op_cpy_constw(); } + +/********************** + *** 0xcc: cpy addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_cpy_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + flags_cpy_b(); +} + +void bCPU::op_cpy_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a + flags_cpy_w(); +} + +void bCPU::op_cpy_addr() { (regs.p.x)?op_cpy_addrb():op_cpy_addrw(); } + +/******************** + *** 0xc4: cpy dp *** + ******************** +cycles: + [1 ] pbr,pc ; opercmp + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] +*/ +void bCPU::op_cpy_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + flags_cpy_b(); +} + +void bCPU::op_cpy_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + rd.h = op_read(OPMODE_DP, dp + 1); //3a + flags_cpy_w(); +} + +void bCPU::op_cpy_dp() { (regs.p.x)?op_cpy_dpb():op_cpy_dpw(); } + +void bCPU::flags_ldx_b() { + regs.p.n = !!(regs.x.l & 0x80); + regs.p.z = (regs.x.l == 0); +} + +void bCPU::flags_ldx_w() { + regs.p.n = !!(regs.x.w & 0x8000); + regs.p.z = (regs.x.w == 0); +} + +/************************ + *** 0xa2: ldx #const *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; idl + [2a] pbr,pc+2 ; idh [1] +*/ +void bCPU::op_ldx_constb() { + regs.x.l = op_read(); //2 + flags_ldx_b(); +} + +void bCPU::op_ldx_constw() { + regs.x.l = op_read(); //2 + regs.x.h = op_read(); //2a + flags_ldx_w(); +} + +void bCPU::op_ldx_const() { (regs.p.x)?op_ldx_constb():op_ldx_constw(); } + +/********************** + *** 0xae: ldx addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_ldx_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + regs.x.l = op_read(OPMODE_DBR, aa.w); //4 + flags_ldx_b(); +} + +void bCPU::op_ldx_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + regs.x.l = op_read(OPMODE_DBR, aa.w); //4 + regs.x.h = op_read(OPMODE_DBR, aa.w + 1); //4a + flags_ldx_w(); +} + +void bCPU::op_ldx_addr() { (regs.p.x)?op_ldx_addrb():op_ldx_addrw(); } + +/************************ + *** 0xbe: ldx addr,y *** + ************************ +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+xl ; io [4] + [4 ] dbr,aa+x ; data low + [4a] dbr,aa+x+1 ; data high [1] +*/ +void bCPU::op_ldx_addryb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + regs.x.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //4 + flags_ldx_b(); +} + +void bCPU::op_ldx_addryw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + regs.x.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //4 + regs.x.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //4a + flags_ldx_w(); +} + +void bCPU::op_ldx_addry() { (regs.p.x)?op_ldx_addryb():op_ldx_addryw(); } + +/******************** + *** 0xa6: ldx dp *** + ******************** +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] +*/ +void bCPU::op_ldx_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + regs.x.l = op_read(OPMODE_DP, dp); //3 + flags_ldx_b(); +} + +void bCPU::op_ldx_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + regs.x.l = op_read(OPMODE_DP, dp); //3 + regs.x.h = op_read(OPMODE_DP, dp + 1); //3a + flags_ldx_w(); +} + +void bCPU::op_ldx_dp() { (regs.p.x)?op_ldx_dpb():op_ldx_dpw(); } + +/********************** + *** 0xb6: ldx dp,y *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high +*/ +void bCPU::op_ldx_dpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + regs.x.l = op_read(OPMODE_DP, dp + regs.y.w); //4 + flags_ldx_b(); +} + +void bCPU::op_ldx_dpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + regs.x.l = op_read(OPMODE_DP, dp + regs.y.w); //4 + regs.x.h = op_read(OPMODE_DP, dp + regs.y.w + 1); //4a + flags_ldx_w(); +} + +void bCPU::op_ldx_dpy() { (regs.p.x)?op_ldx_dpyb():op_ldx_dpyw(); } + +void bCPU::flags_ldy_b() { + regs.p.n = !!(regs.y.l & 0x80); + regs.p.z = (regs.y.l == 0); +} + +void bCPU::flags_ldy_w() { + regs.p.n = !!(regs.y.w & 0x8000); + regs.p.z = (regs.y.w == 0); +} + +/************************ + *** 0xa0: ldy #const *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; idl + [2a] pbr,pc+2 ; idh [1] +*/ +void bCPU::op_ldy_constb() { + regs.y.l = op_read(); //2 + flags_ldy_b(); +} + +void bCPU::op_ldy_constw() { + regs.y.l = op_read(); //2 + regs.y.h = op_read(); //2a + flags_ldy_w(); +} + +void bCPU::op_ldy_const() { (regs.p.x)?op_ldy_constb():op_ldy_constw(); } + +/********************** + *** 0xac: ldy addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_ldy_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + regs.y.l = op_read(OPMODE_DBR, aa.w); //4 + flags_ldy_b(); +} + +void bCPU::op_ldy_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + regs.y.l = op_read(OPMODE_DBR, aa.w); //4 + regs.y.h = op_read(OPMODE_DBR, aa.w + 1); //4a + flags_ldy_w(); +} + +void bCPU::op_ldy_addr() { (regs.p.x)?op_ldy_addrb():op_ldy_addrw(); } + +/************************ + *** 0xbc: ldy addr,x *** + ************************ +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+xl ; io [4] + [4 ] dbr,aa+x ; data low + [4a] dbr,aa+x+1 ; data high [1] +*/ +void bCPU::op_ldy_addrxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + regs.y.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + flags_ldy_b(); +} + +void bCPU::op_ldy_addrxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + regs.y.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + regs.y.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //4a + flags_ldy_w(); +} + +void bCPU::op_ldy_addrx() { (regs.p.x)?op_ldy_addrxb():op_ldy_addrxw(); } + +/******************** + *** 0xa4: ldy dp *** + ******************** +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] +*/ +void bCPU::op_ldy_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + regs.y.l = op_read(OPMODE_DP, dp); //3 + flags_ldy_b(); +} + +void bCPU::op_ldy_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + regs.y.l = op_read(OPMODE_DP, dp); //3 + regs.y.h = op_read(OPMODE_DP, dp + 1); //3a + flags_ldy_w(); +} + +void bCPU::op_ldy_dp() { (regs.p.x)?op_ldy_dpb():op_ldy_dpw(); } + +/********************** + *** 0xb4: ldy dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high +*/ +void bCPU::op_ldy_dpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + regs.y.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + flags_ldy_b(); +} + +void bCPU::op_ldy_dpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + regs.y.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + regs.y.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //4a + flags_ldy_w(); +} + +void bCPU::op_ldy_dpx() { (regs.p.x)?op_ldy_dpxb():op_ldy_dpxw(); } + +/********************** + *** 0x8e: stx addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_stx_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + op_write(OPMODE_DBR, aa.w, regs.x.l); //4 +} + +void bCPU::op_stx_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + op_write(OPMODE_DBR, aa.w, regs.x.l); //4 + op_write(OPMODE_DBR, aa.w + 1, regs.x.h); //4a +} + +void bCPU::op_stx_addr() { (regs.p.x)?op_stx_addrb():op_stx_addrw(); } + +/******************** + *** 0x86: stx dp *** + ******************** +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] +*/ +void bCPU::op_stx_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + op_write(OPMODE_DP, dp, regs.x.l); //3 +} + +void bCPU::op_stx_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + op_write(OPMODE_DP, dp, regs.x.l); //3 + op_write(OPMODE_DP, dp + 1, regs.x.h); //3a +} + +void bCPU::op_stx_dp() { (regs.p.x)?op_stx_dpb():op_stx_dpw(); } + +/********************** + *** 0x96: stx dp,y *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high +*/ +void bCPU::op_stx_dpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + op_write(OPMODE_DP, dp + regs.y.w, regs.x.l); //4 +} + +void bCPU::op_stx_dpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + op_write(OPMODE_DP, dp + regs.y.w, regs.x.l); //4 + op_write(OPMODE_DP, dp + regs.y.w + 1, regs.x.h); //4a +} + +void bCPU::op_stx_dpy() { (regs.p.x)?op_stx_dpyb():op_stx_dpyw(); } + +/********************** + *** 0x8c: sty addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_sty_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + op_write(OPMODE_DBR, aa.w, regs.y.l); //4 +} + +void bCPU::op_sty_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + op_write(OPMODE_DBR, aa.w, regs.y.l); //4 + op_write(OPMODE_DBR, aa.w + 1, regs.y.h); //4a +} + +void bCPU::op_sty_addr() { (regs.p.x)?op_sty_addrb():op_sty_addrw(); } + +/******************** + *** 0x84: sty dp *** + ******************** +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] +*/ +void bCPU::op_sty_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + op_write(OPMODE_DP, dp, regs.y.l); //3 +} + +void bCPU::op_sty_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + op_write(OPMODE_DP, dp, regs.y.l); //3 + op_write(OPMODE_DP, dp + 1, regs.y.h); //3a +} + +void bCPU::op_sty_dp() { (regs.p.x)?op_sty_dpb():op_sty_dpw(); } + +/********************** + *** 0x94: sty dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high +*/ +void bCPU::op_sty_dpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + op_write(OPMODE_DP, dp + regs.x.w, regs.y.l); //4 +} + +void bCPU::op_sty_dpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + op_write(OPMODE_DP, dp + regs.x.w, regs.y.l); //4 + op_write(OPMODE_DP, dp + regs.x.w + 1, regs.y.h); //4a +} + +void bCPU::op_sty_dpx() { (regs.p.x)?op_sty_dpxb():op_sty_dpxw(); } + +/********************** + *** 0x9c: stz addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_stz_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + op_write(OPMODE_DBR, aa.w, 0); //4 +} + +void bCPU::op_stz_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + op_write(OPMODE_DBR, aa.w, 0); //4 + op_write(OPMODE_DBR, aa.w + 1, 0); //4a +} + +void bCPU::op_stz_addr() { (regs.p.m)?op_stz_addrb():op_stz_addrw(); } + +/************************ + *** 0x9e: stz addr,x *** + ************************ +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+xl ; io [4] + [4 ] dbr,aa+x ; data low + [4a] dbr,aa+x+1 ; data high [1] +*/ +void bCPU::op_stz_addrxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + op_write(OPMODE_DBR, aa.w + regs.x.w, 0); //4 +} + +void bCPU::op_stz_addrxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + op_write(OPMODE_DBR, aa.w + regs.x.w, 0); //4 + op_write(OPMODE_DBR, aa.w + regs.x.w + 1, 0); //4a +} + +void bCPU::op_stz_addrx() { (regs.p.m)?op_stz_addrxb():op_stz_addrxw(); } + +/******************** + *** 0x64: stz dp *** + ******************** +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] +*/ +void bCPU::op_stz_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + op_write(OPMODE_DP, dp, 0); //3 +} + +void bCPU::op_stz_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + op_write(OPMODE_DP, dp, 0); //3 + op_write(OPMODE_DP, dp + 1, 0); //3a +} + +void bCPU::op_stz_dp() { (regs.p.m)?op_stz_dpb():op_stz_dpw(); } + +/********************** + *** 0x74: stz dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high +*/ +void bCPU::op_stz_dpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + op_write(OPMODE_DP, dp + regs.x.w, 0); //4 +} + +void bCPU::op_stz_dpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + op_write(OPMODE_DP, dp + regs.x.w, 0); //4 + op_write(OPMODE_DP, dp + regs.x.w + 1, 0); //4a +} + +void bCPU::op_stz_dpx() { (regs.p.m)?op_stz_dpxb():op_stz_dpxw(); } + +/***************** + *** 0xeb: xba *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io + [3] pbr,pc+1 ; io +*/ +void bCPU::op_xba() { + cpu_io(); //2 + cpu_io(); //3 + regs.a.l ^= regs.a.h; + regs.a.h ^= regs.a.l; + regs.a.l ^= regs.a.h; + regs.p.n = !!(regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +/********************** + *** 0x1c: trb addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] + [5 ] dbr,aa+1 ; io + [6a] dbr,aa+1 ; data high [1] + [6 ] dbr,aa ; data low +*/ +void bCPU::op_trb_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + cpu_io(); //5 + regs.p.z = ((rd.l & regs.a.l) == 0); + rd.l &= ~regs.a.l; + op_write(OPMODE_DBR, aa.w, rd.l); //6 +} + +void bCPU::op_trb_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a + cpu_io(); //5 + regs.p.z = ((rd.w & regs.a.w) == 0); + rd.w &= ~regs.a.w; + op_write(OPMODE_DBR, aa.w + 1, rd.h); //6a + op_write(OPMODE_DBR, aa.w, rd.l); //6 +} + +void bCPU::op_trb_addr() { (regs.p.m)?op_trb_addrb():op_trb_addrw(); } + +/******************** + *** 0x14: trb dp *** + ******************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] + [4 ] 0,d+dp+1 ; io + [5a] 0,d+dp+1 ; data high [1] + [5 ] 0,d+dp ; data low +*/ +void bCPU::op_trb_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + cpu_io(); //4 + regs.p.z = ((rd.l & regs.a.l) == 0); + rd.l &= ~regs.a.l; + op_write(OPMODE_DP, dp, rd.l); //5 +} + +void bCPU::op_trb_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + rd.h = op_read(OPMODE_DP, dp + 1); //3a + cpu_io(); //4 + regs.p.z = ((rd.w & regs.a.w) == 0); + rd.w &= ~regs.a.w; + op_write(OPMODE_DP, dp + 1, rd.h); //5a + op_write(OPMODE_DP, dp, rd.l); //5 +} + +void bCPU::op_trb_dp() { (regs.p.m)?op_trb_dpb():op_trb_dpw(); } + +/********************** + *** 0x0c: tsb addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] + [5 ] dbr,aa+1 ; io + [6a] dbr,aa+1 ; data high [1] + [6 ] dbr,aa ; data low +*/ +void bCPU::op_tsb_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + cpu_io(); //5 + regs.p.z = ((rd.l & regs.a.l) == 0); + rd.l |= regs.a.l; + op_write(OPMODE_DBR, aa.w, rd.l); //6 +} + +void bCPU::op_tsb_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a + cpu_io(); //5 + regs.p.z = ((rd.w & regs.a.w) == 0); + rd.w |= regs.a.w; + op_write(OPMODE_DBR, aa.w + 1, rd.h); //6a + op_write(OPMODE_DBR, aa.w, rd.l); //6 +} + +void bCPU::op_tsb_addr() { (regs.p.m)?op_tsb_addrb():op_tsb_addrw(); } + +/******************** + *** 0x04: tsb dp *** + ******************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] + [4 ] 0,d+dp+1 ; io + [5a] 0,d+dp+1 ; data high [1] + [5 ] 0,d+dp ; data low +*/ +void bCPU::op_tsb_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + cpu_io(); //4 + regs.p.z = ((rd.l & regs.a.l) == 0); + rd.l |= regs.a.l; + op_write(OPMODE_DP, dp, rd.l); //5 +} + +void bCPU::op_tsb_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + rd.h = op_read(OPMODE_DP, dp + 1); //3a + cpu_io(); //4 + regs.p.z = ((rd.w & regs.a.w) == 0); + rd.w |= regs.a.w; + op_write(OPMODE_DP, dp + 1, rd.h); //5a + op_write(OPMODE_DP, dp, rd.l); //5 +} + +void bCPU::op_tsb_dp() { (regs.p.m)?op_tsb_dpb():op_tsb_dpw(); } + +/************************** + *** 0x54: mvn src,dest *** + ************************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; dba + [3] pbr,pc+2 ; sba + [4] sba,x ; src data + [5] dba,y ; dest data + [6] dba,y ; io + [7] dba,y ; io +*/ +void bCPU::op_mvn() { +uint32 src, dest; +uint8 sb, db; + db = op_read(); //2 + sb = op_read(); //3 + regs.db = db; + regs.a.w--; + dest = (db << 16) | regs.y.w; + src = (sb << 16) | regs.x.w; + rd.l = op_read(OPMODE_LONG, src); //4 + op_write(OPMODE_LONG, dest, rd.l); //5 + if(regs.p.x) { + regs.x.l++; + regs.y.l++; + } else { + regs.x.w++; + regs.y.w++; + } + if(regs.a.w != 0xffff) { + regs.pc.w -= 3; + } + cpu_io(); //6 + cpu_io(); //7 +} + +/************************** + *** 0x44: mvp src,dest *** + ************************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; dba + [3] pbr,pc+2 ; sba + [4] sba,x ; src data + [5] dba,y ; dest data + [6] dba,y ; io + [7] dba,y ; io +*/ +void bCPU::op_mvp() { +uint32 src, dest; +uint8 sb, db; + db = op_read(); //2 + sb = op_read(); //3 + regs.db = db; + regs.a.w--; + dest = (db << 16) | regs.y.w; + src = (sb << 16) | regs.x.w; + rd.l = op_read(OPMODE_LONG, src); //4 + op_write(OPMODE_LONG, dest, rd.l); //5 + if(regs.p.x) { + regs.x.l--; + regs.y.l--; + } else { + regs.x.w--; + regs.y.w--; + } + if(regs.a.w != 0xffff) { + regs.pc.w -= 3; + } + cpu_io(); //6 + cpu_io(); //7 +} + +/************************ + *** 0x00: brk #const *** + ************************ +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; signature +* [3] 0,s ; pbr [3] + [4] 0,s-1 ; pch + [5] 0,s-2 ; pcl + [6] 0,s-3 ; p + [7] 0,va ; aavl + [8] 0,va+1 ; aavh +*/ +void bCPU::op_brk() { +uint16 aavw = (regs.e)?0xfffe:0xffe6; + op_read(); //2 + stack_write(regs.pc.b); //3 + stack_write(regs.pc.h); //4 + stack_write(regs.pc.l); //5 + stack_write(regs.p); //6 + rd.l = op_read(OPMODE_LONG, aavw ); //7 + rd.h = op_read(OPMODE_LONG, aavw + 1); //8 + regs.pc.b = 0x00; + regs.pc.w = rd.w; + regs.p.i = 1; + regs.p.d = 0; +} + +/************************ + *** 0x02: cop #const *** + ************************ +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; signature +* [3] 0,s ; pbr [3] + [4] 0,s-1 ; pch + [5] 0,s-2 ; pcl + [6] 0,s-3 ; p + [7] 0,va ; aavl + [8] 0,va+1 ; aavh +*/ +void bCPU::op_cop() { +uint16 aavw = (regs.e)?0xfff4:0xffe4; + op_read(); //2 + stack_write(regs.pc.b); //3 + stack_write(regs.pc.h); //4 + stack_write(regs.pc.l); //5 + stack_write(regs.p); //6 + rd.l = op_read(OPMODE_LONG, aavw ); //7 + rd.h = op_read(OPMODE_LONG, aavw + 1); //8 + regs.pc.b = 0x00; + regs.pc.w = rd.w; + regs.p.i = 1; + regs.p.d = 0; +} + +/***************** + *** 0xdb: stp *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io + [3] pbr,pc+1 ; io +*/ +void bCPU::op_stp() { + cpu_io(); + cpu_io(); + regs.pc.w--; + cpustate = CPUSTATE_STP; +} + +/***************** + *** 0xcb: wai *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io + [3] pbr,pc+1 ; io +*/ +void bCPU::op_wai() { + cpu_io(); + cpu_io(); + regs.pc.w--; + cpustate = CPUSTATE_WAI; +} + +/***************** + *** 0xfb: xce *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_xce() { +bool c = regs.p.c; + cpu_io(); //2 + regs.p.c = regs.e; + regs.e = c; + if(regs.e) { + regs.p.m = 1; + regs.p.x = 1; + regs.x.h = 0x00; + regs.y.h = 0x00; + regs.s.h = 0x01; + } +} + +/***************** + *** 0xea: nop *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_nop() { + cpu_io(); //2 +} + +/***************** + *** 0x42: wdm *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_wdm() { + cpu_io(); + regs.pc.w++; +} + +/***************** + *** 0x18: clc *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_clc() { + cpu_io(); + regs.p.c = 0; +} + +/***************** + *** 0xd8: cld *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_cld() { + cpu_io(); + regs.p.d = 0; +} + +/***************** + *** 0x58: cli *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_cli() { + cpu_io(); + regs.p.i = 0; +} + +/***************** + *** 0xb8: clv *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_clv() { + cpu_io(); + regs.p.v = 0; +} + +/***************** + *** 0x38: sec *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_sec() { + cpu_io(); + regs.p.c = 1; +} + +/***************** + *** 0xf8: sed *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_sed() { + cpu_io(); + regs.p.d = 1; +} + +/***************** + *** 0x78: sei *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_sei() { + cpu_io(); + regs.p.i = 1; +} + +/************************ + *** 0xc2: rep #const *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; idl + [2a] pbr,pc+1 ; idl +*/ +void bCPU::op_rep() { + rd.l = op_read(); //2 + cpu_io(); //2a + regs.p &= ~rd.l; + if(regs.e) { + regs.p |= 0x30; + } +} + +/************************ + *** 0xe2: sep #const *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; idl + [2a] pbr,pc+1 ; idl +*/ +void bCPU::op_sep() { + rd.l = op_read(); //2 + cpu_io(); //2a + regs.p |= rd.l; + if(regs.e) { + regs.p |= 0x30; + } + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } +} + +/***************** + *** 0xaa: tax *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_taxb() { + cpu_io(); //2 + regs.x.l = regs.a.l; + regs.p.n = !!(regs.x.l & 0x80); + regs.p.z = (regs.x.l == 0); +} + +void bCPU::op_taxw() { + cpu_io(); //2 + regs.x.w = regs.a.w; + regs.p.n = !!(regs.x.w & 0x8000); + regs.p.z = (regs.x.w == 0); +} + +void bCPU::op_tax() { (regs.p.x)?op_taxb():op_taxw(); } + +/***************** + *** 0xa8: tay *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_tayb() { + cpu_io(); //2 + regs.y.l = regs.a.l; + regs.p.n = !!(regs.y.l & 0x80); + regs.p.z = (regs.y.l == 0); +} + +void bCPU::op_tayw() { + cpu_io(); //2 + regs.y.w = regs.a.w; + regs.p.n = !!(regs.y.w & 0x8000); + regs.p.z = (regs.y.w == 0); +} + +void bCPU::op_tay() { (regs.p.x)?op_tayb():op_tayw(); } + +/***************** + *** 0x5b: tcd *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_tcd() { + cpu_io(); //2 + regs.d.w = regs.a.w; + regs.p.n = !!(regs.d.w & 0x8000); + regs.p.z = (regs.d.w == 0); +} + +/***************** + *** 0x1b: tcs *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_tcs() { + cpu_io(); //2 + regs.s.w = regs.a.w; + if(regs.e) { + regs.s.h = 0x01; + } +} + +/***************** + *** 0x7b: tdc *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_tdc() { + cpu_io(); //2 + regs.a.w = regs.d.w; + regs.p.n = !!(regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +/***************** + *** 0x3b: tsc *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_tsc() { + cpu_io(); //2 + regs.a.w = regs.s.w; + if(regs.e) { + regs.p.n = !!(regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } else { + regs.p.n = !!(regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); + } +} + +/***************** + *** 0xba: tsx *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_tsxb() { + cpu_io(); //2 + regs.x.l = regs.s.l; + regs.p.n = !!(regs.x.l & 0x80); + regs.p.z = (regs.x.l == 0); +} + +void bCPU::op_tsxw() { + cpu_io(); //2 + regs.x.w = regs.s.w; + regs.p.n = !!(regs.x.w & 0x8000); + regs.p.z = (regs.x.w == 0); +} + +void bCPU::op_tsx() { (regs.p.x)?op_tsxb():op_tsxw(); } + +/***************** + *** 0x8a: txa *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_txab() { + cpu_io(); //2 + regs.a.l = regs.x.l; + regs.p.n = !!(regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void bCPU::op_txaw() { + cpu_io(); //2 + regs.a.w = regs.x.w; + regs.p.n = !!(regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +void bCPU::op_txa() { (regs.p.m)?op_txab():op_txaw(); } + +/***************** + *** 0x9a: txs *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_txsb() { + cpu_io(); //2 + regs.s.l = regs.x.l; + regs.p.n = !!(regs.s.l & 0x80); + regs.p.z = (regs.s.l == 0); +} + +void bCPU::op_txsw() { + cpu_io(); //2 + regs.s.w = regs.x.w; + regs.p.n = !!(regs.s.w & 0x8000); + regs.p.z = (regs.s.w == 0); +} + +void bCPU::op_txs() { (regs.p.x)?op_txsb():op_txsw(); } + +/***************** + *** 0x9b: txy *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_txyb() { + cpu_io(); //2 + regs.y.l = regs.x.l; + regs.p.n = !!(regs.y.l & 0x80); + regs.p.z = (regs.y.l == 0); +} + +void bCPU::op_txyw() { + cpu_io(); //2 + regs.y.w = regs.x.w; + regs.p.n = !!(regs.y.w & 0x8000); + regs.p.z = (regs.y.w == 0); +} + +void bCPU::op_txy() { (regs.p.x)?op_txyb():op_txyw(); } + +/***************** + *** 0x98: tya *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_tyab() { + cpu_io(); //2 + regs.a.l = regs.y.l; + regs.p.n = !!(regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void bCPU::op_tyaw() { + cpu_io(); //2 + regs.a.w = regs.y.w; + regs.p.n = !!(regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +void bCPU::op_tya() { (regs.p.m)?op_tyab():op_tyaw(); } + +/***************** + *** 0xbb: tyx *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_tyxb() { + cpu_io(); //2 + regs.x.l = regs.y.l; + regs.p.n = !!(regs.x.l & 0x80); + regs.p.z = (regs.x.l == 0); +} + +void bCPU::op_tyxw() { + cpu_io(); //2 + regs.x.w = regs.y.w; + regs.p.n = !!(regs.x.w & 0x8000); + regs.p.z = (regs.x.w == 0); +} + +void bCPU::op_tyx() { (regs.p.x)?op_tyxb():op_tyxw(); } diff --git a/src/cpu/bcpu/bcpu_op_ora.cpp b/src/cpu/bcpu/bcpu_op_ora.cpp new file mode 100644 index 00000000..d31bbabf --- /dev/null +++ b/src/cpu/bcpu/bcpu_op_ora.cpp @@ -0,0 +1,474 @@ +void bCPU::flags_ora_b() { + regs.p.n = !!(regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void bCPU::flags_ora_w() { + regs.p.n = !!(regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +/************************ + *** 0x09: ora #const *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; idl + [2a] pbr,pc+2 ; idh [1] +*/ +void bCPU::op_ora_constb() { + regs.a.l |= op_read(); //2 + flags_ora_b(); +} + +void bCPU::op_ora_constw() { + regs.a.l |= op_read(); //2 + regs.a.h |= op_read(); //2a + flags_ora_w(); +} + +void bCPU::op_ora_const() { (regs.p.m)?op_ora_constb():op_ora_constw(); } + +/********************** + *** 0x0d: ora addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_ora_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + regs.a.l |= op_read(OPMODE_DBR, aa.w); //4 + flags_ora_b(); +} + +void bCPU::op_ora_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + regs.a.l |= op_read(OPMODE_DBR, aa.w); //4 + regs.a.h |= op_read(OPMODE_DBR, aa.w + 1); //4a + flags_ora_w(); +} + +void bCPU::op_ora_addr() { (regs.p.m)?op_ora_addrb():op_ora_addrw(); } + +/************************ + *** 0x1d: ora addr,x *** + ************************ +cycles: + [1 ] pbr,pc ; operora + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+xl ; io [4] + [4 ] dbr,aa+x ; data low + [4a] dbr,aa+x+1 ; data high [1] +*/ +void bCPU::op_ora_addrxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + regs.a.l |= op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + flags_ora_b(); +} + +void bCPU::op_ora_addrxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + regs.a.l |= op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + regs.a.h |= op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //4a + flags_ora_w(); +} + +void bCPU::op_ora_addrx() { (regs.p.m)?op_ora_addrxb():op_ora_addrxw(); } + +/******************** + *** 0x05: ora dp *** + ******************** +cycles: + [1 ] pbr,pc ; operora + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] +*/ +void bCPU::op_ora_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + regs.a.l |= op_read(OPMODE_DP, dp); //3 + flags_ora_b(); +} + +void bCPU::op_ora_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + regs.a.l |= op_read(OPMODE_DP, dp); //3 + regs.a.h |= op_read(OPMODE_DP, dp + 1); //3a + flags_ora_w(); +} + +void bCPU::op_ora_dp() { (regs.p.m)?op_ora_dpb():op_ora_dpw(); } + +/********************** + *** 0x12: ora (dp) *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] dbr,aa ; data low + [5a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_ora_idpb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + regs.a.l |= op_read(OPMODE_DBR, aa.w); //5 + flags_ora_b(); +} + +void bCPU::op_ora_idpw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + regs.a.l |= op_read(OPMODE_DBR, aa.w); //5 + regs.a.h |= op_read(OPMODE_DBR, aa.w + 1); //5 + flags_ora_w(); +} + +void bCPU::op_ora_idp() { (regs.p.m)?op_ora_idpb():op_ora_idpw(); } + +/********************** + *** 0x07: ora [dp] *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] 0,d+dp+2 ; aab + [6 ] aab,aa ; data low + [6a] aab,aa+1 ; data high [1] +*/ +void bCPU::op_ora_ildpb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + regs.a.l |= op_read(OPMODE_LONG, aa.d); //6 + flags_ora_b(); +} + +void bCPU::op_ora_ildpw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + regs.a.l |= op_read(OPMODE_LONG, aa.d); //6 + regs.a.h |= op_read(OPMODE_LONG, aa.d + 1); //6a + flags_ora_w(); +} + +void bCPU::op_ora_ildp() { (regs.p.m)?op_ora_ildpb():op_ora_ildpw(); } + +/********************** + *** 0x0f: ora long *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] pbr,pc+3 ; aab + [5 ] aab,aa ; data low + [5a] aab,aa+1 ; data high +*/ +void bCPU::op_ora_longb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + regs.a.l |= op_read(OPMODE_LONG, aa.d); //5 + flags_ora_b(); +} + +void bCPU::op_ora_longw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + regs.a.l |= op_read(OPMODE_LONG, aa.d); //5 + regs.a.h |= op_read(OPMODE_LONG, aa.d + 1); //5a + flags_ora_w(); +} + +void bCPU::op_ora_long() { (regs.p.m)?op_ora_longb():op_ora_longw(); } + +/************************ + *** 0x1f: ora long,x *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] pbr,pc+3 ; aab + [5 ] aab,aa+x ; data low + [5a] aab,aa+x+1 ; data high +*/ +void bCPU::op_ora_longxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + regs.a.l |= op_read(OPMODE_LONG, aa.d + regs.x.w); //5 + flags_ora_b(); +} + +void bCPU::op_ora_longxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + regs.a.l |= op_read(OPMODE_LONG, aa.d + regs.x.w); //5 + regs.a.h |= op_read(OPMODE_LONG, aa.d + regs.x.w + 1); //5a + flags_ora_w(); +} + +void bCPU::op_ora_longx() { (regs.p.m)?op_ora_longxb():op_ora_longxw(); } + +/************************ + *** 0x19: ora addr,y *** + ************************ +cycles: + [1 ] pbr,pc ; operora + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+yl ; io [4] + [4 ] dbr,aa+y ; data low + [4a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_ora_addryb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + regs.a.l |= op_read(OPMODE_DBR, aa.w + regs.y.w); //4 + flags_ora_b(); +} + +void bCPU::op_ora_addryw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + regs.a.l |= op_read(OPMODE_DBR, aa.w + regs.y.w); //4 + regs.a.h |= op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //4a + flags_ora_w(); +} + +void bCPU::op_ora_addry() { (regs.p.m)?op_ora_addryb():op_ora_addryw(); } + +/********************** + *** 0x15: ora dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high +*/ +void bCPU::op_ora_dpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + regs.a.l |= op_read(OPMODE_DP, dp + regs.x.w); //4 + flags_ora_b(); +} + +void bCPU::op_ora_dpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + regs.a.l |= op_read(OPMODE_DP, dp + regs.x.w); //4 + regs.a.h |= op_read(OPMODE_DP, dp + regs.x.w + 1); //4a + flags_ora_w(); +} + +void bCPU::op_ora_dpx() { (regs.p.m)?op_ora_dpxb():op_ora_dpxw(); } + +/************************ + *** 0x01: ora (dp,x) *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; aal + [5 ] 0,d+dp+x+1 ; aah + [6 ] dbr,aa ; data low + [6a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_ora_idpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5 + regs.a.l |= op_read(OPMODE_DBR, aa.w); //6 + flags_ora_b(); +} + +void bCPU::op_ora_idpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5 + regs.a.l |= op_read(OPMODE_DBR, aa.w); //6 + regs.a.h |= op_read(OPMODE_DBR, aa.w + 1); //6a + flags_ora_w(); +} + +void bCPU::op_ora_idpx() { (regs.p.m)?op_ora_idpxb():op_ora_idpxw(); } + +/************************ + *** 0x11: ora (dp),y *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [4a] dbr,aah,aal+yl ; io [4] + [5 ] dbr,aa+y ; data low + [5a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_ora_idpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + cpu_c4(aa.w, aa.w + regs.y.w); //4a + regs.a.l |= op_read(OPMODE_DBR, aa.w + regs.y.w); //5 + flags_ora_b(); +} + +void bCPU::op_ora_idpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + cpu_c4(aa.w, aa.w + regs.y.w); //4a + regs.a.l |= op_read(OPMODE_DBR, aa.w + regs.y.w); //5 + regs.a.h |= op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //5a + flags_ora_w(); +} + +void bCPU::op_ora_idpy() { (regs.p.m)?op_ora_idpyb():op_ora_idpyw(); } + +/************************ + *** 0x17: ora [dp],y *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] 0,d+dp+2 ; aab + [6 ] aab,aa+y ; data low + [6a] aab,aa+y+1 ; data high [1] +*/ +void bCPU::op_ora_ildpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + regs.a.l |= op_read(OPMODE_LONG, aa.d + regs.y.w); //6 + flags_ora_b(); +} + +void bCPU::op_ora_ildpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + regs.a.l |= op_read(OPMODE_LONG, aa.d + regs.y.w); //6 + regs.a.h |= op_read(OPMODE_LONG, aa.d + regs.y.w + 1); //6a + flags_ora_w(); +} + +void bCPU::op_ora_ildpy() { (regs.p.m)?op_ora_ildpyb():op_ora_ildpyw(); } + +/********************** + *** 0x03: ora sr,s *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; sp + [3 ] pbr,pc+1 ; io + [4 ] 0,s+sp ; data low + [4a] 0,s+sp+1 ; data high [1] +*/ +void bCPU::op_ora_srb() { + sp = op_read(); //2 + cpu_io(); //3 + regs.a.l |= op_read(OPMODE_SP, sp); //4 + flags_ora_b(); +} + +void bCPU::op_ora_srw() { + sp = op_read(); //2 + cpu_io(); //3 + regs.a.l |= op_read(OPMODE_SP, sp); //4 + regs.a.h |= op_read(OPMODE_SP, sp + 1); //4a + flags_ora_w(); +} + +void bCPU::op_ora_sr() { (regs.p.m)?op_ora_srb():op_ora_srw(); } + +/************************** + *** 0x13: ora (sr,s),y *** + ************************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; sp + [3 ] pbr,pc+1 ; io + [4 ] 0,s+sp ; aal + [5 ] 0,s+sp+1 ; aah + [6 ] 0,s+sp+1 ; io + [7 ] dbr,aa+y ; data low + [7a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_ora_isryb() { + sp = op_read(); //2 + cpu_io(); //3 + aa.l = op_read(OPMODE_SP, sp); //4 + aa.h = op_read(OPMODE_SP, sp + 1); //5 + cpu_io(); //6 + regs.a.l |= op_read(OPMODE_DBR, aa.w + regs.y.w); //7 + flags_ora_b(); +} + +void bCPU::op_ora_isryw() { + sp = op_read(); //2 + cpu_io(); //3 + aa.l = op_read(OPMODE_SP, sp); //4 + aa.h = op_read(OPMODE_SP, sp + 1); //5 + cpu_io(); //6 + regs.a.l |= op_read(OPMODE_DBR, aa.w + regs.y.w); //7 + regs.a.h |= op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //7a + flags_ora_w(); +} + +void bCPU::op_ora_isry() { (regs.p.m)?op_ora_isryb():op_ora_isryw(); } diff --git a/src/cpu/bcpu/bcpu_op_pc.cpp b/src/cpu/bcpu/bcpu_op_pc.cpp new file mode 100644 index 00000000..fb499632 --- /dev/null +++ b/src/cpu/bcpu/bcpu_op_pc.cpp @@ -0,0 +1,436 @@ +/********************** + *** 0x4c: jmp addr *** + ********************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; new pcl + [3] pbr,pc+2 ; new pch +*/ +void bCPU::op_jmp_addr() { + rd.l = op_read(); //2 + rd.h = op_read(); //3 + regs.pc.w = rd.w; +} + +/********************** + *** 0x5c: jmp long *** + ********************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; new pcl + [3] pbr,pc+2 ; new pch + [4] pbr,pc+3 ; new pbr +*/ +void bCPU::op_jmp_long() { + rd.l = op_read(); //2 + rd.h = op_read(); //3 + rd.b = op_read(); //4 + regs.pc.d = rd.d; +} + +/************************ + *** 0x6c: jmp (addr) *** + ************************ +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; aal + [3] pbr,pc+2 ; aah + [4] 0,aa ; new pcl + [5] 0,aa+1 ; new pch +*/ +void bCPU::op_jmp_iaddr() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_ADDR, aa.w); //4 + rd.h = op_read(OPMODE_ADDR, aa.w + 1); //5 + regs.pc.w = rd.w; +} + +/************************** + *** 0x7c: jmp (addr,x) *** + ************************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; aal + [3] pbr,pc+2 ; aah + [4] pbr,pc+2 ; io + [5] pbr,aa+x ; new pcl + [6] pbr,aa+x+1 ; new pch +*/ +void bCPU::op_jmp_iaddrx() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_io(); //4 + rd.l = op_read(OPMODE_PBR, aa.w + regs.x.w); //5 + rd.h = op_read(OPMODE_PBR, aa.w + regs.x.w + 1); //6 + regs.pc.w = rd.w; +} + +/************************ + *** 0xdc: jmp [addr] *** + ************************ +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; aal + [3] pbr,pc+2 ; aah + [4] 0,aa ; new pcl + [5] 0,aa+1 ; new pch + [6] 0,aa+2 ; new pbr +*/ +void bCPU::op_jmp_iladdr() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_ADDR, aa.w); //4 + rd.h = op_read(OPMODE_ADDR, aa.w + 1); //5 + rd.b = op_read(OPMODE_ADDR, aa.w + 2); //6 + regs.pc.d = rd.d; +} + +/********************** + *** 0x20: jsr addr *** + ********************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; new pcl + [3] pbr,pc+2 ; new pch + [4] pbr,pc+2 ; io + [5] 0,s ; pch + [6] 0,s-1 ; pcl +*/ +void bCPU::op_jsr_addr() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_io(); //4 + regs.pc.w--; + stack_write(regs.pc.h); //5 + stack_write(regs.pc.l); //6 + regs.pc.w = aa.w; +} + +/********************** + *** 0x22: jsr long *** + ********************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; new pcl + [3] pbr,pc+2 ; new pch + [4] 0,s ; pbr + [5] 0,s ; io + [6] pbr,pc+3 ; new pbr + [7] 0,s-1 ; pch + [8] 0,s-2 ; pcl +*/ +void bCPU::op_jsr_long() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + stack_write(regs.pc.b); //4 + cpu_io(); //5 + aa.b = op_read(); //6 + regs.pc.w--; + stack_write(regs.pc.h); //7 + stack_write(regs.pc.l); //8 + regs.pc.d = aa.d; +} + +/************************** + *** 0xfc: jsr (addr,x) *** + ************************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; aal + [3] 0,s ; pch + [4] 0,s-1 ; pcl + [5] pbr,pc+2 ; aah + [6] pbr,pc+2 ; io + [7] pbr,aa+x ; new pcl + [8] pbr,aa+x+1 ; new pch +*/ +void bCPU::op_jsr_iaddrx() { + aa.l = op_read(); //2 + stack_write(regs.pc.h); //3 + stack_write(regs.pc.l); //4 + aa.h = op_read(); //5 + cpu_io(); //6 + rd.l = op_read(OPMODE_PBR, aa.w + regs.x.w); //7 + rd.h = op_read(OPMODE_PBR, aa.w + regs.x.w + 1); //8 + regs.pc.w = rd.w; +} + +/***************** + *** 0x40: rti *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io + [3] pbr,pc+1 ; io + [4] 0,s+1 ; p + [5] 0,s+2 ; new pcl + [6] 0,s+3 ; new pch + [7] 0,s+4 ; pbr [7] +*/ +void bCPU::op_rtie() { + cpu_io(); //2 + cpu_io(); //3 + regs.p = stack_read(); //4 + rd.l = stack_read(); //5 + rd.h = stack_read(); //6 + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + regs.pc.w = rd.w; +} + +void bCPU::op_rtin() { + cpu_io(); //2 + cpu_io(); //3 + regs.p = stack_read(); //4 + rd.l = stack_read(); //5 + rd.h = stack_read(); //6 + rd.b = stack_read(); //7 + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + regs.pc.d = rd.d; +} + +void bCPU::op_rti() { (regs.e)?op_rtie():op_rtin(); } + +/***************** + *** 0x60: rts *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io + [3] pbr,pc+1 ; io + [4] 0,s+1 ; pcl + [5] 0,s+2 ; pch + [6] 0,s+2 ; io +*/ +void bCPU::op_rts() { + cpu_io(); //2 + cpu_io(); //3 + rd.l = stack_read(); //4 + rd.h = stack_read(); //5 + cpu_io(); //6 + regs.pc.w = rd.w; + regs.pc.w++; +} + +/***************** + *** 0x6b: rtl *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io + [3] pbr,pc+1 ; io + [4] 0,s+1 ; pcl + [5] 0,s+2 ; pch + [6] 0,s+3 ; pbr +*/ +void bCPU::op_rtl() { + cpu_io(); //2 + cpu_io(); //3 + rd.l = stack_read(); //4 + rd.h = stack_read(); //5 + rd.b = stack_read(); //6 + regs.pc.d = rd.d; + regs.pc.w++; +} + +/********************** + *** 0x80: bra near *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; offset + [2a] pbr,pc+1 ; io [5] + [2b] pbr,pc+1 ; io [6] +*/ +void bCPU::op_bra() { +uint16 r; + rd.l = op_read(); //2 + cpu_io(); //2a + r = regs.pc + (int8)rd.l; + cpu_c6(r); //2b + regs.pc.w = r; +} + +/********************* + *** 0x82: brl far *** + ********************* +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; offset low + [3] pbr,pc+2 ; offset high + [4] pbr,pc+2 ; io +*/ +void bCPU::op_brl() { +uint16 r; + rd.l = op_read(); //2 + rd.h = op_read(); //3 + cpu_io(); //4 + r = regs.pc + (int16)rd.w; + regs.pc.w = r; +} + +/********************** + *** 0x90: bcc near *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; offset + [2a] pbr,pc+1 ; io [5] + [2b] pbr,pc+1 ; io [6] +*/ +void bCPU::op_bcc() { +uint16 r; + rd.l = op_read(); //2 + if(!regs.p.c) { + cpu_io(); //2a + r = regs.pc + (int8)rd.l; + cpu_c6(r); //2b + regs.pc.w = r; + } +} + +/********************** + *** 0xb0: bcs near *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; offset + [2a] pbr,pc+1 ; io [5] + [2b] pbr,pc+1 ; io [6] +*/ +void bCPU::op_bcs() { +uint16 r; + rd.l = op_read(); //2 + if(regs.p.c) { + cpu_io(); //2a + r = regs.pc + (int8)rd.l; + cpu_c6(r); //2b + regs.pc.w = r; + } +} + +/********************** + *** 0xd0: bne near *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; offset + [2a] pbr,pc+1 ; io [5] + [2b] pbr,pc+1 ; io [6] +*/ +void bCPU::op_bne() { +uint16 r; + rd.l = op_read(); //2 + if(!regs.p.z) { + cpu_io(); //2a + r = regs.pc + (int8)rd.l; + cpu_c6(r); //2b + regs.pc.w = r; + } +} + +/********************** + *** 0xf0: beq near *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; offset + [2a] pbr,pc+1 ; io [5] + [2b] pbr,pc+1 ; io [6] +*/ +void bCPU::op_beq() { +uint16 r; + rd.l = op_read(); //2 + if(regs.p.z) { + cpu_io(); //2a + r = regs.pc + (int8)rd.l; + cpu_c6(r); //2b + regs.pc.w = r; + } +} + +/********************** + *** 0x10: bpl near *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; offset + [2a] pbr,pc+1 ; io [5] + [2b] pbr,pc+1 ; io [6] +*/ +void bCPU::op_bpl() { +uint16 r; + rd.l = op_read(); //2 + if(!regs.p.n) { + cpu_io(); //2a + r = regs.pc + (int8)rd.l; + cpu_c6(r); //2b + regs.pc.w = r; + } +} + +/********************** + *** 0x30: bmi near *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; offset + [2a] pbr,pc+1 ; io [5] + [2b] pbr,pc+1 ; io [6] +*/ +void bCPU::op_bmi() { +uint16 r; + rd.l = op_read(); //2 + if(regs.p.n) { + cpu_io(); //2a + r = regs.pc + (int8)rd.l; + cpu_c6(r); //2b + regs.pc.w = r; + } +} + +/********************** + *** 0x50: bvc near *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; offset + [2a] pbr,pc+1 ; io [5] + [2b] pbr,pc+1 ; io [6] +*/ +void bCPU::op_bvc() { +uint16 r; + rd.l = op_read(); //2 + if(!regs.p.v) { + cpu_io(); //2a + r = regs.pc + (int8)rd.l; + cpu_c6(r); //2b + regs.pc.w = r; + } +} + +/********************** + *** 0x70: bvs near *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; offset + [2a] pbr,pc+1 ; io [5] + [2b] pbr,pc+1 ; io [6] +*/ +void bCPU::op_bvs() { +uint16 r; + rd.l = op_read(); //2 + if(regs.p.v) { + cpu_io(); //2a + r = regs.pc + (int8)rd.l; + cpu_c6(r); //2b + regs.pc.w = r; + } +} diff --git a/src/cpu/bcpu/bcpu_op_sbc.cpp b/src/cpu/bcpu/bcpu_op_sbc.cpp new file mode 100644 index 00000000..5e4b36cf --- /dev/null +++ b/src/cpu/bcpu/bcpu_op_sbc.cpp @@ -0,0 +1,494 @@ +void bCPU::flags_sbc_b() { +int32 r = regs.a.l - rd.l - !regs.p.c; +//bcd + if(regs.p.d) { + if(((r ) & 15) > 9)r -= 6; + if(((r >> 4) & 15) > 9)r -= 6 << 4; + } + regs.p.n = !!(r & 0x80); + regs.p.v = !!((regs.a.l ^ rd.l) & (regs.a.l ^ r) & 0x80); + regs.p.z = ((byte)r == 0); + regs.p.c = (r >= 0); + regs.a.l = r; +} + +void bCPU::flags_sbc_w() { +int32 r = regs.a.w - rd.w - !regs.p.c; +//bcd + if(regs.p.d) { + if(((r ) & 15) > 9)r -= 6; + if(((r >> 4) & 15) > 9)r -= 6 << 4; + if(((r >> 8) & 15) > 9)r -= 6 << 8; + if(((r >> 12) & 15) > 9)r -= 6 << 12; + } + regs.p.n = !!(r & 0x8000); + regs.p.v = !!((regs.a.w ^ rd.w) & (regs.a.w ^ r) & 0x8000); + regs.p.z = ((word)r == 0); + regs.p.c = (r >= 0); + regs.a.w = r; +} + +/************************ + *** 0xe9: sbc #const *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; idl + [2a] pbr,pc+2 ; idh [1] +*/ +void bCPU::op_sbc_constb() { + rd.l = op_read(); //2 + flags_sbc_b(); +} + +void bCPU::op_sbc_constw() { + rd.l = op_read(); //2 + rd.h = op_read(); //2a + flags_sbc_w(); +} + +void bCPU::op_sbc_const() { (regs.p.m)?op_sbc_constb():op_sbc_constw(); } + +/********************** + *** 0xed: sbc addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_sbc_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + flags_sbc_b(); +} + +void bCPU::op_sbc_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a + flags_sbc_w(); +} + +void bCPU::op_sbc_addr() { (regs.p.m)?op_sbc_addrb():op_sbc_addrw(); } + +/************************ + *** 0xfd: sbc addr,x *** + ************************ +cycles: + [1 ] pbr,pc ; opersbc + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+xl ; io [4] + [4 ] dbr,aa+x ; data low + [4a] dbr,aa+x+1 ; data high [1] +*/ +void bCPU::op_sbc_addrxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + flags_sbc_b(); +} + +void bCPU::op_sbc_addrxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //4a + flags_sbc_w(); +} + +void bCPU::op_sbc_addrx() { (regs.p.m)?op_sbc_addrxb():op_sbc_addrxw(); } + +/******************** + *** 0xe5: sbc dp *** + ******************** +cycles: + [1 ] pbr,pc ; opersbc + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] +*/ +void bCPU::op_sbc_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + flags_sbc_b(); +} + +void bCPU::op_sbc_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + rd.h = op_read(OPMODE_DP, dp + 1); //3a + flags_sbc_w(); +} + +void bCPU::op_sbc_dp() { (regs.p.m)?op_sbc_dpb():op_sbc_dpw(); } + +/********************** + *** 0xf2: sbc (dp) *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] dbr,aa ; data low + [5a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_sbc_idpb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + rd.l = op_read(OPMODE_DBR, aa.w); //5 + flags_sbc_b(); +} + +void bCPU::op_sbc_idpw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + rd.l = op_read(OPMODE_DBR, aa.w); //5 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //5 + flags_sbc_w(); +} + +void bCPU::op_sbc_idp() { (regs.p.m)?op_sbc_idpb():op_sbc_idpw(); } + +/********************** + *** 0xe7: sbc [dp] *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] 0,d+dp+2 ; aab + [6 ] aab,aa ; data low + [6a] aab,aa+1 ; data high [1] +*/ +void bCPU::op_sbc_ildpb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + rd.l = op_read(OPMODE_LONG, aa.d); //6 + flags_sbc_b(); +} + +void bCPU::op_sbc_ildpw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + rd.l = op_read(OPMODE_LONG, aa.d); //6 + rd.h = op_read(OPMODE_LONG, aa.d + 1); //6a + flags_sbc_w(); +} + +void bCPU::op_sbc_ildp() { (regs.p.m)?op_sbc_ildpb():op_sbc_ildpw(); } + +/********************** + *** 0xef: sbc long *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] pbr,pc+3 ; aab + [5 ] aab,aa ; data low + [5a] aab,aa+1 ; data high +*/ +void bCPU::op_sbc_longb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + rd.l = op_read(OPMODE_LONG, aa.d); //5 + flags_sbc_b(); +} + +void bCPU::op_sbc_longw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + rd.l = op_read(OPMODE_LONG, aa.d); //5 + rd.h = op_read(OPMODE_LONG, aa.d + 1); //5a + flags_sbc_w(); +} + +void bCPU::op_sbc_long() { (regs.p.m)?op_sbc_longb():op_sbc_longw(); } + +/************************ + *** 0xff: sbc long,x *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] pbr,pc+3 ; aab + [5 ] aab,aa+x ; data low + [5a] aab,aa+x+1 ; data high +*/ +void bCPU::op_sbc_longxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + rd.l = op_read(OPMODE_LONG, aa.d + regs.x.w); //5 + flags_sbc_b(); +} + +void bCPU::op_sbc_longxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + rd.l = op_read(OPMODE_LONG, aa.d + regs.x.w); //5 + rd.h = op_read(OPMODE_LONG, aa.d + regs.x.w + 1); //5a + flags_sbc_w(); +} + +void bCPU::op_sbc_longx() { (regs.p.m)?op_sbc_longxb():op_sbc_longxw(); } + +/************************ + *** 0xf9: sbc addr,y *** + ************************ +cycles: + [1 ] pbr,pc ; opersbc + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+yl ; io [4] + [4 ] dbr,aa+y ; data low + [4a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_sbc_addryb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //4 + flags_sbc_b(); +} + +void bCPU::op_sbc_addryw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //4a + flags_sbc_w(); +} + +void bCPU::op_sbc_addry() { (regs.p.m)?op_sbc_addryb():op_sbc_addryw(); } + +/********************** + *** 0xf5: sbc dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high +*/ +void bCPU::op_sbc_dpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + flags_sbc_b(); +} + +void bCPU::op_sbc_dpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //4a + flags_sbc_w(); +} + +void bCPU::op_sbc_dpx() { (regs.p.m)?op_sbc_dpxb():op_sbc_dpxw(); } + +/************************ + *** 0xe1: sbc (dp,x) *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; aal + [5 ] 0,d+dp+x+1 ; aah + [6 ] dbr,aa ; data low + [6a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_sbc_idpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5 + rd.l = op_read(OPMODE_DBR, aa.w); //6 + flags_sbc_b(); +} + +void bCPU::op_sbc_idpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5 + rd.l = op_read(OPMODE_DBR, aa.w); //6 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //6a + flags_sbc_w(); +} + +void bCPU::op_sbc_idpx() { (regs.p.m)?op_sbc_idpxb():op_sbc_idpxw(); } + +/************************ + *** 0xf1: sbc (dp),y *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [4a] dbr,aah,aal+yl ; io [4] + [5 ] dbr,aa+y ; data low + [5a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_sbc_idpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + cpu_c4(aa.w, aa.w + regs.y.w); //4a + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //5 + flags_sbc_b(); +} + +void bCPU::op_sbc_idpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + cpu_c4(aa.w, aa.w + regs.y.w); //4a + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //5 + rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //5a + flags_sbc_w(); +} + +void bCPU::op_sbc_idpy() { (regs.p.m)?op_sbc_idpyb():op_sbc_idpyw(); } + +/************************ + *** 0xf7: sbc [dp],y *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] 0,d+dp+2 ; aab + [6 ] aab,aa+y ; data low + [6a] aab,aa+y+1 ; data high [1] +*/ +void bCPU::op_sbc_ildpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + rd.l = op_read(OPMODE_LONG, aa.d + regs.y.w); //6 + flags_sbc_b(); +} + +void bCPU::op_sbc_ildpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + rd.l = op_read(OPMODE_LONG, aa.d + regs.y.w); //6 + rd.h = op_read(OPMODE_LONG, aa.d + regs.y.w + 1); //6a + flags_sbc_w(); +} + +void bCPU::op_sbc_ildpy() { (regs.p.m)?op_sbc_ildpyb():op_sbc_ildpyw(); } + +/********************** + *** 0xe3: sbc sr,s *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; sp + [3 ] pbr,pc+1 ; io + [4 ] 0,s+sp ; data low + [4a] 0,s+sp+1 ; data high [1] +*/ +void bCPU::op_sbc_srb() { + sp = op_read(); //2 + cpu_io(); //3 + rd.l = op_read(OPMODE_SP, sp); //4 + flags_sbc_b(); +} + +void bCPU::op_sbc_srw() { + sp = op_read(); //2 + cpu_io(); //3 + rd.l = op_read(OPMODE_SP, sp); //4 + rd.h = op_read(OPMODE_SP, sp + 1); //4a + flags_sbc_w(); +} + +void bCPU::op_sbc_sr() { (regs.p.m)?op_sbc_srb():op_sbc_srw(); } + +/************************** + *** 0xf3: sbc (sr,s),y *** + ************************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; sp + [3 ] pbr,pc+1 ; io + [4 ] 0,s+sp ; aal + [5 ] 0,s+sp+1 ; aah + [6 ] 0,s+sp+1 ; io + [7 ] dbr,aa+y ; data low + [7a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_sbc_isryb() { + sp = op_read(); //2 + cpu_io(); //3 + aa.l = op_read(OPMODE_SP, sp); //4 + aa.h = op_read(OPMODE_SP, sp + 1); //5 + cpu_io(); //6 + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //7 + flags_sbc_b(); +} + +void bCPU::op_sbc_isryw() { + sp = op_read(); //2 + cpu_io(); //3 + aa.l = op_read(OPMODE_SP, sp); //4 + aa.h = op_read(OPMODE_SP, sp + 1); //5 + cpu_io(); //6 + rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); //7 + rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //7a + flags_sbc_w(); +} + +void bCPU::op_sbc_isry() { (regs.p.m)?op_sbc_isryb():op_sbc_isryw(); } diff --git a/src/cpu/bcpu/bcpu_op_shift.cpp b/src/cpu/bcpu/bcpu_op_shift.cpp new file mode 100644 index 00000000..927712c6 --- /dev/null +++ b/src/cpu/bcpu/bcpu_op_shift.cpp @@ -0,0 +1,819 @@ +/***************** + *** 0x0a: asl *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_aslb() { + cpu_io(); //2 + regs.p.c = !!(regs.a.l & 0x80); + regs.a.l <<= 1; + regs.p.n = !!(regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void bCPU::op_aslw() { + cpu_io(); //2 + regs.p.c = !!(regs.a.w & 0x8000); + regs.a.w <<= 1; + regs.p.n = !!(regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +void bCPU::op_asl() { (regs.p.m)?op_aslb():op_aslw(); } + +/********************** + *** 0x0e: asl addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] + [5 ] dbr,aa+1 ; io + [6a] dbr,aa+1 ; data high [1] + [6 ] dbr,aa ; data low +*/ +void bCPU::op_asl_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + regs.p.c = !!(rd.l & 0x80); + rd.l <<= 1; + cpu_io(); //5 + op_write(OPMODE_DBR, aa.w, rd.l); //6 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_asl_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a + regs.p.c = !!(rd.w & 0x8000); + rd.w <<= 1; + cpu_io(); //5 + op_write(OPMODE_DBR, aa.w + 1, rd.h); //6a + op_write(OPMODE_DBR, aa.w, rd.l); //6 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_asl_addr() { (regs.p.m)?op_asl_addrb():op_asl_addrw(); } + +/************************ + *** 0x1e: asl addr,x *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aah,aal+xl ; io + [5 ] dbr,aa+x ; data low + [5a] dbr,aa+x+1 ; data high [1] + [6 ] dbr,aa+x+1 ; io + [7a] dbr,aa+x+1 ; data high [1] + [7 ] dbr,aa+x ; data low +*/ +void bCPU::op_asl_addrxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_io(); //4 + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5 + regs.p.c = !!(rd.l & 0x80); + rd.l <<= 1; + cpu_io(); //6 + op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_asl_addrxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_io(); //4 + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5 + rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //5a + regs.p.c = !!(rd.w & 0x8000); + rd.w <<= 1; + cpu_io(); //6 + op_write(OPMODE_DBR, aa.w + regs.x.w + 1, rd.h); //7a + op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_asl_addrx() { (regs.p.m)?op_asl_addrxb():op_asl_addrxw(); } + +/******************** + *** 0x06: asl dp *** + ******************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] + [4 ] 0,d+dp+1 ; io + [5a] 0,d+dp+1 ; data high [1] + [5 ] 0,d+dp ; data low +*/ +void bCPU::op_asl_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + regs.p.c = !!(rd.l & 0x80); + rd.l <<= 1; + cpu_io(); //4 + op_write(OPMODE_DP, dp, rd.l); //5 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_asl_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + rd.h = op_read(OPMODE_DP, dp + 1); //3a + regs.p.c = !!(rd.w & 0x8000); + rd.w <<= 1; + cpu_io(); //4 + op_write(OPMODE_DP, dp + 1, rd.h); //5a + op_write(OPMODE_DP, dp, rd.l); //5 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_asl_dp() { (regs.p.m)?op_asl_dpb():op_asl_dpw(); } + +/********************** + *** 0x16: asl dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high [1] + [5 ] 0,d+dp+x+1 ; io + [6a] 0,d+dp+x+1 ; data high [1] + [6 ] 0,d+dp+x ; data low +*/ +void bCPU::op_asl_dpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + regs.p.c = !!(rd.l & 0x80); + rd.l <<= 1; + cpu_io(); //5 + op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_asl_dpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //4a + regs.p.c = !!(rd.w & 0x8000); + rd.w <<= 1; + cpu_io(); //5 + op_write(OPMODE_DP, dp + regs.x.w + 1, rd.h); //6a + op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_asl_dpx() { (regs.p.m)?op_asl_dpxb():op_asl_dpxw(); } + +/***************** + *** 0x4a: lsr *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_lsrb() { + cpu_io(); //2 + regs.p.c = regs.a.l & 1; + regs.a.l >>= 1; + regs.p.n = !!(regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void bCPU::op_lsrw() { + cpu_io(); //2 + regs.p.c = regs.a.w & 1; + regs.a.w >>= 1; + regs.p.n = !!(regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +void bCPU::op_lsr() { (regs.p.m)?op_lsrb():op_lsrw(); } + +/********************** + *** 0x4e: lsr addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] + [5 ] dbr,aa+1 ; io + [6a] dbr,aa+1 ; data high [1] + [6 ] dbr,aa ; data low +*/ +void bCPU::op_lsr_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + regs.p.c = rd.l & 1; + rd.l >>= 1; + cpu_io(); //5 + op_write(OPMODE_DBR, aa.w, rd.l); //6 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_lsr_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a + regs.p.c = rd.w & 1; + rd.w >>= 1; + cpu_io(); //5 + op_write(OPMODE_DBR, aa.w + 1, rd.h); //6a + op_write(OPMODE_DBR, aa.w, rd.l); //6 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_lsr_addr() { (regs.p.m)?op_lsr_addrb():op_lsr_addrw(); } + +/************************ + *** 0x5e: lsr addr,x *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aah,aal+xl ; io + [5 ] dbr,aa+x ; data low + [5a] dbr,aa+x+1 ; data high [1] + [6 ] dbr,aa+x+1 ; io + [7a] dbr,aa+x+1 ; data high [1] + [7 ] dbr,aa+x ; data low +*/ +void bCPU::op_lsr_addrxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_io(); //4 + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5 + regs.p.c = rd.l & 1; + rd.l >>= 1; + cpu_io(); //6 + op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_lsr_addrxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_io(); //4 + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5 + rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //5a + regs.p.c = rd.w & 1; + rd.w >>= 1; + cpu_io(); //6 + op_write(OPMODE_DBR, aa.w + regs.x.w + 1, rd.h); //7a + op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_lsr_addrx() { (regs.p.m)?op_lsr_addrxb():op_lsr_addrxw(); } + +/******************** + *** 0x46: lsr dp *** + ******************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] + [4 ] 0,d+dp+1 ; io + [5a] 0,d+dp+1 ; data high [1] + [5 ] 0,d+dp ; data low +*/ +void bCPU::op_lsr_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + regs.p.c = rd.l & 1; + rd.l >>= 1; + cpu_io(); //4 + op_write(OPMODE_DP, dp, rd.l); //5 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_lsr_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + rd.h = op_read(OPMODE_DP, dp + 1); //3a + regs.p.c = rd.w & 1; + rd.w >>= 1; + cpu_io(); //4 + op_write(OPMODE_DP, dp + 1, rd.h); //5a + op_write(OPMODE_DP, dp, rd.l); //5 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_lsr_dp() { (regs.p.m)?op_lsr_dpb():op_lsr_dpw(); } + +/********************** + *** 0x56: lsr dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high [1] + [5 ] 0,d+dp+x+1 ; io + [6a] 0,d+dp+x+1 ; data high [1] + [6 ] 0,d+dp+x ; data low +*/ +void bCPU::op_lsr_dpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + regs.p.c = rd.l & 1; + rd.l >>= 1; + cpu_io(); //5 + op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_lsr_dpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //4a + regs.p.c = rd.w & 1; + rd.w >>= 1; + cpu_io(); //5 + op_write(OPMODE_DP, dp + regs.x.w + 1, rd.h); //6a + op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_lsr_dpx() { (regs.p.m)?op_lsr_dpxb():op_lsr_dpxw(); } + +/***************** + *** 0x2a: rol *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_rolb() { +uint8 c = regs.p.c; + cpu_io(); //2 + regs.p.c = !!(regs.a.l & 0x80); + regs.a.l <<= 1; + regs.a.l |= c; + regs.p.n = !!(regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void bCPU::op_rolw() { +uint16 c = regs.p.c; + cpu_io(); //2 + regs.p.c = !!(regs.a.w & 0x8000); + regs.a.w <<= 1; + regs.a.w |= c; + regs.p.n = !!(regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +void bCPU::op_rol() { (regs.p.m)?op_rolb():op_rolw(); } + +/********************** + *** 0x2e: rol addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] + [5 ] dbr,aa+1 ; io + [6a] dbr,aa+1 ; data high [1] + [6 ] dbr,aa ; data low +*/ +void bCPU::op_rol_addrb() { +uint8 c = regs.p.c; + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + regs.p.c = !!(rd.l & 0x80); + rd.l <<= 1; + rd.l |= c; + cpu_io(); //5 + op_write(OPMODE_DBR, aa.w, rd.l); //6 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_rol_addrw() { +uint16 c = regs.p.c; + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a + regs.p.c = !!(rd.w & 0x8000); + rd.w <<= 1; + rd.w |= c; + cpu_io(); //5 + op_write(OPMODE_DBR, aa.w + 1, rd.h); //6a + op_write(OPMODE_DBR, aa.w, rd.l); //6 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_rol_addr() { (regs.p.m)?op_rol_addrb():op_rol_addrw(); } + +/************************ + *** 0x3e: rol addr,x *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aah,aal+xl ; io + [5 ] dbr,aa+x ; data low + [5a] dbr,aa+x+1 ; data high [1] + [6 ] dbr,aa+x+1 ; io + [7a] dbr,aa+x+1 ; data high [1] + [7 ] dbr,aa+x ; data low +*/ +void bCPU::op_rol_addrxb() { +uint8 c = regs.p.c; + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_io(); //4 + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5 + regs.p.c = !!(rd.l & 0x80); + rd.l <<= 1; + rd.l |= c; + cpu_io(); //6 + op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_rol_addrxw() { +uint16 c = regs.p.c; + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_io(); //4 + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5 + rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //5a + regs.p.c = !!(rd.w & 0x8000); + rd.w <<= 1; + rd.w |= c; + cpu_io(); //6 + op_write(OPMODE_DBR, aa.w + regs.x.w + 1, rd.h); //7a + op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_rol_addrx() { (regs.p.m)?op_rol_addrxb():op_rol_addrxw(); } + +/******************** + *** 0x26: rol dp *** + ******************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] + [4 ] 0,d+dp+1 ; io + [5a] 0,d+dp+1 ; data high [1] + [5 ] 0,d+dp ; data low +*/ +void bCPU::op_rol_dpb() { +uint8 c = regs.p.c; + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + regs.p.c = !!(rd.l & 0x80); + rd.l <<= 1; + rd.l |= c; + cpu_io(); //4 + op_write(OPMODE_DP, dp, rd.l); //5 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_rol_dpw() { +uint16 c = regs.p.c; + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + rd.h = op_read(OPMODE_DP, dp + 1); //3a + regs.p.c = !!(rd.w & 0x8000); + rd.w <<= 1; + rd.w |= c; + cpu_io(); //4 + op_write(OPMODE_DP, dp + 1, rd.h); //5a + op_write(OPMODE_DP, dp, rd.l); //5 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_rol_dp() { (regs.p.m)?op_rol_dpb():op_rol_dpw(); } + +/********************** + *** 0x36: rol dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high [1] + [5 ] 0,d+dp+x+1 ; io + [6a] 0,d+dp+x+1 ; data high [1] + [6 ] 0,d+dp+x ; data low +*/ +void bCPU::op_rol_dpxb() { +uint8 c = regs.p.c; + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + regs.p.c = !!(rd.l & 0x80); + rd.l <<= 1; + rd.l |= c; + cpu_io(); //5 + op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_rol_dpxw() { +uint16 c = regs.p.c; + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //4a + regs.p.c = !!(rd.w & 0x8000); + rd.w <<= 1; + rd.w |= c; + cpu_io(); //5 + op_write(OPMODE_DP, dp + regs.x.w + 1, rd.h); //6a + op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_rol_dpx() { (regs.p.m)?op_rol_dpxb():op_rol_dpxw(); } + +/***************** + *** 0x6a: ror *** + ***************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; io +*/ +void bCPU::op_rorb() { +uint8 c = (regs.p.c)?0x80:0; + cpu_io(); //2 + regs.p.c = regs.a.l & 1; + regs.a.l >>= 1; + regs.a.l |= c; + regs.p.n = !!(regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void bCPU::op_rorw() { +uint16 c = (regs.p.c)?0x8000:0; + cpu_io(); //2 + regs.p.c = regs.a.w & 1; + regs.a.w >>= 1; + regs.a.w |= c; + regs.p.n = !!(regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +void bCPU::op_ror() { (regs.p.m)?op_rorb():op_rorw(); } + +/********************** + *** 0x6e: ror addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] + [5 ] dbr,aa+1 ; io + [6a] dbr,aa+1 ; data high [1] + [6 ] dbr,aa ; data low +*/ +void bCPU::op_ror_addrb() { +uint8 c = (regs.p.c)?0x80:0; + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + regs.p.c = rd.l & 1; + rd.l >>= 1; + rd.l |= c; + cpu_io(); //5 + op_write(OPMODE_DBR, aa.w, rd.l); //6 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_ror_addrw() { +uint16 c = (regs.p.c)?0x8000:0; + aa.l = op_read(); //2 + aa.h = op_read(); //3 + rd.l = op_read(OPMODE_DBR, aa.w); //4 + rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a + regs.p.c = rd.w & 1; + rd.w >>= 1; + rd.w |= c; + cpu_io(); //5 + op_write(OPMODE_DBR, aa.w + 1, rd.h); //6a + op_write(OPMODE_DBR, aa.w, rd.l); //6 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_ror_addr() { (regs.p.m)?op_ror_addrb():op_ror_addrw(); } + +/************************ + *** 0x7e: ror addr,x *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aah,aal+xl ; io + [5 ] dbr,aa+x ; data low + [5a] dbr,aa+x+1 ; data high [1] + [6 ] dbr,aa+x+1 ; io + [7a] dbr,aa+x+1 ; data high [1] + [7 ] dbr,aa+x ; data low +*/ +void bCPU::op_ror_addrxb() { +uint8 c = (regs.p.c)?0x80:0; + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_io(); //4 + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5 + regs.p.c = rd.l & 1; + rd.l >>= 1; + rd.l |= c; + cpu_io(); //6 + op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_ror_addrxw() { +uint16 c = (regs.p.c)?0x8000:0; + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_io(); //4 + rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5 + rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //5a + regs.p.c = rd.w & 1; + rd.w >>= 1; + rd.w |= c; + cpu_io(); //6 + op_write(OPMODE_DBR, aa.w + regs.x.w + 1, rd.h); //7a + op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_ror_addrx() { (regs.p.m)?op_ror_addrxb():op_ror_addrxw(); } + +/******************** + *** 0x66: ror dp *** + ******************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] + [4 ] 0,d+dp+1 ; io + [5a] 0,d+dp+1 ; data high [1] + [5 ] 0,d+dp ; data low +*/ +void bCPU::op_ror_dpb() { +uint8 c = (regs.p.c)?0x80:0; + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + regs.p.c = rd.l & 1; + rd.l >>= 1; + rd.l |= c; + cpu_io(); //4 + op_write(OPMODE_DP, dp, rd.l); //5 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_ror_dpw() { +uint16 c = (regs.p.c)?0x8000:0; + dp = op_read(); //2 + cpu_c2(); //2a + rd.l = op_read(OPMODE_DP, dp); //3 + rd.h = op_read(OPMODE_DP, dp + 1); //3a + regs.p.c = rd.w & 1; + rd.w >>= 1; + rd.w |= c; + cpu_io(); //4 + op_write(OPMODE_DP, dp + 1, rd.h); //5a + op_write(OPMODE_DP, dp, rd.l); //5 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_ror_dp() { (regs.p.m)?op_ror_dpb():op_ror_dpw(); } + +/********************** + *** 0x76: ror dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high [1] + [5 ] 0,d+dp+x+1 ; io + [6a] 0,d+dp+x+1 ; data high [1] + [6 ] 0,d+dp+x ; data low +*/ +void bCPU::op_ror_dpxb() { +uint8 c = (regs.p.c)?0x80:0; + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + regs.p.c = rd.l & 1; + rd.l >>= 1; + rd.l |= c; + cpu_io(); //5 + op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6 + regs.p.n = !!(rd.l & 0x80); + regs.p.z = (rd.l == 0); +} + +void bCPU::op_ror_dpxw() { +uint16 c = (regs.p.c)?0x8000:0; + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //4a + regs.p.c = rd.w & 1; + rd.w >>= 1; + rd.w |= c; + cpu_io(); //5 + op_write(OPMODE_DP, dp + regs.x.w + 1, rd.h); //6a + op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6 + regs.p.n = !!(rd.w & 0x8000); + regs.p.z = (rd.w == 0); +} + +void bCPU::op_ror_dpx() { (regs.p.m)?op_ror_dpxb():op_ror_dpxw(); } diff --git a/src/cpu/bcpu/bcpu_op_sta.cpp b/src/cpu/bcpu/bcpu_op_sta.cpp new file mode 100644 index 00000000..4dc9bf4b --- /dev/null +++ b/src/cpu/bcpu/bcpu_op_sta.cpp @@ -0,0 +1,415 @@ +/********************** + *** 0x8d: sta addr *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] dbr,aa ; data low + [4a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_sta_addrb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + op_write(OPMODE_DBR, aa.w, regs.a.l); //4 +} + +void bCPU::op_sta_addrw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + op_write(OPMODE_DBR, aa.w, regs.a.l); //4 + op_write(OPMODE_DBR, aa.w + 1, regs.a.h); //4a +} + +void bCPU::op_sta_addr() { (regs.p.m)?op_sta_addrb():op_sta_addrw(); } + +/************************ + *** 0x9d: sta addr,x *** + ************************ +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+xl ; io [4] + [4 ] dbr,aa+x ; data low + [4a] dbr,aa+x+1 ; data high [1] +*/ +void bCPU::op_sta_addrxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + op_write(OPMODE_DBR, aa.w + regs.x.w, regs.a.l); //4 +} + +void bCPU::op_sta_addrxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.x.w); //3a + op_write(OPMODE_DBR, aa.w + regs.x.w, regs.a.l); //4 + op_write(OPMODE_DBR, aa.w + regs.x.w + 1, regs.a.h); //4a +} + +void bCPU::op_sta_addrx() { (regs.p.m)?op_sta_addrxb():op_sta_addrxw(); } + +/******************** + *** 0x85: sta dp *** + ******************** +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; data low + [3a] 0,d+dp+1 ; data high [1] +*/ +void bCPU::op_sta_dpb() { + dp = op_read(); //2 + cpu_c2(); //2a + op_write(OPMODE_DP, dp, regs.a.l); //3 +} + +void bCPU::op_sta_dpw() { + dp = op_read(); //2 + cpu_c2(); //2a + op_write(OPMODE_DP, dp, regs.a.l); //3 + op_write(OPMODE_DP, dp + 1, regs.a.h); //3a +} + +void bCPU::op_sta_dp() { (regs.p.m)?op_sta_dpb():op_sta_dpw(); } + +/********************** + *** 0x92: sta (dp) *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] dbr,aa ; data low + [5a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_sta_idpb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + op_write(OPMODE_DBR, aa.w, regs.a.l); //5 +} + +void bCPU::op_sta_idpw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + op_write(OPMODE_DBR, aa.w, regs.a.l); //5 + op_write(OPMODE_DBR, aa.w + 1, regs.a.h); //5 +} + +void bCPU::op_sta_idp() { (regs.p.m)?op_sta_idpb():op_sta_idpw(); } + +/********************** + *** 0x87: sta [dp] *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] 0,d+dp+2 ; aab + [6 ] aab,aa ; data low + [6a] aab,aa+1 ; data high [1] +*/ +void bCPU::op_sta_ildpb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + op_write(OPMODE_LONG, aa.d, regs.a.l); //6 +} + +void bCPU::op_sta_ildpw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + op_write(OPMODE_LONG, aa.d, regs.a.l); //6 + op_write(OPMODE_LONG, aa.d + 1, regs.a.h); //6a +} + +void bCPU::op_sta_ildp() { (regs.p.m)?op_sta_ildpb():op_sta_ildpw(); } + +/********************** + *** 0x8f: sta long *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] pbr,pc+3 ; aab + [5 ] aab,aa ; data low + [5a] aab,aa+1 ; data high +*/ +void bCPU::op_sta_longb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + op_write(OPMODE_LONG, aa.d, regs.a.l); //5 +} + +void bCPU::op_sta_longw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + op_write(OPMODE_LONG, aa.d, regs.a.l); //5 + op_write(OPMODE_LONG, aa.d + 1, regs.a.h); //5a +} + +void bCPU::op_sta_long() { (regs.p.m)?op_sta_longb():op_sta_longw(); } + +/************************ + *** 0x9f: sta long,x *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [4 ] pbr,pc+3 ; aab + [5 ] aab,aa+x ; data low + [5a] aab,aa+x+1 ; data high +*/ +void bCPU::op_sta_longxb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + op_write(OPMODE_LONG, aa.d + regs.x.w, regs.a.l); //5 +} + +void bCPU::op_sta_longxw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + aa.b = op_read(); //4 + op_write(OPMODE_LONG, aa.d + regs.x.w, regs.a.l); //5 + op_write(OPMODE_LONG, aa.d + regs.x.w + 1, regs.a.h); //5a +} + +void bCPU::op_sta_longx() { (regs.p.m)?op_sta_longxb():op_sta_longxw(); } + +/************************ + *** 0x99: sta addr,y *** + ************************ +cycles: + [1 ] pbr,pc ; operand + [2 ] pbr,pc+1 ; aal + [3 ] pbr,pc+2 ; aah + [3a] dbr,aah,aal+yl ; io [4] + [4 ] dbr,aa+y ; data low + [4a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_sta_addryb() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + op_write(OPMODE_DBR, aa.w + regs.y.w, regs.a.l); //4 +} + +void bCPU::op_sta_addryw() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_c4(aa.w, aa.w + regs.y.w); //3a + op_write(OPMODE_DBR, aa.w + regs.y.w, regs.a.l); //4 + op_write(OPMODE_DBR, aa.w + regs.y.w + 1, regs.a.h); //4a +} + +void bCPU::op_sta_addry() { (regs.p.m)?op_sta_addryb():op_sta_addryw(); } + +/********************** + *** 0x95: sta dp,x *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; data low + [4a] 0,d+dp+x+1 ; data high +*/ +void bCPU::op_sta_dpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + op_write(OPMODE_DP, dp + regs.x.w, regs.a.l); //4 +} + +void bCPU::op_sta_dpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + op_write(OPMODE_DP, dp + regs.x.w, regs.a.l); //4 + op_write(OPMODE_DP, dp + regs.x.w + 1, regs.a.h); //4a +} + +void bCPU::op_sta_dpx() { (regs.p.m)?op_sta_dpxb():op_sta_dpxw(); } + +/************************ + *** 0x81: sta (dp,x) *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] pbr,pc+1 ; io + [4 ] 0,d+dp+x ; aal + [5 ] 0,d+dp+x+1 ; aah + [6 ] dbr,aa ; data low + [6a] dbr,aa+1 ; data high [1] +*/ +void bCPU::op_sta_idpxb() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5 + op_write(OPMODE_DBR, aa.w, regs.a.l); //6 +} + +void bCPU::op_sta_idpxw() { + dp = op_read(); //2 + cpu_c2(); //2a + cpu_io(); //3 + aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4 + aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5 + op_write(OPMODE_DBR, aa.w, regs.a.l); //6 + op_write(OPMODE_DBR, aa.w + 1, regs.a.h); //6a +} + +void bCPU::op_sta_idpx() { (regs.p.m)?op_sta_idpxb():op_sta_idpxw(); } + +/************************ + *** 0x91: sta (dp),y *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [4a] dbr,aah,aal+yl ; io [4] + [5 ] dbr,aa+y ; data low + [5a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_sta_idpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + cpu_c4(aa.w, aa.w + regs.y.w); //4a + op_write(OPMODE_DBR, aa.w + regs.y.w, regs.a.l); //5 +} + +void bCPU::op_sta_idpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + cpu_c4(aa.w, aa.w + regs.y.w); //4a + op_write(OPMODE_DBR, aa.w + regs.y.w, regs.a.l); //5 + op_write(OPMODE_DBR, aa.w + regs.y.w + 1, regs.a.h); //5a +} + +void bCPU::op_sta_idpy() { (regs.p.m)?op_sta_idpyb():op_sta_idpyw(); } + +/************************ + *** 0x97: sta [dp],y *** + ************************ +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io [2] + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] 0,d+dp+2 ; aab + [6 ] aab,aa+y ; data low + [6a] aab,aa+y+1 ; data high [1] +*/ +void bCPU::op_sta_ildpyb() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + op_write(OPMODE_LONG, aa.d + regs.y.w, regs.a.l); //6 +} + +void bCPU::op_sta_ildpyw() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + aa.b = op_read(OPMODE_DP, dp + 2); //5 + op_write(OPMODE_LONG, aa.d + regs.y.w, regs.a.l); //6 + op_write(OPMODE_LONG, aa.d + regs.y.w + 1, regs.a.h); //6a +} + +void bCPU::op_sta_ildpy() { (regs.p.m)?op_sta_ildpyb():op_sta_ildpyw(); } + +/********************** + *** 0x83: sta sr,s *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; sp + [3 ] pbr,pc+1 ; io + [4 ] 0,s+sp ; data low + [4a] 0,s+sp+1 ; data high [1] +*/ +void bCPU::op_sta_srb() { + sp = op_read(); //2 + cpu_io(); //3 + op_write(OPMODE_SP, sp, regs.a.l); //4 +} + +void bCPU::op_sta_srw() { + sp = op_read(); //2 + cpu_io(); //3 + op_write(OPMODE_SP, sp, regs.a.l); //4 + op_write(OPMODE_SP, sp + 1, regs.a.h); //4a +} + +void bCPU::op_sta_sr() { (regs.p.m)?op_sta_srb():op_sta_srw(); } + +/************************** + *** 0x93: sta (sr,s),y *** + ************************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; sp + [3 ] pbr,pc+1 ; io + [4 ] 0,s+sp ; aal + [5 ] 0,s+sp+1 ; aah + [6 ] 0,s+sp+1 ; io + [7 ] dbr,aa+y ; data low + [7a] dbr,aa+y+1 ; data high [1] +*/ +void bCPU::op_sta_isryb() { + sp = op_read(); //2 + cpu_io(); //3 + aa.l = op_read(OPMODE_SP, sp); //4 + aa.h = op_read(OPMODE_SP, sp + 1); //5 + cpu_io(); //6 + op_write(OPMODE_DBR, aa.w + regs.y.w, regs.a.l); //7 +} + +void bCPU::op_sta_isryw() { + sp = op_read(); //2 + cpu_io(); //3 + aa.l = op_read(OPMODE_SP, sp); //4 + aa.h = op_read(OPMODE_SP, sp + 1); //5 + cpu_io(); //6 + op_write(OPMODE_DBR, aa.w + regs.y.w, regs.a.l); //7 + op_write(OPMODE_DBR, aa.w + regs.y.w + 1, regs.a.h); //7a +} + +void bCPU::op_sta_isry() { (regs.p.m)?op_sta_isryb():op_sta_isryw(); } diff --git a/src/cpu/bcpu/bcpu_op_stack.cpp b/src/cpu/bcpu/bcpu_op_stack.cpp new file mode 100644 index 00000000..defddb1a --- /dev/null +++ b/src/cpu/bcpu/bcpu_op_stack.cpp @@ -0,0 +1,320 @@ +/***************** + *** 0x48: pha *** + ***************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; io + [3a] 0,s ; reg high [1] + [3 ] 0,s-1 ; reg low +*/ +void bCPU::op_phab() { + cpu_io(); //2 + stack_write(regs.a.l); //3 +} + +void bCPU::op_phaw() { + cpu_io(); //2 + stack_write(regs.a.h); //3a + stack_write(regs.a.l); //3 +} + +void bCPU::op_pha() { (regs.p.m)?op_phab():op_phaw(); } + +/***************** + *** 0x8b: phb *** + ***************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; io + [3 ] 0,s-1 ; dbr +*/ +void bCPU::op_phb() { + cpu_io(); //2 + stack_write(regs.db); //3 +} + +/***************** + *** 0x0b: phd *** + ***************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; io + [3a] 0,s ; reg high + [3 ] 0,s-1 ; reg low +*/ +void bCPU::op_phd() { + cpu_io(); //2 + stack_write(regs.d.h); //3a + stack_write(regs.d.l); //3 +} + +/***************** + *** 0x4b: phk *** + ***************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; io + [3 ] 0,s-1 ; pcb +*/ +void bCPU::op_phk() { + cpu_io(); //2 + stack_write(regs.pc.b); //3 +} + +/***************** + *** 0x08: php *** + ***************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; io + [3 ] 0,s-1 ; reg low +*/ +void bCPU::op_php() { + cpu_io(); //2 + stack_write(regs.p); //3 +} + +/***************** + *** 0xda: phx *** + ***************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; io + [3a] 0,s ; reg high [1] + [3 ] 0,s-1 ; reg low +*/ +void bCPU::op_phxb() { + cpu_io(); //2 + stack_write(regs.x.l); //3 +} + +void bCPU::op_phxw() { + cpu_io(); //2 + stack_write(regs.x.h); //3a + stack_write(regs.x.l); //3 +} + +void bCPU::op_phx() { (regs.p.x)?op_phxb():op_phxw(); } + +/***************** + *** 0x5a: phy *** + ***************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; io + [3a] 0,s ; reg high [1] + [3 ] 0,s-1 ; reg low +*/ +void bCPU::op_phyb() { + cpu_io(); //2 + stack_write(regs.y.l); //3 +} + +void bCPU::op_phyw() { + cpu_io(); //2 + stack_write(regs.y.h); //3a + stack_write(regs.y.l); //3 +} + +void bCPU::op_phy() { (regs.p.x)?op_phyb():op_phyw(); } + +/***************** + *** 0x68: pla *** + ***************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,s+1 ; reg low + [4a] 0,s+2 ; reg high [1] +*/ +void bCPU::op_plab() { + cpu_io(); //2 + cpu_io(); //3 + regs.a.l = stack_read(); //4 + regs.p.n = !!(regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void bCPU::op_plaw() { + cpu_io(); //2 + cpu_io(); //3 + regs.a.l = stack_read(); //4 + regs.a.h = stack_read(); //4a + regs.p.n = !!(regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +void bCPU::op_pla() { (regs.p.m)?op_plab():op_plaw(); } + +/***************** + *** 0xab: plb *** + ***************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,s+1 ; reg low +*/ +void bCPU::op_plb() { + cpu_io(); //2 + cpu_io(); //3 + regs.db = stack_read(); //4 + regs.p.n = !!(regs.db & 0x80); + regs.p.z = (regs.db == 0); +} + +/***************** + *** 0x2b: pld *** + ***************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,s+1 ; reg low + [4a] 0,s+2 ; reg high +*/ +void bCPU::op_pld() { + cpu_io(); //2 + cpu_io(); //3 + regs.d.l = stack_read(); //4 + regs.d.h = stack_read(); //4a + regs.p.n = !!(regs.d.w & 0x8000); + regs.p.z = (regs.d.w == 0); +} + +/***************** + *** 0x28: plp *** + ***************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,s+1 ; reg low +*/ +void bCPU::op_plp() { + cpu_io(); //2 + cpu_io(); //3 + regs.p = stack_read(); //4 + if(regs.e)regs.p |= 0x30; + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } +} + +/***************** + *** 0xfa: plx *** + ***************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,s+1 ; reg low + [4a] 0,s+2 ; reg high [1] +*/ +void bCPU::op_plxb() { + cpu_io(); //2 + cpu_io(); //3 + regs.x.l = stack_read(); //4 + regs.p.n = !!(regs.x.l & 0x80); + regs.p.z = (regs.x.l == 0); +} + +void bCPU::op_plxw() { + cpu_io(); //2 + cpu_io(); //3 + regs.x.l = stack_read(); //4 + regs.x.h = stack_read(); //4a + regs.p.n = !!(regs.x.w & 0x8000); + regs.p.z = (regs.x.w == 0); +} + +void bCPU::op_plx() { (regs.p.x)?op_plxb():op_plxw(); } + +/***************** + *** 0x7a: ply *** + ***************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; io + [3 ] pbr,pc+1 ; io + [4 ] 0,s+1 ; reg low + [4a] 0,s+2 ; reg high [1] +*/ +void bCPU::op_plyb() { + cpu_io(); //2 + cpu_io(); //3 + regs.y.l = stack_read(); //4 + regs.p.n = !!(regs.y.l & 0x80); + regs.p.z = (regs.y.l == 0); +} + +void bCPU::op_plyw() { + cpu_io(); //2 + cpu_io(); //3 + regs.y.l = stack_read(); //4 + regs.y.h = stack_read(); //4a + regs.p.n = !!(regs.y.w & 0x8000); + regs.p.z = (regs.y.w == 0); +} + +void bCPU::op_ply() { (regs.p.x)?op_plyb():op_plyw(); } + +/********************** + *** 0xf4: pea addr *** + ********************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; aal + [3] pbr,pc+2 ; aah + [4] 0,s ; aah + [5] 0,s-1 ; aal +*/ +void bCPU::op_pea() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + stack_write(aa.h); //4 + stack_write(aa.l); //5 +} + +/********************** + *** 0xd4: pei (dp) *** + ********************** +cycles: + [1 ] pbr,pc ; opcode + [2 ] pbr,pc+1 ; dp + [2a] pbr,pc+1 ; io + [3 ] 0,d+dp ; aal + [4 ] 0,d+dp+1 ; aah + [5 ] 0,s ; aah + [6 ] 0,s-1 ; aal +*/ +void bCPU::op_pei() { + dp = op_read(); //2 + cpu_c2(); //2a + aa.l = op_read(OPMODE_DP, dp); //3 + aa.h = op_read(OPMODE_DP, dp + 1); //4 + stack_write(aa.h); //5 + stack_write(aa.l); //6 +} + +/********************** + *** 0x62: per addr *** + ********************** +cycles: + [1] pbr,pc ; opcode + [2] pbr,pc+1 ; offset low + [3] pbr,pc+2 ; offset high + [4] pbr,pc+2 ; io + [5] 0,s ; pch+offset + [6] 0,s-1 ; pcl+offset +*/ +void bCPU::op_per() { + aa.l = op_read(); //2 + aa.h = op_read(); //3 + cpu_io(); //4 + rd.w = regs.pc.d + (int16)aa.w; + stack_write(rd.h); //5 + stack_write(rd.l); //6 +} diff --git a/src/cpu/cpu.cpp b/src/cpu/cpu.cpp new file mode 100644 index 00000000..6c43bc68 --- /dev/null +++ b/src/cpu/cpu.cpp @@ -0,0 +1,6 @@ +#include "../base.h" +#include "dcpu.cpp" + +CPU::CPU() { + mmio = &mmio_unmapped; +} diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h new file mode 100644 index 00000000..9ecbf73f --- /dev/null +++ b/src/cpu/cpu.h @@ -0,0 +1,49 @@ +#include "cpuregs.h" + +class CPU { +public: +MMIO *mmio; +CPURegs regs; + enum { + FLAG_N = 0x80, FLAG_V = 0x40, + FLAG_M = 0x20, FLAG_X = 0x10, + FLAG_D = 0x08, FLAG_I = 0x04, + FLAG_Z = 0x02, FLAG_C = 0x01 + }; + virtual uint8 pio_status() = 0; + virtual void run() = 0; + virtual void scanline() = 0; + virtual void frame() = 0; + virtual void power() = 0; + virtual void reset() = 0; + +//opcode disassembler + enum { + OPTYPE_DP = 0, //dp + OPTYPE_DPX, //dp,x + OPTYPE_DPY, //dp,y + OPTYPE_IDP, //(dp) + OPTYPE_IDPX, //(dp,x) + OPTYPE_IDPY, //(dp),y + OPTYPE_ILDP, //[dp] + OPTYPE_ILDPY, //[dp],y + OPTYPE_ADDR, //addr + OPTYPE_ADDRX, //addr,x + OPTYPE_ADDRY, //addr,y + OPTYPE_IADDRX, //(addr,x) + OPTYPE_ILADDR, //[addr] + OPTYPE_LONG, //long + OPTYPE_LONGX, //long, x + OPTYPE_SR, //sr,s + OPTYPE_ISRY, //(sr,s),y + OPTYPE_ADDR_PC, //pbr:addr + OPTYPE_IADDR_PC //pbr:(addr) + }; + void disassemble_opcode(char *output); + uint32 resolve_offset(uint8 offset_type, uint32 addr); + uint8 opcode_length(); + uint16 __relb(int8 offset); + uint16 __relw(int16 offset); + + CPU(); +}; diff --git a/src/cpu/cpuregs.h b/src/cpu/cpuregs.h new file mode 100644 index 00000000..6725fe2a --- /dev/null +++ b/src/cpu/cpuregs.h @@ -0,0 +1,84 @@ +class CPURegFlags { +private: + template class bit { + public: + uint8 b; + inline operator bool() { return (b & B); } + inline operator = (bool i) { (i) ? b |= B : b &= ~B; return (b & B); } + inline operator & (bool i) { if(i)b &= ~B; return (b & B); } + inline operator | (bool i) { if(i)b |= B; return (b & B); } + inline operator ^ (bool i) { if(i)b ^= B; return (b & B); } + }; +public: + union { + uint8 b; + bit<0x80> n; + bit<0x40> v; + bit<0x20> m; + bit<0x10> x; + bit<0x08> d; + bit<0x04> i; + bit<0x02> z; + bit<0x01> c; + }; + + CPURegFlags() { b = 0; } + inline operator uint8() { return b; } + inline unsigned operator = (uint8 i) { b = i; return b; } + inline unsigned operator &= (uint8 i) { b &= i; return b; } + inline unsigned operator |= (uint8 i) { b |= i; return b; } + inline unsigned operator ^= (uint8 i) { b ^= i; return b; } +}; + +class CPUReg16 { +public: + union { + uint16 w; + struct { uint8 l, h; }; + }; + + CPUReg16() { w = 0; } + inline operator uint16() { return w; } + inline unsigned operator = (uint16 i) { w = i; return w; } + inline unsigned operator += (uint16 i) { w += i; return w; } + inline unsigned operator -= (uint16 i) { w -= i; return w; } + inline unsigned operator *= (uint16 i) { w *= i; return w; } + inline unsigned operator /= (uint16 i) { w /= i; return w; } + inline unsigned operator &= (uint16 i) { w &= i; return w; } + inline unsigned operator |= (uint16 i) { w |= i; return w; } + inline unsigned operator ^= (uint16 i) { w ^= i; return w; } + inline unsigned operator <<= (uint16 i) { w <<= i; return w; } + inline unsigned operator >>= (uint16 i) { w >>= i; return w; } +}; + +class CPUReg24 { +public: + union { + uint16 w; + uint32 d; + struct { uint8 l, h, b; }; + }; + + CPUReg24() { d = 0; } + inline operator uint32() { return (d & 0xffffff); } + inline unsigned operator = (uint16 i) { d = i; return d; } + inline unsigned operator += (uint16 i) { d += i; return d; } + inline unsigned operator -= (uint16 i) { d -= i; return d; } + inline unsigned operator *= (uint16 i) { d *= i; return d; } + inline unsigned operator /= (uint16 i) { d /= i; return d; } + inline unsigned operator &= (uint16 i) { d &= i; return d; } + inline unsigned operator |= (uint16 i) { d |= i; return d; } + inline unsigned operator ^= (uint16 i) { d ^= i; return d; } + inline unsigned operator <<= (uint16 i) { d <<= i; return d; } + inline unsigned operator >>= (uint16 i) { d >>= i; return d; } +}; + +class CPURegs { +public: +CPUReg24 pc; +CPUReg16 a, x, y, s, d; +CPURegFlags p; +uint8 db; +bool e; + CPURegs() { db = 0; e = false; } +}; diff --git a/src/cpu/dcpu.cpp b/src/cpu/dcpu.cpp new file mode 100644 index 00000000..240bcaab --- /dev/null +++ b/src/cpu/dcpu.cpp @@ -0,0 +1,439 @@ +uint16 CPU::__relb(int8 offset) { +uint32 addr; + addr = (regs.pc.d & 0xff0000) | ((regs.pc.d + 2) & 0xffff); + return addr + offset; +} + +uint16 CPU::__relw(int16 offset) { +uint32 addr; + addr = (regs.pc.d & 0xff0000) | ((regs.pc.d + 3) & 0xffff); + return addr + offset; +} + +uint32 CPU::resolve_offset(uint8 offset_type, uint32 addr) { +uint32 r = 0; + switch(offset_type) { + case OPTYPE_DP: + r = (regs.d + (addr & 0xffff)) & 0xffff; + break; + case OPTYPE_DPX: + r = (regs.d + regs.x + (addr & 0xffff)) & 0xffff; + break; + case OPTYPE_DPY: + r = (regs.d + regs.y + (addr & 0xffff)) & 0xffff; + break; + case OPTYPE_IDP: + addr = (regs.d + (addr & 0xffff)) & 0xffff; + r = (regs.db << 16) + mem_bus->read_word(addr); + break; + case OPTYPE_IDPX: + addr = (regs.d + regs.x + (addr & 0xffff)) & 0xffff; + r = (regs.db << 16) + mem_bus->read_word(addr); + break; + case OPTYPE_IDPY: + addr = (regs.d + (addr & 0xffff)) & 0xffff; + r = (regs.db << 16) + mem_bus->read_word(addr) + regs.y; + break; + case OPTYPE_ILDP: + addr = (regs.d + (addr & 0xffff)) & 0xffff; + r = mem_bus->read_long(addr); + break; + case OPTYPE_ILDPY: + addr = (regs.d + (addr & 0xffff)) & 0xffff; + r = mem_bus->read_long(addr) + regs.y; + break; + case OPTYPE_ADDR: + r = (regs.db << 16) + (addr & 0xffff); + break; + case OPTYPE_ADDR_PC: + r = (regs.pc.b << 16) + (addr & 0xffff); + break; + case OPTYPE_ADDRX: + r = (regs.db << 16) + (addr & 0xffff) + regs.x; + break; + case OPTYPE_ADDRY: + r = (regs.db << 16) + (addr & 0xffff) + regs.y; + break; + case OPTYPE_IADDR_PC: + r = (regs.pc.b << 16) + (addr & 0xffff); + break; + case OPTYPE_IADDRX: + r = (regs.pc.b << 16) + ((addr + regs.x) & 0xffff); + break; + case OPTYPE_ILADDR: + r = addr & 0xffffff; + break; + case OPTYPE_LONG: + r = addr & 0xffffff; + break; + case OPTYPE_LONGX: + r = (addr + regs.x) & 0xffffff; + break; + case OPTYPE_SR: + r = (regs.s + (addr & 0xff)) & 0xffff; + break; + case OPTYPE_ISRY: + addr = (regs.s + (addr & 0xff)) & 0xffff; + r = (regs.db << 16) + mem_bus->read_word(addr) + regs.y; + break; + } + return r; +} + +void CPU::disassemble_opcode(char *output) { +char *s = output; +char t[256]; +uint8 op, op0, op1, op2; + sprintf(s, "%0.6x ", regs.pc.d); + +//TODO: This should wrap around the bank byte + op = mem_bus->read(regs.pc.d); + op0 = mem_bus->read(regs.pc.d + 1); + op1 = mem_bus->read(regs.pc.d + 2); + op2 = mem_bus->read(regs.pc.d + 3); + + switch(op) { + case 0x00:sprintf(t, "brk #$%0.2x ", op0);break; + case 0x01:sprintf(t, "ora ($%0.2x,x) [$%0.6x]", op0, resolve_offset(OPTYPE_IDPX, op0));break; + case 0x02:sprintf(t, "cop #$%0.2x ", op0);break; + case 0x03:sprintf(t, "ora $%0.2x,s [$%0.6x]", op0, resolve_offset(OPTYPE_SR, op0));break; + case 0x04:sprintf(t, "tsb $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0x05:sprintf(t, "ora $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0x06:sprintf(t, "asl $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0x07:sprintf(t, "ora [$%0.2x] [$%0.6x]", op0, resolve_offset(OPTYPE_ILDP, op0));break; + case 0x08:sprintf(t, "php ");break; + case 0x09: + if(regs.p.m)sprintf(t, "ora #$%0.2x ", op0); + else sprintf(t, "ora #$%0.4x ", op0|op1<<8);break; + case 0x0a:sprintf(t, "asl a ");break; + case 0x0b:sprintf(t, "phd ");break; + case 0x0c:sprintf(t, "tsb $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0x0d:sprintf(t, "ora $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0x0e:sprintf(t, "asl $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0x0f:sprintf(t, "ora $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONG, (op0|op1<<8|op2<<16)));break; + case 0x10:sprintf(t, "bpl $%0.4x [$%0.6x]", __relb(op0)&0xffff, __relb(op0)&0xffffff);break; + case 0x11:sprintf(t, "ora ($%0.2x),y [$%0.6x]", op0, resolve_offset(OPTYPE_IDPY, op0));break; + case 0x12:sprintf(t, "ora ($%0.2x) [$%0.6x]", op0, resolve_offset(OPTYPE_IDP, op0));break; + case 0x13:sprintf(t, "ora ($%0.2x,s),y [$%0.6x]", op0, resolve_offset(OPTYPE_ISRY, op0));break; + case 0x14:sprintf(t, "trb $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0x15:sprintf(t, "ora $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0x16:sprintf(t, "asl $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0x17:sprintf(t, "ora [$%0.2x],y [$%0.6x]", op0, resolve_offset(OPTYPE_ILDPY, op0));break; + case 0x18:sprintf(t, "clc ");break; + case 0x19:sprintf(t, "ora $%0.4x,y [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRY, (op0|op1<<8)));break; + case 0x1a:sprintf(t, "inc ");break; + case 0x1b:sprintf(t, "tcs ");break; + case 0x1c:sprintf(t, "trb $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0x1d:sprintf(t, "ora $%0.4x,x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRX, (op0|op1<<8)));break; + case 0x1e:sprintf(t, "asl $%0.4x,x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRX, (op0|op1<<8)));break; + case 0x1f:sprintf(t, "ora $%0.6x,x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONGX, (op0|op1<<8|op2<<16)));break; + case 0x20:sprintf(t, "jsr $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR_PC, (op0|op1<<8)));break; + case 0x21:sprintf(t, "and ($%0.2x,x) [$%0.6x]", op0, resolve_offset(OPTYPE_IDPX, op0));break; + case 0x22:sprintf(t, "jsl $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONG, (op0|op1<<8|op2<<16)));break; + case 0x23:sprintf(t, "and $%0.2x,s [$%0.6x]", op0, resolve_offset(OPTYPE_SR, op0));break; + case 0x24:sprintf(t, "bit $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0x25:sprintf(t, "and $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0x26:sprintf(t, "rol $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0x27:sprintf(t, "and [$%0.2x] [$%0.6x]", op0, resolve_offset(OPTYPE_ILDP, op0));break; + case 0x28:sprintf(t, "plp ");break; + case 0x29: + if(regs.p.m)sprintf(t, "and #$%0.2x ", op0); + else sprintf(t, "and #$%0.4x ", op0|op1<<8);break; + case 0x2a:sprintf(t, "rol a ");break; + case 0x2b:sprintf(t, "pld ");break; + case 0x2c:sprintf(t, "bit $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0x2d:sprintf(t, "and $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0x2e:sprintf(t, "rol $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0x2f:sprintf(t, "and $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONG, (op0|op1<<8|op2<<16)));break; + case 0x30:sprintf(t, "bmi $%0.4x [$%0.6x]", __relb(op0)&0xffff, __relb(op0)&0xffffff);break; + case 0x31:sprintf(t, "and ($%0.2x),y [$%0.6x]", op0, resolve_offset(OPTYPE_IDPY, op0));break; + case 0x32:sprintf(t, "and ($%0.2x) [$%0.6x]", op0, resolve_offset(OPTYPE_IDP, op0));break; + case 0x33:sprintf(t, "and ($%0.2x,s),y [$%0.6x]", op0, resolve_offset(OPTYPE_ISRY, op0));break; + case 0x34:sprintf(t, "bit $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0x35:sprintf(t, "and $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0x36:sprintf(t, "rol $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0x37:sprintf(t, "and [$%0.2x],y [$%0.6x]", op0, resolve_offset(OPTYPE_ILDPY, op0));break; + case 0x38:sprintf(t, "sec ");break; + case 0x39:sprintf(t, "and $%0.4x,y [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRY, (op0|op1<<8)));break; + case 0x3a:sprintf(t, "dec ");break; + case 0x3b:sprintf(t, "tsc ");break; + case 0x3c:sprintf(t, "bit $%0.4x,x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRX, (op0|op1<<8)));break; + case 0x3d:sprintf(t, "and $%0.4x,x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRX, (op0|op1<<8)));break; + case 0x3e:sprintf(t, "rol $%0.4x,x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRX, (op0|op1<<8)));break; + case 0x3f:sprintf(t, "and $%0.6x,x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONGX, (op0|op1<<8|op2<<16)));break; + case 0x40:sprintf(t, "rti ");break; + case 0x41:sprintf(t, "eor ($%0.2x,x) [$%0.6x]", op0, resolve_offset(OPTYPE_IDPX, op0));break; + case 0x42:sprintf(t, "wdm ");break; + case 0x43:sprintf(t, "eor $%0.2x,s [$%0.6x]", op0, resolve_offset(OPTYPE_SR, op0));break; + case 0x44:sprintf(t, "mvp $%0.2x,$%0.2x ", op1, op0);break; + case 0x45:sprintf(t, "eor $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0x46:sprintf(t, "lsr $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0x47:sprintf(t, "eor [$%0.2x] [$%0.6x]", op0, resolve_offset(OPTYPE_ILDP, op0));break; + case 0x48:sprintf(t, "pha ");break; + case 0x49: + if(regs.p.m)sprintf(t, "eor #$%0.2x ", op0); + else sprintf(t, "eor #$%0.4x ", op0|op1<<8);break; + case 0x4a:sprintf(t, "lsr a ");break; + case 0x4b:sprintf(t, "phk ");break; + case 0x4c:sprintf(t, "jmp $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR_PC, (op0|op1<<8)));break; + case 0x4d:sprintf(t, "eor $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0x4e:sprintf(t, "lsr $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0x4f:sprintf(t, "eor $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONG, (op0|op1<<8|op2<<16)));break; + case 0x50:sprintf(t, "bvc $%0.4x [$%0.6x]", __relb(op0)&0xffff, __relb(op0)&0xffffff);break; + case 0x51:sprintf(t, "eor ($%0.2x),y [$%0.6x]", op0, resolve_offset(OPTYPE_IDPY, op0));break; + case 0x52:sprintf(t, "eor ($%0.2x) [$%0.6x]", op0, resolve_offset(OPTYPE_IDP, op0));break; + case 0x53:sprintf(t, "eor ($%0.2x,s),y [$%0.6x]", op0, resolve_offset(OPTYPE_ISRY, op0));break; + case 0x54:sprintf(t, "mvn $%0.2x,$%0.2x ", op1, op0);break; + case 0x55:sprintf(t, "eor $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0x56:sprintf(t, "lsr $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0x57:sprintf(t, "eor [$%0.2x],y [$%0.6x]", op0, resolve_offset(OPTYPE_ILDPY, op0));break; + case 0x58:sprintf(t, "cli ");break; + case 0x59:sprintf(t, "eor $%0.4x,y [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRY, (op0|op1<<8)));break; + case 0x5a:sprintf(t, "phy ");break; + case 0x5b:sprintf(t, "tcd ");break; + case 0x5c:sprintf(t, "jml $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONG, (op0|op1<<8|op2<<16)));break; + case 0x5d:sprintf(t, "eor $%0.4x,x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRX, (op0|op1<<8)));break; + case 0x5e:sprintf(t, "lsr $%0.4x,x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRX, (op0|op1<<8)));break; + case 0x5f:sprintf(t, "eor $%0.6x,x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONGX, (op0|op1<<8|op2<<16)));break; + case 0x60:sprintf(t, "rts ");break; + case 0x61:sprintf(t, "adc ($%0.2x,x) [$%0.6x]", op0, resolve_offset(OPTYPE_IDPX, op0));break; + case 0x62:sprintf(t, "per $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0x63:sprintf(t, "adc $%0.2x,s [$%0.6x]", op0, resolve_offset(OPTYPE_SR, op0));break; + case 0x64:sprintf(t, "stz $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0x65:sprintf(t, "adc $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0x66:sprintf(t, "ror $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0x67:sprintf(t, "adc [$%0.2x] [$%0.6x]", op0, resolve_offset(OPTYPE_ILDP, op0));break; + case 0x68:sprintf(t, "pla ");break; + case 0x69: + if(regs.p.m)sprintf(t, "adc #$%0.2x ", op0); + else sprintf(t, "adc #$%0.4x ", op0|op1<<8);break; + case 0x6a:sprintf(t, "ror a ");break; + case 0x6b:sprintf(t, "rtl ");break; + case 0x6c:sprintf(t, "jmp ($%0.4x) [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_IADDR_PC, (op0|op1<<8)));break; + case 0x6d:sprintf(t, "adc $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0x6e:sprintf(t, "ror $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0x6f:sprintf(t, "adc $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONG, (op0|op1<<8|op2<<16)));break; + case 0x70:sprintf(t, "bvs $%0.4x [$%0.6x]", __relb(op0)&0xffff, __relb(op0)&0xffffff);break; + case 0x71:sprintf(t, "adc ($%0.2x),y [$%0.6x]", op0, resolve_offset(OPTYPE_IDPY, op0));break; + case 0x72:sprintf(t, "adc ($%0.2x) [$%0.6x]", op0, resolve_offset(OPTYPE_IDP, op0));break; + case 0x73:sprintf(t, "adc ($%0.2x,s),y [$%0.6x]", op0, resolve_offset(OPTYPE_ISRY, op0));break; + case 0x74:sprintf(t, "stz $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0x75:sprintf(t, "adc $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0x76:sprintf(t, "ror $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0x77:sprintf(t, "adc [$%0.2x],y [$%0.6x]", op0, resolve_offset(OPTYPE_ILDPY, op0));break; + case 0x78:sprintf(t, "sei ");break; + case 0x79:sprintf(t, "adc $%0.4x,y [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRY, (op0|op1<<8)));break; + case 0x7a:sprintf(t, "ply ");break; + case 0x7b:sprintf(t, "tdc ");break; + case 0x7c:sprintf(t, "jmp ($%0.4x,x) [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_IADDRX, (op0|op1<<8)));break; + case 0x7d:sprintf(t, "adc $%0.4x,x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRX, (op0|op1<<8)));break; + case 0x7e:sprintf(t, "ror $%0.4x,x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRX, (op0|op1<<8)));break; + case 0x7f:sprintf(t, "adc $%0.6x,x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONGX, (op0|op1<<8|op2<<16)));break; + case 0x80:sprintf(t, "bra $%0.4x [$%0.6x]", __relb(op0)&0xffff, __relb(op0)&0xffffff);break; + case 0x81:sprintf(t, "sta ($%0.2x,x) [$%0.6x]", op0, resolve_offset(OPTYPE_IDPX, op0));break; + case 0x82:sprintf(t, "brl $%0.4x [$%0.6x]", __relw(op0|op1<<8)&0xffff, __relw(op0|op1<<8)&0xffffff);break; + case 0x83:sprintf(t, "sta $%0.2x,s [$%0.6x]", op0, resolve_offset(OPTYPE_SR, op0));break; + case 0x84:sprintf(t, "sty $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0x85:sprintf(t, "sta $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0x86:sprintf(t, "stx $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0x87:sprintf(t, "sta [$%0.2x] [$%0.6x]", op0, resolve_offset(OPTYPE_ILDP, op0));break; + case 0x88:sprintf(t, "dey ");break; + case 0x89: + if(regs.p.m)sprintf(t, "bit #$%0.2x ", op0); + else sprintf(t, "bit #$%0.4x ", op0|op1<<8);break; + case 0x8a:sprintf(t, "txa ");break; + case 0x8b:sprintf(t, "phb ");break; + case 0x8c:sprintf(t, "sty $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0x8d:sprintf(t, "sta $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0x8e:sprintf(t, "stx $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0x8f:sprintf(t, "sta $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONG, (op0|op1<<8|op2<<16)));break; + case 0x90:sprintf(t, "bcc $%0.4x [$%0.6x]", __relb(op0)&0xffff, __relb(op0)&0xffffff);break; + case 0x91:sprintf(t, "sta ($%0.2x),y [$%0.6x]", op0, resolve_offset(OPTYPE_IDPY, op0));break; + case 0x92:sprintf(t, "sta ($%0.2x) [$%0.6x]", op0, resolve_offset(OPTYPE_IDP, op0));break; + case 0x93:sprintf(t, "sta ($%0.2x,s),y [$%0.6x]", op0, resolve_offset(OPTYPE_ISRY, op0));break; + case 0x94:sprintf(t, "sty $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0x95:sprintf(t, "sta $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0x96:sprintf(t, "stx $%0.2x,y [$%0.6x]", op0, resolve_offset(OPTYPE_DPY, op0));break; + case 0x97:sprintf(t, "sta [$%0.2x],y [$%0.6x]", op0, resolve_offset(OPTYPE_ILDPY, op0));break; + case 0x98:sprintf(t, "tya ");break; + case 0x99:sprintf(t, "sta $%0.4x,y [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRY, (op0|op1<<8)));break; + case 0x9a:sprintf(t, "txs ");break; + case 0x9b:sprintf(t, "txy ");break; + case 0x9c:sprintf(t, "stz $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0x9d:sprintf(t, "sta $%0.4x,x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRX, (op0|op1<<8)));break; + case 0x9e:sprintf(t, "stz $%0.4x,x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRX, (op0|op1<<8)));break; + case 0x9f:sprintf(t, "sta $%0.6x,x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONGX, (op0|op1<<8|op2<<16)));break; + case 0xa0: + if(regs.p.x)sprintf(t, "ldy #$%0.2x ", op0); + else sprintf(t, "ldy #$%0.4x ", op0|op1<<8);break; + case 0xa1:sprintf(t, "lda ($%0.2x,x) [$%0.6x]", op0, resolve_offset(OPTYPE_IDPX, op0));break; + case 0xa2: + if(regs.p.x)sprintf(t, "ldx #$%0.2x ", op0); + else sprintf(t, "ldx #$%0.4x ", op0|op1<<8);break; + case 0xa3:sprintf(t, "lda $%0.2x,s [$%0.6x]", op0, resolve_offset(OPTYPE_SR, op0));break; + case 0xa4:sprintf(t, "ldy $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0xa5:sprintf(t, "lda $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0xa6:sprintf(t, "ldx $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0xa7:sprintf(t, "lda [$%0.2x] [$%0.6x]", op0, resolve_offset(OPTYPE_ILDP, op0));break; + case 0xa8:sprintf(t, "tay ");break; + case 0xa9: + if(regs.p.m)sprintf(t, "lda #$%0.2x ", op0); + else sprintf(t, "lda #$%0.4x ", op0|op1<<8);break; + case 0xaa:sprintf(t, "tax ");break; + case 0xab:sprintf(t, "plb ");break; + case 0xac:sprintf(t, "ldy $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0xad:sprintf(t, "lda $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0xae:sprintf(t, "ldx $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0xaf:sprintf(t, "lda $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONG, (op0|op1<<8|op2<<16)));break; + case 0xb0:sprintf(t, "bcs $%0.4x [$%0.6x]", __relb(op0)&0xffff, __relb(op0)&0xffffff);break; + case 0xb1:sprintf(t, "lda ($%0.2x),y [$%0.6x]", op0, resolve_offset(OPTYPE_IDPY, op0));break; + case 0xb2:sprintf(t, "lda ($%0.2x) [$%0.6x]", op0, resolve_offset(OPTYPE_IDP, op0));break; + case 0xb3:sprintf(t, "lda ($%0.2x,s),y [$%0.6x]", op0, resolve_offset(OPTYPE_ISRY, op0));break; + case 0xb4:sprintf(t, "ldy $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0xb5:sprintf(t, "lda $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0xb6:sprintf(t, "ldx $%0.2x,y [$%0.6x]", op0, resolve_offset(OPTYPE_DPY, op0));break; + case 0xb7:sprintf(t, "lda [$%0.2x],y [$%0.6x]", op0, resolve_offset(OPTYPE_ILDPY, op0));break; + case 0xb8:sprintf(t, "clv ");break; + case 0xb9:sprintf(t, "lda $%0.4x,y [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRY, (op0|op1<<8)));break; + case 0xba:sprintf(t, "tsx ");break; + case 0xbb:sprintf(t, "tyx ");break; + case 0xbc:sprintf(t, "ldy $%0.4x,x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRX, (op0|op1<<8)));break; + case 0xbd:sprintf(t, "lda $%0.4x,x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRX, (op0|op1<<8)));break; + case 0xbe:sprintf(t, "ldx $%0.4x,y [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRY, (op0|op1<<8)));break; + case 0xbf:sprintf(t, "lda $%0.6x,x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONGX, (op0|op1<<8|op2<<16)));break; + case 0xc0: + if(regs.p.x)sprintf(t, "cpy #$%0.2x ", op0); + else sprintf(t, "cpy #$%0.4x ", op0|op1<<8);break; + case 0xc1:sprintf(t, "cmp ($%0.2x,x) [$%0.6x]", op0, resolve_offset(OPTYPE_IDPX, op0));break; + case 0xc2:sprintf(t, "rep #$%0.2x ", op0);break; + case 0xc3:sprintf(t, "cmp $%0.2x,s [$%0.6x]", op0, resolve_offset(OPTYPE_SR, op0));break; + case 0xc4:sprintf(t, "cpy $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0xc5:sprintf(t, "cmp $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0xc6:sprintf(t, "dec $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0xc7:sprintf(t, "cmp [$%0.2x] [$%0.6x]", op0, resolve_offset(OPTYPE_ILDP, op0));break; + case 0xc8:sprintf(t, "iny ");break; + case 0xc9: + if(regs.p.m)sprintf(t, "cmp #$%0.2x ", op0); + else sprintf(t, "cmp #$%0.4x ", op0|op1<<8);break; + case 0xca:sprintf(t, "dex ");break; + case 0xcb:sprintf(t, "wai ");break; + case 0xcc:sprintf(t, "cpy $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0xcd:sprintf(t, "cmp $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0xce:sprintf(t, "dec $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0xcf:sprintf(t, "cmp $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONG, (op0|op1<<8|op2<<16)));break; + case 0xd0:sprintf(t, "bne $%0.4x [$%0.6x]", __relb(op0)&0xffff, __relb(op0)&0xffffff);break; + case 0xd1:sprintf(t, "cmp ($%0.2x),y [$%0.6x]", op0, resolve_offset(OPTYPE_IDPY, op0));break; + case 0xd2:sprintf(t, "cmp ($%0.2x) [$%0.6x]", op0, resolve_offset(OPTYPE_IDP, op0));break; + case 0xd3:sprintf(t, "cmp ($%0.2x,s),y [$%0.6x]", op0, resolve_offset(OPTYPE_ISRY, op0));break; + case 0xd4:sprintf(t, "pei ($%0.2x) [$%0.6x]", op0, resolve_offset(OPTYPE_IDP, op0));break; + case 0xd5:sprintf(t, "cmp $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0xd6:sprintf(t, "dec $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0xd7:sprintf(t, "cmp [$%0.2x],y [$%0.6x]", op0, resolve_offset(OPTYPE_ILDPY, op0));break; + case 0xd8:sprintf(t, "cld ");break; + case 0xd9:sprintf(t, "cmp $%0.4x,y [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRY, (op0|op1<<8)));break; + case 0xda:sprintf(t, "phx ");break; + case 0xdb:sprintf(t, "stp ");break; + case 0xdc:sprintf(t, "jmp [$%0.4x] [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ILADDR, (op0|op1<<8)));break; + case 0xdd:sprintf(t, "cmp $%0.4x,x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRX, (op0|op1<<8)));break; + case 0xde:sprintf(t, "dec $%0.4x,x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRX, (op0|op1<<8)));break; + case 0xdf:sprintf(t, "cmp $%0.6x,x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONGX, (op0|op1<<8|op2<<16)));break; + case 0xe0: + if(regs.p.x)sprintf(t, "cpx #$%0.2x ", op0); + else sprintf(t, "cpx #$%0.4x ", op0|op1<<8);break; + case 0xe1:sprintf(t, "sbc ($%0.2x,x) [$%0.6x]", op0, resolve_offset(OPTYPE_IDPX, op0));break; + case 0xe2:sprintf(t, "sep #$%0.2x ", op0);break; + case 0xe3:sprintf(t, "sbc $%0.2x,s [$%0.6x]", op0, resolve_offset(OPTYPE_SR, op0));break; + case 0xe4:sprintf(t, "cpx $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0xe5:sprintf(t, "sbc $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0xe6:sprintf(t, "inc $%0.2x [$%0.6x]", op0, resolve_offset(OPTYPE_DP, op0));break; + case 0xe7:sprintf(t, "sbc [$%0.2x] [$%0.6x]", op0, resolve_offset(OPTYPE_ILDP, op0));break; + case 0xe8:sprintf(t, "inx ");break; + case 0xe9: + if(regs.p.m)sprintf(t, "sbc #$%0.2x ", op0); + else sprintf(t, "sbc #$%0.4x ", op0|op1<<8);break; + case 0xea:sprintf(t, "nop ");break; + case 0xeb:sprintf(t, "xba ");break; + case 0xec:sprintf(t, "cpx $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0xed:sprintf(t, "sbc $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0xee:sprintf(t, "inc $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0xef:sprintf(t, "sbc $%0.6x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONG, (op0|op1<<8|op2<<16)));break; + case 0xf0:sprintf(t, "beq $%0.4x [$%0.6x]", __relb(op0)&0xffff, __relb(op0)&0xffffff);break; + case 0xf1:sprintf(t, "sbc ($%0.2x),y [$%0.6x]", op0, resolve_offset(OPTYPE_IDPY, op0));break; + case 0xf2:sprintf(t, "sbc ($%0.2x) [$%0.6x]", op0, resolve_offset(OPTYPE_IDP, op0));break; + case 0xf3:sprintf(t, "sbc ($%0.2x,s),y [$%0.6x]", op0, resolve_offset(OPTYPE_ISRY, op0));break; + case 0xf4:sprintf(t, "pea $%0.4x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDR, (op0|op1<<8)));break; + case 0xf5:sprintf(t, "sbc $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0xf6:sprintf(t, "inc $%0.2x,x [$%0.6x]", op0, resolve_offset(OPTYPE_DPX, op0));break; + case 0xf7:sprintf(t, "sbc [$%0.2x],y [$%0.6x]", op0, resolve_offset(OPTYPE_ILDPY, op0));break; + case 0xf8:sprintf(t, "sed ");break; + case 0xf9:sprintf(t, "sbc $%0.4x,y [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRY, (op0|op1<<8)));break; + case 0xfa:sprintf(t, "plx ");break; + case 0xfb:sprintf(t, "xce ");break; + case 0xfc:sprintf(t, "jsr ($%0.4x,x) [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_IADDRX, (op0|op1<<8)));break; + case 0xfd:sprintf(t, "sbc $%0.4x,x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRX, (op0|op1<<8)));break; + case 0xfe:sprintf(t, "inc $%0.4x,x [$%0.6x]", op0|op1<<8, resolve_offset(OPTYPE_ADDRX, (op0|op1<<8)));break; + case 0xff:sprintf(t, "sbc $%0.6x,x [$%0.6x]", op0|op1<<8|op2<<16, resolve_offset(OPTYPE_LONGX, (op0|op1<<8|op2<<16)));break; + } + strcat(s, t); + strcat(s, " "); + + sprintf(t, "A:%0.4x X:%0.4x Y:%0.4x S:%0.4x D:%0.4x DB:%0.2x ", + regs.a.w, regs.x.w, regs.y.w, regs.s.w, regs.d, regs.db); + strcat(s, t); + if(regs.e) { + sprintf(t, "%c%c%c%c%c%c%c%c", + (regs.p.n)?'N':'n', (regs.p.v)?'V':'v', + (regs.p.m)?'1':'0', (regs.p.x)?'B':'b', + (regs.p.d)?'D':'d', (regs.p.i)?'I':'i', + (regs.p.z)?'Z':'z', (regs.p.c)?'C':'c'); + } else { + sprintf(t, "%c%c%c%c%c%c%c%c", + (regs.p.n)?'N':'n', (regs.p.v)?'V':'v', + (regs.p.m)?'M':'m', (regs.p.x)?'X':'x', + (regs.p.d)?'D':'d', (regs.p.i)?'I':'i', + (regs.p.z)?'Z':'z', (regs.p.c)?'C':'c'); + } + strcat(s, t); +} + +/* + opcode_length() retrieves the length of the next opcode + to be executed. It is used by the debugger to step over, + disable, and proceed cpu opcodes. + + 5 and 6 are special cases, 5 is used for #consts based on + the A register size, 6 for the X/Y register size. the + rest are literal sizes. There's no need to test for + emulation mode, as regs.p.m/regs.p.x should *always* be + set in emulation mode. +*/ +uint8 CPU::opcode_length() { +uint8 op, len; +static uint8 op_len_tbl[256] = { +//0,1,2,3, 4,5,6,7, 8,9,a,b, c,d,e,f + 2,2,2,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0x0n + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0x1n + 3,2,4,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0x2n + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0x3n + + 1,2,2,2, 3,2,2,2, 1,5,1,1, 3,3,3,4, //0x4n + 2,2,2,2, 3,2,2,2, 1,3,1,1, 4,3,3,4, //0x5n + 1,2,3,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0x6n + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0x7n + + 2,2,3,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0x8n + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0x9n + 6,2,6,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0xan + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0xbn + + 6,2,2,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0xcn + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0xdn + 6,2,2,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0xen + 2,2,2,2, 3,2,2,2, 1,3,1,1, 3,3,3,4 //0xfn +}; + op = mem_bus->read(regs.pc.d); + len = op_len_tbl[op]; + if(len == 5)return (regs.p.m)?2:3; + if(len == 6)return (regs.p.x)?2:3; + return len; +} diff --git a/src/interface.h b/src/interface.h new file mode 100644 index 00000000..d4e45224 --- /dev/null +++ b/src/interface.h @@ -0,0 +1,29 @@ +#include "reader/reader.h" + +#include "clock/clock.h" +#include "clock/bclock/bclock.h" +extern Clock *clock; + +#include "memory/memory.h" +#include "memory/bmemory/bmemory.h" +extern MMIO mmio_unmapped; +extern MemBus *mem_bus; + +#include "cpu/cpu.h" +#include "cpu/bcpu/bcpu.h" +extern CPU *cpu; + +#include "ppu/ppu.h" +#include "ppu/bppu/bppu.h" +extern PPU *ppu; + +#include "snes/snes.h" +extern SNES *snes; + +#ifdef INTERFACE_MAIN + Clock *clock; + MemBus *mem_bus; + CPU *cpu; + PPU *ppu; + SNES *snes; +#endif diff --git a/src/memory/bmemory/bmemory.cpp b/src/memory/bmemory/bmemory.cpp new file mode 100644 index 00000000..ce5313fb --- /dev/null +++ b/src/memory/bmemory/bmemory.cpp @@ -0,0 +1,321 @@ +#include "../../base.h" + +uint8 bROM::read(uint32 addr) { +uint32 b, w; + addr &= 0xffffff; + b = (addr >> 16); + w = (addr & 0xffff); + +/* SRAM Region A */ + if((b & 0x7f) >= 0x30 && (b & 0x7f) <= 0x3f && (w & 0xe000) == 0x6000) { + b &= 0x7f; + if(b >= 0x30 && b <= 0x3f) { + if(sram_size) { + addr = (b - 0x30) * 0x2000 + (w - 0x6000); + addr &= (sram_size - 1); + return sram_data[addr]; + } else { + return 0x00; //no SRAM available + } + } else { + return 0x00; //unmapped + } + } + +/* SRAM Region B */ + if(b >= 0x70 && b <= 0x7d) { + if(sram_size) { + addr = (addr & 0xffffff) - 0x700000; + addr &= (sram_size - 1); + return sram_data[addr]; + } else { + return 0x00; //no SRAM available + } + } + + switch(mapper) { + case LOROM: + if(w & 0x8000) { + b &= 0x7f; + b %= 0x60; + addr = (b << 15) | (addr & 0x7fff); + } else { + b &= 0x7f; + b %= 0x60; + if(b == 0x00)b = 0x60; + addr = (((b << 15) | (addr & 0x7fff)) - 0x8000); + } + if(addr < size)return data[addr]; + break; + case HIROM: + addr &= 0x3fffff; + if(addr < size)return data[addr]; + break; + } + return 0x00; +} + +void bROM::write(uint32 addr, uint8 value) { +uint32 b, w; + addr &= 0xffffff; + b = (addr >> 16); + w = (addr & 0xffff); + +/* SRAM Region A */ + if((b & 0x7f) >= 0x30 && (b & 0x7f) <= 0x3f && (w & 0xe000) == 0x6000) { + b &= 0x7f; + if(b >= 0x30 && b <= 0x3f) { + if(sram_size) { + addr = (b - 0x30) * 0x2000 + (w - 0x6000); + addr &= (sram_size - 1); + sram_data[addr] = value; + return; + } else { + return; //no SRAM available + } + } else { + return; //unmapped + } + } + +/* SRAM Region B */ + if(b >= 0x70 && b <= 0x7d) { + if(sram_size) { + addr = (addr & 0xffffff) - 0x700000; + addr &= (sram_size - 1); + sram_data[addr] = value; + } else { + return; //no SRAM available + } + } + +/* Block write attempts to ROM by default, debugger can override this */ + if(write_protection == true)return; + + switch(mapper) { + case LOROM: + if(w & 0x8000) { + b &= 0x7f; + b %= 0x60; + addr = (b << 15) | (addr & 0x7fff); + } else { + b &= 0x7f; + b %= 0x60; + if(b == 0x00)b = 0x60; + addr = (((b << 15) | (addr & 0x7fff)) - 0x8000); + } + if(addr < size)data[addr] = value; + break; + case HIROM: + addr &= 0x3fffff; + if(addr < size)data[addr] = value; + break; + } +} + +void bROM::load_sram(uint8 *buffer, uint32 size) { + if(rom_loaded == false)return; + + if(size > sram_size) { + memcpy(sram_data, buffer, sram_size); + } else { + memset(sram_data, 0, sram_size); + memcpy(sram_data, buffer, size); + } +} + +uint32 bROM::save_sram(uint8 **buffer) { +uint8 *t; + if(rom_loaded == false)return 0; + if(!sram_size)return 0; + + if(*buffer) { + t = (uint8*)memalloc(sram_size, "bROM::save_sram"); + memcpy(t, sram_data, sram_size); + *buffer = t; + } + return sram_size; +} + +void bROM::load_rom(Reader *rf) { +uint16 cksum, icksum, index; +char cart_title[24]; + if(rom_loaded == true)return; + + rf->read(&data); + + size = rf->size(); + if(size < 65536) { + mapper = LOROM; + strcpy(cart_title, ""); + goto end; + } + + cksum = data[0xffdc] | (data[0xffdd] << 8); + icksum = data[0xffde] | (data[0xffdf] << 8); + if(cksum + icksum == 0xffff) { + mapper = HIROM; + } else { + mapper = LOROM; + } + +end: + if(size >= 32768) { + memcpy(cart_title, (char*)data + ((mapper == LOROM)?0x7fc0:0xffc0), 21); + } else *cart_title = 0; + cart_title[21] = 0; + index = (mapper == HIROM)?0x8000:0x0000; + + switch(data[index + 0x7fd8] & 7) { + case 0:sram_size = 0; break; + case 1:sram_size = 2 * 1024;break; + case 2:sram_size = 4 * 1024;break; + case 3:sram_size = 8 * 1024;break; + case 4:sram_size = 16 * 1024;break; + case 5:sram_size = 32 * 1024;break; + case 6:sram_size = 64 * 1024;break; + case 7:sram_size = 128 * 1024;break; + } + if(sram_size) { + sram_data = (uint8*)memalloc(sram_size, "bROM::sram_data"); + memset(sram_data, 0, sram_size); + } else { + sram_data = 0; + } + + dprintf("Image Name : \"%s\"", cart_title); + dprintf("Image Type : %s", (mapper == LOROM)?"LoROM":"HiROM"); + dprintf("SRAM Size : %dkb", sram_size / 1024); + dprintf("Reset:%0.4x NMI:%0.4x IRQ:%0.4x BRK[n]:%0.4x COP[n]:%0.4x BRK[e]:%0.4x COP[e]:%0.4x", + data[index + 0x7ffc] | (data[index + 0x7ffd] << 8), //Reset + data[index + 0x7fea] | (data[index + 0x7feb] << 8), //NMI + data[index + 0x7fee] | (data[index + 0x7fef] << 8), //IRQ + data[index + 0x7fe6] | (data[index + 0x7fe7] << 8), //BRK[n] + data[index + 0x7fe4] | (data[index + 0x7fe5] << 8), //COP[n] + data[index + 0x7ffe] | (data[index + 0x7fff] << 8), //BRK[e] + data[index + 0x7ff4] | (data[index + 0x7ff5] << 8) //COP[e] + ); + dprintf(""); + + rom_loaded = true; +} + +void bROM::unload() { + if(rom_loaded == false)return; + + if(data)memfree(data, "bROM::data"); + if(sram_data)memfree(sram_data, "bROM::sram_data"); + + rom_loaded = false; +} + +void bROM::write_protect(bool yn) { + write_protection = yn; +} + +bROM::bROM() { + sram_size = 0; + sram_data = 0; + write_protection = true; + + rom_loaded = false; +} + +bROM::~bROM() { +} + +/*********************** + *** SNES Memory Map *** + *************************************** + *** 00-3f 0000-1fff First 8k WRAM *** + *** 2000-5fff MMIO *** + *** 6000-7fff Expansion RAM *** + *** 8000-ffff Cartridge ROM *** + *** 40-7d 0000-ffff Cartridge ROM *** + *** 7e-7f 0000-ffff 128k WRAM *** + *** 80-bf 0000-1fff First 8k WRAM *** + *** 2000-5fff MMIO *** + *** 6000-7fff Expansion RAM *** + *** 8000-ffff Cartridge ROM *** + *** c0-ff 0000-ffff Cartridge ROM *** + ***************************************/ + +uint8 bMemBus::read(uint32 addr) { +uint32 b, w, r; + addr &= 0xffffff; + b = (addr >> 16); + w = (addr & 0xffff); + + if(b <= 0x3f) { + if(w <= 0x1fff) { + r = wram[w]; + } else if(w <= 0x5fff) { + r = mmio[w - 0x2000]->read(w); + } else { + r = rom->read(addr); + } + } else if(b <= 0x7d) { + r = rom->read(addr); + } else if(b <= 0x7f) { + r = wram[addr & 0x01ffff]; + } else if(b <= 0xbf) { + if(w <= 0x1fff) { + r = wram[w]; + } else if(w <= 0x5fff) { + r = mmio[w - 0x2000]->read(w); + } else { + r = rom->read(addr); + } + } else { + r = rom->read(addr); + } + + snes->notify(SNES::MEM_READ, addr, r); + return r; +} + +void bMemBus::write(uint32 addr, uint8 value) { +uint32 b, w; + addr &= 0xffffff; + b = (addr >> 16); + w = (addr & 0xffff); + + if(b <= 0x3f) { + if(w <= 0x1fff) { + wram[w] = value; + } else if(w <= 0x5fff) { + mmio[w - 0x2000]->write(w, value); + } else { + rom->write(addr, value); + } + } else if(b <= 0x7d) { + rom->write(addr, value); + } else if(b <= 0x7f) { + wram[addr & 0x01ffff] = value; + } else if(b <= 0xbf) { + if(w <= 0x1fff) { + wram[w] = value; + } else if(w <= 0x5fff) { + mmio[w - 0x2000]->write(w, value); + } else { + rom->write(addr, value); + } + } else { + rom->write(addr, value); + } + + snes->notify(SNES::MEM_WRITE, addr, value); +} + +bMemBus::bMemBus() { + rom = new bROM(); + + wram = (byte*)memalloc(0x020000, "bMemBus::wram"); + memset(wram, 0, 0x020000); +} + +bMemBus::~bMemBus() { + delete(rom); + + if(wram)memfree(wram, "bMemBus::wram"); +} diff --git a/src/memory/bmemory/bmemory.h b/src/memory/bmemory/bmemory.h new file mode 100644 index 00000000..e5803e33 --- /dev/null +++ b/src/memory/bmemory/bmemory.h @@ -0,0 +1,31 @@ +class bROM : public ROM { +private: +bool write_protection; +bool rom_loaded; + +public: +enum { LOROM = 0, HIROM = 1 }; +uint8 *data, *sram_data; +uint8 mapper; +uint32 size, sram_size; + void load_rom(Reader *rf); + void load_sram(uint8 *buffer, uint32 size); + uint32 save_sram(uint8 **buffer); + void unload(); + uint8 read (uint32 addr); + void write(uint32 addr, byte value); + void write_protect(bool yn); + + bROM(); + ~bROM(); +}; + +class bMemBus : public MemBus { +public: +byte *wram; + uint8 read (uint32 addr); + void write(uint32 addr, byte value); + + bMemBus(); + ~bMemBus(); +}; diff --git a/src/memory/memory.cpp b/src/memory/memory.cpp new file mode 100644 index 00000000..f144d5c5 --- /dev/null +++ b/src/memory/memory.cpp @@ -0,0 +1,115 @@ +#include "../base.h" + +uint16 Memory::read_word(uint32 addr, uint8 wrap) { +uint16 r; + switch(wrap) { + case WRAP_NONE: + r = read(addr); + r |= read(addr + 1) << 8; + break; + case WRAP_BANK: + r = read(addr); + r |= read((addr & 0xff0000) | ((addr + 1) & 0xffff)) << 8; + break; + case WRAP_PAGE: + r = read(addr); + r |= read((addr & 0xffff00) | ((addr + 1) & 0xff)) << 8; + break; + } + return r; +} + +void Memory::write_word(uint32 addr, uint16 value, uint8 wrap) { + switch(wrap) { + case WRAP_NONE: + write(addr, value); + write(addr + 1, value >> 8); + return; + case WRAP_BANK: + write(addr, value); + write((addr & 0xff0000) | ((addr + 1) & 0xffff), value >> 8); + return; + case WRAP_PAGE: + write(addr, value); + write((addr & 0xffff00) | ((addr + 1) & 0xff), value >> 8); + return; + } +} + +uint32 Memory::read_long(uint32 addr, uint8 wrap) { +uint32 r; + switch(wrap) { + case WRAP_NONE: + r = read(addr); + r |= read(addr + 1) << 8; + r |= read(addr + 2) << 16; + break; + case WRAP_BANK: + r = read(addr); + r |= read((addr & 0xff0000) | ((addr + 1) & 0xffff)) << 8; + r |= read((addr & 0xff0000) | ((addr + 2) & 0xffff)) << 16; + break; + case WRAP_PAGE: + r = read(addr); + r |= read((addr & 0xffff00) | ((addr + 1) & 0xff)) << 8; + r |= read((addr & 0xffff00) | ((addr + 2) & 0xff)) << 16; + break; + } + return r; +} + +void Memory::write_long(uint32 addr, uint32 value, uint8 wrap) { + switch(wrap) { + case WRAP_NONE: + write(addr, value); + write(addr + 1, value >> 8); + write(addr + 2, value >> 16); + return; + case WRAP_BANK: + write(addr, value); + write((addr & 0xff0000) | ((addr + 1) & 0xffff), value >> 8); + write((addr & 0xff0000) | ((addr + 2) & 0xffff), value >> 16); + return; + case WRAP_PAGE: + write(addr, value); + write((addr & 0xffff00) | ((addr + 1) & 0xff), value >> 8); + write((addr & 0xffff00) | ((addr + 2) & 0xff), value >> 16); + return; + } +} + +MMIO mmio_unmapped; +uint8 MMIO::read (uint32 addr) { return 0x00; } +void MMIO::write(uint32 addr, uint8 value) {} + +uint8 MemBus::speed(uint32 addr) { + if((addr & 0xc00000) == 0x400000)return 8; + if((addr & 0x808000) == 0x808000)return fastROM?6:8; + if((addr & 0xc00000) == 0xc00000)return fastROM?6:8; + if((addr & 0xe000) == 0x2000)return 6; + if((addr & 0xfe00) == 0x4000)return 12; + if((addr & 0xe000) == 0x4000)return 6; + return 8; +} + +void MemBus::flush_mmio_mappers() { + for(int i=0;i<0x4000;i++) { + mmio[i] = &mmio_unmapped; + } +} + +bool MemBus::set_mmio_mapper(uint16 addr, MMIO *mapper) { +/* out of range? */ + if(addr < 0x2000 || addr >= 0x6000)return false; + + mmio[(addr - 0x2000) & 0x3fff] = mapper; + return true; +} + +MemBus::MemBus() { +int i; + fastROM = false; + flush_mmio_mappers(); +} + +MemBus::~MemBus() {} diff --git a/src/memory/memory.h b/src/memory/memory.h new file mode 100644 index 00000000..9004dc5c --- /dev/null +++ b/src/memory/memory.h @@ -0,0 +1,38 @@ +class Memory { +public: +enum { WRAP_NONE = 0, WRAP_BANK = 1, WRAP_PAGE = 2 }; + virtual uint8 read (uint32 addr) = 0; + virtual void write(uint32 addr, uint8 value) = 0; + virtual uint16 read_word (uint32 addr, uint8 wrap = WRAP_NONE); + virtual void write_word(uint32 addr, uint16 value, uint8 wrap = WRAP_NONE); + virtual uint32 read_long (uint32 addr, uint8 wrap = WRAP_NONE); + virtual void write_long(uint32 addr, uint32 value, uint8 wrap = WRAP_NONE); +}; + +class ROM : public Memory { +public: + virtual void load_rom(Reader *rf) = 0; + virtual void load_sram(uint8 *buffer, uint32 size) = 0; + virtual uint32 save_sram(uint8 **buffer) = 0; + virtual void unload() = 0; + virtual void write_protect(bool yn) = 0; +}; + +class MMIO : public Memory { +public: + virtual uint8 read (uint32 addr); + virtual void write(uint32 addr, uint8 value); +}; + +class MemBus : public Memory { +public: +ROM *rom; +MMIO *mmio[0x4000]; +bool fastROM; + virtual void flush_mmio_mappers(); + virtual bool set_mmio_mapper(uint16 addr, MMIO *mapper); + virtual uint8 speed(uint32 addr); + + MemBus(); + ~MemBus(); +}; diff --git a/src/ppu/bppu/bppu.cpp b/src/ppu/bppu/bppu.cpp new file mode 100644 index 00000000..85f64779 --- /dev/null +++ b/src/ppu/bppu/bppu.cpp @@ -0,0 +1,302 @@ +#include "../../base.h" +#include "bppu_mmio.cpp" +#include "bppu_render.cpp" + +void bPPU::run() {} + +void bPPU::scanline() { +uint16 v = clock->vcounter(); + if(v > 0 && v < clock->visible_scanlines()) { + render_line(v); + } +} + +void bPPU::frame() {} + +void bPPU::power() { + memset(vram, 0, 65536); + memset(oam, 0, 544); + memset(cgram, 0, 512); + reset(); +} + +void bPPU::reset() { + memset(output, 0, 512 * 478 * 2); + +//$2100 + regs.display_disabled = 0; + regs.display_brightness = 0; + +//$2101 + regs.oam_basesize = 0; + regs.oam_nameselect = 0; + regs.oam_tdaddr = 0x0000; + +//$2102-$2103 + regs.oam_addrl = 0x00; + regs.oam_addrh = 0x00; + regs.oam_addr = 0x0000; + regs.oam_latchdata = 0x00; + +//$2105 + regs.bg_tilesize[BG1] = 0; + regs.bg_tilesize[BG2] = 0; + regs.bg_tilesize[BG3] = 0; + regs.bg_tilesize[BG4] = 0; + regs.bg3_priority = 0; + regs.bg_mode = 0; + +//$2106 + regs.mosaic_size = 0; + regs.mosaic_enabled[BG1] = false; + regs.mosaic_enabled[BG2] = false; + regs.mosaic_enabled[BG3] = false; + regs.mosaic_enabled[BG4] = false; + +//$2107-$210a + regs.bg_scaddr[BG1] = 0x0000; + regs.bg_scaddr[BG2] = 0x0000; + regs.bg_scaddr[BG3] = 0x0000; + regs.bg_scaddr[BG4] = 0x0000; + regs.bg_scsize[BG1] = SC_32x32; + regs.bg_scsize[BG2] = SC_32x32; + regs.bg_scsize[BG3] = SC_32x32; + regs.bg_scsize[BG4] = SC_32x32; + +//$210b-$210c + regs.bg_tdaddr[BG1] = 0x0000; + regs.bg_tdaddr[BG2] = 0x0000; + regs.bg_tdaddr[BG3] = 0x0000; + regs.bg_tdaddr[BG4] = 0x0000; + +//$210d-$2114 + regs.bg_hofs[BG1] = regs.bg_vofs[BG1] = 0x0000; + regs.bg_hofs[BG2] = regs.bg_vofs[BG2] = 0x0000; + regs.bg_hofs[BG3] = regs.bg_vofs[BG3] = 0x0000; + regs.bg_hofs[BG4] = regs.bg_vofs[BG4] = 0x0000; + +//$2115 + regs.vram_incmode = 1; + regs.vram_mapping = 0; + regs.vram_incsize = 1; + +//$2116-$2117 + regs.vram_addr = 0x0000; + +//$211a + regs.mode7_repeat = 0; + regs.mode7_vflip = false; + regs.mode7_hflip = false; + +//$211b-$2120 + regs.m7a = 0x0000; + regs.m7b = 0x0000; + regs.m7c = 0x0000; + regs.m7d = 0x0000; + regs.m7x = 0x0000; + regs.m7y = 0x0000; + +//$2121 + regs.cgram_addr = 0x0000; + +//$2123-$2125 + regs.bg_window1_enabled[BG1] = false; + regs.bg_window1_enabled[BG2] = false; + regs.bg_window1_enabled[BG3] = false; + regs.bg_window1_enabled[BG4] = false; + regs.bg_window1_enabled[OAM] = false; + regs.bg_window1_invert [BG1] = false; + regs.bg_window1_invert [BG2] = false; + regs.bg_window1_invert [BG3] = false; + regs.bg_window1_invert [BG4] = false; + regs.bg_window1_invert [OAM] = false; + regs.bg_window2_enabled[BG1] = false; + regs.bg_window2_enabled[BG2] = false; + regs.bg_window2_enabled[BG3] = false; + regs.bg_window2_enabled[BG4] = false; + regs.bg_window2_enabled[OAM] = false; + regs.bg_window2_invert [BG1] = false; + regs.bg_window2_invert [BG2] = false; + regs.bg_window2_invert [BG3] = false; + regs.bg_window2_invert [BG4] = false; + regs.bg_window2_invert [OAM] = false; + regs.color_window1_enabled = false; + regs.color_window1_invert = false; + regs.color_window2_enabled = false; + regs.color_window2_invert = false; + +//$2126-$2129 + regs.window1_left = 0; + regs.window1_right = 0; + regs.window2_left = 0; + regs.window2_right = 0; + +//$212a-$212b + regs.bg_window_mask[BG1] = 0; + regs.bg_window_mask[BG2] = 0; + regs.bg_window_mask[BG3] = 0; + regs.bg_window_mask[BG4] = 0; + regs.bg_window_mask[OAM] = 0; + regs.color_window_mask = 0; + +//$212c-$212d + regs.bg_enabled[BG1] = false; + regs.bg_enabled[BG2] = false; + regs.bg_enabled[BG3] = false; + regs.bg_enabled[BG4] = false; + regs.bg_enabled[OAM] = false; + regs.bgsub_enabled[BG1] = false; + regs.bgsub_enabled[BG2] = false; + regs.bgsub_enabled[BG3] = false; + regs.bgsub_enabled[BG4] = false; + regs.bgsub_enabled[OAM] = false; + +//$212e-$212f + regs.bg_window_enabled[BG1] = false; + regs.bg_window_enabled[BG2] = false; + regs.bg_window_enabled[BG3] = false; + regs.bg_window_enabled[BG4] = false; + regs.bg_window_enabled[OAM] = false; + regs.bgsub_window_enabled[BG1] = false; + regs.bgsub_window_enabled[BG2] = false; + regs.bgsub_window_enabled[BG3] = false; + regs.bgsub_window_enabled[BG4] = false; + regs.bgsub_window_enabled[OAM] = false; + +//$2130 + regs.color_mask = 0; + regs.colorsub_mask = 0; + regs.addsub_mode = 0; + +//$2131 + regs.color_mode = 0; + regs.color_halve = false; + regs.bg_color_enabled[BACK] = false; + regs.bg_color_enabled[OAM] = false; + regs.bg_color_enabled[BG4] = false; + regs.bg_color_enabled[BG3] = false; + regs.bg_color_enabled[BG2] = false; + regs.bg_color_enabled[BG1] = false; + +//$2132 + regs.color_r = 0x00; + regs.color_g = 0x00; + regs.color_b = 0x00; + +//$2133 + regs.mode7_extbg = false; + regs.overscan = false; + regs.scanlines = 224; + regs.oam_halve = false; + regs.interlace = false; + +//$2137 + regs.hcounter = 0; + regs.vcounter = 0; + regs.latch_hcounter = 0; + regs.latch_vcounter = 0; + regs.counters_latched = false; + +//$2139-$213a + regs.vram_readbuffer = 0x0000; + + clear_tiledata_cache(); +} + +uint8 bPPU::vram_read(uint16 addr) { +uint8 r; + r = vram[addr]; + snes->notify(SNES::VRAM_READ, addr, r); + return r; +} + +void bPPU::vram_write(uint16 addr, uint8 value) { + vram[addr] = value; + snes->notify(SNES::VRAM_WRITE, addr, value); +} + +uint8 bPPU::oam_read(uint16 addr) { +uint8 r; + if(addr >= 0x0200)addr = 0x0200 | (addr & 31); + r = oam[addr]; + snes->notify(SNES::OAM_READ, addr, r); + return r; +} + +void bPPU::oam_write(uint16 addr, uint8 value) { + if(addr >= 0x0200)addr = 0x0200 | (addr & 31); + oam[addr] = value; + snes->notify(SNES::OAM_WRITE, addr, value); +} + +uint8 bPPU::cgram_read(uint16 addr) { +uint8 r; + r = cgram[addr & 511]; + snes->notify(SNES::CGRAM_READ, addr, r); + return r; +} + +void bPPU::cgram_write(uint16 addr, uint8 value) { + cgram[addr & 511] = value; + snes->notify(SNES::CGRAM_WRITE, addr, value); +} + +bPPU::bPPU() { + mmio = new bPPUMMIO(this); + + vram = (uint8*)memalloc(65536, "bPPU::vram"); + oam = (uint8*)memalloc( 544, "bPPU::oam"); + cgram = (uint8*)memalloc( 512, "bPPU::cgram"); + memset(vram, 0, 65536); + memset(oam, 0, 544); + memset(cgram, 0, 512); + + init_tiledata_cache(); + +int i, l; +byte r, g, b; +double m; +uint16 *ptr; + for(l=0;l<16;l++) { + mosaic_table[l] = (uint16*)memalloc(4096 * 2, "bPPU::mosaic_table[%2d]", l); + for(i=0;i<4096;i++) { + mosaic_table[l][i] = (i / (l + 1)) * (l + 1); + } + } + + light_table = (uint16*)memalloc(16 * 65536 * 2, "bPPU::light_table"); + ptr = (word*)light_table; + for(l=0;l<16;l++) { + m = (double)l / 15.0; + for(i=0;i<65536;i++) { + r = (i ) & 31; + g = (i >> 5) & 31; + b = (i >> 10) & 31; + if(l == 0) { r = g = b = 0; } + else if(l == 15); + else { + r = (double)r * m; + g = (double)g * m; + b = (double)b * m; + } + *ptr++ = (r) | (g << 5) | (b << 10); + } + } +} + +bPPU::~bPPU() { + delete(mmio); + + if(vram) memfree(vram, "bPPU::vram"); + if(oam) memfree(oam, "bPPU::oam"); + if(cgram)memfree(cgram, "bPPU::cgram"); + + for(int i=0;i<16;i++) { + if(mosaic_table[i])memfree(mosaic_table[i], "bPPU::mosaic_table[%2d]", i); + } + if(light_table)memfree(light_table, "bPPU::light_table"); +} + +bPPUMMIO::bPPUMMIO(bPPU *_ppu) { + ppu = _ppu; +} diff --git a/src/ppu/bppu/bppu.h b/src/ppu/bppu/bppu.h new file mode 100644 index 00000000..f92c0e5b --- /dev/null +++ b/src/ppu/bppu/bppu.h @@ -0,0 +1,211 @@ +class bPPU; + +class bPPUMMIO : public MMIO { +public: +bPPU *ppu; + uint8 read (uint32 addr); + void write(uint32 addr, uint8 value); + bPPUMMIO(bPPU *_ppu); +}; + +class bPPU : public PPU { +public: +uint8 *vram, *oam, *cgram; + +enum { BG1 = 0, BG2 = 1, BG3 = 2, BG4 = 3, OAM = 4, BACK = 5 }; +enum { SC_32x32 = 0, SC_32x64 = 1, SC_64x32 = 2, SC_64x64 = 3 }; + +struct { +//$2100 + bool display_disabled; + uint8 display_brightness; + +//$2101 + uint8 oam_basesize; + uint8 oam_nameselect; + uint16 oam_tdaddr; + +//$2102-$2103 + uint8 oam_addrl, oam_addrh; + uint16 oam_addr; + uint8 oam_latchdata; + +//$2105 + bool bg_tilesize[4]; + bool bg3_priority; + uint8 bg_mode; + +//$2106 + uint8 mosaic_size; + bool mosaic_enabled[4]; + +//$2107-$210a + uint16 bg_scaddr[4]; + uint8 bg_scsize[4]; + +//$210b-$210c + uint16 bg_tdaddr[4]; + +//$210d-$2114 + uint16 bg_hofs[4]; + uint16 bg_vofs[4]; + +//$2115 + bool vram_incmode; + uint8 vram_mapping; + uint8 vram_incsize; + +//$2116-$2117 + uint16 vram_addr; + +//$211a + uint8 mode7_repeat; + bool mode7_vflip; + bool mode7_hflip; + +//$211b-$2120 + uint16 m7a, m7b, m7c, m7d, m7x, m7y; + +//$2121 + uint16 cgram_addr; + +//$2123-$2125 + bool bg_window1_enabled[5]; + bool bg_window1_invert [5]; + bool bg_window2_enabled[5]; + bool bg_window2_invert [5]; + bool color_window1_enabled, color_window1_invert; + bool color_window2_enabled, color_window2_invert; + +//$2126-$2129 + uint8 window1_left, window1_right; + uint8 window2_left, window2_right; + +//$212a-$212b + uint8 bg_window_mask[5]; + uint8 color_window_mask; + +//$212c-$212d + bool bg_enabled[5], bgsub_enabled[5]; + +//$212e-$212f + bool bg_window_enabled[5], bgsub_window_enabled[5]; + +//$2130 + uint8 color_mask, colorsub_mask; + bool addsub_mode; + +//$2131 + bool color_mode, color_halve; + bool bg_color_enabled[6]; + +//$2132 + uint8 color_r, color_g, color_b; + +//$2133 + bool mode7_extbg; + bool overscan; + uint16 scanlines; + bool oam_halve; + bool interlace; + +//$2137 + uint16 hcounter, vcounter; + bool latch_hcounter, latch_vcounter; + bool counters_latched; + +//$2139-$213a + uint16 vram_readbuffer; +}regs; + uint8 vram_read (uint16 addr); + void vram_write (uint16 addr, uint8 value); + uint8 oam_read (uint16 addr); + void oam_write (uint16 addr, uint8 value); + uint8 cgram_read (uint16 addr); + void cgram_write(uint16 addr, uint8 value); + + uint16 get_vram_address(); + + void mmio_w2100(uint8 value); //INIDISP + void mmio_w2101(uint8 value); //OBSEL + void mmio_w2102(uint8 value); //OAMADDL + void mmio_w2103(uint8 value); //OAMADDH + void mmio_w2104(uint8 value); //OAMDATA + void mmio_w2105(uint8 value); //BGMODE + void mmio_w2106(uint8 value); //MOSAIC + void mmio_w2107(uint8 value); //BG1SC + void mmio_w2108(uint8 value); //BG2SC + void mmio_w2109(uint8 value); //BG3SC + void mmio_w210a(uint8 value); //BG4SC + void mmio_w210b(uint8 value); //BG12NBA + void mmio_w210c(uint8 value); //BG34NBA + void mmio_w210d(uint8 value); //BG1HOFS + void mmio_w210e(uint8 value); //BG1VOFS + void mmio_w210f(uint8 value); //BG2HOFS + void mmio_w2110(uint8 value); //BG2VOFS + void mmio_w2111(uint8 value); //BG3HOFS + void mmio_w2112(uint8 value); //BG3VOFS + void mmio_w2113(uint8 value); //BG4HOFS + void mmio_w2114(uint8 value); //BG4VOFS + void mmio_w2115(uint8 value); //VMAIN + void mmio_w2116(uint8 value); //VMADDL + void mmio_w2117(uint8 value); //VMADDH + void mmio_w2118(uint8 value); //VMDATAL + void mmio_w2119(uint8 value); //VMDATAH + void mmio_w211a(uint8 value); //M7SEL + void mmio_w211b(uint8 value); //M7A + void mmio_w211c(uint8 value); //M7B + void mmio_w211d(uint8 value); //M7C + void mmio_w211e(uint8 value); //M7D + void mmio_w211f(uint8 value); //M7X + void mmio_w2120(uint8 value); //M7Y + void mmio_w2121(uint8 value); //CGADD + void mmio_w2122(uint8 value); //CGDATA + void mmio_w2123(uint8 value); //W12SEL + void mmio_w2124(uint8 value); //W34SEL + void mmio_w2125(uint8 value); //WOBJSEL + void mmio_w2126(uint8 value); //WH0 + void mmio_w2127(uint8 value); //WH1 + void mmio_w2128(uint8 value); //WH2 + void mmio_w2129(uint8 value); //WH3 + void mmio_w212a(uint8 value); //WBGLOG + void mmio_w212b(uint8 value); //WOBJLOG + void mmio_w212c(uint8 value); //TM + void mmio_w212d(uint8 value); //TS + void mmio_w212e(uint8 value); //TMW + void mmio_w212f(uint8 value); //TSW + void mmio_w2130(uint8 value); //CGWSEL + void mmio_w2131(uint8 value); //CGADDSUB + void mmio_w2132(uint8 value); //COLDATA + void mmio_w2133(uint8 value); //SETINI + uint8 mmio_r2134(); //MPYL + uint8 mmio_r2135(); //MPYM + uint8 mmio_r2136(); //MPYH + uint8 mmio_r2137(); //SLHV + uint8 mmio_r2138(); //OAMDATAREAD + uint8 mmio_r2139(); //VMDATALREAD + uint8 mmio_r213a(); //VMDATAHREAD + uint8 mmio_r213b(); //CGDATAREAD + uint8 mmio_r213c(); //OPHCT + uint8 mmio_r213d(); //OPVCT + uint8 mmio_r213e(); //STAT77 + uint8 mmio_r213f(); //STAT78 + + void latch_counters(); + +/* PPU render functions */ +#include "bppu_render.h" +uint16 *light_table; +uint16 *mosaic_table[16]; + void render_line(uint16 line); + +/* Required functions */ + void run(); + void scanline(); + void frame(); + void power(); + void reset(); + + bPPU(); + ~bPPU(); +}; diff --git a/src/ppu/bppu/bppu_mmio.cpp b/src/ppu/bppu/bppu_mmio.cpp new file mode 100644 index 00000000..f87f067e --- /dev/null +++ b/src/ppu/bppu/bppu_mmio.cpp @@ -0,0 +1,610 @@ +void bPPU::latch_counters() { + regs.hcounter = clock->hcounter(); + regs.vcounter = clock->vcounter(); + regs.counters_latched = true; +} + +uint16 bPPU::get_vram_address() { +uint16 addr; + addr = regs.vram_addr << 1; + switch(regs.vram_mapping) { + case 0:break; + case 1:addr = (addr & 0xff00) | ((addr & 0x001f) << 3) | ((addr >> 5) & 7);break; + case 2:addr = (addr & 0xfe00) | ((addr & 0x003f) << 3) | ((addr >> 6) & 7);break; + case 3:addr = (addr & 0xfc00) | ((addr & 0x007f) << 3) | ((addr >> 7) & 7);break; + } + return addr; +} + +//INIDISP +void bPPU::mmio_w2100(uint8 value) { + regs.display_disabled = !!(value & 0x80); + regs.display_brightness = value & 15; +} + +//OBSEL +void bPPU::mmio_w2101(uint8 value) { + regs.oam_basesize = (value >> 5) & 7; + regs.oam_nameselect = (value >> 3) & 3; + regs.oam_tdaddr = (value & 3) << 14; +} + +//OAMADDL +void bPPU::mmio_w2102(uint8 value) { + regs.oam_addrl = value; + regs.oam_addr = ((regs.oam_addrh << 8) | regs.oam_addrl) << 1; +} + +//OAMADDH +void bPPU::mmio_w2103(uint8 value) { + regs.oam_addrh = value & 1; + regs.oam_addr = ((regs.oam_addrh << 8) | regs.oam_addrl) << 1; +} + +//OAMDATA +void bPPU::mmio_w2104(uint8 value) { + if(regs.oam_addr >= 0x0200) { + if(!(regs.oam_addr & 1)) { + regs.oam_latchdata = value; + } + oam_write(regs.oam_addr, value); + } else if(!(regs.oam_addr & 1)) { + regs.oam_latchdata = value; + } else { + oam_write((regs.oam_addr & 0x03fe), regs.oam_latchdata); + oam_write((regs.oam_addr & 0x03fe) + 1, value); + } + regs.oam_addr++; + regs.oam_addr &= 0x03ff; +} + +//BGMODE +void bPPU::mmio_w2105(uint8 value) { + regs.bg_tilesize[BG4] = !!(value & 0x80); + regs.bg_tilesize[BG3] = !!(value & 0x40); + regs.bg_tilesize[BG2] = !!(value & 0x20); + regs.bg_tilesize[BG1] = !!(value & 0x10); + regs.bg3_priority = !!(value & 0x08); + regs.bg_mode = (value & 7); +} + +//MOSAIC +void bPPU::mmio_w2106(uint8 value) { + regs.mosaic_size = (value >> 4) & 15; + regs.mosaic_enabled[BG4] = !!(value & 0x08); + regs.mosaic_enabled[BG3] = !!(value & 0x04); + regs.mosaic_enabled[BG2] = !!(value & 0x02); + regs.mosaic_enabled[BG1] = !!(value & 0x01); +} + +//BG1SC +void bPPU::mmio_w2107(uint8 value) { + regs.bg_scaddr[BG1] = (value & 0x7c) << 9; + regs.bg_scsize[BG1] = value & 3; +} + +//BG2SC +void bPPU::mmio_w2108(uint8 value) { + regs.bg_scaddr[BG2] = (value & 0x7c) << 9; + regs.bg_scsize[BG2] = value & 3; +} + +//BG3SC +void bPPU::mmio_w2109(uint8 value) { + regs.bg_scaddr[BG3] = (value & 0x7c) << 9; + regs.bg_scsize[BG3] = value & 3; +} + +//BG4SC +void bPPU::mmio_w210a(uint8 value) { + regs.bg_scaddr[BG4] = (value & 0x7c) << 9; + regs.bg_scsize[BG4] = value & 3; +} + +//BG12NBA +void bPPU::mmio_w210b(uint8 value) { + regs.bg_tdaddr[BG1] = (value & 0x07) << 13; + regs.bg_tdaddr[BG2] = (value & 0x70) << 9; +} + +//BG34NBA +void bPPU::mmio_w210c(uint8 value) { + regs.bg_tdaddr[BG3] = (value & 0x07) << 13; + regs.bg_tdaddr[BG4] = (value & 0x70) << 9; +} + +//BG1HOFS +void bPPU::mmio_w210d(uint8 value) { + regs.bg_hofs[BG1] = (value << 8) | (regs.bg_hofs[BG1] >> 8); +} + +//BG1VOFS +void bPPU::mmio_w210e(uint8 value) { + regs.bg_vofs[BG1] = (value << 8) | (regs.bg_vofs[BG1] >> 8); +} + +//BG2HOFS +void bPPU::mmio_w210f(uint8 value) { + regs.bg_hofs[BG2] = (value << 8) | (regs.bg_hofs[BG2] >> 8); +} + +//BG2VOFS +void bPPU::mmio_w2110(uint8 value) { + regs.bg_vofs[BG2] = (value << 8) | (regs.bg_vofs[BG2] >> 8); +} + +//BG3HOFS +void bPPU::mmio_w2111(uint8 value) { + regs.bg_hofs[BG3] = (value << 8) | (regs.bg_hofs[BG3] >> 8); +} + +//BG3VOFS +void bPPU::mmio_w2112(uint8 value) { + regs.bg_vofs[BG3] = (value << 8) | (regs.bg_vofs[BG3] >> 8); +} + +//BG4HOFS +void bPPU::mmio_w2113(uint8 value) { + regs.bg_hofs[BG4] = (value << 8) | (regs.bg_hofs[BG4] >> 8); +} + +//BG4VOFS +void bPPU::mmio_w2114(uint8 value) { + regs.bg_vofs[BG4] = (value << 8) | (regs.bg_vofs[BG4] >> 8); +} + +//VMAIN +void bPPU::mmio_w2115(uint8 value) { + regs.vram_incmode = !!(value & 0x80); + regs.vram_mapping = (value >> 2) & 3; + switch(value & 3) { + case 0:regs.vram_incsize = 1;break; + case 1:regs.vram_incsize = 32;break; + case 2:regs.vram_incsize = 128;break; + case 3:regs.vram_incsize = 128;break; + } +} + +//VMADDL +void bPPU::mmio_w2116(uint8 value) { + regs.vram_addr = (regs.vram_addr & 0xff00) | value; +} + +//VMADDH +void bPPU::mmio_w2117(uint8 value) { + regs.vram_addr = (value << 8) | (regs.vram_addr & 0x00ff); +} + +//VMDATAL +void bPPU::mmio_w2118(uint8 value) { +uint16 addr = get_vram_address(); + vram_write(addr, value); + if(regs.vram_incmode == 0) { + regs.vram_addr += regs.vram_incsize; + } + bg_tiledata_state[TILE_2BIT][(addr >> 4)] = 1; + bg_tiledata_state[TILE_4BIT][(addr >> 5)] = 1; + bg_tiledata_state[TILE_8BIT][(addr >> 6)] = 1; +} + +//VMDATAH +void bPPU::mmio_w2119(uint8 value) { +uint16 addr = get_vram_address() + 1; + vram_write(addr, value); + if(regs.vram_incmode == 1) { + regs.vram_addr += regs.vram_incsize; + } + bg_tiledata_state[TILE_2BIT][(addr >> 4)] = 1; + bg_tiledata_state[TILE_4BIT][(addr >> 5)] = 1; + bg_tiledata_state[TILE_8BIT][(addr >> 6)] = 1; +} + +//M7SEL +void bPPU::mmio_w211a(uint8 value) { + regs.mode7_repeat = (value >> 6) & 3; + regs.mode7_vflip = !!(value & 0x02); + regs.mode7_hflip = !!(value & 0x01); +} + +//M7A +void bPPU::mmio_w211b(uint8 value) { + regs.m7a = (value << 8) | (regs.m7a >> 8); +} + +//M7B +void bPPU::mmio_w211c(uint8 value) { + regs.m7b = (value << 8) | (regs.m7b >> 8); +} + +//M7C +void bPPU::mmio_w211d(uint8 value) { + regs.m7c = (value << 8) | (regs.m7c >> 8); +} + +//M7D +void bPPU::mmio_w211e(uint8 value) { + regs.m7d = (value << 8) | (regs.m7d >> 8); +} + +//M7X +void bPPU::mmio_w211f(uint8 value) { + regs.m7x = (value << 8) | (regs.m7x >> 8); +} + +//M7Y +void bPPU::mmio_w2120(uint8 value) { + regs.m7y = (value << 8) | (regs.m7y >> 8); +} + +//CGADD +void bPPU::mmio_w2121(uint8 value) { + regs.cgram_addr = value << 1; +} + +//CGDATA +void bPPU::mmio_w2122(uint8 value) { + cgram_write(regs.cgram_addr, value); + regs.cgram_addr++; + regs.cgram_addr &= 0x01ff; +} + +//W12SEL +void bPPU::mmio_w2123(uint8 value) { + regs.bg_window2_enabled[BG2] = !!(value & 0x80); + regs.bg_window2_invert [BG2] = !!(value & 0x40); + regs.bg_window1_enabled[BG2] = !!(value & 0x20); + regs.bg_window1_invert [BG2] = !!(value & 0x10); + regs.bg_window2_enabled[BG1] = !!(value & 0x08); + regs.bg_window2_invert [BG1] = !!(value & 0x04); + regs.bg_window1_enabled[BG1] = !!(value & 0x02); + regs.bg_window1_invert [BG1] = !!(value & 0x01); +} + +//W34SEL +void bPPU::mmio_w2124(uint8 value) { + regs.bg_window2_enabled[BG4] = !!(value & 0x80); + regs.bg_window2_invert [BG4] = !!(value & 0x40); + regs.bg_window1_enabled[BG4] = !!(value & 0x20); + regs.bg_window1_invert [BG4] = !!(value & 0x10); + regs.bg_window2_enabled[BG3] = !!(value & 0x08); + regs.bg_window2_invert [BG3] = !!(value & 0x04); + regs.bg_window1_enabled[BG3] = !!(value & 0x02); + regs.bg_window1_invert [BG3] = !!(value & 0x01); +} + +//WOBJSEL +void bPPU::mmio_w2125(uint8 value) { + regs.color_window2_enabled = !!(value & 0x80); + regs.color_window2_invert = !!(value & 0x40); + regs.color_window1_enabled = !!(value & 0x20); + regs.color_window1_invert = !!(value & 0x10); + regs.bg_window2_enabled[OAM] = !!(value & 0x08); + regs.bg_window2_invert [OAM] = !!(value & 0x04); + regs.bg_window1_enabled[OAM] = !!(value & 0x02); + regs.bg_window1_invert [OAM] = !!(value & 0x01); +} + +//WH0 +void bPPU::mmio_w2126(uint8 value) { + regs.window1_left = value; +} + +//WH1 +void bPPU::mmio_w2127(uint8 value) { + regs.window1_right = value; +} + +//WH2 +void bPPU::mmio_w2128(uint8 value) { + regs.window2_left = value; +} + +//WH3 +void bPPU::mmio_w2129(uint8 value) { + regs.window2_right = value; +} + +//WBGLOG +void bPPU::mmio_w212a(uint8 value) { + regs.bg_window_mask[BG4] = (value >> 6) & 3; + regs.bg_window_mask[BG3] = (value >> 4) & 3; + regs.bg_window_mask[BG2] = (value >> 2) & 3; + regs.bg_window_mask[BG1] = (value ) & 3; +} + +//WOBJLOG +void bPPU::mmio_w212b(uint8 value) { + regs.color_window_mask = (value >> 2) & 3; + regs.bg_window_mask[OAM] = (value ) & 3; +} + +//TM +void bPPU::mmio_w212c(uint8 value) { + regs.bg_enabled[OAM] = !!(value & 0x10); + regs.bg_enabled[BG4] = !!(value & 0x08); + regs.bg_enabled[BG3] = !!(value & 0x04); + regs.bg_enabled[BG2] = !!(value & 0x02); + regs.bg_enabled[BG1] = !!(value & 0x01); +} + +//TS +void bPPU::mmio_w212d(uint8 value) { + regs.bgsub_enabled[OAM] = !!(value & 0x10); + regs.bgsub_enabled[BG4] = !!(value & 0x08); + regs.bgsub_enabled[BG3] = !!(value & 0x04); + regs.bgsub_enabled[BG2] = !!(value & 0x02); + regs.bgsub_enabled[BG1] = !!(value & 0x01); +} + +//TMW +void bPPU::mmio_w212e(uint8 value) { + regs.bg_window_enabled[OAM] = !!(value & 0x10); + regs.bg_window_enabled[BG4] = !!(value & 0x08); + regs.bg_window_enabled[BG3] = !!(value & 0x04); + regs.bg_window_enabled[BG2] = !!(value & 0x02); + regs.bg_window_enabled[BG1] = !!(value & 0x01); +} + +//TSW +void bPPU::mmio_w212f(uint8 value) { + regs.bgsub_window_enabled[OAM] = !!(value & 0x10); + regs.bgsub_window_enabled[BG4] = !!(value & 0x08); + regs.bgsub_window_enabled[BG3] = !!(value & 0x04); + regs.bgsub_window_enabled[BG2] = !!(value & 0x02); + regs.bgsub_window_enabled[BG1] = !!(value & 0x01); +} + +//CGWSEL +void bPPU::mmio_w2130(uint8 value) { + regs.color_mask = (value >> 6) & 3; + regs.colorsub_mask = (value >> 4) & 3; + regs.addsub_mode = !!(value & 0x02); +} + +//CGADDSUB +void bPPU::mmio_w2131(uint8 value) { + regs.color_mode = !!(value & 0x80); + regs.color_halve = !!(value & 0x40); + regs.bg_color_enabled[BACK] = !!(value & 0x20); + regs.bg_color_enabled[OAM] = !!(value & 0x10); + regs.bg_color_enabled[BG4] = !!(value & 0x08); + regs.bg_color_enabled[BG3] = !!(value & 0x04); + regs.bg_color_enabled[BG2] = !!(value & 0x02); + regs.bg_color_enabled[BG1] = !!(value & 0x01); +} + +//COLDATA +void bPPU::mmio_w2132(uint8 value) { + if(value & 0x80)regs.color_b = value & 0x1f; + if(value & 0x40)regs.color_g = value & 0x1f; + if(value & 0x20)regs.color_r = value & 0x1f; +} + +//SETINI +void bPPU::mmio_w2133(uint8 value) { + regs.mode7_extbg = !!(value & 0x40); + regs.overscan = !!(value & 0x04); + regs.scanlines = (value & 0x04)?239:224; + regs.oam_halve = !!(value & 0x02); + regs.interlace = !!(value & 0x01); + + clock->enable_overscan(regs.overscan); + clock->enable_interlace(regs.interlace); +} + +//MPYL +uint8 bPPU::mmio_r2134() { +uint32 r; + r = ((int16)regs.m7a * (int8)(regs.m7b >> 8)); + return (r); +} + +//MPYM +uint8 bPPU::mmio_r2135() { +uint32 r; + r = ((int16)regs.m7a * (int8)(regs.m7b >> 8)); + return (r >> 8); +} + +//MPYH +uint8 bPPU::mmio_r2136() { +uint32 r; + r = ((int16)regs.m7a * (int8)(regs.m7b >> 8)); + return (r >> 16); +} + +//SLHV +uint8 bPPU::mmio_r2137() { + if(cpu->pio_status() & 0x80) { + latch_counters(); + } + return 0x00; +} + +//OAMDATAREAD +uint8 bPPU::mmio_r2138() { +uint8 r; + r = oam_read(regs.oam_addr); + if(!(regs.oam_addr & 1)) { + regs.oam_latchdata = r; + } + regs.oam_addr++; + regs.oam_addr &= 0x03ff; + return r; +} + +//VMDATALREAD +uint8 bPPU::mmio_r2139() { +uint16 addr = get_vram_address(); +uint8 r = regs.vram_readbuffer; + if(regs.vram_incmode == 0) { + addr &= 0xfffe; + regs.vram_readbuffer = vram_read(addr); + regs.vram_readbuffer |= vram_read(addr + 1) << 8; + regs.vram_addr += regs.vram_incsize; + } + return r; +} + +//VMDATAHREAD +uint8 bPPU::mmio_r213a() { +uint16 addr = get_vram_address() + 1; +uint8 r = regs.vram_readbuffer >> 8; + if(regs.vram_incmode == 1) { + addr &= 0xfffe; + regs.vram_readbuffer = vram_read(addr); + regs.vram_readbuffer |= vram_read(addr + 1) << 8; + regs.vram_addr += regs.vram_incsize; + } + return r; +} + +//CGDATAREAD +uint8 bPPU::mmio_r213b() { +uint8 r; + r = cgram_read(regs.cgram_addr); + regs.cgram_addr++; + regs.cgram_addr &= 0x01ff; + return r; +} + +//OPHCT +uint8 bPPU::mmio_r213c() { +uint16 r = regs.hcounter; + if(regs.latch_hcounter)r >>= 8; + regs.latch_hcounter ^= 1; + return r; +} + +//OPVCT +uint8 bPPU::mmio_r213d() { +uint16 r = regs.vcounter; + if(regs.latch_vcounter)r >>= 8; + regs.latch_vcounter ^= 1; + return r; +} + +//STAT77 +uint8 bPPU::mmio_r213e() { +uint8 r = 0x00; + r |= clock->interlace_field() << 7; + if(!(cpu->pio_status() & 0x80)) { + r |= 1 << 6; + } else if(regs.counters_latched == true) { + r |= 1 << 6; + regs.counters_latched = false; + } + r |= 0x01; //PPU1 version number + return r; +} + +//STAT78 +uint8 bPPU::mmio_r213f() { +uint8 r = 0x00; + regs.latch_hcounter = 0; + regs.latch_vcounter = 0; + r |= (1 << 5); + r |= 0x03; //PPU2 version number + return r; +} + +uint8 bPPUMMIO::read(uint32 addr) { + clock->sync(); + switch(addr) { + case 0x2134:return ppu->mmio_r2134(); //MPYL + case 0x2135:return ppu->mmio_r2135(); //MPYM + case 0x2136:return ppu->mmio_r2136(); //MPYH + case 0x2137:return ppu->mmio_r2137(); //SLHV + case 0x2138:return ppu->mmio_r2138(); //OAMDATAREAD + case 0x2139:return ppu->mmio_r2139(); //VMDATALREAD + case 0x213a:return ppu->mmio_r213a(); //VMDATAHREAD + case 0x213b:return ppu->mmio_r213b(); //CGDATAREAD + case 0x213c:return ppu->mmio_r213c(); //OPHCT + case 0x213d:return ppu->mmio_r213d(); //OPVCT + case 0x213e:return ppu->mmio_r213e(); //STAT77 + case 0x213f:return ppu->mmio_r213f(); //STAT78 + + case 0x2140:case 0x2141:case 0x2142:case 0x2143: + static uint8 t = 0, counter = 0; + uint8 x, port = (addr & 3); + if(rand() & 1) { + x = rand() & 7; + if(x == 0) { + if(!(port & 1))t = cpu->regs.a; + else t = cpu->regs.a >> 8; + } + else if(x == 1) { + if(!(port & 1))t = cpu->regs.x; + else t = cpu->regs.x >> 8; + } + else if(x == 2) { + if(!(port & 1))t = cpu->regs.y; + else t = cpu->regs.y >> 8; + } + else if(x == 3)t = 0xaa; + else if(x == 4)t = 0xbb; + else if(x == 5)t = 0xcc; + else { t = counter++; } + } + return t; + } + return 0x00; +} + +void bPPUMMIO::write(uint32 addr, uint8 value) { + clock->sync(); + switch(addr) { + case 0x2100:ppu->mmio_w2100(value);return; //INIDISP + case 0x2101:ppu->mmio_w2101(value);return; //OBSEL + case 0x2102:ppu->mmio_w2102(value);return; //OAMADDL + case 0x2103:ppu->mmio_w2103(value);return; //OAMADDH + case 0x2104:ppu->mmio_w2104(value);return; //OAMDATA + case 0x2105:ppu->mmio_w2105(value);return; //BGMODE + case 0x2106:ppu->mmio_w2106(value);return; //MOSAIC + case 0x2107:ppu->mmio_w2107(value);return; //BG1SC + case 0x2108:ppu->mmio_w2108(value);return; //BG2SC + case 0x2109:ppu->mmio_w2109(value);return; //BG3SC + case 0x210a:ppu->mmio_w210a(value);return; //BG4SC + case 0x210b:ppu->mmio_w210b(value);return; //BG12NBA + case 0x210c:ppu->mmio_w210c(value);return; //BG34NBA + case 0x210d:ppu->mmio_w210d(value);return; //BG1HOFS + case 0x210e:ppu->mmio_w210e(value);return; //BG1VOFS + case 0x210f:ppu->mmio_w210f(value);return; //BG2HOFS + case 0x2110:ppu->mmio_w2110(value);return; //BG2VOFS + case 0x2111:ppu->mmio_w2111(value);return; //BG3HOFS + case 0x2112:ppu->mmio_w2112(value);return; //BG3VOFS + case 0x2113:ppu->mmio_w2113(value);return; //BG4HOFS + case 0x2114:ppu->mmio_w2114(value);return; //BG4VOFS + case 0x2115:ppu->mmio_w2115(value);return; //VMAIN + case 0x2116:ppu->mmio_w2116(value);return; //VMADDL + case 0x2117:ppu->mmio_w2117(value);return; //VMADDH + case 0x2118:ppu->mmio_w2118(value);return; //VMDATAL + case 0x2119:ppu->mmio_w2119(value);return; //VMDATAH + case 0x211a:ppu->mmio_w211a(value);return; //M7SEL + case 0x211b:ppu->mmio_w211b(value);return; //M7A + case 0x211c:ppu->mmio_w211c(value);return; //M7B + case 0x211d:ppu->mmio_w211d(value);return; //M7C + case 0x211e:ppu->mmio_w211e(value);return; //M7D + case 0x211f:ppu->mmio_w211f(value);return; //M7X + case 0x2120:ppu->mmio_w2120(value);return; //M7Y + case 0x2121:ppu->mmio_w2121(value);return; //CGADD + case 0x2122:ppu->mmio_w2122(value);return; //CGDATA + case 0x2123:ppu->mmio_w2123(value);return; //W12SEL + case 0x2124:ppu->mmio_w2124(value);return; //W34SEL + case 0x2125:ppu->mmio_w2125(value);return; //WOBJSEL + case 0x2126:ppu->mmio_w2126(value);return; //WH0 + case 0x2127:ppu->mmio_w2127(value);return; //WH1 + case 0x2128:ppu->mmio_w2128(value);return; //WH2 + case 0x2129:ppu->mmio_w2129(value);return; //WH3 + case 0x212a:ppu->mmio_w212a(value);return; //WBGLOG + case 0x212b:ppu->mmio_w212b(value);return; //WOBJLOG + case 0x212c:ppu->mmio_w212c(value);return; //TM + case 0x212d:ppu->mmio_w212d(value);return; //TS + case 0x212e:ppu->mmio_w212e(value);return; //TMW + case 0x212f:ppu->mmio_w212f(value);return; //TSW + case 0x2130:ppu->mmio_w2130(value);return; //CGWSEL + case 0x2131:ppu->mmio_w2131(value);return; //CGADDSUB + case 0x2132:ppu->mmio_w2132(value);return; //COLDATA + case 0x2133:ppu->mmio_w2133(value);return; //SETINI + } +} diff --git a/src/ppu/bppu/bppu_render.cpp b/src/ppu/bppu/bppu_render.cpp new file mode 100644 index 00000000..cbac39e2 --- /dev/null +++ b/src/ppu/bppu/bppu_render.cpp @@ -0,0 +1,133 @@ +#include "bppu_render_cache.cpp" +#include "bppu_render_windows.cpp" +#include "bppu_render_main.cpp" +#include "bppu_render_mode7.cpp" + +namespace bPPURenderTables { +enum { BG1 = 0, BG2 = 1, BG3 = 2, BG4 = 3, OAM = 4, BACK = 5 }; + uint8 lookup_mode0[12] = { + BG4, BG3, OAM, BG4, BG3, OAM, BG2, BG1, OAM, BG2, BG1, OAM + }; + uint8 lookup_mode1_pri0[10] = { + BG3, OAM, BG3, OAM, BG2, BG1, OAM, BG2, BG1, OAM + }; + uint8 lookup_mode1_pri1[10] = { + BG3, OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM, BG3 + }; + uint8 lookup_mode2[8] = { + OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM + }; + uint8 lookup_mode3[8] = { + OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM + }; + uint8 lookup_mode4[8] = { + OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM + }; + uint8 lookup_mode5[8] = { + OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM + }; + uint8 lookup_mode6[6] = { + OAM, OAM, BG1, OAM, BG1, OAM + }; + uint8 lookup_mode7[5] = { + OAM, BG1, OAM, OAM, OAM + }; + uint8 lookup_mode7_extbg[6] = { + BG2, OAM, OAM, BG2, OAM, OAM + }; +}; + +void bPPU::render_line_mode0() { + render_line_bg (7, 10, COLORDEPTH_4, BG1); + render_line_bg (6, 9, COLORDEPTH_4, BG2); + render_line_bg (1, 4, COLORDEPTH_4, BG3); + render_line_bg (0, 3, COLORDEPTH_4, BG4); + render_line_oam(2, 5, 8, 11); + set_layer_pixels(12, bPPURenderTables::lookup_mode0); +} + +void bPPU::render_line_mode1() { + switch(regs.bg3_priority) { + case 0: + render_line_bg (5, 8, COLORDEPTH_16, BG1); + render_line_bg (4, 7, COLORDEPTH_16, BG2); + render_line_bg (0, 2, COLORDEPTH_4, BG3); + render_line_oam(1, 3, 6, 9); + set_layer_pixels(10, bPPURenderTables::lookup_mode1_pri0); + break; + case 1: + render_line_bg (4, 7, COLORDEPTH_16, BG1); + render_line_bg (3, 6, COLORDEPTH_16, BG2); + render_line_bg (0, 9, COLORDEPTH_4, BG3); + render_line_oam(1, 2, 5, 8); + set_layer_pixels(10, bPPURenderTables::lookup_mode1_pri1); + break; + } +} + +void bPPU::render_line_mode2() { + render_line_bg (3, 6, COLORDEPTH_16, BG1); + render_line_bg (2, 5, COLORDEPTH_16, BG2); + render_line_oam(0, 1, 4, 7); + set_layer_pixels(8, bPPURenderTables::lookup_mode2); +} + +void bPPU::render_line_mode3() { + render_line_bg (3, 6, COLORDEPTH_256, BG1); + render_line_bg (2, 5, COLORDEPTH_16, BG2); + render_line_oam(0, 1, 4, 7); + set_layer_pixels(8, bPPURenderTables::lookup_mode3); +} + +void bPPU::render_line_mode4() { + render_line_bg (3, 6, COLORDEPTH_256, BG1); + render_line_bg (2, 5, COLORDEPTH_4, BG2); + render_line_oam(0, 1, 4, 7); + set_layer_pixels(8, bPPURenderTables::lookup_mode4); +} + +void bPPU::render_line_mode5() { + render_line_bg (3, 6, COLORDEPTH_16, BG1); + render_line_bg (2, 5, COLORDEPTH_4, BG2); + render_line_oam(0, 1, 4, 7); + set_layer_pixels(8, bPPURenderTables::lookup_mode5); +} + +void bPPU::render_line_mode6() { + render_line_bg (2, 4, COLORDEPTH_16, BG1); + render_line_oam(0, 1, 3, 5); + set_layer_pixels(8, bPPURenderTables::lookup_mode6); +} + +void bPPU::render_line_mode7() { + if(regs.mode7_extbg == false) { + render_line_m7 (1, 0, 0); //bg2 priorities are ignored + render_line_oam(0, 2, 3, 4); + set_layer_pixels(5, bPPURenderTables::lookup_mode7); + } else { + render_line_m7 (0, 0, 3); //bg1 priority is ignored + render_line_oam(1, 2, 4, 5); + set_layer_pixels(6, bPPURenderTables::lookup_mode7_extbg); + } +} + +void bPPU::render_line(uint16 line) { + if(regs.display_disabled == true) { + memset(output + (line << 1) * 512, 0, 2048); + return; + } + + clear_layer_cache(); + clear_pixel_cache(); + switch(regs.bg_mode) { + case 0:render_line_mode0();break; + case 1:render_line_mode1();break; + case 2:render_line_mode2();break; + case 3:render_line_mode3();break; + case 4:render_line_mode4();break; + case 5:render_line_mode5();break; + case 6:render_line_mode6();break; + case 7:render_line_mode7();break; + } + render_line_to_output(); +} diff --git a/src/ppu/bppu/bppu_render.h b/src/ppu/bppu/bppu_render.h new file mode 100644 index 00000000..7ee49de5 --- /dev/null +++ b/src/ppu/bppu/bppu_render.h @@ -0,0 +1,70 @@ +//bppu_render.cpp +void render_line_mode0(); +void render_line_mode1(); +void render_line_mode2(); +void render_line_mode3(); +void render_line_mode4(); +void render_line_mode5(); +void render_line_mode6(); +void render_line_mode7(); + +//bppu_render_cache.cpp +enum { BLENDTYPE_BACK = 0, BLENDTYPE_MAIN = 1, BLENDTYPE_SUB = 2, BLENDTYPE_COMBINE = 3 }; +enum { COLORDEPTH_4 = 0, COLORDEPTH_16 = 1, COLORDEPTH_256 = 2 }; +enum { TILE_2BIT = 0, TILE_4BIT = 1, TILE_8BIT = 2 }; + +struct { + uint8 color_main, color_sub; + uint8 src_main, src_sub; + uint8 blend_type; +}pixel_cache[512]; +uint8 layer_cache[512 * 12]; + +uint8 *bg_tiledata[3]; +uint8 *bg_tiledata_state[3]; + +void clear_pixel_cache(void); +void clear_layer_cache(void); +void init_tiledata_cache(void); +void clear_tiledata_cache(void); + +//bppu_render_windows.cpp +enum { WINDOWMASK_OR = 0, WINDOWMASK_AND = 1, WINDOWMASK_XOR = 2, WINDOWMASK_XNOR = 3 }; + +bool windows_not_obstructing(uint8 layer, uint8 bg, uint16 x); +bool color_windows_not_obstructing(uint16 x, uint8 color_mask_type); + +//bppu_render_main.cpp +enum { + SH_2 = 1, SH_4 = 2, SH_8 = 3, SH_16 = 4, + SH_32 = 5, SH_64 = 6, SH_128 = 7, SH_256 = 8, + SH_512 = 9, SH_1024 = 10, SH_2048 = 11, SH_4096 = 12 +}; +enum { COLORMODE_ADD = 0, COLORMODE_SUB = 1 }; +enum { PPU_MAIN = 0, PPU_SUB = 1 }; +enum { OAM_PRI_NONE = 4 }; +uint8 oam_line_pal[512], oam_line_pri[512]; + +struct { + byte num; + byte width, height; + word x, y; + word character; + byte v_flip, h_flip; + byte palette; + byte priority; +}current_sprite; + +void render_line_to_output(); +uint16 addsub_pixels(uint8 x, uint8 cdest_index, uint8 cdest_bg, uint8 csrc_index, uint8 csrc_bg); +uint16 addsub_pixel(uint8 x, uint8 cdest_index, uint8 cdest_bg); +void render_bg_tile(uint8 color_depth, uint8 bg, uint16 tile_num); +void set_pixel(uint8 bg, uint16 x, uint8 pal_index); +void set_layer_pixels(uint8 layer_count, uint8 *layer_bg_lookup); +void set_sprite_attributes(uint8 sprite_num); +void render_oam_sprite(void); +void render_line_oam(uint8 layer_pos_pri0, uint8 layer_pos_pri1, uint8 layer_pos_pri2, uint8 layer_pos_pri3); +void render_line_bg(uint8 layer_pos_pri0, uint8 layer_pos_pri1, uint8 color_depth, uint8 bg); + +//bppu_render_mode7.cpp +void render_line_m7(uint8 layer_pos_bg1, uint8 layer_pos_bg2_pri0, uint8 layer_pos_bg2_pri1); diff --git a/src/ppu/bppu/bppu_render_cache.cpp b/src/ppu/bppu/bppu_render_cache.cpp new file mode 100644 index 00000000..06b397d7 --- /dev/null +++ b/src/ppu/bppu/bppu_render_cache.cpp @@ -0,0 +1,34 @@ +//this should be reset once every scanline +void bPPU::clear_pixel_cache(void) { +int i; + for(i=0;i<512;i++) { + pixel_cache[i].color_main = 0; + pixel_cache[i].color_sub = 0; + pixel_cache[i].src_main = BACK; + pixel_cache[i].src_sub = BACK; + pixel_cache[i].blend_type = BLENDTYPE_BACK; + } +} + +//this should be reset once every scanline +void bPPU::clear_layer_cache(void) { + memset(&layer_cache, 0, 512 * 12); +} + +void bPPU::init_tiledata_cache(void) { + bg_tiledata[TILE_2BIT] = (byte*)malloc(262144); + bg_tiledata[TILE_4BIT] = (byte*)malloc(131072); + bg_tiledata[TILE_8BIT] = (byte*)malloc( 65536); + bg_tiledata_state[TILE_2BIT] = (byte*)malloc( 4096); + bg_tiledata_state[TILE_4BIT] = (byte*)malloc( 2048); + bg_tiledata_state[TILE_8BIT] = (byte*)malloc( 1024); +} + +void bPPU::clear_tiledata_cache(void) { + memset(bg_tiledata[TILE_2BIT], 0, 262144); + memset(bg_tiledata[TILE_4BIT], 0, 131072); + memset(bg_tiledata[TILE_4BIT], 0, 65536); + memset(bg_tiledata_state[TILE_2BIT], 0, 4096); + memset(bg_tiledata_state[TILE_4BIT], 0, 2048); + memset(bg_tiledata_state[TILE_8BIT], 0, 1024); +} diff --git a/src/ppu/bppu/bppu_render_main.cpp b/src/ppu/bppu/bppu_render_main.cpp new file mode 100644 index 00000000..c6acc8ca --- /dev/null +++ b/src/ppu/bppu/bppu_render_main.cpp @@ -0,0 +1,699 @@ +#define set_layer_pixel(__x, __c) layer_cache[(__x) * 12 + layer_pos] = __c +#define pal_pixel(__i) (*((uint16*)cgram + __i)) + +namespace bPPUAddSubTables { + uint8 adjust_buffer_full[96] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31 + }; + uint8 adjust_buffer_half[96] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 + }; +}; + +uint16 bPPU::addsub_pixels(uint8 x, uint8 cdest_index, uint8 cdest_bg, uint8 csrc_index, uint8 csrc_bg) { +int r, g, b; +uint16 cdest = pal_pixel(cdest_index); +uint16 csrc = pal_pixel(csrc_index); +uint16 res; +//oam palettes 0-3 are not affected by color add/sub + if(cdest_bg == OAM) { + if(cdest_index < 192) { + return cdest; + } + } + switch(regs.color_mode) { + case COLORMODE_ADD: + if(regs.bg_color_enabled[cdest_bg] == true && regs.color_halve == true) { + r = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest ) & 31) + ((csrc ) & 31) )) >> 1; + g = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest >> 5) & 31) + ((csrc >> 5) & 31) )) >> 1; + b = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest >> 10) & 31) + ((csrc >> 10) & 31) )) >> 1; + } else { + r = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest ) & 31) + ((csrc ) & 31) )); + g = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest >> 5) & 31) + ((csrc >> 5) & 31) )); + b = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest >> 10) & 31) + ((csrc >> 10) & 31) )); + } + break; + case COLORMODE_SUB: + if(regs.bg_color_enabled[cdest_bg] == true && regs.color_halve == true) { + r = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest ) & 31) + ((csrc ) & 31) )) >> 1; + g = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest >> 5) & 31) + ((csrc >> 5) & 31) )) >> 1; + b = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest >> 10) & 31) + ((csrc >> 10) & 31) )) >> 1; + } else { + r = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest ) & 31) - ((csrc ) & 31) )); + g = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest >> 5) & 31) - ((csrc >> 5) & 31) )); + b = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest >> 10) & 31) - ((csrc >> 10) & 31) )); + } + break; + } + return ((r) | (g << 5) | (b << 10)); +} + +uint16 bPPU::addsub_pixel(uint8 x, uint8 cdest_index, uint8 cdest_bg) { +int r, g, b; +uint16 cdest = pal_pixel(cdest_index); +uint16 csrc = (regs.color_r) | (regs.color_g << 5) | (regs.color_b << 10); +uint16 res; +//only oam palettes 4-7 are affected by color add/sub + if(cdest_bg == OAM) { + if(cdest_index < 192) { + return cdest; + } + } + switch(regs.color_mode) { + case COLORMODE_ADD: + if(regs.bg_color_enabled[cdest_bg] == true && regs.color_halve == true && regs.addsub_mode == 0) { + r = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest ) & 31) + ((csrc ) & 31) )) >> 1; + g = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest >> 5) & 31) + ((csrc >> 5) & 31) )) >> 1; + b = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest >> 10) & 31) + ((csrc >> 10) & 31) )) >> 1; + } else { + r = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest ) & 31) + ((csrc ) & 31) )); + g = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest >> 5) & 31) + ((csrc >> 5) & 31) )); + b = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest >> 10) & 31) + ((csrc >> 10) & 31) )); + } + break; + case COLORMODE_SUB: + if(regs.bg_color_enabled[cdest_bg] == true && regs.color_halve == true && regs.addsub_mode == 0) { + r = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest ) & 31) + ((csrc ) & 31) )) >> 1; + g = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest >> 5) & 31) + ((csrc >> 5) & 31) )) >> 1; + b = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest >> 10) & 31) + ((csrc >> 10) & 31) )) >> 1; + } else { + r = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest ) & 31) - ((csrc ) & 31) )); + g = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest >> 5) & 31) - ((csrc >> 5) & 31) )); + b = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest >> 10) & 31) - ((csrc >> 10) & 31) )); + } + break; + } + return ((r) | (g << 5) | (b << 10)); +} + +#define render_bg_tile_line_4(__m) \ + col = 0; \ + if(d0 & __m)col += 1; \ + if(d1 & __m)col += 2; \ + *dest++ = col +#define render_bg_tile_line_16(__m) \ + col = 0; \ + if(d0 & __m)col += 1; \ + if(d1 & __m)col += 2; \ + if(d2 & __m)col += 4; \ + if(d3 & __m)col += 8; \ + *dest++ = col +#define render_bg_tile_line_256(__m) \ + col = 0; \ + if(d0 & __m)col += 1; \ + if(d1 & __m)col += 2; \ + if(d2 & __m)col += 4; \ + if(d3 & __m)col += 8; \ + if(d4 & __m)col += 16; \ + if(d5 & __m)col += 32; \ + if(d6 & __m)col += 64; \ + if(d7 & __m)col += 128; \ + *dest++ = col + +void bPPU::render_bg_tile(uint8 color_depth, uint8 bg, uint16 tile_num) { +uint8 mask, d0, d1, d2, d3, d4, d5, d6, d7, col; +int x, y; +uint32 pos; +uint8 *dest; + switch(color_depth) { + case COLORDEPTH_4: + dest = (uint8*)bg_tiledata[TILE_2BIT] + tile_num * 64; + pos = tile_num * 16; + y = 8; + while(y--) { + d0 = vram[pos ]; + d1 = vram[pos + 1]; + render_bg_tile_line_4(0x80); + render_bg_tile_line_4(0x40); + render_bg_tile_line_4(0x20); + render_bg_tile_line_4(0x10); + render_bg_tile_line_4(0x08); + render_bg_tile_line_4(0x04); + render_bg_tile_line_4(0x02); + render_bg_tile_line_4(0x01); + pos += 2; + } + bg_tiledata_state[TILE_2BIT][tile_num] = 0; + break; + case COLORDEPTH_16: + dest = (uint8*)bg_tiledata[TILE_4BIT] + tile_num * 64; + pos = tile_num * 32; + y = 8; + while(y--) { + d0 = vram[pos ]; + d1 = vram[pos + 1]; + d2 = vram[pos + 16]; + d3 = vram[pos + 17]; + render_bg_tile_line_16(0x80); + render_bg_tile_line_16(0x40); + render_bg_tile_line_16(0x20); + render_bg_tile_line_16(0x10); + render_bg_tile_line_16(0x08); + render_bg_tile_line_16(0x04); + render_bg_tile_line_16(0x02); + render_bg_tile_line_16(0x01); + pos += 2; + } + bg_tiledata_state[TILE_4BIT][tile_num] = 0; + break; + case COLORDEPTH_256: + dest = (uint8*)bg_tiledata[TILE_8BIT] + tile_num * 64; + pos = tile_num * 64; + y = 8; + while(y--) { + d0 = vram[pos ]; + d1 = vram[pos + 1]; + d2 = vram[pos + 16]; + d3 = vram[pos + 17]; + d4 = vram[pos + 32]; + d5 = vram[pos + 33]; + d6 = vram[pos + 48]; + d7 = vram[pos + 49]; + render_bg_tile_line_256(0x80); + render_bg_tile_line_256(0x40); + render_bg_tile_line_256(0x20); + render_bg_tile_line_256(0x10); + render_bg_tile_line_256(0x08); + render_bg_tile_line_256(0x04); + render_bg_tile_line_256(0x02); + render_bg_tile_line_256(0x01); + pos += 2; + } + bg_tiledata_state[TILE_8BIT][tile_num] = 0; + break; + } +} + +void bPPU::render_line_to_output() { +int x, x1; +uint16 *ptr, *ptri, *ltable; +uint16 c, cx, cy; +uint16 screen_width = (regs.bg_mode == 5 || regs.bg_mode == 6)?512:256; +uint16 vline_pos = clock->vcounter(); + + if(clock->interlace() == false) { + ptr = (uint16*)output + ((vline_pos << 1) ) * 512; + ptri = (uint16*)output + ((vline_pos << 1) + 1) * 512; + } else { + ptr = (uint16*)output + ((vline_pos << 1) + clock->interlace_field()) * 512; + } + ltable = (uint16*)light_table + (regs.display_brightness * 65536); + + for(x=x1=0;xinterlace() == false) { + *(ptr + (x1 )) = *(ltable + cx); + *(ptri + (x1++)) = *(ltable + cx); + if(screen_width != 256)continue; + *(ptr + (x1 )) = *(ltable + cx); + *(ptri + (x1++)) = *(ltable + cx); + } else { + *(ptr + (x1++)) = *(ltable + cx); + if(screen_width != 256)continue; + *(ptr + (x1++)) = *(ltable + cx); + } + } +} + +void bPPU::set_pixel(uint8 bg, uint16 x, uint8 pal_index) { + if(regs.bg_enabled[bg] == true && regs.bgsub_enabled[bg] == true) { + if(windows_not_obstructing(PPU_MAIN, bg, x) == false)return; + pixel_cache[x].blend_type = BLENDTYPE_MAIN; + pixel_cache[x].src_main = bg; + pixel_cache[x].color_main = pal_index; + if(color_windows_not_obstructing(x, PPU_SUB) == false) { + pixel_cache[x].src_sub = bg; + pixel_cache[x].color_sub = pal_index; + } + } else if(regs.bg_enabled[bg] == true && bg == OAM && pal_index < 192) { + if(windows_not_obstructing(PPU_MAIN, bg, x) == false)return; + pixel_cache[x].blend_type = BLENDTYPE_MAIN; + pixel_cache[x].src_main = bg; + pixel_cache[x].color_main = pal_index; + } else if(regs.bg_enabled[bg] == true) { + if(windows_not_obstructing(PPU_MAIN, bg, x) == false)return; + if(regs.bg_color_enabled[bg] == true && pixel_cache[x].src_sub != BACK) { + pixel_cache[x].blend_type = BLENDTYPE_COMBINE; + } else { + pixel_cache[x].blend_type = BLENDTYPE_MAIN; + } + pixel_cache[x].src_main = bg; + pixel_cache[x].color_main = pal_index; + } else if(regs.bgsub_enabled[bg] == true) { + if(windows_not_obstructing(PPU_SUB, bg, x) == false)return; + pixel_cache[x].src_sub = bg; + pixel_cache[x].color_sub = pal_index; + if(pixel_cache[x].blend_type == BLENDTYPE_BACK) { + pixel_cache[x].blend_type = BLENDTYPE_SUB; + } else if(pixel_cache[x].blend_type == BLENDTYPE_MAIN) { + if(pixel_cache[x].src_main != OAM || (pixel_cache[x].src_main == OAM && pixel_cache[x].color_main >= 192)) { + if(regs.bg_color_enabled[pixel_cache[x].src_main] == true) { + pixel_cache[x].blend_type = BLENDTYPE_COMBINE; + } + } + } + } +} + +void bPPU::set_layer_pixels(uint8 layer_count, uint8 *layer_bg_lookup) { +int layer, x = 0, x1; +uint8 pal; +uint16 width = (regs.bg_mode == 5 || regs.bg_mode == 6)?512:256; + do { + layer = 0; + x1 = x * 12; + do { + pal = layer_cache[x1 + layer]; + if(pal) { + set_pixel(layer_bg_lookup[layer], x, pal); + } + layer++; + } while(layer < layer_count); + x++; + } while(x < width); +} + +void bPPU::set_sprite_attributes(uint8 sprite_num) { +uint32 t; +uint8 size, b; +uint16 x; + t = *((uint32*)oam + sprite_num); + b = oam[512 + (sprite_num >> 2)]; + + switch(sprite_num & 3) { + case 0: size = !!(b & 0x02); x = (b & 0x01)?0x100:0; break; + case 1: size = !!(b & 0x08); x = (b & 0x04)?0x100:0; break; + case 2: size = !!(b & 0x20); x = (b & 0x10)?0x100:0; break; + case 3: size = !!(b & 0x80); x = (b & 0x40)?0x100:0; break; + } + + current_sprite.num = sprite_num; + current_sprite.priority = (t >> 28) & 3; + current_sprite.x = x | (t & 0xff); + current_sprite.y = ((t >> 8) + 1) & 0xff; + current_sprite.v_flip = !!(t & 0x80000000); + current_sprite.h_flip = !!(t & 0x40000000); + current_sprite.palette = (t >> 25) & 7; + current_sprite.character = (t >> 16) & 0x01ff; + +//size: 0 = small, 1 = large + switch(regs.oam_basesize) { + case 0: + if(!size) { current_sprite.width = 8; current_sprite.height = 8; } + else { current_sprite.width = 16; current_sprite.height = 16; } + break; + case 1: + if(!size) { current_sprite.width = 8; current_sprite.height = 8; } + else { current_sprite.width = 32; current_sprite.height = 32; } + break; + case 2: + if(!size) { current_sprite.width = 8; current_sprite.height = 8; } + else { current_sprite.width = 64; current_sprite.height = 64; } + break; + case 3: + if(!size) { current_sprite.width = 16; current_sprite.height = 16; } + else { current_sprite.width = 32; current_sprite.height = 32; } + break; + case 4: + if(!size) { current_sprite.width = 16; current_sprite.height = 16; } + else { current_sprite.width = 64; current_sprite.height = 64; } + break; + case 5: + if(!size) { current_sprite.width = 32; current_sprite.height = 32; } + else { current_sprite.width = 64; current_sprite.height = 64; } + break; + case 6: + if(!size) { current_sprite.width = 16; current_sprite.height = 32; } + else { current_sprite.width = 32; current_sprite.height = 64; } + break; + case 7: + if(!size) { current_sprite.width = 16; current_sprite.height = 32; } + else { current_sprite.width = 32; current_sprite.height = 32; } + break; + } +} + +void bPPU::render_oam_sprite(void) { +uint16 pos, col, chr, tiledata_inc; +uint8 d0, d1, d2, d3, pal_index; +int x, y, z, x1, mx, mask, p; +int tile_width; +int vline_pos = clock->vcounter(); +int snes_width = (regs.bg_mode == 5 || regs.bg_mode == 6)?512:256; + if(regs.bg_enabled[OAM] == false && regs.bgsub_enabled[OAM] == false)return; + + tile_width = current_sprite.width >> SH_8; //e.x. 16x16 sprite = 2x2 tiles + + if(clock->interlace() == true && (regs.bg_mode == 5 || regs.bg_mode == 6)) { + y = (vline_pos << SH_2) + clock->interlace_field(); + } else { + y = vline_pos; + } + + x = current_sprite.x; + if(snes_width == 512) { + x <<= SH_2; + } + + if(current_sprite.v_flip) { + y = ((current_sprite.height - 1) - (vline_pos - current_sprite.y)); + } else { + y = (vline_pos - current_sprite.y); + } + y &= 255; + if(regs.oam_halve == true) { + y <<= 1; + y += clock->interlace_field(); + } + + chr = current_sprite.character; + tiledata_inc = (chr & 0x100)?(regs.oam_nameselect << 13):0; + chr += (y >> SH_8) << SH_16; + pal_index = (current_sprite.palette << SH_16); + for(x1=0;x1> z; + } + x &= 511; + if(x < snes_width) { + col = 0; + if(d0 & mask)col += 1; + if(d1 & mask)col += 2; + if(d2 & mask)col += 4; + if(d3 & mask)col += 8; + if(col) { + col += pal_index; + col += 128; + if(oam_line_pri[x] == OAM_PRI_NONE) { + oam_line_pal[x] = col; + oam_line_pri[x] = current_sprite.priority; + } + if(snes_width == 512) { + if(oam_line_pri[x + 1] == OAM_PRI_NONE) { + oam_line_pal[x + 1] = col; + oam_line_pri[x + 1] = current_sprite.priority; + } + } + } + } + x++; + if(snes_width == 512) { + x++; + } + } + } +} + +void bPPU::render_line_oam(uint8 layer_pos_pri0, uint8 layer_pos_pri1, uint8 layer_pos_pri2, uint8 layer_pos_pri3) { +int i, s; +int vline_pos = clock->vcounter(); +int snes_width = (regs.bg_mode == 5 || regs.bg_mode == 6)?512:256; +uint8 layer_pos; + if(regs.bg_enabled[OAM] != true && regs.bgsub_enabled[OAM] != true)return; + + memset(oam_line_pri, OAM_PRI_NONE, 512); + for(s=0;s<128;s++) { + set_sprite_attributes(s); + if(regs.oam_halve == false) { + if(vline_pos >= current_sprite.y && vline_pos < (current_sprite.y + current_sprite.height)) { + render_oam_sprite(); + } else if((current_sprite.y + current_sprite.height) >= 256 && vline_pos < ((current_sprite.y + current_sprite.height) & 255)) { + render_oam_sprite(); + } + } else { + if(vline_pos >= current_sprite.y && vline_pos < (current_sprite.y + (current_sprite.height >> 1))) { + render_oam_sprite(); + } else if((current_sprite.y + current_sprite.height) >= 256 && vline_pos < ((current_sprite.y + (current_sprite.height >> 1)) & 255)) { + render_oam_sprite(); + } + } + } + + for(i=0;ivcounter(); +uint16 t, base_xpos, base_pos, pos, ppos = 0; +uint16 col; +uint8 *src, *bg_td, *bg_td_state, *tile_ptr; +uint8 tiledata_size; +uint8 tile_size, tile_width, tile_height, tile_x; +uint8 mask, pal_index, pal_size; +uint16 tile_num, screen_width, screen_height, screen_width_mask, screen_height_mask, map_index; +uint16 *mtable; +uint8 layer_pos; +uint16 opt_valid_bit, voffset, hoffset, vscroll, hscroll; + if(regs.bg_enabled[bg] == false && regs.bgsub_enabled[bg] == false)return; + + if (bg == BG1)opt_valid_bit = 0x2000; + else if(bg == BG2)opt_valid_bit = 0x4000; + else opt_valid_bit = 0x0000; + + switch(color_depth) { + case COLORDEPTH_4: + pal_size = 4; + tiledata_size = SH_16; + break; + case COLORDEPTH_16: + pal_size = 16; + tiledata_size = SH_32; + break; + case COLORDEPTH_256: + pal_size = 256; + tiledata_size = SH_64; + break; + } + bg_td = (byte*)bg_tiledata[color_depth]; + bg_td_state = (byte*)bg_tiledata_state[color_depth]; + + screen_width = snes_width; + screen_height = snes_width; //this is correct -- ppu tilemap is based around 256x256, etc. + tile_size = (regs.bg_tilesize[bg])?SH_16:SH_8; + tile_width = tile_size; + tile_height = tile_size; + + if(clock->interlace() == true && (regs.bg_mode == 5 || regs.bg_mode == 6)) { + screen_y = (vline_pos << SH_2) + clock->interlace_field(); + } else { + screen_y = vline_pos; + } + +//Modes 5 and 6 seem to force 16-width tiles due to having twice the resolution. +//The tile size attribute in $2105 has no effect on tile width. + if(regs.bg_mode == 5 || regs.bg_mode == 6) { + tile_width = SH_16; + } + + if(tile_size == SH_16) { + screen_width <<= SH_2; + screen_height <<= SH_2; + } + + if(regs.bg_scsize[bg] & 0x01)screen_width <<= SH_2; + if(regs.bg_scsize[bg] & 0x02)screen_height <<= SH_2; + + screen_width_mask = screen_width - 1; + screen_height_mask = screen_height - 1; + + if(snes_width == 512) { + hscroll = (regs.bg_hofs[bg] << SH_2) & screen_width_mask; + } else { + hscroll = regs.bg_hofs[bg] & screen_width_mask; + } + bg_x = hscroll; + + if(snes_width == 512 && clock->interlace() == true) { + vscroll = (regs.bg_vofs[bg] << SH_2) & screen_height_mask; + } else { + vscroll = regs.bg_vofs[bg] & screen_height_mask; + } + bg_y = (screen_y + vscroll) & screen_height_mask; + + if(regs.mosaic_enabled[bg] == true) { + mtable = (uint16*)mosaic_table[regs.mosaic_size]; + } else { + mtable = (uint16*)mosaic_table[0]; + } + mosaic_x = mtable[bg_x]; + mosaic_y = mtable[bg_y]; + + for(screen_x=0;screen_x> SH_16); + } else { + tile_x = (mtable[screen_x + (hscroll & 7)] >> SH_8); + } + hoffset = hscroll; + voffset = vscroll; + if(tile_x != 0) { + tile_x = (tile_x - 1) & 31; + if(regs.bg_mode == 4) { + pos = regs.bg_scaddr[BG3] + (tile_x << SH_2); + t = *((uint16*)vram + (pos >> SH_2)); + if(t & opt_valid_bit) { + if(!(t & 0x8000)) { + hoffset = ((t & 0x1ff8) | (hscroll & 7)) & screen_width_mask; + } else { + voffset = (t & 0x1fff) & screen_height_mask; + } + } + } else { + pos = regs.bg_scaddr[BG3] + (tile_x << SH_2); + t = *((uint16*)vram + (pos >> SH_2)); + if(t & opt_valid_bit) { + hoffset = ((t & 0x1ff8) | (hscroll & 7)) & screen_width_mask; + } + pos = regs.bg_scaddr[BG3] + 64 + (tile_x << SH_2); + t = *((uint16*)vram + (pos >> SH_2)); + if(t & opt_valid_bit) { + voffset = (t & 0x1fff) & screen_height_mask; + } + } + } + mosaic_x = mtable[(screen_x + hoffset) & screen_width_mask ]; + mosaic_y = mtable[(screen_y + voffset) & screen_height_mask]; + } + + switch(regs.bg_scsize[bg]) { + case 0: + map_index = 0; + break; + case 1: + map_index = ((mosaic_x >> tile_size) >> SH_32) << SH_2048; + break; + case 2: + map_index = ((mosaic_y >> tile_size) >> SH_32) << SH_2048; + break; + case 3: + map_index = ((mosaic_x >> tile_size) >> SH_32) << SH_2048 | + ((mosaic_y >> tile_size) >> SH_32) << SH_4096; + break; + } + + base_xpos = ((mosaic_x >> SH_8) & 31); + base_pos = (((mosaic_y >> tile_height) & 31) << SH_32) + ((mosaic_x >> tile_width) & 31); + pos = regs.bg_scaddr[bg] + map_index + (base_pos << SH_2); + t = *((uint16*)vram + (pos >> SH_2)); + mirror_y = (t & 0x8000)?1:0; + mirror_x = (t & 0x4000)?1:0; + + if((t & 0x2000) == 0) { + layer_pos = layer_pos_pri0; + } else { + layer_pos = layer_pos_pri1; + } + + tile_num = t & 0x03ff; + if(tile_width == SH_16) { + if(((mosaic_x & 15) >= 8 && !mirror_x) || + ((mosaic_x & 15) < 8 && mirror_x))tile_num++; + tile_num &= 0x03ff; + } + if(tile_height == SH_16) { + if(((mosaic_y & 15) >= 8 && !mirror_y) || + ((mosaic_y & 15) < 8 && mirror_y))tile_num += 16; + tile_num &= 0x03ff; + } + tile_num += (regs.bg_tdaddr[bg] >> tiledata_size); + + if(bg_td_state[tile_num] == 1) { + render_bg_tile(color_depth, bg, tile_num); + } + + pal_index = ((t >> 10) & 7) * pal_size; + + if(mirror_y) { ypos = (7 - (mosaic_y & 7)); } + else { ypos = ( (mosaic_y & 7)); } + +//loop while we are rendering from the same tile, as there's no need to do all of the above work +//unless we have rendered all of the visible tile, taking mosaic into account. + tile_ptr = (uint8*)bg_td + (tile_num << SH_64) + (ypos << SH_8); + while(1) { + if(mirror_x) { xpos = (7 - (mosaic_x & 7)); } + else { xpos = ( (mosaic_x & 7)); } + col = *(tile_ptr + xpos); + if(col) { + set_layer_pixel(screen_x, col + pal_index); + } + + bg_x++; + bg_x &= screen_width_mask; + mosaic_x = mtable[bg_x]; + + if(base_xpos != ((mosaic_x >> SH_8) & 31))break; + screen_x++; + if(screen_x >= snes_width)break; + } + } +} diff --git a/src/ppu/bppu/bppu_render_mode7.cpp b/src/ppu/bppu/bppu_render_mode7.cpp new file mode 100644 index 00000000..823eb555 --- /dev/null +++ b/src/ppu/bppu/bppu_render_mode7.cpp @@ -0,0 +1,110 @@ +#define CLIP_10BIT_SIGNED(x) \ + ((x) & ((1 << 10) - 1)) + (((((x) & (1 << 13)) ^ (1 << 13)) - (1 << 13)) >> 3) + +#define CAST_WORDTOINT(x) \ + (int)(((x & 0x8000)?(x | 0xffff0000):(x & 0x00007fff))) + +void bPPU::render_line_m7(uint8 layer_pos_bg1, uint8 layer_pos_bg2_pri0, uint8 layer_pos_bg2_pri1) { +int x; +int step_m7a, step_m7c, m7a, m7b, m7c, m7d; +int hoffset, voffset; +int centerx, centery; +int xx, yy; +int px, py; +int tx, ty, tile, palette, priority; +uint8 layer_pos; + hoffset = (CAST_WORDTOINT(regs.bg_hofs[BG1]) << 7) >> 7; + voffset = (CAST_WORDTOINT(regs.bg_vofs[BG1]) << 7) >> 7; + + centerx = (CAST_WORDTOINT(regs.m7x) << 7) >> 7; + centery = (CAST_WORDTOINT(regs.m7y) << 7) >> 7; + + if(regs.mode7_vflip == true) { + yy = 223 - clock->vcounter(); + } else { + yy = clock->vcounter(); + } + yy += CLIP_10BIT_SIGNED(voffset - centery); + + m7b = CAST_WORDTOINT(regs.m7b) * yy + (centerx << 8); + m7d = CAST_WORDTOINT(regs.m7d) * yy + (centery << 8); + + step_m7a = CAST_WORDTOINT(regs.m7a); + step_m7c = CAST_WORDTOINT(regs.m7c); + + xx = CLIP_10BIT_SIGNED(hoffset - centerx); + + m7a = CAST_WORDTOINT(regs.m7a) * xx; + m7c = CAST_WORDTOINT(regs.m7c) * xx; + + for(x=0;x<256;x++) { + px = ((m7a + m7b) >> 8); + py = ((m7c + m7d) >> 8); + + switch(regs.mode7_repeat) { + case 0: //screen repitition outside of screen area + case 1: //same as case 0 + px &= 1023; + py &= 1023; + tx = ((px >> SH_8) & 127); + ty = ((py >> SH_8) & 127); + tile = vram[(ty * 128 + tx) << 1]; + palette = vram[(((tile << SH_64) + ((py & 7) << SH_8) + (px & 7)) << 1) + 1]; + break; + case 2: //character 0 repetition outside of screen area + if(px < 0 || px > 1023 || py < 0 || py > 1023) { + tx = 0; + ty = 0; + } else { + px &= 1023; + py &= 1023; + tx = ((px >> SH_8) & 127); + ty = ((py >> SH_8) & 127); + } + tile = vram[(ty * 128 + tx) << 1]; + palette = vram[(((tile << SH_64) + ((py & 7) << SH_8) + (px & 7)) << 1) + 1]; + break; + case 3: //palette color 0 outside of screen area + if(px < 0 || px > 1023 || py < 0 || py > 1023) { + palette = 0; + } else { + px &= 1023; + py &= 1023; + tx = ((px >> SH_8) & 127); + ty = ((py >> SH_8) & 127); + tile = vram[(ty * 128 + tx) << 1]; + palette = vram[(((tile << SH_64) + ((py & 7) << SH_8) + (px & 7)) << 1) + 1]; + } + break; + } + + if(regs.mode7_extbg == false) { + if(palette) { + layer_pos = layer_pos_bg1; + if(regs.mode7_hflip == true) { + set_layer_pixel(255 - x, palette); + } else { + set_layer_pixel(x, palette); + } + } + } else { + priority = (palette >> 7); + palette &= 0x7f; + if(palette) { + if(priority == 0) { + layer_pos = layer_pos_bg2_pri0; + } else { + layer_pos = layer_pos_bg2_pri1; + } + if(regs.mode7_hflip == true) { + set_layer_pixel(255 - x, palette); + } else { + set_layer_pixel(x, palette); + } + } + } + + m7a += step_m7a; + m7c += step_m7c; + } +} diff --git a/src/ppu/bppu/bppu_render_windows.cpp b/src/ppu/bppu/bppu_render_windows.cpp new file mode 100644 index 00000000..cc0cc5e4 --- /dev/null +++ b/src/ppu/bppu/bppu_render_windows.cpp @@ -0,0 +1,159 @@ +bool bPPU::windows_not_obstructing(uint8 layer, uint8 bg, uint16 x) { +uint8 w1_mask, w2_mask; //1 = masked, 0 = not masked +uint16 window1_left, window1_right, window2_left, window2_right; + if(layer == PPU_MAIN) { + if(regs.bg_window_enabled[bg] == false)return true; + } else if(layer == PPU_SUB) { + if(regs.bgsub_window_enabled[bg] == false)return true; + } + + window1_left = regs.window1_left; + window1_right = regs.window1_right; + window2_left = regs.window2_left; + window2_right = regs.window2_right; + + if(regs.bg_mode == 5 || regs.bg_mode == 6) { + window1_left <<= 1; + window1_right <<= 1; + window2_left <<= 1; + window2_right <<= 1; + } + + if(regs.bg_window1_enabled[bg] == true && regs.bg_window2_enabled[bg] == false) { + if(regs.bg_window1_invert[bg] == false) { + if(x >= window1_left && x <= window1_right)return false; + return true; + } else { + if(x < window1_left || x > window1_right)return false; + return true; + } + } else if(regs.bg_window2_enabled[bg] == true && regs.bg_window1_enabled[bg] == false) { + if(regs.bg_window2_invert[bg] == false) { + if(x >= window2_left && x <= window2_right)return false; + return true; + } else { + if(x < window2_left || x > window2_right)return false; + return true; + } + } else if(regs.bg_window1_enabled[bg] == true && regs.bg_window2_enabled[bg] == true) { + if(regs.bg_window1_invert[bg] == false) { + if(x >= window1_left && x <= window1_right)w1_mask = 1; + else w1_mask = 0; + } else { + if(x < window1_left || x > window1_right)w1_mask = 1; + else w1_mask = 0; + } + + if(regs.bg_window2_invert[bg] == false) { + if(x >= window2_left && x <= window2_right)w2_mask = 1; + else w2_mask = 0; + } else { + if(x < window2_left || x > window2_right)w2_mask = 1; + else w2_mask = 0; + } + + switch(regs.bg_window_mask[bg]) { + case WINDOWMASK_OR: + if((w1_mask | w2_mask) == 1)return false; + return true; + case WINDOWMASK_AND: + if((w1_mask & w2_mask) == 1)return false; + return true; + case WINDOWMASK_XOR: + if((w1_mask ^ w2_mask) == 1)return false; + return true; + case WINDOWMASK_XNOR: + if((w1_mask ^ w2_mask) == 0)return false; + return true; + } + } + return true; +} + +bool bPPU::color_windows_not_obstructing(uint16 x, uint8 color_mask_type) { +uint8 w1_mask, w2_mask; //1 = masked, 0 = not masked +uint8 color_mask; +bool r; +uint16 window1_left, window1_right, window2_left, window2_right; + if(color_mask_type == PPU_MAIN) { + color_mask = regs.color_mask; + } else { + color_mask = regs.colorsub_mask; + } + + if(color_mask == 0)return false; + if(color_mask == 3)return true; + + window1_left = regs.window1_left; + window1_right = regs.window1_right; + window2_left = regs.window2_left; + window2_right = regs.window2_right; + + if(regs.bg_mode == 5 || regs.bg_mode == 6) { + window1_left <<= 1; + window1_right <<= 1; + window2_left <<= 1; + window2_right <<= 1; + } + + if(regs.color_window1_enabled == false && regs.color_window2_enabled == false) { + r = true; + } else if(regs.color_window1_enabled == true && regs.color_window2_enabled == false) { + if(regs.color_window1_invert == false) { + if(x >= window1_left && x <= window1_right)r = false; + else r = true; + } else { + if(x < window1_left || x > window1_right)r = false; + else r = true; + } + } else if(regs.color_window1_enabled == false && regs.color_window2_enabled == true) { + if(regs.color_window2_invert == false) { + if(x >= window2_left && x <= window2_right)r = false; + else r = true; + } else { + if(x < window2_left || x > window2_right)r = false; + else r = true; + } + } else if(regs.color_window1_enabled == true && regs.color_window2_enabled == true) { + if(regs.color_window1_invert == false) { + if(x >= window1_left && x <= window1_right)w1_mask = 1; + else w1_mask = 0; + } else { + if(x < window1_left || x > window1_right)w1_mask = 1; + else w1_mask = 0; + } + + if(regs.color_window2_invert == false) { + if(x >= window2_left && x <= window2_right)w2_mask = 1; + else w2_mask = 0; + } else { + if(x < window2_left || x > window2_right)w2_mask = 1; + else w2_mask = 0; + } + + switch(regs.color_window_mask) { + case WINDOWMASK_OR: + if((w1_mask | w2_mask) == 1)r = false; + else r = true; + break; + case WINDOWMASK_AND: + if((w1_mask & w2_mask) == 1)r = false; + else r = true; + break; + case WINDOWMASK_XOR: + if((w1_mask ^ w2_mask) == 1)r = false; + else r = true; + break; + case WINDOWMASK_XNOR: + if((w1_mask ^ w2_mask) == 0)r = false; + else r = true; + break; + } + } + + if(color_mask == 2) { + r = (r == true)?false:true; + } + + return r; +} diff --git a/src/ppu/ppu.cpp b/src/ppu/ppu.cpp new file mode 100644 index 00000000..c29f8817 --- /dev/null +++ b/src/ppu/ppu.cpp @@ -0,0 +1,11 @@ +#include "../base.h" + +PPU::PPU() { + mmio = &mmio_unmapped; + output = (uint16*)memalloc(512 * 478 * 2, "PPU::output"); + memset(output, 0, 512 * 478 * 2); +} + +PPU::~PPU() { + if(output)memfree(output, "PPU::output"); +} diff --git a/src/ppu/ppu.h b/src/ppu/ppu.h new file mode 100644 index 00000000..d68452b0 --- /dev/null +++ b/src/ppu/ppu.h @@ -0,0 +1,22 @@ +class PPU { +public: +uint16 *output; +MMIO *mmio; + virtual uint8 vram_read (uint16 addr) = 0; + virtual void vram_write (uint16 addr, uint8 value) = 0; + virtual uint8 oam_read (uint16 addr) = 0; + virtual void oam_write (uint16 addr, uint8 value) = 0; + virtual uint8 cgram_read (uint16 addr) = 0; + virtual void cgram_write(uint16 addr, uint8 value) = 0; + + virtual void latch_counters() = 0; + + virtual void run() = 0; + virtual void scanline() = 0; + virtual void frame() = 0; + virtual void power() = 0; + virtual void reset() = 0; + + PPU(); + ~PPU(); +}; diff --git a/src/reader/reader.cpp b/src/reader/reader.cpp new file mode 100644 index 00000000..a6089f7c --- /dev/null +++ b/src/reader/reader.cpp @@ -0,0 +1,66 @@ +#include "../base.h" + +bool FileReader::open(char *fn) { +/* is the filename too short to be a file? */ + if(strlen(fn) < 4)return false; + +int i; + for(i=strlen(fn) - 1;i>=0;i--) { + if(fn[i] == '.')break; + } + if(fn[i] != '.')return false; + +char *filetype = fn + i; +/* make sure we support this file format before loading it */ + if(strcmp(filetype, ".smc"))return false; + + fp = fopen(fn, "rb"); + if(!fp)return false; + + fseek(fp, 0, SEEK_END); + fsize = ftell(fp); + fseek(fp, 0, SEEK_SET); + + if(!strcmp(filetype, ".smc")) { + /* remove header if it exists */ + if((fsize & 0xfff) == 0x200) { + fsize -= 0x200; + fseek(fp, 0x200, SEEK_SET); + } + } + +/* empty file? */ + if(fsize == 0) { + fclose(fp); + return false; + } + + return true; +} + +void FileReader::read(uint8 **buffer, uint32 length) { +uint8 *data; + if(length == 0) { + /* read the entire file into RAM */ + data = (uint8*)memalloc(fsize); + fread(data, 1, fsize, fp); + } else if(length > fsize) { + /* read the entire file into RAM, pad the rest with 0x00s */ + data = (uint8*)memalloc(length); + memset(data, 0, length); + fread(data, 1, fsize, fp); + } else { //fsize >= length + /* read as much of the file as possible, truncate the rest */ + data = (uint8*)memalloc(length); + fread(data, 1, length, fp); + } + *buffer = data; +} + +uint32 FileReader::size() { + return fsize; +} + +void FileReader::close() { + if(fp)fclose(fp); +} diff --git a/src/reader/reader.h b/src/reader/reader.h new file mode 100644 index 00000000..dc5ef039 --- /dev/null +++ b/src/reader/reader.h @@ -0,0 +1,20 @@ +class Reader { +public: + virtual uint32 size() = 0; + virtual void read(uint8 **buffer, uint32 length = 0) = 0; +}; + +class FileReader : public Reader { +private: +FILE *fp; +uint32 fsize; + +public: + uint32 size(); + void read(uint8 **buffer, uint32 length = 0); + bool open(char *fn); + void close(); + + FileReader() { fp = 0; fsize = 0; } + ~FileReader() { if(fp)fclose(fp); } +}; diff --git a/src/snes/snes.cpp b/src/snes/snes.cpp new file mode 100644 index 00000000..e26a8ca3 --- /dev/null +++ b/src/snes/snes.cpp @@ -0,0 +1,50 @@ +#include "../base.h" + +void SNES::run() { + clock->run(); +} + +void SNES::power() { + clock->power(); + cpu->power(); + ppu->power(); + mem_bus->fastROM = false; + +int i; + mem_bus->flush_mmio_mappers(); + for(i=0x2100;i<=0x213f;i++)mem_bus->set_mmio_mapper(i, ppu->mmio); + for(i=0x2140;i<=0x2143;i++)mem_bus->set_mmio_mapper(i, ppu->mmio); + for(i=0x2180;i<=0x2183;i++)mem_bus->set_mmio_mapper(i, cpu->mmio); + mem_bus->set_mmio_mapper(0x21c2, cpu->mmio); + mem_bus->set_mmio_mapper(0x21c3, cpu->mmio); + for(i=0x4200;i<=0x421f;i++)mem_bus->set_mmio_mapper(i, cpu->mmio); + for(i=0x4300;i<=0x437f;i++)mem_bus->set_mmio_mapper(i, cpu->mmio); +} + +void SNES::reset() { + clock->reset(); + cpu->reset(); + ppu->reset(); + mem_bus->fastROM = false; +} + +/*************************** + *** Debugging functions *** + ***************************/ +void SNES::notify(uint32 message, uint32 param1, uint32 param2) {} + +void SNES::debugger_enable() { + is_debugger_enabled = true; +} + +void SNES::debugger_disable() { + is_debugger_enabled = false; +} + +bool SNES::debugger_enabled() { + return is_debugger_enabled; +} + +SNES::SNES() { + is_debugger_enabled = true; +} diff --git a/src/snes/snes.h b/src/snes/snes.h new file mode 100644 index 00000000..022d880f --- /dev/null +++ b/src/snes/snes.h @@ -0,0 +1,43 @@ +class SNES { +protected: +bool is_debugger_enabled; + +public: +//system functions + virtual void run(); + virtual void render_frame() = 0; + virtual void power(); + virtual void reset(); + +//input functions +enum { + DEV_JOYPAD1 = 0, + DEV_JOYPAD2 = 1 +}; +enum { + JOYPAD_B = 0, JOYPAD_Y = 1, + JOYPAD_SELECT = 2, JOYPAD_START = 3, + JOYPAD_UP = 4, JOYPAD_DOWN = 5, + JOYPAD_LEFT = 6, JOYPAD_RIGHT = 7, + JOYPAD_A = 8, JOYPAD_X = 9, + JOYPAD_L = 10, JOYPAD_R = 11 +}; + virtual void poll_input() = 0; + virtual bool get_input_status(uint8 device, uint8 button) = 0; + +//debugging functions +enum { + NO_ACTION = 0, + CPU_EXEC_OPCODE, + MEM_READ, MEM_WRITE, + VRAM_READ, VRAM_WRITE, + OAM_READ, OAM_WRITE, + CGRAM_READ, CGRAM_WRITE, +}; + virtual void notify(uint32 message, uint32 param1 = 0, uint32 param2 = 0); + virtual void debugger_enable(); + virtual void debugger_disable(); + virtual bool debugger_enabled(); + + SNES(); +}; diff --git a/src/win/Makefile b/src/win/Makefile new file mode 100644 index 00000000..09278bbb --- /dev/null +++ b/src/win/Makefile @@ -0,0 +1,70 @@ +CC = cl +CFLAGS = /nologo /O2 /Ob2 +OBJS = winmain.obj \ + clock.obj bclock.obj \ + memory.obj bmemory.obj \ + reader.obj \ + cpu.obj bcpu.obj \ + ppu.obj bppu.obj \ + snes.obj +LIBS = kernel32.lib user32.lib gdi32.lib comdlg32.lib ddraw.lib + +all: $(OBJS) + $(CC) /Febsnes_g2.exe $(CFLAGS) $(OBJS) $(LIBS) + +clean: + del *.obj + +###################### +### win32-specific ### +###################### +winmain.obj: *.cpp *.h + $(CC) $(CFLAGS) /c winmain.cpp + +############# +### clock ### +############# +clock.obj: ../clock/*.cpp ../clock/*.h + $(CC) $(CFLAGS) /c ../clock/clock.cpp + +bclock.obj: ../clock/bclock/* + $(CC) $(CFLAGS) /c ../clock/bclock/bclock.cpp + +############## +### memory ### +############## +memory.obj: ../memory/memory.cpp ../memory/memory.h + $(CC) $(CFLAGS) /c ../memory/memory.cpp + +bmemory.obj: ../memory/bmemory/* + $(CC) $(CFLAGS) /c ../memory/bmemory/bmemory.cpp + +########### +### cpu ### +########### +cpu.obj: ../cpu/*.cpp ../cpu/*.h + $(CC) $(CFLAGS) /c ../cpu/cpu.cpp + +bcpu.obj: ../cpu/bcpu/* + $(CC) $(CFLAGS) /c ../cpu/bcpu/bcpu.cpp + +########### +### ppu ### +########### +ppu.obj: ../ppu/*.cpp ../ppu/*.h + $(CC) $(CFLAGS) /c ../ppu/ppu.cpp + +bppu.obj: ../ppu/bppu/* + $(CC) $(CFLAGS) /c ../ppu/bppu/bppu.cpp + +############## +### reader ### +############## +reader.obj: ../reader/reader.cpp ../reader/reader.h + $(CC) $(CFLAGS) /c ../reader/reader.cpp + +############ +### snes ### +############ +snes.obj: ../snes/*.cpp ../snes/*.h + $(CC) $(CFLAGS) /c ../snes/snes.cpp diff --git a/src/win/bsnes.cpp b/src/win/bsnes.cpp new file mode 100644 index 00000000..40da0a78 --- /dev/null +++ b/src/win/bsnes.cpp @@ -0,0 +1,388 @@ +void bSNES::set_status(uint32 new_status) { +uint8 cpu_op; + run_status = new_status; + + switch(new_status) { + case STOP: + w_console->is_running(false); + w_console->update_status(); + break; + case RUNTOCPUSTEP: + status.cpu_ran = false; + break; + case RUNTOCPUPROCEED: + cpu_op = mem_bus->read(cpu->regs.pc); + /* proceed only skips subroutines (jsr ). 0x20, 0x22, and 0xfc are all three jsr opcodes */ + if(cpu_op == 0x20 || cpu_op == 0x22 || cpu_op == 0xfc) { + w_console->is_running(true); + status.cpu_stop_pos = (cpu->regs.pc.b << 16) | ((cpu->regs.pc + cpu->opcode_length()) & 0xffff); + } else { + status.cpu_ran = false; + run_status = RUNTOCPUSTEP; + } + break; + } +} + +uint32 bSNES::get_status() { + return run_status; +} + +void bSNES::run() { + if(!rom_image->loaded())return; + + switch(run_status) { + case RUN: + while(clock->update_frame() == false) { + clock->run(); + } + render_frame(); + return; + case STOP: + break; + case RUNONCE: + clock->run(); + set_status(STOP); + break; + case RUNTOSIGNAL: + clock->run(); + if(w_bp->hit() == true) { + set_status(STOP); + disassemble_cpu_op(); + } + break; + case RUNTOFRAME: + clock->run(); + if(clock->update_frame() == true) { + render_frame(); + set_status(STOP); + disassemble_cpu_op(); + } else if(w_bp->hit() == true) { + set_status(STOP); + disassemble_cpu_op(); + } + return; + case RUNTOCPUSTEP: + clock->run(); + if(status.cpu_ran == true || w_bp->hit() == true) { + set_status(STOP); + } + break; + case RUNTOCPUPROCEED: + clock->run(); + if(status.cpu_stop_pos == cpu->regs.pc || w_bp->hit() == true) { + set_status(STOP); + disassemble_cpu_op(); + } + break; + case RUNTOCPUTRACE: + clock->run(); + if(status.cpu_trace_pos >= status.cpu_trace_stop) { + set_status(STOP); + disassemble_cpu_op(); + } + break; + } + + if(clock->update_frame() == true) { + render_frame(); + } +} + +void bSNES::render_frame() { + renderer.update(); +} + +/*********************** + *** Input functions *** + ***********************/ +#define KeyState(key) ((GetAsyncKeyState(key) & 0x8000)?1:0) +void bSNES::poll_input() { + joypad1.up = KeyState(VK_UP); + joypad1.down = KeyState(VK_DOWN); + joypad1.left = KeyState(VK_LEFT); + joypad1.right = KeyState(VK_RIGHT); + joypad1.select = KeyState(VK_LSHIFT) | KeyState(VK_RSHIFT); + joypad1.start = KeyState(VK_RETURN); + joypad1.y = KeyState('A'); + joypad1.b = KeyState('Z'); + joypad1.x = KeyState('S'); + joypad1.a = KeyState('X'); + joypad1.l = KeyState('D'); + joypad1.r = KeyState('C'); + +//Check for debugger-based key locks + if(is_debugger_enabled == true) { + if(w_console->joypad_lock.up )joypad1.up = true; + if(w_console->joypad_lock.down )joypad1.down = true; + if(w_console->joypad_lock.left )joypad1.left = true; + if(w_console->joypad_lock.right )joypad1.right = true; + if(w_console->joypad_lock.a )joypad1.a = true; + if(w_console->joypad_lock.b )joypad1.b = true; + if(w_console->joypad_lock.x )joypad1.x = true; + if(w_console->joypad_lock.y )joypad1.y = true; + if(w_console->joypad_lock.l )joypad1.l = true; + if(w_console->joypad_lock.r )joypad1.r = true; + if(w_console->joypad_lock.select)joypad1.select = true; + if(w_console->joypad_lock.start )joypad1.start = true; + } + +//It's impossible to hold both up+down, or left+right down +//at the same time on a directional pad; and besides, allowing +//this to happen causes glitches in many SNES games. + if(joypad1.up) joypad1.down = 0; + if(joypad1.left)joypad1.right = 0; +} + +bool bSNES::get_input_status(uint8 device, uint8 button) { + switch(device) { + case DEV_JOYPAD1: + switch(button) { + case JOYPAD_UP: return joypad1.up; + case JOYPAD_DOWN: return joypad1.down; + case JOYPAD_LEFT: return joypad1.left; + case JOYPAD_RIGHT: return joypad1.right; + case JOYPAD_A: return joypad1.a; + case JOYPAD_B: return joypad1.b; + case JOYPAD_X: return joypad1.x; + case JOYPAD_Y: return joypad1.y; + case JOYPAD_L: return joypad1.l; + case JOYPAD_R: return joypad1.r; + case JOYPAD_SELECT:return joypad1.select; + case JOYPAD_START: return joypad1.start; + } + break; + } + return 0; +} + +bJoypad::bJoypad() { + up = down = left = right = false; + a = b = x = y = false; + l = r = select = start = false; +} + +/*************************** + *** Debugging functions *** + ***************************/ +uint8 bSNES::read(uint8 type, uint32 addr) { +uint32 bank, a; +uint8 r = 0x00; + debug_command = true; + switch(type) { + case DRAM: + addr &= 0xffffff; + bank = (addr >> 16) & 0xff; + a = addr & 0xffff; + if((bank >= 0x00 && bank <= 0x3f) || + (bank >= 0x80 && bank <= 0xbf)) { + /* Don't let the debugger poll MMIO ports */ + if(a >= 0x2000 && a <= 0x5fff) { + r = 0x00; + } else { + r = mem_bus->read(addr); + } + } else { + r = mem_bus->read(addr); + } + break; + case VRAM: + addr &= 0xffff; + r = ppu->vram_read(addr); + break; + case OAM: + addr &= 0x03ff; + r = ppu->oam_read(addr); + break; + case CGRAM: + addr &= 0x01ff; + r = ppu->cgram_read(addr); + break; + } + debug_command = false; + return r; +} + +void bSNES::write(uint8 type, uint32 addr, uint8 value) { + debug_command = true; + switch(type) { + case DRAM: + addr &= 0xffffff; + mem_bus->rom->write_protect(false); + mem_bus->write(addr, value); + mem_bus->rom->write_protect(true); + break; + case VRAM: + addr &= 0xffff; + ppu->vram_write(addr, value); + break; + case OAM: + addr &= 0x03ff; + ppu->oam_write(addr, value); + break; + case CGRAM: + addr &= 0x01ff; + ppu->cgram_write(addr, value); + break; + } + debug_command = false; +} + +void bSNES::notify(uint32 message, uint32 param1, uint32 param2) { + if(is_debugger_enabled == false)return; + + switch(message) { + case CPU_EXEC_OPCODE: + status.cpu_ran = true; + status.cpu_trace_pos++; + w_bp->test(message, cpu->regs.pc.d, 0); + disassemble_cpu_op(); + break; + case MEM_READ: + case VRAM_READ: + case OAM_READ: + case CGRAM_READ: + if(debug_command == false) { + w_bp->test(message, param1, param2); + } + break; + case MEM_WRITE: + case VRAM_WRITE: + case OAM_WRITE: + case CGRAM_WRITE: + if(debug_command == false) { + w_bp->test(message, param1, param2); + } + /* this needs to be called after the breakpoint test, + as it will access read() and clear debug_command */ + w_memory->refresh(message, param1); + break; + } +} + +void bSNES::disassemble_cpu_op() { +char t[512]; +/* don't disassemble opcodes that won't be printed to console/traced to log anyway */ + if(!w_console->can_write(Console::CPU_MESSAGE) && !w_console->tracing_enabled)return; + + cpu->disassemble_opcode(t); + w_console->write(t, Console::CPU_MESSAGE); +} + +bool bSNES::debugger_enabled() { + return is_debugger_enabled; +} + +void bSNES::debugger_enable() { + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_DEBUGGER, MF_CHECKED); + set_status(bSNES::STOP); + + w_console->is_running(false); + w_console->update_status(); + w_console->show(); + + w_bp->refresh(); + w_bp->show(); + + w_memory->edit_mode = MemoryEditor::MODE_DRAM; + w_memory->edit_addr = 0x7e0000; + w_memory->edit_mask = 0xffffff; + SendDlgItemMessage(w_memory->hwnd, MEMORYEDITOR_MODE, CB_SETCURSEL, 0, 0); + w_memory->refresh(); + w_memory->show(); + + debugger_update(); + is_debugger_enabled = true; +} + +void bSNES::debugger_disable() { + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_DEBUGGER, MF_UNCHECKED); + w_console->hide(); + w_bp->hide(); + w_memory->hide(); + is_debugger_enabled = false; + set_status(bSNES::RUN); +} + +void bSNES::debugger_update() { + w_console->update_status(); + w_bp->refresh(); + w_memory->refresh(); + disassemble_cpu_op(); +} + +void bSNES::debugger_activate() { +HWND hwnd; +uint32 i, style; + for(i=0;i<100;i++) { + if(w_console->ctl_disabled[i] == true)continue; + hwnd = GetDlgItem(w_console->hwnd, i + 100); + if(!hwnd)continue; + style = GetWindowLong(hwnd, GWL_STYLE); + style &= ~WS_DISABLED; + SetWindowLong(hwnd, GWL_STYLE, style); + } + InvalidateRect(w_console->hwnd, 0, TRUE); + + for(i=0;i<100;i++) { + if(w_bp->ctl_disabled[i] == true)continue; + hwnd = GetDlgItem(w_bp->hwnd, i + 100); + if(!hwnd)continue; + style = GetWindowLong(hwnd, GWL_STYLE); + style &= ~WS_DISABLED; + SetWindowLong(hwnd, GWL_STYLE, style); + } + InvalidateRect(w_bp->hwnd, 0, TRUE); + + for(i=0;i<100;i++) { + if(w_memory->ctl_disabled[i] == true)continue; + hwnd = GetDlgItem(w_memory->hwnd, i + 100); + if(!hwnd)continue; + style = GetWindowLong(hwnd, GWL_STYLE); + style &= ~WS_DISABLED; + SetWindowLong(hwnd, GWL_STYLE, style); + } + InvalidateRect(w_memory->hwnd, 0, TRUE); +} + +void bSNES::debugger_deactivate() { +HWND hwnd; +uint32 i, style; + for(i=0;i<100;i++) { + hwnd = GetDlgItem(w_console->hwnd, i + 100); + if(!hwnd)continue; + style = GetWindowLong(hwnd, GWL_STYLE); + style |= WS_DISABLED; + SetWindowLong(hwnd, GWL_STYLE, style); + } + w_console->clear(); + InvalidateRect(w_console->hwnd, 0, TRUE); + + for(i=0;i<100;i++) { + hwnd = GetDlgItem(w_bp->hwnd, i + 100); + if(!hwnd)continue; + style = GetWindowLong(hwnd, GWL_STYLE); + style |= WS_DISABLED; + SetWindowLong(hwnd, GWL_STYLE, style); + } + w_bp->clear(); + InvalidateRect(w_bp->hwnd, 0, TRUE); + + + for(i=0;i<100;i++) { + hwnd = GetDlgItem(w_memory->hwnd, i + 100); + if(!hwnd)continue; + style = GetWindowLong(hwnd, GWL_STYLE); + style |= WS_DISABLED; + SetWindowLong(hwnd, GWL_STYLE, style); + } + w_memory->clear(); + InvalidateRect(w_memory->hwnd, 0, TRUE); +} + +bSNES::bSNES() { + run_status = STOP; + debug_command = false; + + debugger_disable(); +} diff --git a/src/win/bsnes.h b/src/win/bsnes.h new file mode 100644 index 00000000..3838a528 --- /dev/null +++ b/src/win/bsnes.h @@ -0,0 +1,65 @@ +class bJoypad { +public: +bool up, down, left, right; +bool a, b, x, y; +bool l, r, select, start; + bJoypad(); +}; + +class bSNES : public SNES { +private: +//When true, notify() ignores read/write requests, as they +//have been generated by the debugging interface and not by +//the emulator. +bool debug_command; +uint32 run_status; + +bJoypad joypad1, joypad2; + +public: +enum { + STOP = 0, + RUN, + RUNONCE, + RUNTOSIGNAL, + RUNTOFRAME, + RUNTOCPUSTEP, + RUNTOCPUPROCEED, + RUNTOCPUTRACE +}; +enum { DRAM = 0, VRAM = 1, OAM = 2, CGRAM = 3 }; + void set_status(uint32 new_status); + uint32 get_status(); + void run(); + void render_frame(); + +//input functions + void poll_input(); + bool get_input_status(uint8 device, uint8 button); + +//debugging functions +struct { + uint32 cpu_stop_pos; + uint32 cpu_trace_pos, cpu_trace_stop; + bool cpu_ran; +}status; + uint8 read (uint8 type, uint32 addr); + void write(uint8 type, uint32 addr, uint8 value); + void notify(uint32 message, uint32 param1 = 0, uint32 param2 = 0); + void disassemble_cpu_op(); + +//whether or not the user requests the debugger open + bool debugger_enabled(); + void debugger_enable(); + void debugger_disable(); + void debugger_update(); + +//whether or not the debugger *can* be used +//e.g., debugger cannot be used without ROM loaded + void debugger_activate(); + void debugger_deactivate(); + + bSNES(); +}; + +bSNES *bsnes; diff --git a/src/win/bsnes_g2.lnk b/src/win/bsnes_g2.lnk new file mode 100644 index 00000000..3dd9544d Binary files /dev/null and b/src/win/bsnes_g2.lnk differ diff --git a/src/win/cc.bat b/src/win/cc.bat new file mode 100644 index 00000000..dbf5d9cb --- /dev/null +++ b/src/win/cc.bat @@ -0,0 +1,3 @@ +@nmake /NOLOGO +@move bsnes_g2.exe ../../bsnes_g2.exe>nul +@pause \ No newline at end of file diff --git a/src/win/clean.bat b/src/win/clean.bat new file mode 100644 index 00000000..e0f3d11c --- /dev/null +++ b/src/win/clean.bat @@ -0,0 +1 @@ +@nmake clean /NOLOGO diff --git a/src/win/lib.cpp b/src/win/lib.cpp new file mode 100644 index 00000000..2c9b27f3 --- /dev/null +++ b/src/win/lib.cpp @@ -0,0 +1,136 @@ +//#define MEMALLOC_DEBUG + +FILE *mem_fp; + +void meminit() { +#ifdef MEMALLOC_DEBUG + mem_fp = fopen("memlog.txt", "wb"); +#endif +} + +void memterm() { +#ifdef MEMALLOC_DEBUG + fclose(mem_fp); +#endif +} + +void *memalloc(uint32 size, char *name, ...) { +#ifdef MEMALLOC_DEBUG +char vname[4096]; +va_list args; + strcpy(vname, ""); + if(name) { + va_start(args, name); + vsprintf(vname, name, args); + va_end(args); + } + fprintf(mem_fp, "memalloc : %10d bytes", size); + if(*vname)fprintf(mem_fp, ", name = \"%s\"", vname); + fprintf(mem_fp, "\r\n"); +#endif + return (void*)malloc(size); +} + +void memfree(void *mem, char *name, ...) { +#ifdef MEMALLOC_DEBUG +char vname[4096]; +va_list args; + strcpy(vname, ""); + if(name) { + va_start(args, name); + vsprintf(vname, name, args); + va_end(args); + } + fprintf(mem_fp, "memfree :"); + if(*vname)fprintf(mem_fp, " name = \"%s\"", vname); + fprintf(mem_fp, "\r\n"); +#endif + free(mem); +} + +void alert(char *s, ...) { +char str[4096]; +va_list args; + va_start(args, s); + vsprintf(str, s, args); + va_end(args); + MessageBox(0, str, "bsnes", MB_OK); +} + +void dprintf(char *s, ...) { +char str[4096]; +va_list args; + va_start(args, s); + vsprintf(str, s, args); + va_end(args); + if(w_console) { + w_console->write(str, Console::DEBUG_MESSAGE); + } +} + +uint32 strhex(char *str) { +uint32 r = 0, m = 0; +int i, ssl = strlen(str); +uint8 x; + for(i=0;i= '0' && str[i] <= '9'); + else if(str[i] >= 'A' && str[i] <= 'F'); + else if(str[i] >= 'a' && str[i] <= 'f'); + else break; + } + for(--i;i>=0;i--, m+=4) { + x = str[i]; + if(x >= '0' && x <= '9')x -= '0'; + else if(x >= 'A' && x <= 'F')x -= 'A' - 0x0a; + else if(x >= 'a' && x <= 'f')x -= 'a' - 0x0a; + else return r; + r |= x << m; + } + return r; +} + +uint32 strdec(char *str) { +uint32 m = 1; +int i, r = 0, ssl = strlen(str); +uint8 x; + for(i=0;i= '0' && str[i] <= '9'); + else break; + } + for(--i;i>=0;i--, m*=10) { + x = str[i]; + if(x >= '0' && x <= '9')x -= '0'; + else return r; + r += x * m; + } + return r; +} + +uint32 load_file(char *fn, uint8 **buffer) { +FILE *fp; +uint8 *data; +int fsize; + fp = fopen(fn, "rb"); + if(!fp)return 0; + fseek(fp, 0, SEEK_END); + fsize = ftell(fp); + if(!fsize) { + fclose(fp); + return 0; + } + fseek(fp, 0, SEEK_SET); + data = (uint8*)memalloc(fsize); + fread(data, 1, fsize, fp); + fclose(fp); + *buffer = data; + return fsize; +} + +bool save_file(char *fn, uint8 *data, uint32 size) { +FILE *fp; + fp = fopen(fn, "wb"); + if(!fp)return false; + fwrite(data, 1, size, fp); + fclose(fp); + return true; +} diff --git a/src/win/rom.cpp b/src/win/rom.cpp new file mode 100644 index 00000000..7a00dc43 --- /dev/null +++ b/src/win/rom.cpp @@ -0,0 +1,96 @@ +class ROMImage { +private: +char rom_fn[4096]; +char sram_fn[4096]; +bool file_loaded; + +public: + bool loaded(); + bool load(); + void unload(); + void select(char *fn); + ROMImage(); + ~ROMImage(); +}; + +bool ROMImage::loaded() { + return file_loaded; +} + +bool ROMImage::load() { + if(file_loaded == true)return false; + + dprintf("* Loading [%s]...", rom_fn); + +Reader *rf = new FileReader(); +FileReader *f_rf = static_cast(rf); + if(!f_rf->open(rom_fn)) { + alert("Error loading image file [%s]!", rom_fn); + return false; + } + mem_bus->rom->load_rom(rf); + f_rf->close(); + delete rf; + +uint8 *sram_data; +uint32 sram_size; + sram_size = load_file(sram_fn, &sram_data); + if(sram_size) { + mem_bus->rom->load_sram(sram_data, sram_size); + memfree(sram_data); + } + + file_loaded = true; + bsnes->debugger_activate(); + return true; +} + +void ROMImage::unload() { + if(file_loaded == false)return; + +uint8 *sram_data; +uint32 sram_size; + sram_size = mem_bus->rom->save_sram(&sram_data); + if(sram_size) { + save_file(sram_fn, sram_data, sram_size); + memfree(sram_data); + } + file_loaded = false; + bsnes->debugger_deactivate(); + + mem_bus->rom->unload(); +} + +void ROMImage::select(char *fn) { + if(file_loaded == true)return; + +/* Remove quotes */ + if(fn[0] == '\"') { + strcpy(rom_fn, fn + 1); + rom_fn[strlen(rom_fn) - 1] = 0; + } else { + strcpy(rom_fn, fn); + } + + for(int i=strlen(rom_fn)-1;i>=0;i--) { + if(rom_fn[i] == '.')break; + } + + strcpy(sram_fn, rom_fn); + if(rom_fn[i] == '.')sram_fn[i] = 0; + strcat(sram_fn, ".srm"); +} + +ROMImage::ROMImage() { + *rom_fn = 0; + *sram_fn = 0; + file_loaded = false; +} + +ROMImage::~ROMImage() { + if(file_loaded == true) { + unload(); + } +} + +ROMImage *rom_image; diff --git a/src/win/ui.cpp b/src/win/ui.cpp new file mode 100644 index 00000000..68c587c4 --- /dev/null +++ b/src/win/ui.cpp @@ -0,0 +1,45 @@ +HFONT hFont, hMonofont; + +#include "ui_window.cpp" +#include "ui_render.cpp" +#include "ui_main.cpp" +#include "ui_console.cpp" +#include "ui_bp.cpp" +#include "ui_memory.cpp" + +void CreateFonts() { +HDC hdc; +long height; + hdc = GetDC(0); + height = -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72); + ReleaseDC(0, hdc); + hFont = CreateFont(height, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Tahoma"); + + hdc = GetDC(0); + height = -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72); + ReleaseDC(0, hdc); + hMonofont = CreateFont(height, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Courier New"); +} + +void CreateWindows() { + CreateWindowMain(); + CreateWindowConsole(); + CreateWindowBreakpoint(); + CreateWindowMemory(); +} + +void init_ui0() { + w_main = new MainWindow(); + w_console = new Console(); + w_bp = new BreakpointEditor(); + w_memory = new MemoryEditor(); +} + +void init_ui1() { + CreateFonts(); + CreateWindows(); + SetFocus(w_main->hwnd); + renderer.set_window(w_main->hwnd); + renderer.to_windowed(); + bsnes->debugger_deactivate(); +} diff --git a/src/win/ui.h b/src/win/ui.h new file mode 100644 index 00000000..e5384512 --- /dev/null +++ b/src/win/ui.h @@ -0,0 +1,251 @@ +enum { + VIDEOMODE_256x224w = 0, + VIDEOMODE_512x448w, + VIDEOMODE_960x720w +}; + +enum { + MENU_FILE_LOAD = 100, + MENU_FILE_UNLOAD, + MENU_FILE_RESET, + MENU_FILE_POWER, + MENU_FILE_EXIT, + MENU_SETTINGS_FRAMESKIP_OFF, + MENU_SETTINGS_FRAMESKIP_1, + MENU_SETTINGS_FRAMESKIP_2, + MENU_SETTINGS_FRAMESKIP_3, + MENU_SETTINGS_FRAMESKIP_4, + MENU_SETTINGS_FRAMESKIP_5, + MENU_SETTINGS_FRAMESKIP_6, + MENU_SETTINGS_FRAMESKIP_7, + MENU_SETTINGS_FRAMESKIP_8, + MENU_SETTINGS_FRAMESKIP_9, + MENU_SETTINGS_VIDEOMODE_256x224w, + MENU_SETTINGS_VIDEOMODE_512x448w, + MENU_SETTINGS_VIDEOMODE_960x720w, + MENU_SETTINGS_DEBUGGER +}; + +enum { + CONSOLE_OUTPUT = 100, + CONSOLE_STATUS, + + CONSOLE_CPUGROUP, + CONSOLE_CPUSTEP, + CONSOLE_CPUPROCEED, + CONSOLE_CPUSKIP, + CONSOLE_CPUTRACENUM, + CONSOLE_CPUTRACE, + CONSOLE_CPUDISABLE, + + CONSOLE_APUGROUP, + CONSOLE_APUSTEP, + CONSOLE_APUPROCEED, + CONSOLE_APUSKIP, + CONSOLE_APUTRACENUM, + CONSOLE_APUTRACE, + CONSOLE_APUDISABLE, + + CONSOLE_SYSGROUP, + CONSOLE_SYSRUN, + CONSOLE_SYSRUNTOFRAME, + CONSOLE_SYSRUNTONMI, + + CONSOLE_CFGGROUP, + CONSOLE_CFGOUTPUTCPU, + CONSOLE_CFGOUTPUTAPU, + CONSOLE_CFGOUTPUTDBG, + CONSOLE_CFGTRACE, + CONSOLE_CFGREGTYPE, + CONSOLE_CFGREGNUM, + CONSOLE_CFGREGVAL, + CONSOLE_CFGREGSET, + CONSOLE_CFGLOCK, + CONSOLE_CFGLOCKUP, + CONSOLE_CFGLOCKDOWN, + CONSOLE_CFGLOCKLEFT, + CONSOLE_CFGLOCKRIGHT, + CONSOLE_CFGLOCKA, + CONSOLE_CFGLOCKB, + CONSOLE_CFGLOCKX, + CONSOLE_CFGLOCKY, + CONSOLE_CFGLOCKL, + CONSOLE_CFGLOCKR, + CONSOLE_CFGLOCKSELECT, + CONSOLE_CFGLOCKSTART +}; + +enum { + BREAKPOINT_LIST = 100, + BREAKPOINT_STATIC1, + BREAKPOINT_NUM, + BREAKPOINT_OFFSET, + BREAKPOINT_R, + BREAKPOINT_W, + BREAKPOINT_X, + BREAKPOINT_V, + BREAKPOINT_STATIC2, + BREAKPOINT_VALUE, + BREAKPOINT_SOURCE, + BREAKPOINT_SET, + BREAKPOINT_CLEAR, + BREAKPOINT_ENABLE, + BREAKPOINT_CLEARALL, + BREAKPOINT_EXPORT, + BREAKPOINT_IMPORT +}; + +enum { + MEMORYEDITOR_VIEW = 100, + + MEMORYEDITOR_MODE, + MEMORYEDITOR_GOTOADDR, + MEMORYEDITOR_GOTO, + + MEMORYEDITOR_STATIC1, + MEMORYEDITOR_OFFSET, + MEMORYEDITOR_VALUE, + MEMORYEDITOR_EDIT, + + MEMORYEDITOR_FSOURCE, + MEMORYEDITOR_FEXPORT, + + MEMORYEDITOR_UP40, + MEMORYEDITOR_DOWN40, + MEMORYEDITOR_UP400, + MEMORYEDITOR_DOWN400, + MEMORYEDITOR_UP4000, + MEMORYEDITOR_DOWN4000, + MEMORYEDITOR_UP40000, + MEMORYEDITOR_DOWN40000 +}; + +class Window { +public: +HWND hwnd; +HMENU hmenu; +bool visible, menu_visible; + void resize(int width, int height); + void to_left(HWND _hwnd = 0); + void to_center(); + void to_right(); + void to_top(); + void to_middle(); + void to_bottom(HWND _hwnd = 0); + void hide(); + void show(); + void show_menu(); + void hide_menu(); + Window(); +}; + +class MainWindow : public Window { +public: +uint8 video_mode, frameskip; + void set_frameskip(uint8 fs); + void set_video_mode(uint8 mode); + void menu_load(); + void menu_unload(); + + MainWindow(); +}; + +MainWindow *w_main; + +#define CONSOLE_LINES 256 +class Console : public Window { +private: +bool _is_running; //used to swap "Run"/"Stop" text on console window +public: +bool ctl_disabled[100]; + +enum { DEBUG_MESSAGE = 0, CPU_MESSAGE, APU_MESSAGE }; +enum { REGTYPE_CPU = 0, REGTYPE_APU }; +char output_line[CONSOLE_LINES][512]; +char output_data[CONSOLE_LINES * 512]; +FILE *log_fp; +bool tracing_enabled; + +struct { + bool up, down, left, right; + bool a, b, x, y; + bool l, r, select, start; +}joypad_lock; + + void clear(); + void create_controls(); + void update_status(); + void set_reg_list_type(uint8 list_type); + bool can_write(uint32 message_type); + void write(char *s, uint32 message_type = DEBUG_MESSAGE); + void is_running(bool n); //API access to _is_running + + Console(); +}; + +Console *w_console; + +class BreakpointEditor : public Window { +public: +bool ctl_disabled[100]; + +enum { DRAM = 0, VRAM = 1, OAM = 2, CGRAM = 3 }; +enum { FLAG_NONE = 0, FLAG_R = 1, FLAG_W = 2, FLAG_X = 4, FLAG_V = 8 }; +struct { + uint32 addr; + uint8 value; + uint8 source; + uint8 flags; + uint32 hit_count; + bool set; +}bp[16]; +bool bp_enabled, bp_hit; + void clear(); + void create_controls(); + bool hit(); + void test(uint32 message, uint32 addr, uint32 value); + void refresh(); + + BreakpointEditor(); +}; + +BreakpointEditor *w_bp; + +class MemoryEditor : public Window { +public: +bool ctl_disabled[100]; + +enum { MODE_DRAM = 0, MODE_ROM, MODE_SRAM, MODE_VRAM, MODE_OAM, MODE_CGRAM }; +uint32 edit_mode, edit_addr, edit_mask; + void clear(); + void create_controls(); + uint8 read_byte(uint32 addr); + void refresh(uint32 type = 0, uint32 addr = 0); + void export(uint32 type); +}; + +MemoryEditor *w_memory; + +#include +class render { +public: +LPDIRECTDRAW lpdd; +LPDIRECTDRAWSURFACE lpdds, lpddsb; +LPDIRECTDRAWCLIPPER lpddc; +DDSURFACEDESC ddsd; +DDSCAPS ddscaps; +HWND hwnd; +uint8 color_depth; + void set_window(HWND hwnd_handle); + void to_windowed(); + void to_fullscreen(); + void redraw(); + void update16(); + void update32(); + void update(); + void destroy(); + void update_color_lookup_table(); + render(); +}; + +render renderer; diff --git a/src/win/ui_bp.cpp b/src/win/ui_bp.cpp new file mode 100644 index 00000000..0a367035 --- /dev/null +++ b/src/win/ui_bp.cpp @@ -0,0 +1,307 @@ +bool BreakpointEditor::hit() { + if(visible == false)return false; + + if(bp_hit == true) { + bp_hit = false; + return true; + } + return false; +} + +void BreakpointEditor::test(uint32 message, uint32 addr, uint32 value) { +int i; + if(visible == false)return; + if(bp_enabled == false)return; + + for(i=0;i<16;i++) { + if(bp[i].set == false)continue; + + switch(message) { + case SNES::CPU_EXEC_OPCODE: + if(!(bp[i].flags & FLAG_X))continue; + if(bp[i].source != DRAM)continue; + if(bp[i].addr != addr)continue; + dprintf("* Breakpoint %d hit (exec)", i); + bp[i].hit_count++; + bp_hit = true; + w_bp->refresh(); + break; + case SNES::MEM_READ: + case SNES::VRAM_READ: + case SNES::OAM_READ: + case SNES::CGRAM_READ: + if(!(bp[i].flags & FLAG_R))continue; + if(bp[i].addr != addr)continue; + if(message == SNES::MEM_READ && bp[i].source == DRAM); + else if(message == SNES::VRAM_READ && bp[i].source == VRAM); + else if(message == SNES::OAM_READ && bp[i].source == OAM); + else if(message == SNES::CGRAM_READ && bp[i].source == CGRAM); + else continue; + if(bp[i].flags & FLAG_V) { + if(bp[i].value != value)continue; + } + dprintf("* Breakpoint %d hit (read)", i); + bp[i].hit_count++; + bp_hit = true; + w_bp->refresh(); + break; + case SNES::MEM_WRITE: + case SNES::VRAM_WRITE: + case SNES::OAM_WRITE: + case SNES::CGRAM_WRITE: + if(!(bp[i].flags & FLAG_W))continue; + if(bp[i].addr != addr)continue; + if(message == SNES::MEM_WRITE && bp[i].source == DRAM); + else if(message == SNES::VRAM_WRITE && bp[i].source == VRAM); + else if(message == SNES::OAM_WRITE && bp[i].source == OAM); + else if(message == SNES::CGRAM_WRITE && bp[i].source == CGRAM); + else continue; + if(bp[i].flags & FLAG_V) { + if(bp[i].value != value)continue; + } + dprintf("* Breakpoint %d hit (write)", i); + bp[i].hit_count++; + bp_hit = true; + w_bp->refresh(); + break; + } + } +} + +long __stdcall wndproc_bp(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { +char t[256]; +uint32 n, addr; + switch(msg) { + case WM_COMMAND: + switch(LOWORD(wparam)) { + case BREAKPOINT_SET: + n = SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_GETCURSEL, 0, 0) & 15; + GetDlgItemText(hwnd, BREAKPOINT_OFFSET, t, 255); + w_bp->bp[n].addr = strhex(t) & 0xffffff; + GetDlgItemText(hwnd, BREAKPOINT_VALUE, t, 255); + w_bp->bp[n].value = strhex(t) & 0xff; + w_bp->bp[n].source = SendDlgItemMessage(hwnd, BREAKPOINT_SOURCE, CB_GETCURSEL, 0, 0); + w_bp->bp[n].flags = BreakpointEditor::FLAG_NONE; + if(SendDlgItemMessage(hwnd, BREAKPOINT_R, BM_GETCHECK, 0, 0)) { + w_bp->bp[n].flags |= BreakpointEditor::FLAG_R; + } + if(SendDlgItemMessage(hwnd, BREAKPOINT_W, BM_GETCHECK, 0, 0)) { + w_bp->bp[n].flags |= BreakpointEditor::FLAG_W; + } + if(SendDlgItemMessage(hwnd, BREAKPOINT_X, BM_GETCHECK, 0, 0)) { + w_bp->bp[n].flags |= BreakpointEditor::FLAG_X; + } + if(SendDlgItemMessage(hwnd, BREAKPOINT_V, BM_GETCHECK, 0, 0)) { + w_bp->bp[n].flags |= BreakpointEditor::FLAG_V; + } + w_bp->bp[n].hit_count = 0; + w_bp->bp[n].set = (w_bp->bp[n].flags != BreakpointEditor::FLAG_NONE)?true:false; + w_bp->refresh(); + break; + case BREAKPOINT_CLEAR: + n = SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_GETCURSEL, 0, 0) & 15; + w_bp->bp[n].set = false; + w_bp->refresh(); + break; + case BREAKPOINT_ENABLE: + if(w_bp->bp_enabled == false) { + w_bp->bp_enabled = true; + SendDlgItemMessage(hwnd, BREAKPOINT_ENABLE, BM_SETCHECK, (WPARAM)true, 0); + } else { + w_bp->bp_enabled = false; + SendDlgItemMessage(hwnd, BREAKPOINT_ENABLE, BM_SETCHECK, (WPARAM)false, 0); + } + break; + case BREAKPOINT_CLEARALL: + for(n=0;n<16;n++) { + w_bp->bp[n].set = false; + } + w_bp->refresh(); + break; + } + break; +/* Usually, bsnes will catch the close request here, and replace it + with a hide command instead. */ + case WM_CLOSE: + w_bp->hide(); + return 0; +/* Just in case something sends a DestroyWindow command to bsnes... */ + case WM_DESTROY: + alert("Error: bsnes debugging breakpoint editor window has been destroyed!\n" + "The emulator will still run, but it must be restarted before\n" + "the debugger will function again."); + bsnes->debugger_disable(); + return 0; + } + return DefWindowProc(hwnd, msg, wparam, lparam); +} + +void CreateWindowBreakpoint() { +WNDCLASS wc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hbrBackground = (HBRUSH)COLOR_WINDOW; + wc.hCursor = LoadCursor(0, IDC_ARROW); + wc.hIcon = LoadIcon(0, IDI_APPLICATION); + wc.hInstance = GetModuleHandle(0); + wc.lpfnWndProc = wndproc_bp; + wc.lpszClassName = "bsnes_breakpoint"; + wc.lpszMenuName = 0; + wc.style = CS_HREDRAW | CS_VREDRAW; + RegisterClass(&wc); + + w_bp->hwnd = CreateWindow("bsnes_breakpoint", "bsnes breakpoint editor", + WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, + 0, 0, 395, 245, + 0, 0, GetModuleHandle(0), 0); + + w_bp->resize(395, 245); + w_bp->to_left(); + w_bp->to_bottom(w_console->hwnd); + + w_bp->create_controls(); +} + +void BreakpointEditor::clear() { + SetDlgItemText(hwnd, BREAKPOINT_LIST, ""); +} + +void BreakpointEditor::refresh() { +char s[256 * 16], t[256], source[256], v[16]; + if(rom_image->loaded() == false)return; + if(visible == false)return; + + strcpy(s, ""); + for(int i=0;i<16;i++) { + if(bp[i].set == true) { + switch(bp[i].source) { + case DRAM: strcpy(source, "DRAM ");break; + case VRAM: strcpy(source, "VRAM ");break; + case OAM: strcpy(source, "OAM ");break; + case CGRAM:strcpy(source, "CGRAM ");break; + default: strcpy(source, "??????");break; + } + if(bp[i].flags & FLAG_V)sprintf(v, "%0.2x", bp[i].value); + else strcpy(v, "--"); + sprintf(t, "%0.2d: %0.6x %c%c%c%c %s %s %10d", + i, bp[i].addr, + (bp[i].flags & FLAG_R)?'R':'r', (bp[i].flags & FLAG_W)?'W':'w', + (bp[i].flags & FLAG_X)?'X':'x', (bp[i].flags & FLAG_V)?'V':'v', + v, source, bp[i].hit_count); + } else { + sprintf(t, "%0.2d: ------ ---- -- ------ (disabled)", i); + } + strcat(s, t); + if(i != 15)strcat(s, "\r\n"); + } + SetDlgItemText(hwnd, BREAKPOINT_LIST, s); +} + +void BreakpointEditor::create_controls() { + CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_READONLY, + 5, 5, 260, 235, hwnd, (HMENU)BREAKPOINT_LIST, GetModuleHandle(0), 0); + + CreateWindow("STATIC", "Breakpoint: Offset:", WS_CHILD | WS_VISIBLE, + 270, 5, 120, 15, hwnd, (HMENU)BREAKPOINT_STATIC1, GetModuleHandle(0), 0); + + CreateWindow("COMBOBOX", "", WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_HASSTRINGS, + 270, 20, 60, 300, hwnd, (HMENU)BREAKPOINT_NUM, GetModuleHandle(0), 0); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_ADDSTRING, 0, (LPARAM)"00"); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_ADDSTRING, 0, (LPARAM)"01"); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_ADDSTRING, 0, (LPARAM)"02"); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_ADDSTRING, 0, (LPARAM)"03"); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_ADDSTRING, 0, (LPARAM)"04"); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_ADDSTRING, 0, (LPARAM)"05"); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_ADDSTRING, 0, (LPARAM)"06"); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_ADDSTRING, 0, (LPARAM)"07"); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_ADDSTRING, 0, (LPARAM)"08"); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_ADDSTRING, 0, (LPARAM)"09"); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_ADDSTRING, 0, (LPARAM)"10"); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_ADDSTRING, 0, (LPARAM)"11"); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_ADDSTRING, 0, (LPARAM)"12"); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_ADDSTRING, 0, (LPARAM)"13"); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_ADDSTRING, 0, (LPARAM)"14"); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_ADDSTRING, 0, (LPARAM)"15"); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, CB_SETCURSEL, 0, 0); + + CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "000000", WS_CHILD | WS_VISIBLE, + 330, 20, 60, 22, hwnd, (HMENU)BREAKPOINT_OFFSET, GetModuleHandle(0), 0); + + CreateWindow("BUTTON", "R", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, + 270, 45, 30, 15, hwnd, (HMENU)BREAKPOINT_R, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "W", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, + 300, 45, 30, 15, hwnd, (HMENU)BREAKPOINT_W, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "X", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, + 330, 45, 30, 15, hwnd, (HMENU)BREAKPOINT_X, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "V", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, + 360, 45, 30, 15, hwnd, (HMENU)BREAKPOINT_V, GetModuleHandle(0), 0); + + CreateWindow("STATIC", "Value: Source:", WS_CHILD | WS_VISIBLE, + 270, 60, 120, 15, hwnd, (HMENU)BREAKPOINT_STATIC2, GetModuleHandle(0), 0); + CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "00", WS_CHILD | WS_VISIBLE, + 270, 75, 35, 21, hwnd, (HMENU)BREAKPOINT_VALUE, GetModuleHandle(0), 0); + CreateWindow("COMBOBOX", "", WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_HASSTRINGS, + 305, 75, 85, 200, hwnd, (HMENU)BREAKPOINT_SOURCE, GetModuleHandle(0), 0); + SendDlgItemMessage(hwnd, BREAKPOINT_SOURCE, CB_ADDSTRING, 0, (LPARAM)"DRAM"); + SendDlgItemMessage(hwnd, BREAKPOINT_SOURCE, CB_ADDSTRING, 0, (LPARAM)"VRAM"); + SendDlgItemMessage(hwnd, BREAKPOINT_SOURCE, CB_ADDSTRING, 0, (LPARAM)"OAM"); + SendDlgItemMessage(hwnd, BREAKPOINT_SOURCE, CB_ADDSTRING, 0, (LPARAM)"CGRAM"); + SendDlgItemMessage(hwnd, BREAKPOINT_SOURCE, CB_SETCURSEL, 0, 0); + + CreateWindow("BUTTON", "Set BP", WS_CHILD | WS_VISIBLE, + 270, 100, 60, 20, hwnd, (HMENU)BREAKPOINT_SET, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Clear BP", WS_CHILD | WS_VISIBLE, + 330, 100, 60, 20, hwnd, (HMENU)BREAKPOINT_CLEAR, GetModuleHandle(0), 0); + + CreateWindow("BUTTON", "Enable Breakpoints", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, + 270, 160, 120, 15, hwnd, (HMENU)BREAKPOINT_ENABLE, GetModuleHandle(0), 0); + SendDlgItemMessage(hwnd, BREAKPOINT_ENABLE, BM_SETCHECK, (WPARAM)true, 0); + CreateWindow("BUTTON", "Clear All Breakpoints", WS_CHILD | WS_VISIBLE, + 270, 180, 120, 20, hwnd, (HMENU)BREAKPOINT_CLEARALL, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Import...", WS_CHILD | WS_VISIBLE | WS_DISABLED, + 270, 200, 120, 20, hwnd, (HMENU)BREAKPOINT_IMPORT, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Export...", WS_CHILD | WS_VISIBLE | WS_DISABLED, + 270, 220, 120, 20, hwnd, (HMENU)BREAKPOINT_EXPORT, GetModuleHandle(0), 0); + + SendDlgItemMessage(hwnd, BREAKPOINT_LIST, WM_SETFONT, (WPARAM)hMonofont, TRUE); + SendDlgItemMessage(hwnd, BREAKPOINT_STATIC1, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, BREAKPOINT_NUM, WM_SETFONT, (WPARAM)hMonofont, TRUE); + SendDlgItemMessage(hwnd, BREAKPOINT_OFFSET, WM_SETFONT, (WPARAM)hMonofont, TRUE); + SendDlgItemMessage(hwnd, BREAKPOINT_R, WM_SETFONT, (WPARAM)hMonofont, TRUE); + SendDlgItemMessage(hwnd, BREAKPOINT_W, WM_SETFONT, (WPARAM)hMonofont, TRUE); + SendDlgItemMessage(hwnd, BREAKPOINT_X, WM_SETFONT, (WPARAM)hMonofont, TRUE); + SendDlgItemMessage(hwnd, BREAKPOINT_V, WM_SETFONT, (WPARAM)hMonofont, TRUE); + SendDlgItemMessage(hwnd, BREAKPOINT_STATIC2, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, BREAKPOINT_VALUE, WM_SETFONT, (WPARAM)hMonofont, TRUE); + SendDlgItemMessage(hwnd, BREAKPOINT_SOURCE, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, BREAKPOINT_SET, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, BREAKPOINT_CLEAR, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, BREAKPOINT_ENABLE, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, BREAKPOINT_CLEARALL, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, BREAKPOINT_EXPORT, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, BREAKPOINT_IMPORT, WM_SETFONT, (WPARAM)hFont, TRUE); + +HWND h; +uint32 style; + for(int i=0;i<100;i++) { + ctl_disabled[i] = false; + h = GetDlgItem(hwnd, i + 100); + if(!h)continue; + style = GetWindowLong(h, GWL_STYLE); + if(style & WS_DISABLED)ctl_disabled[i] = true; + } +} + +BreakpointEditor::BreakpointEditor() { +int i; + for(i=0;i<16;i++) { + bp[i].addr = 0x000000; + bp[i].value = 0x00; + bp[i].source = DRAM; + bp[i].flags = FLAG_NONE; + bp[i].hit_count = 0; + bp[i].set = false; + } + bp_enabled = true; + bp_hit = false; +} diff --git a/src/win/ui_console.cpp b/src/win/ui_console.cpp new file mode 100644 index 00000000..b5afdc19 --- /dev/null +++ b/src/win/ui_console.cpp @@ -0,0 +1,405 @@ +#define __console_joypad_lock(n, l) \ + if(w_console->joypad_lock.##n## == true) { \ + w_console->joypad_lock.##n## = false; \ + SendDlgItemMessage(hwnd, CONSOLE_CFGLOCK##l##, BM_SETCHECK, (WPARAM)false, 0); \ + } else { \ + w_console->joypad_lock.##n## = true; \ + SendDlgItemMessage(hwnd, CONSOLE_CFGLOCK##l##, BM_SETCHECK, (WPARAM)true, 0); \ + } + +long __stdcall wndproc_console(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { +char t[256]; +int i, pos; +uint32 addr, len, value; + switch(msg) { + case WM_COMMAND: + switch(LOWORD(wparam)) { + case CONSOLE_CPUSTEP: + if(bsnes->get_status() == bSNES::STOP) { + bsnes->set_status(bSNES::RUNTOCPUSTEP); + } + break; + case CONSOLE_CPUPROCEED: + if(bsnes->get_status() == bSNES::STOP) { + bsnes->set_status(bSNES::RUNTOCPUPROCEED); + } + break; + case CONSOLE_CPUSKIP: + if(bsnes->get_status() == bSNES::STOP) { + cpu->regs.pc.w += cpu->opcode_length(); + bsnes->disassemble_cpu_op(); + } + break; + case CONSOLE_CPUTRACE: + if(bsnes->get_status() == bSNES::STOP) { + bsnes->status.cpu_trace_pos = 0; + GetDlgItemText(hwnd, CONSOLE_CPUTRACENUM, t, 255); + if(!strcmp(t, "") || strdec(t) == 0)break; + bsnes->status.cpu_trace_stop = strdec(t) & 0xffffff; + bsnes->set_status(bSNES::RUNTOCPUTRACE); + } + break; + case CONSOLE_CPUDISABLE: + if(bsnes->get_status() == bSNES::STOP) { + addr = cpu->regs.pc.d; + len = cpu->opcode_length(); + for(i=0;iwrite(bSNES::DRAM, (addr & 0xff0000) | ((addr + i) & 0xffff), 0xea); + } + cpu->regs.pc.w += len; + bsnes->disassemble_cpu_op(); + } + break; + case CONSOLE_SYSRUN: + if(bsnes->get_status() == bSNES::STOP) { + w_console->is_running(true); + bsnes->set_status(bSNES::RUNTOSIGNAL); + } else { + w_console->is_running(false); + bsnes->set_status(bSNES::STOP); + bsnes->disassemble_cpu_op(); + } + break; + case CONSOLE_SYSRUNTOFRAME: + if(bsnes->get_status() == bSNES::STOP) { + bsnes->set_status(bSNES::RUNTOFRAME); + } + break; + case CONSOLE_CFGTRACE: + if(w_console->tracing_enabled == false) { + w_console->tracing_enabled = true; + w_console->log_fp = fopen("trace.log", "wb"); + bsnes->disassemble_cpu_op(); + SendDlgItemMessage(hwnd, CONSOLE_CFGTRACE, BM_SETCHECK, (WPARAM)true, 0); + } else { + w_console->tracing_enabled = false; + fclose(w_console->log_fp); + SendDlgItemMessage(hwnd, CONSOLE_CFGTRACE, BM_SETCHECK, (WPARAM)false, 0); + } + break; + case CONSOLE_CFGREGSET: + GetDlgItemText(hwnd, CONSOLE_CFGREGVAL, t, 255); + value = strhex(t); + pos = SendDlgItemMessage(hwnd, CONSOLE_CFGREGTYPE, CB_GETCURSEL, 0, 0); + if(pos == 0) { //Set CPU register + pos = SendDlgItemMessage(hwnd, CONSOLE_CFGREGNUM, CB_GETCURSEL, 0, 0); + switch(pos) { + case 0:cpu->regs.a.w = value;break; + case 1:cpu->regs.x.w = value;break; + case 2:cpu->regs.y.w = value;break; + case 3:cpu->regs.s.w = value;break; + case 4:cpu->regs.d.w = value;break; + case 5:cpu->regs.db = value;break; + case 6:cpu->regs.p = value;break; + case 7:cpu->regs.e = value;break; + case 8:cpu->regs.pc.d = value;break; + } + /* these bits can *never* be clear in emulation mode */ + if(cpu->regs.e)cpu->regs.p |= 0x30; + /* disassemble current opcode again to reflect new register values */ + bsnes->disassemble_cpu_op(); + } else { //Set APU register + } + break; + case CONSOLE_CFGLOCKUP: __console_joypad_lock(up, UP); break; + case CONSOLE_CFGLOCKDOWN: __console_joypad_lock(down, DOWN); break; + case CONSOLE_CFGLOCKLEFT: __console_joypad_lock(left, LEFT); break; + case CONSOLE_CFGLOCKRIGHT: __console_joypad_lock(right, RIGHT); break; + case CONSOLE_CFGLOCKA: __console_joypad_lock(a, A); break; + case CONSOLE_CFGLOCKB: __console_joypad_lock(b, B); break; + case CONSOLE_CFGLOCKX: __console_joypad_lock(x, X); break; + case CONSOLE_CFGLOCKY: __console_joypad_lock(y, Y); break; + case CONSOLE_CFGLOCKL: __console_joypad_lock(l, L); break; + case CONSOLE_CFGLOCKR: __console_joypad_lock(r, R); break; + case CONSOLE_CFGLOCKSELECT:__console_joypad_lock(select, SELECT);break; + case CONSOLE_CFGLOCKSTART: __console_joypad_lock(start, START); break; + } + break; +/* Usually, bsnes will catch the close request here, and replace it + with a hide command instead. */ + case WM_CLOSE: + bsnes->debugger_disable(); + return 0; +/* Just in case something sends a DestroyWindow command to bsnes... */ + case WM_DESTROY: + alert("Error: bsnes debugging console window has been destroyed!\n" + "The emulator will still run, but it must be restarted before\n" + "the debugger will function again."); + bsnes->debugger_disable(); + return 0; + } + + return DefWindowProc(hwnd, msg, wparam, lparam); +} + +void Console::clear() { + for(int i=0;iget_status()) { + case bSNES::RUNTOCPUPROCEED: + case bSNES::RUNTOCPUTRACE: + case bSNES::RUNTOSIGNAL: + case bSNES::RUNTOFRAME: + return false; + } + return true; +} + +void Console::write(char *s, uint32 message_type) { +char t[512]; + if(tracing_enabled == true) { + fprintf(log_fp, "%s\r\n", s); + } + + if(!can_write(message_type)) { + return; + } + + for(int i=0;ihwnd = CreateWindow("bsnes_console", "bsnes debug console", + WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, + 0, 0, 850, 355, + 0, 0, GetModuleHandle(0), 0); + + w_console->resize(850, 355); + w_console->to_left(); + w_console->to_bottom(); + + w_console->create_controls(); +} + +void Console::update_status() { +char s[4096], t[256]; + if(rom_image->loaded() == false)return; + + strcpy(s, ""); + sprintf(t, "V:%3d H:%3d HC:%4d I:%d IF:%d O:%d", + clock->vcounter(), clock->hcounter(), clock->hcycles(), + clock->interlace(), clock->interlace_field(), clock->overscan()); + strcat(s, t); + SetDlgItemText(hwnd, CONSOLE_STATUS, s); +} + +void Console::set_reg_list_type(uint8 list_type) { + switch(list_type) { + case REGTYPE_CPU: + SendDlgItemMessage(hwnd, CONSOLE_CFGREGNUM, CB_ADDSTRING, 0, (LPARAM)"A"); + SendDlgItemMessage(hwnd, CONSOLE_CFGREGNUM, CB_ADDSTRING, 0, (LPARAM)"X"); + SendDlgItemMessage(hwnd, CONSOLE_CFGREGNUM, CB_ADDSTRING, 0, (LPARAM)"Y"); + SendDlgItemMessage(hwnd, CONSOLE_CFGREGNUM, CB_ADDSTRING, 0, (LPARAM)"S"); + SendDlgItemMessage(hwnd, CONSOLE_CFGREGNUM, CB_ADDSTRING, 0, (LPARAM)"D"); + SendDlgItemMessage(hwnd, CONSOLE_CFGREGNUM, CB_ADDSTRING, 0, (LPARAM)"DB"); + SendDlgItemMessage(hwnd, CONSOLE_CFGREGNUM, CB_ADDSTRING, 0, (LPARAM)"P"); + SendDlgItemMessage(hwnd, CONSOLE_CFGREGNUM, CB_ADDSTRING, 0, (LPARAM)"E"); + SendDlgItemMessage(hwnd, CONSOLE_CFGREGNUM, CB_ADDSTRING, 0, (LPARAM)"PC"); + SendDlgItemMessage(hwnd, CONSOLE_CFGREGNUM, CB_SETCURSEL, 0, 0); + } +} + +void Console::create_controls() { +int x, y; + CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", + WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_READONLY, + 5, 5, 585, 290, + hwnd, (HMENU)CONSOLE_OUTPUT, GetModuleHandle(0), 0); + CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", + WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_READONLY, 5, 300, 585, 50, + hwnd, (HMENU)CONSOLE_STATUS, GetModuleHandle(0), 0); + + x = 595; + CreateWindow("BUTTON", "cpu (wdc 65c816)", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, + x, 5, 250, 60, hwnd, (HMENU)CONSOLE_CPUGROUP, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Step", WS_CHILD | WS_VISIBLE, x + 5, 20, 80, 20, hwnd, (HMENU)CONSOLE_CPUSTEP, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Proceed", WS_CHILD | WS_VISIBLE, x + 85, 20, 80, 20, hwnd, (HMENU)CONSOLE_CPUPROCEED, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Skip", WS_CHILD | WS_VISIBLE, x + 165, 20, 80, 20, hwnd, (HMENU)CONSOLE_CPUSKIP, GetModuleHandle(0), 0); + CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "0", WS_CHILD | WS_VISIBLE, + x + 5, 40, 80, 20, hwnd, (HMENU)CONSOLE_CPUTRACENUM, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Trace", WS_CHILD | WS_VISIBLE, x + 85, 40, 80, 20, hwnd, (HMENU)CONSOLE_CPUTRACE, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Disable", WS_CHILD | WS_VISIBLE, x + 165, 40, 80, 20, hwnd, (HMENU)CONSOLE_CPUDISABLE, GetModuleHandle(0), 0); + + CreateWindow("BUTTON", "apu (sony spc700)", WS_CHILD | WS_VISIBLE | WS_DISABLED | BS_GROUPBOX, + x, 70, 250, 60, hwnd, (HMENU)CONSOLE_APUGROUP, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Step", WS_CHILD | WS_VISIBLE | WS_DISABLED, x + 5, 85, 80, 20, hwnd, (HMENU)CONSOLE_APUSTEP, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Proceed", WS_CHILD | WS_VISIBLE | WS_DISABLED, x + 85, 85, 80, 20, hwnd, (HMENU)CONSOLE_APUPROCEED, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Skip", WS_CHILD | WS_VISIBLE | WS_DISABLED, x + 165, 85, 80, 20, hwnd, (HMENU)CONSOLE_APUSKIP, GetModuleHandle(0), 0); + CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "0", WS_CHILD | WS_VISIBLE | WS_DISABLED, + x + 5, 105, 80, 20, hwnd, (HMENU)CONSOLE_APUTRACENUM, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Trace", WS_CHILD | WS_VISIBLE | WS_DISABLED, x + 85, 105, 80, 20, hwnd, (HMENU)CONSOLE_APUTRACE, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Disable", WS_CHILD | WS_VISIBLE | WS_DISABLED, x + 165, 105, 80, 20, hwnd, (HMENU)CONSOLE_APUDISABLE, GetModuleHandle(0), 0); + + CreateWindow("BUTTON", "System", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, x, 135, 250, 40, hwnd, (HMENU)CONSOLE_SYSGROUP, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Run", WS_CHILD | WS_VISIBLE, x + 5, 150, 80, 20, hwnd, (HMENU)CONSOLE_SYSRUN, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "To Frame", WS_CHILD | WS_VISIBLE, x + 85, 150, 80, 20, hwnd, (HMENU)CONSOLE_SYSRUNTOFRAME, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "To NMI", WS_CHILD | WS_VISIBLE | WS_DISABLED, x + 165, 150, 80, 20, hwnd, (HMENU)CONSOLE_SYSRUNTONMI, GetModuleHandle(0), 0); + + CreateWindow("BUTTON", "Settings", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, x, 180, 250, 170, hwnd, (HMENU)CONSOLE_CFGGROUP, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Output CPU instructions to console", WS_CHILD | WS_VISIBLE | WS_DISABLED | BS_CHECKBOX, + x + 5, 195, 240, 15, hwnd, (HMENU)CONSOLE_CFGOUTPUTCPU, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Output APU instructions to console", WS_CHILD | WS_VISIBLE | WS_DISABLED | BS_CHECKBOX, + x + 5, 210, 240, 15, hwnd, (HMENU)CONSOLE_CFGOUTPUTAPU, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Output debug messages to console", WS_CHILD | WS_VISIBLE | WS_DISABLED | BS_CHECKBOX, + x + 5, 225, 240, 15, hwnd, (HMENU)CONSOLE_CFGOUTPUTDBG, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Trace console output to file", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, + x + 5, 240, 240, 15, hwnd, (HMENU)CONSOLE_CFGTRACE, GetModuleHandle(0), 0); + CreateWindow("COMBOBOX", "", WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_HASSTRINGS, + x + 5, 260, 60, 200, hwnd, (HMENU)CONSOLE_CFGREGTYPE, GetModuleHandle(0), 0); + CreateWindow("COMBOBOX", "", WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_HASSTRINGS, + x + 65, 260, 60, 200, hwnd, (HMENU)CONSOLE_CFGREGNUM, GetModuleHandle(0), 0); + CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "0", WS_CHILD | WS_VISIBLE, + x + 125, 260, 60, 21, hwnd, (HMENU)CONSOLE_CFGREGVAL, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Set Reg", WS_CHILD | WS_VISIBLE, + x + 185, 260, 60, 21, hwnd, (HMENU)CONSOLE_CFGREGSET, GetModuleHandle(0), 0); + CreateWindow("STATIC", "Lock Joypad Button(s) Down:", WS_CHILD | WS_VISIBLE, x + 5, 285, 240, 15, hwnd, (HMENU)CONSOLE_CFGLOCK, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Up", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, + x + 5, 300, 60, 15, hwnd, (HMENU)CONSOLE_CFGLOCKUP, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Down", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, + x + 65, 300, 60, 15, hwnd, (HMENU)CONSOLE_CFGLOCKDOWN, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Left", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, + x + 125, 300, 60, 15, hwnd, (HMENU)CONSOLE_CFGLOCKLEFT, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Right", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, + x + 185, 300, 60, 15, hwnd, (HMENU)CONSOLE_CFGLOCKRIGHT, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "A", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, + x + 5, 315, 60, 15, hwnd, (HMENU)CONSOLE_CFGLOCKA, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "B", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, + x + 65, 315, 60, 15, hwnd, (HMENU)CONSOLE_CFGLOCKB, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "X", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, + x + 125, 315, 60, 15, hwnd, (HMENU)CONSOLE_CFGLOCKX, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Y", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, + x + 185, 315, 60, 15, hwnd, (HMENU)CONSOLE_CFGLOCKY, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "L", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, + x + 5, 330, 60, 15, hwnd, (HMENU)CONSOLE_CFGLOCKL, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "R", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, + x + 65, 330, 60, 15, hwnd, (HMENU)CONSOLE_CFGLOCKR, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Select", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, + x + 125, 330, 60, 15, hwnd, (HMENU)CONSOLE_CFGLOCKSELECT, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Start", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, + x + 185, 330, 60, 15, hwnd, (HMENU)CONSOLE_CFGLOCKSTART, GetModuleHandle(0), 0); + + SendDlgItemMessage(hwnd, CONSOLE_OUTPUT, WM_SETFONT, (WPARAM)hMonofont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_STATUS, WM_SETFONT, (WPARAM)hMonofont, TRUE); + + SendDlgItemMessage(hwnd, CONSOLE_CPUGROUP, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CPUSTEP, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CPUPROCEED, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CPUSKIP, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CPUTRACENUM, WM_SETFONT, (WPARAM)hMonofont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CPUTRACE, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CPUDISABLE, WM_SETFONT, (WPARAM)hFont, TRUE); + + SendDlgItemMessage(hwnd, CONSOLE_APUGROUP, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_APUSTEP, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_APUPROCEED, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_APUSKIP, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_APUTRACENUM, WM_SETFONT, (WPARAM)hMonofont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_APUTRACE, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_APUDISABLE, WM_SETFONT, (WPARAM)hFont, TRUE); + + SendDlgItemMessage(hwnd, CONSOLE_SYSGROUP, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_SYSRUN, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_SYSRUNTOFRAME, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_SYSRUNTONMI, WM_SETFONT, (WPARAM)hFont, TRUE); + + SendDlgItemMessage(hwnd, CONSOLE_CFGGROUP, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGOUTPUTCPU, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGOUTPUTAPU, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGOUTPUTDBG, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGTRACE, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGREGTYPE, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGREGNUM, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGREGVAL, WM_SETFONT, (WPARAM)hMonofont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGREGSET, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGLOCK, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGLOCKUP, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGLOCKDOWN, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGLOCKLEFT, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGLOCKRIGHT, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGLOCKA, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGLOCKB, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGLOCKX, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGLOCKY, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGLOCKL, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGLOCKR, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGLOCKSELECT, WM_SETFONT, (WPARAM)hFont, TRUE); + SendDlgItemMessage(hwnd, CONSOLE_CFGLOCKSTART, WM_SETFONT, (WPARAM)hFont, TRUE); + + SendDlgItemMessage(hwnd, CONSOLE_CFGOUTPUTCPU, BM_SETCHECK, (WPARAM)true, 0); + SendDlgItemMessage(hwnd, CONSOLE_CFGOUTPUTDBG, BM_SETCHECK, (WPARAM)true, 0); + + SendDlgItemMessage(hwnd, CONSOLE_CFGREGTYPE, CB_ADDSTRING, 0, (LPARAM)"CPU"); + SendDlgItemMessage(hwnd, CONSOLE_CFGREGTYPE, CB_SETCURSEL, 0, 0); + set_reg_list_type(REGTYPE_CPU); + +HWND h; +uint32 style; + for(int i=0;i<100;i++) { + ctl_disabled[i] = false; + h = GetDlgItem(hwnd, i + 100); + if(!h)continue; + style = GetWindowLong(h, GWL_STYLE); + if(style & WS_DISABLED)ctl_disabled[i] = true; + } +} + +Console::Console() { + for(int i=0;ihmenu, MENU_SETTINGS_FRAMESKIP_OFF, MF_UNCHECKED); + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_FRAMESKIP_1, MF_UNCHECKED); + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_FRAMESKIP_2, MF_UNCHECKED); + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_FRAMESKIP_3, MF_UNCHECKED); + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_FRAMESKIP_4, MF_UNCHECKED); + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_FRAMESKIP_5, MF_UNCHECKED); + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_FRAMESKIP_6, MF_UNCHECKED); + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_FRAMESKIP_7, MF_UNCHECKED); + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_FRAMESKIP_8, MF_UNCHECKED); + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_FRAMESKIP_9, MF_UNCHECKED); + + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_FRAMESKIP_OFF + fs, MF_CHECKED); + clock->set_frameskip(fs); +} + +void MainWindow::set_video_mode(uint8 mode) { + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_VIDEOMODE_256x224w, MF_UNCHECKED); + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_VIDEOMODE_512x448w, MF_UNCHECKED); + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_VIDEOMODE_960x720w, MF_UNCHECKED); + switch(mode) { + case VIDEOMODE_256x224w: + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_VIDEOMODE_256x224w, MF_CHECKED); + w_main->resize(256, 223); + break; + case VIDEOMODE_512x448w: + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_VIDEOMODE_512x448w, MF_CHECKED); + w_main->resize(512, 446); + break; + case VIDEOMODE_960x720w: + CheckMenuItem(w_main->hmenu, MENU_SETTINGS_VIDEOMODE_960x720w, MF_CHECKED); + w_main->resize(960, 720); + break; + } + if(bsnes->debugger_enabled() == true) { + w_main->to_bottom(); + w_main->to_right(); + } else { + w_main->to_middle(); + w_main->to_center(); + } + video_mode = mode; + w_main->show(); +} + +void MainWindow::menu_load() { +OPENFILENAME ofn; +char t[4096]; + strcpy(t, ""); + memset(&ofn, 0, sizeof(ofn)); + + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = hwnd; + ofn.lpstrFilter = "SNES ROM Images (*.smc;*.swc;*.fig;*.ufo;*.gd3;*.078)\0" + "*.smc;*.swc;*.fig;*.ufo;*.gd3;*.078\0" + "All Files (*.*)\0" + "*.*\0"; + ofn.lpstrFile = t; + ofn.nMaxFile = MAX_PATH; + ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST; + ofn.lpstrDefExt = "smc"; + + if(!GetOpenFileName(&ofn))return; + + rom_image->unload(); + dprintf(""); + rom_image->select(t); + rom_image->load(); + + snes->power(); + bsnes->debugger_update(); +} + +void MainWindow::menu_unload() { + rom_image->unload(); +} + +long __stdcall wndproc_main(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { + switch(msg) { + case WM_COMMAND: + switch(LOWORD(wparam)) { + case MENU_FILE_LOAD: + w_main->menu_load(); + break; + case MENU_FILE_UNLOAD: + w_main->menu_unload(); + break; + case MENU_FILE_RESET: + if(rom_image->loaded() == false)break; + dprintf("* Soft Reset"); + snes->reset(); + bsnes->debugger_update(); + break; + case MENU_FILE_POWER: + if(rom_image->loaded() == false)break; + dprintf("* Power (Hard Reset)"); + snes->power(); + bsnes->debugger_update(); + break; + case MENU_FILE_EXIT: + PostQuitMessage(0); + break; + case MENU_SETTINGS_FRAMESKIP_OFF: + case MENU_SETTINGS_FRAMESKIP_1: + case MENU_SETTINGS_FRAMESKIP_2: + case MENU_SETTINGS_FRAMESKIP_3: + case MENU_SETTINGS_FRAMESKIP_4: + case MENU_SETTINGS_FRAMESKIP_5: + case MENU_SETTINGS_FRAMESKIP_6: + case MENU_SETTINGS_FRAMESKIP_7: + case MENU_SETTINGS_FRAMESKIP_8: + case MENU_SETTINGS_FRAMESKIP_9: + w_main->set_frameskip(LOWORD(wparam) - MENU_SETTINGS_FRAMESKIP_OFF); + break; + case MENU_SETTINGS_VIDEOMODE_256x224w: + w_main->set_video_mode(VIDEOMODE_256x224w); + break; + case MENU_SETTINGS_VIDEOMODE_512x448w: + w_main->set_video_mode(VIDEOMODE_512x448w); + break; + case MENU_SETTINGS_VIDEOMODE_960x720w: + w_main->set_video_mode(VIDEOMODE_960x720w); + break; + case MENU_SETTINGS_DEBUGGER: + if(bsnes->debugger_enabled() == true) { + bsnes->debugger_disable(); + } else { + bsnes->debugger_enable(); + w_main->set_video_mode(VIDEOMODE_256x224w); + } + break; + } + break; + case WM_DESTROY: + PostQuitMessage(0); + break; + case WM_PAINT: + renderer.redraw(); + break; + } + return DefWindowProc(hwnd, msg, wparam, lparam); +} + +void CreateWindowMain() { +WNDCLASS wc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hbrBackground = CreateSolidBrush(RGB(0, 0, 0)); + wc.hCursor = LoadCursor(0, IDC_ARROW); + wc.hIcon = LoadIcon(0, IDI_APPLICATION); + wc.hInstance = GetModuleHandle(0); + wc.lpfnWndProc = wndproc_main; + wc.lpszClassName = "bsnes"; + wc.lpszMenuName = 0; + wc.style = CS_HREDRAW | CS_VREDRAW; + RegisterClass(&wc); + + w_main->hwnd = CreateWindow("bsnes", "bsnes v" BSNES_VERSION " ~byuu", + WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, + 0, 0, 512, 446, + 0, 0, GetModuleHandle(0), 0); + +HMENU hsubmenu, hbranchmenu; + w_main->hmenu = CreateMenu(); + + hsubmenu = CreatePopupMenu(); + AppendMenu(hsubmenu, MF_STRING, MENU_FILE_LOAD, "&Load ROM"); + AppendMenu(hsubmenu, MF_STRING, MENU_FILE_UNLOAD, "&Unload ROM"); + AppendMenu(hsubmenu, MF_SEPARATOR, 0, ""); + AppendMenu(hsubmenu, MF_STRING, MENU_FILE_RESET, "&Reset"); + AppendMenu(hsubmenu, MF_STRING, MENU_FILE_POWER, "&Power (Hard Reset)"); + AppendMenu(hsubmenu, MF_SEPARATOR, 0, ""); + AppendMenu(hsubmenu, MF_STRING, MENU_FILE_EXIT, "E&xit"); + AppendMenu(w_main->hmenu, MF_STRING | MF_POPUP, (unsigned int)hsubmenu, "&File"); + + hsubmenu = CreatePopupMenu(); + + hbranchmenu = CreatePopupMenu(); + AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_OFF, "Off"); + AppendMenu(hbranchmenu, MF_SEPARATOR, 0, ""); + AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_1, "1"); + AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_2, "2"); + AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_3, "3"); + AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_4, "4"); + AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_5, "5"); + AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_6, "6"); + AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_7, "7"); + AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_8, "8"); + AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_FRAMESKIP_9, "9"); + AppendMenu(hsubmenu, MF_STRING | MF_POPUP, (unsigned int)hbranchmenu, "&Frameskip"); + + hbranchmenu = CreatePopupMenu(); + AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_VIDEOMODE_256x224w, "256x224 Windowed [16:15]"); + AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_VIDEOMODE_512x448w, "512x448 Windowed [16:15]"); + AppendMenu(hbranchmenu, MF_STRING, MENU_SETTINGS_VIDEOMODE_960x720w, "960x720 Windowed [4:3]"); + AppendMenu(hsubmenu, MF_STRING | MF_POPUP, (unsigned int)hbranchmenu, "&Video Mode"); + + AppendMenu(hsubmenu, MF_SEPARATOR, 0, ""); + AppendMenu(hsubmenu, MF_STRING, MENU_SETTINGS_DEBUGGER, "&Debugger"); + AppendMenu(w_main->hmenu, MF_STRING | MF_POPUP, (unsigned int)hsubmenu, "&Settings"); + + w_main->set_video_mode(w_main->video_mode); + w_main->set_frameskip(0); + w_main->show_menu(); +} + +MainWindow::MainWindow() { + video_mode = VIDEOMODE_512x448w; +} diff --git a/src/win/ui_memory.cpp b/src/win/ui_memory.cpp new file mode 100644 index 00000000..651b0215 --- /dev/null +++ b/src/win/ui_memory.cpp @@ -0,0 +1,327 @@ +long __stdcall wndproc_memoryeditor(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { +char t[256]; +uint32 addr, value, pos; + switch(msg) { + case WM_COMMAND: + switch(LOWORD(wparam)) { + case MEMORYEDITOR_MODE: + if(HIWORD(wparam) == CBN_SELCHANGE) { + pos = SendDlgItemMessage(hwnd, MEMORYEDITOR_MODE, CB_GETCURSEL, 0, 0); + if(pos == 0) { + w_memory->edit_mode = MemoryEditor::MODE_DRAM; + w_memory->edit_addr = 0x7e0000; + w_memory->edit_mask = 0xffffff; + } else if(pos == 1) { + w_memory->edit_mode = MemoryEditor::MODE_DRAM; + w_memory->edit_addr = 0x008000; + w_memory->edit_mask = 0xffffff; + } else if(pos == 2) { + w_memory->edit_mode = MemoryEditor::MODE_DRAM; + w_memory->edit_addr = 0x700000; + w_memory->edit_mask = 0xffffff; + } else if(pos == 3) { + w_memory->edit_mode = MemoryEditor::MODE_VRAM; + w_memory->edit_addr = 0x0000; + w_memory->edit_mask = 0xffff; + } else if(pos == 4) { + w_memory->edit_mode = MemoryEditor::MODE_OAM; + w_memory->edit_addr = 0x0000; + w_memory->edit_mask = 0x03ff; + } else if(pos == 5) { + w_memory->edit_mode = MemoryEditor::MODE_CGRAM; + w_memory->edit_addr = 0x0000; + w_memory->edit_mask = 0x01ff; + } + w_memory->refresh(); + } + break; + case MEMORYEDITOR_GOTO: + GetDlgItemText(hwnd, MEMORYEDITOR_GOTOADDR, t, 255); + addr = strhex(t) & w_memory->edit_mask; + w_memory->edit_addr = addr; + w_memory->refresh(); + break; + case MEMORYEDITOR_EDIT: + GetDlgItemText(hwnd, MEMORYEDITOR_OFFSET, t, 255); + addr = strhex(t) & w_memory->edit_mask; + GetDlgItemText(hwnd, MEMORYEDITOR_VALUE, t, 255); + value = strhex(t) & 0xff; + switch(w_memory->edit_mode) { + case MemoryEditor::MODE_DRAM: bsnes->write(bSNES::DRAM, addr, value);break; + case MemoryEditor::MODE_VRAM: bsnes->write(bSNES::VRAM, addr, value);break; + case MemoryEditor::MODE_OAM: bsnes->write(bSNES::OAM, addr, value);break; + case MemoryEditor::MODE_CGRAM:bsnes->write(bSNES::CGRAM, addr, value);break; + } + break; + case MEMORYEDITOR_FEXPORT: + pos = SendDlgItemMessage(hwnd, MEMORYEDITOR_FSOURCE, CB_GETCURSEL, 0, 0); + w_memory->export(pos); + break; + case MEMORYEDITOR_UP40: + w_memory->edit_addr -= 0x40; + w_memory->edit_addr &= w_memory->edit_mask; + w_memory->refresh(); + break; + case MEMORYEDITOR_DOWN40: + w_memory->edit_addr += 0x40; + w_memory->edit_addr &= w_memory->edit_mask; + w_memory->refresh(); + break; + case MEMORYEDITOR_UP400: + w_memory->edit_addr -= 0x400; + w_memory->edit_addr &= w_memory->edit_mask; + w_memory->refresh(); + break; + case MEMORYEDITOR_DOWN400: + w_memory->edit_addr += 0x400; + w_memory->edit_addr &= w_memory->edit_mask; + w_memory->refresh(); + break; + case MEMORYEDITOR_UP4000: + w_memory->edit_addr -= 0x4000; + w_memory->edit_addr &= w_memory->edit_mask; + w_memory->refresh(); + break; + case MEMORYEDITOR_DOWN4000: + w_memory->edit_addr += 0x4000; + w_memory->edit_addr &= w_memory->edit_mask; + w_memory->refresh(); + break; + case MEMORYEDITOR_UP40000: + w_memory->edit_addr -= 0x40000; + w_memory->edit_addr &= w_memory->edit_mask; + w_memory->refresh(); + break; + case MEMORYEDITOR_DOWN40000: + w_memory->edit_addr += 0x40000; + w_memory->edit_addr &= w_memory->edit_mask; + w_memory->refresh(); + break; + } + break; +/* Usually, bsnes will catch the close request here, and replace it + with a hide command instead. */ + case WM_CLOSE: + w_memory->hide(); + return 0; +/* Just in case something sends a DestroyWindow command to bsnes... */ + case WM_DESTROY: + alert("Error: bsnes debugging memory editor window has been destroyed!\n" + "The emulator will still run, but it must be restarted before\n" + "the debugger will function again."); + bsnes->debugger_disable(); + return 0; + } + + return DefWindowProc(hwnd, msg, wparam, lparam); +} + +void CreateWindowMemory() { +WNDCLASS wc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hbrBackground = (HBRUSH)COLOR_WINDOW; + wc.hCursor = LoadCursor(0, IDC_ARROW); + wc.hIcon = LoadIcon(0, IDI_APPLICATION); + wc.hInstance = GetModuleHandle(0); + wc.lpfnWndProc = wndproc_memoryeditor; + wc.lpszClassName = "bsnes_memoryeditor"; + wc.lpszMenuName = 0; + wc.style = CS_HREDRAW | CS_VREDRAW; + RegisterClass(&wc); + + w_memory->hwnd = CreateWindow("bsnes_memoryeditor", "bsnes memory editor", + WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, + 0, 0, 500, 245, + 0, 0, GetModuleHandle(0), 0); + + w_memory->resize(500, 245); + w_memory->to_left(w_bp->hwnd); + w_memory->to_bottom(w_console->hwnd); + + w_memory->create_controls(); +} + +void MemoryEditor::export(uint32 type) { +FILE *fp; +int i, x; + if(type == 0) { //DRAM + fp = fopen("dram.bin", "wb"); + for(i=0x7e0000;i<=0x7fffff;i++) { + x = bsnes->read(bSNES::DRAM, i); + fputc(x, fp); + } + fclose(fp); + } else if(type == 1) { //SRAM + /* should actually try and get the correct SRAM size here... */ + fp = fopen("sram.bin", "wb"); + for(i=0x700000;i<=0x720000;i++) { + x = bsnes->read(bSNES::DRAM, i); + fputc(x, fp); + } + fclose(fp); + } else if(type == 2) { //VRAM + fp = fopen("vram.bin", "wb"); + for(i=0x0000;i<=0xffff;i++) { + x = bsnes->read(bSNES::VRAM, i); + fputc(x, fp); + } + fclose(fp); + } else if(type == 3) { //OAM + fp = fopen("oam.bin", "wb"); + for(i=0x0000;i<=0x021f;i++) { + x = bsnes->read(bSNES::OAM, i); + fputc(x, fp); + } + fclose(fp); + } else if(type == 4) { //CGRAM + fp = fopen("cgram.bin", "wb"); + for(i=0x0000;i<=0x01ff;i++) { + x = bsnes->read(bSNES::CGRAM, i); + fputc(x, fp); + } + fclose(fp); + } else if(type == 5) { //All + export(0); + export(1); + export(2); + export(3); + export(4); + } +} + +uint8 MemoryEditor::read_byte(uint32 addr) { + switch(edit_mode) { + case MODE_DRAM: return bsnes->read(bSNES::DRAM, addr); + case MODE_VRAM: return bsnes->read(bSNES::VRAM, addr); + case MODE_OAM: return bsnes->read(bSNES::OAM, addr); + case MODE_CGRAM:return bsnes->read(bSNES::CGRAM, addr); + } + return 0x00; +} + +void MemoryEditor::clear() { + SetDlgItemText(hwnd, MEMORYEDITOR_VIEW, ""); +} + +void MemoryEditor::refresh(uint32 type, uint32 addr) { +char s[4096], t[256]; +int x, y; + if(rom_image->loaded() == false)return; + if(visible == false)return; + + if(type == SNES::MEM_WRITE) { + if(edit_mode != MODE_DRAM)return; + if(addr < edit_addr || addr >= edit_addr + 256)return; + } else if(type == SNES::VRAM_WRITE) { + if(edit_mode != MODE_VRAM)return; + if(addr < edit_addr || addr >= edit_addr + 256)return; + } else if(type == SNES::OAM_WRITE) { + if(edit_mode != MODE_OAM)return; + if(addr < edit_addr || addr >= edit_addr + 256)return; + } else if(type == SNES::CGRAM_WRITE) { + if(edit_mode != MODE_CGRAM)return; + if(addr < edit_addr || addr >= edit_addr + 256)return; + } + + strcpy(s, ""); + for(y=0;y<16;y++) { + sprintf(t, "%0.6x: ", (edit_addr + y * 16) & edit_mask); + strcat(s, t); + for(x=0;x<16;x++) { + sprintf(t, "%0.2x", read_byte(edit_addr + y * 16 + x)); + strcat(s, t); + if(x != 15)strcat(s, " "); + } + if(y != 15)strcat(s, "\r\n"); + } + SetDlgItemText(hwnd, MEMORYEDITOR_VIEW, s); +} + +void MemoryEditor::create_controls() { + CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_READONLY, + 5, 5, 395, 235, hwnd, (HMENU)MEMORYEDITOR_VIEW, GetModuleHandle(0), 0); + + CreateWindow("COMBOBOX", "", WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_HASSTRINGS, + 405, 5, 90, 200, hwnd, (HMENU)MEMORYEDITOR_MODE, GetModuleHandle(0), 0); + CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "000000", WS_CHILD | WS_VISIBLE, + 405, 26, 55, 20, hwnd, (HMENU)MEMORYEDITOR_GOTOADDR, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Go", WS_CHILD | WS_VISIBLE, + 460, 26, 35, 20, hwnd, (HMENU)MEMORYEDITOR_GOTO, GetModuleHandle(0), 0); + + CreateWindow("STATIC", "Offset: Value:", WS_CHILD | WS_VISIBLE, + 405, 50, 90, 15, hwnd, (HMENU)MEMORYEDITOR_STATIC1, GetModuleHandle(0), 0); + CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "000000", WS_CHILD | WS_VISIBLE, + 405, 65, 55, 20, hwnd, (HMENU)MEMORYEDITOR_OFFSET, GetModuleHandle(0), 0); + CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "00", WS_CHILD | WS_VISIBLE, + 460, 65, 35, 20, hwnd, (HMENU)MEMORYEDITOR_VALUE, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Edit Memory", WS_CHILD | WS_VISIBLE, + 405, 85, 90, 20, hwnd, (HMENU)MEMORYEDITOR_EDIT, GetModuleHandle(0), 0); + + CreateWindow("COMBOBOX", "", WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_HASSTRINGS, + 405, 110, 90, 200, hwnd, (HMENU)MEMORYEDITOR_FSOURCE, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "Export...", WS_CHILD | WS_VISIBLE, + 405, 131, 90, 20, hwnd, (HMENU)MEMORYEDITOR_FEXPORT, GetModuleHandle(0), 0); + + CreateWindow("BUTTON", "-40", WS_CHILD | WS_VISIBLE, + 405, 160, 45, 20, hwnd, (HMENU)MEMORYEDITOR_UP40, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "+40", WS_CHILD | WS_VISIBLE, + 450, 160, 45, 20, hwnd, (HMENU)MEMORYEDITOR_DOWN40, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "-400", WS_CHILD | WS_VISIBLE, + 405, 180, 45, 20, hwnd, (HMENU)MEMORYEDITOR_UP400, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "+400", WS_CHILD | WS_VISIBLE, + 450, 180, 45, 20, hwnd, (HMENU)MEMORYEDITOR_DOWN400, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "-4000", WS_CHILD | WS_VISIBLE, + 405, 200, 45, 20, hwnd, (HMENU)MEMORYEDITOR_UP4000, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "+4000", WS_CHILD | WS_VISIBLE, + 450, 200, 45, 20, hwnd, (HMENU)MEMORYEDITOR_DOWN4000, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "-40000", WS_CHILD | WS_VISIBLE, + 405, 220, 45, 20, hwnd, (HMENU)MEMORYEDITOR_UP40000, GetModuleHandle(0), 0); + CreateWindow("BUTTON", "+40000", WS_CHILD | WS_VISIBLE, + 450, 220, 45, 20, hwnd, (HMENU)MEMORYEDITOR_DOWN40000, GetModuleHandle(0), 0); + + SendDlgItemMessage(hwnd, MEMORYEDITOR_VIEW, WM_SETFONT, (WPARAM)hMonofont, 0); + SendDlgItemMessage(hwnd, MEMORYEDITOR_MODE, WM_SETFONT, (WPARAM)hFont, 0); + SendDlgItemMessage(hwnd, MEMORYEDITOR_GOTOADDR, WM_SETFONT, (WPARAM)hMonofont, 0); + SendDlgItemMessage(hwnd, MEMORYEDITOR_GOTO, WM_SETFONT, (WPARAM)hFont, 0); + SendDlgItemMessage(hwnd, MEMORYEDITOR_STATIC1, WM_SETFONT, (WPARAM)hFont, 0); + SendDlgItemMessage(hwnd, MEMORYEDITOR_OFFSET, WM_SETFONT, (WPARAM)hMonofont, 0); + SendDlgItemMessage(hwnd, MEMORYEDITOR_VALUE, WM_SETFONT, (WPARAM)hMonofont, 0); + SendDlgItemMessage(hwnd, MEMORYEDITOR_EDIT, WM_SETFONT, (WPARAM)hFont, 0); + SendDlgItemMessage(hwnd, MEMORYEDITOR_FSOURCE, WM_SETFONT, (WPARAM)hFont, 0); + SendDlgItemMessage(hwnd, MEMORYEDITOR_FEXPORT, WM_SETFONT, (WPARAM)hFont, 0); + SendDlgItemMessage(hwnd, MEMORYEDITOR_UP40, WM_SETFONT, (WPARAM)hFont, 0); + SendDlgItemMessage(hwnd, MEMORYEDITOR_DOWN40, WM_SETFONT, (WPARAM)hFont, 0); + SendDlgItemMessage(hwnd, MEMORYEDITOR_UP400, WM_SETFONT, (WPARAM)hFont, 0); + SendDlgItemMessage(hwnd, MEMORYEDITOR_DOWN400, WM_SETFONT, (WPARAM)hFont, 0); + SendDlgItemMessage(hwnd, MEMORYEDITOR_UP4000, WM_SETFONT, (WPARAM)hFont, 0); + SendDlgItemMessage(hwnd, MEMORYEDITOR_DOWN4000, WM_SETFONT, (WPARAM)hFont, 0); + SendDlgItemMessage(hwnd, MEMORYEDITOR_UP40000, WM_SETFONT, (WPARAM)hFont, 0); + SendDlgItemMessage(hwnd, MEMORYEDITOR_DOWN40000, WM_SETFONT, (WPARAM)hFont, 0); + + SendDlgItemMessage(hwnd, MEMORYEDITOR_MODE, CB_ADDSTRING, 0, (LPARAM)"DRAM"); + SendDlgItemMessage(hwnd, MEMORYEDITOR_MODE, CB_ADDSTRING, 0, (LPARAM)"ROM"); + SendDlgItemMessage(hwnd, MEMORYEDITOR_MODE, CB_ADDSTRING, 0, (LPARAM)"SRAM"); + SendDlgItemMessage(hwnd, MEMORYEDITOR_MODE, CB_ADDSTRING, 0, (LPARAM)"VRAM"); + SendDlgItemMessage(hwnd, MEMORYEDITOR_MODE, CB_ADDSTRING, 0, (LPARAM)"OAM"); + SendDlgItemMessage(hwnd, MEMORYEDITOR_MODE, CB_ADDSTRING, 0, (LPARAM)"CGRAM"); + SendDlgItemMessage(hwnd, MEMORYEDITOR_MODE, CB_SETCURSEL, 0, 0); + + SendDlgItemMessage(hwnd, MEMORYEDITOR_FSOURCE, CB_ADDSTRING, 0, (LPARAM)"DRAM"); + SendDlgItemMessage(hwnd, MEMORYEDITOR_FSOURCE, CB_ADDSTRING, 0, (LPARAM)"SRAM"); + SendDlgItemMessage(hwnd, MEMORYEDITOR_FSOURCE, CB_ADDSTRING, 0, (LPARAM)"VRAM"); + SendDlgItemMessage(hwnd, MEMORYEDITOR_FSOURCE, CB_ADDSTRING, 0, (LPARAM)"OAM"); + SendDlgItemMessage(hwnd, MEMORYEDITOR_FSOURCE, CB_ADDSTRING, 0, (LPARAM)"CGRAM"); + SendDlgItemMessage(hwnd, MEMORYEDITOR_FSOURCE, CB_ADDSTRING, 0, (LPARAM)"All"); + SendDlgItemMessage(hwnd, MEMORYEDITOR_FSOURCE, CB_SETCURSEL, 0, 0); + +HWND h; +uint32 style; + for(int i=0;i<100;i++) { + ctl_disabled[i] = false; + h = GetDlgItem(hwnd, i + 100); + if(!h)continue; + style = GetWindowLong(h, GWL_STYLE); + if(style & WS_DISABLED)ctl_disabled[i] = true; + } +} diff --git a/src/win/ui_render.cpp b/src/win/ui_render.cpp new file mode 100644 index 00000000..c124bd44 --- /dev/null +++ b/src/win/ui_render.cpp @@ -0,0 +1,223 @@ +//This is in the global namespace for inline assembly optimizations. +//If it were in a class, I would have to cast a pointer to it, and +//to read from a pointer array requires an extra opcode: +//mov eax,[array+eax*4] -> lea ebx,[parray] ; mov ebx,[ebx+eax*4] +uint32 color_lookup_table[65536]; + +render::render() { + lpdd = 0; + lpdds = 0; + lpddsb = 0; + lpddc = 0; +} + +void render::update_color_lookup_table() { +int i, r, g, b; + lpdds->GetSurfaceDesc(&ddsd); + color_depth = ddsd.ddpfPixelFormat.dwRGBBitCount; + if(color_depth == 15) { + for(i=0;i<65536;i++) { + r = (i ) & 31; + g = (i >> 5) & 31; + b = (i >> 10) & 31; + color_lookup_table[i] = (r << 10) | (g << 5) | (b); + } + } else if(color_depth == 16) { + for(i=0;i<65536;i++) { + r = (i ) & 31; + g = (i >> 5) & 31; + b = (i >> 10) & 31; + g = (g << 1) | (g >> 4); + color_lookup_table[i] = (r << 11) | (g << 5) | (b); + } + } else if(color_depth == 32) { + for(i=0;i<65536;i++) { + r = (i ) & 31; + g = (i >> 5) & 31; + b = (i >> 10) & 31; + r = (r << 3) | (r >> 2); + g = (g << 3) | (g >> 2); + b = (b << 3) | (b >> 2); + color_lookup_table[i] = (r << 16) | (g << 8) | (b); + } + } else { + alert("Error: Unsupported color depth [%d]", color_depth); + } +} + +void render::set_window(HWND hwnd_handle) { hwnd = hwnd_handle; } + +void render::to_windowed() { + destroy(); + DirectDrawCreate(0, &lpdd, 0); + lpdd->SetCooperativeLevel(hwnd, DDSCL_NORMAL); + + memset(&ddsd, 0, sizeof(DDSURFACEDESC)); + ddsd.dwSize = sizeof(DDSURFACEDESC); + ddsd.dwFlags = DDSD_CAPS; + ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + lpdd->CreateSurface(&ddsd, &lpdds, 0); + + lpdd->CreateClipper(0, &lpddc, 0); + lpddc->SetHWnd(0, hwnd); + lpdds->SetClipper(lpddc); + + memset(&ddsd, 0, sizeof(DDSURFACEDESC)); + ddsd.dwSize = sizeof(DDSURFACEDESC); + ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; + ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY; + ddsd.dwWidth = 512; + ddsd.dwHeight = 478; + lpdd->CreateSurface(&ddsd, &lpddsb, 0); + + update_color_lookup_table(); + update(); +} + +void render::to_fullscreen() { + destroy(); + DirectDrawCreate(0, &lpdd, 0); + lpdd->SetCooperativeLevel(hwnd, DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE); + lpdd->SetDisplayMode(640, 480, 16); + + memset(&ddsd, 0, sizeof(DDSURFACEDESC)); + ddsd.dwSize = sizeof(DDSURFACEDESC); + ddsd.dwFlags = DDSD_CAPS; + ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + lpdd->CreateSurface(&ddsd, &lpdds, 0); + + lpdd->CreateClipper(0, &lpddc, 0); + lpddc->SetHWnd(0, hwnd); + lpdds->SetClipper(lpddc); + + memset(&ddsd, 0, sizeof(DDSURFACEDESC)); + ddsd.dwSize = sizeof(DDSURFACEDESC); + ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; + ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; + ddsd.dwWidth = 512; + ddsd.dwHeight = 478; + lpdd->CreateSurface(&ddsd, &lpddsb, 0); + + update_color_lookup_table(); + update(); +} + +void render::redraw() { +RECT rd, rs; +POINT p; +HRESULT hr; + p.x = p.y = 0; + ClientToScreen(hwnd, &p); + GetClientRect(hwnd, &rd); + OffsetRect(&rd, p.x, p.y); + if(clock->overscan() == false) { + SetRect(&rs, 0, 2, 512, 448); + } else { + SetRect(&rs, 0, 2 + 15, 512, 448 + 15); + } + hr = lpdds->Blt(&rd, lpddsb, &rs, DDBLT_WAIT, 0); + if(hr == DDERR_SURFACELOST) { + lpdds->Restore(); + lpddsb->Restore(); + } +} + +void render::update16() { +HRESULT hr; + hr = lpddsb->Lock(0, &ddsd, DDLOCK_WAIT, 0); + if(hr != DD_OK)return; + +uint16 *_src_data = (uint16*)ppu->output; +uint16 *_dest_data = (uint16*)ddsd.lpSurface; +uint32 _pitch = ddsd.lPitch; + __asm { + mov edi,_dest_data + mov edx,_pitch + add edi,edx + add edi,edx + sub edx,1024 + mov esi,_src_data + add esi,2048 + mov ebx,478-2 + xor eax,eax + loop_y: + mov ecx,512 + loop_x: + lodsw + mov eax,dword ptr[color_lookup_table+eax*4] + stosw + dec ecx + jnz loop_x + add edi,edx + dec ebx + jnz loop_y + } + + lpddsb->Unlock(0); +} + +void render::update32() { +HRESULT hr; + hr = lpddsb->Lock(0, &ddsd, DDLOCK_WAIT, 0); + if(hr != DD_OK)return; + +uint16 *_src_data = (uint16*)ppu->output; +uint32 *_dest_data = (uint32*)ddsd.lpSurface; +uint32 _pitch = ddsd.lPitch; + __asm { + mov edi,_dest_data + mov edx,_pitch + add edi,edx + add edi,edx + sub edx,2048 + mov esi,_src_data + add esi,2048 + mov ebx,478-2 + loop_y: + mov ecx,512 + loop_x: + lodsw + and eax,0xffff + mov eax,dword ptr[color_lookup_table+eax*4] + stosd + dec ecx + jnz loop_x + add edi,edx + dec ebx + jnz loop_y + } + + lpddsb->Unlock(0); +} + +void render::update() { + switch(color_depth) { + case 15: + case 16: + update16(); + break; + case 32: + update32(); + break; + } + redraw(); +} + +void render::destroy() { + if(lpddc) { + lpddc->Release(); + lpddc = 0; + } + if(lpddsb) { + lpddsb->Release(); + lpddsb = 0; + } + if(lpdds) { + lpdds->Release(); + lpdds = 0; + } + if(lpdd) { + lpdd->Release(); + lpdd = 0; + } +} diff --git a/src/win/ui_window.cpp b/src/win/ui_window.cpp new file mode 100644 index 00000000..0b0b07dc --- /dev/null +++ b/src/win/ui_window.cpp @@ -0,0 +1,93 @@ +void Window::resize(int width, int height) { +RECT rc; +int x, y, wx, wy; + hide(); + SetWindowPos(hwnd, 0, 0, 0, width, height, SWP_NOZORDER); + GetClientRect(hwnd, &rc); + x = width + width - (rc.right - rc.left); + y = height + height - (rc.bottom - rc.top); + wx = (GetSystemMetrics(SM_CXSCREEN) - x) / 2; + wy = (GetSystemMetrics(SM_CYSCREEN) - y) / 2; + SetWindowPos(hwnd, 0, wx, wy, x, y, SWP_NOZORDER); +} + +void Window::to_left(HWND _hwnd) { +RECT rc; +int offset = 0; + if(_hwnd) { + GetWindowRect(_hwnd, &rc); + offset = rc.right; + } + GetWindowRect(hwnd, &rc); + rc.left = offset; + SetWindowPos(hwnd, 0, rc.left, rc.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE); +} + +void Window::to_center() { +RECT rc; + GetWindowRect(hwnd, &rc); + rc.left = (GetSystemMetrics(SM_CXSCREEN) - (rc.right - rc.left)) / 2; + SetWindowPos(hwnd, 0, rc.left, rc.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE); +} + +void Window::to_right() { +RECT rc; + GetWindowRect(hwnd, &rc); + rc.left = GetSystemMetrics(SM_CXSCREEN) - (rc.right - rc.left); + SetWindowPos(hwnd, 0, rc.left, rc.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE); +} + +void Window::to_top() { +RECT rc; + GetWindowRect(hwnd, &rc); + rc.top = 0; + SetWindowPos(hwnd, 0, rc.left, rc.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE); +} + +void Window::to_middle() { +RECT rc; + GetWindowRect(hwnd, &rc); + rc.top = (GetSystemMetrics(SM_CYSCREEN) - (rc.bottom - rc.top)) / 2; + SetWindowPos(hwnd, 0, rc.left, rc.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE); +} + +void Window::to_bottom(HWND _hwnd) { +RECT rc; +int offset = 0; + if(_hwnd) { + GetWindowRect(_hwnd, &rc); + offset = rc.bottom - rc.top; + } + GetWindowRect(hwnd, &rc); + rc.top = GetSystemMetrics(SM_CYSCREEN) - (rc.bottom - rc.top) - offset; + SetWindowPos(hwnd, 0, rc.left, rc.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE); +} + +void Window::hide() { + if(visible == true) { + ShowWindow(hwnd, SW_HIDE); + visible = false; + } +} + +void Window::show() { + if(visible == false) { + ShowWindow(hwnd, SW_NORMAL); + visible = true; + } +} + +void Window::show_menu() { + SetMenu(hwnd, hmenu); + menu_visible = true; +} + +void Window::hide_menu() { + SetMenu(hwnd, 0); + menu_visible = false; +} + +Window::Window() { + visible = false; + menu_visible = false; +} diff --git a/src/win/winmain.cpp b/src/win/winmain.cpp new file mode 100644 index 00000000..361eca32 --- /dev/null +++ b/src/win/winmain.cpp @@ -0,0 +1,62 @@ +#define INTERFACE_MAIN +#define BSNES_VERSION "0.006" +#include "winmain.h" +#include "../base.h" + +#include "bsnes.h" +#include "ui.h" + +#include "lib.cpp" +#include "rom.cpp" + +#include "bsnes.cpp" +#include "ui.cpp" + +void init_snes() { + clock = new bClock(); + mem_bus = new bMemBus(); + cpu = new bCPU(); + ppu = new bPPU(); + snes = new bSNES(); + bsnes = static_cast(snes); +} + +void term_snes() { + if(clock) { delete(clock); clock = 0; } + if(mem_bus) { delete(mem_bus); mem_bus = 0; } + if(cpu) { delete(cpu); cpu = 0; } + if(ppu) { delete(ppu); ppu = 0; } + if(snes) { delete(snes); snes = 0; } +} + +int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { +MSG msg; + meminit(); + rom_image = new ROMImage(); + + init_ui0(); + init_snes(); + init_ui1(); + + if(lpCmdLine) { + if(*lpCmdLine) { + rom_image->select(lpCmdLine); + rom_image->load(); + snes->power(); + bsnes->debugger_update(); + } + } + + while(1) { + if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { + if(msg.message == WM_QUIT)break; + TranslateMessage(&msg); + DispatchMessage(&msg); + } + bsnes->run(); + } + + term_snes(); + memterm(); + return 0; +} diff --git a/src/win/winmain.h b/src/win/winmain.h new file mode 100644 index 00000000..93a4753a --- /dev/null +++ b/src/win/winmain.h @@ -0,0 +1,3 @@ +//can't use common dialogs with this defined... +//#define WIN32_LEAN_AND_MEAN +#include