               INCLUDE HPFIXUPS
               TITLE "TRANSPORT"
***************************************************************************************************
***************************************************************************************************
***                                                                                             ***
***            TRANSPORT - SEQUENCER "TRANSPORT" LOCAL CONTROL                                  ***
***                                                                                             ***
***************************************************************************************************
***************************************************************************************************
;
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.
;
;
;              "The horror, the horror ...."
;
;
               INCLUDE EQUATES         ;HDW ADDR AND CONSTANT DEFS, ABS_SHORT DIRECTIVE.
;
               INCLUDE SEQDEFS         ;SEQUENCER CONSTANT DEFINITIONS.
;
               GLB     FAST_FWD_SWITCH,REWIND_SWITCH
               GLB     ERASE_SWITCH,RECORD_SWITCH,PLAY_SWITCH
               GLB     STOP_SWITCH,STOP_THE_SEQUENCER,SEQ_RUNNING_TEST
               GLB     PAUSE_SWITCH
               GLB     EJECT_SEQUENCE
               GLB     SNGL_STEP_PAUSE
               GLB     FAST_WIND_PLAY
               GLB     TAP_IN_PLAY,TAP_IN_UNPAUSE
               GLB     CUED_BAR_PUNCH
               GLB     PUNCH_IN_NOW,AUTO_PUNCH_OUT,MANUAL_PUNCH_OUT
               GLB     SEQ_END_HANDLER
               GLB     PAUSE_TC,UNPAUSE_TC,STOP_TC,START_TC
               GLB     PLAY_STOP_SWITCH
               GLB     WAIT_AND_OFF
               GLB     UPDATE_REPEATS
               GLB     PLAY_LED_OFF,PLAY_LED_SOLID
               GLB     PLAY_LED_SLOW,PLAY_LED_FAST
               GLB     PAUSE_LED_SOLID,PAUSE_LED_OFF
               GLB     SET_UP_SEQUENCE
;
                                            ;EXTERNAL ROM.
               EXTERNAL  GET_SONG_PTR,GET_CUR_SEQ_DIR,FORCED_ALLOCATE
               EXTERNAL  RESET_PUNCHES,NEW_SONG_SELECTED
               EXTERNAL  XMIT_OLD_M_OFFS,BAR_OR_SMPTE_FLAG
               EXTERNAL  XMIT_OLD_P_OFFS
               EXTERNAL  WRITE_OLD_M_OFFS
               EXTERNAL  WRITE_OLD_P_OFFS
               EXTERNAL  WRITE_NEW_M_OFFS
               EXTERNAL  WRITE_NEW_P_OFFS
               EXTERNAL  SEQ_CONSOLIDATE
               EXTERNAL  SEQ1_DRD_SETUP
               EXTERNAL  INIT_WASTE_RECORD
               EXTERNAL  SET_WASTE_RECORD
               EXTERNAL  ZERO_WASTE_RECORD
               EXTERNAL  WRITE_TO_TC
               EXTERNAL  OTRA_BAR_CHORES
               EXTERNAL  WASTELAND_COPY
               EXTERNAL  SEQ_WRITE,SEQ1_DSTR_READ
               EXTERNAL  SET_AUTOSCROLL
               EXTERNAL  UNPLUG_ALL_EDITS,KILL_ALL_VOICES
               EXTERNAL  WRITE_SCREEN,DISP_BUFFER
               EXTERNAL  WRITE_VALUE
               EXTERNAL  DISP_FIELD,DISP_SCREEN
               EXTERNAL  INIT_TEMPO_TO_ALL
               EXTERNAL  FLUSH_OLD_MIDI,FLUSH_OLD_PADS
               EXTERNAL  AUTORPT_SWITCH
               EXTERNAL  LIVE_ERASE_SETUP
               EXTERNAL  SEQ_TURNAROUND
               EXTERNAL  UPDATE_SEQ_SIZE
               EXTERNAL  XMIT_OLD_P_ONS,XMIT_OLD_M_ONS
               EXTERNAL  WASTELAND_WRITE
               EXTERNAL  BLIND_FLUSH_NOTE_BUFS
               EXTERNAL  TAP_RECORD,TAP_STOP
               EXTERNAL  SEND_MIDI_START,SEND_MIDI_STOP
               EXTERNAL  SEND_MIDI_CLOCK
               EXTERNAL  SEND_MIDI_CONTINUE,SEND_IMMED_PTR
               EXTERNAL  SEND_6803_STOP
               EXTERNAL  SEND_ADVANCED_PTR
               EXTERNAL  LOG_IN_OLD_PAD
               EXTERNAL  LOG_OUT_OLD_PAD
               EXTERNAL  LOG_IN_OLD_MIDI
               EXTERNAL  LOG_OUT_OLD_MIDI
               EXTERNAL  SEQ1_RMW_EATER
               EXTERNAL  REPEAT_SNAPSHOT
               EXTERNAL  BAR_MARKER_HANDLER
               EXTERNAL  CHECK_FOR_A_R_MARK
               EXTERNAL  UPDATE_ACC_RIT
               EXTERNAL  TAP_TIME_OFFSET
               EXTERNAL  LED_DIRECT
               EXTERNAL  USER_PUNCHED
;
               EXTERNAL  Q_START_BLK        ;SEQUENCE DIRECTORY PARAMETERS.
               EXTERNAL  Q_TOTAL_BARS
               EXTERNAL  Q_STATUS
               EXTERNAL  Q_INIT_TEMPO
               EXTERNAL  Q_RPT_COUNT
               EXTERNAL  Q_RPT_START
               EXTERNAL  Q_RPT_END
;
               EXTERNAL  CLOCK_IN_MODE      ;RAM, Y'KNOW.
               EXTERNAL  ACCEL_RIT_B_LEFT
               EXTERNAL  CUE_BAR,CUE_START
               EXTERNAL  CURRENT_SEQUENCE,FORMER_SEQUENCE,SEQ1_DRD_BLK
               EXTERNAL  S_OR_S_FLAG,SINGLE_STEP
               EXTERNAL  CUE_NEW_SEQ
               EXTERNAL  REPEATS_LEFT
               EXTERNAL  SONG_STEP_NUM
               EXTERNAL  TRACKS_MUTED
               EXTERNAL  TOTAL_REPEATS
               EXTERNAL  TOTAL_BARS
               EXTERNAL  CUR_TEMPO_FPB,INIT_TEMPO_FPB
               EXTERNAL  CUR_TEMPO_BPM,INIT_TEMPO_BPM
               EXTERNAL  INIT_TEMPO_USEC,NOW_BEAT
               EXTERNAL  CUR_TEMPO_USEC
               EXTERNAL  SEQ1_DRD_PTR
               EXTERNAL  SHOWING_FF_RW
               EXTERNAL  UPDATE_LCD
               EXTERNAL  SEQ_WR_PTR
;
               EXTERNAL  OLD_SEQ_WRITE
;
               EXTERNAL  XPORT_STATE,NOW_SEQ_STATUS
               EXTERNAL  LED_SLOW_FLASH
               EXTERNAL  LED_FAST_FLASH
               EXTERNAL  LED_STEADY
               EXTERNAL  LED_EXTINGUISH
               EXTERNAL  RECORD_LOOPING,LOOP_RECORD
               EXTERNAL  RECORDING,TAP_TRACK_ON_FLAG
               EXTERNAL  NOW_BAR,PUNCH_IN_BAR
               EXTERNAL  ERASING
               EXTERNAL  NOW_CLICK
               EXTERNAL  SUBFUN_INSTALL
               EXTERNAL  PUNCH_OUT_BAR
               EXTERNAL  OVERALL_CLICK
               EXTERNAL  CUR_SPP_CLICK
               EXTERNAL  NEXT_EVENT_TIME
               EXTERNAL  HOLDING_EVENT
               EXTERNAL  COUNT_IN_METHOD,TAP_SLEW_AMOUNT,CLICKS_PER_TAP
               EXTERNAL  TAP_CLICKS_LEFT
               EXTERNAL  LAST_TAP_LENGTH,TAP_TIME_START
               EXTERNAL  NOW_LAST_BAR
               EXTERNAL  AUTORPT_FLAG,PROCESSED_TAP
               EXTERNAL  SEQ_MEM_FULL
               EXTERNAL  MB_XMIT_SEQ_CNT
               EXTERNAL  MA_XMIT_SEQ_CNT
               EXTERNAL  REPEAT_START
               EXTERNAL  REPEAT_END
               EXTERNAL  REPEAT_COUNT
               EXTERNAL  READY_TO_RPT,SETUP_STATE,UPDATE_STATE
               EXTERNAL  NOW_REPEATING,CLICK_TIME_START,CLICKS_PENDING
               EXTERNAL  SMPTE_SYNC,CHASING_SMPTE
               EXTERNAL  BLEED_UART_A,BLEED_UART_B
               EXTERNAL  MA_SEQ_ADVANCE
               EXTERNAL  MB_SEQ_ADVANCE
               EXTERNAL  REDISP_FIELD
               EXTERNAL  CURSOR_ENABLE
               EXTERNAL  CONTINUE_TIMER
               EXTERNAL  REAL_TIME
               EXTERNAL  NEXT_TIME,LAST_CLICK_HIT
               EXTERNAL  FAST_WIND_TIMER
               EXTERNAL  FAST_WIND_BAR
               EXTERNAL  FOUND_CUE_BAR
               EXTERNAL  CLICKS_THIS_BAR
               EXTERNAL  WROTE_NEW_TIME
               EXTERNAL  PLAYED_TO_END
               EXTERNAL  NEW_SONG_NOW
               EXTERNAL  CUEING_TO_SPP
;
               TITLE   "PLAY SWITCH HANDLING"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; HANDLER FOR PLAY SWITCH:
;
PLAY_SWITCH
               TST     TAP_TRACK_ON_FLAG    ;ARE WE IN TAP-TRACK RECORD MODE?
               BEQ.S   PLAY_SW_20           ;BRANCH IF NOT, CONTINUE.
                ABS_LONG
               JMP     TAP_RECORD           ;ELSE - ACTIVATE TAP-TRACK RECORDING, BEGONE.
                ABS_SHORT
;
PLAY_SW_20
               TST     NOW_SEQ_STATUS       ;IF THIS SEQUENCE DOES NOT EXIST,
               BEQ.S   PLAY_SW_EXIT         ;EXIT WITHOUT ACTION.
;
               MOVE    CLOCK_IN_MODE,D0     ;HANDLER RESPONSE DEPENDS ON CLOCK-IN MODE:
               LSL     #3,D0                ;ROTATE UP - ALLOW FOR FOUR COMBINATIONS OF "PLAY"
                                            ;AND "PAUSE" STATUS PER CLOCK-IN MODE.
;
               BTST    #PLAY_BIT,XPORT_STATE     ;IS "PLAY" STATUS ALREADY ENABLED?
               BEQ.S   PLAY_SW_40                ;BRANCH IF NOT,
               ADDQ    #4,D0                     ;ELSE BUMP THE OFFSET UP ACCORDINGLY.
PLAY_SW_40
               BTST    #PAUSE_BIT,XPORT_STATE    ;IS "PAUSE" STATUS ACTIVE?
               BEQ.S   PLAY_SW_60                ;BRANCH IF NOT,
               ADDQ    #2,D0                     ;ELSE BUMP THE OFFSET UP ACCORDINGLY.
PLAY_SW_60
               MOVE    PLAY_JUMP_TBL(PC,D0),A0   ;ALL SET - FETCH APPROPRIATE POINTER,
               JMP     (A0)                      ;GO TO IT, JACQUES.
;
PLAY_SW_EXIT
               RTS
;
;
;
PLAY_JUMP_TBL
;
               DC.W    PLAY_INT             ;INTERNAL - "PLAY" WAS OFF, "PAUSE" WAS OFF.
               DC.W    PLAY_INT_PAUSE       ;           "PLAY" WAS OFF, "PAUSE" WAS ON.
               DC.W    PLAY_INT_PLAY        ;           "PLAY" WAS ON, "PAUSE" WAS OFF.
               DC.W    PLAY_INT_PLAY_PAUSE  ;           "PLAY" WAS ON, "PAUSE" WAS ON.
;
               DC.W    PLAY_SW_EXIT         ;YES, MTC SYNC IS PRETTY MUCH OUT OF REACH ....
               DC.W    PLAY_SW_EXIT         ;BUT WOULD PROBABLY LOOK MUCH LIKE SMPTE IF IT EXISTED.
               DC.W    PLAY_SW_EXIT
               DC.W    PLAY_SW_EXIT
;
               DC.W    PLAY_EXTERNAL        ;MIDI - "PLAY" WAS OFF, "PAUSE" WAS OFF.
               DC.W    PLAY_SW_EXIT         ;       "PLAY" OFF, "PAUSE" ON DOESN'T EXIST W/ MIDI.
               DC.W    PLAY_SW_EXIT         ;       "PLAY" ON - IGNORE "PLAY" SWITCH.
               DC.W    PLAY_SW_EXIT         ;       "PLAY" ON - IGNORE "PLAY" SWITCH.
;
               DC.W    PLAY_INT             ;CLICK - "PLAY" WAS OFF, "PAUSE" WAS OFF.
               DC.W    PLAY_INT_PAUSE       ;        "PLAY" WAS OFF, "PAUSE" WAS ON.
               DC.W    PLAY_INT_PLAY        ;        "PLAY" WAS ON, "PAUSE" WAS OFF.
               DC.W    PLAY_INT_PLAY_PAUSE  ;        "PLAY" WAS ON, "PAUSE" WAS ON.
                                            ;NOTE - CLICK-SYNC OPERATION VERY SIMILAR TO INTERNAL
                                            ;       TIMEBASE OPERATION, HANDLED AS SPECIAL CASES
                                            ;       IN INTERNAL TIMEBASE PLAY-SWITCH ROUTINES.
;
               DC.W    PLAY_EXTERNAL        ;SMPTE - "PLAY" WAS OFF, "PAUSE" WAS OFF.
               DC.W    PLAY_SW_EXIT         ;        "PLAY" OFF, "PAUSE" ON DOESN'T EXIST W/ SMPTE.
               DC.W    PLAY_SW_EXIT         ;        "PLAY" ON - IGNORE "PLAY" SWITCH.
               DC.W    PLAY_SW_EXIT         ;        "PLAY" ON - IGNORE "PLAY" SWITCH.
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; INTERNAL TIMEBASE OR CLICK SYNC -
; "PLAY" SWITCH HIT WITH "PLAY" OFF, "PAUSE" OFF:
;
PLAY_INT
               SF      BLEED_UART_A         ;KILL FLAGS WHICH ALLOW UART HANDLERS TO DUMP BUFFERED
               SF      BLEED_UART_B         ;SEQUENCE MIDI EVENTS WITHOUT AWAITING CLICK TIMEOUT.
;
               BSR     UPDATE_REPEATS       ;MAKE SURE PLAYBACK REPEAT LOOP PARAMETERS ARE UP TO
                                            ;SNUFF - USER MAY HAVE EDITED LOOP SETTINGS FOR THE
                                            ;CURRENT SEQUENCE OR SELECTED A NEW SEQUENCE SINCE THE
                                            ;LAST TIME SEQUENCER (WAS) STOPPED.
;
               JSR     INIT_WASTE_RECORD    ;CLEAR WASTELAND - USED DURING RECORDING AND PLAYBACK -
                                            ;SET ALL RECORD VECTORS TO BUFFER NEW EVENTS THERE.
;
               JSR     SEQ1_DRD_SETUP       ;SET UP SEQUENCE READ/WRITE PROCESSES AND POINTERS.
;
               TST.B   CUE_START            ;ARE WE SUPPOSED TO START FROM USER-SELECTED CUE POINT?
               BEQ.S   PL_INT_20            ;BRANCH IF NOT, CONTINUE.
               CMP     #1,CUE_BAR           ;IF YES, IS CUE POINT AT BEGINNING OF SEQUENCE ANYWAY?
               BNE.S   PL_INT_60            ;BRANCH IF NOT, GO DEAL WITH FOR-REAL CUE-START.
PL_INT_20
                                            ;NOT DOING CUED START:
               CMP     #1,COUNT_IN_METHOD   ;ARE WE SUPPOSED TO COUNT IN BEFORE STARTING?
               BNE.S   PL_INT_40            ;BRANCH IF NOT, FORGE AHEAD.
;
               CMP     #3,CLOCK_IN_MODE     ;COUNT-IN OPTION SELECTED - BUT ARE WE IN CLICK SYNC?
               BEQ.S   PL_INT_40            ;BRANCH IF YES - COUNT-IN DOESN'T SYNC TO CLICKS,
                                            ;SO LET'S NOT BOTHER WITH IT.
;
               MOVE.B  XPORT_STATE,D0       ;COUNT-IN IS ENABLED - BUT WHAT ABOUT RECORD/ERASE?
               AND     #RECORD_MASK+ERASE_MASK,D0
               BNE.S   PL_INT_80            ;BRANCH IF EITHER IS ENABLED, DO A COUNT-IN START -
                                            ;ELSE, DON'T WASTE EVERYONE'S TIME AND PATIENCE ....
;
;
;
; DO "NORMAL" START - NO CUE OR COUNT-IN:
;
PL_INT_40
               BSR     SEND_MIDI_START      ;SEND "START" VIA UARTS ENABLED FOR MIDI CLOCK OUT.
                                            ;(NOTE - MAKE SURE IT GOES OUT BEFORE CLOCKING STARTS.)
               BSR     START_TC             ;TELL 6803 TO GET GOING (IT ALSO SENDS "START").
               BSET    #PLAY_BIT,XPORT_STATE     ;HANG OUT OUR "PLAY" SHINGLE.
               BRA     PLAY_LED_SOLID       ;TURN PLAY LED ON SOLID, RETURN THROUGH.
;
                                            ;NOTE - PRO_CLICK DOES PUNCH-IN CHECKS ON FIRST CLICK -
                                            ;RECORDING ON DOWNBEAT WITH NORMAL START NOT GUARANTEED
                                            ;(YOU'D HAVE TO BE AWFULLY FAST TO PULL IT OFF ....)
;
;
;
; DO A CUED START:
;
PL_INT_60
               BSR     PLAY_LED_SOLID       ;FLAG "PLAY" AND "PAUSE" ACTIVE.
               BSR     PAUSE_LED_SOLID
               OR.B    #PLAY_MASK+PAUSE_MASK,XPORT_STATE
               BSR     LED_DIRECT           ;DIDDLE THE LEDs RIGHT NOW, BACKGROUND'S GONNA BE
                                            ;LOCKED OUT FOR A WHILE ....
               MOVE    #2700H,SR            ;FOR MAXIMUM SPEED, BLOCK ALL INTERRUPTS WHILE CUEING -
                                            ;WE'RE UNDER INTERNAL TIMEBASE, WON'T MISS ANYTHING.
               MOVE    CUE_BAR,D0           ;PASS THE CUE-TARGET BAR NUMBER IN D0.
               BSR     READ_TO_CUE_BAR      ;CHEW THROUGH SEQUENCE TO THE TARGET BAR, TRACKING
                                            ;NOTE EVENTS, TEMPO CHANGES, LOOPS AND SUCH ....
               BSR     CUED_BAR_PUNCH       ;IF RECORD OR ERASE ENABLED, PUNCH IN IF THE CUE POINT
                                            ;IS BETWEEN THE CURRENT PUNCH-IN AND PUNCH-OUT POINTS.
               MOVE    #2000H,SR            ;RE-ENABLE INTERRUPTS.
               ST      SUBFUN_INSTALL       ;UPDATE DISPLAY - IT'S PROBABLY SHOWING BARS/BEATS.
               BRA     SEND_IMMED_PTR       ;TRANSMIT MIDI SONG POINTER INDICATING OUR CUE POINT -
                                            ;GET THE OUTSIDE WORLD CAUGHT UP TO WHERE WE ARE.
;
                                            ;NOTE:  AT THIS POINT WE WAIT FOR HAND-UNPAUSE (VIA
                                            ;PAUSE SWITCH OR TAP-IN) TO GET US GOING - MEANWHILE,
                                            ;EXTERNAL SEQUENCERS (IF ANY) HAVE TIME TO RESPOND TO
                                            ;SONG POINTER.  SINCE WE'RE ALREADY CUED, THERE WON'T
                                            ;BE ANY PREGNANT PAUSE WHEN USER UNPAUSES US.
                                            ;UNPAUSE USING PAUSE SWITCH WILL TRIGGER A COUNT-IN
                                            ;BEFORE START, IF CONDITIONS CALL FOR IT.
;
;
;
; DO A COUNT-IN START:
;
PL_INT_80
               BSR     START_TC             ;TELL 6803 TO GET GOING (IT ALSO SENDS "START").
               BSR     PAUSE_TC             ;NO SOONER DO WE TELL IT TO START, THAN WE TELL IT TO
                                            ;CHILL (IT ALSO SENDS "STOP") - WE NEEDED TO SEND OUT A
                                            ;START TO GET EXTERNAL SEQUENCERS PROPERLY CUED, SINCE
                                            ;WE SEND "CONTINUE" (NOT START) WHEN COUNT-IN ENDS.
;
               BSR     SEND_MIDI_START      ;REPLICATE SIMILAR CONTROL DANCE VIA UARTS ENABLED FOR
               BSR     SEND_MIDI_STOP       ;MIDI CLOCK-OUT.
;
               BSR     PLAY_LED_SOLID       ;FLAG "PLAY" AND "PAUSE" ACTIVE -
               BSR     PAUSE_LED_SOLID      ;SET LEDs TO FOLLOW SUIT.
               OR.B    #PLAY_MASK+PAUSE_MASK,XPORT_STATE
;
               BSR     CUED_BAR_PUNCH       ;IF RECORD OR ERASE ENABLED, SEE IF WE SHOULD PUNCH IN.
;881025               BRA.S   START_COUNT_IN       ;INITIATE COUNT-IN, RETURN THROUGH.
               NOP                          ;INITIATE COUNT-IN, RETURN THROUGH.
                                            ;(THIS NOP IS A PLACE HOLDER FOR THE
                                            ;ABOVE BRA.S, WHICH ASSEMBLED AS 'NOP'
                                            ;UNDER HP64000 - STRICTLY FOR INITIAL
                                            ;LINK MAP MATCH-UP, DELETE AFTERWARDS).
;
;
;
; SET UP COUNT-IN AT CURRENT TEMPO:
;
START_COUNT_IN
               MOVE    CUR_TEMPO_USEC,D0    ;USEC/CLICK * CLICKS/COUNT (12/24 FOR 8-TH/4-TH NOTE),
               MULU    CLICKS_PER_TAP,D0    ;YIELDS USEC/COUNT ....
               LSR.L   #8,D0                ;DIVIDED BY 1024 USEC/REALTIME INTERRUPT,
               LSR.L   #2,D0                ;YIELDS REALTIME INTERRUPTS PER COUNT -
               MOVE.L  D0,LAST_TAP_LENGTH   ;SAVE THIS AS TIME BETWEEN COUNTS (METRONOME HITS),
               MOVE.L  #1,CLICK_TIME_START  ;SET COUNT-IN DAEMON TIMER FOR IMMEDIATE FIRST HIT,
               SUBQ    #1,TAP_CLICKS_LEFT   ;COUNT OFF ONE HIT (THE "EXTRA" ONE) RIGHT OFF THE BAT.
               RTS
;
;
; STOP/RESET COUNT-IN (TAP-IN TOO):
;
RESET_COUNT_IN
               CLR.L   CLICK_TIME_START     ;TURN OFF THE METRONOME-CLICK COUNT-IN DAEMON.
               CLR.L   TAP_TIME_START       ;KILL THE TIMER THAT SAYS "WE START ...... NOW!"
                                            ;(USED FOR FINAL BEAT OF BOTH COUNT-IN AND TAP-IN.)
               MOVE    TAP_SLEW_AMOUNT,TAP_CLICKS_LEFT     ;RESET THE COUNT-IN BEAT COUNT -
               ADDQ    #1,TAP_CLICKS_LEFT                  ;ADD ONE 'COS FIRST IS COUNTED OFF AS
                                                           ;SOON AS COUNT-IN GETS GOING ("BEAT 0").
               RTS
;
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; INTERNAL TIMEBASE OR CLICK SYNC -
; "PLAY" SWITCH HIT WITH "PLAY" OFF, "PAUSE" ON:
;
PLAY_INT_PAUSE
               SF      BLEED_UART_A         ;KILL FLAGS WHICH ALLOW UART HANDLERS TO DUMP BUFFERED
               SF      BLEED_UART_B         ;SEQUENCE MIDI EVENTS WITHOUT AWAITING CLICK TIMEOUT.
;
               BSR     UPDATE_REPEATS       ;MAKE SURE PLAYBACK REPEAT LOOP PARAMETERS ARE UP TO
                                            ;SNUFF - USER MAY HAVE EDITED LOOP SETTINGS FOR THE
                                            ;CURRENT SEQUENCE OR SELECTED A NEW SEQUENCE SINCE THE
                                            ;LAST TIME SEQUENCER (WAS) STOPPED.
;
               JSR     INIT_WASTE_RECORD    ;CLEAR WASTELAND - USED DURING RECORDING AND PLAYBACK -
                                            ;SET ALL RECORD VECTORS TO BUFFER NEW EVENTS THERE.
;
               JSR     SEQ1_DRD_SETUP       ;SET UP SEQUENCE READ/WRITE PROCESSES AND POINTERS.
;
               TST.B   CUE_START            ;ARE WE SUPPOSED TO START FROM USER-SELECTED CUE POINT?
               BEQ.S   PL_INT_PA_40         ;BRANCH IF NOT, CONTINUE.
               CMP     #1,CUE_BAR           ;IF YES, IS CUE POINT AT BEGINNING OF SEQUENCE ANYWAY?
               BNE.S   PL_INT_PA_60         ;BRANCH IF NOT, GO DEAL WITH FOR-REAL CUE-START.
;
;
;
; DO "NORMAL" START - NO CUE (COUNT-IN, IF ANY, COMES WHEN WE UNPAUSE):
;
PL_INT_PA_40
               BSR     START_TC             ;TELL 6803 TO GET GOING (IT ALSO SENDS "START").
               BSR     PAUSE_TC             ;NO SOONER DID WE TELL IT TO START, THAN WE TELL IT TO
                                            ;CHILL (IT ALSO SENDS "STOP") - WE NEEDED TO SEND OUT A
                                            ;START TO GET EXTERNAL SEQUENCERS PROPERLY CUED, SINCE
                                            ;WE SEND "CONTINUE" (NOT START) WHEN PAUSE IS REMOVED.
;
               BSR     SEND_MIDI_START      ;REPLICATE SIMILAR CONTROL DANCE VIA UARTS ENABLED FOR
               BSR     SEND_MIDI_STOP       ;MIDI CLOCK-OUT.
;
               BSET    #PLAY_BIT,XPORT_STATE     ;HANG OUT OUR "PLAY" SHINGLE.
               BSR     PLAY_LED_SOLID       ;TURN PLAY LED ON SOLID, RETURN THROUGH.
               BRA     CUED_BAR_PUNCH       ;IF RECORD OR ERASE ENABLED, SEE IF WE SHOULD PUNCH IN
                                            ;RIGHT AWAY - RETURN THROUGH.
;
;
;
; DO A CUED START:
;
PL_INT_PA_60
               BRA     PL_INT_60            ;PROCEDURE SAME AS IF WE WERE NOT ALREADY PAUSED -
                                            ;SINCE WE END UP PAUSED ONCE WE GET CUED.
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; INTERNAL TIMEBASE OR CLICK SYNC -
; "PLAY" SWITCH HIT WITH "PLAY" ON, "PAUSE" OFF:
;
PLAY_INT_PLAY
               TST.B   SHOWING_FF_RW        ;ARE WE IN THE MIDDLE OF FAST-WIND SWITCH TIMEOUT?
               BEQ.S   PL_INT_PL_EXIT       ;BRANCH IF NOT, JUST GET OUT O' HERE.
               MOVE    REAL_TIME,D0         ;ELSE, FORCE TIMER TO COMPLETION RIGHT NOW -
               SUB     #1024,D0             ;FOR SOME FOLK, A SECOND IS A LONG TIME TO WAIT.
               BSET    #0,D0                ;DON'T PUT TIMER COMPLETELY OUT OF COMMISSION.
               MOVE    D0,FAST_WIND_TIMER
                                            ;AWAY WE GO - LET FAST_WIND_DAEMON HAVE AT IT.
;
PL_INT_PL_EXIT
               RTS                     ;JUST LEAVE EVERYTHING ALONE -
                                       ;ALTHOUGH THIS WOULD NOT BE A BAD
                                       ;PLACE TO STICK IN A FRONT-PANEL
                                       ;"EXIT REPEAT LOOP" FEATURE - SO
                                       ;A FOOTSWITCH WOULDN'T BE NEEDED.
                                       ;MUST WATCH FOR SINGLE_STEP HERE!
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
;
;
;
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; INTERNAL TIMEBASE OR CLICK SYNC -
; "PLAY" SWITCH HIT WITH "PLAY" ON, "PAUSE" ON:
; WE'RE GOING INTO SINGLE-STEP MODE - SEE BELOW FOR FULL DISCUSSION.
;
PLAY_INT_PLAY_PAUSE
;
               TST.B   SHOWING_FF_RW        ;ARE WE IN THE MIDDLE OF FAST-WIND SWITCH TIMEOUT?
               BEQ.S   PL_INT_PP_30         ;BRANCH IF NOT, CONTINUE.
               MOVE    REAL_TIME,D0         ;ELSE, JUST FORCE TIMER TO COMPLETION RIGHT NOW -
               SUB     #1024,D0             ;FOR SOME FOLK, A SECOND IS A LONG TIME TO WAIT.
               BSET    #0,D0                ;DON'T PUT TIMER COMPLETELY OUT OF COMMISSION.
               MOVE    D0,FAST_WIND_TIMER
               BRA.S   PL_INT_PP_EXIT       ;AWAY WE GO - LET FAST_WIND_DAEMON HAVE AT IT.
;
PL_INT_PP_30
               TST.B   SINGLE_STEP          ;ARE WE SINGLE-STEPPING?
               BNE.S   PL_INT_PP_60         ;BRANCH IF YES, GO STEP LIVE-LY ONCE MORE.
;
               MOVE.L  CLICK_TIME_START,D0  ;NOT SINGLE-STEPPING - SEE WHETHER A COUNT-IN OR TAP-IN
               OR.L    TAP_TIME_START,D0    ;IS IN PROGRESS.
               BNE.S   PL_INT_PP_EXIT       ;EXIT IF YES - CAN'T BE SURE WHICH, DON'T MESS WITH IT.
;
               ST      SINGLE_STEP          ;WE BE SINGLE-STEPPIN' NOW -
                ABS_LONG
               JSR     XMIT_OLD_M_ONS       ;DRONE ANY SEQUENCE NOTES SUSTAINING AT THIS POINT.
               JSR     XMIT_OLD_P_ONS
                ABS_SHORT
;
PL_INT_PP_60
                                            ;TIME TO SINGLE-STEP:
               BSR     SEND_MIDI_CONTINUE   ;SEND "CONTINUE" VIA UARTS ENABLED FOR MIDI CLOCK OUT.
                                            ;(NOTE - MAKE SURE IT GOES OUT BEFORE CLOCKING STARTS.)
               BSR     UNPAUSE_TC           ;KICK 6803 BACK INTO GEAR (IT ALSO SENDS "CONTINUE").
               BCLR    #PAUSE_BIT,XPORT_STATE    ;TELL THE WORLD WE AIN'T PAUSED (FOR NOW).
               BSR     PAUSE_LED_OFF
                                            ;NOTE - WE LEAVE SINGLE_STEP FLAG SET, AND WE DON'T
                                            ;REPLAY SEQUENCE NOTES - IF ANY ARE SUSTAINING AT THIS
                                            ;POINT, THEY'RE ALREADY DRONING.
PL_INT_PP_EXIT
               RTS
;
;
;
; SYNOPSIS OF SINGLE-STEP SYSTEM:
;
; WHILE A SEQUENCE IS PLAYING, PAUSE SWITCH IS HIT -
; ALTERNATIVELY, PAUSE SWITCH IS HIT WHILE SEQUENCER IS IDLE, THEN PLAY
; SWITCH IS HIT.  AT THIS POINT, SEQUENCER IS CONSIDERED TO BE RUNNING,
; ALTHOUGH THE TIME CHIP IS HALTED IN OBSERVANCE OF "PAUSE" STATUS.
; IF PAUSE WAS HIT WHILE PLAYING, THEN ANY SEQUENCE NOTES CURRENTLY
; SUSTAINING HAVE BEEN GATED OFF (BUT ARE STILL LOGGED IN NOTE-ON BUFS).
; OTHERWISE, NOTHING HAS BEEN PLAYED YET, SO NO NOTES ARE LOGGED IN.
; ALSO, SINGLE_STEP FLAG IS OFF.
;
; WHILE PAUSED, PLAY SWITCH IS HIT - "PAUSE" STATE IS DETECTED.  SINCE
; SINGLE_STEP FLAG IS OFF, IT IS SET AND LOGGED-IN SEQUENCE NOTES ARE
; GATED BACK ON (SINGLE-STEP ALLOWS DRONING NOTES WHILE WAITING).
; AN "UNPAUSE" IS EXECUTED: TIME CHIP IS STARTED OR UNPAUSED (DEPENDING
; UPON WHETHER IT HAD ALREADY BEEN STARTED BEFORE PAUSING), SINGLE_STEP
; FLAG IS CLEARED.  FOLLOWING THE UNPAUSE, SINGLE_STEP FLAG IS SET AGAIN
; AND NORMAL PLAY IS ALLOWED TO RESUME - UNTIL .....
;
; WHILE PLAYING, SEQUENCER EXECUTES AUTOCORRECT INTERVAL PHASE VECTOR -
; SINGLE_STEP FLAG IS DETECTED, INVOKING EXECUTION OF A "PAUSE" FROM
; WITHIN THE PHASE VECTOR:  TIME CHIP IS STOPPED, SINGLE_STEP CLEARED.
; THE PHASE VECTOR REINSTATES THE SINGLE_STEP FLAG BEFORE TERMINATING,
; AND THE SEQUENCER SITS AND WAITS - UNTIL ....
;
; PLAY SWITCH IS HIT AGAIN (AND AGAIN AND AGAIN) - ACTION IS SAME AS ON
; THE INITIAL PLAY SWITCH STROKE WHICH ACTIVATED SINGLE-STEP MODE,
; EXCEPT THAT BECAUSE SINGLE_STEP FLAG IS ALREADY SET, LOGGED-IN SEQ
; NOTES ARE NOT GATED ON ANEW, ON THE ASSUMPTION THAT THEY ARE ALREADY
; DRONING.  THE BEAT GOES ON, AND THE BEAT GOES ON ....
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "PLAY SWITCH HANDLER FOR MIDI/SMPTE SYNC"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; EXTERNAL MIDI OR SMPTE SYNC -
; "PLAY" SWITCH HIT WITH "PLAY" OFF:  ENABLE PLAY, PUT US "ON-LINE".
; NOTE THAT THIS IS THE ONLY ACTION CASE FOR "PLAY" SWITCH WHEN WE ARE
; SYNC'ED TO EXTERNAL MIDI OR SMPTE -
; UNDER EXTERNAL MIDI OR SMPTE CONTROL, "PLAY" OFF / "PAUSE" ON STATE
; DOES NOT EXIST - "PLAY" MEANS WE ARE ON-LINE AND SUBJECT EXCLUSIVELY
; TO EXTERNAL CONTROL.
; NORMALLY, ONLY THE "STOP" SWITCH CAN BRING US BACK TO LOCAL REALITY
; AND DISABLE "PLAY" STATUS - THIS CAN HAPPEN AUTOMATICALLY ONLY IN THE
; CASE WHERE AN ATTEMPT IS MADE TO PLAY AN EMPTY SEQUENCE (OR #99, THE
; "NULL" SEQUENCE) CUED VIA SONG-MODE, EXTERNAL SONG-SELECT OR MANUALLY
; BY THE USER.
;
PLAY_EXTERNAL
               SF      BLEED_UART_A         ;KILL FLAGS WHICH ALLOW UART HANDLERS TO DUMP BUFFERED
               SF      BLEED_UART_B         ;SEQUENCE MIDI EVENTS WITHOUT AWAITING CLICK TIMEOUT.
;
               BSR     UPDATE_REPEATS       ;MAKE SURE PLAYBACK REPEAT LOOP PARAMETERS ARE UP TO
                                            ;SNUFF - USER MAY HAVE EDITED LOOP SETTINGS FOR THE
                                            ;CURRENT SEQUENCE OR SELECTED A NEW SEQUENCE SINCE THE
                                            ;LAST TIME SEQUENCER (WAS) STOPPED.
;
               JSR     INIT_WASTE_RECORD    ;CLEAR WASTELAND - USED DURING RECORDING AND PLAYBACK -
                                            ;SET ALL RECORD VECTORS TO BUFFER NEW EVENTS THERE.
;
               JSR     SEQ1_DRD_SETUP       ;SET UP SEQUENCE READ/WRITE PROCESSES AND POINTERS.
;
               BSR     START_TC             ;GIVE 6803 CONDITION "GREEN":
                                            ;UNDER EXTERNAL MIDI SYNC, 6803 WILL NOT LET US SEE
                                            ;MIDI SYSTEM REALTIME BYTES OTHER THAN "START"
                                            ;UNTIL WE HAVE GIVEN IT THE HIGH-SIGN -
                                            ;AND WE'D LIKE TO SEE MIDI "CONTINUE" ALSO, IN CASE
                                            ;THAT HAPPENS TO COME FIRST (FOR SONG-POINTER CUEING).
                                            ;UNDER SMPTE SYNC, THIS INDUCES THE 6803 TO SEND US ANY
                                            ;APPROPRIATE CONTROL/STATUS MESSAGES - WITHOUT THIS,
                                            ;IT KEEPS THE NEWS TO ITSELF.
;
                                            ;WASTE SOME TIME TO ENSURE THAT 6803 SENDS OUT "STOP"
                                            ;AFTER (NOT BEFORE) THE "START" BYTE - YES, THIS IS
                                            ;ACTUALLY NEEDED ..... THANKS TO SMPTE 1.3 ....
               MOVE    #5000,D0             ;SEVERAL MILLISECONDS OUGHTA BE COOL - INSTANTANEOUS
                                            ;ACTION ON THIS SWITCH NOT EXPECTED ....
PLAY_EXT_10
               DBRA    D0,PLAY_EXT_10       ;SOON, MON, SOON ....
;
               BSR     SEND_6803_STOP       ;6803 (SMPTE 1.3) SENDS MIDI "START" VIA ITS UART WHEN
                                            ;IT GETS THE "START" COMMAND - EVEN THOUGH IT'S UNDER
                                            ;EXTERNAL CONTROL AND SHOULD SEND NOTHING ON ITS OWN.
                                            ;WE SEND A "STOP" BYTE VIA 6803 UART TO CANCEL "START".
;
                                            ;MAKE SHURA VACUPLA THINGS, STATUS-WISE:
               CLR     CLICKS_PENDING       ;WE HAVE NO PENDING SEQUENCER CLOCK-SERVICE REQUESTS.
               SF      PLAYED_TO_END        ;WE HAVEN'T (LATELY) PLAYED/CUED TO END OF SEQ/SONG.
;
               CMP     #4,CLOCK_IN_MODE     ;FROM HERE, MINOR DIVERGENCES FOR MIDI VS. SMPTE SYNC -
               BEQ.S   PLAY_EXT_20          ;BRANCH FOR THE SMPTE CASE, ELSE ASSUME MIDI.
;
;
;
; MIDI-SHIT:
;
                                            ;ACUPLA MORE STATUS THINGS:
               SF      CUEING_TO_SPP        ;NOT HI-SPEED CUEING IN RESPONSE TO MIDI SONG POINTER.
               CLR.L   CUR_SPP_CLICK        ;NO MIDI SONG-POINTER CUE TARGET CURRENTLY PENDING.
;
                                            ;MAINTAIN PROPER APPEARANCES TO THE WORLD:
               OR.B    #PLAY_MASK+PAUSE_MASK,XPORT_STATE   ;TELL THE WORLD WE'RE ALIVE AND PAUSED.
               BSR     PLAY_LED_SLOW        ;"PLAY" LED SLOW-FLASHES UNTIL "START" OR "CONTINUE" -
               BRA     PAUSE_LED_SOLID      ;"PAUSE" LED IS ON SOLID UNTIL THAT POINT.
;
;15JUN               BRA.S   CUED_BAR_PUNCH       ;DO ANY PUNCHING-IN APPROPRIATE AT THIS TIME.
;              MIDI "START" OR "CONTINUE" (OR USER'S FINGER) WILL DO THIS ....
;
                                            ;AND THERE HE SAT .... WAITING FOR A MIDI "START" OR
                                            ;"CONTINUE" MESSAGE TO ENABLE MIDI CLOCKS TO GET THRU -
                                            ;TRIGGERING LEVEL 2 INTERRUPTS TO STEP HIM ALONG.
                                            ;ONLY THE "STOP" SWITCH COULD GET HIM BACK NOW ....
;
;
;
; SMPTE-SHIT:
;
PLAY_EXT_20
               SF      CHASING_SMPTE        ;MAKE SURE WE DON'T THINK WE'RE SYNC-CHASING ALREADY.
               OR.B    #PLAY_MASK+PAUSE_MASK,XPORT_STATE   ;TELL THE WORLD WE'RE ALIVE AND PAUSED -
                                                           ;6803 WILL BE THE ONE TO UNPAUSE US.
               BSR     PAUSE_LED_SOLID      ;"PAUSE" LED IS ON SOLID UNTIL THAT POINT.
               TST.B   SMPTE_SYNC           ;NOW - OUT BY THE 6803, DO WE HAVE SMPTE SYNC?
               BNE     PLAY_LED_FAST        ;IF YES, INDICATE VIA "PLAY" LED FAST-FLASH - ELSE,
               BRA     PLAY_LED_SLOW        ;"PLAY" LED SLOW-FLASHES UNTIL 6803 SAYS "I GOT IT!"
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "AUTOMATED BAR/CLICK PUNCH-IN FOLLOWING SEQ CUEING"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; BAR/CLICK-BASED TESTS FOR PUNCH-IN FOLLOWING BAR/CLICK CUEING -
; E.G., FAST-WIND, PLAY-FROM-CUE, SONG-POSITION POINTER CUE.
; NOTE: LOGICAL AFFRONTERY TO CALL HERE AT ANY OTHER TIME!
;
; WE DO PUNCH-IN ONLY, SINCE IT IS ASSUMED THAT WE ARE NOT PUNCHED IN
; WHEN WE COME HERE - WE'RE JUST TRYING TO DECIDE IF WE SHOULD BE.
;
; NO TRANSCRIPTION OF SMPTE TIME TO SMPTE-FORMAT PUNCH-IN SETTING IS
; DONE IF WE PUNCH IN BECAUSE 1) WE'RE PROBABLY NOT AT THE PUNCH-IN
; POINT, AND 2) WE DON'T KNOW THE REAL SMPTE TIME ANYWAY, SINCE WE'RE
; NOT UNDER EXTERNAL SMPTE OR MTC SYNC.
;
; MAJOR IMPORTANT WARNING:  IMPLICIT IN THE FOLLOWING ROUTINES IS THAT
; PUNCH-OUT POINT IS ALWAYS LATER THAN PUNCH-IN POINT - EVEN BEING EQUAL
; IS TO BE CONSIDERED UNCOOL (MAJOR UNCOOL) - DON'T LET IT HAPPEN!
;
; ALWAYS DESTROYS D0, PLUS POSSIBLE OTHERS IF PUNCH-IN IS DONE.
;
CUED_BAR_PUNCH
               MOVE.B  CUEING_TO_SPP,D0     ;IF IN THE MIDDLE OF SOME SORT OF HI-SPEED CUEING,
               OR.B    CHASING_SMPTE,D0     ;FOR GOD'S SAKE DON'T PUNCH IN!
               BNE.S   CUED_BP_EXIT
;
               MOVE.B  XPORT_STATE,D0                 ;SEE WHAT'S GOING ON UP THERE -
               AND     #RECORD_MASK+ERASE_MASK,D0     ;IS RECORD OR ERASE ENABLED?
               BEQ.S   CUED_BP_EXIT                   ;EXIT WITHOUT ACTION IF NEITHER ENABLED.
;
               TST.B   PLAYED_TO_END        ;WE MAY BE GETTING CALLED BECAUSE WE'VE PLAYED TO THE
               BNE.S   CUED_BP_EXIT         ;END OF A SEQUENCE OR SONG UNDER SMPTE/MIDI SYNC -
                                            ;WHEN THIS HAPPENS, WE CUE UP AT THE START OF THE
                                            ;CURRENT SEQUENCE AND WAIT TO BE TOLD TO START AGAIN,
                                            ;BUT WE SURELY OUGHT NOT TO PUNCH IN UNTIL THAT TIME.
;
               TST.B   USER_PUNCHED         ;HAS USER DONE MANUAL PUNCH-IN/OUT ON CURRENT RUN?
               BNE     PUNCH_IN_NOW         ;BRANCH IF YES, GO PUNCH IN - AUTOMATION HAS BEEN
                                            ;OVERRIDDEN, SO ENABLE IMPLIES PUNCHED-IN ....
;
               TST.B   BAR_OR_SMPTE_FLAG    ;TEST BASED ON BAR/CLICK OR SMPTE TIME?
               BNE.S   CUED_BP_EXIT         ;RETURN IF PUNCH-IN/OUT KEYED TO SMPTE TIME.
;
               MOVE.L  NOW_BAR,D0           ;LOAD CURRENT BAR/CLICK, CHECK AROUND -
               CMP.L   PUNCH_IN_BAR,D0      ;ARE WE PAST PUNCH-IN BAR/CLICK?
               BCS.S   CUED_BP_EXIT         ;EXIT IF NOT - TOO EARLY - WE STAY PUNCHED OUT.
               CMP.L   PUNCH_OUT_BAR,D0     ;PAST PUNCH-IN POINT - ARE WE BEFORE PUNCH-OUT POINT?
               BCC.S   CUED_BP_EXIT         ;EXIT IF NOT - TOO LATE - WE STAY PUNCHED OUT.
               BRA     PUNCH_IN_NOW         ;ELSE - GO PUNCH IN.
;
CUED_BP_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "COUNT-IN/TAP-IN START SPECIAL ENTRY POINTS"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; SPECIAL ENTRY FOR TAP-IN/COUNT-IN START:
; A LOT LIKE REGULAR "PLAY" SWITCH HIT WITH "PLAY" AND "PAUSE" OFF -
; MINUS ALL OF THE SPURIOUS TESTS AND BRANCHES.
;
TAP_IN_PLAY
               TST     TAP_TRACK_ON_FLAG    ;ARE WE IN TAP-TRACK RECORD MODE?
               BNE.S   TAP_PL_EXIT          ;BRANCH IF YES, EXIT WITHOUT ACTION.
;
               BSR     RESET_COUNT_IN       ;RESET COUNT-IN/TAP-IN FOR THE NEXT TIME ....
;
               TST     NOW_SEQ_STATUS       ;IF THIS SEQUENCE DOES NOT EXIST,
               BEQ.S   TAP_PL_EXIT          ;EXIT WITHOUT ACTION.
;
               SF      BLEED_UART_A         ;KILL FLAGS WHICH ALLOW UART HANDLERS TO DUMP BUFFERED
               SF      BLEED_UART_B         ;SEQUENCE MIDI EVENTS WITHOUT AWAITING CLICK TIMEOUT.
;
               BSR     UPDATE_REPEATS       ;MAKE SURE PLAYBACK REPEAT LOOP PARAMETERS ARE UP TO
                                            ;SNUFF - USER MAY HAVE EDITED LOOP SETTINGS FOR THE
                                            ;CURRENT SEQUENCE OR SELECTED A NEW SEQUENCE SINCE THE
                                            ;LAST TIME SEQUENCER (WAS) STOPPED.
;
               JSR     INIT_WASTE_RECORD    ;CLEAR WASTELAND - USED DURING RECORDING AND PLAYBACK -
                                            ;SET ALL RECORD VECTORS TO BUFFER NEW EVENTS THERE.
;
               JSR     SEQ1_DRD_SETUP       ;SET UP SEQUENCE READ/WRITE PROCESSES AND POINTERS.
;
               BSR     SEND_MIDI_START      ;SEND "START" VIA UARTS ENABLED FOR MIDI CLOCK OUT.
                                            ;(NOTE - MAKE SURE IT GOES OUT BEFORE CLOCKING STARTS.)
               BSR     START_TC             ;TELL 6803 TO GET GOING (IT ALSO SENDS "START").
               BSET    #PLAY_BIT,XPORT_STATE     ;HANG OUT OUR "PLAY" SHINGLE.
               BRA     PLAY_LED_SOLID       ;TURN PLAY LED ON SOLID, RETURN THROUGH.
;
TAP_PL_EXIT
                                            ;NOTE - PRO_CLICK DOES PUNCH-IN CHECKS ON FIRST CLICK -
                                            ;RECORDING ON DOWNBEAT WITH NORMAL START NOT GUARANTEED
                                            ;(YOU'D HAVE TO BE AWFULLY FAST TO PULL IT OFF ....)
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; SPECIAL ENTRY FOR TAP-IN/COUNT-IN UNPAUSE:
; A LOT LIKE REGULAR "PAUSE" SWITCH HIT WITH "PAUSE" ON -
; MINUS ALL OF THE SPURIOUS TESTS AND BRANCHES.
;
TAP_IN_UNPAUSE
               TST     TAP_TRACK_ON_FLAG    ;ARE WE IN TAP-TRACK RECORD MODE?
               BNE.S   TAP_UNP_EXIT         ;BRANCH IF YES, EXIT WITHOUT ACTION.
;
               BSR     RESET_COUNT_IN       ;RESET COUNT-IN/TAP-IN FOR THE NEXT TIME ....
;
               TST     NOW_SEQ_STATUS       ;IF THIS SEQUENCE DOES NOT EXIST,
               BEQ.S   TAP_UNP_EXIT         ;THEN WE HAVE NOTHING TO DO.
;
               BTST    #PLAY_BIT,XPORT_STATE     ;IS "PLAY" ENABLED?
               BEQ.S   TAP_UNP_A0                ;BRANCH IF NOT - DO THE SUPERFICIAL-TYPE UNPAUSE.
;
TAP_UNP_20
               TST.B   SHOWING_FF_RW        ;ARE WE IN THE MIDDLE OF FAST-WIND SWITCH TIMEOUT?
               BNE.S   TAP_UNP_EXIT         ;EXIT IF YES, DON'T FUCK AROUND WITH IT.
;
               MOVE.L  CLICK_TIME_START,D0  ;IS A COUNT-IN OR TAP-IN START PENDING?
               OR.L    TAP_TIME_START,D0
               BNE.S   TAP_UNP_EXIT         ;EXIT IF YES - CAN'T BE SURE WHICH, DON'T MESS WITH IT.
;
               TST.B   SINGLE_STEP          ;WERE WE DOING SINGLE-STEP?
               BNE.S   TAP_UNP_60           ;BRANCH IF YES, DO UNPAUSE FROM SINGLE-STEP.
;
                                            ;NOT SINGLE-STEPPING - WE'RE IN A "NORMAL" PAUSE STATE:
               TST     HOLDING_EVENT        ;HAVE WE GOTTEN GOING INTO THE SEQUENCE AT ALL?
               BEQ.S   TAP_UNP_60           ;BRANCH IF NOT, NO SUSTAINING NOTES TO REAWAKEN -
                ABS_LONG
               JSR     XMIT_OLD_M_ONS       ;ELSE, GATE ON WHATEVER IS SUPPOSED TO BE SUSTAINING
               JSR     XMIT_OLD_P_ONS       ;AT THIS POINT IN THE SEQUENCE (PAUSE SNUFFED THEM).
                ABS_SHORT
;
TAP_UNP_60
                                            ;COME STRAIGHT HERE IF UNPAUSING FROM SINGLE-STEP MODE:
               SF      SINGLE_STEP          ;FIRST OFF - WE'RE NOT SINGLE-STEPPING ANYMORE.
               BSR     SEND_MIDI_CONTINUE   ;SEND "CONTINUE" VIA UARTS ENABLED FOR MIDI CLOCK OUT.
                                            ;(NOTE - MAKE SURE IT GOES OUT BEFORE CLOCKING STARTS.)
               BSR     SEND_MIDI_CLOCK      ;EMPIRICAL TWEEK - MIDI UARTS NEED FIRST CLOCK SENT
                                            ;"BY HAND" IN ORDER TO STAY CAUGHT UP UPON UNPAUSE.
               BSR     UNPAUSE_TC           ;KICK 6803 BACK INTO GEAR (ALSO SENDS MIDI "CONTINUE").
;
;
TAP_UNP_A0
               BCLR    #PAUSE_BIT,XPORT_STATE    ;GET RID OF "PAUSE" STATUS BIT,
               BSR     PAUSE_LED_OFF             ;TURN OFF "PAUSE" LED.
;
;
TAP_UNP_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "PAUSE SWITCH HANDLING"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; HANDLER FOR PAUSE SWITCH:
;
PAUSE_SWITCH
               TST     TAP_TRACK_ON_FLAG    ;ARE WE IN TAP-TRACK RECORD MODE?
               BEQ.S   PAUSE_SW_20          ;BRANCH IF NOT, CONTINUE.
                ABS_LONG
               JMP     TAP_RECORD           ;ELSE - ACTIVATE TAP-TRACK RECORDING, BEGONE.
                ABS_SHORT
;
PAUSE_SW_20
               MOVE    CLOCK_IN_MODE,D0     ;ARE WE OPERATING UNDER INTERNAL TIMEBASE?
               BEQ.S   PAUSE_SW_30          ;BRANCH IF YES - CLEARANCE GRANTED.
               CMP     #3,D0                ;ELSE - HOW ABOUT CLICK SYNC?
               BNE.S   PAUSE_SW_EXIT        ;EXIT IF NOT - PAUSE SWITCH NOT RELEVANT IN ANY WAY,
                                            ;APART FROM ABOVE TAP-RECORD EXCEPTION (SMPTE OKAY).
;
PAUSE_SW_30
               TST     NOW_SEQ_STATUS       ;IF THIS SEQUENCE DOES NOT EXIST,
               BEQ.S   PAUSE_SW_EXIT        ;THEN WE HAVE NOTHING TO DO.
;
               CLR     D0                        ;INITIALIZE BRANCH TABLE INDEX -
               BTST    #PLAY_BIT,XPORT_STATE     ;IS "PLAY" STATUS ALREADY ENABLED?
               BEQ.S   PAUSE_SW_40               ;BRANCH IF NOT,
               ADDQ    #4,D0                     ;ELSE BUMP THE OFFSET UP ACCORDINGLY.
PAUSE_SW_40
               BTST    #PAUSE_BIT,XPORT_STATE    ;IS "PAUSE" STATUS ACTIVE?
               BEQ.S   PAUSE_SW_60               ;BRANCH IF NOT,
               ADDQ    #2,D0                     ;ELSE BUMP THE OFFSET UP ACCORDINGLY.
PAUSE_SW_60
               MOVE    PAUSE_JUMP_TBL(PC,D0),A0  ;ALL SET - FETCH APPROPRIATE POINTER,
               JMP     (A0)                      ;GO TO IT, JACQUES.
;
;
PAUSE_SW_EXIT
               RTS                          ;SOUR GRAPES, I GUESS.
;
;
PAUSE_JUMP_TBL
                                            ;INTERNAL TIMEBASE OR CLICK SYNC:
               DC.W    PAUSE_INT            ;"PLAY" WAS OFF, "PAUSE" WAS OFF.
               DC.W    PAUSE_INT_PAUSE      ;"PLAY" WAS OFF, "PAUSE" WAS ON.
               DC.W    PAUSE_INT_PLAY       ;"PLAY" WAS ON, "PAUSE" WAS OFF.
               DC.W    PAUSE_INT_PLAY_PAUSE ;"PLAY" WAS ON, "PAUSE" WAS ON.
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; INTERNAL TIMEBASE - PAUSE SWITCH HIT WITH "PLAY" OFF, "PAUSE" OFF:
;
PAUSE_INT
               BSET    #PAUSE_BIT,XPORT_STATE    ;SET "PAUSE" STATUS BIT,
               BRA     PAUSE_LED_SOLID           ;PUT "PAUSE" LED ON SOLID AND RETURN THROUGH.
;
                                                 ;NOTE - ALL THIS MEANS IS THAT TRANSPORT SHOULD
                                                 ;REMAIN PAUSED IF PLAY SWITCH IS HIT.
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
;
;
;
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; INTERNAL TIMEBASE - PAUSE SWITCH HIT WITH "PLAY" OFF, "PAUSE" ON:
;
PAUSE_INT_PAUSE
               BCLR    #PAUSE_BIT,XPORT_STATE    ;CLEAR "PAUSE" STATUS BIT,
               BRA     PAUSE_LED_OFF             ;TURN "PAUSE" LED OFF AND RETURN THROUGH.
;
                                                 ;WELL, WE WEREN'T DOING ANYTHING ANYWAY ....
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
;
;
;
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; INTERNAL TIMEBASE - PAUSE SWITCH HIT WITH "PLAY" ON, "PAUSE" OFF:
;
PAUSE_INT_PLAY
               TST.B   SHOWING_FF_RW        ;ARE WE IN THE MIDDLE OF FAST-WIND SWITCH TIMEOUT?
               BNE.S   PA_INT_PL_EXIT       ;EXIT IF YES, DON'T FUCK AROUND WITH IT.
;
               TST.B   SINGLE_STEP          ;WHOA, HOLD IT - ARE WE SINGLE_STEPPING?
               BNE.S   PA_INT_PL_EXIT       ;BRANCH IF YES, EXIT WITHOUT ACTION - WE'LL BE PAUSING
                                            ;AUTOMATICALLY SOON, DON'T CONFUSE MATTERS.
;
                                            ;ELSE, WE'RE PAUSING:
               BSR     PAUSE_TC             ;TELL 6803 TO COOL IT (ALSO SENDS MIDI "STOP").
               BSR     SEND_MIDI_STOP       ;SEND "STOP" VIA MIDI UARTS ENABLED FOR MIDI CLOCK OUT.
               BSR     WAIT_AND_OFF         ;GATE OFF ANY SUSTAINING SEQUENCE NOTES.
               BSET    #PAUSE_BIT,XPORT_STATE    ;AND, TELL THE WORLD - SET STATUS BIT,
               BSR     PAUSE_LED_SOLID           ;PUT PAUSE LED ON SOLID.
;
PA_INT_PL_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; INTERNAL TIMEBASE - PAUSE SWITCH HIT WITH "PLAY" ON, "PAUSE" ON:
;
PAUSE_INT_PLAY_PAUSE
;
               TST.B   SHOWING_FF_RW        ;ARE WE IN THE MIDDLE OF FAST-WIND SWITCH TIMEOUT?
               BNE     PA_INT_PP_EXIT       ;EXIT IF YES, DON'T FUCK AROUND WITH IT.
;
               MOVE.L  CLICK_TIME_START,D0  ;IS A COUNT-IN OR TAP-IN START PENDING?
               OR.L    TAP_TIME_START,D0
               BNE.S   PA_INT_PP_EXIT       ;EXIT IF YES - CAN'T BE SURE WHICH, DON'T MESS WITH IT.
;
               TST.B   SINGLE_STEP          ;WERE WE DOING SINGLE-STEP?
               BNE.S   PA_INT_PP_60         ;BRANCH IF YES, DO UNPAUSE FROM SINGLE-STEP.
;
                                            ;NO COUNT-IN OR TAP-IN PENDING, NOT SINGLE-STEPPING -
                                            ;IN OTHER WORDS, WE'RE IN A "NORMAL" PAUSE STATE.
                                            ;SEE IF WE SHOULD START A COUNT-IN TO UNPAUSE:
;
               CMP     #1,COUNT_IN_METHOD   ;FIRST OF ALL - IS COUNT-IN ENABLED?
               BNE.S   PA_INT_PP_40         ;BRANCH IF NOT, GO UNPAUSE DIRECTLY.
;
               CMP     #3,CLOCK_IN_MODE     ;COUNT-IN OPTION SELECTED - BUT ARE WE IN CLICK SYNC?
               BEQ.S   PA_INT_PP_40         ;BRANCH IF YES - COUNT-IN DOESN'T SYNC TO CLICKS,
                                            ;SO LET'S NOT BOTHER WITH IT.
;
               MOVE.B  XPORT_STATE,D0       ;COUNT-IN IS ENABLED - BUT WHAT ABOUT RECORD/ERASE?
               AND     #RECORD_MASK+ERASE_MASK,D0
               BEQ.S   PA_INT_PP_40         ;BRANCH IF NEITHER IS ENABLED, FORGET COUNT-IN -
                                            ;DON'T WASTE EVERYONE'S TIME AND PATIENCE ....
;
                                            ;STILL CONSIDERING COUNT-IN UNPAUSE - BUT IT WOULD BE
                                            ;CONFUSING IF WE'RE NOT PAUSED AT THE START OF A BAR:
               TST     HOLDING_EVENT        ;PAUSED AT VERY BEGINNING OF SEQUENCE?
               BEQ.S   PA_INT_PP_80         ;BRANCH IF YES, GOOD SPOT FOR COUNT-IN UNPAUSE.
               TST     NOW_CLICK            ;ARE WE PAUSED AT THE BEGINNING OF A LATER BAR?
               BEQ.S   PA_INT_PP_80         ;BRANCH IF YES, ALSO GOOD SPOT FOR COUNT-IN UNPAUSE.
;
;
;
PA_INT_PP_40
                                            ;NOT GONNA COUNT-IN, WE'RE UNPAUSING RIGHT NOW:
               TST     HOLDING_EVENT        ;HAVE WE GOTTEN GOING INTO THE SEQUENCE AT ALL?
               BEQ.S   PA_INT_PP_60         ;BRANCH IF NOT, NO SUSTAINING NOTES TO REAWAKEN -
                ABS_LONG
               JSR     XMIT_OLD_M_ONS       ;ELSE, GATE ON WHATEVER IS SUPPOSED TO BE SUSTAINING
               JSR     XMIT_OLD_P_ONS       ;AT THIS POINT IN THE SEQUENCE (PAUSE SNUFFED THEM).
                ABS_SHORT
;
PA_INT_PP_60
                                            ;COME STRAIGHT HERE IF UNPAUSING FROM SINGLE-STEP MODE:
               SF      SINGLE_STEP          ;FIRST OFF - WE'RE NOT SINGLE-STEPPING ANYMORE.
               BSR     SEND_MIDI_CONTINUE   ;SEND "CONTINUE" VIA UARTS ENABLED FOR MIDI CLOCK OUT.
                                            ;(NOTE - MAKE SURE IT GOES OUT BEFORE CLOCKING STARTS.)
               BSR     SEND_MIDI_CLOCK      ;EMPIRICAL TWEEK - MIDI UARTS NEED FIRST CLOCK SENT
                                            ;"BY HAND" IN ORDER TO STAY CAUGHT UP UPON UNPAUSE.
               BSR     UNPAUSE_TC           ;KICK 6803 BACK INTO GEAR (ALSO SENDS MIDI "CONTINUE").
               BCLR    #PAUSE_BIT,XPORT_STATE    ;GET RID OF "PAUSE" STATUS BIT.
               BRA     PAUSE_LED_OFF             ;TURN OFF "PAUSE" LED, RETURN THROUGH.
;
;
;
PA_INT_PP_80
                                            ;WE'RE GONNA UNPAUSE VIA COUNT-IN, START 'ER UP:
               BSR     PAUSE_LED_FAST       ;PAUSE LED TWINKLES DURING COUNT-IN "QUASI-PAUSE" -
                                            ;SINCE "PAUSE" SWITCH IS BLOCKED DURING THIS TIME.
               BSR     START_COUNT_IN       ;INITIATE COUNT-IN.
;
                                            ;NOTE - AUTO-UNPAUSE WILL OCCUR AT END OF COUNT-IN.
;
;
PA_INT_PP_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; AUTOMATIC PAUSE INVOKED BY SEQUENCER SINGLE-STEP OPERATION -
; SEQUENCER PHASE VECTOR EXECUTING AT AN AUTOCORRECT INTERVAL HAS SEEN
; THE SINGLE_STEP FLAG SET, AND WANTS THE SEQUENCER TO PARK THERE.
;
; NOTE THAT THIS IS CALLED FROM THE MIDDLE OF THE CLICK PROCESSOR,
; SO WE TAKE PAINS TO BE SMOOTH WITH REGISTERS - NONE ARE AFFECTED.
;
SNGL_STEP_PAUSE
               BSR     PAUSE_TC             ;HALT TIMING CHIP - SEND MIDI "STOP" VIA 6803 UART.
               BSR     SEND_MIDI_STOP       ;SEND "STOP" TO A & B MIDI UARTS ALSO, IF MIDI CLOCKING
                                            ;IS ENABLED THROUGH ONE OR BOTH OF THEM.
               BSET    #PAUSE_BIT,XPORT_STATE    ;SET "PAUSE" STATUS BIT,
               BRA     PAUSE_LED_SOLID           ;PUT PAUSE LED ON SOLID - RETURN THROUGH.
;
                                            ;NOTE - SEQUENCE NOTES SUSTAINED AT THIS POINT IN
                                            ;SEQUENCE ARE ALLOWED TO DROOOOOONE .......
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "RECORD SWITCH HANDLER"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; HANDLER FOR RECORD SWITCH:
;
RECORD_SWITCH
               TST     TAP_TRACK_ON_FLAG    ;ARE WE IN TAP-TRACK RECORD MODE?
               BEQ.S   RECORD_SW_20         ;BRANCH IF NOT, CONTINUE.
                ABS_LONG
               JMP     TAP_RECORD           ;ELSE - ACTIVATE TAP-TRACK RECORDING, BEGONE.
                ABS_SHORT
;
RECORD_SW_20
               TST.B   SHOWING_FF_RW        ;ARE WE IN THE MIDDLE OF FAST-WIND SWITCH TIMEOUT?
               BNE     RECORD_SW_EXIT       ;EXIT IF YES, DON'T FUCK AROUND WITH IT.
;
               MOVE.B  CUEING_TO_SPP,D0     ;IF IN THE MIDDLE OF SOME SORT OF HI-SPEED CUEING,
               OR.B    CHASING_SMPTE,D0     ;JUST TUNE THIS SWITCH OUT COMPLETELY.
               BNE     RECORD_SW_EXIT
;
               TST     NOW_SEQ_STATUS       ;DOES THE CURRENT SEQUENCE EXIST?
               BNE.S   RECORD_SW_40         ;BRANCH IF YES, GO ON AHEAD -
                ABS_LONG
               JSR     FORCED_ALLOCATE      ;ELSE - TRY TO CREATE IT NOW, USING CURRENT PARAMETERS.
                ABS_SHORT
               TST     NOW_SEQ_STATUS       ;WELL, HOW'D WE DO?
               BEQ.S   RECORD_SW_EXIT       ;EXIT IF STILL NONEXISTENT (PROBABLY NOT ENOUGH ROOM).
;
RECORD_SW_40
               MOVE.B  XPORT_STATE,D0       ;HANDLE THE VARIOUS POSSIBLE CASES:
               BTST    #RECORD_BIT,D0       ;IS "RECORD" ENABLED?
               BNE.S   RECORD_SW_C0         ;BRANCH IF YES.
               TST.B   SEQ_MEM_FULL         ;"RECORD" NOT ENABLED - IS THERE ENOUGH ROOM TO RECORD?
               BNE.S   RECORD_SW_EXIT       ;EXIT IF NOT - NO FURTHER ACTION.
               BTST    #ERASE_BIT,D0        ;"RECORD" NOT ENABLED, SPACE EXISTS - "ERASE" ENABLED?
               BNE.S   RECORD_SW_80         ;BRANCH IF YES.
               BTST    #PLAY_BIT,D0         ;"RECORD", "ERASE" BOTH DISABLED - HOW ABOUT "PLAY"?
               BNE.S   RECORD_SW_60         ;BRANCH IF YES.
;
;
;
;
; RECORD HIT WITH "PLAY"/"ERASE"/"RECORD" ALL OFF:
;
               BSET    #RECORD_BIT,XPORT_STATE   ;ENABLE RECORD,
               BRA     RECORD_LED_SLOW           ;SET "RECORD" LED INTO SLOW-FLASH - RETURN THRU.
                                                 ;(WE'RE READY TO RECORD, IF ANYTHING HAPPENS.)
;
;
;
;
; RECORD SWITCH HIT WITH "PLAY" ON, "ERASE"/"RECORD" OFF:
;
RECORD_SW_60
               TST.B   NOW_REPEATING        ;ARE WE IN THE MIDST OF REPEAT-LOOP PLAYBACK MODE?
               BNE.S   RECORD_SW_EXIT       ;EXIT IF YES, RECORD NOT ALLOWED.
               BSET    #RECORD_BIT,XPORT_STATE   ;ELSE - TELL THE MAN WHO TO PUNCH IN,
               ST      USER_PUNCHED         ;NOTE THAT MANUAL PUNCH-IN HAS BEEN DONE - AUTO PUNCH
                                            ;IN/OUT IS NOW DEFEATED UNTIL SEQUENCER IS STOPPED,
                                            ;AND PLAYBACK DOES RECORD-LOOP AT END EVEN IF WE ARE
                                            ;STILL PUNCHED OUT WHEN WE GET THERE.
               BRA.S   PUNCH_IN_NOW         ;GO PUNCH IT IN, RETURN THROUGH.
                                            ;(WE'RE RECORDING NOW, MAKE NO MISTAKE.)
;
;
;
;
; RECORD SWITCH HIT WITH "ERASE" ENABLED:
;
RECORD_SW_80
               TST.B   ERASING              ;WAS "ERASE" ACTUALLY PUNCHED IN?
               BEQ.S   RECORD_SW_A0         ;BRANCH IF NOT - "RECORD" WON'T BE EITHER.
               BSR     MANUAL_PUNCH_OUT          ;ELSE - PUNCH "ERASE" OUT (KILL IT, ACTUALLY),
               BSET    #RECORD_BIT,XPORT_STATE   ;PROVIDE INSTRUCTIONS FOR MR. PUNCH-IN,
               BRA.S   PUNCH_IN_NOW              ;GO PUNCH "RECORD" IN - RETURN THROUGH.
;
RECORD_SW_A0
               BCLR    #ERASE_BIT,D0        ;"ERASE" NOT PUNCHED IN - JUST STEAL "READY" STATUS.
               BSET    #RECORD_BIT,D0
               MOVE.B  D0,XPORT_STATE
               BSR     ERASE_LED_OFF        ;TURN HIS LED OFF,
               BRA     RECORD_LED_SLOW      ;PUT OURS IN SLOW-FLASH MODE - RETURN THROUGH.
;
;
;
;
; RECORD SWITCH HIT WITH "RECORD" ENABLED:
;
RECORD_SW_C0
               TST.B   RECORDING            ;WAS "RECORD" ACTUALLY PUNCHED IN?
               BNE.S   MANUAL_PUNCH_OUT     ;BRANCH IF YES - PUNCH IT OUT (KILL IT), RETURN THRU.
               BTST    #PLAY_BIT,D0         ;"RECORD" NOT PUNCHED IN - IS "PLAY" ENABLED?
               BEQ.S   RECORD_SW_E0         ;BRANCH IF NOT, JUST KILL RECORD ENABLE - ELSE,
               ST      USER_PUNCHED         ;NOTE THAT MANUAL PUNCH-IN HAS BEEN DONE - AUTO PUNCH
                                            ;IN/OUT IS NOW DEFEATED UNTIL SEQUENCER IS STOPPED,
                                            ;AND PLAYBACK DOES RECORD-LOOP AT END EVEN IF WE ARE
                                            ;STILL PUNCHED OUT WHEN WE GET THERE.
               BRA.S   PUNCH_IN_NOW         ;GO PUNCH "RECORD" IN, RETURN THROUGH.
;
RECORD_SW_E0
               BCLR    #RECORD_BIT,XPORT_STATE   ;ELSE - JUST NEGATE "READY" STATUS -
               BRA     RECORD_LED_OFF            ;KILL THE "RECORD" LED, RETURN THROUGH.
;
;
RECORD_SW_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "BOTTOM-LEVEL RECORD/ERASE PUNCH-IN/OUT"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; PUNCH RECORD OR ERASE IN OR OUT -
; WE ASSUME THAT ALL APPROPRIATE TESTS HAVE BEEN PASSED, AND RELEVANT
; STATUS FLAGS/BITS ARE INTACT FOR OUR INSPECTION AND MANIPULATION -
; IN PARTICULAR, XPORT_STATE AND RECORDING/ERASING FLAGS.
; RELATED HOUSEKEEPING (E.G. TIME-TRANSCRIPTION) IS DONE ELSEWHERE.
;
; NO ASSUMPTIONS ARE MADE AS TO WHO CALLED US -
; SINCE RECORD PUNCH-OUT WILL TRY TO WRITE NOTE-OFFS INTO A SEQUENCE,
; IT IS UP TO CALLING ROUTINES TO TAKE THE PROPER STEPS TO ASSURE
; SEQUENCE WRITE-POINTER CONTINUITY (E.G., IF REGISTER-RESIDENT, AS IN
; PRO_CLICK, MUST STORE BEFORE CALLING HERE, RETRIEVE UPON RETURN).
;
;
;
;
; BONE-HEAD PUNCH-IN - FOR ALL CASES.
;
PUNCH_IN_NOW
               BTST    #RECORD_BIT,XPORT_STATE   ;WHO ARE WE PUNCHING IN, THEN?
               BEQ.S   P_IN_NOW_20               ;BRANCH IF NOT "RECORD" - MUST BE "ERASE".
               ST      RECORDING            ;TELL THE WORLD - WE'RE RECORDING.
               BRA     RECORD_LED_SOLID     ;OH - TELL THE HUMANS, TOO - RETURN THROUGH.
;
;
P_IN_NOW_20
               BTST    #ERASE_BIT,XPORT_STATE    ;LET'S BE COOL HERE - DON'T ASSUME ANYTHING.
               BEQ.S   P_IN_NOW_EXIT             ;HAH! SEE? I TOLD YOU! (NEITHER ENABLED, SCRAM).
;
                                            ;PUNCHING "ERASE" IN:
               TST.B   AUTORPT_FLAG         ;ARE WE IN AUTOREPEAT MODE?
               BEQ.S   P_IN_NOW_40          ;IF NOT, THAT'S FINE,
                ABS_LONG
               JSR     AUTORPT_SWITCH       ;ELSE CALL SWITCH HANDLER TO TOGGLE IT OFF, ETC.
                ABS_SHORT
P_IN_NOW_40
               JSR     LIVE_ERASE_SETUP     ;GATE OFF ALL CURRENTLY GATED-ON LIVE VOICES,
                                            ;INITIALIZE INTERNAL EVENT ERASE MAP AND PAD ERASE
                                            ;BUFFER, PROCESS ANY CURRENTLY-ON PADS INTO ERASE
                                            ;MAP AND BUFFER.
               ST      ERASING              ;TELL THE WORLD - WE'RE ERASING.
               BSR     ERASE_LED_SOLID      ;OH - TELL THE HUMANS, TOO.
;
P_IN_NOW_EXIT
               RTS
;
;
;
;
; AUTOMATED PUNCH-OUT WHILE SEQUENCER IS RUNNING:
; LEAVES RECORD/ERASE ENABLED (BUT PUNCHED OUT, NEVERTHELESS) -
; ASSOCIATED LED IS LEFT IN SLOW-FLASH MODE TO INDICATE THIS STATUS.
;
AUTO_PUNCH_OUT
               BTST    #RECORD_BIT,XPORT_STATE   ;WHO ARE WE PUNCHING OUT, THEN?
               BEQ.S   A_P_OUT_20                ;BRANCH IF NOT "RECORD" - MUST BE "ERASE".
               TST.B   RECORDING            ;JUST TO BE SAFE - ARE WE PUNCHED IN?
               BEQ.S   A_P_OUT_10           ;BRANCH IF NOT - DON'T WRITE ANYTHING ANYWHERE.
                ABS_LONG
               JSR     WRITE_NEW_M_OFFS     ;CREATE NOTE-OFFS IN THE SEQUENCE FOR ANY NEW NOTE-ONS
               JSR     WRITE_NEW_P_OFFS     ;RECORDED AND NOT YET GATED OFF.
                ABS_SHORT
               SF      RECORDING            ;TELL THE WORLD - WE'RE NOT RECORDING.
A_P_OUT_10
               BRA     RECORD_LED_SLOW      ;OH - TELL THE HUMANS, TOO - RETURN THROUGH.
;
A_P_OUT_20
               BTST    #ERASE_BIT,XPORT_STATE    ;BUT IS "ERASE" ACTUALLY ENABLED?
               BEQ.S   A_P_OUT_EXIT              ;BRANCH IF NOT, DON'T MESS WITH "ERASE" LED.
                                            ;PUNCHING "ERASE" OUT:
               SF      ERASING              ;TELL THE WORLD - WE'RE NOT ERASING.
               BSR     ERASE_LED_SLOW       ;OH - TELL THE HUMANS, TOO - RETURN THROUGH.
A_P_OUT_EXIT
               RTS
;
;
;
;
; MANUAL PUNCH-OUT:
; COMPLETELY DISABLES RECORD/ERASE IN ADDITION TO PUNCHING OUT -
; ASSOCIATED LED IS TURNED OFF TO INDICATE THIS STATUS.
;
MANUAL_PUNCH_OUT
               ST      USER_PUNCHED         ;NOTE THAT MANUAL PUNCH-IN HAS BEEN DONE - AUTO PUNCH
                                            ;IN/OUT IS NOW DEFEATED UNTIL SEQUENCER IS STOPPED,
                                            ;AND PLAYBACK DOES RECORD-LOOP AT END EVEN IF WE ARE
                                            ;STILL PUNCHED OUT WHEN WE GET THERE.
               BCLR    #RECORD_BIT,XPORT_STATE   ;WHO ARE WE PUNCHING OUT, THEN?
               BEQ.S   M_P_OUT_20                ;BRANCH IF NOT "RECORD" - MUST BE "ERASE".
                                                 ;NOTE THAT IF IT WAS "RECORD" WE JUST DISABLED IT.
                ABS_LONG
               JSR     WRITE_NEW_M_OFFS     ;CREATE NOTE-OFFS IN THE SEQUENCE FOR ANY NEW NOTE-ONS
               JSR     WRITE_NEW_P_OFFS     ;RECORDED AND NOT YET GATED OFF.
                ABS_SHORT
               SF      RECORDING            ;TELL THE WORLD - WE'RE NOT RECORDING.
               BRA     RECORD_LED_OFF       ;OH - TELL THE HUMANS, TOO - RETURN THROUGH.
;
M_P_OUT_20
                                                 ;PUNCHING "ERASE" OUT:
               BCLR    #ERASE_BIT,XPORT_STATE    ;DISABLE ERASE,
               SF      ERASING                   ;TELL THE WORLD - WE'RE NOT ERASING.
               BRA     ERASE_LED_OFF             ;OH - TELL THE HUMANS, TOO - RETURN THROUGH.
;
;
;
;
; "SOFT" PUNCH-OUT - VERY SIMILAR TO AUTO_PUNCH_OUT, BUT DONE AFTER A
; SEQUENCE HAS ENDED OR BEEN EJECTED FROM SEQUENCER, THUS NO EVENT-
; BALANCING IS DONE:
;
SOFT_PUNCH_OUT
               SF      RECORDING            ;PUNCH OUT RECORD/ERASE (IF PUNCHED IN) -
               SF      ERASING              ;BUT DON'T MESS WITH ENABLES (I.E., XPORT_STATE).
               MOVE.B  XPORT_STATE,D0       ;SINCE WE ARE PUNCHED OUT FOR THE MOMENT, AND KNOW NOT
               BTST    #RECORD_BIT,D0       ;WHERE WE WILL WIND UP (START, CUED SOMEWHERE),
               BEQ.S   S_P_OUT_20           ;SET LED FOR ANY ENABLED FUNCTION INTO SLOW-FLASH MODE,
               BSR     RECORD_LED_SLOW      ;AND COUNT ON CUED-PUNCH TESTS TO RESTORE THEM.
S_P_OUT_20
               BTST    #ERASE_BIT,D0        ;WE FALL THROUGH FROM ABOVE, BUT ONLY ONE WILL BE SET.
               BEQ.S   S_P_OUT_EXIT
               BSR     ERASE_LED_SLOW
S_P_OUT_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "ERASE SWITCH HANDLER"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; HANDLER FOR ERASE SWITCH:
;
ERASE_SWITCH
               TST     TAP_TRACK_ON_FLAG    ;ARE WE IN TAP-TRACK RECORD MODE?
               BNE     ERASE_SW_EXIT        ;EXIT IF YES ERASE SWITCH HAS NO DEFINED FUNCTION.
;
               TST.B   SHOWING_FF_RW        ;ARE WE IN THE MIDDLE OF FAST-WIND SWITCH TIMEOUT?
               BNE     ERASE_SW_EXIT        ;EXIT IF YES, DON'T FUCK AROUND WITH IT.
;
               MOVE.B  CUEING_TO_SPP,D0     ;IF IN THE MIDDLE OF SOME SORT OF HI-SPEED CUEING,
               OR.B    CHASING_SMPTE,D0     ;JUST TUNE THIS SWITCH OUT COMPLETELY.
               BNE     ERASE_SW_EXIT
;
               TST     NOW_SEQ_STATUS       ;DOES THE CURRENT SEQUENCE EXIST?
               BEQ.S   ERASE_SW_EXIT        ;EXIT IF NOT, NO REASON FOR ACTION HERE.
;
               MOVE.B  XPORT_STATE,D0       ;HANDLE THE VARIOUS POSSIBLE CASES:
               BTST    #ERASE_BIT,D0        ;IS "ERASE" ENABLED?
               BNE.S   ERASE_SW_80          ;BRANCH IF YES.
               BTST    #RECORD_BIT,D0       ;"ERASE" NOT ENABLED - WAS "RECORD" ENABLED?
               BNE.S   ERASE_SW_40          ;BRANCH IF YES.
               BTST    #PLAY_BIT,D0         ;"ERASE", "RECORD" BOTH DISABLED - HOW ABOUT "PLAY"?
               BNE.S   ERASE_SW_20          ;BRANCH IF YES.
;
;
;
;
; ERASE HIT WITH "PLAY"/"RECORD"/"ERASE" ALL OFF:
;
               BSET    #ERASE_BIT,XPORT_STATE    ;ENABLE ERASE,
               BRA     ERASE_LED_SLOW            ;SET "ERASE" LED INTO SLOW FLASH - RETURN THROUGH.
                                                 ;(WE'RE READY TO ERASE, IF ANYTHING HAPPENS.)
;
;
;
;
; ERASE SWITCH HIT WITH "PLAY" ON, "RECORD"/"ERASE" OFF:
;
ERASE_SW_20
               TST.B   NOW_REPEATING        ;ARE WE IN THE MIDST OF REPEAT-LOOP PLAYBACK MODE?
               BNE.S   ERASE_SW_EXIT        ;EXIT IF YES, ERASE NOT ALLOWED.
               BSET    #ERASE_BIT,XPORT_STATE    ;ELSE - TELL THE MAN WHO TO PUNCH IN,
               ST      USER_PUNCHED         ;NOTE THAT MANUAL PUNCH-IN HAS BEEN DONE - AUTO PUNCH
                                            ;IN/OUT IS NOW DEFEATED UNTIL SEQUENCER IS STOPPED,
                                            ;AND PLAYBACK DOES RECORD-LOOP AT END EVEN IF WE ARE
                                            ;STILL PUNCHED OUT WHEN WE GET THERE.
               BRA     PUNCH_IN_NOW         ;GO PUNCH IT IN, RETURN THROUGH.
                                            ;(WE'RE ERASING NOW, MAKE NO MISTAKE.)
;
;
;
;
; ERASE SWITCH HIT WITH "RECORD" ENABLED:
;
ERASE_SW_40
               TST.B   RECORDING            ;WAS "RECORD" ACTUALLY PUNCHED IN?
               BEQ.S   ERASE_SW_60          ;BRANCH IF NOT - "ERASE" WON'T BE EITHER.
               BSR     MANUAL_PUNCH_OUT          ;ELSE - PUNCH "RECORD" OUT (KILL IT, ACTUALLY),
               BSET    #ERASE_BIT,XPORT_STATE    ;PROVIDE INSTRUCTIONS FOR MR. PUNCH-IN,
               BRA     PUNCH_IN_NOW              ;GO PUNCH "ERASE" IN - RETURN THROUGH.
;
ERASE_SW_60
               BCLR    #RECORD_BIT,D0       ;"RECORD" NOT PUNCHED IN - JUST STEAL "READY" STATUS.
               BSET    #ERASE_BIT,D0
               MOVE.B  D0,XPORT_STATE
               BSR     RECORD_LED_OFF       ;TURN HIS LED OFF,
               BRA     ERASE_LED_SLOW       ;PUT OURS IN SLOW-FLASH MODE - RETURN THROUGH.
;
;
;
;
; ERASE SWITCH HIT WITH "ERASE" ENABLED:
;
ERASE_SW_80
               TST.B   ERASING              ;WAS "ERASE" ACTUALLY PUNCHED IN?
               BNE     MANUAL_PUNCH_OUT     ;BRANCH IF YES - PUNCH IT OUT (KILL IT), RETURN THRU.
               BTST    #PLAY_BIT,D0         ;"ERASE" NOT PUNCHED IN - IS "PLAY" ENABLED?
               BEQ.S   ERASE_SW_A0          ;BRANCH IF NOT, JUST KILL ERASE ENABLE - ELSE,
               ST      USER_PUNCHED         ;NOTE THAT MANUAL PUNCH-IN HAS BEEN DONE - AUTO PUNCH
                                            ;IN/OUT IS NOW DEFEATED UNTIL SEQUENCER IS STOPPED,
                                            ;AND PLAYBACK DOES RECORD-LOOP AT END EVEN IF WE ARE
                                            ;STILL PUNCHED OUT WHEN WE GET THERE.
               BRA     PUNCH_IN_NOW         ;BRANCH IF YES - PUNCH "ERASE" IN, RETURN THROUGH.
;
ERASE_SW_A0
               BCLR    #ERASE_BIT,XPORT_STATE    ;ELSE - JUST NEGATE "READY" STATUS -
               BRA     ERASE_LED_OFF             ;KILL THE "ERASE" LED, RETURN THROUGH.
;
;
ERASE_SW_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "FAST-WIND SWITCH HANDLERS"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; HANDLERS FOR FAST-FORWARD, REWIND SWITCHES:
;
;
REWIND_SWITCH
                                            ;LOAD REWIND PARAMETERS FOR UNIFIED HANDLER:
               MOVEQ   #42,D1               ;REWIND SWITCH NUMBER FOR AUTO_SCROLL SETUP.
               MOVEQ   #REWIND_BIT,D2       ;OUR POSITION IN XPORT_STATE.
               MOVEQ   #FAST_FWD_BIT,D3     ;THE "OTHER GUY'S" POSITION IN XPORT_STATE.
               MOVEQ   #-1,D4               ;OUR BAR-NUMBER STEP VALUE.
               BRA.S   FAST_WIND_SWITCH     ;HEAD INTO UNIFIED FAST-WIND SWITCH HANDLER.
;
;
FAST_FWD_SWITCH
                                            ;LOAD FAST-FORWARD PARAMETERS FOR UNIFIED HANDLER:
               MOVEQ   #44,D1               ;REWIND SWITCH NUMBER FOR AUTO_SCROLL SETUP.
               MOVEQ   #FAST_FWD_BIT,D2     ;OUR POSITION IN XPORT_STATE.
               MOVEQ   #REWIND_BIT,D3       ;THE "OTHER GUY'S" POSITION IN XPORT_STATE.
               MOVEQ   #1,D4                ;OUR BAR-NUMBER STEP VALUE.
                                            ;FALL INTO UNIFIED FAST-WIND SWITCH HANDLER.
;
;
;
; UNIFIED FAST-WIND SWITCH HANDLER -
; COME HERE FROM FAST_FWD_SWITCH OR REWIND_SWITCH (ABOVE)
; WITH PARAMETERS IN D1-D4 - REFER TO ABOVE FOR DESCRIPTION OF PARAMS.
; KEEP IN THE BACK OF YOUR MIND THE FACT THAT THIS IS AN AUTO-SCROLLING
; SWITCH HANDLER WHICH GETS HIT REPEATEDLY WHILE ONE OF THE FAST-WIND
; SWITCHES IS BEING HELD DOWN - MOST OF THE ACTION HERE TAKES PLACE ONLY
; ON THE FIRST HIT ....
;
FAST_WIND_SWITCH
               TST     NOW_SEQ_STATUS       ;DOES OUR CURRENT SEQUENCE ACTUALLY EXIST?
               BEQ     FASTWIND_EXIT        ;EXIT IF NOT, FAST-WIND SWITCHES ARE POINTLESS.
;
               TST     TAP_TRACK_ON_FLAG    ;ARE WE IN TAP TRACK RECORD MODE?
               BNE     FASTWIND_EXIT        ;EXIT IF YES, FAST-WIND SWITCHES ARE IGNORED.
;
               MOVE    CLOCK_IN_MODE,D0     ;IS SEQUENCER RUNNING UNDER INTERNAL TIMEBASE?
               BEQ.S   FASTWIND_10          ;BRANCH IF YES, WE CAN GET IT ON ....
               CMP     #3,D0                ;THE OTHER POSSIBILITY IS CLICK SYNC -
               BNE     FASTWIND_EXIT        ;EXIT IF NOT, FAST-WIND IS NOT FOR US TO DECIDE.
;
FASTWIND_10
               MOVE.B  XPORT_STATE,D0       ;SO FAR SO GOOD - WHAT DID WE THINK WE WERE DOING?
               BTST    #PLAY_BIT,D0         ;ARE WE PLAYING (AMONG OTHER POSSIBLE THINGS)?
               BEQ     FASTWIND_EXIT        ;EXIT IF NOT - ALTHOUGH ACTUALLY NO REAL REASON WHY,
                                            ;IF YOU THINK ABOUT IT, THAT WE COULD NOT GO STRAIGHT
                                            ;INTO FAST-WIND FROM "STOP" STATE .... MAYBE LATER ....
;
               BSR     RESET_COUNT_IN       ;JUST DO IT, DON'T FUCK AROUND ....
;
               BSR     SET_AUTOSCROLL       ;SET UP AUTOSCROLL (IF NOT ALREADY IN MOTION),
                                            ;USING SWITCH NUMBER PASSED IN D1.
               BSET    D2,XPORT_STATE       ;FLAG "US" AS ON IN THE TRANSPORT -
               BNE     FASTWIND_C0          ;IF WE WERE ALREADY ON, SKIP SEQUENCER-STOP STUFF.
               BCLR    D3,XPORT_STATE       ;WIPE OUT BIT FOR THE "OTHER" FAST-WIND DIRECTION -
               BNE     FASTWIND_C0          ;LIKEWISE NO NEED TO STOP SEQUENCER IF WE WERE ALREADY
                                            ;FAST-WINDING IN THE "OTHER" DIRECTION.
;
;
                                            ;ELSE, THIS IS OUR FIRST TIME THROUGH SINCE LAST PLAY -
                                            ;WE GOT TO WRAP SEQUENCE UP BEFORE DOING ANYTHING ELSE:
;
               MOVE    D4,-(A7)                  ;SAVE BAR-NUMBER STEP VALUE UNTIL WE'RE DONE HERE.
               MOVE    NOW_BAR,FAST_WIND_BAR     ;REMEMBER WHERE WE STOPPED (THIS IS THE LAST
                                                 ;CHANCE WE HAVE) - WE STEP FROM THAT BAR.
;
               BSR     EJECT_SEQUENCE       ;SPIT THIS SEQUENCE OUT, GET READY FOR WHATEVER'S NEXT.
;
               BTST    #PAUSE_BIT,XPORT_STATE    ;IS TRANSPORT IN PAUSED STATE?
               BNE.S   FASTWIND_60               ;BRANCH IF YES, WE DON'T NEED TO STOP SLAVES -
                                                 ;BUT SHOULD MAKE SURE "PAUSE" LED IS CORRECT.
               BSR     SEND_6803_STOP            ;ELSE PUT OUT MIDI "STOP" VIA 6803 UART,
               BSR     SEND_MIDI_STOP            ;ALSO VIA UARTS ENABLED FOR MIDI CLOCK OUT.
               BRA.S   FASTWIND_80
                                            ;NOTE - OWING TO QUIRKS OF SMPTE 1.3 WHICH WILL MOST
                                            ;LIKELY BE CHANGED SOMEDAY, IT IS UNDESIREABLE TO STOP
                                            ;THE TIMING CHIP WHEN GOING INTO FAST-WIND - THIS IS
                                            ;BECAUSE THE COMMANDS WHICH GET IT GOING AGAIN CAUSE
                                            ;IMMEDIATE TRANSMISSION OF A MIDI "START" OR "CONTINUE"
                                            ;BYTE, WHICH SCREWS UP OUR MIDI SONG-POSITION POINTER
                                            ;OUTPUT.  THUS, IF NOT PAUSED WHEN WE GET HERE, THE
                                            ;6803 WILL CONTINUE TO CLOCK BOTH US AND MIDI WHILE
                                            ;WE'RE WAITING FOR FAST-WIND TO SETTLE OUT, AND WE NEED
                                            ;TO STOP THE OUTSIDE WORLD USING "STOP" BYTES.
;
FASTWIND_60
               BSR     PAUSE_LED_SOLID      ;WE'RE PAUSED, MAKE SURE THE LED IS WITH US -
                                            ;THIS COVERS THE ONLY SPECIAL CASE FOR THE "PAUSE" LED,
                                            ;TO WIT: WHEN UNPAUSING FROM PAUSED START/CUE WITH
                                            ;COUNT-IN ENABLED, THE "PAUSE" LED IS SET INTO FAST-
                                            ;FLASH TO ACKNOWLEDGE THE ACTION, WHILE INDICATING THAT
                                            ;TRANSPORT IS STILL REALLY PAUSED DURING COUNT-IN.
FASTWIND_80
;
               CLR     CONTINUE_TIMER       ;A MIDI "CONTINUE" TRANSMISSION MAY HAVE BEEN PENDING
                                            ;FOLLOWING A RECENT FAST-WIND OR PLAY-FROM-CUE -
                                            ;MAKE SURE IT DOESN'T GET OUT NOW.
;
               MOVE    (A7)+,D4             ;THAT'S THAT - BRING BACK OUR BAR-NUMBER STEP VALUE.
;
;
;
;
FASTWIND_C0
               MOVE    FAST_WIND_BAR,D0     ;PICK UP THE BAR NUMBER WE ARE CUED TO AT THE MOMENT.
               TST     D4                   ;WHICH WAY ARE WE WINDING?
               BMI.S   FASTWIND_E0          ;BRANCH IF REWINDING.
               CMP     NOW_LAST_BAR,D0      ;FAST-FORWARD - ARE WE ALREADY CUED TO LAST BAR OF SEQ?
               BRA.S   FASTWIND_G0          ;(STAY TUNED - THRILLING CONCLUSION BELOW ....)
FASTWIND_E0
               CMP     #1,D0                ;REWINDING - ALREADY CUED TO BAR 1?
FASTWIND_G0
               BEQ.S   FASTWIND_I0          ;BRANCH IF AT LIMIT, NO FURTHER BAR NUMBER STEPPING -
               ADD     D4,D0                ;ELSE, STEP TARGET BAR NUMBER IN APPROPRIATE DIRECTION,
               MOVE    D0,FAST_WIND_BAR     ;SAVE THE NEW VALUE.
FASTWIND_I0
                                            ;DISPLAY OUR CURRENT (NEW?) CUE BAR NUMBER -
                                            ;IF FIRST TIME THROUGH, PUT UP FAST-WIND SCREEN:
;
               SF      CURSOR_ENABLE        ;DON'T MUCH NEED THE CURSOR AROUND FOR THIS.
               MOVE    #1C03H,D1            ;SET UP FIELD POSITION/LENGTH SPEC,
               MOVEQ   #00H,D2              ;SET DISPLAY CTRLS - LEADING-ZERO BLANK, 1 DEC PLACE.
               TST.B   SHOWING_FF_RW        ;IS FAST-WIND SCREEN TEXT ALREADY IN PLACE?
               BNE.S   FASTWIND_K0          ;BRANCH IF YES, JUST REDISPLAY BAR NUMBER.
               ST      SHOWING_FF_RW        ;ELSE, SET FLAG AND DO IT UP -
                ABS_LONG
               JSR     UNPLUG_ALL_EDITS     ;DISCONNECT ALL NORMAL EDIT PATHWAYS.
                ABS_SHORT
               SF      SUBFUN_INSTALL       ;IN ADDITION, WHOMP ANY PENDING DISPLAY ACTIVITY FLAGS
               SF      UPDATE_LCD           ;WHICH MIGHT WREAK HAVOC UPON FAST-WIND SCREEN.
               SF      REDISP_FIELD
               MOVE.L  #FAST_WIND_SCRN,A1   ;SET UP SCREEN TEXT IN SCREEN_BUFFER.
                ABS_LONG
               JSR     WRITE_SCREEN
               JSR     WRITE_VALUE          ;DISPLAY BAR NUMBER (IT'S STILL IN D0).
               JSR     DISP_BUFFER          ;DISPLAY THE ASSEMBLED SCREEN TEXT.
               BRA.S   FASTWIND_M0
;
FASTWIND_K0
                                            ;SCREEN'S ALREADY UP -
               JSR     WRITE_VALUE          ;WRITE D0 VALUE INTO SCREEN_BUFFER PER D1-D2 CTRLS.
               JSR     DISP_FIELD           ;COPY BUFFER FIELD TO LCD PER SAME CONTROLS.
                ABS_SHORT
;
FASTWIND_M0
               MOVE    REAL_TIME,FAST_WIND_TIMER ;START/RESTART 1 SECOND TIMEOUT WHICH
               BSET    #0,FAST_WIND_TIMER+1      ;TRIGGERS ACTUAL CUEING WHEN FAST-WIND
                                                 ;SWITCHES ARE RELEASED FOR THAT LONG.
;
FASTWIND_EXIT
               RTS
;
;
;
FAST_WIND_SCRN
               ASC     "  FAST WINDING  "
               ASC     "(NOW AT BAR    )"
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "FAST-WIND CUEING/PLAY HANDLER"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; TIME TO SNAP TO, FAST-WIND STYLE:
; THIS IS SUBSTANTIALLY THE SAME AS PLAY-FROM-CUE, WITH ONLY MINOR
; FUNCTIONAL DIFFERENCES - THE MAIN ONE BEING THAT WE DO NOT ALTER THE
; BASIC STATUS OF THE TRANSPORT - IF WE WERE PAUSED, WE STAY PAUSED,
; IF WE WERE RUNNING, WE START RUNNING AGAIN, WHEREAS CUED-PLAY ALWAYS
; ENTERS PAUSE STATE ONCE CUED.  AS WITH CUED PLAY, IF RECORD OR ERASE
; ARE ENABLED, WE DO PUNCH-IN CHECKS BASED ON WHERE WE HAVE CUED TO.
; UMMM, LET'S SEE .... I GUESS, IF WE WERE SINGLE-STEPPING, WE WIND UP
; STILL IN SINGLE-STEP MODE AFTER CUEING .... I DON'T KNOW .... CHECK
; BACK WITH ME LATER ON THAT ONE.
;
; SINCE WE ARE RUNNING UNDER LOCAL (FRONT-PANEL) CONTROL AND ARE NOT
; TRANSMITTING ANYTHING OVER MIDI, WE BLOCK ALL INTERRUPTS WHILE CUEING.
;
FAST_WIND_PLAY
               MOVE    #2700H,SR            ;FOR MAXIMUM SPEED, BLOCK ALL INTERRUPTS WHILE CUEING -
                                            ;WE'RE UNDER INTERNAL TIMEBASE, WON'T MISS ANYTHING.
;
               JSR     INIT_WASTE_RECORD    ;CLEAR WASTELAND - USED DURING RECORDING AND PLAYBACK -
                                            ;SET ALL RECORD VECTORS TO BUFFER NEW EVENTS THERE.
;
               JSR     SEQ1_DRD_SETUP       ;SET UP SEQUENCE READ/WRITE PROCESSES AND POINTERS.
;
               MOVE    FAST_WIND_BAR,D0     ;ARE WE FAST-WOUND TO BEGINNING OF SEQUENCE?
               CMP     #1,D0
               BNE.S   FW_PLAY_60           ;BRANCH IF NOT, GO DEAL WITH FOR-REAL CUE-START.
;
                                                 ;ELSE, JUST DO A NORMAL START FROM BEGINNING:
               BTST    #PAUSE_BIT,XPORT_STATE    ;ARE WE PAUSED?
               BNE.S   FW_PLAY_40                ;BRANCH IF YES, DO A PAUSED START.
;
;
;
; FAST-WOUND TO BAR 1, NOT PAUSED - DO A RUNNING START FROM BEGINNING:
;
               MOVE    #2300H,SR            ;UNBLOCK MIDI UART INTERRUPTS SO MESSAGES CAN GET OUT
                                            ;RIGHT AWAY.
               BSR     SEND_MIDI_START      ;SEND "START" VIA UARTS ENABLED FOR MIDI CLOCK OUT.
                                            ;(NOTE - MAKE SURE IT GOES OUT BEFORE CLOCKING STARTS.)
               BSR     START_TC             ;TELL 6803 TO GET GOING (IT ALSO SENDS "START").
               BSR     CUED_BAR_PUNCH       ;IF RECORD OR ERASE ENABLED, SEE IF WE SHOULD PUNCH IN
                                            ;RIGHT AWAY - RECORD BEFORE ROLLING ON FIRST DOWNBEAT.
               BRA.S   FW_PLAY_Z0           ;CLEAN UP AND EXIT.
;
                                            ;NOTE - PRO_CLICK DOES PUNCH-IN CHECKS ON FIRST CLICK -
                                            ;RECORDING ON DOWNBEAT WITH NORMAL START NOT GUARANTEED
                                            ;(YOU'D HAVE TO BE AWFULLY FAST TO PULL IT OFF ....)
;
;
;
; FAST-WOUND TO BAR 1, PAUSED - DO PAUSED START FROM BEGINNING:
;
FW_PLAY_40
               BSR     START_TC             ;TELL 6803 TO GET GOING (IT ALSO SENDS "START").
               BSR     PAUSE_TC             ;NO SOONER DO WE TELL IT TO START, THAN WE TELL IT TO
                                            ;CHILL (IT ALSO SENDS "STOP") - WE NEEDED TO SEND OUT A
                                            ;START TO GET EXTERNAL SEQUENCERS PROPERLY CUED, SINCE
                                            ;WE SEND "CONTINUE" (NOT START) WHEN PAUSE IS REMOVED.
;
               MOVE    #2300H,SR            ;UNBLOCK MIDI UART INTERRUPTS SO MESSAGES CAN GET OUT
                                            ;RIGHT AWAY.
               BSR     SEND_MIDI_START      ;REPLICATE SIMILAR CONTROL DANCE VIA UARTS ENABLED FOR
               BSR     SEND_MIDI_STOP       ;MIDI CLOCK-OUT.
;
               BSR     CUED_BAR_PUNCH       ;IF RECORD OR ERASE ENABLED, SEE IF WE SHOULD PUNCH IN
                                            ;RIGHT AWAY - RECORD BEFORE ROLLING ON FIRST DOWNBEAT.
               BRA.S   FW_PLAY_Z0           ;CLEAN UP AND EXIT.
;
;
;
; FAST-WOUND TO BAR OTHER THAN BEGINNING - DO A BONAFIDE CUED START:
; D0 CONTAINS TARGET BAR NUMBER.
;
FW_PLAY_60
               BSR     READ_TO_CUE_BAR      ;CHEW THROUGH SEQUENCE TO THE TARGET BAR, TRACKING
                                            ;NOTE EVENTS, TEMPO CHANGES, LOOPS AND SUCH ....
               BSR     CUED_BAR_PUNCH       ;IF RECORD OR ERASE ENABLED, PUNCH IN IF THE CUE POINT
                                            ;IS BETWEEN THE CURRENT PUNCH-IN AND PUNCH-OUT POINTS.
               BTST    #PAUSE_BIT,XPORT_STATE    ;ARE WE PAUSED?
               BNE.S   FW_PLAY_80                ;BRANCH IF YES, DO PAUSED CUED START.
;
;
;
; UNPAUSED FAST-WIND TO BAR OTHER THAN BEGINNING:
;
               MOVE    #2300H,SR            ;UNBLOCK MIDI UART INTERRUPTS SO MESSAGES CAN GET OUT
                                            ;RIGHT AWAY.
               BSR     SEND_ADVANCED_PTR    ;SEND AN ADVANCE-NOTICE SONG-POSITION POINTER -
                                            ;INVOKE DELAYED TRANSMISSION OF MIDI "CONTINUE" BYTE.
               ADDQ    #1,CONTINUE_TIMER    ;A BIT OF EMPIRICAL FINE-TUNING:  IN THIS CASE, OUR MAN
                                            ;SEND_ADVANCED_PTR GOES ONE STEP BEYOND - POSTPONE THE
                                            ;INEVITABLE BY ONE SEQUENCER CLOCK TO LINE THINGS UP.
                ABS_LONG
               JSR     XMIT_OLD_M_ONS       ;AND, GATE ON ANY SEQUENCE NOTES CURRENTLY SUSTAINED -
               JSR     XMIT_OLD_P_ONS       ;BECAUSE WE'RE ROLLING, DADDY-O.
                ABS_SHORT
;
               BRA.S   FW_PLAY_Z0           ;CLEAN UP AND EXIT.
;
                                            ;UNPAUSED FAST-WIND IMPLIES THAT TIME CHIP IS STILL
                                            ;RUNNING - MIDI CONSIDERATIONS AND QUIRKS OF SMPTE 1.3
                                            ;TEAM UP TO MAKE IT UNDESIREABLE TO STOP THE TIME CHIP
                                            ;FOR FAST-WIND, IF IT IS NOT ALREADY STOPPED.
                                            ;SPECIFICALLY, BOTH "START" AND "UNPAUSE" COMMANDS
                                            ;CAUSE IMMEDIATE TRANSMISSION OF "START" OR "CONTINUE"
                                            ;MESSAGES VIA THE 6803 UART - NEITHER OF WHICH IS COOL.
                                            ;NOTE - IF WE HAPPEN TO BE IN SINGLE-STEP MODE (WE MUST
                                            ;HAVE BEEN IN BETWEEN STOPS WHEN FAST-WIND HIT), WE ARE
                                            ;GOING TO BE AUTOMATICALLY PAUSING VERY SHORTLY.
;
;
;
; PAUSED FAST-WIND TO BAR OTHER THAN BEGINNING:
;
FW_PLAY_80
               MOVE    #2300H,SR            ;UNBLOCK MIDI UART INTERRUPTS SO MESSAGES CAN GET OUT
                                            ;RIGHT AWAY.
               BSR     SEND_IMMED_PTR       ;TRANSMIT MIDI SONG POINTER INDICATING OUR CUE POINT -
                                            ;GET THE OUTSIDE WORLD CAUGHT UP TO WHERE WE ARE.
               TST.B   SINGLE_STEP          ;ARE WE IN SINGLE-STEP MODE?
               BEQ.S   FW_PLAY_Z0           ;BRANCH IF YES, CLEAN UP AND EXIT -
                ABS_LONG
               JSR     XMIT_OLD_M_ONS       ;ELSE, GATE ON ANY SEQUENCE NOTES CURRENTLY SUSTAINED -
               JSR     XMIT_OLD_P_ONS       ;BECAUSE THAT IS THE WAY OF SINGLE-STEP.
                ABS_SHORT
;
                                            ;NOTE:  AT THIS POINT WE WAIT FOR HAND-UNPAUSE (VIA
                                            ;PAUSE SWITCH) TO GET US GOING - MEANWHILE, EXTERNAL
                                            ;SEQUENCERS (IF ANY) HAVE TIME TO RESPOND TO MIDI SONG
                                            ;POINTER, IF USER ISN'T TOO JACKED-UP.
                                            ;UNPAUSE WILL TRIGGER A COUNT-IN BEFORE START, IF
                                            ;CONDITIONS CALL FOR IT - SEE PAUSE SWITCH HANDLER.
;
;
FW_PLAY_Z0
                                            ;COMMON EXIT FOR ALL FAST-WIND CASES:
;881025               AND.B   #.NT.(FAST_FWD_MASK+REWIND_MASK),XPORT_STATE       ;KILL FAST-WIND STATUS.
               AND.B   #~(FAST_FWD_MASK+REWIND_MASK),XPORT_STATE     ;KILL FAST-WIND STATUS.
               CLR     CLICKS_PENDING       ;START "NOW" (NOT "A WHILE AGO" BECAUSE OF LEFTOVERS).
               SF      SHOWING_FF_RW        ;LET OTHER SCREENS THROUGH - ALSO UNBLOCK "PLAY" AND
                                            ;"PAUSE" SWITCHES, AS WELL AS PROCESSING OF CLICKS.
               ST      SUBFUN_INSTALL       ;RESTORE THE SCREEN THAT FAST-WIND OVERWROTE.
               MOVE    #2000H,SR            ;RE-ENABLE INTERRUPTS - WE'RE READY FOR 'EM.
;
FW_PLAY_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "FAST-WIND/CUED-PLAYBACK TARGET-BAR POSITIONING"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; READ THROUGH SEQUENCE TO CUE-TARGET BAR:
;
; ZZZZZIP!  HERE WE GO, RACING SILENT AND SURE TOWARDS OUR TARGET,
; FULFILLING THE MISSION HANDED TO US BY FAST-WIND OR PLAY-FROM-CUE.
; WE GO THROUGH ALL THE MOTIONS OF NORMAL SEQUENCE PLAYBACK, TRACKING
; NOTES ON AND OFF, TEMPO CHANGES AND WHATEVER ELSE - SIMPLY OMITTING
; TO PLAY ANY SOUNDS, TRANSMIT ANYTHING OVER MIDI, OR MAINTAIN NORMAL
; SEQUENCING OF RECORD PHASE VECTORS.
;
; WE ASSUME THAT SEQUENCE READ/WRITE PROCESSES HAVE ALREADY BEEN
; INITIALIZED WHEN WE GET HERE, AND ALL WE HAVE TO DO IS READ AND WRITE.
;
; WE ARE HEADED TOWARDS THE BAR WHOSE NUMBER IS PASSED IN D0 -
; WE ARE PRETTY SURE WE WILL FIND IT, BECAUSE IT ORIGINATED FROM
; FUNCTIONS WHOSE RANGE IS DETERMINED BY THE TOTAL-BARS PARAMETER OF
; THE CURRENT SEQUENCE.
;
; WHEN WE GET THERE, WE PRE-FETCH UNTIL THE FIRST TIME-MARKER WITHIN
; THE BAR, THEN CONSIDER OURSELVES POSITIONED.  THIS MAKES US CONSISTENT
; WITH THE WAY THINGS ARE DONE IN THE SEQUENCER IN GENERAL -
; IN PARTICULAR, THE RULE THAT WE ARE ALWAYS PRE-FETCHED THROUGH THE
; NEXT TIME-MARKER OR BAR-MARKER BEYOND THE CURRENT CLICK (WHEN WE ARE
; NOT ACTUALLY IN THE MIDDLE OF PRE-FETCHING) - EXCEPT WHEN WE ARE AT
; THE VERY BEGINNING OF THE SEQUENCE AND HAVEN'T FETCHED ANYTHING YET.
; THIS DECREASES THE NEED FOR SPECIAL HANDLING OF SPECIAL CASES ON THE
; PART OF SWITCH (AND OTHER) HANDLERS WHICH MAY INHERIT THE SEQUENCE
; FROM US IN THE CUED STATE.
;
; WHEN WE ARE DONE, WE RENDER VALID VALUES FOR OVERALL_CLICK (WHICH IS
; USED FOR MIDI SONG-POSITION POINTER GENERATION), AS WELL AS FOR
; NOW_BAR || NOW_CLICK (WHICH ARE USED FOR PUNCH-IN DETERMINATION).
;
; IT IS STRONGLY RECOMMENDED THAT ALL INTERRUPTS BE BLOCKED WHEN CALLING
; HERE.  VERY STRONGLY, IN FACT.
;
; ENTERTAIN NO ILLUSIONS WITH RESPECT TO REGISTER PRESERVATION!
;
READ_TO_CUE_BAR
               MOVE    D0,FAST_WIND_BAR     ;SET UP CUE-TARGET BAR IN A SAFE, CONVENIENT PLACE.
               MOVE.L  #10000H,NOW_BAR      ;SET NOW_BAR = 1, NOW_CLICK = 0 (THE VERY BEGINNING).
               CLR.L   OVERALL_CLICK        ;LIKEWISE WITH TOTAL-CLICKS-FROM-START COUNTER.
;
               MOVE.L  SEQ_WR_PTR,A6        ;FETCH SEQUENCE READ/WRITE POINTERS.
               MOVE.L  SEQ1_DRD_PTR,A5
;
               SF      FOUND_CUE_BAR        ;WE HAVEN'T FOUND IT YET .... (WATCH THIS SPACE)
;
;
;
;
; OFF WE GO - THIS HERE MACHINE EATS THRU THE SEQUENCE TO CUE POINT,
; THEN BRANCHES OUT (TO RD_CUE_POSITIONED) WHEN IT'S SATISFIED:
;
RD_CUE_MACHINE
                                            ;TOP O' THE LOOP:
               JSR     SEQ1_DSTR_READ       ;READ NEXT EVENT (FIRST) WORD - IT HAS EVENT TYPE ID.
               MOVE    D7,D0                ;ISOLATE THE I.D. (L.S.NIBBLE) IN D0.
               AND     #0FH,D0
;
RQ_GOT_WORD
                                            ;TOP O' LOOP IF PREVIOUS EVENT-PARSE READ THE FIRST
                                            ;WORD OF NEXT EVENT FOR US (AND ISOLATED ID IN D0):
               LSL     #2,D0                ;BRANCH TO EVENT-PARSE PROCEDURE FOR THIS EVENT TYPE.
               JMP     RQ_PARSE_TBL(PC,D0)
;
RQ_PARSE_TBL
               BRA.W   RD_CUE_MACHINE       ;TYPE 0 - deleted event - lose
               BRA.W   RQ_PAD_ON            ; "   1 - PAD GOING ON
               BRA.W   RQ_PAD_OFF           ; "   2 -  "    "   OFF
               BRA.W   RQ_MIDI_ON           ; "   3 - MIDI NOTE ON
               BRA.W   RQ_MIDI_OFF          ; "   4 -  "    "   OFF
               BRA.W   RQ_OTHER_MIDI        ; "   5 - OTHER MIDI EVENT
               BRA.W   RQ_MIDI_SYSEX        ; "   6 - MIDI SYSTEM EXCLUSIVE
               BRA.W   RD_CUE_MACHINE       ; "   7 - undefined
               BRA.W   RQ_BAR_MARK          ; "   8 - BAR MARKER
               BRA.W   RQ_TIME_MARK         ; "   9 - TIME MARKER
               BRA.W   RQ_TAP_TIME          ; "  10 - TAP TIME OFFSET
               BRA.W   RD_CUE_MACHINE       ; "  11 - A/R MARKER (HANDLED ALONG WITH BAR-MARKER)
               BRA.W   RQ_UART_TIMING       ; "  12 - UART ADVANCE/DELAY
               BRA.W   RD_CUE_MACHINE       ; "  13 - undefined
               BRA.W   RD_CUE_MACHINE       ; "  14 - undefined
               BRA.W   RD_CUE_MACHINE       ; "  15 - END-OF-SEQUENCE MARKER (WE WON'T SEE THIS)
;
;
;
;
RQ_PAD_ON
               JSR     SEQ_WRITE            ;COPY FIRST WORD TO NEW BLOCK,
               SWAP    D7                   ;SHIFT IT ASIDE.
               JSR     SEQ1_DSTR_READ       ;READ SECOND WORD,
               JSR     SEQ_WRITE            ;COPY IT OVER TOO.
                ABS_LONG
               JSR     LOG_IN_OLD_PAD       ;LOG THIS EVENT INTO PADS-ON LIST.
                ABS_SHORT
               JSR     SEQ1_DSTR_READ       ;READ AND COPY THIRD WORD.
               JSR     SEQ_WRITE
               BRA     RD_CUE_MACHINE       ;LOOP BACK FOR NEXT EVENT.
;
;
;
;
RQ_PAD_OFF
               JSR     SEQ_WRITE            ;COPY FIRST WORD TO NEW BLOCK,
               SWAP    D7                   ;SHIFT IT ASIDE.
               JSR     SEQ1_DSTR_READ       ;READ AND COPY SECOND WORD.
               JSR     SEQ_WRITE
                ABS_LONG
               JSR     LOG_OUT_OLD_PAD      ;LOG THIS EVENT OUT OF PADS-ON LIST.
                ABS_SHORT
               BRA     RD_CUE_MACHINE       ;LOOP BACK FOR NEXT EVENT.
;
;
;
;
RQ_MIDI_ON
               JSR     SEQ_WRITE            ;COPY FIRST WORD TO NEW BLOCK,
               SWAP    D7                   ;SHIFT IT ASIDE.
               JSR     SEQ1_DSTR_READ       ;READ AND COPY SECOND WORD.
               JSR     SEQ_WRITE
                ABS_LONG
               JSR     LOG_IN_OLD_MIDI      ;LOG THIS EVENT INTO MIDI NOTES-ON LIST.
                ABS_SHORT
               BRA     RD_CUE_MACHINE       ;LOOP BACK FOR NEXT EVENT.
;
;
;
;
RQ_MIDI_OFF
               JSR     SEQ_WRITE            ;COPY FIRST WORD TO NEW BLOCK,
               SWAP    D7                   ;SHIFT IT ASIDE.
               JSR     SEQ1_DSTR_READ       ;READ AND COPY SECOND WORD.
               JSR     SEQ_WRITE
                ABS_LONG
               JSR     LOG_OUT_OLD_MIDI     ;LOG THIS EVENT OUT OF MIDI NOTES-ON LIST.
                ABS_SHORT
               BRA     RD_CUE_MACHINE       ;LOOP BACK FOR NEXT EVENT.
;
;
;
;
RQ_OTHER_MIDI
                                            ;"OTHER MIDI" IMPLIES A TWO-WORD SEQUENCE EVENT:
               JSR     SEQ_WRITE            ;COPY FIRST WORD TO NEW BLOCK,
               JSR     SEQ1_DSTR_READ       ;READ AND COPY SECOND WORD - NOTHING TO LOG.
               JSR     SEQ_WRITE
               BRA     RD_CUE_MACHINE       ;LOOP BACK FOR NEXT EVENT.
;
;
;
;
RQ_MIDI_SYSEX
               LSR     #2,D0                ;PUT EVENT TYPE ID BACK INTO ORIGINAL SHAPE,
               JSR     SEQ1_RMW_EATER       ;PARSE THROUGH AN EVENT OF VARIABLE LENGTH.
               BRA     RQ_GOT_WORD          ;MR. EATER LEAVES US FIRST WORD OF NEXT EVENT IN D7,
                                            ;AND TYPE ID ISOLATED IN D0 - SKIP THESE STEPS,
                                            ;LOOP BACK TO PARSE THIS NEXT EVENT.
;
;
;
;
RQ_BAR_MARK
               TST.B   FOUND_CUE_BAR        ;HAVE WE ALREADY HIT THE CUE-TARGET BAR-MARKER?
               BEQ.S   RQ_BM_20             ;BRANCH IF NOT, GO DEAL WITH THIS ONE.
               MOVE    CLICKS_THIS_BAR,NEXT_EVENT_TIME     ;ELSE, THIS BAR-MARKER IS THE FIRST TIME
                                                           ;MARK FOLLOWING THE TARGET BAR-MARKER -
                                            ;THUS, NUMBER OF CLICKS IN THE TARGET BAR IS ALSO THE
                                            ;CLICK NUMBER IN THIS BAR WHEN NEXT EVENT PRE-FETCH
                                            ;WILL BE NEEDED, ONCE WE START ROLLING AGAIN.
               BRA     RD_CUE_POSITIONED    ;WE'RE WHERE WE WANTED TO BE - TIDY UP AND GIT.
                                            ;THIS BAR-MARKER ID WORD WILL BE LEFT IN HOLDING_EVENT
                                            ;WHERE PLAYBACK WILL PICK IT UP, THUS WE DON'T COPY IT
                                            ;OVER TO NEW BLOCK AT THIS POINT.
;
RQ_BM_20
                                            ;STILL LOOKING FOR CUE-TARGET BAR-MARKER, BUT FIRST:
               SWAP    D7                   ;SHIFT BAR-MARKER FIRST WORD ASIDE.
               JSR     SEQ1_DSTR_READ       ;FETCH THE OTHER WORD, TO WIT: BAR NUMBER.
;
               TST     REPEAT_COUNT         ;IS PLAYBACK LOOP ENABLED (VIA NON-ZERO REPEAT COUNT)?
               BEQ.S   RQ_BM_40             ;BRANCH IF REPEAT_COUNT = 0, NO GONNA LOOP.
               MOVE.B  XPORT_STATE,D0       ;IS "ERASE" OR "RECORD" ENABLED?
               AND.B   #RECORD_MASK+ERASE_MASK,D0
               BNE.S   RQ_BM_40             ;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   RQ_BM_40             ;BRANCH IF YES, LIKEWISE KEEP THINGS OPEN FOR PUNCH-IN.
;
                                            ;RECORD/ERASE PUNCH-IN IS NOT AN IMMEDIATE ISSUE:
               CMP     REPEAT_START,D7      ;IS THIS THE REPEAT LOOP START BAR?
               BNE.S   RQ_BM_40             ;BRANCH IF NOT (REPEAT_START = 0 IF NO LOOP ENABLED).
               JSR     REPEAT_SNAPSHOT      ;YES - FREEZE-FRAME SEQUENCE STATE AT THIS POINT,
                                            ;INCLUDING SEQ_WRITE ADDR (WHERE BAR-MARKER WILL GO),
                                            ;A-AND, SET READY_TO_RPT FLAG TO SAY "I BEEN THERE."
                                            ;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.
RQ_BM_40
               SWAP    D7                   ;SWING BAR-MARKER FIRST WORD INTO THE WRITE-TUBE,
               JSR     SEQ_WRITE            ;FIRE IT OFF TO NEW WRITE BLOCK.
               SWAP    D7                   ;SLIDE SECOND WORD INTO THE TUBE,
               JSR     SEQ_WRITE            ;FIRE IT OFF TOO.
;
               CMP     FAST_WIND_BAR,D7     ;NOW - IS THIS OUR CUE-TARGET BAR-MARKER?
               BNE.S   RQ_BM_60             ;BRANCH IF NOT, CONTINUE ....
               ST      FOUND_CUE_BAR        ;ELSE, SET FLAG TO INDICATE THAT WE ARE NOW INTERESTED
                                            ;ONLY IN PRE-FETCHING THE EVENTS BETWEEN HERE AND THE
                                            ;NEXT TIME- OR BAR-MARKER, WHICHEVER COMES FIRST -
                                            ;THEN WE'RE OUTA HERE.
RQ_BM_60
               JSR     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.
;
               JSR     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.
;
               TST.B   FOUND_CUE_BAR        ;IS THIS OUR DESTINATION BAR-MARKER?
               BNE     RD_CUE_MACHINE       ;BRANCH IF YES, WE'RE DONE WITH IT - SINCE IT HASN'T
                                            ;BEEN "PLAYED" YET, WE DON'T ADD ITS CLICKS TO THE
                                            ;RUNNING TOTAL, AND WE DON'T EXTRAPOLATE ANY ACTIVE
                                            ;ACCELERANDO/RITARDANDO OUT TO THE END OF THE BAR ....
;
                                            ;THIS IS NOT OUR TARGET BAR, WHIP THROUGH IT:
;
               CLR.L   D0                   ;CLEAR A SPACE FOR WORD TO TAKE PART IN LONG-WORD MATH,
               MOVE    CLICKS_THIS_BAR,D0   ;FETCH THE NUMBER OF CLICKS IN THIS BAR,
               ADD.L   D0,OVERALL_CLICK     ;ADD IT TO OUR RUNNING TOTAL - THIS BRINGS US UP TO
                                            ;DATE, CLICK-WISE, AS OF THE NEXT BAR-MARKER WE SEE.
;
                                            ;NOW DO SAME FOR ANY ACTIVE ACCELERANDO/RITARDANDO:
               MOVE    CLICKS_THIS_BAR,D0   ;A-R IS MAINTAINED PER CLICK, FETCH TOTAL FOR THIS BAR.
               SUBQ    #1,D0                ;PRE-DECREMENT THE COUNT FOR A "DBRA" LOOP.
RQ_BM_A0
               MOVE    D0,-(A7)             ;STASH THE CLICKS-TO-PROCESS COUNT,
                ABS_LONG
               JSR     UPDATE_ACC_RIT       ;ADVANCE A-R BY ONE CLICK, NOTIFY 6803 OF ANY CHANGE.
                ABS_SHORT
               MOVE    (A7)+,D0             ;BRING BACK THE COUNT -
               DBRA    D0,RQ_BM_A0          ;STAY IN LOOP UNTIL A-R IS CAUGHT UP TO END OF BAR,
               BRA     RD_CUE_MACHINE       ;THEN LOOP BACK FOR NEXT SEQUENCE EVENT.
;
;
;
;
RQ_TIME_MARK
               TST.B   FOUND_CUE_BAR        ;YEAH, RIGHT - HAVE WE SEEN THE CUE-TARGET BAR-MARKER?
               BNE.S   RQ_TM_20             ;BRANCH IF YES - USE TIME-MARK FOR SCHEDULING, GET OUT.
               JSR     SEQ_WRITE            ;ELSE, JUST COPY IT TO NEW BLOCK,
               BRA     RD_CUE_MACHINE       ;LOOP BACK FOR NEXT EVENT.
;
RQ_TM_20
                                            ;HEY, THIS IS THE BIG ONE -
                                            ;THE CLICK NUMBER OF THIS TIME-MARKER IS ALSO THE
                                            ;CLICK NUMBER IN THIS BAR WHEN NEXT EVENT PRE-FETCH
                                            ;WILL BE NEEDED, ONCE WE START ROLLING AGAIN:
               MOVE    D7,D0                ;EXTRACT THE CLICK NUMBER (WITHOUT DAMAGING D7!),
               LSR     #4,D0
;
               CMP     CLICKS_THIS_BAR,D0   ;STOP-GAP CRASH PREVENTION - DISALLOW NEXT_EVENT_TIME
               BLS.S   RQ_TM_40             ;LATER THAN END OF CURRENT BAR.
               MOVE    CLICKS_THIS_BAR,D0   ;IF BOGUS TIME VALUE, PRE-FETCH IS PROBABLY LOST -
                                            ;SCHEDULE FOR THE END OF THE CURRENT BAR.
RQ_TM_40
;
               MOVE    D0,NEXT_EVENT_TIME   ;POST THE TIME OF NEXT EVENT PRE-FETCH.
               BRA.S   RD_CUE_POSITIONED    ;HEAD ON OUT INTO DAYLIGHT (VUARNETS, PLEASE ....)
                                            ;THIS TIME-MARKER WILL BE LEFT IN HOLDING_EVENT WHERE
                                            ;PLAYBACK WILL PICK IT UP, THUS WE DON'T COPY IT OVER
                                            ;TO NEW BLOCK AT THIS POINT.
;
;
;
;
RQ_TAP_TIME
               JSR     SEQ_WRITE            ;COPY FIRST WORD TO NEW BLOCK,
               SWAP    D7                   ;SHIFT IT OVER.
               JSR     SEQ1_DSTR_READ       ;READ AND COPY SECOND WORD,
               JSR     SEQ_WRITE
                ABS_LONG
               JSR     TAP_TIME_OFFSET      ;GO PROCESS THE TAP-TRACK EVENT.
                ABS_SHORT
               BRA     RD_CUE_MACHINE       ;LOOP BACK FOR NEXT EVENT.
;
;
;
;
RQ_UART_TIMING
               JSR     SEQ_WRITE            ;COPY EVENT TO NEW BLOCK.
               MOVE    D7,D6                ;MAKE A COPY FOR UNPACKING.
               ASR     #2,D6                ;GET TWO UART ADVANCE VALUES STRADLING BYTE BORDER.
               TST     D6                   ;IF UPPER BIT OF UPPER BYTE SET,
               BMI.S   NEAR_END_1           ;THEN IGNORE FOR UART A -
                                            ;ELSE, PROCESS UART A ADVANCE VALUE.
               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    ;PLUG IT IN.
;
NEAR_END_1
               TST.B   D6                   ;IF UPPER BIT OF LOWER BYTE SET,
               BMI     RD_CUE_MACHINE       ;THEN NO CHANGE FOR UART B - WE'RE DONE HERE.
                                            ;ELSE, PROCESS UART B ADVANCE VALUE.
               LSL     #1,D6                ;MOVE ACTIVITY BIT OUT OF WAY,
               ASR.B   #3,D6                ;ROTATE OFF ID BITS,
               EXT     D6                   ;MAKE A SIGN-EXTENDED WORD -
               MOVE    D6,MB_SEQ_ADVANCE    ;PLUG IT IN,
               BRA     RD_CUE_MACHINE       ;NOW WE'RE DONE HERE.
;
;
;
;
;              AS FOR HANDLING END-OF-SEQUENCE MARKERS -
;              WE JUST HAVE TO BELIEVE IN THE LORD ....
;              ALSO, COMING SOON TO A SEQUENCER NEAR YOU:
;              FAST-WIND/CUE THROUGH SONGS!!!!
;
;
;
;
; WELL, WE'RE THERE -
; NOT MUCH LEFT FOR US TO DO RIGHT HERE.
;
RD_CUE_POSITIONED
               MOVE    D7,HOLDING_EVENT     ;STASH THE FIRST WORD OF NEXT TIMING EVENT -
                                            ;PLAYBACK WILL PICK IT UP AT NEXT PRE-FETCH TIME.
;
               MOVE.L  A6,SEQ_WR_PTR        ;STASH CURRENT SEQUENCE READ/WRITE POINTERS.
               MOVE.L  A5,SEQ1_DRD_PTR
;
               ADDQ.L  #1,OVERALL_CLICK     ;RACK UP ONE MORE CLICK, SINCE WE PRE-FETCHED THROUGH
                                            ;THE CUE-TARGET CLICK -
                                            ;LIKEWISE - WE'VE GONE THROUGH, NOT JUST UP TO,
                                            ;FIRST CLICK IN THE CUE-TARGET BAR - THUS, NOW_CLICK
                                            ;SHOULD = 0, WHICH CORRESPONDS TO THAT FIRST CLICK.
                                            ;BAR_MARKER HANDLER SHOULD HAVE LEFT IT = 0.
;
               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.
;
               MOVE    REAL_TIME,D0         ;SET THINGS UP SO THAT ANYTHING WHICH HAPPENS RIGHT
                                            ;AFTER WE GET OUT OF HERE (I REFER MAINLY TO GATING-ON
                                            ;OF INTERNAL SOUNDS) WILL NOT BE UNDULY DELAYED:
               SUBQ    #1,D0                ;SOUNDS PLAYED AS SEQ EVENTS ARE SUBJECT TO DELAY UNTIL
               MOVE    D0,NEXT_TIME         ;NEXT_TIME - MAKE SURE WE'VE ALREADY PASSED IT.
               CLR.L   D1                   ;FUDGE HISTORY - PROJECT LAST_CLICK_HIT BACKWARDS AT
               MOVE    CUR_TEMPO_USEC,D1    ;CURRENT TEMPO TO ENSURE PROPER DELAY FOR EVENTS PARSED
               DIVU    #1024,D1             ;AFTER THE FIRST CLICK COMES IN.
               SUB     D1,D0                ;SUBTRACT "LAST" CLICK DURATION FROM REAL_TIME TO FIND
               ADDQ    #1,D0                ;OUT WHEN IT "OCCURRED" (INC CANCELS DEC WE DID ABOVE).
               MOVE    D0,LAST_CLICK_HIT
;
               MOVE    FAST_WIND_BAR,D0     ;THIS IS THE BAR WE DONE HUSTLED OFF TO -
               CMP     REPEAT_END,D0        ;IS IT PAST END OF REPEAT LOOP (IF ANY)?
               BLT.S   RD_CUE_EXIT          ;BRANCH IF NOT, NO CHANGES TO PUT US THROUGH NOW -
                                            ;NOTE THAT REPEAT_END = 0 IF NO LOOP IS ENABLED.
               CLR     REPEAT_COUNT         ;PAST LOOP END - CLEAR LOOP COUNT,
               SF      READY_TO_RPT         ;ALONG WITH FLAG THAT SAYS "HEY, I WAS READY TO ...."
;
RD_CUE_EXIT
               RTS                          ;OKAY - THE REST IS UP TO YOUSE GUYZ ....
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "UTILITY SEQUENCER STOP FUNCTIONS"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; STOP THE SEQUENCER -
; SPECIAL HOOK FOR USE BY SYSTEM UTILITIES WHOSE VERY NATURE MAKES THEM
; INCOMPATIBLE WITH SEQUENCER ACTIVITY (SOUND/SEQ EDIT, DISK SYS, ETC.).
; WHEN THESE UTILITIES ARE ACTUALLY EXECUTED, THEY CALL HERE AS A FIRST
; STEP - EXCEPT IN CASES WHERE IT MIGHT BE DANGEROUS TO EXECUTE THE
; UTILITY RIGHT ON THE HEELS OF STOPPING THE SEQUENCER (PLEASE CHECK OUT
; SEQ_RUNNING_TEST BELOW) - DEPENDS UPON THE PARTICULAR UTILITY.
;
; FOR THE TIME BEING, WE JUST CALL THE SAME HANDLER WHICH IS INVOKED BY
; AN ACTUAL HIT ON THE "STOP" SWITCH - THIS IS SORT OF APPROPRIATE,
; SINCE THESE UTILITIES RUN IN BACKGROUND DISTINCT FROM THE SEQUENCER
; ITSELF, AND THIS SIMULATES DOING WHAT THE USER SHOULD PROBABLY HAVE
; DONE BEFORE USING THE UTILITY FUNCTION.  THE ONLY DIFFERENCE IS THAT
; ALL REGISTERS ARE PRESERVED.
;
;
STOP_THE_SEQUENCER
               MOVEM.L D0-D7/A0-A6,-(A7)
               BSR.S   STOP_SWITCH
               MOVEM.L (A7)+,D0-D7/A0-A6
               RTS
;
;
;
; CALL HERE WHEN DOING EDITING OR OTHER OPERATION DURING WHICH SEQUENCER
; MUST NOT BE RUNNING, AND IN WHICH CURRENT_SEQUENCE NUMBER IS A KEY
; FACTOR IN THE OPERATION.
; SEEMS THAT STOPPING THE SEQUENCER SOMETIMES RESULTS IN "SPONTANEOUS"
; CHANGES IN CURRENT_SEQUENCE (ESPECIALLY IF IN SONG MODE, WHERE IT IS
; SET TO REFLECT THE FIRST SEQUENCE IN THE SONG, BUT ALSO IN SEQUENCE
; MODE, IF A NEW SEQUENCE WAS CUED BY HAND OR VIA MIDI BUT HAD NOT YET
; BEEN SWITCHED OVER TO) - WHICH COULD CAUSE UNTOLD GRIEF, AND OTHER
; SAD THINGS (LIKE DELETING THE WRONG SEQUENCE AND SUCH-LIKE).
; RATHER THAN SECOND-GUESS THESE CONDITIONS, WE JUST RETURN Z FLAG FALSE
; AND A MESSAGE IN THE LCD IF SEQUENCER IS RUNNING IN ANY MODE/STATE.
; OTHERWISE, WE RETURN Z FLAG TRUE - AND JUST SAY, GOOD LUCK.
; REGISTERS NOT BOTHERED.
;
SEQ_RUNNING_TEST
               BTST    #PLAY_BIT,XPORT_STATE     ;ARE WE IN MOTION, THEN?
               BEQ.S   SRT_EXIT                  ;BRANCH IF NOT, JUS' RETURN COOL, MON.
;
               MOVEM.L A1/D0,-(A7)
               MOVE.L  #STOP_SEQ_SCRN,A1         ;ELSE - GIVE USER SOME FRIENDLY ADVICE.
                ABS_LONG
               JSR     DISP_SCREEN
                ABS_SHORT
               MOVEQ   #1,D0                     ;CLEAR Z FLAG AS SIGNAL TO TURN BACK .... OR ELSE!
               MOVEM.L (A7)+,A1/D0
                                                 ;GIT BACK LOW RETTA.
SRT_EXIT
               RTS
;
;
STOP_SEQ_SCRN
               ASC     "STOP SEQ FIRST!!"
               ASC     "(CONFIRM SEQ #) "
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "STOP SWITCH HANDLER"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; HANDLER FOR STOP SWITCH:
; WE JUST KILL, KILL, KILL - EVERYTHING IN SIGHT.
;
STOP_SWITCH
               MOVEQ   #NEG_EXT+0F8H,D0     ;TELL TC TO NOT BE IN HIGH-SPEED MODE
               JSR     WRITE_TO_TC
;
               SF      SINGLE_STEP          ;CLEAR SINGLE_STEP MODE.
               SF      PROCESSED_TAP        ;CLEAR "GOT A TAP THIS CLICK" FLAG.
               SF      CHASING_SMPTE        ;CERTAINLY NO LONGER IN HIGH-SPEED SYNC-CHASE MODE!!!
               SF      CUEING_TO_SPP        ;LIKEWISE KILL ANY SONG-POINTER CUEING IN PROGRESS,
               CLR.L   CUR_SPP_CLICK        ;FORGET WHERE WE WERE TRYING TO GO.
               SF      RECORDING            ;SHUT DOWN RECORDING & ERASING.
               SF      ERASING
               SF      USER_PUNCHED         ;LOSE ANY RECOLLECTION OF MANUAL PUNCH IN/OUT.
               SF      PLAYED_TO_END        ;NOT TRUE, UNTIL THE NEXT TIME WE DO IT.
               CLR     CLICKS_PENDING       ;STOP PROCESSING CLICKS - CATCH RUN-OVER.
               CLR     MA_SEQ_ADVANCE       ;RESET UART ADVANCE/DELAYS.
               CLR     MB_SEQ_ADVANCE
               CLR     ACCEL_RIT_B_LEFT     ;STOP ANY ACCELERANDO/RITARDANDO CURRENTLY IN PROGRESS.
;
               TST     TAP_TRACK_ON_FLAG    ;ARE WE IN TAP TRACK RECORD MODE?
               BEQ.S   PHAEDRA_7            ;IF NOT, CONTINUE...
                ABS_LONG
               JMP     TAP_STOP             ;ELSE, APPLY SPECIAL TAP-RECORD STOP PROCEDURE.
                ABS_SHORT
PHAEDRA_7
;
               TST     NOW_SEQ_STATUS       ;IF THIS SEQUENCE DOES NOT EXIST,
               BEQ.S   KILL_AND_EXIT        ;THEN STOP SWITCH SIMPLY KILLS ALL INTERNAL VOICES.
;
               TST.B   XPORT_STATE          ;LIKEWISE IF SEQUENCER WAS NOT ACTIVE -
               BNE.S   PHADE_1              ;BRANCH AND CONTINUE IF SOMETHING WAS HAPPENING.
                                            ;NOTE - THIS TEST SHOULD BE ENOUGH BY ITSELF, SINCE THE
                                            ;SEQUENCER SHOULD NEVER BE ACTIVE WITH A SEQUENCE THAT
                                            ;DOESN'T EXIST .....
KILL_AND_EXIT
               JSR     KILL_ALL_VOICES      ;NOTHING TO STOP - JUST KILL ALL INTERNAL VOICES,
               BRA     STOP_SW_EXIT         ;GET US GONE.
;
;
PHADE_1
                                            ;WE SEEM TO HAVE SOME ACTUAL STOPPING TO DO ....
;
               BSR     RESET_COUNT_IN       ;STOP/RESET ANY COUNT-IN OR TAP-IN IN PROGRESS.
;
               ST      BLEED_UART_A         ;TELL UARTS TO UNLOAD ALL BUFFERED SEQUENCE EVENTS
               ST      BLEED_UART_B         ;WITHOUT WAITING FOR THOSE CLICKS THAT'LL NEVER COME.
;
               TST.B   AUTORPT_FLAG         ;ARE WE IN AUTOREPEAT MODE?
               BEQ.S   SLEEPWALK_1          ;IF NOT, THAT'S FINE,
                ABS_LONG
               JSR     AUTORPT_SWITCH       ;ELSE CALL SWITCH HANDLER TO TOGLITOFF, ETC.
                ABS_SHORT
SLEEPWALK_1
;
               BTST    #3,XPORT_STATE       ;IF PLAY NOT TURNED ON, SEQ READ/WRITE NEVER SET UP -
               BEQ     ROCKHAUSEN_1         ;THEREFORE, LEAVE SEQ DATA ALONE!!!!
;
               TST.B   SHOWING_FF_RW        ;ARE WE IN THE MIDDLE OF FAST-WIND SWITCH TIMEOUT?
               BEQ.S   NOT_FW_WAIT          ;BRANCH IF NOT, GO ON.
               SF      SHOWING_FF_RW        ;ELSE - KILL THE FLAG,
               CLR     FAST_WIND_TIMER      ;KILL THE TIMER -
               BRA     ROCKHAUSEN_1         ;SEQUENCE IS ALL SEWN UP - DON' TETCH IT.
NOT_FW_WAIT
;
                                            ;ELSE, WE HAVE SOME SEWING-UP TO DO ....
               TST.B   NOW_REPEATING        ;HOWEVER, IF ALREADY IN REPEAT-LOOP PLAYBACK MODE,
               BNE.S   HOBBITS_1            ;WE HAVE NOTHING NEW TO ADD, AND NO "FLOATING" DATA -
                                            ;SO SKIP AHEAD TO THE FINAL STITCHWORK.
               MOVE.L  SEQ_WR_PTR,A6        ;ELSE - LOAD THE POINTERS WE NEED IN ORDER TO WRAP UP.
               MOVE.L  SEQ1_DRD_PTR,A5
               TST     HOLDING_EVENT        ;FIRST - HAVE WE GOT STARTED INTO SEQUENCE AT ALL?
               BEQ.S   NOT_EVEN_STARTED     ;BRANCH IF NOT - ELSE,
               JSR     WASTELAND_COPY       ;MERGE IN ANY EVENTS BUFFERED IN WASTELAND - THESE MAY
                                            ;BE EITHER NEWLY RECORDED EVENTS, OR EXISTNG SEQUENCE
                                            ;DATA BEING SHUFFLED THROUGH WASTELAND UNDER THE PHASE
                                            ;VECTOR SYSTEM FOR AUTOCORRECT RECORDING - EITHER WAY,
                                            ;IT BELONGS WITHIN CURRENT TIME-MARK INTERVAL.
               MOVE    HOLDING_EVENT,D7     ;FOLLOW THIS WITH FIRST WORD OF NEXT TIMING EVENT.
               JSR     SEQ_WRITE            ;WRITE IT (WHATEVER IT WAS) TO NEW WRITE BLOCK.
               AND     #0FH,D7              ;WAS IT A TIME MARKER OR FIRST WORD OF BAR MARKER?
               CMP     #8,D7                ;(TYPE CODE FOR BAR MARKER)
               BNE.S   WASTE_TRANSFORMED    ;BRANCH IF NOT BAR MARKER (TIME MARKER ONLY ONE WORD),
               JSR     SEQ1_DSTR_READ       ;ELSE COPY REMAINDER OF BAR MARKER ACROSS THE GAP -
               JSR     SEQ_WRITE            ;SEQ_CONSOLIDATE CHOKES ON SPLIT-UP SEQUENCE EVENTS.
               BRA.S   WASTE_TRANSFORMED
;
NOT_EVEN_STARTED
                                            ;WE HAVEN'T BEGUN PARSING THROUGH SEQUENCE - HOWEVER,
                                            ;WE MAY HAVE RECORDED SOME NEW EVENTS USING THE PAUSED
                                            ;RECORD GAMBIT - THESE (IF PRESENT) MUST BE MERGED INTO
                                            ;SEQUENCE BEHIND THE FIRST BAR-MARKER, SO:
               JSR     SEQ1_DSTR_READ       ;READ AND COPY OVER BOTH WORDS OF THE BAR-MARKER.
               JSR     SEQ_WRITE
               JSR     SEQ1_DSTR_READ
               JSR     SEQ_WRITE
               JSR     CHECK_FOR_A_R_MARK   ;IF AN ACCELERANDO/RITARDANDO EVENT LURKS IN BAR 1,
                                            ;IT'LL BE RIGHT BEHIND BAR MARKER (AND MUST NOT GET
                                            ;SEPARATED FROM IT, FOR EDITING REASONS) - THIS HANDY
                                            ;ROUTINE COVERS ALL ANGLES OF THIS SITCHY-WATION.
               JSR     WASTELAND_COPY       ;NOW, COPY OVER ANY NEW EVENTS SITTING IN BUFFER.
;
WASTE_TRANSFORMED
;
               MOVE.L  A6,SEQ_WR_PTR        ;RESAVE SEQUENCE READ/WRITE POINTERS.
               MOVE.L  A5,SEQ1_DRD_PTR
HOBBITS_1
               BSR     WAIT_AND_OFF         ;WAIT FOR ALL PENDING MIDI SEQUENCE EVENT TRANSMISSION
                                            ;TO GET DONE, THEN SEND NOTE-OFFS FOR ALL LINGERING
                                            ;SEQUENCER MIDI AND PAD NOTES.
                ABS_LONG
               JSR     FLUSH_OLD_MIDI       ;NEXT, CLEAR THE LISTS OF SEQUENCE NOTES ON.
               JSR     FLUSH_OLD_PADS
               JSR     WRITE_NEW_M_OFFS     ;ALSO CREATE OFFS IN THE SEQUENCE FOR ANY NEW STUFF
               JSR     WRITE_NEW_P_OFFS     ;STILL HANGING ON.
                ABS_SHORT
               MOVE.L  SEQ_WR_PTR,A6        ;NOW, LOAD THE POINTERS WE NEED IN ORDER TO WRAP UP,
               MOVE.L  SEQ1_DRD_PTR,A5
               JSR     SEQ_CONSOLIDATE      ;AND - CLOSE 'ER UP NICE 'N' TIGHT.
               JSR     SEQ_TURNAROUND       ;THEN, JUGGLE THE MEMORY BLOCK LINKS SO ALL IS GROOVY,
               JSR     UPDATE_SEQ_SIZE      ;FINALLY UPDATE MEMORY USAGE FIGURES.
;
;
ROCKHAUSEN_1
                                            ;AT THIS POINT, THE SEQUENCE (IF IT EXISTS) HAS BEEN
                                            ;THOROUGHLY PUT TO BED - NOW WE CLEAN UP OTHER DETAILS
                                            ;WHICH OUGHT NOT TO BE LEFT HANGING, AND THEN WE SPLIT:
;
                ABS_LONG
               JSR     BLIND_FLUSH_NOTE_BUFS     ;DO BRUTE-FORCE WIPE-CLEAN OF ALL NOTE-ON BUFFERS.
                ABS_SHORT
;
KRAFTWERK_1
               SF      XPORT_STATE               ;CLEAR ALL TRANSPORT STATUS BITS - WE'RE DEAD.
               MOVE    #0F000H,LED_EXTINGUISH    ;SNUFF ALL TRANSPORT LEDs (BACKGROUND GETS 'EM).
               BSR     STOP_TC                   ;TELL 6803 TO SHUT UP TOO (THAT JERK).
;
               JSR     OTRA_BAR_CHORES      ;RESET METRONOME AND RECORDING PHASE TO TOP O' BAR.
               BSR     UPDATE_REPEATS       ;RESET PLAYBACK LOOP COUNT/BAR NUMBERS, CLEAR STATUS.
               MOVE    #1,NOW_BAR           ;BACK TO BAR 1 (OTRA_BAR_CHORES CLEARED NOW_CLICK),
               MOVE    #1,NOW_BEAT          ;AND ALL BARS START ON BEAT 1, YES?
               CLR.L   OVERALL_CLICK        ;RESET CLICKS SINCE START OF SEQUENCE PLAYBACK.
               MOVE    #1,NEXT_EVENT_TIME   ;SET UP FOR NEXT CLICK SERVICE TO GET THE BALL ROLLING.
               CLR     HOLDING_EVENT        ;NOTHING HELD OVER FROM A PREVIOUS CLICK SERVICE.
               SF      RECORD_LOOPING       ;WE'RE NOT DOING ANYTHING, LET ALONE THIS.
               CLR     CONTINUE_TIMER       ;A MIDI "CONTINUE" TRANSMISSION MAY HAVE BEEN PENDING
                                            ;FOLLOWING A RECENT FAST-WIND, PLAY-FROM-CUE OR CHASE -
                                            ;MAKE SURE IT DOESN'T GET OUT NOW.
;
                ABS_LONG
               JSR     INIT_TEMPO_TO_ALL    ;INSTALL INITIAL TEMPO (INIT_TEMPO_USEC) FAR AND WIDE.
                ABS_SHORT
;
               SF      CUE_NEW_SEQ          ;FORGET ANY PENDING REQUESTS TO CUE A NEW SEQUENCE -
               MOVE    FORMER_SEQUENCE,CURRENT_SEQUENCE    ;ELIMINATE ANY DOUBT AS TO WHICH
                                                           ;SEQUENCE WE'RE DEALING WITH, NAMELY:
                                                           ;THE ONE WE JUST STOPPED.
;
               TST     S_OR_S_FLAG          ;ARE WE RUNNING IN SONG MODE?
               BEQ.S   TANGS_1              ;BRANCH IF NOT, NO MORE REGROOVING TO DO.
                ABS_LONG
               JSR     NEW_SONG_SELECTED    ;ELSE, RESET SONG POSITION STUFF.
                ABS_SHORT
TANGS_1
               ST      SUBFUN_INSTALL       ;STOPPING MAY HAVE CHANGED DISPLAYED INFO - UPDATE IT.
;
               JSR     INIT_WASTE_RECORD    ;DEFAULT RECORD VECTORS TO WRITE INTO WASTELAND.
;
               BSR     SEND_MIDI_STOP       ;TRANSMIT MIDI STOP - WHAT THE FU.. FUUU ... FFF-FFFU..
;
STOP_SW_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "END-OF-SEQUENCE HANDLER"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; WE GET CALLED BY THE VARIOUS SEQUENCE PARSING PROCEDURES WHEN THEY
; ENCOUNTER AN END-OF-SEQUENCE MARKER:
; (MEANING - WATCH YER REGISTERS, WE'RE IN A SEQUENCE-PARSING CONTEXT!)
;
SEQ_END_HANDLER
               CLR     MA_SEQ_ADVANCE       ;RESET UART ADVANCE/DELAYS,
               CLR     MB_SEQ_ADVANCE
               CLR     ACCEL_RIT_B_LEFT     ;CLEAR OUT PENDING ACCEL/RIT
;
               MOVE.B  XPORT_STATE,D0       ;IS ANYTHING HAPPENING?
               BEQ     SEQ_END_EXIT         ;IF NOT, IGNORE THIS (SOMEWHAT ABSURD ....)
;
               TST     S_OR_S_FLAG          ;ARE WE IN SONG MODE?
               BNE     SONG_PROGRESSING     ;IF YES, GO TO NEXT STEP OF SONG.
;
;
;
; NOT IN SONG MODE:
; DO A FEW TESTS TO SEE IF WE WANT TO SET UP ANOTHER SEQUENCE
; (OR EVEN THE SAME ONE) TO PLAY RIGHT AWAY:
;
               TST.B   READY_TO_RPT         ;IF WE HIT THE END OF THE SEQUENCE WITH THIS FLAG SET,
                                            ;IT CAN ONLY MEAN WE WERE SET TO REPEAT-LOOP THE ENTIRE
                                            ;SEQUENCE, AND ARE DOING IT VIA LOOPED-RECORD MECHANISM
                                            ;INSTEAD OF NON-DESTRUCTIVE REPEAT-LOOP PLAYBACK, SO AS
                                            ;NOT TO LOCK OUT RECORD/ERASE PUNCH-IN .... WE FIGURE:
                                            ;THIS CASE OBTAINS MOST OF THE TIME FOR MOST USERS.
               BEQ.S   SEQ_END_10           ;BRANCH IF NOT - HAVE A LOOK FOR OTHER LOOPING MODES.
               MOVE    REPEAT_COUNT,D0      ;ELSE - HOW MANY MORE TIMES?
               BMI     RECORD_LOOP          ;THE NEGATIVE ONE MEANS, "FOREVER AND THEN SOME" - GO.
               BEQ.S   SEQ_END_10           ;ZEE-RO MEANS, "LAST TIME WAS THE LAST TIME" - HOWEVER,
                                            ;MAY BE OTHER REASONS (E.G., RECORDING) TO KEEP IT UP -
                                            ;GO HAVE A LOOK.
               SUBQ    #1,REPEAT_COUNT      ;ELSE, ONE MORE TIME GONE -
               BRA     RECORD_LOOP          ;NOW G'WAN GIT LOOPIN'!
;
SEQ_END_10
               TST.B   LOOP_RECORD          ;ELSE - IS RECORD-LOOPING ENABLED?
               BEQ.S   SEQ_END_20           ;BRANCH IF NOT, SKIP ASSOCIATED TESTS.
               TST.B   USER_PUNCHED         ;HAS USER DONE MANUAL PUNCH-IN/OUT DURING CURRENT RUN?
               BNE     RECORD_LOOP          ;BRANCH IF SO - WE KEEP LOOPING, PUNCHED IN OR NOT.
               AND     #RECORD_MASK+ERASE_MASK,D0     ;IS RECORD OR ERASE ENABLED? (XPORT_STATE)
               BNE     RECORD_LOOP                    ;BRANCH IF YES, SET UP FOR REPLAY.
                                                 ;NOTE THAT THIS MEANS THAT SPP-CUE AND SMPTE-CHASE
                                                 ;WILL REPRODUCE LOOPING-RECORD BEHAVIOR ....
;
SEQ_END_20
               TST.B   CUE_NEW_SEQ          ;IS A NEW SEQUENCE PENDING?
               BNE     RECORD_LOOP          ;IF YES, GO DO IT UP (RECORD_LOOP DOES IT FOR US).
;
;
;
; WELL, LOOKS LIKE WE'RE CASHING IN OUR CHIPS -
; GO ABOUT STOPPING THE SEQUENCER, SET A FLAG TO TELL WHOEVER CALLED US
; TO PACK IT IN:
;
                                            ;FIRST STEP - SEAL UP THIS SEQUENCE:
SEQ_SELF_STOP
                                            ;(NOTE - SEQ_WR_PTR ACTIVE & IN A6.L AT THIS POINT)
               JSR     WASTELAND_COPY       ;MAKE SURE WASTELAND FINDS IT'S WAY BACK IN
               MOVE.L  A6,SEQ_WR_PTR        ;(SAVE SEQ_WR_PTR HERE - BELOW ROUTINES WILL RELOAD.)
                ABS_LONG
               JSR     XMIT_OLD_M_OFFS      ;IF, FOR SOME UNGODLY REASON, THE SEQUENCER HAS NOTES
               JSR     XMIT_OLD_P_OFFS      ; HANGING ON, SHUT THEM OFF AND CREATE OFFS IN THE SEQUENCE
               JSR     WRITE_OLD_M_OFFS     ; FOR THEM.
               JSR     WRITE_OLD_P_OFFS
               JSR     WRITE_NEW_M_OFFS     ;    ALSO CREATE OFFS IN THE SEQUENCE FOR ANY NEW STUFF
               JSR     WRITE_NEW_P_OFFS     ; LEFT LINGERING ON.
                ABS_SHORT
;
               MOVE.L  SEQ_WR_PTR,A6        ;RELOAD THE SEQUENCE WRITE POINTER.
               MOVEQ   #0FH,D7              ;WRITE THE CLOSING END_OF_SEQUENCE
               JSR     SEQ_WRITE
               JSR     SEQ_TURNAROUND       ;SEQUENCE IS CONSOLIDATED - TIE UP THE ENDS,
               JSR     UPDATE_SEQ_SIZE      ;UPDATE MEMORY USAGE STATISTICS.
;
;
;
; YO - WE JUMP IN AT THIS POINT IF AN ATTEMPT HAS BEEN
; MADE TO CUE INTO AN EMPTY SEQUENCE OR THE null seq -
; WE RESET THE SEQUENCER, NO SEQUENCE-DATA ACTION:
;
STOP_THE_SHOW
               ST      PLAYED_TO_END        ;TELL WHOEVER CALLED US THAT WE GOTTA STOP.
               SF      SINGLE_STEP          ;KILL SINGLE-STEP STATUS IF PRESENT.
               SF      PROCESSED_TAP        ;CLEAR THE TAP-PROCESSED FLAG FOR THE NEXT SEQUENCE.
               SF      CHASING_SMPTE        ;IF SMPTE-CHASE WAS IN PROGRESS, IT SURE AIN'T ANYMORE.
;871014               SF      RECORDING            ;SHUT DOWN RECORDING AND ERASING - HOWEVER, DON'T ALTER
;871014               SF      ERASING              ;THE STATUS OF ASSOCIATED ENABLES (IN XPORT_STATE) -
;871014                                            ;IF CHASING SMPTE, WE WANT 'EM TO HANG IN THERE.
               BSR     SOFT_PUNCH_OUT       ;KILL ANY ACTIVE RECORD/ERASE STATUS, WITHOUT ALTERING
                                            ;ENABLE STATUS (IN XPORT_STATE) - SET UP LED SLOW-FLASH
                                            ;FOR ANY ACTIVE ENABLE.
;
               ST      BLEED_UART_A         ;DUMP ALL BUFFERED MIDI DATA (DON'T AWAIT SEQ CLOCKS).
               ST      BLEED_UART_B
               CLR     CLICKS_PENDING       ;WHOMP ANY LEFTOVER SEQUENCER CLOCK-SERVICE REQUESTS.
;
               JSR     OTRA_BAR_CHORES      ;RESET RECORDING PHASE VECTOR SEQUENCE, METRONOME COUNT
                                            ;AND NOW_CLICK TO BEGINNING-OF-BAR VALUES.
               MOVE    #1,NOW_BAR           ;PUT THESE GUYS BACK TO SQUARE ONE ALSO.
               MOVE    #1,NOW_BEAT
               CLR.L   OVERALL_CLICK        ;RESET COUNT OF SEQ CLOCKS SINCE PLAYBACK LAST STARTED.
;871014;
;871014               MOVE    #1,NEXT_EVENT_TIME   ;SET UP FOR FIRST CLICK TO KICK US OFF
;                                      NOT NEEDED FOR THIS .... HOLDING_EVENT_COVERS IT.
;871014;
               CLR     HOLDING_EVENT        ;NOTHING HELD OVER FROM A PREVIOUS CLICK SERVICE.
               SF      RECORD_LOOPING       ;TELL PRO_CLICK WE'RE REALLY DONE, NOT JUST LOOPING.
               CLR     CONTINUE_TIMER       ;A MIDI "CONTINUE" TRANSMISSION MAY HAVE BEEN PENDING
                                            ;FOLLOWING A RECENT FAST-WIND OR PLAY-FROM-CUE -
                                            ;MAKE SURE IT DOESN'T GET OUT NOW.
;
;
               TST.B   AUTORPT_FLAG         ;ARE WE IN AUTOREPEAT MODE?
               BEQ.S   S_S_STOP_20          ;IF NOT, THAT'S FINE,
                ABS_LONG
               JSR     AUTORPT_SWITCH       ;ELSE CALL SWITCH HANDLER TO TOGLITOFF, ETC.
                ABS_SHORT
S_S_STOP_20
                                            ;NOTE - IF RECORD WERE STILL PUNCHED IN AT THIS POINT,
                                            ;AUTORPT_SWITCH MIGHT TRY TO WRITE_NEW_X_OFFS -
                                            ;JUST A HINT FOR ANY FUTURE CODE-ZOMBIES.
;
               BSR     RESET_COUNT_IN       ;STOP/RESET ANY COUNT-IN OR TAP-IN IN PROGRESS.
;
               CLR     ACCEL_RIT_B_LEFT     ;STOP ANY ACCELERANDO/RITARDANDO CURRENTLY IN PROGRESS.
                ABS_LONG
               JSR     INIT_TEMPO_TO_ALL    ;INSTALL INITIAL TEMPO (INIT_TEMPO_USEC) FAR AND WIDE.
                ABS_SHORT
;
               JSR     INIT_WASTE_RECORD    ;DEFAULT RECORD VECTORS TO WRITE INTO WASTELAND.
;
;
               TST     S_OR_S_FLAG          ;WERE WE IN SONG MODE?
               BEQ.S   S_S_STOP_40          ;IF NOT, SKIP THIS NEXT STEP -
               ST      NEW_SONG_NOW         ;ELSE - TELL NEW_SONG_SELECTED TO DO THE FULL JOB, EVEN
                                            ;THOUGH TRANSPORT IS ACTIVE (SEE SEQFUNS4 FOR DETAILS).
                ABS_LONG
               JSR     NEW_SONG_SELECTED    ;ELSE, RESET SONG TO BEGINNING AND INSTALL FIRST SEQ.
                ABS_SHORT
               SF      NEW_SONG_NOW         ;DON'T ALLOW THIS FLAG TO HANG AROUND.
S_S_STOP_40
;
               ST      SUBFUN_INSTALL       ;UPDATE DISPLAY - MAYBE THINGS HAVE CHANGED ....
;
SEQ_END_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "SONG MODE NEXT-SEQUENCE CUEING"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; SONG MODE - MOVE ON TO NEXT SONG STEP, REPEAT WHERE WE ARE, OR STOP:
; NOTE - THIS IS A SUB-BRANCH OF SEQ_END_HANDLER.
; (MEANING - WATCH YER REGISTERS, WE'RE IN A SEQUENCE-PARSING CONTEXT!)
;
SONG_PROGRESSING
               SUBQ    #1,REPEATS_LEFT      ;JUST ENDED A SEQ - DEC REPEATS FOR THIS SONG STEP.
               BNE     RECORD_LOOP          ;    IF REPEATS LEFT, PLAY SAME ONE AGAIN
                                            ;         ELSE, MOVE TO NEXT SONG STEP
                ABS_LONG
               JSR     GET_SONG_PTR         ;POINT TO CURRENT SONG ARRAY
                ABS_SHORT
               MOVE    SONG_STEP_NUM,D0     ;GET STEP WE WERE ON
               EXT.L   D0
               ADDQ    #5,D0                ;OFFSET BEYOND NAME & STATUS
               LSL     #1,D0                ; MAKE INTO A WORD OFFSET
               ADD.L   D0,A0                ;  BUMP POINTER TO CORRECT STEP
NEXT_SONG_STEP
               ADDQ.L  #2,A0                ;BUMP TO NEXT SONG STEP
               ADDQ    #1,SONG_STEP_NUM
               MOVE    0(A0),D0             ; LOOK AT THIS STEP
               MOVE    D0,D1                ;     MAKE A COPY
               AND     #0FH,D0              ;       MASK TO TYPE
               BEQ     NEXT_SONG_STEP       ;         IF A NULL EVENT, LOOK FOR A REAL ONE
               CMP     #1,D0                ;         IF A SEQUENCE, COOL
               BEQ.S   GOT_NEXT_SEQUENCE    ;              THEN MOVE ON TO NEXT
               CMP     #0FH,D0              ;         IF AND END_OF_SONG, EMPTY
               BEQ.S   IS_END_OF_SONG       ;              THEN EMPTY SONG - HANDLE.
               CMP     #2,D0                ;         IF A TRACK MUTE, DEAL WITH
               BNE     NEXT_SONG_STEP       ;              ELSE, LOOK FOR FIRST ONE
NEW_TRACK_MUTE
               LSR     #8,D1                ;ROTATE DOWN TRACK MUTE BITS
               MOVE.B  D1,TRACKS_MUTED      ; UPDATE CONDITION (BACKGROUND WILL PICK UP ANY NASTY STUFF)
               BRA     NEXT_SONG_STEP
;
;
IS_END_OF_SONG
               TST.B   LOOP_RECORD          ;IS RECORD-LOOPING ENABLED?
               BEQ     SEQ_SELF_STOP        ;BRANCH IF NOT, SKIP ASSOCIATED TESTS.
               TST.B   USER_PUNCHED         ;HAS USER DONE MANUAL PUNCH-IN/OUT DURING CURRENT RUN?
               BNE     LOOP_REC_SONG        ;BRANCH IF SO - WE KEEP LOOPING, PUNCHED IN OR NOT.
               MOVE.B  XPORT_STATE,D0                 ;CHECK IT OUT -
               AND     #RECORD_MASK+ERASE_MASK,D0     ;IS RECORD OR ERASE ENABLED?
               BNE.S   LOOP_REC_SONG                  ;BRANCH IF YES, SET UP FOR REPLAY.
                                                      ;(YUP - SONG-MODE LOOPED RECORD!)
                                                 ;NOTE THAT THIS MEANS THAT SPP-CUE AND SMPTE-CHASE
                                                 ;WILL REPRODUCE LOOPING-RECORD BEHAVIOR ....
               BRA     SEQ_SELF_STOP        ;ELSE - CLOSE UP THIS LAST SEQUENCE AND SHUT DOWN.
;
LOOP_REC_SONG
               ST      NEW_SONG_NOW         ;CONVINCE NEW_SONG_SELECTED WE'RE NOT IN THE MIDDLE
                                            ;OF PLAYING THIS SONG - IT'S OKAY TO DO THE FULL JOB.
                ABS_LONG
               JSR     NEW_SONG_SELECTED    ;WRAP UP, RESET TO SONG STEP 1 - SET UP THIS SEQUENCE.
                ABS_SHORT
               SF      NEW_SONG_NOW         ;DITCH THIS NOW, WE DON'T NEED IT ANYMORE.
               BRA.S   RECORD_LOOP          ;GET THIS NEW SEQUENCE GOING STRAIGHTAWAY.
;
;
GOT_NEXT_SEQUENCE
               MOVE    D1,D0                ;MAKE A COPY FOR DISECTING.
               LSR     #4,D0                ; TRYING TO ISOLATE SEQ NUMBER
               AND     #07FH,D0             ;  (MASK CLEAN)
               MOVE    D0,CURRENT_SEQUENCE  ;   SAVE
               ST      CUE_NEW_SEQ          ;    FAKE RECORD_LOOP INTO INSTALLING THIS NEW SEQUENCE
               LSR     #7,D1                ;NEXT, ISOLATE NUMBER OF REPEATS
               LSR     #4,D1
               AND     #1FH,D1
               ADDQ    #1,D1                ;ADD ONE TO REPEATS TO GET TOTAL PLAYS
               MOVE    D1,TOTAL_REPEATS
               MOVE    D1,REPEATS_LEFT
;881025               BRA.S   RECORD_LOOP          ;WRAP UP SEQ WE FINISHED, MOVE ON TO NEW ONE.
               NOP                          ;WRAP UP SEQ WE FINISHED, MOVE ON TO NEW ONE.
                                            ;(THIS NOP IS A PLACE HOLDER FOR THE
                                            ;ABOVE BRA.S, WHICH ASSEMBLED AS 'NOP'
                                            ;UNDER HP64000 - STRICTLY FOR INITIAL
                                            ;LINK MAP MATCH-UP, DELETE AFTERWARDS).
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "NEXT-SEQUENCE CUEING WHILE PLAYING"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; HAVING REACHED THE END OF THE CURRENT SEQUENCE, WE WISH TO RESTART IT
; (RECORD-LOOPING, SONG STEP REPEAT) OR START A NEW SEQUENCE (NEW SONG
; STEP, HAND/MIDI CUE OF NEW SEQUENCE).
; NOTE - THIS IS A SUB-BRANCH OF SEQ_END_HANDLER.
; (MEANING - WATCH YER REGISTERS, WE'RE IN A SEQUENCE-PARSING CONTEXT!)
;
RECORD_LOOP
               CMP     #WASTELAND_WRITE,OLD_SEQ_WRITE ;HAVE WE BEEN USING WASTELAND FOR BUFFERING
                                                      ;OF "OLD" EVENTS PARSED FROM SEQUENCE?
               BNE.S   REC_LOOP_40          ;BRANCH IF NOT - JUST WRAP UP THIS SEQUENCE, HOLD NEW
                                            ;STUFF IN BUFFER FOR RECORD ONTO DOWNBEAT OF (NEW) SEQ.
;
               BSR     WASTELAND_COPY       ;SHUFFLE BUFFERED "OLD" EVENTS INTO THE "MAIN" STREAM -
                                            ;THIS ALSO ZEROES THE WASTELAND-RECORD COUNT/POINTER.
;
REC_LOOP_40
               BSR     SET_WASTE_RECORD     ;UNTIL WE HAVE COPIED FIRST BAR MARKER OF NEW SEQUENCE
                                            ;TO ITS NEW WRITE BLOCK, ALL NEW EVENT RECORD MUST DUMP
                                            ;STUFF INTO WASTELAND FOR LATER MERGE-IN (BUT IF THERE
                                            ;IS ANYTHING IN THERE ALREADY, OKAY TO LEAVE IT THERE).
;
               MOVE.L  A5,SEQ1_DRD_PTR      ;FILE SEQUENCE READ AND WRITE POINTERS - THE FOLLOWING
               MOVE.L  A6,SEQ_WR_PTR        ;ROUTINES WILL RETRIEVE THEM FROM RAM.
                ABS_LONG
               JSR     XMIT_OLD_M_OFFS      ;IF, FOR SOME UNGODLY REASON, THE SEQUENCER HAS NOTES
               JSR     XMIT_OLD_P_OFFS      ;HANGING ON, SHUT THEM OFF AND CREATE OFFS FOR THEM
               JSR     WRITE_OLD_M_OFFS     ;AFTER THE LAST BAR MARKER.
               JSR     WRITE_OLD_P_OFFS
;
               JSR     WRITE_NEW_M_OFFS     ;IF ANY NEWLY RECORDED NOTE EVENTS ARE STILL LACKING
               JSR     WRITE_NEW_P_OFFS     ;THEIR NOTE-OFF, NOW'S THE TIME - WRITE 'EM INTO SEQ.
                ABS_SHORT
;
               MOVE.L  SEQ_WR_PTR,A6        ;BRING BACK TRUSTY WRITE POINTER FOR LAST HURRAH -
               MOVEQ   #0FH,D7              ;WRITE THE CLOSING END_OF_SEQUENCE MARKER.
               JSR     SEQ_WRITE
               JSR     SEQ_TURNAROUND       ;SEQUENCE IS CONSOLIDATED - TIE UP THE ENDS,
               JSR     UPDATE_SEQ_SIZE      ;UPDATE MEMORY USAGE STATISTICS.
;
               JSR     OTRA_BAR_CHORES      ;RESET PHASE VECTOR, METRONOME COUNT, NOW_CLICK
                                            ;TO BEGINNING-OF-BAR VALUES.
               MOVE    #1,NOW_BEAT          ;PUT THESE GUYS BACK TO SQUARE ONE ALSO.
               MOVE    #1,NOW_BAR
                                            ;NOTE - DON'T RESET CLICKS SINCE START OF SEQUENCE -
                                            ;KEEP COUNTING UP AS LONG AS WE'RE RUNNING .....
;871014;
;871014               MOVE    #1,NEXT_EVENT_TIME   ; SET UP FOR FIRST CLICK TO KICK US OFF
;                                      NOT NEEDED FOR THIS .... HOLDING_EVENT COVERS IT.
;871014;
               CLR     HOLDING_EVENT        ;NOTHING HERE SAYS WE'RE STARTING SEQUENCE FROM TOP.
               ST      RECORD_LOOPING       ;TELL END_OF_CLICK ROUTINE (WHO WE WILL BE RETURNING TO)
                                            ;NOT TO DO FIRST-CLOCK DOUBLE-FETCH, EVEN THOUGH ALL
                                            ;CONDITIONS FOR DOING IT ARE CURRENTLY MET -
                                            ;WE'LL GET TO IT NEXT TIME THROUGH.
;
;
;
;
; COME HERE TO PLUG IN A SEQUENCE ON THE FLY (SORT OF) AFTER THE LAST-
; PLAYED SEQUENCE HAS BEEN WRAPPED - YES, IT COULD BE THE SAME ONE.
; COVERS RECORD-LOOPING, SONG-MODE AND BY-HAND/BY-MIDI SEQUENCE CUEING.
;
; A CALL HERE WILL CAUSE NOW_SEQ_STATUS TO GET SET TO REFLECT STATUS OF
; NEW SEQUENCE - THUS WE CAN USE IT TO DETERMINE IF WE ARE CUEING UP AN
; EMPTY SEQUENCE OR THE NULL SEQ (#100 OR "xx"), AND AS SIGNAL OF SAME.
;
; CALLING CONVENTIONS:  TARGET SEQUENCE NUMBER IS IN CURRENT_SEQUENCE.
; IF CUE_NEW_SEQ NOT = 0, PERFORM AS THOUGH DEALING WITH NEW SEQUENCE -
; IF = 0, PERFORM AS THOUGH REPLAYING SAME ONE - CERTAIN STEPS CAN BE
; SKIPPED, SOME THINGS CAN BE LEFT ALONE RATHER THAN GETTING RESET.
;
SET_UP_SEQUENCE
               TST.B   CUE_NEW_SEQ          ;ARE WE BEING TOLD TO PLAY A NEW SEQUENCE?
               BEQ.S   REPLAY_SEQ           ;BRANCH IF NOT, REPLAY THE ONE JUST ENDED.
;
                                            ;ELSE .....
;
               SF      CUE_NEW_SEQ          ;KILL "NEW SEQUENCE REQUEST" FLAG -
                                            ;SEE IF NEW SEQUENCE IS FOR REAL (I.E., PLAYABLE).
;
               SF      READY_TO_RPT         ;UNBLOCK THE CALL (BELOW, IN REPLAY_SEQ) TO
                                            ;UPDATE_REPEATS, WHICH WILL SET UP REPEAT-LOOPING
                                            ;PARAMETERS FOR THE NEW SEQUENCE (NORMAL FULL-SEQUENCE
                                            ;LOOPING LEAVES THIS FLAG SET AT END OF SEQUENCE TO
                                            ;BLOCK THIS FROM HAPPENING, SO THAT REPEAT_COUNT IS NOT
                                            ;RESTARTED EACH TIME THROUGH).
;
               CMP     #99,CURRENT_SEQUENCE ;ARE WE CUEING UP THE NULL SEQUENCE (FREE MEM STRING)?
               BNE.S   NOT_NULL_SEQ         ;CONTINUE IF NOT,
               CLR     NOW_SEQ_STATUS       ;ELSE SET STATUS FLAG FOR UNPLAYABLE SEQUENCE -
               BRA     STOP_THE_SHOW        ;NOW QUIT (CUNNING LAD WOULD CLAIM HE'S ALLOCATED).
;
NOT_NULL_SEQ
               JSR     GET_CUR_SEQ_DIR      ;SET A0 AS POINTER TO CURRENT_SEQUENCE DIRECTORY BLOCK.
               MOVE    Q_STATUS(A0),NOW_SEQ_STATUS    ;CHECK AND POST STATUS OF THIS SEQUENCE -
               BEQ     STOP_THE_SHOW                  ;IF SEQUENCE EMPTY, GO NO FURTHER.
;
                                            ;NOTE - NOW_SEQ_STATUS = 0 WILL SIGNAL PRO_CLICK TO
                                            ;FULL-STOP SEQUENCER AND TAKE IT OFF-LINE.
                                            ;SINCE FORMER_SEQUENCE STILL NOT = CURRENT_SEQUENCE AND
                                            ;TRANSPORT WILL BE KILLED BY PRO_CLICK, BACKGROUND WILL
                                            ;PICK UP THE BALL AND "INSTALL" NEW (DEAD) SEQUENCE -
                                            ;WE DON'T NEED TO BOTHER WITH WHAT FOLLOWS BELOW.
;
;
;
; NEW SEQUENCE IS VIABLE, LET'S PLUG IT IN:
; (NOTE THAT STUFF BETWEEN HERE AND "RTS" IS SUBSTANTIALLY THE SAME AS
; STEPS CONTAINED IN SEQ_CHANGE_SUB:SEQSUBS - POSSIBLE INTEGRATION?)
;
               MOVE    CURRENT_SEQUENCE,FORMER_SEQUENCE    ;FULL CROSSOVER.  CURRENT_SEQUENCE IS IT.
               MOVE    Q_TOTAL_BARS(A0),TOTAL_BARS         ;OFFLOAD TOTAL BARS
               MOVE    TOTAL_BARS,NOW_LAST_BAR
               MOVE    Q_INIT_TEMPO(A0),INIT_TEMPO_USEC    ;DOWNLOAD INIT TEMPO FROM SEQ DIRECTORY.
                ABS_LONG
               JSR     RESET_PUNCHES        ;RESET PUNCH IN/OUT POINTS
                ABS_SHORT
                                            ;FALL THROUGH TO FINISH SETTING UP THIS SEQUENCE ....
;
;
;
; COME HERE TO REPLAY SAME SEQUENCE WE JUST WRAPPED UP, ON THE FLY -
; COVERS RECORD-LOOPING, SONG-MODE AND RESTART UNDER MIDI/SMPTE CONTROL.
; LEAVES PUNCH-IN/OUT POINTS (AMONG OTHER THINGS) WHERE THEY ARE.
;
REPLAY_SEQ
               JSR     SEQ1_DRD_SETUP       ;SET UP SEQUENCE READ/WRITE PROCESSES.
;
                ABS_LONG
               JSR     INIT_TEMPO_TO_ALL    ;INSTALL INITIAL TEMPO (INIT_TEMPO_USEC) FAR AND WIDE.
                ABS_SHORT
;
               MOVE    CUR_TEMPO_FPB,INIT_TEMPO_FPB   ;SINCE USEC_TO_ALL WAS KIND ENOUGH TO FIND
               MOVE    CUR_TEMPO_BPM,INIT_TEMPO_BPM   ; TYPES, COPY THEM FORR INIT_'s USE.
;
               TST.B   READY_TO_RPT         ;IF WE HIT THE END OF THE SEQUENCE WITH THIS FLAG SET,
                                            ;IT CAN ONLY MEAN WE WERE SET TO REPEAT-LOOP THE ENTIRE
                                            ;SEQUENCE, AND ARE DOING IT VIA LOOPED-RECORD MECHANISM
                                            ;INSTEAD OF NON-DESTRUCTIVE REPEAT-LOOP PLAYBACK - THIS
                                            ;FLAG IS NORMALLY LEFT SET TO KEEP REPEAT_COUNT FROM
                                            ;GETTING RESTARTED EACH TIME THROUGH, ALTHOUGH NEW SEQ
                                            ;CUE AND SONG-STEPPING CLEAR IT TO ALLOW NEW SEQ PARAMS
                                            ;TO GET PLUGGED IN ....
               BNE.S   REPL_SEQ_20          ;BRANCH IF SET, DON'T UPDATE_REPEATS - ELSE,
               BSR     UPDATE_REPEATS       ;DOWNLOAD PLAYBACK REPEAT LOOP PARAMETERS FOR NEW SEQ.
REPL_SEQ_20
;
               BSR     CUED_BAR_PUNCH       ;PUNCH IN, PUNCH OUT, OR MASTURBATE AS APPROPRIATE.
;
               RTS                          ;AND, CONTINUE...
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "GENERIC SEQUENCE EJECT"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; "EJECT" THE SEQUENCE CURRENTLY PLAYING / CUEING THROUGH SEQUENCER:
; PREPARE THE SEQUENCER TO DEAL WITH A NEW SEQUENCE (OR THE SAME ONE)
; WHICH IS TO BE STARTED UP FROM THE BEGINING.
;
; IMPORTANT BASIC ASSUMPTION TIME:
;
; WE ARE CALLED IN TO HANDLE CASES IN WHICH NORMAL SEQUENCE PLAYBACK IS
; BEING INTERRUPTED FOR SOME REASON - SUCH AS INITIATION OF A FAST-WIND,
; SONG-POINTER CUE, SMPTE CHASE, RESPONSE TO MIDI/SMPTE RESTART, OR EVEN
; SOMEONE HITTING THE "STOP" SWITCH.  SINCE WE HAVE NO REAL IDEA OF JUST
; WHICH CASE APPLIES WHEN WE ARE CALLED, WE DO NOT EFFECT ANY CHANGES IN
; SEQUENCER TRANSPORT STATUS AT LARGE.
;
; WE ARE NOT CALLED DURING NORMAL PLAYBACK OR FROM ANY OF THE NORMAL
; PLAYBACK ROUTINES (I.E., PRO_CLICK) - WE ARE NOT BEING USED TO ASSIST
; IN THE "SMOOTH" TRANSITION TO A NEW SEQUENCE UPON HITTING THE END OF
; THE ONE CURRENTLY PLAYING (AS PER SONG-MODE, RECORD LOOPING, CUEING OF
; A NEW SEQUENCE BY HAND OR VIA MIDI WHILE PLAYING) - IN FACT, WE KILL
; ANY PENDING NEW-SEQUENCE CUE REQUEST TO HEAD OFF POSSIBLE CONFUSION
; DURING WHATEVER IS TO FOLLOW (AS REGARDS WHICH SEQUENCE WE REALLY
; SHOULD BE FAST-WINDING, ETC., THROUGH).
;
; WE ASSUME WE'RE SOMEWHERE BEFORE END OF A VALID, NON-EMPTY SEQUENCE -
; WE'RE NOT EQUIPPED TO DEAL WITH A SEQUENCE ALREADY AT ITS END POINT.
; HOWEVER, IT'S PERMISSIBLE TO CALL US UNDER THIS CONDITION IF THE FLAG
; PLAYED_TO_END(.B) IS SET, SINCE WE WILL THEN OMIT TO EXECUTE THE STEPS
; ASSOCIATED WITH ACTUAL SEQUENCE EJECTION (ASSUMING THAT THEY HAVE
; ALREADY BEEN HANDLED BY SEQ_END_HANDLER), AND WILL GO THROUGH ONLY THE
; TASKS NEEDED TO RESET THE SEQUENCER ITSELF SO THAT THE WAY IS PAVED
; FOR THE NEXT TIME SEQUENCE PLAYBACK IS INITIATED.
;
; OTHER USEFUL THINGS TO KNOW:
;
; BALANCES OUT TRANSMITTED NOTES - TURNS OFF ANYONE WHO IS STILL ON
; (NOTE THAT WE SENSE CONDITIONS IN WHICH THIS IS UNNECESSARY).
; FLUSHES NOTES-CURRENTLY-ON BUFFERS (FAST FLUSH - MAY BE MIDI "START").
; MERGES ANY NEW OR EXISTING EVENTS OUTSIDE THE DATA STREAM BACK IN,
; IF NECESSARY WRITES NOTE-OFF EVENTS TO BALANCE NEW NOTE-ON EVENTS,
; CONSOLIDATES, TURNS-AROUND, UPDATES SEQUENCE DIRECTORY.
; PUNCHES OUT OF RECORD/ERASE WITHOUT AFFECTING THEIR ENABLE STATUS -
; SETS LED SLOW-FLASH FOR WHICHEVER ONE (IF ANY) HAPPENS TO BE ENABLED.
; CLEARS/RESETS SUNDRY OTHER THINGS WHICH ALWAYS ASSUME SPECIFIC VALUES
; OR STATES WHEN NEW SEQUENCE IS STARTED UP - I.E., THOSE WHICH ARE NOT
; AFFECTED BY THE CONTENTS OF THE SEQUENCE ITSELF (FOR EXAMPLE, FORGETS
; WHAT BAR WE WERE ON, BUMPS US TO BAR 1 - FAST-WINDERS TAKE HEED ....)
; ALSO RESETS A FEW THINGS TO INITIAL CONDITIONS BASED ON THE CURRENT
; SEQUENCE (ASSUMING THAT IT MIGHT CONTINUE TO BE THE CURRENT SEQUENCE).
;
; REGISTERS ARE WIDELY MASSACRED - WHAT DO YOU CARE?  (NOT MUCH I HOPE).
;
EJECT_SEQUENCE
               TST.B   PLAYED_TO_END        ;HAVE WE JUST PLAYED TO THE END OF WHATEVER?
               BNE     EJECT_D0             ;BRANCH IF YES, SKIP ALL OF THE STUFF HAVING TO DO WITH
                                            ;CLEARING THE SEQUENCE OUT OF THE SEQUENCER -
                                            ;IT'S ALREADY BEEN DONE (BY SEQ_END_HANDLER).
;
;
; ELSE - SETTLE ACCOUNTS WITH "THEM" OUT THERE IF APPROPRIATE,
; AS REGARDS MATCHING NOTE-OFFS TO UNMATCHED NOTE-ONS:
;
               TST.B   SINGLE_STEP          ;ARE WE IN SINGLE-STEP MODE?
               BNE.S   EJECT_20             ;BRANCH IF YES, MAY WELL NEED THIS EVEN IF PAUSED.
               BTST    #PAUSE_BIT,XPORT_STATE    ;IS SEQUENCER PAUSED (APART FROM SINGLE STEP)?
               BNE.S   EJECT_40                  ;BRANCH IF YES, WE SHOULDN'T NEED THIS.
               MOVE.B  CUEING_TO_SPP,D0     ;EVEN IF PAUSED, IF WE WERE DOING CUE TO MIDI SPP,
               OR.B    CHASING_SMPTE,D0     ;OR IF WE WERE IN THE MIDDLE OF SMPTE CHASE,
               BNE.S   EJECT_40             ;SHOULDN'T NEED TO DO THIS - HAVEN'T PLAYED ANYTHING.
EJECT_20
               BSR     WAIT_AND_OFF         ;MASS-EVACUATE ANY MIDI EVENTS SITTING IN TRANSMIT
                                            ;BUFFERS, THEN TURN OFF ALL MIDI AND INTERNAL NOTES
                                            ;CURRENTLY ON.
;
EJECT_40
                ABS_LONG
               JSR     FLUSH_OLD_PADS       ;CLEAR OUT LISTS OF CURRENTLY-ON SEQUENCE NOTES.
               JSR     FLUSH_OLD_MIDI
                ABS_SHORT
;
;
;
; OKAY THEN - GET THE SEQUENCE OUTTA HERE, TIE IT OFF:
;
               TST.B   NOW_REPEATING        ;WERE WE IN REPEAT-LOOP PLAYBACK MODE?
               BNE.S   EJECT_80             ;BRANCH IF YES, GO STRAIGHT FOR CONSOLIDATE -
                                            ;BY DEFINITION, NO DATA (NEW OR OLD) NEEDS TO BE MERGED
                                            ;INTO SEQUENCE READ/WRITE STREAM.
;
               MOVE.L  SEQ_WR_PTR,A6        ;NOW IT'S DARK - FETCH SEQUENCE READ/WRITE POINTERS.
               MOVE.L  SEQ1_DRD_PTR,A5
               TST     HOLDING_EVENT        ;FIRST - HAVE WE GOT STARTED INTO SEQUENCE AT ALL?
               BEQ.S   EJECT_60             ;BRANCH IF NOT - ELSE,
               JSR     WASTELAND_COPY       ;MERGE IN ANY EVENTS BUFFERED IN WASTELAND - THESE MAY
                                            ;BE EITHER NEWLY RECORDED EVENTS, OR EXISTNG SEQUENCE
                                            ;DATA BEING SHUFFLED THROUGH WASTELAND UNDER THE PHASE
                                            ;VECTOR SYSTEM FOR AUTOCORRECT RECORDING - EITHER WAY,
                                            ;IT BELONGS WITHIN CURRENT TIME-MARK INTERVAL.
               MOVE    HOLDING_EVENT,D7     ;FOLLOW THIS WITH FIRST WORD OF NEXT TIMING EVENT.
               JSR     SEQ_WRITE            ;WRITE IT (WHATEVER IT WAS) TO NEW WRITE BLOCK.
               AND     #0FH,D7              ;WAS IT A TIME MARKER OR FIRST WORD OF BAR MARKER?
               CMP     #8,D7                ;(TYPE CODE FOR BAR MARKER)
               BNE.S   EJECT_70             ;BRANCH IF NOT BAR MARKER (TIME MARKER ONLY ONE WORD),
               JSR     SEQ1_DSTR_READ       ;ELSE COPY REMAINDER OF BAR MARKER ACROSS THE GAP -
               JSR     SEQ_WRITE            ;SEQ_CONSOLIDATE CHOKES ON SPLIT-UP SEQUENCE EVENTS.
               BRA.S   EJECT_70
;
EJECT_60
                                            ;WE HAVEN'T BEGUN PARSING THROUGH SEQUENCE - HOWEVER,
                                            ;WE MAY HAVE RECORDED SOME NEW EVENTS USING THE PAUSED
                                            ;RECORD GAMBIT - THESE (IF PRESENT) MUST BE MERGED INTO
                                            ;SEQUENCE BEHIND THE FIRST BAR-MARKER, SO:
               JSR     SEQ1_DSTR_READ       ;READ AND COPY OVER BOTH WORDS OF THE BAR-MARKER.
               JSR     SEQ_WRITE
               JSR     SEQ1_DSTR_READ
               JSR     SEQ_WRITE
               JSR     CHECK_FOR_A_R_MARK   ;IF AN ACCELERANDO/RITARDANDO EVENT LURKS IN BAR 1,
                                            ;IT'LL BE RIGHT BEHIND BAR MARKER (AND MUST NOT GET
                                            ;SEPARATED FROM IT, FOR EDITING REASONS) - THIS HANDY
                                            ;ROUTINE COVERS ALL ANGLES OF THIS SITCHY-WATION.
               JSR     WASTELAND_COPY       ;NOW, COPY OVER ANY NEW EVENTS SITTING IN BUFFER.
;
EJECT_70
               MOVE.L  A5,SEQ1_DRD_PTR      ;SAVE NEW SEQUENCE READ POINTER.
               MOVE.L  A6,SEQ_WR_PTR        ;SAVE NEW SEQUENCE WRITE POINTER.
;
                ABS_LONG
               JSR     WRITE_NEW_M_OFFS     ;CREATE "OFFS" IN THE SEQUENCE FOR ANY NEW NOTES
               JSR     WRITE_NEW_P_OFFS     ;STILL GATED ON.
                ABS_SHORT
;
EJECT_80
               MOVE.L  SEQ_WR_PTR,A6        ;SET UP SEQUENCE READ AND WRITE POINTERS,
               MOVE.L  SEQ1_DRD_PTR,A5
               JSR     SEQ_CONSOLIDATE      ;SEAL UP THIS SEQUENCE IN ONE NICE PACKAGE.
               JSR     SEQ_TURNAROUND       ;NOW TIE UP THE ENDS AS APPROPRIATE.
               JSR     UPDATE_SEQ_SIZE      ;UPDATE MEMORY USAGE AND FREE MEM TRACKING VARIABLES.
;
;
;
;
; THAT PRETTY MUCH TAKES CARE OF THE SEQUENCE -
; NOW FOR THE SEQUENCER ITSELF - FIRST, RECORD/ERASE PUNCH-OUT:
;
;871014               SF      RECORDING            ;PUNCH OUT RECORD/ERASE (IF PUNCHED IN) -
;871014               SF      ERASING              ;BUT DON'T MESS WITH ENABLES (I.E., XPORT_STATE).
;871014               MOVE.B  XPORT_STATE,D0       ;SINCE WE ARE PUNCHED OUT FOR THE MOMENT, AND KNOW NOT
;871014               BTST    #RECORD_BIT,D0       ;WHERE WE WILL WIND UP (START, CUED SOMEWHERE),
;871014               BEQ.S   EJECT_A0             ;SET LED FOR ANY ENABLED FUNCTION INTO SLOW-FLASH MODE,
;871014               BSR     RECORD_LED_SLOW      ;AND COUNT ON CUED-PUNCH TESTS TO RESTORE THEM.
;871014EJECT_A0
;871014               BTST    #ERASE_BIT,D0        ;WE FALL THROUGH FROM ABOVE, BUT ONLY ONE WILL BE SET.
;871014               BEQ.S   EJECT_C0
;871014               BSR     ERASE_LED_SLOW
;871014EJECT_C0
;871014;
;
               BSR     SOFT_PUNCH_OUT       ;KILL ANY ACTIVE RECORD/ERASE STATUS, WITHOUT ALTERING
                                            ;ENABLE STATUS (IN XPORT_STATE) - SET UP LED SLOW-FLASH
                                            ;FOR ANY ACTIVE ENABLE.
;
;
; RESET THE SEQUENCER STATE AT LARGE:
; NOTE THAT WE COME DIRECTLY HERE IF WE HAVE ALREADY PLAYED_TO_END(.B),
; SINCE SEQ_END_HANDLER COVERS ALL OF THE ABOVE STUFF.
;
EJECT_D0
               JSR     INIT_WASTE_RECORD    ;INITIALIZE WASTELAND RECORD PROCESS, POINT NEW-EVENT
                                            ;RECORD VECTORS AT WASTELAND.
               SF      RECORD_LOOPING       ;AS EXPLAINED ABOVE - PLAYBACK HAS BEEN INTERRUPTED,
                                            ;WE HAVE NO REASON TO ALLOW THIS FLAG TO EXIST.
               CLR     CLICKS_PENDING       ;MAKE SURE WE HAVE NO CLOCK-SERVICE REQUESTS LEFT.
               CLR     CONTINUE_TIMER       ;SUPPRESS ANY PENDING MIDI "CONTINUE" TRANSMISSION.
               CLR     HOLDING_EVENT        ;WHEN WE RESTART, SAY 'HEY - CLEAN SLATE, DUDE...'
                                            ;NO PART OF ANY SEQUENCE EVENT BEING HELD HERE.
               CLR.L   OVERALL_CLICK        ;ANY TIME WE EJECT, WE'VE PRETTY MUCH LOST TRACK OF HOW
                                            ;FAR WE ARE FROM THE POINT AT WHICH WE BEGAN PLAYING OR
                                            ;CUEING - SO, BACK TO THE BEGINNING OF TIME ....
               SF      PROCESSED_TAP        ;FORGET HAVING SEEN ANY TAP-TRACK EVENTS LATELY.
               SF      CUE_NEW_SEQ          ;FORGET ANY PENDING REQUESTS TO CUE A NEW SEQUENCE -
               MOVE    FORMER_SEQUENCE,CURRENT_SEQUENCE    ;ELIMINATE ANY DOUBT AS TO WHICH
                                                           ;SEQUENCE WE'RE DEALING WITH AT PRESENT
                                                           ; - NAMELY, THE ONE WE JUST EJECTED.
               BSR     OTRA_BAR_CHORES      ;DOWNLOAD ANY PENDING EDITS TO AUTOCORRECT VARIABLES,
                                            ;RESET METRONOME, RECORDING PHASE AND NOW_CLICK TO THE
                                            ;BEGINNING OF THE BAR -
               MOVE    #1,NOW_BAR           ;THAT BEING BAR 1, NATCH ....
               MOVE    #1,NOW_BEAT          ;AND OF COURSE WE'RE ON BEAT ONE ....
               CLR     MA_SEQ_ADVANCE       ;RESET UART ADVANCE/DELAYS.
               CLR     MB_SEQ_ADVANCE
               CLR     ACCEL_RIT_B_LEFT     ;STOP ANY ACCELERANDO/RITARDANDO CURRENTLY IN PROGRESS.
               BSR     UPDATE_REPEATS       ;RESET PLAYBACK LOOP COUNT/BAR NUMBERS, CLEAR STATUS.
;
                ABS_LONG
               JMP     INIT_TEMPO_TO_ALL    ;INSTALL INITIAL TEMPO (INIT_TEMPO_USEC) FAR AND WIDE -
                                            ;RETURN THROUGH.
                ABS_SHORT
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "PLAY/STOP FOOTSWITCH HANDLER"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; PLAY/STOP FOOTSWITCH HANDLER -
; IF NOTHING DOING, HIT PLAY_SWITCH - ELSE, HIT STOP_SWITCH.
;
;
PLAY_STOP_SWITCH
               TST.B   XPORT_STATE          ;ARE WE ALIVE?
               BNE     STOP_SWITCH          ;BRANCH IF YES, GO KILL OURSELF.
               BRA     PLAY_SWITCH          ;ELSE GO PLAY WITH OURSELF.
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "TRANSPORT LED CONTROL ROUTINES"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; TRANSPORT LED CONTROL FUNCTIONS:
; THESE ROUTINES SET/CLEAR BIT FLAGS IN THE VARIABLES USED BY THE
; BACKGROUND LED-MAINTENANCE FUNCTIONS - NO DIRECT LED ACCESS HERE,
; HENCE NO IMMEDIATE EFFECT IF BACKGROUND EXECUTION IS SUSPENDED.
; NO REGISTERS AFFECTED.
;
;
; SPECIFIX:
;
PLAY_LED_OFF
               MOVE.L  D0,-(A7)
               MOVEQ   #PLAY_LED_BIT,D0
               BRA.S   LED_OFF
;
PLAY_LED_SOLID
               MOVE.L  D0,-(A7)
               MOVEQ   #PLAY_LED_BIT,D0
               BRA.S   LED_SOLID
;
PLAY_LED_SLOW
               MOVE.L  D0,-(A7)
               MOVEQ   #PLAY_LED_BIT,D0
               BRA.S   LED_SLOW
;
PLAY_LED_FAST
               MOVE.L  D0,-(A7)
               MOVEQ   #PLAY_LED_BIT,D0
               BRA.S   LED_FAST
;
PAUSE_LED_OFF
               MOVE.L  D0,-(A7)
               MOVEQ   #PAUSE_LED_BIT,D0
               BRA.S   LED_OFF
;
PAUSE_LED_FAST
               MOVE.L  D0,-(A7)
               MOVEQ   #PAUSE_LED_BIT,D0
               BRA.S   LED_FAST
;
PAUSE_LED_SOLID
               MOVE.L  D0,-(A7)
               MOVEQ   #PAUSE_LED_BIT,D0
               BRA.S   LED_SOLID
;
RECORD_LED_OFF
               MOVE.L  D0,-(A7)
               MOVEQ   #RECORD_LED_BIT,D0
               BRA.S   LED_OFF
;
RECORD_LED_SLOW
               MOVE.L  D0,-(A7)
               MOVEQ   #RECORD_LED_BIT,D0
               BRA.S   LED_SLOW
;
RECORD_LED_SOLID
               MOVE.L  D0,-(A7)
               MOVEQ   #RECORD_LED_BIT,D0
               BRA.S   LED_SOLID
;
ERASE_LED_OFF
               MOVE.L  D0,-(A7)
               MOVEQ   #ERASE_LED_BIT,D0
               BRA.S   LED_OFF
;
ERASE_LED_SLOW
               MOVE.L  D0,-(A7)
               MOVEQ   #ERASE_LED_BIT,D0
               BRA.S   LED_SLOW
;
ERASE_LED_SOLID
               MOVE.L  D0,-(A7)
               MOVEQ   #ERASE_LED_BIT,D0
               BRA.S   LED_SOLID
;
;
;
; GENERIX:
; NOTE THAT TRANSPORT LED BITS ARE IN THE M.S.BYTE OF LED CONTROL WORDS.
;
LED_OFF
               BSET    D0,LED_EXTINGUISH
               MOVE.L  (A7)+,D0
               RTS
;
LED_SOLID
               BCLR    D0,LED_SLOW_FLASH
               BCLR    D0,LED_FAST_FLASH
               BSET    D0,LED_STEADY
               BCLR    D0,LED_EXTINGUISH
               MOVE.L  (A7)+,D0
               RTS
;
LED_SLOW
               BSET    D0,LED_SLOW_FLASH
               BCLR    D0,LED_FAST_FLASH
               BCLR    D0,LED_STEADY
               BCLR    D0,LED_EXTINGUISH
               MOVE.L  (A7)+,D0
               RTS
;
LED_FAST
               BCLR    D0,LED_SLOW_FLASH
               BSET    D0,LED_FAST_FLASH
               BCLR    D0,LED_STEADY
               BCLR    D0,LED_EXTINGUISH
               MOVE.L  (A7)+,D0
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "TRANSPORT-RELATED MESSAGES TO 6803"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; TIME CHIP INTERFACE, OUTGOING:
; MESSAGES TO 6803 REGARDING CHANGES IN TRANSPORT STATUS.
;
; SYNOPSIS OF ACTIONS ON THE 6803 END (AS OF SMPTE 1.3):
;
;     START (F5)    -  6803 SETS INTERNAL FLAG FOR "ON" STATE.
;                      MIDI START BYTE IS SENT VIA 6803 UART.
;                      NO OTHER ACTION IF NOT INTERNAL OR MTC TIMEBASE.
;                      IF MTC TIMEBASE:
;                             START-TIME COPIED TO NOW-TIME.
;                      IF INTERNAL TIMEBASE:
;                             START-TIME COPIED TO NOW-TIME, FORMER-TIME.
;                             FURTHER INITIALIZATION WITH RESPECT TO MTC
;                             TRANSMISSION, SMPTE TIME CODE GENERATION.
;                             SET UP FOR IMMEDIATE INTERNAL INTERRUPT TO
;                             FORCE FIRST CLOCK TO 68000 IMMEDIATELY.
;
;     STOP (F6)     -  6803 DISABLES INTERNAL HI-SPEED MODE IF ACTIVE.
;                      6803 CLEARS INTERNAL FLAGS FOR "ON" STATE,
;                      HIGH-SPEED REQUEST, START-TIME MATCH DETECTED.
;                      CLEARS SYNC CLOCK, 68000 CLOCK INTERRUPT OUTPUTS.
;                      MIDI STOP BYTE IS SENT VIA 6803 UART.
;
;     PAUSE (FC)    -  IDENTICAL TO STOP (F6).
;
;     UNPAUSE (FD)  -  MIDI CONTINUE BYTE IS SENT VIA 6803 UART.
;                      6803 SETS INTERNAL FLAG FOR "ON" STATE.
;                      IF INTERNAL TIMEBASE:
;                             SET UP FOR IMMEDIATE INTERNAL INTERRUPT TO
;                             FORCE FIRST CLOCK TO 68000 IMMEDIATELY.
;
;
;
START_TC
               MOVE.L  D0,-(A7)
               MOVEQ   #NEG_EXT+0F5H,D0
               BRA.S   DO_WRITE_TO_TC
;
;
STOP_TC
PAUSE_TC
               MOVE.L  D0,-(A7)
               MOVEQ   #NEG_EXT+0F6H,D0     ;THIS IS THE "STOP" CODE ....
               BRA.S   DO_WRITE_TO_TC
;
;
UNPAUSE_TC
               MOVE.L  D0,-(A7)
               MOVEQ   #NEG_EXT+0FDH,D0
;
;
DO_WRITE_TO_TC
               BSR     WRITE_TO_TC
               MOVE.L  (A7)+,D0
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "SEQUENCE NOTE BALANCE-OUT FOR STOP/PAUSE"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; GATE OFF ALL SUSTAINING SEQUENCE NOTES (FOR STOP OR PAUSE) -
; WE WAIT UNTIL MIDI TRANSMIT BUFFERS ARE EMPTY, FORCING TRANSMISSION
; IF NECESSARY, THEN GO THROUGH MIDI NOTES-ON LISTS AND TRANSMIT
; NOTE-OFF EVENTS FOR ALL PRESENT -
; WE GATE OFF ALL SUSTAINING SEQUENCE INTERNAL VOICES, TOO.
; NO GUARANTEES WITH RESPECT TO REGISTERS.
;
WAIT_AND_OFF
;
CLEAR_OUT_A
               TST     MA_XMIT_SEQ_CNT      ;MAKE SURE BUFFER EMPTY
               BEQ.S   CLEAR_OUT_B
               MOVE.B  #0B5H,UART_A_CONTROL ;    THEN  REENABLE XMIT TO MAKE SURE WE GET SOME ROOM
               ST      BLEED_UART_A         ;    AND MAKE SURE WE CLEAR THE BABY OUT
               BRA     CLEAR_OUT_A
CLEAR_OUT_B
               TST     MB_XMIT_SEQ_CNT
               BEQ.S   READY_TO_XMIT_OFFS
                                            ;IF NOT,
               MOVE.B  #0B5H,UART_B_CONTROL ;    THEN  REENABLE XMIT TO MAKE SURE WE GET SOME ROOM
               ST      BLEED_UART_B         ;    AND MAKE SURE WE CLEAR THE BABY OUT
               BRA     CLEAR_OUT_B
;
READY_TO_XMIT_OFFS
                ABS_LONG
               JSR     XMIT_OLD_P_OFFS      ;WHEN ALL DONE, XMIT LINGERING OFFS
               JSR     XMIT_OLD_M_OFFS
                ABS_SHORT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "PLAYBACK REPEAT-LOOP RESET/UPDATE"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; UPDATE REPEAT-LOOP COUNTERS AND FLAGS FOR CURRENT_SEQUENCE -
; SET UP THE START-OF-PLAYBACK STATE:
; SHOULD BE CALLED WHENEVER SEQUENCER STOPS, A NEW SEQUENCE IS CUED,
; OR REPEAT POINTS IN A SEQUENCE ARE EDITED (BUT NOT WHILE RUNNING!).
;
UPDATE_REPEATS
               JSR     GET_CUR_SEQ_DIR      ;SET A0 AS POINTER TO CURRENT_SEQUENCE DIRECTORY BLOCK.
               SF      NOW_REPEATING        ;WE ARE NOT AT PRESENT DOING REPEAT-LOOP PLAYBACK,
               SF      READY_TO_RPT         ;NOR ARE WE ON THE VERGE OF IT - AS FAR AS WE KNOW.
               CLR     REPEAT_START         ;UNTIL FURTHER NOTICE, KEEP THESE CLEAR - NOTE THAT
               CLR     REPEAT_END           ;THEY ARE ZEROED ONLY IF NO LOOP IS ENABLED.
               CLR     D0
               MOVE.B  Q_RPT_COUNT(A0),D0   ;ARE WE TO DO ANY LOOPING WHILE IN PLAYBACK?
               BEQ.S   UPD_RPTS_20          ;NO - STORE ZERO LOOP COUNT, LEAVE FLAGS, ETC. CLEARED.
               CMP     #255,D0              ;YES - IS INFINITE REPEAT SELECTED?
               BLT.S   UPD_RPTS_10          ;NO - D0 CONTAINS (FINITE) NUMBER OF REPEATS.
               MOVEQ   #-1,D0               ;YES - USE -1 TO INDICATE INFINITE REPEAT.
UPD_RPTS_10
               MOVE    Q_RPT_START(A0),REPEAT_START   ;WE'RE TO LOOP IN PLAYBACK - SET UP LIMITS.
               MOVE    Q_RPT_END(A0),REPEAT_END
               ADDQ    #1,REPEAT_END        ;LOOP ENDS AFTER, NOT AT, BAR NUMBER SET FOR LOOP END.
UPD_RPTS_20
               MOVE    D0,REPEAT_COUNT      ;D0 HAD IT (SHOULD BE ZERO IF NOT LOOPING).
UPD_RPTS_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
