From 7ce52edf93fc88f36bec3dd3fef4a915651eeb75 Mon Sep 17 00:00:00 2001 From: Will Angenent Date: Sat, 26 May 2018 23:23:35 +0100 Subject: [PATCH] Moved disk module out of mmu --- appleiie.go | 5 ++-- bank_switch_test.go | 7 +++-- bell_test.go | 3 +- {mmu => disk}/disk.go | 26 ++++++++-------- dos33_boot_test.go | 8 +++-- io_test.go | 7 +++-- mmu/io.go | 69 +++++++++++++++++++------------------------ prodos_boot_test.go | 8 +++-- rwts_write_test.go | 7 +++-- system/system.go | 10 +++++++ 10 files changed, 82 insertions(+), 68 deletions(-) rename {mmu => disk}/disk.go (94%) diff --git a/appleiie.go b/appleiie.go index f10497e..691c6d6 100644 --- a/appleiie.go +++ b/appleiie.go @@ -9,6 +9,7 @@ import ( "mos6502go/audio" "mos6502go/cpu" + "mos6502go/disk" "mos6502go/keyboard" "mos6502go/mmu" "mos6502go/system" @@ -95,7 +96,7 @@ func main() { mmu.InitIO() if diskImage != "" { - mmu.ReadDiskImage(diskImage) + disk.ReadDiskImage(diskImage) } cpu.Init() @@ -110,5 +111,5 @@ func main() { ebiten.Run(update, 280*video.ScreenSizeFactor, 192*video.ScreenSizeFactor, 2, "Apple //e") - mmu.FlushImage() + disk.FlushImage() } diff --git a/bank_switch_test.go b/bank_switch_test.go index 4080a03..3a50fb5 100644 --- a/bank_switch_test.go +++ b/bank_switch_test.go @@ -1,14 +1,15 @@ package main import ( + "testing" + + "github.com/stretchr/testify/assert" + "mos6502go/cpu" "mos6502go/keyboard" "mos6502go/mmu" "mos6502go/system" "mos6502go/video" - "testing" - - "github.com/stretchr/testify/assert" ) func TestBankSwitching(t *testing.T) { diff --git a/bell_test.go b/bell_test.go index f806480..4c41253 100644 --- a/bell_test.go +++ b/bell_test.go @@ -2,12 +2,13 @@ package main import ( "fmt" + "testing" + "mos6502go/cpu" "mos6502go/keyboard" "mos6502go/mmu" "mos6502go/system" "mos6502go/video" - "testing" ) func testBellCycles(delay int) { diff --git a/mmu/disk.go b/disk/disk.go similarity index 94% rename from mmu/disk.go rename to disk/disk.go index 6be4bcb..9e45ee5 100644 --- a/mmu/disk.go +++ b/disk/disk.go @@ -1,8 +1,10 @@ -package mmu +package disk import ( "fmt" "io/ioutil" + + "mos6502go/system" ) const tracksPerDisk = 35 @@ -301,7 +303,7 @@ func MakeTrackData(armPosition uint8) { return } - DriveState.BytePosition = 0 // Point the head at the first sector + system.DriveState.BytePosition = 0 // Point the head at the first sector // For each sector, encode the data and add it to trackData for physicalSector := uint8(0); physicalSector < sectorsPerTrack; physicalSector++ { @@ -319,22 +321,22 @@ func decodeAddressField(data []uint8) addressField { // Read a byte from the disk head and spin the disk along func ReadTrackData() (result uint8) { - result = trackData[DriveState.BytePosition] + result = trackData[system.DriveState.BytePosition] - if DriveState.BytePosition >= 9 { - if trackData[DriveState.BytePosition-9] == 0xd5 && - trackData[DriveState.BytePosition-8] == 0xaa && - trackData[DriveState.BytePosition-7] == 0x96 { + if system.DriveState.BytePosition >= 9 { + if trackData[system.DriveState.BytePosition-9] == 0xd5 && + trackData[system.DriveState.BytePosition-8] == 0xaa && + trackData[system.DriveState.BytePosition-7] == 0x96 { var addressData []uint8 - addressData = trackData[DriveState.BytePosition-6 : DriveState.BytePosition] + addressData = trackData[system.DriveState.BytePosition-6 : system.DriveState.BytePosition] lastReadAddress = decodeAddressField(addressData) - lastReadSectorDataPosition = DriveState.BytePosition + 8 + lastReadSectorDataPosition = system.DriveState.BytePosition + 8 } } - DriveState.BytePosition++ - if DriveState.BytePosition == trackDataBytes { - DriveState.BytePosition = 0 + system.DriveState.BytePosition++ + if system.DriveState.BytePosition == trackDataBytes { + system.DriveState.BytePosition = 0 } return diff --git a/dos33_boot_test.go b/dos33_boot_test.go index 8e367cd..287e254 100644 --- a/dos33_boot_test.go +++ b/dos33_boot_test.go @@ -2,14 +2,16 @@ package main import ( "fmt" + "testing" + "time" + "mos6502go/cpu" + "mos6502go/disk" "mos6502go/keyboard" "mos6502go/mmu" "mos6502go/system" "mos6502go/utils" "mos6502go/video" - "testing" - "time" ) const dosDiskImage = "dos33.dsk" @@ -27,7 +29,7 @@ func TestDOS33Boot(t *testing.T) { mmu.InitRAM() mmu.InitApple2eROM() mmu.InitIO() - mmu.ReadDiskImage(dosDiskImage) + disk.ReadDiskImage(dosDiskImage) cpu.Init() keyboard.Init() video.Init() diff --git a/io_test.go b/io_test.go index 12ef408..9d1a160 100644 --- a/io_test.go +++ b/io_test.go @@ -1,14 +1,15 @@ package main import ( + "testing" + + "github.com/stretchr/testify/assert" + "mos6502go/cpu" "mos6502go/keyboard" "mos6502go/mmu" "mos6502go/system" "mos6502go/video" - "testing" - - "github.com/stretchr/testify/assert" ) func TestIoBankSwitching(t *testing.T) { diff --git a/mmu/io.go b/mmu/io.go index 1c6fa26..f07f308 100644 --- a/mmu/io.go +++ b/mmu/io.go @@ -2,8 +2,11 @@ package mmu import ( "fmt" + "mos6502go/audio" + "mos6502go/disk" "mos6502go/keyboard" + "mos6502go/system" ) // Adapted from @@ -90,16 +93,6 @@ const ( S6Q7H = 0xC0EF // write ) -var DriveState struct { - Drive uint8 - Spinning bool - Phase int8 - Phases uint8 - BytePosition int - Q6 bool - Q7 bool -} - var VideoState struct { TextMode bool HiresMode bool @@ -113,22 +106,22 @@ func InitIO() { emptySlot(7) // Initialize slot 6 drive - DriveState.Drive = 1 - DriveState.Spinning = false - DriveState.Phase = 0 - DriveState.BytePosition = 0 - DriveState.Q6 = false - DriveState.Q7 = false + system.DriveState.Drive = 1 + system.DriveState.Spinning = false + system.DriveState.Phase = 0 + system.DriveState.BytePosition = 0 + system.DriveState.Q6 = false + system.DriveState.Q7 = false VideoState.TextMode = true VideoState.HiresMode = false VideoState.Mixed = false - InitDiskImage() + disk.InitDiskImage() } func driveIsreadSequencing() bool { - return (!DriveState.Q6) && (!DriveState.Q7) + return (!system.DriveState.Q6) && (!system.DriveState.Q7) } // Handle soft switch addresses where both a read and a write has a side @@ -209,68 +202,68 @@ func readWrite(address uint16, isRead bool) bool { on := ((address - S6CLRDRVP0) % 2) == 1 if on { - DriveState.Phases |= (1 << magnet) + system.DriveState.Phases |= (1 << magnet) // Move head if a neighboring magnet is on and all others are off direction := int8(0) - if (DriveState.Phases & (1 << uint8((DriveState.Phase+1)&3))) != 0 { + if (system.DriveState.Phases & (1 << uint8((system.DriveState.Phase+1)&3))) != 0 { direction += 1 } - if (DriveState.Phases & (1 << uint8((DriveState.Phase+3)&3))) != 0 { + if (system.DriveState.Phases & (1 << uint8((system.DriveState.Phase+3)&3))) != 0 { direction -= 1 } if direction != 0 { - DriveState.Phase += direction + system.DriveState.Phase += direction - if DriveState.Phase < 0 { - DriveState.Phase = 0 + if system.DriveState.Phase < 0 { + system.DriveState.Phase = 0 } - if DriveState.Phase == 80 { - DriveState.Phase = 79 + if system.DriveState.Phase == 80 { + system.DriveState.Phase = 79 } - MakeTrackData(uint8(DriveState.Phase)) + disk.MakeTrackData(uint8(system.DriveState.Phase)) if audio.ClickWhenDriveHeadMoves { audio.Click() } } } else { - DriveState.Phases &= ^(1 << magnet) + system.DriveState.Phases &= ^(1 << magnet) } return true case S6MOTOROFF: - DriveState.Spinning = false + system.DriveState.Spinning = false return true case S6MOTORON: - DriveState.Spinning = true + system.DriveState.Spinning = true return true case S6SELDRV1: - DriveState.Drive = 1 + system.DriveState.Drive = 1 return true case S6SELDRV2: - DriveState.Drive = 2 + system.DriveState.Drive = 2 return true case S6Q6L: if !isRead { - DriveState.Q6 = false + system.DriveState.Q6 = false return true } return false case S6Q6H: if isRead { - DriveState.Q6 = true + system.DriveState.Q6 = true return true } return false case S6Q7L: - DriveState.Q7 = false + system.DriveState.Q7 = false return true case S6Q7H: - DriveState.Q7 = true + system.DriveState.Q7 = true return true default: @@ -332,7 +325,7 @@ func ReadIO(address uint16) uint8 { case SPEAKER: audio.Click() case S6Q6L: - return ReadTrackData() + return disk.ReadTrackData() default: panic(fmt.Sprintf("TODO read %04x\n", address)) } @@ -364,7 +357,7 @@ func WriteIO(address uint16, value uint8) { case SETC3ROM: // SETC3ROM not implemented case S6Q6H: - WriteTrackData(value) + disk.WriteTrackData(value) default: panic(fmt.Sprintf("TODO write %04x\n", address)) } diff --git a/prodos_boot_test.go b/prodos_boot_test.go index c428720..56541b4 100644 --- a/prodos_boot_test.go +++ b/prodos_boot_test.go @@ -2,14 +2,16 @@ package main import ( "fmt" + "testing" + "time" + "mos6502go/cpu" + "mos6502go/disk" "mos6502go/keyboard" "mos6502go/mmu" "mos6502go/system" "mos6502go/utils" "mos6502go/video" - "testing" - "time" ) const prodosDiskImage = "prodos.dsk" @@ -19,7 +21,7 @@ func TestProdosBoot(t *testing.T) { mmu.InitRAM() mmu.InitApple2eROM() mmu.InitIO() - mmu.ReadDiskImage(prodosDiskImage) + disk.ReadDiskImage(prodosDiskImage) cpu.Init() keyboard.Init() video.Init() diff --git a/rwts_write_test.go b/rwts_write_test.go index bfbf2c9..2a7f426 100644 --- a/rwts_write_test.go +++ b/rwts_write_test.go @@ -1,14 +1,15 @@ package main import ( + "testing" + "mos6502go/cpu" + "mos6502go/disk" "mos6502go/keyboard" "mos6502go/mmu" "mos6502go/system" "mos6502go/utils" "mos6502go/video" - - "testing" ) const rwtsDosDiskImage = "dos33.dsk" @@ -25,7 +26,7 @@ func TestDos33RwtsWriteRead(t *testing.T) { mmu.InitRAM() mmu.InitApple2eROM() mmu.InitIO() - mmu.ReadDiskImage(rwtsDosDiskImage) + disk.ReadDiskImage(rwtsDosDiskImage) cpu.Init() keyboard.Init() video.Init() diff --git a/system/system.go b/system/system.go index dacbe71..bc87f24 100644 --- a/system/system.go +++ b/system/system.go @@ -19,6 +19,16 @@ var ( AudioAttenuationCounter uint64 ) +var DriveState struct { + Drive uint8 + Spinning bool + Phase int8 + Phases uint8 + BytePosition int + Q6 bool + Q7 bool +} + func Init() { Cycles = 0 AudioChannel = make(chan int16, AudioSampleRate*4) // 1 second