EndBASIC X.Y.Z
Copyright YYYY-YYYY Julio Merino
Type HELP for interactive usage information.
[2J[1;1H[?25l[38;5;11m
EndBASIC tour: Welcome!
=========================
[39m
Welcome to the EndBASIC tour demo program. I'm glad you have made it this far!
EndBASIC is an interpreter for a BASIC-like language and is inspired by
Amstrad's Locomotive BASIC 1.1 and Microsoft's QuickBASIC 4.5. The main idea
behind EndBASIC is to provide a playground for learning the foundations of
programming in a simplified environment.
EndBASIC is written in Rust and is proven to work on Linux, macOS and Windows.
It likely works on other Unix systems too. And, thanks to WASM, it also runs
on the web--which I bet is how you are reading this right now.
If you are accessing EndBASIC via the web interface, please be aware that
this interface is highly experimental and has many rough edges. In particular,
things will go wrong if you try to resize the browser window. Just reload
the page for a "reboot".
[38;5;9mWhen not in the tour, use the HELP command to access the interactive help
system.
[39m
Without further ado, let's get started!
[38;5;11mPress ENTER to continue or ESC to exit the demo...[?25h[2J[1;1H[?25l
EndBASIC tour: Language basics
================================
[39m
There are four primitive types: booleans (?), double-precision floating
point numbers (#), 32-bit signed integers (%), and strings ($).
The common IF and SELECT CASE conditional structures, the DO, FOR, and WHILE
loops, as well as GOSUB and GOTO are supported.
A trivial program to ask a question and print an answer would look like:
@retry: INPUT "Enter a number greater than 10: ", n
IF n <= 10 THEN GOTO @retry
PRINT "Good job!"
Type HELP "LANG" for specific details about the language constructs.
[38;5;11mPress ENTER to continue or ESC to exit the demo...[?25h[2J[1;1H[?25l
EndBASIC tour: File manipulation
==================================
[39m
Given that you are reading this tour, you have already encountered how to
load a program and run it. But here is how you'd go about creating a new
program from scratch:
1. Type NEW to clear the machine's program and variables.
2. Type EDIT to enter the full-screen editor.
3. Type your program in the editor and then press ESC to exit.
4. Optionally save your program with SAVE "some-name.bas".
5. Run the program with RUN.
6. Repeat from 2 if things don't go as planned.
The cycle above works for demos too. You can LOAD any demo program and
enter the interactive editor with EDIT to see and modify its code. What
you cannot do is save them under their original name; you will have to pick
a different name.
If you are in the browser, rest assured that all programs are stored in
your browser's local storage. Nothing goes to the cloud.
[38;5;11mPress ENTER to continue or ESC to exit the demo...[?25h[2J[1;1H[?25l
EndBASIC tour: The file system
================================
[39m
In the previous page, you learned how to create files and how to save and
load them. Those examples used relative paths. However, EndBASIC supports
multiple drives (although it does not yet support directories).
Paths in EndBASIC have the form DRIVE:FILE or DRIVE:/FILE. Given that
directories are not yet supported, both are equivalent, but their meaning
might change in the future. All commands that operate on paths accept these
syntaxes. Note that the DRIVE: part is optional: when not specified, the
current drive (shown by the DIR command) will be used.
You can use the MOUNT command to display the list of currently-mounted drives
and to attach new ones. Pay attention to the default MOUNT output as it
shows some of the possible URIs you can use to mount other drives.
For example, if you want to gain access to an arbitrary directory in the
system, you could do:
MOUNT "TMP", "file:///PATH/TO/TMPDIR"
CD "TMP:/"
Pay attention to the double quotes surrounding these arguments: these are
EndBASIC commands and thus you must provide the arguments as strings. You
are bound to trip over this a few times due to muscle memory...
[38;5;11mPress ENTER to continue or ESC to exit the demo...[?25h[2J[1;1H[?25l
EndBASIC tour: Screen manipulation
====================================
[39m
You have several commands at your disposal to manipulate the contents of
the screen. Visual features are particularly interesting for teaching
purposes, so expect more in this regard.
For example, we can print the foundational colors by selecting them with
the "COLOR" command and positioning the cursor with "LOCATE":
[12;5H[38;5;0mThis is color 0
[13;5H[38;5;1mThis is color 1
[14;5H[38;5;2mThis is color 2
[15;5H[38;5;3mThis is color 3
[16;5H[38;5;4mThis is color 4
[17;5H[38;5;5mThis is color 5
[18;5H[38;5;6mThis is color 6
[19;5H[38;5;7mThis is color 7
[12;24H[38;5;8mThis is color 8
[13;24H[38;5;9mThis is color 9
[14;24H[38;5;10mThis is color 10
[15;24H[38;5;11mThis is color 11
[16;24H[38;5;12mThis is color 12
[17;24H[38;5;13mThis is color 13
[18;24H[38;5;14mThis is color 14
[19;24H[38;5;15mThis is color 15
[39m
[38;5;11mPress ENTER to continue or ESC to exit the demo...[?25h[2J[1;1H[?25l
EndBASIC tour: Hardware access
================================
[39m
If you happen to be running on a Raspberry Pi, EndBASIC has some support
to manipulate its hardware. At the moment this includes only basic access
to the GPIO lines. See the "DEMOS:/GPIO.BAS" demo for an example.
Please note that you have to be running on a Raspberry Pi *AND* you must
have compiled EndBASIC with --features=rpi for this to work.
[38;5;11mPress ENTER to continue or ESC to exit the demo...[?25h[2J[1;1H[?25l
EndBASIC tour: Enjoy
======================
[39m
And that's it for the tour. You can now type EDIT to see the code that
took you over this journey, load other demo files or... just go forth and
explore. HELP, MOUNT, and DIR are your friends at any point, but so that
you don't feel too lost, run this now:
[38;5;1m CD "DEMOS:/"
DIR
[39m
If you like what you have seen so far, please head to the project's GitHub
page and give it a star:
[38;5;12m
https://github.com/endbasic/endbasic/
[39mThen, visit my blog and subscribe to receive fresh EndBASIC content or...
you know, to keep me motivated in writing stuff and building this project:
[38;5;12m
https://jmmv.dev/
[39mThank you! :-)
[38;5;10m-- Brought to you by Julio Merino <jmmv@>
[?25h[39m
0000 PUSH$ "Welcome!" # 48:8
0001 CALLA 0167
0002 PUSH$ "Welcome to the EndBASIC tour demo program. I'm glad you have made it this far!" # 49:7
0003 PUSH% 4 # 49:7
0004 CALLB 48 (PRINT), 2 # 49:1
0005 CALLB 48 (PRINT), 0 # 50:1
0006 PUSH$ "EndBASIC is an interpreter for a BASIC-like language and is inspired by" # 51:7
0007 PUSH% 4 # 51:7
0008 CALLB 48 (PRINT), 2 # 51:1
0009 PUSH$ "Amstrad's Locomotive BASIC 1.1 and Microsoft's QuickBASIC 4.5. The main idea" # 52:7
000a PUSH% 4 # 52:7
000b CALLB 48 (PRINT), 2 # 52:1
000c PUSH$ "behind EndBASIC is to provide a playground for learning the foundations of" # 53:7
000d PUSH% 4 # 53:7
000e CALLB 48 (PRINT), 2 # 53:1
000f PUSH$ "programming in a simplified environment." # 54:7
0010 PUSH% 4 # 54:7
0011 CALLB 48 (PRINT), 2 # 54:1
0012 CALLB 48 (PRINT), 0 # 55:1
0013 PUSH$ "EndBASIC is written in Rust and is proven to work on Linux, macOS and Windows." # 56:7
0014 PUSH% 4 # 56:7
0015 CALLB 48 (PRINT), 2 # 56:1
0016 PUSH$ "It likely works on other Unix systems too. And, thanks to WASM, it also runs" # 57:7
0017 PUSH% 4 # 57:7
0018 CALLB 48 (PRINT), 2 # 57:1
0019 PUSH$ "on the web--which I bet is how you are reading this right now." # 58:7
001a PUSH% 4 # 58:7
001b CALLB 48 (PRINT), 2 # 58:1
001c CALLB 48 (PRINT), 0 # 59:1
001d PUSH$ "If you are accessing EndBASIC via the web interface, please be aware that" # 60:7
001e PUSH% 4 # 60:7
001f CALLB 48 (PRINT), 2 # 60:1
0020 PUSH$ "this interface is highly experimental and has many rough edges. In particular," # 61:7
0021 PUSH% 4 # 61:7
0022 CALLB 48 (PRINT), 2 # 61:1
0023 PUSH$ "things will go wrong if you try to resize the browser window. Just reload" # 62:7
0024 PUSH% 4 # 62:7
0025 CALLB 48 (PRINT), 2 # 62:1
0026 PUSH$ "the page for a "reboot"." # 63:7
0027 PUSH% 4 # 63:7
0028 CALLB 48 (PRINT), 2 # 63:1
0029 CALLB 48 (PRINT), 0 # 64:1
002a PUSH% 9 # 65:7
002b CALLB 7 (COLOR), 1 # 65:1
002c PUSH$ "When not in the tour, use the HELP command to access the interactive help" # 66:7
002d PUSH% 4 # 66:7
002e CALLB 48 (PRINT), 2 # 66:1
002f PUSH$ "system." # 67:7
0030 PUSH% 4 # 67:7
0031 CALLB 48 (PRINT), 2 # 67:1
0032 CALLB 7 (COLOR), 0 # 68:1
0033 CALLB 48 (PRINT), 0 # 69:1
0034 PUSH$ "Without further ado, let's get started!" # 70:7
0035 PUSH% 4 # 70:7
0036 CALLB 48 (PRINT), 2 # 70:1
0037 CALLA 0191
0038 PUSH$ "Language basics" # 73:8
0039 CALLA 0167
003a PUSH$ "There are four primitive types: booleans (?), double-precision floating" # 74:7
003b PUSH% 4 # 74:7
003c CALLB 48 (PRINT), 2 # 74:1
003d PUSH$ "point numbers (#), 32-bit signed integers (%), and strings ($)." # 75:7
003e PUSH% 4 # 75:7
003f CALLB 48 (PRINT), 2 # 75:1
0040 CALLB 48 (PRINT), 0 # 76:1
0041 PUSH$ "The common IF and SELECT CASE conditional structures, the DO, FOR, and WHILE" # 77:7
0042 PUSH% 4 # 77:7
0043 CALLB 48 (PRINT), 2 # 77:1
0044 PUSH$ "loops, as well as GOSUB and GOTO are supported." # 78:7
0045 PUSH% 4 # 78:7
0046 CALLB 48 (PRINT), 2 # 78:1
0047 CALLB 48 (PRINT), 0 # 79:1
0048 PUSH$ "A trivial program to ask a question and print an answer would look like:" # 80:7
0049 PUSH% 4 # 80:7
004a CALLB 48 (PRINT), 2 # 80:1
004b CALLB 48 (PRINT), 0 # 81:1
004c PUSH$ " @retry: INPUT "Enter a number greater than 10: ", n" # 82:7
004d PUSH% 4 # 82:7
004e CALLB 48 (PRINT), 2 # 82:1
004f PUSH$ " IF n <= 10 THEN GOTO @retry" # 83:7
0050 PUSH% 4 # 83:7
0051 CALLB 48 (PRINT), 2 # 83:1
0052 PUSH$ " PRINT "Good job!"" # 84:7
0053 PUSH% 4 # 84:7
0054 CALLB 48 (PRINT), 2 # 84:1
0055 CALLB 48 (PRINT), 0 # 85:1
0056 PUSH$ "Type HELP "LANG" for specific details about the language constructs." # 86:7
0057 PUSH% 4 # 86:7
0058 CALLB 48 (PRINT), 2 # 86:1
0059 CALLA 0191
005a PUSH$ "File manipulation" # 89:8
005b CALLA 0167
005c PUSH$ "Given that you are reading this tour, you have already encountered how to" # 90:7
005d PUSH% 4 # 90:7
005e CALLB 48 (PRINT), 2 # 90:1
005f PUSH$ "load a program and run it. But here is how you'd go about creating a new" # 91:7
0060 PUSH% 4 # 91:7
0061 CALLB 48 (PRINT), 2 # 91:1
0062 PUSH$ "program from scratch:" # 92:7
0063 PUSH% 4 # 92:7
0064 CALLB 48 (PRINT), 2 # 92:1
0065 CALLB 48 (PRINT), 0 # 93:1
0066 PUSH$ "1. Type NEW to clear the machine's program and variables." # 94:7
0067 PUSH% 4 # 94:7
0068 CALLB 48 (PRINT), 2 # 94:1
0069 PUSH$ "2. Type EDIT to enter the full-screen editor." # 95:7
006a PUSH% 4 # 95:7
006b CALLB 48 (PRINT), 2 # 95:1
006c PUSH$ "3. Type your program in the editor and then press ESC to exit." # 96:7
006d PUSH% 4 # 96:7
006e CALLB 48 (PRINT), 2 # 96:1
006f PUSH$ "4. Optionally save your program with SAVE "some-name.bas"." # 97:7
0070 PUSH% 4 # 97:7
0071 CALLB 48 (PRINT), 2 # 97:1
0072 PUSH$ "5. Run the program with RUN." # 98:7
0073 PUSH% 4 # 98:7
0074 CALLB 48 (PRINT), 2 # 98:1
0075 PUSH$ "6. Repeat from 2 if things don't go as planned." # 99:7
0076 PUSH% 4 # 99:7
0077 CALLB 48 (PRINT), 2 # 99:1
0078 CALLB 48 (PRINT), 0 # 100:1
0079 PUSH$ "The cycle above works for demos too. You can LOAD any demo program and" # 101:7
007a PUSH% 4 # 101:7
007b CALLB 48 (PRINT), 2 # 101:1
007c PUSH$ "enter the interactive editor with EDIT to see and modify its code. What" # 102:7
007d PUSH% 4 # 102:7
007e CALLB 48 (PRINT), 2 # 102:1
007f PUSH$ "you cannot do is save them under their original name; you will have to pick" # 103:7
0080 PUSH% 4 # 103:7
0081 CALLB 48 (PRINT), 2 # 103:1
0082 PUSH$ "a different name." # 104:7
0083 PUSH% 4 # 104:7
0084 CALLB 48 (PRINT), 2 # 104:1
0085 CALLB 48 (PRINT), 0 # 105:1
0086 PUSH$ "If you are in the browser, rest assured that all programs are stored in" # 106:7
0087 PUSH% 4 # 106:7
0088 CALLB 48 (PRINT), 2 # 106:1
0089 PUSH$ "your browser's local storage. Nothing goes to the cloud." # 107:7
008a PUSH% 4 # 107:7
008b CALLB 48 (PRINT), 2 # 107:1
008c CALLA 0191
008d PUSH$ "The file system" # 110:8
008e CALLA 0167
008f PUSH$ "In the previous page, you learned how to create files and how to save and" # 111:7
0090 PUSH% 4 # 111:7
0091 CALLB 48 (PRINT), 2 # 111:1
0092 PUSH$ "load them. Those examples used relative paths. However, EndBASIC supports" # 112:7
0093 PUSH% 4 # 112:7
0094 CALLB 48 (PRINT), 2 # 112:1
0095 PUSH$ "multiple drives (although it does not yet support directories)." # 113:7
0096 PUSH% 4 # 113:7
0097 CALLB 48 (PRINT), 2 # 113:1
0098 CALLB 48 (PRINT), 0 # 114:1
0099 PUSH$ "Paths in EndBASIC have the form DRIVE:FILE or DRIVE:/FILE. Given that" # 115:7
009a PUSH% 4 # 115:7
009b CALLB 48 (PRINT), 2 # 115:1
009c PUSH$ "directories are not yet supported, both are equivalent, but their meaning" # 116:7
009d PUSH% 4 # 116:7
009e CALLB 48 (PRINT), 2 # 116:1
009f PUSH$ "might change in the future. All commands that operate on paths accept these" # 117:7
00a0 PUSH% 4 # 117:7
00a1 CALLB 48 (PRINT), 2 # 117:1
00a2 PUSH$ "syntaxes. Note that the DRIVE: part is optional: when not specified, the" # 118:7
00a3 PUSH% 4 # 118:7
00a4 CALLB 48 (PRINT), 2 # 118:1
00a5 PUSH$ "current drive (shown by the DIR command) will be used." # 119:7
00a6 PUSH% 4 # 119:7
00a7 CALLB 48 (PRINT), 2 # 119:1
00a8 CALLB 48 (PRINT), 0 # 120:1
00a9 PUSH$ "You can use the MOUNT command to display the list of currently-mounted drives" # 121:7
00aa PUSH% 4 # 121:7
00ab CALLB 48 (PRINT), 2 # 121:1
00ac PUSH$ "and to attach new ones. Pay attention to the default MOUNT output as it" # 122:7
00ad PUSH% 4 # 122:7
00ae CALLB 48 (PRINT), 2 # 122:1
00af PUSH$ "shows some of the possible URIs you can use to mount other drives." # 123:7
00b0 PUSH% 4 # 123:7
00b1 CALLB 48 (PRINT), 2 # 123:1
00b2 PUSH$ "For example, if you want to gain access to an arbitrary directory in the" # 124:7
00b3 PUSH% 4 # 124:7
00b4 CALLB 48 (PRINT), 2 # 124:1
00b5 PUSH$ "system, you could do:" # 125:7
00b6 PUSH% 4 # 125:7
00b7 CALLB 48 (PRINT), 2 # 125:1
00b8 CALLB 48 (PRINT), 0 # 126:1
00b9 PUSH$ " MOUNT "TMP", "file:///PATH/TO/TMPDIR"" # 127:7
00ba PUSH% 4 # 127:7
00bb CALLB 48 (PRINT), 2 # 127:1
00bc PUSH$ " CD "TMP:/"" # 128:7
00bd PUSH% 4 # 128:7
00be CALLB 48 (PRINT), 2 # 128:1
00bf CALLB 48 (PRINT), 0 # 129:1
00c0 PUSH$ "Pay attention to the double quotes surrounding these arguments: these are" # 130:7
00c1 PUSH% 4 # 130:7
00c2 CALLB 48 (PRINT), 2 # 130:1
00c3 PUSH$ "EndBASIC commands and thus you must provide the arguments as strings. You" # 131:7
00c4 PUSH% 4 # 131:7
00c5 CALLB 48 (PRINT), 2 # 131:1
00c6 PUSH$ "are bound to trip over this a few times due to muscle memory..." # 132:7
00c7 PUSH% 4 # 132:7
00c8 CALLB 48 (PRINT), 2 # 132:1
00c9 CALLA 0191
00ca PUSH$ "Screen manipulation" # 135:8
00cb CALLA 0167
00cc PUSH$ "You have several commands at your disposal to manipulate the contents of" # 136:7
00cd PUSH% 4 # 136:7
00ce CALLB 48 (PRINT), 2 # 136:1
00cf PUSH$ "the screen. Visual features are particularly interesting for teaching" # 137:7
00d0 PUSH% 4 # 137:7
00d1 CALLB 48 (PRINT), 2 # 137:1
00d2 PUSH$ "purposes, so expect more in this regard." # 138:7
00d3 PUSH% 4 # 138:7
00d4 CALLB 48 (PRINT), 2 # 138:1
00d5 CALLB 48 (PRINT), 0 # 139:1
00d6 PUSH$ "For example, we can print the foundational colors by selecting them with" # 140:7
00d7 PUSH% 4 # 140:7
00d8 CALLB 48 (PRINT), 2 # 140:1
00d9 PUSH$ "the "COLOR" command and positioning the cursor with "LOCATE":" # 141:7
00da PUSH% 4 # 141:7
00db CALLB 48 (PRINT), 2 # 141:1
00dc CALLB 48 (PRINT), 0 # 142:1
00dd PUSH% 0 # 143:10
00de SETV C
00df LOAD% C # 143:5
00e0 PUSH% 7 # 143:15
00e1 CMPLE% # 143:12
00e2 JMPNT 00f5
00e3 PUSH% 11 # 144:15
00e4 LOAD% C # 144:20
00e5 ADD% # 144:18
00e6 PUSH% 4 # 144:12
00e7 CALLB 38 (LOCATE), 2 # 144:5
00e8 LOAD% C # 145:11
00e9 CALLB 7 (COLOR), 1 # 145:5
00ea LOAD% C # 146:28
00eb PUSH% 3 # 146:28
00ec PUSH% 1 # 146:26
00ed PUSH$ "This is color" # 146:11
00ee PUSH% 4 # 146:11
00ef CALLB 48 (PRINT), 5 # 146:5
00f0 LOAD% C # 143:5
00f1 PUSH% 1 # 143:16
00f2 ADD% # 143:12
00f3 SETV C
00f4 JMP 00df
00f5 PUSH% 8 # 148:10
00f6 SETV C
00f7 LOAD% C # 148:5
00f8 PUSH% 15 # 148:15
00f9 CMPLE% # 148:12
00fa JMPNT 010f
00fb PUSH% 11 # 149:16
00fc LOAD% C # 149:21
00fd ADD% # 149:19
00fe PUSH% 8 # 149:26
00ff SUB% # 149:24
0100 PUSH% 23 # 149:12
0101 CALLB 38 (LOCATE), 2 # 149:5
0102 LOAD% C # 150:11
0103 CALLB 7 (COLOR), 1 # 150:5
0104 LOAD% C # 151:28
0105 PUSH% 3 # 151:28
0106 PUSH% 1 # 151:26
0107 PUSH$ "This is color" # 151:11
0108 PUSH% 4 # 151:11
0109 CALLB 48 (PRINT), 5 # 151:5
010a LOAD% C # 148:5
010b PUSH% 1 # 148:17
010c ADD% # 148:12
010d SETV C
010e JMP 00f7
010f CALLB 7 (COLOR), 0 # 153:1
0110 CALLA 0191
0111 PUSH$ "Hardware access" # 156:8
0112 CALLA 0167
0113 PUSH$ "If you happen to be running on a Raspberry Pi, EndBASIC has some support" # 157:7
0114 PUSH% 4 # 157:7
0115 CALLB 48 (PRINT), 2 # 157:1
0116 PUSH$ "to manipulate its hardware. At the moment this includes only basic access" # 158:7
0117 PUSH% 4 # 158:7
0118 CALLB 48 (PRINT), 2 # 158:1
0119 PUSH$ "to the GPIO lines. See the "DEMOS:/GPIO.BAS" demo for an example." # 159:7
011a PUSH% 4 # 159:7
011b CALLB 48 (PRINT), 2 # 159:1
011c CALLB 48 (PRINT), 0 # 160:1
011d PUSH$ "Please note that you have to be running on a Raspberry Pi *AND* you must" # 161:7
011e PUSH% 4 # 161:7
011f CALLB 48 (PRINT), 2 # 161:1
0120 PUSH$ "have compiled EndBASIC with --features=rpi for this to work." # 162:7
0121 PUSH% 4 # 162:7
0122 CALLB 48 (PRINT), 2 # 162:1
0123 CALLA 0191
0124 PUSH$ "Enjoy" # 165:8
0125 CALLA 0167
0126 PUSH$ "And that's it for the tour. You can now type EDIT to see the code that" # 166:7
0127 PUSH% 4 # 166:7
0128 CALLB 48 (PRINT), 2 # 166:1
0129 PUSH$ "took you over this journey, load other demo files or... just go forth and" # 167:7
012a PUSH% 4 # 167:7
012b CALLB 48 (PRINT), 2 # 167:1
012c PUSH$ "explore. HELP, MOUNT, and DIR are your friends at any point, but so that" # 168:7
012d PUSH% 4 # 168:7
012e CALLB 48 (PRINT), 2 # 168:1
012f PUSH$ "you don't feel too lost, run this now:" # 169:7
0130 PUSH% 4 # 169:7
0131 CALLB 48 (PRINT), 2 # 169:1
0132 CALLB 48 (PRINT), 0 # 170:1
0133 PUSH% 1 # 171:7
0134 CALLB 7 (COLOR), 1 # 171:1
0135 PUSH$ " CD "DEMOS:/"" # 172:7
0136 PUSH% 4 # 172:7
0137 CALLB 48 (PRINT), 2 # 172:1
0138 PUSH$ " DIR" # 173:7
0139 PUSH% 4 # 173:7
013a CALLB 48 (PRINT), 2 # 173:1
013b CALLB 7 (COLOR), 0 # 174:1
013c CALLB 48 (PRINT), 0 # 175:1
013d PUSH$ "If you like what you have seen so far, please head to the project's GitHub" # 176:7
013e PUSH% 4 # 176:7
013f CALLB 48 (PRINT), 2 # 176:1
0140 PUSH$ "page and give it a star:" # 177:7
0141 PUSH% 4 # 177:7
0142 CALLB 48 (PRINT), 2 # 177:1
0143 PUSH% 12 # 178:7
0144 CALLB 7 (COLOR), 1 # 178:1
0145 CALLB 48 (PRINT), 0 # 179:1
0146 PUSH$ " https://github.com/endbasic/endbasic/" # 180:7
0147 PUSH% 4 # 180:7
0148 CALLB 48 (PRINT), 2 # 180:1
0149 CALLB 48 (PRINT), 0 # 181:1
014a CALLB 7 (COLOR), 0 # 182:1
014b PUSH$ "Then, visit my blog and subscribe to receive fresh EndBASIC content or..." # 183:7
014c PUSH% 4 # 183:7
014d CALLB 48 (PRINT), 2 # 183:1
014e PUSH$ "you know, to keep me motivated in writing stuff and building this project:" # 184:7
014f PUSH% 4 # 184:7
0150 CALLB 48 (PRINT), 2 # 184:1
0151 PUSH% 12 # 185:7
0152 CALLB 7 (COLOR), 1 # 185:1
0153 CALLB 48 (PRINT), 0 # 186:1
0154 PUSH$ " https://jmmv.dev/" # 187:7
0155 PUSH% 4 # 187:7
0156 CALLB 48 (PRINT), 2 # 187:1
0157 CALLB 48 (PRINT), 0 # 188:1
0158 CALLB 7 (COLOR), 0 # 189:1
0159 PUSH$ "Thank you! :-)" # 190:7
015a PUSH% 4 # 190:7
015b CALLB 48 (PRINT), 2 # 190:1
015c CALLB 48 (PRINT), 0 # 191:1
015d PUSH% 10 # 192:7
015e CALLB 7 (COLOR), 1 # 192:1
015f PUSH$ "-- Brought to you by Julio Merino <jmmv@>" # 193:7
0160 PUSH% 4 # 193:7
0161 CALLB 48 (PRINT), 2 # 193:1
0162 PUSH? true # 196:10
0163 CALLB 22 (GFX_SYNC), 1 # 196:1
0164 CALLB 7 (COLOR), 0 # 197:1
0165 CALLB 48 (PRINT), 0 # 198:1
0166 JMP 01b0
0167 ENTER
0168 SETV TITLE
0169 CALLB 6 (CLS), 0 # 18:5
016a PUSH? false # 19:14
016b CALLB 22 (GFX_SYNC), 1 # 19:5
016c PUSH% 11 # 20:11
016d CALLB 7 (COLOR), 1 # 20:5
016e CALLB 48 (PRINT), 0 # 21:5
016f PUSH$ " EndBASIC tour: " # 22:14
0170 LOAD$ TITLE # 22:35
0171 CONCAT$ # 22:33
0172 SETV TITLE
0173 PUSH$ "" # 23:18
0174 SETV UNDERLINE
0175 PUSH% 1 # 24:13
0176 SETV I
0177 LOAD% I # 24:9
0178 LOAD$ TITLE # 24:23
0179 CALLF% 35 (LEN), 1 # 24:18
017a PUSH% 1 # 24:33
017b ADD% # 24:31
017c CMPLE% # 24:15
017d JMPNT 0187
017e LOAD$ UNDERLINE # 25:22
017f PUSH$ "=" # 25:35
0180 CONCAT$ # 25:33
0181 SETV UNDERLINE
0182 LOAD% I # 24:9
0183 PUSH% 1 # 24:34
0184 ADD% # 24:15
0185 SETV I
0186 JMP 0177
0187 LOAD$ TITLE # 27:11
0188 PUSH% 4 # 27:11
0189 CALLB 48 (PRINT), 2 # 27:5
018a LOAD$ UNDERLINE # 28:11
018b PUSH% 4 # 28:11
018c CALLB 48 (PRINT), 2 # 28:5
018d CALLB 7 (COLOR), 0 # 29:5
018e CALLB 48 (PRINT), 0 # 30:5
018f LEAVE
0190 RET # 31:1
0191 ENTER
0192 CALLB 48 (PRINT), 0 # 35:5
0193 PUSH% 11 # 36:11
0194 CALLB 7 (COLOR), 1 # 36:5
0195 PUSH% 0 # 37:64
0196 PUSH% 1 # 37:63
0197 PUSH$ "Press ENTER to continue or ESC to exit the demo..." # 37:11
0198 PUSH% 4 # 37:11
0199 CALLB 48 (PRINT), 4 # 37:5
019a PUSH? true # 38:14
019b CALLB 22 (GFX_SYNC), 1 # 38:5
019c CALLF$ 29 (INKEY), 0 # 40:21
019d SETV 0SELECT1
019e LOAD$ 0SELECT1 # 41:14
019f PUSH$ "ENTER" # 41:14
01a0 CMPE$ # 41:14
01a1 JMPNT 01a4
01a2 JMP 01ae
01a3 JMP 01ac
01a4 LOAD$ 0SELECT1 # 42:14
01a5 PUSH$ "ESC" # 42:14
01a6 CMPE$ # 42:14
01a7 JMPNT 01aa
01a8 JMP 0162
01a9 JMP 01ac
01aa PUSH# 0.01 # 43:26
01ab CALLB 64 (SLEEP), 1 # 43:20
01ac UNSETV 0SELECT1 # 44:9
01ad JMP 019c
01ae LEAVE
01af RET # 46:1
End of input by CTRL-D