$PAGELENGTH(66) XREF DEBUG PRINT(:LP:) ; ; LLL/CHERNACK BASIC INTERPRETER - MAIN MODULE ; NAME BASIC1 ; REVISED 12/22/77 EXTRN RUN,CRLF EXTRN PRINT,LIST,HELP,EXIT EXTRN DCOMP,CVB,CHK1,LENGTH,PTVAL,SYMSRT PUBLIC ALPHA ; TEST IF A-REG IS BETWEEN 0-9 PUBLIC CLOSE ; FILE CLOSE ROUTINE FOR PUBLIC ICE80 ; CHECK IF IN ICE80/DEBUG MODE PUBLIC MEMFUL ; TEST FOR 50 MORE BYTES IN RAM?? PUBLIC NUMB ; TEST IF A-REG IS BETWEEN 0-9 PUBLIC OPEN ; FILE OPEN ROUTINE FOR PUBLIC READY ; ENTRY POINT PUBLIC TTYIN ; READ LINE FOR PUBLIC STLINE ; => FIRST LINE USER PROGRAM PUBLIC STPNT ; STORE POINTERS PUBLIC WHAT ; PRINT ON CRT ISIS EQU 40H CI EQU 0F803H CO EQU 0F809H MEMST EQU 03200H ; MUST BE ON PAGE BOUNDARY OBUFF EQU MEMST STLINE EQU MEMST+111Q ; FIRST LINE OF USER PROGRAM NLINE EQU MEMST+113Q ; POINTER TO NEW LINE OF USER TEXT NL2 EQU MEMST+115Q ; BINARY VALUE OF NEW LINE NUMBER NL6 EQU MEMST+121Q ; LENGTH OF NEW LINE KLINE EQU MEMST+122Q ; POINTER TO CURRENT LINE - LINE INSERT KL2 EQU MEMST+124Q ; BINARY EQUIVALENT OF CURRENT LINE # KL4 EQU MEMST+126Q ; FORWARD POINTER OF CURRENT LINE PLINE EQU MEMST+131Q ; PREVIOUS LINE POINTER, LINE INSERTION MEMCHK EQU 0F81BH CSEG $EJECT TITLE('BASIC MAIN MODULE 12/22/77') ; ********************* ; INTERRUPT ENTRY POINT ; ********************* INT: MVI A,20H ; RE-ENABLE INTELLEC INTERRUPT OUT 0FDH LXI H,OBUFF ; CLEAR OUTPUT BUFFER MVI M,1 ; BY SETTING LENGTH TO <1> EI JMP READY ; AND GOTO ; ************************ ; MAIN PROGRAM ENTRY POINT ; ************************ BASIC: MVI A,0C3H ; SET 38H => STA 38H LXI H,INT SHLD 39H ; IN 0FCH ; ENABLE INTERRUPT SWITCH 7 ANI 7FH OUT 0FCH ; BY CLEARING BIT 7 LXI SP,6000H; TEMPORARY VALUE UNTIL SCR: LXI H,OBUFF ; MVI M,1 LXI H,0FFFFH; SET = FFFFH SHLD STLINE LXI H,MEMORY; HL => FWA MEMORY CALL ICE80 ; IF IN TP0: LXI H,5000H ; THEN HL => 5000H SHLD NLINE ; STORE IN FREE SPACE POINTER $EJECT ; *************** ; PROCESS ; *************** READY: CALL MEMCHK ; CALL MONITOR ROUTINE MOV H,B MOV L,A CALL ICE80 ; IF IN TP1: LXI H,0E000H; THEN SP <= E000H SPHL ; SP <= BA --- LXI H,MESS1 ; WRITE CALL PRINT ; <'READY'> CALL UNLOAD ; INPUT TO , DISABLE LOAD M3: LHLD NLINE ; INX H ; SPACE OVER 16-BIT LINE NUMBER (HOLE) INX H INX H ; SPACE OVER 16-BIT POINTER TO NEXT LINE INX H INX H ; SPACE OVER 8-BIT LENGTH CHARACTER CALL READI ; READ LINE INTO ... MOV C,A ; IF = 0 ORA A JZ M3 ; THEN GOTO CALL ALPHA ; IF CHARACTER AT = A-Z JC M4 ; THEN -- DECODE COMMAND CALL NUMB ; IF CHARACTER AT .NE. 0-9 JNC WHAT ; THEN <'WHAT'> CALL INSERT ; LINE INTO PROGRAM JMP M3 ; AND GET NEXT LINE M4: CALL UNLOAD ; RESET TO :CI: AFTER ALPHA INPUT XRA A ; SEARCH FOR BY CALL SYMSRT ; CALLING CPI -1 ; IF = <-1> JZ WHAT ; THEN <'WHAT'> ORA A ; IF = <0> JZ RUN ; THEN 'RUN' CPI 1 ; IF = 1 JZ HELP ; THEN 'HELP' CPI 2 ; IF = 2 JZ LIST ; THEN 'LIST [:FN:XXXXX.XXX]' CPI 3 ; IF = 3 JZ SCR ; THEN 'SCR' CPI 4 ; IF = 4 JZ EXIT ; THEN 'EXIT' CPI 5 ; IF = 5 JZ LOAD ; THEN 'LOAD :FN:XXXXXX.XXX' ; JMP WHAT ; ELSE <'WHAT'> $EJECT ; LINE SUBROUTINES: ; ; THESE SUBROUTINES WILL READ A LINE FROM ; 1) :CI: USING ISIS-II SYSTEM CALL ; 2) :FX:XXXXXX.XXX USING ISIS-II SYSTEM CALL ; 3) MDS MONITOR SUBROUTINE IF IN ICE80/DEBUG ; ; IF MEMORY LOCATON 40H (ISIS) = 76H (HLT) THEN ALTERNATIVE #3. ; IF THEN ALTERNATIVE #2. ; ELSE, ALTERNATIVE #1. ; THREE BUFFERS ARE USED IN THIS PROCESS: ; 1) HL - SUPPLIED BY USER WHEN CALL EXECUTED. ; ; THE FINAL INPUT LINE IS PLACED IN THIS BUFFER, ; AND THE A-REG IS SET TO THE CHARACTER COUNT, OR ; ZERO IF NOTHING IS READ IN. ; ALL BLANKS ARE REMOVED BY EXCEPT FOR ; THOSE BLANKS BETWEEN <"> CHARACTERS. ; ; ; 2) INBUF(80) ; ; THE RAW INPUT LINE, FROM :CI: OR IS PUT ; IN HERE. A CRLF WILL BE PLACED IN HERE TOO. THIS ; BUFFER ALLOWS TO COMPRESS THE LINE, AND ; ALSO ALLOWS MORE THAN ONE DISC READ IF A LINE ; IS NOT READ INTO BEFORE IS EXHAUSTED. ; ; ; 3) DBUFF(128) ; ; THIS BUFFER IS USED BY AS ; A SOURCE OF CHARACTERS TO BE DRAWN UPON BY ; AS ADDITIONAL CHARACTERS ARE NEEDED. WHEN THIS ; BUFFER IS EMPTIED, WILL CALL ; TO REFILL IT. ; ON RETURN, HL IS RESTORED TO POINT TO USER BUFFER ; A = # OF CHARACTERS READ ; ON RETURN, AN UNCOMPRESSED VERSION OF THE INPUT LINE IS ; LEFT IN AND / ARE INITIALIZED FOR ; CHARACTER SCANS. $EJECT ; (1) READ FROM AFTN USING ISIS-II SYSTEM CALL TTYIN: READI: PUSH H ; SAVE USER BUFFER ADDRESS IN STACK CALL ICE80 ; IF IN JMP READ ; THEN USE LDA LDFLAG ; IF = TRUE (NOT ZERO) ORA A JNZ READL ; THEN USE -- READ/LOAD :FN:XXXXXX.XXX LXI H,INBUF ; RESET SHLD CPTR ; TO => MVI C,3 ; LXI D,RAFT CALL ISIS JMP MOVE0 RAFT: DW 1 ; FILE CPTR: DW INBUF ; ADDRESS OF CAPTIVE INPUT BUFFER DW RBUFFL ; LENGTH OF CAPTIVE INPUT BUFFER DW STAT1 ; ACTUAL INPUT LENGTH DW STAT2 ; INPUT STATUS STAT1: DW 0 STAT2: DW 0 $EJECT ; (2) READ SUBROUTINE -- READ FROM MDS MONITOR SUBROUTINE READ: MVI B,0 LXI H,INBUF ; READ INTO BUFFER READ1: CALL CI ANI 7FH CPI 7FH ; IF JZ READ2 ; THEN CPI LF ; IF JZ READ1 ; THEN IGNORE CPI CR ; IF JZ READ3 ; THEN CPI 12H ; IF JZ READ4 ; THEN -- REPEAT LINE CALL PUTIN ; PUT CHARACTER IN BUFFER MOV A,B ; IF .NE. <72> CPI RBUFFL-2 JNZ READ1 ; THEN MVI C,87H ; ELSE PRINT CALL CO READ3: MVI A,CR ; PUT IN BUFFER CALL PUTIN MVI A,LF CALL PUTIN ; AND ECHO CHARACTERS JMP MOVE0 ; AND GOTO READ2: ; : MOV A,B ; IF = <0> ORA A JZ READ21 ; THEN DCX H ; ELSE REMOVE AND ECHO CHARACTER MOV C,M CALL CO DCR B ; IF (B = B-1) .GE. <0> JP READ1 ; THEN GET MORE CHARACTERS READ21: XRA A ; ELSE POP H RET ; AND PUTIN: MOV C,A CALL CO MOV M,A INX H INR B RET $EJECT READ4: ; : PUSH H ; SAVE CURRENT INSERT POSITION PUSH B ; SAVE CHARACTER COUNTER CALL CRLF ; PRINT MOV A,B ; IF = 0 ORA A JZ READ42 ; THEN -- RETURN LXI H,INBUFA; HL => MOV M,B ; INBUFA <= B CALL PRINT ; ECHO ENTIRE MESSAGE READ42: POP B ; RESTORE CHARACTER COUNTER POP H ; RESTORE CURRENT INSERT POINTER JMP READ1 $EJECT ; (3) READL - READ CHARACTERS FROM FILE <:FN:XXXXXX.XXX> READL: XRA A ; A <= 0 MOV C,A ; C <= # OF CHARACTERS MOVED INTO INBUFF LXI D,INBUF ; DE => DESTINATION BUFFER READL1: LDA DCTR ; A <= # OF CHARACTERS LEFT IN MOV B,A ; B <= # OF CHARACTERS LEFT IN LHLD DPTR ; HL => NEXT CHARACTER READL2: MOV A,M ; A <= NEXT CHARACETER FROM CPI LF ; IF JZ READL3 ; THEN -- IGNORE STAX D ; MOVE TO DESTINAION BUFFER INX D ; UP DESTINATION POINTER INR C ; UP DESTINATION COUNTER MOV A,C ; IF LINE TOO LONG CPI RBUFFL JNZ READL3 LXI H,MESS2 ; THEN <'LINE TOO LONG'> CALL PRINT JMP READY ; AND READL3: MOV A,M ; RESTORE CHAR TO A-REG INX H ; UP SOURCE POINTER DCR B ; DECREMENT SOURCE COUNTER CPI CR ; IF JZ READL4 ; THEN -- END-OF-LINE MOV A,B ; IF ORA A JNZ READL2 ; THEN CALL DREAD ; ELSE JMP READY ; (READY IF ) JMP READL1 ; THEN CONTINUE TRANSFER READL4: SHLD DPTR ; SAVE POINTER TO MOV A,B STA DCTR ; SAVE SOURCE COUNTER JMP MOVE0 ; FINISH THE JOB WITH $EJECT ; MOVE CHARACTERS FROM ; TO AND ; REMOVE ALL BLANKS EXCEPT THOSE BETWEN <">'S. ; TERMINATE MOVE AT . MOVE0: XRA A MOV C,A ; C <= # OF CHARACTERS MOVED TO DESTINATION MOV B,A ; B <= 0 (FALSE = NOT BETWEEN QUOTES) LXI D,INBUF ; DE => BUFFER POP H PUSH H ; HL => MOVE1: LDAX D ; A <= NEXT SOURCE CHARACTER CPI '"' ; IF = <"> JNZ MOVE2 MOV A,B CMA MOV B,A ; THEN <= NOT MOVE2: MOV A,B ; IF = ORA A JNZ MOVE3 ; THEN LDAX D ; IF = CPI ' ' JZ MOVE4 ; THEN -- IGNORE IT CPI CR ; IF JZ MOVE5 ; THEN -- TERMINATE MOVE MOVE3: LDAX D ; ADD PARITY BIT TO ORI 80H MOV M,A ; AND PUT IN DESTINATION BUFFER INX H ; UP DESTINATION POINTER INR C ; UP DESTINATION COUNTER MOVE4: INX D ; UP SOURCE POINTER JMP MOVE1 ; GET NEXT CHARACTER MOVE5: MOV A,C ; A <= # OF CHARACTERS IN DESTINAION BUFFER POP H ; HL => USER BUFFER RET $EJECT ; PROCESS ; THE LOAD PROCESSOR WILL CLOSE ANY OPEN FILE BECAUSE ONLY ; ONE FILE IS PRESENTLY ALLOWED OPEN BY . IT WILL THEN ; OPEN THE REQUESTED FILE FOR ACCESS. ; WILL BE CALLED TO READ THE FIRST 128 BYTES FROM ; DISC AND THEN SUBSEQUENT CALLS TO WILL READ LINES ; FROM THE BUFFER INTO . THESE CALLS SHALL OPERATE ; IN THE SAME MANNER AS AND CALLS. ; IF AN IS DETECTED, THEN THE WILL BE CLEARED ; AND THE FILE . IF A LINE IS READ WHICH DOES NOT ; START WITH A NUMBER, I.E., IT IS NOT A BASIC STATEMENT, ; THEN WILL BE CALLED FROM . LOAD: CALL ICE80 ; IF IN JMP READY ; THEN MVI A,1 ; 1 => FILE TO BE READ-ONLY CALL OPEN ; PROCESS JMP READY ; IF OR MVI A,0FFH ; SET = STA LDFLAG ; TRUE INR A ; A <= 0 STA EOFLAG ; EOFLAG <= FALSE CALL DREAD ; PREPARE FOR CALLS JMP READY ; ALREADY! JMP M3 ; -- -- ; ; UNLOAD SUBROUTINE - DISABLE FUNCTION DEFAULT TO ; UNLOAD: PUSH PSW PUSH B PUSH H LDA LDFLAG ; IF = ORA A JZ UNLOA1 ; THEN XRA A ; ELSE STA LDFLAG ; <= CALL CLOSE ; AND DISC FILE UNLOA1: POP H POP B POP PSW RET LDFLAG: DB 0 ; 0 = FALSE, FFH = TRUE EOFLAG: DB 0 ; 0 = FALSE, FFH = TRUE $EJECT ; - OPEN :FX:XXXXXX.XXX ; MVI A,ACCESS ; (1-READ, 2-WRITE, 3-UPDATE) ; CALL OPEN ; OPEN THE FILE IN ; (P+3) ; ; (P+6) ; ; OPEN: STA ACCESS ; ACCESS <= A (1,2,3) LDA CAFT ; IF ORA A CNZ CLOSE ; THEN MVI A,15 ; A = LENGTH OF OFILE LXI H,OFILE ; HL => OFILE CALL GETST ; GET FILE NAME FROM INPUT BUFFER ; LDA OFILE ; IF CPI ' ' RZ ; THEN (P+3) RETURN MVI C,0 ; 0 = LXI D,OBLK ; DE => OBLK CALL ISIS ; CALL LDA STAT1 CALL ETEST ; CHECK FOR STATUS ERROR RNZ ; AND (P+3) RETURN IF ERROR LHLD OAFT ; SET-UP FOR --- SHLD CAFT ; CAFT <= OAFT SHLD RDBLK ; RDBLK <= OPEN FILE AFTN JMP RPLUS ; (P+6) RETURN OBLK: DW OAFT ; OBLK => FILE NUMBER ASSIGNED BY ISIS DW OFILE ; OFILE => 'FILE NAME' TO BE OPENED ACCESS: DW 1 ; ACCESS <= (1-READ, 2-WRITE, 3-UPDATE) ECHO: DW 0 ; ECHO <= 0 OR FILE # TO ECHO INPUT ON DW STAT1 OAFT: DW 0 ; OAFT <= AFT (FILE #) OF FILE SELECTED OFILE: DS 15 ; <:FN:XXXXXX.XXX> FROM COMMAND $EJECT ; - PREPARE FOR CALLS ; CALL DREAD ; (P+3) ; (P+6) ; SAVED. DREAD: LDA EOFLAG ; IF = ORA A RNZ ; THEN (P+3) RETURN PUSH B PUSH D MVI C,3 ; LXI D,RDBLK ; READ/DISC BLOCK CALL ISIS LDA STATUS CALL ETEST ; CHECK FOR STATUS ERROR LXI H,DBUFF ; HL => DBUFF SHLD DPTR ; DPTR => DBUFF LDA ACTUAL ; DCTR <= STA DCTR ; ACTUAL INPUT LENGTH PUSH PSW ; SAVE ACTUAL LENGTH CPI 128 ; IF .NE. <128> JZ DREAD1 MVI A,0FFH STA EOFLAG ; THEN <= CALL CLOSE ; AND THE FILE DREAD1: POP PSW POP D POP B ORA A ; IF = <0> RZ ; THEN (P+3) RETURN JMP RPLUS ; ELSE (P+6) RETURN RDBLK: DW 0 ; OPEN FILE AFTN DW DBUFF ; => DISC INPUT BUFFER DW 128 ; LENGTH OF DBUFF DW ACTUAL ; => ACTUAL LENGTH AFTER READ DW STATUS ; READ STATUS DBUFF: DS 128 ; 128 BYTES ACTUAL: DS 2 STATUS: DW 0 DPTR: DW 0 ; POINTER TO NEXT CHARACTER IN DCTR: DB 0 ; REMAINING CHARACTER COUNTER IN $EJECT ; - CLOSE ; CLOSE THE FILE OPENED BY THE CALL ABOVE. CLOSE: CALL ICE80 ; IF IN RET ; THEN LDA CAFT ; IF ORA A RZ ; THEN MVI C,1 ; 1 = LXI D,CAFT CALL ISIS XRA A STA CAFT ; CAFT <= 0 -- [NO FILE OPEN] LDA STAT CALL ETEST RET CAFT: DW 0 ; CAFT = FILE AFTN (FILE #) DW STAT $EJECT ; FILL: CMA FILL1: INR A ; IF REMAINING LENGTH .GE. 0 RP ; THEN RETURN MOV M,B ; M[HL] = 'B' INX H JMP FILL1 ; ; ; CHARACTER RETURNED IN A-REG ; (P+3) RETURN - OUT OF DATA ; (P+6) RETURN - CHARACTER IN A-REG ; GCHAR: LHLD CPTR MOV A,M INX H ; CPTR <= SHLD CPTR ; CPTR+1 ORA A ; IF CHARACTER = NULL RZ ; THEN (P+3) RETURN CPI CR ; IF CHARACTER = RZ ; THEN (P+6) RETURN POP H INX H INX H INX H PCHL ; ELSE (P+3) RETURN $EJECT ; ; ; ; THIS SUBROUTINE WILL SCAN THE INPUT BUFFER FOR THE FIRST ; BLANK . IT WILL THEN SCAN FOR THE FIRST NON- ; BLANK , AND THEN WILL MOVE CHARACTERS FROM ; THE INPUT BUFFER TO THE DESTINATION BUFFER . ; ; INITIALLY, THE CHARACTERS OF THE DESTINATION BUFFER ; WILL BE FILLED WITH BLANKS. ; ; THE SUBROUTINE IS USEFUL FOR TAKING APART COMMANDS SUCH ; AS . ; GETST: PUSH PSW ; SAVE A-REG PUSH H ; SAVE HL-REG
MVI B,' ' ; FILL DESTINATION BUFFER CALL FILL ; WITH BLANKS ; GETS1: CALL GCHAR ; GET CHARACTER FROM INPUT BUFFER JMP GEMPTY ; IF THEN CPI ' ' ; IF JNZ GETS1 ; THEN ; GETS2: CALL GCHAR ; GET CHARACTER JMP GEMPTY ; IF THEN CPI ' ' ; IF JZ GETS2 ; THEN GETS2 ; POP D ; DE => DESTINATION ADDRESS POP B ; B = CHARACTER COUNT GETS3: STAX D ; MOVE CHARACTER TO DESTINATION BUFFER INX D ; DE <= DE+1 DCR B ; IF DESTINATION BUFFER FULL RZ ; THEN RETURN CALL GCHAR ; ELSE JMP GRET ; IF THEN JMP GETS3 ; PUT CHAR IN BUFFER ; GEMPTY: POP H ; CLEAN UP STACK POP PSW GRET: RET $EJECT ; ; ETEST: ORA A ; IF = 0 RZ ; THEN PUSH PSW ; SAVE A-REG AND FLAGS AFTER (ORA A) ; LXI H,MSG5 ; CPI 12 ; IF = 12 JZ ETES1 ; THEN ; LXI H,MSG4 ; ---UNSPECIFIED ETES1: CALL PRINT POP PSW RET $EJECT ; CR EQU 0DH ; ASCII LF EQU 0AH ; ASCII STAT: DS 2 ; RETURN STATUS RBUFFL EQU 80 ; LENGTH OF INPUT BUFFER INBUFA: DB 0 ; MUST PRECEED INBUF INBUF: DS RBUFFL ; INPUT BUFFER DB 0 ; NULL AT END OF INPUT BUFFER MSG4: DB 9,CR,LF,'ERROR',CR,LF MSG5: DB 19,'FILE ALREADY OPEN',CR,LF $EJECT INSERT: DCX H MOV M,C INX H CALL CVB CPI 5 JC ISR1A CNZ WHAT MOV A,E RAL CC WHAT ISR1A: LHLD NLINE MOV M,D INX H MOV M,E LXI H,NLINE CALL PTVAL LHLD STLINE CALL CHK1 JNC ISRT3 LHLD NLINE SHLD STLINE ISRT1: MVI D,377Q MOV E,D CALL STPNT INX H ISRT2: MOV A,M ADI 5 LHLD NLINE ADD L MOV L,A MVI A,0 ADC H MOV H,A SHLD NLINE RET ISRT3: SHLD KLINE ISRT4: LXI H,KLINE CALL PTVAL LXI H,NL2 MOV D,M INR L MOV E,M LXI H,KL2 MOV B,M INR L MOV C,M CALL DCOMP JZ ISRT6 JC ISR12 LHLD KL4 CALL CHK1 JC ISRT5 PUSH H LHLD KLINE SHLD PLINE LXI H,PLINE CALL PTVAL POP H SHLD KLINE JMP ISRT4 ISRT5: LHLD NLINE CALL NOLINE RZ XCHG LHLD KLINE CALL STPNT XCHG JMP ISRT1 ISRT6: LHLD NLINE CALL NOLINE JNZ ISRT8 LHLD STLINE XCHG LHLD KLINE PUSH H POP B CALL DCOMP LHLD KL4 JZ ISRT7 XCHG LHLD PLINE CALL STPNT RET ISRT7: SHLD STLINE RET ISRT8: LHLD KL4 XCHG LHLD NLINE CALL STPNT ISRT9: LHLD KLINE XCHG LHLD STLINE PUSH H POP B CALL DCOMP JZ ISR11 LHLD NLINE XCHG LHLD PLINE CALL STPNT ISR10: LXI H,NL6 JMP ISRT2 ISR11: LHLD NLINE SHLD STLINE JMP ISR10 ISR12: LHLD KLINE XCHG LHLD NLINE CALL NOLINE RZ CALL STPNT JMP ISRT9 $EJECT ; ROUTINE TO STORE POINTERS INTO MEM ARRAY ; STPNT: INX H INX H MOV M,E INX H MOV M,D RET ; ; ROUTINE TO CHECK NEW LINE FOR SOURCE STMT. ; NOLINE: PUSH H INX H INX H INX H INX H MOV C,M INX H CALL LENGTH POP H CMP C RET ; ; ROUTINE TO RESPOND WITH 'WHAT?' FOR UNIDENTIFIED COMMAND ; WHAT: LXI H,MESS7 ; <'WHAT?'> CALL PRINT JMP READY ; ; ROUTINE TO CHECK TO SEE IF IN ICE-80 DEBUG MODE ; ; NOTE: SET-UP UNDER ICE80 WITH ; ICE80: LDA ISIS ; IF = <76H> CPI 76H RZ ; THEN (P+3) RETURN RPLUS: XTHL INX H INX H INX H XTHL RET ; ELSE (P+6) RETURN $EJECT ; ROUTINES NUMB AND ALPHA CHECK IF CONTENTS OF MEMORY ; LOCATION IN HL CONTAIN ASCII NUMERIC OR ALPHBETIC ; CHARACTER. RETURN CY=1 IF YES, CY=0 IF NO. ; NUMB: PUSH B MVI B,260Q MVI C,272Q C1: MOV A,M CMP B CMC JNC BAC CMP C BAC: POP B RET ALPHA: PUSH B MVI B,301Q MVI C,333Q JMP C1 ; ; ROUTINE TO INSURE SOURCE DOES NOT OVERFLOW MEM SPACE ; COMPARES CURENT MEM ADDRESS TO SP. ; MEMFUL: PUSH B PUSH D PUSH H MVI A,50 ADD L MOV B,A MVI A,0 ADC H MOV C,A LXI H,0 DAD SP MOV D,L MOV E,H CALL DCOMP POP H POP D POP B RNC LXI H,MESS8 ; <'MEMORY FULL',CR,LF> CALL PRINT JMP READY ; PRINT <'READY'> $EJECT ; CONSTANTS, VARIABLES AND MESSAGES MESS1: DB 9,CR,LF,'READY',CR,LF MESS2: DB 15,'LINE TOO LONG',CR,LF MESS7: DB 7,'WHAT?',CR,LF MESS8: DB 14,'MEMORY FULL',CR,LF END BASIC