mirror of
https://github.com/deater/dos33fsprogs.git
synced 2025-02-12 23:31:43 +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 \
|
||||
zp.inc hardware.inc \
|
||||
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
|
||||
ca65 -o d2.o d2.s -l d2.lst
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
; aiming for under 256
|
||||
|
||||
; 309 bytes -- first try
|
||||
; 310 bytes -- initial
|
||||
|
||||
|
||||
; if can straddle interrupt vector, save 10 bytes
|
||||
|
@ -40,116 +40,8 @@ ay3_irq_handler:
|
||||
|
||||
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
|
||||
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
|
||||
.include "play_frame.s"
|
||||
|
||||
|
||||
;=================================
|
||||
|
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) {
|
||||
temp_value=(*a_last<<3)|0;
|
||||
if ((*b_last<0) || (*c_last<0)) {
|
||||
if ((*b_last<0) && (*c_last<0)) {
|
||||
temp_value|=4;
|
||||
}
|
||||
printf("\t.byte $%02X ; A=%d L=%d\n",
|
||||
|
Loading…
x
Reference in New Issue
Block a user