From 68ef56799493524b14bdc2e5ae00032b4487f906 Mon Sep 17 00:00:00 2001 From: Tamas Rudnai Date: Tue, 7 May 2024 20:10:16 -0700 Subject: [PATCH] Woz 2.0 + Better HiRes + Better Sound + Hard Hat Mack disk --- A2Mac.xcodeproj/project.pbxproj | 2 + .../xcdebugger/Expressions.xcexplist | 317 ++++++++-------- A2Mac/HiRes.swift | 15 +- A2Mac/Info.plist | 2 +- Hard Hat Mack - Disk 1, Side A.dsk | Bin 0 -> 143360 bytes Hard Hat Mack - Disk 1, Side A.woz | Bin 0 -> 221436 bytes src/dev/audio/speaker.c | 119 +++++- src/dev/disk/woz.c | 324 +++++++++++++--- woz_debug.rtf | 354 +++++++++++++++++- 9 files changed, 923 insertions(+), 210 deletions(-) create mode 100644 Hard Hat Mack - Disk 1, Side A.dsk create mode 100644 Hard Hat Mack - Disk 1, Side A.woz diff --git a/A2Mac.xcodeproj/project.pbxproj b/A2Mac.xcodeproj/project.pbxproj index ad9d83b..b3044a4 100644 --- a/A2Mac.xcodeproj/project.pbxproj +++ b/A2Mac.xcodeproj/project.pbxproj @@ -639,6 +639,7 @@ 32440BA22480D5C0000F9DA1 /* LoRes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoRes.swift; sourceTree = ""; }; 324D15D224ADAC71008AAFB0 /* floppy.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = floppy.png; sourceTree = ""; }; 32544194264A6C1600B7E3ED /* DisplayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayView.swift; sourceTree = ""; }; + 32583B682B5CAD8700A45F0A /* woz_debug.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = woz_debug.rtf; sourceTree = ""; }; 325B75DF2909F95000B29605 /* 6502_dbg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = 6502_dbg.c; sourceTree = ""; }; 325B7652290A32CC00B29605 /* 6502_dbg.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = 6502_dbg.h; sourceTree = ""; }; 325DC40D24AC5ABC00EB8858 /* doc.on.doc.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = doc.on.doc.png; sourceTree = ""; }; @@ -1148,6 +1149,7 @@ 32BFFB4E22EACC630003B53F = { isa = PBXGroup; children = ( + 32583B682B5CAD8700A45F0A /* woz_debug.rtf */, 32D08991291AF23500F2B486 /* Debug.storyboard */, 326426112328ADF4008B615F /* Apple_II_ROM.s */, 325EB63123F8861A00C6B4A4 /* src */, 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 674450b..79c7ab7 100644 --- a/A2Mac.xcodeproj/project.xcworkspace/xcuserdata/trudnai.xcuserdatad/xcdebugger/Expressions.xcexplist +++ b/A2Mac.xcodeproj/project.xcworkspace/xcuserdata/trudnai.xcuserdatad/xcdebugger/Expressions.xcexplist @@ -3,22 +3,10 @@ version = "1.0"> + contextName = "ViewController.newUpdateTimer(timeInterval:):ViewController.swift"> - - - - - - - - + value = "upd"> @@ -26,30 +14,59 @@ contextName = "HiRes.compute():HiRes.swift"> + value = "computePipelineState.maxTotalThreadsPerThreadgroup"> + value = "UnsafeRawBufferPointer(result)"> - - + contextName = "_memwrite8_low:mmio.c"> + value = "MEMcfg"> + value = "currentLowWRMEM == Apple2_64K_MEM"> + value = "WRLOMEM == currentLowWRMEM"> + + + + + + + + + + + + + + + + + + + + + + @@ -74,16 +91,13 @@ + contextName = "memwrite8_bank2:mmio.h"> + value = "WRD0MEM"> - - + value = "WRHIMEM"> @@ -102,30 +116,36 @@ value = "disassLineRange[forLine]"> + value = "disassLineRange"> + value = "disassLineRange.count"> + contextName = "woz_write:woz.c"> + value = "WOZwrite.data"> + value = "new"> + value = "WOZwrite.shift16"> + value = "WOZwrite.shift"> + value = "bitOffset"> + + + + @@ -165,10 +185,10 @@ contextName = "HiRes.draw(_:):HiRes.swift"> + value = "linAddr"> + value = "ctx?.bitsPerComponent"> @@ -185,6 +205,9 @@ + + @@ -195,10 +218,7 @@ value = "ctx?.height"> - - + value = "ctx?.data"> @@ -226,7 +246,7 @@ contextName = "DebuggerViewController.DisplayDisassembly():DebuggerViewController.swift"> + value = "line_number"> @@ -235,7 +255,7 @@ value = "m6502.PC"> + value = "disass_addr_min"> @@ -472,10 +492,10 @@ value = "WRLOMEM == Apple2_64K_RAM"> + value = "newReadMEM == Apple2_64K_RAM + 0x200"> + value = "currentLowWRMEM == newWriteMEM"> @@ -534,7 +554,7 @@ value = "m6502_saved.PC"> + value = "scroll_line_number"> @@ -543,7 +563,7 @@ value = "m6502.PC"> + value = "isCurrentLine"> @@ -557,7 +577,7 @@ value = "textDisplay_height_diff"> + value = "textDisplay.frame"> @@ -566,10 +586,10 @@ value = "frame.size"> + value = "textDisplay_width_diff"> + value = "textDisplay.bounds"> @@ -635,10 +655,10 @@ contextName = "set_flags_NZC:common.h"> + value = "(unsigned)test "> + value = "(unsigned)0xFF"> @@ -748,10 +768,10 @@ value = "MEMcfg.int_Cx_ROM"> + value = "(int)IOframe"> + value = "m6502.clkfrm"> @@ -762,10 +782,10 @@ value = "Apple2_64K_AUX + 0xC600"> + value = "(void*)rom"> + value = "Apple2_64K_RAM + 0xC600"> @@ -897,16 +917,16 @@ contextName = "DisplayScrollView.scrollWheel(with:):DisplayScrollView.swift"> + value = "subviews[1].subviews"> + value = "documentView"> + value = "textView.defaultParagraphStyle?.lineSpacing"> @@ -1006,10 +1026,10 @@ contextName = "_fetch_dbg:mmio.c"> + value = "memread8_low(m6502.PC)"> + value = "disassembly.pOpcode"> @@ -1017,13 +1037,13 @@ contextName = "m6502_dbg_bp_add:6502_bp.c"> + value = "bp_array"> + value = "bp"> @@ -1098,7 +1118,7 @@ contextName = "DebuggerViewController.DisplayDisassembly(scrollY:):DebuggerViewController.swift"> + value = "isCurrentLine"> @@ -1107,7 +1127,7 @@ value = "m6502.PC"> + value = "scroll_line_number"> @@ -1136,20 +1156,20 @@ - - - - + + + + @@ -1200,6 +1220,9 @@ + + @@ -1212,6 +1235,12 @@ + + + + + value = "blockChanged[ screenIdx ]"> @@ -1243,7 +1272,7 @@ value = "UInt8(block & 4)"> + value = "UInt8( (block >> 4) & 0x0F )"> @@ -1300,22 +1329,22 @@ value = "m6502"> + value = "(void*)Apple2_64K_RAM"> + value = "Apple2_64K_RAM + 0x3600"> + + - - + value = "m6502.clkfrm"> @@ -1329,7 +1358,7 @@ value = "pdl_value[pdl]"> + value = "normalized_time >= pdl_value[pdl] ? 255 : 0"> @@ -1341,7 +1370,7 @@ value = "1 * 512 * (1 - ( 3300 / 3300.0 ))"> + value = "normalized_time"> @@ -1360,10 +1389,10 @@ contextName = "ToolBarController.GamePort(_:):ToolBarController.swift"> + value = "ViewController.current?.mouseCursorJoystickEmulation"> + value = "ViewController.current?.mouseCursorHidden"> @@ -1447,6 +1476,14 @@ + + + + + + @@ -1586,7 +1623,7 @@ value = "m6502.PC"> + value = "m6502.clkfrm"> @@ -1595,7 +1632,7 @@ value = "frameCounter"> + value = "m6502.debugger.on"> @@ -1640,6 +1677,26 @@ + + + + + + + + + + + + + + @@ -1647,7 +1704,7 @@ value = "default_MHz_6502 * 1000 * 1000 / spkr_sample_rate"> + value = "( (spkr_clk + m6502.clkfrm) / ( 1024000 / spkr_sample_rate ) ) * 2"> @@ -1665,98 +1722,58 @@ value = "(spkr_clk + m6502.clkfrm)"> + value = "( (spkr_clk + m6502.clkfrm) / ( default_MHz_6502 * 1000 * 1000 / spkr_sample_rate)) * 2"> + contextName = "AND:6502_instr_logic.h"> + + + value = "line_number"> + + + + + contextName = "ViewController.mouseMoved(with:):ViewController.swift"> + value = "oldLocation"> + value = "mouseLocation"> - - - - - - - - - - - - + value = "view.bounds"> + contextName = "closure #1 in ViewController.Update():ViewController.swift"> + value = "txtArr"> + value = "self.shadowTxt"> - - - - - - + value = "txt"> - - - - - - + value = "MEMcfg.is_80STORE"> - - - - - - - - - - + value = "MEMcfg.txt_page_2"> diff --git a/A2Mac/HiRes.swift b/A2Mac/HiRes.swift index 65032b6..729bfdc 100644 --- a/A2Mac/HiRes.swift +++ b/A2Mac/HiRes.swift @@ -341,9 +341,11 @@ class HiRes: NSView { switch ( pixel ) { case 1: // purple (bits are in reverse!) + pixelsSRGB[colorAddr - 1] = color_purple + pixelsSRGB[colorAddr - 2] = color_purple pixelsSRGB[colorAddr] = color_purple pixelsSRGB[colorAddr + 1] = color_purple - pixelsSRGB[colorAddr + 2] = color_purple +// pixelsSRGB[colorAddr + 2] = color_purple if (colorAddr >= 2) && (prev != 0x03) && (prev != 0x07) && (prev != 0x00) && (prev != 0x04) { pixelsSRGB[colorAddr - 1] = color_purple pixelsSRGB[colorAddr - 2] = color_purple @@ -351,10 +353,10 @@ class HiRes: NSView { case 2: // green // reducing color bleeding - if (colorAddr > 1) && (pixelsSRGB[colorAddr - 2] != color_black) { + if (colorAddr > 1) && ((pixelsSRGB[colorAddr - 2] == color_green) || (pixelsSRGB[colorAddr - 2] == color_white)) { pixelsSRGB[colorAddr + 0] = color_green } - pixelsSRGB[colorAddr] = color_green +// pixelsSRGB[colorAddr] = color_green pixelsSRGB[colorAddr + 1] = color_green pixelsSRGB[colorAddr + 2] = color_green pixelsSRGB[colorAddr + 3] = color_green @@ -371,7 +373,7 @@ class HiRes: NSView { pixelsSRGB[colorAddr + 1] = color_white pixelsSRGB[colorAddr + 2] = color_white pixelsSRGB[colorAddr + 3] = color_white - pixelsSRGB[colorAddr + 4] = color_white +// pixelsSRGB[colorAddr + 4] = color_white case 5: // blue pixelsSRGB[colorAddr + 1] = color_blue @@ -386,8 +388,8 @@ class HiRes: NSView { // reducing color bleeding if (colorAddr > 0) && (pixelsSRGB[colorAddr - 2] != color_black) { pixelsSRGB[colorAddr + 0] = color_orange // important for color bleeding and color contiunity - pixelsSRGB[colorAddr + 1] = color_orange } + pixelsSRGB[colorAddr + 1] = color_orange pixelsSRGB[colorAddr + 2] = color_orange pixelsSRGB[colorAddr + 3] = color_orange pixelsSRGB[colorAddr + 4] = color_orange @@ -397,11 +399,12 @@ class HiRes: NSView { // pixelsSRGB[colorAddr - 2] = color_white // HiRes.pixelsSRGB[colorAddr - 2] pixelsSRGB[colorAddr - 1] = color_white } + pixelsSRGB[colorAddr - 1] = color_white pixelsSRGB[colorAddr + 0] = color_white // Donkey Kong would be perfect but problem in Sneakers pixelsSRGB[colorAddr + 1] = color_white pixelsSRGB[colorAddr + 2] = color_white pixelsSRGB[colorAddr + 3] = color_white - pixelsSRGB[colorAddr + 4] = color_white +// pixelsSRGB[colorAddr + 4] = color_white case 0: // 0x00 (black 1), 0x04 (black 2) // pixelsSRGB[colorAddr + 0] = color_black diff --git a/A2Mac/Info.plist b/A2Mac/Info.plist index 4de6ec2..4f40f82 100644 --- a/A2Mac/Info.plist +++ b/A2Mac/Info.plist @@ -23,7 +23,7 @@ CFBundleVersion 1 LSApplicationCategoryType - public.app-category.education + public.app-category.arcade-games LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSHumanReadableCopyright diff --git a/Hard Hat Mack - Disk 1, Side A.dsk b/Hard Hat Mack - Disk 1, Side A.dsk new file mode 100644 index 0000000000000000000000000000000000000000..49d758779764b1d17be2de095d7ccddfdc568c51 GIT binary patch literal 143360 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