               INCLUDE HPFIXUPS
               TITLE "FIELDS"
***************************************************************************************************
***************************************************************************************************
***                                                                                             ***
***            FIELDS - SUBFUNCTION FIELD PROCESSING                                            ***
***                                                                                             ***
***************************************************************************************************
***************************************************************************************************
;
NEG_EXT        EQU     0FFFFFF00H      ;USE IN MOVEQ INSTRUCTIONS WHERE ARG IS
                                       ;80H OR LARGER - HP XASM DOES NOT HANDLE
                                       ;SIGN-EXTEND CORRECTLY.  COSMETIC, KEEPS
                                       ;ACTUAL BYTE VALUE CLEARER.
;
               ABS_SHORT
;
               INCLUDE FIELD_EQU       ;SUBFUNCTION/FIELD BLOCK DEFINITIONS.
;
               GLB     INSTALL_SUBFUNCTION,WRITE_PARAMETER
               GLB     WRITE_ALL_FIELDS,INSTALL_EDIT_FIELD
               GLB     UNPLUG_ALL_EDITS,STORE_PARAMETER
               GLB     INCR_PARAMETER,DECR_PARAMETER
               GLB     GO_TO_NEXT_FIELD,GO_TO_PREV_FIELD
;
               EXTERNAL  BACK_HANDLER,PROCESS_DATA_POT,LED_DIRECT
               EXTERNAL  SUB_INST_VERT
               EXTERNAL  WRITE_PARAM_VALUE,WRITE_SCREEN
               EXTERNAL  NOTHINGNESS
;
               EXTERNAL  UPDATE_LCD
               EXTERNAL  CUR_SUB_BLOCK
               EXTERNAL  DISPLAY_VEC
               EXTERNAL  FLD_INDEX_STEP
               EXTERNAL  CUR_FLD_INDEX
               EXTERNAL  CUR_FLD_BLOCK
               EXTERNAL  REDISP_FIELD
               EXTERNAL  PARAM_BUFFER
               EXTERNAL  PARAM_POINTER
               EXTERNAL  PARAM_SIZE
               EXTERNAL  SIGN_ENABLE
               EXTERNAL  DISPLAY_OFFSET
               EXTERNAL  DISPLAY_SCALE
               EXTERNAL  DECIMAL_POINT
               EXTERNAL  ZERO_BLANKING
               EXTERNAL  STRING_AT_MIN
               EXTERNAL  STRING_AT_MAX
               EXTERNAL  DISP_STRNG_PTR
               EXTERNAL  CUR_FUN_INDEX
               EXTERNAL  FLD_INDEXES
               EXTERNAL  CURSOR_ENABLE
               EXTERNAL  KEYPAD_ENABLE
               EXTERNAL  LINKED_PARAM
;06MAR               EXTERNAL  ROUSING_GUIDO
               EXTERNAL  GUIDO_IS_AWAKE
               EXTERNAL  PARAM_LO_LIM
               EXTERNAL  PARAM_HI_LIM
               EXTERNAL  CURSOR_RGT_VEC
               EXTERNAL  CURSOR_LFT_VEC
               EXTERNAL  INCREMENT_VEC
               EXTERNAL  DECREMENT_VEC
               EXTERNAL  POT_CHANGE_VEC
               EXTERNAL  ENTER_VEC
               EXTERNAL  EDIT_VEC
               EXTERNAL  POT_DIVISIONS
               EXTERNAL  NO_POT_CLEAR
               EXTERNAL  POT_MULTIPLIER
               EXTERNAL  DIVIDED_POT
               EXTERNAL  SUBFUN_INSTALL
               EXTERNAL  LED_EXTINGUISH
               EXTERNAL  BUILD_KIT_FLAG
               EXTERNAL  TEMP_FLD_INDEX
               EXTERNAL  WR_FIELDS_FLAG
               EXTERNAL  INST_EDIT_FLAG
               EXTERNAL  INST_TSK_INDEX
;06MAR               EXTERNAL  POSITION_CURS
               EXTERNAL  SPINE_COUNT
               EXTERNAL  STOP_FLD_INDEX
               EXTERNAL  REAL_LONG_TIME,LCD_TIMER
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; GENERAL REMARKS ON SUBFUNCTION INSTALLATION -
;
; ALL PHASES OF SUBFUNCTION INSTALLATION PROCEDURE ARE STRUCTURED SO AS
; TO EXECUTE IN SMALL PIECES, IN KEEPING WITH THE OVERALL SYSTEM DESIGN
; WHICH REQUIRES THAT CONDITIONS WHICH ARE HANDLED IN THE HIGH-PRIORITY
; BACKGROUND QUEUE BE DETECTED AND RESPONDED TO AS RAPIDLY AS POSSIBLE.
;
; ALL CODE ASSOCIATED WITH SUBFUNCTION HANDLING IS EXECUTED VIA LOW-
; PRIORITY BACKGROUND ROTATION - HOWEVER, ONCE ANY ROUTINE GETS CONTROL
; OF THE BACKGROUND, NO OTHER BACKGROUND ROUTINES CAN EXECUTE UNTIL THAT
; ONE IS FINISHED, REGARDLESS OF RELATIVE PRIORITIES.  FOR THIS REASON,
; SUBFUNCTION INSTALLATION IS ACCOMPLISHED VIA A LARGE NUMBER OF SMALL
; STEPS, EACH OF WHICH IS EXECUTED BY A SEPARATE CALL FROM BACK_HANDLER.
;
; AFTER EACH SMALL STEP, CONTROL IS RETURNED TO BACK_HANDLER, ALLOWING
; ANY NEW CONDITIONS REQUIRING SERVICE FROM A HIGH-PRIORITY BACKGROUND
; ROUTINE TO BE SERVICED AT THAT POINT - SUBFUNCTION INSTALL RESUMES
; WHEN NO HIGH-PRIORITY BACKGROUND ROUTINES ARE BEING INVOKED.
;
; THE ROUTINES WHICH EXECUTE IN SMALL PIECES TAKE HOLD OF BACKGROUND
; ROTATION BY "RATCHETING-BACK" THE VALUE OF SPINE_COUNT BEFORE PASSING
; CONTROL BACK TO BACK_HANDLER, THEREBY KEEPING THEMSELVES NEXT IN LINE
; FOR LOW-PRIORITY ROTATION WITHOUT HOGGING THE BACKGROUND AT LARGE.
;
; FINALLY, THE OCCURRENCE OF A NEW SUBFUNCTION INSTALLATION REQUEST
; CAUSES ANY INSTALLATION CURRENTLY IN PROGRESS TO BE ABORTED, AND ALL
; EDIT PATHWAYS AND DISPLAY FLAGS ARE DISCONNECTED OR BLOCKED.
; THIS IS DONE TO REDUCE WASTED EXECUTION TIME AND (HOPEFULLY) IMPROVE
; RESPONSE UNDER CONDITIONS OF FREQUENT INSTALLATION REQUESTS, SUCH AS
; MIGHT OCCUR WHILE IN A SOUND EDIT SCREEN WHILE 440 IS PLAYING DATA
; FROM AN EXTERNAL SEQUENCER (ALRIGHT, SO IT'S OBSCURE - FUCK OFF, OK?)
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; SUBFUNCTION INSTALLATION, FIRST PHASE -
;
; EXECUTES VIA BACKGROUND ROTATION, ACTIVATED BY SUBFUN_INSTALL FLAG -
; WHICH HAS ALREADY BEEN ACKNOWLEDGED/CLEARED BY THE TIME WE GET HERE.
;
; MAIN TASK IS TO COPY DEFAULT SCREEN TEXT INTO SCREEN_BUFFER FROM
; SUBFUNCTION BLOCK POINTED TO BY CUR_SUB_BLOCK - ALSO SNUFFS "ENTER"
; LED, WHICH MAY HAVE BEEN LEFT FLASHING BY PREVIOUS SUBFUNCTION.
;
; INSPECTS SUBFUNCTION BLOCK TO DETERMINE WHETHER ANY FIELD BLOCKS ARE
; DEFINED - IF SO, SETS WR_FIELDS_FLAG WHICH IS PICKED UP AT NEXT STEP
; IN BACKGROUND ROTATION, CAUSING CURRENT VALUES FOR ALL FIELDS TO BE
; WRITTEN INTO SCREEN_BUFFER IN THEIR PROPER POSITIONS, AND IN TURN
; INVOKING INSTALL_EDIT_FIELD TO HOOK INTO THE CURRENT EDIT FIELD.
;
; ALL OF THE ABOVE OCCURS LONG BEFORE ANYTHING IS WRITTEN TO LCD.
;
; SETS UPDATE_LCD FLAG WHICH IS PICKED UP LATER IN BACKGROUND ROTATION
; AND CAUSES TRANSFER OF COMPLETED SCREEN_BUFFER TO LCD.
;
;04DEC;
;04DEC; IF EXECUTION PROCEEDS THROUGH INSTALL_EDIT_FIELD, POSITION_CURS FLAG
;04DEC; IS ALSO SET, CAUSING CURSOR TO BE POSITIONED ON CURRENT EDIT FIELD -
;04DEC; THIS ONE IS PICKED UP AFTER UPDATE_LCD, WHICH KICKS CURSOR OFF-SCREEN.
;04DEC;
;
; IF EXECUTION PROCEEDS THROUGH INSTALL_EDIT_FIELD, REDISP_FIELD FLAG
; IS ALSO SET, CAUSING PARAMETER FETCH AND DISPLAY VECTOR EXECUTION FOR
; CURRENT EDIT FIELD - THIS ONE IS PICKED UP AFTER UPDATE_LCD, WHICH
; KICKS CURSOR OFF-SCREEN.  NOTE - ALTHOUGH DISPLAY FOR THIS FIELD IS
; ALREADY VALID, THERE ARE AT LEAST A FEW CASES IN WHICH THE DISPLAY
; VECTOR IS USED AS PART OF THE PARAM_BUFFER VALUE SETUP, HENCE EDITING
; PROBLEMS WOULD RESULT IF PARAMETER FETCH IS DONE WITHOUT EXECUTING THE
; DISPLAY VECTOR AS WELL - A WORD TO THE WISE (OR FOOLISH-BUT-LUCKY).
;
; NO REGISTER INPUTS, NOTHING PRESERVED IN PARTICULAR.
;
INSTALL_SUBFUNCTION
;
               MOVE.L  REAL_LONG_TIME,LCD_TIMER  ;FIRST AND MOST TRIVIAL - REFRESH THE TIMER
                                            ; THAT TURNS OFF THE LCD BACKLIGHT.  USER DID
                                            ; SOMETHING AND UNDOUBTEDLY WANTS TO SEE IT.
;
               BSET    #3,LED_EXTINGUISH    ;SNUFF THE ENTER LED, IF IT WAS ON -
               ABS_LONG
               JSR     LED_DIRECT           ;GO DIRECT, IN CASE SOMEONE GRABS THE BACKGROUND.
               ABS_SHORT
;
               ST      UPDATE_LCD           ;REQUEST TRANSFER OF NEW SCREEN DATA TO LCD
                                            ;(WONT OCCUR UNTIL SCREEN COMPLETELY SET UP).
;
               MOVE.L  CUR_SUB_BLOCK,A1     ;FETCH POINTER TO CURRENT SUBFUNCTION BLOCK.
               BSR     WRITE_SCREEN         ;COPY SCREEN TEXT INTO SCREEN BUFFER.
               LEA     32(A1),A1            ;ADVANCE PAST DEFAULT SCREEN TO FIRST FIELD BLOCK.
               TST     (A1)                 ;FIELD POS/LENGTH SPEC NORMALLY NOT = 0 -
               BNE.S   INST_SUB_20          ;BRANCH IF NORMAL CASE OBTAINS, INVOKE NEXT STEP.
               MOVE.L  #NOTHINGNESS,DISPLAY_VEC  ;ZERO VALUE HERE MEANS NO FIELD BLOCKS EXIST -
               BSR     UNPLUG_ALL_EDITS          ;DISCONNECT ALL DISPLAY AND EDIT PATHWAYS,
               MOVE.L  #NOTHINGNESS,CURSOR_RGT_VEC    ;(SHOULDN'T NEED THESE EITHER),
               MOVE.L  #NOTHINGNESS,CURSOR_LFT_VEC
               BRA.S   INST_SUB_EXIT             ;EXIT.
INST_SUB_20
               MOVE.L  A1,CUR_FLD_BLOCK     ;SET POINTER TO FIRST BLOCK TO BE DISPLAYED.
               CLR     INST_TSK_INDEX       ;START WITH FIRST STEP ON FIRST FIELD,
               CLR     TEMP_FLD_INDEX       ;ALLOW WRITE_ALL_FIELDS TO TRACK ITS PROGRESS BY FIELD
                                            ;INDEX, IN CASE EDIT FIELD NEEDS SPECIAL HANDLING.
               ST      WR_FIELDS_FLAG       ;WRITE VALUES FOR ALL FIELDS INTO SCREEN_BUFFER.
;
INST_SUB_EXIT
               ABS_LONG
               JMP     BACK_HANDLER         ;ANDHOMEWEGO.
               ABS_SHORT
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; WRITE CURRENT VALUES FOR ALL PARAMETER FIELDS INTO SCREEN_BUFFER -
; WORK ON ONE FIELD AT A TIME, IN STEPS.
; ASSUMEABLY, WE AREN'T HERE IF SUBFUNCTION HAS NO DEFINED FIELDS, EH?
;
; DOES FIELD POINTED TO BY CUR_FLD_BLOCK, WHICH SHOULD BE SET TO POINT
; TO FIRST FIELD BLOCK OF SUBFUNCTION BEFORE INVOKING WRITE_ALL_FIELDS
; FOR THE FIRST TIME DURING A SUBFUNCTION INSTALLATION.
;
; ROUTINE REINVOKES ITSELF FOUR TIMES FOR EACH FIELD, EXECUTING FOR EACH
; THE SEQUENCE: ACCESS-SETUP/DISPLAY-SETUP/FETCH-&-WRITE/GET-NEXT-FIELD.
; INST_TSK_INDEX MARKS THE PROGRESSION THROUGH THESE STEPS.
;
; AFTER ALL FOUR STEPS ARE COMPLETE FOR A GIVEN FIELD:
; IF THIS IS LAST FIELD BLOCK IN SUBFUNCTION, ROUTINE SUSPENDS ITSELF,
; SETS UP TO INVOKE INSTALL_EDIT_FIELD IN NEXT BACKGROUND ROTATION STEP.
; ELSE, POINTS CUR_FLD_BLOCK AT NEXT FIELD BLOCK, PUTS ITSELF BACK AT
; THE HEAD OF THE LINE FOR SERVICE BY BACKGROUND ROTATION.
;
; TEMP_FLD_INDEX IS KEPT AREAST OF THE ACTION, TO ALLOW SPECIAL HANDLING
; OF INDIVIDUAL FIELD DISPLAY AS REQUIRED - IN PARTICULAR, NO ACTION ON
; THE PART OF WRITE_PARAM_VALUE IN THE EDIT FIELD IF WE ARE IN THE
; MIDDLE OF INITIATING DECIMAL KEYPAD ENTRY (SO THAT MIN/MAX_STRNG
; DISPLAYS CANNOT MESS UP OUR SHINY NEW SCREEN (SEE :LCD).
;
; ONE MORE THING - PROCEDURE WILL HANG ITSELF UP BEFORE COMPLETION IF IT
; DETERMINES THAT A NEW SUBFUNCTION INSTALLATION REQUEST HAS BEEN MADE -
; I.E., IF SUBFUN_INSTALL FLAG IS NOT = 0.  NORMALLY THIS IS CAUSED BY
; SOME CONDITION DETECTED DURING THE INSTALLTION PROCEDURE ITSELF, AND
; THE PREEMIE ABORT AVOIDS UNNECESSARY EXECUTION, AS WELL AS BLOCKING
; THE OCCURRENCE OF SPURIOUS EDITS BEFORE THE NEW INSTALLATION BEGINS.
; BACKGROUND ROTATION INDEX IS AIMED SQUARELY AT SUBFUN_INSTALL CHECK.
;
WRITE_ALL_FIELDS
               MOVE.L  CUR_FLD_BLOCK,A1     ;THIS IS WHO WE ARE WORKING ON (WHICH FIELD BLOCK).
               MOVE    INST_TSK_INDEX,D0    ;THIS TELLS US WHAT TO DO THIS TIME THROUGH.
               JMP     WR_AF_TBL(PC,D0)
WR_AF_TBL
               BRA     WR_AF_DISPLAY        ;INSTALL DISPLAY HOOKS FOR THIS FIELD.
               BRA     WR_AF_ACCESS         ;INSTALL ACCESS HOOKS FOR THIS FIELD.
               BRA     WR_AF_WRITE          ;FETCH AND WRITE CURRENT VALUE FOR THIS FIELD.
               BRA     WR_AF_NEXT_FIELD     ;SET POINTER TO NEXT FIELD IF ANY.
;
WR_AF_DISPLAY
               BSR     SET_DISPLAY
               BRA.S   WR_AF_STEP
;
WR_AF_ACCESS
               BSR     SET_ACCESS
               BRA.S   WR_AF_STEP
;
WR_AF_WRITE
               BSR     WRITE_PARAMETER
               BRA.S   WR_AF_STEP
;
WR_AF_NEXT_FIELD
               MOVE    #FIELD_END,D0        ;SEARCH FOR THE END OF CURRENT FIELD BLOCK.
               BSR     SEARCH_FIELD         ;SEARCH FIELD WILL LEAVE A2 POINTING AT IT -
               CMP     #SUBFUN_END,(A2)+    ;IS IT MARKER FOR END OF LAST FIELD IN SUBFUNCTION?
                                            ;(IF NOT, A2 NOW POINTS TO START OF NEXT FIELD BLOCK).
               BEQ.S   WR_AF_COMPLETE       ;BRANCH IF YES - SET UP TO INVOKE INSTALL_EDIT_FIELD.
               MOVE.L  A2,CUR_FLD_BLOCK     ;NO - SAVE POINTER TO NEXT FIELD BLOCK TO WORK ON.
               ADDQ    #1,TEMP_FLD_INDEX    ;ADVANCE INDEX OF THE FIELD BEING WORKED ON.
               CLR     INST_TSK_INDEX       ;WHEN WE RESUME, START AT STEP ONE FOR NEW FIELD.
               BRA.S   WR_AF_HALT_TEST      ;ON THE WAY OUT, SEE IF WE SHOULD HANG IT ALL UP.
;
WR_AF_COMPLETE
               TST.B   SUBFUN_INSTALL       ;IF WE GOT A NEW SUBFUNCTION INSTALL REQUEST,
               BNE.S   WR_AF_HALT           ;DON'T EVEN WASTE TIME INSTALLING THE EDIT FIELD.
               SF      WR_FIELDS_FLAG       ;OUR WORK HERE IS THROUGH, WON'T BE BACK RIGHT AWAY.
               CLR     INST_TSK_INDEX       ;START AT SQUARE ONE IN INSTALL_EDIT_FIELD -
               ST      INST_EDIT_FLAG       ;NOTHING IN THE WAY - INSTALL THAT EDIT FIELD, THEN.
               MOVE    #-1,STOP_FLD_INDEX   ;THIS LETS INSTALL_EDIT_FIELD KNOW THAT IT HAS NOT YET
                                            ;TRIED TO INSTALL AN EDIT FIELD, SO THAT IT CAN RECORD
                                            ;THE FIELD INDEX OF ITS FIRST INSTALL ATTEMPT AND EXIT
               BRA.S   WR_AF_EXIT           ;IF IT SEES THE SAME FIELD INDEX A SECOND TIME.
;
WR_AF_STEP
               ADDQ    #4,INST_TSK_INDEX    ;AFTER EACH PASS, BUMP TO NEXT TASK FOR CURRENT FIELD.
;
WR_AF_HALT_TEST
               TST.B   SUBFUN_INSTALL       ;IF SOMEHOW WE HAVE A NEW SUBFUN INSTALL REQUEST,
               BNE.S   WR_AF_HALT           ;SUSPEND FURTHER WORK AGAINST THE CURRENT REQUEST.
               SUBQ    #4,SPINE_COUNT       ;ELSE, SLIP RATCHET ON BACKGROUND ROTATION, SO WE WILL
               BRA.S   WR_AF_EXIT           ;GET CALLED AGAIN ASAP BY ROTATING BACKGROUND MGR.
WR_AF_HALT
               SF      WR_FIELDS_FLAG       ;SUSPENDED!  WE WON'T CONTINUE WITH THIS INSTALLATION.
               BSR     UNPLUG_ALL_EDITS     ;DON' LEAVE NOTTIN HANGIN'.
               MOVE.L  #NOTHINGNESS,CURSOR_RGT_VEC
               MOVE.L  #NOTHINGNESS,CURSOR_LFT_VEC
               MOVE    #SUB_INST_VERT,SPINE_COUNT     ;GO STRAIGHT TO SUBFUNCTION INSTALL.
                                                      ;DO NOT ROTATE.  DO NOT GET SIDETRACKED.
WR_AF_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; EDIT-FIELD INSTALLATION PROCEDURE -
; LOCATES AND INSTALLS FIELD INDICATED BY CUR_FLD_INDEX,
; IN SUBFUNCTION INDICATED BY CUR_SUB_BLOCK.
; INVOKED BY INST_EDIT_FLAG, CALLED FROM LOW-PRIO BACKGROUND ROTATION.
;
; AS FIRST STEP, UNPLUGS ALL EDIT PATHWAYS, SINCE WE MAY HAVE A SUBFUN
; WITH NO DEFINED FIELDS OR ONE IN WHICH ALL FIELDS ARE NO-EDIT FIELDS -
; THIS PREVENTS EDIT MODES FROM HANGING OVER, WREAKING INVISIBLE HAVOC.
;
; NO ACTION IF SUBFUNCTION HAS NO DEFINED FIELDS, OTHER THAN THE ABOVE.
;
; IF CUR_FLD_INDEX IS HIGHER THAN THE INDEX OF THE LAST FIELD DEFINED IN
; SUBFUNCTION BLOCK, ATTEMPTS TO INSTALL FIELD 0 - ASSUMES THAT THIS MAY
; HAVE BEEN CAUSED BY SCROLL-RIGHT FROM LAST FIELD IN SUBFUNCTION, IN
; WHICH CASE CORRECT RESPONSE IS TO WRAP BACK TO FIRST FIELD.
; CORRESPONDINGLY, IF CUR_FLD_INDEX IS NEGATIVE, WILL ATTEMPT TO INSTALL
; THE LAST DEFINED FIELD IN SUBFUNCTION - THIS COVERS WRAP BACK TO LAST
; FIELD AFTER SCROLL-LEFT FROM FIRST FIELD IN SUBFUNCTION.
;
; IF CHOSEN FIELD IS NOT EDITABLE, WILL STEP TO NEXT FIELD IN DIRECTION
; WHICH IS CONSISTENT WITH CURRENT FIELD-SCROLL DIRECTION (AS INDICATED
; BY FLD_INDEX_STEP) AND BEGIN THE LOCATE/INSTALL PROCEDURE FROM START.
; STOP_FLD_INDEX IS USED TO DETECT THE INFINITE LOOP CONDITION CAUSED BY
; NO EDITABLE FIELDS IN SUBFUNCTION, AND EXIT WITHOUT ACTION - TO ENABLE
; THIS TO OCCUR, MUST ENTER INITIALLY WITH STOP_FLD_INDEX = -1.
;
; AS WITH WRITE_ALL_FIELDS, THE EXECUTION OF THE COMPLETE PROCEDURE IS
; BROKEN DOWN INTO SMALL PIECES TO AVOID HANGING ON TO THE BACKGROUND
; FOR TOO LONG AT A STRETCH, WHICH WOULD IMPAIR RESPONSE OF ROUTINES IN
; HIGH-PRIORITY BACKGROUND QUEUE.  AFTER EACH SMALL PIECE OF EXECUTION,
; BEFORE RETURNING TO BACK_HANDLER TO ALLOW HIGH-PRIORITY ROUTINES A
; CHANCE TO EXECUTE, THE VALUE OF SPINE_COUNT IS STEPPED BACKWARDS BY
; ONE NOTCH, PUTTING THIS ROUTINE NEXT IN LINE TO BE CALLED BY THE LOW-
; PRIORITY ROTATING BACKGROUND MANAGER (ROTATING_SPINE).  THUS, THIS
; ROUTINE GRABS HOLD OF LOW-PRIORITY BACKGROUND UNTIL IT IS DONE
; (THEREBY SIMULATING COMPLETE EXECUTION IN A SINGLE CALL, AS FAR AS
; ORDER-DEPENDENCIES IN ROTATING_SPINE ROUTINES ARE CONCERNED), WITHOUT
; ACTUALLY MONOPOLIZING THE BACKGROUND AT LARGE.  WHEN THE PROCEDURE
; GOES TO COMPLETION, IT CLEARS INST_EDIT_FLAG AND RETURNS WITHOUT
; TAMPERING WITH SPINE_COUNT, ALLOWING NORMAL ROTATION TO RESUME.
;
; THE ROUTINE EXECUTES IN SEVERAL DISTINCT PHASES, WITH INST_TSK_INDEX
; USED TO INDICATE WHICH PHASE OR TASK IS CURRENTLY BEING WORKED ON.
; CERTAIN OF THESE PHASES - THOSE INVOLVED IN LOCATING THE SELECTED
; FIELD BLOCK - OFTEN REQUIRE MULTIPLE CALLS TO TIME-CONSUMING FIELD-
; PARSING ROUTINES.  TO AVOID TAKING TOO MUCH TIME BEFORE RELINQUISHING
; THE BACKGROUND, EXECUTION OF THESE FIELD-PARSING ROUTINES IS LIMITED
; TO ONE CALL PER CALL TO INSTALL_EDIT_FIELD, HENCE THESE PHASES WILL
; NORMALLY REQUIRE SEVERAL CALLS FROM ROTATING_SPINE BEFORE EXECUTION
; CAN PASS TO THE NEXT PHASE.  WHILE IN THESE PHASES, CUR_FLD_BLOCK AND
; TEMP_FLD_INDEX ARE THE RELEVANT STATE INDICATORS, WHILE CUR_FLD_INDEX
; AND STOP_FLD_INDEX IMPOSE THE LIMIT CONDITIONS WHICH INDICATE THAT THE
; PHASE IS COMPLETE.
;
; ONE MORE THING - PROCEDURE WILL HANG ITSELF UP BEFORE COMPLETION IF IT
; DETERMINES THAT A NEW SUBFUNCTION INSTALLATION REQUEST HAS BEEN MADE -
; I.E., IF SUBFUN_INSTALL FLAG IS NOT = 0.  NORMALLY THIS IS CAUSED BY
; SOME CONDITION DETECTED DURING THE INSTALLTION PROCEDURE ITSELF, AND
; THE PREEMIE ABORT AVOIDS UNNECESSARY EXECUTION, AS WELL AS BLOCKING
; THE OCCURRENCE OF SPURIOUS EDITS BEFORE THE NEW INSTALLATION BEGINS.
; BACKGROUND ROTATION INDEX IS AIMED SQUARELY AT SUBFUN_INSTALL CHECK.
;
; OK THEN -
;
INSTALL_EDIT_FIELD
               MOVE.L  CUR_FLD_BLOCK,A1     ;MOST PHASES NEED THIS (NOT ALL) ....
               MOVE    INST_TSK_INDEX,D0    ;LET'S SEE WHAT WE BE UP TO.
               JMP     INST_EF_TBL(PC,D0)
INST_EF_TBL
               BRA     INST_EF_START        ;INITIAL PHASE - DECIDE HOW TO SEARCH FOR EDIT FIELD.
               BRA     INST_EF_LOOK_UP      ;SEARCHING UPWARDS THROUGH FIELD BLOCKS FOR "THE ONE."
               BRA     INST_EF_FIND_LAST    ;SEARCHING FOR LAST FIELD BLOCK IN SUBFUNCTION BLOCK.
               BRA     INST_EF_DISPLAY      ;INSTALLING DISPLAY HOOKS FOR CHOSEN EDIT FIELD.
               BRA     INST_EF_ACCESS       ;INSTALLING ACCESS HOOKS FOR CHOSEN EDIT FIELD.
               BRA     INST_EF_EDIT         ;INSTALLING EDIT HOOKS FOR CHOSEN EDIT FIELD.
               BRA     INST_EF_REDISP       ;FETCH PARAMETER, REQUEST REDISPLAY, HANG UP.
;
;
INST_EF_START
               BSR     UNPLUG_ALL_EDITS     ;BEFORE  A N Y T H I N G  ELSE ....
               MOVE.L  #NOTHINGNESS,CURSOR_LFT_VEC    ;THESE AREN'T COVERED BY THE ABOVE,
               MOVE.L  #NOTHINGNESS,CURSOR_RGT_VEC    ;OWING TO SOME RATHER PERVERSE LOGIC.
               MOVE.L  CUR_SUB_BLOCK,A1     ;STARTERS - SET POINTER TO FIRST FIELD BLOCK.
               LEA     32(A1),A1            ;GOTTA STEP PAST SCREEN TEXT STRING.
               TST     (A1)                 ;ANY FIELDS DEFINED FOR THIS SUBFUNCTION?
               BEQ     INST_EF_COMPLETE     ;BRANCH IF NOT - HANG UP AND EXIT.
               MOVE.L  A1,CUR_FLD_BLOCK     ;ELSE - HERE BEGINS OUR SEARCH FOR THE EDIT FIELD.
               CLR     TEMP_FLD_INDEX       ;TRIAL FIELD INDEX DURING EDIT FIELD SEARCH.
               MOVE    CUR_FLD_INDEX,D0     ;THIS IS WHO WE'RE (PRESUMABLY) LOOKING FOR -
               BEQ.S   INST_EF_FIELD_FOUND  ;BRANCH IF WE ALREADY HAPPEN TO BE THERE (FIELD 0).
               BPL.S   INST_EF_ST_10        ;BRANCH IF TARGET FIELD INDEX > 0 ....
               ADDQ    #8,INST_TSK_INDEX    ;IF INDEX NEGATIVE, FIND LAST FIELD IN SUBFUNCTION.
               BRA.S   INST_EF_FIND_LAST
INST_EF_ST_10
               ADDQ    #4,INST_TSK_INDEX    ;POSITIVE TARGET FIELD INDEX - FALL THROUGH, SEARCH
                                            ;UPWARDS FROM FIELD BLOCK 0 UNTIL WE FIND TARGET FIELD.
;
;
INST_EF_LOOK_UP
                                            ;FIELD CURRENTLY POINTED AT IS NOT THE ONE WE WANT -
               MOVE    #FIELD_END,D0        ;SCAN TO THE END OF THIS FIELD BLOCK.
               BSR     SEARCH_FIELD         ;THIS WILL POINT A2 AT FIELD-END MARKER -
               CMP     #SUBFUN_END,(A2)+    ;LAST FIELD?  (IF NOT, A2 NOW POINTS TO START OF NEXT).
               BNE.S   INST_EF_LU_10        ;BRANCH IF NOT - SEE IF IT'S THE ONE WE'RE LOOKING FOR.
               MOVE.L  CUR_SUB_BLOCK,A1     ;NOT YET TRIED - SO WE'LL ATTEMPT TO INSTALL FIELD 0.
               LEA     32(A1),A1
               MOVE.L  A1,CUR_FLD_BLOCK
               CLR     D0                   ;NEW VALUE FOR CUR_FLD_INDEX.
               BRA.S   INST_EF_FIELD_FOUND  ;GO SEE IF FIELD IS EDITABLE.
INST_EF_LU_10
               MOVE.L  A2,CUR_FLD_BLOCK     ;STORE POINTER TO NEXT FIELD BLOCK -
               MOVE.L  A2,A1                ;COPY TO A1, IN CASE IT'S "THE ONE."
               ADDQ    #1,TEMP_FLD_INDEX    ;THIS IS THE NEW TRIAL FIELD INDEX.
               MOVE    CUR_FLD_INDEX,D0     ;IS THIS FIELD "THE ONE?"  IS IT? IS IT? HUH?
               CMP     TEMP_FLD_INDEX,D0
               BEQ.S   INST_EF_FIELD_FOUND  ;BRANCH IF IT IS, SEE IF IT'S EDITABLE.
               BRA     INST_EF_CONTINUE     ;ELSE EXIT, SETTING UP TO CONTINUE FROM HERE NEXT TIME.
;
;
INST_EF_FIND_LAST
                                            ;FIELD INDEX WAS NEGATIVE, SO WE LOOK FOR LAST FIELD.
               MOVE    #FIELD_END,D0        ;SCAN TO THE END OF THIS FIELD BLOCK.
               BSR     SEARCH_FIELD         ;THIS WILL POINT A2 AT FIELD-END MARKER -
               CMP     #SUBFUN_END,(A2)+    ;LAST FIELD?  (IF NOT, A2 NOW POINTS TO START OF NEXT).
               BNE.S   INST_EF_FL_10        ;BRANCH IF NOT - SET UP TO CHECK NEXT ONE, NEXT TIME.
               MOVE    TEMP_FLD_INDEX,D0    ;ELSE THIS IS NEW INDEX (CUR_FLD_BLOCK ALREADY SET) -
               BRA.S   INST_EF_FIELD_FOUND  ;GO SEE IF THIS FIELD IS EDITABLE.
INST_EF_FL_10
               MOVE.L  A2,CUR_FLD_BLOCK     ;HERE'S WHERE SEARCH WILL RESUME - NEXT TIME.
               ADDQ    #1,TEMP_FLD_INDEX
               BRA.S   INST_EF_CONTINUE     ;EXIT, SETTING UP TO CONTINUE FROM HERE NEXT TIME.
;
;
INST_EF_FIELD_FOUND
                                            ;A1 (= (CUR_FLD_BLOCK)) POINTS TO TARGET FIELD BLOCK -
                                            ;D0 IS CORRESPONDING FIELD INDEX.
               CMP     #EDIT+NO_EDITS,2(A1) ;IS THIS A NO-EDITS FIELD?
               BNE.S   INST_EF_FF_40        ;BRANCH IF NOT, WE'RE GONNA INSTALL IT.
               TST     STOP_FLD_INDEX       ;YES, BUT - IS THIS FIRST FIELD WE'VE TRIED TO INSTALL?
               BPL.S   INST_EF_FF_20        ;BRANCH IF NO, SEE IF WE ALREADY TRIED THIS ONE BEFORE.
               MOVE    D0,STOP_FLD_INDEX    ;YES - NOTE THE INDEX, IN CASE WE GO THRU ALL OF 'EM.
               BRA.S   INST_EF_FF_30        ;DON'T LOOK FOR TROUBLE ONE LINE DOWN.
INST_EF_FF_20
               CMP     STOP_FLD_INDEX,D0    ;HAVE WE ALREADY TRIED TO INSTALL THIS FIELD?
               BEQ.S   INST_EF_COMPLETE     ;BRANCH IF YES - NO EDITABLE FIELDS, SO BEGONE.
INST_EF_FF_30
               ADD     FLD_INDEX_STEP,D0    ;NO - DON'T QUIT YET, JUST STEP TO ANOTHER FIELD IN
               MOVE    D0,CUR_FLD_INDEX     ;SCROLL DIRECTION, START FROM SCRATCH WITH NEW TARGET -
               CLR     INST_TSK_INDEX       ;I.E., COME IN THROUGH INST_EF_START - NEXT TIME.
               BRA.S   INST_EF_CONTINUE     ;BE BACK REAL SOON.
INST_EF_FF_40
               MOVE    D0,CUR_FLD_INDEX     ;SAVE NEW EDIT FIELD INDEX (HEY, IT MIGHTA CHANGED ...)
               MOVE    #12,INST_TSK_INDEX   ;NEXT TIME - START INSTALLING THIS FIELD.
               BRA.S   INST_EF_CONTINUE     ;SO - WE'LL BE BACK.  REAL SOON.
;
;
INST_EF_DISPLAY
               TST     CUR_FUN_INDEX         ;IF SUBFUNCTION IS -1 DONT UPDATE FIELD INDEX
               BMI.S   INST_EF_DIS_1
               MOVE    CUR_FUN_INDEX,A2     ;SUBFUN MGR RECALLS FIELD INDEX PER SWITCH - GIVE MEMO.
               ADD     A2,A2
               MOVE    CUR_FLD_INDEX,FLD_INDEXES(A2)
INST_EF_DIS_1  BSR     SET_DISPLAY          ;INSTALL DISPLAY HOOKS FOR THE EDIT FIELD.
               BRA.S   INST_EF_STEP         ;EXIT, SETTING UP TO RESUME WITH NEXT PHASE.
;
;
INST_EF_ACCESS
               BSR     SET_ACCESS           ;INSTALL ACCESS HOOKS FOR THE EDIT FIELD.
               BRA.S   INST_EF_STEP         ;EXIT, SETTING UP TO RESUME WITH NEXT PHASE.
;
;
INST_EF_EDIT
               BSR     SET_EDIT             ;INSTALL EDIT HOOKS FOR THE EDIT FIELD.
               BRA.S   INST_EF_STEP         ;EXIT, SETTING UP TO RESUME WITH NEXT PHASE.
;03DEC;
;03DEC;
;03DECINST_EF_POSITION
;03DEC               BSR     FETCH_PARAMETER      ;FETCH CURRENT PARAMETER VALUE INTO PARAM_BUFFER.
;03DEC               ST      POSITION_CURS        ;REQUEST POSITIONING OF CURSOR ON EDIT FIELD.
;03DEC               BRA.S   INST_EF_COMPLETE     ;WE'RE DONE - WON'T BE BACK REAL SOON.
;
;
INST_EF_REDISP
               ST      REDISP_FIELD         ;REQUEST FIELD REDISPLAY (REFRESHES ALL VARIABLES
                                            ;ASSOCIATED WITH EDITING THIS FIELD, AND POSITIONS
                                            ;CURSOR ON IT.
               BRA.S   INST_EF_COMPLETE     ;WE'RE DONE - WON'T BE BACK REAL SOON.
;
;
INST_EF_STEP
               ADDQ    #4,INST_TSK_INDEX    ;NEXT TIME THROUGH, ATTACK NEXT PHASE OF PROCEDURE.
;
INST_EF_CONTINUE
               TST.B   SUBFUN_INSTALL       ;WE'LL BE BACK REAL SOON - UNLESS THIS FLAG IS SET.
               BNE.S   INST_EF_HALT         ;IF SET, WE GOT A NEW INSTALL REQUEST - DROP THIS ONE.
               SUBQ    #4,SPINE_COUNT       ;NOTHIN' UP - NOTCH BACKGROUND ROTATION BACK (TO US).
               BRA.S   INST_EF_EXIT         ;EXIT, LEAVING INST_EDIT_FLAG SET SO WE'LL CONTINUE.
;
INST_EF_HALT
               BSR     UNPLUG_ALL_EDITS     ;HADDA QUIT - DON' LEAVE NOTTIN HANGIN'.
               MOVE.L  #NOTHINGNESS,CURSOR_RGT_VEC
               MOVE.L  #NOTHINGNESS,CURSOR_LFT_VEC
               MOVE    #SUB_INST_VERT,SPINE_COUNT     ;GO STRAIGHT TO SUBFUNCTION INSTALL.
                                                      ;DO NOT ROTATE.  DO NOT GET SIDETRACKED.
;
INST_EF_COMPLETE
               SF      INST_EDIT_FLAG       ;WE'RE EITHER DONE, OR GIVING UP.
;
INST_EF_EXIT
               RTS
;
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; WRITE VALUE OF PARAMETER IN A FIELD INTO SCREEN BUFFER -
; A1 POINTS TO START OF FIELD BLOCK WITHIN SUBFUNCTION BLOCK.
; ASSUMES FIELD DISPLAY VECTORS ALREADY INSTALLED (SEE INSTL_FIELD_DISP) -
; ASSUMES LIKEWISE REGARDING PARAMETER ACCESS PATH (SEE SET_ACCESS).
; WRITE_PARAMETER WILL NOT CAUSE OUTPUT TO LCD ON ITS OWN.
; ALL REGISTERS PRESERVED.
;
WRITE_PARAMETER
               BSR.S   FETCH_PARAMETER      ;FETCH PARAMETER VALUE INTO PARAM_BUFFER.
;
               MOVE.L  A0,-(A7)             ;EXECUTE DISPLAY ROUTINE USING FIELD POSITION/LENGTH
               MOVE.L  DISPLAY_VEC,A0       ;SPEC POINTED TO BY A1 (AT TOP OF FIELD BLOCK).
               JSR     (A0)
               MOVE.L  (A7)+,A0
;
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
;
;
;
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; FETCH PARAMETER VALUE INTO PARAM_BUFFER -
; ASSUMES PARAMETER ACCESS PATH INSTALLED (SEE SET_ACCESS).
; PRESERVES ALL REGISTERS.
;
FETCH_PARAMETER
               MOVEM.L A0/D0,-(A7)
               CLR.L   PARAM_BUFFER         ;OFF THE TRASH.
               MOVE.L  PARAM_POINTER,A0     ;RETRIEVE POINTER TO PARAMETER,
               TST.B   PARAM_SIZE           ;DETERMINE SIZE OF PARAMETER TO BE FETCHED.
               BEQ.S   FET_PRM_10           ;IF = 0, PARAMETER IS BYTE-SIZED.
               BTST    #0,PARAM_SIZE        ;L.S.B. SET INDICATES WORD.
               BNE.S   FET_PRM_20
               MOVE.L  (A0),PARAM_BUFFER    ;ELSE, ASSUME LONG-WORD PARAM VALUE.
               BRA.S   FET_PRM_30
FET_PRM_10
               CLR     D0                   ;FETCH BYTE PARAMETER -
               MOVE.B  (A0),D0              ;TREAT BYTE PARAMETER AS WORD WHILE IN PARAM_BUFFER.
               TST.B   SIGN_ENABLE          ;IS THIS A SIGNED PARAMETER?
               BEQ.S   FET_PRM_18           ;BRANCH IF NOT,
               EXT.W   D0                   ;ELSE SIGN-EXTEND TO WORD BEFORE IT GOES INTO BUFFER.
FET_PRM_18
               MOVE    D0,PARAM_BUFFER      ;STORE WORD-SIZE VALUE.
               BRA.S   FET_PRM_30
FET_PRM_20
               MOVE    (A0),PARAM_BUFFER
;
FET_PRM_30
               MOVEM.L (A7)+,A0/D0
FET_PRM_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; SEARCH A FIELD BLOCK FOR A GIVEN SPECIFICATION -
; A1 POINTS TO FIELD BLOCK, D0 CONTAINS SPEC KEYWORD TO SEARCH FOR -
; KEYWORD COMPARISON IS DONE ON M.S.BYTE ONLY, MODIFIERS ARE IGNORED.
; IF KEYWORD FOUND, RETURNS POINTER TO IT IN A2 AND Z FLAG SET -
; RETURNS Z FLAG CLEAR IF SEARCHED-FOR SPEC IS NOT PRESENT IN FIELD.
; DESTROYS A2 - PRESERVES ALL OTHER REGISTERS.
;
SEARCH_FIELD
               MOVEM.L D0-D1/A3,-(A7)
               LEA     2(A1),A2             ;SET POINTER PAST FIELD POSITION/LENGTH SPEC.
               LSR     #8,D0                ;SHIFT KEYWORD M.S.BYTE INTO POSITION FOR COMPARE.
SRCH_FLD_10
               CMP.B   (A2),D0              ;KEYWORD MATCH?
               BEQ.S   SRCH_FLD_50          ;BRANCH IF YES - WE'RE DONE.
               CMP     #FIELD_END,(A2)      ;END OF FIELD BLOCK (OR OF SUBFUNCTON BLOCK)?
               BCS.S   SRCH_FLD_20          ;BRANCH IF NOT - SKIP THIS FIELD ELEMENT.
               TST     (A2)                 ;ELSE RETURN WITH Z FLAG CLEAR TO INDICATE "NOT FOUND".
               BRA.S   SRCH_FLD_50
SRCH_FLD_20
                                            ;BY THIS, WE SAVE TIME BY NOT SEARCHING WHOLE LIST:
               MOVE.B  (A2),D1              ;INDEX ON KEYWORD TO GET LIST-SEARCH STARTING POINT.
               EXT.W   D1
               ADD     D1,D1
               ADD     D1,D1
               MOVE.L  SRCH_FLD_PTRS(PC,D1),A3   ;ESPECIALLY FOR EDIT KEYWORDS, GIVES HEAD START.
                                                 ;(ASSUMING MATCH WILL NORMALLY BE FOUND, WE DON'T
                                                 ;BOTHER WITH SEPARATE SEARCH END LIMITS.)
               MOVE    (A2),D1              ;NOW FETCH FULL KEYWORD/QUALIFIER FOR SEARCH.
SRCH_FLD_30
               CMP     (A3)+,D1             ;COMPARE KEYWORD/QUALIFIER AGAINST ENTRY IN SIZE LIST,
               BEQ.S   SRCH_FLD_40          ;BRANCH IF THIS IS IT.
               CMP.L   #SRCH_FLD_TBL_END-2,A3    ;NOT IT - BEEN THROUGH WHOLE LIST?
               BEQ.S   SRCH_FLD_40               ;YES - DEFAULT TO 1-WORD STEP - GOOD LUCK.
;
               BHI.S   SRCH_FLD_ERROR       ;TEST - TO CATCH POINTER OVERRUN IN EMULATION ....
;
               TST     (A3)+                     ;NO - STEP OVER SKIP LENGTH,
               BRA     SRCH_FLD_30               ;KEEP LOOKING.
SRCH_FLD_40
               ADD     (A3),A2              ;STEP FIELD SEARCH POINTER UP TO NEXT FIELD ELEMENT,
               BRA     SRCH_FLD_10          ;RESUME SEARCH WITH NEXT FIELD ELEMENT KEYWORD.
;
SRCH_FLD_50
               MOVEM.L (A7)+,D0-D1/A3
SRCH_FLD_EXIT
               RTS
;
;
               NOP                     ;TEST - TO OPERATE IN CONJ WITH
               NOP                     ;ABOVE TEST BRANCH .....
SRCH_FLD_ERROR
               BRA     SRCH_FLD_ERROR  ;JUST HOLD HIM TILL THE COPS GET THERE ....
;
;
SRCH_FLD_PTRS
               DC.L    SRCH_ACCESS          ;POINTERS INTO KEYWORD ZONES.
               DC.L    SRCH_DISPLAY
               DC.L    SRCH_EDIT
;
;
SRCH_FLD_TBL
;
; NOTE - TABLE NEED NOT CONTAIN ALL POSSIBLE COMBINATIONS,
; BUT MUST CONTAIN ALL COMBINATIONS WHICH HAVE BEEN USED SOMEWHERE.
; FORMAT OF TABLE ENTRY IS:
;              DC.W    KEYWORD (+QUALIFIER(+QUALIFIER...))
;              DC.W    n
; WHERE n IS THE TOTAL NUMBER OF BYTES FOR KEYWORD PLUS ANY ASSOCIATED PARAMETERS.
;
SRCH_ACCESS
               DC.W    ACCESS+DIR_PTR       ;ABS SHORT POINTER TO PARAMETER.
               DC.W    4
;
               DC.W    ACCESS+SET_PTR       ;LONG PTR TO ROUTINE TO COMPUTE PARAMETER POINTER.
               DC.W    6
;
               DC.W    ACCESS+BYTE          ;PARAMETER SIZE = BYTE.
               DC.W    2
;
               DC.W    ACCESS+WORD          ;PARAMETER SIZE = WORD.
               DC.W    2
;
               DC.W    ACCESS+LONG          ;PARAMETER SIZE = LONG.
               DC.W    2
;
               DC.W    ACCESS+SIGNED        ;INDICATES SIGNED PARAMETER.
               DC.W    2
;
SRCH_DISPLAY
               DC.W    DISPLAY+DISP_VEC     ;DISPLAY ROUTINE POINTER.
               DC.W    6
;
               DC.W    DISPLAY+DISP_STRNG   ;POINTER TO INDEXED STRING ARRAY FOR DISPLAY.
               DC.W    6
;
               DC.W    DISPLAY+DISP_OFFSET  ;DISPLAY ROUTINE BYTE/WORD-OFFSET VALUE.
               DC.W    4
;
               DC.W    DISPLAY+DISP_SCALE   ;DISPLAY ROUTINE SCALE FACTOR.
               DC.W    4
;
               DC.W    DISPLAY+DEC_POINT    ;SET POSITION OF DECIMAL POINT IN DISPLAY.
               DC.W    4
;
               DC.W    DISPLAY+NO_ZERO_BLANK     ;INHIBIT LEADING-ZERO BLANKING.
               DC.W    2
;
               DC.W    DISPLAY+MIN_STRNG    ;DISPLAY STRING IN PLACE OF MIN PARAM VALUE.
               DC.W    6
;
               DC.W    DISPLAY+MAX_STRNG    ;DISPLAY STRING IN PLACE OF MAX PARAM VALUE.
               DC.W    6
;
               DC.W    DISPLAY+MIN_LIMIT    ;LIMIT VALUE FOR MIN_STRNG DISPLAY.
               DC.W    4
;
               DC.W    DISPLAY+MAX_LIMIT    ;LIMIT VALUE FOR MAX_STRNG DISPLAY.
               DC.W    4
;
               DC.W    DISPLAY+TAILOR       ;EXECUTE ROUTINE TO PERFORM SPECIAL DISPLAY SETUP.
               DC.W    6
;
SRCH_EDIT
               DC.W    EDIT+POT_DIVS        ;SET NUMBER OF POT DIVISIONS.
               DC.W    4
;
               DC.W    EDIT+POT_CHG_VEC     ;SET POT-CHANGE RESPONSE VECTOR.
               DC.W    6
;
               DC.W    EDIT+NO_KEYPAD       ;DISABLE DECIMAL KEYPAD.
               DC.W    2
;
               DC.W    EDIT+LO_LIMIT        ;SET FIXED PARAMETER LOWER LIMIT.
               DC.W    4
;
               DC.W    EDIT+HI_LIMIT        ;SET FIXED PARAMETER UPPER LIMIT.
               DC.W    4
;
               DC.W    EDIT+INCR_VEC        ;SET INCREMENT SWITCH VECTOR.
               DC.W    6
;
               DC.W    EDIT+DECR_VEC        ;SET DECREMENT SWITCH VECTOR.
               DC.W    6
;
               DC.W    EDIT+ENTR_VEC        ;SET ENTER SWITCH VECTOR.
               DC.W    6
;
               DC.W    EDIT+CURS_RGT        ;SET CURSOR-RIGHT SWITCH VECTOR.
               DC.W    6
;
               DC.W    EDIT+CURS_LFT        ;SET CURSOR-LEFT SWITCH VECTOR.
               DC.W    6
;
               DC.W    EDIT+LINKED          ;VALUES IN OTHER FIELDS LINKED TO VALUE HERE.
               DC.W    2
;
               DC.W    EDIT+ED_VEC          ;SET VECTOR FOR ROUTINE TO BE EXECUTED UPON EACH EDIT.
               DC.W    6
;
               DC.W    EDIT+CUSTOMIZE       ;CUSTOMIZE EDIT SETUP BEYOND NORMAL SET_EDIT MODES.
               DC.W    6
;
               DC.W    EDIT+NO_EDITS        ;NO-EDIT FIELD.
               DC.W    2
;
SRCH_FLD_TBL_END
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; SET UP ACCESS PATH FOR PARAMETER ASSOCIATED WITH A FIELD -
; A1 POINTS TO FIELD BLOCK.
; SETS PARAM_POINTER, PARAM_SIZE, SIGN_ENABLE - MAY ALSO SET AUX_ED_PTR(S).
; ABORTS IF SUBFUN_INSTALL IS FOUND TO BE SET - MAY OCCUR AS OUTCOME OF
; AN ACCESS-INSTALL ROUTINE, WHEN CURRENT SUBFUNCTION IS INAPPROPRIATE
; TO AN EXISTING CONDITION - OR WHO KNOWS WHAT ....
; ALL REGISTERS PRESERVED.
;
SET_ACCESS
               MOVEM.L A2/D0,-(A7)
               SF      SIGN_ENABLE          ;DEFAULT TO UNSIGNED PARAMETER.
               SF      PARAM_SIZE           ;DEFAULT TO BYTE PARAMETER.
               MOVE    #ACCESS,D0           ;SET SEARCH PARAMETER,
               BSR     SEARCH_FIELD         ;SEARCH FIELD BLOCK FOR IT -
               BNE.S   SET_ACC_1000         ;BRANCH IF NO ACCESS SPECS FOUND, EXIT.
               BRA.S   SET_ACC_60           ;ELSE DECODE IT AND DO WHATEVER IT IS TO BE DONE TO IT.
;
                                            ;CUM BOK HIR TO LOOK FOR ANY ADDITIONAL ACCESS SPECS.
SET_ACC_50
               TST.B   SUBFUN_INSTALL       ;IS A NEW INSTALL REQUEST AFOOT?
               BNE.S   SET_ACC_1000         ;EXIT IF YES, WE'LL BE BACK THIS WAY REAL SOON.
;
               MOVE    (A2),D0              ;SEE IF ANOTHER ACCESS SPECIFICATION FOLLOWS -
               AND     #0FF00H,D0           ;EXCLUDE L.S.BYTE, OF COURSE -
               CMP     #ACCESS,D0
               BNE.S   SET_ACC_1000         ;BRANCH IF NOT - ACCESS INSTALLATION DONE - ELSE,
SET_ACC_60
               MOVE    (A2)+,D0             ;DETERMINE WHICH SPEC IT IS, SET IT UP:
               CMP.B   #DIR_PTR,D0          ;ABSOLUTE-SHORT POINTER TO PARAMETER.
               BEQ.S   SET_ACC_100
               CMP.B   #SET_PTR,D0          ;LONG POINTER TO ROUTINE FOR SETTING PARAMETER POINTER.
               BEQ.S   SET_ACC_180
               CMP.B   #LONG,D0             ;PARAMETER SIZE SPEC.
               BLS.S   SET_ACC_200
               CMP.B   #SIGNED,D0           ;SET FLAG TO HANDLE SIGNED PARAMETER.
               BEQ.S   SET_ACC_280
               BRA.S   SET_ACC_1000         ;STOPGAP FOR SAFETY.
SET_ACC_100
               MOVE    (A2)+,D0             ;FETCH ABS SHORT PARAMETER POINTER,
               EXT.L   D0                   ;CONVERT IT TO ABSOLUTE-LONG POINTER,
               MOVE.L  D0,PARAM_POINTER     ;STORE IT.
               BRA     SET_ACC_50           ;SEE IF YET ANOTHER ACCESS SPEC FOLLOWS.
SET_ACC_180
               MOVE.L  A0,-(A7)             ;SAVE A0 VALUE SO IT CAN BE USED FOR VECTORING.
               MOVE.L  (A2)+,A0             ;FETCH LONG ADDR OF ROUTINE TO SET PARAM POINTER(S),
               JSR     (A0)                 ;GO FOR IT - PARAM_POINTER COMES BACK IN D0,
               MOVE.L  D0,PARAM_POINTER     ;ANY NEEDED AUX_ED_PTRs ARE SET DIRECTLY.
               MOVE.L  (A7)+,A0             ;RESTORE A0.
               BRA     SET_ACC_50           ;SEE IF YET ANOTHER ACCESS SPEC FOLLOWS.
SET_ACC_200
               MOVE.B  D0,PARAM_SIZE        ;SET PARAMETER SIZE SWITCH.
               BRA     SET_ACC_50           ;SEE IF YET ANOTHER ACCESS SPEC FOLLOWS.
SET_ACC_280
               ST      SIGN_ENABLE
               BRA     SET_ACC_50           ;SEE IF YET ANOTHER ACCESS SPEC FOLLOWS.
;
SET_ACC_1000
               MOVEM.L (A7)+,A2/D0
SET_ACC_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; SET UP DISPLAY VECTORS AND CONTROLS FOR PARAM ASSOCIATED WITH A FIELD -
; A1 POINTS TO FIELD BLOCK.
; SETS DISPLAY_VEC PER FIELD BLOCK - SETS THE OTHER DISPLAY CONTROLS
; PER FIELD BLOCK SPEC IF GIVEN, SETS DEFAULTS WHERE NO SPEC GIVEN.
; ABORTS IF SUBFUN_INSTALL IS FOUND TO BE SET - MAY OCCUR AS OUTCOME OF
; AN DISPLAY-INSTALL ROUTINE, WHEN CURRENT SUBFUNCTION IS INAPPROPRIATE
; TO AN EXISTING CONDITION - OR WHO KNOWS WHAT ....
; ALL REGISTERS PRESERVED.
;
SET_DISPLAY
               MOVEM.L A2/D0,-(A7)
                                                      ;SET DEFAULT DISPLAY CONTROLS:
               MOVE.L  #WRITE_PARAM_VALUE,DISPLAY_VEC ;DECIMAL VALUE / LIMIT-STRING DISPLAY.
               CLR.L   DISPLAY_OFFSET                 ;DISPLAY OFFSET = 0.
               MOVE    #1,DISPLAY_SCALE               ;PARAMETER SCALE FACTOR = 1.
               CLR     DECIMAL_POINT                  ;NO DECIMAL POINT IN DISPLAY.
               ST      ZERO_BLANKING                  ;LEADING-ZERO BLANKING ENABLED.
               SF      STRING_AT_MIN                  ;NO STRING DISPLAY AT LIMITS OF PARAM RANGE.
               SF      STRING_AT_MAX
;
               MOVE    #DISPLAY,D0          ;SET SEARCH PARAMETER,
               BSR     SEARCH_FIELD         ;SEARCH FIELD BLOCK FOR IT -
               BNE     SET_DISP_1000        ;BRANCH IF NO DISPLAY SPECS FOUND, EXIT.
               BRA.S   SET_DISP_20          ;ELSE DECODE IT AND DO WHATEVER IT IS TO BE DONE TO IT.
;
                                            ;CUM BOK HIR TO LOOK FOR ANY ADDITIONAL DISPLAY SPECS.
SET_DISP_10
               TST.B   SUBFUN_INSTALL       ;IS A NEW INSTALL REQUEST AFOOT?
               BNE     SET_DISP_1000        ;EXIT IF YES, WE'LL BE BACK THIS WAY REAL SOON.
;
               MOVE    (A2),D0              ;SEE IF ANOTHER DISPLAY SPECIFICATION FOLLOWS -
               AND     #0FF00H,D0           ;EXCLUDE L.S.BYTE, OF COURSE -
               CMP     #DISPLAY,D0
               BNE     SET_DISP_1000        ;BRANCH IF NOT - DISPLAY INSTALLATION DONE - ELSE,
SET_DISP_20
               MOVE    (A2)+,D0             ;DETERMINE WHICH SPEC IT IS, SET IT UP:
               CMP.B   #DISP_VEC,D0         ;LONG POINTER TO NON-DEFAULT DISPLAY ROUTINE.
               BEQ.S   SET_DISP_100
               CMP.B   #DISP_STRNG,D0       ;POINTER TO STRING ARRAY INDEXED BY PARAMETER VALUE.
               BEQ.S   SET_DISP_180
               CMP.B   #DISP_OFFSET,D0      ;SIGNED OFFSET ADDED TO BYTE OR WORD PARAM_BUFFER VALUE
               BEQ.S   SET_DISP_200         ;BEFORE IT IS DISPLAYED.
               CMP.B   #DISP_SCALE,D0       ;SCALING OF PARAMETER BEFORE IT IS DISPLAYED.
               BEQ.S   SET_DISP_280
               CMP.B   #DEC_POINT,D0        ;SET DECIMAL POINT POSITION.
               BEQ.S   SET_DISP_300
               CMP.B   #NO_ZERO_BLANK,D0    ;INHIBIT LEADING-ZERO BLANKING.
               BEQ.S   SET_DISP_380
               CMP.B   #MIN_STRNG,D0        ;SET FLAG TO DISPLAY STRING AT MINIMUM PARAMETER VALUE.
               BEQ.S   SET_DISP_400
               CMP.B   #MAX_STRNG,D0        ;SET FLAG TO DISPLAY STRING AT MAXIMUM PARAMETER VALUE.
               BEQ.S   SET_DISP_480
               CMP.B   #MIN_LIMIT,D0        ;LIMIT VALUE FOR MIN_STRNG DISPLAY.
               BEQ.S   SET_DISP_500
               CMP.B   #MAX_LIMIT,D0        ;LIMIT VALUE FOR MAX_STRNG DISPLAY.
               BEQ.S   SET_DISP_580
               CMP.B   #TAILOR,D0           ;EXECUTE ROUTINE FOR SPECIAL DISPLAY SETUP.
               BEQ.S   SET_DISP_600
               BRA.S   SET_DISP_1000        ;STOPGAP FOR SAFETY.
SET_DISP_100
               MOVE.L  (A2)+,DISPLAY_VEC    ;SET UP NON-DEFAULT DISPLAY VECTOR.
               BRA     SET_DISP_10          ;SEE IF YET ANOTHER DISPLAY SPEC FOLLOWS.
SET_DISP_180
               MOVE.L  (A2)+,DISP_STRNG_PTR ;STORE POINTER TO INDEXED STRING ARRAY.
               BRA     SET_DISP_10          ;SEE IF YET ANOTHER DISPLAY SPEC FOLLOWS.
SET_DISP_200
               MOVE    (A2)+,DISPLAY_OFFSET ;STORE WORD OFFSET.
               BRA     SET_DISP_10          ;SEE IF YET ANOTHER DISPLAY SPEC FOLLOWS.
SET_DISP_280
               MOVE    (A2)+,DISPLAY_SCALE  ;STORE SCALE FACTOR.
               BRA     SET_DISP_10          ;SEE IF YET ANOTHER DISPLAY SPEC FOLLOWS.
SET_DISP_300
               MOVE    (A2)+,DECIMAL_POINT  ;SET DECIMAL POINT POSITION.
               BRA     SET_DISP_10          ;SEE IF YET ANOTHER DISPLAY SPEC FOLLOWS.
SET_DISP_380
               SF      ZERO_BLANKING        ;INHIBIT LEADING-ZERO BLANKING.
               BRA     SET_DISP_10          ;SEE IF YET ANOTHER DISPLAY SPEC FOLLOWS.
SET_DISP_400
               ST      STRING_AT_MIN        ;DISPLAY STRING INSTEAD OF VALUE AT LOWER LIMIT.
               BRA     SET_DISP_490
SET_DISP_480
               ST      STRING_AT_MAX        ;DISPLAY STRING INSTEAD OF VALUE AT UPPER LIMIT.
SET_DISP_490
               MOVE.L  (A2)+,DISP_STRNG_PTR ;SET POINTER TO POSITION/LENGTH/STRING.
               BRA     SET_DISP_10          ;SEE IF YET ANOTHER DISPLAY SPEC FOLLOWS.
SET_DISP_500
               MOVE    (A2)+,PARAM_LO_LIM   ;SET UP LIMIT VALUE FOR MIN_STRNG DISPLAY.
               BRA     SET_DISP_10          ;SEE IF YET ANOTHER DISPLAY SPEC FOLLOWS.
SET_DISP_580
               MOVE    (A2)+,PARAM_HI_LIM   ;SET UP LIMIT VALUE FOR MAX_STRNG DISPLAY.
               BRA     SET_DISP_10          ;SEE IF YET ANOTHER DISPLAY SPEC FOLLOWS.
SET_DISP_600
               MOVE.L  A0,-(A7)             ;SAVE A0 - WILL USE IT TO CALL SETUP ROUTINE.
               MOVE.L  (A2)+,A0             ;LOAD POINTER TO SETUP ROUTINE,
               JSR     (A0)                 ;EXECUTE IT,
               MOVE.L  (A7)+,A0             ;RESTORE A0.
               BRA     SET_DISP_10          ;SEE IF YET ANOTHER DISPLAY SPEC FOLLOWS.
;
SET_DISP_1000
               MOVEM.L (A7)+,A2/D0
SET_DISP_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; SET UP PARAMETER-EDIT PATHWAYS AND CONTROLS FOR CURRENT FIELD -
; USE FIELD BLOCK INDICATED BY CUR_FLD_BLOCK (POINTER).
; INCLUDES DATA SLIDER, CURSOR RIGHT/LEFT, INC/DEC, ENTER, DECIMAL KEYPAD, PARAMETER LIMITS.
; FOR SOME FIELDS, MAY SET FLAGS/VECTORS AFFECTING OTHER SWITCHES AS WELL.
; ASSUMES PARAM_POINTER AND PARAM_SIZE HAVE BEEN SET (BY SET_PARAM_ACCESS).
; ABORTS IF SUBFUN_INSTALL IS FOUND TO BE SET - MAY OCCUR AS OUTCOME OF
; AN EDIT-INSTALL ROUTINE, WHEN CURRENT SUBFUNCTION IS INAPPROPRIATE TO
; AN EXISTING CONDITION - OR WHO KNOWS WHAT ....
; PRESERVES ALL REGISTERS.
;
SET_EDIT
               MOVEM.L D0/A0-A2,-(A7)
;
                                            ;SET UP DEFAULTS WHICH APPLY TO EDITABLE FIELD:
;
               ST      CURSOR_ENABLE        ;BLINKING CURSOR IS ON.
               ST      KEYPAD_ENABLE        ;DATA ENTRY VIA DECIMAL KEYPAD IS ENABLED.
               SF      LINKED_PARAM         ;NO OTHER FIELDS IN SAME SCREEN LINKED TO THIS ONE.
               SF      BUILD_KIT_FLAG       ;UNTIL FURTHER NOTICE, THIS IS NOT WHAT WE ARE DOING.
               SF      GUIDO_IS_AWAKE       ;PUT GUIDO TO BED (ABORT ANY KEYPAD ENTRY WHICH
                                            ;MAY HAVE BEEN IN PROGRESS).
;
               CLR.L   PARAM_LO_LIM         ;PARAMETER LOWER LIMIT = 0.
               MOVE    #99,PARAM_HI_LIM     ;PARAMETER UPPER LIMIT = 99.
;
               MOVE.L  #GO_TO_NEXT_FIELD,CURSOR_RGT_VEC    ;CURSOR BUTTONS DEFAULT TO FIELD SCROLL.
               MOVE.L  #GO_TO_PREV_FIELD,CURSOR_LFT_VEC
               MOVE.L  #INCR_PARAMETER,INCREMENT_VEC       ;INC/DEC DEFAULT TO DIRECT INC/DEC MODE.
               MOVE.L  #DECR_PARAMETER,DECREMENT_VEC
               MOVE.L  #ADJ_PARAMETER,POT_CHANGE_VEC       ;DATA POT DEFAULTS TO DIRECT ADJUSTMENT.
               MOVE.L  #NOTHINGNESS,ENTER_VEC              ;ENTER SWITCH DEFAULTS TO NO ACTION.
               MOVE.L  #NOTHINGNESS,EDIT_VEC               ;PARAMETER EDIT AND STORE DEFAULTS TO
                                                           ;NO SPECIAL ACCOMPANYING ACTION.
;
;
                                            ;NOW FIND PARAMETER-EDIT SPECIFICATIONS:
               MOVE.L  CUR_FLD_BLOCK,A1     ;FETCH POINTER TO FIELD BLOCK.
               MOVE    #EDIT,D0             ;SET SEARCH PARAMETER,
               BSR     SEARCH_FIELD         ;SEARCH FIELD BLOCK FOR IT -
               BNE     SET_EDIT_1000        ;BRANCH IF NO EDIT SPECS FOUND.
               BRA.S   SET_EDIT_20          ;A2 NOW POINTS TO PARAMETER-EDIT KEYWORD - DECODE IT.
;
                                            ;COME BACK HERE TO CHECK FOR MORE EDIT SPECS -
SET_EDIT_10
               TST.B   SUBFUN_INSTALL       ;IS A NEW INSTALL REQUEST AFOOT?
               BNE     SET_EDIT_2000        ;EXIT IF YES, WE'LL BE BACK THIS WAY REAL SOON.
;
               MOVE    (A2),D0              ;SEE IF ANOTHER EDIT SPECIFICATION FOLLOWS -
               AND     #0FF00H,D0           ;EXCLUDE L.S.BYTE, OF COURSE -
               CMP     #EDIT,D0
               BNE     SET_EDIT_1000        ;BRANCH IF NOT - EDIT INSTALLATION DONE - ELSE,
SET_EDIT_20
               MOVE    (A2)+,D0             ;DETERMINE WHICH SPEC IT IS, SET IT UP:
               CMP.B   #NO_EDITS,D0         ;NO-EDIT FIELD.
               BEQ     SET_EDIT_2000
               CMP.B   #POT_DIVS,D0         ;SET NUMBER OF DIVISIONS ON DATA SLIDER.
               BEQ.S   SET_EDIT_100
               CMP.B   #POT_CHG_VEC,D0      ;SET VECTOR FOR RESPONDING TO CHANGES ON DATA SLIDER.
               BEQ.S   SET_EDIT_180
               CMP.B   #NO_KEYPAD,D0        ;DISABLE DATA ENTRY VIA DECIMAL KEYPAD.
               BEQ.S   SET_EDIT_200
               CMP.B   #LO_LIMIT,D0         ;SET FIXED LOWER LIMIT FOR PARAMETER EDIT.
               BEQ.S   SET_EDIT_280
               CMP.B   #HI_LIMIT,D0         ;SET FIXED UPPER LIMIT FOR PARAMETER EDIT.
               BEQ.S   SET_EDIT_300
               CMP.B   #INCR_VEC,D0         ;SET VECTOR FOR RESPONSE TO INCREMENT SWITCH.
               BEQ.S   SET_EDIT_380
               CMP.B   #DECR_VEC,D0         ;SET VECTOR FOR RESPONSE TO DECREMENT SWITCH.
               BEQ.S   SET_EDIT_400
               CMP.B   #ENTR_VEC,D0         ;SET VECTOR FOR RESPONSE TO ENTER SWITCH.
               BEQ.S   SET_EDIT_480
               CMP.B   #CURS_RGT,D0         ;SET VECTOR FOR RESPONSE TO CURSOR-RIGHT SWITCH.
               BEQ.S   SET_EDIT_500
               CMP.B   #CURS_LFT,D0         ;SET VECTOR FOR RESPONSE TO CURSOR-LEFT SWITCH.
               BEQ.S   SET_EDIT_580
               CMP.B   #LINKED,D0           ;OTHER FIELD(S) IN SAME SCREEN LINKED TO THIS FIELD.
               BEQ.S   SET_EDIT_600
               CMP.B   #ED_VEC,D0           ;SET VECTOR FOR ROUTINE TO BE EXECUTED UPON EACH EDIT.
               BEQ.S   SET_EDIT_680
               CMP.B   #CUSTOMIZE,D0        ;VECTOR TO ROUTINE FOR CUSTOMIZING EDIT SETUP.
               BEQ.S   SET_EDIT_700
               BRA.S   SET_EDIT_1000        ;STOPGAP FOR SAFETY.
SET_EDIT_100
;
               MOVE    (A2)+,POT_DIVISIONS  ;SET NUMBER OF DIVISIONS ON DATA SLIDER.
               BRA     SET_EDIT_10          ;SEE IF YET ANOTHER EDIT SPEC FOLLOWS.
                                            ;NOTE - THIS ISN'T REALLY SUPPOSED TO BE USED -
                                            ;POT IS SET UP AUTOMATICALLY AT THE END OF THIS ROUTINE
                                            ;USING PARAMETER EDIT LIMITS IN EFFECT - IF IT IS EVER
                                            ;NECESSARY TO OVERRIDE THIS, YOU WILL HAVE TO DEFINE
                                            ;A NEW FLAG (E.G. AUTO_POT_OVRID) TO DO SO -
                                            ;YOU'D CLEAR IT UPON ENTERING SET_PARAM_EDIT, THEN
                                            ;SET IT IF YOU CAME THROUGH THIS BRANCH - YOU'D ALSO
                                            ;HAVE TO SET POT_MULTIPLIER, WHICH COULD BE COMBINED
                                            ;AS PART OF SAME EDIT SPECIFICATION.
;
SET_EDIT_180
               MOVE.L  (A2)+,POT_CHANGE_VEC ;SET VECTOR FOR RESPONDING TO CHANGES ON DATA SLIDER.
               BRA     SET_EDIT_10          ;SEE IF YET ANOTHER EDIT SPEC FOLLOWS.
SET_EDIT_200
               SF      KEYPAD_ENABLE        ;DISABLE DATA ENTRY VIA DECIMAL KEYPAD.
               BRA     SET_EDIT_10          ;SEE IF YET ANOTHER EDIT SPEC FOLLOWS.
SET_EDIT_280
               MOVE    (A2)+,PARAM_LO_LIM   ;SET FIXED LOWER LIMIT FOR PARAMETER EDIT.
               BRA     SET_EDIT_10          ;SEE IF YET ANOTHER EDIT SPEC FOLLOWS.
SET_EDIT_300
               MOVE    (A2)+,PARAM_HI_LIM   ;SET FIXED UPPER LIMIT FOR PARAMETER EDIT.
               BRA     SET_EDIT_10          ;SEE IF YET ANOTHER EDIT SPEC FOLLOWS.
SET_EDIT_380
               MOVE.L  (A2)+,INCREMENT_VEC  ;SET VECTOR FOR RESPONSE TO INCREMENT SWITCH.
               BRA     SET_EDIT_10          ;SEE IF YET ANOTHER EDIT SPEC FOLLOWS.
SET_EDIT_400
               MOVE.L  (A2)+,DECREMENT_VEC  ;SET VECTOR FOR RESPONSE TO DECREMENT SWITCH.
               BRA     SET_EDIT_10          ;SEE IF YET ANOTHER EDIT SPEC FOLLOWS.
SET_EDIT_480
               MOVE.L  (A2)+,ENTER_VEC      ;SET VECTOR FOR RESPONSE TO ENTER SWITCH.
               BRA     SET_EDIT_10          ;SEE IF YET ANOTHER EDIT SPEC FOLLOWS.
SET_EDIT_500
               MOVE.L  (A2)+,CURSOR_RGT_VEC ;SET VECTOR FOR RESPONSE TO CURSOR-RIGHT SWITCH.
               BRA     SET_EDIT_10          ;SEE IF YET ANOTHER EDIT SPEC FOLLOWS.
SET_EDIT_580
               MOVE.L  (A2)+,CURSOR_LFT_VEC ;SET VECTOR FOR RESPONSE TO CURSOR-LEFT SWITCH.
               BRA     SET_EDIT_10          ;SEE IF YET ANOTHER EDIT SPEC FOLLOWS.
SET_EDIT_600
               ST      LINKED_PARAM         ;FLAG LINKAGE OF OTHER FIELD(S) TO THIS FIELD.
               BRA     SET_EDIT_10          ;SEE IF YET ANOTHER EDIT SPEC FOLLOWS.
SET_EDIT_680
               MOVE.L  (A2)+,EDIT_VEC       ;SET VECTOR FOR ROUTINE TO BE EXECUTED UPON EACH EDIT.
               BRA     SET_EDIT_10          ;SEE IF YET ANOTHER EDIT SPEC FOLLOWS.
SET_EDIT_700
               MOVE.L  (A2)+,A0             ;VECTOR TO ROUTINE FOR CUSTOMIZING EDIT SETUP.
               JSR     (A0)
               BRA     SET_EDIT_10          ;SEE IF YET ANOTHER EDIT SPEC FOLLOWS.
;
SET_EDIT_1000
               TST.B   NO_POT_CLEAR         ;ARE WE IN THE MIDDLE OF A LINKED-FIELD EDIT REDISPLAY?
               BNE.S   SET_EDIT_1010        ;BRANCH IF YES - DON'T RECONFIGURE DATA SLIDER,
                                            ;DON'T SQUELCH DATA SLIDER CHANGES.
                                            ;ELSE, WE ARE ENTERING A NEW FIELD AND/OR SUBFUNCTION -
               BSR.S   AUTORANGE_DATA_POT   ;SET POT_DIVISIONS, POT_MULTIPLIER PER PARAM LIMITS.
               ABS_LONG
               JSR     PROCESS_DATA_POT     ;REGROOVE THE VARIABLES AROUND THE DATA POT TO PREVENT
               ABS_SHORT
                                            ;SPONTANEOUS PARAMETER EDITS CAUSED BY NEW POT SCALING.
SET_EDIT_1010
               SF      NO_POT_CLEAR         ;ACK-ACK (HA-HA) - FLAG SET BY STORE_PARAMETER ON EDIT.
               CLR     D0                   ;SET Z FLAG TO INDICATE SUCCESSFUL EDIT INSTALLATION.
               BRA.S   SET_EDIT_3000        ;BEGONE.
;
SET_EDIT_2000
               BSR.S   UNPLUG_ALL_EDITS     ;NO-EDIT FIELD - DISCONNECT ALL EDIT PATHWAYS.
               MOVEQ   #1,D0                ;CLEAR Z FLAG TO INDICATE NO-EDIT FIELD ENCOUNTERED.
;
SET_EDIT_3000
               MOVEM.L (A7)+,D0/A0-A2
SET_EDIT_EXIT
               RTS
;
;**************************************************************************************************
;
; DISCONNECT ALL EDIT PATHWAYS -
; NOTE - THIS DOES NOT INCLUDE CURSOR-BUTTON VECTORS !!!!!!
; PRESERVES ALL REGISTERS.
;
UNPLUG_ALL_EDITS
               MOVE.L  A0,-(A7)
               MOVE    #NOTHINGNESS,A0      ;SET NULL VECTOR FOR ALL EDIT VECTORS.
               MOVE.L  A0,POT_CHANGE_VEC
               MOVE.L  A0,INCREMENT_VEC
               MOVE.L  A0,DECREMENT_VEC
               MOVE.L  A0,ENTER_VEC
               MOVE.L  A0,EDIT_VEC
;
;26JUL               MOVE.L  A0,CURSOR_RGT_VEC   ;AHH-UMMM, THINK WE MIGHT STILL WANT THESE ....
;26JUL               MOVE.L  A0,CURSOR_LFT_VEC   ;FOR EXAMPLE, WE USE THIS ROUTINE TO DISABLE
                                                 ;EDITING OF SUSTAIN PITCH-TRACK AMOUNT WHEN
                                                 ;SUSTAIN IS UNDER GATE CONTROL - BUT WE STILL NEED
                                                 ;TO BE ABLE TO SCROLL TO OTHER FIELDS ....
;
               SF      KEYPAD_ENABLE        ;DISABLE DECIMAL KEYPAD,
               SF      GUIDO_IS_AWAKE       ;ABORT ANY KEYPAD ENTRY IN PROGRESS.
               SF      BUILD_KIT_FLAG       ;BLOCK KIT/BANK SWITCH OR MIDI PRESET CHANGE FROM
                                            ;CAUSING REDISPLAY OR OTHER ACTION.
                                            ;YEAH - THERE'S STILL PADS, MIDI .... LATER ....
               MOVE.L  (A7)+,A0
               RTS
;
;**************************************************************************************************
;
; SET POT_DIVISIONS, POT_MULTIPLIER PER PARAMETER LIMITS IN EFFECT -
; DESTROYS D0, A0.
;
AUTORANGE_DATA_POT
                                            ;COMPUTE PARAMETER RANGE -
               BTST    #1,PARAM_SIZE        ;BYTE/WORD OR LONG PARAM?
               BNE.S   AUTOPOT_10           ;BRANCH IF LONG PARAMETER.
               MOVE    PARAM_HI_LIM,A0      ;ELSE, COMPUTE WORD RANGE.
               SUB     PARAM_LO_LIM,A0
               BRA.S   AUTOPOT_20           ;USE RANGE TO SET DIVIDE VALUE.
AUTOPOT_10
               MOVE.L  PARAM_HI_LIM,A0      ;COMPUTE LONG RANGE.
               SUB.L   PARAM_LO_LIM,A0
AUTOPOT_20
               ADDQ    #1,A0                ;A0 = RANGE-1, ADD 1 TO GET ACTUAL RANGE.
               CMP     #256,A0              ;RANGE GREATER THAN 256?
               BLE.S   AUTOPOT_30           ;BRANCH IF RANGE NOT GREATER THAN 256 -
                                            ;SET POT_DIVIDE = RANGE.
               MOVE    #256,POT_DIVISIONS   ;ELSE SET POT_DIVISIONS FOR MAX NUMBER OF DIVISIONS.
               BRA.S   AUTOPOT_40           ;GO SET POT_MULTIPLIER.
AUTOPOT_30
               MOVE    A0,POT_DIVISIONS
;
AUTOPOT_40
                                            ;NOW SET POT_MULTIPLIER -
               CMP     #256,A0              ;IS PARAMETER RANGE 256 OR LESS?
               BGT.S   AUTOPOT_50           ;BRANCH IF NOT - MUST COMPUTE MULTIPLIER.
               MOVE.L  #00010000H,A0        ;ELSE, SET MULTIPLIER = 1 (INTEGER/FRACTION FORMAT) -
                                            ;POT WILL ADJUST THROUGH PARAMETER RANGE IN STEPS OF 1.
               BRA.S   AUTOPOT_60
AUTOPOT_50
               MOVE.L  A0,D0                ;COMPUTE MULTIPLIER - COPY PARAMETER RANGE,
               LSL.L   #8,D0                ;COMPUTE APPROXIMATE VALUE FOR (PARAMETER RANGE/255)
               ADD.L   D0,A0                ;IN INTEGER WORD / FRACTION WORD FORMAT -
               SWAP    D0                   ;MAX'ED POT WILL SCALE BACK UP TO FULL RANGE.
               ADD     D0,A0                ;(NOTE - RANGE MUST BE POSITIVE, < 00800000H).
;
AUTOPOT_60
               MOVE.L  A0,POT_MULTIPLIER
AUTOPOT_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; DEFAULT DATA POT EDIT ROUTINE - BYTE OR WORD PARAMETERS ONLY.
; DIVIDED_POT IS SCALED BY POT_MULTIPLIER, THEN OFFSET BY PARAM_LO_LIM
; TO ARRIVE AT NEW PARAMETER VALUE.
; NO LIMIT CHECKING IS DONE - RESULT IS IMPLICITLY WITHIN LIMITS.
; I-SERVES ALL REGGAE-STARS.
;
ADJ_PARAMETER
               MOVEM.L D0/A0,-(A7)
               MOVE    DIVIDED_POT,D0       ;FETCH DIVIDED-DOWN DATA POT VALUE.
               MULU    POT_MULTIPLIER,D0    ;SCALE IT BY INTEGER PORTION OF POT_MULTIPLIER.
               MOVE.L  D0,PARAM_BUFFER      ;SAVE LONG PARTIAL RESULT.
               MOVE    DIVIDED_POT,D0       ;FETCH DATA POT VALUE AGAIN,
               MULU    POT_MULTIPLIER+2,D0  ;SCALE IT BY FRACTION PORTION OF MULTIPLIER -
                                            ;THIS IS THE FRACTIONAL PARTIAL PRODUCT, SO THE INTEGER
                                            ;PORTION IS THE UPPER HALF OF D0 -
               CLR     D0                   ;WIPE OUT THE FRACTIONAL GARBAGE,
               SWAP    D0                   ;MAKE LONG-WORD OUT OF INTEGER PORTION.
               ADD.L   PARAM_BUFFER,D0      ;COMPLETE LONG SCALING RESULT IN D0.
               BTST    #1,PARAM_SIZE        ;IS THIS A LONG PARAMETER?
               BNE.S   ADJ_PRM_20           ;BRANCH IF YES - DO LONG OFFSET AND SAVE.
               ADD     PARAM_LO_LIM,D0      ;ELSE DO WORD OFFSET, SAVE.
               MOVE    D0,PARAM_BUFFER
               BRA.S   ADJ_PRM_30
ADJ_PRM_20
               ADD.L   PARAM_LO_LIM,D0
               MOVE.L  D0,PARAM_BUFFER
ADJ_PRM_30
               BSR     STORE_PARAMETER      ;STORE THE NEW PARAM VALUE, SET A FLAG FOR REDISPLAY.
;
               MOVEM.L (A7)+,D0/A0
ADJ_PRM_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; DEFAULT PARAMETER INCREMENT/DECREMENT ROUTINES -
; PARAMETER VALUES AND LIMITS TREATED AS SIGNED QUANTITIES.
; UNIT STEP, COMPARE AGAINST LIMITS, STORE NEW VALUE, REQUEST REDISPLAY.
; ALL REGITITSTERS PRE-SERVED.
;
INCR_PARAMETER
               MOVEM.L D0/A0,-(A7)
               BTST    #1,PARAM_SIZE
               BNE.S   INC_PRM_10           ;BRANCH IF LONG-WORD PARAMETER.
               MOVE    PARAM_BUFFER,D0      ;ELSE, DO WORD INCREMENT (COVERS BYTE PARAMS ALSO).
               ADDQ    #1,D0
               BRA.S   INC_DEC_10           ;GO DO WORD-SIZE LIMITS CHECK.
INC_PRM_10
               MOVE.L  PARAM_BUFFER,D0      ;DO LONG-WORD INCREMENT.
               ADDQ.L  #1,D0
               BRA.S   INC_DEC_20           ;GO DO LONG-WORD LIMITS CHECK.
;
;
DECR_PARAMETER
               MOVEM.L D0/A0,-(A7)
               BTST    #1,PARAM_SIZE
               BNE.S   DEC_PRM_10           ;BRANCH IF LONG-WORD PARAMETER.
               MOVE    PARAM_BUFFER,D0      ;ELSE, DO WORD DECREMENT (COVERS BYTE PARAMS ALSO).
               SUBQ    #1,D0
               BRA.S   INC_DEC_10           ;GO DO WORD-SIZE LIMITS CHECK.
DEC_PRM_10
               MOVE.L  PARAM_BUFFER,D0      ;DO LONG-WORD DECREMENT.
               SUBQ.L  #1,D0
               BRA.S   INC_DEC_20           ;GO DO LONG-WORD LIMITS CHECK.
;
;
INC_DEC_10
               BSR.S   LIMIT_WORD_PARAM     ;CHECK BYTE/WORD PARAM AGAINST LIMITS, STORE NEW VALUE.
               BRA.S   INC_DEC_30
INC_DEC_20
               BSR.S   LIMIT_LONG_PARAM     ;CHECK LONG PARAM AGAINST LIMITS, STORE NEW VALUE.
INC_DEC_30
               MOVEM.L (A7)+,D0/A0
INC_DEC_EXIT
               RTS
;
;
;
; CHECK BYTE/WORD PARAMETER VALUE IN D0 AGAINST LIMITS, STORE NEW VALUE -
; DESTROYS D0, A0.
;
LIMIT_WORD_PARAM
               CMP     PARAM_LO_LIM,D0      ;CHECK BYTE/WORD PARAM AGAINST LIMITS, FIX IF OUTSIDE.
               BGE.S   LIM_WRD_20
               MOVE    PARAM_LO_LIM,D0
LIM_WRD_20
               CMP     PARAM_HI_LIM,D0
               BLE.S   LIM_WRD_30
               MOVE    PARAM_HI_LIM,D0
LIM_WRD_30
               MOVE    D0,PARAM_BUFFER      ;STASH UPDATED VALUE IN PARAM_BUFFER.
               BSR.S   STORE_PARAMETER      ;STORE THE NEW PARAMETER VALUE, SET FLAG FOR REDISPLAY.
               RTS
;
;
; CHECK LONG-WORD PARAMETER VALUE IN D0 AGAINST LIMITS, STORE NEW VALUE -
; DESTROYS D0, A0.
;
LIMIT_LONG_PARAM
               CMP.L   PARAM_LO_LIM,D0      ;CHECK LONG-WORD PARAM AGAINST LIMITS, FIX IF OUTSIDE.
               BGE.S   LIM_LNG_20
               MOVE.L  PARAM_LO_LIM,D0
LIM_LNG_20
               CMP.L   PARAM_HI_LIM,D0
               BLE.S   LIM_LNG_30
               MOVE.L  PARAM_HI_LIM,D0
LIM_LNG_30
               MOVE.L  D0,PARAM_BUFFER      ;STASH UPDATED VALUE IN PARAM_BUFFER.
               BSR.S   STORE_PARAMETER      ;STORE THE NEW PARAMETER VALUE, SET FLAG FOR REDISPLAY.
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; STORE PARAMETER VALUE FROM PARAM_BUFFER -
; LOCATION/DATA TYPE INDICATED BY PARAM_POINTER/PARAM_SIZE RESPECTIVELY.
;
; REQUEST REDISPLAY OF CURRENT EDIT FIELD (OR REINSTALLATION OF SUBFUN,
; IF THE LINKED_PARAM SWITCH IS SET - NOTE THAT WHEN THIS OCCURS,
; THE NO_POT_CLEAR FLAG IS SET TO BLOCK REGROOVING OF THE DATA SLIDER -
; THIS PREVENTS DATA SLIDER CHANGES WHICH OCCUR PRIOR TO NEXT SUBFUNCTION
; REINSTALLATION FROM BEING MISTAKEN FOR NEW STATUS QUO, WHICH WOULD
; RESULT IN THEIR BEING MISSED - E.G., WHEN MOVING SLIDER RAPIDLY).
;
; IMMEDIATELY FOLLOWING PARRAMETER STORE, EXECUTES (EDIT_VEC) VECTOR.
;
; DESTROYS D0, A0.
;
STORE_PARAMETER
               MOVE.L  PARAM_POINTER,A0     ;FETCH POINTER TO STORE UPDATED PARAMETER VALUE,
               TST.B   PARAM_SIZE           ;CHECK PARAMETER SIZE FOR STORE -
               BEQ.S   STO_PRM_10           ;BRANCH IF BYTE, DO BYTE STORE.
               BTST    #0,PARAM_SIZE        ;WORD OR LONG - BUT WHICH?
               BNE.S   STO_PRM_20           ;WORD - GO DO WORD STORE.
               MOVE.L  PARAM_BUFFER,(A0)    ;DO LONG-WORD STORE.
               BRA.S   STO_PRM_30
STO_PRM_10
               MOVE.B  PARAM_BUFFER+1,(A0)  ;DO BYTE STORE.
               BRA.S   STO_PRM_30
STO_PRM_20
               MOVE    PARAM_BUFFER,(A0)    ;DO WORD STORE.
STO_PRM_30
               MOVE.L  EDIT_VEC,A0          ;SINCE WE HAVE STORED A PRESUMABLY NEW SETTING,
               JSR     (A0)                 ;IT'S TIME TO TAKE ANY SPECIAL ACTION WHICH SHOULD
                                            ;GO ALONG WITH A NEW SETTING FOR THE CURRENT PARAMETER.
;
               TST.B   LINKED_PARAM         ;DOES SETTING IN THIS FIELD AFFECT SETTINGS
                                            ;IN ANY OTHER FIELD(S) IN SAME SCREEN?
               BNE.S   STO_PRM_40           ;BRANCH IF YES, REINSTALL SUBFUNCTION FROM SCRATCH.
                                            ;(Yeah, yeah, I know - fuck you.)
               ST      REDISP_FIELD         ;ELSE, REDISPLAY CURRENT FIELD ONLY.
               BRA.S   STO_PRM_EXIT
STO_PRM_40
               ST      SUBFUN_INSTALL       ;OTHER FIELD(S) LINKED TO THIS ONE, REDISPLAY 'EM ALL -
               ST      NO_POT_CLEAR         ;BUT, DON'T SQUELCH DATA POT CHANGES -
                                            ;IT MAY WELL BE CHANGING WHILE THIS IS HAPPENING
                                            ;(E.G., IF EDIT WAS DONE BY SLIDER).
STO_PRM_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
;
;
;
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; SCROLL TO NEXT OR PREVIOUS EDITABLE FIELD IN SCREEN -
; PARAMETER ACCESS, DISPLAY AND EDIT HOOKS ARE INSTALLED.
; DESTROYS D0.
;
GO_TO_NEXT_FIELD
               MOVEQ   #1,D0
               BRA.S   GO_TO_FIELD
GO_TO_PREV_FIELD
               MOVEQ   #-1,D0
GO_TO_FIELD
               MOVE    D0,FLD_INDEX_STEP    ;INDICATE SCROLL DIRECTION IN CASE INSTALL_EDIT_FIELD
                                            ;HAS TO SKIP OVER NO-EDIT FIELD(S).
               ADD     D0,CUR_FLD_INDEX     ;SET INITIAL TARGET INDEX FOR NEW FIELD.
               CLR     INST_TSK_INDEX       ;START WITH FIRST STEP ....
               ST      INST_EDIT_FLAG       ;IN INSTALL_EDIT_FIELD.
               MOVE    #-1,STOP_FLD_INDEX   ;THIS LETS INSTALL_EDIT_FIELD KNOW THAT IT HAS NOT YET
                                            ;TRIED TO INSTALL AN EDIT FIELD, SO THAT IT CAN RECORD
                                            ;THE FIELD INDEX OF ITS FIRST INSTALL ATTEMPT AND EXIT
                                            ;IF IT SEES THE SAME FIELD INDEX A SECOND TIME.
GO_TO_FIELD_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
