mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-09-28 02:55:03 +00:00
tiny_tracker: get it working
This commit is contained in:
parent
307a8ec58b
commit
53f9fc0bc2
@ -57,7 +57,7 @@ D2: d2.o
|
|||||||
d2.o: d2.s \
|
d2.o: d2.s \
|
||||||
zp.inc hardware.inc \
|
zp.inc hardware.inc \
|
||||||
mA2E_2.s mA2E_3.s \
|
mA2E_2.s mA2E_3.s \
|
||||||
interrupt_handler.s mockingboard_init.s \
|
interrupt_handler.s mockingboard_init.s play_frame.s \
|
||||||
tracker_init.s mockingboard_constants.s ay3_write_regs.s
|
tracker_init.s mockingboard_constants.s ay3_write_regs.s
|
||||||
ca65 -o d2.o d2.s -l d2.lst
|
ca65 -o d2.o d2.s -l d2.lst
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
; aiming for under 256
|
; aiming for under 256
|
||||||
|
|
||||||
; 309 bytes -- first try
|
; 310 bytes -- initial
|
||||||
|
|
||||||
|
|
||||||
; if can straddle interrupt vector, save 10 bytes
|
; if can straddle interrupt vector, save 10 bytes
|
||||||
|
@ -40,116 +40,8 @@ ay3_irq_handler:
|
|||||||
|
|
||||||
bit MOCK_6522_T1CL
|
bit MOCK_6522_T1CL
|
||||||
|
|
||||||
; drop note down after first
|
|
||||||
; lda #$C
|
|
||||||
; sta AY_REGS+8
|
|
||||||
; sta AY_REGS+9
|
|
||||||
; sta AY_REGS+10
|
|
||||||
|
|
||||||
lda #$0E
|
.include "play_frame.s"
|
||||||
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
|
|
||||||
|
|
||||||
lda SONG_COUNTDOWN
|
|
||||||
bpl done_update_song
|
|
||||||
|
|
||||||
set_notes_loop:
|
|
||||||
|
|
||||||
;==================
|
|
||||||
; load next byte
|
|
||||||
|
|
||||||
ldy SONG_OFFSET
|
|
||||||
lda tracker_song,Y
|
|
||||||
|
|
||||||
;==================
|
|
||||||
; see if hit end
|
|
||||||
|
|
||||||
cmp #$FF
|
|
||||||
bne all_ok
|
|
||||||
|
|
||||||
;====================================
|
|
||||||
; if at end, loop back to beginning
|
|
||||||
|
|
||||||
lda #0 ; reset song offset
|
|
||||||
sta SONG_OFFSET
|
|
||||||
beq set_notes_loop ; bra
|
|
||||||
|
|
||||||
all_ok:
|
|
||||||
|
|
||||||
; see if note
|
|
||||||
|
|
||||||
; tay
|
|
||||||
; and #$C0
|
|
||||||
; cmp #$C0
|
|
||||||
; beq handle_timing
|
|
||||||
|
|
||||||
note_only:
|
|
||||||
; tya
|
|
||||||
; NNNNNECC -- c=channel, n=note
|
|
||||||
|
|
||||||
tay ; save note in Y
|
|
||||||
|
|
||||||
and #3
|
|
||||||
asl
|
|
||||||
tax ; put channel offset in X
|
|
||||||
|
|
||||||
lda #$2 ; always 4 lines long
|
|
||||||
sta SONG_COUNTDOWN
|
|
||||||
|
|
||||||
tya
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
lsr ; get note in A
|
|
||||||
|
|
||||||
tay ; lookup in table
|
|
||||||
lda frequencies_low,Y
|
|
||||||
|
|
||||||
sta AY_REGS,X ; set proper register value
|
|
||||||
|
|
||||||
lda frequencies_high,Y
|
|
||||||
sta AY_REGS+1,X
|
|
||||||
|
|
||||||
lda #$F
|
|
||||||
sta AY_REGS+8
|
|
||||||
|
|
||||||
;============================
|
|
||||||
; point to next
|
|
||||||
|
|
||||||
; assume less than 256 bytes
|
|
||||||
inc SONG_OFFSET
|
|
||||||
|
|
||||||
|
|
||||||
lda SONG_COUNTDOWN
|
|
||||||
beq set_notes_loop ; bra
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.include "ay3_write_regs.s"
|
|
||||||
|
|
||||||
; jsr ay3_write_regs
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
handle_timing:
|
|
||||||
; was timing
|
|
||||||
|
|
||||||
; tya
|
|
||||||
|
|
||||||
; and #$3f
|
|
||||||
; sta SONG_COUNTDOWN
|
|
||||||
|
|
||||||
; inc SONG_OFFSET
|
|
||||||
|
|
||||||
done_update_song:
|
|
||||||
dec SONG_COUNTDOWN
|
|
||||||
|
|
||||||
|
|
||||||
;=================================
|
;=================================
|
||||||
|
96
demos/l/d4/play_frame.s
Normal file
96
demos/l/d4/play_frame.s
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
play_frame:
|
||||||
|
; drop note down after first
|
||||||
|
; lda #$C
|
||||||
|
; sta AY_REGS+8
|
||||||
|
; sta AY_REGS+9
|
||||||
|
; 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
|
||||||
|
|
||||||
|
lda SONG_COUNTDOWN
|
||||||
|
bpl done_update_song
|
||||||
|
|
||||||
|
set_notes_loop:
|
||||||
|
|
||||||
|
;==================
|
||||||
|
; load next byte
|
||||||
|
|
||||||
|
ldy SONG_OFFSET
|
||||||
|
lda tracker_song,Y
|
||||||
|
|
||||||
|
;==================
|
||||||
|
; see if hit end
|
||||||
|
|
||||||
|
cmp #$FF
|
||||||
|
bne all_ok
|
||||||
|
|
||||||
|
;====================================
|
||||||
|
; if at end, loop back to beginning
|
||||||
|
|
||||||
|
lda #0 ; reset song offset
|
||||||
|
sta SONG_OFFSET
|
||||||
|
beq set_notes_loop ; bra
|
||||||
|
|
||||||
|
all_ok:
|
||||||
|
|
||||||
|
note_only:
|
||||||
|
|
||||||
|
; NNNNNECC -- c=channel, e=end, n=note
|
||||||
|
|
||||||
|
tay ; save note in Y
|
||||||
|
|
||||||
|
and #3
|
||||||
|
asl
|
||||||
|
tax ; put channel offset in X
|
||||||
|
|
||||||
|
tya
|
||||||
|
and #$4
|
||||||
|
sta SONG_COUNTDOWN ; always 4 long?
|
||||||
|
|
||||||
|
tya
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr ; get note in A
|
||||||
|
|
||||||
|
tay ; lookup in table
|
||||||
|
lda frequencies_low,Y
|
||||||
|
|
||||||
|
sta AY_REGS,X ; set proper register value
|
||||||
|
|
||||||
|
lda frequencies_high,Y
|
||||||
|
sta AY_REGS+1,X
|
||||||
|
|
||||||
|
lda #$F
|
||||||
|
sta AY_REGS+8
|
||||||
|
|
||||||
|
;============================
|
||||||
|
; point to next
|
||||||
|
|
||||||
|
; assume less than 256 bytes
|
||||||
|
inc SONG_OFFSET
|
||||||
|
|
||||||
|
|
||||||
|
lda SONG_COUNTDOWN
|
||||||
|
beq set_notes_loop ; bra
|
||||||
|
|
||||||
|
.include "ay3_write_regs.s"
|
||||||
|
|
||||||
|
done_update_song:
|
||||||
|
dec SONG_COUNTDOWN
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -214,7 +214,7 @@ static int write_note(int *a_last,int *b_last,int *c_last,int *total_len) {
|
|||||||
|
|
||||||
if (*a_last>=0) {
|
if (*a_last>=0) {
|
||||||
temp_value=(*a_last<<3)|0;
|
temp_value=(*a_last<<3)|0;
|
||||||
if ((*b_last<0) || (*c_last<0)) {
|
if ((*b_last<0) && (*c_last<0)) {
|
||||||
temp_value|=4;
|
temp_value|=4;
|
||||||
}
|
}
|
||||||
printf("\t.byte $%02X ; A=%d L=%d\n",
|
printf("\t.byte $%02X ; A=%d L=%d\n",
|
||||||
|
Loading…
Reference in New Issue
Block a user