diff --git a/demos/l/d3/d2.s b/demos/l/d3/d2.s deleted file mode 100644 index 6b8c7bdc..00000000 --- a/demos/l/d3/d2.s +++ /dev/null @@ -1,69 +0,0 @@ -; Apple II graphics/music in 1k - -; by deater (Vince Weaver) - -; Zero Page - .include "zp.inc" - .include "hardware.inc" - -; 466 bytes -- original from D2 demo -; 436 bytes -- left channel only -; 427 bytes -- optimize init a bit -; 426 bytes -- terminate init with $FF rather than extra $00 -; 424 bytes -- move inits to zero together -; 414 bytes -- update ay output to write all registers -; 405 bytes -- more optimizing the interrupt handler -; 398 bytes -- only put song address one place -; 393 bytes -- don't keep song offset in Y -; 390 bytes -- use Y instead of X -; 388 bytes -- optimizing octave selection -; 373 bytes -- completely redo file format to avoid freq table - -d2: - - ;=================== - ; music Player Setup - -tracker_song = peasant_song - -; lda #peasant_song -; sta SONG_H - - ; assume mockingboard in slot#4 - - ; inline mockingboard_init - -.include "mockingboard_init.s" - -.include "tracker_init.s" - - ; start the music playing - - cli - -bob: - jmp bob - - - - ;================ - ; halt music - ; stop playing - ; turn off sound -its_over: - sei - lda #$3f - sta AY_REGS+7 - jsr ay3_write_regs - -stuck_forever: - bne stuck_forever - - -; music -.include "mA2E_2.s" -.include "interrupt_handler.s" -; must be last -.include "mockingboard_setup.s" diff --git a/demos/l/d3/tracker_init.s b/demos/l/d3/tracker_init.s deleted file mode 100644 index fedff9b2..00000000 --- a/demos/l/d3/tracker_init.s +++ /dev/null @@ -1,12 +0,0 @@ - -tracker_init: - - ; setup initial ay-3-8910 values (this depends on song) - - lda #$38 - sta AY_REGS+7 ; $07 mixer (ABC on) - lda #$0E - sta AY_REGS+8 ; $08 volume A - lda #$0C - sta AY_REGS+9 ; $09 volume B - sta AY_REGS+10 ; $0A volume C diff --git a/demos/l/d3/Makefile b/demos/l/d4/Makefile similarity index 87% rename from demos/l/d3/Makefile rename to demos/l/d4/Makefile index 764ce054..774a3759 100644 --- a/demos/l/d3/Makefile +++ b/demos/l/d4/Makefile @@ -43,6 +43,11 @@ peasant_music.s: peasant.txt text_to_tiny mA2E_2.s: mA2E_2.txt text_to_tiny ./text_to_tiny mA2E_2.txt > mA2E_2.s +#### + +mA2E_3.s: mA2E_3.txt text_to_tiny + ./text_to_tiny mA2E_3.txt > mA2E_3.s + #### @@ -51,9 +56,9 @@ D2: d2.o d2.o: d2.s \ zp.inc hardware.inc \ - mA2E_2.s \ - interrupt_handler.s mockingboard_setup.s mockingboard_init.s \ - tracker_init.s + mA2E_2.s mA2E_3.s \ + interrupt_handler.s mockingboard_init.s \ + tracker_init.s mockingboard_constants.s ay3_write_regs.s ca65 -o d2.o d2.s -l d2.lst #### diff --git a/demos/l/d3/mockingboard_setup.s b/demos/l/d4/ay3_write_regs.s similarity index 55% rename from demos/l/d3/mockingboard_setup.s rename to demos/l/d4/ay3_write_regs.s index f91c60a9..4015e23c 100644 --- a/demos/l/d3/mockingboard_setup.s +++ b/demos/l/d4/ay3_write_regs.s @@ -6,7 +6,7 @@ ;===================== ;===================== ;===================== - ; write all 13 registers + ; write all 14 registers ; address in X ; data in A @@ -23,7 +23,7 @@ ay3_write_reg_loop: sty MOCK_6522_ORB1 ; 4 ; value - lda $70,X + lda AY_REGS,X sta MOCK_6522_ORA1 ; put value on PA1 ; 4 lda #MOCK_AY_WRITE ; ; 2 sta MOCK_6522_ORB1 ; write on PB1 ; 4 @@ -32,23 +32,6 @@ ay3_write_reg_loop: dex bpl ay3_write_reg_loop - rts +; rts - -init_addresses: - .byte + +; Zero Page + .include "zp.inc" + .include "hardware.inc" + +; goal is 332 bytes + +; 319 bytes -- switch songs to mA2E_3 +; 415 bytes -- double length of song +; 334 bytes -- merge length into value + +; if can straddle interrupt vector, save 10 bytes +; if can guarantee Y is 0 on entry, save 2 bytes + + +d2: + + ;=================== + ; music Player Setup + +tracker_song = peasant_song + + ; assume mockingboard in slot#4 + + ; inline mockingboard_init + +.include "mockingboard_init.s" + +.include "tracker_init.s" + + ; start the music playing + + cli + +bob: + lda KEYPRESS + bpl bob + +quiet: + lda #$3f + sta AY_REGS+7 + +end: + bne end + + +; music +.include "mA2E_3.s" +.include "interrupt_handler.s" +; must be last +.include "mockingboard_constants.s" diff --git a/demos/l/d3/hardware.inc b/demos/l/d4/hardware.inc similarity index 100% rename from demos/l/d3/hardware.inc rename to demos/l/d4/hardware.inc diff --git a/demos/l/d3/hello.bas b/demos/l/d4/hello.bas similarity index 100% rename from demos/l/d3/hello.bas rename to demos/l/d4/hello.bas diff --git a/demos/l/d3/interrupt_handler.s b/demos/l/d4/interrupt_handler.s similarity index 76% rename from demos/l/d3/interrupt_handler.s rename to demos/l/d4/interrupt_handler.s index c2405314..7fb755a4 100644 --- a/demos/l/d3/interrupt_handler.s +++ b/demos/l/d4/interrupt_handler.s @@ -40,6 +40,18 @@ ay3_irq_handler: bit MOCK_6522_T1CL + ; drop note down after first + lda #$C + sta AY_REGS+8 + sta AY_REGS+10 + +; lda #$0E +; sta AY_REGS+8 ; $08 volume A +; lda #$0C +; sta AY_REGS+9 ; $09 volume B +; sta AY_REGS+10 ; $0A volume C + + ;============================ ; see if still counting down @@ -57,7 +69,7 @@ set_notes_loop: ;================== ; see if hit end - cmp #$C0 + cmp #$FF bne all_ok ;==================================== @@ -71,25 +83,37 @@ all_ok: ; see if note - tay - and #$C0 - cmp #$C0 - beq handle_timing +; tay +; and #$C0 +; cmp #$C0 +; beq handle_timing note_only: +; tya + ; NNNNNLLC -- c=channel, n=note + + tay + + ldx #0 + lsr + bcc channel_a + ldx #4 ; skip to C +channel_a: + + and #$3 + sta SONG_COUNTDOWN +; inc SONG_COUNTDOWN + tya - ; CCXNNNNN -- c=channel, n=note + lsr + lsr + lsr - lsr - lsr - lsr - lsr - lsr - and #$FE ; fine register value, want in X - tax +; and #$FE ; fine register value, want in X +; tax - tya ; get note - and #$1F +; tya ; get note +; and #$1F tay ; lookup in table lda frequencies_low,Y @@ -98,27 +122,38 @@ note_only: lda frequencies_high,Y sta AY_REGS+1,X - jsr ay3_write_regs ; trashes A/X/Y - + lda #$F + sta AY_REGS+8 ;============================ ; point to next + ; assume less than 256 bytes inc SONG_OFFSET - ; assume less than 256 bytes - bne set_notes_loop ; bra + lda SONG_COUNTDOWN + beq set_notes_loop ; bra + + + +.include "ay3_write_regs.s" + +; jsr ay3_write_regs + + + + handle_timing: ; was timing - tya +; tya - and #$3f - sta SONG_COUNTDOWN +; and #$3f +; sta SONG_COUNTDOWN - inc SONG_OFFSET +; inc SONG_OFFSET done_update_song: dec SONG_COUNTDOWN @@ -147,3 +182,8 @@ done_ay3_irq_handler: ; typical ; ???? cycles + + + + + diff --git a/demos/l/d3/mA2E_2.txt b/demos/l/d4/mA2E_2.txt similarity index 100% rename from demos/l/d3/mA2E_2.txt rename to demos/l/d4/mA2E_2.txt diff --git a/demos/l/d4/mA2E_3.txt b/demos/l/d4/mA2E_3.txt new file mode 100644 index 00000000..76299e45 --- /dev/null +++ b/demos/l/d4/mA2E_3.txt @@ -0,0 +1,145 @@ +'' TITLE: Mockingboard Tune 3 - 2021 +' AUTHOR: mA2E / dSr +' COMMENTS: +' +' LOOP: 640 +' +' BPM: 250 +' TEMPO: 6 +' FREQ: 1000000 +' IRQ: 50 +' +' LYRICS: 0 +' +' ENDHEADER +------- +' 1 +0 G 3-- ----- G 6-- +1 ----- ----- ----- +2 ----- ----- ----- +3 G 4-- ----- D 6-- +4 ----- ----- ----- +5 F 3-- ----- ----- +6 G 3- ----- A#5-- +7 ----- ----- ----- +8 G 3-- ----- G 5-- +9 ----- ----- ----- +A ----- ----- ----- +B G 4-- ----- A#5-- +C ----- ----- ----- +D F 3-- ----- ----- +E G 3-- ----- D 6-- +F ----- ----- ----- +10 D#3-- ----- G 6-- +11 ----- ----- ----- +12 ----- ----- ----- +13 D#4-- ----- D#6-- +14 ----- ----- ----- +15 D 3- ----- ----- +16 D#3-- ----- A#5-- +17 ----- ----- ----- +18 D#3-- ----- G 5-- +19 ----- ----- ----- +1A ----- ----- ----- +1B D#4-- ----- A#5-- +1C ----- ----- ----- +1D D 3-- ----- ----- +1E D#3-- ----- G 6-- +1F ----- ----- ----- +20 F 3-- ----- F 6-- +21 ----- ----- ----- +22 ----- ----- ----- +23 F 4-- ----- ----- +24 ----- ----- C 6-- +25 D#3-- ----- ----- +26 F 3-- ----- A 5-- +27 ----- ----- ----- +28 F 3-- ----- F 5-- +29 ----- ----- ----- +2A ----- ----- ----- +2B F 4-- ----- A 5-- +2C ----- ----- ----- +2D D#3-- ----- ----- +2E F 3-- ----- D#6-- +2F ----- ----- ----- +30 D 3-- ----- D 6-- +31 ----- ----- ----- +32 ----- ----- ----- +33 D 4-- ----- D#6-- +34 ----- ----- ----- +35 C 3-- ----- ----- +36 D 3-- ----- D 6-- +37 ----- ----- ----- +38 D 3-- ----- C 6-- +39 ----- ----- ----- +3A ----- ----- ----- +3B D 4-- ----- A#5-- +3C ----- ----- ----- +3D C 3-- ----- ----- +3E D 3-- ----- A 5-- +3F ----- ----- ----- +' 1 +0 G 3-- ----- G 6-- +1 ----- ----- ----- +2 ----- ----- ----- +3 G 4-- ----- ----- +4 ----- ----- ----- +5 F 3-- ----- ----- +6 G 3- ----- F 6-- +7 ----- ----- D 6-- +8 G 3-- ----- G 5-- +9 ----- ----- ----- +A ----- ----- ----- +B G 4-- ----- ----- +C ----- ----- A#5-- +D F 3-- ----- ----- +E G 3-- ----- C 6-- +F ----- ----- ----- +10 D#3-- ----- G 6-- +11 ----- ----- ----- +12 ----- ----- ----- +13 D#4-- ----- ----- +14 ----- ----- ----- +15 D 3- ----- ----- +16 D#3-- ----- F 6-- +17 ----- ----- G 6-- +18 D#3-- ----- D#6-- +19 ----- ----- ----- +1A ----- ----- ----- +1B D#4-- ----- ----- +1C ----- ----- D 6-- +1D D 3-- ----- ----- +1E D#3-- ----- A#5-- +1F ----- ----- ----- +20 F 3-- ----- C 6-- +21 ----- ----- ----- +22 ----- ----- ----- +23 F 4-- ----- ----- +24 ----- ----- ----- +25 D#3-- ----- ----- +26 F 3-- ----- A#5-- +27 ----- ----- C 6-- +28 F 3-- ----- A 5-- +29 ----- ----- ----- +2A ----- ----- ----- +2B F 4-- ----- ----- +2C ----- ----- G 5-- +2D D#3-- ----- ----- +2E F 3-- ----- A 5-- +2F ----- ----- ----- +30 D 3-- ----- F 5-- +31 ----- ----- ----- +32 ----- ----- ----- +33 D 4-- ----- G 5-- +34 ----- ----- ----- +35 C 3-- ----- ----- +36 D 3-- ----- A 5-- +37 ----- ----- ----- +38 D 3-- ----- ----- +39 ----- ----- C 6-- +3A ----- ----- ----- +3B D 4-- ----- ----- +3C ----- ----- F 5-- +3D C 3-- ----- ----- +3E D 3-- ----- ----- +3F ----- ----- ----- diff --git a/demos/l/d4/mockingboard_constants.s b/demos/l/d4/mockingboard_constants.s new file mode 100644 index 00000000..603437e5 --- /dev/null +++ b/demos/l/d4/mockingboard_constants.s @@ -0,0 +1,16 @@ +init_addresses: + .byte interrupt_handler - sta $03ff - - + ; can save 10 bytes if we load in memory so this + ; is in the right place automatically + lda #interrupt_handler ; 2 + sta $03ff ; 3 + ;========= + ; 10 ;========================= ; Initialize the 6522s ; Reset Left AY-3-8910 @@ -88,9 +90,8 @@ mockingboard_init: ; entries=10 ; 14 + 2*entries = 34 bytes - ; to beat = 46 bytes - ldy #0 + ldy #0 ; 2 init_it_loop: lda init_values,Y ; 3 ldx init_addresses,Y ; 3 @@ -101,18 +102,4 @@ init_it_loop: doneit: -init_registers_to_zero: - ldx #13 - lda #0 - sta SONG_OFFSET ; also init song stuff - sta SONG_COUNTDOWN -init_loop: - sta AY_REGS,X - dex - bne init_loop - - jsr ay3_write_regs - - - diff --git a/demos/l/d3/text_to_tiny.c b/demos/l/d4/text_to_tiny.c similarity index 80% rename from demos/l/d3/text_to_tiny.c rename to demos/l/d4/text_to_tiny.c index 7a9292c5..c190784b 100644 --- a/demos/l/d3/text_to_tiny.c +++ b/demos/l/d4/text_to_tiny.c @@ -18,17 +18,22 @@ static int octave_adjust=0; static int notes_used[64]; static int allocated_notes[64]; static int notes_allocated=0; +static int total_len=0; unsigned short frequencies[]={ //C C# D D# E F F# G G# A A# B +//0x7A3,0x735,0x6CD,0x66C,0x60F,0x5B8,0x566,0x518,0x4CF,0x48A,0x449,0x40B, +0x3D1,0x39A,0x366,0x336,0x307,0x2DC,0x2B3,0x28C,0x267,0x245,0x224,0x205, 0x1E8,0x1CD,0x1B3,0x19B,0x183,0x16E,0x159,0x146,0x133,0x122,0x112,0x102, //3 0x0F4,0x0E6,0x0D9,0x0CD,0x0C1,0x0B7,0x0AC,0x0A3,0x099,0x091,0x089,0x081, //4 0x07A,0x073,0x06C,0x066,0x060,0x05B,0x056,0x051,0x04C,0x048,0x044,0x040, //5 -0x03D,0x039,0x036,0x033,0x030,0x02D,0x02B,0x028,0x026,0x024,0x022,0x020, //6 +//0x03D,0x039,0x036,0x033,0x030,0x02D,0x02B,0x028,0x026,0x024,0x022,0x020, //6 +//0x01E,0x01C,0x01B,0x019,0x018,0x016,0x015,0x014,0x013,0x012,0x011,0x010, +//0x00F,0x00E,0x00D,0x00C,0x00C,0x00B,0x00A,0x00A,0x009,0x009,0x008,0x008, }; -// CCOONNNN -- c=channel, o=octave, n=note +// CLLNNNN int note_to_ed(char note, int flat, int sharp, int octave) { @@ -315,6 +320,8 @@ int main(int argc, char **argv) { // int a_len=0,b_len=0,a_freq=0,b_freq=0; int current_length=0; int first=1; + int a_last=-1,c_last=-1; + unsigned char temp_value; printf("peasant_song:\n"); printf("; register init\n"); @@ -354,44 +361,86 @@ printf("\n"); if (a.ed_freq>=0) { a.offset=allocate_note(a.ed_freq); notes_used[a.ed_freq]++; - fprintf(stderr,"A: %d\n",a.ed_freq); + printf("; A: %d\n",a.ed_freq); } if (b.ed_freq>=0) { b.offset=allocate_note(b.ed_freq); notes_used[b.ed_freq]++; - fprintf(stderr,"B: %d\n",b.ed_freq); + printf("; B: %d\n",b.ed_freq); } if (c.ed_freq>=0) { c.offset=allocate_note(c.ed_freq); notes_used[c.ed_freq]++; - fprintf(stderr,"C: %d\n",c.ed_freq); + printf("; C: %d\n",c.ed_freq); } if ((a.ed_freq>=0)||(b.ed_freq>=0)||(c.ed_freq>=0)) { + printf("; none: a=%d c=%d len=%d\n",a_last,c_last,current_length); + //NNNNNLLC + + + if (!first) { - printf("\t.byte $%02X ; L = %d\n", - current_length|0xc0,current_length); - printf("\n"); - current_length=0; + if (a_last>=0) { + temp_value=(a_last<<3)|0; + if (c_last<0) temp_value|=(current_length<<1); + + printf("\t.byte $%02X ; A=%d L=%d\n", + temp_value, + a_last,c_last>=0?0:current_length); + total_len++; + a_last=-1; + } + + if (c_last>=0) { + printf("\t.byte $%02X ; C=%d L=%d\n", + (unsigned char)(c_last<<3)|((current_length)<<1)|1, + c_last,current_length); + total_len++; + c_last=-1; + } } + current_length=0; + + //if (!first) { +// printf("\t.byte $%02X ; L = %d\n", +// current_length|0xc0,current_length); +// printf("\n"); +// current_length=0; +// total_len++; + //} + first=0; - } + if (a.ed_freq>=0) { + a_last=a.offset; + } + if (b.ed_freq>=0) { + + } + if (c.ed_freq>=0) { + c_last=c.offset; + } + + +#if 0 if (a.ed_freq>=0) { printf("\t.byte $%02X ; A = %c%c%d freq=%d offset=%d\n", a.offset, a.note,sharp_char[a.sharp+2*a.flat], a.octave, a.ed_freq,a.offset); + total_len++; } if (b.ed_freq>=0) { printf("\t.byte $%02X ; B = %c%c%d\n", b.offset|0x40, b.note,sharp_char[b.sharp+2*b.flat], b.octave); + total_len++; } if (c.ed_freq>=0) { printf("\t.byte $%02X ; C = %c%c%d freq=%d offset=%d\n", @@ -399,14 +448,41 @@ printf("\n"); c.note,sharp_char[c.sharp+2*c.flat], c.octave, c.ed_freq,c.offset); + total_len++; } - +#endif current_length++; } - printf("\t.byte $C0 ; end\n"); + + printf("; last: a=%d c=%d len=%d\n",a_last,c_last,current_length); + if (a_last>=0) { + temp_value=(a_last<<3)|0; + if (c_last<0) temp_value|=(current_length<<1); + printf("\t.byte $%02X ; A=%d L=%d\n", + temp_value, + a_last,c_last>=0?0:current_length); + total_len++; + a_last=-1; + } + + if (c_last>=0) { + printf("\t.byte $%02X ; C=%d L=%d\n", + (unsigned char)(c_last<<3)|((current_length)<<1)|1, + c_last,current_length); + total_len++; + c_last=-1; + } + + +// printf("\t.byte $%02X ; L = %d\n", +// current_length|0xc0,current_length); +// printf("\n"); + + printf("\t.byte $FF ; end\n"); + total_len++; int o,n; @@ -431,6 +507,7 @@ printf("\n"); for(n=0;n>8)); if (n!=(notes_allocated-1)) printf(","); + total_len++; } printf("\n"); @@ -440,9 +517,12 @@ printf("\n"); for(n=0;n