SHARP PC-1600KでCP/M80!その5

f:id:PocketGriffon:20210503230237j:plain

ついにPC-1600K上のCP/M80で、スタートレック(ゲーム)が動くようになった!

これはMBASIC.COMの上で動く、それなりのサイズがあるプログラムだ。この規模のものが動くようになれば「とりあえず動くようになったよ」くらいは言っても良いかと思い始めた(^^;;

 

CP/M80 on PC-1600Kディスク事情

さて、前回に引き続きディスク関連を書いていこうと思うけど、前回ほど面倒な話ではなくて、運用面での話を書いてみようと思う。なんにも整備されてないって言いたいだけだw

 

一般的にエミュレータを使おうとすると「ディスクイメージがうんぬん」という、ちょっと面倒な手続きがあるかと思う。エミュレータ側からはホスト側のファイルを直接見ることが出来ないので、1つのファイルをディスクと見立ててアクセスをするようになっている。

ファイルの中に沢山のファイルが入っている…という表現が良いんだろうか。

そのため、そのファイルの中の構造を変更しようとしても簡単にはいかない。コピペなんて簡単には出来ないのだ。

 

今開発しているCP/M80もディスク事情は同じだ。

そのためファイルのやりとりは非常に面倒となる。

今、私が実際にやっている手順を書き記してみると…

 

1、ディスク(増設メモリ)をフォーマットする(独自開発したプログラム)

2、CP/M80が起動した時に0100h番地となるメモリにファイルをロードする

  →専用のローダーを開発

3、CP/M80を起動する(メモリはクリアされていない)

4、「SAVE xx ファイル名」として0100hにあるバイナリをファイルへセーブ

5、実行

 

ファイルのかず分だけ、2〜4を繰り返しているのだ!

なぜこんな面倒な事をしてるのかと言えば、まだまだシステムが安定してるとは言い難く、ツールなどで固めてしまうには時期尚早と感じていたからだ。

 

こんな煩雑な状態なのでドキュメントをまとめておかないと、次にチャレンジする時に絶対に思い出せない(^^; 私はそういうツール類がとても多い…(自慢じゃないけどw

cpmtoolsという便利なものがあるらしいので、自作するばっかりじゃなく使ってみたいと思う。

 

ちなみにディスクはAとBの2ドライブ構成にしてあり、Aドライブが448KB、Bドライブが512KBの容量を持つ。これは1MB増設メモリを装着する事を前提とした構成だ。512KBの増設メモリの場合は448KBドライブが1つとなる(もっと細かく分けても良いけど)。

 

かなり安定してきた!

f:id:PocketGriffon:20210504000607j:plain

ここ1〜2日の間の修正対応で、かなり安定した動作をするようになってきた。本体裏面にあるリセットボタンを押す回数が激減した。

 

開発面で一番効果が高かったのは、正しくCP/M80を終了させてBASICへ戻る事が出来るようになった事だ。今までは一度CP/M80をスタートさせるとリセットするしか復帰する方法が無かった(^^; メモリ周りや割り込みの処理が安定してきた事により、正しく終了させる方法を確立させる事ができた。

 

キー操作をきちんと実装した事も相当ストレス軽減になった。開発の初期にありがちなBS(Back Space)が機能しないなど、とにかく動かすだけでもストレスが溜まった。

PC-1600Kは「SHIFT+なんとか」というキーオペレーションが多く、特に「,(カンマ)」や「:(コロン)」がワンキーでは打てない。そして「"(ダブルクオート)」などは特殊キーに割り当てられていて、コードを変換しない限り使えない状態だ。

この辺りを整備した事でキー入力によるストレスはだいーぶ減った!

 

つい先日まで、しばらく使っていると気がつくとハングアップしていたり、シリアル経由で表示される文字が化けてみたり、どうにも怪しい動きをしていた。シリアルの文字化けは単純に通信状態の問題かと思っていたが、突然のハングアップはそういう事ではない。

MBASIC上で計算をした結果を表示させている時に、答えを間違う場合がある事に気がついた。1+1が2にならず、小数点以下が表示されてしまう。これはトンデモないバグだ(ToT)

これも症状が安定しない事から、真っ先に割り込み処理内のバグが疑われた(^^;;

そしたら案の定、フラグレジスタをPUSHする前に計算式が入っていた!割り込みから抜けてくるとフラグ状態が壊れる事があり、それにより答えを間違える…という現象だった。

これも無事に直せた!

 

同時にBIOSの実装も進めていったおかげで、MBASICからSYSTEMコマンドでCP/M80へ復帰できるようになったり、運用面での安定感が増していった。

 

意味もなくベンチマーク

世界標準のCP/M80が動いたという事で、なんとなくやってみたくなったベンチマーク

MBASICの単純ループで時間を測ったみた!手作業での判定なので1秒くらいの前後がある可能性があるよ!!(^^;

 

10 FOR I=0 TO 10000

20 NEXT I

 

このプログラムの実行速度を測ってみた!

20行の「I」が無い方が速かったり、先頭に「DEFINT I」とか入れると速くなるのは分かっているけど、とりあえずこのプログラムで統一する。

 

PC-1600K上のCP/M80で動くMBASICで測ってみたところ14.10秒となった。

同じくCP/M80上で動くBASICを主言語とするHC-40で測ってみると20.47秒と出た。

あれ…?CPUクロック同じだと思うんだけど、なぜかPC-1600Kの方が速い。

じゃあ…という事で、久しぶりにPC-8300にも登場してもらった。

f:id:PocketGriffon:20210504005218j:plain

その結果、17.69秒だった!

おお、PC-1600K、意外にも速い!!(^-^)

特に高速化のために何かしたわけでないけれども、1割2割も速くなると嬉しいね!

 

CP/M80自体の動作が安定してきた事もあるので、この先はCONOUTの出力先をRS-232Cから元の画面に戻していこうと思う。

その後は運用をもっと便利に出来る環境を整えて一旦キリかな…という感じだ!(^^)

 

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

SHARP PC-1600KでCP/M80!その4

f:id:PocketGriffon:20210502105404j:plain

PC-1600Kの狭い画面で開発続けるの大変だなぁ…と思っていたところ、Twitterで「シリアルに出してみたら」という感じのご意見を頂いた!なるほど、ぜーんぜん気づいてませんでしたw これだけブログ内でV20-MBCとか触ってるっていうのに…汗

 

さて今回は、ディスク周りをどのようにしているのかを解説していきたい!

 

ディスク周りの設定など

CP/M80におけるディスクについては、BIOSの設定パラメータの中に「ディスク・パラメータ・ブロック(略してDPB)」というデータが存在する。ここで細かいことを説明する事はしないけれども、詳しく知りたい場合はCP/M80の解説本を読んでみてほしい。本によって説明が異なったりするので、何冊か読んでみる事をオススメする。

 

CP/M80内部ではデータを128バイトひとまとめとして扱っている。ここではこれをセクタと呼んでおく。

DPBではこのセクタが何個あって、どこがどのように使われるのかが記されている。

DPBの書き方によってディスクのサイズが変わったり、アクセス方法が変わったりする。なので、DPBは厳格に定義せねばならない。CP/M80の移植で難しいところはココかも?

f:id:PocketGriffon:20210502113139j:plain

↑難しい事を簡単に書かれている辺りが初心者キラーっぽい(T-T)この図ではDPBLKと書かれているが、本に掲載されているソースではDPBと書かれている

DPBは「どんな感じの機材が繋がっているのか」をCP/M80本体(主にBDOS)に教える定義だが、その機材へアクセスをするのは(自分がこれから書く)BIOSの方だ。極端な事を言えば、ディスクとしてアクセスされたものが、実際のディスクだろうとメモリだろうとシリアルだろうと関係ない。そこはBIOSが吸収してやればいいのだ。

そして今回のPC-1600K CP/M80では、増設メモリをディスクと見立ててアクセスをする。

 

PC-1600Kの増設メモリは以下のようになっている。

f:id:PocketGriffon:20210502114123j:plain

1MB増設メモリはスロット2に取り付けられているので、アドレス8000h〜BFFFhのバンク2と3に見えている。この2つのバンクで32KB分。残りの992KB(1024KB-32KB)分のメモリは縦バンク(図ではVerticalBank)としてバンクを切り替えていけばアクセスが出来る。

以降、図に書かれている横方向に伸びるバンクをHBANK、縦に伸びていくバンクをVBANKと呼ぶ。

 

VBANK0(のHBANK2と3)はメインメモリとして0000h〜7FFFhに顔を出しているのでディスクとしては使えない。

VBANK1(のHBANK2と3の合計32KB)は今後の拡張用として残しておこうと考えている(80x24表示用のバッファとか小さいフォントデータ格納用とか)。

RAMディスクとしてはVBANK2以降を使うこととした。これはDPBに書くことではなく、BIOS側が吸収する。

 

1つのメモリブロックは16KBのサイズがある。1セクタ128バイトなので1トラック=128セクタと管理したら、とても簡単な計算で実アドレスを求められる事となる。

本CP/M80では、Aドライブとして448KB(512-64KB)、Bドライブとして512KB用意した。わざわざドライブを分けたのは、512KBメモリモジュールを持っている人でも使えるようにしたかったためだ。

 

RAMディスクアクセスの問題

ここでひとつドハマリしたバグがあったのでご紹介したい(^-^;

 

CP/M80では、ディスクから128バイトを読み込むバッファ(DMAバッファ)がある。 このバッファ、通常はメインメモリの0080hからの128バイトとなっている。

このPC-1600K CP/M80システムでは、ディスクはメモリモジュールとなっているから、ディスクからデータを読む イコール メモリからメモリへのコピーとなる。正しいメモリバンクを設定しておいてZ80よろしくLDIRすれば安直にコピーが出来る……と思い込んでいた!

 

実際にそのようなコードを組んでみたところ、セーブしたファイルを実行しようとすると、どうにも不安定になる場合がある。この「場合がある」というのが厄介だ。なぜ不安定になるのかがさっぱり見当付かなかった。例えばAというコマンドを実行しようとすると不安定になる、ディスクをフォーマットして書き込んでいくうちに、今度はBのコマンドが不安定になる…という感じで法則性が読めない症状だ。

 

この手の不安定要素は早急に対応しなければ、作業を先に進める事が困難になる。ほぼ半日悩んでようやく原因らしきものを突き止めた。残念ながらこの期に及んでも推測の域は出ていない(TT) 

 

上にも書いた通り、DMAバッファがあるのはメインメモリの0080hだ。ここは64KBフルRAMモードではHBANK1だが、実際にはHBANK3のVBANK0が見えている。

この状態で、ディスクをアクセスしようとしてVBANKを切り替えた瞬間、どうやらメインメモリの0000h〜3FFFhも一緒に切り替わってしまうようなのだ(おそらく4000h〜7FFFhも同様)。メインメモリの0080hへデータをコピーをしたつもりが、別のVBANKに切り替わっていてディスクの情報を破壊する…というのが不安定になる原因だったようだ。

考えてみれば「そりゃそうだ」と思うのだが、メモリマップだけを見ているとコレがなかなか気がつけない(T-T)

 

 仕方ないので、バンク切り替えには影響されないC000h以降に中間バッファを設け、そこを介してディスクとのやりとりをするように構造を変更した。転送時間は2倍掛かる事となったが、これ以降はすこぶる安定して動作するようになったので、まぁヨシとしよう(^^;;

 

現状のPC-1600K CP/M80

一旦、今の状態をまとめておきたい。

まだまだ実装できていない事が多くて、安定動作には程遠い状態だ。

 

まずキー入力がまともではない。SHIFT+なんとかのオペレーションが出来ていないので、ダブルクオートとか「;」などが入力出来ない状況だ。BSも機能しないため、非常に面倒。

 

WBOOTを実装していないため、MBASICでSYSTEMしてもCP/M80に戻れない(^^; いつもリセットしているのだ!面倒すぎるww これはトラック0セクター1にCCP+BDOSを書き込んでやれば良いのだが、システムが安定していないのでまだ先にしたいという想いから。

 

CP/M80自体を抜けて、素のPC-1600Kへ戻る事が出来ない。これも実装しなければならないことがいくつかあるようで、その調査が進んでいない。

 

多分、キー入力とWBOOTを実装すればある程度CP/Mとして「動いた」と見てよいのかも知れないが、そこへ到達するまでにはもう少し時間がかかりそうだ。

 

次回はディスク関連その2を書こうと思う。ディスク周りは面倒が多い(T-T)

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

SHARP PC-1600KでCP/M80!その3

f:id:PocketGriffon:20210501104229j:plain

CP/M80のPC-1600Kへの移植、その3

 

とりあえずいろんなソフトを動かしてみては動いたり動かなかったり、安定動作とはほど遠い状態で、あくまでも実験的な側面が大きい今回のCP/M80移植。

MBASICが動いた事で、なんとなくこの辺りまでで良いかな…とかも思い始めたので、この先どうするのかを考えつつも、技術資料だけは残さねば…と思ってのブログ(^^;

次にチャレンジする人(!)のためにも後世に残さねば!

MSX-DOSの移植とかも楽しいかもよ!(ハード構成が違うから簡単じゃないと思うけど…)

 

CP/M80の入手と起動準備

まずはCP/M80起動に必要なCCP、BDOSの入手のお話。

この辺り、だいぶグレーゾーンな事をしているので、ぱぱっと書きたい(^^;;

私は文豪のROMから該当するバイナリ部分を抜き出している!CCPとBDOS部分はバイナリでしか手元にない。前回のブログで「過去にCP/M80を動かすエミュレータを作った」と書いたが、その時にもバイナリ状態のCCP+BDOSでCP/M80を起動させている。

 

なぜこんな芸当でCP/M80が起動させられるのかと言えば、CP/M80は1バイト単位で「どこのアドレスに何の情報が書いてある」のかが細かく決められているからだ。所定の場所に決められた情報を配置する事で、CP/M80は起動させる事が出来る。

f:id:PocketGriffon:20210501100926j:plain

ユーザーが書くべき部分はBDOS直後に続くBIOS部分のみだ。

先頭の34バイトに17個分のジャンブテーブル、その直後に16バイトのディスクパラメータが必要。それ以降は任意のアドレスに好きに書いていく事が出来る。

「なーんだ、そんな簡単なのか」と思われた方も多いかと思うが、CP/M80は移植性が高い構成になっているので、決まりごとさえ覚えてしまえば小難しい事はない。

最低限、8080(またはZ80)の知識と、その移植するマシンについての事の理解がありさえすれば、CP/M80の移植難易度はぐっと下がる。

 

ちょっとだけ補足をすると、文豪のCP/MはPC-1600Kよりも高アドレスで動作するようになっているため、そのままではPC-1600Kで動かす事が出来ない。しかし移植性の優れたCP/MなのでMOVECPMやSYSGENなど、他環境で動かすためのツールがたくさんある。これらを駆使してPC-1600Kで使えるCCP/BDOSに作り変えた。

 

無理矢理CP/M80を起動させる!

もうこのタイトルから言って無茶してるなーって思ってもらえれば(^^;;

CP/M80の起動シーケンスは、正しい方法を取ろうとすれば結構面倒くさい。実際にどのようにしてOSが起動するのかは、その手の本を読めば沢山の情報が出てくる。

しかし今回はお気楽にCP/Mを動かしたいと考えているので、面倒な部分をすべてすっ飛ばして起動させたい。

 

具体的な方法を書いちゃうけど、メモリのC400hからCP/M80のセット(CCP+BDOS+BIOS)をロードし、BIOSの先頭アドレスへジャンプさせる。これだけだ(^^;;

そしてBIOSを初期化する前に(ブログのその1でも書いた)メモリマップの変更や割り込みへの対応をした後、通常シーケンスの初期化をしてCP/M80を起動させている。

 

BIOSには17個のエントリ(BOOT WBOOT CONST CONIN CONOUT LIST PUNCH READER HOME SELDSK SETTRK SETSEC SETDMA READ WRITE PRSTAT SECTRN)が存在するが、このうち起動させるために必要なのはBOOT、CONOUT、SELDSKの3つだ。他のは何もしない(RETのみ記述。SECTRNだけはHL=BCしてRET)だけしておけば大丈夫。起動した直後にCONSTとCONINが必要となる。

 

上記3つのエントリのうち、ちゃんと書かないといけないのはBOOTとCONOUTだけだろう。SELDSKは既定値(HL=ディスクパラメータへのアドレス)を返すようにプログラミングしておけば良い。これだけでCP/M80は起動する。

その後、CONST、CONINを正しく実装すればキー入力を受け付けるようになる、というわけだ。

 

起動までの問題は?

ぱぱっとテキストレベルで書いてみたが、実際には起動までにさまざまな問題が出た。

デバッガやエミュレータがあるわけではないので、動かなかった時の対応は非常に難しい。実はどうしてもバグが取れず、部分的ではあるがZ80エミュレータを用いている。以前書いたCP/M80エミュレータの、Z80エミュレーション部分だけを抜き出してきて動かしていた。

 

そのエミュレータ+PC-1600K本体の2段構えでCP/M80起動を試していたわけだが、どうしてもエミュレータと同じ動作にならず困惑した。

もっとも多かったトラブルが「スタック領域が足りない」というものだった。

 

CCPやBDOSがどのくらいのスタック領域を用意しているのかが分からない上に、スタックが破壊されるバグは、後々になって動作が変になる現象が出るため、非常に追いづらい。実験をしてみた結果、どうやらCCP、BDOSでは数バイト程度のスタックしか用意されていない感じだ。CP/M80という非常に軽い(軽快という意味)OSから呼び出す、PC-1600Kという非常に多機能なIOCSを呼び出すにはスタック不足になってしまうらしい。その結果、スタック付近のプログラムを破壊してしまい、後に動作が変になる…という症状だった。

 

おかげでIOCSコールをする部分にはすべてスタックを別途用意するコードを入れねばならなくなったため、さらに処理が重くなった(^^; 同様に割り込みでも同じ問題が起こる事が予想出来たため、割り込み処理の先頭にもスタックの設定をするコードが入った。うむむ…重いぞw

f:id:PocketGriffon:20210501112606j:plain

 

CP/M80の事を書いていると、テキストばっかりになってしまい、読んでる側もつまらないだろうなぁ…と思う(^^; 

一時期、文豪を活用するためにCP/Mの本を買いまくってた時期があった。そのため、私の手元にはCP/Mの本がとても沢山ある。まさか令和の時代になってまで大活躍するとは思っていなかったw

 

次回、増設メモリを用いたRAMディスクの話をしつつ、この先どうしていこうかの話を書いて終わりくらいだろうか…。MBASICが動いたことでちょっと安心してしまった自分がいる(^^;

 

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

SHARP PC-1600KでCP/M80!その2

CP/M80のPC-1600Kへの移植!

その後も少しずつ進めていて、標準コマンドはだいたい動くようになったかな?というところまで来た。

f:id:PocketGriffon:20210429092508j:plain

DDT(デバッガ)が起動した時の画面↑

 

このブログでは、PC-1600K上でどのようにしてCP/M80を動かしているのかを、自分の備忘録も含めて書いていこうと思う。

 

先に正直な事を書いてしまうと、PC-1600K自体がCP/M80を起動するだけの能力を備えているので出来ているのであって、ソフトウェアで頑張って動かしました…という事で無かったりもする。当然、PC-1600Kを開発された方はCP/M80の移植も想定していたんだろうな…と思う(^^) 実際にやるかどうかは別として!!(^^;;

 

PC-1600K CP/M80のメモリサイズ

先日のブログで、大体のCP/M80イメージを固めた。

SHARP PC-1600KでCP/M80!その1 - レトロパソコンであそぼう!

この中で「IOCSを利用する」と決めた流れがあったが、これにはもう少し制限が加わる事になる。IOCSはメモリ中のF000h〜FFFFhをワークエリアとして利用する。この部分は詳しく調べられていないため、どこを壊して良いかなどの情報を持ち合わせていない。そのため、この領域は「触らない部分」として残す必要がある。

 

ところで…良くCP/M80の記述を見ていると「xxK CP/M」などの表記がある。「48K CP/M」「64K CP/M」とか、見た覚えがあると思う。このメモリサイズがどうやって決まるのかが気になっていた。

 

CP/M80の事について書かれた本は数あれど、私は移植する際にはこの本を活用している。

f:id:PocketGriffon:20210429095434j:plain

2014年にCP/M80が動くエミュレータを書いた際にもとても参考にした。

この本に、こんな記述がある。

f:id:PocketGriffon:20210429095548j:plain

CCPの先頭番地…というのが、実際にCP/Mシステムを置くアドレスを指しているのだが、このアドレスから始まるシステムであればCP/Mのサイズはこう名乗って良い…という感じだ。

なんとなく…このCP/Mで「使えるメモリサイズ」ではなく、このCP/Mが「動いているシステムのメモリサイズ」を表しているような気もする。

 

今回のPC-1600K CP/M80はCCPアドレスがC400hから始まっている。ということは56K CP/Mと名乗っても良いのかな…と思い、オープニングタイトルに56Kと書いた!

 

64KBオールRAMメモリマッピング

ここを詳しく書いていくと技術書並の情報量が必要になってしまうので、とても簡潔に済ませてしまおうかと思う(備忘録にはなる程度にw)。

 

PC-1600Kで64KB全体をRAMにするためには条件がある。

PC-1600Kをひっくり返して裏を見ると、拡張モジュールを取り付ける部分に「S1」「S2」と刻印がある。これがスロット1と2の事だ。

  スロット1に16KB以上のメモリモジュール

 スロット2に32KB以上のメモリモジュール

上記の拡張ハードウェアが必須。これが64KBオールRAMの最低条件。

PC-1600Kで良くある構成の、スロット1にCE-1600M、スロット2にCE-1650M(文節変換辞書)が取り付けられている人は、残念ながらアウトだ。

f:id:PocketGriffon:20210429101936j:plain

↑頑張って上記のどちらかを手に入れよう!

 ※たとえCE-1600Mを2つの構成にしたとしてもCP/M80は動かない(この辺りは後のブログで紹介)。

 

PC-1600Kはメモリマッピングがスロット1とスロット2で別々に設定出来る。ここの設定が非常にややこしい。

PC-1600Kデータブックに以下の記述がある。

f:id:PocketGriffon:20210429103019j:plain

これはスロット1の事を書かれた図なのだが、残念ながら誤植がある。

図2-63のA=1とA=0、これが左側のパラメータに書かれている言葉と図が逆になっている。これは書かれている文章の方が正しい。図のA=1とA=0を逆にして読む。

私が所有している本が初版だからかも知れないが、直ってる版を持っている人は当たりかもw

64KBマッピングではA=0(ややこしいが図の上、A=1と書かれている方)を利用する。

これでスロット1のαのメモリがバンク0の8000h〜BFFFhに見えるようになる。

 

スロット2の方はこちら。

f:id:PocketGriffon:20210429103441j:plain

これも…スロット1の図と同じα/βの記号が使われてしまっているため分かりづらい(ToT) 図だけを見た時に何を意味しているのかが理解出来ない。この図は「スロット2のメモリがメインメモリのどこに割り振られるのか」を示している。

 

こちらはA=02hを使用すると、条件的には上の図が採用される事となる。

これでバンク1の0000h〜7FFFhにスロット2のメモリが顔を出す。気をつけなければならないのは、メモリのβ側が0000h、α側が4000hから見える。なんとなく気持ち的には逆なのだが、そういうモノらしい(-_-;

 

上記の設定に加えて「メモリ空間にマッピングされるバンク設定」をする。

f:id:PocketGriffon:20210429105259j:plain

0000h〜3FFFhはバンク1(スロット2のβ)

4000h〜7FFFhはバンク1(スロット2のα)

8000h〜BFFFhはバンク0(スロット1のα)

C000h〜FFFFhはバンク0(標準搭載のメモリ)

ということで、I/Oポート31hには0_000_001_1b(つまり03h)を出力する。

 

これで64KB全てがRAMになる!

 

……と思ったら大間違いだった。

いや概念的には正しいのだが、これだけではダメだった。

IOCSのプログラムが置いてあるアドレス空間が切り替わってしまうため、メモリマッピングを変更した瞬間に暴走しちゃうのだ。そりゃそうだ!(ToT) 

これを回避するためには、IOCSのプログラムをメモリマッピングの影響のない領域、具体的にはC000h〜FFFFhに移動させる必要がある。これはもうIOCSのプログラムを解析して移植するしかない!(TOT)

ここまででようやく64KB全ての空間がRAMとなった。結構めんどい(T-T)

 

IOCS呼び出し

ちなみにこの状態ではCP/M80からIOCSを呼び出す事が出来ない。上にも書いた通り、IOCSのプログラム自体が見えなくなっているからだ。

IOCSを呼び出す際には、PC-1600Kが起動された時の状態にメモリマッピングを戻す必要がある。そのためにマッピングを切り替える前の状態を記録しておく必要がある。

実験した結果、I/Oポート31hは直接読めるようだが、スロット1、2のマッピングを切り替えるI/Oポートは読めないようだった。ワークエリアに保存されている値を見つける事が出来たため、それを利用することに。

 

Z80割り込み

さらに割り込みをONにすると不安定…というか、暴走するけれどもタイミングが一定ではない…という、割り込みにありがちな問題が出た。これも割り込み先のアドレスがなくなるために起きる問題だ。

 

PC-1600Kデータブックによると、割り込みはZ80のモード2を利用しているらしい。モード2の割り込みって珍しい気がする…。何度と無くZ80エミュレータを書いた事があるので、それぞれの割り込みについて動作も理解しているつもりだが、モード2って誰が使うんだろう…と思いつつ実装をしていた(^^;; まさかここで遭遇するとはw

 

モード2割り込みはちょっと理解が難しい。Z80のIレジスタに上位8ビットを設定、周辺機器(I/Oポート)に下位8ビットを設定する。割り込みが掛かるとPCレジスタに「Iレジスタ*256+周辺機器から送られてきた値」が代入される。もうこの時点でワケ分からん…となるだろう(^^;;

 

割り込みの処理もIOCSを解析し、似た処理を自前で書くこととなった。具体的には割り込みが掛かった時点でメモリマッピングを元に戻し→割り込み処理→64KB RAMへ戻す、という事をしている。割り込み処理自体が重くなってしまったのは心配だが、なんとか動いてる。

 

なんとなく文章ばかりになってきて読む側もつまらないと思うので、今回はここまで!

次回はCP/M80のブート、BIOSの書き方などをご紹介する予定!(^-^)

 

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

SHARP PC-1600KでCP/M80!その1

すでにTwitterでご報告した通り、PC-1600KでCP/M80が起動した!

f:id:PocketGriffon:20210426224444j:plain

 

本当に起動しただけのハリボテ状態なので、まだ発表するべき時期では無かったのかも知れないが、画面が出たのが嬉しくてツイートしてしまったw

そして今日は「出先に1MBのメモリを忘れてきた」という事情で作業が進まないため、ここまでの作業報告も含めてつらつらと情報を書いてみたい!

 

なぜCP/M80なのか!?

Bad Apple!!の開発検討している時に、メモリマップについて詳しく調べてみたら、どうもこのPC-1600K、オールRAMにする機能があるらしいと気がついた。

特にBad Apple!!を作る上ではオールRAMの必要がないので頭の片隅に置いてある程度だったが、64KBオールRAMに出来るんだったら何かできそうだなぁ…と感じていた。

 

まずぱっと思ったのが、CE-1600Fとの組み合わせでCP/M80を立ち上げる事だった。ただ、ディスクが片面64KBという記録容量なので、あんまり凝ったことは出来ないな…とも思った。

そしてCE-1600Fは標準では1セクタが512バイトであり、1セクタ128バイトのCP/M80とは少しだけ相性が良くない。その辺りの差をBIOSで埋めていけば出来なくはないけど…うむむ…

 

2014年8月、いきなり「CP/M80で遊んでた"あのゲーム"をやりたい!」という動機だけで、Z80エミュレータをスクラッチから書き、その上でCP/M80を動かした。当時の開発日記があり、それを見るとコードを0から書き始めて、6日後にはCP/M80が起動していた!若い頃の自分すげーw

この時の作業で、CP/M80の内部構造は相当なレベルで詳しくなっていたので、OSの移植については気持ち的な敷居が低い状態だった。

 

そんな事を心に秘めていたところに1MB増設メモリの話が立ち上がってきた。なんか頭の中でいろんなもののピースがパチっとハマった!これは…作るしか無いでしょう!!Bad Apple!!が終わったらCP/M80の移植をやってみよう…と心のなかで決めたw

 

CP/M80を移植するための具体的な検討

まず、CP/M80自体は64KBのオールRAM空間が必要というわけではない。世の中には20KB CP/Mなどもあるらしいので、起動させるだけならば32KBもメモリがあれば起動はさせられる。しかし何か有名なソフトを動かそうとした場合は、48KBくらいのメモリがないと厳しい現実がある。

せっかくなのでPC-1600Kの機能を最大限に使ってオールRAMのCP/Mを立ち上げてみよう。

ここで決まったのは「メモリは64KBオールRAMで動かす」という事。

 

次にPC-1600Kが持っているIOCSを使うかどうか。

実は64KBオールRAMとIOCSの使用というのは非常に相性が悪いのだ。PC-1600Kは標準では0000h〜7FFFhがROMの状態で動くようになっている。IOCSが呼び出されるたびにメモリの状態をROMに戻して呼び出すような仕組みが必要になる。MSXのインタースロットコールみたいなもん??

 

PC-1600Kのような巨大なシステムを持っているマシンを、全て乗っ取って独自にコードを書くのは容易では無い。出来なくないけど、ここは「しない選択」をしたいw 用意されてるものを積極的に利用して、まずは動かす事が大事だ。

ここでは「IOCSの機能を利用する」と決めた。

 

CP/M80は割り込みがなくても起動する。以前スクラッチから開発したCP/M80システムでは割り込みをサポートしていなかった。だが…今回はIOCSを使うと決めた流れがある。IOCSの中には割り込みで処理される事を大前提としてるサービスもあり、割り込み自体を止めるとPC-1600Kというシステム全体が破綻する可能性がある。停めてパッチを当てまくるくらいなら、割り込みはそのまま使う方向で、どうやったら動かせるかを検討した方が良い。

というわけで「割り込みを使う」と決めた。

 

そしてディスクについてはCE-1600Fの利用をすっぱり諦めた。1MBの増設メモリがあれば、そこにRAMディスクを作りファイルを書き込んでいく方が遥かに実装が楽ちん!最終的にはイメージを書き込めば自動実行…なんて芸当も出来るかも知れない!

ディスクは「RAMディスクのみの運用とする」とした。

 

表示について、標準では26桁×4行しか表示が出来ない。BIOSを拡張して表示フォントを変えたり仮想画面を用意して80桁x24行を実現したりも楽しそう。

だが…果たしてPC-1600Kの画面でワードマスターやTurbo Pascalなどを動かしたい人がいるのだろうか(^^;; 動いたらこっけいで楽しそう…は同意するけど、そこに達するまでの労力がすごそうw 私としてはM80やBDS Cが走る方が興味ある!

表示についてはIOCSのサービスを利用して、当面は何も考えないでおこう。

画面は「26桁x4行の標準サイズのみをサポート」とする。

 

構想としてはこんな感じ(^-^)

これから少しずつ実装について書いていこうと思う。

 

今日のところはこのへんで!

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

HC-80のデモンストレーションプログラムを実行してみた!

今回はHC-88でデモンストレーションテープを実行してみた的なお話(^^)

 

f:id:PocketGriffon:20210420004358j:plain

ずっと手元にあったんだけど、思えば一度も実行したことがなかった。HC-88を手に入れた時はテープドライブが壊れていて、読み込ませる事が出来なかったので放置してたのだ。

一連の修理の流れでテープドライブを直す事が出来たけれども、通常運用でテープを活用する事が無かったので、すっかりデモテープの存在も忘れてしまっていた。

 

先日のHCシリーズを紹介するブログを書いた流れで、ようやく思い出した(^^;

まずは修理して以来使っていないテープドライブが動くのか…だ!←ここから?

 

f:id:PocketGriffon:20210420005230j:plain

……なんだろう、このロボットにでも乗り込んだ感は!?(^^;;;

コクピットで操縦でもしそうな感じがするw

そう思えばテープの穴が目に見えてきた!!(そろそろやめる…

 

先日HC-40用のドライブを修理した事で、すっかり忘れていた操作も思い出した!

まずはmountだ。テープドライブをmountすることでFAT部分メモリに読み込むようだ。そしてその後のアクセスはメモリを介してテープの位置を探る…みたい。頭いい!

f:id:PocketGriffon:20210420005606j:plain

どうやらテープには4つのプログラムが入ってる模様。DEFINE.BAS、JACK.BAS、BIO.BAS、TIME.BASだ。なんとなく中身が想像出来るけど…全部見てってみよう!

 

DEFINE.BAS

なんとなくCLOADってやりたくなるけど、ここはLOAD "H:DEFINE.BAS"だ。

テープドライブはHに割り当てられている。ファイルディスクリプタでH:を指定しつつ、ファイル名をつけてやれば、そこまで巻き戻し先送りして読み込んでくれる。テープカウントを気にしなくても良いのは本当に楽ちん。

ん?ということは、初めて使うテープはフォーマットする必要があるって事か…。まだ試したことがないので、いつかやってみよう。

HC-40のマニュアルを見たところ、DIRINITという操作が必要らしい。なるほど…。

 

で、無事にロードする事が出来た!LISTしたらちゃんと見れた。

私の中でのカセットテープの信頼度が爆上がりだ!(^^)

f:id:PocketGriffon:20210420011317j:plain

どうやらDEFINE.BASはキャラクタ定義をするプログラムらしい。デモというかツールというか。HCシリーズのBASICにはプログラマブルなPCG機能があるようなので、それを使うためものだろう。最初からメーカーがこういうツールを用意してくれるのはありがたい(^-^)

f:id:PocketGriffon:20210420012353j:plain

f:id:PocketGriffon:20210420012413j:plain

操作は当時らしいカーソルキーで移動、SPACEまたはRETURNでセットorリセットするみたい。うむむ…当時同じようなツールを何度も作ったことがあったけど、今使うと結構大変だ(^-^;;

 

JACK.BAS

名前から想像するにBLACK JACKというトランプゲームかなーと予想。

f:id:PocketGriffon:20210420012453j:plain

全然違ったー!(^-^;

カジノっぽいゲームらしい?

f:id:PocketGriffon:20210420012607j:plain

画面が2つに分かれて……2人対戦???

f:id:PocketGriffon:20210420012440j:plain

んーと……どうやら画面右にある図と同じになるように、ハノイの塔のような解き方をしていくモノらしい。ゲーム?パズル?しかも図を合わせても何も画面に変化なく、次の図が表示される…終わらないこれ(^^;;;

 

BIO.BAS

もうこれはバイオリズムで決定でしょ!(^-^)

結構長めのロードの後、タイトルが表示された。

f:id:PocketGriffon:20210420012912j:plain

f:id:PocketGriffon:20210420012943j:plain

「B.I.O.P.H.Y.T.H.M」と表示されて、それを横切るようにラインが引かれ始めた!

f:id:PocketGriffon:20210420013043j:plain

こうなって…もう1周回ってからでないと先に進まなかった!(^-^;

そして年号を昭和で入れろと出た!(^^;;;

今って昭和何年??(昭和94年らしい)

f:id:PocketGriffon:20210420013319j:plain

私の調子は要注意らしい!!

このバイオリズム、昔はほとんどのマシンでプログラムがあった気がする!(^^)

 

TIME.BAS

そして最後のTIME.BAS。世界時計でも表示してくれるのかも知れない!しかもアナログ時計で!

f:id:PocketGriffon:20210420013618j:plain

…テレビとラジオの番組予約…というか、備忘録的なメモツールらしい(^^;

入力したデータをテープまたはRAMディスクへ保存できるっぽい!便利なのか?便利なのかこれは??

今日の番組をぽちっと。

f:id:PocketGriffon:20210420013829j:plain

そうか、毎週予約したりするのを見られるって事なのかも!ちなみに私はテレビ録画したことがない…というか自宅にテレビがないので、そういう機能を使ったことない(^^;

おかげでプログラム出来るけど機械オンチだったりする。

f:id:PocketGriffon:20210420014017j:plain

この番組予約、かなり長いプログラムだった!

 

結局…デモテープというよりは実用プログラムが入ってたって事かも?

もっと店頭デモみたいのを期待してたんだけど、ちょっと違ったみたいだ!(^^;

 

テープはもう1本ある。

A面が「日本語外字定義プログラム」、B面が「タッチ16トレーニングプログラム」だ。

f:id:PocketGriffon:20210420014735j:plain

f:id:PocketGriffon:20210420014755j:plain

こちらは普通に想像が出来るので、まぁいいかなって気になってしまった(^^;

リクエストあれば試してみようと思う!

 

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

 

EPSON HCシリーズをまとめてご紹介!

ワケあって自宅を片付けている。大掃除というよりは大片付け(^^)

部屋の奥の方からいろんなものが発掘されているんだけど、HCシリーズが意外にも?たくさんあるなぁ…と思ったので、まとめてご紹介ブログにする!ネタが無いわけじゃ……な…いと思いたい(どっち

 

HC-20

f:id:PocketGriffon:20210418165557j:plain

雑誌で広告を見た時には「ビジネス機?」という印象しかなかった。その後、お店で実物を見てベーマガに載ってるソフトを見て、なるほどゲームでも使っていいのね…って感覚に変わった覚えがある。ただ、当時の感覚では高かった!安売りしてるFM-7やPC-8001mkIIよりも高かった印象。カセットとプリンターが付いてると言っても、とても手が出せなかった。

 

手元にあるHC-20は何年か前に手に入れたもの。なにげに電源を入れてみたら起動しない!なんと(TOT) ……と思ったけど、HC-20って電源繋げて少し内蔵バッテリーを充電してあげないと起動しないっぽい。また壊してしまったのかと焦ったw

f:id:PocketGriffon:20210418183235j:plain

CPUは6301で、私の中ではHC-88やJR-800でおなじみな気持ち。いつかプログラミングしてみたいと思ってる。でもそうなったら増設メモリ欲しくなっちゃうなー(-_-; そんなでっかいプログラムは組まないと分かっていても!

 

f:id:PocketGriffon:20210418170748j:plain

モニタへ出力する周辺機器もあるけど使ったことがない。そもそも映せるディスプレイを持っていない気がする(^^; HC-20が動くようになったら試してみたいと思う。

 

f:id:PocketGriffon:20210418220356j:plain

ロール紙は確か10箱くらいあった気がする…。インクリボンも大量にあった気がするけれども、まだ発掘されていない。見かけたらここに追加しようと思う(^-^)

 

f:id:PocketGriffon:20210418184127j:plainf:id:PocketGriffon:20210418184146j:plainf:id:PocketGriffon:20210418184207j:plainf:id:PocketGriffon:20210418220651j:plain

f:id:PocketGriffon:20210419224438j:plain

書籍はちょこちょこと集めてる。関連書籍を一箇所に集めてなかったので、何がどこにあるのやら状態(T-T) 整理整頓の流れで集めていこうと思う!

f:id:PocketGriffon:20210418184931j:plain

プログラミングするのなら↑この本がオススメ!マニュアルに書いてある事から書いてない事とか、モニタの使い方、マシン語の使い方などなど。ゲームプログラムなども載ってて情報量が半端ないです(^-^)

f:id:PocketGriffon:20210418215922j:plain

 

HC-40

f:id:PocketGriffon:20210418192916j:plain

f:id:PocketGriffon:20210418192951j:plain

お気に入りマシンのHC-40!

ラップトップマシンとしてはかなり素直な構成になっていてプログラミングがしやすい。根底にあるCP/M80というOS、その上に素直に載っているBASIC、メモリマッピングされているVRAM、バイナリファイルをロード可能などなど。きっとハード部隊とソフト部隊が連携して開発したんだろうなーと想像(^-^)

 

f:id:PocketGriffon:20210418194137j:plain

HC-40はマニュアルが充実してる!特にオペレーションマニュアルは技術資料としても役に立つほど(^-^) 昔のマニュアルって詳しかったんだなーって思う。

CP/Mの使い方も詳しく書かれているので、別途入門書を購入しなくてもOK!

 

f:id:PocketGriffon:20210418194324j:plain

……この本、ホントにHC-20の同タイトルと同じ筆者なんだろうか汗 単なるBASICマニュアルになっちゃってて残念です。表紙に印刷されてる情報が1番技術的という謎(^^;

f:id:PocketGriffon:20210418195025j:plain

↑HC-40の箱

EPSON HC-40 分解修理したよ! - レトロパソコンであそぼう!

HC-40のバッテリーを新品に! - レトロパソコンであそぼう!

HC-40にRS-232Cケーブルを繋げた! - レトロパソコンであそぼう!

HC-40でプログラム開発してみた! - レトロパソコンであそぼう!

HC-40でプログラム開発してみた その2 - レトロパソコンであそぼう!

HC-40でメモリダンプ! - レトロパソコンであそぼう!

HC-40でプログラム開発してみた その3 - レトロパソコンであそぼう!

HC-40に64KB RAMカートリッジを取り付けた! - レトロパソコンであそぼう!

 

HC-45

f:id:PocketGriffon:20210418195231j:plain

HC-40シリーズを使ってみたいと思ったら、ぜひHC-45をオススメしたい(^-^)

とっても使いやすいHC-40を、さらに進化させたのがHC-45なのだ。

良いとこ取りをしたマシンだと思ってもらったら大体あってる。

 

従来のメインメモリ64KBに加え、RAMディスク用のメモリが128KB載っている。単純に増えただけではあるけれども、CP/MのTPAが増えるメリットがある。

f:id:PocketGriffon:20210418201423j:plain

↑55.5K CP/M!これだけTPAがあれば動かないソフトはないだろう。

そして増設された128KBのディスクにM80/L80/DDT辺りを入れたら超便利!

HC-40でもRAMディスクのサイズを0にすればTPAは増えるけれど、RAMディスクが使えなくなってしまうのはイタイ!別途RAMカートリッジなどが無ければ辛いかも。

 

ちなみに技術資料は基本的にHC-40と同じものが使える。コレも嬉しい!

HCシリーズの中では一番のお気に入りマシンだ(^-^)

EPSON HC-45 (PX-4+) - レトロパソコンであそぼう!

EPSON HC-45(PX-4+) メンテナンス - レトロパソコンであそぼう!

f:id:PocketGriffon:20210418204010j:plain


HC-80/88

f:id:PocketGriffon:20210418204805j:plain

このブログではおなじみとなったHC-88。

液晶をPX-8と交換してしまったので「HC-88」とは印刷されていない(^^;

本来裏に日本語ユニットが付いていて、漢字ROMとか日本語変換をサポートする…のかな?実は漢字表示をほぼ使ったことがない(HC-88なのに!)

 

HC-80/88はメインCPUのZ80Aに加え、サブCPU(説明ではスレーブCPUとなっている)に6301が使われている。6301はHC-20でも使われているCPUで、HC-80/88ではZ80よりも低い動作周波数で動いてる。

そして…なぜか大量データを扱う画面制御が6301担当となっている…。そしてサブCPUにプログラムを送り込んで実行する事が出来るという……。なんとなくFP-1100を彷彿させるマシン構成だ(^^;

 

そんなアンバランス構成が妙に気に入って、ものすごく精力的にプログラミングしてた時期があったw

ここにリンク貼ろうと思ったけど、沢山ありすぎるので「HC-88」で検索してもらいたい!手探り状態から始まり、6301アセンブラを開発したりして、最終的にはサブCPUへプログラムを送り込んで実行までさせている。

HC-88メンテナンス その1 - レトロパソコンであそぼう!

HC-88でプログラミング! その1 - レトロパソコンであそぼう!

f:id:PocketGriffon:20210418225021j:plain

 

PX-8

f:id:PocketGriffon:20210418224128j:plain

海外版のHC-80だ。基本構成は同じだと思うけど、BASICのコマンドが一部違う。HC-80は(40もだけど)ROMカプセルという概念で本体裏側にROMを取り付けて拡張出来るようになっている。このおかげで本体を大きく変更しなくてもBASICの仕様を変更出来たりする。

 

液晶のパネルにHC-88と書いてあるが、これはパネルをHC-88と入れ替えてしまったため。とても紛らわしいのでいつかちゃんと直したい(^^;

 

キーボードがHC-88などとは違っていて、変換/無変換などのキーはない。かと言って完全な英語版というわけでも無く、アスタリスクの位置などは日本語キーボード仕様となっている。この辺りのこだわりがよくわからない…汗

f:id:PocketGriffon:20210418224652j:plain

FDD本体もあるけど、ものすごく重くて取り出す気力が無かったw

 

-----

 

これだけEPSON HCシリーズを所有しているコレクターはめったにいないだろう(^^;

そもそもなんでHC?って疑問には私にも答えられないw

マイナーダイスキーな心を揺さぶられているんだろうとは思うけれども。

言っとくけどPC-9801PC-8801も所有してるからね!メジャーもあるよ!!

 

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