diff --git a/v5.21/disptab.inc b/v5.21/disptab.inc new file mode 100644 index 0000000..1948874 --- /dev/null +++ b/v5.21/disptab.inc @@ -0,0 +1,176 @@ +; ============================================================================= +; Source codes for Microsoft Basic-80 v5.21 for CP/M +; +; Operators and fubctions dispatch tables +; +; Disassembled by Romych and Ghidra @2026.08.27 +; ============================================================================= + +; --------------------------------------------------- +; DISPATCH TABLES +; --------------------------------------------------- +MB_STMDSP: + DW MB_ENDS + DW MB_FOR + DW MB_NEXT + DW MB_DATAS ;= 01h + DW MB_INPUT + DW MB_DIM + DW MB_READ + DW MB_LET + DW MB_GOTO + DW MB_RUN + DW MB_IFS + DW MB_RESTORE + DW MB_GOSUB + DW MB_RETURN + DW MB_REM + DW MB_STOP + DW MB_PRINT + DW MB_CLEAR + DW MB_LIST + DW MB_SCRATH + DW MB_ONGOTO + DW MB_NULL + DW MB_FNWAIT + DW MB_DEF + DW MB_POKE + DW MB_CONT + DW MB_SNERR ; CSAVE - unsupported for CP/M + DW MB_SNERR ; CLOAD - unsupported for CP/M + DW MB_FNOUT + DW MB_LPRINT + DW MB_LLIST + DW 0 + DW MB_WIDTH + DW MB_REM + DW MB_TON + DW MB_TOFF + DW MB_SWAP + DW MB_ERASE + DW MB_EDIT + DW MB_ERRORS + DW MB_RESUME + DW MB_DELETE + DW MB_AUTO + DW MB_RESEQ + DW MB_DEFSTR + DW MB_DEFINT + DW MB_DEFREA + DW MB_DEFDBL + DW MB_LINE + DW 0 + DW 0 + DW MB_WHILE + DW MB_WEND + DW MB_CALLS + DW MB_WRITE + DW MB_DATAS + DW MB_CHAIN + DW MB_OPTION + DW MB_RANDOM + DW 0 + DW MB_SYSTEM + DW 0 + DW MB_OPEN + DW MB_FIELD + DW MB_GET + DW MB_PUT + DW MB_CLOSE + DW MB_LOAD + DW MB_MERGE + DW MB_FILES + DW MB_NAME + DW MB_KILL + DW MB_LSET + DW MB_RSET + DW MB_SAVE + DW MB_RESET + +; --------------------------------------------------- +; TOKENS +; --------------------------------------------------- +MB_FUNDSP: + DW MB_LEFT_ + DW MB_RIGHT_ + DW MB_MID_ + DW MB_SGN + DW MB_VINT + DW MB_ABS + DW MB_SQR + DW MB_RND + DW MB_SIN + ; 8K FUNCTIONS + DW MB_LOG + DW MB_EXP + DW MB_COS + DW MB_TAN + DW MB_ATN + DW MB_FRE + DW MB_FNINP + DW MB_POS + DW MB_LEN + DW MB_STR_ + DW MB_VAL + DW MB_ASC + DW MB_CHR_ + DW MB_PEEK + DW MB_SPACE_ + DW MB_STRO_ + DW MB_STRH_ + DW MB_LPOS + +; --------------------------------------------------- +; EXTENDED FUNCTIONS +; --------------------------------------------------- + DW MB_FRCINT + DW MB_FRCSNG + DW MB_FRCDBL + DW MB_FIXER + + DS 22, 0 + +; --------------------------------------------------- +; DISK FUNCTIONS +; --------------------------------------------------- + DW MB_CVI + DW MB_CVS + DW MB_CVD + DW WARM_BOOT + DW MB_EOF + DW MB_LOC + DW MB_LOF + DW MB_MKI_ + DW MB_MKS_ + DW MB_MKD_ + +; -------------------------------------------------- +; ALPHABETIC DISPATCH TABLE +; -------------------------------------------------- +MB_ALPTAB: + DW MB_ATAB + DW MB_BTAB + DW MB_CTAB + DW MB_DTAB + DW MB_ETAB + DW MB_FTAB + DW MB_GTAB + DW MB_HTAB + DW MB_ITAB + DW MB_JTAB + DW MB_KTAB + DW MB_LTAB + DW MB_MTAB + DW MB_NTAB + DW MB_OTAB + DW MB_PTAB + DW MB_QTAB + DW MB_RTAB + DW MB_STAB + DW MB_TTAB + DW MB_UTAB + DW MB_VTAB + DW MB_WTAB + DW MB_XTAB + DW MB_YTAB + DW MB_ZTAB diff --git a/v5.21/equates.inc b/v5.21/equates.inc index e038ef0..9b0ee18 100644 --- a/v5.21/equates.inc +++ b/v5.21/equates.inc @@ -188,107 +188,102 @@ MINUTK EQU 0xf3 ; 243 MULTK EQU 0xf4 ; 244 DIVTK EQU 0xf5 -; --------------------------------------------------- +; -------------------------------------------------- ; 8K OPERATORS -; --------------------------------------------------- +; -------------------------------------------------- -EXPTK EQU 246 ; 0xF6 -_AND EQU 247 ; 0xF7 -_OR EQU 248 ; 0xF8 +EXPTK EQU 246 ; 0xF6 +_AND EQU 247 ; 0xF7 +_OR EQU 248 ; 0xF8 -; --------------------------------------------------- +; -------------------------------------------------- ; EXTENDED OPERATORS -; --------------------------------------------------- +; -------------------------------------------------- -_XOR EQU 249 ; 0xF9 -_EQV EQU 250 ; 0xFA -_IMP EQU 251 ; 0xFB -_MOD EQU 252 ; 0xFC -_DUMMY EQU 253 ; 0xFD -IDIVTK EQU 253 ; 0xFD +_XOR EQU 249 ; 0xF9 +_EQV EQU 250 ; 0xFA +_IMP EQU 251 ; 0xFB +_MOD EQU 252 ; 0xFC +_DUMMY EQU 253 ; 0xFD +IDIVTK EQU 253 ; 0xFD LSTOPK EQU 253 + 1 - PLUSTK -; --------------------------------------------------- +; -------------------------------------------------- ; FUNCTIONS -; --------------------------------------------------- +; -------------------------------------------------- -;Q EQU 128 ; 0x80 -_LEFT_ EQU 129 ; 0x81 -ONEFUN EQU 129 ; 0x81 -_RIGHT EQU 130 ; 0x82 +;Q EQU 128 ; 0x80 +_LEFT_ EQU 129 ; 0x81 +ONEFUN EQU 129 ; 0x81 +_RIGHT EQU 130 ; 0x82 +_MID_ EQU 131 ; 0x83 +MIDTK EQU 131 ; 0x83 +_SGN EQU 132 ; 0x84 +_INT EQU 133 ; 0x85 +_ABS EQU 134 ; 0x86 +_SQR EQU 135 ; 0x87 +SQRTK EQU 135 ; 0x87 +_RND EQU 136 ; 0x88 +_SIN EQU 137 ; 0x89 -_MID_ EQU 131 ; 0x83 -MIDTK EQU 131 ; 0x83 - -_SGN EQU 132 ; 0x84 -_INT EQU 133 ; 0x85 -_ABS EQU 134 ; 0x86 - -_SQR EQU 135 ; 0x87 -SQRTK EQU 135 ; 0x87 - -_RND EQU 136 ; 0x88 -_SIN EQU 137 ; 0x89 - -; --------------------------------------------------- +; -------------------------------------------------- ; 8K FUNCTIONS -; --------------------------------------------------- +; -------------------------------------------------- -_LOG EQU 138 ; 0x8A -_EXP EQU 139 ; 0x8B -_COS EQU 140 ; 0x8C -_TAN EQU 141 ; 0x8D -_ATN EQU 142 ; 0x8E -_FRE EQU 143 ; 0x8F -_INP EQU 144 ; 0x90 -_POS EQU 145 ; 0x91 -_LEN EQU 146 ; 0x92 -_STR_ EQU 147 ; 0x93 -_VAL EQU 148 ; 0x94 -_ASC EQU 149 ; 0x95 -_CHR_ EQU 150 ; 0x96 -_PEEK EQU 151 ; 0x97 -_SPACE EQU 152 ; 0x98 -_OCT_ EQU 153 ; 0x99 -_HEX_ EQU 154 ; 0x9A -_LPOS EQU 155 ; 0x9B -;LASNUM EQU 155 ; 0x9B +_LOG EQU 138 ; 0x8A +_EXP EQU 139 ; 0x8B +_COS EQU 140 ; 0x8C +_TAN EQU 141 ; 0x8D +_ATN EQU 142 ; 0x8E +_FRE EQU 143 ; 0x8F +_INP EQU 144 ; 0x90 +_POS EQU 145 ; 0x91 +_LEN EQU 146 ; 0x92 +_STR_ EQU 147 ; 0x93 +_VAL EQU 148 ; 0x94 +_ASC EQU 149 ; 0x95 +_CHR_ EQU 150 ; 0x96 +_PEEK EQU 151 ; 0x97 +_SPACE EQU 152 ; 0x98 +_OCT_ EQU 153 ; 0x99 +_HEX_ EQU 154 ; 0x9A +_LPOS EQU 155 ; 0x9B +;LASNUM EQU 155 ; 0x9B -; --------------------------------------------------- +; -------------------------------------------------- ; EXTENDED FUNCTIONS -; --------------------------------------------------- +; -------------------------------------------------- -_CINT EQU 156 ; 0x9C -_CSNG EQU 157 ; 0x9D -_CDBL EQU 158 ; 0x9E -_FIX EQU 159 ; 0x9F +_CINT EQU 156 ; 0x9C +_CSNG EQU 157 ; 0x9D +_CDBL EQU 158 ; 0x9E +_FIX EQU 159 ; 0x9F -; --------------------------------------------------- +; -------------------------------------------------- ; NCR VERSION FUNCTIONS ; DISK FUNCTIONS -; --------------------------------------------------- +; -------------------------------------------------- -_CVI EQU 171 ; 0xAC -_CVS EQU 172 ; 0xAD -_CVD EQU 173 ; 0xAE -_EOF EQU 175 ; 0xB0 -_LOC EQU 176 ; 0xB1 -_LOF EQU 177 ; 0xB2 -_MKI_ EQU 178 ; 0xB3 -_MKS_ EQU 179 ; 0xB4 -_MKD_ EQU 180 ; 0xB5 +_CVI EQU 171 ; 0xAC +_CVS EQU 172 ; 0xAD +_CVD EQU 173 ; 0xAE +_EOF EQU 175 ; 0xB0 +_LOC EQU 176 ; 0xB1 +_LOF EQU 177 ; 0xB2 +_MKI_ EQU 178 ; 0xB3 +_MKS_ EQU 179 ; 0xB4 +_MKD_ EQU 180 ; 0xB5 -; --------------------------------------------------- +; -------------------------------------------------- ; END DISK FUNCTIONS -; --------------------------------------------------- +; -------------------------------------------------- -NUMGFN EQU 2*MIDTK-2*ONEFUN+1 ; 5 +NUMGFN EQU 2*MIDTK - 2*ONEFUN + 1 ; 5 - -; --------------------------------------------------- +; -------------------------------------------------- ; CP/M Entry -; --------------------------------------------------- +; -------------------------------------------------- WARM_BOOT EQU 0x0000 WARM_BOOT_ADDR EQU WARM_BOOT + 1 @@ -296,23 +291,23 @@ BDOS_ENTER EQU 0x0005 BDOS_ENTER_ADDR EQU BDOS_ENTER + 1 DMA_BUFFER EQU 0x80 P_CMD_LINE EQU DMA_BUFFER + 1 -TPA EQU 0x100 ; 256 +TPA EQU 0x100 -; --------------------------------------------------- +; -------------------------------------------------- ; CP/M functions -; --------------------------------------------------- -C.VER EQU 0x0c ; Get version -C.REST EQU 0x0d ; Init BDOS -C.SDRV EQU 0x0e ; Set current drive -C.OPEN EQU 0x0f ; Open file -C.CLOS EQU 0x10 ; Close file -C.SEAR EQU 0x11 ; Search file -C.SEAR_N EQU 0x12 ; Search next -C.DEL EQU 0x13 ; Delete file -C.MAKE EQU 0x16 ; Create new file -C.RENA EQU 0x17 ; Rename file -C.GDRV EQU 0x19 ; Get current drive -C.BUFF EQU 0x1a ; Set DMA buffer address +; -------------------------------------------------- +C.VER EQU 0x0c ; Get version +C.REST EQU 0x0d ; Init BDOS +C.SDRV EQU 0x0e ; Set current drive +C.OPEN EQU 0x0f ; Open file +C.CLOS EQU 0x10 ; Close file +C.SEAR EQU 0x11 ; Search file +C.SEAR_N EQU 0x12 ; Search next +C.DEL EQU 0x13 ; Delete file +C.MAKE EQU 0x16 ; Create new file +C.RENA EQU 0x17 ; Rename file +C.GDRV EQU 0x19 ; Get current drive +C.BUFF EQU 0x1a ; Set DMA buffer address ; --------------------------------------------------- @@ -325,9 +320,9 @@ FCB.RC EQU 38 ; 0x0F ? ; RECORD COUNT = CURRENT EXTE FCB.NR EQU 40 ; 0x20 ? ; NEXT RECORD NUMBER FCB.RN EQU 33 ; CP/M 2.x Random Record Number -; --------------------------------------------------- +; -------------------------------------------------- ; File access mode -; --------------------------------------------------- +; -------------------------------------------------- MD.SQI EQU 1 ; seq inp MD.SQO EQU 2 ; seq out MD.RND EQU 3 ; random @@ -348,9 +343,9 @@ CONCON EQU 30 ; TOKEN RETURNED BY CHRGET AFTER CON DBLCON EQU 31 ; DOUBLE PREC (8 BYTE) CONSTANT -; --------------------------------------------------- +; -------------------------------------------------- ; ASCII codes -; --------------------------------------------------- +; -------------------------------------------------- ASCII_BELL EQU 0x07 ; 7 ASCII_BKSP EQU 0x08 ; 8 @@ -364,9 +359,9 @@ ASCII_CUR EQU 0x24 ; $ ASCII_SQ EQU 0x27 ; ' ASCII_BKSL EQU 0x5C ; \ -; --------------------------------------------------- +; -------------------------------------------------- ; Key codes -; --------------------------------------------------- +; -------------------------------------------------- CTRL_C EQU 0x03 ; 3 CTRL_O EQU 0x0f ; 15 @@ -395,29 +390,45 @@ DATOFC EQU DATOFS DBLKSZ EQU DATOFS + DATPSC DBLK.C EQU DBLKSZ ; SIZE OF A FILE INFO BLOCK PLUS $CODE -DSKERR EQU 0x31 ; 49 EOFCHR EQU 0x1a ; 26 +; -------------------------------------------------- +; Error codes +; -------------------------------------------------- +ERRNF EQU 0x01 ERRSN EQU 0x02 ; 2 ERRRG EQU 0x03 ; 3 ERROD EQU 0x04 ; 4 ERRFC EQU 0x05 ; 5 -ERROM EQU 0x07 ERROV EQU 0x06 ; 6 +ERROM EQU 0x07 ERRUS EQU 0x08 ; 8 ERRBS EQU 0x09 ; 9 ERRDD EQU 0x0a ; 10 ERRDV0 EQU 0x0b ; 11 ERRID EQU 0x0c ; 12 ERRTM EQU 0x0d ; 13 +ERRSO EQU 0x0e ; Out of space ERRLS EQU 0x0f ; 15 +ERRST EQU 0x10 ; String formula too complex ERRCN EQU 0x11 ; 17 -ERRRE EQU 0x14 ; 20 +ERRUF EQU 0x12 ; Undefined user function ERRNR EQU 0x13 ; 19 +ERRRE EQU 0x14 ; 20 +ERRUE EQU 0x15 ; Unprintable error +ERRMO EQU 0x16 ; Missing operand ERRLBO EQU 0x17 ; 23 +; skipped 18 and 19 ERRFN EQU 0x1a ; 26 +; skipped 1b and 1c ERRWH EQU 0x1d ; 29 ERRWE EQU 0x1e ; 30 + +NONDSK EQU 0x1e ; Last non disk error + +; disk errors starts from here +DSKERR EQU 0x31 ; 49 +; ERRFOV EQU 0x32 ; 50 ERRIER EQU 0x33 ; 51 ERRBFN EQU 0x34 ; 52 @@ -430,6 +441,7 @@ ERRDFL EQU 0x3d ; 61 ERRRPE EQU 0x3e ; 62 ERRFDR EQU 0x42 ; 66 ERRTMF EQU 0x43 ; 67 +; -------------------------------------------------- FD.SIZ EQU 0xa9 ; 169 FD.PHY EQU 0xab ; 171 @@ -452,10 +464,7 @@ LSTERR EQU 0x44 ; 68 MAXPRM EQU 0x20 ; 32 NMREL EQU 0x03 ; 3 -NONDSK EQU 0x1e ; 30 PRMSIZ EQU 0x64 ; 100 SQO EQU 0x02 ; 2 SWTCHR EQU 0x2f ; 47 -WHLSIZ EQU 0x06 ; 6 - -CPM_RES1 EQU 0x3B \ No newline at end of file +WHLSIZ EQU 0x06 ; 6 \ No newline at end of file diff --git a/v5.21/inidata.inc b/v5.21/inidata.inc new file mode 100644 index 0000000..50bdf61 --- /dev/null +++ b/v5.21/inidata.inc @@ -0,0 +1,495 @@ +; ============================================================================= +; Source codes for Microsoft Basic-80 v5.21 for CP/M +; +; Initialized data. Variables, messages and tables. +; +; Disassembled by Romych and Ghidra @2026.08.27 +; ============================================================================= + + +; -------------------------------------------------- +; OPERATOR PRECEDENCE TABLE +; -------------------------------------------------- +MB_OPTAB: + DB 121 + DB 121 + DB 124 + DB 124 + DB 127 + DB 80 + DB 70 + DB 60 ; PRECEDENCE OF "XOR" + DB 50 ; PRECEDENCE OF "EQV" + DB 40 ; PRECEDENCE OF "IMP" + DB 122 ; PRECEDENCE OF "MOD" + DB 123 ; PRECEDENCE OF "IDIV" + +; -------------------------------------------------- +; USED BY ASSIGNMENT CODE TO FORCE THE RIGHT HAND VALUE +; TO CORRESPOND TO THE VALUE TYPE OF THE VARIABLE BEING +; ASSIGNED TO. +; -------------------------------------------------- +MB_FRCTBL: + DW MB_FRCDBL + DW 0x0 + DW MB_FRCINT + DW MB_CHKSTR + DW MB_FRCSNG + +; --------------------------------------------------- +; DOUBLE PRECISION ROUTINES +; --------------------------------------------------- +MB_DBLDSP: + DW MB_DADD + DW MB_DSUB + DW MB_DMULT + DW MB_DDIV + DW MB_DCOMP + +; --------------------------------------------------- +; SINGLE PRECISION ROUTINES +; --------------------------------------------------- +MB_SNGDSP: + DW MB_FADD + DW MB_FSUB + DW MB_FMUL + DW MB_FDIV + DW MB_FCOMP + +; --------------------------------------------------- +; INTEGER ROUTINES +; --------------------------------------------------- +MB_INTDSP: + DW MB_IADD + DW MB_ISUB + DW MB_IMUL + DW MB_INTDIV + DW MB_ICOMP + +; --------------------------------------------------- +MB_ERRTAB: + DB 0 + +; --------------------------------------------------- +MB_ERROR_MSGS: + DB "NEXT without FOR", 0 + DB "Syntax error", 0 + DB "RETURN without GOSUB", 0 + DB "Out of DATA", 0 + DB "Illegal function call", 0 + +; --------------------------------------------------- +MB_OVRMSG: + DB "Overflow", 0 + DB "Out of memory", 0 + DB "Undefined line number", 0 + DB "Subscript out of range", 0 + DB "Duplicate Definition", 0 + +; --------------------------------------------------- +MB_DBZ_MSG: + DB "Division by zero", 0 + DB "Illegal direct", 0 + DB "Type mismatch", 0 + DB "Out of string space", 0 + DB "String too long", 0 + DB "String formula too complex", 0 + DB "Can't continue", 0 + DB "Undefined user function", 0 + DB "No RESUME\0RESUME without error", 0 + DB "Unprintable error", 0 + DB "Missing operand", 0 + DB "Line buffer overflow", 0 + DB '?', 0 + DB '?', 0 + DB "FOR Without NEXT", 0 + DB '?', 0 + DB '?', 0 + DB "WHILE without WEND", 0 + DB "WEND without WHILE", 0 + + DB "FIELD overflow", 0 + DB "Internal error", 0 + DB "Bad file number", 0 + DB "File not found", 0 + DB "Bad file mode", 0 + DB "File already open", 0 + DB '?', 0 + DB "Disk I/O error", 0 + DB "File already exists", 0 + DB '?', 0 + DB '?', 0 + DB "Disk full", 0 + DB "Input past end", 0 + DB "Bad record number", 0 + DB "Bad file name", 0 + DB '?', 0 + DB "Direct statement in file", 0 + DB "Too many files", 0 + + +; --------------------------------------------------- +MB_USRTAB: + DW MB_FCERR + DW MB_FCERR + DW MB_FCERR + DW MB_FCERR + DW MB_FCERR + DW MB_FCERR + DW MB_FCERR + DW MB_FCERR + DW MB_FCERR + DW MB_FCERR + +; --------------------------------------------------- +MB_NULCNT: + DB 1 ; NUMBER OF NULLS TO PRINT AFTER CRLF +MB_CHARC: + DB 0 ; EATEN CHAR WHEN NOT A ^C +MB_ERRFLG: + DB 0 ; ERROR NUMBER SO EDIT CAN BE CALLED ON "SYNTAX ERROR" +MB_LPTLST: + DB 0 ; LAST LINE PRINTER OPERATION. ZERO MEANS LINEFEED +MB_LPTPOS: + DB 0 ; POSITION OF LPT PRINT HEAD +MB_PRTFLG: + DB 0x00 +MB_NLPPOS: + DB 112 ; (((LPTLEN/CLMWID)-1)*CLMWID) - LAST COMMA FIELD POSIT +MB_LPTSIZ: + DB 132 ; DEFAULT LINE PRINTER WIDTH +MB_LINLEN: + DB LINLN +MB_CLMLST: + DB 56 ; POSITION OF LAST COMMA COLUMN +MB_RUBSW: + DB 0 ; RUBOUT SWITCH=1 INSIDE THE PROCESSING OF A RUBOUT (INLIN) +MB_CNTOFL: + DB 0 ; SUPRESS OUTPUT FLAG, NON-ZERO MEANS SUPRESS +MB_PTRFIL: + DW 0 ; POINTER TO DATA BLOCK OF CURRENT FILE +MB_TOPMEM: + DW MB_TSTACK+100 +MB_CURLIN: + DW 65534 ; CURRENT LINE # +MB_TXTTAB: + DW MB_TSTACK+1 ; MB_TSTACK+1 +MB_OVERRI: + DW MB_OVRMSG ; = "Overflow" + +; =================================================== +; END OF INITIALIZED PART OF RAM +; =================================================== + +; =================================================== +; DISK DATA STORAGE AREA +; =================================================== +MB_LSTFRE: + DW 0 ; FREE PLACE IN DIRECTORY +MB_MAXTRK: + DB 0 ; ALLOCATE INSIDE THIS TRACK +MB_DSKMOD: + DB 0 ; MODE OF FILE JUST LOOKED UP, ZERO IF FILE WAS JUST CREATED +MB_FILPT1: + DW 0 ; [FILPTR] ALWAYS REFETCHED FROM HERE + + +; POINTERS TO DATA BLOCKS FOR EACH FILE +MB_FILPTR: + .16 DW 0x0000 + +; HIGHEST FILE NUMBER ALLOWED +MB_MAXFIL: + DB 0 + +; THE NUMBER OF CHARACTER BEYOND #2 IN A VAR NAME +MB_NAMCNT: + DB 0 + +MB_NAMBUF: + DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +; TEMP STORAGE DURING NAME SAVE AT INDLOP +MB_NAMTMP: + DW 0 + +MB_FILNA2: + .16 DB 0x00 + +MB_FILNAM: + DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + DB 0x00 + + +MB_CPMVRN: + DB 0 ; CP/M Version Number (#0 is 2.x) + +MB_CPMREA: + DB 0 ; CP/M Read Call + +MB_CPMWRI: + DB 0 ; CP/M Write Call + +MB_RST_INP: ; a colon for restarting input + DB ':' + +MB_KBUF: + .(KBFLEN) DB 0x00 + +MB_BUFMIN: + DB 44 + +MB_BUF: + .256 DB 0x00 + DB 0 ; ALLOW FOR SINGLE QUOTE IN BIG LINE + DB 0 + +MB_ENDBUF: + DB 0 + +MB_TTYPOS: + DB 0 + +MB_DIMFLG: + DB 0 + +;THE TYPE INDICATOR +MB_VALTYP: + DB 0 + +;OPERATOR NUMBER +MB_OPRTYP: + DB 0 + +MB_DORES: + DB 0 +MB_CONTXT: + DW 0 +MB_CONSAV: + DB 0 +MB_CONTYP: + DB 0 + +; SAVED CONSTANT VALUE +MB_CONLO: + .4 DW 0 + +; HIGHEST LOCATION IN MEMORY +MB_MEMSIZ: + DW 0 +; POINTER AT FIRST FREE TEMP DESCRIPTOR +MB_TEMPPT: + DW 0 + +MB_TEMPST: + .15 DB 0 +;MB_DSCTMP: + .15 DB 0 + +; STRING FUNCTIONS BUILD ANSWER DESCRIPTOR HERE +MB_DSCTMP: + .3 DB 0 + +MB_DSCPTR EQU $ - 2 + +MB_FRETOP: + DW 0 +MB_TEMP3: + DW 0 +MB_CPMFIL: + DW 0 +MB_ENDFOR: + DW 0 +MB_DATLIN: + DW 0 +MB_SUBFLG: + DB 0 +MB_FLGINP: + DB 0 +MB_TEMP: + DW 0 +MB_PTRFLG: + DB 0 +MB_AUTFLG: + DB 0 +MB_AUTLIN: + DW 0 +MB_AUTINC: + DW 0 +MB_SAVTXT: + DW 0 +MB_SAVSTK: + DW 0 +MB_ERRLIN: + DW 0 +MB_DOT: + DW 0 +MB_ERRTXT: + DW 0 +MB_ONELIN: + DW 0 +MB_ONEFLG: + DB 0 +MB_TEMP2: + DW 0 +MB_OLDLIN: + DW 0 +MB_OLDTXT: + DW 0 + +; POINTER TO START OF SIMPLE VARIABLE SPACE +MB_VARTAB: + DW 0 + +; POINTER TO BEGINNING OF ARRAY TABLE +MB_ARYTAB: + DW 0 + +; END OF STORAGE IN USE +MB_STREND: + DW 0x00 + +MB_DATPTR: + DW 0x0 + +MB_DEFTBL: + .26 DB 0 + +; PREVIOUS DEFINITION BLOCK ON STACK +MB_PRMSTK: + DW 0 + +; NUMBER OF BYTES IN THE ACTIVE TABLE +MB_PRMLEN: + DW 0 + +; ACTIVE PARAMETER DEFINITION TABLE +MB_PARM1: + .100 DB 0 + +MB_PRMPRV: + DW 0 + +MB_PRMLN2: + DW 0 + +MB_PARM2: + .100 DB 0 + +MB_PRMFLG: + DB 0x00 + +MB_ARYTA2: + DW 0x0 + +; ZERO IF NO FUNCTIONS ACTIVE. SAVES TIME IN SIMPLE SEARCH +MB_NOFUNS: + DB 0 + +; GARBAGE COLLECTION TEMP TO CHAIN THROUGH PARAMETER BLOCKS +MB_TEMP9: + DW 0 + +; COUNT OF ACTIVE FUNCTIONS +MB_FUNACT: + DW 0 + +MB_INPPAS: + DB 0 +MB_NXTTXT: + DW 0 +MB_NXTFLG: + DB 0 +MB_FVALSV: + DW 0 + DW 0 +MB_NXTLIN: + DW 0 +MB_OPTVAL: + DB 0 +MB_OPTFLG: + DB 0 +MB_PATCH: + .30 DB 0 + +MB_TEMPA: + DW 0 +MB_SAVFRE: + DW 0 +MB_MAXREC: + DW 0 +MB_PROFLG: + DB 0 +MB_MRGFLG: + DB 0 +MB_MDLFLG: + DB 0 +MB_CMEPTR: + DW 0 +MB_CMSPTR: + DW 0 +MB_CHNFLG: + DB 0 +MB_CHNLIN: + DW 0 +MB_SWPTMP: + DW 0, 0, 0, 0 +MB_TRCFLG: + DB 0 + +; =================================================== +; THIS IS THE RAM TERMPORARY AREA FOR +; MATH PACKAGE ROUTINES +; =================================================== + + +MB_FLOAT_ACC: + DB 0 ; FLOATING ACCUMULATOR + +MB_DFACLO: + DB 0, 0, 0, 0 ; FOUR LOWEST ORDERS FOR DOUBLE PRECISION + +MB_FACLO: + DB 0, 0 ; MIDDLE ORDER OF MANTISSA + DB 0 ; HIGH ORDER OF MANTISSA + +MB_FAC: + DB 0, 0 ; EXPONENT + +MB_FLGOVC: + DB 0 ; OVERFLOW PRINT FLAG, =0, 1 PRINT + +MB_OVCSTR: + DB 0 + +MB_FANSII: + DB 0 + DB 0 + +MB_ARGLO: + .7 DB 0 ; LOCATION OF SECOND ARGUMENT FOR DOUBLE +MB_ARG: + DB 0 ; PRECISION + +MB_FBUFFR: + .43 DB 0 ; BUFFER FOR FOUT + +; =================================================== +; TEXT CONSTANTS FOR PRINT OUT +; =================================================== + +MB_INTXT: + DB " in ", 0 + +MB_OKTXT: + DB "Ok\r\n", 0 + +MB_BRKTXT: + DB "Break", 0 diff --git a/v5.21/mb.asm b/v5.21/mb.asm index 80cc1c0..0b85d68 100644 --- a/v5.21/mb.asm +++ b/v5.21/mb.asm @@ -1,4 +1,4 @@ -; ================================================== +; ============================================================================= ; Source codes for Microsoft Basic-80 v5.21 for CP/M ; ; Disassembled by Romych and Ghidra @2026.08.27 @@ -11,7 +11,7 @@ INCLUDE "equates.inc" - ;LABELSLIST "mb.l" + ;LABELSLIST "mb.label" OUTPUT mb.com @@ -27,933 +27,15 @@ START: DW MB_FRCINT DW MB_MAKINT -; --------------------------------------------------- -; DISPATCH TABLES, RESERVED WORD TABLES -; --------------------------------------------------- -MB_STMDSP: - DW MB_ENDS - DW MB_FOR - DW MB_NEXT - DW MB_DATAS ;= 01h - DW MB_INPUT - DW MB_DIM - DW MB_READ - DW MB_LET - DW MB_GOTO - DW MB_RUN - DW MB_IFS - DW MB_RESTORE - DW MB_GOSUB - DW MB_RETURN - DW MB_REM - DW MB_STOP - DW MB_PRINT - DW MB_CLEAR - DW MB_LIST - DW MB_SCRATH - DW MB_ONGOTO - DW MB_NULL - DW MB_FNWAIT - DW MB_DEF - DW MB_POKE - DW MB_CONT - DW MB_SNERR ;CSAVE - DW MB_SNERR ;CLOAD - DW MB_FNOUT - DW MB_LPRINT - DW MB_LLIST - DW 0 - DW MB_WIDTH - DW MB_REM - DW MB_TON - DW MB_TOFF - DW MB_SWAP - DW MB_ERASE - DW MB_EDIT - DW MB_ERRORS - DW MB_RESUME - DW MB_DELETE - DW MB_AUTO - DW MB_RESEQ - DW MB_DEFSTR - DW MB_DEFINT - DW MB_DEFREA - DW MB_DEFDBL - DW MB_LINE - DW 0 - DW 0 - DW MB_WHILE - DW MB_WEND - DW MB_CALLS - DW MB_WRITE - DW MB_DATAS - DW MB_CHAIN - DW MB_OPTION - DW MB_RANDOM - DW 0 - DW MB_SYSTEM - DW 0 - DW MB_OPEN - DW MB_FIELD - DW MB_GET - DW MB_PUT - DW MB_CLOSE - DW MB_LOAD - DW MB_MERGE - DW MB_FILES - DW MB_NAME - DW MB_KILL - DW MB_LSET - DW MB_RSET - DW MB_SAVE - DW MB_RESET + INCLUDE "disptab.inc" -; --------------------------------------------------- -; TOKENS -; --------------------------------------------------- -MB_FUNDSP: - DW MB_LEFT_ - DW MB_RIGHT_ - DW MB_MID_ - DW MB_SGN - DW MB_VINT - DW MB_ABS - DW MB_SQR - DW MB_RND - DW MB_SIN - ; 8K FUNCTIONS - DW MB_LOG - DW MB_EXP - DW MB_COS - DW MB_TAN - DW MB_ATN - DW MB_FRE - DW MB_FNINP - DW MB_POS - DW MB_LEN - DW MB_STR_ - DW MB_VAL - DW MB_ASC - DW MB_CHR_ - DW MB_PEEK - DW MB_SPACE_ - DW MB_STRO_ - DW MB_STRH_ - DW MB_LPOS + INCLUDE "reswords.inc" -; --------------------------------------------------- -; EXTENDED FUNCTIONS -; --------------------------------------------------- - DW MB_FRCINT - DW MB_FRCSNG - DW MB_FRCDBL - DW MB_FIXER + INCLUDE "inidata.inc" - DS 22, 0 - -; --------------------------------------------------- -; DISK FUNCTIONS -; --------------------------------------------------- - DW MB_CVI - DW MB_CVS - DW MB_CVD - DW WARM_BOOT - DW MB_EOF - DW MB_LOC - DW MB_LOF - DW MB_MKI_ - DW MB_MKS_ - DW MB_MKD_ -; DW 0x0024 -; DW 0, 0, 0, 0, 0, 0, 0, 0 - -; -------------------------------------------------- -; ALPHABETIC DISPATCH TABLE -; -------------------------------------------------- -MB_ALPTAB: - DW MB_ATAB - DW MB_BTAB - DW MB_CTAB - DW MB_DTAB - DW MB_ETAB - DW MB_FTAB - DW MB_GTAB - DW MB_HTAB - DW MB_ITAB - DW MB_JTAB - DW MB_KTAB - DW MB_LTAB - DW MB_MTAB - DW MB_NTAB - DW MB_OTAB - DW MB_PTAB - DW MB_QTAB - DW MB_RTAB - DW MB_STAB - DW MB_TTAB - DW MB_UTAB - DW MB_VTAB - DW MB_WTAB - DW MB_XTAB - DW MB_YTAB - DW MB_ZTAB - - -; --------------------------------------------------- -; Reserved words table -; --------------------------------------------------- -MB_RESLST: - -MB_ATAB: -; --------------------------------------------------- - DB "UT", 'O' OR 0x80, _AUTO - DB 'N', 'D' OR 0x80, _AND - DB 'B', 'S' OR 0x80, _ABS - 0x80 - DB 'T', 'N' OR 0x80, _ATN - 0x80 - DB 'S', 'C' OR 0x80, _ASC - 0x80 - DB 0 -; --------------------------------------------------- -MB_BTAB: - DB 0 - -; --------------------------------------------------- -MB_CTAB: - DB "LOS", 'E' OR 0x80, _CLOSE - DB "ON", 'T' OR 0x80, _CONT - DB "LEA", 'R' OR 0x80, _CLEAR - DB "IN", 'T' OR 0x80, _CINT - 0x80 - DB "SN", 'G' OR 0x80, _CSNG - 0x80 - DB "DB", 'L' OR 0x80, _CDBL - 0x80 - DB 'V', 'I' OR 0x80, _CVI - 0x80 - DB 'V', 'S' OR 0x80, _CVS - 0x80 - DB 'V', 'D' OR 0x80, _CVD - 0x80 - DB "O", 'S' OR 0x80, _COS - 0x80 - DB "HR", '$' OR 0x80, _CHR_ - 0x80 - DB "AL", 'L' OR 0x80, _CALL - DB "OMMO", 'N' OR 0x80, _COMMON - DB "HAI", 'N' OR 0x80, _CHAIN - DB 0 - -; --------------------------------------------------- -MB_DTAB: - DB "ELET", 'E' OR 0x80, _DELETE - DB "AT", 'A' OR 0x80, _DATA - DB 'I', 'M' OR 0x80, _DIM - DB "EFST", 'R' OR 0x80, _DEFSTR - DB "EFIN", 'T' OR 0x80, _DEFINT - DB "EFSN", 'G' OR 0x80, _DEFSNG - DB "EFDB", 'L' OR 0x80, _DEFDBL - DB 'E', 'F' OR 0x80, _DEF - DB 0 - -; --------------------------------------------------- -MB_ETAB: - DB "LS", 'E' OR 0x80, _ELSE - DB 'N', 'D' OR 0x80, _END - DB "RAS", 'E' OR 0x80, _ERASE - DB "DI", 'T' OR 0x80, _EDIT - DB "RRO", 'R' OR 0x80, _ERROR - DB 'R', 'L' OR 0x80, _ERL - DB 'R', 'R' OR 0x80, _ERR - DB 'X', 'P' OR 0x80, _EXP - 0x80 - DB 'O', 'F' OR 0x80, _EOF - 0x80 - DB 'Q', 'V' OR 0x80, _EQV - DB 0 - -; --------------------------------------------------- -MB_FTAB: - DB 'O', 'R' OR 0x80, _FOR - DB "IEL", 'D' OR 0x80, _FIELD - DB "ILE", 'S' OR 0x80, _FILES - DB 'N' OR 0x80, _FN - DB 'R', 'E' OR 0x80, _FRE - 0x80 - DB 'I', 'X' OR 0x80, _FIX - 0x80 - DB 0 - -; --------------------------------------------------- -MB_GTAB: - DB "OT", 'O' OR 0x80, _GOTO - DB "O T", 'O' OR 0x80, _GOTO - DB "OSU", 'B' OR 0x80, _GOSUB - DB 'E', 'T' OR 0x80, _GET - DB 0 - -; --------------------------------------------------- -MB_HTAB: - DB "EX", '$' OR 0x80, _HEX_ - 0x80 - DB 0 - -; --------------------------------------------------- -MB_ITAB: - DB "NPU", 'T' OR 0x80, _INPUT - DB 'F' OR 0x80, _IF - DB "NST", 'R' OR 0x80, _INSTR - DB 'N', 'T' OR 0x80, _INT - 0x80 - DB 'N', 'P' OR 0x80, _INP - 0x80 - DB 'M', 'P' OR 0x80, _IMP - DB "NKEY", '$' OR 0x80, _INKEY - DB 0 - -; --------------------------------------------------- -MB_JTAB: - DB 0 - -; --------------------------------------------------- -MB_KTAB: - DB "IL", 'L' OR 0x80, _KILL - DB 0 - -; --------------------------------------------------- -MB_LTAB: - DB "PRIN", 'T' OR 0x80, _LPRINT - DB "LIS", 'T' OR 0x80, _LLIST - DB "PO", 'S' OR 0x80, _LPOS - 0x80 - DB 'E', 'T' OR 0x80, _LET - DB "IN", 'E' OR 0x80, _LINE - DB "OA", 'D' OR 0x80, _LOAD - DB "SE", 'T' OR 0x80, _LSET - DB "IS", 'T' OR 0x80, _LIST - DB 'O', 'G' OR 0x80, _LOG - 0x80 - DB 'O', 'C' OR 0x80, _LOC - 0x80 - DB "E", 'N' OR 0x80, _LEN - 0x80 - DB "EFT", '$' OR 0x80, _LEFT_ - 0x80 - DB 'O', 'F' OR 0x80, _LOF - 0x80 - DB 0 - -; --------------------------------------------------- -MB_MTAB: - DB "ERG", 'E' OR 0x80, 0xC5 - DB 'O', 'D' OR 0x80, 0xFC - DB "KI", '$' OR 0x80, _MKI_ - 0x80 - DB "KS", '$' OR 0x80, _MKS_ - 0x80 - DB "KD", '$' OR 0x80, _MKD_ - 0x80 - DB "ID", '$' OR 0x80, _MID_ - 0x80 - DB 0 - -; --------------------------------------------------- -MB_NTAB: - DB "EX", 'T' OR 0x80, _NEXT - DB "UL", 'L' OR 0x80, _NULL - DB "AM", 'E' OR 0x80, _NAME - DB 'E', 'W' OR 0x80, _NEW - DB 'O', 'T' OR 0x80, _NOT - DB 0 - -; --------------------------------------------------- -MB_OTAB: - DB "PE", 'N' OR 0x80, _OPEN - DB 'U', 'T' OR 0x80, _OUT - DB 'N' OR 0x80, _ON - DB 'R' OR 0x80, _OR - DB "CT", '$' OR 0x80, _OCT_ - 0x80 - DB "PTIO", 'N' OR 0x80, _OPTION - DB 0 - -; --------------------------------------------------- -MB_PTAB: - DB "RIN", 'T' OR 0x80, _PRINT - DB 'U', 'T' OR 0x80, _PUT - DB "OK", 'E' OR 0x80, _POKE - DB 'O', 'S' OR 0x80, _POS - 0x80 - DB "EE", 'K' OR 0x80, _PEEK - 0x80 - DB 0 - -; --------------------------------------------------- -MB_QTAB: - DB 0 - -; --------------------------------------------------- -MB_RTAB: - DB "ETUR", 'N' OR 0x80, _RETUR - DB "EA", 'D' OR 0x80, _READ - DB 'U', 'N' OR 0x80, _RUN - DB "ESTOR", 'E' OR 0x80, _RESTORE - DB 'E', 'M' OR 0x80, _REM - DB "ESUM", 'E' OR 0x80, _RESUME - DB "SE", 'T' OR 0x80, _RSET - DB "IGHT", '$' OR 0x80, _RIGHT - 0x80 - DB 'N', 'D' OR 0x80, _RND - 0x80 - DB "ENU", 'M' OR 0x80, _RENUM - DB "ESE", 'T' OR 0x80, _RESET - DB "ANDOMIZ", 'E' OR 0x80, _RANDOMIZE - DB 0 - -; --------------------------------------------------- -MB_STAB: - DB "TO", 'P' OR 0x80, _STOP - DB "WA", 'P' OR 0x80, _SWAP - DB "AV", 'E' OR 0x80, _SAVE - DB "PC", '(' OR 0x80, _SPC - DB "TE", 'P' OR 0x80, _STEP - DB 'G', 'N' OR 0x80, _SGN - 0x80 - DB 'Q', 'R' OR 0x80, _SQR - 0x80 - DB 'I', 'N' OR 0x80, _SIN - 0x80 - DB "TR", '$' OR 0x80, _STR_- 0x80 - DB "TRING", '$' OR 0x80, _STRIN - DB "PACE", '$' OR 0x80, _SPACE - 0x80 - DB "YSTE", 'M' OR 0x80, _SYSTE - DB 0 - -; --------------------------------------------------- -MB_TTAB: -; DB "ON", 'E' OR 0x80, _TONE - DB "HE", 'N' OR 0x80, _THEN - DB "RO", 'N' OR 0x80, _TRON - DB "ROF", 'F' OR 0x80, _TROFF - DB "AB", '(' OR 0x80, _TAB - DB 'O' OR 0x80, _TO - DB 'A', 'N' OR 0x80, _TAN - 0x80 - DB 0 - -; --------------------------------------------------- -MB_UTAB: - DB "SIN", 'G' OR 0x80, _USING - DB 'S', 'R' OR 0x80, _USR - DB 0 - -; --------------------------------------------------- -MB_VTAB: - DB 'A', 'L' OR 0x80, _VAL - 0x80 - DB "ARPT", 'R' OR 0x80, _VARPTR - DB 0 - -; --------------------------------------------------- -MB_WTAB: - DB "IDT", 'H' OR 0x80, _WIDTH - DB "AI", 'T' OR 0x80, _WAIT - DB "HIL", 'E' OR 0x80, _WHILE - DB "EN", 'D' OR 0x80, _WEND - DB "RIT", 'E' OR 0x80, _WRITE - DB 0 - -; --------------------------------------------------- -MB_XTAB: - DB 'O', 'R' OR 0x80, _XOR - DB 0 - -; --------------------------------------------------- -MB_YTAB: - DB 0 - -; --------------------------------------------------- -MB_ZTAB: - DB 0 - -; --------------------------------------------------- -; -; --------------------------------------------------- -MB_SPCTAB: - DB '+' OR 0x80 - DB PLUSTK - DB '-' OR 0x80 - DB MINUTK - DB '*' OR 0x80 - DB MULTK - DB '/' OR 0x80 - DB DIVTK - DB '^' OR 0x80 - DB EXPTK - DB ASCII_BKSL OR 0x80 - DB IDIVTK - DB '''' OR 0x80 - DB SNGQTK - DB '>' OR 0x80 - DB GREATK - DB '=' OR 0x80 - DB EQULTK - DB '<' OR 0x80 - DB LESSTK - DB 0 - -; --------------------------------------------------- -; OPERATOR PRECEDENCE TABLE -; --------------------------------------------------- -MB_OPTAB: - DB 121 - DB 121 - DB 124 - DB 124 - DB 127 - DB 80 - DB 70 - DB 60 ; PRECEDENCE OF "XOR" - DB 50 ; PRECEDENCE OF "EQV" - DB 40 ; PRECEDENCE OF "IMP" - DB 122 ; PRECEDENCE OF "MOD" - DB 123 ; PRECEDENCE OF "IDIV" - -; --------------------------------------------------- -; USED BY ASSIGNMENT CODE TO FORCE THE RIGHT HAND VALUE -; TO CORRESPOND TO THE VALUE TYPE OF THE VARIABLE BEING -; ASSIGNED TO. -; --------------------------------------------------- -MB_FRCTBL: - DW MB_FRCDBL - DW 0x0 - DW MB_FRCINT - DW MB_CHKSTR - DW MB_FRCSNG - -; --------------------------------------------------- -; DOUBLE PRECISION ROUTINES -; --------------------------------------------------- -MB_DBLDSP: - DW MB_DADD - DW MB_DSUB - DW MB_DMULT - DW MB_DDIV - DW MB_DCOMP - -; --------------------------------------------------- -; SINGLE PRECISION ROUTINES -; --------------------------------------------------- -MB_SNGDSP: - DW MB_FADD - DW MB_FSUB - DW MB_FMUL - DW MB_FDIV - DW MB_FCOMP - -; --------------------------------------------------- -; INTEGER ROUTINES -; --------------------------------------------------- -MB_INTDSP: - DW MB_IADD - DW MB_ISUB - DW MB_IMUL - DW MB_INTDIV - DW MB_ICOMP - -; --------------------------------------------------- -MB_ERRTAB: - DB 0 - -; --------------------------------------------------- -MB_ERROR_MSGS: - DB "NEXT without FOR\0Syntax error", 0 - DB "RETURN without GOSUB", 0 - DB "Out of DATA", 0 - DB "Illegal function call", 0 - -; --------------------------------------------------- -MB_OVRMSG: - DB "Overflow", 0 - DB "Out of memory", 0 - DB "Undefined line number", 0 - DB "Subscript out of range", 0 - DB "Duplicate Definition", 0 - -; --------------------------------------------------- -MB_DBZ_MSG: - DB "Division by zero", 0 - DB "Illegal direct", 0 - DB "Type mismatch", 0 - DB "Out of string space", 0 - DB "String too long", 0 - DB "String formula too complex", 0 - DB "Can't continue", 0 - DB "Undefined user function", 0 - DB "No RESUME\0RESUME without error", 0 - DB "Unprintable error", 0 - DB "Missing operand", 0 - DB "Line buffer overflow", 0 - DB '?', 0 - DB '?', 0 - DB "FOR Without NEXT", 0 - DB '?', 0 - DB '?', 0 - DB "WHILE without WEND", 0 - DB "WEND without WHILE", 0 - DB "FIELD overflow", 0 - DB "Internal error", 0 - DB "Bad file number", 0 - DB "File not found", 0 - DB "Bad file mode", 0 - DB "File already open", 0 - DB '?', 0 - DB "Disk I/O error", 0 - DB "File already exists", 0 - DB '?', 0 - DB '?', 0 - DB "Disk full", 0 - DB "Input past end", 0 - DB "Bad record number", 0 - DB "Bad file name", 0 - DB '?', 0 - DB "Direct statement in file", 0 - DB "Too many files", 0 - - -; --------------------------------------------------- -MB_USRTAB: - DW MB_FCERR - DW MB_FCERR - DW MB_FCERR - DW MB_FCERR - DW MB_FCERR - DW MB_FCERR - DW MB_FCERR - DW MB_FCERR - DW MB_FCERR - DW MB_FCERR - -; --------------------------------------------------- -MB_NULCNT: - DB 1 ; NUMBER OF NULLS TO PRINT AFTER CRLF -MB_CHARC: - DB 0 ; EATEN CHAR WHEN NOT A ^C -MB_ERRFLG: - DB 0 ; ERROR NUMBER SO EDIT CAN BE CALLED ON "SYNTAX ERROR" -MB_LPTLST: - DB 0 ; LAST LINE PRINTER OPERATION. ZERO MEANS LINEFEED -MB_LPTPOS: - DB 0 ; POSITION OF LPT PRINT HEAD -MB_PRTFLG: - DB 0x00 -MB_NLPPOS: - DB 112 ; (((LPTLEN/CLMWID)-1)*CLMWID) - LAST COMMA FIELD POSIT -MB_LPTSIZ: - DB 132 ; DEFAULT LINE PRINTER WIDTH -MB_LINLEN: - DB LINLN -MB_CLMLST: - DB 56 ; POSITION OF LAST COMMA COLUMN -MB_RUBSW: - DB 0 ; RUBOUT SWITCH=1 INSIDE THE PROCESSING OF A RUBOUT (INLIN) -MB_CNTOFL: - DB 0 ; SUPRESS OUTPUT FLAG, NON-ZERO MEANS SUPRESS -MB_PTRFIL: - DW 0 ; POINTER TO DATA BLOCK OF CURRENT FILE -MB_TOPMEM: - DW MB_TSTACK+100 -MB_CURLIN: - DW 65534 ; CURRENT LINE # -MB_TXTTAB: - DW MB_TSTACK+1 ; MB_TSTACK+1 -MB_OVERRI: - DW MB_OVRMSG ; = "Overflow" - -; =================================================== -; END OF INITIALIZED PART OF RAM -; =================================================== - - -; =================================================== -; DISK DATA STORAGE AREA -; =================================================== -MB_LSTFRE: - DW 0 ; FREE PLACE IN DIRECTORY -MB_MAXTRK: - DB 0 ; ALLOCATE INSIDE THIS TRACK -MB_DSKMOD: - DB 0 ; MODE OF FILE JUST LOOKED UP, ZERO IF FILE WAS JUST CREATED -MB_FILPT1: - DW 0 ; [FILPTR] ALWAYS REFETCHED FROM HERE - - -; POINTERS TO DATA BLOCKS FOR EACH FILE -MB_FILPTR: - .16 DW 0x0000 - -; HIGHEST FILE NUMBER ALLOWED -MB_MAXFIL: - DB 0 - -; THE NUMBER OF CHARACTER BEYOND #2 IN A VAR NAME -MB_NAMCNT: - DB 0 - -MB_NAMBUF: - DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - -; TEMP STORAGE DURING NAME SAVE AT INDLOP -MB_NAMTMP: - DW 0 - -MB_FILNA2: - .16 DB 0x00 - -MB_FILNAM: - DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - DB 0x00 - - -MB_CPMVRN: - DB 0 ; CP/M Version Number (#0 is 2.x) - -MB_CPMREA: - DB 0 ; CP/M Read Call - -MB_CPMWRI: - DB 0 ; CP/M Write Call - -MB_RST_INP: ; a colon for restarting input - DB ':' - -MB_KBUF: - .(KBFLEN) DB 0x00 - -MB_BUFMIN: - DB 44 - -MB_BUF: - .256 DB 0x00 - DB 0 ; ALLOW FOR SINGLE QUOTE IN BIG LINE - DB 0 - -MB_ENDBUF: - DB 0 - -MB_TTYPOS: - DB 0 - -MB_DIMFLG: - DB 0 - -;THE TYPE INDICATOR -MB_VALTYP: - DB 0 - -;OPERATOR NUMBER -MB_OPRTYP: - DB 0 - -MB_DORES: - DB 0 -MB_CONTXT: - DW 0 -MB_CONSAV: - DB 0 -MB_CONTYP: - DB 0 - -; SAVED CONSTANT VALUE -MB_CONLO: - .4 DW 0 - -; HIGHEST LOCATION IN MEMORY -MB_MEMSIZ: - DW 0 -; POINTER AT FIRST FREE TEMP DESCRIPTOR -MB_TEMPPT: - DW 0 - -MB_TEMPST: - .15 DB 0 -;MB_DSCTMP: - .15 DB 0 - -; STRING FUNCTIONS BUILD ANSWER DESCRIPTOR HERE -MB_DSCTMP: - .3 DB 0 - -MB_DSCPTR EQU $ - 2 - -MB_FRETOP: - DW 0 -MB_TEMP3: - DW 0 -MB_CPMFIL: - DW 0 -MB_ENDFOR: - DW 0 -MB_DATLIN: - DW 0 -MB_SUBFLG: - DB 0 -MB_FLGINP: - DB 0 -MB_TEMP: - DW 0 -MB_PTRFLG: - DB 0 -MB_AUTFLG: - DB 0 -MB_AUTLIN: - DW 0 -MB_AUTINC: - DW 0 -MB_SAVTXT: - DW 0 -MB_SAVSTK: - DW 0 -MB_ERRLIN: - DW 0 -MB_DOT: - DW 0 -MB_ERRTXT: - DW 0 -MB_ONELIN: - DW 0 -MB_ONEFLG: - DB 0 -MB_TEMP2: - DW 0 -MB_OLDLIN: - DW 0 -MB_OLDTXT: - DW 0 - -; POINTER TO START OF SIMPLE VARIABLE SPACE -MB_VARTAB: - DW 0 - -; POINTER TO BEGINNING OF ARRAY TABLE -MB_ARYTAB: - DW 0 - -; END OF STORAGE IN USE -MB_STREND: - DW 0x00 - -MB_DATPTR: - DW 0x0 - -MB_DEFTBL: - .26 DB 0 - -; PREVIOUS DEFINITION BLOCK ON STACK -MB_PRMSTK: - DW 0 - -; NUMBER OF BYTES IN THE ACTIVE TABLE -MB_PRMLEN: - DW 0 - -; ACTIVE PARAMETER DEFINITION TABLE -MB_PARM1: - .100 DB 0 - -MB_PRMPRV: - DW 0 - -MB_PRMLN2: - DW 0 - -MB_PARM2: - .100 DB 0 - -MB_PRMFLG: - DB 0x00 - -MB_ARYTA2: - DW 0x0 - -; ZERO IF NO FUNCTIONS ACTIVE. SAVES TIME IN SIMPLE SEARCH -MB_NOFUNS: - DB 0 - -; GARBAGE COLLECTION TEMP TO CHAIN THROUGH PARAMETER BLOCKS -MB_TEMP9: - DW 0 - -; COUNT OF ACTIVE FUNCTIONS -MB_FUNACT: - DW 0 - -MB_INPPAS: - DB 0 -MB_NXTTXT: - DW 0 -MB_NXTFLG: - DB 0 -MB_FVALSV: - DW 0 - DW 0 -MB_NXTLIN: - DW 0 -MB_OPTVAL: - DB 0 -MB_OPTFLG: - DB 0 -MB_PATCH: - .30 DB 0 - -MB_TEMPA: - DW 0 -MB_SAVFRE: - DW 0 -MB_MAXREC: - DW 0 -MB_PROFLG: - DB 0 -MB_MRGFLG: - DB 0 -MB_MDLFLG: - DB 0 -MB_CMEPTR: - DW 0 -MB_CMSPTR: - DW 0 -MB_CHNFLG: - DB 0 -MB_CHNLIN: - DW 0 -MB_SWPTMP: - DW 0, 0, 0, 0 -MB_TRCFLG: - DB 0 - -; =================================================== -; THIS IS THE RAM TERMPORARY AREA FOR -; MATH PACKAGE ROUTINES -; =================================================== - - -MB_FLOAT_ACC: - DB 0 ; FLOATING ACCUMULATOR - -MB_DFACLO: - DB 0, 0, 0, 0 ; FOUR LOWEST ORDERS FOR DOUBLE PRECISION - -MB_FACLO: - DB 0, 0 ; MIDDLE ORDER OF MANTISSA - DB 0 ; HIGH ORDER OF MANTISSA - -MB_FAC: - DB 0, 0 ; EXPONENT - -MB_FLGOVC: - DB 0 ; OVERFLOW PRINT FLAG, =0, 1 PRINT - -MB_OVCSTR: - DB 0 - -MB_FANSII: - DB 0 - DB 0 - -MB_ARGLO: - .7 DB 0 ; LOCATION OF SECOND ARGUMENT FOR DOUBLE -MB_ARG: - DB 0 ; PRECISION - -MB_FBUFFR: - .43 DB 0 ; BUFFER FOR FOUT - -; =================================================== -; TEXT CONSTANTS FOR PRINT OUT -; =================================================== - -MB_INTXT: - DB " in ", 0 - -MB_OKTXT: - DB "Ok\r\n", 0 - -MB_BRKTXT: - DB "Break", 0 - -; =================================================== -; FUNCTION -; =================================================== +; ================================================== +; Implementations +; ================================================== ; FIND A "FOR" ENTRY ON THE STACK WITH THE VARIABLE POINTER ; PASSED IN [D, E]. @@ -970,6 +52,7 @@ MB_LOOPER: LD BC, WHLSIZ ADD HL, BC JP MB_LOOPER + MB_STKSRC: CP _FOR RET NZ @@ -1060,13 +143,13 @@ MB_DV0ERR: LD E, ERRDV0 DB 1 MB_NFERR: - LD E, 0x1 + LD E, ERRNF DB 1 MB_DDERR: LD E, ERRDD DB 1 MB_UFERR: - LD E, 0x12 + LD E, ERRUF DB 1 MB_REERR: LD E, ERRRE @@ -1077,7 +160,7 @@ MB_OVERR: LD E, ERROV DB 1 MB_MOERR: - LD E, 0x16 + LD E, ERRMO DB 1 MB_TMERR: LD E, ERRTM @@ -1138,15 +221,18 @@ MB_NOTRAP: LD A, E CP LSTERR ;IS IT PAST LAST ERROR? JP NC, MB_UPERR - CP DSKERR+1 + CP DSKERR + 1 JP NC, MB_NTDER2 CP NONDSK+1 JP C, MB_NTDERR + MB_UPERR: - LD A, 0x28 ; ERRUE+DSKERR-NONDSK + LD A, ERRUE + DSKERR - NONDSK + MB_NTDER2: - SUB 0x13 ; DSKERR-NONDSK FIX OFFSET INTO TABLE OF MESSAGES + SUB DSKERR - NONDSK ; FIX OFFSET INTO TABLE OF MESSAGES LD E, A + MB_NTDERR: CALL MB_REM INC HL @@ -1155,15 +241,15 @@ MB_NTDERR: PUSH HL LD HL, (MB_ERRLIN) EX (SP), HL + MB_ERRFIN: - LD A, (HL) ; "NEXT without FOR\0Syntax error" - ; "EXT without FOR\0Syntax error" - ; "Break" + LD A, (HL) CP '?' JP NZ, MB_ERRFN1 POP HL LD HL, MB_ERRTAB JP MB_UPERR + MB_ERRFN1: CALL MB_STROUT POP HL @@ -10927,7 +10013,7 @@ MB_PUTTMP: POP HL LD A, (HL) RET NZ - LD DE, 0x10 + LD DE, ERRST ; String too complex error JP MB_ERROR MB_STROUI: INC HL @@ -10973,7 +10059,7 @@ MB_PPSWRT: RET MB_GARBAG: POP AF - LD DE, 0xe + LD DE, ERRSO ; prepare for OOM error JP Z, MB_ERROR CP A PUSH AF @@ -14686,7 +13772,9 @@ MB_DSKDAT: DW 0x00 ; --------------------------------------------------- -; Entry point to init Basic +; Init Basic +; Sets up certain locations, deletes functions if desired +; and changes this to jmp ready warm start for is ; --------------------------------------------------- MB_INIT: LD HL, MB_TSTACK ; Setup temp stack diff --git a/v5.21/reswords.inc b/v5.21/reswords.inc new file mode 100644 index 0000000..1ae9b7f --- /dev/null +++ b/v5.21/reswords.inc @@ -0,0 +1,272 @@ +; ============================================================================= +; Source codes for Microsoft Basic-80 v5.21 for CP/M +; +; Reserved words definitions +; +; Disassembled by Romych and Ghidra @2026.08.27 +; ============================================================================= + +; --------------------------------------------------- +; Reserved words table +; --------------------------------------------------- +MB_RESLST: + +MB_ATAB: +; --------------------------------------------------- + DB "UT", 'O' OR 0x80, _AUTO + DB 'N', 'D' OR 0x80, _AND + DB 'B', 'S' OR 0x80, _ABS - 0x80 + DB 'T', 'N' OR 0x80, _ATN - 0x80 + DB 'S', 'C' OR 0x80, _ASC - 0x80 + DB 0 +; --------------------------------------------------- +MB_BTAB: + DB 0 + +; --------------------------------------------------- +MB_CTAB: + DB "LOS", 'E' OR 0x80, _CLOSE + DB "ON", 'T' OR 0x80, _CONT + DB "LEA", 'R' OR 0x80, _CLEAR + DB "IN", 'T' OR 0x80, _CINT - 0x80 + DB "SN", 'G' OR 0x80, _CSNG - 0x80 + DB "DB", 'L' OR 0x80, _CDBL - 0x80 + DB 'V', 'I' OR 0x80, _CVI - 0x80 + DB 'V', 'S' OR 0x80, _CVS - 0x80 + DB 'V', 'D' OR 0x80, _CVD - 0x80 + DB "O", 'S' OR 0x80, _COS - 0x80 + DB "HR", '$' OR 0x80, _CHR_ - 0x80 + DB "AL", 'L' OR 0x80, _CALL + DB "OMMO", 'N' OR 0x80, _COMMON + DB "HAI", 'N' OR 0x80, _CHAIN + DB 0 + +; --------------------------------------------------- +MB_DTAB: + DB "ELET", 'E' OR 0x80, _DELETE + DB "AT", 'A' OR 0x80, _DATA + DB 'I', 'M' OR 0x80, _DIM + DB "EFST", 'R' OR 0x80, _DEFSTR + DB "EFIN", 'T' OR 0x80, _DEFINT + DB "EFSN", 'G' OR 0x80, _DEFSNG + DB "EFDB", 'L' OR 0x80, _DEFDBL + DB 'E', 'F' OR 0x80, _DEF + DB 0 + +; --------------------------------------------------- +MB_ETAB: + DB "LS", 'E' OR 0x80, _ELSE + DB 'N', 'D' OR 0x80, _END + DB "RAS", 'E' OR 0x80, _ERASE + DB "DI", 'T' OR 0x80, _EDIT + DB "RRO", 'R' OR 0x80, _ERROR + DB 'R', 'L' OR 0x80, _ERL + DB 'R', 'R' OR 0x80, _ERR + DB 'X', 'P' OR 0x80, _EXP - 0x80 + DB 'O', 'F' OR 0x80, _EOF - 0x80 + DB 'Q', 'V' OR 0x80, _EQV + DB 0 + +; --------------------------------------------------- +MB_FTAB: + DB 'O', 'R' OR 0x80, _FOR + DB "IEL", 'D' OR 0x80, _FIELD + DB "ILE", 'S' OR 0x80, _FILES + DB 'N' OR 0x80, _FN + DB 'R', 'E' OR 0x80, _FRE - 0x80 + DB 'I', 'X' OR 0x80, _FIX - 0x80 + DB 0 + +; --------------------------------------------------- +MB_GTAB: + DB "OT", 'O' OR 0x80, _GOTO + DB "O T", 'O' OR 0x80, _GOTO + DB "OSU", 'B' OR 0x80, _GOSUB + DB 'E', 'T' OR 0x80, _GET + DB 0 + +; --------------------------------------------------- +MB_HTAB: + DB "EX", '$' OR 0x80, _HEX_ - 0x80 + DB 0 + +; --------------------------------------------------- +MB_ITAB: + DB "NPU", 'T' OR 0x80, _INPUT + DB 'F' OR 0x80, _IF + DB "NST", 'R' OR 0x80, _INSTR + DB 'N', 'T' OR 0x80, _INT - 0x80 + DB 'N', 'P' OR 0x80, _INP - 0x80 + DB 'M', 'P' OR 0x80, _IMP + DB "NKEY", '$' OR 0x80, _INKEY + DB 0 + +; --------------------------------------------------- +MB_JTAB: + DB 0 + +; --------------------------------------------------- +MB_KTAB: + DB "IL", 'L' OR 0x80, _KILL + DB 0 + +; --------------------------------------------------- +MB_LTAB: + DB "PRIN", 'T' OR 0x80, _LPRINT + DB "LIS", 'T' OR 0x80, _LLIST + DB "PO", 'S' OR 0x80, _LPOS - 0x80 + DB 'E', 'T' OR 0x80, _LET + DB "IN", 'E' OR 0x80, _LINE + DB "OA", 'D' OR 0x80, _LOAD + DB "SE", 'T' OR 0x80, _LSET + DB "IS", 'T' OR 0x80, _LIST + DB 'O', 'G' OR 0x80, _LOG - 0x80 + DB 'O', 'C' OR 0x80, _LOC - 0x80 + DB "E", 'N' OR 0x80, _LEN - 0x80 + DB "EFT", '$' OR 0x80, _LEFT_ - 0x80 + DB 'O', 'F' OR 0x80, _LOF - 0x80 + DB 0 + +; --------------------------------------------------- +MB_MTAB: + DB "ERG", 'E' OR 0x80, 0xC5 + DB 'O', 'D' OR 0x80, 0xFC + DB "KI", '$' OR 0x80, _MKI_ - 0x80 + DB "KS", '$' OR 0x80, _MKS_ - 0x80 + DB "KD", '$' OR 0x80, _MKD_ - 0x80 + DB "ID", '$' OR 0x80, _MID_ - 0x80 + DB 0 + +; --------------------------------------------------- +MB_NTAB: + DB "EX", 'T' OR 0x80, _NEXT + DB "UL", 'L' OR 0x80, _NULL + DB "AM", 'E' OR 0x80, _NAME + DB 'E', 'W' OR 0x80, _NEW + DB 'O', 'T' OR 0x80, _NOT + DB 0 + +; --------------------------------------------------- +MB_OTAB: + DB "PE", 'N' OR 0x80, _OPEN + DB 'U', 'T' OR 0x80, _OUT + DB 'N' OR 0x80, _ON + DB 'R' OR 0x80, _OR + DB "CT", '$' OR 0x80, _OCT_ - 0x80 + DB "PTIO", 'N' OR 0x80, _OPTION + DB 0 + +; --------------------------------------------------- +MB_PTAB: + DB "RIN", 'T' OR 0x80, _PRINT + DB 'U', 'T' OR 0x80, _PUT + DB "OK", 'E' OR 0x80, _POKE + DB 'O', 'S' OR 0x80, _POS - 0x80 + DB "EE", 'K' OR 0x80, _PEEK - 0x80 + DB 0 + +; --------------------------------------------------- +MB_QTAB: + DB 0 + +; --------------------------------------------------- +MB_RTAB: + DB "ETUR", 'N' OR 0x80, _RETUR + DB "EA", 'D' OR 0x80, _READ + DB 'U', 'N' OR 0x80, _RUN + DB "ESTOR", 'E' OR 0x80, _RESTORE + DB 'E', 'M' OR 0x80, _REM + DB "ESUM", 'E' OR 0x80, _RESUME + DB "SE", 'T' OR 0x80, _RSET + DB "IGHT", '$' OR 0x80, _RIGHT - 0x80 + DB 'N', 'D' OR 0x80, _RND - 0x80 + DB "ENU", 'M' OR 0x80, _RENUM + DB "ESE", 'T' OR 0x80, _RESET + DB "ANDOMIZ", 'E' OR 0x80, _RANDOMIZE + DB 0 + +; --------------------------------------------------- +MB_STAB: + DB "TO", 'P' OR 0x80, _STOP + DB "WA", 'P' OR 0x80, _SWAP + DB "AV", 'E' OR 0x80, _SAVE + DB "PC", '(' OR 0x80, _SPC + DB "TE", 'P' OR 0x80, _STEP + DB 'G', 'N' OR 0x80, _SGN - 0x80 + DB 'Q', 'R' OR 0x80, _SQR - 0x80 + DB 'I', 'N' OR 0x80, _SIN - 0x80 + DB "TR", '$' OR 0x80, _STR_- 0x80 + DB "TRING", '$' OR 0x80, _STRIN + DB "PACE", '$' OR 0x80, _SPACE - 0x80 + DB "YSTE", 'M' OR 0x80, _SYSTE + DB 0 + +; --------------------------------------------------- +MB_TTAB: + DB "HE", 'N' OR 0x80, _THEN + DB "RO", 'N' OR 0x80, _TRON + DB "ROF", 'F' OR 0x80, _TROFF + DB "AB", '(' OR 0x80, _TAB + DB 'O' OR 0x80, _TO + DB 'A', 'N' OR 0x80, _TAN - 0x80 + DB 0 + +; --------------------------------------------------- +MB_UTAB: + DB "SIN", 'G' OR 0x80, _USING + DB 'S', 'R' OR 0x80, _USR + DB 0 + +; --------------------------------------------------- +MB_VTAB: + DB 'A', 'L' OR 0x80, _VAL - 0x80 + DB "ARPT", 'R' OR 0x80, _VARPTR + DB 0 + +; --------------------------------------------------- +MB_WTAB: + DB "IDT", 'H' OR 0x80, _WIDTH + DB "AI", 'T' OR 0x80, _WAIT + DB "HIL", 'E' OR 0x80, _WHILE + DB "EN", 'D' OR 0x80, _WEND + DB "RIT", 'E' OR 0x80, _WRITE + DB 0 + +; --------------------------------------------------- +MB_XTAB: + DB 'O', 'R' OR 0x80, _XOR + DB 0 + +; --------------------------------------------------- +MB_YTAB: + DB 0 + +; --------------------------------------------------- +MB_ZTAB: + DB 0 + +; --------------------------------------------------- +; +; --------------------------------------------------- +MB_SPCTAB: + DB '+' OR 0x80 + DB PLUSTK + DB '-' OR 0x80 + DB MINUTK + DB '*' OR 0x80 + DB MULTK + DB '/' OR 0x80 + DB DIVTK + DB '^' OR 0x80 + DB EXPTK + DB ASCII_BKSL OR 0x80 + DB IDIVTK + DB '''' OR 0x80 + DB SNGQTK + DB '>' OR 0x80 + DB GREATK + DB '=' OR 0x80 + DB EQULTK + DB '<' OR 0x80 + DB LESSTK + DB 0