mirror of
https://github.com/deater/dos33fsprogs.git
synced 2025-02-12 23:31:43 +00:00
tiny_music: have it playing three channels
This commit is contained in:
parent
16908b61c6
commit
0fb112fb3c
@ -27,6 +27,7 @@ MUSIC: music.o
|
|||||||
|
|
||||||
music.o: music.s \
|
music.o: music.s \
|
||||||
zp.inc hardware.inc nozp.inc \
|
zp.inc hardware.inc nozp.inc \
|
||||||
|
yankee_music.s \
|
||||||
interrupt_handler.s mockingboard_setup.s
|
interrupt_handler.s mockingboard_setup.s
|
||||||
ca65 -o music.o music.s -l music.lst
|
ca65 -o music.o music.s -l music.lst
|
||||||
|
|
||||||
|
@ -35,31 +35,76 @@ interrupt_handler:
|
|||||||
pt3_irq_handler:
|
pt3_irq_handler:
|
||||||
bit MOCK_6522_T1CL ; clear 6522 interrupt by reading T1C-L ; 4
|
bit MOCK_6522_T1CL ; clear 6522 interrupt by reading T1C-L ; 4
|
||||||
|
|
||||||
; set note A
|
; 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 #$FF
|
||||||
|
bne all_ok
|
||||||
|
|
||||||
|
; if at end, reset
|
||||||
|
lda #0
|
||||||
|
sta SONG_OFFSET
|
||||||
|
beq try_again
|
||||||
|
all_ok:
|
||||||
|
|
||||||
|
|
||||||
|
; see if note
|
||||||
|
|
||||||
|
tax
|
||||||
|
and #$C0
|
||||||
|
cmp #$C0
|
||||||
|
bne note_only
|
||||||
|
|
||||||
|
; was timing
|
||||||
|
|
||||||
|
txa
|
||||||
|
and #$3f
|
||||||
|
sta SONG_COUNTDOWN
|
||||||
|
iny
|
||||||
|
sty SONG_OFFSET
|
||||||
|
jmp done_update_song
|
||||||
|
|
||||||
|
note_only:
|
||||||
|
txa
|
||||||
|
; CCOONNNN -- c=channel, o=octave, n=note
|
||||||
|
; FIXME: OONNNNCC instead?
|
||||||
|
|
||||||
|
pha
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
and #$FE
|
||||||
|
sta out_smc+1
|
||||||
|
pla
|
||||||
|
and #$3F
|
||||||
|
tax
|
||||||
|
lda frequency_lookup,X
|
||||||
|
sty y_smc+1
|
||||||
|
out_smc:
|
||||||
ldx #$00
|
ldx #$00
|
||||||
lda #$F4
|
jsr pt3_write_reg ; trashes A/X/Y
|
||||||
jsr pt3_write_reg
|
|
||||||
|
|
||||||
; set coarse note A
|
; set coarse note A (assume 0)
|
||||||
|
; could get extra octave by putting 1 here
|
||||||
|
|
||||||
ldx #$01
|
y_smc:
|
||||||
lda #$00
|
ldy #0
|
||||||
jsr pt3_write_reg
|
iny
|
||||||
|
jmp set_notes_loop
|
||||||
; set mixer ABC enabled
|
|
||||||
|
|
||||||
ldx #$07
|
|
||||||
lda #$38
|
|
||||||
jsr pt3_write_reg
|
|
||||||
|
|
||||||
; A volume 14
|
|
||||||
|
|
||||||
ldx #$08
|
|
||||||
lda #$E
|
|
||||||
jsr pt3_write_reg
|
|
||||||
|
|
||||||
|
done_update_song:
|
||||||
|
|
||||||
|
dec SONG_COUNTDOWN
|
||||||
|
|
||||||
|
|
||||||
;=================================
|
;=================================
|
||||||
@ -134,3 +179,6 @@ pt3_write_reg:
|
|||||||
sta MOCK_6522_ORB2 ; write on PB2 ; 4
|
sta MOCK_6522_ORB2 ; write on PB2 ; 4
|
||||||
sty MOCK_6522_ORB2 ; 4
|
sty MOCK_6522_ORB2 ; 4
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -241,8 +241,9 @@ done_iic_hack:
|
|||||||
; Note, on Apple II the clock isn't 1MHz but is actually closer to
|
; 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)
|
; roughly 1.023MHz, and every 65th clock is stretched (it's complicated)
|
||||||
|
|
||||||
; 4fe7 / 1.023e6 = .020s, 50Hz
|
|
||||||
; 9c40 / 1.023e6 = .040s, 25Hz
|
; 9c40 / 1.023e6 = .040s, 25Hz
|
||||||
|
; 8534 / 1.023e6 = .033s, 30Hz
|
||||||
|
; 4fe7 / 1.023e6 = .020s, 50Hz
|
||||||
; 411a / 1.023e6 = .016s, 60Hz
|
; 411a / 1.023e6 = .016s, 60Hz
|
||||||
|
|
||||||
; French Touch uses
|
; French Touch uses
|
||||||
@ -263,15 +264,61 @@ setup_irq_smc3:
|
|||||||
setup_irq_smc4:
|
setup_irq_smc4:
|
||||||
sta MOCK_6522_IER ; IER: 1100, enable timer one interrupt
|
sta MOCK_6522_IER ; IER: 1100, enable timer one interrupt
|
||||||
|
|
||||||
lda #$E7
|
lda #$34
|
||||||
; lda #$20
|
; lda #$E7
|
||||||
setup_irq_smc5:
|
setup_irq_smc5:
|
||||||
sta MOCK_6522_T1CL ; write into low-order latch
|
sta MOCK_6522_T1CL ; write into low-order latch
|
||||||
lda #$4f
|
lda #$85
|
||||||
; lda #$4E
|
; lda #$4f
|
||||||
setup_irq_smc6:
|
setup_irq_smc6:
|
||||||
sta MOCK_6522_T1CH ; write into high-order latch,
|
sta MOCK_6522_T1CH ; write into high-order latch,
|
||||||
; load both values into counter
|
; load both values into counter
|
||||||
; clear interrupt and start counting
|
; clear interrupt and start counting
|
||||||
|
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
init_registers:
|
||||||
|
; set fine note A
|
||||||
|
|
||||||
|
ldx #$00
|
||||||
|
lda #$00
|
||||||
|
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
|
||||||
|
|
||||||
|
; B volume 12
|
||||||
|
|
||||||
|
ldx #$09
|
||||||
|
lda #$C
|
||||||
|
jsr pt3_write_reg
|
||||||
|
|
||||||
|
; C volume 12
|
||||||
|
|
||||||
|
ldx #$0A
|
||||||
|
lda #$C
|
||||||
|
jsr pt3_write_reg
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,9 +1,16 @@
|
|||||||
; Tiny Mockingboard Player
|
; Tiny Mockingboard Player
|
||||||
|
|
||||||
|
SONG_L = $70
|
||||||
|
SONG_H = $71
|
||||||
|
SONG_OFFSET = $72
|
||||||
|
SONG_COUNTDOWN = $73
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; proposed format
|
; proposed format
|
||||||
; CCOONNNN -- c=channel, o=octave, n=note
|
; CCOONNNN -- c=channel, o=octave, n=note
|
||||||
; 11LLLLLL -- L=length
|
; 11LLLLLL -- L=length
|
||||||
|
; 11LLLLLL -- wait time
|
||||||
|
|
||||||
; by deater (Vince Weaver) <vince@deater.net>
|
; by deater (Vince Weaver) <vince@deater.net>
|
||||||
|
|
||||||
@ -27,6 +34,16 @@ tiny_music:
|
|||||||
lda #1
|
lda #1
|
||||||
sta LOOP
|
sta LOOP
|
||||||
|
|
||||||
|
|
||||||
|
lda #<song_track_a
|
||||||
|
sta SONG_L
|
||||||
|
lda #>song_track_a
|
||||||
|
sta SONG_H
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
sta SONG_OFFSET
|
||||||
|
sta SONG_COUNTDOWN
|
||||||
|
|
||||||
; assume mockingboard in slot#4
|
; assume mockingboard in slot#4
|
||||||
|
|
||||||
jsr mockingboard_init
|
jsr mockingboard_init
|
||||||
@ -34,13 +51,17 @@ tiny_music:
|
|||||||
jsr reset_ay_both
|
jsr reset_ay_both
|
||||||
jsr clear_ay_both
|
jsr clear_ay_both
|
||||||
|
|
||||||
|
jsr init_registers
|
||||||
start_interrupts:
|
start_interrupts:
|
||||||
cli
|
cli
|
||||||
|
|
||||||
rts
|
forever:
|
||||||
|
jmp forever
|
||||||
|
|
||||||
|
|
||||||
.include "mockingboard_setup.s"
|
.include "mockingboard_setup.s"
|
||||||
.include "interrupt_handler.s"
|
.include "interrupt_handler.s"
|
||||||
|
|
||||||
.include "nozp.inc"
|
.include "nozp.inc"
|
||||||
|
|
||||||
|
.include "yankee_music.s"
|
||||||
|
124
demos/tiny_music/yankee_music.s
Normal file
124
demos/tiny_music/yankee_music.s
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
|
||||||
|
; 0 1 2 3 4 5 6 7 8 9 10 11
|
||||||
|
; C C# D D# E F F# G G# A A# B
|
||||||
|
|
||||||
|
; CCOONNNN -- c=channel, o=octave, n=note
|
||||||
|
; 11LLLLLL -- L=length 1/32=1, 1/16=2, 1/8=4, 1/4=8 1/2=16 1=32
|
||||||
|
|
||||||
|
song_track_a:
|
||||||
|
.byte $17 ;00 01 0111 G3 1/4
|
||||||
|
.byte $4B ;01 00 1011 B2 1
|
||||||
|
.byte $87 ;10 00 0111 G2 1
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $17 ;00 01 0111 G3
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $19 ;00 01 1001 A3
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $1B ;00 01 1011 B3
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
;
|
||||||
|
.byte $17 ;00 01 0111 G3
|
||||||
|
.byte $4B ;01 00 1011 B2 1/2
|
||||||
|
.byte $87 ;10 00 0111 G2 1/2
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $1B ;00 01 1011 B3
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $19 ;00 01 1001 A3
|
||||||
|
.byte $58 ;01 01 1000 C3 1/2
|
||||||
|
.byte $82 ;10 00 0010 D2 1/2
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $12 ;00 01 0010 D3
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
;
|
||||||
|
.byte $17 ;00 01 0111 G3
|
||||||
|
.byte $4B ;01 00 1011 B2 1
|
||||||
|
.byte $87 ;10 00 0111 G2 1
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $17 ;00 01 0111 G3
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $19 ;00 01 1001 A3
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $1B ;00 01 1011 B3
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
;
|
||||||
|
.byte $17 ;00 01 0111 G3
|
||||||
|
.byte $4B ;01 00 1011 B2 1/2
|
||||||
|
.byte $87 ;10 00 0111 G2 1/2
|
||||||
|
.byte $D0 ;11 01 0000 wait 1/2
|
||||||
|
|
||||||
|
.byte $16 ;00 01 0110 F#3
|
||||||
|
.byte $42 ;01 00 0010 D2 1
|
||||||
|
.byte $90 ;10 01 0000 C3 1
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $12 ;00 01 0010 D3
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
;
|
||||||
|
.byte $17 ;00 01 0111 G3
|
||||||
|
.byte $4B ;01 00 1011 B2 1/2
|
||||||
|
.byte $87 ;10 00 0111 G2 1/2
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $17 ;00 01 0111 G3
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $19 ;00 01 1001 A3
|
||||||
|
.byte $46 ;01 00 0110 F#2 1/2
|
||||||
|
.byte $86 ;10 00 0110 F#2 1/2
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $1B ;00 01 1011 B3
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
;
|
||||||
|
.byte $20 ;00 10 0000 C4
|
||||||
|
.byte $44 ;01 00 0100 E2 1/2
|
||||||
|
.byte $84 ;10 00 0100 E2 1/2
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $1B ;00 01 1011 B3
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $19 ;00 01 1001 A3
|
||||||
|
.byte $41 ;01 00 0001 C#2 1/2
|
||||||
|
.byte $81 ;10 00 0001 C#2 1/2
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $17 ;00 01 0111 G3
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
;
|
||||||
|
.byte $16 ;00 01 0110 F#3
|
||||||
|
.byte $42 ;01 00 0020 D2 1
|
||||||
|
.byte $82 ;10 00 0020 D2 1
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $12 ;00 01 0010 D3
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $14 ;00 01 0100 E3
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
|
||||||
|
.byte $16 ;00 01 0110 F#3
|
||||||
|
.byte $C8 ;11 00 1000 wait 1/4
|
||||||
|
;
|
||||||
|
.byte $17 ;00 01 0111 G3
|
||||||
|
.byte $47 ;01 00 0111 G2 1/2
|
||||||
|
.byte $87 ;10 00 0111 G2 1/2
|
||||||
|
.byte $D0 ;11 01 0000 wait 1/2
|
||||||
|
|
||||||
|
.byte $17 ;00 01 0111 G3
|
||||||
|
.byte $4B ;01 00 1011 B1 1/2
|
||||||
|
.byte $8B ;10 00 1011 B1 1/2
|
||||||
|
.byte $D0 ;11 01 0000 wait 1/2
|
||||||
|
|
||||||
|
.byte $FF
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user