Compare commits

...

5 Commits

Author SHA1 Message Date
Tamas Rudnai 67cc9d2359 Rudimentary implementation of DGR / Double LoRes 2024-01-14 20:48:18 -08:00
Tamas Rudnai 8cafeff4d9 Preparation for DGR / Double LoRes rendering 2024-01-14 18:38:13 -08:00
Tamas Rudnai 5e272a9686 Preparing for DGR / Double LoRes support 2024-01-14 18:25:46 -08:00
Tamas Rudnai 112f43fafe Video Text/LoRes mem fix for Int/Aux mempry select 2024-01-14 07:45:11 -08:00
Tamas Rudnai 39f6bdc1bd BugFix: RAM does not saved at AUX selection 2024-01-13 17:47:42 -08:00
8 changed files with 352 additions and 234 deletions

View File

@ -3,10 +3,22 @@
version = "1.0">
<ContextStates>
<ContextState
contextName = "ViewController.newUpdateTimer(timeInterval:):ViewController.swift">
contextName = "HiRes.initMetal():HiRes.swift">
<PersistentStrings>
<PersistentString
value = "upd">
value = "mtlBufferB">
</PersistentString>
<PersistentString
value = "addFunction">
</PersistentString>
<PersistentString
value = "device">
</PersistentString>
<PersistentString
value = "mtlBufferA">
</PersistentString>
<PersistentString
value = "mtlBufferC">
</PersistentString>
</PersistentStrings>
</ContextState>
@ -14,53 +26,30 @@
contextName = "HiRes.compute():HiRes.swift">
<PersistentStrings>
<PersistentString
value = "computePipelineState.maxTotalThreadsPerThreadgroup">
value = "UnsafeRawBufferPointer(result)">
</PersistentString>
<PersistentString
value = "result[2]">
</PersistentString>
<PersistentString
value = "UnsafeRawBufferPointer(result)">
value = "computePipelineState.maxTotalThreadsPerThreadgroup">
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "spkr_toggle:speaker.c">
<PersistentStrings>
<PersistentString
value = "default_MHz_6502 * 1000 * 1000 / spkr_sample_rate">
</PersistentString>
<PersistentString
value = "( (spkr_clk + m6502.clkfrm) / ( 1024000 / spkr_sample_rate ) ) * 2">
</PersistentString>
<PersistentString
value = "(int16_t)28000 + (int16_t)-32768">
</PersistentString>
<PersistentString
value = "spkr_samples[spkr_sample_last_idx]">
</PersistentString>
<PersistentString
value = "(int)spkr_sample_idx_diff">
</PersistentString>
<PersistentString
value = "m6502.clkfrm">
</PersistentString>
<PersistentString
value = "(spkr_clk + m6502.clkfrm)">
</PersistentString>
<PersistentString
value = "( (spkr_clk + m6502.clkfrm) / ( default_MHz_6502 * 1000 * 1000 / spkr_sample_rate)) * 2">
</PersistentString>
</PersistentStrings>
contextName = "AND:6502_instr_logic.h">
</ContextState>
<ContextState
contextName = "m6502_ColdReset:6502.c">
contextName = "specialized closure #1 in DebuggerViewController.DisplayDisassembly():DebuggerViewController.swift">
<PersistentStrings>
<PersistentString
value = "m6502">
value = "line_number">
</PersistentString>
<PersistentString
value = "RAM_PG_RD_TBL">
value = "currentScrollLine">
</PersistentString>
<PersistentString
value = "current_line_number">
</PersistentString>
</PersistentStrings>
</ContextState>
@ -85,10 +74,16 @@
</PersistentStrings>
</ContextState>
<ContextState
contextName = "BIT:6502_instr_compare_test.h">
contextName = "ViewController.mouseMoved(with:):ViewController.swift">
<PersistentStrings>
<PersistentString
value = "m6502.A">
value = "oldLocation">
</PersistentString>
<PersistentString
value = "mouseLocation">
</PersistentString>
<PersistentString
value = "view.bounds">
</PersistentString>
</PersistentStrings>
</ContextState>
@ -107,18 +102,30 @@
value = "disassLineRange[forLine]">
</PersistentString>
<PersistentString
value = "disassLineRange">
value = "disassLineRange.count">
</PersistentString>
<PersistentString
value = "disassLineRange.count">
value = "disassLineRange">
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "_memwrite8_low:mmio.c">
contextName = "closure #1 in ViewController.Update():ViewController.swift">
<PersistentStrings>
<PersistentString
value = "m6502.PC">
value = "MEMcfg.is_80STORE">
</PersistentString>
<PersistentString
value = "self.shadowTxt">
</PersistentString>
<PersistentString
value = "txt">
</PersistentString>
<PersistentString
value = "MEMcfg.txt_page_2">
</PersistentString>
<PersistentString
value = "txtArr">
</PersistentString>
</PersistentStrings>
</ContextState>
@ -158,14 +165,17 @@
contextName = "HiRes.draw(_:):HiRes.swift">
<PersistentStrings>
<PersistentString
value = "linAddr">
value = "HiRes.blockCols">
</PersistentString>
<PersistentString
value = "ctx?.height">
value = "ctx?.data">
</PersistentString>
<PersistentString
value = "ctx?.width">
</PersistentString>
<PersistentString
value = "ctx?.bitmapInfo">
</PersistentString>
<PersistentString
value = "ctx?.bytesPerRow">
</PersistentString>
@ -175,24 +185,21 @@
<PersistentString
value = "HiResLineAddrTbl">
</PersistentString>
<PersistentString
value = "ctx?.bitmapInfo">
</PersistentString>
<PersistentString
value = "shadowScreen">
</PersistentString>
<PersistentString
value = "(blockH7 | ( block &amp; bitMask ))">
</PersistentString>
<PersistentString
value = "ctx?.height">
</PersistentString>
<PersistentString
value = "linAddr">
</PersistentString>
<PersistentString
value = "ctx?.bitsPerComponent">
</PersistentString>
<PersistentString
value = "HiRes.blockCols">
</PersistentString>
<PersistentString
value = "ctx?.data">
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
@ -219,7 +226,7 @@
contextName = "DebuggerViewController.DisplayDisassembly():DebuggerViewController.swift">
<PersistentStrings>
<PersistentString
value = "line_number">
value = "disass_addr_min">
</PersistentString>
<PersistentString
value = "disass_addr">
@ -228,7 +235,7 @@
value = "m6502.PC">
</PersistentString>
<PersistentString
value = "disass_addr_min">
value = "line_number">
</PersistentString>
</PersistentStrings>
</ContextState>
@ -317,6 +324,9 @@
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "TXS [inlined]:6502_instr_transfer.h">
</ContextState>
<ContextState
contextName = "dest_ind_Y:Apple2_mmio.h">
<PersistentStrings>
@ -353,6 +363,14 @@
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "ViewController.Reset(_:):ViewController.swift">
<PersistentStrings>
<PersistentString
value = "m6502.pc">
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "textPageSelect:mmio.h">
<PersistentStrings>
@ -370,17 +388,6 @@
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "ViewController.Reset(_:):ViewController.swift">
<PersistentStrings>
<PersistentString
value = "m6502.pc">
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "TXS [inlined]:6502_instr_transfer.h">
</ContextState>
<ContextState
contextName = "ViewController.currentContext.getter:ViewController.swift">
<PersistentStrings>
@ -452,12 +459,33 @@
<ContextState
contextName = "auxMemorySelect:mmio.c">
<PersistentStrings>
<PersistentString
value = "currentLowWRMEM == Apple2_64K_MEM">
</PersistentString>
<PersistentString
value = "WRLOMEM == Apple2_64K_MEM">
</PersistentString>
<PersistentString
value = "currentLowWRMEM == Apple2_64K_RAM">
</PersistentString>
<PersistentString
value = "WRLOMEM == Apple2_64K_RAM">
</PersistentString>
<PersistentString
value = "currentLowWRMEM == newWriteMEM">
</PersistentString>
<PersistentString
value = "newReadMEM == Apple2_64K_RAM + 0x200">
</PersistentString>
<PersistentString
value = "newReadMEM == currentLowRDMEM">
</PersistentString>
<PersistentString
value = "currentLowWRMEM == Apple2_64K_AUX">
</PersistentString>
<PersistentString
value = "WRLOMEM == Apple2_64K_AUX">
</PersistentString>
<PersistentString
value = "newReadMEM == Apple2_64K_MEM + 0x200">
</PersistentString>
@ -506,7 +534,7 @@
value = "m6502_saved.PC">
</PersistentString>
<PersistentString
value = "scroll_line_number">
value = "isCurrentLine">
</PersistentString>
<PersistentString
value = "highlighted_line_number">
@ -515,7 +543,7 @@
value = "m6502.PC">
</PersistentString>
<PersistentString
value = "isCurrentLine">
value = "scroll_line_number">
</PersistentString>
</PersistentStrings>
</ContextState>
@ -529,7 +557,7 @@
value = "textDisplay_height_diff">
</PersistentString>
<PersistentString
value = "textDisplay.frame">
value = "textDisplay_width_diff">
</PersistentString>
<PersistentString
value = "MonitorView.textViewBounds">
@ -541,7 +569,7 @@
value = "textDisplay.bounds">
</PersistentString>
<PersistentString
value = "textDisplay_width_diff">
value = "textDisplay.frame">
</PersistentString>
</PersistentStrings>
</ContextState>
@ -607,10 +635,10 @@
contextName = "set_flags_NZC:common.h">
<PersistentStrings>
<PersistentString
value = "(unsigned)test ">
value = "(unsigned)0xFF">
</PersistentString>
<PersistentString
value = "(unsigned)0xFF">
value = "(unsigned)test ">
</PersistentString>
</PersistentStrings>
</ContextState>
@ -720,10 +748,10 @@
value = "MEMcfg.int_Cx_ROM">
</PersistentString>
<PersistentString
value = "(int)IOframe">
value = "m6502.clkfrm">
</PersistentString>
<PersistentString
value = "m6502.clkfrm">
value = "(int)IOframe">
</PersistentString>
</PersistentStrings>
</ContextState>
@ -734,10 +762,10 @@
value = "Apple2_64K_AUX + 0xC600">
</PersistentString>
<PersistentString
value = "(void*)rom">
value = "Apple2_64K_RAM + 0xC600">
</PersistentString>
<PersistentString
value = "Apple2_64K_RAM + 0xC600">
value = "(void*)rom">
</PersistentString>
<PersistentString
value = "strlen(fullPath)">
@ -840,9 +868,6 @@
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "POP:6502_instr_stack.h">
</ContextState>
<ContextState
contextName = "memread8_low [inlined]:mmio.c">
<PersistentStrings>
@ -851,6 +876,9 @@
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "POP:6502_instr_stack.h">
</ContextState>
<ContextState
contextName = "ToolBarController.windowWillEnterFullScreen(_:):ToolBarController.swift">
<PersistentStrings>
@ -869,16 +897,16 @@
contextName = "DisplayScrollView.scrollWheel(with:):DisplayScrollView.swift">
<PersistentStrings>
<PersistentString
value = "documentView">
value = "textView.defaultParagraphStyle?.lineSpacing">
</PersistentString>
<PersistentString
value = "subviews">
</PersistentString>
<PersistentString
value = "textView.defaultParagraphStyle?.lineSpacing">
value = "subviews[1].subviews">
</PersistentString>
<PersistentString
value = "subviews[1].subviews">
value = "documentView">
</PersistentString>
</PersistentStrings>
</ContextState>
@ -978,25 +1006,25 @@
contextName = "_fetch_dbg:mmio.c">
<PersistentStrings>
<PersistentString
value = "memread8_low(m6502.PC)">
value = "disassembly.pOpcode">
</PersistentString>
<PersistentString
value = "disassembly.pOpcode">
value = "memread8_low(m6502.PC)">
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "m6502_dbg_bp_add:6502_bp.c">
<PersistentStrings>
<PersistentString
value = "bp">
</PersistentString>
<PersistentString
value = "mem_bp_arr">
</PersistentString>
<PersistentString
value = "bp_array">
</PersistentString>
<PersistentString
value = "bp">
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
@ -1070,7 +1098,7 @@
contextName = "DebuggerViewController.DisplayDisassembly(scrollY:):DebuggerViewController.swift">
<PersistentStrings>
<PersistentString
value = "isCurrentLine">
value = "scroll_line_number">
</PersistentString>
<PersistentString
value = "highlighted_line_number">
@ -1079,7 +1107,7 @@
value = "m6502.PC">
</PersistentString>
<PersistentString
value = "scroll_line_number">
value = "isCurrentLine">
</PersistentString>
</PersistentStrings>
</ContextState>
@ -1111,6 +1139,17 @@
<ContextState
contextName = "CMP:6502_instr_compare_test.h">
</ContextState>
<ContextState
contextName = "LoRes.Render():LoRes.swift">
<PersistentStrings>
<PersistentString
value = "shadowScreen">
</PersistentString>
<PersistentString
value = "blockChanged">
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "specialized closure #1 in ViewController.Update():ViewController.swift">
<PersistentStrings>
@ -1195,7 +1234,7 @@
contextName = "LoRes.Update():LoRes.swift">
<PersistentStrings>
<PersistentString
value = "blockChanged[ screenIdx ]">
value = "UInt8( (block &gt;&gt; 4) &amp; 0x0F )">
</PersistentString>
<PersistentString
value = "UInt8(block)">
@ -1204,7 +1243,7 @@
value = "UInt8(block &amp; 4)">
</PersistentString>
<PersistentString
value = "UInt8( (block &gt;&gt; 4) &amp; 0x0F )">
value = "blockChanged[ screenIdx ]">
</PersistentString>
</PersistentStrings>
</ContextState>
@ -1261,10 +1300,10 @@
value = "m6502">
</PersistentString>
<PersistentString
value = "(void*)Apple2_64K_RAM">
value = "m6502.PC">
</PersistentString>
<PersistentString
value = "Apple2_64K_RAM + 0x3600">
value = "m6502.clkfrm">
</PersistentString>
<PersistentString
value = "m6502.ecoSpindown">
@ -1273,10 +1312,10 @@
value = "Apple2_64K_AUX + 0x3600">
</PersistentString>
<PersistentString
value = "m6502.PC">
value = "(void*)Apple2_64K_RAM">
</PersistentString>
<PersistentString
value = "m6502.clkfrm">
value = "Apple2_64K_RAM + 0x3600">
</PersistentString>
</PersistentStrings>
</ContextState>
@ -1290,7 +1329,7 @@
value = "pdl_value[pdl]">
</PersistentString>
<PersistentString
value = "normalized_time &gt;= pdl_value[pdl] ? 255 : 0">
value = "normalized_time">
</PersistentString>
<PersistentString
value = "(3300 * 255/3300)">
@ -1302,7 +1341,7 @@
value = "1 * 512 * (1 - ( 3300 / 3300.0 ))">
</PersistentString>
<PersistentString
value = "normalized_time">
value = "normalized_time &gt;= pdl_value[pdl] ? 255 : 0">
</PersistentString>
</PersistentStrings>
</ContextState>
@ -1321,10 +1360,10 @@
contextName = "ToolBarController.GamePort(_:):ToolBarController.swift">
<PersistentStrings>
<PersistentString
value = "ViewController.current?.mouseCursorJoystickEmulation">
value = "ViewController.current?.mouseCursorHidden">
</PersistentString>
<PersistentString
value = "ViewController.current?.mouseCursorHidden">
value = "ViewController.current?.mouseCursorJoystickEmulation">
</PersistentString>
</PersistentStrings>
</ContextState>
@ -1547,7 +1586,7 @@
value = "m6502.PC">
</PersistentString>
<PersistentString
value = "m6502.clkfrm">
value = "m6502.debugger.on">
</PersistentString>
<PersistentString
value = "textLines * (textCols+1) + textCols">
@ -1556,7 +1595,7 @@
value = "frameCounter">
</PersistentString>
<PersistentString
value = "m6502.debugger.on">
value = "m6502.clkfrm">
</PersistentString>
<PersistentString
value = "spkr_play_disk_motor_time">
@ -1582,17 +1621,105 @@
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "m6502_ColdReset:6502.c">
<PersistentStrings>
<PersistentString
value = "m6502">
</PersistentString>
<PersistentString
value = "RAM_PG_RD_TBL">
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "BIT:6502_instr_compare_test.h">
<PersistentStrings>
<PersistentString
value = "m6502.A">
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "spkr_toggle:speaker.c">
<PersistentStrings>
<PersistentString
value = "default_MHz_6502 * 1000 * 1000 / spkr_sample_rate">
</PersistentString>
<PersistentString
value = "( (spkr_clk + m6502.clkfrm) / ( default_MHz_6502 * 1000 * 1000 / spkr_sample_rate)) * 2">
</PersistentString>
<PersistentString
value = "(int16_t)28000 + (int16_t)-32768">
</PersistentString>
<PersistentString
value = "spkr_samples[spkr_sample_last_idx]">
</PersistentString>
<PersistentString
value = "(int)spkr_sample_idx_diff">
</PersistentString>
<PersistentString
value = "m6502.clkfrm">
</PersistentString>
<PersistentString
value = "(spkr_clk + m6502.clkfrm)">
</PersistentString>
<PersistentString
value = "( (spkr_clk + m6502.clkfrm) / ( 1024000 / spkr_sample_rate ) ) * 2">
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "ViewController.newUpdateTimer(timeInterval:):ViewController.swift">
<PersistentStrings>
<PersistentString
value = "upd">
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "_memwrite8_low:mmio.c">
<PersistentStrings>
<PersistentString
value = "MEMcfg">
</PersistentString>
<PersistentString
value = "currentLowWRMEM == Apple2_64K_MEM">
</PersistentString>
<PersistentString
value = "WRLOMEM == currentLowWRMEM">
</PersistentString>
<PersistentString
value = "RDLOMEM == WRLOMEM">
</PersistentString>
<PersistentString
value = "m6502.PC">
</PersistentString>
<PersistentString
value = "currentLowWRMEM == Apple2_64K_RAM">
</PersistentString>
<PersistentString
value = "WRLOMEM == Apple2_64K_MEM">
</PersistentString>
<PersistentString
value = "currentLowWRMEM == Apple2_64K_AUX">
</PersistentString>
<PersistentString
value = "WRLOMEM[0x3F6]">
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "m6502_Debug:6502.c">
<PersistentStrings>
<PersistentString
value = "m6502.SP">
value = "m6502.debugger.SP">
</PersistentString>
<PersistentString
value = "m6502.debugger.mask.ret">
</PersistentString>
<PersistentString
value = "m6502.debugger.SP">
value = "m6502.SP">
</PersistentString>
</PersistentStrings>
</ContextState>
@ -1617,7 +1744,7 @@
value = "new">
</PersistentString>
<PersistentString
value = "WOZwrite.shift16">
value = "WOZtmp.shift16">
</PersistentString>
<PersistentString
value = "WOZwrite.shift">
@ -1629,78 +1756,7 @@
value = "(1 &lt;&lt; i) - 1">
</PersistentString>
<PersistentString
value = "WOZtmp.shift16">
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "HiRes.initMetal():HiRes.swift">
<PersistentStrings>
<PersistentString
value = "mtlBufferB">
</PersistentString>
<PersistentString
value = "addFunction">
</PersistentString>
<PersistentString
value = "device">
</PersistentString>
<PersistentString
value = "mtlBufferA">
</PersistentString>
<PersistentString
value = "mtlBufferC">
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "AND:6502_instr_logic.h">
</ContextState>
<ContextState
contextName = "specialized closure #1 in DebuggerViewController.DisplayDisassembly():DebuggerViewController.swift">
<PersistentStrings>
<PersistentString
value = "line_number">
</PersistentString>
<PersistentString
value = "currentScrollLine">
</PersistentString>
<PersistentString
value = "current_line_number">
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "ViewController.mouseMoved(with:):ViewController.swift">
<PersistentStrings>
<PersistentString
value = "oldLocation">
</PersistentString>
<PersistentString
value = "mouseLocation">
</PersistentString>
<PersistentString
value = "view.bounds">
</PersistentString>
</PersistentStrings>
</ContextState>
<ContextState
contextName = "closure #1 in ViewController.Update():ViewController.swift">
<PersistentStrings>
<PersistentString
value = "txtArr">
</PersistentString>
<PersistentString
value = "self.shadowTxt">
</PersistentString>
<PersistentString
value = "txt">
</PersistentString>
<PersistentString
value = "MEMcfg.txt_page_2">
</PersistentString>
<PersistentString
value = "MEMcfg.is_80STORE">
value = "WOZwrite.shift16">
</PersistentString>
</PersistentStrings>
</ContextState>

View File

@ -3,7 +3,7 @@
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<false/>
<key>com.apple.security.files.user-selected.read-write</key>
<true/>
</dict>

View File

@ -30,19 +30,24 @@ class LoRes: NSView {
static let Page1Addr = 0x400
static let Page2Addr = 0x800
static let PixelWidth = 40
static let PixelWidth = 80
static let PixelMixedHeight = 40
static let PixelHeight = 48
static let MixedTextHeight = 4
static let blockRows = 24
static let blockCols = 40
static let blockCols = 80
static let blockWidth = PixelWidth / blockCols
static let blockHeight = PixelHeight / blockRows
let LoResIntBuffer1 = UnsafeRawBufferPointer(start: RAM + Page1Addr, count: PageSize * 2)
let LoResIntBuffer2 = UnsafeRawBufferPointer(start: RAM + Page2Addr, count: PageSize * 2)
let LoResAuxBuffer1 = UnsafeRawBufferPointer(start: AUX + Page1Addr, count: PageSize * 2)
let LoResAuxBuffer2 = UnsafeRawBufferPointer(start: AUX + Page2Addr, count: PageSize * 2)
let LoResBuffer1 = UnsafeRawBufferPointer(start: MEM + Page1Addr, count: PageSize * 2)
let LoResBuffer2 = UnsafeRawBufferPointer(start: MEM + Page2Addr, count: PageSize * 2)
var LoResBufferPointer = UnsafeRawBufferPointer(start: MEM + Page1Addr, count: PageSize * 2)
var LoResBufferPointer1 = UnsafeRawBufferPointer(start: MEM + Page1Addr, count: PageSize * 2)
var LoResBufferPointer2 = UnsafeRawBufferPointer(start: MEM + Page1Addr, count: PageSize * 2)
let LoResRawPointer = UnsafeRawPointer(RAM + Page1Addr)
// holds the starting addresses for each lines minus the screen page starting address
@ -268,8 +273,8 @@ class LoRes: NSView {
let B = 0
let A = 3
var blockChanged = [Bool](repeating: false, count: LoRes.blockRows * LoRes.blockCols)
var shadowScreen = [Int](repeating: 0, count: PageSize)
var blockChanged = [Bool](repeating: false, count: LoRes.blockRows * LoRes.blockCols / 2)
var shadowScreen = [Int](repeating: 0, count: LoRes.blockRows * LoRes.blockCols)
var was = 0;
@ -336,6 +341,11 @@ class LoRes: NSView {
func colorPixel ( pixelAddr : Int, color : Int ) {
LoRes.pixelsSRGB[pixelAddr] = colorTable[color]
}
func rot4bit(_ i : Int) -> Int {
return ((i << 1) | ((i & 0x08) >> 3)) & 0x0F
}
func Render() {
@ -350,16 +360,30 @@ class LoRes: NSView {
height = LoRes.PixelMixedHeight / 2
}
if MEMcfg.txt_page_2 == 1 {
LoResBufferPointer = LoResBuffer2
if (MEMcfg.RD_AUX_MEM == 0) {
LoResBufferPointer1 = LoResAuxBuffer2
LoResBufferPointer2 = LoResBuffer2
}
else {
LoResBufferPointer1 = LoResBuffer2
LoResBufferPointer2 = LoResIntBuffer2
}
}
else {
LoResBufferPointer = LoResBuffer1
if (MEMcfg.RD_AUX_MEM == 0) {
LoResBufferPointer1 = LoResAuxBuffer1
LoResBufferPointer2 = LoResBuffer1
}
else {
LoResBufferPointer1 = LoResAuxBuffer1
LoResBufferPointer2 = LoResIntBuffer1
}
}
}
var y = 0
blockChanged = [Bool](repeating: false, count: LoRes.blockRows * LoRes.blockCols)
blockChanged = [Bool](repeating: false, count: LoRes.blockRows * LoRes.blockCols / 2)
LoRes.context?.clear( CGRect(x: 0, y: 0, width: frame.width, height: frame.height) )
@ -372,23 +396,32 @@ class LoRes: NSView {
let blockVertIdx = y * LoRes.blockCols
for blockHorIdx in 0 ..< LoRes.blockCols {
for x in stride(from: 0, to: LoRes.blockCols, by: 2) {
let blockHorIdx = x / 2
// print("blockVertIdx:", blockVertIdx, " blockHorIdx:", blockHorIdx)
let block = Int(LoResBufferPointer[ Int(lineAddr + blockHorIdx) ])
let block1 = Int(LoResBufferPointer1[ Int(lineAddr + blockHorIdx) ])
let block2 = Int(LoResBufferPointer2[ Int(lineAddr + blockHorIdx) ])
let screenIdx = blockVertIdx + blockHorIdx
let pixelHAddr = blockVertIdx * 2 + blockHorIdx
let blockIdx = screenIdx / 2
let pixelHAddr = blockVertIdx * 2 + blockHorIdx * 2
let pixelLAddr = pixelHAddr + LoRes.blockCols
// get all changed blocks
blockChanged[ screenIdx ] = blockChanged[ screenIdx ] || shadowScreen[ screenIdx ] != block
shadowScreen[ screenIdx ] = block
// mark all changed blocks
blockChanged[ blockIdx ] = blockChanged[ blockIdx ] || shadowScreen[ screenIdx ] != block1 || shadowScreen[ screenIdx + 1] != block2
colorPixel(pixelAddr: pixelHAddr, color: block & 0x0F )
colorPixel(pixelAddr: pixelLAddr, color: (block >> 4) & 0x0F )
shadowScreen[ screenIdx ] = block1
shadowScreen[ screenIdx + 1] = block2
colorPixel(pixelAddr: pixelHAddr, color: rot4bit(block1))
colorPixel(pixelAddr: pixelLAddr, color: rot4bit(block1 >> 4))
colorPixel(pixelAddr: pixelHAddr + 1, color: block2 & 0x0F )
colorPixel(pixelAddr: pixelLAddr + 1, color: (block2 >> 4) & 0x0F )
}
y += 1
if ( y >= LoRes.PixelHeight ) {
@ -405,12 +438,13 @@ class LoRes: NSView {
let blockScreenHeigth = CGFloat(frame.height) / CGFloat(HiRes.blockRows)
for blockVertIdx in 0 ..< LoRes.blockRows {
for blockHorIdx in 0 ..< LoRes.blockCols {
if blockChanged[ blockVertIdx * LoRes.blockCols + blockHorIdx ] {
for x in stride(from: 0, to: LoRes.blockCols, by: 2) {
let blockHorIdx = x / 2
if blockChanged[ blockVertIdx * LoRes.blockCols / 2 + blockHorIdx ] {
// refresh the entire screen
let x = CGFloat(blockHorIdx) * blockScreenWidth - CGFloat(screenBlockMargin)
let x = CGFloat(blockHorIdx * 2) * blockScreenWidth - CGFloat(screenBlockMargin)
let y = frame.height - CGFloat(blockVertIdx) * blockScreenHeigth - blockScreenHeigth - CGFloat(screenBlockMargin)
let w = blockScreenWidth + CGFloat(screenBlockMargin) * 2
let w = blockScreenWidth + CGFloat(screenBlockMargin) * 8
let h = blockScreenHeigth + CGFloat(screenBlockMargin) * 2
let boundingBox = CGRect(x: x, y: y, width: w, height: h)
@ -419,7 +453,7 @@ class LoRes: NSView {
}
}
// needsDisplay = true // refresh the entire screen
needsDisplay = true // refresh the entire screen
}

View File

@ -463,7 +463,8 @@ class ViewController: NSViewController {
let ramBufferPointer = UnsafeRawBufferPointer(start: MEM, count: 64 * 1024)
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 textIntPage1BufferPointer = UnsafeRawBufferPointer(start: RAM + textPage1Addr, count: textBufferSize)
static let textIntPage2BufferPointer = UnsafeRawBufferPointer(start: RAM + textPage2Addr, count: textBufferSize)
static let textAuxBufferPointer = UnsafeRawBufferPointer(start: AUX + textPage1Addr, count: textBufferSize)
static let textPageShadowBuffer = UnsafeMutableRawBufferPointer.allocate(byteCount: textBufferSize, alignment: 1)
@ -987,10 +988,20 @@ class ViewController: NSViewController {
// 40 col
if videoMode.col80 == 0 {
if MEMcfg.txt_page_2 == 0 {
textBufferPointer = ViewController.textPage1Pointer
if (MEMcfg.RD_AUX_MEM == 0) {
textBufferPointer = ViewController.textPage1Pointer
}
else {
textBufferPointer = ViewController.textIntPage1BufferPointer
}
}
else {
textBufferPointer = ViewController.textPage2Pointer
if (MEMcfg.RD_AUX_MEM == 0) {
textBufferPointer = ViewController.textPage2Pointer
}
else {
textBufferPointer = ViewController.textIntPage2BufferPointer
}
}
if textBufferPointer.elementsEqual(ViewController.textPageShadowBuffer) {
@ -1019,7 +1030,7 @@ class ViewController: NSViewController {
else {
let auxPage = ( MEMcfg.is_80STORE == 1 ) && ( MEMcfg.txt_page_2 == 1 )
let textIntBuffer = auxPage ? ViewController.textIntBufferPointer : ViewController.textPage1Pointer
let textIntBuffer = auxPage ? ViewController.textIntPage1BufferPointer : ViewController.textPage1Pointer
let textAuxBuffer = auxPage ? ViewController.textPage1Pointer : ViewController.textAuxBufferPointer
// render the rest of the text screen
@ -2018,6 +2029,8 @@ class ViewController: NSViewController {
func openDiskImage( url: URL ) {
woz_eject()
switch url.pathExtension.uppercased() {
case "WOZ":
@ -2031,8 +2044,6 @@ class ViewController: NSViewController {
}
case "DSK", "DO", "PO" :
woz_eject()
let err = dsk2woz( url.path )
if err == WOZ_ERR_OK {

View File

@ -246,8 +246,8 @@ extern double mhz;
//#define GAME_VIDEO_DIV 1U // (GAME_FPS / DEFAULT_FPS)
//#define GAME_SPKR_DIV 6U // 16U
#define GAME_FPS 180U // 300U // 240U // 180U // 120U
#define GAME_VIDEO_DIV 1U // 4U // (GAME_FPS / DEFAULT_FPS)
#define GAME_SPKR_DIV 1U // 8U // 16U
#define GAME_VIDEO_DIV 3U // 4U // (GAME_FPS / DEFAULT_FPS)
#define GAME_SPKR_DIV 3U // 8U // 16U
extern unsigned int video_fps_divider;
extern unsigned int fps;

View File

@ -52,6 +52,16 @@ INSTR void LDA( uint8_t src ) {
set_flags_NZ(m6502.A = src);
#endif
}
//INSTR void LDA_imm( uint8_t src ) {
// dbgPrintf("LDA(%02X) ", src);
// disPrintf(disassembly.inst, "LDA");
//#ifndef DISASSEMBLER
// if (src == 0x4C) {
// m6502.interrupt = BREAK;
// }
// set_flags_NZ(m6502.A = src);
//#endif
//}
/**
LDX Load Index X with Memory

View File

@ -1043,11 +1043,14 @@ INLINE uint16_t memread16_high( uint16_t addr ) {
}
INLINE uint16_t memread16( uint16_t addr ) {
// if (addr >= 0xC000) {
// return memread16_high(addr);
// }
return memread16_low(addr);
if (addr >= 0xC000) {
return memread16_high(addr);
}
if (addr >= 0x200) {
return memread16_low(addr);
}
return memread16_zp(addr);
}
INLINE uint16_t _memread16_dbg( uint16_t addr ) {
check_mem_rd_bp(addr);
@ -1063,17 +1066,13 @@ INLINE uint8_t _memread( uint16_t addr ) {
if (addr < 0xC100) {
return ioRead(addr);
}
// return memread8_paged(addr);
return memread8_high(addr);
}
if (addr >= 0x200) {
return memread8_low(addr);
}
// return memread8_paged(addr);
return memread8_zp(addr);
// return memread8(addr);
}
INLINE uint8_t _memread_dbg( uint16_t addr ) {
@ -1083,17 +1082,13 @@ INLINE uint8_t _memread_dbg( uint16_t addr ) {
INLINE uint8_t _memread_dis( uint16_t addr ) {
if (addr >= 0xC000) {
// return memread8_paged(addr);
return memread8_high(addr);
}
if (addr >= 0x200) {
return memread8_low(addr);
}
// return memread8_paged(addr);
return memread8_zp(addr);
// return memread8(addr);
}
@ -1121,11 +1116,16 @@ INLINE void _memwrite8_zp( uint16_t addr, uint8_t data ) {
shadowZPSTCKMEM[addr] = data;
}
INLINE void _memwrite8_low( uint16_t addr, uint8_t data ) {
if ((addr >= 0x400) && (addr < 0x800)) {
if ((data == 0x00) || (data == 0xFF)) {
m6502.interrupt = BREAK;
}
}
// if ((addr >= 0x400) && (addr < 0x800)) {
// if ((data == 0x00) || (data == 0xFF)) {
// m6502.interrupt = BREAK;
// }
// }
// if ((addr >= 0x3F5) && (addr <= 0x3F7)) {
// if (data == 0x4C) {
// m6502.interrupt = BREAK;
// }
// }
WRLOMEM[addr] = data;
}
INLINE void _memwrite8_bank( uint16_t addr, uint8_t data ) {
@ -1173,7 +1173,14 @@ INLINE uint8_t _fetch(void) {
m6502.clktime++;
}
#endif
return memread8_low( m6502.PC++ );
if (m6502.PC >= 0xC000) {
return memread8_high( m6502.PC++ );
}
// TODO: We might want to run code on the ZERO PAGE?
// if (m6502.PC >= 0x200) {
return memread8_low( m6502.PC++ );
// }
// return memread8_zp( m6502.PC++ );
}
INLINE uint8_t _fetch_dis(void) {
@ -1373,7 +1380,7 @@ INLINE uint8_t _addr_zp_dis(void) {
return _fetch_dis();
}
INLINE uint8_t _src_zp(void) {
return memread8(_addr_zp());
return memread8_zp(_addr_zp());
}
INLINE uint8_t _src_zp_dbg(void) {
return _memread_dbg(_addr_zp_dbg());
@ -1401,7 +1408,7 @@ INLINE uint8_t _src_zp_dis(void) {
effective address is word in (LL, LL + 1), inc. without carry: C.w($00LL)
**/
INLINE uint16_t _addr_ind(void) {
return memread16( _fetch() );
return memread16_zp( _fetch() );
}
INLINE uint16_t _addr_ind_dbg(void) {
uint16_t addr = _memread16_dbg(_fetch());
@ -1430,7 +1437,7 @@ INLINE uint8_t _src_ind_dis(void) {
effective address is word in (LL + X, LL + X + 1), inc. without carry: C.w($00LL + X)
**/
INLINE uint16_t _addr_ind_X(void) {
return memread16( (uint8_t)(_fetch() + m6502.X) );
return memread16_zp( (uint8_t)(_fetch() + m6502.X) );
}
INLINE uint16_t _addr_ind_X_rd_dbg(void) {
return _memread16_dbg( (uint8_t)(_fetch() + m6502.X) );
@ -1444,7 +1451,7 @@ INLINE uint16_t _addr_ind_X_dis(void) {
_disPrintf(disassembly.oper, sizeof(disassembly.oper), "($%02X,X)", memread8(m6502.PC) );
_disPrintf(disassembly.comment, sizeof(disassembly.comment), "ind_addr:%04X", memread16( memread8(m6502.PC) + m6502.X) );
return memread16( (uint8_t)(_fetch_dis() + m6502.X) );
return memread16_zp( (uint8_t)(_fetch_dis() + m6502.X) );
}
INLINE uint8_t _src_X_ind(void) {
return _memread( _addr_ind_X() );
@ -1491,7 +1498,7 @@ INLINE uint16_t _addr_ind_ind_X_dis(void) {
effective address is word in (LL, LL + 1) incremented by Y with carry: C.w($00LL) + Y
**/
INLINE uint16_t _addr_ind_Y(void) {
return memread16( _fetch() ) + m6502.Y;
return memread16_zp( _fetch() ) + m6502.Y;
}
INLINE uint16_t _addr_ind_Y_dbg(void) {
uint16_t addr = _memread16_dbg( _fetch() ) + m6502.Y;
@ -1537,13 +1544,13 @@ INLINE uint8_t _addr_zp_X_dis(void) {
return _fetch_dis() + m6502.X;
}
INLINE uint8_t _src_zp_X(void) {
return memread8(_addr_zp_X());
return memread8_zp(_addr_zp_X());
}
INLINE uint8_t _src_zp_X_dbg(void) {
return _memread_dbg(_addr_zp_X());
}
INLINE uint8_t _src_zp_X_dis(void) {
return memread8(_addr_zp_X_dis());
return memread8_zp(_addr_zp_X_dis());
}
//INLINE uint8_t * dest_zp_X() {
// return WRLOMEM + addr_zp_X();
@ -1568,13 +1575,13 @@ INLINE uint8_t _addr_zp_Y_dis(void) {
return _fetch_dis() + m6502.Y;
}
INLINE uint8_t _src_zp_Y(void) {
return memread8(_addr_zp_Y());
return memread8_zp(_addr_zp_Y());
}
INLINE uint8_t _src_zp_Y_dbg(void) {
return _memread_dbg(_addr_zp_Y());
}
INLINE uint8_t _src_zp_Y_dis(void) {
return memread8(_addr_zp_Y_dis());
return memread8_zp(_addr_zp_Y_dis());
}
//INLINE uint8_t * dest_zp_Y() {
// return WRLOMEM + addr_zp_Y();
@ -1608,7 +1615,7 @@ void auxMemorySelect( MEMcfg_t newMEMcfg ) {
// save old content to shadow memory
if ( ( newWriteMEM != currentLowWRMEM ) && (WRLOMEM == Apple2_64K_MEM) ) {
if ( ( newWriteMEM != WRLOMEM ) && (WRLOMEM == Apple2_64K_MEM) ) {
// save the content of Shadow Memory
memcpy( (void*) currentLowWRMEM + 0x200, WRLOMEM + 0x200, 0xBE00);
}