izapple2/cardInOut.go

148 lines
2.6 KiB
Go

package izapple2
import (
"fmt"
)
/*
In out card experiment to interface with the emulator host.
See:
"Apple II Monitors peeled."
http://mysite.du.edu/~etuttle/math/acia.htm
*/
type cardInOut struct {
cardBase
i int
}
func (c *cardInOut) assign(a *Apple2, slot int) {
for i := uint8(0x0); i <= 0xf; i++ {
iCopy := i
c.addCardSoftSwitchR(i, func(*ioC0Page) uint8 {
value := []uint8{0xc1, 0xc1, 0x93, 0x0}[c.i%4]
c.i++
fmt.Printf("[cardInOut] Read access to softswith 0x%x for slot %v, value %x.\n", iCopy, slot, value)
//return 0x41 + 0x80
return []uint8{0x41, 0x41, 0x13}[i%3] + 0x80
}, "INOUTR")
c.addCardSoftSwitchW(i, func(_ *ioC0Page, value uint8) {
fmt.Printf("[cardInOut] Write access to softswith 0x%x for slot %v, value 0x%x.\n", iCopy, slot, value)
}, "INOUTW")
}
in := true
out := false
data := [256]uint8{
// Register
0xA9, 0xC2,
0x85, 0x37,
0x85, 0x39,
0xA9, 0x10,
0x85, 0x36,
0xA9, 0x15,
0x85, 0x38,
0x60, 0xEA,
// Out char
0x8D, 0xA1, 0xC0,
0x60, 0xEA,
// Get char
0x91, 0x28,
0xAD, 0xA0, 0xC0,
0x60,
}
if !out {
// NOP the CSWL,H change
for _, v := range []uint8{2, 3, 8, 9} {
data[v] = 0xEA
}
}
if !in {
// NOP the KSWL,H change
for _, v := range []uint8{4, 5, 12, 13} {
data[v] = 0xEA
}
}
c.romCsxx = newMemoryRangeROM(0xC200, data[0:255], "InOUt card")
if slot != 2 {
// To make it work on other slots, patch C2, A0 and A1
panic("Assert failed. Only slot 2 supported for the InOut card")
}
c.cardBase.assign(a, slot)
}
/*
The ROM code was assembled using https://www.masswerk.at/6502/assembler.html
src:
BASL = $28
CSWL = $36
CSWH = $37
KSWL = $38
KSWH = $39
* = $C200
Register:
LDA #$C2
STA *CSWH
STA *KSWH
LDA #$10
STA *CSWL
LDA #$15
STA *KSWL
RTS
NOP
OutChar:
STA $C0A1
RTS
NOP
GetChar:
STA (BASL),Y
LDA $C0A0
RTS
assembled as:
0000 BASL = 0028
0000 CSWL = 0036
0000 CSWH = 0037
0000 KSWL = 0038
0000 KSWH = 0039
* = $C200
C200 REGIST
C200 LDA #$C2 A9 C2
C202 STA *CSWH 85 37
C204 STA *KSWH 85 39
C206 LDA #$10 A9 10
C208 STA *CSWL 85 36
C20A LDA #$15 A9 15
C20C STA *KSWL 85 38
C20E RTS 60
C20F NOP EA
C210 OUTCHA
C210 STA $C0A1 8D A1 C0
C213 RTS 60
C214 NOP EA
C215 GETCHA
C215 STA (BASL),Y 91 28
C217 LDA $C0A0 AD A0 C0
C21A RTS
object code:
A9 C2 85 37 85 39 A9 10
85 36 A9 15 85 38 60 EA
8D A1 C0 60 EA 91 28 AD
A0 C0 60
*/