カテゴリー
前回サブルーチン呼び出しの方法で終わってしまったので、今回は実際に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 RETHI0を展開してしまおうかとも思ったのですが、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.
コメントを追加