perm filename PK[1,2]7 blob sn#156420 filedate 1975-04-17 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE PK
C00009 00003	DEVNAM←←0
C00015 00004	BUFPNT:	MOVE E,DEVCHR(DDB)
C00023 00005	SIXOUT:	MOVEI C,6
C00025 00006	CHRTBL
C00031 ENDMK
C⊗;
	TITLE PK

A←1
B←2
C←3
D←4
E←5
F←6
G←7
H←10
Z←11
DAT←12
SPACE←13
DDB←14
PTR←15
I←16
P←17

CR←←15  LF←←12  TAB←←11  BS←←177  ALT←←175

APLINE←←12  ;ASSOCIATED PRESS LINE NUMBER
NYLINE←←13  ;NY TIMES LINE NUMBER

PDLLEN←←100

TTYTAB←←220
LINTAB←←302
PTYJOB←←270
JOBNAM←←225

INTTTY←←20000	;LEFT HALF INTERRUPT BIT FOR TTY INPUT

DEFINE PEEK(AC,ADDR)
<	MOVEI AC,ADDR
	CALLI AC,33	;peekuuo
>

LOC 124
REE
RELOC

PDL:	BLOCK PDLLEN
LINNBR:	-1
CONVRT:	-1 ;FLAG: 0 MEANS DON'T CONVERT AP/NYT LINES TO ASCII, -1 MEANS DO CONVERT
APNYTF:	0  ;FLAG: 0 MEANS NOT DOING AP OR NYT LINE OR NOT CONVERTING
	   ;     -1 MEANS CONVERTING AP OR NYT.

INTRPT:	DISMIS			;SIMPLE INTERRUPT MODULE

	JRST FLIP		;START AT SA-1 TO INVERT AP/NYT CONVERSION FLAG
STRT:	SETOM CONVRT		;DEFAULT IS CONVERT AP/NYT LINES TO ASCII
START0:	SETOM LINNBR		;NEVER DONE INITIALIZATION
	RESET
	MOVEI A,INTRPT
	MOVEM A,JOBAPR↑		;INTERRUPT MODULE'S ADDRESS
	OUTSTR[ASCIZ/TTY #?/]
STRT11:	SETZM WHOFLG
	PEEK A,221		;get numbers of: teletypes, IIIs, DDs, PTYs
	MOVE B,[POINT 9,A]
	SETZM MAXTTY#
	ILDB C,B
	ADDM C,MAXTTY		;add up total number of TTYs
	TLNE B,770000
	JRST .-3
	movni	a,1
	setprv	a,
	tlnn	a,1
	exit
	SETZ A,
	INWAIT			;WAIT FOR LINE TO BE TYPED
	SNEAKW B,
	CAIN B,15
	JRST NOTNBR		;IF CRLF, JUST EXIT
INLOP:	INCHWL B		;read in TTY number
	CAIN B,15
	JRST INLOP
	CAIL B,"0"
	CAILE B,"7"
	JRST LAST
	IMULI A,10
	ADDI A,-60(B)
	JRST INLOP
LAST:	CAMGE A,MAXTTY
	CAIE B,12
	JRST [	CLRBFI
		OUTSTR[ASCIZ/HO HO!
/]
		JRST STRT]
	MOVEM A,LINNBR		;SAVE TTY LINE NUMBER
REWHO0:	SETZM APNYTF		;ASSUME NOT CONVERTING AP/NYT TO ASCII
	SKIPN CONVRT		;WANT TO CONVERT?
	JRST REWHO		;NO
	CAIE A,APLINE		;IS THIS AP LINE?
	CAIN A,NYLINE
	SETOM APNYTF		;YES, SET FLAG
REWHO:	MOVEM	A,TABENT#
	MOVEM	A,LINENT#
	MOVE	SPACE,A
	TTYJOB	SPACE,		;JOB NUMBER OF USER
	HRLZI	SPACE,(SPACE)
	HRRI	SPACE,WHOLIN	;SO SPW CAN DO WHO UUO WITH OUR AC SPACE
	MOVSI	DDB,INTTTY	;INTERRUPT BIT SPW WILL USE TO GENERATE INTERRUPT
	HLROM	SPACE,WHOFLG#	;FLAG SPW WE ARE READY

	SUBI A,121
	MOVEM A,PTYENT#
	PEEK A,TTYTAB
	ADDM A,TABENT		;LOC OF TTYTAB ENTRY FOR TTY OF INTEREST
	PEEK A,LINTAB
	ADDM A,LINENT		;LOC OF LINTAB ENTRY
	PEEK A,PTYJOB
	SKIPGE PTYENT		;SKIP IF TTY IS NOT A PTY
	JRST REE
	ADDM A,PTYENT
	PEEK A,JOBNAM
	MOVEM A,JOBTAB#
REE:	PEEK A,37		;GET RMEMSIZ-1
	HRLZ A,A
	JUMPGE A,.+2
	HRRI A,540000
	SETPR2 A,
	HALT STRT
	MOVEI A,-400000(A)
	MOVNM A,TENADR#
	SPCWAR 'SSW'
	SETZM YET
	SETZM DONE
	SETO A,
	GETLIN A
	CAME A,[-1]
	TLNN A,420000
	JRST [	SETOM NODPY#
		MOVEI A,=69
		MOVEM A,MAXCOL		;SET MAX LINE LENGTH
		SETZM MINCOL		;NO MIN LINE LENGTH ON TTYS
		MOVE A,[400000,,SPW]	; WE ARE ON A TELETYPE--DO IT ONLY ONCE
		SPCWGO A,
		OUTSTR CRLF
		OUTSTR WHOLIN
		OUTSTR HEADER
		OUTSTR TEXT
		EXIT]
	SETZM NODPY		;NODPY INDICATES KIND OF TTY WE ARE ON:
	TLNE A,20000		; -1 FOR TELETYPES, 0 FOR IIIs, <0,,-1> FOR DDs
	HLLOS NODPY
	MOVEI A,=82
	MOVEM A,MAXCOL#		;SET MAX LINE LENGTH
	MOVEI A,10
	SKIPG NODPY
	MOVEI A,7		;7 FOR IIIs, 8 FOR DDs
	MOVEM A,MINCOL#		;SET MIN LINE LENGTH
	SKIPE NODPY
	JRST [	MOVE A,DDWRD1	;WE ARE ON A DD--SET UP CMD WORDS
		MOVEM A,DPYBUF
		MOVE A,DDWRD2
		MOVEM A,LINSET
		JRST WRDDON]
	MOVE A,IIIWRD		;WE ARE ON A III--SET UP POSITION WORD
	MOVEM A,LINSET
WRDDON:	MOVE A,[400017,,SPW]
	SPCWGO A,		;START SPACEWAR ON PDP-10
	PPACT 0			;SHUT OFF PAGE PRINTER
;	SKIPE NODPY
;	JRST WRDD1
;	DPYSIZ 2002
;	DPYPOS -600
WRDD1:	MOVSI	A,INTTTY
	INSKIP	1		;Don't wait if line already typed
	IENBW	A,		;WAIT AT INTERRUPT LEVEL UNTIL TTY INPUT

	SPCWAR	'SSW'		;STOP SPACEWAR PROCESS
	SETZM	A,
	SLEEP	A,
	SKIPE	DONE		;MAKE SURE ALL DD TRANSFERS HAVE FINISHED
	JRST	.-2

	MOVE	A,LINNBR	;SET UP LINE NUMBER OF TTY WE ARE PEEKING
	SNEAKS			;SKIP IF ANY CHARACTER
	JRST	REWHO
	ANDI	177
	CAIL	"0"
	CAILE	"9"
	JRST	.+2
	JRST	STRT11		;HE TYPED ANOTHER TTY NUMBER
	CAIE	ALT
	CAIN	LF
	JRST	READ1
	CAIE	CR
	JRST	READ0
NOTNBR:	INCHRW			;READ CR
READ1:	INCHRW
READ0:	PPSEL	0
	PGACT	0
	EXIT	1,
FLIP1:	SKIPL	A,LINNBR	;SKIP IF NEVER INITIALIZED
	JRST	REWHO0
	JRST	START0

FLIP:	SETCMM	CONVRT		;INVERT FLAG FOR CONVERSION OF AP/NYT LINES TO ASCII
	JRST	FLIP1
DEVNAM←←0
DEVCHR←←1
DEVIOS←←2
DEVMOD←←4
DEVLOG←←5
DEVBUF←←6
ACTBTS←←11
TTIBUF←←16
TTOBUF←←25
TISYNC←←24

BUF←←0
PUTR←←1
TAKR←←3

DEFINE INC(N)
<	REPEAT N,<IDPB SPACE,PTR
>>

DEFINE PUT(CHR)
<	MOVEI A,CHR
	IDPB A,PTR
>

SPW:	AOSL YET#
	SKIPE DONE
	DISMIS			;NOT DONE YET
	MOVNI A,4
	MOVEM A,YET		;DISMISS IMMEDIATELY 3 OUT OF 4 TIMES SPW IS RUN
	SETZM LINENO		;NUMBER OF OUTPUT LINES GENERATED FROM BUFFER
	MOVE P,[IOWD PDLLEN,PDL];GET STACK

	CONSZ 40		;6 OR 10?
	JRST [	MOVE I,TENADR	;10 IS EASY!
		JRST TENWIN]
	TLO 2,777000		;INFINITE PROT.
	DATAO 2			;SET IT
	MOVNS I,2		;GET INDEX
TENWIN:	MOVE PTR,[POINT 7,TEXT]	;BYTE POINTER FOR TEXT
	MOVEI SPACE,40
	MOVE DDB,TABENT		;GET LOC OF TTY'S TTYTAB ENTRY
	ADDI DDB,(I)		;UNRELOCATE IT
	MOVE DDB,(DDB)		;GET DDB ADDRESS FROM TTYTAB

	MOVEI B,1
	MOVEM B,WHOLIN
	MOVE B,[WHOLIN,,WHOLIN+1]
	BLT B,WHOLIN+LWHO-1

	JUMPE DDB,NODDB
	ADDI DDB,(I)		;ADDRESS OF DDB
	MOVE B,DEVNAM(DDB)	;DEVICE NAME
	PUSHJ P,SIXOUT
	INC 2
	MOVE B,DEVLOG(DDB)
	PUSHJ P,SIXOUT
	INC 2
	MOVE B,DEVCHR(DDB)
	PUSHJ P,OCTPNT
	INC 2
	MOVE B,DEVIOS(DDB)
	PUSHJ P,OCTPNT
	INC 2
	MOVE B,DEVMOD(DDB)
	PUSHJ P,OCTPNT
	INC 2
	MOVE B,LINENT		;GET LOC OF TTY'S LINTAB ENTRY
	ADDI B,(I)
	MOVE B,(B)		;GET LINE CHARACTERISTICS
	PUSHJ P,OCTPNT
	INC 2
	SKIPL TISYNC(DDB)
	JRST NOTNEG
	PUT "-"
NOTNEG:	MOVM A,TISYNC(DDB)
	PUSHJ P,OCTNUM
	SKIPL PTYENT
	JRST DOPTYJ
	MOVEI B,[ASCIZ/ 
/]
;	PUSHJ P,STRING
	JRST PTDONE
DOPTYJ:	MOVEI B,[ASCIZ/ 
PTYJOB:  /]
	PUSHJ P,STRING
	MOVE B,PTYENT
	ADDI B,(I)
	MOVE A,(B)
	PUSH P,A
	PUSHJ P,DECNUM
	MOVEI B,[ASCIZ/  /]
	PUSHJ P,STRING
	POP P,A
	ADD A,JOBTAB
	ADDI A,(I)
	MOVE B,(A)
	PUSHJ P,SIXOUT
PTDONE:	HLLZ B,DEVCHR(DDB)
	LSH B,-=30
	TRNN B,77		;ANY JOB THERE?
	JRST NOJOB		;NO
	SKIPL A,WHOFLG#
	JRST NOJOB
	CAIE B,(A)		;RIGHT JOB?
	JRST GENINT		;NO, WAKE UP MAIN JOB
	WHO SPACE,		;GET WHOLINE FOR USER OF THIS TTY, IF ANY SUCH JOB
NOJOB:	MOVEI B,[ASCIZ/ 
ACTBITS:        /]
	PUSHJ P,STRING
	MOVE B,ACTBTS(DDB)
	PUSHJ P,OCTPNT
	INC 2
	MOVE B,ACTBTS+1(DDB)
	PUSHJ P,OCTPNT
	INC 2
	MOVE B,ACTBTS+2(DDB)
	PUSHJ P,OCTPNT
	INC 2
	MOVE B,ACTBTS+3(DDB)
	PUSHJ P,OCTPNT
;	SKIPE FLAG		;DOING INPUT BUFFER OR OUTPUT BUFFER?
;	JRST NOTIN		;OUTPUT
	MOVEI B,[ASCIZ/ 
 
INPUT BUFFER:
/]
	PUSHJ P,STRING
	MOVEI DAT,TTIBUF(DDB)
	PUSHJ P,BUFPNT
;	JRST NOTOUT
NOTIN:	SKIPGE NODPY		;SKIP UNLESS ON TTY
	JRST NOTIN1
	SKIPA B,LINENO
	PUSHJ P,PSCRLF		;PUT OUT BLANK LINE
	CAIGE B,=11
	AOJA B,.-2
NOTIN1:	MOVEI B,[ASCIZ/ 
 
OUTPUT BUFFER:
/]
	PUSHJ P,STRING
	MOVEI DAT,TTOBUF(DDB)
	PUSHJ P,BUFPNT
NOTOUT:	SKIPG NODPY		;PUT OUT BLANK LINES IF DD OUTPUT
	JRST NOTOU1
	MOVEI A,=40-=11		;NUMBER OF LINES ON DD SCREEN-NBR USED FOR TITLES
	SUB A,LINENO		;CALC NUMBER OF BLANK LINES NEEDED
	PUSHJ P,PSCRLF		;PUT OUT BLANK LINE WITH ONLY A SPACE ON IT
	SOJG A,.-1
NOTOU1:	JRST 2,@[.+1]
	MOVEI A,2(PTR)
	SUBI A,DPYBUF		;CALC WORD COUNT
	MOVEM A,HEAD+1
	MOVEI A,1
	IORM A,@LASTCLOBBERED#
	SETZM 1(PTR)
	MOVEI A,1(PTR)
	MOVEM A,LASTCLOBBERED
	SKIPL NODPY
	DPYOUT HEAD
	DISMIS

NODDB:	MOVE B,LINNBR		;PRINT LINE NUMBER
	PUSHJ P,OCTPNT
	MOVEI A,=46
	IDPB SPACE,PTR
	SOJG A,.-1
	MOVE B,LINENT		;GET LOC OF TTY'S LINTAB ENTRY
	ADDI B,(I)
	MOVE B,(B)		;GET LINE CHARACTERISTICS
	PUSHJ P,OCTPNT
	MOVEI B,[ASCIZ/ 
 
 
 
 
****** NO DDB POINTER ******
/]
	PUSHJ P,STRING
	JRST NOTOUT

GENINT:	SETZM	WHOFLG
	JRST	2,@[.+1]
	INTIPI	[0↔INTTTY,,0]	;SEND OUR MAIN JOB AN INTERRUPT
	JRST	NOJOB		;ERROR RETURN
	JRST	NOJOB
BUFPNT:	MOVE E,DEVCHR(DDB)
	ANDI E,3777		;GET BUFFER SIZE
	ADD E,BUF(DAT)
	ADDI E,(I)
	HRRZM E,STOPR#		;ADDRESS OF END OF BUFFER
	MOVE F,PUTR(DAT)
	ADDI F,(I)
	TLZ F,1
	MOVEM F,SPUTR#		;PUTR
	MOVE A,TAKR(DAT)
	ADDI A,(I)
	TLZ A,1
	MOVEM A,STAKR#		;TAKR
	MOVEI C,13		;SYMBOL FOR CONTROL BIT
	MOVEI D,14		;SYMBOL FOR META BIT
	MOVEI G,177
	SETZB H,SPECIAL#	;H IS COLUMN POSITION, SPECIAL IS A FLAG FOR CR/LF
	SKIPL NODPY		;ON TTY?
	JRST TLOP
	MOVEI C,"$"		;YES, USE DIFFERENT SYMBOLS FOR CONTROL AND META
	MOVEI D,"%"
TLOP:	IBP F
	HRRZ A,F
	CAML A,STOPR		;HAVE WE RUN OFF END OF BUFFER?
	JRST [	HRR F,BUF(DAT)	;YES--MOVE BACK TO FRONT OF BUFFER
		ADDI F,1(I)
		TLZ F,1
		HRRZ A,SPUTR
		CAIGE A,(F)	;PUTR AT FRONT?
		POPJ P,		;YES!
		JRST .+1]
	LDB A,F			;GET A CHAR
	SKIPE B,APNYTF#		;ARE WE CONVERTING AP/NYT LINES TO ASCII?
	JRST APNYT		;YES, DO IT
APNYTR:	MOVE B,A		;COPY CHARACTER
	ANDI B,177		; WITHOUT CONTROL BITS
	CAML H,MAXCOL#		;LINE TOO LONG?
	PUSHJ P,PCRLF		;YES--PUT OUT CRLF
	SKIPGE NODPY		;SKIP UNLESS TTY
	JRST TTYSPE
	CAIE B,LF
	CAIN B,CR
	JRST [	SETOM SPECIAL	;got a cr or a lf
		PUSHJ P,CTRLBT	;PUT OUT CONTROL AND META BITS IF ON
		SKIPG NODPY	;SKIP IF DD
		JRST IIISPE
		JRST DDSPE]
	SKIPL SPECIAL#		;WAS LAST CHAR A CR OR LF?
	JRST NOTSPE		;NO
	CAML H,MINCOL#		;YES--TOO LITTLE ON THIS LINE?
	PUSHJ P,PCRLF		;NO--PUT OUT CRLF
	SETZM SPECIAL
NOTSPE:	PUSHJ P,CTRLBT		;PUT OUT CONTROL AND META BITS IF ON
	SKIPG NODPY		;SKIP IF DD
	JRST IIISP1
	CAIE B,TAB
	CAIN B,BS
DDSPE:	IDPB G,PTR		;PUT OUT A 177
DDSPE1:	IDPB B,PTR		;PUT OUT CHAR FROM BUFFER
	AOJA H,NODD

IIISPE:	CAIN B,CR
	MOVEI B,"|"		;CR BECOMES VERTICAL BAR
	CAIN B,LF
	MOVEI B,"↓"		;LF BECOMES DOWN ARROW
	JRST DDSPE1

IIISP1:	CAIN B,TAB
	MOVEI B,"/"		;TAB BECOMES SLASH
	JRST DDSPE1

TTYSPE:	PUSHJ P,CTRLBT		;PRINT CONTROL BITS IF PRESENT
	CAIE B,LF
	ADDI H,1		;MOVE OVER ONE COLUMN UNLESS LF OR CR
	CAIN B,CR
	SETZ H,			;BACK AT LEFT MARGIN IF CR
	JUMPE B,NODD		;NO NULLS IF ON TTY
	IDPB B,PTR
	JRST NODD

REPEAT 0,<
	JRST NODD2		;NOT ON DD
;	JRST DDDD	;NOTHING SPECIAL TO DO HERE FOR CRS AND LFS ANY MORE
	CAIN H,12		;WAS LAST CHAR A LF?
	CAIN B,15		;AND IS PRESENT CHAR NOT A CR?
	JRST NODD2		;NO TO ONE
	MOVEI H,15		;WE HAVE A BARE LF
	IDPB H,PTR		;INVENT A CR AND
	MOVEI H,40
	MOVE B,COUNT
	IDPB H,PTR		;SPACE OUT TO COLUMN FROM PREVIOUS LINE
	SOJG B,.-1
NODD2:	CAIN H,15		;PREVIOUS CHAR A CR?
	CAIN A,12		;AND PRESENT CHAR NOT A LF?
	JRST NODD1
	MOVEI H,12		;YES.  INVENT A LF FOR THE CR
	IDPB H,PTR
NODD1:	SKIPG NODPY
	JRST NODD3
	CAIE H,15		;HERE FOR DD ONLY.  PREVIOUS CHAR NOT A CR?
	CAIE B,12		;AND PRESENT CHAR A LF?
	JRST NODD3
	MOVEI H,40		;YES.  PUT A BLANK AND A CR BEFORE THE LF
	IDPB H,PTR
	MOVEI H,15
	IDPB H,PTR
NODD3:	CAIN B,15		;GOT A CR?
	JRST [	MOVEI H,40	;YES
		SKIPN COUNT	;IF NOTHING IN LINE AND
	α∪M↔∪!∞↓≥∨	!d∩vA∨8A	λX↓)⊃≤4∀∩∪π¬∪α~∀$∪∪	!λA⊂Y!Q$∩vAA+(A∪8AαA'Aβπ
A	
∨%∀A)⊃
↓π$~∀$∪')i~Aπ∨U≥(∩w9∨)
AQ⊃β(A]
A⊃βY
A≥∨\AαA≥∃.A→∪9
~∀∩%∃%'(\Vc:4∃			⊂t∪)%i
AαXH``∩∩mπ∨≥)I∨_A¬%(A∨≤|~∀∪∪⊃!∧Aε1!)$∩$w3&4∀∪)%i
AαXP``∩∩m≠)α↓¬∪(A=≤}~∀%∪	!∧↓λY!)H∩∩w3∃&~∀∪M↔∪!∞↓≥→∞∩¬H4(&U∩NQαtz∩⊂4PJ∞ε&*α¬1E;8$%nD*J∃α4zIα∩"α>:2Jq↓α≡⎇!α¬α∃→α>I∧	αRε∪x4(&≤
&9α
aED4PJ*JN"↓9-LHInf⊗~q↓αB-!α>V"α¬↓E;84(&≤
&∃α
aET4PJ∞ε&rα¬1E⊂H%n∞∩α>Iαd1|4(LJ∩B	∧92BR⊂H%nf-→9↓α4zJ∞∃∧"&NBd
eα>2αR	α⎇⊃α
M∧zIα∞∩α>Iαd04)y\*:⊃α∀*B⊗ε"↓@4(hR:>∩#P&∞εl)α→2≥"ε.HhP&*J≥!α:>$
.H4PJN.&∧aα:>%αd4(LRJNQ¬"ε.IλH%n∩"α>IαLJ$4(L~ε&9∧⊃1ETHIn"⊗∀)α~>∩αRRf~α>:2Hh(&*∃~QαlLj>Z⊗Jα	1E⊂In∩>u!αNBdJQαVαα¬α∞∩αε:⊃∧	α2→jjBVQ¬""∃αd1α
ε≤Yα&8hP$&&%α	α	eαRH4SX$&N-"iα!`h($&U∩NQ↓rYFt4U"ε.IP&6>4*%α	eZεN∞MQ=))RαRε.∩dde⎇h4(&¬*N")¬↓2NR∀J:≤4PJε∩∩Jα!1u⊂%nN-"j5α≤zV:PhP&*J≥!α~&ph(4*tzRε.∪P4*J-α⊗εQβ↓1p4PJN.&∧b∃α:PY
	JRST NOTAK1		;DD
	CAIE H,15
	CAIN H,12
	JRST FIN		;GOT A CR OR LF
NOTAK1:	AOS A,COUNT		;NOTE WE MOVE OUT ONE COLUMN
	CAIG A,80
	JRST FIN
	PUSHJ P,PCRLF
>;END REPEAT 0

FIN:	CAME F,SPUTR
	JRST TLOP
	POPJ P,

PSCRLF:	MOVEI Z," "		;INSERT A SPACE AND A CRLF
	IDPB Z,PTR
PCRLF:	MOVEI Z,CR		;INSERT CRLF
	IDPB Z,PTR
	MOVEI Z,12
	IDPB Z,PTR
	SETZ H,			;NOTE BEGINNING NEW LINE
	AOS LINENO#
	POPJ P,

CTRLBT:	TRZE A,200		;CONTROL BIT ON?
	JRST [IDPB C,PTR↔AOJA H,.+1]	;YES
	TRZE A,400		;META BIT ON?
	JRST [IDPB D,PTR↔AOJA H,.+1]	;YES
	POPJ P,

APNYT:	CAILE A,100
	SKIPA A,["?"]		;ILLEGAL CHAR
	MOVE A,CHRTBL(A)	;CONVERT CHARACTER TO ASCII
	JRST APNYTR
SIXOUT:	MOVEI C,6
SIX1:	SETZ A,
	LSHC A,6
	ADDI A,40
	IDPB A,PTR
	SOJG C,SIX1
CPOPJ:	POPJ P,

OCTPNT:	MOVEI C,=12
OCT1:	SETZ A,
	LSHC A,3
	ADDI A,60
	IDPB A,PTR
	SOJG C,OCT1
	POPJ P,

OCTNUM:	IDIVI A,10
	HRLM B,(P)
	JUMPE A,.+2
	PUSHJ P,OCTNUM
	HLRZ A,(P)
	ADDI A,60
	IDPB A,PTR
	POPJ P,

DECNUM:	IDIVI A,=10
	HRLM B,(P)
	JUMPE A,.+2
	PUSHJ P,DECNUM
	HLRZ A,(P)
	ADDI A,60
	IDPB A,PTR
	POPJ P,

STRING:	HRLI B,(<POINT 7,0>)
ST1:	ILDB A,B
	JUMPE A,CPOPJ
	IDPB A,PTR
	JRST ST1

DEFINE CW(C1,B1,C2,B2,C3,B3)
{	<BYTE(8)<B1>,<B2>,<B3>(3)<C1>,<C2>,<C3>>!4	}

DDWRD1:	CW	1,46,2,0,3,1
DDWRD2:	CW	3,1,4,1,5,10

IIIWRD:	BYTE(11)<-1000>,670(3)0,0(2)1,2(4)6

HEAD:	600000,,DPYBUF
	0
DONE:	0
	LINSET

LWHO←←=22
DPYBUF:	0
LINSET:	0
CRLF:	ASCID/ 
/
WHOLIN:	REPEAT LWHO,<1>
HEADER:	ASCID/DEVNAM  DEVLOG  DEVCHR        DEVIOS        DEVMOD        LINTAB        TISYNC
/
	1
TEXT:	REPEAT 600,<1>
BUFEND:	1
	0
;CHRTBL

CHRTBL:	"!"			;0: null
	"e"	;1
	LF			;2: elevate→line feed
	"a"	;3
	" "	;4: space
	"s"	;5
	"i"	;6
	"u"	;7
	CR			;10: carriage return
	"d"	;11
	"r"	;12
	"j"	;13
	"n"	;14
	"f"	;15
	"c"	;16
	"k"	;17
	"t"	;20
	"z"	;21
	"l"	;22
	"w"	;23
	"h"	;24
	"y"	;25
	"p"	;26
	"q"	;27
	"o"	;30
	"b"	;31
	"g"	;32
	"{"			;33: shift
	"m"	;34
	"x"	;35
	"v"	;36
	"}"			;37: unshift

	"β"			;40: thin space
	"3"	;41
	"←"			;42: paper feed
	"$"	;43
	"α"			;44: add thin space
	TAB			;45: em space
	"8"	;46
	"7"	;47
	"'"	;50
	"-"	;51
	"4"	;52
	"π"			;53: bell
	","	;54: comma
	"∀"			;55: undefined
	"→"			;56: en space
	"↔"			;57: quad right
	"5"	;60
	")"	;61
	"⊗"			;62: em space
	"2"	;63
	"∞"			;64: em leader
	"6"	;65
	"0"	;66
	"∂"			;67: en leader
	"9"	;70
	"∧"			;71: upper rail
	";"	;72
	"∨"			;73: lower rail
	"."	;74: period
	"1"	;75
	"∃"			;76: undefined
	BS			;77: rub out
	"@"			;100: tape feed

	END	STRT