Integer BASIC

Revision as of 01:11, 23 May 2025 by imported>ExplorerofSpace (Undid revision 1291729334 by 112.198.120.204 (talk))
(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)

Template:Short description Template:Infobox programming language

Integer BASIC is a BASIC interpreter written by Steve Wozniak for the Apple I and Apple II computers. Originally available on cassette for the Apple I in 1976, then included in ROM on the Apple II from its release in 1977, it was the first version of BASIC used by many early home computer owners.Template:Sfn

The only numeric data type was the integer; floating-point numbers were not supported. Using integers allowed numbers to be stored in a compact 16-bit format that could be more rapidly read and processed than the 32- or 40-bit floating-point formats found in most BASICs of the era. This made it so fast that Bill Gates complained when it outperformed Microsoft BASIC in benchmarks. However, this also limited its applicability as a general-purpose language.Template:Efn

Another difference with other BASICs of the era is that Integer BASIC treated strings as arrays of characters, similar to the system in C or Fortran 77. Substrings were accessed using array slicing rather than string functions. This style was introduced in HP Time-Shared BASIC, and could also be found in other contemporary BASICs patterned on HP, like North Star BASIC and Atari BASIC. It contrasted with the style found in BASICs derived from DEC, including Microsoft BASIC.

The language was initially developed under the name GAME BASIC and referred to simply as Apple BASIC when it was introduced on the Apple I. It became Integer BASIC when it was ported to the Apple II and shipped alongside Applesoft BASIC, a port of Microsoft BASIC which included floating-point support. Integer BASIC was phased out in favor of Applesoft BASIC starting with the Apple II Plus in 1979.

HistoryEdit

As a senior in high school, Steve Wozniak's electronics teacher arranged for the leading students in the class to have placements at local electronics companies. Wozniak was sent to Sylvania where he programmed in FORTRAN on an IBM 1130.<ref>Template:Cite interview</ref> That same year, General Electric placed a terminal in the high school that was connected to one of their mainframes running their time-sharing BASIC service, which they were heavily promoting at the time. After being given three days of access, the students were asked to write letters on why the school should receive a terminal permanently, but their efforts were ultimately unsuccessful.Template:Sfn

Some years later, Wozniak was working at Hewlett-Packard (HP) running simulations of chip designs and logic layout for calculators.Template:Sfn HP made major inroads in the minicomputer market with their HP 2000 series machines running a custom timesharing version of BASIC. For approximately Template:US$, one could build up a reasonably equipped machine that could support between 16 and 32 users running BASIC programs.<ref>Template:Cite magazine</ref> While expensive, it was still a fraction of the cost of the mainframe machinesTemplate:Efn and, for heavy users, less than the timesharing services.Template:Efn HP followed this with the HP 9830, a desktop-sized machine for Template:US$ that also ran BASIC, which Wozniak had access to.Template:Sfn

Template:Quote box

In January 1975 the Altair 8800 was announced and sparked off the microcomputer revolution. In March, Wozniak attended the first meeting of the Homebrew Computer Club and began formulating the design of his own computer. One of the most important pieces of software for the Altair, and one of the most heavily pirated, was Altair BASIC from the recently formed Microsoft.<ref>Template:Cite book</ref> Wozniak concluded that his machine would have to have a BASIC of its own, which would, hopefully, be the first for the MOS Technology 6502 processor. As the language needed 4 KB RAM, he made that the minimum memory for the design.Template:Sfn

Wozniak's references for BASIC were a copy of 101 BASIC Computer Games and an HP BASIC manual.Template:Sfn He did not know that HP's BASIC was very different from the DEC BASIC variety used in 101 Games, which was also the basis of Microsoft BASIC for the Altair. Based on these sources, Wozniak began sketching out a syntax chart for the language. The design initially included floating-point support, but still hoping he might publish the first BASIC on the 6502 and become "a star", he decided to abandon floating-point and write a separate integer math system to save a few weeks programming time.Template:Sfn

Wozniak would later describe his language as "intended primarily for games and educational uses".Template:Sfn Referring to it throughout development as "GAME BASIC", Wozniak wrote the code by hand, translating the assembler code instructions into their machine code equivalents and then uploading the result to his computer.Template:Sfn Without any training on how to write a computer language, he used his HP calculator experience to implement a stack machine to interpret expressions. Once the basic routines were up and running, he worked on the other commands one-by-one in a modular fashion. With every visit to the Homebrew club, he demonstrated a few more features added in the last month.Template:Sfn

Template:Quote box

File:Apple 1 Advertisement Oct 1976.jpg
Ad for the Apple I computer noting Apple's policy of providing free or inexpensive software for its computers.

In early 1976 ads for its Apple I computer, Apple Inc made the claims that "our philosophy is to provide software for our machines free or at minimal cost"<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> and "yes folks, Apple BASIC is Free".<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> This was printed shortly after Bill Gates's infamous Open Letter to Hobbyists that suggested that people were robbing him by copying versions of Altair BASIC.<ref name="Computer Notes - Bunnell">Template:Cite journal</ref>

Wozniak had helped Steve Jobs, who worked for Atari, with a redesign of Breakout.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> At some later point, he decided to see whether one could write the game in BASIC. He added commands to read paddle controllers and over a series of quick edits had a version of the game up and running. To improve its playability, he added a speaker to make clicks when the ball hit things. While showing it to Jobs, Wozniak demonstrated that he could quickly change the colors that his game used, just by altering the source code. Wozniak later wrote that he had proved that "software was much more flexible than hardware", and that he and Jobs realized that "now, anyone could create arcade games without having to design it in hardware."Template:Sfn

Wozniak did complete a floating-point library for the 6502 and published it in the August 1976 edition of Dr. Dobb's Journal.<ref>Template:Cite magazine</ref> This library was later made part of the ROMs for the Apple II.<ref>Template:Cite book</ref> Wozniak began work on back-porting the floating-point code into Apple BASIC, but got sidetracked in the task of designing a floppy disk controller for what became the Disk II. Mike Markkula said the company would go to the Consumer Electronics Show in Las Vegas if the disk system was ready in time, so Wozniak and Randy Wigginton worked on it non-stop through the 1977 holidays.Template:Sfn

When he returned to the topic of floating-point in BASIC, Jobs complained it was taking too long. Without Wozniak being aware, the company had already arranged a license with Microsoft to receive their recently completed 6502 version of the Altair code. Examining the MS code, Wozniak decided that it was easier to add graphics support to their code than add floating-point his own BASIC, as the latter required hand-patching of the original machine code while MS's was written in assembler and more easily modified. The development of Apple's BASIC ended in favor of what became Applesoft BASIC. Wozniak later noted, "My biggest disappointment was going to the awful string functions like <syntaxhighlight lang="basic" class="" style="" inline="1">LEFT$(VAR, 5)</syntaxhighlight> and <syntaxhighlight lang="basic" class="" style="" inline="1">MID$(VAR2,5,3)</syntaxhighlight> instead of my own".Template:SfnTemplate:Efn

When the Apple II shipped in the summer of 1977, Integer BASIC was supplied in ROM, while Applesoft BASIC shipped on cassette. This changed with the introduction of the Apple II Plus in 1979, when Applesoft was put in the ROM.Template:Sfn

DescriptionEdit

Program editingEdit

Like most BASIC implementations of the era, Integer BASIC acted as both the language interpreter as well as the line editing environment. When BASIC was running, a <syntaxhighlight lang="text" class="" style="" inline="1">></syntaxhighlight> command prompt was displayed where the user could enter statements.Template:SfnTemplate:Efn Unlike later home computer platforms, BASIC was not the default environment when the Apple II started, it normally started in the monitor. BASIC was started by pressing Template:Key pressTemplate:Key press.Template:Sfn

Statements that were entered with leading numbers are entered into the program storage for "deferred execution",Template:Sfn either as new lines or replacing any that might have had the same number previously.Template:Sfn Statements that were entered without a line number were referred to as commands, and ran immediately.Template:Efn Line numbers could be from 0 to 32767,Template:SfnTemplate:Efn and lines could contain up to 128 characters.Template:Sfn

Integer BASIC also included the <syntaxhighlight lang="text" class="" style="" inline="1">AUTO</syntaxhighlight> command to automatically enter line numbers at a given starting number like <syntaxhighlight lang="text" class="" style="" inline="1">AUTO 100</syntaxhighlight>, adding 10 to the last number with every new line. <syntaxhighlight lang="text" class="" style="" inline="1">AUTO 300,5</syntaxhighlight> would begin numbering at line 300 by fives; 300, 305, etc. Automatic numbering was turned off by entering <syntaxhighlight lang="text" class="" style="" inline="1">MAN</syntaxhighlight>.Template:Sfn

One interesting feature of the editor was that a section of the screen could be set aside as the "window", where live updates took place. This was normally the entire screen, but it could be limited to a smaller area by <syntaxhighlight lang="text" class="" style="" inline="1">POKE</syntaxhighlight>ing values into memory locations 32 through 35.Template:Sfn This feature could be used to create an editable text area while the rest of the screen was in graphics mode.Template:Sfn

DebuggingEdit

As in most BASICs, programs were started with the <syntaxhighlight lang="text" class="" style="" inline="1">RUN</syntaxhighlight> command, and as was common, could be directed at a particular line number like <syntaxhighlight lang="text" class="" style="" inline="1">RUN 300</syntaxhighlight>.Template:Sfn Execution could be stopped at any time using Template:Key pressTemplate:Sfn and then restarted with <syntaxhighlight lang="text" class="" style="" inline="1">CON</syntaxhighlight>tinue, as opposed to the more typical <syntaxhighlight lang="text" class="" style="" inline="1">CONT</syntaxhighlight>.Template:Sfn

For step-by-step execution, the <syntaxhighlight lang="text" class="" style="" inline="1">TRACE</syntaxhighlight> instruction could be used at the command prompt or placed within the program itself. When it was turned on, line numbers were printed out for each line the program visited. The feature could be turned off again with <syntaxhighlight lang="text" class="" style="" inline="1">NOTRACE</syntaxhighlight>.Template:Sfn

A somewhat unusual feature was the <syntaxhighlight lang="text" class="" style="" inline="1">DSP</syntaxhighlight> (for "display") command. When encountered in a program, from that point on any changes to a variable's value would be displayed. For instance, <syntaxhighlight lang="text" class="" style="" inline="1">DSP X</syntaxhighlight> would display the value of X every time it changed, along with the line number where the change occurred.Template:Sfn As with TRACE, DSP was turned off with <syntaxhighlight lang="text" class="" style="" inline="1">NODSP</syntaxhighlight>.Template:Sfn

Variable namesEdit

Where Dartmouth BASIC and HP-BASIC limited variable names to at most two characters (either a single letter or a letter followed by one digit), and where MS-BASIC allowed a letter followed by an optional letter or digit (ignoring subsequent characters), Integer BASIC was unusual in supporting any length variable name (e.g., SUM, GAMEPOINTS, PLAYER2). The only caveat was that variable names could not contain reserved words; for example, THISCOLOR and COLORFUL were invalid variable names because they contained the keyword <syntaxhighlight lang="text" class="" style="" inline="1">COLOR</syntaxhighlight>, a system command.Template:Sfn Additionally, lines were limited to 128 characters, so variable names could not exceed that length.Template:Sfn

MathematicsEdit

Integer BASIC, as its name implies, uses integers as the basis for its math package. These were stored internally as a 16-bit number, little-endian (as is the 6502). This allowed a maximum value for any calculation between -32767 and 32767; although the format could also store the value -32768, BASIC could not display that number. Calculations that resulted in values outside that range produced a <syntaxhighlight lang="text" class="" style="" inline="1">>32767 ERR</syntaxhighlight>.Template:Sfn

Infix operators included <syntaxhighlight lang="text" class="" style="" inline="1">+</syntaxhighlight> (addition), <syntaxhighlight lang="text" class="" style="" inline="1">-</syntaxhighlight> (subtraction), <syntaxhighlight lang="text" class="" style="" inline="1">*</syntaxhighlight> (multiplication), <syntaxhighlight lang="text" class="" style="" inline="1">/</syntaxhighlight> (division), MOD (remainder) and exponent using the <syntaxhighlight lang="text" class="" style="" inline="1">^</syntaxhighlight> character. Binary operators included <syntaxhighlight lang="text" class="" style="" inline="1">AND</syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1">OR</syntaxhighlight> and <syntaxhighlight lang="text" class="" style="" inline="1">NOT</syntaxhighlight>. Binary comparisons included the standard set of <syntaxhighlight lang="text" class="" style="" inline="1">=</syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1">></syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1"><</syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1">>=</syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1"><=</syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1"><></syntaxhighlight> and the HP-inspired <syntaxhighlight lang="text" class="" style="" inline="1">#</syntaxhighlight>, which was equivalent to <>.Template:Sfn

Only single-dimension arrays were allowed, limited in size only by the available memory.Template:Sfn Mathematical functions were sparse; only <syntaxhighlight lang="text" class="" style="" inline="1">ABS</syntaxhighlight> (absolute value), <syntaxhighlight lang="text" class="" style="" inline="1">SGN</syntaxhighlight> (sign) and <syntaxhighlight lang="text" class="" style="" inline="1">RND</syntaxhighlight> (random number) were supported.Template:Sfn In contrast to MS-derived versions, where the parameter was ignored and <syntaxhighlight lang="text" class="" style="" inline="1">RND</syntaxhighlight> always returned a value 0..<1, Integer BASIC used the parameter; <syntaxhighlight lang="text" class="" style="" inline="1">RND(6)</syntaxhighlight> returned an integer from 0 to 5.Template:Sfn

StringsEdit

Integer BASIC's string handling was based on the system in HP BASIC. This treated string variables as arrays of characters which had to be <syntaxhighlight lang="text" class="" style="" inline="1">DIM</syntaxhighlight>ed prior to use. This is similar to the model in C<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> or Fortran 77.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> This is in contrast to MS-like BASICs where strings are an intrinsic variable-length type.<ref>Template:Cite book</ref> Before MS-derived BASICs became the de facto standard, this style was not uncommon; North Star BASIC<ref>Template:Cite book</ref> and Atari BASIC<ref>Template:Cite book</ref> used the same concept, as did others.

Strings in Integer Basic used a fixed amount of memory regardless of the number of characters used within them, up to a maximum of 255 characters.Template:Sfn This had the advantage of avoiding the need for the garbage collection of the heap that was notoriously slow in MS BASICTemplate:Efn but meant that strings that were shorter than the declared length resulted in wasted memory.

Substring access was provided through array slicing syntax. For instance, <syntaxhighlight lang="basic" class="" style="" inline="1">PRINT A$(0,5)</syntaxhighlight> printed the first six characters of <syntaxhighlight lang="text" class="" style="" inline="1">A$</syntaxhighlight>, characters 0 through 5.Template:SfnTemplate:SfnTemplate:Efn Concatenation was provided using the same system, <syntaxhighlight lang="basic" class="" style="" inline="1">A$(5)="ABC"</syntaxhighlight> replaced any characters starting at position 5 with the string "ABC".Template:Sfn This contrasts with the DEC/MS-style string handling which uses string functions like <syntaxhighlight lang="text" class="" style="" inline="1">MID$</syntaxhighlight> to access substrings and <syntaxhighlight lang="text" class="" style="" inline="1">+</syntaxhighlight> for concatenation.<ref>Template:Cite book</ref>Template:Efn

As many of the features that would be provided by string functions were instead provided by array slicing, the selection of string functions was reduced. <syntaxhighlight lang="text" class="" style="" inline="1">LEN</syntaxhighlight> returned the length of a stringTemplate:Sfn and <syntaxhighlight lang="text" class="" style="" inline="1">ASC</syntaxhighlight> returned the ASCII numeric code for the first letter in a string.Template:Sfn It lacked an equivalent of the <syntaxhighlight lang="text" class="" style="" inline="1">CHR$</syntaxhighlight> that returned the ASCII character with a given numeric code.Template:Sfn

Graphics and soundEdit

When launched, the only game controller for the Apple was the paddle controller, which had two controllers on a single connector. The position of the controller could be read using the <syntaxhighlight lang="text" class="" style="" inline="1">PDL</syntaxhighlight> function, passing in the controller number, 0 or 1, like <syntaxhighlight lang="basic" class="" style="" inline="1">A=PDL(0):PRINT A</syntaxhighlight>, returning a value between 0 and 255.Template:SfnTemplate:Efn

The Apple machines did not include dedicated sound hardware, only a simple "beeper". Producing sounds was accomplished by <syntaxhighlight lang="text" class="" style="" inline="1">PEEK</syntaxhighlight>ing the memory-mapped location of the speaker, -16336.Template:Efn Repeatedly PEEKing that value produced tones, and the manual suggested using a mathematical expression to do this, like <syntaxhighlight lang="basic" class="" style="" inline="1">S=PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)</syntaxhighlight>.Template:Sfn

Support for graphics was more detailed. Graphics mode was turned on with the <syntaxhighlight lang="text" class="" style="" inline="1">GR</syntaxhighlight> statement and off with <syntaxhighlight lang="text" class="" style="" inline="1">TEXT</syntaxhighlight>.Template:Sfn Drawing was modal and normally started by issuing a command to change the color, which was accomplished by setting a pseudo-variable; <syntaxhighlight lang="text" class="" style="" inline="1">COLOR=12</syntaxhighlight> would set the drawing color to 12, light green. One could then <syntaxhighlight lang="text" class="" style="" inline="1">PLOT 10,10</syntaxhighlight> to produce a single spot of that color,Template:Sfn <syntaxhighlight lang="text" class="" style="" inline="1">HLIN 0,39 AT 20</syntaxhighlight> to draw a horizontal line at row 20 that spanned the screen, or <syntaxhighlight lang="text" class="" style="" inline="1">VLIN 5,15 AT 7</syntaxhighlight> to draw a shorter vertical line down column 7.Template:Sfn <syntaxhighlight lang="text" class="" style="" inline="1">A=SCRN X,Y</syntaxhighlight> returned the color of the screen at X,Y.Template:SfnTemplate:Efn

Input/outputEdit

Integer BASIC lacked any custom input/output commands, and also lacked the <syntaxhighlight lang="text" class="" style="" inline="1">DATA</syntaxhighlight> statement and the associated <syntaxhighlight lang="text" class="" style="" inline="1">READ</syntaxhighlight>. To get data into and out of a program, the input/output functionality was redirected to a selected card slot with the <syntaxhighlight lang="text" class="" style="" inline="1">PR#x</syntaxhighlight> and <syntaxhighlight lang="text" class="" style="" inline="1">IN#x</syntaxhighlight>, which redirected output or input (respectively) to the numbered slot. From then on, data could be sent to the card using conventional <syntaxhighlight lang="text" class="" style="" inline="1">PRINT</syntaxhighlight> commands and read from it using <syntaxhighlight lang="text" class="" style="" inline="1">INPUT</syntaxhighlight>.Template:Sfn

Other notesEdit

Integer BASIC included a <syntaxhighlight lang="text" class="" style="" inline="1">TAB</syntaxhighlight> feature, which positioned the cursor on a given column from 0 to 39. It differed from the versions found in most BASICs in that it was a command with a following number, as opposed to a function with the value in parentheses; one would move the cursor to column 10 using <syntaxhighlight lang="text" class="" style="" inline="1">TAB 10</syntaxhighlight> in Integer BASICTemplate:Sfn whereas in MS this would be <syntaxhighlight lang="text" class="" style="" inline="1">PRINT TAB(10)</syntaxhighlight>. Additionally, the <syntaxhighlight lang="text" class="" style="" inline="1">VTAB</syntaxhighlight> command worked similar to <syntaxhighlight lang="text" class="" style="" inline="1">TAB</syntaxhighlight> but added vertical spaces instead of horizontal. For unexplained reasons, in this case the coordinates were from 1 to 24 rather than 0 to 23.Template:Sfn

Integer BASIC included a <syntaxhighlight lang="text" class="" style="" inline="1">POP</syntaxhighlight> command to exit from loops.Template:Sfn This popped the topmost item off the FOR stack. Atari BASIC also supported the same command,<ref>Template:Cite book</ref> while North Star BASIC used <syntaxhighlight lang="text" class="" style="" inline="1">EXIT</syntaxhighlight>.<ref>Template:Cite book</ref>

The Integer BASIC ROMs also included a machine code monitor, "mini-assembler", and disassembler to create and debug assembly language programs. Wozniak hand-assembled the monitor as the Apple II's first program, then used it to write Integer BASIC.Template:SfnTemplate:SfnTemplate:Sfn

Reserved wordsEdit

Apple BASICEdit

Apple BASIC had the following commands:<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> <syntaxhighlight lang="basic"> AUTO val1, val2 CLR [CLEAR] DEL val1, val2 LIST val1, val2 RUN val1 SCR [SCRATCH / NEW] HIMEM = expr LOMEM = expr (LET) var = expr INPUT (prompt,) var1, var2 ... PRINT item(s) TAB expr FOR var = expr1 TO expr2 STEP expr3 NEXT var IF expr THEN statement IF expr THEN line number GOTO expr GOSUB expr RETURN DIM var1(expr1), var2(expr2) ... REM text END POKE expr1, expr2 CALL expr Functions: ABS(), SGN(), PEEK(), RND(), LEN() </syntaxhighlight>

Integer BASICEdit

Integer BASIC added the following:<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref><ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> <syntaxhighlight lang="basic"> COLOR = expr CON [CONTINUE] DSP GR HLIN expr1, expr2 AT expr3 MAN NEW [replaces SCR] NOTRACE PLOT expr1, expr2 POP TEXT TRACE VLIN expr1, expr2 AT expr3 Function: ASC(), PDL(), SCRN(X,Y) </syntaxhighlight>

ImplementationEdit

Integer BASIC read the lines typed in by the user from a buffer and ran them through a parser which output a series of tokens. As part of this process, simple syntax errors were detected and listed. If the parsing was successful, the line number (if present) was converted from ASCII decimal format into a 16-bit integer and any keywords into a 7-bit integer token.Template:Sfn

Some keywords were represented by multiple tokens; for instance, where Microsoft BASIC had one token for the keyword <syntaxhighlight lang="text" class="" style="" inline="1">PRINT</syntaxhighlight>, Integer BASIC had three tokens: one if the keyword was followed by no arguments, one if followed by an arithmetic expression, and one if followed by a string literal.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}Template:Dead link</ref>

Numeric literals, like the value 500, were converted into their 16-bit (two-byte) binary representation, in this case, Template:Mono hexadecimal. To indicate this was a value and not a keyword, a single byte between Template:Mono and Template:Mono was inserted in front of the two-byte value.Template:Efn String literals, like "HELLO WORLD" were instead converted by setting the high bit of each character so that <syntaxhighlight lang="text" class="" style="" inline="1">A</syntaxhighlight> was stored as Template:Mono. Variable names were converted in the same fashion, with the letters converted to have their high-bit turned on, and any digits in the name represented by the corresponding Template:Mono through Template:Mono, so that the variable <syntaxhighlight lang="text" class="" style="" inline="1">A5</syntaxhighlight> would be tokenized as Template:Mono.Template:Sfn

If the line was entered without a line number, the code was then executed directly from the buffer. If it had a line number, it was copied from the buffer into the program storage area.Template:Sfn

The runtime interpreter used two stacks for execution: one for statement keywords and the other for evaluating the parameters. Each statement was given two priorities: one that stated where it should occur in a multi-step operation, like a string of mathematical operations to provide order of operations, and another that suggested when evaluation should occur, for instance, calculating internal values of a parentheses formula. When variables were encountered, their name was parsed and then looked up in the variable storage area. If it was not found, it was added to the end of the list. The address of the variable's storage, perhaps freshly created, was then placed on the evaluation stack.Template:Sfn

ROM detailsEdit

SWEET16Edit

{{#invoke:Labelled list hatnote|labelledList|Main article|Main articles|Main page|Main pages}} In addition to Integer BASIC, the Apple ROMs contained a custom assembler language known as SWEET16. SWEET16 is based on bytecodes that run within a simple 16-bit virtual machine. This model was used so memory could be addressed via indirect 16-bit pointers and 16-bit math functions calculated without the need to translate those to the underlying multi-instruction 8-bit 6502 code. The entire virtual machine was written in only 300 bytes. Code can call SWEET16 by issuing a subroutine call, and then return to normal 6502 code when the 16-bit operations are complete.Template:Sfn

SWEET16 was not used by the core BASIC code, but was later used to implement several utilities. Notable among these was the line renumbering routine, which was included in the Programmer's Aid #1 ROM, added to later Apple II models and available for user installation on earlier examples.<ref>Template:Cite book</ref>

Floating pointEdit

Although Integer BASIC contained its own math routines, the Apple II ROMs also included a complete floating-point library located in ROM memory between <syntaxhighlight lang="text" class="" style="" inline="1">$F425-$F4FB</syntaxhighlight> and <syntaxhighlight lang="text" class="" style="" inline="1">$F63D-$F65D</syntaxhighlight>. The source code was included in the Apple II manual. BASIC programs requiring floating-point calculations could CALL into these routines.<ref>Template:Cite book</ref>

PerformanceEdit

Because Integer BASIC processed more of the original source code into tokens, the runtime was faster than versions that required additional runtime parsing. For comparison, Tiny BASIC tokenized only the line number,<ref>Template:Cite magazine</ref> while MS BASICs tokenized only the keywords. So for instance, while Integer BASIC would convert the line <syntaxhighlight lang="text" class="" style="" inline="1">100 GOTO 200</syntaxhighlight> entirely into tokens that could be immediately read and performed, in MS BASIC only the line number and GOTO would be tokenized, the "200" was left in its original ASCII format and had to be re-parsed into a 16-bit integer every time the line was encountered.<ref name=altair>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref>

Additionally, working solely with integer math provides another major boost in speed. This is due both to the smaller 16-bit format requiring fewer memory accesses, as well as removing the need to move the floating-point decimal after calculations. As many computer benchmarks of the era were small and often performed simple math that did not require floating-point, Integer BASIC trounced most other BASICs.Template:Efn

On one of the earliest known microcomputer benchmarks, the Rugg/Feldman benchmarks, Integer BASIC was well over twice as fast as Applesoft BASIC on the same machine.<ref name=rugg>Template:Cite magazine</ref> In the Byte Sieve, where math was less important but array access and looping performance dominated, Integer BASIC took 166 seconds while Applesoft took 200.<ref>Template:Cite magazine</ref> A review of Galfo Systems' Integer BASIC Compiler found that it produced code that is about 1.5 to eight times faster than compiled Applesoft BASIC, ten times faster than interpreted Integer BASIC, and 15 times faster than interpreted Applesoft.<ref name="byte198209">Template:Cite magazine</ref> Integer BASIC did not appear in the Creative Computing Benchmark, which was first published in 1983, by which time the language was no longer included with Apple computers.<ref>Template:Cite magazine</ref>

The following test series, taken from both of the original Rugg/Feldman articles,<ref name=rugg/><ref name=rugg2/> show Integer's performance relative to the MS-derived BASIC on the same platform.

System CPU BASIC Test 1 Test 2 Test 3 Test 4 Test 5 Test 6 Test 7
Apple II 6502 @ 1 MHz Integer BASIC 1.3 3.1 7.2 7.2 8.8 18.5 28.0
Apple II 6502 @ 1 MHz Applesoft BASIC 1.3 8.5 16.0 17.8 19.1 28.6 44.8

Here is a summary of what each test did:

  • Test 1: for/next loop to 1000.
  • Test 2: if/then loop with compare to 1000.
  • Test 3: same as 2 with added multiplication, division, addition subtraction by same variable.
  • Test 4: same as 3 with added multiplication, division, addition subtraction by constants.
  • Test 5: same as 4 with added subroutine call.
  • Test 6; same as 5 with added inner loop.
  • Test 7: same as 6 with added table population.

Sample codeEdit

The following is a version of Breakout written in the 1977 version of Integer BASIC for the Apple II, which was listed in the Apple II Mini Manual.Template:Sfn There are a number of known bugs in this version.<ref name="breakout">{{#invoke:citation/CS1|citation |CitationClass=web }}</ref>

The program starts by setting the display to <syntaxhighlight lang="text" class="" style="" inline="1">TEXT</syntaxhighlight> and then <syntaxhighlight lang="text" class="" style="" inline="1">CALL -936</syntaxhighlight> to clear the screen. Lines 20 through 27, and the associated subroutines at line 100 and 200, are the color selection code Wozniak demonstrated for Jobs. Line 30 sets up the text window with <syntaxhighlight lang="text" class="" style="" inline="1">POKE 32,20</syntaxhighlight>Template:Efn and then uses a series of <syntaxhighlight lang="text" class="" style="" inline="1">COLOR</syntaxhighlight> and <syntaxhighlight lang="text" class="" style="" inline="1">VLIN</syntaxhighlight> statements to draw the playfield and the score display in the text window. The entire main loop runs from line 40 through 90 with associated subroutines. Another large amount of code near the end of the program is concerned with printing the final score. Other notes of interest include the <syntaxhighlight lang="text" class="" style="" inline="1">#</syntaxhighlight> (not-equal) comparisons on line 20, the production of a high-pitch sound using a string of <syntaxhighlight lang="text" class="" style="" inline="1">PEEK</syntaxhighlight>s on line 65 compared to a lower-pitched tone using a loop on line 70, and the mix of graphics and text on a single display.Template:Efn

<syntaxhighlight lang="bbcbasic"> 5 TEXT: CALL -936: VTAB 4: TAB 10: PRINT "*** BREAKOUT GAME ***": PRINT 7 PRINT " OBJECT IS TO DESTROY ALL BRICKS WITH 5 BALLS": FOR N=1 TO 7000: NEXT N 10 DIM A$(20),B$(20): GR: PRINT: INPUT "HI, WHAT'S YOUR NAME? ",A$:A=1:B=13:C=9:D=6:E=15: PRINT "STANDARD COLORS,"; A$; 20 INPUT "? ",B$: IF B$#"N" AND B$#"NO" THEN 30: FOR I=0 TO 39: COLOR=I/2*(I<32): VLIN 0,39 AT I 25 NEXT I: POKE 34,20: PRINT: PRINT: PRINT: FOR I=0 TO 15: VTAB 21+I MOD 2: TAB I+I+1: PRINT I;: NEXT I: POKE 34,22: VTAB 24: PRINT: PRINT "BACKGROUND"; 27 GOSUB 100: A=E: PRINT "EVEN BRICK";: GOSUB 100: B=E: PRINT "ODD BRICK";: GOSUB 100: C=E: PRINT "PADDLE";: GOSUB 100: D=E : PRINT "BALL";: GOSUB 100 30 POKE34,20:COLOR=A:FORI=0TO39:VLIN0,39ATI:NEXTI:FOR I=20TO34STEP2:TAB I+1:PRINT I/2-9;:COLOR=B:VLIN 0,39 AT I:COLOR=C:FOR J=I MOD 4 TO 39 STEP4 35 VLIN J,J+1 AT I: NEXT J,I: TAB 5: PRINT "SCORE = 0": PRINT: PRINT: POKE 34,21: S=0: P=S: L=S: X=19: Y=19: X=19 40 COLOR=A:PLOTX,Y/3:X=19:Y=RND(120):V=-1:W=RND(5)-2:L=L+1:IFL>5THEN140:TAB6:PRINT"BALL #";L:PRINT:FORI=1TO100:GOSUB200:NEXTI:M=1:N=0 50 J=Y+W: IF J>=0 AND J<120 THEN 60: W=-W: J=Y: FOR I=1 TO 6: K=PEEK(-16336): NEXT I 55 IF PEEK(-16287)>127 THEN SW=1-SW 60 I=X+V: IF I<0 THEN 400: GOSUB 200: COLOR=A: K=J/3: IF I>39 THEN 70: IF SCRN(I,K)=A THEN 90: IF I THEN 120: N=N+1: V=(N>9)+1: W=(K-P)*2-5:M=1 65 Z = PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336): GOTO 90 70 FOR I=1 TO 6: M=PEEK(-16336): NEXT I: I=X: M=0 80 V=-V 90 PLOT X,Y/3: COLOR=E: PLOT I,K: X=I: Y=J: GOTO 50 99 PRINT "INVALID. REENTER"; 100 INPUT " COLOR (0 TO 15)",E: IF E<0 OR E>15 THEN 99: RETURN 120 IF M THEN V=ABS(V): VLIN K/2*2,K/2*2+1 AT I: S=S+I/2-9: VTAB 21: TAB 13: PRINT S 123 Q = PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336) 124 IF S<720 THEN 80 130 PRINT "CONGRATULATIONS, YOU WIN.": GOTO 150 140 PRINT "YOUR SCORE OF ";S;" IS ";: GOTO 141+S/100 141 PRINT "TERRIBLE!": GOTO 150 142 PRINT "LOUSY.": GOTO 150 143 PRINT "POOR.": GOTO 150 144 PRINT "FAIR.": GOTO 150 145 PRINT "GOOD.": GOTO 150 146 PRINT "VERY GOOD.": GOTO 150 147 PRINT "EXCELLENT.": GOTO 150 148 PRINT "NEARLY PERFECT." 150 PRINT "SAME COLORS";: GOTO 20 200 IF SW THEN 220: Q=(PDL(0)-5)/6: IF Q<0 THEN Q=0 205 IF Q>=34 THEN Q=34: COLOR=D: VLIN Q,Q+5 AT 0: COLOR=A: IF P>Q THEN 210: IF Q THEN VLIN 0,Q-1 AT 0: P=Q: RETURN 210 IF P=Q THEN RETURN: IF Q#34 THEN VLIN Q+6,39 AT 0: P=Q: RETURN 220 Q=(Y-5)/3+RND(3)*SGN(W)*(X<10 AND V<0): IF Q<0 THEN Q=0: GOTO 205 400 FOR I=1 TO 80: Q=PEEK(-16336): NEXT I: GOTO 40 </syntaxhighlight>

NotesEdit

Template:Notelist

ReferencesEdit

CitationsEdit

Template:Reflist

BibliographyEdit

|CitationClass=web }}

|CitationClass=web }}

|CitationClass=web }}

  • {{#invoke:citation/CS1|citation

|CitationClass=web }}

External linksEdit

Template:BASIC Template:Apple Inc.