コード例 #1
0
ファイル: MMMSDos.c プロジェクト: joeriedel/Abducted
void * BURGERCALL GetRealBufferProtectedPtr(void)
{
	Word32 TempReal;
	/* Get real pointer and then convert to true pointer */
	TempReal = GetRealBufferPtr();		/* Get the buffer pointer */
	if (TempReal) {		/* Did it allocate? */
		return RealToProtectedPtr(TempReal);	/* Convert to real pointer */
	}
	return 0;		/* Error! */
}
コード例 #2
0
ファイル: ClMSDosCode.c プロジェクト: joeriedel/Abducted
int Call86(Word32 Address,Regs16 *InRegs,Regs16 *OutRegs)
{
	Word32 TempMem;
	Word8 *TrueMem;

	TempMem = AllocRealMemory(120);		/* Get real memory */
	if (TempMem) {
		TrueMem = (Word8 *)RealToProtectedPtr(TempMem);
		FastMemCpy(TrueMem,RealCode,sizeof(RealCode));

		((Word16 *)(TrueMem+1))[0] = InRegs->ds;		/* Pass the input registers */
		((Word16 *)(TrueMem+6))[0] = InRegs->es;
		((Word16 *)(TrueMem+11))[0] = InRegs->ax;
		((Word16 *)(TrueMem+14))[0] = InRegs->bx;
		((Word16 *)(TrueMem+17))[0] = InRegs->cx;
		((Word16 *)(TrueMem+20))[0] = InRegs->dx;
		((Word16 *)(TrueMem+23))[0] = InRegs->di;
		((Word16 *)(TrueMem+26))[0] = InRegs->si;
		((Word16 *)(TrueMem+29))[0] = InRegs->bp;
		((Word32 *)(TrueMem+32))[0] = Address;

		((Word16 *)(TrueMem+39))[0] = (Word16)TempMem+100;	/* Set the return data */
		((Word16 *)(TrueMem+44))[0] = (Word16)TempMem+102;
		((Word16 *)(TrueMem+48))[0] = (Word16)TempMem+104;
		((Word16 *)(TrueMem+53))[0] = (Word16)TempMem+106;
		((Word16 *)(TrueMem+58))[0] = (Word16)TempMem+108;
		((Word16 *)(TrueMem+63))[0] = (Word16)TempMem+110;
		((Word16 *)(TrueMem+68))[0] = (Word16)TempMem+112;
		((Word16 *)(TrueMem+73))[0] = (Word16)TempMem+114;
		((Word16 *)(TrueMem+78))[0] = (Word16)TempMem+116;
		((Word16 *)(TrueMem+84))[0] = (Word16)TempMem+118;
		CallMe(TempMem);		/* Call it */

		OutRegs->ds = ((Word16 *)(TrueMem+100))[0];	/* Get the result */
		OutRegs->es = ((Word16 *)(TrueMem+102))[0];
		OutRegs->ax = ((Word16 *)(TrueMem+104))[0];
		OutRegs->bx = ((Word16 *)(TrueMem+106))[0];
		OutRegs->cx = ((Word16 *)(TrueMem+108))[0];
		OutRegs->dx = ((Word16 *)(TrueMem+110))[0];
		OutRegs->di = ((Word16 *)(TrueMem+112))[0];
		OutRegs->si = ((Word16 *)(TrueMem+114))[0];
		OutRegs->bp = ((Word16 *)(TrueMem+116))[0];
		OutRegs->flags = ((Word16 *)(TrueMem+118))[0];
		DeallocRealMemory(TempMem);		/* Release the memory */
		return OutRegs->ax;
	}
	FastMemSet(OutRegs,0,sizeof(Regs16));
	OutRegs->flags = 1;
	return 0;
}
コード例 #3
0
void Burger::Filename::SetFromNative(const char *pInput)
{
	Clear();

	Regs16 Regs;		// Used for DOS calls

	// Parse out the C: (Drive number)
	// Assume no drive is found
	Word uDriveNum = static_cast<Word>(-1);

	// Get the possible drive letter
	WordPtr uInputLength = Burger::StringLength(pInput);
	if (uInputLength>=2) {
		Word uTemp = reinterpret_cast<const Word8*>(pInput)[0];
		uTemp = (uTemp&0xDF)-'A';		// Upper case
		// Could this be a drive letter?
		if ((uTemp<26) && (reinterpret_cast<const Word8*>(pInput)[1]==':')) {
			uDriveNum = uTemp;
			pInput += 2;				// Accept the drive letter
			uInputLength -= 2;			// Shrink the input string
		}
	}
	
	// If not a network name, (//), query MSDOS for the current drive
	
	if (uDriveNum==static_cast<Word>(-1)) {
		if ((uInputLength<2) ||
			(reinterpret_cast<const Word8*>(pInput)[0]!='\\') ||
			(reinterpret_cast<const Word8*>(pInput)[1]!='\\')) {
			// Get the default drive number
			_dos_getdrive(&uDriveNum);
			--uDriveNum;
		} else {
			pInput+=2;
			uInputLength-=2;	// Parse past the volume slashes
		}
	}

	WordPtr uWorkingDirectoryLength = 0;
	const Word8 *pWorkingDirectory = NULL;
	
	// Obtain the current working directory for the current drive
	
	if (uInputLength && (uDriveNum!=static_cast<Word>(-1))) {
		if (reinterpret_cast<const Word8*>(pInput)[0] != '\\') {
			Regs.dx = static_cast<Word16>(uDriveNum+1);	// Requested drive
			Word32 DosBuffer = GetRealBufferPtr();		// Get real memory buffer
			Regs.ds = static_cast<Word16>(DosBuffer>>16U);	// Pass to Dos call
			Regs.si = static_cast<Word16>(DosBuffer&0xFFFFU);
			Regs.ax = 0x7147;				// First try long version
			Int86x(0x21,&Regs,&Regs);		// Call DOS
			if (Regs.flags&1) {				// Carry set??
				Regs.ax = 0x4700;			// Try DOS 2.0 version
				Int86x(0x21,&Regs,&Regs);	// Get the working directory
			}
			// If carry is clear, then one of the preceeding calls succeeded
			if (!(Regs.flags&1)) {
				// Convert to my pointer
				pWorkingDirectory = static_cast<Word8 *>(RealToProtectedPtr(DosBuffer));
				uWorkingDirectoryLength = Burger::StringLength(reinterpret_cast<const char *>(pWorkingDirectory));
			}
		} else {
			--uInputLength;