.MCALL .MODULE .MODULE FMTDX,VERSION=02,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. ; ; AUTHOR: JONATHAN P. HARRIS 5-DEC-77 V01-00 ; ; MODIFIED: BARBARA DOERRE 7-NOV-78 V01-01 ; MACROS MODIFIED AND ADDED TO SUPPORT VERIFIFICATION FUNCTIONALITY AND ; TO OVERLAY FORMAT ROUTINES ; 1)MODIFIED DEVIC$ AND ENTRY$ MACROS ; 2)ADDED LDPT$ MACRO ; ; ; THIS MODULE IS A PREFIX FILE FOR ASSEMBLY OF THE FORMAT ROOT ; AND OVERLAYS. IT PROVIDES MACROS NEEDED TO SPECIFY OPTIONS ; AND CREATE TABLES AND ENTRY POINTS. ; TO ADDED 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) ;- .SBTTL (MACRO PREFIX FILE) ;+ ; 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 RX01 VERIFYING ROUTINE ;+ ; ; V04.00 ; ; THIS MODULE WILL VERIFY DISKETTES IN SINGLE DENSITY FORMAT ; USING RX01 DRIVES. ; ; V01.00 08-FEB-79 CREATED ; -BJD- ; ; MODIFICATIONS: ; ; V01.01 06-AUG-79 ADDED $ERROR MACRO FOR SUPPORT OF ; -MBG- USER PROGRAM ERROR STATUS BYTE (53) ;MG1 ; ; X05.00 14-SEP-82 GET CSR ADDRESS FROM HANDLER ; -CA- ; ELDX == 1 ; ;- ;+ ; ; DXFMT - THIS ROUTINE FORMATS SINGLE SIDED (RX01 OR RX02) MEDIA ; IN EITHER SINGLE OR DOUBLE DENSITY FORMAT USING RX02 DRIVES ; ;- .SBTTL DEFINITIONS ; LOCAL SYMBOLS ; ; SYMBOL FUNCTION ; ------ -------- .IIF NDF DX$CSR, DX$CSR==177170 ;BASE LOCATION OF CSR, CONTROLLER#1 .IIF NDF DX$CS2, DX$CS2==177150 ;BASE LOCATION OF CSR, CONTROLLER#2 RXCS = 0 ; CONTROL AND STATUS RXMP = 2 ; MULTI-PURPOSE ERR = 100000 ;BITS IN RXC2: ERROR RXINIT = 40000 ; RX INITIALIZE DONE = 40 ; DONE? UNIT = 20 ; UNIT SELECT RDSTS = 12 ; READ STATUS FUNCTION GO = 1 ; GO DRVRDY = 200 ;DRIVE READY BIT IN RXES ; ERROR REPORTING MACRO .GLOBL PREMSG ;MG1+ .IRPC X, .GLOBL ERR$$'X .ENDR .MACRO $ERROR ADDR,CODE MOV #ERR$$'CODE,R0 MOV ADDR,-(SP) CALL PREMSG .ENDM ;MG1- .SBTTL RX01/02 FORMATTER .GLOBL NONCSR ; ROOT INTERFACE ; ; LDPT$ DX ;SET UP DEVICE LOAD POINT AND ; OPTION TABLE MOV NONCSR,CSR1DX ;GET CSR ADR ;CA5+ CLR FUNC ;CLEAR FUNCTION WORD CALL CSRSET ;DETERMINE THE CSR FOR UNIT NUMBER BCS 5$ ;ERROR WITH UNIT NUMBER BIS #RDSTS+GO,FUNC ;SETUP TO DO A MAINTENANCE READ STATUS MOV FUNC,@R2 ;DO THE READ STATUS 1$: BIT #DONE,@R2 ;DONE? BEQ 1$ ; NO- LOOP. BIT #ERR,@R2 ;ERROR DURING MAINTENANCE READ STATUS? BNE 3$ ;IF NE YES 2$: BIT #DRVRDY,RXMP(R2) ;WAS DRIVE READY? BNE 4$ ;YES- OK. 3$: SEC ;INDICATE DEVICE NOT READY BR 5$ ;AND RETURN 4$: CLC ;INDICATE NO WRITE LOCK 5$: RETURN ;RETURN ENTRY$ DX ;ENTRY POINT .SBTTL DETERMINE CORRECT CSR ADDRESS AND UNIT# ;+ ; ; CSRSET - DETERMINES CORRECT CSR ADDRESS AND UNIT# ; ; ON ENTRY: R1 CONTAINS UNIT NUMBER ; CSR1 AND CSR2 CONTAIN THE DEFAULT CSR ADDRESSES FOR ; THE RX02 CONTROLLERS ; ; ON RETURN: R2 CONTAINS CORRECT CSR ADDRESS ; FUNC HAS UNIT SELECT BIT SET ACCORDINGLY ; ; ERRORS: ILLEGAL UNIT NUMBER GIVEN ; ;- CSRSET: CMP #1,R1 ;UNIT 0 OR 1 SPECIFIED? BLT 2$ ; NO. BNE 1$ ; YES-BRANCH IF UNIT 0 BIS #UNIT,FUNC ;SET UNIT 1 BIT IN FUNCTION WORD 1$: MOV CSR1DX,R2 ;CSR1 IS CORRECT CSR BR 5$ ;RETURN 2$: CMP #3,R1 ;UNIT 2 OR 3 SPECIFIED? BLT 4$ ; NO- ERROR BNE 3$ ; YES-BRANCH IF UNIT 2 BIS #UNIT,FUNC ;UNIT 3 IS REALLY UNIT 1 OF ; 2ND CONTROLLER 3$: MOV CSR2DX,R2 ;CSR2 IS CORRECT CSR BR 5$ ;RETURN 4$: $ERROR #ERR1,F ;'?UNIT NUMBER TOO LARGE...' ;MG1 SEC ;INDICATE ERROR BR 6$ 5$: CLC ;INDICATE SUCCESS 6$: RETURN .SBTTL DATA AREA .PSECT PUREDATA,RO,D CSR1DX::.WORD DX$CSR ;CSR ADDRESS OF 1ST CONTROLLER CSR2DX::.WORD DX$CS2 ;CSR ADDRESS OF 2ND CONTROLLER .ENABL LC .NLIST BEX ERR1: .ASCIZ /Unit number too large for RT-11 configuration/ .EVEN .LIST BEX .DSABL LC .PSECT DATA,RW,D FUNC: .WORD 0 ;FUNCTION WORD .END