;* 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  <?More than one output specification>
       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    <OUTPUT FILE=>
       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    <bytes  Type [N\Y\L\P\H\0..9 (>
       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  <End-of-file.>
       BR      41$
5$:     CRLF
       TYPECR  <RESTARTED>
       BR      41$
4$:     CRLF
       TYPECR  <ABORTED>
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)+
       MO
VW      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  <?Cannot find DSK0:SCNWLD.SYS[1,4] or MEM:SCNWLD.SYS>
       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