|
|
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: 14178 (0x3762)
Notes: pts_type(SC)
Names: »TDISPO.SC«
└─⟦efe3a1cfc⟧ Bits:30009667 Philips computer tape "600113"
└─⟦this⟧ »TOSSWORK/TDISPO.SC«
IDENT TDISPO REL 8.2 78-09-15 870105040820 * ************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * TDISP = TERMINAL DISPATCHER * * * * * * ************************************************** * * * * THIS IS THE TERMINAL DISPATCHER IN TOSS. * ENTRY POINT IS 'TDISP' WITH 8 REGISTERS ON A15 STACK. * THE DISPATCHER CHECKS IF THERE IS A JOB IN DISPATCHER- * QUEUE WITH HIGHER PRIORITY THAN INTERRUPTED PROGRAM. * - IF SO THE QUEUED PROGRAM IS STARTED AND REGISTERS * A1-A14 OF INTERRUPTED PROGRAM ARE SAVED ON A15 STACK. * - IF NOT RETURN IS GIVEN TO INTERRUPTED PROGRAM VIA RETUR8. * * AN ENTRYPOINT 'LKMDIS' IS ALSO INCLUDED IN THIS MODULE. * THIS PART IS DISPATCHED AFTER EACH LKM-REQUEST.(NO REGISTERS * ON STACK) A CHECK IS MADE IF THERE IS A JOB IN DISPATCHER QUEUE * WITH HIGHER PRIORITY THAN INTERRUPTED PROGRAM. * - IF QUEUED JOB IS STARTED * - IF NOT RETURN IS GIVEN TO INTERRUPTED PROGRAM VIA RETU14. * * * AN OPTIONALY ENTRYPOINT 'DISIOE' IS ALSO PROVIDED FOR * ERRORS IN I/O DRIVERS. BIT 0 IS SET IN A1 AND THE SUB- * ROUTINE 'TENDIO' IS CALLED BEFORE THE 'TDISP'-ENTRY * IS ENTERED. * ENTRY 'DISEND' ONLY CALLS 'TENDIO' BEFORE 'TDISP'-ENTRY. EJECT * *********** * ENTRIES * *********** * ENTRY TDISP DISPATCHER ENTRY ENTRY LKMDIS DISPATCHED AFTER LKM ENTRY DISIOE I/O ERROR ENTRY ENTRY DISEND END I/O AND DISPATCH ENTRY DISQUE POINTER TO FIRST PLACE IN DISPATCHER-QUEUE ENTRY GBQUE POINTER TO FIRST TTAB IN BUFFER QUEUE ENTRY PRUN TTAB-ADDRESS OF RUNING PROGRAM ENTRY SRUN POINTER TO RUNNING SEGMENT IN LSBT ENTRY SACT POINTER TO ACTIVE SEGMENT ENTRY LRUNEW ENTRY LRUQUE POINTER TO FIRST SEGMENT IN LRU-STACK ENTRY LDPEND LOAD PENDING.LDTASK IN PAUSE ENTRY RETU14 RESTORE REGISTER A14-A1 VIA A15 STACK ENTRY RETU13 ENTRY RETU12 ENTRY RETU11 ENTRY RETU10 ENTRY RETUR9 ENTRY RETUR8 ENTRY RETUR7 ENTRY RETUR6 ENTRY RETUR5 ENTRY RETUR4 ENTRY RETUR3 ENTRY RETUR2 ENTRY RETUR1 ENTRY RTNA15 ENTRY UPDLRI SUBROUTINE TO UPDATE LRUQUEUE ENTRY FREQUE ENTRY BLOCKL EJECT ENTRY DWTCHP CHANNEL PARAMETER ENTRY DWTST STATUS ENTRY DWTECB ECB ADDRESS ENTRY DWTOR ORDER ENTRY DWTADR POINTER TO ADDRESS-BLOCK ENTRY DWTTAB TTAB-ADDRESS ENTRY DWTWAT WAIT ACTIVATE INDICATOR ENTRY DWTTQ TERMINAL QUEUE ENTRY DWTWA WORK AREA ENTRY DWTTDM DM REQUEST TTAB ADDRESS ENTRY DWTVOL VOLUME NAME ENTRY ECBBA,ECBRL,ECBEL ENTRY ECBRC,ECBCW EJECT * ************* * EXTERNALS * ************* * * DISPLACEMENT IN TTAB * EXTRN TTB:SS START OF SEGMENT EXTRN TTB:SP SGMENT POINTER EXTRN TTB:SA SAVE AREA EXTRN TTB:ST STATUS EXTRN TENDIO END I/O EXTRN EXIT PROGRAM EXIT EXTRN BLOK:S START OF BLOCK POOL EXTRN BLOCKE BLOCK POOL LENGTH EXTRN ACTOT EXTRN QTJOB EXTRN GETBLK EXTRN LDTASK EXTRN TTABLD * ************* * CONSTANTS * ************* * * CVTLSB EQU /9A START ADDRESS OF LOAD SEGM BLK FIRST WORD CONTAINS LSBT-LENGTH EJECT * ****************************************** * * DWT-DISPLACEMENT DECLARATIONS * ***************************************** * DWTCHP EQU 0 CHANNEL PARAMETER DWTST EQU 2 STSTUS DWTECB EQU 4 ECB-ADDRESS DWTOR EQU 6 ORDER DWTADR EQU 8 ADDRESS BLOCK POINTER DWTTAB EQU 10 TTAB-ADDRESS DWTWAT EQU 12 WAIT/ACTIVATE INDICATOR DWTTQ EQU 14 TERMINAL QUEUE DWTWA EQU 16 WORK AREA DWTTDM EQU 16 DM REQUEST TTAB ADDRESS DWTVOL EQU 44 VOLUME NAME EJECT * ****************************** * * ECB-DISPLACEMENTS * ****************************** * ECBBA EQU /02 ECBRL EQU /04 ECBEL EQU /06 ECBRC EQU /08 ECBCW EQU /0A * EJECT * * D I S Q U E * POINTER TO FIRST PLACE IN DISPATCHER QUEUE * DISQUE EQU * DATA 0 * * P R U N * TTAB-ADDRESS OF RUNING PROGRAM * PRUN EQU * DATA 0 * * S R U N * POINTER TO RUNNING SEGMENT IN LSB-TAB * SRUN EQU * DATA 0 * * * POINTER TO ACTIVE SEGMENT * SACT EQU * DATA 0 * G B Q U E * POINTER TO FIRST TASK TABLE IN BUFFER QUEUE * GBQUE EQU * DATA 0 FREQUE DATA BLOK:S BLOCKL DATA BLOCKE * * L R U Q U E * POINTER TO FIRST SEGMENT IN 'LEAST RECENTLY USED' PARTITION LINK * LRUQUE EQU * DATA 0 * * L D P E N D * SEGMENT LOAD PENDING. LDTASK IN 'PAUSE' LDPEND DATA 0 * EJECT * * D I S I O E * * SET BIT 0 IN ECB RETURN CODE AND GO TO TDISP-ENTRY * DISIOE EQU * LDKL A1,/8000 SET RETURN CODE * DISEND EQU * CF A15,TENDIO EJECT * * * T D I S P * * THIS IS THE DISPATCHER ENTRY * TDISP EQU * INH LD A1,18,A15 LOAD PSW FROM STACK SRL A1,10 GET LEVEL LD A5,DISQUE ABL(Z) SEGDIS NO QUEUE,RETURN THROUGH SEGDIS CC A1,TTB:ST+1,A5 AND COMPARE WITH QUEUED LEVEL ABL(NG) SEGDIS RETURN TO INTERRUPTED PROGRM THRU SEGDIS STR A9,A15 SAVE A9-A14 ON STACK STR A10,A15 STR A11,A15 STR A12,A15 STR A13,A15 STR A14,A15 LD A1,PRUN STR A1,A15 SAVE PRUN ON STACK LD A1,SRUN SAVE SRUN ON STACK STR A1,A15 AND DISPATCH QUEUED PROGRAM EJECT * * * DISPATCH PROGRAM FIRST IN DISPATCHER QUEUE * * A5 = TTAB-ADDRESS OF PROGRAM TO BE DISPATCHED * DIS100 EQU * LDR* A1,A5 REMOVE JOB FROM DISPATCHER QUEUE ST A1,DISQUE LD A2,TTB:SA,A5 LOAD DISPATCH ADDRESS LD A1,TTB:ST+1,A5 LOAD LEVEL SLL A1,10 CWK A1,/C000 MONITOR JOB ? RF(E) DIS200 YES LD A6,TTB:SP,A5 SEGMENT 0? RF(Z) DIS105 YES PUT JOB ON STACK LDR* A4,A6 SEGMENT LOADED? ABL(N) SEGLD NO LOAD SEGMENT CF A15,UPDLRU UPDATE LRU QUEUE EJECT DIS105 EQU * STR A2,A15 STORE DISPATCH ADDRESS STR A1,A15 AND LEVEL ON STACK LDR A3,A5 ADK A3,14 SET ADDRESS TO A1 IN SAVE AREA LDK A1,14 SET COUNTER DIS110 LDR* A2,A3 SET UP A1-A14 ON STACK STR A2,A15 ADK A3,2 SUK A1,1 RB(NZ) DIS110 DIS120 ST A5,PRUN SET TABB-ADDRES FOR DISPATCHED PROG. ST A6,SRUN SET POINTER TO LSBT FOR RUNNING SEGMENT START QUEUED PROGRAM (A1-A14 ON STACK) EJECT * * * R E T U R * * ENTRYPOINTS RETU14-RETUR1 :RELOAD REGISTERS FROM STACK * AND RETURN VIA A15 * RETU14 LDR* A14,A15 RETU13 LDR* A13,A15 RETU12 LDR* A12,A15 RETU11 LDR* A11,A15 RETU10 LDR* A10,A15 RETUR9 LDR* A9,A15 RETUR8 LDR* A8,A15 RETUR7 LDR* A7,A15 RETUR6 LDR* A6,A15 RETUR5 LDR* A5,A15 RETUR4 LDR* A4,A15 RETUR3 LDR* A3,A15 RETUR2 LDR* A2,A15 RETUR1 RF DIS130 RTNA15 STR A1,A15 DIS130 LDK A1,/40 BIT 9 ORS A1,4,A15 SET PSW IN A15 STACK TO ENB LDR* A1,A15 RTN A15 EJECT * * * MONITOR JOB DISPATCHING * DIS200 EQU * LDKL A3,LKMDIS STORE ADDRESS TO BE DISPATCHED AFTER MONITOR STR A3,A15 JOB ON STACK STR A1,A15 STORE LEVEL 48 ON STACK SUKL A15,16 ADJUST STACK POINTER STR A2,A15 SET MONITOR JOB DISPATCH ADDRESS ON STACK STR A1,A15 SET LEVEL LD A1,TTB:SA+2,A5 LOAD PARAMETER IN A1 STR A1,A15 AND SET ON STACK CF A15,EXIT DO EXIT ON MONITOR JOB AND RB RETUR1 THEN START IT EJECT * * * L K M D I S * * THIS PART IS DISPATCHED AFTER EACH LKM-REQUEST * NO REGISTERS ON STACK * * LKMDIS EQU * INH LD A1,34,A15 LOAD PSW FROM STACK SRL A1,10 GET LEVEL LD A5,DISQUE RF(Z) DIS010 NO QUEUE,RETURN CC A1,TTB:ST+1,A5 AND COMPARE WITH QUEUED LEVEL RB(G) DIS100 DISPATCH FROM QUEUE DIS010 EQU * LDR* A6,A15 SRUN FROM STACK LDR* A5,A15 PRUN FROM STACK LDR* A14,A15 LDR* A13,A15 LDR* A12,A15 LDR* A11,A15 LDR* A10,A15 LDR* A9,A15 ST A5,PRUN ST A6,SRUN EJECT * * SEGDIS * LEVEL IN REG A1 SHIFTED RIGHT * SEGDIS CWK A1,49 INTERRUPT ROUTINE? RB(NG) RETUR8 YES RETURN LD A6,SRUN ROOT-SEGMENT? RB(Z) RETUR8 YES RETURN LD A5,PRUN LDR* A2,A6 SEGMENT LOADED? RF(N) SEGTAB JMP IF NOT AND LOAD SEGMENT LD A2,20,A15 DISP ADRESS: EJECT * * UPDATE LRUSTACK AND TASK TABLE * CF A15,UPDLRU ST A2,20,A15 STORE NEW DISPATCH ADDRESS RB RETUR8 EJECT * * SAVE INTO TTAB * SEGTAB EQU * SAVE STACK-DATA IN TTAB ST A14,TTB:SA+28,A5 SAVE A9-A14 IN TTAB ST A13,TTB:SA+26,A5 ST A12,TTB:SA+24,A5 ST A11,TTB:SA+22,A5 ST A10,TTB:SA+20,A5 ST A9,TTB:SA+18,A5 LDR A4,A5 SAVE A1-A8 FROM STACK INTO TTAB ADK A4,28 LDK A3,8 SEGNXT LDR* A1,A15 STR A1,A4 SUK A4,2 SUK A3,1 RB(NZ) SEGNXT LDR* A1,A15 REMOVE PSW FROM STACK LDR* A2,A15 SAVE PROGRAM COUNTER ST A2,TTB:SA,A5 EJECT * * LOAD SEGMENT * * * GET PARAMETER BLOCK AND FILL IN * SEGMNT POINTER,DISPL AND TTAB-ADDRESS * SEGLD EQU * LDR A3,A6 LOAD SEGMENT POINTER IN LSBT SU A2,TTB:SS,A5 RELATIVE ADDRESS NGR A2,A2 SET NEGATIVE DISPLACEMENT LDR A1,A5 LOAD TTAB-ADDRESS CF A15,GETBLK GET MONITOR BLOCK * * ACTIVATE LOAD TASK AND PUT IT IN THE DISPATCHER QUEUE * LDR A1,A4 LOAD PARAMETER LDKL A2,LDTASK LOAD DISPATCH ADDRESS LDKL A5,TTABLD LDK A3,0 CF A15,ACTOT ACTIVATE LOAD TASK * * EXIT TO TERMINAL DISPATCHER * LD200 EQU * RB LKMDIS EJECT * * UPDATE TASK TABLE * UPDLRU EQU * LD A7,2,A6 NEW LOAD ADDRESS LD A4,TTB:SS,A5 OLD SEG ADDRESS ST A7,TTB:SS,A5 SAVE NEW ADDRESS SUR A7,A4 ADRESS DIFFERENCE ADR A2,A7 NEW DISPATCH ADDRESS ST A2,TTB:SA,A5 STORE DISP ADDRESS ST A6,TTB:SP,A5 SEGMENT POINTER * * UPDATE LRU-STACK * UPDLRI EQU * LD A3,SACT RF(E) LRUNDA CWR A3,A6 SAME AS ACTIVE SEGMENT? RF(E) LRUNDA YES CF A15,LRUNEW NO LRUNDA EQU * LDKL A7,/2000 QUEUE INDICATOR ST A6,SACT SET ACTIVE POINTER LDR A4,A7 ANR* A7,A6 RF(E) LRUEND XRRS A4,A6 SET ACTIVE LD A7,8,A6 FIRST IN QUEUE LD A3,10,A6 LAST IN QUEUE ? RF(Z) LRULST ST A7,-2,A3 UPDATE PRECEDENT OF SUCCEDENT LRULST LDR A7,A7 RF(NZ) LRU100 ST A3,LRUQUE RF LRUMOD LRU100 ST A3,2,A7 LRUMOD CM 8,A6 CM 10,A6 RF LRUEND LRUNEW EQU * STR A7,A15 LDR A7,A3 LD A4,LRUQUE UPDATE FIRST IN QUEUE RF(NZ) LRUFOR LD A3,LDPEND LOAD TASK PENDING? RF(Z) NOPEND JMP IF NOT CM LDPEND CLEAR PENDING INDICATOR LDR A3,A5 SAVE A5 LDKL A5,TTABLD CF A15,QTJOB RESTART LOAD TASK LDR A5,A3 RESTORE A5 NOPEND EQU * ADK A7,10 RF LRUUPD LRUFOR ADK A7,8 ST A7,-2,A4 UPDATE PRECEDENT OF SECOND IN QUEUE CMR A7 CLEAR PRECEDENT POINTER ADK A7,2 STR A4,A7 SUCCEDENT POINTER LRUUPD ST A7,LRUQUE LDKL A3,/2000 ORS A3,-10,A7 LDR* A7,A15 LRUEND ADKL A15,2 LDR* P,A15 END