MC6800のプログラミングテクニック(3) 16進数1桁からASCII文字への変換

2024/10/07BASICMASTER, 昔のパソコン

MC6800でのプログラミングの小ネタ。0-15の数値を’0′-'9′,’A’-'F’に変換したい。

10進表示は面倒臭いけど、16進だと楽。小さなプログラムの動作確認に便利。

以下はBASICMASTERのモニタで使われている変換プログラム。サイズは8bytes, 実行時間10cycle.

CMPとADDの順番によってバリエーションがあるが、普通に書くとこうなると思う。


        ADDA    #'0'	; 2 2
        CMPA    #'9' 	; 2 2
        BLS     skip 	; 4 2
        ADDA    #$07	; 2 2
skip:

次のプログラムは8080/Z80でよく使われているテクニックを流用したもの。私が知ったのは1980年ごろだと思う。どの本で読んだのだろうか?

6bytes, 8cycle. サイズも実行時間も短くなっている。6800は分岐が遅いので、分岐を減らすのが肝要。


PRHEXL	ADDA    #$90        ; 2 2
	DAA                 ; 2 1
	ADCA	#$40        ; 2 2
	DAA                 ; 2 1

最初にAccAに$90を足す。結果は $90-$99, $9A-$9F。ここでDAAを行うと、後者は桁上がりして$00-$05になり、Carryが立つ。

次にADCAで$40を足すと、$D0-$D9,$41-$46になる。再度DAAを行うと($Dは13なので)前者は$30-$39になる。

DAA命令は10以上で+6補正を行なうが、ASCIIでは’9’+1と’A’は7つ離れている。これをキャリーで補っている。実に巧妙である。


この方法はいつごろ編み出されたのか?

1978年発行のlonce A* levertthal著 “8080A/8085 Assembly Language Programming" の7-3に8080版のプログラムがあり、そこでは “Allison in COMPUTER magazine. (See Allison, D.R.. “A Design Philosophy for Microcomputer Architectures", Computer, February 1977. pp35-41." と書かれている。

Digital Research社1977発行の “CP/M MAC Macro Assembler" の Figure 36a にも8080版のプログラムがあり、時期的には1977年ごろにこのロジックが考えられたのでしょう。


資料

Z80では減算でもDAAが利くので他にも色々な手法が開発されている。