aboutsummaryrefslogblamecommitdiffstats
path: root/sysvar.cpp
blob: a8fcc394f61c40ae0fa4a3431e368934addfa08d (plain) (tree)
























































































































































                                                                             
// 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
Un proyecto texto-plano.xyz