From c811dbd3445987bc219effbebc5499ba661b987b Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Fri, 23 Feb 2018 22:13:56 -0500 Subject: [PATCH] chiptune: shave 8 cycles off of dual 6522 write --- asm_routines/mockingboard_a.s | 44 +++++++++++-------------------- chiptune_player/chiptune_player.s | 2 +- 2 files changed, 16 insertions(+), 30 deletions(-) diff --git a/asm_routines/mockingboard_a.s b/asm_routines/mockingboard_a.s index 54d06e19..fff7ca78 100644 --- a/asm_routines/mockingboard_a.s +++ b/asm_routines/mockingboard_a.s @@ -76,51 +76,37 @@ reset_ay_both: ; Write sequence ; Inactive -> Latch Address -> Inactive -> Write Data -> Inactive - ;======================= - ; Write Right AY-3-8910 - ;======================= + ;========================================= + ; Write Right/Left to save value AY-3-8910 + ;========================================= ; register in X ; value in MB_VALUE write_ay_both: ; address - stx MOCK_6522_ORA1 ; put address on PA ; 3 - lda #MOCK_AY_LATCH_ADDR ; latch_address on PB ; 2 - sta MOCK_6522_ORB1 ; 3 + stx MOCK_6522_ORA1 ; put address on PA1 ; 3 + stx MOCK_6522_ORA2 ; put address on PA2 ; 3 + lda #MOCK_AY_LATCH_ADDR ; latch_address on PB1 ; 2 + sta MOCK_6522_ORB1 ; latch_address on PB1 ; 3 + sta MOCK_6522_ORB2 ; latch_address on PB2 ; 3 lda #MOCK_AY_INACTIVE ; go inactive ; 2 sta MOCK_6522_ORB1 ; 3 - - ; value - lda MB_VALUE ; 3 - sta MOCK_6522_ORA1 ; put value on PA ; 3 - lda #MOCK_AY_WRITE ; write on PB ; 2 - sta MOCK_6522_ORB1 ; 3 - lda #MOCK_AY_INACTIVE ; go inactive ; 2 - sta MOCK_6522_ORB1 ; 3 - - ;======================= - ; Write Left AY-3-8910 - ;======================= - -;write_ay_left: - ; address - stx MOCK_6522_ORA2 ; put address on PA ; 3 - lda #MOCK_AY_LATCH_ADDR ; latch_address on PB ; 2 - sta MOCK_6522_ORB2 ; 3 - lda #MOCK_AY_INACTIVE ; go inactive ; 2 sta MOCK_6522_ORB2 ; 3 ; value lda MB_VALUE ; 3 - sta MOCK_6522_ORA2 ; put value on PA ; 3 - lda #MOCK_AY_WRITE ; write on PB ; 2 - sta MOCK_6522_ORB2 ; 3 + sta MOCK_6522_ORA1 ; put value on PA1 ; 3 + sta MOCK_6522_ORA2 ; put value on PA2 ; 3 + lda #MOCK_AY_WRITE ; ; 2 + sta MOCK_6522_ORB1 ; write on PB1 ; 3 + sta MOCK_6522_ORB2 ; write on PB2 ; 3 lda #MOCK_AY_INACTIVE ; go inactive ; 2 + sta MOCK_6522_ORB1 ; 3 sta MOCK_6522_ORB2 ; 3 rts ; 6 ;=========== - ; 61 + ; 53 ;======================================= ; clear ay -- clear all 14 AY registers ; should silence the card diff --git a/chiptune_player/chiptune_player.s b/chiptune_player/chiptune_player.s index b93ab0c6..4a6b88e8 100644 --- a/chiptune_player/chiptune_player.s +++ b/chiptune_player/chiptune_player.s @@ -306,7 +306,7 @@ mb_not_13: jsr write_ay_both ; assume 3 channel (not six) ; 6 ; so write same to both ; left/right - ; 61 + ; 53 clc ; point to next interleaved ; 2 lda INH ; page by adding $300 ; 3