前回でラインエディタEDについてソースの編集作業に慣れてきたので、ディスクの容量アップに挑戦していきたいと思います。

今後のステップとして
1、アセンブラMACのDISKDEFマクロライブラリーを使用し、ディスク容量拡張のディスクパラメータを生成し、BIOSに反映する。

2、ディスク容量拡張のSDCARDをcpmtoolsを活用して作成

3、ディスク容量拡張に沿って、1部BIOSのサブルーチンを更新

というような形で進めたいと思います。

まず、どのような、ディスク容量にするか決めていきましょう。

実はSDCARDのブロック(セクタ)位置を算出しているルーチンでは、ディスク番号、トラック番号を基に計算する際に、ループを回して掛け算を行って計算しています。これでは、これら番号によって計算時間が異なり、計算にも時間がかかっています。
そこで、この計算を簡単にするために 2のn乗にすることで、シフト命令で乗算を計算ができ、計算時間が一定になります。
ディスク番号、トラック番号は任意の値をとるので、2のn乗にすることができませんが、トラック数、セクタ数は一定ですので、こちらを2のn乗になるような数値に設定します。

ということでトラック数、セクタ数は次のような値としました。

セクタ   64  2の6乗 (0x40)
トラック 128   2の7乗 (0x80)

1セクタ 128byte 4ドライブは変更なし

実際の8インチディスクドライブではヘッドのアクセス速度を均一にするためにスキューが設定されていますが、SDCARDでは、読み書き速度はブロック(セクタ)位置により速度は、変わらないので、スキューは設定しないことにします。

また、ファイル容量の最小単位は 現状では1Kbyteですが、容量アップに伴い、2Kbyte(2048byte)としました。
1ディレクトリのエントリー数は、128としました。

システム領域(CCP+BDOS+BIOS)は15セクタ(1セクタ512byte)あれば十分なので、トラック0のみを使用します。したがって、システムトラックのオフセットは 1となります。

アセンブラMACで生成されるディスクパラメータはDISKDEFマクロライブラリーを使用し、設定に必要なパラメータは次のようになっています。

1、ロジカルディスクナンバー  a:>0 B:>1 C:>2 ・・・
2、最初のセクタNO. 0or1
3、最後のセクタNO. ここでは 64
4、スキュー ここでは設定なし
5、ブロックサイズ
   ファイル最小単位 ここでは 2048 byte
6、システムトラックを除く、1ドライブの容量
   (セクタバイト数×セクタ数×(トラック数-システムトラック数))/ファイル最小単位バイト
  で計算されるので、ここでは
   (128×64×(128-1))/2048=508
7、ディレクトリ数
   ここでは 128
8、チェックするデレィクトリ数
   ここでは 128
9、システムトラックのオフセット
   ここでは 1

なお、2行目のDISKDEFでは ドライブ番号の次に同じドライブパラメータを設定する場合は、そのドライブ番号を記述します。

実際のDISKDEFマクロに使用するソースは次のようになりました。
ed で表示されているので、先頭に行番号が表示されています。

    1:  ; new original disk 128 truck 64 sector no skew
    2:
    3:          maclib  diskdef
    4:
    5:          org     0f233h
    6:
    7:          disks   4
    8:
    9:          diskdef 0,1,64,,2048,508,128,128,1
   10:
   11:          diskdef 1,0
   12:          diskdef 2,0
   13:          diskdef 3,0
   14:
   15:          org     0f71fh
   16:
   17:          endef
   18:
   19:          end

3行目で、diskdefマクロライブラリの使用を宣言しています。
5行目は、BIOSのディスクパラメータのアドレスを指定しています。
アセンブリした結果は、マクロ展開されたソースのみを使用するので、適当でかまいませんが、一応現時点でのBIOSのディスクパラメータの先頭アドレスを記載しています。
7行目はディスクドライブ数 ここでは 4ドライブ(A/B/C/Dドライブ)
9行目は、前述したパラメータを記載しています。
11・12・13行目はそれぞれ、ドライブB/C/D(1/2/3)のパラメータで、ドライブA(0)と同じ設定になります。したがって、トラック0はシステムに割り当てられますが、容量を大きくしたので良しとしました。
15行目は、17行目のエントリーパラメータの先頭アドレスを指定しています。
これも、適当でかまいませんが、現状のBIOSのエントリーパラメータの先頭アドレスを指定しています。
17行目は エントリーパラメータを指定しています。

上記ソースをファイリ名 NEW8SK0.ASMとして アセンブラMACでアセンブリします。

A>mac new8sk0.asm
CP/M MACRO ASSEM 2.0
F91F
011H USE FACTOR
END OF ASSEMBLY

A>

アセンブルすると、.PRNファイル(ここではNEW8SK0.PRN)が生成されるので、EDまたはtypeコマンドで表示し、端末上から領域を指定してからコピーを取り、rasbianなどのOSのeditorに張り付けします。

ここからは OSのeditorで ソース部分を抜き出します。
そして、 置換で 0000H、DW、DB、DS、EQUをそれぞれ、0x0000、.dw、.db、.ds、.equに置換します。

BIOSに適応します。
下記に必要な部分のみ抜き出してみました。

次回は、SDCARDでCP/Mディスクを作成していきたいと思います。

;;
;;    original  DISKS  128 track 64 sector 4 disk
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	disk Parameter header for disk 00
dpbase:
DPE0:   .dw      XLT0,0x0000     ;TRANSLATE TABLE
        .dw      0x0000,0x0000   ;SCRATCH AREA
        .dw      DIRBUF,DPB0     ;DIR BUFF,PARM BLOCK
        .dw      CSV0,ALV0       ;CHECK, ALLOC VECTORS
DPE1:   .dw      XLT1,0x0000     ;TRANSLATE TABLE
        .dw      0x0000,0x0000   ;SCRATCH AREA
        .dw      DIRBUF,DPB1     ;DIR BUFF,PARM BLOCK
        .dw      CSV1,ALV1       ;CHECK, ALLOC VECTORS
DPE2:   .dw      XLT2,0x0000     ;TRANSLATE TABLE
        .dw      0x0000,0x0000   ;SCRATCH AREA
        .dw      DIRBUF,DPB2     ;DIR BUFF,PARM BLOCK
        .dw      CSV2,ALV2       ;CHECK, ALLOC VECTORS
DPE3:   .dw      XLT3,0x0000     ;TRANSLATE TABLE
        .dw      0x0000,0x0000   ;SCRATCH AREA
        .dw      DIRBUF,DPB3     ;DIR BUFF,PARM BLOCK
        .dw      CSV3,ALV3       ;CHECK, ALLOC VECTORS
;
;	sector translate vector

;;       DISKDEF 0,1,64,,2048,508,128,128,1
dpblk:	;disk parameter block, common to all disks
DPB0:               ;DISK PARM BLOCK
        .dw      64              ;SEC PER TRACK
        .db      4               ;BLOCK SHIFT
        .db      15              ;BLOCK MASK
        .db      0               ;EXTNT MASK
        .dw      507             ;DISK SIZE-1
        .dw      127             ;DIRECTORY MAX
        .db      192             ;ALLOC0
        .db      0               ;ALLOC1
        .dw      32              ;CHECK SIZE
        .dw      1               ;OFFSET

XLT0	.equ	 0	         ;NO XLATE TABLE

DPB1    .equ     DPB0    ;.equIVALENT PARAMETERS
XLT1    .equ     XLT0    ;SAME TRANSLATE TABLE
;;      DISKDEF 2,0
DPB2    .equ     DPB0    ;.equIVALENT PARAMETERS
XLT2    .equ     XLT0    ;SAME TRANSLATE TABLE
;;      DISKDEF 3,0
DPB3    .equ     DPB0    ;.equIVALENT PARAMETERS
XLT3    .equ     XLT0    ;SAME TRANSLATE TABLE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

・
・
中略
・
・
;	scratch ram area for bdos use
;begdat	equ	$	 	;beginning of data area
DIRBUF: .ds      128     ;DIRECTORY ACCESS BUFFER
ALV0:   .ds      64
CSV0:   .ds      32
ALV1:   .ds      64
CSV1:   .ds      32
ALV2:   .ds      64
CSV2:   .ds      32
ALV3:   .ds      64
CSV3:   .ds      32
おすすめの記事