ブログの練習

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

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でシェアする
« EX-80 (その3) 修理の巻 | トップ | Intel 4004 (その6) MCS-4 Ev... »
最新の画像もっと見る

コメントを投稿

マイコン(4004)」カテゴリの最新記事