Trailing-Edge - PDP-10 Archives - mit_emacs_170_teco_1220 - emacs/maichk.mid
There are no other files named maichk.mid in the archive.
title maichk

;This program gets loaded into a TECO buffer and executed
;to check for the existence of new mail.
;We don't know where in core we will be,
;but the address of the start of our code (S) will be in AC 5.

;Use the SHRINK file on MAICHK.EXE to create a MAICHK.CODE file
;containing a core image which TECO can load.

	ascii	/Start/		; for SHRINK
S:				; Everything offset from S to make this code
				; position-independent
START:	SKIP			; convention for emacs code
	JRST	REALSTART-s(5)	; skip over scratch area
result:	block	16

	MOVEM	3,callarg-s(5)	; ac3 contains arg.  nonzero means explicit
	movei	1,result-s(5)	; point at username caller passed us
	hrli	1,440700
	move	2,1
	ildb	3,1		; is it null?
	movem	3,explicitdir-s(5)	; note it
	jumpn	3,gotit-s(5)	; no, use it as the dir
	SKIPE	INIT-s(5)	; Have we created the user's dirnam?
	 jrst	GOTSTRING-s(5)	; yup, skip initialization
	GJINF			; info: login dir is in ac1
	move	2,1
	hrroi	1,Username-s(5)	; point to block to keep dir
	dirst			; fill in directory string: ptr in ac1, dir in
				; ac2; updates ptr in 1
	 jrst	fail-s(5)
	setom	init-s(5)	; done with initialization
	hrroi	2,username-s(5)	; point at default username

gotit:	movem	2,jfndir-s(5)	; put ptr to dir in jfnblk
	hrroi	2,msgtxt-s(5)	; ptr to "mail.txt.0"
	movei	1,jfnblk-s(5)	; point at block
	gtjfn			; get mail jfn in ac1
	 jrst	fail-s(5)
	movei	2,fdblk-s(5)	; address of argument block
	movei	3,4		; and its length
	rftad			; read in the dates on jfn in 1
	hrli	1,1		; flag to get last writer of file
	move	2,pauth-s(5)	; and a place to store string
	gfust			; and get the string
	setz	3,
	idpb	3,2		; and add a null at the end of the name
	rljfn			; get rid of jfn
	move	2,written-s(5)
	camg	2,read-s(5)	; write > read ?
	 jrst	nope-s(5)	; nope, no new mail
	skipe	explicitdir-s(5) ; did caller default dir?
	 jrst	newmail-s(5)	; no, we don't have dates stored for it
	skiple	callarg-s(5)	; explicit arg passed?
	 jrst	notemail-s(5)	; yes, so always say something
	camg	2,lastmail-s(5)	; more recent than last we checked?
	 jrst	nope-s(5)	; nope, don't bother repeating ourselves
	movem	2,lastmail-s(5)	; update last noticed date
	move	1,prslt-s(5)	; get the pointer to the result string into 1
	move	2,pstr1-s(5)	; "mail waiting"
	pushj	17,copystr-s(5)
	move	2,written-s(5)	; date written
	hrlzi	3,400301	; format: time only, no seconds, do am/pm
	move	2,pstr2-s(5)	; " from "
	pushj	17,copystr-s(5)
	move	2,pauth-s(5)	; "author"
	pushj	17,copystr-s(5)
	move	2,pstr3-s(5)	; terminating str
	pushj	17,copystr-s(5)
nope:	setzm	result-s(5)	; blank result to show failure
	popj	17,

fail:	move	1,prslt-s(5)	; pointer to result area
	move	2,fail1-s(5)	; .fhslf,,most recent error
	move	3,fail2-s(5)	; -ve of max length to transfer,,0
	erstr			; and get the error string
	move	2,pstr4-s(5)	; and add a crlf
	pushj	17,copystr-s(5)
	popj	17,

copystr:			; come here to copy str from ac2 to ac1.
				; smashes ac3
lp:	ildb	3,2
	skipg	3
	 popj	17,		; return when we hit null byte
	idpb	3,1
	jrst	lp-s(5)

JFNBLK:				; Table for long GTJFN
	100000,,0		; flags = old file ,, vers = 0
	377777,,377777		; jfn pair for input,,output
	440700,,devstr-s(5)	; pointer to device string (assume PS:)
jfndir:	0			; dir
	0			; name.  Leave this null and pass in 2
	0			; extension
	0			; protection
	0			; acct
	0			; silliness

devstr:	asciz	/PS:/
	block 2
read:	0
written: 0
lastmail: 0
init:	0
explicitdir: 0			; true if caller passed a dirname
callarg: 0			; true if caller gave explicit arg
author:	block 8			; place to store last writer
pauth:	440700,,author-s(5)	; point to last writer string
prslt:	440700,,result-s(5)	; pointer to the result buffer
username: block 8		; store login username here
msgtxt: asciz /MAIL.txt.0/
fail1:	400000,,-1		; args for erstr jsys
fail2:	-75.,,0			; as above
pstr1:	440700,,str1-s(5)
pstr2:	440700,,str2-s(5)
pstr3:	440700,,str3-s(5)
pstr4:	440700,,str4-s(5)
str1:	asciz	/[Mail waiting - /
str2:	asciz	/ from /
str3:	asciz	/]
str4:	asciz	/
	asciz	/Stop/

TEST:	hrroi	1,[asciz /User: /]
	hrroi	1,result
	movei	2,40		; max input length
	setz	3,		; no fanciness
	RDTTY			; read string
	setz	3,
	dpb	3,1		; smash terminator with null
	movei	3,1		; always pass arg
	MOVEI	5,start
	movei	17,stack
	pushj	17,start
	skipn	result
	hrroi	1,result

stack:	block 4

	end 	test