2012-02-09 03:37:04 +00:00
<!DOCTYPE html>
< html >
< head >
< title > Applesoft BASIC in JavaScript< / title >
< link rel = "Stylesheet" href = "styles.css" type = "text/css" >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" > <!-- Suppress browser compat button -->
< script type = "text/javascript" src = "../polyfill/polyfill.js?update=2012-02-08" > < / script >
< script type = "text/javascript" src = "../polyfill/harmony.js?update=2011-12-17" > < / script >
< script type = "text/javascript" >
(function () {
function load(url) { document.write('< script type = "text/javascript" src = "' + url + '" > < / ' + ' s c r i p t > ' ) ; }
if (!window.JSON) { load('../polyfill/json2.js'); }
if (!window.localStorage || !window.sessionStorage) { load('../polyfill/storage.js'); }
if (!('getContext' in document.createElement('canvas'))) { load('../polyfill/flashcanvas.js'); }
}());
< / script >
< script type = "text/javascript" src = "../polyfill/keyboard.js" > < / script >
< / head >
< body >
< h1 > Applesoft BASIC in Javascript< / h1 >
< p >
By < a href = "mailto:inexorabletash@hotmail.com" > Joshua Bell< / a >
| < a target = "_blank" href = "reference.htm" > Applesoft BASIC Quick Reference< / a >
| < a href = "#notes" > Notes & Known Issues< / a >
| < a href = "#todo" > To Do< / a >
| < a href = "#links" > Links< / a >
2013-05-07 03:26:59 +00:00
| < a href = "#changes" > Changes< / a >
2012-02-09 03:37:04 +00:00
< p > Related projects:
< a href = "/Logo" > Logo in Javascript< / a >
| < a href = "/vnIIc" > Streaming video to an Apple II - vnIIc< / a >
< / p >
< br clear = left >
<!-- Screen -->
2012-06-20 15:54:40 +00:00
< div id = "frame" class = "frame" style = "float: left; margin: 5px;" >
2012-02-09 03:37:04 +00:00
< div id = "screen-wrapper" class = "wrapper" >
2012-07-22 03:35:54 +00:00
< div id = "lores" class = "lores" > < / div >
< canvas id = "hires" width = "560" height = "384" class = "hires" > < / canvas >
< canvas id = "hires2" width = "560" height = "384" class = "hires" > < / canvas >
< div id = "screen" class = "tty" > < / div >
< / div >
2012-02-09 03:37:04 +00:00
< / div >
<!-- Keyboard - positioned offscreen -->
< input id = "keyboard" class = "keyboard" type = "text" title = "Hidden Keyboard Input Device" >
<!-- Source -->
2012-06-20 15:54:40 +00:00
< div style = "float: left; margin: 5px;" >
2012-07-22 03:35:54 +00:00
Enter code:
< input type = "button" value = "Run" id = "btn_run" >
< input type = "button" value = "Stop" id = "btn_stop" disabled = "disabled" >
2012-02-09 03:37:04 +00:00
2012-07-22 03:35:54 +00:00
< select id = "lb_files" >
< option disabled selected = "selected" > Select a file...< / option >
< option value = "sample.basic" > DEMOS< / option >
2012-02-09 03:37:04 +00:00
< option disabled > ---- Tests ----< / option >
2012-07-22 03:35:54 +00:00
< option value = "sample.unittests" > Unit Tests< / option >
2012-02-09 03:37:04 +00:00
< option value = "sample.keyboard" > Keyboard Test< / option >
< option value = "sample.charset" > Charset Test< / option >
< option disabled > ---- User Submissions ----< / option >
< option disabled > Games< / option >
2012-07-22 03:35:54 +00:00
< option value = "simple.pong" > SIMPLE.PONG< / option >
< option value = "sample.adventure" > Text Adventure (Floyd McWilliams)< / option >
< option value = "sample.pacman" > (Not Really) ASCII Pac-Man (Michael Kemp)< / option >
< option value = "sample.puzzler" > Puzzler (Gregg Buntin)< / option >
< option value = "sample.hangman" > Hangman (Mike Gleason)< / option >
2012-02-09 03:37:04 +00:00
< option value = "sample.raindrops" > Catch the Raindrop (Nicholas Merchant)< / option >
< option value = "sample.jot" > JOT (Mike Gleason)< / option >
< option disabled > Graphics< / option >
2012-07-22 03:35:54 +00:00
< option value = "sample.rodscolorpattern" > Rod's Color Pattern< / option >
< option value = "sample.hacker" > Hacker Logo (markwstock)< / option >
< option value = "sample.loreswalk" > Random LoRes (John Melesky)< / option >
< option value = "sample.hireswalk" > Random HiRes (John Melesky)< / option >
< option value = "sample.sierpinski" > Sierpinski Triangles (Kevin Miller)< / option >
< option value = "sample.stringart" > String Art (Chris Heric)< / option >
< option value = "sample.paint" > Drawing Program (Brian Broker)< / option >
< option value = "sample.scribble" > Scribble (William Simms)< / option >
< option value = "sample.connections" > Connections (Gregg Buntin)< / option >
< option value = "sample.squiggle" > Squiggle (Gregg Buntin)< / option >
< option value = "sample.boys_surface" > Boy's Surface (Lukas Innig)< / option >
< option value = "sample.gaussian" > Gaussian Distribution 2D (John Russ)< / option >
< option value = "sample.bitmaps" > Bitmap Images (Brian Broker)< / option >
< option value = "sample.mandelbrot" > Mandelbrot Set (c/o Gregory Lewis)< / option >
< option value = "sample.mandelbrot2" > Mandelbrot Set in Color< / option >
< option value = "sample.steve" > Steve (Nicola Foggi)< / option >
2013-05-06 04:12:26 +00:00
< option value = "sample.logo" > Apple Logo (Brendan Robert)< / option >
2012-02-09 03:37:04 +00:00
< option disabled > Other< / option >
2012-07-22 03:35:54 +00:00
< option value = "sample.primes" > Prime Sieve (Kevin Miller)< / option >
< option value = "sample.february" > February Surprise (Antti Pirskanen)< / option >
< option value = "sample.hellosine" > Hello World Sine Wave (Jamie Beu)< / option >
2012-02-09 03:37:04 +00:00
< option value = "sample.bodymass" > Body Mass Index Calculator (Tim Dwyer)< / option >
< option disabled > ---- Traveller RPG Utilities ----< / option >
2012-07-22 03:35:54 +00:00
< option value = "TRADER C" > TRADER< / option >
< option value = "sample.sectorgen" > Traveller Sector Generator< / option >
< option value = "sample.zhorelay" > Zhodani Relay Station Placement< / option >
< option value = "sample.readsector" > Read Sector File< / option >
< / select >
2012-02-09 03:37:04 +00:00
< input type = "button" id = "btn_capture" value = "Echo to "Printer"" title = "Pops up a "printer" window and echoes all output there, so you can copy/paste" >
<!-- Source code editor inserted here -->
< div id = "editorframe" > < / div >
2012-06-20 16:13:06 +00:00
< form id = "submission" method = "post" enctype = "text/plain" action = "mailto:inexorabletash@gmail.com?subject=Applesoft%20Sample%20Submission" >
2012-02-09 03:37:04 +00:00
< textarea name = "source" id = "source" style = "display: none;" >
< / textarea >
< input type = "submit" id = "btn_share" value = "Share your sample!" >
< input type = "button" id = "btn_save" value = "Save Program" title = "Save the current program. NOTE: Can only save one program." >
< input type = "button" id = "btn_load" value = "Load Program" title = "Load a previously saved program. WARNING: The current program will be lost!" >
< / form >
< / div >
< br clear = left >
< h3 id = "notes" > Notes & Known Issues< / h3 >
< ul >
< li > The BASIC program is compiled to JavaScript before execution. Syntax errors are therefore detected at compile-time
rather than at run-time as on a traditional interpreter. For example, the following program would run without errors
on an Apple since the erroneous second statement is never reached. < code > 10 END : CHR$(PRINT)< / code >
< li > Handling of BASIC code that does not match the canonical < code > LIST< / code > output format may not behave as on an Apple:
< ul >
2012-07-22 03:35:54 +00:00
< li > Keyword parsing differs from Applesoft command line. For example < code > FOR I = S TO P< / code > doesn't collapse into < code > FOR I = STOP< / code > .
< li > The interpreter doesn't actually care about line numbers for statement ordering (just for < code > GOTO< / code > /< code > GOSUB< / code > targets and < code > IF< / code > statements). So < code > 20 PRINT "A"< / code > , < code > 10 PRINT "B"< / code > will just print A, then B
2012-02-09 03:37:04 +00:00
< / ul >
< li > To improve readability, lines may start with < code > :< / code > and continue the previously numbered line.
< li > Floating point overflow is only detected on variable assignment.
< li > The DOS operating system implements only a subset of DOS 3.3 and ProDOS useful for basic file I/O.
< li > Except for a small number of compatibility shims for common operations (e.g. keyboard strobe), commands that refer to assembly routines (< code > PEEK< / code > , < code > POKE< / code > , < code > CALL< / code > , < code > USR< / code > etc.), shape tables, or tape I/O are not implemented.
< li > Commands that operate on the program itself (< code > LIST< / code > , < code > RUN< / code > , < code > DEL< / code > , etc.) are not implemented.
< li > You can run your basic programs from the command line (with only basic text input and output, and no graphics or DOS commands):
< ul >
< li > On Windows, download < a href = "basic.js" > basic.js< / a > and run from a command prompt via:
< code > cscript.exe basic.js your_basic_program.txt< / code >
< li > On Mac/Linux, install < a href = "http://www.mozilla.org/rhino/" > Mozilla Rhino< / a > ,
download < a href = "basic.js" > basic.js< / a > and run from the command prompt via:
< code > java -jar PATH_TO/js.jar basic.js your_program.txt< / code >
< / ul >
< / ul >
< h3 id = "todo" > To Do< / h3 >
< ul >
2012-07-22 03:35:54 +00:00
< li > Implement DOS functionality for consoles
2012-02-09 03:37:04 +00:00
< / ul >
< h3 id = "links" > Links< / h3 >
< ul >
2012-07-22 03:35:54 +00:00
< li > < a href = "http://www.6502asm.com/" > 6502asm.com< / a > - a 6502 assembler/emulator in JavaScript
< li > < a href = "http://www.quitebasic.com/" > Quite BASIC< / a > - a similar project aimed at teaching programming
< li > < a href = "http://navahogunleg.net/blog/my-projects/ng-basic/" > NG-BASIC for Javascript< / a > Navaho Gunleg's interpreter
< li > < a href = "http://www.nicholson.com/rhn/basic/" > BASIC Programming Resources< / a >
< li > < a href = "http://www.scullinsteel.com/apple2/" > Apple II emulator in JavaScript< / a >
2012-02-09 03:37:04 +00:00
< / ul >
2013-05-07 03:26:59 +00:00
< h3 id = "changes" > Changes< / h3 >
< p > The source is tracked on < a href = "http://github.com" > GitHub< / a > at < a href = "https://github.com/inexorabletash/jsbasic/" > https://github.com/inexorabletash/jsbasic/< / a > .
< p > Older changes are documented in the < a href = "https://github.com/inexorabletash/jsbasic/blob/master/CHANGELOG" > CHANGELOG< / a >
2012-02-09 03:37:04 +00:00
2012-06-20 16:13:06 +00:00
<!-- CodeMirror syntax highlighting - this is optional -->
2012-02-09 03:37:04 +00:00
< script src = "cm2/lib/codemirror.js" > < / script >
< link rel = "stylesheet" href = "cm2/lib/codemirror.css" >
< script src = "cm2/mode/basic/basic.js" > < / script >
< link rel = "stylesheet" href = "cm2/mode/basic/basic.css" >
< style type = "text/css" >
.CodeMirror { border: solid 1px black; width: 598px; height: 384px; background-color: white; }
.CodeMirror-scroll { height: 100%; }
< / style >
< script type = "text/javascript" src = "basic.js?2012-02-08" > < / script >
< script type = "text/javascript" src = "bell.js" > < / script >
< script type = "text/javascript" src = "tty.js" > < / script >
< script type = "text/javascript" src = "lores.js" > < / script >
< script type = "text/javascript" src = "hires.js" > < / script >
< script type = "text/javascript" src = "dos.js" > < / script >
< script type = "text/javascript" src = "printer.js" > < / script >
< script type = "text/javascript" src = "index.js" > < / script >
< script type = "text/javascript" >
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-18610679-3']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
< / script >
< / body >
< / html >