diff --git a/sim/verilog6502_32bit_test.py b/sim/verilog6502_32bit_test.py index da4740e..74e119c 100644 --- a/sim/verilog6502_32bit_test.py +++ b/sim/verilog6502_32bit_test.py @@ -205,3 +205,74 @@ async def test_absolute_x(dut): if dut_we: assert dut_do == expected_do + +@cocotb.test +async def test_absolute_y(dut): + cocotb.start_soon(Clock(dut.clk, CLK_PERIOD, unit="ns").start()) + cocotb.start_soon(handle_memory(dut)) + + write_dword(0xfffffff4, 0x200) + + # ldy #1 + # lda $abcd1234,y + # iny + # sta $01020304,y + # wai + write_bytes(0x200, [0xa0, 0x01]) + write_bytes(0x202, [0xb9, 0x34, 0x12, 0xcd, 0xab]) + write_bytes(0x207, [0xc8]) + write_bytes(0x208, [0x99, 0x04, 0x03, 0x02, 0x01]) + + write_byte(0x20d, 0xcb) + write_byte(0xabcd1235, 0xaa) + + dut.RDY.value = Immediate(1) + + dut.reset.value = Immediate(1) + for _ in range(10): + await RisingEdge(dut.clk) + dut.reset.value = 0 + + expected_cpu_outputs = [ + None, # ignore reset sequence + None, + None, + None, + None, + None, + None, + None, + None, + (0x00000200, False, None), # ldx #1 + (0x00000201, False, None), # Immediate + (0x00000202, False, None), # ldx $abcd1234,x + (0x00000203, False, None), # addr 0 + (0x00000204, False, None), # addr 1 + (0x00000205, False, None), # addr 2 + (0x00000206, False, None), # addr 3 + (0xabcd1235, False, None), # Read from address + (0x00000207, False, None), # inx + (0x00000208, False, None), # sta $01020304,x + (0x00000208, False, None), # store reg + (0x00000209, False, None), # addr 0 + (0x0000020a, False, None), # addr 1 + (0x0000020b, False, None), # addr 2 + (0x0000020c, False, None), # addr 3 + (0x01020306, False, None), # Write to address + (0x01020306, True, 0xaa), # Write to address + ] + + for expected_output in expected_cpu_outputs: + await RisingEdge(dut.clk) + + if expected_output: + expected_addr, expected_we, expected_do = expected_output + dut_addr = int(dut.AB.value) + dut_we = bool(dut.WE.value) + dut_do = int(dut.DO.value) + + assert dut_addr == expected_addr + assert dut_we == expected_we + + if dut_we: + assert dut_do == expected_do \ No newline at end of file