496 lines
10 KiB
PHP
496 lines
10 KiB
PHP
; =============================================================================
|
|
; 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
|