Enhanced BASIC, useful routines by Lee Davison
[Back]
Introduction.
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.The routines.
LAB_IGBYBASIC 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.LAB_GBYTBASIC get byte routine. Gets the current byte from the BASIC command stream but does not change the pointer. Otherwise the same as above.LAB_COLDPerforms a cold start. BASIC is reset and all BASIC memory is cleared.LAB_WARMPerforms a warm start. Execution is stopped and BASIC returns to immediate mode.LAB_OMERDo "Out of memory" error, then warm start. The same as error $0C below.LAB_XERRWith X set, do error #X, then warm start.LAB_INLN
X Error X Error $00 NEXT without FOR $02 syntax $04 RETURN without GOSUB $06 out of data $08 function call $0A overflow $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.LAB_SSLNSearch 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.LAB_SHLNSearch Basic for temporary integer line number from AX. Same as above but starts the search from AX (low/high).LAB_SNBSScan for next BASIC statement (: or [EOL]). Returns Y as index to : or [EOL] from (Bpntrl).LAB_SNBLScan for next BASIC line. Same as above but only returns on [EOL].LAB_REMPerform REM, skip (rest of) line.LAB_GFPNGet fixed-point number into temporary integer.LAB_CRLFPrint [CR]/[LF] to output device.LAB_PRNAPrint character in A to output device.LAB_GVARGet variable address. Returns a pointer to the variable in Lvarpl/h and sets the data type flag, $FF=string, $00=numeric.LAB_EVNMEvaluates an expression and checks the result is numeric, if not it does a type mismatch. The result of the expression is returned in FAC1.LAB_CTNMCheck if source is numeric, else do type mismatch.LAB_CTSTCheck if source is string, else do type mismatch.LAB_CKTMType match check, set carry for string, clear carry for numeric.LAB_EVEXEvaluate expression.LAB_GVALGet numeric value from line. Returns the result in FAC1.LAB_SCCAScan for the byte in A as the next byte. If so return here, else do syntax error then warm start.LAB_SNERDo syntax error, then warm start.LAB_CASCCheck byte is alpha ("A" to "Z" or "a" to "z"), return carry clear if so.LAB_EVINEvaluate integer expression. Return integer in FAC1_3/FAC1_2 (low/high).LAB_EVPIEvaluate +ve integer expression.LAB_EVIREvaluate integer expression, check is in range -32786 to 32767LAB_FCERDo function call error, then warm start.LAB_CKRNCheck that the interpreter is not in immediate mode. If not then return, if so do illegal direct error.LAB_GARBPerform garbage collection routine.LAB_EVSTEvaluate string.LAB_ESGLEvaluate string, return string length in Y.LAB_SGBYScan and get byte parameter, return the byte in X.LAB_GTBYGet byte parameter and ensure numeric type, else do type mismatch error. Return the byte in X.LAB_EVBYEvaluate byte expression, return the byte in X.LAB_GADBGet 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.LAB_SCGBScan for "," and get byte, else do Syntax error then warm start. Return the byte in X.LAB_F2FXNew 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.LAB_UFACUnpack the four bytes starting (AY) into FAC1 as a floating point number.LAB_PFACPack the floating point number in FAC1 into the current variable (Lvarpl).LAB_STFAStores 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.LAB_AYFCSave integer AY (A = high byte, Y = low byte) in FAC1 and convert to float. The result will be -32768 to +32767.LAB_MSSPMake 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 byteLAB_RTSTReturn 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.