|
|
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: 20698 (0x50da)
Notes: pts_type(SC)
Names: »MSUBS.SC«
└─⟦48601905a⟧ Bits:30009668 Philips computer tape "600121"
└─⟦this⟧ »M:LP/MSUBS.SC«
└─⟦d2a299635⟧ Bits:30009698 Philips computer tape "600415"
└─⟦this⟧ »M:LP/MSUBS.SC«
IDENT MSUBS REL 10.0 80-03-14 870105041000 * * ************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * MSUBS = MONITOR SUBROUTINES * * * * * ************************************************** * * * THIS MODULE CONTAINS THE FOLLOWING MONITOR * SUBROUTINES: * * -SAVE8 SAVE 8 REGISTERS ON STACK * -QTJOB QUEUE TASK FOR DISPATCHING * -QMJOB QUEUE MONITOR JOB FOR DISPATCHING * -ACTOT ACTIVATE TASK ON FIFO BASIS * -ACTOTP ACTIVATE TASK ON LIFO BASIS * -EXIT PROGRAM EXIT * -GETBLK GET A FREE MONITOR BLOCK * -FREBLK SET A MONITOR BLOCK FREE * -FNDDWT FIND DWT ADDRESS * -FNDTID FIND TASK IDENTIFICATION * -PFINIT RESTART DEVICE * -SWL48 SWITCH TO LEVEL 48 * -SWLXY SWITCH TO LEVEL XY * -HALT HALT MODULE * -RELPAG RELEASE PAGE * EJECT MSUBS * * *********** * ENTRIES * *********** * * ENTRY SAVE8 SAVE 8 REGISTERS ENTRY QTJOB QUEUE TASK ENTRY QMJOB QUEUE MONITOR JOB ENTRY ACTOT ACTIVATE TASK (FIFO) ENTRY ACTOTP ACTIVATE TASK (LIFO) ENTRY EXIT PROGRAM EXIT ENTRY GETBLK GET BLOCK ENTRY FREBLK SET BLOCK FREE ENTRY FNDDWT FIND DWT ENTRY FNDDWD FIND DWT ENTRY FNDTID FIND TASK INDENTIFICATION 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 ENTRY RELPAG RELEASE PAGE ENTRY RELPA2 RELEASE PAGE (2ND ENTRY) ENTRY IHRET8 RESTORE FROM A8 ENTRY IHRET2 A2 ENTRY IHRET1 A1 ENTRY IHRTN RETURN WITHOUT ENABLE INTERRUPTS EJECT MSUBS * * ************* * EXTERNALS * ************* * * EXTRN DISQUE POINTER TO 1ST PLACE IN DISPATCHER QUEUE EXTRN FREQUE POINTER TO FIRST FREE MONITOR BLOCK EXTRN TTABLD LOAD TASK TTAB EXTRN PQEMTY PAGE QUEUE EMPTY FLAG EXTRN PAGQUE FREE PAGE QUEUE EXTRN SEG:PB PAGE BLOCK ADDRESS EXTRN PAG:QB QUEUE LINK BACKWARD EXTRN LKMERR HALT SYSTEM DUE TO FATAL LKM ERROR EXTRN TTMJOB TTAB ADDRESS OF MJOB EXTRN TTB:SB SEGMENT BLOCK POINTER EXTRN TTB:ST TASK STATUS AND PRIORITY LEVEL EXTRN TTB:ID TASK IDENTIFICATION EXTRN TTB:SA SAVE AREA EXTRN TTB:PP POINTER TO PENDING QUEUE EXTRN TTB:TD TERMINAL DEVICE TABLE EXTRN SCTTCT TASK CONTROL TABLE EXTRN SCTCDT COMMON DEVICE TABLE EXTRN PFTAB TABLE OF DEVICES TO BE RESTARTED EJECT MSUBS * * ***************************************** * * CONDITIONAL ASSEMBLY * ***************************************** * * A PROGRAM VERSION USING TOSS MMU PAGING * IS OBTAINED BY SETTING MMUPAG EQU 1. * MMUPAG EQU 0 * * * A PROGRAM VERSION USING THE EXTENDED INSTRUCTION * SET IS OBTAINED BY SETTING CPU852 EQU 0. * CPU852 EQU 0 * * * A PROGRAM VERSION USING TOSS DISC PAGING * IS OBTAINED BY SETTING DSKPAG EQU 1. * DSKPAG EQU 0 * * SOP EQU /2E SOP DEVICE ADDRESS * EJECT MSUBS * * * 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 MSUBS * * * Q T J O B * * SUBROUTINE TO QUEUE TASK 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 * IFT CPU852=1 STR A1,A15 SAVE A1-A3 ON STACK STR A2,A15 STR A3,A15 XIF * IFT CPU852=0 MSR 3,A15 SAVE A1-A3 ON STACK XIF * LDKL A1,DISQUE LOAD QUEUE ANCHOR ADDRESS LDR* A2,A1 GET ADDRESS OF FIRST TASK IN QUEUE RF(Z) QTJ020 DISQUE EMPTY LD A3,TTB:ST+1,A5 GET PRIORITY LEVEL * EJECT MSUBS * * QTJ010 CC A3,TTB:ST+1,A2 COMPARE WITH QUEUED LEVEL RF(L) QTJ020 INSERT LDR A1,A2 SAVE ADDRESS LDR* A2,A1 GET NEXT TTAB ADDRESS IN QUEUE RB(NZ) QTJ010 NOT END OF QUEUE * QTJ020 STR A2,A5 UPDATE QUEUE LINKS STR A5,A1 * IFT CPU852=1 ABL IHRET3 XIF * IFT CPU852=0 MLR 3,A15 RESTORE A1-A3 FROM STACK... RTN A15 ...AND RETURN XIF * EJECT MSUBS * * * 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 MONITOR JOBS AND THE * SUBROUTINE 'ACTOT' IS USED TO ACTIVATE AND QUEUE THE * JOB. * * QMJOB EQU * IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFT CPU852=0 INH MSR 8,A15 SAVE A1-A8 ON STACK XIF * LDKL A5,TTMJOB SET TTAB ADDRESS RF ACT01 * EJECT MSUBS * * * A C T O T , A C T O T P * * SUBROUTINE TO ACTIVATE A TASK. * * ENTRY PARAMETERS: * * A1 = PARAMETER 1 * A2 = DISPATCH ADDRESS * A3 = SEGMENT NUMBER * A4 = PARAMETER 2 * 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 WILL PUT REQUEST IN PENDING QUEUE ON FIFO BASIS. * - ACTOTP WILL PUT REQUEST IN PENDING QUEUE ON LIFO BASIS. * * ACTOTP EQU * IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFT CPU852=0 INH MSR 8,A15 SAVE A1-A8 ON STACK XIF * LDK A6,1 INDICATE LIFO RF ACT03 * EJECT MSUBS * * ACTOT EQU * IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFT CPU852=0 INH MSR 8,A15 SAVE A1-A8 ON STACK XIF * ACT01 LDK A6,0 INDICATE FIFO * ACT03 EQU * LD A7,TTB:SA,A5 GET (OLD) DISPATCH ADDRESS RF(NZ) ACT020 IS PROGRAM ACTIVE ST A1,TTB:SA+2,A5 PARAMETER 1 ST A2,TTB:SA,A5 SAVE (NEW) DISPATCH ADDRESS ST A3,TTB:SA+6,A5 SEGMENT NUMBER ST A4,TTB:SA+8,A5 PARAMETER 2 LD A4,TTB:ID,A5 SET TERMINAL ID ST A4,TTB:SA+4,A5 TO A2 IN SAVE AREA * IFF MMUPAG+DSKPAG=0 CM TTB:SB,A5 INDICATE NOT RUNNING IN ANY SEGMENT XIF * CF A15,QTJOB QUEUE THE JOB * EJECT MSUBS * * ACT010 EQU * IFT CPU852=1 RF IHRET8 RESTORE A1-A8 AND RETURN XIF * IFT CPU852=0 MLR 8,A15 RESTORE A1-A8 FROM STACK... RTN A15 ...AND RETURN XIF * * PUT REQUEST IN PENDING QUEUE * ACT020 LDR A7,A4 SAVE PARAMETER 2 CF A15,GETBLK GET A FREE BLOCK LDR A1,A7 PARAMETER 2 LDR A2,A4 CF A15,GETBLK ADKL A5,TTB:PP * ACT030 LDR A3,A5 SAVE ADDRESS LDR* A5,A5 FOLLOW THE QUEUE THREAD ADK A6,0 SET CR RF(NZ) ACT040 QUEUE ON LIFO BASIS ADK A5,0 SET CR RB(NZ) ACT030 NOT END OF QUEUE * ACT040 EQU * STR A4,A3 SET BLOCK IN QUEUE STR A5,A4 RB ACT010 * EJECT MSUBS * * * E X I T * * SUBROUTINE TO SET A PROGRAM FREE AND QUEUE FIRST * PENDING PROGRAM. * * ENTRY PARAMETER: * * A5 = TTAB ADDRESS * * A3-A4, A7 ARE DESTROYED * * EXIT EQU * CM TTB:SA,A5 RESET PROGRAM COUNTER LD A4,TTB:PP,A5 GET PENDING PROGRAM POINTER RF(Z) IHRTN 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 PARAMETERS LDR A7,A1 SAVE PARAMETER 2 LDR A4,A2 CF A15,FREBLK LDR A4,A7 PARAMETER 2 RB ACTOT ACTIVATE TASK * EJECT MSUBS * * * 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 NO MORE FREE BLOCKS * 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 * IFT CPU852=1 RF IHRTN XIF * IFT CPU852=0 RTN A15 XIF * EJECT MSUBS * * * F R E B L K * * SUBROUTINE TO GET PARAMETERS FROM A MONITOR BLOCK * AND SET THIS BLOCK FREE. * * ENTRY PARAMETER: * * A4 = BLOCK ADDRESS * * 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 * IFT CPU852=1 RF IHRTN XIF * IFT CPU852=0 RTN A15 XIF * EJECT MSUBS * * * F N D D W T * * SUBROUTINE TO FIND A DWT. * * 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 * * * F N D D W D * * ENTRY PARAMETERS: * * A2 = FILE CODE * * EXIT PARAMETERS, SEE FNDDWT * EJECT MSUBS * * FNDDWT EQU * IFT MMUPAG=1 ELR A2,A8 LOAD FILE CODE FROM ECB XIF * IFT MMUPAG=0 LDR* A2,A8 LOAD FILE CODE FROM ECB XIF * STR A1,A15 SAVE A1 LDKL A6,TTB:TD+2 ADR A6,A5 GET ADDRESS TO TERMINAL DEVICE TABLE LD A1,-2,A6 GET TABLE LENGTH * FND100 SUK A1,4 RF(N) FND110 FILE CODE NOT IN TTAB CC A2,1,A6 SEARCH IN DEVICE TABLE RF(E) FND200 FILE CODE FOUND ADK A6,4 ADDRESS TO NEXT FILE CODE RB FND100 TRY NEXT * EJECT MSUBS * * SEARCH IN COMMON DEVICE TABLE * FNDDWD EQU * STR A1,A15 SAVE A1 * FND110 LD A6,SCTCDT 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 ADDRESS TO NEXT FILE CODE RB FND120 TRY NEXT ENTRY IN CDTAB * FND130 LDK A6,0 RF IHRET1 * FND200 EQU * LCR A2,A6 LOAD DWT INDEX LD A6,2,A6 LOAD DWT ADDRESS RF IHRET1 * EJECT MSUBS * * * F N D T I D * * SUBROUTINE TO FIND TTAB ADDRESS FROM TASK IDENTIFICATION. * * ENTRY PARAMETER: * * A7 = TASK IDENTIFICATION * * EXIT PARAMETER: * * A2 = TTAB ADDRESS * A2 = 0 INDICATES ILLEGAL IDENTIFICATION * * FNDTID STR A1,A15 SAVE A1 LD* A1,SCTTCT TCTAB LENGTH AD A1,SCTTCT * FTI010 SUK A1,2 CW A1,SCTTCT RF(E) FTI030 ALL TTABS EXAMINED LDR* A2,A1 TTAB ADDRESS CW A7,TTB:ID,A2 COMPARE IDENTIFICATIONS RB(NE) FTI010 NO MATCH RF IHRET1 * FTI030 LDK A2,0 ILLEGAL IDENTIFICATION RF IHRET1 * EJECT MSUBS * * * RESTORE REGISTERS AND RETURN WITHOUT * ENABLE INTERRUPTS. * * IFT CPU852=1 IHRET8 LDR* A8,A15 LDR* A7,A15 LDR* A6,A15 LDR* A5,A15 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 XIF * IFT CPU852=0 IHRET8 MLR 8,A15 RESTORE A1-A8 FROM STACK... RTN A15 ...AND RETURN * IHRET2 MLR 2,A15 RESTORE A1-A2 FROM STACK... RTN A15 ...AND RETURN * IHRET1 LDR* A1,A15 RESTORE A1 FROM STACK... * IHRTN RTN A15 ...AND RETURN XIF * EJECT MSUBS * * * 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 INH CFI A15,PFTAB,A1 CALL RESTART MODULE LDR* A1,A15 RESTORE A1 ADK A1,2 NEXT DEVICE RB PFI100 * PFI110 RTN A15 RETURN WHEN ALL STARTED * EJECT MSUBS * * * S W L 4 8 * * SWITCH TO LEVEL 48 AND ENABLE. * * SWL48 EQU * STR A1,A15 SAVE A1 * SWL481 EQU * LDKL A1,/C0C0 PSW FOR LEVEL 48 * SWL482 EQU * ST A1,4,A15 SAVE IT ON A15 STACK LDR* A1,A15 RESTORE A1 RTN A15 * EJECT MSUBS * * * S W L X Y * * SWITCH TO LEVEL XY AND ENABLE. * * LEVEL := 48 IF LEVEL ON STACK IS >= 48 * LEVEL := XY " " " " " XY < 48 * * THIS MODULE IS TO BE CALLED WITH 8 REGISTERS ON STACK. * * SWLXY EQU * STR A1,A15 SAVE A1 LC A1,24,A15 GET LEVEL FROM STACK ANK A1,/FC SUK A1,/BC RB(G) SWL481 LD A1,24,A15 ANKL A1,/FFFE SYSTEM MODE BIT RB SWL482 * EJECT MSUBS * * * INTERRUPT SAVE AND HALT MODULE * * INTSAV DATA 0 SAVA15 DATA 0 * ILLINT LDK A1,5 HALT PARAMETER CF A15,HALT * HALT EQU * IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK STR A9,A15 SAVE A9-A14 ON STACK STR A10,A15 STR A11,A15 STR A12,A15 STR A13,A15 STR A14,A15 XIF * IFT CPU852=0 MSR 14,A15 SAVE A1-A14 ON STACK XIF * ST A15,SAVA15 OTR A1,0,SOP INDICATE TYPE OF HALT HLT * EJECT MSUBS * * * R E L P A G * * RELEASE PAGE AND RESTART LDTASK IF PAGQUE WAS EMPTY * * ENTRY PARAMETERS: * * A3 = SEGBLK ADDRESS (PAGBLK ADDRESS IF RELPA2) * A5 = TTAB ADDRESS (RELPA2) * * EXIT PARAMETER: * * A4 IS DESTROYED * * IFT DSKPAG=1 RELPA2 EQU * CM TTB:SB,A5 INDICATE NOT RUNNING IN ANY SEGMENT RF REL:10 * RELPAG EQU * RELEASE PAGE MAIN ENTRY LD A3,SEG:PB,A3 GET PAGE BLOCK ADDRESS * REL:10 EQU * LDKL A4,PAGQUE GET PAGQUE ADDRESS ST A4,PAG:QB,A3 LDR* A4,A4 GET ADDRESS OF FIRST BLOCK IN PAGQUE STR A4,A3 UPDATE QUEUE LINKS ST A3,PAGQUE ST A3,PAG:QB,A4 LD A4,PQEMTY CHECK IF LDTASK IS IN PAUSE STATE RF(Z) REL:20 * EJECT MSUBS * * RESTART LOAD TASK * CM PQEMTY INDICATE PAGE QUEUE NOT EMPTY LDR A4,A5 SAVE A5 LDKL A5,TTABLD GET LDTASK TTAB ADDRESS CF A15,QTJOB RESTART LOAD TASK LDR A5,A4 RESTORE A5 * REL:20 EQU * IFT CPU852=1 RB IHRTN XIF * IFT DSKPAG=1 IFT CPU852=0 RTN A15 XIF * IFT DSKPAG=0 RELPAG EQU * DUMMY ENTRIES TO AVOID ASS. ERR. RELPA2 EQU * ABL LKMERR INDICATE SYSGEN ERROR XIF * * * END