|
|
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: 14308 (0x37e4)
Notes: pts_type(SC)
Names: »DSKSUB.SC«
└─⟦7b35573c9⟧ Bits:30009690 Philips computer tape "600402"
└─⟦this⟧ »M:AF/DSKSUB.SC«
IDENT DSKSUB REL 11.0 81-01-26 870105041100 =1, DM NVL BITS TAKEN AWAY PRR 11.0 80-11-19 CHLO * **************************************** * * PHILIPS TERMINAL SYSTEM PTS * * * DSKSUB = DISC SUBROUTINES * * * * * **************************************** * * * DSKSUB HOLDS THE FOLLOWING DISC * AND FILE MANAGEMENT SUBROUTINES: * * - VOLCLR = CLEAR VOLUME NAME(S) IN DISC DWT * - VOLNAM = MOVE VOLUME NAME FROM DWT TO USER BUFFER * - VOLADR = COMPUTE VOLUME NAME ADDRESS IN DWT * - NVLCHK = CHECK IF NEW VOLUME LOADED FOR CALLING TASK * - VOLGET = MOVE VOLUME NAME FROM DISC BUFFER TO DWT * - NEWVOL = SET NEW VOLUME LOADED BITS * - INXDWT = COMPUTE DWT ADDRESS + DOUBLE INDEX * - NVLTAB = TTAB ADDRESSES FOR TASKS TO HAVE NVL * * EJECT DSKSUB * * *********** * ENTRIES * *********** * * ENTRY VOLCLR CLEAR VOLUME NAMES IN DWT ENTRY VOLNAM MOVE VOLUME NAME FROM DWT TO USER BUFFER ENTRY VOLADR COMPUTE VOLUME NAME ADDRESS IN DWT ENTRY NVLCHK CHECK FOR NEW VOLUME LOADED ENTRY VOLGET MOVE VOLUME NAME FROM DISC BUFFER TO DWT ENTRY NEWVOL SET NEW VOLUME LOADED BITS ENTRY INXDWT COMPUTE DWT ADDRESS + DOUBLE INDEX ENTRY NVLTAB TTAB ADDRESSES FOR TASKS TO HAVE NVL * =1 ENTRY NVLEND END OF NVLTAB ENTRY NVLBIT NVL BIT MASK EJECT DSKSUB * * ************* * EXTERNALS * ************* * * EXTRN IHRTN RETURN WITHOUT ENABLING INTERRUPTS EXTRN TTABLD LDTASK TTAB EXTRN TTABFM FMTASK TTAB EXTRN SCTFWT FWT CHAIN START ADDRESS EXTRN DWTORD SAVE AREA INDEX AND ORDER EXTRN DWTOR INDEX AND ORDER EXTRN DWTTAB TTAB ADDRESS EXTRN DWTUEC USER ECB ADDRESS EXTRN DWTVOL VOLUME NAME EXTRN DWTNVL NEW VOLUME LOADED FLAG EXTRN EWTVOL VOLUME FILE CODE EXTRN FWTEW1 POINTER TO 2ND EWT BLOCK IN FWT EXTRN FWTPAR ACCESS PARAMETERS EXTRN TTB:MT MMU TABLE EXTRN ECBBA ECB BUFFER ADDRESS EXTRN ECBRL ECB REQUESTED LENGTH EXTRN ECBEL ECB EFFECTIVE LENGTH EJECT DSKSUB * * *************************************** * * 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 INCLUDING TOSS SWAPPABLE WORK * BLOCKS IS OBTAINED BY SETTING SWPBLK EQU 1. * SWPBLK EQU 0 * EJECT DSKSUB * * * A PROGRAM VERSION SUPPORTING FILE MANAGEMENT * IS OBTAINED BY SETTING FILMAN EQU 1. * X:A EQU 0 FILMAN EQU X:A * * * A PROGRAM VERSION SUPPORTING DATA MANAGEMENT * IS OBTAINED BY SETTING DATMAN EQU 1. * X:B EQU 0 DATMAN EQU X:B * EJECT DSKSUB * * ********** * VOLCLR * ********** * * * VOLCLR WILL CLEAR THE REQUESTED VOLUME NAME(S) * IN THE REQUESTED DISC DWT. * * INPUT: A1 = NUMBER OF BYTES TO CLEAR * A6 = DWT ADDRESS * * OUTPUT: A1, A2 ARE DESTROYED * VOLCLR EQU * LDR A2,A1 CF A15,VOLADR VOLUME NAME ADDRESS * VCLR10 EQU * CMR A1 CLEAR ONE WORD ADK A1,2 INCREMENT POINTER SUK A2,2 DECREMENT LOOP COUNTER RB(P) VCLR10 RF RETURN * EJECT DSKSUB * * ********** * VOLNAM * ********** * * * VOLNAM WILL MOVE THE VOLUME NAME OF SELECTED DISC * TO THE USER BUFFER IF REQUESTED LENGTH = 6. * * INPUT: A6 = DWT ADDRESS * A8 = ECB ADDRESS * * OUTPUT: A1-A4 ARE DESTROYED * VOLNAM EQU * LD A1,ECBRL,A8 REQUESTED LENGTH SUK A1,6 RF(NE) RETURN NO VOLUME NAME WANTED CF A15,VOLADR GET DWT VOLUME ADDRESS ST A4,ECBEL,A8 SET EFFECTIVE LENGTH * IFT MMUPAG=0 LD A2,ECBBA,A8 USER BUFFER ADDRESS * EJECT DSKSUB * * VNAM10 EQU * LDR* A3,A1 MOVE ONE WORD STR A3,A2 ADK A1,2 INCREMENT BUFFER POINTERS ADK A2,2 SUK A4,2 DECREMENT LOOP COUNTER RB(P) VNAM10 RF RETURN XIF * IFT MMUPAG=1 LD A2,DWTTAB,A6 TTAB ADDRESS OF CALLING TASK TS -30,A15 SAVE RUNNING MMU TL TTB:MT,A2 LOAD USER MMU LD A2,DWTUEC,A6 USER ECB ADDRESS EL A2,ECBBA,A2 USER BUFFER ADDRESS MVSU A4 MOVE VOLUME NAME TL -30,A15 RESTORE RUNNING MMU RTN A15 XIF * EJECT DSKSUB * * ********** * VOLADR * ********** * * * INPUT: A6 = DWT ADDRESS * * OUTPUT: A1 = VOLUME NAME ADDRESS * A4 = 6 * VOLADR EQU * LC A4,DWTOR,A6 INDEX * VOLA05 EQU * LDKL A1,DWTVOL-6 ADR A1,A6 ANK A4,/3 * VOLA10 EQU * ADK A1,6 UPDATE ADDRESS SUK A4,1 RB(NN) VOLA10 LDK A4,6 RF RETURN * EJECT DSKSUB * * ********** * NVLCHK * ********** * * * NVLCHK IS CALLED AT ACTIVATION FROM DISC DRIVER * TO CHECK IF THE RETURN CODE "NEW VOLUME LOADED" * IS TO BE RETURNED TO THE CALLING TASK (RC=/20). * * INPUT: A6 = DWT ADDRESS * * OUTPUT: A1 = RETURN CODE (/20 IF NVL, ELSE 0) * A2 = DWT ADDRESS + DOUBLE INDEX * A3, A4 ARE DESTROYED * NVLCHK EQU * LD A2,DWTOR,A6 INDEX AND ORDER ST A2,DWTORD,A6 SAVE FOR RECOVERY PURPOSES SRL A2,7 DOUBLE INDEX ADR A2,A6 LD A1,DWTNVL,A2 NVL FLAG ANKL A1,/7FFF RESET BIT 0 (FIRST REQUEST BIT) ST A1,DWTNVL,A2 ANKL A1,/3FFF NOT 1ST REQ. OR FIX DISK RF(Z) RETURN RETURN IF NO NVL LD A4,DWTTAB,A6 TTAB ADDRESS LDK A1,1 LDKL A3,NVLTAB NVLTAB ADDRESS * EJECT DSKSUB * * NVL:10 EQU * CWK A3,NVLEND CHECK IF END OF TABLE REACHED RF(E) NVL:20 END OF NVLTAB CWR* A4,A3 CHECK TTAB ADDRESS RF(E) NVL:20 NVL FOR THIS TASK SLL A1,1 SHIFT NVL BIT MASK ADK A3,2 POINT TO NEXT TTAB IN NVLTAB RB NVL:10 * NVL:20 EQU * AN A1,DWTNVL,A2 CHECK IF NVL FOR THIS TASK RF(Z) RETURN NO NVL FOR THIS TASK XRS A1,DWTNVL,A2 RESET NVL BIT LDK A1,/20 RETURN CODE * EJECT DSKSUB * * RETURN EQU * COMMON RETURN LABEL IFT CPU852=1 ABL IHRTN RETURN WITHOUT ENABLING INTERRUPTS XIF * IFT CPU852=0 RTN A15 XIF * EJECT DSKSUB * * ********** * VOLGET * ********** * * * VOLGET WILL READ VOLUME NAME FROM DISC BUFFER * TO DISC DWT AND CHECK IF THERE IS A NEW VOLUME MOUNTED. * * INPUT: A2 = DISC BUFFER ADDRESS * A3 = FILE CODE (FOR DRIVE WITH INDEX = 0) * BIT 0 SET MEANS TEST STATUS ORDER * A6 = DWT ADDRESS * * OUTPUT: A4 = DWT ADDRESS + DOUBLE INDEX * A1-A3, A7-A8 ARE DESTROYED * * VOLGET EQU * CF A15,VOLADR DWT VOLUME NAME ADDRESS LDK A7,0 RESET NVL FLAG * VGET10 EQU * LDR* A8,A2 ONE WORD OF NEW VOLUME NAME CWR* A8,A1 COMPARE WITH OLD VOLUME NAME RF(E) VGET20 LDK A7,1 SET NVL FLAG STR A8,A1 STORE NEW VOLUME NAME * EJECT DSKSUB * * VGET20 EQU * ADK A1,2 INCREMENT BUFFER POINTERS ADK A2,2 SUK A4,2 DECREMENT LOOP COUNTER RB(P) VGET10 CF A15,INXDWT ADK A7,0 CHECK NVL FLAG RB(Z) RETURN RETURN IF NO NVL SLA A3,1 CHECK IF TEST STATUS OR RECOVERY RB(O) RETURN TEST STATUS, NO NVL SRA A3,1 FILE CODE WITHOUT SIGN BIT LD A7,DWTNVL,A4 NVL FLAGS RB(N) RETURN NO REQUESTS SO FAR ON THIS DISC SLL A7,1 RB(N) RETURN FIXED DISC, NO NVL * EJECT DSKSUB * * ********** * NEWVOL * ********** * * * NEWVOL IS ENTERED FROM THE ROUTINE VOLGET WHEN IT HAS * DETECTED THAT A NEW VOLUME HAS BEEN MOUNTED. * THE NEW VOLUME LOADED FLAG IS THEN SET BY THIS * ROUTINE FOR THE CONCERNED FILE CODE AND FILES * OPENED ON THAT VOLUME. TASKS REPRESENTED IN THE * TABLE NVLTAB WILL GET RETURN CODE /20 AT THE * NEXT REQUEST ON THAT FILE CODE. * * INPUT: A3 = FILE CODE (DISC ONE FOR DRIVER) * A4 = DWT ADDRESS + DOUBLE INDEX * A6 = DWT ADDRESS * * OUTPUT: A3 = ACTUAL FILE CODE * A1-A2 ARE DESTROYED * NEWVOL EQU * LD A2,NVLBIT NVL BIT MASK ST A2,DWTNVL,A4 INDICATE NEW VOLUME LOADED LC A2,DWTOR,A6 INDEX ANK A2,/3 ADR A3,A2 ACTUAL FILE CODE * EJECT DSKSUB * * IFT FILMAN=0 RB RETURN XIF * IFT FILMAN=1 LDKL A1,SCTFWT ADDRESS TO FWT POINTER * * SET NEW VOLUME LOADED FOR ALL FILES ON CONCERNED VOLUME * NEW:10 EQU * LDR* A2,A1 NEXT FWT ADDRESS RB(Z) RETURN NO MORE FWT:S LDR A1,A2 SAVE FWT ADDRESS ADKL A2,FWTEW1 ADDRESS TO FIRST EWT STRUCTURE * NEW:20 EQU * LDR* A2,A2 ADDRESS TO 2ND EWT BLOCK CC A3,EWTVOL,A2 CHECK FILE CODE RF(NE) NEW:30 LDKL A2,/8000 NVL BIT ORS A2,FWTPAR,A1 INDICATE NEW VOLUME LOADED RB NEW:10 * NEW:30 EQU * LDR* A2,A2 ADDRESS TO NEXT EWT STRUCTURE RB(Z) NEW:10 END OF THIS EWT STRUCTURE RB NEW:20 CONTINUE WITH NEXT EXTENT XIF * EJECT DSKSUB * * ********** * INXDWT * ********** * * * INXDWT WILL COMPUTE THE DWT ADDRESS ADDED TO THE DOUBLED INDEX. * * INPUT: A6 = DWT ADDRESS * * OUTPUT: A4 = DWT ADDRESS + DOUBLE INDEX * NO REGISTERS ARE DESTROYED * INXDWT EQU * LC A4,DWTOR,A6 INDEX ANK A4,/3 ADR A4,A4 DOUBLE INDEX ADR A4,A6 RB RETURN * EJECT DSKSUB * * ********** * NVLTAB * ********** * * * NVLTAB HOLDS THE TTAB ADDRESSES OF THE TASKS * THAT WILL RECEIVE NEW VOLUME LOADED WHEN A NEW * VOLUME HAS BEEN MOUNTED. * * BIT NO IN DWTNVL NVLTAB EQU * IFT FILMAN=1 DATA TTABFM FMTASK TTAB 15 * IFF DSKPAG+SWPBLK=0 DATA TTABLD LDTASK TTAB 14 XIF * =1 IFT FILMAN=1 NVLEND EQU * * NVLBIT DATA 0 NVL BIT MASK XIF * EJECT DSKSUB * * IFT FILMAN=0 IFF DSKPAG+SWPBLK=0 DATA TTABLD LDTASK TTAB * NVLEND EQU * * NVLBIT DATA 3 NVL BIT MASK XIF * IFT FILMAN=0 IFT DSKPAG+SWPBLK=0 * NVLEND EQU * * NVLBIT DATA 1 NVL BIT MASK XIF * * * END