Mounter: Support fake ConfigDev

Needed when booting from non-autoconfig devices / ROM
This commit is contained in:
Matt Harlum 2024-11-25 01:30:46 +00:00
parent a3900a01ee
commit cbeb5e5cbc
3 changed files with 22 additions and 5 deletions

View File

@ -49,7 +49,8 @@ OBJ = device.o \
mounter.o \ mounter.o \
debug.o debug.o
ASMOBJ = endskip.o ASMOBJ = bootblock.o \
endskip.o
SRCS = $(OBJ:%.o=%.c) SRCS = $(OBJ:%.o=%.c)
SRCS += $(ASMOBJ:%.o=%.S) SRCS += $(ASMOBJ:%.o=%.S)

14
bootblock.S Normal file
View File

@ -0,0 +1,14 @@
.globl _bootblock, _bootblock_end
_bootblock: lea DosName(PC),A1
jsr -96(A6) /* FindResident */
tst.l D0
beq.s fail
move.l D0,A0
move.l 22(A0),A0 /* RT_INIT */
jsr (A0)
fail: rts
DosName: .asciz "dos.library"
_bootblock_end:

View File

@ -60,8 +60,8 @@
#define MAX_BLOCKSIZE 2048 #define MAX_BLOCKSIZE 2048
#define LSEG_DATASIZE (512 / 4 - 5) #define LSEG_DATASIZE (512 / 4 - 5)
#define NO_CONFIGDEV 1
#if NO_CONFIGDEV #if NO_CONFIGDEV
extern UBYTE entrypoint, entrypoint_end;
extern UBYTE bootblock, bootblock_end; extern UBYTE bootblock, bootblock_end;
#endif #endif
@ -751,8 +751,8 @@ static void CreateFakeConfigDev(struct MountData *md)
configDev = AllocConfigDev(); configDev = AllocConfigDev();
if (configDev) { if (configDev) {
configDev->cd_BoardAddr = (void*)&entrypoint; configDev->cd_BoardAddr = NULL;
configDev->cd_BoardSize = (UBYTE*)&entrypoint_end - (UBYTE*)&entrypoint; configDev->cd_BoardSize = 0;
configDev->cd_Rom.er_Type = ERTF_DIAGVALID; configDev->cd_Rom.er_Type = ERTF_DIAGVALID;
ULONG bbSize = &bootblock_end - &bootblock; ULONG bbSize = &bootblock_end - &bootblock;
ULONG daSize = sizeof(struct DiagArea) + bbSize; ULONG daSize = sizeof(struct DiagArea) + bbSize;
@ -762,7 +762,9 @@ static void CreateFakeConfigDev(struct MountData *md)
diagArea->da_BootPoint = sizeof(struct DiagArea); diagArea->da_BootPoint = sizeof(struct DiagArea);
diagArea->da_Size = (UWORD)daSize; diagArea->da_Size = (UWORD)daSize;
copymem(diagArea + 1, &bootblock, bbSize); copymem(diagArea + 1, &bootblock, bbSize);
*((ULONG*)&configDev->cd_Rom.er_Reserved0c) = (ULONG)diagArea; // cd_Rom.er_Reserved0c is used as a pointer to diagArea by strap
ULONG *da_Pointer = (ULONG *)&configDev->cd_Rom.er_Reserved0c;
*da_Pointer = (ULONG)diagArea;
cacheclear(md); cacheclear(md);
} }
md->configDev = configDev; md->configDev = configDev;