|
|
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: 17476 (0x4444)
Notes: pts_type(SC)
Names: »MSUBS.SC«
└─⟦18bf30ff4⟧ Bits:30009692 Philips computer tape "600409"
└─⟦this⟧ »BDKMON/MSUBS.SC«
└─⟦71472ef1e⟧ Bits:30009661 Philips computer tape "600103"
└─⟦this⟧ »BDKMON/MSUBS.SC«
IDENT MSUBS REL=7.2 DATE=77-09-09 UPDATE #0 77-09-09 * ************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * MSUBS = MONITOR SUBROUTINES * * * LEVEL #2 77-09-09 * * RELEASE #7 77-09-09 * ************************************************** * * 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 * -EXIT PROGRAM EXIT * -GETBLK GET A FREE MONITOR BLOCK * -FREBLK SET A MONITOR BLOCK FREE * -FNDDWT FIND DWT ADDRESS * -FNDTID FIND TERMINAL IDENTIFICATION * -TENDIO END I/O * -PFINIT RESTAR DEVICE * -SWL48 SWITCH TO LEVEL 48 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 TENDIO END I/O * ENTRY PFINIT RESTART DEVICE * ENTRY SWL48 SWITCH TO LEVEL 48 * 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 DWTWAT -WAIT/ACTIVATE INDICATOR EXTRN DWTECB -ECB ADDRESS EXTRN DWTTQ =ADDRESS TO TTAB ON QUEUE EXTRN DWTTAB -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 * 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 * LDKL A5,TTMJOB SET TTAB-ADDRESS LDK A3,0 AND GO TO ACTOT EJECT * * * A C T O T * * SUBROUTINE TO ACTIVATE A TERMINAL PROGRAM. * ENTRY PARAMETERS:- * * A1 = PARAMETER * A2 = DISPATCH ADDRESS * A3 = SEGMENT POINTER * A5 = TTAB-ADDRESS * * - 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 EQU * CF A15,SAVE8 SAVE REGISTERS 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 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 CF A15,GETBLK ADKL A5,TTB:PP ACT030 LDR A6,A5 SAVE ADDRSSS LDR* A5,A5 FOLLOW THE QUEUE THREAD RB(NZ) ACT030 TRY NEXT STR A4,A6 SET BLOCK IN QUEUE CMR A4 SET END OF QUEUE 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 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 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 RF 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 RF IHRTN EJECT * * * F N D D W T * * ENTRY PARAMETERS:- * * A5 = TTAB ADDRESS * 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(E) FND200 BRANCH IF FOUND 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(E) FND200 FILE CODE FOUND ADK A6,4 RB FND120 TRY NEXT ENTRY IN CDTAB FND130 SUR A6,A6 RF FND210 FND200 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 * * * 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 * * EJECT * * CHECK IF ANY TERMINAL ON QUEUE FOR THIS DEVICE * TENDIO EQU * CF A15,SAVE8 SAVE A1-A8 ON STACK LD A5,DWTTQ,A6 ANY TASK QUEUED? RF(Z) TEN110 NO 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,/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,ACTOT ACTIVATE TASK 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 * * INTERRUPT SAVE AND HALT MODULE * INTSAV DATA 0 SAVA15 DATA 0 ILLINT 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 HLT END