|
|
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: 20678 (0x50c6)
Notes: pts_type(SC)
Names: »DRDU01.SC«
└─⟦fcfed1ed9⟧ Bits:30009706 Philips computer tape "M_167"
└─⟦this⟧ »M:167D/DRDU01.SC«
IDENT DRDU01 REL 8.2 78-09-15 870105040820 * ********************************************** * * PHILIPS TERMINAL SYSTEM PTS * * DRDU01 = DRIVER FOR ONE/TWO DISC UNITS X/1215 AND/OR X/1216 * * * * * * * ************************************************** * * THIS DISC DRIVER HANDLES UP TO TWO DISC * DRIVES X/1215,X/1216 CONNECTED TO CPU VIA IOP * ON MULTIPLEX CHANNEL * * * THE FOLLOWING ORDERS ARE TRAETED : * * /00 TEST STATUS * /01 BASIC READ * /05 BASIC WRITE * /11 PHYSICAL READ * /15 PHYSICAL WRITE * EJECT DRDU01 * *********** * ENTRIES * *********** * ENTRY DUADR ACTIVATION ADDRESS ENTRY DUON RECIVERY 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 ENTRY DWDU02 DWT-ADDRESS DISC UNIT NO. 2 * ************* * EXTERNALS * ************* * EXTRN TDISP DISPATCHER EXTRN TENDIO ENDIO EXTRN SAVE8 SAVE REGS. A1-A8 ON A15 STACK EXTRN DISIOE REQUEST ERROR EXTRN DWTST DWT STATUS EXTRN DWTOR ORDER EXTRN DWTECB ECB-ADDRESS EXTRN INIFLG INITIALIZATION FLAG EXTRN DWTVOL VOLUME NAME EXTRN INTSAV SAVEAREA LAST INTERRUPT EXTRN SETIMP TIMER EJECT * ************************** * * * 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 1 * * * DRIVE 1 MAY BE A X/1216 INSTEAD OF A X/1215 * BY SETTING X:C = 1 * X:C EQU 0 TYPE1 EQU 1 * * DRIVE 2 MAY BE A X/1216 INSTEAD OF A X/1215 * BY SETTING X:D = 1 * X:D EQU 0 TYPE2 EQU 1 EJECT 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 MAXCY5 EQU 203 MAX CYLINDER NO X/1215 MAXCY6 EQU 407 MAX. CYLINDER NO X/1216 LENGTH EQU 410 SECTOR LENGTH, CARACTERS RY1 EQU 1 RETRY COUNT FOR BASIC ORDERS RY4 EQU 4 RETRY COUNT TIME EQU 1000 2 MINUTES * *********************** * * * DWT-DISPLACEMENTS * * * *********************** * DWTA2 EQU /12 DWT-DISPLACEMENT,SAVE A2 DWTA4 EQU /14 ,SAVE A4 DWTA5 EQU /16 ,SAVE A5 DWTSB1 EQU /1A ,1:ST STACK BASE DWTSB2 EQU /1E ,STACK BASE EJECT DRDU01 ************** * DUADR DATA DUAD ACTIVATION ADDRESS BUF RES 5 SECTOR BUFFER - 200 WORDS IFT RAW=1 RES 200 READ AFTER WRITE BUFFER XIF * RETRY IS USED TO DETECT RETRIES RETRY DATA 0 MAX NO OF TRIES * * * TABLE FOR CONVERSION FROM LOGICAL TO PHYSICAL * SECTOR NUMBER * * SECTAB DATA /0003,/0609,/0C0F,/0205,/080B,/0E01,/0407,/0A0D DATA /1013,/1619,/1C1F,/1215,/181B,/1E11,/1417,/1A1D EJECT DRDU01 * * ***************** * * * ACTIVATION * * * ***************** * DUAD EQU * ACTIVATION ENTRY IFT NUNITS=2 LDKL A1,/7FFF LDR* A2,A6 GET OTHER DISC UNIT DWT ANS A1,DWTST,A2 SET OTHER DISC UNIT BUSY XIF SUK A5,4 STACK BASE LDK A4,RY1 RETRY COUNT = 1 ST A4,RETRY MAX NO OF TRIES LC A1,DWTOR,A6 GET INDEX ANK A1,1 ADR A1,A1 ADR A1,A6 LD A2,DWTBSY,A1 RF(Z) DUA:10 DISC READY LDR A7,A7 RF(Z) DUA:10 TEST STATUS ORDER LDK A1,/80 DISC HAS BECOME READY ABL END:15 EJECT DUA:10 LDR A1,A7 ORDER RF(Z) DU:010 TEST STATUS SUK A1,1 RF(Z) DUA:30 BASIC READ SUK A1,4 RF(Z) DUA:30 BASIC WRITE SUK A1,12 RF(Z) DUA:20 PHYSICAL READ SUK A1,4 RF(Z) DUA:20 PHYSICAL WRITE EJECT DUERR ABL DISIOE REQUEST ERROR DUA:20 LDK A4,RY4 RETRY COUNT = 4 ST A4,RETRY MAX NO OF TRIES DUA:30 LD A1,4,A8 REQUESTED LENGTH SUKL A1,LENGTH RB(NZ) DUERR REQUESTED LENGTH # 410 EJECT DRDU01 LD A2,10,A8 RELATIVE SECTOR NUMBER LDR A3,A2 ANK A3,/1F LOGICAL SECTOR NUMBER LC A3,SECTAB,A3 PHYSICAL SECTOR NUMBER SC A3,DWTSEC,A6 SAVE IT SRL A2,5 CYLINDER NUMBER CW A2,DWTCMX,A6 RB(G) DUERR CYLINDER NO GREATER THAN MAX. CW A2,DWTCYL,A6 COMPARE WITH CURRENT CYLINDER NUMBER RF(E) DU:030 DISC HEAD ALREADT POSITIONED ST A2,DWTCYL,A6 SAVE CYLINDER NUMBER EJECT DRDU01 * ************************ * * * SEEK SECTOR N * * * ************************ * DU:010 CF A5,SEEK SEEK CYLINDER N SLC A1,6 RF(NN) DU:030 OK. SEEK COMPLETED * ************************ * * * SEEK CYLINDER 0 * * * ************************ * DU:015 CF A5,SEEKZ SEEK CYLINDER 0 SLC A1,6 RF(N) DU:020 SECTOR 0 NOT FOUND SUK A4,1 RB(NZ) DU:010 TRY AGAIN DU:020 LDKL A3,/FFFF ALL RETRIES DONE ST A3,DWTCYL,A6 SET ILLEGAL CYLINDER NUMBER LDKL A1,/200 SEEK ERROR RETURN CODE ABL END:IO PERFORM ENDIO EJECT DRDU01 * ************************** * * * GO AND EXECUTE ORDER * * * ************************** * * DU:030 LDR A1,A7 ORDER RF(Z) TEST TEST STATUS SUK A1,5 RF(Z) WRIT:N BASIC WRITE SUK A1,12 RF(NP) READ:N READ * ************************ * * * READ SECTOR N-1 * * * ************************ * P:WRIT CF A5,WER:R5 EXECUTE WER INSTRUCTIONS CF A5,READ5 READ FIVE WORDS ANK A1,2 RF(Z) P:WR10 OK. CHECK CYLINDER NUMBER SUK A4,1 DECREMENT RETRY COUNTER ABL(Z) END:IO ALL RETRIES DONE RB P:WRIT TRY AGAIN EJECT DRDU01 P:WR10 LD A2,DWTCYL,A6 CYLINDER NUMBER CW A2,BUF+1 COMPARE WITH CURRENT CYLINDER NUMBER RB(NE) DU:015 ERROR.SEEK CYLINDER 0 * ********************* * * * WRITE SECTOR N * * * ********************* * WRIT:N CF A5,WER:W EXECUTE WER INSTRUCTIONS CF A5,WRITE WRITE SECTOR N ANK A1,/1F RF(Z) WRIT20 OK. NO RETURN CODE SUK A4,1 DECREMENT RETRY COUNTER ABL(Z) END:IO ALL RETRIES DONE RB WRIT:N TRY AGAIN IFT RAW=1 WRIT20 CWK A7,5 ABL(E) END:IO BASIC WRITE LDKL A3,BUF DRIVER BUFFER ADDRESS XIF IFF RAW=1 WRIT20 ABL END:IO PERFORM END:IO XIF EJECT DRDU01 * ********************** * * * READ SECTOR N * * * ********************** * READ:N CF A5,WER:R EXECUTE WER INSTRUCTIONS CF A5,READ READ SECTOR N ANK A1,/F RF(Z) READ10 OK. NO RETURN CODE SUK A4,1 DECREMENT RETRY COUNTER ABL(Z) END:IO ALL RETRIES DONE RB READ:N TRY AGAIN * *************************** * * * CHECK CYLINDER NUMBER * * * *************************** * * READ10 LD A2,DWTCYL,A6 REQUESTED CYLINDER NUMBER CW* A2,2,A8 COMPARE WITH CURRENT CYLINDER NUMBER RB(NE) DU:015 ERROR. SEEK CYLINDER 0 ABL END:IO 0K. PEABLORM ENDIO EJECT DRDU01 * ********************* * * * TEST STATUS * * * ********************* * TEST LDKL A2,DWTNAM VOLUME NAME DWT DISPLACEMENT ADR A2,A6 LC A3,DWTOR,A6 DWT INDEX ANK A3,1 RF(Z) TEST10 FIXED DISC ADK A2,6 CARTRIDGE DISC TEST10 ST A2,10,A8 SAVE ADDRESS TO VOLUME NAME SUR A1,A1 SET RETURN CODE=0 ABL END:IO PEABLORM ENDIO EJECT DRDU01 * ****************************** * * * EXECUTE WER INSTRUCTIONS * * * ****************************** * WER:R5 LDKL A2,/8005 READ 5 WORDS LDKL A3,BUF DRIVER BUFFER ADDRESS RF EX:WER WER:R LDKL A2,/80CD READ 1 SECTOR CWK A3,BUF RF(E) EX:WER RF WER:WB WER:W LDKL A2,/C0CD WRITE 1 SECTOR WER:WB LD A3,2,A8 USER BUFFER ADDRESS EX:WER EX DWTWR1,A6 EXECUTE 1:ST WER EX DWTWR2,A6 EXECUTE 2:ND WER RTN A5 EJECT DRDU01 * ******************* * * * SEEK CYLINDER * * * ******************* * SEEK LD A2,DWTCYL,A6 CYLINDER NUMBER SLL A2,3 ORK A2,2 RF CIO EXECUTE CIO-START SEEKZ EQU * LDK A2,3 RF CIO EXECUTE CIO-START READ5 LC A2,DWTSEC,A6 SECTOR NUMBER ANK A2,/1F SUK A2,3 SECTOR N-1 ANK A2,/1F SLL A2,2 RF CIO EXECUTE CIO-START EJECT DRDU01 READ LC A2,DWTSEC,A6 SECTOR NUMBER ANK A2,/1F SLL A2,2 RF CIO EXECUTE CIO-START WRITE LD A2,DWTCYL,A6 CYLINDER NUMBER ST* A2,2,A8 PUT CYLNMB. IN USER BUFFER LC A2,DWTSEC,A6 SECTOR NUMBER SLL A2,2 ADK A2,1 EJECT DRDU01 CIO EQU * EX:CIO LC A1,DWTOR,A6 ANK A1,1 INDEX ADR A1,A1 DOUBLE INDEX ADR A1,A6 EX DWTCIO,A1 EXECUTE CIO-START SAVE ST A2,DWTA2,A6 SAVE REGS. A2 ST A4,DWTA4,A6 A4 ST A5,DWTA5,A6 A5 T:DISP ABL TDISP GO TO DISPATCHER EJECT DRDU01 * ********************** * * * RECOVERY ROUTINE * * * ********************** * DUON CF A15,SAVE8 SAVE REGS. A1-A8 ON A15 STACK LDKL A6,DWDU01 LD A1,INIFLG INITIALIZATION FLAG RF(Z) DUON08 POWER UP DURED2 EQU * LDKL A1,/7FFF ANS A1,DWTST,A6 SET DISC UNIT BUSY DUON05 LDKL A5,DWTSB2 STACK BASE LDKL A6,DWDU01 ADR A5,A6 STACK BASE CF A5,VO:NAM GET VOLUME NAME CF A15,TENDIO EJECT IFT NUNITS=2 LDR* A6,A6 OTHER DISC UNIT DWT-ADDRESS LDKL A5,DWTSB2 ADR A5,A6 STACK BASE LDKL A1,/7FFF ANS A1,DWTST,A6 SET DWT BUSY CF A5,VO:NAM GET VOLUME NAME CF A15,TENDIO PERFORM ENDIO XIF RB T:DISP DISPATCH * * * READY INTERRUPT * DUREDY LD A1,TIMER RB(Z) DURED2 NO TIMER ACTIVE RB T:DISP TIMER ACTIVE EJECT DUON08 EQU * LDK A1,2 THROUGHPUT ERROR LD A2,DWTST,A6 GET DWT STATUS RF(N) DUON10 UNIT FREE CF A15,TENDIO PERFORM ENDIO DUON10 EQU * IFT NUNITS=2 LDKL A6,DWDU02 DISC UNIT NO. 2 LD A2,DWTST,A6 DWT STSTUS RF(N) DUON20 UNIT FREE CF A15,TENDIO PERFORM ENDIO XIF * * SET DISC BUSY AND START TIMER * DUON20 LDKL A1,/7FFF IFT NUNITS=2 ANS A1,DWTST,A6 SET UNIT BUSY LDR* A6,A6 OTHER DWT ADDRESS XIF ANS A1,DWTST,A6 SET UNIT BUSY 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 RB DURED2 EJECT DRDU01 * *********************** * * * INTERRUPT HANDLER * * * *********************** * IHDU2 EQU * IFT NUNITS=2 ST P,INTSAV SAVE LAST INTERRUPT CF A15,SAVE8 LDKL A6,DWDU02 DISC UNIT NO. 2 RF IHDU10 XIF IHDU EQU * IHDU1 EQU * ST P,INTSAV SAVE LAST INTERRUPT CF A15,SAVE8 LDKL A6,DWDU01 DISC UNIT NO. 1 IHDU10 SST A1,CUADR GET STATUS IFT NUNITS=2 LDR A2,A1 ANK A2,/40 RF(Z) IHDU20 LDKL A6,DWDU02 XIF IHDU20 EQU * ANKL A1,/440F MASK RETURN CODE SLL A1,1 RB(N) DUREDY READY INTERRUPT SRL A1,1 LD A2,DWTSAV,A6 RF(NN) GET LDR A3,A1 ANK A3,1 RF(NZ) END:IO DISC UNIT NOT OPERABLE EJECT DRDU01 GET LD A5,DWTA5,A6 RELOAD REGISTERS A5 LD A4,DWTA4,A6 A4 LD A2,DWTA2,A6 A2 LD A7,DWTOR,A6 ANK A7,/FF ORDER LD A8,DWTECB,A6 ECB-ADDRESS RTN A5 EJECT DRDU01 * ******************* * * * PERFORM ENDIO * * * ******************* * END:IO EQU * ANKL A1,/28F MASK RETURN CODE RF(NZ) END:10 ERROR LD A2,4,A8 REQUESTED LENGTH = ST A2,6,A8 EFFECTIVE LENGTH END:10 EQU * LD A2,RETRY MAX NO OF TRIES CW A2,DWTA4,A6 RF(E) END:15 NO RETRY ORKL A1,/100 BIT 7 = RETRIES END:15 EQU * LC A2,DWTOR,A6 ORDER ANK A2,1 INDEX ADR A2,A2 ADR A2,A6 CM DWTBSY,A2 RESET READY WORD IFT NUNITS=2 LDR* A6,A6 OTHER DISC UNIT DWT-ADDRESS CF A15,TENDIO PERFORM ENDIO LDR* A6,A6 ACTIVE DISC UNIT DWT-ADDRESS XIF CF A15,TENDIO PERFORM ENDIO END:20 ABL TDISP GO TO DISPATCHER EJECT VO:NAM LD A1,DWTOR,A6 ORDER ST A1,DWTSAV,A6 SAVE IT CM DWTOR,A6 INDEX=0 VO:NA5 EQU * DU:NAM CF A5,SEEKZ SEEK SECTOR 0 ANKL A1,/203 RF(NZ) VO:NA8 SEEK-,THROUGHPUT-ERROR,NOT OPERABLE CF A5,WER:R5 EXECUTE WER INSTRUCTIONS SUR A2,A2 CYLINDER NUMBER = 0 ST A2,DWTCYL,A6 CF A5,CIO READ VOLUME LABEL ANK A1,3 RF(NZ) VO:NA8 THROUGHPUT-ERROR,NOT OPERABLE LDKL A2,DWTNAM ADR A2,A6 LC A1,DWTOR,A6 ANK A1,1 DISC INDEX RF(Z) DUNA10 FIXED DISC ADK A2,6 CARTRIDGE DISC DUNA10 SUR A1,A1 RESET RETURN CODE LDKL A3,BUF+2 BUFFER ADDRESS LDK A4,6 DUNA20 LDR* A7,A3 GET VOLUME NAME CWR* A7,A2 COMPARE WITH LAST VOLUME NAME RF(E) DUNA30 SAME DISC LDK A1,/80 NEW DISC LOADED DUNA30 STR A7,A2 SAVE DISC NAME ADK A2,2 INCREMENT POINTERS ADK A3,2 SUK A4,2 RB(NZ) DUNA20 GET NEXT WORD LDR A1,A1 RF(Z) DUNA40 VOLUME MATCH LC A2,DWTOR,A6 INDEX ANK A2,1 ADR A2,A2 ADR A2,A6 ST A1,DWTBSY,A2 NEW VOLUME LOADED DUNA40 EQU * LD A1,DWTOR,A6 ORDER RF(NZ) VO:NA8 LDK A1,1 SC A1,DWTOR,A6 INDEX=1 RB VO:NA5 VO:NA8 LD A1,DWTSAV,A6 GET OLD DWT CONTENTS ST A1,DWTOR,A6 SAVE IT LDKL A1,-1 ST A1,DWTSAV,A6 LDKL A5,DWTSB1 ADR A5,A6 STACK BASE LDK A1,1 RETURN CODE. NOT OPERABLE RTN A5 * * * TIMER POINTER * TIMER DATA 0 TIMER POINTER EJECT DRDU01 * * DEVICE WORK TABLE DISC UNIT NO. 2 * * DWDU02 EQU * IFT NUNITS=2 DATA DWDU01 POINTER TO OTHER DWT 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 DATA /00FF LEFT BYTE=SECTOR NUMBER DATA 0,0,0 SAVE AREA FOR REGISTERS DATA 0,0 STACK DATA 0,0 DATA /80 DISC UNIT BUSY INDICATOR DATA /80 RIGHT BYTE = CYLINDER NUMBER CIO A2,1,DAF2 CIO-START FIXED DISC CIO A2,1,DAC2 CIO-START CARTRIDGE DISC WER A2,WER1 WER A3,WER1+1 DATA 0,0,0 VOLUME NAME FIXED DISC DATA 0,0,0 VOLUME NAME CARTRIDGE DISC DATA -1 DATA /FFFF CYLINDER NO. IFT TYPE2=0 DATA MAXCY5 MAX CYLINDER NO XIF IFT NUNITS+TYPE2=3 DATA MAXCY6 MAX CYLINDER NO XIF EJECT DRDU01 * * DEVICE WORK TABLE DISC UNIT NO. 1 * * DWDU01 EQU * DATA DWDU02 POINTER TO OTHER DWT 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 DWTSEC EQU *-DWDU01 DATA /00FF LEFT BYTE=SECTOR NUMBER DATA 0,0,0 SAVE AREA FOR REGISTERS DATA 0,0 STACK DATA 0,0 DWTBSY EQU *-DWDU01 DATA /80 UNIT BUSY INDICATOR DATA /80 UNIT BUSY INDICATOR DWTCIO EQU *-DWDU01 CIO-START CIO A2,1,DAF1 CIO A2,1,DAC1 DWTWR1 EQU *-DWDU01 1:ST WER INSTRUCTION WER A2,WER1 DWTWR2 EQU *-DWDU01 2:ND WER INSTRUCTION WER A3,WER1+1 DWTNAM EQU *-DWDU01 DATA 0,0,0 VOLUME NAME FIXED DISC DATA 0,0,0 VOLUME NAME CARTRIDGE DISC DWTSAV EQU *-DWDU01 DATA -1 DWTCYL EQU *-DWDU01 DATA /FFFF CYLINDER NUMBER IFT TYPE1=0 DWTCMX EQU *-DWDU01 DATA MAXCY5 MAX CYLINDER X/1215 XIF IFT TYPE1=1 DWTCMX EQU *-DWDU01 DATA MAXCY6 MAX CYLINDER NO X/1216 XIF END