(******************************************************************************) (* TopSpeed compatible general library (maybe not 100%) *) (* (C) 2009 Steffen Solyga *) (******************************************************************************) IMPLEMENTATION MODULE Lib; IMPORT Arguments, Str; FROM SYSTEM IMPORT BYTE, ADDRESS, ADR; VAR argCnt: SHORTCARD; (* all args (not only real ones) *) argTbl: Arguments.ArgTable; PROCEDURE ParamStr( VAR str: ARRAY OF CHAR; idx: CARDINAL ); BEGIN IF idx < argCnt THEN Str.Copy( str, argTbl^[idx]^ ); ELSE str[ 0 ] := 0C; END; END ParamStr; PROCEDURE ParamCount(): CARDINAL; VAR cnt: CARDINAL; BEGIN cnt := argCnt; IF cnt > 0 THEN DEC( cnt ) END; RETURN cnt; END ParamCount; PROCEDURE Move( src, dst: ADDRESS; n: CARDINAL ); TYPE TPtr = POINTER TO TArr; TArr = ARRAY [ 0 .. 1 ] OF BYTE; VAR s, d: TPtr; BEGIN s := src; d := dst; WHILE n > 0 DO d^[0] := s^[0]; s := ADR( s^[1] ); d := ADR( d^[1] ); DEC( n ); END; END Move; PROCEDURE Fill( a: ADDRESS; n: CARDINAL; v: BYTE ); TYPE TPtr = POINTER TO TArr; TArr = ARRAY [ 0 .. 1 ] OF BYTE; VAR p: TPtr; BEGIN p := a; WHILE n > 0 DO p^[0] := v; p := ADR( p^[1] ); DEC( n ); END; END Fill; PROCEDURE Compare( s, d: ADDRESS; n: CARDINAL ): CARDINAL; TYPE TPtr = POINTER TO TArr; TArr = ARRAY [ 0 .. 1 ] OF BYTE; VAR ps,pd: TPtr; i: CARDINAL; BEGIN ps := s; pd := d; i := 0; WHILE i < n DO IF ps^[0] # pd^[0] THEN RETURN i END; ps := ADR( ps^[1] ); pd := ADR( pd^[1] ); INC( i ); END; RETURN i; END Compare; PROCEDURE SetReturnCode( c: SHORTCARD ); BEGIN (* Where does mocka's HALT take the exit value? *) END SetReturnCode; BEGIN Arguments.GetArgs( argCnt, argTbl ); END Lib.