diff options
Diffstat (limited to 'sysvar.cpp')
-rw-r--r-- | sysvar.cpp | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/sysvar.cpp b/sysvar.cpp new file mode 100644 index 0000000..a8fcc39 --- /dev/null +++ b/sysvar.cpp @@ -0,0 +1,153 @@ +// sysvar.cpp +// Revision 6-feb-2005 + +#include "sysvar.h" + +#include "charset.h" +#include "trace.h" + +// For debugging. +#include <sstream> + + +namespace { + +BlChar system_vars [blassic::sysvar::EndSysVar]; + +} // namespace + + +size_t blassic::sysvar::address () +{ + return reinterpret_cast <size_t> (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 <unsigned short> (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 <Flags1Bit> (system_vars [Flags1] ); +} + +blassic::sysvar::Flags2Bit blassic::sysvar::getFlags2 () +{ + return static_cast <Flags2Bit> (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 <void *> (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 <size_t> (& 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 |