Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-02 - decus/20-0062/meta2.mac
There are 2 other files named meta2.mac in the archive. Click here to see a list.
	TITLE	%META2 SUPPORT PACKAGE -- MICHAEL GREEN
	ENTRY	%BLOCK,%LOOK,%SET,%CHECK,%LIST,%BEGIN,%END
	ENTRY	%RESET,%COPYL,%COPYI,%ERROR,%TYPE,%STR,%LEN
	ENTRY	%GEN,%UNTIL,%TST,%PUSH,%POP,%ID,%NUM,%CLEAR
	ENTRY	%SCAN,%GETNM,%PUTNM,%XLEN,%XBLK,%GET,%PUT
	ENTRY	%LEVEL,%SYMB,%XSYMB,%BLEVL,%CLEVL,%FIN
	ENTRY	%MAKND,%SETRE,%CALND,%DMPTR,%CPYDC,%MARK
	EXTERN	%MESS1,%MESS2
	SEARCH JOBDAT

%RESET:	0
	JRST	RESET-1
	0
	SETOM	CCLSW
	MOVE	%RESET+2
	MOVEM	%RESET
	OPEN	3,CCLD
	JRST	RESET
	INBUF	3,2
	HRRZ	.JBFF
	MOVEM	JOBFFS
	JRST	.+4
	AOS	%RESET
RESET:	SETZM	CCLSW
	CALL	[SIXBIT/RESET/]
	MOVE	P,[IOWD ^D512,PDL]
	MOVE	STK1,[IOWD ^D128,HOLD]
	MOVE	STK2,[IOWD ^D512,TREE]
	MOVEM	STK1,SAVSTK
	MOVEM	STK2,SAVSTK+1
	SETZM	%MARK
	SETZM	ERRLN
	HRLZI	F,SUCCES
	MOVE	BUFFPT,[POINT 7,SCANBF]
	OPEN	TTYD
	HALT
ASKOUT:	SKIPLE	CCLSW
	JRST	ASKCOM
	SKIPE	CCLSW
	JRST	RDCCL
	MOVEI	015
	PUSHJ	P,TTYOUT
	MOVEI	012
	PUSHJ	P,TTYOUT
	MOVEI	"*"
	PUSHJ	P,TTYOUT
	PUSHJ	P,FORCET
ASKCOM:	MOVE	1,[POINT 7,%MESS1]
	ILDB	1
	CAIE	":"
	JRST	.-2
	ILDB	1
	MOVEM	1,CCLMSG
	PUSHJ	P,IODEV
	CAIE	"_"
	JRST	IODEVR
	MOVEM	DEV,OTPUTD+1
	MOVEM	FILE,OTPUTF
	SKIPN	EXT
	HLLZ	EXT,%MESS2
	HLLZM	EXT,OTPUTF+1
	SETZM	OTPUTF+2
	SETZM	OTPUTF+3
	OPEN	2,OTPUTD
	JRST	NOOPNO
	ENTER	2,OTPUTF
	JRST	NOENTR
ASKIN:	MOVE	1,[POINT 7,%MESS1]
	ILDB	1
	CAIE	":"
	JRST	.-2
	ILDB	1
	MOVEM	1,CCLMSG
	PUSHJ	P,IODEV
	CAIE	012
	JRST	IODEVR
	MOVEM	DEV,INPUTD+1
	MOVEM	FILE,INPUTF
	HLLZM	EXT,INPUTF+1
	SETZM	INPUTF+2
	SETZM	INPUTF+3
	OPEN	1,INPUTD
	JRST	NOOPNI
	LOOKUP	1,INPUTF
	JRST	NOLOOK
	SKIPN	CCLSW
	JRST	ASKCON
	MOVEI	0
	IDPB	CCLMSG
	MOVE	1,[POINT 7,%MESS1]
	ILDB	1
	JUMPE	.+3
	PUSHJ	P,TTYOUT
	JRST	.-3
	PUSHJ	P,FORCET
ASKCON:	SETZM	SCANBF
	SETZM	STACKA
	MOVE	[XWD STACKA,STACKA+1]
	BLT	STACKA+3*^D64*^D16-1
	SETZM	SAVEBF
	MOVE	[XWD STACKL,STACK]
	BLT	STACK+2
	SETZM	%LIST
	MOVE	[POINT 7,DICT]
	MOVEM	DICTCH
	SETOM	SCANPT
	SETOM	DICTPT
	SETOM	CURRNT
	SETZM	BLOCKI
	SETZM	BLOCKN
	SETZM	BLOCKP
	SETZM	BLOCK
	JRST	@%RESET
NOOPNI:	PUSHJ	P,%TYPE
	ASCIZ	/?CAN NOT OPEN INPUT DEVICE/
	JRST	RESET
NOLOOK:	PUSHJ	P,%TYPE
	ASCIZ	/?NO INPUT FILE FOUND/
	JRST	RESET
NOOPNO:	PUSHJ	P,%TYPE
	ASCIZ	/?CAN NOT OPEN OUTPUT DEVICE/
	JRST	RESET
NOENTR:	PUSHJ	P,%TYPE
	ASCIZ	/?CAN NOT CREATE OUTPUT FILE/
	JRST	RESET

IODEV:	SETZ	DEV,
	SETZ	FILE,
	SETZ	EXT,
LOOKNM:	SETZ	NAME,
	PUSHJ	P,TTYIN
	IDPB	CCLMSG
	CAIN	015
	JRST	LOOKNM+1
	CAIGE	"0"
	JRST	DELIM
	CAIG	"9"
	JRST	PACKNM
	CAIGE	"A"
	JRST	DELIM
	CAIG	"Z"
	JRST	PACKNM
	CAIGE	141
	JRST	DELIM
	CAIG	172
	JRST	PACKNM+1
IODEVR:	PUSHJ	P,%TYPE
	ASCIZ	/?ILLEGAL COMMAND/
	JRST	RESET
PACKNM:	XORI	40
	ANDI	77
	TLNE	NAME,770000
	JRST	LOOKNM+1
	LSH	NAME,6
	OR	NAME,
	JRST	LOOKNM+1
DELIM:	JUMPE	NAME,.+5
	TLNE	NAME,770000
	JRST	.+3
	LSH	NAME,6
	JRST	.-3
	CAIN	":"
	JRST	STRDEV
	CAIN	"."
	JRST	STRFIL
	CAIN	"_"
	JRST	.+5
	CAIN	"!"
	JRST	RUN
	CAIE	012
	JRST	IODEVR
	JUMPE	FILE,.+2
	SKIPA	EXT,NAME
	MOVE	FILE,NAME
	JUMPN	DEV,.+2
	HRLZI	DEV,(SIXBIT/DSK/)
	POPJ	P,
STRFIL:	JUMPN	FILE,IODEVR
	SKIPN	FILE,NAME
	JRST	IODEVR
	JRST	LOOKNM
STRDEV:	JUMPN	DEV,IODEVR
	SKIPN	DEV,NAME
	JRST	IODEVR
	JRST	LOOKNM

RDCCL:	SETZM	CCLINF+2
	SETZM	CCLINF+3
	MOVE	2,[POINT 7,%MESS1]
	MOVEI	0,0
	ILDB	1,2
	CAIN	1,":"
	JRST	SIXPAK
	ROT	1,-6
	ROTC	0,6
	TRC	0,40
	CAIGE	0,10000
	JRST	.-7
	JRST	.+5
SIXPAK:	CAIL	0,10000
	JRST	.+3
	LSH	0,6
	JRST	.-3
	MOVEM	CCLINF
	MOVSM	TMPLST
	MOVE	[XWD 2,TMPLST]
	CALL	[SIXBIT/TMPCOR/]
	JRST	NOTMP
	MOVE	[POINT 7,TMPBUF]
	MOVEM	CCLTMP
	JRST	ASKCOM
NOTMP:	SETZM	CCLTMP
	MOVEI	(SIXBIT/TMP/)
	MOVSM	CCLINF+1
	CALL	[SIXBIT/PJOB/]
	IDIVI	^D10
	LSHC	1,-6
	IDIVI	^D10
	LSHC	1,-6
	IDIVI	^D10
	LSHC	1,-6
	OR	2,[SIXBIT/000   /]
	HLLM	2,CCLINF
	LOOKUP	3,CCLINF
	JRST	RESET
	JRST	ASKCOM

CCLIN:	SKIPE	CCLTMP
	JRST	TMPFET
	SOSG	CCLINB+2
	JRST	CCLING
	ILDB	CCLINB+1
	JUMPE	CCLIN+2
	POPJ	P,
CCLING:	IN	3,
	JRST	CCLIN+4
	STATO	3,740000
	JRST	ENDCCL
CCLRDR:	PUSHJ	P,%TYPE
	ASCIZ	/?COMMAND READ ERROR/
	JRST	RESET

TMPFET:	ILDB	CCLTMP
	JUMPE	.+2
	POPJ	P,
	CALL	[SIXBIT/EXIT/]

TTYIN:	SKIPE	CCLSW
	JRST	CCLIN
	SOSG	TTYINB+2
	JRST	TTYING
	ILDB	TTYINB+1
	JUMPE	TTYIN+2
	POPJ	P,
TTYING:	IN
	JRST	TTYIN+4
	HALT
TTYOUT:	CAIN	032
	POPJ	P,
	SOSG	TTYOTB+2
	JRST	TTYOTP
	IDPB	TTYOTB+1
	POPJ	P,
TTYOTP:	OUT
	JRST	TTYOUT+4
	HALT

%TYPE:	MOVEI	(^D36B5+7B11)
	HRLM	(P)
	ILDB	(P)
	JUMPE	TYPEEX
	PUSHJ	P,TTYOUT
	JRST	%TYPE+2
TYPEEX:	MOVEI	015
	PUSHJ	P,TTYOUT
	MOVEI	012
	PUSHJ	P,TTYOUT
	OUT
	AOSA	TTYOTB+2
	HALT
	AOS	(P)
	POPJ	P,

FORCET:	OUT
	AOSA	TTYOTB+2
	HALT
	POPJ	P,

TTYD:	XWD	0,1
	SIXBIT	/TTY/
	XWD	TTYOTB,TTYINB
TTYINB:	BLOCK	3
TTYOTB:	BLOCK	3

INPUTD:	XWD	0,0
	SIXBIT	/   /
	XWD	0,INPUTB
INPUTF:	BLOCK	4
INPUTB:	BLOCK	3

OTPUTD:	XWD	0,0
	SIXBIT	/   /
	XWD	OTPUTB,0
OTPUTF:	BLOCK	4
OTPUTB:	BLOCK	3

CCLD:	XWD	0,0
	SIXBIT	/DSK/
	XWD	0,CCLINB
CCLINB:	BLOCK	3
CCLINF:	BLOCK	4
CCLSW:	BLOCK	1
CCLMSG:	BLOCK	1
CCLTMP:	BLOCK	1
TMPLST:	BLOCK	1
	IOWD	^D63,TMPBUF
TMPBUF:	BLOCK	^D64

%FIN:	RELEAS	0,
	RELEAS	1,
	RELEAS	2,
	SKIPN	CCLSW
	JRST	RESET
	MOVE	JOBFFS
	HRRM	.JBFF
	MOVEI	1
	MOVEM	CCLSW
	JRST	RESET+2

JOBFFS:	BLOCK	1

ENDCCL:	CLOSE	3,
	SETZM	CCLINF
	SETZM	CCLINF+3
	RENAME	3,CCLINF
	JRST	CCLRDR
	CALL	[SIXBIT/EXIT/]

RUN:	MOVEM	NAME,RUNBLK+1
	SKIPE	CCLTMP
	JRST	.+6
	CLOSE	3,
	SETZM	CCLINF
	SETZM	CCLINF+3
	RENAME	3,CCLINF
	JRST	CCLRDR
	MOVSI	1
	HRRI	RUNBLK
	CALL	[SIXBIT/RUN/]
	HALT

RUNBLK:	SIXBIT	/SYS/
	SIXBIT	/      /
	EXP	0,0,0,0

NAME=	6
DEV=	7
FILE=	10
EXT=	11

%ERROR:	PUSHJ	P,%TYPE
	ASCIZ	/?FATAL SYNTAX ERROR/
	SKIPN	ERRLN
	JRST	FATAL
	PUSHJ	P,%TYPE
	ASCII	/  IN LINE /
ERRLN:	EXP	0,0
FATAL:	PUSHJ	P,%TYPE
	ASCIZ	/  DETECTED AT:/
	MOVEI	1
	MOVEM	%LIST
	PUSHJ	P,%UNTIL+1
	BYTE	(7) 015,012,0
	JUMPGE	F,%FIN
	PUSHJ	P,%UNTIL+1
	BYTE	(7) 015,012,0
	JUMPGE	F,%FIN
	PUSHJ	P,%UNTIL+1
	BYTE	(7) 015,012,0
	JRST	%FIN

INPUT:	SETZM	INPUTX
	SOSG	INPUTB+2
	JRST	INPUTG
	IBP	INPUTB+1
	MOVE	@INPUTB+1
	TRNN	1
	JRST	.+4
	MOVEM	ERRLN
	SETOM	INPUTX
	JRST	INPUT+1
	AOSG	INPUTX
	JRST	INPUT+1
	LDB	INPUTB+1
	JUMPE	INPUT
	POPJ	P,
INPUTG:	IN	1,
	JRST	INPUT+3
	STATO	1,020000
	JRST	INPUTE
	MOVEI	032
	POPJ	P,
INPUTE:	PUSHJ	P,%TYPE
	ASCIZ	/?INPUT ERROR/
	JRST	%FIN
INPUTX:	0

OUTPUT:	SOSG	OTPUTB+2
	JRST	OTPUTP
	IDPB	OTPUTB+1
	POPJ	P,
OTPUTP:	OUT	2,
	JRST	OUTPUT+2
	PUSHJ	P,%TYPE
	ASCIZ	/?OUTPUT ERROR/
	JRST	%FIN

GETINP:	ILDB	CHAR
	JUMPE	.+4
	SKIPLE	%LIST
	PUSHJ	P,TTYOUT
	POPJ	P,
	PUSHJ	P,INPUT
	SKIPE	%LIST
	PUSHJ	P,TTYOUT
	DPB	CHAR
	MOVE	TEMP1,CHAR
	MOVEI	TEMP2,0
	IDPB	TEMP2,TEMP1
	CAME	TEMP1,[POINT 7,SCANBF+^D64-1,^D34]
	POPJ	P,
	PUSHJ	P,%TYPE
	ASCIZ	/?BUFFER OVERFLOW/
	JRST	FATAL

%COPYL:	MOVEI	(^D36B5+7B11)
	HRLM	(P)
	ILDB	(P)
	JUMPN	.+3
	AOS	(P)
	POPJ	P,
	PUSHJ	P,OUTPUT
	JRST	%COPYL+2

%LEN:	MOVE	TEMP1,[POINT 7,SAVEBF]
	MOVEI	0
LENLOP:	ILDB	1,TEMP1
	JUMPE	1,EDITNM
	CAIN	1,177
	JRST	LENLOP
	AOJA	LENLOP

%COPYI:	MOVE	TEMP1,[POINT 7,SAVEBF]
	ILDB	TEMP1
	JUMPE	.+3
	PUSHJ	P,OUTPUT
	JRST	%COPYI+1
	POPJ	P,

DELETE:	TLNE	F,BACKUP
	SKIPA	CHAR,BUFFPT
	MOVE	CHAR,[POINT 7,SCANBF]
DELETL:	PUSHJ	P,GETINP
	CAIN	" "
	JRST	DELETL
	CAIGE	011
	JRST	TSTSUC
	CAIG	015
	JRST	DELETL

TSTSUC:	MOVE	BUFFPT,CHAR
	IBP	BUFFPT
	IBP	BUFFPT
	IBP	BUFFPT
	IBP	BUFFPT
	SOJ	BUFFPT,
	TLNE	F,NDELET
	JRST	TSTNDL
	TLZ	F,BACKUP
	MOVE	TEMP1,[POINT 7,SCANBF]
	CAMN	CHAR,[POINT 7,SCANBF,6]
	POPJ	P,
	LDB	CHAR
	SKIPA
TSTREP:	ILDB	CHAR
	IDPB	TEMP1
	JUMPN	TSTREP
	POPJ	P,
TSTNDL:	TLO	F,BACKUP
	POPJ	P,

MATCH:	MOVE	TEMP1,[POINT 7,SAVEBF]
	TLNE	F,NDELET
	SKIPA	TEMP2,BUFFPT
	MOVE	TEMP2,[POINT 7,SCANBF]
MATCHL:	ILDB	TEMP2
	CAMN	TEMP2,CHAR
	JRST	MATCHE
	CAIN	177
	JRST	MATCHL
	IDPB	TEMP1
	CAME	TEMP1,[POINT 7,SAVEBF+^D32-1,^D34]
	JRST	MATCHL
	PUSHJ	P,%TYPE
	ASCIZ	/?SYMBOL TOO LONG/
	JRST	FATAL
MATCHE:	MOVEI	0
	IDPB	TEMP1
	TLO	F,SUCCES
	JRST	TSTSUC

%GEN:	MOVEI	"$"
	PUSHJ	P,OUTPUT
	HLRZ	-1(P)
	ADD	@(P)
	AOS	(P)
EDITNM:	IDIVI	^D10
	HRLM	1,(P)
	JUMPE	.+2
	PUSHJ	P,EDITNM
	HLRZ	(P)
	ADDI	"0"
	PUSHJ	P,OUTPUT
	POPJ	P,

%UNTIL:	PUSHJ	P,DELETE
	MOVEI	(^D36B5+7B11)
	HRLM	(P)
	TLNE	F,BACKUP
	SKIPA	CHAR,BUFFPT
	MOVE	CHAR,[POINT 7,SCANBF]
	TLZ	F,SUCCES
UNTILL:	MOVE	TEMP4,(P)
	ILDB	TEMP3,TEMP4
	JUMPE	TEMP3,TSTEXT
	PUSHJ	P,GETINP
	CAIN	032
	JRST	TSTQUT
	CAIE	(TEMP3)
	JRST	.-4
	MOVE	TEMP5,CHAR
UNTILM:	ILDB	TEMP3,TEMP4
	JUMPE	TEMP3,TSTEXX
	PUSHJ	P,GETINP
	CAIN	032
	JRST	TSTQUT
	CAIN	(TEMP3)
	JRST	UNTILM
	MOVE	CHAR,TEMP5
	JRST	UNTILL
TSTEXX:	MOVEM	TEMP4,(P)
	JRST	TSTEXT

%TST:	PUSHJ	P,DELETE
	MOVEI	(^D36B5+7B11)
	HRLM	(P)
	TLNE	F,BACKUP
	SKIPA	CHAR,BUFFPT
	MOVE	CHAR,[POINT 7,SCANBF]
	TLZ	F,SUCCES
TSTLOP:	ILDB	TEMP3,(P)
	JUMPE	TEMP3,TSTEXT
	PUSHJ	P,GETINP
	CAIN	(TEMP3)
	JRST	TSTLOP
	CAIE	TEMP3," "
	JRST	TSTQUT
	CAIGE	011
	JRST	TSTQUT
	CAIG	015
	JRST	TSTLOP
TSTQUT:	ILDB	(P)
	JUMPN	.-1
	AOS	(P)
	POPJ	P,
TSTEXT:	AOS	(P)
	TLO	F,SUCCES
	IBP	CHAR
	JRST	TSTSUC

%NUM:	PUSHJ	P,DELETE
	TLNE	F,BACKUP
	SKIPA	CHAR,BUFFPT
	MOVE	CHAR,[POINT 7,SCANBF]
	TLZ	F,SUCCES
	PUSHJ	P,GETINP
	CAIGE	"0"
	POPJ	P,
	CAILE	"9"
	POPJ	P,
NUMLOP:	PUSHJ	P,GETINP
	CAIGE	"0"
	JRST	MATCH
	CAILE	"9"
	JRST	MATCH
	JRST	NUMLOP

%PUT:	POP	P,TEMP2
	EXCH	TEMP2,(P)
	MOVE	TEMP1,@(P)
	AOS	(P)
	SOJL	TEMP2,STKERR
	IMULI	TEMP2,^D16
	ADD	TEMP2,STACKL-1(TEMP1)
	CAMLE	TEMP2,STACK-1(TEMP1)
	JRST	STKERR
	TLZE	F,SCATEN
	JRST	PUSHED
	JRST	PUSHOK

STKERR:	PUSHJ	P,%TYPE
	ASCIZ	/?STACK LIMIT ERROR/
	JRST	FATAL

%PUSH:	MOVE	TEMP1,@(P)
	AOS	(P)
	MOVE	TEMP2,STACK-1(TEMP1)
	TLZE	F,SCATEN
	JRST	PUSHED
	MOVEI	TEMP3,^D16
	ADDM	TEMP3,STACK-1(TEMP1)
	CAME	TEMP2,STACKU-1(TEMP1)
	JRST	PUSHOK
STKOVF:	PUSHJ	P,%TYPE
	ASCIZ	/?STACK OVERFLOW/
	JRST	FATAL
PUSHED:	SUBI	TEMP2,^D16
	CAMGE	TEMP2,STACKL-1(TEMP1)
	JRST	STKERR
	ILDB	TEMP2
	JUMPN	.-1
	IBP	TEMP2
	IBP	TEMP2
	IBP	TEMP2
	IBP	TEMP2
	SOJ	TEMP2,
PUSHOK:	MOVE	TEMP3,TEMP2
	ADDI	TEMP3,^D16
	JUMPL	TEMP1,PUSHL
	MOVE	TEMP1,[POINT 7,SAVEBF]
	ILDB	TEMP1
	IDPB	TEMP2
	CAMN	TEMP2,TEMP3
	JRST	STKOVF
	JUMPN	.-4
	POPJ	P,
PUSHL:	MOVEI	(^D36B5+7B11)
	HRLM	(P)
	ILDB	(P)
	IDPB	TEMP2
	CAMN	TEMP2,TEMP3
	JRST	STKOVF
	JUMPN	.-4
	AOS	(P)
	POPJ	P,

%POP:	MOVE	TEMP1,@(P)
	AOS	(P)
	MOVE	TEMP2,STACK-1(TEMP1)
	CAME	TEMP2,STACKL-1(TEMP1)
	JRST	POPOK
	SETZM	SAVEBF
	POPJ	P,
%GET:	POP	P,TEMP2
	EXCH	TEMP2,(P)
	MOVE	TEMP1,@(P)
	AOS	(P)
	SOJL	TEMP2,STKERR
	IMULI	TEMP2,^D16
	ADD	TEMP2,STACKL-1(TEMP1)
	CAMLE	TEMP2,STACK-1(TEMP1)
	JRST	STKERR
	JRST	POPCPY
POPOK:	SUBI	TEMP2,^D16
	MOVEM	TEMP2,STACK-1(TEMP1)
POPCPY:	MOVE	TEMP1,[POINT 7,SAVEBF]
	ILDB	TEMP2
	IDPB	TEMP1
	JUMPN	.-2
	POPJ	P,

%LEVEL:	MOVE	TEMP1,@(P)
	AOS	(P)
	MOVE	TEMP2,STACK-1(TEMP1)
	SUB	TEMP2,STACKL-1(TEMP1)
	ANDI	TEMP2,777760
	LSH	TEMP2,-4
	EXCH	TEMP2,(P)
	JRST	(TEMP2)

%ID:	PUSHJ	P,DELETE
	TLNE	F,BACKUP
	SKIPA	CHAR,BUFFPT
	MOVE	CHAR,[POINT 7,SCANBF]
	TLZ	F,SUCCES
	PUSHJ	P,GETINP
	CAIGE	"A"
	POPJ	P,
	CAIG	"Z"
	JRST	IDLOOP
	CAIGE	141
	POPJ	P,
	CAILE	172
	POPJ	P,
IDLOOP:	PUSHJ	P,GETINP
	CAIGE	"0"
	JRST	MATCH
	CAIG	"9"
	JRST	IDLOOP
	CAIGE	"A"
	JRST	MATCH
	CAIG	"Z"
	JRST	IDLOOP
	CAIGE	141
	JRST	MATCH
	CAIG	172
	JRST	IDLOOP
	JRST	MATCH

%STR:	PUSHJ	P,DELETE
	TLNE	F,BACKUP
	SKIPA	CHAR,BUFFPT
	MOVE	CHAR,[POINT 7,SCANBF]
	TLZ	F,SUCCES
	PUSHJ	P,GETINP
	CAIE	042
	POPJ	P,
	MOVEI	"\"
	DPB	CHAR
STRLOP:	PUSHJ	P,GETINP
	CAIN	"\"
	JRST	STRERR
	CAIE	042
	JRST	STRLOP
	MOVE	TEMP3,CHAR
	PUSHJ	P,GETINP
	CAIN	042
	JRST	STRSUB
	MOVEI	"\"
	DPB	TEMP3
	JRST	MATCH
STRSUB:	MOVEI	177
	DPB	CHAR
	JRST	STRLOP
STRERR:	PUSHJ	P,%TYPE
	ASCIZ	/?"\" FATAL ERROR/
	JRST	FATAL

%BEGIN:	AOS	TEMP1,BLOCKP
	CAIGE	TEMP1,^D16
	JRST	BEGINC
	PUSHJ	P,%TYPE
	ASCIZ	/?TOO MANY LEVELS/
	JRST	FATAL
BEGINC:	AOS	TEMP2,BLOCKN
	MOVEM	TEMP2,BLOCK(TEMP1)
	MOVE	TEMP2,DICTCH
	MOVEM	TEMP2,DICTCH(TEMP1)
	MOVE	TEMP2,DICTPT
	MOVEM	TEMP2,DICTPT(TEMP1)
	SETZM	BLOCKI(TEMP1)
	POPJ	P,

%END:	SOSL	TEMP1,BLOCKP
	JRST	ENDC
	PUSHJ	P,%TYPE
	ASCIZ	/?TOO MANY .END S/
	JRST	FATAL
ENDC:	MOVE	TEMP2,DICTCH+1(TEMP1)
	MOVEM	TEMP2,DICTCH
	MOVE	TEMP2,DICTPT+1(TEMP1)
	MOVEM	TEMP2,DICTPT
	CAMGE	TEMP2,CURRNT
	SETOM	CURRNT
	POPJ	P,

%SET:	SKIPL	TEMP1,CURRNT
	JRST	SETOK
	PUSHJ	P,%TYPE
	ASCIZ	/?NO LOOKUP PERFORMED/
	JRST	FATAL
SETOK:	MOVSI	TEMP2,400000
	MOVE	TEMP3,@(P)
	AOS	(P)
	ROT	TEMP2,(TEMP3)
	ORM	TEMP2,FLAGS(TEMP1)
	POPJ	P,

%CHECK:	TLZ	F,SUCCES
	SKIPGE	TEMP1,CURRNT
	JRST	%SET+2
	MOVSI	TEMP2,400000
	MOVE	TEMP3,@(P)
	AOS	(P)
	ROT	TEMP2,(TEMP3)
	TDNE	TEMP2,FLAGS(TEMP1)
	TLO	F,SUCCES
	POPJ	P,

%BLOCK:	SKIPA
	JRST	CBLOCK
	SKIPGE	TEMP1,CURRNT
	JRST	%SET+2
	HLRZ	CONTEX(TEMP1)
	JRST	EDITNM
CBLOCK:	MOVE	TEMP1,BLOCKP
	MOVE	BLOCK(TEMP1)
	JRST	EDITNM

%CLEAR:	SKIPGE	TEMP1,CURRNT
	JRST	%SET+2
	MOVSI	TEMP2,400000
	MOVE	TEMP3,@(P)
	AOS	(P)
	ROT	TEMP2,(TEMP3)
	ANDCAM	TEMP2,FLAGS(TEMP1)
	POPJ	P,

%LOOK:	TLZ	F,SUCCES
	MOVE	TEMP4,@(P)
	AOS	(P)
	SKIPGE	TEMP1,DICTPT
	JRST	NOFIND
LOOKLP:	JUMPG	TEMP4,CHARSU
	HLRZ	TEMP2,CONTEX(TEMP1)
	MOVE	TEMP3,BLOCKP
	CAME	TEMP2,BLOCK(TEMP3)
	JRST	LOOKSK
CHARSU:	MOVE	TEMP2,SYMBOL(TEMP1)
	MOVE	TEMP3,[POINT 7,SAVEBF]
CHARLP:	ILDB	CHAR,TEMP2
	ILDB	TEMP3
	CAIE	(CHAR)
	JRST	LOOKSK
	JUMPN	CHARLP
	MOVEM	TEMP1,CURRNT
	TLO	F,SUCCES
	POPJ	P,
LOOKSK:	SOJGE	TEMP1,LOOKLP
NOFIND:	CAIE	TEMP4,0
	CAIN	TEMP4,1
	POPJ	P,
	AOS	TEMP1,DICTPT
	CAIGE	TEMP1,^D256
	JRST	WILLFT
FULL:	PUSHJ	P,%TYPE
	ASCIZ	/?DICTIONARY FULL/
	JRST	FATAL
WILLFT:	MOVE	TEMP2,BLOCKP
	AOS	TEMP3,BLOCKI(TEMP2)
	HRRM	TEMP3,CONTEX(TEMP1)
	SETZM	FLAGS(TEMP1)
	MOVE	TEMP2,BLOCK(TEMP2)
	HRLM	TEMP2,CONTEX(TEMP1)
	MOVE	TEMP2,DICTCH
	MOVEM	TEMP2,SYMBOL(TEMP1)
	MOVE	TEMP3,[POINT 7,SAVEBF]
INSLOP:	CAMN	TEMP2,[POINT 7,DICT+^D512-1,^D34]
	JRST	FULL
	ILDB	CHAR,TEMP3
	IDPB	CHAR,TEMP2
	JUMPN	CHAR,INSLOP
	MOVEM	TEMP2,DICTCH
	MOVEM	TEMP1,CURRNT
	TLO	F,SUCCES
	POPJ	P,

%SCAN:	MOVE	TEMP4,@(P)
	AOS	(P)
	JUMPN	TEMP4,NSTART
	MOVE	TEMP1,DICTPT
	MOVEM	TEMP1,SCANPT
	SETOM	CURRNT
	POPJ	P,
NSTART:	CAIE	TEMP4,1
	POPJ	P,
	SETOM	CURRNT
	TLZ	F,SUCCES
	SKIPGE	TEMP1,SCANPT
	POPJ	P,
	SOS	SCANPT
	MOVE	TEMP2,BLOCKP
	HLRZ	TEMP3,CONTEX(TEMP1)
	CAME	TEMP3,BLOCK(TEMP2)
	POPJ	P,
	MOVEM	TEMP1,CURRNT
	TLO	F,SUCCES
	MOVE	TEMP2,SYMBOL(TEMP1)
	JRST	POPCPY

%XLEN:	PUSH	P,(P)
	MOVE	TEMP3,[POINT 7,SAVEBF]
	SETZM	-1(P)
XLENL:	ILDB	TEMP1,TEMP3
	JUMPE	TEMP1,XLENX
	CAIN	TEMP1,177
	JRST	XLENL
	AOS	-1(P)
	JRST	XLENL
XLENX:	POPJ	P,

%XBLK:	SKIPA
	JRST	XBLKX
	SKIPGE	TEMP1,CURRNT
	JRST	%SET+2
	HLRZ	TEMP2,CONTEX(TEMP1)
	PUSH	P,(P)
	MOVEM	TEMP2,-1(P)
	POPJ	P,
XBLKX:	PUSH	P,(P)
	MOVE	TEMP1,BLOCKP
	MOVE	TEMP1,BLOCK(TEMP1)
	MOVEM	TEMP1,-1(P)
	POPJ	P,

%PUTNM:	POP	P,TEMP1
	EXCH	TEMP1,(P)
	MOVE	TEMP3,[POINT 7,SAVEBF]
	JUMPGE	TEMP1,.+4
	MOVM	TEMP1,TEMP1
	MOVEI	TEMP2,"-"
	IDPB	TEMP2,TEMP3
	PUSHJ	P,PUTNMA
	SETZ	TEMP2,
	JRST	STOREA
PUTNMA:	IDIVI	TEMP1,^D10
	HRLM	TEMP2,(P)
	JUMPE	TEMP1,.+2
	PUSHJ	P,PUTNMA
	HLRZ	TEMP2,(P)
	ADDI	TEMP2,"0"
STOREA:	IDPB	TEMP2,TEMP3
	POPJ	P,

%GETNM:	PUSH	P,(P)
	MOVE	TEMP3,[POINT 7,SAVEBF]
	SETZ	TEMP2,
	MOVEI	TEMP1,1
	MOVEM	TEMP1,-1(P)
	ILDB	TEMP1,TEMP3
	CAIE	TEMP1,"-"
	JRST	.+3
	SETOM	-1(P)
	ILDB	TEMP1,TEMP3
	JUMPE	TEMP1,.+2
GETNML:	CAILE	TEMP1,"9"
	POPJ	P,
	CAIGE	TEMP1,"0"
	POPJ	P,
	SUBI	TEMP1,"0"
	IMULI	TEMP2,^D10
	ADDI	TEMP2,(TEMP1)
	ILDB	TEMP1,TEMP3
	JUMPN	TEMP1,GETNML
	IMULM	TEMP2,-1(P)
	POPJ	P,

%SYMB:	SKIPGE	TEMP1,CURRNT
	JRST	%SET+2
	HRRZ	CONTEX(TEMP1)
	JRST	EDITNM

%XSYMB:	SKIPGE	TEMP1,CURRNT
	JRST	%SET+2
	HRRZ	TEMP2,CONTEX(TEMP1)
	EXCH	TEMP2,(P)
	JRST	(TEMP2)

%CLEVL:	SKIPA
	JRST	CLEVLA
	MOVE	TEMP1,BLOCKP
	EXCH	TEMP1,(P)
	JRST	(TEMP1)
CLEVLA:	MOVE	BLOCKP
	JRST	EDITNM

%BLEVL:	SKIPA
	JRST	BLEVLA
	SKIPGE	TEMP1,CURRNT
	JRST	%SET+2
	HLRZ	TEMP1,CONTEX(TEMP1)
	MOVE	TEMP2,BLOCKP
	CAME	TEMP1,BLOCK(TEMP2)
	SOJGE	TEMP2,.-1
	EXCH	TEMP2,(P)
	JRST	(TEMP2)
BLEVLA:	SKIPGE	TEMP1,CURRNT
	JRST	%SET+2
	HLRZ	TEMP1,CONTEX(TEMP1)
	MOVE	TEMP2,BLOCKP
	CAME	TEMP1,BLOCK(TEMP2)
	SOJGE	TEMP2,.-1
	MOVE	TEMP2
	JRST	EDITNM

%MAKND:	HRRZ	TEMP1,@(P)
	PUSH	STK2,TEMP1
	HRRZ	TEMP1,STK2
	HLRZ	TEMP2,@(P)
	PUSH	STK2,TEMP2
	AOS	(P)
	JUMPE	TEMP2,.+4
	POP	STK1,TEMP3
	PUSH	STK2,TEMP3
	SOJG	TEMP2,.-2
	PUSH	STK1,TEMP1
	POPJ	P,

%SETRE:	MOVE	STK1,SAVSTK
	MOVE	STK2,SAVSTK+1
	SETZM	%MARK
	POPJ	P,

%DMPTR:	TLO	F,SUCCES
	CAME	STK1,[IOWD ^D128,HOLD]
	JRST	DMPTR
	PUSHJ	%TYPE
	ASCIZ	/?NO TREE/
	JRST	FATAL
DMPTR:	POP	STK1,TEMP1
	PUSH	P,SAVSTK
	PUSH	P,SAVSTK+1
	MOVEM	STK1,SAVSTK
	MOVEM	STK2,SAVSTK+1
	PUSH	P,%MARK
	MOVEM	TEMP1,%MARK
	PUSHJ	P,@(TEMP1)
	POP	P,%MARK
	POP	P,SAVSTK+1
	POP	P,SAVSTK
	MOVE	STK1,SAVSTK
	MOVE	STK2,SAVSTK+1
	POPJ	P,

%CALND:	TLO	F,SUCCES
	HRRZ	TEMP1,@(P)
	MOVE	TEMP2,%MARK
	ADD	TEMP2,1(TEMP2)
	SUB	TEMP2,TEMP1
	HLL	TEMP2,@(P)
	MOVE	TEMP1,2(TEMP2)
	AOS	(P)
	JUMPGE	TEMP2,RECURS
	EXCH	TEMP1,(P)
	JRST	(TEMP1)
RECURS:	CAIG	TEMP1,777777
	JUMPG	TEMP1,CALLVL
	TLNE	TEMP1,40
	JRST	.+3
	MOVE	TEMP2,TEMP1
	JRST	POPCPY
	HRRZM	TEMP1,CURRNT
	MOVE	TEMP2,SYMBOL(TEMP1)
	JRST	POPCPY
CALLVL:	PUSH	P,%MARK
	MOVEM	TEMP1,%MARK
	PUSHJ	P,@(TEMP1)
	POP	P,%MARK
	POPJ	P,

%CPYDC:	SKIPA	TEMP1,[POINT 7,SAVEBF]
	JRST	CPYDCT
	MOVNI	TEMP2,5
	ILDB	TEMP3,TEMP1
	JUMPE	TEMP3,.+2
	SOJA	TEMP2,.-2
	IDIVI	TEMP2,5
	HRLZI	TEMP2,(TEMP2)
	HRRI	TEMP2,SAVEBF
	HRRZI	TEMP1,1(STK2)
	HRLI	TEMP1,(POINT 7,0)
	PUSH	STK1,TEMP1
	PUSH	STK2,(TEMP2)
	AOBJN	TEMP2,.-1
	POPJ	P,
CPYDCT:	SKIPGE	TEMP1,CURRNT
	JRST	%SET+2
	PUSH	STK1,CURRNT
	HRROS	(STK1)
	POPJ	P,

SCATEN=	040000
BACKUP=	100000
NDELET=	200000
SUCCES=	400000
P=	17
F=	16
TEMP1=	13
TEMP2=	14
TEMP3=	15
TEMP4=	11
TEMP5=	10
BUFFPT=	5
CHAR=	12
STK1=	4
STK2=	3

HOLD:	BLOCK	^D128
TREE:	BLOCK	^D512
%MARK:	BLOCK	1
SAVSTK:	BLOCK	2

SCANBF:	BLOCK	^D64
SAVEBF:	BLOCK	^D32

STACK:	BLOCK	3
STACKL:	POINT	7,STACKA+0*^D64*^D16-1,^D34
STACKU:	POINT	7,STACKA+1*^D64*^D16-1,^D34
	POINT	7,STACKA+2*^D64*^D16-1,^D34
	POINT	7,STACKA+3*^D64*^D16-1,^D34
STACKA:	BLOCK	3*^D64*^D16

PDL:	BLOCK	^D512

%LIST:	BLOCK	1
DICTPT:	BLOCK	^D16
DICTCH:	BLOCK	^D16
CURRNT:	BLOCK	1
BLOCKI:	BLOCK	^D16
BLOCK:	BLOCK	^D16
BLOCKP:	BLOCK	1
BLOCKN:	BLOCK	1
SCANPT:	BLOCK	1

FLAGS:	BLOCK	^D256
CONTEX:	BLOCK	^D256
SYMBOL:	BLOCK	^D256
DICT:	BLOCK	^D512

	END