/* * Copyright (C) 2002-2004 The DOSBox Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* $Id: dos_classes.cpp,v 1.41 2004/08/04 09:12:53 qbix79 Exp $ */ #include #include #include "dosbox.h" #include "mem.h" #include "dos_inc.h" #include "support.h" /* Work in progress, making classes for handling certain internal memory structures in dos This should make it somewhat easier for porting to other endian machines and make dos work a bit easier. */ void DOS_ParamBlock::Clear(void) { memset(&exec,0,sizeof(exec)); memset(&overlay,0,sizeof(overlay)); } void DOS_ParamBlock::LoadData(void) { exec.envseg=sGet(sExec,envseg); exec.cmdtail=sGet(sExec,cmdtail); exec.fcb1=sGet(sExec,fcb1); exec.fcb2=sGet(sExec,fcb2); exec.initsssp=sGet(sExec,initsssp); exec.initcsip=sGet(sExec,initcsip); overlay.loadseg=sGet(sOverlay,loadseg); overlay.relocation=sGet(sOverlay,relocation); } void DOS_ParamBlock::SaveData(void) { sSave(sExec,envseg,exec.envseg); sSave(sExec,cmdtail,exec.cmdtail); sSave(sExec,fcb1,exec.fcb1); sSave(sExec,fcb2,exec.fcb2); sSave(sExec,initsssp,exec.initsssp); sSave(sExec,initcsip,exec.initcsip); } void DOS_InfoBlock::SetLocation(Bit16u segment) { seg = segment; pt=PhysMake(seg,0); /* Clear the initual Block */ for(Bitu i=0;i16mb sSave(sDIB,sharingCount,(Bit16u)0); sSave(sDIB,sharingDelay,(Bit16u)0); sSave(sDIB,nulNextDriver,(Bit32u)0xffffffff); sSave(sDIB,nulAttributes,(Bit16u)0x8004); sSave(sDIB,nulStrategy,(Bit32u)0x00000000); sSave(sDIB,nulString[0],(Bit8u)0x4e); sSave(sDIB,nulString[1],(Bit8u)0x55); sSave(sDIB,nulString[2],(Bit8u)0x4c); sSave(sDIB,nulString[3],(Bit8u)0x20); sSave(sDIB,nulString[4],(Bit8u)0x20); sSave(sDIB,nulString[5],(Bit8u)0x20); sSave(sDIB,nulString[6],(Bit8u)0x20); sSave(sDIB,nulString[7],(Bit8u)0x20); } void DOS_InfoBlock::SetFirstMCB(Bit16u _firstmcb) { sSave(sDIB,firstMCB,_firstmcb); //c2woody } void DOS_InfoBlock::SetfirstFileTable(RealPt _first_table){ sSave(sDIB,firstFileTable,_first_table); } void DOS_InfoBlock::SetBuffers(Bit16u x,Bit16u y) { sSave(sDIB,buffers_x,x); sSave(sDIB,buffers_y,y); } void DOS_InfoBlock::SetCurDirStruct(Bit32u _curdirstruct) { sSave(sDIB,curDirStructure,_curdirstruct); } void DOS_InfoBlock::SetFCBTable(Bit32u _fcbtable) { sSave(sDIB,fcbTable,_fcbtable); } void DOS_InfoBlock::SetDeviceChainStart(Bit32u _devchain) { sSave(sDIB,nulNextDriver,_devchain); } void DOS_InfoBlock::SetDiskInfoBuffer(Bit32u _dinfobuf) { sSave(sDIB,diskInfoBuffer,_dinfobuf); } RealPt DOS_InfoBlock::GetPointer(void) { return RealMake(seg,offsetof(sDIB,firstDPB)); } /* program Segment prefix */ Bit16u DOS_PSP::rootpsp = 0; void DOS_PSP::MakeNew(Bit16u mem_size) { /* get previous */ DOS_PSP prevpsp(dos.psp()); /* Clear it first */ Bitu i; for (i=0;i=sGet(sPSP,max_files)) return 0xff; PhysPt files=Real2Phys(sGet(sPSP,file_table)); return mem_readb(files+index); }; void DOS_PSP::SetFileHandle(Bit16u index, Bit8u handle) { if (indexGetFileHandle(i); if(createchildpsp) { //copy obeying not inherit flag.(but dont duplicate them) bool allowCopy = (handle==0) || ((handle>0) && (FindEntryByHandle(handle)==0xff)); if((handleflags & DOS_NOT_INHERIT) && allowCopy) { Files[handle]->AddRef(); SetFileHandle(i,handle); } else { SetFileHandle(i,0xff); } } else { //normal copy so don't mind the inheritance SetFileHandle(i,handle); } } }; void DOS_PSP::CloseFiles(void) { for (Bit16u i=0;i20) { // Allocate needed paragraphs fileNum+=2; // Add a few more files for safety Bit16u para = (fileNum/16)+((fileNum%16)>0); RealPt data = RealMake(DOS_GetMemory(para),0); sSave(sPSP,file_table,data); sSave(sPSP,max_files,fileNum); Bit16u i; for (i=0; i<20; i++) SetFileHandle(i,sGet(sPSP,files[i])); for (i=20; i8) size=8; MEM_BlockWrite(pt+offsetof(sDTA,sname),pattern,size); find_ext++; MEM_BlockWrite(pt+offsetof(sDTA,sext),find_ext,(strlen(find_ext)>3) ? 3 : strlen(find_ext)); } else { MEM_BlockWrite(pt+offsetof(sDTA,sname),pattern,(strlen(pattern) > 8) ? 8 : strlen(pattern)); } } void DOS_DTA::SetResult(const char * _name,Bit32u _size,Bit16u _date,Bit16u _time,Bit8u _attr) { MEM_BlockWrite(pt+offsetof(sDTA,name),(void *)_name,DOS_NAMELENGTH_ASCII); sSave(sDTA,size,_size); sSave(sDTA,date,_date); sSave(sDTA,time,_time); sSave(sDTA,attr,_attr); } void DOS_DTA::GetResult(char * _name,Bit32u & _size,Bit16u & _date,Bit16u & _time,Bit8u & _attr) { MEM_BlockRead(pt+offsetof(sDTA,name),_name,DOS_NAMELENGTH_ASCII); _size=sGet(sDTA,size); _date=sGet(sDTA,date); _time=sGet(sDTA,time); _attr=sGet(sDTA,attr); } Bit8u DOS_DTA::GetSearchDrive(void) { return sGet(sDTA,sdrive); } void DOS_DTA::GetSearchParams(Bit8u & attr,char * pattern) { attr=sGet(sDTA,sattr); char temp[11]; MEM_BlockRead(pt+offsetof(sDTA,sname),temp,11); memcpy(pattern,temp,8); pattern[8]='.'; memcpy(&pattern[9],&temp[8],3); pattern[12]=0; } DOS_FCB::DOS_FCB(Bit16u seg,Bit16u off) { SetPt(seg,off); real_pt=pt; if (sGet(sFCB,drive)==0xff) { pt+=7; extended=true; } else extended=false; } bool DOS_FCB::Extended(void) { return extended; } void DOS_FCB::Create(bool _extended) { Bitu fill; if (_extended) fill=36+7; else fill=36; Bitu i; for (i=0;isize); sSave(sFCB,time,Files[temp]->time); sSave(sFCB,date,Files[temp]->date); } void DOS_FCB::FileClose(Bit8u & _fhandle) { _fhandle=sGet(sFCB,file_handle); sSave(sFCB,file_handle,0xff); } Bit8u DOS_FCB::GetDrive(void) { Bit8u drive=sGet(sFCB,drive); if (!drive) return dos.current_drive; else return drive-1; } void DOS_FCB::GetName(char * fillname) { fillname[0]=GetDrive()+'A'; fillname[1]=':'; MEM_BlockRead(pt+offsetof(sFCB,filename),&fillname[2],8); fillname[10]='.'; MEM_BlockRead(pt+offsetof(sFCB,ext),&fillname[11],3); fillname[14]=0; } void DOS_FCB::GetAttr(Bit8u& attr) { if(extended) attr=mem_readb(pt - 1); } void DOS_FCB::SetAttr(Bit8u attr) { if(extended) mem_writeb(pt - 1,attr); } void DOS_SDA::Init() { /* Clear */ for(Bitu i=0;i