CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

飛び先修正ツールの修正

アセンブル後のバイナリファイルを拙作ツール:Transputer Convergence Correctorで修正しモニタ上で動作させるという一連の開発手順が確立してきました。ところがデバッグを繰り返しているうちどうも変換に失敗し正常に動作しない場合があることに気付きま…

飛び先修正ツール

モニタ上でプログラムのロード、実行が簡単にできるようになりましたが、アセンブラが出力するコードは相対アドレスの飛び先に誤りがあるという問題は解決していません。使い方が間違っているのか、アセンブラ自体のバグなのかよくわかりません。 アセンブラ…

モニタ改造

ワークスペースの確保ができCALL/RETによるサブルーチンが使えるはずなので、原始モニタ環境でもう少し実用性のあるモニタを作ってみました。 修正したいのは 1.汎用ルーチンをサブルーチン化 2.「L」ロードコマンドでバイナリ転送終了したらコマンドプ…

メモリ使用状況

ボードのハードはあと外付けSRAMの実装が残っていますがここで改めてメモリ配置をまとめておきました。 ROM256KB、RAM128kB、トランスピュータ内蔵RAM領域4kBで計388kB。4GBのリニアな全メモリ空間の実に0.009%しか使っていません スカスカですが未使用部分…

モニタ始動

ROM上で動作する原始モニタが動作し始めました。シリアルから入力したプログラムコードをオンチップRAMの0x8000200番地からセットするロード「L」と0x8000200番地に制御を移す実行「G」だけしかありませんが、いままでプログラムを変更するたびにROM4個を焼…

量産計画

トランスピュータが動きそうとだいたい分かった時点で実はもう1個発注していました。せっかくリンク機構があるのでそれを確かめたいし、1人では寂しかろうと・・こうしてCPU多頭飼育崩壊が始まってます 前回と同じ業者で同価格、2週間くらいで到着しました…

飛び先修正

条件付き分岐CJの飛び先相対アドレスが何か間違っているんじゃ・・となると無条件分岐Jもヤバいのではないかと原始モニタのソースコードから相対ジャンプする行を抜き出してみました。 next Iptrはジャンプ命令の次の命令のインストラクションポインタ、dest…

条件分岐

1文字入出力、メモリ書込み、ジャンプができればそれらの組合せでモニタを作るのは簡単なはずなんですがいろいろつまづいてます。 たとえば以下は原始モニタでターミナルホストから入力された1文字コマンド(「L」:ロード、「G」:実行)でそれぞれの処理…

ウェイト挿入

トランスピュータのマニュアルを見てみるとアクセス時にウェイトを挿入するにはMemWaitピンをHにするとマシンサイクルT2の終わりでサンプリングされてT4の後にウェイトサイクルTwが挿入されるとあります 然るべき位置でサンプリング、挿入をしてくれるのでハ…

1文字入力

ホストPCからコードを受け取るために1文字入力も作っておきます。これも今までのシリアルコントローラと同じでキャラクタが受信バッファに入ったかRxRDYフラグをチェック、これが立つまで永久ループ(用途によってはタイムアウトも必要ですが)し、フラグが…

アドレッシングモード

トランスピュータボードで1文字出力ができるように(おそらく1文字入力もできるはず)なったので、いつものボード開発手順通り原始モニタを載せることを考えてみます。 まずは1文字入力で取得したデータをメモリ上に並べていく処理です。改めてマニュアルで…

RS232C I/F

表面実装部品のうち、最後まで残っていたRS232CレベルコンバータのMAX202を取り付けました。これは基板発注してから気づいたのですがフットプリントの選択が間違っていてパッド間がちょっと広すぎでした。足はギリギリ届きましたがハンダ多めに盛っています…

タイミング調整

転送終了、TxEMT=1になるのを待つループが回っているときのSCN2681につながる信号線をプローブしてみました ch1: /SIOCS, ch2: /RD, ch3: D3(=TxEMT) 読取りパルス/RDはトランスピュータが生成していてT4-T5の2マシンステート;約50nsということになります…

フラグ読取り

送信は済んでいるのに送信完了のループから抜けられないということは脱出条件を満たさないということで考えられるのはこんなところです 1.フラグの論理を間違っている これは前にUSART:8251のステータスTxEMPTYのチェックで間違ったことがありましたが今…

1文字出力

シリアルコントローラの初期化ができたので引き続き1文字出力ルーチンを作っていきます。 ステータスレジスタSRAを見るとBIT3に送信バッファ空:TxEMTがあるのでこのフラグをチェックしました 1文字出力ルーチンTXのコーディングはこうなります。出力するキ…

シリアル初期化

LチカができたのでSCN2681へのアクセスは問題ないようです。つづけてシリアルコントローラのプログラミングもやってしまいます 先ず内蔵レジスタの定義 これらのレジスタに初期化ルーチンINITで制御ワードを書き込んでいきますが設定に1ビットでも漏れがある…

LEDチカチカ

準備が整ったので一気にコーディングしました まずSCN2681出力ポートの設定と変数COUNTの初期化した後、変数COUNTの値を出力ポートにセット、ビット反転してリセットと2回出力。そのあとCOUNTをインクリメントしてSTARTラベルにループします。 単純なパラレ…

シリアルコントローラ

今回、ボード上に実装したシリアルコントローラSCN2681(DUART)は初めて使う品番ですが、フィリップス社のマニュアルが見つかったのでざっと確認しておきます。 機能は非同期調歩型シリアルコントローラが2組、ボーレートジェネレータ、タイマ/カウンタ、割込…

コーディング開始

I/Oも用意できたのでいよいよ意味のあるプログラムを書いてみますが、いくつか準備があります。 1.2段階ジャンプ これはトランスピュータのアーキテクチャを調べ始めた時にも検討していましたがリセットベクタがメモリ空間の最上位-2:Bootstrap(0x7FFFF…

I/O拡張

ROMのアクセスがうまくいってるようなので次はLEDチカチカをやりたいところなんですが、ボード上のパラレルLEDは単純にデータバスをラッチしているのではなくシリアルコントローラ(DUART)SCN2681の汎用出力ポートに接続しています そのためこれの周辺部品…

マシンサイクル

ボード上のトランスピュータIMST805は入力クロックClockin=4.9152MHzの4倍のProcClockOut=19.6608MHzを内部生成して各種タイミング信号を発生させます。 マニュアルのメモリアクセス関連の説明を読んでみました。 まずProcClockOutの半周期ごとにマシンサイ…

動作クロック

CPUの動作クロック周波数についてちょっと勘違いしてました。外部から与えるクロックClockinはCPU内部で5逓倍されると思い込んでましたがデータシートをよく見てみるとこれはオーダー時の速度サフィックス指定によるものでIMST805-G25Sならば倍率PLLxは5.0で…

最小ループ再び

パタンの修正ができたので、信号線をプローブして電源ON! ・・とその前に。 今回ROM(U16)へのデータバスの引き込みを修正しました 修正前:D24 D23 D21 D20 D19 D18 D17 D16 修正後:D22 D23 D21 D20 D19 D18 D17 D16 つまりD23は元々つながっていましたがD…

パタン補修

まずPLCCソケット間のラインから。隙間は約2.5mmしかありませんがルータにハイスビットを装着して切削できました 切断前 切断後 もう一か所の切断箇所は基板の裏面なのとパタン密度が低いのでこちらは簡単 切断前 切断後 それよりハンダ付けした時の飛沫なの…

修復計画

見れば明らかなんですがROM(U16)に接続されるデータバスがD16~D23になるべきところがD22をすっ飛ばしてD23、D24になっちゃってるわけです。D24は本来つながるべきU17にも行っているので接続先が重複してしまってます。番号のカウントを先走ったか「時そば…

メモリチェック

トランスピュータボードはパタンミスが発覚してショック大なので少し冷却期間おきます。その間に海外通販で入手したあやしいSRAMの動作確認をしてみました。 以前作成したMCS51-Rev0ボードは256kbitSRAMのスキニータイプを使うのでこれを差し替えてみます。…

接続ミス発見

ここのところまで、起きている現象がNS32032のトラブルとそっくりです。ソフトウェアはこれ以上単純にできず間違えようがない。となるとなにか物理的に配線ミスしてるとしか思えません。 先ずはROMの制御線まわりを検図・・テレコとかはなさそうです。 次に…

ROM入れ替え

最小ループとして得られたコード「600E」の意味を考えてみます。ぱっと見これは16ビット固定長命令にも見えますが、トランスピュータの命令体系は8ビット固定長であって実は2個の命令の組合せであることがわかります code mnemonic function operation Oreg…

制御信号波形

最小ループはROM内の2アドレスをグルグル回るはずなのでボード上のいくつかの信号をプローブしてみてるのですがどうも制御信号の波形が安定しません。 ch1:アドレスラッチ信号ALE(=/S0) ch2:ROMの/CS(=/ROMCS) ch3:ROMの/OE(=/MemRd) ALEが一定間隔で…

最小ループ

いよいよトランスピュータ上で動作するプログラムを作成してみます。いつものようにコードは一番簡単な最小ループ「j $」、リセットベクタはメモリ空間の最後の2バイトを指すので開始番地を0x7FFFFFFEにしてアセンブルします アセンブルは瞬時に終わって実行…