               INCLUDE HPFIXUPS
               TITLE "SEQCHASER"
***************************************************************************************************
***************************************************************************************************
***                                                                                             ***
***            SEQCHASER - SEQUENCE CHASE-PLAY PARSING SUBROUTINE                               ***
***                                                                                             ***
***************************************************************************************************
***************************************************************************************************
;
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 SEQDEFS         ;SEQUENCER CONSTANT DEFINITIONS.
;
               GLB     CHASE_CLICK
;
               EXTERNAL  START_ACC_RIT,UPDATE_ACC_RIT
               EXTERNAL  SEQ1_DSTR_READ
               EXTERNAL  LOG_IN_OLD_PAD
               EXTERNAL  LOG_OUT_OLD_PAD
               EXTERNAL  LOG_IN_OLD_MIDI
               EXTERNAL  LOG_OUT_OLD_MIDI
               EXTERNAL  TAP_TIME_OFFSET
               EXTERNAL  SEQ_NDSTR_READ
               EXTERNAL  REPEAT_SNAPSHOT,REPEAT_REPLAY
               EXTERNAL  SEQ_END_HANDLER
               EXTERNAL  BAR_MARKER_HANDLER
               EXTERNAL  CHECK_FOR_A_R_MARK
               EXTERNAL  SEQ1_RMW_EATER
               EXTERNAL  SEQ_WRITE
;
               EXTERNAL  NOW_BEAT
               EXTERNAL  CLICKS_THIS_DENOM
               EXTERNAL  PROCESSED_TAP
               EXTERNAL  WROTE_NEW_TIME
               EXTERNAL  OVERALL_CLICK
               EXTERNAL  HOLDING_EVENT,NEXT_EVENT_TIME
               EXTERNAL  SEQ_WR_PTR
               EXTERNAL  SEQ1_DRD_PTR
               EXTERNAL  SEQ_NDRD_PTR
               EXTERNAL  READY_TO_RPT
               EXTERNAL  NOW_REPEATING
               EXTERNAL  REPEAT_START
               EXTERNAL  REPEAT_END
               EXTERNAL  REPEAT_COUNT
               EXTERNAL  NOW_BAR
               EXTERNAL  XPORT_STATE
               EXTERNAL  NOW_PHASE
               EXTERNAL  PHASE_LEN
               EXTERNAL  NOW_CLICK
               EXTERNAL  CLICKS_THIS_BAR
               EXTERNAL  MA_SEQ_ADVANCE
               EXTERNAL  MB_SEQ_ADVANCE
               EXTERNAL  NOW_MET_COUNT
               EXTERNAL  MET_COUNT_DOWN
               EXTERNAL  PLAYED_TO_END
               EXTERNAL  RECORD_LOOPING
               EXTERNAL  USER_PUNCHED
               EXTERNAL  NOW_LAST_BAR
;
               TITLE   "SEQUENCE CHASE-PLAY CLICK PARSING - WHAT DOES IT MEAN?"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; WHAT IS THE MEANING OF ALL THIS?   I WILL TELL YOU.
;
; IN RESPONSE TO EITHER AN INCOMING MIDI SONG-POSITION POINTER OR A
; COMMAND FROM THE 6803 TELLING US TO CATCH UP TO THE INCOMING SMPTE
; TIME, WE ARE FACED WITH THE NEED TO POSITION OURSELVES TO A CERTAIN
; POINT SOMEWHERE IN THE MIDDLE OF A SEQUENCE, IN PREPARATION TO START
; PLAYING FROM THAT POINT.
; STUDENTS OF THE 440 SEQUENCE DATA FORMAT ALREADY KNOW THAT IT CAN ONLY
; BE UNDERSTOOD BY GOING FORWARD FROM THE VERY BEGINNING (OR ANY OTHER
; KNOWN POINT - AS LONG AS YOU'RE NOT ALREADY PAST WHERE YOU'RE TRYING
; TO GET TO) .... BEING A STRING OF TAGGED EVENTS, THE ONLY WAY TO FIND
; A CERTAIN POINT IN THE SEQUENCE IS TO READ THROUGH EVERY EVENT UNTIL
; YOU GET THERE.
; IN ADDITION, WE AFFORD USERS THE DELUXE FEATURE OF LOGGING ALL NOTE-
; EVENT ACTIVITY SO THAT NOTES WHICH ARE SUPPOSED TO BE GATED ON AT THE
; CUE TARGET POINT CAN BE TURNED ON FOR REAL ONCE WE START PLAYING FROM
; THERE - WHICH ALSO REQUIRES GOING THROUGH ALL EVENTS FROM THE START.
;
; SO - WE COME HERE TO GET THROUGH JUST ONE MEEZLY LITTLE CLICK OUT OF
; ALL O' THEM CLICKS.
; THE EXACT SYSTEM FOR DECIDING TO CALL HERE IS DIFFERENT FOR SPP CUEING
; THAN FOR SMPTE CHASE, BUT THE BASIC IDEA IS THE SAME -
; WE MIMIC TO THE BIT ALL OF THE ACTIONS PERFORMED BY PRO_CLICK DURING
; THE PROCESSING OF A SINGLE CLICK FOR ACTUAL PLAYBACK, MAINTAINING AN
; AWARENESS OF OUR WHEREABOUTS AND OF CURRENT NOTE-ON STATUS, TEMPO,
; METRONOME COUNT, PHASE VECTOR, ETC. -
; HOWEVER, WE DO NOT TRANSMIT ANYTHING TO ANYONE, BUT JUST KEEP IT ALL
; TO OURSELVES UNTIL WE GET TO WHERE WE'RE GOING.
; (AS A DETAIL NOTE - WE DON'T ACTUALLY EXECUTE PHASE VECTORS, AS THIS
; WOULD MORE OR LESS JUST WASTE TIME - WE JUST KEEP TRACK OF SEQUENCING
; OF THESE VECTORS SO WE CAN ROLL RIGHT INTO PLAY IN PROPER FASHION.)
;
; AS A MATTER OF FACT THIS WHOLE MODULE IS NO MORE OR LESS THAN A
; MODIFIED RIP-OFF OF THE MAIN PROCEDURE IN PRO_CLICK - WHICH SHOULD BE
; PAINFULLY (I MEANT THAT) OBVIOUS AS YOU GO THROUGH THE CODE.
; I HAVE MADE IT INTO ITS OWN MODULE PARTLY BECAUSE IT'S BIG ENOUGH,
; BUT ALSO BECAUSE - LET'S FACE IT - IT'S SO CLOSE TO BEING IDENTICAL TO
; PRO_CLICK THAT IT'S IMPOSSIBLE TO INGORE THE IDEA OF ULTIMATELY GOING
; AHEAD AND IMPLEMENTING THE CHASE MODE DIRECTLY IN PRO_CLICK ITSELF -
; AT WHICH POINT WE SIMPLY DO AWAY WITH THIS MODULE ALTOGETHER ....
; THUS I SPENT NO TIME TRYING TO PRETTY-UP THE SOURCE - NO REGRETS.
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "SPP-CUE / SMPTE-CHASE SINGLE CLICK PARSE - ENTRY"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; CHASE-PLAY THROUGH ONE CLICK IN SEQUENCE -
; AS WE DISCUSSED ABOVE.  WHAT MORE NEED BE SAID?
; EXCEPT POSSIBLY THAT, BEING AS WE ARE CALLED PERIODICALLY OUT OF THE
; BACKGROUND, WE MAKE NO ASSUMPTIONS REGARDING REGISTER CONTENTS UPON
; ENTRY, NOR REGARDING RESTORATION OF REGISTERS WHEN WE LEAVE.
;
; OUR RETURN CONVENTION (FOR WHICH WE ARE NOT DIRECTLY RESPONSIBLE):
; CUED_PAST_END(.B) IS SET IF WE HAVE CUED TO THE END OF THE SEQUENCE
; (OR SONG, IF IN SONG MODE) - ELSE, IT STAYS = 0, MEANING WE SHOULD
; FEEL AT LIBERTY TO CONTINUE CHASE-PLAYING IF IT DOES PLEASE US.
;
;
CHASE_CLICK
;
               BSR     MET_HANDLER          ;PUMP THE METRONOME ALONG.
;
               MOVE.L  SEQ_WR_PTR,A6        ;SET UP ADDRESS POINTERS FOR VARIOUS READ/WRITE SUBS
               MOVE.L  SEQ1_DRD_PTR,A5
               MOVE.L  SEQ_NDRD_PTR,A4
;11JUN               MOVE.L  WASTE_WR_PTR,A3
;                    DON'T BOTHER EXECUTING PHASE VECS - EATS TIME!
;
               TST     HOLDING_EVENT        ;ARE WE AT THE VERY BEGINNING OF THE SEQUENCE?
               BNE.S   EXEC_PHASE_VEC       ;IF NOT, BUSINESS AS USUAL -
;
                                            ;ELSE, FALL THROUGH:
                                            ;READ FIRST BAR-MARKER, HAND-EXECUTE
                                            ;A RECORDING PHASE SO AS TO COPY EVENTS HIT
                                            ;'FORE WE STARTED, AND TO COPY THE FIRST
                                            ;CLICK'S EVENTS TO THE PROPER PLACE.  THEN,
                                            ;JUMP STRAIGHT TO NORM_PRE_FETCH, PROCESS THE
                                            ;FIRST CLICK'S EVENTS, BOOT THEM OUT THE DOOR,
                                            ;AND START PRE-FETCHING THE NEXT CLICK.
;
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "SPP-CUE / SMPTE-CHASE SPECIAL PATH FOR BEGINNING OF SEQUENCE"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; PLAYING FIRST CLICK IN A SEQUENCE -
; WE FELL IN FROM ABOVE ......
;
               CMP     #1,NOW_BAR           ;IF WE ARE NOT ON BAR ONE (ie. FF, CUE, ETC.), DON'T
               BNE.S   NOT_HERE_DAD         ;BOTHER CHECKING FOR PLAYBACK LOOP START ON BAR 1.
                                            ;WE BE ON BAR 1, HEY -
               CMP     #1,REPEAT_START      ;ARE WE SET TO START REPEAT LOOP ON BAR 1?
               BNE.S   NOT_HERE_DAD         ;BRANCH IF NOT -
               BTST    #0,XPORT_STATE       ;YES, BUT ARE WE LOOKING AT ERASE MODE?
               BNE.S   NOT_HERE_DAD         ;BRANCH IF YES, CAN'T GO LOOPING IN SUCH A CASE.
               BTST    #1,XPORT_STATE       ;SAME IS TRUE IF WE'RE LOOKING AT RECORD MODE.
               BNE.S   NOT_HERE_DAD
                                            ;ELSE - FREEZE-FRAME SEQUENCER STATUS AT THIS POINT,
               BSR     REPEAT_SNAPSHOT      ;SO THAT WE CAN RETURN TO IT FOR REPEATS -
                                            ;THIS PUTS US IN READY_TO_RPT STATE.
                                            ;AT THE RISK OF "REPEATING" MYSELF (SORRY!) - THE CALL
                                            ;TO REPEAT_SNAPSHOT MUST BE DONE BEFORE WE COPY ANY
                                            ;PART OF THE BAR-MARKER OVER TO WRITE BLOCK, SO THAT IT
                                            ;IS POSSIBLE TO SAVE THE ADDRESS AT WHICH IT WILL BE
                                            ;WRITTEN, AND REPEAT_REPLAY CAN FIND IT AGAIN LATER -
                                            ;AFTER COPY-OVER, WE CANNOT EASILY DETERMINE WHERE THE
                                            ;DAMN THING WENT.
;
NOT_HERE_DAD
               BSR     SEQ1_DSTR_READ       ;READ FIRST WORD - know IT IS A BAR MARKER.
               BSR     SEQ_WRITE            ;COPY IT OVER TO THE SEQUENCE WRITE BLOCK.
               SWAP    D7                   ;SWAP FIRST WORD OFF TO THE OTHER END.
               BSR     SEQ1_DSTR_READ       ;READ SECOND WORD (BAR NUMBER),
               BSR     SEQ_WRITE            ;COPY IT OVER LIKEWISE.
               ST      WROTE_NEW_TIME       ;TELL PHASE VECTORS WE'VE WRITTEN TIME FOR THIS CLICK.
;
               BSR     BAR_MARKER_HANDLER   ;PROCESS THE BAR MARKER - SET NOW_BAR, CLEAR NOW_CLICK,
                                            ;SET CLICKS_THIS_BAR AND OTHER TIME-SIGNATURE-RELATED
                                            ;STUFF, RE-SYNC PHASE VECTORS AND METRONOME COUNT.
;
               BSR     CHECK_FOR_A_R_MARK   ;A-R MARKER (IF ANY) IMMEDIATELY FOLLOWS BAR-MARKER:
                                            ;IF ONE IS THERE, COPY IT OVER AND START IT UP.
;
;11JUN               MOVE    NOW_PHASE,D0         ;FIRST-CLICK PHASE EXECUTION
;11JUN               LSL     #2,D0                ;GET CORRECT STEP OUT OF TABLE
;11JUN               MOVE.L  PHASE_LIST,A0        ; (PHASE_LIST HOLDS ADDRESS OF CORRECT TABLE)
;11JUN               MOVE.L  0(A0,D0),A0          ;  A0 -> PHASE TO EXECUTE
;11JUN               JSR     (A0)                 ;EXECUTE PHASE
;11JUN                                            ;PHASE EXECUTION SETS UP WRITE VECTORS FOR RECORDING
;11JUN               MOVE.L  OLD_REC_PARSE,A2     ;SET UP WRITE VECTOR FOR EXISTING SEQUENCE EVENTS.
;11JUN;
;11JUN               SF      RECORD_LOOPING       ;STARTING FRESH - KILL FLAG THAT SEZ WE WERE AT THE
;11JUN                                            ; END OF RECORD LOOP (WHETHER IT WAS SET OR NOT - YOU
;11JUN                                            ; THINK BOMBS ASK IF ANYONE'S ALIVE BEFORE EXPLODING?).
;
               BRA     NORM_PREF_LOOP       ;BAR-MARKER (AND A-R MARK, IF ANY) FULLY DISPATCHED -
                                            ;READY TO GO AHEAD AND START FETCHING CURRENT CLICK'S
                                            ;EVENTS - AND WE KNOW WE AREN'T IN REPEAT-LOOP MODE,
                                            ;SO USE THE "NORMAL" VERSION OF THIS.
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "SPP-CUE / SMPTE-CHASE PHASE VECTOR TRACKING, CLICK-COUNT ADVANCE"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; EXECUTE CURRENT PHASE VECTOR, THEN CUE UP THE NEXT ONE IN SEQUENCE -
; WHILE WE'RE AT IT, ADVANCE TIMING CHAIN.
; FOR MORE DETAIL, REFER TO DOCUMENTATION AT START OF FILE.
;
; NOTE - RE-ENTER PRO_CLICK HERE FOR SECOND PART OF
; DOUBLE CLICK-SERVICE AT BEGINNING OF SEQUENCE:
;
EXEC_PHASE_VEC
               MOVE    NOW_PHASE,D0         ;FETCH CURRENT STEP IN PHASE SEQUENCE -
;11JUN               LSL     #2,D0                ;CONVERT IT TO OFFSET INTO PHASE TABLE.
;11JUN               MOVE.L  PHASE_LIST,A0        ;THIS IS A POINTER TO THE TABLE WE'RE CURRENTLY USING -
;11JUN               MOVE.L  0(A0,D0),A0          ;FROM THAT TABLE, FETCH ADDRESS OF PHASE ROUTINE TO
;11JUN                                            ;BE EXECUTED AT THIS POINT IN SEQUENCE.
;11JUN;
;11JUN               LSR     #2,D0                ;PUT STEP NUMBER BACK TOGETHER,
               ADDQ    #1,D0                ;STEP IT UP BY ONE -
               CMP     PHASE_LEN,D0         ;BEYOND THE NUMBER OF STEPS IN CURRENT PHASE TABLE?
               BNE.S   EXEC_PHS_20          ;BRANCH IF NOT, WE'RE COOL -
               CLR     D0                   ;ELSE, WRAP BACK TO BEGINNING OF TABLE.
EXEC_PHS_20
               MOVE    D0,NOW_PHASE         ;SAVE NEW STEP NUMBER,
;11JUN;
;11JUN               JSR     (A0)                 ;EXECUTE PHASE ROUTINE WHOSE ADDRESS WE OBTAINED ABOVE.
;11JUN;
;
               ADDQ    #1,NOW_CLICK         ;INCREMENT THE CLICK-WITHIN-CURRENT BAR VALUE.
                                            ;(REMINDER - THIS IS THE L.S.WORD OF NOW_BAR.L)
               ADDQ.L  #1,OVERALL_CLICK     ;INCREMENT THE CLICKS-FROM-START-OF-PLAY VALUE.
;
                                            ;NOTE - THESE NEW CLICK VALUES CORRESPOND TO
                                            ;THE CLICK WE ARE ABOUT TO PRE-FETCH.
;
;
; FALL THROUGH INTO PRE-FETCH PROCEDURE ....
;
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "SPP-CUE / SMPTE-CHASE CURRENT-CLICK PRE-FETCH TEST/INITIATION"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
;    HOW WE PLAY BACK - PRE-FETCH NEXT CLICK'S WORTH OF INFO.  THIS MEANS GRABBING STUFF FROM SEQUENCER
; LIST, AND STUFFING IT INTO MIDI BUFFERS UNTIL A TIME MARKER OR A BAR MARKER IS HIT.  ONCE SAID
; MARKER IS HIT, SEE WHAT TIME THE STUFF FOLLOWING IT IS SUPPOSED TO HAPPEN, AND SAVE THAT TIME (-1,
; SINCE WANT TO DO IT AS A PRE-FETCH) AS NEXT_EVENT_CLICK (AND FIRST WORD OF MARKER IN HOLDING_EVENT).
; CONTINUE WITH CLICKS, UNTIL NOW_CLICK MATCHES NEXT_EVENT CLICK, AND PRE-FETCH THAT CLICK.
;
;    ADDITIONAL CONSIDERATION - THERE IS A FLAG CALLED 'WROTE_NEW_TIME' - IT EXISTS SO THAT RECORDING
; & PLAYBACK DO NOT PRODUCE IDENTICAL TIME_MARKERS FOR THE SAME CLICK (WOULD CRASH US).  SINCE
; PLAYBACK IS PRE-FETCHED, 'CLICK' STARTS WITH IT AND ENDS JUST BEFORE IT.
;
; Never mind all that ....
;
PRE_FETCH_CHECK
;
               SF      WROTE_NEW_TIME       ;STARTING A NEW CLICK - NO TIME/BAR-MARK WRITTEN YET.
               SF      PROCESSED_TAP        ;LIKEWISE, NO TAP-TEMPO EVENT SEEN YET ON THIS CLICK.
;
               MOVE    NOW_CLICK,D0         ;IS IT ACTUALLY TIME FOR US TO PRE-FETCH YET?
               CMP     NEXT_EVENT_TIME,D0
;15JUN               BNE     END_OF_CLICK         ;BRANCH IF NOT, HEAD FOR END-OF-CLICK CUSTODIAL SHIT.
               BCS     END_OF_CLICK         ;BRANCH IF NOT, HEAD FOR END-OF-CLICK CUSTODIAL SHIT -
                                            ;BUT JUST FOR THE HELL OF IT, IF SOMETHING FUCKED UP
                                            ;AND WE SOMEHOW MANAGED TO MISS OUR PRE-FETCH TIME,
                                            ;LET'S GET A MOVE ON (OTHERWISE WE'LL JUST SIT HERE
                                            ;COUNTING BEATS FOREVER, WAITING FOR A TIME THAT'LL
                                            ;NEVER COME AGAIN ....)
                                            ;IN REALITY, THIS SHOULD SET OFF SOME KIND OF ALARM -
                                            ;IT'S A SERIOUS ERROR CONDITION.
;
;
;
; TIME FOR ANOTHER ROUND OF PRE-FETCH:
;
               MOVE    HOLDING_EVENT,D7     ;RETRIEVE WORD AT WHICH PRE-FETCH ENDED LAST TIME.
               MOVE    D7,D0                ;ISOLATE ITS TYPE - BAR- OR TIME-MARKER - IN D0.
               AND     #0FH,D0
;
               TST.B   NOW_REPEATING        ;ARE WE IN NON-DESTRUCTIVE LOOP PLAYBACK MODE?
               BNE     RPT_PREF_START       ;BRANCH IF YES - THAT'S A DIFFERENT SCENE ....
;
;
;
; WE'RE DOING NORMAL (DESTRUCTIVE READ/WRITE) PLAYBACK:
;
;11JUN               MOVE.L  OLD_REC_PARSE,A2     ;SET UP VECTOR FOR WRITING "OLD" SEQUENCE EVENTS PARSED
;11JUN                                            ;FROM THE SEQUENCE DURING THIS PRE-FETCH.
;11JUN;
               CMP     #8,D0                ;HAVE WE GOT A BAR-MARKER HERE?
               BEQ.S   NORM_BAR_MARK        ;BRANCH IF YES, GOT SOME THINGS TO DO WITH IT.
;
;11JUN               JSR     (A2)                 ;ELSE, TIME-MARKER - JUST COPY IT TO NEW WRITE BLOCK.
               JSR     SEQ_WRITE            ;ELSE, TIME-MARKER - JUST COPY IT TO NEW WRITE BLOCK.
               ST      WROTE_NEW_TIME       ;TELL 'EM THAT A TIME EVENT WAS WRITTEN FOR THIS CLICK,
                                            ;SO PHASE VECTORS WON'T WRITE ANOTHER ON SAME CLICK.
               BRA.S   NORM_PREF_LOOP       ;GO PRE-FETCH THE EVENTS WHICH FOLLOW IT.
;
NORM_BAR_MARK
               SWAP    D7                   ;DAS IST BAR MARKER - SWAP FIRST WORD OUT OF THE WAY,
               BSR     SEQ1_DSTR_READ       ;FETCH SECOND (BAR NUMBER) -
               TST     REPEAT_COUNT         ;IS PLAYBACK LOOP ENABLED (VIA NON-ZERO REPEAT COUNT)?
               BEQ.S   NOT_THE_LOOP         ;BRANCH IF REPEAT_COUNT = 0, NO GONNA LOOP.
;22JUN               BTST    #0,XPORT_STATE       ;IF ERASE OR RECORD ARE ON OR ENABLED FOR PUNCH IN,
;22JUN               BNE.S   NOT_THE_LOOP         ;THEN WE WON'T CONSIDER DOING PLAYBACK LOOPING.
;22JUN               BTST    #1,XPORT_STATE
;22JUN               BNE.S   NOT_THE_LOOP
               MOVE.B  XPORT_STATE,D0       ;IS "ERASE" OR "RECORD" ENABLED?
               AND.B   #RECORD_MASK+ERASE_MASK,D0
               BNE.S   NOT_THE_LOOP         ;BRANCH IF EITHER ENABLED, WE REFUSE TO PLAYBACK-LOOP.
               TST.B   USER_PUNCHED         ;ARE WE IN MANUAL PUNCH-IN MODE (USER MAY AT ANY TIME)?
               BNE.S   NOT_THE_LOOP         ;BRANCH IF YES, LIKEWISE KEEP THINGS OPEN FOR PUNCH-IN.
;
                                            ;IF NONE OF THE ABOVE ....
               TST.B   READY_TO_RPT         ;CONDITION GREEN, HAVE WE PASSED LOOP START POINT?
               BNE.S   SEEK_LOOP_END        ;BRANCH IF YES, WE SEEK THE END OF THE REPEAT LOOP.
               CMP     REPEAT_START,D7      ;SO - IS THIS BAR THE REPEAT LOOP START POINT?
               BNE.S   NOT_THE_LOOP         ;BRANCH IF NOT, KEEP ON IN THIS DESTRUCTIVE FASHION.
               BSR     REPEAT_SNAPSHOT      ;ELSE, DO A SEQUENCER STATUS FREEZE-FRAME AT THIS POINT
                                            ;'CAUSE WE'LL BE COMING BACK HERE WHEN WE HIT LOOP END.
                                            ;AT THE RISK OF "REPEATING" MYSELF (SORRY!) - THE CALL
                                            ;TO REPEAT_SNAPSHOT MUST BE DONE BEFORE WE COPY ANY
                                            ;PART OF THE BAR-MARKER OVER TO WRITE BLOCK, SO THAT IT
                                            ;IS POSSIBLE TO SAVE THE ADDRESS AT WHICH IT WILL BE
                                            ;WRITTEN, AND REPEAT_REPLAY CAN FIND IT AGAIN LATER -
                                            ;AFTER COPY-OVER, WE CANNOT EASILY DETERMINE WHERE THE
                                            ;DAMN THING WENT.
               BRA.S   NOT_THE_LOOP         ;NOW WE'RE READY_TO_RPT, BUT STILL DESTRUCTIVE - GO ON.
;
SEEK_LOOP_END
               SWAP    D7                   ;COPY THE BAR MARKER OVER TO SEQUENCE WRITE BLOCK -
;11JUN               JSR     (A2)                 ;IF IT MARKS OUR LOOP END, WE'LL NEED IT TO BE THERE.
               JSR     SEQ_WRITE            ;IF IT MARKS OUR LOOP END, WE'LL NEED IT TO BE THERE.
               SWAP    D7
;11JUN               JSR     (A2)
               JSR     SEQ_WRITE
               CMP     #1,REPEAT_START      ;SINCE WE'RE HERE, WE MUST BE ENABLED TO REPEAT-LOOP -
               BNE.S   SEEK_END_10          ;BRANCH IF LOOP DOESN'T START AT BAR 1 - SEEK ONWARD.
               MOVE    NOW_LAST_BAR,D0      ;LOOP STARTS AT START - DOES IT END AT END?
               CMP     REPEAT_END,D0        ;WE MUST ASSUME SO, IF REPEAT_END > NOW_LAST_BAR -
               BCS.S   LOOP_EXIT_POINT      ;BRANCH IF SO - IF WE WERE GONNA LOOP ENTIRE SEQUENCE
                                            ;ANYWAY, WE DON'T NEED TO USE NON-DESTRUCTIVE PLAYBACK
                                            ;MODE - BY AVOIDING IT, WE LEAVE THE DOOR OPEN FOR USER
                                            ;TO PUNCH IN AT ANY TIME (SEQ_END_HANDLER IN TRANSPORT
                                            ;WILL PICK UP THE BALL FOR US AT END OF SEQUENCE).
SEEK_END_10
               CMP     REPEAT_END,D7        ;SO - WAS THIS THE REPEAT LOOP END BAR?
               BEQ     RPT_LOOP_START       ;BRANCH IF YES, OFF WE GO INTO NON-DESTRUCTIVE-LAND.
               BRA.S   LOOP_EXIT_POINT      ;ELSE WE ARE STILL IN THE DESTRUCTIVE WAY.
;
NOT_THE_LOOP
               SWAP    D7                   ;COPY THE BAR MARKER OVER TO SEQUENCE WRITE BLOCK -
;11JUN               JSR     (A2)                 ;BEING AS HOW WE'RE NOT GOING INTO SOME WEIRD MODE NOW.
               JSR     SEQ_WRITE            ;BEING AS HOW WE'RE NOT GOING INTO SOME WEIRD MODE NOW.
               SWAP    D7
;11JUN               JSR     (A2)
               JSR     SEQ_WRITE
;
;
;
; THIS IS WHERE WE COME WHEN MAKING THE TRANSITION FROM REPEAT-LOOP
; TO "NORMAL" PLAYBACK MODE:
;
LOOP_EXIT_POINT
               BSR     BAR_MARKER_HANDLER   ;PROCESS THE BAR MARKER - SET NOW_BAR, CLEAR NOW_CLICK,
                                            ;SET CLICKS_THIS_BAR AND OTHER TIME-SIGNATURE-RELATED
                                            ;STUFF, RE-SYNC PHASE VECTORS AND METRONOME COUNT.
               ST      WROTE_NEW_TIME       ;TELL 'EM THAT A TIME EVENT WAS WRITTEN FOR THIS CLICK,
                                            ;SO PHASE VECTORS WON'T WRITE ANOTHER ON SAME CLICK.
               BSR     CHECK_FOR_A_R_MARK   ;A-R MARKER (IF ANY) IMMEDIATELY FOLLOWS BAR-MARKER:
                                            ;IF ONE IS THERE, COPY IT OVER AND START IT UP.
;881025               BRA.S   NORM_PREF_LOOP       ;GO PRE-FETCH THIS CLICK'S EVENTS.
               NOP                          ;FALL THROUGH AND PRE-FETCH INFO FOLLOWING THIS MARKER.
                                            ;THIS IS A PLACE HOLDER FOR THE ABOVE
                                            ;BRA.S WHICH WAS ASSEMBLED AS 'NOP'
                                            ;BY HP64000 - STRICTLY FOR INITIAL
                                            ;LINK MAP MATCH-UP, REMOVE AFTERWARDS.
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "SPP-CUE / SMPTE-CHASE NON-REPEAT PRE-FETCH LOOP"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; LOOP TO PRE-FETCH THE CURRENT CLICK'S EVENTS, "NORMAL" STYLE:
; TIME- OR BAR-MARKER WHICH PRECEDES THEM HAS ALREADY BEEN HANDLED.
; WE BRANCH TO END_OF_CLICK UPON HITTING THE NEXT TIME-MARKER,
; BAR-MARKER, OR END-OF-SEQUENCE MARKER.
;
NORM_PREF_LOOP
               BSR     SEQ1_DSTR_READ       ;GET NEXT WORD
               MOVE    D7,D0                ; ISOLATE TYPE ID
               AND     #0FH,D0
;
;
; MIDI_SYSEX DOES THE ABOVE D0/D7 PREP FOR US -
; BRANCHES HERE INSTEAD OF TO TOP O' LOOP:
;
NORM_PREF_GOT_ID
               LSL     #2,D0                ;  TURN INTO A TABLE OFFSET
               JMP     NORM_BRA_TBL(PC,D0)  ;   HANDLE ACCORDING TO TYPE
;
NORM_BRA_TBL
               BRA.W   NORM_PREF_LOOP       ;TYPE 0 - deleted event - lose
               BRA.W   PAD_ON               ; "   1 - PAD GOING ON
               BRA.W   PAD_OFF              ; "   2 -  "    "   OFF
               BRA.W   MIDI_ON              ; "   3 - MIDI NOTE ON
               BRA.W   MIDI_OFF             ; "   4 -  "    "   OFF
               BRA.W   OTHER_MIDI           ; "   5 - OTHER MIDI EVENT
               BRA.W   MIDI_SYSEX           ; "   6 - MIDI SYSTEM EXCLUSIVE
               BRA.W   NORM_PREF_LOOP       ; "   7 - undefined
               BRA.W   NEW_BAR_MARK         ; "   8 - BAR MARKER
               BRA.W   NEW_TIME_MARK        ; "   9 - TIME MARKER
               BRA.W   NEW_TAP_TIME         ; "  10 - TAP TIME OFFSET
               BRA.W   NORM_PREF_LOOP       ; "  11 - A/R MARKER (HANDLED ALONG WITH BAR-MARKER)
               BRA.W   NEW_UART_TIMING      ; "  12 - UART ADVANCE/DELAY
               BRA.W   NORM_PREF_LOOP       ; "  13 - undefined
               BRA.W   NORM_PREF_LOOP       ; "  14 - undefined
               BRA.W   END_OF_SEQUENCE      ; "  15 - END_OF_SEQUENCE MARKER
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "SPP-CUE / SMPTE-CHASE REPEAT-LOOP CURRENT-CLICK PRE-FETCH INITIATION"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; START PRE-FETCH OF THE CURRENT CLICK'S EVENTS, REPEAT-LOOP STYLE:
; WE COME HERE WITH TIME-MARKER OR FIRST WORD OF BAR-MARKER IN D7
; (OBTAINED FROM HOLDING_EVENT), AND MARKER TYPE ID ISOLATED IN D0.
;
RPT_PREF_START
                                            ;WE'RE IN NON-DESTRUCTIVE LOOP PLAYBACK MODE:
               CMP     #9,D0                ;HAVE WE GOT A TIME MARKER HERE?
               BEQ.S   RPT_PREF_LOOP        ;YES - JUST PRE-FETCH NEXT CLICK.
;
                                            ;ELSE, GOT A BAR MARKER (OR MAYBE A BAR MITZVAH?) -
               SWAP    D7                   ;SWAP FIRST WORD OUT OF THE WAY,
               BSR     SEQ_NDSTR_READ       ;GET 2nd WORD OF MARKER - IT'S THE BAR NUMBER.
               CMP     REPEAT_END,D7        ;HAVE WE HIT THE END OF THE LOOP?
               BNE.S   NOT_NOW_DAD          ;BRANCH IF NOT - KEEP ON IN SAME DIRECTION.
               TST     REPEAT_COUNT         ;YES - ARE WE DOING INFINITE REPEAT?
               BMI.S   RPT_LOOP_AGAIN       ;YOU BET WE ARE, SO LOOP AND LEAVE REPEAT_COUNT ALONE.
               SUBQ    #1,REPEAT_COUNT      ;NO - THIS COULD BE THE LAST TIME ....
               BGT.S   RPT_LOOP_AGAIN       ;WELL, IT'S NOT THE LAST TIME - LOOP AGAIN.
               SF      READY_TO_RPT         ;LAST TIME - KILL LOOPING FLAGS,
               SF      NOW_REPEATING
;11JUN               MOVE.L  OLD_REC_PARSE,A2     ;SET UP VECTOR FOR WRITING "OLD" SEQUENCE EVENTS PARSED
;11JUN                                            ;FROM THE SEQUENCE DURING THIS PRE-FETCH.
               BRA     LOOP_EXIT_POINT      ;PASS BACK INTO DESTRUCTIVE PLAYBACK AT THIS POINT.
;
RPT_LOOP_AGAIN
;
;11JUN               BSR     PLAY_LED_OFF                   ;RESTART OF REPEAT LOOP, NOT THE FIRST TIME:
;11JUN               MOVE    REAL_TIME,PLAY_BLINK_TIMER     ;BLINK THE "PLAY" LED OFF TO SHOW THIS.
;11JUN               BSET    #0,PLAY_BLINK_TIMER+1          ;BACKGROUND WILL TURN IT BACK ON SOON.
;
;
;
; THIS IS WHERE WE COME IN WHEN MAKING THE TRANSITION FROM "NORMAL" TO
; REPEAT-LOOP PLAYBACK MODE:
;
RPT_LOOP_START
               BSR     REPEAT_REPLAY        ;LOOPING AGAIN - REINSTATE LOOP-START SEQUENCER STATE.
NOT_NOW_DAD
               BSR     BAR_MARKER_HANDLER   ;DECODE, FINISH BAR CHORES.
;881025               BRA.S   RPT_PREF_LOOP        ;FALL THROUGH AND PRE-FETCH INFO FOLLOWING THIS MARKER.
               NOP                          ;FALL THROUGH AND PRE-FETCH INFO FOLLOWING THIS MARKER.
                                            ;THIS IS A PLACE HOLDER FOR THE ABOVE
                                            ;BRA.S WHICH WAS ASSEMBLED AS 'NOP'
                                            ;BY HP64000 - STRICTLY FOR INITIAL
                                            ;LINK MAP MATCH-UP, REMOVE AFTERWARDS.
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "SPP-CUE / SMPTE-CHASE REPEAT-LOOP PRE-FETCH LOOP"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; LOOP TO PRE-FETCH THE CURRENT CLICK'S EVENTS, REPEAT-LOOP STYLE:
; TIME-MARKER OR BAR-MARKER WHICH PRECEDS THEM HAS ALREADY BEEN HANDLED.
; WE BRANCH TO END_OF_CLICK UPON HITTING THE NEXT TIME-MARKER,
; BAR-MARKER, OR END-OF-SEQUENCE MARKER - JUST LIKE WE DO IN "NORMAL"
; PLAYBACK, HENCE WE SHARE "NORMAL" PARSING ROUTINES FOR THESE EVENTS.
;
RPT_PREF_LOOP
               BSR     SEQ_NDSTR_READ       ;GET NEXT WORD INTO D7,
               MOVE    D7,D0                ;ISOLATE TYPE ID IN D0.
               AND     #0FH,D0
               LSL     #2,D0                ;TURN INTO A TABLE OFFSET,
               JMP     RPT_BRA_TBL(PC,D0)   ;HANDLE ACCORDING TO TYPE.
;
RPT_BRA_TBL
               BRA.W   RPT_PREF_LOOP        ;TYPE 0 - deleted event - lose
               BRA.W   RPT_PAD_ON           ; "   1 - PAD GOING ON
               BRA.W   RPT_PAD_OFF          ; "   2 -  "    "   OFF
               BRA.W   RPT_MIDI_ON          ; "   3 - MIDI NOTE ON
               BRA.W   RPT_MIDI_OFF         ; "   4 -  "    "   OFF
               BRA.W   RPT_OTHER_MIDI       ; "   5 - OTHER MIDI EVENT
               BRA.W   RPT_MIDI_SYSEX       ; "   6 - MIDI SYSTEM EXCLUSIVE
               BRA.W   RPT_PREF_LOOP        ; "   7 - undefined
               BRA.W   NEW_BAR_MARK         ; "   8 - BAR MARKER
               BRA.W   NEW_TIME_MARK        ; "   9 - TIME MARKER
               BRA.W   RPT_NEW_TAP_TIME     ; "  10 - TAP TIME OFFSET
               BRA.W   RPT_NEW_A_R_MARK     ; "  11 - A/R MARKER
               BRA.W   RPT_NEW_UART_TIMING  ; "  12 - UART ADVANCE/DELAY
               BRA.W   RPT_PREF_LOOP        ; "  13 - undefined
               BRA.W   RPT_PREF_LOOP        ; "  14 - undefined
               BRA.W   END_OF_SEQUENCE      ; "  15 - END_OF_SEQUENCE MARKER
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "SPP-CUE / SMPTE-CHASE NON-REPEAT EVENT PRE-FETCH ACTIONS"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
;             VARIOUS SEQUENCE DATA UNPACKING ROUTINES. TAKE FIRST WORD IN D7, TYPE ID IN D0, AND
;              WHERE TO WRITE IT TO IN A2.  TAKE APROPOS ACTION (SEND OVER MIDI, WRITE, CHANGE TEMPO,
;              ETC.).  ALSO HANDLE TRACK MUTING HEREIN - MEANS WRITING, BUT NOT SENDING OVER MIDI,
;              IF AN EVENT'S TRACK HAS BEEN MUTED.
;
;             HERE'S WHAT EACH EVENT LOOKS LIKE:
;
;             TYPE 0 - undefined - ignore
;
;             TYPE 1 - PAD ON
;              aaa bbbbb c ddd 0001    aaa = PADNUM, bbbbb = SOUNDNUM, c = ALT PARAM, ddd = TRACKNUM
;              0 eeeee fffff ggggg     eeeee = PITCH, fffff = PAN, ggggg = VELOCITY
;              00000000000 hhhhh       hhhhh = LEVEL
;
;             TYPE 2 - PAD OFF
;              aaa bbbbb c ddd 0010    aaa = PADNUM, bbbbb = SOUNDNUM, c = ALT PARAM, ddd = TRACKNUM
;              0 eeeee fffff 00000     eeeee = PITCH, fffff = PAN
;
;             TYPE 3 - MIDI NOTE ON
;              1001 aaaa b ccc 0011    aaaa = CHANNEL, b = UART, ccc = TRACKNUM
;              0 ddddddd 0 eeeeeee     ddddddd = KEYNUM, eeeeeee = VELOCITY
;
;             TYPE 4a - MIDI NOTE OFF
;              1001 aaaa b ccc 0100    aaaa = CHANNEL, b = UART, ccc = TRACKNUM
;              0 ddddddd 00000000      ddddddd = KEYNUM
;
;             TYPE 4b - MIDI NOTE OFF
;              1000 aaaa b ccc 0100    aaaa = CHANNEL, b = UART, ccc = TRACKNUM
;              0 ddddddd 0 eeeeeee     ddddddd = KEYNUM, eeeeeee = VELOCITY
;
;             TYPE 5a - OTHER MIDI
;              aaaa bbbb c ddd 0101    aaaa = STAT BYTE, bbbb = CHANNEL, c = UART, ddd = TRACKNUM
;              0 eeeeeee 0 fffffff     eeeeeee = DATA BYTE #1, fffffff = DATA BYTE # 2
;
;             TYPE 5b - MIDI SYSTEM
;              1111 aaaa b ccc 0101    aaaa = CHANNEL, b = UART, ccc = TRACKNUM
;              0 ddddddd 0 eeeeeee     ddddddd = DATA BYTE #1, eeeeeee = DATA BYTE # 2
;
;             TYPE 6 - MIDI SYSTEM EXCLUSIVE
;              11110000 a bbb 0110     a = UART, bbb = TRACKNUM
;             (0 ccccccc 0 ddddddd)    ccccccc, ddddddd = DATA BYTES x as many as needed
;              0 cdcdcdc 11110111
;
;             TYPE 7 - undefined
;
;             TYPE 8 - BAR MARKER
;              aaaaaaaa 0 bbb 1000     aaaaaaaa = TIME SIG NUMERATOR, bbb = 'RAW' TIME SIG DENOMINATOR
;              cccccccccccccccc        cccccccccccccccc = BAR NUMBER
;
;             TYPE 9 - TIME MARKER
;              aaaaaaaaaaaa 1001       aaaaaaaaaaaa = CLICK NUMBER IN THIS BAR
;
;             TYPE 10 - TAP TIME OFFSET
;              a bbbbbbbbbbb 1010      a = SIGN OF TEMPO OFFSET, bbbbbbbbbbb = REFERNCE TEMPO (BPM*10-40)
;              cccccccccccccccc        cccccccccccccccc = DELTA AGAINST REF TEMPO (IN usec/CLICK)
;
;             TYPE 11 - A/R MARKER
;              00 aaaaaaaaaa 1011      aaaaaaaaaa = # BEATS IT EXTENDS OVER
;              bbbbbbbbbbbbbbbb        bbbbbbbbbbbbbbbb = CHANGE IN BPM*10 (SIGN-EXTENDED)
;
;             TYPE 12 - UART TIMING ADVANCE/DELAY
;              a bbbbb c ddddd 1100     a = 1 = NO CHANGE ON A; bbbbb = +/- msec CHANGE ON UART A
;                                       c = 1 = NO CHANGE ON B; ddddd = +/- msec CHANGE ON UART B
;
;             TYPE 13 - undefinded
;
;             TYPE 14 - undefinded
;
;             TYPE 15 - END OF SEQUENCE
;              0000000000001111
;
;;;;;;;;;;
PAD_ON
;
;11JUN               MOVE    D7,BG_TEMP_1_B       ;SAVE FOR UNPACKING & XMITTING OVER MIDI
;11JUN               TST.B   ERASING              ;ARE WE IN LIVE-ERASE MODE?
;11JUN               BEQ.S   PAD_ON_NO_ERASE      ;BRANCH IF NOT, CONTINUE.
;11JUN               BSR.S   INT_ERASE_TEST       ;ERASING - HOW'S ABOUT THIS EVENT?
;11JUN               BNE.S   ERASE_HIM_FELLA      ;BRANCH IF THIS ONE SHOULD BE ZORCHED.
;11JUN;
;11JUNPAD_ON_NO_ERASE
;
               SWAP    D7                   ; HIDE AWAY UPPER WORD
               BSR     SEQ1_DSTR_READ       ;  GET MIDDLE WORD
;
;11JUN               MOVE    D7,BG_TEMP_3_B       ;   ALSO SAVE FOR UNPACKING & XMITTING OVER MIDI
;
               ABS_LONG
               JSR     LOG_IN_OLD_PAD       ;    SHOVE IN NOTES_CURRENTLY_ON LIST
               ABS_SHORT
               BEQ.S   PAD_ON_BUT_NO_ROOM   ;         IF NO ROOM, THIN OUT BY THROWING AWAY.
               SWAP    D7                   ;              ELSE, WRITE
;11JUN               JSR     (A2)                 ;              (UPPER WORD)
               JSR     SEQ_WRITE            ;              (UPPER WORD)
               SWAP    D7
;11JUN               JSR     (A2)                 ;              (MIDDLE WORD)
               JSR     SEQ_WRITE            ;              (MIDDLE WORD)
               BSR     SEQ1_DSTR_READ       ;               GET LAST WORD
;11JUN               MOVE    D7,BG_TEMP_5_B       ;                SAVE FOR MIDI XMISSION
;11JUN               JSR     (A2)                 ;                 WRITE
               JSR     SEQ_WRITE            ;                 WRITE
;
;*****DO SEQ_FULL CHECK, ACTION
;11JUN               BSR     SEQ_MEM_CHECK
;11JUN;
;11JUN               BSR     TRACK_MUTE_CHECK     ;SEE IF THIS TRACK MUTED - BRANCH TO PLAY_CLICK IF YES.
;11JUN               BNE     NORM_PREF_LOOP       ;    IF MUTED, FORGET PLAYING
;11JUN;15MAY               CMP.B   #0FFH,CLICK_ASSIGN   ;HAS SEQUENCER EATEN ALL VOICES DURING THIS CLICK?
;11JUN;15MAY               BEQ.S   PAD_VOICES_FULL      ;BRANCH IF YES - DON'T BOTHER PLAYING ANY MORE SOUNDS.
;11JUN;15MAY            MAY PUT THIS BACK IN IF SEQUENCER PHASES ARE REARRANGED
;11JUN;15MAY            TO PUT OLD EVENTS BEHIND NEW ONES ON THE AUTOCORRECT CLICK.
;11JUN;
;11JUN               BSR     SEQ_ON_INTERNAL      ;IF NOT, PASS EVENT TO SEQ INTERNAL NOTE-ON HANDLER,
;11JUN;15MAY;
;11JUN;15MAYPAD_VOICES_FULL
;11JUN;15MAY;
;11JUN               ST      SEQ_XMIT_EVENT       ; SET FLAG TO PLOP IN MIDI SEQ BUFFER
;11JUN               BSR     TYPE_1_XMIT          ;  AND XMIT OVER MIDI.
;11JUN;08JUN               BSR     MIDI_PANIC           ;IF ABOUT TO OVERFLOW THE MIDI BUFFERS
;11JUN;08JUN               BNE     END_OF_CLICK         ;    THEN QUIT.  ELSE,
;
               BRA     NORM_PREF_LOOP       ;DEAL WITH NEXT EVENT.
;
;
;11JUNERASE_HIM_FELLA
;11JUN               BSR     SEQ1_DSTR_READ       ;ERASING - EAT SECOND WORD,
;11JUN                                            ;FALL THRU TO EAT THIRD AND GET BACK TO TOP.
;
;
PAD_ON_BUT_NO_ROOM
;
; NOTES-CURRENTLY-ON LIST FULL, OR WE'RE ERASING EVENT AND
; FELL THROUGH FROM ABOVE - EITHER WAY, WE MUST:
;
               BSR     SEQ1_DSTR_READ       ;EAT THE THIRD WORD,
               BRA     NORM_PREF_LOOP       ;DEAL WITH NEXT EVENT.
;
;
;
;11JUN; INTERNAL EVENT ERASE TEST -
;11JUN; HEY, DON'T COME AROUND IF NOT IN AN ERASUAL MODALITY.
;11JUN; D7 (.W) CONTAINS FIRST WORD OF INTERNAL NOTE-ON EVENT,
;11JUN; WHICH IS ALSO ASSUMED TO HAVE BEEN STORED AT BG_TEMP_1_B.
;11JUN; RETURNS Z FLAG FALSE IF EVENT SHOULD BE ERASED.
;11JUN; PRESERVES D7, DESTROYS D0-D1.
;11JUN;
;11JUNINT_ERASE_TEST
;11JUN               MOVE    D7,D0                ;COPY EVENT FIRST WORD.
;11JUN               AND     #0070H,D0            ;FIRST SEE IF EVENT IS ON THE RIGHT TRACK -
;11JUN               LSR     #4,D0
;11JUN               CMP     NOW_TRACK,D0
;11JUN               BEQ.S   INT_ERS_10           ;BRANCH IF TRACK NUMBER MATCHES - DO ERASE TEST.
;11JUN               CLR     D0                   ;ELSE, NO ERASE - RETURN Z FLAG TRUE.
;11JUN               RTS
;11JUNINT_ERS_10
;11JUN               MOVE.B  BG_TEMP_1_B,D0       ;TRACK MATCHES, FETCH EVENT SOUND NUMBER.
;11JUN               TST.B   D7                   ;IS ALT-PARAM BIT SET (IT'S IN BIT 7)?
;11JUN               BMI.S   INT_ERS_30           ;BRANCH IF YES, CHECK IN UPPER HALF OF MAP.
;11JUN               MOVE.L  INT_ERASE_MAP,D1     ;ELSE WE WANT TO LOOK IN LOWER-ADDRESSED HALF OF MAP.
;11JUN               BTST    D0,D1                ;IS OUR BIT SET?  THE Z FLAG TELLS ALL ....
;11JUN               RTS                          ;IF SO, WE WILL REQUEST ERASURE - ELSE WE WON'T.
;11JUNINT_ERS_30
;11JUN               MOVE.L  INT_ERASE_MAP+4,D1   ;FOR ALT-PARAMS BIT SET - USE OTHER HALF OF ERASE MAP.
;11JUN               BTST    D0,D1                ;JUST LIKE ABOVE.
;11JUN               RTS
;
;
;
;;;;;;;;;;
PAD_OFF
;
;11JUN               MOVE    D7,BG_TEMP_1_B       ;SAVE FIRST WORD FOR MIDI UNPACKING, XMISSION
;
               SWAP    D7                   ; STOW AWAY
               BSR     SEQ1_DSTR_READ       ;  GET LOWER WORD
;
;11JUN               MOVE    D7,BG_TEMP_3_B       ;   SAVE FOR MIDI UNPACKING & XMISSON
;
               ABS_LONG
               JSR     LOG_OUT_OLD_PAD      ;    ATTEMPT TO PULL OUT OF NOTES-CURRENTLY-ON LIST
               ABS_SHORT
               BEQ     NORM_PREF_LOOP       ;         IF COULD NOT FIND, THEN NO ON - FORGET THE OFF.
               SWAP    D7                   ;              ELSE, GO AHEAD & WRITE
;11JUN               JSR     (A2)                 ;              (UPPER WORD)
               JSR     SEQ_WRITE            ;              (UPPER WORD)
               SWAP    D7
;11JUN               JSR     (A2)                 ;              (LOWER WORD)
               JSR     SEQ_WRITE           ;              (LOWER WORD)
;
;*****DO SEQ_FULL CHECK, TAKE ACTION
;11JUN               BSR     SEQ_MEM_CHECK
;11JUN;
;11JUN               BSR     TRACK_MUTE_CHECK     ;SEE IF THIS TRACK MUTED - BRANCH TO PLAY_CLICK IF YES.
;11JUN               BNE.S   INDIAN_1             ;    IF MUTED, SPLIT
;11JUNINDIAN_2
;11JUN               BSR     SEQ_OFF_INTERNAL     ;IF NOT, PASS EVENT TO SEQ INTERNAL NOTE-OFF HANDLER,
;11JUN               ST      SEQ_XMIT_EVENT       ; SET FLAG TO PLOP IN MIDI SEQ BUFFER
;11JUN               BSR     TYPE_2_XMIT          ;THEN CODIFY AND SEND OUT OVER MIDI.
;11JUN;08JUN               BSR     MIDI_PANIC           ;IF ABOUT TO OVERFLOW THE MIDI BUFFERS
;11JUN;08JUN               BNE     END_OF_CLICK         ;    THEN QUIT.  ELSE,
;
               BRA     NORM_PREF_LOOP       ; HANDLE NEXT EVENT
;
;11JUNINDIAN_1       ;ONE OTHER CHANCE - JUST MUTED, BUT OUR DELAYED XMISSION OF OFFS HAS NOT TAKEN PLACE
;11JUN; YET.  LOOK AT TIMEOUT TO SEE IF SUCH A TRANSMISSION IS PENDING, AND IF SO, LET THOSE TRACKS'
;11JUN; WORTH ALSO PLAY/XMIT.
;11JUN               TST.L   MUTE_OFF_TIMER       ;AN XMIT_OLD_OFF PENDING VIA MUTE?
;11JUN               BEQ     NORM_PREF_LOOP       ;    IF NOT, SPLIT
;11JUN               BSR     PENDING_MUTE_CHECK   ;         ELSE, SEE IF THIS IS ONE WE'RE ABOUT TO TURN OFF
;11JUN               BNE     NORM_PREF_LOOP       ;         IF NOT, GIT
;11JUN               BRA     INDIAN_2             ;              ELSE, XMIT & PLAY
;
;
;;;;;;;;;;
MIDI_ON
               SWAP    D7                   ;PROTECT HIGH WORD
               BSR     SEQ1_DSTR_READ       ; GET LOWER WORD
;
;11JUN               TST.B   ERASING              ;WELL - ARE WE?
;11JUN               BEQ.S   TAGG_1               ;    IF NOT, CONTINUE...
;11JUN               BSR     ERASE_SEEK           ;         ELSE, SEE IF TO ERASE THIS EVENT
;11JUN               BNE     NORM_PREF_LOOP       ;         IF TO ERASE, DO NOT COPY TO LIST
;11JUNTAGG_1
                ABS_LONG
               JSR     LOG_IN_OLD_MIDI      ;  ADD TO THE NOTES_CURRENTLY_ON LIST
                ABS_SHORT
               BEQ     NORM_PREF_LOOP       ;    IF NO ROOM, KICK OUT & GO FOR NEXT EVENT
               SWAP    D7                   ;         ELSE, WRITE
;11JUN               JSR     (A2)                 ;         (HIGH WORD FIRST)
               JSR     SEQ_WRITE            ;         (HIGH WORD FIRST)
               SWAP    D7
;11JUN               JSR     (A2)                 ;         (THEN LOW WORD)
               JSR     SEQ_WRITE            ;         (THEN LOW WORD)
;
;*****DO SEQ_FULL CHECK, TAKE ACTION
;11JUN               BSR     SEQ_MEM_CHECK
;11JUN;
;11JUN               BSR     TRACK_MUTE_CHECK     ;SEE IF THIS TRACK MUTED
;11JUN               BNE     NORM_PREF_LOOP
;11JUN               ST      SEQ_XMIT_EVENT       ; SET FLAG TO PLOP IN MIDI SEQ BUFFER
;11JUN               BSR     TYPE_3_XMIT          ;    IF NOT, XMIT OVER MIDI
;11JUN;08JUN               BSR     MIDI_PANIC           ;IF ABOUT TO OVERFLOW THE MIDI BUFFERS
;11JUN;08JUN               BNE     END_OF_CLICK         ;    THEN QUIT.  ELSE,
;
               BRA     NORM_PREF_LOOP       ;DO ANOTHER EVENT
;
;
;;;;;;;;;;
MIDI_OFF
               SWAP    D7                   ;PROTECT HIGH WORD
               BSR     SEQ1_DSTR_READ       ; GET LOWER WORD
               ABS_LONG
               JSR     LOG_OUT_OLD_MIDI     ;  LOOK FOR MATCHING NOTE-ON TO REMOVE FROM NOTES_CUR_ON
               ABS_SHORT
               BEQ     NORM_PREF_LOOP       ;    IF CAN'T FIND, KICK OUT & GO FOR NEXT EVENT
               SWAP    D7                   ;         ELSE, WRITE
;11JUN               JSR     (A2)                 ;         (HIGH WORD FIRST)
               JSR     SEQ_WRITE            ;         (HIGH WORD FIRST)
               SWAP    D7
;11JUN               JSR     (A2)                 ;         (THEN LOW WORD)
               JSR     SEQ_WRITE            ;         (THEN LOW WORD)
;
;*****DO SEQ_FULL CHECK, TAKE ACTION
;11JUN               BSR     SEQ_MEM_CHECK
;11JUN;
;11JUN               BSR     TRACK_MUTE_CHECK     ;SEE IF THIS TRACK MUTED
;11JUN               BNE     INDIAN_3
;11JUNINDIAN_4
;11JUN               ST      SEQ_XMIT_EVENT       ; SET FLAG TO PLOP IN MIDI SEQ BUFFER
;11JUN               BSR     TYPE_4_XMIT          ;    IF NOT, XMIT OVER MIDI
;11JUN;08JUN               BSR     MIDI_PANIC           ;IF ABOUT TO OVERFLOW THE MIDI BUFFERS
;11JUN;08JUN               BNE     END_OF_CLICK         ;    THEN QUIT.  ELSE,
;
               BRA     NORM_PREF_LOOP       ;DO ANOTHER EVENT
;
;11JUN;
;11JUNINDIAN_3       ;ONE OTHER CHANCE - JUST MUTED, BUT OUR DELAYED XMISSION OF OFFS HAS NOT TAKEN PLACE
;11JUN; YET.  LOOK AT TIMEOUT TO SEE IF SUCH A TRANSMISSION IS PENDING, AND IF SO, LET THOSE TRACKS'
;11JUN; WORTH ALSO PLAY/XMIT.
;11JUN               TST.L   MUTE_OFF_TIMER       ;AN XMIT_OLD_OFF PENDING VIA MUTE?
;11JUN               BEQ     NORM_PREF_LOOP       ;    IF NOT, SPLIT
;11JUN               BSR     PENDING_MUTE_CHECK   ;         ELSE, SEE IF THIS IS ONE WE'RE ABOUT TO TURN OFF
;11JUN               BNE     NORM_PREF_LOOP       ;         IF NOT, GIT
;11JUN               BRA     INDIAN_4             ;              ELSE, XMIT & PLAY
;
;
;;;;;;;;;;
OTHER_MIDI
               SWAP    D7                   ;PROTECT HIGH WORD
               BSR     SEQ1_DSTR_READ       ; GET LOW ORDER WORD
               SWAP    D7
;11JUN               JSR     (A2)                 ;  WRITE (HIGH ORDER WORD FIRST)
               JSR     SEQ_WRITE            ;  WRITE (HIGH ORDER WORD FIRST)
               SWAP    D7
;11JUN               JSR     (A2)                 ;  (LOW ORDER WORD)
               JSR     SEQ_WRITE            ;  (LOW ORDER WORD)
;
;*****DO SEQ_FULL CHECK, ACTION
;11JUN               BSR     SEQ_MEM_CHECK
;11JUN;
;11JUN               BSR     TRACK_MUTE_CHECK     ;SEE IF ALLOWED TO XMIT THIS TRACK
;11JUN               BNE     NORM_PREF_LOOP
;11JUN               ST      SEQ_XMIT_EVENT       ; SET FLAG TO PLOP IN MIDI SEQ BUFFER
;11JUN               BSR     TYPE_5_XMIT          ;    IF YES, DO SO (ELSE, KICKE OUT TO PLAY_CLICK)
;11JUN;08JUN               BSR     MIDI_PANIC           ;IF ABOUT TO OVERFLOW THE MIDI BUFFERS
;11JUN;08JUN               BNE     END_OF_CLICK         ;    THEN QUIT.  ELSE,
;
               BRA     NORM_PREF_LOOP       ;HANDLE NEXT EVENT
;
;
;;;;;;;;;;
MIDI_SYSEX
;11JUN               ST      SEQ_XMIT_EVENT       ; SET FLAG TO PLOP IN MIDI SEQ BUFFER
;11JUN               BSR     TYPE_6_XMIT          ;DEFER TO ROUTINE IN SEQ_MIDI.  A SYSTEM EXCLUSIVE
;11JUN                                            ; MESSAGE IS A VARIABLE NUMBER OF BYTES LONG - DOES
;11JUN                                            ; DECODING (INCLUDING TRACK MUTE CHECK) THERE.
;11JUN;08JUN               BSR     MIDI_PANIC           ;IF ABOUT TO OVERFLOW THE MIDI BUFFERS
;11JUN;08JUN               BNE     END_OF_CLICK         ;    THEN QUIT.  ELSE,
;
               LSR     #2,D0                ;CONVERT BACK TO EVENT TYPE ID.
               JSR     SEQ1_RMW_EATER       ;COPY THROUGH A MESSAGE OF VARIABLE SIZE.
               BRA     NORM_PREF_GOT_ID     ;MR. EATER LEFT FIRST WORD OF NEXT EVENT IN D7,
                                            ;TYPE-CODE ISOLATED IN D0 - BRANCH BACK TO NEAR THE TOP
                                            ;OF THE LOOP, COMING IN PAST THESE STEPS.
;
;
;;;;;;;;;;
NEW_BAR_MARK
               MOVE    D7,HOLDING_EVENT     ;HANG ON TO THIS WORD FOR LATER PROCESSING
               MOVE    CLICKS_THIS_BAR,NEXT_EVENT_TIME     ;WANT TO OPERATE ON NEXT BAR WHEN
                                                           ; CURRENT ONE FINISHED.
               BRA     END_OF_CLICK         ;DONE WITH THIS CLICK'S EVENTS
;
;
;;;;;;;;;;
NEW_TIME_MARK
               MOVE    D7,HOLDING_EVENT     ;SAVE TO PROCESS WHEN READY
               LSR     #4,D7                ; DECODE CLICK NUMBER WHEN THISIS SUPPOSED TO HAPPEN
;
               CMP     CLICKS_THIS_BAR,D7   ;STOP-GAP CRASH PREVENTION - DISALLOW NEXT_EVENT_TIME
               BLS.S   NEW_TM_20            ;LATER THAN END OF CURRENT BAR.
               MOVE    CLICKS_THIS_BAR,D7   ;IF BOGUS TIME VALUE, PRE-FETCH IS PROBABLY LOST -
                                            ;SCHEDULE FOR THE END OF THE CURRENT BAR.
NEW_TM_20
;
               MOVE    D7,NEXT_EVENT_TIME   ;  SAVE
               BRA     END_OF_CLICK         ;DONE FETCHING THIS CLICK'S EVENTS.
;
;
;
; I GOT TO ABOUT THIS POINT ......
;
;
;
;;;;;;;;;;
NEW_TAP_TIME
               SWAP    D7                   ;HIDE HIGH WORD
               BSR     SEQ1_DSTR_READ       ; GET SECOND
;
               TST.B   PROCESSED_TAP        ;SEE IF ALREADY GOT ONE THIS CLICK - THE FIRST ONE
               BNE     NORM_PREF_LOOP       ; THIS CLICK IS THE MOST RECENTLY RECORDED.  BY IGNORING
                                            ; POSSIBLE FOLLOWING TAPS, GIVE USER THE ILLUSION THAT
               ST      PROCESSED_TAP        ; S/HE OVERWROTE THE OLD TAP TRACK BY TAPPING AGAIN.
;
               SWAP    D7                   ;    ELSE, OKAY.  WRITE HIGH WORD
;11JUN               JSR     (A2)
               JSR     SEQ_WRITE
               SWAP    D7                   ;    UNSWAP TO WRITE LOW WORD
;11JUN               JSR     (A2)
               JSR     SEQ_WRITE
;
;*****DO SEQ_FULL CHECK, ACTION
;11JUN;
;11JUN               BSR     SEQ_MEM_CHECK
;11JUN;
                ABS_LONG
               JSR     TAP_TIME_OFFSET      ; NEXT - GO TO ROUTINE IN TEMPO WHO PROCESSES IT
                ABS_SHORT
               BRA     NORM_PREF_LOOP       ;GET NEXT EVENT
;
;
;09JUN;;;;;;;;;;
;09JUNNEW_A_R_MARK
;09JUN               JSR     (A2)                 ;WRITE THIS WORD
;09JUN               SWAP    D7
;09JUN               BSR     SEQ1_DSTR_READ       ;GET SECOND WORD
;09JUN               JSR     (A2)                 ; WRITE
;09JUN;
;09JUN;*****DO SEQ_FULL CHECK, ACTION
;09JUN               BSR     SEQ_MEM_CHECK
;09JUN;
;09JUN                ABS_LONG
;09JUN               JSR     ACCEL_RIT            ;GET 2nd WORD, DEAL WITH (LOOK IN 'TEMPO')
;09JUN                ABS_SHORT
;09JUN               BRA     NORM_PREF_LOOP       ;CONTINUE ON WITH CLICK
;
;  A-R MARKERS HANDLED ALONG WITH BAR-MARKERS IN "NORMAL" PLAYBACK MODE.
;
;
;
;;;;;;;;;;
NEW_UART_TIMING
;11JUN               JSR     (A2)                 ;FIRST - WRITE
               JSR     SEQ_WRITE            ;FIRST - WRITE
;
;*****DO SEQ_FULL CHECK, ACTION
;11JUN;
;11JUN               BSR     SEQ_MEM_CHECK
;11JUN;
               BTST    #15,D7               ;IF 'A' IS INACTIVE
               BNE.S   WAVE_0               ;    THEN IGNORE; MOVE ON TO B
               MOVE    D7,D6                ;         ELSE, PROCESS
               LSL     #1,D6                ;ROTATE OFF 'ACTIVITY' BIT
               ASR     #8,D6                ; ROTATE, SIGN-EXTENDED, INTO A WORD VALUE
               ASR     #3,D6
               MOVE    D6,MA_SEQ_ADVANCE    ;  SAVE
WAVE_0
               BTST    #9,D7                ;IF 'B' IS INACTIVE
               BNE.S   WAVE_1               ;    THEN COOL - DONE
               MOVE    D7,D6                ;         ELSE, PROCESS
               LSR     #1,D6                ;GET SO THAT BUISNESS PART ON BYTE BOUNDRY
               ASR.B   #3,D6                ; SIGN-EXTEND INTO A BYTE
               EXT     D6                   ;  SIGN-EXTEND INTO A WORD
               MOVE    D6,MB_SEQ_ADVANCE    ;   SAVE
WAVE_1
               BRA     NORM_PREF_LOOP
;
;
;;;;;;;;;;
END_OF_SEQUENCE
               MOVE.L  A6,SEQ_WR_PTR        ;RESTORE UPDATED ADDRESS POINTERS FOR VARIOUS READ/WRITE SUBS
               MOVE.L  A5,SEQ1_DRD_PTR
               MOVE.L  A4,SEQ_NDRD_PTR
;11JUN;
;11JUN               MOVE.L  A3,WASTE_WR_PTR
;11JUN;
               JSR     SEQ_END_HANDLER      ;EJECT THIS SEQUENCE - DECIDE WHETHER TO PLAY IT AGAIN,
                                            ;PLAY A DIFFERENT SEQUENCE, OR GRIND TO A HALT.
               BRA     END_OF_CLICK         ;  CONTINUE TO MAKE SURE LAST CLICK DECODED GETS OUT OKAY
;
;
;
;
;;;;;;;;;;
;
;11JUN; UTILITY TO TAKE FIRST WORD OF EVENT IN D7, AND SEE IF IT'S TRACK IS
;11JUN; BEING MUTED AT THIS POINT.  IF YES, RETURNS Z FLAG FALSE.
;11JUN;
;11JUNTRACK_MUTE_CHECK
;11JUN               SWAP    D7                   ;(TRACKNUM IN HIGH ORDER WORD)
;11JUN               MOVE    D7,D0                ;MAKE COPY TO WORK ON
;11JUN               SWAP    D7
;11JUN               AND     #0070H,D0            ; MASK TO JUST TRACKNUM
;11JUN               LSR     #4,D0                ;  ROTATE DOWN TO STRIGHT NOMBRE
;11JUN               BTST    D0,TRACKS_MUTED      ;   SEE IF THAT PARTICULAR TRACK IS SET TO BE MUTED
;11JUN                                            ;    IF YES,THEN ON WITH NEXT EVENT (NOT-Z FLAG)
;11JUN               RTS                          ;         ELSE, RETURN AND DO WHAT YOU WILL.
;
;
;
;;;;;;;;;;
;
;11JUN; AS ABOVE, 'CEPT USING THE MASK 'PENDING MUTE' - THE ONLY TRACK UNMUTED
;11JUN; IN THIS MASK IS THE ONE WE'RE ABOUT TO DO AN XMIT_OLD_x_OFFS FOR.
;11JUN;
;11JUNPENDING_MUTE_CHECK
;11JUN               SWAP    D7                   ;(TRACKNUM IN HIGH ORDER WORD)
;11JUN               MOVE    D7,D0                ;MAKE COPY TO WORK ON
;11JUN               SWAP    D7
;11JUN               AND     #0070H,D0            ; MASK TO JUST TRACKNUM
;11JUN               LSR     #4,D0                ;  ROTATE DOWN TO STRIGHT NOMBRE
;11JUN               BTST    D0,PENDING_MUTE      ;   SEE IF THAT PARTICULAR TRACK SI SET TO BE MUTED
;11JUN                                            ;    IF YES,THEN ON WITH NEXT EVENT (NOT-Z FLAG)
;11JUN               RTS                          ;         ELSE, RETURN AND DO WHAT YOU WILL.
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; THIS STUFF SHOULD LOOK PRETTY FAMILIAR - YOU JUST SAW IT UPSTAIRS -
; IT'S SEQUENCE DATA UNPACKING ROUTINES, NON-DESTRUCTIVE STYLE-Y ....
; FOR USE WHILE IN A PLAYBACK REPEAT LOOP.
; WE'RE TALKING ABOUT A SET OF ROUTINES, SEE, THAT DO EX-ACT-LY WHAT THE
; NORMAL PLAYBACK COUNTERPART ROUTINES DO, EX-CEPT THAT AB-SO-LUTE-LY NO
; REARRANGEMENT OF ANY SEQUENCE DATA OCCURS - NO ERASE, NO COPY-OVER
; FROM READ BLOCK TO WRITE BLOCK (SINCE THAT'S ALREADY BEEN DONE ON THE
; FIRST (I.E., PRE-REPEAT) PASS THROUGH THE REPEAT LOOP SECTION, NO NEW
; DATA BE GETTIN' IN FUM ANY-WHAH, NO NUFFIN' AT ALL.
; SO:  NO ERASE TEST, NO MEMORY-FULL TEST, NO BUFFER-FULL TEST ....
;
; WE GET IN HERE, D7 CONTAINS THE EVENT FIRST WORD.
;
; NOTES AND COMMENT:  BAR-MARKER AND TIME-MARKER EVENT COPY-OVER IS NOT
; DONE IN THE PLAY_CLICK LOOP, HENCE THE HANDLING OF THESE EVENTS WITHIN
; THIS LOOP IS THE SAME FOR BOTH NORMAL AND REPEAT PLAYBACK, AND THE
; SAME ROUTINES ARE USED BY BOTH PLAY_CLICK AND RPT_PLAY_CLICK LOOPS.
; SIMILAR SITUATION AS REGARDS MIDI SYSTEM-EXCLUSIVE MESSAGES:  THE DATA
; COPY-OVER DOES OCCUR WITHIN THIS LOOP, BUT THE ROUTINE WHICH ACTUALLY
; DOES IT IS LOCATED ELSEWHERE - ALL WE DO HERE IS CALL IT, SAME WAY FOR
; EITHER NORMAL OR REPEAT PLAYBACK - IT KNOWS THE RIGHT THING TO DO.
; END-OF-SEQUENCE MARK SHOULD NEVER BE ENCOUNTERED BY REPEAT PLAYBACK
; PARSER, HENCE THERE IS NO ROUTINE HERE TO HANDLE IT.
;
; YOU MAY OBSERVE A PRE-PON-DERANCE OF SEMI-COL-ONS HEREABOUTS ....
;
; WANNA KNOW WHAT EACH EVENT LOOKS LIKE?
; LOOK AROUND IN THIS FILE - YOU'LL SEE IT (IF YOU'RE NOT A BLIND FUCK).
;
;
;
RPT_PAD_ON
;
;11JUN               MOVE    D7,BG_TEMP_1_B       ;SAVE FOR UNPACKING & XMITTING OVER MIDI -
;
               SWAP    D7                   ;UPPER WORD OUTA THE WAY,
               BSR     SEQ_NDSTR_READ       ;GET MIDDLE WORD -
;
;11JUN               MOVE    D7,BG_TEMP_3_B       ;ALSO SAVE FOR UNPACKING & XMITTING OVER MIDI.
;
                ABS_LONG
               JSR     LOG_IN_OLD_PAD       ;SHOVE IN NOTES_CURRENTLY_ON LIST.
                ABS_SHORT
               BSR     SEQ_NDSTR_READ       ;GET LAST WORD,
;
;11JUN               MOVE    D7,BG_TEMP_5_B       ;SAVE FOR MIDI XMISSION.
;11JUN;
;11JUN               BSR     TRACK_MUTE_CHECK     ;SEE IF THIS TRACK MUTED -
;11JUN               BNE     RPT_PREF_LOOP        ;IF MUTED, FORGET PLAYING IT.
;11JUN;15MAY               CMP.B   #0FFH,CLICK_ASSIGN   ;HAS SEQUENCER EATEN ALL VOICES DURING THIS CLICK?
;11JUN;15MAY               BEQ.S   RPT_PAD_VOICES_FULL  ;BRANCH IF YES - DON'T BOTHER PLAYING ANY MORE SOUNDS.
;11JUN;15MAY            MAY PUT THIS BACK IN IF SEQUENCER PHASES ARE REARRANGED
;11JUN;15MAY            TO PUT OLD EVENTS BEHIND NEW ONES ON THE AUTOCORRECT CLICK.
;11JUN;
;11JUN               BSR     SEQ_ON_INTERNAL      ;IF NOT, PASS EVENT TO SEQ INTERNAL NOTE-ON HANDLER,
;11JUN;15MAY;
;11JUN;15MAYRPT_PAD_VOICES_FULL
;11JUN;15MAY;
;11JUN               ST      SEQ_XMIT_EVENT       ;SET FLAG TO PLOP IN MIDI SEQ BUFFER,
;11JUN               BSR     TYPE_1_XMIT          ;AND XMIT OVER MIDI.
;11JUN;08JUN               BSR     MIDI_PANIC           ;IF ABOUT TO OVERFLOW THE MIDI BUFFERS
;11JUN;08JUN               BNE     END_OF_CLICK         ;    THEN QUIT.  ELSE,
;
               BRA     RPT_PREF_LOOP        ;DEAL WITH NEXT EVENT.
;
;
;
RPT_PAD_OFF
;
;11JUN               MOVE    D7,BG_TEMP_1_B       ;SAVE FIRST WORD FOR MIDI UNPACKING, XMISSION -
;
               SWAP    D7                   ;UPPER WORD OUTA THE WAY,
               BSR     SEQ_NDSTR_READ       ;GET LOWER WORD -
;
;11JUN               MOVE    D7,BG_TEMP_3_B       ;SAVE FOR MIDI UNPACKING & XMISSON.
;
                ABS_LONG
               JSR     LOG_OUT_OLD_PAD      ;ATTEMPT TO PULL OUT OF NOTES-CURRENTLY-ON LIST -
                                            ;IF WE DIDN'T FIND IT, WHO CARES ANYWAY.
                ABS_SHORT
;
;11JUN               BSR     TRACK_MUTE_CHECK     ;SEE IF THIS TRACK MUTED -
;11JUN               BEQ.S   RPADOFF_20           ;IF NOT, IT'S PLAY-TIME.
;11JUN               TST.L   MUTE_OFF_TIMER       ;MUTED - IS THERE AN XMIT_OLD_OFF PENDING VIA MUTE?
;11JUN               BEQ     RPT_PREF_LOOP        ;IF NOT, SPLIT.
;11JUN               BSR     PENDING_MUTE_CHECK   ;ELSE, SEE IF THIS IS ONE WE'RE ABOUT TO TURN OFF -
;11JUN               BNE     RPT_PREF_LOOP        ;IF NOT, GIT.
;11JUNRPADOFF_20
;11JUN               BSR     SEQ_OFF_INTERNAL     ;ELSE - PASS EVENT TO SEQ INTERNAL NOTE-OFF HANDLER,
;11JUN               ST      SEQ_XMIT_EVENT       ;SET FLAG TO PLOP IN MIDI SEQ BUFFER,
;11JUN               BSR     TYPE_2_XMIT          ;THEN CODIFY AND SEND OUT OVER MIDI.
;11JUN;08JUN               BSR     MIDI_PANIC           ;IF ABOUT TO OVERFLOW THE MIDI BUFFERS
;11JUN;08JUN               BNE     END_OF_CLICK         ;    THEN QUIT.  ELSE,
;
               BRA     RPT_PREF_LOOP        ;HANDLE NEXT EVENT, HEY.
;
;
;
RPT_MIDI_ON
               SWAP    D7                   ;PROTECT HIGH WORD,
               BSR     SEQ_NDSTR_READ       ;GET LOWER WORD.
                ABS_LONG
               JSR     LOG_IN_OLD_MIDI      ;ADD TO THE NOTES_CURRENTLY_ON LIST.
                ABS_SHORT
;
;11JUN               BSR     TRACK_MUTE_CHECK     ;SEE IF THIS TRACK MUTED -
;11JUN               BNE     RPT_PREF_LOOP        ;IF YES, BEGONE.
;11JUN               ST      SEQ_XMIT_EVENT       ;ELSE, SET FLAG TO PLOP IN MIDI SEQ BUFFER,
;11JUN               BSR     TYPE_3_XMIT          ;XMIT OVER MIDI.
;11JUN;08JUN               BSR     MIDI_PANIC           ;IF ABOUT TO OVERFLOW THE MIDI BUFFERS
;11JUN;08JUN               BNE     END_OF_CLICK         ;    THEN QUIT.  ELSE,
;
               BRA     RPT_PREF_LOOP        ;HANDLE NEXT EVENT.
;
;
;
RPT_MIDI_OFF
               SWAP    D7                   ;PROTECT HIGH WORD,
               BSR     SEQ_NDSTR_READ       ;GET LOWER WORD.
                ABS_LONG
               JSR     LOG_OUT_OLD_MIDI     ;LOOK FOR MATCHING NOTE-ON TO REMOVE FROM NOTES_CUR_ON.
                                            ;IF NOT THERE, NO SWEAT REALLY.
                ABS_SHORT
;
;11JUN               BSR     TRACK_MUTE_CHECK     ;SEE IF THIS TRACK MUTED -
;11JUN               BEQ.S   RMIDOFF_20           ;BRANCH IF NOT, IT'S PLAY-TIME.
;11JUN               TST.L   MUTE_OFF_TIMER       ;MUTED - IS THERE AN XMIT_OLD_OFF PENDING VIA MUTE?
;11JUN               BEQ     RPT_PREF_LOOP        ;IF NOT, SPLIT.
;11JUN               BSR     PENDING_MUTE_CHECK   ;ELSE, SEE IF THIS IS ONE WE'RE ABOUT TO TURN OFF -
;11JUN               BNE     RPT_PREF_LOOP        ;IF YES, WE DON'T MAKE NO MIDI NOISE WITH IT.
;11JUNRMIDOFF_20
;11JUN               ST      SEQ_XMIT_EVENT       ;ELSE, SET FLAG TO PLOP IN MIDI SEQ BUFFER,
;11JUN               BSR     TYPE_4_XMIT          ;XMIT OVER MIDI.
;11JUN;08JUN               BSR     MIDI_PANIC           ;IF ABOUT TO OVERFLOW THE MIDI BUFFERS
;11JUN;08JUN               BNE     END_OF_CLICK         ;    THEN QUIT.  ELSE,
;
               BRA     RPT_PREF_LOOP        ;DO NEXT EVENT.
;
;
;
RPT_OTHER_MIDI
               SWAP    D7                   ;PROTECT HIGH WORD,
               BSR     SEQ_NDSTR_READ       ;GET LOW ORDER WORD.
;
;11JUN               BSR     TRACK_MUTE_CHECK     ;SEE IF ALLOWED TO XMIT THIS TRACK -
;11JUN               BNE     RPT_PREF_LOOP        ;SKIP ON OUT IF NOT.
;11JUN               ST      SEQ_XMIT_EVENT       ;ELSE, SET FLAG TO PLOP IN MIDI SEQ BUFFER,
;11JUN               BSR     TYPE_5_XMIT          ;DO IT TO IT.
;11JUN;08JUN               BSR     MIDI_PANIC           ;IF ABOUT TO OVERFLOW THE MIDI BUFFERS
;11JUN;08JUN               BNE     END_OF_CLICK         ;    THEN QUIT.  ELSE,
;
               BRA     RPT_PREF_LOOP        ;HANDLE NEXT EVENT.
;
;
;
;
;
; SYSTEM-EXCLUSIVE - IN A PERFECT WORLD, WE WOULD TRANSMIT IT DURING
; CHASE, SO AS TO REPRODUCE ACTUAL PLAYBACK STATUS TO THE OUTSIDE WORLD.
; (ACTUALLY, WE SHOULD DO THIS FOR ANY MIDI MESSAGES OTHER THAN NOTE
; EVENTS, SINCE WE DON'T LOG ANYTHING ELSE, THUS CAN'T "BALANCE OUT" AT
; THE TIME WE GET CUED (AS WE DO WITH NOTE EVENTS).
; HOWEVER, THIS COULD LET US IN FOR SOME BIG PROBLEMS -
; NOT THE LEAST OF WHICH BEING THE POSSIBILITY OF INUNDATING ALL OF THE
; RECEIVERS WITH HUGE PILES OF DATA WHICH THEY MAY OR MAY NOT BE ABLE TO
; WITHSTAND WITHOUT CHOKING, LET ALONE ACTUALLY RESPONDING PRECISELY.
; SO - WE OMIT TO TRANSMIT IT, FOR THE TIME BEING ....
; MEBBE SOMEDAY WE CAN GIVE THE USER AN OPTION OF WHETHER OR NOT TO DO
; THIS (DEFAULT TO "NO" OF COURSE).
;
;;;;;;;;;;
RPT_MIDI_SYSEX
;
;11JUN               ST      SEQ_XMIT_EVENT       ; SET FLAG TO PLOP IN MIDI SEQ BUFFER
;
               BSR     R_TYPE_6_XMIT        ; USE COPY OF ROUTINE IN SEQ_MIDI.  A SYSTEM EXCLUSIVE
                                            ; MESSAGE IS A VARIABLE NUMBER OF BYTES LONG - DOES
                                            ; DECODING (INCLUDING TRACK MUTE CHECK) THERE.
;08JUN               BSR     MIDI_PANIC           ;IF ABOUT TO OVERFLOW THE MIDI BUFFERS
;08JUN               BNE     END_OF_CLICK         ;    THEN QUIT.  ELSE,
;
               BRA     RPT_PREF_LOOP        ;HANDLE NEXT EVENT
;
;
;
;;;;;;;;;;
R_TYPE_6_XMIT          ; SYSTEM EXCLUSIVE MESSAGE TO XMIT - PASSED FIRST WORD IN D7.  ALSO HAS
; TRACKNUM BYTE - NEED TO RUN A TRACK_MUTED TEST.  IF TRACK INDEED MUTED, NEED TO READ & WRITE,
; BUT DO NOT XMIT.
;
;11JUN               BTST    #7,D7                ;RIGHT UP FRONT - WHICH UART?
;11JUN               BNE     RYSEX_B
;11JUN;
;11JUNRYSEX_A
;11JUN;
;11JUN               MOVE    D7,D0                ;MAKE COPY TO WORK ON
;11JUN               AND     #0070H,D0            ; MASK TO JUST TRACKNUM
;11JUN               LSR     #4,D0                ;  ROTATE DOWN TO STRAIGHT NOMBRE
;11JUN               BTST    D0,TRACKS_MUTED      ;   SEE IF THAT PARTICULAR TRACK SI SET TO BE MUTED
;11JUN               BNE     RYSEX_A_MUTED        ;    IF YES, READ & WRITE, BUT DO NOT XMIT
;11JUN                                            ;         ELSE, CONTINUE
;11JUN               MOVEQ   #0F0H,D0             ;WELL, KNOW WHAT THE FIRST BYTE WILL BE...
;11JUN               BSR     LOAD_A_SEQ           ; XMIT
;11JUN;
;11JUNRMPLIFIER_A
;11JUN               BSR     SEQ_NDSTR_READ       ;GET NEXT WORD FROM SEQUENCER
;11JUN;
;11JUN;02JUN               BSR     SEQ_MEM_CHECK
;11JUN;02JUN;
;11JUN               MOVE.B  D7,XMIT_TEMP_1       ;LOAD UP 2nd BYTE TO XMIT
;11JUN               BMI.S   RINE_2_SYSEX_A       ; ANY STATUS BYTE MEANS EOX
;11JUN               LSR     #8,D7                ;GET AT 1st DATA BYTE
;11JUN               MOVE.B  D7,D0
;11JUN               BMI.S   RINE_SYSEX_A         ;    AGAIN - EOX?
;11JUN;
;11JUN               BSR     XMIT_1_PA_SEQ        ;XMIT
;11JUN               BRA     RMPLIFIER_A          ; GO AGAIN 'TILL DONE
;11JUN;
;11JUNRINE_2_SYSEX_A         ; DATA BYTE & AN EOX TO FINISH UP
;11JUN               MOVE    D7,D0
;11JUN               LSR     #8,D0                ;ROTATE DOWN THAT DATA BYTE
;11JUN               BSR     LOAD_A_SEQ
;11JUNRINE_SYSEX_A           ; FINISH UP WITH AN EOX
;11JUN               MOVEQ   #0F7H,D0
;11JUN               BSR     LOAD_A_SEQ
;11JUN               RTS
;
;
; JUST READ THROUGH AS THOUGH MUTED (WHICH IN FACT WE ARE):
;
RYSEX_A_MUTED
               BSR     SEQ_NDSTR_READ       ;GET NEXT WORD FROM SEQUENCER
;
;02JUN;*****DO SEQ_FULL TEST, ACT IF NEEDED
;02JUN               BSR     SEQ_MEM_CHECK
;
               TST     D7                   ;LOOK AT SYSEX DATA - TEST UPPER BYTE
               BMI.S   RUTED_FINE_A         ; UPPER BIT SET MEANS EOX - DONE
;11JUN               BTST    #7,D7                ;  LOOK AT LOWER DATA BYTE
;11JUN               BEQ.S   RYSEX_A_MUTED        ;   IF UPPER BIT CLEAR, DATA - KEEP GOING
               TST.B   D7                   ;  LOOK AT LOWER DATA BYTE
               BPL.S   RYSEX_A_MUTED        ;   IF UPPER BIT CLEAR, DATA - KEEP GOING
                                            ;    ELSE, EOX - DONE
RUTED_FINE_A           ; SAW AN EOX IN LATEST WORD FETCHED - DONE HERE
               RTS
;
;
;;;;;;;;;;
;11JUNRYSEX_B
;11JUN               MOVE    D7,D0                ;MAKE COPY TO WORK ON
;11JUN               AND     #0070H,D0            ; MASK TO JUST TRACKNUM
;11JUN               LSR     #4,D0                ;  ROTATE DOWN TO STRAIGHT NOMBRE
;11JUN               BTST    D0,TRACKS_MUTED      ;   SEE IF THAT PARTICULAR TRACK SI SET TO BE MUTED
;11JUN               BNE     RYSEX_B_MUTED        ;    IF YES, READ & WRITE, BUT DO NOT XMIT
;11JUN                                            ;         ELSE, CONTINUE
;11JUN               MOVEQ   #0F0H,D0             ;WELL, KNOW WHAT THE FIRST BYTE WILL BE...
;11JUN               BSR     LOAD_B_SEQ           ; XMIT
;11JUN;
;11JUNRMPLIFIER_B
;11JUN               BSR     SEQ_NDSTR_READ       ;GET NEXT WORD FROM SEQUENCER
;11JUN;
;11JUN;02JUN;*****DO SEQ_FULL CHECK, ACT IF NEEDED
;11JUN;02JUN               BSR     SEQ_MEM_CHECK
;11JUN;
;11JUN               MOVE.B  D7,XMIT_TEMP_1       ;LOAD UP 2nd BYTE TO XMIT
;11JUN               BMI.S   RINE_2_SYSEX_B       ; ANY STATUS BYTE MEANS EOX
;11JUN               LSR     #8,D7                ;GET AT 1st DATA BYTE
;11JUN               MOVE.B  D7,D0
;11JUN               BMI.S   RINE_SYSEX_B         ;    AGAIN - EOX?
;11JUN;
;11JUN               BSR     XMIT_1_PB_SEQ        ;XMIT
;11JUN               BRA     RMPLIFIER_B          ; GO AGAIN 'TILL DONE
;11JUN;
;11JUNRINE_2_SYSEX_B         ; DATA BYTE & AN EOX TO FINISH UP
;11JUN               MOVE    D7,D0
;11JUN               LSR     #8,D0                ;ROTATE DOWN THAT DATA BYTE
;11JUN               BSR     LOAD_B_SEQ
;11JUNRINE_SYSEX_B           ; FINISH UP WITH AN EOX
;11JUN               MOVEQ   #0F7H,D0
;11JUN               BSR     LOAD_B_SEQ
;11JUN               RTS
;11JUN;
;11JUN;
;11JUNRYSEX_B_MUTED
;11JUN               BSR     SEQ_NDSTR_READ       ;GET NEXT WORD FROM SEQUENCER
;11JUN;
;11JUN;02JUN;*****DO SEQ_FULL TEST, ACT IF NEEDED
;11JUN;02JUN               BSR     SEQ_MEM_CHECK
;11JUN;
;11JUN               TST     D7                   ;LOOK AT SYSEX DATA - TEST UPPER BYTE
;11JUN               BMI.S   RUTED_FINE_B         ; UPPER BIT SET MEANS EOX - DONE
;11JUN               BTST    #7,D7                ;  LOOK AT LOWER DATA BYTE
;11JUN               BEQ.S   RYSEX_B_MUTED        ;   IF UPPER BIT CLEAR, DATA - KEEP GOING
;11JUN                                            ;    ELSE, EOX - DONE
;11JUNRUTED_FINE_B           ; SAW AN EOX IN LATEST WORD FETCHED - DONE HERE
;11JUN               RTS
;
;
;
RPT_NEW_TAP_TIME
               SWAP    D7                   ;HIDE HIGH WORD,
               BSR     SEQ_NDSTR_READ       ;GET SECOND.
               TST.B   PROCESSED_TAP        ;SEE IF ALREADY GOT ONE THIS CLICK - THE FIRST ONE THIS
                                            ; CLICK IS THE MOST RECENTLY RECORDED ONE.  BY IGNORING
                                            ; POSSIBLE FOLLOWING TAPS, GIVE USER THE ILLUSION THAT
                                            ; S/HE OVERWROTE THE OLD TAP TRACK BY TAPPING AGAIN.
               BNE     RPT_PREF_LOOP        ;ALREADY GOT ONE, SO BE IGNORING OF THIS ONE.
               ST      PROCESSED_TAP        ;FIRST ONE, THIS CLICK - FLAGGIT.
                ABS_LONG
               JSR     TAP_TIME_OFFSET      ;NEXT - GO TO ROUTINE IN TEMPO WHO PROCESSES IT.
                ABS_SHORT
               BRA     RPT_PREF_LOOP        ;GET NEXT EVENT - ALWAYS NEXT EVENT - ARG ....
;
;
;
RPT_NEW_A_R_MARK
               SWAP    D7                   ;PUT FIRST WORD OUTEN DA WAY LEFT,
               BSR     SEQ_NDSTR_READ       ;GET T'OTHER ONE -
                ABS_LONG
               JSR     START_ACC_RIT        ;THEN ALL WE DO IS, DEAL WITH (LOOK IN 'TEMPO').
                ABS_SHORT
               BRA     RPT_PREF_LOOP        ;CONTINUE ON WITH CLICK - THAT "NEXT" KINDA EVENT.
;
;
;
;
RPT_NEW_UART_TIMING
               MOVE    D7,D6                ;MAKE A COPY FOR UNPARSING.
               ASR     #2,D6                ;GET TWO UARTS STRADDLING BYTE BORDER -
               TST     D6                   ;IF UPPER BIT OF UPPER BYTE SET,
               BMI.S   RPT_NR_END_1         ;THEN IGNORE FOR UART A -
                                            ;ELSE, PROCESS:
               LSL     #1,D7                ;ROTATE OFF 'ACTIVITY' BIT,
               ASR     #3,D7                ;ROTATE DOWN INTO A SIGN-EXTENDED WORD -
               ASR     #8,D7
               MOVE    D7,MA_SEQ_ADVANCE    ;UPDATE OUR MR. A. CONTROL WORD.
RPT_NR_END_1
               TST.B   D6                   ;IF UPPER BIT OF LOWER BYTE SET,
               BMI     RPT_PREF_LOOP        ;THEN NO CHANGE FOR UART B -
                                            ;ELSE, PROCESS:
               LSL     #1,D6                ;MOVE ACTIVITY BIT OUT OF WAY (INTO UPPER BYTE),
               ASR.B   #3,D6                ;ROTATE OFF ID -
               EXT     D6                   ;MAKE A SIGN-EXTENDED WORD,
               MOVE    D6,MB_SEQ_ADVANCE    ;UPDATE OUR MR. B. CONTROL WORD.
               BRA     RPT_PREF_LOOP        ;YOU GOT IT - HEAD FOR NEXT EVENT.
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "SPP-CUE / SMPTE-CHASE END-OF-CLICK CUSTODIAL SHIT"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; BRANCH HERE WHEN TIME MARKER OR END-OF-SEQUENCE MARKER IS PARSED -
; WE'RE AT THE END OF PROCESSING EXISTING SEQUENCE EVENTS FOR THIS CLICK
; AND MUST DO THE THINGS THAT ONE DOES AT THIS TIME.
;
END_OF_CLICK
               MOVE.L  A6,SEQ_WR_PTR        ;SAVE UPDATED POINTERS FOR READ/WRITE PROCESSES.
               MOVE.L  A5,SEQ1_DRD_PTR
               MOVE.L  A4,SEQ_NDRD_PTR
;
;11JUN               MOVE.L  A3,WASTE_WR_PTR
;
;11JUN                                            ;BEFORE WE KISS THIS CLICK GOODBYE .... PUNCH-IN/OUT?
;11JUN               TST.B   NOW_REPEATING        ;ARE WE IN NON-DESTRUCTIVE LOOP PLAYBACK MODE?
;11JUN               BNE.S   EOC_10               ;BRANCH IF YES, DON'T BOTHER WITH PUNCH-IN/OUT TESTS -
;11JUN               BSR     AUTO_BAR_PUNCH       ;ELSE - GO CHECK IT OUT, ACT IF NECESSARY.
;11JUN;
;11JUNEOC_10
;                    WE CHECK WHEN DONE CHASING ....
;
                ABS_LONG
               JSR     UPDATE_ACC_RIT       ;UPDATE ANY ACCELRANDO/RITARDANDO IN PROGRESS,
                                            ;PUT NEW TEMPO OUT TO 6803.
                ABS_SHORT
;
;
;15MAY               SF      CLICK_ASSIGN         ;NOW THAT WE'RE OUTA HERE, CLEAR ALL RECORD OF WHICH
;15MAY                                            ;VOICES WERE ASSIGNED TO THIS CLICK'S SEQ EVENTS.
;15MAY             MAY PUT THIS BACK IN IF SEQUENCER PHASES ARE REARRANGED
;15MAY             TO PUT OLD EVENTS BEHIND NEW ONES ON THE AUTOCORRECT CLICK.
;
;11JUN               TST     CONTINUE_TIMER       ;IS A PENDING MIDI "CONTINUE" TRANSMISSION TIMING DOWN?
;11JUN               BEQ.S   EOC_20               ;BRANCH IF NOT -
;11JUN               SUBQ    #1,CONTINUE_TIMER    ;IF SO, IS IT TIME NOW?
;11JUN               BNE.S   EOC_20               ;BRANCH IF NOT - MAYBE NEXT TIME.
;11JUN               BSR     SEND_6803_CONTINUE   ;IT'S TIME - SEND CONTINUE VIA 6803 UART,
;11JUN               BSR     SEND_MIDI_CONTINUE   ;WRITE SAME BYTE TO "A" AND "B" UARTS AS APPROPRIATE.
;11JUNEOC_20
;11JUN;
;11JUN               MOVEQ   #0F8H,D0             ;CAP INFO WITH A MIDI CLOCK BYTE TO DEMARCATE THE END
;11JUN               BSR     LOAD_A_SEQ           ;OF THE SET OF BUFFERED EVENTS ASSOCIATED WITH THIS
;11JUN               MOVEQ   #0F8H,D0             ;CLICK - THE CLOCK BYTE IS NOT ACTUALLY TRANSMITTED.
;11JUN               BSR     LOAD_B_SEQ
;11JUN;
;11JUN               CMP.L   #10000H,NOW_BAR      ;ARE WE AT VERY BEGINNING OF CURRENT SEQUENCE?
;11JUN               BNE.S   EOC_40               ;BRANCH IF NOT, CONTINUE.
;11JUN               BSR     PLAY_LED_OFF                   ;ELSE, SNUFF "PLAY" LED TO LET 'EM ALL KNOW -
;11JUN               MOVE    REAL_TIME,PLAY_BLINK_TIMER     ;SET TIMER WHICH WILL TURN IT BACK ON SOON.
;11JUN               BSET    #0,PLAY_BLINK_TIMER+1          ;TIMER WORD MUST BE NON-ZERO TO ACTIVATE IT.
;11JUNEOC_40
;
               BSR     BEAT_DISPLAY_BOY     ;WHAT ABOUT THAT BEAT NUMBER?  REQUEST UPDATE OF LCD IF
                                            ;IT CHANGED, AND IF WE WOULD SEE IT IN CURRENT SCREEN.
;
;11JUN               TST.B   RECORD_LOOPING       ;IF SET, HIT END OF SEQUENCE, RECORDING, AND LOOPING
;11JUN               BNE.S   PARSE_COMPLETE       ; RECORD SELECTED.  WAS THE LAST CLICK, BUT TREAT LIKE
;11JUN                                            ; A NORMAL ONE.  WHEN WE RE-ENTER ON THE NEXT CLICK,
;11JUN                                            ; WE WILL BEHAVE LIKE JUST STARTED (AND WILL CLEAR THIS
;11JUN                                            ; FLAG).
;
;
;
; AT THIS POINT WE DECIDE WHETHER TO CHASE THROUGH A SECOND CLICK
; (APPROPRIATE AFTER PARSING THE VERY FIRST CLICK OF A SEQUENCE)
; OR JUST GET THE HELL OUT:
;
               TST.B   PLAYED_TO_END        ;IF WE HIT THE END OF SEQUENCE OR SONG, CERTAINLY
               BNE.S   PARSE_COMPLETE       ;NO NEED TO LOOK INTO DOUBLE CLICK-CHASE.
                                            ;    ELSE, CONTINUE...
;
               TST.B   RECORD_LOOPING       ;THIS FLAG MEANS WE HAVE JUST CROSSED OVER THE LINE
                                            ;BETWEEN END OF ONE SEQUENCE AND THE BEGINNING OF
                                            ;ANOTHER (OR EVEN THE SAME ONE) BY VIRTUE OF LOOPING
                                            ;RECORD, SONG MODE, OR HAND-CUE OF A NEW SEQUENCE -
               BEQ.S   EOC_C0               ;BRANCH AND CONTINUE NORMALLY IF NOT SET - CONTINUE ON
                                            ;TO TEST FOR FIRST-CLOCK DOUBLE PRE-FETCH.
               SF      RECORD_LOOPING       ;ELSE - EVEN THOUGH WE'RE SURELY AT BAR 1, CLOCK 0 OF
                                            ;THE NEW SEQUENCE, WE DON'T WANT OR NEED TO DO A SECOND
                                            ;PRE-FETCH - THIS IS BECAUSE WE GOT HERE VIA PRE-FETCH
                                            ;OF THE LAST CLICK IN THE PREVIOUS SEQUENCE, AND ARE
                                            ;STILL ONE CLOCK AWAY FROM THE TIME WHEN NEW SEQUENCE
                                            ;IS TO BEGIN - SO JUST GET THE FLAG OUT OF THE WAY,
               BRA.S   PARSE_COMPLETE       ;MOVE ON NORMALLY - ON THE NEXT CLOCK, DOUBLE PRE-FETCH
                                            ;WILL BE DONE JUST AS THOUGH THE "PLAY" SWITCH HAD JUST
                                            ;BEEN HIT ....
;
EOC_C0
               CMP.L   #10000H,NOW_BAR      ;IF MADE IT THRU ALL OF ABOVE, AND NOT AT VERY START
               BNE.S   PARSE_COMPLETE       ;    THEN PROCEED AS NORMAL
;
               TST.B   NOW_REPEATING        ;SO WE'RE AT VERY START?  SO WHAT?
               BNE.S   PARSE_COMPLETE       ;IF IN A PLAYBACK REPEAT LOOP WHICH STARTS HERE,
                                            ;STILL DON' WAN' DO NUH FIRST-CLICK DUB'L CLICK-EY ....
;
                                            ;ELSE - GET FIRST CLICK OUT ASAP, DO ANOTHER RIGHT OFF.
;
;11JUN               MOVE    #2300H,SR            ;BLOCK LEVEL 3 INTERRUPT WHILE WE CHANGE ITS ORDERS.
;11JUN               MOVE    MA_SEQ_ADVANCE,D0    ;SUPPOSED TO DELAY UART A SEQUENCE EVENT TRANSMISSION?
;11JUN               BGT.S   START_SLOW_1         ;BRANCH IF NOT, ELSE SET IT FOR IMMEDIATE DETONATION.
;11JUN               MOVEQ   #1,D0
;11JUNSTART_SLOW_1
;11JUN               MOVE    D0,MA_XMIT_SEQ_TIME
;11JUN;
;11JUN               MOVE    MB_SEQ_ADVANCE,D0    ;DO SAME THING FOR UART B ....
;11JUN               BGT.S   START_SLOW_2
;11JUN               MOVEQ   #1,D0
;11JUNSTART_SLOW_2
;11JUN               MOVE    D0,MB_XMIT_SEQ_TIME
;11JUN               MOVE    #2000H,SR            ;WHEN DONE, RE-ENABLE LEVEL 3 INTERRUPT AND LET RIP.
;
               MOVE.L  SEQ_WR_PTR,A6        ;SET UP ADDRESS POINTERS FOR VARIOUS READ/WRITE SUBS,
               MOVE.L  SEQ1_DRD_PTR,A5
               MOVE.L  SEQ_NDRD_PTR,A4
;
;11JUN               MOVE.L  WASTE_WR_PTR,A3
;
               MOVE    NOW_MET_COUNT,MET_COUNT_DOWN   ;PROPERLY PREPARE METERDOME,
;
               BRA     EXEC_PHASE_VEC       ;AND HEAD BACK TO DEAL WITH NEXT CLICK RIGHT NOW.
;
;
PARSE_COMPLETE
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE "SPP-CUE / SMPTE-CHASE BEAT NUMBER MAINTENANCE"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; COMPUTE CURRENT BEAT NUMBER - REQUEST SCREEN UPDATE IF CHANGE OCCURRED
; SINCE LAST CLICK.  DOES WHOMPERS ON D0.
;
;              ACTUALLY, JUST MAINTAIN BEAT NUMBER ....
;
BEAT_DISPLAY_BOY
               MOVE    NOW_CLICK,D0         ;COMPUTE NOW_BEAT AS NOW_CLICK/CLICKS_THIS_DENOM -
               BNE.S   BEATS_ME             ;BRANCH IF NOT CLICK 0 -
               MOVE    D0,NOW_BEAT          ;IF THIS BE CLICK 0, WHY THEN, MUST BE BEAT ONE -
               BRA.S   BEAT_UNO             ;THIS MINOR HOKUM GUARANTEES UPDATE, NO MATTER WHAT.
BEATS_ME
               SUBQ    #1,D0                ;ELSE - COMPENSATE FOR ALWAYS BEING ONE CLICK AHEAD OF
               EXT.L   D0                   ;AUDIBLE REALITY, THEN DO THE BEAT-COMPUTE THING -
               DIVU    CLICKS_THIS_DENOM,D0
BEAT_UNO
               ADDQ    #1,D0                ;BEATS COUNT UP FROM 1 (NOT 0), GET WITH THE PROGRAM.
               CMP     NOW_BEAT,D0          ;HAS BEAT NUMBER CHANGED SINCE LAST CLICK?
               BEQ.S   BEAT_OFF             ;IF NOT, DON'T UPDATE BEAT NUMBER OR DISPLAY.
               MOVE    D0,NOW_BEAT          ;ELSE, UPDATE VARIABLE (It's the NOW beat!) -
;
;11JUN               TST.B   SHOWING_TEMPO        ;NONETHELESS, IF SHOWING TEMPO ....
;11JUN               BNE.S   BEAT_OFF
;11JUN               TST.B   SHOWING_FF_RW        ;.... OR DOING FAST_WIND, DON'T UPDATE DISPLAY.
;11JUN               BNE.S   BEAT_OFF
;11JUN                                            ;AGAIN, DON'T UPDATE DISPLAY IF WE WOULDN'T SEE IT -
;11JUN                                            ;THE FOLLOWING ARE THE ONLY SCREENS IN WHICH WE WOULD:
;11JUN               MOVE.L  CUR_SUB_BLOCK,D0
;11JUN               CMP.L   #REC_TIME_SIG_SUB,D0
;11JUN               BEQ.S   BEAT_ME_UP
;11JUN               CMP.L   #SEQ_PLAYBACK_SUB,D0
;11JUN               BEQ.S   BEAT_ME_UP
;11JUN               CMP.L   #SONG_PLAYBACK_SUB,D0
;11JUN               BNE.S   BEAT_OFF
;11JUNBEAT_ME_UP
;11JUN               ST      SUBFUN_INSTALL       ;BROOT FORCE DISPLAY UPDATE IN CASE BAR NUMBER ALSO
;11JUN                                            ;CHANGED (SOMEDAY, GO DIRECT AND SAVE CPU TIME).
;
BEAT_OFF
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "SPP-CUE / SMPTE-CHASE METRONOME COUNT MAINTENANCE"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
;             METRONOME HANDLER
;
;              ACTUALLY, JUST MAINTAIN METRONOME COUNTDOWN ....
;
MET_HANDLER
               SUB     #1,MET_COUNT_DOWN    ;CONTINUE COUNTDOWN TO NEXT CLICK
               BNE.S   EXIT_MET             ; IF NOT READY FOR ANOTHER, DONE FOR NOW
;
               MOVE    NOW_MET_COUNT,MET_COUNT_DOWN   ;REFRESH MET COUNTDOWN
;
;11JUN               TST     RAW_MET              ;IF METRONOME OFF, FUCK OFF
;11JUN               BEQ.S   EXIT_MET
;11JUN;
;11JUN               BTST    #1,XPORT_STATE       ;IF NOT RECORDING, FUCK OFF
;11JUN               BNE.S   METS_RULE
;11JUN               BTST    #0,XPORT_STATE       ;    (AHEM - OR ERASING)
;11JUN               BEQ.S   EXIT_MET
;11JUNMETS_RULE
;11JUN               MOVE    #2700H,SR            ;BLOCK INTS WHILE DOING THIS
;11JUN;
;11JUN               BSET    #6,MISC_OUT_STAT
;11JUN               TST     NOW_CLICK            ;IF FIRST CLICK, HEAVY MET ACCENT
;11JUN               BNE.S   SOFT_CLICK
;11JUNHARD_CLICK
;11JUN               BCLR    #6,MISC_OUT_STAT     ;SET BIT FOR HARD MET HIT
;11JUNSOFT_CLICK
;11JUN               BCLR    #5,MISC_OUT_STAT     ;SET LOGIC FOR MET HIT
;11JUN;
;11JUN                ABS_LONG
;11JUN               MOVE.B  MISC_OUT_STAT,MISC_OUT    ;HIT THE METRONOME CIRCUIT
;11JUN                ABS_SHORT
;11JUN;
;11JUN               MOVEQ   #15,D0
;11JUN               ADD     METRO_TONE,D0        ;SET UP A USER-DEFINED TIMEOUT
;11JUNUNCLICK_LOOP
;11JUN               DBRA    D0,UNCLICK_LOOP
;11JUN               BSET    #5,MISC_OUT_STAT   ;CLEAR MET
;11JUN                ABS_LONG
;11JUN               MOVE.B  MISC_OUT_STAT,MISC_OUT
;11JUN                ABS_SHORT
;11JUN;
;11JUN               MOVE    #2000H,SR            ;UNBLOCK INTS
;
EXIT_MET
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
