PC-98HA(HANDY98)を使う!その1

今回はPC-98HA(HANDY98)を使ってみたお話!

 

我が家には動かないPC-98HAが置いてある。

これは知人(というかむしろ恩師的な方!)からのいただきもので、本体+ドッキングステーション+MS-WORKS+MS-WORKSのマニュアル…という感じのセット!

知人自身、もう何年も前から動かしてませんという話だった。

 

頂いた時、手元でユニバーサル電源(Amazonなどで買える汎用ACアダプタ)を繋げてテストしてみたけれど、聞いていた通り全く電源が入らない状態だった。

でもPC-98HAのカタチが好きだったので、そのままコレクションとして保管してあった。

 

Twitter(ってもう言っちゃダメなの?w)でのひょんな会話の流れから、そういやPC-98HA持ってるぞと思い出した。

それまで試したことが無かったのだが、PC-98HA専用のACアダプタ(PC-98HA-12)を持っていたので、これを使って電源入れてみたところ、何事も無かったように起動した!(@_@;;

え?え??え???なんで??(-_-;

 

過去に何度か、別のPC-98HAを使ったことがあるんだけど、その時もたまに電源が入る本体があった。1〜2回起動するけど、すぐにだんまりになっちゃう。

これも今回だけの起動かな。

そんな感じで見ていたので、立ち上がったのをこれ幸いと画面を何枚か写真撮っていたw

その後…同じ構成(専用ACアダプタ)で何度と無く起動させたが…あれ?不思議と安定してる。

なんだこれは??どうしたってゆーの?(^^;;;

なんだかちゃんと動いているようなので、よっしゃコレならば簡単なメンテテンスしてみようって気になった!(^-^)

 

新しいバッテリー

まずは安定動作に必要と思われるモノ、バッテリーを取り付けてみる事にした!(^^)

困ったのは……うちのPC-98HAには元からバッテリーが入ってない!(^^;;

オリジナルがどんなバッテリーなのかがさっぱりわからない…。

 

Google先生に訪ねてみたところ、7.2V 1200mAhのニッカドバッテリーが使われていたみたいだ。同じものが手に入れば良いけれども、そんな都合良くいくものだろうか…。

 

↑分解して動かなくなるのが怖いので、写真は手に入れたバッテリーとケーブル。

 

試しに単3電池をはめてみたけれど、縦方向が結構なギチギチ!

これは単3電池ではないのかもなーと思い、当初は単4電池サイズのニッカド乾電池を手に入れようと思っていた。

複数のニッカド電池を組み合わせて、バッテリーを作るための溶接機もある!(^^)

しかし、肝心のニッカド電池(単4サイズ)は売り切れになっていて手に入らず…。

 

諦めて帰ろうと思っていたら、すぐ横に単3サイズの7.2V 700mAhニッカド電池があった!

うーん…これでも良いのかなぁ……。

同じ場所に1200mAhも置いてあったが、もしもバッテリーケースに入らなかったら大変なので、安い方を選択だ!(ToT)

 

バッテリーのコネクタは2芯だったのを覚えていたので、問題なく買えた!

そして試しに入れてみたのが上の写真。

心配していたけど、ばっちり入ったぜ!(^-^)

 

本体に装着する前にバッテリーをフル充電したかったのだが、手持ちの充電器ではちゃんと充電出来なかった…。電圧とかきっと何かあるのね、多分(T-T)

仕方がないので、PC-98HA本体の充電機能に頼ることにして、ぶっつけ本番で繋げてみる事にした!

 

配線を切らなかったのでだいぶ長さが余った感じになってしまったが……バッテリーと2芯コネクタを繋げておしまい!

収縮チューブをキレイにつけられたのが大満足だ!←小さな喜び

 

ACアダプタを接続してしばらく様子を見てみたが、バッテリーが熱くなったりもせず安定して充電されているみたいだ!

一晩置いた翌朝、おそるおそるACアダプタを外して起動してみた……。

無事にバッテリーで駆動出来るようになった!(^-^)

これはめっちゃ嬉しかった!(^o^)ノ

 

ROMデータが欲しいんだ!

上にも書いたように、これまでの経験上PC-98HAは突然起動しなくなる事がある。

おそらく本体のコンデンサか何かが悪さをしているのだろうけど、一度起動しなくなると当面は起動しない(T-T) とてもきまぐれなHANDY98だ!(TOT)

 

動かなくなっちゃう前に、ROMのデータを引っ張り出しておきたい!(すぐにやるやらないは別にしても)いつかエミュレータを作る時にどうしても必要だからだ(^^)

 

いろんな資料を見たところ、PC-98HAはPC-98LTの上位互換らしい。

そういえば以前、PC-98LTでROMを引っ張り出した際は、SYMDEBでちまちまと書き出した覚えがある。バンク切り替えもしつつ読み出せたような気がする。

今回も同じ手法で出来るだろうか?

そう思ってバンク切り替えの情報を探したのだが……どうも見つからない(T-T)

PC-9801関連の書籍を片っ端から調べてみたつもりなのだが…orz

↑この本に書かれてなかったら、もうROMを解析していくしか方法がない(T-T)

うーん、長丁場は避けたいので、何か良い方法はないだろうか…汗

 

ところで……PC-98HAのエミュレータって存在するんだっけ??

そういえば一度も気にしたことがなかった!(^^;

探してみたところ、かの有名なTAKEDA氏が作ってくれていた!(^-^)

これは本当に助かる!

配布されていたファイルの中身を見てみたところ、PC-98HAからROMを抜き出すツールも添付してくださっていた!これは活用させてもらわねば!(^^)

 

しかし……たとえROMが読めたとしても、それをPC(Mac)上へ転送する方法が無ければ意味がない。

だけど!!(^o^)

うちにはドッキングステーションがある!!

これを本体と繋げる事により、フロッピーディスクが使えるようになる。

さっそく試してみたところ、なんだか空回りするような音がする…orz

うーん…これは…やっぱりベルトとかそういう事情??(T-T)

以前に比べて修理熱が冷めてしまってる事もあり、フロッピードライブを外して分解する気力が出てこない…(T-T)

こっちの方向は茨の道だ…orz

 

次はRS-232Cによる転送を考えてみる。

こちらもケーブルは持っているけど、MS-DOSでシリアルによる運用をしたことがない!

その昔、PC-9801とPC-E200を繋げてデータのやりとりを…とかして以来だww

こっちも実験その他が面倒そうだ…と優先度を下げた。

 

最後に残ったのがPCMCIAのメモリカードによるデータのやり取り。

これでやり取りできれば、フロッピーでの運用と似たような感じになる!

モバイル大好きなご家庭にありがちだと思うが、うちにもメモリカードが山ほどある!

どれかひとつでも使えれば、他のモバイル機器とやり取りが出来る。

そう思って調べていったが、なぜかほとんどがダメで128KBのメモリカードのみが使えた。

のちに使い方を間違っていた事が判明して、PCMCIA TYPE1のSRAMカードであれば、実験した範囲ではほぼ使える事が判明w

 

ROMを抜き出すツール(TAKEDA氏添付のdump1〜3.c)を参考にして、自分の環境に適合するように改造し、ROMを抜き出した!

画像

128KBに収まるように小さく分割しながら、ROMファイルをMacへコピーしたので、かなーり面倒な作業になった!(T-T)

 

HANDY98エミュレータ

せっかくROMを抜き出せたので、エミュレータが動くか試してみる!

最近、M1 Macの環境にWine(Windows以外の環境で、Windowsのアプリを動かすツール)を導入したので、これを利用してTAKEDA氏のエミュレータが動くのか試してみる!

え!?一発で動いたんだが……これは凄い!!(^o^)

少し使ってみたけれど、RAMディスクの初期化がドライブ名無効で出来なかったり、メモリカードの初期化が書き込み禁止で出来ないなど、まだいろいろあるのかも知れない。

 

フロッピーのエミュレーションは動いてるようなので、これを利用して何か作れないかな…と思ってみたり(^^)

 

おわりに

今回はひょんなことで動くのが確認できたPC-98HAを使ってみた!

きまぐれなPC-98HAなので、またいつ動かなくなるかわからないが、せっかくなので動いているうちに何か作ってみたいところだけど……(^^;;

 

ではまた次回!(^-^)ノ

文豪mini5GXでMS-DOS!

みなさんチにある文豪、お元気ですか?(^-^)

今回、文豪mini5GXでMS-DOSを動かしてみたので、覚えてるウチにその記録をば。

 

まず私がMS-DOSを移植したワケじゃないよ!!!を強く伝えたいw

これは往年のパソコンワールドという書籍で発表された、ユーザー作成のモノだ。

その辺りの経緯は過去のブログでも紹介しているので、ぜひ読んで欲しい(^^)

↑まず1987年11月号のパソコンワールド誌に、文豪mini5GX用のMS-DOS移植記事が掲載された!

その後、↓1989年1月号に改良版と称されたMS-DOSが掲載される!

今回動かしてみたのは、こちらの改良版の方だ!

 

本来の方法は…

必要なモノは「文豪本体」「MS-DOS本体」「2DDフロッピーディスク2枚」。

そして雑誌に書かれている移植方法は、

  1、MS-DOS本体をコピー

  2、CP/M上のDDTで6KBあるバイナリを打ち込んでセーブ

  3,実行して移植版MS-DOSを作成

という感じになっている。

 

このDDTで6KB打ち込むというのをどうしても避けたくて……だって、チェックサムも取れない状態で6KBを間違いなく打ち込む自信など無い!(^^;;

そんな理由から、何年か前にMac上で入力した。

このバイナリをうまく活用できないだろうか…。

 

以前、なんらかの方法を使って、文豪mini5HLでMS-DOSを立ち上げていた。この方法を記録していなかった事で、記憶の彼方へ行ってしまい、どうしても思い出せない…。

でもディスクは残っているから、何か突破口があったんだろうなぁ…うーん…(@_@;;

 

仕方ないので、まずは簡単な方法で5GXのシステムディスクを作ってみる。

方法としてはこうだ。

  5HLのシステムディスクイメージを読み取る

  そのイメージに5GX用のパッチを当てる

  イメージを新規ディスクに書き戻す

これで5GX用のディスクイメージが出来上がるはずだ(^0^)

 

元々、雑誌に載っていたダンプは5GX用だったので、5HL用にパッチが当たっていたものを元に戻す…という作業となる。

もちろん、雑誌に載っている6KBのダンプリストと、実際のディスクイメージとではアドレスも異なっているので、そこは慎重に探していきパッチを当ててみた。

画像

そして冒頭の写真にもある通り、無事5GXでMS-DOSが起動した!(^-^)

 

今風に作ってみる!

ただでさえ少ないメモリしかない5GXでMS-DOSを動かしているのだから、通常思いつくようなソフトはメモリ不足で動かない(T-T)

今はMS-DOS3.1を使っているが、2.11であればもう少しだけメモリが空く。

微々たるものだけど、やってみて損はないだろう(^^)

 

MS-DOS2.11のディスクイメージは文豪mini5キャリーワードのディスクが手元にある。

あるけれども…実は5GXからキャリーワードへはパッチ量が多いのだ!

目作業(目で見て作業)で頑張ってみるのもあるけれども、それだと面白みがない(^^;

せっかくなので、文豪で起動するシステムディスク今の環境で作ってみようではないか♪

何度もやる作業ではないので、私は手作業で行ってしまった(^^;;

 

まずは用意するもの!

私は過去にバックアップしていたPC-9801用N88-BASIC(86)のディスクを使用した。ここにMS-DOS2.11が入っていたのだが、40年近く前のディスクで出処も怪しいので、ツッコミ不要でお願いしたい(T-T)

 

次にパソコンワールド誌1989年1月号に掲載されていたダンプリスト6KB。これは過去に入力していたので、それをそのまま利用した。

このプログラム(ダンプリスト)で行っている事を、Mac上でやってみる。

 

1、システムディスクをイメージ化

まずはMS-DOS2.11のディスクをイメージファイル化する。これはMacにUSB経由で繋げたフロッピーディスクドライブ(FDD)から単純に読み込むだけだ。

  diskutil unMountDisk /dev/disk?? ← ??の部分は環境によって変わる

  sudo dd if=/dev/rdisk?? of=msdos211.img bs=4096

 

2、IO.SYSの場所を探す

FATを解析して、IO.SYSがイメージ中のどこ(のアドレス)にあるのかを探る。

FATについてはMS-DOS関連のテクニカル書籍にたくさん書かれているので詳細は省くけれど、ファイルがディスクのどこにあり、どう繋がってるのかを記しているデータだ(^^)

 

3、IO.SYSを上書きする

6KBのダンプリストのうち、0350h以降が文豪のデバイスドライバになっているので、この部分をIO.SYSへ上書きする。

さらっと書いてあるが、実際にはかなり面倒な作業だった(^^;; なにせデータはセクタ単位に分けて書き込みをしないといけないのだw

 

4、文豪用ディスクにする

詳しくは書かないが、文豪で起動ディスクとして使うためのトラップ回避が必要。これを正しく行わないと、起動する際にINVALID DISK!と表示されてしまう。

これは単純にダンプリストの0270h〜033Fhをイメージの先頭(トラック0、セクター1)に上書きすれば良い。

 

5、イメージをFDへ書き戻す

出来上がったイメージを新しいフロッピーディスクへ書き出す。

  diskutil unMountDisk /dev/disk?? ← ??の部分は環境によって変わる

  sudo dd if=msdos211.img of=/dev/rdisk?? bs=4096

 

何度か勘違いがあり(特にIO.SYSへの書き戻し)やり直すハメとなったが、無事に文豪mini5GXでMS-DOS2.11が立ち上がった!(^o^)

 

おわりに

低気圧による頭痛に悩まされながらセグメントの計算とかするもんじゃない…と思ったが、なんとか無事に動かすことができるようになった。

 

よりメモリの多い文豪でもMS-DOSを立ち上げたいと思っていろいろ調べているけれども、一筋縄ではいかないのが現状だ(T-T)

普通にMS-DOSを使いたいのならばPC-9801を起動すればいーじゃないか…と思うけれど、そうじゃないロマンが文豪にはある気がしている(^^)

いつかカラー文豪でもMS-DOS動かせるように頑張るよ!

 

ではまた次回!(^-^)ノ

 

祝!30万PV達成!

本日でこのブログのアクセスが30万PVを達成しました!(^-^)

毎回書きますけど、こんなヘンテコなブログを御覧くださってありがとうございます!

毎度趣味の垂れ流しで失礼してます(^^;;

 

ブログ始めて3年弱での達成でしたが、特に数字にはこだわって無くて(^^)

毎回ネタが出来ると、かなーり適当に編集してブログに出すという、ゆるーい感じで続けているのが良いんだと思っています!

 

前回の20万PVから今回の30万PVまで、実はブログを25回しか書いてなかった!(@_@;;

なんとなくJR-300以外、あんまり頑張ってない気が…(^^;;

 

段々と実務が厳しくなってきていますけど、週末中心にのーんびり更新していきまーす!

今後ともよろしくお願いします♪(^o^)

 

ではまた次回!(^-^)ノ

CM4Stackで遊んでみる!

 

今回は、新しく発売されたCM4Stackのお話(^^)

 

 

なんとなくの見た感じ、サイズ感がM5Stackを彷彿させるもので、まだ発売されたばかりのマシンだ!

M5Stack CM4Stack 開発キット CM4104032搭載www.switch-science.com

 

おそらくArduinoからの流れを組む、比較的簡単にハードウェア制御が出来るミニコンピュータという位置づけなのだろう。

ハードウェアを全く理解していない私にとっては、小さな液晶とコンピュータがパッケージングされたモノ、という感覚だ(^^;;

多分、ポケコンなどからの流れでこういう(CPU、キーボード、液晶がついてる)マシンが好きなんだろうなーと思う。

M5Stack系の良さをほとんどと言って良いほど使えてないのは自覚してる!(^^;;;

 

CM4Stack

初めにCM4Stackの名前を見てピンときた。

この界隈でCM4といえばRaspberryPi Compute Module 4が思い浮かぶ(^-^)

身近なところではreTerminalだったりDevTerm RPI-CM4 Liteに入ってたりする。

このボードがM5Stackの筐体に入っちゃうんだろうな…。

 

そして実際に販売されたCM4Stackの中身にはCM4が入っているんだと思う。

分解してないから見てないけど(^^;;

ということは中身はLinuxマシンなんだろうな…と予想がつく。

 

TwitterなどにCM4Stackの映像が流れるたびに「どうしようかなぁ…」と悩んでいた。

なぜかと言えば、私は小型のLinuxマシンをいくつも所有してる!

すぐに使える形になっているものもあれば……

箱に入ったままの新品も多数所有している。

つまりいつでもLinuxマシンは使える状態にあるのだ!

こんな状態なのに、さらに新しいマシンを手に入れる必要はあるのか…と葛藤!

 

散々葛藤した挙げ句、決めた!

一個だけ手に入れよう!(^-^)

よし、一件落着♪(^o^)

 

届いたCM4Stack

CM4Stackが届いてからの開封の儀式はいろんなところに出ていると思うので、私は使い始めるところから!(^^)

 

最初はHDMI経由のモニタ、USBにマウスとキーボードを繋げて、付属の電源と本体を繋げる。HDMIで繋げたモニタにはRaspberryPiで見慣れたデスクトップ、液晶にはCM4 STACKの表示が出る。

ネットワークケーブルを接続しておけば、液晶画面にIPアドレスが表示される。

HDMI側のモニタを操作をしてSSHを有効にすれば(raspi-configを使うのが楽ちんだよ!)、その後はssh経由でログインする事が出来る。

 

そしてログイン出来てしまえば………あとは普通のLinuxマシンだ(@_@)

おもむろに cat 適当なファイル > /dev/fb0 としてみる。

お、液晶画面側の絵が壊れた!(^-^)

よーしよーし!!(^o^)

…と思ったら、メモリ使用量とロードアベレージの数字だけが再表示されてしまった…。

(ここの写真を取り忘れる痛恨のミス!)

 

どのプロセスが表示させてるんだろう…とあれこれ探すが見つからない…。

うーん、どうしようかな…。

でも先にOSの再インストールをしてみる事した!

 

docs.m5stack.com

基本的には書いてある通りの手順で問題なく進んだが、私は過去にreTerminalのOSをアップデートする際、rpibootをMacにインストールしていた。

その部分は手間が省けたので楽チンで済んだ(^-^)

 

OSをインストールし直したら、液晶画面に表示されているCM4 STACKの表示が消えた!

私の使い方だったら復活させる必要もないかな…って事で、このまま使う!(^-^;;

 

とりあえずX68000

今回はX68000エミュレータを動かしてみたら、それで満足しそう!

だってFM-7とかPC-8801とかCP/M80とか、もはや動くのが当然なスペック…。私としては「メモリもない、CPUパワーもない。でも動かしてみる!」が好きなので、CM4Stackではスルーしようかなーと思ってるw

 

フレームバッファへ直描きするX68000エミュレータと言えば、過去にポメラDM250や、電子手帳Brainなどで何度も挑戦している!

pocketgriffon.hatenablog.com

pocketgriffon.hatenablog.com

pocketgriffon.hatenablog.com

pocketgriffon.hatenablog.com

このプログラムをssh経由で持ってきて、なーんも考えずにmakeってすれば、一発で動いたりしないだろうか…?(^-^;;

 

あー……さすがにそこまで甘くなかった(^^;;

CM4Stackのフレームバッファは深度16bitだったので、(最初のポメラ用に書かれた)深度32bitを前提に書かれたプログラムの一部は修正をした(^^)

 

どうやら画面を90度回転させてやる必要があるみたいだ!

単純に縦横を入れ替えるだけなのでプログラムは超単純だけど、離れた位置にあるメモリを頻繁にアクセスするためキャッシュがミスしまくって劇遅になる…とかないだろうか??

… → やってみたら全然気にする感じでは無かったんだけどね(^^;;

 

無事に横向きに表示された!(^-^)

 

ちなみに画面に入り切らない部分については、無理に圧縮して表示などはせずはみ出たところは表示しないという消極的な方法を取ったw

実用性よりも動くことを優先させた結果だ!←言い方

 

サウンドジョイスティックに対応させた。

この辺りは普通のLinuxプログラムなので、目新しいところが何も無い…(-_-;;

 

おわりに

とにかく速いCM4Stack!

このサイズでこのメモリとパワー……かなりのオーバースペックなのでは?(^^;

 

使っていると動いてる時間の半分くらいはファンが回りっぱなしとなる。今の時期でも回ってるので、夏場は熱対策が厳しくなるかも知れない。私は小型のファンを回して冷気をCM4Stackにあてながら作業をしていた。
そうしないと大変熱くなるのだ(^^;;

 

M5Stackの最新ハードという事でいそいそと手に入れてみたけれど、私のような明確な目的も無く手に入れてしまうと、過去の資産を動かして終了となってしまう(^^;;

 

 それよりもCM4Stackの魅力は外部ハードとの連携があるんだろうから、そちらに強い方が触ったらもっと魅力を発揮できるんだろうなー…汗

 

ではまた次回!(^-^)ノ

16進ダンプ入力ツールを作り直した!

先日からはてなブログのランキングというのに参加している!

特になにかあるわけではないけど、せっかくなので…という程度の理由!(^^;

よかったら上のバナーをクリックしてくれると嬉しいです!(^o^)

 

先日、ブログやTwitterでダンプリスト入力ツールを作ったというご報告をした。

趣味…というよりは、とある件で必要になってしまったため、急遽作成って感じだ!!

 

pocketgriffon.hatenablog.com

仕様検討もせず急いで作ってしまったからか、使い始めてみると色んなところに不満を感じるようになった!

 

 拡大表示は必要なかった!

 右側のアスキー文字は見る機会がない

 画面に並べた時、小さいウィンドウの方が扱いやすい

 OCRでの取り込みがツールの外でしか出来ない

 ページの関係でダンプが2〜3つに分断してる事がある

 

これら以外にもプログラムの内部構造が良くなかったりなど、不満を上げたらキリがない!

こんなたくさんの改良をするのならば、いっそ作り直そう!となった(^^)

 

そして新規に開発したのが↓コチラ↓

見た目はそんな変わんないじゃん!と言われそうだけど、まさにそう(^^;

でも内部構造は大〜きく変わった(^-^)

描画に対する処理負荷もかなり改善された!

 

まず大きさだけど、こんな感じの違いがある!

ダンプリストの編集を見つつ、撮影したダンプリストの写真を同一画面で見ていたりすると、そのたびに大きな編集ウィンドウが邪魔になっていた。

アスキー文字は思ったよりも見てなかったので、思いきって削った(^^)

 

OCRはYao Tadahito(八尾 唯仁)さん(@eighttails)のHEXモデルを使ったら、精度が爆上がりする事がわかった!

 

このおかげもあり、この先は手入力よりもOCRが中心となるであろう未来が見えたので、拡大文字自体が必要なくなってしまった!

前回の目玉機能だったのにww

 

まずは素の状態で起動するとこんな感じの画面が出る。

前作にあったEmacsバインドのカーソル移動はそのまま継承している。

テンキーには対応して無く(ウチのMacBookProにはテンキーがそもそもない…)、あくまでもフルキーでのみ入力が可能だ。

 

一番下の「読んでいるファイル」の表記は、撮影用に名前消し機能をつけた!

私の名前限定だ!ww

 

↑ESCキーを押すとメニューが表示される。

1980年代のメニューっぽく見えるが、完全に作者の趣味だねw(^o^)

実はMacのメニューバーにメニューを追加する方法を知らないのですわ…orz

SDLで(ソースレベルで良いので)Mac/Linux/Windowsの互換性を保ちつつ、どうやったら出来るんだろ??(-_-;

 

大した意味もなくAbout画面も用意した!

こういうのにも凝りまくってテンションあげていくぜーw (^^;;

 

メニューからOCRを選ぶと、こんな画面が出る。

このためだけにファイラー作った!(^-^;;

それっぽいファイラーを作るのって1992年以来なので30年以上ぶりだ!

当時はX68000で作ったなぁ…(遠い目

 

そしてカーソルを動かしていくと、右側に画像を表示する機能をいれた。

これはOCRするたびに「あれ??次はどの画像ファイルだっけ?」と中身を覗いていた苦い経験からだ(TT)

主にアドレスが確認出来れば良いので、画像の左上しか表示させていない(^^)

 

↓リターンを押せばOCRが実行されて……(画面上部にメッセージ)

 

↓終わるとこんな感じに、認識した文字列がずらずらーっと表示される。

実際のOCR処理は、

OCRで認識されやすいように画像加工

・tesseract実行

・出力されたテキストデータをもう1段階加工

などをしてデータを整頓している。

一応、tesseract以外でも認識率があがる努力はしているつもり(^^)

 

アドレスで入力状態になっているのは「OCRで認識したアドレスはコレだけど、ホントにあってる?間違ってたら修正して」という意図だ。

 

いったんデータをメモリに書いてしまうと取り消す事が難しいため、ここで使用者のチカラをアテにして、確実にアドレスを確定させる。

 

メニューを終えて戻ると、さっきOCRで読み込んだデータが見える…という感じだ。

ちなみにこの画像だと認識率100%!

100%ってすごくない???(@_@;;;

 

データとチェックサムが違っていると、こんな感じに赤文字でどこが変か教えてくれる。

この場合、データもそうだけどチェックサム自体が間違ってる可能性もある。

 

そこで使うのがメニューにあるCheckSumモード。

ここで正しいチェックサムを入力する。

そうするとデータがおかしいのか、チェックサムがおかしいのかがわかる…という事だ(^^)

 

あとダンプリストの掲載で良く見かけるのが、ページをまたいだブロック!

今までは複数ページにまたいでる部分は、素直に手入力をしていた。

そんな数が多いわけじゃないからいいでしょ…と(^^;;

でもコレも可能ならばOCRで読み込んじゃいたい!

そこで、今回はこのページに跨いだデータもOCR出来る機能を入れてみた!

 

↑こんな感じに切り取った写真データを用意する。
縦横の幅は特に意識しなくても良い(ツール側でよしなに合わせてくれる)

 

↑ファイルの上でスペースを押すと、そのファイルが選択される。

選択された画像を合成することで、一気にOCR処理をしようって魂胆だ(^^)

ファイルの頭に番号がついているのは、どの順番で画像を合成するのかの指定。

この辺りの実装のダサさも良い感じだw

 

ぐは!

合成したデータであっても認識率100%が出た!(^o^)

 

おわりに

手入力が好きなんだぜ!

……と言い張って開発したダンプリスト入力ツールだったけど、気がつけばOCRに便利なツールが出来上がってしまったw

 

実際に使ってみると…これだけダンプの認識率が高いと、すごく手軽に入力が出来る。

写真さえ撮ってしまえば、あとはほぼ単純作業だ!

むしろ写真を撮って加工する方が圧倒的に時間がかかる!(^-^)

 

横8バイト並びのダンプなどにはまだ対応していないが、プログラムのいたる所に布石だけは残してあるので、対応する事自体はそんなに難しくない…と思われる!(^^)

 

よーし!今まで入力を控えてたゲームも入力してみるぞ!(^^)

…はて、入力したデータって、どうやってエミュレータに入れ込むんだっけ?(^-^;;

 

ではまた次回!(^-^)ノ

 

MacでMSXのプログラムを作る!

2023年3月12日に秋葉原UDXにて行われた、MSX DEVCON3に参加した。

その時、会場にM5Stack Core2を持参すれば、今現在のMSX0を書き込んで送り返してくれるということだったので、私もお願いする事とした。

 

よくよく考えてみると、MSXでキチンとプログラムを作ったのは1990年が最後。

それ以降、3年くらい前にFS-A1ST(TurboR)が出土するまでの間、触ったことがなかった。

 

思えばMSXで初めてアセンブラというモノを使った(それまではハンドアセンブル)。

自分にはマシン語プログラムで256バイト以上のものは作れないだろうと思い込んでいたが、アセンブラを使用する事でこんな簡単になるんだ!と驚いた覚えがある(^^)

 

当時入っていた大阪のマイコンクラブで行われていたプログラムコンテストに参加するために奮闘したのをきっかけに、Z80アセンブラがスラスラ書けるようになった。

 

その後、なにかのきっかけがあり、マイコンBASICマガジン1982年11月号に掲載されていたPC-8001用のCOSMO MISSILEというゲームを、目コピーでMSXへ移植した。

オールマシン語のプログラムもこれが初めてだった!(^^)

↑今でもソースファイルは手元に残っている。

アセンブラソースファイルで57KBにもなった(コメントが多い)。

当時は中二病のようなペンネームを使っていたので、自己保身のために隠したww

 

MSXでCコンパイラ

今の時代にアセンブラZ80をバリバリ書くのも楽しいけれど、もう良いお年頃でもあるので、速度を要さない部分などはできるだけ手軽に書きたいのがホンネだ(^^;;

 

そこで、今使えるZ80のCコンパイラを探してみる事。

 

まず有名なのはMSX-C

今回のMSX 0 M5Stackにも入れると西和彦さんが表明してくださっている。

せっかくあるツールならば使わない手はないだろう(^-^)

ちなみに製品版の場合、MSX-Cを使うためにはMSX-DOS2 TOOLSが必要で、さらに日本語MSX-DOS2も必要になり、当時だいぶ泣いた(T-T)

MSX-Cを活用する場合には、実機(MSX0 M5Stack)上で動かす必要がある。現在の開発環境としてはどうだろうか…。

 

ちなみにMSX-CはZ80のコードを出力するんだろうか?それとも8080コード限定なんだろうか…。使っていた当時、あんまり気にした事が無かったけれども…汗

 

 

次に思い浮かんだのはSDCC

sdcc.sourceforge.net

SDCCは、2008年頃に某書籍を執筆しようとしている時に利用していた。

結局、書籍自体が頓挫してしまったため世には出なかったけれど…汗

 

そして2020年、HC-40のプログラムをするためにも活用した。

pocketgriffon.hatenablog.com

2008年頃に使用したSDCCとはオプションの表記が変わっていて、全部調べ直す事となった。コレは想像よりもだいーぶ苦労したよ…orz

 

今であればSDCCを利用するのがオススメだと思う。

WindowsでもMacでもLinuxでも使用できるメリットは計り知れない(^-^)

 

 

そして私が大好きなLSIC-80

これは商用コンパイラなんだけど、長年(少なくとも20年以上!)使っている。

そのおかげで初期のセッティングに慣れている事や、コンパイラが出力するコードを理解しているため、人間最適化がしやすかったりして、個人的に気に入っている。

 

ただ、問題があるとすれば(私が所有しているパッケージでは)Windows環境でしか動かない事だ…。MS-DOS環境ではなくてWindows環境だ。これはMacユーザーには敷居が高い。

 

だけど!

今回はWineを利用する事で、M1 Mac上でWindowsアプリを動かす事が出来た!

思ったよりも快適に使えているので、備忘録を含めて残しておこうと思ったのだ!

この記事は誰得?!(^^;;

 

M1 MacWineを使う

今回やりたい事は、M1 Mac上でIntelコードで書かれたWindowsアプリを動かしたいだ。

異なるアーキテクチャのものを動かすので、結構厄介かも知れない…(^^;;

 

zenn.dev

M1 MacにWineをインストールする方法は、上の記事を参考にさせていただいた!

有益な情報を残してくださった筆者様には感謝しまくりだ!(^-^)

 

インストールしたWineでLSIC-80が動くか試してみる。

よしよし、なんとなく動きそうな予感だ!

実際にコンパイルしてみよう。

あら??cppがないと怒られた。

 

実はlcc80.exeはコンパイラドライバであり、内部でプリプロセッサやパーサーなどを順次呼び出すようになっている。

そのため、実行パスを通しておかないとコマンドを見つけられないようだ。

 

Wineプログラムへパスを渡すためにはWINEPATHという環境変数を設定するらしい。

ここでハタと困った…。

WINEPATHへ渡すのは、Macから見た絶対パス?それともWineから見たパス??

どちらも試してみたところ、どうやらWineから見たパスを渡すようだ。

 

Wineから見たCドライブは、~/.wine/dosdrives/c:/ となる(実態はdrive_c)。

そこにLSIC-80本体を入れつつパスを通す。

 export WINEPATH=C:/lsic80/bin; wine lcc80.exe hello.c

 

これらの情報を暗記したままにするのは無理なので、急いでMakefileを書いていく!(^-^;

 

プログラムを作る

さて……MSXのプログラムを作るのは、以前turboRを発掘して以来だ!

出てきたturboRはFDDが空回りする現象が出ていた。修理してみようと頑張ったけれど、当時の私の修理技術ではまともに直す事が出来なかった…orz

仕方ないので、SDカードが刺さるカートリッジというのを手に入れた!(^o^)

そこにFlashAirというWiFi付きのSDカードを差し込んで、最新の開発環境を満喫した!

 

「FiashAir MSX」で検索したら、当時のツイートが出てきた(^^;;

 

出来上がったCOMファイルを、単純にファイルコピーしてMSX側で実行する事が出来たので、本当に便利だった!

 

この本を参考にしながらFlashAirのセッティングをしていた。
FlashAir側にこんな設定が出来るなんて知らなかった!この本に出会わなかったら、便利な環境は作れなかっただろう!(^-^)

 

今、このカートリッジは親しい友人に貸してしまっているため手元にはない。

そんな状況でどうやってMSXの開発をするか…。

というわけで、今回はエミュレータ(fMSX)を使うことにした!(^^)

 

作ったプログラムをディスクイメージに固めてMSX側でコマンド名を入力して実行して…という過程を想像していたら、ちょっとコレは面倒カモ??と思ってしまった。

ROMカートリッジのヘッダを付けるなりして、なんとか自動起動が出来ないだろうか…。

久しぶりにテクニカルハンドブックを引っ張り出す!

この本には本当にお世話になった!(^-^)

使いすぎてボロボロになってしまっているけれど、まだまだお世話になりそうだ!

 

これを見る限り、ROMヘッダを偽装(偽装?!)するのは簡単そうだ!

 

…あれ?
アセンブラってこれだけで済んじゃう??(^-^;;
あ、アセンブラ自体はLSIC-80付属のrz80.exeを利用している!
 

ちなみにスタック領域については、テクニカルハンドブックに載っていたワークメモリマップを見て、F380h以前ならば大丈夫なのかも…と思って設定している。
もっと適切な場所があるようならば助言いただけると助かります!(^^;;
 

C言語で書いたプログラムはこんな感じ。
 
MSXのブートシーケンスはちゃんと理解していないけれど、カートリッジプログラムに制御が渡ったタイミングでBIOSは使えるらしい。
_chputや_initxtはBIOSコールを呼び出すdefineマクロで、定義自体は自分で書いている。
 
コードは4000h、ワークエリアはC000hのアドレスに生成されるよう、リンカのオプションを設定してコンパイル!これで無事に似非ROMカートリッジが出来上がる(^-^)
 
fMSXを起動する時のオプションとして、出来上がったバイナリを指定してやれば、起動した瞬間にプログラムを実行する事が出来る!

最初から最後までタッチパッドを触ること無く作業が進む環境に大満足だ!(^-^)

 

おわりに

今回はLSIC-80を動かすという、おそらく日本でやろうとする人はいないであろう事を題材としたけれど、Windowsでしか動かないソフトをMacで動かす良い例になるだろう(^^)
 
これまでWindowsでしか使えないソフトがあるたびに悲しい思いをしてきた。我慢しきれなくなって、開発環境をWindowsへ移行するか…と決意し、2022年12月にWindowsマシンを購入した。
 
でも私は長年Macを使い続けてきたせいで、もはや指がMacのショートカットを覚えきってしまっている状態。些細な違いでもイラっとしてしまい、Windows環境が合わず2ヶ月もしないうちにMacに戻ってきた(T-T)
 
そのWindows環境でしか動かないというツールの代表格がLSIC-80だったのだ。
しかしこれがM1 Macでも問題なく動く事が分かった今、Windowsを使う必要性が全く無くなってしまった!(^^;;;
 
MSX0 M5StackはIoTの活用に振ったものだとは理解しているけれど、ネットワークはまだしもGroveに接続される機器は得意とは言えない(T-T)
せめてソフトウェア側で頑張るよー!(^-^;;
 
ではまた次回!(^-^)ノ

ダンプリストをOCR!

今も細々と開発中のダンプリスト入力ツール!

pocketgriffon.hatenablog.comダンプリストも、基本的には手入力が好きな私。

OCRで文字認識をさせてみても、その間違いを探してどうせ256バイト全部見るくらいだったら、最初から手で打ち込んだ方が早いじゃん…と思ってしまってる。

 

2017年に一度だけOCRに挑戦してみたが、この時は4%くらいの間違いで済んでいた。このくらいの間違い率だったら使ってみても良いかな…と思っていたが、この当時使っていたタブレットのカメラが高性能だったのか、iPhoneに変えてからはだいぶ間違いが多い。

 

あの時は既存のツールを使うだけの方法だったけど、今回は認識率を上げるために自分で努力してみる事にした!

 

どんなツールがある?

今までOCRのツールに何があるのかなんて気にした事もなかった…。

真っ先に出てきたのが、Google DriveによるOCRだった。

へー、知らんかった!そんな機能あるのね(^^)

これでそれなりの文字列に変換されたら、もうコレでいーんじゃね?(^-^)

……うーん、想像してたのとだいーぶ違う(T-T)

順番とか揃えたらそれっぽく出てるんだろうか??
並べ直してみようと思ったが、この並び替えを毎回手作業でやるの?と思ったら気が萎えてしまった(^^;

ほかを探す流れに……。

 

OCRで検索するとPythonがやたら出てくる。機械学習とか出てくるけれど、正直良くわかってない(^^;; とりあえず文字へ変換できればいいんだけど…くらいのイメージで探す。

 

OCRの作業自体はMacで行うので、Macで動くツールが良い。

そうして探していると、どうやらtesseractというツールがあるらしい。

この名前も初めて聞く(^^;;

よし、当面はtesseractを使ってOCRにチャレンジしてみるよ!

 

まずは試す!

この手の事は、過去の歴史がたくさんあるだろうから調べていくと正解?に近いものは出てくるだろうけれど、それだと仕組みやらなにやらを理解しないまま終わってしまいそう。

無駄とは思いつつも、自分なりの方法で試してみる(^-^)

 

まずは元となるダンプリストの写真を用意する。

なんとなく白黒がはっきりした方が文字として認識しやすいんだろうな…という勝手な解釈により、ある閾値で白黒を分けるプログラムを組んでみる。

この辺りは、過去にjpegを扱うプログラムを何度も組んでいたため、簡単に作れた。

自分jpegライブラリがあると便利だよ!(^^)

tesseract -l eng --psm 6 -c tessedit_char_whitelist="0123456789ABCDEFSumd:+O " out.jpg out

 

コマンドラインはこんな感じで設定している。

画像に含まれている文字は英語のみ(-l eng)、横書きの文字(--psm 6)、この画像に含まれている文字の種類(tessedit_char_whitelist)という感じだ。

 

ホワイトリストの最後にアルファベットのO(オー)が入っているのは、ダンプリストによっては数字の0(ゼロ)が飾り付きと無しの場合があるから。O(オー)としてご認識されたものを、あとのツールで0(ゼロ)に変換しようという魂胆だ!(^^)

 

tesseractのフォントをPC-9801に!

 

理屈で言えば文字自体が似ていれば、さらに認識率が上がるはずだ!

じゃあ…という事で、tesseractにPC-9801フォントを学習させてみる事にした。

ネットでいろんな情報を探してみたところ、分かりやすい例を見つけられた!

danglingfarpointer.hatenablog.com

↑ここに書かれている手順で、tessaractに学習させてみる。…学習というよりは、文字認識用のデータを用意するイメージかも知れない。

 

-l eng としていたところは jpn などの指定も出来るのだが、このオプションで文字学習データセットを用意するイメージだ。

私はdumpリスト専用という意味で、dmpというフォントセットを用意した。

PC-9801用のフォントがちゃんとBOX判定されているのが分かる(^^)

しかし結果は散々で、0(ゼロ)がすべて9に認識されてしまった(T-T)
うーん…これは結構厳しいぞ!

 

仕方ないので、PC-9801のフォントを改造して、ダンプリストに寄せたフォントを作った!

お、これでだいぶ認識率が上がった気がする!

 

1文字ずつ認識してみる

tesseractのモード(psm)に「この画像には1文字だけ含まれている」という指定がある。複数の文字じゃなくて1文字だけだからねーとあらかじめ教える事で、認識率をあげようって事だと思う。これを使ったらもっともっと正解率が上がるんじゃね??

 

今まで一度も使ったことのないOpenCV(+Python)を利用して、画像の抽出に挑戦だ!

…と気合を入れてみたけれど、世の中にチャレンジされていた方が多かったので、基本部分を参照にさせてもらってサクっと作ってみた!

むしろPythonが久しぶりすぎて大変だった(^^;;

おおおお……めちゃくちゃ正確に分別できてる!

これを各エリアごとにtesseractに送り込めば良いわけだな……(^^)

それにしても、PythonOpenCVを利用したプログラムが簡単に書けるのは便利だ!!

さて、1文字ずつ抜き出して処理するんだけども……どんな順番で出てくるの?(@_@;

左から、通し番号、X座標、Y座標、横幅、縦長、認識した文字。

データの並びを見てみると、どうやら右下から左側へ向けて処理が走ってるっぽい。

Python側で処理順番を逆にすればいいのかな…と思ったけど、どうもそこまで簡単な話ではなさそうな雰囲気。

出力された座標情報に基づいて、左上から出力するツールをサクッと作成。

あれ……???認識率落ちた??(T-T)

 

この後、フォントを変更したりサイズを変えてみたりするけれども、認識率が上がらない。

フォントを変更すると確実に認識する文字が変わるので効果はあるっぽいけれども、それでもどどーんと上がりませぬ…。うむむ…。

 

機械学習とかしていけばもしかしたら??とは思うけれども…(^^;;;

 

あと同じ工学社の雑誌でもダンプリストのフォントが大幅に違っていたりして、その都度調整をしていかないと認識率が上がっていかない事も分かってきた。

奥が深いぞ、OCR!!(T-T)

 

おわりに

とりあえず現状ではこんな感じ!

ブログにまとめておかないとあっという間に忘れそうだったので急いで書いてみた!

書いてみたけど参考になる事は無かったかも…汗

 

もっと良い方法が分かったら再チャレンジ案件ですな、これは!(^^)

ではまた次回!(^-^)ノ