:ST,S,$TC03,5 
ASMB,L,C
      NAM START,7 
      HED ***TCS UTILITIES (MAIN) - 9/74*** 
      ENT START 
      ENT PAUZ,OPEN,TGET,TPUT,CLOSE 
      ENT ALLOC,DFINE,PUSH,POP
      ENT TCNTL,RDISC,WDISC,SEGLD 
      ENT SPLIT 
      ENT RLSCB 
      ENT .MTO
      ENT .LOGA,LOGON,LOGOF 
      ENT .STAT 
      EXT EXEC
      EXT GBUF,PBUF 
      EXT .ENTR 
      EXT CB$ 
      EXT ERR0
      EXT .MORS,.PRR
* 
* CONDITIONAL COMMON FOR IMAGE/2100 
* 
      IFZ 
      COM IMAG1(1024),IMAG2(1),IMAG3(1175),IMAG4(128) 
      XIF 
      COM ISTAT,IPAR,ILU,ILOG 
A     EQU 0 
B     EQU 1 
******* 
******CONTROL BLOCK FORMAT
******
*CB   CONTENT 
* 1   LOGICAL UNIT
* 2   DEVICE TYPE  (REFER TO FOLLOWING) 
* 3   BUSY FLAG 
* 4   WORK BLOCK ADDRESS
* 5   WORK BLOCK PARAMETERS (LEFT BYTE=ID,RIGHT BYTE=TYPE)
* 6   DATA BLOCK #1 ADDRESS 
* 7   DATA BLOCK #1 PARAM.  (LEFT BYTE=ID,RIGHT BYTE=TYPE)
* 8   DATA BLOCK #2 ADDRESS 
* 9   DATA BLOCK #2 PARAM.  (LEFT BYTE=ID,RIGHT BYTE=TYPE)
*10   EQT EXTENSION ADDRESS (LOGICAL/PHYSICAL ONLY) 
*11   READ CONTROL BITS 
*12   WRITE CONTROL BITS
*13   TEMP1 
*14   TEMP2 
*15   TEMP3 
*16   TEMP4 
*17   STACK POINTER 
*18   UTILITIES RETURN  (USED BY 2SAV,2RET) 
*19   STACK ITEM1, WORD 1 - RETURN ADDRESS
*20   STACK ITEM1, WORD 2 - ADDRESS OF CONTROL BLOCK ARRAY
* 
      SKP 
********
* 
*     DEVICE TYPES
* BIT 7=1=INPUT CAPABILITY
* BIT 6=1=OUTPUT CAPABILITY 
* 
*     SYSTEM CONSOLE          300 
*     LOCAL TERMINAL          301 
*     ASYNCH. TERMINAL        302 
*     PAGE MODE TERMINAL      303 
*     SYNCH. LINE CONTROL     304 
*     SPARE                   X05 
*     SPARE                   X06 
*     SPARE                   X07 
*     DISC                    310 
*     MAG TAPE                311 
*     LINE PRINTER            112 
*     READER                  213 
*     PUNCH                   114 
*     READER/PUNCH            315 
*     HARDWIRED SERIAL I/F    316 
********* 
      SKP 
********************************************************************************
*     START SUBROUTINE
* 
*     JSB START 
*     DEF CB        ADDRESS OF CONTROL BLOCK ARRAY
*     DEF SYST      ADDRESS OF CONFIGURATION TABLE
*     JMP CONT      RETURNS HERE USING LAST RESERVED CB 
*     ---           RETURNS HERE FOR EACH ACTIVE CB 
********************************************************************************
CBLOK NOP 
SYST  NOP 
* 
START NOP 
CBL   EQU START     /CB LENGTH (SET BY $STRT) 
MTO   EQU START+1   /MTO/TCS LINK(SET BY $STRT) 
.MTO  EQU START+1 
ICBP  EQU START+2 
ICBX1 EQU START+3 
ICBX2 EQU START+4 
      JSB .ENTR 
      DEF CBLOK 
      JSB EXEC
      DEF *+8 
      DEF RCODE 
      DEF CB$       /SEGMENT NAME SPEC. BY CONFIGURATOR 
      DEF CBLOK 
      DEF SYST
      DEF START 
      DEF SPLT8 
      DEF XSTRT 
XSTRT DEF START 
RCODE DEC 8 
      SKP 
********************************************************************************
* 
*     DEFINE CONTROL BLOCK,WORK BLOCK, AND DATA BLOCKS
* 
* 
*     JSB DFINE 
*     DEF *+2 
*     DEF CB        /ADDRESS OF CONTROL BLOCK ARRAY 
* 
*     CALLING PROGRAM MUST INCLUDE A DEFINITION OF FOUR 
*     DUMMY ARRAYS WHICH ARE USED TO REFERENCE THE
*     CONTROL BLOCK (CB), WORK BLOCK(WB),DATA BLOCK#1 
*     (DB1) AND DATA BLOCK#2 (DB2). ORDER OF DECLARATION
*     MUST BE AS SHOWN. 
* 
*     INTEGER CB(1),WB(1),DB1(1),DB2(1) 
* 
*     CALL DFINE(CB)
********************************************************************************
      NOP 
DFINE NOP 
      JSB .ENTR 
      DEF DFINE-1 
      LDA DFINE-1 
      JSB SETCB 
      JMP DFINE,I 
      SKP 
****************************************************
* 
*     DEVICE OPEN 
* 
*     JSB OPEN
*     DEF *+1 
****************************************************
OPEN  EQU * 
      NOP 
      JSB .ENTR 
      DEF OPEN
      JSB SAVAD     /SAVE ENTRY PARAMETERS
      LDA LU,I      /CHECK FOR SYSTEM CONSOLE 
      CPA P01$
      JSB RTRN     /RETURN TO USER
      JSB DVICE    /DETERMINE DEVICE TYPE 
      JMP OPEN2    /REMOTE TERMINAL 
      JMP OPEN3    /MAGTAPE 
      JMP OPEN4    /LINE PRINTER
      JMP OPEN5    /PUNCH 
      CPA =B213     /READER?
      JMP OPEN3     /YES
OPEN7 EQU * 
      LDB CLEAR    /OTHER 
OPEN6 EQU * 
      CLA 
OPEN1 EQU * 
      JSB CONTL     /ISSUE CONTROL REQ. 
      JSB RTRN      /NO-RETURN TO USER
* 
OPEN3 EQU * 
      LDB DSTAT     /GET DYNAMIC STATUS 
      CLA 
      JSB CONTL 
      LDA ISTAT 
      SLA           /READY? 
      JMP OPEN3     /NO-TRY AGAIN 
      LDA TYPE,I    /YES
      AND RBYT$     /ISOLATE DEVICE TYPE
      CPA =B213     /READER?
      JMP OPEN7     /YES
      LDB RWND      /NO-REWIND MAGTAPE
      JMP OPEN6 
OPEN4 LDB TOF      /TOP OF FORM PRINTER 
      LDA N01$
      JMP OPEN1 
OPEN5 LDB LDR      /GENERATE LEADER 
      JMP OPEN6 
OPEN2 EQU * 
      LDA P01$
      LDB OPENL 
      JSB CONTL     /LINE OPEN(READ)
      LDA AUTO
      LDB OPENL 
      JSB CONTL     /LINE OPEN(AUTO SPEED)
      LDA ISTAT 
      AND RBYT$ 
      SZA,RSS       /OK?
      JSB RTRN      /YES
      CLA 
      LDB LCLOS     /CLOSE LINE 
      JSB CONTL 
      JMP OPEN2     /TRY AGAIN
****************************************************
AUTO  OCT 100001
      SKP 
****************************************************
* 
*     DEVICE CLOSE
* 
*     JSB CLOSE 
*     DEF *+1 
********************************************************************************
CLOSE EQU * 
      NOP 
      JSB .ENTR 
      DEF CLOSE 
      JSB SAVAD     /SAVE ENTRY PARAMETERS
      LDA LU,I
      CPA P01$      /SYSTEM CONSOLE?
      JSB RTRN      /RETURN TO USER 
      JSB DVICE    /DETERMINE DEVICE TYPE 
      JMP CLOS1    /REMOTE TERMINAL 
      JMP CLOS2    /MAGTAPE 
      JMP OPEN4    /LINE PRINTER
      JMP OPEN5    /PUNCH 
      JMP OPEN6-1  /OTHER 
* 
CLOS1 LDB LCLOS    /LINE CLOSE
      JMP OPEN6 
CLOS2 EQU * 
      LDB RWNDX    /REWIND & PLACE OFFLINE
      JMP OPEN6 
* 
DVICE NOP 
      LDA TYPE,I
      AND RBYT$     /ISOLATE DEVICE TYPE
      CPA =B302    /ASYNCH. TERMINAL? 
      JMP DVICE,I 
      CPA =B303    /PAGE MODE TERMINAL? 
      JMP DVICE,I 
      ISZ DVICE 
      CPA =B311    /MAGTAPE?
      JMP DVICE,I 
      ISZ DVICE 
      CPA =B112    /LINE PRINTER? 
      JMP DVICE,I 
      ISZ DVICE 
      CPA =B114    /PUNCH?
      JMP DVICE,I 
      ISZ DVICE 
      JMP DVICE,I 
* 
      SKP 
****************************************************
* 
*     GET RECORD FROM DEVICE
* 
*     JSB TGET
*     DEF *+3 
*     DEF BUFR      BUFFER ADDRESS
*     DEF BUFL      BUFFER LENGTH 
****************************************************
* 
* 
TGET  EQU * 
      NOP 
      LDA TGET
      STA TIO 
      LDA P01$
      STA CODE
      JMP TIO+1 
****************************************************
* 
*     PUT RECORD TO DEVICE
* 
*     JSB TPUT
*     DEF *+3 
*     DEF BUFR      BUFFER ADDRESS
*     DEF BUFL      BUFFER LENGTH 
****************************************************
TPUT  EQU * 
      NOP 
      LDA TPUT
      STA TIO 
      LDA P02$
      STA CODE
      JMP TIO+1 
* 
      SKP 
****************************************************
* 
*     READ/WRITE
* 
****************************************************
      NOP 
      NOP 
TIO   NOP 
      JSB .ENTR 
      DEF TIO-2 
      JSB SAVAD     /SAVE ENTRY PARAMETERS
      LDB CB12,I
      LDA CODE
      CPA P01$
      LDB CB11,I
      ADB LU,I
      STB CONWD 
      JSB MTO,I 
      DEF *+6 
      DEF CODE
      DEF CONWD 
      DEF TIO-2,I 
      DEF TIO-1,I 
      DEF IPAR
      JSB RTRN      /RETURN TO USER 
      SKP 
********************************************************************************
*     DEVICE CONTROL
*     JSB TCNTL 
*     DEF *+3 
*     DEF FUNC      FUNCTION CODE 00FF00
*     DEF PARM1 
*     DEF PARM2 
********************************************************************************
      NOP           /FCTN CODE W/O LU#
      NOP           /LP, MT CNTL PARAM
      NOP           /PARAM FOR LGCL/PHYS INTFC
* 
TCNTL NOP 
      JSB .ENTR 
      DEF TCNTL-3 
      JSB SAVAD 
      LDA TCNTL-1 
      STA PARM
      LDA TCNTL-2,I 
      LDB TCNTL-3,I 
      JSB CNTLX     /CALL 2 PARAMETER ENTRY 
      JSB POP 
      SKP 
********************************************************************************
* 
*     DISC READ 
*     JSB RDISC 
*     DEF *+5 
*     DEF FIL#      MTO FILE NO.
*     DEF SCT#      RELATIVE SECTOR NO. 
*     DEF BUFR      BUFFER ADDRESS
*     DEF BUFL      BUFFER LENGTH 
********************************************************************************
* 
* 
RDISC NOP 
      LDA RDISC 
      STA DISC
      LDA P14$
      STA CODE
      JMP DISC+1
********************************************************************************
* 
*     WRITE DISC
*     JSB WDISC 
*     DEF *+5 
*     DEF FIL#      MTO FILE NO.
*     DEF SCT#      RELATIVE SECTOR NO. 
*     DEF BUFR      BUFFER ADDRESS
*     DEF BUFL      BUFFER LENGTH 
********************************************************************************
* 
WDISC NOP 
      LDA WDISC 
      STA DISC
      LDA P15$
      STA CODE
      JMP DISC+1
* 
P14$  DEC 14
P15$  DEC 15
      SKP 
********************************************************************************
* 
*     DISC READ/WRITE 
* 
********************************************************************************
      NOP           FILE #
      NOP           SECTOR #
      NOP           BUFFER ADDRESS
      NOP           BUFFER LENGTH 
* 
DISC  NOP 
      JSB .ENTR 
      DEF DISC-4
      JSB SAVAD 
      LDA DISC-4,I
      SZA,RSS       /WORK AREA  REQUEST?
      JMP DISC1     /YES
      LDA CODE
      CPA P14$
      JMP DISC2 
      LDA DISC-4    / 
      STA CB13,I    / 
      LDA DISC-3    / 
      STA CB14,I    /SAVE PARAMETERS
      LDA DISC-2    / 
      STA CB15,I    / 
      LDA DISC-1    / 
      STA CB16,I    / 
* 
DISC7 LDA LOCK
      SZA,RSS       /LOCKED OUT?
      JMP DISC8     /NO, CONTINUE.
      JSB PAUZ      /YES. 
      DEF *+1 
      JMP DISC7 
* 
DISC8 LDA CB13,I    / 
      STA DISC-4    / 
      LDA CB14,I    / 
      STA DISC-3    /RESTORE PARAMETERS 
      LDA CB15,I    / 
      STA DISC-2    / 
      LDA CB16,I    / 
      STA DISC-1    / 
      LDA P15$
      STA CODE
* 
DISC2 EQU * 
      LDA DISC-4,I
      CLB 
      SSA,RSS       /LOCK DISC? 
      JMP *+3       /NO.
      CMA,INA       /YES, MAKE FILE # >0. 
      LDB =B100000  /SET TCS LOCK BIT.
      STA TRAK
      LDA P03$
      IOR B 
DISC4 EQU * 
      IOR =B20000   /MAKE IT W/O WAIT 
      STA CONWD     /SET TO REF. USER DISC
      LDA .PRR      /SAVE PRIORITY. 
      STA CB13,I
      JSB MTO,I 
      DEF *+9 
      DEF CODE
      DEF CONWD 
      DEF DISC-2,I
      DEF DISC-1,I
      DEF TRAK
      DEF DISC-3,I
      DEF IPAR
      DEF DISC5 
      JSB STAT
      LDA ISTAT     /TCS ACCEPT IT? 
      SSA 
      JSB POP       /NO.
      LDA CB2,I 
      ADA =B20000   /SET DISC COMPL PENDING 
      STA CB2,I 
      LDB CODE
      CPB P15$      /FILE WRITE?
      SSA,RSS       /YES-LOGGING ENABLED? 
      JMP SUSP      /NO-SUSPEND HIM 
      ADA =B20000   /SET LOG COMPL PENDING
      STA CB2,I 
      LDA P15$      /LOG AT HIGHEST PRIORITY. 
      STA .PRR
      JSB .LOGA,I   /CALL LOG ROUTINE 
      DEF *+6 
      DEF TRAK
      DEF DISC-3,I
      DEF DISC-2,I
      DEF DISC-1,I
      DEF LOCK
* LOG COMPLETE/DISC COMPLETE
DISC6 JSB SETAD 
      LDA CB2,I 
      ADA =B-20000  /DECREMENT COMPLETION COUNT 
      STA CB2,I 
      AND =B60000 
      SZA           /DONE?
      JMP SUSP      /NO 
      LDA CB13,I
      STA .PRR      /RESTORE PRIORITY.
      JSB POP       /YES-RETURN TO CALLER 
DISC5 DEF DISC6 
* 
* 
DISC1 LDA N13$
      ADA CODE      /DETERMINE READ OR WRITE
      CMA,INA 
      STA CODE
      LDA DISC-3,I
      AND RBYT$     /ISOLATE SECTOR 
      STA SCTR
      LDA DISC-3,I
      ALF,ALF 
      AND RBYT$     /ISOLATE TRACK
      STA TRAK
      LDA DISC3 
      STA DISC-3
      LDA P02$
      JMP DISC4 
TRAK  NOP 
DISC3 DEF SCTR
LOCK  OCT 0 
SCTR  NOP 
N13$  DEC -13 
      SKP 
****************************************************
* 
*     ENABLE LOGGING
* 
*     JSB LOGON 
*     DEF *+1 
* 
****************************************************
LOGON EQU * 
      NOP 
      JSB SETAD     /SET CB ADDRESSES 
      LDA .LOGA 
      CPA .LOGB     /LOGGING INITIALIZED? 
      JMP LOGNX     /NO 
      LDA CB2,I     /YES,SET BIT 15(LOGON)
      IOR =B100000
      STA CB2,I 
LOGNX LDB LOGON,I 
      JMP B,I 
.LOGA DEF LOGA
.LOGB DEF LOGA
LOGA  NOP 
      JMP LOGA,I
      SKP 
****************************************************
* 
*     DISABLE LOGGING 
* 
*     JSB LOGOF 
*     DEF *+1 
* 
****************************************************
LOGOF EQU * 
      NOP 
      JSB SETAD     /SET CB ADDRESSES 
      LDA CB2,I 
      RAL,CLE,ERA   /CLEAR LOGGING BIT
      STA CB2,I 
      LDB LOGOF,I 
      JMP B,I 
      SKP 
********************************************************************************
* 
*     SEGMENT LOAD
*     JSB SEGLD 
*     DEF *+2 
*     DEF SEG#      SEGMENT NO. 
*     DEF PRI#      PRIORITY NO.
********************************************************************************
* 
      NOP 
      NOP 
* 
SEGLD NOP 
      JSB .ENTR 
      DEF SEGLD-2 
      LDA .MORS 
      SZA,RSS       /CALL FROM SEGMENT? 
      JMP SGLD1     /YES-DO NOT PUSH STACK
      JSB PUSH      /NO 
      DEF *+2 
      DEF SEGLD-1 
SGLD1 EQU * 
* 
      JSB MTO,I 
      DEF *+4 
      DEF P08$
      DEF SEGLD-2,I 
      DEF SEGLD-1,I 
      JSB POP 
* 
      SKP 
****************************************************
* 
*     CONTROL 
* 
****************************************************
CONTL EQU * 
      NOP 
                                                                      