★概要
DISK-BASICの制約として、起動可能なディスクが
例えば1MB版なら1MBのものしか作れないわけですが、
今回は1MB版のDISK-BASICから640KB 2DDなDISK-BASICを
作ってみようという趣旨の企画です。
ちなみに640KB -> 1MBもできる
更に1MB -> 320KB(2D)にもできる
※ただしFATがトラック18サイド1にあるため、そこまでに
DISK-CODEがおさまる必要アリ。
★1MB <-> 640KBができるディスク
Ver 2.0以降の640KB または 1MBなDISK-BASICが対象です
※品番とバージョンの関係はこちらも参照
N88BASIC バージョン一覧
Ver 3.0, PC-98H44以降のディスクは
おそらく無改変で2HD <--> 2DDに出来ると思います。
Ver 2.0, PC-98H39-4WとPC-98H87はIPLの改変が必要ですが、
DISK-CODEは無改変で移植できます。
Ver 1.0, PC-9884はそもそも2DD未対応です。
2DD対応のPC-98H37-4Wというものがあるという噂を聞きますが、
未対応なPC-9884を2DD仕様にするのはしんどそうです。
尚、EPSONのDISK BASICは未検証です。
★1MB (640KB) <-> 320KBができるディスク
Ver 3.0以降は無改変で移植できると思いますが、
DISK CODEのサイズがFAT領域(トラック18サイド1)を超えると×
起動はできるがファイルの読み書きができなくなる
Ver 2.0,PC-98H39-4Wは無改変で移植できます。
PC-98H87はIPLの改変が必要です。内容は1MBに同じ。
Ver 1.0, PC-9884とPC-9835-2WはIPLの改変が必要ですが、
DISK-CODEは無改変で移植できます。
★やり方
要約
・移植元:IPLとDISKCODEを抽出
・移植先:IPLとDISKCODEを所定の位置に書く
・移植先:FATを調整する
用意するもの
・移植元となるDISK-BASIC
・移植先のフロッピー(フォーマット済)
640KB->1MBでは、1MBのトラック0サイド0が128bytes/Secと若干面倒
・バイナリエディタ
Windows 10機でディスクイメージを操作したほうがいい
ベタイメージ化はVectorのPDPがオススメ。
https://www.vector.co.jp/soft/dl/dos/util/se023706.html
FAT関連の操作はVectorのFDSがオススメ。
https://www.vector.co.jp/soft/dos/util/se000577.html
移植元のDISK-BASICを対象に
1. IPL抽出 先頭(トラック0サイド0セクタ1)から512bytes
2. FATを見てDISK-CODEのサイズを概算
FATの位置:
1MB:トラック35サイド0セクタ24-26
640KB:トラック40サイド0セクタ14-16
320KB:トラック18サイド1セクタ14-16
140KB:トラック18 セクタ14-16
FDS > Sectorで見ると楽
ここではFEが何連続しているかを数える
トラック0サイド0クラスタ0を先頭として、
1バイト=1クラスタで使用状況が書いてある
数える事で、どのサイドまでがDISK-CODE
かを大まかに知ることができる
1MBなら1クラスタ = 26セクタ = 1サイド
640KBなら 1クラスタ = 16セクタ = 1サイド
320KBなら 1クラスタ = 8セクタ = 0.5サイド (注意!)
140KBなら 1クラスタ = 8セクタ = 0.5サイド (注意!)
3. DISK-CODEのバイナリ抽出
1MB:トラック1サイド0セクタ1から
640KB:トラック0サイド0セクタ3から
320KB:トラック0サイド0セクタ3から
140KB:トラック0 セクタ3から
2.で調べたサイドまで全抽出
以下は移植先のディスクで
4. IPLを書く 先頭から512bytes
5. DISK-CODEのバイナリを書く
1MB:トラック1サイド0セクタ1から
640KB:トラック0サイド0セクタ3から
320KB:トラック0サイド0セクタ3から
140KB:トラック0 セクタ3から
6. FATを編集
1MB:トラック35サイド0セクタ24-26
640KB:トラック40サイド0セクタ14-16
320KB:トラック18サイド1セクタ14-16
140KB:トラック18 セクタ14-16
2.で調べたクラスタ数をもとに計算し、
DISK-CODEのあるサイドをFEとしてマークする
1MB以外ではクラスタ0が開始地点だが、
1MBではトラック1サイド0クラスタ2からが
DISK-CODE領域なので開始クラスタに注意
1クラスタあたりの容量:
1MB: 256bytes ×26
640KB: 256bytes ×16
320KB: 256bytes ×8 (注意:1サイド=2クラスタ)
140KB: 256bytes ×8 (注意:1トラック=2クラスタ)
FDS > SectorでRキーを連打して
どこまであるか見たほうがはやいと思う
★PC-98H39 / PC-98H87間の移植について
IPLを変える必要アリ。
以下はDISKTUT2.LZHにある、PC-98H39-4WのIPLの解説
+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
0000 BE C0 1F 8E D6 BC 00 02-B8 5F 0E CD 1B A0 84 05
0010 B4 07 CD 1B 72 EA BB 00-98 B5 01 B1 00 B6 00 B2
0020 03 BE 00 10 8E C6 BD 00-00 E8 1D 00 A0 00 05 0C
0030 50 A2 00 05 BE 60 00 8E-DE C6 06 05 05 01 B8 00
0040 E8 50 B8 02 00 50 CB FE-C2 80 FA 11 72 09 80 F6
0050 01 B2 01 75 02 FE C1 53-81 FB 00 01 72 03 BB 00
0060 01 B4 56 CD 1B 72 99 5B-81 C5 00 01 81 EB 00 01
0070 77 D5 C3 00 00 00 00 00-00 00 00 00 00 00 00 00
1FC0:0000 BEC01F MOV SI,1FC0
1FC0:0003 8ED6 MOV SS,SI
1FC0:0005 BC0002 MOV SP,0200 ;スタックの設定
1FC0:0008 B85F0E MOV AX,0E5F ;DISK BIOS SET
1FC0:000B CD1B INT 1B ;5"FD両面モードの設定
1FC0:000D A08405 MOV AL,[0584] ;disk_boot
1FC0:0010 B407 MOV AH,07 ;DISK BIOS RECALIBRATE
1FC0:0012 CD1B INT 1B ;ヘッドのシリンダ0への移動
1FC0:0014 72EA JB 0000 ;エラー処理
1FC0:0016 BB0098 MOV BX,9800 ;読み込むバイト数
1FC0:0019 B501 MOV CH,01 ;セクタ長(N=1 256バイト)
1FC0:001B B100 MOV CL,00 ;シリンダNo.0
1FC0:001D B600 MOV DH,00 ;ヘッド No.0
1FC0:001F B203 MOV DL,03 ;セクタ No.3
1FC0:0021 BE0010 MOV SI,1000
1FC0:0024 8EC6 MOV ES,SI ;読み込むセグメント
1FC0:0026 BD0000 MOV BP,0000 ;読み込むオフセット
1FC0:0029 E81D00 CALL 0049 ;READ DATA
1FC0:002C A00005 MOV AL,[0500] ;bios_flag
1FC0:002F 0C50 OR AL,50 ;DISK BASIC 使用フラグ ON
1FC0:0031 A20005 MOV [0500],AL
1FC0:0034 BE6000 MOV SI,0060 ;DISK BASIC ワーク・セグメント
1FC0:0037 8EDE MOV DS,SI
1FC0:0039 C606050501 MOV Byte Ptr [0505],01 ;uc_srvt N88-BASIC(86)
1FC0:003E B800E8 MOV AX,E800
1FC0:0041 50 PUSH AX
1FC0:0042 B80200 MOV AX,0002
1FC0:0045 50 PUSH AX
1FC0:0046 CB RETF ;ROM BASIC へのジャンプ
1FC0:0047 FEC2 INC DL ;セクタNo.+1
1FC0:0049 80FA11 CMP DL,11 ;READ DATA サブルーチン エントリ
1FC0:004C 7209 JB 0057 ;セクタNo.>16?
1FC0:004E 80F601 XOR DH,01 ;ヘッド反転
1FC0:0051 B201 MOV DL,01 ;セクタNo.1
1FC0:0053 7502 JNZ 0057
1FC0:0055 FEC1 INC CL ;ヘッドNo.が0ならシリンダNo.+1
1FC0:0057 53 PUSH BX
1FC0:0058 81FB0001 CMP BX,0100
1FC0:005C 7203 JB 0061 ;最終レコード?
1FC0:005E BB0001 MOV BX,0100
1FC0:0061 B456 MOV AH,56 ;DISK BIOS
1FC0:0063 CD1B INT 1B ;READ DATA データの読み出し
1FC0:0065 7299 JB 0000 ;エラー処理
1FC0:0067 5B POP BX
1FC0:0068 81C50001 ADD BP,0100 ;ポインタ+100h
1FC0:006C 81EB0001 SUB BX,0100 ;カウンタ -100h
1FC0:0070 77D5 JA 0047
1FC0:0072 C3 RET
変更する箇所は赤文字の3箇所。PC-98H87ではこうなる
1FC0:0019 B501 MOV CH,01 ;セクタ長(N=1 256バイト)
1FC0:001B B101 MOV CL,01 ;シリンダNo.1
1FC0:001D B600 MOV DH,00 ;ヘッド No.0
1FC0:001F B201 MOV DL,01 ;セクタ No.1
1FC0:0049 80FA1B CMP DL,1B ;READ DATA サブルーチン エントリ
1FC0:004C 7209 JB 0057 ;セクタNo.>26?
★PC-9835 / PC-9884間の移植について
改変内容は上と全く同じです
・PC-9835-2W(320KB)
1FC0:0019 B501 MOV CH,01 ;セクタ長(N=1 256バイト)
1FC0:001B B100 MOV CL,00 ;シリンダNo.0
1FC0:001D B600 MOV DH,00 ;ヘッド No.0
1FC0:001F B203 MOV DL,03 ;セクタ No.3
1FC0:0049 80FA11 CMP DL,11 ;READ DATA サブルーチン エントリ
1FC0:004C 7209 JB 0057 ;セクタNo.>16?
・PC-9884 (1MB)
1FC0:0019 B501 MOV CH,01 ;セクタ長(N=1 256バイト)
1FC0:001B B101 MOV CL,01 ;シリンダNo.1
1FC0:001D B600 MOV DH,00 ;ヘッド No.0
1FC0:001F B201 MOV DL,01 ;セクタ No.1
1FC0:0049 80FA1B CMP DL,1B ;READ DATA サブルーチン エントリ
1FC0:004C 7209 JB 0057 ;セクタNo.>26?
★PC-9835-1W と PC-9835-2W の移植について
PC-8031-1Wを持っていないため推測ですが、多分無改造で動きます。
変えるとしたらここでしょうか
・PC-9835-1W (140KB)
1FC0:0008 B8500E MOV AX,0E50 ;DISK BIOS SET
1FC0:004E 30F6 XOR DH,DH
1FC0:0050 90 NOP
・PC-9835-2W (320KB)
1FC0:0008 B85F0E MOV AX,0E5F ;DISK BIOS SET
1FC0:004E 80F601 XOR DH,01 ;ヘッド反転
|