|
|
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: 39676 (0x9afc)
Notes: pts_type(SC)
Names: »DRCD02.SC«
└─⟦13e5fd45a⟧ Bits:30009699 Philips computer tape "600507"
└─⟦this⟧ »TOSSWORK/DRCD02.SC«
IDENT DRCD02 REL 11.0 81-04-06 870105041100 * * ********************************************** * * PHILIPS TERMINAL SYSTEM PTS * * DRCD02 = DRIVER FOR ONE/TWO DISC UNITS PTS 6877 * PTS 6961 OR PTS 6962 * * * * * * * ************************************************** * * * THIS DISC DRIVER HANDLES UP TO TWO DISC * UNITS 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 DRCD02 * * ********************* * * * ENTRIES * * * ********************* * ENTRY CDADR DRIVER ADDRESS BLOCK ENTRY CDON RECOVERY ROUTINE ENTRY IHCD INTERRUPT ROUTINE ENTRY DWCD01 DWT ADDRESS * EJECT DRCD02 * * ************* * 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 DRCD02 * * ************************** * * * CONDITIONAL ASSEMBLY * * * ************************** * * * THIS DRIVER CAN HANDLE TWO DISC UNITS * IF X:A := 2 * X:A EQU 1 NUNITS EQU X:A * * * 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 BE ADAPTED FOR EITHER SMD DRIVES * OR CMD DRIVES , THE CMD VERSION IS OBTAINED BY * SETTING X:C = 0 * X:C EQU 0 SMDIND EQU X:C * EJECT DRCD02 * * * IF CMD REQUIRED IT CAN BE ADAPTED FOR EITHER * 16+16 MB OR 16+80 MB * IF 16+80 MB IS CONNECTED AS 1ST DRIVE * SET X:D = 1 * IF 16+80 MB IS CONNECTED AS 2ND DRIVE SET * X:E = 1 * X:D EQU 0 CMDIX1 EQU X:D * X:E EQU 0 CMDIX2 EQU X:E * A PROGRAM VERSION USING TOSS MMU PAGING * IS OBTAINED BY SETTING MMUPAG EQU 1. * MMUPAG EQU 0 * CPU852 EQU 1 * EJECT DRCD02 * ************************* * * * 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 NOTRAN EQU /8000 NO TRANSFER BIT TIME EQU 1000 1 MIN 40 SECONDS MAXCYL EQU 822 MAXIMAL CYLINDER NUMBER MS80M1 EQU 8 MAXIMAL NUMBER 80 MB MS80M2 EQU /53C6 SPC80M EQU 115 MS16M1 EQU 1 16MB DISC PARAMETERS MS16M2 EQU /5D8E SPC16M EQU 23 INLACE EQU 5 INTERLACING FACTOR SEPRTR EQU 23 SECTORS PER TRACK * EJECT DRCD02 * * ************************ * DRIVE TYPE DEPENDENT * * CONSTANTS * ************************ * * IFT SMDIND=1 IF SMD DRIVE(S) IS CONNNECTED MXSE11 EQU MS80M1 MAX SCTOR NUMBER MXSE12 EQU MS80M2 MXSE21 EQU MS80M1 MXSE22 EQU MS80M2 MXSE31 EQU 0 MXSE32 EQU 0 MXSE41 EQU 0 MXSE42 EQU 0 SPCUN1 EQU SPC80M SECTORS PER CYLINDER SPCUN2 EQU SPC80M SPCUN3 EQU 0 SPCUN4 EQU 0 XIF IFT SMDIND=0 IF CMD DRIVE(S) IS CONNECTED MXSE11 EQU MS16M1 MAX SECTOR NUMBER MXSE12 EQU MS16M2 MXSE31 EQU MS16M1 MXSE32 EQU MS16M2 SPCUN1 EQU SPC16M SPCUN3 EQU SPC16M SECTORS PER CYLINDER IFT CMDIX1=0 16+16 CONNECTED MXSE21 EQU MS16M1 MXSE22 EQU MS16M2 SPCUN2 EQU SPC16M XIF IFT SMDIND+CMDIX2=0 16+16 CONNECTED MXSE41 EQU MS16M1 MXSE42 EQU MS16M2 SPCUN4 EQU SPC16M XIF IFT SMDIND=0 IFT CMDIX1=1 16+80 CONNECTED MXSE21 EQU MS80M1 MXSE22 EQU MS80M2 SPCUN2 EQU SPC80M XIF IFT SMDIND=0 IFT CMDIX2=1 16+80 CONNECTED MXSE41 EQU MS80M1 MXSE42 EQU MS80M2 SPCUN4 EQU SPC80M XIF * EJECT DRCD02 * * * 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 DRCD02 * * **************************** * * * 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 DRCD02 * * ********************* * * * 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 CF A15,INXDWT LD A4,DWTSPC,A4 SECTORS PER TRACK SUK A4,SPC16M RF(NE) TESE10 NOT 16MB DISC ORKL A1,/800 INDICATE 16MB DISC IN RC TESE10 EQU * RF DENDIO PERFORM ENDIO * EJECT DRCD02 * *************************************** * * * 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 DRCD02 * * ********************************* * * * 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 * MLK 3 DATA REDCOM DATA LOSECL DATA NOTRAN+LOSECL MS 3,DWTCOP,A6 PREPARE FOR READ LDR A4,A6 WHA POINTER * EJECT DRCD02 * * FOR:60 EQU * LDK A1,/EF RESET DEVICE NUMBER BIT ANS A1,DWTWHA,A4 LD A1,ECBCW1,A8 RF(Z) FOR:70 NO BAD TRACK FLAG CHECK CF A5,CIO READ PART OF SECTOR SRL A1,8 BAD TRACK FLAG INDICATOR FOR:70 EQU * ORK A1,/22 PREPARE WHA SC A1,DWTWHA,A4 IM DWTCOP,A6 NEXT HEAD ADK A4,4 LDR A2,A4 SUR A2,A6 SRL A2,2 /4 MUK SEPRTR LC A1,DWTOR,A6 INDEX ANK A1,3 SLL A1,1 ADR A1,A6 CW A2,DWTSPC,A1 RB(L) FOR:60 NEXT HEAD LDKL A1,/800 INTERUPT BIT ORS A1,DWTWHA-4,A4 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 LD A3,DWTSMD,A6 RF(NZ) FOR:80 SMD DISC LC A4,DWTOR,A6 GET DISPLACEMENT ANK A4,2 ADR A4,A6 FOR:80 EQU * ST A2,DWTCYL,A4 CYLINDER NUMBER XIF RB DENDIO PERFORM ENDIO EJECT DRCD02 * * ******************************************** * * * INPUT ECB-PARAMETER CHECK * * * ******************************************** * * CD:000 EQU * LDK A7,5 INDICATE WRITE CD:010 EQU * LC A4,DWTOR,A6 ANK A4,3 SLL A4,2 *4 ADR A4,A6 ML 2,ECBCW1,A8 GET SECTOR NUMBER DS DWTSMX,A4 CHECK SECTOR NUMBER 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 DS DWTSMX,A4 RB(P) INCLEN INCORRECT REQUEST * EJECT DRCD02 * * * GET PHYSICAL SECTOR NUMBER * GET BUFFER ADDRESS * PREPARE SECTOR MASK * * MLR 2,A8 GET 18 BIT BUFFER ADDRESS SLC A1,4 MOST SIGNIFICANT BITS ANK A1,3 SRL A2,1 MS 2,DWTBA,A6 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 DRCD02 * * ******************************** * * * 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,/300 SUR A1,A3 DS DWTSEC,A6 SECTOR NUMBER RF(Z) WRI:30 CORRECT SECTORS IN DRIVER BUFFER * EJECT DRCD02 * * 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 DRCD02 * * WRI:50 EQU * IFT RAW=1 ML 4,DWTBA,A6 SAVE PARAMETERS FOR READ AFTER WRITE MS 4,DWTRAW,A6 LD A1,DWTSEC+2,A6 ST A1,DWTRAW+8,A6 LDK A3,7 ST A3,DWTMAS,A6 SECTOR MASK XIF 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 DRCD02 * * LD A2,DWTOR,A6 ANK A2,/10 RF(Z) WRI:70 BASIC WRITE ML 4,DWTRAW,A6 RESTORE PARAMETERS FOR VERIFY MS 4,DWTBA,A6 LD A1,DWTRAW+8,A6 ST A1,DWTSEC+2,A6 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 DRCD02 * * ******************************** * * * 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 DRCD02 * * ********************* * * * 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 DRCD02 * * * 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 DRCD02 * * 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 LDR A3,A1 RETURN CODE RTN A5 * EJECT DRCD02 * * ************************** * * * 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 DRCD02 * * **************************** * * * VERIFY SECTOR N * * * **************************** * VERIFY EQU * LDKL A3,VERCOM ORDER CODE FOR VERIFY ORS A3,DWTCOP,A6 RB READ00 * XIF EJECT DRCD02 * * * SEEK,SEEKZ,WRITE HOME ADDRESS AND CIO * * SEEK EQU * LDK A2,DWTSEK GET EFFECTIVE ADDRESS TO SEEK OP. RF SEEK00 * * SEEKZ EQU * LDK A2,DWTSEZ GET EFFECTIVE ADDRESS TO SEEK 0 OP. SEEK00 EQU * ADR A2,A6 RF EXCIO * * HOMEAD EQU * LDK A2,DWTWHA GET WRITE HOME ADDRESS OP. RF CIO00 * * CIO EQU * LDK A2,DWTCOP GET EFFECTIVE ADDRESS TO CIO OP. * CIO00 EQU * ADR A2,A6 LD A3,DWTSMD,A6 RF(NZ) CIO10 SMD LC A3,DWTOR,A6 INDEX ANK A3,1 UNIT NUMBER SLL A3,4 ORRS A3,A2 CIO10 EQU * EJECT DRCD02 * * EXCIO EQU * 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 LD A3,DWTSMD,A6 RF(NZ) CIO20 SMD DRIVE LC A4,DWTOR,A6 ANK A4,2 ADR A4,A6 ADDRESS IN DWT CIO20 EQU * 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 DRCD02 * * ***************************************** * * * 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-2 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 LDKL A1,/4000+LOSECL PREPARE PARTIAL LENGTH ST A1,6,A4 ST A1,12,A4 ST A1,18,A4 * EJECT DRCD02 * * CIOL10 EQU * LDK A1,0 ADK A4,6 IM DWTSAV,A6 COUNTER RF(Z) CIOL60 WORK AREA READY SLL A3,1 RF(NN) CIOL50 TO/FROM DRIVER BUFFER LD A2,DWTTRA,A6 TRANSFER INDICATOR RF(NZ) CIOL55 NO TRANSFER * LDR A2,A7 USER BUFFER POINTER DA DWTBA,A6 GET USER BUFFER ADDRESS SLL A2,1 IN POSITION ADK A7,LOSECL UPDATE USER BUFFER POINTER RF CIOL58 * EJECT DRCD02 * * CIOL50 EQU * LDR A2,A8 DRIVER BUFFER ADKL A8,/100 UPDATE DRIVER BUFFERPOINTER RF CIOL58 CIOL55 EQU * LDKL A1,/C000+LOSECL NO TRANSFER STR A1,A4 CIOL58 EQU * MS 2,2,A4 RB CIOL10 CIOL60 EQU * LDKL A1,/8000+LOSECL ANS A1,DWTCOP+16,A6 CLEAR BIT LDKL A1,PHSECL ST A1,DWTCOP+2,A6 CM DWTTRA,A6 CLEAR NO TRANSFER FLAG * EJECT DRCD02 * * ***************************************** * * * 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 * CF A15,INXDWT ML 2,DWTSEC,A6 PHYSICAL SECTOR NUMBER DV DWTSPC,A4 SECTORS PER CYLINDER * 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 SRC A3,1 RF(NN) CIOP10 EVEN CYLINDER NUMBE ADK A2,12 SKEW FACTOR * EJECT DRCD02 * * CIOP10 EQU * DVK SEPRTR GET INTERLACED AND SKEWED SECTOR NUMBER SLL A1,5 IN POSITION ORS A1,DWTCOP,A6 COP WORK AREA SLC A3,1 RESTORE CYLINDER NUMBER IN POSITION IFT NUNITS=2 LD A1,DWTSMD,A6 SMD FLAG RF(NZ) CIOP20 SMD DRIVE LC A4,DWTOR,A6 INDEX ANK A4,2 ADR A4,A6 CIOP20 EQU * 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 DRCD02 * * 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 DRCD02 * * ************************************* * * * 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,/300 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 DRCD02 * * LD A3,DWTLOS,A6 UPDATE DWTLOS SUR A3,A2 ST A3,DWTLOS,A6 SLL A2,7 UPDATE DWTBA LDR A3,A2 SAVE LENGTH DA DWTBA,A6 MS 2,DWTBA,A6 SLL A3,1 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 DRCD02 * * UPDA50 EQU * ADS A3,ECBEL,A8 UPDA60 EQU * * LDK A1,0 LDK A2,1 DA DWTSEC,A6 MS 2,DWTSEC,A6 * RTN A5 EJECT DRCD02 * * ******************************************* * * * 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 DRCD02 * * ************************* * * * 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 LD A3,DWTSMD,A6 RF(NZ) END:S1 SMD DRIVE LC A4,DWTOR,A6 ANK A4,2 ADR A4,A6 END:S1 EQU * 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 ORS A1,DWTST,A6 INDICATE RECOVERY DONE RB END:IO * EJECT DRCD02 * * ********************** * * * 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 LDKL A1,/7FFE SET UNIT BUSY AND RECOVERY ON ANS A1,DWTST,A6 CM DWTSMD,A6 INDICATE CMD DRIVE LD A1,INIFLG INITIALIZATION FLAG RF(NZ) CDON05 NOT POWER UP * EJECT DRCD02 * * IFT NUNITS=2 CM DWTOR,A6 1ST UNIT CF A5,SEEKZ TEST IF OPERABLE ANK A1,1 RF(NZ) CDON80 NOT OPERABLE LDK A1,2 SC A1,DWTOR,A6 2ND UNIT XIF CF A5,SEEKZ TEST IF OPERABLE ANK A1,1 RF(NZ) CDON80 NOT OPERABLE * EJECT DRCD02 * * CDON05 EQU * CM DWTOR,A6 1ST UNIT CF A5,VO:NAM LDK A1,1 2ND UNIT SC A1,DWTOR,A6 CF A5,VO:NAM IFT NUNITS=2 LDK A1,2 SC A1,DWTOR,A6 CF A5,VO:NAM 3RD VOLUME LDK A1,3 SC A1,DWTOR,A6 CF A5,VO:NAM 4TH VOLUME XIF * EJECT DRCD02 * * CDON30 EQU * 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 * CDON40 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 DRCD02 * * READY INTERRUPT * CDREDY LD A1,TIMER RF(Z) CDON95 NO TIMER ACTIVE * IFT NUNITS=1 CM* TIMER KILL TIMER RF CDON90 XIF * IFT NUNITS=2 RB T:DISP TIMER ACTIVE XIF * EJECT DRCD02 * * CDON80 EQU * LDKL A4,TIMER TIMER POINTER ADDRESS LDR* A3,A4 RF(Z) CDON85 NO TIMER ACTIVE LDKL A1,-TIME STR A1,A3 RESTART TIMER RB T:DISP * * CDON85 CF A15,SETIMP START TIMER DATA CDON90,TIME TIME OUT ADDRESS, TIME RB T:DISP * * TIME OUT * CDON90 LDKL A6,DWCD01 CM TIMER CDON95 EQU * LDKL A1,/7FFE SET UNIT BUSY AND RECOVERY ON ANS A1,DWTST,A6 LDKL A1,-1 ST A1,DWTSAV,A6 INDICATE RECOVERY LDK A5,DWTSB3 GET STACK BASE ADR A5,A6 RB CDON05 * EJECT DRCD02 * * *********************** * * * INTERRUPT HANDLER * * * *********************** * * * OUTPUT BIT 1 12 13 14 15 * INPUT BIT * 1 READY AFTER UNREADY * 2 BAD TRACK FLAG X X * 4 RECORD NOT FOUND X * 6 SEEK ERROR X * 9 DRIVE NUMBER * 12 INCORRECT LENGTH X * 13 PARITY ERROR X * 14 THROUGHPUT ERROR X * 15 NOT OPERABLE X * 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 ANK A1,/F KEEP BITS SLL A2,1 RB(N) CDREDY READY INTERRUPT SLL A2,1 RF(NN) IHCD40 NOT BAD TRACK FLAG ORKL A1,/4004 INDICATE BAD TRACK FLAG * EJECT DRCD02 * * IHCD40 EQU * ANKL A2,/2800 RF(Z) IHCD50 ORK A1,2 IHCD50 EQU * 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 ABL(NZ) END:IO NOT OPERABLE IHCD70 EQU * LD A5,DWTA5,A6 GET STACK POINTER LD A4,DWTA4,A6 GET RETRY COUNTER RTN A5 * EJECT DRCD02 * ********** * VO:NAM * ********** * * VO:NAM EQU * CF A5,SEEKZ ANK A1,3 RF(NZ) VO:NA7 ERROR MLK 3 DATA /800,PHSECL,/4000+LOSECL+LOSECL MS 3,DWTCOP,A6 PREPARE CIO WORK AREA MLK 3 DATA 0,BUFFER,/8000+LOSECL MS 3,DWTCOP+6,A6 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,/300 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 DRCD02 * * 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 LD A2,DWTSMD,A6 RF(NZ) VO:NA9 SMD LC A4,DWTOR,A6 ANK A4,2 ADR A4,A6 VO:NA9 EQU * ST A3,DWTCYL,A4 XIF RTN A5 * * * TIMER POINTER * TIMER DATA 0 * EJECT DRCD02 * * ************************************* * * * 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 DRCD02 * * DATA 0 DATA /8000 NEW VOLUME LOADED INDICATOR UNIT 1 DATA /8000 NEW VOLUME LOADED INDICATOR UNIT 2 DATA /8000 UNIT 3 DATA /8000 UNIT 4 DATA /FFFF,/FFFF,/FFFF VOLUME NAME UNIT 1 DATA /FFFF,/FFFF,/FFFF VOLUME NAME UNIT 2 IFT NUNITS=2 DATA /FFFF,/FFFF,/FFFF VOLUME NAME UNIT 3 DATA /FFFF,/FFFF,/FFFF VOLUME NAME UNIT 4 XIF DWTBA EQU *-DWCD01 DATA 0,0 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 DWTSMD EQU *-DWCD01 DATA SMDIND FLAG INDICATING SMD DRIVE(S) * EJECT DRCD02 * * 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 DATA 0,0,0 DWTRE1 EQU *-DWCD01 GRAND TOTAL RETRY COUNTER DATA 0 DWTRE2 EQU *-DWCD01 TOTAL RETRY COUNTER DATA 0 * EJECT DRCD02 * * DWTCYL EQU *-DWCD01 PRESENT CYLINDER NUMBER DATA /FFFF UNIT 1 IFT NUNITS=2 DATA /FFFF 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 DATA 0 XIF IFT MMUPAG=1 ECBCD1 EQU * DATA 0,0,0,0,0,0,0 XIF DWTSMX EQU *-DWCD01 MAX SECTOR NUMBER DATA MXSE11,MXSE12 DATA MXSE21,MXSE22 IFT NUNITS=2 DATA MXSE31,MXSE32 DATA MXSE41,MXSE42 XIF DWTSPC EQU *-DWCD01 SECTORS PER CYLINDER DATA SPCUN1 DATA SPCUN2 IFT NUNITS=2 DATA SPCUN3 DATA SPCUN4 XIF * END