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に置きました。
クロックを別回路にするならラズパイでも良かったかなあ。
読んだ結果がこれ。
ディスアセンブルしてくれるサイト(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 追記ここまで】
先日の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に置きました。
クロックを別回路にするならラズパイでも良かったかなあ。
読んだ結果がこれ。
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: $