|
|
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: 33460 (0x82b4)
Notes: pts_type(SC)
Names: »DRCD01.SC«
└─⟦173d42e04⟧ Bits:30009663 Philips computer tape "600105"
└─⟦this⟧ »TOSSWORK/DRCD01.SC«
IDENT DRCD01 REL 10.0 80-04-10 870105041000 * * ********************************************** * * PHILIPS TERMINAL SYSTEM PTS * * DRCD01 = DRIVER FOR ONE/TWO DISC UNITS PTS 6877 * * * * * * * ************************************************** * * * THIS DISC DRIVER HANDLES UP TO TWO DISC * DRIVES PTS 6877 CONNECTED TO CPU VIA * BUILT IN DMA CHANNEL * * * THE FOLLOWING ORDERS ARE TREATED : * * /00 TEST STATUS * /01 BASIC READ * /05 BASIC WRITE * /11 PHYSICAL READ * /15 PHYSICAL WRITE * /1F FORMAT VOLUME * EJECT DRCD01 * * ********************* * * * ENTRIES * * * ********************* * ENTRY CDADR DRIVER ADDRESS BLOCK ENTRY CDON RECOVERY ROUTINE ENTRY IHCD INTERRUPT ROUTINE ENTRY DWCD01 DWT ADDRESS * EJECT DRCD01 * * ************* * EXTERNALS * ************* * * EXTRN TDISP DISPATCHER EXTRN TENDIO END I/O EXTRN SAVE8 SAVE REGS. A1-A8 ON A15 STACK EXTRN NVLCHK CHECK IF NEW VOLUME LOADED EXTRN VOLGET PUT VOLUME NAME IN DWT SET NVL EXTRN VOLNAM VOLUME NAME FROM DWT TO USER BUFFER EXTRN VOLCLR CLEAR VOLUME NAMES IN DWT EXTRN INXDWT DOUBLED INDEX + DWT ADDRESS EXTRN DISIOE REQUEST ERROR EXTRN INIFLG INITIALIZATION FLAG EXTRN PFPOST PWF POST PROCESSING FLAG EXTRN INTSAV SAVE AREA LAST INTERRUPT EXTRN SETIMP TIMER EXTRN TTB:MT EXTRN DWTST STATUS EXTRN DWTECB ECB ADDRESS EXTRN DWTOR DWT INDEX AND ORDER EXTRN DWTA4 SAVE AREA A4 EXTRN DWTA5 SAVE AREA A5 EXTRN DWTORD SAVE AREA FOR ORDER EXTRN ECBBA ECB BUFFER ADDRESS EXTRN ECBRL ECB REQUESTED LENGTH EXTRN ECBEL ECB EFFECTIVE LENGTH EXTRN ECBRC ECB RETURN CODE EXTRN ECBCW1 ECB 1:ST CONTROL WORD EXTRN ECBCW2 ECB 2:ND CONTROL WORD * EJECT DRCD01 * * ************************** * * * CONDITIONAL ASSEMBLY * * * ************************** * * * READ AFTER WRITE MAY BE INCLUDED FOR ORDER /15 * BY SETTING X:B = 1 * X:B EQU 0 RAW EQU X:B * * * THIS DRIVER CAN HANDLE TWO DISC UNITS * IF X:A := 2 * X:A EQU 1 NUNITS EQU X:A * * * A PROGRAM VERSION USING TOSS MMU PAGING * IS OBTAINED BY SETTING MMUPAG EQU 1. * MMUPAG EQU 0 * CPU852 EQU 1 * EJECT DRCD01 * ************************* * * * CONSTANTS * * * ************************* * CUADR EQU /17 CONTROL UNIT ADDRESS CUAD1 EQU CUADR ADDRESS UNIT 1 CUAD2 EQU CUADR+/20 ADDRESS UNIT 2 DEVIND EQU 10 DEVICE INDEX RY3 EQU 3 3 RETRIES PHSECL EQU /180 PHYSICAL SECTOR LENGTH LOSECL EQU /80 LOGICAL SECTOR LENGTH SEZCOM EQU /E800 SEEK ZERO COMMAND CODE SEEKCO EQU /A800 SEEK COMMAND CODE REDCOM EQU /0800 READ COMMAND CODE VERCOM EQU /3800 VERIFY COMMAND CODE WRICOM EQU /1800 WRITE COMMAND CODE WHACOM EQU /22C0 WRITE SECTOR MARKS COMMAND CODE TIME EQU 1000 1 MIN 40 SECONDS MAXCYL EQU 822 MAXIMAL CYLINDER NUMBER MAXSE1 EQU 8 MAXIMAL NUMBER MAXSE2 EQU /53C6 OF SECTORS INLACE EQU 5 INTERLACING FACTOR * EJECT DRCD01 * * * DRIVER ADDRESS BLOCK * * DATA 0 INDICATES NO MMU BUFFER DATA DEVIND DISC DEVICE INDEX CDADR DATA CDAD ACTIVATION ADDRESS DATA 0 ABORT ROUTINE ADDRESS * * * * DRIVER BUFFER * * BUFFER EQU * RES 256 * EJECT DRCD01 * * **************************** * * * ACTIVATION * * * **************************** * CDAD EQU * LDK A5,DWTSB3 ADR A5,A6 GET STACK BASE LD A4,DWTRE1,A6 GET GRAND TOTAL OF RETRIES ST A4,DWTRE2,A6 PRESENT TOTAL RETRY COUNTER CF A15,NVLCHK CHECK IF NEW VOLUME LOADED * SAVE INDEX AND ORDER ADK A7,0 SET CR RF(NZ) CDA:00 NOT TEST STATUS ORDER * EJECT DRCD01 * * ********************* * * * TEST STATUS * * * ********************* * * ORS A1,ECBRC,A8 NVL BIT IM DWTSAV,A6 INDICATE TEST STATUS CF A5,VO:NAM READ VOLUME NAME ANK A1,1 RF(NZ) TESEND NOT OPERABLE LD A8,DWTECB,A6 ECB ADDRESS CF A15,VOLNAM TRANSFER VOLUME NAME TO USER BUFFER LDK A1,0 RESET RETURN CODE TESEND EQU * CM DWTSAV,A6 TEST STATUS DONE RF DENDIO PERFORM ENDIO * EJECT DRCD01 * *************************************** * * * NEW VOLUME LOADED CHECK * * ORDER CODE CHECK * * * *************************************** * * INPUT: A1=NVL RETURN CODE FROM NVLCHK * A7=ORDER CODE * * CDA:00 EQU * ADK A1,0 CHECK IF NEW VOLUME LOADED RF(NZ) DENDIO PERFORM ENDIO SUK A7,1 RF(Z) CD:010 BASIC READ SUK A7,4 RF(Z) CD:000 BASIC WRITE SUK A7,12 RF(Z) CD:010 PHYSICAL READ SUK A7,4 RF(Z) CD:000 PHYSICAL WRITE SUK A7,10 RF(Z) FORMAT FORMAT VOLUME * DUERR ABL DISIOE REQUEST ERROR * INCLEN EQU * REQUESTED LENGTH ERROR LDKL A1,/8008 DENDIO EQU * ABL END:IO * * EJECT DRCD01 * * ********************************* * * * FORMAT VOLUME * * * ********************************* * * FORMAT EQU * LDKL A1,SEEKCO SEEK OPERATION CODE ST A1,DWTSEK,A6 TO SEEK OPERATION AREA CF A5,SEEKZ CYLINDER 0 RF FOR:50 FOR:10 EQU * CF A5,SEEK FOR:50 EQU * CF A5,HOMEAD WRITE SECTOR MARKS IM DWTSEK,A6 NEXT CYLINDER LD A1,DWTSEK,A6 SUKL A1,SEEKCO+MAXCYL SEEK ORDER CODE + MAX CYLINDER NUMBER RB(NZ) FOR:10 NEXT CYLINDER LDKL A2,MAXCYL-1 821 IFT NUNITS=1 ST A2,DWTCYL,A6 CYLINDER NUMBER XIF IFT NUNITS=2 CF A15,INXDWT ST A2,DWTCYL,A4 CYLINDER NUMBER XIF RB DENDIO PERFORM ENDIO * EJECT DRCD01 * * ******************************************** * * * INPUT ECB-PARAMETER CHECK * * * ******************************************** * * CD:000 EQU * LDK A7,5 INDICATE WRITE CD:010 EQU * ML 2,ECBCW1,A8 GET SECTOR NUMBER DSK MAXSE1,MAXSE2 DECIMAL 283590 RB(NN) DUERR LDK A2,0 CLEAR REGISTER LD A1,ECBRL,A8 GET REQUESTED LENGTH RB(Z) INCLEN INCORRECT REQUEST ECR A2,A1 DIVIDE BY 256 ANK A1,/FF REST AFTER DIVISION RB(NZ) INCLEN INCORRECT REQUEST ST A2,DWTLOS,A6 SAVE NUMBER OF LOGICAL SECTORS DA ECBCW1,A8 LOGICAL SECTOR NUMBER DSK MAXSE1,MAXSE2 DECIMAL 283590 RB(P) INCLEN INCORRECT REQUEST * EJECT DRCD01 * * * GET PHYSICAL SECTOR NUMBER * GET BUFFER ADDRESS * PREPARE SECTOR MASK * * IFT MMUPAG=0 LD A2,ECBBA,A8 GET 16 BIT BUFFER ADDRESS ST A2,DWTBA,A6 XIF IFT MMUPAG=1 MLR 2,A8 GET 18 BIT BUFFER ADDRESS SLC A1,4 MOST SIGNIFICANT BITS ANK A1,3 SRL A2,1 MS 2,DWTBA,A6 XIF ML 2,ECBCW1,A8 GET LOGICAL SECTOR NUMBER LDK A3,0 DIVIDE MOST SIGN PART BY 3 CD:100 EQU * ADK A3,1 SUK A1,3 RB(NN) CD:100 ADK A1,3 SUK A3,1 ST A3,DWTSEC,A6 PHYSICAL SECTOR NUMBER DVK 3 DIVIDE BY 3 ST A2,DWTSEC+2,A6 LEAST SIGNIFICANT PART CF A5,MASKPR PREPARE IO MASK ANK A7,4 ORDER CHECK RF(Z) REA:00 READ ORDER EJECT DRCD01 * * ******************************** * * * WRITE SECTORS * * * ******************************** * * LD A3,DWTMAS,A6 SECTOR MASK SUK A3,7 RF(Z) WRI:50 TOTAL PHYSICAL SECTOR WRI:10 EQU * ML 3,DWTBSE,A6 GET IDENTITY OF SECTORS IN DRIVER BUFFER OR A3,DWTMAS,A6 GET SECTOR MASK SUK A3,7 RF(NZ) WRI:20 NOT COMPLETE PHYSICAL SECTOR LD A3,DWTOR,A6 GET UNIT NUMBER ANKL A3,/100 SUR A1,A3 DS DWTSEC,A6 SECTOR NUMBER RF(Z) WRI:30 CORRECT SECTORS IN DRIVER BUFFER * EJECT DRCD01 * * WRI:20 EQU * IM DWTTRA,A6 INDICATE NO TRANSFER CF A5,READ READ SECTORS TO DRIVER BUFFER * WRI:30 EQU * CF A5,WRITE WRITE ONE PHYSICAL SECTOR IFT RAW=1 LD A1,DWTOR,A6 GET ORDER ANK A1,/10 RF(Z) WRI:35 BASIC WRITE CF A5,VERIFY VERIFY IF PHYSICAL WRITE WRI:35 EQU * XIF CF A5,UPDATE LD A1,DWTLOS,A6 GET NUMBER OF LOGICAL SECTORS RF(Z) REA:50 LAST SECTOR DONE CF A5,MASK00 PREPARE SECTOR MASK LD A1,DWTMAS,A6 GET MASK SUK A1,7 RB(NZ) WRI:10 LESS THAN 3 SECTOR IO * EJECT DRCD01 * * WRI:50 EQU * IFT RAW=1 ML 4,DWTBA,A6 SAVE PARAMETERS FOR READ AFTER WRITE MS 4,DWTRAW,A6 IFT MMUPAG=1 LD A1,DWTSEC+2,A6 ST A1,DWTRAW+8,A6 XIF LDK A3,7 ST A3,DWTMAS,A6 SECTOR MASK WRI:55 EQU * CF A5,WRITE IFT RAW=1 IM DWTTRA,A6 INDICATE NO UPDATE OF EFFECTIVE LENGTH XIF CF A5,UPDAT IFT RAW=1 CM DWTTRA,A6 XIF LD A1,DWTLOS,A6 NUMBER OF LOGICAL SECTORS SUK A1,3 RB(NN) WRI:55 NEXT PHYSICAL SECTOR IFT RAW=1 * EJECT DRCD01 * * LD A2,DWTOR,A6 ANK A2,/10 RF(Z) WRI:70 BASIV WRITE ML 4,DWTRAW,A6 RESTORE PARAMETERS FOR VERIFY MS 4,DWTBA,A6 IFT MMUPAG=1 LD A1,DWTRAW+8,A6 ST A1,DWTSEC+2,A6 XIF IFT RAW=1 WRI:60 EQU * CF A5,CIOLOD CF A5,VERIFY CF A5,UPDAT LD A1,DWTLOS,A6 NUMBER OF LOGICAL SECTORS SUK A1,3 RB(NN) WRI:60 NEXT PHYSICAL SECTOR XIF WRI:70 EQU * ADK A1,3 RF(Z) REA:50 LAST SECTOR DONE CF A5,MASK00 PREPARE SECTOR MASK RB WRI:10 LAST SECTORS * EJECT DRCD01 * * ******************************** * * * READ SECTORS * * * ******************************** * * REA:00 EQU * CF A5,READ PERFORM READ CF A5,UPDATE LDK A3,7 ST A3,DWTMAS,A6 SECTOR MASK LD A1,DWTLOS,A6 NUMBER OF LOGICAL SECTORS RF(Z) REA:50 IO READY SUK A1,3 RB(NN) REA:00 AT LEAST ONE PHYSICAL SECTOR CF A5,MASK00 CF A5,READ CF A5,UPDATE LDK A1,0 RESET RETURN CODE REA:50 EQU * ABL END:00 END IO * EJECT DRCD01 * * ********************* * * * READ SECTOR N * * * ********************* * * READ EQU * CF A5,CIOLOD CM DWTBSE+4,A6 CLEAR BUFFER IND. IN CASE OF ERROR LDKL A3,REDCOM GET READ COMMAND CODE ORS A3,DWTCOP,A6 READ A RECORD COMMAND READ00 EQU * LDK A4,RY3 RETRIES READ10 CF A5,CIO EXECUTE READ ANK A1,/F RF(Z) RET34 OK. NO RETURN CODE * * IO ERROR IN READING * IM DWTRE2,A6 SUK A4,1 DECREMENT RETRYCOUNTER RB(P) READ10 3:RD RETRY IN THIS STATE NOT DONE LDK A4,RY3 REINIT RETRYCOUNTER * EJECT DRCD01 * * * UPDATE READ-COMMAND * * LC A2,DWTCOP,A6 ANK A2,/C0 LAST RETRY WITH EARLY- OR LATE- RF(NZ) RET31 DATA STROBE ? LDKL A3,/8000 PREPARE FOR EARLY DATA STROBE ORS A3,DWTCOP,A6 RB READ10 RETRY 3 TIMES WITH EARLY DATA STROBE RET31 EQU * ANK A2,/80 RF(Z) RET32 LAST RETRIES WERE LATE DATA STROBE LDKL A3,/C000 XRS A3,DWTCOP,A6 CHANGE FROM EARLY- TO LATE DATA STROBE RB READ10 RETRY 3 TIMES WITH LATE DATA STROBE RET32 EQU * LDKL A3,/3FFF ANS A3,DWTCOP,A6 RESET LATE DATA STROBE LC A2,DWTCOP+2,A6 ANK A2,/C0 LAST RETRY CARRIAGE+ OR CARRIAGE- RF(NZ) RET33 LDKL A3,/8000 PREPARE FOR CARRIAGE+ ORS A3,DWTCOP+2,A6 RB READ10 RETRY 3 TIMES WITH CARRIAGE+ * EJECT DRCD01 * * RET33 EQU * ANK A2,/80 RF(Z) RET35 LAST RETRY WAS A CARRIAGE- LDKL A3,/C000 XRS A3,DWTCOP+2,A6 CHANGE FROM CARRIAGE+TO CARRIAGE- RB READ10 RETRY 3 TIMES WITH CARRIAGE- RET35 EQU * LD A2,DWTSAV,A6 RB(Z) REA:50 NOT VO:NAM CALLING RET34 EQU * NO MORE RETRIES RTN A5 * EJECT DRCD01 * * ************************** * * * WRITE SECTOR N * * * ************************** * WRITE EQU * CF A5,CIOLOD LDKL A3,WRICOM WRITE ORDER CODE ORS A3,DWTCOP,A6 LDK A4,RY3 RETRIES TO BE PERFORMED WRIT20 EQU * CF A5,CIO ANK A1,/F RF(Z) WRIT50 WRITE OK IM DWTRE2,A6 RETRY PERFORMED SUK A4,1 RB(NZ) WRIT20 RETRY RB REA:50 NO MORE RETRIES WRIT50 EQU * RTN A5 * IFT RAW=1 EJECT DRCD01 * * **************************** * * * VERIFY SECTOR N * * * **************************** * VERIFY EQU * LDKL A3,VERCOM ORDER CODE FOR VERIFY ORS A3,DWTCOP,A6 RB READ00 * XIF EJECT DRCD01 * * * SEEK,SEEKZ,WRITE HOME ADDRESS AND CIO * * SEEK EQU * LDK A2,DWTSEK GET EFFECTIVE ADDRESS TO SEEK OP. RF EXCIO * * SEEKZ EQU * LDK A2,DWTSEZ GET EFFECTIVE ADDRESS TO SEEK 0 OP. RF EXCIO * * HOMEAD EQU * LDK A2,DWTWHA GET WRITE HOME ADDRESS OP. RF EXCIO * * CIO EQU * LDK A2,DWTCOP GET EFFECTIVE ADDRESS TO CIO OP. * EJECT DRCD01 * * EXCIO ADR A2,A6 ST A4,DWTA4,A6 SAVE A4 LD A3,PFPOST RF(NZ) CIOAB PWF POST PROCESSING ON IFT NUNITS=2 CF A15,INXDWT GET INDEXED DWT DISPLACEMENT EX DWTCIO,A4 XIF IFT NUNITS=1 EX DWTCIO,A6 XIF ABL(3) END:30 CIOAB EQU * ST A5,DWTA5,A6 A5 ABL TDISP GO TO DIPATCHER * EJECT DRCD01 * * ***************************************** * * * SUBROUTINE CIOLOD * * PREPARE CIO WORK AREA * * * ***************************************** * * REGISTER DISPOSITION * A1 = WORK REGISTER * A2 = WORK REGISTER * A3 = MASK * A4 = CIO WORK AREA POINTER * A7 = USER BUFFER POINTER * A8 = DRIVER BUFFER POINTER * * DWTTRA = TRANSFER INDICATOR * DWTMAS = MASK INDICATING SECTORS TO/FROM USER BUFFER * DWTBA = BUFFER POINTER * CIOLOD EQU * LDKL A4,-4 ST A4,DWTSAV,A6 COUNTER LDR A4,A6 GET DWT ADDRESS ADK A4,DWTCOP CIO WORK AREA ADDRESS LDKL A8,BUFFER DRIVER BUFFFER ADDRESS LD A3,DWTMAS,A6 GET BUFFER MASK SRC A3,4 MASK IN POSITION LDK A7,0 USER BUFFER POINTER * EJECT DRCD01 * * CIOL10 EQU * ADK A4,4 IM DWTSAV,A6 COUNTER RF(Z) CIOL60 WORK AREA READY SLL A3,1 RF(NN) CIOL50 LDKL A1,/C000+LOSECL NO TRANSFER ORDER LD A2,DWTTRA,A6 TRANSFER INDICATOR RF(NZ) CIOL55 NO TRANSFER * IFT MMUPAG=0 LDKL A1,/4080 LDR A2,A7 BUFFER ADDRESS POINTER AD A2,DWTBA,A6 BUFFER ADDRESS MSR 2,A4 CIO WORK AREA ADKL A7,/100 XIF IFT MMUPAG=1 LDR A2,A7 USER BUFFER POINTER LDKL A1,/804 SHIFTED DA DWTBA,A6 GET USER BUFFER ADDRESS SLL A2,1 IN POSITION SRC A1,4 IN POSITION MSR 2,A4 TO CIO WORK AREA ADK A7,LOSECL UPDATE USER BUFFER POINTER XIF RB CIOL10 * EJECT DRCD01 * * CIOL50 EQU * LDKL A1,/4000+LOSECL LDR A2,A8 DRIVER BUFFER ADKL A8,/100 UPDATE DRIVER BUFFERPOINTER CIOL55 EQU * MSR 2,A4 TO CIO WORK AREA RB CIOL10 CIOL60 EQU * LDKL A1,/B000+LOSECL ANS A1,DWTCOP+12,A6 CLEAR BIT LDKL A1,PHSECL ST A1,DWTCOP+2,A6 CM DWTTRA,A6 CLEAR NO TRANSFER FLAG * EJECT DRCD01 * * ***************************************** * * * PUT SECTOR NUMBER * * AND HEAD NUMBER IN POS. * * * ***************************************** * * INPUT: PHYSICAL SECTOR NUMBER * OUTPUT: INTERLACED SECTOR NUMBER AND HEAD NUMBER * IN POSITION FOR CIO * PERFORM SEEK * ML 2,DWTSEC,A6 PHYSICAL SECTOR NUMBER DVK 115 * A1 = REST = HEAD NUMBER * SECTOR NUMBER * A2 = QUOTIENT = CYLINDER NUMBER LDR A3,A2 SAVE CYLINDER NUMBER LDR A2,A1 LDK A1,0 DVK 23 * A1 = SECTOR NUMBER * A2 = HEAD NUMBER ORKL A2,/800 INTERUPT BIT ST A2,DWTCOP,A6 COP WORK AREA LDR A2,A1 SECTOR NUMBER MUK INLACE INTERLACING SLC A3,1 RF(NN) CIOP10 EVEN CYLINDER NUMBE ADK A2,12 SKEW FACTOR * EJECT DRCD01 * * CIOP10 EQU * DVK 23 GET INTERLACED AND SKEWED SECTOR NUMBER SLL A1,5 IN POSITION ORS A1,DWTCOP,A6 COP WORK AREA SRC A3,1 RESTORE CYLINDER NUMBER IN POSITION IFT NUNITS=2 CF A15,INXDWT CW A3,DWTCYL,A4 RF(E) CIOP50 SAME CYLINDER ST A3,DWTCYL,A4 SAVE CYLINDER NUMBER XIF IFT NUNITS=1 CW A3,DWTCYL,A6 RF(E) CIOP50 SAME CYLINDER ST A3,DWTCYL,A6 SAVE CYLINDER NUMBER XIF ADKL A3,SEEKCO SEEK ORDER ST A3,DWTSEK,A6 SEEK WORK AREA * EJECT DRCD01 * * SEEK CYLINDER * * LDK A4,RY3 RETRIES SE:010 EQU * CF A5,SEEK SEEK CYLINDER N ANK A1,2 RF(Z) CIOP50 OK. SEEK COMPLETED IM DWTRE2,A6 SUK A4,1 DECREMENT RETRY-COUNTER RF(Z) SE:020 LAST RETRY * CF A5,SEEKZ SEEK CYLINDER 0 ANK A1,2 RB(Z) SE:010 CYLINDER ZERO FOUND * SE:020 EQU * RF END:SE SEEK ERROR END IO CIOP50 EQU * RTN A5 * EJECT DRCD01 * * ************************************* * * * SUBROUTINE UPDATE * * * ************************************* * * UPDATES : DWTBSE PRESENT SECTORS IN DRIVER BUFFER * DWTLOS NUMBER OF LOGICAL SECTORS LEFT IN IO * DWTBA USER BUFFER POINTER * DWTSEC PHYSICAL SECTOR POINTER * ECBEL EFFECTIVE LENGTH * UPDATE EQU * LDK A2,0 LD A3,DWTMAS,A6 GET SECTOR MASK C1R A3,A3 COMPLIMENT ANK A3,7 3 BITS LD A1,DWTOR,A6 GET INDEX ANKL A1,/100 UNIT NUMBER DA DWTSEC,A6 SECTOR NUMBER MS 3,DWTBSE,A6 SAVE UPDAT EQU * LD A1,DWTMAS,A6 GET SECTOR MASK LDK A2,0 SRC A1,3 UPDA00 EQU * RF(NN) UPDA10 IO TO/FROM DRIVER BUFFER ADK A2,1 NUMBER OF SECTORS IN LAST IO UPDA10 EQU * SLL A1,1 RB(NZ) UPDA00 MORE SECTORS * EJECT DRCD01 * * LD A3,DWTLOS,A6 UPDATE DWTLOS SUR A3,A2 ST A3,DWTLOS,A6 * IFT MMUPAG=1 SLL A2,7 UPDATE DWTBA LDR A3,A2 SAVE LENGTH DA DWTBA,A6 MS 2,DWTBA,A6 SLL A3,1 XIF IFT MMUPAG=0 SLL A2,8 ADS A2,DWTBA,A6 UPDATE BUFFER POINTER XIF * IFT RAW=1 LD A1,DWTTRA,A6 RF(Z) UPDA50 UPDATE EFFECTIVE LENGTH LD A7,DWTOR,A6 GET ORDER ANK A7,/10 RF(NZ) UPDA60 XIF * EJECT DRCD01 * * UPDA50 EQU * IFT MMUPAG=1 ADS A3,ECBEL,A8 XIF IFT MMUPAG=0 ADS A2,ECBEL,A8 UPDATE EFFECTIVE LENGTH XIF UPDA60 EQU * * LDK A1,0 LDK A2,1 DA DWTSEC,A6 MS 2,DWTSEC,A6 * RTN A5 EJECT DRCD01 * * ******************************************* * * * SUBROUTINE MASKPR * * SET BITS FOR LOGICAL * * SECTORS IN PHYSICAL * * * ******************************************* * * A1 = POSITION IN SECTOR * DWTLOS = NUMBER OF SECTORS * * MASK00 EQU * LDK A1,0 MASKPR EQU * LD A3,DWTLOS,A6 NUMBER OF SECTORS SUK A3,2 LDK A3,4 1 0 0 RF(N) MASK10 1 SECTOR LEFT IN IO LDK A3,6 1 1 0 RF(Z) MASK10 2 SECTORS LEFT IN IO LDK A3,7 1 1 1 MASK10 EQU * SUK A1,1 RF(Z) MASK20 0 1 0 RF(N) MASK30 1 0 0 SRL A3,1 0 0 1 MASK20 EQU * SRL A3,1 MASK30 EQU * ST A3,DWTMAS,A6 SAVE MASK RTN A5 * EJECT DRCD01 * * ************************* * * * PERFORM END IO * * * ************************* * END:SE EQU * SEEK ERROR IFT NUNITS=1 LDKL A3,/FFFF ST A3,DWTCYL,A6 DUMMY CYLINDER NUMBER XIF IFT NUNITS=2 CF A15,INXDWT LDKL A3,/FFFF ST A3,DWTCYL,A4 DUMMY CYLINDER NUMBER XIF END:00 EQU * LD A2,DWTRE2,A6 CW A2,DWTRE1,A6 RF(E) END:IO ST A2,DWTRE1,A6 GRAND TOTAL OF RETRIES ORKL A1,/100 RETRIES PERFORMED * END:IO EQU * CF A15,TENDIO PERFORM TENDIO T:DISP EQU * ABL TDISP END:30 EQU * LDK A1,1 ST A1,DWTST,A6 RB END:IO * EJECT DRCD01 * * ********************** * * * RECOVERY ROUTINE * * * ********************** * * CDON EQU * IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * LDKL A6,DWCD01 LDK A5,DWTSB3 GET STACK BASE ADR A5,A6 LDKL A1,-1 ST A1,DWTSAV,A6 INDICATE RECOVERY CM DWTST,A6 UNIT BUSY LD A1,INIFLG INITIALIZATION FLAG RF(NZ) CDON05 NOT POWER UP * EJECT DRCD01 * * IFT NUNITS=2 CM DWTOR,A6 1ST UNIT CF A5,SEEKZ TEST IF OPERABLE ANK A1,1 RF(NZ) CDON26 NOT OPERABLE LDK A1,1 SC A1,DWTOR,A6 2ND UNIT XIF CF A5,SEEKZ TEST IF OPERABLE ANK A1,1 RF(NZ) CDON26 NOT OPERABLE * EJECT DRCD01 * * CDON05 EQU * CM DWTOR,A6 1ST UNIT CF A5,VO:NAM IFT NUNITS=2 LDK A1,1 2ND UNIT SC A1,DWTOR,A6 CF A5,VO:NAM XIF IM DWTST,A6 INDICATE VOLUME NAMES READ CM DWTSAV,A6 RECOVERY DONE * LD A8,DWTECB,A6 GET ECB ADDRESS RB(Z) END:IO NO REQUEST ON * CDON10 LD A7,DWTORD,A6 GET ORDER ST A7,DWTOR,A6 RESTORE INDEX AND ORDER ANK A7,/3F * CM ECBEL,A8 RESET EFFECTIVE LENGTH ABL CDAD REPEAT REQUEST * EJECT DRCD01 * * READY INTERRUPT * CDREDY LD A1,TIMER RF(Z) CDON50 NO TIMER ACTIVE * IFT NUNITS=1 CM* TIMER KILL TIMER RF CDON40 XIF * IFT NUNITS=2 RB T:DISP TIMER ACTIVE XIF * EJECT DRCD01 * * CDON26 EQU * LDKL A4,TIMER TIMER POINTER ADDRESS LDR* A3,A4 RF(Z) CDON30 NO TIMER ACTIVE LDKL A1,-TIME STR A1,A3 RESTART TIMER RB T:DISP * * CDON30 CF A15,SETIMP START TIMER DATA CDON40,TIME TIME OUT ADDRESS, TIME RB T:DISP * * TIME OUT * CDON40 LDKL A6,DWCD01 CM TIMER CDON50 EQU * CM DWTST,A6 UNIT BUSY LDKL A1,-1 ST A1,DWTSAV,A6 INDICATE RECOVERY LDK A5,DWTSB3 GET STACK BASE ADR A5,A6 RB CDON05 * EJECT DRCD01 * * *********************** * * * INTERRUPT HANDLER * * * *********************** * * IHCD EQU * ST P,INTSAV SAVE LAST INTERRUPT MSR 8,A15 SAVE REGISTERS ON STACK LDKL A6,DWCD01 DWT ADDRESS SST A1,CUADR GET STATUS LDR A2,A1 SLL A2,1 RB(N) CDREDY READY INTERRUPT ANKL A2,/1400 RF(Z) IHCD50 ORK A1,2 IHCD50 EQU * ANK A1,/F LD A8,DWTECB,A6 GET ECB ADDRESS LDR A3,A1 RETURN CODE LD A2,DWTSAV,A6 RF(NZ) IHCD70 VO:NAM CALLING ANK A3,1 RB(NZ) END:IO NOT OPERABLE IHCD70 EQU * LD A5,DWTA5,A6 GET STACK POINTER LD A4,DWTA4,A6 GET RETRY COUNTER RTN A5 * EJECT DRCD01 * * VO:NAM EQU * CF A5,SEEKZ ANK A1,3 RF(NZ) VO:NA7 ERROR LDR A7,A5 SAVE STACK POINTER MLK 5 DATA /800,PHSECL,/4000+LOSECL+LOSECL DATA BUFFER,/8000+LOSECL MS 5,DWTCOP,A6 LDR A5,A7 RESTORE STACK POINTER CF A5,READ00 READ SECTOR 0 TO DRIVER BUFFER CM DWTBSE+4,A6 CLEAR IN CASE OF ERROR ANK A1,/F RF(NZ) VO:NA7 ERROR LD A1,DWTOR,A6 ANKL A1,/100 UNIT NUMBER LDK A2,0 LDK A3,6 MS 3,DWTBSE,A6 UPDATE DRIVER BUFFER INDICATOR LDKL A2,BUFFER LDK A3,/FC FILE CODE LD A1,DWTSAV,A6 RF(N) VO:NA5 LDKL A3,/80FC INDICATE TEST STATUS VO:NA5 EQU * CF A15,VOLGET VOLUME NAME TO DWT * EJECT DRCD01 * * LDK A1,0 RESET RETURN CODE LDK A3,0 CYLINDER NUMBER RF VO:NA8 VO:NA7 EQU * LDK A1,6 CLEAR SEX BYTES CF A15,VOLCLR LDR A1,A3 RETURN CODE LDKL A3,/FFFF DUMMY CYLINDER NUMBER VO:NA8 EQU * IFT NUNITS=1 ST A3,DWTCYL,A6 HEAD POSITION XIF IFT NUNITS=2 CF A15,INXDWT ST A3,DWTCYL,A4 XIF RTN A5 * * * TIMER POINTER * TIMER DATA 0 * EJECT DRCD01 * * ************************************* * * * DEVICE WORK TABLE * * * ************************************* * * DWCD01 EQU * DATA 0 DATA /8000 DWT STATUS DATA 0 ECB ADDRESS DATA 0 ORDER DATA CDADR ACTIVATION ADDRESS DATA 0 TTAB ADDRESS DATA 0 WAIT/ACTIVATE INDICATOR DATA 0 TERMINAL QUEUE * IFT MMUPAG=1 DATA 0 SAVE AREA USER ECB ADDRESS DATA ECBCD1 MMU ECB ADDRESS XIF * DWTTRA EQU *-DWCD01 DATA 0 DATA 0,0,0 SAVE AREA FOR REGISTERS DWTBSE EQU *-DWCD01 DRIVER BUFFER INDICATOR DATA 0,0,0 DWTSAV EQU *-DWCD01 DATA 0 * EJECT DRCD01 * * DATA 0 DATA /8000 NEW VOLUME LOADED INDICATOR UNIT 1 DATA /8000 NEW VOLUME LOADED INDICATOR UNIT 2 DWTRE1 EQU *-DWCD01 GRAND TOTAL RETRY COUNTER DATA 0 DWTRE2 EQU *-DWCD01 TOTAL RETRY COUNTER DATA 0 DATA /FFFF,/FFFF,/FFFF VOLUME NAME UNIT 1 IFT NUNITS=2 DATA /FFFF,/FFFF,/FFFF VOLUME NAME UNIT 2 XIF DWTBA EQU *-DWCD01 USER BUFFER POINTER DATA 0 IFT MMUPAG=1 DATA 0 XIF DWTLOS EQU *-DWCD01 LOGICAL SECTOR COUNTER DATA 0 DWTSEC EQU *-DWCD01 PHYSICAL SECTOR NUMBER DATA 0,0 DWTMAS EQU *-DWCD01 LOGICAL SECTOR MASK DATA 0 * EJECT DRCD01 * * CIO WORK AREAS * DWTCIO EQU *-DWCD01 CIO INTRUCTIONS AREA CIO A2,1,CUAD1 CIO ON 1ST UNIT IFT NUNITS=2 CIO A2,1,CUAD2 CIO ON 2ND UNIT XIF DWTSEK EQU *-DWCD01 SEEK OPERATION AREA DATA SEEKCO DWTSEZ EQU *-DWCD01 SEEK TO ZERO OPERATION AREA DATA SEZCOM DWTWHA EQU *-DWCD01 WRITE HOME ADDRESS AND SECTOR MARK DATA WHACOM DATA PHSECL DATA WHACOM+1 DATA PHSECL DATA WHACOM+2 DATA PHSECL DATA WHACOM+3 DATA PHSECL DATA WHACOM+/804 INTERRUPT BIT SET DATA PHSECL DWTCOP EQU *-DWCD01 CIO WORK AREA DATA 0,0,0,0 DATA 0,0,0,0 * EJECT DRCD01 * * DWTCYL EQU *-DWCD01 PRESENT CYLINDER NUMBER DATA /FFFF UNIT 1 IFT NUNITS=2 DATA /FFFF UNIT 2 XIF DATA 0,0 DATA 0,0 DATA 0,0 DWTSB3 EQU *-DWCD01-2 STACK IFT RAW=1 DWTRAW EQU *-DWCD01 READ AFTER WRITE SAVE AREA DATA 0,0,0,0 IFT MMUPAG=1 DATA 0 XIF IFT MMUPAG=1 ECBCD1 EQU * DATA 0,0,0,0,0,0,0 XIF * END