From 8ea72357d572d8c301d86c212754827be3b68eb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Izaguirre?= Date: Mon, 25 Sep 2023 20:55:06 +0200 Subject: [PATCH] Support for 4 disks on the command line. Support tyo trace track changes. --- README.md | 6 ++++++ apple2main.go | 33 +++++++++++++++++++++++++++++++-- cardDisk2.go | 7 +++---- cardDisk2Sequencer.go | 6 +++--- cardDisk2SequencerDrive.go | 4 ++-- command.go | 2 +- trackTracer.go | 21 +++++++++++++++++++-- 7 files changed, 65 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index dbcd3a5..21d0947 100644 --- a/README.md +++ b/README.md @@ -199,6 +199,10 @@ Only valid on SDL mode rom file for the disk drive controller (default "/DISK2.rom") -diskb string file to load on the second disk drive + -diskc string + file to load on the third disk drive, slot 5 + -diskd string + file to load on the fourth disk drive, slot 5 -fastChipSlot int slot for the FASTChip accelerator card, -1 for none (default 3) -forceCaps @@ -259,6 +263,8 @@ Only valid on SDL mode dump to the console the sofswitches calls -traceSSReg dump to the console the sofswitch registrations + -traceTracks + dump to the console the disk tracks changes -vidHDSlot int slot for the VidHD card, only for //e models. -1 for none (default 2) -videxCardSlot int diff --git a/apple2main.go b/apple2main.go index da6d2f0..957aee1 100644 --- a/apple2main.go +++ b/apple2main.go @@ -24,6 +24,14 @@ func MainApple() *Apple2 { "diskb", "", "file to load on the second disk drive") + diskCImage := flag.String( + "diskc", + "", + "file to load on the third disk drive, slot 5") + diskDImage := flag.String( + "diskd", + "", + "file to load on the fourth disk drive, slot 5") hardDiskImage := flag.String( "hd", "", @@ -136,6 +144,10 @@ func MainApple() *Apple2 { "traceSP", false, "dump to the console the smarport commands") + traceTracks := flag.Bool( + "traceTracks", + false, + "dump to the console the disk tracks changes") model := flag.String( "model", "2enh", @@ -267,11 +279,28 @@ func MainApple() *Apple2 { a.AddSwyftCard() } + var trackTracer trackTracer + if *traceTracks { + trackTracer = makeTrackTracerLogger() + } + if *smartPortImage != "" { err := a.AddSmartPortDisk(5, *smartPortImage, *traceHD, *traceSP) if err != nil { panic(err) } + } else if *diskCImage != "" || *diskDImage != "" { + if *sequencerDisk2 { + err := a.AddDisk2Sequencer(5, *diskCImage, *diskDImage, trackTracer) + if err != nil { + panic(err) + } + } else { + err := a.AddDisk2(5, *diskCImage, *diskDImage, trackTracer) + if err != nil { + panic(err) + } + } } if *fujinetSlot >= 0 { @@ -283,12 +312,12 @@ func MainApple() *Apple2 { } if *disk2Slot > 0 { if *sequencerDisk2 { - err := a.AddDisk2Sequencer(*disk2Slot, diskImageFinal, *diskBImage, nil) + err := a.AddDisk2Sequencer(*disk2Slot, diskImageFinal, *diskBImage, trackTracer) if err != nil { panic(err) } } else { - err := a.AddDisk2(*disk2Slot, diskImageFinal, *diskBImage, nil) + err := a.AddDisk2(*disk2Slot, diskImageFinal, *diskBImage, trackTracer) if err != nil { panic(err) } diff --git a/cardDisk2.go b/cardDisk2.go index c75c24b..9454284 100644 --- a/cardDisk2.go +++ b/cardDisk2.go @@ -94,20 +94,19 @@ func (c *CardDisk2) assign(a *Apple2, slot int) { drive.trackStep = moveDriveStepper(drive.phases, drive.trackStep) if c.trackTracer != nil { - c.trackTracer.traceTrack(drive.trackStep) + c.trackTracer.traceTrack(drive.trackStep, c.slot, c.selected) } return c.dataLatch // All even addresses return the last dataLatch }, fmt.Sprintf("PHASE%vOFF", phase)) - c.addCardSoftSwitchR((phase<<1)+1, func() uint8 { - // Update magnets and position + c.addCardSoftSwitchR((phase<<1)+1, func() uint8 { // Update magnets and position drive := &c.drive[c.selected] drive.phases |= (1 << phase) drive.trackStep = moveDriveStepper(drive.phases, drive.trackStep) if c.trackTracer != nil { - c.trackTracer.traceTrack(drive.trackStep) + c.trackTracer.traceTrack(drive.trackStep, slot, c.selected) } return 0 diff --git a/cardDisk2Sequencer.go b/cardDisk2Sequencer.go index 5fd1350..1dc1cc9 100644 --- a/cardDisk2Sequencer.go +++ b/cardDisk2Sequencer.go @@ -178,14 +178,14 @@ func (c *CardDisk2Sequencer) step(data uint8, firstStep bool) bool { q1 := c.q[1] q2 := c.q[2] q3 := c.q[3] - c.drive[0].moveHead(q0, q1, q2, q3, c.trackTracer) - c.drive[1].moveHead(q0, q1, q2, q3, c.trackTracer) + c.drive[0].moveHead(q0, q1, q2, q3, c.trackTracer, c.slot, 0) + c.drive[1].moveHead(q0, q1, q2, q3, c.trackTracer, c.slot, 1) } /* The reading from the drive is converted to a pulse detecting changes using Q3 and Q4 of the flip flop, combined with - the last quarter of the 74LS132 NAND. + the last quarter of the 74LS132 NAND.∫ The woz format provides the pulse directly and we won't emulate this detection. */ diff --git a/cardDisk2SequencerDrive.go b/cardDisk2SequencerDrive.go index 966f826..38c0eb5 100644 --- a/cardDisk2SequencerDrive.go +++ b/cardDisk2SequencerDrive.go @@ -48,7 +48,7 @@ func (d *cardDisk2SequencerDrive) enable(enabled bool) { d.enabled = enabled } -func (d *cardDisk2SequencerDrive) moveHead(q0, q1, q2, q3 bool, trackTracer trackTracer) { +func (d *cardDisk2SequencerDrive) moveHead(q0, q1, q2, q3 bool, trackTracer trackTracer, slot int, driveNumber int) { if !d.enabled { return } @@ -60,7 +60,7 @@ func (d *cardDisk2SequencerDrive) moveHead(q0, q1, q2, q3 bool, trackTracer trac d.currentQuarterTrack = moveDriveStepper(phases, d.currentQuarterTrack) if trackTracer != nil { - trackTracer.traceTrack(d.currentQuarterTrack) + trackTracer.traceTrack(d.currentQuarterTrack, slot, driveNumber) } } diff --git a/command.go b/command.go index bdee80c..223d47c 100644 --- a/command.go +++ b/command.go @@ -102,5 +102,5 @@ func (a *Apple2) changeDisk(unit int, path string) error { if unit < len(a.removableMediaDrives) { return a.removableMediaDrives[unit].insertDiskette(path) } - return fmt.Errorf("Unit %v not defined", unit) + return fmt.Errorf("unit %v not defined", unit) } diff --git a/trackTracer.go b/trackTracer.go index 6298632..36b6827 100644 --- a/trackTracer.go +++ b/trackTracer.go @@ -1,9 +1,26 @@ package izapple2 +import "fmt" + type trackTracer interface { - traceTrack(quarterTrack int) + traceTrack(quarterTrack int, slot int, drive int) } +// /////////////// +// TrackTracerLogger is a track tracer that logs to the console +type trackTracerLogger struct { +} + +func makeTrackTracerLogger() *trackTracerLogger { + return &trackTracerLogger{} +} + +func (tt *trackTracerLogger) traceTrack(quarterTrack int, slot int, drive int) { + fmt.Printf("Slot %v, drive %v, track %v\n", slot, drive, quarterTrack) +} + +// /////////////// +// TrackTracerSummary is a track tracer that stores the track changes type trackTracerSummary struct { quarterTracks []int } @@ -14,7 +31,7 @@ func makeTrackTracerSummary() *trackTracerSummary { return &tt } -func (tt *trackTracerSummary) traceTrack(quarterTrack int) { +func (tt *trackTracerSummary) traceTrack(quarterTrack int, _slot int, _drive int) { if tt == nil { return }