ライブラリー再掲2018年09月29日 20:52

先に公開したファイルを見ていて、中途半端な感じがしているので、 再構成して再公開する事にした。

ますは、 CPMLIB.ZIP(6,381Byte)。 これには、トランジスタ技術で紹介されたプログラム群を収めた。ソースコードは著作権のこともあるので、 収録を見送った。CPMLIB.RELはモジュールライブラリーである。これをリンクしてご利用下さい。 また、CPMLIB.INCにインターフェースを纏めておいたのでご参照下さい。

お次は自作ライブラリー集、STRLIB.ZIP(5,925Byte)(これは発展途上中)。インターフェースをソースコードに書き込んだので、ご参照下さい。

最後に、サンプルプログラム。 SAMPLE.ZIP(5,925Byte) CPMLIBやSTRLIBの使用例としてご参照下さい。

CP/Mプログラミング三昧2018年09月22日 09:20

自作CP/MマシンTRN-8が快調に動くようになり、この所TRN-8にどっぷりとはまっている。 過去に作成したファイルを収めたディスケットを調べてみると、保管状態が良くダメージを受けずに ファイルを取り出せた。その中にはトランジスタ技術 1984年8月から1985年7月に連載された 藤井敦氏の「CP/Mを使いこなすために 初心者のためのアセンブラ入門」に掲載されたプログラム集が あった。当時の記事の切り抜きも見つかった。

この連載では、

  • プログラムの開始、終了関連モジュール
  • コンソール入出力関連モジュール
  • 16ビット演算モジュール
  • ファイル入出力関連モジュール
  • 応用プログラム
などが紹介されている。

これらのモジュールを眺めてみると、結構よく使う機能を網羅しているが、 コマンドライン引数取得関連のモジュールがない。コマンドライン引数でオプションを プログラムに引き渡すことは日常上茶飯事に行うことなので、このモジュール"GETARG"を作成する事にした。

  • 引数は、ブランク、タブ、コンマで区切る。
  • ダブルクォート又はシングルクォートで始まる引数は、次に同一の文字が現れるまで一塊として取り扱う。
  • "\"に続く文字列はエスケーブシーケンスとして解釈する。現在のところ、\\(エスケーブ文字自身)、\t(タブ)、 \xHH(16進数)をサポートしている。
      例えば、echoコマンド。
                c>echo     one   "two  and three" and\tmore
      
      とすると
                ONE TWO  AND THREE AND  MORE
      
      と表示する。文字はCP/Mが大文字に変換してしまう。ターミナルプログラムがVT-100やANSIターミナルを サポートしていれば、画面のコントロールもできる。
                c>echo \x1b[2J
      
      とすれば、画面が消去される。また、
                c>echo \x1b[1;1H     (<===すみません。"H"が抜けていました。)
      
      とすれば、カーソルが1行目の1カラムに移動する。echoは、改行するため2行目にコマンドプロンプとが表示される。

      関連ファイルは、これです。ご興味のあるかたはご覧ください。

      getarg.zip (8,254Byte)
      
      使用したツールは、以下のとおり。
      • アセンブラ Z80ASM(SLR Systems)
      • ライブラリアン SLRIB(SLR Systems)
      • リンケージエディタ SLRNK(SLR Systems)
      それに、エディタはCP/M標準のEDである。

      プログラミングは面白い。

CP/Mマシン復活2018年09月06日 17:49

TRN-8

この4ヶ月間、改造と称して破壊してしまったCP/Mマシンの復活に注力してきた。 そしてパワーアップして復活した。

このCP/Mマシンは、吉田幸作氏がトランジスタ技術 1989年4月から1990年3月の期間 「作りながら学ぶマイコン設計講座」と題した連載記事で紹介された物。 CPUカードのみならず、ROMライター、PALライターを含む。 プリント基板やROM、CP/M等の配布サービスを利用して組み上げた。

主な構成は、

  • CPUは、日立のHD64180
  • システムROMが32KB、RAMが256KB
  • 3.5インチFDD2台と8インチFDD1台に192KBのRAM DISK
  • コンソールをつなぐRS-232-Cポート
  • OSはCP/M 2.2でTPAは63KB
  • ROMライター(これは完成していない。完成していれば、もう少し楽ができたはず)
  • PALライター(気合いを入れて制作。でも今や時代遅れ)
であった。CP/Mが動くので、JUGのS/W配布サービスでS/Wを入手して楽しんだ。

修繕する所は、

  • CPUカード上のパターンカットした部分を修復。
  • システムROMを新規作成。これにはBoot Loader/CBIOS/ROMBIOS,CP/MのCCP/BDOSが入っている。
  • 8インチFDDインターフェースカードを作り直し。修復では対応できないほど破壊していた。
である。

CPUカードの修復は、パターンカットをしたところと回路図を見比べながら修復。これはすぐに完了した。

システムROM中のBoot Loader/CBIOS/ROMBIOSは、記事中にリストが掲載されているので間違いなくキーインすれば、 できあがるはず。CCP/BDOSはCP/Mは、 The Unofficial CP/M Web Siteで、ソースを入手できた。 素材がそろったが、ROMの特定の位置にそれぞれを書き込む必要がある。そのためにROMイメージ作成ツールを作成した。 ここから、アセンブルしてはROMを焼いてテストの日々が始まった。いくら丁寧に確認しながらソースを入力し CP/Mのコマンドプロンプトが表示されない。アセンブルエラーがないにもかかわらずである。デバッグメッセージを 出力するようにすると、今度は相対アドレスジャンプができなくなる始末。苦肉の策として、プリンターポートにLEDを つなぎ、目印パターンを表示するようにしてバグをあぶり出した。原因はアセンブラーのバグ。 明らかに間違った記述なのにエラーを検出していなかった。そこを修正し、めでたくCP/Mのコマンドプロンプトが表示された。 コマンドプロンプト

8インチFDDインターフェースカードは、FDD2台をサポートできるようにTTLを追加した。これも配線図通り制作すれば、 動くはずだったが、掲載されている回路図に3カ所の間違いがあった。1カ所はすぐに気がついて修正した。しかし、もう2カ所はなかなか気がつかなかった。8インチFDDでメディアのフォーマットを試みると、動作が安定しない。途中でハングアップしてしまう。しかもこれがランダムに起きる。回路図とにらめっこしながら配線を追っかけたが、間違いが見当たらない。TTLが死んだのかと思い、ばらしてTTLを テストしたが正常品であった。何かが違っているのだが、分からない。まるで出口のない洞窟に入ったかのよう。 この様なときは、気分転換して、新鮮な気持ちで取り組み直すしかない。新品の部品を取りそろえて組み直すことにした。 部品が到着するまでの間、じっくり回路図を眺めることにした。なんか違和感を感じる。この抵抗はどうしてここに? 回路図の間違いを2カ所発見。修正した回路図を元にカードを製作し、テスト。安定してフォーマットができるようになった。 もちろん、8インチFDD2台ともキチンと動作する。 新8インチFDDインターフェースカード

これで、TRN-8が復活。しかもリッチに4ドライブ構成である。 TRN-8復活

Super AKI-80でCP/M(構想編)2018年05月12日 16:08

Super AKI-80でCP/Mマシンを構想(夢想?)して見ました。概略は、以下のようなりました。 追加のボード(ADD ON Board)上に、RAMを32KB、ROMとRAMのバンク切り替えスイッチ、 FDCなどを乗せて、FDDを2台までサポートします。 デバッグ用に7セグメントLEDを追加しました。

                      Super AKI-80       ADD ON Board
                     ---------------    ---------------------------------------
                     | TMP Z84C015 |    |                                     |
                     |  ---------  |    |                                     |
                     |  |Z80 CPU|  |    |                                     |
----------           |  |  CTC  |  |    |  ---------                          |
|Terminal| <==Async======> SIO  |  |    |  | 7SEG  |                          |
----------           |  |  PIO ==========> |  LED  |                          |
                     |  ---------  |    |  ---------                          |
                     |  ---------  |    |  ---------                          |
                     |  |82C256 |  |    |  | BANK  |                          |
                     |  |  PPI  |  |    |  |Switch |                          |
                     |  ---------  |    |  ---------                          |
                     |  ---------  |    |      |     ---------    ---------   |
                     |  |  ROM  |<-------------+---->|  ROM  |    |  FDC  |   |
                     |  |(0000  |  |<==Address Bus==>|(0000  |==> |uPD765 |   |
                     |  | -7FFF)|  |<====Data Bus===>| -7FFF)|==> |       |   |
                     |  ---------  |    |            ----------   ---------   |
                     |  |  RAM  |  |    |                             A       |
                     |  |(8000  |  |    ------------------------------|--------
                     |  | -FFFF)|  |                                  V
                     |  ---------  |                               -------
                     ---------------                               | FDD |--
                                                                   ------- |
                                                                      ------
ROM/RAMを切り替えるバンクスイッチは、電源が入った直後は、0x0000から0x7FFFをSuper AKI-80上のROMを 生かします。
                     Super AKI-80       ADD ON Board
                    ---------------    ---------------  
                    |  ---------  |    |  /////////  |  
                    |  |  ROM  |  |    |  /  RAM  /  |  
                    |  |(0000  |  |    |  /(0000  /  |  
                    |  | -7FFF)|  |    |  / -7FFF)/  |  
                    |  ---------  |    |  /////////  |  
                    |  |  RAM  |  |    ---------------
                    |  |(8000  |  |
                    |  | -FFFF)|  |
                    |  ---------  |
                    ---------------
次に、モニターをAKI-80上のRAM(0x8000から0xFFFF)に移します。そして、モニターにジャンプし、 ROMとADD ON Board上のRAMを切り替えます。
                     Super AKI-80       ADD ON Board
                    ---------------    ---------------  
                    |  /////////  |    |  ---------  |  
                    |  /  ROM  /  |    |  |  RAM  |  |  
                    |  /(0000  /  |    |  |(0000  |  |  
                    |  / -7FFF)/  |    |  | -7FFF)|  |  
                    |  /////////  |    |  ---------  |  
                    |  |  RAM  |  |    ---------------
                    |  |(8000  |  |
                    |  | -FFFF)|  |
                    |  ---------  |
                    ---------------
これで、64KBのメモリー空間をRAMでカバーできます。

問題は、Siper AKI-80の改造です。

アドレスバス(A8からA15)を引き出す必要がありいます。CPUの足下から引き出すのは、工作が困難を 極めそうです。ROMのソケットあたりで細工してできないかを検討中です。それでもA15はCPUから直接 引き出す必要がありそうです。引き出し先のコネクターは、82C265とコネクター間のパターンをカットして、 引き出し先を工面します。また、ROMの/CSには、A15が接続されていますがこれもカットします。 そして、バンクスイッチからのバンク切り替え信号を接続することとします。

IOアドレスのデコーダーの出力、/Y0(0x20)から/Y3(0xC0)を引き出します。これは、 バンクスイッチやFDCのアドレス選択に使います。

7セグメントのLEDは、PIOのBポートに接続します。

このほかには、FDD用のVFOやら、バンク切り替え各用のLEDなどを搭載します。

ADD ON Boardのサイズは、Super AKI-80、2枚分とします。

できれば、8インチFDDも接続したいのですが、基板のサイズから考えて、きつそうな感じがします。

ま、回路を確定し、パーツを入手し、レイアウトを決める所から作業開始です。

そうそう、モニターの改造も必要になりますね。

MACよ、君は正しかった。2018年04月19日 19:53

ROMライター Leaper-3

Super AKI-80に搭載したモニタ-ープログラムは、Digital ReserchのMACを使ってアセンブルしていました。 ROMにプログラムを焼く時は、秋月電子で購入した、Leaper-3(パラレルポートで使用するタイプ)を使っています。 MACでアセンブルしたままのHEXファイルだと、ライターにファイルを読み込む時に、いつもエラーになります。 ファイルを見てみると、最後のレコードに問題があるのがわかりました。最後のレコードがいつも、

          :0000000000
になってしまいます。正しくは、EOFを示す
          :00010000FF
になるはずなのですが。理由が分からないし、時間もなかったので、エデイターで、毎回、書き直していました。

今日、MACのマニュアル"CP/M MACRO ASSEMBLER LANGUAGE AND APPLICATIONS GUIDE (Revision of Novenver 1980)"に掲載されているサンプルプログラムを 眺めていて、何か違うなと。サンプルプログラムは、下記のようになっています。

                      org      100h        ;transient program area
          bdos        equ      0005h       ;bdos entry point 
          wchar       equ      2           ;write character function
          
          ;enter with ccp's return address in the stack
          ;write a single character(?) and return
                      mvi      C,wchar     ;write character function
                      mvi      e,'?'       ;character to write
                      call     bdos        ;rwrite character
                      ret                  ;return to the cpp
                      end      100h        ;start address is 100h
END文に開始アドレスが書いてあります。これをアセンブルして出来上がったHEXファイルは、
          :080100000E021E3FCD0500C9EF
          :00010000FF
と、正しくEOFレコードを書き出しています。

END文から開始アドレスを削除してアセンブルすると、

          :080100000E021E3FCD0500C9EF
          :0000000000
見事、これまでの状態が再現されました。ここでした。END文に開始アドレスを付けるのが正解でした。

「MACよ、君は間違っていなかった。 間違っていたのは、わたしの方だった。」とつぶやきながら、納得しました。

マニュアルを疎かにしてはいけないと、肝に銘じた一件でした。

<p>Super AKI-80のプチ改造と動作確認2018年04月03日 17:00

CP/Mマシンに仕立て上げるために入手しておいた秋月電子の"Super AKI-80"を放置したままになっていたので、 気分転換と、新調した半田ごての具合を見ようと、プチ改造を行い練習プログラムを 作成してみました。

"Super AKI-80"のプチ改造は、不要な3端子レギュレーターとRAMのバッテリー・バックアップ回路のダイオード 2個を 取り去り、レギュレーターの所には電源接続用のピンヘッダーを付け、ダイオードがあったところは、ジャンパー線で パッチを当てました。ついでに電源の確認用にLEDを取り付けました。それにしても、汚い半田付けだなぁ。寄る年波のせいか、 手元がよく見えなくて、作業用のルーペが欲しくなりました。

改造後の"Super AKI-80"は、この様になりました。 Super AKI-80(プチ改造)

それと、取り外したパーツです。 取り外したパーツ

練習プログラムは、おなじみ、"HELLO WORLD"です。ずいぶん長いことZ-80から離れていたので、 完全に初心者並みです。添付のサンプル・プログラムと格闘して、なんとか"Hello, World"を表示できました。 ちなみに、コンソールはOS/2付属の"Hyper ACCESS Lite"です。 HELLO WORLD

お次は、キーインした文字をそのまま書く"ECHO"です。 ECHO

"Hyper Access Lite"で、ローカル・エコーバックをオンにして見ると、きちんと入力文字がエコーバック されています。当然ですね。 ECHO その2

以前、CP/Mエミュレータで作り込んどいたモニタープログラム(これは、Intelニーモニックで書かれている。)の コンソールI/OをSuper AKI-80用に書き換えて(Zilogニーモニックを Intelニーモニックに書き換えて)動かす 予定です。

それにしても、Z-80 SIO/0は高機能なんだけど、使い方を思い出すまで、大変でした。

CP/M立ち上げ準備 -- OS/2編2015年08月02日 17:50

OS/2の作業環境を作成します。

ツールなど一切合財を入れるディレクトリー"CPM"をDドライブの直下に作ります。まずここに、 "CP/M CD-ROM"から、 OS/2版CP/Mエミュレーターを入れます。"CP/M CD-ROM"の内容は、"The Retrocomputing Archive"のサイトの http://www.retroarchive.org/cpm/cdrom/にあります。ここの、"emulator"->"os2"とたどり、 "OS2CPM.ZIP"をダウンロードし、"d:\cpm"にunzipします。この中には、 CP/Mエミュレーターは、3つがあります。

  • CPM8080.EXE i8080をエミュレーションするCP/Mエミュレーター
  • CPMZ80.EXE Z80をエミュレーションするCP/Mエミュレーター
  • CPM.EXE ファミリーAPI版のZ80をエミュレーションするCP/Mエミュレーター
今回は、CPM8080.EXEを使います。"CP/M"フォルダーを作り 必要そうなものも含めて、ICONを作りました。 CP/M ICON

CP/Mのコマンド類は、"The Unofficial CP/M Web site"http://www.cpm.z80.de/の "Digital Research Binaries"ページの"CP/M 2.2 BINARY"cpm22-b.zipをダウンロードし、 "d:\cpm"にunzipします。さしあたって、ASM.COM、DDT.COM、LOAD.COMぐらいしか、使う予定はありません。

動作の確認をします。サンプルプログラムは下記の通り。

; hello.asm -- CP/M simple sample
          ORG 100H
START:    MVI C,9
          LXI D,HELLO
          CALL 5
          RET
HELLO:    DB 'HELLO WORLD.$'

          END START

実際に、アセンブルして実行してみます。 動作テスト

Super AKI-802015年07月13日 20:18

秋月電子のSuper AKI-80を購入しました。目標は、CP/Mマシンの復活です。つまり、 AKI-80にH/Wを追加し、最終的にはCP/Mをインプリメントしてやろうと考えています。

完成目標は、

  • FDD 2台(A,B)
  • TPAサイズは、62KB
  • 通信ポート 1(TTY)
  • セントロニクス規格プリンターポート 1(LPT)
  • カセットインターフェース 1(Puncher/Reader)

作業ステップとしては、

  1. H/Wを極力変更しないで、MONITORを載せる。
  2. 64KB RAM化する。(Shadow ROM化)
  3. FDC uPD765Aを追加する。
  4. FDCのコントロール機能をMONITORに追加する。
  5. CP/Mをインプリメントする。

道具としては、

  • OS/2 Ver.4
  • ROM Writer Leaper 3 (Parallel Port仕様)
  • CP/M Emulator
  • ROMIMG ROM Iamge作成ツール(自作)
  • CP/M CD-ROM

Windowsではなく、OS/2を開発ツールにするのは、

  • 複数のPC-DOS窓が使える。
  • Terminal Emulatorがある。
  • Windowsよりも、ずっと軽い。
  • OS/2ネイティブのgnuツールがある。

今更OS/2ですが、PC-DOS版のツールである、CP/M Emulator、Leaper 3コントロールプログラム、 ROMIMGやOS/2版のgnuツールなどを同時に動かせて、楽ができるからです。