-
Notifications
You must be signed in to change notification settings - Fork 6
Open
Description
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
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels