:ST,S,$TC01,5 ASMB,R,L,C NAM TCS,7 HED ***TCS - 4/75*** EXT EXEC ENT ENTR,.PQ,.CQ,.LU ENT TCS ENT .TB,TB ENT .MORS,.RST ENT .LOGP,.PRR A EQU 0 B EQU 1 SPC 5 * * * TERMINAL CONTROL SYSTEM * * THIS IS A SCHEDULER FOR PROCESSING I/O REQUESTS IN * A FAST, EFFICIENT MANNER. I/O CALLS WHICH WOULD * NORMALLY GO TO THE EXEC IN DOS-M WILL COME HERE * INSTEAD. THE SCHEDULER CALLS ARE PATTERNED AFTER * DOS-M EXEC CALLS, I.E., THE PARAMETERS ARE SIMILAR. * * HED ***EQUATE TABLES*** * * * LOGICAL UNIT TABLE. THIS IS AN INTERNAL TABLE WITH A 3 * ------------------- WORD ENTRY FOR EACH I/O DEVICE. * * WORD CONTENTS OF ONE TABLE ENTRY. * ---- ---------------------------- * 1 0 (FREE), -1 (LOCKED,FREE), CALLER RETURN ADDR. (BUSY) * 2 PARAMETER (15-8) LOCK BIT (7) SEGMENT # (6-0) * 3 MAIN RETURN ADDRESS * LUL EQU 3 LENGTH OF ONE ENTRY. LUMR EQU LUL-1 OFFSET TO MAIN RETURN ADDRESS. LUSN EQU LUMR-1 OFFSET TO PARAM & SEG #. LULM OCT 200 LOCK FLAG SET MASK. LULC OCT 177577 LOCK FLAG CLEAR MASK. LUTL EQU 48 * LU BSS 144 INITIALIZED TO ZERO BY REPS UNL LU REP 144 OCT 0 LST .LU DEF LU ADDRESS OF LU TABLE. .CLU OCT 0 ADDRESS OF CURRENT LU ENTRY. SPC 2 * * PENDING QUEUE. A BUFFER SUPPLIED BY THE USER, LARGE * ENOUGH FOR HIS APPLICATION. OVERFLOW WILL * CAUSE AN ERROR RETURN TO THE USER. THE * USER SHOULD ESTABLISH SENSITIVITY CRITERIA TO * AVOID OVERFLOW CONDITIONS. FOR EXAMPLE, PRIOR * TO MAKING A BLOCK OF REQUESTS, THE CURRENT ENTRY * POINTER COULD BE COMPARED TO THE 3/4 FULL * ADDRESS. IF THE QUEUE IS THAT FULL, THEN WAIT * UNTIL THE SYSTEM IS LESS BUSY. * * WORD CONTENTS OF ONE PENDING QUEUE ENTRY. * ---- ------------------------------------ * * SEE USER MANUAL FOR QUEUE ENTRY FORMAT * * PQL EQU 9 LENGTH OF PENDING QUEUE ENTRY. PQLM DEC -9 DECREMENT VALUE = -PQL. MAXPQ BSS 1 MAXIMUM # OF PQ ENTRIES. PQC BSS 1 ADDRESS OF CURRENT PQ COUNT. .PQ BSS 1 ADDRESS OF PQ TABLE (INIT. SEG.). CPQE BSS 1 ADDRESS OF THE CURRENT PQ ENTRY PRIOR OCT 0 FOR PRIORITY LEVEL * ADDRESS. .PRR EQU PRIOR SPC 2 * * CURRENT QUEUE DEFINTION. * CQL EQU LUTL # OF ENTRIES IN CURRENT QUEUE. * CQ BSS 48 INITIALIZED TO ZERO BY REPS UNL CQ REP 48 OCT 0 LST .CQ DEF CQ ADDRESS OF CQ TABLE. .CCQ OCT 0 ADDRESS OF CURRENT CQ ENTRY. CCQE DEF CQ FIRST FREE ENTRY IN CQ. SPC 2 * * CURRENT CORE ALLOCATION DESCRIPTORS. * MORS DEC -1 MAIN(-1) OR SEGMENT(0) EXECUTING. SEG OCT 0 # OF SEGMENT NOW IN CORE. CSEG OCT 0 SEGMENT DIRECTORY ADDRESS FOR SEG. CMR OCT 0 MAIN RETURN ADDRESS FRO SEG. CEC OCT 0 CURRENT EXEC CALL REQUEST CODE. CREQ OCT 0 REQUEST CODE. .MORS EQU MORS SPC 2 * * RETURN DESCRIPTORS. * RFLG OCT 0 RETURN FLAG. 0 => NO RETURN. FRET OCT 0 FINAL RETURN ADDRESS. RS# OCT 0 RETURN SEGMENT #. RSDA OCT 0 RETURN SEG. DIRECTORY ADDRESS. RPAR OCT 0 " PARAMETER. RST OCT 0 " STATUS. RLOG OCT 0 TRANSMISSION LOG FOR XFER. .RST DEF RST SPC 1 * * USER TABLE DESCRIPTION. * .SD OCT 0 SEG DIRECTORY ADRESS. SDL EQU 11 SEGMENT DIRECTORY ENTRY LENGTH UFDS EQU 3 FILE DIRECTORY ENTRY LENGTH .FD DEF FD FILE DIRECTORY ADDR. * * IN CORE DIRECTORY DEFINITION * FOR FILES * WORD 1 - TRACK/SECTOR (8/8) * WORD 2 - USER DISC SUBCHANNEL * WORD 3 - FILE LENGTH IN SECTORS * * * THE FOLLOWING ARE SET UP AFTER INITIALISATION. * NSEG OCT 0 NUMBER OF USER SEGMENTS. UNL FD REP 48 OCT 0 LST * FD BSS 48 HED ***CALLING SEQUENCES*** * VALID REQUEST CALLS * ------------------- * * NOTE: FOR ASSEMBLY LANGUAGE PROGRAMS, THE ADDRESSES OF THE * VARIABLES MUST BE PASSED, NOT THE VARIABLES THEMSELVES. * THIS CONFORMS TO HP FORTRAN FORMAT. * SPC 1 * INITIALIZE (REQ. CODE = 82) * JSB TCS * DEF *+9 * DEF RCODE REQUEST CODE. * DEF PQ START OF PENDING QUEUE BUFFER. * DEF MAXPQ MAX. NUMBER OF PQ ENTRIES. * DEF PQCNT VARIABLE = CURRENT # OF PQ ENTRIES. * DEF SNAM SEGMENT NAME ARRAY (3 WORD NAMES). * DEF SNUM NUMBER OF SEGMENTS. * DEF SDIR SEGMENT DIRECTORY (11 WORDS PER SEGMENT). * * * OPEN FILE REQUEST ( REQ. CODE = 84 DECIMAL) * JSB TCS * DEF *+4 * DEF RCODE * DEF FNAM ARRAY (3 WORDS) HOLDING FILE NAME * DEF FNUM RELATIVE NUMBER IN FILE DIRECTORY * * * PRIORITY LEVEL CHANGE REQUEST * JSB TCS * DEF *+3 * DEF RCODE REQUEST CODE = 71(DECIMAL) * DEF PRITY PRIORITY ( RANGE= 0 TO 15) * * * READ/WRITE (REQ. CODE = 1-READ/2-WRITE) ***NOTE: IN ALL I/O CALLS, BUFFER LENGTH MUST BE NON-ZERO*** * JSB TCS * DEF *+6 OR 7 OR 8 OR 9 * DEF RCODE ADDRESS OF REQUEST CODE. * DEF CONWD ADDRESS OF CONTROL WORD (AS IN DOS-M BIT 15=1LOC) * DEF BUFFR ADDRESS OF USER BUFFR (IN COMMON CORE) * DEF BUFFL ADDRESS OF TRASFER LENGTH(WORDS+ BYTES-) * DEF DTRAK ADDRESS OF DISK TRACK VARIABLE (OPTIONAL) * DEF DSECT ADDRESS OF DISK SECTOR VARIABLE (OPTIONAL) * DEF IDENT SEE LATER * DEF IRET SEE LATER * * * I/O CONTROL (REQ. CODE = 3) * JSB TCS * DEF *+5 OR 6 * DEF RCODE ADDRESS OF REQUEST CODE. * DEF CONWD ADDR.OF CONTROL WORD(AS DOS-M BUT BIT15=1 LOCK) * DEF PARAM ADDR OF OPTIONAL PARAM (AS IN DOS-M) * DEF IDENT SEE LATER * DEF IRET SEE LATER * * SEGMENT LOAD (REQ. CODE = 8) * JSB TCS * DEF *+3 OR 4 * DEF RCODE ADDRESS OF REQUEST CODE. * DEF SEGN RELATIVE # OF SEG. DIR. ENTRY (1 TO N). * DEF PRITY PRIORITY TO BE ASSIGNED TO SEGMENT ( OPTIONAL) * * FILE READ/WRITE (REQ. CODE = 14-READ/15-WRITE) * JSB TCS * DEF *+8 OR 9 * DEF RCODE ADDRESS OF REQUEST CODE. * DEF CONWD ADDRESS OF CONWD (AS DOS-M BUT BIT15=1 IS LOCK) * DEF BUFFR ADDRESS OF BUFFER * DEF BUFFL ADDRESS OF BUFFER LENGTH (WORDS+ BYTES-) * DEF FNUM RELATIVE # OF FILE DIR. ENTRY (1 TO N). * DEF RSECT ADDRESS OF VARIABLE HOLDING RELATIVE SECTOR * DEF IDENT SEE LATER * DEF IRET SEE LATER * * * UNLOCK I/O DEVICE (REQ. CODE = 52) * JSB TCS * DEF *+3 * DEF RCODE ADDRESS OF REQUEST CODE. * DEF LU ADDRESS OF VARIABLE HOLDING LOG.UNIT # * * * SUSPEND TILL I/O (REQ. CODE = 53) * JSB TCS * DEF *+2 * DEF RCODE ADDRESS OF REQUEST CODE. * * IN-LINE RETURN TO MAIN (REQ. CODE = 54) * JSB TCS * DEF *+2 * DEF RCODE ADDRESS OF REQUEST CODE. * * STATUS CALL (REQ. CODE = 79) * JSB TCS * DEF *+6 * DEF RCODE ADDRESS OF REQUEST CODE. * DEF STATS FOR RETURNED STATUS. * DEF PARAM FOR ORIGINAL PARAM. IN USER CALL. * DEF LUN FOR LOGICAL UNIT #. * DEF LOG TRANSMISSION LOG (WORDS XMITTED). * * PAUSE * JSB TCS REQUEST CODE =1 * DEF *+6 * DEF RCODE * DEF ILU ILU=77 OCTAL * DEF 1 * DEF 1 * DEF IDENT SEE LATER * * * * "IDENT" IS THE VARIABLE HOLDING A PARAMETER (VALUE 0-256) * WHICH IS AVAILABLE TO THE USER IN A STATUS CALL * * "IRET" IS A VARIABLE USED WITH I/O WITHOUT WAIT CALLS, IT * CONTAINS THE ADDRESS TO BE CALLED WHEN I/O IS COMPLETE * HED ***DEBUG TABLE*** * * THE FOLLOWING TABLE IS MERELY TO HELP USERS DEBUG PROGRAMS * .TB DEF TB TB NOP # OF CALLS TO TCS TB1 NOP # OF I/O CALLS TO TCS TB2 NOP # OF DISK CALLS (INCL. FILE REQS BUT NOT SEG LOADS) * NOT SEGMENT LOADS TB3 NOP # OF FILE REQUESTS TB4 NOP # OF USER SEGMENT LOADS TB5 NOP # OF SEGMENT LOADS (USER&SYSTEM) TB6 NOP # OF FILE OPENS ATTEMPTED TB7 NOP # OF I/O REQUESTS STARTED TB8 NOP # OF I/O REQUESTS COMPLETED HED ***BASE PAGE*** * * BASE PAGE LOCATIONS USED * # EQU 53B N01$ EQU #-1 N02$ EQU #-2 N03$ EQU #-3 N04$ EQU #-4 N05$ EQU #-5 N06$ EQU #-6 N07$ EQU #-7 N08$ EQU #-8 N09$ EQU #-9 * P00$ EQU # P01$ EQU #+1 P02$ EQU #+2 P03$ EQU #+3 P04$ EQU #+4 P05$ EQU #+5 P06$ EQU #+6 P07$ EQU #+7 P08$ EQU #+8 P09$ EQU #+9 * M17$ EQU 70B M37$ EQU 71B (7905) M77$ EQU 72B M177$ EQU 73B M377$ EQU 74B * SYSBF EQU 115B SECTR EQU 116B UDNTS EQU 157B CUDSC EQU 161B CUDLA EQU 163B DISCL EQU 200B SYSSC EQU 155B ************** * N09$ DEC -9 * N07$ DEC -7 * N06$ DEC -6 * N05$ DEC -5 * N04$ DEC -4 * N03$ DEC -3 * N02$ DEC -2 * N01$ DEC -1 * P02$ DEC 2 * P03$ DEC 3 * P04$ DEC 4 * P05$ DEC 5 * P06$ DEC 6 * P08$ DEC 8 * M17$ OCT 17 * M77$ OCT 77 * M177$ OCT 177 * M377$ OCT 377 * *SYSBF "SYSBF" SYSTEM BUFFER TRACK/SECTOR *SECTR "SECTR" NUMBER OF SECTORS/DISK TRACK *UDNTS "UDNTS" NEXT USER DISK TRACK/SECTOR *CUDSC "CUDSC" CURRENT USER DISK SUBCHANNEL *CUDLA "CUDLA" CURRENT USER DISK LAST ACCESS *DISCL "DISCL" USER LABEL TRACK/SECTOR * * ERROR STATUS DEFINITIONS. * ERR1 EQU N01$ ERR2 EQU N02$ ERR3 EQU N03$ ERR4 EQU N04$ ERR5 EQU N05$ ERR6 EQU N06$ ERR7 EQU N07$ * HED ***TCS MAIN CONTROL*** * * * * MAIN ENTRY INTO TCS * * SPC 3 TCS NOP ENTRY POINT JSB ENTR GO GET PARAMETERS DEF *+11 ARG1 NOP FOR ADDRESSES- ARG2 NOP ARG3 NOP OF PARAMETERS- ARG4 NOP ARG5 NOP TO BE PASSED - ARG6 NOP ARG7 NOP FROM CALLING - ARG8 NOP ARG9 NOP PROGRAM BY ENTR. ARG10 NOP * * * NOW SAVE THE REQUEST CODE * LDA ARG1,I GET THE REQUEST CODE STA CREQ SAVE IT * * UPDATE DEBUG TABLE * ISZ TB # OF TCS CALLS NOP JUST IN CASE * * CHECK IF ITS AN INITIALISATION REQUEST. * CPA =D82 RSS YES SO SKIP JMP ME SEE IF ITS A STATUS REQ. * LDA ARG7 GET ADDR OF SEG. DIRECTORY STA .SD LDA ARG2 SET ACTUAL CPQE VARIABLE STA .PQ TO .PQ-9, AND SET THE ADA PQLM LOCAL CPQE TO POINT STA CPQE TO THE VARIABLE. LDA ARG3,I SAVE MAXIMUM STA MAXPQ # OF PQ ENTRIES. LDA ARG4 STA PQC SET UP PQ COUNT ADDRESS. SKP * NOW INITIALIZE SEGMENT DIRECTORY. * CLA STA PQC,I CLEAR PQ COUNT STA RST CLEAR RETURN STATUS. LDA ARG5 STA NAMAD LDA ARG6,I GET # OF SEGS. SZA,RSS JMP MZ EXIT IF NO SEGS. STA NSEG CMA,INA ARG7 := -# OF STA ARG6 SEGMENTS * * SET UP THE IN-CORE SEGMENT DIRECTORY. * LOOP1 JSB EXEC PERFORM A FILE DEF *+4 NAME SEARCH. DEF SERCH NAMAD BSS 1 DEF ARG1 LDA ARG1 FILE SZA OK ? JMP GON YES. GO ON. H1 LDA ERR1 GET ERROR 1 CODE STA RST JMP MZ SPC 1 GON LDA NAMAD INCREMENT ADA P03$ NAMAD STA NAMAD BY 3. * * NOTE: AT THIS POINT, THE BREG POINTS TO THE FOURTH * WORD OF THE SYSTEM DIRECTORY ENTRY. * ADB N03$ (-3) LDA M11 SET UP -11 IN STA ARG2 ARG2 FOR THE MOVE. LOOP2 LDA B,I GET A WORD AND STA ARG7,I STORE IT IN THE INB SEGMENT DIRECTORY. ISZ ARG7 ISZ ARG2 JMP LOOP2 LDB ARG7 INSERT THE UD INTO ADB N09$ (-9) LDA B,I THE BOTTOM 5 BITS (7905) AND =B177740 OF THE 3RD WORD (7905) IOR CUDSC (UD # ON BASE PAGE) STA B,I ISZ ARG6 DONE? JMP LOOP1 NO. CHECK NEXT SEGMENT NAME. JMP MZ YES. * SERCH DEC 18 FILE NAME SEARCH CODE. M11 DEC -11 SKP * * SEE IF IT IS A STATUS REQUEST * ME CPA =D79 IS A STATS REQ.? RSS YES SO SKIP JMP MB NO IT ISNT * * * PASS STATUS PARAMETERS AND EXIT. * LDA RST PUT STATUS INTO STA ARG2,I 1ST USER PARAMETER. LDB ENUM CPB P02$ ONLY 1 PARAM(STATUS) JMP MZ YES SO EXIT LDA RPAR PUT THE USER IDENT PARAM STA ARG3,I INTO 2ND PARAMETER. LDA RLU PUT LU # INTO STA ARG4,I 3RD USER PARAMETER. LDA RLOG PUT TRANSMISSION LOG INTO STA ARG5,I 4TH USER PARAMETER. JMP MZ GO TO EXIT SPC 2 * * * SEE IF ITS A PRIORITY REQUEST * MB CPA =D71 IS IT? RSS YES SO SKIP JMP MT NO SO CARRY ON CHECKING * LDA ARG2,I GET PRIORITY AND M17$ ENSURE CORRECT RANGE STA PRIOR STORE IT * JMP MZ GO TO EXIT * * * SEE IF ITS AN OPEN FILE REQUEST * MT CPA =D84 IS AN OPEN FILE REQUEST? JMP MY YES CLA STA RST ETC. STA RLU * * SEE IF ITS AN INCORE REQUEST * JSB ACOD * * ON RETURN A REG IS ZERO IF REQUEST HAS BEEN DONE * SZA,RSS IS DONE ? JMP MOUT YES * * CALL ROUTINE'B' TO SEE IF IT'S A SEGMENT LOAD * JSB BCOD * * ON RETURN A REG IS ZERO IF REQUEST HAS BEEN DONE * SZA,RSS IS DONE JMP MOUT YES * * CALL ROUTINE'C' TO SEE IF IT'S AN I/O REQUEST * JSB CCOD * * ON RETURN A REG IS ZERO IF REQUEST HAS BEEN DONE * SZA,RSS IS DONE JMP MOUT YES * * INVALID REQUEST. SET USER STATUS TO ERR3 AND RETURN. * LDA ERR3 GET ERROR CODE STA RST PUT IN STATUS MZ LDA TCS GET RETURN ADDR. STA FRET STORE IT * * THIS IS THE ONLY RETURN FROM TCS. * MOUT CLA CLB JMP FRET,I RETURN TO USER. * .ARG1 DEF ARG1 SPC 5 * * PROCESS FILE OPEN REQUESTS * MY LDA ARG3,I GET FILE # ADA N01$ SUBTRACT 1 MPY =LUFDS MULT BY ENTRY LENGTH ADA .FD ADD DIREC. ADDR. STA MET SAVE * CLA STA RST CLEAR RETURN STATUS * * UPDATE DEBUG TABLE * ISZ TB6 NOP * LDA ARG2 ADDR OF FILE NAME STA FNME JSB EXEC SEARCH FOR- DEF *+4 FILE- DEF SERCH DIRECTORY. FNME OCT 0 DEF ARG1 * LDA ARG1 FILE- SZA,RSS OK? JMP H1 NO * * BREG POINTS TO FOURTH WORD OF DIREC * ENTRY(EG TRACK AND SECTOR) * LDA B,I STA MET,I PUT IN DIRECTORY LDA CUDSC GET USER SUBCHAN. ISZ MET STA MET,I PUT IN DIRECTORY INB LDA B,I GET FILE LENGTH ISZ MET STA MET,I PUT IN DIRECTORY LDB ARG2 GET ADDR OF FILE NAME. LDA ARG3,I GET FILE NUMBER FOR LOG UTIL. JSB .LOGP,I * * ALL DONE SO EXIT * JMP MZ * * MET NOP * .LOGP DEF LOGP DUMMY LOGP TILL LOGGING LOGP NOP IS INITIATED JMP LOGP,I HED ***FAST PARAMETER TRANSFER*** * * * ENUM WILL HOLD THE # OF PARAMS TRANSFERRED AFTER COMPLETION * * * * EPAR WILL HOLD THE ADDRESS OF THE FIRST USER PARAM (DEF*+N) * * * * ************************************** * * * ROUTINE TO TRANSFER PARAMETER ADDRESSES. * * * CALLING SEQUENCE * * * * JSB ENTR * * DEF *+N * * BSS N-1 FOR PARAMETERS * * * ************************************** SPC 3 * FIND # OF PARAS WE HAVE SPACE FOR ENTR NOP ENTRY POINT LDB ENTR,I GET DEF *?N PARAMETER CMB,INB MAKE -VE ADB ENTR STB TEMP SAVE * * NOW FIND # OF PARAMS IN USER CALL LDA ENTR ADA =D-2 STA TEMP2 LDB 0,I LDA 1,I CMB ADA 1 * * NOW FIND WHICH # OF PARAMS IS LEAST * LDB 0 ADA TEMP SSA JMP E1 LDB TEMP CMB E1 STB ENUM * * ENUM NOW CONTAINS THE # OF PARAMS * * SET UP SOURCE ADDR IN TEMP3 AND SET * * UP ADDR OF FIRST USER PARAM (DEF *+N) * * IN EPAR * LDA TEMP2,I STA EPAR LDB 0,I STB TEMP2,I SET UP USER RETURN INA STA TEMP3 * * NOW SEE IF THERE ARE ANY PARAMS TO TRANSFER * LDA ENUM SZA,RSS ANY JMP E4 NO * * SET UP FINAL DEST IN TEMP2 * LDA ENTR 2002 ADA ENUM 2006 STA TEMP2 2006