tiny_tracker: optimize some more

This commit is contained in:
Vince Weaver 2022-01-15 15:58:47 -05:00
parent bb7ff255cb
commit 6896a3e6b7
7 changed files with 45 additions and 100 deletions

View File

@ -12,17 +12,6 @@ submit: hgr_d2_1k.zip
####
hgr_d2_1k.zip: D2 d2.s file_id.diz hgr_d2.dsk
mkdir -p demosplash2021_hgr_d2_1k
cp D2 ./demosplash2021_hgr_d2_1k
cp *.s ./demosplash2021_hgr_d2_1k
cp file_id.diz ./demosplash2021_hgr_d2_1k
cp hgr_d2.dsk ./demosplash2021_hgr_d2_1k
cp hgr_d2.webm ./demosplash2021_hgr_d2_1k
zip -r hgr_d2_1k.zip demosplash2021_hgr_d2_1k
####
hgr_d2.dsk: HELLO D2
cp $(EMPTY_DISK)/empty.dsk ./hgr_d2.dsk
$(DOS33) -y hgr_d2.dsk SAVE A HELLO
@ -57,8 +46,8 @@ D2: d2.o
d2.o: d2.s \
zp.inc hardware.inc \
mA2E_2.s mA2E_3.s \
interrupt_handler.s mockingboard_init.s play_frame.s \
tracker_init.s mockingboard_constants.s ay3_write_regs.s
mockingboard_init.s play_frame.s \
tracker_init.s ay3_write_regs.s
ca65 -o d2.o d2.s -l d2.lst
####

View File

@ -1,4 +1,3 @@
;=====================
;=====================
;=====================
@ -6,9 +5,7 @@
;=====================
;=====================
;=====================
; write all 14 registers
; address in X
; data in A
; write all 14 registers at AY_REGS
ay3_write_regs:

View File

@ -9,11 +9,13 @@
; aiming for under 256
; 310 bytes -- initial
; if can straddle interrupt vector, save 10 bytes
; if can guarantee Y is 0 on entry, save 2 bytes
; 268 bytes -- strip out interrupts
; 262 bytes -- simplify init
; 261 bytes -- optimize init more
; 253 bytes -- optimize var init
; 252 bytes -- bne vs jmp
; 250 bytes -- song only has 16 notes so can never be negative
; 249 bytes -- make terminating value $80 instead of $FF
d2:
@ -30,24 +32,21 @@ tracker_song = peasant_song
.include "tracker_init.s"
game_loop:
; start the music playing
cli
.include "play_frame.s"
bob:
lda KEYPRESS
bpl bob
quiet:
lda #$3f
sta AY_REGS+7
; delay 20Hz, or 1/20s = 50ms
end:
bne end
lda #140
jsr WAIT
beq game_loop
; music
.include "mA2E_2.s"
.include "interrupt_handler.s"
; must be last
.include "mockingboard_constants.s"

View File

@ -61,45 +61,17 @@ MOCK_AY_LATCH_ADDR = $7 ; 1 1 1
mockingboard_init:
; sei ; disable interrupts, is this necessary?
;=========================
; 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
; can save 10 bytes if we load in memory so this
; is in the right place automatically
lda #<interrupt_handler ; 2
sta $03fe ; 3
lda #>interrupt_handler ; 2
sta $03ff ; 3
;=========
; 10
;=========================
; Initialize the 6522s
; Reset Left AY-3-8910
;===========================
; entries=10
; 14 + 2*entries = 34 bytes
ldy #0 ; 2
init_it_loop:
lda init_values,Y ; 3
ldx init_addresses,Y ; 3
bmi doneit ; 2
iny ; 1
sta $c400,X ; 3
bne init_it_loop ; 2
doneit:
ldx #$FF
stx MOCK_6522_DDRB1
stx MOCK_6522_DDRA1
inx ; #MOCK_AY_RESET $0
stx MOCK_6522_ORB1
ldx #MOCK_AY_INACTIVE ; $4
stx MOCK_6522_ORB1

View File

@ -1,16 +1,4 @@
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
@ -29,18 +17,19 @@ set_notes_loop:
;==================
; see if hit end
cmp #$FF
bne all_ok
; this song only 16 notes so valid notes always positive
; cmp #$80
bpl all_ok
;====================================
; if at end, loop back to beginning
lda #0 ; reset song offset
asl ; reset song offset to 0
sta SONG_OFFSET
beq set_notes_loop ; bra
beq set_notes_loop
all_ok:
note_only:
; NNNNNECC -- c=channel, e=end, n=note
@ -68,9 +57,6 @@ note_only:
lda frequencies_high,Y
sta AY_REGS+1,X
lda #$F
sta AY_REGS+8
;============================
; point to next

View File

@ -455,7 +455,10 @@ printf("\n");
printf("; last: a=%d c=%d len=%d\n",a_last,c_last,current_length);
write_note(&a_last,&b_last,&c_last,&total_len);
printf("\t.byte $FF ; end\n");
// printf("\t.byte $FF ; end\n");
/* assume 16 notes or fewer */
printf("\t.byte $80 ; end\n");
total_len++;
int o,n;

View File

@ -3,21 +3,20 @@ tracker_init:
; setup initial ay-3-8910 values (this depends on song)
init_registers_to_zero:
ldx #13
ldx #$13 ; zero $70--$83
lda #0
sta SONG_OFFSET ; also init song stuff
sta SONG_COUNTDOWN
; sta SONG_OFFSET ; also init song stuff
; sta SONG_COUNTDOWN
init_loop:
sta AY_REGS,X
dex
bpl init_loop
; jsr ay3_write_regs
lda #$38
sta AY_REGS+7 ; $07 mixer (ABC on)
; 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
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