M5Stackでプログラム その4

M5Stack Core2で動かすエミュレータ第3弾!

みんな大好きPC-8001エミュレータを動かしてみたよ(^-^)

前半はガチガチの技術ブログになってしまった…汗

 

f:id:PocketGriffon:20210909085728j:plain

 

なんとなく集大成

これまでPC-8801(アルフォス専用)、FM-7エミュレータを移植し続けてきたけれども、今回のPC-8001はM5Stackでのプログラム集大成なイメージで作り上げた。

M5Stackでどのようにプログラムをしたら効率の良いものが作れるのかを模索した前の2機種だったけれど、そこでまとまったアイディアがPC-8001で全部入った感じ(^^)

 

使ったことがないCPU、何種類もあるメモリ、何をすると遅くなるのかがさっぱり分からないハードでプログラムをする場合、気にしないといけないポイントを見極めるのが難しい。

 

以下、自分なりのM5Stackでプログラムを作る上で気にしたいポイント!

 

・速度を要する処理のメモリをどこに割り当てるか

M5Stack(私はCore2ユーザー)はメモリがたくさん載っている。容量が大きいのはとても助かるのだが、何種類ものタイプが違うメモリが存在するのだ。

 

プログラムの処理負荷と、必要とするメモリサイズを意識して、どこの領域からメモリを確保するのかを決めていきたい。効果もはっきり出るので、ここはじっくりと見極めが必要。

 

以下、独自に調べた結果だけど、結果が信じがたい数字になってしまっているため、半信半疑、目安程度に見ておいて欲しい。

 

32KBのメモリを2つ確保し、32bitアクセスで「メモリクリア」「値を加工しつつメモリコピー」「単純にメモリコピー」の処理を1000回繰り返した時の速度比。

  時間 速度比
グローバル変数 36,133 1.000
MALLOC_CAP_EXEC 306,030 8.470
MALLOC_CAP_32BIT 195,998 5.424
MALLOC_CAP_8BIT 110,036 3.045
MALLOC_CAP_DMA 110,036 3.045
MALLOC_CAP_SPIRAM 2,476,450 68.537
MALLOC_CAP_INTERNAL 195,998 5.424
MALLOC_CAP_DEFAULT 2,471,492   68.400

この結果を見る限り、グローバル領域のアクセス速度が一番速い。

なかなかC++を利用していてグローバル領域を使う…という事がピンと来ないかも知れないが、ここは単純に性能と比較したら良いと思う(^-^)

 

グローバル変数のアクセス速度を1とした場合、SPIRAMは68倍以上も遅いという結果が出てしまった…。これホントかな…(-_-;; ちょっと信じがたい。これを信じる限り、SPIRAMは速度を要さないけれども大きさが欲しい部分でのみ利用するのが良さそうだ。

 

あと32BITと8BITで、32BITの方が遅いという結果も「?」だ。32BITの方はおそらくだけど、32bitアライメントが保証されたメモリで、32bit単位にアクセスしてもエラーが出ませんよって意味だと思う。単純にその違いなだけだと思うのだが…汗

 

このテストはESP32(M5StackのCPU)にとって最悪な環境だ。キャッシュメモリが32KBのESP32に対してバッファサイズを32KBx2にしているので、キャッシュミスを頻繁に起こすための悪意がある。実際のプログラムではキャッシュが有効に働くであろうから、こんな極端な例は滅多に起こらない。あくまでも最悪のケースとして見てもらうのが良い。

 

あと、グローバル変数はあまり大きく取れないので注意。

空のスケッチ状態であれば約103KBほど確保出来るようだ。

 

PC-8001のプロジェクトではメインメモリ(64KB)をグローバル変数にしちゃえ!と思っていたが、後半足りなくなって仕方なくINTERNALから確保した。

SDカードからの一時読み込みバッファなどはDEFAULTを使っている。

 

・画面表示はLovyanGFXにおまかせ

もう私の中ではLovyanGFX一択!!まじめに速いです!(^-^)

最初、自分で似たようなライブラリを作ろうと考えていた事があったけれど、LovyanGFXを知ってからはそんな気持ちが吹き飛んでしまった(^^;

 

 sprite.getBuffer()でバッファのアドレスを得て、その中身をプログラムで書き換える。

その後、sprite.pushSprite(...)で一気に書き込むのがお気に入り。

おそらく内部でDMA転送していると思われるので、複数のspriteを用意して、転送中のバッファを壊さないようにしている。

 

FM-7では320x1のスプライトを4つ、PC-8001では320x8 or 10のスプライトを3つ用意して使い回している。DMA転送よりも画像生成のプログラムが遅いのでこの数で十分だ(^^)

 

・その他もろもろ

他にも細かい事を書いていたが、さすがに細かすぎるか…と思い、全部消してしまった(^^;

書いていたのは

キャッシュメモリの有効活用

・Write-back-cacheはあるんだろうか?

・パイプラインを乱さないために

・乗算、除算、SHIFTしてOR

……などなど、プログラム大好きな人が見たら楽しそうな事柄だったけど、さすがにマニアック過ぎると思った。

 

gccで使える__builtin_prefetchなども使ってみたが、出力されたアセンブラファイルを見る限り、それっぽいコードは出力されていないようだった。

likely / unlikelyはもう身体の一部になってるので普通に指定してた(^^)

 

M5Stackが楽しくて難しいハードなので、私自身もプログラマとしての経験を最大限に生かすような感じでプログラムに取り組めている。良いマシンだよ、M5Stack!(^-^)

 

PC-8001移植の話

f:id:PocketGriffon:20210909132800j:plain

PC-8001は、何度となくエミュレータを作ってるマシンだ。

私はいろんな事情によりソースコードを公開しない(出来ない)人なので、自身で楽しむためだけに作っている。他の方が開発されたエミュレータを使う事も無い。

 

今回利用したのはLinux用に開発していたPC-8001エミュレータZ80部分は自作のCP/M80エミュレータで利用していたものと同じで、PC-8801アルフォスでも使われている。

M5Stackでアーカイブを利用する方法が分からなかったため、そのままソースコードをスケッチに追加してしまった(^^;; 他のみなさんはどうしてるの???

 

メモリ確保、フレームバッファの生成部分、キーボード入力部分のみを変更しただけで動いてしまった。もうM5Stackで何度と無くプログラムを書いているので、悩むところが少ない。

 

デバッグ中に知りたい情報はLcdに表示するか、またはSerialに出力すれば簡単に見られる。かつキーボードが繋がった事で、好きなタイミングで出力する事が出来るようになった。

プログラムを作る環境としては最強に近いんじゃないだろーか??

f:id:PocketGriffon:20210909133023j:plain

他のエミュレータとの比較

PC-8801ではメモリ容量が大きい(&プログラムの工夫が足りない)事で、DEFAULT(つまり68倍遅いメモリ!)に主要なデータを入れてあった。これによりCPUコアの実行速度が出なかったんだと思う。

 

FM-7では2つあるCPUのメモリ空間はINTERNALから確保出来たが、そもそもCPUを2つ駆動しなくてはならないという現実がつきまとう。せっかくの高速メモリが使えても帳消しになってしまった格好だ。逆にINTERNALが使えなかったら、FM-7 on M5Stackは実現しなかった可能性もある。

 

ちなみにFM-7では2つのCPUの駆動タイミングによって、FM-7全体の速度が大きく変わってくる。これはお互いのCPUが「互いに止めあって」協調動作するからだ。この辺りは実装ノウハウありそう(^^;

 

そんな実験を経て、PC-8001ではメインメモリをINTERNALから確保、必要なバッファはグローバル領域に置き、描画にはLovyanGFXで高速化!おかげで初めて処理時間が余った!

このエミュレータは1/20秒を基準として動作している。1回の処理50msに対して、平均して28〜30msは遊んでいる(^^;; すごいぞ、M5Stack!!

 

画面に関しても書き換わった部分のみを再描画しているPC-8801FM-7に比べ、PC-8001では何も考えずに全面書き換えが出来てしまった。作業に必要なワークをグローバル領域に置き、面倒なパレット変換などの処理が入らないPC-8001ならではかも知れない。

f:id:PocketGriffon:20210909133056j:plain

エミュレータシリーズ完結!

ここまで3つのエミュレータを、実に1日単位で作るという荒業をご披露したw

こんなの、元のエミュレータがあったからこそ出来たワザだ(^^;

手元にはまだMZ-80、MZ-80B、PC-1350などのエミュレータが残ってるが、カラーも出ないのでもういいかなって思ってる。

 

もう少しM5Stackは使っていこうと思うけれど、こんなハイペースでは作らないよ!

おじさんの寿命が縮まっちゃうw

これからはじっくりと構えてプログラミングしていきます。

 

さて、次は何をやろうかね(^^)

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

M5Stackでプログラム その3

M5Stack Core2で動かすエミュレータ第2弾!

多分、M5Stackの使い方としては微妙なんだと分かりつつも暴走し続けるw

 

f:id:PocketGriffon:20210908011435j:plain

今回は富士通FM-7

FM-7の特徴といえば、究極の8ビットCPU(と言われる)6809が2つ載ってるって事!

贅沢にもメイン側とサブ側で同じCPUが使われている。

 

何年か前にLinux上で動くFM-7エミュレータを作っていた。「6809もわかるんですね」と言われそうだけど、ホンネは68の方が慣れている。6301などに抵抗なく入っていけるのもそのおかげかも知れない(^^)

今回はコレをベースに移植をしようと思っている。

 

FM-7をM5Stackに移植しようと思った時に、6809が2つもあるFM-7が、ちゃんとそれなりの速度で動くんだろうか…という心配があった。PC-8801のアルフォスだって結構苦労していたのに、単純にそれの2倍だ…。ちょっと簡単じゃないだろうという予想があった。

 

しかし今回は試してみたい事が1つあったのだ!それは…「主要なメモリをPSRAMではなく、内蔵(INTERNAL)メモリに載せていたらどうなるのか」という事だ。

 

PC-8801を移植した際には、M5Stackの事もさっぱり分かっていなかったので、使用するメモリについては無頓着に考えていた。確保できればいいや的な発想?(^^;;

プログラムを作るごとに新しい事に挑戦出来るM5Stackすごいぞ!(^^)

 

まずは単純移植

元々ANSI準拠で書かれているプログラムをM5Stackに持ってくるのはとても簡単だ。しかもLinux用に書かれているプログラムなのでクセも少ない。

新しいスケッチにファイルをコピーしただけで、無変更で動いてしまった(^-^;;

 

M5Stackに依存しているところと言えば、メモリを確保するところくらい。

ここも単純にmallocで確保するだけならば無変更でいける。M5Stackは「どの領域からメモリを確保するか」が柔軟に指定できるため、ここは見極めが必要なところだ。

 

FM-7は画像データ(VRAM)がサブCPU側のメモリに入っている。動かすのがゲームの場合、このVRAMを激しく書き換えるはずなので、今回はサブCPU側のメモリ64KBを内蔵RAMに、メインCPU側のRAMを外部RAMに割り当ててみた。

 

そして試行錯誤の結果、F-BASICが起動するようになった!

f:id:PocketGriffon:20210908082226j:plain

FM-7はサブCPU側の$C000以降にスクリーンバッファがある。ここを確認すれば、BASICで表示しようとしている文字がわかるという仕組みだ。

例のごとく、まずは画面に出す前にシリアル上でメモリ内容を確認。

よし、ここまで動けば画面に表示させてみるぞ!(^-^)

 

FM-7の豪華な画面仕様

M5Stackでプログラムをする際、なるべく画面更新する範囲を狭めるのがテクニックとして有効だという事は、PC-8801エミュレータの時に学んだ。

だがしかし、FM-7ではそうもいかない事情がいくつかあるのだ!

 

まずひとつめがカラーパレット機能。

例えば、0番のカラーは標準では黒なのだけれども、これを青にする設定が出来る。そうすると画面では一瞬のうちに黒色が青に変化するのだ!いちいちVRAMを書き換えていかなくても瞬時に色が変わるんだから凄い機能だ!

 

このパレット機能を使われると、無条件に画面全体を再描画しなければならない。画面上に黒色がどこにあるのかなんてわからないため、全体を書き換えざるを得ない(T-T) しかもFM-7はカラーパレットが使えるというのをウリにしてた部分もあるため、いろんなプログラムで使われまくってる。そのため、常時パレットレジスタを監視して、書き換えがあった際には画面全体を再描画するようにしている。

 

あれ?でもカラーパレット機能はPC-8801にもありますよね?と聞かれれば「そうです」だ。たが先日作ったPC-8801エミュレータはアルフォス専用と銘打っていたので、ちょっと事情が違う。アルフォスではゲームが始まる時にパレットを設定すると、それ以降は変更されていないため、監視する必要がなかったのだ(ネタばらしだw

 

ふたつめがマルチページ設定。

3枚あるVRAMのうち、どのプレーンを表示して、どのプレーンを書き込み許可するのかというビット。

これもレジスタを書き換えられると画面全体に影響を及ぼすタイプのモノだ。

しかもそれなりの頻度に使われている(T-T)

エミュレータ上では「プレーンを表示しない」というよりは「表示時になかったことにする」ような感じでプログラムを入れてある。表示しなくても処理が軽くなったりはしない(^^;

 

ちなみにPC-8801にも設定はあるけれども、アルフォス専用(以下略

 

みっつめがVRAMオフセットレジスタと言われるモノ。

スクロールするゲームなどで頻度高く使われるもので、ハード的に画面をスクロールさせる機能だ。BASICでも普通に使われていて、LISTなどをして画面がスクロールしたりすると利用されている。

 

FM-7は標準状態でファンクションキーの表示がされない。PC80系から来た人がちょっと面食らう設定だと思うが、CONSOLE命令で表示させることは出来る。

出来るけれど、ファンクションキーを表示させた状態だとスクロールがものすごく遅くなる。これはファンクションキーを表示させる事で、画面全体をスクロールさせる事が出来なくなり、ハードウェアに頼る事が出来なくなるからだ。

 

……という感じに、画面をスクロールさせるための機能なのか…とだけ解釈されている。

実際に値を変えてみるとスクロールするので、機能としては正しいんだけど、もうひとつ大きな機能があるのだ。

それは…「VRAMをアクセスした時のアドレスにオフセットを加える」というもの。

おそらくレジスタ名の由来はこっちの機能だ。

 

普通、アドレス$0000に$FFを書き込むと、当たり前だけど$0000に$FFが入る。

これを、例えばVRAMオフセットレジスタに$1000を書き込んだ状態で同じことをすると、$0000には値が入らずに、$1000に$FFが入る。

え??じゃあ読み出しはどうなるの??となるが、プログラムで$0000をアクセスすると$1000がアクセスされた事になり、$FFが返ってくる。

……意味が通じるだろうか?(^^;;;

 

しかもこの設定はVRAM($0000〜$BFFF)のみに有効なのだ。この範囲を超えた場所をアクセスすると、通常通りのアドレスに読み書きされる。

こういう状態で作られたVRAMの情報を、表示する時に考慮しながら画面を作る必要があるのだ!本エミュレータでは垂直同期などを考慮せずに画面再描画を行っているため、どうしても画面の上下でチラチラしたものが見えてしまう事がある。もうこれは割り切るしかないか…と諦めた(^^;;

 

…というような複雑な事情がてんこ盛りで、画面描画を速く出来る要素が少ないのだ。

思うところはたくさんあるけれども、まずは表示させてみよう!考えるのはその後!

f:id:PocketGriffon:20210908092421j:plain

…あれ?文字が黄色くなっちゃうぞ??(T-T)

パレットの辺りとかバグが入りやすくて難しいコードが続く…うーん…

f:id:PocketGriffon:20210908092615j:plain

修正してちゃんと白が表示された!(^-^)

FM-7は起動時の解像度が40x25なので文字もキレイに読める。

ちなみに「load」はキーボードから打ち込んでるのではなく、プログラムでキー情報を発生させている。実際のテープも読んでなく、SDカードから読み込ませているのは、PC-8801と同じ仕組みを利用している。

 

f:id:PocketGriffon:20210908093038j:plainf:id:PocketGriffon:20210908093059j:plain

f:id:PocketGriffon:20210908093116j:plainf:id:PocketGriffon:20210908093140j:plain

f:id:PocketGriffon:20210908093206j:plainf:id:PocketGriffon:20210908011435j:plain

PC-8801アルフォスを作った時には「640ドットを320ドットに間引きしてどんな画面になっちゃうんだろ…」と心配していたが、もうあんまり気にならなくなってきたw

80桁の文字を読もうとするのは厳しいけれども、なんとなく雰囲気が味わえるだけでもいいのでは…と自己解釈(^^;;

 

f:id:PocketGriffon:20210908093531j:plainf:id:PocketGriffon:20210908093555j:plain

昔、工学社のI/Oに載っていたゲームも打ち込んでみたデータがあったので動かしてみた。

ギャラクシアンは80桁で文字表示をしているのでちょっと厳しいかもだけど、雰囲気よ、雰囲気(^-^)

 

感覚的な速度

ちゃんとした速度を計測していないので、感覚値でごめんなさい(^^;

一度、動画をTwitterに載せた後、2つの改良を施した。

・メインCPU側のメモリ空間も内蔵RAMに載せた

コンパイラの最適化オプション付け忘れてた!

どちらもそれなりの効果があったようで、大体2割くらい高速化された!

おかげで見た感じの動き(速度)は実機と大差なくなったよ!(^-^)

 

今回もCPUのエミュレーションで1コア、画像生成で1コアを使う構成とした。

6809CPUを2つエミュレーションする必要があったが、思ったよりも遅くなってない。

これは6809コアをカリッカリにチューニングしてあったおかげかも。ソースを見てみると、__builtin_prefetch、likely/unlikelyなどがふんだんに使われていて、当時かなり頑張って高速化していたようだ(^^;

 

画面表示に関しては、前回のPC-8801同様にLovyanGFXを利用している。

このライブラリ、めちゃくちゃ使いやすくて良いです!(^-^)

 

ちなみにインターレース表示なども試してみたけれども、うまくいかなかった。

上下のドットで色を補間やらないと、必要なドットが削れてしまうのが原因だけど、補間する処理時間が無いからインターレースなのに…という事でボツになった(^^;;

 

ピンポーン!

 

f:id:PocketGriffon:20210908094145j:plain

……このタイミングで届きますか、あなたは……(-_-;;

悩ましいじゃんかよー…

 

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

M5Stackでプログラム その2

f:id:PocketGriffon:20210906232122j:plain

M5Stack Core2で動くPC-8801アルフォス、高速化してみたよ!

前回ほどのインパクトは無いけれども、自己満足の一環として見てほしいw

今回は写真少なめ、文章多めですw

 

高速化するべきところを見極める

先日の動画を見ていただいた方はおわかりかと思うけれど、ゲームデモが始まったあとのマップのスクロールが、だいーぶガタついていた。もう少しスムーズに動かんのか…と思っていたところから高速化の気持ちが高まってきた。

 

敵の動きやスクロールを見る限り、CPUの処理が遅くなっているというよりは、表示がコマ落ちしているように見える。つまりCPUエミュレーション側のCPU(ややこしい)は処理が間に合っているんだと思う。

 

他にもM5Stackでやってみたい事がいくつかあるので、表示系を気の済むまで高速化しておく事は大切だ!

 

激重状態の表示系

表示側を担当しているCPUでは、主に2つの処理が走っている。

 PC-8801のVRAMデータをM5Stackで表示できる形式へ変換

 出来上がったフレームバッファを表示

 

まずはそれぞれ1画面のデータを作るのに掛かる時間を測ってみる事にした。

f:id:PocketGriffon:20210906234607j:plain

細かい数字をみても仕方がないけど(大雑把に)変換に掛かる時間が約180ms、表示で38msほど掛かっていた!

え……合計して約220ms、…つーことは1秒間で5回も表示出来てないのか。

そりゃカクカクするわけだ(T-T)

まずは時間が掛かっている、画像データへの変換について考えてみた。

 

画像データへの変換方法

PC-8801のVRAMデータは、横8ドットが1バイトという感じで並んでいる。この情報が3プレーン分(つまり3ビット)あり、それぞれのビットが立ってる寝てるという状態で0〜7の色が決まる。

 

対してM5Stackが要求するグラフィックデータは、1ドットが2バイト、RGBが5ビット6ビット5ビットという構成になっている。

 

さらにPC-8801の横640ドットというサイズから、M5Stackの320ドットというサイズへ変換する必要もある。隣同士の色についても合成をしなければならない。

 

しかもPC-8801にはカラーパレットという機能もあり、本来の色と切り替える事が出来る。色変換にはこれも考慮しなければならない。

……結構複雑だ!(T-T)

 

この複雑な変換は、前回の公開前に片付けている。横8ドットのデータを、2ドット単位に切り分けて、テーブル引き一発で変換する仕組みを作った。640x200ドット分の変換、つまり64000回の変換が必要だが、その変換の手間は最小限に抑えられている。

ココをこれ以上の簡略化出来るとは思えない。

 

となると変換の物量(32000回)を減らすしか無い!

PC-8801側でVRAMへデータを書き込んだ際に「このラインのデータを変更した」という情報を残すようにした。こんな事をしてCPUエミュレーションが負荷掛からないの?と思われるかも知れないが、いや重たいです(^^;;

 

さすがにアドレスからラインを求める計算[(アドレス - C000h) / 80]をするので、ESP32の除算って速いのかな???と思って調べちゃったよw

f:id:PocketGriffon:20210907001751j:plain

そしたら、整数の除算は意外に速いという事が分かった。これならば処理を追加しても、そこまで深刻にはならないだろう…と判断(^-^)

 

この処理を入れてみたところ、変換に掛かる時間はほぼ0〜180msという、ものすごい変化のある処理となった(^^; ゲーム中は何かしら動いてるところがあるので、変換の時間がゼロになる事はないけれども、180msが常に掛かるという状態からも脱する事が出来た。

 

表示は速くなる??

表示に関してはまだまだざっくりとした知識しかなく、drawBitmapよりもpushImageの方が速いらしい?くらいの情報しか持ち合わせていなかった。

ご存知と思うけれど、M5Stackを使い始めたばかりの超初心者なのでゴメンね(T-T)

 

上記の「変更のあったデータのみ変換」をした後、そこの1ラインだけをpushImageしてみるコードを書いてみたが、全体で200ラインをpushImageした途端、信じられないほど遅い表示が出来上がった…。pushImageの内部構造は分かってないけれど、どうやら1回1回のリクエストがとても重たいようだ。ちなみにswapBytesはしていない。

 

この時いろんなソースを漁っている最中に、DMAという単語が目に入ってきて「あ、表示にDMA使えるんだったら良いな」くらいのイメージでしか無かった。

 

さらに調べていくと……どうやら、らびやん氏が開発した高速GFXライブラリが存在すると知った!なんと!そんな便利なものがあるのならばぜひ使ってみたい!(^-^)

名前はLovyanGFXというらしい。この世界では有名なライブラリのようだ!

 

さっそく入れて見ようと思ったが……いやはや、それまでのコードがM5.Lcdに頼りまくった作りにしていたおかげで、まずはそれを引っ剥がすところからの作業となった(^^; 最初の頃のコードは、ほぼ何も理解せずに書き散らかしていたからなぁ…汗

 

更新されたラインのみ描画するため、Spriteのサイズを横320ドット縦1ドットとして、1ラインのスプライトを並べてみる事にした。実際に200個のスプライトを用意するわけではなく、8つのスプライトを使いまわしつつ、画像データを送りまくるようにしたところ、表示が劇的に速くなった!!

 

処理の構造上、画像データを作るのと描画処理が一緒になってしまったのだが、合計で平均100msの時間で1画面が作れるようになった!最初の2.2倍だ!

スプライトのサイズが小さいおかげでバッファが内部メモリから確保されたと思うんだけど、そうしたらグラフィックデータの変換も速くなった!そうか、PSRAMって外部にあるから遅いんだな…。

 

あ…そうか、このブログを書きながら思ったが、メインメモリ64KBとかVRAM48KBを内部メモリから確保出来たら、さらに速くなるかもね…。あとで実験しておこう(^-^)

 

 

M5Stack、工夫次第でいろんなアプローチの仕方があってとても楽しいです!

少しプログラムをかじった事がある人ならば、自分なりの楽しみ方で遊べるサイコーのガジェットじゃなかろうか(^-^) 

 

ちなみにこのアルフォス(CPUとGFXで2コアぶん回し状態)をずっと立ち上げておいても、M5Stackはちっとも熱くなりません。これはこれですごい話!(^^)

 

よし、アルフォスは一旦切りつけて、次行くよー(^-^)

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

M5Stackでプログラム その1

M5Stack Core2で手のひらサイズのアルフォス

久しぶりに楽しいガジェットを手に入れて、プログラムを楽しんでる!

何かそれなりの規模のものを動かしてみたいなぁ……と思ったので、久しぶりにPC-8801エミュレータを移植してみた!

比較的簡単に移植が出来たので、動いてるアルフォスを公開した!

 

 

f:id:PocketGriffon:20210905120604j:plain

今さらアルフォスの説明はいらないと思うので割愛しちゃうけれど、初代PC-8801で動くスクロールシューティングゲームで、故・森田和郎氏の作品。

私自身がマシン語を覚える事ですら大変だった頃に、さらにマシン語での高速化とか、もはや次元が違うと感じた方でした。森田氏が解説してくれた本を読んで以来、作るよりも先に高速化を考えてしまい、しばらくプログラムが作れなくなるという本末転倒を味わったw

 

以下、M5Stackというかエミュレータの実装のお話。

 

エミュレータの構成

今回は、過去にCP/M80を開発した際に同時開発した、お手製のZ80エミュレータを利用した。出来合いのものをそのまま利用したため、Z80エミュレーション側は何も手を触れていない(コレは楽させてもらった!)。

 

このプログラムは、ホントに純粋な初代PC-8801エミュレータとなっている。過去に3回くらいPC-8801エミュレータを開発した事があったため、今回はそんなに時間が掛からず作れた。

新しいスケッチを作成してから丸1日後にはコレが動いた感じだ(^^)

f:id:PocketGriffon:20210905114448j:plain

 

このPC-8801エミュレータは、アルフォスを動かすためだけに作ってあるため、必要最低限のハードウェアしか対応していない。

オールRAM、バンク切り替え、カラーパレット、そしてBASICを動かすためのテキストウィンドウ、monを動かすための拡張ROM…くらいだろうか。

 

私はテープ版のアルフォスしか所有して無く、よってこのエミュレータ上で動くアルフォスもテープ版だ。

 

テキスト表示は横40桁分しか表示できず、それを超えた部分は無視される。かつ40桁モードはサポートしていないので、切り替えた瞬間に文字が化ける。が、アルフォスでは使用していなかったので放置状態。

 

さらにテキストとグラフィックスは重ねて表示されない。これはアルフォスではテキストまたはグラフィックスという感じで排他的にしか表示されないからだ。テキストを表示するとグラフィックスは表示されない、または逆の状態しかない。

今思い出したが、テキストはアトリビュートをサポートしておらず、何色を表示しようとしても白で表示される(^^;;

 

開発の流れ

今回は開発をしつつ写真を撮っていったので、「こんな感じで開発してました」的な流れをご紹介したい。

 

まずは過去に作ったソースファイルを引っ張り出して思い出すところから(^^;;

Z80のコア部分は静的ライブラリとして作ってあったので、単品で持ってくる事はすぐに出来た。出来る限り機種依存しない構造にしといた甲斐があった(^^)

 

とはいえ、M5Stackでのデバッグはまだまだ慣れていないので、細かいところに手が届かない。あたふたしながらもようやくZ80エミュレータが少しずつ動き出した。

f:id:PocketGriffon:20210905131806j:plain

こんな感じにシリアル側にデバッグ情報を出しながら追いかけていく事に。

大量のデバッグ情報を流すのも厳しいので、イチからZ80エミュレータを開発してたら大変だったと思う…。

 

いくつかのI/Oを対応させていって、ようやくN88-BASICが起動した。

f:id:PocketGriffon:20210905132223j:plain

この状態ではまだM5Stackの液晶画面には何も表示されてなく、あくまでもメモリ中の情報を見ている。上の写真は、PC-8801のVRAM(F3C8h)を見やすいように可視化したモノだ。

こんな感じで画面へ出力させる前に、できる限りテキストベースで動きを確認している。

 

この「How many files?(0-15?)」の画面から先に進むためには、リターンキーを含むキー情報を入力出来るようにしないといけない。

しかしキーボード系はちゃんと対応しようとすると結構面倒なのだ(T-T)

今回は(も?)できる限り手を抜きたい!!!

そこで、アスキー出版局から発刊されていたPC-Techknow8800Vol.1に書かれていた方法を採用する事にした。

f:id:PocketGriffon:20210905133053j:plain

この仕組を使うと、あたかもファンクションキーを押したがごとく、自動的に文字を入力させていく事が出来る。キースキャンなどの細かい情報を発生させる必要もなく、デバッグ段階でとても便利に使える機能(裏技)だ!

 

f:id:PocketGriffon:20210905140348j:plain

おお、ついにN88-BASICが起動した時の画面が出たね!(^-^)

 

アルフォスのプログラム読み込み

さて、N88-BASICが起動したところで、次はアルフォスのデータを読み込んでみよう。

出来る限り実機と同じ状態でアルフォスを起動したいため(手を抜きたいため…とも言う)、カセットから1バイト読み込んでくる処理を横取りする。

データのロードは、さっきのキー入力の仕組みを利用して「load "cas:"」とすれば良い。

 

実際のデータの読み込みには、PC-8801の未使用I/Oポートである[0Fh]を新設し、このポートからデータを読み込むと、カセットからのデータを1バイト読めるようにした。

 IN A,(0Fh)

そしてエミュレータ側の「カセットからデータを1バイト読み込み関数」にI/Oポート0Fhからデータを取得するプログラムを追加…というかプログラムを書き換える。

I/Oポートがアクセスされたら、SDカードからアルフォスのデータを1バイトずつ返すだけの簡単な処理だ(^-^)

 

さあ、ココまで来たらメモリ上にアルフォスが読み込まれ、おそらく実行されているはずだ!

グラフィックスの状況をシリアル経由で知ることは簡単ではないので、そろそろ画面を実装してみる事に。

 

そうして表示された画面!

f:id:PocketGriffon:20210905143120j:plainf:id:PocketGriffon:20210905143138j:plain

……うん、パレットの対応を入れてないので、まぁこうなっちゃうよね(^^;;

 

パレットの解決をしつつ、画面の更新についても考えてみる事に。

PC-8801は横方向が640ドットあるのに対して、M5Stackは320ドット。単純に横方向のドットを半分にすればいいや…と思ったが、それだと1ドットの縦線などが見えなくなる可能性がある。

 

そのため、隣に並んだドットの色情報を見て、お互いの色を半分ずつ混ぜ合わせる事にした!

これをリアルタイムで処理するのは簡単ではないのため(ウソ、簡単だけど数が多いので実行時間が掛かる)、あらかじめパレットデータが変更されるたびにテーブルを作成する事にした。

f:id:PocketGriffon:20210905144002j:plain

これはマップに配置された固定砲台の絵だけど、黄色と(PC-8801には本来無い)ちょっと薄い黄色があるのがわかるだろうか。

 

f:id:PocketGriffon:20210905144147j:plainf:id:PocketGriffon:20210905144206j:plain

パレット情報もあわせてやるとこんな感じ!

おおお、画面は半分だけど思ったよりも違和感なく表示された!(^-^)

 

実行時間

今回は初代PC-8801という事で、Z80CPUを1つだけ対応した。ディスクもサポートすると、ディスク側のCPUも対応せねばならなくなる可能性があるので、今回はアルフォス専用という大義名分の上でパスした(^^)

 

M5StackにはCPUコアが2つあるらしい。そこで今回はCPUのエミュレーションと、画像データの生成を2つのスレッドとし、それぞれを別のCPUで実行する事にした。

 

CPUエミュレータはまだ少し余裕がある気がするが、画像生成側はかなり重たい。画像生成も重たいが、画面転送(putImageをそのまま使用)も重たいんだと思われる。

メモリアロケーションの種類にDMAなる文字列も見えるので、もしかしたら高速転送などが存在するのかも知れないけど、まだそこまで調べられてない(^^;;

 

まとめ

とりあえずこんな感じで動かせましたよ(^-^)

 

そういえばTwitterへ投稿した後、M5Stackを知らないのでサイズ感が分からない…という話をいただいた。なるほどそりゃそうだと思い、サイズ比較の写真を撮ったのでご紹介。

f:id:PocketGriffon:20210905152417j:plain

手のひらに乗る…というか、手のひらに収まるアルフォスだw

 

M5Stack自体、手に入れて間もないけれどもプログラムは作りやすいと感じている。

一時期、スケッチの書き込みがうまくいかず、Twitterに「これじゃあ作れない」と嘆いていたが、これはUSB Type-Cを使うのではなく、USBハブを介したUSB2.0を使うようにしたら劇的に改善された。

これ以降も何度か不安定になる事はあったが、シリアルケーブルを刺し直す事で復活出来ている。超快適(^-^)

 

今回、動かすの最優先で表示系が遅いままの状態なので、もう少しだけ高速化してみたいと思う(^^)

いや楽しいね、新しいガジェットは!

 

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

M5Stack Core2を使ってみる!

本当に……本当に私らしからぬモノを手に入れてしまったw

いや違う、手には入れるんです、いつも。

Arduino Uno、Wio Terminal、Raspberry PiIchigoJamなどなど…。ワンボードマイコンも含めると10個以上が使用待ちになってるかも。積みゲーならぬ積みマシン??

f:id:PocketGriffon:20210901224352j:plain

手に入れるものの、なかなか使う機会がやってこない。

そして…いつも「やってみようかな?」という高まった気持ちにブレーキを掛けるのが、IDE……いわゆる統合開発環境というモノ。

 

キライ……とか苦手……とかではなく、趣味に仕事に何度も何度も使っている。

TurboPascal、PowerC、CodeWarrior、VisualStudio、ここでは書けないけれども専用のアレとかコレとか。長くソフトウェア開発の仕事に携わっていると、そこの開発現場に合わせていろんなものを使う。

でも……使ってみて便利だと思ったことが一度もないのだ(-_-;;

 

IDEを使う…と言っても、使い慣れたEmacsをエディタとして使い、IDE自体はビルドツールとしてのみ使う。これがいつものパターンだ。デバッガじゃなくてROM Emulatorでいいじゃん…と自分でも思うw

いつもは逃げてばかりだけど、今回はちょっと頑張ってみよう…!と思った!

 

M5Stack Core2

実は発売当時からものすごく気になっていたM5Stack。いつも千石電商で見るたびに手にとっていたんだけど、「BASIC」「Gray」など種類があって何を選択したら良いのかさっぱりわからん!となっていた。どれでもいいやとばかりにレジまで持っていき、やっぱ辞めよう…どうせ使わない…と繰り返す事数10回!(^^;;

 

そしてCore2が発売された時も手に入れようと思っていたが、やっぱ躊躇してたw

最新のマシンなんて使いこなせないし、作りたいものもないし。

さんざんっぱら悩んだけど、今回は手に入れた!(^^;

そして手に入れた初日に箱から開けなかったら、きっと数年は開けないと思ったので気合を入れて開梱!(そこまで?)

f:id:PocketGriffon:20210901230754j:plain

実際、M5Stackがどんなもので何が出来るのか、あんまり理解していなかった。この大きさでいろんなセンサーが入っている…くらいの知識。ロボット的なものに取り組んでいる方には便利なのかも??

f:id:PocketGriffon:20210901231700j:plain

そして本体を取り出して、多分充電が必要なんだろうなー…と思ってUSBを繋げたところ、いきなり電源が入ってこの画面。なんだろうな……エヴァ○ゲリオンを思い出す(^^;;

いろんなハードウェアの状態を表示しているんだろうけれど、初めてM5Stackを使う私には、何がなんだかさっぱり分からない。まぁ…あとで見たらいいか…。

 

Webを参考にしながらArduino IDEをインストールしてみる。そうか、M5StackってArduino系なんだ(こんなことも知らずに手に入れたヤツ)。これで慣れたらArduino Unoも使えるって事なのかな…それはそれで助かる!

f:id:PocketGriffon:20210901234308p:plain

IDEを起動したら……あ、なるほど、こういう画面になるワケね(^-^;;

 

れっつプログラミング!

とりあえずネットに書かれていたHello Worldを表示するプログラムを入力。

ビルドしてみるけどエラーの連続(T_T)

私の環境にはArduinoの開発環境が入ってなかったので、その辺りですっ飛ばされた説明の部分に引っかかってしまった模様。ここで挫折しちゃう人も多そうだなぁ…と思いつつも、あれこれ調べてみて、ようやく表示された!

f:id:PocketGriffon:20210901234131j:plain

Hello Worldを変更しながら実験しつつTwitterにご報告したのが↓この写真。

f:id:PocketGriffon:20210902082818j:plain

テキストを表示するだけだったら、とても簡単にプログラミング出来る!

これに加えてシリアル側にも情報を出力できる(Serial.printfなど)ので、デバッグでものすごく使えそう。

他にもいくつかの関数をテスト見たり。

f:id:PocketGriffon:20210902083038j:plain

 

プログラムはC++で書ける上に豊富なライブラリが用意されているため、何か作る事に対して困る事がほぼない。困る…というか「コレはどうだろ?」と思うのは、やれる事が豊富にありすぎて、やりたい事に対して「どういうアプローチが最適なのか」を調べるのが苦労する(^^;

 

とりあえず絵を表示してみよう…と思ってフレームバッファを用意してそこにプログラムで画像を描き、表示させる…という、いつもの手順をしようと思った。

…んが、どうにもうまくいかない。どうやら画面は2バイト1ドットの構成らしかったので、普通にuint16_tを320x240ドット分newして…とかやってもうまく動かない。この「動かない」理由が分からない(T-T)

newするのを辞めてmallocするかーってしても、やっぱり動かない。メモリ確保に失敗してるのかと思いきや、どうもそういう事情でもなさそう。でも動かない。はて???

 

nint16_t *v = heap_caps_malloc(sizeof(uint16_t) * 320 * 240, MALLOC_CAP_DEFAULT);

 

としてようやく動くようになった。

これで何故動くのかもさっぱり意味不明(T-T)

手探りというよりは流れに任せっぱなしのプログラミングだ!理屈を理解できてないプログラム=自分を信頼出来ない事ほど危険なモノはない(^^;;

 

とりあえずフレームバッファを塗って表示させたのがこれ↓

 

ゼビマップを表示させてみる!

せっかくカラーが表示できる液晶モニタなんだから、何かを表示させてみたい!

というわけで、以前TI-84 Plus CEで表示させていたアレをやってみよう!

 

この時に利用してたデータをそのまんま使って、M5Stackでも表示させてみる。

実は、この当時に使っていたMacとは「違うMac」を使っている関係上、当時のビルド環境が失われている。これを復活させるのにはホネが折れそうだったので、TI-84 Plus CEに読み込ませていたバイナリデータをそのまま利用する事にした。

 

TI-84 Plus CEとM5Stackとではグラフィックのフォーマットが違っているため、これはもうM5Stack内部で変換しつつ表示する事にした。マップデータ(BG、キャラクタ、パレット)はプログラム中に入れるのではなく、SDカードへ置いて実行時に読み込ませるようにしてみた。

おかげでSDへのアクセスを覚えることが出来た(^^;;

 

f:id:PocketGriffon:20210902090205j:plain

やっと表示できた!(^-^)

色のデータフォーマットがTI-84 Plus CEとは違っているので、これは初期化時に変換、カラーインデックスは描画時に解決しながら進めている。そのため描画が激重だ(T-T)

 

その激重状態でスクロールさせてみたのがこちら↓

 マップの描画も重たいけれど、スクロール(メモリコピーしまくり)と画面描画(drawBitmap)の方が何倍も処理掛かってる気がする…。

 

外部エディタを使えるよう設定ができたおかげで、慣れたEmacsを使えるようになった。

やっぱり…Arduino IDEがビルド+ローダーになってしまった感は否めない…。ちょっと楽しくなってきたので、もう少しだけプログラムしてみようかなって気になっている。

PC-G850Vも中途半端になってるので、戻らないと…汗

 

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

PC-9801NS/Aのバッテリー事情

今回のブログは個人(素人)が自己責任において行った実験です。

決して真似したりする事がないよう、お気をつけください。

あくまでも読み物としてお楽しみください(^^;;

 

f:id:PocketGriffon:20210826171821j:plain

PC-9801NS/Aを98ノートのメインマシンに置き換える作業をしているが、バッテリー問題がちょっとだけ面倒だ。

断っておきたいが、別にバッテリー駆動を目指そうとしているわけではない。

バッテリーを接続しない状態でNS/Aを使っていると、FDDをアクセスした瞬間に電源がOFFになってしまうのだ。バッテリーを接続していれば問題無く使える事から、おそらく電圧?電流不足なんだと思う。純正品ではない増設メモリ+ODPを取り付けているのが原因かも。

 

普段はHDD(というかコンパクトフラッシュ:CF)での使用となるのでFDDは使わない事が大半だけど、安定して使える環境は作っておきたい。

 

というわけで!

代替えのバッテリーが作れるか検討してみたい。

実を言うと、何年か前にPC-9801ノートのバッテリーを自作しようと実験している。

その実験結果がどうだったのか、実験バッテリーがどこへ行ってしまったのか、部屋の引っ越しその他で失われてしまった…(^^;;

それがない状態でもう一度イチからやるかどうか…悩むところだ!

 

f:id:PocketGriffon:20210826180159j:plainf:id:PocketGriffon:20210826180216j:plain

これがPC-9801ノートで標準的に使われているバッテリーパック、PC-9801N-11。

 

f:id:PocketGriffon:20210826180756j:plain

9.6v 1400mAhの容量で、初代PC-9801Nから使われているバッテリーパックのようだ。

これで初代98ノートが1.5時間、NS/Aでは1.1時間ほど使えたらしい。

 

f:id:PocketGriffon:20210826180826j:plain

端子は3つ付いていて、極性はわかるけど「C」ってなんだろ??

 

f:id:PocketGriffon:20210825005736j:plain

前回のブログにも載せた写真だけど、サイズ的にはこんな感じで、単三電池が8つ入るくらいの大きさだ。ここに1.2vのニッカド電池を8つ取り付ければ、9.6v…と良い感じになりそうだ。

 

ただ…バッテリーというのはとても危険で、素人が手軽に扱って良いものではないらしい。最悪は出火したり爆発したりする危険性もあるとの事。特にPC-9801N-11のようにパッケージングされたものは、メーカーからの「絶対に分解とかするなよ?」的な意図を感じるので、手を出さない方が無難だ。

 

うん、無理をするのはやめよう…。

そう思いつつも、そういえば過去にテストしたことの記憶を辿りつつ、携帯に入った写真を探してみた!そしたらいくつかの写真が出てきたのでご紹介したいw

f:id:PocketGriffon:20210827100109j:plainf:id:PocketGriffon:20210827095939j:plain

f:id:PocketGriffon:20210827100003j:plainf:id:PocketGriffon:20210827100037j:plain

背景?がカッティングシートではなくて座布団って辺りが準備不足を感じる(^^;

これは2018年8月27日に撮影された写真……あれ?ちょうど3年前だ!(^-^)

 

バッテリーパックを殻割りして、中に入っていたバッテリーを撤去、その後何種類かのテストをしているっぽい。アルカリ電池6本でテストしているのは、1.5v x 6本で9vにしかならないが、多くの電池は1.6vくらい出るので9.6vに達するのではないか…と思っての事だったと思う。

 

実際にPC-9801に繋げてテストまでしていたようだ。ニッカドバッテリーを繋げて充電のテストまでしたのかは記憶にない。

 

このテストをした機材(というかバッテリーパック)は捨てていないはずなので、どこかにあるんじゃないか…と思って探してみた!ただでさえ荷物の多い部屋からバッテリーパック1つを探し出すのは簡単じゃない(^^;;

 

でも!頑張って探したよ!(^-^)/

やっと出てきた実験バッテリーパック。

f:id:PocketGriffon:20210827101524j:plain

f:id:PocketGriffon:20210827101603j:plain

おお、なるほど!

最終的には販売されていたニッカドバッテリーを入れていた(^-^;;

結線などはきちんとされていたようなので、試しにPC-9801NS/Aに取り付けてみたけれど、電源入れて5秒くらいで電源OFFになってしまう。やっぱりバッテリー特性とかあるのかな…

 

とりあえずFDDが使えれば良いので、FDDを使う時のみ接続する事とした。自分で加工したバッテリーほど信頼が置けないものはない!(^^;;

 

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

PC-9801NS/Aをノートのメインマシンに!

f:id:PocketGriffon:20210824203130j:plain

うちにはPC-9801ノートが結構な台数ある。

本格的にレトロ活動を始めた頃、やっぱりレトロの中心となる作業マシンがあった方が良いだろう…と思ったのと、昔からの憧れで98ノートを使ってみたい気持ちがあった。

 

手始めに若い頃にイチバン欲しかったPC-9801NS/Rを手に入れてみた。動作未確認という事だったが、届いた本体は案の定…というか期待もしていなかったけれど、動かない状態だった。

でもまぁ98ノートを手に入れたっていう満足感だけでいいか…と思っていたが、やっはり手元にあると使いたくなる(^^;;

 

この気持ちが、今のレトロパソコンの修理を始めるきっかけとなった。ネットでコンデンサを交換するのが良いという情報を読み、最初は「μFってなんだろ?」というところから始めた。その後、98ノートだけで50台は修理っぽい事をしたと思う。周りからは「やることが極端だ」と言われるが、自分でもそう思う(^^;;

 

確か直ったのは上記NS/Rも含めて2割にも満たなかったと思うが、修理の場数だけはたくさん踏めた。おかげで今でも98ノートの修理にはあまり抵抗がない。私が貫通型のコンデンサよりも表面実装型のコンデンサ交換を好むのは98の修理をしまくった影響だw

 

これまでPC-9801NX/C(カラー液晶)を98ノートのメインマシンとして使っていたが、事情がありPC-9801NS/Aへ移そうと考えていた。98のデスクトップはずっと前からPC-9801USを愛用しているのだが、これが実はアクセラレータを積んでたという事を先日知ったw

 

カラーが表示出来るのはデスクトップに任せておき、ノートの方はモノクロでいいか…と割り切った。NX/CよりもパワフルなNS/Aを使おうかな…って事だ。

 

PC-9801NS/A

PC-9801NS/Aは標準でCPUが486SXの33MHz、メモリは1.6MB。

私が良く使うベンチマークソフトCPUBENCHだと、初代PC-9801の43.45倍って出る。

MS-DOSで何かをやろうとした時には、すでに満足できるスペック!(^^)

 でも……そこに増設出来る場所があったら、増設しなければならないのだ!!(自己満足)

 

というわけで!

f:id:PocketGriffon:20210824230441j:plain

486SX 33MHz→486DX4 100MHzへのアクセラレータ。IODATAから発売されていたもので、おそらくNS/Aで使えるアクセラレータでは最高速かも??

 

f:id:PocketGriffon:20210824233536j:plain

16MBの増設メモリ。NS/A自体は33.6MBまで増設可能らしいので、きっと32MBバージョンもあるんだろうけれども、この当時に32MBって死ぬほど高かったと思われ…。

 

f:id:PocketGriffon:20210824233746j:plain

今回はHDDの代わりにコンパクトフラッシュを取り付ける!家の98はUSもNX/Cも512MBのCFを使っているが、どちらもNS/Aでフォーマットした覚えがある。というか、手元の98ではNS/Aでしか512MBが認識されなかった。

 

特にWindowsを入れるわけでもないので、512MBを積んでも1/10くらいしか使ってない…。というわけで、今回は無難に128MBの方を使うことにした。

 

このコンパクトフラッシュIDEに変換するアダプタは、秋葉原にある千石電商で900円ほどで手に入る。98ノートでHDDを使う場合はいくつか手に入れておくと便利だ。

むしろ98ノートと相性の合うコンパクトフラッシュを見つける方が難しい。使えるモノと使えないモノがはっきりしない。こればかりはいくつか試してみるしか無い。

#書きながら思ったが、MBRに何か書き込まれていると認識されないのかも??

 

f:id:PocketGriffon:20210824234220j:plainf:id:PocketGriffon:20210824234239j:plain

OSはMS-DOS 6.2をインストールしてみる。

私自身はMS-DOSは5でいいじゃん派なのだが、5.0のシステムディスクをどこかにしまい込んでしまっていて見つける事ができなかった(フラグ)。

 

これら一連の増設グッズはこのために揃えていたものではなく、特に目的なく手元においてあったものだ。ようやく日の目を見る!(^^)/

 

MS-DOSをインストールしてみる

まずはメモリとアクセラレータを取り付けてみた。

f:id:PocketGriffon:20210824235542j:plain

いいねいいね!しっくりきてるね!

どっちも純正品ではないけれども、そこにはあんまりこだわり無いのでおっけー(^-^)

f:id:PocketGriffon:20210825000136j:plain

メモリもちゃんと認識した!

つーか、メモリカウントがめちゃくちゃ速い!!

普段、PC-9801USのCバスメモリ&PCカードメモリのカウント見てるから余計に速く見えるのかも??

「ピポ」音とメモリカウントでマシンの速度を感じられる健全な世代(^^)

 

フロッピードライブにMS-DOSのインストールディスクを入れて電源を入れたのだけれども、厄介な事が起きた!! フロッピーをアクセスしにいくと本体がリセットされちゃうのだ!

これは………試しにフロッピーを抜くとちゃんと起動しようとする。

 

うーん……モーターが動く瞬間に電源が落ちちゃうので、電源不足かも?? 実はメインバッテリーが使い物にならないと思い、取り付けてなかったのだ。ACアダプタだけでの駆動。

もしかしたらACアダプタもダメなのかも??

純正品ではないメモリとアクセラレータを取り付けているので、電源の容量不足があったとしてもおかしくはないと思う……。

 

仕方がないので、一時的にメインバッテリーを取り付ける。正直、使えるかどうかは全く分からない…。試しにバッテリーを10分ほど充電をしてみる。

f:id:PocketGriffon:20210825001300j:plain

あ……電圧は出たね…。出たけどどうなんだろうなぁ……。中のバッテリーの具合が見えないので怖い。

さらに様子を見ながら1時間ほど充電してみた。

f:id:PocketGriffon:20210825001408j:plain

あ!これはヤバそう!定格9.6Vのバッテリーで(しかも劣化してるのに)12.47Vも出た!

なんとなく嫌な予感しかしないので、バッテリーを取り外した。

フロッピーを使うのはインストールの時なので、増設メモリとアクセラレータと外して作業する事に。そうよ、最初からそうすればよかった(^^;

 

f:id:PocketGriffon:20210825002637j:plainf:id:PocketGriffon:20210825002701j:plainf:id:PocketGriffon:20210825002425j:plain

MS-DOSのインストールは問題なく終わった!

…が、再起動すると起動の途中で止まってしまう(T-T)

何か良くないものがCONFIG.SYSに書かれているのかと思い、フロッピーから起動→CFの中を探ってみるが、どうも怪しげなものがあるようには思えない。うーん…。

 

やっぱり初志貫徹!MS-DOS5.0を探そう!

ここから自宅の大冒険が始まる!!(T-T)

RPGでいえばレベル80に達するほどの大冒険の末、ついに見つけた5.0!

 

f:id:PocketGriffon:20210825003245j:plainf:id:PocketGriffon:20210825003332j:plain

実はMS-DOS5.0は複数所有している。
しているけれど、今は他の98にインストールしてあってライセンス的な数が揃ってるのかを確認しないといけなかったのだ。

さすがにソフトウェアを生業としている人間がライセンス違反なぞ出来るはずがない!(T-T) Vzエディタだって6本とか持ってる人なんだぞw

 

f:id:PocketGriffon:20210825003658j:plain

MS-DOS5.0は何の問題なくインストール&再起動ができた!

MS-DOS6.0はインストールディスクが8枚あるのに対し、5.0はディスク3枚でインストールが出来る。機能と手軽さ、やっぱり私は5.0が好きかも(^^) もっと言っちゃえば自分が使う機能的には2.11で十分とも言えるw

 

メモリとアクセラレータを戻して再起動してみた。

f:id:PocketGriffon:20210825003718j:plain

まだ標準のドライバしか使ってなくて細かい調整はこれから。このままでもいーんじゃね?って感じに思えるほどちゃんとインストールされてる!(^-^)

 

f:id:PocketGriffon:20210825004556j:plain

大好きなCPUBENCHしてみたら、100倍を超える数値を叩き出した!!
これはすごい!(@_@;

 

とりあえず使えるようにはなったと思うけど、この後も少しずつ入れていかないとだね。

まずはVzエディタとLSIC-86(試食版)でも入れたら何か作れるだろうか…。

 

そうだ、バッテリー問題はどうしたらいいんだろうな…。

f:id:PocketGriffon:20210825005736j:plain

ふむ、単三電池サイズのニッカドバッテリーが8本で9.6vなのか…

なるほどなるほど……。

 

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