Page 4 of 4

First major update in way too long!

Posted: Fri Jan 23, 2026 11:27 pm
by admin
Major update!

The issue with percent sign handling is now fixed. You don't need to escape percents anymore.
The DPMI Edition wasn't actually working on the 386, but that should be solved now.

There's a ton of new and improved examples including some awesome games. 8-)

Raspberry Pi is now officially supported!

We will continue testing and ensuring stability.

among the new examples is a new and improved HTM to TXT parser:

Code: Select all

1 REM HTM to TXT Parser by Gemino Smothers
2 REM Written in Express BASIC
10 cr$ = CHR$(13): lf$ = CHR$(10): INPUT "*.htm: ", htmfile$: GOSUB 1000: END
1000 PRINT "Parsing: "; htmfile$
1010 OPEN "I", #1, htmfile$
1020 OPEN "O", #2, "parsed.txt"
1030 IF EOF(1) THEN 1080
1040 INPUT #1, rawhtm$: rawhtm$ = LTRIM$(RTRIM$(rawhtm$)): pl = pl + 1: PRINT "Parsing line #"; pl; "..."
1050 FOR chars = 1 TO LEN(rawhtm$): GOSUB 2000
1055 IF breakflag THEN breakflag = 0: PRINT pagebuffer$: PRINT #2, pagebuffer$: pagebuffer$ = ""
1056 NEXT chars
1070 IF EOF(1) = 0 THEN 1040
1080 CLOSE #1: CLOSE #2
1090 PRINT "Done.": RETURN
2000 tagflag = 0: tagchars$ = ""
2010 IF LEN(rawhtm$) = 9 THEN tagchars$ = UCASE$(rawhtm$): GOTO 2030
2020 IF chars + 8 <= LEN(rawhtm$) THEN tagchars$ = UCASE$(MID$(rawhtm$, chars, 9))
2030 IF tagchars$ = "</SCRIPT>" THEN chars = chars + 8:	tagflag = 1: IF beginoutput THEN body = 1
2040 IF LEN(rawhtm$) = 8 THEN tagchars$ = UCASE$(rawhtm$): GOTO 2060
2050 IF chars + 7 <= LEN(rawhtm$) THEN tagchars$ = UCASE$(MID$(rawhtm$, chars, 8))
2060 IF tagchars$ = "</TABLE>" THEN GOSUB 3000: chars = chars + 7: tagflag = 1
2070 IF tagchars$ = "<SCRIPT>" THEN body = 0: chars = chars + 7: tagflag = 1
2080 IF tagchars$ = "</STYLE>" THEN chars = chars + 7: tagflag = 1: IF beginoutput THEN body = 1
2090 IF LEN(rawhtm$) = 7 THEN tagchars$ = UCASE$(rawhtm$): GOTO 2110
2100 IF chars + 6 <= LEN(rawhtm$) THEN tagchars$ = UCASE$(MID$(rawhtm$, chars, 7))
2110 IF tagchars$ = "<TABLE>" THEN GOSUB 3000: chars = chars + 6: tagflag = 1
2120 IF tagchars$ = "<STYLE>" THEN body = 0: chars = chars + 6: tagflag = 1
2130 IF LEN(rawhtm$) = 6 THEN tagchars$ = UCASE$(rawhtm$): GOTO 2150
2140 IF chars + 5 <= LEN(rawhtm$) THEN tagchars$ = UCASE$(MID$(rawhtm$, chars, 6))
2150 IF tagchars$ = "<BODY>" THEN beginoutput = 1: body = 1: chars = chars + 5: tagflag = 1
2160 IF tagchars$ = "<BODY " THEN beginoutput = 1: body = 1: GOSUB 5000: tagflag = 1
2170 IF tagchars$ = "</DIV>" OR tagchars$ = "<BR />" THEN GOSUB 3000: chars = chars + 5: tagflag = 1
2180 IF tagchars$ = "&NBSP;" THEN pagebuffer$ = pagebuffer$ + " ": chars = chars + 5: tagflag = 1
2190 IF LEN(rawhtm$) = 5 THEN tagchars$ = UCASE$(rawhtm$): GOTO 2210
2200 IF chars + 4 <= LEN(rawhtm$) THEN tagchars$ = UCASE$(MID$(rawhtm$, chars, 5))
2210 IF tagchars$ = "<BR/>" OR tagchars$ = "<DIV>" THEN GOSUB 3000: chars = chars + 4: tagflag = 1
2220 IF tagchars$ = "</H1>" OR tagchars$ = "</H2>" THEN headerflag = 1: GOSUB 3000: chars = chars + 4: tagflag = 1
2230 IF tagchars$ = "</H3>" OR tagchars$ = "</H4>" THEN headerflag = 1: GOSUB 3000: chars = chars + 4: tagflag = 1
2240 IF tagchars$ = "</H5>" OR tagchars$ = "</H6>" THEN headerflag = 1: GOSUB 3000: chars = chars + 4: tagflag = 1
2250 IF tagchars$ = "</TR>" OR tagchars$ = "</TD>" OR tagchars$ = "</TH>" THEN GOSUB 3000: chars = chars + 4: tagflag = 1
2260 IF tagchars$ = "</UL>" THEN listbranch = listbranch - 1: chars = chars + 4: tagflag = 1
2270 IF tagchars$ = "</LI>" THEN GOSUB 3000: chars = chars + 4: tagflag = 1
2280 IF tagchars$ = "</DL>" OR tagchars$ = "</DT>" OR tagchars$ = "</DD>" THEN GOSUB 3000: chars = chars + 4: tagflag = 1
2290 IF LEN(rawhtm$) = 4 THEN tagchars$ = UCASE$(rawhtm$): GOTO 2310
2300 IF chars + 3 <= LEN(rawhtm$) THEN tagchars$ = UCASE$(MID$(rawhtm$, chars, 4))
2310 IF tagchars$ = "<BR>" OR tagchars$ = "<HR>" OR tagchars$ = "</P>" THEN GOSUB 3000: chars = chars + 3: tagflag = 1
2320 IF tagchars$ = "<H1>" OR tagchars$ = "<H2>" THEN headerflag = 1: GOSUB 3000: chars = chars + 3: tagflag = 1
2330 IF tagchars$ = "<H3>" OR tagchars$ = "<H4>" THEN headerflag = 1: GOSUB 3000: chars = chars + 3: tagflag = 1
2340 IF tagchars$ = "<H5>" OR tagchars$ = "<H6>" THEN headerflag = 1: GOSUB 3000: chars = chars + 3: tagflag = 1
2350 IF tagchars$ = "<TR>" OR tagchars$ = "<TD>" OR tagchars$ = "<TH>" THEN GOSUB 3000: chars = chars + 3: tagflag = 1
2360 IF tagchars$ = "<UL>" THEN GOSUB 3000: listbranch = listbranch + 1: chars = chars + 3: tagflag = 1
2370 IF tagchars$ = "<LI>" THEN listbullet = 1: chars = chars + 3: tagflag = 1
2380 IF tagchars$ = "<DL>" THEN GOSUB 3000: dlflag = 1: chars = chars + 3: tagflag = 1
2390 IF tagchars$ = "<DT>" THEN GOSUB 3000: chars = chars + 3: tagflag = 1
2400 IF tagchars$ = "<DD>" THEN GOSUB 3000: ddflag = 1: chars = chars + 3: tagflag = 1
2410 IF tagchars$ = "</A>" THEN links = links + 1
2420 IF tagchars$ = "&LT;" THEN pagebuffer$ = pagebuffer$ + "<": chars = chars + 3: tagflag = 1
2430 IF tagchars$ = "&GT;" THEN pagebuffer$ = pagebuffer$ + ">": chars = chars + 3: tagflag = 1
2440 IF LEN(rawhtm$) = 3 THEN tagchars$ = UCASE$(rawhtm$): GOTO 2450
2450 IF chars + 2 <= LEN(rawhtm$) THEN tagchars$ = UCASE$(MID$(rawhtm$, chars, 3))
2460 IF tagchars$ = "<P>" THEN GOSUB 3000: chars = chars + 2: tagflag = 1
2470 IF tagflag = 0 THEN GOSUB 7000
2480 IF listbranch < 0 THEN listbranch = 0
2490 RETURN
3000 GOSUB 4000
3010 IF body = 0 OR LEN(LTRIM$(pagebuffer$)) = 0 THEN bullet$ = "": listbullet = 0: RETURN
3020 IF LEN(bullet$) THEN bullet$ = SPACE$(listbranch * 4) + "\___" + bullet$: GOTO 3040
3030 bullet$ = SPACE$(listbranch * 4): IF listbranch THEN pagebuffer$ = SPACE$(4) + "|" + pagebuffer$
3040 pagebuffer$ = bullet$ + pagebuffer$
3050 IF headerflag THEN headerflag = 0: pagebuffer$ = cr$ + lf$ + pagebuffer$ + cr$ + lf$
3060 IF dlflag THEN dlflag = 0: pagebuffer$ = cr$ + lf$ + pagebuffer$
3070 IF ddflag THEN ddflag = 0: pagebuffer$ = SPACE$(8) + pagebuffer$
3080 breakflag = 1: bullet = "": listbullet = 0: RETURN
4000 bullet$ = "": IF listbullet = 0 THEN RETURN
4001 IF listbranch = 1 THEN bullet$ = "o "
4002 IF listbranch = 2 THEN bullet$ = "* "
4003 IF listbranch = 3 THEN bullet$ = "# "
4004 IF listbranch = 4 THEN bullet$ = "+ "
4005 IF listbranch = 5 THEN bullet$ = "- "
4006 IF listbranch = 6 THEN bullet$ = "@ "
4007 IF listbranch = 7 THEN bullet$ = "& "
4008 IF listbranch = 8 THEN bullet$ = "$ "
4009 IF listbranch = 9 THEN bullet$ = "! "
4010 IF listbranch > 9 THEN bullet$ = "> "
4020 RETURN
5000 targetchar$ = ">": GOSUB 6000: anchorflag = 0: RETURN
6000 checkchars = chars
6010 checkchars = checkchars + 1: IF checkchars + 1 > LEN(rawhtm$) THEN chars = checkchars: RETURN
6020 IF MID$(rawhtm$, checkchars, 1) <> targetchar$ AND checkchars < LEN(rawhtm$) THEN 6010
6030 IF MID$(rawhtm$, checkchars, 1) = targetchar$ THEN chars = checkchars - 1
6040 RETURN
7000 htmlen = LEN(rawhtm$)
7010 exp1 = body = 0 OR chars < htmlen
7020 IF exp1 THEN exp2 = body = 0 OR chars + 1 > htmlen
7030 IF exp1 AND exp2 THEN RETURN
7040 IF chars > htmlen THEN RETURN
7050 IF chars <= htmlen THEN targetchar$ = MID$(rawhtm$, chars, 1)
7065 GOSUB 9000: IF anchorflag THEN RETURN
7070 IF targetchar$ = "<" THEN targetchar$ = MID$(rawhtm$, chars + 1, 1): GOSUB 8000: RETURN
7080 GOSUB 10000: IF chars = htmlen THEN pagebuffer$ = pagebuffer$ + " "
7090 RETURN
8000 IF LEN(targetchar$) THEN achar = ASC(targetchar$)
8010 IF achar <> 65 AND achar <> 97 THEN GOSUB 5000: RETURN
8020 linkflag = 1: anchorflag = 1: pagebuffer$ = pagebuffer$ + " LINK[" + LTRIM$(STR$(links)) + "]: "
8030 RETURN
9000 exp1 = chars + 5 <= LEN(rawhtm$)
9010 IF exp1 THEN exp2 = UCASE$(MID$(rawhtm$, chars, 5)) = "HREF="
9020 IF exp1 AND exp2 THEN anchorflag = 0: chars = chars + 5: targetchar$ = "": RETURN
9030 exp1 = chars + 6 <= LEN(rawhtm$)
9040 IF exp1 THEN exp2 = UCASE$(MID$(rawhtm$, chars, 6)) = "HREF ="
9050 IF exp1 AND exp2 THEN anchorflag = 0: chars = chars + 6: targetchar$ = "": RETURN
9060 IF targetchar$ = CHR$(34) AND linkflag <> 0 THEN anchorflag = 1: targetchar$ = "": RETURN
9070 IF targetchar$ = ">" AND linkflag <> 0 THEN anchorflag = 0: linkflag = 0: targetchar$ = " ": RETURN
9080 RETURN
10000 achar = ASC(targetchar$)
10010 IF achar >= 32 AND achar <> 62 AND achar <> 9 THEN pagebuffer$ = pagebuffer$ + targetchar$
10020 IF achar = 9 THEN pagebuffer$ = pagebuffer$ + " "
10030 IF LEN(pagebuffer$) > 1 THEN IF RIGHT$(pagebuffer$, 2) = "  " THEN pagebuffer$ = RTRIM$(pagebuffer$) + " "
10040 RETURN