diff --git a/src/main/fragment/cache/fragment-cache-csg65ce02.asm b/src/main/fragment/cache/fragment-cache-csg65ce02.asm index aaae666bf..2389d5d7c 100644 --- a/src/main/fragment/cache/fragment-cache-csg65ce02.asm +++ b/src/main/fragment/cache/fragment-cache-csg65ce02.asm @@ -1,4 +1,4 @@ -//KICKC FRAGMENT CACHE 10dedb3bb9 10dedb58e1 +//KICKC FRAGMENT CACHE 106673312a 1066734e54 //FRAGMENT vbuz1=vbuc1 lda #{c1} sta {z1} diff --git a/src/main/fragment/cache/fragment-cache-mega45gs02.asm b/src/main/fragment/cache/fragment-cache-mega45gs02.asm index a05e7c2da..86ec0a0ff 100644 --- a/src/main/fragment/cache/fragment-cache-mega45gs02.asm +++ b/src/main/fragment/cache/fragment-cache-mega45gs02.asm @@ -1,4 +1,4 @@ -//KICKC FRAGMENT CACHE 10dedb3bb9 10dedb58e1 +//KICKC FRAGMENT CACHE 106673312a 1066734e54 //FRAGMENT _deref_pbuc1=vbuc2 lda #{c2} sta {c1} @@ -1389,37 +1389,70 @@ asw {z1} asw {z1} asw {z1} asw {z1} -//FRAGMENT _deref_pbuc1=_inc__deref_pbuc1 -inc {c1} -//FRAGMENT vwuz1=vbuc1 -lda #<{c1} -sta {z1} -lda #>{c1} -sta {z1}+1 -//FRAGMENT _deref_pbuc1_eq_vbuz1_then_la1 -lda {c1} -cmp {z1} -beq {la1} -//FRAGMENT _deref_pbuc1=_dec__deref_pbuc1 -dec {c1} -//FRAGMENT pbuc1_derefidx_vbuz1=_inc_pbuc1_derefidx_vbuz1 -ldx {z1} -inc {c1},x //FRAGMENT vwuz1=vwuc1 lda #<{c1} sta {z1} lda #>{c1} sta {z1}+1 -//FRAGMENT vbuz1=_lo_vwuz2 +//FRAGMENT pwuz1=pbuc1 +lda #<{c1} +sta {z1} +lda #>{c1} +sta {z1}+1 +//FRAGMENT pbuz1=pbuz1_plus_vwuc1 +clc +lda {z1} +adc #<{c1} +sta {z1} +lda {z1}+1 +adc #>{c1} +sta {z1}+1 +//FRAGMENT pbuz1_derefidx_vbuz2=pbuz3_derefidx_vbuz2 +ldy {z2} +lda ({z3}),y +sta ({z1}),y +//FRAGMENT pwuz1=pwuz1_plus_vbuc1 +lda #{c1} +clc +adc {z1} +sta {z1} +bcc !+ +inc {z1}+1 +!: +//FRAGMENT vbuz1=vbuz2_rol_1 lda {z2} +asl sta {z1} -//FRAGMENT vbuz1=_hi_vwuz2 -lda {z2}+1 -sta {z1} -//FRAGMENT vbuz1=vbuz2_bor_vbuz3 -lda {z2} -ora {z3} +//FRAGMENT pwuz1_derefidx_vbuz2=vwuz3 +ldy {z2} +lda {z3} +sta ({z1}),y +iny +lda {z3}+1 +sta ({z1}),y +//FRAGMENT vwuz1=vwuz1_plus_vbuc1 +lda #{c1} +clc +adc {z1} sta {z1} +bcc !+ +inc {z1}+1 +!: +//FRAGMENT _deref_pwuc1=vwuz1 +lda {z1} +sta {c1} +lda {z1}+1 +sta {c1}+1 +//FRAGMENT _deref_qbuc1=_ptr_vbuz1 +lda {z1} +sta {c1} +lda #0 +sta {c1}+1 +//FRAGMENT _deref_qbuc1=pbuz1 +lda {z1} +sta {c1} +lda {z1}+1 +sta {c1}+1 //FRAGMENT _deref_pwuc1=vwuc2 lda #<{c2} sta {c1} @@ -1430,112 +1463,162 @@ lda #<{c2} sta {c1} lda #>{c2} sta {c1}+1 -//FRAGMENT _deref_pbuc1_eq_vbuaa_then_la1 -cmp {c1} -beq {la1} -//FRAGMENT pbuc1_derefidx_vbuaa=_inc_pbuc1_derefidx_vbuaa -tax -inc {c1},x -//FRAGMENT pbuc1_derefidx_vbuxx=_inc_pbuc1_derefidx_vbuxx -inc {c1},x -//FRAGMENT vbuaa=_lo_vwuz1 +//FRAGMENT pbuz1_derefidx_vbuaa=pbuz2_derefidx_vbuaa +tay +lda ({z2}),y +sta ({z1}),y +//FRAGMENT pbuz1_derefidx_vbuxx=pbuz2_derefidx_vbuxx +txa +tay +lda ({z2}),y +sta ({z1}),y +//FRAGMENT pbuz1_derefidx_vbuyy=pbuz2_derefidx_vbuyy +lda ({z2}),y +sta ({z1}),y +//FRAGMENT pbuz1_derefidx_vbuzz=pbuz2_derefidx_vbuzz +tza +tay +lda ({z2}),y +sta ({z1}),y +//FRAGMENT vwuz1=_word_vbuaa +sta {z1} +lda #0 +sta {z1}+1 +//FRAGMENT vbuz1=vbuaa_rol_1 +asl +sta {z1} +//FRAGMENT vbuz1=vbuxx_rol_1 +txa +asl +sta {z1} +//FRAGMENT vbuz1=vbuyy_rol_1 +tya +asl +sta {z1} +//FRAGMENT vbuz1=vbuzz_rol_1 +tza +asl +sta {z1} +//FRAGMENT vbuaa=vbuz1_rol_1 lda {z1} -//FRAGMENT vbuxx=_lo_vwuz1 -ldx {z1} -//FRAGMENT vbuaa=_hi_vwuz1 -lda {z1}+1 -//FRAGMENT vbuxx=_hi_vwuz1 -ldx {z1}+1 -//FRAGMENT vbuz1=vbuxx_bor_vbuz2 +asl +//FRAGMENT vbuaa=vbuaa_rol_1 +asl +//FRAGMENT vbuaa=vbuxx_rol_1 txa -ora {z2} -sta {z1} -//FRAGMENT vbuz1=vbuyy_bor_vbuz2 +asl +//FRAGMENT vbuaa=vbuyy_rol_1 tya -ora {z2} -sta {z1} -//FRAGMENT vbuz1=vbuzz_bor_vbuz2 +asl +//FRAGMENT vbuaa=vbuzz_rol_1 tza -ora {z2} -sta {z1} -//FRAGMENT vbuz1=vbuz2_bor_vbuaa -ora {z2} -sta {z1} -//FRAGMENT vbuz1=vbuxx_bor_vbuaa -stx $ff -ora $ff -sta {z1} -//FRAGMENT vbuz1=vbuyy_bor_vbuaa -sty $ff -ora $ff -sta {z1} -//FRAGMENT vbuz1=vbuzz_bor_vbuaa -tay -tza -sty $ff -ora $ff -sta {z1} -//FRAGMENT vbuz1=vbuz2_bor_vbuxx +asl +//FRAGMENT vbuxx=vbuz1_rol_1 +lda {z1} +asl +tax +//FRAGMENT vbuxx=vbuaa_rol_1 +asl +tax +//FRAGMENT vbuxx=vbuxx_rol_1 txa -ora {z2} -sta {z1} -//FRAGMENT vbuz1=vbuxx_bor_vbuxx -stx {z1} -//FRAGMENT vbuyy=_lo_vwuz1 -ldy {z1} -//FRAGMENT vbuzz=_lo_vwuz1 -ldz {z1} -//FRAGMENT vbuyy=_hi_vwuz1 -ldy {z1}+1 -//FRAGMENT vbuzz=_hi_vwuz1 -ldz {z1}+1 -//FRAGMENT vbuz1=vbuz2_bor_vbuyy +asl +tax +//FRAGMENT vbuxx=vbuyy_rol_1 tya -ora {z2} -sta {z1} -//FRAGMENT pbuc1_derefidx_vbuyy=_inc_pbuc1_derefidx_vbuyy -lda {c1},y -inc -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuzz=_inc_pbuc1_derefidx_vbuzz +asl +tax +//FRAGMENT vbuxx=vbuzz_rol_1 tza +asl tax -inc {c1},x -//FRAGMENT _deref_pbuc1_eq_vbuxx_then_la1 -cpx {c1} -beq {la1} -//FRAGMENT _deref_pbuc1_eq_vbuyy_then_la1 -cpy {c1} -beq {la1} -//FRAGMENT _deref_pbuc1_eq_vbuzz_then_la1 -cpz {c1} -beq {la1} -//FRAGMENT vbuaa=vbuz1_bor_vbuaa -ora {z1} -//FRAGMENT vbuxx=vbuz1_bor_vbuaa -ora {z1} -tax -//FRAGMENT vbuyy=vbuz1_bor_vbuaa -ora {z1} +//FRAGMENT vbuyy=vbuz1_rol_1 +lda {z1} +asl tay -//FRAGMENT vbuzz=vbuz1_bor_vbuaa -ora {z1} +//FRAGMENT vbuyy=vbuaa_rol_1 +asl +tay +//FRAGMENT vbuyy=vbuxx_rol_1 +txa +asl +tay +//FRAGMENT vbuyy=vbuyy_rol_1 +tya +asl +tay +//FRAGMENT vbuyy=vbuzz_rol_1 +tza +asl +tay +//FRAGMENT vbuzz=vbuz1_rol_1 +lda {z1} +asl taz -//FRAGMENT vbuz1=vbuz2_bor_vbuzz +//FRAGMENT vbuzz=vbuaa_rol_1 +asl +taz +//FRAGMENT vbuzz=vbuxx_rol_1 +txa +asl +taz +//FRAGMENT vbuzz=vbuyy_rol_1 +tya +asl +taz +//FRAGMENT vbuzz=vbuzz_rol_1 tza -ora {z2} -sta {z1} -//FRAGMENT vbuaa=vbuxx_bor_vbuaa -stx $ff -ora $ff -//FRAGMENT vbuaa=vbuyy_bor_vbuaa -sty $ff -ora $ff -//FRAGMENT vbuaa=vbuzz_bor_vbuaa +asl +taz +//FRAGMENT pwuz1_derefidx_vbuaa=vwuz2 tay +lda {z2} +sta ({z1}),y +iny +lda {z2}+1 +sta ({z1}),y +//FRAGMENT pwuz1_derefidx_vbuxx=vwuz2 +txa +tay +lda {z2} +sta ({z1}),y +iny +lda {z2}+1 +sta ({z1}),y +//FRAGMENT pwuz1_derefidx_vbuyy=vwuz2 +lda {z2} +sta ({z1}),y +iny +lda {z2}+1 +sta ({z1}),y +//FRAGMENT pwuz1_derefidx_vbuzz=vwuz2 tza -sty $ff -ora $ff +tay +lda {z2} +sta ({z1}),y +iny +lda {z2}+1 +sta ({z1}),y +//FRAGMENT _deref_qbuc1=_ptr_vbuxx +txa +sta {c1} +lda #0 +sta {c1}+1 +//FRAGMENT _deref_qbuc1=_ptr_vbuyy +tya +sta {c1} +lda #0 +sta {c1}+1 +//FRAGMENT _deref_qbuc1=_ptr_vbuzz +tza +sta {c1} +lda #0 +sta {c1}+1 +//FRAGMENT vwuz1=vbuc1 +lda #<{c1} +sta {z1} +lda #>{c1} +sta {z1}+1 //FRAGMENT vduz1=vduc1 lda #<{c1} sta {z1} @@ -1589,6 +1672,16 @@ lda {z2} sta {z1} lda {z2}+1 sta {z1}+1 +//FRAGMENT vbuz1=_lo_vwuz2 +lda {z2} +sta {z1} +//FRAGMENT vbuz1=_hi_vwuz2 +lda {z2}+1 +sta {z1} +//FRAGMENT vbuz1=vbuz2_bor_vbuz3 +lda {z2} +ora {z3} +sta {z1} //FRAGMENT vduz1=vduz2_ror_4 lda {z2}+3 lsr @@ -2175,6 +2268,49 @@ dey bne !- !e: taz +//FRAGMENT vbuaa=_lo_vwuz1 +lda {z1} +//FRAGMENT vbuxx=_lo_vwuz1 +ldx {z1} +//FRAGMENT vbuaa=_hi_vwuz1 +lda {z1}+1 +//FRAGMENT vbuxx=_hi_vwuz1 +ldx {z1}+1 +//FRAGMENT vbuz1=vbuxx_bor_vbuz2 +txa +ora {z2} +sta {z1} +//FRAGMENT vbuz1=vbuyy_bor_vbuz2 +tya +ora {z2} +sta {z1} +//FRAGMENT vbuz1=vbuzz_bor_vbuz2 +tza +ora {z2} +sta {z1} +//FRAGMENT vbuz1=vbuz2_bor_vbuaa +ora {z2} +sta {z1} +//FRAGMENT vbuz1=vbuxx_bor_vbuaa +stx $ff +ora $ff +sta {z1} +//FRAGMENT vbuz1=vbuyy_bor_vbuaa +sty $ff +ora $ff +sta {z1} +//FRAGMENT vbuz1=vbuzz_bor_vbuaa +tay +tza +sty $ff +ora $ff +sta {z1} +//FRAGMENT vbuz1=vbuz2_bor_vbuxx +txa +ora {z2} +sta {z1} +//FRAGMENT vbuz1=vbuxx_bor_vbuxx +stx {z1} //FRAGMENT vbuaa=_hi__word_vduz1 lda {z1}+1 //FRAGMENT vbuxx=_hi__word_vduz1 @@ -2239,6 +2375,20 @@ tay tza ora {z1} taz +//FRAGMENT vbuaa=vbuz1_bor_vbuaa +ora {z1} +//FRAGMENT vbuxx=vbuz1_bor_vbuaa +ora {z1} +tax +//FRAGMENT vbuyy=vbuz1_bor_vbuaa +ora {z1} +tay +//FRAGMENT vbuzz=vbuz1_bor_vbuaa +ora {z1} +taz +//FRAGMENT vbuaa=vbuxx_bor_vbuaa +stx $ff +ora $ff //FRAGMENT vbuxx=vbuxx_bor_vbuaa stx $ff ora $ff @@ -2251,6 +2401,9 @@ tay stx $ff ora $ff taz +//FRAGMENT vbuaa=vbuyy_bor_vbuaa +sty $ff +ora $ff //FRAGMENT vbuxx=vbuyy_bor_vbuaa sty $ff ora $ff @@ -2263,6 +2416,11 @@ tay sty $ff ora $ff taz +//FRAGMENT vbuaa=vbuzz_bor_vbuaa +tay +tza +sty $ff +ora $ff //FRAGMENT vbuxx=vbuzz_bor_vbuaa tax tza @@ -2296,6 +2454,18 @@ tay txa ora {z1} taz +//FRAGMENT vbuyy=_lo_vwuz1 +ldy {z1} +//FRAGMENT vbuzz=_lo_vwuz1 +ldz {z1} +//FRAGMENT vbuyy=_hi_vwuz1 +ldy {z1}+1 +//FRAGMENT vbuzz=_hi_vwuz1 +ldz {z1}+1 +//FRAGMENT vbuz1=vbuz2_bor_vbuyy +tya +ora {z2} +sta {z1} //FRAGMENT vbuyy=_hi__word_vduz1 ldy {z1}+1 //FRAGMENT vbuzz=_hi__word_vduz1 @@ -2322,6 +2492,10 @@ tza tax tya sta {c1},x +//FRAGMENT vbuz1=vbuz2_bor_vbuzz +tza +ora {z2} +sta {z1} //FRAGMENT vbuyy=vbuaa tay //FRAGMENT vbuzz=vbuaa diff --git a/src/main/fragment/cache/fragment-cache-mos6502.asm b/src/main/fragment/cache/fragment-cache-mos6502.asm index 275e567d0..51a5d8a5f 100644 --- a/src/main/fragment/cache/fragment-cache-mos6502.asm +++ b/src/main/fragment/cache/fragment-cache-mos6502.asm @@ -1,4 +1,4 @@ -//KICKC FRAGMENT CACHE 10dedb3bb9 10dedb58e1 +//KICKC FRAGMENT CACHE 106673312a 1066734e54 //FRAGMENT vbuz1=vbuc1 lda #{c1} sta {z1} diff --git a/src/main/fragment/cache/fragment-cache-mos6502x.asm b/src/main/fragment/cache/fragment-cache-mos6502x.asm index 91821e66d..f09fb7e4e 100644 --- a/src/main/fragment/cache/fragment-cache-mos6502x.asm +++ b/src/main/fragment/cache/fragment-cache-mos6502x.asm @@ -1,203 +1,22 @@ -//KICKC FRAGMENT CACHE 10dedb3bb9 10dedb58e1 +//KICKC FRAGMENT CACHE 106673312a 1066734e54 +//FRAGMENT vbuz1=vbuc1 +lda #{c1} +sta {z1} //FRAGMENT pbuz1=pbuc1 lda #<{c1} sta {z1} lda #>{c1} sta {z1}+1 -//FRAGMENT vwuz1=vwuz2 -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -//FRAGMENT vbuz1=_deref_pbuz2 -ldy #0 -lda ({z2}),y -sta {z1} -//FRAGMENT pbuz1=_inc_pbuz1 -inc {z1} -bne !+ -inc {z1}+1 -!: -//FRAGMENT vbuc1_neq_vbuz1_then_la1 -lda #{c1} -cmp {z1} -bne {la1} -//FRAGMENT vbuz1=vbuz2 -lda {z2} -sta {z1} //FRAGMENT vwuz1=vwuc1 lda #<{c1} sta {z1} lda #>{c1} sta {z1}+1 -//FRAGMENT vbuc1_neq__deref_pbuz1_then_la1 -ldy #0 -lda ({z1}),y -cmp #{c1} -bne {la1} -//FRAGMENT vwuz1=_inc_vwuz1 -inc {z1} -bne !+ -inc {z1}+1 -!: -//FRAGMENT vwuz1=vwuz2_plus_vbuc1 -lda #{c1} -clc -adc {z2} -sta {z1} -lda #0 -adc {z2}+1 -sta {z1}+1 -//FRAGMENT vwuz1=vwuz2_ror_6 -lda {z2} -asl -sta $ff -lda {z2}+1 -rol -sta {z1} -lda #0 -rol -sta {z1}+1 -asl $ff -rol {z1} -rol {z1}+1 -//FRAGMENT vwuz1=vwuz2_plus_1 -clc -lda {z2} -adc #1 -sta {z1} -lda {z2}+1 -adc #0 -sta {z1}+1 -//FRAGMENT vwuz1=vwuz2_rol_6 -lda {z2}+1 -lsr -sta $ff -lda {z2} -ror -sta {z1}+1 -lda #0 -ror -sta {z1} -lsr $ff -ror {z1}+1 -ror {z1} -//FRAGMENT vwuz1=vwuz2_minus_vbuc1 -sec -lda {z2} -sbc #{c1} -sta {z1} -lda {z2}+1 -sbc #0 -sta {z1}+1 -//FRAGMENT pvoz1=pvoz2 -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -//FRAGMENT pvoz1=pvoc1 -lda #<{c1} -sta {z1} -lda #>{c1} -sta {z1}+1 -//FRAGMENT pbuz1=pbuz2_plus_vwuz3 -lda {z2} -clc -adc {z3} -sta {z1} -lda {z2}+1 -adc {z3}+1 -sta {z1}+1 -//FRAGMENT _deref_pbuz1=vbuc1 -lda #{c1} -ldy #0 -sta ({z1}),y -//FRAGMENT vwuz1=vwuz2_rol_3 -lda {z2} -asl -sta {z1} -lda {z2}+1 -rol -sta {z1}+1 -asl {z1} -rol {z1}+1 -asl {z1} -rol {z1}+1 -//FRAGMENT vduz1=vwuz2 -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -lda #0 -sta {z1}+2 -sta {z1}+3 -//FRAGMENT vwuz1=vbuc1 -lda #<{c1} -sta {z1} -lda #>{c1} -sta {z1}+1 -//FRAGMENT vduz1=vduc1 -lda #<{c1} -sta {z1} -lda #>{c1} -sta {z1}+1 -lda #<{c1}>>$10 -sta {z1}+2 -lda #>{c1}>>$10 -sta {z1}+3 //FRAGMENT vwsz1=vwsc1 lda #<{c1} sta {z1} lda #>{c1} sta {z1}+1 -//FRAGMENT vwsz1_lt_vwuz2_then_la1 -lda {z1}+1 -bmi {la1} -cmp {z2}+1 -bcc {la1} -bne !+ -lda {z1} -cmp {z2} -bcc {la1} -!: -//FRAGMENT pbuz1=pbuz2_plus_vwsz3 -lda {z2} -clc -adc {z3} -sta {z1} -lda {z2}+1 -adc {z3}+1 -sta {z1}+1 -//FRAGMENT vduz1=vduz2 -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -lda {z2}+2 -sta {z1}+2 -lda {z2}+3 -sta {z1}+3 -//FRAGMENT vbuz1=vbuc1 -lda #{c1} -sta {z1} -//FRAGMENT vbuz1_lt_vbuc1_then_la1 -lda {z1} -cmp #{c1} -bcc {la1} -//FRAGMENT vduz1=vduz1_plus_vduz2 -lda {z1} -clc -adc {z2} -sta {z1} -lda {z1}+1 -adc {z2}+1 -sta {z1}+1 -lda {z1}+2 -adc {z2}+2 -sta {z1}+2 -lda {z1}+3 -adc {z2}+3 -sta {z1}+3 //FRAGMENT vwsz1=vwsz1_plus_vbsc1 clc lda {z1} @@ -206,6 +25,78 @@ sta {z1} lda {z1}+1 adc #>{c1} sta {z1}+1 +//FRAGMENT vwuz1=vwuz1_plus_vwuc1 +clc +lda {z1} +adc #<{c1} +sta {z1} +lda {z1}+1 +adc #>{c1} +sta {z1}+1 +//FRAGMENT vwsz1=vwsz2 +lda {z2} +sta {z1} +lda {z2}+1 +sta {z1}+1 +//FRAGMENT vwuz1=vwuz2 +lda {z2} +sta {z1} +lda {z2}+1 +sta {z1}+1 +//FRAGMENT vbuz1=_inc_vbuz1 +inc {z1} +//FRAGMENT vbuz1_neq_vbuc1_then_la1 +lda #{c1} +cmp {z1} +bne {la1} +//FRAGMENT pbuz1=pbuz2 +lda {z2} +sta {z1} +lda {z2}+1 +sta {z1}+1 +//FRAGMENT vwsz1_lt_0_then_la1 +lda {z1}+1 +bmi {la1} +//FRAGMENT vwsz1=_neg_vwsz1 +sec +lda #0 +sbc {z1} +sta {z1} +lda #0 +sbc {z1}+1 +sta {z1}+1 +//FRAGMENT _deref_pbuz1=vbuz2 +lda {z2} +ldy #0 +sta ({z1}),y +//FRAGMENT pbuz1=_inc_pbuz1 +inc {z1} +bne !+ +inc {z1}+1 +!: +//FRAGMENT vbuz1=_hi_vwuz2 +lda {z2}+1 +sta {z1} +//FRAGMENT vbuz1=_lo_vwuz2 +lda {z2} +sta {z1} +//FRAGMENT pbuz1=pbuz1_plus_vbuc1 +lda #{c1} +clc +adc {z1} +sta {z1} +bcc !+ +inc {z1}+1 +!: +//FRAGMENT pbuz1_lt_pbuz2_then_la1 +lda {z1}+1 +cmp {z2}+1 +bcc {la1} +bne !+ +lda {z1} +cmp {z2} +bcc {la1} +!: //FRAGMENT vbuz1=vbuz2_ror_4 lda {z2} lsr @@ -213,465 +104,35 @@ lsr lsr lsr sta {z1} -//FRAGMENT vbuz1=vbuz2_band_vbuc1 -lda #{c1} -and {z2} -sta {z1} -//FRAGMENT vbuz1_eq_0_then_la1 -lda {z1} -cmp #0 -beq {la1} -//FRAGMENT vbuz1_eq_vbuc1_then_la1 -lda #{c1} -cmp {z1} -beq {la1} -//FRAGMENT vbuz1=vbuz2_rol_2 -lda {z2} -asl -asl -sta {z1} -//FRAGMENT vduz1=pduz2_derefidx_vbuz3 -ldy {z3} -lda ({z2}),y -sta {z1} -iny -lda ({z2}),y -sta {z1}+1 -iny -lda ({z2}),y -sta {z1}+2 -iny -lda ({z2}),y -sta {z1}+3 -//FRAGMENT vduz1=pduc1_derefidx_vbuz2 -ldy {z2} -lda {c1},y -sta {z1} -lda {c1}+1,y -sta {z1}+1 -lda {c1}+2,y -sta {z1}+2 -lda {c1}+3,y -sta {z1}+3 //FRAGMENT vbuz1=pbuc1_derefidx_vbuz2 ldy {z2} lda {c1},y sta {z1} -//FRAGMENT vduz1=vduz2_plus_vduz3 -lda {z2} -clc -adc {z3} -sta {z1} -lda {z2}+1 -adc {z3}+1 -sta {z1}+1 -lda {z2}+2 -adc {z3}+2 -sta {z1}+2 -lda {z2}+3 -adc {z3}+3 -sta {z1}+3 -//FRAGMENT vduz1=vduz2_plus_pduc1_derefidx_vbuz3 -ldy {z3} -lda {z2} -clc -adc {c1},y -sta {z1} -lda {z2}+1 -adc {c1}+1,y -sta {z1}+1 -lda {z2}+2 -adc {c1}+2,y -sta {z1}+2 -lda {z2}+3 -adc {c1}+3,y -sta {z1}+3 -//FRAGMENT vduz1=vduz2_plus_pduz3_derefidx_vbuz4 -ldy {z4} -lda {z2} -clc -adc ({z3}),y -sta {z1} -iny -lda {z2}+1 -adc ({z3}),y -sta {z1}+1 -iny -lda {z2}+2 -adc ({z3}),y -sta {z1}+2 -iny -lda {z2}+3 -adc ({z3}),y -sta {z1}+3 -//FRAGMENT vduz1=vduz2_rol_pbuc1_derefidx_vbuz3 -ldx {z3} -ldy {c1},x -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -lda {z2}+2 -sta {z1}+2 -lda {z2}+3 -sta {z1}+3 -cpy #0 -beq !e+ -!: -asl {z1} -rol {z1}+1 -rol {z1}+2 -rol {z1}+3 -dey -bne !- -!e: -//FRAGMENT vbuz1=vbuc1_minus_pbuc2_derefidx_vbuz2 -lda #{c1} -ldy {z2} -sec -sbc {c2},y -sta {z1} -//FRAGMENT vduz1=vduz2_ror_vbuz3 -ldx {z3} -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -lda {z2}+2 -sta {z1}+2 -lda {z2}+3 -sta {z1}+3 -cpx #0 -beq !e+ -!: -lsr {z1}+3 -ror {z1}+2 -ror {z1}+1 -ror {z1} -dex -bne !- -!e: -//FRAGMENT vduz1=vduz2_bor_vduz3 -lda {z2} -ora {z3} -sta {z1} -lda {z2}+1 -ora {z3}+1 -sta {z1}+1 -lda {z2}+2 -ora {z3}+2 -sta {z1}+2 -lda {z2}+3 -ora {z3}+3 -sta {z1}+3 -//FRAGMENT vbuz1=_inc_vbuz1 -inc {z1} -//FRAGMENT vduz1=_bnot_vduz2 -lda {z2} -eor #$ff -sta {z1} -lda {z2}+1 -eor #$ff -sta {z1}+1 -lda {z2}+2 -eor #$ff -sta {z1}+2 -lda {z2}+3 -eor #$ff -sta {z1}+3 -//FRAGMENT vduz1=vduz2_bxor_vduz3 -lda {z2} -eor {z3} -sta {z1} -lda {z2}+1 -eor {z3}+1 -sta {z1}+1 -lda {z2}+2 -eor {z3}+2 -sta {z1}+2 -lda {z2}+3 -eor {z3}+3 -sta {z1}+3 -//FRAGMENT vduz1=vduz2_band_vduz3 -lda {z2} -and {z3} -sta {z1} -lda {z2}+1 -and {z3}+1 -sta {z1}+1 -lda {z2}+2 -and {z3}+2 -sta {z1}+2 -lda {z2}+3 -and {z3}+3 -sta {z1}+3 -//FRAGMENT vbuz1=pbuc1_derefidx_(_deref_pbuc2) -ldy {c2} -lda {c1},y -sta {z1} -//FRAGMENT _deref_pwuc1=_inc__deref_pwuc1 -inc {c1} -bne !+ -inc {c1}+1 -!: -//FRAGMENT _deref_pwuc1_eq_vbuc2_then_la1 -lda {c1}+1 -bne !+ -lda {c1} -cmp #{c2} -beq {la1} -!: -//FRAGMENT _deref_pwuc1=vbuc2 -lda #0 -sta {c1}+1 -lda #<{c2} -sta {c1} -//FRAGMENT pbuz1=pbuz2 -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -//FRAGMENT pbuz1_neq_pbuz2_then_la1 -lda {z1}+1 -cmp {z2}+1 -bne {la1} -lda {z1} -cmp {z2} -bne {la1} -//FRAGMENT _deref_pbuz1=_deref_pbuz2 -ldy #0 -lda ({z2}),y -ldy #0 -sta ({z1}),y -//FRAGMENT _deref_pbuc1=vbuc2 -lda #{c2} -sta {c1} -//FRAGMENT vbuz1=_deref_pbuc1 -lda {c1} -sta {z1} -//FRAGMENT vbsz1=vbsc1 -lda #{c1} -sta {z1} -//FRAGMENT vbsz1_gt_0_then_la1 -lda {z1} -cmp #0 -beq !+ -bpl {la1} -!: -//FRAGMENT vbsz1=_dec_vbsz1 -dec {z1} -//FRAGMENT vwuz1=_word_vbuz2 -lda {z2} -sta {z1} -lda #0 -sta {z1}+1 -//FRAGMENT vwuz1=vwuz2_rol_1 -lda {z2} -asl -sta {z1} -lda {z2}+1 -rol -sta {z1}+1 -//FRAGMENT vwuz1=vwuz2_plus_vwuz3 -lda {z2} -clc -adc {z3} -sta {z1} -lda {z2}+1 -adc {z3}+1 -sta {z1}+1 -//FRAGMENT vwuz1=vwuz2_band_vbuc1 +//FRAGMENT vbuz1=vbuz2_band_vbuc1 lda #{c1} and {z2} sta {z1} -lda #0 -sta {z1}+1 -//FRAGMENT vbuz1=vwuz2_band_vbuc1 -lda #{c1} -and {z2} -sta {z1} -//FRAGMENT vwuz1=vwuz2_rol_2 -lda {z2} -asl -sta {z1} -lda {z2}+1 -rol -sta {z1}+1 -asl {z1} -rol {z1}+1 -//FRAGMENT _deref_(_deref_qbuc1)=_deref_pbuc2 -lda {c2} -ldy {c1} -sty $fe -ldy {c1}+1 -sty $ff -ldy #0 -sta ($fe),y -//FRAGMENT _deref_pbuz1=vbuz2 -lda {z2} -ldy #0 -sta ({z1}),y -//FRAGMENT _deref_pbuc1=vbuz1 -lda {z1} -sta {c1} -//FRAGMENT _deref_qbuc1=pbuz1 -lda {z1} -sta {c1} -lda {z1}+1 -sta {c1}+1 -//FRAGMENT vbuz1=vbuz2_bxor_vbuc1 -lda #{c1} -eor {z2} -sta {z1} -//FRAGMENT _deref_(_deref_qbuc1)=vbuz1 -lda {z1} -ldy {c1} -sty $fe -ldy {c1}+1 -sty $ff -ldy #0 -sta ($fe),y -//FRAGMENT _deref_pbuc1=_inc__deref_pbuc1 -inc {c1} -//FRAGMENT _deref_pbuc1_neq_vbuc2_then_la1 -lda #{c2} -cmp {c1} -bne {la1} -//FRAGMENT _deref_(_deref_qbuc1)=_deref_(_deref_qbuc1)_bxor_vbuc2 -ldy {c1} -sty $fe -ldy {c1}+1 -sty $ff -ldy #0 -lda ($fe),y -eor #{c2} -sta ($fe),y -//FRAGMENT pbuz1=_deref_qbuc1 -lda {c1} -sta {z1} -lda {c1}+1 -sta {z1}+1 -//FRAGMENT pbuz1=pbuz2_plus_vbuc1 -lda #{c1} -clc -adc {z2} -sta {z1} -lda #0 -adc {z2}+1 -sta {z1}+1 -//FRAGMENT pbuz1=pbuz2_plus_vwuc1 -clc -lda {z2} -adc #<{c1} -sta {z1} -lda {z2}+1 -adc #>{c1} -sta {z1}+1 -//FRAGMENT pbuz1=pbuc1_minus_vwuz2 -sec -lda #<{c1} -sbc {z2} -sta {z1} -lda #>{c1} -sbc {z2}+1 -sta {z1}+1 -//FRAGMENT vwuz1_le_0_then_la1 -lda {z1} -bne !+ -lda {z1}+1 -beq {la1} -!: -//FRAGMENT _deref_pbuz1=pbuc1_derefidx_vbuz2 -ldy {z2} -lda {c1},y -ldy #0 -sta ({z1}),y -//FRAGMENT pbuz1=_inc_pbuz2 -clc -lda {z2} -adc #1 -sta {z1} -lda {z2}+1 -adc #0 -sta {z1}+1 -//FRAGMENT vbuz1_ge_vbuz2_then_la1 -lda {z1} -cmp {z2} -bcs {la1} -//FRAGMENT vbsz1=_sbyte_vwuz2 -lda {z2} -sta {z1} -//FRAGMENT vbuc1_eq_vbuz1_then_la1 -lda #{c1} -cmp {z1} -beq {la1} -//FRAGMENT vbsz1=_inc_vbsz1 -inc {z1} -//FRAGMENT vbsz1=vbsc1_minus_vbsz2 -lda #{c1} -sec -sbc {z2} -sta {z1} -//FRAGMENT vbsz1_ge_0_then_la1 -lda {z1} -cmp #0 -bpl {la1} -//FRAGMENT vbsc1_neq_vbsz1_then_la1 -lda #{c1} -cmp {z1} -bne {la1} -//FRAGMENT vwuz1=_word__deref_pbuc1 -lda {c1} -sta {z1} -lda #0 -sta {z1}+1 -//FRAGMENT pbuz1=_deref_qbuc1_plus_vwuz2 -clc -lda {z2} -adc {c1} -sta {z1} -lda {z2}+1 -adc {c1}+1 -sta {z1}+1 -//FRAGMENT pbuz1=pbuz2_plus__deref_pwuc1 -clc -lda {c1} -adc {z2} -sta {z1} -lda {c1}+1 -adc {z2}+1 -sta {z1}+1 -//FRAGMENT vbuz1=vbuz1_minus_vbuz2 -lda {z1} -sec -sbc {z2} -sta {z1} -//FRAGMENT vbuz1_lt_vbuz2_then_la1 -lda {z1} -cmp {z2} -bcc {la1} -//FRAGMENT vbuaa=_deref_pbuz1 -ldy #0 -lda ({z1}),y -//FRAGMENT vbuxx=_deref_pbuz1 -ldy #0 -lda ({z1}),y -tax -//FRAGMENT vbuyy=_deref_pbuz1 -ldy #0 -lda ({z1}),y -tay -//FRAGMENT vbuc1_neq_vbuaa_then_la1 -cmp #{c1} -bne {la1} -//FRAGMENT vbuz1=vbuaa -sta {z1} -//FRAGMENT vbuxx_lt_vbuc1_then_la1 +//FRAGMENT vbuxx_neq_vbuc1_then_la1 cpx #{c1} -bcc {la1} -//FRAGMENT vbuaa=vbuz1 +bne {la1} +//FRAGMENT _deref_pbuz1=vbuaa +ldy #0 +sta ({z1}),y +//FRAGMENT _deref_pbuz1=vbuxx +txa +ldy #0 +sta ({z1}),y +//FRAGMENT _deref_pbuz1=vbuyy +tya +ldy #0 +sta ({z1}),y +//FRAGMENT vbuaa=_hi_vwuz1 +lda {z1}+1 +//FRAGMENT vbuxx=_hi_vwuz1 +ldx {z1}+1 +//FRAGMENT vbuaa=_lo_vwuz1 lda {z1} -//FRAGMENT vbuxx=vbuz1 +//FRAGMENT vbuxx=_lo_vwuz1 ldx {z1} //FRAGMENT vbuaa=vbuz1_ror_4 lda {z1} @@ -693,6 +154,29 @@ lsr lsr lsr tay +//FRAGMENT vbuz1=vbuaa_ror_4 +lsr +lsr +lsr +lsr +sta {z1} +//FRAGMENT vbuaa=vbuaa_ror_4 +lsr +lsr +lsr +lsr +//FRAGMENT vbuxx=vbuaa_ror_4 +lsr +lsr +lsr +lsr +tax +//FRAGMENT vbuyy=vbuaa_ror_4 +lsr +lsr +lsr +lsr +tay //FRAGMENT vbuz1=vbuxx_ror_4 txa lsr @@ -720,374 +204,12 @@ lsr lsr lsr tay -//FRAGMENT vbuz1=vbuaa_band_vbuc1 -and #{c1} -sta {z1} -//FRAGMENT vbuz1=vbuxx_band_vbuc1 -lda #{c1} -sax {z1} -//FRAGMENT vbuz1=vbuyy_band_vbuc1 -tya -and #{c1} -sta {z1} -//FRAGMENT vbuaa=vbuz1_band_vbuc1 -lda #{c1} -and {z1} -//FRAGMENT vbuaa=vbuaa_band_vbuc1 -and #{c1} -//FRAGMENT vbuaa=vbuxx_band_vbuc1 -txa -and #{c1} -//FRAGMENT vbuaa=vbuyy_band_vbuc1 -tya -and #{c1} -//FRAGMENT vbuxx=vbuz1_band_vbuc1 -lda #{c1} -and {z1} -tax -//FRAGMENT vbuxx=vbuaa_band_vbuc1 -ldx #{c1} -axs #0 -//FRAGMENT vbuaa_eq_0_then_la1 -cmp #0 -beq {la1} -//FRAGMENT vbuaa_eq_vbuc1_then_la1 -cmp #{c1} -beq {la1} -//FRAGMENT vbuz1=vbuxx -stx {z1} -//FRAGMENT vbuz1=vbuxx_rol_2 -txa -asl -asl -sta {z1} -//FRAGMENT vbuxx=vbuz1_rol_2 -lda {z1} -asl -asl -tax -//FRAGMENT vbuxx=vbuxx_rol_2 -txa -asl -asl -tax -//FRAGMENT vduz1=pduz2_derefidx_vbuxx -txa -tay -lda ({z2}),y -sta {z1} -iny -lda ({z2}),y -sta {z1}+1 -iny -lda ({z2}),y -sta {z1}+2 -iny -lda ({z2}),y -sta {z1}+3 -//FRAGMENT vduz1=pduc1_derefidx_vbuxx -lda {c1},x -sta {z1} -lda {c1}+1,x -sta {z1}+1 -lda {c1}+2,x -sta {z1}+2 -lda {c1}+3,x -sta {z1}+3 -//FRAGMENT vbuz1=pbuc1_derefidx_vbuxx -lda {c1},x -sta {z1} //FRAGMENT vbuaa=pbuc1_derefidx_vbuz1 ldy {z1} lda {c1},y -//FRAGMENT vbuaa=pbuc1_derefidx_vbuxx -lda {c1},x //FRAGMENT vbuxx=pbuc1_derefidx_vbuz1 ldy {z1} ldx {c1},y -//FRAGMENT vduz1=vduz2_plus_pduc1_derefidx_vbuxx -lda {z2} -clc -adc {c1},x -sta {z1} -lda {z2}+1 -adc {c1}+1,x -sta {z1}+1 -lda {z2}+2 -adc {c1}+2,x -sta {z1}+2 -lda {z2}+3 -adc {c1}+3,x -sta {z1}+3 -//FRAGMENT vduz1=vduz2_plus_pduz3_derefidx_vbuxx -txa -tay -lda {z2} -clc -adc ({z3}),y -sta {z1} -iny -lda {z2}+1 -adc ({z3}),y -sta {z1}+1 -iny -lda {z2}+2 -adc ({z3}),y -sta {z1}+2 -iny -lda {z2}+3 -adc ({z3}),y -sta {z1}+3 -//FRAGMENT vduz1=vduz2_rol_pbuc1_derefidx_vbuxx -ldy {c1},x -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -lda {z2}+2 -sta {z1}+2 -lda {z2}+3 -sta {z1}+3 -cpy #0 -beq !e+ -!: -asl {z1} -rol {z1}+1 -rol {z1}+2 -rol {z1}+3 -dey -bne !- -!e: -//FRAGMENT vbuaa=vbuc1_minus_pbuc2_derefidx_vbuz1 -lda #{c1} -ldy {z1} -sec -sbc {c2},y -//FRAGMENT vbuxx=vbuc1_minus_pbuc2_derefidx_vbuz1 -lda #{c1} -ldx {z1} -sec -sbc {c2},x -tax -//FRAGMENT vbuyy=vbuc1_minus_pbuc2_derefidx_vbuz1 -lda #{c1} -ldy {z1} -sec -sbc {c2},y -tay -//FRAGMENT vbuz1=vbuc1_minus_pbuc2_derefidx_vbuxx -lda #{c1} -sec -sbc {c2},x -sta {z1} -//FRAGMENT vbuaa=vbuc1_minus_pbuc2_derefidx_vbuxx -lda #{c1} -sec -sbc {c2},x -//FRAGMENT vbuxx=vbuc1_minus_pbuc2_derefidx_vbuxx -lda #{c1} -sec -sbc {c2},x -tax -//FRAGMENT vbuyy=vbuc1_minus_pbuc2_derefidx_vbuxx -lda #{c1} -sec -sbc {c2},x -tay -//FRAGMENT vduz1=vduz2_ror_vbuaa -tax -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -lda {z2}+2 -sta {z1}+2 -lda {z2}+3 -sta {z1}+3 -cpx #0 -beq !e+ -!: -lsr {z1}+3 -ror {z1}+2 -ror {z1}+1 -ror {z1} -dex -bne !- -!e: -//FRAGMENT vduz1=vduz2_ror_vbuxx -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -lda {z2}+2 -sta {z1}+2 -lda {z2}+3 -sta {z1}+3 -cpx #0 -beq !e+ -!: -lsr {z1}+3 -ror {z1}+2 -ror {z1}+1 -ror {z1} -dex -bne !- -!e: -//FRAGMENT vduz1=vduz2_ror_vbuyy -tya -tax -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -lda {z2}+2 -sta {z1}+2 -lda {z2}+3 -sta {z1}+3 -cpx #0 -beq !e+ -!: -lsr {z1}+3 -ror {z1}+2 -ror {z1}+1 -ror {z1} -dex -bne !- -!e: -//FRAGMENT vbuaa=pbuc1_derefidx_(_deref_pbuc2) -ldy {c2} -lda {c1},y -//FRAGMENT vbuxx=pbuc1_derefidx_(_deref_pbuc2) -ldy {c2} -ldx {c1},y -//FRAGMENT vbuyy=pbuc1_derefidx_(_deref_pbuc2) -ldx {c2} -ldy {c1},x -//FRAGMENT vbuxx=_deref_pbuc1 -ldx {c1} -//FRAGMENT vbsaa_gt_0_then_la1 -cmp #0 -beq !+ -bpl {la1} -!: -//FRAGMENT vwuz1=_word_vbuaa -sta {z1} -lda #0 -sta {z1}+1 -//FRAGMENT vwuz1=_word_vbuxx -txa -sta {z1} -lda #0 -sta {z1}+1 -//FRAGMENT vwuz1=_word_vbuyy -tya -sta {z1} -lda #0 -sta {z1}+1 -//FRAGMENT vbuaa=vwuz1_band_vbuc1 -lda #{c1} -and {z1} -//FRAGMENT vbuxx=vwuz1_band_vbuc1 -lda #{c1} -and {z1} -tax -//FRAGMENT vbuyy=vwuz1_band_vbuc1 -lda #{c1} -and {z1} -tay -//FRAGMENT _deref_pbuz1=vbuaa -ldy #0 -sta ({z1}),y -//FRAGMENT _deref_pbuz1=vbuxx -txa -ldy #0 -sta ({z1}),y -//FRAGMENT _deref_pbuz1=vbuyy -tya -ldy #0 -sta ({z1}),y -//FRAGMENT _deref_pbuc1=vbuaa -sta {c1} -//FRAGMENT vbuaa=vbuz1_bxor_vbuc1 -lda #{c1} -eor {z1} -//FRAGMENT vbuxx=vbuz1_bxor_vbuc1 -lda #{c1} -eor {z1} -tax -//FRAGMENT vbuyy=vbuz1_bxor_vbuc1 -lda #{c1} -eor {z1} -tay -//FRAGMENT vbuz1=vbuxx_bxor_vbuc1 -txa -eor #{c1} -sta {z1} -//FRAGMENT vbuaa=vbuxx_bxor_vbuc1 -txa -eor #{c1} -//FRAGMENT vbuxx=vbuxx_bxor_vbuc1 -txa -eor #{c1} -tax -//FRAGMENT vbuyy=vbuxx_bxor_vbuc1 -txa -eor #{c1} -tay -//FRAGMENT vbuz1=vbuyy_bxor_vbuc1 -tya -eor #{c1} -sta {z1} -//FRAGMENT vbuaa=vbuyy_bxor_vbuc1 -tya -eor #{c1} -//FRAGMENT vbuxx=vbuyy_bxor_vbuc1 -tya -eor #{c1} -tax -//FRAGMENT vbuyy=vbuyy_bxor_vbuc1 -tya -eor #{c1} -tay -//FRAGMENT _deref_(_deref_qbuc1)=vbuaa -ldy {c1} -sty $fe -ldy {c1}+1 -sty $ff -ldy #0 -sta ($fe),y -//FRAGMENT _deref_(_deref_qbuc1)=vbuxx -txa -ldy {c1} -sty $fe -ldy {c1}+1 -sty $ff -ldy #0 -sta ($fe),y -//FRAGMENT _deref_(_deref_qbuc1)=vbuyy -tya -ldy {c1} -sty $fe -ldy {c1}+1 -sty $ff -ldy #0 -sta ($fe),y -//FRAGMENT vbuaa_lt_vbuc1_then_la1 -cmp #{c1} -bcc {la1} -//FRAGMENT _deref_pbuz1=pbuc1_derefidx_vbuaa -tay -lda {c1},y -ldy #0 -sta ({z1}),y -//FRAGMENT _deref_pbuz1=pbuc1_derefidx_vbuxx -lda {c1},x -ldy #0 -sta ({z1}),y -//FRAGMENT _deref_pbuz1=pbuc1_derefidx_vbuyy -lda {c1},y -ldy #0 -sta ({z1}),y //FRAGMENT vbuyy=pbuc1_derefidx_vbuz1 ldx {z1} ldy {c1},x @@ -1104,657 +226,62 @@ ldx {c1},y //FRAGMENT vbuyy=pbuc1_derefidx_vbuaa tax ldy {c1},x -//FRAGMENT vbuaa_ge_vbuz1_then_la1 -cmp {z1} -bcs {la1} -//FRAGMENT vbsaa=_sbyte_vwuz1 -lda {z1} -//FRAGMENT vbsxx=_sbyte_vwuz1 -ldx {z1} -//FRAGMENT vbuc1_eq_vbuxx_then_la1 -cpx #{c1} -beq {la1} -//FRAGMENT vbsz1=vbsc1_minus_vbsaa -eor #$ff -sec -adc #{c1} +//FRAGMENT vbuz1=pbuc1_derefidx_vbuxx +lda {c1},x sta {z1} -//FRAGMENT vbsz1=vbsc1_minus_vbsxx -txa -eor #$ff -sec -adc #{c1} -sta {z1} -//FRAGMENT vbsz1=vbsc1_minus_vbsyy -tya -eor #$ff -sec -adc #{c1} -sta {z1} -//FRAGMENT vbsxx=vbsc1_minus_vbsz1 +//FRAGMENT vbuz1=vbuxx_band_vbuc1 lda #{c1} -sec -sbc {z1} -tax -//FRAGMENT vbsxx=vbsc1_minus_vbsaa -eor #$ff -tax -axs #-{c1}-1 -//FRAGMENT vbsxx=vbsc1_minus_vbsxx -txa -eor #$ff -tax -axs #-{c1}-1 -//FRAGMENT vbsxx=vbsc1_minus_vbsyy -tya -eor #$ff -tax -axs #-{c1}-1 -//FRAGMENT vbsxx_ge_0_then_la1 -cpx #0 -bpl {la1} -//FRAGMENT vbuc1_neq_vbuxx_then_la1 -cpx #{c1} -bne {la1} -//FRAGMENT vbsc1_neq_vbsxx_then_la1 -cpx #{c1} -bne {la1} -//FRAGMENT vbuxx=vbuxx_minus_vbuz1 -txa -sec -sbc {z1} -tax -//FRAGMENT vbuz1=vbuz1_minus_vbuaa -eor #$ff -sec -adc {z1} -sta {z1} -//FRAGMENT vbuxx=vbuxx_minus_vbuaa -sta $ff -txa -sec -sbc $ff -tax -//FRAGMENT vbuz1=vbuz1_minus_vbuxx -txa -eor #$ff -sec -adc {z1} -sta {z1} -//FRAGMENT vbuxx=vbuxx_minus_vbuxx -lda #0 -tax -//FRAGMENT vbuz1=vbuz1_minus_vbuyy -tya -eor #$ff -sec -adc {z1} -sta {z1} -//FRAGMENT vbuxx=vbuxx_minus_vbuyy -txa -sty $ff -sec -sbc $ff -tax -//FRAGMENT vbuxx_lt_vbuz1_then_la1 -cpx {z1} -bcc {la1} -//FRAGMENT vbsxx_gt_0_then_la1 -txa -cmp #0 -beq !+ -bpl {la1} -!: -//FRAGMENT vbsyy_gt_0_then_la1 -tya -cmp #0 -beq !+ -bpl {la1} -!: -//FRAGMENT _deref_pbuc1=vbuxx -stx {c1} -//FRAGMENT vbuxx_ge_vbuz1_then_la1 -cpx {z1} -bcs {la1} -//FRAGMENT vbuxx=vbuc1 -ldx #{c1} -//FRAGMENT vbuxx=_inc_vbuxx -inx -//FRAGMENT vbuyy=vbuc1 -ldy #{c1} -//FRAGMENT vbuyy=_inc_vbuyy -iny -//FRAGMENT vbuz1_ge_vbuxx_then_la1 -lda {z1} -stx $ff -cmp $ff -bcs {la1} -//FRAGMENT vbuyy=vbuz1 -ldy {z1} -//FRAGMENT vbuz1_ge_vbuyy_then_la1 -lda {z1} -sty $ff -cmp $ff -bcs {la1} -//FRAGMENT vbuxx_ge_vbuyy_then_la1 -sty $ff -cpx $ff -bcs {la1} -//FRAGMENT vbuaa=vbuxx -txa -//FRAGMENT vbuz1=vbuyy -sty {z1} -//FRAGMENT vbuyy=vbuxx -txa -tay -//FRAGMENT _deref_pbuc1=vbuyy -sty {c1} -//FRAGMENT vbuyy_ge_vbuz1_then_la1 -cpy {z1} -bcs {la1} -//FRAGMENT vbuxx=vbuyy -tya -tax -//FRAGMENT vbuaa=vbuc1 +sax {z1} +//FRAGMENT vbuaa=vbuz1_band_vbuc1 lda #{c1} -//FRAGMENT vbuc1_neq_vbuyy_then_la1 -cpy #{c1} -bne {la1} -//FRAGMENT vbsxx=vbsc1 -ldx #{c1} -//FRAGMENT vbsxx=_dec_vbsxx -dex -//FRAGMENT vbsyy=vbsc1 -ldy #{c1} -//FRAGMENT vbsyy=_dec_vbsyy -dey -//FRAGMENT vbsaa=_inc_vbsaa -clc -adc #1 -//FRAGMENT vbsxx=_inc_vbsxx -inx -//FRAGMENT vbsyy=_sbyte_vwuz1 -ldy {z1} -//FRAGMENT vbsyy=_inc_vbsyy -iny -//FRAGMENT vbuyy=_deref_pbuc1 -ldy {c1} -//FRAGMENT vbuxx_eq_0_then_la1 -cpx #0 -beq {la1} -//FRAGMENT vbuxx_eq_vbuc1_then_la1 -cpx #{c1} -beq {la1} +and {z1} +//FRAGMENT vbuaa=vbuxx_band_vbuc1 +txa +and #{c1} +//FRAGMENT vbuxx=vbuz1_band_vbuc1 +lda #{c1} +and {z1} +tax //FRAGMENT vbuxx=vbuxx_band_vbuc1 lda #{c1} axs #0 -//FRAGMENT vbuxx=vbuyy_band_vbuc1 -ldx #{c1} -tya -axs #0 //FRAGMENT vbuyy=vbuz1_band_vbuc1 lda #{c1} and {z1} tay -//FRAGMENT vbuyy_eq_0_then_la1 -cpy #0 -beq {la1} -//FRAGMENT vbuyy_eq_vbuc1_then_la1 -cpy #{c1} -beq {la1} -//FRAGMENT vbuyy=vbuaa_band_vbuc1 -and #{c1} -tay -//FRAGMENT vbuaa=vbuyy -tya -//FRAGMENT vbuxx=vbuaa -tax -//FRAGMENT vbuyy=vbuaa -tay -//FRAGMENT vduz1=vduz2_bxor_vduz1 -lda {z1} -eor {z2} -sta {z1} -lda {z1}+1 -eor {z2}+1 -sta {z1}+1 -lda {z1}+2 -eor {z2}+2 -sta {z1}+2 -lda {z1}+3 -eor {z2}+3 -sta {z1}+3 -//FRAGMENT vduz1=vduz1_bxor_vduz2 -lda {z1} -eor {z2} -sta {z1} -lda {z1}+1 -eor {z2}+1 -sta {z1}+1 -lda {z1}+2 -eor {z2}+2 -sta {z1}+2 -lda {z1}+3 -eor {z2}+3 -sta {z1}+3 -//FRAGMENT vduz1=vduz1_bor_vduz2 -lda {z2} -ora {z1} -sta {z1} -lda {z2}+1 -ora {z1}+1 -sta {z1}+1 -lda {z2}+2 -ora {z1}+2 -sta {z1}+2 -lda {z2}+3 -ora {z1}+3 -sta {z1}+3 -//FRAGMENT vbuz1=vbuz1_rol_2 -lda {z1} -asl -asl -sta {z1} -//FRAGMENT vwuz1=vwuz1_plus_vbuc1 -lda #{c1} -clc -adc {z1} -sta {z1} -bcc !+ -inc {z1}+1 -!: -//FRAGMENT vwuz1=vwuz1_plus_1 -inc {z1} -bne !+ -inc {z1}+1 -!: -//FRAGMENT vwuz1=vwuz1_band_vbuc1 -lda #{c1} -and {z1} -sta {z1} -lda #0 -sta {z1}+1 -//FRAGMENT pbuz1=pbuz2_plus_vwuz1 -lda {z1} -clc -adc {z2} -sta {z1} -lda {z1}+1 -adc {z2}+1 -sta {z1}+1 -//FRAGMENT vwuz1=vwuz1_ror_6 -lda {z1} -asl -sta $ff -lda {z1}+1 -rol -sta {z1} -lda #0 -rol -sta {z1}+1 -asl $ff -rol {z1} -rol {z1}+1 -//FRAGMENT vwuz1=vwuz1_rol_6 -lda {z1}+1 -lsr -sta $ff -lda {z1} -ror -sta {z1}+1 -lda #0 -ror -sta {z1} -lsr $ff -ror {z1}+1 -ror {z1} -//FRAGMENT vduz1=vduz1_plus_pduz2_derefidx_vbuz3 -ldy {z3} -lda {z1} -clc -adc ({z2}),y -sta {z1} -iny -lda {z1}+1 -adc ({z2}),y -sta {z1}+1 -iny -lda {z1}+2 -adc ({z2}),y -sta {z1}+2 -iny -lda {z1}+3 -adc ({z2}),y -sta {z1}+3 -//FRAGMENT vduz1=vduz1_band_vduz2 -lda {z1} -and {z2} -sta {z1} -lda {z1}+1 -and {z2}+1 -sta {z1}+1 -lda {z1}+2 -and {z2}+2 -sta {z1}+2 -lda {z1}+3 -and {z2}+3 -sta {z1}+3 -//FRAGMENT pbuz1=pbuc1_minus_vwuz1 -sec -lda #<{c1} -sbc {z1} -sta {z1} -lda #>{c1} -sbc {z1}+1 -sta {z1}+1 -//FRAGMENT vwuz1=vwuz2_plus_vwuz1 -lda {z1} -clc -adc {z2} -sta {z1} -lda {z1}+1 -adc {z2}+1 -sta {z1}+1 -//FRAGMENT vwuz1=vwuz1_plus_vwuz2 -lda {z1} -clc -adc {z2} -sta {z1} -lda {z1}+1 -adc {z2}+1 -sta {z1}+1 -//FRAGMENT pbuz1=_deref_qbuc1_plus_vwuz1 -clc -lda {z1} -adc {c1} -sta {z1} -lda {z1}+1 -adc {c1}+1 -sta {z1}+1 -//FRAGMENT vduz1=vduz1_plus_pduc1_derefidx_vbuz2 -ldy {z2} -lda {z1} -clc -adc {c1},y -sta {z1} -lda {z1}+1 -adc {c1}+1,y -sta {z1}+1 -lda {z1}+2 -adc {c1}+2,y -sta {z1}+2 -lda {z1}+3 -adc {c1}+3,y -sta {z1}+3 -//FRAGMENT vduz1=vduz2_bor_vduz1 -lda {z2} -ora {z1} -sta {z1} -lda {z2}+1 -ora {z1}+1 -sta {z1}+1 -lda {z2}+2 -ora {z1}+2 -sta {z1}+2 -lda {z2}+3 -ora {z1}+3 -sta {z1}+3 -//FRAGMENT pbuz1=pbuz1_plus_vwuc1 -clc -lda {z1} -adc #<{c1} -sta {z1} -lda {z1}+1 -adc #>{c1} -sta {z1}+1 -//FRAGMENT vduz1=vduz1_rol_pbuc1_derefidx_vbuz2 -ldy {z2} -ldx {c1},y -cpx #0 -beq !e+ -!: -asl {z1} -rol {z1}+1 -rol {z1}+2 -rol {z1}+3 -dex -bne !- -!e: -//FRAGMENT vwuz1=vwuz1_rol_1 -asl {z1} -rol {z1}+1 -//FRAGMENT pbuz1=pbuz1_plus__deref_pwuc1 -clc -lda {c1} -adc {z1} -sta {z1} -lda {c1}+1 -adc {z1}+1 -sta {z1}+1 -//FRAGMENT vwuz1=vwuz1_rol_3 -asl {z1} -rol {z1}+1 -asl {z1} -rol {z1}+1 -asl {z1} -rol {z1}+1 -//FRAGMENT vduz1=vduz1_ror_vbuaa -tay -cpy #0 -beq !e+ -!: -lsr {z1}+3 -ror {z1}+2 -ror {z1}+1 -ror {z1} -dey -bne !- -!e: -//FRAGMENT vwuz1=vwuz1_minus_vbuc1 -sec -lda {z1} -sbc #{c1} -sta {z1} -lda {z1}+1 -sbc #0 -sta {z1}+1 -//FRAGMENT pbuz1_lt_vwuc1_then_la1 -lda {z1}+1 -cmp #>{c1} -bcc {la1} -bne !+ -lda {z1} -cmp #<{c1} -bcc {la1} -!: -//FRAGMENT vbuz1=vbuz2_plus_1 -ldy {z2} -iny -sty {z1} -//FRAGMENT pbuz1_derefidx_vbuc1=pbuc2_derefidx_vbuz2 -ldy {z2} -lda {c2},y -ldy #{c1} -sta ({z1}),y -//FRAGMENT pbuz1_derefidx_vbuc1=vbuc2 -lda #{c2} -ldy #{c1} -sta ({z1}),y -//FRAGMENT pbuz1=pbuz1_plus_vbuc1 -lda #{c1} -clc -adc {z1} -sta {z1} -bcc !+ -inc {z1}+1 -!: -//FRAGMENT vbuz1=vbuaa_plus_1 -clc -adc #1 -sta {z1} -//FRAGMENT vbuz1=vbuaa_ror_4 -lsr -lsr -lsr -lsr -sta {z1} -//FRAGMENT vbuaa=vbuaa_ror_4 -lsr -lsr -lsr -lsr -//FRAGMENT vbuxx=vbuaa_ror_4 -lsr -lsr -lsr -lsr -tax -//FRAGMENT vbuyy=vbuaa_ror_4 -lsr -lsr -lsr -lsr -tay -//FRAGMENT vbuz1=vbuyy_ror_4 -tya -lsr -lsr -lsr -lsr -sta {z1} -//FRAGMENT vbuaa=vbuyy_ror_4 -tya -lsr -lsr -lsr -lsr -//FRAGMENT vbuxx=vbuyy_ror_4 -tya -lsr -lsr -lsr -lsr -tax -//FRAGMENT vbuyy=vbuyy_ror_4 -tya -lsr -lsr -lsr -lsr -tay //FRAGMENT vbuyy=vbuxx_band_vbuc1 txa and #{c1} tay -//FRAGMENT pbuz1_derefidx_vbuc1=pbuc2_derefidx_vbuaa -tay -lda {c2},y -ldy #{c1} -sta ({z1}),y -//FRAGMENT pbuz1_derefidx_vbuc1=pbuc2_derefidx_vbuxx -lda {c2},x -ldy #{c1} -sta ({z1}),y -//FRAGMENT pbuz1_derefidx_vbuc1=pbuc2_derefidx_vbuyy -lda {c2},y -ldy #{c1} -sta ({z1}),y -//FRAGMENT vbuz1=vbuxx_plus_1 -inx -stx {z1} -//FRAGMENT pbuz1_derefidx_vbuz2=pbuc1_derefidx_vbuz3 -ldy {z3} -lda {c1},y -ldy {z2} -sta ({z1}),y -//FRAGMENT pbuz1_derefidx_vbuz2=vbuc1 +//FRAGMENT vbuaa=vbuc1 lda #{c1} -ldy {z2} -sta ({z1}),y -//FRAGMENT pbuz1_derefidx_vbuz2=pbuc1_derefidx_vbuaa -tay -lda {c1},y -ldy {z2} -sta ({z1}),y -//FRAGMENT pbuz1_derefidx_vbuz2=pbuc1_derefidx_vbuxx +//FRAGMENT vbuxx=vbuc1 +ldx #{c1} +//FRAGMENT vbuyy=vbuc1 +ldy #{c1} +//FRAGMENT vbuaa=pbuc1_derefidx_vbuxx lda {c1},x -ldy {z2} -sta ({z1}),y -//FRAGMENT pbuz1_derefidx_vbuz2=pbuc1_derefidx_vbuyy -lda {c1},y -ldy {z2} -sta ({z1}),y -//FRAGMENT vbuc1_eq_vbuaa_then_la1 -cmp #{c1} -beq {la1} -//FRAGMENT vbuc1_eq_vbuyy_then_la1 -cpy #{c1} -beq {la1} -//FRAGMENT vwuz1=vwuz1_plus_vwuc1 -clc -lda {z1} -adc #<{c1} -sta {z1} -lda {z1}+1 -adc #>{c1} -sta {z1}+1 -//FRAGMENT vwsz1=vwsz2 -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -//FRAGMENT vbuz1_neq_vbuc1_then_la1 -lda #{c1} -cmp {z1} -bne {la1} -//FRAGMENT vwsz1_lt_0_then_la1 -lda {z1}+1 -bmi {la1} -//FRAGMENT vwsz1=_neg_vwsz1 -sec -lda #0 -sbc {z1} -sta {z1} -lda #0 -sbc {z1}+1 -sta {z1}+1 -//FRAGMENT vbuz1=_hi_vwuz2 -lda {z2}+1 -sta {z1} -//FRAGMENT vbuz1=_lo_vwuz2 -lda {z2} -sta {z1} -//FRAGMENT pbuz1_lt_pbuz2_then_la1 -lda {z1}+1 -cmp {z2}+1 -bcc {la1} -bne !+ -lda {z1} -cmp {z2} -bcc {la1} -!: -//FRAGMENT vbuxx_neq_vbuc1_then_la1 -cpx #{c1} -bne {la1} -//FRAGMENT vbuaa=_hi_vwuz1 -lda {z1}+1 -//FRAGMENT vbuxx=_hi_vwuz1 -ldx {z1}+1 -//FRAGMENT vbuaa=_lo_vwuz1 -lda {z1} -//FRAGMENT vbuxx=_lo_vwuz1 -ldx {z1} //FRAGMENT vbuaa=pbuc1_derefidx_vbuyy lda {c1},y +//FRAGMENT vbuz1_lt_vbuc1_then_la1 +lda {z1} +cmp #{c1} +bcc {la1} //FRAGMENT pbuc1_derefidx_vbuz1=vbuc2 lda #{c2} ldy {z1} sta {c1},y +//FRAGMENT _deref_pbuc1=vbuc2 +lda #{c2} +sta {c1} //FRAGMENT vbuz1=vbuz1_plus_2 lda {z1} clc adc #2 sta {z1} +//FRAGMENT vbuaa_lt_vbuc1_then_la1 +cmp #{c1} +bcc {la1} //FRAGMENT pbuc1_derefidx_vbuaa=vbuc2 tay lda #{c2} @@ -1768,6 +295,9 @@ sta {c1},y //FRAGMENT vbuxx=vbuxx_plus_2 inx inx +//FRAGMENT vbuxx_lt_vbuc1_then_la1 +cpx #{c1} +bcc {la1} //FRAGMENT vbuyy_lt_vbuc1_then_la1 cpy #{c1} bcc {la1} @@ -1793,6 +323,22 @@ sta {z1} lax {z2} axs #-[{c1}] stx {z1} +//FRAGMENT vbuz1=vbuz2 +lda {z2} +sta {z1} +//FRAGMENT vwuz1=vwuz1_plus_vwuz2 +lda {z1} +clc +adc {z2} +sta {z1} +lda {z1}+1 +adc {z2}+1 +sta {z1}+1 +//FRAGMENT vwuz1=_inc_vwuz1 +inc {z1} +bne !+ +inc {z1}+1 +!: //FRAGMENT pbuz1_neq_pbuc1_then_la1 lda {z1}+1 cmp #>{c1} @@ -1800,6 +346,19 @@ bne {la1} lda {z1} cmp #<{c1} bne {la1} +//FRAGMENT _deref_pbuz1=vbuc1 +lda #{c1} +ldy #0 +sta ({z1}),y +//FRAGMENT vbuc1_neq__deref_pbuz1_then_la1 +ldy #0 +lda ({z1}),y +cmp #{c1} +bne {la1} +//FRAGMENT vbuz1=_deref_pbuz2 +ldy #0 +lda ({z2}),y +sta {z1} //FRAGMENT vwuz1=vwuz1_minus_vwuc1 lda {z1} sec @@ -1816,6 +375,17 @@ sta {z1} lda #>{c1} sbc {z1}+1 sta {z1}+1 +//FRAGMENT vwuz1=vwuz2_rol_3 +lda {z2} +asl +sta {z1} +lda {z2}+1 +rol +sta {z1}+1 +asl {z1} +rol {z1}+1 +asl {z1} +rol {z1}+1 //FRAGMENT vbuz1=vbuz2_minus_vbuz3 lda {z2} sec @@ -1828,12 +398,20 @@ adc {z3} sta {z1} //FRAGMENT vbuz1=_dec_vbuz1 dec {z1} +//FRAGMENT vbuz1_eq_0_then_la1 +lda {z1} +cmp #0 +beq {la1} //FRAGMENT vbsz1=_neg_vbsz2 lda {z2} eor #$ff clc adc #$01 sta {z1} +//FRAGMENT vbsz1_ge_0_then_la1 +lda {z1} +cmp #0 +bpl {la1} //FRAGMENT vbuz1=vbuz2_minus_vbuc1 lax {z2} axs #{c1} @@ -1850,6 +428,14 @@ eor #$ff clc adc #$01 sta {z1} +//FRAGMENT vwuz1=vbuc1 +lda #<{c1} +sta {z1} +lda #>{c1} +sta {z1}+1 +//FRAGMENT vwuz1=vwuz1_rol_1 +asl {z1} +rol {z1}+1 //FRAGMENT vwuz1=vwuz1_bor_vbuc1 lda #{c1} ora {z1} @@ -1867,6 +453,11 @@ rol {z1}+1 dey bne !- !e: +//FRAGMENT vwuz1=_word_vbuz2 +lda {z2} +sta {z1} +lda #0 +sta {z1}+1 //FRAGMENT vbuz1_neq_0_then_la1 lda {z1} cmp #0 @@ -1905,6 +496,57 @@ adc #{c1} //FRAGMENT vbuxx=vbuc1_plus_vbuaa tax axs #-[{c1}] +//FRAGMENT vbuz1=vbuxx +stx {z1} +//FRAGMENT vbuaa=_deref_pbuz1 +ldy #0 +lda ({z1}),y +//FRAGMENT vbuxx=_deref_pbuz1 +ldy #0 +lda ({z1}),y +tax +//FRAGMENT vbuyy=_deref_pbuz1 +ldy #0 +lda ({z1}),y +tay +//FRAGMENT vbuz1=vbuyy_ror_4 +tya +lsr +lsr +lsr +lsr +sta {z1} +//FRAGMENT vbuaa=vbuyy_ror_4 +tya +lsr +lsr +lsr +lsr +//FRAGMENT vbuxx=vbuyy_ror_4 +tya +lsr +lsr +lsr +lsr +tax +//FRAGMENT vbuyy=vbuyy_ror_4 +tya +lsr +lsr +lsr +lsr +tay +//FRAGMENT vbuz1=vbuyy_band_vbuc1 +tya +and #{c1} +sta {z1} +//FRAGMENT vbuaa=vbuyy_band_vbuc1 +tya +and #{c1} +//FRAGMENT vbuxx=vbuyy_band_vbuc1 +ldx #{c1} +tya +axs #0 //FRAGMENT vbuyy=vbuyy_band_vbuc1 tya and #{c1} @@ -1912,6 +554,12 @@ tay //FRAGMENT vbuz1=pbuc1_derefidx_vbuyy lda {c1},y sta {z1} +//FRAGMENT vbuaa=vbuz1 +lda {z1} +//FRAGMENT vbuxx=vbuz1 +ldx {z1} +//FRAGMENT vbuz1=vbuaa +sta {z1} //FRAGMENT vbuz1=vbuaa_minus_vbuz2 sec sbc {z2} @@ -2058,6 +706,11 @@ tax sec sbc {z1} tax +//FRAGMENT vbuxx=vbuxx_minus_vbuz1 +txa +sec +sbc {z1} +tax //FRAGMENT vbuxx=vbuyy_minus_vbuz1 tya sec @@ -2071,6 +724,12 @@ tax //FRAGMENT vbuxx=vbuaa_minus_vbuaa lda #0 tax +//FRAGMENT vbuxx=vbuxx_minus_vbuaa +sta $ff +txa +sec +sbc $ff +tax //FRAGMENT vbuxx=vbuyy_minus_vbuaa sta $ff tya @@ -2088,6 +747,9 @@ stx $ff sec sbc $ff tax +//FRAGMENT vbuxx=vbuxx_minus_vbuxx +lda #0 +tax //FRAGMENT vbuxx=vbuyy_minus_vbuxx tya stx $ff @@ -2105,6 +767,12 @@ sty $ff sec sbc $ff tax +//FRAGMENT vbuxx=vbuxx_minus_vbuyy +txa +sty $ff +sec +sbc $ff +tax //FRAGMENT vbuxx=vbuyy_minus_vbuyy lda #0 tax @@ -2406,6 +1074,9 @@ tax tya asl tay +//FRAGMENT vbuxx_eq_0_then_la1 +cpx #0 +beq {la1} //FRAGMENT vbsaa=_neg_vbsz1 lda {z1} eor #$ff @@ -2488,6 +1159,9 @@ eor #$ff clc adc #$01 tay +//FRAGMENT vbsxx_ge_0_then_la1 +cpx #0 +bpl {la1} //FRAGMENT vbuz1=vbuaa_minus_vbuc1 sec sbc #{c1} @@ -2527,6 +1201,17 @@ sta {z1}+1 //FRAGMENT vbsaa_lt_0_then_la1 cmp #0 bmi {la1} +//FRAGMENT vbuz1=vbuaa_band_vbuc1 +and #{c1} +sta {z1} +//FRAGMENT vbuaa=vbuaa_band_vbuc1 +and #{c1} +//FRAGMENT vbuxx=vbuaa_band_vbuc1 +ldx #{c1} +axs #0 +//FRAGMENT vbuaa_eq_0_then_la1 +cmp #0 +beq {la1} //FRAGMENT vwuz1=vwuz2_rol_vbuxx lda {z2} sta {z1} @@ -2553,15 +1238,34 @@ rol {z1}+1 dey bne !- !e: +//FRAGMENT vwuz1=_word_vbuaa +sta {z1} +lda #0 +sta {z1}+1 +//FRAGMENT vwuz1=_word_vbuxx +txa +sta {z1} +lda #0 +sta {z1}+1 +//FRAGMENT vwuz1=_word_vbuyy +tya +sta {z1} +lda #0 +sta {z1}+1 //FRAGMENT vbuxx_neq_0_then_la1 cpx #0 bne {la1} //FRAGMENT vbsz1=vbsxx stx {z1} +//FRAGMENT vbuyy_eq_0_then_la1 +cpy #0 +beq {la1} //FRAGMENT vbuxx=vbuxx_ror_1 txa lsr tax +//FRAGMENT vbuyy=vbuz1 +ldy {z1} //FRAGMENT vbuyy_neq_0_then_la1 cpy #0 bne {la1} @@ -2571,9 +1275,27 @@ lsr tay //FRAGMENT vbuyy=_hi_vwuz1 ldy {z1}+1 +//FRAGMENT vbuyy=vbuaa_band_vbuc1 +and #{c1} +tay +//FRAGMENT vbuxx=_inc_vbuxx +inx +//FRAGMENT vbuyy=_inc_vbuyy +iny //FRAGMENT vbuyy_neq_vbuc1_then_la1 cpy #{c1} bne {la1} +//FRAGMENT vbuxx=vbuaa +tax +//FRAGMENT vbuxx=vbuyy +tya +tax +//FRAGMENT vbuaa=vbuyy +tya +//FRAGMENT vbuz1=vbuyy +sty {z1} +//FRAGMENT vbuaa=vbuxx +txa //FRAGMENT vbuaa=_dec_vbuaa sec sbc #1 @@ -2599,6 +1321,8 @@ tay //FRAGMENT vbsyy=vbsxx txa tay +//FRAGMENT vbuyy=vbuaa +tay //FRAGMENT vwuz1=vwuz1_sethi_vbuxx stx {z1}+1 //FRAGMENT vbuxx=vbuxx_minus_vbuc1 @@ -2651,6 +1375,13 @@ lda #{c1} clc adc {z2}+1 sta {z1} +//FRAGMENT vwuz1=vwuz1_rol_3 +asl {z1} +rol {z1}+1 +asl {z1} +rol {z1}+1 +asl {z1} +rol {z1}+1 //FRAGMENT vwuz1=vwuz1_rol_vbuz2 ldy {z2} beq !e+ @@ -2763,6 +1494,9 @@ tay lda ({z1}),y //FRAGMENT vbuaa=pbuz1_derefidx_vbuyy lda ({z1}),y +//FRAGMENT _deref_pbuc1=vbuz1 +lda {z1} +sta {c1} //FRAGMENT vbuz1_neq_vbuz2_then_la1 lda {z1} cmp {z2} @@ -2771,12 +1505,36 @@ bne {la1} lda {z2} cmp {z1} bcc {la1} +//FRAGMENT vbuz1=vbuz1_minus_vbuz2 +lda {z1} +sec +sbc {z2} +sta {z1} +//FRAGMENT _deref_pbuc1=vbuaa +sta {c1} //FRAGMENT vbuz1_neq_vbuaa_then_la1 cmp {z1} bne {la1} //FRAGMENT vbuz1_gt_vbuaa_then_la1 cmp {z1} bcc {la1} +//FRAGMENT vbuz1=vbuz1_minus_vbuaa +eor #$ff +sec +adc {z1} +sta {z1} +//FRAGMENT vbuz1=vbuz1_minus_vbuxx +txa +eor #$ff +sec +adc {z1} +sta {z1} +//FRAGMENT vbuz1=vbuz1_minus_vbuyy +tya +eor #$ff +sec +adc {z1} +sta {z1} //FRAGMENT vbuz1_neq_vbuxx_then_la1 cpx {z1} bne {la1} @@ -2821,6 +1579,13 @@ bne {la1} sty $ff cpx $ff bcc {la1} +//FRAGMENT vbuyy=vbuxx +txa +tay +//FRAGMENT _deref_pbuc1=vbuxx +stx {c1} +//FRAGMENT _deref_pbuc1=vbuyy +sty {c1} //FRAGMENT pbuc1_derefidx_vbuz1=vbuz1 ldy {z1} tya @@ -2964,6 +1729,8 @@ lda #<{c2} sta {c1} lda #>{c2} sta {c1}+1 +//FRAGMENT _deref_pbuc1=_inc__deref_pbuc1 +inc {c1} //FRAGMENT _deref_pbuc1_lt_vbuc2_then_la1 lda {c1} cmp #{c2} @@ -2973,6 +1740,9 @@ lda #<{c1} sta {z1} lda #>{c1} sta {z1}+1 +//FRAGMENT vbsz1=vbsc1 +lda #{c1} +sta {z1} //FRAGMENT vbsz1=pbsc1_derefidx_vbuz2 ldy {z2} lda {c1},y @@ -3000,9 +1770,18 @@ stx {z1} lax {z1} axs #-[{c1}] stx {z1} +//FRAGMENT vbuc1_neq_vbuz1_then_la1 +lda #{c1} +cmp {z1} +bne {la1} //FRAGMENT _deref_pbuc1=_deref_pbuc2 lda {c2} sta {c1} +//FRAGMENT _deref_pbuz1=pbuc1_derefidx_vbuz2 +ldy {z2} +lda {c1},y +ldy #0 +sta ({z1}),y //FRAGMENT vbuz1=vbuz1_plus_vbuz2 lda {z1} clc @@ -3024,6 +1803,23 @@ sta {z1} lda #>{c1} adc #0 sta {z1}+1 +//FRAGMENT vwuz1=vwuz2_rol_2 +lda {z2} +asl +sta {z1} +lda {z2}+1 +rol +sta {z1}+1 +asl {z1} +rol {z1}+1 +//FRAGMENT vwuz1=vwuz2_plus_vwuz3 +lda {z2} +clc +adc {z3} +sta {z1} +lda {z2}+1 +adc {z3}+1 +sta {z1}+1 //FRAGMENT pwuc1_derefidx_vbuz1=vwuz2 ldy {z1} lda {z2} @@ -3042,6 +1838,10 @@ lda {c1},y sta {z1} lda {c1}+1,y sta {z1}+1 +//FRAGMENT pbuz1_derefidx_vbuc1=vbuc2 +lda #{c2} +ldy #{c1} +sta ({z1}),y //FRAGMENT vbuz1=vbuz2_ror_2 lda {z2} lsr @@ -3075,6 +1875,11 @@ sta {z1} lda #0 adc {z2}+1 sta {z1}+1 +//FRAGMENT vbuz1=vbuz2_rol_2 +lda {z2} +asl +asl +sta {z1} //FRAGMENT _deref_qbuz1=pbuz2 ldy #0 lda {z2} @@ -3090,6 +1895,11 @@ sta {z1} bcc !+ inc {z1}+1 !: +//FRAGMENT pbuz1_derefidx_vbuc1=pbuc2_derefidx_vbuz2 +ldy {z2} +lda {c2},y +ldy #{c1} +sta ({z1}),y //FRAGMENT vbuz1=vbuz2_band__deref_pbuc1 lda {c1} and {z2} @@ -3104,6 +1914,10 @@ lda ({z1}),y cmp ({z3}),y beq {la1} +//FRAGMENT vbuc1_eq_vbuz1_then_la1 +lda #{c1} +cmp {z1} +beq {la1} //FRAGMENT vbuz1_gt_0_then_la1 lda {z1} bne {la1} @@ -3183,6 +1997,17 @@ tya clc adc #{c1} tay +//FRAGMENT vbuc1_neq_vbuaa_then_la1 +cmp #{c1} +bne {la1} +//FRAGMENT _deref_pbuz1=pbuc1_derefidx_vbuxx +lda {c1},x +ldy #0 +sta ({z1}),y +//FRAGMENT _deref_pbuz1=pbuc1_derefidx_vbuyy +lda {c1},y +ldy #0 +sta ({z1}),y //FRAGMENT vbuz1=vbuz1_plus_vbuxx txa clc @@ -3433,6 +2258,11 @@ sta {z1}+1 asl asl sta {z1} +//FRAGMENT vbuz1=vbuxx_rol_2 +txa +asl +asl +sta {z1} //FRAGMENT vbuz1=vbuyy_rol_2 tya asl @@ -3453,10 +2283,20 @@ asl tya asl asl +//FRAGMENT vbuxx=vbuz1_rol_2 +lda {z1} +asl +asl +tax //FRAGMENT vbuxx=vbuaa_rol_2 asl asl tax +//FRAGMENT vbuxx=vbuxx_rol_2 +txa +asl +asl +tax //FRAGMENT vbuxx=vbuyy_rol_2 tya asl @@ -3481,6 +2321,10 @@ tya asl asl tay +//FRAGMENT pbuz1_derefidx_vbuc1=pbuc2_derefidx_vbuxx +lda {c2},x +ldy #{c1} +sta ({z1}),y //FRAGMENT vbuaa=vbuz1_band__deref_pbuc1 lda {c1} and {z1} @@ -3533,6 +2377,9 @@ lda ({z1}),y cmp ({z2}),y beq {la1} +//FRAGMENT vbuc1_eq_vbuaa_then_la1 +cmp #{c1} +beq {la1} //FRAGMENT vbuaa_gt_0_then_la1 cmp #0 bne {la1} @@ -3839,6 +2686,18 @@ ldy {c1},x //FRAGMENT vbuxx_gt_0_then_la1 cpx #0 bne {la1} +//FRAGMENT vbuc1_eq_vbuxx_then_la1 +cpx #{c1} +beq {la1} +//FRAGMENT vbuc1_eq_vbuyy_then_la1 +cpy #{c1} +beq {la1} +//FRAGMENT vbuc1_neq_vbuxx_then_la1 +cpx #{c1} +bne {la1} +//FRAGMENT vbuc1_neq_vbuyy_then_la1 +cpy #{c1} +bne {la1} //FRAGMENT vbuz1=vbuyy_bor_vbuxx txa sty $ff @@ -3890,6 +2749,14 @@ sta {z1} lda {z1}+1 adc #>{c1} sta {z1}+1 +//FRAGMENT vwuz1=vwuz2_plus_vwuz1 +lda {z1} +clc +adc {z2} +sta {z1} +lda {z1}+1 +adc {z2}+1 +sta {z1}+1 //FRAGMENT pbuz1=pbuc1_plus_vwuz1 clc lda {z1} @@ -3909,12 +2776,17 @@ inc {z1}+1 //FRAGMENT vwsz1=vwsz1_rol_1 asl {z1} rol {z1}+1 +//FRAGMENT vbuz1=_deref_pbuc1 +lda {c1} +sta {z1} //FRAGMENT vbuz1=vbuz2_plus_vbuc1 lax {z2} axs #-[{c1}] stx {z1} //FRAGMENT vbuaa=_deref_pbuc1 lda {c1} +//FRAGMENT vbuxx=_deref_pbuc1 +ldx {c1} //FRAGMENT vbuaa=vbuz1_plus_vbuc1 lda #{c1} clc @@ -3968,6 +2840,8 @@ txa clc adc #{c1} tay +//FRAGMENT vbuyy=_deref_pbuc1 +ldy {c1} //FRAGMENT vbuz1=vbuyy_plus_vbuc1 tya clc @@ -4063,6 +2937,11 @@ lda {z1} sta {c1},y lda {z1}+1 sta {c1}+1,y +//FRAGMENT pvoz1=pvoc1 +lda #<{c1} +sta {z1} +lda #>{c1} +sta {z1}+1 //FRAGMENT vbuz1=_bnot_vbuz2 lda {z2} eor #$ff @@ -4842,6 +3721,15 @@ bvc !+ eor #$80 !: bmi {la1} +//FRAGMENT vduz1=vduz2 +lda {z2} +sta {z1} +lda {z2}+1 +sta {z1}+1 +lda {z2}+2 +sta {z1}+2 +lda {z2}+3 +sta {z1}+3 //FRAGMENT vwsz1_ge_0_then_la1 lda {z1}+1 bpl {la1} @@ -4871,11 +3759,38 @@ sta {z1}+1 lda #0 sta {z1}+2 sta {z1}+3 +//FRAGMENT vduz1=vduc1 +lda #<{c1} +sta {z1} +lda #>{c1} +sta {z1}+1 +lda #<{c1}>>$10 +sta {z1}+2 +lda #>{c1}>>$10 +sta {z1}+3 //FRAGMENT vwuz1_neq_0_then_la1 lda {z1} bne {la1} lda {z1}+1 bne {la1} +//FRAGMENT vbuz1=vwuz2_band_vbuc1 +lda #{c1} +and {z2} +sta {z1} +//FRAGMENT vduz1=vduz1_plus_vduz2 +lda {z1} +clc +adc {z2} +sta {z1} +lda {z1}+1 +adc {z2}+1 +sta {z1}+1 +lda {z1}+2 +adc {z2}+2 +sta {z1}+2 +lda {z1}+3 +adc {z2}+3 +sta {z1}+3 //FRAGMENT vwuz1=vwuz1_ror_1 lsr {z1}+1 ror {z1} @@ -4899,6 +3814,14 @@ sta {z1} //FRAGMENT vbuz1=_byte_vwuz2 lda {z2} sta {z1} +//FRAGMENT pbuz1=_inc_pbuz2 +clc +lda {z2} +adc #1 +sta {z1} +lda {z2}+1 +adc #0 +sta {z1}+1 //FRAGMENT vwuz1_ge_vwuz2_then_la1 lda {z2}+1 cmp {z1}+1 @@ -4925,6 +3848,25 @@ sta {z1} lda {z1}+1 sbc {z2}+1 sta {z1}+1 +//FRAGMENT vbuaa=vwuz1_band_vbuc1 +lda #{c1} +and {z1} +//FRAGMENT vbuxx=vwuz1_band_vbuc1 +lda #{c1} +and {z1} +tax +//FRAGMENT vbuyy=vwuz1_band_vbuc1 +lda #{c1} +and {z1} +tay +//FRAGMENT vbuxx=vbuxx_bxor_vbuc1 +txa +eor #{c1} +tax +//FRAGMENT vbuyy=vbuyy_bxor_vbuc1 +tya +eor #{c1} +tay //FRAGMENT vbuaa=_byte_vwuz1 lda {z1} //FRAGMENT vbuxx=_byte_vwuz1 @@ -4933,6 +3875,11 @@ tax //FRAGMENT vbuyy=_byte_vwuz1 lda {z1} tay +//FRAGMENT _deref_pbuz1=pbuc1_derefidx_vbuaa +tay +lda {c1},y +ldy #0 +sta ({z1}),y //FRAGMENT pwsz1=pwsc1_plus_vwsz1 clc lda {z1} @@ -4977,6 +3924,15 @@ lda {c1},y sta {z1} lda {c1}+1,y sta {z1}+1 +//FRAGMENT pbuz1_lt_vwuc1_then_la1 +lda {z1}+1 +cmp #>{c1} +bcc {la1} +bne !+ +lda {z1} +cmp #<{c1} +bcc {la1} +!: //FRAGMENT _deref_pbuz1=_inc__deref_pbuz1 ldy #0 lda ({z1}),y @@ -5031,6 +3987,10 @@ sta {c1},x lda ({z2}),y ldx {z1} sta {c1},x +//FRAGMENT _deref_pbuc1_neq_vbuc2_then_la1 +lda #{c2} +cmp {c1} +bne {la1} //FRAGMENT pbuz1_derefidx_(pbsc1_derefidx_vbuz2)=vbuc2 lda #{c2} ldx {z2} @@ -5247,10 +4207,21 @@ tya sta {c1},y //FRAGMENT pbsc1_derefidx_vbuxx=vbsaa sta {c1},x +//FRAGMENT vbsyy=vbsc1 +ldy #{c1} +//FRAGMENT _deref_pbuz1=_deref_pbuz2 +ldy #0 +lda ({z2}),y +ldy #0 +sta ({z1}),y //FRAGMENT vbuz1=vbuz2_plus_vbuz2 lda {z2} asl sta {z1} +//FRAGMENT vbuz1=vbuz2_plus_1 +ldy {z2} +iny +sty {z1} //FRAGMENT vwuz1=vwuz2_plus_vbuz3 lda {z3} clc @@ -5281,6 +4252,10 @@ lda ({z1}),y cmp #0 bne {la1} +//FRAGMENT vbuz1_lt_vbuz2_then_la1 +lda {z1} +cmp {z2} +bcc {la1} //FRAGMENT vwuz1=vbuz2_rol_3 lda {z2} sta {z1} @@ -5318,6 +4293,10 @@ tay lda {z1} clc adc #1 +//FRAGMENT vbuz1=vbuaa_plus_1 +clc +adc #1 +sta {z1} //FRAGMENT vbuxx_eq_vbuz1_then_la1 cpx {z1} beq {la1} @@ -5354,6 +4333,9 @@ lda ({z1}),y cmp #{c1} bne {la1} +//FRAGMENT vbuz1=vbuxx_plus_1 +inx +stx {z1} //FRAGMENT pbuz1_derefidx_vbuaa_eq_vbuc1_then_la1 tay lda #{c1} @@ -5381,6 +4363,9 @@ lda ({z1}),y cmp #0 bne {la1} +//FRAGMENT vbuxx_lt_vbuz1_then_la1 +cpx {z1} +bcc {la1} //FRAGMENT vbuxx=vbuz1_plus_1 ldx {z1} inx @@ -5464,6 +4449,21 @@ ldx {c1}+1 ldy {c1} //FRAGMENT vbuyy=_hi__deref_pwuc1 ldy {c1}+1 +//FRAGMENT pbuz1=pbuz2_plus_vwsz3 +lda {z2} +clc +adc {z3} +sta {z1} +lda {z2}+1 +adc {z3}+1 +sta {z1}+1 +//FRAGMENT pbuz1_neq_pbuz2_then_la1 +lda {z1}+1 +cmp {z2}+1 +bne {la1} +lda {z1} +cmp {z2} +bne {la1} //FRAGMENT vwsz1=vbsc1_minus_vwsz2 NO_SYNTHESIS //FRAGMENT vwsz1=vwuc1_minus_vwsz2 @@ -6142,6 +5142,11 @@ sta {z1} lda {c1}+1 adc #>{c2} sta {z1}+1 +//FRAGMENT _deref_qbuc1=pbuz1 +lda {z1} +sta {c1} +lda {z1}+1 +sta {c1}+1 //FRAGMENT vbuc1_neq__deref_pbuc2_then_la1 lda #{c1} cmp {c2} @@ -6151,12 +5156,22 @@ lda {z2} ldy #{c1} sta {z1}+1 sty {z1} +//FRAGMENT vwuz1=vwuz2_plus_vbuc1 +lda #{c1} +clc +adc {z2} +sta {z1} +lda #0 +adc {z2}+1 +sta {z1}+1 //FRAGMENT vbuz1=vbuz2_minus__deref_pbuz3 lda {z2} sec ldy #0 sbc ({z3}),y sta {z1} +//FRAGMENT vbsz1=_inc_vbsz1 +inc {z1} //FRAGMENT vbsz1_neq_vbsc1_then_la1 lda #{c1} cmp {z1} @@ -6178,6 +5193,10 @@ sta {z1} lda {z3} ldy {z2} sta ({z1}),y +//FRAGMENT pbuz1_derefidx_vbuz2=vbuc1 +lda #{c1} +ldy {z2} +sta ({z1}),y //FRAGMENT vwuz1=vwuz2_ror_1 lda {z2}+1 lsr @@ -6215,6 +5234,10 @@ sta {z1} lda {z1}+1 sbc {c1}+1,y sta {z1}+1 +//FRAGMENT vbuz1_eq_vbuc1_then_la1 +lda #{c1} +cmp {z1} +beq {la1} //FRAGMENT vwuz1=vwuz1_plus_pwuc1_derefidx_vbuz2 ldy {z2} clc @@ -6524,6 +5547,9 @@ sta {z1} lda {z1}+1 sbc {c1}+1,y sta {z1}+1 +//FRAGMENT vbuxx_eq_vbuc1_then_la1 +cpx #{c1} +beq {la1} //FRAGMENT vwuz1=vwuz1_plus_pwuc1_derefidx_vbuaa tay clc @@ -6560,6 +5586,9 @@ dex //FRAGMENT vbuyy=vbuyy_minus_2 dey dey +//FRAGMENT vbuyy_eq_vbuc1_then_la1 +cpy #{c1} +beq {la1} //FRAGMENT vbuz1=vbuz2_bor_vbuyy tya ora {z2} @@ -6599,6 +5628,17 @@ cpx $ff bcc {la1} //FRAGMENT pbuz1_derefidx_vbuyy=vbuaa sta ({z1}),y +//FRAGMENT vwuz1=vwuz1_plus_vbuc1 +lda #{c1} +clc +adc {z1} +sta {z1} +bcc !+ +inc {z1}+1 +!: +//FRAGMENT vbuaa_eq_vbuc1_then_la1 +cmp #{c1} +beq {la1} //FRAGMENT vbuz1_eq_vbuxx_then_la1 cpx {z1} beq {la1} @@ -6615,6 +5655,11 @@ beq {la1} sty $ff cpx $ff beq {la1} +//FRAGMENT pbuz1_derefidx_vbuz2=pbuc1_derefidx_vbuz3 +ldy {z3} +lda {c1},y +ldy {z2} +sta ({z1}),y //FRAGMENT pbuz1_derefidx_vbuxx=pbuc1_derefidx_vbuz2 txa ldx {z2} @@ -6625,6 +5670,10 @@ sta ({z1}),y ldx {z2} lda {c1},x sta ({z1}),y +//FRAGMENT pbuz1_derefidx_vbuz2=pbuc1_derefidx_vbuxx +lda {c1},x +ldy {z2} +sta ({z1}),y //FRAGMENT pbuz1_derefidx_vbuxx=pbuc1_derefidx_vbuxx txa tay @@ -6633,6 +5682,10 @@ sta ({z1}),y //FRAGMENT pbuz1_derefidx_vbuyy=pbuc1_derefidx_vbuxx lda {c1},x sta ({z1}),y +//FRAGMENT pbuz1_derefidx_vbuz2=pbuc1_derefidx_vbuyy +lda {c1},y +ldy {z2} +sta ({z1}),y //FRAGMENT pbuz1_derefidx_vbuxx=pbuc1_derefidx_vbuyy lda {c1},y stx $ff @@ -7160,6 +6213,10 @@ cmp #{c1} beq !+ bcs {la1} !: +//FRAGMENT vbuz1=vbuz2_bxor_vbuc1 +lda #{c1} +eor {z2} +sta {z1} //FRAGMENT _deref_pbuc1=_deref_pbuc1_band_vbuz1 lda {c1} and {z1} @@ -7168,6 +6225,17 @@ sta {c1} lda {c1} ora {z1} sta {c1} +//FRAGMENT vbuaa=vbuz1_bxor_vbuc1 +lda #{c1} +eor {z1} +//FRAGMENT vbuxx=vbuz1_bxor_vbuc1 +lda #{c1} +eor {z1} +tax +//FRAGMENT vbuyy=vbuz1_bxor_vbuc1 +lda #{c1} +eor {z1} +tay //FRAGMENT vbuz1=vbuaa_bxor_vbuc1 eor #{c1} sta {z1} @@ -7179,6 +6247,28 @@ tax //FRAGMENT vbuyy=vbuaa_bxor_vbuc1 eor #{c1} tay +//FRAGMENT vbuz1=vbuxx_bxor_vbuc1 +txa +eor #{c1} +sta {z1} +//FRAGMENT vbuaa=vbuxx_bxor_vbuc1 +txa +eor #{c1} +//FRAGMENT vbuyy=vbuxx_bxor_vbuc1 +txa +eor #{c1} +tay +//FRAGMENT vbuz1=vbuyy_bxor_vbuc1 +tya +eor #{c1} +sta {z1} +//FRAGMENT vbuaa=vbuyy_bxor_vbuc1 +tya +eor #{c1} +//FRAGMENT vbuxx=vbuyy_bxor_vbuc1 +tya +eor #{c1} +tax //FRAGMENT _deref_pbuc1=_deref_pbuc1_band_vbuaa and {c1} sta {c1} @@ -7201,6 +6291,8 @@ sta {c1} tya ora {c1} sta {c1} +//FRAGMENT vbsz1=_dec_vbsz1 +dec {z1} //FRAGMENT pbuz1=pbuc1_plus_vbsz2 lda {z2} clc @@ -7283,6 +6375,10 @@ txa sty $ff ora $ff tax +//FRAGMENT vbsxx=vbsc1 +ldx #{c1} +//FRAGMENT vbsxx=_dec_vbsxx +dex //FRAGMENT vduz1=vduz2_minus_vduc1 lda {z2} sec @@ -7371,6 +6467,14 @@ sta {z1} lda {z2}+1 sbc #>{c1} sta {z1}+1 +//FRAGMENT pbuz1=pbuz2_plus_vbuc1 +lda #{c1} +clc +adc {z2} +sta {z1} +lda #0 +adc {z2}+1 +sta {z1}+1 //FRAGMENT _deref_pwuz1_le_vwuz2_then_la1 ldy #1 lda ({z1}),y @@ -7763,6 +6867,14 @@ sta {z1} //FRAGMENT vbuz1=_hi_pbuz2 lda {z2}+1 sta {z1} +//FRAGMENT pbuz1=pbuz1_plus_vwuc1 +clc +lda {z1} +adc #<{c1} +sta {z1} +lda {z1}+1 +adc #>{c1} +sta {z1}+1 //FRAGMENT vbuc1_lt_vbuz1_then_la1 lda #{c1} cmp {z1} @@ -7771,6 +6883,10 @@ bcc {la1} lda #{c1} cmp {z1} bcs {la1} +//FRAGMENT vbuz1_ge_vbuz2_then_la1 +lda {z1} +cmp {z2} +bcs {la1} //FRAGMENT vwuz1=pbuc1_derefidx_vbuz2_word_pbuc2_derefidx_vbuz2 ldy {z2} lda {c1},y @@ -7807,6 +6923,9 @@ sta {z1} cmp #{c1} bcc {la1} beq {la1} +//FRAGMENT vbuxx_ge_vbuz1_then_la1 +cpx {z1} +bcs {la1} //FRAGMENT vbuz1_ge_vbuaa_then_la1 ldy {z1} sta $ff @@ -7887,6 +7006,11 @@ tay cpx #{c1} bcc {la1} beq {la1} +//FRAGMENT vbuz1_ge_vbuxx_then_la1 +lda {z1} +stx $ff +cmp $ff +bcs {la1} //FRAGMENT vbuc1_lt_vbuxx_then_la1 cpx #{c1} beq !+ @@ -7927,6 +7051,20 @@ bne {la1} lda {z1} cmp {z2} bne {la1} +//FRAGMENT vwuz1_le_0_then_la1 +lda {z1} +bne !+ +lda {z1}+1 +beq {la1} +!: +//FRAGMENT pbuz1=pbuz2_plus_vwuz3 +lda {z2} +clc +adc {z3} +sta {z1} +lda {z2}+1 +adc {z3}+1 +sta {z1}+1 //FRAGMENT vwuz1=vwuz2_band_vwuc1 lda {z2} and #<{c1} @@ -7960,6 +7098,14 @@ ldy #0 ora ({z1}),y ldy #0 sta ({z1}),y +//FRAGMENT pbuz1=pbuz2_plus_vwuz1 +lda {z1} +clc +adc {z2} +sta {z1} +lda {z1}+1 +adc {z2}+1 +sta {z1}+1 //FRAGMENT pbuz1=pbuz1_plus_vwuz2 lda {z1} clc @@ -7986,6 +7132,11 @@ bne {la1} lda {c1},y cmp #0 bne {la1} +//FRAGMENT pvoz1=pvoz2 +lda {z2} +sta {z1} +lda {z2}+1 +sta {z1}+1 //FRAGMENT pbuz1=pbuz2_minus_vwuc1 lda {z2} sec @@ -8176,6 +7327,14 @@ lda ({z1}),y ldy #{c1}+1 adc ({z1}),y sta ({z1}),y +//FRAGMENT pbuz1=pbuz2_plus_vwuc1 +clc +lda {z2} +adc #<{c1} +sta {z1} +lda {z2}+1 +adc #>{c1} +sta {z1}+1 //FRAGMENT vbuz1=_neg_vbuz2 lda {z2} eor #$ff @@ -8191,6 +7350,19 @@ lda #{c2} ldy {z1} cmp {c1},y bne {la1} +//FRAGMENT vwuz1=vwuz2_rol_6 +lda {z2}+1 +lsr +sta $ff +lda {z2} +ror +sta {z1}+1 +lda #0 +ror +sta {z1} +lsr $ff +ror {z1}+1 +ror {z1} //FRAGMENT vwuz1=vbuc1_plus_vwuz2 lda #{c1} clc @@ -8418,6 +7590,9 @@ tax //FRAGMENT vbuyy=pbuz1_derefidx_vbuyy lda ({z1}),y tay +//FRAGMENT vbuaa_ge_vbuz1_then_la1 +cmp {z1} +bcs {la1} //FRAGMENT pbuc1_derefidx_vbuaa_neq_vbuc2_then_la1 tay lda #{c2} @@ -8493,10 +7668,22 @@ lda {z1} sta {c1},y lda {z1}+1 sta {c1}+1,y +//FRAGMENT vbuyy_ge_vbuz1_then_la1 +cpy {z1} +bcs {la1} //FRAGMENT vbuyy_ge_vbuxx_then_la1 stx $ff cpy $ff bcs {la1} +//FRAGMENT vbuz1_ge_vbuyy_then_la1 +lda {z1} +sty $ff +cmp $ff +bcs {la1} +//FRAGMENT vbuxx_ge_vbuyy_then_la1 +sty $ff +cpx $ff +bcs {la1} //FRAGMENT vwuz1=vwuz1_ror_3 lsr {z1}+1 ror {z1} @@ -8513,6 +7700,19 @@ asl {z1} rol {z1}+1 asl {z1} rol {z1}+1 +//FRAGMENT vwuz1=vwuz1_rol_6 +lda {z1}+1 +lsr +sta $ff +lda {z1} +ror +sta {z1}+1 +lda #0 +ror +sta {z1} +lsr $ff +ror {z1}+1 +ror {z1} //FRAGMENT vwuz1=vbuc1_plus_vwuz1 lda #{c1} clc @@ -8585,6 +7785,13 @@ sta {z1} lda #0 rol sta {z1}+1 +//FRAGMENT vwuz1=vwuz2_rol_1 +lda {z2} +asl +sta {z1} +lda {z2}+1 +rol +sta {z1}+1 //FRAGMENT qwuz1=qwuz2_plus_vwuz3 lda {z2} clc @@ -8763,6 +7970,11 @@ sta {z1} lda {z1}+1 sbc {z2}+1 sta {z1}+1 +//FRAGMENT pbuz1_derefidx_vbuz2=pbuc1_derefidx_vbuaa +tay +lda {c1},y +ldy {z2} +sta ({z1}),y //FRAGMENT vbuyy=pbuc1_derefidx_vbuxx ldy {c1},x //FRAGMENT _stackpullbyte_1 @@ -8785,14 +7997,31 @@ ldy {z1} lda {c1},y cmp {z2} beq {la1} +//FRAGMENT vbsz1=_sbyte_vwuz2 +lda {z2} +sta {z1} //FRAGMENT vbsz1=vbsz2_minus_vbsz3 lda {z2} sec sbc {z3} sta {z1} +//FRAGMENT vbsc1_neq_vbsz1_then_la1 +lda #{c1} +cmp {z1} +bne {la1} //FRAGMENT vbuz1=_byte_vduz2 lda {z2} sta {z1} +//FRAGMENT vduz1=pduc1_derefidx_vbuz2 +ldy {z2} +lda {c1},y +sta {z1} +lda {c1}+1,y +sta {z1}+1 +lda {c1}+2,y +sta {z1}+2 +lda {c1}+3,y +sta {z1}+3 //FRAGMENT vduz1_ge_vduz2_then_la1 lda {z1}+3 cmp {z2}+3 @@ -8927,6 +8156,10 @@ tax sty $ff cpx $ff beq {la1} +//FRAGMENT vbsaa=_sbyte_vwuz1 +lda {z1} +//FRAGMENT vbsxx=_sbyte_vwuz1 +ldx {z1} //FRAGMENT vbsz1=vbsz2_minus_vbsaa eor #$ff sec @@ -9046,6 +8279,9 @@ tax //FRAGMENT vbsxx=vbsyy_minus_vbsyy lda #0 tax +//FRAGMENT vbsc1_neq_vbsxx_then_la1 +cpx #{c1} +bne {la1} //FRAGMENT vbuaa=_byte_vduz1 lda {z1} //FRAGMENT vbuxx=_byte_vduz1 @@ -9064,6 +8300,15 @@ lda {c1}+2,y sta {z1}+2 lda {c1}+3,y sta {z1}+3 +//FRAGMENT vduz1=pduc1_derefidx_vbuxx +lda {c1},x +sta {z1} +lda {c1}+1,x +sta {z1}+1 +lda {c1}+2,x +sta {z1}+2 +lda {c1}+3,x +sta {z1}+3 //FRAGMENT vduz1=pduc1_derefidx_vbuyy lda {c1},y sta {z1} @@ -9106,6 +8351,15 @@ beq {la1} cpy #{c1} bcc {la1} beq {la1} +//FRAGMENT vbsaa=_inc_vbsaa +clc +adc #1 +//FRAGMENT vbsxx=_inc_vbsxx +inx +//FRAGMENT vbsyy=_sbyte_vwuz1 +ldy {z1} +//FRAGMENT vbsyy=_inc_vbsyy +iny //FRAGMENT vbuaa_lt_vbuxx_then_la1 stx $ff cmp $ff @@ -9826,6 +9080,15 @@ ora {z2} sta {z1} lda {z2}+1 sta {z1}+1 +//FRAGMENT pbuz1_derefidx_vbuc1=pbuc2_derefidx_vbuaa +tay +lda {c2},y +ldy #{c1} +sta ({z1}),y +//FRAGMENT pbuz1_derefidx_vbuc1=pbuc2_derefidx_vbuyy +lda {c2},y +ldy #{c1} +sta ({z1}),y //FRAGMENT vwuz1=vwuz1_bor_vbuxx txa ora {z1} @@ -11725,6 +10988,19 @@ bne {la1} lda {z1} cmp #<{c1} bne {la1} +//FRAGMENT vwuz1=_word__deref_pbuc1 +lda {c1} +sta {z1} +lda #0 +sta {z1}+1 +//FRAGMENT vwuz1=vwuz2_plus_1 +clc +lda {z2} +adc #1 +sta {z1} +lda {z2}+1 +adc #0 +sta {z1}+1 //FRAGMENT vwuz1=vwuz2_ror_4 lda {z2}+1 lsr @@ -11762,6 +11038,11 @@ bcs {la1} //FRAGMENT pbuc1_derefidx_vbuxx=_byte_vwuz1 lda {z1} sta {c1},x +//FRAGMENT vwuz1=vwuz1_plus_1 +inc {z1} +bne !+ +inc {z1}+1 +!: //FRAGMENT vwuz1=vwuz1_rol_8 lda {z1} sta {z1}+1 @@ -11843,6 +11124,19 @@ sta {z1}+2 lda {z2}+3 adc #0 sta {z1}+3 +//FRAGMENT vwuz1=vwuz2_ror_6 +lda {z2} +asl +sta $ff +lda {z2}+1 +rol +sta {z1} +lda #0 +rol +sta {z1}+1 +asl $ff +rol {z1} +rol {z1}+1 //FRAGMENT pbuz1_derefidx_vbuz2=pbuc1_derefidx_(pbuc2_derefidx_vbuz3) ldx {z3} ldy {c2},x @@ -12646,6 +11940,19 @@ sta {z1} lda {z1}+1 adc #>{c1} sta {z1}+1 +//FRAGMENT vwuz1=vwuz1_ror_6 +lda {z1} +asl +sta $ff +lda {z1}+1 +rol +sta {z1} +lda #0 +rol +sta {z1}+1 +asl $ff +rol {z1} +rol {z1}+1 //FRAGMENT vwuz1=pbuz2_bxor_vwuc1 lda #<{c1} eor {z2} @@ -12999,6 +12306,28 @@ sta {z1}+1 //FRAGMENT vbuyy=pbuc1_derefidx_vbuyy lda {c1},y tay +//FRAGMENT vbsz1=vbsc1_minus_vbsz2 +lda #{c1} +sec +sbc {z2} +sta {z1} +//FRAGMENT vbsz1=vbsc1_minus_vbsaa +eor #$ff +sec +adc #{c1} +sta {z1} +//FRAGMENT vbsz1=vbsc1_minus_vbsxx +txa +eor #$ff +sec +adc #{c1} +sta {z1} +//FRAGMENT vbsz1=vbsc1_minus_vbsyy +tya +eor #$ff +sec +adc #{c1} +sta {z1} //FRAGMENT vbsaa=vbsc1_minus_vbsz1 lda #{c1} sec @@ -13017,6 +12346,25 @@ tya eor #$ff sec adc #{c1} +//FRAGMENT vbsxx=vbsc1_minus_vbsz1 +lda #{c1} +sec +sbc {z1} +tax +//FRAGMENT vbsxx=vbsc1_minus_vbsaa +eor #$ff +tax +axs #-{c1}-1 +//FRAGMENT vbsxx=vbsc1_minus_vbsxx +txa +eor #$ff +tax +axs #-{c1}-1 +//FRAGMENT vbsxx=vbsc1_minus_vbsyy +tya +eor #$ff +tax +axs #-{c1}-1 //FRAGMENT vbsyy=vbsc1_minus_vbsz1 lda #{c1} sec @@ -14191,6 +13539,14 @@ lda {z2} sta {z1}+2 lda {z2}+1 sta {z1}+3 +//FRAGMENT vwuz1=vwuz1_minus_vbuc1 +sec +lda {z1} +sbc #{c1} +sta {z1} +lda {z1}+1 +sbc #0 +sta {z1}+1 //FRAGMENT vbuz1=vbuz2_plus_pbuc1_derefidx_vbuz3 lda {z2} ldy {z3} @@ -14387,6 +13743,20 @@ asl {z1} rol {z1}+1 rol {z1}+2 rol {z1}+3 +//FRAGMENT vduz1=vduz2_plus_vduz3 +lda {z2} +clc +adc {z3} +sta {z1} +lda {z2}+1 +adc {z3}+1 +sta {z1}+1 +lda {z2}+2 +adc {z3}+2 +sta {z1}+2 +lda {z2}+3 +adc {z3}+3 +sta {z1}+3 //FRAGMENT vduz1=vduz2_rol_1 lda {z2} asl @@ -14423,6 +13793,17 @@ asl {z1} rol {z1}+1 rol {z1}+2 rol {z1}+3 +//FRAGMENT pbuz1=_deref_qbuc1 +lda {c1} +sta {z1} +lda {c1}+1 +sta {z1}+1 +//FRAGMENT vbsz1_gt_0_then_la1 +lda {z1} +cmp #0 +beq !+ +bpl {la1} +!: //FRAGMENT vbuz1=vbuc1_minus_vbuz1 lda #{c1} sec @@ -14454,6 +13835,23 @@ sta {z1} //FRAGMENT vbsaa_neq_vbsc1_then_la1 cmp #{c1} bne {la1} +//FRAGMENT vbsaa_gt_0_then_la1 +cmp #0 +beq !+ +bpl {la1} +!: +//FRAGMENT vbsxx_gt_0_then_la1 +txa +cmp #0 +beq !+ +bpl {la1} +!: +//FRAGMENT vbsyy_gt_0_then_la1 +tya +cmp #0 +beq !+ +bpl {la1} +!: //FRAGMENT vbsyy_neq_0_then_la1 tya cmp #0 @@ -16314,6 +15712,11 @@ lda ({z1}),y tay lda {c2},y sta {c1},x +//FRAGMENT _deref_pwuc1=vbuc2 +lda #0 +sta {c1}+1 +lda #<{c2} +sta {c1} //FRAGMENT vboaa=vboc1 lda #{c1} //FRAGMENT vboxx=vboc1 @@ -16354,6 +15757,405 @@ iny lda {z2} ldy #0 sta ({z1}),y +//FRAGMENT vwuz1=vwuz2_minus_vbuc1 +sec +lda {z2} +sbc #{c1} +sta {z1} +lda {z2}+1 +sbc #0 +sta {z1}+1 +//FRAGMENT vduz1=vwuz2 +lda {z2} +sta {z1} +lda {z2}+1 +sta {z1}+1 +lda #0 +sta {z1}+2 +sta {z1}+3 +//FRAGMENT vwsz1_lt_vwuz2_then_la1 +lda {z1}+1 +bmi {la1} +cmp {z2}+1 +bcc {la1} +bne !+ +lda {z1} +cmp {z2} +bcc {la1} +!: +//FRAGMENT vduz1=pduz2_derefidx_vbuz3 +ldy {z3} +lda ({z2}),y +sta {z1} +iny +lda ({z2}),y +sta {z1}+1 +iny +lda ({z2}),y +sta {z1}+2 +iny +lda ({z2}),y +sta {z1}+3 +//FRAGMENT vduz1=vduz2_plus_pduc1_derefidx_vbuz3 +ldy {z3} +lda {z2} +clc +adc {c1},y +sta {z1} +lda {z2}+1 +adc {c1}+1,y +sta {z1}+1 +lda {z2}+2 +adc {c1}+2,y +sta {z1}+2 +lda {z2}+3 +adc {c1}+3,y +sta {z1}+3 +//FRAGMENT vduz1=vduz2_plus_pduz3_derefidx_vbuz4 +ldy {z4} +lda {z2} +clc +adc ({z3}),y +sta {z1} +iny +lda {z2}+1 +adc ({z3}),y +sta {z1}+1 +iny +lda {z2}+2 +adc ({z3}),y +sta {z1}+2 +iny +lda {z2}+3 +adc ({z3}),y +sta {z1}+3 +//FRAGMENT vduz1=_bnot_vduz2 +lda {z2} +eor #$ff +sta {z1} +lda {z2}+1 +eor #$ff +sta {z1}+1 +lda {z2}+2 +eor #$ff +sta {z1}+2 +lda {z2}+3 +eor #$ff +sta {z1}+3 +//FRAGMENT vduz1=vduz2_bor_vduz3 +lda {z2} +ora {z3} +sta {z1} +lda {z2}+1 +ora {z3}+1 +sta {z1}+1 +lda {z2}+2 +ora {z3}+2 +sta {z1}+2 +lda {z2}+3 +ora {z3}+3 +sta {z1}+3 +//FRAGMENT vduz1=vduz2_bxor_vduz3 +lda {z2} +eor {z3} +sta {z1} +lda {z2}+1 +eor {z3}+1 +sta {z1}+1 +lda {z2}+2 +eor {z3}+2 +sta {z1}+2 +lda {z2}+3 +eor {z3}+3 +sta {z1}+3 +//FRAGMENT vduz1=vduz2_band_vduz3 +lda {z2} +and {z3} +sta {z1} +lda {z2}+1 +and {z3}+1 +sta {z1}+1 +lda {z2}+2 +and {z3}+2 +sta {z1}+2 +lda {z2}+3 +and {z3}+3 +sta {z1}+3 +//FRAGMENT vbuz1=pbuc1_derefidx_(_deref_pbuc2) +ldy {c2} +lda {c1},y +sta {z1} +//FRAGMENT _deref_pwuc1=_inc__deref_pwuc1 +inc {c1} +bne !+ +inc {c1}+1 +!: +//FRAGMENT _deref_pwuc1_eq_vbuc2_then_la1 +lda {c1}+1 +bne !+ +lda {c1} +cmp #{c2} +beq {la1} +!: +//FRAGMENT vwuz1=vwuz2_band_vbuc1 +lda #{c1} +and {z2} +sta {z1} +lda #0 +sta {z1}+1 +//FRAGMENT _deref_(_deref_qbuc1)=_deref_pbuc2 +lda {c2} +ldy {c1} +sty $fe +ldy {c1}+1 +sty $ff +ldy #0 +sta ($fe),y +//FRAGMENT _deref_(_deref_qbuc1)=vbuz1 +lda {z1} +ldy {c1} +sty $fe +ldy {c1}+1 +sty $ff +ldy #0 +sta ($fe),y +//FRAGMENT _deref_(_deref_qbuc1)=_deref_(_deref_qbuc1)_bxor_vbuc2 +ldy {c1} +sty $fe +ldy {c1}+1 +sty $ff +ldy #0 +lda ($fe),y +eor #{c2} +sta ($fe),y +//FRAGMENT pbuz1=pbuc1_minus_vwuz2 +sec +lda #<{c1} +sbc {z2} +sta {z1} +lda #>{c1} +sbc {z2}+1 +sta {z1}+1 +//FRAGMENT pbuz1=_deref_qbuc1_plus_vwuz2 +clc +lda {z2} +adc {c1} +sta {z1} +lda {z2}+1 +adc {c1}+1 +sta {z1}+1 +//FRAGMENT pbuz1=pbuz2_plus__deref_pwuc1 +clc +lda {c1} +adc {z2} +sta {z1} +lda {c1}+1 +adc {z2}+1 +sta {z1}+1 +//FRAGMENT vduz1=pduz2_derefidx_vbuxx +txa +tay +lda ({z2}),y +sta {z1} +iny +lda ({z2}),y +sta {z1}+1 +iny +lda ({z2}),y +sta {z1}+2 +iny +lda ({z2}),y +sta {z1}+3 +//FRAGMENT vduz1=vduz2_plus_pduc1_derefidx_vbuxx +lda {z2} +clc +adc {c1},x +sta {z1} +lda {z2}+1 +adc {c1}+1,x +sta {z1}+1 +lda {z2}+2 +adc {c1}+2,x +sta {z1}+2 +lda {z2}+3 +adc {c1}+3,x +sta {z1}+3 +//FRAGMENT vduz1=vduz2_plus_pduz3_derefidx_vbuxx +txa +tay +lda {z2} +clc +adc ({z3}),y +sta {z1} +iny +lda {z2}+1 +adc ({z3}),y +sta {z1}+1 +iny +lda {z2}+2 +adc ({z3}),y +sta {z1}+2 +iny +lda {z2}+3 +adc ({z3}),y +sta {z1}+3 +//FRAGMENT vbuaa=pbuc1_derefidx_(_deref_pbuc2) +ldy {c2} +lda {c1},y +//FRAGMENT vbuxx=pbuc1_derefidx_(_deref_pbuc2) +ldy {c2} +ldx {c1},y +//FRAGMENT vbuyy=pbuc1_derefidx_(_deref_pbuc2) +ldx {c2} +ldy {c1},x +//FRAGMENT _deref_(_deref_qbuc1)=vbuaa +ldy {c1} +sty $fe +ldy {c1}+1 +sty $ff +ldy #0 +sta ($fe),y +//FRAGMENT _deref_(_deref_qbuc1)=vbuxx +txa +ldy {c1} +sty $fe +ldy {c1}+1 +sty $ff +ldy #0 +sta ($fe),y +//FRAGMENT _deref_(_deref_qbuc1)=vbuyy +tya +ldy {c1} +sty $fe +ldy {c1}+1 +sty $ff +ldy #0 +sta ($fe),y +//FRAGMENT vduz1=vduz2_bxor_vduz1 +lda {z1} +eor {z2} +sta {z1} +lda {z1}+1 +eor {z2}+1 +sta {z1}+1 +lda {z1}+2 +eor {z2}+2 +sta {z1}+2 +lda {z1}+3 +eor {z2}+3 +sta {z1}+3 +//FRAGMENT vduz1=vduz1_bxor_vduz2 +lda {z1} +eor {z2} +sta {z1} +lda {z1}+1 +eor {z2}+1 +sta {z1}+1 +lda {z1}+2 +eor {z2}+2 +sta {z1}+2 +lda {z1}+3 +eor {z2}+3 +sta {z1}+3 +//FRAGMENT vduz1=vduz1_bor_vduz2 +lda {z2} +ora {z1} +sta {z1} +lda {z2}+1 +ora {z1}+1 +sta {z1}+1 +lda {z2}+2 +ora {z1}+2 +sta {z1}+2 +lda {z2}+3 +ora {z1}+3 +sta {z1}+3 +//FRAGMENT vbuz1=vbuz1_rol_2 +lda {z1} +asl +asl +sta {z1} +//FRAGMENT vwuz1=vwuz1_band_vbuc1 +lda #{c1} +and {z1} +sta {z1} +lda #0 +sta {z1}+1 +//FRAGMENT vduz1=vduz1_plus_pduz2_derefidx_vbuz3 +ldy {z3} +lda {z1} +clc +adc ({z2}),y +sta {z1} +iny +lda {z1}+1 +adc ({z2}),y +sta {z1}+1 +iny +lda {z1}+2 +adc ({z2}),y +sta {z1}+2 +iny +lda {z1}+3 +adc ({z2}),y +sta {z1}+3 +//FRAGMENT vduz1=vduz1_band_vduz2 +lda {z1} +and {z2} +sta {z1} +lda {z1}+1 +and {z2}+1 +sta {z1}+1 +lda {z1}+2 +and {z2}+2 +sta {z1}+2 +lda {z1}+3 +and {z2}+3 +sta {z1}+3 +//FRAGMENT pbuz1=pbuc1_minus_vwuz1 +sec +lda #<{c1} +sbc {z1} +sta {z1} +lda #>{c1} +sbc {z1}+1 +sta {z1}+1 +//FRAGMENT pbuz1=_deref_qbuc1_plus_vwuz1 +clc +lda {z1} +adc {c1} +sta {z1} +lda {z1}+1 +adc {c1}+1 +sta {z1}+1 +//FRAGMENT vduz1=vduz1_plus_pduc1_derefidx_vbuz2 +ldy {z2} +lda {z1} +clc +adc {c1},y +sta {z1} +lda {z1}+1 +adc {c1}+1,y +sta {z1}+1 +lda {z1}+2 +adc {c1}+2,y +sta {z1}+2 +lda {z1}+3 +adc {c1}+3,y +sta {z1}+3 +//FRAGMENT vduz1=vduz2_bor_vduz1 +lda {z2} +ora {z1} +sta {z1} +lda {z2}+1 +ora {z1}+1 +sta {z1}+1 +lda {z2}+2 +ora {z1}+2 +sta {z1}+2 +lda {z2}+3 +ora {z1}+3 +sta {z1}+3 //FRAGMENT vduz1=vduz2_plus_vduz1 lda {z1} clc @@ -16368,6 +16170,14 @@ sta {z1}+2 lda {z1}+3 adc {z2}+3 sta {z1}+3 +//FRAGMENT pbuz1=pbuz1_plus__deref_pwuc1 +clc +lda {c1} +adc {z1} +sta {z1} +lda {c1}+1 +adc {z1}+1 +sta {z1}+1 //FRAGMENT vbuz1=vbuxx_band_pbuz2_derefidx_vbuc1 ldy #{c1} txa @@ -17060,6 +16870,8 @@ bmi {la1} //FRAGMENT vbsyy_neq_vbsz1_then_la1 cpy {z1} bne {la1} +//FRAGMENT vbsyy=_dec_vbsyy +dey //FRAGMENT vbsyy_neq_vbsxx_then_la1 stx $ff cpy $ff @@ -19828,6 +19640,27 @@ sta {z1}+3 sta {z1}+2 sta {z1}+1 sta {z1} +//FRAGMENT vduz1=vduz2_rol_pbuc1_derefidx_vbuz3 +ldx {z3} +ldy {c1},x +lda {z2} +sta {z1} +lda {z2}+1 +sta {z1}+1 +lda {z2}+2 +sta {z1}+2 +lda {z2}+3 +sta {z1}+3 +cpy #0 +beq !e+ +!: +asl {z1} +rol {z1}+1 +rol {z1}+2 +rol {z1}+3 +dey +bne !- +!e: //FRAGMENT vduz1=vduz2_ror_pbuc1_derefidx_vbuz3 ldy {z3} ldx {c1},y @@ -19870,6 +19703,26 @@ rol {z1}+3 dey bne !- !e: +//FRAGMENT vduz1=vduz2_rol_pbuc1_derefidx_vbuxx +ldy {c1},x +lda {z2} +sta {z1} +lda {z2}+1 +sta {z1}+1 +lda {z2}+2 +sta {z1}+2 +lda {z2}+3 +sta {z1}+3 +cpy #0 +beq !e+ +!: +asl {z1} +rol {z1}+1 +rol {z1}+2 +rol {z1}+3 +dey +bne !- +!e: //FRAGMENT vduz1=vduz2_rol_pbuc1_derefidx_vbuyy ldx {c1},y lda {z2} diff --git a/src/main/fragment/cache/fragment-cache-wdc65c02.asm b/src/main/fragment/cache/fragment-cache-wdc65c02.asm index 4e173505c..c357471a3 100644 --- a/src/main/fragment/cache/fragment-cache-wdc65c02.asm +++ b/src/main/fragment/cache/fragment-cache-wdc65c02.asm @@ -1,4 +1,4 @@ -//KICKC FRAGMENT CACHE 10dedb3bb9 10dedb58e1 +//KICKC FRAGMENT CACHE 106673312a 1066734e54 //FRAGMENT vbuz1=_deref_pbuc1 lda {c1} sta {z1} diff --git a/src/main/fragment/mos6502-common/_deref_qvoc1=_ptr_vbuaa.asm b/src/main/fragment/mos6502-common/_deref_qvoc1=_ptr_vbuaa.asm new file mode 100644 index 000000000..4e6faa2f3 --- /dev/null +++ b/src/main/fragment/mos6502-common/_deref_qvoc1=_ptr_vbuaa.asm @@ -0,0 +1,3 @@ +sta {c1} +lda #0 +sta {c1}+1 \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/model/operators/OperatorCastPtr.java b/src/main/java/dk/camelot64/kickc/model/operators/OperatorCastPtr.java index 1c42ab090..1c58d757c 100644 --- a/src/main/java/dk/camelot64/kickc/model/operators/OperatorCastPtr.java +++ b/src/main/java/dk/camelot64/kickc/model/operators/OperatorCastPtr.java @@ -5,10 +5,7 @@ import dk.camelot64.kickc.model.InternalError; import dk.camelot64.kickc.model.symbols.ProgramScope; import dk.camelot64.kickc.model.types.SymbolType; import dk.camelot64.kickc.model.types.SymbolTypePointer; -import dk.camelot64.kickc.model.values.ConstantInteger; -import dk.camelot64.kickc.model.values.ConstantLiteral; -import dk.camelot64.kickc.model.values.ConstantPointer; -import dk.camelot64.kickc.model.values.ConstantString; +import dk.camelot64.kickc.model.values.*; /** Unary Cast to a pointer ( type* ) */ public class OperatorCastPtr extends OperatorCast { @@ -24,6 +21,8 @@ public class OperatorCastPtr extends OperatorCast { public ConstantLiteral calculateLiteral(ConstantLiteral value, ProgramScope scope) { if(value instanceof ConstantInteger) { return new ConstantPointer(((ConstantInteger) value).getInteger(), pointerType.getElementType()); + } else if(value instanceof ConstantChar) { + return new ConstantPointer(((ConstantChar) value).getInteger(), pointerType.getElementType()); } else if(value instanceof ConstantPointer) { return new ConstantPointer(((ConstantPointer) value).getLocation(), pointerType.getElementType()); } else if(value instanceof ConstantString){ diff --git a/src/main/kc/include/mega65-dma.h b/src/main/kc/include/mega65-dma.h index 842ffba97..0242c6a6a 100644 --- a/src/main/kc/include/mega65-dma.h +++ b/src/main/kc/include/mega65-dma.h @@ -26,4 +26,20 @@ void memcpy_dma4(char dest_bank, void* dest, char src_bank, void* src, unsigned // - src_bank The 64KB bank for the source (0-15) // - src The source address (within the MB and bank) // - num The number of bytes to copy -void memcpy_dma256(char dest_mb, char dest_bank, void* dest, char src_mb, char src_bank, void* src, unsigned int num); \ No newline at end of file +void memcpy_dma256(char dest_mb, char dest_bank, void* dest, char src_mb, char src_bank, void* src, unsigned int num); + +// Fill a memory block within the first 64K memory space using MEGA65 DMagic DMA +// Fills the values of num bytes at the destination with a single byte value. +// - dest The destination address (within the MB and bank) +// - fill The char to fill with +// - num The number of bytes to copy +void memset_dma(void* dest, char fill, unsigned int num); + +// Set a memory block anywhere in the entire 256MB memory space using MEGA65 DMagic DMA +// Sets the values of num bytes to the memory block pointed to by destination. +// - dest_mb The MB value for the destination (0-255) +// - dest_bank The 64KB bank for the destination (0-15) +// - dest The destination address (within the MB and bank) +// - fill The byte to fill into the memory +// - num The number of bytes to copy +void memset_dma256(char dest_mb, char dest_bank, void* dest, char fill, unsigned int num); \ No newline at end of file diff --git a/src/main/kc/lib/mega65-dma.c b/src/main/kc/lib/mega65-dma.c index f9df17d0f..daad38f0e 100644 --- a/src/main/kc/lib/mega65-dma.c +++ b/src/main/kc/lib/mega65-dma.c @@ -127,3 +127,87 @@ char memcpy_dma_command256[] = { 0, // sub-command 0, 0 // modulo-value }; + + +// Fill a memory block within the first 64K memory space using MEGA65 DMagic DMA +// Fills the values of num bytes at the destination with a single byte value. +// - dest The destination address (within the MB and bank) +// - fill The char to fill with +// - num The number of bytes to copy +void memset_dma(void* dest, char fill, unsigned int num) { + // Remember current F018 A/B mode + char dmaMode = DMA->EN018B; + // Set up command + memset_dma_command.count = num; + memset_dma_command.src = (char*)fill; + memset_dma_command.dest = dest; + // Set F018B mode + DMA->EN018B = 1; + // Set address of DMA list + DMA->ADDRMB = 0; + DMA->ADDRBANK = 0; + DMA-> ADDRMSB = >&memset_dma_command; + // Trigger the DMA (without option lists) + DMA-> ADDRLSBTRIG = <&memset_dma_command; + // Re-enable F018A mode + DMA->EN018B = dmaMode; +} + +// DMA list entry for filling data +struct DMA_LIST_F018B memset_dma_command = { + DMA_COMMAND_FILL, // command + 0, // count + 0, // source + 0, // source bank + 0, // destination + 0, // destination bank + 0, // sub-command + 0 // modulo-value +}; + + +// Set a memory block anywhere in the entire 256MB memory space using MEGA65 DMagic DMA +// Sets the values of num bytes to the memory block pointed to by destination. +// - dest_mb The MB value for the destination (0-255) +// - dest_bank The 64KB bank for the destination (0-15) +// - dest The destination address (within the MB and bank) +// - num The number of bytes to copy +void memset_dma256(char dest_mb, char dest_bank, void* dest, char fill, unsigned int num) { + // Remember current F018 A/B mode + char dmaMode = DMA->EN018B; + // Set up command + memset_dma_command256[1] = dest_mb; + struct DMA_LIST_F018B * f018b = (struct DMA_LIST_F018B *)(&memset_dma_command256[4]); + f018b->count = num; + f018b->dest_bank = dest_bank; + f018b->dest = dest; + // Set fill byte + f018b->src = (char*)fill; + // Set F018B mode + DMA->EN018B = 1; + // Set address of DMA list + DMA->ADDRMB = 0; + DMA->ADDRBANK = 0; + DMA-> ADDRMSB = >memset_dma_command256; + // Trigger the DMA (with option lists) + DMA-> ETRIG = EN018B = dmaMode; +} + +// DMA list entry with options for setting data in the 256MB memory space +// Contains DMA options options for setting MB followed by DMA_LIST_F018B struct. +char memset_dma_command256[] = { + DMA_OPTION_DEST_MB, 0x00, // Set MB of destination address + DMA_OPTION_FORMAT_F018B, // Use F018B list format + DMA_OPTION_END, // End of options + // struct DMA_LIST_F018B + DMA_COMMAND_FILL, // command + 0, 0, // count + 0, 0, // source + 0, // source bank + 0, 0, // destination + 0, // destination bank + 0, // sub-command + 0, 0 // modulo-value +}; \ No newline at end of file diff --git a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java index 67357a1e9..44d2211cc 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java +++ b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java @@ -385,6 +385,16 @@ public class TestPrograms { compileAndCompare("examples/mega65/banked-music.c"); } + @Test + public void testMega65DmaTest6() throws IOException, URISyntaxException { + compileAndCompare("examples/mega65/dma-test6.c"); + } + + @Test + public void testMega65DmaTest5() throws IOException, URISyntaxException { + compileAndCompare("examples/mega65/dma-test5.c"); + } + @Test public void testMega65DmaTest4() throws IOException, URISyntaxException { compileAndCompare("examples/mega65/dma-test4.c"); @@ -435,6 +445,11 @@ public class TestPrograms { compileAndCompare("examples/mega65/raster65.c"); } + @Test + public void testMega65Dypp65() throws IOException, URISyntaxException { + compileAndCompare("examples/mega65/dypp65.c"); + } + @Test public void testAtariXlConioTest() throws IOException, URISyntaxException { compileAndCompare("examples/atarixl/conio-test.c"); diff --git a/src/test/kc/examples/mega65/camelot.png b/src/test/kc/examples/mega65/camelot.png new file mode 100644 index 000000000..2779cb598 Binary files /dev/null and b/src/test/kc/examples/mega65/camelot.png differ diff --git a/src/test/kc/examples/mega65/camelot.png.kra b/src/test/kc/examples/mega65/camelot.png.kra new file mode 100644 index 000000000..ba4069e4c Binary files /dev/null and b/src/test/kc/examples/mega65/camelot.png.kra differ diff --git a/src/test/kc/examples/mega65/dma-test5.c b/src/test/kc/examples/mega65/dma-test5.c new file mode 100644 index 000000000..5d0f1d5c9 --- /dev/null +++ b/src/test/kc/examples/mega65/dma-test5.c @@ -0,0 +1,14 @@ +// MEGA65 DMA test using memset +// Appendix J in https://mega.scryptos.com/sharefolder-link/MEGA/MEGA65+filehost/Docs/MEGA65-Book_draft.pdf +#pragma target(mega65) +#include +#include <6502.h> + +void main() { + // Map memory to BANK 0 : 0x00XXXX - giving access to I/O + memoryRemap(0,0,0); + // Fill screen up using DMA + memset_dma(DEFAULT_SCREEN, '*', 80*10); + + +} diff --git a/src/test/kc/examples/mega65/dma-test6.c b/src/test/kc/examples/mega65/dma-test6.c new file mode 100644 index 000000000..7239b0c6c --- /dev/null +++ b/src/test/kc/examples/mega65/dma-test6.c @@ -0,0 +1,12 @@ +// MEGA65 DMA test using memset +// Appendix J in https://mega.scryptos.com/sharefolder-link/MEGA/MEGA65+filehost/Docs/MEGA65-Book_draft.pdf +#pragma target(mega65) +#include +#include <6502.h> + +void main() { + // Map memory to BANK 0 : 0x00XXXX - giving access to I/O + memoryRemap(0,0,0); + // Fill screen up using 256MB DMA + memset_dma256(0, 0, DEFAULT_SCREEN, '*', 80*10); +} diff --git a/src/test/kc/examples/mega65/dypp65.c b/src/test/kc/examples/mega65/dypp65.c new file mode 100644 index 000000000..de5271270 --- /dev/null +++ b/src/test/kc/examples/mega65/dypp65.c @@ -0,0 +1,104 @@ +// DYPP (Different Y Pixel Position) LOGO created using DMA +// Graphics mode is 320x200 full-colour super extended attribute mode text-mode +// Character layout is column-wise giving linear addressing of the graphics (one byte per pixel) + +#pragma target(mega65) +#include +#include +#include <6502.h> +#include + +// The screen address (45*25*2=0x08ca bytes) +char * const SCREEN = 0x5000; +// The charset address (45*32*8=0x2d00 bytes) +char * const CHARSET = 0x6000; +// A logo in column-wide linear single-color memory layout +char LOGO[45*25*8] = kickasm(resource "camelot.png") {{ + .var pic = LoadPicture("camelot.png", List().add($ffffff, $000000)) + .for (var x=0;x<45; x++) + .for (var y=0; y<25*8; y++) + .byte pic.getSinglecolorByte(x,y) +}}; + +void main() { + // Avoid interrupts + SEI(); + // Map memory to BANK 0 : 0x00XXXX - giving access to I/O + memoryRemap(0,0,0); + // Set sideborder width=0, disable raster delay and hot registers + VICIV->SIDBDRWD_LO = 0; + VICIV->SIDBDRWD_HI = 0; + // Disable top/bottom borders + VICIV->TBDRPOS_LO = 0; + VICIV->TBDRPOS_HI = 0; + VICIV->BBDRPOS_LO = 0; + VICIV->BBDRPOS_HI = 2; + // Enable 48MHz fast mode + VICIV->CONTROLB |= 0x40; + VICIV->CONTROLC |= 0x40; + // Enable the VIC 4 + VICIV->KEY = 0x47; + VICIV->KEY = 0x53; + // Enable Super Extended Attribute Mode + VICIV->CONTROLC |= 1; + // Mode 40x25 chars - will be 45*25 when utilizing the borders + VICIV->CONTROLB &= 0x7f; + VICIV->CHARSTEP_LO = 90; + VICIV->CHARSTEP_HI = 0; + // Start text in the left border + VICIV->TEXTXPOS_LO = 40; + VICIV->TEXTXPOS_HI = 0; + // Set number of characters to display per row + VICIV->CHRCOUNT = 45; + // Set exact screen address + VICIV->SCRNPTR_LOLO = SCRNPTR_LOHI = >SCREEN; + VICIV->SCRNPTR_HILO = 0; + VICIV->SCRNPTR_HIHI = 0; + // Set exact charset address + VICIV->CHARPTR_LOLO = CHARPTR_LOHI = >CHARSET; + VICIV->CHARPTR_HILO = 0; + + // Enable Full-Colour Mode + //VICIV->CONTROLC |= 2|4; + + // Fill the screen with 0 + memset_dma(SCREEN, 0, 45*25*2); + // Fill the colours with WHITE - directly into $ff80000 + memset_dma256(0xff,0x08,0x0000, WHITE, 45*25*2); + // Fill the charset with 0x55 + memset_dma(CHARSET, 0x55, 45*32*8); + + // Extended screen (each char is an integer) + unsigned int *ESCREEN = SCREEN; + + // Fill extended screen to achieve column-wise linear addressing + unsigned int *erow = ESCREEN; + for(char r=0; r<25; r++) { + unsigned int c = r; + for(char i=0; i<45; i++) { + erow[i] = c; + c += 32; + } + erow += 45; + } + + // Copy the LOGO to the CHARSET + char* logo_dest = CHARSET; + char* logo_src = LOGO; + for(char col=0;col<45;col++) { + for(char y=0;y<25*8;y++) { + logo_dest[y] = logo_src[y]; + } + logo_dest += 32*8; + logo_src += 25*8; + } + + // Loop forever + for(;;) { + VICIV->BG_COLOR = VICII->RASTER; + } +} + + diff --git a/src/test/ref/examples/mega65/banked-music.log b/src/test/ref/examples/mega65/banked-music.log index 520731c19..7bc7ca46f 100644 --- a/src/test/ref/examples/mega65/banked-music.log +++ b/src/test/ref/examples/mega65/banked-music.log @@ -16,6 +16,15 @@ Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 Resolved forward reference MUSIC_END to MUSIC_END Resolved forward reference MUSIC to MUSIC Resolved forward reference upperCodeData to upperCodeData @@ -33,9 +42,12 @@ Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = > Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memcpy_dma_command Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = >&memcpy_dma_command4 Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memcpy_dma_command4 +Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = >&memset_dma_command +Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memset_dma_command Inlined call vicSelectGfxBank::$0 = call toDd00 vicSelectGfxBank::gfx Inlined call call __init Eliminating unused variable with no statement memcpy_dma_command +Eliminating unused variable with no statement memset_dma_command CONTROL FLOW GRAPH SSA diff --git a/src/test/ref/examples/mega65/dma-test2.log b/src/test/ref/examples/mega65/dma-test2.log index a81b12f09..f809579ce 100644 --- a/src/test/ref/examples/mega65/dma-test2.log +++ b/src/test/ref/examples/mega65/dma-test2.log @@ -15,6 +15,15 @@ Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 Fixing struct type size struct F018_DMAGIC to 17 Fixing struct type SIZE_OF struct F018_DMAGIC to 17 Fixing struct type SIZE_OF struct F018_DMAGIC to 17 @@ -22,8 +31,11 @@ Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = > Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memcpy_dma_command Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = >&memcpy_dma_command4 Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memcpy_dma_command4 +Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = >&memset_dma_command +Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memset_dma_command Inlined call vicSelectGfxBank::$0 = call toDd00 vicSelectGfxBank::gfx Eliminating unused variable with no statement memcpy_dma_command4 +Eliminating unused variable with no statement memset_dma_command CONTROL FLOW GRAPH SSA diff --git a/src/test/ref/examples/mega65/dma-test3.log b/src/test/ref/examples/mega65/dma-test3.log index 20dbbd241..c25f01e65 100644 --- a/src/test/ref/examples/mega65/dma-test3.log +++ b/src/test/ref/examples/mega65/dma-test3.log @@ -15,6 +15,15 @@ Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 Fixing struct type size struct F018_DMAGIC to 17 Fixing struct type SIZE_OF struct F018_DMAGIC to 17 Fixing struct type SIZE_OF struct F018_DMAGIC to 17 @@ -22,8 +31,11 @@ Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = > Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memcpy_dma_command Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = >&memcpy_dma_command4 Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memcpy_dma_command4 +Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = >&memset_dma_command +Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memset_dma_command Inlined call vicSelectGfxBank::$0 = call toDd00 vicSelectGfxBank::gfx Eliminating unused variable with no statement memcpy_dma_command +Eliminating unused variable with no statement memset_dma_command CONTROL FLOW GRAPH SSA diff --git a/src/test/ref/examples/mega65/dma-test4.log b/src/test/ref/examples/mega65/dma-test4.log index f54441d53..64c0cd90a 100644 --- a/src/test/ref/examples/mega65/dma-test4.log +++ b/src/test/ref/examples/mega65/dma-test4.log @@ -15,6 +15,15 @@ Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 Fixing struct type size struct F018_DMAGIC to 17 Fixing struct type SIZE_OF struct F018_DMAGIC to 17 Fixing struct type SIZE_OF struct F018_DMAGIC to 17 @@ -22,9 +31,12 @@ Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = > Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memcpy_dma_command Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = >&memcpy_dma_command4 Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memcpy_dma_command4 +Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = >&memset_dma_command +Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memset_dma_command Inlined call vicSelectGfxBank::$0 = call toDd00 vicSelectGfxBank::gfx Eliminating unused variable with no statement memcpy_dma_command Eliminating unused variable with no statement memcpy_dma_command4 +Eliminating unused variable with no statement memset_dma_command CONTROL FLOW GRAPH SSA diff --git a/src/test/ref/examples/mega65/dma-test5.asm b/src/test/ref/examples/mega65/dma-test5.asm new file mode 100644 index 000000000..17e5225c6 --- /dev/null +++ b/src/test/ref/examples/mega65/dma-test5.asm @@ -0,0 +1,149 @@ +// MEGA65 DMA test using memset +// Appendix J in https://mega.scryptos.com/sharefolder-link/MEGA/MEGA65+filehost/Docs/MEGA65-Book_draft.pdf +// Functions for using the F018 DMA for very fast copying or filling of memory +// MEGA65 Registers and Constants +// The MOS 6526 Complex Interface Adapter (CIA) +// http://archive.6502.org/datasheets/mos_6526_cia_recreated.pdf +.cpu _45gs02 + // MEGA65 platform PRG executable starting in MEGA65 mode. +.file [name="dma-test5.prg", type="prg", segments="Program"] +.segmentdef Program [segments="Basic, Code, Data"] +.segmentdef Basic [start=$2001] +.segmentdef Code [start=$2017] +.segmentdef Data [startAfter="Code"] +.segment Basic +.byte $0a, $20, $0a, $00, $fe, $02, $20, $30, $00 // 10 BANK 0 +.byte $15, $20, $14, $00, $9e, $20 // 20 SYS +.text toIntString(main) // NNNN +.byte $00, $00, $00 // + // DMA command fill + .const DMA_COMMAND_FILL = 3 + .const OFFSET_STRUCT_F018_DMAGIC_EN018B = 3 + .const OFFSET_STRUCT_DMA_LIST_F018B_COUNT = 1 + .const OFFSET_STRUCT_DMA_LIST_F018B_SRC = 3 + .const OFFSET_STRUCT_DMA_LIST_F018B_DEST = 6 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1 + // DMAgic F018 Controller + .label DMA = $d700 + // Default address of screen character matrix + .label DEFAULT_SCREEN = $800 +.segment Code +main: { + // memoryRemap(0,0,0) + // Map memory to BANK 0 : 0x00XXXX - giving access to I/O + jsr memoryRemap + // memset_dma(DEFAULT_SCREEN, '*', 80*10) + // Fill screen up using DMA + jsr memset_dma + // } + rts +} +// Remap some of the eight 8K memory blocks in the 64K address space of the 6502 to point somewhere else in the first 1MB memory space of the MEGA65. +// After the remapping the CPU will access the mapped memory whenever it uses instructions that access a remapped block. +// See section 2.3.4 in http://www.zimmers.net/cbmpics/cbm/c65/c65manual.txt for a description of the CPU memory remapper of the C65. +// remapBlocks: Indicates which 8K blocks of the 6502 address space to remap. Each bit represents one 8K block +// - bit 0 Memory block $0000-$1fff. Use constant MEMORYBLOCK_0000. +// - bit 1 Memory block $2000-$3fff. Use constant MEMORYBLOCK_2000. +// - bit 2 Memory block $4000-$5fff. Use constant MEMORYBLOCK_4000. +// - bit 3 Memory block $6000-$7fff. Use constant MEMORYBLOCK_6000. +// - bit 4 Memory block $8000-$9fff. Use constant MEMORYBLOCK_8000. +// - bit 5 Memory block $a000-$bfff. Use constant MEMORYBLOCK_A000. +// - bit 6 Memory block $c000-$dfff. Use constant MEMORYBLOCK_C000. +// - bit 7 Memory block $e000-$ffff. Use constant MEMORYBLOCK_E000. +// lowerPageOffset: Offset that will be added to any remapped blocks in the lower 32K of memory (block 0-3). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 0 ($0000-$1fff) is remapped it will point to lowerPageOffset*$100. +// - If block 1 ($2000-$3fff) is remapped it will point to lowerPageOffset*$100 + $2000. +// - If block 2 ($4000-$5fff) is remapped it will point to lowerPageOffset*$100 + $4000. +// - If block 3 ($6000-$7fff) is remapped it will point to lowerPageOffset*$100 + $6000. +// upperPageOffset: Offset that will be added to any remapped blocks in the upper 32K of memory (block 4-7). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 4 ($8000-$9fff) is remapped it will point to upperPageOffset*$100 + $8000 +// - If block 5 ($a000-$bfff) is remapped it will point to upperPageOffset*$100 + $a000. +// - If block 6 ($c000-$dfff) is remapped it will point to upperPageOffset*$100 + $c000. +// - If block 7 ($e000-$ffff) is remapped it will point to upperPageOffset*$100 + $e000. +memoryRemap: { + .label aVal = $fc + .label xVal = $fd + .label yVal = $fe + .label zVal = $ff + // *aVal = lowerPageOffset & 0xf) + sta xVal + // *yVal = upperPageOffset & 0xf) + sta zVal + // asm + lda aVal + ldx xVal + ldy yVal + ldz zVal + map + eom + // } + rts +} +// Fill a memory block within the first 64K memory space using MEGA65 DMagic DMA +// Fills the values of num bytes at the destination with a single byte value. +// - dest The destination address (within the MB and bank) +// - fill The char to fill with +// - num The number of bytes to copy +memset_dma: { + .const fill = '*' + .const num = $50*$a + .label dest = DEFAULT_SCREEN + // dmaMode = DMA->EN018B + // Remember current F018 A/B mode + ldx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // memset_dma_command.count = num + // Set up command + lda #num + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT+1 + // memset_dma_command.src = (char*)fill + lda #fill + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC+1 + // memset_dma_command.dest = dest + lda #dest + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST+1 + // DMA->EN018B = 1 + // Set F018B mode + lda #1 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // DMA->ADDRMB = 0 + // Set address of DMA list + lda #0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB + // DMA->ADDRBANK = 0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK + // DMA-> ADDRMSB = >&memset_dma_command + lda #>memset_dma_command + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB + // DMA-> ADDRLSBTRIG = <&memset_dma_command + // Trigger the DMA (without option lists) + lda #EN018B = dmaMode + // Re-enable F018A mode + stx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // } + rts +} +.segment Data + // DMA list entry for filling data + memset_dma_command: .byte DMA_COMMAND_FILL + .word 0, 0 + .byte 0 + .word 0 + .byte 0, 0 + .word 0 diff --git a/src/test/ref/examples/mega65/dma-test5.cfg b/src/test/ref/examples/mega65/dma-test5.cfg new file mode 100644 index 000000000..10344e3bb --- /dev/null +++ b/src/test/ref/examples/mega65/dma-test5.cfg @@ -0,0 +1,42 @@ + +void main() +main: scope:[main] from + [0] phi() + [1] call memoryRemap + to:main::@1 +main::@1: scope:[main] from main + [2] phi() + [3] call memset_dma + to:main::@return +main::@return: scope:[main] from main::@1 + [4] return + to:@return + +void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset) +memoryRemap: scope:[memoryRemap] from main + [5] *memoryRemap::aVal = 0 + [6] *memoryRemap::xVal = 0 + [7] *memoryRemap::yVal = 0 + [8] *memoryRemap::zVal = 0 + asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + to:memoryRemap::@return +memoryRemap::@return: scope:[memoryRemap] from memoryRemap + [10] return + to:@return + +void memset_dma(void* memset_dma::dest , byte memset_dma::fill , word memset_dma::num) +memset_dma: scope:[memset_dma] from main::@1 + [11] memset_dma::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) + [12] *((word*)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma::num#0 + [13] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma::fill#0 + [14] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma::dest#0 + [15] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 + [16] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 + [17] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 + [18] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >&memset_dma_command + [19] *((byte*)DMA) = <&memset_dma_command + [20] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = memset_dma::dmaMode#0 + to:memset_dma::@return +memset_dma::@return: scope:[memset_dma] from memset_dma + [21] return + to:@return diff --git a/src/test/ref/examples/mega65/dma-test5.log b/src/test/ref/examples/mega65/dma-test5.log new file mode 100644 index 000000000..0a71f0a84 --- /dev/null +++ b/src/test/ref/examples/mega65/dma-test5.log @@ -0,0 +1,858 @@ +Resolved forward reference memcpy_dma_command to memcpy_dma_command +Resolved forward reference memcpy_dma_command to memcpy_dma_command +Resolved forward reference memcpy_dma_command to memcpy_dma_command +Resolved forward reference memcpy_dma_command to memcpy_dma_command +Resolved forward reference memcpy_dma_command to memcpy_dma_command +Resolved forward reference memcpy_dma_command4 to memcpy_dma_command4 +Resolved forward reference memcpy_dma_command4 to memcpy_dma_command4 +Resolved forward reference memcpy_dma_command4 to memcpy_dma_command4 +Resolved forward reference memcpy_dma_command4 to memcpy_dma_command4 +Resolved forward reference memcpy_dma_command4 to memcpy_dma_command4 +Resolved forward reference memcpy_dma_command4 to memcpy_dma_command4 +Resolved forward reference memcpy_dma_command4 to memcpy_dma_command4 +Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 +Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 +Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 +Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 +Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Fixing struct type size struct F018_DMAGIC to 17 +Fixing struct type SIZE_OF struct F018_DMAGIC to 17 +Fixing struct type SIZE_OF struct F018_DMAGIC to 17 +Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = >&memcpy_dma_command +Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memcpy_dma_command +Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = >&memcpy_dma_command4 +Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memcpy_dma_command4 +Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = >&memset_dma_command +Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memset_dma_command +Inlined call vicSelectGfxBank::$0 = call toDd00 vicSelectGfxBank::gfx +Eliminating unused variable with no statement memcpy_dma_command +Eliminating unused variable with no statement memcpy_dma_command4 + +CONTROL FLOW GRAPH SSA + +void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset) +memoryRemap: scope:[memoryRemap] from main + memoryRemap::upperPageOffset#1 = phi( main/memoryRemap::upperPageOffset#0 ) + memoryRemap::remapBlocks#1 = phi( main/memoryRemap::remapBlocks#0 ) + memoryRemap::lowerPageOffset#1 = phi( main/memoryRemap::lowerPageOffset#0 ) + memoryRemap::$0 = < memoryRemap::lowerPageOffset#1 + *memoryRemap::aVal = memoryRemap::$0 + memoryRemap::$1 = memoryRemap::remapBlocks#1 << 4 + memoryRemap::$2 = > memoryRemap::lowerPageOffset#1 + memoryRemap::$3 = memoryRemap::$2 & $f + memoryRemap::$4 = memoryRemap::$1 | memoryRemap::$3 + *memoryRemap::xVal = memoryRemap::$4 + memoryRemap::$5 = < memoryRemap::upperPageOffset#1 + *memoryRemap::yVal = memoryRemap::$5 + memoryRemap::$6 = memoryRemap::remapBlocks#1 & $f0 + memoryRemap::$7 = > memoryRemap::upperPageOffset#1 + memoryRemap::$8 = memoryRemap::$7 & $f + memoryRemap::$9 = memoryRemap::$6 | memoryRemap::$8 + *memoryRemap::zVal = memoryRemap::$9 + asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + to:memoryRemap::@return +memoryRemap::@return: scope:[memoryRemap] from memoryRemap + return + to:@return + +void memset_dma(void* memset_dma::dest , byte memset_dma::fill , word memset_dma::num) +memset_dma: scope:[memset_dma] from main::@1 + memset_dma::dest#1 = phi( main::@1/memset_dma::dest#0 ) + memset_dma::fill#1 = phi( main::@1/memset_dma::fill#0 ) + memset_dma::num#1 = phi( main::@1/memset_dma::num#0 ) + memset_dma::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) + *((word*)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma::num#1 + *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma::fill#1 + *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = ((byte*)) memset_dma::dest#1 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >&memset_dma_command + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRLSBTRIG) = <&memset_dma_command + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = memset_dma::dmaMode#0 + to:memset_dma::@return +memset_dma::@return: scope:[memset_dma] from memset_dma + return + to:@return + +void main() +main: scope:[main] from __start + memoryRemap::remapBlocks#0 = 0 + memoryRemap::lowerPageOffset#0 = 0 + memoryRemap::upperPageOffset#0 = 0 + call memoryRemap + to:main::@1 +main::@1: scope:[main] from main + memset_dma::dest#0 = (void*)DEFAULT_SCREEN + memset_dma::fill#0 = '*' + memset_dma::num#0 = $50*$a + call memset_dma + to:main::@2 +main::@2: scope:[main] from main::@1 + to:main::@return +main::@return: scope:[main] from main::@2 + return + to:@return + +void __start() +__start: scope:[__start] from + call main + to:__start::@1 +__start::@1: scope:[__start] from __start + to:__start::@return +__start::@return: scope:[__start] from __start::@1 + return + to:@return + +SYMBOL TABLE SSA +const nomodify byte* DEFAULT_SCREEN = (byte*)$800 +const nomodify struct F018_DMAGIC* DMA = (struct F018_DMAGIC*)$d700 +const nomodify byte DMA_COMMAND_FILL = 3 +const byte OFFSET_STRUCT_DMA_LIST_F018B_COUNT = 1 +const byte OFFSET_STRUCT_DMA_LIST_F018B_DEST = 6 +const byte OFFSET_STRUCT_DMA_LIST_F018B_SRC = 3 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRLSBTRIG = 0 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1 +const byte OFFSET_STRUCT_F018_DMAGIC_EN018B = 3 +void __start() +void main() +void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset) +byte~ memoryRemap::$0 +byte~ memoryRemap::$1 +byte~ memoryRemap::$2 +number~ memoryRemap::$3 +number~ memoryRemap::$4 +byte~ memoryRemap::$5 +number~ memoryRemap::$6 +byte~ memoryRemap::$7 +number~ memoryRemap::$8 +number~ memoryRemap::$9 +const byte* memoryRemap::aVal = (byte*)$fc +word memoryRemap::lowerPageOffset +word memoryRemap::lowerPageOffset#0 +word memoryRemap::lowerPageOffset#1 +byte memoryRemap::remapBlocks +byte memoryRemap::remapBlocks#0 +byte memoryRemap::remapBlocks#1 +word memoryRemap::upperPageOffset +word memoryRemap::upperPageOffset#0 +word memoryRemap::upperPageOffset#1 +const byte* memoryRemap::xVal = (byte*)$fd +const byte* memoryRemap::yVal = (byte*)$fe +const byte* memoryRemap::zVal = (byte*)$ff +void memset_dma(void* memset_dma::dest , byte memset_dma::fill , word memset_dma::num) +void* memset_dma::dest +void* memset_dma::dest#0 +void* memset_dma::dest#1 +byte memset_dma::dmaMode +byte memset_dma::dmaMode#0 +byte memset_dma::fill +byte memset_dma::fill#0 +byte memset_dma::fill#1 +word memset_dma::num +word memset_dma::num#0 +word memset_dma::num#1 +struct DMA_LIST_F018B memset_dma_command loadstore = { command: DMA_COMMAND_FILL, count: 0, src: (byte*)0, src_bank: 0, dest: (byte*)0, dest_bank: 0, sub_command: 0, modulo: 0 } + +Adding number conversion cast (unumber) 4 in memoryRemap::$1 = memoryRemap::remapBlocks#1 << 4 +Adding number conversion cast (unumber) $f in memoryRemap::$3 = memoryRemap::$2 & $f +Adding number conversion cast (unumber) memoryRemap::$3 in memoryRemap::$3 = memoryRemap::$2 & (unumber)$f +Adding number conversion cast (unumber) memoryRemap::$4 in memoryRemap::$4 = memoryRemap::$1 | memoryRemap::$3 +Adding number conversion cast (unumber) $f0 in memoryRemap::$6 = memoryRemap::remapBlocks#1 & $f0 +Adding number conversion cast (unumber) memoryRemap::$6 in memoryRemap::$6 = memoryRemap::remapBlocks#1 & (unumber)$f0 +Adding number conversion cast (unumber) $f in memoryRemap::$8 = memoryRemap::$7 & $f +Adding number conversion cast (unumber) memoryRemap::$8 in memoryRemap::$8 = memoryRemap::$7 & (unumber)$f +Adding number conversion cast (unumber) memoryRemap::$9 in memoryRemap::$9 = memoryRemap::$6 | memoryRemap::$8 +Adding number conversion cast (unumber) 1 in *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 +Adding number conversion cast (unumber) 0 in *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 +Adding number conversion cast (unumber) 0 in *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 +Adding number conversion cast (unumber) 0 in memoryRemap::remapBlocks#0 = 0 +Adding number conversion cast (unumber) 0 in memoryRemap::lowerPageOffset#0 = 0 +Adding number conversion cast (unumber) 0 in memoryRemap::upperPageOffset#0 = 0 +Adding number conversion cast (unumber) $50*$a in memset_dma::num#0 = $50*$a +Successful SSA optimization PassNAddNumberTypeConversions +Inlining cast *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma::dest#1 +Inlining cast *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = (unumber)1 +Inlining cast *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = (unumber)0 +Inlining cast *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = (unumber)0 +Inlining cast memoryRemap::remapBlocks#0 = (unumber)0 +Inlining cast memoryRemap::lowerPageOffset#0 = (unumber)0 +Inlining cast memoryRemap::upperPageOffset#0 = (unumber)0 +Inlining cast memset_dma::num#0 = (unumber)$50*$a +Successful SSA optimization Pass2InlineCast +Simplifying constant pointer cast (byte*) 252 +Simplifying constant pointer cast (byte*) 253 +Simplifying constant pointer cast (byte*) 254 +Simplifying constant pointer cast (byte*) 255 +Simplifying constant pointer cast (struct F018_DMAGIC*) 55040 +Simplifying constant pointer cast (byte*) 2048 +Simplifying constant pointer cast (byte*) 0 +Simplifying constant pointer cast (byte*) 0 +Simplifying constant integer cast 4 +Simplifying constant integer cast $f +Simplifying constant integer cast $f0 +Simplifying constant integer cast $f +Simplifying constant integer cast 1 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Successful SSA optimization PassNCastSimplification +Finalized unsigned number type 4 +Finalized unsigned number type $f +Finalized unsigned number type $f0 +Finalized unsigned number type $f +Finalized unsigned number type 1 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Successful SSA optimization PassNFinalizeNumberTypeConversions +Inferred type updated to byte in memoryRemap::$3 = memoryRemap::$2 & $f +Inferred type updated to byte in memoryRemap::$4 = memoryRemap::$1 | memoryRemap::$3 +Inferred type updated to byte in memoryRemap::$6 = memoryRemap::remapBlocks#1 & $f0 +Inferred type updated to byte in memoryRemap::$8 = memoryRemap::$7 & $f +Inferred type updated to byte in memoryRemap::$9 = memoryRemap::$6 | memoryRemap::$8 +Identical Phi Values memoryRemap::lowerPageOffset#1 memoryRemap::lowerPageOffset#0 +Identical Phi Values memoryRemap::remapBlocks#1 memoryRemap::remapBlocks#0 +Identical Phi Values memoryRemap::upperPageOffset#1 memoryRemap::upperPageOffset#0 +Identical Phi Values memset_dma::num#1 memset_dma::num#0 +Identical Phi Values memset_dma::fill#1 memset_dma::fill#0 +Identical Phi Values memset_dma::dest#1 memset_dma::dest#0 +Successful SSA optimization Pass2IdenticalPhiElimination +Constant right-side identified [35] memset_dma::num#0 = (unumber)$50*$a +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant memoryRemap::remapBlocks#0 = 0 +Constant memoryRemap::lowerPageOffset#0 = 0 +Constant memoryRemap::upperPageOffset#0 = 0 +Constant memset_dma::dest#0 = (void*)DEFAULT_SCREEN +Constant memset_dma::fill#0 = '*' +Constant memset_dma::num#0 = (unumber)$50*$a +Successful SSA optimization Pass2ConstantIdentification +Constant value identified (byte*)memset_dma::fill#0 in [20] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma::fill#0 +Constant value identified (byte*)memset_dma::dest#0 in [21] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma::dest#0 +Successful SSA optimization Pass2ConstantValues +Simplifying expression containing zero (byte*)DMA in [26] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRLSBTRIG) = <&memset_dma_command +Successful SSA optimization PassNSimplifyExpressionWithZero +Eliminating unused constant OFFSET_STRUCT_F018_DMAGIC_ADDRLSBTRIG +Successful SSA optimization PassNEliminateUnusedVars +Removing unused procedure __start +Removing unused procedure block __start +Removing unused procedure block __start::@1 +Removing unused procedure block __start::@return +Successful SSA optimization PassNEliminateEmptyStart +Constant right-side identified [0] memoryRemap::$0 = < memoryRemap::lowerPageOffset#0 +Constant right-side identified [2] memoryRemap::$1 = memoryRemap::remapBlocks#0 << 4 +Constant right-side identified [3] memoryRemap::$2 = > memoryRemap::lowerPageOffset#0 +Constant right-side identified [7] memoryRemap::$5 = < memoryRemap::upperPageOffset#0 +Constant right-side identified [9] memoryRemap::$6 = memoryRemap::remapBlocks#0 & $f0 +Constant right-side identified [10] memoryRemap::$7 = > memoryRemap::upperPageOffset#0 +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant memoryRemap::$0 = memoryRemap::lowerPageOffset#0 +Constant memoryRemap::$5 = memoryRemap::upperPageOffset#0 +Successful SSA optimization Pass2ConstantIdentification +Simplifying constant evaluating to zero memoryRemap::lowerPageOffset#0 in +Simplifying constant evaluating to zero memoryRemap::upperPageOffset#0 in +Successful SSA optimization PassNSimplifyConstantZero +Simplifying expression containing zero memoryRemap::$3 in [5] memoryRemap::$4 = memoryRemap::$1 | memoryRemap::$3 +Simplifying expression containing zero memoryRemap::$8 in [12] memoryRemap::$9 = memoryRemap::$6 | memoryRemap::$8 +Successful SSA optimization PassNSimplifyExpressionWithZero +Eliminating unused constant memoryRemap::remapBlocks#0 +Eliminating unused constant memoryRemap::lowerPageOffset#0 +Eliminating unused constant memoryRemap::upperPageOffset#0 +Eliminating unused constant memoryRemap::$1 +Eliminating unused constant memoryRemap::$6 +Successful SSA optimization PassNEliminateUnusedVars +Alias memoryRemap::$4 = memoryRemap::$3 +Alias memoryRemap::$9 = memoryRemap::$8 +Successful SSA optimization Pass2AliasElimination +Constant right-side identified [1] memoryRemap::$4 = memoryRemap::$2 & $f +Constant right-side identified [4] memoryRemap::$9 = memoryRemap::$7 & $f +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant memoryRemap::$4 = memoryRemap::$2&$f +Constant memoryRemap::$9 = memoryRemap::$7&$f +Successful SSA optimization Pass2ConstantIdentification +Simplifying constant evaluating to zero memoryRemap::$2&$f in +Simplifying constant evaluating to zero memoryRemap::$7&$f in +Successful SSA optimization PassNSimplifyConstantZero +Eliminating unused constant memoryRemap::$2 +Eliminating unused constant memoryRemap::$7 +Successful SSA optimization PassNEliminateUnusedVars +Constant inlined memoryRemap::$4 = 0 +Constant inlined memoryRemap::$5 = 0 +Constant inlined memoryRemap::$0 = 0 +Constant inlined memoryRemap::$9 = 0 +Successful SSA optimization Pass2ConstantInlining +Adding NOP phi() at start of main +Adding NOP phi() at start of main::@1 +Adding NOP phi() at start of main::@2 +CALL GRAPH +Calls in [main] to memoryRemap:1 memset_dma:3 + +Created 0 initial phi equivalence classes +Coalesced down to 0 phi equivalence classes +Culled Empty Block label main::@2 +Adding NOP phi() at start of main +Adding NOP phi() at start of main::@1 + +FINAL CONTROL FLOW GRAPH + +void main() +main: scope:[main] from + [0] phi() + [1] call memoryRemap + to:main::@1 +main::@1: scope:[main] from main + [2] phi() + [3] call memset_dma + to:main::@return +main::@return: scope:[main] from main::@1 + [4] return + to:@return + +void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset) +memoryRemap: scope:[memoryRemap] from main + [5] *memoryRemap::aVal = 0 + [6] *memoryRemap::xVal = 0 + [7] *memoryRemap::yVal = 0 + [8] *memoryRemap::zVal = 0 + asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + to:memoryRemap::@return +memoryRemap::@return: scope:[memoryRemap] from memoryRemap + [10] return + to:@return + +void memset_dma(void* memset_dma::dest , byte memset_dma::fill , word memset_dma::num) +memset_dma: scope:[memset_dma] from main::@1 + [11] memset_dma::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) + [12] *((word*)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma::num#0 + [13] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma::fill#0 + [14] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma::dest#0 + [15] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 + [16] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 + [17] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 + [18] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >&memset_dma_command + [19] *((byte*)DMA) = <&memset_dma_command + [20] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = memset_dma::dmaMode#0 + to:memset_dma::@return +memset_dma::@return: scope:[memset_dma] from memset_dma + [21] return + to:@return + + +VARIABLE REGISTER WEIGHTS +void main() +void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset) +word memoryRemap::lowerPageOffset +byte memoryRemap::remapBlocks +word memoryRemap::upperPageOffset +void memset_dma(void* memset_dma::dest , byte memset_dma::fill , word memset_dma::num) +void* memset_dma::dest +byte memset_dma::dmaMode +byte memset_dma::dmaMode#0 2.4444444444444446 +byte memset_dma::fill +word memset_dma::num +struct DMA_LIST_F018B memset_dma_command loadstore = { command: DMA_COMMAND_FILL, count: 0, src: (byte*) 0, src_bank: 0, dest: (byte*) 0, dest_bank: 0, sub_command: 0, modulo: 0 } + +Initial phi equivalence classes +Added variable memset_dma::dmaMode#0 to live range equivalence class [ memset_dma::dmaMode#0 ] +Added variable memset_dma_command to live range equivalence class [ memset_dma_command ] +Complete equivalence classes +[ memset_dma::dmaMode#0 ] +[ memset_dma_command ] +Allocated zp[1]:2 [ memset_dma::dmaMode#0 ] +Allocated mem[12] [ memset_dma_command ] +REGISTER UPLIFT POTENTIAL REGISTERS +Statement [5] *memoryRemap::aVal = 0 [ ] ( memoryRemap:1 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [6] *memoryRemap::xVal = 0 [ ] ( memoryRemap:1 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [7] *memoryRemap::yVal = 0 [ ] ( memoryRemap:1 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [8] *memoryRemap::zVal = 0 [ ] ( memoryRemap:1 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } always clobbers reg byte a reg byte x reg byte y reg byte z +Statement [12] *((word*)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma::num#0 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:3 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:2 [ memset_dma::dmaMode#0 ] +Statement [13] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma::fill#0 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:3 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [14] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma::dest#0 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:3 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [15] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:3 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [16] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:3 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [17] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:3 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [18] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >&memset_dma_command [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:3 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [19] *((byte*)DMA) = <&memset_dma_command [ memset_dma::dmaMode#0 ] ( memset_dma:3 [ memset_dma::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [5] *memoryRemap::aVal = 0 [ ] ( memoryRemap:1 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [6] *memoryRemap::xVal = 0 [ ] ( memoryRemap:1 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [7] *memoryRemap::yVal = 0 [ ] ( memoryRemap:1 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [8] *memoryRemap::zVal = 0 [ ] ( memoryRemap:1 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } always clobbers reg byte a reg byte x reg byte y reg byte z +Statement [12] *((word*)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma::num#0 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:3 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [13] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma::fill#0 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:3 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [14] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma::dest#0 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:3 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [15] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:3 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [16] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:3 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [17] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:3 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [18] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >&memset_dma_command [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:3 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [19] *((byte*)DMA) = <&memset_dma_command [ memset_dma::dmaMode#0 ] ( memset_dma:3 [ memset_dma::dmaMode#0 ] { } ) always clobbers reg byte a +Potential registers zp[1]:2 [ memset_dma::dmaMode#0 ] : zp[1]:2 , reg byte x , reg byte y , reg byte z , +Potential registers mem[12] [ memset_dma_command ] : mem[12] , + +REGISTER UPLIFT SCOPES +Uplift Scope [memset_dma] 2.44: zp[1]:2 [ memset_dma::dmaMode#0 ] +Uplift Scope [MOS6526_CIA] +Uplift Scope [MOS6569_VICII] +Uplift Scope [MOS6581_SID] +Uplift Scope [MOS4569_VICIII] +Uplift Scope [MEGA65_VICIV] +Uplift Scope [memoryRemap] +Uplift Scope [F018_DMAGIC] +Uplift Scope [DMA_LIST_F018A] +Uplift Scope [DMA_LIST_F018B] +Uplift Scope [main] +Uplift Scope [] 0: mem[12] [ memset_dma_command ] + +Uplifting [memset_dma] best 159 combination reg byte x [ memset_dma::dmaMode#0 ] +Uplifting [MOS6526_CIA] best 159 combination +Uplifting [MOS6569_VICII] best 159 combination +Uplifting [MOS6581_SID] best 159 combination +Uplifting [MOS4569_VICIII] best 159 combination +Uplifting [MEGA65_VICIV] best 159 combination +Uplifting [memoryRemap] best 159 combination +Uplifting [F018_DMAGIC] best 159 combination +Uplifting [DMA_LIST_F018A] best 159 combination +Uplifting [DMA_LIST_F018B] best 159 combination +Uplifting [main] best 159 combination +Uplifting [] best 159 combination mem[12] [ memset_dma_command ] + +ASSEMBLER BEFORE OPTIMIZATION + // File Comments +// MEGA65 DMA test using memset +// Appendix J in https://mega.scryptos.com/sharefolder-link/MEGA/MEGA65+filehost/Docs/MEGA65-Book_draft.pdf +// Functions for using the F018 DMA for very fast copying or filling of memory +// MEGA65 Registers and Constants +// The MOS 6526 Complex Interface Adapter (CIA) +// http://archive.6502.org/datasheets/mos_6526_cia_recreated.pdf + // Upstart +.cpu _45gs02 + // MEGA65 platform PRG executable starting in MEGA65 mode. +.file [name="dma-test5.prg", type="prg", segments="Program"] +.segmentdef Program [segments="Basic, Code, Data"] +.segmentdef Basic [start=$2001] +.segmentdef Code [start=$2017] +.segmentdef Data [startAfter="Code"] +.segment Basic +.byte $0a, $20, $0a, $00, $fe, $02, $20, $30, $00 // 10 BANK 0 +.byte $15, $20, $14, $00, $9e, $20 // 20 SYS +.text toIntString(main) // NNNN +.byte $00, $00, $00 // + // Global Constants & labels + // DMA command fill + .const DMA_COMMAND_FILL = 3 + .const OFFSET_STRUCT_F018_DMAGIC_EN018B = 3 + .const OFFSET_STRUCT_DMA_LIST_F018B_COUNT = 1 + .const OFFSET_STRUCT_DMA_LIST_F018B_SRC = 3 + .const OFFSET_STRUCT_DMA_LIST_F018B_DEST = 6 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1 + // DMAgic F018 Controller + .label DMA = $d700 + // Default address of screen character matrix + .label DEFAULT_SCREEN = $800 +.segment Code + // main +main: { + // [1] call memoryRemap + // Map memory to BANK 0 : 0x00XXXX - giving access to I/O + jsr memoryRemap + // [2] phi from main to main::@1 [phi:main->main::@1] + __b1_from_main: + jmp __b1 + // main::@1 + __b1: + // [3] call memset_dma + // Fill screen up using DMA + jsr memset_dma + jmp __breturn + // main::@return + __breturn: + // [4] return + rts +} + // memoryRemap +// Remap some of the eight 8K memory blocks in the 64K address space of the 6502 to point somewhere else in the first 1MB memory space of the MEGA65. +// After the remapping the CPU will access the mapped memory whenever it uses instructions that access a remapped block. +// See section 2.3.4 in http://www.zimmers.net/cbmpics/cbm/c65/c65manual.txt for a description of the CPU memory remapper of the C65. +// remapBlocks: Indicates which 8K blocks of the 6502 address space to remap. Each bit represents one 8K block +// - bit 0 Memory block $0000-$1fff. Use constant MEMORYBLOCK_0000. +// - bit 1 Memory block $2000-$3fff. Use constant MEMORYBLOCK_2000. +// - bit 2 Memory block $4000-$5fff. Use constant MEMORYBLOCK_4000. +// - bit 3 Memory block $6000-$7fff. Use constant MEMORYBLOCK_6000. +// - bit 4 Memory block $8000-$9fff. Use constant MEMORYBLOCK_8000. +// - bit 5 Memory block $a000-$bfff. Use constant MEMORYBLOCK_A000. +// - bit 6 Memory block $c000-$dfff. Use constant MEMORYBLOCK_C000. +// - bit 7 Memory block $e000-$ffff. Use constant MEMORYBLOCK_E000. +// lowerPageOffset: Offset that will be added to any remapped blocks in the lower 32K of memory (block 0-3). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 0 ($0000-$1fff) is remapped it will point to lowerPageOffset*$100. +// - If block 1 ($2000-$3fff) is remapped it will point to lowerPageOffset*$100 + $2000. +// - If block 2 ($4000-$5fff) is remapped it will point to lowerPageOffset*$100 + $4000. +// - If block 3 ($6000-$7fff) is remapped it will point to lowerPageOffset*$100 + $6000. +// upperPageOffset: Offset that will be added to any remapped blocks in the upper 32K of memory (block 4-7). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 4 ($8000-$9fff) is remapped it will point to upperPageOffset*$100 + $8000 +// - If block 5 ($a000-$bfff) is remapped it will point to upperPageOffset*$100 + $a000. +// - If block 6 ($c000-$dfff) is remapped it will point to upperPageOffset*$100 + $c000. +// - If block 7 ($e000-$ffff) is remapped it will point to upperPageOffset*$100 + $e000. +memoryRemap: { + .label aVal = $fc + .label xVal = $fd + .label yVal = $fe + .label zVal = $ff + // [5] *memoryRemap::aVal = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta aVal + // [6] *memoryRemap::xVal = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta xVal + // [7] *memoryRemap::yVal = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta yVal + // [8] *memoryRemap::zVal = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta zVal + // asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + lda aVal + ldx xVal + ldy yVal + ldz zVal + map + eom + jmp __breturn + // memoryRemap::@return + __breturn: + // [10] return + rts +} + // memset_dma +// Fill a memory block within the first 64K memory space using MEGA65 DMagic DMA +// Fills the values of num bytes at the destination with a single byte value. +// - dest The destination address (within the MB and bank) +// - fill The char to fill with +// - num The number of bytes to copy +memset_dma: { + .const fill = '*' + .const num = $50*$a + .label dest = DEFAULT_SCREEN + // [11] memset_dma::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) -- vbuxx=_deref_pbuc1 + // Remember current F018 A/B mode + ldx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // [12] *((word*)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma::num#0 -- _deref_pwuc1=vwuc2 + // Set up command + lda #num + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT+1 + // [13] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma::fill#0 -- _deref_qbuc1=pbuc2 + lda #fill + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC+1 + // [14] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma::dest#0 -- _deref_qbuc1=pbuc2 + lda #dest + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST+1 + // [15] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 -- _deref_pbuc1=vbuc2 + // Set F018B mode + lda #1 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // [16] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 -- _deref_pbuc1=vbuc2 + // Set address of DMA list + lda #0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB + // [17] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK + // [18] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >&memset_dma_command -- _deref_pbuc1=vbuc2 + lda #>memset_dma_command + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB + // [19] *((byte*)DMA) = <&memset_dma_command -- _deref_pbuc1=vbuc2 + // Trigger the DMA (without option lists) + lda #main::@1] + // main::@1 + // memset_dma(DEFAULT_SCREEN, '*', 80*10) + // [3] call memset_dma + // Fill screen up using DMA + jsr memset_dma + // main::@return + // } + // [4] return + rts +} + // memoryRemap +// Remap some of the eight 8K memory blocks in the 64K address space of the 6502 to point somewhere else in the first 1MB memory space of the MEGA65. +// After the remapping the CPU will access the mapped memory whenever it uses instructions that access a remapped block. +// See section 2.3.4 in http://www.zimmers.net/cbmpics/cbm/c65/c65manual.txt for a description of the CPU memory remapper of the C65. +// remapBlocks: Indicates which 8K blocks of the 6502 address space to remap. Each bit represents one 8K block +// - bit 0 Memory block $0000-$1fff. Use constant MEMORYBLOCK_0000. +// - bit 1 Memory block $2000-$3fff. Use constant MEMORYBLOCK_2000. +// - bit 2 Memory block $4000-$5fff. Use constant MEMORYBLOCK_4000. +// - bit 3 Memory block $6000-$7fff. Use constant MEMORYBLOCK_6000. +// - bit 4 Memory block $8000-$9fff. Use constant MEMORYBLOCK_8000. +// - bit 5 Memory block $a000-$bfff. Use constant MEMORYBLOCK_A000. +// - bit 6 Memory block $c000-$dfff. Use constant MEMORYBLOCK_C000. +// - bit 7 Memory block $e000-$ffff. Use constant MEMORYBLOCK_E000. +// lowerPageOffset: Offset that will be added to any remapped blocks in the lower 32K of memory (block 0-3). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 0 ($0000-$1fff) is remapped it will point to lowerPageOffset*$100. +// - If block 1 ($2000-$3fff) is remapped it will point to lowerPageOffset*$100 + $2000. +// - If block 2 ($4000-$5fff) is remapped it will point to lowerPageOffset*$100 + $4000. +// - If block 3 ($6000-$7fff) is remapped it will point to lowerPageOffset*$100 + $6000. +// upperPageOffset: Offset that will be added to any remapped blocks in the upper 32K of memory (block 4-7). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 4 ($8000-$9fff) is remapped it will point to upperPageOffset*$100 + $8000 +// - If block 5 ($a000-$bfff) is remapped it will point to upperPageOffset*$100 + $a000. +// - If block 6 ($c000-$dfff) is remapped it will point to upperPageOffset*$100 + $c000. +// - If block 7 ($e000-$ffff) is remapped it will point to upperPageOffset*$100 + $e000. +memoryRemap: { + .label aVal = $fc + .label xVal = $fd + .label yVal = $fe + .label zVal = $ff + // *aVal = lowerPageOffset & 0xf) + // [6] *memoryRemap::xVal = 0 -- _deref_pbuc1=vbuc2 + sta xVal + // *yVal = upperPageOffset & 0xf) + // [8] *memoryRemap::zVal = 0 -- _deref_pbuc1=vbuc2 + sta zVal + // asm + // asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + lda aVal + ldx xVal + ldy yVal + ldz zVal + map + eom + // memoryRemap::@return + // } + // [10] return + rts +} + // memset_dma +// Fill a memory block within the first 64K memory space using MEGA65 DMagic DMA +// Fills the values of num bytes at the destination with a single byte value. +// - dest The destination address (within the MB and bank) +// - fill The char to fill with +// - num The number of bytes to copy +memset_dma: { + .const fill = '*' + .const num = $50*$a + .label dest = DEFAULT_SCREEN + // dmaMode = DMA->EN018B + // [11] memset_dma::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) -- vbuxx=_deref_pbuc1 + // Remember current F018 A/B mode + ldx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // memset_dma_command.count = num + // [12] *((word*)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma::num#0 -- _deref_pwuc1=vwuc2 + // Set up command + lda #num + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT+1 + // memset_dma_command.src = (char*)fill + // [13] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma::fill#0 -- _deref_qbuc1=pbuc2 + lda #fill + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC+1 + // memset_dma_command.dest = dest + // [14] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma::dest#0 -- _deref_qbuc1=pbuc2 + lda #dest + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST+1 + // DMA->EN018B = 1 + // [15] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 -- _deref_pbuc1=vbuc2 + // Set F018B mode + lda #1 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // DMA->ADDRMB = 0 + // [16] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 -- _deref_pbuc1=vbuc2 + // Set address of DMA list + lda #0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB + // DMA->ADDRBANK = 0 + // [17] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 -- _deref_pbuc1=vbuc2 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK + // DMA-> ADDRMSB = >&memset_dma_command + // [18] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >&memset_dma_command -- _deref_pbuc1=vbuc2 + lda #>memset_dma_command + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB + // DMA-> ADDRLSBTRIG = <&memset_dma_command + // [19] *((byte*)DMA) = <&memset_dma_command -- _deref_pbuc1=vbuc2 + // Trigger the DMA (without option lists) + lda #EN018B = dmaMode + // [20] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = memset_dma::dmaMode#0 -- _deref_pbuc1=vbuxx + // Re-enable F018A mode + stx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // memset_dma::@return + // } + // [21] return + rts +} + // File Data +.segment Data + // DMA list entry for filling data + memset_dma_command: .byte DMA_COMMAND_FILL + .word 0, 0 + .byte 0 + .word 0 + .byte 0, 0 + .word 0 + diff --git a/src/test/ref/examples/mega65/dma-test5.sym b/src/test/ref/examples/mega65/dma-test5.sym new file mode 100644 index 000000000..d5a46f873 --- /dev/null +++ b/src/test/ref/examples/mega65/dma-test5.sym @@ -0,0 +1,32 @@ +const nomodify byte* DEFAULT_SCREEN = (byte*) 2048 +const nomodify struct F018_DMAGIC* DMA = (struct F018_DMAGIC*) 55040 +const nomodify byte DMA_COMMAND_FILL = 3 +const byte OFFSET_STRUCT_DMA_LIST_F018B_COUNT = 1 +const byte OFFSET_STRUCT_DMA_LIST_F018B_DEST = 6 +const byte OFFSET_STRUCT_DMA_LIST_F018B_SRC = 3 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1 +const byte OFFSET_STRUCT_F018_DMAGIC_EN018B = 3 +void main() +void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset) +const byte* memoryRemap::aVal = (byte*) 252 +word memoryRemap::lowerPageOffset +byte memoryRemap::remapBlocks +word memoryRemap::upperPageOffset +const byte* memoryRemap::xVal = (byte*) 253 +const byte* memoryRemap::yVal = (byte*) 254 +const byte* memoryRemap::zVal = (byte*) 255 +void memset_dma(void* memset_dma::dest , byte memset_dma::fill , word memset_dma::num) +void* memset_dma::dest +const void* memset_dma::dest#0 dest = (void*)DEFAULT_SCREEN +byte memset_dma::dmaMode +byte memset_dma::dmaMode#0 reg byte x 2.4444444444444446 +byte memset_dma::fill +const byte memset_dma::fill#0 fill = '*' +word memset_dma::num +const word memset_dma::num#0 num = (word)$50*$a +struct DMA_LIST_F018B memset_dma_command loadstore mem[12] = { command: DMA_COMMAND_FILL, count: 0, src: (byte*) 0, src_bank: 0, dest: (byte*) 0, dest_bank: 0, sub_command: 0, modulo: 0 } + +reg byte x [ memset_dma::dmaMode#0 ] +mem[12] [ memset_dma_command ] diff --git a/src/test/ref/examples/mega65/dma-test6.asm b/src/test/ref/examples/mega65/dma-test6.asm new file mode 100644 index 000000000..edbcbc004 --- /dev/null +++ b/src/test/ref/examples/mega65/dma-test6.asm @@ -0,0 +1,164 @@ +// MEGA65 DMA test using memset +// Appendix J in https://mega.scryptos.com/sharefolder-link/MEGA/MEGA65+filehost/Docs/MEGA65-Book_draft.pdf +// Functions for using the F018 DMA for very fast copying or filling of memory +// MEGA65 Registers and Constants +// The MOS 6526 Complex Interface Adapter (CIA) +// http://archive.6502.org/datasheets/mos_6526_cia_recreated.pdf +.cpu _45gs02 + // MEGA65 platform PRG executable starting in MEGA65 mode. +.file [name="dma-test6.prg", type="prg", segments="Program"] +.segmentdef Program [segments="Basic, Code, Data"] +.segmentdef Basic [start=$2001] +.segmentdef Code [start=$2017] +.segmentdef Data [startAfter="Code"] +.segment Basic +.byte $0a, $20, $0a, $00, $fe, $02, $20, $30, $00 // 10 BANK 0 +.byte $15, $20, $14, $00, $9e, $20 // 20 SYS +.text toIntString(main) // NNNN +.byte $00, $00, $00 // + // DMA command fill + .const DMA_COMMAND_FILL = 3 + // $00 = End of options + .const DMA_OPTION_END = 0 + // $0B = Use F018B list format + .const DMA_OPTION_FORMAT_F018B = $a + // $81 $xx = Set MB of destination address + .const DMA_OPTION_DEST_MB = $81 + .const OFFSET_STRUCT_F018_DMAGIC_EN018B = 3 + .const OFFSET_STRUCT_DMA_LIST_F018B_COUNT = 1 + .const OFFSET_STRUCT_DMA_LIST_F018B_SRC = 3 + .const OFFSET_STRUCT_DMA_LIST_F018B_DEST = 6 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1 + .const OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK = 8 + .const OFFSET_STRUCT_F018_DMAGIC_ETRIG = 5 + // DMAgic F018 Controller + .label DMA = $d700 + // Default address of screen character matrix + .label DEFAULT_SCREEN = $800 +.segment Code +main: { + // memoryRemap(0,0,0) + // Map memory to BANK 0 : 0x00XXXX - giving access to I/O + jsr memoryRemap + // memset_dma256(0, 0, DEFAULT_SCREEN, '*', 80*10) + // Fill screen up using 256MB DMA + jsr memset_dma256 + // } + rts +} +// Remap some of the eight 8K memory blocks in the 64K address space of the 6502 to point somewhere else in the first 1MB memory space of the MEGA65. +// After the remapping the CPU will access the mapped memory whenever it uses instructions that access a remapped block. +// See section 2.3.4 in http://www.zimmers.net/cbmpics/cbm/c65/c65manual.txt for a description of the CPU memory remapper of the C65. +// remapBlocks: Indicates which 8K blocks of the 6502 address space to remap. Each bit represents one 8K block +// - bit 0 Memory block $0000-$1fff. Use constant MEMORYBLOCK_0000. +// - bit 1 Memory block $2000-$3fff. Use constant MEMORYBLOCK_2000. +// - bit 2 Memory block $4000-$5fff. Use constant MEMORYBLOCK_4000. +// - bit 3 Memory block $6000-$7fff. Use constant MEMORYBLOCK_6000. +// - bit 4 Memory block $8000-$9fff. Use constant MEMORYBLOCK_8000. +// - bit 5 Memory block $a000-$bfff. Use constant MEMORYBLOCK_A000. +// - bit 6 Memory block $c000-$dfff. Use constant MEMORYBLOCK_C000. +// - bit 7 Memory block $e000-$ffff. Use constant MEMORYBLOCK_E000. +// lowerPageOffset: Offset that will be added to any remapped blocks in the lower 32K of memory (block 0-3). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 0 ($0000-$1fff) is remapped it will point to lowerPageOffset*$100. +// - If block 1 ($2000-$3fff) is remapped it will point to lowerPageOffset*$100 + $2000. +// - If block 2 ($4000-$5fff) is remapped it will point to lowerPageOffset*$100 + $4000. +// - If block 3 ($6000-$7fff) is remapped it will point to lowerPageOffset*$100 + $6000. +// upperPageOffset: Offset that will be added to any remapped blocks in the upper 32K of memory (block 4-7). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 4 ($8000-$9fff) is remapped it will point to upperPageOffset*$100 + $8000 +// - If block 5 ($a000-$bfff) is remapped it will point to upperPageOffset*$100 + $a000. +// - If block 6 ($c000-$dfff) is remapped it will point to upperPageOffset*$100 + $c000. +// - If block 7 ($e000-$ffff) is remapped it will point to upperPageOffset*$100 + $e000. +memoryRemap: { + .label aVal = $fc + .label xVal = $fd + .label yVal = $fe + .label zVal = $ff + // *aVal = lowerPageOffset & 0xf) + sta xVal + // *yVal = upperPageOffset & 0xf) + sta zVal + // asm + lda aVal + ldx xVal + ldy yVal + ldz zVal + map + eom + // } + rts +} +// Set a memory block anywhere in the entire 256MB memory space using MEGA65 DMagic DMA +// Sets the values of num bytes to the memory block pointed to by destination. +// - dest_mb The MB value for the destination (0-255) +// - dest_bank The 64KB bank for the destination (0-15) +// - dest The destination address (within the MB and bank) +// - num The number of bytes to copy +memset_dma256: { + .const dest_mb = 0 + .const dest_bank = 0 + .const fill = '*' + .const num = $50*$a + .label dest = DEFAULT_SCREEN + .label f018b = memset_dma_command256+4 + // dmaMode = DMA->EN018B + // Remember current F018 A/B mode + ldx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // memset_dma_command256[1] = dest_mb + // Set up command + lda #dest_mb + sta memset_dma_command256+1 + // f018b->count = num + lda #num + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_COUNT+1 + // f018b->dest_bank = dest_bank + lda #dest_bank + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK + // f018b->dest = dest + lda #dest + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_DEST+1 + // f018b->src = (char*)fill + // Set fill byte + lda #fill + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_SRC+1 + // DMA->EN018B = 1 + // Set F018B mode + lda #1 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // DMA->ADDRMB = 0 + // Set address of DMA list + lda #0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB + // DMA->ADDRBANK = 0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK + // DMA-> ADDRMSB = >memset_dma_command256 + lda #>memset_dma_command256 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB + // DMA-> ETRIG = EN018B = dmaMode + // Re-enable F018A mode + stx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // } + rts +} +.segment Data + // DMA list entry with options for setting data in the 256MB memory space + // Contains DMA options options for setting MB followed by DMA_LIST_F018B struct. + memset_dma_command256: .byte DMA_OPTION_DEST_MB, 0, DMA_OPTION_FORMAT_F018B, DMA_OPTION_END, DMA_COMMAND_FILL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 diff --git a/src/test/ref/examples/mega65/dma-test6.cfg b/src/test/ref/examples/mega65/dma-test6.cfg new file mode 100644 index 000000000..c5827ae4a --- /dev/null +++ b/src/test/ref/examples/mega65/dma-test6.cfg @@ -0,0 +1,44 @@ + +void main() +main: scope:[main] from + [0] phi() + [1] call memoryRemap + to:main::@1 +main::@1: scope:[main] from main + [2] phi() + [3] call memset_dma256 + to:main::@return +main::@return: scope:[main] from main::@1 + [4] return + to:@return + +void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset) +memoryRemap: scope:[memoryRemap] from main + [5] *memoryRemap::aVal = 0 + [6] *memoryRemap::xVal = 0 + [7] *memoryRemap::yVal = 0 + [8] *memoryRemap::zVal = 0 + asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + to:memoryRemap::@return +memoryRemap::@return: scope:[memoryRemap] from memoryRemap + [10] return + to:@return + +void memset_dma256(byte memset_dma256::dest_mb , byte memset_dma256::dest_bank , void* memset_dma256::dest , byte memset_dma256::fill , word memset_dma256::num) +memset_dma256: scope:[memset_dma256] from main::@1 + [11] memset_dma256::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) + [12] *(memset_dma_command256+1) = memset_dma256::dest_mb#0 + [13] *((word*)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma256::num#0 + [14] *((byte*)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK) = memset_dma256::dest_bank#0 + [15] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma256::dest#0 + [16] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma256::fill#0 + [17] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 + [18] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 + [19] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 + [20] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >memset_dma_command256 + [21] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ETRIG) = &memcpy_dma_command +Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memcpy_dma_command +Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = >&memcpy_dma_command4 +Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memcpy_dma_command4 +Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = >&memset_dma_command +Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memset_dma_command +Inlined call vicSelectGfxBank::$0 = call toDd00 vicSelectGfxBank::gfx +Eliminating unused variable with no statement memcpy_dma_command +Eliminating unused variable with no statement memcpy_dma_command4 +Eliminating unused variable with no statement memset_dma_command + +CONTROL FLOW GRAPH SSA + +void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset) +memoryRemap: scope:[memoryRemap] from main + memoryRemap::upperPageOffset#1 = phi( main/memoryRemap::upperPageOffset#0 ) + memoryRemap::remapBlocks#1 = phi( main/memoryRemap::remapBlocks#0 ) + memoryRemap::lowerPageOffset#1 = phi( main/memoryRemap::lowerPageOffset#0 ) + memoryRemap::$0 = < memoryRemap::lowerPageOffset#1 + *memoryRemap::aVal = memoryRemap::$0 + memoryRemap::$1 = memoryRemap::remapBlocks#1 << 4 + memoryRemap::$2 = > memoryRemap::lowerPageOffset#1 + memoryRemap::$3 = memoryRemap::$2 & $f + memoryRemap::$4 = memoryRemap::$1 | memoryRemap::$3 + *memoryRemap::xVal = memoryRemap::$4 + memoryRemap::$5 = < memoryRemap::upperPageOffset#1 + *memoryRemap::yVal = memoryRemap::$5 + memoryRemap::$6 = memoryRemap::remapBlocks#1 & $f0 + memoryRemap::$7 = > memoryRemap::upperPageOffset#1 + memoryRemap::$8 = memoryRemap::$7 & $f + memoryRemap::$9 = memoryRemap::$6 | memoryRemap::$8 + *memoryRemap::zVal = memoryRemap::$9 + asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + to:memoryRemap::@return +memoryRemap::@return: scope:[memoryRemap] from memoryRemap + return + to:@return + +void memset_dma256(byte memset_dma256::dest_mb , byte memset_dma256::dest_bank , void* memset_dma256::dest , byte memset_dma256::fill , word memset_dma256::num) +memset_dma256: scope:[memset_dma256] from main::@1 + memset_dma256::fill#1 = phi( main::@1/memset_dma256::fill#0 ) + memset_dma256::dest#1 = phi( main::@1/memset_dma256::dest#0 ) + memset_dma256::dest_bank#1 = phi( main::@1/memset_dma256::dest_bank#0 ) + memset_dma256::num#1 = phi( main::@1/memset_dma256::num#0 ) + memset_dma256::dest_mb#1 = phi( main::@1/memset_dma256::dest_mb#0 ) + memset_dma256::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) + memset_dma_command256[1] = memset_dma256::dest_mb#1 + memset_dma256::$0 = & memset_dma_command256[4] + memset_dma256::f018b#0 = (struct DMA_LIST_F018B*)memset_dma256::$0 + memset_dma256::$7 = (word*)memset_dma256::f018b#0 + memset_dma256::$3 = memset_dma256::$7 + OFFSET_STRUCT_DMA_LIST_F018B_COUNT + *memset_dma256::$3 = memset_dma256::num#1 + memset_dma256::$8 = (byte*)memset_dma256::f018b#0 + memset_dma256::$4 = memset_dma256::$8 + OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK + *memset_dma256::$4 = memset_dma256::dest_bank#1 + memset_dma256::$9 = (byte**)memset_dma256::f018b#0 + memset_dma256::$5 = memset_dma256::$9 + OFFSET_STRUCT_DMA_LIST_F018B_DEST + *memset_dma256::$5 = ((byte*)) memset_dma256::dest#1 + memset_dma256::$10 = (byte**)memset_dma256::f018b#0 + memset_dma256::$6 = memset_dma256::$10 + OFFSET_STRUCT_DMA_LIST_F018B_SRC + *memset_dma256::$6 = (byte*)memset_dma256::fill#1 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 + memset_dma256::$1 = > memset_dma_command256 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = memset_dma256::$1 + memset_dma256::$2 = < memset_dma_command256 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ETRIG) = memset_dma256::$2 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = memset_dma256::dmaMode#0 + to:memset_dma256::@return +memset_dma256::@return: scope:[memset_dma256] from memset_dma256 + return + to:@return + +void main() +main: scope:[main] from __start + memoryRemap::remapBlocks#0 = 0 + memoryRemap::lowerPageOffset#0 = 0 + memoryRemap::upperPageOffset#0 = 0 + call memoryRemap + to:main::@1 +main::@1: scope:[main] from main + memset_dma256::dest_mb#0 = 0 + memset_dma256::dest_bank#0 = 0 + memset_dma256::dest#0 = (void*)DEFAULT_SCREEN + memset_dma256::fill#0 = '*' + memset_dma256::num#0 = $50*$a + call memset_dma256 + to:main::@2 +main::@2: scope:[main] from main::@1 + to:main::@return +main::@return: scope:[main] from main::@2 + return + to:@return + +void __start() +__start: scope:[__start] from + call main + to:__start::@1 +__start::@1: scope:[__start] from __start + to:__start::@return +__start::@return: scope:[__start] from __start::@1 + return + to:@return + +SYMBOL TABLE SSA +const nomodify byte* DEFAULT_SCREEN = (byte*)$800 +const nomodify struct F018_DMAGIC* DMA = (struct F018_DMAGIC*)$d700 +const nomodify byte DMA_COMMAND_FILL = 3 +const nomodify byte DMA_OPTION_DEST_MB = $81 +const nomodify byte DMA_OPTION_END = 0 +const nomodify byte DMA_OPTION_FORMAT_F018B = $a +const byte OFFSET_STRUCT_DMA_LIST_F018B_COUNT = 1 +const byte OFFSET_STRUCT_DMA_LIST_F018B_DEST = 6 +const byte OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK = 8 +const byte OFFSET_STRUCT_DMA_LIST_F018B_SRC = 3 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1 +const byte OFFSET_STRUCT_F018_DMAGIC_EN018B = 3 +const byte OFFSET_STRUCT_F018_DMAGIC_ETRIG = 5 +void __start() +void main() +void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset) +byte~ memoryRemap::$0 +byte~ memoryRemap::$1 +byte~ memoryRemap::$2 +number~ memoryRemap::$3 +number~ memoryRemap::$4 +byte~ memoryRemap::$5 +number~ memoryRemap::$6 +byte~ memoryRemap::$7 +number~ memoryRemap::$8 +number~ memoryRemap::$9 +const byte* memoryRemap::aVal = (byte*)$fc +word memoryRemap::lowerPageOffset +word memoryRemap::lowerPageOffset#0 +word memoryRemap::lowerPageOffset#1 +byte memoryRemap::remapBlocks +byte memoryRemap::remapBlocks#0 +byte memoryRemap::remapBlocks#1 +word memoryRemap::upperPageOffset +word memoryRemap::upperPageOffset#0 +word memoryRemap::upperPageOffset#1 +const byte* memoryRemap::xVal = (byte*)$fd +const byte* memoryRemap::yVal = (byte*)$fe +const byte* memoryRemap::zVal = (byte*)$ff +void memset_dma256(byte memset_dma256::dest_mb , byte memset_dma256::dest_bank , void* memset_dma256::dest , byte memset_dma256::fill , word memset_dma256::num) +byte*~ memset_dma256::$0 +byte~ memset_dma256::$1 +byte**~ memset_dma256::$10 +byte~ memset_dma256::$2 +word*~ memset_dma256::$3 +byte*~ memset_dma256::$4 +byte**~ memset_dma256::$5 +byte**~ memset_dma256::$6 +word*~ memset_dma256::$7 +byte*~ memset_dma256::$8 +byte**~ memset_dma256::$9 +void* memset_dma256::dest +void* memset_dma256::dest#0 +void* memset_dma256::dest#1 +byte memset_dma256::dest_bank +byte memset_dma256::dest_bank#0 +byte memset_dma256::dest_bank#1 +byte memset_dma256::dest_mb +byte memset_dma256::dest_mb#0 +byte memset_dma256::dest_mb#1 +byte memset_dma256::dmaMode +byte memset_dma256::dmaMode#0 +struct DMA_LIST_F018B* memset_dma256::f018b +struct DMA_LIST_F018B* memset_dma256::f018b#0 +byte memset_dma256::fill +byte memset_dma256::fill#0 +byte memset_dma256::fill#1 +word memset_dma256::num +word memset_dma256::num#0 +word memset_dma256::num#1 +const byte* memset_dma_command256[] = { DMA_OPTION_DEST_MB, 0, DMA_OPTION_FORMAT_F018B, DMA_OPTION_END, DMA_COMMAND_FILL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + +Adding number conversion cast (unumber) 4 in memoryRemap::$1 = memoryRemap::remapBlocks#1 << 4 +Adding number conversion cast (unumber) $f in memoryRemap::$3 = memoryRemap::$2 & $f +Adding number conversion cast (unumber) memoryRemap::$3 in memoryRemap::$3 = memoryRemap::$2 & (unumber)$f +Adding number conversion cast (unumber) memoryRemap::$4 in memoryRemap::$4 = memoryRemap::$1 | memoryRemap::$3 +Adding number conversion cast (unumber) $f0 in memoryRemap::$6 = memoryRemap::remapBlocks#1 & $f0 +Adding number conversion cast (unumber) memoryRemap::$6 in memoryRemap::$6 = memoryRemap::remapBlocks#1 & (unumber)$f0 +Adding number conversion cast (unumber) $f in memoryRemap::$8 = memoryRemap::$7 & $f +Adding number conversion cast (unumber) memoryRemap::$8 in memoryRemap::$8 = memoryRemap::$7 & (unumber)$f +Adding number conversion cast (unumber) memoryRemap::$9 in memoryRemap::$9 = memoryRemap::$6 | memoryRemap::$8 +Adding number conversion cast (unumber) 1 in memset_dma_command256[1] = memset_dma256::dest_mb#1 +Adding number conversion cast (unumber) 4 in memset_dma256::$0 = & memset_dma_command256[4] +Adding number conversion cast (unumber) 1 in *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 +Adding number conversion cast (unumber) 0 in *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 +Adding number conversion cast (unumber) 0 in *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 +Adding number conversion cast (unumber) 0 in memoryRemap::remapBlocks#0 = 0 +Adding number conversion cast (unumber) 0 in memoryRemap::lowerPageOffset#0 = 0 +Adding number conversion cast (unumber) 0 in memoryRemap::upperPageOffset#0 = 0 +Adding number conversion cast (unumber) 0 in memset_dma256::dest_mb#0 = 0 +Adding number conversion cast (unumber) 0 in memset_dma256::dest_bank#0 = 0 +Adding number conversion cast (unumber) $50*$a in memset_dma256::num#0 = $50*$a +Successful SSA optimization PassNAddNumberTypeConversions +Inlining cast *memset_dma256::$5 = (byte*)memset_dma256::dest#1 +Inlining cast *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = (unumber)1 +Inlining cast *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = (unumber)0 +Inlining cast *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = (unumber)0 +Inlining cast memoryRemap::remapBlocks#0 = (unumber)0 +Inlining cast memoryRemap::lowerPageOffset#0 = (unumber)0 +Inlining cast memoryRemap::upperPageOffset#0 = (unumber)0 +Inlining cast memset_dma256::dest_mb#0 = (unumber)0 +Inlining cast memset_dma256::dest_bank#0 = (unumber)0 +Inlining cast memset_dma256::num#0 = (unumber)$50*$a +Successful SSA optimization Pass2InlineCast +Simplifying constant pointer cast (byte*) 252 +Simplifying constant pointer cast (byte*) 253 +Simplifying constant pointer cast (byte*) 254 +Simplifying constant pointer cast (byte*) 255 +Simplifying constant pointer cast (struct F018_DMAGIC*) 55040 +Simplifying constant pointer cast (byte*) 2048 +Simplifying constant integer cast 4 +Simplifying constant integer cast $f +Simplifying constant integer cast $f0 +Simplifying constant integer cast $f +Simplifying constant integer cast 1 +Simplifying constant integer cast 4 +Simplifying constant integer cast 1 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Successful SSA optimization PassNCastSimplification +Finalized unsigned number type 4 +Finalized unsigned number type $f +Finalized unsigned number type $f0 +Finalized unsigned number type $f +Finalized unsigned number type 1 +Finalized unsigned number type 4 +Finalized unsigned number type 1 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Successful SSA optimization PassNFinalizeNumberTypeConversions +Inferred type updated to byte in memoryRemap::$3 = memoryRemap::$2 & $f +Inferred type updated to byte in memoryRemap::$4 = memoryRemap::$1 | memoryRemap::$3 +Inferred type updated to byte in memoryRemap::$6 = memoryRemap::remapBlocks#1 & $f0 +Inferred type updated to byte in memoryRemap::$8 = memoryRemap::$7 & $f +Inferred type updated to byte in memoryRemap::$9 = memoryRemap::$6 | memoryRemap::$8 +Identical Phi Values memoryRemap::lowerPageOffset#1 memoryRemap::lowerPageOffset#0 +Identical Phi Values memoryRemap::remapBlocks#1 memoryRemap::remapBlocks#0 +Identical Phi Values memoryRemap::upperPageOffset#1 memoryRemap::upperPageOffset#0 +Identical Phi Values memset_dma256::dest_mb#1 memset_dma256::dest_mb#0 +Identical Phi Values memset_dma256::num#1 memset_dma256::num#0 +Identical Phi Values memset_dma256::dest_bank#1 memset_dma256::dest_bank#0 +Identical Phi Values memset_dma256::dest#1 memset_dma256::dest#0 +Identical Phi Values memset_dma256::fill#1 memset_dma256::fill#0 +Successful SSA optimization Pass2IdenticalPhiElimination +Rewriting array member address-of to pointer addition [20] memset_dma256::$0 = memset_dma_command256 + 4 +Successful SSA optimization PassNArrayElementAddressOfRewriting +Constant right-side identified [20] memset_dma256::$0 = memset_dma_command256 + 4 +Constant right-side identified [37] memset_dma256::$1 = > memset_dma_command256 +Constant right-side identified [39] memset_dma256::$2 = < memset_dma_command256 +Constant right-side identified [51] memset_dma256::num#0 = (unumber)$50*$a +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant memset_dma256::$0 = memset_dma_command256+4 +Constant memset_dma256::$1 = >memset_dma_command256 +Constant memset_dma256::$2 = memoryRemap::lowerPageOffset#0 +Constant right-side identified [7] memoryRemap::$5 = < memoryRemap::upperPageOffset#0 +Constant right-side identified [9] memoryRemap::$6 = memoryRemap::remapBlocks#0 & $f0 +Constant right-side identified [10] memoryRemap::$7 = > memoryRemap::upperPageOffset#0 +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant memoryRemap::$0 = memoryRemap::lowerPageOffset#0 +Constant memoryRemap::$5 = memoryRemap::upperPageOffset#0 +Successful SSA optimization Pass2ConstantIdentification +Simplifying constant evaluating to zero memoryRemap::lowerPageOffset#0 in +Simplifying constant evaluating to zero memoryRemap::upperPageOffset#0 in +Successful SSA optimization PassNSimplifyConstantZero +Simplifying expression containing zero memoryRemap::$3 in [5] memoryRemap::$4 = memoryRemap::$1 | memoryRemap::$3 +Simplifying expression containing zero memoryRemap::$8 in [12] memoryRemap::$9 = memoryRemap::$6 | memoryRemap::$8 +Successful SSA optimization PassNSimplifyExpressionWithZero +Eliminating unused constant memoryRemap::remapBlocks#0 +Eliminating unused constant memoryRemap::lowerPageOffset#0 +Eliminating unused constant memoryRemap::upperPageOffset#0 +Eliminating unused constant memoryRemap::$1 +Eliminating unused constant memoryRemap::$6 +Successful SSA optimization PassNEliminateUnusedVars +Alias memoryRemap::$4 = memoryRemap::$3 +Alias memoryRemap::$9 = memoryRemap::$8 +Successful SSA optimization Pass2AliasElimination +Constant right-side identified [1] memoryRemap::$4 = memoryRemap::$2 & $f +Constant right-side identified [4] memoryRemap::$9 = memoryRemap::$7 & $f +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant memoryRemap::$4 = memoryRemap::$2&$f +Constant memoryRemap::$9 = memoryRemap::$7&$f +Successful SSA optimization Pass2ConstantIdentification +Simplifying constant evaluating to zero memoryRemap::$2&$f in +Simplifying constant evaluating to zero memoryRemap::$7&$f in +Successful SSA optimization PassNSimplifyConstantZero +Eliminating unused constant memoryRemap::$2 +Eliminating unused constant memoryRemap::$7 +Successful SSA optimization PassNEliminateUnusedVars +Constant inlined memoryRemap::$0 = 0 +Constant inlined memset_dma256::$1 = >memset_dma_command256 +Constant inlined memset_dma256::$2 = memset_dma_command256 + [21] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ETRIG) = memset_dma_command256 [ memset_dma256::dmaMode#0 ] ( memset_dma256:3 [ memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [21] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ETRIG) = memset_dma_command256 [ memset_dma256::dmaMode#0 ] ( memset_dma256:3 [ memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [21] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ETRIG) = main::@1] + __b1_from_main: + jmp __b1 + // main::@1 + __b1: + // [3] call memset_dma256 + // Fill screen up using 256MB DMA + jsr memset_dma256 + jmp __breturn + // main::@return + __breturn: + // [4] return + rts +} + // memoryRemap +// Remap some of the eight 8K memory blocks in the 64K address space of the 6502 to point somewhere else in the first 1MB memory space of the MEGA65. +// After the remapping the CPU will access the mapped memory whenever it uses instructions that access a remapped block. +// See section 2.3.4 in http://www.zimmers.net/cbmpics/cbm/c65/c65manual.txt for a description of the CPU memory remapper of the C65. +// remapBlocks: Indicates which 8K blocks of the 6502 address space to remap. Each bit represents one 8K block +// - bit 0 Memory block $0000-$1fff. Use constant MEMORYBLOCK_0000. +// - bit 1 Memory block $2000-$3fff. Use constant MEMORYBLOCK_2000. +// - bit 2 Memory block $4000-$5fff. Use constant MEMORYBLOCK_4000. +// - bit 3 Memory block $6000-$7fff. Use constant MEMORYBLOCK_6000. +// - bit 4 Memory block $8000-$9fff. Use constant MEMORYBLOCK_8000. +// - bit 5 Memory block $a000-$bfff. Use constant MEMORYBLOCK_A000. +// - bit 6 Memory block $c000-$dfff. Use constant MEMORYBLOCK_C000. +// - bit 7 Memory block $e000-$ffff. Use constant MEMORYBLOCK_E000. +// lowerPageOffset: Offset that will be added to any remapped blocks in the lower 32K of memory (block 0-3). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 0 ($0000-$1fff) is remapped it will point to lowerPageOffset*$100. +// - If block 1 ($2000-$3fff) is remapped it will point to lowerPageOffset*$100 + $2000. +// - If block 2 ($4000-$5fff) is remapped it will point to lowerPageOffset*$100 + $4000. +// - If block 3 ($6000-$7fff) is remapped it will point to lowerPageOffset*$100 + $6000. +// upperPageOffset: Offset that will be added to any remapped blocks in the upper 32K of memory (block 4-7). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 4 ($8000-$9fff) is remapped it will point to upperPageOffset*$100 + $8000 +// - If block 5 ($a000-$bfff) is remapped it will point to upperPageOffset*$100 + $a000. +// - If block 6 ($c000-$dfff) is remapped it will point to upperPageOffset*$100 + $c000. +// - If block 7 ($e000-$ffff) is remapped it will point to upperPageOffset*$100 + $e000. +memoryRemap: { + .label aVal = $fc + .label xVal = $fd + .label yVal = $fe + .label zVal = $ff + // [5] *memoryRemap::aVal = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta aVal + // [6] *memoryRemap::xVal = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta xVal + // [7] *memoryRemap::yVal = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta yVal + // [8] *memoryRemap::zVal = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta zVal + // asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + lda aVal + ldx xVal + ldy yVal + ldz zVal + map + eom + jmp __breturn + // memoryRemap::@return + __breturn: + // [10] return + rts +} + // memset_dma256 +// Set a memory block anywhere in the entire 256MB memory space using MEGA65 DMagic DMA +// Sets the values of num bytes to the memory block pointed to by destination. +// - dest_mb The MB value for the destination (0-255) +// - dest_bank The 64KB bank for the destination (0-15) +// - dest The destination address (within the MB and bank) +// - num The number of bytes to copy +memset_dma256: { + .const dest_mb = 0 + .const dest_bank = 0 + .const fill = '*' + .const num = $50*$a + .label dest = DEFAULT_SCREEN + .label f018b = memset_dma_command256+4 + // [11] memset_dma256::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) -- vbuxx=_deref_pbuc1 + // Remember current F018 A/B mode + ldx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // [12] *(memset_dma_command256+1) = memset_dma256::dest_mb#0 -- _deref_pbuc1=vbuc2 + // Set up command + lda #dest_mb + sta memset_dma_command256+1 + // [13] *((word*)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma256::num#0 -- _deref_pwuc1=vwuc2 + lda #num + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_COUNT+1 + // [14] *((byte*)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK) = memset_dma256::dest_bank#0 -- _deref_pbuc1=vbuc2 + lda #dest_bank + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK + // [15] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma256::dest#0 -- _deref_qbuc1=pbuc2 + lda #dest + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_DEST+1 + // [16] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma256::fill#0 -- _deref_qbuc1=pbuc2 + // Set fill byte + lda #fill + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_SRC+1 + // [17] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 -- _deref_pbuc1=vbuc2 + // Set F018B mode + lda #1 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // [18] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 -- _deref_pbuc1=vbuc2 + // Set address of DMA list + lda #0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB + // [19] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK + // [20] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >memset_dma_command256 -- _deref_pbuc1=vbuc2 + lda #>memset_dma_command256 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB + // [21] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ETRIG) = main::@1] + // main::@1 + // memset_dma256(0, 0, DEFAULT_SCREEN, '*', 80*10) + // [3] call memset_dma256 + // Fill screen up using 256MB DMA + jsr memset_dma256 + // main::@return + // } + // [4] return + rts +} + // memoryRemap +// Remap some of the eight 8K memory blocks in the 64K address space of the 6502 to point somewhere else in the first 1MB memory space of the MEGA65. +// After the remapping the CPU will access the mapped memory whenever it uses instructions that access a remapped block. +// See section 2.3.4 in http://www.zimmers.net/cbmpics/cbm/c65/c65manual.txt for a description of the CPU memory remapper of the C65. +// remapBlocks: Indicates which 8K blocks of the 6502 address space to remap. Each bit represents one 8K block +// - bit 0 Memory block $0000-$1fff. Use constant MEMORYBLOCK_0000. +// - bit 1 Memory block $2000-$3fff. Use constant MEMORYBLOCK_2000. +// - bit 2 Memory block $4000-$5fff. Use constant MEMORYBLOCK_4000. +// - bit 3 Memory block $6000-$7fff. Use constant MEMORYBLOCK_6000. +// - bit 4 Memory block $8000-$9fff. Use constant MEMORYBLOCK_8000. +// - bit 5 Memory block $a000-$bfff. Use constant MEMORYBLOCK_A000. +// - bit 6 Memory block $c000-$dfff. Use constant MEMORYBLOCK_C000. +// - bit 7 Memory block $e000-$ffff. Use constant MEMORYBLOCK_E000. +// lowerPageOffset: Offset that will be added to any remapped blocks in the lower 32K of memory (block 0-3). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 0 ($0000-$1fff) is remapped it will point to lowerPageOffset*$100. +// - If block 1 ($2000-$3fff) is remapped it will point to lowerPageOffset*$100 + $2000. +// - If block 2 ($4000-$5fff) is remapped it will point to lowerPageOffset*$100 + $4000. +// - If block 3 ($6000-$7fff) is remapped it will point to lowerPageOffset*$100 + $6000. +// upperPageOffset: Offset that will be added to any remapped blocks in the upper 32K of memory (block 4-7). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 4 ($8000-$9fff) is remapped it will point to upperPageOffset*$100 + $8000 +// - If block 5 ($a000-$bfff) is remapped it will point to upperPageOffset*$100 + $a000. +// - If block 6 ($c000-$dfff) is remapped it will point to upperPageOffset*$100 + $c000. +// - If block 7 ($e000-$ffff) is remapped it will point to upperPageOffset*$100 + $e000. +memoryRemap: { + .label aVal = $fc + .label xVal = $fd + .label yVal = $fe + .label zVal = $ff + // *aVal = lowerPageOffset & 0xf) + // [6] *memoryRemap::xVal = 0 -- _deref_pbuc1=vbuc2 + sta xVal + // *yVal = upperPageOffset & 0xf) + // [8] *memoryRemap::zVal = 0 -- _deref_pbuc1=vbuc2 + sta zVal + // asm + // asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + lda aVal + ldx xVal + ldy yVal + ldz zVal + map + eom + // memoryRemap::@return + // } + // [10] return + rts +} + // memset_dma256 +// Set a memory block anywhere in the entire 256MB memory space using MEGA65 DMagic DMA +// Sets the values of num bytes to the memory block pointed to by destination. +// - dest_mb The MB value for the destination (0-255) +// - dest_bank The 64KB bank for the destination (0-15) +// - dest The destination address (within the MB and bank) +// - num The number of bytes to copy +memset_dma256: { + .const dest_mb = 0 + .const dest_bank = 0 + .const fill = '*' + .const num = $50*$a + .label dest = DEFAULT_SCREEN + .label f018b = memset_dma_command256+4 + // dmaMode = DMA->EN018B + // [11] memset_dma256::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) -- vbuxx=_deref_pbuc1 + // Remember current F018 A/B mode + ldx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // memset_dma_command256[1] = dest_mb + // [12] *(memset_dma_command256+1) = memset_dma256::dest_mb#0 -- _deref_pbuc1=vbuc2 + // Set up command + lda #dest_mb + sta memset_dma_command256+1 + // f018b->count = num + // [13] *((word*)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma256::num#0 -- _deref_pwuc1=vwuc2 + lda #num + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_COUNT+1 + // f018b->dest_bank = dest_bank + // [14] *((byte*)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK) = memset_dma256::dest_bank#0 -- _deref_pbuc1=vbuc2 + lda #dest_bank + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK + // f018b->dest = dest + // [15] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma256::dest#0 -- _deref_qbuc1=pbuc2 + lda #dest + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_DEST+1 + // f018b->src = (char*)fill + // [16] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma256::fill#0 -- _deref_qbuc1=pbuc2 + // Set fill byte + lda #fill + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_SRC+1 + // DMA->EN018B = 1 + // [17] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 -- _deref_pbuc1=vbuc2 + // Set F018B mode + lda #1 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // DMA->ADDRMB = 0 + // [18] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 -- _deref_pbuc1=vbuc2 + // Set address of DMA list + lda #0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB + // DMA->ADDRBANK = 0 + // [19] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 -- _deref_pbuc1=vbuc2 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK + // DMA-> ADDRMSB = >memset_dma_command256 + // [20] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >memset_dma_command256 -- _deref_pbuc1=vbuc2 + lda #>memset_dma_command256 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB + // DMA-> ETRIG = EN018B = dmaMode + // [22] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = memset_dma256::dmaMode#0 -- _deref_pbuc1=vbuxx + // Re-enable F018A mode + stx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // memset_dma256::@return + // } + // [23] return + rts +} + // File Data +.segment Data + // DMA list entry with options for setting data in the 256MB memory space + // Contains DMA options options for setting MB followed by DMA_LIST_F018B struct. + memset_dma_command256: .byte DMA_OPTION_DEST_MB, 0, DMA_OPTION_FORMAT_F018B, DMA_OPTION_END, DMA_COMMAND_FILL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + diff --git a/src/test/ref/examples/mega65/dma-test6.sym b/src/test/ref/examples/mega65/dma-test6.sym new file mode 100644 index 000000000..83b62e934 --- /dev/null +++ b/src/test/ref/examples/mega65/dma-test6.sym @@ -0,0 +1,42 @@ +const nomodify byte* DEFAULT_SCREEN = (byte*) 2048 +const nomodify struct F018_DMAGIC* DMA = (struct F018_DMAGIC*) 55040 +const nomodify byte DMA_COMMAND_FILL = 3 +const nomodify byte DMA_OPTION_DEST_MB = $81 +const nomodify byte DMA_OPTION_END = 0 +const nomodify byte DMA_OPTION_FORMAT_F018B = $a +const byte OFFSET_STRUCT_DMA_LIST_F018B_COUNT = 1 +const byte OFFSET_STRUCT_DMA_LIST_F018B_DEST = 6 +const byte OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK = 8 +const byte OFFSET_STRUCT_DMA_LIST_F018B_SRC = 3 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1 +const byte OFFSET_STRUCT_F018_DMAGIC_EN018B = 3 +const byte OFFSET_STRUCT_F018_DMAGIC_ETRIG = 5 +void main() +void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset) +const byte* memoryRemap::aVal = (byte*) 252 +word memoryRemap::lowerPageOffset +byte memoryRemap::remapBlocks +word memoryRemap::upperPageOffset +const byte* memoryRemap::xVal = (byte*) 253 +const byte* memoryRemap::yVal = (byte*) 254 +const byte* memoryRemap::zVal = (byte*) 255 +void memset_dma256(byte memset_dma256::dest_mb , byte memset_dma256::dest_bank , void* memset_dma256::dest , byte memset_dma256::fill , word memset_dma256::num) +void* memset_dma256::dest +const void* memset_dma256::dest#0 dest = (void*)DEFAULT_SCREEN +byte memset_dma256::dest_bank +const byte memset_dma256::dest_bank#0 dest_bank = 0 +byte memset_dma256::dest_mb +const byte memset_dma256::dest_mb#0 dest_mb = 0 +byte memset_dma256::dmaMode +byte memset_dma256::dmaMode#0 reg byte x 2.0 +struct DMA_LIST_F018B* memset_dma256::f018b +const struct DMA_LIST_F018B* memset_dma256::f018b#0 f018b = (struct DMA_LIST_F018B*)memset_dma_command256+4 +byte memset_dma256::fill +const byte memset_dma256::fill#0 fill = '*' +word memset_dma256::num +const word memset_dma256::num#0 num = (word)$50*$a +const byte* memset_dma_command256[] = { DMA_OPTION_DEST_MB, 0, DMA_OPTION_FORMAT_F018B, DMA_OPTION_END, DMA_COMMAND_FILL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + +reg byte x [ memset_dma256::dmaMode#0 ] diff --git a/src/test/ref/examples/mega65/dypp65.asm b/src/test/ref/examples/mega65/dypp65.asm new file mode 100644 index 000000000..838cc1740 --- /dev/null +++ b/src/test/ref/examples/mega65/dypp65.asm @@ -0,0 +1,468 @@ +// DYPP (Different Y Pixel Position) LOGO created using DMA +// Graphics mode is 320x200 full-colour super extended attribute mode text-mode +// Character layout is column-wise giving linear addressing of the graphics (one byte per pixel) +.cpu _45gs02 + // MEGA65 platform PRG executable starting in MEGA65 mode. +.file [name="dypp65.prg", type="prg", segments="Program"] +.segmentdef Program [segments="Basic, Code, Data"] +.segmentdef Basic [start=$2001] +.segmentdef Code [start=$2017] +.segmentdef Data [startAfter="Code"] +.segment Basic +.byte $0a, $20, $0a, $00, $fe, $02, $20, $30, $00 // 10 BANK 0 +.byte $15, $20, $14, $00, $9e, $20 // 20 SYS +.text toIntString(main) // NNNN +.byte $00, $00, $00 // + // DMA command fill + .const DMA_COMMAND_FILL = 3 + // $00 = End of options + .const DMA_OPTION_END = 0 + // $0B = Use F018B list format + .const DMA_OPTION_FORMAT_F018B = $a + // $81 $xx = Set MB of destination address + .const DMA_OPTION_DEST_MB = $81 + .const WHITE = 1 + .const SIZEOF_WORD = 2 + .const OFFSET_STRUCT_F018_DMAGIC_EN018B = 3 + .const OFFSET_STRUCT_DMA_LIST_F018B_COUNT = 1 + .const OFFSET_STRUCT_DMA_LIST_F018B_SRC = 3 + .const OFFSET_STRUCT_DMA_LIST_F018B_DEST = 6 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1 + .const OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK = 8 + .const OFFSET_STRUCT_F018_DMAGIC_ETRIG = 5 + .const OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_LO = $5c + .const OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_HI = $5d + .const OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_LO = $48 + .const OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_HI = $49 + .const OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_LO = $4a + .const OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_HI = $4b + .const OFFSET_STRUCT_MEGA65_VICIV_CONTROLB = $31 + .const OFFSET_STRUCT_MEGA65_VICIV_CONTROLC = $54 + .const OFFSET_STRUCT_MEGA65_VICIV_KEY = $2f + .const OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO = $58 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI = $59 + .const OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_LO = $4c + .const OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_HI = $4d + .const OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT = $5e + .const OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO = $60 + .const OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI = $61 + .const OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO = $62 + .const OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HIHI = $63 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO = $68 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI = $69 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO = $6a + .const OFFSET_STRUCT_MOS6569_VICII_RASTER = $12 + .const OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR = $21 + // The VIC-II MOS 6567/6569 + .label VICII = $d000 + // The VIC IV + .label VICIV = $d000 + // DMAgic F018 Controller + .label DMA = $d700 + // The screen address (45*25*2=0x08ca bytes) + .label SCREEN = $5000 + // The charset address (45*32*8=0x2d00 bytes) + .label CHARSET = $6000 +.segment Code +main: { + .label c = 8 + // Fill extended screen to achieve column-wise linear addressing + .label erow = 2 + // Copy the LOGO to the CHARSET + .label logo_dest = 6 + .label logo_src = 4 + // asm + sei + // memoryRemap(0,0,0) + // Map memory to BANK 0 : 0x00XXXX - giving access to I/O + jsr memoryRemap + // VICIV->SIDBDRWD_LO = 0 + // Set sideborder width=0, disable raster delay and hot registers + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_LO + // VICIV->SIDBDRWD_HI = 0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_HI + // VICIV->TBDRPOS_LO = 0 + // Disable top/bottom borders + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_LO + // VICIV->TBDRPOS_HI = 0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_HI + // VICIV->BBDRPOS_LO = 0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_LO + // VICIV->BBDRPOS_HI = 2 + lda #2 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_HI + // VICIV->CONTROLB |= 0x40 + // Enable 48MHz fast mode + lda #$40 + ora VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + // VICIV->CONTROLC |= 0x40 + lda #$40 + ora VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + // VICIV->KEY = 0x47 + // Enable the VIC 4 + lda #$47 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY + // VICIV->KEY = 0x53 + lda #$53 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY + // VICIV->CONTROLC |= 1 + // Enable Super Extended Attribute Mode + lda #1 + ora VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + // VICIV->CONTROLB &= 0x7f + // Mode 40x25 chars - will be 45*25 when utilizing the borders + lda #$7f + and VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + // VICIV->CHARSTEP_LO = 90 + lda #$5a + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO + // VICIV->CHARSTEP_HI = 0 + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI + // VICIV->TEXTXPOS_LO = 40 + // Start text in the left border + lda #$28 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_LO + // VICIV->TEXTXPOS_HI = 0 + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_HI + // VICIV->CHRCOUNT = 45 + // Set number of characters to display per row + lda #$2d + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT + // VICIV->SCRNPTR_LOLO = SCRNPTR_LOHI = >SCREEN + lda #>SCREEN + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI + // VICIV->SCRNPTR_HILO = 0 + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO + // VICIV->SCRNPTR_HIHI = 0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HIHI + // VICIV->CHARPTR_LOLO = CHARPTR_LOHI = >CHARSET + lda #>CHARSET + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI + // VICIV->CHARPTR_HILO = 0 + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO + // memset_dma(SCREEN, 0, 45*25*2) + // Fill the screen with 0 + lda #SCREEN + sta.z memset_dma.dest+1 + ldz #0 + lda #<$2d*$19*2 + sta.z memset_dma.num + lda #>$2d*$19*2 + sta.z memset_dma.num+1 + jsr memset_dma + // memset_dma256(0xff,0x08,0x0000, WHITE, 45*25*2) + // Fill the colours with WHITE - directly into $ff80000 + jsr memset_dma256 + // memset_dma(CHARSET, 0x55, 45*32*8) + // Fill the charset with 0x55 + lda #CHARSET + sta.z memset_dma.dest+1 + ldz #$55 + lda #<$2d*$20*8 + sta.z memset_dma.num + lda #>$2d*$20*8 + sta.z memset_dma.num+1 + jsr memset_dma + lda #SCREEN + sta.z erow+1 + ldx #0 + __b1: + // for(char r=0; r<25; r++) + cpx #$19 + bcc __b2 + lda #CHARSET + sta.z logo_dest+1 + lda #LOGO + sta.z logo_src+1 + ldx #0 + __b6: + // for(char col=0;col<45;col++) + cpx #$2d + bcc __b5 + __b10: + // VICIV->BG_COLOR = VICII->RASTER + lda VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR + jmp __b10 + __b5: + ldy #0 + __b7: + // for(char y=0;y<25*8;y++) + cpy #$19*8 + bcc __b8 + // logo_dest += 32*8 + clc + lda.z logo_dest + adc #<$20*8 + sta.z logo_dest + lda.z logo_dest+1 + adc #>$20*8 + sta.z logo_dest+1 + // logo_src += 25*8 + lda #$19*8 + clc + adc.z logo_src + sta.z logo_src + bcc !+ + inc.z logo_src+1 + !: + // for(char col=0;col<45;col++) + inx + jmp __b6 + __b8: + // logo_dest[y] = logo_src[y] + lda (logo_src),y + sta (logo_dest),y + // for(char y=0;y<25*8;y++) + iny + jmp __b7 + __b2: + // c = r + txa + sta.z c + lda #0 + sta.z c+1 + ldz #0 + __b3: + // for(char i=0; i<45; i++) + cpz #$2d + bcc __b4 + // erow += 45 + lda #$2d*SIZEOF_WORD + clc + adc.z erow + sta.z erow + bcc !+ + inc.z erow+1 + !: + // for(char r=0; r<25; r++) + inx + jmp __b1 + __b4: + // erow[i] = c + tza + asl + tay + lda.z c + sta (erow),y + iny + lda.z c+1 + sta (erow),y + // c += 32 + lda #$20 + clc + adc.z c + sta.z c + bcc !+ + inc.z c+1 + !: + // for(char i=0; i<45; i++) + inz + jmp __b3 +} +// Remap some of the eight 8K memory blocks in the 64K address space of the 6502 to point somewhere else in the first 1MB memory space of the MEGA65. +// After the remapping the CPU will access the mapped memory whenever it uses instructions that access a remapped block. +// See section 2.3.4 in http://www.zimmers.net/cbmpics/cbm/c65/c65manual.txt for a description of the CPU memory remapper of the C65. +// remapBlocks: Indicates which 8K blocks of the 6502 address space to remap. Each bit represents one 8K block +// - bit 0 Memory block $0000-$1fff. Use constant MEMORYBLOCK_0000. +// - bit 1 Memory block $2000-$3fff. Use constant MEMORYBLOCK_2000. +// - bit 2 Memory block $4000-$5fff. Use constant MEMORYBLOCK_4000. +// - bit 3 Memory block $6000-$7fff. Use constant MEMORYBLOCK_6000. +// - bit 4 Memory block $8000-$9fff. Use constant MEMORYBLOCK_8000. +// - bit 5 Memory block $a000-$bfff. Use constant MEMORYBLOCK_A000. +// - bit 6 Memory block $c000-$dfff. Use constant MEMORYBLOCK_C000. +// - bit 7 Memory block $e000-$ffff. Use constant MEMORYBLOCK_E000. +// lowerPageOffset: Offset that will be added to any remapped blocks in the lower 32K of memory (block 0-3). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 0 ($0000-$1fff) is remapped it will point to lowerPageOffset*$100. +// - If block 1 ($2000-$3fff) is remapped it will point to lowerPageOffset*$100 + $2000. +// - If block 2 ($4000-$5fff) is remapped it will point to lowerPageOffset*$100 + $4000. +// - If block 3 ($6000-$7fff) is remapped it will point to lowerPageOffset*$100 + $6000. +// upperPageOffset: Offset that will be added to any remapped blocks in the upper 32K of memory (block 4-7). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 4 ($8000-$9fff) is remapped it will point to upperPageOffset*$100 + $8000 +// - If block 5 ($a000-$bfff) is remapped it will point to upperPageOffset*$100 + $a000. +// - If block 6 ($c000-$dfff) is remapped it will point to upperPageOffset*$100 + $c000. +// - If block 7 ($e000-$ffff) is remapped it will point to upperPageOffset*$100 + $e000. +memoryRemap: { + .label aVal = $fc + .label xVal = $fd + .label yVal = $fe + .label zVal = $ff + // *aVal = lowerPageOffset & 0xf) + sta xVal + // *yVal = upperPageOffset & 0xf) + sta zVal + // asm + lda aVal + ldx xVal + ldy yVal + ldz zVal + map + eom + // } + rts +} +// Fill a memory block within the first 64K memory space using MEGA65 DMagic DMA +// Fills the values of num bytes at the destination with a single byte value. +// - dest The destination address (within the MB and bank) +// - fill The char to fill with +// - num The number of bytes to copy +// memset_dma(void* zp($c) dest, byte register(Z) fill, word zp($a) num) +memset_dma: { + .label num = $a + .label dest = $c + // dmaMode = DMA->EN018B + // Remember current F018 A/B mode + ldx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // memset_dma_command.count = num + // Set up command + lda.z num + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT + lda.z num+1 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT+1 + // memset_dma_command.src = (char*)fill + tza + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC + lda #0 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC+1 + // memset_dma_command.dest = dest + lda.z dest + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST + lda.z dest+1 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST+1 + // DMA->EN018B = 1 + // Set F018B mode + lda #1 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // DMA->ADDRMB = 0 + // Set address of DMA list + lda #0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB + // DMA->ADDRBANK = 0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK + // DMA-> ADDRMSB = >&memset_dma_command + lda #>memset_dma_command + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB + // DMA-> ADDRLSBTRIG = <&memset_dma_command + // Trigger the DMA (without option lists) + lda #EN018B = dmaMode + // Re-enable F018A mode + stx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // } + rts +} +// Set a memory block anywhere in the entire 256MB memory space using MEGA65 DMagic DMA +// Sets the values of num bytes to the memory block pointed to by destination. +// - dest_mb The MB value for the destination (0-255) +// - dest_bank The 64KB bank for the destination (0-15) +// - dest The destination address (within the MB and bank) +// - num The number of bytes to copy +memset_dma256: { + .const dest_mb = $ff + .const dest_bank = 8 + .const num = $2d*$19*2 + .label dest = 0 + .label f018b = memset_dma_command256+4 + // dmaMode = DMA->EN018B + // Remember current F018 A/B mode + ldx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // memset_dma_command256[1] = dest_mb + // Set up command + lda #dest_mb + sta memset_dma_command256+1 + // f018b->count = num + lda #num + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_COUNT+1 + // f018b->dest_bank = dest_bank + lda #dest_bank + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK + // f018b->dest = dest + lda #dest + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_DEST+1 + // f018b->src = (char*)fill + // Set fill byte + lda #WHITE + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_SRC+1 + // DMA->EN018B = 1 + // Set F018B mode + lda #1 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // DMA->ADDRMB = 0 + // Set address of DMA list + lda #0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB + // DMA->ADDRBANK = 0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK + // DMA-> ADDRMSB = >memset_dma_command256 + lda #>memset_dma_command256 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB + // DMA-> ETRIG = EN018B = dmaMode + // Re-enable F018A mode + stx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // } + rts +} +.segment Data + // DMA list entry with options for setting data in the 256MB memory space + // Contains DMA options options for setting MB followed by DMA_LIST_F018B struct. + memset_dma_command256: .byte DMA_OPTION_DEST_MB, 0, DMA_OPTION_FORMAT_F018B, DMA_OPTION_END, DMA_COMMAND_FILL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + // A logo in column-wide linear single-color memory layout +LOGO: +.var pic = LoadPicture("camelot.png", List().add($ffffff, $000000)) + .for (var x=0;x<45; x++) + .for (var y=0; y<25*8; y++) + .byte pic.getSinglecolorByte(x,y) + + // DMA list entry for filling data + memset_dma_command: .byte DMA_COMMAND_FILL + .word 0, 0 + .byte 0 + .word 0 + .byte 0, 0 + .word 0 diff --git a/src/test/ref/examples/mega65/dypp65.cfg b/src/test/ref/examples/mega65/dypp65.cfg new file mode 100644 index 000000000..1f99749f7 --- /dev/null +++ b/src/test/ref/examples/mega65/dypp65.cfg @@ -0,0 +1,143 @@ + +void main() +main: scope:[main] from + [0] phi() + to:main::SEI1 +main::SEI1: scope:[main] from main + asm { sei } + to:main::@11 +main::@11: scope:[main] from main::SEI1 + [2] phi() + [3] call memoryRemap + to:main::@12 +main::@12: scope:[main] from main::@11 + [4] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_LO) = 0 + [5] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_HI) = 0 + [6] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_LO) = 0 + [7] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_HI) = 0 + [8] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_LO) = 0 + [9] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_HI) = 2 + [10] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) | $40 + [11] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) | $40 + [12] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = $47 + [13] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = $53 + [14] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) | 1 + [15] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) & $7f + [16] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO) = $5a + [17] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI) = 0 + [18] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_LO) = $28 + [19] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_HI) = 0 + [20] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT) = $2d + [21] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO) = 0 + [22] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI) = >SCREEN + [23] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = 0 + [24] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HIHI) = 0 + [25] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 + [26] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = >CHARSET + [27] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 + [28] call memset_dma + to:main::@13 +main::@13: scope:[main] from main::@12 + [29] phi() + [30] call memset_dma256 + to:main::@14 +main::@14: scope:[main] from main::@13 + [31] phi() + [32] call memset_dma + to:main::@1 +main::@1: scope:[main] from main::@14 main::@5 + [33] main::erow#5 = phi( main::@14/SCREEN, main::@5/main::erow#1 ) + [33] main::r#2 = phi( main::@14/0, main::@5/main::r#1 ) + [34] if(main::r#2<$19) goto main::@2 + to:main::@6 +main::@6: scope:[main] from main::@1 main::@9 + [35] main::logo_dest#5 = phi( main::@9/main::logo_dest#1, main::@1/CHARSET ) + [35] main::logo_src#5 = phi( main::@9/main::logo_src#1, main::@1/LOGO ) + [35] main::col#2 = phi( main::@9/main::col#1, main::@1/0 ) + [36] if(main::col#2<$2d) goto main::@7 + to:main::@10 +main::@10: scope:[main] from main::@10 main::@6 + [37] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR) = *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) + to:main::@10 +main::@7: scope:[main] from main::@6 main::@8 + [38] main::y#2 = phi( main::@8/main::y#1, main::@6/0 ) + [39] if(main::y#2<(byte)$19*8) goto main::@8 + to:main::@9 +main::@9: scope:[main] from main::@7 + [40] main::logo_dest#1 = main::logo_dest#5 + (word)$20*8 + [41] main::logo_src#1 = main::logo_src#5 + (byte)$19*8 + [42] main::col#1 = ++ main::col#2 + to:main::@6 +main::@8: scope:[main] from main::@7 + [43] main::logo_dest#5[main::y#2] = main::logo_src#5[main::y#2] + [44] main::y#1 = ++ main::y#2 + to:main::@7 +main::@2: scope:[main] from main::@1 + [45] main::c#0 = (word)main::r#2 + to:main::@3 +main::@3: scope:[main] from main::@2 main::@4 + [46] main::c#2 = phi( main::@2/main::c#0, main::@4/main::c#1 ) + [46] main::i#2 = phi( main::@2/0, main::@4/main::i#1 ) + [47] if(main::i#2<$2d) goto main::@4 + to:main::@5 +main::@5: scope:[main] from main::@3 + [48] main::erow#1 = main::erow#5 + $2d*SIZEOF_WORD + [49] main::r#1 = ++ main::r#2 + to:main::@1 +main::@4: scope:[main] from main::@3 + [50] main::$10 = main::i#2 << 1 + [51] main::erow#5[main::$10] = main::c#2 + [52] main::c#1 = main::c#2 + $20 + [53] main::i#1 = ++ main::i#2 + to:main::@3 + +void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset) +memoryRemap: scope:[memoryRemap] from main::@11 + [54] *memoryRemap::aVal = 0 + [55] *memoryRemap::xVal = 0 + [56] *memoryRemap::yVal = 0 + [57] *memoryRemap::zVal = 0 + asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + to:memoryRemap::@return +memoryRemap::@return: scope:[memoryRemap] from memoryRemap + [59] return + to:@return + +void memset_dma(void* memset_dma::dest , byte memset_dma::fill , word memset_dma::num) +memset_dma: scope:[memset_dma] from main::@12 main::@14 + [60] memset_dma::dest#2 = phi( main::@12/(void*)SCREEN, main::@14/(void*)CHARSET ) + [60] memset_dma::fill#2 = phi( main::@12/0, main::@14/$55 ) + [60] memset_dma::num#2 = phi( main::@12/(word)$2d*$19*2, main::@14/(word)$2d*$20*8 ) + [61] memset_dma::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) + [62] *((word*)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma::num#2 + [63] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma::fill#2 + [64] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma::dest#2 + [65] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 + [66] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 + [67] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 + [68] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >&memset_dma_command + [69] *((byte*)DMA) = <&memset_dma_command + [70] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = memset_dma::dmaMode#0 + to:memset_dma::@return +memset_dma::@return: scope:[memset_dma] from memset_dma + [71] return + to:@return + +void memset_dma256(byte memset_dma256::dest_mb , byte memset_dma256::dest_bank , void* memset_dma256::dest , byte memset_dma256::fill , word memset_dma256::num) +memset_dma256: scope:[memset_dma256] from main::@13 + [72] memset_dma256::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) + [73] *(memset_dma_command256+1) = memset_dma256::dest_mb#0 + [74] *((word*)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma256::num#0 + [75] *((byte*)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK) = memset_dma256::dest_bank#0 + [76] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma256::dest#0 + [77] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)WHITE + [78] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 + [79] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 + [80] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 + [81] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >memset_dma_command256 + [82] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ETRIG) = &memcpy_dma_command +Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memcpy_dma_command +Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = >&memcpy_dma_command4 +Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memcpy_dma_command4 +Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = >&memset_dma_command +Setting struct to load/store in variable affected by address-of *DMA.ADDRLSBTRIG = <&memset_dma_command +Inlined call vicSelectGfxBank::$0 = call toDd00 vicSelectGfxBank::gfx +Inlined call call SEI +Eliminating unused variable with no statement memcpy_dma_command +Eliminating unused variable with no statement memcpy_dma_command4 + +CONTROL FLOW GRAPH SSA + +void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset) +memoryRemap: scope:[memoryRemap] from main::@13 + memoryRemap::upperPageOffset#1 = phi( main::@13/memoryRemap::upperPageOffset#0 ) + memoryRemap::remapBlocks#1 = phi( main::@13/memoryRemap::remapBlocks#0 ) + memoryRemap::lowerPageOffset#1 = phi( main::@13/memoryRemap::lowerPageOffset#0 ) + memoryRemap::$0 = < memoryRemap::lowerPageOffset#1 + *memoryRemap::aVal = memoryRemap::$0 + memoryRemap::$1 = memoryRemap::remapBlocks#1 << 4 + memoryRemap::$2 = > memoryRemap::lowerPageOffset#1 + memoryRemap::$3 = memoryRemap::$2 & $f + memoryRemap::$4 = memoryRemap::$1 | memoryRemap::$3 + *memoryRemap::xVal = memoryRemap::$4 + memoryRemap::$5 = < memoryRemap::upperPageOffset#1 + *memoryRemap::yVal = memoryRemap::$5 + memoryRemap::$6 = memoryRemap::remapBlocks#1 & $f0 + memoryRemap::$7 = > memoryRemap::upperPageOffset#1 + memoryRemap::$8 = memoryRemap::$7 & $f + memoryRemap::$9 = memoryRemap::$6 | memoryRemap::$8 + *memoryRemap::zVal = memoryRemap::$9 + asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + to:memoryRemap::@return +memoryRemap::@return: scope:[memoryRemap] from memoryRemap + return + to:@return + +void memset_dma(void* memset_dma::dest , byte memset_dma::fill , word memset_dma::num) +memset_dma: scope:[memset_dma] from main::@14 main::@16 + memset_dma::dest#2 = phi( main::@14/memset_dma::dest#0, main::@16/memset_dma::dest#1 ) + memset_dma::fill#2 = phi( main::@14/memset_dma::fill#0, main::@16/memset_dma::fill#1 ) + memset_dma::num#2 = phi( main::@14/memset_dma::num#0, main::@16/memset_dma::num#1 ) + memset_dma::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) + *((word*)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma::num#2 + *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma::fill#2 + *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = ((byte*)) memset_dma::dest#2 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >&memset_dma_command + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRLSBTRIG) = <&memset_dma_command + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = memset_dma::dmaMode#0 + to:memset_dma::@return +memset_dma::@return: scope:[memset_dma] from memset_dma + return + to:@return + +void memset_dma256(byte memset_dma256::dest_mb , byte memset_dma256::dest_bank , void* memset_dma256::dest , byte memset_dma256::fill , word memset_dma256::num) +memset_dma256: scope:[memset_dma256] from main::@15 + memset_dma256::fill#1 = phi( main::@15/memset_dma256::fill#0 ) + memset_dma256::dest#1 = phi( main::@15/memset_dma256::dest#0 ) + memset_dma256::dest_bank#1 = phi( main::@15/memset_dma256::dest_bank#0 ) + memset_dma256::num#1 = phi( main::@15/memset_dma256::num#0 ) + memset_dma256::dest_mb#1 = phi( main::@15/memset_dma256::dest_mb#0 ) + memset_dma256::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) + memset_dma_command256[1] = memset_dma256::dest_mb#1 + memset_dma256::$0 = & memset_dma_command256[4] + memset_dma256::f018b#0 = (struct DMA_LIST_F018B*)memset_dma256::$0 + memset_dma256::$7 = (word*)memset_dma256::f018b#0 + memset_dma256::$3 = memset_dma256::$7 + OFFSET_STRUCT_DMA_LIST_F018B_COUNT + *memset_dma256::$3 = memset_dma256::num#1 + memset_dma256::$8 = (byte*)memset_dma256::f018b#0 + memset_dma256::$4 = memset_dma256::$8 + OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK + *memset_dma256::$4 = memset_dma256::dest_bank#1 + memset_dma256::$9 = (byte**)memset_dma256::f018b#0 + memset_dma256::$5 = memset_dma256::$9 + OFFSET_STRUCT_DMA_LIST_F018B_DEST + *memset_dma256::$5 = ((byte*)) memset_dma256::dest#1 + memset_dma256::$10 = (byte**)memset_dma256::f018b#0 + memset_dma256::$6 = memset_dma256::$10 + OFFSET_STRUCT_DMA_LIST_F018B_SRC + *memset_dma256::$6 = (byte*)memset_dma256::fill#1 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 + memset_dma256::$1 = > memset_dma_command256 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = memset_dma256::$1 + memset_dma256::$2 = < memset_dma_command256 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ETRIG) = memset_dma256::$2 + *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = memset_dma256::dmaMode#0 + to:memset_dma256::@return +memset_dma256::@return: scope:[memset_dma256] from memset_dma256 + return + to:@return + +void main() +main: scope:[main] from __start + to:main::SEI1 +main::SEI1: scope:[main] from main + asm { sei } + to:main::@13 +main::@13: scope:[main] from main::SEI1 + memoryRemap::remapBlocks#0 = 0 + memoryRemap::lowerPageOffset#0 = 0 + memoryRemap::upperPageOffset#0 = 0 + call memoryRemap + to:main::@14 +main::@14: scope:[main] from main::@13 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_LO) = 0 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_HI) = 0 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_LO) = 0 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_HI) = 0 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_LO) = 0 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_HI) = 2 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) | $40 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) | $40 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = $47 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = $53 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) | 1 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) & $7f + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO) = $5a + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI) = 0 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_LO) = $28 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_HI) = 0 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT) = $2d + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO) = SCREEN + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = 0 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HIHI) = 0 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = CHARSET + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 + memset_dma::dest#0 = (void*)SCREEN + memset_dma::fill#0 = 0 + memset_dma::num#0 = $2d*$19*2 + call memset_dma + to:main::@15 +main::@15: scope:[main] from main::@14 + memset_dma256::dest_mb#0 = $ff + memset_dma256::dest_bank#0 = 8 + memset_dma256::dest#0 = (void*)0 + memset_dma256::fill#0 = WHITE + memset_dma256::num#0 = $2d*$19*2 + call memset_dma256 + to:main::@16 +main::@16: scope:[main] from main::@15 + memset_dma::dest#1 = (void*)CHARSET + memset_dma::fill#1 = $55 + memset_dma::num#1 = $2d*$20*8 + call memset_dma + to:main::@17 +main::@17: scope:[main] from main::@16 + main::erow#0 = main::ESCREEN + main::r#0 = 0 + to:main::@1 +main::@1: scope:[main] from main::@17 main::@6 + main::erow#6 = phi( main::@17/main::erow#0, main::@6/main::erow#1 ) + main::r#2 = phi( main::@17/main::r#0, main::@6/main::r#1 ) + main::$5 = main::r#2 < $19 + if(main::$5) goto main::@2 + to:main::@3 +main::@2: scope:[main] from main::@1 + main::erow#5 = phi( main::@1/main::erow#6 ) + main::r#3 = phi( main::@1/main::r#2 ) + main::c#0 = (word)main::r#3 + main::i#0 = 0 + to:main::@4 +main::@3: scope:[main] from main::@1 + main::logo_dest#0 = CHARSET + main::logo_src#0 = LOGO + main::col#0 = 0 + to:main::@7 +main::@4: scope:[main] from main::@2 main::@5 + main::r#5 = phi( main::@2/main::r#3, main::@5/main::r#6 ) + main::erow#4 = phi( main::@2/main::erow#5, main::@5/main::erow#2 ) + main::c#3 = phi( main::@2/main::c#0, main::@5/main::c#1 ) + main::i#2 = phi( main::@2/main::i#0, main::@5/main::i#1 ) + main::$6 = main::i#2 < $2d + if(main::$6) goto main::@5 + to:main::@6 +main::@5: scope:[main] from main::@4 + main::r#6 = phi( main::@4/main::r#5 ) + main::erow#2 = phi( main::@4/main::erow#4 ) + main::c#2 = phi( main::@4/main::c#3 ) + main::i#3 = phi( main::@4/main::i#2 ) + main::$10 = main::i#3 * SIZEOF_WORD + main::erow#2[main::$10] = main::c#2 + main::c#1 = main::c#2 + $20 + main::i#1 = ++ main::i#3 + to:main::@4 +main::@6: scope:[main] from main::@4 + main::r#4 = phi( main::@4/main::r#5 ) + main::erow#3 = phi( main::@4/main::erow#4 ) + main::$9 = $2d * SIZEOF_WORD + main::erow#1 = main::erow#3 + main::$9 + main::r#1 = ++ main::r#4 + to:main::@1 +main::@7: scope:[main] from main::@11 main::@3 + main::logo_dest#6 = phi( main::@11/main::logo_dest#1, main::@3/main::logo_dest#0 ) + main::logo_src#6 = phi( main::@11/main::logo_src#1, main::@3/main::logo_src#0 ) + main::col#2 = phi( main::@11/main::col#1, main::@3/main::col#0 ) + main::$7 = main::col#2 < $2d + if(main::$7) goto main::@8 + to:main::@12 +main::@8: scope:[main] from main::@7 + main::col#6 = phi( main::@7/main::col#2 ) + main::logo_dest#5 = phi( main::@7/main::logo_dest#6 ) + main::logo_src#5 = phi( main::@7/main::logo_src#6 ) + main::y#0 = 0 + to:main::@9 +main::@9: scope:[main] from main::@10 main::@8 + main::col#4 = phi( main::@10/main::col#5, main::@8/main::col#6 ) + main::logo_dest#4 = phi( main::@10/main::logo_dest#2, main::@8/main::logo_dest#5 ) + main::logo_src#4 = phi( main::@10/main::logo_src#2, main::@8/main::logo_src#5 ) + main::y#2 = phi( main::@10/main::y#1, main::@8/main::y#0 ) + main::$8 = main::y#2 < $19*8 + if(main::$8) goto main::@10 + to:main::@11 +main::@10: scope:[main] from main::@9 + main::col#5 = phi( main::@9/main::col#4 ) + main::logo_dest#2 = phi( main::@9/main::logo_dest#4 ) + main::y#3 = phi( main::@9/main::y#2 ) + main::logo_src#2 = phi( main::@9/main::logo_src#4 ) + main::logo_dest#2[main::y#3] = main::logo_src#2[main::y#3] + main::y#1 = ++ main::y#3 + to:main::@9 +main::@11: scope:[main] from main::@9 + main::col#3 = phi( main::@9/main::col#4 ) + main::logo_src#3 = phi( main::@9/main::logo_src#4 ) + main::logo_dest#3 = phi( main::@9/main::logo_dest#4 ) + main::logo_dest#1 = main::logo_dest#3 + $20*8 + main::logo_src#1 = main::logo_src#3 + $19*8 + main::col#1 = ++ main::col#3 + to:main::@7 +main::@12: scope:[main] from main::@12 main::@7 + *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR) = *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) + to:main::@12 +main::@return: scope:[main] from + return + to:@return + +void __start() +__start: scope:[__start] from + call main + to:__start::@1 +__start::@1: scope:[__start] from __start + to:__start::@return +__start::@return: scope:[__start] from __start::@1 + return + to:@return + +SYMBOL TABLE SSA +const nomodify byte* CHARSET = (byte*)$6000 +const nomodify struct F018_DMAGIC* DMA = (struct F018_DMAGIC*)$d700 +const nomodify byte DMA_COMMAND_FILL = 3 +const nomodify byte DMA_OPTION_DEST_MB = $81 +const nomodify byte DMA_OPTION_END = 0 +const nomodify byte DMA_OPTION_FORMAT_F018B = $a +const byte* LOGO[$2d*$19*8] = kickasm {{ .var pic = LoadPicture("camelot.png", List().add($ffffff, $000000)) + .for (var x=0;x<45; x++) + .for (var y=0; y<25*8; y++) + .byte pic.getSinglecolorByte(x,y) + }} +const byte OFFSET_STRUCT_DMA_LIST_F018B_COUNT = 1 +const byte OFFSET_STRUCT_DMA_LIST_F018B_DEST = 6 +const byte OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK = 8 +const byte OFFSET_STRUCT_DMA_LIST_F018B_SRC = 3 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRLSBTRIG = 0 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1 +const byte OFFSET_STRUCT_F018_DMAGIC_EN018B = 3 +const byte OFFSET_STRUCT_F018_DMAGIC_ETRIG = 5 +const byte OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_HI = $4b +const byte OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_LO = $4a +const byte OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR = $21 +const byte OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO = $6a +const byte OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI = $69 +const byte OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO = $68 +const byte OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI = $59 +const byte OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO = $58 +const byte OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT = $5e +const byte OFFSET_STRUCT_MEGA65_VICIV_CONTROLB = $31 +const byte OFFSET_STRUCT_MEGA65_VICIV_CONTROLC = $54 +const byte OFFSET_STRUCT_MEGA65_VICIV_KEY = $2f +const byte OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HIHI = $63 +const byte OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO = $62 +const byte OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI = $61 +const byte OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO = $60 +const byte OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_HI = $5d +const byte OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_LO = $5c +const byte OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_HI = $49 +const byte OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_LO = $48 +const byte OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_HI = $4d +const byte OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_LO = $4c +const byte OFFSET_STRUCT_MOS6569_VICII_RASTER = $12 +const nomodify byte* SCREEN = (byte*)$5000 +const byte SIZEOF_WORD = 2 +const nomodify struct MOS6569_VICII* VICII = (struct MOS6569_VICII*)$d000 +const nomodify struct MEGA65_VICIV* VICIV = (struct MEGA65_VICIV*)$d000 +const nomodify byte WHITE = 1 +void __start() +void main() +byte~ main::$10 +bool~ main::$5 +bool~ main::$6 +bool~ main::$7 +bool~ main::$8 +number~ main::$9 +const word* main::ESCREEN = SCREEN +word main::c +word main::c#0 +word main::c#1 +word main::c#2 +word main::c#3 +byte main::col +byte main::col#0 +byte main::col#1 +byte main::col#2 +byte main::col#3 +byte main::col#4 +byte main::col#5 +byte main::col#6 +word* main::erow +word* main::erow#0 +word* main::erow#1 +word* main::erow#2 +word* main::erow#3 +word* main::erow#4 +word* main::erow#5 +word* main::erow#6 +byte main::i +byte main::i#0 +byte main::i#1 +byte main::i#2 +byte main::i#3 +byte* main::logo_dest +byte* main::logo_dest#0 +byte* main::logo_dest#1 +byte* main::logo_dest#2 +byte* main::logo_dest#3 +byte* main::logo_dest#4 +byte* main::logo_dest#5 +byte* main::logo_dest#6 +byte* main::logo_src +byte* main::logo_src#0 +byte* main::logo_src#1 +byte* main::logo_src#2 +byte* main::logo_src#3 +byte* main::logo_src#4 +byte* main::logo_src#5 +byte* main::logo_src#6 +byte main::r +byte main::r#0 +byte main::r#1 +byte main::r#2 +byte main::r#3 +byte main::r#4 +byte main::r#5 +byte main::r#6 +byte main::y +byte main::y#0 +byte main::y#1 +byte main::y#2 +byte main::y#3 +void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset) +byte~ memoryRemap::$0 +byte~ memoryRemap::$1 +byte~ memoryRemap::$2 +number~ memoryRemap::$3 +number~ memoryRemap::$4 +byte~ memoryRemap::$5 +number~ memoryRemap::$6 +byte~ memoryRemap::$7 +number~ memoryRemap::$8 +number~ memoryRemap::$9 +const byte* memoryRemap::aVal = (byte*)$fc +word memoryRemap::lowerPageOffset +word memoryRemap::lowerPageOffset#0 +word memoryRemap::lowerPageOffset#1 +byte memoryRemap::remapBlocks +byte memoryRemap::remapBlocks#0 +byte memoryRemap::remapBlocks#1 +word memoryRemap::upperPageOffset +word memoryRemap::upperPageOffset#0 +word memoryRemap::upperPageOffset#1 +const byte* memoryRemap::xVal = (byte*)$fd +const byte* memoryRemap::yVal = (byte*)$fe +const byte* memoryRemap::zVal = (byte*)$ff +void memset_dma(void* memset_dma::dest , byte memset_dma::fill , word memset_dma::num) +void* memset_dma::dest +void* memset_dma::dest#0 +void* memset_dma::dest#1 +void* memset_dma::dest#2 +byte memset_dma::dmaMode +byte memset_dma::dmaMode#0 +byte memset_dma::fill +byte memset_dma::fill#0 +byte memset_dma::fill#1 +byte memset_dma::fill#2 +word memset_dma::num +word memset_dma::num#0 +word memset_dma::num#1 +word memset_dma::num#2 +void memset_dma256(byte memset_dma256::dest_mb , byte memset_dma256::dest_bank , void* memset_dma256::dest , byte memset_dma256::fill , word memset_dma256::num) +byte*~ memset_dma256::$0 +byte~ memset_dma256::$1 +byte**~ memset_dma256::$10 +byte~ memset_dma256::$2 +word*~ memset_dma256::$3 +byte*~ memset_dma256::$4 +byte**~ memset_dma256::$5 +byte**~ memset_dma256::$6 +word*~ memset_dma256::$7 +byte*~ memset_dma256::$8 +byte**~ memset_dma256::$9 +void* memset_dma256::dest +void* memset_dma256::dest#0 +void* memset_dma256::dest#1 +byte memset_dma256::dest_bank +byte memset_dma256::dest_bank#0 +byte memset_dma256::dest_bank#1 +byte memset_dma256::dest_mb +byte memset_dma256::dest_mb#0 +byte memset_dma256::dest_mb#1 +byte memset_dma256::dmaMode +byte memset_dma256::dmaMode#0 +struct DMA_LIST_F018B* memset_dma256::f018b +struct DMA_LIST_F018B* memset_dma256::f018b#0 +byte memset_dma256::fill +byte memset_dma256::fill#0 +byte memset_dma256::fill#1 +word memset_dma256::num +word memset_dma256::num#0 +word memset_dma256::num#1 +struct DMA_LIST_F018B memset_dma_command loadstore = { command: DMA_COMMAND_FILL, count: 0, src: (byte*)0, src_bank: 0, dest: (byte*)0, dest_bank: 0, sub_command: 0, modulo: 0 } +const byte* memset_dma_command256[] = { DMA_OPTION_DEST_MB, 0, DMA_OPTION_FORMAT_F018B, DMA_OPTION_END, DMA_COMMAND_FILL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + +Adding number conversion cast (unumber) 4 in memoryRemap::$1 = memoryRemap::remapBlocks#1 << 4 +Adding number conversion cast (unumber) $f in memoryRemap::$3 = memoryRemap::$2 & $f +Adding number conversion cast (unumber) memoryRemap::$3 in memoryRemap::$3 = memoryRemap::$2 & (unumber)$f +Adding number conversion cast (unumber) memoryRemap::$4 in memoryRemap::$4 = memoryRemap::$1 | memoryRemap::$3 +Adding number conversion cast (unumber) $f0 in memoryRemap::$6 = memoryRemap::remapBlocks#1 & $f0 +Adding number conversion cast (unumber) memoryRemap::$6 in memoryRemap::$6 = memoryRemap::remapBlocks#1 & (unumber)$f0 +Adding number conversion cast (unumber) $f in memoryRemap::$8 = memoryRemap::$7 & $f +Adding number conversion cast (unumber) memoryRemap::$8 in memoryRemap::$8 = memoryRemap::$7 & (unumber)$f +Adding number conversion cast (unumber) memoryRemap::$9 in memoryRemap::$9 = memoryRemap::$6 | memoryRemap::$8 +Adding number conversion cast (unumber) 1 in *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 +Adding number conversion cast (unumber) 0 in *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 +Adding number conversion cast (unumber) 0 in *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 +Adding number conversion cast (unumber) 1 in memset_dma_command256[1] = memset_dma256::dest_mb#1 +Adding number conversion cast (unumber) 4 in memset_dma256::$0 = & memset_dma_command256[4] +Adding number conversion cast (unumber) 1 in *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 +Adding number conversion cast (unumber) 0 in *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 +Adding number conversion cast (unumber) 0 in *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 +Adding number conversion cast (unumber) 0 in memoryRemap::remapBlocks#0 = 0 +Adding number conversion cast (unumber) 0 in memoryRemap::lowerPageOffset#0 = 0 +Adding number conversion cast (unumber) 0 in memoryRemap::upperPageOffset#0 = 0 +Adding number conversion cast (unumber) 0 in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_LO) = 0 +Adding number conversion cast (unumber) 0 in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_HI) = 0 +Adding number conversion cast (unumber) 0 in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_LO) = 0 +Adding number conversion cast (unumber) 0 in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_HI) = 0 +Adding number conversion cast (unumber) 0 in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_LO) = 0 +Adding number conversion cast (unumber) 2 in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_HI) = 2 +Adding number conversion cast (unumber) $40 in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) | $40 +Adding number conversion cast (unumber) $40 in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) | $40 +Adding number conversion cast (unumber) $47 in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = $47 +Adding number conversion cast (unumber) $53 in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = $53 +Adding number conversion cast (unumber) 1 in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) | 1 +Adding number conversion cast (unumber) $7f in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) & $7f +Adding number conversion cast (unumber) $5a in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO) = $5a +Adding number conversion cast (unumber) 0 in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI) = 0 +Adding number conversion cast (unumber) $28 in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_LO) = $28 +Adding number conversion cast (unumber) 0 in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_HI) = 0 +Adding number conversion cast (unumber) $2d in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT) = $2d +Adding number conversion cast (unumber) 0 in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = 0 +Adding number conversion cast (unumber) 0 in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HIHI) = 0 +Adding number conversion cast (unumber) 0 in *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 +Adding number conversion cast (unumber) 0 in memset_dma::fill#0 = 0 +Adding number conversion cast (unumber) $2d*$19*2 in memset_dma::num#0 = $2d*$19*2 +Adding number conversion cast (unumber) $ff in memset_dma256::dest_mb#0 = $ff +Adding number conversion cast (unumber) 8 in memset_dma256::dest_bank#0 = 8 +Adding number conversion cast (unumber) $2d*$19*2 in memset_dma256::num#0 = $2d*$19*2 +Adding number conversion cast (unumber) $55 in memset_dma::fill#1 = $55 +Adding number conversion cast (unumber) $2d*$20*8 in memset_dma::num#1 = $2d*$20*8 +Adding number conversion cast (unumber) $19 in main::$5 = main::r#2 < $19 +Adding number conversion cast (unumber) $2d in main::$6 = main::i#2 < $2d +Adding number conversion cast (unumber) $20 in main::c#1 = main::c#2 + $20 +Adding number conversion cast (unumber) $2d in main::$9 = $2d * SIZEOF_WORD +Adding number conversion cast (unumber) main::$9 in main::$9 = (unumber)$2d * SIZEOF_WORD +Adding number conversion cast (unumber) $2d in main::$7 = main::col#2 < $2d +Adding number conversion cast (unumber) $19*8 in main::$8 = main::y#2 < $19*8 +Adding number conversion cast (unumber) $20*8 in main::logo_dest#1 = main::logo_dest#3 + $20*8 +Adding number conversion cast (unumber) $19*8 in main::logo_src#1 = main::logo_src#3 + $19*8 +Successful SSA optimization PassNAddNumberTypeConversions +Inlining cast *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma::dest#2 +Inlining cast *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = (unumber)1 +Inlining cast *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = (unumber)0 +Inlining cast *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = (unumber)0 +Inlining cast *memset_dma256::$5 = (byte*)memset_dma256::dest#1 +Inlining cast *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = (unumber)1 +Inlining cast *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = (unumber)0 +Inlining cast *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = (unumber)0 +Inlining cast memoryRemap::remapBlocks#0 = (unumber)0 +Inlining cast memoryRemap::lowerPageOffset#0 = (unumber)0 +Inlining cast memoryRemap::upperPageOffset#0 = (unumber)0 +Inlining cast *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_LO) = (unumber)0 +Inlining cast *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_HI) = (unumber)0 +Inlining cast *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_LO) = (unumber)0 +Inlining cast *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_HI) = (unumber)0 +Inlining cast *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_LO) = (unumber)0 +Inlining cast *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_HI) = (unumber)2 +Inlining cast *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = (unumber)$47 +Inlining cast *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = (unumber)$53 +Inlining cast *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO) = (unumber)$5a +Inlining cast *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI) = (unumber)0 +Inlining cast *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_LO) = (unumber)$28 +Inlining cast *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_HI) = (unumber)0 +Inlining cast *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT) = (unumber)$2d +Inlining cast *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = (unumber)0 +Inlining cast *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HIHI) = (unumber)0 +Inlining cast *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = (unumber)0 +Inlining cast memset_dma::fill#0 = (unumber)0 +Inlining cast memset_dma::num#0 = (unumber)$2d*$19*2 +Inlining cast memset_dma256::dest_mb#0 = (unumber)$ff +Inlining cast memset_dma256::dest_bank#0 = (unumber)8 +Inlining cast memset_dma256::num#0 = (unumber)$2d*$19*2 +Inlining cast memset_dma::fill#1 = (unumber)$55 +Inlining cast memset_dma::num#1 = (unumber)$2d*$20*8 +Successful SSA optimization Pass2InlineCast +Simplifying constant pointer cast (byte*) 252 +Simplifying constant pointer cast (byte*) 253 +Simplifying constant pointer cast (byte*) 254 +Simplifying constant pointer cast (byte*) 255 +Simplifying constant pointer cast (struct MOS6569_VICII*) 53248 +Simplifying constant pointer cast (struct MEGA65_VICIV*) 53248 +Simplifying constant pointer cast (struct F018_DMAGIC*) 55040 +Simplifying constant pointer cast (byte*) 0 +Simplifying constant pointer cast (byte*) 0 +Simplifying constant pointer cast (byte*) 20480 +Simplifying constant pointer cast (byte*) 24576 +Simplifying constant integer cast 4 +Simplifying constant integer cast $f +Simplifying constant integer cast $f0 +Simplifying constant integer cast $f +Simplifying constant integer cast 1 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 1 +Simplifying constant integer cast 4 +Simplifying constant integer cast 1 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 2 +Simplifying constant integer cast $40 +Simplifying constant integer cast $40 +Simplifying constant integer cast $47 +Simplifying constant integer cast $53 +Simplifying constant integer cast 1 +Simplifying constant integer cast $7f +Simplifying constant integer cast $5a +Simplifying constant integer cast 0 +Simplifying constant integer cast $28 +Simplifying constant integer cast 0 +Simplifying constant integer cast $2d +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast $ff +Simplifying constant integer cast 8 +Simplifying constant pointer cast (void*) 0 +Simplifying constant integer cast $55 +Simplifying constant integer cast $19 +Simplifying constant integer cast $2d +Simplifying constant integer cast $20 +Simplifying constant integer cast $2d +Simplifying constant integer cast $2d +Successful SSA optimization PassNCastSimplification +Finalized unsigned number type 4 +Finalized unsigned number type $f +Finalized unsigned number type $f0 +Finalized unsigned number type $f +Finalized unsigned number type 1 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 1 +Finalized unsigned number type 4 +Finalized unsigned number type 1 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 2 +Finalized unsigned number type $40 +Finalized unsigned number type $40 +Finalized unsigned number type $47 +Finalized unsigned number type $53 +Finalized unsigned number type 1 +Finalized unsigned number type $7f +Finalized unsigned number type $5a +Finalized unsigned number type 0 +Finalized unsigned number type $28 +Finalized unsigned number type 0 +Finalized unsigned number type $2d +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type 0 +Finalized unsigned number type $ff +Finalized unsigned number type 8 +Finalized unsigned number type $55 +Finalized unsigned number type $19 +Finalized unsigned number type $2d +Finalized unsigned number type $20 +Finalized unsigned number type $2d +Finalized unsigned number type $2d +Successful SSA optimization PassNFinalizeNumberTypeConversions +Inferred type updated to byte in memoryRemap::$3 = memoryRemap::$2 & $f +Inferred type updated to byte in memoryRemap::$4 = memoryRemap::$1 | memoryRemap::$3 +Inferred type updated to byte in memoryRemap::$6 = memoryRemap::remapBlocks#1 & $f0 +Inferred type updated to byte in memoryRemap::$8 = memoryRemap::$7 & $f +Inferred type updated to byte in memoryRemap::$9 = memoryRemap::$6 | memoryRemap::$8 +Inferred type updated to byte in main::$9 = $2d * SIZEOF_WORD +Alias main::r#2 = main::r#3 +Alias main::erow#5 = main::erow#6 +Alias main::i#2 = main::i#3 +Alias main::c#2 = main::c#3 +Alias main::erow#2 = main::erow#4 main::erow#3 +Alias main::r#4 = main::r#6 main::r#5 +Alias main::logo_src#5 = main::logo_src#6 +Alias main::logo_dest#5 = main::logo_dest#6 +Alias main::col#2 = main::col#6 +Alias main::logo_src#2 = main::logo_src#4 main::logo_src#3 +Alias main::y#2 = main::y#3 +Alias main::logo_dest#2 = main::logo_dest#4 main::logo_dest#3 +Alias main::col#3 = main::col#5 main::col#4 +Successful SSA optimization Pass2AliasElimination +Identical Phi Values memoryRemap::lowerPageOffset#1 memoryRemap::lowerPageOffset#0 +Identical Phi Values memoryRemap::remapBlocks#1 memoryRemap::remapBlocks#0 +Identical Phi Values memoryRemap::upperPageOffset#1 memoryRemap::upperPageOffset#0 +Identical Phi Values memset_dma256::dest_mb#1 memset_dma256::dest_mb#0 +Identical Phi Values memset_dma256::num#1 memset_dma256::num#0 +Identical Phi Values memset_dma256::dest_bank#1 memset_dma256::dest_bank#0 +Identical Phi Values memset_dma256::dest#1 memset_dma256::dest#0 +Identical Phi Values memset_dma256::fill#1 memset_dma256::fill#0 +Identical Phi Values main::erow#2 main::erow#5 +Identical Phi Values main::r#4 main::r#2 +Identical Phi Values main::logo_src#2 main::logo_src#5 +Identical Phi Values main::logo_dest#2 main::logo_dest#5 +Identical Phi Values main::col#3 main::col#2 +Successful SSA optimization Pass2IdenticalPhiElimination +Simple Condition main::$5 [102] if(main::r#2<$19) goto main::@2 +Simple Condition main::$6 [110] if(main::i#2<$2d) goto main::@5 +Simple Condition main::$7 [120] if(main::col#2<$2d) goto main::@8 +Simple Condition main::$8 [124] if(main::y#2<(byte)$19*8) goto main::@10 +Successful SSA optimization Pass2ConditionalJumpSimplification +Rewriting array member address-of to pointer addition [32] memset_dma256::$0 = memset_dma_command256 + 4 +Successful SSA optimization PassNArrayElementAddressOfRewriting +Constant right-side identified [32] memset_dma256::$0 = memset_dma_command256 + 4 +Constant right-side identified [49] memset_dma256::$1 = > memset_dma_command256 +Constant right-side identified [51] memset_dma256::$2 = < memset_dma_command256 +Constant right-side identified [86] memset_dma::num#0 = (unumber)$2d*$19*2 +Constant right-side identified [92] memset_dma256::num#0 = (unumber)$2d*$19*2 +Constant right-side identified [96] memset_dma::num#1 = (unumber)$2d*$20*8 +Constant right-side identified [115] main::$9 = $2d * SIZEOF_WORD +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant memset_dma256::$0 = memset_dma_command256+4 +Constant memset_dma256::$1 = >memset_dma_command256 +Constant memset_dma256::$2 = memoryRemap::lowerPageOffset#0 +Constant right-side identified [7] memoryRemap::$5 = < memoryRemap::upperPageOffset#0 +Constant right-side identified [9] memoryRemap::$6 = memoryRemap::remapBlocks#0 & $f0 +Constant right-side identified [10] memoryRemap::$7 = > memoryRemap::upperPageOffset#0 +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant memoryRemap::$0 = memoryRemap::lowerPageOffset#0 +Constant memoryRemap::$5 = memoryRemap::upperPageOffset#0 +Successful SSA optimization Pass2ConstantIdentification +Simplifying constant evaluating to zero memoryRemap::lowerPageOffset#0 in +Simplifying constant evaluating to zero memoryRemap::upperPageOffset#0 in +Successful SSA optimization PassNSimplifyConstantZero +Simplifying expression containing zero memoryRemap::$3 in [5] memoryRemap::$4 = memoryRemap::$1 | memoryRemap::$3 +Simplifying expression containing zero memoryRemap::$8 in [12] memoryRemap::$9 = memoryRemap::$6 | memoryRemap::$8 +Successful SSA optimization PassNSimplifyExpressionWithZero +Eliminating unused constant memoryRemap::remapBlocks#0 +Eliminating unused constant memoryRemap::lowerPageOffset#0 +Eliminating unused constant memoryRemap::upperPageOffset#0 +Eliminating unused constant memoryRemap::$1 +Eliminating unused constant memoryRemap::$6 +Successful SSA optimization PassNEliminateUnusedVars +Alias memoryRemap::$4 = memoryRemap::$3 +Alias memoryRemap::$9 = memoryRemap::$8 +Successful SSA optimization Pass2AliasElimination +Constant right-side identified [1] memoryRemap::$4 = memoryRemap::$2 & $f +Constant right-side identified [4] memoryRemap::$9 = memoryRemap::$7 & $f +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant memoryRemap::$4 = memoryRemap::$2&$f +Constant memoryRemap::$9 = memoryRemap::$7&$f +Successful SSA optimization Pass2ConstantIdentification +Simplifying constant evaluating to zero memoryRemap::$2&$f in +Simplifying constant evaluating to zero memoryRemap::$7&$f in +Successful SSA optimization PassNSimplifyConstantZero +Eliminating unused constant memoryRemap::$2 +Eliminating unused constant memoryRemap::$7 +Successful SSA optimization PassNEliminateUnusedVars +Rewriting multiplication to use shift [65] main::$10 = main::i#2 * SIZEOF_WORD +Successful SSA optimization Pass2MultiplyToShiftRewriting +Inlining constant with var siblings memset_dma::dest#0 +Inlining constant with var siblings memset_dma::fill#0 +Inlining constant with var siblings memset_dma::num#0 +Inlining constant with var siblings memset_dma::dest#1 +Inlining constant with var siblings memset_dma::fill#1 +Inlining constant with var siblings memset_dma::num#1 +Inlining constant with var siblings main::erow#0 +Inlining constant with var siblings main::r#0 +Inlining constant with var siblings main::i#0 +Inlining constant with var siblings main::logo_dest#0 +Inlining constant with var siblings main::logo_src#0 +Inlining constant with var siblings main::col#0 +Inlining constant with var siblings main::y#0 +Constant inlined memset_dma256::fill#0 = WHITE +Constant inlined memset_dma::num#0 = (word)$2d*$19*2 +Constant inlined main::col#0 = 0 +Constant inlined memset_dma::num#1 = (word)$2d*$20*8 +Constant inlined memset_dma::dest#1 = (void*)CHARSET +Constant inlined memset_dma::fill#1 = $55 +Constant inlined memset_dma256::$10 = (byte**)memset_dma256::f018b#0 +Constant inlined memset_dma::dest#0 = (void*)SCREEN +Constant inlined memset_dma::fill#0 = 0 +Constant inlined main::i#0 = 0 +Constant inlined main::ESCREEN = SCREEN +Constant inlined memset_dma256::$9 = (byte**)memset_dma256::f018b#0 +Constant inlined memset_dma256::$7 = (word*)memset_dma256::f018b#0 +Constant inlined memset_dma256::$8 = (byte*)memset_dma256::f018b#0 +Constant inlined main::r#0 = 0 +Constant inlined main::logo_dest#0 = CHARSET +Constant inlined memset_dma256::$1 = >memset_dma_command256 +Constant inlined memset_dma256::$2 = SCREEN + [23] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = 0 + [24] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HIHI) = 0 + [25] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 + [26] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = >CHARSET + [27] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 + [28] call memset_dma + to:main::@13 +main::@13: scope:[main] from main::@12 + [29] phi() + [30] call memset_dma256 + to:main::@14 +main::@14: scope:[main] from main::@13 + [31] phi() + [32] call memset_dma + to:main::@1 +main::@1: scope:[main] from main::@14 main::@5 + [33] main::erow#5 = phi( main::@14/SCREEN, main::@5/main::erow#1 ) + [33] main::r#2 = phi( main::@14/0, main::@5/main::r#1 ) + [34] if(main::r#2<$19) goto main::@2 + to:main::@6 +main::@6: scope:[main] from main::@1 main::@9 + [35] main::logo_dest#5 = phi( main::@9/main::logo_dest#1, main::@1/CHARSET ) + [35] main::logo_src#5 = phi( main::@9/main::logo_src#1, main::@1/LOGO ) + [35] main::col#2 = phi( main::@9/main::col#1, main::@1/0 ) + [36] if(main::col#2<$2d) goto main::@7 + to:main::@10 +main::@10: scope:[main] from main::@10 main::@6 + [37] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR) = *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) + to:main::@10 +main::@7: scope:[main] from main::@6 main::@8 + [38] main::y#2 = phi( main::@8/main::y#1, main::@6/0 ) + [39] if(main::y#2<(byte)$19*8) goto main::@8 + to:main::@9 +main::@9: scope:[main] from main::@7 + [40] main::logo_dest#1 = main::logo_dest#5 + (word)$20*8 + [41] main::logo_src#1 = main::logo_src#5 + (byte)$19*8 + [42] main::col#1 = ++ main::col#2 + to:main::@6 +main::@8: scope:[main] from main::@7 + [43] main::logo_dest#5[main::y#2] = main::logo_src#5[main::y#2] + [44] main::y#1 = ++ main::y#2 + to:main::@7 +main::@2: scope:[main] from main::@1 + [45] main::c#0 = (word)main::r#2 + to:main::@3 +main::@3: scope:[main] from main::@2 main::@4 + [46] main::c#2 = phi( main::@2/main::c#0, main::@4/main::c#1 ) + [46] main::i#2 = phi( main::@2/0, main::@4/main::i#1 ) + [47] if(main::i#2<$2d) goto main::@4 + to:main::@5 +main::@5: scope:[main] from main::@3 + [48] main::erow#1 = main::erow#5 + $2d*SIZEOF_WORD + [49] main::r#1 = ++ main::r#2 + to:main::@1 +main::@4: scope:[main] from main::@3 + [50] main::$10 = main::i#2 << 1 + [51] main::erow#5[main::$10] = main::c#2 + [52] main::c#1 = main::c#2 + $20 + [53] main::i#1 = ++ main::i#2 + to:main::@3 + +void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset) +memoryRemap: scope:[memoryRemap] from main::@11 + [54] *memoryRemap::aVal = 0 + [55] *memoryRemap::xVal = 0 + [56] *memoryRemap::yVal = 0 + [57] *memoryRemap::zVal = 0 + asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + to:memoryRemap::@return +memoryRemap::@return: scope:[memoryRemap] from memoryRemap + [59] return + to:@return + +void memset_dma(void* memset_dma::dest , byte memset_dma::fill , word memset_dma::num) +memset_dma: scope:[memset_dma] from main::@12 main::@14 + [60] memset_dma::dest#2 = phi( main::@12/(void*)SCREEN, main::@14/(void*)CHARSET ) + [60] memset_dma::fill#2 = phi( main::@12/0, main::@14/$55 ) + [60] memset_dma::num#2 = phi( main::@12/(word)$2d*$19*2, main::@14/(word)$2d*$20*8 ) + [61] memset_dma::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) + [62] *((word*)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma::num#2 + [63] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma::fill#2 + [64] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma::dest#2 + [65] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 + [66] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 + [67] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 + [68] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >&memset_dma_command + [69] *((byte*)DMA) = <&memset_dma_command + [70] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = memset_dma::dmaMode#0 + to:memset_dma::@return +memset_dma::@return: scope:[memset_dma] from memset_dma + [71] return + to:@return + +void memset_dma256(byte memset_dma256::dest_mb , byte memset_dma256::dest_bank , void* memset_dma256::dest , byte memset_dma256::fill , word memset_dma256::num) +memset_dma256: scope:[memset_dma256] from main::@13 + [72] memset_dma256::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) + [73] *(memset_dma_command256+1) = memset_dma256::dest_mb#0 + [74] *((word*)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma256::num#0 + [75] *((byte*)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK) = memset_dma256::dest_bank#0 + [76] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma256::dest#0 + [77] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)WHITE + [78] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 + [79] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 + [80] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 + [81] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >memset_dma_command256 + [82] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ETRIG) = SCREEN [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [23] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [24] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HIHI) = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [25] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [26] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = >CHARSET [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [27] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [37] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR) = *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) [ ] ( [ ] { } ) always clobbers reg byte a +Statement [40] main::logo_dest#1 = main::logo_dest#5 + (word)$20*8 [ main::col#2 main::logo_src#5 main::logo_dest#1 ] ( [ main::col#2 main::logo_src#5 main::logo_dest#1 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:5 [ main::col#2 main::col#1 ] +Statement [41] main::logo_src#1 = main::logo_src#5 + (byte)$19*8 [ main::col#2 main::logo_src#1 main::logo_dest#1 ] ( [ main::col#2 main::logo_src#1 main::logo_dest#1 ] { } ) always clobbers reg byte a +Statement [43] main::logo_dest#5[main::y#2] = main::logo_src#5[main::y#2] [ main::col#2 main::logo_src#5 main::logo_dest#5 main::y#2 ] ( [ main::col#2 main::logo_src#5 main::logo_dest#5 main::y#2 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:10 [ main::y#2 main::y#1 ] +Statement [45] main::c#0 = (word)main::r#2 [ main::r#2 main::erow#5 main::c#0 ] ( [ main::r#2 main::erow#5 main::c#0 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::r#2 main::r#1 ] +Statement [48] main::erow#1 = main::erow#5 + $2d*SIZEOF_WORD [ main::r#2 main::erow#1 ] ( [ main::r#2 main::erow#1 ] { } ) always clobbers reg byte a +Statement [50] main::$10 = main::i#2 << 1 [ main::r#2 main::erow#5 main::i#2 main::c#2 main::$10 ] ( [ main::r#2 main::erow#5 main::i#2 main::c#2 main::$10 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:11 [ main::i#2 main::i#1 ] +Statement [51] main::erow#5[main::$10] = main::c#2 [ main::r#2 main::erow#5 main::i#2 main::c#2 ] ( [ main::r#2 main::erow#5 main::i#2 main::c#2 ] { } ) always clobbers reg byte a reg byte y +Removing always clobbered register reg byte y as potential for zp[1]:2 [ main::r#2 main::r#1 ] +Removing always clobbered register reg byte y as potential for zp[1]:11 [ main::i#2 main::i#1 ] +Statement [52] main::c#1 = main::c#2 + $20 [ main::r#2 main::erow#5 main::i#2 main::c#1 ] ( [ main::r#2 main::erow#5 main::i#2 main::c#1 ] { } ) always clobbers reg byte a +Statement [54] *memoryRemap::aVal = 0 [ ] ( memoryRemap:3 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [55] *memoryRemap::xVal = 0 [ ] ( memoryRemap:3 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [56] *memoryRemap::yVal = 0 [ ] ( memoryRemap:3 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [57] *memoryRemap::zVal = 0 [ ] ( memoryRemap:3 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } always clobbers reg byte a reg byte x reg byte y reg byte z +Statement [62] *((word*)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma::num#2 [ memset_dma::fill#2 memset_dma::dest#2 memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:28 [ memset_dma::fill#2 memset_dma::dest#2 memset_dma::dmaMode#0 memset_dma_command ] { } memset_dma:32 [ memset_dma::fill#2 memset_dma::dest#2 memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:16 [ memset_dma::fill#2 ] +Removing always clobbered register reg byte a as potential for zp[1]:20 [ memset_dma::dmaMode#0 ] +Statement [63] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma::fill#2 [ memset_dma::dest#2 memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:28 [ memset_dma::dest#2 memset_dma::dmaMode#0 memset_dma_command ] { } memset_dma:32 [ memset_dma::dest#2 memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [64] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma::dest#2 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:28 [ memset_dma::dmaMode#0 memset_dma_command ] { } memset_dma:32 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [65] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:28 [ memset_dma::dmaMode#0 memset_dma_command ] { } memset_dma:32 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [66] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:28 [ memset_dma::dmaMode#0 memset_dma_command ] { } memset_dma:32 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [67] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:28 [ memset_dma::dmaMode#0 memset_dma_command ] { } memset_dma:32 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [68] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >&memset_dma_command [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:28 [ memset_dma::dmaMode#0 memset_dma_command ] { } memset_dma:32 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [69] *((byte*)DMA) = <&memset_dma_command [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:28 [ memset_dma::dmaMode#0 memset_dma_command ] { } memset_dma:32 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [73] *(memset_dma_command256+1) = memset_dma256::dest_mb#0 [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:21 [ memset_dma256::dmaMode#0 ] +Statement [74] *((word*)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma256::num#0 [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [75] *((byte*)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK) = memset_dma256::dest_bank#0 [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [76] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma256::dest#0 [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [77] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)WHITE [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [78] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [79] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [80] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [81] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >memset_dma_command256 [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [82] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ETRIG) = SCREEN [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [23] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [24] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HIHI) = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [25] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [26] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = >CHARSET [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [27] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [37] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR) = *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) [ ] ( [ ] { } ) always clobbers reg byte a +Statement [40] main::logo_dest#1 = main::logo_dest#5 + (word)$20*8 [ main::col#2 main::logo_src#5 main::logo_dest#1 ] ( [ main::col#2 main::logo_src#5 main::logo_dest#1 ] { } ) always clobbers reg byte a +Statement [41] main::logo_src#1 = main::logo_src#5 + (byte)$19*8 [ main::col#2 main::logo_src#1 main::logo_dest#1 ] ( [ main::col#2 main::logo_src#1 main::logo_dest#1 ] { } ) always clobbers reg byte a +Statement [43] main::logo_dest#5[main::y#2] = main::logo_src#5[main::y#2] [ main::col#2 main::logo_src#5 main::logo_dest#5 main::y#2 ] ( [ main::col#2 main::logo_src#5 main::logo_dest#5 main::y#2 ] { } ) always clobbers reg byte a +Statement [45] main::c#0 = (word)main::r#2 [ main::r#2 main::erow#5 main::c#0 ] ( [ main::r#2 main::erow#5 main::c#0 ] { } ) always clobbers reg byte a +Statement [48] main::erow#1 = main::erow#5 + $2d*SIZEOF_WORD [ main::r#2 main::erow#1 ] ( [ main::r#2 main::erow#1 ] { } ) always clobbers reg byte a +Statement [50] main::$10 = main::i#2 << 1 [ main::r#2 main::erow#5 main::i#2 main::c#2 main::$10 ] ( [ main::r#2 main::erow#5 main::i#2 main::c#2 main::$10 ] { } ) always clobbers reg byte a +Statement [51] main::erow#5[main::$10] = main::c#2 [ main::r#2 main::erow#5 main::i#2 main::c#2 ] ( [ main::r#2 main::erow#5 main::i#2 main::c#2 ] { } ) always clobbers reg byte a reg byte y +Statement [52] main::c#1 = main::c#2 + $20 [ main::r#2 main::erow#5 main::i#2 main::c#1 ] ( [ main::r#2 main::erow#5 main::i#2 main::c#1 ] { } ) always clobbers reg byte a +Statement [54] *memoryRemap::aVal = 0 [ ] ( memoryRemap:3 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [55] *memoryRemap::xVal = 0 [ ] ( memoryRemap:3 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [56] *memoryRemap::yVal = 0 [ ] ( memoryRemap:3 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [57] *memoryRemap::zVal = 0 [ ] ( memoryRemap:3 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } always clobbers reg byte a reg byte x reg byte y reg byte z +Statement [62] *((word*)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma::num#2 [ memset_dma::fill#2 memset_dma::dest#2 memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:28 [ memset_dma::fill#2 memset_dma::dest#2 memset_dma::dmaMode#0 memset_dma_command ] { } memset_dma:32 [ memset_dma::fill#2 memset_dma::dest#2 memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [63] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma::fill#2 [ memset_dma::dest#2 memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:28 [ memset_dma::dest#2 memset_dma::dmaMode#0 memset_dma_command ] { } memset_dma:32 [ memset_dma::dest#2 memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [64] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma::dest#2 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:28 [ memset_dma::dmaMode#0 memset_dma_command ] { } memset_dma:32 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [65] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:28 [ memset_dma::dmaMode#0 memset_dma_command ] { } memset_dma:32 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [66] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:28 [ memset_dma::dmaMode#0 memset_dma_command ] { } memset_dma:32 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [67] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:28 [ memset_dma::dmaMode#0 memset_dma_command ] { } memset_dma:32 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [68] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >&memset_dma_command [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:28 [ memset_dma::dmaMode#0 memset_dma_command ] { } memset_dma:32 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [69] *((byte*)DMA) = <&memset_dma_command [ memset_dma::dmaMode#0 memset_dma_command ] ( memset_dma:28 [ memset_dma::dmaMode#0 memset_dma_command ] { } memset_dma:32 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [73] *(memset_dma_command256+1) = memset_dma256::dest_mb#0 [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [74] *((word*)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma256::num#0 [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [75] *((byte*)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK) = memset_dma256::dest_bank#0 [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [76] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma256::dest#0 [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [77] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)WHITE [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [78] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [79] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [80] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [81] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >memset_dma_command256 [ memset_dma256::dmaMode#0 ] ( memset_dma256:30 [ memset_dma_command memset_dma256::dmaMode#0 ] { } ) always clobbers reg byte a +Statement [82] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ETRIG) = main::@11] + __b11_from_SEI1: + jmp __b11 + // main::@11 + __b11: + // [3] call memoryRemap + // Map memory to BANK 0 : 0x00XXXX - giving access to I/O + jsr memoryRemap + jmp __b12 + // main::@12 + __b12: + // [4] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_LO) = 0 -- _deref_pbuc1=vbuc2 + // Set sideborder width=0, disable raster delay and hot registers + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_LO + // [5] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_HI) = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_HI + // [6] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_LO) = 0 -- _deref_pbuc1=vbuc2 + // Disable top/bottom borders + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_LO + // [7] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_HI) = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_HI + // [8] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_LO) = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_LO + // [9] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_HI) = 2 -- _deref_pbuc1=vbuc2 + lda #2 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_HI + // [10] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) | $40 -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 + // Enable 48MHz fast mode + lda #$40 + ora VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + // [11] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) | $40 -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 + lda #$40 + ora VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + // [12] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = $47 -- _deref_pbuc1=vbuc2 + // Enable the VIC 4 + lda #$47 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY + // [13] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = $53 -- _deref_pbuc1=vbuc2 + lda #$53 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY + // [14] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) | 1 -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 + // Enable Super Extended Attribute Mode + lda #1 + ora VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + // [15] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) & $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2 + // Mode 40x25 chars - will be 45*25 when utilizing the borders + lda #$7f + and VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + // [16] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO) = $5a -- _deref_pbuc1=vbuc2 + lda #$5a + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO + // [17] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI) = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI + // [18] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_LO) = $28 -- _deref_pbuc1=vbuc2 + // Start text in the left border + lda #$28 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_LO + // [19] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_HI) = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_HI + // [20] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT) = $2d -- _deref_pbuc1=vbuc2 + // Set number of characters to display per row + lda #$2d + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT + // [21] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO) = 0 -- _deref_pbuc1=vbuc2 + // Set exact screen address + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO + // [22] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI) = >SCREEN -- _deref_pbuc1=vbuc2 + lda #>SCREEN + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI + // [23] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO + // [24] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HIHI) = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HIHI + // [25] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 -- _deref_pbuc1=vbuc2 + // Set exact charset address + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO + // [26] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = >CHARSET -- _deref_pbuc1=vbuc2 + lda #>CHARSET + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI + // [27] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO + // [28] call memset_dma + // Fill the screen with 0 + // [60] phi from main::@12 to memset_dma [phi:main::@12->memset_dma] + memset_dma_from___b12: + // [60] phi memset_dma::dest#2 = (void*)SCREEN [phi:main::@12->memset_dma#0] -- pvoz1=pvoc1 + lda #SCREEN + sta.z memset_dma.dest+1 + // [60] phi memset_dma::fill#2 = 0 [phi:main::@12->memset_dma#1] -- vbuzz=vbuc1 + ldz #0 + // [60] phi memset_dma::num#2 = (word)$2d*$19*2 [phi:main::@12->memset_dma#2] -- vwuz1=vwuc1 + lda #<$2d*$19*2 + sta.z memset_dma.num + lda #>$2d*$19*2 + sta.z memset_dma.num+1 + jsr memset_dma + // [29] phi from main::@12 to main::@13 [phi:main::@12->main::@13] + __b13_from___b12: + jmp __b13 + // main::@13 + __b13: + // [30] call memset_dma256 + // Fill the colours with WHITE - directly into $ff80000 + jsr memset_dma256 + // [31] phi from main::@13 to main::@14 [phi:main::@13->main::@14] + __b14_from___b13: + jmp __b14 + // main::@14 + __b14: + // [32] call memset_dma + // Fill the charset with 0x55 + // [60] phi from main::@14 to memset_dma [phi:main::@14->memset_dma] + memset_dma_from___b14: + // [60] phi memset_dma::dest#2 = (void*)CHARSET [phi:main::@14->memset_dma#0] -- pvoz1=pvoc1 + lda #CHARSET + sta.z memset_dma.dest+1 + // [60] phi memset_dma::fill#2 = $55 [phi:main::@14->memset_dma#1] -- vbuzz=vbuc1 + ldz #$55 + // [60] phi memset_dma::num#2 = (word)$2d*$20*8 [phi:main::@14->memset_dma#2] -- vwuz1=vwuc1 + lda #<$2d*$20*8 + sta.z memset_dma.num + lda #>$2d*$20*8 + sta.z memset_dma.num+1 + jsr memset_dma + // [33] phi from main::@14 to main::@1 [phi:main::@14->main::@1] + __b1_from___b14: + // [33] phi main::erow#5 = SCREEN [phi:main::@14->main::@1#0] -- pwuz1=pbuc1 + lda #SCREEN + sta.z erow+1 + // [33] phi main::r#2 = 0 [phi:main::@14->main::@1#1] -- vbuxx=vbuc1 + ldx #0 + jmp __b1 + // main::@1 + __b1: + // [34] if(main::r#2<$19) goto main::@2 -- vbuxx_lt_vbuc1_then_la1 + cpx #$19 + bcc __b2 + // [35] phi from main::@1 to main::@6 [phi:main::@1->main::@6] + __b6_from___b1: + // [35] phi main::logo_dest#5 = CHARSET [phi:main::@1->main::@6#0] -- pbuz1=pbuc1 + lda #CHARSET + sta.z logo_dest+1 + // [35] phi main::logo_src#5 = LOGO [phi:main::@1->main::@6#1] -- pbuz1=pbuc1 + lda #LOGO + sta.z logo_src+1 + // [35] phi main::col#2 = 0 [phi:main::@1->main::@6#2] -- vbuxx=vbuc1 + ldx #0 + jmp __b6 + // main::@6 + __b6: + // [36] if(main::col#2<$2d) goto main::@7 -- vbuxx_lt_vbuc1_then_la1 + cpx #$2d + bcc __b7_from___b6 + jmp __b10 + // main::@10 + __b10: + // [37] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR) = *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) -- _deref_pbuc1=_deref_pbuc2 + lda VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR + jmp __b10 + // [38] phi from main::@6 to main::@7 [phi:main::@6->main::@7] + __b7_from___b6: + // [38] phi main::y#2 = 0 [phi:main::@6->main::@7#0] -- vbuyy=vbuc1 + ldy #0 + jmp __b7 + // main::@7 + __b7: + // [39] if(main::y#2<(byte)$19*8) goto main::@8 -- vbuyy_lt_vbuc1_then_la1 + cpy #$19*8 + bcc __b8 + jmp __b9 + // main::@9 + __b9: + // [40] main::logo_dest#1 = main::logo_dest#5 + (word)$20*8 -- pbuz1=pbuz1_plus_vwuc1 + clc + lda.z logo_dest + adc #<$20*8 + sta.z logo_dest + lda.z logo_dest+1 + adc #>$20*8 + sta.z logo_dest+1 + // [41] main::logo_src#1 = main::logo_src#5 + (byte)$19*8 -- pbuz1=pbuz1_plus_vbuc1 + lda #$19*8 + clc + adc.z logo_src + sta.z logo_src + bcc !+ + inc.z logo_src+1 + !: + // [42] main::col#1 = ++ main::col#2 -- vbuxx=_inc_vbuxx + inx + // [35] phi from main::@9 to main::@6 [phi:main::@9->main::@6] + __b6_from___b9: + // [35] phi main::logo_dest#5 = main::logo_dest#1 [phi:main::@9->main::@6#0] -- register_copy + // [35] phi main::logo_src#5 = main::logo_src#1 [phi:main::@9->main::@6#1] -- register_copy + // [35] phi main::col#2 = main::col#1 [phi:main::@9->main::@6#2] -- register_copy + jmp __b6 + // main::@8 + __b8: + // [43] main::logo_dest#5[main::y#2] = main::logo_src#5[main::y#2] -- pbuz1_derefidx_vbuyy=pbuz2_derefidx_vbuyy + lda (logo_src),y + sta (logo_dest),y + // [44] main::y#1 = ++ main::y#2 -- vbuyy=_inc_vbuyy + iny + // [38] phi from main::@8 to main::@7 [phi:main::@8->main::@7] + __b7_from___b8: + // [38] phi main::y#2 = main::y#1 [phi:main::@8->main::@7#0] -- register_copy + jmp __b7 + // main::@2 + __b2: + // [45] main::c#0 = (word)main::r#2 -- vwuz1=_word_vbuxx + txa + sta.z c + lda #0 + sta.z c+1 + // [46] phi from main::@2 to main::@3 [phi:main::@2->main::@3] + __b3_from___b2: + // [46] phi main::c#2 = main::c#0 [phi:main::@2->main::@3#0] -- register_copy + // [46] phi main::i#2 = 0 [phi:main::@2->main::@3#1] -- vbuzz=vbuc1 + ldz #0 + jmp __b3 + // main::@3 + __b3: + // [47] if(main::i#2<$2d) goto main::@4 -- vbuzz_lt_vbuc1_then_la1 + cpz #$2d + bcc __b4 + jmp __b5 + // main::@5 + __b5: + // [48] main::erow#1 = main::erow#5 + $2d*SIZEOF_WORD -- pwuz1=pwuz1_plus_vbuc1 + lda #$2d*SIZEOF_WORD + clc + adc.z erow + sta.z erow + bcc !+ + inc.z erow+1 + !: + // [49] main::r#1 = ++ main::r#2 -- vbuxx=_inc_vbuxx + inx + // [33] phi from main::@5 to main::@1 [phi:main::@5->main::@1] + __b1_from___b5: + // [33] phi main::erow#5 = main::erow#1 [phi:main::@5->main::@1#0] -- register_copy + // [33] phi main::r#2 = main::r#1 [phi:main::@5->main::@1#1] -- register_copy + jmp __b1 + // main::@4 + __b4: + // [50] main::$10 = main::i#2 << 1 -- vbuaa=vbuzz_rol_1 + tza + asl + // [51] main::erow#5[main::$10] = main::c#2 -- pwuz1_derefidx_vbuaa=vwuz2 + tay + lda.z c + sta (erow),y + iny + lda.z c+1 + sta (erow),y + // [52] main::c#1 = main::c#2 + $20 -- vwuz1=vwuz1_plus_vbuc1 + lda #$20 + clc + adc.z c + sta.z c + bcc !+ + inc.z c+1 + !: + // [53] main::i#1 = ++ main::i#2 -- vbuzz=_inc_vbuzz + inz + // [46] phi from main::@4 to main::@3 [phi:main::@4->main::@3] + __b3_from___b4: + // [46] phi main::c#2 = main::c#1 [phi:main::@4->main::@3#0] -- register_copy + // [46] phi main::i#2 = main::i#1 [phi:main::@4->main::@3#1] -- register_copy + jmp __b3 +} + // memoryRemap +// Remap some of the eight 8K memory blocks in the 64K address space of the 6502 to point somewhere else in the first 1MB memory space of the MEGA65. +// After the remapping the CPU will access the mapped memory whenever it uses instructions that access a remapped block. +// See section 2.3.4 in http://www.zimmers.net/cbmpics/cbm/c65/c65manual.txt for a description of the CPU memory remapper of the C65. +// remapBlocks: Indicates which 8K blocks of the 6502 address space to remap. Each bit represents one 8K block +// - bit 0 Memory block $0000-$1fff. Use constant MEMORYBLOCK_0000. +// - bit 1 Memory block $2000-$3fff. Use constant MEMORYBLOCK_2000. +// - bit 2 Memory block $4000-$5fff. Use constant MEMORYBLOCK_4000. +// - bit 3 Memory block $6000-$7fff. Use constant MEMORYBLOCK_6000. +// - bit 4 Memory block $8000-$9fff. Use constant MEMORYBLOCK_8000. +// - bit 5 Memory block $a000-$bfff. Use constant MEMORYBLOCK_A000. +// - bit 6 Memory block $c000-$dfff. Use constant MEMORYBLOCK_C000. +// - bit 7 Memory block $e000-$ffff. Use constant MEMORYBLOCK_E000. +// lowerPageOffset: Offset that will be added to any remapped blocks in the lower 32K of memory (block 0-3). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 0 ($0000-$1fff) is remapped it will point to lowerPageOffset*$100. +// - If block 1 ($2000-$3fff) is remapped it will point to lowerPageOffset*$100 + $2000. +// - If block 2 ($4000-$5fff) is remapped it will point to lowerPageOffset*$100 + $4000. +// - If block 3 ($6000-$7fff) is remapped it will point to lowerPageOffset*$100 + $6000. +// upperPageOffset: Offset that will be added to any remapped blocks in the upper 32K of memory (block 4-7). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 4 ($8000-$9fff) is remapped it will point to upperPageOffset*$100 + $8000 +// - If block 5 ($a000-$bfff) is remapped it will point to upperPageOffset*$100 + $a000. +// - If block 6 ($c000-$dfff) is remapped it will point to upperPageOffset*$100 + $c000. +// - If block 7 ($e000-$ffff) is remapped it will point to upperPageOffset*$100 + $e000. +memoryRemap: { + .label aVal = $fc + .label xVal = $fd + .label yVal = $fe + .label zVal = $ff + // [54] *memoryRemap::aVal = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta aVal + // [55] *memoryRemap::xVal = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta xVal + // [56] *memoryRemap::yVal = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta yVal + // [57] *memoryRemap::zVal = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta zVal + // asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + lda aVal + ldx xVal + ldy yVal + ldz zVal + map + eom + jmp __breturn + // memoryRemap::@return + __breturn: + // [59] return + rts +} + // memset_dma +// Fill a memory block within the first 64K memory space using MEGA65 DMagic DMA +// Fills the values of num bytes at the destination with a single byte value. +// - dest The destination address (within the MB and bank) +// - fill The char to fill with +// - num The number of bytes to copy +// memset_dma(void* zp($c) dest, byte register(Z) fill, word zp($a) num) +memset_dma: { + .label num = $a + .label dest = $c + // [61] memset_dma::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) -- vbuxx=_deref_pbuc1 + // Remember current F018 A/B mode + ldx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // [62] *((word*)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma::num#2 -- _deref_pwuc1=vwuz1 + // Set up command + lda.z num + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT + lda.z num+1 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT+1 + // [63] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma::fill#2 -- _deref_qbuc1=_ptr_vbuzz + tza + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC + lda #0 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC+1 + // [64] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma::dest#2 -- _deref_qbuc1=pbuz1 + lda.z dest + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST + lda.z dest+1 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST+1 + // [65] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 -- _deref_pbuc1=vbuc2 + // Set F018B mode + lda #1 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // [66] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 -- _deref_pbuc1=vbuc2 + // Set address of DMA list + lda #0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB + // [67] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK + // [68] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >&memset_dma_command -- _deref_pbuc1=vbuc2 + lda #>memset_dma_command + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB + // [69] *((byte*)DMA) = <&memset_dma_command -- _deref_pbuc1=vbuc2 + // Trigger the DMA (without option lists) + lda #num + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_COUNT+1 + // [75] *((byte*)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK) = memset_dma256::dest_bank#0 -- _deref_pbuc1=vbuc2 + lda #dest_bank + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK + // [76] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma256::dest#0 -- _deref_qbuc1=pbuc2 + lda #dest + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_DEST+1 + // [77] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)WHITE -- _deref_qbuc1=pbuc2 + // Set fill byte + lda #WHITE + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_SRC+1 + // [78] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 -- _deref_pbuc1=vbuc2 + // Set F018B mode + lda #1 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // [79] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 -- _deref_pbuc1=vbuc2 + // Set address of DMA list + lda #0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB + // [80] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK + // [81] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >memset_dma_command256 -- _deref_pbuc1=vbuc2 + lda #>memset_dma_command256 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB + // [82] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ETRIG) = main::@11] + // main::@11 + // memoryRemap(0,0,0) + // [3] call memoryRemap + // Map memory to BANK 0 : 0x00XXXX - giving access to I/O + jsr memoryRemap + // main::@12 + // VICIV->SIDBDRWD_LO = 0 + // [4] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_LO) = 0 -- _deref_pbuc1=vbuc2 + // Set sideborder width=0, disable raster delay and hot registers + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_LO + // VICIV->SIDBDRWD_HI = 0 + // [5] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_HI) = 0 -- _deref_pbuc1=vbuc2 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_HI + // VICIV->TBDRPOS_LO = 0 + // [6] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_LO) = 0 -- _deref_pbuc1=vbuc2 + // Disable top/bottom borders + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_LO + // VICIV->TBDRPOS_HI = 0 + // [7] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_HI) = 0 -- _deref_pbuc1=vbuc2 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_HI + // VICIV->BBDRPOS_LO = 0 + // [8] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_LO) = 0 -- _deref_pbuc1=vbuc2 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_LO + // VICIV->BBDRPOS_HI = 2 + // [9] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_HI) = 2 -- _deref_pbuc1=vbuc2 + lda #2 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_HI + // VICIV->CONTROLB |= 0x40 + // [10] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) | $40 -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 + // Enable 48MHz fast mode + lda #$40 + ora VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + // VICIV->CONTROLC |= 0x40 + // [11] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) | $40 -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 + lda #$40 + ora VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + // VICIV->KEY = 0x47 + // [12] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = $47 -- _deref_pbuc1=vbuc2 + // Enable the VIC 4 + lda #$47 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY + // VICIV->KEY = 0x53 + // [13] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = $53 -- _deref_pbuc1=vbuc2 + lda #$53 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY + // VICIV->CONTROLC |= 1 + // [14] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) | 1 -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 + // Enable Super Extended Attribute Mode + lda #1 + ora VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + // VICIV->CONTROLB &= 0x7f + // [15] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) & $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2 + // Mode 40x25 chars - will be 45*25 when utilizing the borders + lda #$7f + and VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + // VICIV->CHARSTEP_LO = 90 + // [16] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO) = $5a -- _deref_pbuc1=vbuc2 + lda #$5a + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO + // VICIV->CHARSTEP_HI = 0 + // [17] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI) = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI + // VICIV->TEXTXPOS_LO = 40 + // [18] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_LO) = $28 -- _deref_pbuc1=vbuc2 + // Start text in the left border + lda #$28 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_LO + // VICIV->TEXTXPOS_HI = 0 + // [19] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_HI) = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_HI + // VICIV->CHRCOUNT = 45 + // [20] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT) = $2d -- _deref_pbuc1=vbuc2 + // Set number of characters to display per row + lda #$2d + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT + // VICIV->SCRNPTR_LOLO = SCRNPTR_LOHI = >SCREEN + // [22] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI) = >SCREEN -- _deref_pbuc1=vbuc2 + lda #>SCREEN + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI + // VICIV->SCRNPTR_HILO = 0 + // [23] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO + // VICIV->SCRNPTR_HIHI = 0 + // [24] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HIHI) = 0 -- _deref_pbuc1=vbuc2 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HIHI + // VICIV->CHARPTR_LOLO = CHARPTR_LOHI = >CHARSET + // [26] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = >CHARSET -- _deref_pbuc1=vbuc2 + lda #>CHARSET + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI + // VICIV->CHARPTR_HILO = 0 + // [27] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO + // memset_dma(SCREEN, 0, 45*25*2) + // [28] call memset_dma + // Fill the screen with 0 + // [60] phi from main::@12 to memset_dma [phi:main::@12->memset_dma] + // [60] phi memset_dma::dest#2 = (void*)SCREEN [phi:main::@12->memset_dma#0] -- pvoz1=pvoc1 + lda #SCREEN + sta.z memset_dma.dest+1 + // [60] phi memset_dma::fill#2 = 0 [phi:main::@12->memset_dma#1] -- vbuzz=vbuc1 + ldz #0 + // [60] phi memset_dma::num#2 = (word)$2d*$19*2 [phi:main::@12->memset_dma#2] -- vwuz1=vwuc1 + lda #<$2d*$19*2 + sta.z memset_dma.num + lda #>$2d*$19*2 + sta.z memset_dma.num+1 + jsr memset_dma + // [29] phi from main::@12 to main::@13 [phi:main::@12->main::@13] + // main::@13 + // memset_dma256(0xff,0x08,0x0000, WHITE, 45*25*2) + // [30] call memset_dma256 + // Fill the colours with WHITE - directly into $ff80000 + jsr memset_dma256 + // [31] phi from main::@13 to main::@14 [phi:main::@13->main::@14] + // main::@14 + // memset_dma(CHARSET, 0x55, 45*32*8) + // [32] call memset_dma + // Fill the charset with 0x55 + // [60] phi from main::@14 to memset_dma [phi:main::@14->memset_dma] + // [60] phi memset_dma::dest#2 = (void*)CHARSET [phi:main::@14->memset_dma#0] -- pvoz1=pvoc1 + lda #CHARSET + sta.z memset_dma.dest+1 + // [60] phi memset_dma::fill#2 = $55 [phi:main::@14->memset_dma#1] -- vbuzz=vbuc1 + ldz #$55 + // [60] phi memset_dma::num#2 = (word)$2d*$20*8 [phi:main::@14->memset_dma#2] -- vwuz1=vwuc1 + lda #<$2d*$20*8 + sta.z memset_dma.num + lda #>$2d*$20*8 + sta.z memset_dma.num+1 + jsr memset_dma + // [33] phi from main::@14 to main::@1 [phi:main::@14->main::@1] + // [33] phi main::erow#5 = SCREEN [phi:main::@14->main::@1#0] -- pwuz1=pbuc1 + lda #SCREEN + sta.z erow+1 + // [33] phi main::r#2 = 0 [phi:main::@14->main::@1#1] -- vbuxx=vbuc1 + ldx #0 + // main::@1 + __b1: + // for(char r=0; r<25; r++) + // [34] if(main::r#2<$19) goto main::@2 -- vbuxx_lt_vbuc1_then_la1 + cpx #$19 + bcc __b2 + // [35] phi from main::@1 to main::@6 [phi:main::@1->main::@6] + // [35] phi main::logo_dest#5 = CHARSET [phi:main::@1->main::@6#0] -- pbuz1=pbuc1 + lda #CHARSET + sta.z logo_dest+1 + // [35] phi main::logo_src#5 = LOGO [phi:main::@1->main::@6#1] -- pbuz1=pbuc1 + lda #LOGO + sta.z logo_src+1 + // [35] phi main::col#2 = 0 [phi:main::@1->main::@6#2] -- vbuxx=vbuc1 + ldx #0 + // main::@6 + __b6: + // for(char col=0;col<45;col++) + // [36] if(main::col#2<$2d) goto main::@7 -- vbuxx_lt_vbuc1_then_la1 + cpx #$2d + bcc __b5 + // main::@10 + __b10: + // VICIV->BG_COLOR = VICII->RASTER + // [37] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR) = *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) -- _deref_pbuc1=_deref_pbuc2 + lda VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR + jmp __b10 + // [38] phi from main::@6 to main::@7 [phi:main::@6->main::@7] + __b5: + // [38] phi main::y#2 = 0 [phi:main::@6->main::@7#0] -- vbuyy=vbuc1 + ldy #0 + // main::@7 + __b7: + // for(char y=0;y<25*8;y++) + // [39] if(main::y#2<(byte)$19*8) goto main::@8 -- vbuyy_lt_vbuc1_then_la1 + cpy #$19*8 + bcc __b8 + // main::@9 + // logo_dest += 32*8 + // [40] main::logo_dest#1 = main::logo_dest#5 + (word)$20*8 -- pbuz1=pbuz1_plus_vwuc1 + clc + lda.z logo_dest + adc #<$20*8 + sta.z logo_dest + lda.z logo_dest+1 + adc #>$20*8 + sta.z logo_dest+1 + // logo_src += 25*8 + // [41] main::logo_src#1 = main::logo_src#5 + (byte)$19*8 -- pbuz1=pbuz1_plus_vbuc1 + lda #$19*8 + clc + adc.z logo_src + sta.z logo_src + bcc !+ + inc.z logo_src+1 + !: + // for(char col=0;col<45;col++) + // [42] main::col#1 = ++ main::col#2 -- vbuxx=_inc_vbuxx + inx + // [35] phi from main::@9 to main::@6 [phi:main::@9->main::@6] + // [35] phi main::logo_dest#5 = main::logo_dest#1 [phi:main::@9->main::@6#0] -- register_copy + // [35] phi main::logo_src#5 = main::logo_src#1 [phi:main::@9->main::@6#1] -- register_copy + // [35] phi main::col#2 = main::col#1 [phi:main::@9->main::@6#2] -- register_copy + jmp __b6 + // main::@8 + __b8: + // logo_dest[y] = logo_src[y] + // [43] main::logo_dest#5[main::y#2] = main::logo_src#5[main::y#2] -- pbuz1_derefidx_vbuyy=pbuz2_derefidx_vbuyy + lda (logo_src),y + sta (logo_dest),y + // for(char y=0;y<25*8;y++) + // [44] main::y#1 = ++ main::y#2 -- vbuyy=_inc_vbuyy + iny + // [38] phi from main::@8 to main::@7 [phi:main::@8->main::@7] + // [38] phi main::y#2 = main::y#1 [phi:main::@8->main::@7#0] -- register_copy + jmp __b7 + // main::@2 + __b2: + // c = r + // [45] main::c#0 = (word)main::r#2 -- vwuz1=_word_vbuxx + txa + sta.z c + lda #0 + sta.z c+1 + // [46] phi from main::@2 to main::@3 [phi:main::@2->main::@3] + // [46] phi main::c#2 = main::c#0 [phi:main::@2->main::@3#0] -- register_copy + // [46] phi main::i#2 = 0 [phi:main::@2->main::@3#1] -- vbuzz=vbuc1 + ldz #0 + // main::@3 + __b3: + // for(char i=0; i<45; i++) + // [47] if(main::i#2<$2d) goto main::@4 -- vbuzz_lt_vbuc1_then_la1 + cpz #$2d + bcc __b4 + // main::@5 + // erow += 45 + // [48] main::erow#1 = main::erow#5 + $2d*SIZEOF_WORD -- pwuz1=pwuz1_plus_vbuc1 + lda #$2d*SIZEOF_WORD + clc + adc.z erow + sta.z erow + bcc !+ + inc.z erow+1 + !: + // for(char r=0; r<25; r++) + // [49] main::r#1 = ++ main::r#2 -- vbuxx=_inc_vbuxx + inx + // [33] phi from main::@5 to main::@1 [phi:main::@5->main::@1] + // [33] phi main::erow#5 = main::erow#1 [phi:main::@5->main::@1#0] -- register_copy + // [33] phi main::r#2 = main::r#1 [phi:main::@5->main::@1#1] -- register_copy + jmp __b1 + // main::@4 + __b4: + // erow[i] = c + // [50] main::$10 = main::i#2 << 1 -- vbuaa=vbuzz_rol_1 + tza + asl + // [51] main::erow#5[main::$10] = main::c#2 -- pwuz1_derefidx_vbuaa=vwuz2 + tay + lda.z c + sta (erow),y + iny + lda.z c+1 + sta (erow),y + // c += 32 + // [52] main::c#1 = main::c#2 + $20 -- vwuz1=vwuz1_plus_vbuc1 + lda #$20 + clc + adc.z c + sta.z c + bcc !+ + inc.z c+1 + !: + // for(char i=0; i<45; i++) + // [53] main::i#1 = ++ main::i#2 -- vbuzz=_inc_vbuzz + inz + // [46] phi from main::@4 to main::@3 [phi:main::@4->main::@3] + // [46] phi main::c#2 = main::c#1 [phi:main::@4->main::@3#0] -- register_copy + // [46] phi main::i#2 = main::i#1 [phi:main::@4->main::@3#1] -- register_copy + jmp __b3 +} + // memoryRemap +// Remap some of the eight 8K memory blocks in the 64K address space of the 6502 to point somewhere else in the first 1MB memory space of the MEGA65. +// After the remapping the CPU will access the mapped memory whenever it uses instructions that access a remapped block. +// See section 2.3.4 in http://www.zimmers.net/cbmpics/cbm/c65/c65manual.txt for a description of the CPU memory remapper of the C65. +// remapBlocks: Indicates which 8K blocks of the 6502 address space to remap. Each bit represents one 8K block +// - bit 0 Memory block $0000-$1fff. Use constant MEMORYBLOCK_0000. +// - bit 1 Memory block $2000-$3fff. Use constant MEMORYBLOCK_2000. +// - bit 2 Memory block $4000-$5fff. Use constant MEMORYBLOCK_4000. +// - bit 3 Memory block $6000-$7fff. Use constant MEMORYBLOCK_6000. +// - bit 4 Memory block $8000-$9fff. Use constant MEMORYBLOCK_8000. +// - bit 5 Memory block $a000-$bfff. Use constant MEMORYBLOCK_A000. +// - bit 6 Memory block $c000-$dfff. Use constant MEMORYBLOCK_C000. +// - bit 7 Memory block $e000-$ffff. Use constant MEMORYBLOCK_E000. +// lowerPageOffset: Offset that will be added to any remapped blocks in the lower 32K of memory (block 0-3). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 0 ($0000-$1fff) is remapped it will point to lowerPageOffset*$100. +// - If block 1 ($2000-$3fff) is remapped it will point to lowerPageOffset*$100 + $2000. +// - If block 2 ($4000-$5fff) is remapped it will point to lowerPageOffset*$100 + $4000. +// - If block 3 ($6000-$7fff) is remapped it will point to lowerPageOffset*$100 + $6000. +// upperPageOffset: Offset that will be added to any remapped blocks in the upper 32K of memory (block 4-7). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 4 ($8000-$9fff) is remapped it will point to upperPageOffset*$100 + $8000 +// - If block 5 ($a000-$bfff) is remapped it will point to upperPageOffset*$100 + $a000. +// - If block 6 ($c000-$dfff) is remapped it will point to upperPageOffset*$100 + $c000. +// - If block 7 ($e000-$ffff) is remapped it will point to upperPageOffset*$100 + $e000. +memoryRemap: { + .label aVal = $fc + .label xVal = $fd + .label yVal = $fe + .label zVal = $ff + // *aVal = lowerPageOffset & 0xf) + // [55] *memoryRemap::xVal = 0 -- _deref_pbuc1=vbuc2 + sta xVal + // *yVal = upperPageOffset & 0xf) + // [57] *memoryRemap::zVal = 0 -- _deref_pbuc1=vbuc2 + sta zVal + // asm + // asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + lda aVal + ldx xVal + ldy yVal + ldz zVal + map + eom + // memoryRemap::@return + // } + // [59] return + rts +} + // memset_dma +// Fill a memory block within the first 64K memory space using MEGA65 DMagic DMA +// Fills the values of num bytes at the destination with a single byte value. +// - dest The destination address (within the MB and bank) +// - fill The char to fill with +// - num The number of bytes to copy +// memset_dma(void* zp($c) dest, byte register(Z) fill, word zp($a) num) +memset_dma: { + .label num = $a + .label dest = $c + // dmaMode = DMA->EN018B + // [61] memset_dma::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) -- vbuxx=_deref_pbuc1 + // Remember current F018 A/B mode + ldx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // memset_dma_command.count = num + // [62] *((word*)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma::num#2 -- _deref_pwuc1=vwuz1 + // Set up command + lda.z num + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT + lda.z num+1 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT+1 + // memset_dma_command.src = (char*)fill + // [63] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)memset_dma::fill#2 -- _deref_qbuc1=_ptr_vbuzz + tza + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC + lda #0 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC+1 + // memset_dma_command.dest = dest + // [64] *((byte**)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma::dest#2 -- _deref_qbuc1=pbuz1 + lda.z dest + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST + lda.z dest+1 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST+1 + // DMA->EN018B = 1 + // [65] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 -- _deref_pbuc1=vbuc2 + // Set F018B mode + lda #1 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // DMA->ADDRMB = 0 + // [66] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 -- _deref_pbuc1=vbuc2 + // Set address of DMA list + lda #0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB + // DMA->ADDRBANK = 0 + // [67] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 -- _deref_pbuc1=vbuc2 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK + // DMA-> ADDRMSB = >&memset_dma_command + // [68] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >&memset_dma_command -- _deref_pbuc1=vbuc2 + lda #>memset_dma_command + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB + // DMA-> ADDRLSBTRIG = <&memset_dma_command + // [69] *((byte*)DMA) = <&memset_dma_command -- _deref_pbuc1=vbuc2 + // Trigger the DMA (without option lists) + lda #EN018B = dmaMode + // [70] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = memset_dma::dmaMode#0 -- _deref_pbuc1=vbuxx + // Re-enable F018A mode + stx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // memset_dma::@return + // } + // [71] return + rts +} + // memset_dma256 +// Set a memory block anywhere in the entire 256MB memory space using MEGA65 DMagic DMA +// Sets the values of num bytes to the memory block pointed to by destination. +// - dest_mb The MB value for the destination (0-255) +// - dest_bank The 64KB bank for the destination (0-15) +// - dest The destination address (within the MB and bank) +// - num The number of bytes to copy +memset_dma256: { + .const dest_mb = $ff + .const dest_bank = 8 + .const num = $2d*$19*2 + .label dest = 0 + .label f018b = memset_dma_command256+4 + // dmaMode = DMA->EN018B + // [72] memset_dma256::dmaMode#0 = *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) -- vbuxx=_deref_pbuc1 + // Remember current F018 A/B mode + ldx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // memset_dma_command256[1] = dest_mb + // [73] *(memset_dma_command256+1) = memset_dma256::dest_mb#0 -- _deref_pbuc1=vbuc2 + // Set up command + lda #dest_mb + sta memset_dma_command256+1 + // f018b->count = num + // [74] *((word*)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma256::num#0 -- _deref_pwuc1=vwuc2 + lda #num + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_COUNT+1 + // f018b->dest_bank = dest_bank + // [75] *((byte*)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK) = memset_dma256::dest_bank#0 -- _deref_pbuc1=vbuc2 + lda #dest_bank + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK + // f018b->dest = dest + // [76] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (byte*)memset_dma256::dest#0 -- _deref_qbuc1=pbuc2 + lda #dest + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_DEST+1 + // f018b->src = (char*)fill + // [77] *((byte**)memset_dma256::f018b#0+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (byte*)WHITE -- _deref_qbuc1=pbuc2 + // Set fill byte + lda #WHITE + sta f018b+OFFSET_STRUCT_DMA_LIST_F018B_SRC+1 + // DMA->EN018B = 1 + // [78] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 -- _deref_pbuc1=vbuc2 + // Set F018B mode + lda #1 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // DMA->ADDRMB = 0 + // [79] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 -- _deref_pbuc1=vbuc2 + // Set address of DMA list + lda #0 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB + // DMA->ADDRBANK = 0 + // [80] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 -- _deref_pbuc1=vbuc2 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK + // DMA-> ADDRMSB = >memset_dma_command256 + // [81] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = >memset_dma_command256 -- _deref_pbuc1=vbuc2 + lda #>memset_dma_command256 + sta DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB + // DMA-> ETRIG = EN018B = dmaMode + // [83] *((byte*)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = memset_dma256::dmaMode#0 -- _deref_pbuc1=vbuxx + // Re-enable F018A mode + stx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // memset_dma256::@return + // } + // [84] return + rts +} + // File Data +.segment Data + // DMA list entry with options for setting data in the 256MB memory space + // Contains DMA options options for setting MB followed by DMA_LIST_F018B struct. + memset_dma_command256: .byte DMA_OPTION_DEST_MB, 0, DMA_OPTION_FORMAT_F018B, DMA_OPTION_END, DMA_COMMAND_FILL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + // A logo in column-wide linear single-color memory layout +LOGO: +.var pic = LoadPicture("camelot.png", List().add($ffffff, $000000)) + .for (var x=0;x<45; x++) + .for (var y=0; y<25*8; y++) + .byte pic.getSinglecolorByte(x,y) + + // DMA list entry for filling data + memset_dma_command: .byte DMA_COMMAND_FILL + .word 0, 0 + .byte 0 + .word 0 + .byte 0, 0 + .word 0 + diff --git a/src/test/ref/examples/mega65/dypp65.sym b/src/test/ref/examples/mega65/dypp65.sym new file mode 100644 index 000000000..340719814 --- /dev/null +++ b/src/test/ref/examples/mega65/dypp65.sym @@ -0,0 +1,124 @@ +const nomodify byte* CHARSET = (byte*) 24576 +const nomodify struct F018_DMAGIC* DMA = (struct F018_DMAGIC*) 55040 +const nomodify byte DMA_COMMAND_FILL = 3 +const nomodify byte DMA_OPTION_DEST_MB = $81 +const nomodify byte DMA_OPTION_END = 0 +const nomodify byte DMA_OPTION_FORMAT_F018B = $a +const byte* LOGO[$2d*$19*8] = kickasm {{ .var pic = LoadPicture("camelot.png", List().add($ffffff, $000000)) + .for (var x=0;x<45; x++) + .for (var y=0; y<25*8; y++) + .byte pic.getSinglecolorByte(x,y) + }} +const byte OFFSET_STRUCT_DMA_LIST_F018B_COUNT = 1 +const byte OFFSET_STRUCT_DMA_LIST_F018B_DEST = 6 +const byte OFFSET_STRUCT_DMA_LIST_F018B_DEST_BANK = 8 +const byte OFFSET_STRUCT_DMA_LIST_F018B_SRC = 3 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4 +const byte OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1 +const byte OFFSET_STRUCT_F018_DMAGIC_EN018B = 3 +const byte OFFSET_STRUCT_F018_DMAGIC_ETRIG = 5 +const byte OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_HI = $4b +const byte OFFSET_STRUCT_MEGA65_VICIV_BBDRPOS_LO = $4a +const byte OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR = $21 +const byte OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO = $6a +const byte OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI = $69 +const byte OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO = $68 +const byte OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI = $59 +const byte OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO = $58 +const byte OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT = $5e +const byte OFFSET_STRUCT_MEGA65_VICIV_CONTROLB = $31 +const byte OFFSET_STRUCT_MEGA65_VICIV_CONTROLC = $54 +const byte OFFSET_STRUCT_MEGA65_VICIV_KEY = $2f +const byte OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HIHI = $63 +const byte OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO = $62 +const byte OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI = $61 +const byte OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO = $60 +const byte OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_HI = $5d +const byte OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_LO = $5c +const byte OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_HI = $49 +const byte OFFSET_STRUCT_MEGA65_VICIV_TBDRPOS_LO = $48 +const byte OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_HI = $4d +const byte OFFSET_STRUCT_MEGA65_VICIV_TEXTXPOS_LO = $4c +const byte OFFSET_STRUCT_MOS6569_VICII_RASTER = $12 +const nomodify byte* SCREEN = (byte*) 20480 +const byte SIZEOF_WORD = 2 +const nomodify struct MOS6569_VICII* VICII = (struct MOS6569_VICII*) 53248 +const nomodify struct MEGA65_VICIV* VICIV = (struct MEGA65_VICIV*) 53248 +const nomodify byte WHITE = 1 +void main() +byte~ main::$10 reg byte a 202.0 +word main::c +word main::c#0 c zp[2]:8 22.0 +word main::c#1 c zp[2]:8 101.0 +word main::c#2 c zp[2]:8 78.5 +byte main::col +byte main::col#1 reg byte x 22.0 +byte main::col#2 reg byte x 4.125 +word* main::erow +word* main::erow#1 erow zp[2]:2 11.0 +word* main::erow#5 erow zp[2]:2 13.666666666666666 +byte main::i +byte main::i#1 reg byte z 202.0 +byte main::i#2 reg byte z 80.8 +byte* main::logo_dest +byte* main::logo_dest#1 logo_dest zp[2]:6 7.333333333333333 +byte* main::logo_dest#5 logo_dest zp[2]:6 20.5 +byte* main::logo_src +byte* main::logo_src#1 logo_src zp[2]:4 11.0 +byte* main::logo_src#5 logo_src zp[2]:4 17.571428571428573 +byte main::r +byte main::r#1 reg byte x 22.0 +byte main::r#2 reg byte x 3.3000000000000003 +byte main::y +byte main::y#1 reg byte y 202.0 +byte main::y#2 reg byte y 168.33333333333331 +void memoryRemap(byte memoryRemap::remapBlocks , word memoryRemap::lowerPageOffset , word memoryRemap::upperPageOffset) +const byte* memoryRemap::aVal = (byte*) 252 +word memoryRemap::lowerPageOffset +byte memoryRemap::remapBlocks +word memoryRemap::upperPageOffset +const byte* memoryRemap::xVal = (byte*) 253 +const byte* memoryRemap::yVal = (byte*) 254 +const byte* memoryRemap::zVal = (byte*) 255 +void memset_dma(void* memset_dma::dest , byte memset_dma::fill , word memset_dma::num) +void* memset_dma::dest +void* memset_dma::dest#2 dest zp[2]:12 +byte memset_dma::dmaMode +byte memset_dma::dmaMode#0 reg byte x 2.4444444444444446 +byte memset_dma::fill +byte memset_dma::fill#2 reg byte z +word memset_dma::num +word memset_dma::num#2 num zp[2]:10 5.5 +void memset_dma256(byte memset_dma256::dest_mb , byte memset_dma256::dest_bank , void* memset_dma256::dest , byte memset_dma256::fill , word memset_dma256::num) +void* memset_dma256::dest +const void* memset_dma256::dest#0 dest = (void*) 0 +byte memset_dma256::dest_bank +const byte memset_dma256::dest_bank#0 dest_bank = 8 +byte memset_dma256::dest_mb +const byte memset_dma256::dest_mb#0 dest_mb = $ff +byte memset_dma256::dmaMode +byte memset_dma256::dmaMode#0 reg byte x 2.0 +struct DMA_LIST_F018B* memset_dma256::f018b +const struct DMA_LIST_F018B* memset_dma256::f018b#0 f018b = (struct DMA_LIST_F018B*)memset_dma_command256+4 +byte memset_dma256::fill +word memset_dma256::num +const word memset_dma256::num#0 num = (word)$2d*$19*2 +struct DMA_LIST_F018B memset_dma_command loadstore mem[12] = { command: DMA_COMMAND_FILL, count: 0, src: (byte*) 0, src_bank: 0, dest: (byte*) 0, dest_bank: 0, sub_command: 0, modulo: 0 } +const byte* memset_dma_command256[] = { DMA_OPTION_DEST_MB, 0, DMA_OPTION_FORMAT_F018B, DMA_OPTION_END, DMA_COMMAND_FILL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + +reg byte x [ main::r#2 main::r#1 ] +zp[2]:2 [ main::erow#5 main::erow#1 ] +reg byte x [ main::col#2 main::col#1 ] +zp[2]:4 [ main::logo_src#5 main::logo_src#1 ] +zp[2]:6 [ main::logo_dest#5 main::logo_dest#1 ] +reg byte y [ main::y#2 main::y#1 ] +reg byte z [ main::i#2 main::i#1 ] +zp[2]:8 [ main::c#2 main::c#0 main::c#1 ] +zp[2]:10 [ memset_dma::num#2 ] +reg byte z [ memset_dma::fill#2 ] +zp[2]:12 [ memset_dma::dest#2 ] +reg byte a [ main::$10 ] +reg byte x [ memset_dma::dmaMode#0 ] +reg byte x [ memset_dma256::dmaMode#0 ] +mem[12] [ memset_dma_command ]