$PAGELENGTH(66) XREF DEBUG PRINT(:LP:) ; ; LLL BASIC INTERPRETER - ROUTINES ; NAME BASIC4 ; REVISED CHARLES CHERNACK 12/11/77 EXTRN MEMFUL,DCOMP EXTRN MULT,NUMB PUBLIC CHK1 PUBLIC CVB,NSRCH,LENGTH PUBLIC FOR10,FOR11,FOR12 PUBLIC PAD,WRIT,WRIT1 PUBLIC FORM5,FORM6,FORM9 CO EQU 0F809H ; MDS MONITOR ROUTINE MEMST EQU 3200H ; MUST BE ON PAGE BOUNDARY OBUFF EQU MEMST ; INPUT AND OUTPUT BUFFERS OCCUPY STLINE EQU MEMST+111Q KASE EQU MEMST+140Q LEN EQU MEMST+141Q MULT1 EQU MEMST+142Q MULT2 EQU MEMST+144Q CSEG $EJECT TITLE('BASIC INPUT MODULE 12/11/77') ; ROUTINE TO CONVERT ASCII NUMERIC CHAR. STRING TO ; EQUIVALENT BINARY NUMBER. RETURNS EQUIVALENT IN ; DE REG. LENGTH OF LINE PASSED IN REG C AND ; RETURNED POINTING TO LAST NUMERIC CHAR. LENGTH ; OF CHAR STRING RETURNED IN REG A. ; CVB: PUSH H PUSH B CALL LENGTH PUSH PSW PUSH H CPI 0 JZ CVB2 LXI H,KASE MOV M,A INR L MOV M,C LXI H,10 SHLD MULT1 LXI H,0 SHLD MULT2 LXI H,MULT2+1 CVB1: CALL MULT XTHL MOV A,M SBI 260Q ADD D MOV D,A MVI A,0 ADC E MOV E,A INX H XTHL MOV M,D INR L MOV M,E PUSH H LXI H,LEN DCR M DCR L DCR M POP H JNZ CVB1 CVB2: POP H POP PSW POP B LXI H,LEN MOV C,M POP H RET $EJECT ; ROUTINE TO EVALUATE LENGTH OF ASCII NUMERIC ; CHAR STRING: PASSED ADD OF FIRST CHAR IN HL REG. ; RETURNS LENGTH IN REG A. ; LENGTH: PUSH B PUSH H MVI B,0 NLE1: CALL NUMB JNC NLE2 INX H INR B DCR C JZ NLE2 JMP NLE1 NLE2: MOV A,B POP H POP B RET ; ROUTINE TO LOCATE SOURCE LINE IN MEM. PASSED BIN VALUE ;OF LINE NUMBER IN DE(LOW,HIGH) REG. RETURNS ADDRESS OF ;SOURCE LINE IN HL REGS.(HIGH,LOW). CY SET=> NOT FOUND. ; NSRCH: LHLD STLINE L2: CALL CHK1 RC MOV B,M INX H MOV C,M CALL DCOMP JZ FOUND INX H MOV A,M INX H MOV H,M MOV L,A JMP L2 FOUND: DCX H ORA A RET ; ROUTINE TO COMPARE CONTENTS OF HL TO 177777Q. ; RETURNS CY=1 IF YES: CY=0 IF NO. ; CHK1: PUSH B PUSH H MVI B,0 MVI C,1 DAD B POP H POP B RET $EJECT ; ROUTINE TO PAD OUTPUT BUFFER WITH CONTENTS OF REG A. ; REG B CONTAINS NUMBER OF CHAR TO PAD. ; PAD: PUSH B PUSH D PUSH H LXI H,OBUFF MOV C,L ; C = LOWER ADDRESS MOV L,M ; L = CHARACTER COUNT MOV D,A ; D = CHARACTER TO OUTPUT MVI A,73 ; IF = <73> P1: CMP L JNZ P2 MOV L,C MOV M,A CALL WRIT ; THEN WRITE IT INR L P2: MOV M,D ; PUT CHARACTER IN BUFFER INR L DCR B ; IF NOT DONE JNZ P1 ; THEN GET NEXT CHARACTER MOV A,D ; A = LAST CHARACTER MOV B,L ; B = CHARACTER COUNT MOV L,C MOV M,B ; OBUFF = NEW CHARACTER COUNT POP H POP D POP B RET $EJECT ; ROUTINE TO DUMP OUTPUT BUFFER TO TTY. ; ; WRIT: MVI D,0 ; WRIT1: PUSH PSW PUSH H PUSH B LXI H,OBUFF PUSH H MOV C,M ; C = CHAR COUNT + 1 DCR C JZ W2 INR L W1: MOV A,M ; GET NEXT CHAR CALL SNDCO ; PRINT IT INR L DCR C ; IF MORE CHARACTERS JNZ W1 ; THEN PRINT THEM DCR D ; IF .NE. <1> JZ W2 MVI A,215Q ; THEN CALL SNDCO ; PRINT MVI A,212Q ; CR CALL SNDCO ; LF W2: POP H MVI M,1 POP B POP H POP PSW RET ; ; OUTPUT CHARACTER TO CONSOLE ; SNDCO: PUSH B MOV C,A CALL CO ; MDS MONITOR ROUTINE POP B RET $EJECT ; FORM5 PADS SOURCE LINE, PASSED ADDRESS OF ; LENGTH OF LINE IN HL REGS. ; FORM6 PADS CHAR STRING, PASSED ADD OF FIRST CHAR IN ; HL, LENGTH OF STRING IN REG C FOR12: LXI H,MES12 ; JMP FORM5 ; FOR11: LXI H,MES11 ; JMP FORM5 ; FOR10: LXI H,MES10 ; JMP FORM5 ; FORM9: LXI H,MESS9 ; ; ; = MESSAGE FORM5: MOV C,M ; C = MESSAGE LENGTH MOV A,C ; A = MESSAGE LENGTH CPI 0 ; IF = <0> RZ ; THEN ; F1: INX H ; MOVE MESSAGE CHARACTER FORM6: MOV A,M ; IN A-REGISTER MVI B,1 ; B = 1 CALL PAD DCR C JNZ F1 ; TO OUTPUT BUFFER RET $EJECT MESS9: DB 22,'INPUT ERROR, TRY AGAIN' MES10: DB 10,'INDEFINITE' MES11: DB 8,'OVERFLOW' MES12: DB 9,'UNDERFLOW' END