	.TITLE	RPFMT - RP0X DISK FORMAT PROGRAM
	.IDENT	/01/
 
;
; COPYRIGHT (C) 1978
; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
; THIS SOFTWARE IS FURNISHED UNDER  A LICENSE FOR USE ONLY  ON  A
; SINGLE COMPUTER SYSTEM AND MAY BE  COPIED ONLY WITH  THE INCLU-
; SION 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 DEC.
;
; THE INFORMATION IN THIS SOFTWARE  IS  SUBJECT TO CHANGE WITHOUT
; NOTICE AND SHOULD NOT BE CONSTRUED  AS  A COMMITMENT BY DIGITAL
; EQUIPMENT CORPORATION.
;
; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
;
; D. N. CUTLER 2-MAY-78
;
; RP0X FORMAT PROGRAM
;
; MACRO LIBRARY CALLS
;
 
	$IODEF				;DEFINE I/O FUNCTION CODES
	$SSDEF				;DEFINE SYSTEM STATUS VALUES
 
	.LIST	MEB			;LIST EXPANDED BINARY
 
;
; LOCAL MACROS
;
; CHECK I/O STATUS
;
 
	.MACRO	CHECKIO
		BSBW	CHECKIOS
	.ENDM
 
;
; LOOP ON STATUS MISMATCH
;
 
	.MACRO	LOOPS STAT
		.IF NB	STAT
		CMPW	#SS$_'STAT,R0
		BSBW	CHECKEQL
		.IFF
		BSBW	CHECKLBS
		.ENDC
	.ENDM	LOOPS
 
;
; LOCAL DATA
;
; OUTPUT BUFFER DESCRIPTOR
;
 
	.PSECT	DATA,RD,WRT,NOEXE
BUFFER:					;
	.LONG	132			;
	.LONG	OUTBUF			;
 
;
; DEVICE CHARACTERISTICS BUFFER
;
 
DBBUF:	.BLKL	3			;
 
;
; DEVICE CHARACTERISTICS BUFFER DESCRIPTOR
;
 
DBCHAR:	.LONG	3*4			;
	.LONG	DBBUF			;
 
;
; DISK BUFFER
;
 
DSKBUF:	.BLKB	22*<512+8>		;
 
;
; I/O STATUS BLOCK
;
 
IOSTAT:	.BLKQ	1			;
 
;
; LENGTH OF FORMATTED ERROR MESSAGE STRING
;
 
LENGTH:	.BLKW	1			;
 
;
; OUTPUT BUFFER
;
 
OUTBUF:					;
	.BLKB	132			;
 
;
; DISK CHANNEL NUMBER
;
 
DBCHAN:	.BLKW	1			;
 
;
; TERMINAL CHANNEL NUMBER
;
 
TTCHAN:	.BLKW	1			;
 
;
; ERROR MESSAGE STRING DESCRIPTOR
;
 
ERRORMSG:				;LENGTH OF CONTROL STRING IN BYTES
	.LONG	20$-10$			;
	.LONG	10$			;ADDRESS OF CONTROL STRING
10$:	.ASCII	/			*** ERROR AT PC=!XL R0=!XL R9=!XL ***/ ;
20$:					;
 
;
; DISK NAME STRING DESCRIPTOR
;
 
DBNAME:	.LONG	20$-10$			;LENGTH OF NAME STRING IN BYTES
	.LONG	10$			;ADDRESS OF NAME STRING
10$:	.ASCII	/DRIVE/			;DEVICE NAME STRING
20$:					;REF LABEL
 
;
; TERMINAL NAME STRING DESCRIPTOR
;
 
TTNAME:	.LONG	20$-10$			;LENGTH OF NAME STRING IN BYTES
	.LONG	10$			;ADDRESS OF NAME STRING
10$:	.ASCII	/TT/			;DEVICE NAME STRING
20$:					;REF LABEL
 
;
; ENDING TIME
;
 
ENDMSG:					;
	.ASCII	<13><10>/END FORMAT = /	;
ETIMEBUF:				;
	.BLKB	24			;
	.BYTE	13,10			;
ENDMSGLEN=.-ENDMSG			;
 
;
; END TIME CONVERSION BUFFER DESCRIPTOR
;
 
ETIME:					;
	.LONG	24			;
	.LONG	ETIMEBUF		;
 
;
; STARTING TIME
;
 
STARTMSG:				;
	.ASCII	<13><10>/START FORMAT = / ;
STIMEBUF:				;
	.BLKB	24			;
	.BYTE	13,10			;
STARTMSGLEN=.-STARTMSG			;
 
;
; START TIME CONVERSION BUFFER DESCRIPTOR
;
 
STIME:					;
	.LONG	24			;
	.LONG	STIMEBUF		;
	.PAGE
	.SBTTL	START OF RP0X FORMAT
;+
; START - START OF RP0X FORMAT
;-
 
	.PSECT	CODE,RD,NOWRT,EXE
START:	.WORD	0			;ENTRY MASK
	$ASSIGN_S TTNAME,TTCHAN	;ASSIGN CHANNEL TO TERMINAL
	LOOPS	NORMAL			;LOOP IF NOT NORMAL COMPLETION
	$ASSIGN_S DBNAME,DBCHAN		;ASSIGN CHANNEL TO DISK
	LOOPS	NORMAL			;LOOP IF NOT NORMAL STATUS
	$GETCHN_S DBCHAN,,DBCHAR	;GET DEVICE CHARACTERISTICS
	LOOPS				;CHECK FOR SUCCESS STATUS
	$ASCTIM_S LENGTH,STIME		;CONVERT CURRENT TIME TO ASCII
	LOOPS	NORMAL			;LOOP IF NOT NORMAL COMPLETION
	$OUTPUT	TTCHAN,#STARTMSGLEN,STARTMSG ;OUTPUT START TIME
	LOOPS	NORMAL			;LOOP IF NOT NORMAL COMPLETION
 
;
; BEGIN FORMATTING DISK
;
 
FMTBEG:					;
	$QIOW_S	#0,DBCHAN,#IO$_PACKACK,IOSTAT ;ACKNOWLEDGE PACK
	LOOPS	NORMAL			;CHECK FOR NORMAL COMPLETION
	MOVZWL	DBBUF+10,R7		;GET NUMBER OF CYLINDERS
	DECL	R7			;REDUCE BY ONE
	CLRL	R6			;CLEAR CYLINDER NUMBER
	CLRL	R5			;CLEAR TRACK NUMBER
10$:	CLRL	R4			;CLEAR SECTOR NUMBER
	MOVAB	DSKBUF,R3		;GET ADDRESS OF FORMAT BUFFER
	MOVW	R6,-(SP)		;FORM DISK ADDRESS
	MOVB	R5,-(SP)		;
	MOVB	R4,-(SP)		;
	MOVL	SP,R2			;SAVE ADDRESS OF DISK ADDRESS
20$:	BISW3	#^X1000,R6,(R3)+	;INSERT CYLINDER NUMBER
	MOVB	R4,(R3)+		;INSERT SECTOR NUMBER
	MOVB	R5,(R3)+		;INSERT TRACK NUMBER
	MOVAB	516(R3),R3		;POINT TO NEXT SECTOR
	AOBLEQ	#21,R4,20$		;ANY MORE SECTORS TO FILL IN?
	$QIOW_S	#0,DBCHAN,#IO$_WRITEHEAD,IOSTAT,,,DSKBUF,#22*<512+8>,(R2) ;FORMAT TRACK
	LOOPS	NORMAL			;CHECK FOR NORMAL COMPLETION
	CHECKIO				;CHECK I/O STATUS
	TSTL	(SP)+			;REMOVE DISK ADDRESS FROM STACK
	AOBLEQ	#18,R5,10$		;ANY MORE TRACKS TO FORMAT?
	CLRL	R5			;CLEAR TRACK NUMBER
	AOBLEQ	R7,R6,10$		;ANY MORE CYLINDERS TO FROMAT
 
;
; END OF FORMATTING
;
 
FMTEND:					;
	$ASCTIM_S LENGTH,ETIME		;CONVERT CURRENT TIME TO ASCII
	$OUTPUT	TTCHAN,#ENDMSGLEN,ENDMSG ;OUTPUT ENDING TIME
	$DASSGN_S DBCHAN		;DEASSIGN DISK
	$DASSGN_S TTCHAN		;DEASSIGN TERMINAL CHANNEL
	RET				;
 
;
; SUBROUTINES TO CHECK FOR CONDITIONS
;
 
CHECKEQL:				;CHECK FOR EQUALITY
	BNEQ	ERROR			;
	RSB				;
CHECKIOS:				;CHECK I/O STATUS
	MOVL	IOSTAT,R0		;
CHECKLBS:				;CHECK FOR TRUE
	BLBC	R0,ERROR		;
	RSB				;
 
;
; ERROR MESSAGE OUTPUT
;
 
ERROR:					;
	MOVL	(SP),R1			;GET RETURN PC
	$FAO_S	ERRORMSG,LENGTH,BUFFER,R1,R0 ;FORMAT MESSAGE
	$OUTPUT	TTCHAN,LENGTH,OUTBUF ;OUTPUT MESSAGE
	RSB				;
 
	.END	START
