;BLKPRT.LIT
;
;
;4/25/84            STEVEN G. MCNAUGHTON & RICH EAKIN
;                 QUAKER STATE OIL CORP. RESEARCH CENTER
;
; THIS PROGRAM IS DESIGNED FOR THE AMOS/L SYSTEM.
;
; ***********************************************************************
; *                                                                     *
; * Format for use is BLKPRT <DEVn:> BLOCK1 BLOCK2                      *
; *                                                                     *
; * BLOCK1 is a single block to be printed or the starting block number *
; * of a group of blocks ending with BLOCK2.
; *                                                                     *
; * If no device is specified the job's login is defaulted.             *
; *                                                                     *
; * Output file is written to job's login default device with a filespec*
; * of DEVn:BLOCK1.BLK. This filespec is the same whether one block or a*
; * group of blocks is being printed.                                   *
; *                                                                     *
; ***********************************************************************
;
; ***********************************************************************
; *                                                                     *
; *                   EDIT AND DEVELOPMENT HISTORY                      *
; *                                                                     *
; ***********************************************************************
; 100. - BASIC PRINT TO SCREEN  [SGM]
; 101. - ADDED OUTPUT SWITCH CAPABILITY  [SGM]
; 102. - REMOVED SWITCH TO PRINT - DEFAULTS TO PRINT - NO OPTION   [SGM]
; 103. - ADDED RIGHT HAND ASCII BYTE DISPLAY  [SGM]
; 104. - CORRECTED BLOCK NUMBER RANGE CHECK FOR DEVICES HAVING MORE
;        THAN 32K BYTES PER DISK   [SGM]   5/18/84


SEARCH SYS
SEARCH SYSSYM
SEARCH TRM.UNV


OFINI
OFDEF   IDDB,D.DDB                      ;DUMMY FILE DDB
OFDEF   ODDB,D.DDB                      ;OUTPUT FILE DDB
OFSIZ   IMPSIZ

; ***********************************************************************
; *                                                                     *
; *                        SYMBOL EQUATE AREA                           *
; *                                                                     *
; ***********************************************************************


VMAJOR=1.                       ;VERSION NUMBER
VMINOR=1.
VSUB=1.
VEDIT=104.



HEADER:
       PHDR    -1,PV$RSM!PV$WSM,PH$REE!PH$REU


TOP:
       GETIMP  IMPSIZ,A5,EXIT          ;GET SOME IMPURE SPACE
       JOBIDX  A3
       MOVW    2(A3),D1
       ANDW    #20,D1                  ;IS J.HEX SET?
       BEQ     RESPRG                  ;NOPE IN OCTAL
       MOVW    #1,D5                   ;QUICK STORAGE FOR J.HEX SET
RESPRG: MOV     A2,D2
       LEA     A3,ASCBUF               ;A3 POINTS TO ASCII BUFFER SPACE
       BYP                             ;BYPASS ANY BLANKS ON COMMAND LINE
       LIN                             ;END OF LINE?
       JEQ     CERROR
NUMCHK:
       NUM                             ;IS THE FIRST CHAR NUMERIC?
       JEQ     INPBLK                  ;YES ! GET THE BLOCK NUMBER
INLINE:                                 ;NO ! GET THE DEVICE AND DRIVE INFO NOW
       MOVB    (A2)+,(A3)+             ;FIRST BYTE ON COMMAND LINE TO ASCII BUFFER
       MOVB    (A2)+,(A3)+             ;SECOND BYTE ON COMMAND LINE
       MOVB    (A2)+,(A3)              ;THIRD BYTE ON COMMAND LINE
       LEA     A3,INDRV                ;LOAD THE DRIVE STORAGE AREA
       MOVB    (A2)+,(A3)+             ;FOURTH BYTE ON COMMAND LINE TO DRIVE
       BYP                             ;BYPASS ANY BLANKS
       LIN                             ;END OF LINE?
       JEQ     CERROR                  ;*ERROR* WHERE'S THE COLON?
       MOVB    (A2),D1                 ;CHECK THE COMMAND LINE FOR A COLON
       CMPB    D1,#':                  ;IS IT A COLON (END OF DEV AND DRV)
       JEQ     PCKIT                   ;YES ! GO PACK THE DEVICE NAME
       MOVB    (A2)+,(A3)              ;GET FINAL CHARACTER OF DRIVE #
       MOVB    (A2),D1                 ;TEST THE NEXT BYTE ON THE COMMAND LINE
       CMPB    D1,#':                  ;IS IT A COLON?
       JEQ     PCKIT                   ;YES - GO PACK THE DEV AND DRV
                                       ;*ERROR* DEV AND DRV MUST END IN COLON
       SUB     #2,A2
       JMP     CERROR
PCKIT:
       ADD     #1,A2                   ;MOVE TO NEXT BYTE ON COMMAND LINE
       BYP                             ;BYPASS ANY BLANKS
       LIN                             ;END OF LINE?
       JEQ     CERROR
NUM2:
       NUM                             ;IS THIS CHARACTER NUMERIC?
       JNE     CERROR                  ;*ERROR* - THIS MUST BE A NUMBER!
       CLR     D1                      ;CLEAR OUT ANY JUNK
       GTOCT                           ;GET AN OCTAL NUMBER FROM THE COMMAND LINE
       LEA     A3,BLOCK                ;STORE THAT OCTAL NUMBER IN THE BLOCK
       MOVW    D1,(A3)                 ;  TO BE SEARCHED AREA
       BYP                             ;BYPASS ANY BLANKS
       LIN                             ;END OF LINE?
       JEQ     GOPCK
       NUM
       JNE     CERROR
       LEA     A3,UPBLK                ;STORE THE UPPER PRINT RANGE PRINT BLOCK
       CLR     D1
       GTOCT
       MOVW    D1,(A3)                 ;STORE IT
       BYP
       LIN
       JNE     CERROR
GOPCK:
       CLR     D1                      ;CLEAR OUT ANY JUNK
       LEA     A2,ASCBUF               ;A2 MUST POINT TO ASCII CHARACTERS
       LEA     A1,INDEV                ;PACK AND STORE THE DEVICE NAME
       PACK                            ;
       LEA     A2,INDRV                ;GET THE INPUTED DRIVE NUMBER
       GTDEC                           ;MAKE SURE ITS DECIMAL
       LEA     A2,INDRV                ;PUT IT BACK INTO DRIVE # STORAGE
       MOVW    D1,(A2)
       JMP     INITDB                  ;

INPBLK:
       CLR     D1                      ;GET THE BLOCK - DSK MUST HAVE BEEN
       GTOCT                           ;DEFAULTED TO GET HERE!
       LEA     A3,BLOCK                ;STORE THE BLOCK NUMBER
       MOVW    D1,(A3)
       BYP                             ;BYPASS ANY BLANKS
       LIN                             ;END OF LINE?
       JEQ     DEFAUL
       NUM
       JNE     CERROR
       LEA     A3,UPBLK
       CLR     D1
       GTOCT
       MOVW    D1,(A3)
       BYP
       LIN
       JNE     CERROR
DEFAUL:
       LEA     A3,INDEV                ;DEVICE DEFAULT AREA
       MOVW    #0,(A3)                 ;MOVE A ZERO FOR DEVICE NAME (FOR IDDB)
       LEA     A3,INDRV                ;MOVE A -1 FOR DRIVE NUMBER (FOR IDDB)
       MOVW    #-1,(A3)

INITDB:                                 ;SET UP AND INIT A DUMMY IDDB

       CLR     D1
       LEA     A2,SCRAT                ;LOAD A DUMMY FILESPEC IN
       MOV     A2,D0
       MOVW    #377,(A2)+
       MOVW    #377,(A2)+
       MOVW    #377,(A2)
       MOV     D0,A2
       FSPEC   IDDB(A5)                ;PROCESS THE FILESPEC (POINTED BY A2)
       LEA     A3,IDDB+D.DEV(A5)       ;PUT THE PROPER DEVICE NAME IN
       LEA     A2,INDEV
       MOVW    (A2),(A3)
       LEA     A3,IDDB+D.DRV(A5)       ;PUT THE PROPER DRIVE NUMBER IN
       LEA     A2,INDRV
       MOVW    (A2),(A3)
       INIT    IDDB(A5)                ;INITIALIZE THE IDDB
       CTRLC   EXIT
       CLR     D1
       TYPESP  <Block print on device:>
       LEA     A3,IDDB+D.DEV(A5)       ;GET THE IDDB'S DEVICE NAME
       MOVW    (A3),D1                 ;MOVE THE PACKED WORD TO D1
       TST     D1                      ;IS IT A ZERO?
       BNE     UNPCK                   ;NOPE - GO UNPACK THE WORD
       JOBIDX  A3                      ;DEFAULT DEVICE - DETERMINE LOG IN
       LEA     A2,JBDEV                ;   STATUS AND TYPE IT OUT
       CLR     D1
       MOVW    JOBDEV(A3),D1           ;GET THE PACKED DEVICE NAME
       LEA     A1,SCRAT                ;  AND UNPACK IT
       MOVW    D1,(A1)
       LEA     A2,ASCBUF
       UNPACK
       LEA     A2,ASCBUF
       TTYL    (A2)                    ;PRINT THE DEFAULT DEVICE NAME
       CLR     D1
       MOVW    JOBDRV(A3),D1           ;GET THE DEFAULT DRIVE NUMBER
       DCVT    0,OT$TRM                ;CONVERT AND TYPE IT
       CRLF
       CLR     D1
       JMP     PUTBLK
UNPCK:
       LEA     A1,INDEV                ;GET AND UNPACK THE DEVICE NAME
       LEA     A2,ASCBUF
       UNPACK
       LEA     A2,ASCBUF
       MOVB    (A2)+,D1                ;PRINT THE DEVICE NAME
       TTY
       MOVB    (A2)+,D1
       TTY
       MOVB    (A2)+,D1
       TTY
       LEA     A2,INDRV                ;GET THE DRIVE NUMBER
       CLR     D1
       MOVB    (A2),D1
       DCVT    0,OT$TRM                ;CONVERT AND TYPE IT
       CRLF
       CLR     D1

PUTBLK:
       TYPESP  <Block number to be printed:>
       CLR     D1
       LEA     A1,BLOCK                ;GET THE BLOCK NUMBER
       MOVW    (A1),D1
       OCVT    0,OT$TRM                ;CONVERT TO OCTAL AND TYPE IT
       CRLF
       CTRLC   EXIT

ODBCHK:
       LEA     A3,OPDEV                ;OUTPUT DEVICE
       MOVW    #0,(A3)                 ;DEFAULT DEVICE
       LEA     A3,OPDRV                ;OUTPUT DRIVE
       MOVW    #-1,(A3)
ODBINI:
       LEA     A2,BLKBUF
       CLR     D1
       LEA     A3,BLOCK
       MOVW    (A3),D1
       OCVT    0,OT$MEM
       LEA     A2,BLKBUF
       FSPEC   ODDB(A5),BLK            ;PROCESS THE FILESPEC (POINTED BY A2)
       LEA     A3,ODDB+D.DEV(A5)       ;PUT THE PROPER DEVICE NAME IN
       LEA     A2,OPDEV
       MOVW    (A2),(A3)
       LEA     A3,ODDB+D.DRV(A5)       ;PUT THE PROPER DRIVE NUMBER IN
       LEA     A2,OPDRV
       MOVW    (A2),(A3)
       INIT    ODDB(A5)                ;INITIALIZE THE IDDB
       CTRLC   EXIT
       CLR     D1
       TYPESP  <Block print has been initiated on:>
       JOBIDX  A3                      ;DEFAULT DEVICE - DETERMINE LOG IN
       LEA     A2,JBDEV                ;   STATUS AND TYPE IT OUT
       CLR     D1
       MOVW    JOBDEV(A3),D1           ;GET THE PACKED DEVICE NAME
       LEA     A1,SCRAT                ;  AND UNPACK IT
       MOVW    D1,(A1)
       LEA     A2,ASCBUF
       UNPACK
       LEA     A2,ASCBUF
       TTYL    (A2)                    ;PRINT THE DEFAULT DEVICE NAME
       CLR     D1
       MOVW    JOBDRV(A3),D1           ;GET THE DEFAULT DRIVE NUMBER
       DCVT    0,OT$TRM                ;CONVERT AND TYPE IT
       CLR     D1
       TYPE    <:>
       PFILE   ODDB(A5)
       CRLF
       LOOKUP  ODDB(A5)                ;DOES IT ALREADY EXIST?
       BNE     OPNOP                   ;NOPE - GO OPEN IT FOR OUTPUT
       DSKDEL  ODDB(A5)                ;YES DELETE THE OLD
OPNOP:
       OPENO   ODDB(A5)                ;OPEN IT FOR OUTPUT

TESTLP:
       LEA     A3,UPBLK
       MOVW    (A3),D1
       TSTW    D1
       BEQ     READBL



BLKCHK: CLR     D1
       MOV     IDDB+D.DVR(A5),A3       ;GET THE DISK DRIVER ADDRESS
       MOV     24(A3),D2               ;GET THE TOTAL NUMBER OF BLOCKS/DISK
       SUB     #1,D2                   ;SUB 1 - BLOCK ZERO IS FIRST BLOCK
       LEA     A3,UPBLK                ;GET THE INPUTED BLOCK NUMBER
       MOVW    (A3),D1
       CMP     D1,D2                   ;IS THE INPUTED BLOCK LESS THAN BLOCK
       BLOS    UPBOK                   ;   PER DISK?
       BR      BIGERR
UPBOK:
       CLR     D2
       LEA     A3,BLOCK
       LEA     A1,UPBLK
       MOVW    (A1),D4
       MOVW    (A3),D1
       SUBW    D1,D4
       TST     D4
       JLOS    BLKERR

READBL:
       CLR     D1
       MOV     IDDB+D.DVR(A5),A3       ;GET THE DISK DRIVER ADDRESS
       MOV     24(A3),D2               ;GET THE TOTAL NUMBER OF BLOCKS/DISK
       SUB     #1,D2                   ;SUB 1 - BLOCK ZERO IS FIRST BLOCK
       LEA     A3,BLOCK                ;GET THE INPUTED BLOCK NUMBER
       MOVW    (A3),D1
       CMP     D1,D2                   ;IS THE INPUTED BLOCK LESS THAN BLOCK   [104]
       JLE     GOMFD                   ;   PER DISK?
BIGERR: TYPECR  <?Block number specified is too large for this device>
       JMP     EXIT
BLKERR: TYPECR  <?End block number is less than start block>
       JMP     EXIT


GOMFD:
       JOBIDX  A3
       MOV     JOBTRM(A3),A0
       ORW     #1,(A0)                 ;SET FORCED IMAGE MODE
       LEA     A1,IDDB+D.REC(A5)       ;LOAD BLOCK AREA IN DDB
       MOV     D1,(A1)
       READ    IDDB(A5)                ;READ THE BLOCK
       CTRLC   EXIT

PRTBLK:
       TYPE    <Printing output file>
       CRLF
       CLR     D1
       MOVB    #15,D1
       FILOTB  ODDB(A5)
       MOVB    #12,D1
       FILOTB  ODDB(A5)
       CLRB    D1
       LEA     A2,ODDB(A5)
       OUTSP   OT$DDB,<Dump of block:>
       LEA     A3,BLOCK
       MOVW    (A3),D1
       OCVT    6,OT$DDB
       CLR     D1
       MOVB    #15,D1
       FILOTB  ODDB(A5)
       MOVB    #12,D1
       FILOTB  ODDB(A5)
       FILOTB  ODDB(A5)                ;PRINT 2 LINE FEEDS
       CTRLC   EXIT
       MOV     IDDB+D.BUF(A5),A1       ;ADDRESS THE READ BUFFER AREA
       LEA     A2,ODDB(A5)
       CLR     D1
       MOV     #0,D0
       MOV     #0,D2
       MOV     D0,D1
PRTLP:  CTRLC   EXIT
       MOV     A1,A3
       OCVT    3,OT$DDB
       CLR     D1
       MOVB    #':,D1
       FILOTB  ODDB(A5)
PRTLP1: CLR     D1
       MOVW    (A1)+,D1
       TSTW    D5
       BEQ     OCTPRT
HEXPRT:
       OCVT    4,OT$DDB
       BR      CONPRT
OCTPRT: OCVT    6,OT$DDB
CONPRT: CLR     D1
       MOVB    #40,D1
       FILOTB  ODDB(A5)
       CLR     D1
       ADD     #2,D2
       CMP     D2,#16.
       CTRLC   EXIT
       BNE     PRTLP1

BYTR:   LEA     A4,BYTTRN
       CLR     D1
       MOVW    #16.,D2
PTRNLP:
       CTRLC   EXIT
       CLRW    D1
       MOVB    (A3)+,D1
       CMPB    D1,#41
       BLT     PUTDOT
       CMPB    D1,#176
       BGT     PUTDOT
       BR      PBYTTR
PUTDOT:
       MOVB    #'.,D1
PBYTTR:
       MOVB    D1,(A4)+
       SUBW    #1,D2
       TST     D2
       BNE     PTRNLP

POUTL:
       MOVB    #0,(A4)                 ;TAIL END NULL
       CTRLC   EXIT
       CLRW    D1
       LEA     A4,BYTTRN
       OUTL    (A4),OT$DDB

PRTCR:
       CMP     D0,#760
       BEQ     DUNPRT
       CLR     D1
       MOVB    #15,D1
       FILOTB  ODDB(A5)
       MOVB    #12,D1
       FILOTB  ODDB(A5)
       ADD     #20,D0
       MOV     D0,D1
       CLR     D2
       JMP     PRTLP

DUNPRT:
       CLR     D1
       MOVB    #15,D1
       FILOTB  ODDB(A5)
       MOVB    #12,D1
       FILOTB  ODDB(A5)
       TSTW    D4
       BEQ     FILDUN
       LEA     A3,BLOCK
       ADDW    #1,(A3)
       SUBW    #1,D4
       MOVB    #14,D1
       FILOTB  ODDB(A5)
       JMP     READBL
FILDUN: CLR     D1
       CRLF
       TYPE    <Output file completed.>
PBLK:
       JMP     EXIT

BLOCK:  BLKB    2                       ;STORAGE FOR THE INPUT BLOCK NUMBER
SCRAT:  BLKB    6                       ;SCRATCH AREA
JBDEV:  BLKB    2                       ;JOB DEVICE STORAGE
JBDRV:  BLKB    2                       ;JOB DRIVE STORAGE
ASCBUF: BLKB    4                       ;ASCII BUFFER
INDEV:  BLKB    6
INDRV:  BLKB    2
BLKBUF: BLKB    6                       ;ASCII REP OF BLOCK NUMBER
OPDEV:  BLKB    2
OPDRV:  BLKB    2
UPBLK:  BLKB    2                       ;UPPER BLOCK RANGE
BYTTRN: BLKB    20.                     ;BYTE TRANSLATION AREA

CERROR:
       CLR     D1
       MOV     A2,D1
       SUB     D2,D1
       MOV     D1,D2
       ADD     #10,D2
       CLR     D1
ELOOP:
       TST     D2
       BEQ     PERROR
       MOVB    #40,D1
       TTY
       SUB     #1,D2
       BR      ELOOP


PERROR:
       CLR     D1
       MOVB    #'^,D1
       TTY
       TYPECR  <Specification error>
       CRLF
       BR      FINI

EXIT:
       CRLF
       CLR     D1
       MOVB    #15,D1
       FILOTB  ODDB(A5)
       MOVB    #12,D1
       FILOTB  ODDB(A5)
       CLOSE   ODDB(A5)
FINI:   EXIT
END