| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- #ifndef VDOS_MEM_H
- #define VDOS_MEM_H
- #ifndef VDOS_H
- #include "vDos.h"
- #endif
- typedef Bit32u PhysPt;
- typedef Bit32u LinPt;
- typedef Bit8u * HostPt;
- typedef Bit32u RealPt;
- #define MEM_PAGESIZE (16*1024) // Set to 16KB page size of EMS
- #define MEM_PAGES (4096) // Number of pages for max 64MB
- extern HostPt MemBase;
- extern unsigned int TotMemBytes;
- extern unsigned int TotMemMB;
- extern unsigned int TotEXTMB;
- extern unsigned int TotXMSMB;
- extern unsigned int TotEMSMB;
- extern unsigned int EndConvMem;
- // These functions address memory directly (no paging or address checking is needed)
- Bit8u Mem_aLodsb(PhysPt pt);
- Bit16u Mem_aLodsw(PhysPt addr);
- Bit32u Mem_aLodsd(PhysPt addr);
- // These functions recognize the paged memory system
- Bit8u Mem_Lodsb(LinPt pt);
- Bit16u Mem_Lodsw(LinPt pt);
- Bit32u Mem_Lodsd(LinPt pt);
- void Mem_Stosb(LinPt pt, Bit8u val);
- void Mem_Stosw(LinPt pt, Bit16u val);
- void Mem_Stosd(LinPt pt, Bit32u val);
- void Mem_rStosb(LinPt address, Bit8u val, Bitu count);
- void Mem_rStos4b(LinPt address, Bit32u val, Bitu count);
- void clearTLB();
- inline void Mem_rStosw(LinPt addr, Bit16u val, Bitu count)
- {
- Mem_rStos4b(addr, val + (val<<16), count*2);
- }
- inline void Mem_rStosd(LinPt addr, Bit32u val, Bitu count)
- {
- Mem_rStos4b(addr, val, count*4);
- }
- static void Mem_aStosb(PhysPt addr, Bit8u val)
- {
- *(Bit8u *)(MemBase+addr) = val;
- }
- static void Mem_aStosw(PhysPt addr, Bit16u val)
- {
- *(Bit16u *)(MemBase+addr) = val;
- }
- static void Mem_aStosd(PhysPt addr, Bit32u val)
- {
- *(Bit32u *)(MemBase+addr) = val;
- }
- static void Mem_aWrites(PhysPt addr, const char* string, Bitu length)
- {
- memcpy(MemBase+addr, string, length);
- }
- void Mem_rMovsb(LinPt dest, LinPt src, Bitu bSize);
- void Mem_CopyTo(LinPt pt, void const * const data, Bitu size);
- void Mem_CopyFrom(PhysPt pt, void * data, Bitu size);
- void Mem_StrnCopyFrom(char * data, PhysPt pt, Bitu size);
- Bitu Mem_StrLen(LinPt pt);
- // The folowing functions are all shortcuts to the above functions using physical addressing
- static void Mem_Stosw(Bit16u seg, Bit16u off, Bit16u val)
- {
- Mem_Stosw(((seg<<4)+off), val);
- }
- static void Mem_Stosd(Bit16u seg, Bit16u off, Bit32u val)
- {
- Mem_Stosd(((seg<<4)+off), val);
- }
- static Bit16u RealSeg(RealPt pt)
- {
- return (Bit16u)(pt>>16);
- }
- static Bit16u RealOff(RealPt pt)
- {
- return (Bit16u)(pt&0xffff);
- }
- static PhysPt dWord2Ptr(RealPt pt)
- {
- return (RealSeg(pt)<<4)+RealOff(pt);
- }
- static PhysPt SegOff2Ptr(Bit16u seg, Bit16u off)
- {
- return (seg<<4)+off;
- }
- static RealPt SegOff2dWord(Bit16u seg, Bit16u off)
- {
- return (seg<<16)+off;
- }
- static void RealSetVec(Bit8u vec, RealPt pt)
- {
- Mem_aStosd(vec<<2, pt);
- }
- static RealPt RealGetVec(Bit8u vec)
- {
- return Mem_aLodsd(vec<<2);
- }
- #endif
|