|
|
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: 58976 (0xe660)
Notes: pts_type(SC)
Names: »DRDU01.SC«
└─⟦48601905a⟧ Bits:30009668 Philips computer tape "600121"
└─⟦this⟧ »M:TU10/DRDU01.SC«
└─⟦d2a299635⟧ Bits:30009698 Philips computer tape "600415"
└─⟦this⟧ »M:TU10/DRDU01.SC«
IDENT DRDU01 REL 10.0 80-03-14 870105041000 * * ************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * DRDU01 = DRIVER FOR ONE/TWO DISC UNITS * * PTS 6875 (X1215) AND/OR PTS 6876 (X1216) * * * * * ************************************************** * * * THIS DISC DRIVER HANDLES UP TO TWO DISC * DRIVES X1215,X1216 CONNECTED TO CPU VIA IOP * ON MULTIPLEX 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 DRDU01 DRDU01 * * *********** * ENTRIES * *********** * * ENTRY DUADR ACTIVATION ADDRESS ENTRY DUON RECOVERY ROUTINE ENTRY IHDU1 INTERRUPT HANDLER DISC UNIT NO. 1 ENTRY IHDU INTERRUPT HANDLER DISC UNIT NO. 1 ENTRY IHDU2 INTERRUPT HANDLER DISC UNIT NO. 2 ENTRY DWDU01 DWT ADDRESS DISC UNIT NO. 1 EJECT DRDU01 * * ************* * 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 DWTA2 SAVE AREA A2 EXTRN DWTA4 SAVE AREA A4 EXTRN DWTA5 SAVE AREA A5 EXTRN DWTSB1 STACK BASE 1 IN DWT EXTRN DWTSB2 STACK BASE 2 IN DWT EXTRN DWTUEC USER ECB ADDRESS EXTRN DWTORD SAVE AREA FOR ORDER EXTRN DWTNVL NEM VOLUME LOADED INDICATORS EXTRN DWTVOL VOLUME NAMES EXTRN DWTTAB TTAB ADDRESS 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 DRDU01 * * ************************** * * * CONDITIONAL ASSEMBLY * * * ************************** * * * READ AFTER WRITE MAY BE EXCLUDED FOR ORDER /15 * BY SETTING X:A = 0 * X:A EQU 0 RAW EQU 1 * * * THIS DRIVER CAN HANDLE TWO DISC UNITS * IF X:B := 2 * X:B EQU 1 NUNITS EQU 2 * * * 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 * EJECT DRDU01 * * * A PROGRAM VERSION USING THE INSTRUCTION SET OF * CPU 857 IS OBTAINED BY SETTING CPU857 EQU 1 * X:E EQU 0 CPU857 EQU 00 * * * PROGRAM VERSION FOR FORMAT * A2 IS OBTAINED BY SETTING VERSA2 EQU 1 * A3 IS OBTAINED BY SETTING VERSA3 EQU 1 * X:C EQU 1 VERSA2 EQU 1 * X:D EQU 1 VERSA3 EQU 1 * EJECT DRDU01 DRDU01 * * ************* * CONSTANTS * ************* * * DAF1 EQU /28 DEVICE ADDRESS FIXED DISC NO. 1 DAC1 EQU /08 DEVICE ADDRESS CARTRIDGE DISC NO. 1 DAF2 EQU /38 DEVICE ADDRESS FIXED DISC NO. 2 DAC2 EQU /18 DEVICE ADDRESS CARTRIDGE DISC NO. 2 WER1 EQU /10 MULTIPLEXOR ADDRESS CUADR EQU /08 CONTROL UNIT ADDRESS * MAXSEC EQU 6528 MAX NO OF SECTORS ON UNPACKED PTS 6875 SECLEN EQU 256 SECTOR LENGTH, CHARACTERS PHSECL EQU 384 PHYSICAL SECTOR LENGTH QRETRY EQU 4 NO OF RETRIES TIME EQU 1000 1 MIN 40 SEC * DEVIND EQU 10 * EJECT DRDU01 DRDU01 * * DATA 0 INDICATES NO MMU BUFFER DATA DEVIND DISC DEVICE INDEX DUADR DATA DUAD ACTIVATION ADDRESS DATA 0 ABORT ROUTINE ADDRESS * IFT VERSA3=1 BUFFER RES 193 XIF * IFT VERSA3=0 BUFFER RES 25 * IFT RAW=1 RES 103 XIF * EJECT DRDU01 DRDU01 * * ***************** * * * ACTIVATION * * * ***************** * * DUAD EQU * CM DWTRTY,A6 RETRY INDICATOR CM DWTFBU,A6 RESET DRIVER BUFFER INDICATOR LDK A1,0 LC A1,DWTOR,A6 GET INDEX IFT NUNITS=1 SUK A1,1 XIF IFT NUNITS=2 SUK A1,3 XIF RF(P) DUERR FAULT IN INDEX * DUA:00 EQU * * LDK A5,DWTSB3 ADR A5,A6 LOAD STACK BASE IFT MMUPAG=1 MLR 2,A8 GET 18 BIT BUFFER ADDRESS SLC A1,4 MOST SIGN. BITS ANK A1,3 SRL A2,1 WORD ADDDRESS CF A5,MMULOG GET LOGICAL ADDRESS XIF * CF A15,NVLCHK CHECK IF NEW VOLUME LOADED * SAVE INDEX AND ORDER ADK A7,0 SET CR RF(NZ) DUA:05 NOT TEST STATUS ORDER * EJECT DRDU01 * * ********************* * * * TEST STATUS * * * ********************* * * ORS A1,ECBRC,A8 NVL BIT LDKL A2,/200 ANS A2,DWTOR,A6 VO:NAM ON FIRST OR SECOND UNIT LDK A2,1 ST A2,DWTSAV,A6 INDICATE TEST STATUS CF A5,VO:NAM READ VOLUME NAME ADK A1,0 RF(NZ) TESEND NOT OPERABLE LD A2,DWTORD,A6 RESTORE INDEX AND ORDER ST A2,DWTOR,A6 LD A8,DWTECB,A6 ECB ADDRESS CF A15,VOLNAM TRANSFER VOLUME NAME TO USER BUFFER LDK A1,0 RESET RETURN CODE TESEND EQU * LDKL A2,-1 ST A2,DWTSAV,A6 INDICATE TEST STATUS DONE ABL END:IO PERFORM ENDIO * EJECT DRDU01 * *************************************** * * * NEW VOLUME LOADED CHECK * * ORDER CODE CHECK * * * *************************************** * * INPUT: A1=NVL RETURN CODE FROM NVLCHK * A7=ORDER CODE * * DUA:05 EQU * ADK A1,0 CHECK IF NEW VOLUME LOADED ABL(NZ) END:IO PERFORM TENDIO SUK A7,1 RF(Z) DUA:10 BASIC READ SUK A7,4 RF(Z) DUA:10 BASIC WRITE SUK A7,12 RF(Z) DUA:10 PHYSICAL READ SUK A7,4 RF(Z) DUA:10 PHYSICAL WRITE SUK A7,10 RF(Z) FORMAT FORMAT VOLUME * DUERR ABL DISIOE REQUEST ERROR * INCLEN EQU * REQUESTED LENGTH ERROR LDKL A1,/8008 ABL END:20 EJECT DRDU01 * * ************************** * * * FORMAT VOLUME * * * ************************** * * FORMAT EQU * LDK A7,204 NUMBER OF CYLINDERS ON PTS 6875 LD A1,ECBCW1,A8 GET DISC TYPE IFT VERSA2+VERSA3=2 ECR A2,A1 XIF ANK A1,1 RF(NZ) FORM03 PTS 6875 ADK A7,204 PTS 6876 FORM03 EQU * * IFT VERSA2+VERSA3=2 LDKL A3,BUFFER LDKL A1,/C001 WRITE ONE WORD ANK A2,3 SUK A2,3 RF(NZ) FORM05 A1 OR A2 LDKL A1,/C0C1 WRITE 386 BYTES ADKL A3,PHSECL FORM05 EQU * ST A1,DWTFBU,A6 SAVE 1ST WER XIF * IFT VERSA2=1 IFT VERSA3=0 LDKL A3,BUFFER XIF * IFT VERSA2=0 IFT VERSA3=1 LDKL A3,BUFFER+PHSECL POSITION FOR CYL ID XIF * STR A3,A6 DRIVER BUFFER POINTER IFT NUNITS=2 CF A5,INXUNI CM DWTCYL,A2 CYLINDER ZERO XIF IFT NUNITS=1 CM DWTCYL,A6 CYLINDER ZERO XIF * EJECT DRDU01 * * FORM20 EQU * LDK A4,QRETRY FORM30 EQU * IFT NUNITS=2 CF A5,INXUNI GET UNIT INDEX XIF CF A5,SEEK SEEK CYLINDER SLL A1,5 STATUS RF(NN) FORM40 SEEK ERROR IFT NUNITS=2 CF A5,INXUNI LD A1,DWTCYL,A2 XIF IFT NUNITS=1 LD A1,DWTCYL,A6 XIF ST* A1,0,A6 PREPARE DRIVER BUFFER WITH CYL. ID LDK A3,0 CF A5,SKEW WRITE SECTOR 0 ON EVEN CYLINDERS * WRITE SECTOR 8 ON ODD CYLINDERS ORK A3,1 ORDER CODE: WRITE * IFT VERSA2+VERSA3=2 LD A1,DWTFBU,A6 GET 1ST WER XIF * IFT VERSA2=1 IFT VERSA3=0 LDKL A1,/C002 XIF * IFT VERSA2=0 IFT VERSA3=1 LDKL A1,/C0C1 1ST WER WRITE 386 BYTES XIF * LDKL A2,BUFFER CF A5,CIO:50 CIO:50 SECTOR ANK A1,/1F RF(NZ) FORM40 WRITE ERROR IFT NUNITS=2 CF A5,INXUNI IM DWTCYL,A2 XIF IFT NUNITS=1 IM DWTCYL,A6 XIF SUK A7,1 DECREMENT CYLINDER COUNTER RB(NZ) FORM20 LD A2,ECBCW1,A8 GET FORMAT AND TYPE OF DISC ABL TRANPA PUT FORMAT AND TYPE IN DWT FORM40 EQU * CF A5,SEEKZ SEEK CYLINDER 0 SLL A1,6 RF(N) FORM50 SEEK ERROR SUK A4,1 RETRY COUNTER RB(NZ) FORM30 RETRY FORM50 EQU * LDK A1,2 SEEK ERROR RETURN CODE ABL END:IO PERFORM END IO EJECT DRDU01 DRDU01 * * ************************************************* * * * CHECK IF ALLOWED SECTOR LENGTH, BUFFER SIZE * * AND SECTOR NUMBER * * SAVE BUFFER ADDRESS AND SET SECTOR COUNTER * * * ************************************************* * * INPUT: ECB * OUTPUT: A7=SECTOR COUNTER * DWTUBU=USER BUFFER POINTER * * DUA:10 EQU * LD A3,ECBRL,A8 REQUESTED LENGTH RB(Z) INCLEN ECR A7,A3 DIVIDE BY 256 TO GET NUMBER OF SECTORS ANK A3,/FF SET CONDITION REGISTER RB(NZ) INCLEN NOT AN INTEGER NUMBER OF SECTORS LD A3,ECBCW2,A8 SECTOR NUMBER WHERE THE BUFFER BEGIN RB(N) DUERR INCORRECT SECTOR NUMBER CW A3,DWTSMX,A2 RB(NL) DUERR INCORRECT SECTOR NUMBER ADR A3,A7 CW A3,DWTSMX,A2 RB(G) INCLEN SECTOR NUMBER OVERFLOW * IFT MMUPAG=0 LD A1,ECBBA,A8 ST A1,DWTUBU,A6 USER BUFFER POINTER XIF * EJECT DRDU01 * IFT VERSA2+VERSA3=2 * * ****************************** * * * DISC VERSION SEPARATION * * * ***************************** * * LD A2,DWTFOR,A2 SUK A2,2 RF(Z) RW:800 VERSION A2 XIF * EJECT DRDU01 * IFT VERSA3=1 * ************************************* * * * * * GET PHYSICAL SECTOR NUMBER BY * * DIVIDE BY 3 * * * ************************************* * IFT CPU852=0 LDK A1,0 PREPARE FOR DIVISION LD A2,ECBCW2,A8 GET LOGICAL SECTOR NUMBER DVK 3 * A1=REMAINER=LOGICAL SECTOR POSITION * A2=QUOTIENT=PHYSICAL SECTOR NUMBER ON DISC XIF * IFT VERSA3=1 IFT CPU852=1 LD A1,ECBCW2,A8 LDR A3,A1 SECTOR NUMBER LDK A2,0 DVK:00 EQU * ADR A2,A3 I:= I+I/4 SRL A3,2 I:= I/4 RB(NZ) DVK:00 SRL A2,2 TRUNCATE SUR A1,A2 SUR A1,A2 SUR A1,A2 REST AFTER LOOP SUK A2,1 DVK:10 EQU * ADK A2,1 SUK A1,3 DIVIDE BY 3 RB(NN) DVK:10 ADK A1,3 REST * A1=REMAINER=LOGICAL SECTOR POSITION * A2=QUOTIENT=PHYSICAL SECTOR NUMBER ON DISC * EJECT DRDU01 XIF * IFT VERSA3=1 * ************************************* * * * SAVE PHYSICAL SECTOR NUMBER * * AND SECTOR POSITION * * BRANCH ACCORDING TO SECTOR * * POSITION * * * ************************************* * * INPUT: A1=SECTOR POSITION INDICATOR * A2=LOGICAL SECTOR NUMBER / 3 * * ADR A2,A2 STR A2,A6 SAVE PHYSICAL SECTOR NUMBER SUK A1,1 IFT RAW=1 ST A1,DWTSEP,A6 SAVE SECTOR POSITION ST A2,DWTSEI,A6 SAVE 1ST PHYS. SECTOR NUMBER XIF * IFT VERSA3=1 * LOGICAL SECTOR POSITION RF(N) RW:300 ,XXXX , , RF(Z) RW:200 , XX,XX , * , , XXXX, * EJECT DRDU01 * ************************************* * * * READ/WRITE FROM SECTOR IN * * POSITION , , xxxx, * * * ************************************* * IMR A6 LOG. SECTOR IN NEXT PHYSICAL IFT RAW=1 IM DWTSEI,A6 SAVE FOR READ AFTER WRITE XIF * IFT VERSA3=1 CF A5,IOROUT DATA /0084 SUK A7,1 RF RW:300 * EJECT DRDU01 * ************************************* * * * READ/WRITE FROM SECTOR IN * * POSITION , xx, * * * ************************************* * * RW:200 EQU * CF A5,IOROUT DATA /0048 SUK A7,2 NUMBER OF SECTORS RF(N) RW:230 1 SECTOR IN IO RF(NZ) RW:260 >2 SECTORS IN IO * , XX,XXXXXX, CF A5,IOROUT DATA /00C0 RF RW:600 RW:230 EQU * , XX,XX , CF A5,IOROUT DATA /0040 RF RW:600 RW:260 EQU * , XX,XXXXXX, CF A5,IOROUT DATA /80C0 * EJECT DRDU01 * ************************************ * * * DIRECT READ/WRITE AS LONG * * AS POSIBLE * * * ************************************ * * RW:300 EQU * SUK A7,3 SECTOR COUNTER RF(NG) RW:500 LESS THAN FOUR SECTORS IN IO CF A5,IOROUT DATA /80C0 CF A5,IOROUT DATA /80C0 RB RW:300 * EJECT DRDU01 * ************************************ * * * READ/WRITE ON THE LAST SECTORS * * IN IO * * * ************************************ * * RW:500 EQU * RF(Z) RW:580 3 SECTORS ADK A7,2 RF(P) RW:560 2 SECTORS RF(N) RW:600 0 SECTORS RW:530 EQU * ,XXXX , , CF A5,IOROUT DATA /0080 RF RW:600 RW:560 EQU * ,XXXXXX,XX , CF A5,IOROUT DATA /80C0 CF A5,IOROUT DATA /0040 RF RW:600 RW:580 EQU * ,XXXXXX,XXXXXX, CF A5,IOROUT DATA /80C0 CF A5,IOROUT DATA /00C0 * EJECT DRDU01 * * RW:600 EQU * IFT RAW=1 * ************************ * * * READ AFTER WRITE * * * ************************ * * DWTSEI=1:ST PHYSICAL SECTOR NUMBER IN IO * 1ST POS IN DWT=LAST PHYSICAL SECTOR NUMBER IN IO * A7=SECTOR COUNTER * LD A7,DWTOR,A6 ANK A7,/FF GET ORDER SUK A7,/15 RF(NZ) RW:700 NOT PHYSICAL WRITE LDKL A2,-/100 LD A1,DWTSEP,A6 GET 1ST SECTOR POSITION RF(Z) RW:645 , XX, RF(P) RW:640 , XXXX, ADK A2,/80 RW:640 EQU * ADK A2,/80 RW:645 EQU * ST A2,ECBEL,A8 PREPARE EFFECTIVE LENGTH LD A1,DWTSEI,A6 RAW FROM THIS SECTOR LDR* A7,A6 GET LAST SECTOR NO SUR A7,A1 GET NUMBER OF PHYSICAL SECTORS STR A1,A6 * EJECT DRDU01 * * RW:650 EQU * CF A5,IOROUT DATA /40C0 IMR A6 NEXT PHYSICAL SECTOR LDKL A1,PHSECL ADS A1,ECBEL,A8 UPDATE ECBEL SUK A7,1 RB(NZ) RW:650 LD A7,ECBRL,A8 ST A7,ECBEL,A8 CORRECT EFFECTIVE LENGTH XIF * IFT VERSA3=1 RW:700 EQU * LDK A1,0 RETURN CODE ABL END:20 ENDIO * XIF * EJECT DRDU01 * IFT VERSA2=1 * * ********************************* * * * DISC FORMAT A2 * * * ********************************* * * RW:800 EQU * CF A5,DIV31 IFT RAW=1 ST A7,DWTSEI,A6 SAVE NUMBER OF SECTORS FOR READ AFTER WRITE XIF * IFT VERSA2=1 RW:850 EQU * CF A5,IOROUT DATA /A080 INDICATE FORMAT A2 LDKL A1,/100 ADS A1,DWTUBU,A6 UPDATE USER BUFFER POINTER SUK A7,1 RB(NZ) RW:850 MORE SECTORS IN IO * EJECT DRDU01 * * IFT RAW=1 LD A7,DWTOR,A6 GET ORDER ANK A7,/FF SUK A7,/15 * IFT VERSA3=1 RB(NZ) RW:700 NOT PHYSICAL WRITE XIF * IFT VERSA3=0 IFT VERSA2=1 IFT RAW=1 RF(NZ) RW:905 XIF * IFT VERSA2=1 IFT RAW=1 CM ECBEL,A8 PREPARE FOR READ AFTER WRITE LD A7,DWTSEI,A6 CF A5,DIV31 * EJECT DRDU01 * * RW:900 EQU * CF A5,IOROUT DATA /E080 READ AFTER WRITE SUK A7,1 RB(NZ) RW:900 XIF * IFT VERSA2+VERSA3=2 RB RW:700 XIF * IFT VERSA3=0 IFT VERSA2=1 RW:905 EQU * LDK A1,0 RESET RETURN CODE ABL END:20 XIF * EJECT DRDU01 * *********************************************** * * * IOROUT PERFORM READ OR WRITE AND SEEK * * IF NECESSARY * * * *********************************************** * * INPUT : ONE DATA WORD AFTER CF * BIT 0 :INDICATES DIRECT IO * BIT 1 :INDICATES READ AFTER WRITE * BIT 2 :INDICATES FORMAT A2 * BIT 8-11:NUMBER OF WORDS/16 * BIT12-15:START IN DRIVER BUFFER/32 * AFTER SEEK THE CYLINDER ID WILL BE CHECKED BY A READ * DWTBSE CONTAINS THE PRESENT SECTOR IN THE DRIVER BUFFER * DWTRTY INDICATES RETRIES DONE * DWTSWD SAVED WORD FROM USER BUFFER WHEN IO NOT VIA DRIVER BUFFER * IOROUT EQU * LDR* A3,A6 GET PHYSICAL SECTOR NUMBER SRL A3,5 GET CYLINDER NUMBER * IFT VERSA2+VERSA3=2 LD* A4,4,A5 GET DATA WORD SLL A4,2 RF(NN) SEE:05 FORMAT A3 ADK A3,0 XIF * EJECT DRDU01 * * IFT VERSA2=1 RF(NZ) SEE:05 NOT CYLINDER 0 CF A5,SEEKZ SLL A1,6 RF(N) SEE:20 ERROR IFT NUNITS=2 CF A5,INXUNI CM DWTCYL,A2 CYLINDER ZERO RF VA2BR XIF IFT VERSA2=1 IFT NUNITS=1 CM DWTCYL,A6 RF VA2BR XIF * EJECT DRDU01 * * SEE:05 EQU * IFT NUNITS=2 CF A5,INXUNI CW A3,DWTCYL,A2 COMPARE WITH PRESENT XIF IFT NUNITS=1 CW A3,DWTCYL,A6 XIF * IFT VERSA2=1 IFT VERSA3=0 RF(E) VA2:00 XIF * IFT VERSA2=0 IFT VERSA3=1 RF(E) SEE:90 HEAD IN POSITION XIF * IFT VERSA2+VERSA3=2 RF(NE) SEE:07 NOT SAME CYLINDER ADK A4,0 RF(N) VA2BR FORMAT A2 RF SEE:90 * EJECT DRDU01 * * SEE:07 EQU * XIF * IFT NUNITS=1 ST A3,DWTCYL,A6 NEW CYLINDER NUMBER XIF * IFT NUNITS=2 ST A3,DWTCYL,A2 NEW CYLINDER XIF LDK A4,QRETRY NUMBER OF RETRIES SEE:10 EQU * IFT NUNITS=2 CF A5,INXUNI DOUBLED UNIT INDEX XIF CF A5,SEEK SLC A1,5 RETURN CODE RF(N) SEE:30 OK * EJECT DRDU01 * * SEE:15 EQU * CF A5,SEEKZ SEEK CYL ZERO SLC A1,6 RETURN CODE RF(N) SEE:20 ERROR IM DWTRTY,A6 INDICATE RETRY SUK A4,1 RETRY COUNTER RB(NZ) SEE:10 TRY AGAIN SEE:20 EQU * LDKL A3,/FFFF IFT NUNITS=2 CF A5,INXUNI ST A3,DWTCYL,A2 DUMMY CYLINDER NUMBER XIF IFT NUNITS=1 ST A3,DWTCYL,A6 DUMMY CYLINDER NUMBER XIF LDK A1,/02 RETURN CODE RF SEE:35 END IO * EJECT DRDU01 * * SEE:30 EQU * IFT NUNITS=2 CF A5,INXUNI XIF IFT VERSA2+VERSA3=2 LD* A1,4,A5 GET DATA WORD SLL A1,2 RF(NN) SEE:31 FORMAT A3 XIF * IFT VERSA2=1 EJECT DRDU01 * * * FORMAT A2 * LDK A3,0 CF A5,SKEW LDKL A1,/8002 READ 2 WORDS LDKL A2,BUFFER READ TO DRIVER BUFFER CF A5,CIO:50 ANK A1,/1F ERROR CHECK RF(NZ) SEE:32 LD A3,BUFFER GET CYL ID IFT NUNITS=2 CF A5,INXUNI CW A3,DWTCYL,A2 CHECK IF SAME CYLINDER XIF IFT VERSA2=1 IFT NUNITS=1 CW A3,DWTCYL,A6 CHECK IF SAME CYLINDER XIF IFT VERSA2=1 RB(NE) SEE:15 NOT SAME CYL ID VA2BR EQU * ABL VA2:00 XIF * IFT VERSA3=1 EJECT DRDU01 * * * FORMAT A3 * SEE:31 EQU * IFT NUNITS=2 LD A3,DWTCYL,A2 XIF IFT VERSA3=1 IFT NUNITS=1 LD A3,DWTCYL,A6 XIF * IFT VERSA3=1 SLL A3,5 GET SECTOR NUMBER ST A3,DWTBSE,A6 SAVE FOR BSELOD LDK A3,0 CF A5,SKEW TO READ SECTOR 0 OR 8 ON DISC IM DWTFBU,A6 INDICATE READ TO DRIVER BUFFER CF A5,READ LD A3,DWTBSE,A6 GET SECTOR NUMBER FOR BSELOD ANK A1,/1F ERROR CODE CHECK CF A5,BSEL00 RF(Z) SEE:40 OK XIF * SEE:32 EQU * IM DWTRTY,A6 INDICATE RETRY SUK A4,1 RETRY COUNTER RB(NZ) SEE:15 RETRY SEE:35 EQU * ABL END:10 * IFT VERSA3=1 * EJECT DRDU01 * * SEE:40 EQU * IFT NUNITS=2 CF A5,INXUNI LD A3,DWTCYL,A2 GET CYLINDER NUMBER XIF IFT VERSA3=1 IFT NUNITS=1 LD A3,DWTCYL,A6 GET CYLINDER NUMBER XIF IFT VERSA3=1 CW A3,BUFFER+PHSECL COMPARE WITH CYL ID RB(NE) SEE:15 RETRY * EJECT DRDU01 * ************************* * * * READ AND WRITE * * FORMAT A3 * * * ************************* * SEE:90 EQU * LD A4,DWTOR,A6 GET ORDER ANK A4,4 RF(Z) READ00 READ ORDER LD* A2,4,A5 RF(N) WRIT20 WRITE DIRECT FROM USER BUFFER SLL A2,1 IFT RAW=1 RF(N) READWR READ AFTER WRITE XIF * IFT VERSA3=1 CWK A2,PHSECL RF(E) WRIT10 WRITE FROM DRIVER BUFFER IM DWTFBU,A6 INDICATE READ TO DRIVER BUFFER CF A5,REA:00 READ BEFORE WRITE * EJECT DRDU01 * * WRIT10 EQU * LD* A2,4,A5 GET DATA WORD LDR A4,A2 ANK A4,/C0 GET NUMBER OF WORDS TO MOVE SLL A4,1 BYTES ANK A2,/F BEG ADRESS IN DRIVER BUFFER SLL A2,5 CF A5,MOVWRI MOVE TO DRIVER BUFFER IFT NUNITS=2 CF A5,INXUNI LD A2,DWTCYL,A2 GET CYLINDER NUMBER XIF IFT VERSA3=1 IFT NUNITS=1 LD A2,DWTCYL,A6 GET CYLINDER NUMBER XIF IFT VERSA3=1 ST A2,BUFFER+PHSECL PUT IN DRIVER BUFFER IM DWTFBU,A6 INDICATE WRITE FROM DRIVER BUFFER CF A5,WRI:00 WRITE FROM DRIVER BUFFER RF SEE:95 * EJECT DRDU01 * * WRIT20 EQU * IFT MMUPAG=0 LDKL A2,PHSECL PHYSICAL SECTOR LENGTH ADS A2,DWTUBU,A6 UPDATE USER BUFFER POINTER LD* A4,DWTUBU,A6 GET WORD IN USER BUFFER ST A4,DWTSWD,A6 SAVE WORD IM DWTFSW,A6 INDICATE SAVED WORD IFT NUNITS=2 CF A5,INXUNI LD A2,DWTCYL,A2 GET CYLINDER NUMBER ST* A2,DWTUBU,A6 PUT IN USER BUFFER XIF IFT VERSA3=1 IFT MMUPAG=0 IFT NUNITS=1 LD A2,DWTCYL,A6 ST* A2,DWTUBU,A6 PUT IN USER BUFFER XIF * IFT VERSA3=1 IFT MMUPAG=1 IFT NUNITS=2 CF A5,INXUNI LD A4,DWTCYL,A2 GET CYLINDER NUMBER XIF IFT VERSA3=1 IFT MMUPAG=1 IFT NUNITS=1 LD A4,DWTCYL,A6 GET CYLINDER NUMBER XIF IFT VERSA3=1 IFT MMUPAG=1 ML 2,DWTBA1,A6 GET PHYSICAL BUFFER ADDRESS RF(Z) WRIT30 SYSTEM AREA TS -30,A15 SAVE REGISTERS ON STACK TL DWTPAG,A6 LOAD PAGE WITH CYL ID LD A2,DWTUBU,A6 GET LOGICAL BUFFER POINTER EL A3,PHSECL,A2 GET WORD TO SAVE ES A4,PHSECL,A2 PUT CYL ID IN POSITION TL -30,A15 GET REGISTERS RF WRIT40 WRIT30 EQU * SLL A2,1 BYTE ADDRESS LD A3,PHSECL,A2 GET WORD TO BE SAVED ST A4,PHSECL,A2 CYL ID IN POSITION WRIT40 EQU * ST A3,DWTSWD,A6 SAVA WORD IM DWTFSW,A6 INDICATE SAVED WORD XIF * IFT VERSA3=1 CM DWTFBU,A6 INDICATE WRITE FROM USER BUFFER CF A5,WRI:00 WRITE SECTOR FROM USER BUFFER CF A5,REWORD RESTORE WORD TO USER BUFFER RF SEE:95 * EJECT DRDU01 * * IFT RAW=1 READWR EQU * CF A5,REA:10 READ AFTER WRITE RF SEE:97 XIF * IFT VERSA3=1 READ00 EQU * LD* A2,4,A5 GET DATA WORD RF(N) READ20 DIRECT READ IM DWTFBU,A6 INDICATE READ TO DRIVER BUFFER CF A5,REA:00 READ TO DRIVER BUFFER LD* A1,4,A5 GET DATA WORD SLL A1,1 LDR A4,A1 ANKL A4,/180 GET NUMBER OF BYTES TO BE MOVED ANK A1,/18 GET POSITION SLL A1,4 CF A5,MOVRED RF SEE:95 READ20 EQU * IFT MMUPAG=0 LDKL A3,PHSECL ADS A3,DWTUBU,A6 UPDATE USER BUFFER POINTER XIF * IFT VERSA3=1 CM DWTFBU,A6 INDICATE READ TO USER BUFFER CF A5,REA:00 READ TO USER BUFFER SEE:95 EQU * IMR A6 UPDATE PHYSICAL SECTOR POINTER XIF * EJECT DRDU01 * * SEE:96 EQU * LD* A2,4,A5 GET DATA WORD ANK A2,/C0 LENGTH SLL A2,1 ADS A2,ECBEL,A8 UPDATE ECBEL * IFT MMUPAG=1 LDK A1,0 SRL A2,1 WORD MODE DA DWTBA1,A6 UPDATE PHYSICAL BUFFER ADDRESS CF A5,MMULOG GET LOGICAL ADDRESS XIF * SEE:97 EQU * LDK A1,2 UPDATE RETURN ADS A1,4,A5 RTN A5 * EJECT DRDU01 * IFT VERSA2=1 * * ******************************** * * * DISC FORMAT A2 * * * ******************************** * * VA2:00 EQU * LDK A4,QRETRY RETRIES VA2:10 EQU * IFT NUNITS=2 CF A5,INXUNI XIF IFT VERSA2=1 CF A5,INLACE INTERLACE AND SKEW * IFT MMUPAG=0 LDKL A1,/8080 1ST WER IFT RAW=1 LD* A2,4,A5 SLL A2,1 RF(NN) VA2:20 NOT READ AFTER WRITE LDKL A2,BUFFER RF VA2:35 VA2:20 EQU * XIF * IFT VERSA2=1 IFT MMUPAG=1 LDKL A1,/0808 1ST WER SHIFTED XIF * IFT VERSA2=1 IFT RAW=1 IFT MMUPAG=1 LD* A2,4,A5 SLL A2,1 RF(NN) VA2:20 NOT READ AFTER WRITE LDKL A1,/8080 LDKL A2,BUFFER RF VA2:35 VA2:20 EQU * XIF * IFT VERSA2=1 LD A2,DWTOR,A6 GET ORDER ANK A2,4 RF(Z) VA2:30 READ * IFT MMUPAG=0 LDKL A1,/C080 XIF * IFT VERSA2=1 IFT MMUPAG=1 LDKL A1,/080C 1ST WER SHIFTED XIF * IFT VERSA2=1 ADK A3,1 ORDER CODE FOR WRITE * EJECT DRDU01 * * VA2:30 EQU * * IFT MMUPAG=0 LD A2,DWTUBU,A6 2ND WER XIF * IFT VERSA2=1 IFT MMUPAG=1 LDK A2,0 DA DWTBA1,A6 SRC A1,4 1ST WER IN POSITION SLL A2,1 2ND WER IN POSITION XIF * IFT VERSA2=1 VA2:35 EQU * CF A5,CIO:50 ANK A1,/1F RF(Z) VA2:40 IO ERROR IM DWTRTY,A6 SUK A4,1 RB(NZ) VA2:10 RETRY RF WRI:50 ERROR * EJECT DRDU01 * * VA2:40 EQU * LDR* A3,A6 GET PHYSICAL SECTOR NUMBER ADK A3,1 NEXT SECTOR LDR A2,A3 CWK A2,31 RF(NE) VA2:50 NOT CYLINDER 0 ADK A3,2 CYLINDER 0 TO CYLINDER 1 VA2:50 EQU * ANK A2,/1F RF(NZ) VA2:60 SAME CYLINDER ADK A3,1 NEW CYLINDER VA2:60 EQU * STR A3,A6 PHYSICAL SECTOR NUMBER RB SEE:96 XIF * IFT VERSA3=1 EJECT DRDU01 * **************************** * * * SUBROUTINES FOR WRITE * * FROM USER BUFFER: * * FROM DRIVER : * * * **************************** * WRI:00 EQU * LDK A4,QRETRY RETRIES WRI:20 EQU * IFT NUNITS=2 CF A5,INXUNI XIF IFT VERSA3=1 CF A5,INLACE INTERLACE SECTOR NUMBER CF A5,WRITE CIO ANK A1,/1F RETURN CODE ? CF A5,BSELOD RF(Z) WRI:80 NO RETURN CODE IM DWTRTY,A6 INDICATE RETRY SUK A4,1 DECREMENT RETRY COUNTER RB(NZ) WRI:20 CF A5,REWORD RESTORE WORD IF NECESSARY XIF * WRI:50 EQU * ABL END:10 ERROR END IO * IFT VERSA3=1 * WRI:80 EQU * RTN A5 * EJECT DRDU01 * ********************************* * * * SUBROUTINES FOR READ TO * * USER BUFFER : * * DRIVER BUFFER : * * * ********************************* * REA:00 EQU * LD A3,DWTOR,A6 GET INDEX ANKL A3,/300 SLL A3,6 IN POSITION ORR* A3,A6 ADD SECTOR NUMBER CW A3,DWTBSE,A6 ALLREADY READ ? RF(E) REA:85 REA:10 EQU * LDK A4,QRETRY REA:20 EQU * IFT NUNITS=2 CF A5,INXUNI XIF IFT VERSA3=1 CF A5,INLACE INTERLACE SECTOR NUMBER CF A5,READ READ SECTOR ANK A1,/F CF A5,BSELOD UPDATE DRIVER BUFFER INDICATOR RF(Z) REA:30 NO RETURN CODE REA:25 EQU * IM DWTRTY,A6 INDICATE RETRY SUK A4,1 DECREMENT RETRY COUNTER RB(NZ) REA:20 RETRY ABL END:20 * EJECT DRDU01 * * REA:30 EQU * LD A2,DWTFBU,A6 RF(NZ) REA:40 READ TO DRIVER BUFFER IFT MMUPAG=0 LD* A3,DWTUBU,A6 GET CYLINDER ID FROM USER BUFFER RF REA:50 XIF * IFT VERSA3=1 IFT MMUPAG=1 ML 2,DWTBA1,A6 GET PHYSICAL ADDRESS RF(Z) REA:35 SYSTEM AREA TS -30,A15 SAVE REGISTERS TL DWTPAG,A6 LOAD MMUPAGE LD A3,DWTUBU,A6 GET LOGICAL BUFFER POINTER EL A3,PHSECL,A3 GET CYL ID TL -30,A15 RESET REGISTERS RF REA:50 REA:35 EQU * SLL A2,1 ADDRESS TO BYTE MODE LD A3,PHSECL,A2 GET CYL ID RF REA:50 XIF * IFT VERSA3=1 REA:40 EQU * LD A3,BUFFER+PHSECL GET CYL ID REA:50 EQU * IFT NUNITS=2 CF A5,INXUNI CW A3,DWTCYL,A2 XIF IFT VERSA3=1 IFT NUNITS=1 CW A3,DWTCYL,A6 XIF IFT VERSA3=1 RF(E) REA:90 RIGHT CYLINDER ID LDK A1,2 SEEK ERROR * EJECT DRDU01 * * RB REA:25 REA:85 EQU * LD A1,DWTFBU,A6 RF(NZ) REA:90 READ TO DRIVER BUFFER LDKL A4,/180 BYTES TO BE MOVED IFT MMUPAG=0 NGR A2,A4 ADS A2,DWTUBU,A6 RESET USER BUFFER POINTER FOR DIRECT MOVE XIF IFT VERSA3=1 CF A5,MOVRED MOVE TO USER BUFFER REA:90 EQU * RTN A5 * EJECT DRDU01 * * ************************************* * * * SUBROUTINES FOR MOVING WORDS * * USER BUFFER TO DRIVER BUFFER: * MOVWRI * * DRIVER BUFFER TO USER BUFFER * * MOVRED * * * ************************************* * * A1 BUFFER ADDRESS IN * A2 BUFFER ADDRESS OUT * A4 BUFFER LENGTH * A3 USED * MOVRED EQU * ADKL A1,BUFFER IFT MMUPAG+CPU857=0 LD A2,DWTUBU,A6 PRESENT POINT IN USER BUFFER XIF * IFT VERSA3=1 IFT CPU852+MMUPAG=0 IFT CPU857=1 LD A2,DWTUBU,A6 GET USER BUFFER POINTER ADS A4,DWTUBU,A6 UPDATE USER BUFFER POINTER MVB A4 XIF * IFT VERSA3=1 IFT CPU852=0 IFT MMUPAG=1 LD A2,DWTBA2,A6 GET PHYSICAL BUFFER ADDRESS SLL A2,1 BYTE MODE TS -30,A15 SAVE REGISTERS TL DWTPAG,A6 LD A2,DWTUBU,A6 GET LOGICAL ADDRESS MVSU A4 XIF * IFT VERSA3=1 RF MOV:00 * EJECT DRDU01 * * MOVWRI EQU * ADKL A2,BUFFER DRIVER BUFFER POINTER IFT MMUPAG+CPU857=0 LD A1,DWTUBU,A6 PRESENT POINT IN USER BUFFER XIF * IFT VERSA3=1 IFT CPU852+MMUPAG=0 IFT CPU857=1 LD A1,DWTUBU,A6 GET USER BUFFER POINTER ADS A4,DWTUBU,A6 UPDATE USER BUFFER POINTER MVB A4 XIF * IFT VERSA3=1 IFT CPU852=0 IFT MMUPAG=1 LD A1,DWTBA2,A6 GET PHYSICAL BUFFER ADDRESS SLL A1,1 BYTE MODE TS -30,A15 SAVE REGISTERS TL DWTPAG,A6 LD A1,DWTUBU,A6 GET LOGICAL ADDRESS MVUS A4 XIF * IFT VERSA3=1 MOV:00 EQU * IFT MMUPAG+CPU857=0 ADS A4,DWTUBU,A6 UPDATE USER BUFFER POINTER XIF * IFT VERSA3=1 IFT MMUPAG=1 TL -30,A15 RESET REGISTERS XIF * IFT VERSA3=1 IFT MMUPAG+CPU857=0 IFT CPU852=1 * EJECT DRDU01 * * MOV:10 EQU * LDR* A3,A1 STR A3,A2 ADK A1,2 ADK A2,2 SUK A4,2 RB(P) MOV:10 XIF * IFT VERSA3=1 IFT CPU852=0 IFT MMUPAG+CPU857=0 MSR 12,A15 SAVE REGISTERS ON STACK LDR A11,A4 NUMBER OF BYTES LDR A10,A2 OUTPUT ADDRESS LDR A9,A1 INPUT ADDRESS LDKL A12,16 BYTES IN EACH LOOP MOV:15 EQU * MLR 8,A9 MSR 8,A10 ADR A10,A12 ADR A9,A12 SUR A11,A12 RB(P) MOV:15 MLR 12,A15 RESTORE REGISTERS FROM STACK XIF * IFT VERSA3=1 RTN A5 * XIF * IFT VERSA2=1 EJECT DRDU01 * * *************************** * * * DIV31 * * * *************************** * * INPUT: ECBCW2=LOGICAL SECTOR NUMBER * OUTPUT: 1ST DWT = PHYSICAL SECTOR NUMBER * DIV31 EQU * * IFT CPU852=1 LD A1,ECBCW2,A8 GET LOGICAL SECTOR NUMBER LDR A3,A1 LDK A2,0 DIV:20 EQU * ADR A2,A3 I0:=I0+I1 SRL A3,5 I1:=I1/32 RB(NZ) DIV:20 LDR A3,A2 ANKL A3,/FFE0 32* SRL A2,5 TRUNCATE SUR A3,A2 SUR A3,A1 ADK A3,31 RF(P) DIV:30 ADK A2,1 NEXT CYLINDER DIV:30 EQU * ADK A2,0 RF(Z) DIV:50 CYLINDER 0 ADR A1,A2 ADK A1,1 * EJECT DRDU01 * * DIV:50 EQU * STR A1,A6 PUT PHYSICAL SECTOR NUMBER IN DWT RTN A5 * XIF * IFT VERSA2=1 IFT CPU852=0 LD A2,ECBCW2,A8 GET SECTOR NUMBER STR A2,A6 PHYSICAL SECTOR NUMBER LDK A1,0 DVK 31 ADK A2,0 RF(Z) DIV:10 CYLINDER 0 ADK A2,1 DIV:10 EQU * ADRS A2,A6 PHYSICAL SECTOR NUMBER RTN A5 XIF * EJECT DRDU01 * ********************************* * * * SUBROUTINES FOR * * INTERLACING AND/OR * * SKEWING * * * ********************************* * * OUTPUT : A3 CONTAINING INTERLACED AND SKEWED SECTOR NUMBER * INLACE EQU * LDR* A3,A6 GET PHYSICAL SECTOR NUMBER LDR A1,A3 ADR A3,A3 ADR A3,A1 INTERLACING FACTOR 3 SKEW EQU * IFT NUNITS=2 LD A2,DWTCYL,A2 GET CYLINDER NUMBER XIF IFT NUNITS=1 LD A2,DWTCYL,A6 GET CYLINDER NUMBER XIF ANK A2,1 RF(Z) INLAC5 EVEN CYLINDER ADK A3,8 SKEW FACTOR 180 DEG. INLAC5 EQU * ANK A3,/1F SLL A3,2 IN POSITION RTN A5 * IFT NUNITS=2 EJECT DRDU01 * * ********** * INXUNI * ********** * * OUTPUT A2=DOUBLED UNIT INDEX + DWT ADDRESS * INXUNI EQU * LC A2,DWTOR,A6 ANK A2,2 ADR A2,A6 RTN A5 XIF * IFT MMUPAG=1 EJECT DRDU01 * * ****************************************** * * * MMULOG : GET LOGICAL ADDRESS AND * * PAGE * * * ****************************************** * * MMULOG EQU * MS 2,DWTBA1,A6 SAVE PHYSICAL WORD ADDRESS DLA 4 SRC A1,6 IN POSITION ST A1,DWTPAG,A6 PAGE ADKL A1,/400 NEXT PAGE ST A1,DWTPAG+2,A6 PSEUDO MMU TABLE SRL A2,3 ST A2,DWTUBU,A6 LOGICAL ADDRESS RTN A5 * XIF * EJECT DRDU01 * IFT VERSA3=1 * * ****************************** * * UPDATE DRIVER BUFFER INDICATOR * ******************************* * * INPUT A1=RETURN CODE (AFTER READ) * OUTPUT DWTBSE=DRIVER BUFFER INDICATOR * BSELOD EQU * LDR* A3,A6 GET READ SECTOR NUMBER BSEL00 EQU * FROM SEEK VERIFY LD A2,DWTFBU,A6 RF(Z) BSEL50 READ/WRITE TO USER BUFFER LDKL A2,/FFFF DUMMY ADK A1,0 RF(NZ) BSEL40 READ ERROR LD A2,DWTOR,A6 GET INDEX ANKL A2,/300 SLL A2,6 ORR A2,A3 BSEL40 EQU * ST A2,DWTBSE,A6 UPDATE DRIVER BUFFER INDICATOR BSEL50 EQU * RTN A5 * EJECT DRDU01 * * *************************************** * * * RESTORE WORD TO USER BUFFER * * IF NECESSARY * * * *************************************** * * INPUT: DWTFSW=SAVED WORD INDICATOR * DWTSWD=SAVED WORD * DWTUBU=POINTER TO USER BUFFER * REWORD EQU * LD A3,DWTFSW,A6 RF(Z) REWO50 NO SAVED WORD LD A3,DWTSWD,A6 IFT MMUPAG=1 ML 2,DWTBA1,A6 GET BUFFER ADDRESS RF(Z) REWO20 SYSTEM AREA TS -30,A15 SAVE REGISTERS TL DWTPAG,A6 SET MMU REGISTERS LD A2,DWTUBU,A6 GET LOGICAL BUFFER ADDRESS ES A3,PHSECL,A2 RESTORE SAVED WORD TL -30,A15 RESET REGISTERS RF REWO50 REWO20 EQU * SLL A2,1 BYTE MODE ST A3,PHSECL,A2 RESTORE WORD XIF * IFT VERSA3=1 IFT MMUPAG=0 ST* A3,DWTUBU,A6 RESTORE SAVED WORD XIF * IFT VERSA3=1 CM DWTFSW,A6 INDICATE NO SAVED WORD REWO50 EQU * RTN A5 * XIF * EJECT DRDU01 DRDU01 * * ******************* * * * SEEK CYLINDER * * * ******************* * * SEEK EQU * IFT NUNITS=2 LD A3,DWTCYL,A2 CYLINDER NUMBER XIF IFT NUNITS=1 LD A3,DWTCYL,A6 XIF SLL A3,3 ORK A3,2 RF CIO EXECUTE CIO-START * SEEKZ EQU * LDK A3,3 RF CIO EXECUTE CIO-START * EJECT DRDU01 * * ********************************** * * * CIO: READ AND WRITE * * * ********************************** * * INPUT: A3=PHYSICAL SECTOR NUMBER SHIFTED * IFT VERSA3=1 IFT MMUPAG=0 READ EQU * LDKL A1,/80C1 1ST WER RF CIO:20 WRITE EQU * LDKL A1,/C0C1 1ST WER ADK A3,1 ORDER CODE CIO:20 EQU * LD A2,DWTFBU,A6 RF(NZ) CIO:30 IO FROM/TO DRIVER BUFFER LD A2,DWTUBU,A6 USER BUFFER POINTER SUKL A2,PHSECL RF CIO:50 CIO:30 EQU * LDKL A2,BUFFER DRIVER BUFFER ADDRESS XIF * IFT VERSA3=1 IFT MMUPAG=1 READ EQU * LDKL A1,/0C18 1ST WER SHIFTED RF CIO:20 WRITE EQU * LDKL A1,/0C1C 1ST WER SHIFTED ADK A3,1 ORDER CODE CIO:20 EQU * LD A2,DWTFBU,A6 RF(NZ) CIO:30 IO FROM/TO DRIVER BUFFER DA DWTBA1,A6 GET USER BUFFER ADDRESS SLL A2,1 BYTE MODE ADDRESS RF CIO:40 CIO:30 EQU * LDKL A2,BUFFER DRIVER BUFFER ADDRESS CIO:40 EQU * SRC A1,4 1ST WER IN POSITION XIF * CIO:50 EQU * WER A1,WER1 WER A2,WER1+1 * EJECT DRDU01 DRDU01 * * CIO EQU * ST A4,DWTA4,A6 SAVE A4 LD A2,PFPOST RF(NZ) CIOAB PWF POST PROCESSING ON CF A15,INXDWT GET INDEXED DWT ADDRESS EX DWTCIO,A4 EXECUTE CIO-START ABL(3) END:30 CU ADDRESS UNKNOWN CIOAB EQU * ST A5,DWTA5,A6 A5 ST A7,DWTA2,A6 SAVE SECTOR COUNTER * T:DISP ABL TDISP GO TO DISPATCHER * EJECT DRDU01 DRDU01 * * ********************** * * * RECOVERY ROUTINE * * * ********************** * * DUON 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,DWDU01 LDK A5,DWTSB3 GET STACK BASE ADR A5,A6 CM DWTST,A6 UNIT BUSY CM DWTSAV,A6 INDICATE RECOVERY LD A1,INIFLG INITIALIZATION FLAG RF(NZ) DUON05 NOT POWER UP * EJECT DRDU01 * * CM DWTOR,A6 1ST UNIT CF A5,SEEKZ TEST IF OPERABLE ANK A1,1 RF(NZ) DUON26 NOT OPERABLE IFT NUNITS=2 LDK A1,2 SC A1,DWTOR,A6 NEXT UNIT CF A5,SEEKZ ANK A1,1 RF(NZ) DUON26 NOT OPERABLE XIF * EJECT DRDU01 * * DUON05 EQU * CM DWTOR,A6 CF A5,VO:NAM READ VOLUME NAME ANK A1,1 RF(Z) DUON07 NO ERROR CM DWTOR,A6 PREPARE FOR VOLCLR LDK A1,12 CF A15,VOLCLR DUON07 EQU * IFT NUNITS=2 LDK A1,2 OTHER DISC UNIT SC A1,DWTOR,A6 CF A5,VO:NAM ANK A1,1 RF(Z) DUON08 NO ERROR LDK A1,2 OTHER DISC UNIT SC A1,DWTOR,A6 LDK A1,12 CF A15,VOLCLR DUON08 EQU * XIF IM DWTST,A6 INDICATE VOLUME NAMES READ LDKL A1,-1 ST A1,DWTSAV,A6 RECOVERY DONE * EJECT DRDU01 * * LD A8,DWTECB,A6 GET ECB ADDRESS RF(Z) END:IO NO REQUEST ON? * DUON10 LD A7,DWTORD,A6 GET ORDER ST A7,DWTOR,A6 RESTORE INDEX AND ORDER ANK A7,/3F * IFT VERSA3=1 CF A5,REWORD RESTORE WORD IF NECESSARY XIF * CM ECBEL,A8 RESET EFFECTIVE LENGTH ABL DUA:00 REPEAT REQUEST * EJECT DRDU01 * * READY INTERRUPT * DUREDY LD A1,TIMER RF(Z) DUON50 NO TIMER ACTIVE * IFT NUNITS=1 CM* TIMER KILL TIMER RF DUON40 XIF * IFT NUNITS=2 RB T:DISP TIMER ACTIVE XIF * EJECT DRDU01 * * DUON26 EQU * LDKL A4,TIMER TIMER POINTER ADDRESS LDR* A3,A4 RF(Z) DUON30 NO TIMER ACTIVE LDKL A1,-TIME STR A1,A3 RESTART TIMER RB T:DISP * * DUON30 CF A15,SETIMP START TIMER DATA DUON40,TIME TIME OUT ADDRESS, TIME RB T:DISP * * TIME OUT * DUON40 LDKL A6,DWDU01 CM TIMER DUON50 EQU * CM DWTST,A6 SET UNIT BUSY CM DWTSAV,A6 INDICATE RECOVERY LDK A5,DWTSB3 GET STACK BASE ADR A5,A6 RB DUON05 * EJECT DRDU01 DRDU01 * * *********************** * * * INTERRUPT HANDLER * * * *********************** * * IHDU EQU * IHDU1 EQU * IHDU2 EQU * ST P,INTSAV SAVE LAST INTERRUPT * 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,DWDU01 DISC UNIT NO. 1 * EJECT DRDU01 * * IHDU10 SST A1,CUADR GET STATUS IHDU20 ANKL A1,/460F MASK RETURN CODE SLL A1,1 RB(N) DUREDY READY INTERRUPT SRL A1,1 LDR A2,A1 ANKL A2,/200 SEEK ERROR RF(Z) IHDU30 ANKL A1,/440F MOVE SEEK ERROR BIT ORK A1,/02 IHDU30 EQU * LD A8,DWTECB,A6 ECB ADDRESS LD A2,DWTSAV,A6 RF(NN) GET LDR A3,A1 ANK A3,1 RF(NZ) END:IO DISC UNIT NOT OPERABLE * GET LD A5,DWTA5,A6 RELOAD REGISTERS A5 LD A4,DWTA4,A6 A4 LD A7,DWTA2,A6 GET SECTOR COUNTER RTN A5 * EJECT DRDU01 DRDU01 * * ******************* * * * PERFORM ENDIO * * * ******************* * * END:30 EQU * CU ADDRESS UNKNOWN LDK A1,1 NOT OPERABLE ST A1,DWTST,A6 INDICATE RECOVERY DONE RF END:IO END:10 EQU * * IFT RAW=1 LD* A7,DWTSB3-2,A6 GET 1ST RETURN ADDRESS SLL A7,1 RF(N) END:20 READ AFTER WRITE LD A7,DWTORD,A6 ANK A7,/FF GET ORDER SUK A7,/15 RF(NZ) END:20 NOT READ AFTER WRITE CM ECBEL,A8 RESET SECTORS DONE XIF * END:20 EQU * LDKL A2,/FF00 ANS A2,ECBEL,A8 LD A2,DWTRTY,A6 GET RETRY INDICATOR RF(Z) END:IO NO RETRIES DONE ORKL A1,/100 SET BIT 7 IN RETURN CODE EJECT DRDU01 * * END:IO EQU * CF A15,TENDIO PERFORM ENDIO ABL TDISP GO TO DISPATCHER * EJECT DRDU01 * * VO:NAM EQU * CF A5,SEEKZ SEEK SECTOR 0 ANK A1,1 RF(NZ) VO:NA8 SEEK-,THROUGHPUT ERROR,NOT OPERABLE CMR A6 SECTOR 0 IFT NUNITS=2 CF A5,INXUNI CM DWTCYL,A2 CYLINDER 0 XIF IFT NUNITS=1 CM DWTCYL,A6 XIF LDK A3,0 SECTOR 0 * IFT VERSA3=1 IM DWTFBU,A6 READ TO DRIVER BUFFER CF A5,READ ANK A1,3 CF A5,BSELOD UPDATE DRIVER BUFFER INDICATOR XIF * IFT VERSA3=0 LDKL A1,/8019 READ SECTOR ZERO LDKL A2,BUFFER TO DRIVER BUFFER CF A5,CIO:50 ANK A1,3 ERROR ? XIF * RF(NZ) VO:NA8 THROUGHPUT ERROR,NOT OPERABLE LDKL A2,BUFFER LDK A3,/F0 FILE CODE LD A1,DWTSAV,A6 RF(Z) VO:NA6 LDKL A3,/80F0 INDICATE TEST STATUS VO:NA6 EQU * CF A15,VOLGET VOLUMR NAME TO DWT INDICATE NVL EJECT DRDU01 * * DUNA40 EQU * LDK A1,1 LDK A7,1 TO INDICATE NOT TRANSFER PARAMETER ORDER LD A2,BUFFER+32 CHECK IF TOSS DISC CWK A2,'TO' RF(NE) DUNA70 NO TOSS LD A2,BUFFER+40 CHECK IF RELEASE 10 OR GREATER CWK A2,/2031 RF(NE) DUNA70 REL LESS THAN 10 LD A2,BUFFER+48 GET FORMAT AND DEVICE TYPE PARAMETER TRANPA EQU * LABEL FOR TRANSFER PARAMETER ORDER CF A15,INXDWT GET INDEXED DWT ADDRESS ECR A3,A2 SEPARATE THE PARAMETERS ANK A3,/3 ANK A2,/3 ST A3,DWTFOR,A4 SAVE FORMAT PARAMETER LDKL A1,6324 SECTORS ON VERSION A2 SUK A3,2 FORMAT ? RF(Z) DUNA60 VERSION A2 RF(N) DUNA50 VERSION A1 ADK A1,204 VERSION A3 DUNA50 EQU * ADKL A1,9588-6324 DUNA60 EQU * SUK A2,1 RF(Z) DUNA70 PTS 6875 ADR A1,A1 PTS 6876 2*MAXSEC ON PTS 6875 DUNA70 EQU * ST A1,DWTSMX,A4 MAX SECTOR NO IN DWT LDK A1,0 RESET RETURN CODE FOR TRANSFER PARAM. ADK A7,0 CHECK IF TRANSFER PARAMETER RB(Z) END:20 * EJECT DRDU01 * * LD A4,DWTA4,A6 RESTORE RETRY COUNTER LC A1,DWTOR,A6 ADK A1,1 SC A1,DWTOR,A6 ANK A1,1 RB(NZ) VO:NAM RF VO:NA9 VO:NA8 EQU * LDK A1,1 ERROR CODE VO:NA9 EQU * RTN A5 * * TIMER POINTER * TIMER DATA 0 TIMER POINTER * EJECT DRDU01 DRDU01 * * ************************************* * * * DEVICE WORK TABLE * * * ************************************* * * DWDU01 EQU * DATA 0 PHYSICAL SECTOR NUMBER DATA /8000 DWT STATUS DATA 0 ECB ADDRESS DATA 0 ORDER DATA DUADR 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 ECBDU1 MMU ECB ADDRESS XIF * DWTFSW EQU *-DWDU01 DATA 0 DATA 0,0,0 SAVE AREA FOR REGISTERS DWTBSE EQU *-DWDU01 DATA 0 DWTUBU EQU *-DWDU01 USER BUFFER POINTER DATA 0 DWTSWD EQU *-DWDU01 DATA 0 * EJECT DRDU01 * * DWTRTY EQU *-DWDU01 DATA 0 DATA 0 DATA /C000 FIXED DATA /8000 NEW VOLUME LOADED INDICATOR CARTR. 1 DATA /C000 FIXED DATA /8000 NEW VOLUME LOADED IND. CARTR. 2 DATA /FFFF,/FFFF,/FFFF VOLUME NAME 1ST FIXED DATA /FFFF,/FFFF,/FFFF VOLUME NAME 1ST CARTRIDGE * IFT NUNITS=2 DATA /FFFF,/FFFF,/FFFF VOLUME NAME 2ND FIXED DATA /FFFF,/FFFF,/FFFF VOLUME NAME 2ND CARTRIDGE XIF * EJECT DRDU01 * * DWTSAV EQU *-DWDU01 DATA -1 DWTFBU EQU *-DWDU01 FLAG INDICATING IO TO DRIVER BUF DATA 0 DWTCIO EQU *-DWDU01 CIO-START CIO A3,1,DAF1 CIO A3,1,DAC1 * IFT NUNITS=2 CIO A3,1,DAF2 CIO A3,1,DAC2 XIF * DWTCYL EQU *-DWDU01 DATA /FFFF CYLINDER NUMBER * IFT NUNITS=2 DATA /FFFF 2ND UNIT XIF * DWTSMX EQU *-DWDU01 DATA 1 MAX SECTORS ON FIXED DISC DATA 1 MAX SECTORS ON CARTRIDGE * IFT NUNITS=2 DATA 1 2ND UNIT DATA 1 2ND UNIT XIF * DWTFOR EQU *-DWDU01 DATA 0 DISC FORMAT ON FIXED DATA 0 DISC FORMAT CARTRIDGE * IFT NUNITS=2 DATA 0 DATA 0 XIF * DATA 0,0 STACK DATA 0,0 STACK DATA 0,0 DWTSB3 EQU *-DWDU01-2 * IFT RAW=1 DWTSEP EQU *-DWDU01 DATA 0 DWTSEI EQU *-DWDU01 DATA 0 XIF * IFT MMUPAG=1 ECBDU1 EQU * DATA 0,0,0,0,0,0,0 DWTBA1 EQU *-DWDU01 DATA 0 DWTBA2 EQU *-DWDU01 DATA 0 DWTPAG EQU *-DWDU01 MMU PAGE DATA 0 DATA 0 XIF * * * END