diff --git a/asm_routines/lz4_decode.s b/asm_routines/lz4_decode.s index b1c699e7..52e4ca39 100644 --- a/asm_routines/lz4_decode.s +++ b/asm_routines/lz4_decode.s @@ -36,7 +36,7 @@ ;COUNT EQU $06 ;DELTA EQU $08 -orgoff EQU $5C00 ; offset of first unpacked byte +orgoff EQU $5E00 ; offset of first unpacked byte ;====================== ; LZ4 decode diff --git a/chiptune_player/TODO b/chiptune_player/TODO index 0941b767..c46209fc 100644 --- a/chiptune_player/TODO +++ b/chiptune_player/TODO @@ -1,5 +1,4 @@ -+ Print time -+ LZ4 decompression + Loop support + Right/Left arrows on screen - ++ Keyboard, Right/Left/Pause ++ Calculate maximum decode time for songs diff --git a/chiptune_player/chiptune_glitch.dsk b/chiptune_player/chiptune_glitch.dsk new file mode 100644 index 00000000..a9a48d24 Binary files /dev/null and b/chiptune_player/chiptune_glitch.dsk differ diff --git a/chiptune_player/chiptune_player.s b/chiptune_player/chiptune_player.s index e6bc66b1..0dc6b510 100644 --- a/chiptune_player/chiptune_player.s +++ b/chiptune_player/chiptune_player.s @@ -1,11 +1,10 @@ ; VMW Chiptune Player .include "zp.inc" - ; program is 4k, so from 0xc00 to 0x1C00 - -LZ4_BUFFER EQU $1C00 ; 16k for now, FIXME: expand -CHUNK_BUFFER EQU $5C00 ; $5C00 - $9600, 14k, $3A00 - ; trying not to hit DOS at 9600 + ; program is ~4k, so from 0xc00 to 0x1C00 +LZ4_BUFFER EQU $1C00 ; $1C00 - $5C00, 16k for now +CHUNK_BUFFER EQU $5E00 ; $5E00 - $9600, 14k, $3800 + ; trying not to hit DOS at $9600 ; Reserve 3 chunks plus spare (14k) CHUNKSIZE EQU $3 @@ -375,6 +374,8 @@ new_song: sta A_VOLUME sta B_VOLUME sta C_VOLUME + sta COPY_OFFSET + sta DECODER_STATE ;=========================== ; Print loading message @@ -516,10 +517,24 @@ bloop22: ; PLAY B (copying C) ; PLAY D (decompressing A/B/C) + ;======================== ; page copy ;======================== + ; want to copy: + ; SRC: chunk_buffer+(2*256)+(COPY_OFFSET*3*256) + ; DST: chunk_buffer+$2A00+(COPY_OFFSET*256) page_copy: + clc ; 2 + lda #>(CHUNK_BUFFER+512) ; 3 + adc COPY_OFFSET ; 3 + adc COPY_OFFSET ; 3 + adc COPY_OFFSET ; 3 + sta page_copy_loop+2 ; self modify ; 5 + + lda #>(CHUNK_BUFFER+$2A00) ; 2 + adc COPY_OFFSET ; 3 + sta page_copy_loop+5 ; self modify ; 5 ldx #$00 ; 2 page_copy_loop: @@ -529,7 +544,7 @@ page_copy_loop: bne page_copy_loop ; 2nt/3 rts ; 6 ;====================== - ; 2+14*256+6= 3592 + ; 2+14*256+6+29= 3621 ;========== ; filenames diff --git a/chiptune_player/volume_bars.s b/chiptune_player/volume_bars.s index ef51058f..3a5e6732 100644 --- a/chiptune_player/volume_bars.s +++ b/chiptune_player/volume_bars.s @@ -5,49 +5,48 @@ ;============================== volume_bars: - - ; hline Y,V2 at A - ; top line - lda #COLOR_BOTH_GREY - sta COLOR ; remove for crazy effect - ldy #12 - lda #26 - sta V2 - lda #6 - jsr hlin_double - + lda #COLOR_BOTH_GREY ; 2 + sta COLOR ; remove for crazy effect ; 3 + ldy #12 ; 2 + lda #26 ; 2 + sta V2 ; 3 + lda #6 ; 2 + jsr hlin_double ; 6 + ; 63+14*16=287 + ;===================== + ; 307 ; middle - lda #8 + lda #8 ; 2 middle_loop: - pha + pha ; 3 - cmp #8 - beq middle_black - cmp #26 - beq middle_black + cmp #8 ; 2 + beq middle_black ; 2nt/3 + cmp #26 ; 2 + beq middle_black ; 2nt/3 - cmp #10 - bne not_top + cmp #10 ; 2 + bne not_top ; 2nt/3 - ldx #$3B ; pink/purple - stx A_COLOR - ldx #$7E ; light-blue/aqua - stx B_COLOR - ldx #$CD ; light-green/yellow - stx C_COLOR - jmp calc_volume + ldx #$3B ; pink/purple ; 2 + stx A_COLOR ; 3 + ldx #$7E ; light-blue/aqua ; 2 + stx B_COLOR ; 3 + ldx #$CD ; light-green/yellow ; 2 + stx C_COLOR ; 3 + jmp calc_volume ; 3 not_top: - ldx #COLOR_BOTH_RED - stx A_COLOR - ldx #COLOR_BOTH_DARKBLUE - stx B_COLOR - ldx #COLOR_BOTH_DARKGREEN - stx C_COLOR + ldx #COLOR_BOTH_RED ; 2 + stx A_COLOR ; 3 + ldx #COLOR_BOTH_DARKBLUE ; 2 + stx B_COLOR ; 3 + ldx #COLOR_BOTH_DARKGREEN ; 2 + stx C_COLOR ; 3 calc_volume: @@ -63,159 +62,165 @@ calc_volume: ; FIXME: there must be a way to make this faster mod_a: - pha - sec - eor #$ff ; negate - adc #24 ; 24-A - sec - sbc A_VOLUME - bmi mod_b - beq mod_a_bottom + pha ; 3 + sec ; 2 + eor #$ff ; negate ; 2 + adc #24 ; 24-A ; 2 + sec ; 2 + sbc A_VOLUME ; 2 + bmi mod_b ; 2nt/3 + beq mod_a_bottom ; 2nt/3 mod_a_zero: - lda #0 - beq done_a + lda #0 ; 2 + beq done_a ; 2nt/3 mod_a_bottom: - lda A_COLOR - and #$f0 + lda A_COLOR ; 2 + and #$f0 ; 2 done_a: - sta A_COLOR + sta A_COLOR ; 2 mod_b: - pla - pha - sec - eor #$ff ; negate - adc #24 ; 24-A - sec - sbc B_VOLUME - bmi mod_c - beq mod_b_bottom + pla ; 4 + pha ; 3 + sec ; 2 + eor #$ff ; negate ; 2 + adc #24 ; 24-A ; 2 + sec ; 2 + sbc B_VOLUME ; 2 + bmi mod_c ; 2nt/3 + beq mod_b_bottom ; 2nt/3 mod_b_zero: - lda #0 - beq done_b + lda #0 ; 2 + beq done_b ; 2nt/3 mod_b_bottom: - lda B_COLOR - and #$f0 + lda B_COLOR ; 3 + and #$f0 ; 2 done_b: - sta B_COLOR + sta B_COLOR ; 3 mod_c: - pla - pha - sec - eor #$ff ; negate - adc #24 ; 24-A - sec - sbc C_VOLUME - bmi mod_d - beq mod_c_bottom + pla ; 4 + pha ; 3 + sec ; 2 + eor #$ff ; negate ; 2 + adc #24 ; 24-A ; 2 + sec ; 2 + sbc C_VOLUME ; 2 + bmi mod_d ; 2nt/3 + beq mod_c_bottom ; 2nt/3 mod_c_zero: - lda #0 - beq done_c + lda #0 ; 2 + beq done_c ; 2nt/3 mod_c_bottom: - lda C_COLOR - and #$f0 + lda C_COLOR ; 3 + and #$f0 ; 2 done_c: - sta C_COLOR + sta C_COLOR ; 3 mod_d: - pla + pla ; 4 - jmp middle_color_done + jmp middle_color_done ; 3 middle_black: - ldx #COLOR_BOTH_BLACK - stx A_COLOR - stx B_COLOR - stx C_COLOR + ldx #COLOR_BOTH_BLACK ; 2 + stx A_COLOR ; 3 + stx B_COLOR ; 3 + stx C_COLOR ; 3 middle_color_done: ; left border - ldy #COLOR_BOTH_GREY - sty COLOR + ldy #COLOR_BOTH_GREY ; 2 + sty COLOR ; 3 - ldy #12 - sty V2 - ldy #12 - - jsr hlin_double + ldy #12 ; 2 + sty V2 ; 3 + ldy #12 ; 2 + jsr hlin_double ; 6 + ; 63+1*16=79 ; border space - lda #COLOR_BOTH_BLACK - sta COLOR + lda #COLOR_BOTH_BLACK ; 2 + sta COLOR ; 3 - ldx #1 - jsr hlin_double_continue + ldx #1 ; 2 + jsr hlin_double_continue ; 10+1*16=27 ; A volume - lda A_COLOR - sta COLOR + lda A_COLOR ; 3 + sta COLOR ; 3 - ldx #3 - jsr hlin_double_continue + ldx #3 ; 2 + jsr hlin_double_continue ; 10+3*16=58 ; A space - lda #COLOR_BOTH_BLACK - sta COLOR - - ldx #1 - jsr hlin_double_continue + lda #COLOR_BOTH_BLACK ; 2 + sta COLOR ; 3 + ldx #1 ; 2 + jsr hlin_double_continue ; 6 + ; 10+1*16=27 ; B volume - lda B_COLOR - sta COLOR - - ldx #3 - jsr hlin_double_continue + lda B_COLOR ; 3 + sta COLOR ; 3 + ldx #3 ; 2 + jsr hlin_double_continue ; 6 + ; 10+3*16=58 ; B space - lda #COLOR_BOTH_BLACK - sta COLOR + lda #COLOR_BOTH_BLACK ; 2 + sta COLOR ; 3 - ldx #1 - jsr hlin_double_continue + ldx #1 ; 2 + jsr hlin_double_continue ; 6 + ; 10+1*16=27 ; C volume - lda C_COLOR - sta COLOR + lda C_COLOR ; 3 + sta COLOR ; 3 - ldx #3 - jsr hlin_double_continue + ldx #3 ; 2 + jsr hlin_double_continue ; 6 + ; 10+3*16=58 ; C space - lda #COLOR_BOTH_BLACK - sta COLOR - - ldx #1 - jsr hlin_double_continue + lda #COLOR_BOTH_BLACK ; 2 + sta COLOR ; 3 + ldx #1 ; 2 + jsr hlin_double_continue ; 6 + ; 10+1*16=27 ; Right border - lda #COLOR_BOTH_GREY - sta COLOR + lda #COLOR_BOTH_GREY ; 2 + sta COLOR ; 3 - ldx #1 - jsr hlin_double_continue + ldx #1 ; 2 + jsr hlin_double_continue ; 6 + ; 10+1*16=27 - pla - clc - adc #2 - cmp #28 - beq bottom_line - jmp middle_loop + pla ; 4 + clc ; 2 + adc #2 ; 2 + cmp #28 ; 2 + beq bottom_line ; 2nt/3 + jmp middle_loop ; 3 bottom_line: ; bottom line - lda #COLOR_BOTH_GREY - sta COLOR - ldy #12 - lda #26 - sta V2 - lda #28 - jsr hlin_double + lda #COLOR_BOTH_GREY ; 2 + sta COLOR ; 3 + ldy #12 ; 2 + lda #26 ; 2 + sta V2 ; 3 + lda #28 ; 2 + jsr hlin_double ; 6 + ; 63+14*16=287 - rts + rts ; 6 + +; 309+ 684*10 + 313 = roughly worst case 7462 diff --git a/chiptune_player/zp.inc b/chiptune_player/zp.inc index 50f78371..2da3c8cb 100644 --- a/chiptune_player/zp.inc +++ b/chiptune_player/zp.inc @@ -66,7 +66,8 @@ C_VOLUME EQU $7A ENVELOPE_FINE EQU $7B ENVELOPE_COARSE EQU $7C ENVELOPE_SHAPE EQU $7D - +COPY_OFFSET EQU $7E +DECODER_STATE EQU $7F ;SPACEY_I EQU $70 ;SPACEY_F EQU $71 ;CY_I EQU $72