tunozemichanの日記 / tunozemichan's diary

SORD社のコンピューターM68やM68MXの解析についての備忘録です。This blog is a memorandum about the analysis of SORD's computers M68 and M68MX.

devtermのプリンターをコマンドラインから使う(PDFも印刷可能)

f:id:tunozemichan:20220111094909j:image

devtermを入手しました。私が買ったのはプリンター付きです。このプリンターはシリアル接続になっており、CUPSシステム上で管理されています。プリンタ名は"devterm_printer"です。Webブラウザーからは普通に印刷を選べば、期待通りに出力されるかは別として、ちゃんと動きます。自分で作ったテキストファイルなどを気楽に印刷するには、CUPSなので、

 

lpr -P devterm_printer exsample.txt

 

とするだけです。事前にデフォルトのプリンターとして、

 

sudo lpoptions -d devterm_printer

 

と登録したつもりでしたが、lpr exsample.txtとプリンタ名を省略してもデフォルトプリンタが登録されていないと出てしまいダメでした。

ちなみにこのコマンドで日本語を含むテキストファイルも印字できますが、ちょこちょこおかしな漢字が出ます。また、PDFファイルも印刷できませんでした。

 

情報を探すと、PDFの印刷についてはdevtermのフォーラムに情報がありました。以下のようなコマンドで動きました。日本語もOKです。

 

lp -d devterm_printer -o fit-to-page -o media=A8 -o scaling=200 sample.pdf

 

.profileに以下のように追加しておくとよいとのことです。

 

printpdf() { #try to fit pdf

lp -d devterm_printer -o fit-to-page -o media=A8 -o scaling=200 "$1"

}

 

これで、bash上から

 

printpdf sample.pdf

 

とやると出力されます。

f:id:tunozemichan:20220111201457j:plain



 

Successfully launched Universal Monitor (limited functionality version) on SORD M68.

The speed of the analysis of SORD M68 BOOT ROM has slowed down. The reason for the delay is that there are few codes or values left in the disassembler code that can be used as hints. It seems to be impossible for me to guess by looking at the paper and ghidra screen.

So, using the information that is currently available, I decided to have a monitor program recorded on a specific sector of the FDD and directly verify the port with an unknown function from that monitor program.

By analyzing the BOOT ROM, I know that SORD M68 loads only 2kb of sector 1~8 of side 0 of track 1 of FDD#0 to 0x0 address at startup. Therefore, a monitor that works with 2kb is the best choice, but I couldn't find one right away. So I targeted the Universal Monitor(

https://electrelic.com/electrelic/node/1317), which is compact and fully functional, and made a limited-featured version that omits unused functions, and tested if it could run on SORD M68.

In Serial I/O setup, it is known that Z80CTC is the baud rate generator for Z80SIO, but since Z80CTC is already initialized in BOOT ROM, it does not do anything on Universal Monitor.  However, the initial parameters of Z80SIO are different from the current common settings (stop bit 2), so change them to stop bit 1 and no parity. Now I can connect at 9600bps.

Use L3DiskEx to import the binary file created by assembling the Universal Monitor with limited functionality from track 1, side 0, and sector 1 of the FDD image.

This time, I chose the Dump, Go, Load, and Output commands as the functions to use. At this time, the size of the Universal Monitor was 1647 bytes. Therefore, I wrote 7 sectors to the FDD image. When I inserted the FDD image file that wrote Universal Monitor into the FlashFloppyized GOTEK and booted SORD M68, the following screen came up and Universal Monitor with limited functions started. From now on, I will verify the operation by entering values for unknown ports.

f:id:tunozemichan:20220110172053p:plain

 

SORD M68でUniversal Monitor(機能限定バージョン)の起動に成功

SORD M68のBOOT ROMの解析はいよいよ煮詰まってきました。残るのは意味不明なポートに0とか1とかヒントになりそうにない値を入れたりしているところばかりで、これ以上、紙と画面を見て推測するのは私の能力的に無理がありそうです。

そこで、現状分かっている段階でFDD上にモニタプログラムのようなものを載せて、実際にポートに対して値を出し入れして、検証することにしました。

BOOT ROMの解析によって、SORD M68は起動時にFDD#0のトラック1のサイド0のセクタ1~8までの2kbだけを0x0番地へロードすることが分かっています。なので、できれば2kbで動くモニタがあれば良いのですが、すぐには見当たりません。そこでコンパクトかつ十分な機能を持つUniversal Monitor | Electrelicをターゲットにして、まずは使用しないであろう機能をオミットした機能限定バージョンを作り起動できるか検証しました。

シリアル関係のセットアップでは、CTCがSIOのボーレートジェネレーターになっていますが、CTCはすでにBOOT ROMで初期化されているのでなにもしません。ただし、SIOの初期パラメータは現在の一般的な設定とは異なっている(ストップビット2)ので、ストップビット1、パリティなしに変更します。これで9600bpsで接続できました。

 

機能を限定したUniversal Monitorをアセンブルして出来上がったバイナリファイルをL3DiskExを使ってFDDイメージのトラック1、サイド0、セクタ1からインポートします。今回、使用する機能として、Dump、Go、LOAD、Outputコマンドを残しました。これで1647バイトだったので、7セクタ分書き込みました。出来上がったFDDイメージファイルをFlashFloppy化したGOTEKに入れて起動すると、以下のような画面が出て、機能限定バージョンですがUniversal Monitorの起動に成功しました。今後は、不明なポートに対して値を入力して、動作を検証していきます。

f:id:tunozemichan:20220110172053p:plain

Universal Monitor(何もできないバージョン)の起動に成功

 

SORD M68のBOOT ROM解析(Z80CTCのアドレス判明)

SORD M68のCTCはZ80CTCで、これが二つ搭載されています。(便宜上CTC_A、CTC_Bとします)。Z80CTCの各チャンネルのアドレスを下記に記します。

 

CTC_A

チャンネル0 : 0xfc

チャンネル1 : 0xfd

チャンネル2 : 0xfe

チャンネル3 : 0xff

 

CTC_B

チャンネル0 : 0xd8

チャンネル1 : 0xd9

チャンネル2 : 0xda

チャンネル3 : 0xdb

 

配線上はCTC(AかBのどちらか。現時点では分かりません)のチャンネル0のZC/TO0がZ80SIOのTxCとRxCに接続され、ボーレートジェネレーターとなっています。

 

以上です。

 

SORD M68のBOOT ROM解析(フロッピーディスクコントローラーのI/Oポートアドレス判明)(色々修正)

DMAの件で、手詰まりになったので、CP/M-68KのBOOT部分をディスクイメージのセクタから切り出して、逆アセンブルしました。トラック1、サイド0、セクタ1~3が当該部位で、これはZ80のコードで書かれています。

 

BOOT ROMに比べてものすごく読みやすいコードが出力されて、DMAのコードが見つかり、Z80DMAのI/Oアドレスが分かります。

 

CP/M-68K起動時のZ80DMAのI/Oアドレス:0xcc

 

BOOT ROMでは0xa1だったはずですが、これ以外考えられません。またこの時の初期化コードから、フロッピーディスクコントローラー(FDC)のデータレジスタが分かりました。

 

FDCコマンド/ステータスレジスタ:0xc8(確定)

FDCトラックレジスタ:0xc9 (モニタプログラムから直接調べた結果)

FDCセクタレジスタ:0xca(ブートローダの読込コードから矛盾しない)

FDCデータレジスタ:0xcb

 

SORD M68のFDCであるMB8877Aのレジスタアドレスは普通、コマンド/ステータスレジスタ→トラックレジスタ→セクタレジスタ→データレジスタの順に並ぶようですが、今回の結果はかなり違っています。

DMACのアドレスが何故かFDCのデータレジスタとトラックレジスタの間に入ってしまっています。いくら何でも汚すぎると思いますが、現時点ではこうなっているとしか言いようがありません。

 

幸いCP/M-68Kはまともに動くので、コマンドを直接たたいて確認したいと思います。

 

以上です。

 

SORD M68のBOOT ROM解析(Z80DMAのアドレス判明)

SORD M68のDMACはZ80DMAです。このDMACはとても複雑なコマンド体系ですが、解析者にはとても素晴らしい点があり、それはコマンドチェーンの最後が多くの場合、CF 87で終わる点です。今回もそれを足掛かりに探しました。

 

Z80DMAのI/Oアドレス 0xA1? 0xCC←こっちが正しかったです。

 

ちなみに、BOOT ROMでは、まず、メモリ→メモリ間転送を設定しています。現在解析途中ですが、0x55aaから0x55aaへ1バイト転送を実行しています。その後、Z80DMAのリードレジスタのポートAアドレスをチェックしています。よくわかりませんが、Z80DMAが正常に機能しているかチェックしているようです。

 

次に定義しているのは、I/O→メモリ転送で、I/Oアドレス0xA3から、メモリ0x00へ256バイト転送しています。これはフロッピーディスクの1セクタをメモリに送る設定だと思われますが、Z80DMAのI/Oアドレスが0xA1で、フロッピーディスクコントローラー(FDC)のI/Oアドレスが0xA3なのは不合理なので、悩み中です。

 

DMAの設定は、慣れればあまり悩まないのですが、最初は異常にとっつきにくい印象でした。SORD M68のチップ構成はMC68000以外は、SHARP X1turboにそっくりなので、そちらの資料が非常に参考になりました。

以下に参考資料を挙げておきます。

 

  1. Z80ファミリ・ハンドブック
  2. 試験に出るX1

 

 

 

SORD M68のBOOT ROM解析(CRTC=HD46505SPのアドレス・設定判明)

BOOT ROMを吸い出す際にアドレス線の高位に配線間違いがありました。その為、正しいBOOT ROMファイルが得られていませんでした。修正したことで今度は正しいファイルが得られたと思います。なお、Z80 SIOの設定に誤りはありませんでしたが、一部不合理な部分は解消されました。

 

今回、探したのはCRTコントローラーHD46505SPのアドレスと設定です。

BOOT ROMは基本的に周辺LSIの初期化を一か所に固めて行う傾向があります。SIOの周辺を調べていて、発見しました。

 

アドレスレジスタ 0xF0

データレジスタ 0xF1

 

設定値

R0 --- 0x6B 水平文字列 : 108-1

R1 --- 0x50 水平表示文字数 : 80

R2 --- 0x58 水平同期位置 : 88

R3 --- 0x7A 同期パルス幅 : 122

R4 --- 0x1A 垂直総文字数 : 26

R5 --- 0x00 トータルラスタアジャスト : 0

R6 --- 0x19 垂直表示文字数 : 25

R7 --- 0x19 垂直同期位置 : 25

R8 --- 0x00 インターレース&スキュー : 0

R9 --- 0x0F 最大ラスタアドレス : 15

R10 --- 0x6F カーソルスタートラスタ : 111

R11 --- 0x0F カーソルエンドラスタ : 15

R12 --- 0x00 スタートアドレス(H) : 0

R13 --- 0x00 スタートアドレス(L) : 0

R14 --- 0x00 カーソル(H) : 0

R15 --- 0x00 カーソル(L) : 0

 

以上です。