Skip to content

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

@SuperTurboZ

Description

@SuperTurboZ

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions