From 0597056403cddaab119536c47304d329578f8e36 Mon Sep 17 00:00:00 2001 From: Roman Boykov Date: Wed, 26 Aug 2026 12:46:36 +0300 Subject: [PATCH] Source codes for MS Basic-80 for Okean-240.2 (R5 BIOS) --- MB/.vscode/extensions.json | 9 + MB/.vscode/launch.json | 42 + MB/.vscode/tasks.json | 32 + MB/MB_OK240.asm | 15221 +++++++++++++++++++++++++++++++++++ MB/README.md | 27 + MB/equates.inc | 456 ++ MB/mb.com | Bin 0 -> 24576 bytes 7 files changed, 15787 insertions(+) create mode 100644 MB/.vscode/extensions.json create mode 100644 MB/.vscode/launch.json create mode 100644 MB/.vscode/tasks.json create mode 100644 MB/MB_OK240.asm create mode 100644 MB/README.md create mode 100644 MB/equates.inc create mode 100644 MB/mb.com diff --git a/MB/.vscode/extensions.json b/MB/.vscode/extensions.json new file mode 100644 index 0000000..1fdc4e8 --- /dev/null +++ b/MB/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "maziac.asm-code-lens", + "maziac.dezog", + "maziac.hex-hover-converter", + "maziac.z80-instruction-set", + "maziac.sna-fileviewer" + ] +} diff --git a/MB/.vscode/launch.json b/MB/.vscode/launch.json new file mode 100644 index 0000000..999960f --- /dev/null +++ b/MB/.vscode/launch.json @@ -0,0 +1,42 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "dezog", + "request": "launch", + "name": "Simulator - ZX48K Spectrum", + "remoteType": "zsim", + "zsim": { + "visualMemory": true, + "memoryModel": "ZX48K", + "ulaScreen": "spectrum", + "zxKeyboard": "spectrum", + "zxBeeper": true + }, + "sjasmplus": [ + { + "path": "MB_OK240.sld" + } + ], + "commandsAfterLaunch": [], + "history": { + "reverseDebugInstructionCount": 1000000, + "spotCount": 10, + "codeCoverageEnabled": true + }, + "startAutomatically": false, + "rootFolder": "${workspaceFolder}", + + "topOfStack": "stack_top", + + "loadObjs": [ + { "path": "MB_OK240.com", "start": "0x0100" } + ], + "execAddress": "0x0100" + + } + ] +} \ No newline at end of file diff --git a/MB/.vscode/tasks.json b/MB/.vscode/tasks.json new file mode 100644 index 0000000..68615b5 --- /dev/null +++ b/MB/.vscode/tasks.json @@ -0,0 +1,32 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "make MB_OK240 (sjasmplus)", + "type": "shell", + "command": "sjasmplus", + "args": [ + "--exp=MB_OK240.inc", + "--fullpath", + "--nofakes", + "--i8080", + "MB_OK240.asm" + ], + "problemMatcher": { + "owner": "sjasmplus", + "fileLocation": "autoDetect", + "pattern": { + "regexp": "^(.*)\\((\\d+)\\):\\s+(warning|error):\\s+(.*)$", + "file": 1, + "line": 2, + "severity": 3, + "message": 4 + } + }, + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} \ No newline at end of file diff --git a/MB/MB_OK240.asm b/MB/MB_OK240.asm new file mode 100644 index 0000000..f33dc13 --- /dev/null +++ b/MB/MB_OK240.asm @@ -0,0 +1,15221 @@ +; ================================================== +; Source codes for Microsoft Basic for CP/M +; Adapted to Okean 240.2 computer +; Disassembled by Romych and Ghidra +; ================================================== + + 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_1 + 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 MBB_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 + +; --------------------------------------------------- +; Reserved word list +; --------------------------------------------------- +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 "OLO", 'R' OR 0x80, _COLOR + DB "UR", 'S' OR 0x80, _CURS + DB 'L', 'S' OR 0x80, _CLS + 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 "PRIN", 'T' OR 0x80, _GPRINT + 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 "LO", 'T' OR 0x80, _PLOT + 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 "EC", 'T' OR 0x80, _RECT + 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 "CR", 'N' OR 0x80, _SCRN + 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, _VARPT + 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 + +; CP/M Version Number (#0 is 2.x) +MB_CPMVRN: + DB 0 + +; CP/M Read Call +MB_CPMREA: + DB 0 +; CP/M Write Call +MB_CPMWRI: + DB 0 + +MB_RST_INP: + DB ':' + +MB_KBUF: + .318 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, ' ' +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 ' ' + 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 +;0+KBFLEN-3 - GET LENGTH OF KRUNCH BUFFER + LD BC, 315 + 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 ' ' + 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 ' ' + JP NC, MB_NOTRS1 + CP ASCII_TAB + JP Z, MB_NOTRS1 + CP ASCII_LF + JP Z, MB_NOTRS1 + LD A, ' ' +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 + +; --------------------------------------------------- +; Erased code +; SUB _END +; JP C, MB_LET +; CP NUMCMD +; JP C, MB_ISMID_ +; RLC +; LD C, A +; LD B, 0 +; EX DE, HL +; LD HL, STMDSP + + .13 DB 00h + + +MB_CALL_TAB_H: + 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, ' ' + +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, ' ' + 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 _VARPT + 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) +; =================================================== +; FUNCTION +; =================================================== +MB_MAKUPS: + CP 'a' ;'A'+' ' + RET C + CP '{' + RET NC + AND 0x5f + 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 + +MBB_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 [([, ]..)] +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 + +; -------------------------------------------------- +; Extended OK.240 operators +; -------------------------------------------------- +MB_OK240_EXT: + ; Check for Extended operation token range + CP EXT_OP_FIRST + JP C, NOT_EXT_OP + CP EXT_OP_LAST+1 + JP NC, NOT_EXT_OP + + ; Is Ext Op + SUB EXT_OP_FIRST + LD DE, EXT_OP_HANDLERS + JP HNDLE_EXT_OP + +NOT_EXT_OP: + SUB 0x81 + JP C, MB_LET + CP 0x4c + JP NC, MB_ISMID + LD DE, MB_STMDSP ; = 4406h + +HNDLE_EXT_OP: + RLCA + LD C, A + LD B, 0x0 + EX DE, HL + JP MB_CALL_TAB_H + +EXT_OP_HANDLERS: + dw EXT_CLS + dw EXT_SCRN + dw EXT_COLOR + dw EXT_CURS + dw EXT_PLOT + dw EXT_RECT + dw EXT_GPRINT + dw EXT_TONE + +EXT_CLS: + CALL GET_NXT_W + CALL PRN_ASCIIZ + + ; Set mode 40x23 + db ASCII_ESC, "60" + + ; Set specified vmode + db ASCII_ESC, '6', 0 + + LD A, D + OR 0x30 + CALL MB_NOPRIN + EX DE, HL + LD HL, 0x0 + LD (CURS_XY), HL + EX DE, HL + RET + +EXT_GPRINT: + CALL PRN_ASCIIZ + db ASCII_ESC + db '0' + db 0 + PUSH HL + LD HL, (CURS_XY) + EX DE, HL + CALL MB_PRN_WRD + EX DE, HL + POP HL + JP MB_PRINT + +EXT_SCRN: + CALL GET_NXT_PAR + CALL PRN_ASCIIZ + db ASCII_ESC, '8', 0 + LD A, E + AND 0x7 + LD E, A + LD A, D + AND 0x7 + ADD A, A + ADD A, A + ADD A, A + OR E + CALL MB_NOPRIN + RET + +CURS_XY: + DW 0x0000 + +EXT_CURS: + CALL GET_NXT_PAR + EX DE, HL + LD (CURS_XY), HL + EX DE, HL + RET + +EXT_PLOT: + CALL GET_NXT_PAR + CALL PRN_ASCIIZ + db ASCII_ESC, '2', 0 + +HND_LIN_REC: + PUSH HL + LD HL, (CURS_XY) + EX DE, HL + LD (CURS_XY), HL + CALL MB_PRN_WRD + EX DE, HL + CALL MB_PRN_WRD + POP HL + RET + +EXT_RECT: + CALL GET_NXT_PAR + CALL PRN_ASCIIZ + db ASCII_ESC, '1', 0 + JP HND_LIN_REC + +EXT_COLOR: + CALL GET_NXT_W + CALL PRN_ASCIIZ + db ASCII_ESC, '4', 0 + LD A, D + AND 0x7 ; 0..7 + ADD A, '0' + CALL MB_NOPRIN + RET + +MB_LIST_1: + PUSH AF + CALL PRN_ASCIIZ + ; Vmode 64x25 + db ASCII_ESC, "61" + ; Set palette + db ASCII_ESC, '8', 1, 0 + POP AF + JP MB_LIST + +; -------------------------------------------------- +; Not yet implemented +; -------------------------------------------------- +EXT_TONE: + RET + +GET_NXT_PAR: + CALL MB_GETBYT + LD (NXT_TMP_BYT), A + CALL MB_SYNCHR + db ',' + +GET_NXT_W: + CALL MB_GETBYT + LD D, A + LD A, (NXT_TMP_BYT) + LD E, A + RET + +NXT_TMP_BYT: + db 0 + +MB_PRN_WRD: + LD A, E + CALL MB_HEX2BCD + LD A, D + +MB_HEX2BCD: + PUSH AF + RRCA + RRCA + RRCA + RRCA + CALL MB_PRN_NIB + POP AF + +MB_PRN_NIB: + CALL MB_NHEX2BCD + JP MB_NOPRIN + +; --------------------------------------------------- +; Converts hex nibble (0–15) into BCD representation +; --------------------------------------------------- +MB_NHEX2BCD: + AND 0xf + ADD A, 0x90 + DAA + ADC A, 0x40 + DAA + RET + +; --------------------------------------------------- +; Print embeded ASCIIz line +; --------------------------------------------------- +PRN_ASCIIZ: + EX (SP), HL +.PR_NXT_CHAR: + LD A, (HL) + OR A + JP Z, .EOL + CALL MB_NOPRIN + INC HL + JP .PR_NXT_CHAR +.EOL: + ; return after string + INC HL + EX (SP), HL + RET + +; --------------------------------------------------- +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 + +MB_DSKDAT: + DW 0x00 + +; --------------------------------------------------- +; Entry point to init Basic +; --------------------------------------------------- +MB_INIT: + LD HL, MB_STACK ; 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), CPM_RES1 - 1 + 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 [/M:][/F:] +; --------------------------------------------------- + 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 + +MB_TSTACK: + + 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" + +;LAB_ram_609f: + 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 "\r\nBASIC-80 R.5/240\r\n" + DB 0x00, 0x00, 0x7A, 0xFD, 0xFD, 0x12, 0x10, 0xED + DB 0xED, 0x12, 0x12, 0xFD, 0xFD + +MB_STACK EQU $+63 diff --git a/MB/README.md b/MB/README.md new file mode 100644 index 0000000..e71761d --- /dev/null +++ b/MB/README.md @@ -0,0 +1,27 @@ +# Ocean-240.2 MS Basic + +Source codes of Microsoft Basic for Ocean-240.2 computer (BASIC-80 R.5/240). +Based on Microsoft BASIC-80 v5.21. + +- In Z80 mnemonics, but limited for i8080 instruction set. +- I tried to keep the original label names as they are in the source codes published by Microsoft. +- Small bug with cond jump to data table fixed. + +## Extended Ocean-240.2 operators + +* CLS - Clear screen; +* SCRN - Set graphics mode; +* COLOR - Set foreground colors; +* CURS - Move cursor to specified position; +* PLOT - Draw line from cursor pos to specified position; +* RECT - Draw rectangle with diagonal from cursor pos to specified position; +* GPRINT - Print graphics screen to printer; +* TONE - unimplemented; + +## Compile + +Code is located in memory at address: 0x100 + + sjasmplus --sld=MB_OK240.sld --sym=MB_OK240.labels --raw=MB_OK240.obj --fullpath MB_OK240.asm + +To compile sources, use [sjasmplus Z80 assembler](https://github.com/z00m128/sjasmplus). diff --git a/MB/equates.inc b/MB/equates.inc new file mode 100644 index 0000000..95f72ad --- /dev/null +++ b/MB/equates.inc @@ -0,0 +1,456 @@ +; --------------------------------------------------- +; STATEMENTS +; --------------------------------------------------- + +_STMDSP EQU 128 ; 0x80 +_END EQU 129 ; 0x81 +_FOR EQU 130 ; 0x82 +_NEXT EQU 131 ; 0x83 +_DATA EQU 132 ; 0x84 +_INPUT EQU 133 ; 0x85 +_DIM EQU 134 ; 0x86 +_READ EQU 135 ; 0x87 +_LET EQU 136 ; 0x88 +_GOTO EQU 137 ; 0x89 +_RUN EQU 138 ; 0x8a +_IF EQU 139 ; 0x8b +_RESTORE EQU 140 ; 0x8c +_GOSUB EQU 141 ; 0x8d +_RETUR EQU 142 ; 0x8e +_REM EQU 143 ; 0x8f +_STOP EQU 144 ; 0x90 +_PRINT EQU 145 ; 0x91 +_CLEAR EQU 146 ; 0x92 +_LIST EQU 147 ; 0x93 +_NEW EQU 148 ; 0x94 + +; --------------------------------------------------- +; 8K AND ABOVE STATEMENTS +; --------------------------------------------------- + +_ON EQU 149 ; 0x95 +_NULL EQU 150 ; 0x96 +_WAIT EQU 151 ; 0x97 +_DEF EQU 152 ; 0x98 +_POKE EQU 153 ; 0x99 +_CONT EQU 154 ; 0x9A +_CSAVE EQU 155 ; 0x9B +_CLOAD EQU 156 ; 0x9C +_OUT EQU 157 ; 0x9D +_LPRINT EQU 158 ; 0x9E +_LLIST EQU 159 ; 0x9F + +; --------------------------------------------------- +; LEN2 AND ABOVE STATEMENTS +; --------------------------------------------------- + +_WIDTH EQU 161 ; 0xA1 +_ELSE EQU 162 ; 0xA2 +_TRON EQU 163 ; 0xA3 +_TROFF EQU 164 ; 0xA4 +_SWAP EQU 165 ; 0xA5 +_ERASE EQU 166 ; 0xA6 +_EDIT EQU 167 ; 0xA7 +_ERROR EQU 168 ; 0xA8 +_RESUME EQU 169 ; 0xA9 +_DELETE EQU 170 ; 0xAA +_AUTO EQU 171 ; 0xAB +_RENUM EQU 172 ; 0xAC + +; --------------------------------------------------- +; EXTENDED AND ABOVE +; --------------------------------------------------- + +_DEFSTR EQU 173 ; 0xAD +_DEFINT EQU 174 ; 0xAE +_DEFSNG EQU 175 ; 0xAF +_DEFDBL EQU 176 ; 0xB0 +_LINE EQU 177 ; 0xB1 +_WHILE EQU 180 ; 0xB4 +_WEND EQU 181 ; 0xB5 +_CALL EQU 182 ; 0xB6 +_WRITE EQU 183 ; 0xB7 +_COMMON EQU 184 ; 0xB8 +_CHAIN EQU 185 ; 0xB9 +_OPTION EQU 186 ; 0xBA +_RANDOMIZE EQU 187 ; 0xBB + +; --------------------------------------------------- +; DISK AND ABOVE +; --------------------------------------------------- + +_SYSTE EQU 189 ; 0xBD +_OPEN EQU 191 ; 0xBF +_FIELD EQU 192 ; 0xC0 +_GET EQU 193 ; 0xC1 +_PUT EQU 194 ; 0xC2 +_CLOSE EQU 195 ; 0xC3 +_LOAD EQU 196 ; 0xC4 +_MERGE EQU 197 ; 0xC5 +_FILES EQU 198 ; 0xC6 +_NAME EQU 199 ; 0xC7 +_KILL EQU 200 ; 0xC8 +_LSET EQU 201 ; 0xC9 +_RSET EQU 202 ; 0xCA +_SAVE EQU 203 ; 0xCB +_RESET EQU 204 ; 0xCC + +; --------------------------------------------------- +; NCR VERSION ONES. +; --------------------------------------------------- + +_TO EQU 206 ; 0xCE +TOTK EQU 206 + +_THEN EQU 207 ; 0xCF +THENTK EQU 207 + +_TAB EQU 208 ; 0xD0 +TABTK EQU 208 + +_STEP EQU 209 ; 0xD1 +STEPTK EQU 209 ; 0xD1 + +_USR EQU 210 ; 0xD2 +USRTK EQU 210 ; 0xD2 + +; --------------------------------------------------- +; 8K FUNCTIONS +; --------------------------------------------------- + +_FN EQU 211 ; 0xD3 +FNTK EQU 211 + +_SPC EQU 212 ; 0xD4 +SPCTK EQU 212 + +_NOT EQU 213 ; 0xD5 +NOTTK EQU 213 + +; --------------------------------------------------- +; LEN2 TOKENS +; --------------------------------------------------- + +_ERL EQU 214 ; 0xD6 +ERLTK EQU 214 ; 0xD6 + +_ERR EQU 215 ; 0xD7 +ERCTK EQU 215 ; 0xD7 + +; EXTENDED TOKENS + +_STRIN EQU 216 ; 0xD8 + +_USING EQU 217 ; 0xD9 +USINTK EQU 217 ; 0xD9 + +_INSTR EQU 218 ; 0xDA +INSRTK EQU 218 ; 0xDA + +;_DUMMY EQU 219 ; 0xDB +SNGQTK EQU 219 ; 0xDB + +_VARPT EQU 220 ; 0xDC + +; --------------------------------------------------- +; NCR VERSION TOKENS +; SPCDSK TOKENS +; --------------------------------------------------- + +_INKEY EQU 221 ; 0xDD + +; --------------------------------------------------- +; Extended OK-240 operators +; --------------------------------------------------- +EXT_OP_FIRST EQU 224 +_CLS EQU 224 ; 0xE0 +_SCRN EQU 225 ; 0xE1 +_COLOR EQU 226 ; 0xE2 +_CURS EQU 227 ; 0xE3 +_PLOT EQU 228 ; 0xE4 +_RECT EQU 229 ; 0xE5 +_GPRINT EQU 230 ; 0xE6 +_TONE EQU 231 ; 0xE7 +EXT_OP_LAST EQU 231 + + +; --------------------------------------------------- +; OPERATORS +; --------------------------------------------------- + +GREATK EQU 0xef +EQULTK EQU 0xf0 +LESSTK EQU 0xf1 + +PLUSTK EQU 0xf2 ; 242 +MINUTK EQU 0xf3 ; 243 +MULTK EQU 0xf4 ; 244 +DIVTK EQU 0xf5 + +; --------------------------------------------------- +; 8K OPERATORS +; --------------------------------------------------- + +EXPTK EQU 246 ; 0xF6 +_AND EQU 247 ; 0xF7 +_OR EQU 248 ; 0xF8 + +; --------------------------------------------------- +; EXTENDED OPERATORS +; --------------------------------------------------- + +_XOR EQU 249 ; 0xF9 +_EQV EQU 250 ; 0xFA +_IMP EQU 251 ; 0xFB +_MOD EQU 252 ; 0xFC +_DUMMY EQU 253 ; 0xFD +IDIVTK EQU 253 ; 0xFD + +LSTOPK EQU 253 + 1 - PLUSTK + +; --------------------------------------------------- +; FUNCTIONS +; --------------------------------------------------- + +;Q EQU 128 ; 0x80 +_LEFT_ EQU 129 ; 0x81 +ONEFUN EQU 129 ; 0x81 +_RIGHT EQU 130 ; 0x82 + +_MID_ EQU 131 ; 0x83 +MIDTK EQU 131 ; 0x83 + +_SGN EQU 132 ; 0x84 +_INT EQU 133 ; 0x85 +_ABS EQU 134 ; 0x86 + +_SQR EQU 135 ; 0x87 +SQRTK EQU 135 ; 0x87 + +_RND EQU 136 ; 0x88 +_SIN EQU 137 ; 0x89 + +; --------------------------------------------------- +; 8K FUNCTIONS +; --------------------------------------------------- + +_LOG EQU 138 ; 0x8A +_EXP EQU 139 ; 0x8B +_COS EQU 140 ; 0x8C +_TAN EQU 141 ; 0x8D +_ATN EQU 142 ; 0x8E +_FRE EQU 143 ; 0x8F +_INP EQU 144 ; 0x90 +_POS EQU 145 ; 0x91 +_LEN EQU 146 ; 0x92 +_STR_ EQU 147 ; 0x93 +_VAL EQU 148 ; 0x94 +_ASC EQU 149 ; 0x95 +_CHR_ EQU 150 ; 0x96 +_PEEK EQU 151 ; 0x97 +_SPACE EQU 152 ; 0x98 +_OCT_ EQU 153 ; 0x99 +_HEX_ EQU 154 ; 0x9A +_LPOS EQU 155 ; 0x9B +;LASNUM EQU 155 ; 0x9B + +; --------------------------------------------------- +; EXTENDED FUNCTIONS +; --------------------------------------------------- + +_CINT EQU 156 ; 0x9C +_CSNG EQU 157 ; 0x9D +_CDBL EQU 158 ; 0x9E +_FIX EQU 159 ; 0x9F + +; --------------------------------------------------- +; NCR VERSION FUNCTIONS +; DISK FUNCTIONS +; --------------------------------------------------- + +_CVI EQU 171 ; 0xAC +_CVS EQU 172 ; 0xAD +_CVD EQU 173 ; 0xAE +_EOF EQU 175 ; 0xB0 +_LOC EQU 176 ; 0xB1 +_LOF EQU 177 ; 0xB2 +_MKI_ EQU 178 ; 0xB3 +_MKS_ EQU 179 ; 0xB4 +_MKD_ EQU 180 ; 0xB5 + +; --------------------------------------------------- +; END DISK FUNCTIONS +; --------------------------------------------------- + +NUMGFN EQU 2*MIDTK-2*ONEFUN+1 ; 5 + + +; --------------------------------------------------- +; CP/M Entry +; --------------------------------------------------- + +WARM_BOOT EQU 0x0000 +WARM_BOOT_ADDR EQU WARM_BOOT + 1 +BDOS_ENTER EQU 0x0005 +BDOS_ENTER_ADDR EQU BDOS_ENTER + 1 +DMA_BUFFER EQU 0x80 +P_CMD_LINE EQU DMA_BUFFER + 1 +TPA EQU 0x100 ; 256 + +; --------------------------------------------------- +; CP/M functions +; --------------------------------------------------- +C.VER EQU 0x0c ; Get version +C.REST EQU 0x0d ; Init BDOS +C.SDRV EQU 0x0e ; Set current drive +C.OPEN EQU 0x0f ; Open file +C.CLOS EQU 0x10 ; Close file +C.SEAR EQU 0x11 ; Search file +C.SEAR_N EQU 0x12 ; Search next +C.DEL EQU 0x13 ; Delete file +C.MAKE EQU 0x16 ; Create new file +C.RENA EQU 0x17 ; Rename file +C.GDRV EQU 0x19 ; Get current drive +C.BUFF EQU 0x1a ; Set DMA buffer address + + +; --------------------------------------------------- +; OFFSETS INTO CP/M FCB (FILE CONTROL BLOCK) +; --------------------------------------------------- +FCB.FN EQU 1 ; FILE NAME +FCB.FT EQU 9 ; EXTENSION +FCB.EX EQU 32 ; 0x0C ? ; FILE EXTENT +FCB.RC EQU 38 ; 0x0F ? ; RECORD COUNT = CURRENT EXTENT SIZE +FCB.NR EQU 40 ; 0x20 ? ; NEXT RECORD NUMBER +FCB.RN EQU 33 ; CP/M 2.x Random Record Number + +; --------------------------------------------------- +; File access mode +; --------------------------------------------------- +MD.SQI EQU 1 ; seq inp +MD.SQO EQU 2 ; seq out +MD.RND EQU 3 ; random + +N1 EQU 11 ; Number of bytes to use from ATNCON +N2 EQU 13 ; Number of bytes to use from SINCON + +OCTCON EQU 11 ; EMBEDED OCTAL CONSTANT +HEXCON EQU 12 ; EMBEDED CONSTANT +PTRCON EQU 13 ; A LINE REFERENCE CONSTANT +LINCON EQU 14 ; A LINE NUMBER UNCONVERTED TO POINTER +IN2CON EQU 15 ; SINGLE BYTE (TWO BYTE WITH TOKEN) INTEGER +CONCN2 EQU 16 ; TOKEN RETURNED SECOND TYPE CONSTANT IS SCANNED. +ONECON EQU 17 ; FIRST OF 10 (0-9) INTEGER SPECIAL TOKENS +INTCON EQU 28 ; REGULAR 16 BIT TWO'S COMPLEMENT INT +SNGCON EQU 29 ; SINGLE PREC (4 BYTE) CONSTANT +CONCON EQU 30 ; TOKEN RETURNED BY CHRGET AFTER CONSTANT SCANNED +DBLCON EQU 31 ; DOUBLE PREC (8 BYTE) CONSTANT + + +; --------------------------------------------------- +; ASCII codes +; --------------------------------------------------- + +ASCII_BELL EQU 0x07 ; 7 +ASCII_BKSP EQU 0x08 ; 8 +ASCII_TAB EQU 0x09 ; 9 +ASCII_LF EQU 0x0a ; 10 +ASCII_CR EQU 0x0d ; 13 +ASCII_DEL EQU 0x7f ; 127 +ASCII_ESC EQU 0x1b ; +ASCII_SP EQU 0x20 ; space +ASCII_CUR EQU 0x24 ; $ +ASCII_SQ EQU 0x27 ; ' +ASCII_BKSL EQU 0x5C ; \ + +; --------------------------------------------------- +; Key codes +; --------------------------------------------------- + +CTRL_C EQU 0x03 ; 3 +CTRL_O EQU 0x0f ; 15 +CTRL_R EQU 0x12 ; 18 +CTRL_U EQU 0x15 ; 21 +CTRL_X EQU 0x18 ; 24 + + +CLMWID EQU 0x0e ; 14 +CON1 EQU 0x2c20 ; ' ', +CONS1 EQU 0xc6 ; 198 + + +DATPSC EQU 0x80 ; 128 + +; Offsets into file blocks for specific entries +LOCOFS EQU 0x25 ; OFFSET TO CURLOC BYTES +ORNOFS EQU 0x27 ; OFFSET TO NUMBER OF BYTES + +NMLOFS EQU 0x28 ; OFFSET TO BYTES REMAINING IN THE BUFFER +NMLO.C EQU NMLOFS ; OR THE PRINT POSITION ON OUTPUT + +DATOFS EQU 0x29 ; OFFSET TO BUFFER +DATOFC EQU DATOFS + +DBLKSZ EQU DATOFS + DATPSC +DBLK.C EQU DBLKSZ ; SIZE OF A FILE INFO BLOCK PLUS $CODE + +DSKERR EQU 0x31 ; 49 +EOFCHR EQU 0x1a ; 26 + +ERRSN EQU 0x02 ; 2 +ERRRG EQU 0x03 ; 3 +ERROD EQU 0x04 ; 4 +ERRFC EQU 0x05 ; 5 +ERROM EQU 0x07 +ERROV EQU 0x06 ; 6 +ERRUS EQU 0x08 ; 8 +ERRBS EQU 0x09 ; 9 +ERRDD EQU 0x0a ; 10 +ERRDV0 EQU 0x0b ; 11 +ERRID EQU 0x0c ; 12 +ERRTM EQU 0x0d ; 13 +ERRLS EQU 0x0f ; 15 +ERRCN EQU 0x11 ; 17 +ERRRE EQU 0x14 ; 20 +ERRNR EQU 0x13 ; 19 +ERRLBO EQU 0x17 ; 23 +ERRFN EQU 0x1a ; 26 +ERRWH EQU 0x1d ; 29 +ERRWE EQU 0x1e ; 30 +ERRFOV EQU 0x32 ; 50 +ERRIER EQU 0x33 ; 51 +ERRBFN EQU 0x34 ; 52 +ERRFNF EQU 0x35 ; 53 +ERRBFM EQU 0x36 ; 54 +ERRFAO EQU 0x37 ; 55 +ERRIOE EQU 0x39 ; 57 +ERRFAE EQU 0x3a ; 58 +ERRDFL EQU 0x3d ; 61 +ERRRPE EQU 0x3e ; 62 +ERRFDR EQU 0x42 ; 66 +ERRTMF EQU 0x43 ; 67 + +FD.SIZ EQU 0xa9 ; 169 +FD.PHY EQU 0xab ; 171 +FD.LOG EQU 0xad ; 173 +FD.OPS EQU 0xb0 ; 176 +FD.DAT EQU 0xb2 ; 178 + +FNZBLK EQU 0xB2 ; Size of other stuff + +INCSTR EQU 1 + +FORSZC EQU 0x10 ; 16 +KBFLEN EQU 0x13E ; 318 +LINLN EQU 0x50 ; 80 +LSTERR EQU 0x44 ; 68 +MAXPRM EQU 0x20 ; 32 + +NMREL EQU 0x03 ; 3 +NONDSK EQU 0x1e ; 30 +PRMSIZ EQU 0x64 ; 100 +SQO EQU 0x02 ; 2 +SWTCHR EQU 0x2f ; 47 +WHLSIZ EQU 0x06 ; 6 + +CPM_RES1 EQU 0x3B \ No newline at end of file diff --git a/MB/mb.com b/MB/mb.com new file mode 100644 index 0000000000000000000000000000000000000000..380d8b239380eaa4ba6dc0dadc53c25e233656c2 GIT binary patch literal 24576 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