; ============================================================================= ; Source codes for Microsoft Basic-80 v5.21 for CP/M ; ; Disassembled by Romych and Ghidra @2026.08.27 ; I tried to keep the original label names as they ; are in the source codes published by Microsoft. ; ================================================== DEVICE NOSLOT64K SLDOPT COMMENT WPMEM, ASSERTION, LOGPOINT INCLUDE "equates.inc" ;LABELSLIST "mb.label" OUTPUT mb.com ORG 0x0100 ; --------------------------------------------------- ; Entry point ; --------------------------------------------------- START: JP MB_INIT DW MB_FRCINT DW MB_MAKINT INCLUDE "disptab.inc" INCLUDE "reswords.inc" INCLUDE "inidata.inc" ; ================================================== ; Implementations ; ================================================== ; 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, ERRNF DB 1 MB_DDERR: LD E, ERRDD DB 1 MB_UFERR: LD E, ERRUF DB 1 MB_REERR: LD E, ERRRE DB 1 ; =================================================== MB_OVERR: LD E, ERROV DB 1 MB_MOERR: LD E, ERRMO 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, ERRUE + DSKERR - NONDSK MB_NTDER2: SUB 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) CP '?' JP NZ, MB_ERRFN1 POP HL LD HL, MB_ERRTAB JP MB_UPERR MB_ERRFN1: CALL MB_STROUT POP HL LD DE, 0xfffe CALL MB_DCOMPR CALL Z, MB_CRDO JP Z, MB_SYSTME LD A, H AND L INC A CALL NZ, MB_INPRT ;PRINT LINE NUMBER IN [H, L] ;NOW FALL INTO MAIN INTERPRETER LOOP DB 3Eh MB_STPRDY: POP BC MB_READY: CALL MB_FINLPT XOR A LD (MB_CNTOFL), A CALL MB_PRGFIN CALL MB_CRDONZ LD HL, MB_OKTXT ;= "OK\r\n" ;ERRORS IN CP/M INITIALIZATION, RETURN TO CP/M MB_REPINI: CALL WARM_BOOT LD A, (MB_ERRFLG) SUB ERRSN CALL Z, MB_ERREDT MB_MAIN: LD HL, 65535 LD (MB_CURLIN), HL ;= 65534 LD A, (MB_AUTFLG) OR A JP Z, MB_NTAUTO LD HL, (MB_AUTLIN) PUSH HL CALL MB_LINPTR POP DE PUSH DE CALL MB_FNDLIN LD A, '*' JP C, MB_AUTELN LD A, ASCII_SP MB_AUTELN: CALL MB_OUTDO CALL MB_INLIN POP DE JP NC, MB_AUTGOD XOR A LD (MB_AUTFLG), A JP MB_READY MB_AUTRES: XOR A LD (MB_AUTFLG), A JP MB_AUTSTR MB_AUTGOD: LD HL, (MB_AUTINC) ADD HL, DE JP C, MB_AUTRES PUSH DE LD DE, 65529 ;CHECK FOR LINE # TOO BIG CALL MB_DCOMPR POP DE JP NC, MB_AUTRES LD (MB_AUTLIN), HL MB_AUTSTR: LD A, (MB_BUF) OR A JP Z, MB_MAIN JP MB_EDITRT MB_NTAUTO: CALL MB_INLIN JP C, MB_MAIN CALL MB_CHRGTR INC A DEC A JP Z, MB_MAIN PUSH AF CALL MB_LINGET CALL MB_BAKSP LD A, (HL) CP 0x20 CALL Z, MB_INXHRT MB_EDENT: PUSH DE CALL MB_CRUNCH POP DE POP AF LD (MB_SAVTXT), HL JP NC, MB_DIRDO PUSH DE PUSH BC CALL MB_PROCHK CALL MB_CHRGTR OR A PUSH AF EX DE, HL LD (MB_DOT), HL EX DE, HL CALL MB_FNDLIN JP C, MB_LEXIST POP AF PUSH AF JP Z, MB_USERR OR A MB_LEXIST: PUSH BC PUSH AF PUSH HL CALL MB_DEPTR POP HL POP AF POP BC PUSH BC CALL C, MB_DEL ;MB_NO_DEL: POP DE POP AF PUSH DE JP Z,MB_FINI POP DE LD A,(MB_CHNFLG) OR A JP NZ,MB_LEVFRE LD HL,(MB_MEMSIZ) LD (MB_FRETOP),HL MB_LEVFRE: LD HL, (MB_VARTAB) EX (SP), HL POP BC PUSH HL ADD HL, BC PUSH HL CALL MB_BLTU POP HL LD (MB_VARTAB), HL EX DE, HL LD (HL), H POP BC POP DE PUSH HL INC HL INC HL LD (HL), E INC HL LD (HL), D INC HL LD DE, MB_KBUF DEC BC DEC BC DEC BC DEC BC MB_MLOOPR: LD A, (DE) LD (HL), A INC HL INC DE DEC BC LD A, C OR B JP NZ, MB_MLOOPR MB_FINI: POP DE CALL MB_CHEAD LD HL, DMA_BUFFER LD (HL), 0x0 LD (MB_FILPTR), HL LD HL, (MB_PTRFIL) LD (MB_TEMP2), HL CALL MB_RUNC LD HL, (MB_FILPT1) LD (MB_FILPTR),HL LD HL, (MB_TEMP2) LD (MB_PTRFIL), HL JP MB_MAIN ; =================================================== MB_LINKER: LD HL, (MB_TXTTAB) EX DE, HL ; --------------------------------------------------- ; MB_CHEAD GOES THROUGH PROGRAM STORAGE AND FIXES ; UP ALL THE LINKS. THE END OF EACH ; LINE IS FOUND BY SEARCHING FOR THE ZERO AT THE END. ; THE DOUBLE ZERO LINK IS USED TO DETECT THE END OF THE PROGRAM ; --------------------------------------------------- MB_CHEAD: LD H, D LD L, E LD A, (HL) INC HL OR (HL) RET Z INC HL INC HL MB_CZLOOP: INC HL LD A, (HL) MB_CZLOO2: OR A JP Z, MB_CZLIN CP ASCII_SP JP NC, MB_CZLOOP CP 11 JP C, MB_CZLOOP CALL MB_CHRGT2 CALL MB_CHRGTR JP MB_CZLOO2 MB_CZLIN: INC HL EX DE, HL LD (HL), E INC HL LD (HL), D JP MB_CHEAD ; =================================================== MB_SCNLIN: LD DE, 0x0 PUSH DE JP Z, MB_ALLLST POP DE CALL MB_LINSPC PUSH DE JP Z, MB_SNGLIN CALL MB_SYNCHR DB MINUTK MB_ALLLST: LD DE, 65530 CALL NZ, MB_LINSPC JP NZ, MB_SNERR MB_SNGLIN: EX DE, HL POP DE MB_FNDLN1: EX (SP), HL PUSH HL ; =================================================== MB_FNDLIN: LD HL, (MB_TXTTAB) ;MB_TXTTAB MB_FL_LOOP: LD B, H LD C, L LD A, (HL) INC HL OR (HL) DEC HL RET Z INC HL INC HL LD A, (HL) INC HL LD H, (HL) LD L, A CALL MB_DCOMPR LD H, B LD L, C LD A, (HL) INC HL LD H, (HL) LD L, A CCF RET Z CCF RET NC JP MB_FL_LOOP ; -------------------------------------------------- ; FAST CRUNCH - COMPACTIFICATION ; -------------------------------------------------- MB_CRUNCH: XOR A LD (MB_DORES), A LD (MB_OPRTYP), A LD BC, KBFLEN - 3 ; Get length of krunch buffer LD DE, MB_KBUF MB_K_LOOP: LD A, (HL) OR A JP NZ, MB_CR_EMP MB_CRDONE: LD HL, KBFLEN + 2 LD A, L SUB C LD C, A LD A, H SBC A, B LD B, A LD HL, MB_RST_INP ;= ':' XOR A LD (DE), A INC DE LD (DE), A INC DE LD (DE), A RET MB_CR_EMP: CP '"' JP Z, MB_STRNG CP ASCII_SP JP Z, MB_STUFFH LD A, (MB_OPRTYP) OR A LD A, (HL) JP Z, MB_CHK_Q ; -------------------------------------------------- MB_STUFFH: INC HL PUSH AF CALL MB_KRNSAV POP AF SUB ':' JP Z, MB_COLIS CP _DATA - ':' JP NZ, MB_NODATT LD A, 0x1 MB_COLIS: LD (MB_OPRTYP), A LD (MB_DORES), A MB_NODATT: SUB 'U' JP NZ, MB_K_LOOP PUSH AF MB_STR1: LD A, (HL) OR A EX (SP), HL LD A, H POP HL JP Z, MB_CRDONE CP (HL) JP Z, MB_STUFFH MB_STRNG: PUSH AF LD A, (HL) MB_STRNG2: INC HL CALL MB_KRNSAV JP MB_STR1 MB_CHK_Q: CP '?' LD A, _PRINT PUSH DE PUSH BC JP Z, MB_NOTFN2 LD DE, MB_SPCTAB ;= ABh CALL MB_MAKUPL CALL MB_ISLET2 JP C, MB_TSTNUM PUSH HL LD DE, MB_ST_GO ;= "GO " CALL MB_SUB_ADR JP NZ, MB_NOTGOS CALL MB_CHRGTR LD DE, MB_ST_TO CALL MB_SUB_ADR LD A, _GOTO JP Z, MB_DO_GTOSUB LD DE, MB_ST_UB CALL MB_SUB_ADR JP NZ, MB_NOTGOS MB_DO_GTOSUB: LD A, _GOSUB POP BC JP MB_NOTFN2 MB_SUB_ADR: LD A, (DE) OR A RET Z LD C, A CALL MB_MAKUPL CP C RET NZ INC HL INC DE JP MB_SUB_ADR MB_ST_GO: DB "GO ", 0 MB_ST_TO: DB "TO", 0 MB_ST_UB: DB "UB", 0 MB_NOTGOS: POP HL CALL MB_MAKUPL PUSH HL LD HL, MB_ALPTAB ;= 219h SUB 'A' ADD A, A LD C, A LD B, 0x0 ADD HL, BC LD E, (HL) INC HL LD D, (HL) POP HL INC HL MB_TRYAGA: PUSH HL MB_LOPPSI: CALL MB_MAKUPL LD C, A LD A, (DE) AND 0x7f JP Z, MB_NOTRES INC HL CP C JP NZ, MB_LOPSKP LD A, (DE) INC DE OR A JP P, MB_LOPPSI LD A, C CP '(' JP Z, MB_ISRESW LD A, (DE) CP FNTK JP Z, MB_ISRESW CP USRTK JP Z, MB_ISRESW ; ToDo: ref to BYTE_ram_03fd here looks like error! CALL MB_MAKUPL CP '.' JP Z, MB_ISVARS CALL MB_TSTANM MB_ISVARS: LD A, 0 JP NC, MB_NOTRES ; -------------------------------------------------- ; Is reserver word ; -------------------------------------------------- MB_ISRESW: POP AF LD A, (DE) OR A JP M, MB_NOTFNT ; IF MINUS, WASNT FUNCTION TOKEN POP BC POP DE OR 0x80 PUSH AF LD A, 0xff CALL MB_KRNSAV XOR A LD (MB_DORES), A POP AF CALL MB_KRNSAV JP MB_K_LOOP MB_LOPSKP: POP HL MB_LOPSK2: LD A, (DE) INC DE OR A JP P, MB_LOPSK2 INC DE JP MB_TRYAGA MB_NOTFNT: DEC HL MB_NOTFN2: PUSH AF LD DE, MB_ACPT_TOK ; = 8Ch LD C, A MB_NX_TK: LD A, (DE) OR A JP Z, MB_TK_END INC DE CP C JP NZ, MB_NX_TK JP MB_NOTRS2 MB_ACPT_TOK: db _RESTORE db _AUTO db _RENUM db _DELETE db _EDIT db _RESUME db _ERL db _ELSE db _RUN db _LIST db _LLIST db _GOTO db _THEN db _GOSUB db 0 MB_TK_END: XOR A db 0xC2 ; JP NZ, 0x013E MB_NOTRS2: LD A, 0x1 ; SAY LINE #'S ALLOWED MB_NOTRS6: LD (MB_DORES), A POP AF POP BC POP DE CP _ELSE PUSH AF CALL Z, MB_KRNSVC POP AF CP _WHILE JP NZ, MB_NOWLE CALL MB_KRNSAV LD A, PLUSTK MB_NOWLE: CP SNGQTK JP NZ, MB_NTSNGT PUSH AF CALL MB_KRNSVC LD A, _REM CALL MB_KRNSAV POP AF PUSH AF JP MB_STRNG2 MB_TSTNUM: LD A, (HL) CP '.' JP Z, MB_NUMTRY CP '9' + 1 JP NC, MB_SRCSPC CP '0' JP C, MB_SRCSPC MB_NUMTRY: LD A, (MB_DORES) OR A LD A, (HL) POP BC POP DE JP M, MB_STUFFH JP Z, MB_FLTGET CP '.' JP Z, MB_STUFFH LD A, 0x0E CALL MB_KRNSAV PUSH DE CALL MB_LINGET CALL MB_BAKSP MB_SAVINT: EX (SP), HL EX DE, HL MB_SAVI: LD A, L CALL MB_KRNSAV LD A, H MB_POPSTF: POP HL CALL MB_KRNSAV JP MB_K_LOOP MB_FLTGET: PUSH DE PUSH BC LD A, (HL) CALL MB_FIN CALL MB_BAKSP POP BC POP DE PUSH HL LD A, (MB_VALTYP) CP 0x2 JP NZ, MB_NTINTG LD HL, (MB_FACLO) LD A, H OR A LD A, 0x2 JP NZ, MB_NTINTG LD A, L LD H, L LD L, IN2CON CP 10 JP NC, MB_SAVI ADD A, ONECON JP MB_POPSTF MB_NTINTG: PUSH AF RRCA ADD A, INTCON-1 CALL MB_KRNSAV LD HL, MB_FACLO CALL MB_GETYPR JP C, MB_NTDBL LD HL, MB_DFACLO MB_NTDBL: POP AF MB_MOVCON: PUSH AF LD A, (HL) CALL MB_KRNSAV POP AF INC HL DEC A JP NZ, MB_MOVCON POP HL JP MB_K_LOOP MB_SRCSPC: LD DE, MB_ZTAB ;SPCTAB-1 MB_SRCSP2: INC DE LD A, (DE) ;= ABh AND 0x7f JP Z, MB_NOTRS5 INC DE CP (HL) LD A, (DE) ;= F2h JP NZ, MB_SRCSP2 JP MB_NOTRS1 MB_NTSNGT: CP '&' ; Octal const? JP NZ, MB_STUFFH PUSH HL CALL MB_CHRGTR POP HL CALL MB_MAKUPS CP 'H' LD A, OCTCON JP NZ, MB_WUZOCT LD A, HEXCON MB_WUZOCT: CALL MB_KRNSAV PUSH DE PUSH BC CALL MB_OCTCNS POP BC JP MB_SAVINT MB_KRNSVC: LD A, ':' MB_KRNSAV: LD (DE), A INC DE DEC BC LD A, C OR B RET NZ MB_LBOERR: LD E, ERRLBO JP MB_ERROR MB_NOTRES: POP HL DEC HL DEC A LD (MB_DORES), A POP BC POP DE CALL MB_MAKUPL MB_KRNVAR: CALL MB_KRNSAV INC HL CALL MB_MAKUPL CALL MB_ISLET2 JP NC, MB_KRNVAR CP ':' JP NC, MB_JKLOOP CP '0' JP NC, MB_KRNVAR CP '.' JP Z, MB_KRNVAR MB_JKLOOP: JP MB_K_LOOP MB_NOTRS5: LD A, (HL) CP ASCII_SP JP NC, MB_NOTRS1 CP ASCII_TAB JP Z, MB_NOTRS1 CP ASCII_LF JP Z, MB_NOTRS1 LD A, ASCII_SP MB_NOTRS1: PUSH AF LD A, (MB_DORES) INC A JP Z, MB_JNTRS6 DEC A MB_JNTRS6: JP MB_NOTRS6 MB_BAKSP: DEC HL LD A, (HL) CP ASCII_SP JP Z, MB_BAKSP CP ASCII_TAB JP Z, MB_BAKSP CP ASCII_LF JP Z, MB_BAKSP INC HL RET ; =================================================== ; "FOR" STATEMENT ; =================================================== MB_FOR: LD A, 100 LD (MB_SUBFLG), A CALL MB_PTRGET CALL MB_SYNCHR DB EQULTK PUSH DE EX DE, HL LD (MB_TEMP), HL EX DE, HL LD A, (MB_VALTYP) PUSH AF CALL MB_FRMEVL POP AF PUSH HL CALL MB_DOCNVF LD HL, MB_FVALSV CALL MB_MOVMF POP HL POP DE POP BC PUSH HL CALL MB_DATAS LD (MB_ENDFOR), HL LD HL, 0x2 ADD HL, SP MB_LPFORM: CALL MB_LOOPER JP NZ, MB_NOTOL ADD HL, BC PUSH DE DEC HL LD D, (HL) DEC HL LD E, (HL) INC HL INC HL PUSH HL LD HL, (MB_ENDFOR) CALL MB_DCOMPR POP HL POP DE JP NZ, MB_LPFORM POP DE LD SP, HL LD (MB_SAVSTK), HL DB 0Eh MB_NOTOL: POP DE EX DE, HL LD C, 0x8 CALL MB_GETSTK PUSH HL LD HL, (MB_ENDFOR) EX (SP), HL PUSH HL LD HL, (MB_CURLIN) ;= 65534 EX (SP), HL CALL MB_SYNCHR DB _TO CALL MB_GETYPR JP Z, MB_TMERR JP NC, MB_TMERR PUSH AF CALL MB_FRMEVL POP AF PUSH HL JP P, MB_SNGFOR CALL MB_FRCINT EX (SP), HL LD DE, 0x1 LD A, (HL) CP STEPTK CALL Z, MB_GETINT PUSH DE PUSH HL EX DE, HL CALL MB_ISIGN JP MB_STPSGN MB_SNGFOR: CALL MB_FRCSNG CALL MB_MOVRF POP HL PUSH BC PUSH DE LD BC, 0x8100 LD D, C LD E, D LD A, (HL) CP STEPTK LD A, 0x1 JP NZ, MB_ONEON CALL MB_FRMCHK PUSH HL CALL MB_FRCSNG CALL MB_MOVRF CALL MB_SIGN MB_STPSGN: POP HL MB_ONEON: PUSH BC PUSH DE LD C, A CALL MB_GETYPR LD B, A PUSH BC DEC HL CALL MB_CHRGTR JP NZ, MB_SNERR CALL MB_NXTSCN CALL MB_CHRGTR PUSH HL PUSH HL LD HL, (MB_NXTLIN) LD (MB_CURLIN), HL ;= 65534 LD HL, (MB_TEMP) EX (SP), HL LD B, _FOR PUSH BC INC SP PUSH AF PUSH AF JP MB_NEXTS MB_NXTCON: LD B, _FOR PUSH BC INC SP ; =================================================== ; NEW STATEMENT FETCHER ; =================================================== MB_NEWSTT: PUSH HL MB_CONST2: CTC_ADDR2 EQU $+1 CALL WARM_BOOT POP HL OR A CALL NZ, MB_CNTCCN LD (MB_SAVTXT), HL EX DE, HL LD HL, 0x0 ADD HL, SP LD (MB_SAVSTK), HL EX DE, HL LD A, (HL) CP ':' JP Z, MB_GONE OR A JP NZ, MB_SNERR INC HL MB_GONE4: LD A, (HL) INC HL OR (HL) JP Z, MB_PRGEND INC HL LD E, (HL) INC HL LD D, (HL) EX DE, HL LD (MB_CURLIN), HL ;= 65534 LD A, (MB_TRCFLG) OR A JP Z, MB_NOTTRC PUSH DE LD A, '[' CALL MB_OUTDO CALL MB_LINPTR LD A, ']' CALL MB_OUTDO POP DE MB_NOTTRC: EX DE, HL MB_GONE: CALL MB_CHRGTR LD DE, MB_NEWSTT PUSH DE MB_GONE3: RET Z MB_GONE2: ; ; OK240 Mod ; NOP ; NOP ; JP MB_OK240_EXT SUB _END JP C, MB_LET CP NUMCMD JP NC, MB_ISMID RLCA LD C, A LD B, 0 EX DE, HL LD HL, MB_STMDSP ADD HL, BC LD C, (HL) INC HL LD B, (HL) PUSH BC EX DE, HL ; =================================================== ; CHRGET - THE NEXT CHARACTER SCAN ROUTINE ; =================================================== MB_CHRGTR: INC HL MB_CHRGT2: LD A, (HL) CP ':' RET NC ; =================================================== ; CHRCON IS THE CONTINUATION OF THE CHRGET RST ; =================================================== MB_CHRCON: CP ASCII_SP JP Z, MB_CHRGTR JP NC, MB_NOTLFT OR A RET Z CP OCTCON JP C, MB_NOTCON CP CONCON JP NZ, MB_NTRSCC LD A, (MB_CONSAV) OR A RET MB_NTRSCC: CP CONCN2 JP Z, MB_NTRSC2 PUSH AF INC HL LD (MB_CONSAV), A SUB INTCON JP NC, MB_MAKTKN SUB 0xf5 ; (ONECON-INTCON) & ^O377 JP NC, MB_ONEI CP 0xfe ; IN2CON-ONECON JP NZ, MB_FRCINC LD A, (HL) INC HL MB_ONEI: LD (MB_CONTXT), HL LD H, 0x0 MB_ONEI2: LD L, A LD (MB_CONLO), HL LD A, 0x2 LD (MB_CONTYP), A LD HL, MB_NUMCON ;= 1Eh POP AF OR A RET MB_FRCINC: LD A, (HL) INC HL INC HL LD (MB_CONTXT), HL DEC HL LD H, (HL) JP MB_ONEI2 MB_RETOKN: CALL MB_CONFAC MB_NTRSC2: LD HL, (MB_CONTXT) JP MB_CHRGT2 MB_MAKTKN: INC A RLCA LD (MB_CONTYP), A PUSH DE PUSH BC LD DE, MB_CONLO EX DE, HL LD B, A CALL MB_MOVE1 EX DE, HL POP BC POP DE LD (MB_CONTXT), HL POP AF LD HL, MB_NUMCON ;= 1Eh OR A RET MB_NOTCON: CP ASCII_TAB JP NC, MB_CHRGTR MB_NOTLFT: CP '0' CCF INC A DEC A RET MB_NUMCON: DB CONCON DB CONCN2 ; =================================================== MB_CONFAC: LD A, (MB_CONSAV) CP 0xf JP NC, MB_NTLINE CP 0xd JP C, MB_NTLINE LD HL, (MB_CONLO) JP NZ, MB_FLTLIN INC HL INC HL INC HL LD E, (HL) INC HL LD D, (HL) EX DE, HL MB_FLTLIN: JP MB_INEG2 MB_NTLINE: LD A, (MB_CONTYP) LD (MB_VALTYP), A CP 0x8 JP Z, MB_CONFDB LD HL, (MB_CONLO) LD (MB_FACLO), HL LD HL, (MB_CONLO + 2) LD (MB_FAC - 1), HL RET MB_CONFDB: LD HL, MB_CONLO JP MB_VMOVFM ; =================================================== ; DEFSTR, DEFINT, DEFSNG, DEFDBL, INTIDX ; =================================================== MB_DEFSTR: LD E, 0x3 ; DEFAULT SOME LETTERS TO STRING DB 1 MB_DEFINT: LD E, 0x2 DB 1 MB_DEFREA: LD E, 0x4 DB 1 MB_DEFDBL: LD E, 0x8 MB_DEFCON: CALL MB_ISLET LD BC, MB_SNERR PUSH BC RET C SUB 'A' LD C, A LD B, A CALL MB_CHRGTR CP MINUTK JP NZ, MB_NOTRNG CALL MB_CHRGTR CALL MB_ISLET RET C SUB 'A' LD B, A CALL MB_CHRGTR MB_NOTRNG: LD A, B SUB C RET C INC A EX (SP), HL LD HL, MB_DEFTBL LD B, 0x0 ADD HL, BC MB_LPDCHG: LD (HL), E INC HL DEC A JP NZ, MB_LPDCHG POP HL LD A, (HL) CP ',' RET NZ CALL MB_CHRGTR JP MB_DEFCON ; -------------------------------------------------- ; READS A FORMULA FROM THE CURRENT POSITION AND ; TURNS IT INTO A POSITIVE INTEGER ; LEAVING THE RESULT IN [DE]. NEGATIVE ARGUMENTS ; ARE NOT ALLOWED. [HL] POINTS TO THE TERMINATING ; CHARACTER OF THE FORMULA ON RETURN. ; -------------------------------------------------- MB_INTIDX: CALL MB_CHRGTR MB_INTIDX2: CALL MB_GETIN2 RET P ; =================================================== MB_FCERR: LD E, ERRFC JP MB_ERROR MB_LINSPC: LD A, (HL) CP '.' EX DE, HL LD HL, (MB_DOT) EX DE, HL JP Z, MB_CHRGTR ; =================================================== MB_LINGET: DEC HL MB_LINGT2: CALL MB_CHRGTR CP LINCON JP Z, MB_LINGT3 CP PTRCON ; =================================================== MB_LINGT3: EX DE, HL LD HL, (MB_CONLO) EX DE, HL JP Z, MB_CHRGTR XOR A LD (MB_CONSAV), A DEC HL LD DE, 0x0 MB_MORLIN: CALL MB_CHRGTR RET NC PUSH HL PUSH AF LD HL, 0x1998 CALL MB_DCOMPR JP C, MB_POPHSR LD H, D LD L, E ADD HL, DE ADD HL, HL ADD HL, DE ADD HL, HL POP AF SUB '0' LD E, A LD D, 0x0 ADD HL, DE EX DE, HL POP HL JP MB_MORLIN MB_POPHSR: POP AF POP HL RET MB_RUN: JP Z, MB_RUNC CP LINCON JP Z, MB_CONRUN CP PTRCON JP NZ, MB_LRUN MB_CONRUN: CALL MB_CLEARC LD BC, MB_NEWSTT JP MB_RUNC2 MB_GOSUB: LD C, 3 CALL MB_GETSTK CALL MB_LINGET POP BC PUSH HL PUSH HL LD HL, (MB_CURLIN) ;= 65534 EX (SP), HL LD A, _GOSUB PUSH AF INC SP PUSH BC JP MB_GOTO2 MB_RUNC2: PUSH BC MB_GOTO: CALL MB_LINGET MB_GOTO2: LD A, (MB_CONSAV) CP PTRCON EX DE, HL RET Z CP LINCON JP NZ, MB_SNERR EX DE, HL PUSH HL LD HL, (MB_CONTXT) EX (SP), HL CALL MB_REM INC HL PUSH HL LD HL, (MB_CURLIN) ;= 65534 CALL MB_DCOMPR POP HL CALL C, MB_FL_LOOP CALL NC, MB_FNDLIN JP NC, MB_USERR DEC BC LD A, PTRCON LD (MB_PTRFLG), A POP HL CALL MB_CONCH2 LD H, B LD L, C RET MB_USERR: LD E, ERRUS JP MB_ERROR MB_RETURN: RET NZ LD D, 255 CALL MB_FNDFOR LD SP, HL LD (MB_SAVSTK), HL CP _GOSUB LD E, ERRRG JP NZ, MB_ERROR POP HL LD (MB_CURLIN), HL ;= 65534 LD HL, MB_NEWSTT EX (SP), HL DB 3Eh MB_DATAH: POP HL MB_DATAS: DB 1 DB ':' MB_REM: LD C, 0x0 MB_REMZER: LD B, 0x0 MB_EXCHQT: LD A, C LD C, B LD B, A MB_REMER: DEC HL MB_REMER1: CALL MB_CHRGTR OR A RET Z CP B RET Z INC HL CP '"' JP Z, MB_EXCHQT INC A JP Z, MB_REMER1 SUB _IF+1 JP NZ, MB_REMER CP B ADC A, D LD D, A JP MB_REMER ; =================================================== ; LET ; =================================================== MB_LETCON: POP AF ADD A, 0x3 JP MB_LETCN2 MB_LET: CALL MB_PTRGET CALL MB_SYNCHR DB EQULTK ; CHECK FOR "=" EX DE, HL ; MUST SET UP TEMP FOR "FOR" LD (MB_TEMP), HL EX DE, HL PUSH DE LD A, (MB_VALTYP) PUSH AF CALL MB_FRMEVL POP AF MB_LETCN2: EX (SP), HL MB_INPCOM: LD B, A LD A, (MB_VALTYP) CP B LD A, B JP Z, MB_LETCN5 CALL MB_DOCNVF MB_LETCN4: LD A, (MB_VALTYP) MB_LETCN5: LD DE, MB_FACLO CP 0x5 JP C, MB_LETCN6 LD DE, MB_DFACLO MB_LETCN6: PUSH HL CP 0x3 JP NZ, MB_COPNUM LD HL, (MB_FACLO) PUSH HL INC HL LD E, (HL) INC HL LD D, (HL) LD HL, (MB_TXTTAB) ;= 6040h CALL MB_DCOMPR JP NC, MB_INBUFC LD HL, (MB_STREND) CALL MB_DCOMPR POP DE JP NC, MB_DNTCPY LD HL, MB_DSCTMP CALL MB_DCOMPR JP NC, MB_DNTCPY DB 0x3E MB_INBUFC: POP DE CALL MB_FRETMS EX DE, HL CALL MB_STRCPY MB_DNTCPY: CALL MB_FRETMS EX (SP), HL MB_COPNUM: CALL MB_VMOVE POP DE POP HL RET ; =================================================== ; ON..GOTO, ON ERROR GOTO CODE ; =================================================== MB_ONGOTO: CP _ERROR JP NZ, MB_NTOERR CALL MB_CHRGTR CALL MB_SYNCHR DB _GOTO CALL MB_LINGET LD A, D OR E JP Z, MB_RESTRP CALL MB_FNDLN1 LD D, B LD E, C POP HL JP NC, MB_USERR MB_RESTRP: EX DE, HL LD (MB_ONELIN), HL EX DE, HL RET C LD A, (MB_ONEFLG) OR A LD A, E RET Z LD A, (MB_ERRFLG) LD E, A JP MB_ERRESM MB_NTOERR: CALL MB_GETBYT LD A, (HL) LD B, A CP _GOSUB JP Z, MB_ISGOSU CALL MB_SYNCHR DB _GOTO DEC HL MB_ISGOSU: LD C, E MB_LOOPON: DEC C LD A, B JP Z, MB_GONE2 CALL MB_LINGT2 CP ',' RET NZ JP MB_LOOPON MB_RESUME: LD DE, MB_ONEFLG LD A, (DE) OR A JP Z, MB_REERR INC A LD (MB_ERRFLG), A LD (DE), A LD A, (HL) CP _NEXT JP Z, MB_RESNXT CALL MB_LINGET RET NZ LD A, D OR E JP NZ, MB_GOTO2 INC A JP MB_RESTXT MB_RESNXT: CALL MB_CHRGTR RET NZ MB_RESTXT: LD HL, (MB_ERRTXT) EX DE, HL LD HL, (MB_ERRLIN) LD (MB_CURLIN), HL ;= 65534 EX DE, HL RET NZ LD A, (HL) OR A JP NZ, MB_NOTBGL INC HL INC HL INC HL INC HL MB_NOTBGL: INC HL JP MB_DATAS MB_ERRORS: CALL MB_GETBYT RET NZ OR A JP Z, MB_FCERR JP MB_ERROR MB_AUTO: LD DE, 10 PUSH DE JP Z, MB_SNGAUT CALL MB_LINSPC EX DE, HL EX (SP), HL JP Z, MB_SNGAU1 EX DE, HL CALL MB_SYNCHR DB ',' EX DE, HL LD HL, (MB_AUTINC) EX DE, HL JP Z, MB_SNGAUT CALL MB_LINGET JP NZ, MB_SNERR MB_SNGAUT: EX DE, HL MB_SNGAU1: LD A, H OR L JP Z, MB_FCERR LD (MB_AUTINC), HL LD (MB_AUTFLG), A POP HL LD (MB_AUTLIN), HL POP BC JP MB_MAIN ;IF ... THEN code MB_IFS: CALL MB_FRMEVL LD A, (HL) CP ',' CALL Z, MB_CHRGTR CP _GOTO JP Z, MB_OKGOTO CALL MB_SYNCHR DB THENTK DEC HL MB_OKGOTO: PUSH HL CALL MB_VSIGN POP HL JP Z, MB_FALSIF MB_DOCOND: CALL MB_CHRGTR RET Z CP LINCON JP Z, MB_GOTO CP PTRCON JP NZ, MB_GONE2 LD HL, (MB_CONLO) RET MB_FALSIF: LD D, 0x1 MB_SKPMRF: CALL MB_DATAS OR A RET Z CALL MB_CHRGTR CP _ELSE JP NZ, MB_SKPMRF DEC D JP NZ, MB_SKPMRF JP MB_DOCOND MB_LPRINT: LD A, 0x1 LD (MB_PRTFLG), A JP MB_NEWCHAR MB_PRINT: LD C, 0x2 CALL MB_FILGET MB_NEWCHAR: DEC HL CALL MB_CHRGTR CALL Z, MB_CRDO MB_PRINTC: JP Z, MB_FINPRT CP USINTK JP Z, MB_PRINUS CP TABTK JP Z, MB_TABER CP SPCTK JP Z, MB_TABER PUSH HL CP ',' JP Z, MB_COMPRT CP ';' JP Z, MB_NOTABR POP BC CALL MB_FRMEVL PUSH HL CALL MB_GETYPR JP Z, MB_STRDON CALL MB_FOUT CALL MB_STRLIT LD (HL), ASCII_SP LD HL, (MB_FACLO) INC (HL) MB_STRDON: CALL MB_PTRFILZ JP NZ, MB_LINCH2 LD HL, (MB_FACLO) LD A, (MB_PRTFLG) OR A JP Z, MB_ISTTY LD A, (MB_LPTSIZ) ;= 132 LD B, A INC A JP Z, MB_LINCH2 LD A, (MB_LPTPOS) OR A JP Z, MB_LINCH2 ADD A, (HL) CCF JP NC, MB_LINCHK DEC A CP B JP MB_LINCHK MB_ISTTY: LD A, (MB_LINLEN) ;= 80 LD B, A INC A JP Z, MB_LINCH2 LD A, (MB_TTYPOS) OR A JP Z, MB_LINCH2 ADD A, (HL) CCF JP NC, MB_LINCHK DEC A CP B MB_LINCHK: CALL NC, MB_CRDO MB_LINCH2: CALL MB_STRPRT POP HL JP MB_NEWCHAR MB_COMPRT: LD BC, NMLO.C LD HL, (MB_PTRFIL) ADD HL, BC CALL MB_PTRFILZ LD A, (HL) JP NZ, MB_MORCOM LD A, (MB_PRTFLG) OR A JP Z, ISCTTY LD A, (MB_NLPPOS) ;= 112 LD B, A INC A LD A, (MB_LPTPOS) JP Z, MB_MORCOM CP B JP MB_CHKCOM ISCTTY: LD A, (MB_CLMLST) ;= 56 LD B, A LD A, (MB_TTYPOS) CP 0xff JP Z, MB_MORCOM CP B MB_CHKCOM: CALL NC, MB_CRDO JP NC, MB_NOTABR MB_MORCOM: SUB CLMWID JP NC, MB_MORCOM CPL JP MB_ASPA2 ; -------------------------------------------------- ; TAB or SPC fn ; -------------------------------------------------- MB_TABER: PUSH AF CALL MB_CHRGTR CALL MB_GETIN2 POP AF PUSH AF CP SPCTK JP Z, MB_SPCNDC DEC DE MB_SPCNDC: LD A, D OR A JP P, MB_TBNONG LD DE, 0x0000 MB_TBNONG: PUSH HL CALL MB_PTRFILZ JP NZ, MB_LNOMOD LD A, (MB_PRTFLG) OR A LD A, (MB_LPTSIZ) ;= 132 JP NZ, MB_LPTMDF LD A, (MB_LINLEN) ;= 80 MB_LPTMDF: LD L, A INC A JP Z, MB_LNOMOD LD H, 0x0 CALL MB_IMOD EX DE, HL MB_LNOMOD: POP HL CALL MB_SYNCHR DB ')' DEC HL POP AF SUB SPCTK PUSH HL JP Z, MB_DOSIZT LD BC, NMLO.C LD HL, (MB_PTRFIL) ADD HL, BC CALL MB_PTRFILZ LD A, (HL) JP NZ, MB_DOSIZT LD A, (MB_PRTFLG) OR A JP Z, MB_TTYIST LD A, (MB_LPTPOS) JP MB_DOSIZT MB_TTYIST: LD A, (MB_TTYPOS) MB_DOSIZT: CPL ADD A, E JP C, MB_ASPA2 INC A JP Z, MB_NOTABR CALL MB_CRDO LD A, E DEC A JP M, MB_NOTABR MB_ASPA2: INC A MB_ASPAC: LD B, A LD A, ASCII_SP MB_REPOUT: CALL MB_OUTDO DEC B JP NZ, MB_REPOUT MB_NOTABR: POP HL CALL MB_CHRGTR JP MB_PRINTC ; =================================================== MB_FINPRT: XOR A LD (MB_PRTFLG), A PUSH HL LD H, A LD L, A LD (MB_PTRFIL), HL POP HL RET MB_LINE: CALL MB_SYNCHR DB _INPUT CP '#' JP Z, MB_DLINE CALL MB_SCNSEM CALL MB_QTINP CALL MB_PTRGET CALL MB_CHKSTR PUSH DE PUSH HL CALL MB_SINLIN POP DE POP BC JP C, MB_STPEND PUSH BC PUSH DE LD B, 0x0 CALL MB_STRLT3 POP HL LD A, 0x3 JP MB_LETCN2 MB_TRYAGN: DB "?Redo from start\r\n",0 MB_SCNSTR: INC HL LD A, (HL) OR A JP Z, MB_SNERR CP '"' JP NZ, MB_SCNSTR JP MB_SCNCON MB_INPBAK: POP HL POP HL JP MB_RDOIN2 MB_TRMNOK: LD A, (MB_FLGINP) OR A JP NZ, MB_DATSNE MB_RDOIN2: POP BC LD HL, MB_TRYAGN ;= "?Redo from start" CALL MB_STROUT LD HL, (MB_SAVTXT) RET MB_FILSTI: CALL MB_FILINP PUSH HL LD HL, MB_BUFMIN ;= 44 JP MB_INPCN3 MB_INPUT: CP '#' JP Z, MB_FILSTI CALL MB_SCNSEM LD BC, MB_NOTQTI PUSH BC MB_QTINP: CP '"' LD A, 0x0 LD (MB_CNTOFL), A LD A, 0xff LD (MB_TEMPA+1), A RET NZ CALL MB_STRLTI LD A, (HL) CP ',' JP NZ, MB_NTICMA XOR A LD (MB_TEMPA+1), A CALL MB_CHRGTR JP MB_INPCMA MB_NTICMA: CALL MB_SYNCHR DB ';' MB_INPCMA: PUSH HL CALL MB_STRPRT POP HL RET MB_NOTQTI: PUSH HL MB_GETAGN: LD A, (MB_TEMPA+1) OR A JP Z, MB_SUPPRS LD A, '?' CALL MB_OUTDO LD A, ASCII_SP CALL MB_OUTDO MB_SUPPRS: CALL MB_SINLIN POP BC JP C, MB_STPEND PUSH BC XOR A LD (MB_FLGINP), A LD (HL), ',' EX DE, HL POP HL PUSH HL PUSH DE PUSH DE DEC HL MB_VARLOP: LD A, 0x80 LD (MB_SUBFLG), A CALL MB_CHRGTR CALL MB_NVRFIL LD A, (HL) DEC HL CP '[' JP Z, MB_IS_ARR CP '(' JP NZ, MB_ENDSCN MB_IS_ARR: INC HL LD B, 0x0 MB_SCNOPN: INC B MB_SCNCON: CALL MB_CHRGTR JP Z, MB_SNERR CP '"' JP Z, MB_SCNSTR CP '(' JP Z, MB_SCNOPN CP '[' JP Z, MB_SCNCON CP ']' JP Z, MB_ARR_CLOS CP ')' JP NZ, MB_SCNCON MB_ARR_CLOS: DEC B JP NZ, MB_SCNCON MB_ENDSCN: CALL MB_CHRGTR JP Z, MB_OKVLST CP ',' JP NZ, MB_SNERR MB_OKVLST: EX (SP), HL LD A, (HL) CP ',' JP NZ, MB_INPBAK LD A, 0x1 LD (MB_OVCSTR), A CALL SCNVAL LD A, (MB_OVCSTR) DEC A JP NZ, MB_INPBAK PUSH HL CALL MB_GETYPR CALL Z, MB_FREFAC POP HL DEC HL CALL MB_CHRGTR EX (SP), HL LD A, (HL) CP ',' JP Z, MB_VARLOP POP HL DEC HL CALL MB_CHRGTR OR A POP HL JP NZ, MB_RDOIN2 MB_INPCN3: LD (HL), ',' ; = 44 JP MB_INPCON MB_READ: PUSH HL LD HL, (MB_DATPTR) DB 0xF6 ; OR i MB_INPCON: XOR A LD (MB_FLGINP), A EX (SP), HL JP MB_LOPDAT MB_LOPDT2: CALL MB_SYNCHR DB ',' MB_LOPDAT: CALL MB_PTRGET EX (SP), HL PUSH DE LD A, (HL) ;= 44 CP ',' JP Z, MB_DATBK LD A, (MB_FLGINP) OR A JP NZ, MB_DATLOP MB_DATBK: DB 0xF6 ; SET A NON-ZERO SCNVAL: XOR A LD (MB_INPPAS), A CALL MB_PTRFILZ JP NZ, MB_FILIND CALL MB_GETYPR PUSH AF JP NZ, MB_NUMINS CALL MB_CHRGTR LD D, A LD B, A CP '"' JP Z, MB_NOWGET LD A, (MB_FLGINP) OR A LD D, A JP Z, MB_NCOLST LD D, ':' MB_NCOLST: LD B, ',' DEC HL MB_NOWGET: CALL MB_STRLT2 MB_DOASIG: POP AF ADD A, 0x3 LD C, A LD A, (MB_INPPAS) OR A RET Z LD A, C EX DE, HL LD HL, MB_STRDN2 EX (SP), HL PUSH DE JP MB_INPCOM MB_NUMINS: CALL MB_CHRGTR POP AF PUSH AF LD BC, MB_DOASIG PUSH BC JP C, MB_FIN JP MB_FINDBL MB_STRDN2: DEC HL CALL MB_CHRGTR JP Z, MB_TRMOK CP ',' JP NZ, MB_TRMNOK MB_TRMOK: EX (SP), HL DEC HL CALL MB_CHRGTR JP NZ, MB_LOPDT2 POP DE LD A, (MB_FLGINP) OR A EX DE, HL JP NZ, MB_RESFIN PUSH DE POP HL JP MB_FINPRT MB_DATLOP: CALL MB_DATAS OR A JP NZ, MB_NOWLIN INC HL LD A, (HL) INC HL OR (HL) LD E, ERROD JP Z, MB_ERROR INC HL LD E, (HL) INC HL LD D, (HL) EX DE, HL LD (MB_DATLIN), HL EX DE, HL MB_NOWLIN: CALL MB_CHRGTR CP _DATA JP NZ, MB_DATLOP JP MB_DATBK ; =================================================== MB_FRMEQL: CALL MB_SYNCHR DB EQULTK JP MB_FRMEVL MB_FRMPRN: CALL MB_SYNCHR DB '(' ; -------------------------------------------------- ; EVALUATE A FORMULA ; -------------------------------------------------- MB_FRMEVL: DEC HL MB_FRMCHK: LD D, 0x0 ; ================================================== MB_LPOPER: PUSH DE LD C, 0x1 CALL MB_GETSTK CALL MB_EVAL XOR A LD (MB_FLGOVC), A MB_TSTOP: LD (MB_TEMP2), HL MB_RETAOP: LD HL, (MB_TEMP2) POP BC LD A, (HL) LD (MB_TEMP3), HL CP GREATK RET C CP LESSTK+1 JP C, MB_DORELS SUB PLUSTK LD E, A JP NZ, MB_NTPLUS ; not + LD A, (MB_VALTYP) CP 0x3 LD A, E JP Z, MB_CAT MB_NTPLUS: CP LSTOPK ; last op? RET NC LD HL, MB_OPTAB LD D, 0x0 ADD HL, DE LD A, B LD D, (HL) ; op precedence in D, old in A CP D RET NC ; ret if old op has precedence ; else new op PUSH BC LD BC, MB_RETAOP ; return after op PUSH BC ; on stack LD A, D CP 127 ; new has precedence 127? JP Z, MB_EXPSTK ; make special stack entry CP 81 ; Op is "AND" or "OR"? JP C, MB_ANDORD AND 0xfe ; 0x7A, 0x7B -> 0x7A CP 122 ; 0x7A? JP Z, MB_ANDORD MB_NUMREL: LD HL, MB_FACLO LD A, (MB_VALTYP) SUB 0x3 JP Z, MB_TMERR OR A LD C, (HL) INC HL LD B, (HL) PUSH BC JP M, MB_VPUSHD INC HL LD C, (HL) INC HL LD B, (HL) PUSH BC JP PO, MB_VPUSHD LD HL, MB_DFACLO LD C, (HL) INC HL LD B, (HL) INC HL PUSH BC LD C, (HL) INC HL LD B, (HL) PUSH BC MB_VPUSHD: ADD A, 0x3 LD C, E LD B, A PUSH BC LD BC, MB_APPLOP MB_FINTMP: PUSH BC LD HL, (MB_TEMP3) JP MB_LPOPER MB_DORELS: LD D, 0x0 MB_LOPREL: SUB GREATK JP C, MB_FINREL CP NMREL JP NC, MB_FINREL CP 0x1 RLA XOR D CP D LD D, A JP C, MB_SNERR LD (MB_TEMP3), HL CALL MB_CHRGTR JP MB_LOPREL MB_EXPSTK: CALL MB_FRCSNG CALL MB_PUSHF LD BC, MB_FPWRQ LD D, 0x7f JP MB_FINTMP MB_ANDORD: PUSH DE CALL MB_FRCINT POP DE PUSH HL LD BC, MB_DANDOR JP MB_FINTMP MB_FINREL: LD A, B CP 100 RET NC PUSH BC PUSH DE LD DE, 0x6404 ;0+256*100+OPCNT LD HL, MB_DOCMP PUSH HL CALL MB_GETYPR JP NZ, MB_NUMREL LD HL, (MB_FACLO) PUSH HL LD BC, MB_STRCMP JP MB_FINTMP MB_APPLOP: POP BC LD A, C LD (MB_OPRTYP), A LD A, (MB_VALTYP) CP B JP NZ, MB_VALNSM CP 0x2 JP Z, MB_INTDPC CP 0x4 JP Z, MB_SNGDPC JP NC, MB_DBLDPC MB_VALNSM: LD D, A LD A, B CP 0x8 JP Z, MB_STKDBL LD A, D CP 0x8 JP Z, MB_FACDBL LD A, B CP 0x4 JP Z, MB_STKSNG LD A, D CP 0x3 JP Z, MB_TMERR JP NC, MB_FACSNG MB_INTDPC: LD HL, MB_INTDSP ;= 2B31h LD B, 0x0 ADD HL, BC ADD HL, BC LD C, (HL) INC HL LD B, (HL) POP DE LD HL, (MB_FACLO) PUSH BC RET MB_STKDBL: CALL MB_FRCDBL MB_DBLDPC: CALL MB_VMOVAF POP HL LD (MB_DFACLO+2), HL POP HL LD (MB_DFACLO), HL MB_SNGDBL: POP BC POP DE CALL MB_MOVFR MB_SETDBL: CALL MB_FRCDBL LD HL, MB_DBLDSP ;= 2C26h MB_DODSP: LD A, (MB_OPRTYP) RLCA ADD A, L LD L, A ADC A, H SUB L LD H, A LD A, (HL) INC HL LD H, (HL) LD L, A JP (HL) MB_FACDBL: LD A, B PUSH AF CALL MB_VMOVAF POP AF LD (MB_VALTYP), A CP 0x4 JP Z, MB_SNGDBL POP HL LD (MB_FACLO), HL JP MB_SETDBL MB_STKSNG: CALL MB_FRCSNG MB_SNGDPC: POP BC POP DE MB_SNGDO: LD HL, MB_SNGDSP ;= 2588h JP MB_DODSP MB_FACSNG: POP HL CALL MB_PUSHF CALL MB_CONSIH CALL MB_MOVRF POP HL LD (MB_FAC-1), HL POP HL LD (MB_FACLO), HL JP MB_SNGDO MB_INTDIV: PUSH HL EX DE, HL CALL MB_CONSIH POP HL CALL MB_PUSHF CALL MB_CONSIH JP MB_FDIVT ; =================================================== ; EVAL - EVALUATE VARIABLE, CONSTANT, FUNCTION CALL ; =================================================== MB_EVAL: CALL MB_CHRGTR JP Z, MB_MOERR JP C, MB_FIN CALL MB_ISLET2 JP NC, MB_ISVAR CP DBLCON+1 JP C, MB_RETOKN INC A JP Z, MB_ISFUN DEC A CP PLUSTK JP Z, MB_EVAL CP MINUTK JP Z, MB_DOMIN CP '"' JP Z, MB_STRLTI CP NOTTK JP Z, MB_NOTER CP '&' JP Z, MB_OCTCNS CP ERCTK JP NZ, MB_NTERC CALL MB_CHRGTR LD A, (MB_ERRFLG) MB_NTDERC: PUSH HL CALL MB_SNGFLT POP HL RET MB_NTERC: CP ERLTK JP NZ, MB_NTERL CALL MB_CHRGTR PUSH HL LD HL, (MB_ERRLIN) CALL MB_INEG2 POP HL RET MB_NTERL: CP _VARPTR JP NZ, MB_NTVARP CALL MB_CHRGTR CALL MB_SYNCHR DB '(' CP '#' JP NZ, MB_NVRFIL1 CALL MB_GTBYTC PUSH HL CALL MB_GETPTR POP HL JP MB_VARRET MB_NVRFIL1: CALL MB_NVRFIL MB_VARRET: CALL MB_SYNCHR DB ')' PUSH HL EX DE, HL LD A, H OR L JP Z, MB_FCERR CALL MB_MAKINT POP HL RET MB_NTVARP: CP USRTK JP Z, MB_USRFN CP INSRTK JP Z, MB_INSTR CP _INKEY JP Z, MB_INKEY CP _STRIN JP Z, MB_STRNG_ CP _INPUT JP Z, MB_FIXINP CP FNTK JP Z, MB_FNDOER MB_PARCHK: CALL MB_FRMPRN CALL MB_SYNCHR DB ')' RET MB_DOMIN: LD D, 0x7d CALL MB_LPOPER LD HL, (MB_TEMP2) PUSH HL CALL MB_VNEG MB_LABBCK: POP HL RET MB_ISVAR: CALL MB_PTRGET MB_RETVAR: PUSH HL EX DE, HL LD (MB_FACLO), HL CALL MB_GETYPR CALL NZ, MB_VMOVFM POP HL RET MB_MAKUPL: LD A, (HL) ; -------------------------------------------------- ; UprrerCase character in [A] ; -------------------------------------------------- MB_MAKUPS: CP 'A' + 0x20 ; Lower case range? RET C ; ret if Upper CP 'Z' + 0x21 RET NC ; ret if Upper AND 0x5f ; make Upper case RET MB_CNSGET: CP '&' JP NZ, MB_LINGET MB_OCTCNS: LD DE, 0x0 CALL MB_CHRGTR CALL MB_MAKUPS CP 'O' JP Z, MB_LOPOCT CP 'H' JP NZ, MB_LOPOC2 LD B, 5 MB_LOPHEX: INC HL LD A, (HL) CALL MB_MAKUPS CALL MB_ISLET2 EX DE, HL JP NC, MB_ALPTST CP ':' JP NC, MB_OCTFIN SUB '0' JP C, MB_OCTFIN JP MB_NXTHEX MB_ALPTST: CP 'G' ;'F'+1 last hex digit JP NC, MB_OCTFIN SUB 0x37 MB_NXTHEX: ADD HL, HL ADD HL, HL ADD HL, HL ADD HL, HL OR L LD L, A EX DE, HL DEC B JP NZ, MB_LOPHEX JP MB_OVERR MB_LOPOC2: DEC HL MB_LOPOCT: CALL MB_CHRGTR EX DE, HL JP NC, MB_OCTFIN CP '8' JP NC, MB_SNERR LD BC, MB_OVERR PUSH BC ADD HL, HL RET C ADD HL, HL RET C ADD HL, HL RET C POP BC LD B, 0x0 SUB 0x30 LD C, A ADD HL, BC EX DE, HL JP MB_LOPOCT MB_OCTFIN: CALL MB_MAKINT EX DE, HL RET MB_ISFUN: INC HL LD A, (HL) SUB ONEFUN CP 7 ; _RND-ONEFUN JP NZ, MB_NTMRND PUSH HL CALL MB_CHRGTR CP '(' POP HL JP NZ, MB_RNDMON LD A, 0x7 ; _RND-ONEFUN MB_NTMRND: LD B, 0x0 RLCA LD C, A PUSH BC CALL MB_CHRGTR LD A, C CP NUMGFN JP NC, MB_OKNORM CALL MB_FRMPRN CALL MB_SYNCHR DB ',' CALL MB_CHKSTR EX DE, HL LD HL, (MB_FACLO) EX (SP), HL PUSH HL EX DE, HL CALL MB_GETBYT EX DE, HL EX (SP), HL JP MB_FINGO MB_OKNORM: CALL MB_PARCHK EX (SP), HL LD A, L CP 0xc JP C, MB_NOTFRF CP 0x1b PUSH HL CALL C, MB_FRCSNG POP HL MB_NOTFRF: LD DE, MB_LABBCK PUSH DE LD A, 0x1 LD (MB_FLGOVC), A MB_FINGO: LD BC, MB_FUNDSP ;= 4948h MB_DISPAT: ADD HL, BC LD C, (HL) ;= 4948h INC HL LD H, (HL) LD L, C JP (HL) ; =================================================== MB_MINPLS: DEC D CP MINUTK RET Z CP '-' RET Z INC D CP '+' RET Z CP PLUSTK RET Z DEC HL RET ; =================================================== ; MORE FORMULA EVALUATION - LOGICAL, RELATIONAL OPS ; =================================================== MB_DOCMP: INC A ADC A, A POP BC AND B ADD A, 0xff SBC A, A CALL MB_CONIA JP MB_RETAPG MB_NOTER: LD D, 90 CALL MB_LPOPER CALL MB_FRCINT LD A, L CPL LD L, A LD A, H CPL LD H, A LD (MB_FACLO), HL POP BC MB_RETAPG: JP MB_RETAOP ; =================================================== MB_GETYPR: LD A, (MB_VALTYP) CP 0x8 JP NC, MB_NCASE SUB 0x3 OR A SCF RET MB_NCASE: SUB 0x3 OR A RET ; DANDOR APPLIES THE "AND" AND "OR" OPERATORS ; AND SHOULD BE USED TO IMPLEMENT ALL LOGICAL OPERATORS. MB_DANDOR: LD A, B PUSH AF CALL MB_FRCINT POP AF POP DE CP 122 JP Z, MB_IMOD CP 123 JP Z, MB_IDIV LD BC, MB_GIVINT PUSH BC CP 70 JP NZ, MB_NOTOR LD A, E OR L LD L, A LD A, H OR D RET MB_NOTOR: CP 80 JP NZ, MB_NOTAND LD A, E AND L LD L, A LD A, H AND D RET MB_NOTAND: CP 60 JP NZ, MB_NOTXOR LD A, E XOR L LD L, A LD A, H XOR D RET MB_NOTXOR: CP 50 JP NZ, MB_NOTEQV LD A, E XOR L CPL LD L, A LD A, H XOR D CPL RET MB_NOTEQV: LD A, L CPL AND E CPL LD L, A LD A, H CPL AND D CPL RET ; THIS ROUTINE SUBTRACTS [DE] FROM [HL] ; AND FLOATS THE RESULT LEAVING IT IN FAC. MB_GIVDBL: LD A, L SUB E LD L, A LD A, H SBC A, D LD H, A JP MB_INEG2 MB_LPOS: LD A, (MB_LPTPOS) JP MB_SNGFLI MB_POS: LD A, (MB_TTYPOS) MB_SNGFLI: INC A MB_SNGFLT: LD L, A XOR A MB_GIVINT: LD H, A JP MB_MAKINT MB_USRFN: CALL MB_SCNUSR PUSH DE CALL MB_PARCHK EX (SP), HL LD E, (HL) INC HL LD D, (HL) LD HL, MB_POPHRT PUSH HL PUSH DE LD A, (MB_VALTYP) PUSH AF CP 0x3 CALL Z, MB_FREFAC POP AF EX DE, HL LD HL, MB_FACLO RET MB_SCNUSR: CALL MB_CHRGTR LD BC, 0x0 CP ONECON+10 JP NC, MB_NOARGU CP ONECON JP C, MB_NOARGU CALL MB_CHRGTR LD A, (MB_CONLO) OR A RLA LD C, A MB_NOARGU: EX DE, HL LD HL, MB_USRTAB ;= 1418h ADD HL, BC EX DE, HL RET MB_DEFUSR: CALL MB_SCNUSR PUSH DE CALL MB_SYNCHR DB EQULTK CALL MB_GETIN22 EX (SP), HL LD (HL), E INC HL LD (HL), D POP HL RET ; --------------------------------------------------- ; SIMPLE-USER-DEFINED-FUNCTION CODE ; --------------------------------------------------- MB_DEF: CP USRTK JP Z, MB_DEFUSR CALL MB_GETFNM CALL MB_ERRDIR EX DE, HL LD (HL), E INC HL LD (HL), D EX DE, HL LD A, (HL) CP '(' JP NZ, MB_DATAS CALL MB_CHRGTR MB_DATA: CALL MB_PTRGET LD A, (HL) CP ')' JP Z, MB_DATAS CALL MB_SYNCHR DB ',' JP MB_DATA MB_FNDOER: CALL MB_GETFNM LD A, (MB_VALTYP) OR A PUSH AF LD (MB_TEMP2), HL EX DE, HL LD A, (HL) INC HL LD H, (HL) LD L, A LD A, H OR L JP Z, MB_UFERR LD A, (HL) CP '(' JP NZ, MB_FINVLS CALL MB_CHRGTR LD (MB_TEMP3), HL EX DE, HL LD HL, (MB_TEMP2) CALL MB_SYNCHR DB '(' XOR A PUSH AF PUSH HL EX DE, HL MB_ASGMOR: LD A, 128 LD (MB_SUBFLG), A CALL MB_PTRGET EX DE, HL EX (SP), HL LD A, (MB_VALTYP) PUSH AF PUSH DE CALL MB_FRMEVL LD (MB_TEMP2), HL POP HL LD (MB_TEMP3), HL POP AF CALL MB_DOCNVF LD C, 0x4 CALL MB_GETSTK LD HL, 0xfff8 ADD HL, SP LD SP, HL CALL MB_VMOVMF LD A, (MB_VALTYP) PUSH AF LD HL, (MB_TEMP2) LD A, (HL) CP ')' JP Z, MB_POPASG CALL MB_SYNCHR DB ',' PUSH HL LD HL, (MB_TEMP3) CALL MB_SYNCHR DB ',' JP MB_ASGMOR MB_POPAS2: POP AF LD (MB_PRMLN2), A MB_POPASG: POP AF OR A JP Z, MB_FINASG LD (MB_VALTYP), A LD HL, 0x0 ADD HL, SP CALL MB_VMOVFM LD HL, 0x8 ADD HL, SP LD SP, HL POP DE LD L, 0x3 MB_LPSIZL: INC L DEC DE LD A, (DE) OR A JP M, MB_LPSIZL DEC DE DEC DE DEC DE LD A, (MB_VALTYP) ADD A, L LD B, A LD A, (MB_PRMLN2) LD C, A ADD A, B CP PRMSIZ JP NC, MB_FCERR PUSH AF LD A, L LD B, 0x0 LD HL, MB_PARM2 ADD HL, BC LD C, A CALL MB_BCTRAN LD BC, MB_POPAS2 PUSH BC PUSH BC JP MB_LETCN4 MB_FINASG: LD HL, (MB_TEMP2) CALL MB_CHRGTR PUSH HL LD HL, (MB_TEMP3) CALL MB_SYNCHR DB ')' DB 3Eh ; -------------------------------------------------- MB_FINVLS: PUSH DE LD (MB_TEMP3), HL LD A, (MB_PRMLEN) ADD A, 0x4 PUSH AF RRCA LD C, A CALL MB_GETSTK POP AF LD C, A CPL INC A LD L, A LD H, 0xff ADD HL, SP LD SP, HL PUSH HL LD DE, MB_PRMSTK CALL MB_BCTRAN POP HL LD (MB_PRMSTK), HL LD HL, (MB_PRMLN2) LD (MB_PRMLEN), HL LD B, H LD C, L LD HL, MB_PARM1 LD DE, MB_PARM2 CALL MB_BCTRAN LD H, A LD L, A LD (MB_PRMLN2), HL LD HL, (MB_FUNACT) INC HL LD (MB_FUNACT), HL LD A, H OR L LD (MB_NOFUNS), A LD HL, (MB_TEMP3) CALL MB_FRMEQL DEC HL CALL MB_CHRGTR JP NZ, MB_SNERR CALL MB_GETYPR JP NZ, MB_NOCPRS LD DE, MB_DSCTMP LD HL, (MB_FACLO) CALL MB_DCOMPR JP C, MB_NOCPRS CALL MB_STRCPY CALL MB_PUTTMP MB_NOCPRS: LD HL, (MB_PRMSTK) LD D, H LD E, L INC HL INC HL LD C, (HL) INC HL LD B, (HL) INC BC INC BC INC BC INC BC LD HL, MB_PRMSTK CALL MB_BCTRAN EX DE, HL LD SP, HL LD HL, (MB_FUNACT) DEC HL LD (MB_FUNACT), HL LD A, H OR L LD (MB_NOFUNS), A POP HL POP AF MB_DOCNVF: PUSH HL AND 0x7 LD HL, MB_FRCTBL ;= 2A20h LD C, A LD B, 0x0 ADD HL, BC CALL MB_DISPAT POP HL RET ; --------------------------------------------------- ; BLOCK TRANSFER ROUTINE WITH SOURCE IN [DE] DESTINATION IN [HL] ; AND COUNT IN [BC]. TRANSFER IS FORWARD. ; --------------------------------------------------- MB_BCTRAL: LD A, (DE) LD (HL), A INC HL INC DE DEC BC MB_BCTRAN: LD A, B OR C JP NZ, MB_BCTRAL RET MB_ERRDIR: PUSH HL LD HL, (MB_CURLIN) ;= 65534 INC HL LD A, H OR L POP HL RET NZ LD E, ERRID JP MB_ERROR ; --------------------------------------------------- ; SUBROUTINE TO GET A POINTER TO A FUNCTION NAME ; --------------------------------------------------- MB_GETFNM: CALL MB_SYNCHR DB FNTK LD A, 0x80 LD (MB_SUBFLG), A OR (HL) LD C, A JP MB_PTRGT2 ; --------------------------------------------------- ; STRING FUNCTIONS - LEFT HAND SIDE MID$ ; --------------------------------------------------- MB_ISMID: CP 0xff-_END ;377O-$END JP NZ, MB_SNERR INC HL LD A, (HL) INC HL CP MIDTK JP Z, MB_MIDFN JP MB_SNERR MB_FNINP: CALL MB_CONINT LD (MB_INPWRD+1), A MB_INPWRD: IN A, (0x0) JP MB_SNGFLT MB_FNOUT: CALL MB_SETIO MB_OUTWRD: OUT (0x0), A RET MB_FNWAIT: CALL MB_SETIO PUSH AF LD E, 0x0 DEC HL CALL MB_CHRGTR JP Z, MB_NOTTHR CALL MB_SYNCHR DB ',' CALL MB_GETBYT MB_NOTTHR: POP AF LD D, A MB_STAINP: IN A, (0x0) XOR E AND D JP Z, MB_STAINP RET MB_CONSOL: JP MB_SNERR MB_WIDTH: CP _LPRINT JP NZ, MB_NOTWLP CALL MB_CHRGTR CALL MB_GETBYT LD (MB_LPTSIZ), A ;= 132 LD E, A CALL MB_MORCP3 LD (MB_NLPPOS), A ;= 112 RET MB_NOTWLP: CALL MB_GETBYT LD (MB_LINLEN), A ;= 80 LD E, A CALL MB_MORCP3 LD (MB_CLMLST), A ;= 56 RET MB_MORCP3: SUB CLMWID JP NC, MB_MORCP3 ADD A, CLMWID*2 CPL INC A ADD A, E RET MB_GETINT: CALL MB_CHRGTR MB_GETIN2: CALL MB_FRMEVL ; -------------------------------------------------- ; CONVERT THE FAC TO AN INTEGER IN [DE] ; -------------------------------------------------- MB_INTFR2: PUSH HL CALL MB_FRCINT EX DE, HL POP HL LD A, D OR A RET MB_SETIO: CALL MB_GETBYT LD (MB_STAINP + 1), A LD (MB_OUTWRD + 1), A CALL MB_SYNCHR DB ',' JP MB_GETBYT MB_GTBYTC: CALL MB_CHRGTR ; =================================================== MB_GETBYT: CALL MB_FRMEVL ; =================================================== MB_CONINT: CALL MB_INTFR2 JP NZ, MB_FCERR DEC HL CALL MB_CHRGTR LD A, E RET ; =================================================== ; EXTENDED LIST, DELETE, LLIST ; =================================================== MB_LLIST: LD A, 0x1 LD (MB_PRTFLG), A MB_LIST: POP BC CALL MB_SCNLIN PUSH BC CALL MB_PROCHK MB_LIST4: LD HL, 0xffff LD (MB_CURLIN), HL ;= 65534 POP HL POP DE LD C, (HL) INC HL LD B, (HL) INC HL LD A, B OR C JP Z, MB_READY CALL MB_PTRFILZ CALL Z, MB_ISCNTC PUSH BC LD C, (HL) INC HL LD B, (HL) INC HL PUSH BC EX (SP), HL EX DE, HL CALL MB_DCOMPR POP BC JP C, MB_STPRDY EX (SP), HL PUSH HL PUSH BC EX DE, HL LD (MB_DOT), HL CALL MB_LINPTR POP HL LD A, (HL) CP ASCII_TAB JP Z, MB_NOSPAL LD A, ' ' CALL MB_OUTDO MB_NOSPAL: CALL MB_BUFLIN LD HL, MB_BUF CALL MB_LISPRT CALL MB_CRDO JP MB_LIST4 MB_LISPRT: LD A, (HL) OR A RET Z CALL MB_OUTCH1 INC HL JP MB_LISPRT MB_BUFLIN: LD BC, MB_BUF LD D, 0xff XOR A LD (MB_TEMPA), A CALL MB_PROCHK JP MB_PLOOP2 MB_PLOOP: INC BC INC HL DEC D RET Z MB_PLOOP2: LD A, (HL) OR A LD (BC), A ;= 44 RET Z CP OCTCON JP C, MB_NTEMBL CP ' ' LD E, A JP C, MB_PRTVAR MB_NTEMBL: OR A JP M, MB_PLOOPR LD E, A CP '.' JP Z, MB_PRTVAR CALL MB_TSTANM JP NC, MB_PRTVAR XOR A JP MB_PLOOPH MB_PRTVAR: LD A, (MB_TEMPA) OR A JP Z, MB_PLOOPG INC A JP NZ, MB_PLOOPG LD A, ' ' LD (BC), A ;= 44 INC BC DEC D RET Z MB_PLOOPG: LD A, 0x1 MB_PLOOPH: LD (MB_TEMPA), A LD A, E CP OCTCON JP C, MB_PLOOPZ CP ' ' JP C, MB_NUMLIN MB_PLOOPZ: LD (BC), A JP MB_PLOOP MB_PLOOPR: INC A LD A, (HL) JP NZ, MB_NTFNTK INC HL LD A, (HL) AND 0x7f MB_NTFNTK: INC HL CP SNGQTK JP NZ, MB_NTQTTK DEC BC DEC BC DEC BC DEC BC INC D INC D INC D INC D MB_NTQTTK: CP _ELSE CALL Z, MB_DCXBRT CP _WHILE ;LAB_ram_215f: JP NZ, MB_RESSR0 LD A, (HL) INC HL CP PLUSTK LD A, _WHILE JP Z, MB_RESSR0 DEC HL MB_RESSR0: PUSH HL PUSH BC PUSH DE LD HL, MB_RESLST-1 LD B, A LD C, 'A' - 1 MB_RESSR3: INC C MB_RESSR1: INC HL LD D, H LD E, L MB_RESSR2: LD A, (HL) OR A JP Z, MB_RESSR3 INC HL JP P, MB_RESSR2 LD A, (HL) CP B JP NZ, MB_RESSR1 EX DE, HL CP USRTK JP Z, MB_NOISPA CP FNTK MB_NOISPA: LD A, C POP DE POP BC LD E, A JP NZ, MB_NTFNEX LD A, (MB_TEMPA) OR A LD A, 0 LD (MB_TEMPA), A JP MB_MORLNZ MB_NTFNEX: CP 'Z' + 1 ; WAS IT A SPECIAL CHAR? JP NZ, MB_NTSPCH XOR A LD (MB_TEMPA), A JP MB_MORPUR MB_NTSPCH: LD A, (MB_TEMPA) OR A LD A, 0xff LD (MB_TEMPA), A MB_MORLNZ: JP Z, MB_MORLN0 LD A, ' ' LD (BC), A INC BC DEC D JP Z, MB_PPSWRT MB_MORLN0: LD A, E JP MB_MORLN1 MB_MORPUR: LD A, (HL) ; = "UT" INC HL LD E, A MB_MORLN1: AND 0x7f LD (BC), A ; = 44 INC BC DEC D JP Z, MB_PPSWRT OR E JP P, MB_MORPUR CP '(' + 0x80 JP NZ, MB_NTSPCT XOR A LD (MB_TEMPA), A MB_NTSPCT: POP HL JP MB_PLOOP2 MB_TSTANM: CALL MB_ISLET2 RET NC CP '0' RET C CP ':' CCF RET MB_NUMLIN: DEC HL CALL MB_CHRGTR PUSH DE PUSH BC PUSH AF CALL MB_CONFAC POP AF LD BC, MB_CONLIN PUSH BC CP OCTCON JP Z, MB_FOUTO CP HEXCON JP Z, MB_FOUTH LD HL, (MB_CONLO) JP MB_FOUT MB_CONLIN: POP BC POP DE LD A, (MB_CONSAV) LD E, 'O' CP OCTCON JP Z, MB_SAVBAS CP HEXCON LD E, 'H' JP NZ, MB_NUMSLN MB_SAVBAS: LD A, '&' LD (BC), A INC BC DEC D RET Z LD A, E LD (BC), A INC BC DEC D RET Z MB_NUMSLN: LD A, (MB_CONTYP) CP 0x4 LD E, 0x0 JP C, MB_TYPSET LD E, '!' JP Z, MB_TYPSET LD E, '#' MB_TYPSET: LD A, (HL) CP ASCII_SP CALL Z, MB_INXHRT MB_NUMSL2: LD A, (HL) INC HL OR A JP Z, MB_NUMDN LD (BC), A INC BC DEC D RET Z LD A, (MB_CONTYP) CP 0x4 JP C, MB_NUMSL2 DEC BC LD A, (BC) INC BC JP NZ, MB_DBLSCN CP '.' JP Z, MB_ZERE MB_DBLSCN: CP 'D' JP Z, MB_ZERE CP 'E' JP NZ, MB_NUMSL2 MB_ZERE: LD E, 0x0 JP MB_NUMSL2 MB_NUMDN: LD A, E OR A JP Z, MB_NOD LD (BC), A INC BC DEC D RET Z MB_NOD: LD HL, (MB_CONTXT) JP MB_PLOOP2 MB_DELETE: CALL MB_SCNLIN PUSH BC CALL MB_DEPTR POP BC POP DE PUSH BC PUSH BC CALL MB_FNDLIN JP NC, MB_FCERRG LD D, H LD E, L EX (SP), HL PUSH HL CALL MB_DCOMPR MB_FCERRG: JP NC, MB_FCERR LD HL, MB_OKTXT ;= "OK\r\n" CALL MB_STROUT POP BC LD HL, MB_FINI ;= D1h EX (SP), HL MB_DEL: EX DE, HL LD HL, (MB_VARTAB) MB_MLOOP: LD A, (DE) LD (BC), A INC BC INC DE CALL MB_DCOMPR JP NZ, MB_MLOOP LD H, B LD L, C LD (MB_VARTAB), HL RET ; =================================================== ; PEEK AND POKE ; =================================================== MB_PEEK: CALL MB_FRQINT CALL MB_PRODIR LD A, (HL) JP MB_SNGFLT MB_POKE: CALL MB_GETIN22 PUSH DE CALL MB_PRODIR CALL MB_SYNCHR DB ',' CALL MB_GETBYT POP DE LD (DE), A RET MB_GETIN22: CALL MB_FRMEVL PUSH HL CALL MB_FRQINT EX DE, HL POP HL RET MB_FRQINT: LD BC, MB_FRCINT PUSH BC CALL MB_GETYPR RET M LD A, (MB_FAC) CP 0x90 RET NZ CALL MB_SIGN RET M CALL MB_FRCSNG LD BC, 0x9180 LD DE, 0x0 JP MB_FADD ; =================================================== ; RENUMBER ; =================================================== MB_RESEQ: LD BC, 10 ; ASSUME INC=10 PUSH BC LD D, B LD E, B JP Z, MB_RESNN CP ',' JP Z, MB_EATCOM PUSH DE CALL MB_LINSPC LD B, D LD C, E POP DE JP Z, MB_RESNN MB_EATCOM: CALL MB_SYNCHR DB ',' CALL MB_LINSPC JP Z, MB_RESNN POP AF CALL MB_SYNCHR DB ',' PUSH DE CALL MB_LINGET JP NZ, MB_SNERR LD A, D OR E JP Z, MB_FCERR EX DE, HL EX (SP), HL EX DE, HL MB_RESNN: PUSH BC CALL MB_FNDLIN POP DE PUSH DE PUSH BC CALL MB_FNDLIN LD H, B LD L, C POP DE CALL MB_DCOMPR EX DE, HL JP C, MB_FCERR POP DE POP BC POP AF PUSH HL PUSH DE JP MB_NXTRSL MB_NXTRSC: ADD HL, BC JP C, MB_FCERR EX DE, HL PUSH HL LD HL, 65529 CALL MB_DCOMPR POP HL JP C, MB_FCERR MB_NXTRSL: PUSH DE LD E, (HL) INC HL LD D, (HL) LD A, D OR E EX DE, HL POP DE JP Z, MB_RESSD1 LD A, (HL) INC HL OR (HL) DEC HL EX DE, HL JP NZ, MB_NXTRSC MB_RESSD1: PUSH BC CALL SCCLIN POP BC POP DE POP HL MB_RESNX1: PUSH DE LD E, (HL) INC HL LD D, (HL) LD A, D OR E JP Z, MB_SCCALL EX DE, HL EX (SP), HL EX DE, HL INC HL LD (HL), E INC HL LD (HL), D EX DE, HL ADD HL, BC EX DE, HL POP HL JP MB_RESNX1 MB_SCCALL: LD BC, MB_STPRDY PUSH BC DB 0xFE SCCLIN: DB 0xF6 ; =================================================== MB_SCCPTR: XOR A LD (MB_PTRFLG), A MB_SCNPGM: LD HL, (MB_TXTTAB) ;TXTTAB DEC HL MB_SCNPLN: INC HL LD A, (HL) INC HL OR (HL) RET Z INC HL LD E, (HL) INC HL LD D, (HL) MB_SCNEXT: CALL MB_CHRGTR MB_SCNEX2: OR A JP Z, MB_SCNPLN LD C, A LD A, (MB_PTRFLG) OR A LD A, C JP Z, MB_SCNPT2 CP _ERROR JP NZ, MB_NTERRG CALL MB_CHRGTR CP _GOTO JP NZ, MB_SCNEX2 CALL MB_CHRGTR CP LINCON JP NZ, MB_SCNEX2 PUSH DE CALL MB_LINGT3 LD A, D OR E JP NZ, MB_CHGPTR JP MB_SCNEX3 MB_NTERRG: CP LINCON JP NZ, MB_SCNEXT PUSH DE CALL MB_LINGT3 MB_CHGPTR: PUSH HL CALL MB_FNDLIN DEC BC LD A, PTRCON JP C, MB_MAKPTR CALL MB_CRDONZ LD HL, MB_LINM ;= "Undefined line " PUSH DE CALL MB_STROUT POP HL CALL MB_LINPTR POP BC POP HL PUSH HL PUSH BC CALL MB_INPRT MB_SCNPOP: POP HL MB_SCNEX3: POP DE DEC HL MB_SCNEXT0: JP MB_SCNEXT MB_LINM: DB "Undefined line ", 0 MB_SCNPT2: CP PTRCON JP NZ, MB_SCNEXT0 PUSH DE CALL MB_LINGT3 PUSH HL EX DE, HL INC HL INC HL INC HL LD C, (HL) INC HL LD B, (HL) LD A, LINCON MB_MAKPTR: LD HL, MB_SCNPOP PUSH HL MB_CONCHG: LD HL, (MB_CONTXT) MB_CONCH2: PUSH HL DEC HL LD (HL), B DEC HL LD (HL), C DEC HL LD (HL), A POP HL RET ; =================================================== MB_DEPTR: LD A, (MB_PTRFLG) OR A RET Z JP MB_SCCPTR ; --------------------------------------------------- ; ANSI - THE ROUTINES TO HANDLE ANSI FEATURES ; --------------------------------------------------- MB_OPTION: CALL MB_SYNCHR DB 'B' CALL MB_SYNCHR DB 'A' CALL MB_SYNCHR DB 'S' CALL MB_SYNCHR DB 'E' LD A, (MB_OPTFLG) OR A JP NZ, MB_DDERR PUSH HL LD HL, (MB_ARYTAB) EX DE, HL LD HL, (MB_STREND) CALL MB_DCOMPR JP NZ, MB_DDERR POP HL LD A, (HL) SUB '0' JP C, MB_SNERR CP 2 JP NC, MB_SNERR LD (MB_OPTVAL), A INC A LD (MB_OPTFLG), A CALL MB_CHRGTR RET MB_STRPRN: LD A, (HL) OR A RET Z CALL MB_CALTTY INC HL JP MB_STRPRN MB_CALTTY: PUSH AF JP MB_TTYCHR MB_RANDOM: JP Z, MB_INPRG CALL MB_FRMEVL PUSH HL CALL MB_FRCINT JP MB_STRNDS MB_INPRG: PUSH HL MB_INPRAG: LD HL, MB_RANMES ;= "Random number seed (-32768 to 32767)" CALL MB_STROUT CALL MB_QINLIN POP DE JP C, MB_STPEND PUSH DE INC HL LD A, (HL) CALL MB_FIN LD A, (HL) OR A JP NZ, MB_INPRAG CALL MB_FRCINT MB_STRNDS: LD (MB_RNDX+1), HL CALL MB_RNDMN2 POP HL RET MB_RANMES: DB "Random number seed (-32768 to 32767)", 0 ; --------------------------------------------------- ; SCANS AHEAD TO FIND THE "NEXT" THAT MATCHES A "FOR" ; --------------------------------------------------- MB_WNDSCN: LD C, ERRWH JP MB_SCNCNT MB_NXTSCN: LD C, ERRFN MB_SCNCNT: LD B, 0 EX DE, HL LD HL, (MB_CURLIN) ;= 65534 LD (MB_NXTLIN), HL EX DE, HL MB_FORINC: INC B MB_FNLOP: DEC HL MB_SCANWF: CALL MB_CHRGTR JP Z, MB_FORTRM CP _ELSE JP Z, MB_FNNWST CP _THEN JP NZ, MB_SCANWF MB_FORTRM: OR A JP NZ, MB_FNNWST INC HL LD A, (HL) INC HL OR (HL) LD E, C JP Z, MB_ERROR INC HL LD E, (HL) INC HL LD D, (HL) EX DE, HL LD (MB_NXTLIN), HL EX DE, HL MB_FNNWST: CALL MB_CHRGTR LD A, C CP ERRFN LD A, (HL) JP Z, MB_NXTLOK CP _WHILE JP Z, MB_FORINC CP _WEND JP NZ, MB_FNLOP DEC B JP NZ, MB_FNLOP RET MB_NXTLOK: CP _FOR JP Z, MB_FORINC CP _NEXT JP NZ, MB_FNLOP MB_DECNXT: DEC B RET Z ; SCAN THE VARIABLES LISTED IN A "NEXT" STATEMENT CALL MB_CHRGTR JP Z, MB_FORTRM EX DE, HL LD HL, (MB_CURLIN) ;= 65534 PUSH HL LD HL, (MB_NXTLIN) LD (MB_CURLIN), HL ;= 65534 EX DE, HL PUSH BC CALL MB_PTRGET POP BC DEC HL CALL MB_CHRGTR LD DE, MB_FORTRM JP Z, MB_TRMNXT CALL MB_SYNCHR DB ',' DEC HL LD DE, MB_DECNXT MB_TRMNXT: EX (SP), HL LD (MB_CURLIN), HL ;= 65534 POP HL PUSH DE RET MB_FINOVC: PUSH AF LD A, (MB_FLGOVC) LD (MB_OVCSTR), A POP AF MB_CLROVC: PUSH AF XOR A LD (MB_FLGOVC), A POP AF RET ; =================================================== ; FLOATING POINT ADDITION AND SUBTRACTION ; F4.MAC ; =================================================== ; --------------------------------------------------- ; ENTRY TO FADD WITH POINTER TO ARG IN (HL) ; --------------------------------------------------- MB_FADDH: LD HL, MB_FHALF MB_FADDS: CALL MB_MOVRM JP MB_FADD MB_FSUBS: CALL MB_MOVRM MB_FSUB: CALL MB_NEG MB_FADD: LD A, B OR A RET Z LD A, (MB_FAC) OR A JP Z, MB_MOVFR SUB B JP NC, MB_FADD1 CPL INC A EX DE, HL CALL MB_PUSHF EX DE, HL CALL MB_MOVFR POP BC POP DE MB_FADD1: CP 25 RET NC PUSH AF CALL MB_UNPACK LD H, A POP AF CALL MB_SHIFTR LD A, H OR A LD HL, MB_FACLO JP P, MB_FADD3 CALL MB_FADDA JP NC, MB_ROUND INC HL INC (HL) JP Z, MB_OVFIN4 LD L, 0x1 CALL MB_SHRADD JP MB_ROUND MB_FADD3: XOR A SUB B LD B, A LD A, (HL) SBC A, E LD E, A INC HL LD A, (HL) SBC A, D LD D, A INC HL LD A, (HL) SBC A, C LD C, A MB_FADFLT: CALL C, MB_NEGR MB_NORMAL: LD L, B LD H, E XOR A MB_NORM1: LD B, A LD A, C OR A JP NZ, MB_NORM3 LD C, D LD D, H LD H, L LD L, A LD A, B SUB 8 CP 224 JP NZ, MB_NORM1 MB_ZERO: XOR A MB_ZERO0: LD (MB_FAC), A RET MB_NORM2: LD A, H OR L OR D JP NZ, MB_NORM2U LD A, C MB_NORM2F: DEC B RLA JP NC, MB_NORM2F INC B RRA LD C, A JP MB_NORM3A MB_NORM2U: DEC B ADD HL, HL LD A, D RLA LD D, A LD A, C ADC A, A LD C, A MB_NORM3: JP P, MB_NORM2 MB_NORM3A: LD A, B LD E, H LD B, L OR A JP Z, MB_ROUND LD HL, MB_FAC ADD A, (HL) LD (HL), A JP NC, MB_ZERO JP Z, MB_ZERO MB_ROUND: LD A, B MB_ROUNDB: LD HL, MB_FAC OR A CALL M, MB_ROUNDA LD B, (HL) INC HL LD A, (HL) AND 0x80 XOR C LD C, A JP MB_MOVFR MB_ROUNDA: INC E RET NZ INC D RET NZ INC C RET NZ LD C, 0x80 INC (HL) RET NZ JP MB_OVFIN8 MB_FADDA: LD A, (HL) ADD A, E LD E, A INC HL LD A, (HL) ADC A, D LD D, A INC HL LD A, (HL) ADC A, C LD C, A RET ; --------------------------------------------------- MB_NEGR: LD HL, MB_FAC+1 LD A, (HL) CPL LD (HL), A XOR A LD L, A SUB B LD B, A LD A, L SBC A, E LD E, A LD A, L SBC A, D LD D, A LD A, L SBC A, C LD C, A RET MB_SHIFTR: LD B, 0x0 MB_SHFTR1: SUB 0x8 JP C, MB_SHFTR2 LD B, E LD E, D LD D, C LD C, 0x0 JP MB_SHFTR1 MB_SHFTR2: ADD A, 0x9 LD L, A LD A, D OR E OR B JP NZ, MB_SHFTR3 LD A, C MB_SHFTRF: DEC L RET Z RRA LD C, A JP NC, MB_SHFTRF JP MB_SHFTC MB_SHFTR3: XOR A DEC L RET Z LD A, C MB_SHRADD: RRA LD C, A MB_SHFTC: LD A, D RRA LD D, A LD A, E RRA LD E, A LD A, B RRA LD B, A JP MB_SHFTR3 ; --------------------------------------------------- ; NATURAL LOG FUNCTION ; --------------------------------------------------- MB_FONE: DB 0,0,0,0x81 ; CONST 1 ; 2524 COEFFICIENTS MB_LOGP: ; 4.8114746 DB 0x04, 0x9A, 0xF7, 0x19, 0x83, 0x24, 0x63, 0x43, 0x83 DB 0x75, 0xCD, 0x8D, 0x84, 0xA9, 0x7F, 0x83, 0x82 MB_LOGQ: DB 0x04, 0x00, 0x00, 0x00, 0x81, 0xE2, 0xB0, 0x4D DB 0x83, 0x0A, 0x72, 0x11, 0x83, 0xF4, 0x04, 0x35 DB 0x7F MB_LOG: CALL MB_SIGN OR A JP PE, MB_FCERR CALL MB_LOG2 LD BC, 0x8031 ;200Q*256+061Q LD DE, 0x7218 ;162Q*256+030Q JP MB_FMUL MB_LOG2: CALL MB_MOVRF LD A, 0x80 LD (MB_FAC), A XOR B PUSH AF CALL MB_PUSHF LD HL, MB_LOGP CALL MB_POLY POP BC POP HL CALL MB_PUSHF EX DE, HL CALL MB_MOVFR LD HL, MB_LOGQ CALL MB_POLY POP BC POP DE CALL MB_FDIV POP AF CALL MB_PUSHF CALL MB_FLOAT POP BC POP DE JP MB_FADD ; --------------------------------------------------- ; FLOATING MULTIPLICATION ; --------------------------------------------------- MB_FMUL: CALL MB_SIGN RET Z LD L, 0x0 CALL MB_MULDIV LD A, C LD (MB_FMULTA+1), A EX DE, HL LD (MB_FMULTB+1), HL LD BC, 0x0 LD D, B LD E, B LD HL, MB_NORMAL PUSH HL LD HL, MB_FMULT2 PUSH HL PUSH HL LD HL, MB_FACLO MB_FMULT2: LD A, (HL) INC HL OR A JP Z, MB_FMULT3 PUSH HL EX DE, HL LD E, 0x8 MB_FMULT4: RRA LD D, A LD A, C JP NC, MB_FMULT5 PUSH DE MB_FMULTB: LD DE, 0x0 ADD HL, DE POP DE MB_FMULTA: ADC A, 0x0 MB_FMULT5: RRA LD C, A LD A, H RRA LD H, A LD A, L RRA LD L, A LD A, B RRA LD B, A AND 0x10 JP Z, MB_FMLT5B LD A, B OR 0x20 LD B, A MB_FMLT5B: DEC E LD A, D JP NZ, MB_FMULT4 EX DE, HL ; GET POINTER TO NUMBER TO MULTIPLY BY MB_POPHRT: POP HL RET MB_FMULT3: LD B, E LD E, D LD D, C LD C, A RET MB_DIV10: CALL MB_PUSHF LD HL, MB_FTEN ;Const 10.0 CALL MB_MOVFM MB_FDIVT: POP BC POP DE ; --------------------------------------------------- ; FLOATING DIVISION ; --------------------------------------------------- MB_FDIV: CALL MB_SIGN JP Z, MB_INTDV1 LD L, 0xff CALL MB_MULDIV INC (HL) JP Z, MB_OVFIN2 INC (HL) JP Z, MB_OVFIN2 DEC HL LD A, (HL) LD (MB_FDIVA+1), A DEC HL LD A, (HL) LD (MB_FDIVB+1), A DEC HL LD A, (HL) LD (MB_FDIVC+1), A LD B, C EX DE, HL XOR A LD C, A LD D, A LD E, A LD (MB_FDIVG+1), A MB_FDIV1: PUSH HL PUSH BC LD A, L MB_FDIVC: SUB 0x0 LD L, A LD A, H MB_FDIVB: SBC A, 0x0 LD H, A LD A, B MB_FDIVA: SBC A, 0x0 LD B, A MB_FDIVG: LD A, 0x0 SBC A, 0x0 CCF JP NC, MB_FDIV2 LD (MB_FDIVG+1), A POP AF POP AF SCF DB 0xD2 MB_FDIV2: POP BC POP HL LD A, C INC A DEC A RRA JP P, MB_DIV2A RLA LD A, (MB_FDIVG+1) RRA AND 0xc0 PUSH AF LD A, B OR H OR L JP Z, MB_DIV2AA LD A, 0x20 MB_DIV2AA: POP HL OR H JP MB_ROUNDB MB_DIV2A: RLA LD A, E RLA LD E, A LD A, D RLA LD D, A LD A, C RLA LD C, A ADD HL, HL LD A, B MB_FDIV2A: RLA LD B, A LD A, (MB_FDIVG+1) RLA LD (MB_FDIVG+1), A LD A, C OR D OR E JP NZ, MB_FDIV1 PUSH HL LD HL, MB_FAC DEC (HL) POP HL JP NZ, MB_FDIV1 JP MB_ZERO MB_MULDVS: LD A, 0xff DB 0x2E MB_MULDVA: XOR A LD HL, MB_ARG-1 LD C, (HL) INC HL XOR (HL) LD B, A LD L, 0x0 MB_MULDIV: LD A, B OR A JP Z, MB_MULDV2 LD A, L LD HL, MB_FAC XOR (HL) ADD A, B LD B, A RRA XOR B LD A, B JP P, MB_MULDV1 ADD A, 0x80 LD (HL), A JP Z, MB_POPHRT CALL MB_UNPACK LD (HL), A MB_DCXHRT: DEC HL RET MB_MLDVEX: CALL MB_SIGN CPL POP HL MB_MULDV1: OR A MB_MULDV2: POP HL JP P, MB_ZERO JP MB_OVFIN2 ; =================================================== MB_MUL10: CALL MB_MOVRF LD A, B OR A RET Z ADD A, 0x2 JP C, MB_OVFIN3 LD B, A CALL MB_FADD LD HL, MB_FAC INC (HL) RET NZ JP MB_OVFIN3 ; =================================================== ; SIGN, SGN, FLOAT, NEG AND ABS ; =================================================== MB_SIGN: LD A, (MB_FAC) OR A RET Z MB_SIGNC: LD A, (MB_FAC-1) ;FAC-1 DB 0xFE MB_FCOMPS: CPL MB_ICOMPS: RLA MB_SIGNS: SBC A, A RET NZ MB_INRART: INC A RET ; =================================================== MB_FLOAT: LD B, 0x88 LD DE, 0x0 MB_FLOATR: LD HL, MB_FAC LD C, A LD (HL), B LD B, 0x0 INC HL LD (HL), 0x80 RLA JP MB_FADFLT MB_ABS: CALL MB_VSIGN RET P MB_VNEG: CALL MB_GETYPR JP M, MB_INEG JP Z, MB_TMERR MB_NEG: LD HL, MB_FAC-1 LD A, (HL) XOR 0x80 LD (HL), A RET MB_SGN: CALL MB_VSIGN MB_CONIA: LD L, A RLA SBC A, A LD H, A JP MB_MAKINT MB_VSIGN: CALL MB_GETYPR JP Z, MB_TMERR JP P, MB_SIGN LD HL, (MB_FACLO) MB_ISIGN: LD A, H OR L RET Z LD A, H JP MB_ICOMPS ; =================================================== MB_PUSHF: EX DE, HL LD HL, (MB_FACLO) EX (SP), HL PUSH HL LD HL, (MB_FAC-1) EX (SP), HL PUSH HL EX DE, HL RET MB_MOVFM: CALL MB_MOVRM MB_MOVFR: EX DE, HL LD (MB_FACLO), HL LD H, B LD L, C LD (MB_FAC-1), HL ;FAC-1 EX DE, HL RET MB_MOVRF: LD HL, MB_FACLO MB_MOVRM: LD E, (HL) INC HL MB_GETBCD: LD D, (HL) INC HL LD C, (HL) INC HL LD B, (HL) MB_INXHRT: INC HL RET MB_MOVMF: LD DE, MB_FACLO MB_MOVE: LD B, 0x4 JP MB_MOVE1 MB_MOVVFM: EX DE, HL ; =================================================== MB_VMOVE: LD A, (MB_VALTYP) LD B, A MB_MOVE1: LD A, (DE) LD (HL), A INC DE INC HL DEC B JP NZ, MB_MOVE1 RET MB_UNPACK: LD HL, MB_FAC-1 ;FAC-1 LD A, (HL) RLCA SCF RRA LD (HL), A CCF RRA INC HL INC HL LD (HL), A LD A, C RLCA SCF RRA LD C, A RRA XOR (HL) RET MB_VMOVFA: LD HL, MB_ARGLO MB_VMOVFM: LD DE, MB_MOVVFM JP MB_VMVVFM ; =================================================== MB_VMOVAF: LD HL, MB_ARGLO MB_VMOVMF: LD DE, MB_VMOVE MB_VMVVFM: PUSH DE LD DE, MB_FACLO CALL MB_GETYPR RET C LD DE, MB_DFACLO RET ; =================================================== MB_FCOMP: LD A, B OR A JP Z, MB_SIGN LD HL, MB_FCOMPS PUSH HL CALL MB_SIGN LD A, C RET Z LD HL, MB_FAC-1 ;FAC-1 XOR (HL) LD A, C RET M CALL MB_FCOMP2 MB_FCOMPD: RRA XOR C RET MB_FCOMP2: INC HL LD A, B CP (HL) RET NZ DEC HL LD A, C CP (HL) RET NZ DEC HL LD A, D CP (HL) RET NZ DEC HL LD A, E SUB (HL) RET NZ POP HL POP HL RET MB_ICOMP: LD A, D XOR H LD A, H JP M, MB_ICOMPS CP D JP NZ, MB_SIGNS1 LD A, L SUB E RET Z MB_SIGNS1: JP MB_SIGNS ; -------------------------------------------------- ; COMPARE TWO DOUBLE PRECISION NUMBERS ; A=1 IF ARG .LT. FAC ; A=0 IF ARG=FAC ; A=-1 IF ARG .GT. FAC ; ALTERS A,B,C,D,E,H,L ; -------------------------------------------------- MB_DCOMPD: LD HL, MB_ARGLO CALL MB_VMOVE MB_XDCOMP: LD DE, MB_ARG LD A, (DE) OR A JP Z, MB_SIGN LD HL, MB_FCOMPS PUSH HL CALL MB_SIGN DEC DE LD A, (DE) LD C, A RET Z LD HL, MB_FAC-1 ;FAC-1 XOR (HL) LD A, C RET M INC DE INC HL LD B, 0x8 MB_DCOMP1: LD A, (DE) SUB (HL) JP NZ, MB_FCOMPD DEC DE DEC HL DEC B JP NZ, MB_DCOMP1 POP BC RET MB_DCOMP: CALL MB_XDCOMP JP NZ, MB_FCOMPS RET MB_FRCINT: CALL MB_GETYPR LD HL, (MB_FACLO) RET M JP Z, MB_TMERR JP PO, MB_FRCIN2 MB_FDBINT: CALL MB_VMOVAF LD HL, MB_DHALF CALL MB_VMOVFM CALL MB_DADD CALL MB_CONSD JP MB_FRCIN3 MB_FRCIN2: CALL MB_FADDH MB_FRCIN3: LD A, (MB_FAC-1) ;FAC-1 OR A PUSH AF AND 0x7f LD (MB_FAC-1), A ;FAC-1 LD A, (MB_FAC) CP 0x90 JP NC, MB_OVERR CALL MB_QINT LD A, (MB_FAC) OR A JP NZ, MB_FRCIAA POP AF EX DE, HL JP MB_FRCI3A MB_FRCIAA: POP AF EX DE, HL JP P, MB_FRCIN4 MB_FRCI3A: LD A, H CPL LD H, A LD A, L CPL LD L, A MB_FRCIN4: JP MB_MAKINT ;CONVERT SINGLE PRECISION NUMBER TO INTEGER MB_COSIN: LD HL, MB_OVERR PUSH HL MB_CONIS: LD A, (MB_FAC) CP 0x90 JP NC, MB_CONIS2 CALL MB_QINT EX DE, HL MB_CONIS1: POP DE MB_MAKINT: LD (MB_FACLO), HL MB_VALINT: LD A, 0x2 MB_CONISD: LD (MB_VALTYP), A RET MB_CONIS2: LD BC, 0x9080 ;220Q*256+200Q LD DE, 0x0 CALL MB_FCOMP RET NZ LD H, C LD L, D JP MB_CONIS1 MB_FRCSNG: CALL MB_GETYPR RET PO JP M, MB_CONSI JP Z, MB_TMERR MB_CONSD: CALL MB_MOVRF CALL MB_VALSNG LD A, B OR A RET Z CALL MB_UNPACK LD HL, MB_FACLO - 1 LD B, (HL) JP MB_ROUND ; =================================================== MB_CONSI: LD HL, (MB_FACLO) MB_CONSIH: CALL MB_VALSNG LD A, H LD D, L LD E, 0x0 LD B, 0x90 JP MB_FLOATR MB_FRCDBL: CALL MB_GETYPR RET NC JP Z, MB_TMERR CALL M, MB_CONSI ; =================================================== MB_CONDS: LD HL, 0x0 LD (MB_DFACLO), HL LD (MB_DFACLO+2), HL MB_VALDBL: LD A, 0x8 DB 1 MB_VALSNG: LD A, 0x4 JP MB_CONISD ; =================================================== MB_CHKSTR: CALL MB_GETYPR RET Z JP MB_TMERR ; --------------------------------------------------- ; GREATEST INTEGER FUNCTION ; --------------------------------------------------- MB_QINT: LD B, A LD C, A LD D, A LD E, A OR A RET Z PUSH HL CALL MB_MOVRF CALL MB_UNPACK XOR (HL) LD H, A CALL M, MB_QINTA LD A, 152 SUB B CALL MB_SHIFTR LD A, H RLA CALL C, MB_ROUNDA LD B, 0x0 CALL C, MB_NEGR POP HL RET MB_QINTA: DEC DE LD A, D AND E INC A RET NZ MB_DCXBRT: DEC BC RET MB_FIXER: CALL MB_GETYPR RET M CALL MB_SIGN JP P, MB_VINT CALL MB_NEG CALL MB_VINT JP MB_VNEG MB_VINT: CALL MB_GETYPR RET M JP NC, MB_DINT JP Z, MB_TMERR CALL MB_CONIS MB_INT: LD HL, MB_FAC LD A, (HL) CP 0x98 LD A, (MB_FACLO) RET NC LD A, (HL) CALL MB_QINT LD (HL), 0x98 LD A, E PUSH AF LD A, C RLA CALL MB_FADFLT POP AF RET MB_DINT: LD HL, MB_FAC LD A, (HL) CP 0x90 JP NZ, MB_DINT2 LD C, A DEC HL LD A, (HL) XOR 0x80 LD B, 0x6 MB_DINT1: DEC HL OR (HL) DEC B JP NZ, MB_DINT1 OR A LD HL, 0x8000 JP NZ, MB_DIN05 CALL MB_MAKINT JP MB_FRCDBL MB_DIN05: LD A, C MB_DINT2: OR A RET Z CP 184 RET NC MB_DINTFO: PUSH AF CALL MB_MOVRF CALL MB_UNPACK XOR (HL) DEC HL LD (HL), 0xb8 PUSH AF DEC HL LD (HL), C CALL M, MB_DINTA LD A, (MB_FAC-1) ;FAC-1 LD C, A LD HL, MB_FAC-1 ;FAC-1 LD A, 184 SUB B CALL MB_DSHFTR POP AF CALL M, MB_DROUNA XOR A LD (MB_FLOAT_ACC), A POP AF RET NC JP MB_DNORML MB_DINTA: LD HL, MB_DFACLO MB_DINTA1: LD A, (HL) DEC (HL) OR A INC HL JP Z, MB_DINTA1 RET MB_UMULT: PUSH HL LD HL, 0x0 LD A, B OR C JP Z, MB_MULRET LD A, 0x10 MB_UMULT1: ADD HL, HL JP C, MB_BSERR EX DE, HL ADD HL, HL EX DE, HL JP NC, MB_UMULT2 ADD HL, BC JP C, MB_BSERR MB_UMULT2: DEC A JP NZ, MB_UMULT1 MB_MULRET: EX DE, HL POP HL RET MB_ISUB: LD A, H RLA SBC A, A LD B, A CALL MB_INEGHL LD A, C SBC A, B JP MB_IADDS MB_IADD: LD A, H RLA SBC A, A MB_IADDS: LD B, A PUSH HL LD A, D RLA SBC A, A ADD HL, DE ADC A, B RRCA XOR H JP P, MB_CONIS1 PUSH BC EX DE, HL CALL MB_CONSIH POP AF POP HL CALL MB_PUSHF EX DE, HL CALL MB_INEGAD JP MB_FADDT MB_IMUL: LD A, H OR L JP Z, MB_MAKINT PUSH HL PUSH DE CALL MB_IMULDV PUSH BC LD B, H LD C, L LD HL, 0x0 LD A, 0x10 MB_IMULT1: ADD HL, HL JP C, MB_IMULT5 EX DE, HL ADD HL, HL EX DE, HL JP NC, MB_IMULT2 ADD HL, BC JP C, MB_IMULT5 MB_IMULT2: DEC A JP NZ, MB_IMULT1 POP BC POP DE MB_IMLDIV: LD A, H OR A JP M, MB_IMULT3 POP DE LD A, B JP MB_INEGA MB_IMULT3: XOR 0x80 OR L JP Z, MB_IMULT4 EX DE, HL DB 1 MB_IMULT5: POP BC POP HL CALL MB_CONSIH POP HL CALL MB_PUSHF CALL MB_CONSIH MB_FMULTT: POP BC POP DE JP MB_FMUL MB_IMULT4: LD A, B OR A POP BC JP M, MB_MAKINT PUSH DE CALL MB_CONSIH POP DE JP MB_NEG MB_IDIV: LD A, H OR L JP Z, MB_DV0ERR CALL MB_IMULDV PUSH BC EX DE, HL CALL MB_INEGHL LD B, H LD C, L LD HL, 0x0 LD A, 0x11 PUSH AF OR A JP MB_IDIV3 MB_IDIV1: PUSH AF PUSH HL ADD HL, BC JP NC, MB_IDIV2 POP AF SCF DB 0x3E MB_IDIV2: POP HL MB_IDIV3: LD A, E RLA LD E, A LD A, D RLA LD D, A LD A, L RLA LD L, A LD A, H RLA LD H, A POP AF DEC A JP NZ, MB_IDIV1 EX DE, HL POP BC PUSH DE JP MB_IMLDIV MB_IMULDV: LD A, H XOR D LD B, A CALL MB_INEGH EX DE, HL MB_INEGH: LD A, H MB_INEGA: OR A JP P, MB_MAKINT MB_INEGHL: XOR A LD C, A SUB L LD L, A LD A, C SBC A, H LD H, A JP MB_MAKINT MB_INEG: LD HL, (MB_FACLO) CALL MB_INEGHL LD A, H XOR 0x80 OR L RET NZ MB_INEG2: EX DE, HL CALL MB_VALSNG XOR A MB_INEGAD: LD B, 0x98 JP MB_FLOATR MB_IMOD: PUSH DE CALL MB_IDIV XOR A ADD A, D RRA LD H, A LD A, E RRA LD L, A CALL MB_VALINT POP AF JP MB_INEGA ; =================================================== ; DOUBLE PRECISION ARITHMETIC ROUTINES ; =================================================== MB_DSUB: LD HL, MB_ARG-1 LD A, (HL) XOR 0x80 LD (HL), A ; =================================================== ; FUNCTION ; =================================================== MB_DADD: LD HL, MB_ARG LD A, (HL) OR A RET Z LD B, A DEC HL LD C, (HL) LD DE, MB_FAC LD A, (DE) OR A JP Z, MB_VMOVFA SUB B JP NC, MB_DADD2 CPL INC A PUSH AF LD C, 0x8 INC HL PUSH HL MB_DADD1: LD A, (DE) LD B, (HL) LD (HL), A LD A, B LD (DE), A DEC DE DEC HL DEC C JP NZ, MB_DADD1 POP HL LD B, (HL) DEC HL LD C, (HL) POP AF MB_DADD2: CP 0x39 RET NC PUSH AF CALL MB_UNPACK LD HL, MB_ARGLO-1 ;ARGLO-1 LD B, A LD A, 0x0 LD (HL), A LD (MB_FLOAT_ACC), A POP AF LD HL, MB_ARG-1 CALL MB_DSHFTR LD A, B OR A JP P, MB_DADD3 LD A, (MB_ARGLO-1) LD (MB_FLOAT_ACC), A CALL MB_DADDAA JP NC, MB_DROUND EX DE, HL INC (HL) JP Z, MB_OVFIN4 CALL MB_DSHFRB JP MB_DROUND MB_DADD3: LD A, 0x9e CALL MB_DADDA LD HL, MB_FAC+1 CALL C, MB_DNEGR MB_DNORML: XOR A MB_DNORM1: LD B, A LD A, (MB_FAC-1) OR A JP NZ, MB_DNORM5 LD HL, MB_DFACLO-1 LD C, 0x8 MB_DNORM2: LD D, (HL) LD (HL), A LD A, D INC HL DEC C JP NZ, MB_DNORM2 LD A, B SUB 0x8 CP 0xc0 JP NZ, MB_DNORM1 JP MB_ZERO MB_DNORM3: DEC B LD HL, MB_FLOAT_ACC CALL MB_DSHFLC OR A MB_DNORM5: JP P, MB_DNORM3 LD A, B OR A JP Z, MB_DROUND LD HL, MB_FAC ADD A, (HL) LD (HL), A JP NC, MB_ZERO RET Z MB_DROUND: LD A, (MB_FLOAT_ACC) ;DFACLO-1 MB_DROUNB: OR A CALL M, MB_DROUNA LD HL, MB_FAC+1 LD A, (HL) AND 0x80 DEC HL DEC HL XOR (HL) LD (HL), A RET MB_DROUNA: LD HL, MB_DFACLO LD B, 0x7 MB_DRONA1: INC (HL) RET NZ INC HL DEC B JP NZ, MB_DRONA1 INC (HL) JP Z, MB_OVFIN4 DEC HL LD (HL), 0x80 RET MB_DADDD: LD DE, MB_FBUFFR+27 LD HL, MB_ARGLO JP MB_DADDS MB_DADDAA: DB 0x3E ADC A, (HL) MB_DADDA: LD HL, MB_ARGLO MB_DADDFO: LD DE, MB_DFACLO MB_DADDS: LD C, 0x7 MB_DADDS1: LD (MB_DADDOP), A XOR A MB_DADDL: LD A, (DE) MB_DADDOP: ADC A, (HL) LD (DE), A INC DE INC HL DEC C JP NZ, MB_DADDL RET MB_DNEGR: LD A, (HL) CPL LD (HL), A LD HL, 0xbff LD B, 0x8 XOR A LD C, A MB_DNEGR1: LD A, C SBC A, (HL) LD (HL), A INC HL DEC B JP NZ, MB_DNEGR1 RET MB_DSHFTR: LD (HL), C PUSH HL MB_DSHFR1: SUB 0x8 JP C, MB_DSHFR3 POP HL MB_DSHFRM: PUSH HL LD DE, 0x800 MB_DSHFR2: LD C, (HL) LD (HL), E LD E, C DEC HL DEC D JP NZ, MB_DSHFR2 JP MB_DSHFR1 MB_DSHFR3: ADD A, 0x9 LD D, A MB_DSHFR4: XOR A POP HL DEC D RET Z MB_DSHFRA: PUSH HL LD E, 0x8 MB_DSHFR5: LD A, (HL) RRA LD (HL), A DEC HL DEC E JP NZ, MB_DSHFR5 JP MB_DSHFR4 MB_DSHFRB: LD HL, MB_FAC-1 LD D, 0x1 JP MB_DSHFRA MB_DSHFLC: LD C, 0x8 MB_DSHFTL: LD A, (HL) RLA LD (HL), A INC HL DEC C JP NZ, MB_DSHFTL RET MB_DMULT: CALL MB_SIGN RET Z LD A, (MB_ARG) OR A JP Z, MB_ZERO CALL MB_MULDVA CALL MB_DMULDV LD (HL), C INC DE LD B, 0x7 MB_DMULT2: LD A, (DE) INC DE OR A PUSH DE JP Z, MB_DMULT5 LD C, 0x8 MB_DMULT3: PUSH BC RRA LD B, A CALL C, MB_DADDAA CALL MB_DSHFRB LD A, B POP BC DEC C JP NZ, MB_DMULT3 MB_DMULT4: POP DE DEC B JP NZ, MB_DMULT2 JP MB_DNORML MB_DMULT5: LD HL, MB_FAC-1 CALL MB_DSHFRM JP MB_DMULT4 MB_TENTH: DB 0xCD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x4C, 0x7D MB_DTEN: DB 0, 0, 0, 0 MB_FTEN: DB 0, 0, 0x20, 0x84 MB_DDIV10: LD A, (MB_FAC) CP 0x41 JP NC, MB_DD04 LD DE, MB_TENTH LD HL, MB_ARGLO CALL MB_VMOVE JP MB_DMULT MB_DD04: LD A, (MB_FAC-1) OR A JP P, MB_DD05 AND 0x7f LD (MB_FAC-1), A LD HL, MB_NEG PUSH HL MB_DD05: CALL _DECF1 LD DE, MB_DFACLO LD HL, MB_ARGLO CALL MB_VMOVE CALL _DECF1 CALL MB_DADD LD DE, MB_DFACLO LD HL, MB_ARGLO CALL MB_VMOVE LD A, 0xf MB_DD10: PUSH AF CALL _DECA4 CALL _PSARG CALL MB_DADD ;LAB_ram_2dfd: LD HL, MB_ARG-1 CALL _PPARG POP AF DEC A JP NZ, MB_DD10 CALL _DECF1 CALL _DECF1 _DECF1: LD HL, MB_FAC DEC (HL) RET NZ JP MB_ZERO _DECA4: LD HL, MB_ARG LD A, 0x4 MB_DC4: DEC (HL) RET Z DEC A JP NZ, MB_DC4 RET _PSARG: POP DE LD A, 0x4 LD HL, MB_ARGLO MB_PSA10: LD C, (HL) INC HL LD B, (HL) INC HL PUSH BC DEC A JP NZ, MB_PSA10 PUSH DE RET _PPARG: POP DE LD A, 0x4 LD HL, MB_ARG MB_PPA10: POP BC LD (HL), B DEC HL LD (HL), C DEC HL DEC A JP NZ, MB_PPA10 PUSH DE RET MB_DDIV: LD A, (MB_ARG) OR A JP Z, MB_INTDV0 LD A, (MB_FAC) OR A JP Z, MB_ZERO CALL MB_MULDVS INC (HL) INC (HL) JP Z, MB_OVFIN4 CALL MB_DMULDV LD HL, MB_FBUFFR+34 LD (HL), C LD B, C MB_DDIV1: DB 0x3E SBC A, (HL) CALL MB_DADDD LD A, (DE) SBC A, C CCF JP C, MB_DDIV2 DB 0x3E ADC A, (HL) CALL MB_DADDD XOR A DB 0xDA MB_DDIV2: LD (DE), A INC B LD A, (MB_FAC-1) INC A DEC A RRA JP M, MB_DROUNB RLA LD HL, MB_DFACLO LD C, 0x7 CALL MB_DSHFTL LD HL, MB_FBUFFR+27 CALL MB_DSHFLC LD A, B OR A JP NZ, MB_DDIV1 LD HL, MB_FAC DEC (HL) JP NZ, MB_DDIV1 JP MB_ZERO MB_DMULDV: LD A, C LD (MB_ARG-1), A DEC HL LD DE, MB_FBUFFR+33 LD BC, 0x700 MB_DMLDV1: LD A, (HL) LD (DE), A LD (HL), C DEC DE DEC HL DEC B JP NZ, MB_DMLDV1 RET ; =================================================== MB_DMUL10: CALL MB_VMOVAF EX DE, HL DEC HL LD A, (HL) OR A RET Z ADD A, 0x2 JP C, MB_OVFIN4 LD (HL), A PUSH HL CALL MB_DADD POP HL INC (HL) RET NZ JP MB_OVFIN4 ; =================================================== MB_FINDBL: CALL MB_ZERO CALL MB_VALDBL DB 0xF6 ; =================================================== MB_FIN: XOR A LD BC, MB_FINOVC PUSH BC PUSH AF LD A, 0x1 LD (MB_FLGOVC), A POP AF EX DE, HL LD BC, 0xff LD H, B LD L, B CALL Z, MB_MAKINT EX DE, HL LD A, (HL) ;= 44 CP '&' JP Z, MB_OCTCNS CP '-' PUSH AF JP Z, MB_FINC CP '+' JP Z, MB_FINC DEC HL MB_FINC: CALL MB_CHRGTR JP C, MB_FINDIG CP '.' JP Z, MB_FINDP CP 'e' JP Z, MB_FINC1 CP 'E' MB_FINC1: JP NZ, MB_NOTE PUSH HL CALL MB_CHRGTR CP 'l' JP Z, MB_WUZELS CP 'L' JP Z, MB_WUZELS CP 'q' JP Z, MB_WUZELS CP 'Q' MB_WUZELS: POP HL JP Z, MB_WUZ LD A, (MB_VALTYP) CP 0x8 JP Z, MB_FINEX1 LD A, 0x0 JP MB_FINEX1 MB_WUZ: LD A, (HL) MB_NOTE: CP '%' JP Z, MB_FININT CP '#' JP Z, MB_FINDBF CP '!' JP Z, MB_FINSNF CP 'd' JP Z, MB_FINEX1 CP 'D' JP NZ, MB_FINE MB_FINEX1: OR A MB_FINEX: CALL MB_FINFRC CALL MB_CHRGTR CALL MB_MINPLS MB_FINEC: CALL MB_CHRGTR JP C, MB_FINEDG INC D JP NZ, MB_FINE XOR A SUB E LD E, A MB_FINE: PUSH HL LD A, E SUB B LD E, A MB_FINE2: CALL P, MB_FINMUL CALL M, MB_FINDIV JP NZ, MB_FINE2 POP HL POP AF PUSH HL CALL Z, MB_VNEG POP HL CALL MB_GETYPR RET PE PUSH HL LD HL, MB_POPHRT PUSH HL CALL MB_CONIS2 RET MB_FINDP: CALL MB_GETYPR INC C JP NZ, MB_FINE CALL C, MB_FINFRC JP MB_FINC MB_FININT: CALL MB_CHRGTR POP AF PUSH HL LD HL, MB_POPHRT PUSH HL LD HL, MB_FRCINT PUSH HL PUSH AF JP MB_FINE MB_FINDBF: OR A MB_FINSNF: CALL MB_FINFRC CALL MB_CHRGTR JP MB_FINE MB_FINFRC: PUSH HL PUSH DE PUSH BC PUSH AF CALL Z, MB_FRCSNG POP AF CALL NZ, MB_FRCDBL POP BC POP DE POP HL RET MB_FINMUL: RET Z MB_FINMLT: PUSH AF CALL MB_GETYPR PUSH AF CALL PO, MB_MUL10 POP AF CALL PE, MB_DMUL10 POP AF MB_DCRART: DEC A RET MB_FINDIV: PUSH DE PUSH HL PUSH AF CALL MB_GETYPR PUSH AF CALL PO, MB_DIV10 POP AF CALL PE, MB_DDIV10 POP AF POP HL POP DE INC A RET MB_FINDIG: PUSH DE LD A, B ADC A, C LD B, A PUSH BC PUSH HL LD A, (HL) SUB '0' PUSH AF CALL MB_GETYPR JP P, MB_FINDGV LD HL, (MB_FACLO) LD DE, 3277 ; check for overflov CALL MB_DCOMPR JP NC, MB_FINDG2 LD D, H LD E, L ADD HL, HL ADD HL, HL ADD HL, DE ADD HL, HL POP AF LD C, A ADD HL, BC LD A, H OR A JP M, MB_FINDG1 LD (MB_FACLO), HL MB_FINDGE: POP HL POP BC POP DE JP MB_FINC MB_FINDG1: LD A, C PUSH AF MB_FINDG2: CALL MB_CONSI SCF MB_FINDGV: JP NC, MB_FINDGD LD BC, 0x9474 LD DE, 0x2400 CALL MB_FCOMP JP P, MB_FINDG3 CALL MB_MUL10 POP AF CALL MB_FINLOG JP MB_FINDGE MB_FINDG3: CALL MB_CONDS MB_FINDGD: CALL MB_DMUL10 CALL MB_VMOVAF POP AF CALL MB_FLOAT CALL MB_CONDS CALL MB_DADD JP MB_FINDGE MB_FINLOG: CALL MB_PUSHF CALL MB_FLOAT MB_FADDT: POP BC POP DE JP MB_FADD MB_FINEDG: LD A, E CP 0xa JP NC, MB_FINEDO RLCA RLCA ADD A, E RLCA ADD A, (HL) SUB '0' LD E, A DB 0xFA MB_FINEDO: LD E, 0x7f JP MB_FINEC MB_OVFIN2: PUSH HL LD HL, MB_FAC-1 CALL MB_GETYPR JP PO, MB_OVF2A LD A, (MB_ARG-1) JP MB_OVF2B MB_OVF2A: LD A, C MB_OVF2B: XOR (HL) RLA POP HL JP MB_OVFINT MB_OVFIN6: POP AF POP AF MB_OVFIN3: LD A, (MB_FAC-1) RLA JP MB_OVFINT MB_OVFIN8: POP AF MB_OVFIN4: LD A, (MB_FAC+1) CPL RLA JP MB_OVFINT MB_INTDV1: LD A, C JP MB_INTDV2 MB_INTDV0: LD A, (MB_ARG-1) MB_INTDV2: RLA LD HL, MB_DBZ_MSG ;= "Division by zero" LD (MB_OVERRI), HL ;= 509h MB_OVFINT: PUSH HL PUSH BC PUSH DE PUSH AF PUSH AF LD HL, (MB_ONELIN) LD A, H OR L JP NZ, MB_OVFPRT LD HL, MB_FLGOVC LD A, (HL) OR A JP Z, MB_OV1A DEC A JP NZ, MB_OVFPRT INC (HL) MB_OV1A: LD HL, (MB_OVERRI) ; = 509h CALL MB_STRPRN LD (MB_TTYPOS), A LD A, 0xd CALL MB_CALTTY LD A, 0xa CALL MB_CALTTY MB_OVFPRT: POP AF LD HL, MB_FACLO LD DE, MB_INFP JP NC, MB_OVFINA LD DE, MB_INFM MB_OVFINA: CALL MB_MOVE CALL MB_GETYPR JP C, MB_OVFINB LD HL, MB_DFACLO LD DE, MB_INFM CALL MB_MOVE MB_OVFINB: LD HL, (MB_ONELIN) LD A, H OR L LD HL, (MB_OVERRI) ; = 509h LD DE, MB_OVRMSG ; = "Overflow" EX DE, HL LD (MB_OVERRI), HL ; = 509h JP Z, MB_NOODTP CALL MB_DCOMPR JP Z, MB_OVERR JP MB_DV0ERR MB_NOODTP: POP AF POP DE POP BC POP HL RET MB_INFP: DB 0xFF, 0xFF, 0x7F, 0xFF MB_INFM: DB 0xFF, 0xFF, 0xFF, 0xFF ; =================================================== ; FLOATING POINT OUTPUT ROUTINE ; =================================================== MB_INPRT: PUSH HL LD HL, MB_INTXT ;= " in " CALL MB_STROUT POP HL MB_LINPTR: LD BC, MB_STROUI PUSH BC MB_LINOUT: CALL MB_MAKINT XOR A CALL MB_FOUINI OR (HL) JP MB_FOUT2 MB_FOUT: XOR A MB_PUFOUT: CALL MB_FOUINI AND 0x8 JP Z, MB_FOUT1 LD (HL), '+' MB_FOUT1: EX DE, HL CALL MB_VSIGN EX DE, HL JP P, MB_FOUT2 LD (HL), '-' PUSH BC PUSH HL CALL MB_VNEG POP HL POP BC OR H MB_FOUT2: INC HL LD (HL), '0' LD A, (MB_TEMP3) LD D, A RLA LD A, (MB_VALTYP) JP C, MB_FOUTFX JP Z, MB_FOUTZR CP 0x4 JP NC, MB_FOUFRV LD BC, 0x0 CALL MB_FOUTCI MB_FOUTZS: LD HL, MB_FBUFFR+1 LD B, (HL) LD C, ' ' LD A, (MB_TEMP3) LD E, A AND 0x20 JP Z, MB_FOTZS1 LD A, B CP C LD C, '*' JP NZ, MB_FOTZS1 LD A, E AND 0x4 JP NZ, MB_FOTZS1 LD B, C MB_FOTZS1: LD (HL), C CALL MB_CHRGTR JP Z, MB_FOTZS4 CP 'E' JP Z, MB_FOTZS4 CP 'D' JP Z, MB_FOTZS4 CP '0' JP Z, MB_FOTZS1 CP ',' JP Z, MB_FOTZS1 CP '.' JP NZ, MB_FOTZS2 MB_FOTZS4: DEC HL LD (HL), '0' MB_FOTZS2: LD A, E AND 0x10 JP Z, MB_FOTZS3 DEC HL LD (HL), ASCII_CUR MB_FOTZS3: LD A, E AND 0x4 RET NZ DEC HL LD (HL), B RET MB_FOUINI: LD (MB_TEMP3), A LD HL, MB_FBUFFR+1 LD (HL), ' ' RET MB_FOUFRV: CALL MB_PUSHF EX DE, HL LD HL, (MB_DFACLO) PUSH HL LD HL, (MB_DFACLO+2) PUSH HL EX DE, HL PUSH AF XOR A LD (MB_FANSII), A POP AF PUSH AF CALL MB_FOUFRF LD B, 'E' LD C, 0x0 ; SEARCH FOR "D" MB_FU1: PUSH HL MB_FU1A: LD A, (HL) MB_FU2: CP B JP Z, MB_FU4 CP ':' JP NC, MB_FU2A CP '0' JP C, MB_FU2A INC C MB_FU2A: INC HL LD A, (HL) OR A JP NZ, MB_FU2 LD A, 'D' CP B LD B, A POP HL LD C, 0x0 JP NZ, MB_FU1 MB_FU3: POP AF POP BC POP DE EX DE, HL LD (MB_DFACLO), HL LD H, B LD L, C LD (MB_DFACLO+2), HL EX DE, HL POP BC POP DE RET MB_FU4: PUSH BC MB_FU_EV: LD B, 0x0 INC HL LD A, (HL) MB_FU5: CP '+' JP Z, MB_FU8 CP '-' JP Z, MB_FU5A SUB '0' LD C, A LD A, B ADD A, A ADD A, A ADD A, B ADD A, A ADD A, C LD B, A CP 0x10 JP NC, MB_FU8 MB_FU5A: INC HL LD A, (HL) OR A JP NZ, MB_FU5 LD H, B POP BC LD A, B CP 'E' JP NZ, MB_FU7 LD A, C ADD A, H CP 0x9 POP HL JP NC, MB_FU3 MB_FU6: LD A, 0x80 LD (MB_FANSII), A JP MB_FU9 MB_FU7: LD A, H ADD A, C CP 0x12 POP HL JP NC, MB_FU3 JP MB_FU6 MB_FU8: POP BC POP HL JP MB_FU3 MB_FU9: POP AF POP BC POP DE EX DE, HL LD (MB_DFACLO), HL LD H, B LD L, C LD (MB_DFACLO+2), HL EX DE, HL POP BC POP DE CALL MB_MOVFR INC HL MB_FOUFRF: CP 0x5 PUSH HL SBC A, 0x0 RLA LD D, A INC D CALL MB_FOUTNV LD BC, 0x300 PUSH AF LD A, (MB_FANSII) OR A JP P, MB_FOFV5A POP AF ADD A, D JP MB_FOUFV6 MB_FOFV5A: POP AF ADD A, D JP M, MB_FOFRS1 INC D CP D JP NC, MB_FOFRS1 MB_FOUFV6: INC A LD B, A LD A, 0x2 MB_FOFRS1: SUB 0x2 POP HL PUSH AF CALL MB_FOUTAN LD (HL), '0' CALL Z, MB_INXHRT CALL MB_FOUTCV MB_FOFRS2: DEC HL LD A, (HL) CP '0' JP Z, MB_FOFRS2 CP '.' CALL NZ, MB_INXHRT POP AF JP Z, MB_FOUTDN MB_FOFLDN: PUSH AF CALL MB_GETYPR LD A, '"' ADC A, A LD (HL), A INC HL POP AF LD (HL), '+' JP P, MB_FOUCE1 LD (HL), '-' CPL INC A MB_FOUCE1: LD B, 0x2f ;'0'-1 MB_FOUCE2: INC B SUB 0xa JP NC, MB_FOUCE2 ADD A, ':' ;'0'+12O INC HL LD (HL), B INC HL LD (HL), A MB_FOUTZR: INC HL MB_FOUTDN: LD (HL), 0x0 EX DE, HL LD HL, MB_FBUFFR+1 RET MB_FOUTFX: INC HL PUSH BC CP 0x4 LD A, D JP NC, MB_FOUFXV RRA JP C, MB_FFXIFL LD BC, 0x603 CALL MB_FOUICC POP DE LD A, D SUB 0x5 CALL P, MB_FOTZER CALL MB_FOUTCI MB_FOUTTD: LD A, E OR A CALL Z, MB_DCXHRT DEC A CALL P, MB_FOTZER MB_FOUTTS: PUSH HL CALL MB_FOUTZS POP HL JP Z, MB_FFXIX1 LD (HL), B INC HL MB_FFXIX1: LD (HL), 0x0 LD HL, MB_FBUFFR MB_FOUBE1: INC HL MB_FOUBE5: LD A, (MB_TEMP2) SUB L SUB D RET Z LD A, (HL) CP ' ' JP Z, MB_FOUBE1 CP '*' JP Z, MB_FOUBE1 DEC HL PUSH HL MB_FOUBE2: PUSH AF LD BC, MB_FOUBE2 PUSH BC CALL MB_CHRGTR CP '-' RET Z CP '+' RET Z CP ASCII_CUR RET Z POP BC CP '0' JP NZ, MB_FOUBE4 INC HL CALL MB_CHRGTR JP NC, MB_FOUBE4 DEC HL DB 1 MB_FOUBE3: DEC HL LD (HL), A POP AF JP Z, MB_FOUBE3 POP BC JP MB_FOUBE5 MB_FOUBE4: POP AF JP Z, MB_FOUBE4 POP HL LD (HL), '%' RET MB_FOUFXV: PUSH HL RRA JP C, MB_FFXFLV JP Z, MB_FFXSFX LD DE, MB_FFXDXM CALL MB_DCOMPD LD D, 0x10 JP M, MB_FFXSDC MB_FFXSDO: POP HL POP BC CALL MB_FOUT DEC HL LD (HL), '%' RET MB_FFXSFX: LD BC, 0xb60e LD DE, 0x1bca CALL MB_FCOMP JP P, MB_FFXSDO LD D, 0x6 MB_FFXSDC: CALL MB_SIGN CALL NZ, MB_FOUTNV POP HL POP BC JP M, MB_FFXXVS MB_FFXSD2: PUSH BC LD E, A LD A, B SUB D SUB E CALL P, MB_FOTZER CALL MB_FOUTCD CALL MB_FOUTCV OR E CALL NZ, MB_FOTZEC OR E CALL NZ, MB_FOUTED POP DE JP MB_FOUTTD MB_FFXXVS: LD E, A LD A, C OR A CALL NZ, MB_DCRART ADD A, E MB_FFXXS2: JP M, MB_FFXXV8 XOR A MB_FFXXV8: PUSH BC PUSH AF MB_FFXXV2: CALL M, MB_FINDIV JP M, MB_FFXXV2 POP BC LD A, E SUB B POP BC LD E, A ADD A, D LD A, B JP M, MB_FFXXV3 SUB D SUB E CALL P, MB_FOTZER PUSH BC CALL MB_FOUTCD JP MB_FFXXV6 MB_FFXXV3: CALL MB_FOTZER SUB_ram_33cc: LD A, C CALL MB_FOUTDP LD C, A XOR A SUB D SUB E CALL MB_FOTZER PUSH BC LD B, A LD C, A MB_FFXXV6: CALL MB_FOUTCV ; CONVERT THE NUMBER TO DECIMAL DIGITS POP BC OR C JP NZ, MB_FFXXV7 LD HL, (MB_TEMP2) MB_FFXXV7: ADD A, E DEC A CALL P, MB_FOTZER LD D, B JP MB_FOUTTS MB_FFXIFL: PUSH HL PUSH DE CALL MB_CONSI POP DE XOR A MB_FFXFLV: JP Z, MB_FFXSFL LD E, 0x10 DB 1 MB_FFXSFL: LD E, 0x6 CALL MB_SIGN SCF CALL NZ, MB_FOUTNV POP HL POP BC PUSH AF LD A, C OR A PUSH AF CALL NZ, MB_DCRART ADD A, B LD C, A LD A, D AND 0x4 CP 0x1 SBC A, A LD D, A ADD A, C LD C, A SUB E PUSH AF PUSH BC MB_FFXLV1: CALL M, MB_FINDIV JP M, MB_FFXLV1 POP BC POP AF PUSH BC PUSH AF JP M, MB_FFXLV3 XOR A MB_FFXLV3: CPL INC A ADD A, B INC A ADD A, D LD B, A LD C, 0 CALL MB_FOUTCV POP AF CALL P, MB_FOTZNC CALL MB_FOUTED POP BC POP AF JP NZ, MB_FFXLV4 CALL MB_DCXHRT LD A, (HL) CP '.' CALL NZ, MB_INXHRT LD (MB_TEMP2), HL MB_FFXLV4: POP AF JP C, MB_FFXLV2 ADD A, E SUB B SUB D MB_FFXLV2: PUSH BC CALL MB_FOFLDN EX DE, HL POP DE JP MB_FOUTTS MB_FOUTNV: PUSH DE XOR A PUSH AF CALL MB_GETYPR JP PO, MB_FOUNDB MB_FORBIG: LD A, (MB_FAC) CP 0x91 JP NC, MB_FOUNDB LD DE, MB_TENTEN LD HL, MB_ARGLO CALL MB_VMOVE CALL MB_DMULT POP AF SUB 10 PUSH AF JP MB_FORBIG MB_FOUNDB: CALL MB_FOUNVC MB_FOUNV1: CALL MB_GETYPR JP PE, MB_FOUNV4 LD BC, 0x9143 LD DE, 0x4ff9 CALL MB_FCOMP JP MB_FOUNV5 MB_FOUNV4: LD DE, MB_FOUTDL CALL MB_DCOMPD MB_FOUNV5: JP P, MB_FOUNV3 POP AF CALL MB_FINMLT PUSH AF JP MB_FOUNV1 MB_FOUNV2: POP AF CALL MB_FINDIV PUSH AF CALL MB_FOUNVC MB_FOUNV3: POP AF OR A POP DE RET MB_FOUNVC: CALL MB_GETYPR JP PE, MB_FONVC1 LD BC, 0x9474 LD DE, 0x23f8 CALL MB_FCOMP JP MB_FONVC2 MB_FONVC1: LD DE, MB_FOUTDU CALL MB_DCOMPD MB_FONVC2: POP HL JP P, MB_FOUNV2 JP (HL) MB_FOTZER: OR A MB_FOTZR1: RET Z DEC A LD (HL), '0' INC HL JP MB_FOTZR1 MB_FOTZNC: JP NZ, MB_FOTZEC MB_FOTZRC: RET Z CALL MB_FOUTED MB_FOTZEC: LD (HL), '0' INC HL DEC A JP MB_FOTZRC MB_FOUTCD: LD A, E ADD A, D INC A LD B, A INC A MB_FOTCD1: SUB 0x3 JP NC, MB_FOTCD1 ADD A, 0x5 LD C, A MB_FOUICC: LD A, (MB_TEMP3) AND 0x40 RET NZ LD C, A RET MB_FOUTAN: DEC B JP P, MB_FOUTE1 LD (MB_TEMP2), HL LD (HL), '.' MB_FOUTD1: INC HL LD (HL), '0' INC B JP NZ, MB_FOUTD1 INC HL LD C, B RET MB_FOUTED: DEC B MB_FOUTE1: JP NZ, MB_FOUED1 MB_FOUTDP: LD (HL), '.' LD (MB_TEMP2), HL INC HL LD C, B RET MB_FOUED1: DEC C RET NZ LD (HL), ',' INC HL LD C, 0x3 RET MB_FOUTCV: PUSH DE CALL MB_GETYPR JP PO, MB_FOUTCS PUSH BC PUSH HL CALL MB_VMOVAF LD HL, MB_DHALF CALL MB_VMOVFM CALL MB_DADD XOR A CALL MB_DINTFO POP HL POP BC LD DE, MB_FODTBL LD A, 0xa MB_FOUCD1: CALL MB_FOUTED PUSH BC PUSH AF PUSH HL PUSH DE LD B, '0' - 1 MB_FOUCD2: INC B POP HL PUSH HL DB 0x3E SBC A, (HL) CALL MB_DADDFO JP NC, MB_FOUCD2 POP HL DB 0x3E ADC A, (HL) CALL MB_DADDFO EX DE, HL POP HL LD (HL), B INC HL POP AF POP BC DEC A JP NZ, MB_FOUCD1 PUSH BC PUSH HL LD HL, MB_DFACLO CALL MB_MOVFM JP MB_FOUCDC MB_FOUTCS: PUSH BC PUSH HL CALL MB_FADDH LD A, 0x1 CALL MB_QINT CALL MB_MOVFR MB_FOUCDC: POP HL POP BC XOR A LD DE, MB_FOSTBL MB_FOUCS1: CCF CALL MB_FOUTED PUSH BC PUSH AF PUSH HL PUSH DE CALL MB_MOVRF POP HL LD B, '0'-1 MB_FOUCS2: INC B LD A, E SUB (HL) LD E, A INC HL LD A, D SBC A, (HL) LD D, A INC HL LD A, C SBC A, (HL) LD C, A DEC HL DEC HL JP NC, MB_FOUCS2 CALL MB_FADDA INC HL CALL MB_MOVFR EX DE, HL POP HL LD (HL), B INC HL POP AF POP BC JP C, MB_FOUCS1 INC DE INC DE LD A, 0x4 JP MB_FOUCI1 MB_FOUTCI: PUSH DE LD DE, MB_FOITBL LD A, 0x5 MB_FOUCI1: CALL MB_FOUTED PUSH BC PUSH AF PUSH HL EX DE, HL LD C, (HL) INC HL LD B, (HL) PUSH BC INC HL EX (SP), HL EX DE, HL LD HL, (MB_FACLO) LD B, '0'-1 MB_FOUCI2: INC B LD A, L SUB E LD L, A LD A, H SBC A, D LD H, A JP NC, MB_FOUCI2 ADD HL, DE LD (MB_FACLO), HL POP DE POP HL LD (HL), B INC HL POP AF POP BC DEC A JP NZ, MB_FOUCI1 CALL MB_FOUTED LD (HL), A POP DE RET ; --------------------------------------------------- ; CONSTANTS USED BY FOUT ; --------------------------------------------------- MB_TENTEN: ; 10000000000 DB 0x00, 0x00, 0x00, 0x00, 0xF9, 0x02, 0x15, 0xA2 MB_FOUTDL: ; 999, 999, 999, 999, 999.5 DB 0xE1, 0xFF, 0x9F, 0x31, 0xA9, 0x5F, 0x63, 0xB2 MB_FOUTDU: ; 9, 999, 999, 999, 999, 999.5 DB 0xFE, 0xFF, 0x03, 0xBF, 0xC9, 0x1B, 0x0E, 0xB6 MB_DHALF: ; .5D0 DB 0, 0, 0, 0 MB_FHALF: ; .5E0 DB 0, 0, 0, 0x80 MB_FFXDXM: ; 1D16 DB 0x00, 0x00, 0x04, 0xBF, 0xC9, 0x1B, 0x0E, 0xB6 ; --------------------------------------------------- ; DOUBLE PRECISION POWER OF TEN TABLE ; --------------------------------------------------- MB_FODTBL: ; 1D15 DB 0x00, 0x80, 0xC6, 0xA4, 0x7E, 0x8D, 0x03 ; 1D14 DB 0x00, 0x40, 0x7A, 0x10, 0xF3, 0x5A, 0x00 ;1D13 DB 0x00, 0xA0, 0x72, 0x4E, 0x18, 0x09, 0x00 ;1D12 DB 0x00, 0x10, 0xA5, 0xD4, 0xE8, 0x00, 0x00 ;1D11 DB 0x00, 0xE8, 0x76, 0x48, 0x17, 0x00, 0x00 ;1D10 DB 0x00, 0xE4, 0x0B, 0x54, 0x02, 0x00, 0x00 ;1D9 DB 0x00, 0xCA, 0x9A, 0x3B, 0x00, 0x00, 0x00 ;1D8 DB 0x00, 0xE1, 0xF5, 0x05, 0x00, 0x00, 0x00 ;1D7 DB 0x80, 0x96, 0x98, 0x00, 0x00, 0x00, 0x00 ;1D6 DB 0x40, 0x42, 0x0F, 0x00, 0x00, 0x00, 0x00 MB_FOSTBL: DB 0xA0, 0x86, 0x01, 0x10, 0x27, 0x00 MB_FOITBL: DB 0x10, 0x27, 0xE8, 0x03, 0x64, 0x00, 0x0A, 0x00, 0x01, 0x00 MB_FOUTO: XOR A LD B, A DB 0xC2 MB_FOUTH: LD B, 0x1 PUSH BC CALL MB_FRQINT POP BC LD DE, MB_FBUFFR PUSH DE XOR A LD (DE), A DEC B INC B LD C, 0x6 JP Z, MB_OCTONE LD C, 0x4 MB_OUTHLP: ADD HL, HL ADC A, A MB_OUTOLP: ADD HL, HL ADC A, A ADD HL, HL ADC A, A MB_OCTONE: ADD HL, HL ADC A, A OR A JP NZ, MB_MAKDIG LD A, C DEC A JP Z, MB_MAKDIG LD A, (DE) OR A JP Z, MB_NOLEAD XOR A MB_MAKDIG: ADD A, '0' CP '9'+1 JP C, MB_NOTHAL ADD A, 0x7 MB_NOTHAL: LD (DE), A INC DE LD (DE), A MB_NOLEAD: XOR A DEC C JP Z, MB_FINOHO DEC B INC B JP Z, MB_OUTOLP JP MB_OUTHLP MB_FINOHO: LD (DE), A POP HL RET ; =================================================== ; EXPONENTIATION AND THE SQUARE ROOT FUNCTION ; =================================================== MB_PSHNEG: LD HL, MB_NEG EX (SP), HL JP (HL) MB_SQR: CALL MB_PUSHF LD HL, MB_FHALF CALL MB_MOVFM JP MB_FPWRT MB_FPWRQ: CALL MB_FRCSNG MB_FPWRT: POP BC POP DE MB_FPWR: LD HL, MB_CLROVC PUSH HL LD A, 1 LD (MB_FLGOVC), A CALL MB_SIGN LD A, B JP Z, MB_EXP JP P, MB_POSEXP OR A JP Z, MB_INTDV2 MB_POSEXP: OR A JP Z, MB_ZERO0 PUSH DE PUSH BC LD A, C OR 0x7f CALL MB_MOVRF JP P, MB_FPWR1 PUSH AF LD A, (MB_FAC) CP 0x99 JP C, MB_FPWR0 POP AF JP MB_FPWR1 MB_FPWR0: POP AF PUSH DE PUSH BC CALL MB_INT POP BC POP DE PUSH AF CALL MB_FCOMP POP HL LD A, H RRA MB_FPWR1: POP HL LD (MB_FAC-1), HL POP HL LD (MB_FACLO), HL CALL C, MB_PSHNEG CALL Z, MB_NEG PUSH DE PUSH BC CALL MB_LOG POP BC POP DE CALL MB_FMUL ; --------------------------------------------------- ; FUNCTION EXP(X) CALCULATES e^X WHERE e=2.718282 ; --------------------------------------------------- MB_EXP: LD BC, 0x8138 LD DE, 0xaa3b CALL MB_FMUL LD A, (MB_FAC) CP 0x88 JP NC, MB_EXP100 CP 0x68 JP C, MB_EXP200 CALL MB_PUSHF CALL MB_INT ADD A, 0x81 POP BC POP DE JP Z, MB_EXP110 PUSH AF CALL MB_FSUB LD HL, 0x377b CALL MB_POLY POP BC LD DE, 0x0 LD C, D JP MB_FMUL MB_EXP100: CALL MB_PUSHF MB_EXP110: LD A, (MB_FAC-1) OR A JP P, MB_EXP115 POP AF POP AF JP MB_ZERO MB_EXP115: JP MB_OVFIN6 MB_EXP200: LD BC, 0x8100 LD DE, 0x0 JP MB_MOVFR ;Hart 1302 polynomial coefficients MB_EXPBCN: DB 0x07 ; DEGREE + 1 ; .00020745577403- DB 0x7C, 0x88, 0x59, 0x74 ; .00127100574569- DB 0xE0, 0x97, 0x26, 0x77 ; .00965065093202+ DB 0xC4, 0x1D, 0x1E, 0x7A ; .05549656508324+ DB 0x5E, 0x50, 0x63, 0x7C ; .24022713817633- DB 0x1A, 0xFE, 0x75, 0x7E ; .69314717213716+ DB 0x18, 0x72, 0x31, 0x80 ; 1.0 DB 0, 0, 0, 0x81 ; =================================================== ; POLYNOMIAL EVALUATOR AND THE RANDOM NUMBER GENERATOR ; =================================================== MB_POLYX: CALL MB_PUSHF LD DE, MB_FMULTT PUSH DE MB_POLYX2: PUSH HL CALL MB_MOVRF CALL MB_FMUL POP HL MB_POLY: CALL MB_PUSHF LD A, (HL) INC HL CALL MB_MOVFM DB 0x06 MB_POLY1: POP AF POP BC POP DE DEC A RET Z PUSH DE PUSH BC PUSH AF PUSH HL CALL MB_FMUL POP HL CALL MB_MOVRM PUSH HL CALL MB_FADD POP HL JP MB_POLY1 MB_RNDCOP: DB 82 DB 199 DB 79 DB 128 MB_RNDMON: CALL MB_CHRGTR MB_RNDMN2: PUSH HL LD HL, MB_FONE CALL MB_MOVFM CALL MB_RND POP HL JP MB_VALSNG MB_RND: CALL MB_SIGN LD HL, MB_RNDCNT + 1 JP M, MB_RNDSTR LD HL, MB_RNDX CALL MB_MOVFM LD HL, MB_RNDCNT + 1 RET Z ADD A, (HL) AND 0x7 LD B, 0x0 LD (HL), A INC HL ADD A, A ADD A, A LD C, A ADD HL, BC CALL MB_MOVRM CALL MB_FMUL LD A, (MB_RNDCNT) INC A AND 0x3 LD B, 0x0 CP 0x1 ADC A, B LD (MB_RNDCNT), A LD HL, MB_RNDX ;RNDTB2-4 ADD A, A ADD A, A LD C, A ADD HL, BC CALL MB_FADDS MB_RND1: CALL MB_MOVRF LD A, E LD E, C XOR 0x4f LD C, A LD (HL), 0x80 DEC HL LD B, (HL) LD (HL), 0x80 LD HL, MB_RNDCNT - 1 INC (HL) LD A, (HL) SUB 0xab JP NZ, MB_NTPTRB LD (HL), A INC C DEC D INC E MB_NTPTRB: CALL MB_NORMAL LD HL, MB_RNDX JP MB_MOVMF MB_RNDSTR: LD (HL), A DEC HL LD (HL), A DEC HL LD (HL), A JP MB_RND1 DB 0 MB_RNDCNT: DB 0, 0 MB_RNDTAB: DB 0x35, 0x4A, 0xCA, 0x99, 0x39, 0x1C, 0x76, 0x98 DB 0x22, 0x95, 0xB3, 0x98, 0x0A, 0xDD, 0x47, 0x98 DB 0x53, 0xD1, 0x99, 0x99, 0x0A, 0x1A, 0x9F, 0x98 DB 0x65, 0xBC, 0xCD, 0x98, 0xD6, 0x77, 0x3E, 0x98 MB_RNDX: DB 0x52, 0xC7, 0x4F, 0x80 MB_RNDTB2: DB 0x68, 0xB1, 0x46, 0x68, 0x99, 0xE9, 0x92, 0x69 DB 0x10, 0xD1, 0x75, 0x68 MB_COS: LD HL, MB_PI2 CALL MB_FADDS MB_SIN: LD A, (MB_FAC) CP 0x77 RET C LD A, (MB_FAC-1) OR A JP P, MB_SIN2 AND 0x7f LD (MB_FAC-1), A LD DE, MB_NEG PUSH DE MB_SIN2: LD BC, 0x7e22 LD DE, 0xf983 CALL MB_FMUL CALL MB_PUSHF CALL MB_INT POP BC POP DE CALL MB_FSUB LD BC, 0x7f00 LD DE, 0x0 CALL MB_FCOMP JP M, MB_SIN2A LD BC, 0x7f80 LD DE, 0x0 CALL MB_FADD LD BC, 0x8080 LD DE, 0x0 CALL MB_FADD CALL MB_SIGN CALL P, MB_NEG LD BC, 0x7f00 LD DE, 0x0 CALL MB_FADD CALL MB_NEG MB_SIN2A: LD A, (MB_FAC-1) OR A PUSH AF JP P, MB_SIN3 XOR 0x80 LD (MB_FAC-1), A MB_SIN3: LD HL, MB_SINCON CALL MB_POLYX POP AF RET P LD A, (MB_FAC-1) XOR 0x80 LD (MB_FAC-1), A RET ; --------------------------------------------------- ; CONSTANTS FOR SIN, COS ; --------------------------------------------------- MB_P1B2PI: DB 0x00, 0x00, 0x00, 0x00, 0x83, 0xF9, 0x22, 0x7E MB_PI2: DB 0xDB, 0x0F, 0x49, 0x81 MB_FR4: DB 0, 0, 0, 0x7F ; --------------------------------------------------- ; HART ALGORITHM 3341 CONSTANTS ; --------------------------------------------------- MB_SINCON: DB 0x05, 0xFB, 0xD7, 0x1E, 0x86, 0x65, 0x26, 0x99 DB 0x87, 0x58, 0x34, 0x23, 0x87, 0xE1, 0x5D, 0xA5 DB 0x86, 0xDB, 0x0F, 0x49, 0x83 ; --------------------------------------------------- ; TANGENT FUNCTION ; TAN(X)=SIN(X)/COS(X) ; --------------------------------------------------- MB_TAN: CALL MB_PUSHF CALL MB_SIN POP BC POP HL CALL MB_PUSHF EX DE, HL CALL MB_MOVFR CALL MB_COS JP MB_FDIVT MB_ATN: CALL MB_SIGN CALL M, MB_PSHNEG CALL M, MB_NEG LD A, (MB_FAC) CP 0x81 JP C, MB_ATN2 LD BC, 0x8100 LD D, C LD E, C CALL MB_FDIV LD HL, MB_FSUBS PUSH HL MB_ATN2: LD HL, MB_ATNCON CALL MB_POLYX LD HL, MB_PI2 RET ; --------------------------------------------------- MB_ATNCON: DB 0x09, 0x4A, 0xD7, 0x3B, 0x78, 0x02, 0x6E, 0x84 DB 0x7B, 0xFE, 0xC1, 0x2F, 0x7C, 0x74, 0x31, 0x9A DB 0x7D, 0x84, 0x3D, 0x5A, 0x7D, 0xC8, 0x7F, 0x91 DB 0x7E, 0xE4, 0xBB, 0x4C, 0x7E, 0x6C, 0xAA, 0xAA DB 0x7F, 0x00, 0x00, 0x00, 0x81 ; =================================================== ; BASIC Interpreter pointer get routines/WHG/PGA ; BIPTRG.MAC ; =================================================== ; DIMENSION & VARIABLE SEARCHING - PTRGET MB_DIMCON: DEC HL CALL MB_CHRGTR RET Z CALL MB_SYNCHR DB ',' MB_DIM: LD BC, MB_DIMCON PUSH BC DB 0xF6 ;-------------------------------------------------- ; SCAN NAME AND RETURN POINTER IN [DE] ;-------------------------------------------------- MB_PTRGET: XOR A LD (MB_DIMFLG), A LD C, (HL) MB_PTRGT2: CALL MB_ISLET JP C, MB_SNERR XOR A LD B, A LD (MB_NAMCNT), A INC HL LD A, (HL) CP '.' JP C, MB_NOSEC JP Z, MB_ISSEC CP ':' JP NC, MB_PTRGT3 CP '0' JP NC, MB_ISSEC MB_PTRGT3: CALL MB_ISLET2 JP C, MB_NOSEC MB_ISSEC: LD B, A PUSH BC LD B, 0xff LD DE, MB_NAMCNT ;NAMBUF-1 MB_VMORCH: OR 0x80 INC B LD (DE), A INC DE INC HL LD A, (HL) CP ':' JP NC, MB_VMORC1 CP '0' JP NC, MB_VMORCH MB_VMORC1: CALL MB_ISLET2 JP NC, MB_VMORCH CP '.' JP Z, MB_VMORCH LD A, B CP ASCII_SQ JP NC, MB_SNERR POP BC LD (MB_NAMCNT), A LD A, (HL) MB_NOSEC: CP '%' + 1 ; & JP NC, MB_TABTYP LD DE, MB_HAVTYP PUSH DE LD D, 0x2 CP '%' RET Z INC D CP ASCII_CUR RET Z INC D CP '!' RET Z LD D, 0x8 CP '#' RET Z POP AF MB_TABTYP: LD A, C AND 0x7f LD E, A LD D, 0x0 PUSH HL LD HL, MB_DEFTBL - 'A' ADD HL, DE LD D, (HL) POP HL DEC HL MB_HAVTYP: LD A, D LD (MB_VALTYP), A CALL MB_CHRGTR LD A, (MB_SUBFLG) DEC A JP Z, MB_ERSFIN JP P, MB_NOARYS LD A, (HL) SUB '(' JP Z, MB_ISARY SUB '[' - ')' + 1 JP Z, MB_ISARY MB_NOARYS: XOR A LD (MB_SUBFLG), A PUSH HL LD A, (MB_NOFUNS) OR A LD (MB_PRMFLG), A JP Z, MB_SNFUNS LD HL, (MB_PRMLEN) LD DE, MB_PARM1 ADD HL, DE LD (MB_ARYTA2), HL EX DE, HL JP MB_LOPFND MB_LOPTOP: LD A, (DE) LD L, A INC DE LD A, (DE) INC DE CP C JP NZ, MB_NOTIT1 LD A, (MB_VALTYP) CP L JP NZ, MB_NOTIT1 LD A, (DE) CP B JP Z, MB_FINPTR MB_NOTIT1: INC DE MB_NFINPT: LD A, (DE) MB_SNOMAT: LD H, 0x0 ADD A, L INC A LD L, A ADD HL, DE MB_LOPFND: EX DE, HL LD A, (MB_ARYTA2) CP E JP NZ, MB_LOPTOP LD A, (MB_ARYTA2+1) CP D JP NZ, MB_LOPTOP MB_NOTFNS: LD A, (MB_PRMFLG) OR A JP Z, MB_SMKVAR XOR A LD (MB_PRMFLG), A MB_SNFUNS: LD HL, (MB_ARYTAB) LD (MB_ARYTA2), HL LD HL, (MB_VARTAB) JP MB_LOPFND ;-------------------------------------------------- ;SCAN NAME AND RETURN POINTER IN [DE] ;-------------------------------------------------- MB_NVRFIL: CALL MB_PTRGET MB_FILRET: RET MB_VARNOT: LD D, A LD E, A POP BC EX (SP), HL RET MB_SMKVAR: POP HL EX (SP), HL PUSH DE LD DE, MB_FILRET CALL MB_DCOMPR JP Z, MB_VARNOT LD DE, MB_RETVAR CALL MB_DCOMPR POP DE JP Z, MB_FINZER EX (SP), HL PUSH HL PUSH BC LD A, (MB_VALTYP) LD B, A LD A, (MB_NAMCNT) ADD A, B INC A LD C, A PUSH BC LD B, 0x0 INC BC INC BC INC BC LD HL, (MB_STREND) PUSH HL ADD HL, BC POP BC PUSH HL CALL MB_BLTU POP HL LD (MB_STREND), HL LD H, B LD L, C LD (MB_ARYTAB), HL MB_ZEROER: DEC HL LD (HL), 0x0 CALL MB_DCOMPR JP NZ, MB_ZEROER POP DE LD (HL), D INC HL POP DE LD (HL), E INC HL LD (HL), D CALL MB_NPUTSB EX DE, HL INC DE POP HL RET MB_FINPTR: INC DE LD A, (MB_NAMCNT) LD H, A LD A, (DE) CP H JP NZ, MB_NFINPT OR A JP NZ, MB_NTFPRT INC DE POP HL RET MB_NTFPRT: EX DE, HL CALL MB_MATSUB EX DE, HL JP NZ, MB_SNOMAT POP HL RET MB_FINZER: LD (MB_FAC), A LD H, A LD L, A LD (MB_FACLO), HL CALL MB_GETYPR JP NZ, POPHR2 LD HL, MB_OKTXT-1 LD (MB_FACLO), HL POPHR2: POP HL RET MB_ISARY: PUSH HL LD HL, (MB_DIMFLG) EX (SP), HL LD D, A MB_INDLOP: PUSH DE PUSH BC LD DE, MB_NAMCNT LD A, (DE) OR A JP Z, MB_SHTNAM EX DE, HL ADD A, 0x2 RRA LD C, A CALL MB_GETSTK LD A, C MB_LPPSNM: LD C, (HL) INC HL LD B, (HL) INC HL PUSH BC DEC A JP NZ, MB_LPPSNM PUSH HL LD A, (MB_NAMCNT) PUSH AF EX DE, HL CALL MB_INTIDX POP AF LD (MB_NAMTMP), HL POP HL ADD A, 0x2 RRA MB_LPLNAM: POP BC DEC HL LD (HL), B DEC HL LD (HL), C DEC A JP NZ, MB_LPLNAM LD HL, (MB_NAMTMP) JP MB_LNGNAM MB_SHTNAM: CALL MB_INTIDX XOR A LD (MB_NAMCNT), A MB_LNGNAM: LD A, (MB_OPTVAL) OR A JP Z, MB_OPTB0 LD A, D OR E JP Z, MB_BSERR DEC DE MB_OPTB0: POP BC POP AF EX DE, HL EX (SP), HL PUSH HL EX DE, HL INC A LD D, A LD A, (HL) CP ',' JP Z, MB_INDLOP CP ')' JP Z, MB_DOCHRT CP ']' JP NZ, MB_SNERR MB_DOCHRT: CALL MB_CHRGTR LD (MB_TEMP2), HL POP HL LD (MB_DIMFLG), HL LD E, 0x0 PUSH DE DB 0x11 MB_ERSFIN: PUSH HL PUSH AF LD HL, (MB_ARYTAB) DB 0x3E MB_LOPFDA: ADD HL, DE EX DE, HL LD HL, (MB_STREND) EX DE, HL CALL MB_DCOMPR JP Z, MB_NOTFDD LD E, (HL) INC HL LD A, (HL) INC HL CP C JP NZ, MB_NMARY1 LD A, (MB_VALTYP) CP E JP NZ, MB_NMARY1 LD A, (HL) CP B JP Z, MB_CMPNAM MB_NMARY1: INC HL MB_BNAMSZ: LD E, (HL) INC E LD D, 0x0 ADD HL, DE MB_CNOMAT: LD E, (HL) INC HL LD D, (HL) INC HL JP NZ, MB_LOPFDA LD A, (MB_DIMFLG) OR A JP NZ, MB_DDERR POP AF LD B, H LD C, L JP Z, MB_POPHRT SUB (HL) JP Z, MB_GETDEF MB_BSERR: LD DE, ERRBS ;"SUBSCRIPT OUT OF RANGE" JP MB_ERROR MB_CMPNAM: INC HL LD A, (MB_NAMCNT) CP (HL) JP NZ, MB_BNAMSZ INC HL OR A JP Z, MB_CNOMAT DEC HL CALL MB_MATSUB JP MB_CNOMAT MB_NOTFDD: LD A, (MB_VALTYP) LD (HL), A INC HL LD E, A LD D, 0x0 POP AF JP Z, MB_PTRRNZ LD (HL), C INC HL LD (HL), B CALL MB_NPUTSB INC HL LD C, A CALL MB_GETSTK INC HL INC HL LD (MB_TEMP3), HL LD (HL), C INC HL LD A, (MB_DIMFLG) RLA LD A, C MB_LOPPTA: JP C, MB_POPDIM PUSH AF LD A, (MB_OPTVAL) XOR 0xb LD C, A LD B, 0x0 POP AF JP NC, MB_NOTDIM MB_POPDIM: POP BC INC BC MB_NOTDIM: LD (HL), C PUSH AF INC HL LD (HL), B INC HL CALL MB_UMULT POP AF DEC A JP NZ, MB_LOPPTA PUSH AF LD B, D LD C, E EX DE, HL ADD HL, DE JP C, MB_OMERR CALL MB_REASON LD (MB_STREND), HL MB_ZERITA: DEC HL LD (HL), 0x0 CALL MB_DCOMPR JP NZ, MB_ZERITA INC BC LD D, A LD HL, (MB_TEMP3) LD E, (HL) EX DE, HL ADD HL, HL ADD HL, BC EX DE, HL DEC HL DEC HL LD (HL), E INC HL LD (HL), D INC HL POP AF JP C, MB_FINNOW MB_GETDEF: LD B, A LD C, A LD A, (HL) INC HL DB 0x16 MB_INLPNM: POP HL LD E, (HL) INC HL LD D, (HL) INC HL EX (SP), HL PUSH AF CALL MB_DCOMPR JP NC, MB_BSERR CALL MB_UMULT ADD HL, DE POP AF DEC A LD B, H LD C, L JP NZ, MB_INLPNM LD A, (MB_VALTYP) LD B, H LD C, L ADD HL, HL SUB 0x4 JP C, MB_SMLVAL ADD HL, HL JP Z, MB_DONMUL ADD HL, HL MB_SMLVAL: OR A JP PO, MB_DONMUL ADD HL, BC MB_DONMUL: POP BC ADD HL, BC EX DE, HL MB_FINNOW: LD HL, (MB_TEMP2) RET MB_PTRRNZ: SCF SBC A, A POP HL RET MB_IADAHL: LD A, (HL) INC HL MB_ADDAHL: PUSH BC LD B, 0x0 LD C, A ADD HL, BC POP BC RET MB_NPUTSB: PUSH BC PUSH DE PUSH AF LD DE, MB_NAMCNT LD A, (DE) LD B, A INC B MB_SLPLNG: LD A, (DE) INC DE INC HL LD (HL), A DEC B JP NZ, MB_SLPLNG POP AF POP DE POP BC RET MB_MATSUB: PUSH DE PUSH BC LD DE, MB_NAMBUF LD B, A INC HL INC B MB_SLPMAT: DEC B JP Z, MB_ISMAT2 LD A, (DE) INC DE CP (HL) INC HL JP Z, MB_SLPMAT LD A, B DEC A CALL NZ, MB_ADDAHL XOR A DEC A MB_ISMAT2: POP BC POP DE RET ; =================================================== ; BASIC Interpreter EDIT routines/PGA etc. ; BIEDIT.MAC ; =================================================== MB_ERREDT: LD (MB_ERRFLG), A LD HL, (MB_ERRLIN) OR H AND L INC A EX DE, HL RET Z JP MB_EREDIT MB_EDIT: CALL MB_LINSPC RET NZ MB_EREDIT: POP HL MB_EEDITS: EX DE, HL LD (MB_DOT), HL EX DE, HL CALL MB_FNDLIN JP NC, MB_USERR LD H, B LD L, C INC HL INC HL LD C, (HL) INC HL LD B, (HL) INC HL PUSH BC CALL MB_BUFLIN MB_LLED: POP HL MB_INLED: PUSH HL LD A, H AND L INC A LD A, '!' CALL Z, MB_OUTDO CALL NZ, MB_LINPTR LD A, ASCII_SP CALL MB_OUTDO LD HL, MB_BUF PUSH HL LD C, 0xff MB_LENLP: INC C LD A, (HL) INC HL OR A JP NZ, MB_LENLP POP HL LD B, A MB_DISPED: LD D, 0x0 MB_DISPI: CALL MB_INCHRI OR A JP Z, MB_DISPI CALL MB_MAKUPS SUB '0' JP C, MB_NOTDGI CP 10 JP NC, MB_NOTDGI LD E, A LD A, D RLCA RLCA ADD A, D RLCA ADD A, E LD D, A JP MB_DISPI MB_NOTDGI: PUSH HL LD HL, MB_DISPED EX (SP), HL DEC D INC D JP NZ, MB_NTZERD INC D MB_NTZERD: CP 0xd8 ; 8 - '0' - Backspace? JP Z, MB_BAKED CP 0x4f ; 0x7F - '0' - DEL? JP Z, MB_DELED CP 0xdd ; 13 - '0' - CARRIAGE RETURN JP Z, MB_CRED CP 0xf0 ; ' ' - '0' - SPACE JP Z, MB_SPED CP 0x31 ; 'A' + 0x20 - '0' - COMMAND IN LOWER CASE? JP C, MB_NOTLW4 SUB 0x20 MB_NOTLW4: CP 0x21 ; 'Q' - '0' JP Z, MB_QED CP 0x1c ; 'L' - '0' JP Z, MB_LED CP 0x23 ; 'S' - '0' JP Z, MB_SED CP 0x19 ; 'I' - '0' JP Z, MB_IED CP 0x14 ; 'D' - '0' JP Z, MB_DED CP 0x13 ; 'C' - '0' JP Z, MB_CED CP 0x15 ; 'E'-'0' JP Z, MB_EED CP 0x28 ;'X'-'0' JP Z, MB_XED CP 0x1b ;'K'-'0' JP Z, MB_KED CP 0x18 ;'H'-'0' JP Z, MB_HED CP 0x11 ;'A'-'0' LD A, 0x7 JP NZ, MB_OUTDO POP BC POP DE CALL MB_CRDO JP MB_EEDITS MB_SPED: LD A, (HL) OR A RET Z INC B CALL MB_OUTCH1 INC HL DEC D JP NZ, MB_SPED RET MB_KED: PUSH HL LD HL, MB_TYPSLH EX (SP), HL SCF MB_SED: PUSH AF CALL MB_INCHRI LD E, A POP AF PUSH AF CALL C, MB_TYPSLH MB_SRCALP: LD A, (HL) OR A JP Z, MB_POPART CALL MB_OUTCH1 POP AF PUSH AF CALL C, MB_DELCHR JP C, MB_NOTSRC INC HL INC B MB_NOTSRC: LD A, (HL) CP E JP NZ, MB_SRCALP DEC D JP NZ, MB_SRCALP MB_POPART: POP AF RET MB_LED: CALL MB_LISPRT CALL MB_CRDO POP BC JP MB_LLED MB_DED: LD A, (HL) OR A RET Z LD A, ASCII_BKSL CALL MB_OUTCH1 MB_DELLP: LD A, (HL) OR A JP Z, MB_TYPSLH CALL MB_OUTCH1 CALL MB_DELCHR DEC D JP NZ, MB_DELLP MB_TYPSLH: LD A, ASCII_BKSL CALL MB_OUTDO RET MB_CED: LD A, (HL) OR A RET Z MB_CED2: CALL MB_INCHRI CP ASCII_SP JP NC, MB_NOTCCC CP ASCII_LF JP Z, MB_NOTCCC CP ASCII_BELL JP Z, MB_NOTCCC CP ASCII_TAB JP Z, MB_NOTCCC LD A, ASCII_BELL CALL MB_OUTDO JP MB_CED2 MB_NOTCCC: LD (HL), A CALL MB_OUTCH1 INC HL INC B DEC D JP NZ, MB_CED RET MB_HED: LD (HL), 0x0 LD C, B MB_XED: LD D, 0xff CALL MB_SPED ;NOW FALL INTO INSERT CODE MB_IED: CALL MB_INCHRI CP ASCII_DEL ;DEL key JP Z, MB_TYPARW CP ASCII_BKSP JP Z, MB_TYPAR1 CP ASCII_CR JP Z, MB_CRED CP ASCII_ESC RET Z CP ASCII_BKSP JP Z, MB_TYPAR1 CP ASCII_LF JP Z, MB_NTARRW CP ASCII_BELL JP Z, MB_NTARRW CP ASCII_TAB JP Z, MB_NTARRW CP ASCII_SP JP C, MB_IED CP '_' JP NZ, MB_NTARRW MB_TYPARW: LD A, '_' MB_TYPAR1: DEC B INC B JP Z, MB_DINGI CALL MB_OUTCH1 DEC HL DEC B LD DE, MB_IED PUSH DE ; =================================================== ; DELETE CHAR POINTED TO BY [HL]. CORRECTS C ; =================================================== MB_DELCHR: PUSH HL DEC C MB_CMPRSS: LD A, (HL) ;= 44 OR A SCF JP Z, MB_POPHRT INC HL LD A, (HL) DEC HL LD (HL), A ;= 44 INC HL JP MB_CMPRSS MB_NTARRW: PUSH AF LD A, C CP 0xff JP C, MB_OKINS POP AF MB_DINGI: LD A, 0x7 CALL MB_OUTDO MB_IEDG: JP MB_IED MB_OKINS: SUB B INC C INC B PUSH BC EX DE, HL LD L, A LD H, 0x0 ADD HL, DE LD B, H LD C, L INC HL CALL MB_BLTUC POP BC POP AF LD (HL), A CALL MB_OUTCH1 INC HL JP MB_IEDG MB_BAKED: LD A, B OR A RET Z DEC HL LD A, ASCII_BKSP CALL MB_OUTCH1 DEC B DEC D JP NZ, MB_DELED RET MB_DELED: LD A, B OR A RET Z DEC B DEC HL LD A, (HL) ;= 44 CALL MB_OUTCH1 DEC D JP NZ, MB_DELED RET MB_CRED: CALL MB_LISPRT MB_EED: CALL MB_CRDO POP BC POP DE LD A, D AND E INC A ;START KRUNCHING AT BUF MB_EDITRT: LD HL, MB_BUFMIN ;BUF-1 RET Z SCF PUSH AF INC HL JP MB_EDENT MB_QED: POP BC POP DE LD A, D AND E INC A JP Z, MB_FININL JP MB_READY MB_PRINUS: CALL MB_FRMCHK CALL MB_CHKSTR CALL MB_SYNCHR ;BYTE_ram_3f00: DB ';' ;LAB_ram_3f01: EX DE, HL LD HL, (MB_FACLO) JP MB_INIUS MB_REUSST: LD A, (MB_FLGINP) OR A JP Z, MB_FCERR3 POP DE EX DE, HL MB_INIUS: PUSH HL XOR A LD (MB_FLGINP), A INC A PUSH AF PUSH DE LD B, (HL) OR B MB_FCERR3: JP Z, MB_FCERR INC HL LD A, (HL) INC HL LD H, (HL) LD L, A JP MB_PRCCHR MB_BGSTRF: LD E, B PUSH HL LD C, 0x2 MB_LPSTRF: LD A, (HL) INC HL CP ASCII_BKSL JP Z, MB_ISSTRF CP ASCII_SP JP NZ, MB_NOSTRF INC C DEC B JP NZ, MB_LPSTRF MB_NOSTRF: POP HL LD B, E LD A, ASCII_BKSL MB_NEWUCH: CALL MB_PLSPRT CALL MB_OUTDO MB_PRCCHR: XOR A LD E, A LD D, A MB_PLSFIN: CALL MB_PLSPRT LD D, A LD A, (HL) INC HL CP '!' JP Z, MB_SMSTRF CP '#' JP Z, MB_NUMNUM CP '&' JP Z, MB_VARSTR DEC B JP Z, MB_REUSIN CP '+' LD A, 0x8 JP Z, MB_PLSFIN DEC HL LD A, (HL) INC HL CP '.' JP Z, MB_DOTNUM CP '_' JP Z, MB_LITCHR CP ASCII_BKSL JP Z, MB_BGSTRF CP (HL) JP NZ, MB_NEWUCH CP ASCII_CUR JP Z, MB_DOLRNM CP '*' JP NZ, MB_NEWUCH LD A, B INC HL CP 0x2 JP C, MB_NOTSPC LD A, (HL) CP ASCII_CUR MB_NOTSPC: LD A, ASCII_SP JP NZ, MB_SPCNUM DEC B INC E DB 0xFE MB_DOLRNM: XOR A ADD A, 0x10 INC HL MB_SPCNUM: INC E ADD A, D LD D, A MB_NUMNUM: INC E LD C, 0x0 DEC B JP Z, MB_ENDNUS LD A, (HL) INC HL CP '.' JP Z, MB_AFTDOT CP '#' JP Z, MB_NUMNUM CP ',' JP NZ, MB_FINNUM LD A, D OR 0x40 LD D, A JP MB_NUMNUM MB_DOTNUM: LD A, (HL) CP '#' LD A, '.' JP NZ, MB_NEWUCH LD C, 0x1 INC HL MB_AFTDOT: INC C DEC B JP Z, MB_ENDNUS LD A, (HL) INC HL CP '#' JP Z, MB_AFTDOT MB_FINNUM: PUSH DE LD DE, MB_NOTSCI PUSH DE LD D, H LD E, L CP '^' RET NZ CP (HL) RET NZ INC HL CP (HL) RET NZ INC HL CP (HL) RET NZ INC HL LD A, B SUB 0x4 RET C POP DE POP DE LD B, A INC D INC HL DB 0xCA MB_NOTSCI: EX DE, HL POP DE MB_ENDNUS: LD A, D DEC HL INC E AND 0x8 JP NZ, MB_ENDNUM DEC E LD A, B LAB_ram_4000: OR A LAB_ram_4001: JP Z, MB_ENDNUM LD A, (HL) SUB '-' JP Z, MB_SGNTRL CP 0xfe ;'+'-'-' - A TRAILING PLUS? JP NZ, MB_ENDNUM LD A, 0x8 MB_SGNTRL: ADD A, 0x4 ADD A, D LD D, A DEC B MB_ENDNUM: POP HL POP AF JP Z, MB_FLDFIN PUSH BC PUSH DE CALL MB_FRMEVL POP DE POP BC PUSH BC PUSH HL LD B, E LD A, B ADD A, C CP 0x19 JP NC, MB_FCERR LD A, D OR 0x80 CALL MB_PUFOUT CALL MB_STROUT MB_FNSTRF: POP HL DEC HL CALL MB_CHRGTR SCF JP Z, MB_CRDNUS LD (MB_FLGINP), A CP ';' JP Z, MB_SEMUSN CP ',' JP NZ, MB_SNERR MB_SEMUSN: CALL MB_CHRGTR MB_CRDNUS: POP BC EX DE, HL POP HL PUSH HL PUSH AF PUSH DE LD A, (HL) SUB B INC HL LD D, 0x0 LD E, A LD A, (HL) INC HL LD H, (HL) LD L, A ADD HL, DE MB_CHKUSI: LD A, B OR A JP NZ, MB_PRCCHR JP MB_FINUSI MB_REUSIN: CALL MB_PLSPRT CALL MB_OUTDO MB_FINUSI: POP HL POP AF JP NZ, MB_REUSST MB_FLDFIN: CALL C, MB_CRDO EX (SP), HL CALL MB_FRETM2 POP HL JP MB_FINPRT MB_LITCHR: CALL MB_PLSPRT DEC B LD A, (HL) INC HL CALL MB_OUTDO JP MB_CHKUSI MB_VARSTR: LD C, 0x0 JP MB_ISSTR1 MB_SMSTRF: LD C, 0x1 DB 0x3E MB_ISSTRF: POP AF MB_ISSTR1: DEC B CALL MB_PLSPRT POP HL POP AF JP Z, MB_FLDFIN PUSH BC CALL MB_FRMEVL CALL MB_CHKSTR POP BC PUSH BC PUSH HL LD HL, (MB_FACLO) LD B, C LD C, 0x0 LD A, B PUSH AF LD A, B OR A CALL NZ, MB_LEFTUS CALL MB_STRPRT LD HL, (MB_FACLO) POP AF OR A JP Z, MB_FNSTRF SUB (HL) LD B, A LD A, ASCII_SP INC B MB_UPRTSP: DEC B JP Z, MB_FNSTRF CALL MB_OUTDO JP MB_UPRTSP MB_PLSPRT: PUSH AF LD A, D OR A LD A, '+' CALL NZ, MB_OUTDO POP AF RET ; =================================================== ; BIO BASIC Interpreter I/O routines/WHG/PGA/MBM... ; BIO.MAC ; =================================================== MB_OUTDO: PUSH AF PUSH HL CALL MB_PTRFILZ JP NZ, MB_FILOUT POP HL MB_LPTCOD: LD A, (MB_PRTFLG) OR A JP Z, MB_TTYCHR POP AF PUSH AF CP ASCII_BKSP JP NZ, MB_NTBKS2 LD A, (MB_LPTPOS) SUB 0x1 JP C, MB_OLPTCHR LD (MB_LPTPOS), A MB_OLPTCHR: POP AF JP MB_LPTCHR MB_NTBKS2: CP ASCII_TAB JP NZ, MB_NOTABL MB_MORSPL: LD A, ASCII_SP CALL MB_OUTDO LD A, (MB_LPTPOS) AND 0x7 JP NZ, MB_MORSPL POP AF RET MB_NOTABL: POP AF PUSH AF SUB 0xd JP Z, MB_ZERLP1 JP C, MB_LPTCH1 LD A, (MB_LPTSIZ) ;= 132 INC A LD A, (MB_LPTPOS) JP Z, MB_ZERLPT PUSH HL LD HL, MB_LPTSIZ ;= 132 CP (HL) ;= 132 POP HL CALL Z, MB_PRINTW MB_ZERLPT: CP 0xff JP Z, MB_LPTCH1 INC A MB_ZERLP1: LD (MB_LPTPOS), A MB_LPTCH1: POP AF ; ------------------------------------------------------ MB_LPTCHR: PUSH AF PUSH BC PUSH DE PUSH HL LD C, A LPTO_ADDR EQU $+1 CALL 0x0000 POP HL POP DE POP BC POP AF RET MB_FINLPT: XOR A LD (MB_PRTFLG), A LD A, (MB_LPTPOS) OR A RET Z MB_PRINTW: LD A, ASCII_CR CALL MB_LPTCHR LD A, ASCII_LF CALL MB_LPTCHR XOR A LD (MB_LPTPOS), A RET MB_TTYCHR: LD A, (MB_CNTOFL) OR A JP NZ, MB_PPSWRT POP AF PUSH BC PUSH AF CP ASCII_BKSP JP NZ, MB_NTBKS1 LD A, (MB_TTYPOS) OR A JP Z, MB_MORSPR DEC A LD (MB_TTYPOS), A LD A, ASCII_BKSP JP MB_TRYOUT MB_NTBKS1: CP ASCII_TAB JP NZ, MB_NOTAB MB_MORSP: LD A, ASCII_SP CALL MB_OUTDO LD A, (MB_TTYPOS) AND 0x7 JP NZ, MB_MORSP MB_MORSPR: POP AF POP BC RET MB_NOTAB: CP 0x20 JP C, MB_TRYOUT LD A, (MB_LINLEN) ;= 80 LD B, A LD A, (MB_TTYPOS) INC B JP Z, MB_INCTPS DEC B CP B CALL Z, MB_CRDO MB_INCTPS: CP 0xff JP Z, MB_TRYOUT INC A LD (MB_TTYPOS), A MB_TRYOUT: POP AF POP BC PUSH AF POP AF ; -------------------------------------------------- ; Print symbol from A via BIOS fn ; -------------------------------------------------- MB_NOPRIN: PUSH AF PUSH BC PUSH DE PUSH HL LD C, A CO_ADDR EQU $+1 CALL 0x0000 POP HL POP DE POP BC POP AF RET ; -------------------------------------------------- MB_INCHR: CALL MB_PTRFILZ JP Z, MB_INCHRI CALL MB_INDSKC RET NC PUSH BC PUSH DE PUSH HL CALL MB_PRGFIN POP HL POP DE POP BC LD A, (MB_CHNFLG) OR A JP NZ, MB_CHNRET LD A, (MB_LSTFRE) OR A JP Z, MB_OU_RDY LD HL, MB_NEWSTT PUSH HL JP MB_RUNC MB_OU_RDY: PUSH HL PUSH BC PUSH DE LD HL, MB_OKTXT ;= "OK\r\n" CALL MB_STROUT POP DE POP BC XOR A POP HL RET MB_INCHRI: PUSH BC PUSH DE PUSH HL ; -------------------------------------------------- ; Console Input ; -------------------------------------------------- MB_CONIN: CI_ADDR EQU $+1 CALL WARM_BOOT POP HL POP DE POP BC MB_INEXIT: AND 0x7f CP 0xf RET NZ LD A, (MB_CNTOFL) OR A CALL Z, MB_CTROPT CPL LD (MB_CNTOFL), A OR A JP Z, MB_CTROPT XOR A RET ;Put out a carriage return and associated routines MB_CRDONZ: LD A, (MB_TTYPOS) OR A RET Z JP MB_CRDO MB_FININL: LD (HL), 0x0 LD HL, MB_BUFMIN ;= 44 MB_CRDO: LD A, ASCII_CR CALL MB_OUTDO LD A, ASCII_LF MB_CRFINO: CALL MB_OUTDO MB_CRFIN: CALL MB_PTRFILZ JP Z, MB_CRCONT XOR A RET MB_CRCONT: LD A, (MB_PRTFLG) OR A JP Z, MB_NTPRTR XOR A LD (MB_LPTPOS), A RET MB_NTPRTR: XOR A LD (MB_TTYPOS), A LD A, (MB_NULCNT) ;= 01h MB_PRTNUL: DEC A RET Z PUSH AF XOR A CALL MB_OUTDO POP AF JP MB_PRTNUL MB_ISCNTC: PUSH BC PUSH DE PUSH HL ; -------------------------------------------------- MB_CONSTS: CTC_ADDR1 EQU $+1 CALL WARM_BOOT POP HL POP DE POP BC OR A RET Z MB_CNTCCN: CALL MB_INCHRI CP 0x13 CALL Z, MB_INCHRI LD (MB_CHARC), A CP 0x3 CALL Z, MB_CTRLPT JP MB_STOP MB_INKEY: CALL MB_CHRGTR PUSH HL CALL MB_CHARCG JP NZ, MB_BUFCIN CTC_ADDR3 EQU $+1 CALL 0x0000 OR A JP Z, MB_NULRT CALL MB_INCHRI MB_BUFCIN: PUSH AF CALL MB_STRIN1 POP AF LD E, A CALL MB_SETSTR MB_NULRT: LD HL, MB_OKTXT-1 ;REDDY-1 LD (MB_FACLO), HL LD A, 0x3 LD (MB_VALTYP), A POP HL RET MB_CHARCG: LD A, (MB_CHARC) OR A RET Z PUSH AF XOR A LD (MB_CHARC), A POP AF RET MB_OUTCH1: CALL MB_OUTDO CP ASCII_LF RET NZ LD A, ASCII_CR CALL MB_OUTDO CALL MB_CRFIN LD A, ASCII_LF RET ; =================================================== ; BIMISC.MAC ; =================================================== ;BLOCK TRANSFER ROUTINE MB_BLTU: CALL MB_REASON MB_BLTUC: PUSH BC EX (SP), HL POP BC MB_BLTLOP: CALL MB_DCOMPR LD A, (HL) LD (BC), A RET Z DEC BC DEC HL JP MB_BLTLOP MB_GETSTK: PUSH HL LD HL, (MB_MEMSIZ) LD B, 0x0 ADD HL, BC ADD HL, BC LD A, CONS1 ;256-(2*NUMLEV) SUB L LD L, A LD A, 0xff SBC A, H LD H, A JP C, MB_OMERR ADD HL, SP POP HL RET C ; ------------------------------------------------------- MB_OMERR: LD HL, (MB_TOPMEM) DEC HL DEC HL LD (MB_SAVSTK), HL MB_OMERRR: LD DE, ERROM JP MB_ERROR ; ------------------------------------------------------- MB_REASON: CALL MB_REALLY RET NC PUSH BC PUSH DE PUSH HL CALL MB_GARBA2 POP HL POP DE POP BC CALL MB_REALLY RET NC JP MB_OMERRR MB_REALLY: PUSH DE EX DE, HL LD HL, (MB_FRETOP) CALL MB_DCOMPR EX DE, HL POP DE RET MB_NODSKS: LD A, (MB_MAXFIL) LD B, A LD HL, MB_FILPTR XOR A INC B MB_LOPNTO: LD E, (HL) INC HL LD D, (HL) INC HL LD (DE), A DEC B JP NZ, MB_LOPNTO CALL MB_CLSALL XOR A MB_SCRATH: RET NZ ; =================================================== ; FUNCTION ; =================================================== MB_SCRTCH: LD HL, (MB_TXTTAB) ;= 6040h CALL MB_TOFF LD (MB_PROFLG), A LD (MB_AUTFLG), A LD (MB_PTRFLG), A LD (HL), A INC HL LD (HL), A INC HL LD (MB_VARTAB), HL ; =================================================== ; FUNCTION ; =================================================== MB_RUNC: LD HL, (MB_TXTTAB) ;= 6040h DEC HL MB_CLEARC: LD (MB_TEMP), HL LD A, (MB_MRGFLG) OR A JP NZ, MB_LEVDTB XOR A LD (MB_OPTFLG), A LD (MB_OPTVAL), A ;INITIALIZE THE DEFAULT VALTYPE TABLE LD B, 26 LD HL, MB_DEFTBL MB_LOPDFT: LD (HL), 0x4 INC HL DEC B JP NZ, MB_LOPDFT MB_LEVDTB: LD DE, MB_RNDCOP ;= 82 LD HL, MB_RNDX CALL MB_MOVE LD HL, MB_RNDCNT - 1 XOR A LD (HL), A INC HL LD (HL), A INC HL LD (HL), A XOR A LD (MB_ONEFLG), A LD L, A LD H, A LD (MB_ONELIN), HL LD (MB_OLDTXT), HL LD HL, (MB_MEMSIZ) LD A, (MB_CHNFLG) OR A JP NZ, MB_GODFRE LD (MB_FRETOP), HL MB_GODFRE: XOR A CALL MB_RESTORE LD HL, (MB_VARTAB) LD (MB_ARYTAB), HL LD (MB_STREND), HL LD A, (MB_MRGFLG) OR A CALL Z, MB_CLSALL MB_STKINI: POP BC LD HL, (MB_TOPMEM) DEC HL DEC HL LD (MB_SAVSTK), HL INC HL INC HL MB_STKERR: LD SP, HL LD HL, MB_TEMPST LD (MB_TEMPPT), HL CALL MB_CLROVC CALL MB_FINLPT CALL MB_FINPRT XOR A LD H, A LD L, A LD (MB_PRMLEN), HL LD (MB_NOFUNS), A LD (MB_PRMLN2), HL LD (MB_FUNACT), HL LD (MB_PRMSTK), HL LD (MB_SUBFLG), A PUSH HL PUSH BC MB_GTMPRT: LD HL, (MB_TEMP) RET ; =================================================== MB_DCOMPR: LD A, H SUB D RET NZ LD A, L SUB E RET ; =================================================== MB_SYNCHR: LD A, (HL) EX (SP), HL CP (HL) JP NZ, MB_SYNERR INC HL EX (SP), HL INC HL LD A, (HL) CP ':' RET NC JP MB_CHRCON MB_SYNERR: JP MB_SNERR MB_RESTORE: EX DE, HL LD HL, (MB_TXTTAB) ;= 6040h JP Z, MB_BGNRST EX DE, HL CALL MB_LINGET PUSH HL CALL MB_FNDLIN LD H, B LD L, C POP DE JP NC, MB_USERR MB_BGNRST: DEC HL MB_RESFIN: LD (MB_DATPTR), HL EX DE, HL RET MB_STOP: RET NZ MB_STOPRG: INC A JP MB_CONSTP MB_ENDS: RET NZ PUSH AF CALL Z, MB_CLSALL POP AF MB_CONSTP: LD (MB_SAVTXT), HL LD HL, MB_TEMPST LD (MB_TEMPPT), HL DB 21h MB_STPEND: OR 0xff POP BC MB_ENDCON: LD HL, (MB_CURLIN) ;= 65534 PUSH HL PUSH AF LD A, L AND H INC A JP Z, MB_DIRIS LD (MB_OLDLIN), HL LD HL, (MB_SAVTXT) LD (MB_OLDTXT), HL MB_DIRIS: XOR A LD (MB_CNTOFL), A CALL MB_FINLPT CALL MB_CRDONZ POP AF LD HL, MB_BRKTXT ;= "Break" JP NZ, MB_ERRFIN JP MB_STPRDY MB_CTROPT: LD A, CTRL_O MB_CTRLPT: PUSH AF SUB 0x3 JP NZ, MB_NTCTCT LD (MB_PRTFLG), A LD (MB_CNTOFL), A MB_NTCTCT: LD A, '^' CALL MB_OUTDO POP AF ADD A, 0x40 CALL MB_OUTDO JP MB_CRDO MB_CONT: LD HL, (MB_OLDTXT) LD A, H OR L MB_RESERR: LD DE, ERRCN JP Z, MB_ERROR EX DE, HL LD HL, (MB_OLDLIN) EX DE, HL EX DE, HL LD (MB_CURLIN), HL ;= 65534 EX DE, HL RET MB_NULL: CALL MB_GETBYT RET NZ INC A LD (MB_NULCNT), A ;= 01h RET MB_TON: DB 0x3E MB_TOFF: XOR A LD (MB_TRCFLG), A RET MB_SWAP: CALL MB_PTRGET PUSH DE PUSH HL LD HL, MB_SWPTMP CALL MB_VMOVE LD HL, (MB_ARYTAB) EX (SP), HL CALL MB_GETYPR PUSH AF CALL MB_SYNCHR DB ',' CALL MB_PTRGET POP AF LD B, A CALL MB_GETYPR CP B JP NZ, MB_TMERR EX (SP), HL EX DE, HL PUSH HL LD HL, (MB_ARYTAB) CALL MB_DCOMPR JP NZ, MB_FCERR1 POP DE POP HL EX (SP), HL PUSH DE CALL MB_VMOVE POP HL LD DE, MB_SWPTMP CALL MB_VMOVE POP HL RET MB_FCERR1: JP MB_FCERR MB_ERASE: LD A, 0x1 LD (MB_SUBFLG), A CALL MB_PTRGET JP NZ, MB_FCERR1 PUSH HL LD (MB_SUBFLG), A LD H, B LD L, C DEC BC DEC BC DEC BC MB_LPBKNM: LD A, (BC) DEC BC OR A JP M, MB_LPBKNM DEC BC DEC BC ADD HL, DE EX DE, HL LD HL, (MB_STREND) MB_ERSLOP: CALL MB_DCOMPR LD A, (DE) LD (BC), A INC DE INC BC JP NZ, MB_ERSLOP DEC BC LD H, B LD L, C LD (MB_STREND), HL POP HL LD A, (HL) CP 0x2c RET NZ CALL MB_CHRGTR JP MB_ERASE MB_POPAHT: POP AF POP HL RET MB_ISLET: LD A, (HL) MB_ISLET2: CP 'A' RET C CP '[' CCF RET MB_CLEARC1: JP MB_CLEARC ; -------------------------------------------------- MB_CLEAR: JP Z, MB_CLEARC1 CP ',' JP Z, MB_CSKPCM CALL MB_INTIDX2 DEC HL CALL MB_CHRGTR JP Z, MB_CLEARC1 MB_CSKPCM: CALL MB_SYNCHR DB ',' JP Z, MB_CLEARC1 EX DE, HL LD HL, (MB_TOPMEM) ;= 60A3h EX DE, HL CP ',' JP Z, MB_CLEARS CALL MB_INTID2 MB_CLEARS: DEC HL CALL MB_CHRGTR PUSH DE JP Z, MB_CDFSTK CALL MB_SYNCHR DB ',' JP Z, MB_CDFSTK CALL MB_INTID2 DEC HL CALL MB_CHRGTR JP NZ, MB_SNERR MB_CLEART: EX (SP), HL PUSH HL LD HL, 0x4e ;0+(2*NUMLEV)+20 - CHECK STACK SIZE IS REASONABLE CALL MB_DCOMPR JP NC, MB_OMERR1 POP HL CALL MB_SUBDE JP C, MB_OMERR1 PUSH HL LD HL, (MB_VARTAB) LD BC, 0x14 ADD HL, BC CALL MB_DCOMPR JP NC, MB_OMERR1 EX DE, HL LD (MB_MEMSIZ), HL POP HL LD (MB_TOPMEM), HL ;= 60A3h POP HL JP MB_CLEARC1 MB_INTID2: CALL MB_GETIN22 LD A, D OR E JP Z, MB_FCERR RET MB_OMERR1: JP MB_OMERR MB_CDFSTK: PUSH HL LD HL, (MB_TOPMEM) ;TOPMEM EX DE, HL LD HL, (MB_MEMSIZ) LD A, E SUB L LD E, A LD A, D SBC A, H LD D, A POP HL JP MB_CLEART MB_SUBDE: LD A, L SUB E LD E, A LD A, H SBC A, D LD D, A RET ; -------------------------------------------------- ; NEXT code ; -------------------------------------------------- MB_NEXT: PUSH AF DB 0xF6 MB_NEXTS: XOR A LD (MB_NXTFLG), A POP AF LD DE, 0x0 MB_NEXTC: LD (MB_NXTTXT), HL CALL NZ, MB_PTRGET LD (MB_TEMP), HL CALL MB_FNDFOR JP NZ, MB_NFERR LD SP, HL PUSH DE LD E, (HL) INC HL LD D, (HL) INC HL PUSH HL LD HL, (MB_NXTTXT) CALL MB_DCOMPR JP NZ, MB_NFERR POP HL POP DE PUSH DE LD A, (HL) PUSH AF INC HL PUSH DE LD A, (HL) INC HL OR A JP M, MB_INTNXT CALL MB_MOVFM EX (SP), HL PUSH HL LD A, (MB_NXTFLG) OR A JP NZ, MB_NXTDO LD HL, MB_FVALSV CALL MB_MOVFM XOR A MB_NXTDO: CALL NZ, MB_FADDS POP HL CALL MB_MOVMF POP HL CALL MB_MOVRM PUSH HL CALL MB_FCOMP JP MB_FINNXT MB_INTNXT: INC HL INC HL INC HL INC HL LD C, (HL) INC HL LD B, (HL) INC HL EX (SP), HL LD E, (HL) INC HL LD D, (HL) PUSH HL LD L, C LD H, B LD A, (MB_NXTFLG) OR A JP NZ, MB_INXTDO LD HL, (MB_FVALSV) JP MB_IFORIN MB_INXTDO: CALL MB_IADD LD A, (MB_VALTYP) CP 0x4 JP Z, MB_OVERR MB_IFORIN: EX DE, HL POP HL LD (HL), D DEC HL LD (HL), E POP HL PUSH DE LD E, (HL) INC HL LD D, (HL) INC HL EX (SP), HL CALL MB_ICOMP MB_FINNXT: POP HL POP BC SUB B CALL MB_MOVRM JP Z, MB_LOOPDN EX DE, HL LD (MB_CURLIN), HL ;= 65534 LD L, C LD H, B JP MB_NXTCON MB_LOOPDN: LD SP, HL LD (MB_SAVSTK), HL LD HL, (MB_TEMP) LD A, (HL) CP 0x2c JP NZ, MB_NEWSTT CALL MB_CHRGTR CALL MB_NEXTC ; -------------------------------------------------- ; Chrck MB_PTRFIL for zero value ; -------------------------------------------------- MB_PTRFILZ: PUSH HL LD HL, (MB_PTRFIL) LD A, H OR L POP HL RET ; =================================================== ; BASIC Interpreter String routines/WHG/PGA etc. ; BISTRS.MAC ; =================================================== ; --------------------------------------------------- ;COMPARES TWO STRINGS ; --------------------------------------------------- MB_STRCMP: CALL MB_FRESTR LD A, (HL) INC HL LD C, (HL) INC HL LD B, (HL) POP DE PUSH BC PUSH AF CALL MB_FRETMP POP AF LD D, A LD E, (HL) INC HL LD C, (HL) INC HL LD B, (HL) POP HL MB_CSLOOP: LD A, E OR D RET Z LD A, D SUB 0x1 RET C XOR A CP E INC A RET NC DEC D DEC E LD A, (BC) INC BC CP (HL) INC HL JP Z, MB_CSLOOP CCF JP MB_SIGNS MB_STRO_: CALL MB_FOUTO JP MB_STR_1 MB_STRH_: CALL MB_FOUTH JP MB_STR_1 MB_STR_: CALL MB_FOUT MB_STR_1: CALL MB_STRLIT CALL MB_FREFAC LD BC, MB_FINBCK PUSH BC ; =================================================== ; FUNCTION ; =================================================== MB_STRCPY: ;CREATES A COPY OF THE STRING LD A, (HL) INC HL PUSH HL CALL MB_GETSPA POP HL LD C, (HL) INC HL LD B, (HL) CALL MB_STRAD2 PUSH HL LD L, A CALL MB_MOVSTR POP DE RET MB_STRIN1: LD A, 0x1 MB_STRINI: CALL MB_GETSPA MB_STRAD2: LD HL, MB_DSCTMP MB_STRAD1: PUSH HL LD (HL), A MB_PUTDEI: INC HL LD (HL), E INC HL LD (HL), D POP HL RET MB_STRLIT: DEC HL MB_STRLTI: LD B, '"' MB_STRLT3: LD D, B MB_STRLT2: PUSH HL LD C, 0xff MB_STRGET: INC HL LD A, (HL) INC C OR A JP Z, MB_STRFIN CP D JP Z, MB_STRFIN CP B JP NZ, MB_STRGET MB_STRFIN: CP '"' CALL Z, MB_CHRGTR PUSH HL LD A, B CP ',' JP NZ, MB_NTTRLS INC C MB_LPTRLS: DEC C JP Z, MB_NTTRLS DEC HL LD A, (HL) CP ASCII_SP JP Z, MB_LPTRLS MB_NTTRLS: POP HL EX (SP), HL INC HL EX DE, HL LD A, C CALL MB_STRAD2 MB_PUTNEW: LD DE, MB_DSCTMP DB 0x3E MB_PUTTMP: PUSH DE LD HL, (MB_TEMPPT) LD (MB_FACLO), HL LD A, 0x3 LD (MB_VALTYP), A CALL MB_VMOVE LD DE, MB_FRETOP CALL MB_DCOMPR LD (MB_TEMPPT), HL POP HL LD A, (HL) RET NZ LD DE, ERRST ; String too complex error 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, ERRSO ; prepare for OOM error 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 MB_DSKDAT: DW 0x00 ; --------------------------------------------------- ; Init Basic ; Sets up certain locations, deletes functions if desired ; and changes this to jmp ready warm start for is ; --------------------------------------------------- MB_INIT: LD HL, MB_TSTACK ; Setup temp stack LD SP, HL ; Initialize protect flag XOR A LD (MB_PROFLG), A LD (MB_TOPMEM), HL ;= 60A3h LD SP, HL LD HL, MB_RST_INP LD (HL), ':' CALL MB_STKINI ;= ?? LD (MB_TTYPOS), A LD (MB_SAVSTK), HL ; Get Console status address LD HL, (WARM_BOOT_ADDR) LD BC, 0x4 ADD HL, BC ; HL = PTR to CSTS address LD E, (HL) INC HL LD D, (HL) ; DE -> CSTS EX DE, HL LD (CTC_ADDR3), HL ; Ctrl+C chk LD (CTC_ADDR1), HL ; Save LD (CTC_ADDR2), HL ; Fast Ctrl+C Chk EX DE, HL ; Get Console Input address INC HL INC HL LD E, (HL) INC HL LD D, (HL) EX DE, HL LD (CI_ADDR), HL ; Console input call address ; Get CO address EX DE, HL INC HL INC HL LD E, (HL) INC HL LD D, (HL) EX DE, HL LD (CO_ADDR), HL ; Console output call address ; EX DE, HL INC HL INC HL LD E, (HL) INC HL LD D, (HL) EX DE, HL LD (LPTO_ADDR), HL ; Check CP/M Version Number LD C, C.VER CALL BDOS_ENTER ;= ?? LD (MB_CPMVRN), A OR A LD HL, 0x1514 ;21*256+20+0 - 1.x Read / Write JP Z, MB_CPM_VR1 MB_CPM_VR2: LD HL, 0x2221 ;34*256+33+0 - 2.x Read / Write MB_CPM_VR1: LD (MB_CPMREA), HL LD HL, 65534 ;SAY INITIALIZATION IS EXECUTING LD (MB_CURLIN), HL ;= 65534 XOR A LD (MB_CNTOFL), A LAB_ram_5f3c: LD (MB_ENDBUF), A LD (MB_CHNFLG), A LD (MB_MRGFLG), A LD (MB_ERRFLG), A LD HL, 0 LD (MB_LPTPOS), HL LD HL, 128 LD (MB_MAXREC), HL LD HL, MB_TEMPST LD (MB_TEMPPT), HL LD HL, MB_PRMSTK LD (MB_PRMPRV), HL LD HL, (BDOS_ENTER_ADDR) LD (MB_MEMSIZ), HL ; --------------------------------------------------- ; THE FOLLOWING CODE SCANS A CP/M COMMAND LINE FOR BASIC. ; THE FORMAT OF THE COMMAND IS: ; BASIC [/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 PUSH HL LD HL, (MB_MAXREC) LD BC, FNZBLK ;x FNZBLK ADD HL, BC LD B, H LD C, L POP HL ; =>MB_STACK-2 DEC A JP NZ, MB_LOPFLB MB_HAVFNS: INC HL LD (MB_TXTTAB), HL ;= 6040h LD (MB_SAVSTK), HL POP DE LD A, E SUB L LD L, A LD A, D SBC A, H LD H, A JP C, MB_OMERR LD B, 0x3 MB_SHFLF3: OR A LD A, H RRA LD H, A LD A, L RRA LD L, A DEC B JP NZ, MB_SHFLF3 LD A, H CP 2 JP C, MB_SMLSTK LD HL, 512 ; SUBTRACT STACK SIZE FROM TOP MEM MB_SMLSTK: LD A, E SUB L LD L, A LD A, D SBC A, H LD H, A JP C, MB_OMERR LD (MB_MEMSIZ), HL EX DE, HL LD (MB_TOPMEM), HL ;= 60A3h LD (MB_FRETOP), HL LD SP, HL LD (MB_SAVSTK), HL LD HL, (MB_TXTTAB) ;= 6040h EX DE, HL CALL MB_REASON LD A, L SUB E LD L, A LD A, H SBC A, D LD H, A DEC HL DEC HL PUSH HL LD HL, MB_HEDING ;= "\r\nBASIC-80 R.5/240\r\n" CALL MB_STROUT POP HL CALL MB_LINPTR LD HL, MB_WORDS ;= " Bytes free" CALL MB_STROUT LD HL, MB_STROUT LD (MB_REPINI+1), HL CALL MB_CRDO LD HL, MB_READYR JP MB_INITSA MB_AUTTXT: DB "\r\n\nOwned by Microsoft\r\n", 0 MB_WORDS: DB " Bytes free", 0 MB_HEDING: DB "BASIC-80 Rev. 5.21\r\n[CP/M Version]\r\n" DB "Copyright 1977-1981 (C) by Microsoft\r\n" DB "Created: 28-Jul-81\r\n" DB 0, 0, 0, 0, 0, 0, 0, 0 MB_TSTACK EQU $+63