Trailing-Edge - PDP-10 Archives - decuslib20-08 - decus/20-0177/micom.mac
There are no other files named micom.mac in the archive.
;Edit number 7 by SST.D-BIGELOW on 19-Mar-84
;	Make program be wheel-only.
;Edit number 6 by SST.D-BIGELOW on  8-Mar-84
;	Add new command to select Micom port, and don't ask with each manual
;	load.
;Edit number 5 by SST.D-BIGELOW on  6-Mar-84
;	Change delay time to four seconds and take explicit terminal number
;	out of help message.
;<SST.D-BIGELOW>MICOM.MAC.53, 20-Jan-84 11:08, Edit by SST.D-BIGELOW
; 4	Change delay time to six seconds and correct error in timer routine.
;<SST.D-BIGELOW>MICOM.MAC.51, 19-Jan-84 11:34:01, Edit by SST.D-BIGELOW
; 3	Change response I/O to use SIN% with timer interrupt catching the
;	last response.	Also set interrupt system and temporary high priority.
;<SST.D-BIGELOW>MICOM.MAC.43, 18-Jan-84 16:18:28, Edit by SST.D-BIGELOW
; 2	First working version of program.
Subttl	Program Initialization

Search	Symbol				; Universal file for symbols
Sall					; Supress macro expansion

;Version information
	Vmajor==1			; Major version
	Vminor==0			; Minor version
	Vedit==7			; Edit number
	Vcust==4			; WCC edit code


.TTL.	Micom, Program to control the MICOM port contender


;Program feature test switches

	Use	Comman			;Comnd jsys routines
	Omit	Memory			;no need for memory management
	Omit	Sorter			;or sorting either
	Omit	String			;no string package

	Include F..UUO			; Local uuo features
					; If included, requires UUOCON.REL

;*			===   Abstract	 ===
;* Written by SST.D-BIGELOW on 17-Jan-84
;* Description: This program downloads the Micom port selector from a file on
;*	the DEC-20.  The program may be used interactively or through input
;*	and output files.
;Symbols and storage

Switch	F.Term				;input from terminal
Switch	F.Timo				;timeout encountered

Delay==^D4000				;6.0 second pause
Strlen==300				;length of strings

Ifile:	block	1			;input file
Ofile:	block	1			;output file
Mdev:	block	1			;micom device
Intmsk: block	1			;interrupt mask word
Intblk: block	3			;interrupt levels
Stak..: block	stksiz			;standard stack
Txtlin: block	strlen/5+1		;input line storage


Micdev:	asciz	/TTY100:/		;default terminal

Pmttxt: asciz	.Micom cmd--.		;input from tty

;Comnd parsing blocks

Keyfld: flddb.	.cmkey,,keytab,<Command,>

Keytab: xwd	keylen,keylen
	cmdt	Auto-load,,.auto	;automatically load w/o dialog
	cmdt	Exit			;exit command
	cmdt	Help			;program help
	cmdt	Manual-load,,.man	;manually load
	cmdt	Port			;command to set micom port

;Priority interrupt storage

Chntab: xwd	1,ctrlc 		;channel 1 for control-C
	xwd	2,timint		;channel 2 for timer interrupts

Levtab: exp	intblk,intblk+1,intblk+2
Subttl Start of main program

Micom:	reset%
	cmdstk				;initialize cmd stack
	setzb	f,p1			;initialize flags and line counter
	setzm	mdev			;no micom device yet
	print	asc<Micom %V%C> 	;type version
	movei	a,.fhslf		;set this fork's capabilities
	rpcap%				;read them first
	txnn	c,sc%whl	 	;must be able to set wheel
	 noerr	(<? Insufficient capabilities to run program>,EXIT)
	call	inipi			;set interrupts
	call	setpri			;set job priority

;Prepare for commands

Noprom: prompt	asc<Micom-->		;use stored micom prompt above

Getkey: rfield	keyfld			;get a keyword
	hrrz	a,(b)			;get the dispatch address
	call	(a)			;and go to it
	jrst	noprom			;and loop
Subttl Help command and Exit command

.Help:	noise	asc<with program commands>
	confrm				;confirm the command
	print	asc<%CMicom %V%C>	;version typout
	hrroi	a,hlpmes		;get help message
	ret				;done

.Exit:	noise	asc<from program>
	confrm				;confirm the command
Exit2:	call	clrpri			;clear priority
	call	dispi			;disable pi system
	haltf%				;done
	 jrst	micom			;if continued

;Help message storage

Hlpmes: asciz	\
Micom loading commands:

	Auto	Load Micom from file SYSTEM:MICOM.COMMANDS, sending responses
		to file SYSTEM:MICOM.RESPONSES, using standard line for
		Micom command port.  Exit when finished.

	Manual	As above, but command file and response file are specified in
		the command line.  For interactive Micom configuration, use:
		     Micom-- MANUAL TTY: TTY: <cr>

	Exit	Terminate program.

	Help	Type this message.

	Port	Select TTY port to be used for Micom commands.

Subttl	Port selection

.Port:	noise	asc<to use for Micom commands is>
	cfield	[flddb. .cmfil,cm%sdh,,<TTY device>]
	movem	b,mdev			;store it
	move	a,b			;copy it
	dvchr%				;get characteristics
	ldb	a,[point 9,b,17]	;get proper bits
	cain	a,.dvtty		;tty?
	 ret				;yes, return for next command
	print	asc<%QPort specifier must be of the form TTYn:%C>
	move	a,mdev			;get device
	rljfn%				;release the jfn
	 erjmp	.+1			;ignore errors
	setzm	mdev			;clear port word
	ret				;done
Subttl Auto mode handling

.Auto:	noise	asc<using standard control files>
	confrm				;confirm command
	movx	a,gj%sht!gj%old 	;input
	hrroi	b,infile		;existing filename
	gtjfn%				;get jfn
	 dblerr (<Can't open input file>,JUMP,exit2)
	movem	a,ifile 		;store it
	movx	a,gj%sht!gj%fou 	;output
	hrroi	b,outfil		;new filename
	gtjfn%				;get jfn
	 dblerr (<Can't open output file>,JUMP,exit2)
	movem	a,ofile 		;store jfn

;Now rejoin manual code
	jrst	loadit
Subttl Manual mode questions

;Ask a series of questions about where to read from and write to.

.Man:	noise	asc<from input file>
	rfield	[flddb. .cmifi,cm%sdh,,<File containing Micom commands>]
	movem	b,ifile 		;store jfn
	noise	asc<writing responses to>
	cfield	[flddb. .cmofi,cm%sdh,,<File to contain Micom responses>]
	movem	b,ofile 		;store jfn
	move	a,ifile 		;get input jfn
	dvchr%				;get characteristics
	ldb	a,[point 9,b,17]	;pick up device code
	cain	a,.dvtty		;tty?
	 flgon	f.term			;yes, flag for later

;Now we can proceed.  No user intervention from this point unless TTY:
; was specified as the input device.

Loadit: ifoff.	f.term			;input from terminal?
	  move	  a,ifile		;input file
	  movx	  b,fld(7,of%bsz)!of%rd
	  openf%			;open the file
	   dblerr (<Can't open input file>,JUMP,exit2)
	move	a,ofile 		;output file
	movx	b,fld(7,of%bsz)!of%wr
	openf%				;open the file
	 dblerr (<Can't open output file>,JUMP,exit2)
	skipe	a,mdev			;device set for micom?
	ifskp.				;no, get one
	  movx	a,gj%sht!gj%old		;flags
	  hrroi	b,micdev		;standard device
	  gtjfn%			;get a jfn
	   dblerr (<Can't obtain Micom port JFN>,JUMP,exit2)
	  movem	a,mdev			;store jfn
	movx	b,fld(.gsimg,of%mod)!fld(7,of%bsz)!of%rd!of%wr
	openf%				;open the device
	 dblerr	(<Unable to open Micom command port>,JUMP,exit2)
	skpon	f.term			;terminal mode?
	 jrst	getfil			;nope
	type	<Please type ^Z when finished entering commands>
Subttl Read input file lines

Micsnd: skpon	f.term			;terminal input?
	 jrst	getfil			;no, get from file
Gettrm: type				;blank line first
	hrroi	a,pmttxt		;prompt
	move	c,a			;copy for rescan buffer
	psout%				;type it
	hrroi	a,txtlin		;point to text input buffer
	movx	b,rd%brk!rd%bel!strlen	;end on ^Z or return
	rdtty%				;read from terminal
	 dblerr (<Please retry>,JUMP,gettrm)
	txne	b,rd%btm		;break char ended it?
	 jrst	gtt.a			;yes, next check which one
	movei	a,.cttrm		;clear input buffer
	type	<% Line too long, please retry...>
	jrst	gettrm			;try again

;Check for a ^Z
Gtt.a:	ldb	b,a			;get terminating character
	cain	b,"Z"-100		;control-Z?
	 jrst	eof			;yes, done
	jrst	sndlin			;no, send the line to the micom
;Here to read from a file

Getfil: aoj	p1,			;count lines
	move	a,ifile 		;get jfn
	hrroi	b,txtlin		;point to buffer
	movei	c,strlen		;number of characters to read
	movei	d,12			;ending on a lf
	sin%				;read a line
	 erjmp	eofchk			;check for eof
	jumpn	c,sndlin		;non-zero if properly terminated

;Here if we read until string ran out without a lf
	print	p1,asc<%PInput line %N too long -- discarded%C>
	move	a,ifile 		;get jfn
	setz	b,			;output to nul:
	movei	c,-1			;large number
	movei	d,12			;read to lf
	sin%				;read rest of line and discard
	 erjmp	eof			;assume error means eof
	jrst	getfil			;try the next

;Check for eof here

Eofchk: move	a,ifile 		;get jfn
	gtsts%				;status
	txne	b,gs%eof		;end of file?
	ifskp.				;nope, error
	  print a,asc<%QError reading file %J -- %E%C>
	  jrst	eof			;done
	caie	c,strlen		;did we input anything?
	 print	asc<%PMissing CRLF on last input line, not sent...%C>

;End of input file

Eof:	move	a,ifile 		;input files
	closf%				;close all files
	 erjmp	.+1			;ignore errors
	move	a,ofile 		;output file
	closf%				;close that one
	 dblerr (<Can't close response file>,AUTO)
	jrst	exit2			;quit
Subttl Sndlin - Send the text line to the Micom

;An optional between-character delay may be inserted at the end of this
;  routine if there develops a problem with force-feeding the Micom.

Sndlin: move	t1,[point 7,txtlin]	;pointer to text
	ildb	b,t1			;get first char
	caie	b,"!"			;comment line?
	 jrst	snd.a+1 		;no, send this line
	move	a,ofile 		;output file
	hrroi	b,txtlin		;point to text
	movei	c,strlen		;max length
	movei	d,12			;ending on a lf
	sout%				;send comment line to output file
	jrst	micsnd			;and get next input

Snd.a:	ildb	b,t1			;get a char
	cain	b,12			;line feed?
	 movei	b,15			;make it a cr
	move	a,mdev			;micom line
	bout%				;send it
	cain	b,15			;final cr?
	 jrst	getrsp			;yes, get response
	jrst	snd.a			;now do next
Subttl Getrsp - Get response from Micom

;Now get the response.	This algorithm allows the Micom to send as much as
;  it wishes, until enough time goes by without any data activity.  When a
;  SIN% is terminated by a timer interrupt, we are done.  Allow (delay)
;  seconds per input line, at least.

Getrsp: flgoff	f.timo			;no timeout yet
	move	a,[.fhslf,,.timel]	;elapsed timer
	movei	b,delay 		;delay time
	movei	c,1			;channel one
	 dblerr (<Can't set timer interrupt>,JUMP,exit2)
	move	a,mdev			;micom device
	hrroi	b,txtlin		;where to put input
	movei	c,strlen		;max size
	movei	d,12			;until lf
	sin%				;read a line

;INTPC is a sacred location!  The timer interrupt trap looks for a PC set
;  to this location and sets monitor to user mode if there, causing us to
;  return from a SIN which never terminated.

INTPC:	 jfcl				;wait here

	move	a,[.fhslf,,.timal]	;remove all requests
	timer%				;done
	 erjmp	.+1			;ignore errors

	move	a,ofile 		;output jfn
	hrroi	b,txtlin		;text
	subi	c,strlen		;create negative number of chars read
	jumpe	c,micsnd		;done, next line
	sout%				;send the line
	skpoff	f.timo			;timed out?
	 jrst	micsnd			;yes, next line
	jrst	getrsp			;no, so get next input line
Subttl Interrupt processing routines

;Here to intercept a ^C

Ctrlc:	push	p,a			;save accumulators
	push	p,b
	push	p,c
	push	p,d
	call	clrpri			;clear our priority setting
	haltf%				;and exit

;If continued..

	call	setpri			;set priority again
	pop	p,d			;restore acs
	pop	p,d
	pop	p,b
	pop	p,a
	debrk%				;dismiss the interrupt

;Here for a timer interrupt

Timint: push	p,a			;save an ac
	hrrz	a,intblk+1		;get interrupt pc from location two
	caie	a,intpc 		;are we at interrupt pc?
	ifskp.				;yes
	  flgon f.timo			;timeout encountered
	  movx	a,1B5			;user mode bit
	  iorm	a,intblk+1		;set user mode to return
	pop	p,a
	debrk%				;and dismiss
Subttl Job Priority Setting routiness

;Here to set high priority

Setpri: gjinf%				;get our job number
	move	a,c			;copy into a
	movei	b,jp%sys		;make us a temporary system job
	sjpri%				;set job priority
	 erjmp	.+1			;ignore errors

;Here to clear it

Clrpri: gjinf%				;get our job number
	move	a,c			;copy into a
	setz	b,			;clear assignments
	sjpri%				;set job priority
	 erjmp	.+1			;ignore errors
Subttl Priority Interrupt System routines

;Routine to initialize the pi system

Inipi:	movei	a,.fhslf		;init levtab and chntab
	move	b,[levtab,,chntab]
	movei	a,.fhslf		;turn on desired channels
	movx	b,1B0!1B1		;channels 0 and 1
	movei	a,.fhslf		;enable interrupt system
	movei	a,.fhjob		;job code
	movem	b,intmsk		;save mask
	movx	b,1B3			;control-C
	 erjmp	.+1			;ignore errors
	move	a,[3,,0]		;enable for control-c
	ati%				;to channel zero
	 erjmp	.+1			;ignore errors
	ret				;done

;Routine to disable the pi system

Dispi:	movei	a,.fhslf		;disable the pi system
	movei	a,.fhjob		;this job
	move	b,intmsk		;interrupt mask
	stiw%				;reset terminal interrupt mask
	 erjmp .+1
	movei	a,.fhslf		;disable all channels
	movei	b,0
	ret				;done

;End of program

	end	micom