(******************************************************************************) (* computer basics *) (* (C) 2010 Steffen Solyga *) (******************************************************************************) IMPLEMENTATION MODULE Comp0; FROM SYSTEM IMPORT ADR; IMPORT SysLib; IMPORT Str, FIO; CONST err = FIO.ErrorOutput; VAR ptcs: POINTER TO TCmdStr; ok: BOOLEAN; PROCEDURE Bug( s: ARRAY OF CHAR; x: CARDINAL ); BEGIN FIO.WrStr( err, 'Comp0.Bug: Unknown ' ); FIO.WrStr( err, s ); FIO.WrChar( err, ' ' ); FIO.WrCard( err, x, 0 ); FIO.WrChar( err, '.' ); FIO.WrLn( err ); SysLib.exit( -1 ); END Bug; PROCEDURE Init( VAR s: TCmdStr ); BEGIN s := ''; ptcs := ADR( s ); END Init; PROCEDURE WrStr( s: ARRAY OF CHAR ); BEGIN Str.Append( ptcs^, s ); END WrStr; PROCEDURE WrVal( v: TValue ); VAR s: TCmdStr; BEGIN Str.IntToStr( v, s, 10, ok ); IF ok THEN WrStr( s ) ELSE WrStr( '???' ) END; END WrVal; PROCEDURE WrIdx( i: TValue ); VAR s: TCmdStr; BEGIN Str.CardToStr( i, s, 10, ok ); IF ok THEN WrStr( s ) ELSE WrStr( '???' ) END; END WrIdx; PROCEDURE WrAdr( a: TAddress ); VAR s: TCmdStr; BEGIN IF a = aNone THEN WrStr( '' ) ELSE Str.CardToStr( a, s, 10, ok ); IF ok THEN WrStr( s ) ELSE WrStr( '???' ) END; END; END WrAdr; PROCEDURE WrOpr( o: TOperation ); BEGIN CASE o OF | oWrt : WrStr( 'Wrt' ); | oWrC : WrStr( 'WrC' ); | oNeg : WrStr( 'Neg' ); | oAdd : WrStr( 'Add' ); | oSub : WrStr( 'Sub' ); | oMul : WrStr( 'Mul' ); | oDiv : WrStr( 'Div' ); | oBus : WrStr( 'Bus' ); | oVid : WrStr( 'Vid' ); | oEql : WrStr( 'Eql' ); | oNeq : WrStr( 'Neq' ); | oLss : WrStr( 'Lss' ); | oLeq : WrStr( 'Leq' ); | oGtr : WrStr( 'Gtr' ); | oGeq : WrStr( 'Geq' ); | oNot : WrStr( 'Not' ); | oOr : WrStr( 'Or ' ); | oAnd : WrStr( 'And' ); ELSE Bug( 'operation', ORD(o) ); END; END WrOpr; PROCEDURE Convert( cmd: TCmdDesc; VAR str: TCmdStr ); BEGIN Init( str ); CASE cmd.fct OF | fHlt: WrStr( 'Hlt' ); | fVal: WrStr( 'Val ' ); WrVal( cmd.val ); | fLod: WrStr( 'Lod ' ); WrIdx( cmd.idx ); | fSto: WrStr( 'Sto ' ); WrIdx( cmd.idx ); | fOpr: WrOpr( cmd.opr ); | fJmp: WrStr( 'Jmp ' ); WrAdr( cmd.adr ); | fJpf: WrStr( 'Jpf ' ); WrAdr( cmd.adr ); | fJpt: WrStr( 'Jpt ' ); WrAdr( cmd.adr ); ELSE Bug( 'function', ORD(cmd.fct) ); END; END Convert; END Comp0.