diff --git a/README.md b/README.md index eea9b45..f4a25e1 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ Portable emulator of an Apple II+ or //e. Written in Go. - Brain Board II - MultiROM card - Dan ][ Controller card + - ProDOS ROM card - Useful cards not emulating a real card - Bootable SmartPort / ProDOS card with the following smartport devices: - Block device (hard disks) @@ -240,6 +241,7 @@ The available cards are: mouse: Mouse card implementation, does not emulate a real card, only the firmware behaviour multirom: Multiple Image ROM card parallel: Card to dump to a file what would be printed to a parallel printer + prodosrom: A bootable 1 MB solid state disk saturn: RAM card with 128Kb, it's like 8 language cards smartport: SmartPort interface card softswitchlogger: Card to log softswitch accesses diff --git a/cardBuilder.go b/cardBuilder.go index 9e32221..b131335 100644 --- a/cardBuilder.go +++ b/cardBuilder.go @@ -51,6 +51,7 @@ func getCardFactory() map[string]*cardBuilder { cardFactory["mouse"] = newCardMouseBuilder() cardFactory["multirom"] = newMultiRomCardBuilder() cardFactory["parallel"] = newCardParallelPrinterBuilder() + cardFactory["prodosrom"] = newCardProDOSRomDriveBuilder() cardFactory["saturn"] = newCardSaturnBuilder() cardFactory["smartport"] = newCardSmartPortStorageBuilder() cardFactory["swyftcard"] = newCardSwyftBuilder() diff --git a/cardProDOSRomDrive.go b/cardProDOSRomDrive.go new file mode 100644 index 0000000..ed984a6 --- /dev/null +++ b/cardProDOSRomDrive.go @@ -0,0 +1,73 @@ +package izapple2 + +import "fmt" + +/* +ProDOS-ROM-Drive: A bootable 1 MB solid state disk for Apple ][ computers + +Emulates version 4.0+ + +See: + https://github.com/tjboldt/ProDOS-ROM-Drive + https://github.com/Alex-Kw/ProDOS-ROM-Drive-Images + +*/ + +// CardMemoryExpansion is a Memory Expansion card +type CardProDOSRomDrive struct { + cardBase + address uint16 + data []uint8 +} + +const proDOSRomDriveMask = 0xf_ffff // 1 MB mask + +func newCardProDOSRomDriveBuilder() *cardBuilder { + return &cardBuilder{ + name: "ProDOS ROM Drive", + description: "A bootable 1 MB solid state disk", + defaultParams: &[]paramSpec{ + //∫{"image", "ROM image with the ProDOS volume", "https://github.com/tjboldt/ProDOS-ROM-Drive/raw/v4.0/Firmware/GamesWithFirmware.po"}, + {"image", "ROM image with the ProDOS volume", "https://github.com/Alex-Kw/ProDOS-ROM-Drive-Images/raw/main/ProDOS242_Beta5.po"}, + }, + buildFunc: func(params map[string]string) (Card, error) { + image := paramsGetPath(params, "image") + if image == "" { + return nil, fmt.Errorf("image required for the ProDOS ROM drive") + } + + data, _, err := LoadResource(image) + if err != nil { + return nil, err + } + + var c CardProDOSRomDrive + c.data = data + c.loadRom(data[0x300:0x400]) + return &c, nil + }, + } +} + +func (c *CardProDOSRomDrive) assign(a *Apple2, slot int) { + + // Set pointer position + c.addCardSoftSwitchW(0, func(value uint8) { + c.address = uint16(value) | c.address&0xff00 + }, "LATCHLO") + c.addCardSoftSwitchW(1, func(value uint8) { + c.address = uint16(value)<<8 | c.address&0xff + }, "LATCHHI") + + // Read data + for i := uint8(0x0); i <= 0xf; i++ { + iCopy := i + c.addCardSoftSwitchR(iCopy, func() uint8 { + offset := uint32(c.address)<<4 + uint32(iCopy) + offset &= proDOSRomDriveMask + return c.data[offset] + }, fmt.Sprintf("READ%X", iCopy)) + } + + c.cardBase.assign(a, slot) +} diff --git a/doc/usage.txt b/doc/usage.txt index e1aa8b1..c3def2d 100644 --- a/doc/usage.txt +++ b/doc/usage.txt @@ -66,6 +66,7 @@ The available cards are: mouse: Mouse card implementation, does not emulate a real card, only the firmware behaviour multirom: Multiple Image ROM card parallel: Card to dump to a file what would be printed to a parallel printer + prodosrom: A bootable 1 MB solid state disk saturn: RAM card with 128Kb, it's like 8 language cards smartport: SmartPort interface card softswitchlogger: Card to log softswitch accesses