kickc/src/test/ref/examples/crunching/test-exomizer.log

433 lines
16 KiB
Plaintext

Loading link script "crunching.ld"
Inlined call vicSelectGfxBank::$0 = call toDd00 vicSelectGfxBank::gfx
Inlined call main::$0 = call toSpritePtr SPRITE
CONTROL FLOW GRAPH SSA
void main()
main: scope:[main] from __start
kickasm() {{ :EXO_DECRUNCH(CRUNCHED_SPRITE_END)
}}
*((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 1
main::toSpritePtr1_sprite#0 = SPRITE
to:main::toSpritePtr1
main::toSpritePtr1: scope:[main] from main
main::toSpritePtr1_sprite#1 = phi( main/main::toSpritePtr1_sprite#0 )
main::toSpritePtr1_$1 = (word)main::toSpritePtr1_sprite#1
main::toSpritePtr1_$0 = main::toSpritePtr1_$1 / $40
main::toSpritePtr1_return#0 = (byte)main::toSpritePtr1_$0
to:main::toSpritePtr1_@return
main::toSpritePtr1_@return: scope:[main] from main::toSpritePtr1
main::toSpritePtr1_return#2 = phi( main::toSpritePtr1/main::toSpritePtr1_return#0 )
main::toSpritePtr1_return#1 = main::toSpritePtr1_return#2
to:main::@1
main::@1: scope:[main] from main::toSpritePtr1_@return
main::toSpritePtr1_return#3 = phi( main::toSpritePtr1_@return/main::toSpritePtr1_return#1 )
main::$0 = main::toSpritePtr1_return#3
SPRITES_PTR[0] = main::$0
SPRITES_COLOR[0] = GREEN
SPRITES_XPOS[0] = $15
SPRITES_YPOS[0] = $33
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
const byte* CRUNCHED_SPRITE[] = kickasm( uses SPRITE) {{ .modify MemExomizer(false, true) {
.pc = SPRITE
.var pic = LoadPicture("sprite.png", List().add($000000, $ffffff))
.for (var y=0; y<21; y++)
.for (var x=0;x<3; x++)
.byte pic.getSinglecolorByte(x,y)
}
CRUNCHED_SPRITE_END:
}}
const nomodify byte* DEFAULT_SCREEN = (byte*)$400
const byte* EXOMIZER[] = kickasm {{ .const EXO_LITERAL_SEQUENCES_USED = true
.const EXO_ZP_BASE = $02
.const EXO_DECRUNCH_TABLE = $0200
#import "exomizer_decrunch.asm"
}}
const nomodify byte GREEN = 5
const nomodify word OFFSET_SPRITE_PTRS = $3f8
const byte OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE = $15
const nomodify byte* SPRITE = (byte*)$2000
const nomodify byte* SPRITES_COLOR = (byte*)$d027
const nomodify byte* SPRITES_PTR = DEFAULT_SCREEN+OFFSET_SPRITE_PTRS
const nomodify byte* SPRITES_XPOS = (byte*)$d000
const nomodify byte* SPRITES_YPOS = (byte*)$d001
const nomodify struct MOS6569_VICII* VICII = (struct MOS6569_VICII*)$d000
void __start()
void main()
byte~ main::$0
number~ main::toSpritePtr1_$0
word~ main::toSpritePtr1_$1
byte main::toSpritePtr1_return
byte main::toSpritePtr1_return#0
byte main::toSpritePtr1_return#1
byte main::toSpritePtr1_return#2
byte main::toSpritePtr1_return#3
byte* main::toSpritePtr1_sprite
byte* main::toSpritePtr1_sprite#0
byte* main::toSpritePtr1_sprite#1
Adding number conversion cast (unumber) 1 in *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 1
Adding number conversion cast (unumber) $40 in main::toSpritePtr1_$0 = main::toSpritePtr1_$1 / $40
Adding number conversion cast (unumber) main::toSpritePtr1_$0 in main::toSpritePtr1_$0 = main::toSpritePtr1_$1 / (unumber)$40
Adding number conversion cast (unumber) 0 in SPRITES_PTR[0] = main::$0
Adding number conversion cast (unumber) 0 in SPRITES_COLOR[0] = GREEN
Adding number conversion cast (unumber) $15 in SPRITES_XPOS[0] = $15
Adding number conversion cast (unumber) 0 in SPRITES_XPOS[0] = ((unumber)) $15
Adding number conversion cast (unumber) $33 in SPRITES_YPOS[0] = $33
Adding number conversion cast (unumber) 0 in SPRITES_YPOS[0] = ((unumber)) $33
Successful SSA optimization PassNAddNumberTypeConversions
Inlining cast *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = (unumber)1
Inlining cast SPRITES_XPOS[(unumber)0] = (unumber)$15
Inlining cast SPRITES_YPOS[(unumber)0] = (unumber)$33
Successful SSA optimization Pass2InlineCast
Simplifying constant pointer cast (byte*) 53248
Simplifying constant pointer cast (byte*) 53249
Simplifying constant pointer cast (byte*) 53287
Simplifying constant pointer cast (struct MOS6569_VICII*) 53248
Simplifying constant pointer cast (byte*) 1024
Simplifying constant pointer cast (byte*) 8192
Simplifying constant integer cast 1
Simplifying constant integer cast $40
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast $15
Simplifying constant integer cast 0
Simplifying constant integer cast $33
Simplifying constant integer cast 0
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (byte) 1
Finalized unsigned number type (byte) $40
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) $15
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) $33
Finalized unsigned number type (byte) 0
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inferred type updated to word in main::toSpritePtr1_$0 = main::toSpritePtr1_$1 / $40
Alias main::toSpritePtr1_sprite#0 = main::toSpritePtr1_sprite#1
Alias main::toSpritePtr1_return#0 = main::toSpritePtr1_return#2 main::toSpritePtr1_return#1 main::toSpritePtr1_return#3 main::$0
Successful SSA optimization Pass2AliasElimination
Constant main::toSpritePtr1_sprite#0 = SPRITE
Successful SSA optimization Pass2ConstantIdentification
Constant main::toSpritePtr1_$1 = (word)main::toSpritePtr1_sprite#0
Successful SSA optimization Pass2ConstantIdentification
Simplifying expression containing zero SPRITES_PTR in [6] SPRITES_PTR[0] = main::toSpritePtr1_return#0
Simplifying expression containing zero SPRITES_COLOR in [7] SPRITES_COLOR[0] = GREEN
Simplifying expression containing zero SPRITES_XPOS in [8] SPRITES_XPOS[0] = $15
Simplifying expression containing zero SPRITES_YPOS in [9] SPRITES_YPOS[0] = $33
Successful SSA optimization PassNSimplifyExpressionWithZero
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
Constant right-side identified [2] main::toSpritePtr1_$0 = main::toSpritePtr1_$1 / $40
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant main::toSpritePtr1_$0 = main::toSpritePtr1_$1/$40
Successful SSA optimization Pass2ConstantIdentification
Constant main::toSpritePtr1_return#0 = (byte)main::toSpritePtr1_$0
Successful SSA optimization Pass2ConstantIdentification
Constant inlined main::toSpritePtr1_sprite#0 = SPRITE
Constant inlined main::toSpritePtr1_$1 = (word)SPRITE
Constant inlined main::toSpritePtr1_$0 = (word)SPRITE/$40
Successful SSA optimization Pass2ConstantInlining
Adding NOP phi() at start of main::toSpritePtr1
Adding NOP phi() at start of main::toSpritePtr1_@return
CALL GRAPH
Created 0 initial phi equivalence classes
Coalesced down to 0 phi equivalence classes
Culled Empty Block label main::toSpritePtr1_@return
Adding NOP phi() at start of main::toSpritePtr1
FINAL CONTROL FLOW GRAPH
void main()
main: scope:[main] from
kickasm() {{ :EXO_DECRUNCH(CRUNCHED_SPRITE_END)
}}
[1] *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 1
to:main::toSpritePtr1
main::toSpritePtr1: scope:[main] from main
[2] phi()
to:main::@1
main::@1: scope:[main] from main::toSpritePtr1
[3] *SPRITES_PTR = main::toSpritePtr1_return#0
[4] *SPRITES_COLOR = GREEN
[5] *SPRITES_XPOS = $15
[6] *SPRITES_YPOS = $33
to:main::@return
main::@return: scope:[main] from main::@1
[7] return
to:@return
VARIABLE REGISTER WEIGHTS
void main()
byte main::toSpritePtr1_return
byte* main::toSpritePtr1_sprite
Initial phi equivalence classes
Complete equivalence classes
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [1] *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 1 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [3] *SPRITES_PTR = main::toSpritePtr1_return#0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [4] *SPRITES_COLOR = GREEN [ ] ( [ ] { } ) always clobbers reg byte a
Statement [5] *SPRITES_XPOS = $15 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [6] *SPRITES_YPOS = $33 [ ] ( [ ] { } ) always clobbers reg byte a
REGISTER UPLIFT SCOPES
Uplift Scope [MOS6526_CIA]
Uplift Scope [MOS6569_VICII]
Uplift Scope [MOS6581_SID]
Uplift Scope [main]
Uplift Scope []
Uplifting [MOS6526_CIA] best 328 combination
Uplifting [MOS6569_VICII] best 328 combination
Uplifting [MOS6581_SID] best 328 combination
Uplifting [main] best 328 combination
Uplifting [] best 328 combination
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
// Example showing how to crunch and decrunch part of a file using the KickAss Cruncher Plugins
// Exomizer Example
// https://github.com/p-a/kickass-cruncher-plugins
// Upstart
// Commodore 64 PRG executable file - with the cruncher plugin enabled
.plugin "se.triad.kickass.CruncherPlugins"
.file [name="test-exomizer.prg", type="prg", segments="Program"]
.segmentdef Program [segments="Basic, Code, Data"]
.segmentdef Basic [start=$0801]
.segmentdef Code [start=$80d]
.segmentdef Data [startAfter="Code"]
.segment Basic
:BasicUpstart(main)
// Global Constants & labels
// The offset of the sprite pointers from the screen start address
.const OFFSET_SPRITE_PTRS = $3f8
.const GREEN = 5
.const OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE = $15
.label SPRITES_XPOS = $d000
.label SPRITES_YPOS = $d001
.label SPRITES_COLOR = $d027
// The VIC-II MOS 6567/6569
.label VICII = $d000
// Default address of screen character matrix
.label DEFAULT_SCREEN = $400
// Address to decrunch the sprite to
.label SPRITE = $2000
.label SPRITES_PTR = DEFAULT_SCREEN+OFFSET_SPRITE_PTRS
.segment Code
// main
main: {
.const toSpritePtr1_return = SPRITE/$40
// kickasm() {{ :EXO_DECRUNCH(CRUNCHED_SPRITE_END) }}
// Decrunch sprite file into memory
:EXO_DECRUNCH(CRUNCHED_SPRITE_END)
// [1] *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 1 -- _deref_pbuc1=vbuc2
// Show the loaded sprite on screen
lda #1
sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE
// [2] phi from main to main::toSpritePtr1 [phi:main->main::toSpritePtr1]
toSpritePtr1_from_main:
jmp toSpritePtr1
// main::toSpritePtr1
toSpritePtr1:
jmp __b1
// main::@1
__b1:
// [3] *SPRITES_PTR = main::toSpritePtr1_return#0 -- _deref_pbuc1=vbuc2
lda #toSpritePtr1_return
sta SPRITES_PTR
// [4] *SPRITES_COLOR = GREEN -- _deref_pbuc1=vbuc2
lda #GREEN
sta SPRITES_COLOR
// [5] *SPRITES_XPOS = $15 -- _deref_pbuc1=vbuc2
lda #$15
sta SPRITES_XPOS
// [6] *SPRITES_YPOS = $33 -- _deref_pbuc1=vbuc2
lda #$33
sta SPRITES_YPOS
jmp __breturn
// main::@return
__breturn:
// [7] return
rts
}
// File Data
.segment Data
// The exomizer decruncher
EXOMIZER:
.const EXO_LITERAL_SEQUENCES_USED = true
.const EXO_ZP_BASE = $02
.const EXO_DECRUNCH_TABLE = $0200
#import "exomizer_decrunch.asm"
// Array with crunched data created using inline kickasm
CRUNCHED_SPRITE:
.modify MemExomizer(false, true) {
.pc = SPRITE
.var pic = LoadPicture("sprite.png", List().add($000000, $ffffff))
.for (var y=0; y<21; y++)
.for (var x=0;x<3; x++)
.byte pic.getSinglecolorByte(x,y)
}
CRUNCHED_SPRITE_END:
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp toSpritePtr1
Removing instruction jmp __b1
Removing instruction jmp __breturn
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction toSpritePtr1_from_main:
Removing instruction toSpritePtr1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction __b1:
Removing instruction __breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
FINAL SYMBOL TABLE
const byte* CRUNCHED_SPRITE[] = kickasm( uses SPRITE) {{ .modify MemExomizer(false, true) {
.pc = SPRITE
.var pic = LoadPicture("sprite.png", List().add($000000, $ffffff))
.for (var y=0; y<21; y++)
.for (var x=0;x<3; x++)
.byte pic.getSinglecolorByte(x,y)
}
CRUNCHED_SPRITE_END:
}}
const nomodify byte* DEFAULT_SCREEN = (byte*) 1024
const byte* EXOMIZER[] = kickasm {{ .const EXO_LITERAL_SEQUENCES_USED = true
.const EXO_ZP_BASE = $02
.const EXO_DECRUNCH_TABLE = $0200
#import "exomizer_decrunch.asm"
}}
const nomodify byte GREEN = 5
const nomodify word OFFSET_SPRITE_PTRS = $3f8
const byte OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE = $15
const nomodify byte* SPRITE = (byte*) 8192
const nomodify byte* SPRITES_COLOR = (byte*) 53287
const nomodify byte* SPRITES_PTR = DEFAULT_SCREEN+OFFSET_SPRITE_PTRS
const nomodify byte* SPRITES_XPOS = (byte*) 53248
const nomodify byte* SPRITES_YPOS = (byte*) 53249
const nomodify struct MOS6569_VICII* VICII = (struct MOS6569_VICII*) 53248
void main()
byte main::toSpritePtr1_return
const byte main::toSpritePtr1_return#0 toSpritePtr1_return = (byte)(word)SPRITE/$40
byte* main::toSpritePtr1_sprite
FINAL ASSEMBLER
Score: 292
// File Comments
// Example showing how to crunch and decrunch part of a file using the KickAss Cruncher Plugins
// Exomizer Example
// https://github.com/p-a/kickass-cruncher-plugins
// Upstart
// Commodore 64 PRG executable file - with the cruncher plugin enabled
.plugin "se.triad.kickass.CruncherPlugins"
.file [name="test-exomizer.prg", type="prg", segments="Program"]
.segmentdef Program [segments="Basic, Code, Data"]
.segmentdef Basic [start=$0801]
.segmentdef Code [start=$80d]
.segmentdef Data [startAfter="Code"]
.segment Basic
:BasicUpstart(main)
// Global Constants & labels
// The offset of the sprite pointers from the screen start address
.const OFFSET_SPRITE_PTRS = $3f8
.const GREEN = 5
.const OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE = $15
.label SPRITES_XPOS = $d000
.label SPRITES_YPOS = $d001
.label SPRITES_COLOR = $d027
// The VIC-II MOS 6567/6569
.label VICII = $d000
// Default address of screen character matrix
.label DEFAULT_SCREEN = $400
// Address to decrunch the sprite to
.label SPRITE = $2000
.label SPRITES_PTR = DEFAULT_SCREEN+OFFSET_SPRITE_PTRS
.segment Code
// main
main: {
.const toSpritePtr1_return = SPRITE/$40
// kickasm
// kickasm() {{ :EXO_DECRUNCH(CRUNCHED_SPRITE_END) }}
// Decrunch sprite file into memory
:EXO_DECRUNCH(CRUNCHED_SPRITE_END)
// VICII->SPRITES_ENABLE = %00000001
// [1] *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 1 -- _deref_pbuc1=vbuc2
// Show the loaded sprite on screen
lda #1
sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE
// [2] phi from main to main::toSpritePtr1 [phi:main->main::toSpritePtr1]
// main::toSpritePtr1
// main::@1
// SPRITES_PTR[0] = toSpritePtr(SPRITE)
// [3] *SPRITES_PTR = main::toSpritePtr1_return#0 -- _deref_pbuc1=vbuc2
lda #toSpritePtr1_return
sta SPRITES_PTR
// SPRITES_COLOR[0] = GREEN
// [4] *SPRITES_COLOR = GREEN -- _deref_pbuc1=vbuc2
lda #GREEN
sta SPRITES_COLOR
// SPRITES_XPOS[0] = 0x15
// [5] *SPRITES_XPOS = $15 -- _deref_pbuc1=vbuc2
lda #$15
sta SPRITES_XPOS
// SPRITES_YPOS[0] = 0x33
// [6] *SPRITES_YPOS = $33 -- _deref_pbuc1=vbuc2
lda #$33
sta SPRITES_YPOS
// main::@return
// }
// [7] return
rts
}
// File Data
.segment Data
// The exomizer decruncher
EXOMIZER:
.const EXO_LITERAL_SEQUENCES_USED = true
.const EXO_ZP_BASE = $02
.const EXO_DECRUNCH_TABLE = $0200
#import "exomizer_decrunch.asm"
// Array with crunched data created using inline kickasm
CRUNCHED_SPRITE:
.modify MemExomizer(false, true) {
.pc = SPRITE
.var pic = LoadPicture("sprite.png", List().add($000000, $ffffff))
.for (var y=0; y<21; y++)
.for (var x=0;x<3; x++)
.byte pic.getSinglecolorByte(x,y)
}
CRUNCHED_SPRITE_END: