問題
我正在查看一個 6502 程式,該程式具有多個位元組陣列(對應于特定語音的音效資料),它們的長度各不相同。目前,這涉及顯式迭代第一個(如果排隊),然后是第二個等,并且每個語音都有一組單獨的音量、延遲等變數,因此代碼設定為使用這些硬編碼標簽。
我想把它變成一個回圈,索引這些額外的變數和音效資料。使用索引尋址對變數進行索引相當簡單,但對音效資料進行索引涉及更多作業,我想知道在索引間接和間接索引尋址的應用中是否遺漏了一些東西。
下面是我目前正在做的一個獨立的例子。如果可能的話,我想加強的部分是 中的代碼LoadFromTable,理想情況下同時使用兩者X和Y尋址:
.equ Ptr0, 0x80
.equ Ptr1, 0x81
.org 0xFE00
.org 0x0000
Init:
LDX #0xFF
TXS
Main:
LDX #0x00
LDY #0x00
JSR LoadFromTable
; A should be 'H', 0x48
LDX #0x01
LDY #0x00
JSR LoadFromTable
; A should be 'B', 0x42
LDX #0x02
LDY #0x02
JSR LoadFromTable
; A should be 'A', 0x41
JMP Main
LoadFromTable:
TXA ; Double outer index to account for 16 bit pointers
ASL ; "
TAX ; "
LDA Table,X ; Load the low byte of the array into a pointer
STA Ptr0 ; "
INX ; Load the high byte of the array into the pointer
LDA Table,X ; "
STA Ptr1 ; "
LDA (Ptr0),Y ; Load the character at the inner index into the array
RTS
.org 0x0040
Table:
.word Item0
.word Item1
.word Item2
.org 0x0080
Item0:
.byte 'H', 'E', 'L', 'L', 'O', 0x00
Item1:
.byte 'B', 'O', 'N', 'J', 'O', 'U', 'R', 0x00
Item2:
.byte 'C', 'I', 'A', 'O', 0x00
.org 0x00FA
.word Init
.word Init
.word Init
執行
從@NickWestgate 獲取拆分表的想法,并按照@Michael 的說明提出初始指標計算,我已經從這樣的事情中轉移過來:
PROCESS_MUSIC:
; ...
BNE MusDoB
MusChanA:
; ...
LDA MUSICA,X
BNE MusCmdToneA
; ...
JMP MusChanA
MusCmdToneA:
; ...
BNE MusNoteA
; ...
MusNoteA:
; ...
LDA MUSICA,X
; ...
MusDoB:
; ...
BNE MusDoDone
MusChanB:
; ...
LDA MUSICB,X
BNE MusCmdToneB
; ...
JMP MusChanB
MusCmdToneB:
; ...
BNE MusNoteB
; ...
MusNoteB:
; ...
MusDoDone:
RTS
到這個更通用的子程式:
PROCESS_MUSIC:
LDX #0x01
PerChannel:
; ...
BNE EndPerChannel
LDA MusicTableL,X
STA tmp0
LDA MusicTableH,X
STA tmp1
MusChan:
; ...
LDA (tmp0),Y
BNE MusCmdTone
; ...
BEQ MusChan
MusCmdTone:
; ...
BNE MusNote
; ...
MusNote:
; ...
LDA (tmp0),Y
; ...
EndPerChannel:
DEX
BPL PerChannel
RTS
添加以下表格:
MusicTableL:
.byte <MUSICA
.byte <MUSICB
MusicTableH:
.byte >MUSICA
.byte >MUSICB
這消除了對LoadFromTable我最初使用的功能的需求,并且總體上看起來更干凈。
uj5u.com熱心網友回復:
這里有一些想法。一個是傳入一個已經翻倍的索引(即,如果你可以安排它,或者它可能已經在某個較早階段的累加器中)。
另一個是拆分地址表:
LoadFromTable:
LDA TableL,X ; Load the low byte of the array into a pointer
STA Ptr0 ; "
LDA TableH,X ; Load the high byte of the array into the pointer
STA Ptr1 ; "
LDA (Ptr0),Y ; Load the character at the inner index into the array
RTS
TableL:
.byte #<Item0
.byte #<Item1
.byte #<Item2
TableH:
.byte #>Item0
.byte #>Item1
.byte #>Item2
如果您不能拆分表,您可能仍然可以通過執行以下操作擺脫 INX:
LDA Table,X ; Load the low byte of the array into a pointer
STA Ptr0 ; "
LDA Table 1,X ; Load the high byte of the array into the pointer
STA Ptr1 ; "
它可能會或可能不會從自我修改代碼中受益 - 如果您停留在第零頁上,它可能會:
LDA Table,X ; Load the low byte of the array into a pointer
STA Load 1 ; "
LDA Table 1,X ; Load the high byte of the array into the pointer
STA Load 2 ; "
Load:
LDA $FFFF,Y ; Load the character at the inner index into the array
您還可以查看在存盤指標時將 Y 添加到指標是否可以節省任何周期。它可能取決于最常用的路徑(即,如果它通常不 INC Ptr2/Load 2)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/488487.html
