Implement Int 2F/AX=120Bh based on RBIL description

This commit is contained in:
KJD 2016-01-16 20:56:29 -05:00
parent ad3d7802f6
commit c9300387e7
2 changed files with 24 additions and 0 deletions

View File

@ -58,8 +58,10 @@ static BYTE *file_hRcsId =
/* bits 2, 3 reserved */
/* bits 4, 5, 6 sharing modes */
/* see PC Mag Nov 15, 1988 "Networked Database" p234 by Frank J Derfler Jr */
#define O_SHAREMASK 0x0070 /* mask to isolate shared bits */
#define O_COMPAT 0x0000 /* default, compatibility mode */
#define O_DENYALL 0x0010 /* sharing bits */
#define O_DENYWRITE 0x0020 /* " " */
#define O_DENYREAD 0x0030 /* " " */

View File

@ -1797,6 +1797,28 @@ VOID ASMCFUNC int2F_12_handler(struct int2f12regs r)
default_drive,
r.callerARG1, /* error, from RBIL passed on stack */
CDSp[(WORD)default_drive].cdsDpb->dpb_device);
r.FLAGS |= FLG_CARRY;
if (r.AL == 1) r.FLAGS &= ~FLG_CARRY; /* carry clear if should retry */
break;
case 0x0b: /* sharing violation occurred */
{
/* ES:DI = SFT for previous open of file */
sft FAR *sftp = MK_FP(r.ES, r.DI);
/* default to don't retry, ie fail/abort/etc other than retry */
r.FLAGS |= FLG_CARRY;
/* from RBIL if SFT for FCB or compatibility mode without NOINHERIT call int24h */
if ((sftp->sft_mode & O_FCB) || !(sftp->sft_mode & (O_SHAREMASK | O_NOINHERIT)))
{
r.AL = CriticalError(0x38, /* ignore/retry/fail - ??? */
default_drive,
r.callerARG1, /* error, from RBIL passed on stack */
CDSp[(WORD)default_drive].cdsDpb->dpb_device);
/* clear carry if should retry */
if (r.AL == 1) r.FLAGS &= ~FLG_CARRY;
}
r.AX = 0x20; /* error sharing violation */
}
break;
case 0x0c: /* perform "device open" for device, set owner for FCB */