ASMB,R,L,C
      HED PTOPM 91700-16124 REV A * (C) HEWLETT-PACKARD CO. 1976  
      NAM PTOPM,2,30 91700-16124 REV A 760209 
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  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.       *
******************************************************************
      SPC 2 
      ENT PTOPM 
      EXT EXEC
      EXT RNRQ
      EXT D65CL 
      IFZ 
      EXT DBUG
      XIF 
      SPC 5 
* 
* PTOPM 
* SOURCE:91700-18124
* BINARY:91700-16124
* SHANE DICKEY
* JULY 30,1974
* 
*     MODIFIED NOV 1975 BY CHUCK WHELAN 
* 
* 
* Z OPTION INCLUDES DEBUG PACKAGE 
PTOPM NOP 
* 
* 
START LDA B,I       IS P1=I/O CLASS 
      IFZ 
      SZA,RSS       IF ZERO-INITIALIZE CALL-SET UP
      JMP *+3       AND TERMINATE- IF REAL LSTEN
      XIF 
      STA ICLAS     SCHEDULE--SET UP GET AND DO IT
      IFZ 
      JMP GET 
* 
      JSB DBUG      SET UP DBUG 
      DEF *+1 
* 
      JSB EXEC      SAVE RESOURCES AND TERMINATE
      DEF *+4 
      DEF D6
      DEF ZERO
      DEF D1
* 
      JMP START     LSTEN CALL STARTS HERE
      XIF 
* 
* ISSUE GET ON I/O CLASS
* 
GET   JSB DOGET     SUSPEND IN CLASS GET UNTIL REQ. RCVD
ICLAS DEC 4 
      NOP 
      LDA IRBUF+2   SET PARMB REPLY FLAG FOR LATER RETURN 
      IOR MSK5
      STA IRBUF+2 
* 
* IS THIS A NEW REQUEST OR AN ACCEPT/REJECT 
* ON A PREVIOUS ONE?
      AND B1400     SAVE ONLY THE  FLAG FIELD 
      SZA           NEW REQUEST?
      JMP ACREJ     NO, POFF/FINISH 
      LDA IRBUF+2   YES 
      AND D7
      ADA CODEA     ADD ADDRESS OF PROCESS TABLES 
      JMP A,I       AND GO DO IT
* ALL INCOMING NEW PROG/PROG OPEN REQUESTS
* REQUESTS ARE PROCESSED HERE 
* OPEN REQUESTS CONSIST OF THREE BASIC STEPS TO PROCESS 
* THESE ARE : 
*   1) FIND CURRENT LIST SLOT FOR ENTRY(NEW SLOT OR EXISTING ONE) 
*      THEN SET UP C.L. SLOT
*   2)UPDATE THE PARMB TO REFLECT THE C.L. SLOT USED
*   3) SCHEDULE PROGRAM TO RECEIVE REQUEST
* OPEN REQUESTS ARE OF TWO TYPES:PREVIOUSLY EXISTING
* AND NEW REQUESTS. THE FIRST OF THESE IS PROCESSED 
* BEGINNING AT THE LABEL "FOUND" AND THE OTHERS ARE 
* PROCESSED STARTING WITH THE CODE LOCATED AT 
* NOTFD (NOT FOUND) 
* FIRST THE CURRENT LIST MUST BE SEARCHED TO SEE IF 
* THE REQUESTING PROGRAM NETWORD HAS BEEN EXTABLISHED 
* (OR FOUND)
OPENP JSB SERCL     IS THIS AN EXISTING HOOKUP
      JMP NOTFD     NO-NOT FOUND-SET UP NEW ONE 
* 
* SET UP THE"FORM B"OF THE PARMB AND PASS IT ON TO THE USER 
      JSB BPARM     REPLACE NAME WITH I.D. WORDS
* NOTE THAT THE SYSTEM WILL ONLY SCHEDULE A CENTRAL USER
* ONCE I.E. WHEN THE 1ST SATELLITE OPEN IS RECEIVED 
* IF THE CENTRAL USER TERMINATES WITHOUT
* ISSUING A FINIS CALL
* SYSTEM BUFFER SPACE WILL EVENTUALLY BE FILLED 
* BY INCOMING SATELLITE MASTER REQUESTS 
* 
      JMP GET 
* 
* 
* NEW PTOP USERS SET UP HERE
* 
* 
* 
* GET SLOT IN CURRENT LIST
NOTFD CLA,INA 
      STA PRID#     INITIALIZE PROGRAM ID# TO 1 
*  SEARCH FOR EMPTY ENTRY IN CURRENT LIST 
      LDA CRLSA     STARTING TABLE ADDR 
GET1  LDB 0,I 
      CPB M1
      JMP ERMT      ERROR IF TABLE FULL 
      SZB,RSS 
      JMP *+4       IF 1ST IS ZERO, THIS ENTRY IS FREE
      ADA D4        POINT TO NEXT 
      ISZ PRID#     INCREMENT PROGRAM ID #
      JMP GET1      TRY NEXT
      STA ADDR3     SAVE ADDRESS OF THIS ENTRY
      ADA D2
      LDB NNAME+2 
      STB A,I 
      INA 
      STA CLSAD     ADDR OF CLASS # IN TABLE
      DLD NNAME 
ADDR3 EQU *+1 
      DST *         MOVE 1ST 2 WORDS OF NAME
      LDA B13       GET "NEW CLASS" CLASS WORD
      STA CLSAD,I   TO SET UP CALL
* 
      JSB EXEC      GET THE I O CLASS NUMBER
      DEF *+8       BY GETTING AN I-O CLASS 
      DEF D20 
      DEF ZERO
      DEF IRBUF 
      DEF D1
      DEF D1
      DEF D1
CLSAD NOP 
      SZA           HOW WAS THE ALLOCATION ?
      JMP ERMS      BAD, ERROR EXIT 
* CLEAR REQUEST 
      LDA CLSAD,I 
      STA *+2 
      JSB DOGET     THE PREVIOUS WRITE READ LEFT
      NOP           A DUMMY REQUEST IN THE CLASS, CLR IT. 
      NOP           IGNORE ABORT CONDITION
      JSB BPARM 
* 
* SCHEDULE THE PROGRAM
      JSB EXEC
      DEF *+4       SCHEDULE REQUESTED PROGRAM
      DEF D10SB      WITHOUT WAIT & PASS IT 
      DEF ADDR3,I     IT'S I/O CLASS AS PARAMETER 
      DEF CLSAD,I      P1 
* 
* THE PROGRAM MUST BE IN THE DORMANT LIST OR
* AN ERROR EXISTS 
      JMP REMER     ERROR RETURN-RTE TRIED TO ABORT US
      SZA,RSS       IN DORMANT LIST?
      JMP GET       YES 
      CLA,RSS 
REMER CLA,INA       FLG ERROR 
      STA TEMP      INITIALIZE ERROR FLAG 
* REMOVE CLASS REQUEST WITH A GET 
      CLA           CLEAR THE ENTRY IN
      STA ADDR3,I   THE CURRENT LIST
      LDA CLSAD,I   TAKE OFF "DONT DEALLOCATE" BIT
      AND MSK8
      STA UCLA2 
* 
      JSB DOGET     CLEAR THE UNUSED REQUEST FROM THE 
UCLA2 NOP           I/O CLASS ESTABLISHED 
* 
      ISZ TEMP      WOULD HAVE ABORTED
      LDB M43 
      LDA TEMP      ABORT ERROR?
      SZA 
      ADB D2        YES, ERROR -41
      JMP ERR     PROCESS THE ERROR 
* 
* 
PLIST JSB EXEC      WRITE DIRECTORY TO DISC IN LOCN PASSED
      DEF *+7 
      DEF D2
      DEF IRBUF+1   DISC LU 
      DEF CRLST     DIRECTORY ADDRESS 
      DEF D81       DIRECTORY LENGTH
      DEF IRBUF     TRACK ADDRESS 
      DEF IRBUF+3   SECTOR ADDRESS
* 
      JSB RNRQ      NOW START UP REMAT BY CLEARING RN # 
      DEF *+4 
      DEF D4
      DEF IRBUF+4 
      DEF IRBUF+5 
      JMP GET 
      HED ACEPT/REJCT PROC. * (C) HEWLETT-PACKARD CO. 1976
* 
*  HANDLE SLAVE OFF AND FINISH REQUESTS HERE
* 
ACREJ LDA IRBUF+2 
      AND MSK4      MASK OUT THE REST OF THE PARMB
      CPA D10 
      JMP POFF      HANDLE SLAVE OFF
      CPA D9
      RSS 
      JMP ER103     UNRECOGNIZED
* 
FINIT JSB SERCL     IS PROGRAM IN CURRENT LIST? 
      JMP GET       NO, NOT DEFINED 
      JSB FINIS     CLEAN OUT ENTRY IN CURRENT LIST 
      JMP GET 
* 
*  CLEAR ENTRY OUT OF CURRENT LIST, AND ABORT PROGRAM IF IT'S HANGING 
*  ON THE CLASS SO THE CLASS NUMBER CAN BE DEALLOCATED. 
* 
FINIS NOP 
      STB ADDR3     SAVE ADDR OF NAME 
* 
* NOW CLEAR ALL REQUESTS FROM THE I/O CLASS 
* (ONE AT A TIME) AND CAUSE IT TO BE RELEASED 
* 
      LDA CLSAD,I   GET CLASS NUMBER
      IOR B1315     SET BIT 13 & 15 IN CLASS WORD 
      STA TEMP      THEN SAVE FOR CALL
      STA CLFLG     SET CLASS CLEAR FLAG NON-ZERO 
* 
NXGET JSB DOGET     GET REQUEST 
TEMP  NOP 
      JMP ABTIT     FIRST,  PGM MUST BE TERMINATED
* 
      CLB 
      CPB CLFLG     RELEASE PROCESSING COMPLETE?
      JMP FIEND     YES 
      INA,SZA       ALL PENDING REQUESTS CLEARED? 
      JMP NXGET     NO, CLEAR MORE
      STA CLFLG     SET FOR ONE MORE
      LDA TEMP
      AND MSK8      CLEAR NO DE-ALLOCATE FLAG 
      STA TEMP
      JMP NXGET 
* 
*  ABORT USER PROGRAM 
ABTIT JSB EXEC      TERMINATE PROGRAM 
      DEF *+3 
      DEF D6N 
      DEF ADDR3,I 
      CLB,RSS       GET OUT IF WOULD HAVE ABORTED 
      JMP NXGET     NOW RELEASE CLASS # 
* 
FIEND STB ADDR3,I   CLEAR ENTRY IN PTOPM'S LIST 
      JMP FINIS,I    & EXIT 
      SPC 5 
POFF  LDA NNAME     PICK UP ENTRY TO BE CLEARED 
      SZA           CLEAR ENTIRE TABLE? 
      JMP FINIT     NO, CLEAR INDICATED ENTRY 
      LDB CRLS3     POINTER TO CLASS #S 
LOOP  STB CLSAD 
      ADB M3        POINT TO NAME 
      LDA 1,I       GET 1ST WORD OF ENTRY 
      CPA M1        END OF TABLE? 
      JMP GET       YES 
      SZA           SKIP IF THIS SLOT IS EMPTY
      JSB FINIS     OTHERWISE CLEAR & TERMINATE IT
      LDB CLSAD 
      ADB D4        POINT TO NEXT CLASS # 
      JMP LOOP      AND RETURN FOR MORE 
* 
* PROCESS ERRORS AND ABNORMAL CONDITIONS HERE 
* THE B REGISTER CONTAINS THE DETECTED ERROR CODE 
* RECOGNIZED ERROR CONDITIONS 
*   -42  CURRENT LIST FULL-NO ROOM-RETRY
*   -43  PROGRAM NOT IN DORMANT LIST
*   -103 ID#'S IN PARMB OFF OR F.CDE PR PROG ID#,OR SAT#,OR CLASS#
*        FROM VALCK IN ERROR
* FORMAT RETURN PARMB 
* PUT ERROR CODE IN THE PARMB 
* 
* 
* 
ERMS  CLA 
      STA ADDR3,I   CLEAR ENTRY IN CURRENT LIST 
* 
ERMT  LDB M42 
      RSS 
* 
ER103 LDB M103      ILLEGAL PCB 
ERR   STB IRBUF+3   STORE ERROR WORD
* HERE WE CLEAR THE DRIVER TO GET RID OF DATA 
      LDA IRBUF+24
      AND MSK9
      STA TEMP
* 
      JSB D65CL     SEND STOP 
      DEF *+7 
      DEF IRC       CONTROL REQUEST 
      DEF TEMP      CONWORD (=LU) 
      DEF DUMMY 
      DEF DUMMY 
      DEF DUMMY 
      DEF DUMMY 
* 
      JSB ERR1      ERROR RETURN
* 
      LDA IRBUF+24
      AND MSK9
      STA IRBUF+24  CLEAR ALL BUT LU
* 
      LDA IRBUF 
      IOR BTRPY     SET REPLY & FRIENDLY BITS 
      STA IRBUF      INTO STREAM WORD 
* 
      JSB D65CL     SEND THE REPLY
      DEF *+7 
      DEF IRWW
      DEF IRBUF+24  REQ ONLY
      DEF IRBUF 
      DEF IRBFL 
      DEF DUMMY 
      DEF DUMMY 
* 
      JSB ERR1      ERROR RETURN
      JMP GET 
* NOTE: IF PARMB WORD #4 IS RETURNED NON-ZERO 
* (ERROR CONDITION) THE FLAG FIELD (WORD 2), TAG FIELD, 
* AND PROGRAM NAME FIELD WILL NOT BE RELIABLE 
      SPC 5 
ERR1  NOP 
      DST SAVAB     SAVE ERROR CODE FROM A AND B REG. 
      JSB EXEC      OUTPUT ERROR MESSAGE
      DEF *+5 
      DEF D2
      DEF D1
      DEF MESS
      DEF MESSL 
* 
      JMP ERR1,I    RETURN
      SPC 5 
* THIS SUBROUTINE SET'S UP THE PARMB IN A MODIFIED
* B FORMAT SO THAT IT'S ENTRY CAN BE FOUND WHEN IT
* COMES BACK ACCEPTED OR REJECTED FROM THE USER SUBROUTINE
* MODIFY PARMB TO REFLECT C.L. INFORMATION
BPARM NOP 
      LDB PRID#     PICK UP ID# PREVIOUSLY BUILT
      STB IRBUF+5   AND SAVE IT IN PARMB
      LDB CLSAD,I   PICK UP USER I/O CLASS
      STB IRBUF+6   & PUT IN PARMB
      JSB BLATZ     SEND PARMB
      JMP BPARM,I 
      SPC 5 
* VERIFY THAT A READ, WRITE, OR CLOSE REQUEST 
* IS BEING ISSUED ON A VALID TERMINAL PREVIOUSLY
* OPENED AND KNOWN TO THE MONITOR AND IF OK PASS IT TO THE PGM
READP LDA IRBUF+5   PICK UP PROG IO # 
      AND MSK3      MASK ALL BUT LOW ORDER 3 BYTE 
      SZA           IS  I.D. ZERO?
      ADA M21       GREATER THAN 20?
      SSA,RSS 
      JMP ER103   ERROR IF YES
* THE PROGRAM ID IS IN THE RIGHT RANGE-NO FURTHER CHECKING CAN BE 
* DONE ON IT
* NOW CHECK THE REQUESTED I/O CLASS-IT MUST MATCH 
      ADA D20       THE CURRENT LIST INDEX
      ALS,ALS       CONVERT TO CURRENT LIST ADDRESS 
      ADA CRLSA     AND SAVE IN 
      STA ADDR3 
* 
      ADA D3        NOW STEP TO THE CLASS WORD
      STA CLSAD     SAVE ADDR OF CLASS #
      LDA 0,I       GET CLASS # 
      LDB M44       PICK UP ERROR CODE
      CPA NNAME+1   DO THEY MATCH ? 
      CLA,RSS 
      JMP ERR     NO- AN ERROR EXISTS 
* THE PROG ID # AND I/O CLASS APPEAR ALL RIGHT
      CPA ADDR3,I   HAS ENTRY BEEN DELETED? 
      JMP ERR     YES REJECT REQUEST
      JSB BLATZ     SEND PARMB
      JMP GET 
      SPC 5 
BLATZ NOP 
      JSB EXEC      DO A WRITE READ TO
      DEF *+8       PASS REQUEST ON 
      DEF D20       TO THE USER FOR HIS 
      DEF ZERO      NEXT GET
      DEF IRBUF 
      DEF IRBFL 
      DEF DUMMY 
      DEF DUMMY 
      DEF CLSAD,I 
      JMP BLATZ,I 
      SPC 5 
* 
*  DO A CLASS I/O GET 
* 
DOGET NOP 
      JSB EXEC
      DEF *+5 
      DEF D21N
      DEF DOGET,I   CLASS # 
      DEF IRBUF 
      DEF IRBFL 
      RSS           SKIP IF WE COULD HAVE ABORTED 
      ISZ DOGET     ELSE RETURN TO P+2
      ISZ DOGET 
      JMP DOGET,I   RETURN
* 
* THIS SUBROUTINE SEARCHES THE CURRENT LIST 
* ON RETURN 
* B REGISTER POINTS TO THE START OF THE MATCHING
* CURRENT LIST ENTRY
* (NORMAL RETURN ONLY)
* NORMAL RETURN (P+2) 
* ERROR RETURN (P+1)
* 
* 
* THE CURRENT LIST WILL NOW BE SEARCHED FOR 
* A MATCH UNTIL A -1 IS ENCOUNTERED (END OF TABLE)
* 
* 
SERCL NOP 
      CLB 
      STB PRID#     INITIALIZE PROGRAM ID#
      LDB CRLSA 
LOOP1 ISZ PRID# 
      LDA B,I 
      CPA M1
      JMP SERCL,I   NOT FOUND 
* THIS IS A VALID ENTRY SO CHECK NAME & THEN LU 
      CPA NNAME 
      INB,RSS 
      JMP LOOP7+1 
      LDA 1,I 
      CPA NNAME+1 
      INB,RSS 
      JMP LOOP7 
      LDA 1,I 
      CPA NNAME+2 
      JMP DUN       FOUND ONE 
      ADB M1
LOOP7 ADB M1
      ADB D4
      JMP LOOP1 
* 
DUN   INB 
      STB CLSAD     SAVE ADDR OF CLASS #
      ADB M3        B POINTS TO ENTRY IN CURRENT LIST 
      ISZ SERCL 
      JMP SERCL,I 
      HED CONSTANTS AND VARIABLES * (C) HEWLETT-PACKARD CO. 1976
D1    DEC 1 
D2    DEC 2 
D3    DEC 3 
D4    DEC 4 
D6    DEC 6 
D7    DEC 7 
D9    DEC 9 
D10   DEC 10
D20   DEC 20
B1400 OCT 140000
CRLSA DEF CRLST     ADDR OF CURRENT LIST TABLE
CRLS3 DEF CRLST+3   ADDR OF CLASS # IN 1ST ENTRY
CODEA DEF CODES,I 
CODES DEF ER103 
      DEF OPENP 
      DEF READP 
      DEF READP 
      DEF READP 
      DEF PLIST 
      DEF FINIT 
      DEF ER103 
IRBFL DEC 35        REQUEST BUFFER LENGTH 
B13   OCT 020000
BTRPY OCT 044000
B1315 OCT 120000
MSK4  OCT 17
D81   DEC 81
M1    DEC -1
M3    DEC -3
M21   DEC -21 
MESSL DEC -30 
M42   DEC -42 
M43   DEC -43 
M44   DEC -44 
M103  DEC -103
MSK3  OCT 377 
MSK5  OCT 200 
MSK8  OCT 157777
MSK9  OCT 77
CLFLG NOP 
DUMMY OCT 0 
D6N   OCT 100006
D21N  OCT 100025    OP CODE FOR CLASS I/O GET (NO ABORT)
IRC   OCT 100003    STOP CODE 
IRWW  OCT 100002    WRITE CODE
D10SB OCT 100012
PRID# NOP 
* 
IRBUF REP 5 
      OCT 0 
NNAME REP 3 
      OCT 0 
      REP 27
      OCT 0 
A     EQU 0 
B     EQU 1 
ZERO  OCT 0 
MESS  ASC 12,COMM ERROR OUTPUT-PTOPM
      ASC 1,
SAVAB OCT 0,0 
* 
*  20 ENTRIES OF 4 WORDS EACH IN THE CURRENT LIST 
* 
*    EACH ENTRY CONTAINS: 
*     WORDS 1-3 = PROGRAM NAME
*     WORD  4   = ASSIGNED I/O CLASS
*               CRLST BSS 80       INITIALLY ALL ZEROES 
      UNL 
CRLST REP 80
      NOP 
      LST 
      DEC -1        DELIMITER, DON'T REMOVE 
      END PTOPM 
                                                                                                                                                                                                                                                      