TIP: Click on subject to list as thread! ANSI
echo: quik_bas
to: All
from: Hans Andersson
date: 2003-06-07 17:37:02
subject: FSM

DECLARE SUB SerialInput (k$)
REM About: FSM (Finite State Machine) for decoding ansi where xy response
REM Author: The Stark Raving Mad Hat Renegade Programmer El (Bozo) Loco
REM Date: 2003, Juni 07
REM Language: MS Basic
REM Platform: Any
REM Version: Beta
REM Legal stuff: Freeware
REM Note: Port to C
REM Purpose: A perfect waste of time
 
DECLARE FUNCTION AnsiWhereXY% (x%, y%)
 
DIM SHARED MxRESPONSE$
MxRESPONSE$ = CHR$(27) + "[11;41R"
 
REM SIMPLE TEST
result = AnsiWhereXY(x%, y%)
PRINT "----------"
PRINT "Result="; result; ", X="; x%; ", Y"; y%
 
DEFINT A-Z
FUNCTION AnsiWhereXY% (x%, y%)
DIM value AS INTEGER
DIM state AS INTEGER
DIM timeout AS SINGLE
 
x% = 0
y% = 0
 
timeout = TIMER + .8
DO
   CALL SerialInput(k$)
   IF LEN(k$) THEN
      value = ASC(k$)
    ELSE
      value = 0
    END IF
   
    SELECT CASE value
       CASE 27
            IF state = 0 THEN
               state = 1
            ELSEIF state THEN
               EXIT DO
            END IF
       CASE 91
            IF state = 1 THEN
               state = 2
            ELSEIF state THEN
               EXIT DO
            END IF
       CASE 48 TO 57 'ASC("0") TO ASC("9")
            IF state = 2 THEN
               state = 3
               y% = VAL(CHR$(value))
            ELSEIF state = 3 THEN
               'Note: no illegal overflow
               IF y% < 1000 THEN y% = (y% * 10) + VAL(CHR$(value))
            ELSEIF state = 4 THEN
               state = 5
               x% = VAL(CHR$(value))
            ELSEIF state = 5 THEN
               IF x% < 1000 THEN x% = (x% * 10) + VAL(CHR$(value))
            ELSEIF state THEN
               EXIT DO
            END IF
       CASE 59 'ASC(";"):
            IF state = 3 THEN
               state = 4
             ELSEIF state THEN
                EXIT DO
             END IF
       CASE 82 'ASC("R")
            AnsiWhereXY% = (state = 5)
            EXIT DO
       CASE ELSE: IF value AND state THEN EXIT DO
    END SELECT
 
LOOP UNTIL TIMER > timeout
 
END FUNCTION
 
SUB SerialInput (k$)
'simulated remote connection with transmission delay
STATIC n
 
n = n + 1
IF n <= LEN(MxRESPONSE$) THEN
   k$ = MID$(MxRESPONSE$, n, 1)
   t! = TIMER + .2
   DO
   LOOP UNTIL TIMER > t!
ELSE
   k$ = ""
END IF
 
END SUB
 


--- Maximus/2 3.01
* Origin: TankBaren, +46-8-4467316 (2:201/209)
SEEN-BY: 633/267 270
@PATH: 201/505 106/2000 633/267

SOURCE: echomail via fidonet.ozzmosis.com

Email questions or comments to sysop@ipingthereforeiam.com
All parts of this website painstakingly hand-crafted in the U.S.A.!
IPTIA BBS/MUD/Terminal/Game Server List, © 2025 IPTIA Consulting™.