.LIST ON .CONDLIST OFF .TITLE 'Display ASCII file on console, with screen print' ;1.4.84 ;USAGE: INSPECT DISKFIL.EXT ;COMMANDS: ; 'V' DISPLAYS NEXT PAGE (24 LINES) ; 'Z' DISPLAYS LAST PAGE ; ' ' SCROLLS ONE LINE DOWN ; '.' SKIPS 100 LINES FORWARD ; ',' SKIPS 100 LINES BACK ; '<' JUMPS TO FIRST PAGE ; '>' JUMPS TO LAST PAGE ; 'S' SEARCHES FOR A STRING ; 'C' CONTINUES THE SEARCH ; 'P' LISTS CURRENT PAGE TO PRINTER ; 'N' GETS ANOTHER FILE ; 'M' GETS MORE OF PRESENT FILE ; 'Q' QUITS WITH WARM BOOT ; ;THIS PROGRAM LOADS THE ENTIRE FILE INTO MEMORY, ;IF IT WILL NOT FIT THEN IT IS TRUNCATED. SIZE ;LIMIT IS ABOUT 55K FOR A 64K SYSTEM. LARGER ;FILES CAN BE INSPECTED IN SEGMENTS USING M. ; FCB1 .EQUAL 5CH BDOS .EQUAL 5 BOOT .EQUAL 0 TPA .EQUAL 100H DBUFF .EQUAL 80H LMAX .EQUAL 24 INCLUDE ZMACROS.ASM .LIST ON .ORG TPA START: LD A,(FCB1+1) CP BLANK ;FILE NAME JP NZ,OPEND ;YES NEW: GFNAME FCB1 ;GET IT OPEND: COMPRA 'COM',FCB1+9 ;COM FILE? JP Z,NEW ;YES OPEN FCB1,NEW MORE: LD HL,BUFFER ;SET POINTER LD (BUFFP),HL LDFILE FCB1,BUFFP ;GET FILE WEOF: LD HL,(BUFFP) ;GET EOF POINTER LD (HL),EOF ;WRITE EOF MARKER LD HL,BUFFER ;SET HL TO START ; NEXTSC: CALL SCREEN ;NEXT SCREEN FREE2: READCH ;WAIT FOR INPUT UCASE CP 'V' ;NEXT PAGE JP Z,NEXTSC ;GET NEXT SCREEN CP ' ' ;NEXT LINE? JP NZ,NOTL ;NO PCHAR CR LD B,1 ;ONE LINE CALL LINE JP FREE2 NOTL: CRLF CP 'Q' ;QUIT? JP Z,DONE ;YES CP 'Z' ;PREVIOUS PAGE? JP NZ,FREE3 ;NO CALL B2PAGE ;BACK UP TWO JP NEXTSC ;AND DISPLAY FREE3: CP 'S' ;SEARCH? JP Z,SEARCH ;YES CP 'C' ;CONTINUE SEARCH JP NZ,FREE4 ;NO PUSH HL ;YES, SAVE HL JP SSETUP ;REPEAT FROM SETUP FREE4: CP 'M' ;MORE? JP Z,MORE ;YES CP 'N' ;GET NEW FILE? JP Z,NEW ;YES CP '<' ;GO TO BOF JP Z,GBOF ;YES CP '>' ;GO TO EOF JP Z,GEOF ;YES CP '.' ;124 LINES FORWARD JP Z,PLUS CP ',' ;124 LINES BACK JP Z,MINUS CP 'P' ;PRINT SCREEN TO LST JP Z,PSCRN ERRORM 'V,SP,Z,S,C,N,M,<,>,.,,,P or Q ?',FREE2 ; GBOF: LD HL,BUFFER ;BOF JP NEXTSC ;PUT OUT PAGE GEOF: LD HL,(BUFFP) ;EOF GEOF1: CALL BPAGE ;BACK UP PAGE JP NEXTSC ;PUT OUT PAGE ; B2PAGE: CALL BPAGE ;ONE PAGE BACK BPAGE: LD B,LMAX+1 ;25 LINES BACK BPAGF: CALL LIN3 ;BECAUSE WE DEC B :END ON CR JP NZ,BPAGF ;CONT FOR LMAX INC HL ;TO GET OFF CR RET ; PLUS: LD B,100 ;SET COUNT PLUS1: CALL FWRD ;DO LINES UNTIL DEC B ;100, THEN PUT JP NZ,PLUS1 ;OUT PAGE FOR A JP NEXTSC ;TOTAL OF 124 LINES MINUS LD B,148 ;SET COUNT MINUS1: CALL LIN3 ;DO ONE LINE DEC B ;EXTRA 48 LINES JP NZ,MINUS1 ;ALLOW FOR SCREEN JP NEXTSC ;SO, 124 LINES BACK ; PSCRN: CALL BPAGE ;BACK UP LCHAR CR ;CLEAR BUFFER LD B,LMAX ;24 LINES PSCRN1: CALL PLINE ;PRINT A LINE DEC B JP NZ,PSCRN1 LCHAR CR ;PRINT LINE BUFFER LCHAR LF JP FREE2 ; SEARCH: PUSH HL ;SAVE POINTER PCHAR '?' ;PROMPT READB ;GET SEARCH STRING LD A,(RBUFC) ;GET COUNT CP 0 JP Z,SEND ;QUIT IF NO INPUT LD A,(RBUF) ;GET FIRST CHARACTER CP '\' ;CHECK FOR NL CHAR JP NZ,SSETUP ;NO LD A,0AH ;YES, GET NL LD (RBUF),A ;AND REPLACE '\' SSETUP: PUSH HL ;SAVE POINTER PUSH HL ;PUT IT IN BC POP BC ;VIA THE STACK LD HL,(BUFFP) ;GET EOF POINTER IN HL OR A ;CLEAR CARRY SBC HL,BC ;GET BYTE COUNT PUSH HL ;PUT IT IN BC POP BC ;VIA THE STACK POP HL ;GET POINTER IN HL SSRCH: LD A,(RBUF) ;GET FIRST CHARACTER CPIR ;SEARCH FOR IT DEC HL ;MOVE BACK TO INC BC ;FIRST CHARACTER JP PO,NOTFND ;END OF BUFFER LD A,(RBUFC) ;GET COUNT IN A COMPRA ,RBUF,A ;HL HAS FIRST INC HL ;MOVE PAST MATCH DEC BC ;DEC BYTE COUNT JP NZ,SSRCH ;CONTINUE SEARCH INC SP ;DISCARD OLD INC SP ;POINTER, HL LD B,LMAX CALL BPAGF ;BACK UP A PAGE JP NEXTSC ;PUT OUT SCREEN NOTFND: CRLF PCHAR 'N' PCHAR 'o' SEND: POP HL ;RESTORE POINTER JP FREE2 ;BACK FOR INPUT ; SCREEN: LD B,LMAX ;LINE COUNT PCHAR CR NEXTLN: CALL LINE DEC B ;DEC COUNT JP NZ,NEXTLN RET ; LINE: LD A,(HL) AND 7FH ;MASK PARITY CP EOF ;FILE END? JP Z,FREE2 ;YES INC HL LD D,A ;SAVE CP CR ;LINE END? JP NZ,LIN2 ;NO LD A,B ;CHECK POSITION CP 1 ;LAST LINE? RET Z ;YES, SKIP CR LD A,D ;RETRIEVE CHAR LIN2: PCHAR LD A,D ;RESTORE CP CR ;LINE END? JP NZ,LINE ;NO RET LIN3: DEC HL ;BACKUP LD A,(HL) AND 7FH CP 0 ;CHECK FOR BOF JP Z,LIN4 ;YES CP CR ;CHECK FOR CR JP NZ,LIN3 ;NO, KEEP GOING RET LIN4: INC HL ;MOVE TO FIRST RET ;CHAR IN FILE PLINE: LD A,(HL) AND 7FH ;MASK PARITY CP EOF ;FILE END? JP Z,FREE2 ;YES INC HL LCHAR CP CR ;LINE END? JP NZ,PLINE ;NO RET FWRD: LD A,(HL) AND 7FH ;MASK PARITY CP EOF ;FILE END? JP Z,GEOF1 ;YES, DO LAST PAGE INC HL ;NO, MOVE ON CP CR ;LINE END? JP NZ,FWRD ;NO, KEEP GOING RET DONE: JP BOOT BUFFP: .WORD BUFFER ;EOF POINTER .BLKB 1 ;BOF MARKER BUFFER: .BLKB 1 .END START