#ifndef Mmemory_included
#define Mmemory_included

#ifndef HEX
#define HEX "%08lx"
#endif

#include <iostream.h>
#include <iomanip.h>
#include <istream.h>

#ifndef MBASEFLAG
#define MBASEFLAG ( ios::showbase | ios::internal)
#endif
#ifndef MHEX
#define MHEX setfill('0') << setw( 10 ) << hex 
#endif
#ifndef TBASEFLAG
#define TBASEFLAG (ios::internal)
#endif
#ifndef THEX
#define THEX setfill('0') << setw( 8 ) << hex 
#endif

#define M_MapTableLine(segment_number, vbase, vlimit, \
                       protections, basep, size) \
 setiosflags( TBASEFLAG ) << \
 "[" << dec << segment_number << "] " << \
 "vbase=" << THEX << vbase << ' ' << \
 "vlimit=" << THEX << vlimit << ' ' << \
 "prot=" << protections << ' ' << \
 "(basep=" << \
  THEX << reinterpret_cast<long unsigned int>( basep ) << ' ' << \
 "size=" << THEX << size << \
 ")" << endl << \
 dec

#define M_Map_paddr( paddr ) setiosflags( MBASEFLAG ) << \
 "paddr=" << MHEX << reinterpret_cast<long unsigned int>(paddr) << endl << \
 dec

#define M_Map_SegError "segmentation error" << endl
#define M_Map_AccessError "access error" << endl
#define M_Map_AlignError "alignment error" << endl
#define M_Map_OverlapError(segno) "Overlap with segment " << segno << endl
#define M_Map_PageSize(pagesize) \
 setiosflags( ios::showbase ) << hex << pagesize << endl;

// The following message formats are not specified for use in
// the Spring 1999 version of the MIPS simulator.
// Reserved for future use.

#define M_IFAlignment(vaddr) setiosflags(MBASEFLAG) << \
"Instruction Fetch vaddr " << MHEX << (vaddr) << " not aligned." << endl << \
 dec

#define C_M_IFAlignment \
"Instruction Fetch vaddr "HEX" not aligned.\n"

#define M_DFAlignment(vaddr) setiosflags(MBASEFLAG) << \
"Data Fetch vaddr " << MHEX << (vaddr) << " not aligned." << endl << \
 dec

#define C_M_DFAlignment \
"Data Fetch vaddr "HEX" not aligned.\n"

#define M_DSAlignment(vaddr) setiosflags(MBASEFLAG) << \
"Data Store vaddr " << MHEX << (vaddr) << " not aligned." << endl << \
 dec

#define C_M_DSAlignment \
"Data Store vaddr "HEX" not aligned.\n"

#define M_Segment(vaddr) setiosflags(MBASEFLAG) << \
"Vaddr " << MHEX << (vaddr) << " is not in any segment." << endl << \
 dec

#define C_M_Segment \
"Vaddr "HEX" is not in any segment.\n"

#define M_ReadProtection(vaddr) setiosflags(MBASEFLAG) << \
"Vaddr " << MHEX << (vaddr) << " Read not permitted" << endl << \
 dec

#define C_M_ReadProtection \
"Vaddr "HEX" Read not permitted.\n"

#define M_WriteProtection(vaddr) setiosflags(MBASEFLAG) << \
"Vaddr " << MHEX << (vaddr) << " Write not permitted" << endl << \
 dec

#define C_M_WriteProtection \
"Vaddr "HEX" Write not permitted.\n"

#define M_ExeProtection(vaddr) setiosflags(MBASEFLAG) << \
"Vaddr " << MHEX << (vaddr) << " Instruction Fetch not permitted" << endl << \
 dec

#define C_M_ExeProtection \
"Vaddr "HEX" Instruction Fetch not permitted.\n"

#endif

