ブログの練習

ブログを書く練習です。
最近はレトロな計算機(電卓、マイコン、パソコンなど)
に関することを書き始めました。

Intel 4004 (その6) MCS-4 Evaluation Kit using the 4001-0009

2023-01-20 21:17:12 | マイコン(4004)
前回の記事(Intel 4004 (その5) Mask ROM 4001を読んでみる)では、4004と一緒に入っていたマスクROM(4001)の中身を読んでみました。2バイト目にリターン命令が入っていたので、複数ROMのプログラムの一部に使われていたものなのかなと思ってそれで終了だったのですが、実はそうではありませんでした。もしかしたらこのROM、4004よりレアなパーツかもしれません。
どうして気がついたのか、というあたりからとりあえず順を追って書いてみます。

Lチカ(Intel 4004 (その4) Lチカの巻)の次は簡単なモニタプログラムやインタプリタ言語が動くボードを作りたいなと思って、回路図を引いたりレイアウトを考えたりしていたのですが、部品を注文して届くまでにやることが無くなったので、アセンブラについて調べたり、ユーザーズマニュアルを調べていました。
前回使ったディスアセンブラのところに、アセンブラとエミュレータ(INTEL 4004 SYSTEM EMULATOR)もあり、開発ツールに使えそうな感じ。エミュレータ用のサンプルプログラム(MCS-4 EVALUATION KIT USING THE 4001-0009)もあったので、ロードしてみると、2バイト目がリターン命令(BBL)です。

あれ?これはどこかで見たような・・・と思い、ROMのダンプリストとdiffをとってみたところ、なんと3バイト違うだけで残り253バイトは一致しています。


最初は、ROMリーダーが不完全でbit化けしてるんだろうなと思ったのですが、20が30はあるにしても、02が20、しかも2箇所はちょっと考えにくいです。
エミュレータのところにあった資料(MCS-4 Evaluation Kit using 4001-4009)にソースがあるので見てみると、

FINは1バイト命令なので次の254はおかしいです。エミュレータのアセンブルリストでもFE ???になっています。

プログラムの意味を考えても、これはROMのダンプのFIM(20)が正しいのでしょう。マニュアルの誤植だと思われます。
次に、20が02になっているところ。エミュレータでは20になっていますが、マニュアルでは2です。


これはエミュレータ側が間違っているようです。エミュレータの作者に連絡したいけど、連絡先が書いてないなあ。

ここまで調べてようやく、あれ?そういえば、このROMのパッケージに4001-0009って書いてあるよ!(最後の9がかすれてるけど)
ということに気がつきました。

ググってみてもマニュアル以外の情報にはヒットせず。これってもしかしてCPUの4004よりレアなパーツなのではないだろうか。

マニュアルの回路図を見ると非常にシンプル。しかも、トランジスタのフィードバック回路は省略可(The circuit for single pass/continuous can be omitted if only continuous operation is sought.)ということなので作ってみることにしました。(ちなみに私はアナログ回路はさっぱりわからないのでトランジスタの回路は敬遠しているのですが、たぶんこれってたぶん7404とか7407とかのバッファで代用できるよね。)


クロック回路が結構面倒なのでROMリーダーから流用しようかと思ったのですが、全部新しく作る方が見た目も良いので1日がかりでブレッドボードに組み立てました。で、電源を入れてみたのですが想定通りの波形は出ません。(そういう状態だと電源を入れていること自体がリスクなので写真を撮るのは省略しています。)
信号を見てみると、クロックはOK。しかし、4004が出力するはずのSYNC信号が出ていません。順に信号を確認したところ、RESET信号が出ていないことを発見。リセット信号を作る部分の配線ミスでした。
これでOKかと思って再度トライ。しかしまだSYNCが出ません。
うーん、4004と4001は動作確認済みだから、まだ動作確認してない4002が壊れていてSYNC端子に変な信号を出している可能性があるな!
と思って、Lチカボードで全チップの動作を確認したのですが全部正常。おかしいなあ。と思って回路図を確認したところ・・・

あれ?SYNC, CLK1, CLK2じゃなくて、CLK1, CLK2, SYNCなの?!
CLKの接続が間違っていて、CLK2(クロックドライバの出力, ドライブ力強い)をSYNC(4004の出力)に突っ込んでいました・・・
壊れなくて良かったあ。

教訓: 組んだ回路がおかしいときは部品よりも自分の配線を疑うべし。

クロック周りを直したところ、ちゃんとSYNC信号が出ました!(上から、CLK1, CLK2, SYNC)


ちなみにこの評価ボード、LEDが点いたり、画面にメッセージが出たりはしません。
「プログラムの動作を見るにはオシロスコープを使え」と書いてあります。


というわけで、信号を観測してみます。想定される信号は下記の通り。


(1), (2), (3)がちゃんと見えました。
(1)

(2)
(3)


このボードではこれ以上やることはたぶん無いので、次はプログラムが書ける評価ボードを作ろうと思います。レイアウトはこんな感じを予定。

つづく。













コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Intel 4004 (その5) Mask ROM 4001を読んでみる

2023-01-18 16:41:33 | マイコン(4004)
Intel 4004入りパーツケースに一緒に入っていた4001です。プラスチックパッケージではありますが金脚で、溝のところに「i」と彫られていたりして凝った作りになっています。マスクROMなので使い道は無いのですが、何のプログラムが入っているのかちょっと気になったので調べてみることにしました。先日4004にROMを継げてLチカが出来るところまで到達したので、このROMを読むことも簡単に出来そうなものですが、そう単純な話ではありません。
先日のLチカではメモリインターフェースの4289を継げて「普通のROM」である1702にプログラムを入れて動作させていました。4289を継げたことにより、「MCS-4専用のROM」である4001が継げられなくなりました。
4004のアドレスバス、データバスは全部で4本しか無く、4bitの信号線を時分割して12bitのアドレスと8bitのデータをやりとりします。

MCS-4のバスプロトコルに従ってアドレスを送ってデータを受けとる方が簡単だと考え、その方向で作ることにしました。
最初はラズパイを使ってクロックの生成もラズパイにやらせようと思ったのですが、先日作ったROMライターより1桁速いレベルの制御が必要だということに気付いて断念。Teensy 4.1を使うことにしました。Teensyでも最初はクロック生成もTeensy側でやろうと思ったのですが、信号レベルの変換やそれに伴う遅延等を考えると、クロックはちゃんとクロック生成回路で作る方がいいような気がしてきました。
その他の信号もレベル変換が必要なのですが、ROMライターの時に使ったトランジスタアレイでは速度が間に合わないことがわかり、3.3V→15Vには定番FETの2N7000、15V→3.3VにはCMOSの4050と4049を2段にかませることにしました。
-10V, GND, +5Vで組めばTTLレベルで信号をやりとりできるという話もあったのですが、データシートを見るとそんな単純な話ではないような気がして、信号レベルを確認しながら作っていました。


試行錯誤の末、出来上がった回路がこちら。


ブレッドボードに組んだものがこちら。


Teensy側のプログラムはGitHubに置きました。
GitHub - ryomuk/read4001: A simple ROM reader for Intel 4001(MSC-4) vintage mask ROM using Teensy 4.1

GitHub - ryomuk/read4001: A simple ROM reader for Intel 4001(MSC-4) vintage mask ROM using Teensy 4.1

A simple ROM reader for Intel 4001(MSC-4) vintage mask ROM using Teensy 4.1 - GitHub - ryomuk/read4001: A simple ROM reader for Intel 4001(MSC-4) vintage mask RO...

GitHub

 


クロックを別回路にするならラズパイでも良かったかなあ。
読んだ結果がこれ。

E2 CF 2A 41 50 DE 50 E5 20 FE 50 EE 50 E5 50 EE
50 E5 2A 42 5F FF 57 1A 48 24 5F FF 53 20 4C 18
5F FF 4F FF 22 CB F0 2B E1 21 E0 F2 71 29 E4 F2
E5 F2 E6 F2 E7 60 72 29 FA 50 F7 73 39 25 FA F5
E1 1A 47 1C 4F 19 50 12 50 14 52 11 43 40 45 F0
40 3F 2C 66 2E 59 20 00 3D 21 84 85 E0 F6 74 59
75 59 50 DE 40 75 50 DE 21 94 95 E0 F0 74 68 75
68 F0 2B E1 3F FA 68 A8 E0 B9 A9 E2 FB E0 74 75
F0 F8 E0 FC E0 74 81 F0 FB E0 F2 74 88 DF E0 F7
E0 1C 8D F0 2B E1 DF F9 E0 FA F9 E0 F3 F6 E0 74
9C 24 C0 21 E9 71 A3 EC ED EE EF 60 74 A3 20 20
22 30 21 E8 61 23 E8 E0 73 B2 20 00 20 10 F0 2B
E1 21 EB 61 23 EB E0 73 C1 2B EC 14 D7 D8 21 E1
F0 2B E4 19 D3 40 02 F2 E4 D2 21 E1 40 02 2B AB
F1 E1 F5 BB C0 21 23 25 27 29 2B 2D 2F C0 32 34
36 38 3A 3C 3E 30 C0 A4 F5 FD B4 EA C0 00 FF 00

ディスアセンブルしてくれるサイト(Intel 4004 disassembler)があったのでそこに食わせてみたところ、こんな感じでした。
プログラムっぽいけど、先頭の2バイトを見た感じだと2バイト目がリターン命令だし、これって000番地用のROMではないなあ。

【2023/01/18 追記】
上記サイトにあるエミュレーター(e4004)のサンプルプログラム"MCS-4 EVALUATION KIT USING THE 4001-0009"のコードを見たところ、2バイト目がリターン命令。これはもしかして、と思ってdiffを取ってみたら3箇所違うだけでほぼ同じ。そういえばパッケージを良く見たら4001-0009って書いてある!
差分の原因はROMリーダーのbit化けかと思ったんだけど、よくよく調べてみるとどうやらマニュアルの誤植が1箇所と、エミュレーター用のROMイメージの方が2箇所間違ってるっぽい。
これはすごいものを手に入れた。
【2023/01/18 追記ここまで】

* = $000
   0 $000: E2     WRR
   1 $001: CF     BBL 15
   2 $002: 2A 41  FIM P5 65
   4 $004: 50 DE  JMS 222
   6 $006: 50 E5  JMS 229
   8 $008: 20 FE  FIM P0 254
  10 $00A: 50 EE  JMS 238
  12 $00C: 50 E5  JMS 229
  14 $00E: 50 EE  JMS 238
  16 $010: 50 E5  JMS 229
  18 $012: 2A 42  FIM P5 66
  20 $014: 5F FF  JMS 4095
  22 $016: 57 1A  JMS 1818
  24 $018: 48 24  JUN 2084
  26 $01A: 5F FF  JMS 4095
  28 $01C: 53 20  JMS 800
  30 $01E: 4C 18  JUN 3096
  32 $020: 5F FF  JMS 4095
  34 $022: 4F FF  JUN 4095
  36 $024: 22 CB  FIM P1 203
  38 $026: F0     CLB
  39 $027: 2B     SRC P5
  40 $028: E1     WMP
  41 $029: 21     SRC P0
  42 $02A: E0     WRM
  43 $02B: F2     IAC
  44 $02C: 71 29  ISZ R1 41
  46 $02E: E4     WR0
  47 $02F: F2     IAC
  48 $030: E5     WR1
  49 $031: F2     IAC
  50 $032: E6     WR2
  51 $033: F2     IAC
  52 $034: E7     WR3
  53 $035: 60     INC R0
  54 $036: 72 29  ISZ R2 41
  56 $038: FA     STC
  57 $039: 50 F7  JMS 247
  59 $03B: 73 39  ISZ R3 57
  61 $03D: 25     SRC P2
  62 $03E: FA     STC
  63 $03F: F5     RAL
  64 $040: E1     WMP
  65 $041: 1A 47  JCN CN 71
  67 $043: 1C 4F  JCN AN 79
  69 $045: 19 50  JCN TN 80
  71 $047: 12 50  JCN CZ 80
  73 $049: 14 52  JCN AZ 82
  75 $04B: 11 43  JCN TZ 67
  77 $04D: 40 45  JUN 69
  79 $04F: F0     CLB
  80 $050: 40 3F  JUN 63
  82 $052: 2C 66  FIM P6 102
  84 $054: 2E 59  FIM P7 89
  86 $056: 20 00  FIM P0 0
  88 $058: 3D     JIN P6
  89 $059: 21     SRC P0
  90 $05A: 84     ADD R4
  91 $05B: 85     ADD R5
  92 $05C: E0     WRM
  93 $05D: F6     RAR
  94 $05E: 74 59  ISZ R4 89
  96 $060: 75 59  ISZ R5 89
  98 $062: 50 DE  JMS 222
 100 $064: 40 75  JUN 117
 102 $066: 50 DE  JMS 222
 104 $068: 21     SRC P0
 105 $069: 94     SUB R4
 106 $06A: 95     SUB R5
 107 $06B: E0     WRM
 108 $06C: F0     CLB
 109 $06D: 74 68  ISZ R4 104
 111 $06F: 75 68  ISZ R5 104
 113 $071: F0     CLB
 114 $072: 2B     SRC P5
 115 $073: E1     WMP
 116 $074: 3F     JIN P7
 117 $075: FA     STC
 118 $076: 68     INC R8
 119 $077: A8     LD R8
 120 $078: E0     WRM
 121 $079: B9     XCH R9
 122 $07A: A9     LD R9
 123 $07B: E2     WRR
 124 $07C: FB     DAA
 125 $07D: E0     WRM
 126 $07E: 74 75  ISZ R4 117
 128 $080: F0     CLB
 129 $081: F8     DAC
 130 $082: E0     WRM
 131 $083: FC     KBP
 132 $084: E0     WRM
 133 $085: 74 81  ISZ R4 129
 135 $087: F0     CLB
 136 $088: FB     DAA
 137 $089: E0     WRM
 138 $08A: F2     IAC
 139 $08B: 74 88  ISZ R4 136
 141 $08D: DF     LDM 15
 142 $08E: E0     WRM
 143 $08F: F7     TCC
 144 $090: E0     WRM
 145 $091: 1C 8D  JCN AN 141
 147 $093: F0     CLB
 148 $094: 2B     SRC P5
 149 $095: E1     WMP
 150 $096: DF     LDM 15
 151 $097: F9     TCS
 152 $098: E0     WRM
 153 $099: FA     STC
 154 $09A: F9     TCS
 155 $09B: E0     WRM
 156 $09C: F3     CMC
 157 $09D: F6     RAR
 158 $09E: E0     WRM
 159 $09F: 74 9C  ISZ R4 156
 161 $0A1: 24 C0  FIM P2 192
 163 $0A3: 21     SRC P0
 164 $0A4: E9     RDM
 165 $0A5: 71 A3  ISZ R1 163
 167 $0A7: EC     RD0
 168 $0A8: ED     RD1
 169 $0A9: EE     RD2
 170 $0AA: EF     RD3
 171 $0AB: 60     INC R0
 172 $0AC: 74 A3  ISZ R4 163
 174 $0AE: 20 20  FIM P0 32
 176 $0B0: 22 30  FIM P1 48
 178 $0B2: 21     SRC P0
 179 $0B3: E8     SBM
 180 $0B4: 61     INC R1
 181 $0B5: 23     SRC P1
 182 $0B6: E8     SBM
 183 $0B7: E0     WRM
 184 $0B8: 73 B2  ISZ R3 178
 186 $0BA: 20 00  FIM P0 0
 188 $0BC: 20 10  FIM P0 16
 190 $0BE: F0     CLB
 191 $0BF: 2B     SRC P5
 192 $0C0: E1     WMP
 193 $0C1: 21     SRC P0
 194 $0C2: EB     ADM
 195 $0C3: 61     INC R1
 196 $0C4: 23     SRC P1
 197 $0C5: EB     ADM
 198 $0C6: E0     WRM
 199 $0C7: 73 C1  ISZ R3 193
 201 $0C9: 2B     SRC P5
 202 $0CA: EC     RD0
 203 $0CB: 14 D7  JCN AZ 215
 205 $0CD: D8     LDM 8
 206 $0CE: 21     SRC P0
 207 $0CF: E1     WMP
 208 $0D0: F0     CLB
 209 $0D1: 2B     SRC P5
 210 $0D2: E4     WR0
 211 $0D3: 19 D3  JCN TN 211
 213 $0D5: 40 02  JUN 2
 215 $0D7: F2     IAC
 216 $0D8: E4     WR0
 217 $0D9: D2     LDM 2
 218 $0DA: 21     SRC P0
 219 $0DB: E1     WMP
 220 $0DC: 40 02  JUN 2
 222 $0DE: 2B     SRC P5
 223 $0DF: AB     LD R11
 224 $0E0: F1     CLC
 225 $0E1: E1     WMP
 226 $0E2: F5     RAL
 227 $0E3: BB     XCH R11
 228 $0E4: C0     BBL 0
 229 $0E5: 21     SRC P0
 230 $0E6: 23     SRC P1
 231 $0E7: 25     SRC P2
 232 $0E8: 27     SRC P3
 233 $0E9: 29     SRC P4
 234 $0EA: 2B     SRC P5
 235 $0EB: 2D     SRC P6
 236 $0EC: 2F     SRC P7
 237 $0ED: C0     BBL 0
 238 $0EE: 32     FIN P1
 239 $0EF: 34     FIN P2
 240 $0F0: 36     FIN P3
 241 $0F1: 38     FIN P4
 242 $0F2: 3A     FIN P5
 243 $0F3: 3C     FIN P6
 244 $0F4: 3E     FIN P7
 245 $0F5: 30     FIN P0
 246 $0F6: C0     BBL 0
 247 $0F7: A4     LD R4
 248 $0F8: F5     RAL
 249 $0F9: FD     DCL
 250 $0FA: B4     XCH R4
 251 $0FB: EA     RDR
 252 $0FC: C0     BBL 0
 253 $0FD: 00     NOP
 254 $0FE: FF     ???
 255 $0FF: 00     NOP
 256 $100: $







コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする