|
|
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: 26910 (0x691e)
Notes: pts_type(SC)
Names: »DRDU01.SC«
└─⟦9af60a727⟧ Bits:30009707 Philips computer tape "M_173"
└─⟦this⟧ »M:173/DRDU01.SC«
└─⟦this⟧ »M:173/DRDU01.SC«
IDENT DRDU01 REL 9.2 79-11-16 870105040920 * * ********************************************** * * 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 TREATED : * * /00 TEST STATUS * /01 BASIC READ * /05 BASIC WRITE * /11 PHYSICAL READ * /15 PHYSICAL WRITE * 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 ENTRY DWDU02 DWT ADDRESS DISC UNIT NO. 2 EJECT DRDU01 * * ************* * EXTERNALS * ************* * * EXTRN TDISP DISPATCHER EXTRN TENDIO END I/O EXTRN SAVE8 SAVE REGS. A1-A8 ON A15 STACK EXTRN DISIOE REQUEST ERROR EXTRN INIFLG INITIALIZATION FLAG EXTRN INTSAV SAVE AREA LAST INTERRUPT EXTRN SETIMP TIMER 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 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 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 0 * EJECT DRDU01 * * * A PROGRAM VERSION USING TOSS MMU PAGING * IS OBTAINED BY SETTING MMUPAG EQU 1. * MMUPAG EQU 1 * * * IF DISC ACCESSES ARE MADE EXCLUSIVELY BY DATA * MANAGEMENT, AND MMUPAG=1, THEN X:E := 1, ELSE 0. * X:E EQU 0 ONLYDM EQU 1 * * * A PROGRAM VERSION USING THE EXTENDED INSTRUCTION * SET IS OBTAINED BY SETTING CPU852 EQU 0. * CPU852 EQU 0 * * * A PROGRAM VERSION USING TOSS DISC PAGING * IS OBTAINED BY SETTING DSKPAG EQU 1. * DSKPAG EQU 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 * MAXCY5 EQU 203 MAX CYLINDER NO X/1215 MAXCY6 EQU 407 MAX CYLINDER NO X/1216 LENGTH EQU 410 SECTOR LENGTH, CHARACTERS QRETRY EQU 4 NO OF RETRIES TIME EQU 1000 1 MIN 40 SEC * EJECT DRDU01 DRDU01 * * DATA 0 INDICATES NO MMU BUFFER DATA 4 DISC DEVICE INDEX DUADR DATA DUAD ACTIVATION ADDRESS DATA 0 ABORT ROUTINE ADDRESS * BUF RES 5 SECTOR BUFFER - 200 WORDS IFT RAW=1 RES 200 READ AFTER WRITE BUFFER XIF * EJECT DRDU01 * * 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 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 * DUA:00 EQU * LDK A4,QRETRY GET MAX NO OF RETRIES TO MAKE ADK A7,0 SET CR RF(Z) TEST TEST STATUS ORDER * IFT MMUPAG=1 IFF 1-ONLYDM+DSKPAG=0 LDR* A1,A8 GET FIRST WORD OF ECB ANKL A1,/3000 GET BITS 0-1 IN 18-BIT ADDRESS RF(Z) DUA:05 BUFFER IN SYSTEM AREA? * EJECT DRDU01 * * LD A2,2,A8 GET BUFFER ADDRESS LDR A3,A2 ANKL A2,/F000 SRL A2,2 SLL A1,2 ORR A1,A2 ST A1,DWT:PA,A6 PAGE NUMBER (PSEUDO MMU TABLE) ANKL A3,/FFF LDR A1,A3 ORK A1,1 INDICATE ADDRESS NOT ZERO * DUA:05 ST A1,DWT:LA,A6 16 BIT LOGICAL BUFFER ADDRESS XIF * EJECT DRDU01 * * LD A2,DWTOR,A6 GET INDEX AND ORDER ST A2,DWTORD,A6 SAVE IT FOR RECOVERY SRL A2,7 GET INDEX (DOUBLED) ADR A2,A6 LD A1,DWTBSY,A2 ABL(NZ) END:15 LDR A1,A7 CHECK ORDER SUK A1,1 RF(Z) DUA:30 BASIC READ SUK A1,4 RF(Z) DUA:30 BASIC WRITE SUK A1,12 RF(Z) DUA:30 PHYSICAL READ SUK A1,4 RF(Z) DUA:30 PHYSICAL WRITE * DUERR ABL DISIOE REQUEST ERROR * EJECT DRDU01 DRDU01 * * ********************* * * * TEST STATUS * * * ********************* * * TEST EQU * CF A5,VO:NAM READ VOLUME NAME RF DENDIO PERFORM ENDIO * EJECT DRDU01 * * DUA:30 LD A1,4,A8 REQUESTED LENGTH SUKL A1,LENGTH RB(NZ) DUERR REQUESTED LENGTH # 410 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 ALREADY POSITIONED ST A2,DWTCYL,A6 SAVE CYLINDER NUMBER * * ************************ * * * SEEK SECTOR N * * * ************************ * * DU:010 CF A5,SEEK SEEK CYLINDER N SLC A1,5 RF(N) DU:030 OK. SEEK COMPLETED * EJECT DRDU01 * * ************************ * * * 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 RF DENDIO PERFORM ENDIO * EJECT DRDU01 DRDU01 * * ************************** * * * GO AND EXECUTE ORDER * * * ************************** * * DU:030 LDR A1,A7 ORDER 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 RB(NZ) P:WRIT TRY AGAIN? RF DENDIO ALL RETRIES DONE, GIVE UP * 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 * EJECT DRDU01 * * ********************* * * * 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 RB(NZ) WRIT:N TRY AGAIN? RF DENDIO ALL RETRIES DONE, GIVE UP * WRIT20 EQU * IFT RAW=1 SUK A7,5 RF(E) DENDIO JUMP IF BASIC WRITE LDKL A3,BUF DRIVER BUFFER ADDRESS * WRIT30 CF A5,WER:R EXECUTE WER INSTRUCTIONS CF A5,READ READ SECTOR N ANK A1,/F RF(Z) DENDIO JUMP IF OK SUK A4,1 DECREMENT RETRY COUNTER RB(NZ) WRIT30 TRY AGAIN? XIF * RF DENDIO ALL RETRIES DONE, GIVE UP * EJECT DRDU01 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 RB(NZ) READ:N TRY AGAIN? * DENDIO EQU * COMMON BRANCH LABEL ABL END:IO ALL RETRIES DONE * EJECT DRDU01 * * *************************** * * * CHECK CYLINDER NUMBER * * * *************************** * * READ10 EQU * IFT MMUPAG=0 LD* A2,2,A8 GET CURRENT CYLINDER NUMBER XIF * IFT MMUPAG=1 IFF 1-ONLYDM+DSKPAG=0 LD A2,DWT:LA,A6 GET FLAG/LOGICAL BUFFER ADDRESS RF(Z) READ30 JUMP IF BUFFER IN SYSTEM AREA TS -30,A15 SAVE MMU REGISTERS ON STACK TL DWT:PA,A6 LOAD PSEUDO MMU TABLE ELR A2,A2 GET CURRENT CYLINDER NUMBER TL -30,A15 RESTORE MMU REGISTERS FROM STACK RF READ40 * READ30 EQU * LD* A2,2,A8 GET CURRENT CYLINDER NUMBER XIF * EJECT DRDU01 * * IFT MMUPAG=1 IFT ONLYDM-DSKPAG=1 LD* A2,2,A8 GET CURRENT CYLINDER NUMBER XIF * READ40 EQU * CW A2,DWTCYL,A6 COMPARE WITH REQUESTED CYLINDER NUMBER RB(E) DENDIO OK, PERFORM ENDIO RB DU:015 ERROR. SEEK CYLINDER 0 * EJECT DRDU01 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 * EJECT DRDU01 * * WER:WB LD A3,2,A8 USER BUFFER ADDRESS * IFT MMUPAG=1 IFF 1-ONLYDM+DSKPAG=0 LDR* A1,A8 GET FIRST WORD OF ECB ANKL A1,/3000 GET BITS 16-17 IN BUFFER ADDRESS ORR A2,A1 XIF * EX:WER EQU * EX DWTWR1,A6 EXECUTE 1:ST WER EX DWTWR2,A6 EXECUTE 2:ND WER RTN A5 * EJECT DRDU01 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 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 * IFT MMUPAG=0 ST* A2,2,A8 PUT CYL. NR IN USER BUFFER XIF * IFT MMUPAG=1 IFF 1-ONLYDM+DSKPAG=0 LD A1,DWT:LA,A6 GET FLAG/LOGICAL BUFFER ADDRESS RF(Z) WRITE3 JUMP IF BUFFER IN SYSTEM AREA TS -30,A15 SAVE MMU REGISTERS ON STACK TL DWT:PA,A6 LOAD PSEUDO MMU TABLE ESR A2,A1 PUT CYL. NR IN USER BUFFER TL -30,A15 RESTORE MMU REGISTERS FROM STACK RF WRITE4 * WRITE3 EQU * ST* A2,2,A8 PUT CYL. NR IN USER BUFFER XIF * EJECT DRDU01 * * IFT MMUPAG=1 IFT ONLYDM-DSKPAG=1 ST* A2,2,A8 PUT CYLNMB. IN USER BUFFER XIF * WRITE4 EQU * LC A2,DWTSEC,A6 SECTOR NUMBER SLL A2,2 ADK A2,1 * EJECT DRDU01 DRDU01 * * CIO EQU * LC A1,DWTOR,A6 ANK A1,1 INDEX ADR A1,A1 DOUBLE INDEX ADR A1,A6 EX DWTCIO,A1 EXECUTE CIO-START LDK A1,1 ABL(3) END:20 DEVICE ADDRESS UNKNOWN? ST A4,DWTA4,A6 A4 ST A5,DWTA5,A6 A5 * 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 LD A1,INIFLG INITIALIZATION FLAG RF(Z) DUON20 POWER UP * DURED2 EQU * LDKL A1,/7FFF ANS A1,DWTST,A6 SET DISC UNIT BUSY * IFT NUNITS=2 LDR* A6,A6 GET OTHER DWT ADDRESS ANS A1,DWTST,A6 SET DWT BUSY XIF * EJECT DRDU01 * * DUON05 EQU * LDKL A5,DWTSB2 STACK BASE ADR A5,A6 STACK BASE CF A5,VO:NAM GET VOLUME NAME * IFT NUNITS=2 LDR* A6,A6 OTHER DISC UNIT DWT ADDRESS LDKL A5,DWTSB2 ADR A5,A6 STACK BASE CF A5,VO:NAM GET VOLUME NAME LD A8,DWTECB,A6 GET ECB ADDRESS RF(NZ) DUON10 ANY REQUEST ON? LDR* A6,A6 NO, CHECK NEXT DRIVE XIF * LD A8,DWTECB,A6 GET ECB ADDRESS RF(Z) DUON15 NO REQUEST ON? * DUON10 LD A7,DWTORD,A6 GET ORDER ST A7,DWTOR,A6 RESTORE INDEX AND ORDER ANK A7,/3F ABL DUA:00 REPEAT REQUEST * EJECT DRDU01 * * DUON15 CF A15,TENDIO * IFT NUNITS=2 LDR* A6,A6 GET OTHER DWT ADDRESS CF A15,TENDIO XIF RB T:DISP DISPATCH * * READY INTERRUPT * DUREDY LD A1,TIMER RB(Z) DURED2 NO TIMER ACTIVE * IFT NUNITS=1 CM* TIMER KILL TIMER RF DUON40 XIF * RB T:DISP TIMER ACTIVE * EJECT DRDU01 * * 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 A5,DWTSB2 GET STACK BASE ADR A5,A6 CF A5,VO:NAM READ VOLUME NAME * IFT NUNITS=2 LDR A4,A1 SAVE RETURN CODE LDR* A6,A6 GET OTHER DWT ADDRESS LDKL A5,DWTSB2 GET STACK BASE ADR A5,A6 CF A5,VO:NAM READ VOLUME NAME LDR A3,A1 SAVE RETURN CODE LD A8,DWTECB,A6 GET ECB ADDRESS RF(Z) DUON23 NO REQUEST ON THIS DISC? ADK A1,0 CHECK RETURN CODE RB(Z) DUON10 REPEAT REQUEST? * DUON23 EQU * LDR* A6,A6 GET OTHER DWT ADDRESS LDR A1,A4 RESTORE RETURN CODE FROM OTHER DISC XIF * LD A8,DWTECB,A6 GET ECB ADDRESS RF(Z) DUON26 NO REQUEST ON THIS DISC? ADK A1,0 CHECK RETURN CODE RB(Z) DUON10 REPEAT REQUEST? * EJECT DRDU01 * * DUON26 EQU * IFT NUNITS=2 ADR A1,A3 CHECK RETURN CODES RB(Z) DUON15 NO REQUESTS AND BOTH OPERABLE? XIF * IFT NUNITS=1 ADK A1,0 SET CR RB(Z) DUON15 NO REQUEST AND OPERABLE? XIF * 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 DUON05 * EJECT DRDU01 DRDU01 * * *********************** * * * INTERRUPT HANDLER * * * *********************** * * IHDU2 EQU * IFT NUNITS=2 ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFT NUNITS=2 IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * IFT NUNITS=2 LDKL A6,DWDU02 DISC UNIT NO. 2 RF IHDU10 XIF * EJECT DRDU01 * * IHDU EQU * IHDU1 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 IFT NUNITS=2 LDR A2,A1 ANK A2,/40 RF(Z) IHDU20 LDKL A6,DWDU02 XIF * IHDU20 ANKL A1,/460F 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 * GET LD A5,DWTA5,A6 RELOAD REGISTERS A5 LD A4,DWTA4,A6 A4 LD A7,DWTOR,A6 ANK A7,/3F ORDER LD A8,DWTECB,A6 ECB ADDRESS RTN A5 * EJECT DRDU01 DRDU01 * * ******************* * * * PERFORM ENDIO * * * ******************* * * END:IO EQU * ANKL A1,/20F MASK RETURN CODE RF(NZ) END:10 ERROR LD A2,4,A8 REQUESTED LENGTH = ST A2,6,A8 EFFECTIVE LENGTH * END:10 EQU * LDK A2,QRETRY GET MAX NO OF RETRIES 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 * EJECT DRDU01 * * END:20 EQU * 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 ABL TDISP GO TO DISPATCHER * EJECT DRDU01 * * VO:NAM EQU * CM DWTSAV,A6 INDICATE VOLUME NAME READING CM DWTOR,A6 INDEX=0 * VO:NA5 EQU * 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 LDK A2,0 CYLINDER NUMBER = 0 ST A2,DWTCYL,A6 CF A5,CIO READ VOLUME LABEL ANK A1,3 RF(NZ) VO:NA8 THROUGHPUT ERROR,NOT OPERABLE LDK A2,DWTNAM ADR A2,A6 LD A3,DWTOR,A6 RF(Z) DUNA10 FIXED DISC ADK A2,6 CARTRIDGE DISC * EJECT DRDU01 * * DUNA10 LDKL A3,BUF+2 GET BUFFER ADDRESS ST A4,DWTA4,A6 SAVE RETRY COUNTER 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 ADK A1,0 SET CR RF(Z) DUNA40 VOLUME MATCH LD A4,INIFLG CHECK INITIALIZATION FLAG RF(NZ) DUNA40 NOT POWER UP? LC A4,DWTOR,A6 INDEX ADR A4,A4 ADR A4,A6 ST A1,DWTBSY,A4 NEW VOLUME LOADED * EJECT DRDU01 * * DUNA40 EQU * LD A4,DWTA4,A6 RESTORE RETRY COUNTER LD A1,DWTOR,A6 ORDER RF(NZ) VO:NA6 LDK A1,1 SC A1,DWTOR,A6 INDEX=1 RB VO:NA5 * VO:NA6 LDK A1,0 RESET RETURN CODE * VO:NA8 EQU * LDKL A2,-1 ST A2,DWTSAV,A6 RTN A5 * * TIMER POINTER * TIMER DATA 0 TIMER POINTER * EJECT DRDU01 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 IFT MMUPAG=1 DATA 0 SAVE AREA USER ECB ADDRESS DATA ECBDU2 MMU ECB ADDRESS XIF IFT NUNITS=2 DATA /00FF LEFT BYTE=SECTOR NUMBER DATA 0,0,0 SAVE AREA FOR REGISTERS DATA 0,0 STACK DATA 0,0 DATA 0 DISC UNIT BUSY INDICATOR DATA 0 RIGHT BYTE = CYLINDER NUMBER CIO A2,1,DAF2 CIO-START FIXED DISC CIO A2,1,DAC2 CIO-START CARTRIDGE DISC * EJECT DRDU01 * * 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 0 DATA /FFFF CYLINDER NO. IFT TYPE2=0 DATA MAXCY5 MAX CYLINDER NO XIF IFT NUNITS+TYPE2=3 DATA MAXCY6 MAX CYLINDER NO XIF * IFT NUNITS=2 IFT MMUPAG=1 DATA 0 PAGE NUMBER (PSEUDO MMU TABLE) DATA 0 16 BIT LOGICAL BUFFER ADDRESS ECBDU2 EQU * DATA 0,0,0,0,0,0 XIF * EJECT DRDU01 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 IFT MMUPAG=1 DATA 0 SAVE AREA USER ECB ADDRESS DATA ECBDU1 MMU ECB ADDRESS XIF 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 0 UNIT BUSY INDICATOR DATA 0 UNIT BUSY INDICATOR DWTCIO EQU *-DWDU01 CIO-START CIO A2,1,DAF1 CIO A2,1,DAC1 * EJECT DRDU01 * * 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 DWTORD EQU *-DWDU01 DATA 0 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 * EJECT DRDU01 * * IFT MMUPAG=1 DWT:PA EQU *-DWDU01 DATA 0 PAGE NUMBER (PSEUDO MMU TABLE) DWT:LA EQU *-DWDU01 DATA 0 16 BIT LOGICAL BUFFER ADDRESS ECBDU1 EQU * DATA 0,0,0,0,0,0 XIF * * * END