diff --git a/traceApplecorn.go b/traceApplecorn.go index cec4f90..38b3963 100644 --- a/traceApplecorn.go +++ b/traceApplecorn.go @@ -29,8 +29,10 @@ type mosCallData struct { } const ( - applecornKernelStart uint16 = 0xd000 // Code above this is out of BBC territory - applecornNoCaller uint16 = 0xffff + applecornKernelStart uint16 = 0xc000 // Code above this is out of BBC territory + applecornTraceAreaStart uint16 = 0xd000 + applecornNoCaller uint16 = 0xffff + applecornRomTitle uint16 = 0x8009 ) func newTraceApplecorn(a *Apple2, skipConsole bool) *traceApplecorn { @@ -64,18 +66,49 @@ func (t *traceApplecorn) inspect() { pc, sp := t.a.cpu.GetPCAndSP() if pc == 0x8000 { + activeROM := t.getTerminatedString(applecornRomTitle, 0) regA, _, _, _ := t.a.cpu.GetAXYP() - fmt.Printf("BBC MOS call to $%04x LANGUAGE(%02x)\n", pc, regA) + fmt.Printf("BBC MOS call to $%04x LANGUAGE(ROM=\"%s\", A=%02x)\n", pc, activeROM, regA) } else if pc == 0x8003 { - regA, _, regY, _ := t.a.cpu.GetAXYP() - address := t.a.mmu.peekWord(0xf2 + uint16(regY)) - command := t.getTerminatedString(address, 0x0d) - fmt.Printf("BBC MOS call to $%04x SERVICE(A=%v, \"%s\")\n", pc, regA, command) + activeROM := t.getTerminatedString(applecornRomTitle, 0) + service, _, regY, _ := t.a.cpu.GetAXYP() + switch service { + case 4: // OSCLI + address := t.a.mmu.peekWord(0xf2 + uint16(regY)) + command := t.getTerminatedString(address, 0x0d) + fmt.Printf("BBC MOS call to $%04x SERVICE_OSCLI(ROM=\"%s\", A=%v, \"%s\")\n", + pc, activeROM, service, command) + case 6: // Error + address := t.a.mmu.peekWord(0xfd) + faultNumber := t.a.mmu.Peek(address) + faultMessage := address + 1 + faultString := t.getTerminatedString(faultMessage, 0) + fmt.Printf("BBC MOS call to $%04x SERVICE_ERROR(ROM=\"%s\", A=%v, #=%v, \"%s\")\n", + pc, activeROM, service, faultNumber, faultString) + case 7: // OSBYTE + pA := t.a.mmu.Peek(0xef) + pX := t.a.mmu.Peek(0xf0) + pY := t.a.mmu.Peek(0xf1) + fmt.Printf("BBC MOS call to $%04x SERVICE_OSBYTE%02x(ROM=\"%s\", A=%v, pX=%02x, pY=%02x)\n", + pc, pA, activeROM, service, pX, pY) + case 8: // OSWORD + pA := t.a.mmu.Peek(0xef) + fmt.Printf("BBC MOS call to $%04x SERVICE_OSWORD%02x(ROM=\"%s\", A=%v)\n", + pc, pA, activeROM, service) + case 9: // *HELP + address := t.a.mmu.peekWord(0xf2 + uint16(regY)) + command := t.getTerminatedString(address, 0x0d) + fmt.Printf("BBC MOS call to $%04x SERVICE_HELP(ROM=\"%s\", A=%v, \"%s\")\n", + pc, activeROM, service, command) + default: + fmt.Printf("BBC MOS call to $%04x SERVICE(ROM=\"%s\", A=%v)\n", + pc, activeROM, service) + } } inKernel := pc >= applecornKernelStart - if !t.wasInKernel && inKernel { + if !t.wasInKernel && inKernel && pc >= applecornTraceAreaStart { regA, regX, regY, _ := t.a.cpu.GetAXYP() s := "UNKNOWN"