Mostly demonstrates how using the OUT statement can create more believable flashing lights. Also, graphics are created during the first run. Afterwards, they are BLOAD'd from a file, instantly.
'Copy code from here --------------------------------------------------------------
DEFINT X-Y
DECLARE SUB Pause (Interval!)
DIM Box(1 TO 26500) AS INTEGER
CONST pi! = 3.14159 'important!
RANDOMIZE TIMER
SCREEN 12
OUT &H3C8, 8: OUT &H3C9, 10: OUT &H3C9, 10: OUT &H3C9, 10
OUT &H3C8, 14: OUT &H3C9, 42: OUT &H3C9, 36: OUT &H3C9, 0
GOSUB Graphics
LOCATE 28, 31: COLOR 7: PRINT "PRESS ANY KEY TO END"
DO
GOSUB Flasher
Pause .2
LOOP WHILE INKEY$ = ""
END
Graphics:
OPEN "SimonS.BSV" FOR BINARY AS #1
IF LOF(1) THEN
CLOSE #1
DEF SEG = VARSEG(Box(1))
BLOAD "SimonS.BSV", VARPTR(Box(1))
DEF SEG
PUT (160, 80), Box
ELSE
CLOSE #1
CIRCLE (320, 240), 70, 8, 0, pi! * .42
CIRCLE (320, 240), 140, 8, 0, pi! * .45
LINE (330, 112)-(330, 163), 8
CIRCLE (342, 114), 12, 8, pi! * .5, pi!
CIRCLE (338, 164), 8, 8, pi!, pi! * 1.5
FOR x = 320 TO 360
FOR y = 80 TO 240
PSET (560 - y, 560 - x), POINT(x, y)
NEXT y
NEXT x
FOR x = 320 TO 480
FOR y = 80 TO 240
PSET (640 - x, y), POINT(x, y)
NEXT y
NEXT x
FOR x = 160 TO 480
FOR y = 80 TO 240
PSET (x, 480 - y), POINT(x, y)
NEXT y
NEXT x
CIRCLE (320, 240), 160, 8
CIRCLE (320, 240), 60, 8
PAINT (320, 120), 8
CIRCLE (320, 240), 54, 7
MaxWIDTH = 86
MaxDEPTH = 20
x = 0: y = 0
xx = 277: yy = 230
RESTORE TitleDATA
DO
READ DataSTRING$
FOR n = 1 TO LEN(DataSTRING$)
Char$ = MID$(DataSTRING$, n, 1)
SELECT CASE Char$
CASE "!"
n = n + 1
a$ = MID$(DataSTRING$, n, 1)
Count = ASC(a$) + 68
CASE "#"
n = n + 1
b$ = MID$(DataSTRING$, n)
FOR i = 1 TO LEN(b$)
t$ = MID$(b$, i, 1)
IF t$ = "#" THEN EXIT FOR
c$ = c$ + t$
NEXT i
Count = VAL("&H" + c$)
n = n + LEN(c$)
c$ = ""
CASE ELSE
Count = ASC(Char$) - 60
END SELECT
n = n + 1
Colr = VAL("&H" + MID$(DataSTRING$, n, 1))
FOR Reps = 1 TO Count
PSET (x + xx, y + yy), Colr
x = x + 1
IF x > MaxWIDTH THEN x = 0: y = y + 1
NEXT Reps
NEXT n
LOOP UNTIL y > MaxDEPTH
GET (160, 80)-(480, 400), Box
DEF SEG = VARSEG(Box(1))
BSAVE "SimonS.BSV", VARPTR(Box(1)), 53000
DEF SEG
END IF
RETURN
Flasher:
SELECT CASE INT(RND * 4) + 1
CASE 1
OUT &H3C8, 1: OUT &H3C9, 0: OUT &H3C9, 0: OUT &H3C9, 63
Pause .3
OUT &H3C8, 1: OUT &H3C9, 0: OUT &H3C9, 0: OUT &H3C9, 42
CASE 2
OUT &H3C8, 3: OUT &H3C9, 0: OUT &H3C9, 63: OUT &H3C9, 63
Pause .3
OUT &H3C8, 3: OUT &H3C9, 0: OUT &H3C9, 42: OUT &H3C9, 42
CASE 3
OUT &H3C8, 4: OUT &H3C9, 63: OUT &H3C9, 0: OUT &H3C9, 0
Pause .3
OUT &H3C8, 4: OUT &H3C9, 42: OUT &H3C9, 0: OUT &H3C9, 0
CASE 4
OUT &H3C8, 14: OUT &H3C9, 63: OUT &H3C9, 63: OUT &H3C9, 0
Pause .3
OUT &H3C8, 14: OUT &H3C9, 42: OUT &H3C9, 36: OUT &H3C9, 0
END SELECT
RETURN
TitleDATA:
DATA "B0@FN0AF@0@FK0AFK0BFE0CF?0BFB0NFE0GFF0FFA0EF?0BFA0PFC0IFD0HF@0EF?0BF@0"
DATA "RF@0LFB0JF>0FF?0BF?0SF@0MF@0LF=0CFB0BF?0LF=0CF>0EF=0EF?0DF=0CF=0BFC0BF"
DATA "?0BF>0CF?0BF>0CFA0CF?0BF@0BF=0CFB0BF>0CF?0BF?0BF=0CFC0BF?0BF@0BF=0CFB0"
DATA "BF>0CF?0BF?0BF=0BFD0CF>0BF@0BF>0CFA0BF>0CF?0BF?0BF=0BFE0BF>0BF@0BF>0CF"
DATA "A0BF>0CF?0BF?0BF=0BFE0BF>0BF@0BF?0CF@0BF>0CF?0BF?0BF=0BFE0BF>0BF@0BF@0"
DATA "BF@0BF>0CF?0BF?0BF=0BFD0CF>0BF@0BF@0CF?0BF>0CF?0BF?0BF=0CFC0BF?0BF@0BF"
DATA "@0CF?0BF>0CF?0BF?0BF>0CF@0DF?0BF@0MF?0BF>0CF?0BF?0BF>0NF@0BF@0LF@0BF>0"
DATA "CF?0BF?0BF?0MF@0BF@0LF@0BF>0CF?0BF?0BF@0KFA0BF@0KFA0BF>0CF?0BF?0BFA0IF"
DATA "B0BF@0JFB0BF>0CF?0BF?0BFC0EFD0BF@0BF“0"
SUB Pause (Interval!)
StartTIME! = TIMER
DO
IF StartTIME! > TIMER THEN EXIT SUB
LOOP WHILE TIMER < StartTIME! + Interval!
END SUB