2019年5月31日金曜日

AKI-80 CPM box の 製作 (3)

 5月に入って、長期連休だとか、やれ令和だとか言っているうちにもう月末です。それこそ「ボーット生きてんじゃ、、、、、」なんて誰かさんに怒られそうです。

 気がついたら今月はまだ何もブログにアップしていません、、、、ということで前回からの続きでソフトについて少し触れておきたいと思います。

 わたしのシステムは基本的にリセットで立ち上がった後はモニタモードから始まるようになっています。
 左の上半分がモニタのヘルプコマンド でヘルプ・メニューを表示した様子です。

 下半分は、Z コマンドでバンク1(オールRAM)メモリ上にグラントさんのモニタをロードし、そこから ROM BASICMicrosoft BASIC 4.7)を立ち上げた様子を示します。

 このモニタは手作りで、コマンドをひとつずつ増やしていったものですが、使い勝手は別にして、モニタつくりはマイコンやプログラムを理解するには格好の題材になります。

これらコマンドのうち、は必須と言ってよく、たとえばCP/Mの構築にも大きな力を発揮します。

 今回構築したものは著名な Grant Searle さんのホームページにある「 CP/M on breadboard 」からの移植です。

 氏の記事は少し古いとはいうものの、Z80を使ったCP/Mシステムでは現在でも必ずと言っていいほど参照されています。

 また日本でも、氏のシステムを移植するための記事がインターネットにも見受けられ、私も大いに参考にさせていただきました、感謝です。
1.Tomi9さんのブログレトロな雰囲気」にあるAKI80PlusCF技術資料
2.Kuninetさんの github Z80_CF


 CP/Mの構築は、過日の私のブログ、Z80 SBCへの CPM 搭載(3を参照いただければと思います。

 右の図は今回構築するCP/Mのメモリ・マップですが、CCP( D000H- )、BDOS( D806H- )、BIOS(E600H-FFFFH )を CF(コンパクト・フラッシュ・メモリ) 上の Disk A: 0 sector に書き込んでおき、CP/Mをスタートする際には、モニター上のCPM_LOADプログラムでCF 上の Disk A: 0 sector に書き込んである前述のCCP+BDOS+BIOSを 0000H - FFFFH のRAM上の D000H - FFFFH に読み出し、BIOSからCP/Mをスタートさせることになります。

 したがってCP/M構築のために必要なファイルは、、、
   CPM22.ASM (CCP+BDOS)
   CBIOS128.ASM
   FORM128.ASM
   PUTSYS.ASM
で、これらは Grant Searle さんのホームページにある「 CP/M on breadboard 」から得られます。
 また、CPM_LOAD.ASM はDIYです。
 そしてこれらのファイルをアセンブルするためには TASM が必要となりますが、これも Grant さんのホームページで得られます。

CPM22.ASM (CCP+BDOS) は修正無しで使えます、同梱されている CPM22.HEX をそのまま使ってもいいです。

 今回の AKI-80 CPM box に使用している AKI-80 ボードは、甚だ便利なのですが、搭載されている周辺チップのI/Oアドレスがすでに決まっており、変更することが出来ませんので、ソフト側でそのアドレスを変えてやる必要があります。

 CBIOS128.ASM
 このファイルでは、まず左図の上方にあるシリアルポート・アドレスを変更します。次いでCTCの行を追加し、その下の重複しているCFレジスターのアドレスも変更します。















 さらに右図(クリックで拡大)のように、
   LD A,$01
   OUT ($38),A

; Interrupt vector in page FF
   LD A,$FF
の間にある部分を右図に示してあるように追加変更します。

FORM128.ASM
 このプログラムはCFカードをフォーマットするためのものですが、CFレジスターのアドレスのみの変更でOKです。

PUTSYS.ASM
 これも同様にCFレジスターのアドレスを変更します。
 また前述のようにオリジナルではCCP+BDOS+BIOSを D000H から、、、に置き、CFカード上の Disk A: 0 sector に書き込むようになっていますが、私のモニタは FE00H あたりを作業領域に使っていますので、不都合ですので、CCP+BDOS+BIOSを 6000H から、、、に置くことにしましたので、ファイル冒頭の
loadAddr .EQU 0D000H を loadAddr .EQU 06000H に変更します。

CPM_LOAD.ASM
 本来は Grant さんのモニタプログラムをそのまま移植すればいいのですが、私にはまだ理解できない部分があるのと、冒頭写真のように多機能で使い慣れているマイ・モニタも捨てがたく、 Grant さんのモニタプログラムから
; CP/M load command の部分を取り出して私のモニタに組み込みました。
 
 特に留意したところは、以下の太字部分の変更です。
; Start CP/M using entry at top of BIOS
; The current active console stream ID is pushed onto the stack
; to allow the CBIOS to pick it up
; 0 = SIO A, 1 = SIO B
ld A,(00H) ; primaryIO  0=SIO A
PUSH AF
ld HL,($FFFE)
jp (HL)
 以上のファイルを MSDOS 上で TASM でアセンブリし、
CPM22.HEX
CBIOS128.HEX
FORM128.HEX
PUTSYS.HEX
CPM_lOAD.HEX            の intel hex File を得ます。

 次に CPM22.HEX を 6000H スタートに、 CBIOS128.HEX を 7600H スタートに変更します。

 あとはモニタコマンドの L ( intelHEXfile  LOAD )をつかって Grant Searle さんのホームページにある「 CP/M on breadboard 」にしたがってインストールして出来上がりです。

 しかしながら、いきなり右上写真のようになったわけではありません。

 パソコンと AKI-80 CPM box の間でファイルをやり取りするのが難問で、「鶏と卵」のようなものでした。PCGET、PCPUT は 8251 のシステムではうまくいったのですが、今回はNGでした。

 いろいろ試した中で、XMODEM.COM なるプログラムの中から(ネット上に多くのものがあります、、、)何とか動くものを選別して使っています。

 パソコン上の MSDOS 上で XMODEM.COM → XMODEM.BIN  XMODEM.HEX ( 0100H start ) に変換し、モニタコマンドの L ( intelHEXfile  LOAD )をつかって AKI-80 CPM box に読み込みます。

 ついで、X コマンドでCP/Mを立ち上げ、ただちに A>SAVE 17 XMODEM.COM を実施し、Aドライブに XMODEM.COM ができました。

 これで高速に、パソコンと AKI-80 CPM box の間でファイルの交換ができるようになりました。プログラムの開発は、主にWINDOW上でおこないますのでこの環境はありがたいです。    

 かなり走って説明しましたが、何せ私自身まだ十分理解できていない点が多いので、間違いなどはご容赦ください。

 最後になりましたが、Tomi9さん、Kuninetさん ありがとうございました、さらには偉大な Grant Searle さんに感謝いたします。