MC6800のプログラミングテクニック(2) AccBを符号拡張してAccABに入れる

BASICMASTER, 昔のパソコン

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