;* Updated on 08-Nov-89 at 7:32 PM by Ami Bar-Yadin; edit time: 3:17:51 *; ; Wild Card TYPE, plus extras ; (c) 1986,1987,1988 By Ami Bar-Yadin AMUS ID: AMI/AM ; ; (** main type loop is at "*main type loop*" **) VMAJOR=1 VMINOR=2 VEDIT=113. ; ;-All commercial rights reserved, etc. ;-No warranties and/or guarranties of any kind, etc. ;-Not responsible for damages resulting from the use of this program, etc. ;-My employer (United Fashions) has nothing to do with this program and ; should not be blamed for it. ; ; I can be reached at: ; United Fashions of Texas, Inc. ; 200 Ash Ave. ; McAllen, TX 78501 ; (512) 631-2277/2276 ; 8am-6pm ; ; Switches: ;(def) NOD-opr NODELETE, don't allow output file to be overwritten ; D-opr DELETE, allow file to be overwritten ; S-fil Include size of file (in blocks) in output ; L-fil Include 1st line of file (if sequential). Cancels /T and /X ; (Stop at 1st control character, other than TAB) ; L:n-fil Include 1st n lines of file ; (for file output, line max len=512, to prevent making full ; copies of binary files) ;(def) T-fil Type Entire file. Cancels /L and /X. Inoperative if output ; is going into a file. ; X-fil Look for XCALL names in .RUN files. Cancels /L and /T ; G-opr Count blocks and number of files. Cancels all other switches. ; ;....... ; Modifications history (in reverse order): ; ; [113] 08-Nov-89 Ami Bar-Yadin ; For AM65/62A compatibility output a space at the start of the ; top status line message ; Also use TCRT -1,128 instead of -1,63 ; Attempt to be all for all: ; Output 80 spaces;TCRT -1,2;TCRT -1,9 ; ; [112] 03-Nov-89 Ami Bar-Yadin ; Support for Am65: ; Use TRMCHR to get nubmer of lines on screen to support 42-lines mode ; Also accept DEL as a restart file key like backspace ; ; [111] 10-Sep-89 /ABY ; Changed SAVE/REST at ENTRY7 to all regs (A0-A6,D0-D78) ; ; [110] 13-May-89 /aby ; In LINE mode (/L) ; lines which start with "!*" or ";*" are skipped. ; It is assumed that they are d/VUE update entries. ; [109] 04-Apr-89 /aby ; In TYPE mode (/T) ; At end of file return to TYPE's main prompt ; (only leave file when user says so) ; During output ^D toggles output mode ; a) Default DUMP output, all chars are filtered ; b) alternate COPY output, chars are not filtered ; page pause can only count linefeeds ; however, will also pause before a ^L ; ; [106-108] Updates 3/21/89 aby ; ; o Will now read random files too. ; o Added :n option to /L. Display, or output, 1st n lines of file. ; o /T options added: L and H -- One-line page, and Half page ; H from the 1st /T prompt sets full page mode, ; and sets half a page for the first page. ; H while display is paused will set half-page mode ; L is like H but uses 1 one line pages (pause after each line) ; o added size of file in bytes to /T 1st (file name) prompt. ; o Added filtering to /L and /T (can list .LITs and task.LOGs safely!) ; if hi bit is on display in low intensity (high bit is cleared) ; control characters other than CR,LF,and TAB displayed as ^x ; tabs are expanded to spaces every 8 columns. ; o A line for /T or /L assumes the max width of the display terminal ; uses TRMCHR AMOS call to get width; updated EVERY page in paging mode; ; uses 510 if /L is outputing to a file to avoid problems with .LITs; ; assumes terminal auto-wraps by itself; ; know bug: extra cr if line is exactly width, i'll work on it Real Soon Now ; SYM SEARCH SYS SEARCH SYSSYM SEARCH TRM RADIX 16. DEFAULT VEDIT,1 DEFAULT $$MFLG,PV$RSM!PV$WSM DEFAULT $$SFLG,PH$REE!PH$REU DEFAULT $$SFLG,0 DEFAULT $$LFLG,-1 PHDR $$LFLG,$$MFLG,$$SFLG ; ; DELAY FACTOR FACTOR = 400. ; ASCII CHARS NULL = 0 BKSPC = 8. TAB = 9. LF = 10. CR = 13. ESC = 27. SPACE = 32. DEL = 127. ; macros ; DEFINE OUTA2 ADR LEA A2,OUTDDB(A5) MOV OUTFIL(A5),D6 OUTL ADR ENDM ; DEFINE SWENT NAME,ADDR WORD 1$$-. WORD ADDR-. ASCII NAME BYTE 0 EVEN 1$$: ENDM DEFINE OUTCHR CHR IF NB,CHR, MOVB CHR,D1 TTY ENDM DEFINE XTABF X IF DF,SAVD1, PUSH D1 MOVW #<-1_8>+X,D1 TCRT IF DF,SAVD1, POP D1 ENDM DEFINE SW$ON SWITCH= MOVB #-1,SWITCH(A5) DEFINE SW$OFF SWITCH= CLRB SWITCH(A5) DEFINE SW$TST SWITCH= TSTB SWITCH(A5) DEFINE CR= OUTCHR #CR ; ; Impure area layout ; DSECT ; SCNWLD interface block SCNWLD: BLKB 0380 SCNWL1 = 0 ; SCNWLD vectors - set by calling SCNWLD at SCNWL2 = 4 ; its load address (+0A to skip header) SCNWL3 = 8 ; with A5->SCNWL1 IM000C = 0C ; local vectors IM0010 = 010 IM0014 = 014 IM0018 = 018 IM001C = 01C IM0020 = 020 IM0024 = 024 IM0028 = 028 IM002C = 02C DDB1 = 030 ; DDB #1 IM00A2 = 0A2 ; Disk I/O buffer (?) IM02A2 = 02A2 IM02A4 = 02A4 IM02AA = 02AA IM02AE = 02AE IM02B2 = 02B2 IM02B6 = 02B6 IM02BA = 02BA IM02C4 = 02C4 IM02E8 = 02E8 IM02F0 = 02F0 ; DDB #2 IM0358 = 0358 IM035C = 035C IM0360 = 0360 IM0364 = 0364 IM0366 = 0366 ; LAST POINT REFERENCED BY SCNWLD.SYS ; END OF SCNWLD INTERFACE BLOCK ; OUTDDB: BLKB D.DDB OUTFIL: BLKL 1 PGLNS: BLKL 1 ; LINE PER PAGE FOR TYPE PAUSE MODE TRMDEF: BLKL 1 ; POINTER TO TRMDEF SPEED: BLKL 1 COUNT: BLKL 1 COLUMN: BLKW 1 MAXCOL: BLKW 1 MAXLIN: BLKW 1 BLOCKS: BLKL 1 FBLKS: BLKL 1 FBYTES: BLKL 1 ASCBUF: BLKB 512. SPDCHR: BLKB 1 LASTCH: BLKB 1 SW$DEL: BLKB 1 DF$SIZ: BLKB 1 SW$SIZ: BLKB 1 DF$LIN: BLKB 1 SW$LIN: BLKB 1 DF$TYP: BLKB 1 SW$TYP: BLKB 1 DF$XCA: BLKB 1 SW$XCA: BLKB 1 SW$GRN: BLKB 1 IMPSIZ: PSECT ;------------------------ ; LIST: CALL SETUP MOV SCNWL1(A5),A6 CALL @A6 EXIT: XTABF 128. XTABF 129. SW$TST SW$GRN BEQ 1$ OUTA2 $COUNT MOV COUNT(A5),D1 CALL ASCNUM OUTA2 $BLOCK MOV BLOCKS(A5),D1 CALL ASCNUM OUTA2 CR$ 1$: CMP OUTFIL(A5),#OT$DDB BNE 2$ CLOSE OUTDDB(A5) 2$: CRLF EXIT SWTBL: SWENT 'NODELETE',$NODEL SWENT 'DELETE',$DELET SWENT 'SIZE',$SIZE SWENT 'NOSIZE',$NOSIZ SWENT 'LINE',$LINE SWENT 'NOLIN',$NOLIN SWENT 'TYPE',$TYPE SWENT 'NOTYPE',$NOTYP SWENT 'XCALL',$XCALL SWENT 'NOXCALL',$NOXCA SWENT 'GRAND',$GRAND WORD 0 ; $DELET: SW$ON SW$DEL RTN $NODEL: SW$OFF SW$DEL RTN $SIZE: SW$ON SW$SIZ TSTW IM0358(A5) BEQ 1$ SW$ON DF$SIZ 1$: RTN $NOSIZ: SW$OFF SW$SIZ TSTW IM0358(A5) BEQ 1$ SW$OFF DF$SIZ 1$: RTN $XCALL: SW$ON SW$XCA SW$OFF SW$TYP SW$OFF SW$LIN TSTW IM0358(A5) BEQ 1$ SW$ON DF$XCA SW$OFF DF$TYP SW$OFF DF$LIN 1$: RTN $NOXCA: SW$OFF SW$XCA TSTW IM0358(A5) BEQ 1$ SW$OFF DF$XCA 1$: RTN $LINE: CMPB @A2,#': BNE 40$ INC A2 PUSH D1 GTDEC MOVW D1,MAXLIN(A5) POP D1 40$: SW$ON SW$LIN SW$OFF SW$TYP SW$OFF SW$XCA TSTW IM0358(A5) BEQ 50$ MOVW #1,MAXLIN(A5) SW$ON DF$LIN SW$OFF DF$TYP SW$OFF DF$XCA 50$: RTN $NOLIN: SW$OFF SW$LIN TSTW IM0358(A5) BEQ 1$ SW$OFF DF$LIN 1$: RTN $TYPE: SW$ON SW$TYP SW$OFF SW$LIN SW$OFF SW$XCA TSTW IM0358(A5) BEQ 1$ SW$ON DF$TYP SW$OFF DF$LIN SW$OFF DF$XCA 1$: RTN $NOTYP: SW$OFF SW$TYP TSTW IM0358(A5) BEQ 1$ SW$OFF DF$TYP 1$: RTN $GRAND: SW$ON SW$GRN SW$OFF SW$LIN SW$OFF SW$SIZ SW$OFF SW$TYP SW$OFF SW$XCA TSTW IM0358(A5) BEQ 1$ SW$OFF DF$TYP SW$OFF DF$LIN SW$OFF DF$SIZ SW$OFF DF$XCA 1$: RTN ; ; ENTRY1: MOV #OT$TRM,OUTFIL(A5) SW$OFF SW$DEL SW$OFF DF$SIZ SW$OFF SW$SIZ SW$OFF DF$LIN SW$OFF SW$LIN SW$ON DF$TYP SW$ON SW$TYP SW$OFF DF$XCA SW$OFF SW$XCA MOVW #[TRM],OUTDDB+D.DEV(A5) CLR OUTDDB+D.FIL(A5) RTN ENTRY2: CMP IM035C(A5),#1 BNE 1$ SW$OFF DF$SIZ SW$OFF DF$LIN SW$ON DF$TYP SW$OFF DF$XCA 1$: JOBIDX MOVW JOBDEV(A6),IM02A2(A5) MOVW JOBDRV(A6),IM02A4(A5) MOVW #-1,IM0364(A5) MOVW JOBUSR(A6),IM0366(A5) RTN ENTRY3: CMP IM0360(A5),#1 BEQ 1$ TYPECR EXIT 1$: SAVE D0,A1,A2 LEA A1,IM02A2(A5) LEA A2,IM02C4(A5) MOV #7,D0 2$: MOV (A1)+,(A2)+ DEC D0 BNE 2$ MOVW #[WLD],DDB1+D.FIL(A5) MOVW #[CRD],DDB1+D.FIL+2(A5) MOVW #[LST],DDB1+D.EXT(A5) MOV SCNWL3(A5),A6 CALL @A6 MOVW DDB1+D.DEV(A5),OUTDDB+D.DEV(A5) MOVW DDB1+D.DRV(A5),OUTDDB+D.DRV(A5) MOVW DDB1+D.FIL(A5),OUTDDB+D.FIL(A5) MOVW DDB1+D.FIL+2(A5),OUTDDB+D.FIL+2(A5) MOVW DDB1+D.EXT(A5),OUTDDB+D.EXT(A5) MOVW DDB1+D.PPN(A5),OUTDDB+D.PPN(A5) INIT OUTDDB(A5) CMPW OUTDDB+D.DEV(A5),#[TRM] BNE 10$ TST OUTDDB+D.FIL(A5) BEQ 20$ 10$: INIT OUTDDB(A5) SW$TST SW$DEL BEQ 11$ MOVW #0300,D7 ORW D7,OUTDDB(A5) DSKDEL OUTDDB(A5) MOVW #0FCFF,D7 ANDW D7,OUTDDB(A5) 11$: OPENO OUTDDB(A5) TYPE PFILE OUTDDB(A5) CRLF MOV #OT$DDB,OUTFIL(A5) 20$: REST A2,A1,D0 RTN ENTRY4: MOV SCNWL2(A5),A6 ; PROCESS FILE SPEC JMP @A6 ; EXPANDING * AND ? IF ANY ENTRY5: MOVB DF$SIZ(A5),SW$SIZ(A5) MOVB DF$LIN(A5),SW$LIN(A5) MOVB DF$TYP(A5),SW$TYP(A5) MOVB DF$XCA(A5),SW$XCA(A5) CLR IM02AA(A5) CLR IM02AE(A5) CLR IM02B2(A5) CLR IM02B6(A5) CLR IM02BA(A5) RTN ENTRY7: SAVE A0-A6,D0-D7 SW$TST SW$GRN JNE 50$ SW$TST SW$LIN BEQ 5$ MOV #10.,D1 BR 6$ 5$: MOV #25.,D1 6$: CALL ASCFIL OUTA2 ASCBUF(A5) SW$TST SW$SIZ BEQ 10$ MOV IM02E8(A5),D1 CALL ASCNMJ 10$: CMP OUTFIL(A5),#OT$DDB BEQ 20$ SW$TST SW$TYP BEQ 20$ CALL TYPE 20$: SW$TST SW$LIN BEQ 30$ CALL LINE 30$: SW$TST SW$XCA BEQ 40$ CALL XCALL 40$: OUTA2 CR$ 41$: REST A0-A6,D0-D7 RTN 50$: CLR D1 ; CALL ASCFIL ; TTYL ASCBUF(A5) ; CRLF INC COUNT(A5) MOV BLOCKS(A5),D1 ADD IM02E8(A5),D1 MOV D1,BLOCKS(A5) BR 41$ ; ASCII MESSAGES CR$: BYTE 0D,0 TAB$: BYTE 9,0 $COUNT: ASCIZ /FILES: / $BLOCK: ASCIZ / BLOCKS: / EVEN ; ; UNPACK NUMBER IN D1 TO ASCII AT A2 ASCNUM: SAVE A0,D1,A2 LEA A2,ASCBUF(A5) DCVT 0,OT$MEM CLRB @A2 OUTA2 ASCBUF(A5) REST A0,D1,A2 RTN ; ; UNPACK NUMBER IN D1 TO ASCII AT A2, RIGHT JUSTIFIED IN 5 DIGITS ASCNMJ: SAVE A0,D1,A2 LEA A2,ASCBUF(A5) DCVT 5,OT$MEM+OT$ZER CLRB @A2 OUTA2 ASCBUF(A5) REST A0,D1,A2 RTN ; ; UNPACK DEV(DDB1) TO ASCII AT A2 ASCDEV: SAVE D1,A0,A1 SW$TST SW$LIN BEQ 1$ JOBIDX A0 MOVW D.DEV+DDB1(A5),D1 CMPW D1,JOBDEV(A0) BNE 1$ MOVW D.DRV+DDB1(A5),D1 CMPW D1,JOBDRV(A0) BEQ 99$ 1$: LEA A1,DDB1+D.DEV(A5) UNPACK CLR D1 MOVW DDB1+D.DRV(A5),D1 CMPW D1,#-1 BEQ 3$ DCVT 0,OT$MEM 3$: MOVB #':,(A2)+ 99$: REST D1,A0,A1 RTN ; ; UNPACK PPN(DDB1) TO ASCII AT A2 ASCPPN: SAVE D1,A0 JOBIDX A0 SW$TST SW$LIN BEQ 1$ MOVW D.PPN+DDB1(A5),D1 CMPW D1,JOBUSR(A0) BEQ 99$ 1$: CLR D1 MOVW DDB1+D.PPN(A5),D1 BEQ 99$ PUSHW JOBTYP(A0) MOVW #^CJ.HEX,D7 ANDW D7,JOBTYP(A0) MOVB #'[,(A2)+ PUSHW D1 LSRW D1,#8 OCVT 0,OT$MEM MOVB #',,(A2)+ POPW D1 AND #0FF,D1 OCVT 0,OT$MEM MOVB #'],(A2)+ POPW JOBTYP(A0) 99$: REST A0,D1 RTN ; ; UNPACK FIL(DDB1) TO ASCII AT A2 ASCNAM: SAVE D1,A0,A1 LEA A1,DDB1+D.FIL(A5) UNPACK UNPACK 1$: CMPB -(A2),#020 BEQ 1$ INC A2 MOVB #'.,(A2)+ TSTW @A1 BEQ 3$ UNPACK 2$: CMPB -(A2),#020 BEQ 2$ INC A2 3$: REST D1,A0,A1 RTN ; ; UNPACK ENTIRE FILE SPEC OF DDB1 TO ASCBUF ; D1=0 NO PADDING ; D1>0 TOTAL CHAR COUNT FOR PADDING ON RIGHT WITH BLANKS ASCFIL: SAVE D1,D2 LEA A2,ASCBUF(A5) MOV A2,D2 ; D1=FINAL ADDRESS NEEDED CALL ASCDEV CALL ASCNAM CALL ASCPPN TST D1 BEQ 2$ NEG D2 ADD A2,D2 ; D2=NO OF CHARS DONE SUB D2,D1 ; D1=NO OF CHARS TO PAD WITH DEC D1 BMI 2$ 1$: MOVB #SPACE,(A2)+ DBF D1,1$ 2$: CLRB @A2 REST D1,D2 RTN ; TYPE: SAVE D0-D7,A0-A6 JOBIDX MOV JOBTRM(A6),A6 TRMRST D1,@A6 PUSH D1 ORW #T$IMI!T$ECS,D1 ; SET TERMINAL IN IMAGE MODE ; AND SET ECHO SUPPRESS TRMWST D1,@A6 TYPE2: ; RESTART ENTRY POINT CLR D3 CLR D4 LOOKUP DDB1(A5) CALL FILSIZ MOV D6,D1 DCVT 8.,OT$TRM!OT$TSP!OT$ZER TYPE OUTCHR SPDCHR(A5) OUTCHR #'/ OUTCHR LASTCH(A5) TYPE <)]?> TYPE3: TIN CTRLC EXIT CMPB D1,#ESC JEQ EXIT CMPB D1,#CR BNE 11$ MOVB LASTCH(A5),D1 11$: UCS CALL SETSPD BEQ 0$ CMPB D1,#SPACE JEQ 6$ CMPB D1,#'N JEQ 6$ CMPB D1,#'H BNE 12$ MOV PGLNS(A5),D4 ; SET PAGE PAUSE MODE MOV D4,D3 ASR D3,#1 BR 0$ 12$: CMPB D1,#'P BNE 13$ MOV PGLNS(A5),D4 ; SET PAGE PAUSE MODE MOV D4,D3 ; use half for 1st page BR 0$ 13$: CMPB D1,#'L BNE TYPE3 ; ACCEPT ONLY VALID CHARACTERS MOV PGLNS(A5),D4 ; SET PAGE PAUSE MODE MOV #1,D3 ; use line only for 1st page 0$: TTY ; ECHO CHAR MOVB D1,LASTCH(A5) CRLF CALL OPNFIL CLR D0 CALL GTRMCH ; XTABF 63. XTABF 128. ; [113] TYPE < Listing > ; [113] CLR D1 CALL ASCFIL OUTA2 ASCBUF(A5) CLR D1 MOVW MAXCOL(A5),D1 DCVT 0,OT$TRM!OT$LSP MOV #8.,D2 52$: TYPE < > DBF D2,52$ XTABF 129. XTABF 2. XTABF 9. ; ; *MAIN TYPE LOOP* WITH PAGE PAUSE ; 1$: CALL GTBYTE JMI 2$ CALL DMPBYT ; OUTPUT CHRACTER MOVW MAXCOL(A5),D7 CMPW D7,COLUMN(A5) ; (assume output device auto-wraps at its MAXCOL) BLOS 72$ ; if right screen edge reached or passed CMPB D1,#LF BNE 1$ ; NOT LINE FEED CLRW COLUMN(A5) BR 73$ 72$: SUBW D7,COLUMN(A5) 73$: CLR D1 TCKI ; NON PAGE MODE, CHECK FOR KEY PAUSE BNE 74$ ; NO INPUT IS WAITING TIN ; GET CHAR CTRLC 4$ ; ABORT FILE IF ^C 74$: TSTB D1 ; got a character? BNE 10$ TST D4 BNE 20$ ; PAGE MODE MOV SPEED(A5),D6 ; SLOW MODE BEQ 1$ SLEEP BR 1$ 10$: CALL 80$ BR 21$ 20$: AND #0FF,D3 DEC D3 ; limit of 255 lines per page JGT 1$ ; NOT END OF PAGE 21$: MOV D4,D3 ; RESET PAGE LINE COUNTER TIN ; PAGE PAUSE, GET CHAR CTRLC 4$ ; ABORT FILE IF ^C CALL GTRMCH CALL 80$ JMP 1$ 2$: CRLF TYPECR BR 41$ 5$: CRLF TYPECR BR 41$ 4$: CRLF TYPECR 41$: JOBIDX A0 ANDW #^CJ.CCC,JOBSTS(A0) ; RESET ^C PENDING FLAG CLOSE DDB1(A5) XTABF 128. XTABF 129. CLR D1 CALL ASCFIL OUTA2 ASCBUF(A5) TAB JMP TYPE2 6$: OUTCHR #'N 3$: CRLF TSTB D.OPN+DDB1(A5) BEQ 31$ CLOSE DDB1(A5) 31$: JOBIDX MOV JOBTRM(A6),A6 POP D1 TRMWST D1,@A6 REST D0-D7,A0-A6 RTN 80$: CMPB D1,#ESC ; ABORT FILE IF ESC BEQ 94$ CMPB D1,#BKSPC BEQ 95$ CMPB D1,#DEL ;[112] BEQ 95$ UCS CMPB D1,#'H ; Half page mode BEQ 86$ CMPB D1,#'L ; line mode BEQ 85$ CALL SETSPD CMPB D1,#'P BNE 84$ 83$: MOV PGLNS(A5),D4 ; SET PAGE PAUSE MODE 84$: MOV D4,D3 ; RESET PAGE LINE COUNT RTN 85$: MOV #1,D4 BR 84$ 86$: MOV PGLNS(A5),D4 ; SET HALF PAGE PAUSE MODE ASR D4,#1 ; half page to go BR 84$ 94$: POP ; get rid of return address JMP 4$ ; exit 95$: POP JMP 5$ GTRMCH: SAVE A2 LEA A2,ASCBUF(A5) TRMCHR @A2,0 MOVW TC.COL(A2),MAXCOL(A5) ; get number of columns ;[1 2] also get number of rows CLR D6 MOVW TC.ROW(A2),D6 SUB #2.,D6 ; 1 line for pause, 1 for overlap MOV D6,PGLNS(A5) REST A2 RTN DMPBYT: ANDB #^H0FF,D1 TSTB D1 BEQ 20$ ; output "." for NULLS BPL 3$ PUSHB D1 XTABF 11. POPB D1 AND #^H07F,D1 BSET #15.,D1 ; set high word bit as flag BR 4$ 3$: CMPB D1,#CR BEQ 5$ ; ignore CR CMPB D1,#LF BEQ 50$ ; output CR/LF CMPB D1,#TAB BEQ 30$ ; output spaces to next (8) tab 4$: CMPB D1,#SPACE BLO 10$ ; output ^x CMPB D1,#DEL BHIS 20$ ; output "." for DEL and above OUTCHR INCW COLUMN(A5) 5$: TSTW D1 BPL 6$ XTABF 12. 6$: RTN 10$: PUSH D1 OUTCHR #'^ INCW COLUMN(A5) POP D1 ADDB #'@,D1 OUTCHR INCW COLUMN(A5) BR 5$ 20$: OUTCHR #'. INCW COLUMN(A5) BR 5$ 30$: OUTCHR #SPACE INCW COLUMN(A5) MOVW COLUMN(A5),D7 ANDW #7,D7 BNE 30$ BR 5$ 50$: CRLF MOVB #LF,D1 BR 5$ ; If char in D1 is '0..'9 ; set speed for non page mode; ; clear D1; ; clear page mode (D4) ; else do nothing SETSPD: AND #^H07F,D1 CMPB D1,#'0 BLO 1$ CMPB D1,#'9 BHI 1$ MOVB D1,SPDCHR(A5) SUBB #'0,D1 MUL D1,#FACTOR MOV D1,SPEED(A5) CLR D1 CLR D4 1$: RTN XCALL: SAVE D1-D3 OPENI DDB1(A5) OUTA2 CR$ 0$: FILINW DDB1(A5) MOVW D1,D3 FILINW DDB1(A5) MOVW D1,D2 1$: CTRLC EXIT FILINW DDB1(A5) TST DDB1+D.SIZ(A5) BEQ 2$ ; EXIT IF EOF CMPW D1,#[SBR] ; .SBR? BEQ 3$ MOVW D2,D3 MOVW D1,D2 BR 1$ ; LOOP UNTIL EOF 2$: REST D1-D3 CLOSE DDB1(A5) RTN 3$: LEA A1,ASCBUF+10(A5) PUSH A1 MOVW D3,(A1)+ MOVW D2,@A1 POP A1 LEA A2,ASCBUF(A5) MOVB #9,(A2)+ UNPACK UNPACK MOVB #0D,(A2)+ CLRB @A2 OUTA2 ASCBUF(A5) BR 0$ OPNFIL: CLR D0 ; init for GTBYTE routine LOOKUP DDB1(A5) MOV D.WRK+DDB1(A5),FBLKS(A5) MOV D.WRK+4+DDB1(A5),FBYTES(A5) CMP FBYTES(A5),#^H0FFFF BEQ 10$ OPENI DDB1(A5) RTN 10$: OPENR DDB1(A5) CLR D.REC+DDB1(A5) RTN GTBYTE: 0$: TST D0 ; more chars in buffer? BLE 10$ ; no DEC D0 MOVB (A3)+,D1 AND #0FF,D1 ; the old sign extend eliminator RTN 10$: TST FBLKS(A5) ; get next block (or first) BEQ 30$ ; no more blocks. EOF. DEC FBLKS(A5) INPUT DDB1(A5) CMPB D.OPN+DDB1(A5),#D$OPNR BNE 20$ ; seq INC D.REC+DDB1(A5) ; inc rec# for random 20$: MOV D.SIZ+DDB1(A5),D0 MOV D.BUF+DDB1(A5),A3 ; get buffer addres MOV D.IDX+DDB1(A5),D6 ; adjust to skip seq link ADD D6,A3 SUB D6,D0 BR 0$ 30$: MOV #-1,D1 RTN LINE: SAVE D0-D7,A0-A6 LINE2: CALL OPNFIL CMP OUTFIL(A5),#OT$DDB BEQ 20$ CALL GTRMCH BR 21$ 20$: MOVW #500.,MAXCOL(A5) 21$: CLR D4 MOVW MAXLIN(A5),D4 DEC D4 BNE 22$ OUTA2 TAB$ BR 23$ 22$: OUTA2 CR$ 23$: 0$: CLR D5 MOVW MAXCOL(A5),D5 DEC D5 LEA A2,ASCBUF(A5) CLRB @A2 1$: CALL GTBYTE BPL 11$ CLR D4 ; EXIT IF EOF BR 3$ 11$: CMPB D1,#CR ; CR is line-term BEQ 3$ CMPB D1,#LF ; ignore LF BEQ 1$ CALL LINBYT DBF D5,1$ 3$: CLRB @A2 LEA A2,ASCBUF(A5) CMPB @A2,#'! ; comment? BEQ 32$ CMPB @A2,#'; ; comment? BNE 33$ 32$: CMPB 1(A2),#'* ; update entry? BEQ 0$ ; yes, skip line 33$: OUTA2 ASCBUF(A5) TST D4 BEQ 35$ OUTA2 CR$ 35$: DBF D4,0$ CMPW MAXLIN(A5),#1 BLE 4$ OUTA2 CR$ 4$: CLOSE DDB1(A5) REST D0-D7,A0-A6 RTN LINBYT: TSTB D1 BEQ 2$ ; output "." for NULLS CMPB D1,#TAB BEQ 0$ ; output as is CMPB D1,#SPACE BLO 1$ ; output ^x CMPB D1,#DEL BHIS 2$ ; output "." for DEL and above 0$: MOVB D1,(A2)+ ; output as is RTN 1$: MOVB #'^,(A2)+ ADDB #'@,D1 BR 0$ 2$: MOVB #'.,(A2)+ RTN ; ; SETUP: GETIMP IMPSIZ,A5 CLRL COUNT(A5) CLRL BLOCKS(A5) MOVB #'3,SPDCHR(A5) MOVB #'3,LASTCH(A5) MOV #3*FACTOR,SPEED(A5) MOVW #1,MAXLIN(A5) ; COMPUTE NUMBER OF LINES/PAGE FOR TYPE'S PAGE PAUSE MODE MOV #22.,D1 JOBIDX A0 MOV JOBCUR,A0 MOV JOBTRM(A0),A0 ; SET # OF LINES PER PAGE MOV A0,TRMDEF(A5) CALL GTRMCH ; [112] ;[112] MOV T.TDV(A0),A0 ; MOV #0400,D7 ; ANDW @A6,D7 ; TEST BIT IN JOB'S TERMINAL DRIVER ; BEQ 1$ ; IF BIT=0 USE DEFAULT OF 24 LINES ; MOVB 0E(A6),D1 ; NUMBER OF LINES ON SCREEN ; SUB #2.,D1 ;1$: MOV D1,PGLNS(A5) ; LOCATE SCNWLD.SYS MOVW #[DSK],DDB1+D.DEV(A5) CLRW DDB1+D.DRV(A5) MOVW #[SCN],DDB1+D.FIL(A5) MOVW #[WLD],DDB1+D.FIL+2(A5) MOVW #[SYS],DDB1+D.EXT(A5) MOVW #0104,DDB1+D.PPN(A5) ; [1,4] INIT DDB1(A5) PUSH DDB1+D.BUF(A5) FETCH DDB1(A5),A0,0 BEQ 2$ TYPECR EXIT 2$: POP DDB1+D.BUF(A5) MOV #0200,DDB1+D.SIZ(A5) ADD #0A,A0 CALL @A0 LEA A1,ENTRY1 MOV A1,0C(A5) LEA A1,ENTRY2 MOV A1,010(A5) LEA A1,ENTRY3 ; OUT FILE SPEC MOV A1,014(A5) LEA A1,ENTRY4 ; END OF 1ST SCAN? MOV A1,018(A5) LEA A1,ENTRY5 ; FILE=DEFAULT SWITCHES MOV A1,01C(A5) LEA A1,ENTRY6 MOV A1,020(A5) LEA A1,ENTRY7 MOV A1,024(A5) ; PROCESS EXPANDED FILE LEA A1,ENTRY8 MOV A1,028(A5) LEA A1,SWTBL MOV A1,02C(A5) RTN ; ENTRY6: ENTRY8: RTN ;======= ; Compute length, in bytes, of file in DDB1(A5) (after a LOOKUP) ; Returns file size in D6 ; ; lifted out of AMOS/L 1.3D SYS:SIZE.LIT 452-067-631-543 1.0(100) ; hope you guys won't squeal ; modified to only scramble D6 and D7, and A0 ; and changed the #514. to D.SIZ(A0) just before 40$ FILSIZ: LEA A0,DDB1(A5) CLR D6 MOV D.FSZ(A0),D7 DEC D7 BEQ 30$ 10$: ADD D.SIZ(A0),D6 ; add a block (in bytes) to D6 TSTW D.LSZ+2(A0) ; if this is a seq BMI 20$ SUB #2,D6 ; don't count the link word 20$: DEC D7 ; blocks go.. BNE 10$ ; ..another block 30$: TSTW D.LSZ+2(A0) ; BPL 40$ ADD D.SIZ(A0),D6 ; last block is full RTN ; hey! will this work? hmm? 40$: ADD D.LSZ(A0),D6 ; count bytes in last block SUB #2,D6 ; don't count link word RTN ; ; END .