diff --git a/A2Mac.xcodeproj/project.xcworkspace/xcuserdata/trudnai.xcuserdatad/xcdebugger/Expressions.xcexplist b/A2Mac.xcodeproj/project.xcworkspace/xcuserdata/trudnai.xcuserdatad/xcdebugger/Expressions.xcexplist
index db7b1e3..4657d5b 100644
--- a/A2Mac.xcodeproj/project.xcworkspace/xcuserdata/trudnai.xcuserdatad/xcdebugger/Expressions.xcexplist
+++ b/A2Mac.xcodeproj/project.xcworkspace/xcuserdata/trudnai.xcuserdatad/xcdebugger/Expressions.xcexplist
@@ -14,10 +14,13 @@
+ contextName = "BRA:6502_instr_branch.h">
+ value = "">
+
+
@@ -64,7 +67,7 @@
contextName = "closure #1 in ViewController.Update():ViewController.swift">
+ value = "MEMcfg.is_80STORE">
@@ -76,7 +79,7 @@
value = "MEMcfg.txt_page_2">
+ value = "txtArr">
@@ -218,13 +221,25 @@
contextName = "spkr_update:speaker.c">
+ value = "(uint8_t)spkr_samples[452]">
+
+
+
+
+ value = "spkr_sample_idx">
+
+
+
+
@@ -280,7 +295,7 @@
value = "pdl_value[pdl]">
+ value = "normalized_time">
@@ -292,7 +307,7 @@
value = "1 * 512 * (1 - ( 3300 / 3300.0 ))">
+ value = "normalized_time >= pdl_value[pdl] ? 255 : 0">
@@ -309,13 +324,13 @@
value = "textLines">
+ value = "hires.frame">
+ value = "hires.layer">
@@ -331,7 +346,7 @@
contextName = "LoRes.Update():LoRes.swift">
+ value = "UInt8( (block >> 4) & 0x0F )">
@@ -340,7 +355,7 @@
value = "UInt8(block & 4)">
+ value = "blockChanged[ screenIdx ]">
@@ -375,10 +390,10 @@
contextName = "set_flags_NZC:common.h">
+ value = "(unsigned)0xFF">
+ value = "(unsigned)test ">
@@ -504,20 +519,6 @@
-
-
-
-
-
-
-
-
-
-
@@ -538,22 +539,14 @@
-
-
-
-
-
-
+ value = "ctx?.bitsPerComponent">
+ value = "ctx?.data">
@@ -570,20 +563,42 @@
+
+
+
+
+
+
+
+
+ value = "test">
+
+
+
+
+
+
+ value = "result[2]">
+
+
@@ -626,16 +641,16 @@
value = "m6502">
+ value = "Apple2_64K_AUX + 0x3600">
+ value = "Apple2_64K_RAM + 0x3600">
+ value = "(void*)Apple2_64K_RAM">
@@ -691,7 +706,7 @@
value = "new">
+ value = "WOZtmp.shift16">
@@ -703,7 +718,7 @@
value = "(1 << i) - 1">
+ value = "WOZwrite.shift16">
@@ -725,10 +740,10 @@
value = "Apple2_64K_AUX + 0xC600">
+ value = "Apple2_64K_RAM + 0xC600">
+ value = "(void*)rom">
@@ -753,13 +768,10 @@
+ contextName = "specialized closure #1 in ViewController.Update():ViewController.swift">
-
-
+ value = "self.HiRes.frame">
diff --git a/A2Mac/AppDelegate.swift b/A2Mac/AppDelegate.swift
index 4a6708a..f456ab7 100644
--- a/A2Mac/AppDelegate.swift
+++ b/A2Mac/AppDelegate.swift
@@ -39,14 +39,13 @@ class AppDelegate: NSObject, NSApplicationDelegate {
}
@IBAction func selectAnImageFromFile(sender: AnyObject) {
- ViewController.current?.openDiskImage()
+ ViewController.current?.openDiskImageDialog()
}
func application(_ sender: NSApplication, openFile filename: String) -> Bool {
- let woz_err = woz_loadFile( filename )
-
- return woz_err == 0;
+ ViewController.current?.openDiskImage(url: URL(fileURLWithPath: filename))
+ return true;
}
@IBAction func saveFile(_ sender: NSMenuItem) {
diff --git a/A2Mac/Base.lproj/Main.storyboard b/A2Mac/Base.lproj/Main.storyboard
index 89aac01..363e779 100644
--- a/A2Mac/Base.lproj/Main.storyboard
+++ b/A2Mac/Base.lproj/Main.storyboard
@@ -1211,7 +1211,7 @@
-
+
@@ -1710,7 +1710,7 @@
-
+
@@ -1728,13 +1728,13 @@
-
+
-
+
-
+
-
+
-
+
-
-
+
+
diff --git a/A2Mac/ViewController.swift b/A2Mac/ViewController.swift
index e6e2dd9..e3b3bba 100644
--- a/A2Mac/ViewController.swift
+++ b/A2Mac/ViewController.swift
@@ -1088,8 +1088,8 @@ class ViewController: NSViewController {
}
- @IBAction func setCPUMode(_ sender: NSButton) {
- setSimulationMode(mode: sender.title )
+ @IBAction func setCPUMode(_ sender: NSPopUpButton) {
+ setSimulationMode(mode: sender.selectedItem?.title ?? "Normal" )
}
@IBOutlet weak var SoundGap: NSTextFieldCell!
@@ -1179,7 +1179,43 @@ class ViewController: NSViewController {
}
- @objc func openDiskImage() {
+ func openDiskImage( url: URL ) {
+ switch url.pathExtension.uppercased() {
+
+ case "WOZ":
+ let err = woz_loadFile( url.path )
+
+ if err == WOZ_ERR_OK {
+ NSDocumentController.shared.noteNewRecentDocumentURL(URL(fileURLWithPath: url.path))
+ }
+ else {
+ self.chk_woz_load(err: err)
+ }
+
+ case "DSK", "DO", "PO" :
+ woz_eject()
+
+ let err = dsk2woz( url.path )
+
+ if err == WOZ_ERR_OK {
+ let err = woz_parseBuffer()
+
+ if err == WOZ_ERR_OK {
+ NSDocumentController.shared.noteNewRecentDocumentURL(URL(fileURLWithPath: url.path))
+ }
+ }
+ else {
+ self.chk_woz_load(err: err)
+ }
+
+ default:
+ break
+
+ }
+
+ }
+
+ @objc func openDiskImageDialog() {
let openPanel = NSOpenPanel()
openPanel.title = "Open Disk Image"
openPanel.allowsMultipleSelection = false
@@ -1190,46 +1226,21 @@ class ViewController: NSViewController {
openPanel.begin { (result) -> Void in
if result == NSApplication.ModalResponse.OK {
- print("file:", openPanel.url!.path)
+// print("file:", openPanel.url!.path)
//Do what you will
//If there's only one URL, surely 'openPanel.URL'
//but otherwise a for loop works
- switch openPanel.url?.pathExtension.uppercased() {
-
- case "WOZ":
- if let filePath = openPanel.url?.path {
- let err = woz_loadFile( filePath )
-
- if err == WOZ_ERR_OK {
- NSDocumentController.shared.noteNewRecentDocumentURL(URL(fileURLWithPath: filePath))
- }
- else {
- self.chk_woz_load(err: err)
- }
- }
+ if let url = openPanel.url {
+ self.openDiskImage(url: url)
+ }
+ else {
+ let a = NSAlert()
+ a.messageText = "File Not Found"
+ a.informativeText = "Could not locate selected file"
+ a.alertStyle = .critical
- case "DSK", "DO", "PO" :
- if let filePath = openPanel.url?.path {
- woz_eject()
-
- let err = dsk2woz( filePath )
-
- if err == WOZ_ERR_OK {
- let err = woz_parseBuffer()
-
- if err == WOZ_ERR_OK {
- NSDocumentController.shared.noteNewRecentDocumentURL(URL(fileURLWithPath: filePath))
- }
- }
- else {
- self.chk_woz_load(err: err)
- }
- }
-
- default:
- break
-
+ a.beginSheetModal( for: self.view.window! )
}
}
}
@@ -1247,13 +1258,13 @@ class ViewController: NSViewController {
openPanel.begin { (result) -> Void in
if result == NSApplication.ModalResponse.OK {
- print("file:", openPanel.url!.path)
+// print("file:", openPanel.url!.path)
//Do what you will
//If there's only one URL, surely 'openPanel.URL'
//but otherwise a for loop works
if let filePath = openPanel.url?.path {
- let woz_err = woz_loadFile( filePath )
+ let woz_err = woz_saveFile( filePath )
if woz_err == WOZ_ERR_OK {
NSDocumentController.shared.noteNewRecentDocumentURL(URL(fileURLWithPath: filePath))
@@ -1268,7 +1279,7 @@ class ViewController: NSViewController {
@IBAction func openDocument(_ sender: Any?) {
- openDiskImage()
+ openDiskImageDialog()
}
@IBAction func traceEnable(_ sender: NSButton) {
diff --git a/src/dev/audio/speaker.c b/src/dev/audio/speaker.c
index c5a0886..4954441 100644
--- a/src/dev/audio/speaker.c
+++ b/src/dev/audio/speaker.c
@@ -82,9 +82,10 @@ const unsigned spkr_sample_rate = 44100;
const unsigned sfx_sample_rate = 22050; // original sample rate
//const unsigned sfx_sample_rate = 26000; // bit higher pitch
int spkr_extra_buf = 0; // 800 / spkr_fps;
-const unsigned spkr_buf_alloc_size = spkr_seconds * spkr_sample_rate * SPKR_CHANNELS / DEFAULT_FPS;
-unsigned spkr_buf_size = spkr_buf_alloc_size;
-int16_t spkr_samples [ spkr_buf_alloc_size * DEFAULT_FPS * BUFFER_COUNT * SPKR_CHANNELS]; // stereo
+typedef int16_t spkr_sample_t;
+const unsigned spkr_buf_alloc_size = spkr_seconds * spkr_sample_rate * SPKR_CHANNELS * sizeof(spkr_sample_t) / DEFAULT_FPS; // stereo
+unsigned spkr_buf_size = spkr_buf_alloc_size / sizeof(spkr_sample_t);
+spkr_sample_t spkr_samples [ spkr_buf_alloc_size * DEFAULT_FPS * BUFFER_COUNT]; // can store up to 1 sec of sound
unsigned spkr_sample_idx = 0;
unsigned spkr_play_timeout = 8; // increase to 32 for 240 fps, normally 8 for 30 fps
@@ -166,7 +167,7 @@ void spkr_init() {
alcMakeContextCurrent(ctx);
// Fill buffer with zeros
- memset( spkr_samples, spkr_level, spkr_buf_size * sizeof(spkr_samples[0]) );
+ memset( spkr_samples, spkr_level, spkr_buf_alloc_size + spkr_extra_buf);
// Create buffer to store samples
alGenBuffers(BUFFER_COUNT, spkr_buffers);
@@ -278,10 +279,13 @@ int spkr_unqueue( ALuint src ) {
alGetSourcei ( src, AL_BUFFERS_PROCESSED, &processed );
al_check_error();
// printf("%s alGetSourcei(%d)\n", __FUNCTION__, src);
+// printf("p:%d\n", processed);
- if ( processed ) {
+ if ( processed > 0 ) {
alSourceUnqueueBuffers( src, processed, &spkr_buffers[freeBuffers]);
al_check_error();
+ freeBuffers += processed;
+ freeBuffers = clamp( 1, freeBuffers, BUFFER_COUNT );
}
}
@@ -313,16 +317,14 @@ void spkr_exit() {
alDeleteSources(SOURCES_COUNT, spkr_src);
al_check_error();
-
- ALCdevice *dev = NULL;
- ALCcontext *ctx = NULL;
- ctx = alcGetCurrentContext();
- dev = alcGetContextsDevice(ctx);
+ ALCdevice *dev = alcGetContextsDevice(ctx);
+ ALCcontext *ctx = alcGetCurrentContext();
alcMakeContextCurrent(NULL);
+ al_check_error();
alcDestroyContext(ctx);
+ al_check_error();
alcCloseDevice(dev);
-
al_check_error();
memset(spkr_src, 0, sizeof(spkr_src));
@@ -398,7 +400,7 @@ void spkr_toggle() {
for ( int i = spkr_sample_idx; i < spkr_buf_size + spkr_extra_buf; i++ ) {
spkr_samples[i] = spkr_level;
}
-// memset(spkr_samples + spkr_sample_idx, spkr_level, spkr_buf_size * sizeof(spkr_samples[0]));
+// memset(spkr_samples + spkr_sample_idx, spkr_level, spkr_buf_size * sizeof(spkr_sample_t));
}
}
@@ -412,7 +414,15 @@ void spkr_update() {
if ( ++spkr_frame_cntr >= spkr_fps_divider ) {
spkr_frame_cntr = 0;
- if ( spkr_play_time ) {
+ // Fix: Unqueue was not working properly some cases, so we need to monitor
+ // queued elements and if there are too many, let's just wait
+ #define SPKR_MAX_QUEUED 10
+ ALint queued = 0;
+ alGetSourcei ( spkr_src[SPKR_SRC_GAME_SFX], AL_BUFFERS_QUEUED, &queued );
+ al_check_error();
+// printf("q:%d clkfrm:%d frm:%llu max:%llu\n", queued, clkfrm, clk_6502_per_frm, clk_6502_per_frm_max);
+
+ if ( ( spkr_play_time ) && ( queued < SPKR_MAX_QUEUED ) ) {
if ( freeBuffers ) {
// in Game Mode do not fade out and stop playing
if ( ( cpuMode_game != cpuMode ) && ( --spkr_play_time == 0 ) ) {
@@ -431,18 +441,25 @@ void spkr_update() {
spkr_level = SPKR_LEVEL_ZERO;
//spkr_samples[sample_idx] = spkr_level;
- memset(spkr_samples + spkr_sample_idx, SPKR_LEVEL_ZERO, spkr_extra_buf * sizeof(spkr_samples[0]));
+ memset(spkr_samples + spkr_sample_idx, SPKR_LEVEL_ZERO, spkr_extra_buf * sizeof(spkr_sample_t));
freeBuffers--;
- alBufferData(spkr_buffers[freeBuffers], AL_FORMAT_STEREO16, spkr_samples, spkr_sample_idx * sizeof(spkr_samples[0]), spkr_sample_rate);
+ alBufferData(spkr_buffers[freeBuffers], AL_FORMAT_STEREO16, spkr_samples, spkr_sample_idx * sizeof(spkr_sample_t), spkr_sample_rate);
al_check_error();
alSourceQueueBuffers(spkr_src[SPKR_SRC_GAME_SFX], 1, &spkr_buffers[freeBuffers]);
al_check_error();
}
}
else {
+ // push a click into the speaker buffer
+ // (we will play the entire buffer at the end of the frame)
+ spkr_sample_idx = ( (spkr_clk + clkfrm) / ( MHZ(default_MHz_6502) / spkr_sample_rate)) * SPKR_CHANNELS;
+
freeBuffers--;
alBufferData(spkr_buffers[freeBuffers], AL_FORMAT_STEREO16, spkr_samples, (spkr_buf_size + spkr_extra_buf) * sizeof(spkr_samples[0]), spkr_sample_rate);
+// alBufferData(spkr_buffers[freeBuffers], AL_FORMAT_STEREO16, spkr_samples, (spkr_sample_idx + spkr_extra_buf) * sizeof(spkr_sample_t), spkr_sample_rate);
+// ALint bufSize = spkr_sample_idx + 20 < spkr_buf_size ? spkr_sample_idx * sizeof(spkr_sample_t) + 20 : spkr_buf_alloc_size;
+// alBufferData(spkr_buffers[freeBuffers], AL_FORMAT_STEREO16, spkr_samples, bufSize + spkr_extra_buf, spkr_sample_rate);
al_check_error();
alSourceQueueBuffers(spkr_src[SPKR_SRC_GAME_SFX], 1, &spkr_buffers[freeBuffers]);
al_check_error();
@@ -466,6 +483,9 @@ void spkr_update() {
default:
alSourcePlay(spkr_src[SPKR_SRC_GAME_SFX]);
+ // this is so we will set state to AL_PAUSED immediately
+ // As a result there will be an extra queued buffer
+ // which gives us a glitch free sound
alSourcePause(spkr_src[SPKR_SRC_GAME_SFX]);
break;
}
@@ -484,13 +504,13 @@ void spkr_update() {
spkr_clk = 0;
- // free up unused buffers
- freeBuffers += spkr_unqueue( spkr_src[SPKR_SRC_GAME_SFX] );
- freeBuffers = clamp( 1, freeBuffers, BUFFER_COUNT );
}
else {
spkr_clk += clkfrm;
}
+
+ // free up unused buffers
+ spkr_unqueue( spkr_src[SPKR_SRC_GAME_SFX] );
}
@@ -578,9 +598,7 @@ void spkr_stop_sfx( ALuint src ) {
}
// free up unused buffers
- freeBuffers += spkr_unqueue( src );
- freeBuffers = clamp( 1, freeBuffers, BUFFER_COUNT );
-
+ spkr_unqueue( src );
}
diff --git a/src/dev/disk/woz.c b/src/dev/disk/woz.c
index 14cd259..4973b91 100644
--- a/src/dev/disk/woz.c
+++ b/src/dev/disk/woz.c
@@ -219,54 +219,82 @@ void woz_loadTrack( int track ) {
uint8_t woz_read() {
- int track = woz_tmap->phase[disk.phase.count];
- if (outdev) fprintf(outdev, "track: %d (%d) ", track, disk.phase.count);
- if ( track >= 40 ) {
- dbgPrintf("TRCK TOO HIGH!\n");
- return rand();
- }
-
- static int clkBeforeSync = 0;
-
- clkelpased = m6502.clktime + clkfrm - m6502.clklast;
- m6502.clklast = m6502.clktime + clkfrm;
-
- clkBeforeSync += clkelpased;
-
- const int clkBeforeAdjusting = 512;
- const int magicShiftOffset = 45;
-
- uint16_t usedBytes = (*woz_trks)[track].bytes_used < WOZ1_TRACK_BYTE_COUNT ? (*woz_trks)[track].bytes_used : WOZ1_TRACK_BYTE_COUNT;
-
- if ( usedBytes ) {
- int shiftOffset = magicShiftOffset;
+ if ( woz_tmap && woz_trks ) {
+ int track = woz_tmap->phase[disk.phase.count];
+ if (outdev) fprintf(outdev, "track: %d (%d) ", track, disk.phase.count);
+ if ( track >= 40 ) {
+ dbgPrintf("TRCK TOO HIGH!\n");
+ return rand();
+ }
-// printf("elpased : %llu (clkBefRd:%d)\n", clkelpased, clkBeforeSync);
+ static int clkBeforeSync = 0;
- if ( clkelpased > clkBeforeAdjusting ) {
-// printf("NEED SYNC : %llu (clkBefRd:%d)\n", clkelpased, clkBeforeSync);
- clkBeforeSync = 0;
- bitOffset = (clkelpased >> 2) & 7;
- trackOffset += clkelpased >> 5;
- if ( trackOffset >= usedBytes ) {
- bitOffset = 0;
- trackOffset = 0;
+ clkelpased = m6502.clktime + clkfrm - m6502.clklast;
+ m6502.clklast = m6502.clktime + clkfrm;
+
+ clkBeforeSync += clkelpased;
+
+ const int clkBeforeAdjusting = 512;
+ const int magicShiftOffset = 45;
+
+ uint16_t usedBytes = (*woz_trks)[track].bytes_used < WOZ1_TRACK_BYTE_COUNT ? (*woz_trks)[track].bytes_used : WOZ1_TRACK_BYTE_COUNT;
+
+ if ( usedBytes ) {
+ int shiftOffset = magicShiftOffset;
+
+ // printf("elpased : %llu (clkBefRd:%d)\n", clkelpased, clkBeforeSync);
+
+ if ( clkelpased > clkBeforeAdjusting ) {
+ // printf("NEED SYNC : %llu (clkBefRd:%d)\n", clkelpased, clkBeforeSync);
+ clkBeforeSync = 0;
+ bitOffset = (clkelpased >> 2) & 7;
+ trackOffset += clkelpased >> 5;
+ if ( trackOffset >= usedBytes ) {
+ bitOffset = 0;
+ trackOffset = 0;
+ WOZread.shift = 0;
+ shiftOffset = 0;
+ }
+ // trackOffset %= usedBytes;
+
+ // preroll data stream
WOZread.shift = 0;
- shiftOffset = 0;
+ WOZread.data = (*woz_trks)[track].data[trackOffset++];
+ trackOffset %= usedBytes;
+ trackWRoffset = trackOffset;
+
+ WOZread.shift <<= bitOffset;
+ WOZwrite = WOZread;
+
+ for ( int i = 0; i < shiftOffset; i++ ) {
+ for ( ; bitOffset < 8; bitOffset++ ) {
+ WOZread.shift <<= 1;
+ WOZwrite.shift <<= 1;
+
+ if ( WOZread.valid ) {
+ WOZread.latch = 0;
+ }
+ }
+ trackWRoffset = trackOffset;
+ WOZwrite.data = WOZread.data = (*woz_trks)[track].data[trackOffset++];
+ trackOffset %= usedBytes;
+ bitOffset = 0;
+ }
}
-// trackOffset %= usedBytes;
+ else {
+ uint64_t bitForward = (clkelpased >> 2);
- // preroll data stream
- WOZread.shift = 0;
- WOZread.data = (*woz_trks)[track].data[trackOffset++];
- trackOffset %= usedBytes;
- trackWRoffset = trackOffset;
+ // to avoid infinite loop and to search for bit 7 high
+ for ( uint64_t i = 0; i < bitForward; i++ ) {
+ if ( ++bitOffset >= 8 ) {
+ bitOffset = 0;
+ trackWRoffset = trackOffset;
+ trackOffset++;
+ trackOffset %= usedBytes;
- WOZread.shift <<= bitOffset;
- WOZwrite = WOZread;
+ WOZwrite.data = WOZread.data = (*woz_trks)[track].data[trackOffset];
+ }
- for ( int i = 0; i < shiftOffset; i++ ) {
- for ( ; bitOffset < 8; bitOffset++ ) {
WOZread.shift <<= 1;
WOZwrite.shift <<= 1;
@@ -274,17 +302,23 @@ uint8_t woz_read() {
WOZread.latch = 0;
}
}
- trackWRoffset = trackOffset;
- WOZwrite.data = WOZread.data = (*woz_trks)[track].data[trackOffset++];
- trackOffset %= usedBytes;
- bitOffset = 0;
}
- }
- else {
- uint64_t bitForward = (clkelpased >> 2);
// to avoid infinite loop and to search for bit 7 high
- for ( uint64_t i = 0; i < bitForward; i++ ) {
+ for ( int i = 0; i < usedBytes * 8; i++ ) {
+ if ( WOZread.valid ) {
+ WOZread.latch = 0;
+ // if (outdev) fprintf(outdev, "byte: %02X\n", byte);
+
+ if ( woz_decodeTrkSec(WOZwrite.latch, clkelpased, trackOffset * 8 + bitOffset) == wozTrackState_END ) {
+ if (outdev) fprintf(outdev, "vol:%d trk:%d sec:%d\n", vol, trk, sec);
+ }
+
+ if (outdev) fprintf(outdev, "elpased:%lld read: %02X\n", clkelpased, WOZwrite.latch);
+
+ return WOZwrite.latch;
+ }
+
if ( ++bitOffset >= 8 ) {
bitOffset = 0;
trackWRoffset = trackOffset;
@@ -293,44 +327,12 @@ uint8_t woz_read() {
WOZwrite.data = WOZread.data = (*woz_trks)[track].data[trackOffset];
}
-
+
WOZread.shift <<= 1;
WOZwrite.shift <<= 1;
-
- if ( WOZread.valid ) {
- WOZread.latch = 0;
- }
}
+ // if (outdev) fprintf(outdev, "TIME OUT!\n");
}
-
- // to avoid infinite loop and to search for bit 7 high
- for ( int i = 0; i < usedBytes * 8; i++ ) {
- if ( WOZread.valid ) {
- WOZread.latch = 0;
-// if (outdev) fprintf(outdev, "byte: %02X\n", byte);
-
- if ( woz_decodeTrkSec(WOZwrite.latch, clkelpased, trackOffset * 8 + bitOffset) == wozTrackState_END ) {
- if (outdev) fprintf(outdev, "vol:%d trk:%d sec:%d\n", vol, trk, sec);
- }
-
- if (outdev) fprintf(outdev, "elpased:%lld read: %02X\n", clkelpased, WOZwrite.latch);
-
- return WOZwrite.latch;
- }
-
- if ( ++bitOffset >= 8 ) {
- bitOffset = 0;
- trackWRoffset = trackOffset;
- trackOffset++;
- trackOffset %= usedBytes;
-
- WOZwrite.data = WOZread.data = (*woz_trks)[track].data[trackOffset];
- }
-
- WOZread.shift <<= 1;
- WOZwrite.shift <<= 1;
- }
-// if (outdev) fprintf(outdev, "TIME OUT!\n");
}
return rand();
@@ -363,108 +365,109 @@ void printWozBuffer (const char * s, int n, WOZread_t WOZbuf ) {
void woz_write( uint8_t data ) {
- int track = woz_tmap->phase[disk.phase.count];
- if (outdev) fprintf(outdev, "track: %d (%d) ", track, disk.phase.count);
- if ( track >= 40 ) {
- dbgPrintf("TRACK TOO HIGH!\n");
- return;
- }
-
- woz_flags.disk_modified = 1;
-
- clkelpased = m6502.clktime + clkfrm - m6502.clklast;
- m6502.clklast = m6502.clktime + clkfrm;
-
- uint16_t usedBytes = (*woz_trks)[track].bytes_used < WOZ1_TRACK_BYTE_COUNT ? (*woz_trks)[track].bytes_used : WOZ1_TRACK_BYTE_COUNT;
-
- if ( usedBytes ) {
+ if ( woz_tmap && woz_trks ) {
+ int track = woz_tmap->phase[disk.phase.count];
+ if (outdev) fprintf(outdev, "track: %d (%d) ", track, disk.phase.count);
+ if ( track >= 40 ) {
+ dbgPrintf("TRACK TOO HIGH!\n");
+ return;
+ }
- // for DEBUG ONLY!!!
- if (outdev) fprintf(outdev, "elpased:%llu data:$%02X\n", clkelpased, data);
- printWozBuffer("*start", 0, WOZwrite);
-
+ woz_flags.disk_modified = 1;
- if ( clkelpased > 32 ) {
-// if (outdev) fprintf(outdev, "I/O ERROR : %llu\n", clkelpased);
+ clkelpased = m6502.clktime + clkfrm - m6502.clklast;
+ m6502.clklast = m6502.clktime + clkfrm;
- uint64_t bitForward = (clkelpased - 32) >> 2;
+ uint16_t usedBytes = (*woz_trks)[track].bytes_used < WOZ1_TRACK_BYTE_COUNT ? (*woz_trks)[track].bytes_used : WOZ1_TRACK_BYTE_COUNT;
+
+ if ( usedBytes ) {
- // simulate disk spin over time
- while ( bitForward-- ) {
+ // for DEBUG ONLY!!!
+ if (outdev) fprintf(outdev, "elpased:%llu data:$%02X\n", clkelpased, data);
+ printWozBuffer("*start", 0, WOZwrite);
+
+
+ if ( clkelpased > 32 ) {
+ // if (outdev) fprintf(outdev, "I/O ERROR : %llu\n", clkelpased);
+
+ uint64_t bitForward = (clkelpased - 32) >> 2;
+
+ // simulate disk spin over time
+ while ( bitForward-- ) {
+ if ( ++bitOffset >= 8 ) {
+ bitOffset = 0;
+ trackWRoffset = trackOffset;
+ trackOffset++;
+ trackOffset %= usedBytes;
+
+ // WOZwrite.data =
+ WOZread.data = (*woz_trks)[track].data[trackOffset];
+ }
+
+ WOZread.shift <<= 1;
+ WOZwrite.shift <<= 1;
+
+ if ( WOZread.valid ) {
+ WOZread.latch = 0;
+ }
+ }
+ }
+
+
+ // ok now we can latch data
+ WOZwrite.data = WOZread.data = data;
+ printWozBuffer("datain", 0, WOZwrite);
+
+ int i = 8; // 8 bit to shift in
+
+ // shift in 8 bits of data and write it out
+ while ( i-- ) {
if ( ++bitOffset >= 8 ) {
+ // write out first part
+ (*woz_trks)[track].data[trackWRoffset] = WOZwrite.latch;
+
bitOffset = 0;
trackWRoffset = trackOffset;
trackOffset++;
trackOffset %= usedBytes;
-// WOZwrite.data =
- WOZread.data = (*woz_trks)[track].data[trackOffset];
+ // simulate shift in data (path of write latch is already loaded, we should not overwrite it!)
+ uint8_t new = (*woz_trks)[track].data[trackOffset];
+ new >>= i + 1;
+ WOZread.data |= new;
+ // WOZwrite.data |= new;
+
+ printWozBuffer("shl1in", i, WOZwrite);
+ WOZread.shift <<= 1;
+ WOZwrite.shift <<= 1;
+ break;
}
-
- WOZread.shift <<= 1;
- WOZwrite.shift <<= 1;
-
- if ( WOZread.valid ) {
- WOZread.latch = 0;
- }
- }
- }
-
-
- // ok now we can latch data
- WOZwrite.data = WOZread.data = data;
- printWozBuffer("datain", 0, WOZwrite);
-
- int i = 8; // 8 bit to shift in
-
- // shift in 8 bits of data and write it out
- while ( i-- ) {
- if ( ++bitOffset >= 8 ) {
- // write out first part
- (*woz_trks)[track].data[trackWRoffset] = WOZwrite.latch;
- bitOffset = 0;
- trackWRoffset = trackOffset;
- trackOffset++;
- trackOffset %= usedBytes;
-
- // simulate shift in data (path of write latch is already loaded, we should not overwrite it!)
- uint8_t new = (*woz_trks)[track].data[trackOffset];
- new >>= i + 1;
- WOZread.data |= new;
-// WOZwrite.data |= new;
-
- printWozBuffer("shl1in", i, WOZwrite);
WOZread.shift <<= 1;
WOZwrite.shift <<= 1;
- break;
- }
-
- WOZread.shift <<= 1;
- WOZwrite.shift <<= 1;
- printWozBuffer("shift1", i, WOZwrite);
- };
- printWozBuffer("shift1", 9, WOZwrite);
+ printWozBuffer("shift1", i, WOZwrite);
+ };
+ printWozBuffer("shift1", 9, WOZwrite);
- // write the remaining bits without altering WOZ track offsets and indexes
-// WOZread_t WOZtmp = WOZwrite;
-// int bo = bitOffset;
-
- // second half
- while ( i-- ) {
- if ( ++bitOffset >= 8 ) {
- // write out first part
- (*woz_trks)[track].data[trackWRoffset] = WOZwrite.latch;
- break;
- }
+ // write the remaining bits without altering WOZ track offsets and indexes
+ // WOZread_t WOZtmp = WOZwrite;
+ // int bo = bitOffset;
- WOZwrite.shift <<= 1;
- printWozBuffer("shift2", i, WOZwrite);
- };
- printWozBuffer("shift2", 9, WOZwrite);
+ // second half
+ while ( i-- ) {
+ if ( ++bitOffset >= 8 ) {
+ // write out first part
+ (*woz_trks)[track].data[trackWRoffset] = WOZwrite.latch;
+ break;
+ }
+
+ WOZwrite.shift <<= 1;
+ printWozBuffer("shift2", i, WOZwrite);
+ };
+ printWozBuffer("shift2", 9, WOZwrite);
+ }
}
-
}