MC6800のプログラミングテクニック(3) 16進数1桁からASCII文字への変換
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が利くので他にも色々な手法が開発されている。
ディスカッション
コメント一覧
まだ、コメントがありません