|
|
DataMuseum.dkPresents historical artifacts from the history of: Philips Data Systems |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Philips Data Systems Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 20016 (0x4e30)
Notes: pts_type(SC)
Names: »MSUBS.SC«
└─⟦c47f25c27⟧ Bits:30009688 Philips computer tape "600318"
└─⟦this⟧ »M:KMDV/MSUBS.SC«
└─⟦efe3a1cfc⟧ Bits:30009667 Philips computer tape "600113"
└─⟦this⟧ »TOSSWORK/MSUBS.SC«
└─⟦fcfed1ed9⟧ Bits:30009706 Philips computer tape "M_167"
└─⟦this⟧ »M:167D/MSUBS.SC«
IDENT MSUBS REL 8.2 78-09-15 870105040820 SWLXY INCLUDED REL 8.1 78-04-21 * ************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * MSUBS = MONITOR SUBROUTINES * * * * * * ************************************************** * * THIS MODULE CONTAINS THE FOLLOWING MONITOR * SUBROUTINES: * * -SAVE8 SAVE 8 REGISTERS ON STACK * -QTJOB QUEUE TERMINAL JOB FOR DISPATCHING * -QMJOB QUEUE MONITOR JOB FOF DISPATCHING * -ACTOT ACTIVATE TERMINAL PROGRAM ON FIFO BASIS * -ACTOTP ACTIVATE TERMINAL PROGRAM ON LIFO BASIS * -EXIT PROGRAM EXIT * -GETBLK GET A FREE MONITOR BLOCK * -FREBLK SET A MONITOR BLOCK FREE * -FNDDWT FIND DWT ADDRESS * -FNDTID FIND TERMINAL IDENTIFICATION * -TABIO ABORT I/O WITH ACTIVATION * -TENDIO END I/O * -PFINIT RESTAR DEVICE * -SWL48 SWITCH TO LEVEL 48 * -SWLXY SWITCH TO LEVEL XY * -HALT HALT MODULE EJECT * *********** * ENTRIES * *********** * * ENTRY SAVE8 SAVE 8 REGISTERS ENTRY QTJOB QUEUE TERMINAL JOB ENTRY QMJOB QUEUE MONITOR JOB ENTRY ACTOT ACTIVATE TERMINAL ENTRY EXIT PROGRAM EXIT ENTRY GETBLK GET BLOCK ENTRY FREBLK SET BLOCK FREE ENTRY FNDDWT FIND DWT ENTRY FNDTID FIND TERMINAL INDENTIFICATION ENTRY TABIO ABORT I/O WITH ACTIVATION ENTRY TENDIO END I/O ENTRY PFINIT RESTART DEVICE ENTRY SWL48 SWITCH TO LEVEL 48 ENTRY SWLXY SWITCH TO LEVEL XY ENTRY ILLINT ILLEGAL INTERRUPT ROUTINE ENTRY INTSAV SAVE AREA LAST INTERRUPT ENTRY HALT HALT-MODULE EJECT * * * ENTRIES TO RESTORE REGISTERS A8-A1 WITHOUT * ENEABLE INTERRUPTS * * ENTRY IHRET8 RESTORE FROM A8 ENTRY IHRET7 A7 ENTRY IHRET6 A6 ENTRY IHRET5 A5 ENTRY IHRET4 A4 ENTRY IHRET3 A3 ENTRY IHRET2 A2 ENTRY IHRET1 A1 ENTRY IHRTN RETURN WITHOUT ENABLE INTERRUPTS EJECT * ************* * EXTERNALS * ************* * * EXTRN DISQUE POINTER TO FIRST PLACE IN DISPATCHER QUEUE EXTRN TTMJOB TTAB-ADDRESS OF MJOB EXTRN TTB:ST TERMINAL STATUS AND PRIORITY LEVEL EXTRN TTB:ID TERMINAL IDENTIFICATION EXTRN TTB:SA SAVE AREA EXTRN TTB:PP POINTER TO PENDING QUEUE EXTRN TTB:TD TERMINAL DEVICE TABLE EXTRN RETUR8 EXTRN FREQUE POINTER TO FIRST FREE MONITOR BLOCK EXTRN DWTST DWT STATUS EXTRN DWTADR -DRIVER ENTRY EXTRN DWTWAT -WAIT/ACTIVATE INDICATOR EXTRN DWTECB -ECB ADDRESS EXTRN DWTTQ =ADDRESS TO TTAB ON QUEUE EXTRN DWTTAB -TTAB ADDRESS EXTRN DWTTDM DM TASK TTAB ADDRESS EXTRN TCTAB TERMINAL CONTROL TABLE EXTRN CDTAB COMMON DEVICE TABLE EXTRN PFTAB TABLE OF DEVICES TO BE RESTARTED EXTRN TTB:SP,TTB:SS EXTRN RTNA15 RETURN AND ENABLE EXTRN TIODM,CHKIND,REQEND DM-ENTRIES * * SOP EQU /2E SOP DEVICE ADDRESS EJECT * * * S A V E 8 * * SUBROUTINE TO SAVE 8 REGISTERS ON STACK * WITHOUT ENABLING INTERRUPTS. * * SAVE8 EQU * INH INHIBIT INTERRUPTS STR A3,A15 STR A4,A15 STR A5,A15 STR A6,A15 STR A7,A15 STR A8,A15 LD A3,16,A15 LOAD P.C. (RETURN ADDRESS) ST A3,SAVE81 AND MODIFY BRANCH ADDRESS ST A2,14,A15 ST A1,16,A15 LD A3,12,A15 RESTORE A3 ABL 0 THIS IS USED TO BRANCH BACK SAVE81 EQU *-2 * EJECT * * * Q T J O B * * SUBROUTINE TO QUEUE TERMINAL JOB FOR DISPATCHING * ENTRY PARAMETER:- * * A5 = TTAB-ADDRESS OF PROGRAM TO BE QUEUED. * * THE REQUESTED JOB IS PUT IN DISPATCHER QUEUE ON * PRIORITY BASIS. WITHIN ONE PRIORITY LEVEL JOB IS * PUT LAST IN QUEUE. * * * QTJOB EQU * INH STR A1,A15 SAVE A1-A3 ON STACK STR A2,A15 STR A3,A15 LDKL A1,DISQUE LOAD QUEUE ANCHOR ADDRESS LC A3,TTB:ST+1,A5 LOAD LEVEL TO BE QUEUED QTJ010 LDR A2,A1 SAVE LAST ADDRESS LDR* A1,A1 FOLLOW THE THREAD RF(Z) QTJ020 END QUEUE FOUND CC A3,TTB:ST+1,A1 COMPARE LEVELS RB(NL) QTJ010 TRY NEXT QTJ020 STR A1,A5 INSET IN QUEUE STR A5,A2 ABL IHRET3 EJECT * * * Q M J O B * * SUBROUTINE TO QUEUE MONITOR JOBS ON LEVEL 49 * ENTRY PARAMETERS:- * * A1 = PARAMETER * * A2 = DISPATCH ADDRESS * * A5 IS SET TO TTAB-ADDRESS OF MONITORJOBS AND THE * SUBROUTINE 'ACTOT' IS USED TO ACTIVATE AND QUEUE THE * JOB. * * * QMJOB EQU * CF A15,SAVE8 LDKL A5,TTMJOB SET TTAB-ADDRESS LDK A3,0 RF ACT02 AND GO TO ACTOT EJECT * * * A C T O T , A C T O T P * * SUBROUTINE TO ACTIVATE A TERMINAL PROGRAM. * ENTRY PARAMETERS:- * * A1 = PARAMETER * A2 = DISPATCH ADDRESS * A3 = SEGMENT POINTER * A5 = TTAB-ADDRESS * A7 = ABORT PARAMETER, 0 IF NO ABORTION OF I/O * * - IF REQUESTED PROGRAM IS NOT ACTIVE THE PROGRAM IS * PUT IN DISPATCHER QUEUE VIA SUBROUTINE 'QTJOB'. * - IF PROGRAM IS ACTIVE, THE REQUEST IS PUT IN A PENDING * QUEUE. * - ACTOT WILL PUT REQUEST IN PENDING QUEUE ON FIFO BASIS * - ACTOTP WILL PUT REQUEST IN PENDING QUEUE ON LIFO BASIS * * ACTOTP EQU * CF A15,SAVE8 SAVE REGISTERS LDK A6,1 INDICATE LIFO RF ACT03 ACTOT EQU * CF A15,SAVE8 SAVE REGISTERS ACT02 LDK A6,0 INDICATE FIFO PENDING QUEUING ACT03 EQU * LD A4,TTB:SA,A5 IS PROGRAM ACTIVE? RF(NZ) ACT020 YES, PUT IN PENDING QUEUE LDR A3,A3 RF(E) ACT05 LD A4,2,A3 LOAD ADDRESS ADR A2,A4 ST A4,TTB:SS,A5 LAST SEGMENT START ACT05 ST A2,TTB:SA,A5 DISPATCH ADDRESS ST A3,TTB:SP,A5 SEGMENT POINTER ST A1,TTB:SA+2,A5 AND PARAMETER LD A4,TTB:ID,A5 SET TERMINAL ID ST A4,TTB:SA+4,A5 TO A2 IN SAVE AREA ST A7,TTB:SA+14,A5 TO A7 IN SAVE AREA CF A15,QTJOB AND QUEUE THE JOB ACT010 ABL IHRET8 EJECT * * * PUT REQUEST IN PENDING QUEUE. * ACT020 CF A15,GETBLK GET A FREE BLOCK LDR A2,A4 LDR A1,A7 ABORT PARAMETER CF A15,GETBLK ADKL A5,TTB:PP ACT030 LDR A3,A5 SAVE ADDRESS LDR* A5,A5 FOLLOW THE QUEUE THREAD LDR A6,A6 QUEUE ON FIFO BASIS? RF(NZ) ACT040 NO, PUT FIRST IN QUEUE LDR A5,A5 END OF QUEUE? RB(NZ) ACT030 NO, TRY NEXT! ACT040 EQU * STR A4,A3 SET BLOCK IN QUEUE STR A5,A4 RB ACT010 EJECT * * * E X I T * * SUBROUTINE TO SET A PROGRAM FREE AND QUEUE FIRST * PENDING PROGRAM * * ENTRY PARAMETER:- * * A5 = TTAB-ADDRESS * REGISTERS A3 AND A4 ARE LOST * EXIT EQU * INH CM TTB:SA,A5 RESET PROGRAM COUNTER LD A4,TTB:PP,A5 GET PENDING PROGRAM POINTER RF(Z) EXT010 NO PENDING PROGRAM LDR* A3,A4 GET QUEUE THREAD ST A3,TTB:PP,A5 AND SAVE IN PENDING POINTER CF A15,FREBLK RELEASE BLOCK AND GET PARAMS LDR A7,A1 ABORT PARAMETER LDR A4,A2 CF A15,FREBLK CF A15,ACTOT ACTIVATE TERMINAL EXT010 RF GBL020 EJECT * * * G E T B L K * * SUBROUTINE TO GET A FREE BLOCK FROM MONITOR * BLOCK POOL.REGISTERS A3-A1 ARE STORED IN FOUND * FREE BLOCK. * * EXIT PARAMETER:- * * A4 = ADDRESS TO FOUND FREE BLOCK * * * GETBLK EQU * INH STR A5,A15 SAVE A5 LD A4,FREQUE GET FIRST BLOCK IN FREE QUEUE RF(NZ) GBL010 LDK A1,/B HALT PARAMETER CF A15,HALT HALT IF ALL BLOCKS OCCUPIED GBL010 LDR* A5,A4 ST A5,FREQUE TAKE BLOCK OUT OF FREE QUEUE STR A3,A4 STORE A3-A1 IN BLOCK ST A2,2,A4 ST A1,4,A4 LDR* A5,A15 RESTORE A5 GBL020 ABL IHRTN EJECT * * * F R E B L K * * SUBROUTINE TO GET PARAMETERS FROM A MONITOR BLOCK * AND SET THIS BLOCK FREE. * * ENTRY PARAMETER:- * * A4 = BLOCKADDRESS * * EXIT PARAMETERS:- * * A3 = FIRST PARAMETER IN BLOCK * A2 = SECOND " " * A1 = THIRD " " * * FREBLK EQU * INH LDR* A3,A4 UPDATE A3 LD A1,FREQUE STR A1,A4 ST A4,FREQUE SET BLOCK FREE LD A2,2,A4 LD A1,4,A4 ABL IHRTN EJECT * * F N D D W T * * ENTRY PARAMETERS:- * * A5 = TTAB ADDRESS * A7 = ORDER CODE WHEN CALLED FROM DATA MANAGEMENT * A8 = ECB ADDRESS * * EXIT PARAMETERS:- * * A2 = DWT INDEX * A6 = DWT ADDRESS IF FOUND ELSE 0 * FNDDWT STR A1,A15 SAVE A1 LDKL A6,TTB:TD ADR A6,A5 GET ADDRESS TO TERMINAL DEVICE TABLE LDR* A1,A6 GET TABLE LENGTH ADK A6,2 ADDRESS TO FIRST FILE CODE LDR* A2,A8 LOAD FILE CODE FROM ECB FND100 SUK A1,4 RF(N) FND110 FILE CODE NOT IN TTAB CC A2,1,A6 SEARCH IN DEVICE TABLE RF(NE) FND106 BRANCH IF NOT FOUND STR A1,A15 LD A1,2,A6 DWT ADDR LD A1,DWTADR,A1 DRIVER ENTRY CWK A1,TIODM RF(NE) FND200 NOT DM REQ CF A15,CHKIND CHECK INDEX IN DM DMSUBR RF FND200 INDEX OK LDR* A1,A15 FND106 EQU * ADK A6,4 ADDRESS TO NEXT FILE CODE RB FND100 TRY NEXT EJECT * * SEARCH IN COMMON DEVICE TABLE * FND110 LD A6,CDTAB CDTAB ADDRESS LDR* A1,A6 CDTAB LENGTH ADK A6,2 POINTER TO FIRST ENTRY FND120 SUK A1,4 RF(N) FND130 FILE CODE NOT FOUND CC A2,1,A6 RF(NE) FND126 FILE CODE NOT FOUND STR A1,A15 LD A1,2,A6 LD A1,DWTADR,A1 CWK A1,TIODM RF(NE) FND200 NOT DM REQ CF A15,CHKIND CHECK INDEX IN DM RF FND200 INDEX OK LDR* A1,A15 FND126 EQU * ADK A6,4 RB FND120 TRY NEXT ENTRY IN CDTAB FND130 SUR A6,A6 RF FND210 FND200 LDR* A1,A15 RESET STACK LCR A2,A6 LOAD DWT INDEX LD A6,2,A6 LOAD DWT ADDRESS FND210 RF IHRET1 EJECT * * * F N D T I D * * * SUBROUTINE TO FIND TTAB ADDRESS FROM TERMINAL IDENTIFICATION * * * ENTRY PARAMETER: * * A7 = TERMINAL IDNETIFICATION * * * EXIT PARAMETER: * * A2 = TTAB ADDRESS * A2 = 0 INDICATES ILLEGAL IDENTIFICATION * * FNDTID STR A1,A15 SAVE REG. A1 LD* A1,TCTAB TCTAB LENGTH AD A1,TCTAB FTI010 SUK A1,2 CW A1,TCTAB RF(E) FTI030 ALL TTABS EXAMINED LDR* A2,A1 TTAB ADDRESS RB(Z) FTI010 NOT IN SYSTEM CW A7,TTB:ID,A2 COMPARE IDENTIFICATIONS RB(NE) FTI010 NO MATCH. TRY NEXT FTI020 RF IHRET1 FTI030 SUR A2,A2 ILLEGAL IDENTIFICATION RF IHRET1 EJECT * * * T E N D I O , T A B I O * * * THIS MODULE IS CALLED WHEN COMPLETION OF * I/O OCCURS. * * - IF I/O AND ACTIVATION REQUEST:- * * ACTOT IS CALLED TO START THE TASK * * -IF NORMAL I/O WITH WAIT:- * * QTJOB IS CALLED TO QUEUE THE TASK * FOR DISPATCHING WITH THE FOLLOWING PARAMETERS:- * * A5 = TTAB-ADDRESS * * -IF NORMAL I/O WITH NO WAIT:- * * NO ACTION REQUIRED * * IF AN EVENT WAS QUEUED FOR THIS DEVICE (DWTECQ NOT = ZERO) * THAT TASK IS PUT IN DISPATCHER QUEUE TO REPEAT THE LKM INSTRUCTION * * ENTRY PARAMETERS TO THIS SUBROUTINE ARE:- * * A1 = RETURN CODE * A6 = DWT ADDRESS * NO REGISTERS ARE DESTROYED * * N.B. THE ECB RETURN CODE IS UPDATED BY MEANS OF * AN 'ORS' INSTRUCTION * * * TABIO HAS THE SAME FUNCTION AS TENDIO EXCEPT ABORT PARAMETER A7 * WILL BE SET TO 1 BEFORE ACTOT IS CALLED IN CASE OF ACTIVATION. * (FOR TENDIO THE ABORT PARAMETER = 0) EJECT * * CHECK IF ANY TERMINAL ON QUEUE FOR THIS DEVICE * TABIO EQU * CF A15,SAVE8 SAVE REG ON STACK LDK A7,1 ABORT PARAMETER=1 RF TEN100 TENDIO EQU * CF A15,SAVE8 SAVE A1-A8 ON STACK LDK A7,0 ABORT PARAMETER=0 (NO ABORTION) TEN100 EQU * LD A5,DWTTQ,A6 ANY TASK QUEUED? RF(Z) TEN110 NO LD A2,2,A5 TASK STATUS RF(N) TEN105 DM REQUEST NEXT LDKL A2,/800 ATTACH BIT 4 AN A2,DWTST,A6 RF(Z) TEN105 DEVICE NOT ATTACHED CW A5,DWTTAB,A6 ATTACHED TO OTHER TASK? RF(NE) TEN110 YES, DON'T QUEUE TASK TEN105 EQU * LDR* A3,A5 YES: UPDATE QUEUE ANCHOR ADDRESS ST A3,DWTTQ,A6 CF A15,QTJOB QUEUE TASK TO REPEAT REQUEST EJECT * * * UPDATE ECB AND DWT * * TEN110 EQU * LD A5,DWTTAB,A6 GET TTAB ADDRESS FROM DWT LDKL A2,TIODM CW A2,DWTADR,A6 RF(NZ) TEN115 NO DM REQUEST LD A5,DWTTDM,A6 GET TTAB ADDRESS CF A15,REQEND RESET REQ BUSY FOR ALL FILES TEN115 EQU * LDKL A2,/8000 ORS A2,DWTST,A6 INDICATE DEVICE READY IN DWT LDKL A3,/DBFF RESET ECHO-BIT AND BITS 5,6 ANS A3,DWTST,A6 RESET ECHO-BIT IN STATUS DWT LD A3,DWTECB,A6 GET ECB ADDRESS RF(Z) TEN130 BRANCH IF ENTERED FROM ECHO OR RECOVERY ORRS A2,A3 SET EVENT COMPLETED IN ECB ORS A1,8,A3 SET RETURN CODE IN ECB CM DWTECB,A6 RESET ECB ADDRESS EJECT * * CHECK IF WAIT OR ACTIVATION * LD A4,DWTWAT,A6 GET WAIT/ACTIVATE INDICATOR RF(Z) TEN130 NOT WAIT OR ACTIVATION CWK A4,1 RF(E) TEN120 WAIT CF A15,FREBLK ACTIVATE: GET PARAMETER AND DISP ADDR CF A15,ACTOTP ACTIVATE TASK ON LIFO BASIS RF TEN130 RETURN TEN120 EQU * CF A15,QTJOB WAIT: QUEUE TASK FOR DISPATCHING TEN130 EQU * EJECT * * * RESTORE REGISTERS AND RETURN WITHOUT * ENABLE INTERRUPTS * * IHRET8 LDR* A8,A15 IHRET7 LDR* A7,A15 IHRET6 LDR* A6,A15 IHRET5 LDR* A5,A15 IHRET4 LDR* A4,A15 IHRET3 LDR* A3,A15 IHRET2 LDR* A2,A15 IHRET1 LDR* A1,A15 IHRTN INH ADKL A15,4 ADJUST STACK POINTER ABR* A15 AND RETURN EJECT * * * P F I N I T * * SUBROUTINE TO RESTART DEVICES. * * ALL RESTART ROUTINES GIVEN IN TABLE 'PFTAB' ARE CALLED. * REGISTERS A1-A8 ARE AVAILABLE FOR THE RESTART ROUTINES. * * PFINIT EQU * LDK A1,2 SET INDEX TO FIRST ROUTINE PFI100 CW A1,PFTAB CHECK IF LAST RF(NL) PFI110 ALL RESTARTED STR A1,A15 SAVE A1 CFI A15,PFTAB,A1 CALL RESTART MODULE LDR* A1,A15 RESTORE A1 ADK A1,2 NEXT DEVICE RB PFI100 PFI110 RF SWLRTN RETURN WHEN ALL STARTED EJECT * * * S W L 4 8 * * SUBROUTINE TO SWITCH PROGRAM PRIORITY LEVEL TO 48. * * SWL48 EQU * INH STR A1,A15 LDKL A1,/C000 PSW FOR LEVEL 48 ST A1,4,A15 SAVE IT ON A15 STACK LDR* A1,A15 RESTORE A1 SWLRTN ABL RTNA15 RETURN TO CALLER AND ENB * EJECT MSUBS * * * S W L X Y * * SUBROUTINE TO SWITCH PROGRAM PRIORITY LEVEL TO: * :=48 IF LEVEL ON STACK IS >=48 * :=XY " " " " " XY<48 * * SWLXY EQU * INH STR A1,A15 SAVE A1 LDKL A1,/7FF ANS A1,4,A15 CLEAR LEVEL TO BE SET LC A1,28,A15 GET LEVEL FROM STACK ANK A1,/FC CWK A1,/C0 LEVEL IS IN BITS 8-13 RF(NL) LEV48 LEVEL >= 48? ECR A1,A1 NO ORK A1,/C0 SET RUN AND ENABLE FLIP FLOPS (BITS 8&9) * SETLEV EQU * ORS A1,4,A15 SET NEW LEVEL ON STACK LDR* A1,A15 RESTORE A1 RTN A15 * LEV48 EQU * LEVEL WAS >= 48 LDKL A1,/C0C0 SET LEVEL TO 48 AND BITS 8&9 RB SETLEV * EJECT * * INTERRUPT SAVE AND HALT MODULE * INTSAV DATA 0 SAVA15 DATA 0 ILLINT LDK A1,5 HALT PARAMETER CF A15,HALT HALT EQU * CF A15,SAVE8 STR A9,A15 STR A10,A15 STR A11,A15 STR A12,A15 STR A13,A15 STR A14,A15 ST A15,SAVA15 OTR A1,0,SOP INDICATE TYPE OF HALT HLT END