MSBASIC-80/v5.21/mb.asm
2026-08-28 12:14:51 +03:00

15012 lines
259 KiB
NASM

; ==================================================
; Source codes for Microsoft Basic-80 v5.21 for CP/M
;
; Disassembled by Romych and Ghidra @2026.08.27
; I tried to keep the original label names as they
; are in the source codes published by Microsoft.
; ==================================================
DEVICE NOSLOT64K
SLDOPT COMMENT WPMEM, ASSERTION, LOGPOINT
INCLUDE "equates.inc"
;LABELSLIST "mb.l"
OUTPUT mb.com
ORG 0x0100
; ---------------------------------------------------
; Entry point
; ---------------------------------------------------
START:
JP MB_INIT
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
; ---------------------------------------------------
; 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_
; 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
; ===================================================
; FIND A "FOR" ENTRY ON THE STACK WITH THE VARIABLE POINTER
; PASSED IN [D, E].
;
MB_FNDFOR:
LD HL, 0x4
ADD HL, SP
MB_LOOPER:
LD A, (HL)
INC HL
CP _WHILE
JP NZ, MB_STKSRC
LD BC, WHLSIZ
ADD HL, BC
JP MB_LOOPER
MB_STKSRC:
CP _FOR
RET NZ
LD C, (HL)
INC HL
LD B, (HL)
INC HL
PUSH HL
LD H, B
LD L, C
LD A, D
OR E
EX DE, HL
JP Z, MB_POPGOF
EX DE, HL
CALL MB_DCOMPR
MB_POPGOF:
LD BC, FORSZC
POP HL
RET Z
ADD HL, BC
JP MB_LOOPER
MB_READYR:
LD BC, MB_STPRDY
JP MB_ERESET
MB_PRGEND:
LD HL, (MB_CURLIN) ;= 65534
LD A, H
AND L
INC A
JP Z, MB_ENDCNJ
LD A, (MB_ONEFLG)
OR A
LD E, ERRNR
JP NZ, MB_ERROR
MB_ENDCNJ:
JP MB_ENDCON
MB_DERDFL:
LD E, ERRDFL
DB 1
MB_ERIOE:
LD E, ERRIOE
DB 1
MB_ERBFM:
LD E, ERRBFM
DB 1
MB_ERFNF:
LD E, ERRFNF
DB 1
MB_ERBFN:
LD E, ERRBFN
DB 1
LD E, ERRIER
DB 1
MB_ERRPE:
LD E, ERRRPE
DB 1
MB_ERFAO:
LD E, ERRFAO
DB 1
; ===================================================
MB_ERNMF:
LD E, 0x40
DB 1
MB_DERBRN:
LD E, 0x3f
DB 1
MB_DERFOV:
LD E, ERRFOV
DB 1
MB_ERTMF:
LD E, ERRTMF
DB 1
MB_DERFAE:
LD E, ERRFAE
JP MB_ERROR
MB_DATSNE:
LD HL, (MB_DATLIN)
LD (MB_CURLIN), HL ;= 65534
; ===================================================
MB_SNERR:
LD E, ERRSN
DB 1
MB_DV0ERR:
LD E, ERRDV0
DB 1
MB_NFERR:
LD E, 0x1
DB 1
MB_DDERR:
LD E, ERRDD
DB 1
MB_UFERR:
LD E, 0x12
DB 1
MB_REERR:
LD E, ERRRE
DB 1
; ===================================================
MB_OVERR:
LD E, ERROV
DB 1
MB_MOERR:
LD E, 0x16
DB 1
MB_TMERR:
LD E, ERRTM
MB_ERROR:
LD HL, (MB_CURLIN) ;= 65534
LD (MB_ERRLIN), HL
XOR A
LD (MB_MRGFLG), A
LD (MB_CHNFLG), A
LD A, H
AND L
INC A
JP Z, MB_ERRESM
LD (MB_DOT), HL
MB_ERRESM:
LD BC, MB_ERRMOR
MB_ERESET:
LD HL, (MB_SAVSTK)
JP MB_STKERR
MB_ERRMOR:
POP BC
LD A, E
LD C, E
LD (MB_ERRFLG), A
LD HL, (MB_SAVTXT)
LD (MB_ERRTXT), HL
EX DE, HL
LD HL, (MB_ERRLIN)
LD A, H
AND L
INC A
JP Z, MB_NTMDCN
LD (MB_OLDLIN), HL
EX DE, HL
LD (MB_OLDTXT), HL
MB_NTMDCN:
LD HL, (MB_ONELIN)
LD A, H
OR L
EX DE, HL
LD HL, MB_ONEFLG
JP Z, MB_NOTRAP
AND (HL)
JP NZ, MB_NOTRAP
DEC (HL)
EX DE, HL
JP MB_GONE4
MB_NOTRAP:
XOR A
LD (HL), A
LD E, C
LD (MB_CNTOFL), A
CALL MB_CRDONZ
LD HL, MB_ERRTAB
LD A, E
CP LSTERR ;IS IT PAST LAST ERROR?
JP NC, MB_UPERR
CP DSKERR+1
JP NC, MB_NTDER2
CP NONDSK+1
JP C, MB_NTDERR
MB_UPERR:
LD A, 0x28 ; ERRUE+DSKERR-NONDSK
MB_NTDER2:
SUB 0x13 ; DSKERR-NONDSK FIX OFFSET INTO TABLE OF MESSAGES
LD E, A
MB_NTDERR:
CALL MB_REM
INC HL
DEC E
JP NZ, 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"
CP '?'
JP NZ, MB_ERRFN1
POP HL
LD HL, MB_ERRTAB
JP MB_UPERR
MB_ERRFN1:
CALL MB_STROUT
POP HL
LD DE, 0xfffe
CALL MB_DCOMPR
CALL Z, MB_CRDO
JP Z, MB_SYSTME
LD A, H
AND L
INC A
CALL NZ, MB_INPRT ;PRINT LINE NUMBER IN [H, L]
;NOW FALL INTO MAIN INTERPRETER LOOP
DB 3Eh
MB_STPRDY:
POP BC
MB_READY:
CALL MB_FINLPT
XOR A
LD (MB_CNTOFL), A
CALL MB_PRGFIN
CALL MB_CRDONZ
LD HL, MB_OKTXT ;= "OK\r\n"
;ERRORS IN CP/M INITIALIZATION, RETURN TO CP/M
MB_REPINI:
CALL WARM_BOOT
LD A, (MB_ERRFLG)
SUB ERRSN
CALL Z, MB_ERREDT
MB_MAIN:
LD HL, 65535
LD (MB_CURLIN), HL ;= 65534
LD A, (MB_AUTFLG)
OR A
JP Z, MB_NTAUTO
LD HL, (MB_AUTLIN)
PUSH HL
CALL MB_LINPTR
POP DE
PUSH DE
CALL MB_FNDLIN
LD A, '*'
JP C, MB_AUTELN
LD A, ASCII_SP
MB_AUTELN:
CALL MB_OUTDO
CALL MB_INLIN
POP DE
JP NC, MB_AUTGOD
XOR A
LD (MB_AUTFLG), A
JP MB_READY
MB_AUTRES:
XOR A
LD (MB_AUTFLG), A
JP MB_AUTSTR
MB_AUTGOD:
LD HL, (MB_AUTINC)
ADD HL, DE
JP C, MB_AUTRES
PUSH DE
LD DE, 65529 ;CHECK FOR LINE # TOO BIG
CALL MB_DCOMPR
POP DE
JP NC, MB_AUTRES
LD (MB_AUTLIN), HL
MB_AUTSTR:
LD A, (MB_BUF)
OR A
JP Z, MB_MAIN
JP MB_EDITRT
MB_NTAUTO:
CALL MB_INLIN
JP C, MB_MAIN
CALL MB_CHRGTR
INC A
DEC A
JP Z, MB_MAIN
PUSH AF
CALL MB_LINGET
CALL MB_BAKSP
LD A, (HL)
CP 0x20
CALL Z, MB_INXHRT
MB_EDENT:
PUSH DE
CALL MB_CRUNCH
POP DE
POP AF
LD (MB_SAVTXT), HL
JP NC, MB_DIRDO
PUSH DE
PUSH BC
CALL MB_PROCHK
CALL MB_CHRGTR
OR A
PUSH AF
EX DE, HL
LD (MB_DOT), HL
EX DE, HL
CALL MB_FNDLIN
JP C, MB_LEXIST
POP AF
PUSH AF
JP Z, MB_USERR
OR A
MB_LEXIST:
PUSH BC
PUSH AF
PUSH HL
CALL MB_DEPTR
POP HL
POP AF
POP BC
PUSH BC
CALL C, MB_DEL
;MB_NO_DEL:
POP DE
POP AF
PUSH DE
JP Z,MB_FINI
POP DE
LD A,(MB_CHNFLG)
OR A
JP NZ,MB_LEVFRE
LD HL,(MB_MEMSIZ)
LD (MB_FRETOP),HL
MB_LEVFRE:
LD HL, (MB_VARTAB)
EX (SP), HL
POP BC
PUSH HL
ADD HL, BC
PUSH HL
CALL MB_BLTU
POP HL
LD (MB_VARTAB), HL
EX DE, HL
LD (HL), H
POP BC
POP DE
PUSH HL
INC HL
INC HL
LD (HL), E
INC HL
LD (HL), D
INC HL
LD DE, MB_KBUF
DEC BC
DEC BC
DEC BC
DEC BC
MB_MLOOPR:
LD A, (DE)
LD (HL), A
INC HL
INC DE
DEC BC
LD A, C
OR B
JP NZ, MB_MLOOPR
MB_FINI:
POP DE
CALL MB_CHEAD
LD HL, DMA_BUFFER
LD (HL), 0x0
LD (MB_FILPTR), HL
LD HL, (MB_PTRFIL)
LD (MB_TEMP2), HL
CALL MB_RUNC
LD HL, (MB_FILPT1)
LD (MB_FILPTR),HL
LD HL, (MB_TEMP2)
LD (MB_PTRFIL), HL
JP MB_MAIN
; ===================================================
MB_LINKER:
LD HL, (MB_TXTTAB)
EX DE, HL
; ---------------------------------------------------
; MB_CHEAD GOES THROUGH PROGRAM STORAGE AND FIXES
; UP ALL THE LINKS. THE END OF EACH
; LINE IS FOUND BY SEARCHING FOR THE ZERO AT THE END.
; THE DOUBLE ZERO LINK IS USED TO DETECT THE END OF THE PROGRAM
; ---------------------------------------------------
MB_CHEAD:
LD H, D
LD L, E
LD A, (HL)
INC HL
OR (HL)
RET Z
INC HL
INC HL
MB_CZLOOP:
INC HL
LD A, (HL)
MB_CZLOO2:
OR A
JP Z, MB_CZLIN
CP ASCII_SP
JP NC, MB_CZLOOP
CP 11
JP C, MB_CZLOOP
CALL MB_CHRGT2
CALL MB_CHRGTR
JP MB_CZLOO2
MB_CZLIN:
INC HL
EX DE, HL
LD (HL), E
INC HL
LD (HL), D
JP MB_CHEAD
; ===================================================
MB_SCNLIN:
LD DE, 0x0
PUSH DE
JP Z, MB_ALLLST
POP DE
CALL MB_LINSPC
PUSH DE
JP Z, MB_SNGLIN
CALL MB_SYNCHR
DB MINUTK
MB_ALLLST:
LD DE, 65530
CALL NZ, MB_LINSPC
JP NZ, MB_SNERR
MB_SNGLIN:
EX DE, HL
POP DE
MB_FNDLN1:
EX (SP), HL
PUSH HL
; ===================================================
MB_FNDLIN:
LD HL, (MB_TXTTAB) ;MB_TXTTAB
MB_FL_LOOP:
LD B, H
LD C, L
LD A, (HL)
INC HL
OR (HL)
DEC HL
RET Z
INC HL
INC HL
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
CALL MB_DCOMPR
LD H, B
LD L, C
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
CCF
RET Z
CCF
RET NC
JP MB_FL_LOOP
; --------------------------------------------------
; FAST CRUNCH - COMPACTIFICATION
; --------------------------------------------------
MB_CRUNCH:
XOR A
LD (MB_DORES), A
LD (MB_OPRTYP), A
LD BC, KBFLEN - 3 ; Get length of krunch buffer
LD DE, MB_KBUF
MB_K_LOOP:
LD A, (HL)
OR A
JP NZ, MB_CR_EMP
MB_CRDONE:
LD HL, KBFLEN + 2
LD A, L
SUB C
LD C, A
LD A, H
SBC A, B
LD B, A
LD HL, MB_RST_INP ;= ':'
XOR A
LD (DE), A
INC DE
LD (DE), A
INC DE
LD (DE), A
RET
MB_CR_EMP:
CP '"'
JP Z, MB_STRNG
CP ASCII_SP
JP Z, MB_STUFFH
LD A, (MB_OPRTYP)
OR A
LD A, (HL)
JP Z, MB_CHK_Q
; --------------------------------------------------
MB_STUFFH:
INC HL
PUSH AF
CALL MB_KRNSAV
POP AF
SUB ':'
JP Z, MB_COLIS
CP _DATA - ':'
JP NZ, MB_NODATT
LD A, 0x1
MB_COLIS:
LD (MB_OPRTYP), A
LD (MB_DORES), A
MB_NODATT:
SUB 'U'
JP NZ, MB_K_LOOP
PUSH AF
MB_STR1:
LD A, (HL)
OR A
EX (SP), HL
LD A, H
POP HL
JP Z, MB_CRDONE
CP (HL)
JP Z, MB_STUFFH
MB_STRNG:
PUSH AF
LD A, (HL)
MB_STRNG2:
INC HL
CALL MB_KRNSAV
JP MB_STR1
MB_CHK_Q:
CP '?'
LD A, _PRINT
PUSH DE
PUSH BC
JP Z, MB_NOTFN2
LD DE, MB_SPCTAB ;= ABh
CALL MB_MAKUPL
CALL MB_ISLET2
JP C, MB_TSTNUM
PUSH HL
LD DE, MB_ST_GO ;= "GO "
CALL MB_SUB_ADR
JP NZ, MB_NOTGOS
CALL MB_CHRGTR
LD DE, MB_ST_TO
CALL MB_SUB_ADR
LD A, _GOTO
JP Z, MB_DO_GTOSUB
LD DE, MB_ST_UB
CALL MB_SUB_ADR
JP NZ, MB_NOTGOS
MB_DO_GTOSUB:
LD A, _GOSUB
POP BC
JP MB_NOTFN2
MB_SUB_ADR:
LD A, (DE)
OR A
RET Z
LD C, A
CALL MB_MAKUPL
CP C
RET NZ
INC HL
INC DE
JP MB_SUB_ADR
MB_ST_GO:
DB "GO ", 0
MB_ST_TO:
DB "TO", 0
MB_ST_UB:
DB "UB", 0
MB_NOTGOS:
POP HL
CALL MB_MAKUPL
PUSH HL
LD HL, MB_ALPTAB ;= 219h
SUB 'A'
ADD A, A
LD C, A
LD B, 0x0
ADD HL, BC
LD E, (HL)
INC HL
LD D, (HL)
POP HL
INC HL
MB_TRYAGA:
PUSH HL
MB_LOPPSI:
CALL MB_MAKUPL
LD C, A
LD A, (DE)
AND 0x7f
JP Z, MB_NOTRES
INC HL
CP C
JP NZ, MB_LOPSKP
LD A, (DE)
INC DE
OR A
JP P, MB_LOPPSI
LD A, C
CP '('
JP Z, MB_ISRESW
LD A, (DE)
CP FNTK
JP Z, MB_ISRESW
CP USRTK
JP Z, MB_ISRESW ; ToDo: ref to BYTE_ram_03fd here looks like error!
CALL MB_MAKUPL
CP '.'
JP Z, MB_ISVARS
CALL MB_TSTANM
MB_ISVARS:
LD A, 0
JP NC, MB_NOTRES
; --------------------------------------------------
; Is reserver word
; --------------------------------------------------
MB_ISRESW:
POP AF
LD A, (DE)
OR A
JP M, MB_NOTFNT ; IF MINUS, WASNT FUNCTION TOKEN
POP BC
POP DE
OR 0x80
PUSH AF
LD A, 0xff
CALL MB_KRNSAV
XOR A
LD (MB_DORES), A
POP AF
CALL MB_KRNSAV
JP MB_K_LOOP
MB_LOPSKP:
POP HL
MB_LOPSK2:
LD A, (DE)
INC DE
OR A
JP P, MB_LOPSK2
INC DE
JP MB_TRYAGA
MB_NOTFNT:
DEC HL
MB_NOTFN2:
PUSH AF
LD DE, MB_ACPT_TOK ; = 8Ch
LD C, A
MB_NX_TK:
LD A, (DE)
OR A
JP Z, MB_TK_END
INC DE
CP C
JP NZ, MB_NX_TK
JP MB_NOTRS2
MB_ACPT_TOK:
db _RESTORE
db _AUTO
db _RENUM
db _DELETE
db _EDIT
db _RESUME
db _ERL
db _ELSE
db _RUN
db _LIST
db _LLIST
db _GOTO
db _THEN
db _GOSUB
db 0
MB_TK_END:
XOR A
db 0xC2 ; JP NZ, 0x013E
MB_NOTRS2:
LD A, 0x1 ; SAY LINE #'S ALLOWED
MB_NOTRS6:
LD (MB_DORES), A
POP AF
POP BC
POP DE
CP _ELSE
PUSH AF
CALL Z, MB_KRNSVC
POP AF
CP _WHILE
JP NZ, MB_NOWLE
CALL MB_KRNSAV
LD A, PLUSTK
MB_NOWLE:
CP SNGQTK
JP NZ, MB_NTSNGT
PUSH AF
CALL MB_KRNSVC
LD A, _REM
CALL MB_KRNSAV
POP AF
PUSH AF
JP MB_STRNG2
MB_TSTNUM:
LD A, (HL)
CP '.'
JP Z, MB_NUMTRY
CP '9' + 1
JP NC, MB_SRCSPC
CP '0'
JP C, MB_SRCSPC
MB_NUMTRY:
LD A, (MB_DORES)
OR A
LD A, (HL)
POP BC
POP DE
JP M, MB_STUFFH
JP Z, MB_FLTGET
CP '.'
JP Z, MB_STUFFH
LD A, 0x0E
CALL MB_KRNSAV
PUSH DE
CALL MB_LINGET
CALL MB_BAKSP
MB_SAVINT:
EX (SP), HL
EX DE, HL
MB_SAVI:
LD A, L
CALL MB_KRNSAV
LD A, H
MB_POPSTF:
POP HL
CALL MB_KRNSAV
JP MB_K_LOOP
MB_FLTGET:
PUSH DE
PUSH BC
LD A, (HL)
CALL MB_FIN
CALL MB_BAKSP
POP BC
POP DE
PUSH HL
LD A, (MB_VALTYP)
CP 0x2
JP NZ, MB_NTINTG
LD HL, (MB_FACLO)
LD A, H
OR A
LD A, 0x2
JP NZ, MB_NTINTG
LD A, L
LD H, L
LD L, IN2CON
CP 10
JP NC, MB_SAVI
ADD A, ONECON
JP MB_POPSTF
MB_NTINTG:
PUSH AF
RRCA
ADD A, INTCON-1
CALL MB_KRNSAV
LD HL, MB_FACLO
CALL MB_GETYPR
JP C, MB_NTDBL
LD HL, MB_DFACLO
MB_NTDBL:
POP AF
MB_MOVCON:
PUSH AF
LD A, (HL)
CALL MB_KRNSAV
POP AF
INC HL
DEC A
JP NZ, MB_MOVCON
POP HL
JP MB_K_LOOP
MB_SRCSPC:
LD DE, MB_ZTAB ;SPCTAB-1
MB_SRCSP2:
INC DE
LD A, (DE) ;= ABh
AND 0x7f
JP Z, MB_NOTRS5
INC DE
CP (HL)
LD A, (DE) ;= F2h
JP NZ, MB_SRCSP2
JP MB_NOTRS1
MB_NTSNGT:
CP '&' ; Octal const?
JP NZ, MB_STUFFH
PUSH HL
CALL MB_CHRGTR
POP HL
CALL MB_MAKUPS
CP 'H'
LD A, OCTCON
JP NZ, MB_WUZOCT
LD A, HEXCON
MB_WUZOCT:
CALL MB_KRNSAV
PUSH DE
PUSH BC
CALL MB_OCTCNS
POP BC
JP MB_SAVINT
MB_KRNSVC:
LD A, ':'
MB_KRNSAV:
LD (DE), A
INC DE
DEC BC
LD A, C
OR B
RET NZ
MB_LBOERR:
LD E, ERRLBO
JP MB_ERROR
MB_NOTRES:
POP HL
DEC HL
DEC A
LD (MB_DORES), A
POP BC
POP DE
CALL MB_MAKUPL
MB_KRNVAR:
CALL MB_KRNSAV
INC HL
CALL MB_MAKUPL
CALL MB_ISLET2
JP NC, MB_KRNVAR
CP ':'
JP NC, MB_JKLOOP
CP '0'
JP NC, MB_KRNVAR
CP '.'
JP Z, MB_KRNVAR
MB_JKLOOP:
JP MB_K_LOOP
MB_NOTRS5:
LD A, (HL)
CP ASCII_SP
JP NC, MB_NOTRS1
CP ASCII_TAB
JP Z, MB_NOTRS1
CP ASCII_LF
JP Z, MB_NOTRS1
LD A, ASCII_SP
MB_NOTRS1:
PUSH AF
LD A, (MB_DORES)
INC A
JP Z, MB_JNTRS6
DEC A
MB_JNTRS6:
JP MB_NOTRS6
MB_BAKSP:
DEC HL
LD A, (HL)
CP ASCII_SP
JP Z, MB_BAKSP
CP ASCII_TAB
JP Z, MB_BAKSP
CP ASCII_LF
JP Z, MB_BAKSP
INC HL
RET
; ===================================================
; "FOR" STATEMENT
; ===================================================
MB_FOR:
LD A, 100
LD (MB_SUBFLG), A
CALL MB_PTRGET
CALL MB_SYNCHR
DB EQULTK
PUSH DE
EX DE, HL
LD (MB_TEMP), HL
EX DE, HL
LD A, (MB_VALTYP)
PUSH AF
CALL MB_FRMEVL
POP AF
PUSH HL
CALL MB_DOCNVF
LD HL, MB_FVALSV
CALL MB_MOVMF
POP HL
POP DE
POP BC
PUSH HL
CALL MB_DATAS
LD (MB_ENDFOR), HL
LD HL, 0x2
ADD HL, SP
MB_LPFORM:
CALL MB_LOOPER
JP NZ, MB_NOTOL
ADD HL, BC
PUSH DE
DEC HL
LD D, (HL)
DEC HL
LD E, (HL)
INC HL
INC HL
PUSH HL
LD HL, (MB_ENDFOR)
CALL MB_DCOMPR
POP HL
POP DE
JP NZ, MB_LPFORM
POP DE
LD SP, HL
LD (MB_SAVSTK), HL
DB 0Eh
MB_NOTOL:
POP DE
EX DE, HL
LD C, 0x8
CALL MB_GETSTK
PUSH HL
LD HL, (MB_ENDFOR)
EX (SP), HL
PUSH HL
LD HL, (MB_CURLIN) ;= 65534
EX (SP), HL
CALL MB_SYNCHR
DB _TO
CALL MB_GETYPR
JP Z, MB_TMERR
JP NC, MB_TMERR
PUSH AF
CALL MB_FRMEVL
POP AF
PUSH HL
JP P, MB_SNGFOR
CALL MB_FRCINT
EX (SP), HL
LD DE, 0x1
LD A, (HL)
CP STEPTK
CALL Z, MB_GETINT
PUSH DE
PUSH HL
EX DE, HL
CALL MB_ISIGN
JP MB_STPSGN
MB_SNGFOR:
CALL MB_FRCSNG
CALL MB_MOVRF
POP HL
PUSH BC
PUSH DE
LD BC, 0x8100
LD D, C
LD E, D
LD A, (HL)
CP STEPTK
LD A, 0x1
JP NZ, MB_ONEON
CALL MB_FRMCHK
PUSH HL
CALL MB_FRCSNG
CALL MB_MOVRF
CALL MB_SIGN
MB_STPSGN:
POP HL
MB_ONEON:
PUSH BC
PUSH DE
LD C, A
CALL MB_GETYPR
LD B, A
PUSH BC
DEC HL
CALL MB_CHRGTR
JP NZ, MB_SNERR
CALL MB_NXTSCN
CALL MB_CHRGTR
PUSH HL
PUSH HL
LD HL, (MB_NXTLIN)
LD (MB_CURLIN), HL ;= 65534
LD HL, (MB_TEMP)
EX (SP), HL
LD B, _FOR
PUSH BC
INC SP
PUSH AF
PUSH AF
JP MB_NEXTS
MB_NXTCON:
LD B, _FOR
PUSH BC
INC SP
; ===================================================
; NEW STATEMENT FETCHER
; ===================================================
MB_NEWSTT:
PUSH HL
MB_CONST2:
CTC_ADDR2 EQU $+1
CALL WARM_BOOT
POP HL
OR A
CALL NZ, MB_CNTCCN
LD (MB_SAVTXT), HL
EX DE, HL
LD HL, 0x0
ADD HL, SP
LD (MB_SAVSTK), HL
EX DE, HL
LD A, (HL)
CP ':'
JP Z, MB_GONE
OR A
JP NZ, MB_SNERR
INC HL
MB_GONE4:
LD A, (HL)
INC HL
OR (HL)
JP Z, MB_PRGEND
INC HL
LD E, (HL)
INC HL
LD D, (HL)
EX DE, HL
LD (MB_CURLIN), HL ;= 65534
LD A, (MB_TRCFLG)
OR A
JP Z, MB_NOTTRC
PUSH DE
LD A, '['
CALL MB_OUTDO
CALL MB_LINPTR
LD A, ']'
CALL MB_OUTDO
POP DE
MB_NOTTRC:
EX DE, HL
MB_GONE:
CALL MB_CHRGTR
LD DE, MB_NEWSTT
PUSH DE
MB_GONE3:
RET Z
MB_GONE2:
; ; OK240 Mod
; NOP
; NOP
; JP MB_OK240_EXT
SUB _END
JP C, MB_LET
CP NUMCMD
JP NC, MB_ISMID
RLCA
LD C, A
LD B, 0
EX DE, HL
LD HL, MB_STMDSP
ADD HL, BC
LD C, (HL)
INC HL
LD B, (HL)
PUSH BC
EX DE, HL
; ===================================================
; CHRGET - THE NEXT CHARACTER SCAN ROUTINE
; ===================================================
MB_CHRGTR:
INC HL
MB_CHRGT2:
LD A, (HL)
CP ':'
RET NC
; ===================================================
; CHRCON IS THE CONTINUATION OF THE CHRGET RST
; ===================================================
MB_CHRCON:
CP ASCII_SP
JP Z, MB_CHRGTR
JP NC, MB_NOTLFT
OR A
RET Z
CP OCTCON
JP C, MB_NOTCON
CP CONCON
JP NZ, MB_NTRSCC
LD A, (MB_CONSAV)
OR A
RET
MB_NTRSCC:
CP CONCN2
JP Z, MB_NTRSC2
PUSH AF
INC HL
LD (MB_CONSAV), A
SUB INTCON
JP NC, MB_MAKTKN
SUB 0xf5 ; (ONECON-INTCON) & ^O377
JP NC, MB_ONEI
CP 0xfe ; IN2CON-ONECON
JP NZ, MB_FRCINC
LD A, (HL)
INC HL
MB_ONEI:
LD (MB_CONTXT), HL
LD H, 0x0
MB_ONEI2:
LD L, A
LD (MB_CONLO), HL
LD A, 0x2
LD (MB_CONTYP), A
LD HL, MB_NUMCON ;= 1Eh
POP AF
OR A
RET
MB_FRCINC:
LD A, (HL)
INC HL
INC HL
LD (MB_CONTXT), HL
DEC HL
LD H, (HL)
JP MB_ONEI2
MB_RETOKN:
CALL MB_CONFAC
MB_NTRSC2:
LD HL, (MB_CONTXT)
JP MB_CHRGT2
MB_MAKTKN:
INC A
RLCA
LD (MB_CONTYP), A
PUSH DE
PUSH BC
LD DE, MB_CONLO
EX DE, HL
LD B, A
CALL MB_MOVE1
EX DE, HL
POP BC
POP DE
LD (MB_CONTXT), HL
POP AF
LD HL, MB_NUMCON ;= 1Eh
OR A
RET
MB_NOTCON:
CP ASCII_TAB
JP NC, MB_CHRGTR
MB_NOTLFT:
CP '0'
CCF
INC A
DEC A
RET
MB_NUMCON:
DB CONCON
DB CONCN2
; ===================================================
MB_CONFAC:
LD A, (MB_CONSAV)
CP 0xf
JP NC, MB_NTLINE
CP 0xd
JP C, MB_NTLINE
LD HL, (MB_CONLO)
JP NZ, MB_FLTLIN
INC HL
INC HL
INC HL
LD E, (HL)
INC HL
LD D, (HL)
EX DE, HL
MB_FLTLIN:
JP MB_INEG2
MB_NTLINE:
LD A, (MB_CONTYP)
LD (MB_VALTYP), A
CP 0x8
JP Z, MB_CONFDB
LD HL, (MB_CONLO)
LD (MB_FACLO), HL
LD HL, (MB_CONLO + 2)
LD (MB_FAC - 1), HL
RET
MB_CONFDB:
LD HL, MB_CONLO
JP MB_VMOVFM
; ===================================================
; DEFSTR, DEFINT, DEFSNG, DEFDBL, INTIDX
; ===================================================
MB_DEFSTR:
LD E, 0x3 ; DEFAULT SOME LETTERS TO STRING
DB 1
MB_DEFINT:
LD E, 0x2
DB 1
MB_DEFREA:
LD E, 0x4
DB 1
MB_DEFDBL:
LD E, 0x8
MB_DEFCON:
CALL MB_ISLET
LD BC, MB_SNERR
PUSH BC
RET C
SUB 'A'
LD C, A
LD B, A
CALL MB_CHRGTR
CP MINUTK
JP NZ, MB_NOTRNG
CALL MB_CHRGTR
CALL MB_ISLET
RET C
SUB 'A'
LD B, A
CALL MB_CHRGTR
MB_NOTRNG:
LD A, B
SUB C
RET C
INC A
EX (SP), HL
LD HL, MB_DEFTBL
LD B, 0x0
ADD HL, BC
MB_LPDCHG:
LD (HL), E
INC HL
DEC A
JP NZ, MB_LPDCHG
POP HL
LD A, (HL)
CP ','
RET NZ
CALL MB_CHRGTR
JP MB_DEFCON
; --------------------------------------------------
; READS A FORMULA FROM THE CURRENT POSITION AND
; TURNS IT INTO A POSITIVE INTEGER
; LEAVING THE RESULT IN [DE]. NEGATIVE ARGUMENTS
; ARE NOT ALLOWED. [HL] POINTS TO THE TERMINATING
; CHARACTER OF THE FORMULA ON RETURN.
; --------------------------------------------------
MB_INTIDX:
CALL MB_CHRGTR
MB_INTIDX2:
CALL MB_GETIN2
RET P
; ===================================================
MB_FCERR:
LD E, ERRFC
JP MB_ERROR
MB_LINSPC:
LD A, (HL)
CP '.'
EX DE, HL
LD HL, (MB_DOT)
EX DE, HL
JP Z, MB_CHRGTR
; ===================================================
MB_LINGET:
DEC HL
MB_LINGT2:
CALL MB_CHRGTR
CP LINCON
JP Z, MB_LINGT3
CP PTRCON
; ===================================================
MB_LINGT3:
EX DE, HL
LD HL, (MB_CONLO)
EX DE, HL
JP Z, MB_CHRGTR
XOR A
LD (MB_CONSAV), A
DEC HL
LD DE, 0x0
MB_MORLIN:
CALL MB_CHRGTR
RET NC
PUSH HL
PUSH AF
LD HL, 0x1998
CALL MB_DCOMPR
JP C, MB_POPHSR
LD H, D
LD L, E
ADD HL, DE
ADD HL, HL
ADD HL, DE
ADD HL, HL
POP AF
SUB '0'
LD E, A
LD D, 0x0
ADD HL, DE
EX DE, HL
POP HL
JP MB_MORLIN
MB_POPHSR:
POP AF
POP HL
RET
MB_RUN:
JP Z, MB_RUNC
CP LINCON
JP Z, MB_CONRUN
CP PTRCON
JP NZ, MB_LRUN
MB_CONRUN:
CALL MB_CLEARC
LD BC, MB_NEWSTT
JP MB_RUNC2
MB_GOSUB:
LD C, 3
CALL MB_GETSTK
CALL MB_LINGET
POP BC
PUSH HL
PUSH HL
LD HL, (MB_CURLIN) ;= 65534
EX (SP), HL
LD A, _GOSUB
PUSH AF
INC SP
PUSH BC
JP MB_GOTO2
MB_RUNC2:
PUSH BC
MB_GOTO:
CALL MB_LINGET
MB_GOTO2:
LD A, (MB_CONSAV)
CP PTRCON
EX DE, HL
RET Z
CP LINCON
JP NZ, MB_SNERR
EX DE, HL
PUSH HL
LD HL, (MB_CONTXT)
EX (SP), HL
CALL MB_REM
INC HL
PUSH HL
LD HL, (MB_CURLIN) ;= 65534
CALL MB_DCOMPR
POP HL
CALL C, MB_FL_LOOP
CALL NC, MB_FNDLIN
JP NC, MB_USERR
DEC BC
LD A, PTRCON
LD (MB_PTRFLG), A
POP HL
CALL MB_CONCH2
LD H, B
LD L, C
RET
MB_USERR:
LD E, ERRUS
JP MB_ERROR
MB_RETURN:
RET NZ
LD D, 255
CALL MB_FNDFOR
LD SP, HL
LD (MB_SAVSTK), HL
CP _GOSUB
LD E, ERRRG
JP NZ, MB_ERROR
POP HL
LD (MB_CURLIN), HL ;= 65534
LD HL, MB_NEWSTT
EX (SP), HL
DB 3Eh
MB_DATAH:
POP HL
MB_DATAS:
DB 1
DB ':'
MB_REM:
LD C, 0x0
MB_REMZER:
LD B, 0x0
MB_EXCHQT:
LD A, C
LD C, B
LD B, A
MB_REMER:
DEC HL
MB_REMER1:
CALL MB_CHRGTR
OR A
RET Z
CP B
RET Z
INC HL
CP '"'
JP Z, MB_EXCHQT
INC A
JP Z, MB_REMER1
SUB _IF+1
JP NZ, MB_REMER
CP B
ADC A, D
LD D, A
JP MB_REMER
; ===================================================
; LET
; ===================================================
MB_LETCON:
POP AF
ADD A, 0x3
JP MB_LETCN2
MB_LET:
CALL MB_PTRGET
CALL MB_SYNCHR
DB EQULTK ; CHECK FOR "="
EX DE, HL ; MUST SET UP TEMP FOR "FOR"
LD (MB_TEMP), HL
EX DE, HL
PUSH DE
LD A, (MB_VALTYP)
PUSH AF
CALL MB_FRMEVL
POP AF
MB_LETCN2:
EX (SP), HL
MB_INPCOM:
LD B, A
LD A, (MB_VALTYP)
CP B
LD A, B
JP Z, MB_LETCN5
CALL MB_DOCNVF
MB_LETCN4:
LD A, (MB_VALTYP)
MB_LETCN5:
LD DE, MB_FACLO
CP 0x5
JP C, MB_LETCN6
LD DE, MB_DFACLO
MB_LETCN6:
PUSH HL
CP 0x3
JP NZ, MB_COPNUM
LD HL, (MB_FACLO)
PUSH HL
INC HL
LD E, (HL)
INC HL
LD D, (HL)
LD HL, (MB_TXTTAB) ;= 6040h
CALL MB_DCOMPR
JP NC, MB_INBUFC
LD HL, (MB_STREND)
CALL MB_DCOMPR
POP DE
JP NC, MB_DNTCPY
LD HL, MB_DSCTMP
CALL MB_DCOMPR
JP NC, MB_DNTCPY
DB 0x3E
MB_INBUFC:
POP DE
CALL MB_FRETMS
EX DE, HL
CALL MB_STRCPY
MB_DNTCPY:
CALL MB_FRETMS
EX (SP), HL
MB_COPNUM:
CALL MB_VMOVE
POP DE
POP HL
RET
; ===================================================
; ON..GOTO, ON ERROR GOTO CODE
; ===================================================
MB_ONGOTO:
CP _ERROR
JP NZ, MB_NTOERR
CALL MB_CHRGTR
CALL MB_SYNCHR
DB _GOTO
CALL MB_LINGET
LD A, D
OR E
JP Z, MB_RESTRP
CALL MB_FNDLN1
LD D, B
LD E, C
POP HL
JP NC, MB_USERR
MB_RESTRP:
EX DE, HL
LD (MB_ONELIN), HL
EX DE, HL
RET C
LD A, (MB_ONEFLG)
OR A
LD A, E
RET Z
LD A, (MB_ERRFLG)
LD E, A
JP MB_ERRESM
MB_NTOERR:
CALL MB_GETBYT
LD A, (HL)
LD B, A
CP _GOSUB
JP Z, MB_ISGOSU
CALL MB_SYNCHR
DB _GOTO
DEC HL
MB_ISGOSU:
LD C, E
MB_LOOPON:
DEC C
LD A, B
JP Z, MB_GONE2
CALL MB_LINGT2
CP ','
RET NZ
JP MB_LOOPON
MB_RESUME:
LD DE, MB_ONEFLG
LD A, (DE)
OR A
JP Z, MB_REERR
INC A
LD (MB_ERRFLG), A
LD (DE), A
LD A, (HL)
CP _NEXT
JP Z, MB_RESNXT
CALL MB_LINGET
RET NZ
LD A, D
OR E
JP NZ, MB_GOTO2
INC A
JP MB_RESTXT
MB_RESNXT:
CALL MB_CHRGTR
RET NZ
MB_RESTXT:
LD HL, (MB_ERRTXT)
EX DE, HL
LD HL, (MB_ERRLIN)
LD (MB_CURLIN), HL ;= 65534
EX DE, HL
RET NZ
LD A, (HL)
OR A
JP NZ, MB_NOTBGL
INC HL
INC HL
INC HL
INC HL
MB_NOTBGL:
INC HL
JP MB_DATAS
MB_ERRORS:
CALL MB_GETBYT
RET NZ
OR A
JP Z, MB_FCERR
JP MB_ERROR
MB_AUTO:
LD DE, 10
PUSH DE
JP Z, MB_SNGAUT
CALL MB_LINSPC
EX DE, HL
EX (SP), HL
JP Z, MB_SNGAU1
EX DE, HL
CALL MB_SYNCHR
DB ','
EX DE, HL
LD HL, (MB_AUTINC)
EX DE, HL
JP Z, MB_SNGAUT
CALL MB_LINGET
JP NZ, MB_SNERR
MB_SNGAUT:
EX DE, HL
MB_SNGAU1:
LD A, H
OR L
JP Z, MB_FCERR
LD (MB_AUTINC), HL
LD (MB_AUTFLG), A
POP HL
LD (MB_AUTLIN), HL
POP BC
JP MB_MAIN
;IF ... THEN code
MB_IFS:
CALL MB_FRMEVL
LD A, (HL)
CP ','
CALL Z, MB_CHRGTR
CP _GOTO
JP Z, MB_OKGOTO
CALL MB_SYNCHR
DB THENTK
DEC HL
MB_OKGOTO:
PUSH HL
CALL MB_VSIGN
POP HL
JP Z, MB_FALSIF
MB_DOCOND:
CALL MB_CHRGTR
RET Z
CP LINCON
JP Z, MB_GOTO
CP PTRCON
JP NZ, MB_GONE2
LD HL, (MB_CONLO)
RET
MB_FALSIF:
LD D, 0x1
MB_SKPMRF:
CALL MB_DATAS
OR A
RET Z
CALL MB_CHRGTR
CP _ELSE
JP NZ, MB_SKPMRF
DEC D
JP NZ, MB_SKPMRF
JP MB_DOCOND
MB_LPRINT:
LD A, 0x1
LD (MB_PRTFLG), A
JP MB_NEWCHAR
MB_PRINT:
LD C, 0x2
CALL MB_FILGET
MB_NEWCHAR:
DEC HL
CALL MB_CHRGTR
CALL Z, MB_CRDO
MB_PRINTC:
JP Z, MB_FINPRT
CP USINTK
JP Z, MB_PRINUS
CP TABTK
JP Z, MB_TABER
CP SPCTK
JP Z, MB_TABER
PUSH HL
CP ','
JP Z, MB_COMPRT
CP ';'
JP Z, MB_NOTABR
POP BC
CALL MB_FRMEVL
PUSH HL
CALL MB_GETYPR
JP Z, MB_STRDON
CALL MB_FOUT
CALL MB_STRLIT
LD (HL), ASCII_SP
LD HL, (MB_FACLO)
INC (HL)
MB_STRDON:
CALL MB_PTRFILZ
JP NZ, MB_LINCH2
LD HL, (MB_FACLO)
LD A, (MB_PRTFLG)
OR A
JP Z, MB_ISTTY
LD A, (MB_LPTSIZ) ;= 132
LD B, A
INC A
JP Z, MB_LINCH2
LD A, (MB_LPTPOS)
OR A
JP Z, MB_LINCH2
ADD A, (HL)
CCF
JP NC, MB_LINCHK
DEC A
CP B
JP MB_LINCHK
MB_ISTTY:
LD A, (MB_LINLEN) ;= 80
LD B, A
INC A
JP Z, MB_LINCH2
LD A, (MB_TTYPOS)
OR A
JP Z, MB_LINCH2
ADD A, (HL)
CCF
JP NC, MB_LINCHK
DEC A
CP B
MB_LINCHK:
CALL NC, MB_CRDO
MB_LINCH2:
CALL MB_STRPRT
POP HL
JP MB_NEWCHAR
MB_COMPRT:
LD BC, NMLO.C
LD HL, (MB_PTRFIL)
ADD HL, BC
CALL MB_PTRFILZ
LD A, (HL)
JP NZ, MB_MORCOM
LD A, (MB_PRTFLG)
OR A
JP Z, ISCTTY
LD A, (MB_NLPPOS) ;= 112
LD B, A
INC A
LD A, (MB_LPTPOS)
JP Z, MB_MORCOM
CP B
JP MB_CHKCOM
ISCTTY:
LD A, (MB_CLMLST) ;= 56
LD B, A
LD A, (MB_TTYPOS)
CP 0xff
JP Z, MB_MORCOM
CP B
MB_CHKCOM:
CALL NC, MB_CRDO
JP NC, MB_NOTABR
MB_MORCOM:
SUB CLMWID
JP NC, MB_MORCOM
CPL
JP MB_ASPA2
; --------------------------------------------------
; TAB or SPC fn
; --------------------------------------------------
MB_TABER:
PUSH AF
CALL MB_CHRGTR
CALL MB_GETIN2
POP AF
PUSH AF
CP SPCTK
JP Z, MB_SPCNDC
DEC DE
MB_SPCNDC:
LD A, D
OR A
JP P, MB_TBNONG
LD DE, 0x0000
MB_TBNONG:
PUSH HL
CALL MB_PTRFILZ
JP NZ, MB_LNOMOD
LD A, (MB_PRTFLG)
OR A
LD A, (MB_LPTSIZ) ;= 132
JP NZ, MB_LPTMDF
LD A, (MB_LINLEN) ;= 80
MB_LPTMDF:
LD L, A
INC A
JP Z, MB_LNOMOD
LD H, 0x0
CALL MB_IMOD
EX DE, HL
MB_LNOMOD:
POP HL
CALL MB_SYNCHR
DB ')'
DEC HL
POP AF
SUB SPCTK
PUSH HL
JP Z, MB_DOSIZT
LD BC, NMLO.C
LD HL, (MB_PTRFIL)
ADD HL, BC
CALL MB_PTRFILZ
LD A, (HL)
JP NZ, MB_DOSIZT
LD A, (MB_PRTFLG)
OR A
JP Z, MB_TTYIST
LD A, (MB_LPTPOS)
JP MB_DOSIZT
MB_TTYIST:
LD A, (MB_TTYPOS)
MB_DOSIZT:
CPL
ADD A, E
JP C, MB_ASPA2
INC A
JP Z, MB_NOTABR
CALL MB_CRDO
LD A, E
DEC A
JP M, MB_NOTABR
MB_ASPA2:
INC A
MB_ASPAC:
LD B, A
LD A, ASCII_SP
MB_REPOUT:
CALL MB_OUTDO
DEC B
JP NZ, MB_REPOUT
MB_NOTABR:
POP HL
CALL MB_CHRGTR
JP MB_PRINTC
; ===================================================
MB_FINPRT:
XOR A
LD (MB_PRTFLG), A
PUSH HL
LD H, A
LD L, A
LD (MB_PTRFIL), HL
POP HL
RET
MB_LINE:
CALL MB_SYNCHR
DB _INPUT
CP '#'
JP Z, MB_DLINE
CALL MB_SCNSEM
CALL MB_QTINP
CALL MB_PTRGET
CALL MB_CHKSTR
PUSH DE
PUSH HL
CALL MB_SINLIN
POP DE
POP BC
JP C, MB_STPEND
PUSH BC
PUSH DE
LD B, 0x0
CALL MB_STRLT3
POP HL
LD A, 0x3
JP MB_LETCN2
MB_TRYAGN:
DB "?Redo from start\r\n",0
MB_SCNSTR:
INC HL
LD A, (HL)
OR A
JP Z, MB_SNERR
CP '"'
JP NZ, MB_SCNSTR
JP MB_SCNCON
MB_INPBAK:
POP HL
POP HL
JP MB_RDOIN2
MB_TRMNOK:
LD A, (MB_FLGINP)
OR A
JP NZ, MB_DATSNE
MB_RDOIN2:
POP BC
LD HL, MB_TRYAGN ;= "?Redo from start"
CALL MB_STROUT
LD HL, (MB_SAVTXT)
RET
MB_FILSTI:
CALL MB_FILINP
PUSH HL
LD HL, MB_BUFMIN ;= 44
JP MB_INPCN3
MB_INPUT:
CP '#'
JP Z, MB_FILSTI
CALL MB_SCNSEM
LD BC, MB_NOTQTI
PUSH BC
MB_QTINP:
CP '"'
LD A, 0x0
LD (MB_CNTOFL), A
LD A, 0xff
LD (MB_TEMPA+1), A
RET NZ
CALL MB_STRLTI
LD A, (HL)
CP ','
JP NZ, MB_NTICMA
XOR A
LD (MB_TEMPA+1), A
CALL MB_CHRGTR
JP MB_INPCMA
MB_NTICMA:
CALL MB_SYNCHR
DB ';'
MB_INPCMA:
PUSH HL
CALL MB_STRPRT
POP HL
RET
MB_NOTQTI:
PUSH HL
MB_GETAGN:
LD A, (MB_TEMPA+1)
OR A
JP Z, MB_SUPPRS
LD A, '?'
CALL MB_OUTDO
LD A, ASCII_SP
CALL MB_OUTDO
MB_SUPPRS:
CALL MB_SINLIN
POP BC
JP C, MB_STPEND
PUSH BC
XOR A
LD (MB_FLGINP), A
LD (HL), ','
EX DE, HL
POP HL
PUSH HL
PUSH DE
PUSH DE
DEC HL
MB_VARLOP:
LD A, 0x80
LD (MB_SUBFLG), A
CALL MB_CHRGTR
CALL MB_NVRFIL
LD A, (HL)
DEC HL
CP '['
JP Z, MB_IS_ARR
CP '('
JP NZ, MB_ENDSCN
MB_IS_ARR:
INC HL
LD B, 0x0
MB_SCNOPN:
INC B
MB_SCNCON:
CALL MB_CHRGTR
JP Z, MB_SNERR
CP '"'
JP Z, MB_SCNSTR
CP '('
JP Z, MB_SCNOPN
CP '['
JP Z, MB_SCNCON
CP ']'
JP Z, MB_ARR_CLOS
CP ')'
JP NZ, MB_SCNCON
MB_ARR_CLOS:
DEC B
JP NZ, MB_SCNCON
MB_ENDSCN:
CALL MB_CHRGTR
JP Z, MB_OKVLST
CP ','
JP NZ, MB_SNERR
MB_OKVLST:
EX (SP), HL
LD A, (HL)
CP ','
JP NZ, MB_INPBAK
LD A, 0x1
LD (MB_OVCSTR), A
CALL SCNVAL
LD A, (MB_OVCSTR)
DEC A
JP NZ, MB_INPBAK
PUSH HL
CALL MB_GETYPR
CALL Z, MB_FREFAC
POP HL
DEC HL
CALL MB_CHRGTR
EX (SP), HL
LD A, (HL)
CP ','
JP Z, MB_VARLOP
POP HL
DEC HL
CALL MB_CHRGTR
OR A
POP HL
JP NZ, MB_RDOIN2
MB_INPCN3:
LD (HL), ',' ; = 44
JP MB_INPCON
MB_READ:
PUSH HL
LD HL, (MB_DATPTR)
DB 0xF6 ; OR i
MB_INPCON:
XOR A
LD (MB_FLGINP), A
EX (SP), HL
JP MB_LOPDAT
MB_LOPDT2:
CALL MB_SYNCHR
DB ','
MB_LOPDAT:
CALL MB_PTRGET
EX (SP), HL
PUSH DE
LD A, (HL) ;= 44
CP ','
JP Z, MB_DATBK
LD A, (MB_FLGINP)
OR A
JP NZ, MB_DATLOP
MB_DATBK:
DB 0xF6 ; SET A NON-ZERO
SCNVAL:
XOR A
LD (MB_INPPAS), A
CALL MB_PTRFILZ
JP NZ, MB_FILIND
CALL MB_GETYPR
PUSH AF
JP NZ, MB_NUMINS
CALL MB_CHRGTR
LD D, A
LD B, A
CP '"'
JP Z, MB_NOWGET
LD A, (MB_FLGINP)
OR A
LD D, A
JP Z, MB_NCOLST
LD D, ':'
MB_NCOLST:
LD B, ','
DEC HL
MB_NOWGET:
CALL MB_STRLT2
MB_DOASIG:
POP AF
ADD A, 0x3
LD C, A
LD A, (MB_INPPAS)
OR A
RET Z
LD A, C
EX DE, HL
LD HL, MB_STRDN2
EX (SP), HL
PUSH DE
JP MB_INPCOM
MB_NUMINS:
CALL MB_CHRGTR
POP AF
PUSH AF
LD BC, MB_DOASIG
PUSH BC
JP C, MB_FIN
JP MB_FINDBL
MB_STRDN2:
DEC HL
CALL MB_CHRGTR
JP Z, MB_TRMOK
CP ','
JP NZ, MB_TRMNOK
MB_TRMOK:
EX (SP), HL
DEC HL
CALL MB_CHRGTR
JP NZ, MB_LOPDT2
POP DE
LD A, (MB_FLGINP)
OR A
EX DE, HL
JP NZ, MB_RESFIN
PUSH DE
POP HL
JP MB_FINPRT
MB_DATLOP:
CALL MB_DATAS
OR A
JP NZ, MB_NOWLIN
INC HL
LD A, (HL)
INC HL
OR (HL)
LD E, ERROD
JP Z, MB_ERROR
INC HL
LD E, (HL)
INC HL
LD D, (HL)
EX DE, HL
LD (MB_DATLIN), HL
EX DE, HL
MB_NOWLIN:
CALL MB_CHRGTR
CP _DATA
JP NZ, MB_DATLOP
JP MB_DATBK
; ===================================================
MB_FRMEQL:
CALL MB_SYNCHR
DB EQULTK
JP MB_FRMEVL
MB_FRMPRN:
CALL MB_SYNCHR
DB '('
; --------------------------------------------------
; EVALUATE A FORMULA
; --------------------------------------------------
MB_FRMEVL:
DEC HL
MB_FRMCHK:
LD D, 0x0
; ==================================================
MB_LPOPER:
PUSH DE
LD C, 0x1
CALL MB_GETSTK
CALL MB_EVAL
XOR A
LD (MB_FLGOVC), A
MB_TSTOP:
LD (MB_TEMP2), HL
MB_RETAOP:
LD HL, (MB_TEMP2)
POP BC
LD A, (HL)
LD (MB_TEMP3), HL
CP GREATK
RET C
CP LESSTK+1
JP C, MB_DORELS
SUB PLUSTK
LD E, A
JP NZ, MB_NTPLUS ; not +
LD A, (MB_VALTYP)
CP 0x3
LD A, E
JP Z, MB_CAT
MB_NTPLUS:
CP LSTOPK ; last op?
RET NC
LD HL, MB_OPTAB
LD D, 0x0
ADD HL, DE
LD A, B
LD D, (HL) ; op precedence in D, old in A
CP D
RET NC ; ret if old op has precedence
; else new op
PUSH BC
LD BC, MB_RETAOP ; return after op
PUSH BC ; on stack
LD A, D
CP 127 ; new has precedence 127?
JP Z, MB_EXPSTK ; make special stack entry
CP 81 ; Op is "AND" or "OR"?
JP C, MB_ANDORD
AND 0xfe ; 0x7A, 0x7B -> 0x7A
CP 122 ; 0x7A?
JP Z, MB_ANDORD
MB_NUMREL:
LD HL, MB_FACLO
LD A, (MB_VALTYP)
SUB 0x3
JP Z, MB_TMERR
OR A
LD C, (HL)
INC HL
LD B, (HL)
PUSH BC
JP M, MB_VPUSHD
INC HL
LD C, (HL)
INC HL
LD B, (HL)
PUSH BC
JP PO, MB_VPUSHD
LD HL, MB_DFACLO
LD C, (HL)
INC HL
LD B, (HL)
INC HL
PUSH BC
LD C, (HL)
INC HL
LD B, (HL)
PUSH BC
MB_VPUSHD:
ADD A, 0x3
LD C, E
LD B, A
PUSH BC
LD BC, MB_APPLOP
MB_FINTMP:
PUSH BC
LD HL, (MB_TEMP3)
JP MB_LPOPER
MB_DORELS:
LD D, 0x0
MB_LOPREL:
SUB GREATK
JP C, MB_FINREL
CP NMREL
JP NC, MB_FINREL
CP 0x1
RLA
XOR D
CP D
LD D, A
JP C, MB_SNERR
LD (MB_TEMP3), HL
CALL MB_CHRGTR
JP MB_LOPREL
MB_EXPSTK:
CALL MB_FRCSNG
CALL MB_PUSHF
LD BC, MB_FPWRQ
LD D, 0x7f
JP MB_FINTMP
MB_ANDORD:
PUSH DE
CALL MB_FRCINT
POP DE
PUSH HL
LD BC, MB_DANDOR
JP MB_FINTMP
MB_FINREL:
LD A, B
CP 100
RET NC
PUSH BC
PUSH DE
LD DE, 0x6404 ;0+256*100+OPCNT
LD HL, MB_DOCMP
PUSH HL
CALL MB_GETYPR
JP NZ, MB_NUMREL
LD HL, (MB_FACLO)
PUSH HL
LD BC, MB_STRCMP
JP MB_FINTMP
MB_APPLOP:
POP BC
LD A, C
LD (MB_OPRTYP), A
LD A, (MB_VALTYP)
CP B
JP NZ, MB_VALNSM
CP 0x2
JP Z, MB_INTDPC
CP 0x4
JP Z, MB_SNGDPC
JP NC, MB_DBLDPC
MB_VALNSM:
LD D, A
LD A, B
CP 0x8
JP Z, MB_STKDBL
LD A, D
CP 0x8
JP Z, MB_FACDBL
LD A, B
CP 0x4
JP Z, MB_STKSNG
LD A, D
CP 0x3
JP Z, MB_TMERR
JP NC, MB_FACSNG
MB_INTDPC:
LD HL, MB_INTDSP ;= 2B31h
LD B, 0x0
ADD HL, BC
ADD HL, BC
LD C, (HL)
INC HL
LD B, (HL)
POP DE
LD HL, (MB_FACLO)
PUSH BC
RET
MB_STKDBL:
CALL MB_FRCDBL
MB_DBLDPC:
CALL MB_VMOVAF
POP HL
LD (MB_DFACLO+2), HL
POP HL
LD (MB_DFACLO), HL
MB_SNGDBL:
POP BC
POP DE
CALL MB_MOVFR
MB_SETDBL:
CALL MB_FRCDBL
LD HL, MB_DBLDSP ;= 2C26h
MB_DODSP:
LD A, (MB_OPRTYP)
RLCA
ADD A, L
LD L, A
ADC A, H
SUB L
LD H, A
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
JP (HL)
MB_FACDBL:
LD A, B
PUSH AF
CALL MB_VMOVAF
POP AF
LD (MB_VALTYP), A
CP 0x4
JP Z, MB_SNGDBL
POP HL
LD (MB_FACLO), HL
JP MB_SETDBL
MB_STKSNG:
CALL MB_FRCSNG
MB_SNGDPC:
POP BC
POP DE
MB_SNGDO:
LD HL, MB_SNGDSP ;= 2588h
JP MB_DODSP
MB_FACSNG:
POP HL
CALL MB_PUSHF
CALL MB_CONSIH
CALL MB_MOVRF
POP HL
LD (MB_FAC-1), HL
POP HL
LD (MB_FACLO), HL
JP MB_SNGDO
MB_INTDIV:
PUSH HL
EX DE, HL
CALL MB_CONSIH
POP HL
CALL MB_PUSHF
CALL MB_CONSIH
JP MB_FDIVT
; ===================================================
; EVAL - EVALUATE VARIABLE, CONSTANT, FUNCTION CALL
; ===================================================
MB_EVAL:
CALL MB_CHRGTR
JP Z, MB_MOERR
JP C, MB_FIN
CALL MB_ISLET2
JP NC, MB_ISVAR
CP DBLCON+1
JP C, MB_RETOKN
INC A
JP Z, MB_ISFUN
DEC A
CP PLUSTK
JP Z, MB_EVAL
CP MINUTK
JP Z, MB_DOMIN
CP '"'
JP Z, MB_STRLTI
CP NOTTK
JP Z, MB_NOTER
CP '&'
JP Z, MB_OCTCNS
CP ERCTK
JP NZ, MB_NTERC
CALL MB_CHRGTR
LD A, (MB_ERRFLG)
MB_NTDERC:
PUSH HL
CALL MB_SNGFLT
POP HL
RET
MB_NTERC:
CP ERLTK
JP NZ, MB_NTERL
CALL MB_CHRGTR
PUSH HL
LD HL, (MB_ERRLIN)
CALL MB_INEG2
POP HL
RET
MB_NTERL:
CP _VARPTR
JP NZ, MB_NTVARP
CALL MB_CHRGTR
CALL MB_SYNCHR
DB '('
CP '#'
JP NZ, MB_NVRFIL1
CALL MB_GTBYTC
PUSH HL
CALL MB_GETPTR
POP HL
JP MB_VARRET
MB_NVRFIL1:
CALL MB_NVRFIL
MB_VARRET:
CALL MB_SYNCHR
DB ')'
PUSH HL
EX DE, HL
LD A, H
OR L
JP Z, MB_FCERR
CALL MB_MAKINT
POP HL
RET
MB_NTVARP:
CP USRTK
JP Z, MB_USRFN
CP INSRTK
JP Z, MB_INSTR
CP _INKEY
JP Z, MB_INKEY
CP _STRIN
JP Z, MB_STRNG_
CP _INPUT
JP Z, MB_FIXINP
CP FNTK
JP Z, MB_FNDOER
MB_PARCHK:
CALL MB_FRMPRN
CALL MB_SYNCHR
DB ')'
RET
MB_DOMIN:
LD D, 0x7d
CALL MB_LPOPER
LD HL, (MB_TEMP2)
PUSH HL
CALL MB_VNEG
MB_LABBCK:
POP HL
RET
MB_ISVAR:
CALL MB_PTRGET
MB_RETVAR:
PUSH HL
EX DE, HL
LD (MB_FACLO), HL
CALL MB_GETYPR
CALL NZ, MB_VMOVFM
POP HL
RET
MB_MAKUPL:
LD A, (HL)
; --------------------------------------------------
; UprrerCase character in [A]
; --------------------------------------------------
MB_MAKUPS:
CP 'A' + 0x20 ; Lower case range?
RET C ; ret if Upper
CP 'Z' + 0x21
RET NC ; ret if Upper
AND 0x5f ; make Upper case
RET
MB_CNSGET:
CP '&'
JP NZ, MB_LINGET
MB_OCTCNS:
LD DE, 0x0
CALL MB_CHRGTR
CALL MB_MAKUPS
CP 'O'
JP Z, MB_LOPOCT
CP 'H'
JP NZ, MB_LOPOC2
LD B, 5
MB_LOPHEX:
INC HL
LD A, (HL)
CALL MB_MAKUPS
CALL MB_ISLET2
EX DE, HL
JP NC, MB_ALPTST
CP ':'
JP NC, MB_OCTFIN
SUB '0'
JP C, MB_OCTFIN
JP MB_NXTHEX
MB_ALPTST:
CP 'G' ;'F'+1 last hex digit
JP NC, MB_OCTFIN
SUB 0x37
MB_NXTHEX:
ADD HL, HL
ADD HL, HL
ADD HL, HL
ADD HL, HL
OR L
LD L, A
EX DE, HL
DEC B
JP NZ, MB_LOPHEX
JP MB_OVERR
MB_LOPOC2:
DEC HL
MB_LOPOCT:
CALL MB_CHRGTR
EX DE, HL
JP NC, MB_OCTFIN
CP '8'
JP NC, MB_SNERR
LD BC, MB_OVERR
PUSH BC
ADD HL, HL
RET C
ADD HL, HL
RET C
ADD HL, HL
RET C
POP BC
LD B, 0x0
SUB 0x30
LD C, A
ADD HL, BC
EX DE, HL
JP MB_LOPOCT
MB_OCTFIN:
CALL MB_MAKINT
EX DE, HL
RET
MB_ISFUN:
INC HL
LD A, (HL)
SUB ONEFUN
CP 7 ; _RND-ONEFUN
JP NZ, MB_NTMRND
PUSH HL
CALL MB_CHRGTR
CP '('
POP HL
JP NZ, MB_RNDMON
LD A, 0x7 ; _RND-ONEFUN
MB_NTMRND:
LD B, 0x0
RLCA
LD C, A
PUSH BC
CALL MB_CHRGTR
LD A, C
CP NUMGFN
JP NC, MB_OKNORM
CALL MB_FRMPRN
CALL MB_SYNCHR
DB ','
CALL MB_CHKSTR
EX DE, HL
LD HL, (MB_FACLO)
EX (SP), HL
PUSH HL
EX DE, HL
CALL MB_GETBYT
EX DE, HL
EX (SP), HL
JP MB_FINGO
MB_OKNORM:
CALL MB_PARCHK
EX (SP), HL
LD A, L
CP 0xc
JP C, MB_NOTFRF
CP 0x1b
PUSH HL
CALL C, MB_FRCSNG
POP HL
MB_NOTFRF:
LD DE, MB_LABBCK
PUSH DE
LD A, 0x1
LD (MB_FLGOVC), A
MB_FINGO:
LD BC, MB_FUNDSP ;= 4948h
MB_DISPAT:
ADD HL, BC
LD C, (HL) ;= 4948h
INC HL
LD H, (HL)
LD L, C
JP (HL)
; ===================================================
MB_MINPLS:
DEC D
CP MINUTK
RET Z
CP '-'
RET Z
INC D
CP '+'
RET Z
CP PLUSTK
RET Z
DEC HL
RET
; ===================================================
; MORE FORMULA EVALUATION - LOGICAL, RELATIONAL OPS
; ===================================================
MB_DOCMP:
INC A
ADC A, A
POP BC
AND B
ADD A, 0xff
SBC A, A
CALL MB_CONIA
JP MB_RETAPG
MB_NOTER:
LD D, 90
CALL MB_LPOPER
CALL MB_FRCINT
LD A, L
CPL
LD L, A
LD A, H
CPL
LD H, A
LD (MB_FACLO), HL
POP BC
MB_RETAPG:
JP MB_RETAOP
; ===================================================
MB_GETYPR:
LD A, (MB_VALTYP)
CP 0x8
JP NC, MB_NCASE
SUB 0x3
OR A
SCF
RET
MB_NCASE:
SUB 0x3
OR A
RET
; DANDOR APPLIES THE "AND" AND "OR" OPERATORS
; AND SHOULD BE USED TO IMPLEMENT ALL LOGICAL OPERATORS.
MB_DANDOR:
LD A, B
PUSH AF
CALL MB_FRCINT
POP AF
POP DE
CP 122
JP Z, MB_IMOD
CP 123
JP Z, MB_IDIV
LD BC, MB_GIVINT
PUSH BC
CP 70
JP NZ, MB_NOTOR
LD A, E
OR L
LD L, A
LD A, H
OR D
RET
MB_NOTOR:
CP 80
JP NZ, MB_NOTAND
LD A, E
AND L
LD L, A
LD A, H
AND D
RET
MB_NOTAND:
CP 60
JP NZ, MB_NOTXOR
LD A, E
XOR L
LD L, A
LD A, H
XOR D
RET
MB_NOTXOR:
CP 50
JP NZ, MB_NOTEQV
LD A, E
XOR L
CPL
LD L, A
LD A, H
XOR D
CPL
RET
MB_NOTEQV:
LD A, L
CPL
AND E
CPL
LD L, A
LD A, H
CPL
AND D
CPL
RET
; THIS ROUTINE SUBTRACTS [DE] FROM [HL]
; AND FLOATS THE RESULT LEAVING IT IN FAC.
MB_GIVDBL:
LD A, L
SUB E
LD L, A
LD A, H
SBC A, D
LD H, A
JP MB_INEG2
MB_LPOS:
LD A, (MB_LPTPOS)
JP MB_SNGFLI
MB_POS:
LD A, (MB_TTYPOS)
MB_SNGFLI:
INC A
MB_SNGFLT:
LD L, A
XOR A
MB_GIVINT:
LD H, A
JP MB_MAKINT
MB_USRFN:
CALL MB_SCNUSR
PUSH DE
CALL MB_PARCHK
EX (SP), HL
LD E, (HL)
INC HL
LD D, (HL)
LD HL, MB_POPHRT
PUSH HL
PUSH DE
LD A, (MB_VALTYP)
PUSH AF
CP 0x3
CALL Z, MB_FREFAC
POP AF
EX DE, HL
LD HL, MB_FACLO
RET
MB_SCNUSR:
CALL MB_CHRGTR
LD BC, 0x0
CP ONECON+10
JP NC, MB_NOARGU
CP ONECON
JP C, MB_NOARGU
CALL MB_CHRGTR
LD A, (MB_CONLO)
OR A
RLA
LD C, A
MB_NOARGU:
EX DE, HL
LD HL, MB_USRTAB ;= 1418h
ADD HL, BC
EX DE, HL
RET
MB_DEFUSR:
CALL MB_SCNUSR
PUSH DE
CALL MB_SYNCHR
DB EQULTK
CALL MB_GETIN22
EX (SP), HL
LD (HL), E
INC HL
LD (HL), D
POP HL
RET
; ---------------------------------------------------
; SIMPLE-USER-DEFINED-FUNCTION CODE
; ---------------------------------------------------
MB_DEF:
CP USRTK
JP Z, MB_DEFUSR
CALL MB_GETFNM
CALL MB_ERRDIR
EX DE, HL
LD (HL), E
INC HL
LD (HL), D
EX DE, HL
LD A, (HL)
CP '('
JP NZ, MB_DATAS
CALL MB_CHRGTR
MB_DATA:
CALL MB_PTRGET
LD A, (HL)
CP ')'
JP Z, MB_DATAS
CALL MB_SYNCHR
DB ','
JP MB_DATA
MB_FNDOER:
CALL MB_GETFNM
LD A, (MB_VALTYP)
OR A
PUSH AF
LD (MB_TEMP2), HL
EX DE, HL
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
LD A, H
OR L
JP Z, MB_UFERR
LD A, (HL)
CP '('
JP NZ, MB_FINVLS
CALL MB_CHRGTR
LD (MB_TEMP3), HL
EX DE, HL
LD HL, (MB_TEMP2)
CALL MB_SYNCHR
DB '('
XOR A
PUSH AF
PUSH HL
EX DE, HL
MB_ASGMOR:
LD A, 128
LD (MB_SUBFLG), A
CALL MB_PTRGET
EX DE, HL
EX (SP), HL
LD A, (MB_VALTYP)
PUSH AF
PUSH DE
CALL MB_FRMEVL
LD (MB_TEMP2), HL
POP HL
LD (MB_TEMP3), HL
POP AF
CALL MB_DOCNVF
LD C, 0x4
CALL MB_GETSTK
LD HL, 0xfff8
ADD HL, SP
LD SP, HL
CALL MB_VMOVMF
LD A, (MB_VALTYP)
PUSH AF
LD HL, (MB_TEMP2)
LD A, (HL)
CP ')'
JP Z, MB_POPASG
CALL MB_SYNCHR
DB ','
PUSH HL
LD HL, (MB_TEMP3)
CALL MB_SYNCHR
DB ','
JP MB_ASGMOR
MB_POPAS2:
POP AF
LD (MB_PRMLN2), A
MB_POPASG:
POP AF
OR A
JP Z, MB_FINASG
LD (MB_VALTYP), A
LD HL, 0x0
ADD HL, SP
CALL MB_VMOVFM
LD HL, 0x8
ADD HL, SP
LD SP, HL
POP DE
LD L, 0x3
MB_LPSIZL:
INC L
DEC DE
LD A, (DE)
OR A
JP M, MB_LPSIZL
DEC DE
DEC DE
DEC DE
LD A, (MB_VALTYP)
ADD A, L
LD B, A
LD A, (MB_PRMLN2)
LD C, A
ADD A, B
CP PRMSIZ
JP NC, MB_FCERR
PUSH AF
LD A, L
LD B, 0x0
LD HL, MB_PARM2
ADD HL, BC
LD C, A
CALL MB_BCTRAN
LD BC, MB_POPAS2
PUSH BC
PUSH BC
JP MB_LETCN4
MB_FINASG:
LD HL, (MB_TEMP2)
CALL MB_CHRGTR
PUSH HL
LD HL, (MB_TEMP3)
CALL MB_SYNCHR
DB ')'
DB 3Eh
; --------------------------------------------------
MB_FINVLS:
PUSH DE
LD (MB_TEMP3), HL
LD A, (MB_PRMLEN)
ADD A, 0x4
PUSH AF
RRCA
LD C, A
CALL MB_GETSTK
POP AF
LD C, A
CPL
INC A
LD L, A
LD H, 0xff
ADD HL, SP
LD SP, HL
PUSH HL
LD DE, MB_PRMSTK
CALL MB_BCTRAN
POP HL
LD (MB_PRMSTK), HL
LD HL, (MB_PRMLN2)
LD (MB_PRMLEN), HL
LD B, H
LD C, L
LD HL, MB_PARM1
LD DE, MB_PARM2
CALL MB_BCTRAN
LD H, A
LD L, A
LD (MB_PRMLN2), HL
LD HL, (MB_FUNACT)
INC HL
LD (MB_FUNACT), HL
LD A, H
OR L
LD (MB_NOFUNS), A
LD HL, (MB_TEMP3)
CALL MB_FRMEQL
DEC HL
CALL MB_CHRGTR
JP NZ, MB_SNERR
CALL MB_GETYPR
JP NZ, MB_NOCPRS
LD DE, MB_DSCTMP
LD HL, (MB_FACLO)
CALL MB_DCOMPR
JP C, MB_NOCPRS
CALL MB_STRCPY
CALL MB_PUTTMP
MB_NOCPRS:
LD HL, (MB_PRMSTK)
LD D, H
LD E, L
INC HL
INC HL
LD C, (HL)
INC HL
LD B, (HL)
INC BC
INC BC
INC BC
INC BC
LD HL, MB_PRMSTK
CALL MB_BCTRAN
EX DE, HL
LD SP, HL
LD HL, (MB_FUNACT)
DEC HL
LD (MB_FUNACT), HL
LD A, H
OR L
LD (MB_NOFUNS), A
POP HL
POP AF
MB_DOCNVF:
PUSH HL
AND 0x7
LD HL, MB_FRCTBL ;= 2A20h
LD C, A
LD B, 0x0
ADD HL, BC
CALL MB_DISPAT
POP HL
RET
; ---------------------------------------------------
; BLOCK TRANSFER ROUTINE WITH SOURCE IN [DE] DESTINATION IN [HL]
; AND COUNT IN [BC]. TRANSFER IS FORWARD.
; ---------------------------------------------------
MB_BCTRAL:
LD A, (DE)
LD (HL), A
INC HL
INC DE
DEC BC
MB_BCTRAN:
LD A, B
OR C
JP NZ, MB_BCTRAL
RET
MB_ERRDIR:
PUSH HL
LD HL, (MB_CURLIN) ;= 65534
INC HL
LD A, H
OR L
POP HL
RET NZ
LD E, ERRID
JP MB_ERROR
; ---------------------------------------------------
; SUBROUTINE TO GET A POINTER TO A FUNCTION NAME
; ---------------------------------------------------
MB_GETFNM:
CALL MB_SYNCHR
DB FNTK
LD A, 0x80
LD (MB_SUBFLG), A
OR (HL)
LD C, A
JP MB_PTRGT2
; ---------------------------------------------------
; STRING FUNCTIONS - LEFT HAND SIDE MID$
; ---------------------------------------------------
MB_ISMID:
CP 0xff-_END ;377O-$END
JP NZ, MB_SNERR
INC HL
LD A, (HL)
INC HL
CP MIDTK
JP Z, MB_MIDFN
JP MB_SNERR
MB_FNINP:
CALL MB_CONINT
LD (MB_INPWRD+1), A
MB_INPWRD:
IN A, (0x0)
JP MB_SNGFLT
MB_FNOUT:
CALL MB_SETIO
MB_OUTWRD:
OUT (0x0), A
RET
MB_FNWAIT:
CALL MB_SETIO
PUSH AF
LD E, 0x0
DEC HL
CALL MB_CHRGTR
JP Z, MB_NOTTHR
CALL MB_SYNCHR
DB ','
CALL MB_GETBYT
MB_NOTTHR:
POP AF
LD D, A
MB_STAINP:
IN A, (0x0)
XOR E
AND D
JP Z, MB_STAINP
RET
MB_CONSOL:
JP MB_SNERR
MB_WIDTH:
CP _LPRINT
JP NZ, MB_NOTWLP
CALL MB_CHRGTR
CALL MB_GETBYT
LD (MB_LPTSIZ), A ;= 132
LD E, A
CALL MB_MORCP3
LD (MB_NLPPOS), A ;= 112
RET
MB_NOTWLP:
CALL MB_GETBYT
LD (MB_LINLEN), A ;= 80
LD E, A
CALL MB_MORCP3
LD (MB_CLMLST), A ;= 56
RET
MB_MORCP3:
SUB CLMWID
JP NC, MB_MORCP3
ADD A, CLMWID*2
CPL
INC A
ADD A, E
RET
MB_GETINT:
CALL MB_CHRGTR
MB_GETIN2:
CALL MB_FRMEVL
; --------------------------------------------------
; CONVERT THE FAC TO AN INTEGER IN [DE]
; --------------------------------------------------
MB_INTFR2:
PUSH HL
CALL MB_FRCINT
EX DE, HL
POP HL
LD A, D
OR A
RET
MB_SETIO:
CALL MB_GETBYT
LD (MB_STAINP + 1), A
LD (MB_OUTWRD + 1), A
CALL MB_SYNCHR
DB ','
JP MB_GETBYT
MB_GTBYTC:
CALL MB_CHRGTR
; ===================================================
MB_GETBYT:
CALL MB_FRMEVL
; ===================================================
MB_CONINT:
CALL MB_INTFR2
JP NZ, MB_FCERR
DEC HL
CALL MB_CHRGTR
LD A, E
RET
; ===================================================
; EXTENDED LIST, DELETE, LLIST
; ===================================================
MB_LLIST:
LD A, 0x1
LD (MB_PRTFLG), A
MB_LIST:
POP BC
CALL MB_SCNLIN
PUSH BC
CALL MB_PROCHK
MB_LIST4:
LD HL, 0xffff
LD (MB_CURLIN), HL ;= 65534
POP HL
POP DE
LD C, (HL)
INC HL
LD B, (HL)
INC HL
LD A, B
OR C
JP Z, MB_READY
CALL MB_PTRFILZ
CALL Z, MB_ISCNTC
PUSH BC
LD C, (HL)
INC HL
LD B, (HL)
INC HL
PUSH BC
EX (SP), HL
EX DE, HL
CALL MB_DCOMPR
POP BC
JP C, MB_STPRDY
EX (SP), HL
PUSH HL
PUSH BC
EX DE, HL
LD (MB_DOT), HL
CALL MB_LINPTR
POP HL
LD A, (HL)
CP ASCII_TAB
JP Z, MB_NOSPAL
LD A, ' '
CALL MB_OUTDO
MB_NOSPAL:
CALL MB_BUFLIN
LD HL, MB_BUF
CALL MB_LISPRT
CALL MB_CRDO
JP MB_LIST4
MB_LISPRT:
LD A, (HL)
OR A
RET Z
CALL MB_OUTCH1
INC HL
JP MB_LISPRT
MB_BUFLIN:
LD BC, MB_BUF
LD D, 0xff
XOR A
LD (MB_TEMPA), A
CALL MB_PROCHK
JP MB_PLOOP2
MB_PLOOP:
INC BC
INC HL
DEC D
RET Z
MB_PLOOP2:
LD A, (HL)
OR A
LD (BC), A ;= 44
RET Z
CP OCTCON
JP C, MB_NTEMBL
CP ' '
LD E, A
JP C, MB_PRTVAR
MB_NTEMBL:
OR A
JP M, MB_PLOOPR
LD E, A
CP '.'
JP Z, MB_PRTVAR
CALL MB_TSTANM
JP NC, MB_PRTVAR
XOR A
JP MB_PLOOPH
MB_PRTVAR:
LD A, (MB_TEMPA)
OR A
JP Z, MB_PLOOPG
INC A
JP NZ, MB_PLOOPG
LD A, ' '
LD (BC), A ;= 44
INC BC
DEC D
RET Z
MB_PLOOPG:
LD A, 0x1
MB_PLOOPH:
LD (MB_TEMPA), A
LD A, E
CP OCTCON
JP C, MB_PLOOPZ
CP ' '
JP C, MB_NUMLIN
MB_PLOOPZ:
LD (BC), A
JP MB_PLOOP
MB_PLOOPR:
INC A
LD A, (HL)
JP NZ, MB_NTFNTK
INC HL
LD A, (HL)
AND 0x7f
MB_NTFNTK:
INC HL
CP SNGQTK
JP NZ, MB_NTQTTK
DEC BC
DEC BC
DEC BC
DEC BC
INC D
INC D
INC D
INC D
MB_NTQTTK:
CP _ELSE
CALL Z, MB_DCXBRT
CP _WHILE
;LAB_ram_215f:
JP NZ, MB_RESSR0
LD A, (HL)
INC HL
CP PLUSTK
LD A, _WHILE
JP Z, MB_RESSR0
DEC HL
MB_RESSR0:
PUSH HL
PUSH BC
PUSH DE
LD HL, MB_RESLST-1
LD B, A
LD C, 'A' - 1
MB_RESSR3:
INC C
MB_RESSR1:
INC HL
LD D, H
LD E, L
MB_RESSR2:
LD A, (HL)
OR A
JP Z, MB_RESSR3
INC HL
JP P, MB_RESSR2
LD A, (HL)
CP B
JP NZ, MB_RESSR1
EX DE, HL
CP USRTK
JP Z, MB_NOISPA
CP FNTK
MB_NOISPA:
LD A, C
POP DE
POP BC
LD E, A
JP NZ, MB_NTFNEX
LD A, (MB_TEMPA)
OR A
LD A, 0
LD (MB_TEMPA), A
JP MB_MORLNZ
MB_NTFNEX:
CP 'Z' + 1 ; WAS IT A SPECIAL CHAR?
JP NZ, MB_NTSPCH
XOR A
LD (MB_TEMPA), A
JP MB_MORPUR
MB_NTSPCH:
LD A, (MB_TEMPA)
OR A
LD A, 0xff
LD (MB_TEMPA), A
MB_MORLNZ:
JP Z, MB_MORLN0
LD A, ' '
LD (BC), A
INC BC
DEC D
JP Z, MB_PPSWRT
MB_MORLN0:
LD A, E
JP MB_MORLN1
MB_MORPUR:
LD A, (HL) ; = "UT"
INC HL
LD E, A
MB_MORLN1:
AND 0x7f
LD (BC), A ; = 44
INC BC
DEC D
JP Z, MB_PPSWRT
OR E
JP P, MB_MORPUR
CP '(' + 0x80
JP NZ, MB_NTSPCT
XOR A
LD (MB_TEMPA), A
MB_NTSPCT:
POP HL
JP MB_PLOOP2
MB_TSTANM:
CALL MB_ISLET2
RET NC
CP '0'
RET C
CP ':'
CCF
RET
MB_NUMLIN:
DEC HL
CALL MB_CHRGTR
PUSH DE
PUSH BC
PUSH AF
CALL MB_CONFAC
POP AF
LD BC, MB_CONLIN
PUSH BC
CP OCTCON
JP Z, MB_FOUTO
CP HEXCON
JP Z, MB_FOUTH
LD HL, (MB_CONLO)
JP MB_FOUT
MB_CONLIN:
POP BC
POP DE
LD A, (MB_CONSAV)
LD E, 'O'
CP OCTCON
JP Z, MB_SAVBAS
CP HEXCON
LD E, 'H'
JP NZ, MB_NUMSLN
MB_SAVBAS:
LD A, '&'
LD (BC), A
INC BC
DEC D
RET Z
LD A, E
LD (BC), A
INC BC
DEC D
RET Z
MB_NUMSLN:
LD A, (MB_CONTYP)
CP 0x4
LD E, 0x0
JP C, MB_TYPSET
LD E, '!'
JP Z, MB_TYPSET
LD E, '#'
MB_TYPSET:
LD A, (HL)
CP ASCII_SP
CALL Z, MB_INXHRT
MB_NUMSL2:
LD A, (HL)
INC HL
OR A
JP Z, MB_NUMDN
LD (BC), A
INC BC
DEC D
RET Z
LD A, (MB_CONTYP)
CP 0x4
JP C, MB_NUMSL2
DEC BC
LD A, (BC)
INC BC
JP NZ, MB_DBLSCN
CP '.'
JP Z, MB_ZERE
MB_DBLSCN:
CP 'D'
JP Z, MB_ZERE
CP 'E'
JP NZ, MB_NUMSL2
MB_ZERE:
LD E, 0x0
JP MB_NUMSL2
MB_NUMDN:
LD A, E
OR A
JP Z, MB_NOD
LD (BC), A
INC BC
DEC D
RET Z
MB_NOD:
LD HL, (MB_CONTXT)
JP MB_PLOOP2
MB_DELETE:
CALL MB_SCNLIN
PUSH BC
CALL MB_DEPTR
POP BC
POP DE
PUSH BC
PUSH BC
CALL MB_FNDLIN
JP NC, MB_FCERRG
LD D, H
LD E, L
EX (SP), HL
PUSH HL
CALL MB_DCOMPR
MB_FCERRG:
JP NC, MB_FCERR
LD HL, MB_OKTXT ;= "OK\r\n"
CALL MB_STROUT
POP BC
LD HL, MB_FINI ;= D1h
EX (SP), HL
MB_DEL:
EX DE, HL
LD HL, (MB_VARTAB)
MB_MLOOP:
LD A, (DE)
LD (BC), A
INC BC
INC DE
CALL MB_DCOMPR
JP NZ, MB_MLOOP
LD H, B
LD L, C
LD (MB_VARTAB), HL
RET
; ===================================================
; PEEK AND POKE
; ===================================================
MB_PEEK:
CALL MB_FRQINT
CALL MB_PRODIR
LD A, (HL)
JP MB_SNGFLT
MB_POKE:
CALL MB_GETIN22
PUSH DE
CALL MB_PRODIR
CALL MB_SYNCHR
DB ','
CALL MB_GETBYT
POP DE
LD (DE), A
RET
MB_GETIN22:
CALL MB_FRMEVL
PUSH HL
CALL MB_FRQINT
EX DE, HL
POP HL
RET
MB_FRQINT:
LD BC, MB_FRCINT
PUSH BC
CALL MB_GETYPR
RET M
LD A, (MB_FAC)
CP 0x90
RET NZ
CALL MB_SIGN
RET M
CALL MB_FRCSNG
LD BC, 0x9180
LD DE, 0x0
JP MB_FADD
; ===================================================
; RENUMBER
; ===================================================
MB_RESEQ:
LD BC, 10 ; ASSUME INC=10
PUSH BC
LD D, B
LD E, B
JP Z, MB_RESNN
CP ','
JP Z, MB_EATCOM
PUSH DE
CALL MB_LINSPC
LD B, D
LD C, E
POP DE
JP Z, MB_RESNN
MB_EATCOM:
CALL MB_SYNCHR
DB ','
CALL MB_LINSPC
JP Z, MB_RESNN
POP AF
CALL MB_SYNCHR
DB ','
PUSH DE
CALL MB_LINGET
JP NZ, MB_SNERR
LD A, D
OR E
JP Z, MB_FCERR
EX DE, HL
EX (SP), HL
EX DE, HL
MB_RESNN:
PUSH BC
CALL MB_FNDLIN
POP DE
PUSH DE
PUSH BC
CALL MB_FNDLIN
LD H, B
LD L, C
POP DE
CALL MB_DCOMPR
EX DE, HL
JP C, MB_FCERR
POP DE
POP BC
POP AF
PUSH HL
PUSH DE
JP MB_NXTRSL
MB_NXTRSC:
ADD HL, BC
JP C, MB_FCERR
EX DE, HL
PUSH HL
LD HL, 65529
CALL MB_DCOMPR
POP HL
JP C, MB_FCERR
MB_NXTRSL:
PUSH DE
LD E, (HL)
INC HL
LD D, (HL)
LD A, D
OR E
EX DE, HL
POP DE
JP Z, MB_RESSD1
LD A, (HL)
INC HL
OR (HL)
DEC HL
EX DE, HL
JP NZ, MB_NXTRSC
MB_RESSD1:
PUSH BC
CALL SCCLIN
POP BC
POP DE
POP HL
MB_RESNX1:
PUSH DE
LD E, (HL)
INC HL
LD D, (HL)
LD A, D
OR E
JP Z, MB_SCCALL
EX DE, HL
EX (SP), HL
EX DE, HL
INC HL
LD (HL), E
INC HL
LD (HL), D
EX DE, HL
ADD HL, BC
EX DE, HL
POP HL
JP MB_RESNX1
MB_SCCALL:
LD BC, MB_STPRDY
PUSH BC
DB 0xFE
SCCLIN:
DB 0xF6
; ===================================================
MB_SCCPTR:
XOR A
LD (MB_PTRFLG), A
MB_SCNPGM:
LD HL, (MB_TXTTAB) ;TXTTAB
DEC HL
MB_SCNPLN:
INC HL
LD A, (HL)
INC HL
OR (HL)
RET Z
INC HL
LD E, (HL)
INC HL
LD D, (HL)
MB_SCNEXT:
CALL MB_CHRGTR
MB_SCNEX2:
OR A
JP Z, MB_SCNPLN
LD C, A
LD A, (MB_PTRFLG)
OR A
LD A, C
JP Z, MB_SCNPT2
CP _ERROR
JP NZ, MB_NTERRG
CALL MB_CHRGTR
CP _GOTO
JP NZ, MB_SCNEX2
CALL MB_CHRGTR
CP LINCON
JP NZ, MB_SCNEX2
PUSH DE
CALL MB_LINGT3
LD A, D
OR E
JP NZ, MB_CHGPTR
JP MB_SCNEX3
MB_NTERRG:
CP LINCON
JP NZ, MB_SCNEXT
PUSH DE
CALL MB_LINGT3
MB_CHGPTR:
PUSH HL
CALL MB_FNDLIN
DEC BC
LD A, PTRCON
JP C, MB_MAKPTR
CALL MB_CRDONZ
LD HL, MB_LINM ;= "Undefined line "
PUSH DE
CALL MB_STROUT
POP HL
CALL MB_LINPTR
POP BC
POP HL
PUSH HL
PUSH BC
CALL MB_INPRT
MB_SCNPOP:
POP HL
MB_SCNEX3:
POP DE
DEC HL
MB_SCNEXT0:
JP MB_SCNEXT
MB_LINM:
DB "Undefined line ", 0
MB_SCNPT2:
CP PTRCON
JP NZ, MB_SCNEXT0
PUSH DE
CALL MB_LINGT3
PUSH HL
EX DE, HL
INC HL
INC HL
INC HL
LD C, (HL)
INC HL
LD B, (HL)
LD A, LINCON
MB_MAKPTR:
LD HL, MB_SCNPOP
PUSH HL
MB_CONCHG:
LD HL, (MB_CONTXT)
MB_CONCH2:
PUSH HL
DEC HL
LD (HL), B
DEC HL
LD (HL), C
DEC HL
LD (HL), A
POP HL
RET
; ===================================================
MB_DEPTR:
LD A, (MB_PTRFLG)
OR A
RET Z
JP MB_SCCPTR
; ---------------------------------------------------
; ANSI - THE ROUTINES TO HANDLE ANSI FEATURES
; ---------------------------------------------------
MB_OPTION:
CALL MB_SYNCHR
DB 'B'
CALL MB_SYNCHR
DB 'A'
CALL MB_SYNCHR
DB 'S'
CALL MB_SYNCHR
DB 'E'
LD A, (MB_OPTFLG)
OR A
JP NZ, MB_DDERR
PUSH HL
LD HL, (MB_ARYTAB)
EX DE, HL
LD HL, (MB_STREND)
CALL MB_DCOMPR
JP NZ, MB_DDERR
POP HL
LD A, (HL)
SUB '0'
JP C, MB_SNERR
CP 2
JP NC, MB_SNERR
LD (MB_OPTVAL), A
INC A
LD (MB_OPTFLG), A
CALL MB_CHRGTR
RET
MB_STRPRN:
LD A, (HL)
OR A
RET Z
CALL MB_CALTTY
INC HL
JP MB_STRPRN
MB_CALTTY:
PUSH AF
JP MB_TTYCHR
MB_RANDOM:
JP Z, MB_INPRG
CALL MB_FRMEVL
PUSH HL
CALL MB_FRCINT
JP MB_STRNDS
MB_INPRG:
PUSH HL
MB_INPRAG:
LD HL, MB_RANMES ;= "Random number seed (-32768 to 32767)"
CALL MB_STROUT
CALL MB_QINLIN
POP DE
JP C, MB_STPEND
PUSH DE
INC HL
LD A, (HL)
CALL MB_FIN
LD A, (HL)
OR A
JP NZ, MB_INPRAG
CALL MB_FRCINT
MB_STRNDS:
LD (MB_RNDX+1), HL
CALL MB_RNDMN2
POP HL
RET
MB_RANMES:
DB "Random number seed (-32768 to 32767)", 0
; ---------------------------------------------------
; SCANS AHEAD TO FIND THE "NEXT" THAT MATCHES A "FOR"
; ---------------------------------------------------
MB_WNDSCN:
LD C, ERRWH
JP MB_SCNCNT
MB_NXTSCN:
LD C, ERRFN
MB_SCNCNT:
LD B, 0
EX DE, HL
LD HL, (MB_CURLIN) ;= 65534
LD (MB_NXTLIN), HL
EX DE, HL
MB_FORINC:
INC B
MB_FNLOP:
DEC HL
MB_SCANWF:
CALL MB_CHRGTR
JP Z, MB_FORTRM
CP _ELSE
JP Z, MB_FNNWST
CP _THEN
JP NZ, MB_SCANWF
MB_FORTRM:
OR A
JP NZ, MB_FNNWST
INC HL
LD A, (HL)
INC HL
OR (HL)
LD E, C
JP Z, MB_ERROR
INC HL
LD E, (HL)
INC HL
LD D, (HL)
EX DE, HL
LD (MB_NXTLIN), HL
EX DE, HL
MB_FNNWST:
CALL MB_CHRGTR
LD A, C
CP ERRFN
LD A, (HL)
JP Z, MB_NXTLOK
CP _WHILE
JP Z, MB_FORINC
CP _WEND
JP NZ, MB_FNLOP
DEC B
JP NZ, MB_FNLOP
RET
MB_NXTLOK:
CP _FOR
JP Z, MB_FORINC
CP _NEXT
JP NZ, MB_FNLOP
MB_DECNXT:
DEC B
RET Z
; SCAN THE VARIABLES LISTED IN A "NEXT" STATEMENT
CALL MB_CHRGTR
JP Z, MB_FORTRM
EX DE, HL
LD HL, (MB_CURLIN) ;= 65534
PUSH HL
LD HL, (MB_NXTLIN)
LD (MB_CURLIN), HL ;= 65534
EX DE, HL
PUSH BC
CALL MB_PTRGET
POP BC
DEC HL
CALL MB_CHRGTR
LD DE, MB_FORTRM
JP Z, MB_TRMNXT
CALL MB_SYNCHR
DB ','
DEC HL
LD DE, MB_DECNXT
MB_TRMNXT:
EX (SP), HL
LD (MB_CURLIN), HL ;= 65534
POP HL
PUSH DE
RET
MB_FINOVC:
PUSH AF
LD A, (MB_FLGOVC)
LD (MB_OVCSTR), A
POP AF
MB_CLROVC:
PUSH AF
XOR A
LD (MB_FLGOVC), A
POP AF
RET
; ===================================================
; FLOATING POINT ADDITION AND SUBTRACTION
; F4.MAC
; ===================================================
; ---------------------------------------------------
; ENTRY TO FADD WITH POINTER TO ARG IN (HL)
; ---------------------------------------------------
MB_FADDH:
LD HL, MB_FHALF
MB_FADDS:
CALL MB_MOVRM
JP MB_FADD
MB_FSUBS:
CALL MB_MOVRM
MB_FSUB:
CALL MB_NEG
MB_FADD:
LD A, B
OR A
RET Z
LD A, (MB_FAC)
OR A
JP Z, MB_MOVFR
SUB B
JP NC, MB_FADD1
CPL
INC A
EX DE, HL
CALL MB_PUSHF
EX DE, HL
CALL MB_MOVFR
POP BC
POP DE
MB_FADD1:
CP 25
RET NC
PUSH AF
CALL MB_UNPACK
LD H, A
POP AF
CALL MB_SHIFTR
LD A, H
OR A
LD HL, MB_FACLO
JP P, MB_FADD3
CALL MB_FADDA
JP NC, MB_ROUND
INC HL
INC (HL)
JP Z, MB_OVFIN4
LD L, 0x1
CALL MB_SHRADD
JP MB_ROUND
MB_FADD3:
XOR A
SUB B
LD B, A
LD A, (HL)
SBC A, E
LD E, A
INC HL
LD A, (HL)
SBC A, D
LD D, A
INC HL
LD A, (HL)
SBC A, C
LD C, A
MB_FADFLT:
CALL C, MB_NEGR
MB_NORMAL:
LD L, B
LD H, E
XOR A
MB_NORM1:
LD B, A
LD A, C
OR A
JP NZ, MB_NORM3
LD C, D
LD D, H
LD H, L
LD L, A
LD A, B
SUB 8
CP 224
JP NZ, MB_NORM1
MB_ZERO:
XOR A
MB_ZERO0:
LD (MB_FAC), A
RET
MB_NORM2:
LD A, H
OR L
OR D
JP NZ, MB_NORM2U
LD A, C
MB_NORM2F:
DEC B
RLA
JP NC, MB_NORM2F
INC B
RRA
LD C, A
JP MB_NORM3A
MB_NORM2U:
DEC B
ADD HL, HL
LD A, D
RLA
LD D, A
LD A, C
ADC A, A
LD C, A
MB_NORM3:
JP P, MB_NORM2
MB_NORM3A:
LD A, B
LD E, H
LD B, L
OR A
JP Z, MB_ROUND
LD HL, MB_FAC
ADD A, (HL)
LD (HL), A
JP NC, MB_ZERO
JP Z, MB_ZERO
MB_ROUND:
LD A, B
MB_ROUNDB:
LD HL, MB_FAC
OR A
CALL M, MB_ROUNDA
LD B, (HL)
INC HL
LD A, (HL)
AND 0x80
XOR C
LD C, A
JP MB_MOVFR
MB_ROUNDA:
INC E
RET NZ
INC D
RET NZ
INC C
RET NZ
LD C, 0x80
INC (HL)
RET NZ
JP MB_OVFIN8
MB_FADDA:
LD A, (HL)
ADD A, E
LD E, A
INC HL
LD A, (HL)
ADC A, D
LD D, A
INC HL
LD A, (HL)
ADC A, C
LD C, A
RET
; ---------------------------------------------------
MB_NEGR:
LD HL, MB_FAC+1
LD A, (HL)
CPL
LD (HL), A
XOR A
LD L, A
SUB B
LD B, A
LD A, L
SBC A, E
LD E, A
LD A, L
SBC A, D
LD D, A
LD A, L
SBC A, C
LD C, A
RET
MB_SHIFTR:
LD B, 0x0
MB_SHFTR1:
SUB 0x8
JP C, MB_SHFTR2
LD B, E
LD E, D
LD D, C
LD C, 0x0
JP MB_SHFTR1
MB_SHFTR2:
ADD A, 0x9
LD L, A
LD A, D
OR E
OR B
JP NZ, MB_SHFTR3
LD A, C
MB_SHFTRF:
DEC L
RET Z
RRA
LD C, A
JP NC, MB_SHFTRF
JP MB_SHFTC
MB_SHFTR3:
XOR A
DEC L
RET Z
LD A, C
MB_SHRADD:
RRA
LD C, A
MB_SHFTC:
LD A, D
RRA
LD D, A
LD A, E
RRA
LD E, A
LD A, B
RRA
LD B, A
JP MB_SHFTR3
; ---------------------------------------------------
; NATURAL LOG FUNCTION
; ---------------------------------------------------
MB_FONE:
DB 0,0,0,0x81 ; CONST 1
; 2524 COEFFICIENTS
MB_LOGP: ; 4.8114746
DB 0x04, 0x9A, 0xF7, 0x19, 0x83, 0x24, 0x63, 0x43, 0x83
DB 0x75, 0xCD, 0x8D, 0x84, 0xA9, 0x7F, 0x83, 0x82
MB_LOGQ:
DB 0x04, 0x00, 0x00, 0x00, 0x81, 0xE2, 0xB0, 0x4D
DB 0x83, 0x0A, 0x72, 0x11, 0x83, 0xF4, 0x04, 0x35
DB 0x7F
MB_LOG:
CALL MB_SIGN
OR A
JP PE, MB_FCERR
CALL MB_LOG2
LD BC, 0x8031 ;200Q*256+061Q
LD DE, 0x7218 ;162Q*256+030Q
JP MB_FMUL
MB_LOG2:
CALL MB_MOVRF
LD A, 0x80
LD (MB_FAC), A
XOR B
PUSH AF
CALL MB_PUSHF
LD HL, MB_LOGP
CALL MB_POLY
POP BC
POP HL
CALL MB_PUSHF
EX DE, HL
CALL MB_MOVFR
LD HL, MB_LOGQ
CALL MB_POLY
POP BC
POP DE
CALL MB_FDIV
POP AF
CALL MB_PUSHF
CALL MB_FLOAT
POP BC
POP DE
JP MB_FADD
; ---------------------------------------------------
; FLOATING MULTIPLICATION
; ---------------------------------------------------
MB_FMUL:
CALL MB_SIGN
RET Z
LD L, 0x0
CALL MB_MULDIV
LD A, C
LD (MB_FMULTA+1), A
EX DE, HL
LD (MB_FMULTB+1), HL
LD BC, 0x0
LD D, B
LD E, B
LD HL, MB_NORMAL
PUSH HL
LD HL, MB_FMULT2
PUSH HL
PUSH HL
LD HL, MB_FACLO
MB_FMULT2:
LD A, (HL)
INC HL
OR A
JP Z, MB_FMULT3
PUSH HL
EX DE, HL
LD E, 0x8
MB_FMULT4:
RRA
LD D, A
LD A, C
JP NC, MB_FMULT5
PUSH DE
MB_FMULTB:
LD DE, 0x0
ADD HL, DE
POP DE
MB_FMULTA:
ADC A, 0x0
MB_FMULT5:
RRA
LD C, A
LD A, H
RRA
LD H, A
LD A, L
RRA
LD L, A
LD A, B
RRA
LD B, A
AND 0x10
JP Z, MB_FMLT5B
LD A, B
OR 0x20
LD B, A
MB_FMLT5B:
DEC E
LD A, D
JP NZ, MB_FMULT4
EX DE, HL
; GET POINTER TO NUMBER TO MULTIPLY BY
MB_POPHRT:
POP HL
RET
MB_FMULT3:
LD B, E
LD E, D
LD D, C
LD C, A
RET
MB_DIV10:
CALL MB_PUSHF
LD HL, MB_FTEN ;Const 10.0
CALL MB_MOVFM
MB_FDIVT:
POP BC
POP DE
; ---------------------------------------------------
; FLOATING DIVISION
; ---------------------------------------------------
MB_FDIV:
CALL MB_SIGN
JP Z, MB_INTDV1
LD L, 0xff
CALL MB_MULDIV
INC (HL)
JP Z, MB_OVFIN2
INC (HL)
JP Z, MB_OVFIN2
DEC HL
LD A, (HL)
LD (MB_FDIVA+1), A
DEC HL
LD A, (HL)
LD (MB_FDIVB+1), A
DEC HL
LD A, (HL)
LD (MB_FDIVC+1), A
LD B, C
EX DE, HL
XOR A
LD C, A
LD D, A
LD E, A
LD (MB_FDIVG+1), A
MB_FDIV1:
PUSH HL
PUSH BC
LD A, L
MB_FDIVC:
SUB 0x0
LD L, A
LD A, H
MB_FDIVB:
SBC A, 0x0
LD H, A
LD A, B
MB_FDIVA:
SBC A, 0x0
LD B, A
MB_FDIVG:
LD A, 0x0
SBC A, 0x0
CCF
JP NC, MB_FDIV2
LD (MB_FDIVG+1), A
POP AF
POP AF
SCF
DB 0xD2
MB_FDIV2:
POP BC
POP HL
LD A, C
INC A
DEC A
RRA
JP P, MB_DIV2A
RLA
LD A, (MB_FDIVG+1)
RRA
AND 0xc0
PUSH AF
LD A, B
OR H
OR L
JP Z, MB_DIV2AA
LD A, 0x20
MB_DIV2AA:
POP HL
OR H
JP MB_ROUNDB
MB_DIV2A:
RLA
LD A, E
RLA
LD E, A
LD A, D
RLA
LD D, A
LD A, C
RLA
LD C, A
ADD HL, HL
LD A, B
MB_FDIV2A:
RLA
LD B, A
LD A, (MB_FDIVG+1)
RLA
LD (MB_FDIVG+1), A
LD A, C
OR D
OR E
JP NZ, MB_FDIV1
PUSH HL
LD HL, MB_FAC
DEC (HL)
POP HL
JP NZ, MB_FDIV1
JP MB_ZERO
MB_MULDVS:
LD A, 0xff
DB 0x2E
MB_MULDVA:
XOR A
LD HL, MB_ARG-1
LD C, (HL)
INC HL
XOR (HL)
LD B, A
LD L, 0x0
MB_MULDIV:
LD A, B
OR A
JP Z, MB_MULDV2
LD A, L
LD HL, MB_FAC
XOR (HL)
ADD A, B
LD B, A
RRA
XOR B
LD A, B
JP P, MB_MULDV1
ADD A, 0x80
LD (HL), A
JP Z, MB_POPHRT
CALL MB_UNPACK
LD (HL), A
MB_DCXHRT:
DEC HL
RET
MB_MLDVEX:
CALL MB_SIGN
CPL
POP HL
MB_MULDV1:
OR A
MB_MULDV2:
POP HL
JP P, MB_ZERO
JP MB_OVFIN2
; ===================================================
MB_MUL10:
CALL MB_MOVRF
LD A, B
OR A
RET Z
ADD A, 0x2
JP C, MB_OVFIN3
LD B, A
CALL MB_FADD
LD HL, MB_FAC
INC (HL)
RET NZ
JP MB_OVFIN3
; ===================================================
; SIGN, SGN, FLOAT, NEG AND ABS
; ===================================================
MB_SIGN:
LD A, (MB_FAC)
OR A
RET Z
MB_SIGNC:
LD A, (MB_FAC-1) ;FAC-1
DB 0xFE
MB_FCOMPS:
CPL
MB_ICOMPS:
RLA
MB_SIGNS:
SBC A, A
RET NZ
MB_INRART:
INC A
RET
; ===================================================
MB_FLOAT:
LD B, 0x88
LD DE, 0x0
MB_FLOATR:
LD HL, MB_FAC
LD C, A
LD (HL), B
LD B, 0x0
INC HL
LD (HL), 0x80
RLA
JP MB_FADFLT
MB_ABS:
CALL MB_VSIGN
RET P
MB_VNEG:
CALL MB_GETYPR
JP M, MB_INEG
JP Z, MB_TMERR
MB_NEG:
LD HL, MB_FAC-1
LD A, (HL)
XOR 0x80
LD (HL), A
RET
MB_SGN:
CALL MB_VSIGN
MB_CONIA:
LD L, A
RLA
SBC A, A
LD H, A
JP MB_MAKINT
MB_VSIGN:
CALL MB_GETYPR
JP Z, MB_TMERR
JP P, MB_SIGN
LD HL, (MB_FACLO)
MB_ISIGN:
LD A, H
OR L
RET Z
LD A, H
JP MB_ICOMPS
; ===================================================
MB_PUSHF:
EX DE, HL
LD HL, (MB_FACLO)
EX (SP), HL
PUSH HL
LD HL, (MB_FAC-1)
EX (SP), HL
PUSH HL
EX DE, HL
RET
MB_MOVFM:
CALL MB_MOVRM
MB_MOVFR:
EX DE, HL
LD (MB_FACLO), HL
LD H, B
LD L, C
LD (MB_FAC-1), HL ;FAC-1
EX DE, HL
RET
MB_MOVRF:
LD HL, MB_FACLO
MB_MOVRM:
LD E, (HL)
INC HL
MB_GETBCD:
LD D, (HL)
INC HL
LD C, (HL)
INC HL
LD B, (HL)
MB_INXHRT:
INC HL
RET
MB_MOVMF:
LD DE, MB_FACLO
MB_MOVE:
LD B, 0x4
JP MB_MOVE1
MB_MOVVFM:
EX DE, HL
; ===================================================
MB_VMOVE:
LD A, (MB_VALTYP)
LD B, A
MB_MOVE1:
LD A, (DE)
LD (HL), A
INC DE
INC HL
DEC B
JP NZ, MB_MOVE1
RET
MB_UNPACK:
LD HL, MB_FAC-1 ;FAC-1
LD A, (HL)
RLCA
SCF
RRA
LD (HL), A
CCF
RRA
INC HL
INC HL
LD (HL), A
LD A, C
RLCA
SCF
RRA
LD C, A
RRA
XOR (HL)
RET
MB_VMOVFA:
LD HL, MB_ARGLO
MB_VMOVFM:
LD DE, MB_MOVVFM
JP MB_VMVVFM
; ===================================================
MB_VMOVAF:
LD HL, MB_ARGLO
MB_VMOVMF:
LD DE, MB_VMOVE
MB_VMVVFM:
PUSH DE
LD DE, MB_FACLO
CALL MB_GETYPR
RET C
LD DE, MB_DFACLO
RET
; ===================================================
MB_FCOMP:
LD A, B
OR A
JP Z, MB_SIGN
LD HL, MB_FCOMPS
PUSH HL
CALL MB_SIGN
LD A, C
RET Z
LD HL, MB_FAC-1 ;FAC-1
XOR (HL)
LD A, C
RET M
CALL MB_FCOMP2
MB_FCOMPD:
RRA
XOR C
RET
MB_FCOMP2:
INC HL
LD A, B
CP (HL)
RET NZ
DEC HL
LD A, C
CP (HL)
RET NZ
DEC HL
LD A, D
CP (HL)
RET NZ
DEC HL
LD A, E
SUB (HL)
RET NZ
POP HL
POP HL
RET
MB_ICOMP:
LD A, D
XOR H
LD A, H
JP M, MB_ICOMPS
CP D
JP NZ, MB_SIGNS1
LD A, L
SUB E
RET Z
MB_SIGNS1:
JP MB_SIGNS
; --------------------------------------------------
; COMPARE TWO DOUBLE PRECISION NUMBERS
; A=1 IF ARG .LT. FAC
; A=0 IF ARG=FAC
; A=-1 IF ARG .GT. FAC
; ALTERS A,B,C,D,E,H,L
; --------------------------------------------------
MB_DCOMPD:
LD HL, MB_ARGLO
CALL MB_VMOVE
MB_XDCOMP:
LD DE, MB_ARG
LD A, (DE)
OR A
JP Z, MB_SIGN
LD HL, MB_FCOMPS
PUSH HL
CALL MB_SIGN
DEC DE
LD A, (DE)
LD C, A
RET Z
LD HL, MB_FAC-1 ;FAC-1
XOR (HL)
LD A, C
RET M
INC DE
INC HL
LD B, 0x8
MB_DCOMP1:
LD A, (DE)
SUB (HL)
JP NZ, MB_FCOMPD
DEC DE
DEC HL
DEC B
JP NZ, MB_DCOMP1
POP BC
RET
MB_DCOMP:
CALL MB_XDCOMP
JP NZ, MB_FCOMPS
RET
MB_FRCINT:
CALL MB_GETYPR
LD HL, (MB_FACLO)
RET M
JP Z, MB_TMERR
JP PO, MB_FRCIN2
MB_FDBINT:
CALL MB_VMOVAF
LD HL, MB_DHALF
CALL MB_VMOVFM
CALL MB_DADD
CALL MB_CONSD
JP MB_FRCIN3
MB_FRCIN2:
CALL MB_FADDH
MB_FRCIN3:
LD A, (MB_FAC-1) ;FAC-1
OR A
PUSH AF
AND 0x7f
LD (MB_FAC-1), A ;FAC-1
LD A, (MB_FAC)
CP 0x90
JP NC, MB_OVERR
CALL MB_QINT
LD A, (MB_FAC)
OR A
JP NZ, MB_FRCIAA
POP AF
EX DE, HL
JP MB_FRCI3A
MB_FRCIAA:
POP AF
EX DE, HL
JP P, MB_FRCIN4
MB_FRCI3A:
LD A, H
CPL
LD H, A
LD A, L
CPL
LD L, A
MB_FRCIN4:
JP MB_MAKINT
;CONVERT SINGLE PRECISION NUMBER TO INTEGER
MB_COSIN:
LD HL, MB_OVERR
PUSH HL
MB_CONIS:
LD A, (MB_FAC)
CP 0x90
JP NC, MB_CONIS2
CALL MB_QINT
EX DE, HL
MB_CONIS1:
POP DE
MB_MAKINT:
LD (MB_FACLO), HL
MB_VALINT:
LD A, 0x2
MB_CONISD:
LD (MB_VALTYP), A
RET
MB_CONIS2:
LD BC, 0x9080 ;220Q*256+200Q
LD DE, 0x0
CALL MB_FCOMP
RET NZ
LD H, C
LD L, D
JP MB_CONIS1
MB_FRCSNG:
CALL MB_GETYPR
RET PO
JP M, MB_CONSI
JP Z, MB_TMERR
MB_CONSD:
CALL MB_MOVRF
CALL MB_VALSNG
LD A, B
OR A
RET Z
CALL MB_UNPACK
LD HL, MB_FACLO - 1
LD B, (HL)
JP MB_ROUND
; ===================================================
MB_CONSI:
LD HL, (MB_FACLO)
MB_CONSIH:
CALL MB_VALSNG
LD A, H
LD D, L
LD E, 0x0
LD B, 0x90
JP MB_FLOATR
MB_FRCDBL:
CALL MB_GETYPR
RET NC
JP Z, MB_TMERR
CALL M, MB_CONSI
; ===================================================
MB_CONDS:
LD HL, 0x0
LD (MB_DFACLO), HL
LD (MB_DFACLO+2), HL
MB_VALDBL:
LD A, 0x8
DB 1
MB_VALSNG:
LD A, 0x4
JP MB_CONISD
; ===================================================
MB_CHKSTR:
CALL MB_GETYPR
RET Z
JP MB_TMERR
; ---------------------------------------------------
; GREATEST INTEGER FUNCTION
; ---------------------------------------------------
MB_QINT:
LD B, A
LD C, A
LD D, A
LD E, A
OR A
RET Z
PUSH HL
CALL MB_MOVRF
CALL MB_UNPACK
XOR (HL)
LD H, A
CALL M, MB_QINTA
LD A, 152
SUB B
CALL MB_SHIFTR
LD A, H
RLA
CALL C, MB_ROUNDA
LD B, 0x0
CALL C, MB_NEGR
POP HL
RET
MB_QINTA:
DEC DE
LD A, D
AND E
INC A
RET NZ
MB_DCXBRT:
DEC BC
RET
MB_FIXER:
CALL MB_GETYPR
RET M
CALL MB_SIGN
JP P, MB_VINT
CALL MB_NEG
CALL MB_VINT
JP MB_VNEG
MB_VINT:
CALL MB_GETYPR
RET M
JP NC, MB_DINT
JP Z, MB_TMERR
CALL MB_CONIS
MB_INT:
LD HL, MB_FAC
LD A, (HL)
CP 0x98
LD A, (MB_FACLO)
RET NC
LD A, (HL)
CALL MB_QINT
LD (HL), 0x98
LD A, E
PUSH AF
LD A, C
RLA
CALL MB_FADFLT
POP AF
RET
MB_DINT:
LD HL, MB_FAC
LD A, (HL)
CP 0x90
JP NZ, MB_DINT2
LD C, A
DEC HL
LD A, (HL)
XOR 0x80
LD B, 0x6
MB_DINT1:
DEC HL
OR (HL)
DEC B
JP NZ, MB_DINT1
OR A
LD HL, 0x8000
JP NZ, MB_DIN05
CALL MB_MAKINT
JP MB_FRCDBL
MB_DIN05:
LD A, C
MB_DINT2:
OR A
RET Z
CP 184
RET NC
MB_DINTFO:
PUSH AF
CALL MB_MOVRF
CALL MB_UNPACK
XOR (HL)
DEC HL
LD (HL), 0xb8
PUSH AF
DEC HL
LD (HL), C
CALL M, MB_DINTA
LD A, (MB_FAC-1) ;FAC-1
LD C, A
LD HL, MB_FAC-1 ;FAC-1
LD A, 184
SUB B
CALL MB_DSHFTR
POP AF
CALL M, MB_DROUNA
XOR A
LD (MB_FLOAT_ACC), A
POP AF
RET NC
JP MB_DNORML
MB_DINTA:
LD HL, MB_DFACLO
MB_DINTA1:
LD A, (HL)
DEC (HL)
OR A
INC HL
JP Z, MB_DINTA1
RET
MB_UMULT:
PUSH HL
LD HL, 0x0
LD A, B
OR C
JP Z, MB_MULRET
LD A, 0x10
MB_UMULT1:
ADD HL, HL
JP C, MB_BSERR
EX DE, HL
ADD HL, HL
EX DE, HL
JP NC, MB_UMULT2
ADD HL, BC
JP C, MB_BSERR
MB_UMULT2:
DEC A
JP NZ, MB_UMULT1
MB_MULRET:
EX DE, HL
POP HL
RET
MB_ISUB:
LD A, H
RLA
SBC A, A
LD B, A
CALL MB_INEGHL
LD A, C
SBC A, B
JP MB_IADDS
MB_IADD:
LD A, H
RLA
SBC A, A
MB_IADDS:
LD B, A
PUSH HL
LD A, D
RLA
SBC A, A
ADD HL, DE
ADC A, B
RRCA
XOR H
JP P, MB_CONIS1
PUSH BC
EX DE, HL
CALL MB_CONSIH
POP AF
POP HL
CALL MB_PUSHF
EX DE, HL
CALL MB_INEGAD
JP MB_FADDT
MB_IMUL:
LD A, H
OR L
JP Z, MB_MAKINT
PUSH HL
PUSH DE
CALL MB_IMULDV
PUSH BC
LD B, H
LD C, L
LD HL, 0x0
LD A, 0x10
MB_IMULT1:
ADD HL, HL
JP C, MB_IMULT5
EX DE, HL
ADD HL, HL
EX DE, HL
JP NC, MB_IMULT2
ADD HL, BC
JP C, MB_IMULT5
MB_IMULT2:
DEC A
JP NZ, MB_IMULT1
POP BC
POP DE
MB_IMLDIV:
LD A, H
OR A
JP M, MB_IMULT3
POP DE
LD A, B
JP MB_INEGA
MB_IMULT3:
XOR 0x80
OR L
JP Z, MB_IMULT4
EX DE, HL
DB 1
MB_IMULT5:
POP BC
POP HL
CALL MB_CONSIH
POP HL
CALL MB_PUSHF
CALL MB_CONSIH
MB_FMULTT:
POP BC
POP DE
JP MB_FMUL
MB_IMULT4:
LD A, B
OR A
POP BC
JP M, MB_MAKINT
PUSH DE
CALL MB_CONSIH
POP DE
JP MB_NEG
MB_IDIV:
LD A, H
OR L
JP Z, MB_DV0ERR
CALL MB_IMULDV
PUSH BC
EX DE, HL
CALL MB_INEGHL
LD B, H
LD C, L
LD HL, 0x0
LD A, 0x11
PUSH AF
OR A
JP MB_IDIV3
MB_IDIV1:
PUSH AF
PUSH HL
ADD HL, BC
JP NC, MB_IDIV2
POP AF
SCF
DB 0x3E
MB_IDIV2:
POP HL
MB_IDIV3:
LD A, E
RLA
LD E, A
LD A, D
RLA
LD D, A
LD A, L
RLA
LD L, A
LD A, H
RLA
LD H, A
POP AF
DEC A
JP NZ, MB_IDIV1
EX DE, HL
POP BC
PUSH DE
JP MB_IMLDIV
MB_IMULDV:
LD A, H
XOR D
LD B, A
CALL MB_INEGH
EX DE, HL
MB_INEGH:
LD A, H
MB_INEGA:
OR A
JP P, MB_MAKINT
MB_INEGHL:
XOR A
LD C, A
SUB L
LD L, A
LD A, C
SBC A, H
LD H, A
JP MB_MAKINT
MB_INEG:
LD HL, (MB_FACLO)
CALL MB_INEGHL
LD A, H
XOR 0x80
OR L
RET NZ
MB_INEG2:
EX DE, HL
CALL MB_VALSNG
XOR A
MB_INEGAD:
LD B, 0x98
JP MB_FLOATR
MB_IMOD:
PUSH DE
CALL MB_IDIV
XOR A
ADD A, D
RRA
LD H, A
LD A, E
RRA
LD L, A
CALL MB_VALINT
POP AF
JP MB_INEGA
; ===================================================
; DOUBLE PRECISION ARITHMETIC ROUTINES
; ===================================================
MB_DSUB:
LD HL, MB_ARG-1
LD A, (HL)
XOR 0x80
LD (HL), A
; ===================================================
; FUNCTION
; ===================================================
MB_DADD:
LD HL, MB_ARG
LD A, (HL)
OR A
RET Z
LD B, A
DEC HL
LD C, (HL)
LD DE, MB_FAC
LD A, (DE)
OR A
JP Z, MB_VMOVFA
SUB B
JP NC, MB_DADD2
CPL
INC A
PUSH AF
LD C, 0x8
INC HL
PUSH HL
MB_DADD1:
LD A, (DE)
LD B, (HL)
LD (HL), A
LD A, B
LD (DE), A
DEC DE
DEC HL
DEC C
JP NZ, MB_DADD1
POP HL
LD B, (HL)
DEC HL
LD C, (HL)
POP AF
MB_DADD2:
CP 0x39
RET NC
PUSH AF
CALL MB_UNPACK
LD HL, MB_ARGLO-1 ;ARGLO-1
LD B, A
LD A, 0x0
LD (HL), A
LD (MB_FLOAT_ACC), A
POP AF
LD HL, MB_ARG-1
CALL MB_DSHFTR
LD A, B
OR A
JP P, MB_DADD3
LD A, (MB_ARGLO-1)
LD (MB_FLOAT_ACC), A
CALL MB_DADDAA
JP NC, MB_DROUND
EX DE, HL
INC (HL)
JP Z, MB_OVFIN4
CALL MB_DSHFRB
JP MB_DROUND
MB_DADD3:
LD A, 0x9e
CALL MB_DADDA
LD HL, MB_FAC+1
CALL C, MB_DNEGR
MB_DNORML:
XOR A
MB_DNORM1:
LD B, A
LD A, (MB_FAC-1)
OR A
JP NZ, MB_DNORM5
LD HL, MB_DFACLO-1
LD C, 0x8
MB_DNORM2:
LD D, (HL)
LD (HL), A
LD A, D
INC HL
DEC C
JP NZ, MB_DNORM2
LD A, B
SUB 0x8
CP 0xc0
JP NZ, MB_DNORM1
JP MB_ZERO
MB_DNORM3:
DEC B
LD HL, MB_FLOAT_ACC
CALL MB_DSHFLC
OR A
MB_DNORM5:
JP P, MB_DNORM3
LD A, B
OR A
JP Z, MB_DROUND
LD HL, MB_FAC
ADD A, (HL)
LD (HL), A
JP NC, MB_ZERO
RET Z
MB_DROUND:
LD A, (MB_FLOAT_ACC) ;DFACLO-1
MB_DROUNB:
OR A
CALL M, MB_DROUNA
LD HL, MB_FAC+1
LD A, (HL)
AND 0x80
DEC HL
DEC HL
XOR (HL)
LD (HL), A
RET
MB_DROUNA:
LD HL, MB_DFACLO
LD B, 0x7
MB_DRONA1:
INC (HL)
RET NZ
INC HL
DEC B
JP NZ, MB_DRONA1
INC (HL)
JP Z, MB_OVFIN4
DEC HL
LD (HL), 0x80
RET
MB_DADDD:
LD DE, MB_FBUFFR+27
LD HL, MB_ARGLO
JP MB_DADDS
MB_DADDAA:
DB 0x3E
ADC A, (HL)
MB_DADDA:
LD HL, MB_ARGLO
MB_DADDFO:
LD DE, MB_DFACLO
MB_DADDS:
LD C, 0x7
MB_DADDS1:
LD (MB_DADDOP), A
XOR A
MB_DADDL:
LD A, (DE)
MB_DADDOP:
ADC A, (HL)
LD (DE), A
INC DE
INC HL
DEC C
JP NZ, MB_DADDL
RET
MB_DNEGR:
LD A, (HL)
CPL
LD (HL), A
LD HL, 0xbff
LD B, 0x8
XOR A
LD C, A
MB_DNEGR1:
LD A, C
SBC A, (HL)
LD (HL), A
INC HL
DEC B
JP NZ, MB_DNEGR1
RET
MB_DSHFTR:
LD (HL), C
PUSH HL
MB_DSHFR1:
SUB 0x8
JP C, MB_DSHFR3
POP HL
MB_DSHFRM:
PUSH HL
LD DE, 0x800
MB_DSHFR2:
LD C, (HL)
LD (HL), E
LD E, C
DEC HL
DEC D
JP NZ, MB_DSHFR2
JP MB_DSHFR1
MB_DSHFR3:
ADD A, 0x9
LD D, A
MB_DSHFR4:
XOR A
POP HL
DEC D
RET Z
MB_DSHFRA:
PUSH HL
LD E, 0x8
MB_DSHFR5:
LD A, (HL)
RRA
LD (HL), A
DEC HL
DEC E
JP NZ, MB_DSHFR5
JP MB_DSHFR4
MB_DSHFRB:
LD HL, MB_FAC-1
LD D, 0x1
JP MB_DSHFRA
MB_DSHFLC:
LD C, 0x8
MB_DSHFTL:
LD A, (HL)
RLA
LD (HL), A
INC HL
DEC C
JP NZ, MB_DSHFTL
RET
MB_DMULT:
CALL MB_SIGN
RET Z
LD A, (MB_ARG)
OR A
JP Z, MB_ZERO
CALL MB_MULDVA
CALL MB_DMULDV
LD (HL), C
INC DE
LD B, 0x7
MB_DMULT2:
LD A, (DE)
INC DE
OR A
PUSH DE
JP Z, MB_DMULT5
LD C, 0x8
MB_DMULT3:
PUSH BC
RRA
LD B, A
CALL C, MB_DADDAA
CALL MB_DSHFRB
LD A, B
POP BC
DEC C
JP NZ, MB_DMULT3
MB_DMULT4:
POP DE
DEC B
JP NZ, MB_DMULT2
JP MB_DNORML
MB_DMULT5:
LD HL, MB_FAC-1
CALL MB_DSHFRM
JP MB_DMULT4
MB_TENTH:
DB 0xCD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x4C, 0x7D
MB_DTEN:
DB 0, 0, 0, 0
MB_FTEN:
DB 0, 0, 0x20, 0x84
MB_DDIV10:
LD A, (MB_FAC)
CP 0x41
JP NC, MB_DD04
LD DE, MB_TENTH
LD HL, MB_ARGLO
CALL MB_VMOVE
JP MB_DMULT
MB_DD04:
LD A, (MB_FAC-1)
OR A
JP P, MB_DD05
AND 0x7f
LD (MB_FAC-1), A
LD HL, MB_NEG
PUSH HL
MB_DD05:
CALL _DECF1
LD DE, MB_DFACLO
LD HL, MB_ARGLO
CALL MB_VMOVE
CALL _DECF1
CALL MB_DADD
LD DE, MB_DFACLO
LD HL, MB_ARGLO
CALL MB_VMOVE
LD A, 0xf
MB_DD10:
PUSH AF
CALL _DECA4
CALL _PSARG
CALL MB_DADD
;LAB_ram_2dfd:
LD HL, MB_ARG-1
CALL _PPARG
POP AF
DEC A
JP NZ, MB_DD10
CALL _DECF1
CALL _DECF1
_DECF1:
LD HL, MB_FAC
DEC (HL)
RET NZ
JP MB_ZERO
_DECA4:
LD HL, MB_ARG
LD A, 0x4
MB_DC4:
DEC (HL)
RET Z
DEC A
JP NZ, MB_DC4
RET
_PSARG:
POP DE
LD A, 0x4
LD HL, MB_ARGLO
MB_PSA10:
LD C, (HL)
INC HL
LD B, (HL)
INC HL
PUSH BC
DEC A
JP NZ, MB_PSA10
PUSH DE
RET
_PPARG:
POP DE
LD A, 0x4
LD HL, MB_ARG
MB_PPA10:
POP BC
LD (HL), B
DEC HL
LD (HL), C
DEC HL
DEC A
JP NZ, MB_PPA10
PUSH DE
RET
MB_DDIV:
LD A, (MB_ARG)
OR A
JP Z, MB_INTDV0
LD A, (MB_FAC)
OR A
JP Z, MB_ZERO
CALL MB_MULDVS
INC (HL)
INC (HL)
JP Z, MB_OVFIN4
CALL MB_DMULDV
LD HL, MB_FBUFFR+34
LD (HL), C
LD B, C
MB_DDIV1:
DB 0x3E
SBC A, (HL)
CALL MB_DADDD
LD A, (DE)
SBC A, C
CCF
JP C, MB_DDIV2
DB 0x3E
ADC A, (HL)
CALL MB_DADDD
XOR A
DB 0xDA
MB_DDIV2:
LD (DE), A
INC B
LD A, (MB_FAC-1)
INC A
DEC A
RRA
JP M, MB_DROUNB
RLA
LD HL, MB_DFACLO
LD C, 0x7
CALL MB_DSHFTL
LD HL, MB_FBUFFR+27
CALL MB_DSHFLC
LD A, B
OR A
JP NZ, MB_DDIV1
LD HL, MB_FAC
DEC (HL)
JP NZ, MB_DDIV1
JP MB_ZERO
MB_DMULDV:
LD A, C
LD (MB_ARG-1), A
DEC HL
LD DE, MB_FBUFFR+33
LD BC, 0x700
MB_DMLDV1:
LD A, (HL)
LD (DE), A
LD (HL), C
DEC DE
DEC HL
DEC B
JP NZ, MB_DMLDV1
RET
; ===================================================
MB_DMUL10:
CALL MB_VMOVAF
EX DE, HL
DEC HL
LD A, (HL)
OR A
RET Z
ADD A, 0x2
JP C, MB_OVFIN4
LD (HL), A
PUSH HL
CALL MB_DADD
POP HL
INC (HL)
RET NZ
JP MB_OVFIN4
; ===================================================
MB_FINDBL:
CALL MB_ZERO
CALL MB_VALDBL
DB 0xF6
; ===================================================
MB_FIN:
XOR A
LD BC, MB_FINOVC
PUSH BC
PUSH AF
LD A, 0x1
LD (MB_FLGOVC), A
POP AF
EX DE, HL
LD BC, 0xff
LD H, B
LD L, B
CALL Z, MB_MAKINT
EX DE, HL
LD A, (HL) ;= 44
CP '&'
JP Z, MB_OCTCNS
CP '-'
PUSH AF
JP Z, MB_FINC
CP '+'
JP Z, MB_FINC
DEC HL
MB_FINC:
CALL MB_CHRGTR
JP C, MB_FINDIG
CP '.'
JP Z, MB_FINDP
CP 'e'
JP Z, MB_FINC1
CP 'E'
MB_FINC1:
JP NZ, MB_NOTE
PUSH HL
CALL MB_CHRGTR
CP 'l'
JP Z, MB_WUZELS
CP 'L'
JP Z, MB_WUZELS
CP 'q'
JP Z, MB_WUZELS
CP 'Q'
MB_WUZELS:
POP HL
JP Z, MB_WUZ
LD A, (MB_VALTYP)
CP 0x8
JP Z, MB_FINEX1
LD A, 0x0
JP MB_FINEX1
MB_WUZ:
LD A, (HL)
MB_NOTE:
CP '%'
JP Z, MB_FININT
CP '#'
JP Z, MB_FINDBF
CP '!'
JP Z, MB_FINSNF
CP 'd'
JP Z, MB_FINEX1
CP 'D'
JP NZ, MB_FINE
MB_FINEX1:
OR A
MB_FINEX:
CALL MB_FINFRC
CALL MB_CHRGTR
CALL MB_MINPLS
MB_FINEC:
CALL MB_CHRGTR
JP C, MB_FINEDG
INC D
JP NZ, MB_FINE
XOR A
SUB E
LD E, A
MB_FINE:
PUSH HL
LD A, E
SUB B
LD E, A
MB_FINE2:
CALL P, MB_FINMUL
CALL M, MB_FINDIV
JP NZ, MB_FINE2
POP HL
POP AF
PUSH HL
CALL Z, MB_VNEG
POP HL
CALL MB_GETYPR
RET PE
PUSH HL
LD HL, MB_POPHRT
PUSH HL
CALL MB_CONIS2
RET
MB_FINDP:
CALL MB_GETYPR
INC C
JP NZ, MB_FINE
CALL C, MB_FINFRC
JP MB_FINC
MB_FININT:
CALL MB_CHRGTR
POP AF
PUSH HL
LD HL, MB_POPHRT
PUSH HL
LD HL, MB_FRCINT
PUSH HL
PUSH AF
JP MB_FINE
MB_FINDBF:
OR A
MB_FINSNF:
CALL MB_FINFRC
CALL MB_CHRGTR
JP MB_FINE
MB_FINFRC:
PUSH HL
PUSH DE
PUSH BC
PUSH AF
CALL Z, MB_FRCSNG
POP AF
CALL NZ, MB_FRCDBL
POP BC
POP DE
POP HL
RET
MB_FINMUL:
RET Z
MB_FINMLT:
PUSH AF
CALL MB_GETYPR
PUSH AF
CALL PO, MB_MUL10
POP AF
CALL PE, MB_DMUL10
POP AF
MB_DCRART:
DEC A
RET
MB_FINDIV:
PUSH DE
PUSH HL
PUSH AF
CALL MB_GETYPR
PUSH AF
CALL PO, MB_DIV10
POP AF
CALL PE, MB_DDIV10
POP AF
POP HL
POP DE
INC A
RET
MB_FINDIG:
PUSH DE
LD A, B
ADC A, C
LD B, A
PUSH BC
PUSH HL
LD A, (HL)
SUB '0'
PUSH AF
CALL MB_GETYPR
JP P, MB_FINDGV
LD HL, (MB_FACLO)
LD DE, 3277 ; check for overflov
CALL MB_DCOMPR
JP NC, MB_FINDG2
LD D, H
LD E, L
ADD HL, HL
ADD HL, HL
ADD HL, DE
ADD HL, HL
POP AF
LD C, A
ADD HL, BC
LD A, H
OR A
JP M, MB_FINDG1
LD (MB_FACLO), HL
MB_FINDGE:
POP HL
POP BC
POP DE
JP MB_FINC
MB_FINDG1:
LD A, C
PUSH AF
MB_FINDG2:
CALL MB_CONSI
SCF
MB_FINDGV:
JP NC, MB_FINDGD
LD BC, 0x9474
LD DE, 0x2400
CALL MB_FCOMP
JP P, MB_FINDG3
CALL MB_MUL10
POP AF
CALL MB_FINLOG
JP MB_FINDGE
MB_FINDG3:
CALL MB_CONDS
MB_FINDGD:
CALL MB_DMUL10
CALL MB_VMOVAF
POP AF
CALL MB_FLOAT
CALL MB_CONDS
CALL MB_DADD
JP MB_FINDGE
MB_FINLOG:
CALL MB_PUSHF
CALL MB_FLOAT
MB_FADDT:
POP BC
POP DE
JP MB_FADD
MB_FINEDG:
LD A, E
CP 0xa
JP NC, MB_FINEDO
RLCA
RLCA
ADD A, E
RLCA
ADD A, (HL)
SUB '0'
LD E, A
DB 0xFA
MB_FINEDO:
LD E, 0x7f
JP MB_FINEC
MB_OVFIN2:
PUSH HL
LD HL, MB_FAC-1
CALL MB_GETYPR
JP PO, MB_OVF2A
LD A, (MB_ARG-1)
JP MB_OVF2B
MB_OVF2A:
LD A, C
MB_OVF2B:
XOR (HL)
RLA
POP HL
JP MB_OVFINT
MB_OVFIN6:
POP AF
POP AF
MB_OVFIN3:
LD A, (MB_FAC-1)
RLA
JP MB_OVFINT
MB_OVFIN8:
POP AF
MB_OVFIN4:
LD A, (MB_FAC+1)
CPL
RLA
JP MB_OVFINT
MB_INTDV1:
LD A, C
JP MB_INTDV2
MB_INTDV0:
LD A, (MB_ARG-1)
MB_INTDV2:
RLA
LD HL, MB_DBZ_MSG ;= "Division by zero"
LD (MB_OVERRI), HL ;= 509h
MB_OVFINT:
PUSH HL
PUSH BC
PUSH DE
PUSH AF
PUSH AF
LD HL, (MB_ONELIN)
LD A, H
OR L
JP NZ, MB_OVFPRT
LD HL, MB_FLGOVC
LD A, (HL)
OR A
JP Z, MB_OV1A
DEC A
JP NZ, MB_OVFPRT
INC (HL)
MB_OV1A:
LD HL, (MB_OVERRI) ; = 509h
CALL MB_STRPRN
LD (MB_TTYPOS), A
LD A, 0xd
CALL MB_CALTTY
LD A, 0xa
CALL MB_CALTTY
MB_OVFPRT:
POP AF
LD HL, MB_FACLO
LD DE, MB_INFP
JP NC, MB_OVFINA
LD DE, MB_INFM
MB_OVFINA:
CALL MB_MOVE
CALL MB_GETYPR
JP C, MB_OVFINB
LD HL, MB_DFACLO
LD DE, MB_INFM
CALL MB_MOVE
MB_OVFINB:
LD HL, (MB_ONELIN)
LD A, H
OR L
LD HL, (MB_OVERRI) ; = 509h
LD DE, MB_OVRMSG ; = "Overflow"
EX DE, HL
LD (MB_OVERRI), HL ; = 509h
JP Z, MB_NOODTP
CALL MB_DCOMPR
JP Z, MB_OVERR
JP MB_DV0ERR
MB_NOODTP:
POP AF
POP DE
POP BC
POP HL
RET
MB_INFP:
DB 0xFF, 0xFF, 0x7F, 0xFF
MB_INFM:
DB 0xFF, 0xFF, 0xFF, 0xFF
; ===================================================
; FLOATING POINT OUTPUT ROUTINE
; ===================================================
MB_INPRT:
PUSH HL
LD HL, MB_INTXT ;= " in "
CALL MB_STROUT
POP HL
MB_LINPTR:
LD BC, MB_STROUI
PUSH BC
MB_LINOUT:
CALL MB_MAKINT
XOR A
CALL MB_FOUINI
OR (HL)
JP MB_FOUT2
MB_FOUT:
XOR A
MB_PUFOUT:
CALL MB_FOUINI
AND 0x8
JP Z, MB_FOUT1
LD (HL), '+'
MB_FOUT1:
EX DE, HL
CALL MB_VSIGN
EX DE, HL
JP P, MB_FOUT2
LD (HL), '-'
PUSH BC
PUSH HL
CALL MB_VNEG
POP HL
POP BC
OR H
MB_FOUT2:
INC HL
LD (HL), '0'
LD A, (MB_TEMP3)
LD D, A
RLA
LD A, (MB_VALTYP)
JP C, MB_FOUTFX
JP Z, MB_FOUTZR
CP 0x4
JP NC, MB_FOUFRV
LD BC, 0x0
CALL MB_FOUTCI
MB_FOUTZS:
LD HL, MB_FBUFFR+1
LD B, (HL)
LD C, ' '
LD A, (MB_TEMP3)
LD E, A
AND 0x20
JP Z, MB_FOTZS1
LD A, B
CP C
LD C, '*'
JP NZ, MB_FOTZS1
LD A, E
AND 0x4
JP NZ, MB_FOTZS1
LD B, C
MB_FOTZS1:
LD (HL), C
CALL MB_CHRGTR
JP Z, MB_FOTZS4
CP 'E'
JP Z, MB_FOTZS4
CP 'D'
JP Z, MB_FOTZS4
CP '0'
JP Z, MB_FOTZS1
CP ','
JP Z, MB_FOTZS1
CP '.'
JP NZ, MB_FOTZS2
MB_FOTZS4:
DEC HL
LD (HL), '0'
MB_FOTZS2:
LD A, E
AND 0x10
JP Z, MB_FOTZS3
DEC HL
LD (HL), ASCII_CUR
MB_FOTZS3:
LD A, E
AND 0x4
RET NZ
DEC HL
LD (HL), B
RET
MB_FOUINI:
LD (MB_TEMP3), A
LD HL, MB_FBUFFR+1
LD (HL), ' '
RET
MB_FOUFRV:
CALL MB_PUSHF
EX DE, HL
LD HL, (MB_DFACLO)
PUSH HL
LD HL, (MB_DFACLO+2)
PUSH HL
EX DE, HL
PUSH AF
XOR A
LD (MB_FANSII), A
POP AF
PUSH AF
CALL MB_FOUFRF
LD B, 'E'
LD C, 0x0
; SEARCH FOR "D"
MB_FU1:
PUSH HL
MB_FU1A:
LD A, (HL)
MB_FU2:
CP B
JP Z, MB_FU4
CP ':'
JP NC, MB_FU2A
CP '0'
JP C, MB_FU2A
INC C
MB_FU2A:
INC HL
LD A, (HL)
OR A
JP NZ, MB_FU2
LD A, 'D'
CP B
LD B, A
POP HL
LD C, 0x0
JP NZ, MB_FU1
MB_FU3:
POP AF
POP BC
POP DE
EX DE, HL
LD (MB_DFACLO), HL
LD H, B
LD L, C
LD (MB_DFACLO+2), HL
EX DE, HL
POP BC
POP DE
RET
MB_FU4:
PUSH BC
MB_FU_EV:
LD B, 0x0
INC HL
LD A, (HL)
MB_FU5:
CP '+'
JP Z, MB_FU8
CP '-'
JP Z, MB_FU5A
SUB '0'
LD C, A
LD A, B
ADD A, A
ADD A, A
ADD A, B
ADD A, A
ADD A, C
LD B, A
CP 0x10
JP NC, MB_FU8
MB_FU5A:
INC HL
LD A, (HL)
OR A
JP NZ, MB_FU5
LD H, B
POP BC
LD A, B
CP 'E'
JP NZ, MB_FU7
LD A, C
ADD A, H
CP 0x9
POP HL
JP NC, MB_FU3
MB_FU6:
LD A, 0x80
LD (MB_FANSII), A
JP MB_FU9
MB_FU7:
LD A, H
ADD A, C
CP 0x12
POP HL
JP NC, MB_FU3
JP MB_FU6
MB_FU8:
POP BC
POP HL
JP MB_FU3
MB_FU9:
POP AF
POP BC
POP DE
EX DE, HL
LD (MB_DFACLO), HL
LD H, B
LD L, C
LD (MB_DFACLO+2), HL
EX DE, HL
POP BC
POP DE
CALL MB_MOVFR
INC HL
MB_FOUFRF:
CP 0x5
PUSH HL
SBC A, 0x0
RLA
LD D, A
INC D
CALL MB_FOUTNV
LD BC, 0x300
PUSH AF
LD A, (MB_FANSII)
OR A
JP P, MB_FOFV5A
POP AF
ADD A, D
JP MB_FOUFV6
MB_FOFV5A:
POP AF
ADD A, D
JP M, MB_FOFRS1
INC D
CP D
JP NC, MB_FOFRS1
MB_FOUFV6:
INC A
LD B, A
LD A, 0x2
MB_FOFRS1:
SUB 0x2
POP HL
PUSH AF
CALL MB_FOUTAN
LD (HL), '0'
CALL Z, MB_INXHRT
CALL MB_FOUTCV
MB_FOFRS2:
DEC HL
LD A, (HL)
CP '0'
JP Z, MB_FOFRS2
CP '.'
CALL NZ, MB_INXHRT
POP AF
JP Z, MB_FOUTDN
MB_FOFLDN:
PUSH AF
CALL MB_GETYPR
LD A, '"'
ADC A, A
LD (HL), A
INC HL
POP AF
LD (HL), '+'
JP P, MB_FOUCE1
LD (HL), '-'
CPL
INC A
MB_FOUCE1:
LD B, 0x2f ;'0'-1
MB_FOUCE2:
INC B
SUB 0xa
JP NC, MB_FOUCE2
ADD A, ':' ;'0'+12O
INC HL
LD (HL), B
INC HL
LD (HL), A
MB_FOUTZR:
INC HL
MB_FOUTDN:
LD (HL), 0x0
EX DE, HL
LD HL, MB_FBUFFR+1
RET
MB_FOUTFX:
INC HL
PUSH BC
CP 0x4
LD A, D
JP NC, MB_FOUFXV
RRA
JP C, MB_FFXIFL
LD BC, 0x603
CALL MB_FOUICC
POP DE
LD A, D
SUB 0x5
CALL P, MB_FOTZER
CALL MB_FOUTCI
MB_FOUTTD:
LD A, E
OR A
CALL Z, MB_DCXHRT
DEC A
CALL P, MB_FOTZER
MB_FOUTTS:
PUSH HL
CALL MB_FOUTZS
POP HL
JP Z, MB_FFXIX1
LD (HL), B
INC HL
MB_FFXIX1:
LD (HL), 0x0
LD HL, MB_FBUFFR
MB_FOUBE1:
INC HL
MB_FOUBE5:
LD A, (MB_TEMP2)
SUB L
SUB D
RET Z
LD A, (HL)
CP ' '
JP Z, MB_FOUBE1
CP '*'
JP Z, MB_FOUBE1
DEC HL
PUSH HL
MB_FOUBE2:
PUSH AF
LD BC, MB_FOUBE2
PUSH BC
CALL MB_CHRGTR
CP '-'
RET Z
CP '+'
RET Z
CP ASCII_CUR
RET Z
POP BC
CP '0'
JP NZ, MB_FOUBE4
INC HL
CALL MB_CHRGTR
JP NC, MB_FOUBE4
DEC HL
DB 1
MB_FOUBE3:
DEC HL
LD (HL), A
POP AF
JP Z, MB_FOUBE3
POP BC
JP MB_FOUBE5
MB_FOUBE4:
POP AF
JP Z, MB_FOUBE4
POP HL
LD (HL), '%'
RET
MB_FOUFXV:
PUSH HL
RRA
JP C, MB_FFXFLV
JP Z, MB_FFXSFX
LD DE, MB_FFXDXM
CALL MB_DCOMPD
LD D, 0x10
JP M, MB_FFXSDC
MB_FFXSDO:
POP HL
POP BC
CALL MB_FOUT
DEC HL
LD (HL), '%'
RET
MB_FFXSFX:
LD BC, 0xb60e
LD DE, 0x1bca
CALL MB_FCOMP
JP P, MB_FFXSDO
LD D, 0x6
MB_FFXSDC:
CALL MB_SIGN
CALL NZ, MB_FOUTNV
POP HL
POP BC
JP M, MB_FFXXVS
MB_FFXSD2:
PUSH BC
LD E, A
LD A, B
SUB D
SUB E
CALL P, MB_FOTZER
CALL MB_FOUTCD
CALL MB_FOUTCV
OR E
CALL NZ, MB_FOTZEC
OR E
CALL NZ, MB_FOUTED
POP DE
JP MB_FOUTTD
MB_FFXXVS:
LD E, A
LD A, C
OR A
CALL NZ, MB_DCRART
ADD A, E
MB_FFXXS2:
JP M, MB_FFXXV8
XOR A
MB_FFXXV8:
PUSH BC
PUSH AF
MB_FFXXV2:
CALL M, MB_FINDIV
JP M, MB_FFXXV2
POP BC
LD A, E
SUB B
POP BC
LD E, A
ADD A, D
LD A, B
JP M, MB_FFXXV3
SUB D
SUB E
CALL P, MB_FOTZER
PUSH BC
CALL MB_FOUTCD
JP MB_FFXXV6
MB_FFXXV3:
CALL MB_FOTZER
SUB_ram_33cc:
LD A, C
CALL MB_FOUTDP
LD C, A
XOR A
SUB D
SUB E
CALL MB_FOTZER
PUSH BC
LD B, A
LD C, A
MB_FFXXV6:
CALL MB_FOUTCV ; CONVERT THE NUMBER TO DECIMAL DIGITS
POP BC
OR C
JP NZ, MB_FFXXV7
LD HL, (MB_TEMP2)
MB_FFXXV7:
ADD A, E
DEC A
CALL P, MB_FOTZER
LD D, B
JP MB_FOUTTS
MB_FFXIFL:
PUSH HL
PUSH DE
CALL MB_CONSI
POP DE
XOR A
MB_FFXFLV:
JP Z, MB_FFXSFL
LD E, 0x10
DB 1
MB_FFXSFL:
LD E, 0x6
CALL MB_SIGN
SCF
CALL NZ, MB_FOUTNV
POP HL
POP BC
PUSH AF
LD A, C
OR A
PUSH AF
CALL NZ, MB_DCRART
ADD A, B
LD C, A
LD A, D
AND 0x4
CP 0x1
SBC A, A
LD D, A
ADD A, C
LD C, A
SUB E
PUSH AF
PUSH BC
MB_FFXLV1:
CALL M, MB_FINDIV
JP M, MB_FFXLV1
POP BC
POP AF
PUSH BC
PUSH AF
JP M, MB_FFXLV3
XOR A
MB_FFXLV3:
CPL
INC A
ADD A, B
INC A
ADD A, D
LD B, A
LD C, 0
CALL MB_FOUTCV
POP AF
CALL P, MB_FOTZNC
CALL MB_FOUTED
POP BC
POP AF
JP NZ, MB_FFXLV4
CALL MB_DCXHRT
LD A, (HL)
CP '.'
CALL NZ, MB_INXHRT
LD (MB_TEMP2), HL
MB_FFXLV4:
POP AF
JP C, MB_FFXLV2
ADD A, E
SUB B
SUB D
MB_FFXLV2:
PUSH BC
CALL MB_FOFLDN
EX DE, HL
POP DE
JP MB_FOUTTS
MB_FOUTNV:
PUSH DE
XOR A
PUSH AF
CALL MB_GETYPR
JP PO, MB_FOUNDB
MB_FORBIG:
LD A, (MB_FAC)
CP 0x91
JP NC, MB_FOUNDB
LD DE, MB_TENTEN
LD HL, MB_ARGLO
CALL MB_VMOVE
CALL MB_DMULT
POP AF
SUB 10
PUSH AF
JP MB_FORBIG
MB_FOUNDB:
CALL MB_FOUNVC
MB_FOUNV1:
CALL MB_GETYPR
JP PE, MB_FOUNV4
LD BC, 0x9143
LD DE, 0x4ff9
CALL MB_FCOMP
JP MB_FOUNV5
MB_FOUNV4:
LD DE, MB_FOUTDL
CALL MB_DCOMPD
MB_FOUNV5:
JP P, MB_FOUNV3
POP AF
CALL MB_FINMLT
PUSH AF
JP MB_FOUNV1
MB_FOUNV2:
POP AF
CALL MB_FINDIV
PUSH AF
CALL MB_FOUNVC
MB_FOUNV3:
POP AF
OR A
POP DE
RET
MB_FOUNVC:
CALL MB_GETYPR
JP PE, MB_FONVC1
LD BC, 0x9474
LD DE, 0x23f8
CALL MB_FCOMP
JP MB_FONVC2
MB_FONVC1:
LD DE, MB_FOUTDU
CALL MB_DCOMPD
MB_FONVC2:
POP HL
JP P, MB_FOUNV2
JP (HL)
MB_FOTZER:
OR A
MB_FOTZR1:
RET Z
DEC A
LD (HL), '0'
INC HL
JP MB_FOTZR1
MB_FOTZNC:
JP NZ, MB_FOTZEC
MB_FOTZRC:
RET Z
CALL MB_FOUTED
MB_FOTZEC:
LD (HL), '0'
INC HL
DEC A
JP MB_FOTZRC
MB_FOUTCD:
LD A, E
ADD A, D
INC A
LD B, A
INC A
MB_FOTCD1:
SUB 0x3
JP NC, MB_FOTCD1
ADD A, 0x5
LD C, A
MB_FOUICC:
LD A, (MB_TEMP3)
AND 0x40
RET NZ
LD C, A
RET
MB_FOUTAN:
DEC B
JP P, MB_FOUTE1
LD (MB_TEMP2), HL
LD (HL), '.'
MB_FOUTD1:
INC HL
LD (HL), '0'
INC B
JP NZ, MB_FOUTD1
INC HL
LD C, B
RET
MB_FOUTED:
DEC B
MB_FOUTE1:
JP NZ, MB_FOUED1
MB_FOUTDP:
LD (HL), '.'
LD (MB_TEMP2), HL
INC HL
LD C, B
RET
MB_FOUED1:
DEC C
RET NZ
LD (HL), ','
INC HL
LD C, 0x3
RET
MB_FOUTCV:
PUSH DE
CALL MB_GETYPR
JP PO, MB_FOUTCS
PUSH BC
PUSH HL
CALL MB_VMOVAF
LD HL, MB_DHALF
CALL MB_VMOVFM
CALL MB_DADD
XOR A
CALL MB_DINTFO
POP HL
POP BC
LD DE, MB_FODTBL
LD A, 0xa
MB_FOUCD1:
CALL MB_FOUTED
PUSH BC
PUSH AF
PUSH HL
PUSH DE
LD B, '0' - 1
MB_FOUCD2:
INC B
POP HL
PUSH HL
DB 0x3E
SBC A, (HL)
CALL MB_DADDFO
JP NC, MB_FOUCD2
POP HL
DB 0x3E
ADC A, (HL)
CALL MB_DADDFO
EX DE, HL
POP HL
LD (HL), B
INC HL
POP AF
POP BC
DEC A
JP NZ, MB_FOUCD1
PUSH BC
PUSH HL
LD HL, MB_DFACLO
CALL MB_MOVFM
JP MB_FOUCDC
MB_FOUTCS:
PUSH BC
PUSH HL
CALL MB_FADDH
LD A, 0x1
CALL MB_QINT
CALL MB_MOVFR
MB_FOUCDC:
POP HL
POP BC
XOR A
LD DE, MB_FOSTBL
MB_FOUCS1:
CCF
CALL MB_FOUTED
PUSH BC
PUSH AF
PUSH HL
PUSH DE
CALL MB_MOVRF
POP HL
LD B, '0'-1
MB_FOUCS2:
INC B
LD A, E
SUB (HL)
LD E, A
INC HL
LD A, D
SBC A, (HL)
LD D, A
INC HL
LD A, C
SBC A, (HL)
LD C, A
DEC HL
DEC HL
JP NC, MB_FOUCS2
CALL MB_FADDA
INC HL
CALL MB_MOVFR
EX DE, HL
POP HL
LD (HL), B
INC HL
POP AF
POP BC
JP C, MB_FOUCS1
INC DE
INC DE
LD A, 0x4
JP MB_FOUCI1
MB_FOUTCI:
PUSH DE
LD DE, MB_FOITBL
LD A, 0x5
MB_FOUCI1:
CALL MB_FOUTED
PUSH BC
PUSH AF
PUSH HL
EX DE, HL
LD C, (HL)
INC HL
LD B, (HL)
PUSH BC
INC HL
EX (SP), HL
EX DE, HL
LD HL, (MB_FACLO)
LD B, '0'-1
MB_FOUCI2:
INC B
LD A, L
SUB E
LD L, A
LD A, H
SBC A, D
LD H, A
JP NC, MB_FOUCI2
ADD HL, DE
LD (MB_FACLO), HL
POP DE
POP HL
LD (HL), B
INC HL
POP AF
POP BC
DEC A
JP NZ, MB_FOUCI1
CALL MB_FOUTED
LD (HL), A
POP DE
RET
; ---------------------------------------------------
; CONSTANTS USED BY FOUT
; ---------------------------------------------------
MB_TENTEN:
; 10000000000
DB 0x00, 0x00, 0x00, 0x00, 0xF9, 0x02, 0x15, 0xA2
MB_FOUTDL:
; 999, 999, 999, 999, 999.5
DB 0xE1, 0xFF, 0x9F, 0x31, 0xA9, 0x5F, 0x63, 0xB2
MB_FOUTDU:
; 9, 999, 999, 999, 999, 999.5
DB 0xFE, 0xFF, 0x03, 0xBF, 0xC9, 0x1B, 0x0E, 0xB6
MB_DHALF:
; .5D0
DB 0, 0, 0, 0
MB_FHALF:
; .5E0
DB 0, 0, 0, 0x80
MB_FFXDXM:
; 1D16
DB 0x00, 0x00, 0x04, 0xBF, 0xC9, 0x1B, 0x0E, 0xB6
; ---------------------------------------------------
; DOUBLE PRECISION POWER OF TEN TABLE
; ---------------------------------------------------
MB_FODTBL:
; 1D15
DB 0x00, 0x80, 0xC6, 0xA4, 0x7E, 0x8D, 0x03
; 1D14
DB 0x00, 0x40, 0x7A, 0x10, 0xF3, 0x5A, 0x00
;1D13
DB 0x00, 0xA0, 0x72, 0x4E, 0x18, 0x09, 0x00
;1D12
DB 0x00, 0x10, 0xA5, 0xD4, 0xE8, 0x00, 0x00
;1D11
DB 0x00, 0xE8, 0x76, 0x48, 0x17, 0x00, 0x00
;1D10
DB 0x00, 0xE4, 0x0B, 0x54, 0x02, 0x00, 0x00
;1D9
DB 0x00, 0xCA, 0x9A, 0x3B, 0x00, 0x00, 0x00
;1D8
DB 0x00, 0xE1, 0xF5, 0x05, 0x00, 0x00, 0x00
;1D7
DB 0x80, 0x96, 0x98, 0x00, 0x00, 0x00, 0x00
;1D6
DB 0x40, 0x42, 0x0F, 0x00, 0x00, 0x00, 0x00
MB_FOSTBL:
DB 0xA0, 0x86, 0x01, 0x10, 0x27, 0x00
MB_FOITBL:
DB 0x10, 0x27, 0xE8, 0x03, 0x64, 0x00, 0x0A, 0x00, 0x01, 0x00
MB_FOUTO:
XOR A
LD B, A
DB 0xC2
MB_FOUTH:
LD B, 0x1
PUSH BC
CALL MB_FRQINT
POP BC
LD DE, MB_FBUFFR
PUSH DE
XOR A
LD (DE), A
DEC B
INC B
LD C, 0x6
JP Z, MB_OCTONE
LD C, 0x4
MB_OUTHLP:
ADD HL, HL
ADC A, A
MB_OUTOLP:
ADD HL, HL
ADC A, A
ADD HL, HL
ADC A, A
MB_OCTONE:
ADD HL, HL
ADC A, A
OR A
JP NZ, MB_MAKDIG
LD A, C
DEC A
JP Z, MB_MAKDIG
LD A, (DE)
OR A
JP Z, MB_NOLEAD
XOR A
MB_MAKDIG:
ADD A, '0'
CP '9'+1
JP C, MB_NOTHAL
ADD A, 0x7
MB_NOTHAL:
LD (DE), A
INC DE
LD (DE), A
MB_NOLEAD:
XOR A
DEC C
JP Z, MB_FINOHO
DEC B
INC B
JP Z, MB_OUTOLP
JP MB_OUTHLP
MB_FINOHO:
LD (DE), A
POP HL
RET
; ===================================================
; EXPONENTIATION AND THE SQUARE ROOT FUNCTION
; ===================================================
MB_PSHNEG:
LD HL, MB_NEG
EX (SP), HL
JP (HL)
MB_SQR:
CALL MB_PUSHF
LD HL, MB_FHALF
CALL MB_MOVFM
JP MB_FPWRT
MB_FPWRQ:
CALL MB_FRCSNG
MB_FPWRT:
POP BC
POP DE
MB_FPWR:
LD HL, MB_CLROVC
PUSH HL
LD A, 1
LD (MB_FLGOVC), A
CALL MB_SIGN
LD A, B
JP Z, MB_EXP
JP P, MB_POSEXP
OR A
JP Z, MB_INTDV2
MB_POSEXP:
OR A
JP Z, MB_ZERO0
PUSH DE
PUSH BC
LD A, C
OR 0x7f
CALL MB_MOVRF
JP P, MB_FPWR1
PUSH AF
LD A, (MB_FAC)
CP 0x99
JP C, MB_FPWR0
POP AF
JP MB_FPWR1
MB_FPWR0:
POP AF
PUSH DE
PUSH BC
CALL MB_INT
POP BC
POP DE
PUSH AF
CALL MB_FCOMP
POP HL
LD A, H
RRA
MB_FPWR1:
POP HL
LD (MB_FAC-1), HL
POP HL
LD (MB_FACLO), HL
CALL C, MB_PSHNEG
CALL Z, MB_NEG
PUSH DE
PUSH BC
CALL MB_LOG
POP BC
POP DE
CALL MB_FMUL
; ---------------------------------------------------
; FUNCTION EXP(X) CALCULATES e^X WHERE e=2.718282
; ---------------------------------------------------
MB_EXP:
LD BC, 0x8138
LD DE, 0xaa3b
CALL MB_FMUL
LD A, (MB_FAC)
CP 0x88
JP NC, MB_EXP100
CP 0x68
JP C, MB_EXP200
CALL MB_PUSHF
CALL MB_INT
ADD A, 0x81
POP BC
POP DE
JP Z, MB_EXP110
PUSH AF
CALL MB_FSUB
LD HL, 0x377b
CALL MB_POLY
POP BC
LD DE, 0x0
LD C, D
JP MB_FMUL
MB_EXP100:
CALL MB_PUSHF
MB_EXP110:
LD A, (MB_FAC-1)
OR A
JP P, MB_EXP115
POP AF
POP AF
JP MB_ZERO
MB_EXP115:
JP MB_OVFIN6
MB_EXP200:
LD BC, 0x8100
LD DE, 0x0
JP MB_MOVFR
;Hart 1302 polynomial coefficients
MB_EXPBCN:
DB 0x07 ; DEGREE + 1
; .00020745577403-
DB 0x7C, 0x88, 0x59, 0x74
; .00127100574569-
DB 0xE0, 0x97, 0x26, 0x77
; .00965065093202+
DB 0xC4, 0x1D, 0x1E, 0x7A
; .05549656508324+
DB 0x5E, 0x50, 0x63, 0x7C
; .24022713817633-
DB 0x1A, 0xFE, 0x75, 0x7E
; .69314717213716+
DB 0x18, 0x72, 0x31, 0x80
; 1.0
DB 0, 0, 0, 0x81
; ===================================================
; POLYNOMIAL EVALUATOR AND THE RANDOM NUMBER GENERATOR
; ===================================================
MB_POLYX:
CALL MB_PUSHF
LD DE, MB_FMULTT
PUSH DE
MB_POLYX2:
PUSH HL
CALL MB_MOVRF
CALL MB_FMUL
POP HL
MB_POLY:
CALL MB_PUSHF
LD A, (HL)
INC HL
CALL MB_MOVFM
DB 0x06
MB_POLY1:
POP AF
POP BC
POP DE
DEC A
RET Z
PUSH DE
PUSH BC
PUSH AF
PUSH HL
CALL MB_FMUL
POP HL
CALL MB_MOVRM
PUSH HL
CALL MB_FADD
POP HL
JP MB_POLY1
MB_RNDCOP:
DB 82
DB 199
DB 79
DB 128
MB_RNDMON:
CALL MB_CHRGTR
MB_RNDMN2:
PUSH HL
LD HL, MB_FONE
CALL MB_MOVFM
CALL MB_RND
POP HL
JP MB_VALSNG
MB_RND:
CALL MB_SIGN
LD HL, MB_RNDCNT + 1
JP M, MB_RNDSTR
LD HL, MB_RNDX
CALL MB_MOVFM
LD HL, MB_RNDCNT + 1
RET Z
ADD A, (HL)
AND 0x7
LD B, 0x0
LD (HL), A
INC HL
ADD A, A
ADD A, A
LD C, A
ADD HL, BC
CALL MB_MOVRM
CALL MB_FMUL
LD A, (MB_RNDCNT)
INC A
AND 0x3
LD B, 0x0
CP 0x1
ADC A, B
LD (MB_RNDCNT), A
LD HL, MB_RNDX ;RNDTB2-4
ADD A, A
ADD A, A
LD C, A
ADD HL, BC
CALL MB_FADDS
MB_RND1:
CALL MB_MOVRF
LD A, E
LD E, C
XOR 0x4f
LD C, A
LD (HL), 0x80
DEC HL
LD B, (HL)
LD (HL), 0x80
LD HL, MB_RNDCNT - 1
INC (HL)
LD A, (HL)
SUB 0xab
JP NZ, MB_NTPTRB
LD (HL), A
INC C
DEC D
INC E
MB_NTPTRB:
CALL MB_NORMAL
LD HL, MB_RNDX
JP MB_MOVMF
MB_RNDSTR:
LD (HL), A
DEC HL
LD (HL), A
DEC HL
LD (HL), A
JP MB_RND1
DB 0
MB_RNDCNT:
DB 0, 0
MB_RNDTAB:
DB 0x35, 0x4A, 0xCA, 0x99, 0x39, 0x1C, 0x76, 0x98
DB 0x22, 0x95, 0xB3, 0x98, 0x0A, 0xDD, 0x47, 0x98
DB 0x53, 0xD1, 0x99, 0x99, 0x0A, 0x1A, 0x9F, 0x98
DB 0x65, 0xBC, 0xCD, 0x98, 0xD6, 0x77, 0x3E, 0x98
MB_RNDX:
DB 0x52, 0xC7, 0x4F, 0x80
MB_RNDTB2:
DB 0x68, 0xB1, 0x46, 0x68, 0x99, 0xE9, 0x92, 0x69
DB 0x10, 0xD1, 0x75, 0x68
MB_COS:
LD HL, MB_PI2
CALL MB_FADDS
MB_SIN:
LD A, (MB_FAC)
CP 0x77
RET C
LD A, (MB_FAC-1)
OR A
JP P, MB_SIN2
AND 0x7f
LD (MB_FAC-1), A
LD DE, MB_NEG
PUSH DE
MB_SIN2:
LD BC, 0x7e22
LD DE, 0xf983
CALL MB_FMUL
CALL MB_PUSHF
CALL MB_INT
POP BC
POP DE
CALL MB_FSUB
LD BC, 0x7f00
LD DE, 0x0
CALL MB_FCOMP
JP M, MB_SIN2A
LD BC, 0x7f80
LD DE, 0x0
CALL MB_FADD
LD BC, 0x8080
LD DE, 0x0
CALL MB_FADD
CALL MB_SIGN
CALL P, MB_NEG
LD BC, 0x7f00
LD DE, 0x0
CALL MB_FADD
CALL MB_NEG
MB_SIN2A:
LD A, (MB_FAC-1)
OR A
PUSH AF
JP P, MB_SIN3
XOR 0x80
LD (MB_FAC-1), A
MB_SIN3:
LD HL, MB_SINCON
CALL MB_POLYX
POP AF
RET P
LD A, (MB_FAC-1)
XOR 0x80
LD (MB_FAC-1), A
RET
; ---------------------------------------------------
; CONSTANTS FOR SIN, COS
; ---------------------------------------------------
MB_P1B2PI:
DB 0x00, 0x00, 0x00, 0x00, 0x83, 0xF9, 0x22, 0x7E
MB_PI2:
DB 0xDB, 0x0F, 0x49, 0x81
MB_FR4:
DB 0, 0, 0, 0x7F
; ---------------------------------------------------
; HART ALGORITHM 3341 CONSTANTS
; ---------------------------------------------------
MB_SINCON:
DB 0x05, 0xFB, 0xD7, 0x1E, 0x86, 0x65, 0x26, 0x99
DB 0x87, 0x58, 0x34, 0x23, 0x87, 0xE1, 0x5D, 0xA5
DB 0x86, 0xDB, 0x0F, 0x49, 0x83
; ---------------------------------------------------
; TANGENT FUNCTION
; TAN(X)=SIN(X)/COS(X)
; ---------------------------------------------------
MB_TAN:
CALL MB_PUSHF
CALL MB_SIN
POP BC
POP HL
CALL MB_PUSHF
EX DE, HL
CALL MB_MOVFR
CALL MB_COS
JP MB_FDIVT
MB_ATN:
CALL MB_SIGN
CALL M, MB_PSHNEG
CALL M, MB_NEG
LD A, (MB_FAC)
CP 0x81
JP C, MB_ATN2
LD BC, 0x8100
LD D, C
LD E, C
CALL MB_FDIV
LD HL, MB_FSUBS
PUSH HL
MB_ATN2:
LD HL, MB_ATNCON
CALL MB_POLYX
LD HL, MB_PI2
RET
; ---------------------------------------------------
MB_ATNCON:
DB 0x09, 0x4A, 0xD7, 0x3B, 0x78, 0x02, 0x6E, 0x84
DB 0x7B, 0xFE, 0xC1, 0x2F, 0x7C, 0x74, 0x31, 0x9A
DB 0x7D, 0x84, 0x3D, 0x5A, 0x7D, 0xC8, 0x7F, 0x91
DB 0x7E, 0xE4, 0xBB, 0x4C, 0x7E, 0x6C, 0xAA, 0xAA
DB 0x7F, 0x00, 0x00, 0x00, 0x81
; ===================================================
; BASIC Interpreter pointer get routines/WHG/PGA
; BIPTRG.MAC
; ===================================================
; DIMENSION & VARIABLE SEARCHING - PTRGET
MB_DIMCON:
DEC HL
CALL MB_CHRGTR
RET Z
CALL MB_SYNCHR
DB ','
MB_DIM:
LD BC, MB_DIMCON
PUSH BC
DB 0xF6
;--------------------------------------------------
; SCAN NAME AND RETURN POINTER IN [DE]
;--------------------------------------------------
MB_PTRGET:
XOR A
LD (MB_DIMFLG), A
LD C, (HL)
MB_PTRGT2:
CALL MB_ISLET
JP C, MB_SNERR
XOR A
LD B, A
LD (MB_NAMCNT), A
INC HL
LD A, (HL)
CP '.'
JP C, MB_NOSEC
JP Z, MB_ISSEC
CP ':'
JP NC, MB_PTRGT3
CP '0'
JP NC, MB_ISSEC
MB_PTRGT3:
CALL MB_ISLET2
JP C, MB_NOSEC
MB_ISSEC:
LD B, A
PUSH BC
LD B, 0xff
LD DE, MB_NAMCNT ;NAMBUF-1
MB_VMORCH:
OR 0x80
INC B
LD (DE), A
INC DE
INC HL
LD A, (HL)
CP ':'
JP NC, MB_VMORC1
CP '0'
JP NC, MB_VMORCH
MB_VMORC1:
CALL MB_ISLET2
JP NC, MB_VMORCH
CP '.'
JP Z, MB_VMORCH
LD A, B
CP ASCII_SQ
JP NC, MB_SNERR
POP BC
LD (MB_NAMCNT), A
LD A, (HL)
MB_NOSEC:
CP '%' + 1 ; &
JP NC, MB_TABTYP
LD DE, MB_HAVTYP
PUSH DE
LD D, 0x2
CP '%'
RET Z
INC D
CP ASCII_CUR
RET Z
INC D
CP '!'
RET Z
LD D, 0x8
CP '#'
RET Z
POP AF
MB_TABTYP:
LD A, C
AND 0x7f
LD E, A
LD D, 0x0
PUSH HL
LD HL, MB_DEFTBL - 'A'
ADD HL, DE
LD D, (HL)
POP HL
DEC HL
MB_HAVTYP:
LD A, D
LD (MB_VALTYP), A
CALL MB_CHRGTR
LD A, (MB_SUBFLG)
DEC A
JP Z, MB_ERSFIN
JP P, MB_NOARYS
LD A, (HL)
SUB '('
JP Z, MB_ISARY
SUB '[' - ')' + 1
JP Z, MB_ISARY
MB_NOARYS:
XOR A
LD (MB_SUBFLG), A
PUSH HL
LD A, (MB_NOFUNS)
OR A
LD (MB_PRMFLG), A
JP Z, MB_SNFUNS
LD HL, (MB_PRMLEN)
LD DE, MB_PARM1
ADD HL, DE
LD (MB_ARYTA2), HL
EX DE, HL
JP MB_LOPFND
MB_LOPTOP:
LD A, (DE)
LD L, A
INC DE
LD A, (DE)
INC DE
CP C
JP NZ, MB_NOTIT1
LD A, (MB_VALTYP)
CP L
JP NZ, MB_NOTIT1
LD A, (DE)
CP B
JP Z, MB_FINPTR
MB_NOTIT1:
INC DE
MB_NFINPT:
LD A, (DE)
MB_SNOMAT:
LD H, 0x0
ADD A, L
INC A
LD L, A
ADD HL, DE
MB_LOPFND:
EX DE, HL
LD A, (MB_ARYTA2)
CP E
JP NZ, MB_LOPTOP
LD A, (MB_ARYTA2+1)
CP D
JP NZ, MB_LOPTOP
MB_NOTFNS:
LD A, (MB_PRMFLG)
OR A
JP Z, MB_SMKVAR
XOR A
LD (MB_PRMFLG), A
MB_SNFUNS:
LD HL, (MB_ARYTAB)
LD (MB_ARYTA2), HL
LD HL, (MB_VARTAB)
JP MB_LOPFND
;--------------------------------------------------
;SCAN NAME AND RETURN POINTER IN [DE]
;--------------------------------------------------
MB_NVRFIL:
CALL MB_PTRGET
MB_FILRET:
RET
MB_VARNOT:
LD D, A
LD E, A
POP BC
EX (SP), HL
RET
MB_SMKVAR:
POP HL
EX (SP), HL
PUSH DE
LD DE, MB_FILRET
CALL MB_DCOMPR
JP Z, MB_VARNOT
LD DE, MB_RETVAR
CALL MB_DCOMPR
POP DE
JP Z, MB_FINZER
EX (SP), HL
PUSH HL
PUSH BC
LD A, (MB_VALTYP)
LD B, A
LD A, (MB_NAMCNT)
ADD A, B
INC A
LD C, A
PUSH BC
LD B, 0x0
INC BC
INC BC
INC BC
LD HL, (MB_STREND)
PUSH HL
ADD HL, BC
POP BC
PUSH HL
CALL MB_BLTU
POP HL
LD (MB_STREND), HL
LD H, B
LD L, C
LD (MB_ARYTAB), HL
MB_ZEROER:
DEC HL
LD (HL), 0x0
CALL MB_DCOMPR
JP NZ, MB_ZEROER
POP DE
LD (HL), D
INC HL
POP DE
LD (HL), E
INC HL
LD (HL), D
CALL MB_NPUTSB
EX DE, HL
INC DE
POP HL
RET
MB_FINPTR:
INC DE
LD A, (MB_NAMCNT)
LD H, A
LD A, (DE)
CP H
JP NZ, MB_NFINPT
OR A
JP NZ, MB_NTFPRT
INC DE
POP HL
RET
MB_NTFPRT:
EX DE, HL
CALL MB_MATSUB
EX DE, HL
JP NZ, MB_SNOMAT
POP HL
RET
MB_FINZER:
LD (MB_FAC), A
LD H, A
LD L, A
LD (MB_FACLO), HL
CALL MB_GETYPR
JP NZ, POPHR2
LD HL, MB_OKTXT-1
LD (MB_FACLO), HL
POPHR2:
POP HL
RET
MB_ISARY:
PUSH HL
LD HL, (MB_DIMFLG)
EX (SP), HL
LD D, A
MB_INDLOP:
PUSH DE
PUSH BC
LD DE, MB_NAMCNT
LD A, (DE)
OR A
JP Z, MB_SHTNAM
EX DE, HL
ADD A, 0x2
RRA
LD C, A
CALL MB_GETSTK
LD A, C
MB_LPPSNM:
LD C, (HL)
INC HL
LD B, (HL)
INC HL
PUSH BC
DEC A
JP NZ, MB_LPPSNM
PUSH HL
LD A, (MB_NAMCNT)
PUSH AF
EX DE, HL
CALL MB_INTIDX
POP AF
LD (MB_NAMTMP), HL
POP HL
ADD A, 0x2
RRA
MB_LPLNAM:
POP BC
DEC HL
LD (HL), B
DEC HL
LD (HL), C
DEC A
JP NZ, MB_LPLNAM
LD HL, (MB_NAMTMP)
JP MB_LNGNAM
MB_SHTNAM:
CALL MB_INTIDX
XOR A
LD (MB_NAMCNT), A
MB_LNGNAM:
LD A, (MB_OPTVAL)
OR A
JP Z, MB_OPTB0
LD A, D
OR E
JP Z, MB_BSERR
DEC DE
MB_OPTB0:
POP BC
POP AF
EX DE, HL
EX (SP), HL
PUSH HL
EX DE, HL
INC A
LD D, A
LD A, (HL)
CP ','
JP Z, MB_INDLOP
CP ')'
JP Z, MB_DOCHRT
CP ']'
JP NZ, MB_SNERR
MB_DOCHRT:
CALL MB_CHRGTR
LD (MB_TEMP2), HL
POP HL
LD (MB_DIMFLG), HL
LD E, 0x0
PUSH DE
DB 0x11
MB_ERSFIN:
PUSH HL
PUSH AF
LD HL, (MB_ARYTAB)
DB 0x3E
MB_LOPFDA:
ADD HL, DE
EX DE, HL
LD HL, (MB_STREND)
EX DE, HL
CALL MB_DCOMPR
JP Z, MB_NOTFDD
LD E, (HL)
INC HL
LD A, (HL)
INC HL
CP C
JP NZ, MB_NMARY1
LD A, (MB_VALTYP)
CP E
JP NZ, MB_NMARY1
LD A, (HL)
CP B
JP Z, MB_CMPNAM
MB_NMARY1:
INC HL
MB_BNAMSZ:
LD E, (HL)
INC E
LD D, 0x0
ADD HL, DE
MB_CNOMAT:
LD E, (HL)
INC HL
LD D, (HL)
INC HL
JP NZ, MB_LOPFDA
LD A, (MB_DIMFLG)
OR A
JP NZ, MB_DDERR
POP AF
LD B, H
LD C, L
JP Z, MB_POPHRT
SUB (HL)
JP Z, MB_GETDEF
MB_BSERR:
LD DE, ERRBS ;"SUBSCRIPT OUT OF RANGE"
JP MB_ERROR
MB_CMPNAM:
INC HL
LD A, (MB_NAMCNT)
CP (HL)
JP NZ, MB_BNAMSZ
INC HL
OR A
JP Z, MB_CNOMAT
DEC HL
CALL MB_MATSUB
JP MB_CNOMAT
MB_NOTFDD:
LD A, (MB_VALTYP)
LD (HL), A
INC HL
LD E, A
LD D, 0x0
POP AF
JP Z, MB_PTRRNZ
LD (HL), C
INC HL
LD (HL), B
CALL MB_NPUTSB
INC HL
LD C, A
CALL MB_GETSTK
INC HL
INC HL
LD (MB_TEMP3), HL
LD (HL), C
INC HL
LD A, (MB_DIMFLG)
RLA
LD A, C
MB_LOPPTA:
JP C, MB_POPDIM
PUSH AF
LD A, (MB_OPTVAL)
XOR 0xb
LD C, A
LD B, 0x0
POP AF
JP NC, MB_NOTDIM
MB_POPDIM:
POP BC
INC BC
MB_NOTDIM:
LD (HL), C
PUSH AF
INC HL
LD (HL), B
INC HL
CALL MB_UMULT
POP AF
DEC A
JP NZ, MB_LOPPTA
PUSH AF
LD B, D
LD C, E
EX DE, HL
ADD HL, DE
JP C, MB_OMERR
CALL MB_REASON
LD (MB_STREND), HL
MB_ZERITA:
DEC HL
LD (HL), 0x0
CALL MB_DCOMPR
JP NZ, MB_ZERITA
INC BC
LD D, A
LD HL, (MB_TEMP3)
LD E, (HL)
EX DE, HL
ADD HL, HL
ADD HL, BC
EX DE, HL
DEC HL
DEC HL
LD (HL), E
INC HL
LD (HL), D
INC HL
POP AF
JP C, MB_FINNOW
MB_GETDEF:
LD B, A
LD C, A
LD A, (HL)
INC HL
DB 0x16
MB_INLPNM:
POP HL
LD E, (HL)
INC HL
LD D, (HL)
INC HL
EX (SP), HL
PUSH AF
CALL MB_DCOMPR
JP NC, MB_BSERR
CALL MB_UMULT
ADD HL, DE
POP AF
DEC A
LD B, H
LD C, L
JP NZ, MB_INLPNM
LD A, (MB_VALTYP)
LD B, H
LD C, L
ADD HL, HL
SUB 0x4
JP C, MB_SMLVAL
ADD HL, HL
JP Z, MB_DONMUL
ADD HL, HL
MB_SMLVAL:
OR A
JP PO, MB_DONMUL
ADD HL, BC
MB_DONMUL:
POP BC
ADD HL, BC
EX DE, HL
MB_FINNOW:
LD HL, (MB_TEMP2)
RET
MB_PTRRNZ:
SCF
SBC A, A
POP HL
RET
MB_IADAHL:
LD A, (HL)
INC HL
MB_ADDAHL:
PUSH BC
LD B, 0x0
LD C, A
ADD HL, BC
POP BC
RET
MB_NPUTSB:
PUSH BC
PUSH DE
PUSH AF
LD DE, MB_NAMCNT
LD A, (DE)
LD B, A
INC B
MB_SLPLNG:
LD A, (DE)
INC DE
INC HL
LD (HL), A
DEC B
JP NZ, MB_SLPLNG
POP AF
POP DE
POP BC
RET
MB_MATSUB:
PUSH DE
PUSH BC
LD DE, MB_NAMBUF
LD B, A
INC HL
INC B
MB_SLPMAT:
DEC B
JP Z, MB_ISMAT2
LD A, (DE)
INC DE
CP (HL)
INC HL
JP Z, MB_SLPMAT
LD A, B
DEC A
CALL NZ, MB_ADDAHL
XOR A
DEC A
MB_ISMAT2:
POP BC
POP DE
RET
; ===================================================
; BASIC Interpreter EDIT routines/PGA etc.
; BIEDIT.MAC
; ===================================================
MB_ERREDT:
LD (MB_ERRFLG), A
LD HL, (MB_ERRLIN)
OR H
AND L
INC A
EX DE, HL
RET Z
JP MB_EREDIT
MB_EDIT:
CALL MB_LINSPC
RET NZ
MB_EREDIT:
POP HL
MB_EEDITS:
EX DE, HL
LD (MB_DOT), HL
EX DE, HL
CALL MB_FNDLIN
JP NC, MB_USERR
LD H, B
LD L, C
INC HL
INC HL
LD C, (HL)
INC HL
LD B, (HL)
INC HL
PUSH BC
CALL MB_BUFLIN
MB_LLED:
POP HL
MB_INLED:
PUSH HL
LD A, H
AND L
INC A
LD A, '!'
CALL Z, MB_OUTDO
CALL NZ, MB_LINPTR
LD A, ASCII_SP
CALL MB_OUTDO
LD HL, MB_BUF
PUSH HL
LD C, 0xff
MB_LENLP:
INC C
LD A, (HL)
INC HL
OR A
JP NZ, MB_LENLP
POP HL
LD B, A
MB_DISPED:
LD D, 0x0
MB_DISPI:
CALL MB_INCHRI
OR A
JP Z, MB_DISPI
CALL MB_MAKUPS
SUB '0'
JP C, MB_NOTDGI
CP 10
JP NC, MB_NOTDGI
LD E, A
LD A, D
RLCA
RLCA
ADD A, D
RLCA
ADD A, E
LD D, A
JP MB_DISPI
MB_NOTDGI:
PUSH HL
LD HL, MB_DISPED
EX (SP), HL
DEC D
INC D
JP NZ, MB_NTZERD
INC D
MB_NTZERD:
CP 0xd8 ; 8 - '0' - Backspace?
JP Z, MB_BAKED
CP 0x4f ; 0x7F - '0' - DEL?
JP Z, MB_DELED
CP 0xdd ; 13 - '0' - CARRIAGE RETURN
JP Z, MB_CRED
CP 0xf0 ; ' ' - '0' - SPACE
JP Z, MB_SPED
CP 0x31 ; 'A' + 0x20 - '0' - COMMAND IN LOWER CASE?
JP C, MB_NOTLW4
SUB 0x20
MB_NOTLW4:
CP 0x21 ; 'Q' - '0'
JP Z, MB_QED
CP 0x1c ; 'L' - '0'
JP Z, MB_LED
CP 0x23 ; 'S' - '0'
JP Z, MB_SED
CP 0x19 ; 'I' - '0'
JP Z, MB_IED
CP 0x14 ; 'D' - '0'
JP Z, MB_DED
CP 0x13 ; 'C' - '0'
JP Z, MB_CED
CP 0x15 ; 'E'-'0'
JP Z, MB_EED
CP 0x28 ;'X'-'0'
JP Z, MB_XED
CP 0x1b ;'K'-'0'
JP Z, MB_KED
CP 0x18 ;'H'-'0'
JP Z, MB_HED
CP 0x11 ;'A'-'0'
LD A, 0x7
JP NZ, MB_OUTDO
POP BC
POP DE
CALL MB_CRDO
JP MB_EEDITS
MB_SPED:
LD A, (HL)
OR A
RET Z
INC B
CALL MB_OUTCH1
INC HL
DEC D
JP NZ, MB_SPED
RET
MB_KED:
PUSH HL
LD HL, MB_TYPSLH
EX (SP), HL
SCF
MB_SED:
PUSH AF
CALL MB_INCHRI
LD E, A
POP AF
PUSH AF
CALL C, MB_TYPSLH
MB_SRCALP:
LD A, (HL)
OR A
JP Z, MB_POPART
CALL MB_OUTCH1
POP AF
PUSH AF
CALL C, MB_DELCHR
JP C, MB_NOTSRC
INC HL
INC B
MB_NOTSRC:
LD A, (HL)
CP E
JP NZ, MB_SRCALP
DEC D
JP NZ, MB_SRCALP
MB_POPART:
POP AF
RET
MB_LED:
CALL MB_LISPRT
CALL MB_CRDO
POP BC
JP MB_LLED
MB_DED:
LD A, (HL)
OR A
RET Z
LD A, ASCII_BKSL
CALL MB_OUTCH1
MB_DELLP:
LD A, (HL)
OR A
JP Z, MB_TYPSLH
CALL MB_OUTCH1
CALL MB_DELCHR
DEC D
JP NZ, MB_DELLP
MB_TYPSLH:
LD A, ASCII_BKSL
CALL MB_OUTDO
RET
MB_CED:
LD A, (HL)
OR A
RET Z
MB_CED2:
CALL MB_INCHRI
CP ASCII_SP
JP NC, MB_NOTCCC
CP ASCII_LF
JP Z, MB_NOTCCC
CP ASCII_BELL
JP Z, MB_NOTCCC
CP ASCII_TAB
JP Z, MB_NOTCCC
LD A, ASCII_BELL
CALL MB_OUTDO
JP MB_CED2
MB_NOTCCC:
LD (HL), A
CALL MB_OUTCH1
INC HL
INC B
DEC D
JP NZ, MB_CED
RET
MB_HED:
LD (HL), 0x0
LD C, B
MB_XED:
LD D, 0xff
CALL MB_SPED
;NOW FALL INTO INSERT CODE
MB_IED:
CALL MB_INCHRI
CP ASCII_DEL ;DEL key
JP Z, MB_TYPARW
CP ASCII_BKSP
JP Z, MB_TYPAR1
CP ASCII_CR
JP Z, MB_CRED
CP ASCII_ESC
RET Z
CP ASCII_BKSP
JP Z, MB_TYPAR1
CP ASCII_LF
JP Z, MB_NTARRW
CP ASCII_BELL
JP Z, MB_NTARRW
CP ASCII_TAB
JP Z, MB_NTARRW
CP ASCII_SP
JP C, MB_IED
CP '_'
JP NZ, MB_NTARRW
MB_TYPARW:
LD A, '_'
MB_TYPAR1:
DEC B
INC B
JP Z, MB_DINGI
CALL MB_OUTCH1
DEC HL
DEC B
LD DE, MB_IED
PUSH DE
; ===================================================
; DELETE CHAR POINTED TO BY [HL]. CORRECTS C
; ===================================================
MB_DELCHR:
PUSH HL
DEC C
MB_CMPRSS:
LD A, (HL) ;= 44
OR A
SCF
JP Z, MB_POPHRT
INC HL
LD A, (HL)
DEC HL
LD (HL), A ;= 44
INC HL
JP MB_CMPRSS
MB_NTARRW:
PUSH AF
LD A, C
CP 0xff
JP C, MB_OKINS
POP AF
MB_DINGI:
LD A, 0x7
CALL MB_OUTDO
MB_IEDG:
JP MB_IED
MB_OKINS:
SUB B
INC C
INC B
PUSH BC
EX DE, HL
LD L, A
LD H, 0x0
ADD HL, DE
LD B, H
LD C, L
INC HL
CALL MB_BLTUC
POP BC
POP AF
LD (HL), A
CALL MB_OUTCH1
INC HL
JP MB_IEDG
MB_BAKED:
LD A, B
OR A
RET Z
DEC HL
LD A, ASCII_BKSP
CALL MB_OUTCH1
DEC B
DEC D
JP NZ, MB_DELED
RET
MB_DELED:
LD A, B
OR A
RET Z
DEC B
DEC HL
LD A, (HL) ;= 44
CALL MB_OUTCH1
DEC D
JP NZ, MB_DELED
RET
MB_CRED:
CALL MB_LISPRT
MB_EED:
CALL MB_CRDO
POP BC
POP DE
LD A, D
AND E
INC A
;START KRUNCHING AT BUF
MB_EDITRT:
LD HL, MB_BUFMIN ;BUF-1
RET Z
SCF
PUSH AF
INC HL
JP MB_EDENT
MB_QED:
POP BC
POP DE
LD A, D
AND E
INC A
JP Z, MB_FININL
JP MB_READY
MB_PRINUS:
CALL MB_FRMCHK
CALL MB_CHKSTR
CALL MB_SYNCHR
;BYTE_ram_3f00:
DB ';'
;LAB_ram_3f01:
EX DE, HL
LD HL, (MB_FACLO)
JP MB_INIUS
MB_REUSST:
LD A, (MB_FLGINP)
OR A
JP Z, MB_FCERR3
POP DE
EX DE, HL
MB_INIUS:
PUSH HL
XOR A
LD (MB_FLGINP), A
INC A
PUSH AF
PUSH DE
LD B, (HL)
OR B
MB_FCERR3:
JP Z, MB_FCERR
INC HL
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
JP MB_PRCCHR
MB_BGSTRF:
LD E, B
PUSH HL
LD C, 0x2
MB_LPSTRF:
LD A, (HL)
INC HL
CP ASCII_BKSL
JP Z, MB_ISSTRF
CP ASCII_SP
JP NZ, MB_NOSTRF
INC C
DEC B
JP NZ, MB_LPSTRF
MB_NOSTRF:
POP HL
LD B, E
LD A, ASCII_BKSL
MB_NEWUCH:
CALL MB_PLSPRT
CALL MB_OUTDO
MB_PRCCHR:
XOR A
LD E, A
LD D, A
MB_PLSFIN:
CALL MB_PLSPRT
LD D, A
LD A, (HL)
INC HL
CP '!'
JP Z, MB_SMSTRF
CP '#'
JP Z, MB_NUMNUM
CP '&'
JP Z, MB_VARSTR
DEC B
JP Z, MB_REUSIN
CP '+'
LD A, 0x8
JP Z, MB_PLSFIN
DEC HL
LD A, (HL)
INC HL
CP '.'
JP Z, MB_DOTNUM
CP '_'
JP Z, MB_LITCHR
CP ASCII_BKSL
JP Z, MB_BGSTRF
CP (HL)
JP NZ, MB_NEWUCH
CP ASCII_CUR
JP Z, MB_DOLRNM
CP '*'
JP NZ, MB_NEWUCH
LD A, B
INC HL
CP 0x2
JP C, MB_NOTSPC
LD A, (HL)
CP ASCII_CUR
MB_NOTSPC:
LD A, ASCII_SP
JP NZ, MB_SPCNUM
DEC B
INC E
DB 0xFE
MB_DOLRNM:
XOR A
ADD A, 0x10
INC HL
MB_SPCNUM:
INC E
ADD A, D
LD D, A
MB_NUMNUM:
INC E
LD C, 0x0
DEC B
JP Z, MB_ENDNUS
LD A, (HL)
INC HL
CP '.'
JP Z, MB_AFTDOT
CP '#'
JP Z, MB_NUMNUM
CP ','
JP NZ, MB_FINNUM
LD A, D
OR 0x40
LD D, A
JP MB_NUMNUM
MB_DOTNUM:
LD A, (HL)
CP '#'
LD A, '.'
JP NZ, MB_NEWUCH
LD C, 0x1
INC HL
MB_AFTDOT:
INC C
DEC B
JP Z, MB_ENDNUS
LD A, (HL)
INC HL
CP '#'
JP Z, MB_AFTDOT
MB_FINNUM:
PUSH DE
LD DE, MB_NOTSCI
PUSH DE
LD D, H
LD E, L
CP '^'
RET NZ
CP (HL)
RET NZ
INC HL
CP (HL)
RET NZ
INC HL
CP (HL)
RET NZ
INC HL
LD A, B
SUB 0x4
RET C
POP DE
POP DE
LD B, A
INC D
INC HL
DB 0xCA
MB_NOTSCI:
EX DE, HL
POP DE
MB_ENDNUS:
LD A, D
DEC HL
INC E
AND 0x8
JP NZ, MB_ENDNUM
DEC E
LD A, B
LAB_ram_4000:
OR A
LAB_ram_4001:
JP Z, MB_ENDNUM
LD A, (HL)
SUB '-'
JP Z, MB_SGNTRL
CP 0xfe ;'+'-'-' - A TRAILING PLUS?
JP NZ, MB_ENDNUM
LD A, 0x8
MB_SGNTRL:
ADD A, 0x4
ADD A, D
LD D, A
DEC B
MB_ENDNUM:
POP HL
POP AF
JP Z, MB_FLDFIN
PUSH BC
PUSH DE
CALL MB_FRMEVL
POP DE
POP BC
PUSH BC
PUSH HL
LD B, E
LD A, B
ADD A, C
CP 0x19
JP NC, MB_FCERR
LD A, D
OR 0x80
CALL MB_PUFOUT
CALL MB_STROUT
MB_FNSTRF:
POP HL
DEC HL
CALL MB_CHRGTR
SCF
JP Z, MB_CRDNUS
LD (MB_FLGINP), A
CP ';'
JP Z, MB_SEMUSN
CP ','
JP NZ, MB_SNERR
MB_SEMUSN:
CALL MB_CHRGTR
MB_CRDNUS:
POP BC
EX DE, HL
POP HL
PUSH HL
PUSH AF
PUSH DE
LD A, (HL)
SUB B
INC HL
LD D, 0x0
LD E, A
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
ADD HL, DE
MB_CHKUSI:
LD A, B
OR A
JP NZ, MB_PRCCHR
JP MB_FINUSI
MB_REUSIN:
CALL MB_PLSPRT
CALL MB_OUTDO
MB_FINUSI:
POP HL
POP AF
JP NZ, MB_REUSST
MB_FLDFIN:
CALL C, MB_CRDO
EX (SP), HL
CALL MB_FRETM2
POP HL
JP MB_FINPRT
MB_LITCHR:
CALL MB_PLSPRT
DEC B
LD A, (HL)
INC HL
CALL MB_OUTDO
JP MB_CHKUSI
MB_VARSTR:
LD C, 0x0
JP MB_ISSTR1
MB_SMSTRF:
LD C, 0x1
DB 0x3E
MB_ISSTRF:
POP AF
MB_ISSTR1:
DEC B
CALL MB_PLSPRT
POP HL
POP AF
JP Z, MB_FLDFIN
PUSH BC
CALL MB_FRMEVL
CALL MB_CHKSTR
POP BC
PUSH BC
PUSH HL
LD HL, (MB_FACLO)
LD B, C
LD C, 0x0
LD A, B
PUSH AF
LD A, B
OR A
CALL NZ, MB_LEFTUS
CALL MB_STRPRT
LD HL, (MB_FACLO)
POP AF
OR A
JP Z, MB_FNSTRF
SUB (HL)
LD B, A
LD A, ASCII_SP
INC B
MB_UPRTSP:
DEC B
JP Z, MB_FNSTRF
CALL MB_OUTDO
JP MB_UPRTSP
MB_PLSPRT:
PUSH AF
LD A, D
OR A
LD A, '+'
CALL NZ, MB_OUTDO
POP AF
RET
; ===================================================
; BIO BASIC Interpreter I/O routines/WHG/PGA/MBM...
; BIO.MAC
; ===================================================
MB_OUTDO:
PUSH AF
PUSH HL
CALL MB_PTRFILZ
JP NZ, MB_FILOUT
POP HL
MB_LPTCOD:
LD A, (MB_PRTFLG)
OR A
JP Z, MB_TTYCHR
POP AF
PUSH AF
CP ASCII_BKSP
JP NZ, MB_NTBKS2
LD A, (MB_LPTPOS)
SUB 0x1
JP C, MB_OLPTCHR
LD (MB_LPTPOS), A
MB_OLPTCHR:
POP AF
JP MB_LPTCHR
MB_NTBKS2:
CP ASCII_TAB
JP NZ, MB_NOTABL
MB_MORSPL:
LD A, ASCII_SP
CALL MB_OUTDO
LD A, (MB_LPTPOS)
AND 0x7
JP NZ, MB_MORSPL
POP AF
RET
MB_NOTABL:
POP AF
PUSH AF
SUB 0xd
JP Z, MB_ZERLP1
JP C, MB_LPTCH1
LD A, (MB_LPTSIZ) ;= 132
INC A
LD A, (MB_LPTPOS)
JP Z, MB_ZERLPT
PUSH HL
LD HL, MB_LPTSIZ ;= 132
CP (HL) ;= 132
POP HL
CALL Z, MB_PRINTW
MB_ZERLPT:
CP 0xff
JP Z, MB_LPTCH1
INC A
MB_ZERLP1:
LD (MB_LPTPOS), A
MB_LPTCH1:
POP AF
; ------------------------------------------------------
MB_LPTCHR:
PUSH AF
PUSH BC
PUSH DE
PUSH HL
LD C, A
LPTO_ADDR EQU $+1
CALL 0x0000
POP HL
POP DE
POP BC
POP AF
RET
MB_FINLPT:
XOR A
LD (MB_PRTFLG), A
LD A, (MB_LPTPOS)
OR A
RET Z
MB_PRINTW:
LD A, ASCII_CR
CALL MB_LPTCHR
LD A, ASCII_LF
CALL MB_LPTCHR
XOR A
LD (MB_LPTPOS), A
RET
MB_TTYCHR:
LD A, (MB_CNTOFL)
OR A
JP NZ, MB_PPSWRT
POP AF
PUSH BC
PUSH AF
CP ASCII_BKSP
JP NZ, MB_NTBKS1
LD A, (MB_TTYPOS)
OR A
JP Z, MB_MORSPR
DEC A
LD (MB_TTYPOS), A
LD A, ASCII_BKSP
JP MB_TRYOUT
MB_NTBKS1:
CP ASCII_TAB
JP NZ, MB_NOTAB
MB_MORSP:
LD A, ASCII_SP
CALL MB_OUTDO
LD A, (MB_TTYPOS)
AND 0x7
JP NZ, MB_MORSP
MB_MORSPR:
POP AF
POP BC
RET
MB_NOTAB:
CP 0x20
JP C, MB_TRYOUT
LD A, (MB_LINLEN) ;= 80
LD B, A
LD A, (MB_TTYPOS)
INC B
JP Z, MB_INCTPS
DEC B
CP B
CALL Z, MB_CRDO
MB_INCTPS:
CP 0xff
JP Z, MB_TRYOUT
INC A
LD (MB_TTYPOS), A
MB_TRYOUT:
POP AF
POP BC
PUSH AF
POP AF
; --------------------------------------------------
; Print symbol from A via BIOS fn
; --------------------------------------------------
MB_NOPRIN:
PUSH AF
PUSH BC
PUSH DE
PUSH HL
LD C, A
CO_ADDR EQU $+1
CALL 0x0000
POP HL
POP DE
POP BC
POP AF
RET
; --------------------------------------------------
MB_INCHR:
CALL MB_PTRFILZ
JP Z, MB_INCHRI
CALL MB_INDSKC
RET NC
PUSH BC
PUSH DE
PUSH HL
CALL MB_PRGFIN
POP HL
POP DE
POP BC
LD A, (MB_CHNFLG)
OR A
JP NZ, MB_CHNRET
LD A, (MB_LSTFRE)
OR A
JP Z, MB_OU_RDY
LD HL, MB_NEWSTT
PUSH HL
JP MB_RUNC
MB_OU_RDY:
PUSH HL
PUSH BC
PUSH DE
LD HL, MB_OKTXT ;= "OK\r\n"
CALL MB_STROUT
POP DE
POP BC
XOR A
POP HL
RET
MB_INCHRI:
PUSH BC
PUSH DE
PUSH HL
; --------------------------------------------------
; Console Input
; --------------------------------------------------
MB_CONIN:
CI_ADDR EQU $+1
CALL WARM_BOOT
POP HL
POP DE
POP BC
MB_INEXIT:
AND 0x7f
CP 0xf
RET NZ
LD A, (MB_CNTOFL)
OR A
CALL Z, MB_CTROPT
CPL
LD (MB_CNTOFL), A
OR A
JP Z, MB_CTROPT
XOR A
RET
;Put out a carriage return and associated routines
MB_CRDONZ:
LD A, (MB_TTYPOS)
OR A
RET Z
JP MB_CRDO
MB_FININL:
LD (HL), 0x0
LD HL, MB_BUFMIN ;= 44
MB_CRDO:
LD A, ASCII_CR
CALL MB_OUTDO
LD A, ASCII_LF
MB_CRFINO:
CALL MB_OUTDO
MB_CRFIN:
CALL MB_PTRFILZ
JP Z, MB_CRCONT
XOR A
RET
MB_CRCONT:
LD A, (MB_PRTFLG)
OR A
JP Z, MB_NTPRTR
XOR A
LD (MB_LPTPOS), A
RET
MB_NTPRTR:
XOR A
LD (MB_TTYPOS), A
LD A, (MB_NULCNT) ;= 01h
MB_PRTNUL:
DEC A
RET Z
PUSH AF
XOR A
CALL MB_OUTDO
POP AF
JP MB_PRTNUL
MB_ISCNTC:
PUSH BC
PUSH DE
PUSH HL
; --------------------------------------------------
MB_CONSTS:
CTC_ADDR1 EQU $+1
CALL WARM_BOOT
POP HL
POP DE
POP BC
OR A
RET Z
MB_CNTCCN:
CALL MB_INCHRI
CP 0x13
CALL Z, MB_INCHRI
LD (MB_CHARC), A
CP 0x3
CALL Z, MB_CTRLPT
JP MB_STOP
MB_INKEY:
CALL MB_CHRGTR
PUSH HL
CALL MB_CHARCG
JP NZ, MB_BUFCIN
CTC_ADDR3 EQU $+1
CALL 0x0000
OR A
JP Z, MB_NULRT
CALL MB_INCHRI
MB_BUFCIN:
PUSH AF
CALL MB_STRIN1
POP AF
LD E, A
CALL MB_SETSTR
MB_NULRT:
LD HL, MB_OKTXT-1 ;REDDY-1
LD (MB_FACLO), HL
LD A, 0x3
LD (MB_VALTYP), A
POP HL
RET
MB_CHARCG:
LD A, (MB_CHARC)
OR A
RET Z
PUSH AF
XOR A
LD (MB_CHARC), A
POP AF
RET
MB_OUTCH1:
CALL MB_OUTDO
CP ASCII_LF
RET NZ
LD A, ASCII_CR
CALL MB_OUTDO
CALL MB_CRFIN
LD A, ASCII_LF
RET
; ===================================================
; BIMISC.MAC
; ===================================================
;BLOCK TRANSFER ROUTINE
MB_BLTU:
CALL MB_REASON
MB_BLTUC:
PUSH BC
EX (SP), HL
POP BC
MB_BLTLOP:
CALL MB_DCOMPR
LD A, (HL)
LD (BC), A
RET Z
DEC BC
DEC HL
JP MB_BLTLOP
MB_GETSTK:
PUSH HL
LD HL, (MB_MEMSIZ)
LD B, 0x0
ADD HL, BC
ADD HL, BC
LD A, CONS1 ;256-(2*NUMLEV)
SUB L
LD L, A
LD A, 0xff
SBC A, H
LD H, A
JP C, MB_OMERR
ADD HL, SP
POP HL
RET C
; -------------------------------------------------------
MB_OMERR:
LD HL, (MB_TOPMEM)
DEC HL
DEC HL
LD (MB_SAVSTK), HL
MB_OMERRR:
LD DE, ERROM
JP MB_ERROR
; -------------------------------------------------------
MB_REASON:
CALL MB_REALLY
RET NC
PUSH BC
PUSH DE
PUSH HL
CALL MB_GARBA2
POP HL
POP DE
POP BC
CALL MB_REALLY
RET NC
JP MB_OMERRR
MB_REALLY:
PUSH DE
EX DE, HL
LD HL, (MB_FRETOP)
CALL MB_DCOMPR
EX DE, HL
POP DE
RET
MB_NODSKS:
LD A, (MB_MAXFIL)
LD B, A
LD HL, MB_FILPTR
XOR A
INC B
MB_LOPNTO:
LD E, (HL)
INC HL
LD D, (HL)
INC HL
LD (DE), A
DEC B
JP NZ, MB_LOPNTO
CALL MB_CLSALL
XOR A
MB_SCRATH:
RET NZ
; ===================================================
; FUNCTION
; ===================================================
MB_SCRTCH:
LD HL, (MB_TXTTAB) ;= 6040h
CALL MB_TOFF
LD (MB_PROFLG), A
LD (MB_AUTFLG), A
LD (MB_PTRFLG), A
LD (HL), A
INC HL
LD (HL), A
INC HL
LD (MB_VARTAB), HL
; ===================================================
; FUNCTION
; ===================================================
MB_RUNC:
LD HL, (MB_TXTTAB) ;= 6040h
DEC HL
MB_CLEARC:
LD (MB_TEMP), HL
LD A, (MB_MRGFLG)
OR A
JP NZ, MB_LEVDTB
XOR A
LD (MB_OPTFLG), A
LD (MB_OPTVAL), A
;INITIALIZE THE DEFAULT VALTYPE TABLE
LD B, 26
LD HL, MB_DEFTBL
MB_LOPDFT:
LD (HL), 0x4
INC HL
DEC B
JP NZ, MB_LOPDFT
MB_LEVDTB:
LD DE, MB_RNDCOP ;= 82
LD HL, MB_RNDX
CALL MB_MOVE
LD HL, MB_RNDCNT - 1
XOR A
LD (HL), A
INC HL
LD (HL), A
INC HL
LD (HL), A
XOR A
LD (MB_ONEFLG), A
LD L, A
LD H, A
LD (MB_ONELIN), HL
LD (MB_OLDTXT), HL
LD HL, (MB_MEMSIZ)
LD A, (MB_CHNFLG)
OR A
JP NZ, MB_GODFRE
LD (MB_FRETOP), HL
MB_GODFRE:
XOR A
CALL MB_RESTORE
LD HL, (MB_VARTAB)
LD (MB_ARYTAB), HL
LD (MB_STREND), HL
LD A, (MB_MRGFLG)
OR A
CALL Z, MB_CLSALL
MB_STKINI:
POP BC
LD HL, (MB_TOPMEM)
DEC HL
DEC HL
LD (MB_SAVSTK), HL
INC HL
INC HL
MB_STKERR:
LD SP, HL
LD HL, MB_TEMPST
LD (MB_TEMPPT), HL
CALL MB_CLROVC
CALL MB_FINLPT
CALL MB_FINPRT
XOR A
LD H, A
LD L, A
LD (MB_PRMLEN), HL
LD (MB_NOFUNS), A
LD (MB_PRMLN2), HL
LD (MB_FUNACT), HL
LD (MB_PRMSTK), HL
LD (MB_SUBFLG), A
PUSH HL
PUSH BC
MB_GTMPRT:
LD HL, (MB_TEMP)
RET
; ===================================================
MB_DCOMPR:
LD A, H
SUB D
RET NZ
LD A, L
SUB E
RET
; ===================================================
MB_SYNCHR:
LD A, (HL)
EX (SP), HL
CP (HL)
JP NZ, MB_SYNERR
INC HL
EX (SP), HL
INC HL
LD A, (HL)
CP ':'
RET NC
JP MB_CHRCON
MB_SYNERR:
JP MB_SNERR
MB_RESTORE:
EX DE, HL
LD HL, (MB_TXTTAB) ;= 6040h
JP Z, MB_BGNRST
EX DE, HL
CALL MB_LINGET
PUSH HL
CALL MB_FNDLIN
LD H, B
LD L, C
POP DE
JP NC, MB_USERR
MB_BGNRST:
DEC HL
MB_RESFIN:
LD (MB_DATPTR), HL
EX DE, HL
RET
MB_STOP:
RET NZ
MB_STOPRG:
INC A
JP MB_CONSTP
MB_ENDS:
RET NZ
PUSH AF
CALL Z, MB_CLSALL
POP AF
MB_CONSTP:
LD (MB_SAVTXT), HL
LD HL, MB_TEMPST
LD (MB_TEMPPT), HL
DB 21h
MB_STPEND:
OR 0xff
POP BC
MB_ENDCON:
LD HL, (MB_CURLIN) ;= 65534
PUSH HL
PUSH AF
LD A, L
AND H
INC A
JP Z, MB_DIRIS
LD (MB_OLDLIN), HL
LD HL, (MB_SAVTXT)
LD (MB_OLDTXT), HL
MB_DIRIS:
XOR A
LD (MB_CNTOFL), A
CALL MB_FINLPT
CALL MB_CRDONZ
POP AF
LD HL, MB_BRKTXT ;= "Break"
JP NZ, MB_ERRFIN
JP MB_STPRDY
MB_CTROPT:
LD A, CTRL_O
MB_CTRLPT:
PUSH AF
SUB 0x3
JP NZ, MB_NTCTCT
LD (MB_PRTFLG), A
LD (MB_CNTOFL), A
MB_NTCTCT:
LD A, '^'
CALL MB_OUTDO
POP AF
ADD A, 0x40
CALL MB_OUTDO
JP MB_CRDO
MB_CONT:
LD HL, (MB_OLDTXT)
LD A, H
OR L
MB_RESERR:
LD DE, ERRCN
JP Z, MB_ERROR
EX DE, HL
LD HL, (MB_OLDLIN)
EX DE, HL
EX DE, HL
LD (MB_CURLIN), HL ;= 65534
EX DE, HL
RET
MB_NULL:
CALL MB_GETBYT
RET NZ
INC A
LD (MB_NULCNT), A ;= 01h
RET
MB_TON:
DB 0x3E
MB_TOFF:
XOR A
LD (MB_TRCFLG), A
RET
MB_SWAP:
CALL MB_PTRGET
PUSH DE
PUSH HL
LD HL, MB_SWPTMP
CALL MB_VMOVE
LD HL, (MB_ARYTAB)
EX (SP), HL
CALL MB_GETYPR
PUSH AF
CALL MB_SYNCHR
DB ','
CALL MB_PTRGET
POP AF
LD B, A
CALL MB_GETYPR
CP B
JP NZ, MB_TMERR
EX (SP), HL
EX DE, HL
PUSH HL
LD HL, (MB_ARYTAB)
CALL MB_DCOMPR
JP NZ, MB_FCERR1
POP DE
POP HL
EX (SP), HL
PUSH DE
CALL MB_VMOVE
POP HL
LD DE, MB_SWPTMP
CALL MB_VMOVE
POP HL
RET
MB_FCERR1:
JP MB_FCERR
MB_ERASE:
LD A, 0x1
LD (MB_SUBFLG), A
CALL MB_PTRGET
JP NZ, MB_FCERR1
PUSH HL
LD (MB_SUBFLG), A
LD H, B
LD L, C
DEC BC
DEC BC
DEC BC
MB_LPBKNM:
LD A, (BC)
DEC BC
OR A
JP M, MB_LPBKNM
DEC BC
DEC BC
ADD HL, DE
EX DE, HL
LD HL, (MB_STREND)
MB_ERSLOP:
CALL MB_DCOMPR
LD A, (DE)
LD (BC), A
INC DE
INC BC
JP NZ, MB_ERSLOP
DEC BC
LD H, B
LD L, C
LD (MB_STREND), HL
POP HL
LD A, (HL)
CP 0x2c
RET NZ
CALL MB_CHRGTR
JP MB_ERASE
MB_POPAHT:
POP AF
POP HL
RET
MB_ISLET:
LD A, (HL)
MB_ISLET2:
CP 'A'
RET C
CP '['
CCF
RET
MB_CLEARC1:
JP MB_CLEARC
; --------------------------------------------------
MB_CLEAR:
JP Z, MB_CLEARC1
CP ','
JP Z, MB_CSKPCM
CALL MB_INTIDX2
DEC HL
CALL MB_CHRGTR
JP Z, MB_CLEARC1
MB_CSKPCM:
CALL MB_SYNCHR
DB ','
JP Z, MB_CLEARC1
EX DE, HL
LD HL, (MB_TOPMEM) ;= 60A3h
EX DE, HL
CP ','
JP Z, MB_CLEARS
CALL MB_INTID2
MB_CLEARS:
DEC HL
CALL MB_CHRGTR
PUSH DE
JP Z, MB_CDFSTK
CALL MB_SYNCHR
DB ','
JP Z, MB_CDFSTK
CALL MB_INTID2
DEC HL
CALL MB_CHRGTR
JP NZ, MB_SNERR
MB_CLEART:
EX (SP), HL
PUSH HL
LD HL, 0x4e ;0+(2*NUMLEV)+20 - CHECK STACK SIZE IS REASONABLE
CALL MB_DCOMPR
JP NC, MB_OMERR1
POP HL
CALL MB_SUBDE
JP C, MB_OMERR1
PUSH HL
LD HL, (MB_VARTAB)
LD BC, 0x14
ADD HL, BC
CALL MB_DCOMPR
JP NC, MB_OMERR1
EX DE, HL
LD (MB_MEMSIZ), HL
POP HL
LD (MB_TOPMEM), HL ;= 60A3h
POP HL
JP MB_CLEARC1
MB_INTID2:
CALL MB_GETIN22
LD A, D
OR E
JP Z, MB_FCERR
RET
MB_OMERR1:
JP MB_OMERR
MB_CDFSTK:
PUSH HL
LD HL, (MB_TOPMEM) ;TOPMEM
EX DE, HL
LD HL, (MB_MEMSIZ)
LD A, E
SUB L
LD E, A
LD A, D
SBC A, H
LD D, A
POP HL
JP MB_CLEART
MB_SUBDE:
LD A, L
SUB E
LD E, A
LD A, H
SBC A, D
LD D, A
RET
; --------------------------------------------------
; NEXT code
; --------------------------------------------------
MB_NEXT:
PUSH AF
DB 0xF6
MB_NEXTS:
XOR A
LD (MB_NXTFLG), A
POP AF
LD DE, 0x0
MB_NEXTC:
LD (MB_NXTTXT), HL
CALL NZ, MB_PTRGET
LD (MB_TEMP), HL
CALL MB_FNDFOR
JP NZ, MB_NFERR
LD SP, HL
PUSH DE
LD E, (HL)
INC HL
LD D, (HL)
INC HL
PUSH HL
LD HL, (MB_NXTTXT)
CALL MB_DCOMPR
JP NZ, MB_NFERR
POP HL
POP DE
PUSH DE
LD A, (HL)
PUSH AF
INC HL
PUSH DE
LD A, (HL)
INC HL
OR A
JP M, MB_INTNXT
CALL MB_MOVFM
EX (SP), HL
PUSH HL
LD A, (MB_NXTFLG)
OR A
JP NZ, MB_NXTDO
LD HL, MB_FVALSV
CALL MB_MOVFM
XOR A
MB_NXTDO:
CALL NZ, MB_FADDS
POP HL
CALL MB_MOVMF
POP HL
CALL MB_MOVRM
PUSH HL
CALL MB_FCOMP
JP MB_FINNXT
MB_INTNXT:
INC HL
INC HL
INC HL
INC HL
LD C, (HL)
INC HL
LD B, (HL)
INC HL
EX (SP), HL
LD E, (HL)
INC HL
LD D, (HL)
PUSH HL
LD L, C
LD H, B
LD A, (MB_NXTFLG)
OR A
JP NZ, MB_INXTDO
LD HL, (MB_FVALSV)
JP MB_IFORIN
MB_INXTDO:
CALL MB_IADD
LD A, (MB_VALTYP)
CP 0x4
JP Z, MB_OVERR
MB_IFORIN:
EX DE, HL
POP HL
LD (HL), D
DEC HL
LD (HL), E
POP HL
PUSH DE
LD E, (HL)
INC HL
LD D, (HL)
INC HL
EX (SP), HL
CALL MB_ICOMP
MB_FINNXT:
POP HL
POP BC
SUB B
CALL MB_MOVRM
JP Z, MB_LOOPDN
EX DE, HL
LD (MB_CURLIN), HL ;= 65534
LD L, C
LD H, B
JP MB_NXTCON
MB_LOOPDN:
LD SP, HL
LD (MB_SAVSTK), HL
LD HL, (MB_TEMP)
LD A, (HL)
CP 0x2c
JP NZ, MB_NEWSTT
CALL MB_CHRGTR
CALL MB_NEXTC
; --------------------------------------------------
; Chrck MB_PTRFIL for zero value
; --------------------------------------------------
MB_PTRFILZ:
PUSH HL
LD HL, (MB_PTRFIL)
LD A, H
OR L
POP HL
RET
; ===================================================
; BASIC Interpreter String routines/WHG/PGA etc.
; BISTRS.MAC
; ===================================================
; ---------------------------------------------------
;COMPARES TWO STRINGS
; ---------------------------------------------------
MB_STRCMP:
CALL MB_FRESTR
LD A, (HL)
INC HL
LD C, (HL)
INC HL
LD B, (HL)
POP DE
PUSH BC
PUSH AF
CALL MB_FRETMP
POP AF
LD D, A
LD E, (HL)
INC HL
LD C, (HL)
INC HL
LD B, (HL)
POP HL
MB_CSLOOP:
LD A, E
OR D
RET Z
LD A, D
SUB 0x1
RET C
XOR A
CP E
INC A
RET NC
DEC D
DEC E
LD A, (BC)
INC BC
CP (HL)
INC HL
JP Z, MB_CSLOOP
CCF
JP MB_SIGNS
MB_STRO_:
CALL MB_FOUTO
JP MB_STR_1
MB_STRH_:
CALL MB_FOUTH
JP MB_STR_1
MB_STR_:
CALL MB_FOUT
MB_STR_1:
CALL MB_STRLIT
CALL MB_FREFAC
LD BC, MB_FINBCK
PUSH BC
; ===================================================
; FUNCTION
; ===================================================
MB_STRCPY:
;CREATES A COPY OF THE STRING
LD A, (HL)
INC HL
PUSH HL
CALL MB_GETSPA
POP HL
LD C, (HL)
INC HL
LD B, (HL)
CALL MB_STRAD2
PUSH HL
LD L, A
CALL MB_MOVSTR
POP DE
RET
MB_STRIN1:
LD A, 0x1
MB_STRINI:
CALL MB_GETSPA
MB_STRAD2:
LD HL, MB_DSCTMP
MB_STRAD1:
PUSH HL
LD (HL), A
MB_PUTDEI:
INC HL
LD (HL), E
INC HL
LD (HL), D
POP HL
RET
MB_STRLIT:
DEC HL
MB_STRLTI:
LD B, '"'
MB_STRLT3:
LD D, B
MB_STRLT2:
PUSH HL
LD C, 0xff
MB_STRGET:
INC HL
LD A, (HL)
INC C
OR A
JP Z, MB_STRFIN
CP D
JP Z, MB_STRFIN
CP B
JP NZ, MB_STRGET
MB_STRFIN:
CP '"'
CALL Z, MB_CHRGTR
PUSH HL
LD A, B
CP ','
JP NZ, MB_NTTRLS
INC C
MB_LPTRLS:
DEC C
JP Z, MB_NTTRLS
DEC HL
LD A, (HL)
CP ASCII_SP
JP Z, MB_LPTRLS
MB_NTTRLS:
POP HL
EX (SP), HL
INC HL
EX DE, HL
LD A, C
CALL MB_STRAD2
MB_PUTNEW:
LD DE, MB_DSCTMP
DB 0x3E
MB_PUTTMP:
PUSH DE
LD HL, (MB_TEMPPT)
LD (MB_FACLO), HL
LD A, 0x3
LD (MB_VALTYP), A
CALL MB_VMOVE
LD DE, MB_FRETOP
CALL MB_DCOMPR
LD (MB_TEMPPT), HL
POP HL
LD A, (HL)
RET NZ
LD DE, 0x10
JP MB_ERROR
MB_STROUI:
INC HL
MB_STROUT:
CALL MB_STRLIT
MB_STRPRT:
CALL MB_FREFAC
CALL MB_GETBCD
INC D
MB_STRPR2:
DEC D
RET Z
LD A, (BC)
CALL MB_OUTDO
CP ASCII_CR
CALL Z, MB_CRFIN
INC BC
JP MB_STRPR2
; ===================================================
; STRING GARBAGE COLLECTION - GETSPA, GARBAG
; ===================================================
MB_GETSPA:
OR A
DB 0Eh
MB_TRYGI2:
POP AF
PUSH AF
LD HL, (MB_STREND)
EX DE, HL
LD HL, (MB_FRETOP)
CPL
LD C, A
LD B, 0xff
ADD HL, BC
INC HL
CALL MB_DCOMPR
JP C, MB_GARBAG
LD (MB_FRETOP), HL
INC HL
EX DE, HL
MB_PPSWRT:
POP AF
RET
MB_GARBAG:
POP AF
LD DE, 0xe
JP Z, MB_ERROR
CP A
PUSH AF
LD BC, MB_TRYGI2
PUSH BC
MB_GARBA2:
LD HL, (MB_MEMSIZ)
MB_FNDVAR:
LD (MB_FRETOP), HL
LD HL, 0x0
PUSH HL
LD HL, (MB_STREND)
PUSH HL
LD HL, MB_TEMPST
MB_TVAR:
EX DE, HL
LD HL, (MB_TEMPPT)
EX DE, HL
CALL MB_DCOMPR
LD BC, MB_TVAR
JP NZ, MB_DVAR2
LD HL, MB_PRMPRV
LD (MB_TEMP9), HL
LD HL, (MB_ARYTAB)
LD (MB_ARYTA2), HL
LD HL, (MB_VARTAB)
MB_SVAR:
EX DE, HL
LD HL, (MB_ARYTA2)
EX DE, HL
CALL MB_DCOMPR
JP Z, MB_ARYVAR
LD A, (HL)
INC HL
INC HL
INC HL
PUSH AF
CALL MB_IADAHL
POP AF
CP 0x3
JP NZ, MB_SKPVAR
CALL MB_DVARS
XOR A
MB_SKPVAR:
LD E, A
LD D, 0x0
ADD HL, DE
JP MB_SVAR
MB_ARYVAR:
LD HL, (MB_TEMP9)
LD E, (HL)
INC HL
LD D, (HL)
LD A, D
OR E
LD HL, (MB_ARYTAB)
JP Z, MB_ARYVA4
EX DE, HL
LD (MB_TEMP9), HL
INC HL
INC HL
LD E, (HL)
INC HL
LD D, (HL)
INC HL
EX DE, HL
ADD HL, DE
LD (MB_ARYTA2), HL
EX DE, HL
JP MB_SVAR
MB_ARYVA2:
POP BC
MB_ARYVA4:
EX DE, HL
LD HL, (MB_STREND)
EX DE, HL
CALL MB_DCOMPR
JP Z, MB_GRBPAS
LD A, (HL)
INC HL
PUSH AF
INC HL
INC HL
CALL MB_IADAHL
LD C, (HL)
INC HL
LD B, (HL)
INC HL
POP AF
PUSH HL
ADD HL, BC
CP 0x3
JP NZ, MB_ARYVA2
LD (MB_CPMFIL), HL
POP HL
LD C, (HL)
LD B, 0x0
ADD HL, BC
ADD HL, BC
INC HL
MB_ARYSTR:
EX DE, HL
LD HL, (MB_CPMFIL)
EX DE, HL
CALL MB_DCOMPR
JP Z, MB_ARYVA4
LD BC, MB_ARYSTR
MB_DVAR2:
PUSH BC
MB_DVARS:
XOR A
OR (HL)
INC HL
LD E, (HL)
INC HL
LD D, (HL)
INC HL
RET Z
LD B, H
LD C, L
LD HL, (MB_FRETOP)
CALL MB_DCOMPR
LD H, B
LD L, C
RET C
POP HL
EX (SP), HL
CALL MB_DCOMPR
EX (SP), HL
PUSH HL
LD H, B
LD L, C
RET NC
POP BC
POP AF
POP AF
PUSH HL
PUSH DE
PUSH BC
RET
MB_GRBPAS:
POP DE
POP HL
LD A, H
OR L
RET Z
DEC HL
LD B, (HL)
DEC HL
LD C, (HL)
PUSH HL
DEC HL
LD L, (HL)
LD H, 0x0
ADD HL, BC
LD D, B
LD E, C
DEC HL
LD B, H
LD C, L
LD HL, (MB_FRETOP)
CALL MB_BLTUC
POP HL
LD (HL), C
INC HL
LD (HL), B
LD H, B
LD L, C
DEC HL
JP MB_FNDVAR
;STRING CONCATENATION
MB_CAT:
PUSH BC
PUSH HL
LD HL, (MB_FACLO)
EX (SP), HL
CALL MB_EVAL
EX (SP), HL
CALL MB_CHKSTR
LD A, (HL)
PUSH HL
LD HL, (MB_FACLO)
PUSH HL
ADD A, (HL)
LD DE, ERRLS
JP C, MB_ERROR
CALL MB_STRINI
POP DE
CALL MB_FRETMP
EX (SP), HL
CALL MB_FRETM2
PUSH HL
LD HL, (MB_DSCTMP + INCSTR)
EX DE, HL
CALL MB_MOVINS
CALL MB_MOVINS
LD HL, MB_TSTOP
EX (SP), HL
PUSH HL
JP MB_PUTNEW
MB_MOVINS:
POP HL
EX (SP), HL
LD A, (HL)
INC HL
LD C, (HL)
INC HL
LD B, (HL)
LD L, A
MB_MOVSTR:
INC L
MB_MOVLP:
DEC L
RET Z
LD A, (BC)
LD (DE), A
INC BC
INC DE
JP MB_MOVLP
; ===================================================
; FUNCTION
; ===================================================
MB_FRESTR:
;FREE UP STRING TEMPORARY - FRESTR, FREFAC, FRETMP, FRETMS
CALL MB_CHKSTR
MB_FREFAC:
LD HL, (MB_FACLO)
MB_FRETM2:
EX DE, HL
MB_FRETMP:
CALL MB_FRETMS
EX DE, HL
RET NZ
PUSH DE
LD D, B
LD E, C
DEC DE
LD C, (HL)
LD HL, (MB_FRETOP)
CALL MB_DCOMPR
JP NZ, MB_NOTLST
LD B, A
ADD HL, BC
LD (MB_FRETOP), HL
MB_NOTLST:
POP HL
RET
MB_FRETMS:
LD HL, (MB_TEMPPT)
DEC HL
LD B, (HL)
DEC HL
LD C, (HL)
DEC HL
CALL MB_DCOMPR
RET NZ
LD (MB_TEMPPT), HL
RET
; --------------------------------------------------
MB_LEN:
LD BC, MB_SNGFLT
PUSH BC
MB_LEN1:
CALL MB_FRESTR
XOR A
LD D, A
LD A, (HL)
OR A
RET
; --------------------------------------------------
MB_ASC:
LD BC, MB_SNGFLT
PUSH BC
MB_ASC2:
CALL MB_LEN1
JP Z, MB_FCERR
INC HL
LD E, (HL)
INC HL
LD D, (HL)
LD A, (DE)
RET
; --------------------------------------------------
MB_CHR_:
CALL MB_STRIN1
CALL MB_CONINT
; --------------------------------------------------
MB_SETSTR:
LD HL, (MB_DSCTMP+INCSTR)
LD (HL), E
MB_FINBCK:
POP BC
JP MB_PUTNEW
; --------------------------------------------------
MB_STRNG_:
CALL MB_CHRGTR
CALL MB_SYNCHR
DB '('
CALL MB_GETBYT
PUSH DE
CALL MB_SYNCHR
DB ','
CALL MB_FRMEVL
CALL MB_SYNCHR
DB ')'
EX (SP), HL
PUSH HL
CALL MB_GETYPR
JP Z, MB_STRSTR
CALL MB_CONINT
JP MB_CALSPA
MB_STRSTR:
CALL MB_ASC2
MB_CALSPA:
POP DE
CALL MB_SPACE2
MB_SPACE_:
CALL MB_CONINT
LD A, 0x20
MB_SPACE2:
PUSH AF
LD A, E
CALL MB_STRINI
LD B, A
POP AF
INC B
DEC B
JP Z, MB_FINBCK
LD HL, (MB_DSCTMP + INCSTR) ;DSCTMP+INCSTR
MB_SPLP_:
LD (HL), A
INC HL
DEC B
JP NZ, MB_SPLP_
JP MB_FINBCK
MB_LEFT_:
CALL MB_PREAM
XOR A
MB_LEFT3:
EX (SP), HL
LD C, A
DB '>'
MB_LEFTUS:
PUSH HL
MB_LEFT2:
PUSH HL
LD A, (HL)
CP B
JP C, MB_ALLSTR
LD A, B
DB 11h
MB_ALLSTR:
LD C, 0x0
PUSH BC
CALL MB_GETSPA
POP BC
POP HL
PUSH HL
INC HL
LD B, (HL)
INC HL
LD H, (HL)
LD L, B
LD B, 0x0
ADD HL, BC
LD B, H
LD C, L
CALL MB_STRAD2
LD L, A
CALL MB_MOVSTR
POP DE
CALL MB_FRETMP
JP MB_PUTNEW
MB_RIGHT_:
CALL MB_PREAM
POP DE
PUSH DE
LD A, (DE)
SUB B
JP MB_LEFT3
MB_MID_:
EX DE, HL
LD A, (HL)
CALL MB_PREAM2
INC B
DEC B
JP Z, MB_FCERR
PUSH BC
CALL MB_MIDRST
POP AF
EX (SP), HL
LD BC, MB_LEFT2
PUSH BC
DEC A
CP (HL)
LD B, 0x0
RET NC
LD C, A
LD A, (HL)
SUB C
CP E
LD B, A
RET C
LD B, E
RET
MB_VAL:
CALL MB_LEN1
JP Z, MB_SNGFLT
LD E, A
INC HL
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
PUSH HL
ADD HL, DE
LD B, (HL)
LD (HL), D
EX (SP), HL
PUSH BC
DEC HL
CALL MB_CHRGTR
CALL MB_FINDBL
POP BC
POP HL
LD (HL), B
RET
MB_PREAM:
EX DE, HL
CALL MB_SYNCHR
DB ')'
MB_PREAM2:
POP BC
POP DE
PUSH BC
LD B, E
RET
MB_INSTR:
CALL MB_CHRGTR
CALL MB_FRMPRN
CALL MB_GETYPR
LD A, 0x1
PUSH AF
JP Z, MB_WUZSTR
POP AF
CALL MB_CONINT
OR A
JP Z, MB_FCERR
PUSH AF
CALL MB_SYNCHR
DB ','
CALL MB_FRMEVL
CALL MB_CHKSTR
MB_WUZSTR:
CALL MB_SYNCHR
DB ','
PUSH HL
LD HL, (MB_FACLO)
EX (SP), HL
CALL MB_FRMEVL
CALL MB_SYNCHR
DB ')'
PUSH HL
CALL MB_FRESTR
EX DE, HL
POP BC
POP HL
POP AF
PUSH BC
LD BC, MB_POPHRT
PUSH BC
LD BC, MB_SNGFLT
PUSH BC
PUSH AF
PUSH DE
CALL MB_FRETM2
POP DE
POP AF
LD B, A
DEC A
LD C, A
CP (HL)
LD A, 0x0
RET NC
LD A, (DE)
OR A
LD A, B
RET Z
LD A, (HL)
INC HL
LD B, (HL)
INC HL
LD H, (HL)
LD L, B
LD B, 0x0
ADD HL, BC
SUB C
LD B, A
PUSH BC
PUSH DE
EX (SP), HL
LD C, (HL)
INC HL
LD E, (HL)
INC HL
MB_CHK0:
LD D, (HL)
POP HL
MB_CHK1:
PUSH HL
PUSH DE
PUSH BC
MB_CHK:
LD A, (DE)
CP (HL)
JP NZ, MB_OHWELL
INC DE
DEC C
JP Z, MB_GOTSTR
INC HL
DEC B
JP NZ, MB_CHK
MB_RETZER:
POP DE
POP DE
POP BC
MB_RETZR1:
POP DE
XOR A
RET
MB_GOTSTR:
POP HL
POP DE
POP DE
POP BC
LD A, B
SUB H
ADD A, C
INC A
RET
MB_OHWELL:
POP BC
POP DE
POP HL
INC HL
DEC B
JP NZ, MB_CHK1
JP MB_RETZR1
MB_MIDFN:
CALL MB_SYNCHR
DB '('
CALL MB_PTRGET
CALL MB_CHKSTR
PUSH HL
PUSH DE
EX DE, HL
INC HL
LD E, (HL)
INC HL
LD D, (HL)
LD HL, (MB_STREND)
CALL MB_DCOMPR
JP C, MB_NCPMID
LD HL, (MB_TXTTAB) ;= 6040h
CALL MB_DCOMPR
JP NC, MB_NCPMID
POP HL
PUSH HL
CALL MB_STRCPY
POP HL
PUSH HL
CALL MB_VMOVE
MB_NCPMID:
POP HL
EX (SP), HL
CALL MB_SYNCHR
DB ','
CALL MB_GETBYT
OR A
JP Z, MB_FCERR
PUSH AF
LD A, (HL)
CALL MB_MIDRST
PUSH DE
CALL MB_FRMEQL
PUSH HL
CALL MB_FRESTR
EX DE, HL
POP HL
POP BC
POP AF
LD B, A
EX (SP), HL
PUSH HL
LD HL, MB_POPHRT
EX (SP), HL
LD A, C
OR A
RET Z
LD A, (HL)
SUB B
JP C, MB_FCERR
INC A
CP C
JP C, MB_BIGLEN
LD A, C
MB_BIGLEN:
LD C, B
DEC C
LD B, 0x0
PUSH DE
INC HL
LD E, (HL)
INC HL
LD H, (HL)
LD L, E
ADD HL, BC
LD B, A
POP DE
EX DE, HL
LD C, (HL)
INC HL
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
EX DE, HL
LD A, C
OR A
RET Z
MB_MID_LP:
LD A, (DE)
LD (HL), A
INC DE
INC HL
DEC C
RET Z
DEC B
JP NZ, MB_MID_LP
RET
MB_MIDRST:
LD E, 0xff
CP ')'
JP Z, MB_MID2
CALL MB_SYNCHR
DB ','
CALL MB_GETBYT
MB_MID2:
CALL MB_SYNCHR
DB ')'
RET
MB_FRE:
CALL MB_GETYPR
JP NZ, MB_CLCDIF
CALL MB_FREFAC
CALL MB_GARBA2
MB_CLCDIF:
EX DE, HL
LD HL, (MB_STREND)
EX DE, HL
LD HL, (MB_FRETOP)
JP MB_GIVDBL
; ===================================================
; INLIN BASIC Interpreter Input Line routine/WHG/PGA/MBM, etc.
; BINLIN.MAC
; ===================================================
MB_QINLIN:
LD A, '?'
CALL MB_OUTDO
LD A, ASCII_SP
CALL MB_OUTDO
JP MB_INLIN
MB_INLINC:
CALL MB_INCHR
CP 0x1
JP NZ, MB_INLNC1
LD (HL), 0x0
JP MB_INLED1
MB_INLINQ:
LD (HL), B
MB_INLIN:
XOR A
LD (MB_CHARC), A
XOR A
LD (MB_TEMPA), A
MB_SINLIN:
CALL MB_INCHR
CP 0x1
JP NZ, MB_INLINS
MB_INLED1:
CALL MB_CRDO
LD HL, 0xffff
JP MB_INLED
MB_RUBOUT:
LD A, (MB_RUBSW)
OR A
LD A, ASCII_BKSL
LD (MB_RUBSW), A
JP NZ, MB_NOTBEG
DEC B
JP Z, MB_INLINQ
CALL MB_OUTDO
INC B
MB_NOTBEG:
DEC B
DEC HL
JP Z, MB_INLINN
LD A, (HL) ;= 44
CALL MB_OUTDO
JP MB_INLINC
DEC B
MB_LINLN2:
DEC HL
CALL MB_OUTDO
JP NZ, MB_INLINC
MB_INLINN:
CALL MB_OUTDO
CALL MB_CRDO
MB_INLINS:
LD HL, MB_BUF
LD B, 0x1
PUSH AF
XOR A
LD (MB_RUBSW), A
POP AF
MB_INLNC1:
LD C, A
CP 0x7f
JP Z, MB_RUBOUT
LD A, (MB_RUBSW)
OR A
JP Z, MB_NOTRUB
LD A, ASCII_BKSL
CALL MB_OUTDO
XOR A
LD (MB_RUBSW), A
MB_NOTRUB:
LD A, C
CP ASCII_BELL
JP Z, MB_GOODCH
CP CTRL_C
CALL Z, MB_CTRLPT
SCF
RET Z
CP ASCII_CR
JP Z, MB_GFNINL
CP ASCII_TAB
JP Z, MB_GOODCH
CP ASCII_LF
JP NZ, MB_CHKFUN
DEC B
JP Z, MB_INLIN
INC B
JP MB_GOODCH
MB_CHKFUN:
CP CTRL_U ;LINE DELETE? (CONTROL-U)
CALL Z, MB_CTRLPT
JP Z, MB_INLIN
CP ASCII_BKSP
JP NZ, MB_NTBKSP
DEC B
JP Z, MB_SINLIN
CALL MB_OUTDO
LD A, ASCII_SP
CALL MB_OUTDO
LD A, ASCII_BKSP
JP MB_LINLN2
MB_NTBKSP:
CP CTRL_X ;IS IT CONTROL-X (LINE DELETE)
JP NZ, MB_NTCTLX
LD A, '#'
JP MB_INLINN
MB_NTCTLX:
CP CTRL_R
JP NZ, MB_NTCTLR
PUSH BC
PUSH DE
PUSH HL
LD (HL), 0x0
CALL MB_CRDO
LD HL, MB_BUF
CALL MB_LISPRT
POP HL
POP DE
POP BC
JP MB_INLINC
MB_NTCTLR:
CP ASCII_SP
JP C, MB_INLINC
MB_GOODCH:
LD A, B
OR A
JP NZ, MB_OUTBND
PUSH HL
LD HL, (MB_PTRFIL)
LD A, H
OR L
POP HL
LD A, 0x7
JP Z, MB_OUTBEL
LD HL, MB_BUF
CALL MB_LINGET
EX DE, HL
LD (MB_CURLIN), HL ;= 65534
JP MB_LBOERR
MB_OUTBND:
LD A, C
LD (HL), C
INC HL
INC B
MB_OUTBEL:
CALL MB_OUTDO
SUB 10
JP NZ, MB_INLINC
LD (MB_TTYPOS), A
LD A, ASCII_CR
CALL MB_OUTDO
MB_EATNUL:
CALL MB_INCHR
OR A
JP Z, MB_EATNUL
CP ASCII_CR
JP Z, MB_INLINC
JP MB_INLNC1
MB_GFNINL:
LD A, (MB_TEMPA)
OR A
JP Z, MB_FININL
XOR A
LD (HL), A
LD HL, MB_BUFMIN ;= 44
RET
; ===================================================
; FIVEO 5.0 Features -WHILE/WEND, CALL, CHAIN, WRITE /P. Allen
; FIVEO.MAK
; ===================================================
;THIS CODE HANDLES THE STATEMENTS WHILE/WEND
MB_SCNSEM:
PUSH AF
LD A, 0x0
LD (MB_TEMPA), A
POP AF
CP 0x3b
RET NZ
LD (MB_TEMPA), A
JP MB_CHRGTR
MB_WHILE:
LD (MB_ENDFOR), HL
CALL MB_WNDSCN
CALL MB_CHRGTR
EX DE, HL
CALL MB_FNDWND
INC SP
INC SP
JP NZ, MB_WNOTOL
ADD HL, BC
LD SP, HL
LD (MB_SAVSTK), HL
MB_WNOTOL:
LD HL, (MB_CURLIN) ;= 65534
PUSH HL
LD HL, (MB_ENDFOR)
PUSH HL
PUSH DE
JP MB_FNWEND
MB_WEND:
JP NZ, MB_SNERR
EX DE, HL
CALL MB_FNDWND
JP NZ, MB_WEERR
LD SP, HL
LD (MB_SAVSTK), HL
EX DE, HL
LD HL, (MB_CURLIN) ;= 65534
EX DE, HL
EX DE, HL
LD (MB_NXTLIN), HL
EX DE, HL
INC HL
INC HL
LD E, (HL)
INC HL
LD D, (HL)
INC HL
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
LD (MB_CURLIN), HL ;= 65534
EX DE, HL
MB_FNWEND:
CALL MB_FRMEVL
PUSH HL
CALL MB_VSIGN
POP HL
JP Z, MB_FLSWHL
LD BC, _WHILE
LD B, C
PUSH BC
INC SP
JP MB_NEWSTT
MB_FLSWHL:
LD HL, (MB_NXTLIN)
LD (MB_CURLIN), HL ;= 65534
POP HL
POP BC
POP BC
JP MB_NEWSTT
MB_FNDWND:
LD HL, 0x4
ADD HL, SP
MB_FNDWN2:
LD A, (HL)
INC HL
LD BC, _FOR
CP C
JP NZ, MB_FNDWN3
LD BC, 0x10
ADD HL, BC
JP MB_FNDWN2
MB_FNDWN3:
LD BC, _WHILE
CP C
RET NZ
PUSH HL
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
CALL MB_DCOMPR
POP HL
LD BC, WHLSIZ
RET Z
ADD HL, BC
JP MB_FNDWN2
MB_WEERR:
LD DE, ERRWE
JP MB_ERROR
;CALL <simple var>[(<simple var>[, <simple var>]..)]
MB_CALLS:
LD A, 0x80
LD (MB_SUBFLG), A
CALL MB_PTRGET
PUSH HL
EX DE, HL
CALL MB_GETYPR
CALL MB_VMOVFM
CALL MB_FRQINT
LD (MB_TEMPA), HL
LD C, MAXPRM
CALL MB_GETSTK
POP DE
LD HL, 0xffc0 ;0-2*MAXPRM - Get space on stack for parms
ADD HL, SP
LD SP, HL
EX DE, HL
LD C, MAXPRM
DEC HL
CALL MB_CHRGTR
LD (MB_TEMP), HL
JP Z, MB_CALLST
CALL MB_SYNCHR
DB '('
MB_GETPAR:
PUSH BC
PUSH DE
CALL MB_PTRGET
EX (SP), HL
LD (HL), E
INC HL
LD (HL), D
INC HL
EX (SP), HL
POP DE
POP BC
LD A, (HL)
CP ','
JP NZ, MB_ENDPAR
DEC C
CALL MB_CHRGTR
JP MB_GETPAR
MB_ENDPAR:
CALL MB_SYNCHR
DB ')'
LD (MB_TEMP), HL
LD A, MAXPRM+1
SUB C
POP HL
DEC A
JP Z, MB_CALLST
POP DE
DEC A
JP Z, MB_CALLST
POP BC
DEC A
JP Z, MB_CALLST
PUSH BC
PUSH HL
LD HL, 0x2 ;Point to rest of parm list
ADD HL, SP
LD B, H
LD C, L
POP HL
MB_CALLST:
PUSH HL
LD HL, MB_CALLRT
EX (SP), HL
PUSH HL
LD HL, (MB_TEMPA)
EX (SP), HL
RET
MB_CALLRT:
LD HL, (MB_SAVSTK)
LD SP, HL
LD HL, (MB_TEMP)
JP MB_NEWSTT
MB_CHAIN:
XOR A
LD (MB_MRGFLG), A
LD (MB_MDLFLG), A
LD A, (HL)
LD DE, _MERGE
CP E
JP NZ, MB_NTCHNM
LD (MB_MRGFLG), A
INC HL
MB_NTCHNM:
DEC HL
CALL MB_CHRGTR
CALL MB_PRGFLI
PUSH HL
LD HL, 0x0
LD (MB_CHNLIN), HL
POP HL
DEC HL
CALL MB_CHRGTR
JP Z, MB_NTCHAL
CALL MB_SYNCHR
DB ','
CP ','
JP Z, MB_NTLINF
CALL MB_FRMEVL
PUSH HL
CALL MB_FRQINT
LD (MB_CHNLIN), HL
POP HL
DEC HL
CALL MB_CHRGTR
JP Z, MB_NTCHAL
MB_NTLINF:
CALL MB_SYNCHR
DB ','
LD DE, _DELETE
CP E
JP Z, MB_CHMWDL
CALL MB_SYNCHR
DB 'A'
CALL MB_SYNCHR
DB 'L'
CALL MB_SYNCHR
DB 'L'
JP Z, MB_DNCMDA
CALL MB_SYNCHR
DB ','
CP E
JP NZ, MB_SNERR
OR A
MB_CHMWDL:
PUSH AF
LD (MB_MDLFLG), A
CALL MB_CHRGTR
CALL MB_SCNLIN
PUSH BC
CALL MB_DEPTR
POP BC
POP DE
PUSH BC
LD H, B
LD L, C
LD (MB_CMSPTR), HL
CALL MB_FNDLIN
JP NC, MB_FCERRG1
LD D, H
LD E, L
LD (MB_CMEPTR), HL
POP HL
CALL MB_DCOMPR
MB_FCERRG1:
JP NC, MB_FCERR
POP AF
JP NZ, MB_DNCMDA
MB_NTCHAL:
LD HL, (MB_CURLIN) ;= 65534
PUSH HL
LD HL, (MB_TXTTAB) ;= 6040h
DEC HL
MB_CLPSC1:
INC HL
MB_CLPSCN:
LD A, (HL)
INC HL
OR (HL)
JP Z, MB_CLPFIN_0
INC HL
LD E, (HL)
INC HL
LD D, (HL)
EX DE, HL
LD (MB_CURLIN), HL ;= 65534
EX DE, HL
MB_CSTSCN:
CALL MB_CHRGTR
MB_AFTCOM:
OR A
JP Z, MB_CLPSC1
CP ':'
JP Z, MB_CSTSCN
LD DE, _COMMON ;Test for COMMON, avoid byte externals
CP E
JP Z, MB_DOCOMM
CALL MB_CHRGTR
CALL MB_DATAS
DEC HL
JP MB_CSTSCN
MB_DOCOMM:
CALL MB_CHRGTR
JP Z, MB_AFTCOM
MB_NXTCOM:
PUSH HL
LD A, 0x1
LD (MB_SUBFLG), A
CALL MB_NVRFIL
JP Z, MB_FNDAAY
LD A, B
OR 0x80
LD B, A
XOR A
CALL MB_ERSFIN
LD A, 0x0
LD (MB_SUBFLG), A
JP NZ, MB_NTFN2T
LD A, (HL)
CP '('
JP NZ, MB_SCNSMP
POP AF
JP MB_COMADY
MB_NTFN2T:
LD A, (HL)
CP '('
JP Z, MB_FCERR
MB_SCNSMP:
POP HL
CALL MB_NVRFIL
MB_COMPTR:
LD A, D
OR E
JP NZ, MB_COMFNS
LD A, B
OR 0x80
LD B, A
LD DE, MB_COMPT2
PUSH DE
LD DE, MB_FILRET
PUSH DE
LD A, (MB_VALTYP)
LD D, A
JP MB_NOARYS
MB_COMPT2:
LD A, D
OR E
JP Z, MB_FCERR
MB_COMFNS:
PUSH HL
LD B, D
LD C, E
LD HL, MB_BCKUCM
PUSH HL
MB_CBAKBL:
DEC BC
MB_LPBKNC:
LD A, (BC)
DEC BC
OR A
JP M, MB_LPBKNC
LD A, (BC)
OR 0x80
LD (BC), A
RET
MB_FNDAAY:
LD (MB_SUBFLG), A
LD A, (HL)
CP 0x28
JP NZ, MB_SCNSMP
EX (SP), HL
MB_BAKCOM:
DEC BC
DEC BC
CALL MB_CBAKBL
MB_BCKUCM:
POP HL
DEC HL
CALL MB_CHRGTR
JP Z, MB_AFTCOM
CP '('
JP NZ, MB_CHKCST
MB_COMADY:
CALL MB_CHRGTR
CALL MB_SYNCHR
DB ')'
JP Z, MB_AFTCOM
MB_CHKCST:
CALL MB_SYNCHR
DB ','
JP MB_NXTCOM
MB_CLPFIN_0:
POP HL
LD (MB_CURLIN), HL ;= 65534
EX DE, HL
MB_CLPFIN_1:
LD HL, (MB_ARYTAB)
EX DE, HL
LD HL, (MB_VARTAB)
MB_CLPSLP:
CALL MB_DCOMPR
JP Z, MB_DNCMDS
PUSH HL
LD C, (HL)
INC HL
INC HL
LD A, (HL)
OR A
PUSH AF
AND 0x7f
LD (HL), A
INC HL
CALL MB_IADAHL
LD B, 0x0
ADD HL, BC
POP AF
POP BC
JP M, MB_CLPSLP
PUSH BC
CALL MB_VARDLS
LD HL, (MB_ARYTAB)
ADD HL, DE
LD (MB_ARYTAB), HL
EX DE, HL
POP HL
JP MB_CLPSLP
MB_VARDLS:
EX DE, HL
LD HL, (MB_STREND)
MB_DLSVLP:
CALL MB_DCOMPR
LD A, (DE)
LD (BC), A
INC DE
INC BC
JP NZ, MB_DLSVLP
LD A, C
SUB L
LD E, A
LD A, B
SBC A, H
LD D, A
DEC DE
DEC BC
LD H, B
LD L, C
LD (MB_STREND), HL
RET
MB_DNCMDS:
EX DE, HL
LD HL, (MB_STREND)
EX DE, HL
MB_CLPAKP:
CALL MB_DCOMPR
JP Z, MB_DNCMDA
PUSH HL
INC HL
INC HL
LD A, (HL)
OR A
PUSH AF
AND 0x7f
LD (HL), A
INC HL
CALL MB_IADAHL
LD C, (HL)
INC HL
LD B, (HL)
INC HL
ADD HL, BC
POP AF
POP BC
JP M, MB_CLPAKP
PUSH BC
CALL MB_VARDLS
EX DE, HL
POP HL
JP MB_CLPAKP
MB_DNCMDA:
LD HL, (MB_VARTAB)
MB_CSVAR:
EX DE, HL
LD HL, (MB_ARYTAB)
EX DE, HL
CALL MB_DCOMPR
JP Z, MB_CAYVAR
LD A, (HL)
INC HL
INC HL
INC HL
PUSH AF
CALL MB_IADAHL
POP AF
CP 0x3
JP NZ, MB_CSKPVA
CALL MB_CDVARS
XOR A
MB_CSKPVA:
LD E, A
LD D, 0x0
ADD HL, DE
JP MB_CSVAR
MB_CAYVA2:
POP BC
MB_CAYVAR:
EX DE, HL
LD HL, (MB_STREND)
EX DE, HL
CALL MB_DCOMPR
JP Z, MB_DNCCLS
LD A, (HL)
INC HL
INC HL
PUSH AF
INC HL
CALL MB_IADAHL
LD C, (HL)
INC HL
LD B, (HL)
INC HL
POP AF
PUSH HL
ADD HL, BC
CP 0x3
JP NZ, MB_CAYVA2
LD (MB_TEMP3), HL
POP HL
LD C, (HL)
LD B, 0x0
ADD HL, BC
ADD HL, BC
INC HL
MB_CAYSTR:
EX DE, HL
LD HL, (MB_TEMP3)
EX DE, HL
CALL MB_DCOMPR
JP Z, MB_CAYVAR
LD BC, MB_CAYSTR
PUSH BC
MB_CDVARS:
LD A, (HL)
INC HL
LD E, (HL)
INC HL
LD D, (HL)
INC HL
OR A
LAB_ram_4fb5:
RET Z
LAB_ram_4fb6:
PUSH HL
LD HL, (MB_VARTAB)
CALL MB_DCOMPR
POP HL
MB_LBL_4FBE:
RET C
MB_LBL_4FBF:
PUSH HL
LD HL, (MB_TXTTAB) ;= 6040h
CALL MB_DCOMPR
POP HL
RET NC
PUSH HL
DEC HL
DEC HL
DEC HL
PUSH HL
CALL MB_STRCPY
POP HL
LD B, 0x3
CALL MB_MOVE1
POP HL
RET
MB_DNCCLS:
CALL MB_GARBA2
LD HL, (MB_STREND)
LD B, H
LD C, L
EX DE, HL
LD HL, (MB_VARTAB)
EX DE, HL
LD HL, (MB_ARYTAB)
LD A, L
SUB E
LD L, A
LD A, H
SBC A, D
LD H, A
LD (MB_TEMP9), HL
LD HL, (MB_FRETOP)
LD (MB_SAVFRE), HL
CALL MB_BLTUC
LD H, B
LD L, C
DEC HL
LD (MB_FRETOP), HL
LD A, (MB_MDLFLG)
OR A
JP Z, MB_NTMDLT
LD HL, (MB_CMSPTR)
LD B, H
LD C, L
LD HL, (MB_CMEPTR)
CALL MB_DEL
LD (MB_ARYTAB), HL
LD (MB_STREND), HL
CALL MB_LINKER
MB_NTMDLT:
LD A, 0x1
LD (MB_CHNFLG), A
LD A, (MB_MRGFLG)
OR A
JP NZ, MB_OKGETM
LD A, (MB_MAXFIL)
LD (MB_LSTFRE+1), A
JP MB_CHNENT
MB_CHNRET:
XOR A
LD (MB_CHNFLG), A
LD (MB_MRGFLG), A
LD HL, (MB_VARTAB)
LD B, H
LD C, L
LD HL, (MB_TEMP9)
ADD HL, BC
LD (MB_ARYTAB), HL
LD HL, (MB_FRETOP)
INC HL
EX DE, HL
LD HL, (MB_SAVFRE)
LD (MB_FRETOP), HL
MB_MVBKVR:
CALL MB_DCOMPR
LD A, (DE)
LD (BC), A
INC DE
INC BC
JP NZ, MB_MVBKVR
DEC BC
LD H, B
LD L, C
LD (MB_STREND), HL
EX DE, HL
LD HL, (MB_CHNLIN)
EX DE, HL
LD HL, (MB_TXTTAB) ;= 6040h
DEC HL
LD A, D
OR E
JP Z, MB_NEWSTT
CALL MB_FNDLIN
JP NC, MB_USERR
DEC BC
LD H, B
LD L, C
JP MB_NEWSTT
JP MB_DATAS
MB_WRITE:
LD C, MD.SQO
CALL MB_FILGET
MB_WRTCHR:
DEC HL
CALL MB_CHRGTR
JP Z, MB_WRTFIN
MB_WRTMLP:
CALL MB_FRMEVL
PUSH HL
CALL MB_GETYPR
JP Z, MB_WRTSTR
CALL MB_FOUT
CALL MB_STRLIT
LD HL, (MB_FACLO)
INC HL
LD E, (HL)
INC HL
LD D, (HL)
LD A, (DE)
CP 0x20
JP NZ, MB_WRTNEG
INC DE
LD (HL), D
DEC HL
LD (HL), E
DEC HL
DEC (HL)
MB_WRTNEG:
CALL MB_STRPRT
MB_NXTWRV:
POP HL
DEC HL
CALL MB_CHRGTR
JP Z, MB_WRTFIN
CP ';'
JP Z, MB_WASEMI
CALL MB_SYNCHR
DB ','
DEC HL
MB_WASEMI:
CALL MB_CHRGTR
LD A, ','
CALL MB_OUTDO
JP MB_WRTMLP
MB_WRTSTR:
LD A, '"'
CALL MB_OUTDO
CALL MB_STRPRT
LD A, '"'
CALL MB_OUTDO
JP MB_NXTWRV
MB_WRTFIN:
PUSH HL
LD HL, (MB_PTRFIL)
LD A, H
OR L
JP Z, MB_NTRNDW
LD A, (HL)
CP 0x3
JP NZ, MB_NTRNDW
CALL MB_CMPFBC
LD A, L
SUB E
LD L, A
LD A, H
SBC A, D
LD H, A
LD DE, 0xfffe
ADD HL, DE
JP NC, MB_NTRNDW
MB_NXTWSP:
LD A, ASCII_SP
CALL MB_OUTDO
DEC HL
LD A, H
OR L
JP NZ, MB_NXTWSP
MB_NTRNDW:
POP HL
CALL MB_CRDO
JP MB_FINPRT
; ===================================================
; COMMON ROUTINES FOR DISK BASICS
; DSKCOM.MAK
; ===================================================
;FILINP AND FILGET - SCAN A FILE NUMBER AND SETUP PTRFIL
MB_FILINP:
LD C, 0x1
MB_FILGET:
CP '#'
RET NZ
PUSH BC
CALL MB_FILSCN
POP DE
CP E
JP Z, MB_GDFILM
CP MD.RND
JP NZ, MB_ERBFM
MB_GDFILM:
CALL MB_SYNCHR
DB ','
; ===================================================
; FUNCTION
; ===================================================
MB_FILSET:
LD D, B
LD E, C
EX DE, HL
LD (MB_PTRFIL), HL
EX DE, HL
RET
; ===================================================
; FUNCTION
; ===================================================
MB_FILSCN:
DEC HL
CALL MB_CHRGTR
CP '#'
CALL Z, MB_CHRGTR
CALL MB_FRMEVL
MB_FILFRM:
CALL MB_CONINT
MB_FILIDX:
LD E, A
MB_FILID2:
LD A, (MB_MAXFIL)
CP E
JP C, MB_ERBFN
LD D, 0x0
PUSH HL
LD HL, MB_FILPTR
ADD HL, DE
ADD HL, DE
LD C, (HL)
INC HL
LD B, (HL)
LD A, (BC)
OR A
POP HL
RET
; --------------------------------------------------
MB_GETPTR:
CALL MB_FILID2
LD HL, DATOFS
CP MD.RND
JP NZ, MB_NTFIVD
LD HL, FD.DAT
MB_NTFIVD:
ADD HL, BC
EX DE, HL
RET
MB_MKI_:
LD A, 0x2
DB 1
MB_MKS_:
LD A, 0x4
DB 1
MB_MKD_:
LD A, 0x8
PUSH AF
CALL MB_DOCNVF
POP AF
CALL MB_STRINI
LD HL, (MB_DSCTMP + INCSTR)
CALL MB_VMOVMF
JP MB_FINBCK
MB_CVI:
LD A, 1
DB 1
MB_CVS:
LD A, 3
DB 1
MB_CVD:
LD A, 7
PUSH AF
CALL MB_FRESTR
POP AF
CP (HL)
JP NC, MB_FCERR
INC A
LD (MB_VALTYP), A
INC HL
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
JP MB_VMOVFM
; --------------------------------------------------
MB_FILIND:
CALL MB_GETYPR
LD BC, MB_DOASIG
LD DE, CON1 ; TERMINATORS: SPACE + COMMA
JP NZ, MB_INPDOR
LD E, D
JP MB_INPDOR
; --------------------------------------------------
MB_DLINE:
CALL MB_FILINP
CALL MB_PTRGET
CALL MB_CHKSTR
LD BC, MB_FINPRT
PUSH BC
PUSH DE
LD BC, MB_LETCON
XOR A
LD D, A
LD E, A
MB_INPDOR:
PUSH AF
PUSH BC
PUSH HL
MB_NOTNWT:
CALL MB_INDSKC
JP C, MB_ERRPE
CP ASCII_SP
JP NZ, MB_NOTSPC1
INC D
DEC D
JP NZ, MB_NOTNWT
; --------------------------------------------------
MB_NOTSPC1:
CP '"'
JP NZ, MB_NOTQTE
LD B, A
LD A, E
CP ','
LD A, B
JP NZ, MB_NOTQTE
LD D, B
LD E, B
CALL MB_INDSKC
JP C, MB_QUITSI
MB_NOTQTE:
LD HL, MB_BUF
LD B, 0xff
MB_LOPCRS:
LD C, A
LD A, D
CP '"'
LD A, C
JP Z, MB_NOTQTL
CP ASCII_CR
PUSH HL
JP Z, MB_ICASLF
POP HL
CP ASCII_LF
JP NZ, MB_NOTQTL
LD C, A
LD A, E
CP ','
LD A, C
CALL NZ, MB_STRCHR
CALL MB_INDSKC
JP C, MB_QUITSI
CP ASCII_CR
JP NZ, MB_NOTQTL
LD A, E
CP ASCII_SP
JP Z, MB_LPCRGT
CP ','
LD A, ASCII_CR
JP Z, MB_LPCRGT
MB_NOTQTL:
OR A
JP Z, MB_LPCRGT
CP D
JP Z, MB_QUITSI
CP E
JP Z, MB_QUITSI
CALL MB_STRCHR
MB_LPCRGT:
CALL MB_INDSKC
JP NC, MB_LOPCRS
MB_QUITSI:
PUSH HL
CP '"'
JP Z, MB_MORSPC
CP ASCII_SP
JP NZ, MB_NOSKCR
MB_MORSPC:
CALL MB_INDSKC
JP C, MB_NOSKCR
CP ASCII_SP
JP Z, MB_MORSPC
CP ','
JP Z, MB_NOSKCR
CP ASCII_CR
JP NZ, MB_BAKUPT
MB_ICASLF:
CALL MB_INDSKC
JP C, MB_NOSKCR
CP ASCII_LF
JP Z, MB_NOSKCR
MB_BAKUPT:
LD HL, (MB_PTRFIL)
LD BC, NMLOFS
ADD HL, BC
INC (HL)
MB_NOSKCR:
POP HL
MB_QUIT2B:
LD (HL), 0x0
LD HL, MB_BUFMIN ;BUF-1
LD A, E
SUB ' '
JP Z, MB_NUMIMK
LD B, D
LD D, 0x0
CALL MB_STRLT2
POP HL
RET
MB_NUMIMK:
CALL MB_GETYPR
PUSH AF
CALL MB_CHRGTR
POP AF
PUSH AF
CALL C, MB_FIN
POP AF
CALL NC, MB_FINDBL
POP HL
RET
MB_STRCHR:
OR A
RET Z
LD (HL), A
INC HL
DEC B
RET NZ
POP BC
JP MB_QUIT2B
MB_PRGFLI:
LD D, MD.SQI
MB_PRGFL2:
XOR A
JP MB_PRGFIL
MB_LRUN:
DB 0xF6
MB_LOAD:
XOR A
PUSH AF
CALL MB_PRGFLI
LD A, (MB_MAXFIL)
LD (MB_LSTFRE+1), A
DEC HL
CALL MB_CHRGTR
JP Z, MB_NOTRNL
CALL MB_SYNCHR
DB ','
CALL MB_SYNCHR
DB 'R'
JP NZ, MB_SNERR
POP AF
MB_CHNENT:
XOR A
LD (MB_MAXFIL), A
DB 0xF6
MB_NOTRNL:
POP AF
LD (MB_LSTFRE), A
LD HL, 0x80
LD (HL), 0x0
LD (MB_FILPTR), HL
CALL MB_SCRTCH
LD A, (MB_LSTFRE+1)
LD (MB_MAXFIL), A
LD HL, (MB_FILPT1)
LD (MB_FILPTR), HL
LD (MB_PTRFIL), HL
LD HL, (MB_CURLIN) ;= 65534
INC HL
LD A, H
AND L
INC A
JP NZ, MB_NOTINI
LD (MB_CURLIN), HL ;= 65534
MB_NOTINI:
CALL MB_INDSKC
JP C, MB_MAIN
CP 0xfe
JP NZ, MB_NTPROL
LD (MB_PROFLG), A
JP MB_BINLOD
MB_NTPROL:
INC A
JP NZ, MB_MAINGO
MB_BINLOD:
LD HL, (MB_TXTTAB) ;= 6040h
MB_LPBLDR:
EX DE, HL
LD HL, (MB_FRETOP)
LD BC, 0xffaa ;65536-86
ADD HL, BC
CALL MB_DCOMPR
EX DE, HL
JP C, LAB_ram_5356
CALL MB_INDSKB
LD (HL), A
INC HL
JP NC, MB_LPBLDR
LD (MB_VARTAB), HL
LD A, (MB_PROFLG)
OR A
CALL NZ, MB_PDECOD
CALL MB_LINKER
INC HL
INC HL
LD (MB_VARTAB), HL
LD HL, MB_MAXFIL
LD A, (HL)
LD (MB_LSTFRE+1), A
LD (HL), 0x0
CALL MB_RUNC
LD A, (MB_LSTFRE+1)
LD (MB_MAXFIL), A
LD A, (MB_CHNFLG)
OR A
JP NZ, MB_CHNRET
LD A, (MB_LSTFRE)
OR A
JP Z, MB_READY
JP MB_NEWSTT
; ===================================================
; FUNCTION
; ===================================================
MB_PRGFIN:
CALL MB_FINPRT
CALL MB_CLSFIL
JP MB_GTMPRT
LAB_ram_5356:
CALL MB_SCRTCH
JP MB_OMERR
MB_MERGE:
POP BC
CALL MB_PRGFLI
DEC HL
CALL MB_CHRGTR
JP Z, MB_OKGETM
CALL MB_PRGFIN
JP MB_SNERR
MB_OKGETM:
XOR A
LD (MB_LSTFRE), A
CALL MB_INDSKC
JP C, MB_MAIN
INC A
JP Z, MB_ERBFM
INC A
JP Z, MB_ERBFM
MB_MAINGO:
LD HL, (MB_PTRFIL)
LD BC, NMLOFS
ADD HL, BC
INC (HL)
JP MB_MAIN
MB_DIRDO:
PUSH HL
LD HL, (MB_PTRFIL)
LD A, H
OR L
LD DE, ERRFDR
JP NZ, MB_ERROR
POP HL
JP MB_GONE
MB_SAVE:
LD D, MD.SQO
CALL MB_PRGFL2
DEC HL
CALL MB_CHRGTR
JP Z, MB_BINSAV
CALL MB_SYNCHR
DB ','
CP 'P'
JP Z, MB_PROSAV
CALL MB_SYNCHR
DB 'A'
JP MB_LIST
MB_BINSAV:
CALL MB_SCCPTR
CALL MB_PROCHK
LD A, 0xff
; ===================================================
; FUNCTION
; ===================================================
MB_BINPSV:
CALL MB_FILOU3
EX DE, HL
LD HL, (MB_VARTAB)
EX DE, HL
LD HL, (MB_TXTTAB) ;= 6040h
MB_BSAVLP:
CALL MB_DCOMPR
JP Z, MB_PRGFIN
LD A, (HL)
INC HL
PUSH DE
CALL MB_FILOU3
POP DE
JP MB_BSAVLP
; ===================================================
; DRIVER CODE FOR CLOSE
; ===================================================
MB_CLOSE:
LD BC, MB_CLSFIL
LD A, (MB_MAXFIL)
JP NZ, MB_RTLOOP
PUSH HL
MB_MRALL:
PUSH BC
PUSH AF
LD DE, MB_RETALL
PUSH DE
PUSH BC
RET
MB_RETALL:
POP AF
POP BC
DEC A
JP P, MB_MRALL
POP HL
RET
MB_RETRTS:
POP BC
POP HL
LD A, (HL)
CP ','
RET NZ
CALL MB_CHRGTR
MB_RTLOOP:
PUSH BC
LD A, (HL)
CP '#'
CALL Z, MB_CHRGTR
CALL MB_GETBYT
EX (SP), HL
PUSH HL
LD DE, MB_RETRTS
PUSH DE
JP (HL)
MB_CLSALL:
PUSH DE
PUSH BC
XOR A
CALL MB_CLOSE
POP BC
POP DE
XOR A
RET
MB_FIELD:
CALL MB_FILSCN
JP Z, MB_ERBFN
SUB MD.RND
JP NZ, MB_ERBFM
EX DE, HL
LD HL, FD.SIZ ;POINT TO RECORD SIZE
ADD HL, BC
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
LD (MB_TEMPA), HL
LD HL, 0x0
LD (MB_RECORD), HL
LD A, H
EX DE, HL
LD DE, FD.DAT ;POINT TO 5.0 FIELD BUFFER
MB_LOPFLD:
EX DE, HL
ADD HL, BC
LD B, A
EX DE, HL
LD A, (HL)
CP ','
RET NZ
PUSH DE
PUSH BC
CALL MB_GTBYTC
PUSH AF
CALL MB_SYNCHR
DB 'A'
CALL MB_SYNCHR
DB 'S'
CALL MB_PTRGET
CALL MB_CHKSTR
POP AF
POP BC
EX (SP), HL
LD C, A
PUSH DE
PUSH HL
LD HL, (MB_RECORD)
LD B, 0x0
ADD HL, BC
LD (MB_RECORD), HL
EX DE, HL
LD HL, (MB_TEMPA)
CALL MB_DCOMPR
JP C, MB_DERFOV
POP HL
POP DE
EX DE, HL
LD (HL), C
INC HL
LD (HL), E
INC HL
LD (HL), D
POP HL
JP MB_LOPFLD
; ===================================================
; LSET/RSET stringvar = stringexp
; ===================================================
MB_RSET:
DB 0xF6 ; OR 0x37
MB_LSET:
SCF
PUSH AF
CALL MB_PTRGET
CALL MB_CHKSTR
PUSH DE
CALL MB_FRMEQL
POP BC
EX (SP), HL
PUSH HL
PUSH BC
CALL MB_FRESTR
LD B, (HL)
EX (SP), HL
LD A, (HL)
LD C, A
PUSH BC
PUSH HL
PUSH AF
INC HL
LD E, (HL)
INC HL
LD D, (HL)
OR A
JP Z, MB_RETCUR
LD HL, (MB_TXTTAB) ;= 6040h
CALL MB_DCOMPR
JP NC, MB_OLDSTR
LD HL, (MB_VARTAB)
CALL MB_DCOMPR
JP C, MB_OLDSTR
LD E, C
LD D, 0x0
LD HL, (MB_STREND)
ADD HL, DE
EX DE, HL
LD HL, (MB_FRETOP)
CALL MB_DCOMPR
JP C, MB_MAKDSC
POP AF
MB_MADESC:
LD A, C
CALL MB_GETSPA
POP HL
POP BC
EX (SP), HL
PUSH DE
PUSH BC
CALL MB_FRESTR
POP BC
POP DE
EX (SP), HL
PUSH BC
PUSH HL
INC HL
PUSH AF
LD (HL), E
INC HL
LD (HL), D
MB_OLDSTR:
POP AF
POP HL
INC HL
LD E, (HL)
INC HL
LD D, (HL)
POP BC
POP HL
INC HL
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
LD A, C
CP B
JP NC, MB_FILDOK
LD B, A
MB_FILDOK:
SUB B
LD C, A
POP AF
CALL NC, MB_BLKFIL
INC B
MB_COPLOP:
DEC B
JP Z, MB_LRSTDN
LD A, (HL)
LD (DE), A
INC HL
INC DE
JP MB_COPLOP
MB_RETCUR:
POP BC
POP BC
POP BC
POP BC
POP BC
MB_LRSTDN:
CALL C, MB_BLKFIL
POP HL
RET
MB_BLKFIL:
LD A, ASCII_SP
INC C
MB_BLKFL1:
DEC C
RET Z
LD (DE), A
INC DE
JP MB_BLKFL1
MB_MAKDSC:
POP AF
POP HL
POP BC
EX (SP), HL
EX DE, HL
JP NZ, MB_MAKDS1
PUSH BC
LD A, B
CALL MB_STRINI
CALL MB_PUTNEW
POP BC
MB_MAKDS1:
EX (SP), HL
PUSH BC
PUSH HL
JP MB_MADESC
MB_FIXINP:
CALL MB_CHRGTR
CALL MB_SYNCHR
DB ASCII_CUR
CALL MB_SYNCHR
DB '('
CALL MB_GETBYT
PUSH DE
LD A, (HL)
CP ','
JP NZ, MB_REDTTY
CALL MB_CHRGTR
CALL MB_FILSCN
CP 0x2
JP Z, MB_ERBFM
CALL MB_FILSET
XOR A
MB_REDTTY:
PUSH AF
CALL MB_SYNCHR
DB ')'
POP AF
EX (SP), HL
PUSH AF
LD A, L
OR A
JP Z, MB_FCERR
PUSH HL
CALL MB_STRINI
EX DE, HL
POP BC
MB_FIXLOP:
POP AF
PUSH AF
JP Z, MB_DSKCHR
CALL MB_CHARCG
JP NZ, MB_CHARCW
CALL MB_INCHRI
MB_CHARCW:
CP MD.RND
JP Z, MB_INTCTC
MB_PUTCHR:
LD (HL), A
INC HL
DEC C
JP NZ, MB_FIXLOP
POP AF
CALL MB_FINPRT
JP MB_PUTNEW
MB_INTCTC:
LD HL, (MB_SAVSTK)
LD SP, HL
JP MB_ENDCON
MB_DSKCHR:
CALL MB_INDSKC
JP C, MB_ERRPE
JP MB_PUTCHR
; ===================================================
; Operating system calls and other data
; DCPM.MAC
; ===================================================
MB_EOF:
CALL MB_FILFRM
JP Z, MB_ERBFN
CP 0x2
JP Z, MB_ERBFM
MB_ORNCHK:
LD HL, ORNOFS
ADD HL, BC
LD A, (HL)
OR A
JP Z, MB_WASEOF
LD A, (BC)
CP MD.RND
JP Z, MB_WASEOF
INC HL
LD A, (HL)
OR A
JP NZ, MB_CHKCTZ
PUSH BC
LD H, B
LD L, C
CALL MB_READIN
POP BC
JP MB_ORNCHK
MB_CHKCTZ:
LD A, 0x80
SUB (HL)
LD C, A
LD B, 0x0
ADD HL, BC
INC HL
LD A, (HL)
SUB 0x1a
MB_WASEOF:
SUB 0x1
SBC A, A
JP MB_CONIA
; ===================================================
; FUNCTION
; ===================================================
MB_OUTSEQ:
;BC -> FILE DATA BLOCK
LD D, B
LD E, C
INC DE
MB_OUTSQ2:
LD HL, ORNOFS
ADD HL, BC
PUSH BC
XOR A
LD (HL), A
;OUTPUT NEXT RECORD IN FILE
;Inp: A = 0
; HL -> to NMLOFS-1
; DE -> to File Data Block + 1 ( FCB if SPC2ND=0)
; BC -> to File Data Block
CALL MB_SETBUF
LD A, (MB_CPMWRI)
CALL MB_ACCFIL
CP 0xff
JP Z, MB_ERTMF
DEC A
JP Z, MB_ERIOE
DEC A
JP NZ, MB_OUTSOK
POP DE
XOR A
LD (DE), A
LD C, 0x10
INC DE
CALL BDOS_ENTER
JP MB_DERDFL
MB_OUTSOK:
INC A
JP Z, MB_ERTMF
POP BC
LD HL, LOCOFS
ADD HL, BC
LD E, (HL)
INC HL
LD D, (HL)
INC DE
LD (HL), D
DEC HL
LD (HL), E
RET
; ===================================================
; FUNCTION
; ===================================================
MB_CLSFIL:
CALL MB_FILIDX
JP Z, MB_NTOPNC
PUSH BC
LD A, (BC)
LD D, B
LD E, C
INC DE
PUSH DE
CP SQO ;SEQENTIAL OUTPUT?
JP NZ, MB_NOFORC
LD HL, MB_CLSFL1
PUSH HL
PUSH HL
LD H, B
LD L, C
LD A, EOFCHR
JP MB_FILOU4
MB_CLSFL1:
LD HL, ORNOFS
ADD HL, BC
LD A, (HL)
OR A
CALL NZ, MB_OUTSQ2
MB_NOFORC:
POP DE
CALL MB_SETBUF
LD C, C.CLOS
CALL BDOS_ENTER
POP BC
MB_NTOPNC:
LD D, DATOFS
XOR A
MB_MORCZR:
LD (BC), A
INC BC
DEC D
JP NZ, MB_MORCZR
RET
MB_LOC:
CALL MB_FILFRM
JP Z, MB_ERBFN
CP MD.RND
LD HL, LOCOFS+1
JP NZ, MB_INTRED
LD HL, FD.LOG+1
MB_INTRED:
ADD HL, BC
LD A, (HL)
DEC HL
LD L, (HL)
JP MB_GIVINT
MB_LOF:
CALL MB_FILFRM
JP Z, MB_ERBFN
LD HL, 0x0010 ; ToDo: Check, in original code there is: FCB.RC + 1 -> Point to record number
ADD HL, BC
LD A, (HL)
JP MB_SNGFLT
; ===================================================
; PUT A CHARACTER IN AN OUTPUT BUFFER AND OUTPUT IF NECESSARY
; ===================================================
MB_FILOUT:
POP HL
POP AF
MB_FILOU3:
PUSH HL
PUSH AF
LD HL, (MB_PTRFIL)
LD A, (HL)
CP 0x1
JP Z, MB_POPAHT
CP 0x3
JP Z, MB_FILOFV
POP AF
MB_FILOU4:
PUSH DE
PUSH BC
LD B, H
LD C, L
PUSH AF
LD DE, ORNOFS
ADD HL, DE
LD A, (HL)
CP 0x80
PUSH HL
CALL Z, MB_OUTSEQ
POP HL
INC (HL)
LD C, (HL)
LD B, 0x0
INC HL
POP AF
MB_FILUPP:
PUSH AF
LD D, (HL)
CP 0xd
LD (HL), B
JP Z, MB_ISCRDS
ADD A, 0xe0
LD A, D
ADC A, B
LD (HL), A
MB_ISCRDS:
ADD HL, BC
POP AF
POP BC
POP DE
LD (HL), A
POP HL
RET
; --------------------------------------------------
MB_FIVDPT:
DEC DE
DEC HL
LD (HL), E
INC HL
LD (HL), D
INC HL
LD (HL), 0x80
INC HL
LD (HL), 0x80
POP HL
EX (SP), HL
LD B, H
LD C, L
PUSH HL
LD A, (MB_CPMVRN)
OR A
JP Z, MB_RNDVR1
LD HL, FCB.RN+1
ADD HL, BC
LD (HL), E
INC HL
LD (HL), D
INC HL
LD (HL), 0x0
JP MB_RNDDON
; --------------------------------------------------
MB_RNDVR1:
LD HL, 0x000D ; ToDo: Check, in original source there is FCB.EX+1
ADD HL, BC
LD A, E
RLA
LD A, D
RLA
LD D, (HL)
CP D
JP Z, MB_SAMEXT
PUSH DE
PUSH AF
PUSH HL
PUSH BC
LD DE, DMA_BUFFER
LD C, C.BUFF
CALL BDOS_ENTER
POP DE
PUSH DE
INC DE
LD C, C.CLOS
CALL BDOS_ENTER
POP DE
POP HL
POP AF
LD (HL), A
PUSH DE
INC DE
LD C, C.OPEN
PUSH DE
CALL BDOS_ENTER
POP DE
INC A
JP NZ, MB_RNDOK
LD C, C.MAKE
CALL BDOS_ENTER
INC A
JP Z, MB_ERTMF
; --------------------------------------------------
MB_RNDOK:
POP BC
POP DE
; --------------------------------------------------
MB_SAMEXT:
LD HL, 0x0021 ; ToDo: Check, in original code there is: FCB.NR+1
ADD HL, BC
LD A, E
AND 0x7f
LD (HL), A
MB_RNDDON:
POP HL
LD A, (MB_MAXTRK)
OR A
JP NZ, MB_PUTFIN
CALL MB_READIN
POP HL
RET
; --------------------------------------------------
MB_PUTFIN:
LD HL, 0x0021 ; ToDo: Check, in original code there is: FCB.NR+1
ADD HL, BC
LD A, (HL)
CP 0x7f ;LAST RECORD IN EXTENT?
PUSH AF
LD DE, DMA_BUFFER
LD HL, DATOFS
ADD HL, BC
PUSH DE
PUSH HL
CALL Z, MB_BUFMOV
CALL MB_OUTSEQ
POP DE
POP HL
POP AF
CALL Z, MB_BUFMOV
POP HL
JP MB_FINPRT
MB_BUFMOV:
PUSH BC
LD B, 0x80
MB_BUFSLP:
LD A, (HL)
INC HL
LD (DE), A
INC DE
DEC B
JP NZ, MB_BUFSLP
POP BC
RET
MB_INDSKB:
PUSH BC
PUSH HL
MB_INDSK3:
LD HL, (MB_PTRFIL)
LD A, (HL)
CP MD.RND
JP Z, MB_FILIFV
LD BC, NMLOFS
ADD HL, BC
LD A, (HL)
OR A
JP Z, MB_FILLSQ
DEC HL
LD A, (HL)
INC HL
DEC (HL)
SUB (HL)
LD C, A
ADD HL, BC
LD A, (HL)
OR A
POP HL
POP BC
RET
MB_FILLSQ:
DEC HL
LD A, (HL)
OR A
JP Z, MB_FILLS1
CALL MB_READ2
JP NZ, MB_INDSK3
MB_FILLS1:
SCF
POP HL
POP BC
LD A, EOFCHR
RET
MB_READ2:
LD HL, (MB_PTRFIL)
MB_READIN:
PUSH DE
LD D, H
LD E, L
INC DE
LD BC, LOCOFS
ADD HL, BC
LD C, (HL)
INC HL
LD B, (HL)
INC BC
DEC HL
LD (HL), C
INC HL
LD (HL), B
INC HL
INC HL
PUSH HL
LD C, DATPSC
MB_ZRRND:
INC HL
LD (HL), 0x0
DEC C
JP NZ, MB_ZRRND
CALL MB_SETBUF
LD A, (MB_CPMREA)
CALL MB_ACCFIL
OR A
LD A, 0x0
JP NZ, MB_READI2
LD A, DATPSC
MB_READI2:
POP HL
LD (HL), A
DEC HL
LD (HL), A
OR A
POP DE
RET
MB_SETBUF:
PUSH BC
PUSH DE
PUSH HL
LD HL, NMLOFS
ADD HL, DE
EX DE, HL
LD C, C.BUFF
CALL BDOS_ENTER
POP HL
POP DE
POP BC
RET
MB_INDSKC:
CALL MB_INDSKB
RET C
CP EOFCHR
SCF
CCF
RET NZ
PUSH BC
PUSH HL
LD HL, (MB_PTRFIL)
LD BC, ORNOFS ;POINT TO NUMBER ORIGINALLY IN BUFFER
ADD HL, BC
LD (HL), 0x0
INC HL
LD (HL), 0x0
SCF
POP HL
POP BC
RET
MB_NAMFIL:
CALL MB_FRMEVL
PUSH HL
CALL MB_FRESTR
LD A, (HL)
OR A
JP Z, MB_ERNMF
PUSH AF
INC HL
LD E, (HL)
INC HL
LD H, (HL)
LD L, E
LD E, A
CP 0x2
JP C, MB_NODEV
LD C, (HL)
INC HL
LD A, (HL)
DEC E
CP ':'
JP Z, MB_CHKFIL
DEC HL
INC E
MB_NODEV:
DEC HL
INC E
LD C, 0x40 ; 'A'-1
MB_CHKFIL:
DEC E
JP Z, MB_DERNMF
LD A, C
AND 0xdf
SUB 0x40 ; 'A'-1
JP C, MB_DERNMF
CP 0x1b
JP NC, MB_DERNMF
LD BC, MB_FILNAM
LD (BC), A
INC BC
LD D, 11 ;name length
MB_FILINX:
INC HL
MB_FILLOP:
DEC E
JP M, MB_FILSPC
LD A, (HL)
CP '.'
JP NZ, MB_FILLO1
CALL MB_FILLNM
POP AF
SCF
PUSH AF
JP MB_FILINX
MB_FILLO1:
LD (BC), A
INC BC
INC HL
DEC D
JP NZ, MB_FILLOP
MB_GOTNAM:
XOR A
LD (MB_FILNAM+12), A
POP AF
POP HL
RET
MB_FILLNM:
LD A, D
CP 0xb
JP Z, MB_DERNMF
CP 0x3
JP C, MB_DERNMF
RET Z
MB_FILLN1:
LD A, ASCII_SP
LD (BC), A
INC BC
DEC D
JP MB_FILLNM
MB_FILSPC:
INC D
DEC D
JP Z, MB_GOTNAM
MB_FILSP2:
LD A, ASCII_SP
LD (BC), A
INC BC
DEC D
JP NZ, MB_FILSP2
JP MB_GOTNAM
MB_DERNMF:
JP MB_ERNMF
MB_NAME:
CALL MB_NAMFIL
PUSH HL
LD DE, DMA_BUFFER
LD C, C.BUFF ; SET BUFFER ADDRESS
CALL BDOS_ENTER
LD DE, MB_FILNAM
LD C, C.OPEN
CALL BDOS_ENTER
INC A
JP Z, MB_ERFNF
LD HL, MB_FILNA2
LD DE, MB_FILNAM
LD B, 12 ; 12+3*0-2*0+2*0+3*0-3*0;SET [C]=MAX FILE NAME LENGTH
MB_NAMRMV:
LD A, (DE)
LD (HL), A
INC HL
INC DE
DEC B
JP NZ, MB_NAMRMV
POP HL
CALL MB_SYNCHR
DB 'A'
CALL MB_SYNCHR
DB 'S'
CALL MB_NAMFIL
PUSH HL
LD A, (MB_FILNAM)
LD HL, MB_FILNA2
CP (HL)
JP NZ, MB_FCERR
LD DE, MB_FILNAM
LD C, C.OPEN
CALL BDOS_ENTER
INC A
JP NZ, MB_DERFAE
LD C, C.RENA
LD DE, MB_FILNA2
CALL BDOS_ENTER
POP HL
RET
; --------------------------------------------------
; OPEN STATEMENT AND ALL DIRECTORY HANDLING
; --------------------------------------------------
MB_OPEN:
LD BC, MB_FINPRT
PUSH BC
CALL MB_FRMEVL
PUSH HL
CALL MB_FRESTR
LD A, (HL)
OR A
JP Z, MB_ERBFM
INC HL
LD C, (HL)
INC HL
LD B, (HL)
LD A, (BC)
; force uppercase
AND 0xdf
LD D, MD.SQO
CP 'O'
JP Z, MB_HAVMOD
LD D, MD.SQI
CP 'I'
JP Z, MB_HAVMOD
LD D, MD.RND
CP 'R'
JP NZ, MB_ERBFM
MB_HAVMOD:
POP HL
CALL MB_SYNCHR
DB ','
PUSH DE
CP '#'
CALL Z, MB_CHRGTR
CALL MB_GETBYT
CALL MB_SYNCHR
DB ','
LD A, E
OR A
JP Z, MB_ERBFN
POP DE
MB_PRGFIL:
LD E, A
PUSH DE
CALL MB_FILIDX
JP NZ, MB_ERFAO
POP DE
PUSH BC
PUSH DE
CALL MB_NAMFIL
POP DE
POP BC
PUSH BC
PUSH AF
LD A, D
CALL MB_VARECS
POP AF
LD (MB_TEMP), HL
JP C, MB_PRGDOT
LD A, E
OR A
JP NZ, MB_PRGDOT
LD HL, MB_FILNAM+9 ; FILNAM+9-0-0-2*0 - POINT TO FIRST CHAR OF EXTENSION
LD A, (HL)
CP ' '
JP NZ, MB_PRGDOT
LD (HL), 'B'
INC HL
LD (HL), 'A'
INC HL
LD (HL), 'S'
MB_PRGDOT:
POP HL
LD A, D
PUSH AF
LD (MB_PTRFIL), HL
PUSH HL
INC HL
LD DE, MB_FILNAM
LD C, 12 ; 12+0+0*3+2*0+3*0 - NUMBER OF BYTES TO COPY
MB_OPNLP:
LD A, (DE)
LD (HL), A
INC DE
INC HL
DEC C
JP NZ, MB_OPNLP
XOR A
LD (HL), A
LD DE, 20 ; POINT TO NR FIELD
ADD HL, DE
LD (HL), A
POP DE
PUSH DE
INC DE
CALL MB_SETBUF
POP HL
POP AF
PUSH AF
PUSH HL
CP 0x2
JP NZ, MB_OPNFIL
PUSH DE
MB_DELEXOF:
LD C, C.DEL
CALL BDOS_ENTER
POP DE
MB_MAKFIL:
LD C, C.MAKE
CALL BDOS_ENTER
INC A
JP Z, MB_ERTMF
JP MB_OPNSET
MB_OPNFIL:
LD C, C.OPEN
CALL BDOS_ENTER
INC A
JP NZ, MB_OPNSET
POP DE
POP AF
PUSH AF
PUSH DE
CP MD.RND
JP NZ, MB_ERFNF
INC DE
JP MB_MAKFIL
MB_OPNSET:
POP DE
POP AF
LD (DE), A
PUSH DE
LD HL, LOCOFS
ADD HL, DE
XOR A
LD (HL), A
INC HL
LD (HL), A
INC HL
LD (HL), A
INC HL
LD (HL), A
POP HL
LD A, (HL)
CP MD.RND
JP Z, MB_RNDFIN
CP MD.SQI
JP NZ, MB_GTMPRT
CALL MB_READ2
LD HL, (MB_TEMP)
RET
MB_RNDFIN:
LD BC, DATOFS
ADD HL, BC
LD C, DATPSC
MB_ZRRNDT:
LD (HL), B
INC HL
DEC C
JP NZ, MB_ZRRNDT
JP MB_GTMPRT
MB_SYSTEM:
RET NZ
CALL MB_CLSALL
; --------------------------------------------------
; System error, exit to CP/M
; --------------------------------------------------
MB_SYSTME:
JP WARM_BOOT
MB_RESET:
RET NZ
PUSH HL
CALL MB_CLSALL
LD C, C.GDRV
CALL BDOS_ENTER
PUSH AF
LD C, C.REST
CALL BDOS_ENTER
POP AF
LD E, A
LD C, C.SDRV
CALL BDOS_ENTER
POP HL
RET
MB_KILL:
CALL MB_NAMFIL
PUSH HL
LD DE, DMA_BUFFER
LD C, C.BUFF
CALL BDOS_ENTER
LD DE, MB_FILNAM
PUSH DE
LD C, C.OPEN
CALL BDOS_ENTER
INC A
POP DE
PUSH DE
PUSH AF
LD C, C.CLOS
JP Z, MB_NO_CLOS
CALL BDOS_ENTER
MB_NO_CLOS:
POP AF
POP DE
JP Z, MB_ERFNF
LD C, C.DEL
CALL BDOS_ENTER
POP HL
RET
MB_FILES:
JP NZ, MB_FILNB
PUSH HL
LD HL, MB_FILNAM
LD (HL), 0x0
INC HL
LD C, 0xb ;11+8*0 - MATCH ALL FILES
CALL MB_FILQST
POP HL
MB_FILNB:
CALL NZ, MB_NAMFIL
XOR A
LD (MB_FILNAM+12), A
PUSH HL
LD HL, MB_FILNAM+1
LD C, 8
CALL MB_FILQS
LD HL, MB_FILNAM+9
LD C, 3
CALL MB_FILQS
LD DE, DMA_BUFFER
LD C, C.BUFF
CALL BDOS_ENTER
LD DE, MB_FILNAM
LD C, C.SEAR
CALL BDOS_ENTER
CP 0xff
JP Z, MB_ERFNF
MB_FILNXT:
AND 0x3
ADD A, A
ADD A, A
ADD A, A
ADD A, A
ADD A, A
LD C, A
LD B, 0x0
LD HL, P_CMD_LINE
ADD HL, BC
LD C, 11 ; 11+5*0+11*0 - CHARS IN NAME
MB_MORNAM:
LD A, (HL)
INC HL
CALL MB_OUTDO
LD A, C
CP 0x4
JP NZ, MB_NOTEXT
LD A, (HL)
CP ' '
JP Z, MB_PRISPA
LD A, '.'
MB_PRISPA:
CALL MB_OUTDO
MB_NOTEXT:
DEC C
JP NZ, MB_MORNAM
LD A, (MB_TTYPOS)
ADD A, 0xd
LD D, A
LD A, (MB_LINLEN) ;= 80
CP D
JP C, MB_NWFILN
LD A, ' '
CALL MB_OUTDO
CALL MB_OUTDO
MB_NWFILN:
CALL C, MB_CRDO
LD DE, MB_FILNAM
LD C, C.SEAR_N
CALL BDOS_ENTER
CP 0xff
JP NZ, MB_FILNXT
POP HL
RET
MB_FILQS:
LD A, (HL)
CP '*'
RET NZ
MB_FILQST:
LD (HL), '?'
INC HL
DEC C
JP NZ, MB_FILQST
RET
MB_ACCFIL:
PUSH DE
LD C, A
PUSH BC
CALL BDOS_ENTER
POP BC
POP DE
PUSH AF
LD HL, FCB.RN
ADD HL, DE
INC (HL)
JP NZ, MB_ACCFL1
INC HL
INC (HL)
JP NZ, MB_ACCFL1
INC HL
INC (HL)
MB_ACCFL1:
LD A, C
CP 0x22
JP NZ, MB_ACCFL2
POP AF
OR A
RET Z
CP 0x5
JP Z, MB_ERTMF
CP 0x3
LD A, 0x1
RET Z
INC A
RET
MB_ACCFL2:
POP AF
RET
MB_VARECS:
CP MD.RND
RET NZ
DEC HL
CALL MB_CHRGTR
PUSH DE
LD DE, 0x80
JP Z, MB_NOTSEP
PUSH BC
CALL MB_INTIDX
POP BC
MB_NOTSEP:
PUSH HL
LD HL, (MB_MAXREC)
CALL MB_DCOMPR
JP C, MB_FCERR
LD HL, FD.SIZ
ADD HL, BC
LD (HL), E
INC HL
LD (HL), D
XOR A
LD E, 0x7
MB_ZOFIVB:
INC HL
LD (HL), A
DEC E
JP NZ, MB_ZOFIVB
POP HL
POP DE
RET
MB_PUT:
DB 0xF6
MB_GET:
XOR A
LD (MB_PGTFLG), A
CALL MB_FILSCN
CP MD.RND
JP NZ, MB_ERBFM
PUSH BC
PUSH HL
LD HL, FD.LOG ;0+FD.LOG - Fetch current logical posit
ADD HL, BC
LD E, (HL)
INC HL
LD D, (HL)
INC DE
EX (SP), HL
LD A, (HL)
CP ','
CALL Z, MB_INTIDX
DEC HL
CALL MB_CHRGTR
JP NZ, MB_SNERR
EX (SP), HL
LD A, D
OR E
JP Z, MB_DERBRN
DEC HL
LD (HL), E
INC HL
LD (HL), D
DEC DE
POP HL
POP BC
PUSH HL
PUSH BC
LD HL, FD.OPS
ADD HL, BC
XOR A
LD (HL), A
INC HL
LD (HL), A
LD HL, FD.SIZ
ADD HL, BC
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
EX DE, HL
PUSH DE
PUSH HL
LD HL, DATPSC
CALL MB_DCOMPR
POP HL
JP NZ, MB_NTLSAP
LD DE, 0x0
JP MB_DONCLC
MB_NTLSAP:
LD B, D
LD C, E
LD A, 0x10
EX DE, HL
LD HL, 0x0
PUSH HL
MB_FRMUL1:
ADD HL, HL
EX (SP), HL
JP NC, MB_FNOCRY
ADD HL, HL
INC HL
JP MB_FNOCY0
MB_FNOCRY:
ADD HL, HL
MB_FNOCY0:
EX (SP), HL
EX DE, HL
ADD HL, HL
EX DE, HL
JP NC, MB_FNOCY2
ADD HL, BC
EX (SP), HL
JP NC, MB_FNOINH
INC HL
MB_FNOINH:
EX (SP), HL
MB_FNOCY2:
DEC A
JP NZ, MB_FRMUL1
LD A, L
AND 0x7f
LD E, A
LD D, 0x0
POP BC
LD A, L
LD L, H
LD H, C
ADD HL, HL
JP C, MB_FCERR
RLA
JP NC, MB_DONINH
INC HL
MB_DONINH:
LD A, B
OR A
JP NZ, MB_FCERR
MB_DONCLC:
LD (MB_RECORD), HL
POP HL
POP BC
PUSH HL
LD HL, FD.DAT
ADD HL, BC
LD (MB_LBUFF), HL
MB_NXTOPD:
LD HL, DATOFS
ADD HL, BC
ADD HL, DE
LD (MB_PBUFF), HL
POP HL
PUSH HL
LD HL, DATPSC
LD A, L
SUB E
LD L, A
LD A, H
SBC A, D
LD H, A
POP DE
PUSH DE
CALL MB_DCOMPR
JP C, MB_DATMOF
LD H, D
LD L, E
MB_DATMOF:
LD A, (MB_PGTFLG)
OR A
JP Z, MB_NXFVBF
LD DE, DATPSC
CALL MB_DCOMPR
JP NC, MB_NOFVRD
PUSH HL
CALL MB_GETSUB
POP HL
MB_NOFVRD:
PUSH BC
LD B, H
LD C, L
EX DE, HL
LD HL, (MB_PBUFF)
EX DE, HL
LD HL, (MB_LBUFF)
CALL MB_FDMOV
LD (MB_LBUFF), HL
LD D, B
LD E, C
POP BC
CALL MB_PUTSUB
MB_NXFVBF0:
LD HL, (MB_RECORD)
INC HL
LD (MB_RECORD), HL
POP HL
LD A, L
SUB E
LD L, A
LD A, H
SBC A, D
LD H, A
LD A, H
OR L
LD DE, 0x0
PUSH HL
JP NZ, MB_NXTOPD
POP HL
POP HL
RET
MB_NXFVBF:
PUSH HL
CALL MB_GETSUB
POP HL
PUSH BC
LD B, H
LD C, L
EX DE, HL
LD HL, (MB_LBUFF)
EX DE, HL
LD HL, (MB_PBUFF)
CALL MB_FDMOV
EX DE, HL
LD (MB_LBUFF), HL
LD D, B
LD E, C
POP BC
JP MB_NXFVBF0
MB_PUTSUB:
DB 0xF6 ; OR 0xAF
MB_GETSUB:
XOR A
LD (MB_MAXTRK), A
PUSH BC
PUSH DE
PUSH HL
EX DE, HL
LD HL, (MB_RECORD)
EX DE, HL
LD HL, FD.PHY
ADD HL, BC
PUSH HL
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
INC DE
CALL MB_DCOMPR
POP HL
LD (HL), E
INC HL
LD (HL), D
JP NZ, MB_NTREDS
LD A, (MB_MAXTRK)
OR A
JP Z, MB_SUBRET
MB_NTREDS:
LD HL, MB_SUBRET
PUSH HL
PUSH BC
PUSH HL
LD HL, LOCOFS+1
ADD HL, BC
JP MB_FIVDPT
MB_SUBRET:
POP HL
POP DE
POP BC
RET
MB_FDMOV:
PUSH BC
MB_FDMOV1:
LD A, (HL)
LD (DE), A
INC HL
INC DE
DEC BC
LD A, B
OR C
JP NZ, MB_FDMOV1
POP BC
RET
MB_FILOFV:
POP AF
PUSH DE
PUSH BC
PUSH AF
LD B, H
LD C, L
CALL MB_CMPFPS
JP Z, MB_DERFOV1
CALL MB_SETFPI
LD HL, 0xb1
ADD HL, BC
ADD HL, DE
POP AF
LD (HL), A
PUSH AF
LD HL, NMLOFS ;0+NMLOFS - Set up [H, L] to point at print posit
ADD HL, BC
LD D, (HL)
LD (HL), 0x0
CP ASCII_CR
JP Z, MB_FISCR
ADD A, 0xe0
LD A, D
ADC A, 0x0
LD (HL), A
MB_FISCR:
POP AF
POP BC
POP DE
POP HL
RET
MB_DERFOV1:
JP MB_DERFOV
MB_FILIFV:
PUSH DE
CALL MB_CMPFBC
JP Z, MB_DERFOV1
CALL MB_SETFPI
LD HL, FD.DAT-1 ;0+FD.DAT-1 - Point to data
ADD HL, BC
ADD HL, DE
LD A, (HL)
OR A
POP DE
POP HL
POP BC
RET
MB_GETFSZ:
LD HL, FD.SIZ ;0+FD.SIZ - Point to record size
JP MB_GETFP1
MB_GETFPS:
LD HL, FD.OPS ;0+FD.OPS - Point to output position
MB_GETFP1:
ADD HL, BC
LD E, (HL)
INC HL
LD D, (HL)
RET
MB_SETFPI:
INC DE
MB_SETFPS:
LD HL, FD.OPS ;0+FD.OPS - Point to output position
ADD HL, BC
LD (HL), E
INC HL
LD (HL), D
RET
MB_CMPFBC:
LD B, H
LD C, L
MB_CMPFPS:
CALL MB_GETFPS
PUSH DE
CALL MB_GETFSZ
EX DE, HL
POP DE
CALL MB_DCOMPR
RET
MB_PROSAV:
CALL MB_CHRGTR
LD (MB_TEMP), HL
CALL MB_SCCPTR
CALL MB_PENCOD
LD A, 0xfe
CALL MB_BINPSV
CALL MB_PDECOD
JP MB_GTMPRT
MB_PENCOD:
LD BC, 0xd0b ;0+N1+N2*256 - Initialize both counters
LD HL, (MB_TXTTAB) ;= 6040h
EX DE, HL
MB_ENCDBL:
LD HL, (MB_VARTAB)
CALL MB_DCOMPR
RET Z
LD HL, MB_ATNCON
LD A, L
ADD A, C
LD L, A
LD A, H
ADC A, 0x0
LD H, A
LD A, (DE)
SUB B
XOR (HL)
PUSH AF
LD HL, MB_SINCON
LD A, L
ADD A, B
LD L, A
LD A, H
ADC A, 0x0
LD H, A
POP AF
XOR (HL)
ADD A, C
LD (DE), A
INC DE
DEC C
JP NZ, MB_CNTZER
LD C, N1
MB_CNTZER:
DEC B
JP NZ, MB_ENCDBL
LD B, N2
JP MB_ENCDBL
MB_PDECOD:
LD BC, 0xd0b ;N1+N2*256
LD HL, (MB_TXTTAB) ;= 6040h
EX DE, HL
MB_DECDBL:
LD HL, (MB_VARTAB)
CALL MB_DCOMPR
RET Z
LD HL, MB_SINCON
LD A, L
ADD A, B
LD L, A
LD A, H
ADC A, 0x0
LD H, A
LD A, (DE)
SUB C
XOR (HL)
PUSH AF
LD HL, MB_ATNCON
LD A, L
ADD A, C
LD L, A
LD A, H
ADC A, 0x0
LD H, A
POP AF
XOR (HL)
ADD A, B
LD (DE), A
INC DE
DEC C
JP NZ, MB_CNTZR2
LD C, N1
MB_CNTZR2:
DEC B
JP NZ, MB_DECDBL
LD B, N2
JP MB_DECDBL
MB_PRODIR:
PUSH HL
LD HL, (MB_CURLIN) ;= 65534
LD A, H
AND L
POP HL
INC A
RET NZ
MB_PROCHK:
PUSH AF
LD A, (MB_PROFLG)
OR A
JP NZ, MB_FCERR
POP AF
RET
MB_RECORD:
DW 0x00
MB_LBUFF:
DW 0x00
MB_PBUFF:
DW 0x00
MB_PGTFLG:
DB 00h
MB_INITSA:
CALL MB_NODSKS
LD HL, (MB_TXTTAB) ;= 6040h
DEC HL
LD (HL), 0x0
LD HL, (MB_CPMFIL)
LD A, (HL)
OR A
JP NZ, MB_LRUN
JP MB_READY
MB_DSKDAT:
DW 0x00
; ---------------------------------------------------
; Entry point to init Basic
; ---------------------------------------------------
MB_INIT:
LD HL, MB_TSTACK ; Setup temp stack
LD SP, HL
; Initialize protect flag
XOR A
LD (MB_PROFLG), A
LD (MB_TOPMEM), HL ;= 60A3h
LD SP, HL
LD HL, MB_RST_INP
LD (HL), ':'
CALL MB_STKINI ;= ??
LD (MB_TTYPOS), A
LD (MB_SAVSTK), HL
; Get Console status address
LD HL, (WARM_BOOT_ADDR)
LD BC, 0x4
ADD HL, BC ; HL = PTR to CSTS address
LD E, (HL)
INC HL
LD D, (HL) ; DE -> CSTS
EX DE, HL
LD (CTC_ADDR3), HL ; Ctrl+C chk
LD (CTC_ADDR1), HL ; Save
LD (CTC_ADDR2), HL ; Fast Ctrl+C Chk
EX DE, HL
; Get Console Input address
INC HL
INC HL
LD E, (HL)
INC HL
LD D, (HL)
EX DE, HL
LD (CI_ADDR), HL ; Console input call address
; Get CO address
EX DE, HL
INC HL
INC HL
LD E, (HL)
INC HL
LD D, (HL)
EX DE, HL
LD (CO_ADDR), HL ; Console output call address
;
EX DE, HL
INC HL
INC HL
LD E, (HL)
INC HL
LD D, (HL)
EX DE, HL
LD (LPTO_ADDR), HL
; Check CP/M Version Number
LD C, C.VER
CALL BDOS_ENTER ;= ??
LD (MB_CPMVRN), A
OR A
LD HL, 0x1514 ;21*256+20+0 - 1.x Read / Write
JP Z, MB_CPM_VR1
MB_CPM_VR2:
LD HL, 0x2221 ;34*256+33+0 - 2.x Read / Write
MB_CPM_VR1:
LD (MB_CPMREA), HL
LD HL, 65534 ;SAY INITIALIZATION IS EXECUTING
LD (MB_CURLIN), HL ;= 65534
XOR A
LD (MB_CNTOFL), A
LAB_ram_5f3c:
LD (MB_ENDBUF), A
LD (MB_CHNFLG), A
LD (MB_MRGFLG), A
LD (MB_ERRFLG), A
LD HL, 0
LD (MB_LPTPOS), HL
LD HL, 128
LD (MB_MAXREC), HL
LD HL, MB_TEMPST
LD (MB_TEMPPT), HL
LD HL, MB_PRMSTK
LD (MB_PRMPRV), HL
LD HL, (BDOS_ENTER_ADDR)
LD (MB_MEMSIZ), HL
; ---------------------------------------------------
; THE FOLLOWING CODE SCANS A CP/M COMMAND LINE FOR BASIC.
; THE FORMAT OF THE COMMAND IS:
; BASIC <FILE NAME>[/M:<TOPMEM>][/F:<FILES>]
; ---------------------------------------------------
LD A, 0x3
LD (MB_MAXFIL), A
LD HL, MB_ZEROB
LD (MB_CPMFIL), HL
LD A, (MB_COMAGN)
OR A
JP NZ, MB_ERRCMD
LAB_ram_5f78:
INC A
LAB_ram_5f79:
LD (MB_COMAGN), A
LAB_ram_5f7c:
LD HL, DMA_BUFFER
LD A, (HL)
OR A
LD (MB_CPMFIL), HL
JP Z, MB_ERRCMD
LD B, (HL)
INC HL
MB_TBFLP:
LD A, (HL) ;get DB from buffer
DEC HL
LD (HL), A
INC HL
INC HL
DEC B
JP NZ, MB_TBFLP
DEC HL
MB_ENDCMD:
LD (HL), 0x0
LD (MB_CPMFIL), HL
LD HL, DMA_BUFFER - 1
CALL MB_CHRGTR
OR A
JP Z, MB_ERRCMD
CP SWTCHR
JP Z, MB_FNDSLH
DEC HL
LD (HL), '"'
LD (MB_CPMFIL), HL
INC HL
MB_ISSLH:
CP SWTCHR
JP Z, MB_FNDSLH
CALL MB_CHRGTR
OR A
JP NZ, MB_ISSLH
JP MB_ERRCMD
MB_FNDSLH:
LD (HL), 0x0
CALL MB_CHRGTR
MB_SCANS1:
CALL MB_MAKUPL
CP 'S' ; IS IT /S: ? (SET MAX RECORD SIZE)
JP Z, MB_WASS
CP 'M' ; MEMORY OPTION
PUSH AF
JP Z, MB_WASM
CP 'F' ; FILES OPTION
JP NZ, MB_SNERR
MB_WASM:
CALL MB_CHRGTR
CALL MB_SYNCHR
DB ':'
CALL MB_CNSGET
POP AF
JP Z, MB_MEM
LD A, D
OR A
JP NZ, MB_FCERR
LD A, E
CP 16
JP NC, MB_FCERR
LD (MB_MAXFIL), A
JP MB_FOK
MB_MEM:
EX DE, HL
LD (MB_MEMSIZ), HL
EX DE, HL
MB_FOK:
DEC HL
CALL MB_CHRGTR
JP Z, MB_ERRCMD
CALL MB_SYNCHR
CPL
JP MB_SCANS1
MB_WASS:
CALL MB_CHRGTR
CALL MB_SYNCHR
DB ':'
CALL MB_CNSGET
EX DE, HL
LD (MB_MAXREC), HL
EX DE, HL
JP MB_FOK
MB_ZEROB:
DB 0
MB_COMAGN:
DB 0
MB_ERRCMD:
DEC HL
LD HL, (MB_MEMSIZ)
DEC HL
LD (MB_MEMSIZ), HL
DEC HL
PUSH HL ; MB_STACK-1
; ---------------------------------------------------
; DISK INITIALIZATION ROUTINE
; SETUP FILE INFO BLOCKS
; THE NUMBER OF EACH AND INFORMATION FOR
; GETTING TO POINTERS TO EACH IS STORED. NO LOCATIONS ARE
; INITIALIZED, THIS IS DONE BY NODSKS, FIRST CLOSING ALL FILES.
; THE NUMBER OF FILES IS THE FILE POINTER TABLE
; ---------------------------------------------------
LD A, (MB_MAXFIL)
LD HL, MB_DSKDAT
LD (MB_FILPT1), HL
LD DE, MB_FILPTR
LD (MB_MAXFIL), A
INC A
LD BC, DBLK.C ; DBLK.C SIZE OF A FILE INFO BLOCK PLUS $CODE
MB_LOPFLB:
EX DE, HL
LD (HL), E
INC HL
LD (HL), D
INC HL
EX DE, HL
ADD HL, BC
PUSH HL
LD HL, (MB_MAXREC)
LD BC, FNZBLK ;x FNZBLK
ADD HL, BC
LD B, H
LD C, L
POP HL ; =>MB_STACK-2
DEC A
JP NZ, MB_LOPFLB
MB_HAVFNS:
INC HL
LD (MB_TXTTAB), HL ;= 6040h
LD (MB_SAVSTK), HL
POP DE
LD A, E
SUB L
LD L, A
LD A, D
SBC A, H
LD H, A
JP C, MB_OMERR
LD B, 0x3
MB_SHFLF3:
OR A
LD A, H
RRA
LD H, A
LD A, L
RRA
LD L, A
DEC B
JP NZ, MB_SHFLF3
LD A, H
CP 2
JP C, MB_SMLSTK
LD HL, 512
; SUBTRACT STACK SIZE FROM TOP MEM
MB_SMLSTK:
LD A, E
SUB L
LD L, A
LD A, D
SBC A, H
LD H, A
JP C, MB_OMERR
LD (MB_MEMSIZ), HL
EX DE, HL
LD (MB_TOPMEM), HL ;= 60A3h
LD (MB_FRETOP), HL
LD SP, HL
LD (MB_SAVSTK), HL
LD HL, (MB_TXTTAB) ;= 6040h
EX DE, HL
CALL MB_REASON
LD A, L
SUB E
LD L, A
LD A, H
SBC A, D
LD H, A
DEC HL
DEC HL
PUSH HL
LD HL, MB_HEDING ;= "\r\nBASIC-80 R.5/240\r\n"
CALL MB_STROUT
POP HL
CALL MB_LINPTR
LD HL, MB_WORDS ;= " Bytes free"
CALL MB_STROUT
LD HL, MB_STROUT
LD (MB_REPINI+1), HL
CALL MB_CRDO
LD HL, MB_READYR
JP MB_INITSA
MB_AUTTXT:
DB "\r\n\nOwned by Microsoft\r\n", 0
MB_WORDS:
DB " Bytes free", 0
MB_HEDING:
DB "BASIC-80 Rev. 5.21\r\n[CP/M Version]\r\n"
DB "Copyright 1977-1981 (C) by Microsoft\r\n"
DB "Created: 28-Jul-81\r\n"
DB 0, 0, 0, 0, 0, 0, 0, 0
MB_TSTACK EQU $+63