diff --git a/split_screen/credits.s b/split_screen/credits.s index 97d1f158..3b7a36d0 100644 --- a/split_screen/credits.s +++ b/split_screen/credits.s @@ -1,6 +1,7 @@ ; ; Cycle-counting text/hgr/lowres demo ; by Vince Weaver +; .include "zp.inc" @@ -17,6 +18,7 @@ BLARGH = $69 MBASE = $97 MBOFFSET = $98 + WAITING = $99 ;=================== ; init screen @@ -96,20 +98,20 @@ no_init_mb: ; Wait - jsr wait_until_keypressed +; jsr wait_until_keypressed ; GR part - bit LORES - bit SET_GR - bit FULLGR +; bit LORES +; bit SET_GR +; bit FULLGR - jsr draw_bottom_green ; 6 +; jsr draw_bottom_green ; 6 ; Wait ; jsr wait_until_keypressed - bit HIRES +; bit HIRES ; Wait @@ -561,22 +563,21 @@ loop6: - jsr move_letters ; 6+110 + jsr move_letters ; 6+126 ; Blanking time: 4550 - ; move_letters -116 + ; move_letters -132 ; JMP at end -3 - ;========================4431 cycles + ;========================4415 cycles - ; Try X=176 Y=5 cycles=4431 + ; Try X=24 Y=35 cycles=4411 R4 -; lda #0 ; 2 -; lda #0 ; 2 - ldy #5 ; 2 -loop7: - ldx #176 ; 2 -loop8: - dex ; 2 + nop + nop + + ldy #35 ; 2 +loop7: ldx #24 ; 2 +loop8: dex ; 2 bne loop8 ; 2nt/3 dey ; 2 bne loop7 ; 2nt/3 @@ -763,133 +764,8 @@ green_loop: ; 4 + (40*55) + 6 - 1 - ;=============================================== - ; Move Letters - ;=============================================== - ; Normal =10+25+38+9 = 82 need 28 (28) - ; End of line =10+25+38+37 = 110 - ; Next line =10+5+12+34 = 61 need 49 (28+21) - ; done entirely =10+5+9 = 24 need 86 (28+21+37) - ; all forced to be 109 - -move_letters: - ldy #0 ; 2 - lda (LETTERL),Y ; 5 - sta LETTER ; 3 - ;========== - ; 10 - bmi letter_special - ; 2 - lda LETTERY ; 3 - asl ; 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 - ;========== - ; 25 - - 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 ; 3 - cmp LETTERD ; 3 - ;=========== - ; 38 - beq letter_next - ; 2 - lda #0 ; 2 - lda #0 ; 2 - jmp waste_28 ; 3 - ;========== - ; 9 -letter_next: - ; 3 - clc ; 2 - lda LETTERL ; 3 - adc #1 ; 2 - sta LETTERL ; 3 - lda LETTERH ; 3 - adc #0 ; 2 - sta LETTERH ; 3 - inc LETTERD ; 5 - lda #39 ; 2 - sta LETTERX ; 3 - rts ; 6 - ;=========== - ; 37 - -letter_special: - ; 3 - cmp #$ff ; 2 - ;========== - ; 5 - - beq letter_done - ; 2 - ldy #1 ; 2 - lda (LETTERL),Y ; 5 - sta LETTERY ; 3 - ;=========== - ; 12 - - iny ; 2 - lda (LETTERL),Y ; 5 - sta LETTERD ; 3 - - clc ; 2 - lda LETTERL ; 3 - adc #3 ; 2 - sta LETTERL ; 3 - lda LETTERH ; 3 - adc #0 ; 2 - sta LETTERH ; 3 - lda LETTERH ; waste ; 3 - jmp waste_21 ; 3 - - ;=========== - ; 34 -letter_done: - ; 3 - lda LETTERH ; 3 - lda LETTERH ; 3 - -waste_37: - ldx #0 ; 2 - inc BLARGH ; 5 - inc BLARGH ; 5 - inc BLARGH ; 5 - inc BLARGH ; 5 - inc BLARGH ; 5 - inc BLARGH ; 5 - inc BLARGH ; 5 -waste_21: - ldx #0 ; 2 - ldx #0 ; 2 - ldx #0 ; 2 - 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 +.align $100 letters: ;.byte 1,15 @@ -911,16 +787,12 @@ letters: .byte 3,16,"IS HARD!" .byte 255 - - - - .include "vapor_lock.s" .include "delay_a.s" .include "gr_hline.s" -.include "../asm_routines/text_print.s" +.include "move_letters.s" .include "mockingboard.s" -.include "../asm_routines/keypress.s" +;.include "../asm_routines/keypress.s" .align $100 .include "tfv_sprites.inc" diff --git a/split_screen/move_letters.s b/split_screen/move_letters.s new file mode 100644 index 00000000..e0310659 --- /dev/null +++ b/split_screen/move_letters.s @@ -0,0 +1,184 @@ + ;=============================================== + ; 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 +