MC6800のプログラミングテクニック(2) AccBを符号拡張してAccABに入れる
6809だとSign EXtend命令一発なんだけど、6800にはそんな便利な命令はないのです。
普通に分岐を書くと5bytes,00拡張で8cycle,FF拡張で10cycle。perplexity.aiに書かせると、COMAの代わりにDECAになるが、バイト数サイクル数は同じ(please wrote sign extend AccB to AccAB on “MC6800" CPU)。
CLRA ; 2 1
TSTB ; 2 1
BPL SKIP ; 4 2
COMA ; 2 1
SKIP EQU *
Fuzix-Compiler-Kit/support6800/__castc.s at main · EtchedPixels/Fuzix-Compiler-Kitだと、6bytes, 00で8cycle, FFで10cycle.BITBの分だけ損している。
__castc_:
__castc_u:
clra ; 2 1
bitb #$80 ; 2 2
beq ispve ; 4 2
deca ; 2 1
ispve:
rts
Z80のテクニックを参考にしてみる。SBC A,A 素晴らしいな。
私が考えたプログラム。ASR/ROLでbit7をcarryにコピーする。サイズは5bytes、実行時間は8cycle。分岐命令が無くなっている分だけ速い。
CLRA ; 2 1
ASRB ; 2 1
ROLB ; 2 1
SBCA #0 ; 2 2
Motorola社 1979年発行の「MC6809 PRELIMINARY PROGRAMMING MANUAL」の “7.0 PROGRAMMING TRICKS 'N TREATS" では下記の2通り。
ラベルがcowとかBULLなのは、お国柄なのでしょうか。
CLRA TSTB BPL cow OECA cow EQU * = CLRA TSTB BPL BULL COMA BULL EQU *
Z80のHLレジスタの符号拡張(L→HL)の例。こちらもなるほどである。同じレジスタをオペランドに指定できる8080系だからできる技だ。
ld l, a ; Store low byte add a, a ; Push sign into carry sbc a ; Turn it into 0 or -1 ld h, a ; Store high byt
ディスカッション
コメント一覧
まだ、コメントがありません