diff --git a/xmas_2019/Makefile b/xmas_2019/Makefile index 176cf561..35fd2bd6 100644 --- a/xmas_2019/Makefile +++ b/xmas_2019/Makefile @@ -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 diff --git a/xmas_2019/letters.s b/xmas_2019/letters.s new file mode 100644 index 00000000..7c8007a4 --- /dev/null +++ b/xmas_2019/letters.s @@ -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 + diff --git a/xmas_2019/move_letters.s b/xmas_2019/move_letters.s new file mode 100644 index 00000000..55dd6688 --- /dev/null +++ b/xmas_2019/move_letters.s @@ -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: diff --git a/xmas_2019/xmas2019.s b/xmas_2019/xmas2019.s index 84b4530e..cc452362 100644 --- a/xmas_2019/xmas2019.s +++ b/xmas_2019/xmas2019.s @@ -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 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