「ほっ」と。キャンペーン

GMC-4 でサブルーチンを使う

GMCにはCALL命令は規定のサブルーチンしか呼びだせない。

なんとかして、サブルーチンもどきが作れないかと工夫していたら、ジャンプするときに戻り番地を指定すればよいと思いついた。たとえば50番地に F 0 0 (JUMP 0 0)どダミーの命令を入れておいて、呼び出すときにアドレスを示す第2,第3ニブルを書き換えておけばよい。サブルーチンの処理が終了したときに、F 5 0 で50番地に飛べば、50番地には元のアドレスに戻るJUMP命令が書き込まれている。ところがこの方式だと、メモリーに戻り番地を書き込むのに10ニブル使ってしまう。全体で80ニブルしかないのに10ニブルも使ってしまっては意味がない。

そこで、50番地には53,56, 59番地へのダミーのジャンプ命令を書き込み、53,59,59番地に実際のアドレスに戻るジャンプ命令を書いておく。サブルーチンの呼び出し側では、53,56,59番地の下位ニブルの値を設定してサブルーチンへジャンプするようにした。これだと戻りアドレスの指定に2ニブルしか使わない。

実際のプログラムは次のようになる。

メイン
00 8 3 (TIA 3) #Aレジスタに戻り番地のジャンプ命令を入れた53番地の下位ニブルの値3を代入。
00 F 20 (JUMP 20) #サブルーチン20番地へジャンプ。

サブルーチン
20 A 2 (TIY 2) #リターン時にジャンプする50番地の下位アドレスの位置をYレジスタに入れる。
22 4 (AM) #52番地の値をAレジスタの値で置き換える。
23 E 9 (CAL SHTS) #ビープ音を鳴らす
25 8 5 (TIA 5) #タイマーの時間設定。
27 E C (CAL TIMR) #タイマーのサブルーチンを呼ぶ。
29 F 5 0 (JUMP 5 0) #リターン(50番地にJUMP)

ジャンプテーブル
50 F 5 0 (JUMP 5 0) #デフォールトのジャンプ先。サブルーチンで書き換えられる。
53 F 0 0 (JUMP 0 0) #実際の戻りアドレスへのジャンプ命令。この場合はメインの最初に戻ってしまうので無限ループになる。

スタックポインタやプログラムカウンタが操作できないと苦しいものがある。
[PR]
by tnomura9 | 2009-07-12 18:22 | 話のネタ | Comments(0)
<< GMC-4 4ビット足し算器 GMC-4 の永字八法 >>