;=============================================== ; 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 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 asl ; map to memory address ; 2 tay ; 2 lda gr_offsets,Y ; lookup low-res memory address ; 4 sta BASL ; store out low byte of addy ; 3 lda gr_offsets+1,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 tay ; 2 lda gr_offsets,Y ; lookup low-res memory address ; 4 sta BASL ; store out low byte of addy ; 3 lda gr_offsets+1,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 lda #' '|$80 ; 2 ldy LETTERX ; 3 sta (BASL),Y ; 6 dey ; draw new char ; 2 sty LETTERX ; 3 lda LETTER ; 3 ora #$80 ; 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 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