File MILQAN

Directory of image this file is from
This file as a plain text file

*20
/	MILDRED -- MULTIPLE INDEX LOOKUP, DELETION, REPLACEMENT, AND ENTRY (DISK)
/	    DIRECT DESCENDENT OF:
/	FRED -- FILE REPLACEMENT, ENTRY, AND DELETION
/	29 MAY, 1970
/
/
	LMODE
	SEGMNT 1
	*20
	 
	 
/	BETA REGISTER DEFINITIONS
/		(3, 13, 14, AND 17 ARE UNUSED)
/
	PARAM=1
	FDV=2
	XPNT=4
	XPNT2=5
	LP1=6
	LP2=7
	MARK=10
	ENTSW=11
	NFSW=12
	RET3=15
	RET2=16
/
/	ENTRY POINTS OF MS I/O HANDLERS
/
	READ=7774
	WRITE=7775
	RWFLD=10
/
/   LOAD ADDRESS OF DIAL INDEX -- DO NOT MODIFY: RAMIFICATIONS ARE OVERWHELMING
/
	INDEX=1000
/
/   PDP-8 MODE INSTRUCTIONS FOR USE AFTER IOB
/
	LRMF=6244
	LRIB=6234
	LRIF=6224
/
/
/     ENTRY POINTS FOR MAJOR ROUTINES OF FRED
/
/
	DJR
	JMP LKP000
	DJR
	JMP NTR000
	DJR
	JMP RPL000
	DJR
	JMP DEL000
	EJECT
/
/     LOOKUP - FIND NAMED FILE IN DIAL INDEX
/
/     ENTERED IN LINC MODE WITH ADDRESS OF A PARAMETER
/     LIST IN AC.
/     
/   0/ UNIT NUMBER  /
/   1/ FILE NAME    /
/   2/  CONTD       /
/   3/  CONTD       /
/   4/  CONTD       /
/   5/ TYPE (S OR B)/
/   6/ STARTING BLOCK 
/   7/ NO OF BLOCKS /
/ 
LKP000,	SET I RET3	/ INDICATE EXTERNAL CALL
	7777
LKP010,	SET RET2	/ SAVE RETURN JMP
	0
/
/	GET CALLERS FIELDS AND PARAMETER LIST
/
	BSE I		/ SET BIT 0, LATER BECOMES BIT 1
	4000
	ROL I 2		/ IF-DF BIT TO LINK
	ROR 2		/ RESTORE REST
	BCL I		/ CLEAR HALF-WORD BIT
	4000
	STC PARAM	/ HOLD THE REST
	STC ENTSW	/ CLEAR ENTRY SW
	IOB		/ DO RIB IOT
	LRIB
	STA I		/ HOLD IT
SAVFLD,	0
	ROR 3		/ IF TO BITS 7-11
	BCL I		/ DROP OTHERS
	7740
	BSE I		/ BUILD LIF INST
	LIF
	STC RESTIF	/ FOR RESTORING
	ADD SAVFLD	/ GET DF BITS IN 9-11, 0-1
	ROL 2		/ NOW IN 7-11
	BCL I		/ CLEAR OTHERS
	7740
	BSE I		/ BUILD LDF INST
	LDF
	STC RESTDF	/ SAVE TO RESTORE LATER
	LZE		/ SKIP IF PARMS IN USER INST FLD
	ADD RESTDF
	LZE I		/ SKIP IF PARMS IN HIS DATA FIELD
	ADD RESTIF
	BSE I		/ MAKE AN LDF INST OF IT
	LDF
	STC SETUDF	/ HOLD FOR ADDRESSING PARAMS
/
/     RELOCATE FOR THIS SEGMENT
/
	LDA	 I	/ INIT AC 11=1
	1
	IOB
	LRIF		/ GET INSTRUCTION FIELD IN 6-10
	ROL 1		/ NOW IN 5-9, 10=1, 11=0
	STA		/ HOLD FOR READING
	XPARM+1
	ROR 2		/ FOR BUILDING LDF
	BCL I		/ DROP EXTRANEOUS
	7740
	BSE I
	LDF		/ BECOMES INSTR FOR SETTING TO THIS SEGMENT
	STA		/ HOLD FOR LATER USE
	SETMDF
	BCL I		/ GET SEGMENT BITS
	7774
	ROR 2		/ MOVE TO HIGH ORDER
	ADD PPOINT	/ COMBINE WITH PARAMETER ADDRESS
	STA
	PPNT1&777
	STC PPNT2&777	/...FOR INPUT AND OUTPUT
/
/	READ THE INDEX
/
	JMP SETUDF	/ SET DATA FIELD FOR USERS PARAMS
	LDA PARAM	/ GET UNIT
	BCL I		/ ONLY
	7760
	STC XPARM
	JMP SETMDF	/ SET DATA FIELD TO US FOR RETURN FROM I/O
	PDP		/ PMODE FOR READING
	PMODE
	CIF RWFLD	/ I/O IS IN FIELD 1
	JMS I	PREAD
PPNT1,	XPARM		/ PARAMETER ADDRESS
	LINC
	LMODE
	JMP SETUDF	/ GET USERS PARAMETER LIST
	SET I XPNT
	INDEX
	LDA XPNT	/ GET FIRST WORD OF INDEX
	SAE I		/ SKIP IF VALID FOR INDEX
	5757		/ FIRST WORD OF INDEX
	SKP		/ NOT AN INDEX -- BUILD ONE
	JMP LKP020	/ INDEX IS OK -- GO TO NAME SCAN
/
/     THERE IS NO INDEX -- CREATE ONE
/
	LDA I		/ GET FILLER WORD
	5757
	STA XPNT	/ STORE IN NEXT INDEX WORD
	XSK I XPNT	/ INCREMENT AND TEST FOR END
	JMP .-2		/ ZAP ANOTHER
	XSK I PARAM	/ ADJUST PARAM
	STA XPNT	/ ZAP LAST WORD
	JMP ERRTN	/ RETURN NO FIND
/
/	ADDR OF READ ROUTINE IN FIELD 1
/
PREAD,	READ
	EJECT
/
/     SCAN INDEX FOR NAME
/
LKP020,	LDA I PARAM	/ GET FIRST WORD OF NAME
	STC WORD1	/ SAVE AT COMPARE INST
LKP030,	LDA I		/ CONSTANT 7
	7
	ADM		/ ADD IT TO INDEX POINTER
	XPNT
	XSK XPNT	/ TEST FOR END OF INDEX
	SKP		/ SKIP NOT END
	JMP ERRTN	/ OTHERWISE RETURN NO SUCCESS
	LDA I XPNT	/ GET A WORD OF INDEX NAME
	SAE I		/ SKIP OUT OF LOOP IF FIRST WORDS EQUAL
WORD1,	0
	JMP LKP030	/ LOOP IF NOT EQUAL
	SET XPNT2	/ FIRST WORDS EQUAL
	XPNT		/ START FINAL COMPARE
	SET FDV		/ POINT TEMPORARY FDV INDEX
	PARAM
	SET I LP2	/ SET LOOP COUNTER
	-3
LKP050,	LDA I FDV	/ GET NEXT TWO CHARS
	SAE I XPNT2	/ COMPARE TO THOSE IN INDEX ENTRY
	JMP LKP030	/ UNEQUAL - RETURN TO SEARCH LOOP
	XSK I LP2	/ LOOP TO COMPARE ENTIRE NAME
	JMP LKP050
/
/     IF WE GET HERE, WEVE FOUND THE NAME
/
	LDA I FDV	/ PICK UP SOURCE/BINARY CODE
	SHD I		/ IS THE CODE S?
	2300
	JMP WNTS	/ YES - GIVE HIM SOURCE
	SHD I 		/ IS THE CODE B?
	0200
	JMP WNTB	/ YES - GIVE HIM BINARY
/
/     COME HERE ON DETECTING ERROR, OR UNSUCCESSFUL FIND
/
ERRTN,	XSK RET3	/ TEST FOR INTERNAL CALL
	JMP RET2	/ RETURN NOW IF INTERNAL
	SET 0		/ MOVE IN RETURN JMP
	RET2
RESTOR=.
RESTDF,	LDF		/ MODIFIED FOR...
RESTIF,	LIF		/...USERS FIELDS
	JMP 0		/ RETURN TO CALLER
	EJECT
/
/     WEVE FOUND WHAT HE WANTS - GIVE IT HIM
/
WNTB,	XSK I XPNT2	/ CANT SKIP, BUT THIS ...
	XSK I XPNT2	/...FAKES OUT THE POINTER
WNTS,	XSK RET3	/ IF INTERNAL CALL...
	XSK I RET2	/...SETUP FOR THREE RETURNS
	LDA I XPNT2	/ GET STARTING BLOCK NO FROM INDEX
	STA I FDV	/ STORE IN CALLERS PARAMETER LIST
	LDA I XPNT2 	/ GET NO OF BLOCKS
	APO		/ SKIP IF DESIRED DATA EXISTS
	JMP ERRTN	/ RETURN ERROR IF NO FILE
	XSK RET3	/ DONT STORE RESULT IF INTERNAL
	SKP
	STA I FDV	/ RETURN NO OF BLOCKS
	XSK I RET2	/ INCREMENT JMP RETURN ADDRESS
	JMP ERRTN	/ NOT REALLY AN ERROR
/
/
/	SETUDF - SET DATA FIELD FOR USERS PARAMETER LIST
/
SETUDF,	LDF		/ INSTRUCTION OVERLAID
	JMP 0		/ RETURN
/
/
/	SETMDF - SET DATA FIELD FOR MILDRED
/
SETMDF,	LDF		/ MODIFIED
	JMP 0
/
/
PPOINT,	XPARM&777	/ LOW-ORDER BITS OF XPARM ADDR
/
/     PARAMETERS TO READ ROUTINE
/
XPARM,	0		/ UNIT
	0		/ DATA ADDRESS SHIFTED RIGHT 8 BITS
	346		/ BLOCK NUMBER
	2		/ BLOCK COUNT
	EJECT
/
/     REPLACE -- REPLACE A NAMED ENTRY IN DIAL INDEX
/
/     ENTERED IN LINC MODE AFTER CALLING ENTER.
/     MAY BE CALLED ONLY IMMEDIATELY AFTER ENTER HAS RETURNED TO P+1,
/     INDICATING THAT A FILE OF THE PROPOSED NAME AND TYPE ALREADY EXISTS.
/
RPL000,	SET RET3	/ SAVE RETURN
	0
	XSK I ENTSW	/ TEST FOR NAME FOUND, SET "REPLACE"
RPL010,	HLT		/ ILLEGAL SEQUENCE -- STOP
	XSK ENTSW	/ TEST FOR CONTINUE AFTER HALT
	JMP RPL010	/ BAD BOY -- STOP AGAIN
	JMP SETUDF	/ GET CORRECT DATA FIELD
	LDA I		/ ZAP LENGTH FIELD OF THIS FILE
	5757
	STA XPNT2
	JMP FSP000	/ ALL LOOKS GOOD -- DO YOUR THING
/
/     ENTER -- ADD A NAMED ENTRY TO DIAL INDEX
/
/     ENTERED IN LINC MODE WITH AC POINTING TO A PARAMETER LIST
/     IDENTICAL TO THAT FOR LOOKUP, EXCEPT THAT THE FILE-LENGTH
/     FIELD IS FILLED BY THE USER.
/
/     RETURN IMMEDIATELY FOLLOWING THE JMP (P+1) IF THE FILE ALREADY EXISTS.
/     RETURN TO P+2 IF THERE IS NO ROOM FOR THE FILE.
/     RETURN TO P+3 IF OPERATION COMPLETE (DIAL INDEX HAS BEEN UPDATED).
/
NTR000,	SET RET3	/ SAVE RETURN
	0
	JMP LKP010	/ LOOKUP NAME IN INDEX
	JMP NTR020	/ THIS NAME IS NOT IN INDEX
	JMP NTR010	/ NAME IS IN INDEX, BUT NOT WITH THIS TYPE
/
/     WE FOUND A FILE OF THIS NAME AND TYPE
/
	LDA I 		/ GET CONSTANT -2
	-2
	ADD XPNT2	/ POINT TO POINTER AREA - 2
	STC MARK	/ SAVE POINTER FOR REPLACE
	SET I ENTSW	/ INDICATE READY-FOR-REPLACE
	1776
	JMP RTRN0	/ GO HOME
/
/     FOUND THE NAME, BUT NOT TYPE
/
NTR010,	LDA I		/ CONSTANT -2
	-2
	ADD XPNT2	/ FROM POINTER INDEX
	STC MARK	/ SAVE ADDR OF FILE POINTERS
	JMP NTR030	/ GO BEGIN SCAN FOR FILE SPACE
/
/     NOTHING FOUND IN THE LOOKUP SCAN
/
NTR020,	SET I MARK	/ INDICATE NO FIND
	7777
NTR030,	XSK I RET3	/ NO NAME CONFLICT, INCREMENT RETURN
	EJECT
/
/     FSP - FIND SPACE ON DIAL TAPE FOR NEW FILE
/
FSP000,	LDA I		/ PICK UP SKIP-NEG INSTRUCTION
	APO I		/ MOVED TO FCF050
	STC FCF050	/ STORE IN INDEX-SCAN ROUTINE
	LDA I
	5
	ADD PARAM	/ POINT TO USERS START BLOCK FIELD
	STA 		/ HOLD FOR LATER
	LP1
	STC LP2		/ STORE POINTER
	LDA I LP2	/ PICK UP LENGTH
	APO		/ TEST FOR POSITIVE LEN REQUEST
	JMP RTRN0	/ ELSE RETURN ERROR 
	AZE I		/ SKIP IF LEN NOT ZERO
	JMP RTRN0	/ BOMB IF NULL REQUEST
	STA 		/ HOLD LENGTH HANDY
	TRYLEN
	COM
	ADA I		/ SUBTRACT LEN FROM HIGHEST BLOCK NO, LOW FILE
	270
FSP010,	AZE I		/ SKIP NOT ZERO
	CLR		/ FORCE TRUE ZERO IF RESULT IS 7777
	APO		/ SKIP IF STILL ON THE TAPE
	JMP FSP020	/ NO SPACE IN LOW FILE AREA
	STC TRY		/ HOLD TRIAL STARTING BLOCK
	JMP FCF000	/ GO FIND POSSIBLE CONFLICT
	JMP FSP030	/ HOORAY -- NO CONFLICT
	LDA		/ NOPE -- THAT TRY IS NO GOOD
	TRYLEN
	COM		/ SUBTRACT THE SEARCH LENGTH FROM...
	ADA XPNT	/... THE START BLOCK OF CONFLICT FILE...
	JMP FSP010	/...AND TRY AGAIN
/
/     WEVE FOUND NO SPACE LARGE ENOUGH IN THE LOWER FILE AREA
/
FSP020,	SET I NFSW	/ SET NO-FIND SWITCH
	0
	LDA I		/ PICK UP MINUS END OF TAPE
	-1000
	ADD TRYLEN	/ MINUS LAST FEASIBLE START BLOCK
	STC UPLIM	/ HOLD AS SCAN LIMIT
	JMP FSP035	/ ENTER UPPER SCAN
/
/     TRY POINTS TO GOOD SPACE IN LOWER AREA
/
FSP030,	SET I NFSW	/ INDICATE SPACE FOUND
	7777
	LDA		/ PICK UP OLD TRY
	TRY
	STA		/ SAVE IT
	SVTRY
	ADD TRYLEN	/ GET END BLOCK
	ADA I		/ GET COMPARE CONSTANT (TRYEND-2*INDEX LOC)
	-716
	STC UPLIM	/ MINUS HIGHEST DESIRABLE STARTING BLOCK
FSP035,	LDA I 		/ GET SKIP-POS INSTRUCTION
	APO		/ MOVED TO FCF050
	STC FCF050	/ STORE IN INDEX SCAN ROUTINE
	LDA I 		/ INITIAL STARTING BLOCK, UPPER FILE
	470
FSP040,	STA		/ SET NEW TRY BLOCK
	TRY
	ADD UPLIM	/ COMPARE TO MAXIMUM USABLE BLOCK
	APO I		/ SKIP IF STILL IN USEFUL REGION
	JMP FSP050	/ NO SPACE IN THIS AREA
	JMP FCF000	/ SEARCH FOR CONFLICT
	JMP FSP060	/ WEVE FOUND SPACE
	LDA XPNT	/ THIS TRY WONT WORK...
	ADA XPNT2	/...SO TRY AT END OF CONFLICT FILE
	JMP FSP040
/
/     THERE WAS NO SPACE FOUND IN UPPER FILE AREA
/
FSP050,	XSK NFSW	/ SKIP IF FOUND IN LOWER AREA
	JMP RTRN0	/ RETURN BAD NEWS -- NO SPACE
	LDA		/ GET START BLOCK OF FILE IN LOWER AREA
	SVTRY
	STC TRY		/ THATS THE ONE WELL USE
/
/     THERE IS SPACE AT TRY
/
FSP060,	XSK MARK	/ WAS THERE A FILE BY THIS NAME
	JMP FSP100	/ YES - GO USE THAT ENTRY
/
/     WE MUST SEARCH FOR EMPTY INDEX SPACE
/
	SET I MARK	/ INITIALIZE MARK POINTER
	INDEX
FSP070,	LDA I 		/ BUMP INDEX INDEX
	7
	ADM
	MARK
	XSK MARK	/ TEST FOR END OF INDEX
	SKP		/ NOT END
	JMP RTRN0	/ NO SPACE IN INDEX -- RETURN ZERO
	LDA I MARK	/ FIRST WORD OF INDEX NAME
	SAE I		/ CHECK FOR EMPTY ENTRY
	5757
	JMP FSP070	/ NOT EMPTY, TRY NEXT
/
/     MARK POINTS TO AN UNUSED INDEX ENTRY
/     PUT THE NAME INTO IT
/ 
	LDA PARAM	/ FIRST WORD OF USER NAME
	STA MARK	/ PLUNK INTO INDEX
	LDA I PARAM	/ 2ND
	STA I MARK
	LDA I PARAM	/ 3RD
	STA I MARK
	LDA I PARAM	/ 4TH
	STA I MARK
	LDA I PARAM	/ TYPE CONTROL (S OR B)
	SHD I		/ IS TYPE S
	2300
	JMP FSP080	/ YES
	SHD I		/ IS TYPE B
	0200
	JMP FSP090	/ YES
	JMP RTRN0	/ NO-- BOMB NOW
	EJECT
/
/     HE WANTS A SOURCE FILE -- SCRATCH THE BINARY POINTERS
/
FSP080,	SET LP2		/ TEMP POINTER
	MARK
	XSK I LP2	/ CANT SKIP
	XSK I LP2	/ DITTO
	LDA I 		/ GET 57S...
	5757
	STA I LP2	/ STORE THEM...
	STA I LP2	/... IN BINARY POINTERS
	JMP FSP100
/
/     HE WANTS BINARY FILE
/
FSP090,	LDA I 
	5757
	STA I MARK	/ STORE 57S...
	STA I MARK	/...IN SOURCE POINTERS
/
/     MARK NOW POINTS TO POINTER AREA OF DESIRED TYPE IN A NAMED INDEX ENTRY
/
FSP100,	LDA		/ PICK UP STARTING BLOCK
	TRY
	STA I MARK	/ STORE IN INDEX
	STA LP1		/ STORE IN USERS LIST
	LDA I LP1	/ GET LENGTH
	STA I MARK	/ STORE IN INDEX
/
/     NOW EVERYBODY IS HAPPY EXCEPT THE TAPE, WHICH HASNT BEEN UPDATED
/
	XSK I RET3	/ BUMP RETURN ADDR
FSP110,	JMP SETMDF	/ SET DATA FIELD TO MILDRED
	PDP
	PMODE		/ PMODE FOR I/O
	CIF RWFLD	/ ROUTINES IN FIELD ONE
	JMS I	PWRITE
PPNT2,	XPARM		/ RELOCATED FOR THIS SEGMENT
	LINC
	LMODE
RTRN0,	SET 0		/ MOVE RETURN JMP TO 0
	RET3
	DJR
	JMP RESTOR	/ RETURN TO USER
/
/	ADDR OF WRITE ROUTINE IN FIELD 1
/
PWRITE,	WRITE
	EJECT
/
/     FIND POSSIBLE CONFLICT BETWEEN INDEX ENTRY AND TRIAL STARTING BLOCK
/
/     CALLER MUST SET OR CLEAR I-BIT IN FCF050 TO SELECT DESIRED FILE AREA
/
FCF000,	SET RET2	/ SAVE RETURN
	0
	SET I XPNT	/ INITIALIZE POINTER TO INDEX IN CORE
	INDEX+6
FCF010,	XSK I XPNT	/ SKIP ON END OF INDEX
	SKP
	JMP RET2	/ END OF INDEX, RETURN NO CONFLICT
	XSK I XPNT	/ INCREMENT AGAIN, NO SKIP POSSIBLE
	LDA		/ PICK UP POINTER
	XPNT
	ROR I 3		/ MOVE BIT 9 TO LINK
	LZE		/ SKIP IF NAME AREA OF ENTRY
	JMP FCF040	/ JMP IF POINTER AREA
	LDA XPNT	/ GET FIRST WORD OF NAME
	SAE I		/ SKIP IF EMPTY ENTRY
	5757
	JMP FCF030	/ WORD IS VALID NAME
	LDA I		/ GET CONSTANT 6
	6
	ADM		/ ADDRESS NEXT ENTRY - 2, THIS ONE IS EMPTY
	XPNT
	JMP FCF010	/ TRY NEXT INDEX ENTRY
FCF030,	LDA I		/ INCREMENT BY 4
	4
	ADM		/...TO ADDRESS POINTER
	XPNT
/
/     XPNT NOW ADDRESSES A STARTING BLOCK NO
/
FCF040,	LDA XPNT	/ PICK UP STARTING BLOCK
	ADA I		/ SUBTRACT INDEX LOCATION
	-347
FCF050,	APO		/ REVERSE SENSE BIT MAY BE SET BY CALLER
	JMP FCF010	/ TRY AGAIN IF WRONG FILE AREA
	SET XPNT2	/ TEMP POINT TO LENGTH WORD
	XPNT
	LDA I XPNT2	/ PICK UP LENGTH
	APO		/ SKIP IF LENGTH POS
	JMP FCF010	/ NEG LEN -- NO FILE HERE
	EJECT
/
/     WE NOW HAVE A VALID INDEX ENTRY
/     COMPARE IT TO TRY
/
	LDA XPNT	/ STARTING BLOCK OF THIS FILE
	BCL I		/ CLEAR GARBAGE IN HIGH THREE BITS
	7000
	COM
	ADD TRY		/ SUBTRACT XSTART FROM TRY
	APO		/ SKIP IF TRY ABOVE XSTART
	JMP FCF060	/ JMP IF BELOW
/
/     TRY IS ABOVE THE START OF THIS FILE
/
	COM		/ MAKE DIFFERENCE NEGATIVE
	ADA XPNT2	/ SUBTRACT DIFFERENCE FROM FILE LENGTH
	APO		/ ZERO RESULT WILL BE NEG (7777)
	JMP FCF010	/ NO CONFLICT, TRY NEXT ENTRY
	JMP FCF070	/ CONFLICT FOUND -- RETURN
/
/     THE TRY IS BELOW OR AT THE START OF THIS FILE
/
FCF060,	ADD TRYLEN	/ SUBTRACT STARTING DIFF FROM LEN OF TRY
	APO		/ SKIP IF CONFLICT
	JMP FCF010	/ NO CONFLICT - TRY NEXT ENTRY
/
/     WE HAVE FOUND A CONFLICT -- RETURN IT TO CALLER
/
FCF070,	XSK I RET2	/ INCREMENT RETURN ADDRESS
	JMP RET2	/ GO BACK
/
/     WORK AREA
/
TRY,	0
TRYLEN,	0
SVTRY,	0
UPLIM,	0
	EJECT
/
/     DELETE -- REMOVE A FILE FROM THE DIAL INDEX
/
/     SAME CALLING SEQUENCE AS LOOKUP, EXCEPT NO ALTERNATE RETURNS
/
DEL000,	SET RET3	/ SAVE RETURN
	0
	JMP LKP010	/ LOOKUP NAME IN INDEX
	JMP RTRN0	/ DIDNT FIND THE FILE
	JMP RTRN0	/ DITTO
	LDA I		/ DECREMENT XPNT2
	-1
	ADM		/...TO ADDRESS START BLOCK FIELD
	XPNT2
	LDA I		/ EMPTY AREA INDICATOR
	5757
	STA XPNT2	/ ZAP START BLOCK FIELD
	STA I XPNT2	/ DITTO LEN
	LDA 		/ GET POINTER
	XPNT2
	BCO I		/ ADDRESS OTHER TYPE LEN FIELD
	2
	STC XPNT2
	LDA XPNT2	/ PICK LENGTH OF OTHER-TYPE FILE
	APO I		/ SKIP IF OTHER-TYPE EMPTY
	JMP FSP110	/ GO RE-WRITE INDEX
	LDA I		/ BOTH TYPES EMPTY -- CLEAR NAME
	5757
	STA XPNT	/ ZAP FIRST WORD OF NAME
	STA I XPNT	/ 2ND
	STA I XPNT	/ 3RD
	STA I XPNT	/ 4TH
/
/	WAS THAT THE LAST FILE ?
/
	SET I XPNT	/ POINT TO INDEX
	INDEX-1		/...FOR SCAN
DEL010,	SAE I XPNT	/ IS THERE ANY ENTRY?
	JMP FSP110	/ YES - REWRITE INDEX
	XSK XPNT	/ HAVE WE CHECKED ALL?
	JMP DEL010	/ NO - LOOP
/
/	INDEX IS EMPTY: FILL WITH ZERO
/
	CLR
	SET I XPNT	/ RESET POINTER
	INDEX-1
	STA I XPNT	/ CLEAR NEXT WORD
	XSK XPNT	/ DONE?
	JMP .-2
	JMP FSP110	/ RE-WRITE INDEX
	EJECT
/
/     THIS WILL CAUSE AN ASSEMBLY ERROR IF ROUTINE BECOMES SO LARGE
/     THAT INDEX WILL OVERLAY CODE WHEN IT IS READ IN
	ASMIFM INDEX-.
	NAUGHTY BAD BOY - ROUTINE IS TOO BIG FOR ONE FIELD.
/	IN CASE OF MINOR SIZE PROBLEMS, REMOVE 5 LINES OF CODE AT FCF040.
/	REMOVE 3 LINES AT FSP000, AND THREE LINES AT FSP035.  THIS SHOULD
/	REMOVE ALL REFERENCES TO FCF050.  ALL OTHER TAGS MUST BE RETAINED.
/
/
/
/	END OF MILDRED
/
/QANDA SUBROUTINE FOR THE
/PDP-12
/REMOVE *1000 BELOW IF
/INSERTING SOURCE DIRECTLY
/INTO YOUR PROGRAM SOURCE
	LMODE
	SEGMNT 2
*1000 /REMOVE,IF DESIRED
/
/TO HERE TO INITIALIZE THE ROUTINE
/
QAINIT,	LDA I		/SAVE JMP RETURN
	2
	ADD 0
	STA I
QAB,	0		/JMP 	+3
	ADD QAL+3
	STC 1		/PTR TO FIRST PARAM
	LDA 1		/GET FIRST PARAM
	ADD QAQ+1	/PTR TO HALFWORD-1
	STC QAG-3
	LDA I 1
	STC QARFSH-1
	STC 6		/XR6 USED AS A SWITCH. =0 IF NO ANSWER FIELD, =1777 IF YES
QACA,	SET 3	/XR3 TO PTR TO ANSWERS
	QARFSH-1
	SET 4		/XR4 TO PTR TO QUESTIONS
	QAG-3
			/TO HERE IF FIRST TIME THROUGH OR FOLLOWING A CR
	SET 1
	4
	JMP QAT
	NOP		/F
	LDH I 4		/H. BUMP PTR IF H OR F
QAD,	JMP QAO
	JMP .+6		/74
	JMP QAE		/34
	SAE I		/CR?
	43
	JMP QAD		/NO
	JMP QACA+4 /EXAMINE NEXT CHAR
			/INITIALIZE ANSWER BUFR
	STH 3		/74 TO ANSWERS
	LDH I 4		/NEXT HALFWORD
	ADA I
	-60
	COM
	STC 6
	STH I 3		/0 IN AC
	XSK I 6
	JMP .-2
	LDH I 3		/BUMP PTR TO ANSWERS
	JMP QAD
			/ANSWER BUFR IS INITIATED
QAE,	STH 3
	SET I 4		/XR4 TO PTR TO LAST TYPED CHAR IN ANSWER BUFR
	0
			/----RE-ENTER HERE TO REFRESH----
QARFSH,	LDA I		/INITIAL Y POSITION
277
	STC QAH-1
	SET I 3		/XR3 TO PTR TO HALFWORD QUESTIONS-1
	0
	SET 5		/XR5 TO PTR TO LAST DISPLAYED CHAR IN ANSWER BUFR
	QARFSH-1
QAG,	SET 1
	3
	JMP QAT
	JMP .+7		/F
	LDH I 3		/H. BUMP PTR
	LDA I		/NEITHER. ASSUME HALF SIZE
	BCL I
	STC QAM+2	/SET INSTR TO CLEAR FF FOR HALF SIZE
	ADD QAW		/NOP IN AC
	JMP QAM
	LDH I 3		/BUMP PTR
	LDA I
	BSE I
	STC QAM+2	/SET INSTR TO SET FF FOR FULL SIZE
	ADD QAW+1	/ADD 9U IN AC
QAM,	STC QAP+3
	MSC I 4		/EAD CONTROL REGISTER
	BSE I		/THIS INSTR CHANGES. EITHER BSE & OR BCL &
	200
	MSC 4		/AC TO CONTROL REGISTER
	SET I 1		/XR1 TO INITIAL X POSITION
	100
	LDA I		/Y COORDINATE MULTIPLE
	-40
	ADM I		/Y COORDINATE
	0
QAH,	LDH I 3
	JMP QAO+1
	JMP QAZ		/74 BUMP PTR TO NEXT CHAR, PUT 40 IN AC
	JMP QAJ		/34
	SHD I		/NEITHER
	4300
	JMP QAG		/CR. MOVE X AND Y COORDINATE
	JMP QAP		/ISPLAY CHAR
	JMP QAH		/PICK UP NEXT CHAR
	JMP QAP		/TO HERE IF DISPLAYING ANSWER BUFR
	SRO I	/SWITCH TO DISPLAY CURSOR. EITHER 0000 OR 7777
	0		/IFXR4=XR5, THEN SWITCH=7777
	JMP QAF
			/QUESTION MODE
QAI,	LDH I 5
	JMP QAO+1
	JMP QAH		/74
	JMP QAH		/34
	JMP QAI-4	/NEITHER. DISPLAY IT
QAJ,	JMP GETKBD	/TO HERE IF DISPLAYED BUFFER
	AZE I
	JMP QAB	/NOTHING TYPED . EXIT
	SET I 2
	QAY
	SHD 2		/LF?
	JMP QAK+4	/YES. EXIT
	SHD I 2		/CR?
	JMP QAN
	XSK 6		/IS THERE AN ANSWER FIELD?
	JMP QARFSH
	SHD I 2		/<?
	JMP QAL
	SHD I 2		/>?
	JMP QAK
	SHD I 2		/ALT?
	JMP QACA /REINITIALIZE
	SHD I 2		/BACK SLASH?
	JMP QARFSH	/IGNORE
	SHD I 2		/RUBOUT?
	JMP QAL		/IGNORE
	SHD I 2		/TAB?
	JMP QARFSH	/IGNORE
	STC .+5		/ACCEPTABLE CHAR
	JMP QAO		/TEST NEXT CHAR
	JMP QAQ		/74 BACK PTR UP BY 1
	JMP QAQ		/34 ^
	LDA I		/OK. STORE IT
	0
	STH 4
	JMP QARFSH	/REDISPLAY
QAL,	LDH 4		/TO HERE IF RUBBOUT OR <
	JMP QAO+1
	JMP QARFSH	/74 IGNORE
	-6002
	LDH 2		/TEST THE CHAR
	SAE I		/RUBOUT?
	37
	JMP QAQ		/NO. BACK PTR UP BY 1
	SET 5
	4
	SET 3
	4
	JMP .+2
	LDH I 5		/BUMP PTR
	LDH I 3		/GET NEXT CHAR
	JMP QAO+1
	NOP		/IF 74 OR 34, REPLACE CURRENT CHAR WITH 0
	CLR
	STH 5
	AZE		/WAS IT 74 OR 34?
	JMP .-7		/NO. CONTINUE
	JMP QAQ		/BACK PTR UP BY 1
			/TO HERE IF CR
QAN,	XSK 6	
	JMP QAK+4	/EXIT ROUTINE IF NO ANSWER FIELD
	JMP QAO
	JMP QARFSH	/74 MOVE PTR TO NEXT QUESTION FIELD
	JMP QAE+1	/34 END OF BUFR. MOVE PTR TO FIRST QUESTION FIELD
	JMP QAN+2
	
QAO,	LDH I 4		/S\R
	SHD I		/	+1 74 BEGIN FIELD
	7400		/	+2 34 END BUFR
	JMP 0		/	+3 NEITHER 74 NOR 34
	SAE I
	34
	XSK I 0
	XSK I 0
	JMP 0
			/S\R TO DISP LINC CHAR IN AC
QAP,	ROL 1		/MULT BY 2 FOR INDEX TO ADDRESS OF TABLE
	ADD QAX+4
	STC 2		/ADDRESS OF CHAR TO DISP IN XR2
	ADD QAU		/THIS INSTR CHANGES. EITHER OP OR ADD 9U
	ADD QAU
	ADD 1		/ADD 4 TO XR1 TO SPACE CHAR
	STC 1
	ADD 5		/GET ADDRESS OF ANSWER BUFR
	COM
	ADD 4
	AZE
	CLR
	STC QAI-2	/SWITCH=0 OR 7777
	ADD QAH-1	/Y COORDINATE IN AC
	DSC 2
	DSC I 2		/DISPLAY CHAR
	JMP 0
QAQ,	LDA I		/BACK UP PTR BY 1
	-4000
	ADM
	4
	JMP QARFSH	/REDISPLAY
			/
QAT,	LDH I 1		/S\R
	SHD I		/	+1 F
	0600		/	+2 H
	JMP 0		/	+3 NEITHER
	SAE I
	10
	XSK I 0
	XSK I 0
	JMP 0
			/
QAZ,	LDH I 3
	LDA I
	40
	JMP QAI-4
			/TO HERE IF >
QAK,	LDH I 4
	AZE I		/IS CURRENT CHAR BLANK?
	JMP QAQ		/YES. IGNORE
	JMP QAX		/MOVE DOT FORWARD
			/TO HERE TO EXIT WITH SKIP
	LDA I
	1
	ADM
	QAB
	JMP QAB
			/CHARACTER PATTERNS
QAV,	0101		/KBD 0, ILLEGAL. USED AS MARKER
	0101
	4477		/1:A
	7744
	5177		/2:B
	2651
	4136		/3:C
	2241
	4177		/4:D
	3641
	4577		/5:E
	4145
	4477		/6:F
	4044
	4136		/7:G
	2645
	1077		/10:H
	7710
	7741		/11:I
	0041
	4142		/12:J
	4076
	1077		/13:K
	4324
	0177		/14:L
	0301
	3077		/15:M
	7730	
	3077		/16:N
	7706	
	4177		/17:O
	7741
	4477		/20:P
	3044
	4276		/21:Q
	0376
	4477		/22:R
	3146
	5121		/23:S
	4651
	4040		/24:T
	4077
	0177		/25:U
	7701	
	0176		/26:V
	7402
	0677		/27:W
	7701
	1463		/30:X
	6314
	0770		/31:Y
	7007
	4543		/32:Z
	6151
	4177		/33:/
	0000
			/34:BACKSLASH IGNORED ON INPUT
	0		/NOT USED
	0		/NOT USED
	0000		/35:]
	7741
			/CODES 36:ALT, 37:RUBOUT NOT DISPLAYED
QAY,	4543		/LF,CR
	7476		/<,>
	3634		/ALT, BACKSLASH
	3747		/RUBOUT, TAB
	0000		/40:SPACE
	0000
	7500		/41:X!
	0000
	7000		/42:"
	0070
			/CODES 43:, 44:, 45:LF NOT DISPLAYED
QAX,	JMP QAO+1
	JMP QAQ
	JMP QAQ
	JMP QARFSH
	QAV
	0		/NOT USED
	5166		/46: &
	0526
			/CODE 47:TAB NOT DISPLAYED
	0		/NOT USED
	0		/NOT USED
	3600		/50:(
	0041
	4100		/51:)
	0036
	2050		/52:*
	0050
	0404		/53:+
	0437
	0500		/54:,
	0006
	0404		/55:-
	0404
	0001		/56:.
	0000
	0601		/57:\
	4030
	4536	/60:0
	3651
	2101		/61:1
	0177
	4523		/62:2
	2151
	4122		/63:3
	2651
	2414		/64:4
	0477
	5172		/65:5
	0651
	1506		/66:6
	4225
	4443		/67:7
	6050
	5126	/70:8
	2651
	5122		/71:9
	3651
	2200		/72::
	0000
	4601		/73:;
	0000
			/CODE 74:<NOT DISPLAYED
QAU,	2		/CONSTANT
	0	/NOT USED
	1212		/75:=
	1212
			/CODE 76:> NOT DISPLAYED
QAW,	NOP
	ADD QAU
	4020		/77:?
	2055
/
QAF,	DSC I
	6000
	JMP QAI
/
			/END Q+A
/
/
/
/
/KEYBOARD INPUT ROUTINE
/
QAKRB=6036	/PDP-8 IOT KBD
QATSF=6041	/TSF
QATLS=6046	/TLS
/
GETKBD,	LDA
	0
	STC QAEXIT+6	/SAVE RETURN
	ADD 1		/SAVE XRS 1 AND 2
	STC QAEXIT+3
	ADD 2
	STC QAEXIT+5
	STC QAEXIT+1
	KST	/WAS SOMETHING TYPED?
	JMP 0		/NO: EXIT
	IOB
	QAKRB	/GET TTY CHAR, CLEAR FLAG
	STA I		/SAVE IT
QATY,	0
	ADA I
	-237
	APO		/BETWEEN 200 AND 237?
	JMP QACNTR	/CONTROL CHAR. CHECK FOR CR,LF,TAB
/
	SET I 1		/NO
	QACHAR-1
	SET I 2
	-7
	LDA
	QATY
	SAE I 1
	JMP .+2
	JMP QAEXIT	/ILLEGAL CHAR. DONT ECHO
	XSK I 2	/CHECKED THEM ALL?
	JMP .-4
/
	ADA I
	-337
	APO		/BETWEEN 240 AND 337?
	JMP QALEGL	/YES. LEGAL CHAR
/
	SAE I 1		/NO. CHECK FURTHER.
	JMP .+7
	LDA I		/RUBOUT
	334
	JMP QATPE	/ECHO BACKSLASH
	LDA I
	37
	JMP QAEXIT+2	/LEGAL EXIT
/
	SAE I 1
	JMP QAEXIT	/ILLEGAL
			/ALT
	JMP QAEXIT+2	/EXIT, DONT ECHO
/
QALEGL,	LDA
	QATY
	JMP QATPE	/ECHO CHAR
	ADD QATY
	BCL I		/STRIP IT TO 6-BIT
	7700
	JMP QAEXIT+2
/TO HERE IF CONTROL CHAR
QACNTR,	SAE I
	7755
	JMP QACKLF
	LDA I		/CR
	43
	STC QAEXIT+1
	LDA I
	215
	JMP QATPE
	LDA I
	212
	JMP QATPE
	JMP QAEXIT
/
QACKLF,	SAE I
	7752
	JMP .+4
	LDA I		/LF
	45
	JMP QACNTR+5
	SAE I
	7751
	JMP QAEXIT	/ILLEGAL
	LDA I
	47
	JMP QAEXIT+2	/EXIT, DONT ECHO
/
QAEXIT,	LDA I	/GET 6-BIT ASCII
	0
	SET I 1		/RESTORE XRS
	0
	SET I 2
	0
	JMP		/EXIR S\R GETKBD
/S\R TO PRINT C(AC)
QATPE,	IOB
	QATLS	/PDP-8 IOT TLS
	LDA
	0
	STC .+4	/SAVE RETURN
	IOB
	QATSF	/WAIT FOR FLAG
	JMP .-2
	JMP 	/EXIT
/
QACHAR,	243	/HASH
	244	/DOLLAR SIGN
	245	/PER CENT
	247	/APOSTROPHE
	300	/AT SIGN
	336	/UP ARROW
	337	/BACK ARROW
	40	/RUBOUT
	36	/ALT
/END OF S\R GETKBD



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search