|
|
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: 10954 (0x2aca)
Notes: pts_type(SC)
Names: »TDISP.SC«
└─⟦35fda6e03⟧ Bits:30009701 Philips computer tape "BARCLAY"
└─⟦this⟧ »M:DEMO/TDISP.SC«
└─⟦5c22ed822⟧ Bits:30009675 Philips computer tape "600209"
└─⟦this⟧ »M:DENJ/TDISP.SC«
└─⟦bf903a231⟧ Bits:30009665 Philips computer tape "600109"
└─⟦this⟧ »M:DENJ/TDISP.SC«
IDENT TDISP REL 10.0 80-03-14 870105041000 * * ************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * TDISP = TOSS DISPATCHER * ************************************************** * * * THIS IS THE TASK DISPATCHER IN TOSS. * ENTRY POINT IS 'TDISP' WITH 8 REGISTERS ON A15 STACK. * THE DISPATCHER CHECKS IF THERE IS A TASK IN DISPATCHER * QUEUE WITH HIGHER PRIORITY THAN INTERRUPTED PROGRAM. * - IF SO, THE RUNNING TASK IS QUEUED AND THE HIGHER * PRIORITY TASK IS STARTED. * - IF NOT, RETURN IS GIVEN TO INTERRUPTED PROGRAM. * * ENTRY 'DISEND' CALLS TENDIO BEFORE TDISP. * * ENTRY 'DISIOE' SETS BIT 0 IN A1 BEFORE DISEND. * * ENTRY 'MEXIT' EXITS A MONITOR TASK BEFORE TDISP. * * ENTRY 'QMEXIT' CALLS QTJOB BEFORE EXIT IS MADE ON MONITOR TASK. * * ENTRY 'TEXIT' EXITS A TASK BEFORE TDISP. * * ENTRY 'TPAUSE' SETS A TASK IN PAUSE STATE BEFORE TDISP. * * ENTRY 'ACTDIS' ACTIVATES A TASK BEFORE TDISP. * * ENTRY 'RETUR8' LOADS 8 REGISTERS FROM A15 STACK AND RETURNS. * EJECT TDISP * * *********** * ENTRIES * *********** * * ENTRY TDISP DISPATCHER ENTRY ENTRY TPAUSE PAUSE TASK ENTRY TEXIT EXIT TASK ENTRY MEXIT EXIT MONITOR TASK ENTRY QMEXIT QUEUE TASK AND EXIT MONITOR TASK ENTRY ACTDIS ACTIVATE TASK AND DISPATCH ENTRY DISIOE I/O ERROR ENTRY ENTRY DISEND END I/O AND DISPATCH ENTRY DISQUE POINTER TO FIRST TASK IN DISP. QUEUE ENTRY PRUN TTAB ADDRESS OF RUNNING TASK ENTRY RETUR8 LOAD 8 REGISTERS AND RETURN EJECT TDISP * * ************* * EXTERNALS * ************* * * EXTRN ACTOT ACTIVATE TASK EXTRN TTB:SA SAVE AREA EXTRN TTB:ST STATUS EXTRN TTB:PW PROGRAM STATUS WORD EXTRN TTB:MT MMUTAB EXTRN TTB:CB CURRENT SEGMENT BASE EXTRN TTB:SB SEGMENT BLOCK ADDRESS EXTRN SEG:PB SEGMENT PAGE BLOCK ADDRESS EXTRN PAG:PA PAGE ADDRESS EXTRN PAG:QB PAGE QUEUE BACKWARD POINTER EXTRN TENDIO END I/O EXTRN EXIT PROGRAM EXIT EXTRN QLTDSK ACTIVATE LDTASK AT ENTRY LT:DSK EXTRN QTJOB QUEUE TASK FOR DISPATCHING EXTRN SCTLAP LOGICAL ADDRESS OF CODE PAGE EXTRN SCTMMP MMU TABLE PAGE ENTRY EXTRN SCTNPE NUMBER OF PAGE ENTRIES EJECT TDISP * * ***************************************** * * CONDITIONAL ASSEMBLY * ***************************************** * * A PROGRAM VERSION USING TOSS MMU PAGING * IS OBTAINED BY SETTING MMUPAG EQU 1. * MMUPAG EQU 1 * * * 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 * * * A PROGRAM VERSION PREVENTING SEGMENTS TO MOVE WHEN HAVING * APPLICATION TASKS AT DIFFERENT PRIORITY LEVELS USING THE * SAME SEGMENT IS OBTAINED BY SETTING DIFPRI EQU 1. * DIFPRI EQU 0 * EJECT TDISP * * D I S Q U E * * POINTER TO FIRST TASK IN DISPATCHER QUEUE * DISQUE DATA 0 * * P R U N * * TTAB ADDRESS OF RUNNING TASK * PRUN DATA 0 EJECT TDISP * * R E T U R 8 * * LOAD 8 REGISTERS FROM STACK AND RETURN * RETUR8 EQU * IFT CPU852=0 MLR 8,A15 XIF IFT CPU852=1 LDR* A8,A15 LDR* A7,A15 LDR* A6,A15 LDR* A5,A15 LDR* A4,A15 LDR* A3,A15 LDR* A2,A15 LDR* A1,A15 XIF RTN A15 EJECT TDISP * * Q M E X I T, M E X I T, T E X I T * * DO EXIT ON (MONITOR) TASK AND GO TO TDISP * QMEXIT CF A15,QTJOB QUEUE TASK FOR DISPATCHING * MEXIT INH LD A5,PRUN CM PRUN * TEXIT EQU * CF A15,EXIT RF TDISP * * A C T D I S * * ACTIVATE TASK AND GO TO TDISP * ACTDIS CF A15,ACTOT RF TDISP EJECT TDISP * * D I S I O E * * SET BIT 0 IN ECB RETURN CODE AND GO TO DISEND * DISIOE LDKL A1,/8000 * * D I S E N D * * CALL TENDIO AND GO TO TDISP * DISEND CF A15,TENDIO * * T P A U S E * * PAUSE TASK (I. E. GO TO TDISP) * TPAUSE EQU * EJECT TDISP * * T D I S P * * THIS IS THE DISPATCHER ENTRY * TDISP INH LC A1,18,A15 LOAD PSW FROM STACK ANK A1,/FC SUK A1,/C4 RB(L) RETUR8 LEVEL < 49, MONITOR ROUTINE * * CHECK DISPATCHER QUEUE * TDISCQ LDKL A2,DISQUE LDR* A3,A2 RB(Z) RETUR8 QUEUE EMPTY LD A5,PRUN RF(Z) TDCQ10 IDLE LOOP RUNNING LD A4,TTB:ST+1,A5 COMPARE RUNNING CC A4,TTB:ST+1,A3 AND QUEUED TASK'S PRIORITIES RB(NG) RETUR8 RUNNING HIGHER OR SAME TDCQ10 LDR* A6,A3 QUEUED HIGHER STR A6,A2 REMOVE IT FROM QUEUE IFT DSKPAG=1 LD A1,TTB:SB,A3 GET SEGMENT BLOCK ADDR RF(Z) TDISSW NONE LDR* A7,A1 RF(N) TDISSW SEGMENT LOADED CF A15,QLTDSK SEGM NOT LOADED QUEUE LOAD TASK RB TDISCQ TAKE NEXT TASK INSTEAD XIF EJECT TDISP * * SWITCH TASKS * TDISSW ST A3,PRUN SET NEW RUNNING TASK ADK A5,0 CHECK OLD RUNNING TASK RF(Z) TDISST IDLE LOOP ADK A6,0 QUEUE OLD TASK FIRST ON PRIORITY RF(Z) TDSW20 EMPTY QUEUE TDSW10 CC A4,TTB:ST+1,A6 COMPARE PRIORITIES RF(NG) TDSW20 SAME OR LOWER PRIORITY FOUND LDR A2,A6 LDR* A6,A2 RB(NZ) TDSW10 STILL SOMETHING IN QUEUE TDSW20 STR A5,A2 PUT IN QUEUE STR A6,A5 ST A14,TTB:SA+28,A5 SAVE REGISTERS LDR A14,A5 IFT CPU852=0 MLR 8,A15 MS 13,TTB:SA+2,A14 MLR 2,A15 XIF IFT CPU852=1 LDR* A8,A15 LDR* A7,A15 LDR* A6,A15 LDR* A5,A15 LDR* A4,A15 LDR* A3,A15 LDR* A2,A15 LDR* A1,A15 ST A13,TTB:SA+26,A14 ST A12,TTB:SA+24,A14 ST A11,TTB:SA+22,A14 ST A10,TTB:SA+20,A14 ST A9,TTB:SA+18,A14 ST A8,TTB:SA+16,A14 ST A7,TTB:SA+14,A14 ST A6,TTB:SA+12,A14 ST A5,TTB:SA+10,A14 ST A4,TTB:SA+8,A14 ST A3,TTB:SA+6,A14 ST A2,TTB:SA+4,A14 ST A1,TTB:SA+2,A14 LDR* A2,A15 LDR* A1,A15 XIF ST A1,TTB:SA,A14 AND PC ST A2,TTB:PW,A14 AND PSW IN TTAB IFT DSKPAG+DIFPRI=2 LD A1,TTB:SB,A14 GET SEGM BLOCK ADDR RF(Z) TDISST NONE LDR* A2,A1 GET SEGM STATUS LDKL A3,/1000 TM A2,A3 CHECK IF SEGM USED BY INT TASK RF(NZ) TDISST YES ORRS A3,A1 SET SEGM USED BY INT TASK LD A3,SEG:PB,A1 ST A14,PAG:QB,A3 AND THAT IT WAS THIS TASK XIF EJECT TDISP * * START NEW TASK * TDISST LD A14,PRUN IFT DSKPAG=1 LD A1,TTB:SB,A14 GET SEGM BLOCK ADDR RF(Z) TDST30 NONE LD A4,SEG:PB,A1 GET PAGE BLOCK ADDR IFT DIFPRI=0 LDR* A2,A4 CHECK IF PAGE IN PAGQUE RF(Z) TDST20 NOT IN QUEUE XIF IFT DSKPAG+DIFPRI=2 LDR* A2,A4 CHECK IF PAGE IN PAGQUE RF(NZ) TDST10 YES LDR* A3,A1 NO GET SEGM STATUS ANKL A3,/1000 CHECK IF SEGM USED BY INT TASK RF(Z) TDST20 NO CW A14,PAG:QB,A4 YES CHECK IF IT WAS THIS TASK RF(NE) TDST20 NO XRRS A3,A1 YES RESET USED BY INT TASK RF TDST20 XIF IFT DSKPAG=1 TDST10 LD A3,PAG:QB,A4 TAKE PAGE OUT OF QUEUE STR A2,A3 ST A3,PAG:QB,A2 CMR A4 TDST20 LD A1,PAG:PA,A4 GET PAGE ADDRESS IFT MMUPAG=1 ECR A2,A1 CALC PHYS PAGE ADDR ANK A2,/FC LDR A3,A14 AND MMU PAGE ENTRY IN TTAB AD A3,SCTMMP LD A4,SCTNPE AND GET NUMBER OF ENTRIES TDST22 SCR A2,A3 UPDATE MMU TABLE JUST IN CASE SUK A4,1 RF(Z) TDST25 ADK A2,4 ADK A3,2 RB TDST22 TDST25 EQU * TL TTB:MT,A14 LOAD MMU TABLE SLL A1,2 UPDATE BASE IN T:A ALSO JUST IN CASE ANKL A1,/FFE OR A1,SCTLAP ES* A1,TTB:CB,A14 UPDATE CURRENT SEGMENT BASE RF TDST35 XIF IFT DSKPAG-MMUPAG=1 ST* A1,TTB:CB,A14 UPDATE CURRENT SEGMENT BASE XIF TDST30 EQU * IFT MMUPAG=1 TL TTB:MT,A14 LOAD MMU TABLE XIF TDST35 LD A1,TTB:SA,A14 GET NEW PC LD A2,TTB:PW,A14 AND PSW IFT CPU852=0 MSR 2,A15 PUT PC AND PSW ON STACK ML 14,TTB:SA+2,A14 LOAD REGISTERS XIF IFT CPU852=1 STR A1,A15 PUT PC STR A2,A15 AND PSW ON STACK LD A1,TTB:SA+2,A14 LOAD REGISTERS LD A2,TTB:SA+4,A14 LD A3,TTB:SA+6,A14 LD A4,TTB:SA+8,A14 LD A5,TTB:SA+10,A14 LD A6,TTB:SA+12,A14 LD A7,TTB:SA+14,A14 LD A8,TTB:SA+16,A14 LD A9,TTB:SA+18,A14 LD A10,TTB:SA+20,A14 LD A11,TTB:SA+22,A14 LD A12,TTB:SA+24,A14 LD A13,TTB:SA+26,A14 LD A14,TTB:SA+28,A14 XIF RTN A15 START THE TASK END