📄 inthndlr.c
字号:
/* Load and Execute Program */ case 0x4b: break_flg = FALSE; rc = DosExec(lr.AL, MK_FP(lr.ES, lr.BX), FP_DS_DX); goto short_check; /* Terminate Program */ case 0x00: lr.AX = 0x4c00; /* End Program */ case 0x4c: if (((psp FAR *)MK_FP(cu_psp, 0))->ps_parent == cu_psp) break; tsr = FALSE; rc = 0; if (ErrorMode) { ErrorMode = FALSE; rc = 0x200; } else if (break_flg) { break_flg = FALSE; rc = 0x100; } return_code = lr.AL | rc; if (DosMemCheck() != SUCCESS) panic("MCB chain corrupted");#ifdef TSC StartTrace();#endif return_user(); break; /* Get Child-program Return Value */ case 0x4d: lr.AX = return_code; /* needs to be cleared (RBIL) */ return_code = 0; break; /* Dos Find First */ case 0x4e: /* dta for this call is set on entry. This */ /* needs to be changed for new versions. */ rc = DosFindFirst(lr.CX, FP_DS_DX); lr.AX = 0; goto short_check; /* Dos Find Next */ case 0x4f: /* dta for this call is set on entry. This */ /* needs to be changed for new versions. */ rc = DosFindNext(); lr.AX = 0; goto short_check;/* case 0x50: case 0x51: see int21_syscall*/ /* ************UNDOCUMENTED************************************* */ /* Get List of Lists */ case 0x52: lr.ES = FP_SEG(&DPBp); lr.BX = FP_OFF(&DPBp); break; case 0x53: /* DOS 2+ internal - TRANSLATE BIOS PARAMETER BLOCK TO DRIVE PARAM BLOCK */ bpb_to_dpb((bpb FAR *) MK_FP(lr.DS, lr.SI), (struct dpb FAR *)MK_FP(lr.ES, r->BP)#ifdef WITHFAT32 , (lr.CX == 0x4558 && lr.DX == 0x4152)#endif ); break; /* Get verify state */ case 0x54: lr.AL = verify_ena; break; /* ************UNDOCUMENTED************************************* */ /* Dos Create New Psp & set p_size */ case 0x55: child_psp(lr.DX, cu_psp, lr.SI); cu_psp = lr.DX; break; /* Dos Rename */ case 0x56: rc = DosRename(FP_DS_DX, FP_ES_DI); goto short_check; /* Get/Set File Date and Time */ case 0x57: switch (lr.AL) { case 0x00: rc = DosGetFtime((COUNT) lr.BX, /* Handle */ &lr.DX, /* FileDate */ &lr.CX); /* FileTime */ break; case 0x01: rc = DosSetFtime((COUNT) lr.BX, /* Handle */ (date) lr.DX, /* FileDate */ (time) lr.CX); /* FileTime */ break; default: goto error_invalid; } goto short_check; /* Get/Set Allocation Strategy */ case 0x58: switch (lr.AL) { case 0x00: lr.AL = mem_access_mode; lr.AH = 0; break; case 0x01: if (lr.BL > LAST_FIT_U || /* 0x82 */ (lr.BL & FIT_MASK) > LAST_FIT) /* 0x3f, 0x02 */ goto error_invalid; mem_access_mode = lr.BL; break; case 0x02: lr.AL = uppermem_link; break; case 0x03: if (uppermem_root != 0xffff) /* always error if not exists */ { DosUmbLink(lr.BX); break; } /* else fall through */ default: goto error_invalid;#ifdef DEBUG case 0xff: show_chain(); break;#endif } break; /* Get Extended Error */ case 0x59: lr.AX = CritErrCode; lr.ES = FP_SEG(CritErrDev); lr.DI = FP_OFF(CritErrDev); lr.CH = CritErrLocus; lr.BH = CritErrClass; lr.BL = CritErrAction; break; /* Create Temporary File */ case 0x5a: lrc = DosMkTmp(FP_DS_DX, lr.CX); goto long_check; /* Create New File */ case 0x5b: lrc = DosOpen(FP_DS_DX, O_LEGACY | O_RDWR | O_CREAT, lr.CX); goto long_check;/* /// Added for SHARE. - Ron Cemer */ /* Lock/unlock file access */ case 0x5c: rc = DosLockUnlock (lr.BX, ((unsigned long)lr.CX << 16) | lr.DX, ((unsigned long)lr.SI << 16) | lr.DI, lr.AL != 0); if (rc != SUCCESS) goto error_exit; break;/* /// End of additions for SHARE. - Ron Cemer */ /* UNDOCUMENTED: server, share.exe and sda function */ case 0x5d: switch (lr.AL) { /* Remote Server Call */ case 0x00: fmemcpy(&lr, FP_DS_DX, sizeof(lr)); goto dispatch; case 0x06: lr.DS = FP_SEG(internal_data); lr.SI = FP_OFF(internal_data); lr.CX = swap_indos - internal_data; lr.DX = swap_always - internal_data; CLEAR_CARRY_FLAG(); break; case 0x07: case 0x08: case 0x09: rc = remote_printredir(lr.DX, Int21AX); CLEAR_CARRY_FLAG(); if (rc != SUCCESS) goto error_exit; break; /* Set Extended Error */ case 0x0a: { #define er (* MK_PTR (lregs, lr.DS, lr.DX)) CritErrCode = er.AX; CritErrDev = MK_FP(er.ES, er.DI); CritErrLocus = er.CH; CritErrClass = er.BH; CritErrAction = er.BL; #undef er CLEAR_CARRY_FLAG(); break; } default: CritErrCode = SUCCESS; goto error_invalid; } break; case 0x5e: switch (lr.AL) { case 0x00: lr.CX = get_machine_name(FP_DS_DX); break; case 0x01: set_machine_name(FP_DS_DX, lr.CX); break; default: rc = (int)network_redirector_mx(REM_PRINTSET, &lr, (void *)Int21AX); goto short_check; } break; case 0x5f: if (lr.AL == 7 || lr.AL == 8) { if (lr.DL < lastdrive) { struct cds FAR *cdsp = CDSp + lr.DL; if (FP_OFF(cdsp->cdsDpb)) /* letter of physical drive? */ { cdsp->cdsFlags &= ~CDSPHYSDRV; if (lr.AL == 7) cdsp->cdsFlags |= CDSPHYSDRV; break; } } rc = DE_INVLDDRV; goto error_exit; } else { rc = (int)network_redirector_mx(REM_DOREDIRECT, &lr, (void *)Int21AX); /* the remote function manipulates *r directly !, so we should not copy lr to r here */ if (rc != SUCCESS) { CritErrCode = -rc; /* Maybe set */ SET_CARRY_FLAG(); } r->AX = -rc; goto real_exit; } case 0x60: /* TRUENAME */ rc = DosTruename(MK_FP(lr.DS, lr.SI), adjust_far(FP_ES_DI)); goto short_check;#ifdef TSC /* UNDOCUMENTED: no-op */ /* */ /* DOS-C: tsc support */ case 0x61:#ifdef DEBUG switch (lr.AL) { case 0x01: bTraceNext = TRUE; break; case 0x02: bDumpRegs = FALSE; break; }#endif lr.AL = 0x00; break;#endif /* UNDOCUMENTED: return current psp case 0x62: is in int21_syscall lr.BX = cu_psp; break; */ /* UNDOCUMENTED: Double byte and korean tables */ case 0x63: {#if 0 /* not really supported, but will pass. */ lr.AL = 0x00; /*jpp: according to interrupt list */ /*Bart: fails for PQDI and WATCOM utilities: use the above again */#endif switch (lr.AL) { case 0: lr.DS = FP_SEG(&nlsDBCSHardcoded); lr.SI = FP_OFF(&nlsDBCSHardcoded); break; case 1: /* set Korean Hangul input method to DL 0/1 */ lr.AL = 0xff; /* flag error (AL would be 0 if okay) */ break; case 2: /* get Korean Hangul input method setting to DL */ lr.AL = 0xff; /* flag error, do not set DL */ break; default: /* is this the proper way to handle invalid AL? */ rc = -1; goto error_exit; } break; }/* case 0x64: see above (invalid)*/ /* Extended country info */ case 0x65: switch (lr.AL) { case 0x20: /* upcase single character */ lr.DL = DosUpChar(lr.DL); break; case 0x21: /* upcase memory area */ DosUpMem(FP_DS_DX, lr.CX); break; case 0x22: /* upcase ASCIZ */ DosUpString(FP_DS_DX); break; case 0xA0: /* upcase single character of filenames */ lr.DL = DosUpFChar(lr.DL); break; case 0xA1: /* upcase memory area of filenames */ DosUpFMem(FP_DS_DX, lr.CX); break; case 0xA2: /* upcase ASCIZ of filenames */ DosUpFString(FP_DS_DX); break; case 0x23: /* check Yes/No response */ lr.AX = DosYesNo(lr.DL); break; default:#ifdef NLS_DEBUG if ((rc = DosGetData(lr.AL, lr.BX, lr.DX, lr.CX, FP_ES_DI)) < 0) { printf("DosGetData() := %d\n", rc); goto error_exit; } printf("DosGetData() returned successfully\n"); break;#else rc = DosGetData(lr.AL, lr.BX, lr.DX, lr.CX, FP_ES_DI); goto short_check;#endif } break; /* Code Page functions */ case 0x66: switch (lr.AL) { case 1: rc = DosGetCodepage(&lr.BX, &lr.DX); break; case 2: rc = DosSetCodepage(lr.BX, lr.DX); break; default: goto error_invalid; } if (rc != SUCCESS) goto error_exit; break; /* Set Max file handle count */ case 0x67: rc = SetJFTSize(lr.BX); goto short_check; /* Flush file buffer -- COMMIT FILE. */ case 0x68: case 0x6a: rc = DosCommit(lr.BX); goto short_check; /* Get/Set Serial Number */ case 0x69: rc = (lr.BL == 0 ? default_drive : lr.BL - 1); if (lr.AL < 2) { if (get_cds(rc) == NULL) { rc = DE_INVLDDRV; goto error_exit; } if (get_dpb(rc) != NULL) { UWORD saveCX = lr.CX; lr.CX = lr.AL == 0 ? 0x0866 : 0x0846; lr.AL = 0x0d; rc = DosDevIOctl(&lr); lr.CX = saveCX; goto short_check; } } goto error_invalid;/* case 0x6a: see case 0x68 case 0x6b: dummy func: return AL=0*/ /* Extended Open-Creat, not fully functional. (bits 4,5,6 of BH) */ case 0x6c: /* high nibble must be <= 1, low nibble must be <= 2 */ if ((lr.DL & 0xef) > 0x2) goto error_invalid; lrc = DosOpen(MK_FP(lr.DS, lr.SI), (lr.BX & 0x70ff) | ((lr.DL & 3) << 8) | ((lr.DL & 0x10) << 6), lr.CL); if (lrc >= SUCCESS) /* action */ lr.CX = (UWORD)(lrc >> 16); goto long_check; /* case 0x6d and above not implemented : see default; return AL=0 */#ifdef WITHFAT32 /* LFN functions - fail with "function not supported" error code */ case 0x71: lr.AL = 00; goto error_carry; /* DOS 7.0+ FAT32 extended functions */ case 0x73: CLEAR_CARRY_FLAG(); CritErrCode = SUCCESS; rc = int21_fat32(&lr); goto short_check;#endif#ifdef WITHLFNAPI /* FreeDOS LFN helper API functions */ case 0x74: { switch (lr.AL) { /* Allocate LFN inode */ case 0x01: rc = lfn_allocate_inode(); break; /* Free LFN inode */ case 0x02: rc = lfn_free_inode(lr.BX); break; /* Setup LFN inode */ case 0x03: rc = lfn_setup_inode(lr.BX, ((ULONG)lr.CX << 16) | lr.DX, ((ULONG)lr.SI << 16) | lr.DI); break; /* Create LFN entries */ case 0x04: rc = lfn_create_entries(lr.BX, (lfn_inode_ptr)FP_DS_DX); break; /* Read next LFN */ case 0x05: rc = lfn_dir_read(lr.BX, (lfn_inode_ptr)FP_DS_DX); break; /* Write SFN pointed by LFN inode */ case 0x06: rc = lfn_dir_write(lr.BX); break; default: goto error_invalid; } lr.AX = rc; CLEAR_CARRY_FLAG(); goto short_check; }#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -