TIP: Click on subject to list as thread! ANSI
echo: quik_bas
to: All
from: Hans Andersson
date: 2003-06-09 19:43:32
subject: FSM...

REM Note: Removed redundant states and VAL(STR$(x)) and added more
REM       extensive testing!
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 08
REM Language: MS Basic
REM Platform:
REM Version: Beta 2
REM Legal stuff: Freeware
REM Note: Port to C - not needed, using the sscanf function
REM Purpose: A perfect more waste of time
REM But real hairy night hackers uses C or Assembler without safety net...
REM
DECLARE SUB SetInput (Txt$)
DECLARE SUB SerialInput (k$)
DECLARE FUNCTION AnsiWhereXY% (x%, y%)
 
DIM SHARED MxIX AS INTEGER
DIM SHARED MxBUFFER$
 
REM SIMPLE TEST
CLS
 
PRINT "TEST SOME RANDOM VALUES"
RANDOMIZE TIMER
ok$ = "TRUE"
FOR n% = 0 TO 20
    row% = INT(RND * 100) + 1
    col% = INT(RND * 80) + 1
    response$ = "+ LTRIM$(STR$(row%)) + ";" +
LTRIM$(STR$(col%)) + "R"
    CALL SetInput(response$)
    result = AnsiWhereXY(x%, y%)
    IF result  -1 THEN ok$ = "FALSE"
       PRINT "Result="; ok$; ", X="; x%; ", Y"; y%
       IF result THEN
          IF y%  row% OR x%  col% THEN
             PRINT "FATALE ERROR"
             BEEP
             STOP
          END IF
       ENDIF
    ELSE
       PRINT "FATALE ERROR"
       PRINT "row "; row%; " y"; y%; ",  col
"; col%; " x"; x%
       BEEP
       STOP
    END IF
 
NEXT
 
 
DIM t$(0 TO 100)
FOR n% = 0 TO UBOUND(t$)
    READ t$(n%)
    IF t$(n%) = "" THEN EXIT FOR
NEXT
 
FOR n% = 0 TO UBOUND(t$)
    IF t$(n%) = "" THEN EXIT FOR
    PRINT "NEGATIVE TEST OF STRING "; t$(n%)
    CALL SetInput(t$(n%))
    result = AnsiWhereXY(x%, y%)
    IF result THEN
       PRINT "ERROR"
       PRINT "Result="; result; ", X="; x%; ", Y"; y%
       BEEP
       STOP
    END IF
NEXT
 
PRINT "SUCCESS OF FINITE STATE AUTOMATA TEST!"
 
DATA  ";65;22R", "1;65;22R", ";S65R",
"1;65;22R"
DATA  "3;22r", "1;65;22Q", "ER",
";;65;22R", ""
 
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 + 1
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
               IF y% < 1000 THEN y% = (y% * 10) + (value - 48)
            ELSEIF state = 3 THEN
               IF x% < 1000 THEN x% = (x% * 10) + (value - 48)
            ELSEIF state THEN
               EXIT DO
            END IF
       CASE 59 'ASC(";"):
            IF state = 2 THEN
               state = 3
             ELSEIF state THEN
                EXIT DO
             END IF
       CASE 82 'ASC("R")
            AnsiWhereXY% = (state = 3)
            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
 
IF MxIX < LEN(MxBUFFER$) THEN
   MxIX = MxIX + 1
   k$ = MID$(MxBUFFER$, MxIX, 1)
   t! = TIMER + .05
   DO
   LOOP UNTIL TIMER > t!
ELSE
   k$ = ""
END IF
 
END SUB
 
SUB SetInput (Txt$)
MxBUFFER$ = Txt$
MxIX = 0
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™.