mos6502 icon indicating copy to clipboard operation
mos6502 copied to clipboard

Functional Test

Open mre opened this issue 1 year ago • 6 comments

The functional test is based on https://github.com/Klaus2m5/6502_65C02_functional_tests

It does NOT pass yet. :( However, I think it's a good idea to have it in the repo nonetheless, to make some incremental improvements.

This PR is based on the asm branch, which should be merged first.

mre avatar Jun 19 '23 11:06 mre

Currently we get until here:

(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 118, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1202, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 116, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1204, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 114, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1206, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 112, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1208, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 110, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1210, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 108, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1212, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 106, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1214, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 104, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1216, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 102, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1218, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 100, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1220, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 98, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1222, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 96, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1224, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 94, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1226, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 92, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1228, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 90, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1230, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 88, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1232, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 86, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1234, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 84, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1236, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 82, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1238, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 80, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1240, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 78, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1242, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 76, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1244, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 74, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1246, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 72, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1248, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 70, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1250, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 68, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1252, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 66, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1254, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 64, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1256, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 62, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1258, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 60, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1260, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 58, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1262, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 56, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1264, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 54, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1266, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 52, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1268, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 50, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1270, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 48, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1272, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 46, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1274, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 44, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1276, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 42, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1278, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 40, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1280, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 38, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1282, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 36, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1284, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 34, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1286, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 32, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1288, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 30, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1290, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 28, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1292, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 26, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1294, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 24, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1296, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 22, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1298, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 20, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1300, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 18, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1302, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 16, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1304, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 14, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1306, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 12, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1308, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 10, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1310, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 8, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1312, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 6, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1314, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 4, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1316, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 2, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1318, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(DEX, UseImplied)
CPU { registers: Registers { accumulator: 0, index_x: 0, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1320, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS | PS_ZERO) }
(BEQ, UseRelative(3))
CPU { registers: Registers { accumulator: 0, index_x: 0, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1327, status: Status(PS_NEGATIVE | PS_UNUSED | PS_DISABLE_INTERRUPTS | PS_CARRY) }
(BEQ, UseRelative(3))
CPU { registers: Registers { accumulator: 0, index_x: 0, index_y: 129, stack_pointer: StackPointer(255), program_counter: 1047, status: Status(PS_NEGATIVE | PS_UNUSED | PS_DISABLE_INTERRUPTS | PS_CARRY) }
(DEY, UseImplied)
CPU { registers: Registers { accumulator: -128, index_x: 0, index_y: 128, stack_pointer: StackPointer(255), program_counter: 1049, status: Status(PS_NEGATIVE | PS_UNUSED | PS_DISABLE_INTERRUPTS | PS_CARRY) }
(TAX, UseImplied)
CPU { registers: Registers { accumulator: -128, index_x: 128, index_y: 128, stack_pointer: StackPointer(255), program_counter: 1052, status: Status(PS_NEGATIVE | PS_UNUSED | PS_DISABLE_INTERRUPTS | PS_CARRY) }
(CLC, UseImplied)
CPU { registers: Registers { accumulator: -126, index_x: 128, index_y: 128, stack_pointer: StackPointer(255), program_counter: 1055, status: Status(PS_NEGATIVE | PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(EOR, UseImmediate(127))
CPU { registers: Registers { accumulator: -3, index_x: 128, index_y: 128, stack_pointer: StackPointer(255), program_counter: 1060, status: Status(PS_NEGATIVE | PS_UNUSED | PS_DISABLE_INTERRUPTS) }
(LDA, UseImmediate(0))
CPU { registers: Registers { accumulator: 0, index_x: 128, index_y: 128, stack_pointer: StackPointer(255), program_counter: 1191, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS | PS_ZERO) }
(BEQ, UseRelative(65533))
CPU { registers: Registers { accumulator: 0, index_x: 127, index_y: 128, stack_pointer: StackPointer(255), program_counter: 1191, status: Status(PS_UNUSED | PS_DISABLE_INTERRUPTS) }
Infinite loop detected!

I don't know what's the issue yet.

mre avatar Jun 19 '23 11:06 mre

I don't know what's the issue yet.

It could it decimal arithmetic on invalid input BCD. As far as I know, that's the only issue solid65 finds with mre/6502.

As far as I can see, the functional test has some kind of conditional compilation to enable/disable decimal mode tests. Does the test pass if you disable this?

EDIT: Oh wait a minute, that debug log shows the decimal mode is not enabled (no PS_DECIMAL). So then I don't know what the probelm is. But I would have expected solid65 to pick up on it.

omarandlorraine avatar Jun 19 '23 11:06 omarandlorraine

Do you know why I'm seeing this message? function decimal_subtract_test is never used

No idea. I don't get that message. Is that when you compile the project?

mre avatar Jun 29 '23 08:06 mre

Do you know why I'm seeing this message? function decimal_subtract_test is never used

No idea. I don't get that message. Is that when you compile the project?

No, it's in the code review area on Github. But I can't find it again now 🤷

EDIT: Oh here it is. On line 1044 of cpu.rs.

Check warning on line 1045 in src/cpu.rs GitHub Actions / test (ubuntu-latest)

function decimal_subtract_test is never used

There's also one for MacOS-latest and windows-latest. Similarly, further up for decimal_add_test etc.

omarandlorraine avatar Jun 29 '23 09:06 omarandlorraine

EDIT: Oh here it is. On line 1044 of cpu.rs.

Okay, no idea. Looks like a false-positive to me. I don't see that message if I scroll to that line.

mre avatar Jun 29 '23 09:06 mre

At some point we need to decide what to do with this here. 😆 I'm willing to ditch it or alternatively we could rebase it. Can't remember what was the state on this.

mre avatar Apr 22 '24 14:04 mre