mirror of
https://github.com/ivanizag/izapple2.git
synced 2024-12-21 02:32:06 +00:00
82 lines
1.7 KiB
Go
82 lines
1.7 KiB
Go
package izapple2
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
/*
|
|
See:
|
|
https://github.com/davidgiven/cpm65
|
|
*/
|
|
|
|
type traceCpm struct {
|
|
a *Apple2
|
|
skipConsole bool
|
|
}
|
|
|
|
const (
|
|
cpmBdosEntrypoint uint16 = 0x0005
|
|
)
|
|
|
|
func newTraceCpm(skipConsole bool) *traceCpm {
|
|
var t traceCpm
|
|
t.skipConsole = skipConsole
|
|
return &t
|
|
}
|
|
|
|
func (t *traceCpm) connect(a *Apple2) {
|
|
t.a = a
|
|
}
|
|
|
|
func (t *traceCpm) inspect() {
|
|
if !t.a.dmaActive {
|
|
return // The 6502 is not running
|
|
}
|
|
|
|
softCard, ok := t.a.cards[t.a.dmaSlot].(*CardZ80SoftCard)
|
|
if !ok {
|
|
return // The DMA slot is not a Z80 SoftCard
|
|
}
|
|
|
|
pc := softCard.cpu.PC
|
|
|
|
if pc == cpmBdosEntrypoint {
|
|
command := softCard.cpu.BC.Lo
|
|
switch command {
|
|
case 2: // C_WRITE
|
|
if !t.skipConsole {
|
|
ch := softCard.cpu.DE.Lo
|
|
fmt.Printf("CPM BDOS call %s from $%04x with \"%c\"\n",
|
|
bdosCodeToName(command), pc, ch)
|
|
}
|
|
default:
|
|
fmt.Printf("CPM BDOS call %s\n", bdosCodeToName(command))
|
|
}
|
|
}
|
|
}
|
|
|
|
func bdosCodeToName(code uint8) string {
|
|
if code < uint8(len(bdosCommandNames)) {
|
|
return fmt.Sprintf("%02v-%s", code, bdosCommandNames[code])
|
|
}
|
|
return fmt.Sprintf("%02v-UNKNOWN", code)
|
|
}
|
|
|
|
var bdosCommandNames = []string{
|
|
// 0
|
|
"P_TERMCPM", "C_READ", "C_WRITE", "A_READ", "A_WRITE",
|
|
"L_WRITE", "C_RAWIO", "A_STATIN", "A_STATOUT", "C_WRITESTR",
|
|
// 10
|
|
"C_READSTR", "C_STAT", "S_BDOSVER", "DRV_ALLRESET", "DRV_SET",
|
|
"F_OPEN", "F_CLOSE", "F_SFIRST", "F_SNEXT", "F_DELETE",
|
|
// 20
|
|
"F_READ", "F_WRITE", "F_MAKE", "F_RENAME", "DRV_LOGINVEC",
|
|
"DRV_GET", "F_DMAOFF", "DRV_ALLOCVEC", "DRV_SETRO", "DRV_ROVEC",
|
|
// 30
|
|
"F_ATTRIB", "DRV_DPB", "F_USERNUM", "F_READRAND", "F_WRITERAND",
|
|
"F_SIZE", "F_RANDREC", "DRV_RESET", "*", "",
|
|
// 40
|
|
"F_WRITEZ", "", "", "", "",
|
|
"F_ERRMODE", "", "", "", "",
|
|
}
|