// sysvar.cpp // Revision 6-feb-2005 #include "sysvar.h" #include "charset.h" #include "trace.h" // For debugging. #include namespace { BlChar system_vars [blassic::sysvar::EndSysVar]; } // namespace size_t blassic::sysvar::address () { return reinterpret_cast (system_vars); } void blassic::sysvar::set (size_t var, BlChar value) { system_vars [var]= value; } void blassic::sysvar::set16 (size_t var, short value) { poke16 (system_vars + var, value); } void blassic::sysvar::set32 (size_t var, BlInteger value) { poke32 (system_vars + var, value); } BlChar blassic::sysvar::get (size_t var) { return system_vars [var]; } unsigned short blassic::sysvar::get16 (size_t var) { return static_cast (peek16 (system_vars + var) ); } unsigned long blassic::sysvar::get32 (size_t var) { return peek32 (system_vars + var); } // Flags operations. blassic::sysvar::Flags1Bit blassic::sysvar::getFlags1 () { return static_cast (system_vars [Flags1] ); } blassic::sysvar::Flags2Bit blassic::sysvar::getFlags2 () { return static_cast (system_vars [Flags2] ); } bool blassic::sysvar::hasFlags1 (Flags1Bit f) { //return (getFlags1 () & f) != Flags1Clean; return getFlags1 ().has (f); } bool blassic::sysvar::hasFlags2 (Flags2Bit f) { //return (getFlags2 () & f) != Flags2Clean; return getFlags2 ().has (f); } void blassic::sysvar::setFlags1 (Flags1Bit f) { BlChar * const pflag= system_vars + Flags1; *pflag|= f.get (); } void blassic::sysvar::setFlags2 (Flags2Bit f) { BlChar * const pflag= system_vars + Flags2; *pflag|= f.get (); } // Initialization void blassic::sysvar::init () { TRACEFUNC (tr, "blassic::sysvar::init"); #ifndef NDEBUG { std::ostringstream oss; oss << "System vars address: " << static_cast (system_vars); TRMESSAGE (tr, oss.str () ); } #endif set16 (GraphicsWidth, 0); set16 (GraphicsHeight, 0); set16 (NumArgs, 0); set16 (VersionMajor, version::Major); set16 (VersionMinor, version::Minor); set16 (VersionRelease, version::Release); set32 (AutoInit, 10); set32 (AutoInc, 10); set32 (CharGen, reinterpret_cast (& charset::data) ); set (ShellResult, 0); set (TypeOfVal, 0); // VAL simple, number only. set (TypeOfNextCheck, 0); // Strict next check set (TypeOfDimCheck, 0); // Need erase before dim already dimensioned set16 (MaxHistory, 100); setFlags1 (Flags1Clean); // Bit 0: LOCATE style Microsoft (row, col), // Bit 1: TAB style normal. // Bit 2: THEN omitted not accepted. // Bit 3: Without space before number in PRINT. // Bit 4: Without initial space in STR$. // Bit 5: Without convert LF to CR. // Bit 6: Do not show debug info. // Bit 7: Strict GOTO mode. #ifdef BLASSIC_USE_WINDOWS const BlChar defaultprinterline= 1; #else const BlChar defaultprinterline= 0; #endif set (PrinterLine, defaultprinterline); // Changed this, the processor stack overflows easily // in windows, at least in W98 with C++ Builder. //set32 (MaxFnLevel, 1000); // Seems a good limit. set32 (MaxFnLevel, 50); set16 (DebugLevel, 0); set16 (Zone, 8); set (GraphRotate, 0); setFlags2 (Flags2Clean); // Bit 0: GOTO and GOSUB listed as one word. // Bit 1: true is -1 // Bit 2: logical ops are binary // Bit 3: blank lines as comments. set16 (TronChannel, 0); set (TronFlags, 0); } // Fin de sysvar.cpp