-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
48 lines (46 loc) · 17.6 KB
/
index.html
File metadata and controls
48 lines (46 loc) · 17.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<!doctype html><html lang=en xmlns:fb=http://ogp.me/ns/fb#><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><meta property="og:site_name" content="EndBASIC"><meta property="twitter:site" content="@jmmv"><title>EndBASIC</title>
<meta property="og:title" content="EndBASIC"><meta property="twitter:title" content="EndBASIC"><meta name=description content="The EndBASIC programming language. A retro-looking integrated environment designed to allow learning the foundations of programming and computing. Runs on the web for simplicity, but also on your machine."><meta property="og:description" content="The EndBASIC programming language. A retro-looking integrated environment designed to allow learning the foundations of programming and computing. Runs on the web for simplicity, but also on your machine."><meta property="twitter:description" content="The EndBASIC programming language. A retro-looking integrated environment designed to allow learning the foundations of programming and computing. Runs on the web for simplicity, but also on your …"><meta name=author content="Julio Merino"><meta property="twitter:creator" content="@jmmv"><meta name=generator content="Hugo 0.145.0"><meta property="og:url" content="https://www.endbasic.dev/"><meta property="og:type" content="website"><meta property="twitter:card" content="summary"><link rel=canonical href=https://www.endbasic.dev/><link rel=alternate type=application/rss+xml title=EndBASIC href=https://www.endbasic.dev/feed.xml><link rel=stylesheet href=/sass/main.min.1aac345b2e5f8be1188ed477c775964ea5a46ec1674294e3326f4e792d44a344.css><link rel=stylesheet href=/css/chroma.css></head><body><nav class="navbar navbar-expand-sm navbar-dark bg-dark sticky-top"><div class="container-fluid page-container"><a class=navbar-brand href=/>EndBASIC</a>
<button class=navbar-toggler type=button data-bs-toggle=collapse data-bs-target=#navbarToggler aria-controls=navbarToggler aria-expanded=false aria-label="Toggle navigation">
<span class=navbar-toggler-icon></span></button><div class="collapse navbar-collapse" id=navbarToggler><ul class="navbar-nav me-auto mt-2 mt-lg-0"><li class=nav-item><a class=nav-link href=/about.html>About</a></li><li class=nav-item><a class=nav-link href=/blog.html>Blog</a></li><li class=nav-item><a class=nav-link href=/gallery.html>Gallery</a></li><li class=nav-item><a class=nav-link href=/download.html>Download</a></li><li class=nav-item><a class=nav-link href=/docs.html>Documentation</a></li><li class=nav-item><a class=nav-link href=/community.html>Community</a></li><li class=nav-item><a class=nav-link href=/endbox.html>EndBOX</a></li></ul></div></div></nav><div class="hero position-relative overflow-hidden text-center bg-dark bg-grid"><div class=hero-overlay></div><div class="hero-content col-md-8 mx-auto"><h1 class="title display-3 fw-bold">EndBASIC</h1><p class=lead>BASIC interpreter + DOS environment, reimagined.</p><a class="btn btn-primary btn-lg" href=https://repl.endbasic.dev/ target=_new>Launch interpreter</a></div></div><article class=page-container><section class=index-section><div class="row g-4"><div class=col><p>EndBASIC is an interpreter for a BASIC dialect exposed via a DOS-like façade. The interface offers immediate feedback through an integrated editor and help system, a hybrid text/graphics console, and direct hardware support. Runs on the web, the desktop, and on embedded devices.</p><div class=code-block><div class=code-block-header><span class="code-block-btn code-block-sysmenu"></span>
<span class=code-block-title>Code sample</span>
<span class=code-block-btn>▼</span>
<span class=code-block-btn>▲</span></div><div class=highlight><pre tabindex=0 class=chroma><code class=language-basic data-lang=basic><span class=line><span class=cl><span class=kd>DIM</span><span class=w> </span><span class=nv>SHARED</span><span class=w> </span><span class=vg>max_radius:</span><span class=w> </span><span class=vg>max_radius</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=il>20</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=kr>SUB</span><span class=w> </span><span class=nl>render_dots_recursively</span><span class=p>(</span><span class=vg>x1</span><span class=p>,</span><span class=w> </span><span class=vg>y1</span><span class=p>,</span><span class=w> </span><span class=vg>x2</span><span class=p>,</span><span class=w> </span><span class=vg>y2</span><span class=p>,</span><span class=w> </span><span class=vg>n</span><span class=p>)</span>
</span></span><span class=line><span class=cl><span class=w> </span><span class=vg>x</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=vg>x1</span><span class=w> </span><span class=o>+</span><span class=w> </span><span class=kr>RND</span><span class=p>(</span><span class=il>1</span><span class=p>)</span><span class=w> </span><span class=o>*</span><span class=w> </span><span class=p>(</span><span class=vg>x2</span><span class=w> </span><span class=o>-</span><span class=w> </span><span class=vg>x1</span><span class=p>)</span><span class=o>:</span>
</span></span><span class=line><span class=cl><span class=w> </span><span class=vg>y</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=vg>y1</span><span class=w> </span><span class=o>+</span><span class=w> </span><span class=kr>RND</span><span class=p>(</span><span class=il>1</span><span class=p>)</span><span class=w> </span><span class=o>*</span><span class=w> </span><span class=p>(</span><span class=vg>y2</span><span class=w> </span><span class=o>-</span><span class=w> </span><span class=vg>y1</span><span class=p>)</span>
</span></span><span class=line><span class=cl><span class=w> </span><span class=vg>radius</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=kr>RND</span><span class=p>(</span><span class=il>1</span><span class=p>)</span><span class=w> </span><span class=o>*</span><span class=w> </span><span class=vg>max_radius</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=w> </span><span class=kr>COLOR</span><span class=w> </span><span class=kr>RND</span><span class=p>(</span><span class=il>1</span><span class=p>)</span><span class=w> </span><span class=o>*</span><span class=w> </span><span class=il>14</span><span class=w> </span><span class=o>+</span><span class=w> </span><span class=il>1</span>
</span></span><span class=line><span class=cl><span class=w> </span><span class=vg>GFX_CIRCLEF</span><span class=w> </span><span class=vg>x</span><span class=p>,</span><span class=w> </span><span class=vg>y</span><span class=p>,</span><span class=w> </span><span class=vg>radius</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=w> </span><span class=kr>IF</span><span class=w> </span><span class=vg>n</span><span class=w> </span><span class=o>></span><span class=w> </span><span class=il>0</span><span class=w> </span><span class=kr>THEN</span><span class=w> </span><span class=vg>render_dots_recursively</span><span class=w> </span><span class=vg>x1</span><span class=p>,</span><span class=w> </span><span class=vg>y1</span><span class=p>,</span><span class=w> </span><span class=vg>x2</span><span class=p>,</span><span class=w> </span><span class=vg>y2</span><span class=p>,</span><span class=w> </span><span class=vg>n</span><span class=w> </span><span class=o>-</span><span class=w> </span><span class=il>1</span>
</span></span><span class=line><span class=cl><span class=kr>END</span><span class=w> </span><span class=kr>SUB</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=kr>SUB</span><span class=w> </span><span class=nl>render_dots</span><span class=p>(</span><span class=vg>x1</span><span class=p>,</span><span class=w> </span><span class=vg>y1</span><span class=p>,</span><span class=w> </span><span class=vg>x2</span><span class=p>,</span><span class=w> </span><span class=vg>y2</span><span class=p>,</span><span class=w> </span><span class=vg>n</span><span class=p>)</span>
</span></span><span class=line><span class=cl><span class=w> </span><span class=kr>COLOR</span><span class=w> </span><span class=il>15</span>
</span></span><span class=line><span class=cl><span class=w> </span><span class=vg>GFX_RECT</span><span class=w> </span><span class=vg>x1</span><span class=p>,</span><span class=w> </span><span class=vg>y1</span><span class=p>,</span><span class=w> </span><span class=vg>x2</span><span class=p>,</span><span class=w> </span><span class=vg>y2</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=w> </span><span class=vg>x1</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=vg>x1</span><span class=w> </span><span class=o>+</span><span class=w> </span><span class=nl>max_radius:</span><span class=w> </span><span class=vg>y1</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=vg>y1</span><span class=w> </span><span class=o>+</span><span class=w> </span><span class=vg>max_radius</span>
</span></span><span class=line><span class=cl><span class=w> </span><span class=vg>x2</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=vg>x2</span><span class=w> </span><span class=o>-</span><span class=w> </span><span class=nl>max_radius:</span><span class=w> </span><span class=vg>y2</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=vg>y2</span><span class=w> </span><span class=o>-</span><span class=w> </span><span class=vg>max_radius</span>
</span></span><span class=line><span class=cl><span class=w> </span><span class=vg>render_dots_recursively</span><span class=w> </span><span class=vg>x1</span><span class=p>,</span><span class=w> </span><span class=vg>y1</span><span class=p>,</span><span class=w> </span><span class=vg>x2</span><span class=p>,</span><span class=w> </span><span class=vg>y2</span><span class=p>,</span><span class=w> </span><span class=vg>n</span>
</span></span><span class=line><span class=cl><span class=kr>END</span><span class=w> </span><span class=kr>SUB</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=kr>INPUT</span><span class=w> </span><span class=s2>"How many dots"</span><span class=p>;</span><span class=w> </span><span class=vg>n</span>
</span></span><span class=line><span class=cl><span class=vg>render_dots</span><span class=w> </span><span class=il>0</span><span class=p>,</span><span class=w> </span><span class=il>0</span><span class=p>,</span><span class=w> </span><span class=vg>GFX_WIDTH</span><span class=w> </span><span class=o>/</span><span class=w> </span><span class=il>2</span><span class=p>,</span><span class=w> </span><span class=vg>GFX_HEIGHT</span><span class=w> </span><span class=o>/</span><span class=w> </span><span class=il>2</span><span class=p>,</span><span class=w> </span><span class=vg>n</span>
</span></span><span class=line><span class=cl><span class=vg>render_dots</span><span class=w> </span><span class=vg>GFX_WIDTH</span><span class=w> </span><span class=o>/</span><span class=w> </span><span class=il>2</span><span class=p>,</span><span class=w> </span><span class=vg>GFX_HEIGHT</span><span class=w> </span><span class=o>/</span><span class=w> </span><span class=il>2</span><span class=p>,</span><span class=w> </span><span class=vg>GFX_WIDTH</span><span class=p>,</span><span class=w> </span><span class=vg>GFX_HEIGHT</span><span class=p>,</span><span class=w> </span><span class=vg>n</span></span></span></code></pre></div></div><div class=section-actions><a class="btn btn-primary" href=docs.html>Read the docs</a></div></div></div></section><section class="index-section section-alt"><div class="row align-items-center g-4"><div class=col><h2>Features</h2></div></div><div class="row g-4"><div class=col-lg-6><ul><li><p><b>Structured programming:</b> Supports <tt>IF</tt> and <tt>SELECT</tt> statements; <tt>FOR</tt>, <tt>LOOP</tt> and <tt>WHILE</tt> loops; and user-defined functions and subroutines.</p></li><li><p><b>Line numbers:</b> Optional retro-style line-oriented development via <tt>GOTO</tt> and <tt>GOSUB</tt>.</p></li><li><p><b>Strong typing:</b> Supports booleans, integers, doubles, and strings, all with optional retro-style type annotations like <tt>name$</tt>.</p></li><li><p><b>Fast execution:</b> Bytecode-compiled language using a custom VM tailored to the language. Disassembler included for extra fun.</p></li></ul></div><div class=col-lg-6><ul><li><p><b>Interface:</b> Integrated MS-DOS-like command line, REPL, and editor.</p></li><li><p><b>Graphics:</b> Hybrid console with overlapping text and graphics.</p></li><li><p><b>Portable:</b> Runs on the web, desktop operating systems, and embedded devices such as <a href=/endbox.html>the EndBOX</a>.</p></li><li><p><b>Cloud file sharing:</b> Because you may want to <a href=/gallery.html>share your creations</a>.</p></li><li><p><b>Embeddable:</b> The interpreter is written in Rust and can be easily used as an extension language from native binaries. <a href=https://github.com/jmmv/endbasic/>Check out GitHub.</a></p></li></ul></div></div></section><section class=index-section><div class="row align-items-center g-4"><div class=col-lg-6><div class=section-img><img src=/images/front-intro-console.png class=img-fluid alt="EndBASIC console"></div></div><div class=col-lg-6><h2>Back to basics</h2><p>EndBASIC is an interpreter for a BASIC-like language and is inspired by Amstrad's Locomotive BASIC 1.1 from the 1980s and Microsoft's QuickBASIC 4.5 from the 1990s. Like the former, EndBASIC intends to provide an interactive environment that seamlessly merges coding with immediate visual feedback. Like the latter, EndBASIC offers higher-level programming constructs and strong typing.</p><p>EndBASIC's primary goal is to offer a simplified and restricted DOS-like environment to learn the foundations of programming and computing, and focuses on features that quickly reward the learner. These include a built-in text editor, commands to manipulate the screen, commands to interact with shared files, and even commands to interact with the hardware of a Raspberry Pi.</p><div class=section-actions><a class="btn btn-primary" href=about.html>Motivation letter</a></div></div></div></section><section class="index-section section-alt"><div class="row align-items-center g-4"><div class="col-lg-6 order-lg-last"><div class=section-img><img src=/images/front-games-arka.png class=img-fluid alt="Arkanoid game in EndBASIC"></div></div><div class=col-lg-6><h2>Play and edit games</h2><p>A major goal of EndBASIC is to provide a playful environment in which to recreate old-style and simple videogames with ease, all while learning the foundations of programming. Proof of this is that, in just a couple hundred lines of code, you can replicate classics like Pong, Arkanoid, or Snake, and even implement more complex programs like Conway's Game of Life.</p><div class=section-actions><a class="btn btn-primary" href=gallery.html>Browse projects</a></div></div></div></section><section class=index-section><div class="row align-items-center g-4"><div class=col-lg-6><div class=section-img><img src=/images/front-web-cloud.png class=img-fluid alt="EndBASIC cloud sharing"></div></div><div class=col-lg-6><h2>Built for the web and the cloud</h2><p>EndBASIC is a web-native application that runs locally on your browser thanks to WASM. This allows you to enjoy the environment without having to install anything on your computer, and also lets you run the interpreter on mobile devices.</p><p>And... what are your creations if you are not able to share them with the world? In the 1980s, people shared their programs as magazine listings and you'd have to painfully type them in. That's a thing of the past though: EndBASIC lets you share your programs via a cloud file sharing service.</p><div class=section-actions><a class="btn btn-primary" href=docs.html#cloud>Learn to share</a></div></div></div></section><section class="index-section section-alt"><div class="row align-items-center g-4"><div class=col><h2>Ready?</h2><p>Try EndBASIC right in your browser, now. Just press the button!</p><div class=section-actions><a class="btn btn-primary btn-lg" href=https://repl.endbasic.dev/ target=_new>Launch interpreter</a></div></div></div></section></article><footer class="pt-5 pb-3"><div class=page-container><div class=row><div class="col-md-8 text-start"><form class="d-inline-flex flex-nowrap" action=https://hugo-dynamic.endbasic.dev/api/sites/6a633c2c-7fda-11ec-86e4-1cfd087199c2/subscribers/add method=post><input type=text name=email placeholder="Enter your email" class="form-control form-control-sm w-auto text-center mx-1" size=20>
<button type=submit class="btn btn-sm btn-light mx-1">Subscribe to updates</button></form></div><div class="col-md-4 text-end">EndBASIC
<small class="d-block text-muted">Julio Merino © 2020–2026</small></div></div></div></footer><script type=module>
const SITE_ID = '6a633c2c-7fda-11ec-86e4-1cfd087199c2';
import {
addAnchorsToHeaders,
makePageTocCollapsible,
trackDownloads,
RequestsClient,
} from "\/js\/main.4dc200a9d6802a5045e31030e8736650b8c0080ae1fda190dbc3dd9c174031f8.js";
const client = new RequestsClient(SITE_ID);
client.saveRequest();
addAnchorsToHeaders();
makePageTocCollapsible();
trackDownloads(client);
</script><noscript><img src="https://hugo-dynamic.endbasic.dev/api/sites/6a633c2c-7fda-11ec-86e4-1cfd087199c2/pages/aHR0cHM6Ly93d3cuZW5kYmFzaWMuZGV2Lw==/stamp.gif" style=display:none></noscript></body></html>