From ef90e302872786689fe9ed91ed81ba89186c004d Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Fri, 5 Nov 2021 00:23:34 -0400 Subject: [PATCH] d2: working on stuff --- demos/d2/Makefile | 49 +++ demos/d2/d2.s | 53 +++ demos/d2/hardware.inc | 91 +++++ demos/d2/hello.bas | 2 + demos/d2/interrupt_handler.s | 165 +++++++++ demos/d2/mockingboard_setup.s | 251 +++++++++++++ demos/d2/moving.s | 165 +++++++++ demos/d2/peasant.txt | 654 ++++++++++++++++++++++++++++++++++ demos/d2/text_to_tiny.c | 372 +++++++++++++++++++ demos/d2/tiny_tracker.dsk | Bin 0 -> 143360 bytes demos/d2/zp.inc | 24 ++ 11 files changed, 1826 insertions(+) create mode 100644 demos/d2/Makefile create mode 100644 demos/d2/d2.s create mode 100644 demos/d2/hardware.inc create mode 100644 demos/d2/hello.bas create mode 100644 demos/d2/interrupt_handler.s create mode 100644 demos/d2/mockingboard_setup.s create mode 100644 demos/d2/moving.s create mode 100644 demos/d2/peasant.txt create mode 100644 demos/d2/text_to_tiny.c create mode 100644 demos/d2/tiny_tracker.dsk create mode 100644 demos/d2/zp.inc diff --git a/demos/d2/Makefile b/demos/d2/Makefile new file mode 100644 index 00000000..4d3edae0 --- /dev/null +++ b/demos/d2/Makefile @@ -0,0 +1,49 @@ +include ../../Makefile.inc + +DOS33 = ../../utils/dos33fs-utils/dos33 +EMPTY_DISK = ../../empty_disk +HGR2PNG = ../../utils/hgr-utils/png2hgr +LINKER_SCRIPTS = ../../linker_scripts +TOKENIZE = ../../utils/asoft_basic-utils/tokenize_asoft + +all: tiny_tracker.dsk text_to_tiny + +tiny_tracker.dsk: HELLO D2 + cp $(EMPTY_DISK)/empty.dsk ./tiny_tracker.dsk + $(DOS33) -y tiny_tracker.dsk SAVE A HELLO + $(DOS33) -y tiny_tracker.dsk -t BIN -a 0x6000 BSAVE D2 + +#### + +HELLO: hello.bas + $(TOKENIZE) < hello.bas > HELLO + +#### + +peasant_music.s: peasant.txt text_to_tiny + ./text_to_tiny peasant.txt > peasant_music.s + +#### + +D2: d2.o + ld65 -o D2 d2.o -C $(LINKER_SCRIPTS)/apple2_6000.inc + +d2.o: d2.s \ + zp.inc hardware.inc \ + peasant_music.s \ + interrupt_handler.s mockingboard_setup.s + ca65 -o d2.o d2.s -l d2.lst + +#### + +text_to_tiny: text_to_tiny.o + $(CC) -o text_to_tiny text_to_tiny.o -lm + +text_to_tiny.o: text_to_tiny.c + $(CC) $(CFLAGS) -c text_to_tiny.c + +#### + +clean: + rm -f *~ *.o *.lst YANKEE PEASANT HELLO text_to_tiny peasant_music.s + diff --git a/demos/d2/d2.s b/demos/d2/d2.s new file mode 100644 index 00000000..72fdb7e1 --- /dev/null +++ b/demos/d2/d2.s @@ -0,0 +1,53 @@ +; Tiny Mockingboard Player + +; 514B -- Initial implementation +; 423B -- inline everything +; 400B -- put register init at end of song +; 381B -- generate the frequency table + +; proposed format +; CCOONNNN -- c=channel, o=octave, n=note +; 11LLLLLL -- L=length +; 11LLLLLL -- wait time + +; by deater (Vince Weaver) + +; Zero Page + .include "zp.inc" + .include "hardware.inc" + + + ;========================================== + +tiny_music: + + ;=================== + ; + + ;=================== + ; Player Setup + + + lda #peasant_song + sta SONG_H + + ; assume mockingboard in slot#4 + jsr mockingboard_init + +start_interrupts: + cli + +forever: + jmp moving + + +.include "moving.s" + +; music +.include "peasant_music.s" +.include "interrupt_handler.s" +; must be last +.include "mockingboard_setup.s" + diff --git a/demos/d2/hardware.inc b/demos/d2/hardware.inc new file mode 100644 index 00000000..01c1d746 --- /dev/null +++ b/demos/d2/hardware.inc @@ -0,0 +1,91 @@ +;; HARDWARE LOCATIONS + +KEYPRESS = $C000 +KEYRESET = $C010 + +;; SOFT SWITCHES +CLR80COL = $C000 ; PAGE0/PAGE1 normal +SET80COL = $C001 ; PAGE0/PAGE1 switches PAGE0 in Aux instead +EIGHTYCOLOFF = $C00C +EIGHTYCOLON = $C00D +SPEAKER = $C030 +SET_GR = $C050 +SET_TEXT = $C051 +FULLGR = $C052 +TEXTGR = $C053 +PAGE1 = $C054 +PAGE2 = $C055 +LORES = $C056 ; Enable LORES graphics +HIRES = $C057 ; Enable HIRES graphics +AN3 = $C05E ; Annunciator 3 + +PADDLE_BUTTON0 = $C061 +PADDL0 = $C064 +PTRIG = $C070 + +;; BASIC ROUTINES + +NORMAL = $F273 +HGR2 = $F3D8 +HPOSN = $F411 ; (Y,X),(A) (values stores in HGRX,XH,Y) + + + +;; MONITOR ROUTINES + +HLINE = $F819 ;; HLINE Y,$2C at A +VLINE = $F828 ;; VLINE A,$2D at Y +CLRSCR = $F832 ;; Clear low-res screen +CLRTOP = $F836 ;; clear only top of low-res screen +SETGR = $FB40 ;; GR +SETCOL = $F864 ;; COLOR=A +TEXT = $FB36 +TABV = $FB5B ;; VTAB to A +BELL = $FBDD ;; ring the bell +BASCALC = $FBC1 ;; +VTAB = $FC22 ;; VTAB to CV +HOME = $FC58 ;; Clear the text screen +WAIT = $FCA8 ;; delay 1/2(26+27A+5A^2) us +CROUT1 = $FD8B +SETINV = $FE80 ;; INVERSE +SETNORM = $FE84 ;; NORMAL +COUT = $FDED ;; output A to screen +COUT1 = $FDF0 ;; output A to screen + + + + + + +COLOR_BLACK = 0 +COLOR_RED = 1 +COLOR_DARKBLUE = 2 +COLOR_PURPLE = 3 +COLOR_DARKGREEN = 4 +COLOR_GREY = 5 +COLOR_MEDIUMBLUE = 6 +COLOR_LIGHTBLUE = 7 +COLOR_BROWN = 8 +COLOR_ORANGE = 9 +COLOR_GREY2 = 10 +COLOR_PINK = 11 +COLOR_LIGHTGREEN = 12 +COLOR_YELLOW = 13 +COLOR_AQUA = 14 +COLOR_WHITE = 15 + +COLOR_BOTH_BLACK = $00 +COLOR_BOTH_RED = $11 +COLOR_BOTH_DARKBLUE = $22 +COLOR_BOTH_DARKGREEN = $44 +COLOR_BOTH_GREY = $55 +COLOR_BOTH_MEDIUMBLUE = $66 +COLOR_BOTH_LIGHTBLUE = $77 +COLOR_BOTH_BROWN = $88 +COLOR_BOTH_ORANGE = $99 +COLOR_BOTH_PINK = $BB +COLOR_BOTH_LIGHTGREEN = $CC +COLOR_BOTH_YELLOW = $DD +COLOR_BOTH_AQUA = $EE +COLOR_BOTH_WHITE = $FF + diff --git a/demos/d2/hello.bas b/demos/d2/hello.bas new file mode 100644 index 00000000..133a44bb --- /dev/null +++ b/demos/d2/hello.bas @@ -0,0 +1,2 @@ +5 HOME +10 PRINT CHR$(4);"CATALOG" diff --git a/demos/d2/interrupt_handler.s b/demos/d2/interrupt_handler.s new file mode 100644 index 00000000..85aa80e2 --- /dev/null +++ b/demos/d2/interrupt_handler.s @@ -0,0 +1,165 @@ + ;================================ + ;================================ + ; mockingboard interrupt handler + ;================================ + ;================================ + ; On Apple II/6502 the interrupt handler jumps to address in 0xfffe + ; This is in the ROM, which saves the registers + ; on older IIe it saved A to $45 (which could mess with DISK II) + ; newer IIe doesn't do that. + ; It then calculates if it is a BRK or not (which trashes A) + ; Then it sets up the stack like an interrupt and calls 0x3fe + + ; Note: the IIc is much more complicated + ; its firmware tries to decode the proper source + ; based on various things, including screen hole values + ; we bypass that by switching out ROM and replacing the + ; $fffe vector with this, but that does mean we have + ; to be sure status flag and accumulator set properly + +interrupt_handler: + php ; save status flags + cld ; clear decimal mode + pha ; save A ; 3 + ; A is saved in $45 by firmware + txa + pha ; save X + tya + pha ; save Y + + inc $0404 ; debug (flashes char onscreen) + + +ay3_irq_handler: + bit MOCK_6522_T1CL ; clear 6522 interrupt by reading T1C-L ; 4 + + ; see if still counting down + lda SONG_COUNTDOWN + bpl done_update_song + +try_again: + ldy SONG_OFFSET +set_notes_loop: + + ; see if hit end + lda (SONG_L),Y + cmp #$C0 + bne all_ok + + ; if at end, loop + +loop_forever: + jmp loop_forever + +; lda #0 +; sta SONG_OFFSET +; beq try_again +all_ok: + + ; see if note + + tax + and #$C0 + cmp #$C0 + beq handle_timing + +note_only: + txa + ; CCOONNNN -- c=channel, o=octave, n=note + ; TODO: OONNNNCC instead? + + lsr + lsr + lsr + lsr + sta octave_smc+1 + lsr + and #$FE + sta out_smc+1 + + txa + + and #$3F + + tax + lda frequency_lookup_low,X + sty y_smc+1 +out_smc: + ldx #$00 + jsr ay3_write_reg ; trashes A/Y + + ; set coarse note A + ; hack: if octave=0 (C2) then coarse=1 + ; else coarse=0 + + inx +octave_smc: + lda #$dd + and #$3 ; if 0 then 1 + ; if 1,2,3 then 0 + bne blah0 +blah1: + lda #1 + bne blah_blah +blah0: + lda #0 +blah_blah: + + jsr ay3_write_reg ; trashes A/Y + +y_smc: + ldy #0 + iny + bne not_wrap2 + inc SONG_H +not_wrap2: + jmp set_notes_loop + +handle_timing: + ; was timing + + txa + + and #$3f + sta SONG_COUNTDOWN + iny + sty SONG_OFFSET + bne not_wrap1 + + inc SONG_H + +not_wrap1: + +done_update_song: + dec SONG_COUNTDOWN + + + ;================================= + ; Finally done with this interrupt + ;================================= + +done_ay3_irq_handler: + + pla + tay ; restore Y + pla + tax ; restore X + pla ; restore a ; 4 + + ; on II+/IIe (but not IIc) we need to do this? +interrupt_smc: + lda $45 ; restore A + plp ; restore flags + + rti ; return from interrupt ; 6 + + ;============ + ; typical + ; ???? cycles + + + + + + + diff --git a/demos/d2/mockingboard_setup.s b/demos/d2/mockingboard_setup.s new file mode 100644 index 00000000..be8e68df --- /dev/null +++ b/demos/d2/mockingboard_setup.s @@ -0,0 +1,251 @@ +; Mockingboad programming: +; + Has two 6522 I/O chips connected to two AY-3-8910 chips +; + Optionally has some speech chips controlled via the outport on the AY +; + Often in slot 4 +; TODO: how to auto-detect? +; References used: +; http://macgui.com/usenet/?group=2&id=8366 +; 6522 Data Sheet +; AY-3-8910 Data Sheet + +;======================== +; Mockingboard card +; Essentially two 6522s hooked to the Apple II bus +; Connected to AY-3-8910 chips +; PA0-PA7 on 6522 connected to DA0-DA7 on AY +; PB0 on 6522 connected to BC1 +; PB1 on 6522 connected to BDIR +; PB2 on 6522 connected to RESET + + +; left speaker +MOCK_6522_ORB1 = $C400 ; 6522 #1 port b data +MOCK_6522_ORA1 = $C401 ; 6522 #1 port a data +MOCK_6522_DDRB1 = $C402 ; 6522 #1 data direction port B +MOCK_6522_DDRA1 = $C403 ; 6522 #1 data direction port A +MOCK_6522_T1CL = $C404 ; 6522 #1 t1 low order latches +MOCK_6522_T1CH = $C405 ; 6522 #1 t1 high order counter +MOCK_6522_T1LL = $C406 ; 6522 #1 t1 low order latches +MOCK_6522_T1LH = $C407 ; 6522 #1 t1 high order latches +MOCK_6522_T2CL = $C408 ; 6522 #1 t2 low order latches +MOCK_6522_T2CH = $C409 ; 6522 #1 t2 high order counters +MOCK_6522_SR = $C40A ; 6522 #1 shift register +MOCK_6522_ACR = $C40B ; 6522 #1 auxilliary control register +MOCK_6522_PCR = $C40C ; 6522 #1 peripheral control register +MOCK_6522_IFR = $C40D ; 6522 #1 interrupt flag register +MOCK_6522_IER = $C40E ; 6522 #1 interrupt enable register +MOCK_6522_ORANH = $C40F ; 6522 #1 port a data no handshake + + +; right speaker +MOCK_6522_ORB2 = $C480 ; 6522 #2 port b data +MOCK_6522_ORA2 = $C481 ; 6522 #2 port a data +MOCK_6522_DDRB2 = $C482 ; 6522 #2 data direction port B +MOCK_6522_DDRA2 = $C483 ; 6522 #2 data direction port A + +; AY-3-8910 commands on port B +; RESET BDIR BC1 +MOCK_AY_RESET = $0 ; 0 0 0 +MOCK_AY_INACTIVE = $4 ; 1 0 0 +MOCK_AY_READ = $5 ; 1 0 1 +MOCK_AY_WRITE = $6 ; 1 1 0 +MOCK_AY_LATCH_ADDR = $7 ; 1 1 1 + + + ;======================== + ;======================== + ; Mockingboard Init + ;======================== + ;======================== + +mockingboard_init: + + ;========================= + ; Initialize the 6522s + ; set the data direction for all pins of PortA/PortB to be output + + + lda #$ff ; all output (1) + + sta MOCK_6522_DDRB1 ; set for 6522 #1 + sta MOCK_6522_DDRA1 + + sta MOCK_6522_DDRB2 ; set for 6522 #2 + sta MOCK_6522_DDRA2 + + +mockingboard_setup_interrupt: + + ;========================= + ; Setup Interrupt Handler + ;========================= + + ; NOTE: we don't support IIc as it's a hack + ; traditionally Mockingboard on IIc was rare + + ;======================== + ; set up interrupt + ; Vector address goes to 0x3fe/0x3ff + + lda #interrupt_handler + sta $03ff + + ;============================ + ; Enable 50Hz clock on 6522 + ;============================ + + + ; Note, on Apple II the clock isn't 1MHz but is actually closer to + ; roughly 1.023MHz, and every 65th clock is stretched (it's complicated) + + ; 9c40 / 1.023e6 = .040s, 25Hz + ; 8534 / 1.023e6 = .033s, 30Hz + ; 4fe7 / 1.023e6 = .020s, 50Hz + ; 411a / 1.023e6 = .016s, 60Hz + + ; French Touch uses + ; 4e20 / 1.000e6 = .020s, 50Hz, which assumes 1MHz clock freq + + sei ; disable interrupts just in case + + lda #$40 ; Continuous interrupts, don't touch PB7 + sta MOCK_6522_ACR ; ACR register + + lda #$7F ; clear all interrupt flags + sta MOCK_6522_IER ; IER register (interrupt enable) + + lda #$C0 + sta MOCK_6522_IFR ; IFR: 1100, enable interrupt on timer one oflow + sta MOCK_6522_IER ; IER: 1100, enable timer one interrupt + + lda #$34 +; lda #$E7 + sta MOCK_6522_T1CL ; write into low-order latch + + lda #$85 +; lda #$4f + sta MOCK_6522_T1CH ; write into high-order latch, + ; load both values into counter + ; clear interrupt and start counting + + + + ;=================================== + ;=================================== + ; Reset Both AY-3-8910s + ;=================================== + ;=================================== + + ;=========================== + ; Reset Right/Left AY-3-8910 + ;=========================== + lda #MOCK_AY_RESET + sta MOCK_6522_ORB1 + sta MOCK_6522_ORB2 + lda #MOCK_AY_INACTIVE + sta MOCK_6522_ORB1 + sta MOCK_6522_ORB2 + +init_registers: + + ; init song data + + lda #0 + sta SONG_OFFSET + sta SONG_COUNTDOWN + + ; read 14 bytes from beginning of song to init + + ldx #13 +init_loop: +init_smc: + txa + tay + lda (SONG_L),Y + jsr ay3_write_reg ; trashes Y + dex + bne init_loop + + ; update SONG_L to point past the init + lda SONG_L + clc + adc #14 + sta SONG_L + bcc no_oflo + inc SONG_H +no_oflo: + + ; create Frequency Table + ldx #11 +make_freq_loop: + sec + lda frequency_lookup_low,X + ror + sta frequency_lookup_low+16,X + lsr + sta frequency_lookup_low+32,X + lsr + sta frequency_lookup_low+48,X + + dex + bpl make_freq_loop + + inx + stx frequency_lookup_low+28 + + rts + + + ;===================== + ;===================== + ;===================== + ; ay3 write reg + ;===================== + ;===================== + ;===================== + ; writes to both chips (so same output to both Right/Left) + ; address in X (preserved) + ; value in A + + ; NOTE: it looks like you could interleave things to save bytes + ; but technically this violates the AY-3-8910 spec sheet on + ; finishing accesses in less than 10us (10 cycles) + +ay3_write_reg: + pha + lda #MOCK_AY_LATCH_ADDR ; latch_address for PB1 ; 2 + ldy #MOCK_AY_INACTIVE ; go inactive ; 2 + + stx MOCK_6522_ORA1 ; put address on PA1 ; 4 + sta MOCK_6522_ORB1 ; latch_address on PB1 ; 4 + sty MOCK_6522_ORB1 ; 4 + + stx MOCK_6522_ORA2 ; put address on PA2 ; 4 + sta MOCK_6522_ORB2 ; latch_address on PB2 ; 4 + sty MOCK_6522_ORB2 ; 4 + pla + + ; value + sta MOCK_6522_ORA1 ; put value on PA1 ; 4 + sta MOCK_6522_ORA2 ; put value on PA2 ; 4 + lda #MOCK_AY_WRITE ; ; 2 + + sta MOCK_6522_ORB1 ; write on PB1 ; 4 + sty MOCK_6522_ORB1 ; 4 + + sta MOCK_6522_ORB2 ; write on PB2 ; 4 + sty MOCK_6522_ORB2 ; 4 + + rts + + +; starts at C4 +frequency_lookup_low: +.byte $E8,$CD,$B3,$9B,$83,$6E,$59,$46,$33,$22,$12,$02 + +;$1E8,$1CD,$1B3,$19B,$183,$16E,$159,$146,$133,$122,$112,$102, +;.byte $F4,$E6,$D9,$CD,$C1,$B7,$AC,$A3,$99,$91,$89,$81,$00,$00,$00,$00 +;.byte $7A,$73,$6C,$66,$60,$5B,$56,$51,$4C,$48,$44,$40,$00,$00,$00,$00 +;.byte $3D,$39,$36,$33,$30,$2D,$2B,$28,$26,$24,$22,$20,$00,$00,$00,$00 diff --git a/demos/d2/moving.s b/demos/d2/moving.s new file mode 100644 index 00000000..bacd43d5 --- /dev/null +++ b/demos/d2/moving.s @@ -0,0 +1,165 @@ +; Moving +; moving, orange and green + + ;================================ + ; Clear screen and setup graphics + ;================================ +moving: + + jsr HGR2 ; set hi-res 140x192, page2, fullscreen + ; A and Y both 0 at end + ;================== + ; create sinetable + + ;ldy #0 ; Y is 0 +sinetable_loop: + tya ; 2 + and #$3f ; wrap sine at 63 entries ; 2 + + cmp #$20 + php ; save pos/negative for later + + and #$1f + + cmp #$10 + bcc sin_left ; blt + +sin_right: + ; sec carry should be set here + eor #$FF + adc #$20 ; 32-X +sin_left: + tax + lda sinetable_base,X ; 4+ + + plp + bcc sin_done + +sin_negate: + ; carry set here + eor #$ff +; adc #0 ; FIXME: this makes things off by 1 + +sin_done: + sta sinetable,Y + + iny + bne sinetable_loop + + + ; NOTE: making gbash/gbasl table wasn't worth it + + ;============================ + ; main loop + ;============================ + +draw_oval: + inc FRAME + + lda #191 ; YY + +create_yloop: + ; HGR_Y (YY) is in A here + +; ldx #39 ; X is don't care? +; ldy #0 ; Y is also don't care? + + jsr HPOSN ; (Y,X),(A) (values stores in HGRX,XH,Y) + + ; restore values + + lda HGR_Y ; YY + tax + +calcsine_div4: + lsr + lsr ; 2 + sec + sbc FRAME + tay + lda sinetable,y + sta row_sum_smc+1 + +; ldx HGR_Y ; YY + + ldy #39 ; XX +create_xloop: + + ;===================== + ; critical inner loop + ; every cycle here is 40x192 cycles + ;===================== + + clc + tya + adc FRAME + tax + lda sinetable,X + + adc sinetable,Y ; 4+ +row_sum_smc: + adc #$dd ; row base value ; 2 + + lsr ; double colors ; 2 + ; also puts bit in carry + ; which helps proper color gen + and #$7 ; 2 + tax ; 2 + lda colorlookup,X ; lookup in table ; 5 + +ror_nop_smc: + ror ; $6A/$EA ; 2 + sta (GBASL),Y ; 6 + + lda ror_nop_smc ; toggle ror/nop ; 4 + eor #$80 ; 2 + sta ror_nop_smc ; 4 + + dey ; 2 + bpl create_xloop ; 2/3 + + dec HGR_Y + lda HGR_Y + cmp #$ff ; blah want to draw line 0 + bne create_yloop + +flip_pages: + + ; Y should be $FF here + + lda HGR_PAGE ; will be $20/$40 + cmp #$20 + bne done_page + dey +done_page: + ldx PAGE1-$FE,Y ; set display page to PAGE1 or PAGE2 + + eor #$60 ; flip draw page between $2000/$4000 + sta HGR_PAGE + + bne draw_oval ; bra + + +colorlookup: +.byte $22,$aa,$ba,$ff,$ba,$aa,$22 ; use 00 from sinetable +;.byte $00 + +;.byte $11,$55,$5d,$7f,$5d,$55,$11 ; use 00 from sinetable +;.byte $00 + + +;sinetable_base = $F5BA + +sinetable_base: +; this is actually (32*sin(x)) +.byte $00,$03,$06,$09,$0C,$0F,$11,$14 +.byte $16,$18,$1A,$1C,$1D,$1E,$1F,$1F +.byte $20 + + ; for bot + ; 3F5 - 7d = 378 +; jmp oval + +sinetable=$8000 + + diff --git a/demos/d2/peasant.txt b/demos/d2/peasant.txt new file mode 100644 index 00000000..1d872a1f --- /dev/null +++ b/demos/d2/peasant.txt @@ -0,0 +1,654 @@ +' +' TITLE: Peasant's Quest Theme +' AUTHOR: (tracked by) Vince Weaver +' COMMENTS: based on MIDI found online +' +' LOOP: 640 +' +' BPM: 250 +' TEMPO: 6 +' FREQ: 1000000 +' IRQ: 50 +' +' LYRICS: 0 +' +' ENDHEADER +------- +' 0 +0 C 2-- R---- R---- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- ----- ----- +9 ----- ----- ----- +A ----- ----- ----- +B R---- ----- ----- +C C 2-- ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F R---- ----- ----- +10 C 2-- ----- ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 R---- ----- ----- +14 C 2-- ----- ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 R---- ----- ----- +18 C 2-- ----- ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 R---- ----- ----- +24 C 2-- ----- ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 R---- ----- ----- +28 C 2-- ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B R---- ----- ----- +2C C 2-- ----- ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F R---- ----- ----- +' 0 again +0 C 2 3 ----- ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- ----- ----- +9 ----- ----- ----- +A ----- ----- ----- +B R---- ----- ----- +C C 2 3 ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F R---- ----- ----- +10 C 2 3 ----- ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 R---- ----- ----- +14 C 2 3 ----- ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 R---- ----- ----- +18 C 2 3 ----- ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 R---- ----- ----- +24 C 2 3 ----- ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 R---- ----- ----- +28 C 2 3 ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B R---- ----- ----- +2C C 2 3 ----- ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 1 +0 F 2 3 ----- ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- ----- ----- +9 ----- ----- ----- +A ----- ----- ----- +B R---- ----- ----- +C F 2 3 ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F R---- ----- ----- +10 F 2 3 ----- ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 R---- ----- ----- +14 F 2 3 ----- ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 R---- ----- ----- +18 F 2 3 ----- ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 R---- ----- ----- +24 F 2 3 ----- ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 R---- ----- ----- +28 F 2 3 ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B R---- ----- ----- +2C F 2 3 ----- ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 2 +0 G 2 3 ----- ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- ----- ----- +9 ----- ----- ----- +A ----- ----- ----- +B R---- ----- ----- +C G 2 3 ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F R---- ----- ----- +10 G 2 3 ----- ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 R---- ----- ----- +14 G 2 3 ----- ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 R---- ----- ----- +18 G 2 3 ----- ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 R---- ----- ----- +24 G 2 3 ----- ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 R---- ----- ----- +28 G 2 3 ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B R---- ----- ----- +2C G 2 3 ----- ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 3 +0 C 2 3 C 4 4 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- ----- ----- +9 ----- ----- ----- +A ----- ----- ----- +B R---- ----- ----- +C C 2 3 ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F R---- ----- ----- +10 C 2 3 ----- ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 R---- ----- ----- +14 C 2 3 ----- ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 R---- ----- ----- +18 C 2 3 R---- ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 R---- ----- ----- +24 C 2 3 ----- ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 R---- ----- ----- +28 C 2 3 ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B R---- ----- ----- +2C C 2 3 ----- ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F R---- ----- ----- +' 4 +0 C 2 3 ----- ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- G 4-- ----- +9 ----- ----- ----- +A ----- ----- ----- +B R---- R---- ----- +C C 2 3 G 4 4 ----- +D ----- ----- ----- +E ----- ----- ----- +F R---- ----- ----- +10 C 2 3 ----- ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 R---- ----- ----- +14 C 2 3 F 4 3 ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 R---- R---- ----- +18 C 2 3 F 4 4 ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- R---- ----- +20 ----- E 4 3 ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 ----- R---- ----- +24 C 2 3 E 4 4 ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 R---- ----- ----- +28 C 2 3 ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B R---- ----- ----- +2C C 2 3 F 4 3 ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 5 +0 F 2 3 C 4 4 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- ----- ----- +9 ----- ----- ----- +A ----- ----- ----- +B R---- ----- ----- +C F 2 3 ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F R---- ----- ----- +10 F 2 3 ----- ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 R---- ----- ----- +14 F 2 3 ----- ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 R---- R---- ----- +18 F 2 3 ----- ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 ----- ----- ----- +24 F 2 3 ----- ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 R---- ----- ----- +28 F 2 3 ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B R---- ----- ----- +2C F 2 3 ----- ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 6 +0 G 2 3 ----- ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- G 4 3 ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- R---- ----- +C G 2 3 G 4 4 ----- +D ----- ----- ----- +E ----- ----- ----- +F R---- ----- ----- +10 G 2 3 ----- ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 R---- ----- ----- +14 G 2 3 F 4-- ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 R---- R---- ----- +18 G 2 3 F 4 4 ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- E 4 3 ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 ----- R---- ----- +24 G 2 3 E 4 4 ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 R---- ----- ----- +28 G 2 3 ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B R---- ----- ----- +2C G 2 3 F 4 3 ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 7 +0 C 2 3 D 4 3 ----- +1 ----- ----- ----- +2 ----- R---- ----- +3 ----- D 4 6 ----- +4 ----- D 4 8 ----- +5 ----- R---- ----- +6 ----- D 4 3 ----- +7 ----- ----- ----- +8 ----- R---- ----- +9 ----- D 4 3 ----- +A ----- ----- ----- +B R---- ----- ----- +C C 2 3 A#4 4 ----- +D ----- ----- ----- +E ----- ----- ----- +F R---- R---- ----- +10 C 2 3 A#4 4 ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 R---- R---- ----- +14 C 2 3 A#4 3 ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 R---- ----- ----- +18 C 2 3 D 4 3 ----- +19 ----- ----- ----- +1A ----- R---- ----- +1B ----- D 4 6 ----- +1C ----- D 4 8 ----- +1D ----- R---- ----- +1E ----- D 4 4 ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- D 4 8 ----- +23 R---- ----- ----- +24 C 2 3 G 4 4 ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 R---- R---- ----- +28 C 2 3 G 4 4 ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B R---- R---- ----- +2C C 2 3 G 4 3 ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F R---- ----- ----- +' 8 +0 C 2 3 D 4 3 ----- +1 ----- ----- ----- +2 ----- R---- ----- +3 ----- D 4 6 ----- +4 ----- D 4 8 ----- +5 ----- R---- ----- +6 ----- D 4 8 ----- +7 ----- R---- ----- +8 ----- D 4 4 ----- +9 ----- ----- ----- +A ----- ----- ----- +B R---- ----- ----- +C C 2 3 A#4 4 ----- +D ----- ----- ----- +E ----- ----- ----- +F R---- R---- ----- +10 C 2 3 A#4 8 ----- +11 ----- ----- ----- +12 ----- D 4 4 ----- +13 R---- ----- ----- +14 C 2 3 ----- ----- +15 ----- R---- ----- +16 ----- D 4 8 ----- +17 R---- ----- ----- +18 C 2 3 G 4 4 ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- R---- ----- +1C ----- G 4 8 ----- +1D ----- ----- ----- +1E ----- D 4 4 ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- R---- ----- +22 ----- D 4 8 ----- +23 R---- ----- ----- +24 C 2 3 F 4 4 ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 R---- R---- ----- +28 C 2 3 F 4 8 ----- +29 ----- ----- ----- +2A ----- G 4 4 ----- +2B R---- ----- ----- +2C C 2 3 ----- ----- +2D ----- R---- ----- +2E ----- G 4 8 ----- +2F R---- ----- ----- +' 5 +0 F 2 3 C 4 4 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- ----- ----- +9 ----- ----- ----- +A ----- ----- ----- +B R---- ----- ----- +C F 2 3 ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F R---- ----- ----- +10 F 2 3 ----- ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 R---- ----- ----- +14 F 2 3 ----- ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 R---- R---- ----- +18 F 2 3 ----- ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 R---- ----- ----- +24 F 2 3 ----- ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 R---- ----- ----- +28 F 2 3 ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B R---- ----- ----- +2C F 2 3 ----- ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 6 +0 G 2 3 ----- ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- G 4 3 ----- +9 ----- ----- ----- +A ----- ----- ----- +B R---- R---- ----- +C G 2 3 G 4 4 ----- +D ----- ----- ----- +E ----- ----- ----- +F R---- ----- ----- +10 G 2 3 ----- ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 R---- ----- ----- +14 G 2 3 F 4 3 ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 R---- R---- ----- +18 G 2 3 F 4 4 ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- R---- ----- +1C ----- F 4 3 ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- E 4 3 ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 R---- ----- ----- +24 G 2 3 ----- ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 R---- R---- ----- +28 G 2 3 E 4 3 ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B R---- R---- ----- +2C G 2 3 F 4 3 ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 9 +0 C 2 3 G 4 4 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- ----- ----- +9 ----- ----- ----- +A ----- ----- ----- +B R---- ----- ----- +C C 2 3 ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F R---- ----- ----- +10 C 2 3 ----- ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 R---- ----- ----- +14 C 2 3 ----- ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 R---- ----- ----- +18 C 2 3 R---- ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 R---- ----- ----- +24 C 2 3 ----- ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 R---- ----- ----- +28 C 2 3 ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B R---- ----- ----- +2C C 2 3 ----- ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F R---- R---- R---- +' LOOP TO FRAME 8 diff --git a/demos/d2/text_to_tiny.c b/demos/d2/text_to_tiny.c new file mode 100644 index 00000000..4c2f410e --- /dev/null +++ b/demos/d2/text_to_tiny.c @@ -0,0 +1,372 @@ +/* make music for tiny_music player */ + +#define VERSION "1.0" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +static int octave_adjust=1; + +// CCOONNNN -- c=channel, o=octave, n=note + +int note_to_ed(char note, int flat, int sharp, int octave) { + + int offset; + + switch(note) { + case 'C': offset=0; break; + case 'D': offset=2; break; + case 'E': offset=4; break; + case 'F': offset=5; break; + case 'G': offset=7; break; + case 'A': offset=9; break; + case 'B': offset=11; break; + + case 'R': offset=12; flat=0; sharp=0; octave=3; break; + + default: + fprintf(stderr,"Unknown note %c\n",note); + return -1; + } + if (flat==1) offset--; + if (sharp==1) offset++; + if (sharp==2) offset+=2; + + + offset=((((octave+octave_adjust)-3)&0x3)<<4)|offset; + + return offset; +} + + + +static int debug=0; + +static int line=0; + +static int header_version=0; + + +struct note_type { + unsigned char which; + unsigned char note; + int sharp,flat; + int octave; + int len; + int enabled; + int freq; + int length; + int left; + int ed_freq; +}; + + + +static int get_note(char *string, int sp, struct note_type *n, int line) { + + int freq; + int ch; + +// fprintf(stderr,"VMW: Entering, sp=%d\n",sp); + + /* Skip white space */ + while((string[sp]==' ' || string[sp]=='\t')) sp++; + + if (string[sp]=='\n') return -1; + + /* return early if no change */ + ch=string[sp]; + +// fprintf(stderr,"VMW: %d %d\n",ch,sp); + + if (ch=='-') { + if (header_version==0) return sp+6; + else { + return sp+11; + } + } + + /* get note info */ + n->sharp=0; + n->flat=0; + n->ed_freq=-1; + n->note=ch; + sp++; + if (string[sp]==' ') ; + else if (string[sp]=='#') n->sharp=1; + else if (string[sp]=='-') n->flat=1; + else if (string[sp]=='=') n->flat=2; + else { + fprintf(stderr,"Unknown note modifier %c, line %d:%d\n", + string[sp],line,sp); + fprintf(stderr,"String: %s\n",string); + } +// printf("Sharp=%d Flat=%d\n",n->sharp,n->flat); + sp++; + n->octave=string[sp]-'0'; + sp++; + sp++; + n->len=string[sp]-'0'; + sp++; + + + if (n->note!='-') { + + freq=note_to_ed(n->note,n->flat,n->sharp, + n->octave); + + n->enabled=1; + n->length=0; + n->ed_freq=freq; + } + + if (header_version==2) sp+=6; + + return sp; +} + +static int get_string(char *string, char *key, char *output, int strip_linefeed) { + + char *found; + + found=strstr(string,key); + found=found+strlen(key); + + /* get rid of leading whitespace */ + while(1) { + if ((*found==' ') || (*found=='\t')) found++; + else break; + } + + strcpy(output,found); + + /* remove trailing linefeed */ + if (strip_linefeed) output[strlen(output)-1]=0; + + return 0; + +} + +static void print_help(int just_version, char *exec_name) { + + printf("\ntext_to_ed version %s by Vince Weaver \n\n",VERSION); + if (just_version) exit(0); + + printf("This created Electric Duet files\n\n"); + + printf("Usage:\n"); + printf("\t%s [-h] [-v] [-d] [-o X] [-i X] textfile outbase\n\n", + exec_name); + printf("\t-h: this help message\n"); + printf("\t-v: version info\n"); + printf("\t-d: print debug messages\n"); + printf("\t-o: Offset octave by X\n"); + printf("\t-i: set second instrument to X\n"); + + exit(0); +} + + +int main(int argc, char **argv) { + + char string[BUFSIZ]; + char *result; + char *in_filename; + char temp[BUFSIZ]; + FILE *in_file=NULL; + //int attributes=0; + int loop=0; + int sp,external_frequency,irq; + struct note_type a,b,c; + int copt; + + char song_name[BUFSIZ]; + char author_name[BUFSIZ]; + char comments[BUFSIZ]; + char *comments_ptr=comments; + + unsigned char sharp_char[]=" #-="; + + /* Parse command line arguments */ + while ((copt = getopt(argc, argv, "dhvo:i:"))!=-1) { + switch (copt) { + case 'd': + /* Debug messages */ + printf("Debug enabled\n"); + debug=1; + break; + case 'h': + /* help */ + print_help(0,argv[0]); + break; + case 'v': + /* version */ + print_help(1,argv[0]); + break; + case 'o': + /* octave offset */ + octave_adjust=atoi(optarg); + break; + default: + print_help(0,argv[0]); + break; + } + } + + if (argv[optind]!=NULL) { + /* Open the input file */ + if (argv[optind][0]=='-') { + in_file=stdin; + } + else { + in_filename=strdup(argv[optind]); + in_file=fopen(in_filename,"r"); + if (in_file==NULL) { + fprintf(stderr,"Couldn't open %s\n",in_filename); + return -1; + } + } + } + + + /* Get the info for the header */ + + while(1) { + result=fgets(string,BUFSIZ,in_file); + if (result==NULL) break; + line++; + if (strstr(string,"ENDHEADER")) break; + if (strstr(string,"HEADER:")) { + get_string(string,"HEADER:",temp,1); + header_version=atoi(temp); + printf("Found header version %d\n",header_version); + } + if (strstr(string,"TITLE:")) { + get_string(string,"TITLE:",song_name,1); + } + if (strstr(string,"AUTHOR:")) { + get_string(string,"AUTHOR:",author_name,1); + } + if (strstr(string,"COMMENTS:")) { + get_string(string,"COMMENTS:",comments_ptr,0); + comments_ptr=&comments[strlen(comments)]; + } + + if (strstr(string,"FREQ:")) { + get_string(string,"FREQ:",temp,1); + external_frequency=atoi(temp); + } + if (strstr(string,"IRQ:")) { + get_string(string,"IRQ:",temp,1); + irq=atoi(temp); + } + if (strstr(string,"LOOP:")) { + get_string(string,"LOOP:",temp,1); + loop=atoi(temp); + } + + } + + a.which='A'; b.which='B'; c.which='C'; + + + // algorithm + // get A,B,C + + +// int first=1; +// int a_last=0,b_last=0,same_count=0; +// int a_len=0,b_len=0,a_freq=0,b_freq=0; + int current_length=0; + int first=1; + +printf("peasant_song:\n"); +printf("; register init\n"); +printf("\t.byte $00,$00,$00,$00,$00,$00 ; $00: A/B/C fine/coarse\n"); +printf("\t.byte $00 ; $06\n"); +printf("\t.byte $38 ; $07 mixer (ABC on)\n"); +printf("\t.byte $0E,$0C,$0C ; $08 volume A/B/C\n"); +printf("\t.byte $00,$00,$00,$00 ; $09\n"); +printf("\n"); + + while(1) { + result=fgets(string,BUFSIZ,in_file); + if (result==NULL) break; + line++; + + a.ed_freq=-1; + b.ed_freq=-1; + c.ed_freq=-1; + a.length=0; + b.length=0; + c.length=0; + + /* skip comments */ + if (string[0]=='\'') continue; + if (string[0]=='-') continue; + if (string[0]=='*') continue; + + sp=0; + + /* Skip line number */ + while((string[sp]!=' ' && string[sp]!='\t')) sp++; + + sp=get_note(string,sp,&a,line); + if (sp!=-1) sp=get_note(string,sp,&b,line); + if (sp!=-1) sp=get_note(string,sp,&c,line); + + + if ((a.ed_freq>=0)||(b.ed_freq>=0)||(c.ed_freq>=0)) { + if (!first) { + printf("\t.byte $%02X ; L = %d\n", + current_length|0xc0,current_length); + printf("\n"); + current_length=0; + } + + first=0; + + } + + + if (a.ed_freq>=0) { + printf("\t.byte $%02X ; A = %c%c%d\n", + a.ed_freq, + a.note,sharp_char[a.sharp+2*a.flat], + a.octave); + } + if (b.ed_freq>=0) { + printf("\t.byte $%02X ; B = %c%c%d\n", + b.ed_freq|0x40, + b.note,sharp_char[b.sharp+2*b.flat], + b.octave); + } + if (c.ed_freq>=0) { + printf("\t.byte $%02X ; C = %c%c%d\n", + c.ed_freq|0x80, + c.note,sharp_char[c.sharp+2*c.flat], + c.octave); + } + + current_length++; + + + } + + printf("\t.byte $C0 ; end\n"); + + (void) irq; + (void) loop; + (void) external_frequency; + + return 0; +} + diff --git a/demos/d2/tiny_tracker.dsk b/demos/d2/tiny_tracker.dsk new file mode 100644 index 0000000000000000000000000000000000000000..b1ac3a87d2affbe823354cb3c5209883b895b8d6 GIT binary patch literal 143360 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%0A^T3sc2tX!$@}o=l4>E`Bt8xN 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 MYsTWDGX^34FNlG>OaK4? literal 0 HcmV?d00001 diff --git a/demos/d2/zp.inc b/demos/d2/zp.inc new file mode 100644 index 00000000..60e981f4 --- /dev/null +++ b/demos/d2/zp.inc @@ -0,0 +1,24 @@ +; zero page + +; pre-defined applesoft vars + +CH = $24 +CV = $25 +GBASL = $26 +GBASH = $27 +BASL = $28 +BASH = $29 + +SONG_L = $70 +SONG_H = $71 +SONG_OFFSET = $72 +SONG_COUNTDOWN = $73 + +HGR_X = $E0 +HGR_XH = $E1 +HGR_Y = $E2 +HGR_COLOR = $E4 +HGR_PAGE = $E6 + +FRAME = $FC +