Trailing-Edge - PDP-10 Archives - decuslib20-06 - decus/20-155/sysbul.mac
There are no other files named sysbul.mac in the archive.
Subttl	Table of contents for SYSBUL

;	   -- Section --					   -- Page --
;  1.   Table of contents............................................. 1
;  2.	Macros and program storage.................................... 3
;  3.	CMD program blocks............................................ 4
;  4.	Start of main routine......................................... 5
;  5.	Exit command - leave the program.............................. 6
;  6.	Help command - type the following message..................... 6
;  7.	List command - list all available sysbuls..................... 7
;  8.	Type and Print commands....................................... 8
;  9.	Output routine for type and print............................. 9
;  10.	Delete and Enter commands..................................... 10
;  11.	Subroutines
;	  11.1   Sysbul output........................................ 11
;	  11.2   Wild card JFN handling subroutines................... 12
;	  11.3   General purpose...................................... 13
;		     (End of table of contents)
Title	SYSBUL - Program to list and read systems bulletins

.Require SYS:MACREL		;general routines
.Require SYS:CMD		;command input routines

;Version information
	PGVER.	(vmajor,vminor,vedit,vcust)

Comment	%
	Systems bulletins are created with RUNOFF and must start with
	a one-line synopsis of the bulletin.  The sysbul number and date
	are handled by the sysbul program and should not be included in
	the file.  The finished file will be renamed into the SYSBUL area
	as file SYSTEMS.BULLETIN.XX, where it will join other files with the
	same name and lower generation numbers.

	Written by DHB, 25-Jul-80

Subttl	Macros and program storage
;Macro definitions

Define	crlf,<
	hrroi	a,[asciz\
	psout	>

Define	Crtab,<
	hrrz	a,ojfn
	hrroi	b,[asciz\
	setz	c,
	sout		>

Define	Table,<
	xlist				;;don't expand
	setsec	DELETE,%dele		;;delete command (secret)
	setup	EXIT,%exit		;;exit command
	setup	HELP,%help		;;help message
	setup	LIST,%list		;;list sysbuls
	setsec	NEW,%new		;;enter command (secret)
	setup	PRINT,%prin		;;print a sysbul
	setup	TYPE,%type		;;type a sysbul
	list				;;resume normal listing mode

Define	Setup(comand,dispat),<
	xwd	[asciz\comand\],dispat	;;command table entry

Define	Setsec(comand,dispat),<
	xwd	[cm%fw!cm%inv
		asciz\comand\],dispat	;;secret command entry


	Array	String[strsiz]		;string storage
	Array	Stack[stksiz]		;push down stack
	Array	Jfnstk[stksiz]		;jfn stack
Subttl	CMD program blocks

Cmdstg				;cmd program storage

Comtab:	xwd	tabend-.-1,tabend-.-1	;tells length of table
	table			;invoke the macro
	tabend==.		;end of table

Keyfld:	flddb.	.cmkey,,alltab,,,numfld	;accept a keyword
Numfld:	flddb.	.cmnum,,12		;accept a number
Swtfld:	flddb.	.cmswi,,swttab,<Optional switch,>,,cmffld	;accept a switch
Cmffld:	flddb.	.cmcfm			;confirm

Alltab:	xwd	1,1		;one entry
	[asciz\ALL\],,0		;no dispatch address

Swttab:	xwd	2,2		;two switches
	[asciz\FORWARD\],,0	;forward order
	[asciz\REVERSE\],,-1	;reverse order

;Block for accepting an output spec with a default
Ospec:	fld(.cmofi,cm%fnc)!cm%dpp	;output file
	point	7,[asciz\LPT:SYSBUL.LST\]
Subttl	Start of main routine

Sysbul:	reset			;clear everything
	move	p,[iowd stksiz,stack]	;set up the pdl
	call	cmdini##	;initialize the command scanner
	tmsg	<Systems bulletin review program -- type H for help>

;Here to execute repeated commands
Nxtcmd:	move	j,[xwd -stksiz,jfnstk]	;set up the jfn stack
	setzm	jfnstk			;clear the jfn storage
	move	a,[jfnstk,,jfnstk+1]	;prepare for a blt
	blt	a,jfnstk+stksiz-1	;clear the memory
	hrroi	a,[asciz\Sysbul>\]	;the prompt
	seto	rev,			;assume reverse listing
	call	dpromp##	;prompt the user
	movei	a,[flddb. .cmkey,,comtab,<Command,>]
	call	rfield		;read the returned field
	hrrz	a,(b)		;get the dispatch address
	setz	ff,		;zero the form feed flag
	call	(a)		;and execute the command
	crlf			;type a crlf after last line
	seto	a,		;close all files
	 jshlt			;can't
	jrst	nxtcmd		;go do the next command
Subttl	Exit command - leave the program

%Exit:	noise	<from program>	;for user comsumption
	confrm			;get the carriage return
	seto	a,		;close all files
	closf			;do the close
	 jserr			;error closing files
	haltf			;halt this fork
	jrst	sysbul		;restart address

Subttl	Help command - type the following message

%Help:	noise	<with Sysbul program>
	confrm			;await crlf
	hrroi	a,[asciz \Sysbul commands:

	EXIT (from program)
	HELP (output this message to terminal)
	LIST (of all sysbul titles to terminal)
	TYPE (sysbul <number> to terminal)	(or TYPE ALL)
	PRINT (sysbul <number> to <filespec>)	(or PRINT ALL)
	      (default specification is LPT:SYSBUL.LST)
	psout			;long literal - list in two parts
	hrroi	a,[asciz\
Switches available for LIST, TYPE ALL and PRINT ALL commands:
	/FORWARD to review sysbuls in chronological order
	/REVERSE to review them in reverse order  (default)
	psout			;type the help message
	ret			;and return
Subttl	List command - list all available sysbuls

%List:	noise	<of all SYSBULs>	;tell user what's going on
	call	getswt		;check for a switch
	movx	a,.priou	;terminal output
	hrrz	ojfn,a		;save the jfn
	movx	b,fld(7,of%bsz)!of%app	;write 7bit bytes
	openf			;open the file
	 jshlt			;no good
	call	fstfil		;set up the first file
	 ret			;it wasn't there

;Now loop for all files
%Li.a:	call	header		;setup the sysbul
	call	synops		;type the synopsis
	call	newfil		;and get next jfn
	 ret			;no more left
	jrst	%li.a		;loop for more
Subttl	Type and Print commands

;Type command
%Type:	noise	<Sysbul number or "ALL">	;tell user if asked
	movei	a,keyfld	;accept a number or "all"
	call	rfield		;get field
	hrrzs	c		;get address of table used
	caie	c,numfld	;was a number returned?
	 setz	b,		;no, use 0 for keyword "all"
	movem	b,sbn		;store the number
	movx	a,.priou	;terminal output
	hrrz	ojfn,a		;save the jfn
	movx	b,fld(7,of%bsz)!of%app	;write 7bit bytes
	openf			;open the file
	 jshlt			;no good
	setz	ff,		;clear the form feed flag
	jrst	output		;go to common routine

;Print command
%Prin:	noise	<Sysbul number or "ALL">	;tell user
	movei	a,keyfld	;get number or keyword "all"
	call	rfield		;get field
	hrrzs	c		;get address of table used
	caie	c,numfld	;was a number input?
	 setz	b,		;no, use 0 for keyword "all"
	movem	b,sbn		;store the number
	noise	<to file>	;explanation of next field
	movei	a,ospec		;command block
	call	rfield		;get spec
	hrrz	ojfn,b		;save the jfn
	hrrz	a,b		;get the jfn of the output file
	movx	b,fld(7,of%bsz)!of%app	;allow append access
	openf			;open the file
	 jshlt			;no good
	seto	ff,		;plan for form feed before each sysbul
	jrst	output		;continue with common routine
Subttl	Output routine for type and print

Output:	jumpe	sbn,outall	;if 0, do all sysbuls
	confrm			;confirm the command
	movx	a,gj%old!gj%sht	;old file
	hrr	a,sbn		;generation number
	hrroi	b,[asciz \sysbul:systems.bulletin\]
	gtjfn			;get a jfn
	 erjmp	outerr		;not available
	movem	a,jfn		;save it
	call	header		;setup the header
	call	synops		;do the synopsis
	call	conten		;follow up with the rest
	ret			;and return

;Here if the specified file didn't exist
Outerr:	tmsg	<?No such systems bulletin>
	crlf			;cr follows
	ret			;return to try again
;Here if we want all sysbuls done

Outall:	call	getswt		;check for switches
	call	fstfil		;get first file
	 ret			;wasn't there
Outa.a:	call	header		;title line
	call	synops		;synopsis
	call	conten		;and the rest
	call	newfil		;get next jfn
	 ret			;no more
	jumpn	ff,outa.a	;printing?
	hrroi	a,[asciz \

	psout			;type seperator to terminal
	jrst	outa.a		;and loop
Subttl	Delete and Enter commands

;Note that these commands are "secret" - ie not listed on a "?".

%Dele:	noise	<Sysbul number>	;user info
	movei	a,[flddb. .cmnum,,12]	;get a number
	call	cfield		;get and confirm field
	move	sbn,b		;save the number
	call	chkusr		;see if legal
	 ret			;it isn't
	movx	a,gj%old!gj%sht	;old file
	hrr	a,sbn		;get generation number
	hrroi	b,[asciz\sysbul:systems.bulletin\]
	gtjfn			;get a jfn for it
	 erjmp	outerr		;can't
	hrrzs	a		;clear left half
	tlo	a,(df%exp)	;expunge the file
	delf			;delete the file
	 jshlt			;can't
	ret			;return

;Enter a new systems bulletin
%New:	noise	<filename of new bulletin>	;tell user
	movei	a,[flddb. .cmifi]	;existing file
	call	cfield		;get the jfn
	hrrz	ojfn,b		;save it
	call	chkusr		;legal user?
	 ret			;it isn't
	movx	a,gj%fou!gj%sht	;new generation flag
	hrroi	b,[asciz\sysbul:systems.bulletin\]
	gtjfn			;get a jfn
	 jshlt			;can't
	hrrz	b,a		;get new jfn into b
	hrrz	a,ojfn		;and old into a
	rnamf			;rename the file
	 jshlt			;can't
	ret			;return
Subttl	Subroutines -- Sysbul output

;Output the title line
Header:	jumpe	ff,head.a	;are we printing or typing?
	hrrz	a,ojfn		;get output jfn
	movei	b,.chffd	;yes, output a form feed
	bout			;at top of sysbul
Head.a:	hrrz	a,ojfn		;get output jfn
	fmsg	<Sysbul No.>	;first part
	hrrz	a,ojfn		;selected output jfn
	hrrz	b,jfn		;get jfn
	movx	c,fld(1,js%gen)!js%cdr!js%tbp	;specific file info
	jfns			;type generation and date
	hrrz	a,jfn		;get jfn again
	movx	b,fld(7,of%bsz)!of%rd	;seven bit byte input
	openf			;open the file
	 jshlt			;no good
	crtab			;generate cr and tab
	ret			;return to caller

;Synopsis routine
Synops:	hrrz	a,jfn		;get the jfn
	bin			;get a byte
	jumpe	b,r##		;null means eof
	move	a,ojfn		;get output designator
	bout			;and print the byte
	cain	b,12		;line feed?
	 ret			;yes, do next
	jrst	synops		;and loop

;Contents printing routine
Conten:	hrrz	a,jfn		;get jfn
	bin			;get a byte
	jumpe	b,r##		;return when eof
	hrrz	a,ojfn		;output jfn
	bout			;output the byte
	jrst	conten		;and loop
Subttl	Subroutines -- Wild card JFN handling subroutines

;Initialize the first file
Fstfil:	movx	a,gj%old!gj%ifg!gj%sht!	;get first of many generations
	hrri	a,-3		;indicates first generation
	hrroi	b,[asciz \sysbul:systems.bulletin.*\]
	gtjfn			;get a jfn
	 ret			;can't
	movem	a,jfn		;save it
	jrst	fst.b		;join main stream

Fst.a:	gnjfn			;get next jfn
	 jrst	fst.c		;no more
Fst.b:	hrroi	a,string	;address of string
	hrrz	b,jfn		;jfn
	move	c,[fld(.jsaof,js%gen)!js%siz!js%tbp]
	jfns			;get generation
	hrroi	a,string	;string address back
	movei	c,12		;radix 10
	nin			;get number into b
	 jshlt			;can't
	push	j,b		;stack the generation number
	move	a,jfn		;get wildcard flags back
	jrst	fst.a		;loop until done

;Here when all sysbuls have stacked generation numbers
Fst.c:	movei	jptr,jfnstk+1	;address of first
	skipe	rev		;or do we want last instead?
	 hrrz	jptr,j		;get address of last
	jrst	newjfn		;get the jfn and return success

;Newfile routine - here to obtain next stacked jfn
Newfil:	hrrz	a,jfn		;get the current jfn
	closf			;close the file
	 jfcl			;don't worry about errors here
	addi	jptr,1		;assume forward order
	skipe	rev		;but check for reverse
	 subi	jptr,2		;it's reverse - go backwards

;Here to assign the jfn
Newjfn:	hrrz	a,(jptr)	;get the generation number
	jumpe	a,r##		;end of list if blank
	hrli	a,(gj%sht!gj%old)	;file flags
	hrroi	b,[asciz\sysbul:systems.bulletin\]
	gtjfn			;get the jfn
	 jshlt			;can't
	movem	a,jfn		;save the jfn
	retskp			;more to go
Subttl	Subroutines -- General purpose

;Check user subroutine
Chkusr:	gjinf			;get directory number in b
	hrroi	a,string	;where to write the info
	dirst			;translate number to string
	 jshlt			;no good
	hrroi	b,string	;base pointer
	hrroi	a,[asciz \PS:<SST.\]	;test pointer
	stcmp			;compare the strings
	txne	a,sc%sub	;is test string a subset of base?
	retskp			;yes, we're legal
	tmsg	<?Not privileged to enter or delete sysbuls>

;Getswt routine - check for switches on command lines
Getswt:	movei	a,swtfld	;field says switch or confirm
	call	rfield		;get the field
	hrrzs	c		;address of table used
	cain	c,swtfld	;was there actually a switch?
	 hrrz	rev,(b)		;yes, load the appropriate value
	txnn	a,cm%eoc	;was the line ended?
	 confrm			;nope, do it
	ret			;and return

;End of program
	end	Sysbul