.PREL .IDENT LINE .INSERT HVG.LIB .INSERT MACRO.LIB .INSERT BBEQU.ASM .RELOC ; DIRECT COMMAND - TEXT COLLECTOR TELL:: ; LXI D,MSG ; CALL PRTSTG STOP:: CALL HKSTOP# RSTART:: LXI SP,STACK# LXI H,XXST1+1 SHLD CURRNT# XXST1: LXI H,0 SHLD LOPVAR# SHLD STKGOS# XXST2: MVI A,'>' CALL GETLN PUSH D LXI D,BUFFER# ; IGNORE ANY LEADING '>' LDAX D CPI '>' JRNZ XXST4 INX D XXST4: CALL TSTNUM# RSTIGN MOV A,H ORA L POP B JZ EXEC0# SHLD OLDLN# DCX D MOV A,H STAX D DCX D MOV A,L STAX D PUSH B PUSH D MOV A,C SUB E PUSH PSW CALL FNDLN PUSH D JRNZ XXST3 PUSH D CALL FNDNXT POP B LHLD TXTUNF# CALL MVUP MOV H,B MOV L,C CALL DCRTXT XXST3: POP B LHLD TXTUNF# POP PSW PUSH H CPI 3 JRZ RSTART ADD L MOV E,A MVI A,0 ADC H MOV D,A LHLD HVDFTL# XCHG CALL COMP# JNC QSORRY# CALL INRTXT POP D CALL MVDOWN POP D POP H CALL MVUP JMPR XXST2 ; FNDLN FNDLN:: CALL HKFLN# MOV A,H ORA A JM QHOW# LDED HVTEXT# FNDLP:: INX D LDAX D MOV C,A DCX D ADD A RC LDAX D SUB L MOV B,A INX D MOV A,C SBB H JRC FL1 DCX D ORA B FI2: RET FNDNXT: INX D FL1: INX D FNDSKP:: LDAX D CPI CR JRNZ FL1 INX D JMPR FNDLP GLED: LDA EDFLG# ANA A JRZ GLEDA LXI D,BUFFER# CALL TSTNUM# CALL FNDLN MVI A,'?' RNZ INX D CALL GLEDB XRA A STA EDFLG# GLEDA: LDED EDPTR# LDAX D GLEDB: INX D SDED EDPTR# RET GETLN:: LXI D,BUFFER# STA EDFLG# GL1: RSTOCH ; PROMPT OR ECHO GL2: PUSH B PUSH H PUSH D ; RETURN CHAR FROM NEXT LINE # GL2A: LXI H,NLLNCT# MOV A,M ; SENSE FLAG ANA A JRZ GL2C DCR M ; FIRST TIME THRU? CPI 5 JRNZ GL2B ; JUMP IF NOT ; GET PREVIOUS LINE # AND BUMP IT LHLD OLDLN# LXI D,10 DAD D RES 7,H ; ALLOW NEG GL2J: SHLD NLLNLN ; MOVE TO WORKING RAM CELL# ; COMPUTE DIVISION SUBTRACTOR GL2B: INDEXW 1 .WORD TBLDIV-2 LHLD NLLNLN# MVI B,0 GL2E: ANA A DSBC D JM GL2F INR B JMPR GL2E GL2F: DAD D SHLD NLLNLN# LXI H,NLLNZS# MOV A,B ANA A JRNZ GL2G MOV A,M ANA A JRZ GL2A ; YES - JUMP BACK XRA A GL2G: ADI '0' ; MAKE ASCII MOV M,A ; SET NONZERO FLAG JMPR GL2D ; NOTHIN FANCY GL2C: CALL CURSE# ; TOSS UP CURSOR CALL CHKIO# ; GET NORMAL CHARACTER CALL UNCURSE# ; UNWRITE THE CURSOR POP D STAX D ; STUFF CHAR AS DELIMITER PUSH D CPI EDKEY CZ GLED GL2D: POP D POP H POP B GL3: STAX D CPI RUBOUT JRNZ GL4 MOV A,E PUSH H LXI H,BUFFER# CMP L POP H JRZ GL2 DCX D LDAX D CPI 68H ; TOKEN TO RUB OUT? JRNC TOKIN CALL PNOTE# MVI A,RUBOUT JMPR GL1 TOKIN: PUSH D CALL TOKEPT# TOKER: MOV A,M PUSH H ANI 7FH CALL PNOTE# MVI A,RUBOUT CALL VDM# POP H MOV A,M INX H RLC JRNC TOKER TOKEQ: MVI A,RUBOUT RSTOCH ; ECHO ONE RUBOUT CHAR POP D GL9: JMP GL2 GL4: CPI CR JZ GL5 MOV A,E PUSH H LXI H,BUFEND# CMP L POP H JRZ GL9 LDAX D INX D JMP GL1 GL5: INX D INX D MVI A,0FFH STAX D DCX D JMP CRLF# ; MVUP AND MVDOWN MVUP:: CALL COMP# RZ LDAX D STAX B INX D INX B JMPR MVUP MVDOWN:: MOV A,B SUB D JRNZ MD1 MOV A,C SUB E RZ MD1: DCX D DCX H LDAX D MOV M,A JMPR MVDOWN ; SUBROUTINE TO MOVE ARRAY TO HIGHER ADDRESS INRTXT: PUSH B PUSH D PUSH H XCHG ; DE=NEW LHLD HVDFTL# ANA A DSBC D MOV C,L MOV B,H ; BC= # OF BYTES LHLD TXTUNF# ; HL=OLD ANA A DSBC D ; HL=OLD-NEW (NEGATIVE DIFF) LDED HVDFTL# DAD D ; HL= DEFLMT-DIFF MOV A,B ; CHECK ZERO ORA C JRZ ..NOGO LDDR ..NOGO: POP H SHLD TXTUNF# POP D POP B RET ; SUBROUTINE TO MOVE ARRAY TO LOWER ADDRESS DCRTXT: PUSH B PUSH D PUSH H XCHG LBCD TXTUNF# LHLD HVDFTL# ANA A DSBC B MOV C,L MOV B,H LHLD TXTUNF# MOV A,B ORA C JRZ ..NLDR LDIR ..NLDR: POP H SHLD TXTUNF# POP D POP B RET TBLDIV: .WORD 1 .WORD 10 .WORD 100 .WORD 1000 .WORD 10000 .END