Skip to content

NEC/PC-8001 SIO(DIP16 socket)に挿すゲタのハードとソフトです。ESP32とBME280を活用してSNTP/BME280情報取得/FTPorSPIFFSリスト取得/FTPorSPIFFS DL GETを行うことが出来ます。

License

Notifications You must be signed in to change notification settings

bellTanTan/Esp32PC8001SIO

Repository files navigation

Esp32PC8001SIO

1.概要

NEC/PC-8001 SIO(DIP16 socket)に挿すゲタのハードとソフトです。ESP32とBME280を活用してSNTP簡易日時合わせ/BME280情報取得/FTP or spiffsリスト取得/FTP or spiffs Download GETを行うことが出来ます。

PC-8001装着状態

拡張コマンド実行1

拡張コマンド実行2

拡張コマンド実行3

2.はじめに

2022年6月の「父の日」のプレゼントと称して息子夫婦/娘夫婦より連名でPC-8031基板(TMS2516(2716ROM)を調べたらPC-8031-2Wでした)がプレゼントされて来ました。お父さんならこれを何かに活用できるだろうと言う目論見があったようです(草) 簡単に取り外すことが出来るICは死蔵保管とし基板にあったインバータロジックIC(SN74LS04N)を2つ取り外して遥か昔に自作したNEC/PC-8001 SIO(DIP16 socket)ゲタでもちまちま作ってみるかと始めた結果、第四形態物をここで公開する事にしました。

PC-8031-2W基板

ここに来るまでに以下の形態をとって来ました。

第一形態はRS-232C D-SUB9(極小RS232-TTLコンバータモジュール)

第一形態

第二形態はRS-232C D-SUB25(上記の極小RS232-TTLコンバータモジュールx2使用したD-SUB25シェル内2階建て配線物) 第二形態

第三形態はフリスク基板 & ESP32-WROOM-32 bluetoothを活用したSerial←→bluetoothなブリッジ物 第三形態

このリポジトリに記載するのは第四形態物です。

第四形態部品面

第四形態はんだ面

3.出来ない事

出来る事より出来ない事を優先します。このリポジトリを参考にして製作したあとで「あぁぁ、そうなんだ。それならイラね」「無駄な作業をさせやがって。ったく」と成らない為です(笑)

PC-8001本体のリセットスイッチでESP32-WROOM-32のリセット不可。不便なのは承知の上です。基板上の赤タクトスイッチを押して下さい。

PCG 8100との共存不可。SIO(DIP16 socket)とIC13(ユーザーROM/拡張ROMを挿すソケット)が干渉するためここで製作するSIOゲタと2764ROMゲタは利用不可。 PCG8100装着状態

PSA2.8aとの共存不明。PSA2.8aは所有していない為、共存できるかわかりません。2022/09/10時点で見ると基板はまだ販売されているようなので近いうちに購入して確認してみたいところです。

その他PC-8001 CPUゲタ化装着する基板との共存不明。

その他外部化機器との共存不明。

小生の利用環境において根本的に外部バスと接続する機器で剥き出しな機器だと遊びに来てた小さい子が走り回って蹴ったり素手/濡手(自由に飲食するためw)で触ったり床/畳置きの場合につまづいて転倒したりした場合事故/怪我が想定されます。子供は電子機器に対しての基礎知識無いので自由人です(草) 明らかに素手/濡手で触っても感電/機器動作不良等を引き起こさないがっちりした筐体品なら外部化機器利用もありなのですがどうしても事故る/怪我する事を想定してしまうと設置に躊躇してしまいます。

またPC-8001外部バスの50ピンフラットケーブルは長いとノイズに弱い。ツイストペアでFGシールドなケーブルなら良いのですが無いものねだってもどうしようも無いです。PCG 8100以外の外部化機器はPC-8033しか所有していません。PC-8033があるのでPC-80S31経由でDisk利用可な環境ですが何せ物が40年超え品。磁気ヘッド補修なんて経験値ゼロ。5.25inch磁気ヘッドクリーニングキットも15年程前に使い切りました。5.25inch2Dメディアは今となっては新品購入不可。2Dメディア保管作業失敗するとメディア表面にカビが生えます。除去作業に失敗してメディア破損やら磁気ヘッド破損やら多々見て来ました(笑) いつ壊れても文句言えない製品のためDisk機器は特別な場合しか利用しないようにしています(笑)

SIO 4800bps/9600bpsのダウンロードでも遅い。
1000BASE-T/100BASE-Tのネット速度に慣れてしまった為です(笑) cmtロード(600ボー)よりは早いですが慣れは怖い物です(笑) xmodem sum(128byte単位) プロトコルでESP32→PC-8001バイナリ受信を行います。128バイト受信中(ポーリング受信)に息継ぎ(RTSを落とす事)する形式にはしていません。計測した範囲で実効速度は450〜460byte/secでした。PC-8001mkIIの場合N80モード/Nモード両方ともRS-232C受信割込を使用しています。9600bpsとして運用した場合計測した範囲で実効速度は940〜950byte/secでした。

セキュアftpを利用出来ない。
基礎的なftpプロトコルを利用しています。暗号化されていない平文でユーザー名/パスワードがネットワークに流れます。広域ネットのftpサーバー機を利用する事は可能ですがセキュリティリスク高です。広域ネット側のftpサーバー機を利用する場合には十分にそのリスクを負って下さい。

PC-8001本体よりセーブ(csave/mom W等)の代替として利用出来ない。
そこまで実機運用にこだわる必要ないと思ってるため実装していません。ftpサーバーが使えるのでscpでファイル転送等いくらでも出来るためと言うのが本音です(笑)

4.最重要項目

元々公開する事を前提にしていませんでした。大切な過去資産/中古資産が作業内容によっては復旧不可能な破損状態になるかも知れません。このリポジトリを参考にして損害が発生しても一切保証出来ません。ご了承願います。

SIO Socket の端子図を示します

SIOSocket端子図

+5/+12V/-12Vが出てきています。PC-8001通電中に短絡させると一発で機器破損する可能性あります。十分に注意して下さい。

関連するPC-8001の公開されている回路図を示します

PC8001SIOCMT回路図

この回路図は工学社 I/O 1980年12月号または工学社 I/O別冊 PC-8001活用研究にて掲載された回路になります。インターネットアーカイブで公開されている工学社 I/O別冊 PC-8001活用研究より無断転載しました。手持ちPC-8001のSIO回路が断線無く繋がっている事をテスター等で十分に徹底確認して下さい。この時点でPC-8001側の回路導通不良があった場合は自ら補修するか別ハードを手に入れるか作業自体を諦めるかして下さい。

5.製作するゲタ回路図

SIOゲタの回路図を示します

SIOゲタ回路図

74LS04 5A/6A がGND落ちてないのは気持ち悪いと思われる方はGNDへ落として下さい。パスコン入ってないのは気持ち悪いと思われる方は追加して下さい。手作業での手はんだ回路実装になるため配線不良(断線/短絡/はんだボイド等)でPC-8001側にダメージを与える事も予測されます。テスター等で十分に配線間違いが無いか導通確認を徹底して下さい。

細ピンヘッダは気持ち「ハの字」になるように斜めにブレッドボード等に挿してはんだ付します。気持ち「ハの字」にするのはPC-8001本体をキーボード下にして本体ネジ締めのときゲタ落下防止の為です。

この回路を変更してPC-8001mkIIのD-SUB25 RS-232Cと接続する形式にすることも可能と思います。具体的には74LS04/AE-LCNV4-MOSFETは不要。極小RS232-TTLコンバータモジュールなどから基板のみ取り出してTXD/RXD/RTS/CTSはESP32側とクロスなし(直結)で元々SP3232EのD-SUB9 RS-232C端子ピンと接続されていた状態を参考に極小RS232-TTLコンバータモジュールの端子とD-SUB25 RS-232C端子ピンとクロス接続(極小RS232-TTLコンバータモジュール<->D-SUB25:TXD->RXD,RXD<-TXD,RTS->CTS,CTS<-RTS,DTR<->DSR,CD<->GND)するようにD-SUB25 シェル内で配線したら良いと思います。極小RS232-TTLコンバータモジュール(SP3232E)のVCCは+3.3VでOKです。このリポジトリ内Z80側のファームはPC-8001/PC-8001mkII(N80モード/Nモード)と共通です。残念ながらPC-8001mkIISRは過去、手持ちした事が無い(旧友/知人にも過去現在所有者無いですw)ためそのまま動作するのか不明です。

極小RS232-TTLコンバータモジュール(SP3232E)を活用したD-SUB25 シェル内表配線

DSUB25変換表

極小RS232-TTLコンバータモジュール(SP3232E)を活用したD-SUB25 シェル内裏配線

DSUB25変換裏

2764ROMゲタの回路図を示します

2764ROMゲタ回路図

パスコン入ってないのは気持ち悪いと思われる方は追加して下さい。手作業での手はんだ回路実装になるため配線不良(断線/短絡/はんだボイド等)でPC-8001側にダメージを与える事も予測されます。十分にテスター等で配線間違いが無いか導通確認を徹底して下さい。

ピンヘッダは気持ち「ハの字」になるように斜めにブレッドボード等に差してはんだ付します。気持ち「ハの字」にするのはPC-8001本体をキーボード下にして本体ネジ締めのときゲタ落下防止の為です。ピンヘッダには分割ロングピンソケットを挿します。

2764ROMゲタハの字

1990年代に秋葉原のジャンクBOXで購入したFC-80と言う手持ち2716ROMゲタを示します。

FC80ゲタ実装面

FC80ゲタはんだ面

遥か昔に自作したROMゲタ品は既に無いため今回はこの製品をお手本としました。IC13に挿すピン部品はJAE/PICD-12PB-T1と読めます。しかしこのピン部品は現在(2022/07/17時点)入手不可だった為ピンヘッダ(元々手持ち在庫資材)と分割ロングピンソケット(元々手持ち在庫資材)を繋ぎ合わせて2764ROMゲタ足としました。もっと適切な方法があればその方法で実装して下さい。PC-8001のキーボード裏基板と接触干渉しない。ROMゲタ装着時に他のICと接触干渉しない。これが目標になるROMゲタの製作と言う事です。

PC8001キーボード裏

以下関連する実測寸法です。

FC-80ピン長 5.6mm

FC80ゲタピン1

FC80ゲタピン2

FC-80ピン全体長 10.7mm

FC80ゲタ全体ピン1

FC80ゲタ全体ピン2

2764ROMゲタピン長 3.0mm

2764ROMゲタピン1

2764ROMゲタピン2

2764ROMゲタピン全体長 11.6mm

2764ROMゲタ全体ピン1

2764ROMゲタ全体ピン2

6.部品表

公開する事を前提に部品表を元々まとめていなかったため手持ち資材で購入元/品番が不明のものがあります。ご了承願います。

部品番号 部品名 URL 数量 備考
CPU1 ESP32-WROOM-32 https://akizukidenshi.com/catalog/g/gM-11647/ 1 新規に購入する場合は各種不具合改修されたD版以降が良いと思います
IC1 SN74LS04 1 PC-8031-2W基板から取り外して利用しました。中古購入だとヤフオク/各種電子部品取り扱いショップで探して下さい
IC2 2764 UV-EPROM 1 手持ち品(NEC/uPD2764D)を使用しました。中古購入だとヤフオク/各種電子部品取り扱いショップで探して下さい
U1 AMS1117-3.3V降圧型モジュール https://www.amazon.co.jp/KKHMF-AMS1117-3-3-%E3%83%91%E3%83%AF%E3%83%BC%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-AMS1117-3-3V-%E9%99%8D%E5%9C%A7%E5%9E%8B%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB/dp/B07FZ17B7D/ref=sr_1_6?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=AMS1117&qid=1663228485&sr=8-6 1 10セット品より動作確認して良さそうなのを選別して利用します。L字ピンは取り外して3ピンヘッダを取り付けて利用します
U2 BME280 https://www.amazon.co.jp/KKHMF-BME280%E6%B8%A9%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5-%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E3%83%96%E3%83%AC%E3%82%A4%E3%82%AF%E3%82%A2%E3%82%A6%E3%83%88IIC-5V%E6%B8%A9%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5-Arduino%E3%81%AB%E5%AF%BE%E5%BF%9C/dp/B088FLGGT8/ref=sr_1_7?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=BME280&linkCode=qs&qid=1663227828&sourceid=Mozilla-search&sr=8-7 1 BMP280(温度/気圧)を引き当てたらハズレと思って下さい。本来ならセンサ配置面のシルク印刷BMEの下にマークが入るはずです。マーク記載無し品として安くしているのかも知れません。BME280(温度/湿度/気圧)品販売なのにBMP280(温度/気圧)品混入が記載したURL以外のメーカー品であったような気がします
U3 AE-LCNV4-MOSFET https://akizukidenshi.com/catalog/g/gK-13837/ 1 ESP32側(3.3V)とPC-8001側(5V)とのTTLレベル変換に使用します
C1 小形アルミニウム電解コンデンサ 105℃ 16V 100μF 1
C2 セラミックコンデンサ 50V 0.1uF 1
R1 1/6W 10kΩ 1
J1 細ピンヘッダ 1×40 (黒) https://akizukidenshi.com/catalog/g/gC-06631/ 1 8ピンx2としてSIOへ差すゲタで利用します
J2 ピンヘッダ 1x40 https://akizukidenshi.com/catalog/g/gC-00167/ 1 12ピンx2としてIC13へ差すゲタで利用します。3ピンx1として5V降圧3.3Vモジュールで使用します
J3 分割ロングピンソケット 1x42 https://akizukidenshi.com/catalog/g/gC-05779/ 1 12ピンx2としてIC13へ差すゲタで利用します
J4 ピンヘッダ (オスL型) 1x40 https://akizukidenshi.com/catalog/g/gC-01627/ 1 1ピン、2ピンとしてESP32-WROOM-32のGND/TXD0/RXD0で利用します
S1 タクトスイッチ (赤色) https://akizukidenshi.com/catalog/g/gP-03646/ 1 ESP32-WROOM-32のRESET(EN)に利用します
S2 タクトスイッチ (黒色) https://akizukidenshi.com/catalog/g/gP-03647/ 1 ESP32-WROOM-32のFLASH(GPIO0)に利用します
ICソケット (16P) (10個入) https://akizukidenshi.com/catalog/g/gP-00007/ 1 SIOゲタ上で1つ74LS04装着に利用します
ICソケット (28P) 600mil (10個入) https://akizukidenshi.com/catalog/g/gP-00012/ 1 2764ROMゲタ上で1つ2764ROM装着に利用します
ミンティア基板 for ESP-WROOM-32 https://www.amazon.co.jp/gp/product/B07SZLG6KL/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&psc=1 1 SIOゲタとして利用します
両面スルーホールガラスコンポジット・ユニバーサル基板 Cタイプ めっき仕上げ 72×47mm https://akizukidenshi.com/catalog/g/gP-03231/ 1 2764ROMゲタに利用します
プラスチックナット+連結(6角ジョイント) スペーサー (10mm) セット https://akizukidenshi.com/catalog/g/gP-01864/ 1

7.ESP32-WROOM-32へのファーム書き込み

資料整備時点(2022/09/15)でArduino IDEは2.0.0がリリースされています。ここでは1.8.19で記載します。Arduino IDE環境定義、esp32環境定義は他サイトを参考にして下さい。DEKO様サイトは情報の網羅レベルが半端ないです。一読されるのをお勧めします。ESP32 Sketch Data Uploadを使用しますので環境定義して下さい。

必要になるライブラリは以下2点です。

ESP32 FTPClient v0.1.4
Adafruit BME280 v2.2.2

ツール→ライブラリ管理よりダウンロードします。関連するライブラリもあると自動判断されたら全てダウンロードします。

ESP32 FTPClient v0.1.4はパッチを入れます。

ESP32 FTPClient v0.1.4 patch

--- ESP32_FTPClient.cpp.org  2021-04-03 19:13:14.998750540 +0900
+++ ESP32_FTPClient.cpp 2021-04-03 19:15:46.931344537 +0900
@@ -305,7 +305,8 @@
     if( _b < 128 )
     {
       String tmp = dclient.readStringUntil('\n');
-      list[_b] = tmp.substring(tmp.lastIndexOf(" ") + 1, tmp.length());
+      list[_b] = tmp;
+      //list[_b] = tmp.substring(tmp.lastIndexOf(" ") + 1, tmp.length());
       //FTPdbgn(String(_b) + ":" + tmp);
       _b++;
     }

具体的には ESP32_FTPClient.cpp を探して308行目をコメント化。新規に同じ行へ

list[_b] = tmp;

を入れます。行番号表示付きで記述すると以下のようになります。

307 String tmp = dclient.readStringUntil('\n');
308 list[_b] = tmp;
309 //list[_b] = tmp.substring(tmp.lastIndexOf(" ") + 1, tmp.length());
310 //FTPdbgn(String(_b) + ":" + tmp);

この作業を怠るとファイル名しか取得出来ない状態になるため実利用で誤作動します。

ご自身のネットワーク環境に合わせて定義を行います。const.hの定義を書き換えます。

ここで実装した手法はファーム書き込み済みESP32-WROOM-32チップ破棄の時にゴミ拾いされて解析されWiFiネットワークを踏み台にされるセキュリティリスクを伴います。企業等で大量(1万個とか10万個とか)生産/破棄する場合はたしかにヤバいと思います。しかしどこの誰とも知れない一般家庭のWiFiネットワーク侵入(踏み台化)をゴミ拾いから行うヤツ居るのか(笑) エロサイト閲覧でbot感染してbot組み込まれる方がよっぽど自然な流れなセキュリティリスクと個人的には思います。どうしても気になる場合は廃棄の時、金槌等で文字通り破片になるまでESP32-WROOM-32を粉々に砕いて廃棄して下さい。セキュリティガチガチな実装じゃないとイヤだ星人な方はご自身が納得行く形式に組み直して下さい。

ネットワーク定義の利便性を高めるにはesp32のpreferencesを活用してcmd wifisetup/cmd ifconfig/cmd ntpsetup/cmd ftpsetup等が作れそうです。

以下書き換え対象のconst.hの内容です。

12 const char * ssid     = "test001";
13 const char * password = "password001";
17 const char * ntpServer       = "192.168.1.250";
22 const IPAddress ip( 192, 168, 1, 101 );     // for fixed IP Address
23 const IPAddress gateway( 192, 168, 1, 1 );  // gateway
24 const IPAddress subnet( 255, 255, 255, 0 ); // subnet mask
25 const IPAddress DNS( 192, 168, 1, 1 );      // DNS
29 const char * ftpServer = "192.168.1.240";
30 const char * ftpUser   = "pi";
31 const char * ftpPass   = "pi";
32 const char * ftpDir    = "work/pc-8001/media";
37 const char * telnetServer = "192.168.1.240";
38 const int telnetPort      = 23;

12行目はWiFi 2.4GHz 11a/11b/11g/11nのSSIDです。
13行目は接続先SSIDのパスワードです。
17行目は利用するntpサーバーです。ローカルネットに自前のntpサーバーが無い場合は普段利用定義してるntpサーバーを記述します。以下から1つ選んでも良いと思います。選択の基準はネットワーク的距離(応答時間)と思います。昔、桜時計で...(草)

ntp1.jst.mfeed.ad.jp
ntp2.jst.mfeed.ad.jp
ntp3.jst.mfeed.ad.jp

22行目は、このSIOゲタのESP32-WROOM-32で利用する固定IPアドレス値です。
23行目は、このSIOゲタのESP32-WROOM-32で利用するゲートウェイIPアドレス値です。
24行目は、このSIOゲタのESP32-WROOM-32で利用するサブネットマスク値です。
25行目は、このSIOゲタのESP32-WROOM-32で利用するDNS IPアドレス値です。
dhcpじゃないとイヤだ星人の方は22行目〜25行目定義は放置してEsp32PC8001SIO.inoの144行目をコメントにして下さい。

143 WiFi.mode( WIFI_STA );
144 WiFi.config( ip, gateway, subnet, DNS );
145 delay( 10 );

dhcp化

143 WiFi.mode( WIFI_STA );
144 //WiFi.config( ip, gateway, subnet, DNS );
145 delay( 10 );

29行目はftpサーバーのIPアドレス値です。DNSで名前解決できる場合は適切な文字列を定義して下さい。
30行目はftpサーバーログインユーザー名です。
31行目はftpサーバーログインユーザーのパスワードです。
32行目はftpサーバーの読み出し対象のディレクトリです。アクセス可能なディレクトリ名を定義して下さい。
37行目は現時点(2022/09/15)では利用出来ません。定義としてはtelnetサーバーのIPアドレス値です。
38行目は現時点(2022/09/15)では利用出来ません。定義としてはtelnetサーバーのTCPポート番号値です。

PC-8001mkIIで使用する場合で9600bpsにしたい場合はEsp32PC8001SIO.hを書き換えます。

32 #define SIO_BPS           4800  // PC-8001
33 //#define SIO_BPS           9600  // PC-8001mkII

9600bps化

32 //#define SIO_BPS           4800  // PC-8001
33 #define SIO_BPS           9600  // PC-8001mkII

ボード定義(Arduino IDE board/target/flash size/partition scheme/PSRAM/等の選択)が終わったら「検証」をクリックしてコンパイルがとおるか確認して下さい。

SIOゲタ、電源ユニット、TTLレベル変換USBシリアル変換ユニットをブレッドボードに挿した状態を示します。TTLレベル変換USBシリアル変換ユニットはTTLレベル3.3Vで使用します。

ESP32単体開発環境1

TTLレベル変換USBシリアル変換ユニットの5V/3.3VよりESP32-WROOM-32の電源をとる形式で解説しているページも多々あります。USB1ポートあたり500mAが限度です。このSIOゲタのファームの場合、即時WiFi使用開始します。瞬間的に500mA保証要なのでWifi使用開始で電力供給が下回りリセット(Arduino IDEのシリアルモニタにBrownout detector was triggeredが出る)を繰り返す事になりかねません。面倒でも別途用意する電源ユニットより5V供給してAMS1117-3.3V降圧型モジュールより3.3VをESP32-WROOM-32へ供給します。

ESP32電流

ESP32-WROOM-32よりL字ピンにてTXD0とRXD0の繋ぎを示します。極小シルク印刷で「ミンティア基板 for ESP-WROOM-32」にTXDとRXDが記載されています。「ミンティア基板 for ESP-WROOM-32」の端子情報も示します。

ESP32単体開発環境2

ESP32単体開発環境3

ESP32単体開発環境4

電源ユニットの電源を入れてAMS1117-3.3V降圧型モジュールのLEDが点灯するのを確認します。LEDが点灯しない。焦げ臭い。煙が出る。等の異常がある時は即座に電源を切って火災発生案件に成らないように注意して下さい。

正常に電源投入が出来ていれば赤タクトスイッチを「押して離す」にてリセットがかかります。元々購入時に書き込まれていたファームが起動する場合もあると思います。ユーザーサイドファームが何も書き込まれていない場合もあると思います。TTLレベル変換USBシリアル変換ユニットの対応するシリアルポートをArduino IDEで開いて確認して下さい。異常がなければ黒タクトスイッチを押しながら赤タクトスイッチを押して離し黒タクトスイッチを離します。Arduino IDEで開いているシリアルモニタに以下のようにメッセージが受信されると配線等成功です。

ESP32開発1

この状態でファーム書き込み出来ます。Arduino IDEにて「マイコンボードに書き込む」クリックして書き込み開始します。

ESP32開発2

ESP32開発3

ESP32開発4

以下の状態でファーム書き込み完了です。市販されているesp32-devkitのように自動書込&自動リセット回路はこのSIOゲタでは実装していません。赤タクトスイッチを押下してリセットをかけます。

ESP32開発5

書き込んだファームが動作開始すると以下の状態が受信されます。黒塗りしてる箇所には定義したSSIDと定義したESP32-WROOM-32のIPアドレス値が示されます。何度もリセットを押下して動作開始するか、電源ユニットの電源をOFF→ONにて書き込んだファームが動作開始するか確認して下さい。

ESP32開発6

8.SPIFFS書き込み

参考例としてこのリポジトリ内dataディレクトリにcmtファイル(N-BASICもの)を用意しています。ファイル名は30byteが最大です。SPIFFSのイメージ生成にてESP32側のSPIFFSパーティションに書き込むのですが残念ながらイメージ生成時各ファイル日時はtime_t = -1です。それではとても寂しいのでdataディレクトリに元々のファイルの日時情報を別ファイルに持ち込んでESP32側でそのファイルがある場合SPIFFSの各ファイル日時を更新するようにしています。(別件過去プログラムからのコピペですw)

使用されているArduino IDE環境がUNIX or *BSD or linux or Macintosh(Mac OS X 以降)の場合SPIFFS向けのdataディレクトリをカレントディレクトリとしたコマンドプロンプト内で以下を実行します。

$ ls -lan --time-style="+%Y-%m-%d %H:%M:%S" > fileDateTimeList.txt

使用されているArduino IDE環境がWindowsの場合SPIFFS向けのdataディレクトリをカレントディレクトリとしたコマンドプロンプト内で以下を実行します。

C:>forfiles /c "cmd /c echo @fsize @fdate @ftime @file" > fileDateTimeList.txt

黒タクトスイッチを押しながら赤タクトスイッチを押して離し黒タクトスイッチを離してファーム書き込み受信待機させます。Arduino IDEのシリアルモニタが開いているとSPIFFS書き込み失敗しますのでArduino IDEのシリアルモニタは閉じて下さい。ESP32 Sketch Data Uploadをクリックします。

ESP32開発7

SPIFFS書き込み開始。

ESP32開発8

SPIFFS書き込み終了。以下の赤枠内のメッセージが出てSPIFFS準備完了です。書き込む量によってはこのメッセージが表示されるまで時間がかかる場合があります。

ESP32開発9

Arduino IDEのシリアルモニタを開いて赤タクトスイッチ押下(RESET)します。以下の赤枠内のメッセージでSPIFFS内ファイル日時更新を示します。SPIFFS内fileDateTimeList.txtは削除されます。

ESP32開発10

SPIFFSファイル情報として取り込んだリストが以下の赤枠内メッセージになります。NTPサーバーより初回日時情報受信後にESP32側RTCが確定します。この時点で日時判定が出来るようになります。UNIX等のls -lと同様に現在日時より182日以前(約3ヶ月前)or未来の場合は「年」を「時分」の箇所に示します。

ESP32開発11

9.2764ROM書き込み

このリポジトリのz80/esp32pc8001sio_8krom.binをご使用のROMライターでロード出来る形式(?HEX形式等)に変換して2764UV-EPROMへ書き込んで下さい。

小生の普段使いOSはubuntu 22.04 LTSです。*BSD/SUN-3/SUN-4/HP-UX/Solaris/CentOS/等も利用して来ました。CP/M /MS-DOS/Windowsも利用してきました。Macは初心者レベルです(笑) FreeBSDの流れのMacは使用可能です。MSDNは1993年頃から加入して加入10年ぶんのCD/DVDも鬼のように社/自宅にあります(笑) Windowsは個人的に7でもう見切りつけました。脱Micro$oft派です(爆) どうしてもWindowsが必要な場合は、もうVM WindowsXPでいいやんと社/自宅で活動/運用しています(草) そのためZ80アセンブル作業/Z80バイナリ逆アセンブル作業/ROMライター転送等の作業もLinux上で行っています。

最近だとTL866II-PLUSと言う商品が網羅デバイスが多く便利のようです。2716/2732/2764/27128の25V/21Vには対応出来て無いようです。boothの筆選び工房様のTL866II Plus用 21V/25V対応 Vppコンバータを活用するのも良いなと心動いています。小生の手持ちADVANTEST R4945Aはもう耐用年数遥かに超えてる物を騙し騙し使っています。そろそろマジヤバい(爆) 旧友のPC-8001mkII補修お礼で新品TL866II-PLUSを頂きました。有り難い限りです。EEPROM or E^2PROMな28C64も書き込み出来ました。ものによると思いますが28C64の消去/書き込みスペックはBYTE/10万回だったと思うので中古UV-ROMより利便性高いかもです。

2764がどうしても入手不可の場合は27256とか27512の後半8Kに入れて不要な上位アドレスピンはVPP/VCCに繋ぐ形式でつったら良いと思います。その場合ROMゲタはこのリポジトリで明示した物では不可です。ご自身でPC-8001 IC13(2364 Mask ROM Socket)に挿せるROMゲタ回路を準備して製作して下さい。

新品UV-EPROMイレーサーは入手困難な状態です。手持ち品は2022年3月頃確認したら既に利用不可でした。小生の場合は東芝 殺菌ランプ 直管 グロースタータ形 4W GL4ブラックライト懐中電灯に取り付けてACアダプタ6V入力端子取付改造しコンセント タイマースイッチにて15分PasocomMini mz-80cの外箱に入れてROM消ししています(笑)

10.SIOゲタ装着

PC-8001電源切状態で行います。SIO Socketに装着してみるとESP32-WROOM-32側の自重でぽとっと落ちそうでした。とても危険ですのでスペーサーを取り付けてから装着して下さい。

SIOゲタ装着1

装着時にピンズレ防止のため側面からLEDライト等を照らして明るくして装着作業するのが良いと思います。

SIOゲタ装着2

以下は「ピンズレ」した状態での装着結果です。GND/+5V/+12V/-12Vの接続がズレます。これでPC-8001本体電源入れると一発で機器破損の恐れあります。ピンズレ/列ズレには注意して下さい。

SIOゲタ装着3

11.2764ROMゲタ装着

PC-8001電源切状態で行います。手前側をIC13 Socketに挿します。

ROMゲタ装着1

そのまま手前側を押し下げながら手前に引っ張る感じで奥側を挿します。

ROMゲタ装着2

ROMゲタ装着3

12.PC-8001 SIO 通信速度設定

PC-8001電源切状態で行います。CN8は、お持ちのPC-8001で製造から40数年後に初めて動かすロック機構になるかも知れません。硬めのロックです。ロック解除は上へ引き上げます。

速度設定1

元々1-6短絡設定(300bps)してあるジャンパー線を1-2短絡設定(4800bps)に変えます。設定後ロック(ロック機構を下へ押し下げます)します。

速度設定2

速度設定3

CN8選択定義内容

1-2: x16モード 4800 , x64モード 1200
1-3: x16モード 2400 , x64モード  600
1-4: x16モード 1200 , x64モード  300
1-5: x16モード  600 , x64モード  150
1-6: x16モード  300 , x64モード   75

x16モード/x64モードはuPD8251のレジスタのx16モード/x64モードを示します。cmtロード/セーブの速度600ボーとは独立設定です。

13.動作確認

キーボードユニットを装着無しモニタ装着で確認します。PC-8001本体の電源を入れてAMS1117-3.3V降圧型モジュールのLEDが点灯するのを確認します。モニタにも初期状態表示されるのを確認します。点灯しない。焦げ臭い。煙が出る。等の異常がある時は即座に電源を切って火災発生案件に成らないように注意して下さい。

動作確認1

動作確認2

AMS1117-3.3V降圧型モジュールのLEDが点灯し異常なければいったんPC-8001本体の電源を切ってキーボードユニットを装着し本体裏のネジ締めしない状態で電源入れます。

mon< RETURN >と入力してD6000とD7FF0を入力し2764ROM領域をダンプします。BASICプロンプトへ復帰するにはCTRL+B(CTRLキーを押しながらBを押す)です。2764ROMが正常に書き込まれているか確認します。600DH,600EH,600FHはバージョン値を示すため今後の更新内容によって変化します。

動作確認3

cmd ver< RETURN >と入力しバージョン表示されるか確認します。

動作確認4

ここで示されるv1.0.0の数値は今後の更新内容によって変化します。SIOゲタ上の赤タクトスイッチを押してリセットをかけたのちにcmd ver< RETURN >と入力してバージョン表示されるか確認します。初回応答時間が3秒〜5秒程度無いのは正常です。ESP32側の初回NTPクライアント定義/動作開始/初回NTPパケット受信/自己RTC初期化に要する時間です。PC-8001本体の電源を切って最低5秒は待ってから電源を入れます。BASICプロンプトが出たら再度cmd ver< RETURN >と入力してバージョン表示されるか確認します。

お使いのPC-8001本体ROMがVer 1.0の場合はPC-8001本体電源投入にて拡張コマンドcmdが使えません。本体ROMプログラムのバグの為です。mon< RETURN >で拡張コマンドcmdが使えるようにしています。お手数ですがPC-8001本体ROMがVer 1.0の場合は初回電源投入後mon< RETURN >を実施して下さい。BASICプロンプトへ復帰するにはCTRL+B(CTRLキーを押しながらBを押す)です。

14.PC-8001側拡張コマンド操作

利用可能な拡張コマンドと動作を示します。
PC-8001mkIIのN80モードではcmdをmatとして下さい。自己処理以外の場合オリジナルcmdエントリに制御移行してオリジナル処理動作確認をしてみましたが何度かは正常動作しました。本体リセットがかかる場合もあって安定動作しなかったのでPC-8001mkII N80モード時はmatにしました。6000H〜7FFFHのROM空間が2重(ユーザー側とシステム側)にある場合バンク切り替え的な事がオリジナルcmdエントリに入る前に必要なのかな。詳しく解析していませんw

cmd ver
SIOゲタ上ESP32-WROOM-32内ファームと2764ROM内ファームのバージョン表示を行います。

cmd sntp
PC-8001側の日時設定を行います。

cmd bme
SIOゲタ上BME280より情報取得し表示します。温度/湿度/気圧です。
BME280配置位置がCRTCの上近くのため温度(気温)として高めの計測になります。部品配置のレイアウト(ミンティア基板 for ESP-WROOM-32の配置向き、PC-8001電源ユニットとの接触干渉なども考慮要)を変えると良いかもしれません。ESP32-WROOM-32のGPIOの空きはまだあるので熱電対を複数追加もアリかもです。ペンレコ実装か(笑) BASIC言語変数への代入のための処理等は実装していません。BASICプログラムよりコマンド実行する事は出来ます。

cmd ftplist
SIOゲタ上ESP32-WROOM-32のWiFi機能を使って定義されたftpサーバーの定義されたディレクトリ内容を取得し表示します。
0基点通番付きで表示します。
表示中ESCキー押しっぱで表示一時停止します。
表示中STOPキー押下で表示停止します。
画面サイズが広い場合ftpサーバーから取得したファイルパーミッションよりアクセス権/ファイルサイズ(byte単位)/最終更新日時(UNIX表示形式)/ファイル名を表示します。
画面サイズが狭い場合はftpサーバーから取得したファイルパーミッションよりファイル名を表示します。
漢字表示(JIS/EUC/ShiftJIS/UTF-8/等)は不可です。ftpサーバー側のファイル名定義には注意して下さい。

cmd ftpget,NNN,XXXX
ftplistで0基点通番の番号を指定してftpダウンロードGETを行いxmodem sum(128byte単位) プロトコルでバイナリ受信します。
メモリロード中の確定した範囲表示を行います。
STOPキー押下にてメモリロードを中止します。
ロード対象がcmtファイルでBASIC言語と判定される場合適切なメモリへロードします。
ロード対象がcmtファイルでマシン語と判定される場合適切なメモリへロードします。
多段ロード形式のcmtはマシン語only(GXXXX対応)、BASIC言語+マシン語(複数ブロック)、マシン語(複数ブロック)に対応しています。
PC-8001/PC-8001mkII(Nモード)の場合アドレスE9FFHがロードできる限度です。
PC-8001mkII(N80モード)の場合アドレスE5FFHがロードできる限度です。
ロード開始アドレス8000Hに対応しています。

cmd spilist
SIOゲタ上ESP32-WROOM-32内SPIFFS内のファイルを表示します。
0基点通番付きで表示します。
表示中ESCキー押しっぱで表示一時停止します。
表示中STOPキー押下で表示停止します。
画面サイズが広い場合ファイルパーミッションよりアクセス権(-rw-rw-rw-固定)/ファイルサイズ(byte単位)/最終更新日時(UNIX表示形式)/ファイル名を表示します。
画面サイズが狭い場合はファイルパーミッションよりファイル名を表示します。
漢字表示(JIS/EUC/ShiftJIS/UTF-8/等)は不可です。ファイル名は最大30byteです。SPIFFSのファイル名定義には注意して下さい。

cmd spiget,NNN,XXXX
spilistで0基点通番の番号を指定してSPIFFS内よりxmodem sum(128byte単位) プロトコルでバイナリ受信します。
メモリロード中の確定した範囲表示を行います。
STOPキー押下にてメモリロードを中止します。
ロード対象がcmtファイルでBASIC言語と判定される場合適切なメモリへロードします。
ロード対象がcmtファイルでマシン語と判定される場合適切なメモリへロードします。
多段ロード形式のcmtはマシン語only(GXXXX対応)、BASIC言語+マシン語(複数ブロック)、マシン語(複数ブロック)に対応しています。
PC-8001/PC-8001mkII(Nモード)の場合アドレスE9FFHがロードできる限度です。
PC-8001mkII(N80モード)の場合アドレスE5FFHがロードできる限度です。
ロード開始アドレス8000Hに対応しています。

以下、コマンド実行例です。

対象がBASIC言語cmtの場合

cmd ftpget,000<RETURN>

対象がマシン語cmtの場合

cmd ftpget,001<RETURN>

対象がマシン語cmtで実行開始アドレスがE3CCHの場合

cmd ftpget,002,&he3cc<RETURN>

対象が不特定(任意のバイナリをとにかく特定のメモリへ入れたい)でロード開始アドレスをC000Hとした場合

cmd ftpget,003,&hc000<RETURN>

対象が多段ロード形式cmtの場合

cmd ftpget,004<RETURN>

15.問題点

使えるコマンドリストを忘れそう。
使っててそのように思いました。cmd help< RETURN >で利用できるコマンドリスト表示があったほうが良い気がします。

BASIC言語のcmtをcmd ftpgetで連続すると暴走する。
new< RETURN >して下さい。cmd ftpgetの処理シーケンスの最初でnew(BASICプログラムクリアコマンド)を実装しようかどうか悩みました。基礎的操作はユーザー任せが良いと判断して暴走するを選択しました(笑) いわゆる「手抜き」ですw

16.最後に

PC-8001 SIOゲタも第四形態で終了かと思いきや旧友からは「俺のPC-8001mkIIで使えるようにしてくれ。D-SUB25にさガチャと装着でよろ〜」と軽く言ってくれてPC-8001mkII本体の補修までお願いされてしまいました。20年近く押入れで寝かしてたらしいです(笑) そのPC-8001mkII機補修作業で資料整備が遅れました。PC-8001mkII向けなD-SUB25内クロス接続(SP3232E活用)なプロトタイプも完成して目下(2022/10/05現在)旧友向け納品w物製作中です。ESP32-WROOM-32E版(フラッシュメモリ16Mbyte)を活用した旧友向け納品w物も完成(2022/10/23現在)して一段落ですw

cmtロードよりは早いですが4800bps/9600bpsでもやっぱり遅いです。速度優先と永続利用を考えるとSDカードよりロードできるリポジトリが他にありますのでそちらを利用するのが良いと思います。

ただ面白かったのは近所の子供/孫たち入れた夏季休暇中レトロゲーム大会開催でロード中の画面がとても不思議らしく見入ってました。しかし慣れてくるとメモリロードの状態を見ながら「はやく、はやく、はやく」と祭りばやし状態で踊りまくってワロタでした(^◇^;)

About

NEC/PC-8001 SIO(DIP16 socket)に挿すゲタのハードとソフトです。ESP32とBME280を活用してSNTP/BME280情報取得/FTPorSPIFFSリスト取得/FTPorSPIFFS DL GETを行うことが出来ます。

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published