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! */ }
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; }
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;