@Test public void test() { sys.println("\n***** STX *****"); CPUSetup.debug(); Assembler a = new Assembler(); Disassembler d = new Disassembler(); sys.println("\n===== STX Zero Page"); a.pb(op.LDX_IMM).pb(0x44); a.pb(op.STX_ZP).pb(0x73); a.pb(op.LDA_ZP).pb(0x73); a.brk(); d.print(a); cpu.resume(); assertEquals(0x44, cpu.a); sys.println("\n===== STX Zero Page, Y"); a.pb(op.LDX_IMM).pb(0x55); a.pb(op.LDY_IMM).pb(0x04); a.pb(op.STX_ZPY).pb(0x12); a.pb(op.LDA_ABS).pw(0x0016); a.brk(); d.print(a); cpu.resume(); assertEquals(0x55, cpu.a); sys.println("\n===== STX Absolute"); a.pb(op.LDX_IMM).pb(0x66); a.pb(op.STX_ABS).pw(0x1234); a.pb(op.LDA_ABS).pw(0x1234); a.brk(); d.print(a); cpu.resume(); assertEquals(0x66, cpu.a); }
@Test public void test() { sys.println("\n***** SBC *****"); CPUSetup.debug(); Assembler a = new Assembler(); Disassembler d = new Disassembler(); sys.println("\n===== SBC standard"); a.pb(op.LDA_IMM).pb(0x45); a.pb(op.SEC); a.pb(op.SBC_IMM).pb(0x05); a.brk(); d.print(a); cpu.resume(); assertEquals(0x40, cpu.a); assertTrue(!cpu.p.n && !cpu.p.v && !cpu.p.z && cpu.p.c); sys.println("\n===== SBC, Overflow set?"); a.pb(op.SEC); a.pb(op.LDA_IMM).pb(0x80); a.pb(op.SBC_IMM).pb(0x01); a.brk(); d.print(a); cpu.resume(); assertTrue(cpu.p.v); sys.println("\n===== SBC, Overflow clear?"); a.pb(op.SEC); a.pb(op.LDA_IMM).pb(0x81); a.pb(op.SBC_IMM).pb(0xff); a.brk(); d.print(a); cpu.resume(); assertTrue(!cpu.p.v); sys.println("\n===== SBC, check N, V flags"); a.pb(op.SEC); a.pb(op.LDA_IMM).pb(0x75); a.pb(op.SBC_IMM).pb(0x85); a.brk(); d.print(a); cpu.resume(); assertEquals(0xf0, cpu.a); assertTrue(cpu.p.n && cpu.p.v && !cpu.p.z && !cpu.p.c); sys.println("\n==== SBC, check clear of V flag"); a.pb(op.SEC); a.pb(op.LDA_IMM).pb(0xf0); a.pb(op.SBC_IMM).pb(0x10); a.brk(); d.print(a); cpu.resume(); assertEquals(0xe0, cpu.a); assertTrue(cpu.p.n && !cpu.p.v && !cpu.p.z && cpu.p.c); sys.println("\n===== SBC, check carry off"); a.pb(op.SEC); a.pb(op.LDA_IMM).pb(0x00); a.pb(op.SBC_IMM).pb(0x01); a.brk(); d.print(a); cpu.resume(); assertEquals(0xff, cpu.a); // Carry clear assertTrue(cpu.p.n && !cpu.p.v && !cpu.p.z && !cpu.p.c); sys.println("\n===== SBC, check carry on"); a.pb(op.SBC_IMM).pb(0x01); a.brk(); d.print(a); cpu.resume(); assertEquals(0xfd, cpu.a); // Carry set sys.println("\n===== SBC, check 16-bit subtraction"); a.pb(op.LDA_IMM).pb(0x22); a.pb(op.STA_ZP).pb(0xa0); a.pb(op.LDA_IMM).pb(0x33); a.pb(op.STA_ZP).pb(0xa1); a.pb(op.LDA_IMM).pb(0x12); a.pb(op.STA_ZP).pb(0xa2); a.pb(op.LDA_IMM).pb(0x10); a.pb(op.STA_ZP).pb(0xa3); a.pb(op.SEC); a.pb(op.LDA_ZP).pb(0xa0); a.pb(op.SBC_ZP).pb(0xa2); a.pb(op.STA_ZP).pb(0xa4); a.pb(op.LDA_ZP).pb(0xa1); a.pb(op.SBC_ZP).pb(0xa3); a.pb(op.STA_ZP).pb(0xa5); a.pb(op.LDX_ZP).pb(0xa4); a.pb(op.LDY_ZP).pb(0xa5); a.brk(); d.print(a); cpu.resume(); sys.nl(); mmu.print(0xa0, 0xa5); assertEquals(0x10, cpu.x); assertEquals(0x23, cpu.y); sys.println("\n===== SBC, check BCD"); a.pb(op.SED); a.pb(op.SEC); a.pb(op.LDA_IMM).pb(0x90); a.pb(op.SBC_IMM).pw(0x01); a.brk(); d.print(a); cpu.resume(); assertEquals(0x89, cpu.a); sys.println("\n===== SBC, check BCD overflow"); a.pb(op.SED); a.pb(op.LDA_IMM).pb(0x01); a.pb(op.SBC_IMM).pb(0x02); a.brk(); d.print(a); cpu.resume(); assertEquals(0x99, cpu.a); assertTrue(cpu.p.v); // Clear BCD Mode a.pb(op.CLD); sys.println("\n===== SBC, Zero Page, X"); a.pb(op.LDA_IMM).pb(0x04); a.pb(op.STA_ZP).pb(0x15); a.pb(op.LDA_IMM).pb(0x38); a.pb(op.LDX_IMM).pb(0x05); a.pb(op.SEC); a.pb(op.SBC_ZPX).pb(0x10); a.brk(); d.print(a); cpu.resume(); assertEquals(0x34, cpu.a); sys.println("\n===== SBC, Absolute"); a.pb(op.LDA_IMM).pb(0x06); a.pb(op.STA_ABS).pw(0x8000); a.pb(op.SEC); a.pb(op.LDA_IMM).pb(0x77); a.pb(op.SBC_ABS).pw(0x8000); a.brk(); d.print(a); cpu.resume(); assertEquals(0x71, cpu.a); sys.println("\n===== SBC, Absolute X"); a.pb(op.LDA_IMM).pb(0x02); a.pb(op.STA_ABS).pw(0x8033); a.pb(op.LDA_IMM).pb(0x80); a.pb(op.LDX_IMM).pb(0x33); a.pb(op.SEC); a.pb(op.SBC_ABX).pw(0x8000); a.brk(); d.print(a); cpu.resume(); assertEquals(0x7e, cpu.a); sys.println("\n===== SBC, Absolute Y"); a.pb(op.LDA_IMM).pb(0x03); a.pb(op.STA_ABS).pw(0x8044); a.pb(op.LDA_IMM).pb(0x80); a.pb(op.LDY_IMM).pb(0x44); a.pb(op.SEC); a.pb(op.SBC_ABY).pw(0x8000); a.brk(); d.print(a); cpu.resume(); assertEquals(0x7d, cpu.a); sys.println("\n===== SBC, Indirect X"); a.pb(op.SEC); a.pb(op.LDA_IMM).pb(0x03); a.pb(op.STA_ABS).pw(0xee12); a.pb(op.LDA_IMM).pb(0x12); a.pb(op.STA_ZP).pb(0xba); a.pb(op.LDA_IMM).pb(0xee); a.pb(op.STA_ZP).pb(0xbb); a.pb(op.LDX_IMM).pb(0x06); a.pb(op.LDA_IMM).pb(0x55); a.pb(op.SBC_IZX).pb(0xb4); a.brk(); d.print(a); cpu.resume(); assertEquals(0x52, cpu.a); sys.println("\n===== SBC, Indirect Y"); a.pb(op.LDA_IMM).pb(0xee); a.pb(op.STA_ZP).pb(0xb4); a.pb(op.LDA_IMM).pb(0x12); a.pb(op.STA_ZP).pb(0xb5); a.pb(op.LDA_IMM).pb(0x03); a.pb(op.STA_ABS).pw(0x12f4); a.pb(op.LDA_IMM).pb(0x66); a.pb(op.LDY_IMM).pb(0x06); a.pb(op.SEC); a.pb(op.SBC_IZY).pb(0xb4); a.brk(); d.print(a); cpu.resume(); assertEquals(0x63, cpu.a); }