.MCALL .MODULE .MODULE FMTDU,VERSION=15,COMMENT=,IDENT=NO ; Copyright (c) 1998 by Mentec, Inc., Nashua, NH. ; All rights reserved ; ; This software is furnished under a license for use only on a ; single computer system and may be copied only with the ; inclusion of the above copyright notice. This software, or ; any other copies thereof, may not be provided or otherwise ; made available to any other person except for use on such ; system and to one who agrees to these license terms. Title ; to and ownership of the software shall at all times remain ; in Mentec, Inc. ; ; The information in this document is subject to change without ; notice and should not be construed as a commitment by Digital ; Equipment Corporation, or Mentec, Inc. ; ; Digital and Mentec assume no responsibility for the use or ; reliability of its software on equipment which is not supplied ; by Digital or Mentec, and listed in the Software Product ; Description. ; ; Edit Who Date Description of modification ; ---- --- ---- --------------------------- ; 001 WLD 28-MAY-1991 Add support for MSCP controller ; model number 30. ;RQZX1 ; 002 WLD 20-MAR-92 Implement OP.FMT for the RQZX1 ; while retaining OP.SP8 support ; for the RQDX3. ; 003 Tim Shoppa Fixes for Andromeda ; 12-JAN-98 Don't pay attention to GUS STS ; Add "/S" qualifier for RX50 format ;-- ; ; AUTHOR: JONATHAN P. HARRIS 5-DEC-77 V01-00 ; ; MODIFIED: BARBARA DOERRE 7-NOV-78 V01-01 ; AUTHOR: GEORGE T. STEVENS 20-OCT-86 V01-00 ; ; MACROS MODIFIED AND ADDED TO SUPPORT VERIFIFICATION FUNCTIONALITY AND ; TO OVERLAY FORMAT ROUTINES ; ; 1)MODIFIED DEVIC$ AND ENTRY$ MACROS ; 2)ADDED LDPT$ MACRO ; ; ; TO ADD A DEVICE: ; ; 1) INVOKE DEVIC$ MACRO IN MODULE FMTDEV.MAC FOR THE DEVICE ; 2) CREATE A FILE FMTXX.MAC (XX=DEVICE MNEMONIC) CONTAINING THE FOLLOWING ; IN THE SPECIFIED ORDER ; A. MACRO PREFIX FILE ; B. INVOKE LDPT$ MACRO FOR DEVICE ; C. DEVICE CHECK ROUTINE ; D. INVOKE OPTN$ MACRO (OPTIONAL) ; E. INVOKE ENTRY$ MACRO ; F. FORMAT ROUTINE (IF ONE EXISTS) ;- ;+ ; DEVIC$ - USED TO SET UP EACH FORMATTING OVERLAY ; ; THIS MACRO CREATES THE DEVICE TABLE ENTRY FOR THE DEVICE. ; IT SHOULD BE PLACED IN THE FMTDEV.MAC MODULE. ; A ROUTINE FOR DEVICE XX WILL HAVE DEVICE TABLE ENTRIES CREATED ; FOR IT. ; ; THE MACRO HAS THREE PARAMETERS, THE TWO LETTER DEVICE MNEMONIC, ; THE DEVICE ID NUMBER AS RETURNED BY .DSTATUS, AND FMTRT, A 'Y' OR 'N' ; TO INDICATE WHETHER A FORMATTING ROUTINE EXISTS FOR THIS DEVICE. ; ; **THIS MACRO IS NOT TO BE INVOKED IN THE ROOT OR FORMAT OVERLAYS** ; ; TO INVOKE IT, TYPE: ; ; DEVIC$ XX,IDNUM,FMTRT ; ; WHERE XX IS THE DEVICE MNEMONIC, IDNUM IS THE .DSTATUS NUMBER ; AND FMTRT IS A 'Y' OR 'N' TO INDICATE WHETHER A FORMAT ROUTINE ; EXISTS FOR THIS DEVICE. ; ; EXAMPLES: ; DEVIC$ RK,0,Y ;DOES SETUP FOR RK05 ; DEVIC$ DM,23,Y ;DOES SETUP FOR RK06/7 ; DEVIC$ DX,22,N ;DOES SETUP FOR RX01 ;- ; ; SYMBOLIC DEFINITIONS FOR DEVICE TABLE ; ;SYMBOL MEANING ;------ ------- ;OFFSETS INTO DEVICE TABLE ENTRY: RADNAM=0 ; RAD50 DEVICE NAME DEVTYP=2 ; .DSTATUS DEVICE ID NUMBER ASCNAM=4 ; ASCII DEVICE NAME OPVAL=6 ; POINTER TO LIST OF VALID OPTIONS LOADPT=8. ; LOAD ENTRY POINT ENTRY=10. ; ENTRY POINT TO ROUTINE END=12. ; END POINT OF ROUTINE ;BD1+ DEVCHK=14. ; DEVICE CHECK ROUTINE ENTRY POINT CHAR=16. ; DEVICE CHARACTERISTICS RTDVSZ=1 ; SPFUN RETURNS DEVICE SIZE SPFIO=2 ; SPFUN READS/WRITES BFSZP1=4 ; BUFFER SIZE PLUS 1 FOR R/W ;BD1- DVENSZ=18. ;SIZE OF EACH ENTRY IN DEVICE TABLE ; .MACRO DEVIC$ NAME,IDNUM,FMTRT,CHARDV .PSECT $DV,RO,D,GBL .GLOBL $'NAME'TAB,$'NAME'END,$'NAME'DCK,NAME'LD .IIF IDN Y,FMTRT .GLOBL $'NAME'FMT .RAD50 /NAME/ .WORD IDNUM .ASCII /NAME/ .WORD $'NAME'TAB .WORD NAME'LD .IF IDN Y,FMTRT .WORD $'NAME'FMT .IFF .WORD 0 .ENDC .WORD $'NAME'END .WORD $'NAME'DCK .WORD CHARDV .PSECT .ENDM ;+ ; LDPT$ - THIS MACRO CREATES THE NECESSARY LOAD POINTS AND POINTERS ; TO THE LIST OF OPTIONS FOR THE DEVICE. ; A DEVICE WILL HAVE THE FOLLOWING CREATED FOR IT: ; 1) POINTER TO LIST OF VALID OPTIONS FOR THIS DEVICE ; 2) LOAD POINT FOR OVERLAY ; 3) DEVICE CHECK ROUTINE ENTRY POINT ; 4) PATCH SPACE ; ; A SHORT DEVICE CHECK ROUTINE SHOULD FOLLOW ; A CALL TO THIS MACRO OF THE FORM: ; IF (DEVICE NOT READY OR WRITE LOCKED) THEN SEC ; ELSE CLC ; THE UNIT NUMBER OF THE DEVICE TO BE TESTED IS PASSED IN R1. ; ; **THIS MACRO IS NOT TO BE USED IN THE ROOT** ; ; ; TO INVOKE IT, TYPE: ; ; LDPT$ NAME ; ; WHERE 'NAME' IS THE TWO LETTER DEVICE MNEMONIC. ; ; EXAMPLES: LDPT$ RK ;FOR RK05 ; LDPT$ DM ;FOR RK06/07 ; ;- .MACRO LDPT$ NAME .PSECT PATCH,RW,I .BLKW 32. .PSECT $OP,RW,D,GBL $'NAME'TAB:: .PSECT DATA,RW,D .PSECT PUREDATA,RO,D .PSECT NAME,I,RW NAME'LD:: RTS PC .PSECT NAME'END,RO,D $'NAME'END:: .PSECT NAME,I,RW $'NAME'DCK:: .ENDM ;+ ; OPTN$ - USED TO GENERATE THE 8 BYTE OPTION TABLE ENTRY THAT DEFINES AN OPTION. ; ; THIS MACRO ALLOWS EACH FORMATTING ROUTINE TO SPECIFY THE OPTIONS ; IT WILL NEED. THE OPTIONS SO SPECIFIED BECOME KNOWN TO THE ROOT ; AT LINK TIME, THUS THERE IS NO NEED TO MODIFY THE ROOT TO ADD AN ; OPTION TO THE PROGRAM. ; ; THERE CAN BE ANY NUMBER OF OPTIONS IN THE TABLE. THE TABLE IS ; TERMINATED WITH A .WORD 0 (AUTOMATICALLY HANDLED BY ENTRY$ MACRO). ; TO USE THE MACRO WITHIN A FORMATTING ROUTINE, PLACE IT AT THE ; BEGINNING OF THE ROUTINE IMMEDIATELY FOLLOWING THE DEVIC$ CALL. ; WITHIN THE ROOT, PLACE THE MACRO FOLLOWING EXISTING INVOCATIONS OF OPTN$. ; THE MACRO HAS TWO PARAMETERS: OPTION, THE ASCII OPTION, AND ; ACCEPT, A 'Y' OR 'N' TO INDICATE WHETHER THE OPTION WILL ACCEPT ; A VALUE. ; ; TO ACCESS THE INFORMATION IN THE TABLE, THE FOLLOWING SYMBOLS ARE ; PROVIDED WITH EACH OPTION '?': ; GIV.? = 1 IF USER SPECIFIED THAT OPTION WITH A VALUE, ; = 0 IF USER DIDN'T SPECIFY OPTION ; = -1 IF USER SPECIFIED OPTION WITHOUT A VALUE ; VAL.? VALUE GIVEN WITH OPTION ? (IF A VALUE WAS GIVEN) ; (ONLY PROVIDED IF OPTION ACCEPTS A VALUE) ; ; TO INVOKE OPTN$, TYPE ; ; OPTN$ OPTION,ACCEPT ; ; EXAMPLES: ; OPTN$ S,Y - SETS UP OPTION "S" THAT ACCEPTS A VALUE ; OPTN$ Q,N - SETS UP OPTION "Q" WHICH DOES NOT ACCEPT ; A VALUE ; ; ; EACH ENTRY CONSISTS OF: ; ; +--------+--------+ ; ! VALLOW ! OPTION ! ; +--------+--------+ ; ! RES. ! GIVEN ! ; +--------+--------+ ; ! VALUE ! ; +--------+--------+ ; ; WHERE: ; OPTION (1 BYTE) IS THE ASCII OPTION ; VALLOW (1 BYTE) IS: ; 1 - IF OPTION WILL ACCEPT A VALUE ; 0 - IF NOT ; GIVEN (1 BYTE) IS: ; 1 - IF OPTION SPECIFIED WITH A VALUE ; 0 - IF OPTION NOT SPECIFIED ; -1 - IF OPTION SPECIFIED WITHOUT A VALUE ; RES. (1 BYTE) IS RESERVED FOR FUTURE USE ; VALUE (1 WORD) IS THE VALUE GIVEN WITH OPTION ( IF ALLOWED) ;- ; ; SYMBOLIC DEFINITONS FOR OPTION TABLE ; ;SYMBOL MEANING ;----- ------- OPT=0 ;OFFSETS INTO AN OPTION ENTRY: ASCII OPTION VALLOW=1 ; ALLOW A VALUE? GIVEN=2 ; OPTION GIVEN? VALUE=4 ; VALUE GIVEN OPENSZ=6 ;SIZE OF EACH OPTION TABLE ENTRY IN BYTES ; .MACRO OPTN$ OP,ACCEPT .PSECT $OP,RW,D,GBL .BYTE ''OP .IF IDN Y,ACCEPT .BYTE 1 .IFF .BYTE 0 .IFTF GIV.'OP: .BYTE 0 .BYTE 0 .IFT VAL.'OP: .WORD 0 .IFF .WORD 0 .ENDC .PSECT .ENDM ;+ ; ENTRY$ - THIS MACRO CREATES THE NECESSARY ENTRY POINT AND .PSECT ; FOR THE FORMATTING ROUTINE.IT ALSO CLOSES OFF THE OPTION TABLE ; WITH A 0. ; ; **THIS MACRO IS NOT TO BE USED IN THE ROOT** ; ; TO INVOKE IT, TYPE: ; ; ENTRY$ NAME ; ; WHERE 'NAME' IS THE TWO LETTER DEVICE MNEMONIC. ; ; EXAMPLES: ENTRY$ RK ;FOR RK05 ; ENTRY$ DM ;FOR RK06/07 ; ;- .MACRO ENTRY$ NAME .PSECT $OP,RW,D,GBL .WORD 0 .PSECT NAME,I,RW $'NAME'FMT:: .ENDM .SBTTL RX33 FORMATTING ROUTINE ; LOCAL SYMBOLS ; ; COMMAND MESSAGE OFFSETS P.CRF= 0 ; 4 Command reference number P.UNIT= 4 ; 2 Unit number P.OPCD= 10 ; 1 Opcode ; MSCP OPCODES OP.SCC= 04 ; SET CONTROLLER CHARACTERISTICS Command OP.ONL= 11 ; ONLINE Command OP.GUS= 03 ; GET UNIT STATUS Command OP.AVL= 10 ; AVAILABLE Command OP.FMT= 24. ; FORMAT Command ;RQZX1 OP.SP8= 47. ; FORMAT Command for the RQDX3 ;RQZX1 P.MOD= 12 ; 2 Modifiers P.BCNT= 14 ; 4 Byte count P.BUFF= 20 ; 12 Buffer descriptor P.LBN= 34 ; 4 Logical block number ; ONLINE Command Message Offsets P.UNFL= 16 ; 2 Unit flags P.DVPM= 34 ; 4 Device dependent parameters P.SHUN= 40 ; 2 Shadow unit P.CPSP= 42 ; 2 Copy speed ; ONLINE Command Modifiers MD.IFM= 02 ; Ignore Media Format Errors ;RQZX1 ; SET CONTROLLER CHARACTERISTICS Command Message Offsets P.VRSN= 14 ; 2 MSCP version P.CNTF= 16 ; 2 Controller flags P.HTMO= 20 ; 2 Host timeout P.TIME= 24 ; 8 Quad-word time and date ; FORMAT Command Message Offsets P.FMTI= 34 ; 4 Format information ; END MESSAGE OFFSETS P.CRF= 0 ; 4 Command reference number P.UNIT= 4 ; 2 Unit number P.OPCD= 10 ; 1 Opcode ; MSCP OPCODES OP.END= 200 ; End message flag P.FLGS= 11 ; 1 End message flags P.STS= 12 ; 2 Status ; MSCP STATUS CODES ST.MSK= 37 ; Status / event code mask ST.SUC= 0 ; Success ST.OFL= 3 ; Unit-Offline ST.AVL= 4 ; Available NOVOLM= 40 ; No volume mounted ST.MFE= 5 ; Media Format Error ST.WPR= 6 ; Write protected P.BCNT= 14 ; 4 Byte count P.FBBK= 34 ; 4 First bad block ; GET UNIT STATUS End Message Offsets P.MLUN= 14 ; 2 Multi-unit code P.UNFL= 16 ; 2 Unit flags ; Unit flags UF.WPH= 20000 ; Bit - Write protect (hardware) UF.WPS= 10000 ; Bit - Write protect (software or volume) P.UNTI= 24 ; 8 Unit identifier P.MEDI= 34 ; 4 Media type identifier P.SHUN= 40 ; 2 Shadow unit P.SHST= 42 ; 2 Shadow status P.TRCK= 44 ; 2 Track size P.GRP= 46 ; 2 Group size P.CYL= 50 ; 2 Cylinder size P.USVR= 52 ; 1 Unit software version P.UHVR= 53 ; 1 Unit hardware version P.RCTS= 54 ; 2 RCT table size P.RBNS= 56 ; 1 RBNs / track P.RCTC= 57 ; 1 RCT copies ; ONLINE End Message Offsets P.MLUN= 14 ; 2 Multi-unit code P.UNFL= 16 ; 2 Unit flags ; Unit flags UF.WPH= 20000 ; Bit - Write protect (hardware) UF.WPS= 10000 ; Bit - Write protect (software or volume) P.UNTI= 24 ; 8 Unit identifier P.MEDI= 34 ; 4 Media type identifier P.SHUN= 40 ; 2 Shadow unit P.SHST= 42 ; 2 Shadow status P.UNSZ= 44 ; 4 Unit size P.VSER= 50 ; 4 Volume serial number ; SET CONTROLLER CHARACTERISTICS End Message Offsets P.VRSN= 14 ; 2 MSCP version P.CNTF= 16 ; 2 controller flags P.CTMO= 20 ; 2 controller timeout P.CSVR= 22 ; 1 controller software version P.CHVR= 23 ; 1 controller hardware version P.CNTI= 24 ; 8 controller ID ; MODEL CODES RQDX3= 19. RQZX1= 30. ;RQZX1 ; SYSTEM MACROS .MCALL .DSTAT, .SETTO, .SPFUN, .FETCH, .LOOKUP, .CLOSE, .RELEAS .MCALL .ASSUM ; EXTERNAL ROUTINES USED .GLOBL $WAIT ; ERROR REPORTING MACRO .GLOBL PREMSG, $SERR1, $SERR2 .IRPC X, .GLOBL ERR$$'X .ENDR .MACRO $ERROR ADDR,CODE MOV #ERR$$'CODE',R0 MOV ADDR,-(SP) CALL PREMSG .ENDM .SBTTL INTERFACE WITH ROOT ; INTERFACE WITH ROOT ; LDPT$ DU ; SETUP DEVICE LOAD POINT AND ; OPTION TABLE .SBTTL DEVICE CHECK ROUTINE ; DEVICE CHECK ROUTINE ; ; R1 = UNIT NUMBER ; .REM % DEVICE_STATUS = DU DEVICE STATUS (DSTAT) DU_LOAD_ADDRESS = (DEVICE_STATUS + 4) DU_STATUS = STATU$(DU_LOAD_ADDRESS) DU_STATUS = DU_STATUS & 37 IF DU_STATUS <> 06 (WRITE PROTECTED MEDIUM) THEN : CLEAR CARRY ELSE SET CARRY RETURN % MOV #RSPBUF,R2 ; GET ADDRESS OF RESPONSE BUFFER .DSTAT R2,#DEVNAM ; GET DU LOAD ADDRESS MOV 4(R2),R0 ; PUT LOAD ADDRESS INTO R0 ADD STATU$,R0 ; GET ADDRESS OF DU STATUS MOV (R0),R0 ; GET DU STATUS BIC #^C,R0 ; CLEAR UNUSED BITS CMP #ST.WPR,R0 ; IS MEDIUM WRITE PROTECTED? BEQ 1$ ; BRANCH IF NOT TST (PC)+ ; SKIP & CLEAR CARRY 1$: SEC ; SET CARRY RETURN .SBTTL FORMAT ROUTINE ; FORMAT ROUTINE ; ; R2 = POINTER TO FREE AREA ABOVE THIS ROUTINE ; ; R1 = UNIT NUMBER ; .REM % ROUTINE_SUCCESSFUL = FALSE UNIT = (R1) FETCH DU HANDLER IF UNSUCCESSFUL THEN : "DEVICE HANDLER FETCH ERROR" ELSE IF HANDLER FETCHED THEN : RELFLG <> 0 ELSE RELFLG = 0 SET TOP TO ALLOW SPACE FOR DU TRANSLATION TABLE IF INSUFFICIENT SPACE AVAILABLE THEN : "INSUFFICIENT MEMORY" ELSE LOOKUP DEVICE_NAME IF UNSUCCESSFUL THEN : "DEVICE LOOKUP ERROR" ELSE GET DU TRANSLATION TABLE IF SUCCESSFUL THEN : MSCP_UNIT = ( (UNIT*4) + BASE_OF_TABLE_GOTTEN ) : SET CONTROLLER CHARACTERISTICS : IF SUCCESSFUL THEN : : IF ENDCODE = OP.SCC + OP.END THEN : : : IF CONTROLLER-ID.MODEL = 19. THEN : : : IF ((MICRO-CODE_VERSION < 2) : : : : "OPERATION UNSUPPORTED ON OLD MICRO-CODE REVISION" : : : ELSE : : : IF CONTROLLER-ID.MODEL <> 30. THEN : : : : "DEVICE INVALID OR NOT SUPPORTED BY FORMAT" : : : PUT DEVICE ONLINE : : : IF SUCCESSFUL THEN : : : : IF ENDCODE = OP.ONL + OP.END THEN : : : : : IF STATUS = ST.OFL + NOVOLM THEN : : : : : : "DEVICE NOT READY" : : : : : ELSE : : : : : ONL_RETURNED_STATUS = STATUS : : : : : GET UNIT STATUS : : : : : IF SUCCESSFUL THEN : : : : : : IF ENDCODE = OP.GUS + OP.END THEN : : : : : : : GUS_RETURNED_STATUS = STATUS : : : : : : : GUS_MEDIA_TYPE = MEDIA_TYPE : : : : : : : GUS_TRACK_SIZE = TRACK_SIZE : : : : : : : GUS_CYLINDER_SIZE = CYLINDER_SIZE : : : : : : : PUT DEVICE AVAILABLE : : : : : : : IF SUCCESSFUL THEN : : : : : : : : IF ENDCODE = OP.AVL + OP.END THEN : : : : : : : : : IF GUS_MEDIA_TYPE <> 022545,100041 THEN : : : : : : : : : : "DEVICE INVALID OR NOT SUPPORTED BY FORMAT" : : : : : : : : : ELSE : : : : : : : : : ERROR = FALSE : : : : : : : : : ABORT = FALSE : : : : : : : : : IF ONL_RETURNED_STATUS <> ST.MFE THEN : : : : : : : : : IF GUS_RETURNED_STATS <> 0 THEN : : : : : : : : : ERROR = TRUE : : : : : : : : : IF (GUS_TRACK_SIZE = 12) AND (GUS_CYLINDER_SIZE = 20) THEN : : : : : : : : : REPEAT : : : : : : : : : : "Volume is RX50:/FORMAT-ARE YOU SURE?" : : : : : : : : : : QUERY USER TO CONFIRM (CALL $WAIT) : : : : : : : : : UNTIL USER RESPONDS 'Y' OR 'N' : : : : : : : : : IF CONFIRMED 'NO' THEN : : : : : : : : : ABORT = TRUE : : : : : : : : : IF ERROR = FLASE THEN : : : : : : : : : : IF ABORT = FALSE THEN : : : : : : : : : : FORMAT DEVICE : : : : : : : : : : IF SUCCESSFUL THEN : : : : : : : : : : : IF ENDCODE = OP.FMT + OP.END THEN : : : : : : : : : : : : IF STATUS = ST.SUC THEN : : : : : : : : : : : : : ROUTINE_SUCCESSFUL = TRUE : : : : : : : : : : : : ELSE : : : : : : : : : : : : "DEVICE ERROR" : : : : : : : : : : : ELSE : : : : : : : : : : : "DEVICE ERROR" : : : : : : : : : : ELSE : : : : : : : : : : "DEVICE ERROR" : : : : : : : : : ELSE : : : : : : : : : "DEVICE ERROR" : : : : : : : : ELSE : : : : : : : : "DEVICE ERROR" : : : : : : ELSE : : : : : : : "DEVICE ERROR" : : : : : : ELSE : : : : : : "DEVICE ERROR" : : : : : ELSE : : : : : "DEVICE ERROR" : : : : ELSE : : : : "DEVICE ERROR" : : : ELSE : : : "DEVICE ERROR" : : ELSE : : "DEVICE ERROR" : ELSE : "DEVICE ERROR" ELSE "DEVICE ERROR" CLOSE CHANNEL IF RELFLG <> 0 THEN RELEASE DEVICE HANDLER RELEASE MEMORY ALLOCATED IF RETURN_SUCCESSFUL = TRUE THEN : CLEAR CARRY ELSE SET CARRY RETURN % DUTTSZ= <64.+1*2> ; DU TRANSLATION TABLE SIZE OPTN$ S,Y ;density switch, allowed to have a value ;default density is 100000 for RX33 ; and 20000 for RX23 ;if value given, it overrides default. ;if /S without value, get 4000 for RX50 ;can also give 4400 for DS RX50 ENTRY$ DU CLR -(SP) ; ROUTINE_SUCCESSFUL = FALSE .FETCH R2,#DEVNAM ; FETCH DEVICE HANDLER BCC 10$ ; - BRANCH IF SUCCESSFUL $ERROR #ERR1,U ; "Device handler fetch error" JMP 140$ 10$: SUB R0,R2 ; R2 = 0 IF HANDLER PREVIOUSLY FETCHED MOV R2,RELFLG ; SAVE R2 FOR RELEASE DECISION MOV R0,R2 ; SAVE NEW FREE SPACE POINTER ADD #DUTTSZ,R0 ; - NEW TOP ADDRESS .SETTO ; ALLOCATE BUFFER SUB R2,R0 ; CALCULATE AMOUNT OF MEMORY ALLOCATED CMP R0,#DUTTSZ ; WAS SUFFICIENT MEMORY ALLOCATED? BHIS 20$ ; BRANCH IF SO $ERROR #$SERR3,F ; "Insufficient memory" BR 30$ 20$: .LOOKUP #AREA,#0,#DEVNAM ; OPEN DEVICE BCC 40$ ; - BRANCH IF SUCCESSFUL $ERROR #ERR2,U ; "Lookup error" 30$: JMP 130$ 40$: .SPFUN #AREA,#0,#372,R2,#DUTTSZ ; READ TRANS. TABLE INTO FREE AREA BCS 44$ ; BRANCH IF UNSUCCESSFUL ;RQZX1 TST (R2)+ ; POINT TO NUMBER OF ENTRIES IN TABLE CMP R1,(R2)+ ; IS THERE AN ENTRY FOR THIS UNIT NUMBER? BHI 44$ ; NO ;RQZX1 ADD R1,R2 ; GET ADDRESS OF MSCP UNIT NUMBER ADD R1,R2 ADD R1,R2 ADD R1,R2 MOV (R2),MSCPUN ; GET MSCP UNIT NUMBER CLR CMDBUF+P.UNIT ; CLEAR UNIT NUMBER IN MSCP COMMAND BUFFER ; SCC DOES NOT HAVE UNIT NUMBER ARGUMENT JSR R5,BYPASS ; EXECUTE MSCP BYPASS .WORD OP.SCC ; TO SET CONTROLLER CHARACTERISTICS BCS 44$ ; BRANCH IF UNSUCCESSFUL ;RQZX1 MOVB RSPBUF+P.CNTI+6,CNTMOD ;Save Controller model no. ;RQZX1 MOV MSCPUN,CMDBUF+P.UNIT ; SET UNIT NUMBER INTO MSCP PACKET JSR R5,BYPASS ; EXECUTE MSCP BYPASS ;RQZX1 .WORD OP.AVL ; TO PUT DEVICE AVAILABLE ;RQZX1 BCS 44$ ; - BRANCH IF UNSUCCESSFUL ;RQZX1 CMPB #RQDX3,CNTMOD ; IS CONTROLLER AN RQDX3? ;RQZX1 BNE 45$ ;BR if not. ;RQZX1 CMPB #2,RSPBUF+P.CSVR ; IS UCODE REVISION 2 OR HIGHER? BLOS 50$ ; YES, CONTINUE $ERROR #ERR4,F ; "Operation unsupported on JMP 120$ ; old micro-code revision" 44$: JMP 110$ ;JMP because of BR range ;RQZX1 45$: CMPB #RQZX1,CNTMOD ;Is controller an RQZX1? ;RQZX1 BNE 70$ ;BR if not: unsupported by FORMAT. MOV #MD.IFM,CMDBUF+P.MOD ;RQZX1 50$: JSR R5,BYPASS ; EXECUTE MSCP BYPASS .WORD OP.ONL ; TO PUT DEVICE ONLINE BCS 55$ ; - BRANCH IF UNSUCCESSFUL CMP #ST.OFL!NOVOLM,RSPBUF+P.STS ; IS THERE A VOLUME MOUNTED? BNE 60$ ; YES, CONTINUE $ERROR #$SERR1,F ; "Device not ready" jmp 120$ 55$: jmp 110$ 60$: MOV RSPBUF+P.STS,ONLSTS ; YES, SAVE STATUS MOV RSPBUF+P.UNSZ,UNSZ ;Save low byte of unit size MOV RSPBUF+P.UNSZ+2,UNSZ+2 ;Save high byte of unit size CLR CMDBUF+P.MOD ;Clear MD.IFM for RQZX1. ;RQZX1 JSR R5,BYPASS ; EXECUTE MSCP BYPASS .WORD OP.GUS ; TO GET UNIT STATUS BCS 110$ ; - BRANCH IF UNSUCCESSFUL MOV RSPBUF+P.STS,GUSSTS ; SAVE STATUS MOV #RSPBUF+P.MEDI,R3 ; POINT TO MEDIA TYPE IN RESPONSE BUFFER MOV #MEDTYP,R4 ; POINT TO STORAGE LOCATION FOR MEDIA TYPE MOV (R3)+,(R4)+ ; SAVE MEDIA TYPE MOV (R3)+,(R4)+ CMP (R3)+,(R3)+ ; SKIP SHADOW UNIT AND STATUS MOV (R3)+,(R4)+ ; SAVE TRACK SIZE MOV (R3)+,(R4)+ ; SAVE GROUP SIZE MOV (R3)+,(R4)+ ; SAVE CYLINDER SIZE MOV #100000,FMTTYP ; Default format type CMPB #RQZX1,CNTMOD ;Is controller an RQZX1? ;RQZX1 BEQ 65$ ;BR if yes. ;RQZX1 JSR R5,BYPASS ; EXECUTE MSCP BYPASS .WORD OP.AVL ; TO PUT DEVICE AVAILABLE BCS 110$ ; - BRANCH IF UNSUCCESSFUL 65$: CMP #100027,MEDTYP ; IS MEDIA TYPE AN RX23? BNE 66$ MOV #20000,FMTTYP ; #20000 is format type for RX23 BR 67$ ; Still have to check second MEDTYP 66$: CMP #100041,MEDTYP ; IS MEDIA TYPE AN RX33? ;RQZX1 BNE 70$ ; NO 67$: CMP #022545,MEDTYP+2; BEQ 80$ ; YES, CONTINUE 70$: $ERROR #ERR3,F ; "Device invalid or ; not supported by FORMAT" BR 120$ 80$: TSTB GIV.S ;Was /S (/DENSITY) flagged? BEQ 84$ ; if so, don't muck with FMTTYP BPL 82$ ; branch if value was given too MOV #4000,FMTTYP ; if no value given, default to RX50 BR 84$ 82$: MOV VAL.S,FMTTYP ; get the given value 84$: CMP #ST.MFE,ONLSTS ; WAS MEDIA FORMAT ERROR RETURNED WHEN PUTTING ; THE DEVICE ONLINE? BEQ 100$ ; YES - THE FLOPPY IS UNFORMATTED ; The Andromeda controllers do not return Media Format Error ; for a blank floppy. Instead, they return two "avaialbles". CMP #ST.AVL,ONLSTS ; Check for "available" at online BNE 86$ CMP #ST.AVL,GUSSTS ; Check for "available" at GUS BEQ 100$ ; If both, then it's a SCDC with blank media! 86$: TST GUSSTS ; WAS GET UNIT STATUS SUCCESSFUL? BNE 110$ ; NO ; CMP #12,TRKSIZ ; IS TRACK SIZE OF DEVICE EQUAL TO 12(OCT) ; BNE 100$ ; NO ; CMP #20,CYLSIZ ; IS CYLINDER SIZE OF DEVICE EQUAL TO 20(OCT) ; BNE 100$ ; NO ; Check for RX50 media present used to depend on track and cylinder ; sizes - but RQDX3 and Andromeda report these differently. So now ; we simply look at the unit size=800. for RX50 media determination. CMP #800.,UNSZ ; Check low byte of Unit size - is it 800.? BNE 100$ ; NO TST UNSZ+2 ; Check high byte - is it 0? BNE 100$ ; NO TST GIV.S ; Did user explicitly override density? BNE 100$ ; If so, assume she knows what she wants... 90$: MOV #FMRX50,R0 ; ADDRESS TO STORE DEVICE STRING CALL PUTDEV ; GO PUT IT MOV #FMRX50,-(SP) ; "Volume is an RX50:/FORMAT-Are you sure?" CALL $WAIT ; GET USER RESPONSE TST R0 ; DID USER RESPOND? BLT 90$ ; - RESPONSE REQUIRED ; R0 = 1 IF 'Y' ; R0 = 0 IF 'N' BEQ 120$ ; USER RESPONDED NO 100$: CMPB #RQZX1,CNTMOD ;Is the controller an RQZX1? ;RQZX1 BNE 105$ ;BR if not: RQDX3. ;RQZX1 JSR R5,BYPASS ;Do a real Format command. ;RQZX1 .WORD OP.FMT ;RQZX1 BR 106$ ;RQZX1 105$: MOV FMTTYP,CMDBUF+P.FMTI+2 ; SETUP FORMAT INFORMATION ;RQZX1 JSR R5,BYPASS ; EXECUTE MSCP BYPASS .WORD OP.SP8 ; TO FORMAT DEVICE 106$: BCS 110$ ; - BRANCH IF UNSUCCESSFUL TST RSPBUF+P.STS ; WAS OPERATION SUCCESSFUL BNE 110$ ; - BRANCH IF OPERATION UNSUCCESSFUL INC (SP) ; ROUTINE_SUCCESSFUL = TRUE BR 120$ 110$: $ERROR #$SERR2,F ; "Device error" 120$: .CLOSE #0 ; CLOSE CHANNEL 130$: TST RELFLG ; WAS HANDLER FETCHED HERE? BEQ 140$ ; NO .RELEAS #DEVNAM ; RELEASE HANDLER 140$: TST (SP)+ ; WAS ROUTINE SUCCESSFUL; SET CARRY = 0 BNE 150$ ; YES, RETURN (C=0) SEC ; NO, SET CARRY AND RETURN 150$: RETURN .SBTTL SUBROUTINE TO PERFORM MSCP BYPASS COMMAND ; SUBROUTINE TO PERFORM MSCP BYPASS COMMAND ; ; INPUT VARIABLES: ; THE MSCP COMMAND PACKET MUST BE PREVIOUSLY SETUP IN CMDBUF ; R5 => MSCP OPCODE ; ; OUTPUT VARIABLES: ; CARRY SET IF SPFUN RETURNED ERROR OR INVALID COMMAND ; OTHERWISE, CARRY CLEAR ; ; CALLING SEQUENCE: ; JSR R5,BYPASS ; .WORD (MSCP OPCODE) ; BYPASS: MOV #RSPPKT,R2 ; POINTER TO MSCP AREA MOV #RSPLEN,(R2)+ ; RESPONSE PACKET LENGTH CLR (R2)+ ; VIRTUAL CIRCUIT ID ADD #RSPLEN,R2 ; POINT TO START OF COMMAND PACKET MOV #CMDLEN,(R2)+ ; COMMAND PACKET LENGTH CLR (R2)+ ; VIRTUAL CIRCUIT ID MOV (R5)+,P.OPCD(R2) ; OPCODE - FROM CALLER .SPFUN #AREA,#0,#360,#RSPPKT,#0,#0 ; ISSUE MSCP-BYPASS COMMAND BCS 1$ ; - BRANCH IF UNSUCCESSFUL MOVB RSPBUF+P.STS,-(SP) ; GET RETURNED STATUS BIC #^C,(SP) ; CLEAR SUBCODE CMP #1,(SP)+ ; WAS THE COMMAND INVALID? CLC ; ASSUME 'NO' BNE 1$ ; NO, RETURN SEC ; YES, SET CARRY THEN RETURN 1$: RTS R5 ; RETURN TO CALLER .SBTTL ASCII MESSAGES .NLIST BEX .PSECT PUREDATA ERR1: .ASCIZ /Device handler fetch error/ ERR2: .ASCIZ /Channel in use/ ERR3: .ASCIZ /Device invalid or not supported by FORMAT/ ERR4: .ASCIZ /Operation unsupported on old micro-code revision/ FMRX50: .ASCII \DU0: is an RX50 volume/FORMAT-Are you sure? \<200> .SBTTL INPURE DATA .PSECT DATA ; EMT ARGUMENT AREA AREA: .BLKW 6 ; MSCP AREA RSPPKT: .WORD 0,0 ; RESPONSE PACKET LENGTH, VIRTUAL CIRCUIT ID RSPBUF: .BLKW 24. ; RESPONSE BUFFER RSPLEN= .-RSPBUF ; LENGTH OF RESPONSE BUFFER CMDPKT: .WORD 0,0 ; COMMAND PACKET LENGTH, VIRTUAL CIRCUIT ID CMDBUF: .REPT 24. ; COMMAND BUFFER .WORD 0 ; - INITIALLY CLEARED .ENDR CMDLEN= .-CMDBUF ; LENGTH OF COMMAND BUFFER ; MISCELLANEOUS RELFLG: .WORD 0 ; RELEASE FLAG MSCPUN: .WORD 0 ; MSCP UNIT NUMBER NEEDED FOR MSCP BYPASS ; THIS MAY NOT BE THE SAME AS DU UNIT NUMBER FMTTYP: .WORD 0 ; Format type; 100000 for RX33, ; 20000 for RX23 (Andromeda), ; 4000 for RX50 (Andromeda) ; 4400 for DSRX50 (Andromeda) ONLSTS: .WORD 0 ; STATUS FROM ONLINE MSCP COMMAND (OP.ONL) GUSSTS: .WORD 0 ; STATUS FROM GET UNIT STATUS MSCP COMMAND (OP.GUS) MEDTYP: .WORD 0,0 ; MEDIA TYPE GET UNIT STATUS MSCP COMMAND (OP.GUS) TRKSIZ: .WORD 0 ; TRACK SIZE FROM GET UNIT STATUS MSCP COMMAND (OP.GUS) GRPSIZ: .WORD 0 ; GROUP SIZE FROM GET UNIT STATUS MSCP COMMAND (OP.GUS) CYLSIZ: .WORD 0 ; CYLINDER SIZE FROM GET UNIT STATUS MSCP COMMAND ; (OP.GUS) CNTMOD: .WORD 0 ;Controller Model no. ;RQZX1 UNSZ: .WORD 0,0 ;Unit size .END