| TIP: Click on subject to list as thread! | ANSI |
| echo: | |
|---|---|
| to: | |
| from: | |
| date: | |
| 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™.