There are many subroutines within BASIC that can be useful if you wish to use your own assembly routines with it. Here are some of them with a brief description of their function. For full details see the source code.
Note that most, if not all, of these routines need EhBASIC to be initialised before they will work properly and can not be used in isolation from EhBASIC.
BASIC increment and get byte routine. gets the next byte from the BASIC command stream. If the byte is a numeric character then the carry flag will be set, if the byte is a termination byte, either null or a statement separator, then the zero flag will be set. Spaces in the command stream will automatically be ignored.
BASIC get byte routine. Gets the current byte from the BASIC command stream but does not change the pointer. Otherwise the same as above.
Performs a cold start. BASIC is reset and all BASIC memory is cleared.
Performs a warm start. Execution is stopped and BASIC returns to immediate mode.
Do “Out of memory” error, then warm start. The same as error $0C below.
With X set, do error #X, then warm start.
|$00||NEXT without FOR||$02||syntax|
|$04||RETURN without GOSUB||$06||out of data|
|$0C||out of memory||$0E||undefined statement|
|$10||array bounds||$12||double dimension array|
|$14||divide by 0||$16||illegal direct|
|$18||type mismatch||$1A||long string|
|$1C||string too complex||$1E||continue error|
|$20||undefined function||$22||LOOP without DO|
Print “? ” and get BASIC input. Returns XY (low/high) as a pointer to the start of the input line. The input is null terminated.
Search Basic for a line, the line number required is held in the temporary integer, from start of program memory. Returns carry set and a pointer to
the line in Baslnl/Baslnh if found, if not it returns carry and a pointer to the next numbered line in Baslnl/Baslnh.
Search Basic for temporary integer line number from AX. Same as above but starts the search from AX (low/high).
Scan for next BASIC statement (: or [EOL]). Returns Y as index to : or [EOL] from (Bpntrl).
Scan for next BASIC line. Same as above but only returns on [EOL].
Perform REM, skip (rest of) line.
Get fixed-point number into temporary integer.
Print [CR]/[LF] to output device.
Print character in A to output device.
Get variable address. Returns a pointer to the variable in Lvarpl/h and sets the data type flag, $FF=string, $00=numeric.
Evaluates an expression and checks the result is numeric, if not it does a type mismatch. The result of the expression is returned in FAC1.
Check if source is numeric, else do type mismatch.
Check if source is string, else do type mismatch.
Type match check, set carry for string, clear carry for numeric.
Get numeric value from line. Returns the result in FAC1.
Scan for the byte in A as the next byte. If so return here, else do syntax error then warm start.
Do syntax error, then warm start.
Check byte is alpha (“A” to “Z” or “a” to “z”), return carry clear
Evaluate integer expression. Return integer in FAC1_3/FAC1_2
Evaluate +ve integer expression.
Evaluate integer expression, check is in range -32786 to 32767
Do function call error, then warm start.
Check that the interpreter is not in immediate mode. If not then return, if so do illegal direct error.
Perform garbage collection routine.
Evaluate string, return string length in Y.
Scan and get byte parameter, return the byte in X.
Get byte parameter and ensure numeric type, else do type mismatch error. Return the byte in X.
Evaluate byte expression, return the byte in X.
Get two parameters as in POKE or WAIT. Return the byte (second parameter)in X and the integer (first parameter) in the temporary integer pair, Itempl/Itemph.
Scan for “,” and get byte, else do Syntax error then warm start.
Return the byte in X.
New convert float to fixed routine. accepts any value that fits into 24 bits, +ve or -ve and converts it into a right truncated integer in the
temporary integer pair, Itempl/Itemph.
Unpack the four bytes starting (AY) into FAC1 as a floating point number.
Pack the floating point number in FAC1 into the current variable (Lvarpl).
Stores a 16 bit number in FAC1. Set X to the exponent required (usually $90) and the carry set for +ve numbers and clear for -ve numbers. The
routine will clear FAC1 mantissa3 and then normalise it.
Save integer AY (A = high byte, Y = low byte) in FAC1 and convert to float. The result will be -32768 to +32767.
Make string space A bytes long. This returns the following.
str_ln = A = string length
str_pl = Sutill = string pointer low byte
str_ph = Sutilh = string pointer high byte
Return string. Takes the string described instr_ln, str_pl and str_ph and puts it on the string stack. This is how you return a string to BASIC.
The KIM-1 has two methods of loading programs: - from audio files on the audio interface - from papertape from a paper...
Michael Kowalski created the 6502 Simulator many years ago. It simulated the MOS 6502, CMOS 65C02, and the 6501. Daryl R...
Design by Timothy Alicie Demonstrates his design for a cassette interface for the Micro-KIM single board computer fro...
While building the Retro Chip Tester, designed by Stephan Slabihoud, and documented on his 8bit-museum website, I no...