*NLST ASCF 0 * PRGORG EQU 00100H * ORG PRGORG XEQ PRGORG * COPY NPTDEFS * *NLST * CRLF EQU 00A0DH DELIM EQU 000H MAXLIN EQU 15 MAXIMUM NUMBER OF LINES TO PRINT AT ONE TIME DATORG EQU 01000H ORIGIN TO WRITE DATA FROM * *LST * first address of program START LXI SP,STACK * *NLST * LXI D,HNAME OPEN HELP DATA FILE LXI H,0 CALL SYS DB OPEOP JMP PERR1 STA FNUM SAVE THE DATA FILE LHLD SYSGLO GET CI OUTPUT FILE NUMBER LXI D,GLCOF DAD D MOV A,M STA CIOF CI OUTPUT FILE * AGAIN LXI D,CR JUST DO A CARRIAGE RETURN CALL WRTLINE * AGN1 MVI A,MAXLIN STA LINCNT LXI H,NBUFF MVI A,NAMELENGTH-1 * AGN2 MVI M,0 ZERO OUT NBUFF INX H DCR A JNZ AGN2 * LDA LASTCHAR CHECK FOR LAST ARGUMENT CPI 0DH JZ DONE CPI ';' JNZ NOTDONE * DONE LDA FNUM CLOSE DATA FILE CALL SYS DB CLOOP JMP PERR1 CALL SYS DB RETOP * NOTDONE MVI A,PSOPT READ ALL CHARACTERS TO DELIMITER LXI D,NBUFF CALL PSCAN STA LASTCHAR JC PERR JNZ FNAME CPI ',' IGNORE MISSING ARGUMENT IN MIDDLE JZ AGN1 LXI H,HELP-DATORG NO ARGUMENTS AT ALL MEANS USE 'HELP' JMP FOUND FNAME MVI A,NAMELENGTH-2 CHECK FOR NAME TOO LONG SUB C JC PERR CALL UPSHIFT UPSHIFT ASCII NAME IN NBUFF LXI D,NBUFF FIND NAME POINTED TO BY DE CALL FINDNAME ...IN CTABLE JZ FOUND JUMP IF FOUND LXI D,NOTFOUND POINT TO 'NOT FOUND' STRING MVI L,000H STOP CHARACTER CALL WRTL1 LXI D,NOTFN CALL WRTLINE JMP AGAIN * FOUND LDA FNUM SEEK TO START OF DEFINITION MVI B,0 ...IN FILE (HL HAS ADDRESS) CALL SYS DB SEKOP JMP PERR1 * PTEXT LDA FNUM READ ALL INFORMATION TO LINEFEED LXI B,132 THIS MANY MAX LXI D,INBUF TO HERE MVI L,00AH A LINEFEED WILL STOP US CALL SYS DB DRDOP JMP PERR1 LXI D,INBUF POINT TO START OF STRING LDAX D CPI DELIM JZ AGAIN CALL WRTLINE ...AND PRINT IT LXI H,LINCNT TEST FOR MAXIMUM NUMBER OF LINES DCR M JNZ PTEXT MVI M,MAXLIN RESET MAXIMUM NUMBER OF LINES LXI D,CRTC CARRIAGE RETURN TO CONTINUE STRING MVI L,000H STOP ON THIS CHARACTER CALL WRTL1 PRINT IT PTXT1 CALL CONIN CPI 00DH JNZ PTXT1 LXI D,CR CALL WRTLINE * JMP PTEXT DO IT AGAIN * PERR MVI A,ERNTL NAME TOO LONG ERROR PERR1 STA ERR1 LXI H,USAGE MVI A,128+4+2 CALL UTIL DB UXOP JMP ABORT DB -1 ERR1 DB -1 LDA FNUM CLOSE THE DATA FILE CALL SYS DB CLOOP DB 0,0,0 DON'T CARE ABOUT ERRORS CALL SYS DB RESOP * USAGE ASC 'HELP' FOR 'CALLED FROM ' DB 0 * ABORT CALL SYS DB ABTOP * UPSHIFT LXI H,NBUFF UPSHIFT ASCII NAME IN NBUFF UP1 MOV A,M ORA A ZERO BYTE MEANS NO MORE RZ CPI 'a' JC UP2 CPI 'z' JNC UP2 SUI ' ' MOV M,A UP2 INX H JMP UP1 * WRTLINE MVI L,00AH DELIMITER FOR WRITE * WRTL1 LDA CIOF ENTER HERE IF 'L' HAS DELIMITER LXI B,132 MAX. BYTES TO WRITE CALL SYS DB DWROP * CALL PERR1 RET * FINDNAME EQU $ LOOK-UP NAME IN TABLE * DE POINTS TO NAME TO FIND * ZERO SET ON RETURN MEANS FOUND A MATCH * MVI B,NUMNAME+1 TOTAL NUMBER OF NAMES LXI H,TABLE FN1 DCR B JNZ MORE INR B RESET ZERO FLAG RET . * MORE PUSH D SAVE ADDRESS OF NAME TO FIND PUSH H SAVE TABLE ADDRESS CALL COMPARE COMPARE DE & HL POP H LXI D,NAMELNTH GET START OF NEXT NAME DAD D POP D GET ADDRESS OF NAME TO FIND JNZ FN1 * DCX H NOW GET ADDRESS FOLLOWING NAME MOV A,M DCX H MOV L,M MOV H,A RET . WITH ZERO FLAG SET * COMPARE EQU $ COMPARE STRINGS POINTED TO BY DE & HL * ZERO SET = FOUND MATCH * MVI C,NAMELNTH-2 MAX. NUMBER OF CHARACTERS TO COMPARE * CP1 LDAX D GET THE CHARACTER CMP M RNZ DCR C DECREMENT CHARACTER COUNT RZ INX H INX D JMP CP1 * TABLE EQU $ NAMELNTH EQU 10 NUMBER OF CHARACTERS+2 * ASC 'ASSM DB 0,0,0,0 DW ASSM-DATORG * ASC 'BLDUTIL DB 0 DW BLDUTIL-DATORG * ASC 'BOOTLOAD DW BOOTLOAD-DATORG * ASC 'CLOSE DB 0,0,0 DW CLOSE-DATORG * ASC 'CONFIGR DB 0 DW CONFIGR-DATORG * ASC 'COPY DB 0,0,0,0 DW COPY-DATORG * ASC 'CREATE DB 0,0 DW CREATE-DATORG * ASC 'DBASIC DB 0,0 DW DBASIC-DATORG * ASC 'DEBUG DB 0,0,0 DW DEBUG-DATORG * ASC 'DCHECK DB 0,0 DW DCHECK-DATORG * ASC 'DISKCOPY DW DISKCOPY-DATORG * ASC 'DO DB 0,0,0,0,0,0 DW DO-DATORG * ASC 'DUMP DB 0,0,0,0 DW DUMP-DATORG * ASC 'EDIT DB 0,0,0,0 DW EDIT-DATORG * ASC 'EDT3 DB 0,0,0,0 DW EDT3-DATORG * ASC 'ENDF DB 0,0,0,0 DW ENDF-DATORG * ASC 'EXEC DB 0,0,0,0 DW EXEC-DATORG * ASC 'EXTRACT DB 0 DW EXTRACT-DATORG * ASC 'FILES DB 0,0,0 DW FILES-DATORG * ASC 'FOCAL DB 0,0,0 DW FOCAL-DATORG * ASC 'FREE? DB 0,0,0 DW FREE-DATORG * ASC 'GET DB 0,0,0,0,0 DW GET-DATORG * ASC 'HELP DB 0,0,0,0 DW HELP-DATORG * ASC 'IMAGE DB 0,0,0 DW IMAGE-DATORG * ASC 'KILL DB 0,0,0,0 DW KILL-DATORG * ASC 'OPEN DB 0,0,0,0 DW OPEN-DATORG * ASC 'OPEN? DB 0,0,0 DW OPEN0-DATORG * ASC 'OUT DB 0,0,0,0,0 DW OUT-DATORG * ASC 'PRINT DB 0,0,0 DW PRINT-DATORG * ASC 'RANDOM DB 0,0 DW RANDOM-DATORG * ASC 'READ DB 0,0,0,0 DW READ-DATORG * ASC 'REATR DB 0,0,0 DW REATR-DATORG * ASC 'RECOVER DB 0 DW RECOVER-DATORG * ASC 'RENAME DB 0,0 DW RENAME-DATORG * ASC 'RETYPE DB 0,0 DW RETYPE-DATORG * ASC 'RNUM DB 0,0,0,0 DW RNUM-DATORG * ASC 'SAVE DB 0,0,0,0 DW SAVE-DATORG * ASC 'SEEK DB 0,0,0,0 DW SEEK-DATORG * ASC 'SET DB 0,0,0,0,0 DW SET-DATORG * ASC 'SETIN DB 0,0,0 DW SETIN-DATORG * ASC 'SETOUT DB 0,0 DW SETOUT-DATORG * ASC 'SPACE DB 0,0,0 DW SPACE-DATORG * ASC 'SYST DB 0,0,0,0 DW SYST-DATORG * ASC 'TREK80 DB 0,0 DW TREK80-DATORG * ASC 'WRITE DB 0,0,0 DW WRITE-DATORG * ASC 'XREF DB 0,0,0,0 DW XREF-DATORG * ASC 'ZIP DB 0,0,0,0,0 DW ZIP-DATORG * ASC '$CREATE DB 0 DW CCREATE-DATORG * ASC '$ESC DB 0,0,0,0 DW ESC-DATORG * ASC '$LST DB 0,0,0,0 DW LST-DATORG * ASC '$NLST DB 0,0,0 DW NLST-DATORG * ASC '$PR DB 0,0,0,0,0 DW PR-DATORG * ASC '$REM DB 0,0,0,0 DW REM-DATORG * ASC '$STOP DB 0,0,0 DW STOP-DATORG * ASC '$WAIT DB 0,0,0 DW WAIT-DATORG * TBLEND EQU $ * NUMNAME EQU TBLEND-TABLE/NAMELNTH NUMBER OF NAMES IN TABLE * HNAME ASC 'help:d DB 0 * CRTC ASC 'Hit carriage return to continue...' DB 0 * NOTFOUND DW CRLF DB '''' * NBUFF DS NAMELENGTH-1 THE NAME TO FIND GOES HERE * NOTFN ASC "' not found." CR DW CRLF * LASTCHAR DB 0 LAST CHARACTER RECEIVED FROM PSCAN LINCNT DB 0 LINE COUNT BUFFER CIOF DB 0 CI OUTPUT FILE NUMBER FNUM DB 0 FILE NUMBER OF DATA FILE *LST * last address of program DS 40 *NLST * STACK EQU $ INBUF EQU $ * COPY HELP.ASC/1 GET TEXT DATA FILE * END *