Enhanced BASIC, useful routines By Lee Davison. |
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.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.
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.
Last page update: 14th July, 2003. | e-mail me |