1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-08-07 22:25:13 +00:00
Files
kickc/src/test/ref/examples/mega65/dma-test.log
2021-06-19 22:28:44 +02:00

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