235 lines
6.4 KiB
C
235 lines
6.4 KiB
C
|
/*
|
|||
|
* demdisp.c - SVC dispatch module
|
|||
|
*
|
|||
|
* Modification History:
|
|||
|
*
|
|||
|
* Sudeepb 31-Mar-1991 Created
|
|||
|
*/
|
|||
|
|
|||
|
#include "dem.h"
|
|||
|
#include <stdio.h>
|
|||
|
#include <softpc.h>
|
|||
|
#include <dbgsvc.h>
|
|||
|
|
|||
|
|
|||
|
#if DBG
|
|||
|
|
|||
|
PCHAR aSVCNames[] = {
|
|||
|
"demChgFilePtr",
|
|||
|
"demChMod",
|
|||
|
"demClose",
|
|||
|
"demCreate",
|
|||
|
"demCreateDir",
|
|||
|
"demDelete",
|
|||
|
"demDeleteDir",
|
|||
|
"demDeleteFCB",
|
|||
|
"demFileTimes",
|
|||
|
"demFindFirst",
|
|||
|
"demFindFirstFCB",
|
|||
|
"demFindNext",
|
|||
|
"demFindNextFCB",
|
|||
|
"demGetBootDrive",
|
|||
|
"demGetDriveFreeSpace",
|
|||
|
"demGetDrives",
|
|||
|
"demGSetMediaID",
|
|||
|
"demLoadDos",
|
|||
|
"demOpen",
|
|||
|
"demQueryCurrentDir",
|
|||
|
"demQueryDate",
|
|||
|
"demQueryTime",
|
|||
|
"demRead",
|
|||
|
"demRename",
|
|||
|
"demSetCurrentDir",
|
|||
|
"demSetDate",
|
|||
|
"demSetDefaultDrive",
|
|||
|
"demSetDTALocation",
|
|||
|
"demSetTime",
|
|||
|
"demSetV86KernelAddr",
|
|||
|
"demWrite",
|
|||
|
"demGetDriveInfo",
|
|||
|
"demRenameFCB",
|
|||
|
"demIOCTL",
|
|||
|
"demCreateNew",
|
|||
|
"DemDiskReset",
|
|||
|
"DemSetDPB",
|
|||
|
"DemGetDPB",
|
|||
|
"DemSleazeFunc",
|
|||
|
"demCommit",
|
|||
|
"DemExtHandle",
|
|||
|
"DemAbsDRD",
|
|||
|
"DemAbsDWRT",
|
|||
|
"DemGsetCDPG",
|
|||
|
"DemCreateFCB",
|
|||
|
"DemOpenFCB",
|
|||
|
"DemCloseFCB",
|
|||
|
"DemFCBIO",
|
|||
|
"DemDate16",
|
|||
|
"DemGetFileInfo",
|
|||
|
"DemSetHardErrorInfo",
|
|||
|
"DemRetry",
|
|||
|
"DemLoadDosAppSym",
|
|||
|
"DemFreeDosAppSym",
|
|||
|
"DemEntryDosApp",
|
|||
|
"DemDOSDispCall",
|
|||
|
"DemDOSDispRet",
|
|||
|
"DemOutputString",
|
|||
|
"DemInputString",
|
|||
|
"DemIsDebug",
|
|||
|
"DemTerminatePDB",
|
|||
|
"DemExitVDM",
|
|||
|
"DemWOWFiles",
|
|||
|
"DemLockOper",
|
|||
|
"demNotYetImplemented",
|
|||
|
"DemGetComputerName",
|
|||
|
"DemFastRead",
|
|||
|
"DemFastWrite",
|
|||
|
"DemCheckPath",
|
|||
|
"DemSystemSymbolOp",
|
|||
|
"DemGetDpbList",
|
|||
|
"DemPipeFileDataEOF",
|
|||
|
"DemPipeFileEOF",
|
|||
|
"DemLFNEntry",
|
|||
|
"DemSetDosVarLocation"
|
|||
|
};
|
|||
|
|
|||
|
#endif // DBG
|
|||
|
|
|||
|
DWORD fShowSVCMsg = 0;
|
|||
|
ULONG CurrentISVC;
|
|||
|
|
|||
|
|
|||
|
PFNSVC apfnSVC [] = {
|
|||
|
demChgFilePtr, //SVC_DEMCHGFILEPTR
|
|||
|
demChMod, //SVC_DEMCHMOD
|
|||
|
demClose, //SVC_DEMCLOSE
|
|||
|
demCreate, //SVC_DEMCREATE
|
|||
|
demCreateDir, //SVC_DEMCREATEDIR
|
|||
|
demDelete, //SVC_DEMDELETE
|
|||
|
demDeleteDir, //SVC_DEMDELETEDIR
|
|||
|
demDeleteFCB, //SVC_DEMDELETEFCB
|
|||
|
demFileTimes, //SVC_DEMFILETIMES
|
|||
|
demFindFirst, //SVC_DEMFINDFIRST
|
|||
|
demFindFirstFCB, //SVC_DEMFINDFIRSTFCB
|
|||
|
demFindNext, //SVC_DEMFINDNEXT
|
|||
|
demFindNextFCB, //SVC_DEMFINDNEXTFCB
|
|||
|
demGetBootDrive, //SVC_DEMGETBOOTDRIVE
|
|||
|
demGetDriveFreeSpace, //SVC_DEMGETDRIVEFREESPACE
|
|||
|
demGetDrives, //SVC_DEMGETDRIVES
|
|||
|
demGSetMediaID, //SVC_DEMGSETMEDIAID
|
|||
|
demLoadDos, //SVC_DEMLOADDOS
|
|||
|
demOpen, //SVC_DEMOPEN
|
|||
|
demQueryCurrentDir, //SVC_DEMQUERYCURRENTDIR
|
|||
|
demQueryDate, //SVC_DEMQUERYDATE
|
|||
|
demQueryTime, //SVC_DEMQUERYTIME
|
|||
|
demRead, //SVC_DEMREAD
|
|||
|
demRename, //SVC_DEMRENAME
|
|||
|
demSetCurrentDir, //SVC_DEMSETCURRENTDIR
|
|||
|
demSetDate, //SVC_DEMSETDATE
|
|||
|
demSetDefaultDrive, //SVC_DEMSETDEFAULTDRIVE
|
|||
|
demSetDTALocation, //SVC_DEMSETDTALOCATION
|
|||
|
demSetTime, //SVC_DEMSETTIME
|
|||
|
demSetV86KernelAddr, //SVC_DEMSETV86KERNELADDR
|
|||
|
demWrite, //SVC_DEMWRITE
|
|||
|
demNotYetImplemented, //SVC_GETDRIVEINFO
|
|||
|
demRenameFCB, //SVC_DEMRENAMEFCB
|
|||
|
demIOCTL, //SVC_DEMIOCTL
|
|||
|
demCreateNew, //SVC_DEMCREATENEW
|
|||
|
demDiskReset, //SVC_DEMDISKRESET
|
|||
|
demNotYetImplemented, //SVC_DEMSETDPB
|
|||
|
demGetDPB, //SVC_DEMGETDPB
|
|||
|
demNotYetImplemented, //SVC_DEMSLEAZEFUNC
|
|||
|
demCommit, //SVC_DEMCOMMIT
|
|||
|
demNotYetImplemented, //SVC_DEMEXTHANDLE
|
|||
|
demAbsRead, //SVC_DEMABSDRD
|
|||
|
demAbsWrite, //SVC_DEMABSDWRT
|
|||
|
demNotYetImplemented, //SVC_DEMGSETCDPG
|
|||
|
demCreateFCB, //SVC_DEMCREATEFCB
|
|||
|
demOpenFCB, //SVC_DEMOPENFCB
|
|||
|
demCloseFCB, //SVC_DEMCLOSEFCB
|
|||
|
demFCBIO, //SVC_FCBIO
|
|||
|
demDate16, //SVC_DEMDATE16
|
|||
|
demGetFileInfo, //SVC_DEMGETFILEINFO
|
|||
|
demSetHardErrorInfo, //SVC_DEMSETHARDERRORINFO
|
|||
|
demRetry, //SVC_DEMRETRY
|
|||
|
demLoadDosAppSym, //SVC_DEMLOADDOSAPPSYM
|
|||
|
demFreeDosAppSym, //SVC_DEMFREEDOSAPPSYM
|
|||
|
demEntryDosApp, //SVC_DEMENTRYDOSAPP
|
|||
|
demDOSDispCall, //SVC_DEMDOSDISPCALL
|
|||
|
demDOSDispRet, //SVC_DEMDOSDISPRET
|
|||
|
demOutputString, //SVC_OUTPUT_STRING
|
|||
|
demInputString, //SVC_INPUT_STRING
|
|||
|
demIsDebug, //SVC_ISDEBUG
|
|||
|
demTerminatePDB, //SVC_PDBTERMINATE
|
|||
|
demExitVDM, //SVC_DEMEXITVDM
|
|||
|
demWOWFiles, //SVC_DEMWOWFILES
|
|||
|
demLockOper, //SVC_DEMLOCKOPER
|
|||
|
demNotYetImplemented, //SVC_DEMNOTYETIMPLEMENTED
|
|||
|
demGetComputerName, //SVC_DEMGETCOMPUTERNAME
|
|||
|
demNotYetImplemented, //SVC_DEMFASTREAD
|
|||
|
demNotYetImplemented, //SVC_DEMFASTWRITE
|
|||
|
demCheckPath, //SVC_DEMCHECKPATH
|
|||
|
demSystemSymbolOp, //SVC_DEMSYSTEMSYMBOLOP
|
|||
|
demGetDPBList, //SVC_DEMBUILDDPBLIST
|
|||
|
demPipeFileDataEOF, //SVC_DEMPIPEFILEDATAEOF
|
|||
|
demPipeFileEOF, //SVC_DEMPIPEFILEEOF
|
|||
|
demLFNEntry, //SVC_DEMLFNENTRY
|
|||
|
demSetDosVarLocation //SVC_SETDOSVARLOCATION
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
/* DemDispatch - Dispatch SVC call to right handler.
|
|||
|
*
|
|||
|
* Entry - iSvc (SVC byte following SVCop)
|
|||
|
*
|
|||
|
* Exit - None
|
|||
|
*
|
|||
|
* Note - Some mechanism has to be worked out to let the emulator know
|
|||
|
* about DOSKRNL code segment and size. Using these it will figure
|
|||
|
* out whether SVCop (hlt for the moment) has to be passed to
|
|||
|
* DEM or to be handled as normal invalid opcode.
|
|||
|
*/
|
|||
|
|
|||
|
BOOL DemDispatch (ULONG iSvc)
|
|||
|
{
|
|||
|
|
|||
|
DBGTRACE(VDMTR_TYPE_DEM + DEM_EVENT_DISPATCH, 0, iSvc);
|
|||
|
|
|||
|
if (iSvc >= SVC_DEMLASTSVC){
|
|||
|
#if DBG
|
|||
|
sprintf(demDebugBuffer,"Unimplemented SVC index %x\n",iSvc);
|
|||
|
OutputDebugStringOem(demDebugBuffer);
|
|||
|
#endif
|
|||
|
setCF(1);
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
if (pHardErrPacket) {
|
|||
|
pHardErrPacket->vhe_fbInt24 = 0;
|
|||
|
}
|
|||
|
|
|||
|
CurrentISVC = iSvc;
|
|||
|
(apfnSVC [iSvc])();
|
|||
|
|
|||
|
DBGTRACE(VDMTR_TYPE_DEM + DEM_EVENT_DISPATCH_EXIT, 0, iSvc);
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
VOID demNotYetImplemented (VOID)
|
|||
|
{
|
|||
|
if (fShowSVCMsg) {
|
|||
|
sprintf(demDebugBuffer,"Unimplemented SVC %d\n",CurrentISVC);
|
|||
|
OutputDebugStringOem(demDebugBuffer);
|
|||
|
}
|
|||
|
|
|||
|
setCF(0);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID demSetV86KernelAddr (VOID)
|
|||
|
{
|
|||
|
// Here debugger callout has to be made for DOSKRNL symbols
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|