;	This routine is the state table for the call to LIB$TPARSE which
;	parses the commands entered at the HEX> prompt.  It in essence,
;	drives the entire program because it calls the appropriate routines
;	based on the user's input.
;
	.TITLE		HEXPARSER	HEX state table for LIB$TPARSE

	.ENABLE	GLOBAL				; look to the PASCAL routines
						; for undefined symbols

	APOSTROPHE	= ^X27		; Define constants
	ASTERISK	= ^X2A
	SEMICOLON	= ^X3B
	TILDE		= ^X7E


	$INIT_STATE	HEX_PARSE_STATE,HEX_PARSE_KEY

	$STATE	START

	$TRAN	TPA$_EOS, TPA$_EXIT		; null string is valid

	; Initial key words

	$TRAN	'ADDRESSING',	ADDRESS_STATE
	$TRAN	'AND',		AND_STATE,	RESET_RANGE,,,0
	$TRAN	'APPEND',	APPEND_STATE,	RESET_RANGE,,,0
	$TRAN	'COMPARE',	READ_STATE,	RESET_RANGE,,,3
	$TRAN	'COMPLEMENT',	COMP_STATE,	RESET_RANGE,,,0
	$TRAN	'COPY',		COPY_STATE,	RESET_RANGE,,,0
	$TRAN	'CRC',		CRC_STATE,	RESET_RANGE,,,0
	$TRAN	'CSUM',		CSUM_STATE,	RESET_RANGE,,,0
	$TRAN	'DECREMENT',	DEC_STATE,	RESET_RANGE,,,1
	$TRAN	'DISPLAY',	DISPLAY_STATE,	RESET_RANGE,,,0
	$TRAN	'DIVIDE',	DIVIDE_STATE,	RESET_RANGE,,,1
	$TRAN	'ECHO',		TPA$_EXIT,	DO_ECHO
	$TRAN	'EDIT',		EDIT_STATE,	RESET_RANGE,,,0
	$TRAN	'EXIT',        	TPA$_EXIT,	DO_EXIT
	$TRAN	'FILL',		FILL_STATE,	RESET_RANGE,,,0
	$TRAN	'FORMAT',	FORMAT_STATE
	$TRAN	'HELP',		HELP_STATE
	$TRAN	'IDENT',	TPA$_EXIT,	DO_IDENT
	$TRAN	'INCREMENT',	INC_STATE,	RESET_RANGE,,,1
	$TRAN	'INIT',		INIT_COMMAND_STATE,	RESET_RANGE,,,2
	$TRAN	'MOVE',		MOVE_STATE,	RESET_RANGE,,,0
	$TRAN	'MULTIPLY',	MULT_STATE,	RESET_RANGE,,,0
	$TRAN	'NAME',		NAME_STATE
	$TRAN	'NEGATE',  	NEG_STATE,	RESET_RANGE,,,0
	$TRAN	'NOECHO',	TPA$_EXIT,	DO_NOECHO
	$TRAN	'OFFSET',	OFFSET_STATE
	$TRAN	'OR',		OR_STATE,	RESET_RANGE,,,0
	$TRAN	'READ',		READ_STATE,	RESET_RANGE,,,4
	$TRAN	'REVERSE',	REVERSE_STATE,	RESET_RANGE,,,0
	$TRAN	'REMAINDER',	REMAINDER_STATE,RESET_RANGE,,,1
	$TRAN	'ROTATE',   	ROTATE_STATE,	RESET_RANGE,,,1
	$TRAN	'SEARCH',	SEARCH_STATE,	RESET_RANGE,,,0
	$TRAN	'SHIFT',	SHIFT_STATE,	RESET_RANGE,,,1
	$TRAN	'SUM',		SUM_STATE,	RESET_RANGE,,,0
	$TRAN	'TRANSFER',	TRANSFER_STATE
	$TRAN	'USE',		USE_STATE,	RESET_RANGE,,,0
	$TRAN	'WRITE',   	WRITE_STATE,	RESET_RANGE,,,0
	$TRAN	'XOR',		XOR_STATE,	RESET_RANGE,,,0
	$TRAN	'.',		TPA$_EXIT,	DO_CLI
	$TRAN	'$',		TPA$_EXIT,	DO_CLI
	$TRAN	'@',		TPA$_EXIT,	DO_COMMAND_FILE
	$TRAN	'?',		HELP_STATE
	$TRAN	SEMICOLON,	TPA$_EXIT
	$TRAN	ASTERISK,	TPA$_EXIT,	DISPLAY_COMMENT

	$END_STATE


	;***********************************************************************
        ;
	;			Get Range Parameters Subexpression
	;
	;***********************************************************************

	$STATE	RANGE_STATE	; check for ODD or EVEN keyword

	$TRAN	'ODD',		RANGE_STATE_1,SET_ODD_EVEN,,,1
	$TRAN	'EVEN',		RANGE_STATE_1,SET_ODD_EVEN,,,2
	$TRAN	TPA$_LAMBDA,	RANGE_STATE_1

      	$END_STATE

	$STATE	RANGE_STATE_1	; look for FROM

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'FROM',		RANGE_STATE_2

	$END_STATE


	$STATE	RANGE_STATE_2	; look for a legal address for FROM

	$TRAN	'LOW',		RANGE_STATE_3, SET_HIGH_LOW,,,1
	$TRAN	'HIGH',		RANGE_STATE_3, SET_HIGH_LOW,,,2
	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	RANGE_STATE_3, CHECK_ADDRESS,,,1

	$END_STATE


	$STATE	RANGE_STATE_3	; look for THRU

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'THRU',		RANGE_STATE_4

	$END_STATE


	$STATE	RANGE_STATE_4	; look for a legal address for THRU

	$TRAN	'LOW',		RANGE_STATE_5, SET_HIGH_LOW,,,3
	$TRAN	'HIGH',		RANGE_STATE_5, SET_HIGH_LOW,,,4
	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	RANGE_STATE_5, CHECK_ADDRESS,,,2

	$END_STATE


	$STATE	RANGE_STATE_5	; look for STEP

	$TRAN	'STEP',		RANGE_STATE_6
	$TRAN	TPA$_LAMBDA,	TPA$_EXIT

	$END_STATE


	$STATE	RANGE_STATE_6	; look for step param

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	TPA$_EXIT, SET_STEP

	$END_STATE


	;***********************************************************************
        ;
	;			Get With/By Parameters Subexpression
	;
	;***********************************************************************

	$STATE WITH_STATE	; look for a valid WITH/BY character

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	TPA$_EXIT, SET_WITH,,,1
	$TRAN	'^',		WITH_STATE_1
	$TRAN	APOSTROPHE,	WITH_STATE_2,TURN_ON_BLANKS
	$TRAN	TILDE,		WITH_STATE_3
	$TRAN	'-',		WITH_STATE_4,TURN_ON_BLANKS

	$END_STATE


	$STATE WITH_STATE_1	; by character ^c

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'#',		TPA$_EXIT, SET_WITH,,,2
	$TRAN	TPA$_ANY,	TPA$_EXIT, SET_WITH,,,3

	$END_STATE


	$STATE WITH_STATE_2	; by character 'c

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_ANY,	TPA$_EXIT, SET_WITH,,,4

	$END_STATE


	$STATE WITH_STATE_3	; by character ~c

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'#',		TPA$_EXIT, SET_WITH,,,5
	$TRAN	TPA$_ANY,	TPA$_EXIT, SET_WITH,,,6

	$END_STATE


	$STATE WITH_STATE_4	; by character -c

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_ANY,	TPA$_EXIT, SET_WITH,,,7

	$END_STATE


	;***********************************************************************
        ;
	;	Process PLUS/MINUS thru PARTIAL Subexpression for READ and WRITE
	;
	;***********************************************************************

	$STATE	PLUS_PARTIAL

	$TRAN	'PLUS',		PLUS_PARTIAL_1, SET_PLUS_MINUS,,,1
	$TRAN	'MINUS',	PLUS_PARTIAL_1, SET_PLUS_MINUS,,,2
	$TRAN	TPA$_LAMBDA,	PLUS_PARTIAL_2

	$END_STATE


	$STATE	PLUS_PARTIAL_1

	$TRAN	TPA$_HEX,	PLUS_PARTIAL_2, SET_PLUS_MINUS,,,3

	$END_STATE


	$STATE	PLUS_PARTIAL_2

	$TRAN	'PARTIAL',	TPA$_EXIT, SET_PARTIAL
	$TRAN	TPA$_LAMBDA,	TPA$_EXIT

	$END_STATE


	;***********************************************************************
	;
	;	     		Get WIDTH Subexpression
	;
	;***********************************************************************

	$STATE	WIDTH_STATE		; look for WIDTH

	$TRAN	'WIDTH',	WIDTH_STATE_1
	$TRAN	TPA$_LAMBDA,	TPA$_EXIT

	$END_STATE


	$STATE	WIDTH_STATE_1		; get the WIDTH parameter

	$TRAN	TPA$_HEX,	TPA$_EXIT, SET_WIDTH

	$END_STATE


	;***********************************************************************
	;
	;	     		Get FILE Spec Subexpression
	;
	;***********************************************************************

	$STATE	FILE_STATE		; look for FILE

	$TRAN	'FILE',		FILE_STATE_1

	$END_STATE


	$STATE	FILE_STATE_1		; get file spec

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_ANY,	FILE_STATE_2,SET_FILE_SPEC,,,0

	$END_STATE


	$STATE	FILE_STATE_2

	$TRAN	TPA$_EOS,	TPA$_EXIT
	$TRAN	TPA$_BLANK,	TPA$_EXIT
	$TRAN	TPA$_ANY,	FILE_STATE_2,SET_FILE_SPEC,,,1

	$END_STATE


	;***********************************************************************
        ;
	;			Process ADDRESSING MODE Command
	;
	;***********************************************************************

	$STATE	ADDRESS_STATE

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'MODE',		ADDRESS_STATE_1

	$END_STATE

	$STATE	ADDRESS_STATE_1

	$TRAN	TPA$_EOS,	TPA$_EXIT, SHOW_MODE
	$TRAN	'16',		TPA$_EXIT, SET_MODE,,,1
	$TRAN	'24',		TPA$_EXIT, SET_MODE,,,2
	$TRAN	'32',		TPA$_EXIT, SET_MODE,,,3

	$END_STATE
	

	;***********************************************************************
        ;
	;	   		Process AND Command
	;
	;***********************************************************************

	$STATE	AND_STATE	; get command range

	$TRAN	!RANGE_STATE,	AND_STATE_1

      	$END_STATE


	$STATE	AND_STATE_1	; look for WITH

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'WITH',		AND_STATE_2

	$END_STATE


	$STATE	AND_STATE_2	; get WITH Param

	$TRAN	!WITH_STATE,	AND_STATE_FINAL

      	$END_STATE


	$STATE AND_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_AND

	$END_STATE


	;***********************************************************************
        ;
	;			Process APPEND Command
	;
	;***********************************************************************


	$STATE	APPEND_STATE	; get command range

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	!RANGE_STATE,	APPEND_STATE_1

      	$END_STATE


	$STATE	APPEND_STATE_1	; look for PLUS/MINUS and PARTIAL

	$TRAN	!PLUS_PARTIAL,	APPEND_STATE_2
	$TRAN	TPA$_LAMBDA,	APPEND_STATE_2

	$END_STATE


	$STATE	APPEND_STATE_2	; look for PLUS/MINUS and PARTIAL

	$TRAN	!WIDTH_STATE,	APPEND_STATE_3
	$TRAN	TPA$_LAMBDA,	APPEND_STATE_3

	$END_STATE


	$STATE	APPEND_STATE_3    ; look for FILE spec

	$TRAN	!FILE_STATE,	TPA$_EXIT, DO_APPEND

	$END_STATE


	;***********************************************************************
        ;
	;			Process COMPLEMENT Command
	;
	;***********************************************************************


	$STATE	COMP_STATE	; get command range

	$TRAN	!RANGE_STATE,	COMP_STATE_FINAL

      	$END_STATE


	$STATE COMP_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_COMPLEMENT

	$END_STATE


	;***********************************************************************
        ;
	;			Process COPY Command
	;
	;***********************************************************************

	$STATE	COPY_STATE	; Get command range

	$TRAN	!RANGE_STATE,	COPY_STATE_1

	$END_STATE


	$STATE	COPY_STATE_1	; look for TO

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'TO',		COPY_STATE_2

	$END_STATE


	$STATE	COPY_STATE_2	; look for TO param

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	COPY_STATE_3, CHECK_ADDRESS,,,3

	$END_STATE


	$STATE	COPY_STATE_3   	; look for REPEAT

	$TRAN	TPA$_EOS,	COPY_STATE_FINAL
	$TRAN	'REPEAT',	COPY_STATE_4
	$TRAN	TPA$_LAMBDA,	COPY_STATE_FINAL

	$END_STATE


	$STATE	COPY_STATE_4	; look for REPEAT param

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	COPY_STATE_FINAL, SET_REPEAT

	$END_STATE


	$STATE	COPY_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_COPY

	$END_STATE


	;***********************************************************************
        ;
	;	    		Process CRC Command
	;
	;***********************************************************************

	$STATE	CRC_STATE  	; get command range

	$TRAN	!RANGE_STATE,	CRC_STATE_1

      	$END_STATE

                
	$STATE	CRC_STATE_1

	$TRAN	TPA$_EOS,	TPA$_EXIT, DO_CRC
	$TRAN	'TO',		CRC_STATE_2
	$TRAN	TPA$_LAMBDA,	CRC_STATE_4

	$END_STATE


	$STATE	CRC_STATE_2

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	CRC_STATE_4,CHECK_ADDRESS,,,3
	$TRAN	'%',		CRC_STATE_3,SET_PSEUDO,,,1

	$END_STATE


	$STATE	CRC_STATE_3

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	CRC_STATE_4,CHECK_ADDRESS,,,3

	$END_STATE


	$STATE	CRC_STATE_4

	$TRAN	TPA$_EOS,	TPA$_EXIT, DO_CRC
	$TRAN	'EXPECTING',	CRC_STATE_5

	$END_STATE


	$STATE	CRC_STATE_5

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	CRC_STATE_FINAL, SET_EXPECTING

	$END_STATE

                                           
	$STATE	CRC_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_CRC

	$END_STATE


	;***********************************************************************
        ;
	;			Process CSUM Command
	;
	;***********************************************************************

	$STATE	CSUM_STATE  	; get command range

	$TRAN	!RANGE_STATE,	CSUM_STATE_FINAL

      	$END_STATE


	$STATE	CSUM_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_CSUM

	$END_STATE


	;***********************************************************************
        ;
	;			Process DECREMENT Command
	;
	;***********************************************************************

	$STATE	DEC_STATE	; get command range

 	$TRAN	!RANGE_STATE,	DEC_STATE_1

      	$END_STATE


	$STATE	DEC_STATE_1	; look for BY

	$TRAN	TPA$_EOS,	DEC_STATE_FINAL
	$TRAN	'BY',		DEC_STATE_2

	$END_STATE


	$STATE DEC_STATE_2	; look for a valid decrement character

	$TRAN	!WITH_STATE,	DEC_STATE_FINAL

	$END_STATE


	$STATE DEC_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_DECREMENT

	$END_STATE


	;***********************************************************************
        ;
	;			Process DIVIDE Command
	;
	;***********************************************************************

	$STATE	DIVIDE_STATE	; check for SIGNED keyword

	$TRAN	'SIGNED',	DIV_STATE_1,SET_SIGNED
	$TRAN	TPA$_LAMBDA,	DIV_STATE_1

      	$END_STATE


	$STATE	DIV_STATE_1	; get command range

	$TRAN	!RANGE_STATE,	DIV_STATE_2

      	$END_STATE

	$STATE	DIV_STATE_2	; look for 'BY'

	$TRAN	'BY',		DIV_STATE_3
	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE

	$END_STATE


	$STATE DIV_STATE_3	; look for a valid divide character

	$TRAN	!WITH_STATE,	DIV_STATE_FINAL

	$END_STATE


	$STATE DIV_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_DIVIDE

	$END_STATE


	;***********************************************************************
        ;
	;			Process DISPLAY Command
	;
	;***********************************************************************

	$STATE	DISPLAY_STATE		; look for ASCII

	$TRAN	'ASCII',	DISPLAY_STATE_1, SET_ASCII
	$TRAN	TPA$_LAMBDA,	DISPLAY_STATE_1

	$END_STATE


	$STATE	DISPLAY_STATE_1		; get command range

	$TRAN	'PSEUDO',	TPA$_EXIT,DO_DISPLAY_PSEUDO
	$TRAN	'HIGH',		TPA$_EXIT,DO_DISPLAY_HILOW
	$TRAN	'LOW',		TPA$_EXIT,DO_DISPLAY_HILOW
	$TRAN	!RANGE_STATE,	DISPLAY_STATE_2

	$END_STATE


	$STATE	DISPLAY_STATE_2		; look for FILE

	$TRAN	!FILE_STATE,	DISPLAY_STATE_FINAL
	$TRAN	TPA$_LAMBDA,	DISPLAY_STATE_FINAL

	$END_STATE


	$STATE	DISPLAY_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_DISPLAY

	$END_STATE


	;***********************************************************************
        ;
	;    			Process EDIT Command
	;
	;***********************************************************************

	$STATE	EDIT_STATE		; look for edit address

	$TRAN	'LOW',		EDIT_STATE_1, SET_HIGH_LOW,,,1
	$TRAN	'HIGH',		EDIT_STATE_1, SET_HIGH_LOW,,,2
	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	EDIT_STATE_1, CHECK_ADDRESS,,,1

	$END_STATE


	$STATE	EDIT_STATE_1	; look for STEP

	$TRAN	'STEP',		EDIT_STATE_2
	$TRAN	TPA$_LAMBDA,	EDIT_STATE_FINAL

	$END_STATE


	$STATE	EDIT_STATE_2	; look for step param

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	EDIT_STATE_FINAL, SET_STEP

	$END_STATE


	$STATE	EDIT_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_EDIT

	$END_STATE


	;***********************************************************************
        ;
	;			Process FILL Command
	;
	;***********************************************************************

	$STATE	FILL_STATE	; get command range

	$TRAN	!RANGE_STATE,	FILL_STATE_1

      	$END_STATE

	$STATE	FILL_STATE_1	; look for WITH

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'WITH',		FILL_STATE_2

	$END_STATE


	$STATE FILL_STATE_2	; look for a valid fill character

	$TRAN	!WITH_STATE,	FILL_STATE_FINAL

	$END_STATE


	$STATE FILL_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_FILL

	$END_STATE


	;***********************************************************************
        ;
	;			Process FORMAT Command
	;
	;***********************************************************************

	$STATE	FORMAT_STATE		; valid format keywords

	$TRAN 	TPA$_EOS,	TPA$_EXIT, SHOW_FORMAT
	$TRAN	'INTEL',	TPA$_EXIT, SET_FORMAT,,,1
	$TRAN	'MOTOROLA',	TPA$_EXIT, SET_FORMAT,,,2
	$TRAN	'ROCKWELL',	TPA$_EXIT, SET_FORMAT,,,3
	$TRAN	'RCA',		TPA$_EXIT, SET_FORMAT,,,4
	$TRAN	'TEKHEX',	TPA$_EXIT, SET_FORMAT,,,5
	$TRAN	'EXTENDED',	EXTENDED_FORMAT
	$TRAN	'TEXAS',	TPA$_EXIT, SET_FORMAT,,,7
	$TRAN	'MOSTEK',   	TPA$_EXIT, SET_FORMAT,,,8
	$TRAN	'TCI',		TPA$_EXIT, SET_FORMAT,,,14
	$TRAN	'FAIRCHILD',	TPA$_EXIT, SET_FORMAT,,,15

	$END_STATE

	$STATE	EXTENDED_FORMAT		; check for Extended Tekhex Format

	$TRAN	TPA$_EOS,	TPA$_EXIT, SET_FORMAT,,,6
	$TRAN	'TEKHEX',	TPA$_EXIT, SET_FORMAT,,,6

	$END_STATE


	;***********************************************************************
        ;
	;			Process HELP Command
	;
	;***********************************************************************

	$STATE	HELP_STATE		; request for help

	$TRAN	TPA$_EOS,	TPA$_EXIT, DO_HELP
	$TRAN	TPA$_SYMBOL,	TPA$_EXIT, DO_HELP
	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, HELP_ERROR

	$END_STATE


	;***********************************************************************
        ;
	;			Process INCREMENT Command
	;
	;***********************************************************************

	$STATE	INC_STATE	; get command range

	$TRAN	!RANGE_STATE,	INC_STATE_1

      	$END_STATE


	$STATE	INC_STATE_1	; look for BY

	$TRAN	TPA$_EOS,	INC_STATE_FINAL
	$TRAN	'BY',		INC_STATE_2

	$END_STATE


	$STATE INC_STATE_2	; look for a valid increment character

	$TRAN	!WITH_STATE,	INC_STATE_FINAL

	$END_STATE


	$STATE INC_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_INCREMENT

	$END_STATE


	;***********************************************************************
        ;
	;			Process INIT Command
	;
	;***********************************************************************

	$STATE	INIT_COMMAND_STATE

	$TRAN	'WITH',		INIT_COMMAND_STATE_1
	$TRAN	TPA$_EOS,	INIT_COMMAND_STATE_FINAL

	$END_STATE


	$STATE	INIT_COMMAND_STATE_1

	$TRAN	!WITH_STATE,	INIT_COMMAND_STATE_FINAL

	$END_STATE


	$STATE	INIT_COMMAND_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT,DO_INIT

	$END_STATE


	;***********************************************************************
        ;
	;			Process MOVE Command
	;
	;***********************************************************************

	$STATE	MOVE_STATE

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'BYTE',		MOVE_STATE_1,	SET_MOVE_SIZE,,,0
	$TRAN	'WORD',		MOVE_STATE_1,	SET_MOVE_SIZE,,,1

	$END_STATE


	$STATE	MOVE_STATE_1

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'FROM',		MOVE_STATE_2

	$END_STATE


	$STATE	MOVE_STATE_2

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	MOVE_STATE_4,CHECK_ADDRESS,,,1
	$TRAN	'%',		MOVE_STATE_3,SET_PSEUDO,,,0

	$END_STATE


	$STATE	MOVE_STATE_3

	$TRAN	TPA$_EOS,	TPA$_EXIT,INCOMPLETE
	$TRAN	TPA$_HEX,	MOVE_STATE_4,CHECK_ADDRESS,,,1

	$END_STATE


	$STATE	MOVE_STATE_4

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'TO',		MOVE_STATE_5

	$END_STATE


	$STATE	MOVE_STATE_5

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	MOVE_STATE_FINAL,CHECK_ADDRESS,,,3
	$TRAN	'%',		MOVE_STATE_6,SET_PSEUDO,,,1

	$END_STATE


	$STATE	MOVE_STATE_6

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	MOVE_STATE_FINAL,CHECK_ADDRESS,,,3

	$END_STATE


	$STATE	MOVE_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT,DO_MOVE

	$END_STATE


	;***********************************************************************
        ;
	;			Process MULTIPLY Command
	;
	;***********************************************************************

	$STATE	MULT_STATE	; get command range

	$TRAN	!RANGE_STATE,	MULT_STATE_1

      	$END_STATE


	$STATE	MULT_STATE_1	; look for BY

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'BY',		MULT_STATE_2

	$END_STATE

	$STATE MULT_STATE_2	; look for a valid multiply character

	$TRAN	!WITH_STATE,	MULT_STATE_FINAL

	$END_STATE


	$STATE MULT_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_MULTIPLY

	$END_STATE


	;***********************************************************************
        ;
	;			Process NAME Command
	;
	;***********************************************************************

	$STATE	NAME_STATE

	$TRAN	TPA$_EOS,	TPA$_EXIT, SHOW_NAME
	$TRAN	TPA$_ANY,	NAME_BUILD, BUILD_NAME,,,0

	$END_STATE


	$STATE	NAME_BUILD

	$TRAN	TPA$_EOS,	TPA$_EXIT, SET_NAME
	$TRAN	TPA$_BLANK,	TPA$_EXIT, SET_NAME
	$TRAN	TPA$_ANY,	NAME_BUILD, BUILD_NAME,,,1

	$END_STATE


	;***********************************************************************
        ;
	;			Process NEGATE Command
	;
	;***********************************************************************


	$STATE	NEG_STATE	; get command range

	$TRAN	!RANGE_STATE,	NEG_STATE_FINAL

      	$END_STATE


	$STATE NEG_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_NEGATE

	$END_STATE


	;***********************************************************************
        ;
	;			Process OFFSET Command
	;
	;***********************************************************************

	$STATE	OFFSET_STATE

	$TRAN	TPA$_EOS,	TPA$_EXIT, SHOW_OFFSET
	$TRAN	TPA$_HEX,	TPA$_EXIT, SET_OFFSET
	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, HEX_ERROR

	$END_STATE


	;***********************************************************************
        ;
	;			Process OR Command
	;
	;***********************************************************************

	$STATE	OR_STATE	; get command range

	$TRAN	!RANGE_STATE,	OR_STATE_1

      	$END_STATE


	$STATE OR_STATE_1	; look for WITH

	$TRAN	'WITH',		OR_STATE_2
	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE

	$END_STATE


	$STATE OR_STATE_2	;  look for a valid OR character

	$TRAN	!WITH_STATE,	OR_STATE_FINAL

	$END_STATE


	$STATE OR_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_OR

	$END_STATE


	;***********************************************************************
        ;
	;			Process READ Command
	;
	;***********************************************************************


	$STATE	READ_STATE	; get command range

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	!RANGE_STATE,	READ_STATE_1
	$TRAN	TPA$_LAMBDA,	READ_STATE_1

      	$END_STATE


	$STATE	READ_STATE_1	; look for PLUS/MINUS and PARTIAL

	$TRAN	'WITH',		READ_STATE_3, CHECK_COMPARE_WITH
	$TRAN	!PLUS_PARTIAL,	READ_STATE_2
	$TRAN	TPA$_LAMBDA,	READ_STATE_2

	$END_STATE


 	$STATE	READ_STATE_2    ; look for FILE spec

	$TRAN	!FILE_STATE,	TPA$_EXIT, DO_READ

	$END_STATE


	$STATE	READ_STATE_3    ; look for FILE spec

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	TPA$_EXIT, DO_COMPARE

	$END_STATE


	;***********************************************************************
        ;
	;			Process REMAINDER Command
	;
	;***********************************************************************

	$STATE	REMAINDER_STATE	; check for SIGNED keyword

	$TRAN	'SIGNED',	REMAIN_STATE_1, SET_SIGNED
	$TRAN	TPA$_LAMBDA,	REMAIN_STATE_1

      	$END_STATE


	$STATE	REMAIN_STATE_1	; get command range

	$TRAN	!RANGE_STATE,	REMAIN_STATE_2

      	$END_STATE


	$STATE	REMAIN_STATE_2	; look for 'BY'

	$TRAN	'BY',		REMAIN_STATE_3
	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE

	$END_STATE


	$STATE REMAIN_STATE_3	; look for a valid remainder character

	$TRAN	!WITH_STATE,	REMAIN_STATE_FINAL

	$END_STATE


	$STATE REMAIN_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_REMAINDER

	$END_STATE


	;***********************************************************************
        ;
	;			Process REVERSE Command
	;
	;***********************************************************************

	$STATE	REVERSE_STATE	; get command range

	$TRAN	!RANGE_STATE,	REV_STATE_FINAL

      	$END_STATE


	$STATE	REV_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_REVERSE

	$END_STATE


	;***********************************************************************
        ;
	;			Process ROTATE Command
	;
	;***********************************************************************

	$STATE	ROTATE_STATE

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'LEFT',		ROT_STATE_1,SET_DIRECTION,,,0
	$TRAN	'RIGHT',	ROT_STATE_1,SET_DIRECTION,,,1

	$END_STATE

	$STATE	ROT_STATE_1	; get command range

	$TRAN	!RANGE_STATE,	ROT_STATE_2

      	$END_STATE


	$STATE ROT_STATE_2	; look for 'BY'

	$TRAN	'BY', 		ROT_STATE_3
	$TRAN	TPA$_EOS,	ROT_STATE_FINAL

	$END_STATE


	$STATE	ROT_STATE_3	; look for a valid rotate character

	$TRAN	!WITH_STATE,	ROT_STATE_FINAL

	$END_STATE


	$STATE ROT_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_ROTATE

	$END_STATE


	;***********************************************************************
        ;
	;	    		Process SEARCH Command
	;
	;***********************************************************************

	$STATE	SEARCH_STATE		; get command range

	$TRAN	!RANGE_STATE,	SEARCH_STATE_1

	$END_STATE


	$STATE	SEARCH_STATE_1		; look for FOR

	$TRAN	'FOR',		SEARCH_STATE_2
	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE

	$END_STATE


	$STATE	SEARCH_STATE_2		; look for NOT

	$TRAN	'NOT',		SEARCH_STATE_3, SET_NOT
	$TRAN	TPA$_LAMBDA,	SEARCH_STATE_3

	$END_STATE


	$STATE	SEARCH_STATE_3		; look for search character(s)

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	SEARCH_STATE_FINAL, SET_SEARCH,,,1
	$TRAN	'^',		SEARCH_STATE_4
	$TRAN	APOSTROPHE,	SEARCH_STATE_5,TURN_ON_BLANKS
	$TRAN	TILDE,		SEARCH_STATE_6
	$TRAN	'-',		SEARCH_STATE_7,TURN_ON_BLANKS
	$TRAN	'"',		SEARCH_STATE_8,TURN_ON_BLANKS

	$END_STATE


	$STATE	SEARCH_STATE_4	; by character ^c

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'#',		SEARCH_STATE_FINAL, SET_SEARCH,,,2
	$TRAN	TPA$_ANY,	SEARCH_STATE_FINAL, SET_SEARCH,,,3

	$END_STATE


	$STATE	SEARCH_STATE_5	; by character 'c

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_ANY,	SEARCH_STATE_FINAL, SET_SEARCH,,,4

	$END_STATE


	$STATE	SEARCH_STATE_6	; by character ~c

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'#',		SEARCH_STATE_FINAL, SET_SEARCH,,,5
	$TRAN	TPA$_ANY,	SEARCH_STATE_FINAL, SET_SEARCH,,,6

	$END_STATE


	$STATE	SEARCH_STATE_7	; by character -c

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_ANY,	SEARCH_STATE_FINAL, SET_SEARCH,,,7

	$END_STATE


	$STATE	SEARCH_STATE_8	; look for first printing character

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_ANY,	SEARCH_STATE_9, SET_SEARCH,,,8

	$END_STATE


	$STATE	SEARCH_STATE_9	; look for second printing character

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_ANY,	SEARCH_STATE_10, SET_SEARCH,,,9

	$END_STATE


	$STATE	SEARCH_STATE_10	; look for the second double quote

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'"',		SEARCH_STATE_FINAL

	$END_STATE


	$STATE	SEARCH_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_SEARCH

	$END_STATE


	;***********************************************************************
        ;
	;	    		Process SHIFT Command
	;
	;***********************************************************************

	$STATE	SHIFT_STATE

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'LEFT',		SHIFT_STATE_1,SET_DIRECTION,,,0
	$TRAN	'RIGHT',	SHIFT_STATE_1,SET_DIRECTION,,,1

	$END_STATE


	$STATE	SHIFT_STATE_1

	$TRAN	'SIGNED',	SHIFT_STATE_2,SET_SIGNED
	$TRAN	TPA$_LAMBDA,	SHIFT_STATE_2

	$END_STATE


	$STATE	SHIFT_STATE_2	; get command range

	$TRAN	!RANGE_STATE,	SHIFT_STATE_3

      	$END_STATE

	$STATE	SHIFT_STATE_3	; look for BY

	$TRAN	'BY',	      	SHIFT_STATE_4
	$TRAN	TPA$_EOS,	TPA$_EXIT, SHIFT_STATE_FINAL

	$END_STATE


	$STATE	SHIFT_STATE_4	; look for a valid shift character

	$TRAN	!WITH_STATE,	SHIFT_STATE_FINAL

	$END_STATE


	$STATE SHIFT_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_SHIFT

	$END_STATE


	;***********************************************************************
        ;
	;	    		Process SUM Command
	;
	;***********************************************************************

	$STATE	SUM_STATE  	; get command range

	$TRAN	!RANGE_STATE,	SUM_STATE_1

      	$END_STATE


	$STATE	SUM_STATE_1

	$TRAN	TPA$_EOS,	TPA$_EXIT, DO_SUM
	$TRAN	'TO',		SUM_STATE_2
	$TRAN	TPA$_LAMBDA,	SUM_STATE_4

	$END_STATE


	$STATE	SUM_STATE_2

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	SUM_STATE_4,CHECK_ADDRESS,,,3
	$TRAN	'%',		SUM_STATE_3,SET_PSEUDO,,,1

	$END_STATE


	$STATE	SUM_STATE_3

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	SUM_STATE_4,CHECK_ADDRESS,,,3

	$END_STATE


	$STATE	SUM_STATE_4

	$TRAN	TPA$_EOS,	TPA$_EXIT, DO_SUM
	$TRAN	'EXPECTING',	SUM_STATE_5

	$END_STATE


	$STATE	SUM_STATE_5

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	SUM_STATE_FINAL, SET_EXPECTING

	$END_STATE


	$STATE	SUM_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_SUM

	$END_STATE


	;***********************************************************************
        ;
	;			Process TRANSFER Command
	;
	;***********************************************************************

	$STATE	TRANSFER_STATE

	$TRAN	TPA$_EOS,	TPA$_EXIT, SHOW_TRANSFER
	$TRAN	TPA$_HEX,	TPA$_EXIT, SET_TRANSFER
	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, HEX_ERROR

	$END_STATE


	;***********************************************************************
        ;
	;				USE Command
	;
	;***********************************************************************

	$STATE	USE_STATE	; look for first use parameter

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	USE_STATE_1, SET_USE,,,1

	$END_STATE


	$STATE	USE_STATE_1	; look for OF

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'OF',		USE_STATE_2

	$END_STATE


	$STATE	USE_STATE_2	; look for second use parameter

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	TPA$_HEX,	USE_STATE_3, SET_USE,,,2

	$END_STATE


	$STATE	USE_STATE_3

	$TRAN	'FOR',		USE_STATE_4
	$TRAN	TPA$_LAMBDA,	TPA$_EXIT,CHECK_EXTRA_CHARS

	$END_STATE


	$STATE	USE_STATE_4

	$TRAN	'READ',		TPA$_EXIT, CHECK_EXTRA_CHARS
	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, CHECK_EXTRA_CHARS

	$END_STATE


	;***********************************************************************
        ;
	;			Process WRITE Command
	;
	;***********************************************************************


	$STATE	WRITE_STATE	; get command range

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	!RANGE_STATE,	WRITE_STATE_1

      	$END_STATE


	$STATE	WRITE_STATE_1	; look for PLUS/MINUS and PARTIAL

	$TRAN	!PLUS_PARTIAL,	WRITE_STATE_2
	$TRAN	TPA$_LAMBDA,	WRITE_STATE_2

	$END_STATE


	$STATE	WRITE_STATE_2	; look for PLUS/MINUS and PARTIAL

	$TRAN	!WIDTH_STATE,	WRITE_STATE_3
	$TRAN	TPA$_LAMBDA,	WRITE_STATE_3

	$END_STATE


	$STATE	WRITE_STATE_3    ; look for FILE spec

	$TRAN	!FILE_STATE,	TPA$_EXIT, DO_WRITE

	$END_STATE


	;***********************************************************************
        ;
	;				XOR Command
	;
	;***********************************************************************

	$STATE	XOR_STATE	; get command range

	$TRAN	!RANGE_STATE,	XOR_STATE_1

      	$END_STATE


	$END_STATE

	$STATE	XOR_STATE_1	; look for WITH

	$TRAN	TPA$_EOS,	TPA$_EXIT, INCOMPLETE
	$TRAN	'WITH',		XOR_STATE_2

	$END_STATE


	$STATE XOR_STATE_2	; look for a valid XOR character

	$TRAN	!WITH_STATE,	XOR_STATE_FINAL

	$END_STATE


	$STATE XOR_STATE_FINAL

	$TRAN	TPA$_LAMBDA,	TPA$_EXIT, DO_XOR

	$END_STATE


	.END

