2020-12-08 23:17 — asano
カテゴリー:
前回サブルーチン呼び出しの方法で終わってしまったので、今回は実際にUniversal Monitorでどうしたか書いていきたいと思います。
前回書いたようにサブルーチン呼び出しが2段を超えると一気に大変になります。
それではUniversal Monitorで呼び出しが深い箇所をどう対処したか、いくつかの例を見てみます。
- →
DPL
→DPB
→HEXOUT2
→HEXOUT1
→CONOUT
まずDPL
とDPB
は番外にあたるのでJMP
で戻るようにしてしまいます。呼び出し位置に展開してしまえばJMP
も不要になりますが他のプロセッサ用と対比しやすくしておきたいのでこうしました。これで5段が3段に削減できました。
続いてHEXOUT2
は1バイトを16進2桁で表示するルーチンですが、16進1桁表示のHEXOUT1
を2回呼び出すのをやめて展開してしまいました。 - →
GETLIN
→CRLF
→CONOUT
CRLF
は単にCRとLFの2文字を表示するだけなので無くしてしまうのも一つの手です。ただ何箇所かから呼ばれている(ここ以外は2段に収まっている)ので残しました。
ここ例えば8080用では次のようになっています。GLE: CALL CRLF MVI M,00H RET
改行の表示と終端マークの書き込みは順序を入れ替えることが出来ます。そして
CALL
+RET
はJMP
に置き換えることが出来ます。こうすれば呼び出しの段数を1段減らせます。
F8では以下のようになりました。GLE: LR A,2 LR IS,A CLR LR 0CH,A LR P,K JMP CRLF
書き方が汚くなっても良ければ
LR P,K
と飛び先のLR K,P
を対消滅させて次のようにすることもできます(今回はやっていません)。GLE: LR A,2 LR IS,A CLR LR 0CH,A JMP CRLF+1
- →
HEXIN
→HI0
→CONIN
/UPPER
これは上のHEXOUT2
に少し似ています。
HEXIN
は8080版では以下のようになっています。HEXIN: XRA A CALL HI0 RLC RLC RLC RLC HI0: PUSH B MOV C,A CALL CONIN CALL UPPER CPI '0' JC HIR CPI '9'+1 JC HI1 CPI 'A' JC HIR CPI 'F'+1 JNC HIR SUI 'A'-'9'-1 HI1: SUI '0' ORA C HIR: POP B RET
HI0
を展開してしまおうかとも思ったのですが、CONIN
とUPPER
を取り出してHI0
と並列にすることにしました。HEXIN: LR K,P PI CONIN PI UPPER PI HI0 LR A,0 SL 4 LR 1,A PI CONIN PI UPPER PI HI0 LR A,0 AS 1 LR 0,A LR P,K POP HI0: LR A,0 CI '0'-1 BC HIR CI '9' BC HI1 CI 'A'-1 BC HIR CI 'F' BNC HIR AI '9'-'A'+1 HI1: AI -'0' HIR: LR 0,A POP
これで3段だったものを2段になりました。
このような対処をしていったところ、すべて2段に収まってしまいました。
次回はサブルーチン以外について書いてこの移植話は終わりにしようと思います。
参考文献・関連図書:
"F8 Guide to Programming", Fairchild.
F3850データシート, Fairchild.
コメントを追加