xmas2019: try adding letter moving

This commit is contained in:
Vince Weaver 2019-12-20 17:15:21 -05:00
parent 325499f6aa
commit 6e30f85a1f
4 changed files with 260 additions and 5 deletions

View File

@ -42,7 +42,7 @@ XMAS2019: xmas2019.o
ld65 -o XMAS2019 xmas2019.o -C ../linker_scripts/apple2_4000.inc
xmas2019.o: xmas2019.s \
delay_a.s vapor_lock.s message.inc gr_unrle.s
delay_a.s vapor_lock.s message.inc gr_unrle.s move_letters.s letters.s
ca65 -o xmas2019.o xmas2019.s -l xmas2019.lst

30
xmas_2019/letters.s Normal file
View File

@ -0,0 +1,30 @@
; The various strings printed by the sliding letters code
; Kept in one place to try to allow for better alignment opportunities
.align $100
letters_bm:
;.byte 1,12
.byte "CYCLE",128
.byte 1+128,12,"CYCLE",128
.byte 2,16,"COUNTING",128
.byte 2+128,16,"COUNTING",128
; .byte 3,12,"M E G A D E M O",150
.byte 3,16,"MEGADEMO",150
.byte 1,16," ",128
.byte 2,16," ",128
.byte 3,16," ",128
.byte 1,19,"BY",128
.byte 3,17,"DEATER",150
.byte 1,19," ",128
.byte 3,17," ",128
.byte 1,17,"MUSIC",128
.byte 3,17,"DASCON",150
.byte 1,17," ",128
.byte 3,17," ",128
.byte 1,16,"LZ4+DISK",128
.byte 3,17,"QKUMBA",150
.byte 1,16," ",128
.byte 3,17," "
.byte 255

196
xmas_2019/move_letters.s Normal file
View File

@ -0,0 +1,196 @@
;===============================================
; Move Letters
;===============================================
; Normal P0 =6+13+2+22+46+37 = 126
; Normal P1 =6+13+2+22+46+37 = 126
; End of line =6+13+2+22+46+9+(28) = 126
; Next line =6+13+5+14+34+(26+28) = 126
; done entirely =6+13+5+(6+42+26+28) = 126
; Waiting =6+7+(11+6+42+26+28) = 126
; all forced to be 126
.assert >move_letters = >move_letters_after, error, "move_letters crosses page"
move_letters:
ldy WAITING ; 3
beq not_waiting ; 3
;============
; 6
;-1
dec WAITING ; 5
jmp wait_it_out ; 3
;===========
; 7
not_waiting:
; load letter from pointer, save into LETTER
ldy #0 ; 2
lda (LETTERL),Y ; 5
sta LETTER ; 3
; if high bit set, is special case
bmi letter_special ; 3
;==========
; 13
; just regular letter
;-1
lda LETTERY ; get letter Y ; 3
bmi letter_page1
;==========
; 2
letter_page0: ; -1
nop
; asl ; map to memory address ; 2
tay ; 2
lda gr_offsets_l,Y ; lookup low-res memory address ; 4
sta BASL ; store out low byte of addy ; 3
lda gr_offsets_h,Y ; look up high byte ; 4
sta BASH ; 3
lda #0 ; cycle-killer ; 2
jmp letter_erase ; 3
;==========
; 22
letter_page1:
; asl ; map to memory address ; 2
nop
tay ; 2
lda gr_offsets_l,Y ; lookup low-res memory address ; 4
sta BASL ; store out low byte of addy ; 3
lda gr_offsets_h,Y ; look up high byte ; 4
clc ; 2
adc #$4 ; adjust to page1 ; 2
sta BASH ; 3
;==========
; 22
;============================
letter_erase:
ldy LETTERX ; nop ; 3
nop ; nop ; 5
ldy #0 ; erase old char with space ; 2
ml_patch_space:
lda #' '|$80 ; 2
; lda #' '|$00 ; 2
ldy LETTERX ; 3
sta (BASL),Y ; 6
dey ; draw new char ; 2
sty LETTERX ; 3
lda LETTER ; 3
ml_patch_or:
ora #$80 ; 2
; and #$3f ; 2
ldy LETTERX ; 3
sta (BASL),Y ; 6
lda LETTERX ; see if we are at destination ; 3
cmp LETTERD ; 3
beq letter_next ; 3
;===========
; 46
;-1
lda #0 ; 2
lda #0 ; 2
jmp waste_28 ; 3
;==========
; 9
letter_next:
clc ; 16-bit inc letter pointer ; 2
lda LETTERL ; 3
adc #1 ; 2
sta LETTERL ; 3
lda LETTERH ; 3
adc #0 ; 2
sta LETTERH ; 3
inc LETTERD ; inc destination X ; 5
start_destination:
ml_patch_dest:
; lda #39 ; start at right of screen ; 2
lda #39 ; start at right of screen ; 2
sta LETTERX ; 3
rts ; 6
;===========
; 37
letter_special:
cmp #$ff ; handle FF, we're done ; 2
beq letter_done ; 3
;==========
; 5
; -1
and #$7f ; clear top ; 2
sta WAITING ; this is waiting value ; 3
ldy #1 ; otherwise, Y,X pair ; 2
lda (LETTERL),Y ; get Y, put in LETTERY ; 5
sta LETTERY ; 3
;===========
; 14
iny ; get dest ; 2
lda (LETTERL),Y ; 5
sta LETTERD ; put in LETTERD ; 3
clc ; skip 3 bytes to begin of letters ; 2
lda LETTERL ; 16-bit add ; 3
adc #3 ; 2
sta LETTERL ; 3
lda LETTERH ; 3
adc #0 ; 2
sta LETTERH ; 3
lda LETTERH ; waste ; 3
jmp waste_26 ; 3
;===========
; 34
wait_it_out:
; wait 11
inc BLARGH ; 5
lda LETTERH ; 3
lda LETTERH ; 3
letter_done:
lda LETTERH ; 3
lda LETTERH ; 3
waste_42:
ldx #0 ; 2
inc BLARGH ; 5
inc BLARGH ; 5
inc BLARGH ; 5
inc BLARGH ; 5
inc BLARGH ; 5
inc BLARGH ; 5
inc BLARGH ; 5
inc BLARGH ; 5
waste_26:
ldx #0 ; 2
ldx #0 ; 2
ldx #0 ; 2
inc BLARGH ; 5
inc BLARGH ; 5
inc BLARGH ; 5
inc BLARGH ; 5
waste_28:
ldx #0 ; 2
inc BLARGH ; 5
inc BLARGH ; 5
inc BLARGH ; 5
inc BLARGH ; 5
rts ; 6
move_letters_after:

View File

@ -21,6 +21,15 @@ SEEDH = $4F
FRAME_PLAY_OFFSET=$56
FRAME_PLAY_PAGE = $57
WAITING = $62
LETTERL = $63
LETTERH = $64
LETTERX = $65
LETTERY = $66
LETTERD = $67
LETTER = $68
BLARGH = $69
AY_REGISTERS = $70
A_FINE_TONE = $70
A_COARSE_TONE = $71
@ -147,6 +156,17 @@ snow_init_loop:
dex
bpl snow_init_loop
lda #<letters_bm
sta LETTERL
lda #>letters_bm
sta LETTERH
lda #39
sta LETTERX
lda #1
sta LETTERY
lda #16
sta LETTERD
;=============================
; Load graphic page0
@ -554,6 +574,9 @@ ll_smc4:
.align $100
music_snow:
; do letters
jsr move_letters ; 6+126
; play music
jsr play_frame_compressed ; 6+1237
@ -795,13 +818,16 @@ draw_loop:
; -3 jump at end
;-1243 music
; -135 wrap
; -132 letters
;======
; 167
; 35
; Try X=32 Y=1 cycles=167
; Try X=2 Y=2 cycles=33R2
ldy #1 ; 2
dloop1: ldx #32 ; 2
nop
ldy #2 ; 2
dloop1: ldx #2 ; 2
dloop2: dex ; 2
bne dloop2 ; 2nt/3
dey ; 2
@ -918,6 +944,9 @@ pixel_lookup:
.include "pt3_lib_write_frame.s"
.include "pt3_lib_write_lc.s"
.align $100
.include "move_letters.s"
.include "letters.s"
.align $100
PT3_LOC = song