' PropBasic Library to support Viewport Terminal ' ' For Viewport 4.6.7 or later ' For PropBasic 1.27 or later 'Control Character Constants '------------------------------------- VP_CS CON 16 ''CS: Clear Screen VP_CE CON 11 ''CE: Clear to End of line VP_CB CON 12 ''CB: Clear lines Below VP_HM CON 1 ''HM: HoMe cursor VP_PC CON 2 ''PC: Position Cursor in x,y VP_PX CON 14 ''PX: Position cursor in X VP_PY CON 15 ''PY: Position cursor in Y VP_NL CON 13 ''NL: New Line VP_LF CON 10 ''LF: Line Feed VP_ML CON 3 ''ML: Move cursor Left VP_MR CON 4 ''MR: Move cursor Right VP_MU CON 5 ''MU: Move cursor Up VP_MD CON 6 ''MD: Move cursor Down VP_TB CON 9 ''TB: TaB VP_BS CON 8 ''BS: BackSpace VP_BP CON 7 ''BP: BeeP speaker __ascii HUB STRING(12) ' Holds decimal string VP_Char SUB 1 ' char VP_Str SUB 1 ' string VP_Dec SUB 1,2 ' value {,digits} VP_Hex SUB 2 ' value, digits VP_Bin SUB 2 ' value, digits VP_RxAvailable FUNC 0 ' returns # of characters in buffer VP_CharIn FUNC 0 ' returns char VP_CharInTime FUNC 1 ' returns char; mSec (returns char or -1 if timeout) VP_StrIn FUNC 1 ' string (returns length of string) VP_StrInTime FUNC 1 ' string (returns length of string) VP_RxFlush SUB 0 ' Flush receive buffer VP_Clear SUB 0 ' Clear screen VP_ClearEnd SUB 0 ' Clear line from cursor to end of line VP_ClearBelow SUB 0 ' Clear all lines below cursor VP_Home SUB 0 ' Send cursor to home position (top-left) VP_Position SUB 2 ' x, y Position cursor at column x, row y (from top-left) VP_PositionX SUB 1 ' x Position cursor at column x of current row VP_PositionY SUB 1 ' y Position cursor at row y of current column VP_NewLine SUB 0 ' Send cursor to new line (carriage return plus line feed) VP_LineFeed SUB 0 ' Send cursor down to next line VP_MoveLeft SUB 1 ' x Move cursor left x characters VP_MoveRight SUB 1 ' x Move cursor right x characters VP_MoveUp SUB 1 ' y Move cursor up y lines VP_MoveDown SUB 1 ' y Move cursor down y lines VP_Tab SUB 0 ' Send cursor to next tab position VP_Backspace SUB 0 ' Delete one character to left of cursor and move cursor there VP_Beep SUB 0 ' Play bell tone on PC speaker VP_Space SUB 0 ' Displays a space '{$CODE} '{$IFUSED VP_Dec} SUB VP_Dec ' value{, digits} IF __paramCnt = 1 THEN __param2 = 0 ELSE __param2 = 11 - __param2 ENDIF __ascii = STR __param1,11,3 __param1 = Getaddr __ascii __param2 = __param2 + __param1 ' __param2 = address of first char to print RDBYTE __param2, __param1 IF __paramCnt = 2 THEN ' Check if first char is a space, if it is, replace it with the first char in the string (minus sign for negative numbers) IF __param1 = " " THEN RDBYTE __ascii, __param1 WRBYTE __param2, __param1 ENDIF ELSE ' Skip spaces DO INC __param2 RDBYTE __param2, __param3 LOOP UNTIL __param3 <> " " ' Include "-" IF __param1 = "-" THEN DEC __param2 WRBYTE __param2, "-" ENDIF ENDIF VP_Str __param2 ENDSUB '{$ENDIF} '{$IFUSED VP_Hex} SUB VP_Hex ' value, digits __param4 = 8 - __param2 __param4 = __param4 * 4 __param3 = __param1 << __param4 __param4 = __param2 DO __param1 = __param3 >> 28 INC __param1, "0" IF __param1 > "9" THEN INC __param1, 7 ENDIF VP_Char __param1 __param3 = __param3 << 4 LOOP __param4 ENDSUB '{$ENDIF} '{$IFUSED VP_Bin} SUB VP_Bin ' value, digits __param4 = 32 - __param2 __param3 = __param1 << __param4 __param4 = __param2 DO __param1 = __param3 >> 31 INC __param1, "0" VP_Char __param1 __param3 = __param3 << 1 LOOP __param4 ENDSUB '{$ENDIF} '{$IFUSED VP_Str} SUB VP_Str __param4 = __param1 DO RDBYTE __param4, __param1 IF __param1 = 0 THEN EXIT VP_Char __param1 ' Uses __param1 and __param2 INC __param4 LOOP ENDSUB '{$ENDIF} '{$IFUSED VP_CharInTime} FUNC VP_CharInTime PAUSE 0 ' Make sure _1mSec is created __param3 = __param1 * _1mSec __param4 = cnt DO __param1 = VP_RxAvailable ' RxAvailable uses __param1 & __param2 __param2 = cnt - __param4 IF __param2 > __param3 THEN EXIT LOOP UNTIL __param1 > 0 IF __param1 = 0 THEN __param1 -1 ELSE __param1 = VP_CharIn ENDIF RETURN __param1 ENDFUNC '{$ENDIF} '{$IFUSED VP_StrIn} FUNC VP_StrIn __param4 = __param1 ' Save string address __paramCnt = 0 ' String length DO __param1 = VP_CharIn ' Get character IF __param1 = VP_NL THEN WRBYTE __param4, 0 ' Store a zero as string terminator ELSE IF __param1 = VP_BS THEN IF __paramCnt > 0 THEN DEC __param4 DEC __paramCnt ENDIF ELSE WRBYTE __param4, __param1 ' Save character in string INC __param4 ' Adjust string address INC __paramCnt ' Adjust string length ENDIF ENDIF LOOP UNTIL __param1 = VP_NL RETURN __paramCnt ENDFUNC '{$ENDIF} '{$IFUSED VP_RxFlush} SUB VP_RxFlush DO __param3 = VP_RxAvailable IF __param3 <> 0 THEN VP_CharIn ENDIF LOOP UNTIL __param3 == 0 ENDSUB '{$ENDIF} '{$IFUSED VP_CharIn} FUNC VP_CharIn ' __param2 = dequeue value __param2 = __txtermAdr + 4 ' Get dequeue address RDWORD __param2, __param2 ' Wait for character DO ' __param3 = enqueue value __param3 = __txtermAdr + 2 ' Get enqueue address RDWORD __param3, __param3 LOOP WHILE __param2 = __param3 ' Get character from buffer __param1 = __txtermAdr + 6 ' Get buffer address INC __param1, __param2 RDBYTE __param1, __param1 ' Adjust dequeue value INC __param2 __param2 = __param2 AND 31 __param3 = __txtermAdr + 4 ' Get dequeue address WRWORD __param3, __param2 RETURN __param1 ENDFUNC '{$ENDIF} '{$IFUSED VP_RxAvailable} FUNC VP_RxAvailable ' __param2 = dequeue value __param2 = __txtermAdr + 4 ' Get dequeue address RDWORD __param2, __param2 ' __param1 = enqueue value __param1 = __txtermAdr + 2 ' Get enqueue address RDWORD __param1, __param1 __param1 = __param1 - __param2 IF __param1 < 0 THEN INC __param1, 32 ENDIF RETURN __param1 ENDFUNC '{$ENDIF} '{$IFUSED VP_Clear} SUB VP_Clear VP_Char VP_CS ENDSUB '{$ENDIF} '{$IFUSED VP_ClearEnd} SUB VP_ClearEnd VP_Char VP_CE ENDSUB '{$ENDIF} '{$IFUSED VP_ClearBelow} SUB VP_ClearBelow VP_Char VP_CB ENDSUB '{$ENDIF} '{$IFUSED VP_Home} SUB VP_Home VP_Char VP_HM ENDSUB '{$ENDIF} '{$IFUSED VP_Position} SUB VP_Position __param3 = __param1 __param4 = __param2 VP_Char VP_PC VP_Char __param3 VP_Char __param4 ENDSUB '{$ENDIF} '{$IFUSED VP_PositionX} SUB VP_PositionX __param3 = __param1 VP_Char VP_PX VP_Char __param3 ENDSUB '{$ENDIF} '{$IFUSED VP_PositionY} SUB VP_PositionY __param3 = __param1 VP_Char VP_PY VP_Char __param3 ENDSUB '{$ENDIF} '{$IFUSED VP_NewLine} SUB VP_NewLine VP_Char VP_NL ENDSUB '{$ENDIF} '{$IFUSED VP_LineFeed} SUB VP_LineFeed VP_Char VP_LF ENDSUB '{$ENDIF} '{$IFUSED VP_MoveLeft} SUB VP_MoveLeft __param3 = __param1 DO VP_Char VP_ML LOOP __param3 ENDSUB '{$ENDIF} '{$IFUSED VP_MoveRight} SUB VP_MoveRight __param3 = __param1 DO VP_Char VP_MR LOOP __param3 ENDSUB '{$ENDIF} '{$IFUSED VP_MoveUp} SUB VP_MoveUp __param3 = __param1 DO VP_Char VP_MU LOOP __param3 ENDSUB '{$ENDIF} '{$IFUSED VP_MoveDown} SUB VP_MoveDown __param3 = __param1 DO VP_Char VP_MD LOOP __param3 ENDSUB '{$ENDIF} '{$IFUSED VP_Tab} SUB VP_Tab VP_Char VP_TB ENDSUB '{$ENDIF} '{$IFUSED VP_BackSpace} SUB VP_Backspace VP_Char VP_BS ENDSUB '{$ENDIF} '{$IFUSED VP_Beep} SUB VP_Beep VP_Char VP_BP ENDSUB '{$ENDIF} '{$IFUSED VP_Space} SUB VP_Space VP_Char " " ENDSUB '{$ENDIF} '{$IFUSED VP_Char} SUB VP_Char DO RDWORD __txtermAdr, __param2 LOOP UNTIL __param2 = 0 __param1 = __param1 << 8 __param1 = __param1 + $A5 WRWORD __txtermAdr, __param1 ENDSUB '{$ENDIF}