ラベル エミュレータ の投稿を表示しています。 すべての投稿を表示
ラベル エミュレータ の投稿を表示しています。 すべての投稿を表示

2023年2月19日日曜日

パソピア7/700のFDバックアップ

前回紹介したFDコピーをもう少し拡張してみる。
XPAC2を持っている方はSDカードも使えるので、フロッピーイメージを分割してファイルに保存する方法を考えてみる。

パソピアの2Dは、1トラックに32セクタ(1セクタ256バイト)で8KBのデータ領域。
XPAC2のスロット#5は、8KBのSRAM RAM PAC2になっているので、ここをバッファとして利用する。

SDカードにトラック毎のデータ保存用ファイルを用意する
同じフォルダ内に"ファイル名.xx"で、拡張子xxが00~34のファイルを用意。
Trackファイル00はサイド0が単密度(128バイト)なので6,144バイト、Trackファイル01~34は8,192バイトのファイルを用意。
各Trackファイルは、ヘッド0 セクター1→16、ヘッド1 セクター1→16の順番で、合計32セクターのデータが保存されます。

例えばFormat.xxというファイル名の場合、"Format.00"(6,144バイト)と"Format.01~.34"(それぞれ8,192バイト)の35ファイルを用意。
これら35ファイルは、SDカードの同じフォルダに格納しておきます。
以前紹介した自作フォーマッタで初期化したディスクをイメージ化したのでアップします

SDカードへのExportと、FDへのImportプログラムを用意したのでアップしました。
RAM PAC2イメージには"BACKFD"というファイル名で保存されています。
フロッピーからSDカードにExportする場合、最初に1を選択。
フロッピードライブ番号を選択し、SDカードのバス名を指定します。
例えば、DiskフォルダにFormat.00~34ファイルを置いている場合、パス名は「/Disk/Format.」を指定します。00~34の拡張子2文字は自動で入力されます。

SDカードへの保存が成功すると、"Completed successfully."が表示されます。

SDカードからフロッピーにImportする場合、最初の選択でに2番を選びます。
あとは同じように、フロッピードライブ番号を選択し、SDカードのバス名を指定します。
"Completed successfully."が表示されると、SDカードに保存してあった35トラックデータがフロッピーに書き戻しされています。

あと、せっかくWindowsでTrackファイルを読み書きできるようになったので、TrackデータとD88ファイルを相互変換するWindowsアプリを作ってみました。
実行ファイル(32bitと64bit)とコードをアップしました。(つたないコードですが...)

実行ファイル(D88Track.exe)上にトラック00ファイルをドラッグ&ドロップすると、00~34ファイルを読み込み、同じフォルダにD88ファイルとログを出力します。
逆にD88ファイルをドラッグ&ドロップすると、00~34までのトラックデータに分割して、同じフォルダにTrackファイルを出力します。

D88Track.exeを単独で起動した場合は、ファイルを開くダイアログが開くので、トラック00ファイルかD88ファイルを指定して開いてください。
その後の動作はドラッグ&ドロップ時と同じです。

これで作成したD88ファイルをエミュレータで読込みましたが、問題なく利用できました。
但し全てのファイルで確認したわけではないので、うまく動作しない場合は連絡ください。

D88ファイルはトラック順に並んでいない場合があります。一旦セクターデータのオフセット位置を調べてから、Trackファイル00から順番にファイル出力する仕組みにしています。

PC-98の2D対応5インチドライブがあれば、パソピアの2Dフロッピーから直接D88ファイルを作ることができますが、今は環境を用意するのも難しくなってきました。

今回のツールで、パソピアの2Dフロッピー <-> SDカードのTrackファイル <-> D88ファイルの相互変換できるようになったので、実機とエミュの行き来がしやすくなったのかなと思います。

あと、パソピア700には1ドライブ仕様があります。
1ドライブの場合、ディスクコピーする際に何度もフロッピー入替えが必要でしたが、SDカード経由でバックアップ・リストアできれば、楽にコピーできるようになります。

2023年2月18日土曜日

パソピア7/700用のFDコピー

パソピア7/700用フロッピーディスクのコピープログラムを作ってみる。

前回調べたフォーマット形式を参考に作ってみる。
パソピアの2Dは、0~34トラック、1トラック毎に32セクタで、1セクタは256バイト。
(但し、トラック0ヘッド0のみ単密度で128バイト)

パソピア7純正コピープログラムは2トラック16KB(4000h)ずつコピーしている。
今回はできるだけ短いプログラムを組んで、3トラックずつコピーする方法を考える。
裏RAM利用も考えたが、BIOSコールと排他になるのでシンプルな方法で行くことにする。

BIOSコールのプログラムは、F000hに配置。BASICプログラムはできるだけ短くして、バッファは9000h~EFFFhで24KB(3トラック分)確保できました。

FDコピーのRAMPACイメージとBASICテキストをアップしました。
RAMPACイメージにはCOPYFDのファイル名で保存しています。

コピーを実行する前に、コピー先のフロッピーをフォーマットしておく必要があります。
COPYFDを実行すると、オリジナルのコピー元FDドライブ番号(1~4)と、コピー先FDドライブ番号(1~4)を聞かれるので入力。
フロッピーディスクを2枚それぞれ挿入し、RETURNキーを押すとコピー開始されます。
コピーが無事に終われば、"Completed Successsfully."の表示がされます。

1ドライブのみの場合、オリジナルFDドライブ番号とコピー先FDドライブ番号の両方に"1"をセット。ドライブ#1のディスクを入れ替えながら進めます。
前述のとおり、パソピアの2Dはトラック#0~#34の35トラックあり、3トラックずつコピーするので、12×2回のディスク入れ替えが必要です。
純正のコピーツールは2トラックずつなので、もっと大変だったはず...

パソピア700実機でコピーしたディスクを98で読み込んでバイナリ比較してみましたが、ちゃんとコピーできているようです。エミュでの確認も大丈夫でした。

パソピア7+FDD実機での確認はしていませんので、もし試された方がいましたら報告もらえると助かります。

1ドライブコピー時のディスク入れ替えは苦痛(というかドライブ壊れないか心配)なので、別な方法も考えてみます。
(続く)

2022年11月13日日曜日

パソピア7/700用のFDフォーマッタ

パソピア7/700用フロッピーディスクのフォーマットプログラムを作ってみる。

BIOSでFDDを制御するためには、まずパラメータのセット(Fn#=18)が必要
・Cレジスタ:Function(Fn)#=18(FDDパラメータセット)
・HLレジスタ:Buffer先頭アドレス
・Dレジスタ:Track#
・Eレジスタ:Sector#
・Bレジスタ:Read/Write Sector数
・Aレジスタ:FDD Paramter
 - bit7:Side (0 or 1)
 - bit6-5:00...両面倍密度, 01...片面倍率度, 10...両面単密度, 11...片面単密度
 - bit4-3:00固定
 - bit2-0:装置番号-1 (0-3)

FDDパラメータセット(Fn#=18)後、以下いずれかのFn#で再びBIOSコール
・Fn#=19:Disk Read(Seek & Read)
・Fn#=20:Disk Write(Seek & Write)
・Fn#=21:Disk Write(Seek & Write with Check)
・Fn#=22:Disk Write Delete(Seek & Write Delete)
・Fn#=23:Disk Restore(Seek to Zero)
・Fn#=24:Disk Format(Seek & Write ID)
・Fn#=25:Disk Check(Check Disk Status)
BIOSコールから戻ってきた際に、キャリーフラグが立つとエラー発生。
・Aレジスタ:終了ステータス
 - "0"=30h:正常
 - "1"=31h:Not Ready
 - "8"=38h:Write Protect
 など。
エラー時のリトライは1回ずつ入れることにした。

アンフォーマットのフロッピーだと、最初にトラック毎にIDの書き込みが必要。
IDを書かずにデータ書き込みするとID errorで失敗する。

フォーマット処理フローは以下の通り
(1) 装置初期化
・Fn#18でパラメータセット
 - Aレジスタ:FDD Paramter=装置番号-1(0-3)をセット
・Fn#23でDisk Restore
 - Aレジスタ:FDD Paramter=07hをセット

(2) トラック毎にID書き込み
・Fn#=18でパラメータセット
 - HLレジスタ:ID Buffer先頭アドレス。バッファには以下104バイトを書き込んでおく
  - 1バイト目:Track#
  - 2バイト目:Side0(00h) or Side1(01h)
  - 3バイト目:Index(01h→1Ah)
  - 4バイト目:単密度(00h) or 倍密度(01h)
  →上記を26回繰り返し4バイト×26回=合計104バイト
 - Dレジスタ:Track#
 - Eレジスタ:Sector#=E5h
 - Bレジスタ:Read/Write Sector数=40h
 - Aレジスタ:FDD Paramter=装置番号-1(0-3)をセット(Side1は+80h)
・Fn#24でWrite ID
 - Aレジスタ:FDD Paramter=8Dhをセット

(3) Disk読み込みチェック
・Fn#=18でパラメータセット
 - HLレジスタ:Read Buffer先頭アドレス。
  - 読み込み用に16セクタ(最大4,096バイト)分のバッファを用意しておく
 - Dレジスタ:Track#
 - Eレジスタ:Sector#=01h
 - Bレジスタ:Read/Write Sector数=10h
 - Aレジスタ:FDD Paramter=装置番号-1(0-3)をセット(Side1は+80h)
・Fn#=23でDisk Seek & Read
 - Aレジスタ:FDD Paramter=30hをセット

(4) Track0.Side0→Track0.Side1→Track1.Side0→Track1.Side1→...
→Track34.Side0→Track34.Side1の順番で(2)(3)を繰り返し。
但しTrack18のWrite ID後、ディレクトリ・ディスク属性・FATをSide0に書き込み
・Fn#=18でパラメータセット
 - HLレジスタ:Read Buffer先頭アドレス。
  - バッファにはディレクトリ・ディスク属性・FATを書き込んでおく
 - Dレジスタ:Track#=12h
 - Eレジスタ:Sector#=01h
 - Bレジスタ:Read/Write Sector数=10h
 - Aレジスタ:FDD Paramter=装置番号-1(0-3)をセット
・Fn#=21でDisk Write with Check
 - Aレジスタは変更なし

(5) Disk Restore
・Fn#18でパラメータセット
 - Aレジスタ:FDD Paramter=装置番号-1(0-3)+80hをセット
・Fn#23で装置初期化
 - Aレジスタ:FDD Paramter=07hをセット

上記の流れで処理を組んでコンパイル。できたバイナリをBASICと組み合わせ。
パソピア7のエミュレータで確認。
うまく行ったっぽい。
エミュが作成したd88イメージをバイナリエディタで確認したが、問題なさそう。

初代パソピアT-DISK BASICでの読み書きもエミュレータで確認。
パソピア7でフォーマットしたディスクは、初代パソピアでも使えそう。

実機での動作確認はパソピア700。フォーマット、データ読書きも大丈夫そう。

FDフォーマッタのRAMPACイメージとBASICテキストをアップしました。

パソピア7と初代パソピアはエミュレータでしか確認できていないので、すぐ試せる方は試して報告してもらえると助かります。

2022年11月12日土曜日

パソピアのフロッピーフォーマット

以前の投稿で パソピアのフロッピーをイメージ化する手順をまとめたが、今回はフロッピーの内部フォーマットについて調べてみたので備忘録。
パソピアには片面ミニフロッピーもあるが、今回は両面倍密(2D)ミニフロッピーについて。

・2ヘッド:Side0, Side1
・35トラック:Track#0(外周)~#34(内周)
・1トラックあたり16セクタ:Sector#1~#16 (時計回り順)
・1セクタあたり256byte(倍密度) ※Track#0.Side0のみ128byte(単密度)
・8セクタ毎に1クラスタ。クラスタの並び順は、
 Side0.Sector1-8 → Side1.Sector1-8 → Side0.Sector9-16 → Side1.Sector9-16
 下の表の場合、セクタ順に並べたのでクラスタ順が0→2→1→3になっているのに注意。

・Track#0は未使用領域
・Track#18.Side0は、
 (a) Sector#1-12:ディレクトリ
 (b) Sector#13:ディスク属性
 (c) Sector#14-16:FAT(256byte)×3セット

初代パソピア用T-DISK BASICの場合は、以下の領域が使われている。
・Track#0.Side1.Sector#1-8:初期化ルーチン
・Track#1.Side0.Sector#2~Track#8.Side1.Sector#16:T-DISK BASICシステム
・Track#19.Side1.Sector#1~Track#34.Side1.Sector#16:漢字パターン

総容量は、2ヘッド×35トラック×16セクタ×256byte-(単密度分:16セクタ×128byte)
=284,672byte

Track#18.Side0の格納データにについて。
(a) Sector#1-12:ディレクトリ ... 16バイト毎に、ファイル情報が格納される
・0~9バイト:ファイル名
 - ファイル名に00h, FFh, 3Ah(":")は含んではならない
 - 0バイト目が00hならKILLされたファイル、FFhなら未使用
・10バイト:ファイル属性
 - 00h:ソース形式(JISコード)
 - 01h:マシン語
 - 80h:バイナリ(中間言語)形式
 - それぞれ10hを加えると書き込み禁止
・11バイト:クラスタ番号
・12~15バイト:未使用
・1セクタあたり16ファイルの情報が書き込めるので、12セクタで最大192ファイルの領域
・フォーマット直後はFFh埋め

(b) Sector#13:ディスク属性
・0バイト:ディスク属性
 - 00h:(SET 装置番号," ") 属性なし
 - 10h:(SET 装置番号,"P") 書き込み禁止(Write Protect)
 - 20h:(SET 装置番号,"E"?) EBCDIC(未使用)
 - 40h:(SET 装置番号,"R") 書き込み確認(Read after Write)
・1~255バイト:未使用(00h)
・フォーマット直後は00h埋め

(c) Sector#14-16:FAT(256byte)×3セット
・クラスタ(8セクタ)単位でFAT情報1バイトを格納
 - 00h~8Bh:Nextクラスタ番号(=FAT内ポインタ)
 - C1h~C8h:ラストクラスタ ※右4bitの1~8:有効セクタ数
 - FEh:Reserved
 - FFh:未使用クラスタ
・フォーマット直後は、0~3, 72, 74, 140~255バイトがFEh、それ以外はFFh。
 上記256バイトが、Sector#14,#15,#16に3セット書き込まれる。

FAT256バイトはクラスタ順で並んでいる。
上の表はセクタ順に並べたのでTrack#18でFEhが連続しているように見えるが、クラスタ順が入れ子になっているため、Track#18(72-75セクタ)のFATはFEh, FFh, FEh, FFhの並び。
紛らわしいので注意...

-----
(2023/1/29)表の一部が間違っていたので訂正。Track#0.Side0(Sector#1-16)が単密度

2022年7月30日土曜日

パソピアのフロッピーをイメージ化

武田氏のパソピアエミュでD88イメージを使うことができる。
フロッピーをD88イメージ化するために98を使っているので、備忘録として残しておく。

PC-9821Anのファイルスロットに、5インチドライブを挿入する。
パソピアのフロッピーは両面倍率(2D)だが、こいつでイメージ化できる。

(1) ぶる~氏作のMAKE_HDを使う場合、
MAKE_HD [5"FDDドライブ] -r [エラーリトライ数] -f [出力するファイル名]

正常に終了すると以下のように表示される。
できたD88ファイルはMOに保存して、Windowsマシンに転送。
うちの環境では、この方法が一番楽だった。

(2) MAHALITOとDILTOを使う場合、

(2-1) FSLOT2DDを常駐させる。
これをしないとMAHALITOが5インチドライブを見つけてくれない。

(2-2) MAHALITOを起動してフロッピーをイメージ化
MAHALITO A -2D [5"FDDドライブ] [出力するファイル名]

(2-3) DILTOを起動してディスクイメージをD88に変換
DILTO -w [読み込むイメージファイル名]

イメージファイル名+".D88"でファイルが出力される。
逆にイメージからフロッピーに書き戻しする場合もMAHALITOが使える。

出来上がったD88ファイルは、エミュで使うことができる。
パソピア7のエミュでD88イメージを使ってみた動画。
ハドソンのギャングマン。
大きいキャラクターだが、動きもスムーズで素晴らしい。

2017年2月25日土曜日

VGM Player for Pasopia7

パソピア7はSN76489Aを2つ使用して6重和音+2ノイズを実現しています。
このチップについては海外のサイトSMS Power!に詳しく書かれており、このサイトを眺めてみるとSN76489に適した音楽ファイルVGM File Formatが定義されていました。

せっかく同じチップを積んでいるということで、パソピア7でこのVGMファイルを再生するプログラムを作ってみました。ダウンロードはこちら「vgm.bin」

----------
まずはXPAC2で使う場合
SDカードに「vgm.bin」とvgmファイルを入れて、XPAC2に挿入します。
XPAC2付属のコマンドツール「CMD」を使って「vgm.bin」をMRAMにマウントします。
例えば、
run"CMD"
? ld 4 vgm.bin
を実行すると、スロット4(デバイス5)にマウントされます。
※スロット4(デバイス5)に保存されているデータは消えるので注意
files 5
を実行し、以下の画面のように「vgm」と「vgm.b」が登録されていると成功です
続いて
run"vgm"
を実行し、VGMファイルを読み込むスロットを指定します。
※スロット3(デバイス6)を指定すると、スロット3(デバイス6)に保存されているプログラムは消えるので注意です。
次に、SDカードに保存したvgmファイルのパスを入力します。入力パス名に###を入れると001から順番にインクリメントしてパス名に付加し、連続してファイル読み込みします。
最後にファイル間のインターバルを指定します。170で約1秒です。

----------
次にエミュレータで使う場合
エミュレータの場合は、複数ファイルの連続演奏はありません。

メニューのRAMPAC1で「vgm.bin」を指定、RAMPAC2にVGMファイルを指定します。
※指定するファイルはバックアップしておいた方がよいです。(エミュレータがファイルを読み込むと32KBにサイズ変更するので)
run"vgm"
を実行し、VGMファイルを読み込むスロット=3(デバイス6=RAMPAC2)を指定します。
ファイルのパスには何も入力せずに、インターバルは1を指定します。

演奏中は(STOP)キー長押しで中断できます。

----------
SMS Power!のサイトでは、コンテストのようなものも行われています。
2005年Ranking 1位の曲をパソピア700の内蔵スピーカーで再生してみました。
携帯撮影なのでメロディーラインが聞き取りにくいですが、この曲は素晴らしいです!!
持っている方は、是非パソピア7実機で聞いてみてください。

その他にもセガ8bit音楽のVGMファイルが多数登録されています
YM2413ではなくPSGと記載があるファイルなら再生できると思います。
パソピア7に外付けスピーカーをつけて演奏させてみました。

----------
公開されているVGMファイルですが、拡張子が.vgmでも中身がgzipで圧縮されている場合があります。
Pasopia7版VGM Playerは圧縮フォーマットに対応していないので、圧縮されている場合「File is not VGM format.」と表示されて再生されません。
事前に解凍ソフトなどで解凍してからパソピア7で読み込むとうまくいく場合があります。
解凍されたファイルの先頭4バイトが"Vgm " (0x56 0x67 0x6d 0x20)になると読み込みできるようになりますので、バイナリエディタ等でチェックすると確実かもしれません。

あとXPAC2は8.3形式のファイル名になりますので、ロングファイル名は省略形になってしまいます。「File not found.」と表示された場合、その辺もチェックしてもらえるとよいかと。

Enjoy your Pasopia7 sound!!

2012年2月28日火曜日

FDの吸出し

次は、FDに溜まっているデータを吸出し

吸出しには、98を使う。
用意したのはPC-9821Af。外付けFDDのコネクタが標準で付いていたので。

しかし外付けFDDではうまく吸い出せず、ファイルスロットのFDDを利用。
吸出し用のソフトは、このサイトを参考にさせてもらった。

一番簡単だったのは、MAKE_HDというツール。
Bドライブが5inchドライブの場合、以下のコマンドでファイルを作ってくれる。

MAKE_HD B: -r 1 -f DISK.D88


MAHALITとDILTOを使う場合、

MAHALITO.EXE A -2D B: A:\BIN\MAHALITO\DISK
DILTO.EXE -w DISK


注意が必要なのは、1枚吸い出す度に本体をリセットした方が良いという点。
連続して実行すると、正しく吸い出せない場合があった。(単密度で吸い出しているっぽい)

原因は不明だが、パソピアと88ではフォーマットが違うからかもしれない。
パソピア88
トラック数3540
0ヘッド0トラック単密度倍密度
などなど。

#ちなみに、これらのツール、ハイレゾモードでは動かなかった。。

エミュレータをちょっといじって、吸い出したFDイメージから起動してみると、ディスクベーシックもちゃんと動いた。

すばらしい。。

2012年2月27日月曜日

フォントROMの作成

エミュレータにはフォントファイル(font.rom)が添付されているが、ちょっと太め
不自由なく使えていたが、ちょっと気になったので、オリジナルと同じフォントを作ることに。
まずは、実機でフォントを表示して、デジカメで写真とっとく。
純正のモニターだとぼやけてしまうので、西田ラヂオさんのS端子アダプタで、LCDに表示したものを写真に。断然見やすい。

フォント打込みは、Oh!PASOPIAの創刊2号に掲載の、パソピア7「スーパーフォント」というプログラムを使う

写真を見ながら、ポチポチ入力してく。
入力した文字は、0xA000~0xA7FFにフォントデータとして保存されているので、
BSAVE #-1,"FONT",&HA000,&H800
でwavファイルに保存。

実は、このプログラムが作成するフォントデータと、エミュレータのフォントフォーマットが同じなので、wave2bin.exeでバイナリに変換して、ヘッダーと最後を切り取って0x800バイトにして「font.rom」というファイルで保存すると、フォントファイルができてしまう。

出来たフォントでエミュレータを使ってみる

ちょー自己満足。

2012年2月26日日曜日

漢字ROMの吸出し

漢字ROM PACには、型番がPA7247のものとPA7246の2種類がある。
うちにあるのはPA7246で、カセットテープ付。

初代パソピアで漢字を使う場合、このサブルーチンカセットが必要。
ROM吸出しは、パソピア7を使う

基本は、武田さんのページに記載されている吸出し方法。
ROMが正しく読み出せたか検証したかったので、バイナリをダンプするように改良。
(その結果、処理時間がオリジナルより遅くなった。。)

100 data &hf5, &h3e, &h00, &hd3, &h1b, &h3e, &h00, &hd3
110 data &h18, &h3e, &h00, &hd3, &h19, &h3e, &h00, &hd3
120 data &h1a, &hdb, &h18, &h32, &h00, &h00, &h32, &h1b
121 data &hf0, &hf1, &hc9
130 clear ,&hefff
140 for a=&hf000 to &hf01a
150  read d:poke a,d
160 next a
161 width 80
170 input "slot (0-7)",s
180 print "0: 00000-07fff"
190 print "1: 08000-0ffff"
200 print "2: 10000-17fff"
210 print "3: 18000-1ffff"
220 input "range (0-3)",r
230 if r=0 then ms=&h00:h=0:goto 300
240 if r=1 then ms=&h80:h=0:goto 300
250 if r=2 then ms=&h00:h=1:goto 300
260 if r=3 then ms=&h80:h=1:goto 300
270 end
300 poke &hf002,s
310 poke &hf00e,h
320 for m=0 to &h7f
330  print hex$(m);"xx : ";
340  poke &hf00a,m+ms
350  poke &hf015,m
360  for l=0 to &hff
370   poke &hf006,l
380   poke &hf014,l
390   a=&hf000:call a
391   if (l>=0 and l<=7) or (l>=248 and l<=255) then a=peek(&hf01b):print right$("0"+hex$(a),2);" ";else if l mod 16=0 then print ".";
400  next l
401 print ""
410 next m

range 0~3でそれぞれ実行。bsave #-1,"KANJI",0,&h8000でwavファイルに録音して、wave2binでバイナリ化。ヘッダーと最後を削除、出来た4つのバイナリを合成して「kanji.rom」というファイル名で保存。

本体付属のカセットは、データレコーダーをPCに接続して、「ぷちれこ」でそのままwavファイルに保存。
パソピア7のデータレコーダーもあったが、シャープポケコン用のデータレコーダーを使用。
ポケコン用の方はトーン調整ができて、比較的データ化けが少なかったと思う

エミュレータをちょっと改良して、漢字ROMを試してみると、
表示できた。
#SCREEN 2でないと表示できないのね。。

2012年2月25日土曜日

パソピアのROM吸出し

次はパソピアのROM吸出し
まずは、実機を用意。RAM PACがあると更に便利

前回、パソピア7のBIOS吸出しで使ったプログラムをそのまま使う
RAM PACに保存しておけば、パソピア<->パソピア7間で、プログラムの受け渡しが簡単

パソピア7のBASICと同じように2回に分けて録音
同じプログラムをRUNで実行し、以下のように入力
前半
Memory Mode
(0bit:ROM[0:OnboardROM, 1:ROM Pack], 1bit:RAM[0:ROM Mode, 1:64KRAM Mode]) &H00
Source Address: &H0000
Destination Address: &H9000
Translation Byte: &H4000
・・・
BSAVE #-1,"BASIC1",&H9000,&H4000
後半
Memory Mode
(0bit:ROM[0:OnboardROM, 1:ROM Pack], 1bit:RAM[0:ROM Mode, 1:64KRAM Mode]) &H00
Source Address: &H4000
Destination Address: &H9000
Translation Byte: &H4000
・・・
BSAVE #-1,"BASIC2",&H9000,&H4000

パソピア7と同じように、バイナリエディタでそれぞれ0x4000バイトに編集。
あわせて0x8000バイトのファイルを作成し、「TBASIC10.ROM」 or 「TBASIC11.ROM」というファイル名で保存。
T-BASICには、Ver1.0とVer1.1の2種類のROMが存在するが、どちらも同じ吸出し方

次は、OA-BASICを吸い出し

写真のようにOA-BASICがROM PACから起動されている場合、BSAVEする前に以下を実行して、ROM PACへバンク切り替えしておく
OUT #60,1

以下のコマンド打ち込んでwavファイルに録音
BSAVE "CT1","OABAS",0,32767,32768

ROM PACのOA-BASICバイナリを画面に表示させたい場合、
OA-BASICで以下を実行し、T-BASIC ROMにバンク切り替え
OUT #60,0

その後、本体背面のリセットボタンを押すと、T-BASICが起動。
先ほどのプログラムを実行して、ROMの内容をダンプ

保存したwavファイルをweb2bin.exeでbinファイルに変換。ダンプ表示と同じになるように、バイナリエディターでヘッダー部分などを削除。0x8000バイトになったら、「OABASIC.ROM」というファイル名で保存。

最後に、Mini Pascalの吸出し
これが一番大変だった。

ROM PACをパソピアにセットして起動。
Mini Pascalが立ち上がったら、以下を入力して実行。
.INSERT
1 PROGRAM ROM;
2  BEGIN
3   OUT (60,0);
4 END.
.RUN


しばらくしてT-BASICの「How many files(0-15)?」が表示されたら、背面のリセットボタンでリセット
(一度リセットしないと、文字が入力できない状態)
これでT-BASICが使える状態になるので、BASIC吸出しで使ったプログラムでROM内容をコピーする。

ここで問題。コピーサイズが大きいと、メモリーコピーしている途中でハングしてしまう。
ハングしたら、一旦電源OFFでやり直し。

そこでコピーサイズは0x0100程度にして、コピーするたびにRAM PACに逐次保存していく、の繰り返し。
ときどきハングするので、RAM PACから保存してある部分をロードしなおして、やり直し。

あとは、BASICの吸出しと同じ手順でROMファイルを作成。作成したファイルは「PASCAL.ROM」で保存しておく

2012年2月24日金曜日

パソピアのエミュレータ

東芝のパソコンというと、御三家に比べてマイナーでソフトも少なかった。
そんなマイナー機のエミュレータを作っている人がいて、ちょっと感動。
ありがたく使わせてもらう。

まずはパソピア7。BIOSとBASICを吸い出す必要があるので、実機を用意。
データレコーダーとの接続ケーブルも必要。

録音は ぷちれこ(PetitRec)を使用。設定は48000Hz/8ビット/モノラルで録音。
Vistaでは録音できなかったのでXPで使用。XPなら64bit版XPでも大丈夫だった。

データレコーダー接続ケーブルの録音端子(赤)を、PCのライン入力に接続。
サウンドカードによっては結構ノイズを拾ってしまうので、品質の良いサウンドカードをお勧め。

パソピア7で、以下を入力。
コメントを入れるとオーバーメモリーになるので、コメント部分は入力しないどく
1000 CLEAR ,&H8FFF
1010 WIDTH 80
1020 GOSUB 2010
1030 GOSUB 9010
1040 IF VER<>5 THEN GOSUB 9010
1050 GOSUB 2110
1060 A=&HF000:CALL A
1070 S=VAL("&H"+DA$)
1080 GOSUB 3010
1090 PRINT "":PRINT "... "
1100 S=VAL("&H"+DA$)+VAL("&H"+TB$)-128
1110 GOSUB 3010
1990 END

2000 '--- Version Check ---
2010 P=PEEK(&HFFFB)
2020 IF P=&H58 THEN VER=1:PRINT"T-ROM Ver 1.0"
2030 IF P=&H0C THEN VER=2:PRINT"T-ROM Ver 1.1"
2040 IF P=&H76 THEN VER=3:PRINT"T-DISK Ver 1.0"
2050 IF P=&H45 THEN VER=4:PRINT"T-DISK Ver 2.0"
2060 IF P=&H84 THEN VER=5:PRINT"T-BASIC7 Ver 1.0"
2070 IF VER=0 THEN PRINT"Unknown Version"
2080 RETURN

2100 '--- Set Parameter ---
2110 A=&HF0F0
2200 PRINT"Memory Mode ";
2210 IF VER=5 THEN PRINT"(1:BIOS, 2:RAM, 4:V-RAM, 8:I/O Memory Mode)"; ELSE PRINT"(0bit:ROM[0:OnboardROM, 1:ROM Pack], 1bit:RAM[0:ROM Mode, 1:64KRAM Mode])";
2220 INPUT" &H",MM$
2300 POKE A+0, VAL("&H"+MM$) :'F0F0 メモリーモード 0bit:BIOS, 1bit:RAM, 2bit:V-RAM, 3bit:I/O Memory Mode
2310 POKE A+1, VAL("&H"+VS$) :'F0F1 V-RAM Select 11H:Blue, 22H:Red, 44H:Text/Green
2320 POKE A+2, VAL("&H"+RIGHT$(SD$,2)):'F0F2 転送元アドレス
2330 POKE A+3, VAL("&H"+LEFT$(SD$,2))
2340 POKE A+4, VAL("&H"+RIGHT$(DA$,2)):'F0F4 転送先アドレス
2350 POKE A+5, VAL("&H"+LEFT$(DA$,2))
2360 POKE A+6, VAL("&H"+RIGHT$(TB$,2)):'F0F6 転送バイト数
2370 POKE A+7, VAL("&H"+LEFT$(TB$,2))
2380 RETURN 

3000 ' --- Display Memory ---
3010 FOR I=S TO S+127
3020 IF I MOD 16=0 THEN PRINT "":PRINT RIGHT$("000"+HEX$(I),4);": ";
3030 A=PEEK(I):PRINT RIGHT$("0"+HEX$(A),2);" ";
3040 NEXT I
3050 RETURN

9000 ' --- Set Data ---
9010 A=&HF000
9020 READ D$
9030 WHILE D$<>"END"
9040 POKE A,VAL("&H"+D$)
9050 A=A+1
9060 READ D$
9070 WEND
9080 RETURN

9100 ' --- Data ---
9200 ' Initialize
9210 DATA DB,22 :'F000 IN A,(22H) メモリーステータス取得 0bit:BIOS, 1bit:RAM 
9220 DATA E6,03 :'F002 AND 03H マスクしてスタック
9230 DATA F5 :'F004 PUSH AF
9240 DATA 00,00,00,00,00,00,00:'F005-F00B NOP パソピア用のために空けておく

9300 'V-RAM Bank Switching
9310 DATA F3 :'F00C DI 割り込み禁止
9320 DATA 3A,F0,F0 :'F00D LD A,(0F0F0H)
9330 DATA D3,3C :'F010 OUT (3CH),A メモリモードセット
9340 DATA 3E,03 :'F012 LD A,03H
9350 DATA D3,0F :'F014 OUT (0FH),A 8255コントロールポート設定
9360 DATA 3A,F1,F0 :'F016 LD A,(0F0F1H)
9370 DATA D3,0C :'F019 OUT (0CH),A V-RAM面セレクト
9380 DATA 3E,08 :'F01B LD A,08H
9390 DATA D3,0D :'F01D OUT (0DH),A アトリビュート設定
9400 DATA FB :'F01F EI 割り込み許可

9500 ' Data Translate
9510 DATA 2A,F2,F0 :'F020 LD HL,(0F0F2H) HL:転送元アドレス
9520 DATA ED,5B,F4,F0:'F023 LD DE,(0F0F4H) DE:転送先アドレス
9530 DATA ED,4B,F6,F0:'F027 LD BC,(0F0F6H) BC:転送バイト数
9540 DATA ED,B0 :'F02B LDIR ブロック転送

9600 ' Restore Memory Bank
9610 DATA F3 :'F02D DI 割り込み禁止
9620 DATA F1 :'F02E POP AF
9630 DATA D3,3C :'F02F OUT (3CH),A メモリモードセット→V-RAMアクセス不可
9640 DATA 3E,02 :'F031 LD A,02H
9650 DATA D3,0F :'F033 OUT (0FH),A 8255コントロールポート設定
9660 DATA FB :'F035 EI 割り込み許可
9670 DATA C9 :'F036 RET
9680 DATA END

9700 ' Initialize for Pasopia T/5
9710 DATA DB,22 :'F000 IN A, (22H) メモリーステータス取得 2bit:RAM(0:ROMモード, 1:64KRAMモード), 3bit:ROM(0:本体ROM, 1:ROMパック)
9720 DATA E6,0C :'F002 AND 0CH 2, 3bitをマスク
9730 DATA 0F :'F004 RRCA Aを3回右ローテイト
9740 DATA 0F :'F005 RRCA
9750 DATA 0F :'F006 RRCA
9760 DATA 30,02 :'F007 JR NC,LF00B 2bit:CarryフラグにRAMの値。Cy=0でジャンプ
9770 DATA F6,02 :'F009 OR 02H 1bit:RAMをセット
9780 DATA F5 :'F00B LF00B: PUSH AF
9790 DATA END
RUN で実行し、以下のように入力してBIOSの内容を0x9000~0xCFFFにコピー
Memory Mode (1:BIOS, 2:RAM, 4:V-RAM, 8:I/O Memory Mode) &H1
Source Address: &H4000
Destination Address: &H9000
Translation Byte: &H4000
画面上には先頭と最後のバイナリが表示されるので、メモっとく。
Windowsでぷちれこの録音を開始して、パソピア側で
BSAVE #-1,"BIOS",&H9000,&H4000
でwavファイルに保存。

エミュレータに同梱されているwav2bin.exeに、録音したwavファイルをドラッグ&ドロップ。
生成されたbinファイルをバイナリエディタで開いて、パソピアの画面に表示されているバイナリと同じになるように、余分なバイナリを削除。
正常に録音できた場合、先頭のヘッダー部分38バイトと、最後の1バイトを削除すると同じになるはず。
もしずれている場合、ノイズなどで正常に録音できていない可能性があるので、録音レベルやサウンドカードを見直してみる
できたバイナリは、「BIOS.ROM」 というファイル名で保存

BASICは2回に分けて録音
前半
Memory Mode (1:BIOS, 2:RAM, 4:V-RAM, 8:I/O Memory Mode) &H8
Source Address: &H0000
Destination Address: &H9000
Translation Byte: &H4000
・・・
BSAVE #-1,"BASIC1",&H9000,&H4000
後半
Memory Mode (1:BIOS, 2:RAM, 4:V-RAM, 8:I/O Memory Mode) &H8
Source Address: &H4000
Destination Address: &H9000
Translation Byte: &H4000
・・・
BSAVE #-1,"BASIC2",&H9000,&H4000

BIOSと同じように、バイナリエディタでそれぞれ0x4000バイトに編集。
あわせて0x8000バイトのファイルを作成し、「BASIC.ROM」 というファイル名で保存。