diff --git a/linker_scripts/apple2_70_zp.inc b/linker_scripts/apple2_70_zp.inc index 53e9497e..9737f2d1 100644 --- a/linker_scripts/apple2_70_zp.inc +++ b/linker_scripts/apple2_70_zp.inc @@ -1,5 +1,5 @@ MEMORY { - ZP: start = $70, size = $80, type = rw; + ZP: start = $70, size = $90, type = rw; RAM: start = $70, size = $8E00, file = %O; } diff --git a/music/polly/Makefile b/music/polly/Makefile index a81fc012..c5bc23c5 100644 --- a/music/polly/Makefile +++ b/music/polly/Makefile @@ -10,12 +10,13 @@ EMPTY_DISK = ../../empty_disk/empty.dsk all: polly.dsk -polly.dsk: HELLO POLLY BOOP REPO +polly.dsk: HELLO POLLY BOOP REPO REPO2 cp $(EMPTY_DISK) polly.dsk $(DOS33) -y polly.dsk SAVE A HELLO $(DOS33) -y polly.dsk BSAVE -a 0x1000 POLLY $(DOS33) -y polly.dsk BSAVE -a 0x1000 BOOP $(DOS33) -y polly.dsk BSAVE -a 0x1000 REPO + $(DOS33) -y polly.dsk BSAVE -a 0x1000 REPO2 ### @@ -52,6 +53,14 @@ repo.o: repo.s sample.inc ### +REPO2: repo2.o + ld65 -o REPO2 repo2.o -C ../../linker_scripts/apple2_1000.inc + +repo2.o: repo2.s sample.inc + ca65 -o repo2.o repo2.s -l repo2.lst + +### + HELLO: hello.bas $(TOKENIZE) < hello.bas > HELLO @@ -59,5 +68,5 @@ HELLO: hello.bas #### clean: - rm -f *~ *.o *.lst HELLO POLLY BOOP REPO decode_trace + rm -f *~ *.o *.lst HELLO POLLY BOOP REPO REPO2 decode_trace diff --git a/music/polly/decode_trace.c b/music/polly/decode_trace.c index a099fb47..436cb545 100644 --- a/music/polly/decode_trace.c +++ b/music/polly/decode_trace.c @@ -12,6 +12,7 @@ int main(int argc, char **argv) { int speaker_access; int count=0,which=0; int diffs[MAX]; + int first=1; while(1) { result=fgets(string,BUFSIZ,stdin); @@ -23,7 +24,13 @@ int main(int argc, char **argv) { if (speaker_access) { diffs[count]=cycles-oldcycles; - count++; + if (first) { + /* skip first */ + first=0; + } + else { + count++; + } oldcycles=cycles; } @@ -33,6 +40,46 @@ int main(int argc, char **argv) { } } + /* now print high */ + + printf("extra_high_values:\n"); + for(which=0;which>16)); + if ((which%16)!=15) { + } + else { + printf("\n"); + } + } + printf("\n.byte\t$FF\n"); + + + /* now print high */ + + printf("high_values:\n"); + for(which=0;which>8)&0xff); + if ((which%16)!=15) { + } + else { + printf("\n"); + } + } + printf("\n.byte\t$FF\n"); + + /* now print low */ printf("low_values:\n"); diff --git a/music/polly/repo.s b/music/polly/repo.s index 00e0c212..dc046422 100644 --- a/music/polly/repo.s +++ b/music/polly/repo.s @@ -5,23 +5,73 @@ SPEAKER = $C030 repo: - ldy #0 + repo_loop: bit SPEAKER -addr_smc: - lda low_values,Y - cmp #$FF - beq done + ; delay extra + +extra_smc: + ldx extra_high_values + beq delay_high + +extra_loop: + ldy #255 +extra_inner_loop: + lda #200 + jsr delay_a + dey + bne extra_inner_loop + + dex + bne extra_loop + + + ; delay high +delay_high: + +high_smc: + ldx high_values +high_loop: + lda #200 jsr delay_a - clc - lda addr_smc+1 + dex + bne high_loop + +low_delay: + +low_smc: + lda low_values ; 4 + cmp #$FF ; 2 + beq done ; 2 normally + + jsr delay_a ; 25+A + + clc ; 2 + lda low_smc+1 adc #1 - sta addr_smc+1 + sta low_smc+1 lda #0 - adc addr_smc+2 - sta addr_smc+2 + adc low_smc+2 + sta low_smc+2 + + clc + lda high_smc+1 + adc #1 + sta high_smc+1 + lda #0 + adc high_smc+2 + sta high_smc+2 + + clc + lda extra_smc+1 + adc #1 + sta extra_smc+1 + lda #0 + adc extra_smc+2 + sta extra_smc+2 + jmp repo_loop @@ -31,9 +81,19 @@ done: bit KEYRESET lda #low_values - sta addr_smc+2 + sta low_smc+2 + + lda #high_values + sta high_smc+2 + + lda #extra_high_values + sta extra_smc+2 jmp repo diff --git a/music/polly/repo2.s b/music/polly/repo2.s new file mode 100644 index 00000000..aa819126 --- /dev/null +++ b/music/polly/repo2.s @@ -0,0 +1,405 @@ +; Soft Switches +KEYPRESS= $C000 +KEYRESET= $C010 +SPEAKER = $C030 + + +WAIT = $FCA8 ; delay 1/2(26+27A+5A^2) us + ; MAX=35968 = 35ms or so + +; 121755 (121ms) +; 243510000 = 26+27A+5A2 + + + +COUNT = $FF + +repo2: + + lda KEYPRESS + bpl done + bit KEYRESET + +check1: + cmp #'1'+$80 + bne check2 + jsr pattern1 + jmp repo2 + +check2: + cmp #'2'+$80 + bne check3 + jsr pattern2 + jmp repo2 + +check3: + cmp #'3'+$80 + bne check4 + jsr drum1 + jmp repo2 + +check4: + cmp #'4'+$80 + bne check5 + jsr drum2 + jmp repo2 + +check5: + cmp #'5'+$80 + bne check6 + jsr drum3 + jmp repo2 + +check6: + + cmp #'6'+$80 + bne check7 +; jsr drum4 + jmp repo2 + +check7: + + +done: + + + jmp repo2 + + + +pattern1: + + lda #35 + sta COUNT + +pattern1_loop: + + +; for cycles +; 5466 to draw +; current delay=200 = 19135 + +; total cycles = 2458*35= 86030 + +;1203 //35 times (halfway a 1259) +;1254 + +;1200 + + + bit SPEAKER ;4 + + ; want 1203-4 = 1199 + ; Try X=8 Y=26 cycles=1197 + + nop ; 2 + + ldy #26 ; 2 +loop3: + ldx #8 ; 2 +loop4: + dex ; 2 + bne loop4 ; 2nt/3 + + dey ; 2 + bne loop3 ; 2nt/3 + + + ; want 1254-4 = 1250 + + bit SPEAKER ; 4 + + ; Try X=248 Y=1 cycles=1247 + lda $0 ; 3 + + ldy #1 ; 2 +loop5: + ldx #248 ; 2 +loop6: + dex ; 2 + bne loop6 ; 2nt/3 + + dey ; 2 + bne loop5 ; 2nt/3 + + + dec COUNT + bne pattern1_loop + + + rts + + + + +pattern2: ; bip + + lda #35 + sta COUNT + +pattern2_loop: + + +;812 //35 times +;772 +;873 + + + bit SPEAKER ;4 + + ; want 812-4 = 808 + ; Try X=1 Y=73 cycles=804 + + nop ; 2 + nop ; 2 + + ldy #73 ; 2 +loop7: + ldx #1 ; 2 +loop8: + dex ; 2 + bne loop8 ; 2nt/3 + + dey ; 2 + bne loop7 ; 2nt/3 + + + ; want 772-4 = 768 + + bit SPEAKER ; 4 + + ; Try X=9 Y=15 cycles=766 + + nop ; 2 + + ldy #15 ; 2 +loop9: + ldx #9 ; 2 +loop10: + dex ; 2 + bne loop10 ; 2nt/3 + + dey ; 2 + bne loop9 ; 2nt/3 + + + ; want 873-4 = 869 + + bit SPEAKER ; 4 + + ; Try X=42 Y=4 cycles=865 + + nop ; 2 + nop ; 2 + + ldy #4 ; 2 +loop11: + ldx #42 ; 2 +loop12: + dex ; 2 + bne loop12 ; 2nt/3 + + dey ; 2 + bne loop11 ; 2nt/3 + + + dec COUNT + bne pattern2_loop + + + rts + + + + ;============================= + ; + +drum1: + bit $C030 + jsr delay_1600 + jsr delay_800 + jsr delay_200 + + bit $C030 + jsr delay_800 + jsr delay_400 + + bit $C030 + jsr delay_800 + + bit $C030 + jsr delay_800 + jsr delay_400 + + bit $C030 + jsr delay_1600 + jsr delay_800 + jsr delay_400 + + bit $C030 + jsr delay_200 + + bit $C030 + jsr delay_400 + + bit $C030 + jsr delay_1600 + jsr delay_800 + + bit $C030 + jsr delay_3200 + jsr delay_800 + jsr delay_400 + + bit $C030 + jsr delay_800 + jsr delay_200 + + bit $C030 + jsr delay_200 + + bit $C030 + rts + + + ;============================= + ; + +drum2: + bit $C030 + jsr delay_800 + + bit $C030 + jsr delay_400 + + bit $C030 + jsr delay_800 + jsr delay_400 + + bit $C030 + jsr delay_800 + jsr delay_200 + + bit $C030 + jsr delay_800 + jsr delay_400 + + bit $C030 + jsr delay_1600 + jsr delay_200 + + bit $C030 + jsr delay_200 + + bit $C030 + jsr delay_400 + jsr delay_200 + + bit $C030 + jsr delay_1600 + jsr delay_800 + + bit $C030 + jsr delay_1600 + jsr delay_800 + + bit $C030 + rts + + + ;============================= + ; + +drum3: + bit $C030 + jsr delay_1600 + jsr delay_800 + + bit $C030 + jsr delay_400 + + bit $C030 + jsr delay_200 + + bit $C030 + jsr delay_200 + + bit $C030 + jsr delay_200 + jsr delay_400 + + bit $C030 + jsr delay_400 + jsr delay_800 + + bit $C030 + jsr delay_800 + + bit $C030 + rts + + + + ; subtract 6(jsr)6(rts)11(below) + ; want 177 + ; Try X=2 Y=11 cycles=177 +delay_200: + ldy #11 ; 2 + ldx #2 ; 2 + stx xdelay_smc+1 ; 4 + jmp do_custom_delay ; 3 + + + ; subtract 6(jsr)6(rts)11(below) + ; want 377 + ; Try X=74 Y=1 cycles=377 +delay_400: + ldy #1 ; 2 + ldx #74 ; 2 + stx xdelay_smc+1 ; 4 + jmp do_custom_delay ; 3 + + + ; subtract 6(jsr)6(rts)11(below) + ; want 777 + ; Try X=154 Y=1 cycles=777 +delay_800: + ldy #1 ; 2 + ldx #154 ; 2 + stx xdelay_smc+1 ; 4 + jmp do_custom_delay ; 3 + + + ; subtract 6(jsr)6(rts)11(below) + ; want 1577 + ; Try X=3 Y=75 cycles=1576 +delay_1600: + ldy #75 ; 2 + ldx #3 ; 2 + stx xdelay_smc+1 ; 4 + jmp do_custom_delay ; 3 + + ; subtract 6(jsr)6(rts)11(below) + ; want 3177 + ; Try X=8 Y=69 cycles=3175 +delay_3200: + ldy #69 ; 2 + ldx #8 ; 2 + stx xdelay_smc+1 ; 4 + jmp do_custom_delay ; 3 + +do_custom_delay: + ldy #15 ; 2 +dcd_outer: +xdelay_smc: + ldx #9 ; 2 +dcd_inner: + dex ; 2 + bne dcd_inner ; 2nt/3 + + dey ; 2 + bne dcd_outer ; 2nt/3 + + rts + +