1
0
mirror of https://github.com/irmen/ksim65.git synced 2024-06-09 11:29:30 +00:00
ksim65/src/test/kotlin/FunctionalTestsBase.kt
2020-02-17 23:45:20 +01:00

73 lines
2.2 KiB
Kotlin

import razorvine.ksim65.Bus
import razorvine.ksim65.Cpu6502
import razorvine.ksim65.components.Ram
import kotlin.test.*
/*
Wolfgang Lorenz's 6502 test suite
See http://www.softwolves.com/arkiv/cbm-hackers/7/7114.html
*/
abstract class FunctionalTestsBase {
val cpu: Cpu6502 = Cpu6502()
val ram = Ram(0, 0xffff)
val bus = Bus()
val kernalStubs = C64KernalStubs(ram)
init {
cpu.tracing = null
cpu.addBreakpoint(0xffd2) { cpu, pc -> kernalStubs.handleBreakpoint(cpu, pc) }
cpu.addBreakpoint(0xffe4) { cpu, pc -> kernalStubs.handleBreakpoint(cpu, pc) }
cpu.addBreakpoint(0xe16f) { cpu, pc -> kernalStubs.handleBreakpoint(cpu, pc) }
// setup the irq/brk routine
for(b in listOf(0x48, 0x8A, 0x48, 0x98, 0x48, 0xBA, 0xBD, 0x04,
0x01, 0x29, 0x10, 0xF0, 0x03, 0x6C, 0x16, 0x03,
0x6C, 0x14, 0x03).withIndex()) {
ram[0xff48+b.index] = b.value.toShort()
}
bus.add(cpu)
bus.add(ram)
}
protected fun runTest(testprogram: String) {
ram.loadPrg("src/test/kotlin/6502testsuite/$testprogram", null)
ram[0x02] = 0
ram[0xa002] = 0
ram[0xa003] = 0x80
ram[Cpu6502.IRQ_vector] = 0x48
ram[Cpu6502.IRQ_vector + 1] = 0xff
ram[Cpu6502.RESET_vector] = 0x01
ram[Cpu6502.RESET_vector + 1] = 0x08
ram[0x01fe] = 0xff
ram[0x01ff] = 0x7f
ram[0x8000] = 2
ram[0xa474] = 2
bus.reset()
cpu.regSP = 0xfd
cpu.regP.fromInt(0b00100100)
try {
while (cpu.totalCycles < 40000000L) {
bus.clock()
}
fail("test hangs: " + cpu.snapshot())
} catch (e: Cpu6502.InstructionError) {
println(">>> INSTRUCTION ERROR: ${e.message}")
} catch (le: KernalLoadNextPart) {
return // test ok
} catch (ie: KernalInputRequired) {
fail("test failed")
}
fail("test failed")
}
protected fun runTestExpectNotImplemented(testprogram: String) {
try {
runTest(testprogram)
fail("expected to crash with NotImplementedError")
} catch(nx: NotImplementedError) {
// okay!
}
}
}