プログラミング

ASをCP-1600対応に

2021-10-24 22:57 — asano

CP-1600を実際に動かしてみるとなると問題になるものの一つとして開発環境をどうするかというのがあります。

ざっと探してみましたが使えそうなアセンブラが見当たりません。

Cコンパイラなどが無いのはともかく、アセンブラも無いのはさすがに困ります。いくら昔を懐かしむといっても今さらハンドアセンブルはしたくありません。

というわけで以前ASをMN1610対応させたようにCP-1600対応のコードジェネレータを書いてみました。

16ビットワードマシンであることなどMN1610に似ている点もあり、基本的な枠組みはMN1610とほぼ一緒です。

続いて各命令のデコーダを書いていきますが、結論から言うととても楽でした。

INS8073のBASICで独自のコンソールを使う

2021-09-27 22:46 — asano
カテゴリー

前にBASICの持つコンソールルーチンをモニタから使用する方法を書きましたが、今度は逆に独自に用意したコンソールルーチンをBASICに使用させる方法です。

こちらは一応マニュアルにも載っている公認の機能です。

マニュアルの情報不足と誤りのせいでROMを読むまでは動かせませんでしたが...

ということでINS8073のコンソールの設定方法についてまとめておきます。

INS8073のROMを読む(続き)

2021-09-25 15:42 — asano

前回、ROM内のコンソールからの1文字入力ルーチンは0x092Bではないかという予測が立ちました。これをもう少し確認してみます。

まず0x0020~0x003FまでのCALL命令のベクタには0x092Bは登場しません。

それではJSR 0x092Bはどこかにないか、と探してみると1箇所だけありました。1箇所からしか呼ばれないなら貴重なCALL命令のベクタを割り当てないのも納得がいきます。

例によって付近を逆アセンブルしてみます。

INS8073のROMを読む

2021-09-24 20:53 — asano
カテゴリー

INS8070ボードでROMのBASICの1文字入出力ルーチンを独自のものにしようとしてうまくいかなかったと書きましたが、モニタを移植したことでROM内を読めるようになったので関連箇所を調べてみることにしました。

まずはPコマンドでROMのアドレス範囲(0x0000~0x09FF)をPCに持ってきます。

そう、P(unch)コマンドを実装したのはこのためです。

手頃な逆アセンブラがないかネットを探してみたのですが見当たらなかったので簡単なものを書いてしまいました。

さて、どこから手を付けるかですが、先頭から読んでいくのはしんどいです。

今回調べたいのは文字入出力だけなのでメッセージから追っていくことにします。

メモリダンプを見ていくとASCII文字列がいくつもありますが、多くはBASICの予約語なので今回の目的には使えません。その中で良さそうなものが見つかりました。

INS807xにモニタを移植

2021-09-20 22:49 — asano

前回書き始めていたモニタですが、いつものようにD(ump)コマンドが動くころには慣れてしまって残りはサクサク進み基本的なD,G,S,Lコマンドはすぐにできました。今回はちょっとわけあってP(unch)コマンドも追加しています。

SC/MP(I と II)とは以下のような相違点があります。

  1. 16ビット演算命令
    これ自体は便利でありがたいのですが、キャリ/ボロー込みの加減算命令がなくなってしまいました。モニタには必要ありませんでしたが、16ビットを超える演算は相当面倒になると思われます。条件分岐がAレジスタ(下位8ビット)でしかできないのも意外に不便です。
    SC/MPでは16ビットの値をメモリとやり取りすることがなかったのでエンディアンの概念がありませんでしたが、SC/MP IIIはリトルエンディアンです。

  2. スタックとサブルーチン
    サブルーチン呼び出しの機能が追加されたのは助かります。同時に長距離ジャンプも追加され、4kBページの制約も解消されています。

ソフトウェアUART

2021-09-07 12:32 — asano
カテゴリー

前々回前回書いたような厄介な点はありましたが、CDP1802ボードUniversal Monitorを動かすのは思っていたより簡単でD(ump), G(o), S(et), L(oad)の各コマンドは動作するようになりました。

そうなると今度はSBC1802でも動かしてみたくなります。

ところがこれにはUART相当のハードウェアは無く、CPU内蔵のQ, EF3をシリアルポートとして使うようになっています。UARTの機能をソフトウェアで実現しなくてはなりません。

COSMACでサブルーチン

2021-09-05 23:11 — asano
カテゴリー

前回書いたようにCOSMACにはサブルーチン呼び出しの仕組みがありません。

それではどうするかというとSEP命令を使います。

COSMACはメモリをポイントできるレジスタを16個 R(0)R(F)と、4ビットのレジスタPを持っています。R(0)R(F)の内Pで選ばれたR(P)がプログラムカウンタとして使用されます。

SEP命令でPに新たな値を設定することでサブルーチンを呼び出し、Pに元の値を設定することで戻ることができます。

COSMACのソフトウェア

2021-09-04 22:52 — asano
カテゴリー

CDP1802のハードウェアができたのでいつものようにUniversal Monitorを移植していきます。

以前SC/MP使いの憂鬱で書いたようにSC/MPはかなり癖の強いアーキテクチャでしたが、このCOSMACも負けず劣らずですね。

  1. PCがない
    プログラムカウンタに相当するものが無いわけではありません。複数あるレジスタのどれをプログラムカウンタとして使うか選択できるようになっています。専用のものがないという点でだいぶ変わっています。

SL1960の判別

2021-05-01 23:04 — asano
カテゴリー

Z8S180 SL1960の最後で判別する方法を探すと書きましたが、とても簡単でした。

1992年の"Volume I Databook"にはZ80180とZ8S180の違いの記載があり、まだ新版が出るはるか前なので、Z80180(HD64180Z)とZ8S180 SL1960の相違点がわかります。

一方テクニカルノートTN005301-0506にはSL1960と新Z8S180の相違点が載っています。

この2つを参考にSL1960の判定を追加してみました。以下のコードはOMCRによってZ80180以降と判定されたところからです。