.MCALL .MODULE .MODULE FMTDP,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 RP02/03 FORMATTING ROUTINE ;+ ; ; 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- ELDP == 1 ; ;- .MCALL .PRINT ; LOCAL SYMBOLS ; ; ; SYMBOL FUNCTION ; ------ -------- .IIF NDF DP$CSR, DP$CSR==176710 ;BASE LOCATION OF DEVICE REGISTERS RPDS = 0 ;OFFSET OF DEVICE STATUS REGISTER RPER = 2 ; ERROR RPCS = 4 ; CONTROL AND STATUS RPWC = 6 ; WORD COUNT RPBA = 10 ; BUS ADDRESS RPCA = 12 ; CYLINDER ADDRESS RPDA = 14 ; DISK ADDRESS ;RPCS BITS: MODE = 10000 ;PDP-10 OR PDP-15 MODE SELECT HDR = 4000 ;HEADER OPERATION HOME = 14 ;HOME SEEK FUNCTION WRITE = 2 ;WRITE FUNCTION IDLE = 0 ;IDLE FUNCTION GO = 1 ;GO BIT ;RPDS BITS: SURDY = 100000 ;SELECTED UNIT READY SUOL = 40000 ; " ON LINE SURP03 = 20000 ; " IS AN RP03 SUSI = 4000 ; " SEEK INCOMPLETE SUWP = 400 ; " WRITE PROTECT ; ERROR REPORTING MACRO .GLOBL $SERR1, $SERR2, $WAIT .IRPC X, ;MG1+ .GLOBL ERR$$'X .ENDR .GLOBL PREMSG .MACRO $ERROR ADDR,CODE MOV #ERR$$'CODE',R0 MOV ADDR,-(SP) CALL PREMSG .ENDM ;MG1- .SBTTL FORMATTING SUBROUTINE .GLOBL NONCSR ; ROOT INTERFACE ; LDPT$ DP ;LOAD POINT MOV NONCSR,CSR1DP ;GET CSR ADR FROM HANDLER ;CA5+ MOV CSR1DP,R2 ;GET ADDRESS OF DEVICE CSR MOV #IDLE+GO,RPCS(R2) ;ABORT CONTROLLER MOV #IDLE+GO,RPCS(R2) ;CLEAR ANY ERRORS CAUSED BY ABORT MOVB R1,RPCS+1(R2) ;SELECT PHYSICAL UNIT (PASSED IN R1) BICB -(SP),(SP)+ ;TIMING KLUDGE MOV RPDS(R2),R3 ;GET CURRENT DEVICE STATUS BIC ^C,R3 ;CLEAR IRRELEVANT BITS CMP #SURDY!SUOL,R3 ;ARE WE OKAY? BNE 1$ ;IF NE, NO. CLC ;NO ERRORS BR 2$ ;AND REPORT 1$: SEC ;INDICATE NOT READY AND ABLE 2$: RETURN ;REPORT IT ENTRY$ DP ;ENTRY POINT OF ROUTINE MOV #RPMSG1,-(SP) ;SP-->MESSAGE TO PRINT CALL $WAIT ;WAIT FOR RESPONSE BCS 9$ ;"NO" RETURN MOV CSR1DP,R2 ;GET ADDRESS OF DEVICE CSR MOV #IDLE+GO,RPCS(R2) ;ABORT CONTROLLER MOV #IDLE+GO,RPCS(R2) ;CLEAR ANY ERRORS CAUSED BY ABORT MOVB R1,RPCS+1(R2) ;SELECT PHYSICAL UNIT (PASSED IN R1) BICB -(SP),(SP)+ ;TIMING KLUDGE MOV RPDS(R2),R3 ;GET CURRENT DEVICE STATUS COM R3 BIT #SURDY+SUOL,R3 ;IS DRIVE READY AND ON-LINE? BEQ 2$ ;IF EQ, YES. $ERROR #$SERR1,F ;'?DEVICE NOT READY...' ;MG1 BR 9$ ;ERROR RETURN 2$: MOVB #HOME+GO,RPCS(R2) ;ISSUE HOME SEEK 3$: TSTB RPCS(R2) ;DONE? BPL 3$ ;NO-LOOP. 4$: TST RPDS(R2) ;YES. DRIVE READY? BPL 4$ ;NO-LOOP. TST RPCS(R2) ;YES. ANY ERRORS? BMI 8$ ;YES. 5$: BIS #MODE+HDR,RPCS(R2) ;SET FMT AND PDP-10 MODES MOV #-3,RPWC(R2) ;SET WORD COUNT TO HEADER SIZE MOVB #WRITE+GO,RPCS(R2) ;INITIATE FORMAT OF DISK 6$: TSTB RPCS(R2) ;DONE? BPL 6$ ;NO-LOOP. BIC #MODE+HDR,RPCS(R2) ;DISABLE FORMAT AND PDP-10 MODES TST RPCS(R2) ;ANY ERRORS? BMI 7$ ;YES. TST RPCA(R2) ;NO. CYLINDER ZERO? BEQ 11$ ;YES. OK. BR 8$ ;NO. ERROR 7$: BIT #SURP03,RPDS(R2) ;IS THIS AN RP02? BNE 8$ ;NO BIT #SUSI,RPDS(R2) ;SEEK INCOMPLETE? BEQ 8$ ;NO. CMP #203.,RPCA(R2) ;YES. AT CYLINDER 203? BEQ 11$ ;YES. OK. 8$: $ERROR #$SERR2,F ;'?DEVICE ERROR...' ;MG1 MOV #IDLE+GO,RPCS(R2) ;CLEAR CONTROLLER 9$: MOV #RPMSG2,-(SP) ;SP-->MESSAGE TO PRINT CALL $WAIT ;WAIT FOR RESPONSE BCS 9$ ; LOOP ON 'NO' RESPONSE SEC ;SET ERROR FLAG BR 13$ ;AND RETURN 11$: MOV #IDLE+GO,RPCS(R2) ;CLEAR CONTROLLER 12$: MOV #RPMSG2,-(SP) ;SP-->MESSAGE TO PRINT CALL $WAIT ;WAIT FOR RESPONSE BCS 12$ ; LOOP ON 'NO' RESPONSE 13$: RETURN ;RETURN .SBTTL DPFMT DATA AREA .PSECT PUREDATA,RO,D .ENABL LC .NLIST BEX .EVEN CSR1DP:: .WORD DP$CSR ;BASE ADDRESS OF CSR RPMSG1: .ASCII 'Set FORMAT switch to ENABLE. CONTINUE(Y/N)?'<200> RPMSG2: .ASCII /Set FORMAT switch to NORMAL. CONTINUE(Y)?/<200> .EVEN .LIST BEX .END