mirror of
https://gitlab.com/camelot/kickc.git
synced 2026-04-24 06:24:14 +00:00
Merge branch 'master' into revised-attempt-improved-type-inference
This commit is contained in:
+1266
-1266
File diff suppressed because it is too large
Load Diff
+1310
-1310
File diff suppressed because it is too large
Load Diff
+70
-70
@@ -1,114 +1,114 @@
|
||||
//KICKC FRAGMENT CACHE f8d7c0934 f8d7c2682
|
||||
//FRAGMENT vbuz1=vbuc1
|
||||
//KICKC FRAGMENT CACHE 12916116c7 12916134cc
|
||||
//FRAGMENT vbuz1=vbuc1
|
||||
lda #{c1}
|
||||
sta {z1}
|
||||
//FRAGMENT vbuz1_lt_vbuc1_then_la1
|
||||
sta {z1}
|
||||
//FRAGMENT vbuz1_lt_vbuc1_then_la1
|
||||
lda {z1}
|
||||
cmp #{c1}
|
||||
bcc {la1}
|
||||
//FRAGMENT pbuc1_derefidx_vbuz1=vbuc2
|
||||
bcc {la1}
|
||||
//FRAGMENT pbuc1_derefidx_vbuz1=vbuc2
|
||||
lda #{c2}
|
||||
ldy {z1}
|
||||
sta {c1},y
|
||||
//FRAGMENT vbuz1=vbuz2_band_vbuc1
|
||||
sta {c1},y
|
||||
//FRAGMENT vbuz1=vbuz2_band_vbuc1
|
||||
lda #{c1}
|
||||
and {z2}
|
||||
sta {z1}
|
||||
//FRAGMENT vbuz1_neq_0_then_la1
|
||||
sta {z1}
|
||||
//FRAGMENT vbuz1_neq_0_then_la1
|
||||
lda {z1}
|
||||
cmp #0
|
||||
bne {la1}
|
||||
//FRAGMENT vbuz1=vbuz1_plus_vbuc1
|
||||
bne {la1}
|
||||
//FRAGMENT vbuz1=vbuz1_plus_vbuc1
|
||||
lda #{c1}
|
||||
clc
|
||||
adc {z1}
|
||||
sta {z1}
|
||||
//FRAGMENT vbuz1=_inc_vbuz1
|
||||
inc {z1}
|
||||
//FRAGMENT vbuaa_lt_vbuc1_then_la1
|
||||
sta {z1}
|
||||
//FRAGMENT vbuz1=_inc_vbuz1
|
||||
inc {z1}
|
||||
//FRAGMENT vbuaa_lt_vbuc1_then_la1
|
||||
cmp #{c1}
|
||||
bcc {la1}
|
||||
//FRAGMENT pbuc1_derefidx_vbuaa=vbuc2
|
||||
bcc {la1}
|
||||
//FRAGMENT pbuc1_derefidx_vbuaa=vbuc2
|
||||
tay
|
||||
lda #{c2}
|
||||
sta {c1},y
|
||||
//FRAGMENT pbuc1_derefidx_vbuxx=vbuc2
|
||||
sta {c1},y
|
||||
//FRAGMENT pbuc1_derefidx_vbuxx=vbuc2
|
||||
lda #{c2}
|
||||
sta {c1},x
|
||||
//FRAGMENT pbuc1_derefidx_vbuyy=vbuc2
|
||||
sta {c1},x
|
||||
//FRAGMENT pbuc1_derefidx_vbuyy=vbuc2
|
||||
lda #{c2}
|
||||
sta {c1},y
|
||||
//FRAGMENT vbuaa=vbuz1_band_vbuc1
|
||||
lda #{c1}
|
||||
and {z1}
|
||||
//FRAGMENT vbuxx=vbuz1_band_vbuc1
|
||||
sta {c1},y
|
||||
//FRAGMENT vbuaa=vbuz1_band_vbuc1
|
||||
lda #{c1}
|
||||
and {z1}
|
||||
tax
|
||||
//FRAGMENT vbuyy=vbuz1_band_vbuc1
|
||||
//FRAGMENT vbuxx=vbuz1_band_vbuc1
|
||||
lda #{c1}
|
||||
and {z1}
|
||||
tay
|
||||
//FRAGMENT vbuz1=vbuxx_band_vbuc1
|
||||
tax
|
||||
//FRAGMENT vbuyy=vbuz1_band_vbuc1
|
||||
lda #{c1}
|
||||
and {z1}
|
||||
tay
|
||||
//FRAGMENT vbuz1=vbuxx_band_vbuc1
|
||||
txa
|
||||
and #{c1}
|
||||
sta {z1}
|
||||
//FRAGMENT vbuaa=vbuxx_band_vbuc1
|
||||
txa
|
||||
and #{c1}
|
||||
//FRAGMENT vbuxx=vbuxx_band_vbuc1
|
||||
sta {z1}
|
||||
//FRAGMENT vbuaa=vbuxx_band_vbuc1
|
||||
txa
|
||||
and #{c1}
|
||||
tax
|
||||
//FRAGMENT vbuyy=vbuxx_band_vbuc1
|
||||
//FRAGMENT vbuxx=vbuxx_band_vbuc1
|
||||
txa
|
||||
and #{c1}
|
||||
tay
|
||||
//FRAGMENT vbuz1=vbuyy_band_vbuc1
|
||||
tax
|
||||
//FRAGMENT vbuyy=vbuxx_band_vbuc1
|
||||
txa
|
||||
and #{c1}
|
||||
tay
|
||||
//FRAGMENT vbuz1=vbuyy_band_vbuc1
|
||||
tya
|
||||
and #{c1}
|
||||
sta {z1}
|
||||
//FRAGMENT vbuaa=vbuyy_band_vbuc1
|
||||
tya
|
||||
and #{c1}
|
||||
//FRAGMENT vbuxx=vbuyy_band_vbuc1
|
||||
sta {z1}
|
||||
//FRAGMENT vbuaa=vbuyy_band_vbuc1
|
||||
tya
|
||||
and #{c1}
|
||||
tax
|
||||
//FRAGMENT vbuyy=vbuyy_band_vbuc1
|
||||
//FRAGMENT vbuxx=vbuyy_band_vbuc1
|
||||
tya
|
||||
and #{c1}
|
||||
tay
|
||||
//FRAGMENT vbuaa_neq_0_then_la1
|
||||
tax
|
||||
//FRAGMENT vbuyy=vbuyy_band_vbuc1
|
||||
tya
|
||||
and #{c1}
|
||||
tay
|
||||
//FRAGMENT vbuaa_neq_0_then_la1
|
||||
cmp #0
|
||||
bne {la1}
|
||||
//FRAGMENT vbuxx=vbuxx_plus_vbuc1
|
||||
bne {la1}
|
||||
//FRAGMENT vbuxx=vbuxx_plus_vbuc1
|
||||
txa
|
||||
clc
|
||||
adc #{c1}
|
||||
tax
|
||||
//FRAGMENT vbuyy=vbuyy_plus_vbuc1
|
||||
tax
|
||||
//FRAGMENT vbuyy=vbuyy_plus_vbuc1
|
||||
tya
|
||||
clc
|
||||
adc #{c1}
|
||||
tay
|
||||
//FRAGMENT vbuxx_lt_vbuc1_then_la1
|
||||
tay
|
||||
//FRAGMENT vbuxx_lt_vbuc1_then_la1
|
||||
cpx #{c1}
|
||||
bcc {la1}
|
||||
//FRAGMENT vbuxx=vbuc1
|
||||
ldx #{c1}
|
||||
//FRAGMENT vbuxx=_inc_vbuxx
|
||||
inx
|
||||
//FRAGMENT vbuyy=vbuc1
|
||||
ldy #{c1}
|
||||
//FRAGMENT vbuyy_lt_vbuc1_then_la1
|
||||
bcc {la1}
|
||||
//FRAGMENT vbuxx=vbuc1
|
||||
ldx #{c1}
|
||||
//FRAGMENT vbuxx=_inc_vbuxx
|
||||
inx
|
||||
//FRAGMENT vbuyy=vbuc1
|
||||
ldy #{c1}
|
||||
//FRAGMENT vbuyy_lt_vbuc1_then_la1
|
||||
cpy #{c1}
|
||||
bcc {la1}
|
||||
//FRAGMENT vbuyy=_inc_vbuyy
|
||||
iny
|
||||
//FRAGMENT vbuxx_neq_0_then_la1
|
||||
bcc {la1}
|
||||
//FRAGMENT vbuyy=_inc_vbuyy
|
||||
iny
|
||||
//FRAGMENT vbuxx_neq_0_then_la1
|
||||
cpx #0
|
||||
bne {la1}
|
||||
//FRAGMENT vbuyy_neq_0_then_la1
|
||||
bne {la1}
|
||||
//FRAGMENT vbuyy_neq_0_then_la1
|
||||
cpy #0
|
||||
bne {la1}
|
||||
bne {la1}
|
||||
|
||||
+12331
-12115
File diff suppressed because it is too large
Load Diff
+49
-49
@@ -1,67 +1,67 @@
|
||||
//KICKC FRAGMENT CACHE f8d7c0934 f8d7c2682
|
||||
//FRAGMENT vbuz1=_deref_pbuc1
|
||||
//KICKC FRAGMENT CACHE 12916116c7 12916134cc
|
||||
//FRAGMENT vbuz1=_deref_pbuc1
|
||||
lda {c1}
|
||||
sta {z1}
|
||||
//FRAGMENT vbuz1=vbuz2_plus_1
|
||||
sta {z1}
|
||||
//FRAGMENT vbuz1=vbuz2_plus_1
|
||||
lda {z2}
|
||||
inc
|
||||
sta {z1}
|
||||
//FRAGMENT _deref_pbuc1=vbuz1
|
||||
sta {z1}
|
||||
//FRAGMENT _deref_pbuc1=vbuz1
|
||||
lda {z1}
|
||||
sta {c1}
|
||||
//FRAGMENT vbuaa=_deref_pbuc1
|
||||
lda {c1}
|
||||
//FRAGMENT vbuxx=_deref_pbuc1
|
||||
ldx {c1}
|
||||
//FRAGMENT vbuz1=vbuaa_plus_1
|
||||
sta {c1}
|
||||
//FRAGMENT vbuaa=_deref_pbuc1
|
||||
lda {c1}
|
||||
//FRAGMENT vbuxx=_deref_pbuc1
|
||||
ldx {c1}
|
||||
//FRAGMENT vbuz1=vbuaa_plus_1
|
||||
inc
|
||||
sta {z1}
|
||||
//FRAGMENT vbuz1=vbuxx_plus_1
|
||||
sta {z1}
|
||||
//FRAGMENT vbuz1=vbuxx_plus_1
|
||||
inx
|
||||
stx {z1}
|
||||
//FRAGMENT _deref_pbuc1=vbuaa
|
||||
sta {c1}
|
||||
//FRAGMENT vbuyy=_deref_pbuc1
|
||||
ldy {c1}
|
||||
//FRAGMENT vbuz1=vbuyy_plus_1
|
||||
stx {z1}
|
||||
//FRAGMENT _deref_pbuc1=vbuaa
|
||||
sta {c1}
|
||||
//FRAGMENT vbuyy=_deref_pbuc1
|
||||
ldy {c1}
|
||||
//FRAGMENT vbuz1=vbuyy_plus_1
|
||||
iny
|
||||
sty {z1}
|
||||
//FRAGMENT vbuaa=vbuz1_plus_1
|
||||
sty {z1}
|
||||
//FRAGMENT vbuaa=vbuz1_plus_1
|
||||
lda {z1}
|
||||
inc
|
||||
//FRAGMENT vbuaa=vbuaa_plus_1
|
||||
inc
|
||||
//FRAGMENT vbuaa=vbuxx_plus_1
|
||||
inc
|
||||
//FRAGMENT vbuaa=vbuaa_plus_1
|
||||
inc
|
||||
//FRAGMENT vbuaa=vbuxx_plus_1
|
||||
txa
|
||||
inc
|
||||
//FRAGMENT vbuaa=vbuyy_plus_1
|
||||
inc
|
||||
//FRAGMENT vbuaa=vbuyy_plus_1
|
||||
tya
|
||||
inc
|
||||
//FRAGMENT vbuxx=vbuz1_plus_1
|
||||
inc
|
||||
//FRAGMENT vbuxx=vbuz1_plus_1
|
||||
ldx {z1}
|
||||
inx
|
||||
//FRAGMENT _deref_pbuc1=vbuxx
|
||||
stx {c1}
|
||||
//FRAGMENT vbuxx=vbuaa_plus_1
|
||||
inx
|
||||
//FRAGMENT _deref_pbuc1=vbuxx
|
||||
stx {c1}
|
||||
//FRAGMENT vbuxx=vbuaa_plus_1
|
||||
tax
|
||||
inx
|
||||
//FRAGMENT vbuxx=vbuxx_plus_1
|
||||
inx
|
||||
//FRAGMENT vbuxx=vbuyy_plus_1
|
||||
inx
|
||||
//FRAGMENT vbuxx=vbuxx_plus_1
|
||||
inx
|
||||
//FRAGMENT vbuxx=vbuyy_plus_1
|
||||
tya
|
||||
inc
|
||||
tax
|
||||
//FRAGMENT vbuyy=vbuz1_plus_1
|
||||
tax
|
||||
//FRAGMENT vbuyy=vbuz1_plus_1
|
||||
ldy {z1}
|
||||
iny
|
||||
//FRAGMENT _deref_pbuc1=vbuyy
|
||||
sty {c1}
|
||||
//FRAGMENT vbuyy=vbuaa_plus_1
|
||||
iny
|
||||
//FRAGMENT _deref_pbuc1=vbuyy
|
||||
sty {c1}
|
||||
//FRAGMENT vbuyy=vbuaa_plus_1
|
||||
tay
|
||||
iny
|
||||
//FRAGMENT vbuyy=vbuxx_plus_1
|
||||
iny
|
||||
//FRAGMENT vbuyy=vbuxx_plus_1
|
||||
txa
|
||||
inc
|
||||
tay
|
||||
//FRAGMENT vbuyy=vbuyy_plus_1
|
||||
iny
|
||||
tay
|
||||
//FRAGMENT vbuyy=vbuyy_plus_1
|
||||
iny
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
lda #<{c2}
|
||||
sta {c1}
|
||||
lda #>{c2}
|
||||
sta {c1}+1
|
||||
lda #<{c2}>>$10
|
||||
sta {c1}+2
|
||||
lda #>{c2}>>$10
|
||||
sta {c1}+3
|
||||
@@ -0,0 +1,8 @@
|
||||
lda {m1}
|
||||
sta {c1}
|
||||
lda {m1}+1
|
||||
sta {c1}+1
|
||||
lda {m1}+2
|
||||
sta {c1}+2
|
||||
lda {m1}+3
|
||||
sta {c1}+3
|
||||
@@ -0,0 +1,7 @@
|
||||
clc
|
||||
lda {m3}+1
|
||||
adc {m2}
|
||||
sta {m1}
|
||||
lda #0
|
||||
adc {m2}+1
|
||||
sta {m1}+1
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
clc
|
||||
lda {c1},x
|
||||
adc {c2},x
|
||||
sta {c1},x
|
||||
lda {c1}+1,x
|
||||
adc {c2}+1,x
|
||||
sta {c1}+1,x
|
||||
@@ -0,0 +1,2 @@
|
||||
lda {c1}+1,x
|
||||
bpl {la1}
|
||||
@@ -0,0 +1,2 @@
|
||||
lda {c1}+1,x
|
||||
bmi {la1}
|
||||
@@ -0,0 +1,8 @@
|
||||
lda {c1},x
|
||||
cmp #<{c2}
|
||||
lda {c1}+1,x
|
||||
sbc #>{c2}
|
||||
bvc !+
|
||||
eor #$80
|
||||
!:
|
||||
bmi {la1}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
clc
|
||||
lda {c1},y
|
||||
adc {c2},y
|
||||
sta {c1},y
|
||||
lda {c1}+1,y
|
||||
adc {c2}+1,y
|
||||
sta {c1}+1,y
|
||||
@@ -0,0 +1,2 @@
|
||||
lda {c1}+1,y
|
||||
bpl {la1}
|
||||
@@ -0,0 +1,2 @@
|
||||
lda {c1}+1,y
|
||||
bmi {la1}
|
||||
@@ -0,0 +1,8 @@
|
||||
lda {c1},y
|
||||
cmp #<{c2}
|
||||
lda {c1}+1,y
|
||||
sbc #>{c2}
|
||||
bvc !+
|
||||
eor #$80
|
||||
!:
|
||||
bmi {la1}
|
||||
@@ -0,0 +1 @@
|
||||
ora {m1}+1
|
||||
@@ -0,0 +1,8 @@
|
||||
lda {c1}
|
||||
sta {m1}
|
||||
lda {c1}+1
|
||||
sta {m1}+1
|
||||
lda {c1}+2
|
||||
sta {m1}+2
|
||||
lda {c1}+3
|
||||
sta {m1}+3
|
||||
@@ -0,0 +1,16 @@
|
||||
lda {m1}+3
|
||||
cmp #>{c1}>>$10
|
||||
bcc !+
|
||||
bne {la1}
|
||||
lda {m1}+2
|
||||
cmp #<{c1}>>$10
|
||||
bcc !+
|
||||
bne {la1}
|
||||
lda {m1}+1
|
||||
cmp #>{c1}
|
||||
bcc !+
|
||||
bne {la1}
|
||||
lda {m1}
|
||||
cmp #<{c1}
|
||||
bcs {la1}
|
||||
!:
|
||||
@@ -0,0 +1,7 @@
|
||||
sec
|
||||
lda #0
|
||||
sbc {c1},x
|
||||
sta {m1}
|
||||
lda #0
|
||||
sbc {c1}+1,x
|
||||
sta {m1}+1
|
||||
@@ -0,0 +1,7 @@
|
||||
sec
|
||||
lda #0
|
||||
sbc {c1},y
|
||||
sta {m1}
|
||||
lda #0
|
||||
sbc {c1}+1,y
|
||||
sta {m1}+1
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
clc
|
||||
lda {c1},x
|
||||
adc {c2},y
|
||||
sta {m1}
|
||||
lda {c1}+1,x
|
||||
adc {c2}+1,y
|
||||
sta {m1}+1
|
||||
@@ -0,0 +1,7 @@
|
||||
lda {m2}
|
||||
clc
|
||||
adc {c1},x
|
||||
sta {m1}
|
||||
lda {m2}+1
|
||||
adc {c1}+1,x
|
||||
sta {m1}+1
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
clc
|
||||
lda {c1},y
|
||||
adc {c2},x
|
||||
sta {m1}
|
||||
lda {c1}+1,y
|
||||
adc {c2}+1,x
|
||||
sta {m1}+1
|
||||
@@ -0,0 +1,7 @@
|
||||
lda {m2}
|
||||
clc
|
||||
adc {c1},y
|
||||
sta {m1}
|
||||
lda {m2}+1
|
||||
adc {c1}+1,y
|
||||
sta {m1}+1
|
||||
@@ -0,0 +1,7 @@
|
||||
sec
|
||||
lda #<{c1}
|
||||
sbc {c2},x
|
||||
sta {m1}
|
||||
lda #>{c1}
|
||||
sbc {c2}+1,x
|
||||
sta {m1}+1
|
||||
@@ -0,0 +1,7 @@
|
||||
sec
|
||||
lda #<{c1}
|
||||
sbc {c2},y
|
||||
sta {m1}
|
||||
lda #>{c1}
|
||||
sbc {c2}+1,y
|
||||
sta {m1}+1
|
||||
@@ -0,0 +1,7 @@
|
||||
lda {m2}
|
||||
sec
|
||||
sbc {c1},x
|
||||
sta {m1}
|
||||
lda {m2}+1
|
||||
sbc {c1}+1,x
|
||||
sta {m1}+1
|
||||
@@ -0,0 +1,7 @@
|
||||
lda {m2}
|
||||
sec
|
||||
sbc {c1},y
|
||||
sta {m1}
|
||||
lda {m2}+1
|
||||
sbc {c1}+1,y
|
||||
sta {m1}+1
|
||||
@@ -0,0 +1,9 @@
|
||||
ldy #0
|
||||
clc
|
||||
lda ({z2}),y
|
||||
adc {m3}
|
||||
sta {m1}
|
||||
iny
|
||||
lda ({z2}),y
|
||||
adc {m3}+1
|
||||
sta {m1}+1
|
||||
@@ -0,0 +1,11 @@
|
||||
pha
|
||||
clc
|
||||
adc {m2}
|
||||
sta {m1}
|
||||
pla
|
||||
ora #$7f
|
||||
bmi !+
|
||||
lda #0
|
||||
!:
|
||||
adc #0
|
||||
sta {m1}+1
|
||||
@@ -0,0 +1,4 @@
|
||||
and #{c1}
|
||||
sta {m1}
|
||||
lda #0
|
||||
sta {m1}+1
|
||||
@@ -0,0 +1,11 @@
|
||||
asl
|
||||
sta {m1}
|
||||
lda #0
|
||||
rol
|
||||
sta {m1}+1
|
||||
asl {m1}
|
||||
rol {m1}+1
|
||||
asl {m1}
|
||||
rol {m1}+1
|
||||
asl {m1}
|
||||
rol {m1}+1
|
||||
@@ -0,0 +1,9 @@
|
||||
ldy #0
|
||||
clc
|
||||
lda {m2}
|
||||
adc ({z3}),y
|
||||
sta {m1}
|
||||
iny
|
||||
lda {m2}+1
|
||||
adc ({z3}),y
|
||||
sta {m1}+1
|
||||
@@ -0,0 +1,11 @@
|
||||
ldy #0
|
||||
clc
|
||||
lda ({z1}),y
|
||||
adc {m2}
|
||||
pha
|
||||
iny
|
||||
lda ({z1}),y
|
||||
adc {m2}+1
|
||||
sta {z1}+1
|
||||
pla
|
||||
sta {z1}
|
||||
@@ -6,7 +6,6 @@ pha
|
||||
iny
|
||||
lda ({z1}),y
|
||||
adc ({z2}),y
|
||||
sta ({z1}),y
|
||||
dey
|
||||
sta {z1}+1
|
||||
pla
|
||||
sta ({z1}),y
|
||||
sta {z1}
|
||||
@@ -252,6 +252,8 @@ public class Compiler {
|
||||
new Pass1AssertNoLValueIntermediate(program).execute();
|
||||
new PassNAddTypeConversionAssignment(program, true).execute();
|
||||
new Pass1AssertProcedureCallParameters(program).execute();
|
||||
new Pass1ModifiedVarsAnalysis(program).execute();
|
||||
new Pass1CallStackVarPrepare(program).execute();
|
||||
|
||||
if(getLog().isVerbosePass1CreateSsa()) {
|
||||
getLog().append("CONTROL FLOW GRAPH BEFORE SIZEOF FIX");
|
||||
@@ -263,7 +265,7 @@ public class Compiler {
|
||||
|
||||
new PassNAssertTypeMatch(program).check();
|
||||
|
||||
new Pass1PrepareUnwindStruct(program).execute();
|
||||
new Pass1UnwindStructPrepare(program).execute();
|
||||
new Pass1UnwindStructVariables(program).execute();
|
||||
new Pass1UnwindStructValues(program).execute();
|
||||
|
||||
@@ -311,10 +313,18 @@ public class Compiler {
|
||||
}
|
||||
|
||||
new Pass1CallVoidReturns(program).execute();
|
||||
new Pass1CallStackVarConvert(program).execute();
|
||||
if(getLog().isVerbosePass1CreateSsa()) {
|
||||
getLog().append("PROCEDURE CALLS");
|
||||
getLog().append(program.getGraph().toString(program));
|
||||
}
|
||||
new Pass1CallStack(program).execute();
|
||||
new Pass1CallVar(program).execute();
|
||||
new Pass1CallPhiParameters(program).execute();
|
||||
//getLog().append("PROCEDURE PARAMETERS");
|
||||
//getLog().append(program.getGraph().toString(program));
|
||||
if(getLog().isVerbosePass1CreateSsa()) {
|
||||
getLog().append("PROCEDURE PARAMETERS");
|
||||
getLog().append(program.getGraph().toString(program));
|
||||
}
|
||||
new PassNUnwindLValueLists(program).execute();
|
||||
new Pass1GenerateSingleStaticAssignmentForm(program).execute();
|
||||
new Pass1CallPhiReturn(program).execute();
|
||||
|
||||
@@ -151,7 +151,7 @@ public class ControlFlowGraph implements Serializable {
|
||||
public List<ControlFlowBlock> getEntryPointBlocks(Program program) {
|
||||
List<ControlFlowBlock> entryPointBlocks = new ArrayList<>();
|
||||
for(Procedure procedure : program.getScope().getAllProcedures(true)) {
|
||||
if(ProcedureUtils.isEntrypoint(procedure.getRef(), program) || Procedure.CallingConvention.STACK_CALL.equals(procedure.getCallingConvention())) {
|
||||
if(ProcedureUtils.isEntrypoint(procedure.getRef(), program) || Procedure.CallingConvention.STACK_CALL.equals(procedure.getCallingConvention()) || Procedure.CallingConvention.VAR_CALL.equals(procedure.getCallingConvention())) {
|
||||
// Address-of is used on the procedure
|
||||
Label procedureLabel = procedure.getLabel();
|
||||
ControlFlowBlock procedureBlock = getBlock(procedureLabel.getRef());
|
||||
|
||||
@@ -5,124 +5,155 @@ import dk.camelot64.kickc.model.symbols.Procedure;
|
||||
import java.util.List;
|
||||
|
||||
/** A declaration directive. */
|
||||
public interface Directive {
|
||||
public class Directive {
|
||||
|
||||
private String name;
|
||||
|
||||
public Directive(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/** Variable declared const */
|
||||
class Const implements Directive {
|
||||
public static class Const extends Directive {
|
||||
public Const() { super("const"); }
|
||||
}
|
||||
|
||||
/** Variable declared volatile */
|
||||
class Volatile implements Directive {
|
||||
public static class Volatile extends Directive {
|
||||
public Volatile() { super("volatile"); }
|
||||
}
|
||||
|
||||
/** Variable declared register. */
|
||||
class Register implements Directive {
|
||||
public static class Register extends Directive {
|
||||
public Register() { super("register"); }
|
||||
}
|
||||
|
||||
/** Variable declared static. */
|
||||
class Static implements Directive {
|
||||
public static class Static extends Directive {
|
||||
public Static() { super("static"); }
|
||||
}
|
||||
|
||||
/** Function declared inline. */
|
||||
class Inline implements Directive {
|
||||
static public class Inline extends Directive {
|
||||
public Inline() { super("inline"); }
|
||||
}
|
||||
|
||||
/** Function declared intrinsic. */
|
||||
class Intrinsic implements Directive {
|
||||
public static class Intrinsic extends Directive {
|
||||
public Intrinsic() { super("intrinsic"); }
|
||||
}
|
||||
|
||||
/** Variable declared as extern. */
|
||||
class Extern implements Directive {
|
||||
public static class Extern extends Directive {
|
||||
public Extern() { super("extern"); }
|
||||
}
|
||||
|
||||
/** Variable declared as export. */
|
||||
class Export implements Directive {
|
||||
public static class Export extends Directive {
|
||||
public Export() { super("export"); }
|
||||
}
|
||||
|
||||
/** Variable declared as pointer to volatile ( volatile * ) */
|
||||
class ToVolatile implements Directive {
|
||||
public static class ToVolatile extends Directive {
|
||||
public ToVolatile() { super("volatile*"); }
|
||||
}
|
||||
|
||||
/** Variable declared as pointer to const ( const * ) */
|
||||
class ToConst implements Directive {
|
||||
public static class ToConst extends Directive {
|
||||
public ToConst() { super("const*"); }
|
||||
}
|
||||
|
||||
/** Variable __ssa */
|
||||
class FormSsa implements Directive {
|
||||
public static class FormSsa extends Directive {
|
||||
public FormSsa() { super("__ssa"); }
|
||||
|
||||
}
|
||||
|
||||
/** Variable __ma */
|
||||
class FormMa implements Directive {
|
||||
public static class FormMa extends Directive {
|
||||
public FormMa() { super("__ma"); }
|
||||
}
|
||||
|
||||
/** Variable __zp */
|
||||
class MemZp implements Directive {
|
||||
public static class MemZp extends Directive {
|
||||
public MemZp() { super("__zp"); }
|
||||
}
|
||||
|
||||
/** Variable __mem */
|
||||
class MemMain implements Directive {
|
||||
public static class MemMain extends Directive {
|
||||
public MemMain() { super("__mem"); }
|
||||
}
|
||||
|
||||
/** Function with specific declared calling convention. */
|
||||
class CallingConvention implements Directive {
|
||||
public static class CallingConvention extends Directive {
|
||||
|
||||
public Procedure.CallingConvention callingConvention;
|
||||
|
||||
public CallingConvention(Procedure.CallingConvention callingConvention) {
|
||||
super(callingConvention.getName());
|
||||
this.callingConvention = callingConvention;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/** Function declared interrupt. */
|
||||
class Interrupt implements Directive {
|
||||
public static class Interrupt extends Directive {
|
||||
public Procedure.InterruptType interruptType;
|
||||
|
||||
public Interrupt(Procedure.InterruptType interruptType) {
|
||||
super(interruptType.name());
|
||||
this.interruptType = interruptType;
|
||||
}
|
||||
}
|
||||
|
||||
/** Variable memory alignment. */
|
||||
class Align implements Directive {
|
||||
public static class Align extends Directive {
|
||||
|
||||
int alignment;
|
||||
|
||||
public Align(int alignment) {
|
||||
super("__align");
|
||||
this.alignment = alignment;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/** Variable hardcoded register directive. */
|
||||
class NamedRegister implements Directive {
|
||||
public static class NamedRegister extends Directive {
|
||||
|
||||
/** Name of register to use for the variable (if named) */
|
||||
public String name;
|
||||
|
||||
public NamedRegister(String name) {
|
||||
super("__register");
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/** Variable hardcoded __address() directive */
|
||||
class Address implements Directive {
|
||||
public static class Address extends Directive {
|
||||
|
||||
/** Optional hard-coded address to use for storing the variable. */
|
||||
public Long address;
|
||||
|
||||
public Address(Long address) {
|
||||
super("__address");
|
||||
this.address = address;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/** Reservation of zero-page addresses */
|
||||
class ReserveZp implements Directive {
|
||||
public static class ReserveZp extends Directive {
|
||||
public List<Integer> reservedZp;
|
||||
|
||||
public ReserveZp(List<Integer> reservedZp) {
|
||||
super("__reserve_zp");
|
||||
this.reservedZp = reservedZp;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,6 +39,24 @@ public class StructVariableMemberUnwinding {
|
||||
return structVariables.get(ref);
|
||||
}
|
||||
|
||||
/**
|
||||
* Look through all unwound variables and find the master struct variable that was unwound.
|
||||
* @param unwoundMemberRef Variable reference of unwound member
|
||||
* @return The master variable reference. null if the passed member is not unwound.
|
||||
*/
|
||||
public SymbolVariableRef getUnwindingMaster(SymbolVariableRef unwoundMemberRef) {
|
||||
for(SymbolVariableRef masterVar : structVariables.keySet()) {
|
||||
final VariableUnwinding masterVarUnwinding = getVariableUnwinding(masterVar);
|
||||
for(String memberName : masterVarUnwinding.getMemberNames()) {
|
||||
final SymbolVariableRef memberUnwound = masterVarUnwinding.getMemberUnwound(memberName);
|
||||
if(memberUnwound.equals(unwoundMemberRef))
|
||||
return masterVar;
|
||||
}
|
||||
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/** Information about how a single struct variable was unwound. */
|
||||
public static class VariableUnwinding {
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package dk.camelot64.kickc.model;
|
||||
|
||||
import dk.camelot64.kickc.CompileLog;
|
||||
import dk.camelot64.kickc.model.statements.StatementSource;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@@ -40,10 +40,12 @@ public class Procedure extends Scope {
|
||||
|
||||
/** The method for passing parameters and return value to the procedure. */
|
||||
public enum CallingConvention {
|
||||
/** Parameters and return value handled through call PHI-transitions. */
|
||||
/** Parameters and return value handled through PHI-transitions. */
|
||||
PHI_CALL("__phicall"),
|
||||
/** Parameters and return value over the stack. */
|
||||
STACK_CALL("__stackcall");
|
||||
STACK_CALL("__stackcall"),
|
||||
/** Parameters and return value handled through variables. */
|
||||
VAR_CALL("__varcall");
|
||||
|
||||
private final String name;
|
||||
|
||||
|
||||
@@ -29,4 +29,8 @@ public class ParamValue implements RValue {
|
||||
return "param("+parameter.toString(program)+")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return toString(null);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,7 +78,7 @@ ADDRESS_MAINMEM: '__mem' ;
|
||||
FORM_SSA: '__ssa' ;
|
||||
FORM_MA: '__ma' ;
|
||||
INTRINSIC: '__intrinsic' ;
|
||||
CALLINGCONVENTION: '__stackcall' | '__phicall' ;
|
||||
CALLINGCONVENTION: '__stackcall' | '__phicall' | '__varcall' ;
|
||||
IF: 'if' ;
|
||||
ELSE: 'else' ;
|
||||
WHILE: 'while' ;
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@@ -390,13 +390,15 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor<Objec
|
||||
Procedure procedure = new Procedure(name, type, program.getScope(), currentCodeSegment, currentDataSegment, currentCallingConvention);
|
||||
addDirectives(procedure, directives, StatementSource.procedureDecl(ctx));
|
||||
procedure.setComments(ensureUnusedComments(getCommentsSymbol(ctx)));
|
||||
varDecl.exitType();
|
||||
|
||||
scopeStack.push(procedure);
|
||||
Variable returnVar = null;
|
||||
if(!SymbolType.VOID.equals(type)) {
|
||||
returnVar = procedure.add(Variable.createPhiMaster("return", type, procedure, defaultMemoryArea, procedure.getSegmentData()));
|
||||
final VariableBuilder builder = new VariableBuilder("return", procedure, false, varDecl.getEffectiveType(), varDecl.getEffectiveArraySpec(), varDecl.getEffectiveDirectives(), currentDataSegment, program.getTargetPlatform().getVariableBuilderConfig());
|
||||
returnVar = builder.build();
|
||||
}
|
||||
varDecl.exitType();
|
||||
|
||||
List<Variable> parameterList = new ArrayList<>();
|
||||
if(ctx.parameterListDecl() != null) {
|
||||
parameterList = (List<Variable>) this.visit(ctx.parameterListDecl());
|
||||
@@ -1169,8 +1171,8 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor<Objec
|
||||
procedure.setReservedZps(((Directive.ReserveZp) directive).reservedZp);
|
||||
} else if(directive instanceof Directive.Intrinsic) {
|
||||
procedure.setDeclaredIntrinsic(true);
|
||||
} else {
|
||||
throw new CompileError("Unsupported function directive " + directive, source);
|
||||
//} else {
|
||||
// throw new CompileError("Unsupported function directive " + directive.getName(), source);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1189,7 +1191,7 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor<Objec
|
||||
if(directive instanceof Directive.Inline) {
|
||||
conditional.setDeclaredUnroll(true);
|
||||
} else {
|
||||
throw new CompileError("Unsupported loop directive " + directive, source);
|
||||
throw new CompileError("Unsupported loop directive " + directive.getName(), source);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,7 +101,11 @@ public class Pass1CallPhiParameters {
|
||||
for(int i = 0; i < parameterDefs.size(); i++) {
|
||||
Variable parameterDecl = parameterDefs.get(i);
|
||||
RValue parameterValue = parameterValues.get(i);
|
||||
stmtIt.add(new StatementAssignment((LValue) parameterDecl.getRef(), parameterValue, true, call.getSource(), Comment.NO_COMMENTS));
|
||||
final StatementAssignment assignment = new StatementAssignment((LValue) parameterDecl.getRef(), parameterValue, true, call.getSource(), Comment.NO_COMMENTS);
|
||||
stmtIt.add(assignment);
|
||||
if(parameterDecl.isStruct()) {
|
||||
Pass1UnwindStructValues.unwindAssignment(assignment, stmtIt, block, program);
|
||||
}
|
||||
}
|
||||
stmtIt.next();
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ import dk.camelot64.kickc.passes.utils.SizeOfConstants;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/** Handle calling convention {@link Procedure.CallingConvention#STACK_CALL} by converting the making control flow graph and symbols calling convention specific. */
|
||||
/** Handle calling convention {@link Procedure.CallingConvention#STACK_CALL} by converting parameter passing / return values to stack operations. */
|
||||
public class Pass1CallStack extends Pass2SsaOptimization {
|
||||
|
||||
public Pass1CallStack(Program program) {
|
||||
@@ -53,41 +53,6 @@ public class Pass1CallStack extends Pass2SsaOptimization {
|
||||
if(createStackBase)
|
||||
CallingConventionStack.getStackBaseConstant(getScope());
|
||||
|
||||
// Set variables modified in STACK_CALL procedures to load/store
|
||||
for(Procedure procedure : getScope().getAllProcedures(true)) {
|
||||
if(Procedure.CallingConvention.STACK_CALL.equals(procedure.getCallingConvention())) {
|
||||
Set<VariableRef> modifiedVars = getProgram().getProcedureModifiedVars().getModifiedVars(procedure.getRef());
|
||||
for(VariableRef modifiedVar : modifiedVars) {
|
||||
final Variable variable = getScope().getVariable(modifiedVar);
|
||||
if(variable.isKindPhiMaster()) {
|
||||
getLog().append("Converting PHI-variable modified inside __stackcall procedure "+procedure.getFullName()+"() to load/store "+variable.toString(getProgram()));
|
||||
variable.setKind(Variable.Kind.LOAD_STORE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Transform STACK_CALL calls to call-prepare, call-execute, call-finalize
|
||||
for(ControlFlowBlock block : getGraph().getAllBlocks()) {
|
||||
ListIterator<Statement> stmtIt = block.getStatements().listIterator();
|
||||
while(stmtIt.hasNext()) {
|
||||
Statement statement = stmtIt.next();
|
||||
if(statement instanceof StatementCall) {
|
||||
StatementCall call = (StatementCall) statement;
|
||||
ProcedureRef procedureRef = call.getProcedure();
|
||||
Procedure procedure = getScope().getProcedure(procedureRef);
|
||||
if(Procedure.CallingConvention.STACK_CALL.equals(procedure.getCallingConvention())) {
|
||||
boolean hasPrepare = (call.getParameters().size() > 0) || !SymbolType.VOID.equals(procedure.getReturnType());
|
||||
stmtIt.remove();
|
||||
stmtIt.add(new StatementCallPrepare(procedureRef, call.getParameters(), call.getSource(), hasPrepare?call.getComments():Comment.NO_COMMENTS));
|
||||
stmtIt.add(new StatementCallExecute(procedureRef, call.getSource(), hasPrepare?Comment.NO_COMMENTS:call.getComments()));
|
||||
stmtIt.add(new StatementCallFinalize(call.getlValue(), procedureRef, call.getSource(), Comment.NO_COMMENTS));
|
||||
getLog().append("Calling convention " + Procedure.CallingConvention.STACK_CALL + " adding prepare/execute/finalize for " + call.toString(getProgram(), false));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Convert param(xxx) to stackidx(PARAM_X) = xxx
|
||||
if(offsetConstants.size() > 0) {
|
||||
ProgramValueIterator.execute(getGraph(), (programValue, currentStmt, stmtIt, currentBlock) -> {
|
||||
@@ -206,7 +171,7 @@ public class Pass1CallStack extends Pass2SsaOptimization {
|
||||
* @param stackReturnOffset The offset onto the stack to place the value at
|
||||
* @param source The source line
|
||||
* @param comments The comments
|
||||
* @param stmtIt The statment iterator used to add statements to.
|
||||
* @param stmtIt The statement iterator used to add statements to.
|
||||
*/
|
||||
private void generateStackReturnValues(RValue value, SymbolType returnType, ConstantValue stackReturnOffset, StatementSource source, List<Comment> comments, ListIterator<Statement> stmtIt) {
|
||||
if(!(value instanceof ValueList) || !(returnType instanceof SymbolTypeStruct)) {
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
package dk.camelot64.kickc.passes;
|
||||
|
||||
import dk.camelot64.kickc.model.Comment;
|
||||
import dk.camelot64.kickc.model.ControlFlowBlock;
|
||||
import dk.camelot64.kickc.model.Program;
|
||||
import dk.camelot64.kickc.model.statements.*;
|
||||
import dk.camelot64.kickc.model.symbols.Procedure;
|
||||
import dk.camelot64.kickc.model.types.SymbolType;
|
||||
import dk.camelot64.kickc.model.values.ProcedureRef;
|
||||
|
||||
import java.util.ListIterator;
|
||||
|
||||
/** Handle calling conventions {@link Procedure.CallingConvention#STACK_CALL} {@link Procedure.CallingConvention#VAR_CALL} by converting to call-prepare, call-execute, call-finalize */
|
||||
public class Pass1CallStackVarConvert extends Pass2SsaOptimization {
|
||||
|
||||
public Pass1CallStackVarConvert(Program program) {
|
||||
super(program);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean step() {
|
||||
|
||||
// Transform STACK_CALL/VAR_CALL calls to call-prepare, call-execute, call-finalize
|
||||
for(ControlFlowBlock block : getGraph().getAllBlocks()) {
|
||||
ListIterator<Statement> stmtIt = block.getStatements().listIterator();
|
||||
while(stmtIt.hasNext()) {
|
||||
Statement statement = stmtIt.next();
|
||||
if(statement instanceof StatementCall) {
|
||||
StatementCall call = (StatementCall) statement;
|
||||
ProcedureRef procedureRef = call.getProcedure();
|
||||
Procedure procedure = getScope().getProcedure(procedureRef);
|
||||
if(Procedure.CallingConvention.STACK_CALL.equals(procedure.getCallingConvention()) || Procedure.CallingConvention.VAR_CALL.equals(procedure.getCallingConvention())) {
|
||||
boolean hasPrepare = (call.getParameters().size() > 0) || !SymbolType.VOID.equals(procedure.getReturnType());
|
||||
stmtIt.remove();
|
||||
stmtIt.add(new StatementCallPrepare(procedureRef, call.getParameters(), call.getSource(), hasPrepare?call.getComments():Comment.NO_COMMENTS));
|
||||
stmtIt.add(new StatementCallExecute(procedureRef, call.getSource(), hasPrepare?Comment.NO_COMMENTS:call.getComments()));
|
||||
stmtIt.add(new StatementCallFinalize(call.getlValue(), procedureRef, call.getSource(), Comment.NO_COMMENTS));
|
||||
getLog().append("Calling convention " + procedure.getCallingConvention().getName() + " adding prepare/execute/finalize for " + call.toString(getProgram(), false));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package dk.camelot64.kickc.passes;
|
||||
|
||||
import dk.camelot64.kickc.model.Program;
|
||||
import dk.camelot64.kickc.model.symbols.Procedure;
|
||||
import dk.camelot64.kickc.model.symbols.Variable;
|
||||
import dk.camelot64.kickc.model.types.SymbolType;
|
||||
import dk.camelot64.kickc.model.values.VariableRef;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/** Handle calling conventions {@link Procedure.CallingConvention#STACK_CALL} {@link Procedure.CallingConvention#VAR_CALL} by converting to call-prepare, call-execute, call-finalize */
|
||||
public class Pass1CallStackVarPrepare extends Pass2SsaOptimization {
|
||||
|
||||
public Pass1CallStackVarPrepare(Program program) {
|
||||
super(program);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean step() {
|
||||
|
||||
// Set variables modified in STACK_CALL/VAR_CALL procedures to load/store
|
||||
for(Procedure procedure : getScope().getAllProcedures(true)) {
|
||||
if(Procedure.CallingConvention.STACK_CALL.equals(procedure.getCallingConvention()) || Procedure.CallingConvention.VAR_CALL.equals(procedure.getCallingConvention())) {
|
||||
Set<VariableRef> modifiedVars = getProgram().getProcedureModifiedVars().getModifiedVars(procedure.getRef());
|
||||
for(VariableRef modifiedVar : modifiedVars) {
|
||||
final Variable variable = getScope().getVariable(modifiedVar);
|
||||
if(variable.isKindPhiMaster()) {
|
||||
getLog().append("Converting variable modified inside "+procedure.getCallingConvention().getName()+" procedure "+procedure.getFullName()+"() to load/store "+variable.toString(getProgram()));
|
||||
variable.setKind(Variable.Kind.LOAD_STORE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Set all parameter/return variables in VAR_CALL procedures to LOAD/STORE
|
||||
for(Procedure procedure : getScope().getAllProcedures(true)) {
|
||||
if(Procedure.CallingConvention.VAR_CALL.equals(procedure.getCallingConvention())) {
|
||||
for(Variable parameter : procedure.getParameters()) {
|
||||
parameter.setKind(Variable.Kind.LOAD_STORE);
|
||||
getLog().append("Converting parameter in "+procedure.getCallingConvention().getName()+" procedure to load/store "+parameter.toString(getProgram()));
|
||||
}
|
||||
if(!SymbolType.VOID.equals(procedure.getReturnType())) {
|
||||
Variable returnVar = procedure.getLocalVariable("return");
|
||||
returnVar.setKind(Variable.Kind.LOAD_STORE);
|
||||
getLog().append("Converting return in "+procedure.getCallingConvention().getName()+" procedure to load/store "+returnVar.toString(getProgram()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
package dk.camelot64.kickc.passes;
|
||||
|
||||
import dk.camelot64.kickc.model.Comment;
|
||||
import dk.camelot64.kickc.model.ControlFlowBlock;
|
||||
import dk.camelot64.kickc.model.Program;
|
||||
import dk.camelot64.kickc.model.statements.*;
|
||||
import dk.camelot64.kickc.model.symbols.Procedure;
|
||||
import dk.camelot64.kickc.model.symbols.Scope;
|
||||
import dk.camelot64.kickc.model.symbols.Variable;
|
||||
import dk.camelot64.kickc.model.types.SymbolType;
|
||||
import dk.camelot64.kickc.model.types.SymbolTypeStruct;
|
||||
import dk.camelot64.kickc.model.values.CastValue;
|
||||
import dk.camelot64.kickc.model.values.LValue;
|
||||
import dk.camelot64.kickc.model.values.RValue;
|
||||
import dk.camelot64.kickc.model.values.ValueList;
|
||||
import dk.camelot64.kickc.passes.unwinding.ValueSource;
|
||||
import dk.camelot64.kickc.passes.unwinding.ValueSourceFactory;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
|
||||
/** Handle calling convention {@link Procedure.CallingConvention#VAR_CALL } by converting the making control flow graph and symbols calling convention specific. */
|
||||
public class Pass1CallVar extends Pass2SsaOptimization {
|
||||
|
||||
public Pass1CallVar(Program program) {
|
||||
super(program);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean step() {
|
||||
|
||||
// Convert procedure return xxx to proc.return = xxx;
|
||||
for(ControlFlowBlock block : getGraph().getAllBlocks()) {
|
||||
ListIterator<Statement> stmtIt = block.getStatements().listIterator();
|
||||
while(stmtIt.hasNext()) {
|
||||
Statement statement = stmtIt.next();
|
||||
if(statement instanceof StatementReturn) {
|
||||
final Scope blockScope = getScope().getScope(block.getScope());
|
||||
if(blockScope instanceof Procedure) {
|
||||
Procedure procedure = (Procedure) blockScope;
|
||||
final SymbolType returnType = procedure.getReturnType();
|
||||
if(!SymbolType.VOID.equals(returnType) && Procedure.CallingConvention.VAR_CALL.equals(procedure.getCallingConvention())) {
|
||||
final RValue value = ((StatementReturn) statement).getValue();
|
||||
((StatementReturn) statement).setValue(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Convert xxx = callfinalize to xxx = proc.return
|
||||
for(ControlFlowBlock block : getGraph().getAllBlocks()) {
|
||||
ListIterator<Statement> stmtIt = block.getStatements().listIterator();
|
||||
while(stmtIt.hasNext()) {
|
||||
Statement statement = stmtIt.next();
|
||||
if(statement instanceof StatementCallFinalize) {
|
||||
final StatementCallFinalize call = (StatementCallFinalize) statement;
|
||||
Procedure procedure = getScope().getProcedure(call.getProcedure());
|
||||
final SymbolType returnType = procedure.getReturnType();
|
||||
if(Procedure.CallingConvention.VAR_CALL.equals(procedure.getCallingConvention())) {
|
||||
final StatementSource source = call.getSource();
|
||||
final List<Comment> comments = call.getComments();
|
||||
final LValue lValue = call.getlValue();
|
||||
if(lValue!=null) {
|
||||
Variable returnVar = procedure.getLocalVariable("return");
|
||||
stmtIt.previous();
|
||||
generateCallFinalize(lValue, returnVar, source, comments, stmtIt, statement);
|
||||
stmtIt.next();
|
||||
}
|
||||
stmtIt.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Convert callprepare(xxx,yyy,) to proc.param = xxx, ...;
|
||||
for(ControlFlowBlock block : getGraph().getAllBlocks()) {
|
||||
ListIterator<Statement> stmtIt = block.getStatements().listIterator();
|
||||
while(stmtIt.hasNext()) {
|
||||
Statement statement = stmtIt.next();
|
||||
if(statement instanceof StatementCallPrepare) {
|
||||
final StatementCallPrepare call = (StatementCallPrepare) statement;
|
||||
Procedure procedure = getScope().getProcedure(call.getProcedure());
|
||||
if(Procedure.CallingConvention.VAR_CALL.equals(procedure.getCallingConvention())) {
|
||||
stmtIt.previous();
|
||||
final StatementSource source = call.getSource();
|
||||
List<Comment> comments = call.getComments();
|
||||
final List<Variable> parameterDefs = procedure.getParameters();
|
||||
for(int i = 0; i < parameterDefs.size(); i++) {
|
||||
final RValue parameterVal = call.getParameters().get(i);
|
||||
final Variable parameterDef = parameterDefs.get(i);
|
||||
stmtIt.add(new StatementAssignment(parameterDef.getVariableRef(), parameterVal, false, source, comments));
|
||||
comments = Comment.NO_COMMENTS;
|
||||
}
|
||||
stmtIt.next();
|
||||
stmtIt.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void generateCallFinalize(LValue lValue, Variable returnVar, StatementSource source, List<Comment> comments, ListIterator<Statement> stmtIt, Statement currentStmt) {
|
||||
final SymbolType returnType = returnVar.getType();
|
||||
if(!(lValue instanceof ValueList) || !(returnType instanceof SymbolTypeStruct)) {
|
||||
// A simple value - add simple assignment
|
||||
final StatementAssignment stackPull = new StatementAssignment(lValue, returnVar.getRef(), false, source, comments);
|
||||
stmtIt.add(stackPull);
|
||||
getLog().append("Calling convention " + Procedure.CallingConvention.VAR_CALL + " adding return value assignment " + stackPull);
|
||||
} else {
|
||||
final CastValue structLValue = new CastValue(returnType, lValue);
|
||||
// A struct to unwind
|
||||
final ValueSource lValueSource = ValueSourceFactory.getValueSource(structLValue, getProgram(), getScope(), currentStmt, stmtIt, null);
|
||||
final ValueSource rValueSource = ValueSourceFactory.getValueSource(returnVar.getRef(), getProgram(), getScope(), currentStmt, stmtIt, null);
|
||||
Pass1UnwindStructValues.copyValues(lValueSource, rValueSource, null, false, currentStmt, null, stmtIt, getProgram());
|
||||
|
||||
|
||||
/*
|
||||
final List<RValue> memberLValues = ((ValueList) lValue).getList();
|
||||
final StructVariableMemberUnwinding structVariableMemberUnwinding = getProgram().getStructVariableMemberUnwinding();
|
||||
final StructVariableMemberUnwinding.VariableUnwinding returnVarUnwinding = structVariableMemberUnwinding.getVariableUnwinding(returnVar.getRef());
|
||||
for(RValue memberLValue : memberLValues) {
|
||||
|
||||
}
|
||||
for(int i = 0; i < structMemberVars.size(); i++) {
|
||||
final Variable memberVar = structMemberVars.get(i);
|
||||
final RValue memberValue = memberLValues.get(i);
|
||||
generateCallFinalize(memberValue, memberVar.getType(), source, comments, stmtIt);
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+2
-2
@@ -20,9 +20,9 @@ import java.util.List;
|
||||
* - Constantify all assignment RValues that are structs
|
||||
* - Add casts to struct parameter values in calls
|
||||
*/
|
||||
public class Pass1PrepareUnwindStruct extends Pass2SsaOptimization {
|
||||
public class Pass1UnwindStructPrepare extends Pass2SsaOptimization {
|
||||
|
||||
public Pass1PrepareUnwindStruct(Program program) {
|
||||
public Pass1UnwindStructPrepare(Program program) {
|
||||
super(program);
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ public class Pass1UnwindStructValues extends Pass1Base {
|
||||
while(stmtIt.hasNext()) {
|
||||
Statement statement = stmtIt.next();
|
||||
if(statement instanceof StatementAssignment) {
|
||||
modified |= unwindAssignment((StatementAssignment) statement, stmtIt, block);
|
||||
modified |= unwindAssignment((StatementAssignment) statement, stmtIt, block, getProgram());
|
||||
} else if(statement instanceof StatementCall) {
|
||||
modified |= unwindCall((StatementCall) statement, stmtIt, block);
|
||||
} else if(statement instanceof StatementReturn) {
|
||||
@@ -90,35 +90,58 @@ public class Pass1UnwindStructValues extends Pass1Base {
|
||||
* @param call The call to unwind
|
||||
*/
|
||||
private boolean unwindCall(StatementCall call, ListIterator<Statement> stmtIt, ControlFlowBlock currentBlock) {
|
||||
final Procedure procedure = getScope().getProcedure(call.getProcedure());
|
||||
|
||||
// Unwind struct value return value
|
||||
|
||||
boolean lvalUnwound = false;
|
||||
final ValueSource valueSource = ValueSourceFactory.getValueSource(call.getlValue(), getProgram(), getScope(), call, stmtIt, currentBlock);
|
||||
RValue unwoundLValue = unwindValue(valueSource, call, stmtIt, currentBlock);
|
||||
if(unwoundLValue != null && !call.getlValue().equals(unwoundLValue)) {
|
||||
call.setlValue((LValue) unwoundLValue);
|
||||
if(getLog().isVerboseStructUnwind())
|
||||
getLog().append("Converted procedure call LValue to member unwinding " + call.toString(getProgram(), false));
|
||||
lvalUnwound = true;
|
||||
Variable procReturnVar = procedure.getLocalVariable("return");
|
||||
// TODO: Return-variable has been unwound - detect that instead - use getProgram().getStructVariableMemberUnwinding().getUnwindingMaster() like for parameters
|
||||
if(procReturnVar != null && procReturnVar.isStructUnwind()) {
|
||||
if(!(call.getlValue() instanceof ValueList)) {
|
||||
// Return value already unwound - move on
|
||||
final ValueSource valueSource = ValueSourceFactory.getValueSource(call.getlValue(), getProgram(), getScope(), call, stmtIt, currentBlock);
|
||||
RValue unwoundLValue = unwindValue(valueSource, call, stmtIt, currentBlock);
|
||||
if(call.getlValue().equals(unwoundLValue))
|
||||
throw new CompileError("Call return value already unwound", call);
|
||||
if(unwoundLValue == null)
|
||||
throw new CompileError("Cannot unwind call return value", call);
|
||||
call.setlValue((LValue) unwoundLValue);
|
||||
if(getLog().isVerboseStructUnwind())
|
||||
getLog().append("Converted procedure call LValue to member unwinding " + call.toString(getProgram(), false));
|
||||
lvalUnwound = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Unwind any struct value parameters
|
||||
ArrayList<RValue> unwoundParameters = new ArrayList<>();
|
||||
boolean anyParameterUnwound = false;
|
||||
for(RValue parameter : call.getParameters()) {
|
||||
final List<Variable> procParameters = procedure.getParameters();
|
||||
final List<RValue> callParameters = call.getParameters();
|
||||
for(int idx_call = 0, idx_proc = 0; idx_call < callParameters.size(); idx_call++) {
|
||||
final RValue callParameter = callParameters.get(idx_call);
|
||||
final Variable procParameter = procParameters.get(idx_proc);
|
||||
boolean unwound = false;
|
||||
final ValueSource parameterSource = ValueSourceFactory.getValueSource(parameter, getProgram(), getScope(), call, stmtIt, currentBlock);
|
||||
if(parameterSource != null && parameterSource.isUnwindable()) {
|
||||
// Passing a struct variable - convert it to member variables
|
||||
for(String memberName : parameterSource.getMemberNames(getScope())) {
|
||||
ValueSource memberUnwinding = parameterSource.getMemberUnwinding(memberName, getProgram(), getScope(), call, stmtIt, currentBlock);
|
||||
unwoundParameters.add(memberUnwinding.getSimpleValue(getScope()));
|
||||
}
|
||||
unwound = true;
|
||||
anyParameterUnwound = true;
|
||||
final SymbolVariableRef unwindingMaster = getProgram().getStructVariableMemberUnwinding().getUnwindingMaster(procParameter.getRef());
|
||||
if(unwindingMaster != null) {
|
||||
// The procedure parameter is unwound
|
||||
final ValueSource parameterSource = ValueSourceFactory.getValueSource(callParameter, getProgram(), getScope(), call, stmtIt, currentBlock);
|
||||
if(parameterSource != null && parameterSource.isUnwindable())
|
||||
// Passing an unwinding struct value
|
||||
for(String memberName : parameterSource.getMemberNames(getScope())) {
|
||||
ValueSource memberUnwinding = parameterSource.getMemberUnwinding(memberName, getProgram(), getScope(), call, stmtIt, currentBlock);
|
||||
unwoundParameters.add(memberUnwinding.getSimpleValue(getScope()));
|
||||
unwound = true;
|
||||
anyParameterUnwound = true;
|
||||
idx_proc++;
|
||||
}
|
||||
else
|
||||
idx_proc++;
|
||||
} else {
|
||||
idx_proc++;
|
||||
}
|
||||
|
||||
if(!unwound) {
|
||||
unwoundParameters.add(parameter);
|
||||
unwoundParameters.add(callParameter);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -131,7 +154,7 @@ public class Pass1UnwindStructValues extends Pass1Base {
|
||||
}
|
||||
|
||||
/**
|
||||
* Unwind an LVa.lue to a ValueList if it is unwindable.
|
||||
* Unwind an LValue to a ValueList if it is unwindable.
|
||||
*
|
||||
* @param value The value to unwind
|
||||
* @param statement The current statement
|
||||
@@ -185,7 +208,7 @@ public class Pass1UnwindStructValues extends Pass1Base {
|
||||
ArrayList<String> unwoundParameterNames = new ArrayList<>();
|
||||
boolean procedureUnwound = false;
|
||||
for(Variable parameter : procedure.getParameters()) {
|
||||
if(parameter.getType() instanceof SymbolTypeStruct) {
|
||||
if(parameter.isStructUnwind()) {
|
||||
StructVariableMemberUnwinding structVariableMemberUnwinding = getProgram().getStructVariableMemberUnwinding();
|
||||
StructVariableMemberUnwinding.VariableUnwinding parameterUnwinding = structVariableMemberUnwinding.getVariableUnwinding(parameter.getRef());
|
||||
for(String memberName : parameterUnwinding.getMemberNames()) {
|
||||
@@ -214,9 +237,9 @@ public class Pass1UnwindStructValues extends Pass1Base {
|
||||
* @param stmtIt The statement iterator used for adding/removing statements
|
||||
* @param currentBlock The current code block
|
||||
*/
|
||||
private boolean unwindAssignment(StatementAssignment assignment, ListIterator<Statement> stmtIt, ControlFlowBlock currentBlock) {
|
||||
public static boolean unwindAssignment(StatementAssignment assignment, ListIterator<Statement> stmtIt, ControlFlowBlock currentBlock, Program program) {
|
||||
LValue lValue = assignment.getlValue();
|
||||
SymbolType lValueType = SymbolTypeInference.inferType(getScope(), lValue);
|
||||
SymbolType lValueType = SymbolTypeInference.inferType(program.getScope(), lValue);
|
||||
|
||||
if(lValueType instanceof SymbolTypeStruct && assignment.getOperator() == null) {
|
||||
|
||||
@@ -230,10 +253,10 @@ public class Pass1UnwindStructValues extends Pass1Base {
|
||||
if(rValue instanceof MemcpyValue || rValue instanceof MemsetValue || rValue instanceof StructUnwoundPlaceholder)
|
||||
return false;
|
||||
|
||||
ValueSource lValueSource = ValueSourceFactory.getValueSource(lValue, getProgram(), getScope(), assignment, stmtIt, currentBlock);
|
||||
ValueSource rValueSource = ValueSourceFactory.getValueSource(rValue, getProgram(), getScope(), assignment, stmtIt, currentBlock);
|
||||
ValueSource lValueSource = ValueSourceFactory.getValueSource(lValue, program, program.getScope(), assignment, stmtIt, currentBlock);
|
||||
ValueSource rValueSource = ValueSourceFactory.getValueSource(rValue, program, program.getScope(), assignment, stmtIt, currentBlock);
|
||||
List<RValue> lValueUnwoundList = new ArrayList<>();
|
||||
if(copyValues(lValueSource, rValueSource, lValueUnwoundList, initialAssignment, assignment, currentBlock, stmtIt)) {
|
||||
if(copyValues(lValueSource, rValueSource, lValueUnwoundList, initialAssignment, assignment, currentBlock, stmtIt, program)) {
|
||||
if(lValue instanceof VariableRef) {
|
||||
StructUnwoundPlaceholder unwoundPlaceholder = new StructUnwoundPlaceholder(lValueStructType, lValueUnwoundList);
|
||||
assignment.setrValue2(unwoundPlaceholder);
|
||||
@@ -246,20 +269,20 @@ public class Pass1UnwindStructValues extends Pass1Base {
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean copyValues(ValueSource lValueSource, ValueSource rValueSource, List<RValue> lValueUnwoundList, boolean initialAssignment, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) {
|
||||
public static boolean copyValues(ValueSource lValueSource, ValueSource rValueSource, List<RValue> lValueUnwoundList, boolean initialAssignment, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt, Program program) {
|
||||
if(lValueSource == null || rValueSource == null)
|
||||
return false;
|
||||
if(lValueSource.isSimple() && rValueSource.isSimple()) {
|
||||
stmtIt.previous();
|
||||
LValue lValueRef = (LValue) lValueSource.getSimpleValue(getScope());
|
||||
RValue rValueRef = rValueSource.getSimpleValue(getScope());
|
||||
LValue lValueRef = (LValue) lValueSource.getSimpleValue(program.getScope());
|
||||
RValue rValueRef = rValueSource.getSimpleValue(program.getScope());
|
||||
if(lValueUnwoundList != null)
|
||||
lValueUnwoundList.add(lValueRef);
|
||||
Statement copyStmt = new StatementAssignment(lValueRef, rValueRef, initialAssignment, currentStmt.getSource(), Comment.NO_COMMENTS);
|
||||
stmtIt.add(copyStmt);
|
||||
stmtIt.next();
|
||||
if(getLog().isVerboseStructUnwind())
|
||||
getLog().append("Adding value simple copy " + copyStmt.toString(getProgram(), false));
|
||||
if(program.getLog().isVerboseStructUnwind())
|
||||
program.getLog().append("Adding value simple copy " + copyStmt.toString(program, false));
|
||||
return true;
|
||||
} else if(lValueSource.isBulkCopyable() && rValueSource.isBulkCopyable()) {
|
||||
// Use bulk unwinding for a struct member that is an array
|
||||
@@ -267,23 +290,23 @@ public class Pass1UnwindStructValues extends Pass1Base {
|
||||
if(lValueSource.getArraySpec() != null)
|
||||
if(rValueSource.getArraySpec() == null || !lValueSource.getArraySpec().equals(rValueSource.getArraySpec()))
|
||||
throw new RuntimeException("ArraySpec mismatch!");
|
||||
LValue lValueMemberVarRef = lValueSource.getBulkLValue(getScope());
|
||||
RValue rValueBulkUnwinding = rValueSource.getBulkRValue(getScope());
|
||||
LValue lValueMemberVarRef = lValueSource.getBulkLValue(program.getScope());
|
||||
RValue rValueBulkUnwinding = rValueSource.getBulkRValue(program.getScope());
|
||||
if(lValueUnwoundList != null)
|
||||
lValueUnwoundList.add(lValueMemberVarRef);
|
||||
Statement copyStmt = new StatementAssignment(lValueMemberVarRef, rValueBulkUnwinding, initialAssignment, currentStmt.getSource(), Comment.NO_COMMENTS);
|
||||
stmtIt.add(copyStmt);
|
||||
stmtIt.next();
|
||||
if(getLog().isVerboseStructUnwind())
|
||||
getLog().append("Adding value bulk copy " + copyStmt.toString(getProgram(), false));
|
||||
if(program.getLog().isVerboseStructUnwind())
|
||||
program.getLog().append("Adding value bulk copy " + copyStmt.toString(program, false));
|
||||
return true;
|
||||
} else if(lValueSource.isUnwindable() && rValueSource.isUnwindable()) {
|
||||
if(getLog().isVerboseStructUnwind())
|
||||
getLog().append("Unwinding value copy " + currentStmt.toString(getProgram(), false));
|
||||
for(String memberName : lValueSource.getMemberNames(getScope())) {
|
||||
ValueSource lValueSubSource = lValueSource.getMemberUnwinding(memberName, getProgram(), getScope(), currentStmt, stmtIt, currentBlock);
|
||||
ValueSource rValueSubSource = rValueSource.getMemberUnwinding(memberName, getProgram(), getScope(), currentStmt, stmtIt, currentBlock);
|
||||
boolean success = copyValues(lValueSubSource, rValueSubSource, lValueUnwoundList, initialAssignment, currentStmt, currentBlock, stmtIt);
|
||||
if(program.getLog().isVerboseStructUnwind())
|
||||
program.getLog().append("Unwinding value copy " + currentStmt.toString(program, false));
|
||||
for(String memberName : lValueSource.getMemberNames(program.getScope())) {
|
||||
ValueSource lValueSubSource = lValueSource.getMemberUnwinding(memberName, program, program.getScope(), currentStmt, stmtIt, currentBlock);
|
||||
ValueSource rValueSubSource = rValueSource.getMemberUnwinding(memberName, program, program.getScope(), currentStmt, stmtIt, currentBlock);
|
||||
boolean success = copyValues(lValueSubSource, rValueSubSource, lValueUnwoundList, initialAssignment, currentStmt, currentBlock, stmtIt, program);
|
||||
if(!success)
|
||||
throw new InternalError("Error during value unwinding copy! ", currentStmt);
|
||||
}
|
||||
|
||||
@@ -28,11 +28,11 @@ public class PassNUnwindLValueLists extends Pass2SsaOptimization {
|
||||
Statement statement = stmtIt.next();
|
||||
if(statement instanceof StatementAssignment) {
|
||||
StatementAssignment assignment = (StatementAssignment) statement;
|
||||
if(assignment.getlValue() instanceof ValueList && assignment.getOperator()==null && assignment.getrValue2() instanceof ValueList) {
|
||||
if(assignment.getlValue() instanceof ValueList && assignment.getOperator() == null && assignment.getrValue2() instanceof ValueList) {
|
||||
// Value-list to value list copy - unwind it
|
||||
ValueList lValueList = (ValueList) assignment.getlValue();
|
||||
ValueList rValueList = (ValueList) assignment.getrValue2();
|
||||
if(lValueList.getList().size()!=rValueList.getList().size()) {
|
||||
if(lValueList.getList().size() != rValueList.getList().size()) {
|
||||
throw new CompileError("Assignment value lists have different sizes ", statement);
|
||||
}
|
||||
stmtIt.remove();
|
||||
@@ -41,7 +41,7 @@ public class PassNUnwindLValueLists extends Pass2SsaOptimization {
|
||||
RValue rValue = (RValue) rValueList.getList().get(i);
|
||||
stmtIt.add(new StatementAssignment(lValue, rValue, assignment.isInitialAssignment(), assignment.getSource(), Comment.NO_COMMENTS));
|
||||
}
|
||||
getLog().append("Unwinding list assignment "+assignment.toString(getProgram(), false));
|
||||
getLog().append("Unwinding list assignment " + assignment.toString(getProgram(), false));
|
||||
modified = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,12 +42,75 @@ public class TestPrograms {
|
||||
public TestPrograms() {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAdventOfCode04() throws IOException, URISyntaxException {
|
||||
compileAndCompare("adventofcode/2020-04.c");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAdventOfCode03() throws IOException, URISyntaxException {
|
||||
compileAndCompare("adventofcode/2020-03.c");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAdventOfCode02() throws IOException, URISyntaxException {
|
||||
compileAndCompare("adventofcode/2020-02.c");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAdventOfCode01() throws IOException, URISyntaxException {
|
||||
compileAndCompare("adventofcode/2020-01.c");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMissingBand() throws IOException, URISyntaxException {
|
||||
compileAndCompare("missing-band.c");
|
||||
}
|
||||
|
||||
|
||||
// https://gitlab.com/camelot/kickc/-/issues/564
|
||||
//@Test
|
||||
//public void testUnknownVarProblem() throws IOException, URISyntaxException {
|
||||
// compileAndCompare("unknown-var-problem.c", log().verboseParse());
|
||||
//}
|
||||
|
||||
// TODO: Fix functions returning __ma/__ssa structs
|
||||
//@Test
|
||||
//public void testStructUnwinding3() throws IOException, URISyntaxException {
|
||||
// compileAndCompare("struct-unwinding-3.c", log().verboseCreateSsa().verboseCreateSsa());
|
||||
//}
|
||||
|
||||
@Test
|
||||
public void testStructUnwinding2() throws IOException, URISyntaxException {
|
||||
compileAndCompare("struct-unwinding-2.c");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStructUnwinding1() throws IOException, URISyntaxException {
|
||||
compileAndCompare("struct-unwinding-1.c");
|
||||
}
|
||||
|
||||
// TODO: Fix __varcall returning structs
|
||||
//@Test
|
||||
//public void testVarCall4() throws IOException, URISyntaxException {
|
||||
// compileAndCompare("varcall-4.c", log().verboseStructUnwind().verboseCreateSsa());
|
||||
//}
|
||||
|
||||
@Test
|
||||
public void testVarCall3() throws IOException, URISyntaxException {
|
||||
compileAndCompare("varcall-3.c");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testVarCall2() throws IOException, URISyntaxException {
|
||||
compileAndCompare("varcall-2.c");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testVarCall1() throws IOException, URISyntaxException {
|
||||
compileAndCompare("varcall-1.c");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testConstVolatileProblem1() throws IOException, URISyntaxException {
|
||||
compileAndCompare("const-volatile-problem.c");
|
||||
|
||||
@@ -0,0 +1,246 @@
|
||||
// https://adventofcode.com/2020/day/1/input
|
||||
// Find 2 entries that give 2020 when added together
|
||||
// And 3 entries that give 2020 when added together
|
||||
|
||||
#pragma target(atarixl)
|
||||
|
||||
#include <stdio.h>
|
||||
#include <conio.h>
|
||||
#include <multiply.h>
|
||||
|
||||
extern unsigned int entries[];
|
||||
|
||||
void main() {
|
||||
unsigned int num_entries = sizeof(entries)/sizeof(unsigned int);
|
||||
clrscr();
|
||||
printf("looking a+b=2020 within %u entries\n",num_entries);
|
||||
for(unsigned int i=0;i<num_entries;i++) {
|
||||
for(unsigned int j=i+1;j<num_entries;j++) {
|
||||
if(entries[i]+entries[j]==2020) {
|
||||
printf("\n");
|
||||
printf("match found [%u]%u+[%u]%u=2020\n", i,entries[i], j,entries[j]);
|
||||
unsigned long mul = mul16u(entries[i],entries[j]);
|
||||
printf("multiplied %lu\n", mul);
|
||||
}
|
||||
}
|
||||
printf(".");
|
||||
}
|
||||
printf("\nlooking a+b+c=2020 within %u entries\n",num_entries);
|
||||
for(unsigned int i=0;i<num_entries;i++) {
|
||||
for(unsigned int j=i+1;j<num_entries;j++) {
|
||||
for(unsigned int k=j+1;k<num_entries;k++) {
|
||||
if(entries[i]+entries[j]+entries[k]==2020) {
|
||||
printf("\n");
|
||||
printf("match found [%u]%u+[%u]%u+[%u]%u=2020\n", i,entries[i], j,entries[j], k,entries[k]);
|
||||
unsigned long mul1 = mul16u(entries[i],entries[k]); // I am cheating a bit here multiplying entry i&k first
|
||||
unsigned long mul2 = mul16u( <mul1 ,entries[j] ); // Because I knwo the product of those fit in an unsigned int
|
||||
printf("multiplied %lu\n", mul2);
|
||||
}
|
||||
}
|
||||
}
|
||||
printf(".");
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int entries[] = {
|
||||
1935,
|
||||
1956,
|
||||
1991,
|
||||
1425,
|
||||
1671,
|
||||
1537,
|
||||
1984,
|
||||
1569,
|
||||
1873,
|
||||
1840,
|
||||
1720,
|
||||
1937,
|
||||
1823,
|
||||
1625,
|
||||
1727,
|
||||
1812,
|
||||
1714,
|
||||
1900,
|
||||
1939,
|
||||
1931,
|
||||
1951,
|
||||
1756,
|
||||
1942,
|
||||
1611,
|
||||
1979,
|
||||
1930,
|
||||
1996,
|
||||
2000,
|
||||
1544,
|
||||
1780,
|
||||
1687,
|
||||
1760,
|
||||
1836,
|
||||
1814,
|
||||
1691,
|
||||
1817,
|
||||
1964,
|
||||
1899,
|
||||
1577,
|
||||
1547,
|
||||
866,
|
||||
1560,
|
||||
1988,
|
||||
1601,
|
||||
1970,
|
||||
1738,
|
||||
1507,
|
||||
1667,
|
||||
1851,
|
||||
1933,
|
||||
1515,
|
||||
1856,
|
||||
1969,
|
||||
1860,
|
||||
1801,
|
||||
2007,
|
||||
1866,
|
||||
1800,
|
||||
1749,
|
||||
1843,
|
||||
1711,
|
||||
1495,
|
||||
1905,
|
||||
763,
|
||||
1672,
|
||||
1858,
|
||||
1987,
|
||||
1492,
|
||||
1849,
|
||||
1993,
|
||||
1737,
|
||||
1874,
|
||||
1658,
|
||||
1810,
|
||||
1665,
|
||||
1768,
|
||||
1950,
|
||||
1879,
|
||||
1816,
|
||||
1868,
|
||||
1995,
|
||||
1763,
|
||||
1783,
|
||||
1833,
|
||||
1968,
|
||||
1847,
|
||||
1748,
|
||||
1725,
|
||||
1891,
|
||||
1755,
|
||||
286,
|
||||
1976,
|
||||
1977,
|
||||
1655,
|
||||
1808,
|
||||
1986,
|
||||
1779,
|
||||
1861,
|
||||
1953,
|
||||
1888,
|
||||
1792,
|
||||
1811,
|
||||
1872,
|
||||
1790,
|
||||
1839,
|
||||
1985,
|
||||
1827,
|
||||
1842,
|
||||
1925,
|
||||
1735,
|
||||
1635,
|
||||
1821,
|
||||
1820,
|
||||
1973,
|
||||
1531,
|
||||
1770,
|
||||
59,
|
||||
1846,
|
||||
1932,
|
||||
1907,
|
||||
1730,
|
||||
933,
|
||||
1395,
|
||||
1753,
|
||||
1751,
|
||||
361,
|
||||
1530,
|
||||
1782,
|
||||
1087,
|
||||
1589,
|
||||
1929,
|
||||
1795,
|
||||
1815,
|
||||
1732,
|
||||
1765,
|
||||
1877,
|
||||
1722,
|
||||
526,
|
||||
1709,
|
||||
1789,
|
||||
1892,
|
||||
1913,
|
||||
1662,
|
||||
1809,
|
||||
1670,
|
||||
1947,
|
||||
1835,
|
||||
1587,
|
||||
1758,
|
||||
1982,
|
||||
2009,
|
||||
1757,
|
||||
670,
|
||||
1983,
|
||||
1524,
|
||||
1878,
|
||||
1796,
|
||||
1952,
|
||||
566,
|
||||
1922,
|
||||
1882,
|
||||
1870,
|
||||
1799,
|
||||
1731,
|
||||
1724,
|
||||
1805,
|
||||
2003,
|
||||
1596,
|
||||
1566,
|
||||
1853,
|
||||
1911,
|
||||
1857,
|
||||
1739,
|
||||
1744,
|
||||
1627,
|
||||
1729,
|
||||
1745,
|
||||
1845,
|
||||
1582,
|
||||
1884,
|
||||
1883,
|
||||
1941,
|
||||
1764,
|
||||
1685,
|
||||
1791,
|
||||
1837,
|
||||
1697,
|
||||
1742,
|
||||
1781,
|
||||
1948,
|
||||
1876,
|
||||
1989,
|
||||
1643,
|
||||
1871,
|
||||
1906,
|
||||
1726,
|
||||
1958,
|
||||
1502,
|
||||
1927,
|
||||
1946
|
||||
};
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,366 @@
|
||||
// https://adventofcode.com/2020/day/3
|
||||
|
||||
#pragma target(atarixl)
|
||||
|
||||
#include <stdio.h>
|
||||
#include <conio.h>
|
||||
|
||||
#define MAP_WIDTH 31
|
||||
#define MAP_HEIGHT 323
|
||||
|
||||
extern char *map;
|
||||
|
||||
void main () {
|
||||
clrscr();
|
||||
// Puzzle part 1
|
||||
printf("1: encountered %u trees\n",test_slope(3,1));
|
||||
|
||||
printf("2a: encountered %u trees\n",test_slope(1,1));
|
||||
printf("2b: encountered %u trees\n",test_slope(3,1));
|
||||
printf("2c: encountered %u trees\n",test_slope(5,1));
|
||||
printf("2d: encountered %u trees\n",test_slope(7,1));
|
||||
printf("2e: encountered %u trees\n",test_slope(1,2));
|
||||
|
||||
for(;;) ;
|
||||
}
|
||||
|
||||
// Count the number of trees on a specific slope
|
||||
unsigned int test_slope(char x_inc, char y_inc) {
|
||||
char x=0;
|
||||
unsigned int trees=0;
|
||||
char* mapline = map;
|
||||
for(unsigned int y=0; y<MAP_HEIGHT; y+=y_inc) {
|
||||
if(mapline[x]=='#')
|
||||
trees++;
|
||||
x += x_inc;
|
||||
if(x>=MAP_WIDTH) x -= MAP_WIDTH;
|
||||
mapline += y_inc*MAP_WIDTH;
|
||||
}
|
||||
return trees;
|
||||
}
|
||||
|
||||
char *map =
|
||||
".#......##..#.....#....#.#.#..."
|
||||
".#.#...#.##.#..........#...##.."
|
||||
".........#.....#.####........#."
|
||||
".......#.#...#.#..............."
|
||||
"..#....#...#.#...#.#...#.#....."
|
||||
"...#...........#..#.........#.#"
|
||||
"....#..#....#..#..#.#...#..##.."
|
||||
"#...........#..#.....#.......#."
|
||||
"#..#...#...#.###...#...#.#...#."
|
||||
"#...#.#.......#...#...#...##.##"
|
||||
"..#..................#.#.#....#"
|
||||
"..#.##....#........##.........."
|
||||
".....#....#....#.#.......#....."
|
||||
"##.#..##.#.....###.......#....."
|
||||
"......#...###....#..#.#...#...."
|
||||
"..............#.........#.##..."
|
||||
"#......#.............#....#...#"
|
||||
".#..#......#.###....#...#.....#"
|
||||
"..#........#.....#.....#...#..#"
|
||||
".......#...#..............#..#."
|
||||
"..#...#........#...##........#."
|
||||
".#........#....#......#......#."
|
||||
"....#..#.###.......##....#.#..#"
|
||||
"..#..###..#...................."
|
||||
"......#...#....#.........#.#..."
|
||||
"....#.##................#..#..."
|
||||
"....#......######.....#........"
|
||||
".#......##.......#....#..##.###"
|
||||
"..#...##.###..#.......#....#..."
|
||||
"....#.###...#.#.#........#....."
|
||||
"...###...#.......#..........#.#"
|
||||
"..........#...#..........##.#.."
|
||||
"..#....#........#.....#....#..#"
|
||||
"..#...#.#....##..#...##....#..."
|
||||
"........##...#..##.....#......."
|
||||
"###.......#.#...#...#.......#.#"
|
||||
"....#.#....##.###........#....."
|
||||
".....#..............#....##..##"
|
||||
"#......#.#....#.#......#.....##"
|
||||
".....#....#..#......#...#......"
|
||||
"..#.##..#.....#..#....#......#."
|
||||
".....#.#.#..........##....#...."
|
||||
".........#..#..........#.#....."
|
||||
".##..#...#......#.#..#....#...."
|
||||
"#.#..##.......#.#......##......"
|
||||
"..#.#....#.#.....#............."
|
||||
".#.........#.......#..#.#......"
|
||||
"##.........#..##.#......#......"
|
||||
"#..#.....#...#.....#.........#."
|
||||
"..........#..##..##.#..##...###"
|
||||
"..##.....#...#..##...##.#.#...."
|
||||
"..#..........#.#.....##.#....#."
|
||||
".##..#..#.........###.......#.."
|
||||
"......##....#...##....##......."
|
||||
".....#.#.##...............#...."
|
||||
"#..#......#.....#..#..#.#.....#"
|
||||
".....##.#....#.#.....#.#.#....."
|
||||
"....#..#.#..##....#.....#....#."
|
||||
"#...#.....#....#....#.#.#......"
|
||||
".....#................#.......#"
|
||||
".......#..#.#...#.#......#..#.#"
|
||||
"...........#....#....###...#.#."
|
||||
"#.##....##..###.#.#......#.##.#"
|
||||
"..##...#.#..#..#...#.....#.#.#."
|
||||
"#.....###.#..#.#...#.#......#.#"
|
||||
"..##.#...#...#.#.....#.#......."
|
||||
"#....#...#.##......#.#......#.."
|
||||
"..#.....##.....#..............."
|
||||
".....###...##.#...........#...."
|
||||
"...#..##.....##....#..........."
|
||||
".....#..#......#..........#...."
|
||||
"....##..##.#...#...#.#.....#.##"
|
||||
".#.....###..###.#...#.#..#....#"
|
||||
".#..........#...#..#.#.#..#...#"
|
||||
".##.##..#..#....#....####......"
|
||||
"....#..#.#..........#.........."
|
||||
"###...#.#..#..#...#..###......."
|
||||
"####.#...#....#..#...#..#......"
|
||||
".....##....#.#...#....##....##."
|
||||
"....#.#.##....#.##..#....#.#.#."
|
||||
"#......#..#.###....#####.##...."
|
||||
"..##..#.#.#..#........##.##..##"
|
||||
"#.#...#..#..#......#..#.....#.."
|
||||
".###.....#.#....#.#..##.....#.#"
|
||||
"....#......#.#...#...#.#....#.#"
|
||||
".....#.###.##.................."
|
||||
".#..........#........#.#...##.#"
|
||||
".##......#.#.#..#....##.###..#."
|
||||
"..#.##....#....#.........#.#..#"
|
||||
"........#..#..#.#.####.....##.."
|
||||
"#..#.##.#......#.#..##.#...#..#"
|
||||
"..#.#.##..#.##..........#......"
|
||||
"##.#.....#.#.##..#..##.....##.#"
|
||||
".##........#..#.....#...#.##.##"
|
||||
"...#....#.#.#.........##.....#."
|
||||
"...#....#.#....#...#..#........"
|
||||
".....#...#..#...#.##......##..."
|
||||
"##.........#......#..........##"
|
||||
".#......#.....##....#.#.#.....#"
|
||||
"..#.###......#..#.#....#.....#."
|
||||
".#.......#...#...#.#.#.#..##..."
|
||||
"...#..............#...###.....#"
|
||||
"...##......#.#..#.#........#.#."
|
||||
"..##.#....#..........##...#.#.."
|
||||
"..#...#.....#.######...##...#.."
|
||||
"#...#...#............#.....#..."
|
||||
".###..###.##..#.........#......"
|
||||
".#........##..#....#...#.#..##."
|
||||
"#.#.##.#.#...###..............."
|
||||
"..#.#.#......#.#.#....#.....#.#"
|
||||
".#...........#.##.#..#.###....."
|
||||
".###.#....#...........##.#.#..."
|
||||
".#...#...........#..##........."
|
||||
".#...#.#...........#..###....#."
|
||||
".##.......#.....#.....##....#.."
|
||||
"#.......#........#...##.##..#.#"
|
||||
"....#..###..#.....##.......#..."
|
||||
"......###.#...#..#....#.#...#.."
|
||||
"..#..#.......##...#.#.#...#...."
|
||||
"......#..#.......#.......##.#.."
|
||||
"#.#....###.....#...#..#...#...."
|
||||
"#...#.##.#........#..........##"
|
||||
".....#.#.##.#.#..#..##.......##"
|
||||
".#.#.......##....#.#..........."
|
||||
"#..##.............##...#.#..#.."
|
||||
"#...........#.#......#.##.##..#"
|
||||
"...#...#...........#....###.#.#"
|
||||
".##..#.#.#....#....#####......."
|
||||
"..#...#.....#.#....#..........."
|
||||
".#..#........#.....#.#......#.."
|
||||
".#.........#...#...#.#.#..#...."
|
||||
".##.##......#.#...#.......#...#"
|
||||
".##...#..#..........#...#.....#"
|
||||
"#..........#..#...#.#......#..."
|
||||
"....##......#...##..##..#....#."
|
||||
".##.......#...#.#..##..#..#...."
|
||||
".#.#................#....#....."
|
||||
"..#..#..###.......#............"
|
||||
"...##.....#..#......#....#....."
|
||||
"....#...###...#....#..##...#.#."
|
||||
"#.........#.......#...#....#..."
|
||||
".#.#...#.#....##....#.#..##.#.."
|
||||
"...#..#..#....#..#.#..##.....##"
|
||||
"..#..#.#.#....#...#....#..#...."
|
||||
"......###.....#...##.#..#.#...#"
|
||||
".#.#.#..#.##........#.#....#..."
|
||||
".#..........#....#.#.......#..."
|
||||
"#.....#........#........#....#."
|
||||
".#.#..#...#...................#"
|
||||
"....####..#..#..#..#....#..#.#."
|
||||
"..##.#..........#.##..#.....##."
|
||||
"..................##..........#"
|
||||
"....##....###.....#..#...#.#..."
|
||||
".##.........#..#..............."
|
||||
"....##..###....#.##............"
|
||||
"#.#...###.#..##...#...........#"
|
||||
".....#..#......#.....#........."
|
||||
"..#..##...#.....#.....#.#......"
|
||||
"......#....###.#..#.#.#....#..#"
|
||||
"#...#.......#.##.....#........."
|
||||
".#.#..#...#.............##....."
|
||||
"......#..............#.....#..#"
|
||||
"......#......###....#...#......"
|
||||
".....#.....#...#.......###....."
|
||||
"#..........##......##.#.#.....#"
|
||||
"....#.......#..#......#.......#"
|
||||
"..#...#.###...........#..#.###."
|
||||
".....#...#.#...........#.#...##"
|
||||
"........#.#.#........#.#.....#."
|
||||
"....##..##.#.#..#.#....#.#.##.."
|
||||
"..#.#.#......##.....#...#.#...#"
|
||||
"##...#..#......#.#.#..#...#...."
|
||||
"....#..##...........#..#..#..#."
|
||||
".#..##...#...#...##.#..#.#....#"
|
||||
".#.....####.#..#..#....##..#.#."
|
||||
".#....#..#......#.....#.#.#...."
|
||||
"....#..#.....#......#.........."
|
||||
"..#.#..###.....#...#...#.....##"
|
||||
"..#.#...##..#...........####..."
|
||||
".#.##....##.#......#.....##.#.."
|
||||
"#.##..#....#.###..........##..."
|
||||
".###...#......#.#....##........"
|
||||
"...................#..#.....#.."
|
||||
"#.#...#.#..#.....#...#..####.##"
|
||||
"....#.##..##...##.##.....#....."
|
||||
".#...#.##...........#.......##."
|
||||
"###..#.....##...#.........##..."
|
||||
".###....##...###..............."
|
||||
".#....#####........#.#.#.##...."
|
||||
".#.#....####.##........#......."
|
||||
".....#......#.................."
|
||||
"......###.....##......#..##.#.."
|
||||
"....#.#...........##.#....##.#."
|
||||
"...................#.#.#......."
|
||||
"#.#.#........#..#.......##....."
|
||||
"..#...#...#....#......#....##.#"
|
||||
"#..#..............#......#....#"
|
||||
"......#.........##............."
|
||||
".....#.#....##..#.......#......"
|
||||
"......#.......#...........#...."
|
||||
"....#....#.#..##.#....#...#...."
|
||||
"#.#.#..#..#.#.#.#...#....#....#"
|
||||
".#.#....#...#.#..#......#.....#"
|
||||
".#...........#.#....##.....#..."
|
||||
"........#...#....#....##.....##"
|
||||
"#..#..........#..#..#.....#...."
|
||||
"#.#.###..........#.##....#...##"
|
||||
"..#................#.##.##....."
|
||||
"..#...#.##...##...#.........#.."
|
||||
"#....#......#......#.........#."
|
||||
"##...#...##.#.........#......#."
|
||||
".......#.....#................."
|
||||
"...#...#.....##.........#.#..#."
|
||||
"..#......#...#.......#......#.#"
|
||||
"#.......#...#.##.#..##..#......"
|
||||
".#.#............#...###..#....."
|
||||
"...#.......##.......#....#..#.."
|
||||
".....#..#.#....#.#............."
|
||||
"#....#...##.##....#....##......"
|
||||
"........#......#.......#....#.."
|
||||
"..#..#..##......##.#..#.#..##.."
|
||||
"....##......#.##.##......#....."
|
||||
"........##.#...#.....#.......#."
|
||||
"..##.#....#..#......#.##......."
|
||||
"..##.####.#...#.#....#........."
|
||||
".#........#.....#..#....#...#.#"
|
||||
"###....##......#..#..#.##..#..."
|
||||
"..........###.#..#..#....#....."
|
||||
"..#.........#....#.....#....#.#"
|
||||
".#...#.#.....##.#...#...#.#..#."
|
||||
"....##......##.##.#.....#..#..."
|
||||
"....#.##...##.......#..##......"
|
||||
"#..........#..#....#.......#.#."
|
||||
"..#.....#.................#...."
|
||||
"..........#.#.#.....#.#....#..#"
|
||||
".......#..........#.##....#...."
|
||||
"#..#.....#.......#........#...."
|
||||
"#.....##..#.........##..#..#.#."
|
||||
".##.#...#..........#....#......"
|
||||
"....#..#.#......#.##..#..#.##.."
|
||||
"...##.####....#.....#.#...##..."
|
||||
"..#.#....#.#........#.........."
|
||||
"#...#.#.##.##....##..#...#...#."
|
||||
"...#.#.......#..#...#..#..##..#"
|
||||
".....#....#........###.....#..."
|
||||
".......#..#.##....#.#.....#...."
|
||||
"....##....#....#.......#.....#."
|
||||
".........#........###...##....."
|
||||
"#.#..#...##.........#.#..#....#"
|
||||
"...##...........#.........#...#"
|
||||
"......#.#.#.........#..#.#.#..."
|
||||
"........##.###....#..#.......#."
|
||||
"....#.#...#......#..#........##"
|
||||
".#....##....#...#.##.........#."
|
||||
"####.#..#...........##.#.#....."
|
||||
"...#....#..#.....#..##.####.#.."
|
||||
".##...#...........#.#.........#"
|
||||
"#.#..#..#...#.#.#.........#..#."
|
||||
"#......###............#...#...."
|
||||
"..#.......#....#...#...#..#...#"
|
||||
"#.#.#...##..#...#...#.......##."
|
||||
"......#.#.......#..........#.#."
|
||||
"...............#...#..#...#.#.."
|
||||
".#.#...##.####..##.##....#..##."
|
||||
"#..####.......##.#........#...#"
|
||||
"......###....##...#.#..#.##...."
|
||||
".##.....###..#...#.###.###....."
|
||||
"..#...#.....#...#..#..##..#...."
|
||||
"...#...##.....##........#.#.##."
|
||||
".#...#..#....#....#..###....#.#"
|
||||
"..#.#.#.#.#..........#.#..#..##"
|
||||
".......###....................."
|
||||
"##.#......#.##.....#.........#."
|
||||
"......................#.#.....#"
|
||||
"#..#........##.......#..##..#.#"
|
||||
"#.#.#.....##.#.##.##.#....##..."
|
||||
".#...#.....#.........#.....#..."
|
||||
"..#.........#.##.#.###.#......#"
|
||||
".........#..#.##...#.......###."
|
||||
".....##........#......#........"
|
||||
"...#.#...##...#........#.##...."
|
||||
".........##............#.####.."
|
||||
"#....#...#...#..#....#..#.#.#.#"
|
||||
"..#.........#......#.##........"
|
||||
"....#.....#........#........#.#"
|
||||
".##.#..#.#..#..###......###...."
|
||||
"#.###.....#.#.#.##........#..##"
|
||||
"#.#..#...##.....#....#...#.#..."
|
||||
"......#....#.....#...#........."
|
||||
"...#........##.......#.##..####"
|
||||
"..#..#....#....#..#..#...#.##.."
|
||||
".##.....#............#...#....."
|
||||
"......#.......#.....#...#.#.#.."
|
||||
".........#.....#...##.........."
|
||||
".....#........##...........#..."
|
||||
"#.#..##.#...#....#....#........"
|
||||
"#.##..#.#.......#...#......#..."
|
||||
"...........#.#..#..#.....##.#.."
|
||||
"#....#.##.......#......#.##..#."
|
||||
".....#........#.##.#...#.....#."
|
||||
".....###..#.......##..........."
|
||||
".........#.#.#.....#.##.......#"
|
||||
".......#....#......#.#.....#..."
|
||||
"##........#...#..#.#.........#."
|
||||
"##...........#.##...##......#.."
|
||||
"..#.###.#.#.#...####..#....###."
|
||||
".........#...#.....##....#.#.##"
|
||||
".###..###.#.#.....#.##........."
|
||||
"#..#...#.#.................##.#"
|
||||
"##.........#.#....#.#...#.###.."
|
||||
"#.#....#..............#.##.#..."
|
||||
"...#..#....##.#..#.......#..##."
|
||||
".#..#.###......##..........#..#"
|
||||
".##....#.#....#....#.#..#......"
|
||||
".......#.....#..#....#.##...#.."
|
||||
"#.#.#.........###..#..#.....#.."
|
||||
"...##..##...##....#..#......#.."
|
||||
"..........#....#..........#...."
|
||||
"#..##..#...#......#.....#.#...."
|
||||
"#..##..#....#.#.#...#.........."
|
||||
"......##..#.........#........#."
|
||||
".##..#..#......###.....#..#...."
|
||||
".....#..#.##..........#.#..#..."
|
||||
;
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,4 @@
|
||||
Advent of Code is an Advent calendar of small programming puzzles for a variety of skill sets and skill levels that can be solved in any programming language you like.
|
||||
People use them as a speed contest, interview prep, company training, university coursework, practice problems, or to challenge each other.
|
||||
|
||||
See https://adventofcode.com/2020/about
|
||||
@@ -0,0 +1,66 @@
|
||||
// LongLong implementation supporting integer addition and multiplication for 64bit signed integers
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
struct LongLong {
|
||||
// The lower 32bit
|
||||
long low;
|
||||
// The upper 32bit
|
||||
long high;
|
||||
};
|
||||
|
||||
// Creates a LongLong for a signed long value
|
||||
struct LongLong toLongLong(long l) {
|
||||
if(l<0)
|
||||
return {l,-1l};
|
||||
else
|
||||
return {l,0l};
|
||||
}
|
||||
|
||||
// Add two LongLongs together
|
||||
struct LongLong plusLongLong(__ma struct LongLong a, __ma struct LongLong b) {
|
||||
__ma struct LongLong sum;
|
||||
asm {
|
||||
clc
|
||||
lda a
|
||||
adc b
|
||||
sta sum
|
||||
lda a+1
|
||||
adc b+1
|
||||
sta sum+1
|
||||
lda a+2
|
||||
adc b+2
|
||||
sta sum+2
|
||||
lda a+3
|
||||
adc b+3
|
||||
sta sum+3
|
||||
lda a+4
|
||||
adc b+4
|
||||
sta sum+4
|
||||
lda a+5
|
||||
adc b+5
|
||||
sta sum+5
|
||||
lda a+6
|
||||
adc b+6
|
||||
sta sum+6
|
||||
lda a+7
|
||||
adc b+7
|
||||
sta sum+7
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
|
||||
|
||||
struct LongLong * SCREEN = 0x0400;
|
||||
|
||||
void main() {
|
||||
struct LongLong a = toLongLong(1000);
|
||||
struct LongLong b = toLongLong(-2000);
|
||||
struct LongLong c = plusLongLong(a,b);
|
||||
SCREEN[0] = a;
|
||||
SCREEN[2] = b;
|
||||
SCREEN[4] = c;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ void* const NUL = (void*)0;
|
||||
// Works
|
||||
// char*[] msgs = { (char*)"hello", (char*)"cruel", (char*)"world", (char*)NUL };
|
||||
// Not working
|
||||
char*[] msgs = { "hello", "cruel", "world", NUL };
|
||||
char* msgs[] = { "hello", "cruel", "world", NUL };
|
||||
|
||||
void main() {
|
||||
char i=0;
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
// Demonstrates missing fragment
|
||||
// https://gitlab.com/camelot/kickc/-/issues/293
|
||||
|
||||
byte bar[10]={9,1,2,3,4,5,6,7,8,9};
|
||||
byte *SCREEN = $0400;
|
||||
|
||||
void main() {
|
||||
word a=0;
|
||||
a=(foo(1) & 3);
|
||||
*SCREEN = (byte)a;
|
||||
}
|
||||
|
||||
byte foo(byte x) {
|
||||
return bar[x];
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Tests the target platform ASM6502
|
||||
|
||||
#pragma target(asm6502)
|
||||
#pragma start_address(0x2000)
|
||||
#pragma start_address(0x3000)
|
||||
|
||||
unsigned char TABLE[10];
|
||||
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
// Test combining unwind structs with classic structs
|
||||
|
||||
struct Point {
|
||||
char x;
|
||||
char y;
|
||||
};
|
||||
|
||||
struct Point * const SCREEN = 0x0400;
|
||||
|
||||
void main() {
|
||||
// Initialize classic struct
|
||||
__ma struct Point p1 = { 1, 2 };
|
||||
SCREEN[0] = p1;
|
||||
// Copy classic struct to unwound struct
|
||||
struct Point p2 = p1;
|
||||
SCREEN[2] = p2;
|
||||
// Set in classic struct
|
||||
p1.x = 3;
|
||||
SCREEN[4] = p1;
|
||||
// Set in unwound struct
|
||||
p2.x = 4;
|
||||
SCREEN[6] = p2;
|
||||
// Copy unwound struct to classic struct
|
||||
p1 = p2;
|
||||
SCREEN[8] = p1;
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
// Test combining unwind structs with classic structs
|
||||
// Function calls parameter passing
|
||||
|
||||
struct Point {
|
||||
char x;
|
||||
char y;
|
||||
};
|
||||
|
||||
struct Point * const SCREEN = 0x0400;
|
||||
|
||||
void main() {
|
||||
// Initialize classic struct
|
||||
__ma struct Point p1 = { 1, 2 };
|
||||
// Pass classic struct to function taking unwound struct
|
||||
print1(p1, 0);
|
||||
// Pass classic struct to function taking classic struct
|
||||
print2(p1, 2);
|
||||
|
||||
// Initialize unwound struct
|
||||
struct Point p2 = { 3, 4};
|
||||
// Pass unwound struct to function taking unwound struct
|
||||
print1(p2, 4);
|
||||
// Pass unwound struct to function taking classic struct
|
||||
print2(p2, 6);
|
||||
}
|
||||
|
||||
// Function taking unwound struct as parameter
|
||||
void print1(struct Point p, char idx) {
|
||||
// Print unwound struct
|
||||
SCREEN[idx] = p;
|
||||
}
|
||||
|
||||
// Function taking classic struct as parameter
|
||||
void print2(__ma struct Point p, char idx) {
|
||||
// Print unwound struct
|
||||
SCREEN[idx] = p;
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
// Test combining unwind structs with classic structs
|
||||
// Function calls return value
|
||||
|
||||
struct Point {
|
||||
char x;
|
||||
char y;
|
||||
};
|
||||
|
||||
struct Point * const SCREEN = 0x0400;
|
||||
|
||||
void main() {
|
||||
// Initialize classic struct from function returning unwound
|
||||
__ma struct Point p1 = point1(1, 2);
|
||||
SCREEN[0] = p1;
|
||||
// Initialize classic struct from function returning classic
|
||||
//p1 = point2(2, 3);
|
||||
//SCREEN[2] = p1;
|
||||
|
||||
// Initialize unwound struct from function returning unwound
|
||||
//struct Point p2 = point1(3,4);
|
||||
//SCREEN[4] = p2;
|
||||
// Initialize unwound struct from function returning classic
|
||||
//p2 = point2(5,6);
|
||||
//SCREEN[6] = p2;
|
||||
}
|
||||
|
||||
// Function returning unwound struct
|
||||
struct Point point1(char x, char y) {
|
||||
// Print unwound struct
|
||||
struct Point p = { x, y };
|
||||
return p;
|
||||
}
|
||||
|
||||
// Function returning classic struct
|
||||
//__ma struct Point point2(char x, char y) {
|
||||
// // Print unwound struct
|
||||
// struct Point p = { x, y };
|
||||
// return p;
|
||||
//}
|
||||
@@ -0,0 +1,13 @@
|
||||
// Test __varcall calling convention
|
||||
// Parameter passing
|
||||
|
||||
void main() {
|
||||
setbg(0);
|
||||
setbg(0x0b);
|
||||
}
|
||||
|
||||
char * const BGCOL = 0xd021;
|
||||
|
||||
__varcall void setbg(char col) {
|
||||
*BGCOL = col;
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
// Test __varcall calling convention
|
||||
// Return value
|
||||
|
||||
char * const BGCOL = 0xd021;
|
||||
|
||||
void main() {
|
||||
char a = 1;
|
||||
*BGCOL = a;
|
||||
a = plus(a, 1);
|
||||
*BGCOL = a;
|
||||
a = plus(a, a);
|
||||
*BGCOL = a;
|
||||
}
|
||||
|
||||
__varcall char plus(char a, char b) {
|
||||
return a+b;
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
// Test __varcall calling convention
|
||||
// Larger type parameter & return value
|
||||
|
||||
int * const BGCOL = 0xd020;
|
||||
|
||||
void main() {
|
||||
int a = 0x0102;
|
||||
*BGCOL = a;
|
||||
a = plus(a, 0x0203);
|
||||
*BGCOL = a;
|
||||
a = plus(a, a);
|
||||
*BGCOL = a;
|
||||
}
|
||||
|
||||
__varcall int plus(int a, int b) {
|
||||
return a+b;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
// Test __varcall calling convention
|
||||
// Struct parameter & return value
|
||||
|
||||
struct Cols {
|
||||
char border;
|
||||
char bg;
|
||||
};
|
||||
|
||||
struct Cols * const COLS = 0xd020;
|
||||
|
||||
void main() {
|
||||
struct Cols a = { 1, 2 };
|
||||
//*COLS = a;
|
||||
a = plus(a, { 2, 3 } );
|
||||
*COLS = a;
|
||||
//a = plus(a, a);
|
||||
//*COLS = a;
|
||||
}
|
||||
|
||||
__varcall struct Cols plus(struct Cols a, struct Cols b) {
|
||||
return { a.border+b.border, a.bg+b.bg };
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,674 @@
|
||||
|
||||
void main()
|
||||
main: scope:[main] from
|
||||
[0] phi()
|
||||
[1] call clrscr
|
||||
to:main::@19
|
||||
main::@19: scope:[main] from main
|
||||
[2] phi()
|
||||
[3] call cputs
|
||||
to:main::@20
|
||||
main::@20: scope:[main] from main::@19
|
||||
[4] phi()
|
||||
[5] call printf_uint
|
||||
to:main::@21
|
||||
main::@21: scope:[main] from main::@20
|
||||
[6] phi()
|
||||
[7] call cputs
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main::@21 main::@24
|
||||
[8] main::i#2 = phi( main::@21/0, main::@24/main::i#1 )
|
||||
[9] if(main::i#2<main::num_entries#0) goto main::@2
|
||||
to:main::@3
|
||||
main::@3: scope:[main] from main::@1
|
||||
[10] phi()
|
||||
[11] call cputs
|
||||
to:main::@22
|
||||
main::@22: scope:[main] from main::@3
|
||||
[12] phi()
|
||||
[13] call printf_uint
|
||||
to:main::@23
|
||||
main::@23: scope:[main] from main::@22
|
||||
[14] phi()
|
||||
[15] call cputs
|
||||
to:main::@9
|
||||
main::@9: scope:[main] from main::@23 main::@38
|
||||
[16] main::i1#2 = phi( main::@23/0, main::@38/main::i1#1 )
|
||||
[17] if(main::i1#2<main::num_entries#0) goto main::@10
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@9
|
||||
[18] return
|
||||
to:@return
|
||||
main::@10: scope:[main] from main::@9
|
||||
[19] main::j1#0 = main::i1#2 + 1
|
||||
to:main::@11
|
||||
main::@11: scope:[main] from main::@10 main::@16
|
||||
[20] main::j1#2 = phi( main::@10/main::j1#0, main::@16/main::j1#1 )
|
||||
[21] if(main::j1#2<main::num_entries#0) goto main::@12
|
||||
to:main::@13
|
||||
main::@13: scope:[main] from main::@11
|
||||
[22] phi()
|
||||
[23] call cputs
|
||||
to:main::@38
|
||||
main::@38: scope:[main] from main::@13
|
||||
[24] main::i1#1 = ++ main::i1#2
|
||||
to:main::@9
|
||||
main::@12: scope:[main] from main::@11
|
||||
[25] main::k#0 = main::j1#2 + 1
|
||||
to:main::@14
|
||||
main::@14: scope:[main] from main::@12 main::@17
|
||||
[26] main::k#10 = phi( main::@12/main::k#0, main::@17/main::k#1 )
|
||||
[27] if(main::k#10<main::num_entries#0) goto main::@15
|
||||
to:main::@16
|
||||
main::@16: scope:[main] from main::@14
|
||||
[28] main::j1#1 = ++ main::j1#2
|
||||
to:main::@11
|
||||
main::@15: scope:[main] from main::@14
|
||||
[29] main::$41 = main::i1#2 << 1
|
||||
[30] main::$42 = main::j1#2 << 1
|
||||
[31] main::$53 = entries + main::$41
|
||||
[32] main::$54 = entries + main::$42
|
||||
[33] main::$21 = *main::$53 + *main::$54
|
||||
[34] main::$43 = main::k#10 << 1
|
||||
[35] main::$55 = entries + main::$43
|
||||
[36] main::$22 = main::$21 + *main::$55
|
||||
[37] if(main::$22!=$7e4) goto main::@17
|
||||
to:main::@18
|
||||
main::@18: scope:[main] from main::@15
|
||||
[38] phi()
|
||||
[39] call cputs
|
||||
to:main::@39
|
||||
main::@39: scope:[main] from main::@18
|
||||
[40] phi()
|
||||
[41] call cputs
|
||||
to:main::@40
|
||||
main::@40: scope:[main] from main::@39
|
||||
[42] printf_uint::uvalue#6 = main::i1#2
|
||||
[43] call printf_uint
|
||||
to:main::@41
|
||||
main::@41: scope:[main] from main::@40
|
||||
[44] phi()
|
||||
[45] call cputs
|
||||
to:main::@42
|
||||
main::@42: scope:[main] from main::@41
|
||||
[46] main::$56 = entries + main::$41
|
||||
[47] printf_uint::uvalue#7 = *main::$56
|
||||
[48] call printf_uint
|
||||
to:main::@43
|
||||
main::@43: scope:[main] from main::@42
|
||||
[49] phi()
|
||||
[50] call cputs
|
||||
to:main::@44
|
||||
main::@44: scope:[main] from main::@43
|
||||
[51] printf_uint::uvalue#8 = main::j1#2
|
||||
[52] call printf_uint
|
||||
to:main::@45
|
||||
main::@45: scope:[main] from main::@44
|
||||
[53] phi()
|
||||
[54] call cputs
|
||||
to:main::@46
|
||||
main::@46: scope:[main] from main::@45
|
||||
[55] main::$57 = entries + main::$42
|
||||
[56] printf_uint::uvalue#9 = *main::$57
|
||||
[57] call printf_uint
|
||||
to:main::@47
|
||||
main::@47: scope:[main] from main::@46
|
||||
[58] phi()
|
||||
[59] call cputs
|
||||
to:main::@48
|
||||
main::@48: scope:[main] from main::@47
|
||||
[60] printf_uint::uvalue#10 = main::k#10
|
||||
[61] call printf_uint
|
||||
to:main::@49
|
||||
main::@49: scope:[main] from main::@48
|
||||
[62] phi()
|
||||
[63] call cputs
|
||||
to:main::@50
|
||||
main::@50: scope:[main] from main::@49
|
||||
[64] main::$58 = entries + main::$43
|
||||
[65] printf_uint::uvalue#11 = *main::$58
|
||||
[66] call printf_uint
|
||||
to:main::@51
|
||||
main::@51: scope:[main] from main::@50
|
||||
[67] phi()
|
||||
[68] call cputs
|
||||
to:main::@52
|
||||
main::@52: scope:[main] from main::@51
|
||||
[69] main::$59 = entries + main::$41
|
||||
[70] mul16u::a#2 = *main::$59
|
||||
[71] main::$60 = entries + main::$43
|
||||
[72] mul16u::b#1 = *main::$60
|
||||
[73] call mul16u
|
||||
[74] mul16u::return#3 = mul16u::res#2
|
||||
to:main::@53
|
||||
main::@53: scope:[main] from main::@52
|
||||
[75] main::mul1#0 = mul16u::return#3
|
||||
[76] mul16u::a#3 = < main::mul1#0
|
||||
[77] main::$61 = entries + main::$42
|
||||
[78] mul16u::b#2 = *main::$61
|
||||
[79] call mul16u
|
||||
[80] mul16u::return#4 = mul16u::res#2
|
||||
to:main::@54
|
||||
main::@54: scope:[main] from main::@53
|
||||
[81] main::mul2#0 = mul16u::return#4
|
||||
[82] call cputs
|
||||
to:main::@55
|
||||
main::@55: scope:[main] from main::@54
|
||||
[83] printf_ulong::uvalue#1 = main::mul2#0
|
||||
[84] call printf_ulong
|
||||
to:main::@56
|
||||
main::@56: scope:[main] from main::@55
|
||||
[85] phi()
|
||||
[86] call cputs
|
||||
to:main::@17
|
||||
main::@17: scope:[main] from main::@15 main::@56
|
||||
[87] main::k#1 = ++ main::k#10
|
||||
to:main::@14
|
||||
main::@2: scope:[main] from main::@1
|
||||
[88] main::j#0 = main::i#2 + 1
|
||||
to:main::@4
|
||||
main::@4: scope:[main] from main::@2 main::@7
|
||||
[89] main::j#10 = phi( main::@2/main::j#0, main::@7/main::j#1 )
|
||||
[90] if(main::j#10<main::num_entries#0) goto main::@5
|
||||
to:main::@6
|
||||
main::@6: scope:[main] from main::@4
|
||||
[91] phi()
|
||||
[92] call cputs
|
||||
to:main::@24
|
||||
main::@24: scope:[main] from main::@6
|
||||
[93] main::i#1 = ++ main::i#2
|
||||
to:main::@1
|
||||
main::@5: scope:[main] from main::@4
|
||||
[94] main::$34 = main::i#2 << 1
|
||||
[95] main::$35 = main::j#10 << 1
|
||||
[96] main::$47 = entries + main::$34
|
||||
[97] main::$48 = entries + main::$35
|
||||
[98] main::$8 = *main::$47 + *main::$48
|
||||
[99] if(main::$8!=$7e4) goto main::@7
|
||||
to:main::@8
|
||||
main::@8: scope:[main] from main::@5
|
||||
[100] phi()
|
||||
[101] call cputs
|
||||
to:main::@25
|
||||
main::@25: scope:[main] from main::@8
|
||||
[102] phi()
|
||||
[103] call cputs
|
||||
to:main::@26
|
||||
main::@26: scope:[main] from main::@25
|
||||
[104] printf_uint::uvalue#2 = main::i#2
|
||||
[105] call printf_uint
|
||||
to:main::@27
|
||||
main::@27: scope:[main] from main::@26
|
||||
[106] phi()
|
||||
[107] call cputs
|
||||
to:main::@28
|
||||
main::@28: scope:[main] from main::@27
|
||||
[108] main::$49 = entries + main::$34
|
||||
[109] printf_uint::uvalue#3 = *main::$49
|
||||
[110] call printf_uint
|
||||
to:main::@29
|
||||
main::@29: scope:[main] from main::@28
|
||||
[111] phi()
|
||||
[112] call cputs
|
||||
to:main::@30
|
||||
main::@30: scope:[main] from main::@29
|
||||
[113] printf_uint::uvalue#4 = main::j#10
|
||||
[114] call printf_uint
|
||||
to:main::@31
|
||||
main::@31: scope:[main] from main::@30
|
||||
[115] phi()
|
||||
[116] call cputs
|
||||
to:main::@32
|
||||
main::@32: scope:[main] from main::@31
|
||||
[117] main::$50 = entries + main::$35
|
||||
[118] printf_uint::uvalue#5 = *main::$50
|
||||
[119] call printf_uint
|
||||
to:main::@33
|
||||
main::@33: scope:[main] from main::@32
|
||||
[120] phi()
|
||||
[121] call cputs
|
||||
to:main::@34
|
||||
main::@34: scope:[main] from main::@33
|
||||
[122] main::$51 = entries + main::$34
|
||||
[123] mul16u::a#1 = *main::$51
|
||||
[124] main::$52 = entries + main::$35
|
||||
[125] mul16u::b#0 = *main::$52
|
||||
[126] call mul16u
|
||||
[127] mul16u::return#2 = mul16u::res#2
|
||||
to:main::@35
|
||||
main::@35: scope:[main] from main::@34
|
||||
[128] main::mul#0 = mul16u::return#2
|
||||
[129] call cputs
|
||||
to:main::@36
|
||||
main::@36: scope:[main] from main::@35
|
||||
[130] printf_ulong::uvalue#0 = main::mul#0
|
||||
[131] call printf_ulong
|
||||
to:main::@37
|
||||
main::@37: scope:[main] from main::@36
|
||||
[132] phi()
|
||||
[133] call cputs
|
||||
to:main::@7
|
||||
main::@7: scope:[main] from main::@37 main::@5
|
||||
[134] main::j#1 = ++ main::j#10
|
||||
to:main::@4
|
||||
|
||||
void clrscr()
|
||||
clrscr: scope:[clrscr] from main
|
||||
[135] memset::str#7 = (void*)*SAVMSC
|
||||
[136] call memset
|
||||
to:clrscr::@1
|
||||
clrscr::@1: scope:[clrscr] from clrscr
|
||||
[137] *OLDCHR = 0
|
||||
[138] call gotoxy
|
||||
to:clrscr::@return
|
||||
clrscr::@return: scope:[clrscr] from clrscr::@1
|
||||
[139] return
|
||||
to:@return
|
||||
|
||||
void cputs(to_nomodify byte* cputs::s)
|
||||
cputs: scope:[cputs] from main::@13 main::@18 main::@19 main::@21 main::@23 main::@25 main::@27 main::@29 main::@3 main::@31 main::@33 main::@35 main::@37 main::@39 main::@41 main::@43 main::@45 main::@47 main::@49 main::@51 main::@54 main::@56 main::@6 main::@8 printf_number_buffer::@2
|
||||
[140] cputs::s#27 = phi( main::@13/main::s4, main::@18/main::s5, main::@19/main::s, main::@21/main::s1, main::@23/main::s1, main::@25/main::s6, main::@27/main::s7, main::@3/main::s2, main::@29/main::s8, main::@31/main::s7, main::@33/main::s10, main::@35/main::s11, main::@37/main::s5, main::@39/main::s6, main::@41/main::s7, main::@43/main::s8, main::@45/main::s7, main::@47/main::s8, main::@49/main::s7, main::@51/main::s10, main::@54/main::s11, main::@56/main::s5, main::@6/main::s4, main::@8/main::s5, printf_number_buffer::@2/(byte*)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS )
|
||||
to:cputs::@1
|
||||
cputs::@1: scope:[cputs] from cputs cputs::@2
|
||||
[141] cputs::s#26 = phi( cputs/cputs::s#27, cputs::@2/cputs::s#0 )
|
||||
[142] cputs::c#1 = *cputs::s#26
|
||||
[143] cputs::s#0 = ++ cputs::s#26
|
||||
[144] if(0!=cputs::c#1) goto cputs::@2
|
||||
to:cputs::@return
|
||||
cputs::@return: scope:[cputs] from cputs::@1
|
||||
[145] return
|
||||
to:@return
|
||||
cputs::@2: scope:[cputs] from cputs::@1
|
||||
[146] cputc::c = cputs::c#1
|
||||
[147] call cputc
|
||||
to:cputs::@1
|
||||
|
||||
void printf_uint(word printf_uint::uvalue , byte printf_uint::format_min_length , byte printf_uint::format_justify_left , byte printf_uint::format_sign_always , byte printf_uint::format_zero_padding , byte printf_uint::format_upper_case , byte printf_uint::format_radix)
|
||||
printf_uint: scope:[printf_uint] from main::@20 main::@22 main::@26 main::@28 main::@30 main::@32 main::@40 main::@42 main::@44 main::@46 main::@48 main::@50
|
||||
[148] printf_uint::uvalue#12 = phi( main::@20/main::num_entries#0, main::@22/main::num_entries#0, main::@26/printf_uint::uvalue#2, main::@28/printf_uint::uvalue#3, main::@30/printf_uint::uvalue#4, main::@32/printf_uint::uvalue#5, main::@40/printf_uint::uvalue#6, main::@42/printf_uint::uvalue#7, main::@44/printf_uint::uvalue#8, main::@46/printf_uint::uvalue#9, main::@48/printf_uint::uvalue#10, main::@50/printf_uint::uvalue#11 )
|
||||
to:printf_uint::@1
|
||||
printf_uint::@1: scope:[printf_uint] from printf_uint
|
||||
[149] *((byte*)&printf_buffer) = 0
|
||||
[150] utoa::value#1 = printf_uint::uvalue#12
|
||||
[151] call utoa
|
||||
to:printf_uint::@2
|
||||
printf_uint::@2: scope:[printf_uint] from printf_uint::@1
|
||||
[152] printf_number_buffer::buffer_sign#1 = *((byte*)&printf_buffer)
|
||||
[153] call printf_number_buffer
|
||||
to:printf_uint::@return
|
||||
printf_uint::@return: scope:[printf_uint] from printf_uint::@2
|
||||
[154] return
|
||||
to:@return
|
||||
|
||||
dword mul16u(word mul16u::a , word mul16u::b)
|
||||
mul16u: scope:[mul16u] from main::@34 main::@52 main::@53
|
||||
[155] mul16u::a#7 = phi( main::@34/mul16u::a#1, main::@52/mul16u::a#2, main::@53/mul16u::a#3 )
|
||||
[155] mul16u::b#3 = phi( main::@34/mul16u::b#0, main::@52/mul16u::b#1, main::@53/mul16u::b#2 )
|
||||
[156] mul16u::mb#0 = (dword)mul16u::b#3
|
||||
to:mul16u::@1
|
||||
mul16u::@1: scope:[mul16u] from mul16u mul16u::@3
|
||||
[157] mul16u::mb#2 = phi( mul16u/mul16u::mb#0, mul16u::@3/mul16u::mb#1 )
|
||||
[157] mul16u::res#2 = phi( mul16u/0, mul16u::@3/mul16u::res#6 )
|
||||
[157] mul16u::a#4 = phi( mul16u/mul16u::a#7, mul16u::@3/mul16u::a#0 )
|
||||
[158] if(mul16u::a#4!=0) goto mul16u::@2
|
||||
to:mul16u::@return
|
||||
mul16u::@return: scope:[mul16u] from mul16u::@1
|
||||
[159] return
|
||||
to:@return
|
||||
mul16u::@2: scope:[mul16u] from mul16u::@1
|
||||
[160] mul16u::$1 = mul16u::a#4 & 1
|
||||
[161] if(mul16u::$1==0) goto mul16u::@3
|
||||
to:mul16u::@4
|
||||
mul16u::@4: scope:[mul16u] from mul16u::@2
|
||||
[162] mul16u::res#1 = mul16u::res#2 + mul16u::mb#2
|
||||
to:mul16u::@3
|
||||
mul16u::@3: scope:[mul16u] from mul16u::@2 mul16u::@4
|
||||
[163] mul16u::res#6 = phi( mul16u::@2/mul16u::res#2, mul16u::@4/mul16u::res#1 )
|
||||
[164] mul16u::a#0 = mul16u::a#4 >> 1
|
||||
[165] mul16u::mb#1 = mul16u::mb#2 << 1
|
||||
to:mul16u::@1
|
||||
|
||||
void printf_ulong(dword printf_ulong::uvalue , byte printf_ulong::format_min_length , byte printf_ulong::format_justify_left , byte printf_ulong::format_sign_always , byte printf_ulong::format_zero_padding , byte printf_ulong::format_upper_case , byte printf_ulong::format_radix)
|
||||
printf_ulong: scope:[printf_ulong] from main::@36 main::@55
|
||||
[166] printf_ulong::uvalue#2 = phi( main::@36/printf_ulong::uvalue#0, main::@55/printf_ulong::uvalue#1 )
|
||||
to:printf_ulong::@1
|
||||
printf_ulong::@1: scope:[printf_ulong] from printf_ulong
|
||||
[167] *((byte*)&printf_buffer) = 0
|
||||
[168] ultoa::value#1 = printf_ulong::uvalue#2
|
||||
[169] call ultoa
|
||||
to:printf_ulong::@2
|
||||
printf_ulong::@2: scope:[printf_ulong] from printf_ulong::@1
|
||||
[170] printf_number_buffer::buffer_sign#0 = *((byte*)&printf_buffer)
|
||||
[171] call printf_number_buffer
|
||||
to:printf_ulong::@return
|
||||
printf_ulong::@return: scope:[printf_ulong] from printf_ulong::@2
|
||||
[172] return
|
||||
to:@return
|
||||
|
||||
void* memset(void* memset::str , byte memset::c , word memset::num)
|
||||
memset: scope:[memset] from clrscr newline::@4
|
||||
[173] memset::str#3 = phi( clrscr/memset::str#7, newline::@4/memset::str#8 )
|
||||
[173] memset::num#2 = phi( clrscr/(word)$28*$18, newline::@4/$28 )
|
||||
[174] if(memset::num#2<=0) goto memset::@return
|
||||
to:memset::@1
|
||||
memset::@1: scope:[memset] from memset
|
||||
[175] memset::end#0 = (byte*)memset::str#3 + memset::num#2
|
||||
[176] memset::dst#4 = (byte*)memset::str#3
|
||||
to:memset::@2
|
||||
memset::@2: scope:[memset] from memset::@1 memset::@3
|
||||
[177] memset::dst#2 = phi( memset::@1/memset::dst#4, memset::@3/memset::dst#1 )
|
||||
[178] if(memset::dst#2!=memset::end#0) goto memset::@3
|
||||
to:memset::@return
|
||||
memset::@return: scope:[memset] from memset memset::@2
|
||||
[179] return
|
||||
to:@return
|
||||
memset::@3: scope:[memset] from memset::@2
|
||||
[180] *memset::dst#2 = 0
|
||||
[181] memset::dst#1 = ++ memset::dst#2
|
||||
to:memset::@2
|
||||
|
||||
void gotoxy(byte gotoxy::x , byte gotoxy::y)
|
||||
gotoxy: scope:[gotoxy] from clrscr::@1
|
||||
[182] *COLCRS = gotoxy::x#1
|
||||
[183] *ROWCRS = gotoxy::y#1
|
||||
[184] call setcursor
|
||||
to:gotoxy::@return
|
||||
gotoxy::@return: scope:[gotoxy] from gotoxy
|
||||
[185] return
|
||||
to:@return
|
||||
|
||||
void cputc(volatile byte cputc::c)
|
||||
cputc: scope:[cputc] from cputs::@2 printf_number_buffer::@3
|
||||
[186] if(cputc::c=='
'at) goto cputc::@1
|
||||
to:cputc::@3
|
||||
cputc::@3: scope:[cputc] from cputc
|
||||
[187] if(cputc::c=='
|
||||
'at) goto cputc::@2
|
||||
to:cputc::@8
|
||||
cputc::@8: scope:[cputc] from cputc::@3
|
||||
[188] if(cputc::c==$9b) goto cputc::@2
|
||||
to:cputc::convertToScreenCode1
|
||||
cputc::convertToScreenCode1: scope:[cputc] from cputc::@8
|
||||
[189] cputc::convertToScreenCode1_return#0 = rawmap[*cputc::convertToScreenCode1_v#0]
|
||||
to:cputc::@6
|
||||
cputc::@6: scope:[cputc] from cputc::convertToScreenCode1
|
||||
[190] phi()
|
||||
[191] call putchar
|
||||
to:cputc::@7
|
||||
cputc::@7: scope:[cputc] from cputc::@6
|
||||
[192] *COLCRS = ++ *COLCRS
|
||||
[193] if(*COLCRS==$28) goto cputc::@5
|
||||
to:cputc::@4
|
||||
cputc::@4: scope:[cputc] from cputc::@7
|
||||
[194] phi()
|
||||
[195] call setcursor
|
||||
to:cputc::@return
|
||||
cputc::@return: scope:[cputc] from cputc::@1 cputc::@2 cputc::@4 cputc::@5
|
||||
[196] return
|
||||
to:@return
|
||||
cputc::@5: scope:[cputc] from cputc::@7
|
||||
[197] *COLCRS = 0
|
||||
[198] call newline
|
||||
to:cputc::@return
|
||||
cputc::@2: scope:[cputc] from cputc::@3 cputc::@8
|
||||
[199] *COLCRS = 0
|
||||
[200] call newline
|
||||
to:cputc::@return
|
||||
cputc::@1: scope:[cputc] from cputc
|
||||
[201] *COLCRS = 0
|
||||
[202] call setcursor
|
||||
to:cputc::@return
|
||||
|
||||
void utoa(word utoa::value , byte* utoa::buffer , byte utoa::radix)
|
||||
utoa: scope:[utoa] from printf_uint::@1
|
||||
[203] phi()
|
||||
to:utoa::@1
|
||||
utoa::@1: scope:[utoa] from utoa utoa::@4
|
||||
[204] utoa::buffer#11 = phi( utoa::@4/utoa::buffer#14, utoa/(byte*)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS )
|
||||
[204] utoa::started#2 = phi( utoa::@4/utoa::started#4, utoa/0 )
|
||||
[204] utoa::value#2 = phi( utoa::@4/utoa::value#6, utoa/utoa::value#1 )
|
||||
[204] utoa::digit#2 = phi( utoa::@4/utoa::digit#1, utoa/0 )
|
||||
[205] if(utoa::digit#2<5-1) goto utoa::@2
|
||||
to:utoa::@3
|
||||
utoa::@3: scope:[utoa] from utoa::@1
|
||||
[206] utoa::$11 = (byte)utoa::value#2
|
||||
[207] *utoa::buffer#11 = DIGITS[utoa::$11]
|
||||
[208] utoa::buffer#3 = ++ utoa::buffer#11
|
||||
[209] *utoa::buffer#3 = 0
|
||||
to:utoa::@return
|
||||
utoa::@return: scope:[utoa] from utoa::@3
|
||||
[210] return
|
||||
to:@return
|
||||
utoa::@2: scope:[utoa] from utoa::@1
|
||||
[211] utoa::$10 = utoa::digit#2 << 1
|
||||
[212] utoa::digit_value#0 = RADIX_DECIMAL_VALUES[utoa::$10]
|
||||
[213] if(0!=utoa::started#2) goto utoa::@5
|
||||
to:utoa::@7
|
||||
utoa::@7: scope:[utoa] from utoa::@2
|
||||
[214] if(utoa::value#2>=utoa::digit_value#0) goto utoa::@5
|
||||
to:utoa::@4
|
||||
utoa::@4: scope:[utoa] from utoa::@6 utoa::@7
|
||||
[215] utoa::buffer#14 = phi( utoa::@7/utoa::buffer#11, utoa::@6/utoa::buffer#4 )
|
||||
[215] utoa::started#4 = phi( utoa::@7/utoa::started#2, utoa::@6/1 )
|
||||
[215] utoa::value#6 = phi( utoa::@7/utoa::value#2, utoa::@6/utoa::value#0 )
|
||||
[216] utoa::digit#1 = ++ utoa::digit#2
|
||||
to:utoa::@1
|
||||
utoa::@5: scope:[utoa] from utoa::@2 utoa::@7
|
||||
[217] utoa_append::buffer#0 = utoa::buffer#11
|
||||
[218] utoa_append::value#0 = utoa::value#2
|
||||
[219] utoa_append::sub#0 = utoa::digit_value#0
|
||||
[220] call utoa_append
|
||||
[221] utoa_append::return#0 = utoa_append::value#2
|
||||
to:utoa::@6
|
||||
utoa::@6: scope:[utoa] from utoa::@5
|
||||
[222] utoa::value#0 = utoa_append::return#0
|
||||
[223] utoa::buffer#4 = ++ utoa::buffer#11
|
||||
to:utoa::@4
|
||||
|
||||
void printf_number_buffer(byte printf_number_buffer::buffer_sign , byte* printf_number_buffer::buffer_digits , byte printf_number_buffer::format_min_length , byte printf_number_buffer::format_justify_left , byte printf_number_buffer::format_sign_always , byte printf_number_buffer::format_zero_padding , byte printf_number_buffer::format_upper_case , byte printf_number_buffer::format_radix)
|
||||
printf_number_buffer: scope:[printf_number_buffer] from printf_uint::@2 printf_ulong::@2
|
||||
[224] printf_number_buffer::buffer_sign#10 = phi( printf_uint::@2/printf_number_buffer::buffer_sign#1, printf_ulong::@2/printf_number_buffer::buffer_sign#0 )
|
||||
to:printf_number_buffer::@1
|
||||
printf_number_buffer::@1: scope:[printf_number_buffer] from printf_number_buffer
|
||||
[225] if(0==printf_number_buffer::buffer_sign#10) goto printf_number_buffer::@2
|
||||
to:printf_number_buffer::@3
|
||||
printf_number_buffer::@3: scope:[printf_number_buffer] from printf_number_buffer::@1
|
||||
[226] cputc::c = printf_number_buffer::buffer_sign#10
|
||||
[227] call cputc
|
||||
to:printf_number_buffer::@2
|
||||
printf_number_buffer::@2: scope:[printf_number_buffer] from printf_number_buffer::@1 printf_number_buffer::@3
|
||||
[228] phi()
|
||||
[229] call cputs
|
||||
to:printf_number_buffer::@return
|
||||
printf_number_buffer::@return: scope:[printf_number_buffer] from printf_number_buffer::@2
|
||||
[230] return
|
||||
to:@return
|
||||
|
||||
void ultoa(dword ultoa::value , byte* ultoa::buffer , byte ultoa::radix)
|
||||
ultoa: scope:[ultoa] from printf_ulong::@1
|
||||
[231] phi()
|
||||
to:ultoa::@1
|
||||
ultoa::@1: scope:[ultoa] from ultoa ultoa::@4
|
||||
[232] ultoa::buffer#11 = phi( ultoa::@4/ultoa::buffer#14, ultoa/(byte*)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS )
|
||||
[232] ultoa::started#2 = phi( ultoa::@4/ultoa::started#4, ultoa/0 )
|
||||
[232] ultoa::value#2 = phi( ultoa::@4/ultoa::value#6, ultoa/ultoa::value#1 )
|
||||
[232] ultoa::digit#2 = phi( ultoa::@4/ultoa::digit#1, ultoa/0 )
|
||||
[233] if(ultoa::digit#2<$a-1) goto ultoa::@2
|
||||
to:ultoa::@3
|
||||
ultoa::@3: scope:[ultoa] from ultoa::@1
|
||||
[234] ultoa::$11 = (byte)ultoa::value#2
|
||||
[235] *ultoa::buffer#11 = DIGITS[ultoa::$11]
|
||||
[236] ultoa::buffer#3 = ++ ultoa::buffer#11
|
||||
[237] *ultoa::buffer#3 = 0
|
||||
to:ultoa::@return
|
||||
ultoa::@return: scope:[ultoa] from ultoa::@3
|
||||
[238] return
|
||||
to:@return
|
||||
ultoa::@2: scope:[ultoa] from ultoa::@1
|
||||
[239] ultoa::$10 = ultoa::digit#2 << 2
|
||||
[240] ultoa::digit_value#0 = RADIX_DECIMAL_VALUES_LONG[ultoa::$10]
|
||||
[241] if(0!=ultoa::started#2) goto ultoa::@5
|
||||
to:ultoa::@7
|
||||
ultoa::@7: scope:[ultoa] from ultoa::@2
|
||||
[242] if(ultoa::value#2>=ultoa::digit_value#0) goto ultoa::@5
|
||||
to:ultoa::@4
|
||||
ultoa::@4: scope:[ultoa] from ultoa::@6 ultoa::@7
|
||||
[243] ultoa::buffer#14 = phi( ultoa::@7/ultoa::buffer#11, ultoa::@6/ultoa::buffer#4 )
|
||||
[243] ultoa::started#4 = phi( ultoa::@7/ultoa::started#2, ultoa::@6/1 )
|
||||
[243] ultoa::value#6 = phi( ultoa::@7/ultoa::value#2, ultoa::@6/ultoa::value#0 )
|
||||
[244] ultoa::digit#1 = ++ ultoa::digit#2
|
||||
to:ultoa::@1
|
||||
ultoa::@5: scope:[ultoa] from ultoa::@2 ultoa::@7
|
||||
[245] ultoa_append::buffer#0 = ultoa::buffer#11
|
||||
[246] ultoa_append::value#0 = ultoa::value#2
|
||||
[247] ultoa_append::sub#0 = ultoa::digit_value#0
|
||||
[248] call ultoa_append
|
||||
[249] ultoa_append::return#0 = ultoa_append::value#2
|
||||
to:ultoa::@6
|
||||
ultoa::@6: scope:[ultoa] from ultoa::@5
|
||||
[250] ultoa::value#0 = ultoa_append::return#0
|
||||
[251] ultoa::buffer#4 = ++ ultoa::buffer#11
|
||||
to:ultoa::@4
|
||||
|
||||
void setcursor()
|
||||
setcursor: scope:[setcursor] from cputc::@1 cputc::@4 gotoxy newline::@1 putchar::@1
|
||||
[252] *(*OLDADR) = *OLDCHR
|
||||
[253] call cursorLocation
|
||||
[254] cursorLocation::return#3 = cursorLocation::return#1
|
||||
to:setcursor::@3
|
||||
setcursor::@3: scope:[setcursor] from setcursor
|
||||
[255] setcursor::loc#0 = cursorLocation::return#3
|
||||
[256] setcursor::c#0 = *setcursor::loc#0
|
||||
[257] *OLDCHR = setcursor::c#0
|
||||
[258] *OLDADR = setcursor::loc#0
|
||||
to:setcursor::@2
|
||||
setcursor::@2: scope:[setcursor] from setcursor::@3
|
||||
[259] *CRSINH = 0
|
||||
[260] setcursor::c#1 = setcursor::c#0 ^ $80
|
||||
to:setcursor::@1
|
||||
setcursor::@1: scope:[setcursor] from setcursor::@2
|
||||
[261] *(*OLDADR) = setcursor::c#1
|
||||
to:setcursor::@return
|
||||
setcursor::@return: scope:[setcursor] from setcursor::@1
|
||||
[262] return
|
||||
to:@return
|
||||
|
||||
void putchar(byte putchar::code)
|
||||
putchar: scope:[putchar] from cputc::@6
|
||||
[263] *(*OLDADR) = *OLDCHR
|
||||
[264] call cursorLocation
|
||||
[265] cursorLocation::return#0 = cursorLocation::return#1
|
||||
to:putchar::@1
|
||||
putchar::@1: scope:[putchar] from putchar
|
||||
[266] putchar::loc#0 = cursorLocation::return#0
|
||||
[267] putchar::newChar#0 = cputc::convertToScreenCode1_return#0
|
||||
[268] *putchar::loc#0 = putchar::newChar#0
|
||||
[269] *OLDCHR = putchar::newChar#0
|
||||
[270] call setcursor
|
||||
to:putchar::@return
|
||||
putchar::@return: scope:[putchar] from putchar::@1
|
||||
[271] return
|
||||
to:@return
|
||||
|
||||
void newline()
|
||||
newline: scope:[newline] from cputc::@2 cputc::@5
|
||||
[272] *ROWCRS = ++ *ROWCRS
|
||||
[273] if(*ROWCRS!=$18) goto newline::@1
|
||||
to:newline::@3
|
||||
newline::@3: scope:[newline] from newline
|
||||
[274] *(*OLDADR) = *(*OLDADR) ^ $80
|
||||
to:newline::@2
|
||||
newline::@2: scope:[newline] from newline::@3
|
||||
[275] newline::start#0 = *SAVMSC
|
||||
[276] memcpy::source#0 = newline::start#0 + $28
|
||||
[277] memcpy::destination#0 = (void*)newline::start#0
|
||||
[278] call memcpy
|
||||
to:newline::@4
|
||||
newline::@4: scope:[newline] from newline::@2
|
||||
[279] memset::str#0 = newline::start#0 + (word)$28*$17
|
||||
[280] memset::str#8 = (void*)memset::str#0
|
||||
[281] call memset
|
||||
to:newline::@5
|
||||
newline::@5: scope:[newline] from newline::@4
|
||||
[282] *ROWCRS = (byte)$18-1
|
||||
to:newline::@1
|
||||
newline::@1: scope:[newline] from newline newline::@5
|
||||
[283] phi()
|
||||
[284] call setcursor
|
||||
to:newline::@return
|
||||
newline::@return: scope:[newline] from newline::@1
|
||||
[285] return
|
||||
to:@return
|
||||
|
||||
word utoa_append(byte* utoa_append::buffer , word utoa_append::value , word utoa_append::sub)
|
||||
utoa_append: scope:[utoa_append] from utoa::@5
|
||||
[286] phi()
|
||||
to:utoa_append::@1
|
||||
utoa_append::@1: scope:[utoa_append] from utoa_append utoa_append::@2
|
||||
[287] utoa_append::digit#2 = phi( utoa_append/0, utoa_append::@2/utoa_append::digit#1 )
|
||||
[287] utoa_append::value#2 = phi( utoa_append/utoa_append::value#0, utoa_append::@2/utoa_append::value#1 )
|
||||
[288] if(utoa_append::value#2>=utoa_append::sub#0) goto utoa_append::@2
|
||||
to:utoa_append::@3
|
||||
utoa_append::@3: scope:[utoa_append] from utoa_append::@1
|
||||
[289] *utoa_append::buffer#0 = DIGITS[utoa_append::digit#2]
|
||||
to:utoa_append::@return
|
||||
utoa_append::@return: scope:[utoa_append] from utoa_append::@3
|
||||
[290] return
|
||||
to:@return
|
||||
utoa_append::@2: scope:[utoa_append] from utoa_append::@1
|
||||
[291] utoa_append::digit#1 = ++ utoa_append::digit#2
|
||||
[292] utoa_append::value#1 = utoa_append::value#2 - utoa_append::sub#0
|
||||
to:utoa_append::@1
|
||||
|
||||
dword ultoa_append(byte* ultoa_append::buffer , dword ultoa_append::value , dword ultoa_append::sub)
|
||||
ultoa_append: scope:[ultoa_append] from ultoa::@5
|
||||
[293] phi()
|
||||
to:ultoa_append::@1
|
||||
ultoa_append::@1: scope:[ultoa_append] from ultoa_append ultoa_append::@2
|
||||
[294] ultoa_append::digit#2 = phi( ultoa_append/0, ultoa_append::@2/ultoa_append::digit#1 )
|
||||
[294] ultoa_append::value#2 = phi( ultoa_append/ultoa_append::value#0, ultoa_append::@2/ultoa_append::value#1 )
|
||||
[295] if(ultoa_append::value#2>=ultoa_append::sub#0) goto ultoa_append::@2
|
||||
to:ultoa_append::@3
|
||||
ultoa_append::@3: scope:[ultoa_append] from ultoa_append::@1
|
||||
[296] *ultoa_append::buffer#0 = DIGITS[ultoa_append::digit#2]
|
||||
to:ultoa_append::@return
|
||||
ultoa_append::@return: scope:[ultoa_append] from ultoa_append::@3
|
||||
[297] return
|
||||
to:@return
|
||||
ultoa_append::@2: scope:[ultoa_append] from ultoa_append::@1
|
||||
[298] ultoa_append::digit#1 = ++ ultoa_append::digit#2
|
||||
[299] ultoa_append::value#1 = ultoa_append::value#2 - ultoa_append::sub#0
|
||||
to:ultoa_append::@1
|
||||
|
||||
byte* cursorLocation()
|
||||
cursorLocation: scope:[cursorLocation] from putchar setcursor
|
||||
[300] cursorLocation::$3 = (word)*ROWCRS
|
||||
[301] cursorLocation::$4 = cursorLocation::$3 << 2
|
||||
[302] cursorLocation::$5 = cursorLocation::$4 + cursorLocation::$3
|
||||
[303] cursorLocation::$0 = cursorLocation::$5 << 3
|
||||
[304] cursorLocation::$1 = *SAVMSC + cursorLocation::$0
|
||||
[305] cursorLocation::return#1 = cursorLocation::$1 + *COLCRS
|
||||
to:cursorLocation::@return
|
||||
cursorLocation::@return: scope:[cursorLocation] from cursorLocation
|
||||
[306] return
|
||||
to:@return
|
||||
|
||||
void* memcpy(void* memcpy::destination , void* memcpy::source , word memcpy::num)
|
||||
memcpy: scope:[memcpy] from newline::@2
|
||||
[307] memcpy::src_end#0 = (byte*)(void*)memcpy::source#0 + memcpy::num#0
|
||||
[308] memcpy::src#4 = (byte*)(void*)memcpy::source#0
|
||||
[309] memcpy::dst#4 = (byte*)memcpy::destination#0
|
||||
to:memcpy::@1
|
||||
memcpy::@1: scope:[memcpy] from memcpy memcpy::@2
|
||||
[310] memcpy::dst#2 = phi( memcpy/memcpy::dst#4, memcpy::@2/memcpy::dst#1 )
|
||||
[310] memcpy::src#2 = phi( memcpy/memcpy::src#4, memcpy::@2/memcpy::src#1 )
|
||||
[311] if(memcpy::src#2!=memcpy::src_end#0) goto memcpy::@2
|
||||
to:memcpy::@return
|
||||
memcpy::@return: scope:[memcpy] from memcpy::@1
|
||||
[312] return
|
||||
to:@return
|
||||
memcpy::@2: scope:[memcpy] from memcpy::@1
|
||||
[313] *memcpy::dst#2 = *memcpy::src#2
|
||||
[314] memcpy::dst#1 = ++ memcpy::dst#2
|
||||
[315] memcpy::src#1 = ++ memcpy::src#2
|
||||
to:memcpy::@1
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,354 @@
|
||||
const word* COLCRS = (word*) 85
|
||||
const nomodify byte* CRSINH = (byte*) 752
|
||||
const byte* DIGITS[] = "0123456789abcdef"atz
|
||||
const byte OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS = 1
|
||||
const nomodify byte** OLDADR = (byte**) 94
|
||||
const nomodify byte* OLDCHR = (byte*) 93
|
||||
const byte RADIX::BINARY = 2
|
||||
const byte RADIX::DECIMAL = $a
|
||||
const byte RADIX::HEXADECIMAL = $10
|
||||
const byte RADIX::OCTAL = 8
|
||||
const word* RADIX_DECIMAL_VALUES[] = { $2710, $3e8, $64, $a }
|
||||
const dword* RADIX_DECIMAL_VALUES_LONG[] = { $3b9aca00, $5f5e100, $989680, $f4240, $186a0, $2710, $3e8, $64, $a }
|
||||
const byte* ROWCRS = (byte*) 84
|
||||
const nomodify byte** SAVMSC = (byte**) 88
|
||||
const byte SIZEOF_STRUCT_PRINTF_BUFFER_NUMBER = $c
|
||||
const byte SIZEOF_WORD = 2
|
||||
void clrscr()
|
||||
void cputc(volatile byte cputc::c)
|
||||
volatile byte cputc::c loadstore zp[1]:161 7.750002500125E10
|
||||
byte cputc::convertToScreenCode1_return
|
||||
byte cputc::convertToScreenCode1_return#0 reg byte x 1.833333333336667E11
|
||||
byte* cputc::convertToScreenCode1_v
|
||||
const byte* cputc::convertToScreenCode1_v#0 convertToScreenCode1_v = &cputc::c
|
||||
void cputs(to_nomodify byte* cputs::s)
|
||||
byte cputs::c
|
||||
byte cputs::c#1 reg byte a 1.0000000001E10
|
||||
to_nomodify byte* cputs::s
|
||||
to_nomodify byte* cputs::s#0 s zp[2]:138 5.0000000005E9
|
||||
to_nomodify byte* cputs::s#26 s zp[2]:138 1.5000500002E10
|
||||
to_nomodify byte* cputs::s#27 s zp[2]:138 1000001.0
|
||||
byte* cursorLocation()
|
||||
word~ cursorLocation::$0 zp[2]:166 2.00000000000002E14
|
||||
byte*~ cursorLocation::$1 zp[2]:166 2.00000000000002E14
|
||||
word~ cursorLocation::$3 zp[2]:166 1.500000000000015E14
|
||||
word~ cursorLocation::$4 zp[2]:168 2.00000000000002E14
|
||||
word~ cursorLocation::$5 zp[2]:166 2.00000000000002E14
|
||||
byte* cursorLocation::return
|
||||
byte* cursorLocation::return#0 return zp[2]:166 2.000000000002E12
|
||||
byte* cursorLocation::return#1 return zp[2]:166 2.775000000000075E13
|
||||
byte* cursorLocation::return#3 return zp[2]:166 2.0000000000002E13
|
||||
const word* entries[] = { $78f, $7a4, $7c7, $591, $687, $601, $7c0, $621, $751, $730, $6b8, $791, $71f, $659, $6bf, $714, $6b2, $76c, $793, $78b, $79f, $6dc, $796, $64b, $7bb, $78a, $7cc, $7d0, $608, $6f4, $697, $6e0, $72c, $716, $69b, $719, $7ac, $76b, $629, $60b, $362, $618, $7c4, $641, $7b2, $6ca, $5e3, $683, $73b, $78d, $5eb, $740, $7b1, $744, $709, $7d7, $74a, $708, $6d5, $733, $6af, $5d7, $771, $2fb, $688, $742, $7c3, $5d4, $739, $7c9, $6c9, $752, $67a, $712, $681, $6e8, $79e, $757, $718, $74c, $7cb, $6e3, $6f7, $729, $7b0, $737, $6d4, $6bd, $763, $6db, $11e, $7b8, $7b9, $677, $710, $7c2, $6f3, $745, $7a1, $760, $700, $713, $750, $6fe, $72f, $7c1, $723, $732, $785, $6c7, $663, $71d, $71c, $7b5, $5fb, $6ea, $3b, $736, $78c, $773, $6c2, $3a5, $573, $6d9, $6d7, $169, $5fa, $6f6, $43f, $635, $789, $703, $717, $6c4, $6e5, $755, $6ba, $20e, $6ad, $6fd, $764, $779, $67e, $711, $686, $79b, $72b, $633, $6de, $7be, $7d9, $6dd, $29e, $7bf, $5f4, $756, $704, $7a0, $236, $782, $75a, $74e, $707, $6c3, $6bc, $70d, $7d3, $63c, $61e, $73d, $777, $741, $6cb, $6d0, $65b, $6c1, $6d1, $735, $62e, $75c, $75b, $795, $6e4, $695, $6ff, $72d, $6a1, $6ce, $6f5, $79c, $754, $7c5, $66b, $74f, $772, $6be, $7a6, $5de, $787, $79a }
|
||||
void gotoxy(byte gotoxy::x , byte gotoxy::y)
|
||||
byte gotoxy::x
|
||||
const byte gotoxy::x#1 x = 0
|
||||
byte gotoxy::y
|
||||
const byte gotoxy::y#1 y = 0
|
||||
void main()
|
||||
word~ main::$21 zp[2]:151 667.3333333333334
|
||||
word~ main::$22 zp[2]:155 2002.0
|
||||
word~ main::$34 zp[2]:142 14.428571428571429
|
||||
word~ main::$35 zp[2]:140 13.931034482758621
|
||||
word~ main::$41 zp[2]:142 100.1
|
||||
word~ main::$42 zp[2]:149 85.19148936170212
|
||||
word~ main::$43 zp[2]:140 108.21621621621621
|
||||
word*~ main::$47 zp[2]:157 101.0
|
||||
word*~ main::$48 zp[2]:159 202.0
|
||||
word*~ main::$49 zp[2]:138 202.0
|
||||
word*~ main::$50 zp[2]:138 202.0
|
||||
word*~ main::$51 zp[2]:142 202.0
|
||||
word*~ main::$52 zp[2]:140 202.0
|
||||
word*~ main::$53 zp[2]:151 1001.0
|
||||
word*~ main::$54 zp[2]:153 2002.0
|
||||
word*~ main::$55 zp[2]:155 2002.0
|
||||
word*~ main::$56 zp[2]:138 2002.0
|
||||
word*~ main::$57 zp[2]:138 2002.0
|
||||
word*~ main::$58 zp[2]:138 2002.0
|
||||
word*~ main::$59 zp[2]:142 2002.0
|
||||
word*~ main::$60 zp[2]:140 2002.0
|
||||
word*~ main::$61 zp[2]:140 2002.0
|
||||
word~ main::$8 zp[2]:157 202.0
|
||||
word main::i
|
||||
word main::i#1 i zp[2]:128 22.0
|
||||
word main::i#2 i zp[2]:128 5.125
|
||||
word main::i1
|
||||
word main::i1#1 i1 zp[2]:130 22.0
|
||||
word main::i1#2 i1 zp[2]:130 29.228571428571428
|
||||
word main::j
|
||||
word main::j#0 j zp[2]:136 22.0
|
||||
word main::j#1 j zp[2]:136 202.0
|
||||
word main::j#10 j zp[2]:136 12.285714285714286
|
||||
word main::j1
|
||||
word main::j1#0 j1 zp[2]:132 22.0
|
||||
word main::j1#1 j1 zp[2]:132 202.0
|
||||
word main::j1#2 j1 zp[2]:132 37.765625
|
||||
word main::k
|
||||
word main::k#0 k zp[2]:134 202.0
|
||||
word main::k#1 k zp[2]:134 2002.0
|
||||
word main::k#10 k zp[2]:134 85.10000000000001
|
||||
dword main::mul
|
||||
dword main::mul#0 mul zp[4]:144 101.0
|
||||
dword main::mul1
|
||||
dword main::mul1#0 mul1 zp[4]:144 2002.0
|
||||
dword main::mul2
|
||||
dword main::mul2#0 mul2 zp[4]:144 1001.0
|
||||
word main::num_entries
|
||||
const word main::num_entries#0 num_entries = $c8*SIZEOF_WORD/SIZEOF_WORD
|
||||
const byte* main::s[$19] = "looking a+b=2020 within "at
|
||||
const byte* main::s1[$a] = " entries
|
||||
"at
|
||||
const byte* main::s10[7] = "=2020
|
||||
"at
|
||||
const byte* main::s11[$c] = "multiplied "at
|
||||
const byte* main::s2[$1c] = "
|
||||
looking a+b+c=2020 within "at
|
||||
const byte* main::s4[2] = "."at
|
||||
const byte* main::s5[2] = "
|
||||
"at
|
||||
const byte* main::s6[$e] = "match found ["at
|
||||
const byte* main::s7[2] = "]"at
|
||||
const byte* main::s8[3] = "+["at
|
||||
void* memcpy(void* memcpy::destination , void* memcpy::source , word memcpy::num)
|
||||
void* memcpy::destination
|
||||
void* memcpy::destination#0 destination zp[2]:153 3.333333333336667E11
|
||||
byte* memcpy::dst
|
||||
byte* memcpy::dst#1 dst zp[2]:153 1.0E18
|
||||
byte* memcpy::dst#2 dst zp[2]:153 1.00000333333333325E18
|
||||
byte* memcpy::dst#4 dst zp[2]:153 2.0000000000002E13
|
||||
word memcpy::num
|
||||
const word memcpy::num#0 num = (word)$28*$17
|
||||
void* memcpy::return
|
||||
void* memcpy::source
|
||||
byte* memcpy::source#0 source zp[2]:151 3.333333333336667E11
|
||||
byte* memcpy::src
|
||||
byte* memcpy::src#1 src zp[2]:151 2.0E18
|
||||
byte* memcpy::src#2 src zp[2]:151 1.0000025E18
|
||||
byte* memcpy::src#4 src zp[2]:151 1.0000000000001E13
|
||||
byte* memcpy::src_end
|
||||
byte* memcpy::src_end#0 src_end zp[2]:168 1.2500125E17
|
||||
void* memset(void* memset::str , byte memset::c , word memset::num)
|
||||
byte memset::c
|
||||
byte* memset::dst
|
||||
byte* memset::dst#1 dst zp[2]:155 2.0E18
|
||||
byte* memset::dst#2 dst zp[2]:155 1.3333366666666665E18
|
||||
byte* memset::dst#4 dst zp[2]:155 2.0000000000002E13
|
||||
byte* memset::end
|
||||
byte* memset::end#0 end zp[2]:151 1.66668333333333312E17
|
||||
word memset::num
|
||||
word memset::num#2 num zp[2]:151 1.0000000000001E13
|
||||
void* memset::return
|
||||
void* memset::str
|
||||
byte* memset::str#0 str zp[2]:155 1.000000000001E12
|
||||
void* memset::str#3 str zp[2]:155 3.333333333373334E11
|
||||
void* memset::str#7 str zp[2]:155 22.0
|
||||
void* memset::str#8 str zp[2]:155 2.000000000002E12
|
||||
dword mul16u(word mul16u::a , word mul16u::b)
|
||||
byte~ mul16u::$1 reg byte a 2.00000002E8
|
||||
word mul16u::a
|
||||
word mul16u::a#0 a zp[2]:142 1.00000001E8
|
||||
word mul16u::a#1 a zp[2]:142 67.33333333333333
|
||||
word mul16u::a#2 a zp[2]:142 667.3333333333334
|
||||
word mul16u::a#3 a zp[2]:142 667.3333333333334
|
||||
word mul16u::a#4 a zp[2]:142 6.666833416666667E7
|
||||
word mul16u::a#7 a zp[2]:142 6052.0
|
||||
word mul16u::b
|
||||
word mul16u::b#0 b zp[2]:140 202.0
|
||||
word mul16u::b#1 b zp[2]:140 2002.0
|
||||
word mul16u::b#2 b zp[2]:140 2002.0
|
||||
word mul16u::b#3 b zp[2]:140 2103.0
|
||||
dword mul16u::mb
|
||||
dword mul16u::mb#0 mb zp[4]:162 20002.0
|
||||
dword mul16u::mb#1 mb zp[4]:162 2.00000002E8
|
||||
dword mul16u::mb#2 mb zp[4]:162 4.2858572E7
|
||||
dword mul16u::res
|
||||
dword mul16u::res#1 res zp[4]:144 2.00000002E8
|
||||
dword mul16u::res#2 res zp[4]:144 3.750026325E7
|
||||
dword mul16u::res#6 res zp[4]:144 1.00000001E8
|
||||
dword mul16u::return
|
||||
dword mul16u::return#2 return zp[4]:144 202.0
|
||||
dword mul16u::return#3 return zp[4]:144 2002.0
|
||||
dword mul16u::return#4 return zp[4]:144 2002.0
|
||||
void newline()
|
||||
byte* newline::start
|
||||
byte* newline::start#0 start zp[2]:155 7.5000000000075E11
|
||||
struct printf_buffer_number printf_buffer loadstore mem[12] = {}
|
||||
void printf_number_buffer(byte printf_number_buffer::buffer_sign , byte* printf_number_buffer::buffer_digits , byte printf_number_buffer::format_min_length , byte printf_number_buffer::format_justify_left , byte printf_number_buffer::format_sign_always , byte printf_number_buffer::format_zero_padding , byte printf_number_buffer::format_upper_case , byte printf_number_buffer::format_radix)
|
||||
struct printf_buffer_number printf_number_buffer::buffer
|
||||
byte* printf_number_buffer::buffer_digits
|
||||
byte printf_number_buffer::buffer_sign
|
||||
byte printf_number_buffer::buffer_sign#0 reg byte a 20002.0
|
||||
byte printf_number_buffer::buffer_sign#1 reg byte a 20002.0
|
||||
byte printf_number_buffer::buffer_sign#10 reg byte a 110002.0
|
||||
struct printf_format_number printf_number_buffer::format
|
||||
byte printf_number_buffer::format_justify_left
|
||||
byte printf_number_buffer::format_min_length
|
||||
byte printf_number_buffer::format_radix
|
||||
byte printf_number_buffer::format_sign_always
|
||||
byte printf_number_buffer::format_upper_case
|
||||
byte printf_number_buffer::format_zero_padding
|
||||
signed byte printf_number_buffer::len
|
||||
signed byte printf_number_buffer::padding
|
||||
void printf_uint(word printf_uint::uvalue , byte printf_uint::format_min_length , byte printf_uint::format_justify_left , byte printf_uint::format_sign_always , byte printf_uint::format_zero_padding , byte printf_uint::format_upper_case , byte printf_uint::format_radix)
|
||||
struct printf_format_number printf_uint::format
|
||||
byte printf_uint::format_justify_left
|
||||
byte printf_uint::format_min_length
|
||||
byte printf_uint::format_radix
|
||||
byte printf_uint::format_sign_always
|
||||
byte printf_uint::format_upper_case
|
||||
byte printf_uint::format_zero_padding
|
||||
word printf_uint::uvalue
|
||||
word printf_uint::uvalue#10 uvalue zp[2]:138 2002.0
|
||||
word printf_uint::uvalue#11 uvalue zp[2]:138 2002.0
|
||||
word printf_uint::uvalue#12 uvalue zp[2]:138 8205.5
|
||||
word printf_uint::uvalue#2 uvalue zp[2]:138 202.0
|
||||
word printf_uint::uvalue#3 uvalue zp[2]:138 202.0
|
||||
word printf_uint::uvalue#4 uvalue zp[2]:138 202.0
|
||||
word printf_uint::uvalue#5 uvalue zp[2]:138 202.0
|
||||
word printf_uint::uvalue#6 uvalue zp[2]:138 2002.0
|
||||
word printf_uint::uvalue#7 uvalue zp[2]:138 2002.0
|
||||
word printf_uint::uvalue#8 uvalue zp[2]:138 2002.0
|
||||
word printf_uint::uvalue#9 uvalue zp[2]:138 2002.0
|
||||
void printf_ulong(dword printf_ulong::uvalue , byte printf_ulong::format_min_length , byte printf_ulong::format_justify_left , byte printf_ulong::format_sign_always , byte printf_ulong::format_zero_padding , byte printf_ulong::format_upper_case , byte printf_ulong::format_radix)
|
||||
struct printf_format_number printf_ulong::format
|
||||
byte printf_ulong::format_justify_left
|
||||
byte printf_ulong::format_min_length
|
||||
byte printf_ulong::format_radix
|
||||
byte printf_ulong::format_sign_always
|
||||
byte printf_ulong::format_upper_case
|
||||
byte printf_ulong::format_zero_padding
|
||||
dword printf_ulong::uvalue
|
||||
dword printf_ulong::uvalue#0 uvalue zp[4]:144 202.0
|
||||
dword printf_ulong::uvalue#1 uvalue zp[4]:144 2002.0
|
||||
dword printf_ulong::uvalue#2 uvalue zp[4]:144 5551.5
|
||||
void putchar(byte putchar::code)
|
||||
byte putchar::code
|
||||
byte* putchar::loc
|
||||
byte* putchar::loc#0 loc zp[2]:166 1.000000000001E12
|
||||
byte putchar::newChar
|
||||
byte putchar::newChar#0 reg byte a 1.5000000000015E12
|
||||
const byte* rawmap[$100] = kickasm {{ .var ht = Hashtable().put(0,64, 1,0, 2,32, 3,96) // the table for converting bit 6,7 into ora value
|
||||
.for(var i=0; i<256; i++) {
|
||||
.var idx = (i & $60) / 32
|
||||
.var mask = i & $9f
|
||||
.byte mask | ht.get(idx)
|
||||
}
|
||||
}}
|
||||
void setcursor()
|
||||
byte setcursor::c
|
||||
byte setcursor::c#0 reg byte x 7.50000000000075E12
|
||||
byte setcursor::c#1 reg byte a 2.0000000000002E13
|
||||
byte* setcursor::loc
|
||||
byte* setcursor::loc#0 loc zp[2]:166 1.0000000000001E13
|
||||
void ultoa(dword ultoa::value , byte* ultoa::buffer , byte ultoa::radix)
|
||||
byte~ ultoa::$10 reg byte a 2.000000002E9
|
||||
byte~ ultoa::$11 reg byte a 200002.0
|
||||
byte* ultoa::buffer
|
||||
byte* ultoa::buffer#11 buffer zp[2]:155 2.8572857185714287E8
|
||||
byte* ultoa::buffer#14 buffer zp[2]:155 1.5000000015E9
|
||||
byte* ultoa::buffer#3 buffer zp[2]:155 200002.0
|
||||
byte* ultoa::buffer#4 buffer zp[2]:155 2.000000002E9
|
||||
byte ultoa::digit
|
||||
byte ultoa::digit#1 digit zp[1]:148 2.000000002E9
|
||||
byte ultoa::digit#2 digit zp[1]:148 2.85714286E8
|
||||
dword ultoa::digit_value
|
||||
dword ultoa::digit_value#0 digit_value zp[4]:162 6.000000005999999E8
|
||||
dword* ultoa::digit_values
|
||||
byte ultoa::max_digits
|
||||
byte ultoa::radix
|
||||
byte ultoa::started
|
||||
byte ultoa::started#2 reg byte x 5.000000005E8
|
||||
byte ultoa::started#4 reg byte x 1.000000001E9
|
||||
dword ultoa::value
|
||||
dword ultoa::value#0 value zp[4]:144 1.000000001E9
|
||||
dword ultoa::value#1 value zp[4]:144 55001.0
|
||||
dword ultoa::value#2 value zp[4]:144 5.714428578571429E8
|
||||
dword ultoa::value#6 value zp[4]:144 1.5000000015E9
|
||||
dword ultoa_append(byte* ultoa_append::buffer , dword ultoa_append::value , dword ultoa_append::sub)
|
||||
byte* ultoa_append::buffer
|
||||
byte* ultoa_append::buffer#0 buffer zp[2]:155 1.37500000025E9
|
||||
byte ultoa_append::digit
|
||||
byte ultoa_append::digit#1 reg byte x 1.000000000000001E15
|
||||
byte ultoa_append::digit#2 reg byte x 1.0000050000000015E15
|
||||
dword ultoa_append::return
|
||||
dword ultoa_append::return#0 return zp[4]:144 2.000000002E9
|
||||
dword ultoa_append::sub
|
||||
dword ultoa_append::sub#0 sub zp[4]:162 3.333335000000005E14
|
||||
dword ultoa_append::value
|
||||
dword ultoa_append::value#0 value zp[4]:144 3.666666667333333E9
|
||||
dword ultoa_append::value#1 value zp[4]:144 2.000000000000002E15
|
||||
dword ultoa_append::value#2 value zp[4]:144 5.0000183333333425E14
|
||||
void utoa(word utoa::value , byte* utoa::buffer , byte utoa::radix)
|
||||
byte~ utoa::$10 reg byte a 2.000000002E9
|
||||
byte~ utoa::$11 reg byte a 200002.0
|
||||
byte* utoa::buffer
|
||||
byte* utoa::buffer#11 buffer zp[2]:151 2.8572857185714287E8
|
||||
byte* utoa::buffer#14 buffer zp[2]:151 1.5000000015E9
|
||||
byte* utoa::buffer#3 buffer zp[2]:151 200002.0
|
||||
byte* utoa::buffer#4 buffer zp[2]:151 2.000000002E9
|
||||
byte utoa::digit
|
||||
byte utoa::digit#1 digit zp[1]:148 2.000000002E9
|
||||
byte utoa::digit#2 digit zp[1]:148 2.85714286E8
|
||||
word utoa::digit_value
|
||||
word utoa::digit_value#0 digit_value zp[2]:166 6.000000005999999E8
|
||||
word* utoa::digit_values
|
||||
byte utoa::max_digits
|
||||
byte utoa::radix
|
||||
byte utoa::started
|
||||
byte utoa::started#2 reg byte x 5.000000005E8
|
||||
byte utoa::started#4 reg byte x 1.000000001E9
|
||||
word utoa::value
|
||||
word utoa::value#0 value zp[2]:138 1.000000001E9
|
||||
word utoa::value#1 value zp[2]:138 55001.0
|
||||
word utoa::value#2 value zp[2]:138 5.714428578571429E8
|
||||
word utoa::value#6 value zp[2]:138 1.5000000015E9
|
||||
word utoa_append(byte* utoa_append::buffer , word utoa_append::value , word utoa_append::sub)
|
||||
byte* utoa_append::buffer
|
||||
byte* utoa_append::buffer#0 buffer zp[2]:151 1.37500000025E9
|
||||
byte utoa_append::digit
|
||||
byte utoa_append::digit#1 reg byte x 1.000000000000001E15
|
||||
byte utoa_append::digit#2 reg byte x 1.0000050000000015E15
|
||||
word utoa_append::return
|
||||
word utoa_append::return#0 return zp[2]:138 2.000000002E9
|
||||
word utoa_append::sub
|
||||
word utoa_append::sub#0 sub zp[2]:166 3.333335000000005E14
|
||||
word utoa_append::value
|
||||
word utoa_append::value#0 value zp[2]:138 3.666666667333333E9
|
||||
word utoa_append::value#1 value zp[2]:138 2.000000000000002E15
|
||||
word utoa_append::value#2 value zp[2]:138 5.0000183333333425E14
|
||||
|
||||
zp[2]:128 [ main::i#2 main::i#1 ]
|
||||
zp[2]:130 [ main::i1#2 main::i1#1 ]
|
||||
zp[2]:132 [ main::j1#2 main::j1#0 main::j1#1 ]
|
||||
zp[2]:134 [ main::k#10 main::k#0 main::k#1 ]
|
||||
zp[2]:136 [ main::j#10 main::j#0 main::j#1 ]
|
||||
zp[2]:138 [ printf_uint::uvalue#12 printf_uint::uvalue#2 printf_uint::uvalue#3 printf_uint::uvalue#4 printf_uint::uvalue#5 printf_uint::uvalue#6 printf_uint::uvalue#7 printf_uint::uvalue#8 printf_uint::uvalue#9 printf_uint::uvalue#10 printf_uint::uvalue#11 utoa::value#2 utoa::value#6 utoa::value#1 utoa::value#0 main::$56 main::$57 main::$58 main::$49 main::$50 utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 utoa_append::return#0 cputs::s#26 cputs::s#27 cputs::s#0 ]
|
||||
zp[2]:140 [ mul16u::b#3 mul16u::b#0 mul16u::b#1 mul16u::b#2 main::$60 main::$61 main::$52 main::$43 main::$35 ]
|
||||
zp[2]:142 [ mul16u::a#4 mul16u::a#7 mul16u::a#1 mul16u::a#2 mul16u::a#3 mul16u::a#0 main::$59 main::$51 main::$41 main::$34 ]
|
||||
zp[4]:144 [ mul16u::res#2 mul16u::res#6 mul16u::res#1 mul16u::return#3 mul16u::return#4 mul16u::return#2 printf_ulong::uvalue#2 printf_ulong::uvalue#0 printf_ulong::uvalue#1 ultoa::value#2 ultoa::value#6 ultoa::value#1 ultoa::value#0 main::mul2#0 main::mul#0 main::mul1#0 ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 ultoa_append::return#0 ]
|
||||
reg byte x [ utoa::started#2 utoa::started#4 ]
|
||||
reg byte a [ printf_number_buffer::buffer_sign#10 printf_number_buffer::buffer_sign#1 printf_number_buffer::buffer_sign#0 ]
|
||||
zp[1]:148 [ ultoa::digit#2 ultoa::digit#1 utoa::digit#2 utoa::digit#1 ]
|
||||
reg byte x [ ultoa::started#2 ultoa::started#4 ]
|
||||
reg byte x [ utoa_append::digit#2 utoa_append::digit#1 ]
|
||||
reg byte x [ ultoa_append::digit#2 ultoa_append::digit#1 ]
|
||||
zp[2]:149 [ main::$42 ]
|
||||
zp[2]:151 [ main::$53 main::$21 memcpy::src#2 memcpy::src#4 memcpy::src#1 memcpy::source#0 utoa::buffer#11 utoa::buffer#14 utoa::buffer#4 utoa::buffer#3 utoa_append::buffer#0 memset::num#2 memset::end#0 ]
|
||||
zp[2]:153 [ main::$54 memcpy::dst#2 memcpy::dst#4 memcpy::dst#1 memcpy::destination#0 ]
|
||||
zp[2]:155 [ main::$55 main::$22 ultoa::buffer#11 ultoa::buffer#14 ultoa::buffer#4 ultoa::buffer#3 ultoa_append::buffer#0 memset::str#3 memset::str#7 memset::str#8 memset::dst#2 memset::dst#4 memset::dst#1 memset::str#0 newline::start#0 ]
|
||||
zp[2]:157 [ main::$47 main::$8 ]
|
||||
zp[2]:159 [ main::$48 ]
|
||||
reg byte a [ cputs::c#1 ]
|
||||
zp[1]:161 [ cputc::c ]
|
||||
reg byte a [ mul16u::$1 ]
|
||||
reg byte x [ cputc::convertToScreenCode1_return#0 ]
|
||||
reg byte a [ utoa::$11 ]
|
||||
reg byte a [ utoa::$10 ]
|
||||
reg byte a [ ultoa::$11 ]
|
||||
reg byte a [ ultoa::$10 ]
|
||||
zp[4]:162 [ ultoa::digit_value#0 ultoa_append::sub#0 mul16u::mb#2 mul16u::mb#0 mul16u::mb#1 ]
|
||||
zp[2]:166 [ cursorLocation::return#3 setcursor::loc#0 cursorLocation::return#1 cursorLocation::return#0 putchar::loc#0 cursorLocation::$0 cursorLocation::$1 cursorLocation::$3 cursorLocation::$5 utoa::digit_value#0 utoa_append::sub#0 ]
|
||||
reg byte x [ setcursor::c#0 ]
|
||||
reg byte a [ setcursor::c#1 ]
|
||||
reg byte a [ putchar::newChar#0 ]
|
||||
zp[2]:168 [ memcpy::src_end#0 cursorLocation::$4 ]
|
||||
mem[12] [ printf_buffer ]
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,507 @@
|
||||
|
||||
void __start()
|
||||
__start: scope:[__start] from
|
||||
[0] phi()
|
||||
to:__start::__init1
|
||||
__start::__init1: scope:[__start] from __start
|
||||
[1] conio_cursor_x = 0
|
||||
[2] conio_cursor_y = 0
|
||||
[3] conio_line_text = DEFAULT_SCREEN
|
||||
[4] conio_line_color = COLORRAM
|
||||
[5] call conio_c64_init
|
||||
to:__start::@1
|
||||
__start::@1: scope:[__start] from __start::__init1
|
||||
[6] phi()
|
||||
[7] call main
|
||||
to:__start::@return
|
||||
__start::@return: scope:[__start] from __start::@1
|
||||
[8] return
|
||||
to:@return
|
||||
|
||||
void conio_c64_init()
|
||||
conio_c64_init: scope:[conio_c64_init] from __start::__init1
|
||||
[9] conio_c64_init::line#0 = *conio_c64_init::BASIC_CURSOR_LINE
|
||||
[10] if(conio_c64_init::line#0<$19) goto conio_c64_init::@2
|
||||
to:conio_c64_init::@1
|
||||
conio_c64_init::@2: scope:[conio_c64_init] from conio_c64_init
|
||||
[11] phi()
|
||||
to:conio_c64_init::@1
|
||||
conio_c64_init::@1: scope:[conio_c64_init] from conio_c64_init conio_c64_init::@2
|
||||
[12] conio_c64_init::line#2 = phi( conio_c64_init::@2/conio_c64_init::line#0, conio_c64_init/(byte)$19-1 )
|
||||
[13] gotoxy::y#2 = conio_c64_init::line#2
|
||||
[14] call gotoxy
|
||||
to:conio_c64_init::@return
|
||||
conio_c64_init::@return: scope:[conio_c64_init] from conio_c64_init::@1
|
||||
[15] return
|
||||
to:@return
|
||||
|
||||
void main()
|
||||
main: scope:[main] from __start::@1
|
||||
[16] phi()
|
||||
[17] call clrscr
|
||||
to:main::@20
|
||||
main::@20: scope:[main] from main
|
||||
[18] main::pwd = passwords
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main::@15 main::@20
|
||||
[19] main::invalid_b#11 = phi( main::@15/main::invalid_b#30, main::@20/0 )
|
||||
[19] main::valid_b#11 = phi( main::@15/main::valid_b#28, main::@20/0 )
|
||||
[19] main::total#10 = phi( main::@15/main::total#1, main::@20/0 )
|
||||
[19] main::invalid_a#11 = phi( main::@15/main::invalid_a#16, main::@20/0 )
|
||||
[19] main::valid_a#11 = phi( main::@15/main::valid_a#15, main::@20/0 )
|
||||
[20] if(0!=*main::pwd) goto main::@2
|
||||
to:main::@3
|
||||
main::@3: scope:[main] from main::@1
|
||||
[21] phi()
|
||||
[22] call cputs
|
||||
to:main::@23
|
||||
main::@23: scope:[main] from main::@3
|
||||
[23] printf_uint::uvalue#0 = main::valid_a#11
|
||||
[24] call printf_uint
|
||||
to:main::@24
|
||||
main::@24: scope:[main] from main::@23
|
||||
[25] phi()
|
||||
[26] call cputs
|
||||
to:main::@25
|
||||
main::@25: scope:[main] from main::@24
|
||||
[27] printf_uint::uvalue#1 = main::invalid_a#11
|
||||
[28] call printf_uint
|
||||
to:main::@26
|
||||
main::@26: scope:[main] from main::@25
|
||||
[29] phi()
|
||||
[30] call cputs
|
||||
to:main::@27
|
||||
main::@27: scope:[main] from main::@26
|
||||
[31] printf_uint::uvalue#2 = main::total#10
|
||||
[32] call printf_uint
|
||||
to:main::@28
|
||||
main::@28: scope:[main] from main::@27
|
||||
[33] phi()
|
||||
[34] call cputs
|
||||
to:main::@29
|
||||
main::@29: scope:[main] from main::@28
|
||||
[35] phi()
|
||||
[36] call cputs
|
||||
to:main::@30
|
||||
main::@30: scope:[main] from main::@29
|
||||
[37] printf_uint::uvalue#3 = main::valid_b#11
|
||||
[38] call printf_uint
|
||||
to:main::@31
|
||||
main::@31: scope:[main] from main::@30
|
||||
[39] phi()
|
||||
[40] call cputs
|
||||
to:main::@32
|
||||
main::@32: scope:[main] from main::@31
|
||||
[41] printf_uint::uvalue#4 = main::invalid_b#11
|
||||
[42] call printf_uint
|
||||
to:main::@33
|
||||
main::@33: scope:[main] from main::@32
|
||||
[43] phi()
|
||||
[44] call cputs
|
||||
to:main::@34
|
||||
main::@34: scope:[main] from main::@33
|
||||
[45] printf_uint::uvalue#5 = main::total#10
|
||||
[46] call printf_uint
|
||||
to:main::@35
|
||||
main::@35: scope:[main] from main::@34
|
||||
[47] phi()
|
||||
[48] call cputs
|
||||
to:main::@19
|
||||
main::@19: scope:[main] from main::@19 main::@35
|
||||
[49] phi()
|
||||
to:main::@19
|
||||
main::@2: scope:[main] from main::@1
|
||||
[50] strtouc::str#0 = main::pwd
|
||||
[51] call strtouc
|
||||
[52] strtouc::return#0 = strtouc::val#3
|
||||
to:main::@21
|
||||
main::@21: scope:[main] from main::@2
|
||||
[53] main::min#0 = strtouc::return#0
|
||||
[54] main::pwd = ++ main::pwd
|
||||
[55] strtouc::str#1 = main::pwd
|
||||
[56] call strtouc
|
||||
[57] strtouc::return#1 = strtouc::val#3
|
||||
to:main::@22
|
||||
main::@22: scope:[main] from main::@21
|
||||
[58] main::max#0 = strtouc::return#1
|
||||
[59] main::pwd = ++ main::pwd
|
||||
[60] main::ch#0 = *main::pwd
|
||||
[61] main::pwd = main::pwd + 3
|
||||
[62] main::$5 = main::min#0 - 1
|
||||
[63] if(main::pwd[main::$5]!=main::ch#0) goto main::@4
|
||||
to:main::@16
|
||||
main::@16: scope:[main] from main::@22
|
||||
[64] phi()
|
||||
to:main::@4
|
||||
main::@4: scope:[main] from main::@16 main::@22
|
||||
[65] main::count_b#4 = phi( main::@16/1, main::@22/0 )
|
||||
[66] main::$8 = main::max#0 - 1
|
||||
[67] if(main::pwd[main::$8]!=main::ch#0) goto main::@5
|
||||
to:main::@17
|
||||
main::@17: scope:[main] from main::@4
|
||||
[68] main::count_b#2 = ++ main::count_b#4
|
||||
to:main::@5
|
||||
main::@5: scope:[main] from main::@17 main::@4
|
||||
[69] main::count_b#11 = phi( main::@17/main::count_b#2, main::@4/main::count_b#4 )
|
||||
to:main::@6
|
||||
main::@6: scope:[main] from main::@5 main::@9
|
||||
[70] main::count_a#2 = phi( main::@5/0, main::@9/main::count_a#6 )
|
||||
[71] if(0!=*main::pwd) goto main::@7
|
||||
to:main::@8
|
||||
main::@8: scope:[main] from main::@6
|
||||
[72] if(main::count_a#2<main::min#0) goto main::@11
|
||||
to:main::@36
|
||||
main::@36: scope:[main] from main::@8
|
||||
[73] if(main::count_a#2<=main::max#0) goto main::@12
|
||||
to:main::@11
|
||||
main::@11: scope:[main] from main::@36 main::@8
|
||||
[74] main::invalid_a#1 = ++ main::invalid_a#11
|
||||
to:main::@13
|
||||
main::@13: scope:[main] from main::@11 main::@12
|
||||
[75] main::invalid_a#16 = phi( main::@11/main::invalid_a#1, main::@12/main::invalid_a#11 )
|
||||
[75] main::valid_a#15 = phi( main::@11/main::valid_a#11, main::@12/main::valid_a#1 )
|
||||
[76] if(main::count_b#11==1) goto main::@14
|
||||
to:main::@18
|
||||
main::@18: scope:[main] from main::@13
|
||||
[77] main::invalid_b#1 = ++ main::invalid_b#11
|
||||
to:main::@15
|
||||
main::@15: scope:[main] from main::@14 main::@18
|
||||
[78] main::invalid_b#30 = phi( main::@14/main::invalid_b#11, main::@18/main::invalid_b#1 )
|
||||
[78] main::valid_b#28 = phi( main::@14/main::valid_b#1, main::@18/main::valid_b#11 )
|
||||
[79] main::total#1 = ++ main::total#10
|
||||
[80] main::pwd = ++ main::pwd
|
||||
to:main::@1
|
||||
main::@14: scope:[main] from main::@13
|
||||
[81] main::valid_b#1 = ++ main::valid_b#11
|
||||
to:main::@15
|
||||
main::@12: scope:[main] from main::@36
|
||||
[82] main::valid_a#1 = ++ main::valid_a#11
|
||||
to:main::@13
|
||||
main::@7: scope:[main] from main::@6
|
||||
[83] if(*main::pwd!=main::ch#0) goto main::@9
|
||||
to:main::@10
|
||||
main::@10: scope:[main] from main::@7
|
||||
[84] main::count_a#1 = ++ main::count_a#2
|
||||
to:main::@9
|
||||
main::@9: scope:[main] from main::@10 main::@7
|
||||
[85] main::count_a#6 = phi( main::@10/main::count_a#1, main::@7/main::count_a#2 )
|
||||
[86] main::pwd = ++ main::pwd
|
||||
to:main::@6
|
||||
|
||||
void gotoxy(byte gotoxy::x , byte gotoxy::y)
|
||||
gotoxy: scope:[gotoxy] from conio_c64_init::@1
|
||||
[87] if(gotoxy::y#2<$19+1) goto gotoxy::@3
|
||||
to:gotoxy::@1
|
||||
gotoxy::@3: scope:[gotoxy] from gotoxy
|
||||
[88] phi()
|
||||
to:gotoxy::@1
|
||||
gotoxy::@1: scope:[gotoxy] from gotoxy gotoxy::@3
|
||||
[89] gotoxy::y#4 = phi( gotoxy::@3/gotoxy::y#2, gotoxy/0 )
|
||||
to:gotoxy::@2
|
||||
gotoxy::@2: scope:[gotoxy] from gotoxy::@1
|
||||
[90] conio_cursor_x = gotoxy::x#2
|
||||
[91] conio_cursor_y = gotoxy::y#4
|
||||
[92] gotoxy::$7 = (word)gotoxy::y#4
|
||||
[93] gotoxy::$8 = gotoxy::$7 << 2
|
||||
[94] gotoxy::$9 = gotoxy::$8 + gotoxy::$7
|
||||
[95] gotoxy::line_offset#0 = gotoxy::$9 << 3
|
||||
[96] gotoxy::$5 = DEFAULT_SCREEN + gotoxy::line_offset#0
|
||||
[97] conio_line_text = gotoxy::$5
|
||||
[98] gotoxy::$6 = COLORRAM + gotoxy::line_offset#0
|
||||
[99] conio_line_color = gotoxy::$6
|
||||
to:gotoxy::@return
|
||||
gotoxy::@return: scope:[gotoxy] from gotoxy::@2
|
||||
[100] return
|
||||
to:@return
|
||||
|
||||
void clrscr()
|
||||
clrscr: scope:[clrscr] from main
|
||||
[101] phi()
|
||||
to:clrscr::@1
|
||||
clrscr::@1: scope:[clrscr] from clrscr clrscr::@5
|
||||
[102] clrscr::line_cols#5 = phi( clrscr/COLORRAM, clrscr::@5/clrscr::line_cols#1 )
|
||||
[102] clrscr::line_text#5 = phi( clrscr/DEFAULT_SCREEN, clrscr::@5/clrscr::line_text#1 )
|
||||
[102] clrscr::l#2 = phi( clrscr/0, clrscr::@5/clrscr::l#1 )
|
||||
[103] if(clrscr::l#2<$19) goto clrscr::@3
|
||||
to:clrscr::@2
|
||||
clrscr::@2: scope:[clrscr] from clrscr::@1
|
||||
[104] conio_cursor_x = 0
|
||||
[105] conio_cursor_y = 0
|
||||
[106] conio_line_text = DEFAULT_SCREEN
|
||||
[107] conio_line_color = COLORRAM
|
||||
to:clrscr::@return
|
||||
clrscr::@return: scope:[clrscr] from clrscr::@2
|
||||
[108] return
|
||||
to:@return
|
||||
clrscr::@3: scope:[clrscr] from clrscr::@1 clrscr::@4
|
||||
[109] clrscr::c#2 = phi( clrscr::@1/0, clrscr::@4/clrscr::c#1 )
|
||||
[110] if(clrscr::c#2<$28) goto clrscr::@4
|
||||
to:clrscr::@5
|
||||
clrscr::@5: scope:[clrscr] from clrscr::@3
|
||||
[111] clrscr::line_text#1 = clrscr::line_text#5 + $28
|
||||
[112] clrscr::line_cols#1 = clrscr::line_cols#5 + $28
|
||||
[113] clrscr::l#1 = ++ clrscr::l#2
|
||||
to:clrscr::@1
|
||||
clrscr::@4: scope:[clrscr] from clrscr::@3
|
||||
[114] clrscr::line_text#5[clrscr::c#2] = ' '
|
||||
[115] clrscr::line_cols#5[clrscr::c#2] = LIGHT_BLUE
|
||||
[116] clrscr::c#1 = ++ clrscr::c#2
|
||||
to:clrscr::@3
|
||||
|
||||
void cputs(to_nomodify byte* cputs::s)
|
||||
cputs: scope:[cputs] from main::@24 main::@26 main::@28 main::@29 main::@3 main::@31 main::@33 main::@35 printf_number_buffer::@2
|
||||
[117] cputs::s#11 = phi( main::@24/main::s1, main::@26/main::s2, main::@28/main::s3, main::@29/main::s4, main::@3/main::s, main::@31/main::s1, main::@33/main::s2, main::@35/main::s3, printf_number_buffer::@2/printf_number_buffer::buffer_digits#0 )
|
||||
to:cputs::@1
|
||||
cputs::@1: scope:[cputs] from cputs cputs::@2
|
||||
[118] cputs::s#10 = phi( cputs/cputs::s#11, cputs::@2/cputs::s#0 )
|
||||
[119] cputs::c#1 = *cputs::s#10
|
||||
[120] cputs::s#0 = ++ cputs::s#10
|
||||
[121] if(0!=cputs::c#1) goto cputs::@2
|
||||
to:cputs::@return
|
||||
cputs::@return: scope:[cputs] from cputs::@1
|
||||
[122] return
|
||||
to:@return
|
||||
cputs::@2: scope:[cputs] from cputs::@1
|
||||
[123] cputc::c#0 = cputs::c#1
|
||||
[124] call cputc
|
||||
to:cputs::@1
|
||||
|
||||
void printf_uint(word printf_uint::uvalue , byte printf_uint::format_min_length , byte printf_uint::format_justify_left , byte printf_uint::format_sign_always , byte printf_uint::format_zero_padding , byte printf_uint::format_upper_case , byte printf_uint::format_radix)
|
||||
printf_uint: scope:[printf_uint] from main::@23 main::@25 main::@27 main::@30 main::@32 main::@34
|
||||
[125] printf_uint::uvalue#6 = phi( main::@23/printf_uint::uvalue#0, main::@25/printf_uint::uvalue#1, main::@27/printf_uint::uvalue#2, main::@30/printf_uint::uvalue#3, main::@32/printf_uint::uvalue#4, main::@34/printf_uint::uvalue#5 )
|
||||
to:printf_uint::@1
|
||||
printf_uint::@1: scope:[printf_uint] from printf_uint
|
||||
[126] *((byte*)&printf_buffer) = 0
|
||||
[127] utoa::value#1 = printf_uint::uvalue#6
|
||||
[128] call utoa
|
||||
to:printf_uint::@2
|
||||
printf_uint::@2: scope:[printf_uint] from printf_uint::@1
|
||||
[129] printf_number_buffer::buffer_sign#0 = *((byte*)&printf_buffer)
|
||||
[130] call printf_number_buffer
|
||||
to:printf_uint::@return
|
||||
printf_uint::@return: scope:[printf_uint] from printf_uint::@2
|
||||
[131] return
|
||||
to:@return
|
||||
|
||||
byte strtouc(byte* strtouc::str , byte** strtouc::endptr)
|
||||
strtouc: scope:[strtouc] from main::@2 main::@21
|
||||
[132] strtouc::str#3 = phi( main::@2/strtouc::str#0, main::@21/strtouc::str#1 )
|
||||
[133] strtouc::c#0 = *strtouc::str#3
|
||||
to:strtouc::@1
|
||||
strtouc::@1: scope:[strtouc] from strtouc strtouc::@2
|
||||
[134] strtouc::str#4 = phi( strtouc/strtouc::str#3, strtouc::@2/strtouc::str#2 )
|
||||
[134] strtouc::val#3 = phi( strtouc/0, strtouc::@2/strtouc::val#2 )
|
||||
[134] strtouc::c#2 = phi( strtouc/strtouc::c#0, strtouc::@2/strtouc::c#1 )
|
||||
[135] if(strtouc::c#2<'0') goto strtouc::@3
|
||||
to:strtouc::@4
|
||||
strtouc::@4: scope:[strtouc] from strtouc::@1
|
||||
[136] if(strtouc::c#2<='9') goto strtouc::@2
|
||||
to:strtouc::@3
|
||||
strtouc::@3: scope:[strtouc] from strtouc::@1 strtouc::@4
|
||||
[137] *(&main::pwd) = strtouc::str#4
|
||||
to:strtouc::@return
|
||||
strtouc::@return: scope:[strtouc] from strtouc::@3
|
||||
[138] return
|
||||
to:@return
|
||||
strtouc::@2: scope:[strtouc] from strtouc::@4
|
||||
[139] strtouc::$5 = strtouc::val#3 << 2
|
||||
[140] strtouc::$6 = strtouc::$5 + strtouc::val#3
|
||||
[141] strtouc::val#1 = strtouc::$6 << 1
|
||||
[142] strtouc::$4 = strtouc::c#2 - '0'
|
||||
[143] strtouc::val#2 = strtouc::val#1 + strtouc::$4
|
||||
[144] strtouc::str#2 = ++ strtouc::str#4
|
||||
[145] strtouc::c#1 = *strtouc::str#2
|
||||
to:strtouc::@1
|
||||
|
||||
void cputc(byte cputc::c)
|
||||
cputc: scope:[cputc] from cputs::@2 printf_number_buffer::@3
|
||||
[146] cputc::c#3 = phi( cputs::@2/cputc::c#0, printf_number_buffer::@3/cputc::c#2 )
|
||||
[147] if(cputc::c#3=='
|
||||
') goto cputc::@1
|
||||
to:cputc::@2
|
||||
cputc::@2: scope:[cputc] from cputc
|
||||
[148] conio_line_text[conio_cursor_x] = cputc::c#3
|
||||
[149] conio_line_color[conio_cursor_x] = LIGHT_BLUE
|
||||
[150] conio_cursor_x = ++ conio_cursor_x
|
||||
[151] if(conio_cursor_x!=$28) goto cputc::@return
|
||||
to:cputc::@3
|
||||
cputc::@3: scope:[cputc] from cputc::@2
|
||||
[152] phi()
|
||||
[153] call cputln
|
||||
to:cputc::@return
|
||||
cputc::@return: scope:[cputc] from cputc::@1 cputc::@2 cputc::@3
|
||||
[154] return
|
||||
to:@return
|
||||
cputc::@1: scope:[cputc] from cputc
|
||||
[155] phi()
|
||||
[156] call cputln
|
||||
to:cputc::@return
|
||||
|
||||
void utoa(word utoa::value , byte* utoa::buffer , byte utoa::radix)
|
||||
utoa: scope:[utoa] from printf_uint::@1
|
||||
[157] phi()
|
||||
to:utoa::@1
|
||||
utoa::@1: scope:[utoa] from utoa utoa::@4
|
||||
[158] utoa::buffer#11 = phi( utoa::@4/utoa::buffer#14, utoa/(byte*)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS )
|
||||
[158] utoa::started#2 = phi( utoa::@4/utoa::started#4, utoa/0 )
|
||||
[158] utoa::value#2 = phi( utoa::@4/utoa::value#6, utoa/utoa::value#1 )
|
||||
[158] utoa::digit#2 = phi( utoa::@4/utoa::digit#1, utoa/0 )
|
||||
[159] if(utoa::digit#2<5-1) goto utoa::@2
|
||||
to:utoa::@3
|
||||
utoa::@3: scope:[utoa] from utoa::@1
|
||||
[160] utoa::$11 = (byte)utoa::value#2
|
||||
[161] *utoa::buffer#11 = DIGITS[utoa::$11]
|
||||
[162] utoa::buffer#3 = ++ utoa::buffer#11
|
||||
[163] *utoa::buffer#3 = 0
|
||||
to:utoa::@return
|
||||
utoa::@return: scope:[utoa] from utoa::@3
|
||||
[164] return
|
||||
to:@return
|
||||
utoa::@2: scope:[utoa] from utoa::@1
|
||||
[165] utoa::$10 = utoa::digit#2 << 1
|
||||
[166] utoa::digit_value#0 = RADIX_DECIMAL_VALUES[utoa::$10]
|
||||
[167] if(0!=utoa::started#2) goto utoa::@5
|
||||
to:utoa::@7
|
||||
utoa::@7: scope:[utoa] from utoa::@2
|
||||
[168] if(utoa::value#2>=utoa::digit_value#0) goto utoa::@5
|
||||
to:utoa::@4
|
||||
utoa::@4: scope:[utoa] from utoa::@6 utoa::@7
|
||||
[169] utoa::buffer#14 = phi( utoa::@7/utoa::buffer#11, utoa::@6/utoa::buffer#4 )
|
||||
[169] utoa::started#4 = phi( utoa::@7/utoa::started#2, utoa::@6/1 )
|
||||
[169] utoa::value#6 = phi( utoa::@7/utoa::value#2, utoa::@6/utoa::value#0 )
|
||||
[170] utoa::digit#1 = ++ utoa::digit#2
|
||||
to:utoa::@1
|
||||
utoa::@5: scope:[utoa] from utoa::@2 utoa::@7
|
||||
[171] utoa_append::buffer#0 = utoa::buffer#11
|
||||
[172] utoa_append::value#0 = utoa::value#2
|
||||
[173] utoa_append::sub#0 = utoa::digit_value#0
|
||||
[174] call utoa_append
|
||||
[175] utoa_append::return#0 = utoa_append::value#2
|
||||
to:utoa::@6
|
||||
utoa::@6: scope:[utoa] from utoa::@5
|
||||
[176] utoa::value#0 = utoa_append::return#0
|
||||
[177] utoa::buffer#4 = ++ utoa::buffer#11
|
||||
to:utoa::@4
|
||||
|
||||
void printf_number_buffer(byte printf_number_buffer::buffer_sign , byte* printf_number_buffer::buffer_digits , byte printf_number_buffer::format_min_length , byte printf_number_buffer::format_justify_left , byte printf_number_buffer::format_sign_always , byte printf_number_buffer::format_zero_padding , byte printf_number_buffer::format_upper_case , byte printf_number_buffer::format_radix)
|
||||
printf_number_buffer: scope:[printf_number_buffer] from printf_uint::@2
|
||||
[178] phi()
|
||||
to:printf_number_buffer::@1
|
||||
printf_number_buffer::@1: scope:[printf_number_buffer] from printf_number_buffer
|
||||
[179] if(0==printf_number_buffer::buffer_sign#0) goto printf_number_buffer::@2
|
||||
to:printf_number_buffer::@3
|
||||
printf_number_buffer::@3: scope:[printf_number_buffer] from printf_number_buffer::@1
|
||||
[180] cputc::c#2 = printf_number_buffer::buffer_sign#0
|
||||
[181] call cputc
|
||||
to:printf_number_buffer::@2
|
||||
printf_number_buffer::@2: scope:[printf_number_buffer] from printf_number_buffer::@1 printf_number_buffer::@3
|
||||
[182] phi()
|
||||
[183] call cputs
|
||||
to:printf_number_buffer::@return
|
||||
printf_number_buffer::@return: scope:[printf_number_buffer] from printf_number_buffer::@2
|
||||
[184] return
|
||||
to:@return
|
||||
|
||||
void cputln()
|
||||
cputln: scope:[cputln] from cputc::@1 cputc::@3
|
||||
[185] conio_line_text = conio_line_text + $28
|
||||
[186] conio_line_color = conio_line_color + $28
|
||||
[187] conio_cursor_x = 0
|
||||
[188] conio_cursor_y = ++ conio_cursor_y
|
||||
[189] call cscroll
|
||||
to:cputln::@return
|
||||
cputln::@return: scope:[cputln] from cputln
|
||||
[190] return
|
||||
to:@return
|
||||
|
||||
word utoa_append(byte* utoa_append::buffer , word utoa_append::value , word utoa_append::sub)
|
||||
utoa_append: scope:[utoa_append] from utoa::@5
|
||||
[191] phi()
|
||||
to:utoa_append::@1
|
||||
utoa_append::@1: scope:[utoa_append] from utoa_append utoa_append::@2
|
||||
[192] utoa_append::digit#2 = phi( utoa_append/0, utoa_append::@2/utoa_append::digit#1 )
|
||||
[192] utoa_append::value#2 = phi( utoa_append/utoa_append::value#0, utoa_append::@2/utoa_append::value#1 )
|
||||
[193] if(utoa_append::value#2>=utoa_append::sub#0) goto utoa_append::@2
|
||||
to:utoa_append::@3
|
||||
utoa_append::@3: scope:[utoa_append] from utoa_append::@1
|
||||
[194] *utoa_append::buffer#0 = DIGITS[utoa_append::digit#2]
|
||||
to:utoa_append::@return
|
||||
utoa_append::@return: scope:[utoa_append] from utoa_append::@3
|
||||
[195] return
|
||||
to:@return
|
||||
utoa_append::@2: scope:[utoa_append] from utoa_append::@1
|
||||
[196] utoa_append::digit#1 = ++ utoa_append::digit#2
|
||||
[197] utoa_append::value#1 = utoa_append::value#2 - utoa_append::sub#0
|
||||
to:utoa_append::@1
|
||||
|
||||
void cscroll()
|
||||
cscroll: scope:[cscroll] from cputln
|
||||
[198] if(conio_cursor_y!=$19) goto cscroll::@return
|
||||
to:cscroll::@1
|
||||
cscroll::@1: scope:[cscroll] from cscroll
|
||||
[199] phi()
|
||||
[200] call memcpy
|
||||
to:cscroll::@2
|
||||
cscroll::@2: scope:[cscroll] from cscroll::@1
|
||||
[201] phi()
|
||||
[202] call memcpy
|
||||
to:cscroll::@3
|
||||
cscroll::@3: scope:[cscroll] from cscroll::@2
|
||||
[203] phi()
|
||||
[204] call memset
|
||||
to:cscroll::@4
|
||||
cscroll::@4: scope:[cscroll] from cscroll::@3
|
||||
[205] phi()
|
||||
[206] call memset
|
||||
to:cscroll::@5
|
||||
cscroll::@5: scope:[cscroll] from cscroll::@4
|
||||
[207] conio_line_text = conio_line_text - $28
|
||||
[208] conio_line_color = conio_line_color - $28
|
||||
[209] conio_cursor_y = -- conio_cursor_y
|
||||
to:cscroll::@return
|
||||
cscroll::@return: scope:[cscroll] from cscroll cscroll::@5
|
||||
[210] return
|
||||
to:@return
|
||||
|
||||
void* memcpy(void* memcpy::destination , void* memcpy::source , word memcpy::num)
|
||||
memcpy: scope:[memcpy] from cscroll::@1 cscroll::@2
|
||||
[211] memcpy::destination#2 = phi( cscroll::@1/(void*)DEFAULT_SCREEN, cscroll::@2/(void*)COLORRAM )
|
||||
[211] memcpy::source#2 = phi( cscroll::@1/(void*)DEFAULT_SCREEN+$28, cscroll::@2/(void*)COLORRAM+$28 )
|
||||
[212] memcpy::src_end#0 = (byte*)memcpy::source#2 + (word)$19*$28-$28
|
||||
[213] memcpy::src#4 = (byte*)memcpy::source#2
|
||||
[214] memcpy::dst#4 = (byte*)memcpy::destination#2
|
||||
to:memcpy::@1
|
||||
memcpy::@1: scope:[memcpy] from memcpy memcpy::@2
|
||||
[215] memcpy::dst#2 = phi( memcpy/memcpy::dst#4, memcpy::@2/memcpy::dst#1 )
|
||||
[215] memcpy::src#2 = phi( memcpy/memcpy::src#4, memcpy::@2/memcpy::src#1 )
|
||||
[216] if(memcpy::src#2!=memcpy::src_end#0) goto memcpy::@2
|
||||
to:memcpy::@return
|
||||
memcpy::@return: scope:[memcpy] from memcpy::@1
|
||||
[217] return
|
||||
to:@return
|
||||
memcpy::@2: scope:[memcpy] from memcpy::@1
|
||||
[218] *memcpy::dst#2 = *memcpy::src#2
|
||||
[219] memcpy::dst#1 = ++ memcpy::dst#2
|
||||
[220] memcpy::src#1 = ++ memcpy::src#2
|
||||
to:memcpy::@1
|
||||
|
||||
void* memset(void* memset::str , byte memset::c , word memset::num)
|
||||
memset: scope:[memset] from cscroll::@3 cscroll::@4
|
||||
[221] memset::c#4 = phi( cscroll::@3/' ', cscroll::@4/LIGHT_BLUE )
|
||||
[221] memset::str#3 = phi( cscroll::@3/(void*)DEFAULT_SCREEN+(word)$19*$28-$28, cscroll::@4/(void*)COLORRAM+(word)$19*$28-$28 )
|
||||
to:memset::@1
|
||||
memset::@1: scope:[memset] from memset
|
||||
[222] memset::end#0 = (byte*)memset::str#3 + $28
|
||||
[223] memset::dst#4 = (byte*)memset::str#3
|
||||
to:memset::@2
|
||||
memset::@2: scope:[memset] from memset::@1 memset::@3
|
||||
[224] memset::dst#2 = phi( memset::@1/memset::dst#4, memset::@3/memset::dst#1 )
|
||||
[225] if(memset::dst#2!=memset::end#0) goto memset::@3
|
||||
to:memset::@return
|
||||
memset::@return: scope:[memset] from memset::@2
|
||||
[226] return
|
||||
to:@return
|
||||
memset::@3: scope:[memset] from memset::@2
|
||||
[227] *memset::dst#2 = memset::c#4
|
||||
[228] memset::dst#1 = ++ memset::dst#2
|
||||
to:memset::@2
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,464 @@
|
||||
|
||||
void main()
|
||||
main: scope:[main] from
|
||||
[0] phi()
|
||||
[1] call clrscr
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main
|
||||
[2] phi()
|
||||
[3] call test_slope
|
||||
[4] test_slope::return#0 = test_slope::trees#2
|
||||
to:main::@3
|
||||
main::@3: scope:[main] from main::@2
|
||||
[5] printf_uint::uvalue#0 = test_slope::return#0
|
||||
[6] call cputs
|
||||
to:main::@4
|
||||
main::@4: scope:[main] from main::@3
|
||||
[7] phi()
|
||||
[8] call printf_uint
|
||||
to:main::@5
|
||||
main::@5: scope:[main] from main::@4
|
||||
[9] phi()
|
||||
[10] call cputs
|
||||
to:main::@6
|
||||
main::@6: scope:[main] from main::@5
|
||||
[11] phi()
|
||||
[12] call test_slope
|
||||
[13] test_slope::return#1 = test_slope::trees#2
|
||||
to:main::@7
|
||||
main::@7: scope:[main] from main::@6
|
||||
[14] printf_uint::uvalue#1 = test_slope::return#1
|
||||
[15] call cputs
|
||||
to:main::@8
|
||||
main::@8: scope:[main] from main::@7
|
||||
[16] phi()
|
||||
[17] call printf_uint
|
||||
to:main::@9
|
||||
main::@9: scope:[main] from main::@8
|
||||
[18] phi()
|
||||
[19] call cputs
|
||||
to:main::@10
|
||||
main::@10: scope:[main] from main::@9
|
||||
[20] phi()
|
||||
[21] call test_slope
|
||||
[22] test_slope::return#10 = test_slope::trees#2
|
||||
to:main::@11
|
||||
main::@11: scope:[main] from main::@10
|
||||
[23] printf_uint::uvalue#2 = test_slope::return#10
|
||||
[24] call cputs
|
||||
to:main::@12
|
||||
main::@12: scope:[main] from main::@11
|
||||
[25] phi()
|
||||
[26] call printf_uint
|
||||
to:main::@13
|
||||
main::@13: scope:[main] from main::@12
|
||||
[27] phi()
|
||||
[28] call cputs
|
||||
to:main::@14
|
||||
main::@14: scope:[main] from main::@13
|
||||
[29] phi()
|
||||
[30] call test_slope
|
||||
[31] test_slope::return#11 = test_slope::trees#2
|
||||
to:main::@15
|
||||
main::@15: scope:[main] from main::@14
|
||||
[32] printf_uint::uvalue#3 = test_slope::return#11
|
||||
[33] call cputs
|
||||
to:main::@16
|
||||
main::@16: scope:[main] from main::@15
|
||||
[34] phi()
|
||||
[35] call printf_uint
|
||||
to:main::@17
|
||||
main::@17: scope:[main] from main::@16
|
||||
[36] phi()
|
||||
[37] call cputs
|
||||
to:main::@18
|
||||
main::@18: scope:[main] from main::@17
|
||||
[38] phi()
|
||||
[39] call test_slope
|
||||
[40] test_slope::return#12 = test_slope::trees#2
|
||||
to:main::@19
|
||||
main::@19: scope:[main] from main::@18
|
||||
[41] printf_uint::uvalue#4 = test_slope::return#12
|
||||
[42] call cputs
|
||||
to:main::@20
|
||||
main::@20: scope:[main] from main::@19
|
||||
[43] phi()
|
||||
[44] call printf_uint
|
||||
to:main::@21
|
||||
main::@21: scope:[main] from main::@20
|
||||
[45] phi()
|
||||
[46] call cputs
|
||||
to:main::@22
|
||||
main::@22: scope:[main] from main::@21
|
||||
[47] phi()
|
||||
[48] call test_slope
|
||||
[49] test_slope::return#13 = test_slope::trees#2
|
||||
to:main::@23
|
||||
main::@23: scope:[main] from main::@22
|
||||
[50] printf_uint::uvalue#5 = test_slope::return#13
|
||||
[51] call cputs
|
||||
to:main::@24
|
||||
main::@24: scope:[main] from main::@23
|
||||
[52] phi()
|
||||
[53] call printf_uint
|
||||
to:main::@25
|
||||
main::@25: scope:[main] from main::@24
|
||||
[54] phi()
|
||||
[55] call cputs
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main::@1 main::@25
|
||||
[56] phi()
|
||||
to:main::@1
|
||||
|
||||
void clrscr()
|
||||
clrscr: scope:[clrscr] from main
|
||||
[57] memset::str#7 = (void*)*SAVMSC
|
||||
[58] call memset
|
||||
to:clrscr::@1
|
||||
clrscr::@1: scope:[clrscr] from clrscr
|
||||
[59] *OLDCHR = 0
|
||||
[60] call gotoxy
|
||||
to:clrscr::@return
|
||||
clrscr::@return: scope:[clrscr] from clrscr::@1
|
||||
[61] return
|
||||
to:@return
|
||||
|
||||
word test_slope(byte test_slope::x_inc , byte test_slope::y_inc)
|
||||
test_slope: scope:[test_slope] from main::@10 main::@14 main::@18 main::@2 main::@22 main::@6
|
||||
[62] test_slope::y_inc#12 = phi( main::@10/1, main::@14/1, main::@18/1, main::@2/1, main::@22/2, main::@6/1 )
|
||||
[62] test_slope::x_inc#10 = phi( main::@10/3, main::@14/5, main::@18/7, main::@2/3, main::@22/1, main::@6/1 )
|
||||
to:test_slope::@1
|
||||
test_slope::@1: scope:[test_slope] from test_slope test_slope::@4
|
||||
[63] test_slope::trees#2 = phi( test_slope/0, test_slope::@4/test_slope::trees#6 )
|
||||
[63] test_slope::x#3 = phi( test_slope/0, test_slope::@4/test_slope::x#8 )
|
||||
[63] test_slope::mapline#2 = phi( test_slope/map, test_slope::@4/test_slope::mapline#1 )
|
||||
[63] test_slope::y#2 = phi( test_slope/0, test_slope::@4/test_slope::y#1 )
|
||||
[64] if(test_slope::y#2<$143) goto test_slope::@2
|
||||
to:test_slope::@return
|
||||
test_slope::@return: scope:[test_slope] from test_slope::@1
|
||||
[65] return
|
||||
to:@return
|
||||
test_slope::@2: scope:[test_slope] from test_slope::@1
|
||||
[66] if(test_slope::mapline#2[test_slope::x#3]!='#'at) goto test_slope::@3
|
||||
to:test_slope::@5
|
||||
test_slope::@5: scope:[test_slope] from test_slope::@2
|
||||
[67] test_slope::trees#1 = ++ test_slope::trees#2
|
||||
to:test_slope::@3
|
||||
test_slope::@3: scope:[test_slope] from test_slope::@2 test_slope::@5
|
||||
[68] test_slope::trees#6 = phi( test_slope::@2/test_slope::trees#2, test_slope::@5/test_slope::trees#1 )
|
||||
[69] test_slope::x#1 = test_slope::x#3 + test_slope::x_inc#10
|
||||
[70] if(test_slope::x#1<$1f) goto test_slope::@4
|
||||
to:test_slope::@6
|
||||
test_slope::@6: scope:[test_slope] from test_slope::@3
|
||||
[71] test_slope::x#2 = test_slope::x#1 - $1f
|
||||
to:test_slope::@4
|
||||
test_slope::@4: scope:[test_slope] from test_slope::@3 test_slope::@6
|
||||
[72] test_slope::x#8 = phi( test_slope::@3/test_slope::x#1, test_slope::@6/test_slope::x#2 )
|
||||
[73] test_slope::$6 = test_slope::y_inc#12 << 1
|
||||
[74] test_slope::$7 = test_slope::$6 + test_slope::y_inc#12
|
||||
[75] test_slope::$8 = test_slope::$7 << 1
|
||||
[76] test_slope::$9 = test_slope::$8 + test_slope::y_inc#12
|
||||
[77] test_slope::$10 = test_slope::$9 << 1
|
||||
[78] test_slope::$11 = test_slope::$10 + test_slope::y_inc#12
|
||||
[79] test_slope::$12 = test_slope::$11 << 1
|
||||
[80] test_slope::$5 = test_slope::$12 + test_slope::y_inc#12
|
||||
[81] test_slope::mapline#1 = test_slope::mapline#2 + test_slope::$5
|
||||
[82] test_slope::y#1 = test_slope::y#2 + test_slope::y_inc#12
|
||||
to:test_slope::@1
|
||||
|
||||
void cputs(to_nomodify byte* cputs::s)
|
||||
cputs: scope:[cputs] from main::@11 main::@13 main::@15 main::@17 main::@19 main::@21 main::@23 main::@25 main::@3 main::@5 main::@7 main::@9 printf_number_buffer::@2
|
||||
[83] cputs::s#15 = phi( main::@11/main::s4, main::@13/main::s1, main::@15/main::s6, main::@17/main::s1, main::@19/main::s8, main::@21/main::s1, main::@23/main::s10, main::@25/main::s1, main::@3/main::s, main::@5/main::s1, main::@7/main::s2, main::@9/main::s1, printf_number_buffer::@2/printf_number_buffer::buffer_digits#0 )
|
||||
to:cputs::@1
|
||||
cputs::@1: scope:[cputs] from cputs cputs::@2
|
||||
[84] cputs::s#14 = phi( cputs/cputs::s#15, cputs::@2/cputs::s#0 )
|
||||
[85] cputs::c#1 = *cputs::s#14
|
||||
[86] cputs::s#0 = ++ cputs::s#14
|
||||
[87] if(0!=cputs::c#1) goto cputs::@2
|
||||
to:cputs::@return
|
||||
cputs::@return: scope:[cputs] from cputs::@1
|
||||
[88] return
|
||||
to:@return
|
||||
cputs::@2: scope:[cputs] from cputs::@1
|
||||
[89] cputc::c = cputs::c#1
|
||||
[90] call cputc
|
||||
to:cputs::@1
|
||||
|
||||
void printf_uint(word printf_uint::uvalue , byte printf_uint::format_min_length , byte printf_uint::format_justify_left , byte printf_uint::format_sign_always , byte printf_uint::format_zero_padding , byte printf_uint::format_upper_case , byte printf_uint::format_radix)
|
||||
printf_uint: scope:[printf_uint] from main::@12 main::@16 main::@20 main::@24 main::@4 main::@8
|
||||
[91] printf_uint::uvalue#6 = phi( main::@12/printf_uint::uvalue#2, main::@16/printf_uint::uvalue#3, main::@20/printf_uint::uvalue#4, main::@24/printf_uint::uvalue#5, main::@4/printf_uint::uvalue#0, main::@8/printf_uint::uvalue#1 )
|
||||
to:printf_uint::@1
|
||||
printf_uint::@1: scope:[printf_uint] from printf_uint
|
||||
[92] *((byte*)&printf_buffer) = 0
|
||||
[93] utoa::value#1 = printf_uint::uvalue#6
|
||||
[94] call utoa
|
||||
to:printf_uint::@2
|
||||
printf_uint::@2: scope:[printf_uint] from printf_uint::@1
|
||||
[95] printf_number_buffer::buffer_sign#0 = *((byte*)&printf_buffer)
|
||||
[96] call printf_number_buffer
|
||||
to:printf_uint::@return
|
||||
printf_uint::@return: scope:[printf_uint] from printf_uint::@2
|
||||
[97] return
|
||||
to:@return
|
||||
|
||||
void* memset(void* memset::str , byte memset::c , word memset::num)
|
||||
memset: scope:[memset] from clrscr newline::@4
|
||||
[98] memset::str#3 = phi( clrscr/memset::str#7, newline::@4/memset::str#8 )
|
||||
[98] memset::num#2 = phi( clrscr/(word)$28*$18, newline::@4/$28 )
|
||||
[99] if(memset::num#2<=0) goto memset::@return
|
||||
to:memset::@1
|
||||
memset::@1: scope:[memset] from memset
|
||||
[100] memset::end#0 = (byte*)memset::str#3 + memset::num#2
|
||||
[101] memset::dst#4 = (byte*)memset::str#3
|
||||
to:memset::@2
|
||||
memset::@2: scope:[memset] from memset::@1 memset::@3
|
||||
[102] memset::dst#2 = phi( memset::@1/memset::dst#4, memset::@3/memset::dst#1 )
|
||||
[103] if(memset::dst#2!=memset::end#0) goto memset::@3
|
||||
to:memset::@return
|
||||
memset::@return: scope:[memset] from memset memset::@2
|
||||
[104] return
|
||||
to:@return
|
||||
memset::@3: scope:[memset] from memset::@2
|
||||
[105] *memset::dst#2 = 0
|
||||
[106] memset::dst#1 = ++ memset::dst#2
|
||||
to:memset::@2
|
||||
|
||||
void gotoxy(byte gotoxy::x , byte gotoxy::y)
|
||||
gotoxy: scope:[gotoxy] from clrscr::@1
|
||||
[107] *COLCRS = gotoxy::x#1
|
||||
[108] *ROWCRS = gotoxy::y#1
|
||||
[109] call setcursor
|
||||
to:gotoxy::@return
|
||||
gotoxy::@return: scope:[gotoxy] from gotoxy
|
||||
[110] return
|
||||
to:@return
|
||||
|
||||
void cputc(volatile byte cputc::c)
|
||||
cputc: scope:[cputc] from cputs::@2 printf_number_buffer::@3
|
||||
[111] if(cputc::c=='
'at) goto cputc::@1
|
||||
to:cputc::@3
|
||||
cputc::@3: scope:[cputc] from cputc
|
||||
[112] if(cputc::c=='
|
||||
'at) goto cputc::@2
|
||||
to:cputc::@8
|
||||
cputc::@8: scope:[cputc] from cputc::@3
|
||||
[113] if(cputc::c==$9b) goto cputc::@2
|
||||
to:cputc::convertToScreenCode1
|
||||
cputc::convertToScreenCode1: scope:[cputc] from cputc::@8
|
||||
[114] cputc::convertToScreenCode1_return#0 = rawmap[*cputc::convertToScreenCode1_v#0]
|
||||
to:cputc::@6
|
||||
cputc::@6: scope:[cputc] from cputc::convertToScreenCode1
|
||||
[115] phi()
|
||||
[116] call putchar
|
||||
to:cputc::@7
|
||||
cputc::@7: scope:[cputc] from cputc::@6
|
||||
[117] *COLCRS = ++ *COLCRS
|
||||
[118] if(*COLCRS==$28) goto cputc::@5
|
||||
to:cputc::@4
|
||||
cputc::@4: scope:[cputc] from cputc::@7
|
||||
[119] phi()
|
||||
[120] call setcursor
|
||||
to:cputc::@return
|
||||
cputc::@return: scope:[cputc] from cputc::@1 cputc::@2 cputc::@4 cputc::@5
|
||||
[121] return
|
||||
to:@return
|
||||
cputc::@5: scope:[cputc] from cputc::@7
|
||||
[122] *COLCRS = 0
|
||||
[123] call newline
|
||||
to:cputc::@return
|
||||
cputc::@2: scope:[cputc] from cputc::@3 cputc::@8
|
||||
[124] *COLCRS = 0
|
||||
[125] call newline
|
||||
to:cputc::@return
|
||||
cputc::@1: scope:[cputc] from cputc
|
||||
[126] *COLCRS = 0
|
||||
[127] call setcursor
|
||||
to:cputc::@return
|
||||
|
||||
void utoa(word utoa::value , byte* utoa::buffer , byte utoa::radix)
|
||||
utoa: scope:[utoa] from printf_uint::@1
|
||||
[128] phi()
|
||||
to:utoa::@1
|
||||
utoa::@1: scope:[utoa] from utoa utoa::@4
|
||||
[129] utoa::buffer#11 = phi( utoa::@4/utoa::buffer#14, utoa/(byte*)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS )
|
||||
[129] utoa::started#2 = phi( utoa::@4/utoa::started#4, utoa/0 )
|
||||
[129] utoa::value#2 = phi( utoa::@4/utoa::value#6, utoa/utoa::value#1 )
|
||||
[129] utoa::digit#2 = phi( utoa::@4/utoa::digit#1, utoa/0 )
|
||||
[130] if(utoa::digit#2<5-1) goto utoa::@2
|
||||
to:utoa::@3
|
||||
utoa::@3: scope:[utoa] from utoa::@1
|
||||
[131] utoa::$11 = (byte)utoa::value#2
|
||||
[132] *utoa::buffer#11 = DIGITS[utoa::$11]
|
||||
[133] utoa::buffer#3 = ++ utoa::buffer#11
|
||||
[134] *utoa::buffer#3 = 0
|
||||
to:utoa::@return
|
||||
utoa::@return: scope:[utoa] from utoa::@3
|
||||
[135] return
|
||||
to:@return
|
||||
utoa::@2: scope:[utoa] from utoa::@1
|
||||
[136] utoa::$10 = utoa::digit#2 << 1
|
||||
[137] utoa::digit_value#0 = RADIX_DECIMAL_VALUES[utoa::$10]
|
||||
[138] if(0!=utoa::started#2) goto utoa::@5
|
||||
to:utoa::@7
|
||||
utoa::@7: scope:[utoa] from utoa::@2
|
||||
[139] if(utoa::value#2>=utoa::digit_value#0) goto utoa::@5
|
||||
to:utoa::@4
|
||||
utoa::@4: scope:[utoa] from utoa::@6 utoa::@7
|
||||
[140] utoa::buffer#14 = phi( utoa::@7/utoa::buffer#11, utoa::@6/utoa::buffer#4 )
|
||||
[140] utoa::started#4 = phi( utoa::@7/utoa::started#2, utoa::@6/1 )
|
||||
[140] utoa::value#6 = phi( utoa::@7/utoa::value#2, utoa::@6/utoa::value#0 )
|
||||
[141] utoa::digit#1 = ++ utoa::digit#2
|
||||
to:utoa::@1
|
||||
utoa::@5: scope:[utoa] from utoa::@2 utoa::@7
|
||||
[142] utoa_append::buffer#0 = utoa::buffer#11
|
||||
[143] utoa_append::value#0 = utoa::value#2
|
||||
[144] utoa_append::sub#0 = utoa::digit_value#0
|
||||
[145] call utoa_append
|
||||
[146] utoa_append::return#0 = utoa_append::value#2
|
||||
to:utoa::@6
|
||||
utoa::@6: scope:[utoa] from utoa::@5
|
||||
[147] utoa::value#0 = utoa_append::return#0
|
||||
[148] utoa::buffer#4 = ++ utoa::buffer#11
|
||||
to:utoa::@4
|
||||
|
||||
void printf_number_buffer(byte printf_number_buffer::buffer_sign , byte* printf_number_buffer::buffer_digits , byte printf_number_buffer::format_min_length , byte printf_number_buffer::format_justify_left , byte printf_number_buffer::format_sign_always , byte printf_number_buffer::format_zero_padding , byte printf_number_buffer::format_upper_case , byte printf_number_buffer::format_radix)
|
||||
printf_number_buffer: scope:[printf_number_buffer] from printf_uint::@2
|
||||
[149] phi()
|
||||
to:printf_number_buffer::@1
|
||||
printf_number_buffer::@1: scope:[printf_number_buffer] from printf_number_buffer
|
||||
[150] if(0==printf_number_buffer::buffer_sign#0) goto printf_number_buffer::@2
|
||||
to:printf_number_buffer::@3
|
||||
printf_number_buffer::@3: scope:[printf_number_buffer] from printf_number_buffer::@1
|
||||
[151] cputc::c = printf_number_buffer::buffer_sign#0
|
||||
[152] call cputc
|
||||
to:printf_number_buffer::@2
|
||||
printf_number_buffer::@2: scope:[printf_number_buffer] from printf_number_buffer::@1 printf_number_buffer::@3
|
||||
[153] phi()
|
||||
[154] call cputs
|
||||
to:printf_number_buffer::@return
|
||||
printf_number_buffer::@return: scope:[printf_number_buffer] from printf_number_buffer::@2
|
||||
[155] return
|
||||
to:@return
|
||||
|
||||
void setcursor()
|
||||
setcursor: scope:[setcursor] from cputc::@1 cputc::@4 gotoxy newline::@1 putchar::@1
|
||||
[156] *(*OLDADR) = *OLDCHR
|
||||
[157] call cursorLocation
|
||||
[158] cursorLocation::return#3 = cursorLocation::return#1
|
||||
to:setcursor::@3
|
||||
setcursor::@3: scope:[setcursor] from setcursor
|
||||
[159] setcursor::loc#0 = cursorLocation::return#3
|
||||
[160] setcursor::c#0 = *setcursor::loc#0
|
||||
[161] *OLDCHR = setcursor::c#0
|
||||
[162] *OLDADR = setcursor::loc#0
|
||||
to:setcursor::@2
|
||||
setcursor::@2: scope:[setcursor] from setcursor::@3
|
||||
[163] *CRSINH = 0
|
||||
[164] setcursor::c#1 = setcursor::c#0 ^ $80
|
||||
to:setcursor::@1
|
||||
setcursor::@1: scope:[setcursor] from setcursor::@2
|
||||
[165] *(*OLDADR) = setcursor::c#1
|
||||
to:setcursor::@return
|
||||
setcursor::@return: scope:[setcursor] from setcursor::@1
|
||||
[166] return
|
||||
to:@return
|
||||
|
||||
void putchar(byte putchar::code)
|
||||
putchar: scope:[putchar] from cputc::@6
|
||||
[167] *(*OLDADR) = *OLDCHR
|
||||
[168] call cursorLocation
|
||||
[169] cursorLocation::return#0 = cursorLocation::return#1
|
||||
to:putchar::@1
|
||||
putchar::@1: scope:[putchar] from putchar
|
||||
[170] putchar::loc#0 = cursorLocation::return#0
|
||||
[171] putchar::newChar#0 = cputc::convertToScreenCode1_return#0
|
||||
[172] *putchar::loc#0 = putchar::newChar#0
|
||||
[173] *OLDCHR = putchar::newChar#0
|
||||
[174] call setcursor
|
||||
to:putchar::@return
|
||||
putchar::@return: scope:[putchar] from putchar::@1
|
||||
[175] return
|
||||
to:@return
|
||||
|
||||
void newline()
|
||||
newline: scope:[newline] from cputc::@2 cputc::@5
|
||||
[176] *ROWCRS = ++ *ROWCRS
|
||||
[177] if(*ROWCRS!=$18) goto newline::@1
|
||||
to:newline::@3
|
||||
newline::@3: scope:[newline] from newline
|
||||
[178] *(*OLDADR) = *(*OLDADR) ^ $80
|
||||
to:newline::@2
|
||||
newline::@2: scope:[newline] from newline::@3
|
||||
[179] newline::start#0 = *SAVMSC
|
||||
[180] memcpy::source#0 = newline::start#0 + $28
|
||||
[181] memcpy::destination#0 = (void*)newline::start#0
|
||||
[182] call memcpy
|
||||
to:newline::@4
|
||||
newline::@4: scope:[newline] from newline::@2
|
||||
[183] memset::str#0 = newline::start#0 + (word)$28*$17
|
||||
[184] memset::str#8 = (void*)memset::str#0
|
||||
[185] call memset
|
||||
to:newline::@5
|
||||
newline::@5: scope:[newline] from newline::@4
|
||||
[186] *ROWCRS = (byte)$18-1
|
||||
to:newline::@1
|
||||
newline::@1: scope:[newline] from newline newline::@5
|
||||
[187] phi()
|
||||
[188] call setcursor
|
||||
to:newline::@return
|
||||
newline::@return: scope:[newline] from newline::@1
|
||||
[189] return
|
||||
to:@return
|
||||
|
||||
word utoa_append(byte* utoa_append::buffer , word utoa_append::value , word utoa_append::sub)
|
||||
utoa_append: scope:[utoa_append] from utoa::@5
|
||||
[190] phi()
|
||||
to:utoa_append::@1
|
||||
utoa_append::@1: scope:[utoa_append] from utoa_append utoa_append::@2
|
||||
[191] utoa_append::digit#2 = phi( utoa_append/0, utoa_append::@2/utoa_append::digit#1 )
|
||||
[191] utoa_append::value#2 = phi( utoa_append/utoa_append::value#0, utoa_append::@2/utoa_append::value#1 )
|
||||
[192] if(utoa_append::value#2>=utoa_append::sub#0) goto utoa_append::@2
|
||||
to:utoa_append::@3
|
||||
utoa_append::@3: scope:[utoa_append] from utoa_append::@1
|
||||
[193] *utoa_append::buffer#0 = DIGITS[utoa_append::digit#2]
|
||||
to:utoa_append::@return
|
||||
utoa_append::@return: scope:[utoa_append] from utoa_append::@3
|
||||
[194] return
|
||||
to:@return
|
||||
utoa_append::@2: scope:[utoa_append] from utoa_append::@1
|
||||
[195] utoa_append::digit#1 = ++ utoa_append::digit#2
|
||||
[196] utoa_append::value#1 = utoa_append::value#2 - utoa_append::sub#0
|
||||
to:utoa_append::@1
|
||||
|
||||
byte* cursorLocation()
|
||||
cursorLocation: scope:[cursorLocation] from putchar setcursor
|
||||
[197] cursorLocation::$3 = (word)*ROWCRS
|
||||
[198] cursorLocation::$4 = cursorLocation::$3 << 2
|
||||
[199] cursorLocation::$5 = cursorLocation::$4 + cursorLocation::$3
|
||||
[200] cursorLocation::$0 = cursorLocation::$5 << 3
|
||||
[201] cursorLocation::$1 = *SAVMSC + cursorLocation::$0
|
||||
[202] cursorLocation::return#1 = cursorLocation::$1 + *COLCRS
|
||||
to:cursorLocation::@return
|
||||
cursorLocation::@return: scope:[cursorLocation] from cursorLocation
|
||||
[203] return
|
||||
to:@return
|
||||
|
||||
void* memcpy(void* memcpy::destination , void* memcpy::source , word memcpy::num)
|
||||
memcpy: scope:[memcpy] from newline::@2
|
||||
[204] memcpy::src_end#0 = (byte*)(void*)memcpy::source#0 + memcpy::num#0
|
||||
[205] memcpy::src#4 = (byte*)(void*)memcpy::source#0
|
||||
[206] memcpy::dst#4 = (byte*)memcpy::destination#0
|
||||
to:memcpy::@1
|
||||
memcpy::@1: scope:[memcpy] from memcpy memcpy::@2
|
||||
[207] memcpy::dst#2 = phi( memcpy/memcpy::dst#4, memcpy::@2/memcpy::dst#1 )
|
||||
[207] memcpy::src#2 = phi( memcpy/memcpy::src#4, memcpy::@2/memcpy::src#1 )
|
||||
[208] if(memcpy::src#2!=memcpy::src_end#0) goto memcpy::@2
|
||||
to:memcpy::@return
|
||||
memcpy::@return: scope:[memcpy] from memcpy::@1
|
||||
[209] return
|
||||
to:@return
|
||||
memcpy::@2: scope:[memcpy] from memcpy::@1
|
||||
[210] *memcpy::dst#2 = *memcpy::src#2
|
||||
[211] memcpy::dst#1 = ++ memcpy::dst#2
|
||||
[212] memcpy::src#1 = ++ memcpy::src#2
|
||||
to:memcpy::@1
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,441 @@
|
||||
|
||||
void main()
|
||||
main: scope:[main] from
|
||||
[0] phi()
|
||||
[1] call clrscr
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@12 main::@22 main::@24 main::@25 main::@32 main::@33
|
||||
[2] main::total#10 = phi( main::@12/main::total#1, main::@22/main::total#10, main::@24/main::total#10, main::@25/main::total#10, main/0 )
|
||||
[2] main::valid#10 = phi( main::@12/main::valid#8, main::@22/main::valid#10, main::@24/main::valid#10, main::@25/main::valid#10, main/0 )
|
||||
[2] main::pass#10 = phi( main::@12/main::pass#3, main::@22/main::pass#14, main::@24/main::pass#1, main::@25/main::pass#11, main/passports )
|
||||
[3] if(0!=*main::pass#10) goto main::@2
|
||||
to:main::@3
|
||||
main::@3: scope:[main] from main::@1
|
||||
[4] phi()
|
||||
[5] call cputs
|
||||
to:main::@28
|
||||
main::@28: scope:[main] from main::@3
|
||||
[6] printf_uint::uvalue#0 = main::valid#10
|
||||
[7] call printf_uint
|
||||
to:main::@29
|
||||
main::@29: scope:[main] from main::@28
|
||||
[8] phi()
|
||||
[9] call cputs
|
||||
to:main::@30
|
||||
main::@30: scope:[main] from main::@29
|
||||
[10] printf_uint::uvalue#1 = main::total#10
|
||||
[11] call printf_uint
|
||||
to:main::@31
|
||||
main::@31: scope:[main] from main::@30
|
||||
[12] phi()
|
||||
[13] call cputs
|
||||
to:main::@27
|
||||
main::@27: scope:[main] from main::@27 main::@31
|
||||
[14] phi()
|
||||
to:main::@27
|
||||
main::@2: scope:[main] from main::@1
|
||||
[15] if(*main::pass#10!=' 'at) goto main::@4
|
||||
to:main::@24
|
||||
main::@24: scope:[main] from main::@2
|
||||
[16] main::pass#1 = ++ main::pass#10
|
||||
to:main::@1
|
||||
main::@4: scope:[main] from main::@2
|
||||
[17] if(*main::pass#10!='
|
||||
'at) goto main::@13
|
||||
to:main::@25
|
||||
main::@25: scope:[main] from main::@4
|
||||
[18] main::pass#11 = ++ main::pass#10
|
||||
[19] if(*main::pass#11!='
|
||||
'at) goto main::@1
|
||||
to:main::@26
|
||||
main::@26: scope:[main] from main::@25
|
||||
[20] main::pass#3 = ++ main::pass#11
|
||||
to:main::@5
|
||||
main::@5: scope:[main] from main::@26 main::@8
|
||||
[21] main::num_found#2 = phi( main::@26/0, main::@8/main::num_found#6 )
|
||||
[21] main::i#2 = phi( main::@26/0, main::@8/main::i#1 )
|
||||
[22] if(main::i#2<7) goto main::@6
|
||||
to:main::@7
|
||||
main::@7: scope:[main] from main::@5
|
||||
[23] if(main::num_found#2==7) goto main::@11
|
||||
to:main::@10
|
||||
main::@10: scope:[main] from main::@7
|
||||
[24] phi()
|
||||
[25] call cputs
|
||||
to:main::@12
|
||||
main::@12: scope:[main] from main::@10 main::@11
|
||||
[26] main::valid#8 = phi( main::@11/main::valid#1, main::@10/main::valid#10 )
|
||||
[27] main::total#1 = ++ main::total#10
|
||||
to:main::@1
|
||||
main::@11: scope:[main] from main::@7
|
||||
[28] main::valid#1 = ++ main::valid#10
|
||||
[29] call cputs
|
||||
to:main::@12
|
||||
main::@6: scope:[main] from main::@5
|
||||
[30] if(0==main::tags_found[main::i#2]) goto main::@8
|
||||
to:main::@9
|
||||
main::@9: scope:[main] from main::@6
|
||||
[31] main::num_found#1 = ++ main::num_found#2
|
||||
to:main::@8
|
||||
main::@8: scope:[main] from main::@6 main::@9
|
||||
[32] main::num_found#6 = phi( main::@9/main::num_found#1, main::@6/main::num_found#2 )
|
||||
[33] main::tags_found[main::i#2] = 0
|
||||
[34] main::i#1 = ++ main::i#2
|
||||
to:main::@5
|
||||
main::@13: scope:[main] from main::@20 main::@4
|
||||
[35] main::required_tag#6 = phi( main::@20/main::required_tag#1, main::@4/required_tags )
|
||||
[35] main::tag_idx#2 = phi( main::@20/main::tag_idx#1, main::@4/0 )
|
||||
[36] if(main::tag_idx#2<7) goto main::@14
|
||||
to:main::@21
|
||||
main::@21: scope:[main] from main::@13 main::@19
|
||||
[37] main::pass#4 = main::pass#10 + 3
|
||||
to:main::@22
|
||||
main::@22: scope:[main] from main::@21 main::@23
|
||||
[38] main::pass#14 = phi( main::@21/main::pass#4, main::@23/main::pass#5 )
|
||||
[39] if(0==*main::pass#14) goto main::@1
|
||||
to:main::@33
|
||||
main::@33: scope:[main] from main::@22
|
||||
[40] if(*main::pass#14==' 'at) goto main::@1
|
||||
to:main::@32
|
||||
main::@32: scope:[main] from main::@33
|
||||
[41] if(*main::pass#14!='
|
||||
'at) goto main::@23
|
||||
to:main::@1
|
||||
main::@23: scope:[main] from main::@32
|
||||
[42] main::pass#5 = ++ main::pass#14
|
||||
to:main::@22
|
||||
main::@14: scope:[main] from main::@13 main::@17
|
||||
[43] main::match#2 = phi( main::@13/0, main::@17/main::match#6 )
|
||||
[43] main::i1#2 = phi( main::@13/0, main::@17/main::i1#1 )
|
||||
[44] if(main::i1#2<3) goto main::@15
|
||||
to:main::@16
|
||||
main::@16: scope:[main] from main::@14
|
||||
[45] if(main::match#2!=3) goto main::@20
|
||||
to:main::@19
|
||||
main::@19: scope:[main] from main::@16
|
||||
[46] main::tags_found[main::tag_idx#2] = 1
|
||||
to:main::@21
|
||||
main::@20: scope:[main] from main::@16
|
||||
[47] main::required_tag#1 = main::required_tag#6 + 3
|
||||
[48] main::tag_idx#1 = ++ main::tag_idx#2
|
||||
to:main::@13
|
||||
main::@15: scope:[main] from main::@14
|
||||
[49] if(main::required_tag#6[main::i1#2]!=main::pass#10[main::i1#2]) goto main::@17
|
||||
to:main::@18
|
||||
main::@18: scope:[main] from main::@15
|
||||
[50] main::match#1 = ++ main::match#2
|
||||
to:main::@17
|
||||
main::@17: scope:[main] from main::@15 main::@18
|
||||
[51] main::match#6 = phi( main::@15/main::match#2, main::@18/main::match#1 )
|
||||
[52] main::i1#1 = ++ main::i1#2
|
||||
to:main::@14
|
||||
|
||||
void clrscr()
|
||||
clrscr: scope:[clrscr] from main
|
||||
[53] memset::str#7 = (void*)*SAVMSC
|
||||
[54] call memset
|
||||
to:clrscr::@1
|
||||
clrscr::@1: scope:[clrscr] from clrscr
|
||||
[55] *OLDCHR = 0
|
||||
[56] call gotoxy
|
||||
to:clrscr::@return
|
||||
clrscr::@return: scope:[clrscr] from clrscr::@1
|
||||
[57] return
|
||||
to:@return
|
||||
|
||||
void cputs(to_nomodify byte* cputs::s)
|
||||
cputs: scope:[cputs] from main::@10 main::@11 main::@29 main::@3 main::@31 printf_number_buffer::@2
|
||||
[58] cputs::s#8 = phi( main::@10/main::s4, main::@11/main::s3, main::@3/main::s, main::@29/main::s1, main::@31/main::s2, printf_number_buffer::@2/printf_number_buffer::buffer_digits#0 )
|
||||
to:cputs::@1
|
||||
cputs::@1: scope:[cputs] from cputs cputs::@2
|
||||
[59] cputs::s#7 = phi( cputs/cputs::s#8, cputs::@2/cputs::s#0 )
|
||||
[60] cputs::c#1 = *cputs::s#7
|
||||
[61] cputs::s#0 = ++ cputs::s#7
|
||||
[62] if(0!=cputs::c#1) goto cputs::@2
|
||||
to:cputs::@return
|
||||
cputs::@return: scope:[cputs] from cputs::@1
|
||||
[63] return
|
||||
to:@return
|
||||
cputs::@2: scope:[cputs] from cputs::@1
|
||||
[64] cputc::c = cputs::c#1
|
||||
[65] call cputc
|
||||
to:cputs::@1
|
||||
|
||||
void printf_uint(word printf_uint::uvalue , byte printf_uint::format_min_length , byte printf_uint::format_justify_left , byte printf_uint::format_sign_always , byte printf_uint::format_zero_padding , byte printf_uint::format_upper_case , byte printf_uint::format_radix)
|
||||
printf_uint: scope:[printf_uint] from main::@28 main::@30
|
||||
[66] printf_uint::uvalue#2 = phi( main::@28/printf_uint::uvalue#0, main::@30/printf_uint::uvalue#1 )
|
||||
to:printf_uint::@1
|
||||
printf_uint::@1: scope:[printf_uint] from printf_uint
|
||||
[67] *((byte*)&printf_buffer) = 0
|
||||
[68] utoa::value#1 = printf_uint::uvalue#2
|
||||
[69] call utoa
|
||||
to:printf_uint::@2
|
||||
printf_uint::@2: scope:[printf_uint] from printf_uint::@1
|
||||
[70] printf_number_buffer::buffer_sign#0 = *((byte*)&printf_buffer)
|
||||
[71] call printf_number_buffer
|
||||
to:printf_uint::@return
|
||||
printf_uint::@return: scope:[printf_uint] from printf_uint::@2
|
||||
[72] return
|
||||
to:@return
|
||||
|
||||
void* memset(void* memset::str , byte memset::c , word memset::num)
|
||||
memset: scope:[memset] from clrscr newline::@4
|
||||
[73] memset::str#3 = phi( clrscr/memset::str#7, newline::@4/memset::str#8 )
|
||||
[73] memset::num#2 = phi( clrscr/(word)$28*$18, newline::@4/$28 )
|
||||
[74] if(memset::num#2<=0) goto memset::@return
|
||||
to:memset::@1
|
||||
memset::@1: scope:[memset] from memset
|
||||
[75] memset::end#0 = (byte*)memset::str#3 + memset::num#2
|
||||
[76] memset::dst#4 = (byte*)memset::str#3
|
||||
to:memset::@2
|
||||
memset::@2: scope:[memset] from memset::@1 memset::@3
|
||||
[77] memset::dst#2 = phi( memset::@1/memset::dst#4, memset::@3/memset::dst#1 )
|
||||
[78] if(memset::dst#2!=memset::end#0) goto memset::@3
|
||||
to:memset::@return
|
||||
memset::@return: scope:[memset] from memset memset::@2
|
||||
[79] return
|
||||
to:@return
|
||||
memset::@3: scope:[memset] from memset::@2
|
||||
[80] *memset::dst#2 = 0
|
||||
[81] memset::dst#1 = ++ memset::dst#2
|
||||
to:memset::@2
|
||||
|
||||
void gotoxy(byte gotoxy::x , byte gotoxy::y)
|
||||
gotoxy: scope:[gotoxy] from clrscr::@1
|
||||
[82] *COLCRS = gotoxy::x#1
|
||||
[83] *ROWCRS = gotoxy::y#1
|
||||
[84] call setcursor
|
||||
to:gotoxy::@return
|
||||
gotoxy::@return: scope:[gotoxy] from gotoxy
|
||||
[85] return
|
||||
to:@return
|
||||
|
||||
void cputc(volatile byte cputc::c)
|
||||
cputc: scope:[cputc] from cputs::@2 printf_number_buffer::@3
|
||||
[86] if(cputc::c=='
'at) goto cputc::@1
|
||||
to:cputc::@3
|
||||
cputc::@3: scope:[cputc] from cputc
|
||||
[87] if(cputc::c=='
|
||||
'at) goto cputc::@2
|
||||
to:cputc::@8
|
||||
cputc::@8: scope:[cputc] from cputc::@3
|
||||
[88] if(cputc::c==$9b) goto cputc::@2
|
||||
to:cputc::convertToScreenCode1
|
||||
cputc::convertToScreenCode1: scope:[cputc] from cputc::@8
|
||||
[89] cputc::convertToScreenCode1_return#0 = rawmap[*cputc::convertToScreenCode1_v#0]
|
||||
to:cputc::@6
|
||||
cputc::@6: scope:[cputc] from cputc::convertToScreenCode1
|
||||
[90] phi()
|
||||
[91] call putchar
|
||||
to:cputc::@7
|
||||
cputc::@7: scope:[cputc] from cputc::@6
|
||||
[92] *COLCRS = ++ *COLCRS
|
||||
[93] if(*COLCRS==$28) goto cputc::@5
|
||||
to:cputc::@4
|
||||
cputc::@4: scope:[cputc] from cputc::@7
|
||||
[94] phi()
|
||||
[95] call setcursor
|
||||
to:cputc::@return
|
||||
cputc::@return: scope:[cputc] from cputc::@1 cputc::@2 cputc::@4 cputc::@5
|
||||
[96] return
|
||||
to:@return
|
||||
cputc::@5: scope:[cputc] from cputc::@7
|
||||
[97] *COLCRS = 0
|
||||
[98] call newline
|
||||
to:cputc::@return
|
||||
cputc::@2: scope:[cputc] from cputc::@3 cputc::@8
|
||||
[99] *COLCRS = 0
|
||||
[100] call newline
|
||||
to:cputc::@return
|
||||
cputc::@1: scope:[cputc] from cputc
|
||||
[101] *COLCRS = 0
|
||||
[102] call setcursor
|
||||
to:cputc::@return
|
||||
|
||||
void utoa(word utoa::value , byte* utoa::buffer , byte utoa::radix)
|
||||
utoa: scope:[utoa] from printf_uint::@1
|
||||
[103] phi()
|
||||
to:utoa::@1
|
||||
utoa::@1: scope:[utoa] from utoa utoa::@4
|
||||
[104] utoa::buffer#11 = phi( utoa::@4/utoa::buffer#14, utoa/(byte*)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS )
|
||||
[104] utoa::started#2 = phi( utoa::@4/utoa::started#4, utoa/0 )
|
||||
[104] utoa::value#2 = phi( utoa::@4/utoa::value#6, utoa/utoa::value#1 )
|
||||
[104] utoa::digit#2 = phi( utoa::@4/utoa::digit#1, utoa/0 )
|
||||
[105] if(utoa::digit#2<5-1) goto utoa::@2
|
||||
to:utoa::@3
|
||||
utoa::@3: scope:[utoa] from utoa::@1
|
||||
[106] utoa::$11 = (byte)utoa::value#2
|
||||
[107] *utoa::buffer#11 = DIGITS[utoa::$11]
|
||||
[108] utoa::buffer#3 = ++ utoa::buffer#11
|
||||
[109] *utoa::buffer#3 = 0
|
||||
to:utoa::@return
|
||||
utoa::@return: scope:[utoa] from utoa::@3
|
||||
[110] return
|
||||
to:@return
|
||||
utoa::@2: scope:[utoa] from utoa::@1
|
||||
[111] utoa::$10 = utoa::digit#2 << 1
|
||||
[112] utoa::digit_value#0 = RADIX_DECIMAL_VALUES[utoa::$10]
|
||||
[113] if(0!=utoa::started#2) goto utoa::@5
|
||||
to:utoa::@7
|
||||
utoa::@7: scope:[utoa] from utoa::@2
|
||||
[114] if(utoa::value#2>=utoa::digit_value#0) goto utoa::@5
|
||||
to:utoa::@4
|
||||
utoa::@4: scope:[utoa] from utoa::@6 utoa::@7
|
||||
[115] utoa::buffer#14 = phi( utoa::@7/utoa::buffer#11, utoa::@6/utoa::buffer#4 )
|
||||
[115] utoa::started#4 = phi( utoa::@7/utoa::started#2, utoa::@6/1 )
|
||||
[115] utoa::value#6 = phi( utoa::@7/utoa::value#2, utoa::@6/utoa::value#0 )
|
||||
[116] utoa::digit#1 = ++ utoa::digit#2
|
||||
to:utoa::@1
|
||||
utoa::@5: scope:[utoa] from utoa::@2 utoa::@7
|
||||
[117] utoa_append::buffer#0 = utoa::buffer#11
|
||||
[118] utoa_append::value#0 = utoa::value#2
|
||||
[119] utoa_append::sub#0 = utoa::digit_value#0
|
||||
[120] call utoa_append
|
||||
[121] utoa_append::return#0 = utoa_append::value#2
|
||||
to:utoa::@6
|
||||
utoa::@6: scope:[utoa] from utoa::@5
|
||||
[122] utoa::value#0 = utoa_append::return#0
|
||||
[123] utoa::buffer#4 = ++ utoa::buffer#11
|
||||
to:utoa::@4
|
||||
|
||||
void printf_number_buffer(byte printf_number_buffer::buffer_sign , byte* printf_number_buffer::buffer_digits , byte printf_number_buffer::format_min_length , byte printf_number_buffer::format_justify_left , byte printf_number_buffer::format_sign_always , byte printf_number_buffer::format_zero_padding , byte printf_number_buffer::format_upper_case , byte printf_number_buffer::format_radix)
|
||||
printf_number_buffer: scope:[printf_number_buffer] from printf_uint::@2
|
||||
[124] phi()
|
||||
to:printf_number_buffer::@1
|
||||
printf_number_buffer::@1: scope:[printf_number_buffer] from printf_number_buffer
|
||||
[125] if(0==printf_number_buffer::buffer_sign#0) goto printf_number_buffer::@2
|
||||
to:printf_number_buffer::@3
|
||||
printf_number_buffer::@3: scope:[printf_number_buffer] from printf_number_buffer::@1
|
||||
[126] cputc::c = printf_number_buffer::buffer_sign#0
|
||||
[127] call cputc
|
||||
to:printf_number_buffer::@2
|
||||
printf_number_buffer::@2: scope:[printf_number_buffer] from printf_number_buffer::@1 printf_number_buffer::@3
|
||||
[128] phi()
|
||||
[129] call cputs
|
||||
to:printf_number_buffer::@return
|
||||
printf_number_buffer::@return: scope:[printf_number_buffer] from printf_number_buffer::@2
|
||||
[130] return
|
||||
to:@return
|
||||
|
||||
void setcursor()
|
||||
setcursor: scope:[setcursor] from cputc::@1 cputc::@4 gotoxy newline::@1 putchar::@1
|
||||
[131] *(*OLDADR) = *OLDCHR
|
||||
[132] call cursorLocation
|
||||
[133] cursorLocation::return#3 = cursorLocation::return#1
|
||||
to:setcursor::@3
|
||||
setcursor::@3: scope:[setcursor] from setcursor
|
||||
[134] setcursor::loc#0 = cursorLocation::return#3
|
||||
[135] setcursor::c#0 = *setcursor::loc#0
|
||||
[136] *OLDCHR = setcursor::c#0
|
||||
[137] *OLDADR = setcursor::loc#0
|
||||
to:setcursor::@2
|
||||
setcursor::@2: scope:[setcursor] from setcursor::@3
|
||||
[138] *CRSINH = 0
|
||||
[139] setcursor::c#1 = setcursor::c#0 ^ $80
|
||||
to:setcursor::@1
|
||||
setcursor::@1: scope:[setcursor] from setcursor::@2
|
||||
[140] *(*OLDADR) = setcursor::c#1
|
||||
to:setcursor::@return
|
||||
setcursor::@return: scope:[setcursor] from setcursor::@1
|
||||
[141] return
|
||||
to:@return
|
||||
|
||||
void putchar(byte putchar::code)
|
||||
putchar: scope:[putchar] from cputc::@6
|
||||
[142] *(*OLDADR) = *OLDCHR
|
||||
[143] call cursorLocation
|
||||
[144] cursorLocation::return#0 = cursorLocation::return#1
|
||||
to:putchar::@1
|
||||
putchar::@1: scope:[putchar] from putchar
|
||||
[145] putchar::loc#0 = cursorLocation::return#0
|
||||
[146] putchar::newChar#0 = cputc::convertToScreenCode1_return#0
|
||||
[147] *putchar::loc#0 = putchar::newChar#0
|
||||
[148] *OLDCHR = putchar::newChar#0
|
||||
[149] call setcursor
|
||||
to:putchar::@return
|
||||
putchar::@return: scope:[putchar] from putchar::@1
|
||||
[150] return
|
||||
to:@return
|
||||
|
||||
void newline()
|
||||
newline: scope:[newline] from cputc::@2 cputc::@5
|
||||
[151] *ROWCRS = ++ *ROWCRS
|
||||
[152] if(*ROWCRS!=$18) goto newline::@1
|
||||
to:newline::@3
|
||||
newline::@3: scope:[newline] from newline
|
||||
[153] *(*OLDADR) = *(*OLDADR) ^ $80
|
||||
to:newline::@2
|
||||
newline::@2: scope:[newline] from newline::@3
|
||||
[154] newline::start#0 = *SAVMSC
|
||||
[155] memcpy::source#0 = newline::start#0 + $28
|
||||
[156] memcpy::destination#0 = (void*)newline::start#0
|
||||
[157] call memcpy
|
||||
to:newline::@4
|
||||
newline::@4: scope:[newline] from newline::@2
|
||||
[158] memset::str#0 = newline::start#0 + (word)$28*$17
|
||||
[159] memset::str#8 = (void*)memset::str#0
|
||||
[160] call memset
|
||||
to:newline::@5
|
||||
newline::@5: scope:[newline] from newline::@4
|
||||
[161] *ROWCRS = (byte)$18-1
|
||||
to:newline::@1
|
||||
newline::@1: scope:[newline] from newline newline::@5
|
||||
[162] phi()
|
||||
[163] call setcursor
|
||||
to:newline::@return
|
||||
newline::@return: scope:[newline] from newline::@1
|
||||
[164] return
|
||||
to:@return
|
||||
|
||||
word utoa_append(byte* utoa_append::buffer , word utoa_append::value , word utoa_append::sub)
|
||||
utoa_append: scope:[utoa_append] from utoa::@5
|
||||
[165] phi()
|
||||
to:utoa_append::@1
|
||||
utoa_append::@1: scope:[utoa_append] from utoa_append utoa_append::@2
|
||||
[166] utoa_append::digit#2 = phi( utoa_append/0, utoa_append::@2/utoa_append::digit#1 )
|
||||
[166] utoa_append::value#2 = phi( utoa_append/utoa_append::value#0, utoa_append::@2/utoa_append::value#1 )
|
||||
[167] if(utoa_append::value#2>=utoa_append::sub#0) goto utoa_append::@2
|
||||
to:utoa_append::@3
|
||||
utoa_append::@3: scope:[utoa_append] from utoa_append::@1
|
||||
[168] *utoa_append::buffer#0 = DIGITS[utoa_append::digit#2]
|
||||
to:utoa_append::@return
|
||||
utoa_append::@return: scope:[utoa_append] from utoa_append::@3
|
||||
[169] return
|
||||
to:@return
|
||||
utoa_append::@2: scope:[utoa_append] from utoa_append::@1
|
||||
[170] utoa_append::digit#1 = ++ utoa_append::digit#2
|
||||
[171] utoa_append::value#1 = utoa_append::value#2 - utoa_append::sub#0
|
||||
to:utoa_append::@1
|
||||
|
||||
byte* cursorLocation()
|
||||
cursorLocation: scope:[cursorLocation] from putchar setcursor
|
||||
[172] cursorLocation::$3 = (word)*ROWCRS
|
||||
[173] cursorLocation::$4 = cursorLocation::$3 << 2
|
||||
[174] cursorLocation::$5 = cursorLocation::$4 + cursorLocation::$3
|
||||
[175] cursorLocation::$0 = cursorLocation::$5 << 3
|
||||
[176] cursorLocation::$1 = *SAVMSC + cursorLocation::$0
|
||||
[177] cursorLocation::return#1 = cursorLocation::$1 + *COLCRS
|
||||
to:cursorLocation::@return
|
||||
cursorLocation::@return: scope:[cursorLocation] from cursorLocation
|
||||
[178] return
|
||||
to:@return
|
||||
|
||||
void* memcpy(void* memcpy::destination , void* memcpy::source , word memcpy::num)
|
||||
memcpy: scope:[memcpy] from newline::@2
|
||||
[179] memcpy::src_end#0 = (byte*)(void*)memcpy::source#0 + memcpy::num#0
|
||||
[180] memcpy::src#4 = (byte*)(void*)memcpy::source#0
|
||||
[181] memcpy::dst#4 = (byte*)memcpy::destination#0
|
||||
to:memcpy::@1
|
||||
memcpy::@1: scope:[memcpy] from memcpy memcpy::@2
|
||||
[182] memcpy::dst#2 = phi( memcpy/memcpy::dst#4, memcpy::@2/memcpy::dst#1 )
|
||||
[182] memcpy::src#2 = phi( memcpy/memcpy::src#4, memcpy::@2/memcpy::src#1 )
|
||||
[183] if(memcpy::src#2!=memcpy::src_end#0) goto memcpy::@2
|
||||
to:memcpy::@return
|
||||
memcpy::@return: scope:[memcpy] from memcpy::@1
|
||||
[184] return
|
||||
to:@return
|
||||
memcpy::@2: scope:[memcpy] from memcpy::@1
|
||||
[185] *memcpy::dst#2 = *memcpy::src#2
|
||||
[186] memcpy::dst#1 = ++ memcpy::dst#2
|
||||
[187] memcpy::src#1 = ++ memcpy::src#2
|
||||
to:memcpy::@1
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@@ -183,8 +183,8 @@ MakeNiceScreen::@2: scope:[MakeNiceScreen] from MakeNiceScreen::@1
|
||||
to:MakeNiceScreen::@17
|
||||
MakeNiceScreen::@17: scope:[MakeNiceScreen] from MakeNiceScreen::@2
|
||||
[89] MakeNiceScreen::$22 = strlen::return#2
|
||||
[90] MakeNiceScreen::$34 = (byte)MakeNiceScreen::$22
|
||||
[91] MakeNiceScreen::$23 = XSize - MakeNiceScreen::$34
|
||||
[90] MakeNiceScreen::$30 = (byte)MakeNiceScreen::$22
|
||||
[91] MakeNiceScreen::$23 = XSize - MakeNiceScreen::$30
|
||||
[92] MakeNiceScreen::X#1 = MakeNiceScreen::$23 >> 1
|
||||
[93] cputsxy::s#0 = (byte*)MakeNiceScreen::T#3 + 1
|
||||
[94] cputsxy::x#0 = MakeNiceScreen::X#1
|
||||
|
||||
@@ -726,9 +726,9 @@ MakeNiceScreen::@1: scope:[MakeNiceScreen] from MakeNiceScreen::@18 MakeNiceScr
|
||||
MakeNiceScreen::@2: scope:[MakeNiceScreen] from MakeNiceScreen::@1
|
||||
MakeNiceScreen::I#6 = phi( MakeNiceScreen::@1/MakeNiceScreen::I#3 )
|
||||
MakeNiceScreen::T#3 = phi( MakeNiceScreen::@1/MakeNiceScreen::T#6 )
|
||||
MakeNiceScreen::$33 = (byte*)MakeNiceScreen::T#3
|
||||
MakeNiceScreen::$29 = MakeNiceScreen::$33 + OFFSET_STRUCT_$0_MSG
|
||||
strlen::str#1 = MakeNiceScreen::$29
|
||||
MakeNiceScreen::$29 = (byte*)MakeNiceScreen::T#3
|
||||
MakeNiceScreen::$26 = MakeNiceScreen::$29 + OFFSET_STRUCT_$0_MSG
|
||||
strlen::str#1 = MakeNiceScreen::$26
|
||||
call strlen
|
||||
strlen::return#2 = strlen::return#1
|
||||
to:MakeNiceScreen::@19
|
||||
@@ -737,17 +737,17 @@ MakeNiceScreen::@19: scope:[MakeNiceScreen] from MakeNiceScreen::@2
|
||||
MakeNiceScreen::T#4 = phi( MakeNiceScreen::@2/MakeNiceScreen::T#3 )
|
||||
strlen::return#4 = phi( MakeNiceScreen::@2/strlen::return#2 )
|
||||
MakeNiceScreen::$22 = strlen::return#4
|
||||
MakeNiceScreen::$34 = (byte)MakeNiceScreen::$22
|
||||
MakeNiceScreen::$23 = XSize - MakeNiceScreen::$34
|
||||
MakeNiceScreen::$30 = (byte)MakeNiceScreen::$22
|
||||
MakeNiceScreen::$23 = XSize - MakeNiceScreen::$30
|
||||
MakeNiceScreen::$24 = MakeNiceScreen::$23 >> 1
|
||||
MakeNiceScreen::X#1 = MakeNiceScreen::$24
|
||||
MakeNiceScreen::$37 = (byte*)MakeNiceScreen::T#4
|
||||
MakeNiceScreen::$30 = MakeNiceScreen::$37 + OFFSET_STRUCT_$0_Y
|
||||
MakeNiceScreen::$38 = (byte*)MakeNiceScreen::T#4
|
||||
MakeNiceScreen::$31 = MakeNiceScreen::$38 + OFFSET_STRUCT_$0_MSG
|
||||
MakeNiceScreen::$31 = (byte*)MakeNiceScreen::T#4
|
||||
MakeNiceScreen::$27 = MakeNiceScreen::$31 + OFFSET_STRUCT_$0_Y
|
||||
MakeNiceScreen::$32 = (byte*)MakeNiceScreen::T#4
|
||||
MakeNiceScreen::$28 = MakeNiceScreen::$32 + OFFSET_STRUCT_$0_MSG
|
||||
cputsxy::x#0 = MakeNiceScreen::X#1
|
||||
cputsxy::y#0 = *MakeNiceScreen::$30
|
||||
cputsxy::s#0 = MakeNiceScreen::$31
|
||||
cputsxy::y#0 = *MakeNiceScreen::$27
|
||||
cputsxy::s#0 = MakeNiceScreen::$28
|
||||
call cputsxy
|
||||
to:MakeNiceScreen::@20
|
||||
MakeNiceScreen::@20: scope:[MakeNiceScreen] from MakeNiceScreen::@19
|
||||
@@ -812,13 +812,13 @@ bool~ MakeNiceScreen::$21
|
||||
word~ MakeNiceScreen::$22
|
||||
byte~ MakeNiceScreen::$23
|
||||
byte~ MakeNiceScreen::$24
|
||||
byte*~ MakeNiceScreen::$26
|
||||
byte*~ MakeNiceScreen::$27
|
||||
byte*~ MakeNiceScreen::$28
|
||||
byte*~ MakeNiceScreen::$29
|
||||
byte*~ MakeNiceScreen::$30
|
||||
byte~ MakeNiceScreen::$30
|
||||
byte*~ MakeNiceScreen::$31
|
||||
byte*~ MakeNiceScreen::$33
|
||||
byte~ MakeNiceScreen::$34
|
||||
byte*~ MakeNiceScreen::$37
|
||||
byte*~ MakeNiceScreen::$38
|
||||
byte*~ MakeNiceScreen::$32
|
||||
number~ MakeNiceScreen::$7
|
||||
byte MakeNiceScreen::I
|
||||
byte MakeNiceScreen::I#0
|
||||
@@ -1519,10 +1519,10 @@ Alias chline::length#2 = MakeNiceScreen::$12
|
||||
Alias cvlinexy::x#1 = MakeNiceScreen::$15
|
||||
Alias MakeNiceScreen::T#3 = MakeNiceScreen::T#6 MakeNiceScreen::T#4 MakeNiceScreen::T#5
|
||||
Alias MakeNiceScreen::I#3 = MakeNiceScreen::I#6 MakeNiceScreen::I#5 MakeNiceScreen::I#4
|
||||
Alias strlen::str#1 = MakeNiceScreen::$29
|
||||
Alias strlen::str#1 = MakeNiceScreen::$26
|
||||
Alias strlen::return#2 = strlen::return#4
|
||||
Alias MakeNiceScreen::X#1 = MakeNiceScreen::$24
|
||||
Alias cputsxy::s#0 = MakeNiceScreen::$31
|
||||
Alias cputsxy::s#0 = MakeNiceScreen::$28
|
||||
Successful SSA optimization Pass2AliasElimination
|
||||
Alias candidate removed (volatile)conio_line_text = gotoxy::$5
|
||||
Alias candidate removed (volatile)conio_line_color = gotoxy::$6
|
||||
@@ -1641,10 +1641,10 @@ Constant MakeNiceScreen::T#1 = MakeNiceScreen::Text
|
||||
Constant MakeNiceScreen::$19 = sizeof MakeNiceScreen::Text
|
||||
Successful SSA optimization Pass2ConstantIdentification
|
||||
Rewriting conditional comparison [56] if(gotoxy::y#7<=$19) goto gotoxy::@1
|
||||
Converting *(pointer+n) to pointer[n] [298] cputsxy::y#0 = *MakeNiceScreen::$30 -- MakeNiceScreen::$37[OFFSET_STRUCT_$0_Y]
|
||||
Converting *(pointer+n) to pointer[n] [298] cputsxy::y#0 = *MakeNiceScreen::$27 -- MakeNiceScreen::$31[OFFSET_STRUCT_$0_Y]
|
||||
Successful SSA optimization Pass2InlineDerefIdx
|
||||
Simplifying expression containing zero MakeNiceScreen::$37 in [294] MakeNiceScreen::$30 = MakeNiceScreen::$37 + OFFSET_STRUCT_$0_Y
|
||||
Simplifying expression containing zero MakeNiceScreen::$37 in [298] cputsxy::y#0 = MakeNiceScreen::$37[OFFSET_STRUCT_$0_Y]
|
||||
Simplifying expression containing zero MakeNiceScreen::$31 in [294] MakeNiceScreen::$27 = MakeNiceScreen::$31 + OFFSET_STRUCT_$0_Y
|
||||
Simplifying expression containing zero MakeNiceScreen::$31 in [298] cputsxy::y#0 = MakeNiceScreen::$31[OFFSET_STRUCT_$0_Y]
|
||||
Successful SSA optimization PassNSimplifyExpressionWithZero
|
||||
Eliminating unused variable memcpy::return#2 and assignment [76] memcpy::return#2 = memcpy::destination#2
|
||||
Eliminating unused variable memcpy::return#3 and assignment [78] memcpy::return#3 = memcpy::destination#2
|
||||
@@ -1655,7 +1655,7 @@ Eliminating unused variable textcolor::return#2 and assignment [176] textcolor::
|
||||
Eliminating unused variable bordercolor::return#2 and assignment [178] bordercolor::return#2 = bordercolor::return#0
|
||||
Eliminating unused variable bgcolor::return#2 and assignment [180] bgcolor::return#2 = bgcolor::return#0
|
||||
Eliminating unused variable cursor::return#2 and assignment [183] cursor::return#2 = cursor::return#0
|
||||
Eliminating unused variable MakeNiceScreen::$30 and assignment [209] MakeNiceScreen::$30 = MakeNiceScreen::$37
|
||||
Eliminating unused variable MakeNiceScreen::$27 and assignment [209] MakeNiceScreen::$27 = MakeNiceScreen::$31
|
||||
Eliminating unused constant cputs::c#0
|
||||
Eliminating unused constant MakeNiceScreen::T#0
|
||||
Eliminating unused constant MakeNiceScreen::I#0
|
||||
@@ -1709,9 +1709,9 @@ Inlining Noop Cast [2] memcpy::dst#0 = (byte*)memcpy::destination#2 keeping memc
|
||||
Inlining Noop Cast [3] memcpy::$2 = (byte*)memcpy::source#2 keeping memcpy::source#2
|
||||
Inlining Noop Cast [13] memset::$4 = (byte*)memset::str#3 keeping memset::str#3
|
||||
Inlining Noop Cast [15] memset::dst#0 = (byte*)memset::str#3 keeping memset::str#3
|
||||
Inlining Noop Cast [182] MakeNiceScreen::$33 = (byte*)MakeNiceScreen::T#3 keeping MakeNiceScreen::T#3
|
||||
Inlining Noop Cast [190] MakeNiceScreen::$37 = (byte*)MakeNiceScreen::T#3 keeping MakeNiceScreen::T#3
|
||||
Inlining Noop Cast [191] MakeNiceScreen::$38 = (byte*)MakeNiceScreen::T#3 keeping MakeNiceScreen::T#3
|
||||
Inlining Noop Cast [182] MakeNiceScreen::$29 = (byte*)MakeNiceScreen::T#3 keeping MakeNiceScreen::T#3
|
||||
Inlining Noop Cast [190] MakeNiceScreen::$31 = (byte*)MakeNiceScreen::T#3 keeping MakeNiceScreen::T#3
|
||||
Inlining Noop Cast [191] MakeNiceScreen::$32 = (byte*)MakeNiceScreen::T#3 keeping MakeNiceScreen::T#3
|
||||
Successful SSA optimization Pass2NopCastInlining
|
||||
Rewriting multiplication to use shift and addition[49] gotoxy::line_offset#0 = gotoxy::$7 * $28
|
||||
Inlining constant with var siblings memcpy::destination#0
|
||||
@@ -2231,8 +2231,8 @@ MakeNiceScreen::@2: scope:[MakeNiceScreen] from MakeNiceScreen::@1
|
||||
to:MakeNiceScreen::@17
|
||||
MakeNiceScreen::@17: scope:[MakeNiceScreen] from MakeNiceScreen::@2
|
||||
[89] MakeNiceScreen::$22 = strlen::return#2
|
||||
[90] MakeNiceScreen::$34 = (byte)MakeNiceScreen::$22
|
||||
[91] MakeNiceScreen::$23 = XSize - MakeNiceScreen::$34
|
||||
[90] MakeNiceScreen::$30 = (byte)MakeNiceScreen::$22
|
||||
[91] MakeNiceScreen::$23 = XSize - MakeNiceScreen::$30
|
||||
[92] MakeNiceScreen::X#1 = MakeNiceScreen::$23 >> 1
|
||||
[93] cputsxy::s#0 = (byte*)MakeNiceScreen::T#3 + 1
|
||||
[94] cputsxy::x#0 = MakeNiceScreen::X#1
|
||||
@@ -2597,7 +2597,7 @@ VARIABLE REGISTER WEIGHTS
|
||||
void MakeNiceScreen()
|
||||
word~ MakeNiceScreen::$22 1001.0
|
||||
byte~ MakeNiceScreen::$23 2002.0
|
||||
byte~ MakeNiceScreen::$34 2002.0
|
||||
byte~ MakeNiceScreen::$30 2002.0
|
||||
byte MakeNiceScreen::I
|
||||
byte MakeNiceScreen::I#2 2002.0
|
||||
byte MakeNiceScreen::I#3 214.5
|
||||
@@ -2824,7 +2824,7 @@ Added variable gotoxy::$5 to live range equivalence class [ gotoxy::$5 ]
|
||||
Added variable gotoxy::$6 to live range equivalence class [ gotoxy::$6 ]
|
||||
Added variable strlen::return#2 to live range equivalence class [ strlen::return#2 ]
|
||||
Added variable MakeNiceScreen::$22 to live range equivalence class [ MakeNiceScreen::$22 ]
|
||||
Added variable MakeNiceScreen::$34 to live range equivalence class [ MakeNiceScreen::$34 ]
|
||||
Added variable MakeNiceScreen::$30 to live range equivalence class [ MakeNiceScreen::$30 ]
|
||||
Added variable MakeNiceScreen::$23 to live range equivalence class [ MakeNiceScreen::$23 ]
|
||||
Added variable MakeNiceScreen::X#1 to live range equivalence class [ MakeNiceScreen::X#1 ]
|
||||
Added variable cputsxy::s#0 to live range equivalence class [ cputsxy::s#0 ]
|
||||
@@ -2882,7 +2882,7 @@ Complete equivalence classes
|
||||
[ gotoxy::$6 ]
|
||||
[ strlen::return#2 ]
|
||||
[ MakeNiceScreen::$22 ]
|
||||
[ MakeNiceScreen::$34 ]
|
||||
[ MakeNiceScreen::$30 ]
|
||||
[ MakeNiceScreen::$23 ]
|
||||
[ MakeNiceScreen::X#1 ]
|
||||
[ cputsxy::s#0 ]
|
||||
@@ -2939,7 +2939,7 @@ Allocated zp[2]:62 [ gotoxy::$5 ]
|
||||
Allocated zp[2]:64 [ gotoxy::$6 ]
|
||||
Allocated zp[2]:66 [ strlen::return#2 ]
|
||||
Allocated zp[2]:68 [ MakeNiceScreen::$22 ]
|
||||
Allocated zp[1]:70 [ MakeNiceScreen::$34 ]
|
||||
Allocated zp[1]:70 [ MakeNiceScreen::$30 ]
|
||||
Allocated zp[1]:71 [ MakeNiceScreen::$23 ]
|
||||
Allocated zp[1]:72 [ MakeNiceScreen::X#1 ]
|
||||
Allocated zp[2]:73 [ cputsxy::s#0 ]
|
||||
@@ -2980,8 +2980,8 @@ Statement [51] *screensize::y#0 = $19 [ ] ( main:11::screensize:21 [ XSize ] { }
|
||||
Statement [86] strlen::str#1 = (byte*)MakeNiceScreen::T#3 + 1 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 strlen::str#1 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 strlen::str#1 ] { { strlen::return#2 = strlen::len#2 } } ) always clobbers reg byte a
|
||||
Statement [88] strlen::return#2 = strlen::len#2 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 strlen::return#2 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 strlen::return#2 ] { { strlen::return#2 = strlen::len#2 } } ) always clobbers reg byte a
|
||||
Statement [89] MakeNiceScreen::$22 = strlen::return#2 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$22 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$22 ] { { cputsxy::x#0 = MakeNiceScreen::X#1 } } ) always clobbers reg byte a
|
||||
Statement [90] MakeNiceScreen::$34 = (byte)MakeNiceScreen::$22 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$34 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$34 ] { { cputsxy::x#0 = MakeNiceScreen::X#1 } } ) always clobbers reg byte a
|
||||
Statement [91] MakeNiceScreen::$23 = XSize - MakeNiceScreen::$34 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$23 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$23 ] { { cputsxy::x#0 = MakeNiceScreen::X#1 } } ) always clobbers reg byte a
|
||||
Statement [90] MakeNiceScreen::$30 = (byte)MakeNiceScreen::$22 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$30 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$30 ] { { cputsxy::x#0 = MakeNiceScreen::X#1 } } ) always clobbers reg byte a
|
||||
Statement [91] MakeNiceScreen::$23 = XSize - MakeNiceScreen::$30 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$23 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$23 ] { { cputsxy::x#0 = MakeNiceScreen::X#1 } } ) always clobbers reg byte a
|
||||
Statement [92] MakeNiceScreen::X#1 = MakeNiceScreen::$23 >> 1 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::X#1 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::X#1 ] { { cputsxy::x#0 = MakeNiceScreen::X#1 } } ) always clobbers reg byte a
|
||||
Statement [93] cputsxy::s#0 = (byte*)MakeNiceScreen::T#3 + 1 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::X#1 cputsxy::s#0 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::X#1 cputsxy::s#0 ] { { cputsxy::x#0 = MakeNiceScreen::X#1 } } ) always clobbers reg byte a
|
||||
Removing always clobbered register reg byte a as potential for zp[1]:72 [ MakeNiceScreen::X#1 ]
|
||||
@@ -3057,8 +3057,8 @@ Statement [51] *screensize::y#0 = $19 [ ] ( main:11::screensize:21 [ XSize ] { }
|
||||
Statement [86] strlen::str#1 = (byte*)MakeNiceScreen::T#3 + 1 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 strlen::str#1 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 strlen::str#1 ] { { strlen::return#2 = strlen::len#2 } } ) always clobbers reg byte a
|
||||
Statement [88] strlen::return#2 = strlen::len#2 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 strlen::return#2 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 strlen::return#2 ] { { strlen::return#2 = strlen::len#2 } } ) always clobbers reg byte a
|
||||
Statement [89] MakeNiceScreen::$22 = strlen::return#2 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$22 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$22 ] { { cputsxy::x#0 = MakeNiceScreen::X#1 } } ) always clobbers reg byte a
|
||||
Statement [90] MakeNiceScreen::$34 = (byte)MakeNiceScreen::$22 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$34 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$34 ] { { cputsxy::x#0 = MakeNiceScreen::X#1 } } ) always clobbers reg byte a
|
||||
Statement [91] MakeNiceScreen::$23 = XSize - MakeNiceScreen::$34 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$23 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$23 ] { { cputsxy::x#0 = MakeNiceScreen::X#1 } } ) always clobbers reg byte a
|
||||
Statement [90] MakeNiceScreen::$30 = (byte)MakeNiceScreen::$22 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$30 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$30 ] { { cputsxy::x#0 = MakeNiceScreen::X#1 } } ) always clobbers reg byte a
|
||||
Statement [91] MakeNiceScreen::$23 = XSize - MakeNiceScreen::$30 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$23 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::$23 ] { { cputsxy::x#0 = MakeNiceScreen::X#1 } } ) always clobbers reg byte a
|
||||
Statement [92] MakeNiceScreen::X#1 = MakeNiceScreen::$23 >> 1 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::X#1 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::X#1 ] { { cputsxy::x#0 = MakeNiceScreen::X#1 } } ) always clobbers reg byte a
|
||||
Statement [93] cputsxy::s#0 = (byte*)MakeNiceScreen::T#3 + 1 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::X#1 cputsxy::s#0 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 MakeNiceScreen::X#1 cputsxy::s#0 ] { { cputsxy::x#0 = MakeNiceScreen::X#1 } } ) always clobbers reg byte a
|
||||
Statement [95] cputsxy::y#0 = *((byte*)MakeNiceScreen::T#3) [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 cputsxy::s#0 cputsxy::x#0 cputsxy::y#0 ] ( main:11::MakeNiceScreen:23 [ conio_textcolor conio_scroll_enable XSize MakeNiceScreen::I#3 MakeNiceScreen::T#3 cputsxy::s#0 cputsxy::x#0 cputsxy::y#0 ] { { cputsxy::x#0 = MakeNiceScreen::X#1 } } ) always clobbers reg byte a reg byte y
|
||||
@@ -3145,7 +3145,7 @@ Potential registers zp[2]:62 [ gotoxy::$5 ] : zp[2]:62 ,
|
||||
Potential registers zp[2]:64 [ gotoxy::$6 ] : zp[2]:64 ,
|
||||
Potential registers zp[2]:66 [ strlen::return#2 ] : zp[2]:66 ,
|
||||
Potential registers zp[2]:68 [ MakeNiceScreen::$22 ] : zp[2]:68 ,
|
||||
Potential registers zp[1]:70 [ MakeNiceScreen::$34 ] : zp[1]:70 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:70 [ MakeNiceScreen::$30 ] : zp[1]:70 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:71 [ MakeNiceScreen::$23 ] : zp[1]:71 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:72 [ MakeNiceScreen::X#1 ] : zp[1]:72 , reg byte x , reg byte y ,
|
||||
Potential registers zp[2]:73 [ cputsxy::s#0 ] : zp[2]:73 ,
|
||||
@@ -3170,7 +3170,7 @@ Uplift Scope [cvline] 237,502.38: zp[1]:25 [ cvline::i#2 cvline::i#1 ] 132,503.3
|
||||
Uplift Scope [chline] 275,002.75: zp[1]:17 [ chline::i#2 chline::i#1 ] 19,273.33: zp[1]:16 [ chline::length#4 chline::length#2 chline::length#1 chline::length#0 ]
|
||||
Uplift Scope [cputcxy] 13,004: zp[1]:14 [ cputcxy::y#2 cputcxy::y#0 ] 3,333.67: zp[1]:15 [ cputcxy::c#2 ]
|
||||
Uplift Scope [cputsxy] 5,501: zp[1]:75 [ cputsxy::x#0 ] 5,501: zp[1]:76 [ cputsxy::y#0 ] 1,833.67: zp[2]:73 [ cputsxy::s#0 ]
|
||||
Uplift Scope [MakeNiceScreen] 2,216.5: zp[1]:5 [ MakeNiceScreen::I#3 MakeNiceScreen::I#2 ] 2,002: zp[1]:70 [ MakeNiceScreen::$34 ] 2,002: zp[1]:71 [ MakeNiceScreen::$23 ] 1,155: zp[2]:6 [ MakeNiceScreen::T#3 MakeNiceScreen::T#2 ] 1,001: zp[2]:68 [ MakeNiceScreen::$22 ] 1,001: zp[1]:72 [ MakeNiceScreen::X#1 ]
|
||||
Uplift Scope [MakeNiceScreen] 2,216.5: zp[1]:5 [ MakeNiceScreen::I#3 MakeNiceScreen::I#2 ] 2,002: zp[1]:70 [ MakeNiceScreen::$30 ] 2,002: zp[1]:71 [ MakeNiceScreen::$23 ] 1,155: zp[2]:6 [ MakeNiceScreen::T#3 MakeNiceScreen::T#2 ] 1,001: zp[2]:68 [ MakeNiceScreen::$22 ] 1,001: zp[1]:72 [ MakeNiceScreen::X#1 ]
|
||||
Uplift Scope [cvlinexy] 1,304: zp[1]:19 [ cvlinexy::x#2 cvlinexy::x#1 ]
|
||||
Uplift Scope [MakeTeeLine] 1,001: zp[1]:20 [ MakeTeeLine::Y#2 ]
|
||||
Uplift Scope [kbhit] 367.33: zp[1]:77 [ kbhit::return#0 ] 202: zp[1]:52 [ kbhit::return#2 ]
|
||||
@@ -3201,7 +3201,7 @@ Uplifting [cvline] best 131919 combination zp[1]:25 [ cvline::i#2 cvline::i#1 ]
|
||||
Uplifting [chline] best 131919 combination zp[1]:17 [ chline::i#2 chline::i#1 ] zp[1]:16 [ chline::length#4 chline::length#2 chline::length#1 chline::length#0 ]
|
||||
Uplifting [cputcxy] best 131903 combination reg byte a [ cputcxy::y#2 cputcxy::y#0 ] reg byte y [ cputcxy::c#2 ]
|
||||
Uplifting [cputsxy] best 131837 combination reg byte x [ cputsxy::x#0 ] reg byte a [ cputsxy::y#0 ] zp[2]:73 [ cputsxy::s#0 ]
|
||||
Uplifting [MakeNiceScreen] best 131697 combination zp[1]:5 [ MakeNiceScreen::I#3 MakeNiceScreen::I#2 ] reg byte a [ MakeNiceScreen::$34 ] reg byte a [ MakeNiceScreen::$23 ] zp[2]:6 [ MakeNiceScreen::T#3 MakeNiceScreen::T#2 ] zp[2]:68 [ MakeNiceScreen::$22 ] reg byte x [ MakeNiceScreen::X#1 ]
|
||||
Uplifting [MakeNiceScreen] best 131697 combination zp[1]:5 [ MakeNiceScreen::I#3 MakeNiceScreen::I#2 ] reg byte a [ MakeNiceScreen::$30 ] reg byte a [ MakeNiceScreen::$23 ] zp[2]:6 [ MakeNiceScreen::T#3 MakeNiceScreen::T#2 ] zp[2]:68 [ MakeNiceScreen::$22 ] reg byte x [ MakeNiceScreen::X#1 ]
|
||||
Uplifting [cvlinexy] best 131688 combination reg byte x [ cvlinexy::x#2 cvlinexy::x#1 ]
|
||||
Uplifting [MakeTeeLine] best 131679 combination reg byte a [ MakeTeeLine::Y#2 ]
|
||||
Uplifting [kbhit] best 131586 combination reg byte a [ kbhit::return#0 ] reg byte a [ kbhit::return#2 ]
|
||||
@@ -3797,9 +3797,9 @@ MakeNiceScreen: {
|
||||
// MakeNiceScreen::@17
|
||||
__b17:
|
||||
// [89] MakeNiceScreen::$22 = strlen::return#2
|
||||
// [90] MakeNiceScreen::$34 = (byte)MakeNiceScreen::$22 -- vbuaa=_byte_vwuz1
|
||||
// [90] MakeNiceScreen::$30 = (byte)MakeNiceScreen::$22 -- vbuaa=_byte_vwuz1
|
||||
lda.z __22
|
||||
// [91] MakeNiceScreen::$23 = XSize - MakeNiceScreen::$34 -- vbuaa=vbuz1_minus_vbuaa
|
||||
// [91] MakeNiceScreen::$23 = XSize - MakeNiceScreen::$30 -- vbuaa=vbuz1_minus_vbuaa
|
||||
eor #$ff
|
||||
sec
|
||||
adc.z XSize
|
||||
@@ -4981,7 +4981,7 @@ const nomodify byte LIGHT_BLUE = $e
|
||||
void MakeNiceScreen()
|
||||
word~ MakeNiceScreen::$22 zp[2]:5 1001.0
|
||||
byte~ MakeNiceScreen::$23 reg byte a 2002.0
|
||||
byte~ MakeNiceScreen::$34 reg byte a 2002.0
|
||||
byte~ MakeNiceScreen::$30 reg byte a 2002.0
|
||||
byte MakeNiceScreen::I
|
||||
byte MakeNiceScreen::I#2 I zp[1]:2 2002.0
|
||||
byte MakeNiceScreen::I#3 I zp[1]:2 214.5
|
||||
@@ -5203,7 +5203,7 @@ reg byte a [ main::$3 ]
|
||||
zp[2]:23 [ gotoxy::$7 gotoxy::$9 gotoxy::line_offset#0 gotoxy::$6 ]
|
||||
zp[2]:25 [ gotoxy::$8 ]
|
||||
zp[2]:27 [ gotoxy::$5 ]
|
||||
reg byte a [ MakeNiceScreen::$34 ]
|
||||
reg byte a [ MakeNiceScreen::$30 ]
|
||||
reg byte a [ MakeNiceScreen::$23 ]
|
||||
reg byte x [ MakeNiceScreen::X#1 ]
|
||||
reg byte x [ cputsxy::x#0 ]
|
||||
@@ -5678,9 +5678,9 @@ MakeNiceScreen: {
|
||||
// MakeNiceScreen::@17
|
||||
// [89] MakeNiceScreen::$22 = strlen::return#2
|
||||
// XSize - (char)strlen (T->Msg)
|
||||
// [90] MakeNiceScreen::$34 = (byte)MakeNiceScreen::$22 -- vbuaa=_byte_vwuz1
|
||||
// [90] MakeNiceScreen::$30 = (byte)MakeNiceScreen::$22 -- vbuaa=_byte_vwuz1
|
||||
lda.z __22
|
||||
// [91] MakeNiceScreen::$23 = XSize - MakeNiceScreen::$34 -- vbuaa=vbuz1_minus_vbuaa
|
||||
// [91] MakeNiceScreen::$23 = XSize - MakeNiceScreen::$30 -- vbuaa=vbuz1_minus_vbuaa
|
||||
eor #$ff
|
||||
sec
|
||||
adc.z XSize
|
||||
|
||||
@@ -14,7 +14,7 @@ const nomodify byte LIGHT_BLUE = $e
|
||||
void MakeNiceScreen()
|
||||
word~ MakeNiceScreen::$22 zp[2]:5 1001.0
|
||||
byte~ MakeNiceScreen::$23 reg byte a 2002.0
|
||||
byte~ MakeNiceScreen::$34 reg byte a 2002.0
|
||||
byte~ MakeNiceScreen::$30 reg byte a 2002.0
|
||||
byte MakeNiceScreen::I
|
||||
byte MakeNiceScreen::I#2 I zp[1]:2 2002.0
|
||||
byte MakeNiceScreen::I#3 I zp[1]:2 214.5
|
||||
@@ -236,7 +236,7 @@ reg byte a [ main::$3 ]
|
||||
zp[2]:23 [ gotoxy::$7 gotoxy::$9 gotoxy::line_offset#0 gotoxy::$6 ]
|
||||
zp[2]:25 [ gotoxy::$8 ]
|
||||
zp[2]:27 [ gotoxy::$5 ]
|
||||
reg byte a [ MakeNiceScreen::$34 ]
|
||||
reg byte a [ MakeNiceScreen::$30 ]
|
||||
reg byte a [ MakeNiceScreen::$23 ]
|
||||
reg byte x [ MakeNiceScreen::X#1 ]
|
||||
reg byte x [ cputsxy::x#0 ]
|
||||
|
||||
@@ -2,6 +2,7 @@ Fixing struct type size struct printf_buffer_number to 12
|
||||
Fixing struct type size struct printf_buffer_number to 12
|
||||
Fixing struct type SIZE_OF struct printf_buffer_number to 12
|
||||
Fixing struct type SIZE_OF struct printf_buffer_number to 12
|
||||
Converting variable modified inside __stackcall procedure queen() to load/store count
|
||||
Added struct type cast to parameter value list call printf_uint 8 (struct printf_format_number){ 0, 0, 0, 0, 0, DECIMAL }
|
||||
Added struct type cast to parameter value list call printf_ulong count (struct printf_format_number){ 0, 0, 0, 0, 0, DECIMAL }
|
||||
Added struct type cast to parameter value list call printf_string main::$6 (struct printf_format_string){ 0, 0 }
|
||||
@@ -21,9 +22,8 @@ Eliminating unused variable with no statement print::$3
|
||||
Eliminating unused variable with no statement print::$5
|
||||
Eliminating unused variable with no statement print::$8
|
||||
Eliminating unused variable with no statement print::$9
|
||||
Converting PHI-variable modified inside __stackcall procedure queen() to load/store count
|
||||
Calling convention STACK_CALL adding prepare/execute/finalize for call queen 1
|
||||
Calling convention STACK_CALL adding prepare/execute/finalize for call queen queen::$4
|
||||
Calling convention __stackcall adding prepare/execute/finalize for call queen 1
|
||||
Calling convention __stackcall adding prepare/execute/finalize for call queen queen::$4
|
||||
Calling convention STACK_CALL replacing param(queen::row) with stackidx(byte,queen::OFFSET_STACK_ROW)
|
||||
Calling convention STACK_CALL adding stack push stackpush(byte) = 1
|
||||
Calling convention STACK_CALL adding stack push stackpush(byte) = queen::$4
|
||||
|
||||
@@ -85,10 +85,9 @@ main: {
|
||||
iny
|
||||
lda (__3),y
|
||||
adc (__9),y
|
||||
sta (__3),y
|
||||
dey
|
||||
sta.z __3+1
|
||||
pla
|
||||
sta (__3),y
|
||||
sta.z __3
|
||||
// fibs[i+2] = fibs[i]+fibs[i+1]
|
||||
asl.z __8
|
||||
rol.z __8+1
|
||||
|
||||
@@ -367,10 +367,9 @@ main: {
|
||||
iny
|
||||
lda (__3),y
|
||||
adc (__9),y
|
||||
sta (__3),y
|
||||
dey
|
||||
sta.z __3+1
|
||||
pla
|
||||
sta (__3),y
|
||||
sta.z __3
|
||||
// [12] main::$8 = main::$1 << 1 -- vwuz1=vwuz1_rol_1
|
||||
asl.z __8
|
||||
rol.z __8+1
|
||||
@@ -439,7 +438,7 @@ zp[2]:8 [ main::$6 main::$9 ]
|
||||
|
||||
|
||||
FINAL ASSEMBLER
|
||||
Score: 2361
|
||||
Score: 2281
|
||||
|
||||
// File Comments
|
||||
// Test array index pointer rewriting
|
||||
@@ -548,10 +547,9 @@ main: {
|
||||
iny
|
||||
lda (__3),y
|
||||
adc (__9),y
|
||||
sta (__3),y
|
||||
dey
|
||||
sta.z __3+1
|
||||
pla
|
||||
sta (__3),y
|
||||
sta.z __3
|
||||
// fibs[i+2] = fibs[i]+fibs[i+1]
|
||||
// [12] main::$8 = main::$1 << 1 -- vwuz1=vwuz1_rol_1
|
||||
asl.z __8
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
// Demonstrates missing fragment
|
||||
// https://gitlab.com/camelot/kickc/-/issues/293
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
.label SCREEN = $400
|
||||
main: {
|
||||
.label a = 2
|
||||
// foo(1)
|
||||
jsr foo
|
||||
// a=(foo(1) & 3)
|
||||
and #3
|
||||
sta.z a
|
||||
lda #0
|
||||
sta.z a+1
|
||||
// *SCREEN = (byte)a
|
||||
lda.z a
|
||||
sta SCREEN
|
||||
// }
|
||||
rts
|
||||
}
|
||||
foo: {
|
||||
.const x = 1
|
||||
// return bar[x];
|
||||
lda bar+x
|
||||
// }
|
||||
rts
|
||||
}
|
||||
bar: .byte 9, 1, 2, 3, 4, 5, 6, 7, 8, 9
|
||||
@@ -0,0 +1,23 @@
|
||||
|
||||
void main()
|
||||
main: scope:[main] from
|
||||
[0] phi()
|
||||
[1] call foo
|
||||
[2] foo::return#0 = foo::return#1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
[3] main::$0 = foo::return#0
|
||||
[4] main::a#1 = main::$0 & 3
|
||||
[5] *SCREEN = (byte)main::a#1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
[6] return
|
||||
to:@return
|
||||
|
||||
byte foo(byte foo::x)
|
||||
foo: scope:[foo] from main
|
||||
[7] foo::return#1 = *(bar+foo::x#0)
|
||||
to:foo::@return
|
||||
foo::@return: scope:[foo] from foo
|
||||
[8] return
|
||||
to:@return
|
||||
@@ -0,0 +1,307 @@
|
||||
Inlined call call __init
|
||||
|
||||
CONTROL FLOW GRAPH SSA
|
||||
|
||||
void main()
|
||||
main: scope:[main] from __start::@1
|
||||
main::a#0 = 0
|
||||
foo::x#0 = 1
|
||||
call foo
|
||||
foo::return#0 = foo::return#2
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
foo::return#3 = phi( main/foo::return#0 )
|
||||
main::$0 = foo::return#3
|
||||
main::$1 = main::$0 & 3
|
||||
main::a#1 = main::$1
|
||||
*SCREEN = (byte)main::a#1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
return
|
||||
to:@return
|
||||
|
||||
byte foo(byte foo::x)
|
||||
foo: scope:[foo] from main
|
||||
foo::x#1 = phi( main/foo::x#0 )
|
||||
foo::return#1 = bar[foo::x#1]
|
||||
to:foo::@return
|
||||
foo::@return: scope:[foo] from foo
|
||||
foo::return#4 = phi( foo/foo::return#1 )
|
||||
foo::return#2 = foo::return#4
|
||||
return
|
||||
to:@return
|
||||
|
||||
void __start()
|
||||
__start: scope:[__start] from
|
||||
to:__start::__init1
|
||||
__start::__init1: scope:[__start] from __start
|
||||
to:__start::@1
|
||||
__start::@1: scope:[__start] from __start::__init1
|
||||
call main
|
||||
to:__start::@2
|
||||
__start::@2: scope:[__start] from __start::@1
|
||||
to:__start::@return
|
||||
__start::@return: scope:[__start] from __start::@2
|
||||
return
|
||||
to:@return
|
||||
|
||||
SYMBOL TABLE SSA
|
||||
const byte* SCREEN = (byte*)$400
|
||||
void __start()
|
||||
const byte* bar[$a] = { 9, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
|
||||
byte foo(byte foo::x)
|
||||
byte foo::return
|
||||
byte foo::return#0
|
||||
byte foo::return#1
|
||||
byte foo::return#2
|
||||
byte foo::return#3
|
||||
byte foo::return#4
|
||||
byte foo::x
|
||||
byte foo::x#0
|
||||
byte foo::x#1
|
||||
void main()
|
||||
byte~ main::$0
|
||||
number~ main::$1
|
||||
word main::a
|
||||
word main::a#0
|
||||
word main::a#1
|
||||
|
||||
Adding number conversion cast (unumber) 1 in foo::x#0 = 1
|
||||
Adding number conversion cast (unumber) 3 in main::$1 = main::$0 & 3
|
||||
Adding number conversion cast (unumber) main::$1 in main::$1 = main::$0 & (unumber)3
|
||||
Successful SSA optimization PassNAddNumberTypeConversions
|
||||
Inlining cast foo::x#0 = (unumber)1
|
||||
Successful SSA optimization Pass2InlineCast
|
||||
Simplifying constant pointer cast (byte*) 1024
|
||||
Simplifying constant integer cast 1
|
||||
Simplifying constant integer cast 3
|
||||
Successful SSA optimization PassNCastSimplification
|
||||
Finalized unsigned number type 1
|
||||
Finalized unsigned number type 3
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Inferred type updated to byte in main::$1 = main::$0 & 3
|
||||
Alias foo::return#0 = foo::return#3
|
||||
Alias main::a#1 = main::$1
|
||||
Alias foo::return#1 = foo::return#4 foo::return#2
|
||||
Successful SSA optimization Pass2AliasElimination
|
||||
Identical Phi Values foo::x#1 foo::x#0
|
||||
Successful SSA optimization Pass2IdenticalPhiElimination
|
||||
Constant main::a#0 = 0
|
||||
Constant foo::x#0 = 1
|
||||
Successful SSA optimization Pass2ConstantIdentification
|
||||
Eliminating unused constant main::a#0
|
||||
Successful SSA optimization PassNEliminateUnusedVars
|
||||
Removing unused procedure __start
|
||||
Removing unused procedure block __start
|
||||
Removing unused procedure block __start::__init1
|
||||
Removing unused procedure block __start::@1
|
||||
Removing unused procedure block __start::@2
|
||||
Removing unused procedure block __start::@return
|
||||
Successful SSA optimization PassNEliminateEmptyStart
|
||||
Consolidated array index constant in *(bar+foo::x#0)
|
||||
Successful SSA optimization Pass2ConstantAdditionElimination
|
||||
Adding NOP phi() at start of main
|
||||
CALL GRAPH
|
||||
Calls in [main] to foo: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 foo
|
||||
[2] foo::return#0 = foo::return#1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
[3] main::$0 = foo::return#0
|
||||
[4] main::a#1 = main::$0 & 3
|
||||
[5] *SCREEN = (byte)main::a#1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
[6] return
|
||||
to:@return
|
||||
|
||||
byte foo(byte foo::x)
|
||||
foo: scope:[foo] from main
|
||||
[7] foo::return#1 = *(bar+foo::x#0)
|
||||
to:foo::@return
|
||||
foo::@return: scope:[foo] from foo
|
||||
[8] return
|
||||
to:@return
|
||||
|
||||
|
||||
VARIABLE REGISTER WEIGHTS
|
||||
byte foo(byte foo::x)
|
||||
byte foo::return
|
||||
byte foo::return#0 4.0
|
||||
byte foo::return#1 4.333333333333333
|
||||
byte foo::x
|
||||
void main()
|
||||
byte~ main::$0 4.0
|
||||
word main::a
|
||||
word main::a#1 2.0
|
||||
|
||||
Initial phi equivalence classes
|
||||
Added variable foo::return#0 to live range equivalence class [ foo::return#0 ]
|
||||
Added variable main::$0 to live range equivalence class [ main::$0 ]
|
||||
Added variable main::a#1 to live range equivalence class [ main::a#1 ]
|
||||
Added variable foo::return#1 to live range equivalence class [ foo::return#1 ]
|
||||
Complete equivalence classes
|
||||
[ foo::return#0 ]
|
||||
[ main::$0 ]
|
||||
[ main::a#1 ]
|
||||
[ foo::return#1 ]
|
||||
Allocated zp[1]:2 [ foo::return#0 ]
|
||||
Allocated zp[1]:3 [ main::$0 ]
|
||||
Allocated zp[2]:4 [ main::a#1 ]
|
||||
Allocated zp[1]:6 [ foo::return#1 ]
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
Statement [4] main::a#1 = main::$0 & 3 [ main::a#1 ] ( [ main::a#1 ] { } ) always clobbers reg byte a
|
||||
Statement [5] *SCREEN = (byte)main::a#1 [ ] ( [ ] { } ) always clobbers reg byte a
|
||||
Potential registers zp[1]:2 [ foo::return#0 ] : zp[1]:2 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:3 [ main::$0 ] : zp[1]:3 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[2]:4 [ main::a#1 ] : zp[2]:4 ,
|
||||
Potential registers zp[1]:6 [ foo::return#1 ] : zp[1]:6 , reg byte a , reg byte x , reg byte y ,
|
||||
|
||||
REGISTER UPLIFT SCOPES
|
||||
Uplift Scope [foo] 4.33: zp[1]:6 [ foo::return#1 ] 4: zp[1]:2 [ foo::return#0 ]
|
||||
Uplift Scope [main] 4: zp[1]:3 [ main::$0 ] 2: zp[2]:4 [ main::a#1 ]
|
||||
Uplift Scope []
|
||||
|
||||
Uplifting [foo] best 54 combination reg byte a [ foo::return#1 ] reg byte a [ foo::return#0 ]
|
||||
Uplifting [main] best 48 combination reg byte a [ main::$0 ] zp[2]:4 [ main::a#1 ]
|
||||
Uplifting [] best 48 combination
|
||||
Allocated (was zp[2]:4) zp[2]:2 [ main::a#1 ]
|
||||
|
||||
ASSEMBLER BEFORE OPTIMIZATION
|
||||
// File Comments
|
||||
// Demonstrates missing fragment
|
||||
// https://gitlab.com/camelot/kickc/-/issues/293
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
.label SCREEN = $400
|
||||
// main
|
||||
main: {
|
||||
.label a = 2
|
||||
// [1] call foo
|
||||
jsr foo
|
||||
// [2] foo::return#0 = foo::return#1
|
||||
jmp __b1
|
||||
// main::@1
|
||||
__b1:
|
||||
// [3] main::$0 = foo::return#0
|
||||
// [4] main::a#1 = main::$0 & 3 -- vwuz1=vbuaa_band_vbuc1
|
||||
and #3
|
||||
sta.z a
|
||||
lda #0
|
||||
sta.z a+1
|
||||
// [5] *SCREEN = (byte)main::a#1 -- _deref_pbuc1=_byte_vwuz1
|
||||
lda.z a
|
||||
sta SCREEN
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [6] return
|
||||
rts
|
||||
}
|
||||
// foo
|
||||
foo: {
|
||||
.const x = 1
|
||||
// [7] foo::return#1 = *(bar+foo::x#0) -- vbuaa=_deref_pbuc1
|
||||
lda bar+x
|
||||
jmp __breturn
|
||||
// foo::@return
|
||||
__breturn:
|
||||
// [8] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
bar: .byte 9, 1, 2, 3, 4, 5, 6, 7, 8, 9
|
||||
|
||||
ASSEMBLER OPTIMIZATIONS
|
||||
Removing instruction jmp __b1
|
||||
Removing instruction jmp __breturn
|
||||
Removing instruction jmp __breturn
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
Removing instruction __b1:
|
||||
Removing instruction __breturn:
|
||||
Removing instruction __breturn:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
|
||||
FINAL SYMBOL TABLE
|
||||
const byte* SCREEN = (byte*) 1024
|
||||
const byte* bar[$a] = { 9, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
|
||||
byte foo(byte foo::x)
|
||||
byte foo::return
|
||||
byte foo::return#0 reg byte a 4.0
|
||||
byte foo::return#1 reg byte a 4.333333333333333
|
||||
byte foo::x
|
||||
const byte foo::x#0 x = 1
|
||||
void main()
|
||||
byte~ main::$0 reg byte a 4.0
|
||||
word main::a
|
||||
word main::a#1 a zp[2]:2 2.0
|
||||
|
||||
reg byte a [ foo::return#0 ]
|
||||
reg byte a [ main::$0 ]
|
||||
zp[2]:2 [ main::a#1 ]
|
||||
reg byte a [ foo::return#1 ]
|
||||
|
||||
|
||||
FINAL ASSEMBLER
|
||||
Score: 39
|
||||
|
||||
// File Comments
|
||||
// Demonstrates missing fragment
|
||||
// https://gitlab.com/camelot/kickc/-/issues/293
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
.label SCREEN = $400
|
||||
// main
|
||||
main: {
|
||||
.label a = 2
|
||||
// foo(1)
|
||||
// [1] call foo
|
||||
jsr foo
|
||||
// [2] foo::return#0 = foo::return#1
|
||||
// main::@1
|
||||
// [3] main::$0 = foo::return#0
|
||||
// a=(foo(1) & 3)
|
||||
// [4] main::a#1 = main::$0 & 3 -- vwuz1=vbuaa_band_vbuc1
|
||||
and #3
|
||||
sta.z a
|
||||
lda #0
|
||||
sta.z a+1
|
||||
// *SCREEN = (byte)a
|
||||
// [5] *SCREEN = (byte)main::a#1 -- _deref_pbuc1=_byte_vwuz1
|
||||
lda.z a
|
||||
sta SCREEN
|
||||
// main::@return
|
||||
// }
|
||||
// [6] return
|
||||
rts
|
||||
}
|
||||
// foo
|
||||
foo: {
|
||||
.const x = 1
|
||||
// return bar[x];
|
||||
// [7] foo::return#1 = *(bar+foo::x#0) -- vbuaa=_deref_pbuc1
|
||||
lda bar+x
|
||||
// foo::@return
|
||||
// }
|
||||
// [8] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
bar: .byte 9, 1, 2, 3, 4, 5, 6, 7, 8, 9
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
const byte* SCREEN = (byte*) 1024
|
||||
const byte* bar[$a] = { 9, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
|
||||
byte foo(byte foo::x)
|
||||
byte foo::return
|
||||
byte foo::return#0 reg byte a 4.0
|
||||
byte foo::return#1 reg byte a 4.333333333333333
|
||||
byte foo::x
|
||||
const byte foo::x#0 x = 1
|
||||
void main()
|
||||
byte~ main::$0 reg byte a 4.0
|
||||
word main::a
|
||||
word main::a#1 a zp[2]:2 2.0
|
||||
|
||||
reg byte a [ foo::return#0 ]
|
||||
reg byte a [ main::$0 ]
|
||||
zp[2]:2 [ main::a#1 ]
|
||||
reg byte a [ foo::return#1 ]
|
||||
@@ -1,5 +1,5 @@
|
||||
// Tests the target platform ASM6502
|
||||
.pc = $2000 "Program"
|
||||
.pc = $3000 "Program"
|
||||
main: {
|
||||
ldx #0
|
||||
__b1:
|
||||
|
||||
@@ -115,7 +115,7 @@ ASSEMBLER BEFORE OPTIMIZATION
|
||||
// File Comments
|
||||
// Tests the target platform ASM6502
|
||||
// Upstart
|
||||
.pc = $2000 "Program"
|
||||
.pc = $3000 "Program"
|
||||
// Global Constants & labels
|
||||
// main
|
||||
main: {
|
||||
@@ -174,7 +174,7 @@ Score: 191
|
||||
// File Comments
|
||||
// Tests the target platform ASM6502
|
||||
// Upstart
|
||||
.pc = $2000 "Program"
|
||||
.pc = $3000 "Program"
|
||||
// Global Constants & labels
|
||||
// main
|
||||
main: {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user