Skip to content

Commit ed2fd81

Browse files
committed
add initial support for DRIVER.SYS
currently only skeleton logic and implementation of install check & get drive data table list [returns ddt* which allows mapping DOS drive # to BIOS drive # for drives handled by default DOS block driver]
1 parent 8bdb2db commit ed2fd81

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

kernel/inthndlr.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1922,6 +1922,7 @@ extern intvec FAR ASM BIOSInt19;
19221922
/* WARNING: modifications in `r' are used outside of int2F_12_handler()
19231923
* On input r.AX==0x12xx, 0x4A01 or 0x4A02
19241924
* also handle Windows' DOS notification hooks, r.AH==0x16 and r.AH==0x13
1925+
* along with DRIVER.SYS/DRIVPARAM r.AH=0x08 calls
19251926
*/
19261927
VOID ASMCFUNC int2F_12_handler(struct int2f12regs FAR *pr)
19271928
{
@@ -2203,6 +2204,30 @@ VOID ASMCFUNC int2F_12_handler(struct int2f12regs FAR *pr)
22032204
#endif
22042205
return;
22052206
}
2207+
else if (r.AH == 0x08) /* DRIVER.SYS / DRIVPARAM */
2208+
{
2209+
switch (r.AL)
2210+
{
2211+
case 0x00: /* installation check */
2212+
r.AL = 0xff; /* installed, 0=not installed */
2213+
break;
2214+
2215+
case 0x01: /* add new block device */
2216+
/* TODO, see push_ddt() */
2217+
break;
2218+
2219+
case 0x02: /* execute device driver request */
2220+
/* TODO */
2221+
break;
2222+
2223+
case 0x03: /* get drive data table */
2224+
r.DS = FP_SEG(&nul_dev);
2225+
r.DI = FP_OFF(getddt(0));
2226+
break;
2227+
}
2228+
2229+
return;
2230+
}
22062231
/* else (r.AH == 0x12) */
22072232

22082233
switch (r.AL)

kernel/main.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,9 @@ STATIC void init_kernel(void)
340340
LoL->lastdrive = 26;
341341

342342
/* init_device((struct dhdr FAR *)&blk_dev, NULL, 0, &ram_top); */
343+
/* WARNING: dsk_init() must be called prior to update_dcb() to ensure
344+
_Dyn (start of Dynamic memory block) is the start of drive data table (see getddt() in dsk.c)
345+
*/
343346
blk_dev.dh_name[0] = dsk_init();
344347

345348
PreConfig();

0 commit comments

Comments
 (0)