mirror of
https://gitlab.com/camelot/kickc.git
synced 2025-08-07 22:25:13 +00:00
702 lines
34 KiB
Plaintext
702 lines
34 KiB
Plaintext
Resolved forward reference DMA_SCREEN_UP to DMA_SCREEN_UP
|
|
Resolved forward reference DMA_SCREEN_UP to DMA_SCREEN_UP
|
|
Fixing struct type size struct F018_DMAGIC to 17
|
|
Fixing struct type SIZE_OF struct F018_DMAGIC to 17
|
|
Fixing struct type SIZE_OF struct F018_DMAGIC to 17
|
|
Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = byte1 &DMA_SCREEN_UP
|
|
Setting inferred volatile on symbol affected by address-of: memoryRemap::aVal in asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom }
|
|
Setting inferred volatile on symbol affected by address-of: memoryRemap::xVal in asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom }
|
|
Setting inferred volatile on symbol affected by address-of: memoryRemap::yVal in asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom }
|
|
Setting inferred volatile on symbol affected by address-of: memoryRemap::zVal in asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom }
|
|
Setting inferred volatile on symbol affected by address-of: memoryRemap256M::lMb in asm { ldalMb ldx#$0f ldyuMb ldz#$0f map ldaaVal ldxxVal ldyyVal ldzzVal map eom }
|
|
Setting inferred volatile on symbol affected by address-of: memoryRemap256M::uMb in asm { ldalMb ldx#$0f ldyuMb ldz#$0f map ldaaVal ldxxVal ldyyVal ldzzVal map eom }
|
|
Setting inferred volatile on symbol affected by address-of: memoryRemap256M::aVal in asm { ldalMb ldx#$0f ldyuMb ldz#$0f map ldaaVal ldxxVal ldyyVal ldzzVal map eom }
|
|
Setting inferred volatile on symbol affected by address-of: memoryRemap256M::xVal in asm { ldalMb ldx#$0f ldyuMb ldz#$0f map ldaaVal ldxxVal ldyyVal ldzzVal map eom }
|
|
Setting inferred volatile on symbol affected by address-of: memoryRemap256M::yVal in asm { ldalMb ldx#$0f ldyuMb ldz#$0f map ldaaVal ldxxVal ldyyVal ldzzVal map eom }
|
|
Setting inferred volatile on symbol affected by address-of: memoryRemap256M::zVal in asm { ldalMb ldx#$0f ldyuMb ldz#$0f map ldaaVal ldxxVal ldyyVal ldzzVal map eom }
|
|
Inlined call vicSelectGfxBank::$0 = call toDd00 vicSelectGfxBank::gfx
|
|
|
|
CONTROL FLOW GRAPH SSA
|
|
|
|
void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset)
|
|
memoryRemap: scope:[memoryRemap] from main
|
|
memoryRemap::upperPageOffset#1 = phi( main/memoryRemap::upperPageOffset#0 )
|
|
memoryRemap::remapBlocks#1 = phi( main/memoryRemap::remapBlocks#0 )
|
|
memoryRemap::lowerPageOffset#1 = phi( main/memoryRemap::lowerPageOffset#0 )
|
|
memoryRemap::$0 = byte0 memoryRemap::lowerPageOffset#1
|
|
memoryRemap::aVal = memoryRemap::$0
|
|
memoryRemap::$1 = memoryRemap::remapBlocks#1 << 4
|
|
memoryRemap::$2 = byte1 memoryRemap::lowerPageOffset#1
|
|
memoryRemap::$3 = memoryRemap::$2 & $f
|
|
memoryRemap::$4 = memoryRemap::$1 | memoryRemap::$3
|
|
memoryRemap::xVal = memoryRemap::$4
|
|
memoryRemap::$5 = byte0 memoryRemap::upperPageOffset#1
|
|
memoryRemap::yVal = memoryRemap::$5
|
|
memoryRemap::$6 = memoryRemap::remapBlocks#1 & $f0
|
|
memoryRemap::$7 = byte1 memoryRemap::upperPageOffset#1
|
|
memoryRemap::$8 = memoryRemap::$7 & $f
|
|
memoryRemap::$9 = memoryRemap::$6 | memoryRemap::$8
|
|
memoryRemap::zVal = memoryRemap::$9
|
|
asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom }
|
|
to:memoryRemap::@return
|
|
memoryRemap::@return: scope:[memoryRemap] from memoryRemap
|
|
return
|
|
to:@return
|
|
|
|
void main()
|
|
main: scope:[main] from __start
|
|
memoryRemap::remapBlocks#0 = 0
|
|
memoryRemap::lowerPageOffset#0 = 0
|
|
memoryRemap::upperPageOffset#0 = 0
|
|
call memoryRemap
|
|
to:main::@1
|
|
main::@1: scope:[main] from main
|
|
*((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1
|
|
*((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0
|
|
*((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0
|
|
*((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = byte1 &DMA_SCREEN_UP
|
|
*((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRLSBTRIG) = byte0 &DMA_SCREEN_UP
|
|
*((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 0
|
|
to:main::@return
|
|
main::@return: scope:[main] from main::@1
|
|
return
|
|
to:@return
|
|
|
|
void __start()
|
|
__start: scope:[__start] from
|
|
call main
|
|
to:__start::@1
|
|
__start::@1: scope:[__start] from __start
|
|
to:__start::@return
|
|
__start::@return: scope:[__start] from __start::@1
|
|
return
|
|
to:@return
|
|
|
|
SYMBOL TABLE SSA
|
|
constant byte* const DEFAULT_SCREEN = (byte*)$800
|
|
constant struct F018_DMAGIC* const DMA = (struct F018_DMAGIC*)$d700
|
|
constant const byte DMA_COMMAND_COPY = 0
|
|
volatile struct DMA_LIST_F018B DMA_SCREEN_UP loadstore = { command: DMA_COMMAND_COPY, count: (word)$18*$50, src: DEFAULT_SCREEN+$50, src_bank: 0, dest: DEFAULT_SCREEN, dest_bank: 0, sub_command: 0, modulo: 0 }
|
|
constant byte OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2
|
|
constant byte OFFSET_STRUCT_F018_DMAGIC_ADDRLSBTRIG = 0
|
|
constant byte OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4
|
|
constant byte OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1
|
|
constant byte OFFSET_STRUCT_F018_DMAGIC_EN018B = 3
|
|
void __start()
|
|
void main()
|
|
void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset)
|
|
byte~ memoryRemap::$0
|
|
byte~ memoryRemap::$1
|
|
byte~ memoryRemap::$2
|
|
number~ memoryRemap::$3
|
|
number~ memoryRemap::$4
|
|
byte~ memoryRemap::$5
|
|
number~ memoryRemap::$6
|
|
byte~ memoryRemap::$7
|
|
number~ memoryRemap::$8
|
|
number~ memoryRemap::$9
|
|
volatile byte memoryRemap::aVal loadstore
|
|
word memoryRemap::lowerPageOffset
|
|
word memoryRemap::lowerPageOffset#0
|
|
word memoryRemap::lowerPageOffset#1
|
|
byte memoryRemap::remapBlocks
|
|
byte memoryRemap::remapBlocks#0
|
|
byte memoryRemap::remapBlocks#1
|
|
word memoryRemap::upperPageOffset
|
|
word memoryRemap::upperPageOffset#0
|
|
word memoryRemap::upperPageOffset#1
|
|
volatile byte memoryRemap::xVal loadstore
|
|
volatile byte memoryRemap::yVal loadstore
|
|
volatile byte memoryRemap::zVal loadstore
|
|
|
|
Adding number conversion cast (unumber) $50 in
|
|
Adding number conversion cast (unumber) 4 in memoryRemap::$1 = memoryRemap::remapBlocks#1 << 4
|
|
Adding number conversion cast (unumber) $f in memoryRemap::$3 = memoryRemap::$2 & $f
|
|
Adding number conversion cast (unumber) memoryRemap::$3 in memoryRemap::$3 = memoryRemap::$2 & (unumber)$f
|
|
Adding number conversion cast (unumber) memoryRemap::$4 in memoryRemap::$4 = memoryRemap::$1 | memoryRemap::$3
|
|
Adding number conversion cast (unumber) $f0 in memoryRemap::$6 = memoryRemap::remapBlocks#1 & $f0
|
|
Adding number conversion cast (unumber) memoryRemap::$6 in memoryRemap::$6 = memoryRemap::remapBlocks#1 & (unumber)$f0
|
|
Adding number conversion cast (unumber) $f in memoryRemap::$8 = memoryRemap::$7 & $f
|
|
Adding number conversion cast (unumber) memoryRemap::$8 in memoryRemap::$8 = memoryRemap::$7 & (unumber)$f
|
|
Adding number conversion cast (unumber) memoryRemap::$9 in memoryRemap::$9 = memoryRemap::$6 | memoryRemap::$8
|
|
Adding number conversion cast (unumber) 0 in memoryRemap::remapBlocks#0 = 0
|
|
Adding number conversion cast (unumber) 0 in memoryRemap::lowerPageOffset#0 = 0
|
|
Adding number conversion cast (unumber) 0 in memoryRemap::upperPageOffset#0 = 0
|
|
Adding number conversion cast (unumber) 1 in *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1
|
|
Adding number conversion cast (unumber) 0 in *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0
|
|
Adding number conversion cast (unumber) 0 in *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0
|
|
Adding number conversion cast (unumber) 0 in *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 0
|
|
Successful SSA optimization PassNAddNumberTypeConversions
|
|
Inlining cast memoryRemap::remapBlocks#0 = (unumber)0
|
|
Inlining cast memoryRemap::lowerPageOffset#0 = (unumber)0
|
|
Inlining cast memoryRemap::upperPageOffset#0 = (unumber)0
|
|
Inlining cast *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = (unumber)1
|
|
Inlining cast *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = (unumber)0
|
|
Inlining cast *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = (unumber)0
|
|
Inlining cast *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = (unumber)0
|
|
Successful SSA optimization Pass2InlineCast
|
|
Simplifying constant pointer cast (struct F018_DMAGIC*) 55040
|
|
Simplifying constant pointer cast (byte*) 2048
|
|
Simplifying constant integer cast $50
|
|
Simplifying constant integer cast 4
|
|
Simplifying constant integer cast $f
|
|
Simplifying constant integer cast $f0
|
|
Simplifying constant integer cast $f
|
|
Simplifying constant integer cast 0
|
|
Simplifying constant integer cast 0
|
|
Simplifying constant integer cast 0
|
|
Simplifying constant integer cast 1
|
|
Simplifying constant integer cast 0
|
|
Simplifying constant integer cast 0
|
|
Simplifying constant integer cast 0
|
|
Successful SSA optimization PassNCastSimplification
|
|
Finalized unsigned number type (byte) $50
|
|
Finalized unsigned number type (byte) 4
|
|
Finalized unsigned number type (byte) $f
|
|
Finalized unsigned number type (byte) $f0
|
|
Finalized unsigned number type (byte) $f
|
|
Finalized unsigned number type (byte) 0
|
|
Finalized unsigned number type (byte) 0
|
|
Finalized unsigned number type (byte) 0
|
|
Finalized unsigned number type (byte) 1
|
|
Finalized unsigned number type (byte) 0
|
|
Finalized unsigned number type (byte) 0
|
|
Finalized unsigned number type (byte) 0
|
|
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
|
Inferred type updated to byte in memoryRemap::$3 = memoryRemap::$2 & $f
|
|
Inferred type updated to byte in memoryRemap::$4 = memoryRemap::$1 | memoryRemap::$3
|
|
Inferred type updated to byte in memoryRemap::$6 = memoryRemap::remapBlocks#1 & $f0
|
|
Inferred type updated to byte in memoryRemap::$8 = memoryRemap::$7 & $f
|
|
Inferred type updated to byte in memoryRemap::$9 = memoryRemap::$6 | memoryRemap::$8
|
|
Alias candidate removed (volatile)memoryRemap::aVal = memoryRemap::$0
|
|
Alias candidate removed (volatile)memoryRemap::xVal = memoryRemap::$4
|
|
Alias candidate removed (volatile)memoryRemap::yVal = memoryRemap::$5
|
|
Alias candidate removed (volatile)memoryRemap::zVal = memoryRemap::$9
|
|
Identical Phi Values memoryRemap::lowerPageOffset#1 memoryRemap::lowerPageOffset#0
|
|
Identical Phi Values memoryRemap::remapBlocks#1 memoryRemap::remapBlocks#0
|
|
Identical Phi Values memoryRemap::upperPageOffset#1 memoryRemap::upperPageOffset#0
|
|
Successful SSA optimization Pass2IdenticalPhiElimination
|
|
Constant memoryRemap::remapBlocks#0 = 0
|
|
Constant memoryRemap::lowerPageOffset#0 = 0
|
|
Constant memoryRemap::upperPageOffset#0 = 0
|
|
Successful SSA optimization Pass2ConstantIdentification
|
|
Simplifying expression containing zero (byte*)DMA in [25] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRLSBTRIG) = byte0 &DMA_SCREEN_UP
|
|
Successful SSA optimization PassNSimplifyExpressionWithZero
|
|
Eliminating unused constant OFFSET_STRUCT_F018_DMAGIC_ADDRLSBTRIG
|
|
Successful SSA optimization PassNEliminateUnusedVars
|
|
Removing unused procedure __start
|
|
Removing unused procedure block __start
|
|
Removing unused procedure block __start::@1
|
|
Removing unused procedure block __start::@return
|
|
Successful SSA optimization PassNEliminateEmptyStart
|
|
Alias candidate removed (volatile)memoryRemap::aVal = memoryRemap::$0
|
|
Alias candidate removed (volatile)memoryRemap::xVal = memoryRemap::$4
|
|
Alias candidate removed (volatile)memoryRemap::yVal = memoryRemap::$5
|
|
Alias candidate removed (volatile)memoryRemap::zVal = memoryRemap::$9
|
|
Constant right-side identified [0] memoryRemap::$0 = byte0 memoryRemap::lowerPageOffset#0
|
|
Constant right-side identified [2] memoryRemap::$1 = memoryRemap::remapBlocks#0 << 4
|
|
Constant right-side identified [3] memoryRemap::$2 = byte1 memoryRemap::lowerPageOffset#0
|
|
Constant right-side identified [7] memoryRemap::$5 = byte0 memoryRemap::upperPageOffset#0
|
|
Constant right-side identified [9] memoryRemap::$6 = memoryRemap::remapBlocks#0 & $f0
|
|
Constant right-side identified [10] memoryRemap::$7 = byte1 memoryRemap::upperPageOffset#0
|
|
Successful SSA optimization Pass2ConstantRValueConsolidation
|
|
Constant memoryRemap::$0 = byte0 memoryRemap::lowerPageOffset#0
|
|
Constant memoryRemap::$1 = memoryRemap::remapBlocks#0<<4
|
|
Constant memoryRemap::$2 = byte1 memoryRemap::lowerPageOffset#0
|
|
Constant memoryRemap::$5 = byte0 memoryRemap::upperPageOffset#0
|
|
Constant memoryRemap::$6 = memoryRemap::remapBlocks#0&$f0
|
|
Constant memoryRemap::$7 = byte1 memoryRemap::upperPageOffset#0
|
|
Successful SSA optimization Pass2ConstantIdentification
|
|
Simplifying constant evaluating to zero byte0 memoryRemap::lowerPageOffset#0 in
|
|
Simplifying constant evaluating to zero memoryRemap::remapBlocks#0<<4 in
|
|
Simplifying constant evaluating to zero byte1 memoryRemap::lowerPageOffset#0 in
|
|
Simplifying constant evaluating to zero byte0 memoryRemap::upperPageOffset#0 in
|
|
Simplifying constant evaluating to zero memoryRemap::remapBlocks#0&$f0 in
|
|
Simplifying constant evaluating to zero byte1 memoryRemap::upperPageOffset#0 in
|
|
Successful SSA optimization PassNSimplifyConstantZero
|
|
Simplifying expression containing zero memoryRemap::$3 in [5] memoryRemap::$4 = memoryRemap::$1 | memoryRemap::$3
|
|
Simplifying expression containing zero memoryRemap::$8 in [12] memoryRemap::$9 = memoryRemap::$6 | memoryRemap::$8
|
|
Successful SSA optimization PassNSimplifyExpressionWithZero
|
|
Eliminating unused constant memoryRemap::remapBlocks#0
|
|
Eliminating unused constant memoryRemap::lowerPageOffset#0
|
|
Eliminating unused constant memoryRemap::upperPageOffset#0
|
|
Eliminating unused constant memoryRemap::$1
|
|
Eliminating unused constant memoryRemap::$6
|
|
Successful SSA optimization PassNEliminateUnusedVars
|
|
Alias candidate removed (volatile)memoryRemap::$4 = memoryRemap::$3 memoryRemap::xVal
|
|
Alias candidate removed (volatile)memoryRemap::$9 = memoryRemap::$8 memoryRemap::zVal
|
|
Constant right-side identified [1] memoryRemap::$3 = memoryRemap::$2 & $f
|
|
Constant right-side identified [5] memoryRemap::$8 = memoryRemap::$7 & $f
|
|
Successful SSA optimization Pass2ConstantRValueConsolidation
|
|
Constant memoryRemap::$3 = memoryRemap::$2&$f
|
|
Constant memoryRemap::$8 = memoryRemap::$7&$f
|
|
Successful SSA optimization Pass2ConstantIdentification
|
|
Constant memoryRemap::$4 = memoryRemap::$3
|
|
Constant memoryRemap::$9 = memoryRemap::$8
|
|
Successful SSA optimization Pass2ConstantIdentification
|
|
Simplifying constant evaluating to zero memoryRemap::$2&$f in
|
|
Simplifying constant evaluating to zero memoryRemap::$7&$f in
|
|
Successful SSA optimization PassNSimplifyConstantZero
|
|
Eliminating unused constant memoryRemap::$2
|
|
Eliminating unused constant memoryRemap::$7
|
|
Successful SSA optimization PassNEliminateUnusedVars
|
|
Constant inlined memoryRemap::$4 = 0
|
|
Constant inlined memoryRemap::$5 = 0
|
|
Constant inlined memoryRemap::$8 = 0
|
|
Constant inlined memoryRemap::$0 = 0
|
|
Constant inlined memoryRemap::$9 = 0
|
|
Constant inlined memoryRemap::$3 = 0
|
|
Successful SSA optimization Pass2ConstantInlining
|
|
Finalized unsigned number type (byte) 8
|
|
Finalized unsigned number type (byte) 8
|
|
Finalized unsigned number type (byte) $18
|
|
Finalized unsigned number type (byte) $50
|
|
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
|
Adding NOP phi() at start of main
|
|
CALL GRAPH
|
|
Calls in [main] to memoryRemap:1
|
|
|
|
Created 0 initial phi equivalence classes
|
|
Coalesced down to 0 phi equivalence classes
|
|
Adding NOP phi() at start of main
|
|
|
|
FINAL CONTROL FLOW GRAPH
|
|
|
|
void main()
|
|
main: scope:[main] from
|
|
[0] phi()
|
|
[1] call memoryRemap
|
|
to:main::@1
|
|
main::@1: scope:[main] from main
|
|
[2] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1
|
|
[3] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0
|
|
[4] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0
|
|
[5] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = byte1 &DMA_SCREEN_UP
|
|
[6] *((byte*)DMA) = byte0 &DMA_SCREEN_UP
|
|
[7] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 0
|
|
to:main::@return
|
|
main::@return: scope:[main] from main::@1
|
|
[8] return
|
|
to:@return
|
|
|
|
void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset)
|
|
memoryRemap: scope:[memoryRemap] from main
|
|
[9] memoryRemap::aVal = 0
|
|
[10] memoryRemap::xVal = 0
|
|
[11] memoryRemap::yVal = 0
|
|
[12] memoryRemap::zVal = 0
|
|
asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom }
|
|
to:memoryRemap::@return
|
|
memoryRemap::@return: scope:[memoryRemap] from memoryRemap
|
|
[14] return
|
|
to:@return
|
|
|
|
|
|
VARIABLE REGISTER WEIGHTS
|
|
volatile struct DMA_LIST_F018B DMA_SCREEN_UP loadstore = { command: DMA_COMMAND_COPY, count: (word)$18*$50, src: DEFAULT_SCREEN+$50, src_bank: 0, dest: DEFAULT_SCREEN, dest_bank: 0, sub_command: 0, modulo: 0 }
|
|
void main()
|
|
void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset)
|
|
volatile byte memoryRemap::aVal loadstore 2.75
|
|
word memoryRemap::lowerPageOffset
|
|
byte memoryRemap::remapBlocks
|
|
word memoryRemap::upperPageOffset
|
|
volatile byte memoryRemap::xVal loadstore 3.6666666666666665
|
|
volatile byte memoryRemap::yVal loadstore 5.5
|
|
volatile byte memoryRemap::zVal loadstore 11.0
|
|
|
|
Initial phi equivalence classes
|
|
Added variable memoryRemap::aVal to live range equivalence class [ memoryRemap::aVal ]
|
|
Added variable memoryRemap::xVal to live range equivalence class [ memoryRemap::xVal ]
|
|
Added variable memoryRemap::yVal to live range equivalence class [ memoryRemap::yVal ]
|
|
Added variable memoryRemap::zVal to live range equivalence class [ memoryRemap::zVal ]
|
|
Added variable DMA_SCREEN_UP to live range equivalence class [ DMA_SCREEN_UP ]
|
|
Complete equivalence classes
|
|
[ memoryRemap::aVal ]
|
|
[ memoryRemap::xVal ]
|
|
[ memoryRemap::yVal ]
|
|
[ memoryRemap::zVal ]
|
|
[ DMA_SCREEN_UP ]
|
|
Allocated zp[1]:2 [ memoryRemap::aVal ]
|
|
Allocated zp[1]:3 [ memoryRemap::xVal ]
|
|
Allocated zp[1]:4 [ memoryRemap::yVal ]
|
|
Allocated zp[1]:5 [ memoryRemap::zVal ]
|
|
Allocated mem[12] [ DMA_SCREEN_UP ]
|
|
REGISTER UPLIFT POTENTIAL REGISTERS
|
|
Statement [2] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 [ DMA_SCREEN_UP ] ( [ DMA_SCREEN_UP ] { } ) always clobbers reg byte a
|
|
Statement [3] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 [ DMA_SCREEN_UP ] ( [ DMA_SCREEN_UP ] { } ) always clobbers reg byte a
|
|
Statement [4] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 [ DMA_SCREEN_UP ] ( [ DMA_SCREEN_UP ] { } ) always clobbers reg byte a
|
|
Statement [5] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = byte1 &DMA_SCREEN_UP [ DMA_SCREEN_UP ] ( [ DMA_SCREEN_UP ] { } ) always clobbers reg byte a
|
|
Statement [6] *((byte*)DMA) = byte0 &DMA_SCREEN_UP [ ] ( [ ] { } ) always clobbers reg byte a
|
|
Statement [7] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 0 [ ] ( [ ] { } ) always clobbers reg byte a
|
|
Statement [9] memoryRemap::aVal = 0 [ memoryRemap::aVal ] ( memoryRemap:1 [ DMA_SCREEN_UP memoryRemap::aVal ] { } ) always clobbers reg byte a
|
|
Statement [10] memoryRemap::xVal = 0 [ memoryRemap::aVal memoryRemap::xVal ] ( memoryRemap:1 [ DMA_SCREEN_UP memoryRemap::aVal memoryRemap::xVal ] { } ) always clobbers reg byte a
|
|
Statement [11] memoryRemap::yVal = 0 [ memoryRemap::aVal memoryRemap::xVal memoryRemap::yVal ] ( memoryRemap:1 [ DMA_SCREEN_UP memoryRemap::aVal memoryRemap::xVal memoryRemap::yVal ] { } ) always clobbers reg byte a
|
|
Statement [12] memoryRemap::zVal = 0 [ memoryRemap::aVal memoryRemap::xVal memoryRemap::yVal memoryRemap::zVal ] ( memoryRemap:1 [ DMA_SCREEN_UP memoryRemap::aVal memoryRemap::xVal memoryRemap::yVal memoryRemap::zVal ] { } ) always clobbers reg byte a
|
|
Statement asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } always clobbers reg byte a reg byte x reg byte y reg byte z
|
|
Potential registers zp[1]:2 [ memoryRemap::aVal ] : zp[1]:2 ,
|
|
Potential registers zp[1]:3 [ memoryRemap::xVal ] : zp[1]:3 ,
|
|
Potential registers zp[1]:4 [ memoryRemap::yVal ] : zp[1]:4 ,
|
|
Potential registers zp[1]:5 [ memoryRemap::zVal ] : zp[1]:5 ,
|
|
Potential registers mem[12] [ DMA_SCREEN_UP ] : mem[12] ,
|
|
|
|
REGISTER UPLIFT SCOPES
|
|
Uplift Scope [memoryRemap] 11: zp[1]:5 [ memoryRemap::zVal ] 5.5: zp[1]:4 [ memoryRemap::yVal ] 3.67: zp[1]:3 [ memoryRemap::xVal ] 2.75: zp[1]:2 [ memoryRemap::aVal ]
|
|
Uplift Scope [MOS6526_CIA]
|
|
Uplift Scope [MOS6569_VICII]
|
|
Uplift Scope [MOS6581_SID]
|
|
Uplift Scope [MOS4569_VICIII]
|
|
Uplift Scope [MEGA65_VICIV]
|
|
Uplift Scope [F018_DMAGIC]
|
|
Uplift Scope [DMA_LIST_F018A]
|
|
Uplift Scope [DMA_LIST_F018B]
|
|
Uplift Scope [main]
|
|
Uplift Scope [] 0: mem[12] [ DMA_SCREEN_UP ]
|
|
|
|
Uplifting [memoryRemap] best 102 combination zp[1]:5 [ memoryRemap::zVal ] zp[1]:4 [ memoryRemap::yVal ] zp[1]:3 [ memoryRemap::xVal ] zp[1]:2 [ memoryRemap::aVal ]
|
|
Uplifting [MOS6526_CIA] best 102 combination
|
|
Uplifting [MOS6569_VICII] best 102 combination
|
|
Uplifting [MOS6581_SID] best 102 combination
|
|
Uplifting [MOS4569_VICIII] best 102 combination
|
|
Uplifting [MEGA65_VICIV] best 102 combination
|
|
Uplifting [F018_DMAGIC] best 102 combination
|
|
Uplifting [DMA_LIST_F018A] best 102 combination
|
|
Uplifting [DMA_LIST_F018B] best 102 combination
|
|
Uplifting [main] best 102 combination
|
|
Uplifting [] best 102 combination mem[12] [ DMA_SCREEN_UP ]
|
|
Attempting to uplift remaining variables inzp[1]:5 [ memoryRemap::zVal ]
|
|
Uplifting [memoryRemap] best 102 combination zp[1]:5 [ memoryRemap::zVal ]
|
|
Attempting to uplift remaining variables inzp[1]:4 [ memoryRemap::yVal ]
|
|
Uplifting [memoryRemap] best 102 combination zp[1]:4 [ memoryRemap::yVal ]
|
|
Attempting to uplift remaining variables inzp[1]:3 [ memoryRemap::xVal ]
|
|
Uplifting [memoryRemap] best 102 combination zp[1]:3 [ memoryRemap::xVal ]
|
|
Attempting to uplift remaining variables inzp[1]:2 [ memoryRemap::aVal ]
|
|
Uplifting [memoryRemap] best 102 combination zp[1]:2 [ memoryRemap::aVal ]
|
|
|
|
ASSEMBLER BEFORE OPTIMIZATION
|
|
// File Comments
|
|
// MEGA65 DMA test using F018 directly
|
|
// Appendix J in https://mega.scryptos.com/sharefolder-link/MEGA/MEGA65+filehost/Docs/MEGA65-Book_draft.pdf
|
|
/// @file
|
|
/// MEGA65 Registers and Constants
|
|
/// @file
|
|
/// The MOS 6526 Complex Interface Adapter (CIA)
|
|
///
|
|
/// http://archive.6502.org/datasheets/mos_6526_cia_recreated.pdf
|
|
// Upstart
|
|
.cpu _45gs02
|
|
// MEGA65 platform PRG executable starting in MEGA65 mode.
|
|
.file [name="dma-test.prg", type="prg", segments="Program"]
|
|
.segmentdef Program [segments="Basic, Code, Data"]
|
|
.segmentdef Basic [start=$2001]
|
|
.segmentdef Code [start=$2017]
|
|
.segmentdef Data [startAfter="Code"]
|
|
.segment Basic
|
|
.byte $0a, $20, $0a, $00, $fe, $02, $20, $30, $00 // 10 BANK 0
|
|
.byte $15, $20, $14, $00, $9e, $20 // 20 SYS
|
|
.text toIntString(main) // NNNN
|
|
.byte $00, $00, $00 //
|
|
// Global Constants & labels
|
|
/// DMA command copy
|
|
.const DMA_COMMAND_COPY = 0
|
|
.const OFFSET_STRUCT_F018_DMAGIC_EN018B = 3
|
|
.const OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4
|
|
.const OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2
|
|
.const OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1
|
|
/// DMAgic F018 Controller
|
|
.label DMA = $d700
|
|
/// Default address of screen character matrix
|
|
.label DEFAULT_SCREEN = $800
|
|
.segment Code
|
|
// main
|
|
main: {
|
|
// [1] call memoryRemap
|
|
// Map memory to BANK 0 : 0x00XXXX - giving access to I/O
|
|
jsr memoryRemap
|
|
jmp __b1
|
|
// main::@1
|
|
__b1:
|
|
// [2] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 -- _deref_pbuc1=vbuc2
|
|
// Enable enable F018B mode
|
|
lda #1
|
|
sta DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B
|
|
// [3] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 -- _deref_pbuc1=vbuc2
|
|
// Set address of DMA list
|
|
lda #0
|
|
sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB
|
|
// [4] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 -- _deref_pbuc1=vbuc2
|
|
lda #0
|
|
sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK
|
|
// [5] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = byte1 &DMA_SCREEN_UP -- _deref_pbuc1=vbuc2
|
|
lda #>DMA_SCREEN_UP
|
|
sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB
|
|
// [6] *((byte*)DMA) = byte0 &DMA_SCREEN_UP -- _deref_pbuc1=vbuc2
|
|
// Trigger the DMA (without option lists)
|
|
lda #<DMA_SCREEN_UP
|
|
sta DMA
|
|
// [7] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 0 -- _deref_pbuc1=vbuc2
|
|
// Re-enable F018A mode
|
|
lda #0
|
|
sta DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B
|
|
jmp __breturn
|
|
// main::@return
|
|
__breturn:
|
|
// [8] return
|
|
rts
|
|
}
|
|
// memoryRemap
|
|
// Remap some of the eight 8K memory blocks in the 64K address space of the 6502 to point somewhere else in the first 1MB memory space of the MEGA65.
|
|
// After the remapping the CPU will access the mapped memory whenever it uses instructions that access a remapped block.
|
|
// See section 2.3.4 in http://www.zimmers.net/cbmpics/cbm/c65/c65manual.txt for a description of the CPU memory remapper of the C65.
|
|
// remapBlocks: Indicates which 8K blocks of the 6502 address space to remap. Each bit represents one 8K block
|
|
// - bit 0 Memory block $0000-$1fff. Use constant MEMORYBLOCK_0000.
|
|
// - bit 1 Memory block $2000-$3fff. Use constant MEMORYBLOCK_2000.
|
|
// - bit 2 Memory block $4000-$5fff. Use constant MEMORYBLOCK_4000.
|
|
// - bit 3 Memory block $6000-$7fff. Use constant MEMORYBLOCK_6000.
|
|
// - bit 4 Memory block $8000-$9fff. Use constant MEMORYBLOCK_8000.
|
|
// - bit 5 Memory block $a000-$bfff. Use constant MEMORYBLOCK_A000.
|
|
// - bit 6 Memory block $c000-$dfff. Use constant MEMORYBLOCK_C000.
|
|
// - bit 7 Memory block $e000-$ffff. Use constant MEMORYBLOCK_E000.
|
|
// lowerPageOffset: Offset that will be added to any remapped blocks in the lower 32K of memory (block 0-3).
|
|
// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used.
|
|
// - If block 0 ($0000-$1fff) is remapped it will point to lowerPageOffset*$100.
|
|
// - If block 1 ($2000-$3fff) is remapped it will point to lowerPageOffset*$100 + $2000.
|
|
// - If block 2 ($4000-$5fff) is remapped it will point to lowerPageOffset*$100 + $4000.
|
|
// - If block 3 ($6000-$7fff) is remapped it will point to lowerPageOffset*$100 + $6000.
|
|
// upperPageOffset: Offset that will be added to any remapped blocks in the upper 32K of memory (block 4-7).
|
|
// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used.
|
|
// - If block 4 ($8000-$9fff) is remapped it will point to upperPageOffset*$100 + $8000
|
|
// - If block 5 ($a000-$bfff) is remapped it will point to upperPageOffset*$100 + $a000.
|
|
// - If block 6 ($c000-$dfff) is remapped it will point to upperPageOffset*$100 + $c000.
|
|
// - If block 7 ($e000-$ffff) is remapped it will point to upperPageOffset*$100 + $e000.
|
|
memoryRemap: {
|
|
.label aVal = 2
|
|
.label xVal = 3
|
|
.label yVal = 4
|
|
.label zVal = 5
|
|
// [9] memoryRemap::aVal = 0 -- vbuz1=vbuc1
|
|
// lower blocks offset page low
|
|
lda #0
|
|
sta.z aVal
|
|
// [10] memoryRemap::xVal = 0 -- vbuz1=vbuc1
|
|
// lower blocks to map + lower blocks offset high nibble
|
|
lda #0
|
|
sta.z xVal
|
|
// [11] memoryRemap::yVal = 0 -- vbuz1=vbuc1
|
|
// upper blocks offset page
|
|
lda #0
|
|
sta.z yVal
|
|
// [12] memoryRemap::zVal = 0 -- vbuz1=vbuc1
|
|
// upper blocks to map + upper blocks offset page high nibble
|
|
lda #0
|
|
sta.z zVal
|
|
// asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom }
|
|
lda aVal
|
|
ldx xVal
|
|
ldy yVal
|
|
ldz zVal
|
|
map
|
|
eom
|
|
jmp __breturn
|
|
// memoryRemap::@return
|
|
__breturn:
|
|
// [14] return
|
|
rts
|
|
}
|
|
// File Data
|
|
.segment Data
|
|
// DMA list entry that scrolls the default screen up
|
|
DMA_SCREEN_UP: .byte DMA_COMMAND_COPY
|
|
.word $18*$50, DEFAULT_SCREEN+$50
|
|
.byte 0
|
|
.word DEFAULT_SCREEN
|
|
.byte 0, 0
|
|
.word 0
|
|
|
|
ASSEMBLER OPTIMIZATIONS
|
|
Removing instruction jmp __b1
|
|
Removing instruction jmp __breturn
|
|
Removing instruction jmp __breturn
|
|
Succesful ASM optimization Pass5NextJumpElimination
|
|
Removing instruction lda #0
|
|
Removing instruction lda #0
|
|
Removing instruction lda #0
|
|
Removing instruction lda #0
|
|
Succesful ASM optimization Pass5UnnecesaryLoadElimination
|
|
Removing instruction __b1:
|
|
Removing instruction __breturn:
|
|
Removing instruction __breturn:
|
|
Succesful ASM optimization Pass5UnusedLabelElimination
|
|
|
|
FINAL SYMBOL TABLE
|
|
constant byte* const DEFAULT_SCREEN = (byte*) 2048
|
|
constant struct F018_DMAGIC* const DMA = (struct F018_DMAGIC*) 55040
|
|
constant const byte DMA_COMMAND_COPY = 0
|
|
volatile struct DMA_LIST_F018B DMA_SCREEN_UP loadstore mem[12] = { command: DMA_COMMAND_COPY, count: (word)$18*$50, src: DEFAULT_SCREEN+$50, src_bank: 0, dest: DEFAULT_SCREEN, dest_bank: 0, sub_command: 0, modulo: 0 }
|
|
constant byte OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2
|
|
constant byte OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4
|
|
constant byte OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1
|
|
constant byte OFFSET_STRUCT_F018_DMAGIC_EN018B = 3
|
|
void main()
|
|
void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset)
|
|
volatile byte memoryRemap::aVal loadstore zp[1]:2 2.75
|
|
word memoryRemap::lowerPageOffset
|
|
byte memoryRemap::remapBlocks
|
|
word memoryRemap::upperPageOffset
|
|
volatile byte memoryRemap::xVal loadstore zp[1]:3 3.6666666666666665
|
|
volatile byte memoryRemap::yVal loadstore zp[1]:4 5.5
|
|
volatile byte memoryRemap::zVal loadstore zp[1]:5 11.0
|
|
|
|
zp[1]:2 [ memoryRemap::aVal ]
|
|
zp[1]:3 [ memoryRemap::xVal ]
|
|
zp[1]:4 [ memoryRemap::yVal ]
|
|
zp[1]:5 [ memoryRemap::zVal ]
|
|
mem[12] [ DMA_SCREEN_UP ]
|
|
|
|
|
|
FINAL ASSEMBLER
|
|
Score: 85
|
|
|
|
// File Comments
|
|
// MEGA65 DMA test using F018 directly
|
|
// Appendix J in https://mega.scryptos.com/sharefolder-link/MEGA/MEGA65+filehost/Docs/MEGA65-Book_draft.pdf
|
|
/// @file
|
|
/// MEGA65 Registers and Constants
|
|
/// @file
|
|
/// The MOS 6526 Complex Interface Adapter (CIA)
|
|
///
|
|
/// http://archive.6502.org/datasheets/mos_6526_cia_recreated.pdf
|
|
// Upstart
|
|
.cpu _45gs02
|
|
// MEGA65 platform PRG executable starting in MEGA65 mode.
|
|
.file [name="dma-test.prg", type="prg", segments="Program"]
|
|
.segmentdef Program [segments="Basic, Code, Data"]
|
|
.segmentdef Basic [start=$2001]
|
|
.segmentdef Code [start=$2017]
|
|
.segmentdef Data [startAfter="Code"]
|
|
.segment Basic
|
|
.byte $0a, $20, $0a, $00, $fe, $02, $20, $30, $00 // 10 BANK 0
|
|
.byte $15, $20, $14, $00, $9e, $20 // 20 SYS
|
|
.text toIntString(main) // NNNN
|
|
.byte $00, $00, $00 //
|
|
// Global Constants & labels
|
|
/// DMA command copy
|
|
.const DMA_COMMAND_COPY = 0
|
|
.const OFFSET_STRUCT_F018_DMAGIC_EN018B = 3
|
|
.const OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4
|
|
.const OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2
|
|
.const OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1
|
|
/// DMAgic F018 Controller
|
|
.label DMA = $d700
|
|
/// Default address of screen character matrix
|
|
.label DEFAULT_SCREEN = $800
|
|
.segment Code
|
|
// main
|
|
main: {
|
|
// memoryRemap(0,0,0)
|
|
// [1] call memoryRemap
|
|
// Map memory to BANK 0 : 0x00XXXX - giving access to I/O
|
|
jsr memoryRemap
|
|
// main::@1
|
|
// DMA->EN018B = 1
|
|
// [2] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 -- _deref_pbuc1=vbuc2
|
|
// Enable enable F018B mode
|
|
lda #1
|
|
sta DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B
|
|
// DMA->ADDRMB = 0
|
|
// [3] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 -- _deref_pbuc1=vbuc2
|
|
// Set address of DMA list
|
|
lda #0
|
|
sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB
|
|
// DMA->ADDRBANK = 0
|
|
// [4] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 -- _deref_pbuc1=vbuc2
|
|
sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK
|
|
// DMA-> ADDRMSB = BYTE1(&DMA_SCREEN_UP)
|
|
// [5] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = byte1 &DMA_SCREEN_UP -- _deref_pbuc1=vbuc2
|
|
lda #>DMA_SCREEN_UP
|
|
sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB
|
|
// DMA-> ADDRLSBTRIG = BYTE0(&DMA_SCREEN_UP)
|
|
// [6] *((byte*)DMA) = byte0 &DMA_SCREEN_UP -- _deref_pbuc1=vbuc2
|
|
// Trigger the DMA (without option lists)
|
|
lda #<DMA_SCREEN_UP
|
|
sta DMA
|
|
// DMA->EN018B = 0
|
|
// [7] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 0 -- _deref_pbuc1=vbuc2
|
|
// Re-enable F018A mode
|
|
lda #0
|
|
sta DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B
|
|
// main::@return
|
|
// }
|
|
// [8] return
|
|
rts
|
|
}
|
|
// memoryRemap
|
|
// Remap some of the eight 8K memory blocks in the 64K address space of the 6502 to point somewhere else in the first 1MB memory space of the MEGA65.
|
|
// After the remapping the CPU will access the mapped memory whenever it uses instructions that access a remapped block.
|
|
// See section 2.3.4 in http://www.zimmers.net/cbmpics/cbm/c65/c65manual.txt for a description of the CPU memory remapper of the C65.
|
|
// remapBlocks: Indicates which 8K blocks of the 6502 address space to remap. Each bit represents one 8K block
|
|
// - bit 0 Memory block $0000-$1fff. Use constant MEMORYBLOCK_0000.
|
|
// - bit 1 Memory block $2000-$3fff. Use constant MEMORYBLOCK_2000.
|
|
// - bit 2 Memory block $4000-$5fff. Use constant MEMORYBLOCK_4000.
|
|
// - bit 3 Memory block $6000-$7fff. Use constant MEMORYBLOCK_6000.
|
|
// - bit 4 Memory block $8000-$9fff. Use constant MEMORYBLOCK_8000.
|
|
// - bit 5 Memory block $a000-$bfff. Use constant MEMORYBLOCK_A000.
|
|
// - bit 6 Memory block $c000-$dfff. Use constant MEMORYBLOCK_C000.
|
|
// - bit 7 Memory block $e000-$ffff. Use constant MEMORYBLOCK_E000.
|
|
// lowerPageOffset: Offset that will be added to any remapped blocks in the lower 32K of memory (block 0-3).
|
|
// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used.
|
|
// - If block 0 ($0000-$1fff) is remapped it will point to lowerPageOffset*$100.
|
|
// - If block 1 ($2000-$3fff) is remapped it will point to lowerPageOffset*$100 + $2000.
|
|
// - If block 2 ($4000-$5fff) is remapped it will point to lowerPageOffset*$100 + $4000.
|
|
// - If block 3 ($6000-$7fff) is remapped it will point to lowerPageOffset*$100 + $6000.
|
|
// upperPageOffset: Offset that will be added to any remapped blocks in the upper 32K of memory (block 4-7).
|
|
// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used.
|
|
// - If block 4 ($8000-$9fff) is remapped it will point to upperPageOffset*$100 + $8000
|
|
// - If block 5 ($a000-$bfff) is remapped it will point to upperPageOffset*$100 + $a000.
|
|
// - If block 6 ($c000-$dfff) is remapped it will point to upperPageOffset*$100 + $c000.
|
|
// - If block 7 ($e000-$ffff) is remapped it will point to upperPageOffset*$100 + $e000.
|
|
memoryRemap: {
|
|
.label aVal = 2
|
|
.label xVal = 3
|
|
.label yVal = 4
|
|
.label zVal = 5
|
|
// char aVal = BYTE0(lowerPageOffset)
|
|
// [9] memoryRemap::aVal = 0 -- vbuz1=vbuc1
|
|
// lower blocks offset page low
|
|
lda #0
|
|
sta.z aVal
|
|
// char xVal = (remapBlocks << 4) | (BYTE1(lowerPageOffset) & 0xf)
|
|
// [10] memoryRemap::xVal = 0 -- vbuz1=vbuc1
|
|
// lower blocks to map + lower blocks offset high nibble
|
|
sta.z xVal
|
|
// char yVal = BYTE0(upperPageOffset)
|
|
// [11] memoryRemap::yVal = 0 -- vbuz1=vbuc1
|
|
// upper blocks offset page
|
|
sta.z yVal
|
|
// char zVal = (remapBlocks & 0xf0) | (BYTE1(upperPageOffset) & 0xf)
|
|
// [12] memoryRemap::zVal = 0 -- vbuz1=vbuc1
|
|
// upper blocks to map + upper blocks offset page high nibble
|
|
sta.z zVal
|
|
// asm
|
|
// asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom }
|
|
lda aVal
|
|
ldx xVal
|
|
ldy yVal
|
|
ldz zVal
|
|
map
|
|
eom
|
|
// memoryRemap::@return
|
|
// }
|
|
// [14] return
|
|
rts
|
|
}
|
|
// File Data
|
|
.segment Data
|
|
// DMA list entry that scrolls the default screen up
|
|
DMA_SCREEN_UP: .byte DMA_COMMAND_COPY
|
|
.word $18*$50, DEFAULT_SCREEN+$50
|
|
.byte 0
|
|
.word DEFAULT_SCREEN
|
|
.byte 0, 0
|
|
.word 0
|
|
|