|
|
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: 17306 (0x439a)
Notes: pts_type(SC)
Names: »LDTASK.SC«
└─⟦7e2393f80⟧ Bits:30009710 Philips computer tape "M_KONV"
└─⟦this⟧ »M:KONV/LDTASK.SC«
IDENT LDTASK REL 9.2 79-12-06 870105040920 =2, DEVICE TABLE LENGTH DATA WORD REL 9.2 79-11-16 =1, QLTASK RETURN IN ENABLE REL 9.1 79-05-23 * ************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * LDTASK = LOAD TASK * * * * ************************************************** * * * THIS MODULE CONTAINS THE LOAD TASK * USED IN TOSS MEMORY MANAGEMENT SYSTEMS. * * IT CONTAINS TWO ENTRY POINTS: * * - LT:DSK USED IN DISC PAGING SYSTEMS * - LT:SWB USED IN SWAPPABLE WORK BLOCK SYSTEMS * * EJECT LDTASK * * *********** * ENTRIES * *********** * * ENTRY LT:DSK DISC PAGING ENTRY ENTRY LT:SWB SWAPPABLE WORK BLOCK ENTRY ENTRY TTABLD LOAD TASK TTAB ENTRY QLTDSK ACTIVATE LDTASK AT ENTRY LT:DSK ENTRY QLTSWB ACTIVATE LDTASK AT ENTRY LT:SWB ENTRY PQEMTY PAGE QUEUE EMPTY FLAG EJECT LDTASK * * ************* * EXTERNALS * ************* * * EXTRN TLDS15 ENTRY IN TLDSEG EXTRN TLDS20 ENTRY IN TLDSEG EXTRN MEXIT MONITOR TASK EXIT EXTRN LKMERR HALT SYSTEM DUE TO FATAL LKM ERROR EXTRN ACTOT ACTIVATE TASK EXTRN QTJOB QUEUE TASK FOR DISPATCHING EXTRN PAGQUE FREE PAGE QUEUE EXTRN PAG:QB QUEUE LINK BACKWARDS EXTRN PAG:PA PAGE ADDRESS EXTRN PAG:SB SEGMENT BLOCK ADDRESS EXTRN SEG:DS DISC SECTOR ADDRESS EXTRN SEG:EL SEGMENT LENGTH EXTRN SEG:PB PAGE BLOCK ADDRESS EXTRN SWB:DS DISC SECTOR ADDRESS OF FIRST COPY EXTRN SWB:EL SWB LENGTH (BYTES) EXTRN SWB:NS SWB LENGTH (SECTORS) EXTRN ECBBA ECB BUFFER ADDRESS EXTRN ECBRC ECB RETURN CODE EXTRN ECBCW ECB CONTROL WORD EXTRN TTB:SA TTAB SAVE AREA EXTRN TTB:MT MMU TABLE EXTRN TTB:SB SEGMENT BLOCK ADDRESS EXTRN SCTPLD PROGRAM LOADING DEVICE EXTRN SCTPSZ PAGE SIZE EXTRN SCTLAP LOGICAL ADDRESS OF PAGES EXTRN T:ACSB CURRENT SEGMENT BASE EJECT LDTASK * * ***************************************** * * 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 1 * * * A PROGRAM VERSION INCLUDING TOSS SWAPPABLE WORK * BLOCKS IS OBTAINED BY SETTING SWPBLK EQU 1. * SWPBLK EQU 0 * * * A PROGRAM VERSION USING TOSS ASSEMBLER OVERLAY * IS OBTAINED BY SETTING ASSOLY EQU 1. * ASSOLY EQU 0 * EJECT LDTASK * * LDTASK ECB AND BUFFER AREAS * LD:ECB DATA 0,0,410,0,0,0 ECB AREA FOR LOAD TASK * LD:BUF RES 205 INTERMEDIATE BUFFER FOR LOAD TASK * RES 2 LOAD TASK STACK (ONE LEVEL) LD:STB EQU *-2 LOAD TASK STACK BASE * PQEMTY DATA 0 PAGE QUEUE EMPTY FLAG * EJECT LDTASK * * TTABLD (LOAD TASK TTAB) * IFT MMUPAG=1 RES 16 LDTASK MMU TABLE XIF * DATA 0 SEGMENT BLOCK ADDRESS * TTABLD EQU * TTABLD ENTRY DATA 0 DISPATCHER QUEUE LINK DATA '#L' TASK IDENTIFICATION DATA 49 PRIORITY LEVEL DATA 0 PENDING POINTER DATA /C4C0 PSW (PROGRAM STATUS WORD) DATA 0 DISPATCH ADDRESS DATA 0,0,0,0,0,0,0 REGISTER SAVE AREA, A1-A14 DATA 0,0,0,0,0,0,0 DATA 2 DEVICE TABLE LENGTH =2 * EJECT LDTASK * * ********** * LT:DSK * ********** * * * LT:DSK PERFORMS LOADING OF DISC RESIDENT SEGMENTS INTO CORE. * * INPUT: A1 = SEGMENT BLOCK ADDRESS * A3 = TTAB ADDRESS OF CALLING TASK * * LT:DSK EQU * LDTASK DISC PAGING ENTRY LD A13,TTB:SA+26,A3 GET A13 FROM TTAB SAVE AREA LDKL A5,TTABLD GET LDTASK TTAB ADDRESS LDR* A2,A1 GET SEGMENT STATUS RF(NN) LTD:05 SEGMENT NOT LOADED IN CORE? * * UPDATE MMU TABLE FOR CALLING TASK (IF MMU) AND * REMOVE PAGE FROM PAGQUE * LDR A7,A3 SAVE A3 LDR A5,A3 LD A1,SEG:PB,A1 GET PAGE BLOCK ADDRESS CF A15,TLDS15 LDR A5,A7 GET TTAB ADDRESS OF CALLING TASK ABL LTD:80 * EJECT LDTASK * * NO PAGE AVAILABLE. PAUSE LDTASK UNTIL RESTARTED * BY IHLKM WHEN PAGE AVAILABLE AGAIN. * LTD:00 EQU * IM PQEMTY INDICATE PAGE QUEUE EMPTY LKM DATA 5 PAUSE LDTASK * * GET ONE PAGE FROM PAGQUE * LTD:05 EQU * LD A2,PAGQUE+2 CWK A2,PAGQUE RB(E) LTD:00 NO PAGE AVAILABLE? * EJECT LDTASK * * TAKE FOUND PAGE OUT OF PAGQUE * LD A4,PAG:QB,A2 ADDRESS TO NEXT PAGE BLOCK ST A4,PAGQUE+2 UPDATE QUEUE ANCHOR LDR* A12,A2 GET PAGQUE ADDRESS AND UPDATE... STR A12,A4 ...QUEUE LINK FORWARD FOR NEXT BLOCK CMR A2 RESET QUEUE LINK FORWARD OF REMOVED BLK LDKL A6,/4000 SEGMENT UNDER LOADING BIT LD A4,PAG:SB,A2 GET OLD SEGMENT BLOCK ADDRESS RF(Z) LTD:15 SCR A6,A4 RESET STATUS * LTD:15 EQU * ORRS A6,A1 INDICATE SEGMENT UNDER LOADING ST A2,SEG:PB,A1 SET NEW PAGE BLOCK ADDRESS ST A1,PAG:SB,A2 SET NEW SEGMENT BLOCK ADDRESS * IFT MMUPAG=1 * * UPDATE MMU TABLE FOR CALLING TASK AND LDTASK * INH MS 3,TTB:SA+2,A5 SAVE A1-A3 IN TTAB SAVE AREA TL TTB:MT,A3 LOAD MMU WITH CALLING TASK TS TTB:MT,A5 STORE IN LDTASK MMU TABLE LDR A1,A2 LDR A3,A5 TTAB ADDRESS OF LDTASK CF A15,TLDS20 UPDATE MMU TABLE FOR LDTASK TS TTB:MT,A3 STORE NEW MMU TABLE FOR CALLING TASK ENB XIF * EJECT LDTASK * * PREPARE FOR READING OF SEGMENT * LD A6,SEG:EL,A1 GET SEGMENT LENGTH SRL A6,1 CONVERT LENGTH TO WORDS LD A4,SCTPSZ GET PAGE SIZE SRL A4,1 CONVERT LENGTH TO WORDS LDR A5,A3 GET TTAB ADDRESS OF CALLING TASK LD A3,PAG:PA,A2 GET PAGE ADDRESS (PHYSICAL) LD A2,SEG:DS,A1 GET SEGMENT DISC ADDRESS LDR A9,A1 SAVE SEGMENT BLOCK ADDRESS LDR A11,A5 INDICATE DISC PAGING (A11 <> 0) * IFT MMUPAG=0 ST A3,T:ACSB,A13 UPDATE CURRENT SEGMENT BASE XIF * LTD:35 EQU * ENTRY USED BY LT:SWB LDK A7,/91 PHYSICAL READ * * SET ECB PARAMETERS * LTD:40 EQU * ENTRY USED BY LT:SWB LDKL A14,LD:STB LOAD LDTASK STACK BASE LDKL A8,LD:ECB GET LD:ECB ADDRESS ST A2,ECBCW,A8 * IFT MMUPAG=0 SUK A3,2 LDR A12,A3 LD A2,SCTPLD GET PROGRAM DISC FILE CODE STR A2,A8 ST A3,ECBBA,A8 SET BUFFER ADDRESS RF LTD:60 XIF * EJECT LDTASK * * IFT ASSOLY=1 LD A2,SCTPLD GET PROGRAM DISC FILE CODE STR A2,A8 LDKL A1,LD:BUF GET LDTASK BUFFER ADDRESS ST A1,ECBBA,A8 CF A14,LTD:85 READ FIRST SECTOR TO LD:BUF XIF * IFT MMUPAG=1 IFT SWPBLK=1 LDR A11,A11 CHECK DISC PAGING/SWB FLAG RF(NZ) LTD:43 DISC PAGING REQUEST? * EJECT LDTASK * * LDR A12,A3 SAVE LOGICAL BUFFER ADDRESS ECR A2,A3 CONVERT LOGICAL ADDRESS TO PHYSICAL ANKL A3,/FFF SRL A2,3 ANK A2,/1E MMUTAB INDEX (5 BITS) ADR A2,A5 ADD TTAB ADDRESS LC A2,TTB:MT,A2 GET PHYSICAL PAGE ADDRESS SRL A2,2 ECR A1,A2 ANK A2,/0F SRC A2,4 ORR A3,A2 RF(NZ) LTD:48 SUKL A1,/1000 RF LTD:48 * LTD:43 EQU * XIF * IFT MMUPAG=1 LDR A1,A3 SRL A1,2 SLL A3,2 RF(NZ) LTD:45 SUKL A1,/1000 * EJECT LDTASK * * LTD:45 EQU * LDR A12,A3 ANKL A12,/FFF CONVERT PHYSICAL ADDRESS TO LOGICAL OR A12,SCTLAP * LTD:48 EQU * SUK A3,2 ST A3,ECBBA,A8 SET BUFFER ADDRESS ANKL A1,/3000 OR A1,SCTPLD GET PROGRAM DISC FILE CODE STR A1,A8 * IFT ASSOLY=0 SUKL A12,2 RF LTD:60 XIF * IFT ASSOLY=1 * * MOVE FIRST SECTOR TO PAGE AREA * LDKL A1,LD:BUF+2 LDR A2,A12 LDKL A3,376 MVSU A3 MOVE FIRST SECTOR TO PAGE SUKL A12,2 XIF * EJECT LDTASK * * LTD:50 EQU * IM ECBCW,A8 POINT TO NEXT SECTOR * IFT ASSOLY=0 LDK A1,200 XIF * IFT ASSOLY=1 LDK A1,188 XIF * SUR A6,A1 GET REMAINING LENGTH OF SEGMENT/SWB RF(NP) LTD:75 SEGMENT/SWB HANDLING FINISHED? SUR A4,A1 GET REMAINING LENGTH OF PAGE ADR A1,A1 ADR A12,A1 UPDATE PAGE AREA POINTER * IFT MMUPAG=1 LD A10,ECBBA,A8 GET BUFFER ADDRESS RF(N) LTD:55 ADS A1,ECBBA,A8 UPDATE BUFFER ADDRESS RF LTD:60 * LTD:55 EQU * ADS A1,ECBBA,A8 UPDATE BUFFER ADDRESS RF(N) LTD:60 NOT OVERFLOW? LDKL A1,/1000 OVERFLOW CORRECTION ADRS A1,A8 XIF * IFT MMUPAG=0 ADS A1,ECBBA,A8 UPDATE BUFFER ADDRESS XIF * EJECT LDTASK * * LTD:60 EQU * CWK A4,204 CHECK REMAINING LENGTH OF PAGE RF(L) LTD:65 NOT ROOM FOR ONE MORE SECTOR IN PAGE? * IFT MMUPAG=1 ELR A10,A12 SAVE WORD TO BE DESTROYED BY DISC CYL-ID CF A14,LTD:85 READ/WRITE ONE SECTOR ESR A10,A12 RESTORE SAVED WORD RB LTD:50 XIF * IFT MMUPAG=0 LDR* A10,A12 SAVE WORD TO BE DESTROYED BY DISC CYL-ID CF A14,LTD:85 READ/WRITE ONE SECTOR STR A10,A12 RESTORE SAVED WORD RB LTD:50 XIF * EJECT LDTASK * * NOT ROOM ENOUGH IN PAGE FOR LAST SECTOR: * READ IT TO MEMORY VIA INTERMEDIATE BUFFER * LTD:65 EQU * LDKL A1,LD:BUF GET LDTASK BUFFER ADDRESS ST A1,ECBBA,A8 LDK A2,/80 SCR A2,A8 INDICATE BUFFER NOW IN SYSTEM AREA CF A14,LTD:85 READ ONE SECTOR TO LD:BUF ADK A1,2 SKIP CYLINDER ID LDR A2,A12 GET PAGE POINTER ADK A2,2 ADR A6,A6 CONVERT LENGTH TO BYTES * IFT MMUPAG=1 MVSU A6 MOVE LAST PART OF SEGMENT/SWB TO PAGE XIF * IFT MMUPAG=0 LTD:70 EQU * LDR* A10,A1 MOVE ONE WORD STR A10,A2 ADK A1,2 INCREMENT BUFFER POINTERS ADK A2,2 SUK A6,2 DECREMENT COUNTER RB(P) LTD:70 XIF * EJECT LDTASK * * LTD:75 EQU * IFT SWPBLK=1 LDR A11,A11 CHECK DISC PAGING/SWB FLAG RF(Z) LTD:80 SWB HANDLING? XIF * LDKL A4,/C000 INDICATE SEGMENT SUCCESSFULLY LOADED XRRS A4,A9 * LTD:80 EQU * CF A15,QTJOB QUEUE TASK FOR DISPATCHING ABL MEXIT PERFORM EXIT ON LDTASK * EJECT LDTASK * * READ ONE SECTOR FROM DISC * LTD:85 EQU * LKM DATA 1 LD A2,ECBRC,A8 GET RETURN CODE ANKL A2,/FEFF SKIP RETRY BIT RF(NZ) LTD:95 DISC ERROR? RTN A14 NO, RETURN * * ERROR: INSERT PAGE IN PAGQUE AGAIN * LTD:95 ANK A2,1 NGR A2,A2 SUK A2,2 ERROR, SET RETURN CODE -2 OR -3 ST A2,TTB:SA+14,A5 SET RETURN CODE IN A7 * IFT SWPBLK=1 LDR A11,A11 CHECK DISC PAGING/SWB FLAG RB(Z) LTD:80 SWB HANDLING? XIF * CM TTB:SB,A5 RESET SEGMENT BLOCK ADDRESS LD A3,SEG:PB,A9 GET PAGE BLOCK ADDRESS 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 LDK A4,1 INDICATE SEGMENT ERROR SCR A4,A9 RB LTD:80 * EJECT LDTASK * * ********** * QLTDSK * * QLTSWB * ********** * * * THIS ROUTINE PERFORMS ACTIVATION OF THE LOAD TASK. * * ACTIVATION IS AT LT:DSK WHEN DISC PAGING REQUEST. * ACTIVATION IS AT LT:SWB WHEN SWAPPABLE WORK BLOCK REQUEST. * * INPUT: A1 = SEGMENT BLOCK ADDRESS (LT:DSK) * = SWAPPABLE WORK BLOCK ADDRESS (LT:SWB) * A3 = TTAB ADDRESS OF CALLING TASK * * OUTPUT: A2, A5 ARE DESTROYED * * QLTSWB EQU * ACTIVATE LDTASK AT ENTRY LT:SWB LDKL A2,LT:SWB GET DISPATCH ADDRESS RF QLTASK * QLTDSK EQU * ACTIVATE LDTASK AT ENTRY LT:DSK LDKL A2,LT:DSK GET DISPATCH ADDRESS * QLTASK EQU * LDKL A5,TTABLD GET LDTASK TTAB ADDRESS ABL ACTOT ACTIVATE LDTASK =1 * EJECT LDTASK * * IFT SWPBLK=1 * * ********** * LT:SWB * ********** * * * LT:SWB HANDLES THE LOADING/STORING OF SWAPPABLE WORK BLOCKS. * * INPUT: A1 = SWAPPABLE WORK BLOCK ADDRESS * A3 = TTAB ADDRESS OF CALLING TASK * * LT:SWB EQU * LDTASK SWB HANDLING ENTRY IFT MMUPAG=1 INH LDKL A5,TTABLD GET LDTASK TTAB ADDRESS TL TTB:MT,A3 LOAD MMU WITH CALLING TASK TS TTB:MT,A5 STORE IN LDTASK MMU TABLE ENB XIF * IFT SWPBLK=1 SUR A11,A11 INDICATE SWB HANDLING (A11 = 0) LDR A5,A3 GET TTAB ADDRESS OF CALLING TASK LD A3,TTB:SA+16,A5 GET MEMORY ADDRESS (LOGICAL) LD A4,SWB:DS,A1 GET DISC ADDRESS OF FIRST COPY LD A6,SWB:EL,A1 GET SWB COPY LENGTH (BYTES) LD A2,SWB:NS,A1 GET SWB COPY LENGTH (SECTORS) LDR A7,A1 SAVE A1 LD A1,TTB:SA+14,A5 ANK A1,/FF GET SWB COPY INDEX * EJECT LDTASK * * LTS:10 EQU * SUK A1,1 * IFT CPU852=1 RF(NP) LTS:20 ADR A4,A2 COMPUTE DISC ADDRESS OF REQUESTED SWB RB LTS:10 * LTS:20 EQU * LDR A2,A4 GET DISC ADDRESS OF REQUESTED SWB XIF * IFT SWPBLK=1 IFT CPU852=0 MUR A1 COMPUTE DISC ADDRESS OF REQUESTED SWB ADR A2,A4 XIF * IFT SWPBLK=1 ADK A6,1 SRL A6,1 CONVERT SWB LENGTH TO WORDS LDR A4,A6 ANK A7,1 GET LOAD/STORE SWB REQUEST FLAG ABL(Z) LTD:35 LOAD SWB REQUEST? LDKL A4,/7FFF PARAMETER TO AVOID INTERMEDIATE BUFFER LDK A7,/95 PHYSICAL WRITE (STORE SWB REQUEST) ABL LTD:40 XIF * IFT SWPBLK=0 LT:SWB ABL LKMERR INDICATE SYSGEN ERROR XIF * * * END