「ASMtips」の編集履歴(バックアップ)一覧はこちら
「ASMtips」(2016/03/07 (月) 16:49:43) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
#contents
*ASMtips
ASMを書く時知ってると使え無さそうなテクニックとか書きません。
誰か書いてください
**8bitモードと16bitモード
AレジスタはPレジスタbit5のメモリモードフラグ(m)
XYレジスタはPレジスタbit4のインデックスモードフラグ(x)でレジスタ長が変化します。
レジスタ長の変更は基本的に&tt(){REP}命令と&tt(){SEP}命令で行います。
XYレジスタが16bitから8bitに変化した時、上位8bitは&tt(){0x00}になりますが、
Aレジスタは上位8bitも保持され、&tt(){XBA}命令で下位8bitと値を交換できます。
レジスタ間コピー系命令(&tt(){Txx})を実行した時
転送されるデータ量は転送先のレジスタ長に依存します。
※:ただしTDC命令はメモリモードフラグに問わず16bit転送されます。
仕様を活用した?例
; 使ってないYレジスタを使ってちょっと高速化 使わない
REP #$20 ; A:16bit
SEP #$10 ; XY:8bit
LDY $0F ;\ LDA $0F
TYA ;/ AND.w #$00FFより2clock早い
; Dレジスタを使ってゼロクリア Dレジスタが0x0000であることが前提。
TDC ; 上位8bitをゼロクリア
LDA $0F ;\ LDA $0F
REP #$20 ; | REP #$20
;/ AND.w #$00FFより3clock早い
; Aレジスタ上位8bitに退避させる
LDA $00 ;
XBA ; PHAの代わり
LDA $02 ;
STA $00 ;
XBA ;\ PLAの代わり
STA $02 ;/ XBAはPLAより1clock早い
#contents
*ASMtips
ASMを書く時知ってると使え無さそうなテクニックとか書きません。
誰か書いてください
**8bitモードと16bitモード
AレジスタはPレジスタbit5のメモリモードフラグ(m)
XYレジスタはPレジスタbit4のインデックスモードフラグ(x)でレジスタ長が変化します。
レジスタ長の変更は基本的に&tt(){REP}命令と&tt(){SEP}命令で行います。
XYレジスタが16bitから8bitに変化した時、上位8bitは&tt(){0x00}になりますが、
Aレジスタは上位8bitも保持され、&tt(){XBA}命令で下位8bitと値を交換できます。
レジスタ間コピー系命令(&tt(){Txx})を実行した時
転送されるデータ量は転送先のレジスタ長に依存します。
※:ただしTDC命令はメモリモードフラグに問わず16bit転送されます。
仕様を活用した?例
; 使ってないYレジスタを使ってちょっと高速化 使わない
REP #$20 ; A:16bit
SEP #$10 ; XY:8bit
LDY $0F ;\ LDA $0F
TYA ;/ AND.w #$00FFより2clock早い
; Dレジスタを使ってゼロクリア Dレジスタが0x0000であることが前提。
TDC ; 上位8bitをゼロクリア
LDA $0F ;\ LDA $0F
REP #$20 ; | REP #$20
;/ AND.w #$00FFより3clock早い
; Aレジスタ上位8bitに退避させる
LDA $00 ;
XBA ; PHAの代わり
LDA $02 ;
STA $00 ;
XBA ;\ PLAの代わり
STA $02 ;/ XBAはPLAより1clock早い
**逆アセンブル
[[どなたが作ったサイト>https://floating.muncher.se/cgi-bin/alcarobot?cmd=dis+A5+D0+8D+55+AD+6B]]があります。
disのあとに逆アセンブルしたいデータをコピペして、Submitしましょう。
逆アセンブルしたデータを改変し、アセンブルするときはラベル名に気をつけましょう。
データサイズが違うとき、上手くラベル移動できないかもしれません。