|
|
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: 20694 (0x50d6)
Notes: pts_type(SC)
Names: »DRMD01.SC«
└─⟦13e5fd45a⟧ Bits:30009699 Philips computer tape "600507"
└─⟦this⟧ »TOSSWORK/DRMD01.SC«
└─⟦bc20f3abf⟧ Bits:30009670 Philips computer tape "600126"
└─⟦this⟧ »TOSSWORK/DRMD01.SC«
IDENT DRMD01 REL 11.0 81-01-26 870105041100 =1, PRR 11.0 80-11-19 ,ATTACH BIT CLEARED BY RECOVERY * * ************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * DRMD01 = DRIVER FOR ONE TO FOUR DISC UNITS * * PTS 8863 (X1250) * * * * * ************************************************** * * * THIS DISC DRIVER HANDLES UP TO FOUR DISC * DRIVES X1250 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 DRMD01 DRMD01 * * *********** * ENTRIES * *********** * * ENTRY MDADR ACTIVATION ADDRESS ENTRY MDON RECOVERY ROUTINE ENTRY IHMD INTERRUPT HANDLER ENTRY DWMD01 DWT ADDRESS EJECT DRMD01 * * ************* * EXTERNALS * ************* * * EXTRN TDISP DISPATCHER EXTRN TENDIO END I/O EXTRN SAVE8 SAVE REGS. A1-A8 ON A15 STACK EXTRN DISIOE REQUEST ERROR EXTRN VOLADR EXTRN VOLCLR CLEAR VOLUME NAME FROM DWT EXTRN VOLNAM EXTRN INTSAV SAVE AREA LAST INTERRUPT EXTRN INIFLG INITIALIZATION FLAG EXTRN PFPOST PWF POST PROC. FLAG EXTRN INXDWT DOUBLED INDEX + DWT ADDRESS 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 EXTRN DWTORD ORDER SAVE AREA EXTRN DWTVOL VOLUME NAME AREAS 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 DRMD01 * * ************************** * * * CONDITIONAL ASSEMBLY * * * ************************** * * * READ AFTER WRITE MAY BE EXCLUDED FOR ORDER /15 * BY SETTING X:A = 0 * X:A EQU 0 RAW EQU X:A * * * A PROGRAM VERSION USING TOSS MMU PAGING * IS OBTAINED BY SETTING MMUPAG EQU 1 * MMUPAG EQU 0 * CPU852 EQU 1 EJECT DRMD01 DRMD01 * * ************* * CONSTANTS * ************* * * CUADR EQU /04 CONTROL UNIT ADDRESS DAMD1 EQU CUADR+/00 DEVICE ADDRESS UNIT 1 DAMD2 EQU CUADR+/10 DEVICE ADDRESS UNIT 2 DAMD3 EQU CUADR+/20 DEVICE ADDRESS UNIT 3 DAMD4 EQU CUADR+/30 DEVICE ADDRESS UNIT 4 WERAD EQU CUADR+CUADR MUX ADDRESS * MAXSEC EQU 23400 MAX NO OF SECTORS SECLEN EQU 256 SECTOR LENGTH, CHARACTERS QRETRY EQU 4 NO OF RETRIES TIME EQU 1000 1 MIN 40 SEC * DEVIND EQU 10 * EJECT DRMD01 DRMD01 * * DATA 0 INDICATES NO MMU BUFFER DATA DEVIND DISC DEVICE INDEX MDADR DATA MDAD ACTIVATION ADDRESS DATA 0 ABORT ROUTINE ADDRESS * EJECT DRMD01 * * *********************** * * * INTERLACING TABLE * * * *********************** * * TRATAB EQU * DATA /0004,/080C,/1014,/181C,/2024 DATA /282C,/3001,/0509,/0D11,/1519 DATA /1D21,/2529,/2D31,/0206,/0A0E DATA /1216,/1A1E,/2226,/2A2E,/3203 DATA /070B,/0F13,/171B,/1F23,/272B DATA /2F33 * EJECT DRMD01 * **************** * * * ACTIVATION * * * **************** * * MDAD EQU * LD A1,DWTOR,A6 SAVE INDEX AND ORDER FOR RECOVERY ST A1,DWTORD,A6 CF A15,INXDWT LD A1,DWTCYL,A4 ACTUALL CYLINDER ST A1,DWTSEK,A6 MDAD:0 EQU * CM DWTIOR,A6 PREPARE FOR ORDER IFT MMUPAG=1 LDR* A3,A8 GET 1:ST WORD OF ECB ANKL A3,/3000 ORKL A3,/8080 PREPARE FOR 1:ST WER INSTR. XIF IFT MMUPAG=0 LDKL A3,/8080 PREPARE FOR 1:ST WER INSTR. XIF LDR A1,A7 GET ORDER RF(Z) TESTST TEST STATUS SUK A1,/01 RF(Z) INI:01 BASIC READ SUK A1,/04 RF(Z) INI:00 BASIC WRITE SUK A1,/0C RF(Z) INI:01 PHYSICAL READ SUK A1,/04 RF(Z) INI:00 PHYSICAL WRITE SUK A1,/0A RF(Z) FORVOL FORMAT VOLUME ABL DISIOE INCORRECT ORDER * EJECT DRMD01 * * * ***************** * * * TEST STATUS * * * ***************** * * TESTST EQU * CF A5,VO:NAM ORS A1,ECBRC,A8 SAVE RETURN CODE CF A15,VOLNAM LDK A1,0 RESET RETURN CODE ABL END:20 * EJECT DRMD01 * ***************************** * * * FORMAT VOLUME * * * ***************************** * FORVOL EQU * LDK A4,QRETRY FORV10 EQU * LDKL A3,/4002 HEAD 1 AND ORDER CODE ST A3,DWTSEK,A6 LDK A3,2 ORDER CODE ST A3,DWTSEN,A6 FORV20 EQU * CF A5,CIO:00 ANK A1,2 RF(NZ) FORV50 SEEK ERROR LD A3,DWTSEK,A6 HEAD 1 CF A5,CIO:00 ANK A1,2 RF(NZ) FORV50 SEEK ERROR LDK A3,4 NEXT CYLINDER ADS A3,DWTSEK,A6 HEAD 0 AD A3,DWTSEN,A6 HEAD 0 ST A3,DWTSEN,A6 CWK A3,920 4*230 RB(NG) FORV20 LDKL A2,923 CYLINDER NUMBER AND SEEK ORDER FORV40 EQU * ABL END:15 FORV50 EQU * SUK A4,1 RB(NN) FORV10 RETRY LDK A2,0 DUMMY CYLINDER NUMBER AND ORDER CODE RB FORV40 ENDIO EJECT DRMD01 * * ***************************** * * * TEST OF INPUT PARAMETERS * * ECBRL,ECBCW1 AND ECBCW2 * * * ***************************** * * INI:00 EQU * IM DWTIOR,A6 WRITE ORDER ADKL A3,/4000 WER INSTRUCTION INI:01 EQU * ST A3,DWTWE1,A6 1:ST WER INSTRUCTION PREPARED LD A1,ECBRL,A8 GET REQUESTED LENGTH RF(Z) INCLEN ERROR ECR A3,A1 GET NUMBER OF SECTORS ANK A1,/FF RF(NZ) INCLEN INCORRECT REQUESTED LENGTH LD A2,ECBCW2,A8 GET SECTOR NUMBER RF(N) INCLEN NGR A1,A3 NEGATE FOR SECTOR COUNTING ST A1,DWTSEN,A6 NUMBER OF SECTORS IN IO IFT RAW=1 ST A1,BUFF SAVE FOR READ AFTER WRITE XIF ADR A3,A2 RF(O) INCLEN SUKL A3,MAXSEC RF(NP) INI:20 INCLEN LDKL A1,/8008 INCORRECT LENGTH ABL END:15 * EJECT DRMD01 * * *********************************** * * TRANSFER LOGICAL SECTOR NUMBER * * TO CYLINDER NUMBER AND * * SECTOR NUMBER ON CYLINDER * * * *********************************** * * INI:20 EQU * LD A1,ECBBA,A8 GET BUFFER ADDRESS ST A1,DWTWE2,A6 PREPARE FOR SECOND WER INSTRUCTION LDK A1,0 INI:22 EQU * LDK A4,QRETRY DVK 104 * A1=REMAINER = SECTOR NUMBER O N CYLINDER * A2=QUOTIENT = CYLINDER NUMBER ST A1,DWTSEC,A6 SAVE SECTOR NUMBER * EJECT DRMD01 * * SLL A2,2 CYLINDER NUMBER IN POSITION ADK A2,3 SEEK ORDER CODE CW A2,DWTSEK,A6 TEST IF SAME CYLINDER RF(E) INI:35 INI:30 EQU * IM DWTSFL,A6 INDICATE SEEK TO BE DONE ST A2,DWTSEK,A6 SAVE IN SEEK REGISTER SAVE AREA * EJECT DRMD01 * * * PREPARE HEAD NUMBER * INI:35 EQU * LDK A3,0 HEAD NO 0 CWK A1,52 SECTOR ON 1:ST OR 2:ND TRACK RF(L) INI:40 SUK A1,52 LDKL A3,/4000 HEAD NO 1 * * * GET PHYSICAL SECTOR NUMBER AND PREPARE DWTIOR,A6 * INI:40 EQU * LC A1,TRATAB,A1 GET INTERLACED SECTOR NUMBER SRC A2,3 RF(NN) INI:42 EVEN CYLINDER NUMBER SUK A1,26 SKEW FACTOR = 26 SECTORS RF(NN) INI:42 ADK A1,52 INI:42 EQU * SLL A1,2 SECTOR NO IN POSITION ADR A1,A3 HEAD NUMBER ORS A1,DWTIOR,A6 SAVE IN CIO REGISTER SAVE AREA LD A1,DWTSFL,A6 SEEK TO BE DONE ? RF(Z) INI:45 * EJECT DRMD01 * * INI:43 EQU * CF A5,SEEK PERFORM SEEK ADK A1,0 RF(Z) INI:44 NO RETURN CODE LDKL A2,/100 RETRIES PERFORMED ORS A2,ECBRC,A8 SUK A4,1 RB(NZ) INI:43 RETRY LDK A2,0 DUMMY CYL NO AND ORDER CODE RF END:15 NO MORE RETRIES INI:44 EQU * CM DWTSFL,A6 RESET SEEK FLAG * * CIO AND CHECK RETURN CODE * INI:45 EQU * CF A5,CIO PERFORM IO ADK A1,0 CHECK RETURN CODE RF(Z) INI:50 OK LDKL A2,/100 RETRIES DONE ORS A2,ECBRC,A8 SUK A4,1 RETRY COUNTER RB(NZ) INI:45 RETRY RF END:15 * EJECT DRMD01 * * INI:50 EQU * LDKL A3,SECLEN GET SECTOR LENGTH LDR A4,A3 GET SECTOR LENGTH LDK A2,1 ANS A2,DWTIOR,A6 SAVE ORDER TYPE IFT RAW=1 SUK A7,/15 RF(NZ) INI:52 NOT PHYSICAL WRITE LD A2,DWTIOR,A6 CHECK IF READ IS DONE RF(NZ) INI:54 LDK A4,0 SAME BUFFER FOR READ AFTER WRITE TEST INI:52 EQU * XIF ADS A3,ECBEL,A8 UPDATE EFFECTIVE LENGTH INI:54 EQU * IM DWTSEN,A6 UPDATE SECTOR COUNTER RF(Z) END:00 LAST SECTOR DONE * IFT MMUPAG=0 ADS A4,DWTWE2,A6 UPDATE BUFFER ADDRESS XIF * IFT MMUPAG=1 ADK A4,0 RF(Z) INI:60 READ AFTER WRITE ON ML 2,DWTWE1,A6 GET WER REGISTERS SLC A1,4 BIT 0,1 OF BUFFER ADDRESS IN POSITION SRL A2,1 BIT 2,17 IN POSITION LDR A3,A1 DAK /0,/0080 SECTOR LENGTH * EJECT DRMD01 * * ANK A1,3 BIT 0,1 ANKL A3,/FFFC ORR A1,A3 1ST WER SRC A1,4 IN POSITION SLL A2,1 MS 2,DWTWE1,A6 INI:60 EQU * XIF * LDK A4,QRETRY RETRIES IM DWTSEC,A6 UPDATE SECTOR NUMBER ON CYLINDER LD A2,DWTSEK,A6 PREPARE FOR SEEK LD A1,DWTSEC,A6 GET SECTOR NO ON CYLINDER CWK A1,104 NEXT CYLINDER ? RB(L) INI:35 SAME CYLINDER CM DWTSEC,A6 NEW CYLINDER LDK A1,0 SECTOR 0 ADK A2,4 NEXT CYLINDER RB INI:30 IO ON SEC. 0 ON NEXT CYLINDER EJECT DRMD01 * * * ******************** * * * SEEK AND CIO * * SUBROUTINE * * * ******************** * SEEK EQU * LD A3,DWTSEK,A6 RF CIO:00 * CIO EQU * LD A3,DWTWE1,A6 GET 1ST WER INST. REG. WER A3,WERAD LD A3,DWTWE2,A6 GET 2ND WER INST. REG. WER A3,WERAD+1 LD A3,DWTIOR,A6 GET CIO INST. REG. CIO:00 EQU * ST A4,DWTA4,A6 SAVE A4 LD A2,PFPOST RF(NZ) CIOAB PWF POST PROCESSING ON CF A15,INXDWT EX DWTCIO,A4 LDK A1,1 RF(3) END:30 CU ADDRESS UNKNOWN CIOAB EQU * ST A5,DWTA5,A6 RF T:DISP * EJECT DRMD01 * * END:00 EQU * IFT RAW=1 ADK A7,0 PHYSICAL WRITE ? RF(NZ) END:10 NOT PHYSICAL WRITE LD A2,DWTIOR,A6 ANK A2,1 RF(Z) END:10 READ AFTER WRITE DONE LDKL A1,/8001 ST A1,DWTWE1,A6 READ ONE WORD TO CHECK CRC LDKL A1,BUFF DRIVER WORK BUFFER ST A1,DWTWE2,A6 BUFFER ADDRESS TO 2:ND WER CM DWTIOR,A6 LD A1,BUFF GET NUMBER OF SECTORS IN IO ST A1,DWTSEN,A6 UPDATE DWTSEN FOR READ AFTER WRITE LDK A1,0 LD A2,ECBCW2,A8 ABL INI:22 XIF END:10 EQU * LD A2,DWTSEK,A6 GET CYL NO AND ORDER CODE END:15 EQU * CF A15,INXDWT ST A2,DWTCYL,A4 END:20 EQU * CF A15,TENDIO PERFORM ENDIO T:DISP ABL TDISP * END:30 EQU * DEVICE ADDRESS UNKNOWN ORS A1,DWTST,A6 INDICATE 1ST RECOVERY DONE =1 RB END:20 * EJECT DRMD01 * * VO:NAM EQU * CM DWTSAV,A6 INDICATE VOLUME NAME READING LDK A1,6 CF A15,VOLCLR LDK A1,3 ST A1,DWTSEK,A6 SEEK PREPARATION CYL 0 CF A5,SEEK LDK A2,0 ANK A1,/3 RETURN CODE RF(NZ) VO:NA8 ERROR LDKL A1,/8003 READ 3 WORDS VOLUME NAME ST A1,DWTWE1,A6 WER PREPARATION CF A15,VOLADR GET ADDRESS TO DWT VOLUME NAME ST A1,DWTWE2,A6 READ TO DWT CM DWTIOR,A6 READ SECTOR 0 CF A5,CIO LD A2,DWTSEK,A6 VO:NA8 EQU * CF A15,INXDWT ST A2,DWTCYL,A4 LDKL A2,-1 ST A2,DWTSAV,A6 INDICATE READY RTN A5 EJECT DRMD01 DRMD01 * ********************** * * * RECOVERY ROUTINE * * * ********************** * MDON EQU * IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF IFT CPU852=1 CF A15,SAVE8 XIF LDKL A6,DWMD01 LDKL A1,/7FFE SET UNIT BUSY AND RECOVERY ON =1 ANS A1,DWTST,A6 =1 LD A1,INIFLG POWER UP? RF(NZ) MDON25 * LDKL A4,TIMER TIMER POINTER ADDRESS LDR* A3,A4 RF(Z) MDON10 NO TIMER ACTIVE LDKL A1,-TIME STR A1,A3 RESTART TIMER RB T:DISP * MDON10 CF A15,SETIMP START TIMER DATA MDON20,TIME TIME OUT ADDRESS, TIME RB T:DISP * * TIME OUT * MDON20 LDKL A6,DWMD01 CM TIMER * EJECT DRMD01 * * MDON25 EQU * LDKL A5,DWTSB2 STACK BASE ADR A5,A6 LDK A1,0 UNIT 0 MDON30 ST A1,DWTOR,A6 CF A5,VO:NAM GET VOLUME NAME LD A1,DWTOR,A6 ADKL A1,/100 NEXT UNIT CWK A1,/300 RB(NG) MDON30 IM DWTST,A6 INDICATE VOLUME NAMES READ LD A8,DWTECB,A6 GET ECB ADDRESS RB(Z) END:15 NOREQUEST ON * LD A7,DWTORD,A6 GET ORDER ST A7,DWTOR,A6 RESTORE INDEX AND ORDER ANK A7,/3F ABL MDAD:0 * * EJECT DRMD01 DRMD01 * * *********************** * * * INTERRUPT HANDLER * * * *********************** * * IHMD EQU * MSR 8,A15 SAVE A1-A8 ON STACK LDKL A6,DWMD01 DWT ADDRESS * SST A1,CUADR GET STATUS ANKL A1,/617 MASK RETURN CODE LDR A2,A1 ANKL A2,/610 MOVE BITS SRC A2,5 PROGRAM ERROR BIT RF(NN) IHMD30 ORKL A1,/8000 REQUEST ERROR IHMD30 EQU * SRL A2,3 SEEK ERROR,DATA ERROR ORR A1,A2 ANKL A1,/8007 MASK RETURN CODE LD A2,DWTSAV,A6 RF(NN) GET LDR A3,A1 ANKL A3,/8001 RB(NZ) END:15 DISC UNIT NOT OPERABLE OR REQUEST ERROR * 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 * * * TIMER POINTER TIMER DATA 0 TIMER POINTER IFT RAW=1 * BUFFER BUFF DATA 0 XIF * EJECT DRMD01 DRMD01 * * * DEVICE WORK TABLE DISC UNIT NO. 1 * * DWMD01 EQU * DWTSAV EQU *-DWMD01 DATA -1 DATA /8000 DWT STATUS DATA 0 ECB ADDRESS DATA 0 ORDER DATA MDADR 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 ECBMD1 MMU ECB ADDRESS XIF DWTSEC EQU *-DWMD01 DATA 0 SECTOR NUMBER DATA 0,0,0 SAVE AREA FOR REGISTERS DATA 0,0 STACK DATA 0,0 DATA 0 ORDER SAVE AREA DATA /C000 DATA /C000 DATA /C000 DATA /C000 DATA /FFFF,/FFFF,/FFFF VOLUME NAME UNIT 1 DATA /FFFF,/FFFF,/FFFF VOLUME NAME UNIT 2 DATA /FFFF,/FFFF,/FFFF VOLUME NAME UNIT 3 DATA /FFFF,/FFFF,/FFFF VOLUME NAME UNIT 4 DWTWE1 EQU *-DWMD01 DATA 0 1:ST WER INSTRUCTION REG. DWTWE2 EQU *-DWMD01 DATA 0 2:ND WER INSTRUCTION REG. DWTIOR EQU *-DWMD01 DATA 0 CIO REG: HEAD, DWTSEC,A6, ORDER DWTSEK EQU *-DWMD01 DATA 0 SEEK REG: CYL NO AND ORDER DWTSFL EQU *-DWMD01 DATA 0 SEEK FLAG DWTSEN EQU *-DWMD01 DATA 0 SECTOR COUNTER DWTCIO EQU *-DWMD01 CIO START CIO A3,1,DAMD1 UNIT 1 CIO A3,1,DAMD2 UNIT 2 CIO A3,1,DAMD3 UNIT 3 CIO A3,1,DAMD4 UNIT 4 DWTCYL EQU *-DWMD01 DATA 0 CYLINDER NUMBER AND SEEK ORDER CODE DATA 0 DATA 0 DATA 0 IFT MMUPAG=1 ECBMD1 EQU * DATA 0,0,0,0,0,0,0 XIF END