From e18173605b31885ab380c543edfd42cb70c9d5a8 Mon Sep 17 00:00:00 2001 From: tudnai Date: Tue, 26 May 2020 21:13:31 -0700 Subject: [PATCH] - Fixed 80 col rendering issue - Interestingly speed bumped up a bit too --- A2Mac.xcodeproj/project.pbxproj | 4 ++ .../xcdebugger/Expressions.xcexplist | 19 +++++++- A2Mac/Base.lproj/Main.storyboard | 6 +++ A2Mac/ViewController.swift | 19 +++++--- Resources/Wavy Navy (4am crack).woz | Bin 0 -> 233216 bytes src/dev/mem/mmio.h | 46 ++++++++---------- 6 files changed, 61 insertions(+), 33 deletions(-) create mode 100644 Resources/Wavy Navy (4am crack).woz diff --git a/A2Mac.xcodeproj/project.pbxproj b/A2Mac.xcodeproj/project.pbxproj index 75f02da..1cc7416 100644 --- a/A2Mac.xcodeproj/project.pbxproj +++ b/A2Mac.xcodeproj/project.pbxproj @@ -28,6 +28,7 @@ 32440B7D247CB649000F9DA1 /* Merlin Macroassembler Side 1 (SDS, 1983).woz in Resources */ = {isa = PBXBuildFile; fileRef = 32440B7B247CB649000F9DA1 /* Merlin Macroassembler Side 1 (SDS, 1983).woz */; }; 32440B80247CB66C000F9DA1 /* Merlin Assembler (early version, 40-column, DOS 3.3) side A.woz in Resources */ = {isa = PBXBuildFile; fileRef = 32440B7E247CB66C000F9DA1 /* Merlin Assembler (early version, 40-column, DOS 3.3) side A.woz */; }; 32440B81247CB66C000F9DA1 /* Merlin Assembler (early version, 40-column, DOS 3.3) side B.woz in Resources */ = {isa = PBXBuildFile; fileRef = 32440B7F247CB66C000F9DA1 /* Merlin Assembler (early version, 40-column, DOS 3.3) side B.woz */; }; + 32440B83247CC4C0000F9DA1 /* Wavy Navy (4am crack).woz in Resources */ = {isa = PBXBuildFile; fileRef = 32440B82247CC4C0000F9DA1 /* Wavy Navy (4am crack).woz */; }; 325EB62F23F8856F00C6B4A4 /* woz.c in Sources */ = {isa = PBXBuildFile; fileRef = 325EB62E23F8856F00C6B4A4 /* woz.c */; }; 325EB63623F8F78300C6B4A4 /* disk.c in Sources */ = {isa = PBXBuildFile; fileRef = 325EB63523F8F78300C6B4A4 /* disk.c */; }; 325EB63923F9E48100C6B4A4 /* common.c in Sources */ = {isa = PBXBuildFile; fileRef = 325EB63823F9E48100C6B4A4 /* common.c */; }; @@ -174,6 +175,7 @@ 32440B7B247CB649000F9DA1 /* Merlin Macroassembler Side 1 (SDS, 1983).woz */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Merlin Macroassembler Side 1 (SDS, 1983).woz"; sourceTree = ""; }; 32440B7E247CB66C000F9DA1 /* Merlin Assembler (early version, 40-column, DOS 3.3) side A.woz */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Merlin Assembler (early version, 40-column, DOS 3.3) side A.woz"; sourceTree = ""; }; 32440B7F247CB66C000F9DA1 /* Merlin Assembler (early version, 40-column, DOS 3.3) side B.woz */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Merlin Assembler (early version, 40-column, DOS 3.3) side B.woz"; sourceTree = ""; }; + 32440B82247CC4C0000F9DA1 /* Wavy Navy (4am crack).woz */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Wavy Navy (4am crack).woz"; sourceTree = ""; }; 325EB62D23F8856F00C6B4A4 /* woz.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = woz.h; sourceTree = ""; }; 325EB62E23F8856F00C6B4A4 /* woz.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = woz.c; sourceTree = ""; }; 325EB63423F8F78300C6B4A4 /* disk.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = disk.h; sourceTree = ""; }; @@ -452,6 +454,7 @@ 325EB6972401118200C6B4A4 /* Qbit.woz */, 325EB69A2401118300C6B4A4 /* Sneakers.woz */, 325EB6962401118200C6B4A4 /* Wavy Navy.woz */, + 32440B82247CC4C0000F9DA1 /* Wavy Navy (4am crack).woz */, 325EB69B2401118300C6B4A4 /* Xonix.woz */, 32440B73247CAA00000F9DA1 /* Merlin Pro 2.45 (DOS) Disk 1-2.woz */, 32440B74247CAA00000F9DA1 /* Merlin Pro 2.45 (DOS) Disk 2-2.woz */, @@ -825,6 +828,7 @@ 325EB69023FE028800C6B4A4 /* Donkey Kong.woz in Resources */, 325EB68923FDDF6200C6B4A4 /* Hard Hat Mack - Disk 1, Side A.woz in Resources */, 325EB69F2401118300C6B4A4 /* Crossfire.woz in Resources */, + 32440B83247CC4C0000F9DA1 /* Wavy Navy (4am crack).woz in Resources */, 32440B81247CB66C000F9DA1 /* Merlin Assembler (early version, 40-column, DOS 3.3) side B.woz in Resources */, 32440B80247CB66C000F9DA1 /* Merlin Assembler (early version, 40-column, DOS 3.3) side A.woz in Resources */, 32BFFB5F22EACC660003B53F /* Assets.xcassets in Resources */, 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 bdfa947..cb63d44 100644 --- a/A2Mac.xcodeproj/project.xcworkspace/xcuserdata/trudnai.xcuserdatad/xcdebugger/Expressions.xcexplist +++ b/A2Mac.xcodeproj/project.xcworkspace/xcuserdata/trudnai.xcuserdatad/xcdebugger/Expressions.xcexplist @@ -66,9 +66,21 @@ + + + + + + + + + value = "MEMcfg"> + value = "AUX[0x22]"> + + diff --git a/A2Mac/Base.lproj/Main.storyboard b/A2Mac/Base.lproj/Main.storyboard index 3cc8976..b77a966 100644 --- a/A2Mac/Base.lproj/Main.storyboard +++ b/A2Mac/Base.lproj/Main.storyboard @@ -711,6 +711,12 @@ + + + + + + diff --git a/A2Mac/ViewController.swift b/A2Mac/ViewController.swift index 3b49870..67acc09 100644 --- a/A2Mac/ViewController.swift +++ b/A2Mac/ViewController.swift @@ -192,10 +192,12 @@ class ViewController: NSViewController { // static var flashingSpace : Character = " " let ramBufferPointer = UnsafeRawBufferPointer(start: MEM, count: 64 * 1024) - static let textPage1Pointer = UnsafeRawBufferPointer(start: MEM + textPage1Addr, count: textBufferSize * 2) - static let textPage2Pointer = UnsafeRawBufferPointer(start: MEM + textPage2Addr, count: textBufferSize * 2) + static let textPage1Pointer = UnsafeRawBufferPointer(start: MEM + textPage1Addr, count: textBufferSize) + static let textPage2Pointer = UnsafeRawBufferPointer(start: MEM + textPage2Addr, count: textBufferSize) + static let textIntBufferPointer = UnsafeRawBufferPointer(start: RAM + textPage1Addr, count: textBufferSize) + static let textAuxBufferPointer = UnsafeRawBufferPointer(start: AUX + textPage1Addr, count: textBufferSize) + var textBufferPointer = textPage1Pointer - let textAuxBufferPointer = UnsafeRawBufferPointer(start: AUX + textPage1Addr, count: textBufferSize) static let textArraySize = textLines * (textCols + lineEndChars) + textCols * 2 @@ -495,7 +497,7 @@ class ViewController: NSViewController { // Rendering is happening in the main thread, which has two implications: // 1. We can update UI elements // 2. it is independent of the simulation, de that is running in the background thread while we are busy with rendering... - DispatchQueue.main.async { + DispatchQueue.main.sync { var txt : String = "" var fromLines = 0 @@ -542,16 +544,21 @@ class ViewController: NSViewController { } // 80 col else { + let auxPage = ( MEMcfg.is_80STORE == 1 ) && ( MEMcfg.txt_page_2 == 1 ) + + let textIntBuffer = auxPage ? ViewController.textIntBufferPointer : ViewController.textPage1Pointer + let textAuxBuffer = auxPage ? ViewController.textPage1Pointer : ViewController.textAuxBufferPointer + // render the rest of the text screen for y in fromLines ..< toLines { for x in 0 ..< self.textCols { - let byte = self.textBufferPointer[ self.textLineOfs[y] + x ] + let byte = textIntBuffer[ self.textLineOfs[y] + x ] let idx = Int(byte); let chr = ViewController.charConvTbl[idx] self.txtArr[ y * (self.textCols * 2 + self.lineEndChars) + x * 2 + 1] = chr - let byte2 = self.textAuxBufferPointer[ self.textLineOfs[y] + x ] + let byte2 = textAuxBuffer[ self.textLineOfs[y] + x ] let idx2 = Int(byte2); let chr2 = ViewController.charConvTbl[idx2] diff --git a/Resources/Wavy Navy (4am crack).woz b/Resources/Wavy Navy (4am crack).woz new file mode 100644 index 0000000000000000000000000000000000000000..0d9e3970b422863b06a926c8df6c0a8ef6857ed2 GIT binary patch literal 233216 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 NDER4qPhib|z5&#uSK0so literal 0 HcmV?d00001 diff --git a/src/dev/mem/mmio.h b/src/dev/mem/mmio.h index b7baa9a..4535ae9 100644 --- a/src/dev/mem/mmio.h +++ b/src/dev/mem/mmio.h @@ -328,36 +328,32 @@ void resetMemory() { } -static uint8_t page2 = 0; -static uint8_t * activePage = Apple2_64K_RAM + 0x400; +static uint8_t activeTextAuxPage = 0; +static uint8_t * activeTextPage = Apple2_64K_RAM + 0x400; +static uint8_t * shadowTextPage = Apple2_64K_MEM + 0x400; + +inline uint8_t *extracted() { + uint8_t * shadow = Apple2_64K_MEM + 0x400; + return shadow; +} void textPageSelect() { - uint8_t * shadow = Apple2_64K_MEM + 0x400; + uint8_t textAuxPage = MEMcfg.is_80STORE && MEMcfg.txt_page_2; - if ( page2 != MEMcfg.txt_page_2 ) { - page2 = MEMcfg.txt_page_2; - static uint8_t * newPage = NULL; + if ( activeTextAuxPage != textAuxPage ) { + activeTextAuxPage = textAuxPage; + uint8_t * newTextPage = ( textAuxPage ? Apple2_64K_AUX : Apple2_64K_RAM ) + 0x400; - if ( MEMcfg.is_80STORE && MEMcfg.txt_page_2 ) { - newPage = Apple2_64K_AUX + 0x400; - } - else { - newPage = Apple2_64K_RAM + 0x400; - } - - if ( activePage != newPage ) { - if ( activePage ) { - // save the content of Shadow Memory - memcpy(activePage, shadow, 0x400); - } - - // load the content of Video Page 2 - memcpy(shadow, newPage, 0x400); - - activePage = newPage; + if ( activeTextPage ) { + // save the content of Shadow Memory + memcpy(activeTextPage, shadowTextPage, 0x400); } + + // load the content of new Video Page + memcpy(shadowTextPage, newTextPage, 0x400); + + activeTextPage = newTextPage; } - } @@ -786,7 +782,7 @@ INLINE void ioWrite( uint16_t addr, uint8_t val ) { case io_VID_TXTPAGE2: // printf("io_VID_TXTPAGE2\n"); - MEMcfg.txt_page_2 = ! MEMcfg.is_80STORE; + MEMcfg.txt_page_2 = 1; textPageSelect(); break;