tiny_music: how small can we make it

This commit is contained in:
Vince Weaver 2021-11-02 00:01:43 -04:00
parent 3a5b83a304
commit 1ebc926af1
10 changed files with 1333 additions and 0 deletions

36
demos/tiny_music/Makefile Normal file
View File

@ -0,0 +1,36 @@
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_music.dsk
tiny_music.dsk: HELLO MUSIC
cp $(EMPTY_DISK)/empty.dsk ./tiny_music.dsk
$(DOS33) -y tiny_music.dsk SAVE A HELLO
$(DOS33) -y tiny_music.dsk -t BIN -a 0x2000 BSAVE MUSIC
####
HELLO: hello.bas
$(TOKENIZE) < hello.bas > HELLO
####
MUSIC: music.o
ld65 -o MUSIC music.o -C $(LINKER_SCRIPTS)/apple2_2000.inc
music.o: music.s \
zp.inc hardware.inc nozp.inc \
interrupt_handler.s mockingboard_setup.s
ca65 -o music.o music.s -l music.lst
####
clean:
rm -f *~ *.o *.lst MUSIC HELLO

View File

@ -0,0 +1,39 @@
#include <stdio.h>
double frequencies[8][12]={
{ 32.703, 34.648, 36.708, 38.891, 41.203, 43.654,
46.249, 48.999, 51.913, 55.000, 58.270, 61.735,},
{ 65.406, 69.296, 73.416, 77.782, 82.406, 87.308,
92.498, 97.998, 103.826, 110.000, 116.540, 123.470,},
{130.812, 138.592, 146.832, 155.564, 164.812, 174.616,
184.996, 195.996, 207.652, 220.000, 233.080, 246.940,},
{261.624, 277.184, 293.664, 311.128, 329.624, 349.232,
369.992, 391.992, 415.304, 440.000, 466.160, 493.880,},
{523.248, 554.368, 587.328, 622.256, 659.248, 698.464,
739.984, 783.984, 830.608, 880.000, 932.320, 987.760,},
{1046.496,1108.736,1174.656,1244.512,1318.496,1396.928,
1479.968,1567.968,1661.216,1760.000,1864.640,1975.520,},
{2092.992,2217.472,2349.312,2489.024,2636.992,2793.856,
2959.936,3125.936,3322.432,3520.000,3729.280,3951.040,},
{4185.984,4434.944,4698.624,4978.048,5273.984,5587.712,
5919.872,6271.872,6644.864,7040.000,7458.560,7902.080}};
#define FREQUENCY 1023000.0
int main(int argc, char **argv) {
int n,o;
for(o=1;o<9;o++) {
for(n=0;n<12;n++) {
// printf("%d %d: %lf $%04X\n",n,o,
// frequencies[o-1][n],
// (int)((FREQUENCY/frequencies[o-1][n])/16.0));
printf("$%02X,",
(int)((FREQUENCY/frequencies[o-1][n])/16.0));
}
printf("\n");
}
return 0;
}

View File

@ -0,0 +1,87 @@
;; 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
PAGE0 = $C054
PAGE1 = $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
;; 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

View File

@ -0,0 +1,2 @@
5 HOME
10 PRINT CHR$(4);"CATALOG"

View File

@ -0,0 +1,136 @@
;================================
;================================
; 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)
pt3_irq_handler:
bit MOCK_6522_T1CL ; clear 6522 interrupt by reading T1C-L ; 4
; set note A
ldx #$00
lda #$F4
jsr pt3_write_reg
; set coarse note A
ldx #$01
lda #$00
jsr pt3_write_reg
; set mixer ABC enabled
ldx #$07
lda #$38
jsr pt3_write_reg
; A volume 14
ldx #$08
lda #$E
jsr pt3_write_reg
;=================================
; Finally done with this interrupt
;=================================
done_pt3_irq_handler:
jmp exit_interrupt
;=================================
; Finally done with this interrupt
;=================================
quiet_exit:
stx DONE_PLAYING
jsr clear_ay_both
ldx #$ff ; also mute the channel
stx AY_REGISTERS+7 ; just in case
exit_interrupt:
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
rti ; return from interrupt ; 6
;============
; typical
; ???? cycles
; starts at C4
frequency_lookup:
.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
; .byte $EE,$E1,$D4,$C8,$BD,$B2,$A8,$9F,$96,$8E,$86,$7E,$00,$00,$00,$00
; .byte $77,$70,$6A,$64,$5E,$59,$54,$4F,$4B,$47,$43,$3F,$00,$00,$00,$00
; .byte $3B,$38,$35,$32,$2F,$2C,$2A,$27,$25,$23,$21,$1F,$00,$00,$00,$00
;=====================
; address in X
; value in A
pt3_write_reg:
stx MOCK_6522_ORA1 ; put address on PA1 ; 4
stx MOCK_6522_ORA2 ; put address on PA2 ; 4
ldy #MOCK_AY_LATCH_ADDR ; latch_address for PB1 ; 2
sty MOCK_6522_ORB1 ; latch_address on PB1 ; 4
sty MOCK_6522_ORB2 ; latch_address on PB2 ; 4
ldy #MOCK_AY_INACTIVE ; go inactive ; 2
sty MOCK_6522_ORB1 ; 4
sty MOCK_6522_ORB2 ; 4
; 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

View File

@ -0,0 +1,277 @@
; 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
;========================
; Initialize the 6522s
; set the data direction for all pins of PortA/PortB to be output
mockingboard_init:
lda #$ff ; all output (1)
mock_init_smc1:
sta MOCK_6522_DDRB1
sta MOCK_6522_DDRA1
mock_init_smc2:
sta MOCK_6522_DDRB2
sta MOCK_6522_DDRA2
rts
;===================================
;===================================
; Reset Both AY-3-8910s
;===================================
;===================================
;======================
; Reset Left AY-3-8910
;======================
reset_ay_both:
lda #MOCK_AY_RESET
reset_ay_smc1:
sta MOCK_6522_ORB1
lda #MOCK_AY_INACTIVE
reset_ay_smc2:
sta MOCK_6522_ORB1
;======================
; Reset Right AY-3-8910
;======================
;reset_ay_right:
;could be merged with both
lda #MOCK_AY_RESET
reset_ay_smc3:
sta MOCK_6522_ORB2
lda #MOCK_AY_INACTIVE
reset_ay_smc4:
sta MOCK_6522_ORB2
rts
; Write sequence
; Inactive -> Latch Address -> Inactive -> Write Data -> Inactive
;=========================================
; Write Right/Left to save value AY-3-8910
;=========================================
; register in X
; value in MB_VALUE
write_ay_both:
; address
write_ay_smc1:
stx MOCK_6522_ORA1 ; put address on PA1 ; 4
stx MOCK_6522_ORA2 ; put address on PA2 ; 4
lda #MOCK_AY_LATCH_ADDR ; latch_address on PB1 ; 2
write_ay_smc2:
sta MOCK_6522_ORB1 ; latch_address on PB1 ; 4
sta MOCK_6522_ORB2 ; latch_address on PB2 ; 4
ldy #MOCK_AY_INACTIVE ; go inactive ; 2
write_ay_smc3:
sty MOCK_6522_ORB1 ; 4
sty MOCK_6522_ORB2 ; 4
;===========
; 28
; value
lda MB_VALUE ; 3
write_ay_smc4:
sta MOCK_6522_ORA1 ; put value on PA1 ; 4
sta MOCK_6522_ORA2 ; put value on PA2 ; 4
lda #MOCK_AY_WRITE ; ; 2
write_ay_smc5:
sta MOCK_6522_ORB1 ; write on PB1 ; 4
sta MOCK_6522_ORB2 ; write on PB2 ; 4
write_ay_smc6:
sty MOCK_6522_ORB1 ; 4
sty MOCK_6522_ORB2 ; 4
;===========
; 29
rts ; 6
;===========
; 63
write_ay_both_end:
;.assert >write_ay_both = >write_ay_both_end, error, "write_ay_both crosses page"
;=======================================
; clear ay -- clear all 14 AY registers
; should silence the card
;=======================================
; 7+(74*14)+5=1048
clear_ay_both:
ldx #13 ; 2
lda #0 ; 2
sta MB_VALUE ; 3
clear_ay_left_loop:
jsr write_ay_both ; 6+63
dex ; 2
bpl clear_ay_left_loop ; 3
; -1
rts ; 6
clear_ay_end:
;.assert >clear_ay_both = >clear_ay_end, error, "clear_ay_both crosses page"
;=============================
; Setup
;=============================
mockingboard_setup_interrupt:
.ifdef PT3_ENABLE_APPLE_IIC
lda APPLEII_MODEL
cmp #'C'
bne done_iic_hack
; bypass the firmware interrupt handler
; should we do this on IIe too? probably faster
; first we have to copy the ROM to the language card
sei ; disable interrupts
copy_rom_loop:
lda $c089 ; read ROM, write RAM1
lda $c089
ldy #0
read_rom_loop:
lda $D000,Y
sta $400,Y ; note this uses text page as
; temporary data store
iny
bne read_rom_loop
lda $c08B ; read/write RAM1
lda $c08B ;
write_rom_loop:
lda $400,Y
sta $D000,Y
iny
bne write_rom_loop
inc read_rom_loop+2
inc write_rom_loop+5
bne copy_rom_loop
lda #<interrupt_handler
sta $fffe
lda #>interrupt_handler
sta $ffff
lda #$EA ; nop out the "lda $45" in the irq handler
sta interrupt_smc
sta interrupt_smc+1
.endif
done_iic_hack:
;=========================
; Setup Interrupt Handler
;=========================
; Vector address goes to 0x3fe/0x3ff
; FIXME: should chain any existing handler
lda #<interrupt_handler
sta $03fe
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)
; 4fe7 / 1.023e6 = .020s, 50Hz
; 9c40 / 1.023e6 = .040s, 25Hz
; 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
setup_irq_smc1:
sta MOCK_6522_ACR ; ACR register
lda #$7F ; clear all interrupt flags
setup_irq_smc2:
sta MOCK_6522_IER ; IER register (interrupt enable)
lda #$C0
setup_irq_smc3:
sta MOCK_6522_IFR ; IFR: 1100, enable interrupt on timer one oflow
setup_irq_smc4:
sta MOCK_6522_IER ; IER: 1100, enable timer one interrupt
lda #$E7
; lda #$20
setup_irq_smc5:
sta MOCK_6522_T1CL ; write into low-order latch
lda #$4f
; lda #$4E
setup_irq_smc6:
sta MOCK_6522_T1CH ; write into high-order latch,
; load both values into counter
; clear interrupt and start counting
rts

46
demos/tiny_music/music.s Normal file
View File

@ -0,0 +1,46 @@
; Tiny Mockingboard Player
; proposed format
; CCOONNNN -- c=channel, o=octave, n=note
; 11LLLLLL -- L=length
; by deater (Vince Weaver) <vince@deater.net>
; Zero Page
.include "zp.inc"
.include "hardware.inc"
;==========================================
tiny_music:
;===================
;
;===================
; Player Setup
lda #0
sta DONE_PLAYING
lda #1
sta LOOP
; assume mockingboard in slot#4
jsr mockingboard_init
jsr mockingboard_setup_interrupt
jsr reset_ay_both
jsr clear_ay_both
start_interrupts:
cli
rts
.include "mockingboard_setup.s"
.include "interrupt_handler.s"
.include "nozp.inc"

27
demos/tiny_music/nozp.inc Normal file
View File

@ -0,0 +1,27 @@
;; Things that normally would go in the zero page
AY_REGISTERS:
A_FINE_TONE: .byte $00
A_COARSE_TONE: .byte $00
B_FINE_TONE: .byte $00
B_COARSE_TONE: .byte $00
C_FINE_TONE: .byte $00
C_COARSE_TONE: .byte $00
NOISE: .byte $00
ENABLE:
PT3_MIXER_VAL: .byte $00
A_VOLUME: .byte $00
B_VOLUME: .byte $00
C_VOLUME: .byte $00
ENVELOPE_FINE: .byte $00
ENVELOPE_COARSE:.byte $00
ENVELOPE_SHAPE: .byte $00
LOOP: .byte $00
MB_VALUE: .byte $00
DONE_PLAYING: .byte $00
DONE_SONG: .byte $00
PT3_TEMP: .byte $00

View File

@ -0,0 +1,654 @@
'
' TITLE: Peasant's Quest Theme
' AUTHOR: (tracked by) Vince Weaver <vince@deater.net>
' COMMENTS: based on MIDI found online
'
' LOOP: 640
'
' BPM: 250
' TEMPO: 6
' FREQ: 1000000
' IRQ: 50
'
' LYRICS: 0
'
' ENDHEADER
-------
' 0
0 C 2 3 ----- -----
1 ----- ----- -----
2 ----- ----- -----
3 ----- ----- -----
4 ----- ----- -----
5 ----- ----- -----
6 ----- ----- -----
7 ----- ----- -----
8 ----- ----- -----
9 ----- ----- -----
A ----- ----- -----
B ----- ----- -----
C C 2 3 ----- -----
D ----- ----- -----
E ----- ----- -----
F ----- ----- -----
10 C 2 3 ----- -----
11 ----- ----- -----
12 ----- ----- -----
13 ----- ----- -----
14 C 2 3 ----- -----
15 ----- ----- -----
16 ----- ----- -----
17 ----- ----- -----
18 C 2 3 ----- -----
19 ----- ----- -----
1A ----- ----- -----
1B ----- ----- -----
1C ----- ----- -----
1D ----- ----- -----
1E ----- ----- -----
1F ----- ----- -----
20 ----- ----- -----
21 ----- ----- -----
22 ----- ----- -----
23 ----- ----- -----
24 C 2 3 ----- -----
25 ----- ----- -----
26 ----- ----- -----
27 ----- ----- -----
28 C 2 3 ----- -----
29 ----- ----- -----
2A ----- ----- -----
2B ----- ----- -----
2C C 2 3 ----- -----
2D ----- ----- -----
2E ----- ----- -----
2F ----- ----- -----
' 0 again
0 C 2 3 ----- -----
1 ----- ----- -----
2 ----- ----- -----
3 ----- ----- -----
4 ----- ----- -----
5 ----- ----- -----
6 ----- ----- -----
7 ----- ----- -----
8 ----- ----- -----
9 ----- ----- -----
A ----- ----- -----
B ----- ----- -----
C C 2 3 ----- -----
D ----- ----- -----
E ----- ----- -----
F ----- ----- -----
10 C 2 3 ----- -----
11 ----- ----- -----
12 ----- ----- -----
13 ----- ----- -----
14 C 2 3 ----- -----
15 ----- ----- -----
16 ----- ----- -----
17 ----- ----- -----
18 C 2 3 ----- -----
19 ----- ----- -----
1A ----- ----- -----
1B ----- ----- -----
1C ----- ----- -----
1D ----- ----- -----
1E ----- ----- -----
1F ----- ----- -----
20 ----- ----- -----
21 ----- ----- -----
22 ----- ----- -----
23 ----- ----- -----
24 C 2 3 ----- -----
25 ----- ----- -----
26 ----- ----- -----
27 ----- ----- -----
28 C 2 3 ----- -----
29 ----- ----- -----
2A ----- ----- -----
2B ----- ----- -----
2C C 2 3 ----- -----
2D ----- ----- -----
2E ----- ----- -----
2F ----- ----- -----
' 1
0 F 2 3 ----- -----
1 ----- ----- -----
2 ----- ----- -----
3 ----- ----- -----
4 ----- ----- -----
5 ----- ----- -----
6 ----- ----- -----
7 ----- ----- -----
8 ----- ----- -----
9 ----- ----- -----
A ----- ----- -----
B ----- ----- -----
C F 2 3 ----- -----
D ----- ----- -----
E ----- ----- -----
F ----- ----- -----
10 F 2 3 ----- -----
11 ----- ----- -----
12 ----- ----- -----
13 ----- ----- -----
14 F 2 3 ----- -----
15 ----- ----- -----
16 ----- ----- -----
17 ----- ----- -----
18 F 2 3 ----- -----
19 ----- ----- -----
1A ----- ----- -----
1B ----- ----- -----
1C ----- ----- -----
1D ----- ----- -----
1E ----- ----- -----
1F ----- ----- -----
20 ----- ----- -----
21 ----- ----- -----
22 ----- ----- -----
23 ----- ----- -----
24 F 2 3 ----- -----
25 ----- ----- -----
26 ----- ----- -----
27 ----- ----- -----
28 F 2 3 ----- -----
29 ----- ----- -----
2A ----- ----- -----
2B ----- ----- -----
2C F 2 3 ----- -----
2D ----- ----- -----
2E ----- ----- -----
2F ----- ----- -----
' 2
0 G 2 3 ----- -----
1 ----- ----- -----
2 ----- ----- -----
3 ----- ----- -----
4 ----- ----- -----
5 ----- ----- -----
6 ----- ----- -----
7 ----- ----- -----
8 ----- ----- -----
9 ----- ----- -----
A ----- ----- -----
B ----- ----- -----
C G 2 3 ----- -----
D ----- ----- -----
E ----- ----- -----
F ----- ----- -----
10 G 2 3 ----- -----
11 ----- ----- -----
12 ----- ----- -----
13 ----- ----- -----
14 G 2 3 ----- -----
15 ----- ----- -----
16 ----- ----- -----
17 ----- ----- -----
18 G 2 3 ----- -----
19 ----- ----- -----
1A ----- ----- -----
1B ----- ----- -----
1C ----- ----- -----
1D ----- ----- -----
1E ----- ----- -----
1F ----- ----- -----
20 ----- ----- -----
21 ----- ----- -----
22 ----- ----- -----
23 ----- ----- -----
24 G 2 3 ----- -----
25 ----- ----- -----
26 ----- ----- -----
27 ----- ----- -----
28 G 2 3 ----- -----
29 ----- ----- -----
2A ----- ----- -----
2B ----- ----- -----
2C G 2 3 ----- -----
2D ----- ----- -----
2E ----- ----- -----
2F ----- ----- -----
' 3
0 C 2 3 C 4 4 -----
1 ----- ----- -----
2 ----- ----- -----
3 ----- ----- -----
4 ----- C 4 4 -----
5 ----- ----- -----
6 ----- ----- -----
7 ----- ----- -----
8 ----- C 4 4 -----
9 ----- ----- -----
A ----- ----- -----
B ----- ----- -----
C C 2 3 C 4 4 -----
D ----- ----- -----
E ----- ----- -----
F ----- ----- -----
10 C 2 3 C 4 4 -----
11 ----- ----- -----
12 ----- ----- -----
13 ----- ----- -----
14 C 2 3 C 4 4 -----
15 ----- ----- -----
16 ----- ----- -----
17 ----- ----- -----
18 C 2 3 ----- -----
19 ----- ----- -----
1A ----- ----- -----
1B ----- ----- -----
1C ----- ----- -----
1D ----- ----- -----
1E ----- ----- -----
1F ----- ----- -----
20 ----- ----- -----
21 ----- ----- -----
22 ----- ----- -----
23 ----- ----- -----
24 C 2 3 ----- -----
25 ----- ----- -----
26 ----- ----- -----
27 ----- ----- -----
28 C 2 3 ----- -----
29 ----- ----- -----
2A ----- ----- -----
2B ----- ----- -----
2C C 2 3 ----- -----
2D ----- ----- -----
2E ----- ----- -----
2F ----- ----- -----
' 4
0 C 2 3 ----- -----
1 ----- ----- -----
2 ----- ----- -----
3 ----- ----- -----
4 ----- ----- -----
5 ----- ----- -----
6 ----- ----- -----
7 ----- ----- -----
8 ----- G 4 3 -----
9 ----- ----- -----
A ----- ----- -----
B ----- ----- -----
C C 2 3 G 4 4 -----
D ----- ----- -----
E ----- ----- -----
F ----- ----- -----
10 C 2 3 G 4 3 -----
11 ----- ----- -----
12 ----- ----- -----
13 ----- ----- -----
14 C 2 3 F 4 3 -----
15 ----- ----- -----
16 ----- ----- -----
17 ----- ----- -----
18 C 2 3 F 4 4 -----
19 ----- ----- -----
1A ----- ----- -----
1B ----- ----- -----
1C ----- F 4 3 -----
1D ----- ----- -----
1E ----- ----- -----
1F ----- ----- -----
20 ----- E 4 3 -----
21 ----- ----- -----
22 ----- ----- -----
23 ----- ----- -----
24 C 2 3 E 4 4 -----
25 ----- ----- -----
26 ----- ----- -----
27 ----- ----- -----
28 C 2 3 E 4 3 -----
29 ----- ----- -----
2A ----- ----- -----
2B ----- ----- -----
2C C 2 3 F 4 3 -----
2D ----- ----- -----
2E ----- ----- -----
2F ----- ----- -----
' 5
0 F 2 3 C 4 4 -----
1 ----- ----- -----
2 ----- ----- -----
3 ----- ----- -----
4 ----- C 4 4 -----
5 ----- ----- -----
6 ----- ----- -----
7 ----- ----- -----
8 ----- C 4 4 -----
9 ----- ----- -----
A ----- ----- -----
B ----- ----- -----
C F 2 3 C 4 4 -----
D ----- ----- -----
E ----- ----- -----
F ----- ----- -----
10 F 2 3 C 4 4 -----
11 ----- ----- -----
12 ----- ----- -----
13 ----- ----- -----
14 F 2 3 C 4 4 -----
15 ----- ----- -----
16 ----- ----- -----
17 ----- ----- -----
18 F 2 3 ----- -----
19 ----- ----- -----
1A ----- ----- -----
1B ----- ----- -----
1C ----- ----- -----
1D ----- ----- -----
1E ----- ----- -----
1F ----- ----- -----
20 ----- ----- -----
21 ----- ----- -----
22 ----- ----- -----
23 ----- ----- -----
24 F 2 3 ----- -----
25 ----- ----- -----
26 ----- ----- -----
27 ----- ----- -----
28 F 2 3 ----- -----
29 ----- ----- -----
2A ----- ----- -----
2B ----- ----- -----
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 ----- ----- -----
C G 2 3 G 4 4 -----
D ----- ----- -----
E ----- ----- -----
F ----- ----- -----
10 G 2 3 G 4 3 -----
11 ----- ----- -----
12 ----- ----- -----
13 ----- ----- -----
14 G 2 3 F 4 3 -----
15 ----- ----- -----
16 ----- ----- -----
17 ----- ----- -----
18 G 2 3 F 4 4 -----
19 ----- ----- -----
1A ----- ----- -----
1B ----- ----- -----
1C ----- F 4 3 -----
1D ----- ----- -----
1E ----- ----- -----
1F ----- ----- -----
20 ----- E 4 3 -----
21 ----- ----- -----
22 ----- ----- -----
23 ----- ----- -----
24 G 2 3 E 4 4 -----
25 ----- ----- -----
26 ----- ----- -----
27 ----- ----- -----
28 G 2 3 E 4 3 -----
29 ----- ----- -----
2A ----- ----- -----
2B ----- ----- -----
2C G 2 3 F 4 3 -----
2D ----- ----- -----
2E ----- ----- -----
2F ----- ----- -----
' 7
0 C 2 3 D 4 3 -----
1 ----- ----- -----
2 ----- ----- -----
3 ----- D 4 6 -----
4 ----- D 4 8 -----
5 ----- ----- -----
6 ----- D 4 3 -----
7 ----- ----- -----
8 ----- ----- -----
9 ----- D 4 3 -----
A ----- ----- -----
B ----- ----- -----
C C 2 3 A#4 4 -----
D ----- ----- -----
E ----- ----- -----
F ----- ----- -----
10 C 2 3 A#4 4 -----
11 ----- ----- -----
12 ----- ----- -----
13 ----- ----- -----
14 C 2 3 A#4 3 -----
15 ----- ----- -----
16 ----- ----- -----
17 ----- ----- -----
18 C 2 3 D 4 3 -----
19 ----- ----- -----
1A ----- ----- -----
1B ----- D 4 6 -----
1C ----- D 4 8 -----
1D ----- ----- -----
1E ----- D 4 4 -----
1F ----- ----- -----
20 ----- ----- -----
21 ----- ----- -----
22 ----- D 4 8 -----
23 ----- ----- -----
24 C 2 3 G 4 4 -----
25 ----- ----- -----
26 ----- ----- -----
27 ----- ----- -----
28 C 2 3 G 4 4 -----
29 ----- ----- -----
2A ----- ----- -----
2B ----- ----- -----
2C C 2 3 G 4 3 -----
2D ----- ----- -----
2E ----- ----- -----
2F ----- ----- -----
' 8
0 C 2 3 D 4 3 -----
1 ----- ----- -----
2 ----- ----- -----
3 ----- D 4 6 -----
4 ----- D 4 8 -----
5 ----- ----- -----
6 ----- D 4 8 -----
7 ----- ----- -----
8 ----- D 4 4 -----
9 ----- ----- -----
A ----- ----- -----
B ----- ----- -----
C C 2 3 A#4 4 -----
D ----- ----- -----
E ----- ----- -----
F ----- ----- -----
10 C 2 3 A#4 8 -----
11 ----- ----- -----
12 ----- D 4 4 -----
13 ----- ----- -----
14 C 2 3 ----- -----
15 ----- ----- -----
16 ----- D 4 8 -----
17 ----- ----- -----
18 C 2 3 G 4 4 -----
19 ----- ----- -----
1A ----- ----- -----
1B ----- ----- -----
1C ----- G 4 8 -----
1D ----- ----- -----
1E ----- D 4 4 -----
1F ----- ----- -----
20 ----- ----- -----
21 ----- ----- -----
22 ----- D 4 8 -----
23 ----- ----- -----
24 C 2 3 F 4 4 -----
25 ----- ----- -----
26 ----- ----- -----
27 ----- ----- -----
28 C 2 3 F 4 8 -----
29 ----- ----- -----
2A ----- G 4 4 -----
2B ----- ----- -----
2C C 2 3 ----- -----
2D ----- ----- -----
2E ----- G 4 8 -----
2F ----- ----- -----
' 5
0 F 2 3 C 4 4 -----
1 ----- ----- -----
2 ----- ----- -----
3 ----- ----- -----
4 ----- C 4 4 -----
5 ----- ----- -----
6 ----- ----- -----
7 ----- ----- -----
8 ----- C 4 4 -----
9 ----- ----- -----
A ----- ----- -----
B ----- ----- -----
C F 2 3 C 4 4 -----
D ----- ----- -----
E ----- ----- -----
F ----- ----- -----
10 F 2 3 C 4 4 -----
11 ----- ----- -----
12 ----- ----- -----
13 ----- ----- -----
14 F 2 3 C 4 4 -----
15 ----- ----- -----
16 ----- ----- -----
17 ----- ----- -----
18 F 2 3 ----- -----
19 ----- ----- -----
1A ----- ----- -----
1B ----- ----- -----
1C ----- ----- -----
1D ----- ----- -----
1E ----- ----- -----
1F ----- ----- -----
20 ----- ----- -----
21 ----- ----- -----
22 ----- ----- -----
23 ----- ----- -----
24 F 2 3 ----- -----
25 ----- ----- -----
26 ----- ----- -----
27 ----- ----- -----
28 F 2 3 ----- -----
29 ----- ----- -----
2A ----- ----- -----
2B ----- ----- -----
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 ----- ----- -----
C G 2 3 G 4 4 -----
D ----- ----- -----
E ----- ----- -----
F ----- ----- -----
10 G 2 3 G 4 3 -----
11 ----- ----- -----
12 ----- ----- -----
13 ----- ----- -----
14 G 2 3 F 4 3 -----
15 ----- ----- -----
16 ----- ----- -----
17 ----- ----- -----
18 G 2 3 F 4 4 -----
19 ----- ----- -----
1A ----- ----- -----
1B ----- ----- -----
1C ----- F 4 3 -----
1D ----- ----- -----
1E ----- ----- -----
1F ----- ----- -----
20 ----- E 4 3 -----
21 ----- ----- -----
22 ----- ----- -----
23 ----- ----- -----
24 G 2 3 E 4 4 -----
25 ----- ----- -----
26 ----- ----- -----
27 ----- ----- -----
28 G 2 3 E 4 3 -----
29 ----- ----- -----
2A ----- ----- -----
2B ----- ----- -----
2C G 2 3 F 4 3 -----
2D ----- ----- -----
2E ----- ----- -----
2F ----- ----- -----
' 9
0 C 2 3 G 4 4 -----
1 ----- ----- -----
2 ----- ----- -----
3 ----- ----- -----
4 ----- G 4 4 -----
5 ----- ----- -----
6 ----- ----- -----
7 ----- ----- -----
8 ----- G 4 3 -----
9 ----- ----- -----
A ----- ----- -----
B ----- ----- -----
C C 2 3 ----- -----
D ----- ----- -----
E ----- ----- -----
F ----- ----- -----
10 C 2 3 ----- -----
11 ----- ----- -----
12 ----- ----- -----
13 ----- ----- -----
14 C 2 3 ----- -----
15 ----- ----- -----
16 ----- ----- -----
17 ----- ----- -----
18 C 2 3 ----- -----
19 ----- ----- -----
1A ----- ----- -----
1B ----- ----- -----
1C ----- ----- -----
1D ----- ----- -----
1E ----- ----- -----
1F ----- ----- -----
20 ----- ----- -----
21 ----- ----- -----
22 ----- ----- -----
23 ----- ----- -----
24 C 2 3 ----- -----
25 ----- ----- -----
26 ----- ----- -----
27 ----- ----- -----
28 C 2 3 ----- -----
29 ----- ----- -----
2A ----- ----- -----
2B ----- ----- -----
2C C 2 3 ----- -----
2D ----- ----- -----
2E ----- ----- -----
2F ----- ----- -----
' LOOP TO FRAME 8

29
demos/tiny_music/zp.inc Normal file
View File

@ -0,0 +1,29 @@
; these need to be in zero page
; can we find a location that works?
PATTERN_L = $06
PATTERN_H = $07
ORNAMENT_L = $08
ORNAMENT_H = $09
SAMPLE_L = $0A
SAMPLE_H = $0B
MB_ADDR_L = $0C
MB_ADDR_H = $0D
; only used for title screen...
TEMP = $FA
TEMPY = $FB
;INL = $FC
;INH = $FD
;OUTL = $FE
;OUTH = $FF
; pre-defined applesoft vars
CH = $24
CV = $25
GBASL = $26
GBASH = $27
BASL = $28
BASH = $29