ASMB,L
* 
*     DATE:790504 
*     NAME:LGTAT
*     SOURCE: 92067-18008 
*     RELOC:  92067-16008 
*     PGMR:RD 
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
*  ***************************************************************
* 
* 
      NAM LGTAT,3,99 92067-16008 REV.1926 790504
      SUP 
      ENT LGTAT 
      EXT $CVT3,$LIBR,$LIBX,IFBRK 
      EXT EXEC,$IDEX
A     EQU 0 
B     EQU 1 
LGTAT XLA B,I       INPUT PARAMETERS ARE STORED AWAY
      CLE,SZA,RSS   SCHED WITH PARAMETER? 
      CLA,CCE,INA   DEFAULT TO LU 1 
      IOR M200      SET "V" BIT IN CONTROL WORD 
      STA LU        OUTPUT DEVICE 
      INB 
      XLA B,I       GET OPTION
      STA LU+1
      INB 
      XLA B,I       GET SPECIAL LU PARAMETER
      SZA,RSS         IN CASE OF PREV RUN 
      LDA LU
      SEZ           DEFAULT NEEDED
      STA LU        YES 
      LDA FWA       FIRST WORD ADDRESS OF TAT 
      STA TAT 
* 
      LDA D2        SET LU # TO 2 
      STA LUDSK 
      CLA 
      STA TRKCT     CLEAR COUNTERS
      STA CTR 
      STA CNTR
      STA TRCTR 
      STA ITRCT 
      STA CTRCT 
      LDA TLG       TAT LENGTH
      STA TATLG 
      LDA SLG       NUMBER OF TRACKS ON SYSTEM DISC 
      STA TATSD 
      ADA TATLG     ADD NUMBER OF TRACKS ON SYSTEM DISC 
*                   TO TRACK LENGTH TO GET NUMBER OF TRACKS ON AUX. DISC
      CMA,INA       MAKE RESULT POSITVE 
      STA TATAD     NUMBER OF TRACKS ON AUX. DISC 
      LDA LU+1      CHECK FOR DESIRED OPTION
      SZA,RSS       IF IT IS NOT ONE, DON'T PRINT TABLE 
      JMP HIGH      HEADING 
      JSB EXEC      EXEC CALL TO WRITE OUT TABLE HEADING
      DEF *+5 
      DEF D2
      DEF LU
      DEF TBLHD     STORAGE OF TABLE HEADING
      DEF D23 
      JSB BAUD      PRODUCE A BLANK LINE
      JSB EXEC      EXEC CALL TO PRINT COLUMN #'S IN OUTPUT 
      DEF *+5 
      DEF D2
      DEF LU
      DEF TBL       STORAGE CONTAINING COLUMN NUMBERS 
      DEF D39 
* 
* THE FOLLOWING CODE IS USED TO KEEP TRACK OF 
* THE NUMBER OF FREE TRACKS WHILE FINDING THE 
* THE LARGEST CONTIGUOUS BLOCK OF TRACKS
* 
HIGH  XLA TAT,I     A REG HAS FWA OF TAT
      SZA           IF TAT ENTRY =0 THEN INCREMENT BOTH CTRS
      JMP LABL      TAT ENTRY IS NOT 0 CHECK COUNTER TO GET 
*                          LARGEST CONTIGUOUS BLOCK 
* 
      ISZ ITRCT     INCREMENT TOTAL AVAILABLE TRACK COUNTER 
      ISZ CTRCT     INCREMEMT CONTIGUOUS TRACK COUNTER
      JMP LBL1      GO ON WITH TRACK IDENTIFICATION 
* 
*      SEE IF CURRENT MAX > OLD MAX # FREE TRACKS 
* 
LABL  LDB CTRCT     TRACK ENTRY MUST HAVE BEEN ZERO 
      CMB,INB       MAKE CONTIGUOUS TRACK CTR. NEGATIVE 
      ADB TRCTR     ADD TO TEMPORARY CONTIG. TRACK COUNTER
      SSB,RSS       SKIP IF RESULT IS NEG. I.E. TEMPORARY 
*                             COUNT IS OF GREATER VALUE 
      JMP LBL       OLD TRACK COUNT IS OF GREATER VALUE 
* 
      LDB CTRCT     IN GOES NEW 
*                   REPLACE TEMP. TRACK COUNTER WITH
      STB TRCTR     THE NEW CONTIGUOUS TRACK VALUE
LBL   CLB           RESET CURRENT MAX CONTIG TRACK #
      STB CTRCT 
* 
* THIS CODE DETERMINES WHAT TO OUTPUT WHEN LGTAT
* IS RUNNING AS A PROGRAM.  THE CHOICES BEING THE 
* TRACK STATEMENTS OR STATEMENTS AND TABLE. 
* 
LBL1  LDB LU+1
      SZB,RSS 
      JMP THERE     JUST CHECK FOR ALL FREE AND CONTIG, TRACKS
      JMP GOON      IDENTIFY ALL TRACKS AND OUTPUT TABLE
THERE ISZ TATLG     CHECK TO SEE IF FINISHED WITH CHECK 
      JMP ARND      NO,CONTINUE WITH CHECKS 
      JMP WRONG     YES,PRINT OUT TRACK STATEMENTS
ARND  ISZ TAT       INCREMENT TAT ADDRESS 
      JMP HIGH      GET ANOTHER TAT ENTRY 
* 
* "NO." DETERMINES HOW MANY WORDS ARE PASSED TO THE BUFFER. 
* I.E. THREE OR FOUR WORDS ARE STORED IN THE TABLE USED FOR 
* OUTPUT.  THIS ALLOWS THE PASSING OF "SYSTEM" OR " SYSTEM "
* TO THE OUTPUT TABLE KEEPING THE COLUMNS STRAIGHT AND THE
* ENTRIES ALIGNED PROPERLY. 
* 
GOON  LDB TRKCT     CHECK FOR EVEN OR ODD 
      SLA 
      JMP ODD 
      LDB ADFOR     LOAD ADDRESS OF FOUR
      STB NO. 
      JMP CONT
ODD   LDB ADFOR     LOAD ADDRESS OF THREE 
      STB NO. 
* 
* THIS CODE IDENTIFYS THE SYSTEM TRACKS IN THE
* TAT. FURTHERMORE IT BREAKS THEM DOWN INTO THE 
* COMPONENTS OF LG, START OF THE LS AREA, LIBRARY,
* ENTRY POINTS, MEMORY IMAGE PROGRAMS AND SWAPPED 
* PROGRAM TRACKS. 
* 
CONT  CPA SYS       CHECK TAT ENTRY FOR SYSTEM TRACKS 
      JMP LG        CHECK FOR LG TRACKS 
      JMP FP        NOT SYSTEM TRACKS, CHECK FOR FMP TRACKS 
LG    LDA LGOTK     GET DISC POINTER FOR LG AREA
      JSB FDISK     CALL SUBROUTINE TO GET DISC INFORMATION 
      LDA INPTR     OBTAINED THE NUMBER OF TRACKS USED FOR
      AND M177      LG AREA 
      ADA JTRAK     ADD # OF TRACKS TO STARTING TRACK TO
      ADA SUB1      GET LAST TRACK OF LG AREA.
*                   SUBTRACT ONE (TRACK COUNT STARTS AT ZERO) 
      STA LGEND     LAST TRACK OF LG AREA 
      LDB LUD       DETERMINE IF IT IS THE RIGHT LU 
      CPB LUDSK 
      JMP STR       IT IS TH RIGHT LU 
      JMP LS        IT IS THE WRONG LU
STR   LDA JTRAK     SEE IF TRACK ENTRY IS A LG TRACK
      CMA,INA       THIS IS DONE BY CHECKING THE TRACK
      ADA TRKCT     COUNTER AGAINST THE LOWER 
      SSA           AND HIGHER BOUNDS OF THE POSSIBLE 
      JMP LS        LG TRACKS----NOT AN LG TRACK
      LDA TRKCT     CHECK TRACK COUNTER AGAINST 
      CMA,INA       THE HIGHER BOUND
      ADA LGEND 
      SSA 
      JMP LS        NOT LG TRACK CHECK START OF LS AREA 
      JMP PRTLG     PRINT OUT LG TRACKS 
* 
* FIND THE START OF THE LS TRACKS 
* 
LS    LDA SFCUN     CHECK FOR START OF LS TRACKS
      JSB FDISK     FIND TRACK ADDRESS AND LU # 
      SZA           IF TRACK ENTRY IS 0 THEN UNDEFINED
      JMP RDJ       LS TRACKS ARE NOT UNDEFINED 
      LDA ADUND     IN OUTPUT PRINT UNDEFINED FOR 
      LDB ADLST     START OF LS TRACKS. 
      MVW D15 
      JMP LEN 
RDJ   JSB HERE      PASS TRACK ADDRESS TO CONVERSION
*                   ROUTINE.  PUT ASCII FORMAT IN STATEMENT 
*                   ALSO CONVERT LU ON WHICH THE TRACK ADDRESS
*                   IS ON, THEN PLACE IN STATEMENT. 
      INA 
      LDB A,I 
      STB LST+15    LOCATION OF LS STATEMENT
      INA 
      LDB A,I 
      STB LST+16
* 
* CONVERT NUMBERS FROM BINARY TO ASCII
* 
      JSB $LIBX 
      DEF *+1 
      DEF *+1 
      LDA LUD 
      JSB HERE
      INA 
      LDB A,I 
      STB LST+21    LOCATION OF LS STATEMENT
      INA 
      LDB A,I 
      STB LST+22
      JSB $LIBX 
      DEF *+1 
      DEF *+1 
* 
* CHECK FOR ENTRY POINTS
* 
LEN   LDA DSCLB     DISC ADDRESS OF LIBRARY ENTRY PTS.
      JSB FDISK     PASS DISC PTR., TO FDISK
      STA ENTST     GET STARTING TRACK
      LDB LUD       CHECK FOR PROPER LU 
      CPB LUDSK 
      JMP HUH 
      JMP FOO       IT IS THE WRONG LU
HUH   LDA DSCLN     CALCULATE LAST TRACK OF ENTRY POINTS
      ADA DSSUP     ADD # OF SYS. TO USER ENTRY PTS.
      MPY D4        FIRST DETERMINE THE # OF SECTORS USED 
      CLB           BY MULT. BY 4 (4 WORDS PER ENTRY) 
      DIV D64       THEN DIVIDING BY 64 (64 WORDS SECTOR) 
      STA TEMP
      LDA DSCLB     GET STARTING SECTOR 
      AND M177
      ADA SUB1      COMPENSATE FOR STARTING AT ZERO 
      ADA TEMP      ADD IN # OF SECTORS USED FOR STORAGE
      CLB 
      DIV NSPTK     DIVIDE BY # OF SECTORS/TRACK
      ADA ENTST     ADD TO TRACK ADDRESS
      STA ENTND     SUM IS LAST TRACK CONTAING ENTS.
      LDA ENTST     CHECK AGAINST THE LOWER BOUND 
      CMA,INA 
      ADA TRKCT 
      SSA 
      JMP FOO 
      LDA TRKCT     CHECK THE HIGHER BOUND
      CMA,INA 
      ADA ENTND 
      SSA 
      JMP FOO       NOT ENTRY TRACKS
      JMP PRTEN     IT IS ENTRY TRACK(S)
* 
* CHECK FOR LIBRARY ROUTINES
* 
FOO   LDA LUDSK     LIBRARY MUST BE ON SYSTEM DISC
      CPA D2
      JMP TOP       IT IS SYSTEM DISC 
      JMP HARD      IT'S NOT SYS. DISC, GO ON 
TOP   LDA DSCUT     DISC ADDRESS OF RTE LIBRARY 
      JSB FDISK     GET DISC INFORMATION
      CMA,INA       CHECK TRACK BOUNDS
      ADA TRKCT 
      SSA 
      JMP HARD      NOT LIBRARY TRACK 
      LDA TRKCT     CHECK FOR UPPER BOUND 
      CMA,INA 
      ADA ENTST     LIBRY TRACKS START BEFORE ENTRY PTS.
      SSA 
      JMP HARD      NOT A LIBRARY TRACK 
      JMP PRTLB     PRINT OUT LIBRARY TRACKS
HARD  JSB PRGTR     CHECK FOR MEM. IMAGE OR SWAPPED PROGRAM 
      JMP PRTSY     TRACKS ARE NONE OF THE ABOVE
*                   DEFAULT IS SYSTEM TRACKS
* CHECK FOR FMP TRACKS
* 
FP    CPA FMP 
      JMP PRTFP     JMP TO PRINT FMP
* 
* CHECK FOR GLOBAL TRACKS 
      CPA GLBL      CHECK FOR GLOBAL TRACKS 
      JMP PRGBL     JUMP TO PRINT GLOBAL
* 
* CHECK FOR PROGRAMS OWNING TRACKS
* ON A SUCCESSFUL FIND OF PROGRAMS OWNING 
* A TRACK, THAT PROGRAM NAME IS OBTAINED
* FROM THE ID SEGMENT MAP WHOSE ADDRESS 
* IS LOCATED IN THE TAT.
* ALSO, THIS CODE IS USED TO GET NAMES
* OF PROGRAMS THAT HAVE SWAPPED TRACKS
* AND THAT ARE MEMORY IMAGE SOURCE PROGRAMS.
* 
      SZA,RSS       IF TAT ENTRY IS 0, GO ON TO FREE TRACKS 
      JMP FEE 
      LDB B40       PLACE A BLANK IN TYPE 
      STB TYPE
ABOVE LDB TRKCT     IF CTR IS ODD DO THE FOLLOWING CODE 
      SLB,RSS       THIS CODE PUTS A BLANK CHAR.
      JMP BELOW     IN FRONT OF THE PROGRAM NAME. 
      LDB ADNAM     ADDRESS AS TO WHERE TO STORE THE PROG 
      STB TEMPY     NAME
      ADA D12       GET FIRST TWO CHARACTERS OF PROG NAME 
      STA TEMP
      XLB A,I       SHIFT UPPER BYTE TO LOWER BYTE POSITION 
      BLF,BLF 
      LDA B 
      STA WORD
      AND M177      PUT A BLANK IN THE UPPER BYTE 
      IOR B2000 
      STA TEMPY,I   STORE BLANK AND FIRST CHAR, IN BUFFER 
      ISZ TEMP      GET THIRD AND FOURTH CHAR.
      XLB TEMP,I
      BLF,BLF       SHIFT UPPER BYTE TO LOWER BYTE POSITION 
      STB WORD1     GET SECOND CHAR. IN UPPER BYTE POSITION 
      LDA WORD
      AND B1774 
      STA WORD
      LDA B 
      AND M177      GET 3RD CHAR. IN LOWER BYTE POSITION
      IOR WORD      PUT 2ND AND 3RD CHAR. TOGETHER
      ISZ TEMPY 
      STA TEMPY,I 
* 
      LDA WORD1     GET 3RD AND 4TH CHAR. 
      AND B1774     GET UPPER BYTE POSITION 
      STA WORD1 
      ISZ TEMP
      XLB TEMP,I
      BLF,BLF       GET 5TH CHAR. 
      LDA B         AND SHIFT TO LOWER BYTE POSITION
      AND M177
      IOR WORD1 
      ISZ TEMPY     STORE IN TEMPORARY IN LOCATION
      STA TEMPY,I 
* 
      ISZ TEMPY     PUT BLANKS IN LAST TWO CHARS. 
      LDA B2000     POSITION
      IOR TYPE
      ALF,ALF 
      STA TEMPY,I 
      LDA ADNAM 
      JMP BAD       TRANSFER NAME TO OUTPUT BUFFER
* 
BELOW LDB ADNAM     THE FOLLOWING CODE DOES THE SAME
      STB TEMPY     AS THE ABOVE BUT IT DOES NOT
*                   PUT A BLANK IN FRONT OF THE PROG. NAME
      ADA D12       STORE PROGRAM NAME IN TEMPORARY HOLDING 
      XLB A,I       A REG HAS ADDRESS OF ID SEGMENT INDEX 
      STB TEMPY,I   IT BY 12 TO GET THE FIRST TWO CHAR. 
      INA 
      ISZ TEMPY 
      XLB A,I 
      STB TEMPY,I 
      INA 
      ISZ TEMPY 
      XLB A,I 
      LDA B 
      AND B1774     AND IN A BLANK CHARACTER
      IOR TYPE
      STA TEMPY,I 
PRPRG LDA ADNAM     LOAD ADDRESS OF PROGRAM NAME
      JMP BAD       TRANSFER NAME TO OUTPUT BUFFER
* 
FEE   JMP PRTFR     MUST BE A FREE TRACK
* 
PRTSY LDA TRKCT     GET READY TO PRINT SYSTEM 
      SLA           SKIP IF ODD 
      JMP LAB 
      LDA ADSYE     LOAD A REG WITH ADD. OF SYSTEM(EVEN)
      JMP BAD 
LAB   LDA ADSYO     LOAD A REG WITH ADDRESS OF SYS(ODD) 
      JMP BAD 
PRTFP LDA TRKCT     GET READY TO PRINT FMP
      SLA 
      JMP LB
      LDA ADFME     FMP (EVEN)
      JMP BAD 
LB    LDA ADFMO     FMP (ODD) 
      JMP BAD 
PRGBL LDA TRKCT     GET READY TO PRINT GLOBAL 
      SLA 
      JMP LBLA
      LDA ADGBE 
      JMP BAD 
LBLA  LDA ADGBO 
      JMP BAD 
PRTLG LDA TRKCT     GET READY TO PRINT LG TRACKS
      SLA 
      JMP LEFT
      LDA ADLGE 
      JMP BAD 
LEFT  LDA ADLGO 
      JMP BAD 
PRTFR LDA TRKCT     GET READY TO PRINT -- TO INDICATE FREE
      SLA 
      JMP LBA 
      LDA ADAVE 
      JMP BAD 
LBA   LDA ADAVO 
      JMP BAD 
PRTEN LDA TRKCT     GET READY TO PRINT ENTS 
      SLA 
      JMP DO
      LDA ADENE 
      JMP BAD 
DO    LDA ADENO 
      JMP BAD 
PRTLB LDA TRKCT     GET READY TO PRINT LIBRY
      SLA 
      JMP OH
      LDA ADLBE 
      JMP BAD 
OH    LDA ADLBO 
      JMP BAD 
* 
* "CTR" INDEXES THE POINTER TO THE APPROPRIATE POSITION 
* IN THE OUTPUT BUFFER. POINTER IS INCREMENTED ALTERNATELY
* BY THREE OR FOUR. 
* 
BAD   LDB TRKCT     LOAD TRACK CTR. 
      SLB,RSS       SKIP IF ODD 
      JMP ME        GO TO ODD 
      LDB CTR       MAKE COUNTER THREE
      ADB D3
      STB CTR 
      JMP BALL
ME    LDB CTR       MAKE COUNTER FOUR 
      ADB D4
      STB CTR 
BALL  LDB ADTAB     LOAD ADDRESS OF TABLE AND 
      ADB CTR       INDEX IT BY COUNTER 
      MVW NO.,I     PUT ENTRY IN TABLE, A REG. HAS ADDR.
      LDA CTR       SEE IF FINISHED WITH LINE 
      CPA D35       BY COMPARING WITH 35
      JMP DOWN      YES, PRINT OUT TABLE (ONE LINE) 
      LDB TRKCT     COMPARE CTR. WITH LENTGH OF SYS DISC
      INB 
      CPB TATSD 
      JMP .DWN      PRINT LAST TRACKS ON SYSTEM DISC
      JMP LOW       CHECK FOR TABLE COMPLETION
* 
* PRINT OUT TABLE WITH TRACK IDENTIFIERS
* 
.DWN  LDA CTR 
      STA TEMP
      LDB TRKCT 
      SLB,RSS 
      JMP BE
      LDB TEMP
      ADB D4
      STB TEMP
      JMP TALL
BE    LDB TEMP
      ADB D3
      STB TEMP
TALL  LDA ABLK
      LDB ADTAB 
      ADB TEMP
      MVW ONE 
DOWN  LDA CNTR      CNTR IS AN INDEX OF TEN USED IN THE OUTPUT
      JSB HERE      JMP TO CONVERSION ROUTINE 
      LDB A,I       RETURN HERE FROM THE CONVERSION ROUTINE 
      INA           THREE WORDS OF TABLE
      LDB A,I 
      STB TABLE 
      INA 
      LDB A,I 
      STB TABLE+1 
      JSB $LIBX     END PRIVILEGE STATUS
      DEF *+1 
      DEF *+1 
* 
* PRINT OUT TABLE WITH TRACK IDENTIFIERS
* 
      JSB EXEC      EXEC CALL TO WRITE OUT TABLE
      DEF *+5 
      DEF D2
      DEF LU
      DEF TABLE     BUFFER FOR TABLE OUTPUT 
      DEF D39       LENGTH OF OUTPUT
* 
* CHECK FOR BREAK FLAG IF SET THEN EXIT FROM PROGRAM
* OTHERWISE CONTINUE ON.
* 
      JSB IFBRK 
      DEF *+1 
      SZA 
      JMP NOW       EXIT FROM PROGRAM 
* BLANK OUT TABLE 
* 
      LDA ADBLK     LOAD ADDRESS OF BLANKS INTO A REG 
      LDB ADTAB 
      MVW D39 
      CLA           CLEAR COUNTER 
      STA CTR 
      LDA CNTR
      ADA D10 
      STA CNTR
LOW   ISZ TATLG     INCREMENT TATLG (NEGATIVE #)
      JMP TWO 
      JMP KAYO
* 
TWO   LDB LUDSK     DETERMINE SUBCHANNEL
      CPB D3
      JMP .AUX      NO NEED TO CHECK COMPLETION OF SYS DISC 
      LDB TRKCT     INCREMENT TRACK COUNTER 
      INB           CHECK FOR COMPLETION OF 
      CPB TATSD     SYSTEM DISC 
      JMP SOON      PRINT OUT AUX DISC HEADING
.AUX  ISZ TRKCT     INCREMENT TABLE COUNTER 
      ISZ TAT       INCREMENT I.E. DECREMENT TABLE LENGTH 
      JMP HIGH
* 
* PRINT OUT AUX DISC HEADING
* 
SOON  JSB BAUD      PRODUCE A BLANK LINE
      JSB BAUD
      JSB EXEC      EXEC CALL TO WRITE OUT AUX DISC HEADING 
      DEF *+5 
      DEF D2
      DEF LU
      DEF AUXDS 
      DEF D7
      JSB BAUD
      LDA D3        SET LU # TO THREE.
      STA LUDSK 
      LDA TATAD 
      STA TATSD     REPLACE SYS. COUNT WITH AUX. COUNT
      CLA 
      STA TRKCT     RESTART COUNTER FOR TABLE ENTRIES.
      STA CNTR      RESTART INDEX COUNTER 
      STA CTRCT     RESET TEMP CONTIGUOUS TRACK COUNTER 
      ISZ TAT       INCREMENT TAT POINTER 
      JMP HIGH      CHECK ANOTHER ENTRY 
* 
* PRINT OUT WITH TABLE THE START OF THE LS TRACKS 
* 
KAYO  JSB EXEC      LAST LINE MAY BE PARTIALLY FILLED 
      DEF *+5 
      DEF D2
      DEF LU
      DEF TABLE 
      DEF D39 
      JSB BAUD      PRODUCE A BLANK LINE
      JSB EXEC      PRINT TRACK STATEMENT 
      DEF *+5 
      DEF D2
      DEF LU
      DEF LST 
      DEF D24 
* 
* THE FOLLOWING PREPARES AND OUTPUTS THE TRACK
* STATEMENTS BY CONVERSION FROM BINARY TO ASCII 
* THROUGH THE "HERE" SUBROUTINE 
* 
WRONG LDA ITRCT     COUNT OF TOTAL FREE TRACKS
      JSB HERE      JUMP TO BINARY TO ASCII SUBROUTINE. 
      LDB A,I 
      STB PRTAT+12
      INA 
      LDB A,I 
      STB PRTAT+13
      INA 
      LDB A,I 
      STB PRTAT+14
      JSB $LIBX     COMPLETE EXEC CALL TO SYSTEM
      DEF *+1 
      DEF *+1 
* 
      JSB EXEC      EXEC CALL TO PRINT TRACK STATEMENT
      DEF *+5 
      DEF D2
      DEF LU
      DEF PRTAT     BUFFER LOCATION 
      DEF D15 
* 
      LDA TRCTR     CONTIGUOUS TRACK COUNTER
      JSB HERE
      LDB A,I 
      STB CTAT+16   STORE CONTIGUOUS TRACK COUNT IN LAST 3
      INA           WORDS OF CONTIGUOUS TRACK STAEMENT
      LDB A,I 
      STB CTAT+17 
      INA 
      LDB A,I 
      STB CTAT+18 
      JSB $LIBX     COMPLETE EXEC CALL TO SYSTEM
      DEF *+1 
      DEF *+1 
* 
      JSB EXEC
      DEF *+5 
      DEF D2
      DEF LU
      DEF CTAT
      DEF D19 
* 
      JMP NOW 
* 
* FINDS THE SYSTEM OR AUXILIARY DISC WHERE THE
* DISC POINTER (IN PACKED FORMAT) POINTS TO,
* AS WELL AS THE TRACK.  IF THE DISC POINTER IS 
* LESS THAN 0 THEN THE LU IS 3.  ON RETURN
* NSPTK =# SECTORS PER TRACK ON THE DISC
* LUD = LOGICAL UNIT (DISC LU 2 OR 3) 
* JTRAK =TRACK ADDRESS
* 
FDISK NOP 
      STA INPTR     STORE DISC POINTER AWAY 
      LDB D2
      STB LUD 
      SSA,RSS       IF THE DISC POINTER IS <0 THEN LU=3 
      JMP TOO 
      LDB D3
      STB LUD 
TOO   ADB M1755     GET NUMBER OF SECTORS PER TRACK 
      LDA B,I 
      STA NSPTK 
* 
*FIND THE STARTING TRACK ADDRESS
* 
      LDA INPTR 
      AND B776C     GET BITS 14 - 7 OF DISC POINTER 
      CLB           I.E. THE TRACK ADDRESS
      DIV D128
      STA JTRAK 
      JMP FDISK,I 
* 
* THIS SUBROUTINE DETERMINES IF THE TRACK ENTRY INDICATED BY
* SYSTEM IN THE TAT, IS THE SWAPPED PROGRAM TRACK OR THE TRACK CONTAINING 
* MEMORY IMAGE VERSION OF A PROGRAM.  THIS IDENTIFICATION IS
* ACCOMPLISHED THROUGH THE SEARCH OF THE KEYWORD TABLE. 
* WHEN THE TAT POINTER IS EQUAL TO THE TRACK POINTER FOUND
* IN A PROGRAM'S ID SEGMENT MAP, A TRACK IS IDENTIFIED. 
* 
PRGTR NOP 
      LDA FWAK      FWA OF KEYWORD BLOCK
      STA KEYWD 
TEN   XLA KEYWD,I   GET FWA OF KEYWORD TABLE
      SZA,RSS       IF KEYWORD ENTRY IS 0 THEN FINISHED 
      JMP PRGTR,I   WITH CHECK,RETURN FROM SUBROUTINE 
      ADA D14       GET NAME PORTION CONTAINING THE TYPE AND
      STA IDADR     SHORT SEGMENT (SS) BIT
      XLA IDADR,I 
      STA NAM3
      CLB 
      STB SHTID     0 IN SHTID INDICATES LONG ID SEGMENT
      AND M20       CHECK THE SS BIT (BIT 4) TO SEE IF IT 
      SZA,RSS       IS A LONG ID OR SHORT ID SEGMENT
      JMP LNGID     IT IS A LONG ID SEGMENT 
      LDB SUB1      ID SEGMENT IS OF SHORT FORM 
      STB SHTID     INDICATE IT BY -1 IN SHTID
LNGID LDA NAM3      MAKE SURE IT'S A DISC RESIDENT PROGRAM
      AND M22       OR SHORT ID FOR SEGMENTS
      SZA 
      JMP FROG
      LDA NAM3      CHECK FOR TYPE FOUR PROGRAMS
      AND M4
      SZA,RSS 
      JMP KEY 
FROG  LDA M46       OCTAL 46 =& 
      STA TYPE      SET FLAG FOR MEMORY IMAGE PROG. TRACKS
      SSB,RSS       PICK UP MEMORY ADDRESSES
      JMP FIVE
      ISZ IDADR     CALCULATE # OF SECTORS USED FOR STORAGE 
      XLA IDADR,I   OBTAIN LOW AND HIGH MAIN ADDRESSES
      STA LWMAN     ALSO, LOW AND HIGH BASE PAGE WORDS
      ISZ IDADR 
      XLA IDADR,I   AND THE DISC ADDRESS OF A PROGRAM 
      STA MNHGH     IN A SHORT ID SEGMENT 
      ISZ IDADR 
      XLA IDADR,I 
      STA LOWBP 
      ISZ IDADR 
      XLA IDADR,I 
      STA HGHBP 
      ISZ IDADR 
      XLA IDADR,I 
      STA KTRAK 
      JMP SIX 
* 
* LONG ID SEGMENT 
* 
FIVE  LDA IDADR     GET MEMORY ADDRESSES OF THE PROG. 
      ADA D8        FROM THE LONG ID SEG. 
      STA IDADR     ALSO GET THE DISC ADDRESS OF
      XLA IDADR,I   THE PROGRAM 
      STA LWMAN 
      ISZ IDADR 
      XLA IDADR,I 
      STA MNHGH 
      ISZ IDADR 
      XLA IDADR,I 
      STA LOWBP 
      ISZ IDADR 
      XLA IDADR,I 
      STA HGHBP 
      ISZ IDADR 
      XLA IDADR,I 
      STA KTRAK 
* 
* CALCULATE THE NUMBER OF SECTORS REQUIRED FOR
* PROGRAM STORAGE.
* 
SIX   SZA,RSS       IF DISC PTR. =0 THEN GET
      JMP KEY       ANOTHER KEYWORD ENTRY 
      LDA LWMAN 
      CMA,INA       MAKE NEGATIVE 
      ADA MNHGH 
      ADA D127
      CLB 
      DIV D128
      CLE,ELA       MULTIPLY BY TWO 
      STA TEMP
      LDA LOWBP 
      CMA,INA 
      ADA HGHBP 
      ADA D127
      CLB 
      DIV D128
      CLE,ELA 
      ADA TEMP
      STA NSCTS 
* 
* CHECK FOR PROGRAMS OWNING TRACKS
* 
      LDA KTRAK     DISC PTR. PASSED AS PARAMETER 
      JSB FDISK     TO FDISK
      LDB LUD       DETERMINES IF ON CORRECT LU 
      CPB LUDSK 
      JMP ONCE      IT IS THE CORRECT LU
      JMP ING       IT IS THE WRONG LU. 
ONCE  CLB           CALCULATE THE LAST TRACK
      LDA NSCTS 
      ADA NSPTK     TO ROUND UP RESULT
      ADA SUB1
      DIV NSPTK 
      ADA JTRAK     SUM IS THE LAST TRACK 
      ADA SUB1
      STA LSTRK 
      LDB TRKCT     SEE IF LAST TRACK OF PROGRAM SOURCE 
      CMB,INB       IS GREATER THEN COUNTER OF TAT
      ADB LSTRK 
      SSB 
      JMP ING 
* 
*                   IF LSTRK >= TRKCT THEN GO CHECK 
*                   THE OTHER BOUND 
* 
      LDB JTRAK 
      CMB,INB 
      ADB TRKCT 
      SSB           SKIP IF TRKCT IS LESS THAN START OF 
*                   SOURCE TRACKS 
      JMP ING       CHECK FOR SWAPPED TRACKS
      JMP IN        SUCCESS IN FINDING SOURC TRACKS 
ING   LDA SHTID     CHECK FOR SHORT ID SEGMENT
      SZA           IF SHORT SEG, SWAP TRACK CAN'T
      JMP KEY       APPEAR.    GET ANOTHER SEGMENT
      ISZ IDADR 
      XLA IDADR,I 
      STA KTRAK 
      SZA,RSS       IF WORD ID 0 THEN NO SWAP TRACKS
      JMP KEY 
      JSB FDISK 
      CLB           STORAGE FOR # OF EMA TRACKS 
      ISZ IDADR     POINTER TO ID EXT 
      XLA IDADR,I   ID AND EMA SIZE-WORD 28 OF ID SEG.
      SZA,RSS       IF IT'S ZERO,DON'T WORRY ABOUT EMA TRACKS 
      JMP NOEMA 
      AND B176C     GET ID EXT OFFSET OUT OF UPPER 6 BITS 
      ALF,RAL 
      RAL           PUT UPPER 6 BITS IN LOWER POSITION
      ADA $IDEX     ADDRESS OF ID EXTENSION TABLE 
      ADA SUB1      ADD IN OFFSET-ADDRESS OF ID EXT 
      LDA A         GET ADDRESS OF ID EXT.
* 
      ADA TWO       COMPENSATE FOR STARTING AT ZERO 
*                   AND POINT TO WORD 2 OF ID EXT.
      LDA A         GET # OF TRACKS FOR EMA SWAP
      AND M1777     LOWER 9 BITS CONTAIN INFO.
      STA B 
NOEMA LDA KTRAK     COMPUTE LAST POSSIBLE SWAP TRACKS 
      AND M177
      ADA JTRAK 
      ADA SUB1
      ADA B         ADD IN # OF EMA SWAP TRACKS.
      STA LSTRK 
      LDB LUD       CHECK FOR CORRECT LOGICAL UNIT
      CPB LUDSK 
      JMP ZERO
      JMP KEY 
ZERO  LDB M136      INDENTIFIER FOR SWAP TRACKS 
      STB TYPE
      LDA TRKCT 
      CMA,INA       A REG CONTAINS LSTRK
* 
* CHECK FOR UPPER BOUNDS OF POSSIBLE SWAPPED TRACKS 
* 
      ADA LSTRK 
      SSA           POINTER FOR SUCCESS 
      JMP KEY       NO SUCCESS TRY TO GET ANOTHER ID SEGMENT
      LDB JTRAK     CHECK TO SEE IF TRACK ENTRY COUNTER IS
      CMB,INB       EQUAL TO OR GREATER THAN TRACK #
      ADB TRKCT     OF SWAPPED TRACKS 
      SSB 
      JMP KEY 
* 
IN    XLA KEYWD,I   GET POINTER OF ID SEGMENT 
      JMP ABOVE     GET PROGRAM NAME FROM ID SEG. 
*                   NOTE: TYPE SYMBOL IS APPENDED TO PROG. NAME 
* 
KEY   ISZ KEYWD     GET ANOTHER KEYWORD ENTRY 
      JMP TEN 
* SUBROUTINE THAT CONVERTS FROM BINARY TO ASCII.
* 
HERE  NOP 
      JSB $LIBR 
      NOP 
      CCE 
      JSB $CVT3 
      JMP HERE,I
* 
* WILL PRINT OUT ONE BLANK LINE WHEN CALLED 
* 
BAUD  NOP 
      JSB EXEC
      DEF *+5 
      DEF D2
      DEF LU
      DEF BLNK
      DEF ONE 
      JMP BAUD,I
* 
* EXEC CALL TO TERMINATE PROGRAM
* 
NOW   JSB EXEC
      DEF *+7 
      DEF CODE
      DEF ZORO
      DEF SUB1      SERIAL REUSABLE 
      DEF ZORO
      DEF LU+1      SAVE OPTION 
      DEF LU
* 
* 
ZORO  DEC 0 
INUMB DEC -1        SERIAL REUSEABLE
BLNK  ASC 1,        USED TO PRODUCE A BLANK LINE
ABLK  DEF BLNK
LU    BSS 2         STORAGE FOR PARAMETERS
TAT   BSS 1         ADDRESS OF TRACK ASSIGN. TABLE
TATLG BSS 1         LENGTH OF TAT (NEG. #)
TATSD BSS 1         LENGTH OF SYSTEM DISC 
TATAD BSS 1         LENGTH OF AUX. DISC 
CNTR  BSS 1         INDEX USED IN OUTPUT. 
CODE  DEC 6 
FWA   EQU 1656B     FWA OF TRACK ASSIGN. TABLE
TLG   EQU 1755B     TABLE LENGTH
SLG   EQU 1756B     SYSTEM DISC LENGTH
TRCTR BSS 1         CONTIGUOUS TRACK COUNTER
CTRCT BSS 1         TEMPORARY CONTIGUOUS TRACK COUNTER
ITRCT BSS 1         FREE TRACK COUNTER
PRTAT ASC 15,TOTAL AVAILABLE TRACKS = 
CTAT  ASC 19,LARGEST CONTIGUOUS TRACK BLOCK = 
D10   DEC 10
D2    DEC 2 
D3    DEC 3 
D15   DEC 15
D19   DEC 19
D22   DEC 22
D24   DEC 24
D23   DEC 23
D35   DEC 35
D36   DEC 36
D39   DEC 39
NO.   BSS 1         NUMBER OF WORDS MOVED INTO BUFFER 
TRKCT BSS 1         TAT ENTRY COUNTER 
AUXDS ASC 7,AUXILIARY DISC
D7    DEC 7 
TABLE ASC 20, 
      ASC 19, 
TBL   ASC 17,TRACK     0      1      2      3 
      ASC 22,    4      5      6      7      8      9 
TBLHD ASC 23,TRACK ASSIGNMENT TABLE       & =PROG ^ =SWAP 
ADTAB DEF TABLE 
CTR   BSS 1         POINTER IN BUFFER 
SYS   OCT 100000    REPRESENTATION OF SYS IN TAT
FMP   OCT 077776    REPRESENTATION OF FMP IN TAT
FREE  OCT 0            "     "      OF FREE IN TAT
M200  OCT 200 
AVALE ASC 3,  --
AVALO ASC 4,   -- 
SYSE  ASC 3,SYSTEM
SYSO  ASC 4, SYSTEM 
FMGRO ASC 4,  FMP 
FMGRE ASC 3, FMP
D4    DEC 4 
ADFOR DEF D4
ADTHR DEF D3
ADSYE DEF SYSE
ADSYO DEF SYSO
ADFME DEF FMGRE 
GBE   ASC 3,GLOBAL
GBO   ASC 4, GLOBAL 
ADFMO DEF FMGRO 
ADAVE DEF AVALE 
ADAVO DEF AVALO 
ADBLK DEF BLNKS 
BLNKS ASC 20, 
      ASC 19, 
ONE   DEC 1 
GLBL  OCT 077777    REPRESENTATION OF GLOBAL IN TAT 
ADGBE DEF GBE 
ADGBO DEF GBO 
SUB1  DEC -1
LGOTK EQU 1765B     DISC POINTER TO LG TRACKS 
M177  OCT 177 
M1777 OCT 1777
LGE   ASC 3,  LG
LGO   ASC 4,   LG 
ADLGE DEF LGE 
ADLGO DEF LGO 
INPTR BSS 1         DISC POINTER
JTRAK BSS 1         STARTING TRACK ADDRESS
LGEND BSS 1         LAST TRACK OF LG AREA 
LUD   BSS 1         LOGICAL UNIT CONTAINED IN DISC PTR
LUDSK BSS 1         CURRENT LOGICAL UNIT
NSPTK BSS 1         NUMBER OF SECTORS PER TRACK 
ENTST BSS 1         STARTING TRACK OF ENTRY PTS.
ENTND BSS 1         LAST TRACK OF ENTRY PTS.
D64   DEC 64
TEMP  BSS 1         TEMPORARY STORAGE 
ENTE  ASC 3, ENTS 
ENTO  ASC 4,  ENTS
ADENE DEF ENTE
ADENO DEF ENTO
DSCLB EQU 1761B     DISC ADDRESS OF LIB. ENTRY PTS. 
LIBE  ASC 3,LIBRY 
LIBO  ASC 4, LIBRY
ADLBE DEF LIBE
ADLBO DEF LIBO
DSCUT EQU 1763B     DISC ADDRESS OF RTE LIB PTS.
DSCLN EQU 1762B     # OF USER LIB. ENTRY PTS. 
DSSUP EQU 1764B     # OF SYS. LIB. ENTRY PTS. 
B776C OCT 77600 
B176C OCT 17600 
SUB10 DEC -10 
SFCUN EQU 1767B     LS TRACK POINTER
NAME  ASC 4,
ADNAM DEF NAME
TEMPY BSS 1         TEMPORARY STORAGE 
LST   ASC 24,THE LS TRACK(S) START AT TRACK      OF LU
UNDEF ASC 15,ARE UNDEFINED
ADLST DEF LST+8 
ADUND DEF UNDEF 
M1755 OCT 1755
B40   OCT 40
B1774 OCT 177400
D12   DEC 12
D14   DEC 14
D8    DEC 8 
KEYWD BSS 1         ADDRESS OF KEYWORD BLOCK
FWAK  EQU 1657B     FWA OF KEYWORD TABLE
IDADR BSS 1         ID SEGMENT ADDRESS
NAM3  BSS 1         LOWER PORTION OF ID SEGMENT NAME
SHTID BSS 1         INDICATES LONG OR SHRT ID SEG.
M20   OCT 20
M136  OCT 136 
M26   OCT 26
M46   OCT 46
TYPE  BSS 1         BLANK, &, OR ^
LWMAN BSS 1         LOWMAIN ADDRESS 
MNHGH BSS 1         HIGH MAIN ADDRESS 
LOWBP BSS 1         LOW BASE PAGE ADDRESS 
HGHBP BSS 1         HIGH BASE PAGE ADDRESS
KTRAK BSS 1         DISC PTR. OR SWAPPED DISC ADDRESS 
NSCTS BSS 1         NUMBER OF SECTORS USED ON THE DISC
M22   OCT 22
D127  DEC 127 
D128  DEC 128 
M4    OCT 4 
LSTRK BSS 1         LAST TRACK
WORD  BSS 1 
WORD1 BSS 1 
B2004 OCT 20040 
B2000 OCT 20000 
      END LGTAT 
                                                                                                                                                                                                  