ミニコンのHITAC10を SPARTAN3で実現、その1 クロスアセンブラ

 2010.5.16 更新 OML, MASS テープイメージ、写真追加
前準備として、HITAC10の命令表を元に、パソコンで動作するクロスアセンブラを作ります。命令数が少ないので、またアブソリュート形式のみなので、プログラムは簡単になります。DOSプロンプトで動作し、ヘキサコードを出力し、リストファイルや、シンボル対応表も出せるようにします。アセンブラのソース記述はどのようなのかは、昔のHITAC10の研修で使った資料が残っていたので、それを参考にしました。

HITAC10は、いわゆるレジスタマシンではなく、演算レジスタ(アキュームレータと呼ばれ、略はAC)とメモリ間でほとんどの演算が行われます。結果はACに残ります。
例として、AC + メモリ −−> AC は
A MEM
と書き、MEM でアドレスされるメモリの内容と、ACが加算され、結果がACに残ります。add などではなく、A のみというシンプルさです。これは、演算命令数が非常に少ないため、できるだけ記述量を少なくした結果と思われます。

命令はすべて1語(16ビット)で、レジスタ(AC)も16ビットです。HITAC10には、基本構成の機種と、付加命令機構付きの機種とがあり、付加命令機構付きでは、もう1個レジスタが追加され、EC(エクステンド・アキューメレータ)と呼ばれて、AC+ECが、32ビットのレジスタとして機能するようになっています。HITAC10では、基本構成のままのハードウエアでも、付加命令機構付き専用の命令をソフトでエミュレートして実行でき、スピードは落ちますがソフト的にはそのまま実行され、機種によってソフトを替えるということはありませんでした。なお、付加命令機構付きには、16x16ビットの乗算と、32ビット÷16ビットの除算と、32ビットのシフト命令をハードウエアで実行できました。

素数を求めるソフトをHITAC10のアセンブラで書く

エラトステネスの篩いという名のソフトをHITAC10のアセンブラで書いてみます。FPGAでHITAC10を作るのは、基本構成の4KW(8Kバイト)なので、このメモリ内でワークエリアとプログラムが入るものとします。このため、求めるワークエリアを2560個確保して、この倍数、3〜5120までの素数ということになります。なぜ3からなのかは、エラトステネスの篩いというソフトでは、1は暗黙に存在する素数として残りを求めるようになっているからです。

以下がHITAC10でのアセンブラソースです。ORG X"200" はHITAC10での0x200番地からソフトが走るという指定です。バイトアドレスでは、0x400番地になります。HITAC10でのアドレスはワードアドレスです。見ても判る通り、使ってる命令は L,A,ST,B,KCT,KNA,KPA,HLT,KZA,のみです。あとはアセンブラ擬似命令です。この中で、KCT、KNAなど、Kで始まる耳慣れない命令がありますが、これはACの内容を判定したり、指定メモリの内容を+1して、結果が0になったかを判定するスキップ命令です。

上記のソースを見て、L1 ST ,I BCNT いう、ST命令に続いて ,I というのがありますが、この命令は、メモリ番地BCNTにACの内容をストアするのではなく、BCNTに書かれている内容をアドレスとして、そこにACの内容をストアするという命令です。 ,I はインダイレクトの意味で、メモリ間接アドレッシングとなっています。この命令は、インデックスレジスタが存在しないHITAC10での、インデックス参照を可能にする命令になっています。この命令はシンプルなマシンにもかかわらず、高度なメモリ操作を可能にするものででした。

以上のソースをクロスアセンブルしてリストに出したものが以下です。リストの左端はワードアドレスで、その右がHITAC10で実行できる命令コードです。

クロスアセンブラ ash10.exe と、素数を求めるソフトのファイル


ミニコンのHITAC10を SPARTAN3で実現、その2 基板と回路

使った基板です。マザーボードに、SPARTAN3 XC3S50(左、CQ出版 Design Wave Magazine 2005.1 付録(廃版))と、H83069(右、秋月電子通商)をのせて接続しています。右は、マザーボードの裏面配線です。













マザーボードの回路図はこちら。( SPARTAN3基板とH83069基板は省略 )

HITAC10をエミュレートするには、いくつか工夫をしなければなりません。それは、HITAC10に付属する周辺機器が、現在では入手不可能なので、HITAC10のI/O部分をH83069に接続して、プリンタとしてのテレタイプ(ASR33)、データ読み取りとしての、紙テープリーダの替わりをさせます。H83069のデータバスをFPGAに接続し、 FPGA内に設けたHITAC10のポートレジスタとハンドシェイクして、H83069のメモリとデータ交換します。
  1. HITAC10の出力ポート −−> HITAC10のポートレジスタ(FPGA内) −−> H83069のメモリ
  2. H83069のメモリ −−> HITAC10のポートレジスタ(FPGA内) −−> HITAC10の入力ポート
  3. HITAC10の表示 −−> FPGA内に設けたレジスタ −−> H83069で読む。
  4. H83069で書く −−> FPGA内に設けたレジスタ −−> HITAC10のコンソール
以上のように、オリジナルのHITAC10に付いている表示や、制御スイッチ、I/Oは、すべてFPGA内に設けたレジスタで代用します。使用しているSPARTAN3がもっと大きく、ピン数が多ければ、オリジナルのHITAC10のように、データ表示やパネルスイッチを使って、本物のように操作することも可能です。

ミニコンのHITAC10を SPARTAN3で実現、その3 すべてH83069で操作

HITAC10には、16個のデータ、アドレス表示ランプ(電球でした)、20個ほどのステータス表示などがあり、RUN、STOP、メモリライト、などがあります。内臓メモリはコアメモリで、高速のフラッシュメモリみたいなものなので、電源を切っても内容は消えません。メモリにデータを書くには、前面についてる操作スイッチで、16ビットのマシン語で直接書きます。一番最初は、IPLと呼ばれる16語ほどの短いプログラムを、0番地からスイッチで16ビット単位で書きます。

H83069で操作できる機能として、以下のものを用意します。
  1. HITAC10のメインメモリは最低限の4KWとする。(SPARTAN3のブロックRAMを4個使う)
  2. HITAC10をSTOPする。
  3. HITAC10を指定アドレスからRUNする。
  4. HITAC10の16ビットパネルスイッチを設定する。
  5. HITAC10を指定アドレスから1命令実行する。
  6. HITAC10の現在の状態を読む。RUN、STOP、付加命令で割り込み、CARRY
  7. HITAC10の命令実行に要したクロック数を読む。
  8. HITAC10のレジスタを読む。
  9. HITAC10のメモリのアドレスを設定する。設定後、内容を読み出せる。
  10. HITAC10のメモリにデータを書く。
  11. HITAC10のI/O命令のフラグを操作する。H8とHITAC10とのハンドシェイク。
以上の機能を、できるだけH8のアドレス空間を使わずに実現するため、アドレスを3本を使い、データバスは8ビットとします。(H83069基板の外部データバスが8本)

表1 操作レジスタ
H8アドレス
 名称 
リード内容
ライト 
0x600000
H10PCH
プログラムカウンタMSB 8ビット
1命令実行
0x600001
H10PCL
プログラムカウンタLSB 8ビット
RUN
0x600002
H10ACH
アキュームレータMSB 8ビット
I/Oバッファーに書く
0x600003
H10ACL
アキュームレータLSB 8ビット
何もしない
0x600004
H10DBH
メモリ内容MSB 8ビット
何もしない
0x600005
H10DBL
メモリ内容LSB 8ビット
機能操作 stepc 表2参照
0x600006
PSWITCHH
実行中 エラー 割り込み など
HITAC10のパネルスイッチMSB 8ビット
0x600007
PSWITCHL
HITAC10出力値
HITAC10のパネルスイッチLSB 8ビット


表1で、H8のアドレス、0x600005に書く内容で様々な機能に分かれます。

表2 機能操作 stepc
書く内容 3ビット
 名称 
動作
備考 
0x00
NOP
何もしません
0以外の設定で実行後に自動的に0になる
0x01
セットメモリアドレス
パネルスイッチの値をメモリアドレスに設定
マシンステート state が0のときのみ機能する
0x02
NOP
何もしません
0以外の設定で実行後に自動的に0になる
0x03
NOP
何もしません
0以外の設定で実行後に自動的に0になる
0x04
セットプログラムカウンタ
パネルスイッチの値をプログラムカウンタに設定
マシンステート state が0のときのみ機能する
0x05
NOP
何もしません
0以外の設定で実行後に自動的に0になる
0x06
リセットCPU
HITAC10を初期状態にします。強制停止
メモリサイズの指定
0x07
NOP
何もしません
0以外の設定で実行後に自動的に0になる

表2で、0x06を書いた場合、パネルスイッチの値でLSB3ビットが、4KW単位のメモリサイズになります。この場合、実際にメモリが実装されていない場合でも、最大32KWに設定されます。オリジナルのHITAC10では、実装されていないアドレスをアクセスした場合、エラー処理をするみたいですが、実際に使ったことがないので、詳細は不明です。

ミニコンのHITAC10を SPARTAN3で実現、その4 マシンステート設計

FPGAでCPUを設計する場合に1番単純な方法は、命令アドレス生成、命令フェッチ、命令デコード、命令実行、の4ステップに分解することです。FPGA内部メモリを使う場合は、1クロックで命令を読めるので、外部バスの操作が不要になり、たいていの命令が4〜6クロックで実行できます。
HITAC10の各命令を分析して、CPUの命令実行状態を表にします。HITAC10には、レジスタメモリ間演算、メモリインクリメント、レジスタ演算、ブランチ命令、ブランチアンドリンク命令(CALL)、スキップ命令、I/O命令、インダイレクト指定命令、などがあります。この中で、HITAC10の特徴といってもいいインダイレクト指定は、レジスタが1個だけというCPUを、メモリをあたかもレジスタのように扱えるようにする機能です。命令語は1語16ビットで構成され、代表的なRM命令では、その中にアドレス情報が9ビットあります。このため最大32KWの空間を直接指定できず、512W単位のページに分割され、どのページを実行中でも特別なゼロページ指定でページ0にアクセスできます。
代表的なレジスタ・メモリ演算の命令、L(ロード)
OPコード 5ビット
インダイレクト指定
ゼロページ指定
アドレス 9ビット
00001
AAAAAAAAA

ここで、Zが0の場合は、プログラムカウンタがどのページであっても、アドレスAAAAAAAAAがそのままロード対象のメモリアドレスになります。1の場合は現在のページ+AAAAAAAAA がメモリアドレスになります。
また、Iが0の場合は、0ページか、カレントページのAAAAAAAAA番地になり、512個までしか指定できませんし、0ページ以外の他のページへのアクセスはできません。Iが1の場合は間接アドレッシングとなり、Iが0として指定したメモリの内容がロード対象のアドレスとなります。AAAAAAAAA番地のメモリは、アクセス対象のアドレスを格納するレジスタになり、最大32KWのメモリを指定できます。ここで、1語16ビットなのだから64KWではないのかという疑問がでてきますが、このあたりは残念ながらアーキテクチャ上の詳細はわかりません。

HITAC10の全命令表はこちら。付加命令機構なしの基本構成の命令 部分完成

以上のアーキテクチャーを元に、マシンステートを設計します。以下は、ステートのおおまかな遷移です。間接アドレッシングのときだけ、メモリのアクセスが1個増加します。通常の演算命令であるレジスタ−メモリ間演算では、命令フェッチ、演算データフェッチ、演算実行、1命令終了処理と、4状態を取ります。間接アドレッシングでは、5状態になり、命令フェッチを含め、メモリアクセスは3回行います。メモリアクセスは1回につき、2クロック使っています。
マシンステートの種類
ステート番号
動作内容1
動作内容2
動作内容3
state 0
メモリ表示アドレスをメモリアドレスに出す
コンソールからスタート待ち。startp == 1
CPU停止
state 1
プログラムカウンタをメモリアドレスに出す
メモリからの ready 待ち。ready で命令デコード
命令フェッチ、デコード、次の state 決定
state 2
state 1 で、間接アドレッシングで、メモリを読む
メモリからの ready 待ち。ready で state = 3
データフェッチ。1クロックで ready = 1
state 3
メモリアクセス
メモリからの ready 待ち。ready で 命令実行
命令実行。 state = 4
state 4
命令実行終了処理
ストップフラグチェック
ストップでなければ、state = 1 で次の命令



以下は、SPARTAN3 XC3S50でも動作する回路やソフトのソースです。コメントはあまり入れていませんが、回路ソース hitac3s.v の前半は、使い方の解説になっています。

HITAC10のシミュレーション回路。H83069で操作 hitac3s_14.v
HITAC10のシミュレーション回路。H83069で操作。旧バグあり hitac3s.v
HITAC10のシミュレーション回路 UCF。hitac3s.ucf hitac3s.ucf←が無い場合は右hitac3s.txt
CCLK用コンフィギュレーションHEXデータ hitac3s14.sr H83069のメモリ、0x40E000 以降にロードしてコンフィギュレーション可能
CCLK用コンフィギュレーションHEXデータ。旧バグあり hitac3s6.sr H83069のメモリ、0x40E000 以降にロードしてコンフィギュレーション可能
CCLK用コンフィギュレーション bit データ hitac3s14.bit
CCLK用コンフィギュレーション bit データ。旧バグあり hitac3s6.bit
H83069で操作するモニタのソース h10m69.c
H83069で操作するモニタの Cygwin makefile 例
H83069で操作するモニタのリンカースクリプト例 h10m69.x 例
H83069で操作するモニタのRAM上実行バイナリ h10m69_22.mot 0x400284 番地から実行可能
HITAC10で動作する、セルフアセンブラ、”MASS”のヘキサデータ。HITAC10にロードします。massnoext4k.sr
HITAC10で動作する、メモリダンププログラムのソース。MASSでアセンブルできます。dumpD.asm

ミニコンのHITAC10を SPARTAN3で実現、その5 各種の命令実行


HITAC10が取り得るステートを列挙すると以下のようになります。1ステートは2クロック使います。
マシンステートの種類
命令
ステートの遷移
動作内容
ページ内レジスタ、メモリ間の演算命令
1−−>3
ページ内の9ビットでアドレスされるメモリと演算
インダイレクトレジスタ、メモリ間の演算命令
1−−>2−−>3
ページ内9ビットのメモリの内容をアドレスとしてそのメモリと演算
ページ内ブランチ命令
1 のみ
ページ内の9ビット以内でブランチ
インダイレクトブランチ命令
1−−>2
ページ内の9ビットのメモリの内容をアドレスとしてブランチ
ページ内ブランチ・アンド・リンク命令
1−−>3
ページ内の9ビット以内でサブルーチン呼び出し
インダイレクトブランチ・アンド・リンク命令
1−−>2−−>3
ページ内の9ビッのメモリの内容をアドレスとしてサブルーチン呼び出し
メモリカウントアップ、スキップ命令
1−−>3−−>4
ページ内9ビットのメモリの内容を+1して0なら次の命令をスキップ
インダイレクトメモリカウントアップ、スキップ命令
1−−>2−−>3−−>4
ページ内9ビットのメモリの内容をアドレスとして+1して0なら次の命令をスキップ
I/O命令
1−−>3
指定されたI/Oの入出力を行う。インプットではACの下位8ビットが変化
I/O状態判定スキップ命令
1−−>3
指定されたI/Oの状態を判定して次の命令をスキップする
アキュームレータ演算命令
1−−>3
指定したビット数だけACをシフトする。1ビットあたり1クロック使用する
アキュームレータスキップ命令
1−−>3
アキュームレータの状態を判定して次の命令をスキップする
CPU状態変更命令
1−−>3
割り込み許可、不許可などを設定する


LOAD、ADD命令

以下は、LOAD、ADDの命令を実行したときの回路波形です。(N),(MEM),(ADD)は、N や、MEM や ADD でアドレスされるメモリの内容を示します。maddr は、メインメモリのアドレスで、1クロック後には内容が db に出力されます。mb は state が 1 と 3 のとき db をラッチしたものです。。state は、1,3となり、4クロックになります。











































この図で、state, ready, pc, maddr, db, ac, は、回路図ファイル(verilog) のレジスタ名称です。
回路ファイル、hitac3s.v のレジスタ
レジスタ名
機能
意味
動作の説明など
CLOCK
回路クロック
立ち上がりで有効( always@(posedge clk) )
立ち上がりで state の遷移を判定
state
マシンの動作状態を指定します
状態遷移
ready,その他 の値によって、動作が異なります
ready
1でメインメモリからのデータが確定
1でメインメモリのデータバス上のデータが有効
state 1,2,3 の場合、0なら1にされます
pc
プログラムカウンタ
state = 1, ready = 0 で、プラス1されます
L,A命令では、state = 1 で常に次のアドレスになります
maddr
メインメモリのアドレス
命令や、データを読み出すアドレス値
1クロック後にデータが読み出されます
db
メモリのデータバス
メインメモリから読み出されたデータ
メインメモリのアドレス確定かた常に1クロック後に確定
ac
アクームレータ
16ビット演算レジスタ
HITAC10基本構成での演算レジスタはこれのみ


ブランチ命令

ブランチ命令と、それに続く加算(A)命令。ブランチ命令の state は、1,のみとなり、2クロックになります。









































インダイレクトアドレッシングでのLOAD命令

インダイレクトアドレッシングでのLOAD命令と、それに続く加算(A)命令。state は、1,2,3となり、6クロックになります。ma は、インダイレクトアドレッシングの場合に、state が 2 のとき、db をラッチしたものです。ma は、インダイレクト以外では、kct 命令で使われます。( kct の波形は後述 )













































メモリインクリメント及びスキップ命令、KCT

HITAC10での条件分岐は、スキップ命令で判定します。条件を満たすと、次の命令を実行せず、プログラムカウンタが +2 されます。条件を満たさない場合、スキップせずに次の命令を実行するので、ここにB(ブランチ)命令を置きます。以下の図は、条件を満たした場合の波形です。KCT命令は、指定するメモリ(MEM)の内容を+1して、0になったらスキップするという条件判定を行います。実行ステートは、1,3,4と、3ステート(6クロック)になります。この図で、hitacw は、メインメモリへのライト信号( active high ) 、mbw は、メインメモリへ書く内容(16ビット)です。ここでのメモリライトは、1クロックで終了しています。














































サブルーチン呼び出しのBAL命令(ブランチ・アンド・リンク)

HITAC10にはスタックポインタがないので、戻り番地の格納場所として、サブルーチンの先頭番地を使います。それに続くLOAD(L)命令。state は、1,3となり、4クロックになります。サブルーチンの先頭番地(SUB)に戻り番地N+1を書き、SUB+1番地のLOAD命令から実行します。サブルーチンからのリターンは、戻り番地を格納しているSUBを、インダイレクトアドレッシングでブランチします。リターンを実行する命令は、B ,I SUB と書きます。これで、SUBに格納された値をプログラムカウンタにロードして、戻ります。












































サブルーチン呼び出しと、リターンの動作

BALでサブルーチン、SUBを呼び出すと、サブルーチン先頭に戻り番地が書かれ、プログラムは、SUB+1番地から実行します。戻るときは、B ,I SUB として、SUBに書かれたデータをアドレスとして、ブランチします。このような動作をするため、再帰呼び出しとか、マルチタスクなどでは使えません。

























サブルーチンからのリターン命令、B ,I (ブランチ・インダイレクト)

サブルーチンからのリターンは、戻り番地を格納しているサブルーチンの先頭番地、SUBを、インダイレクトアドレッシングでブランチします。サブルーチン(SUB)からリターンを実行する命令は、B ,I SUB と書きます。これで、SUBに格納された値をプログラムカウンタにロードして、戻ります。このブランチ・インダイレクト命令は、サブルーチンからの戻りだけでなく、ページ境界を越えた16ビット(実際には15ビットワードアドレス)アドレス値にブランチするときにも使います。






































準備中





ミニコンのHITAC10を SPARTAN3で実現、その8 IPLと、OMLの機能

IPLを書いておいて2番地からRUNさせると、OMLと呼ばれる紙テープを紙テープリーダにセットしておくと、読み込みます。OMLテープは、最初の0x290文字は、1文字で4ビットとなるデータ列で、このフォーマットでのロードが終わると、一度CPUが0x11番地から走り、それ以後、付加命令機構の有無で追加を読むか否かを判断するようになっています。
IPLを書いてOMLテープを読み込む部分の動作は以下のようになります。

OML紙テープのバイナリーイメージです。始めと終わりに短いフィード部分があります。OMLテープ

OMLを読んだ後、セルフアセンブラの紙テープ、MASSをセットして、プログラムカウンタを0x20にして、RUNすると、MASSを読み込みます。

MASS紙テープのバイナリーイメージです。始めと終わりに短いフィード部分があります。MASSテープ


OMLとMASSの紙テープです。30年以上前のものですが、青焼き用の紙が収納されていた、遮光性の袋に保管されていた為、色褪せもほとんどなく、紙の質も劣化していませんでした。解けないようにクリップで留めてあります。



バイナリイメージでは扱いにくいので、H8のモニタでパソコンからロードできる形式にしたものが以下です。Sレコード形式でH83069のメモリ、0x410000番地からロードできるアドレス情報が入れてあります。このデータは、1行目から128行目がOMLで、129行目から最後までが、セルフアセンブラ、MASSとなっています。OMLと、MASSのつなぎ部分には、フィードが入れてあります。このデータを、H83069のメモリにロードしておいて、IPLの2番地から、H8の操作コマンド、 tron 命令で走らせると、OMLをロードした時点で、一度ストップし、その後、0x20番地から走らせると、MASSを読んでストップします。

以下のデータのファイルです。OML+MASSのSレコードファイル



以下はOML紙テープの先頭部分です。


中央より少し下に、小さめの穴が横に並んでいますが、これがスプロケットと呼ばれる穴で、他のデータ用の穴の位置(読み取りタイミング)を示します。この写真では、上から下に8個(穴ありで1、穴無しで0)のデータの穴が並び、1文字となっています。右から左に読んでいきますが、赤い矢印はテープの進む方向になっています。OMLテープでは、一番上(ビット7)はパリティービットで、1文字8ビットが偶数個の穴になるような、偶数パリティーです。パリティービットはテープリーダーで判断して、HITAC10のI/O上ではすべて0にされ、パリティーが正しいか否かがHITAC10に伝えられます。ですから、エミュレータではパリティービットを0にしたデータとにして順に読むと、ヘキサで、01、10、04、00、09、1E、04、04、01、11、04、00、07、12、00、08、01、13、06、0F、00、10、・・・・と読めます。ここで気が付くと思いますが、4文字ごとに0x10のビット4が1になっています。IPLはこれを手ががりにしています。IPLはこのデータ列から、ヘキサ16ビットを、0010、409E、4411、4072、0813、6F00・・・と生成して、メモリの1番地に0010、11番地以降に409E、4411・・・・と生成して書きます。このようにして、IPLがOMLを読んでいき、メモリにロードされていきます。



以下はMASS紙テープの先頭部分です。


OMLテープと同じく、偶数パリティーで穴が開いています。MASSの先頭は、アスキー文字コードで、”0000G”、CRLF(0x8D、0xA)、”0000@0000@0000@0000@”、CRLF、”0000I”、CRLF、フィードとなっています。このデータ形式はOMLを読んだ後に、0x20番地から実行したときに読める形式( HITAC10のヘキサデータと思われる )になっています。

ミニコンのHITAC10を SPARTAN3で実現、その9 MASSの機能

MASSと呼ばれるソフトは、HITAC10で、アセンブラ言語ソースを、HITAC10で実行できるマシン語に変換するソフトです。マクロ機能もあるのですが、使ったのはかなり前のことであり、どのように記述するかは不明です。通常のセルフアセンブラとして使うには、いくつかソースが残っていたので、それを参考に、このページの最初の部分で紹介した、素数を求めるソフトを作ってみました。

エラトステネスの篩いで、3〜5120までの数字の中で、素数がいくつあるかを計算します。そのアセンブラソースは次のようになります。sieve.asm



このソースを、HITAC10をMASSを実行できる状態にして、アセンブルしてます。紙テープはH83069のメモリが代用なので、まずH8にソースを読み込みます。テキストをそのままH8のメモリに読むには、H8でのコマンド、lr410000 (enter) を使います。lr410000 コマンドを実行して、パソコンのターミナルソフトから sieve.asm を送信すると、interval 2400,get 34B と表示してソースがH8のメモリに書かれたことを示しますので、0x410000番地をダンプしてみると、以下のようになります。ここで、lr410000 コマンドのすぐ右の、interval 2400 は、ターミナルから受信するときのH8の受信ポートのポーリング回数を0x2400回以上待つと、データ受信をやめるという数字を表しています。そしてその右の 24B は、パソコンから 0x24B バイト受信して終了したという記録です。モトローラのSレコードなどでは、データを受信するとき、ファイルの終了を示すめすS7・・・、S8・・・、S9・・・などがありますが、一般のテキストファイルや、バイナリーファイルではパソコンから送信されるファイルがどこで終了しているのか判別できないので、0x2400回のポーリングでなにも受信しなかったら、ファイルの終わりという判断をする目安になっています。0x2400のポーリング時間は、このH8では約2秒に相当し、パソコンから2秒間なにも送られなかったら終了とするということです。



エラトステネスの篩いプログラムのソースがH8の0x410000番地に書かれたとして、これを紙テープとして、HITAC10のMASSでアセンブルしてみます。MASSの操作は、かなり複雑なので、H8のモニタ( h10m69.c )には、HITAC10でMASSを動作させる一連のコマンドをまとめていれてあり、次のような、mas 410000,418000 というコマンドで行います。



mas 410000,418000 ( enter ) で、3パスで、シンボル登録、オブジェクト作成、リスト作成を行って、上記のような結果となります。それぞれのパスの結果は、H8のメモリ、0x418000番地以降に記録されます。H8のメモリが、テレタイプの印字と紙テープパンチの出力先となっているからです。この操作記録で、 tape=347 とありますが、これはソースの最終行の END と書かれた行まで読んで、アセンブルが終わったということを示しています。無論この操作記録はHAIC10のMASSが出す記録ではなく、H8で出している記録です。

次に、H8のメモリ番地、0x418000を見ると、HITAC10のMASSの実行による結果が残っていますから、メモリをダンプしてみると、このようになります。PASS1でのシンボルリスト、PASS2でのオブジェクト(ヘキサ)ダンプ、PASS3でのアセンブルリストとなります。オブジェクトの前後には、フィード(NULL文字)が追加されています。



メモリダンプでは判りにくいので、オブジェクトと、リストをテキストに直したものが、以下です。
エラトステネスの篩いをHITAC10のMASSでアセンブルしたオブジェクト(ヘキサ)。



エラトステネスの篩いをHITAC10のMASSでアセンブルしたリスト。



ミニコンのHITAC10を SPARTAN3で実現、その10 素数を求めてみる

MASSで作ったオブジェクトファイルは、OMLで読み込める形式なので、エラトステネスの篩いプログラムを、HITAC10にロードして実行してみます。結果が正しいか否かを確かめるため、H8のモニタにも、同じプログラムをいれてあり、sieve ( enter ) とコマンドを与えると、684 primes という結果をだすので、HITAC10でも同じかを確かめます。

  1. 手順1 電源再投入で、H83069のモニタで、h10m69_22.mot をロードして、0x400284から実行する。
  2. 手順2 プロンプトが、H10> になると、H10>l40e000 (enter) にしておいて、パソコンから、hitac3s14.sr を送信して、H8の0x40E000番地からFPGAのコンフィギュレーションデータをロードする。
  3. 手順3 H10>prog ( enter ) で、FPGAをコンフィギュレーションする。
この状態で、HITAC10が初期状態になっています。
次に、IPLをロードして、OMLをロードする。これらの一連の操作記録と解説は以下です。
IPLのヘキサファイルはこちら。ipl.srこのファイルは、H8のアドレス、0x210000番地の情報が入っています。
このファイルをH8の0x430000番地にロードするには、H10>l220000 ( enter ) として、パソコンから送ると、0x430000番地に書かれます。





準備中


戻る

ホームに戻る






inserted by FC2 system