tablacus / LSX-Dodgers

CP/M80 MSX-DOS Compatible OS(Z80) for SHARP X1/turbo/Z, MZ-700/1500, PC-8801mkIISR and MSX
https://tablacus.github.io/LSX-Dodgers/
MIT License
44 stars 6 forks source link

HDからIPL起動する手段について #9

Open SuperTurboZ opened 2 years ago

SuperTurboZ commented 2 years ago

HDからLD+HDをIPL起動するためには、LDを起動した後にHDドライバを どこから読み込んで実行させるのか、という問題があります。

LD本体の初期化コードを変更する方法もありますが、トリックを使って GRAMドライブから読ませることができたので、その方法を書いておきます。

流れとしては、

1.ドライバを自動実行させるAUTOEXEC.BATとHDD.COMをGRAMディスクに  格納した状態のGRAMイメージを作る。 2.BPB(先頭レコード)の直後の未使用領域にLD.BINとGRAMイメージを格納する。 3.BPBの先頭にX1用のIPLレコードとHD用ローダープログラムを配置する。 4.X1のIPLがHD内のBPB+未使用領域 を読み込んでローダーを実行する 5.ローダーは未使用領域から読まれた LD.BIN と GRAMイメージを再配置して  "G:"ドライブからIPL起動したように偽装してLDを実行する。 6.LDは起動後に "G:AUTOEXEC.BAT" を実行する。 7."G:AUTOEXEC.BAT" は "G:HDD.COM" を実行してHDドライバを有効にして、  カレントドライブを'H:'に変更して"H:AUTOEXEC.BAT" を実行する。

といった感じです。

今回は時間が無く手作業でインストールしましたが、GRAM上に自動実行用の ファイル群を格納した状態で、Sysgenのコマンド等でHDに書き込むようにすれば CDROM、ROMドライブ、独自デバイスなど結構応用が利く方法なのかなと思いました。

G:AUTOEXEC.BAT

HDD
H:
AUTOEXEC

IPLレコード+ローダー

;--------------------------------------------------------------------
;LDX Dodgers HD bootcode
;license: MIT
;note:
;   GRAMにドライバイメージを作り、それを実行させる。
;   GRAM(turboの場合は裏GRAM)を破壊します。
;--------------------------------------------------------------------

;|0000-001F | IPL-FBC (X1)
;|0020-01BC | bootcode (X1)
IPL_TOP             equ 0x0000
;|01BE-01FF | PartitionTable 16x4
PARTITION_TOP       equ IPL_TOP + 0x01BE
PARTITION_SIG       equ IPL_TOP + 0x01FE
;end of MBR

;|0200-2FFF | LSX-Dodgers 1.43 (0xCB00-0xF1FF)
LD_IMG_TOP          equ IPL_TOP+0x0200
;ヘッダがついている
LD_H_SIG            equ LD_IMG_TOP+0
LD_H_TOP            equ LD_IMG_TOP+1
LD_H_END            equ LD_IMG_TOP+3
LD_H_ENTRY          equ LD_IMG_TOP+5
;BODY
LD_DATA_TOP         equ LD_IMG_TOP+7

;|3000-EFFF | GRAM FAT image : HD Driver & autoexec
GRAM_IMG_TOP        equ 0x3000
GRAM_IMG_END        equ GRAM_IMG_TOP+0xC000
;
IPL_SIZE            equ GRAM_IMG_END-IPL_TOP
;
;--------------------------------------------------------------------
IO_DIPSW    equ 0x1FF0

IPL_DRIVE   equ 0xFF87

;--------------------------------------------------------------------
;|0000-001F | IPL-FBC (X1)
;--------------------------------------------------------------------
    org IPL_TOP
;
IPL_FCB:
    db  01h     ;type
    db  "LSX-DodgersHD" ;name
    db  "Sys"       ;extenstion
    db  20h     ;passeord
    dw  IPL_SIZE    ;size
    dw  IPL_TOP     ;top
    dw  ipl_entry   ;entry
    db  0,0,0,0,0   ;date
    db  0,0,0       ;start recoard

;--------------------------------------------------------------------
;|0020-01BC | bootcode (X1)
;--------------------------------------------------------------------
B_PT1FD0:
    db  0x00
;
;--------------------------------------------------------------------
;FCBにより、LD,GRAMイメージもロードされているので
;再配置して実行するだけででよい
ipl_entry:
    di
    ld  sp,0
;------------------------------------------------
;機種判定
    ld  bc,0x37fe
    ld  a,b
    out (c),b
    ld  b,0x3f
    out (c),b
    in  a,(0xff)
    cp  b
    jr  z,isx1
;X1turboの場合は裏GRAMにする
;ハイレゾスイッチ確認
    ld  a,high IO_DIPSW
    in  a,(low IO_DIPSW)
    rrca                ;CF=DSW.HIRESO
    ld  a,0x02          ;200line
    jr  c,$+4
    or  0x01            ;HiReso 200line
is_std:
    ld  (B_PT1FD0),a
    ld  bc,0x1fd0
    or  0x10            ;BANK1 access
    out (c),a
;------------------------------------------------
;Z check
;   in  e,(c)
;   cp  e
;   jr  nz,nonz
;アナログパレット初期化
    xor a
    ld  bc,0x1fb0
    out (c),a
nonz:
isx1:
;------------------------------------------------
;HDDドライバの入ったFATイメージを 'GRAM'に転送する
    ld  hl,GRAM_IMG_TOP
    ld  bc,0x4000
gram_fs_l:
    inc b
    outi
    inc c
    inc b
    outi
    inc c
    inc b
    outi
    inc c
    inc b
    outi
    inc c
    jr  nz,gram_fs_l
    inc b
    jr  nz,gram_fs_l
;------------------------------------------------
;X1turboの場合は表GRAMに戻す
    ld  a,(B_PT1FD0)
    or  a
    jr  z,bank0_x1
    ld  bc,0x1fd0
    out (c),a
;GRAM表はクリアしないと起動時に見えてしまう。
    ld  bc,0x4000
    ld  e,0
gram_clr_l:
    out (c),e
    inc c
    out (c),e
    inc c
    out (c),e
    inc c
    out (c),e
    inc c
    jr  nz,gram_clr_l
    inc b
    jr  nz,gram_clr_l
;
bank0_x1:
;------------------------------------------------
;LDを正しい位置に転送
    ld  hl,LD_DATA_TOP
    ld  de,(LD_H_TOP)
    ld  hl,(LD_H_END)
    ld  c,l
    ld  b,h
    ld  hl,LD_DATA_TOP
    ldir
;------------------------------------------------
;LDに起動ドライブを'G:'(GRAM)として識別させて
;"G:AUTOEXEC.BAT"を実行させる
    ld  a,'G'-'A'
    ld  (IPL_DRIVE),a
;------------------------------------------------
;LDを起動する
    ld  hl,(LD_H_ENTRY) ;LDがバグってるので直す
    jp  (hl)
;------------------------------------------------
;|01BE-01FF | PartitionTable 16x4
;------------------------------------------------
; if $ >= (IPL_FCB+PARTITION_TOP)
;   error   "Boot Code over area"
; endif
    org PARTITION_TOP
;パーティションデータブロック
;HDイメージから抜き出したものをincludeしたが
;本来はSYSgenで、ここは書き込まない、ということをする。

    include "..\img\mbr.img",B
;   include "lsxboot.vhd",B,0x01BE,0x0042
;------------------------------------------------
;|0200-2FFF | LSX-Dodgers 1.43 (0xCB00-0xF1FF)
;------------------------------------------------
;LSX Dodfers OS本体のイメージ
    org     LD_IMG_TOP
    include "..\img\ld.bin",B
;------------------------------------------------
;|3000-EFFF | GRAM FAT image : HD Driver & autoexec
;
;GRAMドライブのイメージ
;イメージ内に HDドライバと、ドライバを読み込ませる
;AUTOEXEC.BATを格納しておく。
    org GRAM_IMG_TOP    
    include "..\img\gram.img",B
tablacus commented 2 years ago

いろいろ応用できそうな感じですね。 ただ、LSX-Dodgers 1.45でGRAMディスクのDPBを少し変えちゃったのですが大丈夫ですか? ダメだったら元に戻します。 https://github.com/tablacus/LSX-Dodgers/releases

SuperTurboZ commented 2 years ago

今回作ったものはLDのバージョンごと凍結させるのでDPBの変更は問題ないです。

GRAMドライブに必要なファイルをコピーした状態から、

SYSHD {HDドライブ}  {MBRに書き込むファイル}

のようなコマンドで書き込むようにすればよいかなと考えていますがいかがでしょうか。 ISO9660だとBOOTブロックが32KBしかないので、GRAMドライブは容量を指定するかランレングス圧縮かけた方がよいのかもしれません。 どちらにしてもX1turboの標準BIOS-ROMではSCSI CDROMからIPL起動することは出来ないのですが。

tablacus commented 2 years ago

ちょっと違うアプローチですが、LD本体と外部コマンド1つをまとめる外部コマンドを作ってみました。

以下のように外部コマンドと作成するシステムのパスとデフォルトにしたいドライブ名を入れて実行するとLD本体と外部コマンドをまとめたMSXバイナリ形式のシステムファイルができます。

MAKESYS 外部コマンドのパス 作成するシステムのパス [ドライブ名]

例えば、「hdd.com」をまとめて「h:」で起動する「ldhd,bin」を作成したい場合は以下のようになります。

makesys hdd.com ldhd.bin h:

以下のようにデフォルトドライブのautoexec.bat(autoexec.com)を実行します。 image

ho-ogino commented 1 year ago

こちらでのやりとりを参考に、ある程度簡単にHDDからの起動を行うための手順を下記にまとめてみました(LD-hddリポジトリ内)。

https://github.com/ho-ogino/LD-hdd/tree/main/ld-hddboot

まだ若干手順が煩雑なので、もう少し整理する可能性もありますが、ひとまずはある程度誰でも動かせるものを置いておこう、という感じです。

例によってGakuさんとすーぱーたーぼさんの成果物を利用させていただきました。ありがとうございます……!