Google
 

Trailing-Edge - PDP-10 Archives - decuslib10-10 - 43,50517/rpgcom.mac
There is 1 other file named rpgcom.mac in the archive. Click here to see a list.
TITLE	RPGCOM for RPGII %1
SUBTTL	Subroutines used by all phases of RPGII

;Copyright (C) 1975, 1976 Bob Currier and Cerritos College

LOC	137
	XWD	VERSION,EDIT

TWOSEG
RELOC	400000

ENTRY	LSTMES		;PUT AN ASCII STRING ONTO LISTING FILE
ENTRY	DEVERA		;DEVICE TRANSMISSION ERROR
ENTRY	DEVDED		;WRITE ERROR ON SCRATCH FILE
ENTRY	EOTAPE		;PUT OUT MAG-TAPE EOT MESSAGE
ENTRY	SIXOUT		;TYPE OUT A SIXBIT WORD
ENTRY	OCTOUT		;OUTPUT AN OCTAL NUMBER
ENTRY	LNKSET		;CREATE A TABLE ADDRESS FROM TABLE-LINK
ENTRY	GETFAZ		;GET NEXT MACHINE LOAD OF INSTRUCTIONS
ENTRY	RESTRT		;RESTART COMPILATION (REENTER)
ENTRY	REDO		;RESTART COMPILATION (START)
ENTRY	KILL		;KILL COMPILATION, DUMP CORE AND FILES
ENTRY	KILLF		;KILL COMPILATION, DUMP FILES ONLY
ENTRY	UUOCAL		;UUO TRAP
ENTRY	FILOUT		;TYPE OUT DEV:FILE.EXT[P,P]
ENTRY	ERATYP		;TYPE OUT ENTER/LOOKUP FAIL MESSAGE
			; Uniquely RPGII routines
			;
ENTRY	TABSCN		;UNIVERSAL TABLE SCAN
ENTRY	GETENT		;GET A TABLE ENTRY
ENTRY	FNDLNK		;FIND NAMTAB LINK
ENTRY	BLNKCK		;CHECK CARD COLUMNS FOR BLANKS
ENTRY	GETIND		;Get an INDTAB entry
ENTRY	GETVAL		;GET A VALTAB ENTRY
ENTRY	IDNTYP		; IDENTIFY CARD TYPE
ENTRY	DATCLR		; CLEAR OUT DATAB ENTRY
ENTRY	GETFTB		; GET AN FTBTAB ENTRY
ENTRY	NMVRFY		; [244] verify a field name

EXTERNAL REGO, GETLOD, PUTLST

;PRINT ASCII TEXT

;ENTER WITH A BYTE POINTER TO THE TEXT STRING IN "TE".

	PUSHJ	PP,PUTLST
LSTMES:	ILDB	CH,TE
	JUMPN	CH,LSTMES-1
	POPJ	PP,
;DEVICE TRANSMISSION ERROR
;THIS ROUTINE IS ENTERED WITH RH OF "CH" POINTING TO A TABLE
;	CONSISTING OF:
;		WORD1: DEVICE NAME IN SIXBIT
;		WORD2: FILE-NAME IN SIXBIT
;		WORD3: FILE-NAME EXTENSION IN LH, IN SIXBIT
;	LH OF CH CONTAINS GETSTS FLAGS WHEN DEVERA CALLED.

;A MESSAGE IS TYPED OUT
;DEVERA WAITS FOR THE OPERATOR TO TYPE "CONTINUE".
;WHEN HE DOES, THE ROUTINE RETURNS TO:
;		CALL+1 IF DEVICE IS MTA
;		CALL+2 IF DEVICE IS DSK OR DTA
;		CALL+3 IF DEVICE IS CDR OR LPT

;IF THE DEVICE IS NOT DTA,DSK,MTA,CDR OR LPT, THIS ROUTINE DOES
;	A CALL [SIXBIT /EXIT/]

;DEVDED ALWAYS CALLS [SIXBIT /EXIT/]


DEVERA:	PUSH	PP,TE
	MOVE	TE,(CH)		;IS IT MTA?
	DEVCHR	TE,
	TLNE	TE,$MTA
	TLNN	CH,$EOT		;YES--END OF TAPE?
	JRST	.+3		;NO

	POP	PP,TE		;YES--RETURN
	POPJ	PP,

	POP	PP,TE

	PUSHJ	PP,DEVERB
	JRST	DEVERC

DEVDED:	PUSHJ	PP,DEVERB
	JRST	DEVER2
;TYPE OUT ERROR MESSAGE

DEVERB:	TTCALL	3,[ASCIZ "TRANSMISSION ERROR FOR "]

DVERB1:	PUSH	PP,TA
	PUSH	PP,TE

	MOVE	TA,(CH)
	PUSHJ	PP,SIXOUT
	MOVEI	TD,":"
	TTCALL	1,TD

	SKIPE	TA,1(CH)
	PUSHJ	PP,SIXOUT

	HLLZ	TA,2(CH)
	JUMPE	TA,DVERB2
	MOVEI	TD,"."
	TTCALL	1,TD
	PUSHJ	PP,SIXOUT
DVERB2:	POP	PP,TE
	POP	PP,TA

	TTCALL	3,[ASCIZ "
"]
	POPJ	PP,


;END OF MAG-TAPE

EOTAPE:	TTCALL	3,[ASCIZ "Mount another reel on "]
	JRST	DVERB1
;GET CHARACTERISTICS OF DEVICE

DEVERC:	MOVE	CH,(CH)
	DEVCHR	CH,
	TLNN	CH,OKDEVS	;IS IT POSSIBLE TO CONTINUE?
	JRST	DEVER2		;NO

	TTCALL	3,[ASCIZ "To retry, type CONTinue
"]
	EXIT	1,

	TLNN	CH,$MTA		;IS IT MAG-TAPE?
	JRST	DEVER1		;YES--EXIT TO CALL+1
	TLNN	CH,$DSK!$DTA	;NO--IS IT DISK OR DEC-TAPE?
	AOS	(PP)		;NO--EXIT TO CALL+3
	AOS	(PP)		;YES--EXIT TO CALL+2
DEVER1:	POPJ	PP,

;CANNOT CONTINUE--EXIT

DEVER2:	TTCALL	3,[ASCIZ "?Cannot continue
"]
	JRST	RESTRT

OKDEVS=$MTA!$DTA!$LPT!$CDR!$DSK
ERATYP:	PUSHJ	PP,FILOUT	;TYPE 'DEV:FILE.EXT[PROJ,PROG]'
	TTCALL	3,[ASCIZ "("]
	HRRZ	TA,I2
	PUSHJ	PP,OCTOUT

	MOVE	TA,ERAPTR
ERAT1:	HLRZ	TB,(TA)
	CAIE	TB,(I2)
	AOBJN	TA,ERAT1

	HRRZ	TA,(TA)
	TTCALL	3,(TA)
	TSWT	FDSKC;
	SWOFF	FECOM;
	JRST	RESTRT


ERAT2:	XWD	0,[ASCIZ ") No file name"]
	XWD	1,[ASCIZ ") Incorrect Proj-Prog no."]
	XWD	2,[ASCIZ ") Protection failure"]
	XWD	3,[ASCIZ ") File being modified"]
	XWD	6,[ASCIZ ") Bab UFD or bad RIB"]
	XWD	14,[ASCIZ ") No room, or quota exceeded"]
	XWD	15,[ASCIZ ") Write lock"]
	XWD	16,[ASCIZ ") Not enough table space in monitor"]
	XWD	0,[ASCIZ ") Unknown error"]

ERAPTR:	XWD	ERAT2-.+1,ERAT2
;TYPE OUT "DEV:FILE.EXT[PROJ,PROG]""

FILOUT:	MOVE	TA,DEVDEV(DA)	;TYPE OUT DEVICE NAME
	PUSHJ	PP,SIXOUT
	MOVEI	CH,":"
	TTCALL	1,CH


	SKIPE	TA,DEVFIL(DA)	;ANY FILE NAME?
	PUSHJ	PP,SIXOUT	;YES--TYPE IT OUT

	SKIPN	TA,DEVEXT(DA)	;ANY EXTENSION?
	JRST	FILO1		;NO
	MOVEI	CH,"."		;YES--TYPE IT OUT
	TTCALL	1,CH

	PUSHJ	PP,SIXOUT

FILO1:	SKIPN	TA,DEVPP(DA)	;ANY PROJ-PROG #?
	JRST	FILO2		;NO
	MOVEI	CH,"["		;YES--TYPE IT OUT
	TTCALL	1,CH

	HLRZ	TA,DEVPP(DA)
	PUSHJ	PP,OCTOUT
	MOVEI	CH,","
	TTCALL	1,CH

	HRRZ	TA,DEVPP(DA)
	PUSHJ	PP,OCTOUT
	MOVEI	CH,"]"
	TTCALL	1,CH


FILO2:	TTCALL	3,[ASCIZ "
"]

	POPJ	PP,


;TYPE OUT THE OCTAL NUMBER IN RH OF "TA"
OCTOUT:	MOVE	TB,[POINT 3,TA,17]
	ILDB	CH,TB
	TLNE	TB,770000
	JUMPE	CH,.-2

OCTO1:	ADDI	CH,"0"
	TTCALL	1,CH

	TLNN	TB,770000
	POPJ	PP,
	ILDB	CH,TB
	JRST	OCTO1
;PUT OUT A SIXBIT WORD ONTO TTY

SIXOUT:	MOVE	TE,[POINT 6,TA]
SIXO1:	ILDB	TD,TE
	JUMPE	TD,SIXEND
	ADDI	TD,40
	TTCALL	1,TD
	TLNE	TE,770000
	JRST	SIXO1
SIXEND:	POPJ	PP,
;PUT MESSAGE ONTO THE LISTING

ENTRY DBMESS

DBMESS:	MOVEI	CH,440700
	HRLM	CH,(PP)
	JRST	DBMES2

DBMES1:	PUSHJ	PP,PUTLST
DBMES2:	ILDB	CH,(PP)
	JUMPN	CH,DBMES1
	AOS	(PP)
	POPJ	PP,
;SET UP A TABLE ADDRESS

;ENTER WITH TABLE-LINK IN "TA"
;	BITS 18-20 = TABLE TYPE, BITS 21-35 = RELATIVE ADDRESS

;EXIT WITH ADDRESS IN "TA"

LNKSET:	LDB	TE,[POINT 3,TA,20]
	ANDI	TA,77777
;	JUMPE	TA,BADLNK
	ADD	TA,@LNKTAB(TE)

	MOVE	TE,LNKTAB(TE)
	HRRZ	TE,1(TE)
	CAIL	TE,-1(TA)
	POPJ	PP,

;IMPROPER LINK TYPE

BADLNK:	TTCALL	3,[ASCIZ "Bad table-link at "]
	SOS	(PP)
	MOVE	TE,[POINT 3,(PP),17]
BADL1:	ILDB	CH,TE
	ADDI	CH,"0"
	TTCALL	1,CH
	TLNE	TE,770000
	JRST	BADL1
	TTCALL	3,[ASCIZ "
"]
	JRST	KILL


;TABLE OF ADDRESSES OF POINTERS

LNKTAB:	EXP	FILLOC
	EXP	DATLOC
	EXP	LITLOC
	EXP	VALLOC
	EXP	PROLOC
	EXP 	EXTLOC
	EXP	ICHLOC
	EXP	INDLOC

;RESTART DUE TO "START" CONSOLE COMMAND

REDO:	MOVEI	SW,0

;RESTART DUE TO "REENTER" CONSOLE COMMAND

RESTRT:	TSWF	FECOM;		;ANY MORE COMMANDS?
	  EXIT			;NO - QUIT
	MOVEI	TA,REGO+2
	AND	SW,[EXP FDSKC]	;TURN OFF ALL FLAGS EXCEPT FDSKC
IFE	ONESEG,<
	MOVE	TB,PHASEN	;ARE WE IN FIRST MACHINE LOAD?
	CAIG	TB,MLOAD1
	  JRST	(TA)		;YES--NO NEED TO LOAD IT
	MOVE	TB,[SIXBIT "RPGII "]
	MOVEM	TB,GETFNM+1
	JRST	GETFZ1

GETFAZ:	MOVEM	TA,GETFNM+1
	MOVEI	TA,REGO
GETFZ1:	MOVEM	TA,GETFST
	JRST	GETLOD
	>
IFN	ONESEG,<
	JRST	RPGIIA##+2

GETFAZ:	MSG	<?Entered GETFAZ in a one-segment compiler
>
	JRST	KILL
	>
;IF THIS ROUTINE IS ENTERED AT "KILL", THE FOLLOWING OCCURS:
;	1) AC'S SAVED
;	2) ALL DEVICES RELEASED
;	3) CORE DUMP OF THE IMPURE AREA TAKEN
;	4) ALL SCRATCH FILES DUMPED


;IF THIS ROUTINE IS ENTERED AT "KILLF", THE FOLLOWING OCCURS
;	1) ALL DEVICES RELEASED
;	2) ALL SCRATCH FILES DUMPED

KILL:	MOVEM	17,KILLAC+17	;SAVE AC'S
	MOVEI	17,KILLAC
	BLT	17,KILLAC+16
	JSP	TB,SETUP
IFE	ONESEG,<			; [264]
	MOVEI	TE,REGO
	>				; [264]
IFN	ONESEG,<			; [264]
	MOVEI	TE,RPGIIK##		; [264]
	>				; [264]

	JRST	KILLCALL

KILLF:	JSP	TB,SETUP
IFE	ONESEG,<			; [264]
	MOVEI	TE,REGO+2
	>				; [264]
IFN	ONESEG,<			; [264]
	MOVEI	TE,RPGIIK+2		; [264]
	>				; [264]


KILLCALL:
IFE	ONESEG,<
	MOVE	TB,[SIXBIT "RPGIIK"]
	MOVEM	TB,GETFNM+1
	MOVEM	TE,GETFST
	JRST	GETLOD
	>
IFN	ONESEG,<
	JRST	(TE)
	>

SETUP:	SKIPE	TA,TOPLOC
	MOVEM	TA,.JBFF##

	MOVSI	TA,71000	;RELEASE ALL DEVICES
KILL1:	XCT	TA
	ADD	TA,[1B12]
	CAME	TA,[XWD 71740,0]
	JRST	KILL1

	MOVE	0,PHASEN	;SAVE PHASE NUMBER FOR RPGIIK
	JRST	(TB)
;HANDLE UUO TRAPS

UUOCAL:	MOVEM	TE,KILLAC+1	;SAVE TE
	LDB	TE,[POINT 9,.JBUUO##,8]; GET OP-CODE OF UUO
	CAILE	TE,HIUUO	;ONE WE RECOGNIZE?
	JRST	UUOC1		;NO--ERROR

	PUSHJ	PP,@UUOTAB(TE)	;YES--EXECUTE A ROUTINE
	MOVE	TE,KILLAC+1	;RESTORE TE
	POPJ	PP,

UUOC1:	MOVEM	CH,KILLAC	;SAVE CH
	TTCALL	3,[ASCIZ "Illegal UUO at location "]
	SOS	(PP)
	MOVE	TE,[POINT 3,(PP),17]

UUOC2:	ILDB	CH,TE
	ADDI	CH,"0"
	TTCALL	1,CH
	TLNE	TE,770000
	JRST	UUOC2

	TTCALL	3,[ASCIZ "
"]
	MOVE	TE,KILLAC+1
	MOVE	CH,KILLAC
	JRST	KILL

UUOTAB:	EXP	UUOC1	;0
	EXP	UUO1	;1 - WARNING DIAG

HIUUO==.-UUOTAB-1	;HIGHEST LEGAL UUO


UUO1:	HRRZ	DW,.JBUUO
	JRST	WARNW

;UNIVERSAL TABLE SCAN
;
;ENTER WITH ADDRESS OF TABLE IN TC, ITEM TO BE SEARCHED FOR IN CH.
;EXIT WITH TABLE INDEX IN TB.
;
;CALL:	PUSHJ	17,TABSCN
;	(ITEM NOT FOUND)
;	(ITEM FOUND)
;

TABSCN:	SETZ	TB,			; ZAP INDEX

TBSCN1:	MOVE	TD,(TC)
	JUMPE	TD,TBSCN2
	AOJ	TC,			; BUMP POINTER
	CAME	CH,TD			; DID WE FIND IT?
	AOJA	TB,TBSCN1		; NO - BUMP INDEX AND LOOP

	AOS	(PP)			; INCREMENT RETURN

TBSCN2:	POPJ	PP,			; RETURN

;GET A TABLE ENTRY
;
;THIS ROUTINE IS USED WHEN A NEW ENTRY IN A TABLE IS NEEDED.
;
;ENTER WITH TABLE CODE IN LH OF TA, TABLE SIZE IN RH
;RETURN WITH POINTER TO TABLE ENTRY IN TA.
;

GETENT:	HLRZ	TB,TA			; EXTRACT TABLE CODE
	CAIL	TB,HINXT		; COMPARE TO SEE IF VALID
	JRST	GETEN3			; IT'S NOT - TELL SOMEONE

GETEN1:	HRRZ	TC,TA			; EXTRACT SIZE OF TABLE
	HRL	TC,TC			; AND LOAD INTO BOTH HALVES
	ADD	TC,@GENTB1(TB)		; SEE IF WE HAVE ENOUGH ROOM
	HLRE	TD,TC			; GET LEFT HALF OF TC
	JUMPGE	TD,GETEN2		; JUMP IF WE RAN OUT OF ROOM

	HRRZ	TA,@GENTB1(TB)		; GET LOC FOR RETURN
	MOVEM	TC,@GENTB1(TB)		; RESTORE xxxNXT
	POPJ	PP,

GETEN2:	PUSHJ	PP,@GENTB2(TB)		; EXPAND APPROPRIATE TABLE
	JRST	GETEN1			; TRY AGAIN

GETEN3:	OUTSTR	[ASCIZ "BAD INDEX IN GETENT AT "]
	JRST	BADLNK+1		; TYPE OUT TOP OF PPLIST

;TABLE OF POINTERS TO FIRST FREE TABLE LOC

GENTB1:	EXP	FILNXT
	EXP	DATNXT
	EXP	LITNXT
	EXP	VALNXT
	EXP	PRONXT
	EXP	EXTNXT
	EXP	ICHNXT
	EXP	INDNXT
	EXP	OTFNXT
	EXP	OCHNXT

HINXT=.-GENTB1


;TABLE OF POINTERS TO EXPANSION ROUTINES

GENTB2:	EXP	XPNFIL
	EXP	XPNDAT
	EXP	XPNLIT
	EXP	XPNVAL
	EXP	XPNPRO
	EXP	XPNEXT
	EXP	XPNICH
	EXP	XPNIND
	EXP	XPNOTF
	EXP	XPNOCH

;Get an INDTAB entry
;
;This routine get a one word entry from INDTAB.
;
;Pointer is left in TA.
;

GETIND:	MOVE	TA,INDNXT##
	AOBJP	TA,GETIN0		; INCREMENT BOTH HALVES
	MOVEM	TA,INDNXT		; RESTORE INDNXT
	ANDI	TA,777777		; GET THE GOOD PART
	MOVEM	TA,CURIND##		; STORE CURRENT POINTER FOR OTHER FOLKS
	POPJ	PP,			; AND EXIT

GETIN0:	PUSHJ	PP,XPNIND##		; EXPAND INDtab
	JRST	GETIND

;GET AN VALTAB ENTRY
;
;THIS ROUTINE GET A ONE WORD ENTRY FROM INDTAB
;
;POINTER IS LEFT IN TA, CURVAL IS UPDATED
;

GETVAL:	MOVE	TA,VALNXT##		; GET VALUE OF NEXT ENTRY
	AOBJP	TA,GETVL0		; INCREMENT, GO EXPAND TABLE IF NECESSARY
	MOVEM	TA,VALNXT		; REPLACE VALUE
	ANDI	TA,777777		; GIVE A MORE USEABLE VALUE
	MOVEM	TA,CURVAL##		; STORE FOR LATER GENERATIONS
	POPJ	PP,			; RETURN

GETVL0:	PUSHJ	PP,XPNVAL##		; EXPAND TABLE
	JRST	GETVAL			; GO TRY AGAIN


;GET AN FTBTAB ENTRY
;
;THIS ROUTINE GETS ONE FTBTAB ENTRY AND RETURNS THE POINTER IN TA
;
;

GETFTB:	MOVE	TC,[XWD SZ.FTB,SZ.FTB]	; GET THAT SIZE
	ADD	TC,FTBNXT##		; ADD TO BOTH HALVES
	HLRE	TD,TC			; GET LEFT HALF
	JUMPGE	TD,GETFT1		; JUMP IF NO ROOM
	HRRZ	TA,FTBNXT		; ELSE GET POINTER
	MOVEM	TC,FTBNXT		; UPDATE POINTER
	POPJ	PP,			; AND EXIT

GETFT1:	PUSHJ	PP,XPNFTB##		; EXPAND THAT TABLE
	JRST	GETFTB			; AND TRY AGAIN
;
;IDNTYP		IDENTIFY CARD TYPE
;
;EXPECTS FRMTYP TO BE IN TB, DESTROYS CH,TC
;
;RET+2 IF NOT IDENTIFIABLE
;

IDNTYP:	MOVE	CH,TB			; SET UP FOR TABLE SEARCH
	PUSH	PP,TB			; SAVE TB FOR LATER
	MOVEI	TC,TYPTAB		; GET TABLE ADDR
	PUSHJ	PP,TABSCN		; SCAN THE TABLE
	  TRNA				; NOT FOUND
	JRST	IDN.01			; POP THEN EXIT
	LDB	CH,[POINT 14,CRDBUF,13]	; get first 2 characters
	CAIN	CH,"**"			; double star?
	  JRST	IDN.01			; yes - ok
	POP	PP,TB			; RESTORE TB
	AOS	(PP)			; [012] INCREMENT RETURN AT PROPER TIME
	SOSE	BADCNT##		; WE HIT JACKPOT YET?
	POPJ	PP,			; NO - KEEP ON TRYING
	OUTSTR	[ASCIZ "
%Over 100 unrecognizable cards found
%Are you sure you have an RPGII program?
"]
	POPJ	PP,			; YES - GIVE ERROR RETURN


IDN.01:	POP	PP,TB			; RESTORE TB
	POPJ	PP,			; AND EXIT

TYPTAB:	"H"				; HEADER
	"F"				; FILE SPECIFICATIONS
	"E"				; EXTENSION SPECS
	"L"				; LINE COUNTER SPECS
	"I"				; INPUT SPECS
	"C"				; CALCULATION SPECS
	"O"				; OUTPUT SPECS
	 Z				; END OF TABLE


;DATCLR		CLEAR OUT A DATAB ENTRY
;
;
;THIS ROUTINE IS CALLED WHEN DATAB HAS BEEN EXPANDED AND THEREFORE
;HAS GARBAGE THAT NEEDS TAKING OUT
;

DATCLR:	MOVEM	TE,SAVEAC		; SAVE AN AC
	HRLZ	TE,TA			; GET SOURCE POINTER
	HRRI	TE,1(TA)		; GET DESTINATION
	SETZM	(TA)			; ZAP THE FIRST WORD
	BLT	TE,SZ.DAT(TA)		; AND BLIT AWAY THAT NAGGING GARBAGE
	MOVE	TE,SAVEAC		; RESTORE TE
	POPJ	PP,			; AND LEAVE NO FORWARDING ADDRESS

;CHECK CARD COLUMNS FOR SPACES (BLANKS)
;
;ENTER WITH BYTE POINTER TO FIRST COLUMN - 1 IN TB, COLUMN COUNT IN TB.
;RETURN IS +1 IF ALL COLUMNS SCANNED ARE BLANK.
;

BLNKCK:	ILDB	CH,TB			; GET A COLUMN
	CAIE	CH," "			; IS IT A BLANK?
	POPJ	PP,			; NO -
	SOJN	TC,BLNKCK		; NO - DECREMENT COUNT AND LOOP IF NOT ZERO

	AOS	(PP)			; ALL DONE - INCREMENT RETURN
	POPJ	PP,			; AND RETURN

;FIND A NAMTAB LINK
;
;THIS ROUTINE SEARCHES THE APPROPRIATE TABLE FOR A NAMTAB LINK.
;
;ENTER WITH TABLE CODE IN TB, NAMTAB LINK IN TA. EXIT WITH NAMTAB LINK
;IN TA, AND APPROPRIATE TABLE POINTER IN TB. NORMAL EXIT+1, ELSE JUST EXIT
;IF NAMTAB ENTRY NOT FOUND.
;

FNDLNK:	MOVE	TE,TA			; STORE NAMTAB LINK
	HRRZ	TC,TA			; STORE HALF WE WANT
	CAIL	TB,HINXT		; SEE IF TABLE CODE IS VALID
	JRST	FNDLK2			; IT'S NOT

	HRRZ	TA,@LNKTAB(TB)		; GET START OF TABLE

FNDLK0:	LDB	TD,@LNKTB2(TB)		; GET NAMTAB LINK
	CAMN	TD,TC			; COMPARE TO ONE WE ARE SEARCHING FOR
	JRST	FNDLK1			; FOUND IT!

	ADD	TA,LNKTB3(TB)		; NO - GET ANOTHER ENTRY
	HRRZ	TD,@GENTB1(TB)		; GET END OF TABLE
	CAMGE	TA,TD			; [054] SEE IF WE HAVE HIT IT YET
	JRST	FNDLK0			; NO HAVEN'T GOT THERE YET - LOOP

	MOVE	TA,TE			; [070] RESTORE NAMTAB POINTER
	POPJ	PP,			; ENTRY NO FOUND

FNDLK1:	MOVE	TB,TA			; SET TB TO LINK
	MOVE	TA,TE			; RESTORE TA
	AOS	(PP)			; INCREMENT RETURN
	POPJ	PP,			; AND RETURN

FNDLK2:	OUTSTR	[ASCIZ /Bad table index in FNDLNK at /]
	JRST	BADLNK+1


;TABLE OF NAMTAB LINKS

LNKTB2:	FI.NAM
	DA.NAM
	Z
	Z
	PR.NAM##
	EX.NAM
	Z
	Z
	Z
	Z

;TABLE OF TABLE ENTRY SIZES

LNKTB3:	SZ.FIL
	SZ.DAT
	SZ.LIT
	SZ.VAL
	SZ.PRO
	SZ.EXT
	SZ.ICH
	SZ.IND
	SZ.OTF
	SZ.OCH

;NMVRFY		Routine to verify the validity of a field name
;
;Valid fields are defined as any combination of six or less letters and
;digits, starting with a letter, and having no imbedded blanks. One
;special case exists in the form of a comma; this character usually means
;that we are handleing an array entry. When a comma is found, checking is
;terminated, and the successfull (+1) return is taken. It is up to other
;routines to verify the index.
;
;This routine added as part of edit [244]
;

NMVRFY:	LDB	CH,[POINT 6,NAMWRD##,5]	; get first character
	CAIL	CH,'A'			; check for valid letter
	CAILE	CH,'Z'			;
	  POPJ	PP,			; error return - not letter
	MOVE	TB,[POINT 6,NAMWRD,5]	; check rest of word

NMVR.1:	ILDB	CH,TB			; get next character
	JUMPE	CH,NMVR.2		; jump if blank
	CAIN	CH,','			; special case?
	  JRST	CPOPJ1			; yes - take valid return
	CAIG	CH,'Z'			; check for between 0 and Z
	CAIGE	CH,'0'			;
	  POPJ	PP,			; isn't - take error return
	CAILE	CH,'9'			; between 9 and A?
	CAIL	CH,'A'			;
	 TRNA				; no - OK
CPOPJ::	  POPJ	PP,			; yes - take error return
	TLNE	TB,770000		; all done?
	  JRST	NMVR.1			; no -
CPOPJ1::AOS	(PP)			; yes - take valid return
	POPJ	PP,			; and exit

NMVR.2:	TLNN	TB,770000		; all done?
	  JRST	CPOPJ1			; yes - take valid return
	ILDB	CH,TB			; No - get another character
	JUMPE	CH,NMVR.2		; loop if space
	POPJ	PP,			; else take error return
;HANDLE WARNING DIAGNOSTICS
;
;THIS ROUTINE DOES NOT DISTURB AC's TA,TB,TC,TD,LN
;IT DOES DISTURB CH,DW,TE
;

WARNW:	MOVEM	TC,SAVEAC##
	MOVE	TC,PHASEN##
	SUBI	TC,"A"-1
	DPB	TC,[POINT 7,DW,25]
	MOVE	TC,SAVELN		; GET LINE NUMBER
	SUBI	TC,2			; MAKE POINT TO CORRECT LINE
	DPB	TC,[POINT 12,DW,14]	; STORE IN ERROR WORD
	PUSHJ	PP,PUTERA##
IFN DEBUG,<
	OUTSTR	[ASCIZ /Diagnostic generated at /]
	POP	PP,TC
	SOS	(PP)
	MOVE	TE,[POINT 3,(PP),17]

WARN2:	ILDB	CH,TE
	ADDI	CH,"0"
	OUTCHR	CH
	TLNE	TE,770000
	JRST	WARN2

	OUTSTR	[ASCIZ /
/]
	AOS	(PP)
	PUSH	PP,TC
	>

	MOVE	TC,SAVEAC
	POPJ	PP,

	$LF==12	;LINE-FEED
	$CR==15	;CARRIAGE-RETURN
	$EOF==32;END OF FILE

	EXTERNAL KILLAC,INDLOC
	EXTERNAL DEVDEV,DEVFIL,DEVEXT,DEVPP
	EXTERNAL LITLOC,FILLOC,DATLOC,EXTLOC,VALLOC,OCHLOC,ICHLOC,PROLOC
	EXTERNAL LITNXT,FILNXT,DATNXT,EXTNXT,VALNXT,OCHNXT,ICHNXT,PRONXT
	EXTERNAL OTFNXT,PRONXT,XPNOTF,XPNPRO
	EXTERNAL XPNLIT,XPNFIL,XPNDAT,XPNEXT,XPNVAL,XPNOCH,XPNICH
	EXTERNAL FI.NAM,DA.NAM,EX.NAM


	EXTERNAL GETFNM, PHASEN, GETFST, MLOAD1,TOPLOC,SAVELN,CRDBUF


IFN DEBUG,<
PATCH::	BLOCK	200		;PATCHING AREA
	>

	END