From f0c93935e265f155118420c1173f3d12d3a3b536 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Sat, 24 Feb 2018 16:57:20 -0500 Subject: [PATCH] chiptune: big break before trying to add copy code --- asm_routines/lz4_decode.s | 2 +- chiptune_player/TODO | 5 +- chiptune_player/chiptune_glitch.dsk | Bin 0 -> 143360 bytes chiptune_player/chiptune_player.s | 27 ++- chiptune_player/volume_bars.s | 275 ++++++++++++++-------------- chiptune_player/zp.inc | 3 +- 6 files changed, 166 insertions(+), 146 deletions(-) create mode 100644 chiptune_player/chiptune_glitch.dsk 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 0000000000000000000000000000000000000000..a9a48d2446c09b34e156e7c2dee58f0087b75a89 GIT binary patch literal 143360 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 z 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 KqDX=u+W!S|ji8qR literal 0 HcmV?d00001 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