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) #実際の戻りアドレスへのジャンプ命令。この場合はメインの最初に戻ってしまうので無限ループになる。 スタックポインタやプログラムカウンタが操作できないと苦しいものがある。
by tnomura9
| 2009-07-12 18:22
| 話のネタ
|
Comments(0)
|
カテゴリ
新型コロナウイルス 主インデックス Haskell 記事リスト 圏論記事リスト 考えるということのリスト 考えるということ ラッセルのパラドックス Haskell Prelude Ocaml ボーカロイド 圏論 jQuery デモ HTML Python ツールボックス XAMPP Ruby ubuntu WordPress 脳の話 話のネタ リンク 幸福論 キリスト教 心の話 メモ 電子カルテ Dojo JavaScript C# NetWalker ed と sed HTML Raspberry Pi C 言語 命題論理 以前の記事
最新のトラックバック
最新のコメント
ファン
記事ランキング
ブログジャンル
画像一覧
|
ファン申請 |
||