From 64474e1dd4254f6d629c41f8c263c9ea9266012e Mon Sep 17 00:00:00 2001 From: Bart Oldeman Date: Sun, 29 Apr 2001 17:34:41 +0000 Subject: [PATCH] A new SYS.COM/config.sys single stepping/console output/misc fixes. git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@216 6ac86273-5f31-0410-b378-82cca8765d1b --- boot/boot.asm | 4 + docs/history.txt | 24 ++++- hdr/fnode.h | 15 +-- hdr/version.h | 2 +- kernel/chario.c | 60 +++++++----- kernel/config.c | 185 ++++++++++++++++++++++++++++++----- kernel/dosfns.c | 181 +++++++++++++++++++++------------- kernel/dsk.c | 240 ++++++++++++++++++---------------------------- kernel/fatdir.c | 85 +--------------- kernel/fatfs.c | 14 +++ kernel/init-mod.h | 5 +- kernel/inithma.c | 4 + kernel/inthndlr.c | 9 +- kernel/intr.asm | 4 +- kernel/io.asm | 140 ++++++++++++--------------- kernel/kernel.asm | 32 +++++-- kernel/main.c | 82 ++++++++++++---- kernel/network.c | 29 +++--- kernel/prf.c | 25 ++++- kernel/proto.h | 7 +- kernel/segs.inc | 5 +- sys/sys.mak | 17 ++-- 22 files changed, 683 insertions(+), 486 deletions(-) diff --git a/boot/boot.asm b/boot/boot.asm index df24137..975cacb 100644 --- a/boot/boot.asm +++ b/boot/boot.asm @@ -27,6 +27,9 @@ ; ; ; $Log$ +; Revision 1.4 2001/04/29 17:34:39 bartoldeman +; A new SYS.COM/config.sys single stepping/console output/misc fixes. +; ; Revision 1.3 2000/05/25 20:56:19 jimtabor ; Fixed project history ; @@ -300,6 +303,7 @@ cont: mov ds, ax mov dx, word [root_dir_start+2] mov di, word [RootDirSecs] xor bx, bx + mov word [tempbuf], LOADSEG mov es, [tempbuf] call readDisk jc jmp_boot_error diff --git a/docs/history.txt b/docs/history.txt index 767226e..68501ab 100644 --- a/docs/history.txt +++ b/docs/history.txt @@ -1,4 +1,26 @@ -2001 Apr 21 - Build 2024 +2001 Apr 29 - Build 2024 +-------- Bart Oldeman (bart.oldeman@bristol.ac.uk) ++ Fixes Bart: + * fixed the "TYPE > FOO.TXT" poor man's editor. + * use "fast console output" (int 29) when applicable. + * moved 5 FILES to DOS DS:00CC and fixed the SFT linked list. + * cleaned up findfirst/findnext for redirected drives. + Tom: + * more VDISK changes (changed slightly by Bart) + * check for presence of A:/B: (changed by Bart to use the BIOS equipment flag + from INT11 instead of INT13). + * added F5/F8 stepping through config.sys; default SHELL=COMMAND.COM /P/E:256 + Use ESC to stop single stepping, F5 to skip remaining config.sys/autoexec.bat. + * new sys: uses INT25/26 instead of the low level INT13 related kernel code from + floppy.asm (see also comments in sys.c) + a few fixes (also boot.asm related) + from Bart. + * Hopefully fixed DateTime Changed + ATTRIB |= ARCHIVE bug. + * cleaned up dsk.c and saved more bytes. + Przemyslaw Czerpak: + * Default lastdrive should be 5 (E) not 6 (F). + * fixed not ignoring whitespace after '=' in config.sys + * noted INT21/AX=3800 bug for getting the country. Put in a workaround for now. + 2001 Apr 21 - Build 2024 -------- Bart Oldeman (bart.oldeman@bristol.ac.uk) + Fixes Tom: * fixed a missing close_dir in fatfs.c. diff --git a/hdr/fnode.h b/hdr/fnode.h index fc829f0..80e9f92 100644 --- a/hdr/fnode.h +++ b/hdr/fnode.h @@ -36,6 +36,9 @@ static BYTE *fnode_hRcsId = "$Id$"; /* * $Log$ + * Revision 1.5 2001/04/29 17:34:40 bartoldeman + * A new SYS.COM/config.sys single stepping/console output/misc fixes. + * * Revision 1.4 2001/04/15 03:21:50 bartoldeman * See history.txt for the list of fixes. * @@ -97,12 +100,12 @@ struct f_node struct { - BOOL f_dmod:1; /* directory has been modified */ - BOOL f_droot:1; /* directory is the root */ - BOOL f_dnew:1; /* fnode is new and needs fill */ - BOOL f_ddir:1; /* fnode is assigned to dir */ - BOOL f_dfull:1; /* directory is full */ - BOOL f_dremote:1; /* Remote Fake FNode */ + BITS f_dmod:1; /* directory has been modified */ + BITS f_droot:1; /* directory is the root */ + BITS f_dnew:1; /* fnode is new and needs fill */ + BITS f_ddir:1; /* fnode is assigned to dir */ + BITS f_dfull:1; /* directory is full */ + BITS f_dremote:1; /* Remote Fake FNode */ } f_flags; /* file flags */ diff --git a/hdr/version.h b/hdr/version.h index 44de54f..134597e 100644 --- a/hdr/version.h +++ b/hdr/version.h @@ -44,4 +44,4 @@ static BYTE *date_hRcsId = "$Id$"; #define REVISION_MINOR 1 #define REVISION_SEQ 24 #define BUILD 2024 -#define SUB_BUILD "a" +#define SUB_BUILD "b" diff --git a/kernel/chario.c b/kernel/chario.c index ea3ac5e..d801eea 100644 --- a/kernel/chario.c +++ b/kernel/chario.c @@ -36,6 +36,9 @@ static BYTE *charioRcsId = "$Id$"; /* * $Log$ + * Revision 1.8 2001/04/29 17:34:40 bartoldeman + * A new SYS.COM/config.sys single stepping/console output/misc fixes. + * * Revision 1.7 2001/04/21 22:32:53 bartoldeman * Init DS=Init CS, fixed stack overflow problems and misc bugs. * @@ -135,10 +138,15 @@ static VOID kbfill(); struct dhdr FAR *finddev(); #endif +#ifdef __TURBOC__ +void __int__(int); /* TC 2.01 requires this. :( -- ror4 */ +#endif + /* Return a pointer to the first driver in the chain that * matches the attributes. + * not necessary because we have the syscon pointer. */ - +#if 0 struct dhdr FAR *finddev(UWORD attr_mask) { struct dhdr far *dh; @@ -152,24 +160,24 @@ struct dhdr FAR *finddev(UWORD attr_mask) /* return dev/null if no matching driver found */ return &nul_dev; } +#endif -#if 0 VOID cso(COUNT c) { - BYTE buf = c; - struct dhdr FAR *lpDevice; - + if (syscon->dh_attr & ATTR_FASTCON) { + _AL = c; + __int__(0x29); + return; + } CharReqHdr.r_length = sizeof(request); CharReqHdr.r_command = C_OUTPUT; CharReqHdr.r_count = 1; - CharReqHdr.r_trans = (BYTE FAR *) (&buf); + CharReqHdr.r_trans = (BYTE FAR *) (&c); CharReqHdr.r_status = 0; - execrh((request FAR *) & CharReqHdr, - lpDevice = (struct dhdr FAR *)finddev(ATTR_CONOUT)); + execrh((request FAR *) & CharReqHdr, syscon); if (CharReqHdr.r_status & S_ERROR) - char_error(&CharReqHdr, lpDevice); + char_error(&CharReqHdr, syscon); } -#endif VOID sto(COUNT c) @@ -183,18 +191,18 @@ VOID mod_sto(REG UCOUNT c) { if (c < ' ' && c != HT) { - sto('^'); - sto(c + '@'); + cso('^'); + cso(c + '@'); } else - sto(c); + cso(c); } VOID destr_bs(void) { - sto(BS); - sto(' '); - sto(BS); + cso(BS); + cso(' '); + cso(BS); } VOID Do_DosIdle_loop(void) @@ -230,7 +238,7 @@ BOOL con_break(void) CharReqHdr.r_status = 0; CharReqHdr.r_command = C_NDREAD; CharReqHdr.r_length = sizeof(request); - execrh((request FAR *) & CharReqHdr, (struct dhdr FAR *)finddev(ATTR_CONIN)); + execrh((request FAR *) & CharReqHdr, syscon); if (CharReqHdr.r_status & S_BUSY) return FALSE; if (CharReqHdr.r_ndbyte == CTL_C) @@ -272,14 +280,14 @@ VOID KbdFlush(void) CharReqHdr.r_status = 0; CharReqHdr.r_command = C_IFLUSH; CharReqHdr.r_length = sizeof(request); - execrh((request FAR *) & CharReqHdr, (struct dhdr FAR *)finddev(ATTR_CONIN)); + execrh((request FAR *) & CharReqHdr, syscon); } static VOID kbfill(keyboard FAR * kp, UCOUNT c, BOOL ctlf, UWORD * vp) { if (kp->kb_count > kp->kb_size) { - sto(BELL); + cso(BELL); return; } kp->kb_buf[kp->kb_count++] = c; @@ -290,7 +298,7 @@ static VOID kbfill(keyboard FAR * kp, UCOUNT c, BOOL ctlf, UWORD * vp) } else { - sto(c); + cso(c); if (c != HT) ++ * vp; else @@ -402,16 +410,16 @@ UCOUNT sti(keyboard FAR * kp) return kp->kb_count; case LF: - sto(CR); - sto(LF); + cso(CR); + cso(LF); break; case ESC: - sto('\\'); - sto(CR); - sto(LF); + cso('\\'); + cso(CR); + cso(LF); for (c = 0; c < cu_pos; c++) - sto(' '); + cso(' '); kp->kb_count = init_count; eof = FALSE; break; diff --git a/kernel/config.c b/kernel/config.c index f79e365..65541b5 100644 --- a/kernel/config.c +++ b/kernel/config.c @@ -80,6 +80,9 @@ static BYTE *RcsId = "$Id$"; /* * $Log$ + * Revision 1.22 2001/04/29 17:34:40 bartoldeman + * A new SYS.COM/config.sys single stepping/console output/misc fixes. + * * Revision 1.21 2001/04/21 22:32:53 bartoldeman * Init DS=Init CS, fixed stack overflow problems and misc bugs. * @@ -235,7 +238,7 @@ struct config Config NFCBS, 0, "command.com", - " /P\r\n", + " /P /E:256\r\n", NLAST, NSTACKS, 128 @@ -258,7 +261,8 @@ static COUNT nPass; static BYTE szLine[256]; static BYTE szBuf[256]; -int singleStep; +int singleStep = FALSE; +int SkipAllConfig = FALSE; INIT VOID zumcb_init(mcb FAR * mcbp, UWORD size); INIT VOID mumcb_init(mcb FAR * mcbp, UWORD size); @@ -407,9 +411,11 @@ INIT void PreConfig(void) /* FCBp = (sfttbl FAR *) KernelAlloc(sizeof(sftheader) + Config.cfgFiles * sizeof(sft));*/ - sfthead = (sfttbl FAR *) + sfthead->sftt_next = (sfttbl FAR *) KernelAlloc(sizeof(sftheader) - + Config.cfgFiles * sizeof(sft)); + + (Config.cfgFiles-5) * sizeof(sft)); + sfthead->sftt_next->sftt_next = (sfttbl FAR *) - 1; + sfthead->sftt_next->sftt_count = Config.cfgFiles-5; CDSp = (cdstbl FAR *) KernelAlloc(0x58 * lastdrive); @@ -420,7 +426,7 @@ INIT void PreConfig(void) #ifdef DEBUG printf("Preliminary f_node allocated at at 0x%p\n",f_nodes); printf("Preliminary FCB table allocated at 0x%p\n",FCBp); - printf("Preliminary sft table allocated at 0x%p\n",sfthead); + printf("Preliminary sft table allocated at 0x%p\n",sfthead->sftt_next); printf("Preliminary CDS table allocated at 0x%p\n",CDSp); printf("Preliminary DPB table allocated at 0x%p\n",DPBp); #endif @@ -493,9 +499,11 @@ INIT void PostConfig(void) /* FCBp = (sfttbl FAR *) KernelAlloc(sizeof(sftheader) + Config.cfgFiles * sizeof(sft));*/ - sfthead = (sfttbl FAR *) + sfthead->sftt_next = (sfttbl FAR *) KernelAlloc(sizeof(sftheader) - + Config.cfgFiles * sizeof(sft)); + + (Config.cfgFiles-5) * sizeof(sft)); + sfthead->sftt_next->sftt_next = (sfttbl FAR *) - 1; + sfthead->sftt_next->sftt_count = Config.cfgFiles-5; CDSp = (cdstbl FAR *) KernelAlloc(0x58 * lastdrive); @@ -507,7 +515,7 @@ INIT void PostConfig(void) #ifdef DEBUG printf("f_node allocated at 0x%p\n",f_nodes); printf("FCB table allocated at 0x%p\n",FCBp); - printf("sft table allocated at 0x%p\n",sfthead); + printf("sft table allocated at 0x%p\n",sfthead->sftt_next); printf("CDS table allocated at 0x%p\n",CDSp); printf("DPB table allocated at 0x%p\n",DPBp); #endif @@ -695,18 +703,18 @@ INIT VOID DoConfig(VOID) if (pEntry->pass < 0 || pEntry->pass == nPass) { - if (!singleStep || !SkipLine(pLineStart)) + if ( !SkipLine(pLineStart)) { - skipwh(pLine); + pLine = skipwh(pLine); if ('=' != *pLine) CfgFailure(pLine); else - (*(pEntry->func)) (++pLine); + (*(pEntry->func)) (skipwh(pLine+1)); } } } - skipLine:nCfgLine++; + nCfgLine++; pLine += strlen(pLine) + 1; } } @@ -725,20 +733,124 @@ INIT struct table *LookUp(struct table *p, BYTE * token) return p; } +/* + get BIOS key with timeout: + + timeout < 0: no timeout + timeout = 0: poll only once + timeout > 0: timeout in seconds + + return + 0xffff : no key hit + + 0xHH.. : scancode in upper half + 0x..LL : asciicode in lower half +*/ + +ULONG GetBiosTime(VOID) +{ + return *(ULONG FAR *)(MK_FP(0x40,0x6c)); +} +GetBiosKey(int timeout) +{ + iregs r; + + ULONG startTime = GetBiosTime(); + + for (;;) + { + r.a.x = 0x0100; /* are there keys available ? */ + init_call_intr(0x16,&r); + + if ((r.flags & 0x40) == 0) /* yes - fetch and return */ + { + r.a.x = 0x0000; + init_call_intr(0x16,&r); + + return r.a.x; + } + + if (timeout < 0) + continue; + + if (GetBiosTime() - startTime >= timeout*18) + break; + } + return 0xffff; +} + INIT BOOL SkipLine(char *pLine) { - char kbdbuf[16]; - char *pKbd = kbdbuf; - - printf("%s [Y,N]?", pLine); - read(STDIN, kbdbuf, 12); - - pKbd = skipwh(pKbd); - - if (*pKbd == 'n' || *pKbd == 'N') + short key; + + static char initialized = FALSE; + + if (!initialized) + { + + initialized = TRUE; + + printf("Press F8 to trace or F5 to skip CONFIG.SYS/AUTOEXEC.BAT"); + + key = GetBiosKey(2); /* wait 2 seconds */ + + if (key == 0x3f00) /* F5 */ + { + SkipAllConfig = TRUE; + } + if (key == 0x4200) /* F8 */ + { + singleStep = TRUE; + } + + printf("\r%79s\r",""); /* clear line */ + + if (SkipAllConfig) + printf("Skipping CONFIG.SYS/AUTOEXEC.BAT\n"); + } + + if (SkipAllConfig) return TRUE; - return FALSE; + if (!singleStep) + return FALSE; + + printf("%s[Y,N]?", pLine); + + for (;;) + { + key = GetBiosKey(-1); + + switch(toupper(key & 0x00ff)) + { + case 'N': + case 'n': + printf("N"); + return TRUE; + + case 0x1b: /* don't know where documented + ESCAPE answers all following questions + with YES + */ + singleStep = FALSE; /* and fall through */ + + case '\r': + case '\n': + case 'Y': + case 'y': + printf("Y"); + return FALSE; + + } + + if (key == 0x3f00) /* YES, you may hit F5 here, too */ + { + printf("N"); + SkipAllConfig = TRUE; + return TRUE; + } + } + } INIT BYTE *GetNumArg(BYTE * pLine, COUNT * pnArg) @@ -1102,13 +1214,36 @@ INIT BOOL LoadDevice(BYTE * pLine, COUNT top, COUNT mode) if (init_DosExec(3, &eb, szBuf) == SUCCESS) { strcpy(szBuf, pLine); - - /* add \r\n to the command line */ - strcat(szBuf, "\r\n"); /* TE this fixes the loading of devices drivers with multiple devices in it. NUMEGA's SoftIce is such a beast */ + + /* that's a nice hack >:-) + + although we don't want HIMEM.SYS,(it's not free), other people + might load HIMEM.SYS to see if they are compatible to it. + + if it's HIMEM.SYS, we won't survive TESTMEM:ON + + so simply add TESTMEM:OFF to the commandline + */ + + if (DosLoadedInHMA) + if (stristr(szBuf, "HIMEM.SYS") != NULL) + { + if (stristr(szBuf, "/TESTMEM:OFF") == NULL) + { + strcat(szBuf, " /TESTMEM:OFF"); + } + } + /* end of HIMEM.SYS HACK */ + + + /* add \r\n to the command line */ + strcat(szBuf, "\r\n"); + + for (next_dhp=NULL; FP_OFF(next_dhp) != 0xffff && (result=init_device(dhp, szBuf, mode, top))==SUCCESS ; dhp = next_dhp) diff --git a/kernel/dosfns.c b/kernel/dosfns.c index f32e838..46e34e4 100644 --- a/kernel/dosfns.c +++ b/kernel/dosfns.c @@ -37,6 +37,9 @@ static BYTE *dosfnsRcsId = "$Id$"; * /// Added SHARE support. 2000/09/04 Ron Cemer * * $Log$ + * Revision 1.17 2001/04/29 17:34:40 bartoldeman + * A new SYS.COM/config.sys single stepping/console output/misc fixes. + * * Revision 1.16 2001/04/21 22:32:53 bartoldeman * Init DS=Init CS, fixed stack overflow problems and misc bugs. * @@ -510,72 +513,49 @@ UCOUNT DosWrite(COUNT hndl, UCOUNT n, BYTE FAR * bp, COUNT FAR * err) else { REG WORD /*c,*/ - cnt = n, - spaces_left = 0, - next_pos, - xfer = 0; - static BYTE space = ' '; + cnt = n, + xfer = 0; - start: - if (cnt-- == 0) - goto end; - if (*bp == CTL_Z) - goto end; - if (s->sft_flags & SFT_FCONOUT) - { - switch (*bp) + while(cnt-- != 0 && *bp != CTL_Z){ + if (s->sft_flags & SFT_FCONOUT) { - case CR: - next_pos = 0; - break; - case LF: - case BELL: - next_pos = scr_pos; - break; - case BS: - next_pos = scr_pos ? scr_pos - 1 : 0; - break; - case HT: - spaces_left = 8 - (scr_pos & 7); - next_pos = scr_pos + spaces_left; - goto output_space; - default: - next_pos = scr_pos + 1; + switch (*bp) + { + case CR: + scr_pos = 0; + break; + case LF: + case BELL: + break; + case BS: + scr_pos = scr_pos ? scr_pos - 1 : 0; + break; + case HT: + do cso(' '); while ((++scr_pos) & 7); + default: + scr_pos++; + } + if (*bp != HT) cso(*bp); + } + else + { + rq.r_length = sizeof(request); + rq.r_command = C_OUTPUT; + rq.r_count = 1; + rq.r_trans = bp; + rq.r_status = 0; + execrh((request FAR *) & rq, s->sft_dev); + if (rq.r_status & S_ERROR) + char_error(&rq, s->sft_dev); + } + ++bp; + ++xfer; + if (break_ena && control_break()) + { + handle_break(); + break; } } - rq.r_length = sizeof(request); - rq.r_command = C_OUTPUT; - rq.r_count = 1; - rq.r_trans = bp; - rq.r_status = 0; - execrh((request FAR *) & rq, s->sft_dev); - if (rq.r_status & S_ERROR) - char_error(&rq, s->sft_dev); - goto post; - output_space: - rq.r_length = sizeof(request); - rq.r_command = C_OUTPUT; - rq.r_count = 1; - rq.r_trans = &space; - rq.r_status = 0; - execrh((request FAR *) & rq, s->sft_dev); - if (rq.r_status & S_ERROR) - char_error(&rq, s->sft_dev); - --spaces_left; - post: - if (spaces_left) - goto output_space; - ++bp; - ++xfer; - if (s->sft_flags & SFT_FCONOUT) - scr_pos = next_pos; - if (break_ena && control_break()) - { - handle_break(); - goto end; - } - goto start; - end: *err = SUCCESS; return xfer; } @@ -724,17 +704,17 @@ sft FAR *get_free_sft(WORD FAR * sft_idx) /* Get the SFT block that contains the SFT */ for (sp = sfthead; sp != (sfttbl FAR *) - 1; sp = sp->sftt_next) { - REG WORD i; + REG COUNT i = sp->sftt_count; + sft FAR *sfti = sp->sftt_table; - for (i = 0; i < sp->sftt_count; i++) + for(sys_idx += i; i >= 1 ; sfti++, i--) { - if (sp->sftt_table[i].sft_count == 0) + if (sfti->sft_count == 0) { - *sft_idx = sys_idx + i; - return (sft FAR *) & sp->sftt_table[sys_idx + i]; + *sft_idx = sys_idx - i; + return sfti; } } - sys_idx += i; } /* If not found, return an error */ return (sft FAR *) - 1; @@ -1251,12 +1231,75 @@ COUNT DosChangeDir(BYTE FAR * s) COUNT DosFindFirst(UCOUNT attr, BYTE FAR * name) { + COUNT nDrive; + REG dmatch FAR *dmp = (dmatch FAR *) dta; + + /* /// Added code here to do matching against device names. + DOS findfirst will match exact device names if the + filename portion (excluding the extension) contains + a valid device name. + Credits: some of this code was ripped off from truename() + in newstuff.c. + - Ron Cemer */ + fmemset(dmp, 0, sizeof(dmatch)); + + nDrive=get_verify_drive(name); + if (nDrive < 0) + return nDrive; + + current_ldt = &CDSp->cds_table[nDrive]; + if (current_ldt->cdsFlags & CDSNETWDRV) + { + COUNT rc = -Remote_find(REM_FINDFIRST, attr, name); + if (dmp->dm_drive & 0x80) + return rc; + fmemset(dmp, 0, sizeof(dmatch)); + /* still have to resolve locally if dm_drive not set to remote */ + } + if (IsDevice(name)) + { + /* Found a matching device. Hence there cannot be wildcards. */ + dmp->dm_attr_fnd = D_DEVICE; + dmp->dm_time = dos_gettime(); + dmp->dm_date = dos_getdate(); + fstrncpy(dmp->dm_name, get_root(name), FNAME_SIZE+FEXT_SIZE+1); + return SUCCESS; + } + /* /// End of additions. - Ron Cemer ; heavily edited - Bart Oldeman */ return dos_findfirst(attr, name); } COUNT DosFindNext(void) { - return dos_findnext(); + + /* /// findnext will always fail on a device name. - Ron Cemer */ + if (((dmatch FAR *)dta)->dm_attr_fnd == D_DEVICE) + return DE_NFILES; + +/* + * The new version of SHSUCDX 1.0 looks at the dm_drive byte to + * test 40h. I used RamView to see location MSD 116:04be and + * FD f??:04be, the byte set with 0xc4 = Remote/Network drive 4. + * Ralf Brown docs for dos 4eh say bit 7 set == remote so what is + * bit 6 for? + * SHSUCDX Mod info say "test redir not network bit". + * Just to confuse the rest, MSCDEX sets bit 5 too. + * + * So, assume bit 6 is redirector and bit 7 is network. + * jt + * Bart: dm_drive can be the drive _letter_. + * but better just stay independent of it: we only use + * bit 7 to detect a network drive; the rest untouched. + * RBIL says that findnext can only return one error type anyway + * (12h, DE_NFILES) + */ +#if 0 + printf("findnext: %d\n", + ((dmatch FAR *)dta)->dm_drive); +#endif + return (((dmatch FAR *)dta)->dm_drive & 0x80) ? + -Remote_find(REM_FINDNEXT, 0, NULL) : + dos_findnext(); } COUNT DosGetFtime(COUNT hndl, date FAR * dp, time FAR * tp) diff --git a/kernel/dsk.c b/kernel/dsk.c index 9688f40..59bbd6a 100644 --- a/kernel/dsk.c +++ b/kernel/dsk.c @@ -32,6 +32,9 @@ static BYTE *dskRcsId = "$Id$"; /* * $Log$ + * Revision 1.16 2001/04/29 17:34:40 bartoldeman + * A new SYS.COM/config.sys single stepping/console output/misc fixes. + * * Revision 1.15 2001/04/16 01:45:26 bartoldeman * Fixed handles, config.sys drivers, warnings. Enabled INT21/AH=6C, printf %S/%Fs * @@ -172,18 +175,17 @@ BOOL fl_format(); extern BYTE FAR nblk_rel; + + /* this buffer must not overlap a 64K boundary + due to DMA transfers + this is certainly true, if located somewhere + at 0xf+1000 and must hold already during BOOT time + */ union { BYTE bytes[1 * SEC_SIZE]; boot boot_sector; -} buffer; - - /* if the buffer above is good enough for booting - it's also good enough for DMA input */ -BYTE /* scratchpad used for working around */ - FAR * dma_scratch_buffer = (BYTE FAR *)&buffer; /* DMA transfers during disk I/O */ - - +} DiskTransferBuffer; STATIC struct media_info @@ -194,16 +196,21 @@ STATIC struct media_info UWORD mi_sectors; /* number of sectors/cyl */ ULONG mi_offset; /* relative partition offset */ BYTE mi_drive; /* BIOS drive number */ - COUNT mi_partidx; /* Index to partition array */ ULONG mi_FileOC; /* Count of Open files on Drv */ + + UWORD mi_BeginCylinder; + BYTE mi_BeginHead; + BYTE mi_BeginSector; + + struct FS_info + { + ULONG serialno; + BYTE volume[11]; + BYTE fstype[8]; + }fs; }; -static struct FS_info -{ - ULONG fs_serialno; - BYTE fs_volume[11]; - BYTE fs_fstype[8]; -}; + static struct Access_info { @@ -212,7 +219,6 @@ static struct Access_info }; STATIC struct media_info miarray[NDEV]; /* Internal media info structs */ -STATIC struct FS_info fsarray[NDEV]; STATIC bpb bpbarray[NDEV]; /* BIOS parameter blocks */ STATIC bpb *bpbptrs[NDEV]; /* pointers to bpbs */ @@ -224,26 +230,9 @@ struct media_info *getPMiarray(int dev) { return &miarray[dev];} table partition */ STATIC COUNT nUnits; /* number of returned units */ -STATIC COUNT nPartitions; /* number of DOS partitions */ #define PARTOFF 0x1be -STATIC struct dos_partitionS -{ - BYTE peDrive; /* BIOS drive number */ - BYTE peBootable; - BYTE peBeginHead; - BYTE peBeginSector; - UWORD peBeginCylinder; - BYTE peFileSystem; - BYTE peEndHead; - BYTE peEndSector; - UWORD peEndCylinder; - LONG peStartSector; - LONG peSectors; - LONG peAbsStart; /* Absolute sector start */ -} -dos_partition[NDEV - 2]; #ifdef PROTO WORD _dsk_init(rqptr), @@ -376,12 +365,12 @@ ULONG StartSector(WORD ptDrive, unsigned BeginCylinder, if (startPos != oldStartPos) { - printf("PART TABLE mismatch for drive %x, CHS=%d %d %d, startsec %d, offset %ld\n", + PartCodePrintf(("PART TABLE mismatch for drive %x, CHS=%d %d %d, startsec %d, offset %ld\n", ptDrive, BeginCylinder, BeginHead,BeginSector, - peStartSector, ptAccuOff); + peStartSector, ptAccuOff)); - printf(" old startpos = %ld, new startpos = %ld, using new\n", - oldStartPos, startPos); + PartCodePrintf((" old startpos = %ld, new startpos = %ld, using new\n", + oldStartPos, startPos)); } return startPos; @@ -516,7 +505,7 @@ restart: /* yes, it's a GOTO >:-) */ for ( retry = N_RETRY; --retry >= 0; ) { ret = fl_read((WORD) ptDrive, (WORD) ptHead, (WORD) ptCylinder, - (WORD) ptSector, (WORD) 1, (byteptr) & buffer); + (WORD) ptSector, (WORD) 1, (byteptr) & DiskTransferBuffer); if (ret == 0) break; } @@ -525,7 +514,7 @@ restart: /* yes, it's a GOTO >:-) */ /* Read each partition into temporary array */ - p = (BYTE *) & buffer.bytes[PARTOFF]; + p = (BYTE *) & DiskTransferBuffer.bytes[PARTOFF]; for (ptemp_part = &temp_part[0]; ptemp_part < &temp_part[N_PART]; ptemp_part++) @@ -585,12 +574,10 @@ restart: /* yes, it's a GOTO >:-) */ ptemp_part->peFileSystem == FAT16SMALL || ptemp_part->peFileSystem == FAT16LARGE ) { - struct dos_partitionS *pdos_partition; struct media_info *pmiarray = getPMiarray(nUnits); pmiarray->mi_drive = ptDrive; - pmiarray->mi_partidx = nPartitions; pmiarray->mi_offset = StartSector(ptDrive, ptemp_part->peBeginCylinder, @@ -598,35 +585,14 @@ restart: /* yes, it's a GOTO >:-) */ ptemp_part->peBeginSector, ptemp_part->peStartSector, ptAccuOff); + + pmiarray->mi_BeginCylinder = ptemp_part->peBeginCylinder; + pmiarray->mi_BeginHead = ptemp_part->peBeginHead; + pmiarray->mi_BeginSector = ptemp_part->peBeginSector; + nUnits++; - pdos_partition = &dos_partition[nPartitions]; - - pdos_partition->peDrive = ptDrive; - pdos_partition->peBootable = ptemp_part->peBootable; - pdos_partition->peBeginHead = ptemp_part->peBeginHead; - pdos_partition->peBeginSector = ptemp_part->peBeginSector; - pdos_partition->peBeginCylinder=ptemp_part->peBeginCylinder; - pdos_partition->peFileSystem =ptemp_part->peFileSystem; - pdos_partition->peEndHead =ptemp_part->peEndHead; - pdos_partition->peEndSector =ptemp_part->peEndSector; - pdos_partition->peEndCylinder =ptemp_part->peEndCylinder; - pdos_partition->peStartSector =ptemp_part->peStartSector; - pdos_partition->peSectors =ptemp_part->peSectors; - pdos_partition->peAbsStart =ptemp_part->peStartSector + ptAccuOff; - - PartCodePrintf(("DOS PARTITION drive %x CHS %x-%x-%x %x-%x-%x %lx %lx %lx FS %x\n", - pdos_partition->peDrive, - pdos_partition->peBeginCylinder,pdos_partition->peBeginHead ,pdos_partition->peBeginSector , - pdos_partition->peEndCylinder ,pdos_partition->peEndHead ,pdos_partition->peEndSector , - pdos_partition->peStartSector , - pdos_partition->peSectors , - pdos_partition->peAbsStart , - pdos_partition->peFileSystem - )); - - nPartitions++; PartitionDone |= partMask; @@ -695,8 +661,6 @@ WORD _dsk_init(rqptr rp) /* Initial number of disk units */ nUnits = 2; - /* Initial number of DOS partitions */ - nPartitions = 0; /* Setup media info and BPBs arrays */ for (Unit = 0; Unit < NDEV; Unit++) @@ -709,8 +673,13 @@ WORD _dsk_init(rqptr rp) pmiarray->mi_sectors = 9; pmiarray->mi_offset = 0l; pmiarray->mi_drive = Unit; + + pmiarray->mi_BeginCylinder = 0; /* initialize for floppies */ + pmiarray->mi_BeginHead = 0; + pmiarray->mi_BeginSector = 1; + - fsarray[Unit].fs_serialno = 0x12345678l; + pmiarray->fs.serialno = 0x12345678l; pbpbarray = getPBpbarray(Unit); @@ -802,35 +771,17 @@ static WORD mediachk(rqptr rp) STATIC WORD RWzero(rqptr rp, WORD t) { REG retry = N_RETRY; - WORD head,track,sector,ret; - - - if (hd(miarray[rp->r_unit].mi_drive)) - { - COUNT partidx = miarray[rp->r_unit].mi_partidx; - head = dos_partition[partidx].peBeginHead; - track = dos_partition[partidx].peBeginCylinder; - sector = dos_partition[partidx].peBeginSector; - } - else - { - head = 0; - sector = 1; - track = 0; - } + WORD ret; + struct media_info *pmiarray = getPMiarray(rp->r_unit); do { - if (!t) /* 0 == Read */ - { - ret = fl_read((WORD) miarray[rp->r_unit].mi_drive, - (WORD) head, (WORD) track, (WORD) sector, (WORD) 1, (byteptr) & buffer); - } - else - { - ret = fl_write((WORD) miarray[rp->r_unit].mi_drive, - (WORD) head, (WORD) track, (WORD) sector, (WORD) 1, (byteptr) & buffer); - } + ret = (t == 0 ? fl_read : fl_write)( + (WORD) pmiarray->mi_drive, + (WORD) pmiarray->mi_BeginHead, + (WORD) pmiarray->mi_BeginCylinder, + (WORD) pmiarray->mi_BeginSector, + (WORD) 1, (byteptr) & DiskTransferBuffer); } while (ret != 0 && --retry > 0); return ret; @@ -885,10 +836,7 @@ static WORD blk_Media(rqptr rp) STATIC WORD bldbpb(rqptr rp) { - ULONG count/*, i*/; -/* byteptr trans;*/ -/* WORD local_word;*/ -/*TE*/ + ULONG count; bpb *pbpbarray; struct media_info *pmiarray; WORD head,/*track,*/sector,ret; @@ -901,31 +849,29 @@ STATIC WORD bldbpb(rqptr rp) /*TE ~ 200 bytes*/ pbpbarray = getPBpbarray(rp->r_unit); - getword(&((((BYTE *) & buffer.bytes[BT_BPB]))[BPB_NBYTE]), &pbpbarray->bpb_nbyte); - getbyte(&((((BYTE *) & buffer.bytes[BT_BPB]))[BPB_NSECTOR]), &pbpbarray->bpb_nsector); - getword(&((((BYTE *) & buffer.bytes[BT_BPB]))[BPB_NRESERVED]), &pbpbarray->bpb_nreserved); - getbyte(&((((BYTE *) & buffer.bytes[BT_BPB]))[BPB_NFAT]), &pbpbarray->bpb_nfat); - getword(&((((BYTE *) & buffer.bytes[BT_BPB]))[BPB_NDIRENT]), &pbpbarray->bpb_ndirent); - getword(&((((BYTE *) & buffer.bytes[BT_BPB]))[BPB_NSIZE]), &pbpbarray->bpb_nsize); - getword(&((((BYTE *) & buffer.bytes[BT_BPB]))[BPB_NSIZE]), &pbpbarray->bpb_nsize); - getbyte(&((((BYTE *) & buffer.bytes[BT_BPB]))[BPB_MDESC]), &pbpbarray->bpb_mdesc); - getword(&((((BYTE *) & buffer.bytes[BT_BPB]))[BPB_NFSECT]), &pbpbarray->bpb_nfsect); - getword(&((((BYTE *) & buffer.bytes[BT_BPB]))[BPB_NSECS]), &pbpbarray->bpb_nsecs); - getword(&((((BYTE *) & buffer.bytes[BT_BPB]))[BPB_NHEADS]), &pbpbarray->bpb_nheads); - getlong(&((((BYTE *) & buffer.bytes[BT_BPB])[BPB_HIDDEN])), &pbpbarray->bpb_hidden); - getlong(&((((BYTE *) & buffer.bytes[BT_BPB])[BPB_HUGE])), &pbpbarray->bpb_huge); + getword(&((((BYTE *) & DiskTransferBuffer.bytes[BT_BPB]))[BPB_NBYTE]), &pbpbarray->bpb_nbyte); + getbyte(&((((BYTE *) & DiskTransferBuffer.bytes[BT_BPB]))[BPB_NSECTOR]), &pbpbarray->bpb_nsector); + getword(&((((BYTE *) & DiskTransferBuffer.bytes[BT_BPB]))[BPB_NRESERVED]), &pbpbarray->bpb_nreserved); + getbyte(&((((BYTE *) & DiskTransferBuffer.bytes[BT_BPB]))[BPB_NFAT]), &pbpbarray->bpb_nfat); + getword(&((((BYTE *) & DiskTransferBuffer.bytes[BT_BPB]))[BPB_NDIRENT]), &pbpbarray->bpb_ndirent); + getword(&((((BYTE *) & DiskTransferBuffer.bytes[BT_BPB]))[BPB_NSIZE]), &pbpbarray->bpb_nsize); + getword(&((((BYTE *) & DiskTransferBuffer.bytes[BT_BPB]))[BPB_NSIZE]), &pbpbarray->bpb_nsize); + getbyte(&((((BYTE *) & DiskTransferBuffer.bytes[BT_BPB]))[BPB_MDESC]), &pbpbarray->bpb_mdesc); + getword(&((((BYTE *) & DiskTransferBuffer.bytes[BT_BPB]))[BPB_NFSECT]), &pbpbarray->bpb_nfsect); + getword(&((((BYTE *) & DiskTransferBuffer.bytes[BT_BPB]))[BPB_NSECS]), &pbpbarray->bpb_nsecs); + getword(&((((BYTE *) & DiskTransferBuffer.bytes[BT_BPB]))[BPB_NHEADS]), &pbpbarray->bpb_nheads); + getlong(&((((BYTE *) & DiskTransferBuffer.bytes[BT_BPB])[BPB_HIDDEN])), &pbpbarray->bpb_hidden); + getlong(&((((BYTE *) & DiskTransferBuffer.bytes[BT_BPB])[BPB_HUGE])), &pbpbarray->bpb_huge); + + + pmiarray = getPMiarray(rp->r_unit); /* Needs fat32 offset code */ - getlong(&((((BYTE *) & buffer.bytes[0x27])[0])), &fsarray[rp->r_unit].fs_serialno); -/*TE - for(i = 0; i < 11 ;i++ ) - fsarray[rp->r_unit].fs_volume[i] = buffer.bytes[0x2B + i]; - for(i = 0; i < 8; i++ ) - fsarray[rp->r_unit].fs_fstype[i] = buffer.bytes[0x36 + i]; -*/ - memcpy(fsarray[rp->r_unit].fs_volume,&buffer.bytes[0x2B], 11); - memcpy(fsarray[rp->r_unit].fs_fstype,&buffer.bytes[0x36], 8); + getlong(&((((BYTE *) & DiskTransferBuffer.bytes[0x27])[0])), &pmiarray->fs.serialno); + + memcpy(pmiarray->fs.volume,&DiskTransferBuffer.bytes[0x2B], 11); + memcpy(pmiarray->fs.fstype,&DiskTransferBuffer.bytes[0x36], 8); @@ -941,17 +887,16 @@ STATIC WORD bldbpb(rqptr rp) #endif rp->r_bpptr = pbpbarray; - pmiarray = getPMiarray(rp->r_unit); count = pmiarray->mi_size = pbpbarray->bpb_nsize == 0 ? pbpbarray->bpb_huge : pbpbarray->bpb_nsize; - getword((&(((BYTE *) & buffer.bytes[BT_BPB])[BPB_NHEADS])), &pmiarray->mi_heads); + getword((&(((BYTE *) & DiskTransferBuffer.bytes[BT_BPB])[BPB_NHEADS])), &pmiarray->mi_heads); head = pmiarray->mi_heads; - getword((&(((BYTE *) & buffer.bytes[BT_BPB])[BPB_NSECS])), &pmiarray->mi_sectors); + getword((&(((BYTE *) & DiskTransferBuffer.bytes[BT_BPB])[BPB_NSECS])), &pmiarray->mi_sectors); if (pmiarray->mi_size == 0) - getlong(&((((BYTE *) & buffer.bytes[BT_BPB])[BPB_HUGE])), &pmiarray->mi_size); + getlong(&((((BYTE *) & DiskTransferBuffer.bytes[BT_BPB])[BPB_HUGE])), &pmiarray->mi_size); sector = pmiarray->mi_sectors; if (head == 0 || sector == 0) @@ -1001,17 +946,19 @@ static WORD IoctlQueblk(rqptr rp) static WORD Genblkdev(rqptr rp) { int ret; + struct media_info *pmiarray = getPMiarray(rp->r_unit); + switch(rp->r_count){ case 0x0860: /* get device parameters */ { struct gblkio FAR * gblp = (struct gblkio FAR *) rp->r_trans; REG COUNT x = 5,y = 1,z = 0; - if (!hd(miarray[rp->r_unit].mi_drive)){ + if (!hd(pmiarray->mi_drive)){ y = 2; - x = 8; /* any odd ball drives return this */ - if (miarray[rp->r_unit].mi_size <= 0xffff) - switch((UWORD)miarray[rp->r_unit].mi_size) + x = 8; /* any odd ball drives return this */ + if (pmiarray->mi_size <= 0xffff) + switch((UWORD)pmiarray->mi_size) { case 640: case 720: /* 320-360 */ @@ -1035,7 +982,7 @@ static WORD Genblkdev(rqptr rp) gblp->gbio_devtype = (UBYTE) x; gblp->gbio_devattrib = (UWORD) y; gblp->gbio_media = (UBYTE) z; - gblp->gbio_ncyl = miarray[rp->r_unit].mi_cyls; + gblp->gbio_ncyl = pmiarray->mi_cyls; fmemcpy(&gblp->gbio_bpb, &bpbarray[rp->r_unit], sizeof(gblp->gbio_bpb)); gblp->gbio_nsecs = bpbarray[rp->r_unit].bpb_nsector; break; @@ -1043,24 +990,24 @@ static WORD Genblkdev(rqptr rp) case 0x0866: /* get volume serial number */ { struct Gioc_media FAR * gioc = (struct Gioc_media FAR *) rp->r_trans; - struct FS_info FAR * fs = &fsarray[rp->r_unit]; + struct FS_info FAR * fs = &pmiarray->fs; - gioc->ioc_serialno = fs->fs_serialno; - fmemcpy(gioc->ioc_volume,fs->fs_volume,11); - fmemcpy(gioc->ioc_fstype, fs->fs_fstype,8); + gioc->ioc_serialno = fs->serialno; + fmemcpy(gioc->ioc_volume,fs->volume,11); + fmemcpy(gioc->ioc_fstype, fs->fstype,8); } break; case 0x0846: /* set volume serial number */ { struct Gioc_media FAR * gioc = (struct Gioc_media FAR *) rp->r_trans; - struct FS_info FAR * fs = (struct FS_info FAR *) &buffer.bytes[0x27]; + struct FS_info FAR * fs = (struct FS_info FAR *) &DiskTransferBuffer.bytes[0x27]; ret = RWzero( rp, 0); if (ret != 0) return (dskerr(ret)); - fs->fs_serialno = gioc->ioc_serialno; - fsarray[rp->r_unit].fs_serialno = fs->fs_serialno; + fs->serialno = gioc->ioc_serialno; + pmiarray->fs.serialno = fs->serialno; ret = RWzero( rp, 1); if (ret != 0) @@ -1092,6 +1039,9 @@ WORD blockio(rqptr rp) WORD head,track,sector,ret,count; COUNT(*action) (WORD, WORD, WORD, WORD, WORD, BYTE FAR *); + + struct media_info *pmiarray = getPMiarray(rp->r_unit); + cmd = rp->r_command; total = 0; @@ -1099,7 +1049,7 @@ WORD blockio(rqptr rp) tmark(); remaining = rp->r_count; start = (rp->r_start != HUGECOUNT ? rp->r_start : rp->r_huge) - + miarray[rp->r_unit].mi_offset; + + pmiarray->mi_offset; while(remaining > 0) { count = ltop(&track, §or, &head, rp->r_unit, remaining, start, trans); @@ -1127,7 +1077,7 @@ WORD blockio(rqptr rp) if (count && FP_SEG(trans) != 0xffff) { - ret = action((WORD) miarray[rp->r_unit].mi_drive, head, track, sector, + ret = action((WORD) pmiarray->mi_drive, head, track, sector, count, trans); } else @@ -1137,14 +1087,14 @@ WORD blockio(rqptr rp) /* use scratchpad also, if going to HIGH memory */ if (cmd != C_INPUT) - fbcopy(trans, dma_scratch_buffer, SEC_SIZE); - ret = action((WORD) miarray[rp->r_unit].mi_drive, head, track, sector, - 1, dma_scratch_buffer); + fbcopy(trans, &DiskTransferBuffer, SEC_SIZE); + ret = action((WORD) pmiarray->mi_drive, head, track, sector, + 1, (byteptr)&DiskTransferBuffer); if (cmd == C_INPUT) - fbcopy(dma_scratch_buffer, trans, SEC_SIZE); + fbcopy(&DiskTransferBuffer, trans, SEC_SIZE); } if (ret != 0) - fl_reset((WORD) miarray[rp->r_unit].mi_drive); + fl_reset((WORD) pmiarray->mi_drive); } while (ret != 0 && --retry > 0); if (ret != 0) diff --git a/kernel/fatdir.c b/kernel/fatdir.c index e2e3cdd..3f2de6d 100644 --- a/kernel/fatdir.c +++ b/kernel/fatdir.c @@ -36,6 +36,9 @@ static BYTE *fatdirRcsId = "$Id$"; /* * $Log$ + * Revision 1.15 2001/04/29 17:34:40 bartoldeman + * A new SYS.COM/config.sys single stepping/console output/misc fixes. + * * Revision 1.14 2001/04/15 03:21:50 bartoldeman * See history.txt for the list of fixes. * @@ -549,7 +552,7 @@ COUNT dir_write(REG struct f_node FAR * fnp) #endif } - /* Now that we have a block, transfer the diectory */ + /* Now that we have a block, transfer the directory */ /* entry into the block. */ if (bp == NULL) { @@ -660,54 +663,6 @@ COUNT dos_findfirst(UCOUNT attr, BYTE FAR * name) fbcopy((BYTE FAR *) SearchDir.dir_name, dmp->dm_name_pat, FNAME_SIZE + FEXT_SIZE); - - if (current_ldt->cdsFlags & CDSNETWDRV) - { - dmp->dm_drive |= 0x80; - return -Remote_find(REM_FINDFIRST, name, dmp); - } - - /* /// Added code here to do matching against device names. - DOS findfirst will match exact device names if the - filename portion (excluding the extension) contains - a valid device name. - Credits: some of this code was ripped off from truename() - in newstuff.c. - - Ron Cemer */ - if (!(attr & D_VOLID)) { - char Name[FNAME_SIZE]; - int d, wild = 0; - for (d = 0; d < FNAME_SIZE; d++) { - if ((Name[d] = SearchDir.dir_name[d]) == '?') { - wild = 1; - break; - } - } - if (!wild) { - if (IsDevice(Name)) { - /* Found a matching device. */ - dmp->dm_entry = 0; - dmp->dm_cluster = 0; - dmp->dm_flags.f_dmod = 0; - dmp->dm_flags.f_droot = 0; - dmp->dm_flags.f_dnew = 0; - dmp->dm_flags.f_ddir = 0; - dmp->dm_flags.f_dfull = 0; - dmp->dm_dirstart = 0; - dmp->dm_attr_fnd = D_DEVICE; - dmp->dm_time = dos_gettime(); - dmp->dm_date = dos_getdate(); - dmp->dm_size = 0L; - for (d = 0; ( (d < FNAME_SIZE) && (Name[d] != ' ') ); d++) - dmp->dm_name[d] = Name[d]; - dmp->dm_name[d] = '\0'; - return SUCCESS; - } - } - } - /* /// End of additions. - Ron Cemer */ - - /* Now search through the directory to find the entry... */ /* Complete building the directory from the passed in */ @@ -777,38 +732,6 @@ COUNT dos_findnext(void) REG struct f_node FAR *fnp; BOOL found = FALSE; - /* assign our match parameters pointer. */ - dmp = (dmatch FAR *) dta; - - /* /// findnext will always fail on a device name. - Ron Cemer */ - if (dmp->dm_attr_fnd == D_DEVICE) return DE_FILENOTFND; - -/* - * The new version of SHSUCDX 1.0 looks at the dm_drive byte to - * test 40h. I used RamView to see location MSD 116:04be and - * FD f??:04be, the byte set with 0xc4 = Remote/Network drive 4. - * Ralf Brown docs for dos 4eh say bit 7 set == remote so what is - * bit 6 for? - * SHSUCDX Mod info say "test redir not network bit". - * Just to confuse the rest, MSCDEX sets bit 5 too. - * - * So, assume bit 6 is redirector and bit 7 is network. - * jt - * Bart: dm_drive can be the drive _letter_. - * but better just stay independent of it: we only use - * bit 7 to detect a network drive; the rest untouched. - * RBIL says that findnext can only return one error type anyway - * (12h, DE_NFILES) - */ - -#if 0 - printf("findnext: %d\n", - dmp->dm_drive); -#endif - - if (dmp->dm_drive & 0x80) - return -Remote_find(REM_FINDNEXT, 0, dmp); - /* Allocate an fnode if possible - error return (0) if not. */ if ((fnp = get_f_node()) == (struct f_node FAR *)0) { diff --git a/kernel/fatfs.c b/kernel/fatfs.c index e3bb092..3377a68 100644 --- a/kernel/fatfs.c +++ b/kernel/fatfs.c @@ -36,6 +36,9 @@ BYTE *RcsId = "$Id$"; /* * $Log$ + * Revision 1.17 2001/04/29 17:34:40 bartoldeman + * A new SYS.COM/config.sys single stepping/console output/misc fixes. + * * Revision 1.16 2001/04/21 22:32:53 bartoldeman * Init DS=Init CS, fixed stack overflow problems and misc bugs. * @@ -341,6 +344,14 @@ COUNT dos_close(COUNT fd) if (fnp->f_mode != RDONLY) { + /*TE experimental */ + if (fnp->f_flags.f_dmod) + { + fnp->f_dir.dir_attrib |= D_ARCHIVE; + fnp->f_dir.dir_time = dos_gettime(); + fnp->f_dir.dir_date = dos_getdate(); + } + fnp->f_dir.dir_size = fnp->f_highwater; fnp->f_flags.f_dmod = TRUE; merge_file_changes(fnp, FALSE); /* /// Added - Ron Cemer */ @@ -1888,6 +1899,9 @@ UCOUNT writeblock(COUNT fd, VOID FAR * buffer, UCOUNT count, COUNT * err) fbcopy(buffer, (BYTE FAR *) & bp->b_buffer[fnp->f_boff], xfr_cnt); bp->b_flag |= BFR_DIRTY | BFR_VALID; + fnp->f_flags.f_dmod = TRUE; /* mark file as modified */ + + /* update pointers and counters */ ret_cnt += xfr_cnt; to_xfer -= xfr_cnt; diff --git a/kernel/init-mod.h b/kernel/init-mod.h index 36289c6..2fcbc7f 100644 --- a/kernel/init-mod.h +++ b/kernel/init-mod.h @@ -69,7 +69,7 @@ extern fmemcmp(BYTE far *s1, BYTE FAR *s2, unsigned len); #define NFILES 16 /* number of files in table */ #define NFCBS 16 /* number of fcbs */ #define NSTACKS 8 /* number of stacks */ -#define NLAST 6 /* last drive */ +#define NLAST 5 /* last drive */ #define NUMBUFF 6 /* Number of track buffers */ /* -- must be at least 3 */ @@ -144,7 +144,8 @@ VOID FAR *HMAalloc(COUNT bytesToAllocate); UWORD init_oem(void); /* intr.asm */ -/* void init_call_intr(int nr, iregs *rp); */ + +void init_call_intr(int nr, iregs *rp); UCOUNT read(int fd, void *buf, UCOUNT count); int open(const char *pathname, int flags); int close(int fd); diff --git a/kernel/inithma.c b/kernel/inithma.c index effb6aa..30fd242 100644 --- a/kernel/inithma.c +++ b/kernel/inithma.c @@ -80,6 +80,9 @@ static BYTE *RcsId = "$Id$"; /* * $Log$ + * Revision 1.6 2001/04/29 17:34:40 bartoldeman + * A new SYS.COM/config.sys single stepping/console output/misc fixes. + * * Revision 1.5 2001/04/21 22:32:53 bartoldeman * Init DS=Init CS, fixed stack overflow problems and misc bugs. * @@ -494,6 +497,7 @@ void InstallVDISK(VOID) setvec(0x19, MK_FP(0xffff,0x0010)); /* let INT 19 point to VDISK */ + *(WORD FAR *)MK_FP(0xffff,0x002e) = 1024+64; } diff --git a/kernel/inthndlr.c b/kernel/inthndlr.c index bd92f90..0526c94 100644 --- a/kernel/inthndlr.c +++ b/kernel/inthndlr.c @@ -37,6 +37,9 @@ BYTE *RcsId = "$Id$"; /* * $Log$ + * Revision 1.23 2001/04/29 17:34:40 bartoldeman + * A new SYS.COM/config.sys single stepping/console output/misc fixes. + * * Revision 1.22 2001/04/21 22:32:53 bartoldeman * Init DS=Init CS, fixed stack overflow problems and misc bugs. * @@ -961,7 +964,11 @@ dispatch: /* Get Country Information */ if((rc = DosGetCountryInformation(cntry, FP_DS_DX)) < 0) goto error_invalid; - r->AX = r->BX = cntry; + /* HACK FIXME */ + if(cntry == (UWORD)-1) + cntry = 1; + /* END OF HACK */ + r->AX = r->BX = cntry; } } break; diff --git a/kernel/intr.asm b/kernel/intr.asm index 362d831..6783b90 100644 --- a/kernel/intr.asm +++ b/kernel/intr.asm @@ -97,7 +97,6 @@ _int3: segment INIT_TEXT -%if 0 ; ; void init_call_intr(nr, rp) ; REG int nr @@ -159,7 +158,6 @@ init_intr?1: ret -%endif ; ; int init_call_XMScall( (WORD FAR * driverAddress)(), WORD AX, WORD DX) ; @@ -297,4 +295,4 @@ _allocmem: mov [bx], ax xor ax, ax ret - \ No newline at end of file + diff --git a/kernel/io.asm b/kernel/io.asm index 41bee9b..37fec88 100644 --- a/kernel/io.asm +++ b/kernel/io.asm @@ -28,6 +28,9 @@ ; $Header$ ; ; $Log$ +; Revision 1.9 2001/04/29 17:34:40 bartoldeman +; A new SYS.COM/config.sys single stepping/console output/misc fixes. +; ; Revision 1.8 2001/04/21 22:32:53 bartoldeman ; Init DS=Init CS, fixed stack overflow problems and misc bugs. ; @@ -81,6 +84,8 @@ extern _reloc_call_blk_driver extern _reloc_call_clk_driver + extern _TEXT_DGROUP:wrt TGROUP + ;--------------------------------------------------- ; ; Device entry points @@ -223,12 +228,13 @@ DiskTable db 0 ; ; Local storage ; - +%if 0 segment _BSS blk_dos_stk resw 1 blk_dos_seg resw 1 clk_dos_stk resw 1 clk_dos_seg resw 1 +%endif segment _IO_TEXT global _ReqPktPtr @@ -539,38 +545,71 @@ GetUnitNum: ; NOTE: This code is not standard device driver handlers ; It is written for sperate code and data space. ; + +blk_driver_params: + dw blk_stk_top + dw _reloc_call_blk_driver + dw seg _reloc_call_blk_driver + +clk_driver_params: + dw clk_stk_top + dw _reloc_call_clk_driver + dw seg _reloc_call_clk_driver + + ; clock device interrupt +clk_entry: + pushf + push bx + + mov bx, clk_driver_params + + jmp short clk_and_blk_common + + + ; block device interrupt blk_entry: pushf - push ax push bx - push ds + + mov bx, blk_driver_params + +clk_and_blk_common: + + push ax + push cx + push dx ; small model - mov ax,DGROUP ; correct for segments - mov ds,ax ; ax to carry segment - mov word [blk_dos_stk],sp ; use internal stack - mov word [blk_dos_seg],ss - pushf ; put flags in bx - pop bx + mov ax,sp ; use internal stack + mov dx,ss + pushf ; put flags in cx + pop cx cli ; no interrupts - mov ss,ax - mov sp,blk_stk_top - push bx + mov ss,[cs:_TEXT_DGROUP] + mov sp,[cs:bx] + + push cx popf ; restore interrupt flag + + - - push cx ; push these registers on - push dx ; BLK_STACK + push ax ; save old SS/SP + push dx + + ; push these registers on + push ds ; BLK_STACK push bp ; to save stack space push si push di push es + + mov ds,[cs:_TEXT_DGROUP] ; push word [cs:_ReqPktPtr+2] push word [cs:_ReqPktPtr] - call far _reloc_call_blk_driver + call far [cs:bx+2] pop cx pop cx @@ -582,74 +621,21 @@ blk_entry: pop di pop si pop bp - pop dx - pop cx + pop ds + + + pop dx ; get back old SS/SP + pop ax cli ; no interrupts - mov sp,[blk_dos_stk] ; use dos stack - mov ss,[blk_dos_seg] + mov ss,dx ; use dos stack + mov sp,ax - pop ds - pop bx - pop ax - popf - retf - - - - - - ; - ; clock device interrupt - ; - ; NOTE: This code is not standard device driver handlers - ; It is written for sperate code and data space. - ; -clk_entry: - pushf - push ax - push bx - push cx - push dx - push bp - push si - push di - push ds - push es - - ; small model - mov ax,DGROUP ; correct for segments - mov ds,ax ; ax to carry segment - mov word [clk_dos_stk],sp ; use internal stack - mov word [clk_dos_seg],ss - pushf ; put flags in bx - pop bx - cli ; no interrupts - mov ss,ax - mov sp,clk_stk_top - push bx - popf ; restore interrupt flag - mov bp,sp ; make a c frame - push word [cs:_ReqPktPtr+2] - push word [cs:_ReqPktPtr] - call far _reloc_call_clk_driver - pop cx - pop cx - les bx,[cs:_ReqPktPtr] ; now return completion code - mov word [es:bx+status],ax ; mark operation complete - cli ; no interrupts - mov sp,[clk_dos_stk] ; use dos stack - mov ss,[clk_dos_seg] - pop es - pop ds - pop di - pop si - pop bp pop dx pop cx - pop bx pop ax + pop bx popf retf diff --git a/kernel/kernel.asm b/kernel/kernel.asm index 24e02ab..e280b54 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -28,6 +28,9 @@ ; $Id$ ; ; $Log$ +; Revision 1.12 2001/04/29 17:34:40 bartoldeman +; A new SYS.COM/config.sys single stepping/console output/misc fixes. +; ; Revision 1.11 2001/04/22 01:19:34 bartoldeman ; Avoid sys warning and have a VDISK signature in the HMA ; @@ -270,7 +273,8 @@ _first_mcb dw 0 ;-0002 Start of user memory MARK0026H equ $ _DPBp dd 0 ; 0000 First drive Parameter Block global _sfthead -_sfthead dd 0 ; 0004 System File Table head +_sfthead dw _firstsftt ; 0004 System File Table head + dw seg _firstsftt global _clock _clock dd 0 ; 0008 CLOCK$ device global _syscon @@ -333,7 +337,12 @@ _uppermem_root dw 0 ; 0066 dmd_upper_root _umb_start dw 0 ; 0068 para of last mem search SysVarEnd: -; We've got (01fb-006a) some room here: don't use all zeros! +;; The first 5 sft entries appear to have to be at DS:00cc + times (0cch - ($ - DATASTART)) db 0 + global _firstsftt +_firstsftt: + dd -1 ; link to next + dw 5 ; count ; Some references seem to indicate that this data should start at 01fbh in ; order to maintain 100% MS-DOS compatibility. @@ -670,10 +679,8 @@ __HMATextStart: ; segment HMA_TEXT begin_hma: - times 13h db 0 ; filler [ffff:0..ffff:12] - db 'VDISK',0 ; VDISK3.3 signature at ffff:0013 - times (2eh-($-begin_hma)) db 0 - dw 1088 ; 0x2e: first free kb position for extended memory + times 10h db 0 ; filler [ffff:0..ffff:10] + times 20h db 0 db 0 init_ret_np: push ds @@ -1006,7 +1013,16 @@ FAIL equ 03h _int24_handler: mov al,FAIL iret - - +; +; this makes some things easier +; + +segment _TEXT + global _TEXT_DGROUP +_TEXT_DGROUP dw DGROUP + +segment INIT_TEXT + global _INIT_DGROUP +_INIT_DGROUP dw DGROUP diff --git a/kernel/main.c b/kernel/main.c index 3ad987b..2963bcc 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -41,9 +41,6 @@ extern UBYTE FAR nblkdev, FAR lastdrive; /* value of last drive */ -GLOBAL struct f_node FAR - * FAR f_nodes; /* pointer to the array */ - GLOBAL BYTE FAR os_major, /* major version number */ FAR os_minor, /* minor version number */ @@ -55,10 +52,8 @@ GLOBAL BYTE FAR os_release[]; GLOBAL BYTE FAR copyright[]; GLOBAL seg FAR RootPsp; /* Root process -- do not abort */ -GLOBAL struct f_node * FAR pDirFileNode; extern struct dpb FAR * FAR DPBp; /* First drive Parameter Block */ extern cdstbl FAR * FAR CDSp; /* Current Directory Structure */ -extern sfttbl FAR * FAR sfthead; /* System File Table head */ extern struct dhdr FAR * FAR clock, /* CLOCK$ device */ FAR * FAR syscon; /* console device */ @@ -76,6 +71,9 @@ static BYTE *mainRcsId = "$Id$"; /* * $Log$ + * Revision 1.16 2001/04/29 17:34:40 bartoldeman + * A new SYS.COM/config.sys single stepping/console output/misc fixes. + * * Revision 1.15 2001/04/21 22:32:53 bartoldeman * Init DS=Init CS, fixed stack overflow problems and misc bugs. * @@ -351,15 +349,7 @@ INIT VOID FsConfig(VOID) /* The system file tables need special handling and are "hand */ /* built. Included is the stdin, stdout, stdaux and stdprn. */ - sfthead->sftt_next = (sfttbl FAR *) - 1; - sfthead->sftt_count = Config.cfgFiles; - for (i = 0; i < Config.cfgFiles; i++) - { - /* Initialize the file tables */ - f_nodes[i].f_count = 0; - sfthead->sftt_table[i].sft_count = 0; - sfthead->sftt_table[i].sft_status = -1; - } + /* 0 is /dev/con (stdin) */ open("CON", O_RDWR); @@ -406,6 +396,20 @@ INIT VOID FsConfig(VOID) pcds_table->cdsJoinOffset = 2; } + /* + this is a quick patch - see if B: exists + test for A: also, need not exist + */ + { + iregs r; + + init_call_intr(0x11,&r); /* get equipment list */ + if ((r.a.x & 1)==0 || ((r.a.x & 1) && (r.a.x & 0xc0)==0)) + /* no floppy drives installed or no B: drive */ + CDSp->cds_table[1].cdsFlags = 0; + if ((r.a.x & 1)==0) /* no floppy drives installed */ + CDSp->cds_table[0].cdsFlags = 0; + } /* Initialize the disk buffer management functions */ /* init_call_init_buffers(); done from CONFIG.C */ } @@ -462,17 +466,63 @@ INIT void kernel() fmemcpy(MK_FP(exb.exec.env_seg, 0), master_env, sizeof(master_env)); #endif #endif + RootPsp = ~0; + + /* process 0 */ /* Execute command.com /P from the drive we just booted from */ - fstrncpy(Cmd.ctBuffer, Config.cfgInitTail, sizeof(Config.cfgInitTail)-1); + fstrncpy(Cmd.ctBuffer, Config.cfgInitTail, + sizeof(Config.cfgInitTail)-1); for (Cmd.ctCount = 0; Cmd.ctCount < 127; Cmd.ctCount++) if (Cmd.ctBuffer[Cmd.ctCount] == '\r') break; + + + + /* if stepping CONFIG.SYS (F5/F8), tell COMMAND.COM about it */ + + if (Cmd.ctCount < 127 - 3) + { + extern int singleStep ; + extern int SkipAllConfig; + char *insertString = NULL; + + if (singleStep) insertString = " /Y"; /* single step AUTOEXEC */ + + if (SkipAllConfig) insertString = " /D"; /* disable AUTOEXEC */ + + if (insertString) + { + + /* insert /D, /Y as first argument */ + int cmdEnd,i,slen = strlen(insertString); + + for (cmdEnd = 0;cmdEnd < 127; cmdEnd++) + { + if (Cmd.ctBuffer[cmdEnd] == ' ' || + Cmd.ctBuffer[cmdEnd] == '\t' || + Cmd.ctBuffer[cmdEnd] == '\r') + { + for (i = 127 - slen; i >= cmdEnd; i--) + Cmd.ctBuffer[i+slen] = Cmd.ctBuffer[i]; + + fmemcpy(&Cmd.ctBuffer[cmdEnd], insertString,slen); + + Cmd.ctCount += slen; + + break; + } + } + } + } + + + exb.exec.cmd_line = (CommandTail FAR *) & Cmd; exb.exec.fcb_1 = exb.exec.fcb_2 = (fcb FAR *) 0; @@ -483,7 +533,7 @@ INIT void kernel() while ((rc = init_DosExec(Config.cfgP_0_startmode, &exb, Config.cfgInit)) != SUCCESS) { BYTE *pLine; - printf("\nBad or missing Command Interpreter: %d\n", rc); + printf("\nBad or missing Command Interpreter: %d - %s\n", rc, Cmd.ctBuffer); printf("\nPlease enter the correct location (for example C:\\COMMAND.COM):\n"); rc = read(STDIN, Cmd.ctBuffer, sizeof(Cmd.ctBuffer)-1); Cmd.ctBuffer[rc]='\0'; diff --git a/kernel/network.c b/kernel/network.c index 0c5f763..f990678 100644 --- a/kernel/network.c +++ b/kernel/network.c @@ -36,6 +36,9 @@ static BYTE *RcsId = "$Id$"; /* * $Log$ + * Revision 1.12 2001/04/29 17:34:40 bartoldeman + * A new SYS.COM/config.sys single stepping/console output/misc fixes. + * * Revision 1.11 2001/04/15 03:21:50 bartoldeman * See history.txt for the list of fixes. * @@ -125,16 +128,14 @@ UCOUNT Remote_RW(UWORD func, UCOUNT n, BYTE FAR * bp, sft FAR * s, COUNT FAR * e /* */ -COUNT Remote_find(UWORD func, BYTE FAR * name, REG dmatch FAR * dmp ) +COUNT Remote_find(UWORD func, UCOUNT attr, BYTE FAR * name) { COUNT i; char FAR *p; - VOID FAR * test; - struct dirent FAR *SDp = (struct dirent FAR *) &SearchDir; if (func == REM_FINDFIRST) { - test = (VOID FAR *) current_ldt; + SAttr = attr; i = truename(name, PriPathName, FALSE); if (i != SUCCESS) { return i; @@ -147,25 +148,23 @@ COUNT Remote_find(UWORD func, BYTE FAR * name, REG dmatch FAR * dmp ) printf("'\n"); #endif } - else - test = (VOID FAR *) &TempBuffer; - fmemcpy((BYTE FAR *) &TempBuffer, dta, 21); + fmemcpy(TempBuffer, dta, 21); p = dta; - dta = (BYTE FAR *) &TempBuffer; - i = int2f_Remote_call(func, 0, 0, 0, test, 0, 0); + dta = (BYTE FAR *)TempBuffer; + i = int2f_Remote_call(func, 0, 0, 0, (VOID FAR *)current_ldt, 0, 0); dta = p; - fmemcpy(dta, (BYTE FAR *) &TempBuffer, 21); + fmemcpy(dta, TempBuffer, 21); if (i != 0) return i; - dmp->dm_attr_fnd = (BYTE) SDp->dir_attrib; - dmp->dm_time = SDp->dir_time; - dmp->dm_date = SDp->dir_date; - dmp->dm_size = (LONG) SDp->dir_size; + ((dmatch FAR *)dta)->dm_attr_fnd = (BYTE) SearchDir.dir_attrib; + ((dmatch FAR *)dta)->dm_time = SearchDir.dir_time; + ((dmatch FAR *)dta)->dm_date = SearchDir.dir_date; + ((dmatch FAR *)dta)->dm_size = (LONG) SearchDir.dir_size; - ConvertName83ToNameSZ((BYTE FAR *) dmp->dm_name, (BYTE FAR *) SDp->dir_name); + ConvertName83ToNameSZ(((dmatch FAR *)dta)->dm_name, (BYTE *)SearchDir.dir_name); return i; } diff --git a/kernel/prf.c b/kernel/prf.c index 3f72bac..1274bd7 100644 --- a/kernel/prf.c +++ b/kernel/prf.c @@ -48,6 +48,9 @@ static BYTE *prfRcsId = "$Id$"; /* * $Log$ + * Revision 1.10 2001/04/29 17:34:40 bartoldeman + * A new SYS.COM/config.sys single stepping/console output/misc fixes. + * * Revision 1.9 2001/04/21 22:32:53 bartoldeman * Init DS=Init CS, fixed stack overflow problems and misc bugs. * @@ -67,6 +70,9 @@ static BYTE *prfRcsId = "$Id$"; * recoded for smaller object footprint, added main() for testing+QA * * $Log$ + * Revision 1.10 2001/04/29 17:34:40 bartoldeman + * A new SYS.COM/config.sys single stepping/console output/misc fixes. + * * Revision 1.9 2001/04/21 22:32:53 bartoldeman * Init DS=Init CS, fixed stack overflow problems and misc bugs. * @@ -152,6 +158,17 @@ VOID cso(); void __int__(int); /* TC 2.01 requires this. :( -- ror4 */ #endif +#ifdef FORSYS +COUNT fstrlen (BYTE FAR * s) /* don't want globals.h, sorry */ +{ + int i = 0; + + while (*s++) + i++; + + return i; +} +#endif /* special console output routine */ VOID @@ -159,10 +176,14 @@ put_console(COUNT c) { if (c == '\n') put_console('\r'); - + +#ifdef FORSYS + write(1,&c,1); /* write character to stdout */ +#else _AX = 0x0e00 | c; _BX = 0x0070; __int__(0x10); +#endif } /* special handler to switch between sprintf and printf */ @@ -336,6 +357,7 @@ COUNT p = *((BYTE FAR **) arg)++; goto do_outputstring; + case 'i': case 'd': base = -10; goto lprt; @@ -348,6 +370,7 @@ COUNT base = 10; goto lprt; + case 'X': case 'x': base = 16; diff --git a/kernel/proto.h b/kernel/proto.h index 7368b4f..b9471b1 100644 --- a/kernel/proto.h +++ b/kernel/proto.h @@ -34,6 +34,9 @@ static BYTE *Proto_hRcsId = "$Id$"; /* * $Log$ + * Revision 1.16 2001/04/29 17:34:40 bartoldeman + * A new SYS.COM/config.sys single stepping/console output/misc fixes. + * * Revision 1.15 2001/04/21 22:32:53 bartoldeman * Init DS=Init CS, fixed stack overflow problems and misc bugs. * @@ -184,7 +187,7 @@ UWORD dskxfer(COUNT dsk, ULONG blkno, VOID FAR * buf, UWORD numblocks, COUNT mod /* *** End of change /* chario.c */ -/* VOID cso(COUNT c);*/ +VOID cso(COUNT c); VOID sto(COUNT c); VOID mod_sto(REG UCOUNT c); VOID destr_bs(void); @@ -481,7 +484,7 @@ COUNT QRemote_Fn(char FAR * s, char FAR * d); UWORD get_machine_name(BYTE FAR * netname); VOID set_machine_name(BYTE FAR * netname, UWORD name_num); UCOUNT Remote_RW(UWORD func, UCOUNT n, BYTE FAR * bp, sft FAR * s, COUNT FAR * err); -COUNT Remote_find(UWORD func, BYTE FAR * name, REG dmatch FAR * dmp); +COUNT Remote_find(UWORD func, UCOUNT attr, BYTE FAR * name); /* procsupt.asm */ VOID INRPT FAR exec_user(iregs FAR * irp); diff --git a/kernel/segs.inc b/kernel/segs.inc index 997a368..9aea54c 100644 --- a/kernel/segs.inc +++ b/kernel/segs.inc @@ -29,6 +29,9 @@ ; $Header$ ; ; $Log$ +; Revision 1.7 2001/04/29 17:34:40 bartoldeman +; A new SYS.COM/config.sys single stepping/console output/misc fixes. +; ; Revision 1.6 2001/04/21 22:32:53 bartoldeman ; Init DS=Init CS, fixed stack overflow problems and misc bugs. ; @@ -78,7 +81,7 @@ segment _DATA class=DATA align=2 segment _BSSSTART class=BSS align=2 segment _BSS class=BSS align=2 segment _BSSEND class=BSS -segment HMA_TEXT_START class=HMA +segment HMA_TEXT_START class=HMA align=16 segment HMA_TEXT class=HMA segment HMA_TEXT_END class=HMA segment INIT_TEXT_START class=INIT align=16 diff --git a/sys/sys.mak b/sys/sys.mak index 9f5e0bb..80f72b2 100644 --- a/sys/sys.mak +++ b/sys/sys.mak @@ -4,6 +4,9 @@ # $Id$ # # $Log$ +# Revision 1.8 2001/04/29 17:34:41 bartoldeman +# A new SYS.COM/config.sys single stepping/console output/misc fixes. +# # Revision 1.7 2001/04/15 03:21:50 bartoldeman # See history.txt for the list of fixes. # @@ -46,7 +49,7 @@ !include "..\config.mak" CFLAGS = -mt -1- -v -vi- -k- -f- -ff- -O -Z -d -I$(INCLUDEPATH);..\hdr \ - -DI86;PROTO + -DI86;PROTO;FORSYS # *Implicit Rules* .c.obj: @@ -57,11 +60,10 @@ CFLAGS = -mt -1- -v -vi- -k- -f- -ff- -O -Z -d -I$(INCLUDEPATH);..\hdr \ # *List Macros* -LIBS = floppy.obj EXE_dependencies = \ sys.obj \ - floppy.obj + prf.obj # *Explicit Rules* production: ..\bin\sys.com @@ -75,11 +77,14 @@ b_fat12.h: ..\boot\b_fat12.bin bin2c.com b_fat16.h: ..\boot\b_fat16.bin bin2c.com bin2c ..\boot\b_fat16.bin b_fat16.h b_fat16 -floppy.obj: ..\drivers\floppy.asm - $(NASM) -fobj -DSYS=1 ..\drivers\floppy.asm -o floppy.obj +#floppy.obj: ..\drivers\floppy.asm +# $(NASM) -fobj -DSYS=1 ..\drivers\floppy.asm -o floppy.obj + +prf.obj: ..\kernel\prf.c + $(CC) $(CFLAGS) -c ..\kernel\prf.c sys.com: $(EXE_dependencies) - $(LINK) /m/t/c $(LIBPATH)\c0t.obj+sys.obj+$(LIBS),sys,,\ + $(LINK) /m/t/c $(LIBPATH)\c0t.obj+$(EXE_dependencies),sys,,\ $(CLIB); clobber: clean