perm filename SPASS[1,VDS] blob sn#334103 filedate 1978-02-16 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE SPASS
C00005 00003	SCAN FOR START OF DATA BLOCK AND THEN FILL TTY BUFFER
C00008 00004	PROCEDURES:  GETNME,GET6BT,GETCHR
C00010 00005	PROCEDURES:  PACK,PACKDN
C00013 00006	LOCAL STORAGE AREA
C00014 ENDMK
C⊗;
TITLE SPASS

;SPASS CAN BE USED TO TRANSFER SOURCE FILES FROM THE PDP10
;OVER A TTY PHONE LINE.  THE FILE IS SENT ONE CHARACTER AT A TIME.

;DEFINITIONS

P←17		;PUSH STACK POINTER
FILE←1		;DISK FILE CHANNEL
COUNT←4		;NUMBER OF BYTES LEFT IN BLOCK
OLDB←5		;OLD TTY BUFFER
NEWB←6		;NEW TTY BUFFER
TTYB←7		;TTY BUFFER BYTE POINTER
CHKSUM←10	;CHECK SUM
DMES←11		;DONE MESSAGE



;INITIALIZE PROGRAM AND INPUT DISK FILE

SPASS:	RESET
	MOVE	P,[XWD -50,PDL-1]	;INITIALIZE PUSH STACK
	OUTSTR	[ASCIZ /
SOURCE FILE PASSER PROGRAM
/]
	INIT	FILE,0		;INITIALIZE DISK CHANNEL
	SIXBIT	/DSK/
	IBUF
	HALT	.
	INBUF	FILE,4		;SET UP BUFFER RING

ASKNME:	OUTSTR	[ASCIZ /FILE NAME = /]
	PUSHJ	P,GETNME	;DECODE NAME TO SIXBIT
	SETZM	INAME+3		;USE THIS JOB'S PPN
	LOOKUP	FILE,INAME	;OPEN FILE FOR READING
	JRST	[  	OUTSTR [ASCIZ /***LOOK UP FAILED, TRY AGAIN**
/]
		   	JRST ASKNME ]
	
	OUTSTR	[ASCIZ /SKIP TITLE PAGE (Y,N) = /]
	INCHRW			;GET A CHARACTER
	CAIN	131
	JRST	SKIPPG
	CAIE	171
	JRST	NOSKIP
SKIPPG:	PUSHJ	P,GETCHR	;SKIP TO FIRST FORM FEED
	JRST	[	OUTSTR [ASCIZ /
FILE ONLY 1 PAGE LONG/]
			JRST EXXIT ]
	CAIE	14		;FORM FEED?
	JRST	SKIPPG		;NOPE

;CHANGE TTY CHARACTERISTICS

NOSKIP:	CLRBFI
	OUTSTR	[ASCIZ /
TYPE (CNTRL)G, STATE NEW FILE NAME AND TRANSFER WILL START./]
	SETOM	TTYBIT		;SAVE AND CHANGE TTY BITS TO
	GETLIN	TTYBIT		;  PASS EACH CHARACTER AS IS
	MOVE	TTYBIT
	TLZ	110010		;NO ARROW,NO FILL,TAB
	TLO	26		;FULL, NO ECHO
	SETLIN
	MOVE	[-1,,[026000,,1]] ;DONT CONVERT TO STANDARD ASCII
	TTYSET
;SCAN FOR START OF DATA BLOCK AND THEN FILL TTY BUFFER

	MOVEI	NEWB,OBUF1	;SET UP TTY BUFFER PTRS
	MOVEI	OLDB,OBUF2
	MOVEI	DMES,[ASCIZ /
[FATAL] CATCHER TERMINATED TRANSFER BEFORE END OF FILE 
/]
	MOVE	TTYB,[POINT 7,0];FORM BYTE PTR
	HRRI	TTYB,(NEWB)
	MOVEI	1,177		;MARK START WITH BS CHAR
	IDPB	1,TTYB
	MOVEI	COUNT,=513	;NUMBER OF CHARS TO PUT INTO BUFFER
	SETZ	CHKSUM,		;RESTART CHECKSUM

SCAN:	PUSHJ	P,GETCHR	;GET A CHARACTER
	JRST	EOF

;MAP CHARACTERS

MAP:	CAIN	0		;IGNOR NULLS
	JRST	SCAN

	CAIG	37		;CONTROL CHAR?
	JRST	[ CAIN 14	;FORM FEED?
		  JRST 	[ MOVEI 3
			  JRST FPACK]
		  CAIN 11	;TAB?
		  JRST	[ MOVEI 4
			  JRST FPACK]
		  CAIL 12	;ELSE 12 TO 15 MAP STRAIGHT THRU
		  JRST	[ CAIG 15
			  JRST FPACK
			  JRST CNTRL]
CNTRL:		  CAIN 30	; 30 → 137
		  JRST	[ MOVEI 137
			  JRST FPACK]
		  CAIN 31	; →  → =
		  JRST	[ MOVEI 75
			  JRST FPACK]
		  CAIN 32	; 32 → 176
		  JRST	[ MOVEI 176
			  JRST FPACK]
		  CAIN 33	; ≠  → /=
		  JRST	[ MOVEI 57
			  PUSHJ P,PACK
			  MOVEI 75
			  JRST FPACK]
		  CAIN 34	; ≤  → <=
		  JRST	[ MOVEI 74
			  PUSHJ P,PACK
			  MOVEI 75
			  JRST FPACK]
		  CAIN 35	; ≥  → =>
		  JRST	[ MOVEI 75
			  PUSHJ P,PACK
			  MOVEI 76
			  JRST FPACK]
		  CAIN 36	; ≡  → =
		  JRST	[ MOVEI 75
			  JRST FPACK]
		  MOVE 3,0	;ALL OTHERS ARE ↑
		  MOVEI 136
		  PUSHJ P,PACK
		  MOVE 3
		  ADDI 100
		  JRST FPACK   ]
	CAIN	175
	MOVEI	33
	CAIN	176
	MOVEI	175

FPACK:	PUSHJ	P,PACK
	JRST	SCAN		;SUCCESS RETURN
	JRST	PASSDN


EOF:	PUSHJ	P,PACKDN

;EXIT CLEANLY

PASSDN:	RELEAS 	FILE,		;CLOSE DISK FILE
	SETLIN	TTYBIT		;RESET TTY BITS TO AS BEFORE
EXXIT:	EXIT
;PROCEDURES:  GETNME,GET6BT,GETCHR

GETNME:	MOVE	1,[POINT 6,INAME]  ;PACK 6 BIT NAME
	SETZM	INAME
SPACES:	PUSHJ	P,GET6BT	;IGNOR LEADING SPACES
	JRST	SAVCHR
	JUMPE	SPACES
	JRST	GETNDN

SAVCHR:	IDPB	1		;SAVE A CHARACTER OF THE NAME
	PUSHJ	P,GET6BT	;NEXT SIXBIT CHAR
	JRST	SAVCHR		;LEGAL CHAR
	SETZM	INAME+1		;PACK EXTENSION IN HERE
	MOVE	1,[POINT 6,INAME+1]
	CAIN	16		;"." SEPARATES NAME AND EXT
	JRST	CHKEXT
	JRST	GETNDN

SAVEXT:	IDPB	1		;SAVE EXTENSION CHAR
CHKEXT:	PUSHJ	P,GET6BT
	JRST	SAVEXT

GETNDN:	CLRBFI
	POPJ	P,


GET6BT:	INCHWL			;GET A CHARACTER
	TRZ	40		;CONVERT ASCII TO SIXBIT
	TRZE	100
	TRO	40
	CAIGE	20		;SKIP RETURN IF NOT 0 TO Z
	AOS	(P)
	CAILE	72
	AOS	(P)
	POPJ	P,		;RETURN



GETCHR:	SOSG	IBUF+2		;NEED A NEW BUFFER?
	IN	FILE,		;YES, TRY READING SOME MORE
	JRST	CANGET
	STATZ	FILE,20000	;IN FAILED, EOF?
	POPJ	P,		;YES
	OUTSTR	[ASCIZ /
[FATAL] DISK INPUT ERROR/]
	POPJ	P,

CANGET:	ILDB	IBUF+1		;GET A CHARACTER
	AOS	(P)		;TAKE SUCCESS RETURN
	POPJ	P,
;PROCEDURES:  PACK,PACKDN

PACKDN:	MOVEI	2		;MARK END OF FILE
	PUSHJ	P,PACK
	SETZ	COUNT,		;SEND OUT PARTIAL BUFFER
	PUSHJ	P,PACK
	MOVEI	DMES,[ASCIZ /
FILE TRANSFER COMPLETED/]
	INCHRW	1
	JRST	FINCMD


PACK:	SOJG	COUNT,PACK3	;ANY ROOM LEFT IN BUFFER?

	MOVEI	1,(CHKSUM)	;NO, SEND OFF BUFFER
	ASH	1,-=10		;FINISH OFF WITH CHECKSUM
	TRZ	1,777740
	ADDI	1,100
	IDPB	1,TTYB
	MOVEI	1,(CHKSUM)
	ASH	1,-5	
	TRZ	1,777740
	ADDI	1,100
	IDPB	1,TTYB
	MOVEI	1,(CHKSUM)
	TRZ	1,777740
	ADDI	1,100
	IDPB	1,TTYB
	SETZ	1,		;MARK END OF TTY BUFFER
	IDPB	1,TTYB

ASKCMD:	INCHRW	1		;WHAT DO WE DO NOW?
	CAIN	1,"G"		;G → TYPE NEW TTY BUFFER
	JRST	[	OUTSTR (NEWB)
			JRST PACK2   ]
FINCMD:	CAIN	1,"C"		;C → CHECK SUM ERROR, TYPE OLD BUFFER AGAIN
	JRST	[  	OUTSTR (OLDB)
		   	JRST ASKCMD  ]
	CAIN	1,"D"		;D → END OF TRANSFER
	JRST	[	OUTSTR (DMES)
			JRST PACKER  ]
	CAIE	1,"F"		;F → FATAL ERROR, TERMINATE
	JRST	[  	OUTSTR  [ASCIZ /
[FATAL ERROR] UNEXPECTED RESPONSE FROM TTY/]
			JRST PACKER  ]
	JRST	PACKER

PACK2:	EXCH	NEWB,OLDB	;START FILLING NEW TTY BUFFER
	MOVE	TTYB,[POINT 7,0];FORM BYTE PTR
	HRRI	TTYB,(NEWB)
	MOVEI	1,177		;MARK START WITH BS CHAR
	IDPB	1,TTYB
	MOVEI	COUNT,=512	;NUMBER OF CHARS TO PUT INTO BUFFER
	SETZ	CHKSUM,		;RESTART CHECKSUM

PACK3:	ADD	CHKSUM,0
	IDPB	TTYB
	POPJ	P,		;SUCCESS RETURN

PACKER:	AOS	(P)		;ERROR RETURN
	POPJ	P,
;LOCAL STORAGE AREA

IBUF:	BLOCK	3	;INPUT BUFFER POINTER

TTYBIT:	0		;INITIAL TTY STATUS BITS

INAME:	BLOCK	4	;FILE NAME,EXTENSION,0,PPN

OBUF1:	BLOCK	=200 	;TTY OUTPUT BUFFERS
OBUF2:	BLOCK	=200

PDL:	BLOCK 	50	;PUSH STACK

END SPASS