|
|
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: 52670 (0xcdbe)
Notes: pts_type(SC)
Names: »DRFD01.SC«
└─⟦48601905a⟧ Bits:30009668 Philips computer tape "600121"
└─⟦this⟧ »M:TU10/DRFD01.SC«
└─⟦d2a299635⟧ Bits:30009698 Philips computer tape "600415"
└─⟦this⟧ »M:TU10/DRFD01.SC«
IDENT DRFD01 REL 10.0 80-03-14 870105041000 * ********************************************** * * PHILIPS TERMINAL SYSTEM PTS * * DRFD01 = DRIVER FOR FLEXIBLE DISK * * * * * * ********************************************* * * * THIS DISK DRIVER HANDLES UP TO FOUR DAISY * CHAINED FLEXIBLE DISK DRIVES PTS 6879, * CONNECTED TO CPU VIA CHANNEL UNIT CHFD ON * MULTIPLEX OR PROGRAMMED CHANNEL * * EJECT DRFD01 * * ORDERS: * * /00 TEST STATUS * /01 PHYSICAL READ * /02 SEQUENTIAL READ -IBM DISC ONLY- * /05 BASIC WRITE * /06 SEQUENTIAL WRITE -IBM DISC ONLY- * /11 PHYSICAL READ * /15 PHYSICAL WRITE * /21 OPEN * /22 CLOSE * /24 WRITE DELETED DATA * /26 LOCK * /31 REWIND -IBM DISC ONLY- * /37 LOAD * /38 UNLOAD * * ENTRY PARAMETERS: * * A5 STACK BASE * A6 DWT-ADDRESS * A7 ORDER * A8 ECB-ADDRESS EJECT DRFD01 * *********** * * * ENTRIES * * * *********** * ENTRY FDADR ACTIVATION ADDRESS ENTRY IHFD INTERRUPT HANDLER ENTRY FDON RECOVERY ROUTINE ENTRY DWFD01 DWT-ADDRESS EJECT DRFD01 * ************* * * * EXTERNALS * * * ************* * EXTRN TDISP DISPATCHER EXTRN TENDIO ENDIO EXTRN DISIOE REQUEST ERROR EXTRN DISEND PERFORM TENDIO AND TDISP EXTRN VOLCLR CLEAR VOLUME NAME EXTRN VOLNAM VOLUME NAME ADDRESS EXTRN VOLGET VOLUME NAME TO DWT AND SET NVL EXTRN NVLCHK CHECK FOR NEW VOLUME LOADED EXTRN DWTST STATUS EXTRN DWTECB ECB ADDRESS EXTRN DWTUEC USER ECB ADDRESS EXTRN DWTOR DWT INDEX AND ORDER EXTRN DWTORD ORDER/INDEX SAVE AREA EXTRN DWTTAB TTAB ADDRESS EXTRN DWTA2 SAVE AREA A2 EXTRN DWTSB2 STACK BASE 2 IN DWT EXTRN TTB:MT MMU TABLE EXTRN SAVE8 SAVE A1-A8 ON A15 STACK EXTRN SETIMP TIMER EXTRN INTSAV INTERRUPT SAVE AREA EXTRN PFPOST PWF POST PROC. FLAG EXTRN TASCII EBCDIC TO ASCII TAB EXTRN TEBCDIC ASCII TO EBCDIC TAB EXTRN SPDLCI OPEN/CLOSE STATUS FOR FD DRIVE EXTRN ECBBA ECB BUFFER ADDRESS EXTRN ECBRL ECB REQUESTED LENGTH EXTRN ECBEL ECB EFFECTIVE LENGTH EXTRN ECBCW1 ECB CONTROL WORD 1 EXTRN ECBCW2 ECB CONTROL WORD 2 EJECT DRFD01 * ************************ * * * CONDITIONAL ASSEMBLY * * * ************************ * * MULTIPLEX CHANNEL INSTEAD OF PROGRAMMED * CHANNEL BY SETTING X:A = 0 * X:A EQU 1 CHAN EQU 1 * * A PROGRAM VERSION INCLUDING TOSS DISC FORMAT * IS OBTAINED BY SETTING TOSS EQU 1. * X:B EQU 0 TOSS EQU 1 * * A PROGRAM VERSION INCLUDING IBM DISC FORMAT * IS OBTAINED BY SETTING IBM EQU 1. * X:C EQU 0 IBM EQU 1 * * 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 DRFD01 * * * ORDERS /21 OPEN AND /22 CLOSE WHICH CONTROLS THE POWER * TO THE DISK DRIVE UNIT CAN BE INCLUDED BY SETTING OPCLOS =1 * X:D EQU 0 OPCLOS EQU 1 * EJECT DRFD01 * * * MMU BUFFER SIZE * * IFT MMUPAG=0 DVBLEN EQU 256 XIF * IFT MMUPAG=1 X:E EQU 256 DVBLEN EQU 000 XIF * * * MMU DEVICE INDEX * * DEVIND EQU 10 * EJECT DRFD01 * ************* * * * CONSTANTS * * * ************* * CUADR EQU 09 CONTROL UNIT ADDRESS MUXADR EQU CUADR+CUADR MUX-ADDRESS SOPDA EQU /2E S.O.P. DEVICE ADDRESS SECLEN EQU 128 SECTOR LENGTH MAXSEC EQU 2002 MAX SECTOR NUMBER MAXIBM EQU 1923 MAX SECTOR NUMBER IBM DISC BOE EQU 28 BEGIN OF EXTENT POSITION EOE EQU 34 END OF EXTENT POSITION EOD EQU 74 END OF DATA POSITION TIME EQU 20 DELAY - POWER ON OPENTI EQU 10 DELAY AT OPEN ORDERS * DIXTAB EQU * DOUBLE INDEX TABLE DATA /0102 DATA /0408 * EJECT DRFD01 * ********** * * * TABLES * * * ********** * IFF CHAN+IBM=0 DATA DVBLEN+DVBLEN MMU BUFFER SIZE XIF * IFT CHAN=0 IFT IBM=0 DATA 0 INDICATE NO MMU BUFFER XIF * DATA DEVIND DEVICE INDEX FDADR DATA FDAD ACTIVATION ADDRESS DATA 0 ABORT ROUTINE ADDRESS * EJECT DRFD01 * *************** * * * TEST STATUS * * * *************** * TESTST EQU * IFF IBM+TOSS=0 CF A15,NVLCHK STR A1,A6 SAVE NVL INDICATOR XIF * LDKL A2,/FFF9 BIO DUMMY CF A5,FD:WRI ANK A1,1 RF(NZ) DIS:EN DISC NOT OPERABLE LDKL A2,/7FFF RESET REQUEST ERROR BIT ANRS A2,A6 * IFF TOSS+IBM=0 CF A5,VO:NAM GET VOLUME NAME LD A1,DWTORD,A6 RESTORE INDEX AND ORDER ST A1,DWTOR,A6 CF A15,VOLNAM ABL END:RC XIF * IFT TOSS+IBM=0 ABL END:RC XIF * EJECT DRFD01 * ************** * * * ACTIVATION * * * ************** * FDAD EQU * ACTIVATION ENTRY IFT MMUPAG=1 IFT CHAN=0 CM BUFFLG,A6 XIF * LD A2,DWTOR,A6 INDEX AND ORDER ST A2,DWTORD,A6 SAVE FOR RECOVERY PURPOSES CMR A6 RESET TEMPORARY RETURN CODE LDK A3,0 LC A3,DWTOR,A6 GET INDEX * IFT OPCLOS=1 * * CHECK IF OPEN OR CLOSE ORDER * LDR A1,A7 ORDER SUK A1,/21 RF(Z) OPEN OPEN SUK A1,1 RF(NZ) FD:ORD NOT CLOSE ORDER * EJECT * ********* * * * CLOSE * * * ********* * * CLOSE IS PERFORMED BY WRITING A ONE TO BIT * ZERO OF THE SOP LIGHTS EXTERNAL REGISTER * LDKL A1,/8000 MASK FOR BIT 0 ORS A1,SPDLCI SET OPEN/CLOSE BIT RF OPEN10 * EJECT * ******** * * * OPEN * * * ******** * * OPEN IS PERFORMED BY WRITING A ZERO TO BIT * ZERO OF THE SOP LIGHTS EXTERNAL REGISTER. * OPEN EQU * LDKL A1,/7FFF MASK FOR BIT 0 ANS A1,SPDLCI CLEAR OPEN/CLOSE BIT * OPEN10 EQU * LD A1,SPDLCI SOP LIGHTS AND OPEN/CLOSE DATA OTR A1,0,SOPDA OPEN FD DRIVE * * WAIT FOR DRIVE TO BECOME OPERABLE * LDK A4,DWTTP2 TIMER POINTER OFFSET ADR A4,A6 A4:=TIMER POINTER ADDRESS LDR A1,A6 SAVE DWT-ADDR CF A15,SETIMP WAIT DATA OPENRE,OPENTI START ADDR, WAIT TIME ABL TDISP EXIT * OPENRE EQU * LDR A6,A1 GET DWT-ADDR CM DWTTP2,A6 INDICATE NO TIMER RUNNING LDK A1,0 RETURN CODE RF DIS:EN PERFORM TENDIO AND TDISP XIF * EJECT * * PUT DRIVE NO IN CIO-INSTRUCTION * FD:ORD EQU * LC A2,DIXTAB,A3 SC A2,DWTA3+1,A6 SAVE DRIVE INDEX MASK * IFT IBM+TOSS=2 AN A2,DWTLAB,A6 SC A2,DWTFIB+1,A6 INDICATE TOSS/IBM XIF * CF A5,SETCIO A3,A4 AFFECTED * EJECT DRFD01 * * LDR A3,A7 RB(Z) TESTST TEST STATUS * IFT IBM=0 SUK A3,38 RF(N) INTEST READ/WRITE ORDER SUK A3,18 ABL(NP) LOAD LOAD/UNLOAD XIF * IFT IBM=1 SUK A3,1 RF(Z) INTEST BASIC READ SUK A3,1 RF(Z) IBMCHK SEQUENTIAL READ SUK A3,3 RF(Z) INTEST BASIC WRITE SUK A3,1 RF(Z) IBMCHK SEQUENTIAL WRITE SUK A3,32 RF(N) INTEST PHYSICAL READ/WRITE SUK A3,11 RF(Z) IBMCHK REWIND SUK A3,7 ABL(NP) LOAD LOAD/UNLOAD XIF * IBMCHK EQU * IFT TOSS+IBM=2 LD A4,DWTFIB,A6 ABL(NZ) IBMDSK IBM DISC HANDLING XIF * IFT TOSS=0 IFT IBM=1 ABL IBMDSK IBM DISC HANDLING XIF * EJECT DRFD01 * * REQERR ABL DISIOE REQUEST ERROR * INCLEN EQU * INCORRECT REQUESTED LENGTH EXIT LDKL A1,/8008 RETURN CODE * DIS:EN EQU * ABL DISEND PERFORM TENDIO AND GO TO TDISP * EJECT DRFD01 * * INPUT PARAMETER CHECK * INTEST EQU * IFF TOSS+IBM=0 CF A15,NVLCHK CHECK IF NEW VOLUME LOADED ADK A1,0 RB(NZ) DIS:EN NEW VOLUME LOADED XIF * LD A3,ECBRL,A8 RB(Z) INCLEN INCORRECT INPUT PARAMETER ECBRL SRC A3,7 NUMBER OF PHYSICAL SECTORS RB(N) INCLEN INCORRECT INPUT PARAMETER ECBRL CWK A3,/01FF RB(G) INCLEN INCORRECT INPUT PARAMETER ECBRL LD A2,ECBCW2,A8 GET SECTOR NUMBER * IFT IBM+TOSS=2 LD A4,DWTFIB,A6 RF(NZ) INTES5 IBM-DISC XIF * IFT TOSS=1 LDR A4,A3 SRC A4,1 CHECK IF EVEN NUMBER OF PHYSICAL SECTORS RB(N) INCLEN INCORRECT INPUT PARAMETER ECBRL SLL A2,1 TRANSFER TOSS-SEC. NO TOPHYSICAL SEC. NO * EJECT DRFD01 * * INTES5 EQU * XIF LDR A4,A2 SAVE PHYSICAL SECTOR NUMBER RB(N) REQERR REQUEST ERROR SUKL A4,MAXSEC RB(NN) REQERR REQUEST ERROR ADR A4,A3 RB(P) INCLEN INCORRECT LENGTH ST A3,DWTNOS,A6 SAVE NUMBER OF SECTORS ST A2,DWTCW2,A6 DWTCW2 CONTAINING PHYS SEC NO LD A2,ECBBA,A8 GET ECBBA ST A2,DWTBA,A6 SAVE ECB BUFFER ADDRESS * IFT MMUPAG=1 LCR A2,A8 ANK A2,/30 ST A2,DWT:BF,A6 SAVE BITS 0-1 IN 18-BIT ADDRESS XIF * EJECT DRFD01 * * MULTIPLE SECTOR IO ENTRY * FD:000 EQU * IFT MMUPAG=1 IFT CHAN=0 LD A2,DWT:BF,A6 ST A2,BUFFLG,A6 SET BUFFER FLAG XIF * LDKL A2,512 LDK A4,3 SUK A3,4 RF(NN) FD:005 FOUR PHYS. SEC. IO * FD:003 SUK A2,128 SUK A4,1 ADK A3,1 RB(NZ) FD:003 * FD:005 EQU * ST A4,DWTSIO,A6 SECTORS IN ONE IO ON DISC ST A2,DWTRL,A6 UPDATE DWTRL FOR BIO ST A3,DWTNOS,A6 UPDATE NUMBER OF SECTORS * EJECT DRFD01 * * IFT MMUPAG=1 IFF CHAN+IBM=0 LD A2,DWTBA,A6 BUFFER ADDRESS LD A1,DWT:BF,A6 RF(NZ) FD:007 BUFFER NOT IN SYSTEM AREA LDR A3,A2 RF(NN) FD:009 AD A3,DWTRL,A6 CHECK IF 64K LIMIT WILL BE PASSED RF(N) FD:009 NO * EJECT DRFD01 * * FD:007 EQU * ECR A3,A2 ANK A3,/F0 SRL A3,2 SLL A1,2 ORR A1,A3 SC A1,DWT:PA,A6 6 BIT PHYSICAL BUFFER ADDRESS ADK A1,/4 CREATE ONE MORE MMU ENTRY SC A1,DWT:PA+2,A6 ANKL A2,/FFF LDR A1,A2 ORK A1,1 INDICATE ADDRESS NOT ZERO * FD:009 ST A1,DWT:LA,A6 16 BIT LOGICAL BUFFER ADDRESS XIF * LDK A4,0 PREPARE FOR BIO LD A1,DWTOR,A6 ANK A1,/3F ORDER SUK A1,1 RF(Z) FD:060 BASIC READ SUK A1,4 RF(Z) FD:015 BASIC WRITE SUK A1,12 RF(Z) FD:060 PHYSICAL READ SUK A1,4 RF(Z) FD:013 PHYSICAL WRITE SUK A1,15 CHECK IF WRITE DELETED DATA * RQ:ERR EQU * RB(NZ) REQERR * EJECT DRFD01 * * WRITE DELETED DATA, PHYSICAL AND BASIC WRITE ORDERS * LDK A4,1 WRITE DELETED DATA ORDER FD:013 EQU * PHYSICAL WRITE ORDER ADK A4,4 FD:015 EQU * BASIC WRITE ORDER ADK A4,1 CF A5,BIO PREPARATION FOR CIO * IFT MMUPAG=1 IFT CHAN=0 IFT TOSS+IBM=2 LD A1,DWTFIB,A6 RF(Z) FD:018 NOT IBM XIF * IFT MMUPAG=1 IFF CHAN+IBM=0 LD A1,DWT:LA,A6 GET FLAG/LOGICAL BUFFER ADDRESS RF(Z) FD:019 BUFFER IN SYSTEM AREA LDR A7,A3 REQUESTED LENGTH LDR A8,A2 SAVE A2 LDKL A4,BUF DRIVER BUFFER ADDRESS LDR A2,A4 TS -30,A15 SAVE RUNNING TASK MMU TL DWT:PA,A6 LOAD PSEUDO MMU TABLE MVUS A7 MOVE BUFFER FROM USER TO SYSTEM AREA TL -30,A15 RESTORE MMU FROM STACK LDR A2,A8 RESTORE A2 CM BUFFLG,A6 INDICATE BUFFER IN SYSTEM AREA FD:019 EQU * XIF * IFT TOSS+IBM=2 LD A1,DWTFIB,A6 RF(Z) FD:018 NOT IBM XIF * IFT IBM=1 LDR A7,A3 NO OF CHAR. TO BE TRANSFORMED CF A5,EBCDIC FD:018 EQU * XIF * EJECT DRFD01 * * CF A5,FD:WRITE PERFORME WRITE ANKL A3,/200 CHECK IF WRITE PROTECTED RF(Z) FD:020 LDK A3,/40 INDICATE ERROR ORRS A3,A6 UPDATE TEMPORARY RETURN CODE FD:020 EQU * RF FD:100 GOTO FDMSIO * EJECT DRFD01 * ***************** * * * PHYSICAL READ * * * ***************** * FD:060 CF A5,BIO * IFT MMUPAG=1 IFT CHAN=0 IFT TOSS+IBM=2 LD A1,DWTFIB,A6 RF(Z) FD:070 TOSS DISC LDKL A4,BUF DRIVER BUFFER ADDRESS CM BUFFLG,A6 INDICATE BUFFER IN SYSTEM AREA XIF * FD:070 EQU * IFT MMUPAG=1 IFT CHAN=1 LD A1,DWT:LA,A6 RF(Z) FD:080 BUFFER IN SYSTEM AREA LDKL A4,BUF DRIVER BUFFER ADDRESS CM BUFFLG,A6 INDICATE BUFFER IN SYSTEM AREA XIF * IFT MMUPAG=1 IFT IBM=1 IFT TOSS+CHAN=0 LDKL A4,BUF DRIVER BUFFER ADDRESS CM BUFFLG,A6 INDICATE BUFFER IN SYSTEM AREA XIF * FD:080 EQU * CF A5,FD:REA PERFORM READ * IFT TOSS+IBM=2 LD A1,DWTFIB,A6 RF(Z) FD:090 NOT IBM XIF * IFT IBM=1 IFT MMUPAG=0 LD A4,DWTBA,A6 ASCII OUTPUT ADDRESS XIF * IFT IBM=1 LD A7,DWTRL,A6 REQ. LEN CF A5,ASCII FD:090 EQU * XIF * EJECT DRFD01 * * IFT MMUPAG=1 IFT CHAN=0 IFT TOSS+IBM=2 LD A1,DWTFIB,A6 RF(Z) FD:100 TOSS DISC XIF * IFT MMUPAG=1 IFF CHAN+IBM=0 LD A2,DWT:LA,A6 GET FLAG/LOGICAL BUFFER ADDRESS RF(Z) FD:100 BUFFER IN SYSTEM AREA LD A7,DWTRL,A6 REQUESTED LENGTH LDKL A1,BUF GET DWT BUFFER ADDRESS TS -30,A15 SAVE RUNNING TASK MMU TL DWT:PA,A6 LOAD PSEUDO MMU TABLE MVSU A7 MOVE BUFFER FROM SYSTEM TO USER AREA TL -30,A15 RESTORE MMU FROM STACK XIF FD:100 EQU * ABL FDMSIO * EJECT DRFD01 * ******** * * * LOAD * * * ******** * LOAD EQU * ADK A3,0 CHECK ORDER CODE RF(Z) UNLOAD UNLOAD ORDER ADK A3,1 RF(Z) LOAD00 LOAD ORDER ADK A3,17 RB(NZ) RQ:ERR ERROR IF NOT LOCK * LOAD00 EQU * LDK A2,/14 LOCK CF A5,FD:REA ANK A3,1 RF(NZ) LOA:80 ENDIO NOT OPERABLE * IFT TOSS+IBM=2 LD A1,DWTFIB,A6 RF(Z) LOA:70 TOSS DISC XIF * IFT IBM=1 LC A3,DWTOR+1,A6 GET ORDER SUK A3,/26 RF(Z) LOA:65 LOCK ORDER CF A5,VO:NAM CF A5,LD:RC CHECK RETURN CODE EJECT DRFD01 * * READ DATA SET LABEL * LD A2,ECBCW2,A8 SECTOR NO SUK A2,7 RF(N) LOA:85 REQUEST ERROR SUK A2,18 RF(P) LOA:85 REQUEST ERROR ADK A2,25 SLL A2,3 BIO LDK A3,80 LENGTH LDKL A4,BUF CF A5,FD:REA SLL A1,4 CHECK NO DATA BIT RF(NN) LOA:60 NOT NO DATA ORK A3,/10 INDICATE ILLEGAL DATA SET LABEL LOA:60 EQU * CF A5,LD:RC ENB LD A3,ECBCW2,A8 DATA SET LABEL SECTOR LDK A1,DWTDSS CF A5,STDWT SAVE IN DWT ADK A4,BOE BOE ADDRESS CF A5,LOGSEC TRANSFORM TO LOGICAL SECTOR LDK A1,DWTBOE CF A5,STDWT STORE BOE NO IN DWT SUK A3,1 CRN LDK A1,DWTCRN CF A5,STDWT ADK A4,EOE-BOE EOE ADDRESS CF A5,LOGSEC LDK A1,DWTEOE CF A5,STDWT STORE EOE NO IN DWT ADK A4,EOD-EOE EOD ADDRESS CF A5,LOGSEC INH INHIBIT INTERRUPTS INHIBIT LDK A1,DWTEOD CF A5,STDWT STORE EOD NO IN DWT * LOA:65 EQU * LDKL A3,/400 ORRS A3,A6 UPDATE TEMPORARY RETURN CODE * LOA:70 EQU * XIF LD A2,DWTA3,A6 ORS A2,DWTLC,A6 INDICATE LOCK LOA:80 EQU * ABL END:RC * IFT IBM=1 LOA:85 EQU * LDK A1,/80 REQUEST ERROR SCR A1,A6 UPDATE TEMPORARY RETURN CODE XIF * EJECT DRFD01 * * IFF TOSS+IBM=0 * * ERROR , UNLOCK * LOA:90 EQU * LDR A5,A6 ADKL A5,DWTSB2 STACK BASE LDK A2,/C UNLOCK CF A5,FD:REA RB LOA:80 * * LD:RC SUBROUTINE * LD:RC EQU * ANK A3,/17 FATAL ERROR RB(NZ) LOA:90 LDKL A4,BUF DRIVER BUFFER ADDRESS RTN A5 XIF * EJECT DRFD01 * ********** * * * UNLOAD * * * ********** * UNLOAD EQU * IFT IBM=1 * * DATA SET OPEN * CF A5,DSOPCH A1,AFFECTED ADK A7,0 SET CR (CHECK EOD) RF(Z) UNL:70 NOT OPEN ST A7,12,A8 STORE EOD-NO IN CONTROL WORD OF ECB * * READ DATA SET LABEL TO DRIVER BUFFER * CF A5,DSLIO PREPARE FOR I/O CF A5,FD:REA READ DATA SET LABEL CF A5,UNL:RC RETURN CODE CHECK ENB * * TRANSFORM RETURN CODE TO IBM SECTOR NO (EBCDIC-CODED) * CF A5,DSOPCH EOD-NO TO A7 * * DIVIDE EOD BY 26 * LDK A1,0 UNL:10 SUK A7,26 RF(N) UNL:20 ADK A1,1 RB UNL:10 * EJECT DRFD01 * * UNL:20 ADK A7,27 * * A1 = BINARY TRACK NO * A7 = SECTOR NO WITHIN TRACK (0-25) * CF A5,BINDEC TRANSFORM SEC.NO TO A3 LDKL A4,BUF+EOD+4 ADDRESS TO POS 79 SCR A3,A4 SUK A4,1 SRL A3,8 LEFT BYTE SCR A3,A4 STORE IN BUFFER LDR A7,A1 TRACK CF A5,BINDEC DEC EBCDIC-CODED IN A3 SUK A4,3 STR A3,A4 TRACK INTO BUF INH INHIBIT INTERRUPTS INHIBIT * * WRITE DATA SET LABEL * CF A5,DSLIO PREPARE FOR I/O ORK A2,5 PHYSICAL WRITE CF A5,FD:WRITE WRITE DATA SET LEBEL CF A5,UNL:RC CHECK RETURN CODE CF A5,DSOPCH CMR A2 INDICATE NOT OPEN * EJECT DRFD01 * * UNLOCK * XIF UNL:70 EQU * LDK A2,/C UNLOCK CF A5,FD:REA ANK A3,1 RB(NZ) LOA:80 NOT OPERABLE C1 A2,DWTA3,A6 INDEX MASK ANS A2,DWTLC,A6 INDICATE UNLOCK IN DWT RB LOA:80 END:IO * IFT IBM=1 * * UNLOAD RETURN CODE CHECK * UNL:RC EQU * ANKL A3,/207 RF(Z) RTN:A5 NO RETURN CODE ANKL A3,/200 RF(Z) RTN:A5 NOT WRITE PROTECTED CF A5,DSOPCH ADK A7,0 SET CR (CHECK EOD) RF(Z) RTN:A5 NOT OPEN LDK A3,/40 ORRS A3,A6 UPDATE TEMPORARY RETURN CODE RTN:A5 EQU * RTN A5 * EJECT DRFD01 * * IBMDSK EQU * IBM DISK HANDLING ENTRY IFT IBM=1 CF A15,NVLCHK CHECK IF NEW VOLUME LOADED ADK A1,0 ABL(NZ) END:IO NEW VOLUME LOADED CF A5,DSOPCH GET EOD ADK A7,0 SET CR (CHECK EOD) RF(Z) FD:DIS NOT OPEN, ERROR LC A1,DWTOR+1,A6 ORDER CODE SUK A1,49 RF(Z) REWIND REWIND FILE LD A3,ECBRL,A8 CHECK REQUESTED LENGTH SUK A3,SECLEN ABL(NZ) INCLEN INCORRECT LENGTH ADK A1,43 RF(Z) SQWRITE SEQUENTIAL WRITE ADK A1,4 RF(NZ) FD:DIS ERROR IF NOT SEQUENTIAL READ * EJECT DRFD01 * ******************* * SEQUENTIAL READ * ******************* * ADK A2,DWTCRN-DWTEOD A2 = ADDRESS TO CRN LDR* A3,A2 CRN ADK A3,1 CRN+1 ST A3,ECBCW2,A8 STORE CRN+1 IN ECB CWK A3,MAXIBM RF(P) FD:DIS REQUEST ERROR CWR A3,A7 RF(NL) SQR:10 END OF DATA LDK A4,0 BIO READ CF A5,BIOSQ CF A5,FD:REA READ SECTOR POINTED AT BY CRN+1 * IFT MMUPAG=0 LD A4,ECBBA,A8 USER BUFFER ADDRESS XIF * IFT IBM=1 LDK A7,SECLEN CF A5,ASCII TRANSFORM TO ASCII * EJECT DRFD01 * * IFT MMUPAG=1 TS -30,A15 SAVE RUNNING TASK'S MMU LD A7,DWTTAB,A6 TTAB ADDRESS TL TTB:MT,A7 LOAD MMU TABLE LDKL A1,BUF DRIVER BUFFER ADDRESS LD A2,DWTUEC,A6 USER ECB ADDRESS EL A2,ECBBA,A2 USER BUFFER ADDRESS LDK A7,SECLEN LENGTH MVSU A7 MOVE SECTOR TO USER BUFFER TL -30,A15 RESTORE MMU TABLE FROM STACK XIF * IFT IBM=1 LDK A1,DWTCRN CF A5,DSPAD RF SQW:10 UPDATE CRN * * END OF DATA * SQR:10 LDKL A1,/1000 RETURN CODE RF END:IO * EJECT DRFD01 * ******************* * SEQUENTIAL WRITE * ******************* * SQWRIT EQU * * * CHECK IF END OF EXTENT * LDK A1,DWTEOE CF A5,DSPAD EOE-NO ADDRESS TO A2 ST A7,ECBCW2,A8 STORE EOD IN ECB C. W. CWK A7,MAXIBM RF(P) FD:DIS REQUEST ERROR CWR* A7,A2 RF(G) ENDEOE END OF EXTENT * IFT MMUPAG=1 TS -30,A15 SAVE RUNNING TASK'S MMU LD A7,DWTTAB,A6 TTAB ADDRESS TL TTB:MT,A7 LOAD MMU TABLE LD A1,DWTUEC,A6 USER ECB ADDRESS EL A1,ECBBA,A1 USER BUFFER ADDRESS LDKL A2,BUF DRIVER BUFFER ADDRESS LDK A7,SECLEN LENGTH MVUS A7 MOVE SECTOR TO DRIVER BUFFER TL -30,A15 RESTORE MMU TABLE FROM STACK XIF * IFT IBM=1 LDK A4,5 BIO WRITE CF A5,BIOSQ LDK A7,SECLEN CF A5,EBCDIC TRANSFORM AND MOVE TO BUF * EJECT DRFD01 * * CF A5,FD:WRI ANKL A1,/200 RF(Z) SQW:05 LDK A1,/40 WRITE PROTECTED ORRS A1,A6 UPDATE TEMPORARY RETURN CODE SQW:05 EQU * CF A5,DSOPCH SQW:10 EQU * ANKL A3,/207 WRITE PROTECTED OR NOT OPERABLE RF(NZ) END:RC IMR A2 EOD=EOD+1 OR CRN=CRN+1 IN DWT LDK A2,SECLEN ST A2,ECBEL,A8 UPDATE EFFECTIVE LENGTH RF END:RC * FD:DIS EQU * ABL DISIOE REQUEST ERROR * EJECT DRFD01 * ********** * REWIND * ********** * REWIND EQU * LDR A3,A2 SAVE EOD ADDRESS LDK A1,DWTBOE CF A5,DSPAD LDR* A4,A2 BOE STR A4,A3 EOD = BOE LDK A1,DWTCRN CF A5,DSPAD SUK A4,1 BOE - 1 STR A4,A2 CRN = BOE -1 LDK A1,0 RETURN CODE RF END:IO XIF * EJECT DRFD01 * ***************** * * * PERFORM ORDER * * * ***************** * * * INPUT: A2 BIO CONTENTS * A3 NO OF BYTES TO BE TRANSFERED * A4 BUFFER ADDRESS * FD:WRI EQU * IFT CHAN=0 LDKL A1,/C000 WORDS,WRITE XIF IFT CHAN=1 LDK A1,0 INDICATOR WRITE MODE XIF RF FD:800 * FD:REA EQU * IFT CHAN=1 LDK A1,1 READ MODE XIF IFT CHAN=0 LDKL A1,/8000 WORDS READ XIF FD:800 EQU * IFT CHAN=0 SRL A3,1 FROM BYTES TO WORDS * EJECT DRFD01 * * IFT MMUPAG=1 LD A7,BUFFLG,A6 CHECK WHAT BUFFER TO READ TO RF(Z) FD:810 BUFFER IN SYSTEM AREA LD A7,DWT:BF,A6 BITS 0-1 IN 18-BIT ADDRESS ECR A7,A7 ORR A1,A7 FD:810 EQU * XIF * IFT CHAN=0 ORR A3,A1 WER1 WER A3,MUXADR FIRST WER WER2 WER A4,MUXADR+1 SECOND WER XIF IFT CHAN=1 * EJECT DRFD01 * * PUT BUFFER START AND END ADDRESS IN DWT * ST A1,DWTRW,A6 INDICATE MODE ST A4,DWTUB,A6 ADR A3,A4 ST A3,DWTUBE,A6 END ADDRESS+2 XIF ST A5,DWTA5,A6 SAVE STACK POINTER LD A3,PFPOST RF(NZ) T:DISP POST PROCESSING FLAG SET FD:CIO EQU * LABEL USED FOR CHANGE OF CUADR CIO A2,1,CUADR CIO START RF(3) END:30 DEVICE ADDRESS UNKNOWN RF T:DISP * EJECT DRFD01 * ************************************* * * FDMSIO - UPDATE PARAMETERS FOR MULTIPLE SECTOR IO * * * ************************************* * FDMSIO EQU * IM DWTCW2,A6 UPDATE SECTOR NUMBER LDR* A1,A6 RETURN CODE ANK A1,/7F GET ERROR RETURN CODE RF(NZ) END:RC LD A2,DWTSIO,A6 GET NUMBER OF SECTORS DONE ADS A2,DWTCW2,A6 UPDATE DWTCW2 LD A2,DWTRL,A6 ADS A2,ECBEL,A8 UPDATE ECBEL LD A3,DWTNOS,A6 RF(NP) END:RC LAST SECTOR DONE IFT MMUPAG=1 LD A4,DWTBA,A6 GET BUFFER POINTER ADR A2,A4 UPDATE BUFFER POINTER ST A2,DWTBA,A6 RF(N) FDMSI1 NOT PASSED 64K LIMIT ADK A4,0 RF(NN) FDMSI1 NOT PASSED 64K LIMIT LDK A2,/10 ADS A2,DWT:BF,A6 UPDATE BITS 0-1 FDMSI1 EQU * XIF * IFT MMUPAG=0 ADS A2,DWTBA,A6 UPDATE BUFFER POINTER XIF ABL FD:000 MORE SECTORS IN MULTIPLE SECTOR IO * EJECT DRFD01 * ********** * * * END:IO * * * ********** * IFT IBM=1 ENDEOE EQU * END OF EXTENT EXIT LDKL A1,/2000 RETURN CODE RF END:IO XIF * END:RC EQU * LDR* A1,A6 RETURN CODE END:IO EQU * CF A15,TENDIO T:DISP ABL TDISP * END:30 EQU * CU ADDRESS UNKNOWN LDK A1,1 NOT OPERABLE ST A1,DWTST,A6 INDICATE RECOVERY DONE RB END:IO EJECT DRFD01 * ******************** * * * RECOVERY ROUTINE * * * ******************** * FDON 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,DWFD01 DWT ADDRESS CM DWTST,A6 IM DWTA2,A6 SET FDON FLAG * EJECT * * DELAY 2 SEC * LD A4,DWTTP,A6 RF(Z) FDON10 NO TIMER SET LDKL A4,-TIME ST* A4,DWTTP,A6 RESTART TIMER RB T:DISP FDON10 LDK A4,DWTTP ADR A4,A6 LDR A1,A6 SAVE A6 CF A15,SETIMP DATA FDON20,TIME * F:DISP EQU * RB T:DISP * * TIME OUT ROUTINE * FDON20 LDR A6,A1 CM DWTTP,A6 LDKL A5,DWTSB2 ADR A5,A6 GET STACK BASE * FDONVL EQU * ENTRY USED BY READY INTERRUPT ROUTINE IFT MMUPAG=1 IFT CHAN=0 CM BUFFLG,A6 RESET BUFFER FLAG XIF * IFF TOSS+IBM=0 IM DWTST2,A6 SET RECOVERY/READY INT. INDICATOR LDK A3,3 4 VOLUMES * EJECT DRFD01 * * * READ VOLUME NAME * FDONLD EQU * SC A3,DWTOR,A6 GET VOLUME NAME LC A4,DIXTAB,A3 DRIVE INDEX MASK SC A4,DWTA3+1,A6 SAVE IT CF A5,SETCIO LDK A2,/14 CF A5,FD:REA LOCK ANK A3,1 RF(Z) FDON19 OPERABLE LDK A1,6 NOT OPERABLE CF A15,VOLCLR CLEAR VOLUME NAME RF FDON21 CONTINUE WITH NEXT DISC * FDON19 EQU * CF A5,VO:NAM LDKL A2,/FBFF RESET IBM IND. BIT ANRS A2,A6 UPDATE TEMPORARY RETURN CODE FDON21 EQU * LDK A2,/C CF A5,FD:REA UNLOCK LDK A3,0 LC A3,DWTOR,A6 GET INDEX FOR LAST VOL. SUK A3,1 RB(NN) FDONLD NEXT VOLUME CM DWTOR,A6 CM DWTST2,A6 INDICATE VOLUMES READ IM DWTST,A6 INDICATE VOLUME NAMES READ XIF * IFT OPCLOS=1 * EJECT * * TERMINATE WAIT REQUEST FOR OPEN ORDER IF RUNNING * LD A4,DWTTP2,A6 TIMER POINTER RF(Z) FDON09 NOT RUNNING CMR A4 STOP TIMER CM DWTTP2,A6 INDICATE NO TIMER FDON09 EQU * * * OPEN FD TO MAKE FOLLOWING LOCK ORDER POSSIBLE * LDKL A4,SPDLCI OPEN/CLOSE STATUS WORD ADDRESS LDKL A2,/8000 OPEN/CLOSE BIT MASK ANR* A2,A4 A2:=OPEN/CLOSE FLAG ORS A2,DWTOCF,A6 SAVE XRRS A2,A4 SET STATUS WORD TO OPEN LDR* A2,A4 OTR A2,0,SOPDA SET DRIVE TO OPEN * FDON23 EQU * XIF * EJECT * * LOCK DOORS * LDK A2,1 FDON25 EQU * LD A1,DWTLC,A6 LOCK INDICATOR ANR A1,A2 RF(Z) FDON30 NOT LOCKED ST A2,DWTA3,A6 SAVE * EJECT * * PUT DRIVE NO IN CIO INSTR * SRN A2,A3 DRIVE NO IN A3 CF A5,SETCIO PUT DRVE NO IN CIO-INSTR LDK A2,/14 LOCK CF A5,FD:REA LD A2,DWTA3,A6 DRIVE IND. ANK A3,1 RF(Z) FDON30 OK XRS A2,DWTLC,A6 INDICATE UNLOCK FDON30 EQU * SLL A2,1 CWK A2,/0010 RB(NE) FDON25 * IFT OPCLOS=1 * * RESTORE OPEN/CLOSE STATUS TO SAME VALUE AS BEFORE POWER OFF * LD A2,DWTOCF,A6 OPEN/CLOSE FLAG ORS A2,SPDLCI TO STATUS WORD CM DWTOCF,A6 CLEAR FLAG LD A2,SPDLCI OPEN/CLOSE STATUS OTR A2,0,SOPDA CLOSE DRIVE IF IT WAS CLOSED XIF * EJECT * * ANY REQUEST * CM DWTA2,A6 RESET FDON FLAG FDON60 EQU * LD A8,DWTECB,A6 ABL(Z) END:IO NO REQUEST, RETURN VIA TENDIO * * RETRY REQUEST * IM DWTRTY,A6 INDICATE RETRY LD A7,DWTORD,A6 ST A7,DWTOR,A6 RESTORE INDEX AND ORDER CM ECBEL,A8 RESET EFFECTIVE LENGTH ANK A7,/3F ORDER ABL FDAD REACTIVATE * EJECT DRFD01 * ******************** * * * READY INTERRUPT * * * ******************** * FDRE EQU * LD A2,DWTA2,A6 RB(NZ) F:DISP POWER ON ROUTINE ACTIVE LDKL A5,DWTSB2 ADR A5,A6 STACK BASE * IFT TOSS+IBM=0 RB FDON60 XIF * IFF TOSS+IBM=0 CM DWTST,A6 SET UNIT BUSY RB FDONVL READ VOLUME NAMES XIF * EJECT DRFD01 * ********************* * * * INTERRUPT HANDLER * * * ********************* * IHFD EQU * ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE REGISTERS ON STACK XIF * IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * LDKL A6,DWFD01 DWT ADDRESS IFT CHAN=1 ENB LD A1,DWTUB,A6 GET BUFFER POINTER LD A2,DWTUBE,A6 END OF BUFFER SUR A2,A1 LENGTH IH005 EQU * SST A3,CUADR GET STATUS RF(A) IH:000 READY INTERRUPT LD A3,PFPOST RF(NZ) IHDISP POST PROCESSING FLAG SET LD A3,DWTRW,A6 READ/WRITE INDICATOR RF(NZ) IH050 READ * EJECT DRFD01 * * IH010 EQU * LDR* A3,A1 ONE WORD FROM BUFFER OTR A3,0,CUADR WRITE RB(NA) IH005 ADK A1,2 UPDATE BUFFER POINTER SUK A2,2 RB(P) IH010 CIO A2,0,CUADR CIO HALT IHDISP EQU * ABL TDISP GOTO DISPATCHER * IH050 EQU * INR A3,0,CUADR READ RB(NA) IH005 STR A3,A1 ONE WORD TO BUFFER ADK A1,2 UPDATE BUFFER POINTER SUK A2,2 RB(P) IH050 CIO A2,0,CUADR CIO HALT SST A3,CUADR STATUS RB(NA) *-2 IH:000 EQU * INH XIF * EJECT DRFD01 * * IFT CHAN=0 SST A3,CUADR STATUS XIF LD A8,DWTECB,A6 ECB ADDRESS LD A5,DWTA5,A6 STACK POINTER LDR A2,A3 STATUS SLL A2,1 RB(N) FDRE READY INTERRUPT LD A2,DWTRTY,A6 RETRY RF(Z) IH:10 NO CM DWTRTY,A6 RESET RETRY FLAG LDR A1,A3 ANK A1,5 DATA FAULT, NOT OPERABLE RF(Z) IH:10 RETURN CODE OK ORK A3,4 IH:10 EQU * * EJECT DRFD01 * * TRANSFORM RETURN CODE, CU - ECB * ANKL A3,/FF37 RF(Z) IH:80 LDR A1,A3 ANKL A3,/0A05 UNCHANGED BITS ECR A4,A3 ANK A4,8 CHECK IF NO DATA RF(Z) IH:70 NOT NO DATA ORK A3,4 SET BIT 13 ALSO IH:70 EQU * LDR A4,A1 ANKL A4,/0400 BIT 5 SLC A4,7 TO BIT 14 ORR A3,A4 * IFT TOSS+IBM=0 LDR A4,A1 ANKL A4,/2000 BIT 2 SLL A4,1 TO BIT 1 ORR A3,A4 XIF * LDR A4,A1 ANK A4,/20 BIT 10 SLL A4,3 TO BIT 7 ORR A3,A4 ANK A1,/10 BIT 11 SRC A1,5 TO BIT 0 ORR A3,A1 ORRS A3,A6 UPDATE TEMPORARY RETURN CODE ANKL A3,/F7FF IH:80 EQU * LDR A1,A3 RTN A5 * EJECT DRFD01 * ******************************************* * * * S U B R O U T I N E S * * * ******************************************* * ******* * * * BIO * * * ******* * * INPUT: A8 ECB ADDRESS * A4 ORDER * * OUTPUT: A2 BITS 0-12 OF CONTROL WORD USED BY CIO START * A3 NO OF BYTES TO BE TRANSFERED * A4 BUFFER ADDRESS * BIO EQU * LD A1,DWTCW2,A6 GET SECTOR NUMBER SLL A1,3 PUT IN RIGHT BIO POSITION LD A2,DWTSIO,A6 GET NUMBER OF SECTORS IN THIS IO SRC A2,2 ORR A2,A1 COMPLETE BIO ADR A2,A4 COMPLETE BIO WITH ORDER LD A4,DWTBA,A6 BUFFER ADDRESS LD A3,DWTRL,A6 GET REQ. LENGTH RTN A5 * EJECT DRFD01 * * ***************** * * * BIOSQ * * * ***************** * * INPUT: A8 ECB ADDRESS * A4 ORDER * * OUTPUT: A2 BITS 0-12 OF CONTROL WORD USED BY CIO START * A3 NO OF BYTES TO BE TRANSFERED * A4 BUFFER ADDRESS * BIOSQ EQU * IFT IBM=1 LD A2,ECBCW2,A8 GET SECTOR NUMBER SLL A2,3 PUT IN RIGHT BIO POSITION ADR A2,A4 COMPLETE BIO WITH ORDER * IFT MMUPAG=0 LD A4,ECBBA,A8 GET BUFFER ADDRESS XIF * IFT IBM=1 IFT MMUPAG=1 LDKL A4,BUF DRIVER BUFFER ADDRESS XIF * IFT IBM=1 LDK A3,SECLEN REQUESTED LENGTH RTN A5 XIF * EJECT DRFD01 * ****************** * VO:NAM * ****************** * * VO:NAM EQU * IFT TOSS+IBM=2 LDK A3,36 LENGTH XIF * IFT TOSS=1 IFT IBM=0 LDK A3,6 VOLUME NAME LENGTH XIF * IFT TOSS=1 LDK A2,0 BIO LDKL A4,BUF READ TO BUFFER CF A5,FD:REA ANK A3,/17 FATAL ERROR RF(NZ) VOL:40 IFT IBM=1 LD A2,BUF+32 CWK A2,'TO' RF(NE) VOL:10 IBM DISC LD A2,BUF+34 GET NEXT WORD CWK A2,'SS' RF(NZ) VOL:10 IBM DISC C1 A1,DWTA3,A6 DRIVE BIT MASK ANS A1,DWTLAB,A6 INDICATE TOSS DISC XIF * EJECT DRFD01 * * IFT TOSS=1 LDKL A2,BUF IFT IBM=1 RF VOL:20 XIF * IFT IBM=1 VOL:10 EQU * LDK A3,10 LENGTH LDK A2,/30 BIO LDKL A4,BUF READ TO BUFFER CF A5,FD:REA CF A5,LD:RC LD A1,DWTA3,A6 DRIVE NO BIT MASK ORS A1,DWTLAB,A6 INDICATE IBM LDKL A1,/400 ORRS A1,A6 UPDATE TEMPORARY RETURN CODE LDK A7,10 NO OF CHARACTERS CF A5,ASCII TRANSFER IBM VOLUME NAME TO ASCII LDKL A2,BUF+4 START ADDRESS OF VOLUME NAME XIF * EJECT DRFD01 * * VOL:20 EQU * IFF TOSS+IBM=0 LDK A3,/F8 FILE CODE LD A1,DWTST2,A6 RF(NZ) VOL:30 NOT TEST STATUS ORKL A3,/8000 INDICATE NO NEW NVL SET VOL:30 EQU * CF A15,VOLGET VOLUME NAME TO DWT SET NVL LD A8,DWTECB,A6 LDK A3,0 VOL:40 EQU * RTN A5 XIF * IFT IBM=1 EJECT DRFD01 * ********* * ASCII * ********* * * FUNCTION: ASCII TRANSFORMS A STRING FROM EBCDIC TO * ASCII CODE * INPUT STRING ADDRESS IS BUF * INPUT: A7 NO OF CHARACTERS * A4 = BUFFER ADDRESS * OUTPUT: A1 CHANGED * A4 = BUFFER ADDRESS * A7 CHANGED * ASCII EQU * IFT MMUPAG=1 LDKL A4,BUF DRIVER BUFFER ADDRESS XIF * IFT IBM=1 ENB ADR A4,A7 ASC:10 EQU * SUK A4,1 LCR A1,A4 EBCDIC CHARACTER ANK A1,/FF LC A1,TASCII,A1 TRANSFORM TO ASCII SCR A1,A4 PUT ASCII CHAR. IN OUTPUT BUFFER SUK A7,1 RB(P) ASC:10 RF EBC:90 * EJECT DRFD01 * ********** * EBCDIC * ********** * * FUNCTION: EBCDIC TRANSFORMES A STRING FROM ASCII TO * EBCDIC CODE * OUTPUT STRING IS PUT IN DRIVER BUFFER * * INPUT: A7 NO OF CHARACTERS * A4 = BUFFER ADDRESS * * OUTPUT: A1 CHANGED * A4 = BUFFER ADDRESS * A7 CHANGED EBCDIC EQU * ENB IFT MMUPAG=1 LDKL A4,BUF DRIVER BUFFER ADDRESS XIF * IFT IBM=1 ADR A4,A7 EBC:10 EQU * SUK A4,1 LCR A1,A4 GET ASCII CHAR. ANK A1,/FF LC A1,TEBCDIC,A1 SC A1,BUF-1,A7 SUK A7,1 RB(P) EBC:10 LDKL A4,BUF DRIVER BUFFER ADDRESS EBC:90 EQU * INH INHIBIT INTERRUPTS RTN A5 * EJECT DRFD01 * ********** * LOGSEC * ********* * * FUNCTION: LOGSEC TRANSFORMS PHYSICAL SECTOR TO STANDARD * LOGICAL SECTOR (BINARY). * FORMAT OF PHYS. SEC. TT0SS (EBCDIC CODE) * TT = TRACK, SS=SECTOR * * INPUT: A4 ADDRESS TO PHYS. SECTOR * * OUTPUT: A3 BINARY SECTOR NO * A4 ADDRESS TO PHYS. SEC. + 4 * LOGSEC EQU * CF A5,DECBIN LDR A3,A1 SAVE ADK A4,2 * * MULTIPLY BY 26 * SLL A3,5 *32 LDR A2,A1 SLL A2,2 SUR A3,A2 *28 SLL A1,1 SUR A3,A1 *26 CF A5,DECBIN SUK A1,1 ADR A3,A1 * EJECT DRFD01 * * CHECK SECTOR NO * LDR A1,A3 SUK A1,25 RF(NP) LOG:10 CWK A4,BUF+EOD+4 EOD RF(E) LOG:02 YES! SUKL A1,1898 RF LOG:04 * * CHECK EOD LESS/EQUAL 74001 * LOG:02 SUKL A1,1899 LOG:04 EQU * RF(P) LOG:10 NOT ACC SEC. NO SUK A4,4 RESET BUFFER POINTER RTN A5 * * FATAL ERROR * LOG:05 ADK A5,4 ADJUST STACK POINTER LOG:10 LDK A1,/10 RETURN CODE ORRS A1,A6 UPDATE TEMPORARY RETURN CODE INH INHIBIT INTERRUPTS ABL LOA:90 ERROR ROUTINE * EJECT DRFD01 * ********** * DECBIN* ********** * * FUNCTION: DECBIN TRANSFORMS TWO EBCDIC CODED DIGITS TO * BINARY. RANGE OF EBCDIC CODE /F0 - /F9 IS CHECKED * INPUT: A4 ADDRESS TO FIRST DIGIT * OUTPUT: A1 BINARY * WORKING REG: A2,A7 * DECBIN LDK A1,0 LDK A7,2 DEC:10 LCR A2,A4 DIGIT ANK A2,/FF SUK A2,/F0 RB(N) LOG:05 SUK A2,9 RB(P) LOG:05 NOT DIGIT ADK A2,9 SUK A7,1 RF(Z) DEC:30 ADK A4,1 ADDRESS TO SECOND DIGIT DEC:20 SUK A2,1 RB(N) DEC:10 NEXT DIGIT ADK A1,/A MULTIPLY BY 10 RB DEC:20 DEC:30 ADR A1,A2 RTN A5 XIF * EJECT DRFD01 * ********** * SETCIO * ********** * * FUNCTION: PUT DRIVE NO IN CIO INSTRUCTION * * INPUT: A3 DRIVE NO , (BITS 0-13 MUST BE ZEROES * * OUTPUT: A3 CHANGED * A4 CHANGED * SETCIO LDKL A4,/FFCF ANS A4,FD:CIO SLL A3,4 ORS A3,FD:CIO RTN A5 IFT IBM=1 * EJECT DRFD01 * ********** * BINDEC * ********** * * FUNCTION: BINDEC TRANSFORMS A BINARY NUMBER TO TWO * EBCDIC-CODED DIGITS (DECIMAL) * * INPUT: A7 BINARY NUMBER * * OUTPUT: A3 EBCDIC CODED DECIMAL DIGITS * A7 CHANGED * BINDEC LDK A3,0 BIN:10 SUK A7,10 RF(N) BIN:20 ADK A3,1 RB BIN:10 BIN:20 ADK A7,10 SLL A3,8 ORR A3,A7 DECIMAL CONVERTED NO IN A3 ORKL A3,/F0F0 EBCDIC CODED RTN A5 * EJECT DRFD01 ********* * DSLIO * ********* * * FUNCTION: PREPARE FOR READING DATA SET LABEL * * INPUT: A6 DWT ADDRESS * * OUTPUT: A2 BITS 0-12 SECTOR NO, BITS 13-15 ZEROES * A3 128 * A4 DRIVER BUFFER ADDRESS * A6 DWT ADDRESS * A1 IS CHANGED * DSLIO LDK A1,DWTDSS CF A5,DSPAD LDR* A2,A2 SLL A2,3 LDK A3,128 LDKL A4,BUF RTN A5 * EJECT DRFD01 * ********** * DSOPCH * ********** * * FUNCTION: GET EOD-NO AND EOD-NO ADDRESS IN DWT * * INPUT: A6 DWT ADDRESS * * OUTPUT: A2 EOD ADDRESS * A7 EOD-NO (0=NOT OPEN) * A1 CHANGED DSOPCH LDK A1,DWTEOD CF A5,DSPAD LDR* A7,A2 EOD-NO RTN A5 * EJECT DRFD01 * ********* * DSPAD * ********* * * FUNCTION: GET ABSOLUTE ADDRESS OF SPECIFIED * TYPE OF DATA FOR CORRESPONDING DRIVE * * INPUT: A1 DWT OFFSET * A6 DWT ADDRESS * * OUTPUT: A2 ADDRESS TO DATA * A6 DWT ADDRESS * DSPAD LC A2,DWTOR,A6 DRIVE NO ANK A2,/3 ADR A2,A2 ADR A2,A6 ADR A2,A1 RTN A5 * EJECT DRFD01 * ********* * STDWT * ********* * * FUNCTION: STORE INPUT WORD IN DWT-AREA DEPENDING OF * DRIVE NO * * INPUT: A1 OFFSET TO DWT AREA * A3 WORD TO BE STORED IN DWT * A6 DWT ADDRESS * * OUTPUT: A1 UNCHANGED * A2 ADDRESS TO WORD IN DWT AREA * A3 UNCHANGED * A6 UNCHANGED * STDWT EQU * CF A5,DSPAD STR A3,A2 RTN A5 XIF * EJECT DRFD01 * * D R I V E R B U F F E R * BUF EQU * IFT IBM=1 RES DVBLEN XIF * IFT TOSS=1 IFT IBM=0 DATA 0,0,0 VOLUME NAME BUFFER IFT MMUPAG+CHAN=2 RES DVBLEN-3 MMU BUFFER XIF * IFT TOSS+IBM=0 IFT MMUPAG+CHAN=2 RES DVBLEN MMU BUFFER XIF * EJECT DRFD01 * ********************* * * * DEVICE WORK TABLE * * * ********************* * DWFD01 EQU * DWTRCW EQU *-DWFD01 TEMP RETURN CODE DATA 0 DATA /8000 DWT STATUS DATA 0 ECB ADDRESS DATA 0 ORDER DATA FDADR 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 DEVECB MMU ECB ADDRESS XIF * DWTA3 EQU *-DWFD01 DATA 0 DATA 0 SAVE AREA DATA 0 DATA 0 DATA 0,0,0,0 STACK (3 LEVELS) DATA 0 ORDER SAVE AREA * EJECT DRFD01 * * IFF TOSS+IBM=0 DATA /8000 NVL INDICATOR 0 DATA /8000 NVL INDICATOR 1 DATA /8000 NVL INDICATOR 2 DATA /8000 NVL INDICATOR 3 DWTVO0 EQU *-DWFD01 VOLUME NAME NO 0 DATA /FFFF,/FFFF,/FFFF DWTVO1 EQU *-DWFD01 VOLUME NAME NO 1 DATA /FFFF,/FFFF,/FFFF DWTVO2 EQU *-DWFD01 VOLUME NAME NO 2 DATA /FFFF,/FFFF,/FFFF DWTVO3 EQU *-DWFD01 VOLUME NAME NO 3 DATA /FFFF,/FFFF,/FFFF DWTST2 EQU *-DWFD01 SAVE STATUS WORD DATA 0 XIF DWTA5 EQU *-DWFD01 DATA 0 DWTRTY EQU *-DWFD01 RETRY REQUEST FLAG DATA 0 DWTTP EQU *-DWFD01 TIMER POINTER DATA 0 * EJECT DRFD01 * * IFT IBM=1 DWTLAB EQU *-DWFD01 DISC LABEL INDICATOR DATA 0 XIF * DWTLC EQU *-DWFD01 DRIVE LOCK INDICATOR DATA 0 * IFT OPCLOS=1 DWTTP2 EQU *-DWFD01 TIMER POINTER FOR OPEN DATA 0 DWTOCF EQU *-DWFD01 OPEN/CLOSE FLAG AT POWER ON DATA 0 XIF * EJECT DRFD01 * * IFT CHAN=1 DWTUB EQU *-DWFD01 POINTER AT NEXT WORD IN BUFFER DATA 0 DWTUBE EQU *-DWFD01 BUFFER END ADDRESS+2 DATA 0 DWTRW EQU *-DWFD01 READ/WRITE INDICATOR DATA 0 XIF * IFT IBM=1 DWTBOE EQU *-DWFD01 BEGINNING OF EXTENT DATA 0,0,0,0 DWTEOD EQU *-DWFD01 END OF DATA DATA 0,0,0,0 DWTEOE EQU *-DWFD01 END OF EXTENT DATA 0,0,0,0 DWTCRN EQU *-DWFD01 CURRENT RECORD NO DATA 0,0,0,0 DWTDSS EQU *-DWFD01 DATA SET LABEL SECTOR DATA 0,0,0,0 XIF * EJECT DRFD01 * * DWTBA EQU *-DWFD01 BUFFER POINTER DATA 0 DWTRL EQU *-DWFD01 LENGTH IN SUB IO DATA 0 DWTCW2 EQU *-DWFD01 SECTOR NUMBER DATA 0 DWTNOS EQU *-DWFD01 SECTOR NUMBER COUNTER DATA 0 DWTSIO EQU *-DWFD01 NUMBER OF SECTORS IN SUB IO DATA 0 * IFT IBM+TOSS=2 DWTFIB EQU *-DWFD01 IBM INDICATOR DATA 0 XIF * EJECT DRFD01 * * IFT MMUPAG=1 DWT:BF EQU *-DWFD01 DATA 0 SAVE AREA BUFFER ADDRESS BUFFLG EQU *-DWFD01 DATA 0 * IFF CHAN+IBM=0 DWT:PA EQU *-DWFD01 DATA 0 6 BIT PHYSICAL BUFFER ADDRESS DATA 0 SECOND MMU ENTRY * DWT:LA EQU *-DWFD01 DATA 0 16 BIT LOGICAL BUFFER ADDRESS XIF * IFT MMUPAG=1 DEVECB EQU * DATA 0,0,0,0,0,0,0 XIF * * * END