From 0c150c3ecf8eba352d5025d4da312be54149c0b1 Mon Sep 17 00:00:00 2001 From: Ivan Izaguirre Date: Mon, 25 Jan 2021 19:01:53 +0100 Subject: [PATCH] Mouse access with IN# and PR# --- README.md | 2 +- cardMouse.go | 87 +++++++++++++++++++++++------------- romdumps/romdumps_vfsdata.go | 10 +---- 3 files changed, 58 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index b688fd3..839e77c 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Portable emulator of an Apple II+ or //e. Written in Go. - Bootable Smartport / ProDOS card - VidHd, limited to the ROM signature and SHR as used by Total Replay, only for //e models with 128Kb - FASTChip, limited to what Total Replay needs to set and clear fast mode - - Mouse Card, emulates the entry points, not the softswitches. Experimental. + - Mouse Card, emulates the entry points, not the softswitches. - Host console card. Maps the host STDIN and STDOUT to PR# and IN# - Graphic modes: diff --git a/cardMouse.go b/cardMouse.go index 9a80e1a..7ce990e 100644 --- a/cardMouse.go +++ b/cardMouse.go @@ -26,8 +26,9 @@ type CardMouse struct { minX, minY, maxX, maxY uint16 mode uint8 - iIn int - i int + response string + iOut int + iIn int trace bool } @@ -36,10 +37,9 @@ type CardMouse struct { func NewCardMouse() *CardMouse { var c CardMouse c.name = "Mouse Card" - c.trace = true + c.trace = false c.maxX = 0x3ff c.maxY = 0x3ff - //c.loadRomFromResource("//Apple Mouse Interface Card ROM - 342-0270-C.bin") return &c } @@ -60,10 +60,12 @@ const ( ) func (c *CardMouse) set(field uint16, value uint8) { + // Update the card screen-holes c.a.mmu.Poke(field+uint16(c.slot), value) } func (c *CardMouse) get(field uint16) uint8 { + // Read from the card screen-holes return c.a.mmu.Peek(field /*+ uint16(c.slot)*/) } @@ -82,26 +84,53 @@ func (c *CardMouse) setMode(mode uint8) { } } +func (c *CardMouse) readMouse() (uint16, uint16, bool) { + x, y, pressed := c.a.io.mouse.ReadMouse() + xTrans := uint16(uint64(c.maxX-c.minX) * uint64(x) / 65536) + yTrans := uint16(uint64(c.maxY-c.minY) * uint64(y) / 65536) + return xTrans, yTrans, pressed +} + const mouseReponse = "10,10,+4\n" func (c *CardMouse) assign(a *Apple2, slot int) { c.addCardSoftSwitchR(0, func(*ioC0Page) uint8 { - // TODO - value := uint8(mouseReponse[c.i]) - c.i = (c.i + 1) % len(mouseReponse) - value += 0x80 - if value&0x7f == 10 { - value = 13 + 0x80 + if c.iOut == 0 { + // Create a new response + x, y, pressed := c.readMouse() + + button := 1 + if !pressed { + button += 2 + } + if !c.lastPressed { + button++ + } + + keyboard := "+" + strobed := (c.a.io.softSwitchesData[ioDataKeyboard] & (1 << 7)) == 0 + if !strobed { + keyboard = "-" + } + + c.response = fmt.Sprintf("%v,%v,%v%v\r", x, y, keyboard, button) } + value := uint8(c.response[c.iOut]) + c.iOut++ + if c.iOut == len(c.response) { + c.iOut = 0 + } + + value += 0x80 if c.trace { - fmt.Printf("[cardMouse] Read access to softswith 0x%x for slot %v, value %x.\n", 0, slot, value) + fmt.Printf("[cardMouse] IN#%v -> %02x.\n", slot, value) } return value }, "MOUSEOUT") c.addCardSoftSwitchW(1, func(_ *ioC0Page, value uint8) { if c.trace { - fmt.Printf("[cardMouse] Write access to softswith 0x%x for slot %v, value 0x%x: %v, %v.\n", 1, slot, value, value&0x7f, string(value&0x7f)) + fmt.Printf("[cardMouse] PR#%v <- %02x\n", slot, value) } if c.iIn == 0 { // We care only about the first byte @@ -122,16 +151,14 @@ func (c *CardMouse) assign(a *Apple2, slot int) { c.addCardSoftSwitchW(3, func(_ *ioC0Page, value uint8) { if c.trace { - fmt.Printf("[cardMouse] ServeMouse(0x%02v)\n", value) + fmt.Printf("[cardMouse] ServeMouse() NOT IMPLEMENTED\n") } + panic("Mouse interrupts not implemented") }, "SERVEMOUSE") c.addCardSoftSwitchW(4, func(_ *ioC0Page, value uint8) { if c.mode&mouseModeEnabled == 1 { - x, y, pressed := a.io.mouse.ReadMouse() - - xTrans := uint16(uint64(c.maxX-c.minX) * uint64(x) / 65536) - yTrans := uint16(uint64(c.maxY-c.minY) * uint64(y) / 65536) + x, y, pressed := c.readMouse() status := uint8(0) if pressed { @@ -140,30 +167,30 @@ func (c *CardMouse) assign(a *Apple2, slot int) { if c.lastPressed { status |= 1 << 6 } - if (xTrans != c.lastX) || (yTrans != c.lastY) { + if (x != c.lastX) || (y != c.lastY) { status |= 1 << 5 } - c.set(mouseXHi, uint8(xTrans>>8)) - c.set(mouseYHi, uint8(yTrans>>8)) - c.set(mouseXLo, uint8(xTrans)) - c.set(mouseYLo, uint8(yTrans)) + c.set(mouseXHi, uint8(x>>8)) + c.set(mouseYHi, uint8(y>>8)) + c.set(mouseXLo, uint8(x)) + c.set(mouseYLo, uint8(y)) c.set(mouseStatus, status) c.set(mouseMode, c.mode) if c.trace && ((status&(1<<5) != 0) || (pressed != c.lastPressed)) { fmt.Printf("[cardMouse] ReadMouse(): x: %v, y: %v, pressed: %v\n", - xTrans, yTrans, pressed) + x, y, pressed) } - c.lastX = xTrans - c.lastY = yTrans + c.lastX = x + c.lastY = y c.lastPressed = pressed } }, "READMOUSE") c.addCardSoftSwitchW(5, func(_ *ioC0Page, value uint8) { if c.trace { - fmt.Printf("[cardMouse] ClearMouse()\n") + fmt.Printf("[cardMouse] ClearMouse() NOT IMPLEMENTED\n") } c.set(mouseXHi, 0) c.set(mouseYHi, 0) @@ -172,7 +199,7 @@ func (c *CardMouse) assign(a *Apple2, slot int) { }, "CLEARMOUSE") c.addCardSoftSwitchW(6, func(_ *ioC0Page, value uint8) { if c.trace { - fmt.Printf("[cardMouse] PosMouse(0x%02v)\n", value) + fmt.Printf("[cardMouse] PosMouse() NOT IMPLEMENTED\n") } }, "POSMOUSE") @@ -182,11 +209,9 @@ func (c *CardMouse) assign(a *Apple2, slot int) { } if value == 0 { - //c.a.cpu.SetTrace(false) c.minX = uint16(c.get(mouseXLo)) + uint16(c.get(mouseXHi))<<8 c.maxX = uint16(c.get(mouseYLo)) + uint16(c.get(mouseYHi))<<8 } else if value == 1 { - //c.a.cpu.SetTrace(true) c.minY = uint16(c.get(mouseXLo)) + uint16(c.get(mouseXHi))<<8 c.maxY = uint16(c.get(mouseYLo)) + uint16(c.get(mouseYHi))<<8 } @@ -198,7 +223,7 @@ func (c *CardMouse) assign(a *Apple2, slot int) { c.addCardSoftSwitchW(8, func(_ *ioC0Page, value uint8) { if c.trace { - fmt.Printf("[cardMouse] HomeMouse(0x%02x)\n", value) + fmt.Printf("[cardMouse] HomeMouse() NOT IMPLEMENTED\n") } }, "HOMEMOUSE") @@ -215,7 +240,7 @@ func (c *CardMouse) assign(a *Apple2, slot int) { c.addCardSoftSwitchW(8, func(_ *ioC0Page, value uint8) { if c.trace { - fmt.Printf("[cardMouse] TimeData(%v)\n", value) + fmt.Printf("[cardMouse] TimeData(%v) NOT IMPLEMENTED\n", value) } }, "TIMEDATEMOUSE") diff --git a/romdumps/romdumps_vfsdata.go b/romdumps/romdumps_vfsdata.go index f377e47..88ecff8 100644 --- a/romdumps/romdumps_vfsdata.go +++ b/romdumps/romdumps_vfsdata.go @@ -19,7 +19,7 @@ var Assets = func() http.FileSystem { fs := vfsgen۰FS{ "/": &vfsgen۰DirInfo{ name: "/", - modTime: time.Date(2021, 1, 23, 23, 18, 10, 458633963, time.UTC), + modTime: time.Date(2021, 1, 25, 17, 41, 15, 529030569, time.UTC), }, "/Apple IIe Video Enhanced - 342-0265-A - 2732.bin": &vfsgen۰CompressedFileInfo{ name: "Apple IIe Video Enhanced - 342-0265-A - 2732.bin", @@ -35,13 +35,6 @@ var Assets = func() http.FileSystem { compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\xd3\x69\x6f\xd3\xca\xd7\x00\xf0\x23\x2b\x42\x16\xaa\x50\x5c\xe5\x45\x75\x15\x55\xd1\xe8\xea\xea\x51\x74\x5f\x5c\x61\x09\x5d\x5d\x45\x79\xe5\xaf\xe0\xaf\xe0\xaf\xe0\x97\x0f\x3b\x66\xdf\x17\xb3\xef\x8b\xd9\xf7\xc5\x6c\x21\x94\x52\x70\x29\x50\x02\x94\x32\x84\x10\x4a\x80\xd0\x09\xa5\x14\x53\x82\x99\xbf\xce\x9c\x5e\xf8\x10\x77\xe4\xd1\x74\xdc\x99\x33\x73\x4e\xfc\xcb\xb2\xfc\x3f\xbf\x69\x05\xd0\x33\x8c\x15\x19\x83\x6e\xc6\xf0\x81\x2c\xd3\x34\x8d\x65\x71\xce\x70\x5e\xd4\xb4\x6e\x4d\x2b\x4e\x8d\x1a\x14\x34\x4d\x9b\xc9\x0a\xc0\xd4\x36\x06\x59\x1d\x5b\x16\x72\xd8\x58\x16\x58\xe7\xf4\x69\xd3\x3b\x19\x68\xaa\x15\x81\xcd\xca\xe7\x71\x1d\x63\x7f\xe4\x67\xe2\x7a\x15\x57\xc5\x57\xf1\x70\x9e\xef\xfc\x53\xcd\x71\x5f\x96\x69\x59\x8c\x53\x54\x71\x75\x60\x53\xeb\xd5\x90\x51\xf3\x7c\x7e\x16\xc6\xcb\xe0\xd5\xd5\x88\xeb\x8a\xb9\xb4\x9e\xc2\x7b\x4e\xc3\x56\x04\xd0\x52\x7a\x3a\x07\x50\xfc\x0b\x5b\x11\x00\x33\x85\x9f\xed\xff\xff\xfd\x83\x4e\xd1\x21\x93\xc9\xa8\x79\x26\x53\xcc\x14\x33\x19\xd0\x0b\xd3\xb3\xff\xd7\xad\xc3\xb4\x3f\xd2\x7a\x6a\xe6\x5f\x90\x9a\x3e\x3d\x85\xf7\xc4\xd5\x6a\x5f\x4a\xd3\xb4\x94\x0e\x7a\x3a\x97\xcb\xa5\x75\xd0\xf3\x59\x3d\x9b\xd7\x31\x60\x71\x6a\x09\xe8\x7a\x0a\x87\xe2\xaf\x63\x75\x00\x75\x4f\x80\x2c\x9b\x99\xff\x83\x65\x41\xef\xa0\xfa\x65\x59\xae\x4b\xdd\x3f\x97\xee\xc2\xfc\xd3\x5d\x99\xce\x62\x3a\x0d\x45\xad\x5b\xd5\xf5\xef\x94\xd6\x8d\x75\x50\x79\xa6\x52\x58\x37\x7c\x70\x2c\xe4\xd2\x33\x54\xec\xa9\x9b\xa9\x73\xf1\x94\x94\x9e\x56\xc7\xe3\x05\xb0\x1a\x69\x1d\xf7\xa5\x55\xbe\xff\xf5\xdf\x9f\x6a\x83\x2d\x9b\x2b\xb0\x02\x68\x58\x5e\xd6\x0d\xa0\x32\x2c\x40\x2e\x57\x60\x8c\x15\xf0\xff\xac\xa8\x15\xa0\xeb\xf7\x54\x37\xd6\x1d\xa8\xe2\x59\x5a\xcf\x40\x87\x0e\x95\x7f\x1a\xba\xd2\xe9\x74\x67\x87\xa6\xb1\xce\x19\x9d\x4c\xbd\xc5\xf7\x00\xb3\xf2\xf9\x3c\x9e\x4c\xeb\xd5\x7e\x96\xa5\x79\xb7\xa6\x01\x14\x30\x5e\x0e\xe0\x9f\x69\x58\x0f\x3c\x3f\x9b\xeb\x86\x14\x1e\xf7\x7b\x17\x00\x66\x3c\xf3\x4f\x1a\x33\xba\x1a\xf3\xf9\x59\x38\x66\x28\x23\xa6\xee\x03\x50\x4c\xeb\xa9\x22\xfc\xdd\xd1\x31\xad\xa3\xe3\x6f\xfa\xae\x75\x5d\x9f\xd1\xd5\xf5\x57\x57\xd7\x0c\xf8\xf3\xb7\xa9\x74\xf3\x99\x7c\x26\x0f\x50\xe7\x95\x9e\x91\xa4\x2c\xe3\x26\xe7\x25\xce\x65\x8d\x73\x7c\x64\x9d\x27\x49\xc2\xeb\x38\xe7\x38\x2f\x25\x49\x2d\x49\x4a\x53\x63\x22\xcb\x49\x92\xf4\xf3\xb2\xe4\x6a\x1b\x97\xf5\x18\x5b\x5d\x56\xb1\xf1\xba\xe4\xa3\x13\x93\x13\xa3\x5c\x26\xaa\x95\x24\xef\xab\x54\x70\x1d\xe7\x43\x95\x7e\x5c\xaf\xe2\xaa\xf8\x2a\x1e\xce\x2b\xa3\x83\x6a\x8e\xfb\xea\x3c\xa9\x63\x9c\x92\x8a\x1b\x4b\x3e\xb5\x5e\x0d\x4d\x35\xaf\x54\xfa\x30\x5e\x13\xaf\xae\x46\x5c\x57\xaa\xb6\xe2\x36\xde\x73\x12\x5b\x49\xca\xa4\x1d\xb7\xaa\x52\x96\x06\xb0\x95\xa4\xc4\x4c\xe5\xcf\x36\xfb\xdf\x3f\xe8\x94\x58\x36\x9b\x4d\x35\x6f\x36\x4b\xcd\x52\xb3\x29\xe3\xf2\x44\xfd\x49\x2d\x96\x93\x43\xad\xb8\xdd\x3f\x20\xdb\x13\x13\x6d\xbc\x27\xae\x56\xfb\xda\x49\x92\xb4\x63\x19\xb7\xaa\xd5\x6a\x2b\x96\x71\xa5\x1e\xd7\x2b\x31\x06\x2c\x4d\x2d\x91\x71\xdc\xc6\xa1\xf4\xeb\xd8\x58\x4a\x75\x4f\x29\xeb\xbc\xbf\x32\xc4\xeb\x32\x1e\xa7\xfa\xd5\x79\xb5\xa1\xee\x5f\x6d\x35\x30\xff\x56\xa3\x39\x5a\x6a\xb5\x64\x29\xa9\xa9\xba\xf6\xb6\x93\x1a\xd6\x41\xe5\xd9\x6e\x63\xdd\xf0\xc1\xb1\x5c\x6d\x8d\xa9\xd8\x53\x37\x53\xe7\xe2\x29\xed\xb8\xa5\x8e\xc7\x0b\x60\x35\x5a\x31\xee\x6b\xa9\x7c\xff\xeb\xbf\x3f\xd5\x06\x5b\xbd\x5a\xe6\x65\x99\x60\x79\x79\x4d\x4a\x95\x61\x59\x56\xab\x65\xce\x79\x19\xff\xcf\x4b\x49\x59\x36\x86\xdb\x35\xac\xbb\xa4\x8a\xd7\x69\x3d\x97\xb1\x1c\x57\xf9\xb7\x64\xa3\xd5\x6a\x8d\x8e\x27\x09\x1f\x1d\x1b\xe5\xea\x2d\xbe\x97\xb2\xaf\x52\xa9\xe0\xc9\xb4\x5e\xed\xe7\x75\x9a\xd7\x92\x44\xca\x32\xc6\xab\x4a\xd9\x33\x89\xf5\xc0\xf3\xeb\xd5\x9a\x6c\xe3\x71\xc3\x0d\x29\x31\xe3\xfe\x41\x1a\x9b\xb1\x1a\x2b\x95\x3e\x1c\x9b\x94\x11\x57\xf7\x91\xb2\xd4\x8a\xdb\x25\xd9\x3b\x3e\x3e\x39\x3e\xde\x4b\xdf\x75\x1c\xc7\x63\x8d\xc6\x40\xa3\x31\x26\x07\x47\xa6\xd2\xad\x34\x2b\xcd\xca\xaf\x42\xfc\xf8\x21\xc2\x1f\x3f\xa4\x4c\x12\xee\xe2\xf1\xdf\xbf\x47\xe6\xf7\xef\x52\xb6\xdb\xa1\xc0\x74\xbf\x7d\x0b\x82\x6f\xdf\xa4\x9c\x9c\xf4\x9d\xc9\x49\x29\xbf\x7e\xf5\xd8\xd7\xaf\xf8\x6d\xbb\x1c\xbf\xf3\x2f\x5f\x1c\xff\xcb\x17\x29\x27\x26\x6c\x7b\x62\x42\xca\xcf\x9f\x2d\xe3\xf3\x67\x29\xc7\xc7\xcd\x68\x7c\x5c\xca\x4f\x9f\x98\xf7\xe9\x93\x94\x63\x63\x86\x35\x36\x26\xe5\xc7\x8f\x00\x1f\x3f\x4a\xd9\x6a\x61\x17\xa1\x10\xd4\x47\x47\xb9\x3b\x3a\x2a\xc2\x0f\x1f\x22\xf3\xc3\x07\x11\x36\x9b\xa1\x68\x36\x45\xf8\xfe\x7d\x10\xbc\x7f\x2f\xc2\x77\xef\x7c\xe7\xdd\x3b\x11\xbe\x7d\xeb\xb1\xb7\x6f\x45\xd8\x68\xb8\xbc\xd1\x10\xe1\x9b\x37\x8e\xff\xe6\x8d\x08\x47\x46\x6c\x7b\x64\x44\x84\xaf\x5f\x5b\xc6\xeb\xd7\x22\xac\xd7\xcd\xa8\x5e\x17\xe1\xab\x57\xcc\x7b\xf5\x4a\x84\xb5\x9a\x61\xd5\x6a\x22\x7c\xf9\x12\xe0\xe5\x4b\x11\x62\xc5\xab\x55\xee\xbe\x78\x21\xc2\x17\x2f\xb8\xcb\x39\xf5\xe7\xcf\x23\xf3\xf9\x73\xee\x0e\x0f\x87\x62\x78\x98\xbb\xcf\x9e\x05\xc1\xb3\x67\xdc\x1d\x1a\xf2\x9d\xa1\x21\xee\x3e\x7d\xea\xb1\xa7\x4f\xb9\xfb\xe4\x89\xcb\x9f\x3c\xe1\xee\xe3\xc7\x8e\xff\xf8\x31\x77\x2b\x15\xdb\xae\x54\xb8\xfb\xe8\x91\x65\x3c\x7a\xc4\xdd\xc1\x41\x33\x1a\x1c\xe4\xee\xc3\x87\xcc\x7b\xf8\x90\xbb\x0f\x1e\x18\xd6\x83\x07\xdc\xbd\x7f\x1f\xe0\xfe\x7d\xee\x0e\x0c\x48\x39\x30\x10\x99\xf7\xee\x89\xf0\xde\xbd\xc8\xec\xef\xe7\x6e\x7f\x7f\x64\x46\x11\xf5\xbb\x77\x43\x71\xf7\x6e\x64\xde\xb9\x13\x04\x77\xee\x44\x66\x5f\x9f\xef\xf4\xf5\x45\xe6\xed\xdb\x1e\xbb\x7d\x3b\x32\x7b\x7b\x5d\xde\xdb\x1b\x99\xb7\x6e\x39\xfe\xad\x5b\x91\xd9\xd3\x63\xdb\x3d\x3d\x91\x79\xf3\xa6\x65\xdc\xbc\x19\x99\xe5\xb2\x19\x95\xcb\x91\x79\xe3\x06\xf3\x6e\xdc\x88\xcc\x52\xc9\xb0\x4a\xa5\xc8\xbc\x7e\x1d\xe0\xfa\xf5\xc8\xbc\x76\x4d\xca\x6b\xd7\x42\x71\xf5\xaa\x08\xaf\x5e\x0d\xc5\x95\x2b\xdc\xbd\x72\x25\x14\x97\x2f\x47\xe6\xe5\xcb\xa1\x08\x43\xea\x97\x2e\x05\xc1\xa5\x4b\xa1\xb8\x78\xd1\x77\x2e\x5e\x0c\xc5\x85\x0b\x1e\xbb\x70\x21\x14\xe7\xcf\xbb\xfc\xfc\xf9\x50\x9c\x3b\xe7\xf8\xe7\xce\x85\xe2\xec\x59\xdb\x3e\x7b\x36\x14\x67\xce\x58\xc6\x99\x33\xa1\x38\x7d\xda\x8c\x4e\x9f\x0e\xc5\xa9\x53\xcc\x3b\x75\x2a\x14\x27\x4f\x1a\xd6\xc9\x93\xa1\x38\x71\x02\xe0\xc4\x89\x50\x1c\x3f\x2e\xe5\xf1\xe3\x41\x70\xec\x98\x08\x8f\x1d\x0b\x82\xa3\x47\xb9\x7b\xf4\x68\x10\x1c\x39\x12\x99\x47\x8e\x04\xc1\xe1\xc3\xa1\x38\x7c\x38\xf8\xd9\x0e\x1d\xf2\x9d\x43\x87\x82\xe0\xe0\x41\x8f\x1d\x3c\x18\x04\x07\x0e\xb8\xfc\xc0\x81\x20\xd8\xbf\xdf\xf1\xf7\xef\x0f\x82\x7d\xfb\x6c\x7b\xdf\xbe\x20\xd8\xbb\xd7\x32\xf6\xee\x0d\x82\x3d\x7b\xcc\x68\xcf\x9e\x20\xd8\xbd\x9b\x79\xbb\x77\x07\xc1\xae\x5d\x86\xb5\x6b\x57\x10\xec\xdc\x09\xb0\x73\x67\x10\xec\xd8\x21\xe5\x8e\x1d\xbe\xb3\x7d\xbb\x08\xb7\x6f\xf7\x9d\x6d\xdb\xb8\xbb\x6d\x9b\xef\x6c\xdd\x1a\x99\x5b\xb7\xfa\xce\x96\x2d\xa1\xd8\xb2\xc5\x77\x36\x6f\x0e\x82\xcd\x9b\x7d\xc7\xf7\xa9\x6f\xda\xe4\xb1\x4d\x9b\x7c\x67\xe3\x46\x97\x6f\xdc\xe8\x3b\x1b\x36\x38\xfe\x86\x0d\xbe\xb3\x7e\xbd\x6d\xaf\x5f\xef\x3b\xeb\xd6\x59\xc6\xba\x75\xbe\xb3\x76\xad\x19\xad\x5d\xeb\x3b\x6b\xd6\x30\x6f\xcd\x1a\xdf\x59\xbd\xda\xb0\x56\xaf\xf6\x9d\x55\xab\x00\x56\xad\xf2\x9d\x95\x2b\xa5\x5c\xb9\xd2\x63\x2b\x56\x88\x70\xc5\x0a\x8f\x2d\x5f\xce\xdd\xe5\xcb\x3d\xb6\x6c\x59\x64\x2e\x5b\xe6\xb1\xa5\x4b\x43\xb1\x74\xa9\xc7\x96\x2c\x09\x82\x25\x4b\x3c\xb6\x78\xb1\xef\x2c\x5e\xec\x31\xcf\xa3\xbe\x68\x91\xcb\x17\x2d\xf2\xd8\xc2\x85\x8e\xbf\x70\xa1\xc7\x16\x2c\xb0\xed\x05\x0b\x3c\x36\x7f\xbe\x65\xcc\x9f\xef\xb1\x79\xf3\xcc\x68\xde\x3c\x8f\xcd\x9d\xcb\xbc\xb9\x73\x3d\x36\x67\x8e\x61\xcd\x99\xe3\xb1\xd9\xb3\x01\x66\xcf\xf6\x18\xe9\x77\x39\xf9\x77\x39\xf9\x77\x39\xf9\x77\x39\xf9\x77\x39\xf9\x77\x39\xf9\x77\x39\xf9\x47\xfb\xd4\xc9\xbf\xcb\xc9\xbf\xcb\xc9\xbf\xcb\xc9\xbf\xcb\xc9\xbf\xcb\xc9\xbf\xcb\xc9\xbf\xcb\xc9\xbf\xe3\x93\x7f\xc7\x27\xff\x8e\x4f\xfe\x1d\x9f\xfc\x3b\x3e\xf9\x77\x7c\xf2\xef\xf8\xe4\xdf\xf1\xc9\x3f\xda\xa7\x4e\xfe\x1d\x9f\xfc\x3b\x3e\xf9\x77\x7c\xf2\xef\xf8\xe4\xdf\xf1\xc9\xbf\xe3\x93\x7f\xdb\x26\xff\xb6\x4d\xfe\x6d\x9b\xfc\xdb\x36\xf9\xb7\x6d\xf2\x6f\xdb\xe4\xdf\xb6\xc9\xbf\x6d\x93\x7f\xdb\x26\xff\x68\x9f\x3a\xf9\xb7\x6d\xf2\x6f\xdb\xe4\xdf\xb6\xc9\xbf\x6d\x93\x7f\xdb\x26\xff\x96\x41\xfe\x2d\x83\xfc\x5b\x06\xf9\xb7\x0c\xf2\x6f\x19\xe4\xdf\x32\xc8\xbf\x65\x90\x7f\xcb\x20\xff\x96\x41\xfe\x2d\x83\xfc\xa3\x7d\xea\xe4\xdf\x32\xc8\xbf\x65\x90\x7f\xcb\x20\xff\x96\x41\xfe\xcd\x88\xfc\x9b\x11\xf9\x37\x23\xf2\x6f\x46\xe4\xdf\x8c\xc8\xbf\x19\x91\x7f\x33\x22\xff\x66\x44\xfe\xcd\x88\xfc\x9b\x11\xf9\x37\x23\xf2\x8f\xf6\xa9\x93\x7f\x33\x22\xff\x66\x44\xfe\xcd\x88\xfc\x33\x8f\xfc\x33\x8f\xfc\x33\x8f\xfc\x33\x8f\xfc\x33\x8f\xf4\x33\x8f\xfc\x33\x8f\xfc\x33\x8f\xfc\x33\x8f\xfc\x33\x8f\xfc\x33\x8f\xfc\x33\x8f\xfc\xa3\x7d\xea\xe4\x9f\x79\xe4\x9f\x79\xe4\xdf\xb0\xc8\xbf\x61\x91\x7f\xc3\x22\xff\x86\x45\xfe\x0d\x8b\xfc\x1b\x16\xf9\x37\x2c\xf2\x6f\x58\xe4\xdf\xb0\xc8\xbf\x61\x91\x7f\xc3\x22\xff\x86\x45\xfe\x0d\x8b\xfc\xa3\x7d\xea\xe4\xdf\xb0\xc8\x3f\x00\xf9\x07\x20\xff\x00\xe4\x1f\x80\xfc\x03\x90\x7f\x00\xf2\x0f\x40\xfe\x01\xc8\x3f\x00\xf9\x07\x20\xff\x00\xe4\x1f\x80\xfc\x03\x90\x7f\x00\xf2\x8f\xf6\xa9\xff\x2f\x00\x00\xff\xff\xf1\x86\x6a\x81\x00\x10\x00\x00"), }, - "/Apple Mouse Interface Card ROM - 342-0270-C.bin": &vfsgen۰CompressedFileInfo{ - name: "Apple Mouse Interface Card ROM - 342-0270-C.bin", - modTime: time.Date(2021, 1, 23, 23, 18, 10, 458633963, time.UTC), - uncompressedSize: 2048, - - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x54\x5d\x88\x13\x57\x1b\x9e\x99\x64\xce\x24\x43\xdc\xcd\xfa\x03\x91\x4f\xbf\x46\x69\x71\x67\x69\x25\x37\xda\x53\x28\xee\x42\x5b\x7a\x0c\xd8\xc6\xfe\x0a\xde\xa4\x57\x1d\x85\x42\x2e\x5a\xd8\xab\x9a\xcd\x9a\xd2\x2e\x8d\x4c\xe9\x45\x37\x2d\x03\xe9\x62\x20\x67\xeb\xac\xb1\x5b\xda\x89\xec\xc0\x51\x2b\x18\xcb\xea\xc1\x0b\x5b\x90\x5a\xd3\xd5\xad\xae\x3f\x7b\xd4\x58\xa2\x69\x99\x72\x26\xa9\xab\xec\x1f\x3d\x30\xc9\x99\x33\x33\xef\xf3\x3e\xef\xf3\xbc\xef\xd3\xbb\xdc\xd4\xff\xa0\x11\xb1\x13\x6b\xc4\x68\xbd\x5e\xaf\x0b\xe3\x3f\x7e\x75\x90\x0c\xfd\x3a\x81\xd8\xeb\xb5\xe9\x1b\x81\xfe\x5c\x43\x41\xc3\x68\x08\x45\x77\xb9\x47\x1d\x41\x1c\x0d\xa8\xaa\xaa\x76\x97\xac\x86\x72\xa0\xa1\x20\x1c\x48\xbd\x6b\xec\x28\xbf\xa9\x89\x41\x66\x42\x80\x25\xda\xa7\x75\x06\x0d\xba\xc5\x75\x2b\x83\x44\x6b\xe6\x07\x09\xde\x96\xcf\x90\xca\x20\x09\xfa\xf3\x83\xa4\x92\x21\xda\xb1\xf5\xb6\x9c\xcf\x10\x9d\xa9\x7b\x8d\x0f\xf4\x51\xbd\xa4\x77\x27\x23\x49\x4d\x0c\x26\x79\x84\x0e\xd3\x96\xb1\x88\x28\xc1\x21\xbe\x93\x68\x1d\xc7\xf8\x39\xe0\x77\x02\x62\xa5\x6a\xb8\x7c\xce\x84\x8a\x31\x83\xfd\xf4\x3a\xee\xa3\xa7\x0f\x02\x9c\xcc\x82\x28\x10\xf6\x03\x2f\x43\x9e\x60\x09\x47\x69\x15\xa7\xe8\x49\x84\x0b\xb4\xa4\x75\x06\xcb\xf4\x28\x26\xf4\x7b\x2c\xd1\x1f\x46\x7c\x30\xe9\xba\xee\x79\xd7\x75\xc5\x61\x54\x04\xa8\xa8\xa0\x8f\x14\xbc\x29\x0b\xa2\xbb\xfe\x2a\x08\x47\x00\x03\xd1\x9b\x7f\x9f\xa2\x7f\xea\x59\x45\xcf\x02\xbd\x44\x77\x1f\x63\xec\xc6\x95\xc9\xd9\x7b\x77\xaf\xe4\x4e\xcc\xb2\xfb\x77\xae\xfd\x71\xb5\x5e\x38\x52\xb1\xc7\x0b\xbf\xdf\x2f\x78\x0f\x0b\x27\x66\x6f\xb2\x7b\xf5\x2b\x77\x0e\x15\xaa\xb7\xa6\xc6\x72\xb9\xe3\xb5\xa9\xab\x37\x6b\xb7\x0e\x4f\xd6\xee\x5c\xbf\x7b\x78\xb2\x36\xf5\x53\xed\x7e\x4e\xe0\xfc\x6f\xb7\xf9\xc7\x42\x2c\x4d\x83\x58\x30\x6d\x19\xb1\xe9\xa4\x03\x15\xad\x33\x18\x35\xa1\x32\x84\x10\x42\x78\x14\x39\x10\xa0\x56\x15\x04\xc4\x4e\xe2\x71\x64\xf5\xfb\x23\xc6\x0d\x3c\x81\xac\x86\x3f\x62\x4c\xe1\x01\xf4\x21\x04\x86\x6c\xf5\xcb\xe5\xf3\x43\x08\xff\xd2\x7e\x5b\x44\xf4\x0b\x07\x82\x5c\xbf\xcc\x79\x2e\xb5\x8e\xb7\x40\xfb\xda\xa0\xb8\x8b\x6e\xc2\xff\x9f\x8b\xb2\xd3\x1a\x6f\x56\x01\xdd\x60\xad\x25\xb1\xa6\xb5\x96\x84\x9b\xde\x0e\xef\xa3\x02\xc2\x89\xb9\xdc\xb4\x56\x11\x87\x11\x8e\x66\x95\x82\xb0\x1f\x60\xe1\x33\x70\x8a\x36\xa7\x95\xa2\x52\xed\xa3\xb7\xf5\x52\x31\x80\xb0\xc0\xd6\xb9\x8f\xf1\x57\x59\xba\xcd\xfe\x6a\x92\x8e\x61\x31\x47\x7b\x73\x97\x7a\xad\xb7\x89\xf5\x06\xb1\x5e\x23\x56\x82\xcc\x64\x41\x56\xc9\x06\xa6\x01\xed\x98\x56\x68\x68\x3a\x50\x0c\x54\x45\x43\x2d\x3f\x11\xe8\x0e\x74\x63\xa1\x28\x58\xee\xd9\x4a\x86\xc4\x67\x66\xca\x17\xda\xdb\xa2\x30\x53\x3e\xab\x67\x03\x2d\xf1\xf0\x14\x2d\x5a\x3b\x89\xf5\x16\x89\x18\x9f\xcf\xe7\x7f\xcc\x81\xa0\x1a\xa5\x00\xef\xdb\x23\xa6\x44\xbb\x92\x21\xb1\x66\x65\x80\xfb\x76\x80\x60\x37\x9f\x26\x95\x01\xee\xdb\x01\xe2\x40\xc0\xef\x32\x24\x18\xe5\x6e\xce\x90\x70\x53\xfb\x2d\x9f\x21\xa9\x17\x79\x84\x18\xdd\xc2\x89\xf8\x4d\xdb\x67\x42\xd9\x84\x7e\xf6\xd4\x22\x05\x7f\x94\x3f\xcb\xb4\xd9\xcf\x3c\x84\x14\x1e\x81\xac\x64\x88\x1a\x7e\x50\x49\x13\x13\x02\x0e\x1c\x6e\x01\xab\xb1\x07\x3c\xc8\x6c\x3e\x43\x1c\x1b\x68\xb7\xd7\x43\x60\xda\x40\xeb\xa0\xdf\x7a\xd1\xb0\x84\xe8\x97\xcb\xa8\x3e\xb7\x4e\x5c\x7e\x96\x3e\x83\x95\x93\x5b\xd9\xa6\xec\x56\xbd\x9a\x63\xef\x6b\x62\x30\xed\xb9\x01\xef\x47\x0e\x54\xe2\x38\x5d\x16\xd5\x39\xa5\x7b\x2f\x3f\x47\x7f\xc6\x72\x16\x72\xe3\x88\x74\xb5\xae\xeb\x3a\xc7\xf5\x71\xf6\xd0\x6f\x42\x99\x3d\xef\x3d\xfa\x37\xca\xd7\x08\x87\x11\x0e\xd1\xd8\x7c\xfe\xb1\x2e\x96\xde\x5b\xfe\xc4\xf8\xae\x95\xb8\x88\x68\x2d\x89\x89\x69\x83\x4f\x37\x4a\x58\x6d\x03\x9e\xf1\x10\x64\x5e\x83\x25\x8b\x84\x16\x2e\xd1\x45\x08\xe8\x05\xdd\xb4\x81\x6e\x42\x59\x37\xa1\x5f\x37\x6d\x7e\xf9\x22\x46\xde\x75\xdd\x53\x9e\xeb\x57\xa2\x09\xdb\xe7\xd8\xfe\xd1\xe1\x82\x4c\xdf\x1b\x6b\x28\xf8\x49\x34\x01\xfd\x0e\x94\x47\x87\x0b\x21\xba\x9b\x9f\xbc\x80\x2c\x81\xa8\x01\xc7\x06\x3d\x3d\x3d\x9a\x6f\xbb\x0f\xee\x11\xba\x47\x84\x42\x98\xee\xc0\xb9\x5c\x97\x84\x70\x17\xe2\x16\x5f\x39\xbf\xc8\x63\x0d\xe5\xd0\x46\xa9\x45\xf1\x31\xfe\xaf\xb0\xf4\xa5\xb4\xb1\x62\xbb\xbb\x47\x40\x43\xfc\x77\x54\x87\xb9\x0d\xd2\x81\xa8\x84\xbf\x31\x24\x6c\x21\x7c\x28\x2f\x4a\x23\x5d\x58\x88\xf4\x54\x55\x43\xba\xa6\x6e\xde\x20\x6d\x8e\x4a\xa7\x29\x0b\x96\xf3\x82\xf4\x31\x0b\x10\x85\xf9\x49\x07\xbd\xa0\xe7\x05\x69\xb9\x66\x5f\x60\x4d\xda\x89\x55\x9e\x5c\xec\x65\x2e\x13\x2f\x33\x6f\x85\xc5\xfb\x40\x5f\xb8\x0b\x7a\x53\x0a\x37\x4b\x3c\x1e\xb7\x4d\x5b\x66\x12\x4e\xa3\xc4\xea\xe5\xfd\x5f\x95\xd8\x00\x95\xd8\x71\x7b\x69\x6d\x53\x3c\xaf\x84\xb8\x88\xc4\x89\xb5\x5c\xe4\x73\x0b\x89\x8c\x05\x36\xb2\x24\x7f\xaf\xff\xfb\xd8\xc6\x6a\x92\xad\xa8\xbe\xc3\x82\xd5\x02\xdd\x8c\xb0\x44\x5f\xb2\x1a\x32\xb2\xfa\x65\x3e\x68\xf9\xd4\x2d\x77\x3a\x50\x46\x0e\xf4\x23\xc7\xe6\x97\xaf\x35\x9b\x65\xba\x4e\x0b\xc5\xe3\xf1\xf2\xb6\xb8\x11\xe2\xaf\x7b\xa7\x12\x05\xde\xbf\x68\x42\x40\x5f\x5d\x9c\x3f\x7d\xd8\xff\xf1\xf2\xaa\x36\x50\x2b\x82\x8f\x7f\xb9\xe6\x11\xfc\xd6\xb1\xbf\x35\x09\xfe\x93\x34\x17\x21\x60\xc3\xde\x47\xe1\xf3\xf3\xf9\x9f\xf9\x27\x00\x00\xff\xff\x8e\x1e\xcd\x0b\x00\x08\x00\x00"), - }, "/Apple2_Plus.rom": &vfsgen۰CompressedFileInfo{ name: "Apple2_Plus.rom", modTime: time.Date(2021, 1, 23, 23, 12, 20, 697419198, time.UTC), @@ -151,7 +144,6 @@ var Assets = func() http.FileSystem { fs["/"].(*vfsgen۰DirInfo).entries = []os.FileInfo{ fs["/Apple IIe Video Enhanced - 342-0265-A - 2732.bin"].(os.FileInfo), fs["/Apple IIe Video Unenhanced - 342-0133-A - 2732.bin"].(os.FileInfo), - fs["/Apple Mouse Interface Card ROM - 342-0270-C.bin"].(os.FileInfo), fs["/Apple2_Plus.rom"].(os.FileInfo), fs["/Apple2e.rom"].(os.FileInfo), fs["/Apple2e_Enhanced.rom"].(os.FileInfo),