               INCLUDE HPFIXUPS
               TITLE "MESSAGES FROM 6803 TO 68000"
***************************************************************************************************
***************************************************************************************************
***                                                                                             ***
***            PRO_TC - PROCESSING MESSAGES FROM THE 6803 TIMING CHIP                           ***
***                                                                                             ***
***************************************************************************************************
***************************************************************************************************
;
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.
;
               INCLUDE EQUATES         ;HDW ADDR AND CONSTANT DEFS, ABS_SHORT DIRECTIVE.
;
               INCLUDE SEQDEFS         ;SEQUENCER CONSTANT DEFINITIONS.
;
               include trapdefs        ; system function access definitions.
;
               include lcd_funs        ; lcd/screen_buffer system function defs.
;
               GLB     PRO_TC,WRITE_TO_TC
               GLB     SEND_6803_START,SEND_6803_STOP
               GLB     SEND_6803_CLOCK,SEND_6803_CONTINUE
               GLB     SYNC_PLAY_RESTART
               GLB     STEP_SPP_CUE
;
               EXTERNAL  UNLOAD_LEVEL_5,GET_LEVEL_5
               EXTERNAL  BACK_HANDLER
;900621               EXTERNAL  MTC_SET_UP
;900621               EXTERNAL  MIDITC_SHORT
;920813-05:18pm .... we're baaaaack ....
               EXTERNAL  MIDITC_SHORT
;920813-05:18pm .... we're baaaaack ....
               EXTERNAL  XMIT_OLD_P_ONS
               EXTERNAL  XMIT_OLD_M_ONS
               EXTERNAL  NEW_SONG_SELECTED
               EXTERNAL  SEND_MIDI_START
               EXTERNAL  SEND_MIDI_STOP
               EXTERNAL  SEND_ADVANCED_PTR
               EXTERNAL  PLAY_LED_SOLID,PLAY_LED_FAST,PLAY_LED_SLOW
               EXTERNAL  WAIT_AND_OFF
               EXTERNAL  WRITE_SCREEN
               EXTERNAL  DISP_SCREEN
               EXTERNAL  WRITE_HEX_VALUE
               EXTERNAL  DISP_BUFFER
               EXTERNAL  LED_DIRECT
               EXTERNAL  PRO_CLICK
               EXTERNAL  CHASE_CLICK
               EXTERNAL  CUED_BAR_PUNCH
               EXTERNAL  AUTO_PUNCH_OUT
               EXTERNAL  PAUSE_LED_OFF
               EXTERNAL  PAUSE_LED_SOLID
               EXTERNAL  SET_UP_SEQUENCE
               EXTERNAL  EJECT_SEQUENCE
               EXTERNAL  STOP_SWITCH
               EXTERNAL  INIT_WASTE_RECORD
               EXTERNAL  START_TC,STOP_TC
;
               EXTERNAL  XPORT_STATE
               EXTERNAL  SUBFUN_INSTALL
               EXTERNAL  SMPTE_NOW_TYPE
               EXTERNAL  CLOCK_IN_MODE
               EXTERNAL  NOW_SEQ_STATUS
               EXTERNAL  OVERALL_CLICK
               EXTERNAL  HOLDING_EVENT
               EXTERNAL  CHASING_SMPTE
               EXTERNAL  CURRENT_SEQUENCE
               EXTERNAL  FORMER_SEQUENCE
               EXTERNAL  CUE_NEW_SEQ
               EXTERNAL  S_OR_S_FLAG,SONG_SEL_ENABLE
               EXTERNAL  CURRENT_SONG
               EXTERNAL  CLICKS_PENDING
               EXTERNAL  CONTINUE_TIMER
               EXTERNAL  SMPTE_SYNC
               EXTERNAL  SMPTE_NOW_HR
               EXTERNAL  SMPTE_NOW_BT
               EXTERNAL  PLAYED_TO_END
               EXTERNAL  NEW_SONG_NOW
               EXTERNAL  CUR_SPP_CLICK
               EXTERNAL  CUEING_TO_SPP
               EXTERNAL  PLAY_BLINK_TIMER
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; WE ARE GATHERED HERE TODAY TO PROCESS MESSAGES FROM THE 6803 TIMING CHIP.
;  MESSAGES FROM THE MIDI IN OF THE 6803 ARE PASSED DIRECTLY, UNLESS THEY ARE F8->FF
;  THE 6803 RESERVES THESE BYTES FOR ITS OWN DIRECTIVES, WHICH INCLUDE:
;
;  F8 -    HIGH SPEED 96th NOTE (FORWARD SEQUENCER, WITHOUT AUDIBLE PLAYING)
;  F9 -    INITIAL SYNC W/ SMPTE OR MIDITC ACHEIVED
;  FA -    EXIT PAUSE/START
;  FB -    ENTER PAUSE
;  FC -    STOP, RESET SEQUENCE POINTER TO THE TOP
;  FD -    ENTER HI SPEED CATCH-UP MODE
;  FE -    EXIT HI SPEED CATCH-UP MODE
;  FF nn - NEW SMPTE TYPE FOLLOWING
;
; WE IGNORE MIDI MESSAGES BELOW F0.  OF THE MESSAGES FROM F0->F7 THAT WE RECOGNIZE
;  ARE:
;
;  -       MIDI SYSTEM EXCLUSIVE (DUMPS, BAUD RATE, ENABLE MIDI, FRONT PANEL MIMICING
;  -       MIDI TIME CODE
;  -       MTC SET-UP INFORMATION
;  -       SONG POSITION POINTER
;  -       SONG SELECT
;
;      note - as of 21-jun-90, all mtc and sys ex response via this input port
;      has been eliminated.
;      this includes the first three of the five items listed directly above.
;      this surgery was motivated by a need to reclaim rom space -
;      the actual cost to the user is nil, since in reality none of these
;      things were implemented to the point of usability,
;      even though quite a bit of code was dedicated to mtc sync and setup.
;
; CALLED FROM THE BACKGROUND WHENEVER A MESSSAGE FIRST HITS.  WE STAY IN THIS ROUTINE
;  (POLLING THE INPUT) UNTIL WE HAVE A COMPLETE MESSAGE.  NOT NICE, BUT A LOT LESS
;  MESSY THAN HAVING A RE-ENTRANT BACKGROUND ROUTINE (ANYWAY, WE DON'T BLOCK ANY INTS -
;  JUST OTHER BACKGROUND AND MOST MESSAGES ARE SHORT, ANYWAY).
;
; RETURNS TO THE TOP OF BACKGROUND WHEN DONE.
;
; ENTERS EXPECTING AND LEAVES GIVING NOTHING - SELF-CONTAINED.
;
; MESSES WITH REGISTERS --------------------------------
;
;
PRO_TC
               BSR     UNLOAD_LEVEL_5       ;GET A BYTE FROM THE 6803 (RETURNS IN D0)
               CMPI.B  #0F0H,D0             ;IS THIS A MIDI SYSTEM MESSAGE (F0->FF)?
               BCS.S   EXIT_PRO_TC          ;IF NOT, THEN IGNORE.
;
               AND     #0FH,D0              ;ELSE - CONVERT TO WORD OFFSET FOR JUMP TABLE.
               ADD     D0,D0
               MOVE.W  TC_JUMP_TABLE(PC,D0),A0   ;FETCH ADDRESS OF APPROPRIATE ROUTINE,
               JSR     (A0)                      ;EXECUTE IT.
EXIT_PRO_TC
               BRA     BACK_HANDLER         ;WHEN DONE, RETURN TO BACKGROUND FROM WHENCE WE CAME.
;
NEVER_MIND
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; ADDRESS TABLE FOR ROUTINES TO PROCESS MESSAGES ARRIVING FROM THE 6803:
;
; CODES F0 THROUGH F7 ARE MIDI MESSAGES RECEIVED VIA 6803 UART AND
; PASSED DIRECTLY TO US (FOR THE MOST PART THE 6803 IGNORES THESE).
;
; CODES F8 THROUGH FF ARE MESSAGES GENERATED BY THE 6803, SOME IN
; RESPONSE TO RELATED MIDI REALTIME MESSAGES IT RECEIVED WHILE UNDER
; MIDI SYNC - THE CORRESPONDENCE IS NOT EXACT, DON'T BE FOOLED.
;
; IMPLEMENTATION MUNDANE DETAIL - THESE ROUTINES ARE ASSUMED TO BE IN
; THE SHORT ADDRESS SPACE (NOT TO WORRY - LINKER WILL LET YOU KNOW IF
; ANY PROBLEM DEVELOPS IN THIS REGARD).
;
;                      ROUTINE              SYSTEM BYTE
TC_JUMP_TABLE  ;---------------------------------------------------------------
;900621               DC.W    TC_SYS_EX       ; F0 - SYSTEM EXCLUSIVE
;900621               DC.W    MIDITC_SHORT    ; F1 - MIDITC SHORT TIMECODE (FRAMES ONLY)
               DC.W    NEVER_MIND      ; F0 - SYSTEM EXCLUSIVE
;920813-05:18pm .... we're baaaaack ....
               DC.W    MIDITC_SHORT    ; F1 - MIDITC SHORT TIMECODE (FRAMES ONLY)
;920813-05:18pm .... we're baaaaack ....
               DC.W    RCV_MIDI_SPP    ; F2 - SONG POSITION POINTER
               DC.W    SONG_SELECT     ; F3 - SONG (SEQUENCE NUMBER) SELECT
               DC.W    NEVER_MIND      ; F4 - undefined
               DC.W    NEVER_MIND      ; F5 - JUMP TO BOARD TEST DIAGNOSTICS (NO BOARD TEST HDW!)
               DC.W    NEVER_MIND      ; F6 - TUNE (ignored)
               DC.W    NEVER_MIND      ; F7 - EOX (ignored - handled in apropos sys_ex routine)
;
               DC.W    HI_SPEED_SYNC   ; F8 - CLOCK PULSE (we treat as internal catch-up)
               DC.W    TC_INIT_SYNC    ; F9 - INITIAL SYNC OFF OF SMPTE OR MTC ATTAINED
               DC.W    TC_START        ; FA - START (wired into our tape transport controls)
               DC.W    TC_PAUSE        ; FB - STOP w/o RESET (   "    "      "         "   )
               DC.W    TC_STOP         ; FC - STOP w/ RESET ("   "    "      "         "   )
               DC.W    ENTER_HI_SPEED  ; FD - ENTER HIGH-SPEED CATCH-UP MODE
               DC.W    EXIT_HI_SPEED   ; FE - EXIT   "     "     "    "   "
               DC.W    NEW_SMPTE_TYPE  ; FF - NEW SMPTE TYPE (fps) FOLLOWING
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "6803 BYTE WRITE AND MIDI REALTIME DIRECT-CONNECT TO 6803 UART"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; WRITE BYTE PASSED IN D0 TO THE 6803 (WAIT UNTIL 6803 SAYS "READY"):
; PRESERVES REGISTERS.
;
WRITE_TO_TC
               BTST    #6,SWITCH_INPUT      ;HAS THE 6803 READ OUR LAST MESSAGE?
               BNE     WRITE_TO_TC          ;IF NOT YET, LOOP UNTIL HE DOES.
               MOVE.B  D0,TC_WRITE          ;THEN - WRITE THIS, OUR NEXT BYTE, TO HIM (HER?)
               RTS
;
;
;
; DIDDLY ROUTINES TO PASS STANDARD-FARE REALTIME MESSAGES VIA 6803 UART:
; WHEN MORON TIME CHIP NEEDS HELP FROM A MORE ENLIGHTENED ENTITY.
; CLEAN WITH REGISTERS - LIKE WE NEVER HAPPENED.
;
;
SEND_6803_START
               MOVE.L  D0,-(A7)
               MOVEQ   #NEG_EXT+0FAH,D0
               BRA.S   SEND_6803_DIR_CONN
;
;
SEND_6803_CONTINUE
               MOVE.L  D0,-(A7)
               MOVEQ   #NEG_EXT+0FBH,D0
               BRA.S   SEND_6803_DIR_CONN
;
;
SEND_6803_CLOCK
               MOVE.L  D0,-(A7)
               MOVEQ   #NEG_EXT+0F8H,D0
               BRA.S   SEND_6803_DIR_CONN
;
;
SEND_6803_STOP
               MOVE.L  D0,-(A7)
               MOVEQ   #NEG_EXT+0FCH,D0
;
;
SEND_6803_DIR_CONN
               MOVE    D0,-(A7)             ;STASH THE BYTE WE'RE SENDING -
               MOVEQ   #NEG_EXT+0F1H,D0     ;GOTTA REQUEST DIRECT-CONNECT TO 6803 UART FIRST.
               BSR.S   WRITE_TO_TC
               MOVE    (A7)+,D0             ;GOT DIRECT-CONNECT - BRING DATA BYTE BACK,
               BSR.S   WRITE_TO_TC          ;PASS IT TO 6803.
               MOVEQ   #NEG_EXT+0FFH,D0     ;TELL 6803 WE'RE DONE WITH DIRECT CONNECT,
               BSR.S   WRITE_TO_TC
               MOVE.L  (A7)+,D0             ;RESTORE INITIAL REGISTER STATE AND SKRAMMOUTOHEER.
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE "SYSTEM EXCLUSIVE"
;900621;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;900621;
;900621; HANDLE SYSTEM-EXCLUSIVE MESSAGES COMING IN VIA 6803 UART:
;900621; BAUD_CHANGE_TC AND ENABLE_ALL_MIDI ARE ACTUALLY IMPLEMENTED -
;900621; LIKEWISE, APPARENTLY, FOR MTC_SET_UP (CUE LIST DUMP).
;900621; THE REST IS NO MORE THAN VAPOR AT PRESENT (SIGH).
;900621;
;900621TC_SYS_EX
;900621               JSR     GET_LEVEL_5          ;GET NEXT BYTE - MANUFACTURER ID
;900621               CMPI.B  #1,D0                ;A SEQUENTIAL SYSTEM EXCLUSIVE?
;900621               BEQ.S   SEQ_SYS_EX           ;    IF SO, PROCESS THERE
;900621               CMPI.B  #7EH,D0              ;IS THIS A UNIVERSAL NON-REALTIME MESSAGE?
;900621               BEQ     NON_RT_SYS_EX        ;    IF SO, PROCESS ACCORDINGLY
;900621               CMPI.B  #7FH,D0              ;IS THIS A UNIVERSAL REALTIME MESSGE?
;900621               BEQ     RT_SYS_EX            ;    IF SO, PROCESS ACCORDINGLY
;900621               RTS                          ;         ELSE, DON'T RECOGNIZE MESSAGE - SPLIT.
;900621;
;900621;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
;900621;
;900621;
;900621;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;900621;
;900621;             HERE WE HANDLE SEQUENTIAL SYSTEM EXCLUSIVE MESSAGES - NAMELY:
;900621;
;900621;              -       440 ADDITIONAL SOUND PARAMETERS
;900621;              -       440 SET-UP INFORMATION
;900621;              -       440 FRONT PANEL FAKING
;900621;              -       ENABLE ALL MIDI
;900621;              -       CHANGE BAUD RATE
;900621;
;900621;              etc.
;900621;
;900621SEQ_SYS_EX
;900621               JSR     GET_LEVEL_5          ;GRAB NEXT BYTE IN CHAIN
;900621               CMPI.B  #0CH,D0              ;ADDITIONAL SOUND PARAMETERS?
;900621               BEQ.S   SYS_EX_SOUND         ;    IF SO, GO READ IT, MY SON
;900621               CMPI.B  #0FH,D0              ;SET-UP PARAMETERS, OR FRONT-PANEL FAKING?
;900621               BEQ.S   SYS_EX_FUNCTIONS     ;    IF SO, GO
;900621               CMPI.B  #7AH,D0              ;BAUD RATE CHANGE?
;900621               BEQ.S   BAUD_CHANGE_TC       ;    IF SO, GO ALTER COUNTER TO 6803 SCI
;900621               CMPI.B  #7EH,D0              ;ENABLE ALL MIDI?
;900621               BEQ.S   ENABLE_ALL_MIDI      ;    IF SO, GO MASK ALL OPTIONS ON
;900621               RTS                          ;         ELSE, DON'T RECOGNIZE
;900621;
;900621;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
;900621               SKIP
;900621;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;900621;
;900621;             GET ADDITIONAL PARAMETERS (ENVELOPES, ETC). FOR ONE OF OUR SOUNDS
;900621;
;900621SYS_EX_SOUND
;900621               JSR     GET_LEVEL_5          ;GET SOUND NUMBER
;900621               CMPI.B  #31,D0               ;ONLY RECOGNIZE SOUNDS 1->32 (00->1F)
;900621               BCS.S   EXIT_SYS_EX_SOUND
;900621;
;900621;*** FROM HERE ON, RECEIVE AND SAVE PARAMETERS - SINCE DATA STRUCTURE IN PLACE, CAN BE WRITTEN SOONLY
;900621;
;900621;
;900621; FIRST, PRELOAD A REGISTER TO THIS SOUND'S PARAMETER BLOCK
;900621;
;900621               MOVEQ   #0,D6                ;CLEAR OUT BYTE COUNT
;900621PARAM_RCV_LOOP
;900621               JSR     GET_LEVEL_5          ;GET LSNibble OF PARAMETER - 0000 llll
;900621               MOVE    D0,D7                ;SAVE ASIDE
;900621               JSR     GET_LEVEL_5          ;GET MSNibble (ROTATED RIGHT ONE BIT)
;900621               ASL.B   #1,D0                ;ROTATE MSNibble - mmmm 0000
;900621               ADD.B   D7,D0                ;MASK TOGETHER BY ADDING (BOTH CAME OVER CLEAN, IN THEORY)
;900621;
;900621; AND SO FORTH, AND SO ON.
;900621;
;900621EXIT_SYS_EX_SOUND
;900621               RTS
;900621;
;900621;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
;900621               SKIP
;900621;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;900621;
;900621;             HERE, PROCESS INCOMING MESSAGE THAT IS EITHER OUR OWN SET-UP PARAMETERS, OR DIRECT
;900621;              FAKING OF OUR FRONT PANEL FUNCTIONS (TERMINAL SUPPORT PEOPLE, KINDLY HAVE A FIELD
;900621;              DAY).
;900621;
;900621SYS_EX_FUNCTIONS
;900621               JSR     GET_LEVEL_5          ;GET THE NUMBER OF WHAT THEY'RE TRYING TO DO
;900621               CMPI.B  #7FH,D0              ;IS IT A FULL-BLOWN SET-UP DUMP?
;900621               BEQ.S   NEW_SET_UP           ;    IF SO, GLADLY RECEIVE AND SERVICE
;900621                                            ;         ELSE, MUST BE A FRONT PANEL FAKE
;900621;
;900621;*** EVENTUALLY (LOW PRIORITY) WRITE FRONT-PANEL FAKING HERE
;900621;
;900621EXIT_SYS_EX_FUNCTIONS
;900621               RTS
;900621;
;900621;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
;900621;
;900621;
;900621;
;900621;
;900621;
;900621;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;900621;
;900621NEW_SET_UP
;900621;
;900621;**** ONCE ALL SET-UP PARAMETERS DEFINED, WRITE IN HERE
;900621;
;900621               RTS
;900621;
;900621;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
;900621               SKIP
;900621;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;900621;
;900621;             CHANGE BAUD RATE OF 6803'S SCI.  COMES AS A MESSAGE F0 01 7A <baud> F7.  '<baud>'
;900621;              IS USED AS SUCH: 500,000/<baud>=SCI BAUD RATE.  THUSLY, A VALUE OF 16 = 31.25 KBaud,
;900621;              AND A VALUE OF 8 = 62.5 KBaud.  ANY OTHER VALUE RECIEVED IS ALSO ACCEPTED AND
;900621;              USED, IN THE SPIRIT OF GOOD OL' SEQUENTIAL VERSATILITY, BUT THOSE ARE THE ONLY
;900621;              TWO WE ARE REALLY EXPECTING (ANYWAY, THE 6803's SCI CRAPS OUT OVER 125 KBaud).
;900621;
;900621BAUD_CHANGE_TC
;900621               JSR     GET_LEVEL_5          ;GET '<baud>'
;900621               MOVE    D0,D7                ;SAVE ASIDE
;900621               JSR     GET_LEVEL_5          ;EAT THE ENDING EOX
;900621               CMPI.B  #3,D7                ;PROTECT AGAINST TOO SMALL A DIVIDE VALUE (= TOO HIGH RATE)
;900621               BCC.S   EXIT_BAUD_CHANGE_TC
;900621               ASL.B   #1,D7                ;MULT <baud> BY 2, FOR OUR PROPER COUNTER VALUE
;900621;
;900621               MOVE.B  #01010110B,COUNTER_CTRL   ;PREP COUNTER...
;900621               MOVE.B  D7,COUNTER_2         ;                 ...AND WRITE NEW CLOCK DIVIDE VALUE
;900621;
;900621               MOVE.B  #0F6H,D0             ;TELL 6803 TO STOP WHATEVER IT WAS DOING, AS PROTECTION
;900621               JSR     WRITE_TO_TC
;900621EXIT_BAUD_CHANGE_TC
;900621               RTS
;900621;
;900621;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
;900621;
;900621;
;900621;
;900621;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;900621;
;900621;             ENABLE ALL OF OUR MIDI FUNCTIONS
;900621;
;900621ENABLE_ALL_MIDI
;900621;              MOVE    #0FFFFH,MIDI_OPTIONS
;900621EXIT_ENABLE_ALL_MIDI
;900621               RTS
;900621;
;900621;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
;900621               SKIP
;900621;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;900621;
;900621;             UNIVERSAL NON-REALTIME SYSTEM EXCLUSIVE MESSAGES.  THESE INCLUDE:
;900621;
;900621;              -       MIDITC SET-UP
;900621;              -       SAMPLE DUMPS
;900621;
;900621;              etc.
;900621;
;900621NON_RT_SYS_EX
;900621               JSR     GET_LEVEL_5          ;GET NEXT BYTE - CHANNEL NUMBER
;900621               MOVE.B  D0,D7                ;SAVE ASIDE FOR FUTURE COMPARES
;900621               JSR     GET_LEVEL_5          ;GET THE NEXT BYTE - THE MESSAGE ID
;900621               CMP.B   #1,D0                ;IF SAMPLE DUMP REQUSET
;900621               BEQ.S   SAMP_REQ             ;    THEN PROCESS ACCORDINGLY
;900621               CMP.B   #2,D0                ;IF INCOMING SAMPLE
;900621               BEQ.S   SAMP_RCV             ;    THEN PROCESS ACCORDINGLY
;900621               CMP.B   #4,D0                ;IF MTC SET-UP INFO
;900621               BEQ     MTC_SET_UP           ;    THEN PROCESS ACCORDINGLY
;900621EXIT_NON_RT_SYS_EX
;900621               RTS     ;                              ELSE GET OUT.
;900621;
;900621;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
;900621;
;900621;
;900621;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;900621;
;900621;              XTERNAL DEVICE REQUESTS A SAMPLE.
;900621;
;900621SAMP_REQ
;900621               RTS
;900621;
;900621;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
;900621;
;900621;
;900621;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;900621;
;900621;              EXTERNAL DEVICE IS SENDING US A SAMPLE.
;900621;
;900621SAMP_RCV
;900621               RTS
;900621;
;900621;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
;900621               SKIP
;900621;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;900621;
;900621;             UNIVERSAL REALTIME SYSTEM EXCLUSIVE MESSAGES.  THESE INCLUDE:
;900621;
;900621;
;900621RT_SYS_EX
;900621               JSR     GET_LEVEL_5          ;GET & IGNORE NEXT BYTE - CHANNEL (ALWAYS = 7F)
;900621               JSR     GET_LEVEL_5          ;GET THE NEXT BYTE - THE MESSAGE ID
;900621               RTS                          ;ELSE ABORT - NOTHING ELSE OF INTEREST
;900621;
;900621;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "RESPOND TO INCOMING MIDI SONG-POSITION POINTER"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; RESPOND TO MIDI SONG POSITION POINTER -
; THIS MESSAGE GIVES US A CUE POSITION IN TERMS OF 16th-NOTES FROM THE
; BEGINNING OF A SEQUENCE.  UPON RECEIVING IT, IF WE ARE ATTUNED TO SUCH
; MESSAGES IN THE FIRST PLACE, WE CUE TO THE INDICATED POINT, KEEPING
; TRACK OF NOTES ON, TEMPO CHANGES AND WHATNOT, BUT SILENTLY.
;
; THE MESSAGE IS THREE BYTES, LOOKS LIKE:
;                      F2H  (ls)  (ms)
; F2H IS THE SYSTEM-COMMON STATUS BYTE FOR THE SONG-POSITION POINTER
; MESSAGE.  THE POINTER ITSELF IS A 14-BIT NUMBER BROKEN INTO TWO 7-BIT
; SECTIONS WHICH ARE RIGHT-JUSTIFIED WITHIN THEIR RESPECTIVE DATA BYTES
; AND PRESENTED L.S.BYTE FIRST, FOLLOWED BY M.S.BYTE.
;
; WHILE CUEING IS IN PROGRESS, WE BLOCK INTERRUPTS THROUGH LEVEL 3 -
; REALTIME INTERRUPT NORMALLY EATS UP CLOSE TO HALF OF THE CPU TIME.
; SINCE WE (AND THE 6803) ARE OFFICIALLY PAUSED DURING THIS TIME, THERE
; IS NO CHANCE OF MISSING ANYTHING ON THE LEVEL 2 (SEQ CLOCK) FRONT.
; MEANWHILE, WE ARE STILL ABLE TO RECEIVE MESSAGES FROM THE 6803 VIA THE
; LEVEL 5 INTERRUPT, IN CASE IT RECEIVES ANYTHING INTERESTING:
; IN THE EVENT THAT THE MASTER SENDS US A "CONTINUE" BYTE AND STARTS
; CLOCKING US WHILE WE ARE STILL CUEING, WE WON'T MISS ANY OF THE ACTION
; (ALTHOUGH SEQUENCER WON'T RESPOND UNTIL WE'RE DONE CUEING - WE'LL DROP
; INTERRUPT LEVEL IN ORDER TO ALLOW SEQUENCER CLOCK INTERRUPTS THROUGH,
; AND LET 'EM PILE UP IN THE LOBBY UNTIL SHOW TIME).
; JUST AS LIKELY, IF WE RECEIVE ANOTHER SONG-POINTER MESSAGE BEFORE DONE
; RESPONDING TO THE LAST ONE, WE SUSPEND CUEING TO THE PREVIOUS POINTER
; AND FOLLOW THE SHORTEST PATH TO GET STARTED CUEING TO THE NEW ONE.
; FINALLY, IF WE RECEIVE A "START" BYTE WE DROP CUEING RIGHT AWAY AND
; JAM BACK TO THE BEGINNING OF WHATEVER (SEQUENCE OR SONG AS APPROP).
; (OF THESE POSSIBILITIES, ONLY THE NEW SONG POINTER IS HANDLED HERE.)
;
; FOR THESE REASONS, SPP CUEING IS IMPLEMENTED AS A TIGHT BACKGROUND
; LOOP - MEANING THAT ROTATING LOW-PRIORITY BACKGROUND SERVICE IS
; EFFECTIVELY BLOCKED UNTIL WE'RE CUED (LEDs, SUBFUN INSTALL, ETC.) -
; A WORD TO THE WISE (AND TO YOU, TOO).
;
RCV_MIDI_SPP
               CMP     #2,CLOCK_IN_MODE     ;ARE WE LISTENING TO MIDI CLOCKING?
               BNE     RCV_SPP_EXIT         ;BRANCH IF NOT, EXIT WITHOUT FURTHER ACTION.
               BTST    #PLAY_BIT,XPORT_STATE     ;SEQUENCER MUST BE ENABLED FOR PLAY -
               BEQ     RCV_SPP_EXIT              ;EXIT IF "PLAY" NOT ENABLED (WE'RE OFF-LINE).
               BTST    #PAUSE_BIT,XPORT_STATE    ;SPP IGNORED IF NOT "PAUSED" (MIDI "STOP"PED) -
               BEQ     RCV_SPP_EXIT              ;EXIT WITHOUT ACTION IF NOT PAUSED.
               TST     NOW_SEQ_STATUS       ;IF CURRENTLY SELECTED SEQUENCE DOES NOT EXIST,
               BEQ     RCV_SPP_EXIT         ;THEN WE NEED NOT DO ANYTHING IN RESPONSE TO SPP.
;
                                            ;ELSE - WE'RE GONNA GO FOR IT:
;
               CLR     CLICKS_PENDING       ;NOW THAT THEY'RE TELLING US WHERE TO GO,
                                            ;WE CAN FORGET WHERE (IF ANYWHERE) WE WERE BEFORE.
                                            ;IF CLOCKS START COMING IN BEFORE WE'RE FULLY CUED,
                                            ;WE LET 'EM PILE UP UNTIL WE CAN DEAL WITH THEM,
                                            ;THUS MUST CLEAR OUT ANY CLOCKS PENDING AT THIS POINT.
;
                                            ;GATHER REMAINING BYTES, ASSEMBLE POINTER:
               JSR     GET_LEVEL_5          ;GET L.S.BYTE,
               LSL     #1,D0                ;WHACK OFF THE EMPTY M.S.BIT,
               MOVE    D0,D1                ;HOLD IT ASIDE.
               JSR     GET_LEVEL_5          ;GET M.S.BYTE,
               LSL     #8,D0                ;SLIDE IT INTO THE CONCATENO-SEAT,
               MOVE.B  D1,D0                ;MATE UP THE L.S.BYTE,
               LSR     #1,D0                ;AND ROTATE IT DOWN TO A RIGHTEOUS 14-BIT VALUE.
               MULU    #6,D0                ;CONVERT 16th-NOTE POSITION INTO CLICKS (96th NOTES) -
                                            ;THIS IS THE FORM WE ACTUALLY USE FOR CUEING.
;
               TST.L   CUR_SPP_CLICK        ;WERE WE ALREADY CUEING TO AN EARLIER SONG POINTER?
               BNE.S   RCV_SPP_20           ;BRANCH IF YES, SEE HOW FAR WE GOT -
               MOVE.L  D0,-(A7)             ;ELSE, SAVE NEW POINTER -
;871014               ST      PLAYED_TO_END        ;EVEN THOUGH WE MAY NOT HAVE - THIS ENSURES THAT SONG-
;871014                                            ;MODE RESTART WILL BE COMPLETE (NEW_SONG_SELECTED SHIES
;871014                                            ;AWAY FROM SETTING REPEAT COUNT IF IT THINKS SEQUENCER
;871014                                            ;IS RUNNING).
               BSR     SYNC_PLAY_RESTART    ;MUST DO FULL STOP AND RESTART OF SEQ - WHO KNOWS WHAT
                                            ;WE'VE BEEN UP TO (RECORDING, AUTOCORRECT, ETC.)
               SF      PLAYED_TO_END        ;WE HAVEN'T YET, THIS TIME THROUGH - IF WE DO, FLAG IS
                                            ;SET AGAIN TO BLOCK RESPONSE TO CLOCKING IN THE EVENT
                                            ;THAT THE MASTER TRIES TO GET US GOING.
                                            ;MEANWHILE, WE'D RESTART SEQUENCE AND WAIT FOR "START"
                                            ;OR ANOTHER SONG-POINTER ON WHICH TO TRY OUR LUCK -
                                            ;SORTA LIKE WE'RE DOING RIGHT HERE.
               BSR     AUTO_PUNCH_OUT       ;RESTART MAY HAVE PUNCHED US IN - WE DON'T WANT THIS -
                                            ;MAKE SURE WE ARE PUNCHED OUT WHILE SPP-CUEING!
               MOVE.L  (A7)+,D0             ;NOW ABOUT THAT POINTER ....
               BEQ.S   RCV_SPP_60           ;IF IT HAPPENS TO BE ZERO, WE'RE CUED - SET UP AND GO.
RCV_SPP_20
               MOVE.L  D0,CUR_SPP_CLICK     ;STORE OUR NEW CUE TARGET POINT.
               CMP.L   OVERALL_CLICK,D0     ;DO WE JUST HAPPEN TO ALREADY BE PRECISELY CUED?
               BEQ.S   RCV_SPP_60           ;BRANCH IF YES - SET UP AND GO.
               BHI.S   RCV_SPP_40           ;IF WE'RE BEFORE TARGET POINT, GO FORWARD FROM HERE.
                                            ;ELSE MUST WRAP UP, RESTART:
;871014               ST      PLAYED_TO_END        ;EVEN THOUGH WE MAY NOT HAVE - THIS ENSURES THAT SONG-
;871014                                            ;MODE RESTART WILL BE COMPLETE (NEW_SONG_SELECTED SHIES
;871014                                            ;AWAY FROM SETTING REPEAT COUNT IF IT THINKS SEQUENCER
;871014                                            ;IS RUNNING).
               BSR     SYNC_PLAY_RESTART    ;WRAP UP, CUE FROM BEGINNING OF SEQ OR SONG.
               SF      PLAYED_TO_END        ;WE HAVEN'T YET, THIS TIME THROUGH - IF WE DO, FLAG IS
                                            ;SET AGAIN TO BLOCK RESPONSE TO CLOCKING IN THE EVENT
                                            ;THAT THE MASTER TRIES TO GET US GOING.
                                            ;MEANWHILE, WE'D RESTART SEQUENCE AND WAIT FOR "START"
                                            ;OR ANOTHER SONG-POINTER ON WHICH TO TRY OUR LUCK -
                                            ;SORTA LIKE WE'RE DOING RIGHT HERE.
               BSR     AUTO_PUNCH_OUT       ;RESTART MAY HAVE PUNCHED US IN - WE DON'T WANT THIS -
                                            ;MAKE SURE WE ARE PUNCHED OUT WHILE SPP-CUEING!
               MOVE.L  CUR_SPP_CLICK,D0     ;BUT ARE WE IN FACT CUEING TO START (SPP = 0)?
               BEQ.S   RCV_SPP_60           ;BRANCH IF YES, OBVIOUSLY WE'RE THERE - SET UP AND GO.
RCV_SPP_40
                                            ;SO!  GOTTA CUE - CUE TARGET CLICK NUMBER IS IN D0,
               MOVE.L  #SPP_CUEING_SCRN,A1  ;OR SHOULD BE - TELL 'EM WHAT'S GOIN' ON INSIDE OF US.
;900621                ABS_LONG
;900621               JSR     WRITE_SCREEN
;900621                ABS_SHORT
               CALL    LCD_FUNS,WR_SCRN
               DIVU    #6,D0                ;CONVERT BACK TO RAW SONG-POINTER FORMAT,
               MOVE    #1B04H,D1            ;SET LCD FIELD POSITION/LENGTH FOR SPP VALUE,
;900621                ABS_LONG
;900621               JSR     WRITE_HEX_VALUE      ;PUT IT IN (IN HEXADECIMAL - MOLTO VOODOO !!!)
;900621               JSR     DISP_BUFFER          ;WRITE COMPLETE MESSAGE FROM SCREEN_BUFFER TO LCD.
;900621                ABS_SHORT
               CALL    LCD_FUNS,WR_HEX_VAL  ;PUT IT IN (IN HEXADECIMAL - MOLTO VOODOO !!!)
               CALL    LCD_FUNS,DSP_BUF     ;WRITE COMPLETE MESSAGE FROM SCREEN_BUFFER TO LCD.
;
               BSR     PLAY_LED_SOLID       ;LOW-PRIORITY BACKGROUND'S GONNA BE LOCKED OUT WHILE
               BSR     LED_DIRECT           ;CUEING, MAKE SURE "PLAY" LED IS ON FOR THE DURATION.
;
               MOVE    #2300H,SR            ;WHILE CUEING - PUSH THE BIG TIME HOG (LEVEL 3) ASIDE -
                                            ;WE WON'T GET (AND SHOULD NOT HEED) LEVEL 2 INTERRUPTS
                                            ;UNTIL AFTER A "START" OR "CONTINUE" IS RECEIVED BY THE
                                            ;6803 (WHICH NOTIFIES US VIA LEVEL 5) -
                                            ;IN THAT CASE, WE MAY WANT TO ECHO THE REALTIME BYTE
                                            ;VIA MIDI UARTS, THUS SHOULD LEAVE THEIR TRANSMIT
                                            ;INTERRUPTS ENABLED (DOESN'T COST US ANYTHING).
;
               ST      CUEING_TO_SPP        ;TELL HIGH-PRIORITY BACKGROUND TO GET OUR ASS IN GEAR -
               BRA.S   RCV_SPP_EXIT         ;OUR PART OF TH' JOB'S DONE.
;
;
RCV_SPP_60
               BSR.S   SPP_CUE_COMPLETE     ;WELL IN FACT WE'RE RIGHT WHERE WE NEED TO BE -
                                            ;SNUFF OUT ALL SIGNS OF SPP CUEING, GET ON WITH LIFE.
;
;
RCV_SPP_EXIT
               RTS

;
;
;
SPP_CUEING_SCRN
               ASC     "   CUEING TO    "
               ASC     "SONG POINT xxxx "
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "MIDI SONG-POSITION POINTER CUEING"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; BACKGROUND RESPONSE ROUTINE FOR PUSHING SONG-POINTER CUE ALONG:
; WE'RE ACTIVATED BY CUEING_TO_SPP(.B) NOT = 0, COMING BACK AGAIN AND
; AGAIN AND AGAIN UNTIL:
; -  WE'RE CUED, AND WE UNLOCK BACKGROUND AGAIN.
; -  WE'RE SHUT DOWN BY OTHER ACTIONS (STOP SWITCH, MIDI "START", ETC).
; -  WE CUE PAST THE END OF A SEQUENCE OR SONG AND STILL HAVEN'T MADE IT
;    TO THE POINT WE WERE HEADING FOR - WE HANG OURSELF UP.
;
; WE ASSUME ALL NECESSARY SETUP HAS BEEN HANDLED FOR US - OTHERWISE WE
; WOULD NOT BE GETTING CALLED (SEE RCV_MIDI_SPP ABOVE).
; NOT MUCH MORE TO SAY (THAT HASN'T BEEN SAID ELSEWHERE).
;
; WELL I'LL SAY THIS MUCH - EXTERNAL MASTER MAY SEND US A "CONTINUE"
; AND START CLOCKING US BEFORE WE'VE FINISHED CUEING (WHICH WE DEAL WITH
; BY LOWERING INTERRUPT LEVEL TO ALLOW LEVEL 2 SEQ CLOCK INTERRUPTS
; THROUGH).  TO COVER THIS EVENTUALITY SMOOTHLY, WE CHECK EACH TIME WE
; COME THROUGH HERE FOR ANY ACCUMULATION OF CLOCK SERVICE REQUESTS IN
; CLICKS_PENDING - WHAT WE FIND, WE ADD ONTO OUR CUE-TARGET CLOCK VALUE.
;
;
STEP_SPP_CUE
               BSR     CHASE_CLICK          ;PARSE THROUGH ONE CLICK IN CURRENT SEQUENCE OR SONG.
               TST.B   PLAYED_TO_END        ;HAVE WE BEEN THWARTED BY END-OF THING?
               BNE.S   STEP_SPP_AW_SHIT     ;BRANCH IF YES - RESTART PLAY, GO SIT AND WAIT.
               CLR.L   D0                   ;CHECK FOR ANY ACCUMULATED CLOCKS -
               MOVE    CLICKS_PENDING,D0
               BEQ.S   STEP_SPP_20          ;BRANCH IF NONE,
               CLR     CLICKS_PENDING       ;ELSE ACKNOWLEDGE THEM AND TALLY DEM UP.
STEP_SPP_20
               ADD.L   CUR_SPP_CLICK,D0     ;TALLIED (AS SUCH) - BUT WHERE ARE WE?
               MOVE.L  D0,CUR_SPP_CLICK     ;(YAH-HOO!  SAVE THIS POSSIBLY MODIFIED VALUE, DUDE!)
               CMP.L   OVERALL_CLICK,D0     ;THIS IS WHERE - BUT WHERE'S THAT AT, MAN?
               BHI     BACK_HANDLER         ;NOT THERE YET - WE'LL BE BACK REAL SOON TO TRY AGAIN.
               BSR.S   SPP_CUE_COMPLETE     ;ELSE - SHUT DOWN CUEING, SET UP TO ALLOW SEQ TO PLAY.
               BRA     BACK_HANDLER         ;THEN DISAPPEAR BACK INTO THE BACKGROUND ....
;
STEP_SPP_AW_SHIT
                                            ;THEY TRIED TO PUSH US TOO FAR - BLOW 'EM OFF:
               CLR.L   CUR_SPP_CLICK        ;FORGET THE CUE TARGET POINT - IT WAS USELESS.
               MOVE    #2300H,SR            ;WE'RE NOT GOING TO GET ANY SEQUENCER CLOCKS AT THIS
                                            ;POINT - GET LEVEL 3 OUT OF THE WAY SO WE CAN RE-CUE TO
                                            ;THE BEGINNING OF WHATEVER AS QUICKLY AS POSSIBLE.
                                            ;NOTE - LEAVE CUEING_TO_SPP FLAG SET AS A SIGNAL TO
                                            ;RESTART PROCEDURE - NO NOTE-ONS SHOULD HAVE BEEN SENT
                                            ;TO ANYONE, DON'T WASTE TIME ON SENDING NOTE-OFFS.
               BSR     SYNC_PLAY_RESTART    ;JAM BACK TO START OF SEQUENCE OR SONG, SET UP TO PLAY.
               SF      CUEING_TO_SPP        ;NOW - SHUT DOWN SPP-CUE MODE.
;871014               BSR     AUTO_PUNCH_OUT       ;RESTART MAY HAVE PUNCHED US IN - WE DON'T WANT THIS -
;871014                                            ;MAKE SURE WE ARE PUNCHED OUT (USER CAN PUNCH IN BY
;871014                                            ;HAND IF SO DESIRED).
;871014              NOT ANYMORE - PLAYED_TO_END INHIBITS PUNCH-IN.
               MOVE    #2000H,SR            ;MAKE SURE ALL INTERRUPTS ARE UNBLOCKED.
               BRA     BACK_HANDLER         ;AND DISSOLVE INTO LIGHT ....
;
                                            ;NOTE - PLAYED_TO_END IS LEFT SET AS A SIGNAL THAT WE
                                            ;WERE TOLD TO CUE TO A POINT BEYOND ANYTHING IN THE
                                            ;CURRENT SEQUENCE OR SONG, AND THEREFORE CANNOT RESPOND
                                            ;LEGITIMATELY TO MIDI CLOCKS WITHOUT FIRST SEEING
                                            ;A "START" OR A VALID SONG POINTER AND A "CONTINUE" -
                                            ;EVEN THOUGH IN REALITY WE ARE ALREADY RE-CUED TO THE
                                            ;START OF THE SEQUENCE OR SONG (WHY STAY AT THE END?)
;
;
;
;
; WE'RE CUED TO SPP - STOP CUEING, ENABLE PLAYBACK:
; CHECK PUNCH-IN, TURN ON LOGGED NOTES IF WE'RE ALREADY UNPAUSED.
;
SPP_CUE_COMPLETE
               SF      CUEING_TO_SPP        ;WE'RE THROUGH WITH THAT, FOR NOW.
               CLR.L   CUR_SPP_CLICK        ;NOW THAT WE'RE THERE, FORGET ABOUT IT.
               ST      SUBFUN_INSTALL       ;WE WASTED A SUBFUNCTION SCREEN WHEN CUEING STARTED -
                                            ;TELL BACKGROUND TO PUT IT BACK TOGETHER.
;
;15JUN               BSR     CUED_BAR_PUNCH       ;DO ANY PUNCHING IN WHICH IS APPROPRIATE AT THIS POINT.
;                 "CONTINUE" SHOULD DO THIS ....
;
               MOVE    #2000H,SR            ;MAKE SURE ALL INTERRUPTS ARE UNBLOCKED.
               BTST    #PAUSE_BIT,XPORT_STATE    ;DID WE RECEIVE A MIDI "CONTINUE" (AND POSSIBLY
                                                 ;CLOCKS AS WELL) WHILE CUEING?
               BEQ.S   SPP_CMPLT_20         ;BRANCH IF YES, GO BRING US UP TO "PLAYING" STATUS -
               BSR     PLAY_LED_SLOW        ;ELSE - MAKE SURE LEDs LOOK RIGHT,
               BSR     PAUSE_LED_SOLID
               BRA.S   SPP_CMPLT_EXIT       ;THEN EXIT.
;
SPP_CMPLT_20
               BSR     PLAY_LED_SOLID       ;GOING STRAIGHT INTO "PLAY" AFTER CUEING -
               BSR     PAUSE_LED_OFF        ;MAKE SURE LEDs ARE WITH THE PROGRAM,
                ABS_LONG
               JSR     XMIT_OLD_M_ONS       ;TURN ON ALL CURRENTLY LOGGED SEQUENCE NOTES BEFORE
               JSR     XMIT_OLD_P_ONS       ;SEQUENCER STARTS SERVICING SEQUENCER CLOCKS.
                ABS_SHORT
;
SPP_CMPLT_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE "SONG SELECT"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
;             MIDI SONG SELECT - CALLS UP A NEW SEQUENCE NUMBER.
;
;             LOOKS LIKE {F3 sn} WHERE 'sn' IS THE SONG (SEQUENCE) NUMBER.
;
SONG_SELECT
               JSR     GET_LEVEL_5          ;GET THE SONG (SEQUENCE) NUMBER
               TST     SONG_SEL_ENABLE      ;IF SONG SELECT IS NOT ENABLED
               BEQ.S   EXIT_SONG_SELECT     ;    THEN SPLIT
;
               TST     D0                   ;MAKE 'SONGS' 0 & 100 = nullseq, 1->99 EQUAL THEIR DISPLAYED
               BNE.S   TONITE_1             ; EQUIVALENTS, AND 101->112 = SONGS 1->12.
               MOVEQ   #99,D0
               BRA.S   TONITE_2
TONITE_1
               SUBQ    #1,D0                ;KNOCK DOWN INTERNAL OFFSET (DISP = 01 = INTERNAL = 00)
TONITE_2
               CMP     #100,D0              ;IF IN THE SONG RANGE
               BCC.S   TONITE_3             ;    THEN PROCESS AS SUCH
               MOVE    D0,CURRENT_SEQUENCE  ;         ELSE, WE HAVE A NEW CURRENT_SEQUENCE
               CLR     S_OR_S_FLAG          ;         AND MAKE SURE IN SEQUENCE PLAYBACK MODE
               BRA.S   EXIT_SONG_SELECT
;
TONITE_3
               SUB     #100,D0              ;KNOCK OFF OFFSET
               CMP     #12,D0               ; IF OVER RANGE
               BCC.S   EXIT_SONG_SELECT     ;    THEN GIT
               MOVE    #1,S_OR_S_FLAG       ;         ELSE, SAY WE BE PLAYING BACK SONGS NOW
               MOVE    D0,CURRENT_SONG      ;         AND UPDATE THOSE PARAMETERS
                ABS_LONG
               JSR     NEW_SONG_SELECTED
                ABS_SHORT
               ST      SUBFUN_INSTALL
EXIT_SONG_SELECT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "ENTER HIGH-SPEED SMPTE SYNC-CHASE"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; "FD" - "ENTER HI-SPEED CHASE":
; THE 6803, HAVING BEEN TOLD BY US TO START, AND BEING SYNCHRONIZED TO
; INCOMING SMPTE TIMECODE, HAS DETERMINED THAT THE TIME "OUT THERE" IS
; LATER THAN THE TIME AT WHICH WE TOLD IT TO START US UP -
; IT WANTS TO LEAD US A MERRY CHASE (YEAH, I BEEN HERE A REAL LONG TIME
; NOW, AND IT'S BEGINNING TO TAKE IT'S TOLL ....)
; WE RESPOND WITH AN ACKNOWLEDGE TO THE 6803 WHICH AS MUCH AS SAYS,
; "GO FOR IT DUDE, I'M UP FOR IT" - IN COMPUTERSPEAK, THOUGH.
; AT THE SAME TIME WE PUT UP A DANDY SCREEN TO LET FOLK KNOW WHAT'S
; HAPPENING, HOPEFULLY WITH A TAD LESS OVERHEAD THAN FULL SUBFUNCTION
; INSTALLATION, AND EVEN IF THE CURRENT SCREEN HAD NOTHING TO DO WITH
; SEQUENCER AND BARS AND BEATS 'N STUFF - MAKE IT SO THEY CAN'T MISS IT.
;
ENTER_HI_SPEED
               BTST    #PLAY_BIT,XPORT_STATE     ;FIRST - SAFETY CATCH - IS "PLAY" ENABLED?
               BEQ.S   ENT_HS_EXIT               ;EXIT IF NOT, WHAT SHOULD WE CARE?
;
               BTST    #PAUSE_BIT,XPORT_STATE    ;ALSO - ARE WE IN "PAUSE" STATE?
               BEQ.S   ENT_HS_EXIT               ;EXIT IF NOT, THIS COULD BE BIG TROUBLE ....
;
                                                 ;LOOKS COOL TO CHASE:
               BCLR    #PAUSE_BIT,XPORT_STATE    ;TAKE "PAUSE" OFF - WE'RE HAULIN ASHES!
               BSR     PAUSE_LED_OFF             ;PAUSE LED GETS WITH THE PROGRAM!  ALLRIGHT DUDE!
               BSR     PLAY_LED_FAST             ;"PLAY" LED GOES CHASEE CRA-SEE.
                                                 ;(Been here a REAL long time .....)
;
               ST      CHASING_SMPTE        ;POST GENERAL NOTICE - IGNORE SEQUENCER CLOCKS.
;
               MOVE.W  #SMPTE_CHASE_SCRN,A1 ;PUT UP A SCREEN FOR THE ENJOYMENT OF THE USER.
;900621                ABS_LONG
;900621               JSR     DISP_SCREEN
;900621                ABS_SHORT
               CALL    LCD_FUNS,DSP_SCRN
                                            ;LATER, SEQ. # / BAR # DISPLAY - I GOT A DATE TONITE.
;
               MOVEQ   #NEG_EXT+0F7H,D0     ;LAST BUT NOT FIRST, TELL 6803 WE'RE READY ....
               BSR     WRITE_TO_TC
;
                                            ;NOW WE WAIT FOR HI-SPEED SYNC-CHASE CLOCK MESSAGES
                                            ;COMING DIRECTLY FROM 6803 VIA LEVEL 5.
;
ENT_HS_EXIT
               RTS
;
;
SMPTE_CHASE_SCRN
               ASC     " CHASING SMPTE  "
               ASC     "  (STAY TUNED)  "
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "EXECUTE HIGH-SPEED SMPTE SYNC-CHASE - SINGLE-CLOCK ADVANCE"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; "F8" - "HIGH-SPEED SYNC-CHASE CLOCK":
; PRESUMABLY WE ARE ENGAGED IN HI-SPEED SMPTE CHASE, OR WERE LATELY -
; WE COME HERE EACH TIME 6803 SENDS HIGH-SPEED 96th-NOTE MESSAGE.
;
HI_SPEED_SYNC
               TST.B   CHASING_SMPTE        ;ACTUALLY CHASING?
               BEQ.S   HSS_EXIT             ;NO - IGNORE THIS CRAP.
;
               BSR     CHASE_CLICK          ;CHASING - PUMP OUT ANOTHER CLOCK ....
;
               MOVEQ   #NEG_EXT+0F9H,D0     ;ACKNOWLEDGE HI-SPEED CLOCK TO 6803, ENCOURAGE IT TO
               BSR     WRITE_TO_TC          ;SEND ANOTHER IF IT FEELS RIGHT.
;
;;;;
;;;; CHASE-SCREEN UPDATE GOES HERE .... IF WE BOTHER.
;;;;
               TST.B   PLAYED_TO_END        ;HAVE WE TRIED TO GO TOO FAR?
               BEQ.S   HSS_EXIT             ;NOT SO FAR - EXIT (SEE YA AGAIN SOON).
;
                                            ;OVERSHOT END OF SEQ/SONG AND STILL NOT CAUGHT UP:
               SF      CHASING_SMPTE        ;WIND IN OUR FLAG - 6803 CAN HASSLE US ALL IT WANTS,
                                            ;WE'RE NOT GONNA BUDGE.
               BSR     SYNC_PLAY_RESTART    ;SET UP TO TRY AGAIN, SHOULD THE OCCASION ARISE -
                                            ;E.G., A NEW INITIAL SYNC, PERHAPS AFTER REWIND
                                            ;TO AN EARLIER TIME.
;871014               BSR     AUTO_PUNCH_OUT       ;RESTART MAY HAVE PUNCHED US IN - WE DON'T WANT THIS -
;871014                                            ;MAKE SURE WE ARE PUNCHED OUT (USER CAN PUNCH IN BY
;871014                                            ;HAND IF SO DESIRED).
;871014               NOT ANYMORE - PLAYED_TO_END INHIBITS PUNCH-IN.
               ST      SUBFUN_INSTALL       ;PUT THE PREVIOUS SCREEN BACK IN PLACE.
;
;;;;
;;;;   OR PUT UP A "CHASED PAST END" SCREEN?
;;;;
;
HSS_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "CAUGHT-UP EXIT FROM HIGH-SPEED SMPTE SYNC-CHASE"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; "FE" - "EXIT HIGH-SPEED SMPTE SYNC-CHASE":
; 6803 IS TELLING US IT THINKS WE ARE CAUGHT UP WITH THE OUTSIDE WORLD,
; AND IS ABOUT TO RESUME NORMAL (LEVEL 2) SEQUENCER CLOCKING.
;
EXIT_HI_SPEED
               TST.B   CHASING_SMPTE        ;WERE WE REALLY CHASING, OR DOES 6803 JUST THINK SO?
               BEQ.S   EXIT_HS_EXIT         ;BRANCH IF INDEED CHASE RUMOR WAS BULLSHIT.
;
               SF      CHASING_SMPTE
               BSR     PLAY_LED_SOLID
               CLR     CLICKS_PENDING
                ABS_LONG
               JSR     XMIT_OLD_M_ONS
               JSR     XMIT_OLD_P_ONS
                ABS_SHORT
               BSR     SEND_ADVANCED_PTR
               BSR     CUED_BAR_PUNCH
               ST      SUBFUN_INSTALL
;
EXIT_HS_EXIT
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE "6803 SEQUENCER 'TRANSPORT' CONTROL"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; ROUTINES FOR RESPONDING TO TRANSPORT-CONTROL MESSAGES FROM THE 6803:
;
;
;
; "F9" - "INIT SYNC ATTAINED":
; TIMING CHIP HAS ACHIEVED INITIAL SYNC TO MTC OR SMPTE.
;
TC_INIT_SYNC
               ST      SMPTE_SYNC           ;HEY, HEY, HEY - WE'VE GOT SYNC!!!!
                                            ;NOTE - TRACK THIS AT ALL TIMES.  IF SMPTE IS COMING IN
                                            ;AND TRIGGERS THE "SYNC" MESSAGE, WE WILL PROBABLY BE
                                            ;INTERESTED IN KNOWING, EVEN IF "PLAY" IS NOT ENABLED
                                            ;AND WE'RE OFF-LINE - IT COULD GET ENABLED AT ANY TIME.
               BTST    #PLAY_BIT,XPORT_STATE     ;IS "PLAY" ENABLED?
               BEQ.S   TC_ISYNC_EXIT             ;EXIT IF NOT, WE DON'T CARE ABOUT SYNC RIGHT NOW.
               MOVE    CLOCK_IN_MODE,D0     ;FETCH CLOCK-IN MODE -
               CMP     #1,D0                ;WE BE LISTENING TO MTC?
               BEQ.S   TC_ISYNC_20          ;YES - SET PLAY LED FLASHING MADLY, THEN BEGONE.
               CMP     #4,D0                ;OH - NOT MTC.  PERHAPS SMPTE?
               BNE.S   TC_ISYNC_EXIT        ;NOT SMPTE EITHER - WE PISS OFF NOW. THIS IS ACTUALLY A
                                            ;SAFETY CATCH, SINCE THE INITIAL SYNC MESSAGE IS NOT
                                            ;SENT BY 6803 IF NOT IN MTC OR SMPTE SYNC MODE.
;
               CLR.L   SMPTE_NOW_HR         ;FOR SMPTE, CLEAR NOW-TIME WHEN SYNC IS ACHIEVED -
               SF      SMPTE_NOW_BT         ;WAIT FOR MTC-FORMAT TIME MESSAGES TO FILL US IN
                                            ;AS TO WHAT TIME IT REALLY IS "OUT THERE".
;
TC_ISYNC_20
               BSR     PLAY_LED_FAST        ;SET PLAY LED BLINKING MADLY TO INDICATE SYNC -
                                            ;WE'RE EITHER WAITING FOR START TIME TO ARRIVE, OR
                                            ;WE'RE PAST IT AND WILL CHASE UP TO CURRENT SMPTE TIME.
                                            ;PAUSE LED SHOULD HAVE BEEN ON SOLID - WE'LL LEAVE IT
                                            ;THAT WAY (UNTIL WE GO INTO HI-SPEED CHASE).
TC_ISYNC_EXIT
               RTS
;
;
;
;
; "FA" -  "START / EXIT PAUSE":
; START TIME MATCHED TO SMPTE TIME, OR MIDI "CONTINUE" RECEIVED -
; THE MIDI "CONTINUE" MAY ACTUALLY BE A "CONTINUE FROM BEGINNING" AS
; PART OF RESPONSE TO A RECEIVED MIDI "START", IN WHICH CASE WE HAVE
; FIRST BEEN TOLD TO STOP AND RE-CUE TO THE BEGINNING OF THE CURRENT
; SEQUENCE (SEE TC_STOP, BELOW).
;
TC_START
               BTST    #PLAY_BIT,XPORT_STATE     ;IS "PLAY" ENABLED?
               BEQ.S   TC_START_EXIT             ;EXIT IF NOT, WE DON'T HEAR THIS.
               BTST    #PAUSE_BIT,XPORT_STATE    ;"PLAY" ENABLED - BUT ARE WE IN "PAUSE" STATE?
               BEQ.S   TC_START_EXIT             ;EXIT IF NOT, START/UNPAUSE IS INVALID,
                                                 ;AND PROBABLY VERY DANGEROUS TO ACT UPON.
;
               MOVE    CLOCK_IN_MODE,D0     ;WHAT SYNC SOURCE ARE WE LISTENING TO?
               CMP     #2,D0
               BEQ.S   TC_START_20          ;BRANCH IF LISTENING TO MIDI CLOCKING.
               CMP     #4,D0                ;NOT MIDI, HOW ABOUT SMPTE?
               BNE.S   TC_START_EXIT        ;EXIT IF NOT - SAFETY CATCH, SINCE THIS MESSAGE IS NOT
                                            ;SENT BY 6803 WHILE IN OTHER CLOCK-IN MODES.
;
;
;
; THE SMPTE "START" CASE:
;
               CLR     CLICKS_PENDING       ;ONE MORE TIME - PURGE ANY LEFTOVER SEQUENCER CLOCKS.
               CLR     CONTINUE_TIMER       ;HEAD OFF ANY PENDING MIDI "CONTINUE" TRANSMISSION.
;
               BSR     SEND_6803_START      ;SEND MIDI "START" RIGHT NOW VIA ALL UARTS WHO ARE
               BSR     SEND_MIDI_START      ;IN ON OUR LITTLE GAME (6803 DOESN'T DO ON ITS OWN,
                                            ;SINCE WE'RE NOT TELLING IT TO START AGAIN -
                                            ;FUCKING SMPTE 1.3 SUCKS THE BIG RAW ONE ....)
;
               BCLR    #PAUSE_BIT,XPORT_STATE    ;REMOVE "PAUSE" STATUS, UPDATE LEDs ACCORDINGLY -
               BSR     PLAY_LED_SOLID
               BSR     PAUSE_LED_OFF
;
               BRA     CUED_BAR_PUNCH       ;PUNCH IN RIGHT FROM THE START IF APPROPRIATE -
                                            ;IF PUNCH-IN BASED ON SMPTE TIME, IT'LL TAKE CARE OF
                                            ;ITSELF ONCE WE'RE ROLLING (RETURN THROUGH).
;
                                            ;WE'RE CUED TO THE BEGINNING OF SEQUENCE, SO NORMAL
                                            ;HANDLING OF INCOMING CLOCKS TAKES CARE OF ALL ELSE.
;
;
;
; THE MIDI "START" CASE:
;
TC_START_20
               TST.B   PLAYED_TO_END        ;WAS CUE OR PLAY TO END OF SEQUENCE OR SONG
                                            ;THE LAST THING THAT HAPPENED AROUND HERE?
               BNE.S   TC_START_EXIT        ;EXIT IF YES - IGNORE THE COMMAND, STAY IN "PAUSE"
                                            ;STATE - WE'RE GONNA NEED A MIDI "START" OR AN IN-RANGE
                                            ;SONG-POINTER FOLLOWED BY MIDI "CONTINUE" BEFORE WE CAN
                                            ;LEGITIMATELY START PLAYING AGAIN.
;
               BCLR    #PAUSE_BIT,XPORT_STATE    ;ELSE - TAKE "PAUSE" OFF,
               BSR     PAUSE_LED_OFF             ;REFLECT STATUS CHANGE IN LEDs -
               BSR     PLAY_LED_SOLID
                                                 ;IF WE ARE CUEING TO SONG-POINTER, THE "UNPAUSE"
                                                 ;WILL BE DULY NOTED WHEN CUEING IS COMPLETED.
;
               TST.B   CUEING_TO_SPP        ;SO?  ARE WE CUEING TO A SONG POINTER?
               BEQ.S   TC_START_40          ;BRANCH IF NOT - MAKE READY TO ROLL RIGHT AWAY.
;
                                            ;ELSE, WE BE CAUGHT UP IN HI-SPEED CUE TO SPP:
               MOVE    #2000H,SR            ;MAKE SURE ALL INTERRUPTS ARE ENABLED.  SPP-CUE BLOCKS
                                            ;THEM AS FAR AS LEVEL 3 FOR OPTIMUM SPEED - HOWEVER,
                                            ;WE MUST NOW ALLOW FOR THE POSSIBILITY OF INCOMING
                                            ;SEQUENCER CLOCKS VIA LEVEL 2 INTERRUPT (AND IF ANY DEM
                                            ;COME IN BEFORE I 'N' I DONE CUEING, MUS' SAVE DEM UP
                                            ;AN' SERVICE DEM ONCE I 'N' I GET CUED).
               BRA     LED_DIRECT           ;UPDATE LEDs DIRECTLY - ROTATING BACKGROUND IS LOCKED
                                            ;OUT WHILE DOING CUE TO SPP - RETURN THROUGH.
;
;
TC_START_40
                                            ;WE NO BE SPP-CUEING:
               BSR     CUED_BAR_PUNCH       ;DO ANY PUNCHING IN WHICH IS APPROPRIATE AT THIS POINT.
               TST.L   OVERALL_CLICK        ;ARE WE AT THE VERY BEGINNING OF SEQUENCE OR SONG?
               BEQ.S   TC_START_EXIT        ;EXIT IF YES, NO SEQUENCE NOTES SHOULD BE GATED ON.
               TST     HOLDING_EVENT        ;LIKEWISE IF WE HAVE RECENTLY CUED A NEW SEQUENCE
               BEQ.S   TC_START_EXIT        ;(E.G., UNDER SONG MODE).
                ABS_LONG
               JSR     XMIT_OLD_M_ONS       ;ELSE, TURN ON SEQUENCE NOTES WHICH SHOULD BE
               JSR     XMIT_OLD_P_ONS       ;SUSTAINING AT THIS POINT IN TIME.
                ABS_SHORT
;
TC_START_EXIT
               RTS
;
;
;
;
; "FB" - "LOST SYNC":
; SMPTE SYNC HAS BEEN LOST, OR MIDI "STOP" HAS BEEN RECEIVED.
;
TC_PAUSE
               MOVE    CLOCK_IN_MODE,D0     ;WHAT'S OUR TIMEBASE, THEN?
               CMP     #2,D0
               BEQ.S   TC_PAUSE_20          ;BRANCH IF WE'RE UNDER MIDI SYNC.
               CMP     #4,D0                ;NOT MIDI - HOW ABOUT SMPTE?
               BNE     TC_PAUSE_EXIT        ;BRANCH IF NOT SMPTE EITHER, EXIT - THIS IS A SAFETY
                                            ;MEASURE, SINCE "PAUSE" MESSAGE IS NOT SENT BY 6803
                                            ;UNDER SYNC MODES OTHER THAN MIDI AND SMPTE.
;
;
;
; SMPTE SYNC LOST:
;
               SF      SMPTE_SYNC           ;PUBLICIZE OUR LACK OF SMPTE SYNC.
                                            ;NOTE - TRACK THIS AT ALL TIMES.  IF INCOMING SMPTE
                                            ;DROPS OUT AND TRIGGERS THE "LOST SYNC" MESSAGE, WE'LL
                                            ;PROBABLY BE INTERESTED TO KNOW, EVEN IF "PLAY" IS NOT
                                            ;ENABLED AND WE'RE OFF-LINE - MAY GET ENABLED ANYTIME.
;
               BTST    #PLAY_BIT,XPORT_STATE     ;IS "PLAY" ENABLED?
               BEQ     TC_PAUSE_EXIT             ;EXIT IF NOT, NOTHING MORE TO DO.
               BTST    #PAUSE_BIT,XPORT_STATE    ;ARE WE PAUSED?
               BNE     TC_PAUSE_EXIT             ;EXIT IF YES - IMPLIES THAT WE ARE ALREADY RESET
                                                 ;TO "BEGIN-PLAY" CONDITIONS, NO MORE NEED BE DONE.
;
               SF      CHASING_SMPTE        ;ELSE - DROP OUT OF ANY SYNC-CHASE IN PROGRESS.
;871014               ST      PLAYED_TO_END        ;EVEN THOUGH WE MAY NOT HAVE - THIS ENSURES THAT SONG-
;871014                                            ;MODE RESTART WILL BE COMPLETE (NEW_SONG_SELECTED SHIES
;871014                                            ;AWAY FROM SETTING REPEAT COUNT IF IT THINKS SEQUENCER
;871014                                            ;IS RUNNING).
               BSR     SYNC_PLAY_RESTART    ;STOP/RESTART THE SEQUENCER (SETS UP LEDs -
                                            ;"PLAY" LED SLOW-FLASH, "PAUSE" LED SOLID).
               SF      PLAYED_TO_END        ;THIS IS NO LONGER NEEDED (FOR IGNORING SEQ CLOCKS) -
                                            ;ONCE WE LOSE SYNC, NO CHOICE BUT TO RESTART.
;
               BSR     AUTO_PUNCH_OUT       ;RESTART MAY HAVE PUNCHED US IN - WE DON'T WANT THIS -
                                            ;MAKE SURE WE ARE PUNCHED OUT (USER CAN PUNCH IN BY
                                            ;HAND IF SO DESIRED).
;
               BSET    #PAUSE_BIT,XPORT_STATE    ;SET "PAUSED" STATUS NOW - NOTE THAT WE HELD OFF
                                                 ;ON THIS UNTIL AFTER RESTART, SO THAT IT WOULD NOT
                                                 ;THINK WE WERE PREVIOUSLY PAUSED - IN WHICH CASE
                                                 ;IT WOULD NOT TURN OFF SUSTAINING SEQUENCER NOTES.
;
               BSR     SEND_MIDI_STOP       ;TELL THE MIDI WORLD "WHOA" (WAITED UNTIL AFTER RESTART
                                            ;AND ANY CONSEQUENT MASS-EXODUS OF NOTE-OFF EVENTS).
               BSR     SEND_6803_STOP       ;SAY "STOP" TO FOLLOWERS OF 6803 TIME-REALITY TOO -
                                            ;NOTE THAT 6803 IS SUPPOSED TO DO THIS ON ITS OWN WHEN
                                            ;IT DETECTS SMPTE SYNC-LOSS, BUT 1.3 SEEMS NOT TO ....
;
               ST      SUBFUN_INSTALL       ;REQUEST TO BRING DISPLAY UP TO DATE, JUST IN CASE ....
               BRA.S   TC_PAUSE_EXIT        ;THAT'S ALL FOAX.
;
                                            ;NOW, WE SITSNWAITS FOR "SYNC_ATTAINED" MESSAGE.
;
;
;
; MIDI "STOP" RECEIVED:
;
TC_PAUSE_20
               MOVE.B  XPORT_STATE,D0       ;JUST WHAT KINDA STATE ARE WE IN?
               BTST    #PLAY_BIT,D0         ;GOT TO HAVE "PLAY" ENABLED -
               BEQ.S   TC_PAUSE_EXIT        ;EXIT IF NOT, WE'RE DEAF TO MIDI REALTIME.
               BTST    #PAUSE_BIT,D0        ;FOIDA-MAW, IF WE'RE AWREDDY PAWZED -
               BNE.S   TC_PAUSE_EXIT        ;DEN WE DON'T GIVE A FLYING FUCK.
;
                                            ;ELSE - "PAUSE WE MUST."
               BSET    #PAUSE_BIT,D0        ;POST OUR STATUS - ANYTHING WE GATE OFF MUST GET GATED
               MOVE.B  D0,XPORT_STATE       ;BACK ON AGAIN (ONCE) IF A MIDI "CONTINUE" COMES IN
                                            ;AND REMOVES THE "PAUSE" FROM OVER OUR HEADS.
               BSR     PLAY_LED_SLOW        ;DISPLAY OUR STATUS BY MEANS OF OPTICAL PHENOMENA.
               BSR     PAUSE_LED_SOLID
;
               TST.B   CUEING_TO_SPP        ;ARE WE IN THE MIDDLE OF CUEING TO A MIDI SONG POINTER?
               BEQ.S   TC_PAUSE_40          ;BRANCH IF NOT, CONTINUE - ELSE,
               MOVE    #2300H,SR            ;RAISE INTERRUPT LEVEL TO BLOCK REALTIME INTERRUPT -
                                            ;THE BIG TIME HOG - AND LET CUEING MOVE AT FULL SPEED.
               BSR     PLAY_LED_SOLID       ;UPDATE LEDs RIGHT AWAY, SINCE BACKGROUND WON'T GET TO
               BSR     LED_DIRECT           ;IT WHILE SPP CUEING IS IN PROGRESS - MAKE SURE THAT
               BSR     PLAY_LED_SLOW        ;"PLAY" LED DOESN'T GET STUCK IN "OFF" STATE.
               BRA.S   TC_PAUSE_EXIT        ;NO NOTES TO GATE OFF (ALL OFF ALREADY) - SPLIT.
;
TC_PAUSE_40
                                            ;NOT CUEING TO SPP - LOOK FOR OTHER CONDITIONS WHICH
                                            ;PRECLUDE THE POSSIBILITY OF SUSTAINED SEQUENCE NOTES
                                            ;WHICH NEED TO BE GATED OFF AT PAUSE:
;
               BSR     AUTO_PUNCH_OUT       ;BUT BEFORE THAT:
                                            ;MAKE SURE WE ARE PUNCHED OUT (USER CAN PUNCH BACK IN
                                            ;BY HAND IF SO DESIRED).
;
               TST.B   PLAYED_TO_END        ;AT THE END OF TIME, EVERYTHING'S EXTINCT -
               BNE.S   TC_PAUSE_EXIT        ;EXIT IF WE MADE IT TO ETERNITY.
               TST     CLICKS_PENDING       ;ARE ANY SEQUENCER CLOCK SERVICE REQUESTS PENDING?
               BNE.S   TC_PAUSE_60          ;BRANCH IF YES - WE'RE NOT AT OUR PAUSE POINT YET,
                                            ;GOTTA GO WAIT 'EM OUT.
               TST.L   OVERALL_CLICK        ;IN THE BEGINNING, THERE WAS NOTHING AT ALL -
               BEQ.S   TC_PAUSE_EXIT        ;EXIT IF FIRST DAY'S WORK NOT YET BEGUN.
               TST     HOLDING_EVENT        ;HOLES IN THE FABRIC OF TIME (SEQUENCE SPLICES UNDER
               BEQ.S   TC_PAUSE_EXIT        ;SONG MODE, RECORD LOOPING, MANUAL SEQUENCE CUEING).
;
TC_PAUSE_60
               TST     CLICKS_PENDING       ;ARE ANY SEQUENCER CLOCK SERVICE REQUESTS PENDING?
;17SEP               BNE     TC_PAUSE_60          ;HOLD ON IF YES - WE'RE GONNA SERVICE 'EM, MUST DO THIS
;17SEP                                            ;BEFORE BRINGING ON THE "BIG MUTE".
               BEQ.S   TC_PAUSE_80          ;BRANCH IF NOTHING PENDING, BRING ON THE "BIG MUTE" -
               BSR     PRO_CLICK            ;ELSE, PROCESS A CLOCK SERVICE REQUEST HURRY-UP PRONTO,
               BRA     TC_PAUSE_60          ;LOOP BACK TO SEE IF WE'RE OUTTA THE WOODS NOW.
;
TC_PAUSE_80
               BSR     WAIT_AND_OFF         ;OKAY - GATE OFF ANY SUSTAINED SEQUENCER NOTES, EXIT.
;
;
TC_PAUSE_EXIT
               RTS
                                            ;THAT'S ALL - 6803 WILL NOT CLOCK US ANY MORE UNTIL IT
                                            ;SEES A "CONTINUE" OR "START", AND WILL NOTIFY US OF
                                            ;SUCH BEFORE HITTING US WITH CLOCKS.
;
;
;
;
; "FC" - "STOP":
; MIDI "START" HAS BEEN RECEIVED.
; 6803 FIRST TELLS US TO STOP - IF WE HAD PREVIOUSLY BEEN PLAYING
; THROUGH A SEQUENCE AND A MIDI "STOP" CAME IN, WE WOULD HAVE MERELY
; PAUSED AT THAT POINT IN THE SEQUENCE (SINCE THE MIDI "STOP" BYTE DOES
; NOT IMPLY ANYTHING MORE THAN "HOLD IT RIGHT WHERE YOU ARE"), AND MUST
; NOW RACE ALL THE WAY TO THE END AND GET BACK TO THE BEGINNING IN ORDER
; TO RESPOND TO THE "START" BYTE.  A SIMILAR SITUATION OBTAINS IF WE
; WERE CUEING TO A SONG POINTER.  OTHERWISE, WE SHOULD ALREADY BE CUED
; TO THE START OF THE CURRENT SEQUENCE AND WILL DO NOTHING HERE.
; THE 6803 WILL SHORTLY TELL US TO CONTINUE - WHICH WE WILL DO, FROM THE
; BEGINNING OF THE SEQUENCE (SEE TC_START).
;
; SPECIAL NOTE, SMPTE 1.3:
; ONE OF THE TRUE TRAGEDIES OF OUR TIME (MY TIME, ANYWAY - HOURS OF IT):
; RECEPTION OF A MIDI "START" BYTE BY THE 6803 CAUSES IT TO TURN ITSELF
; OFF, EVEN AS IT IS ENABLING MIDI CLOCKING - A BUG, PURE 'N' SIMPLE.
; FORTUNATELY, ANOTHER "FEATURE" OF SMPTE 1.3 IS THAT SENDING A "START"
; COMMAND TO IT DOESN'T TOUCH CURRENT MIDI CLOCK ENABLE STATUS -
; WELL, MAYBE THAT'S REASONABLE, AND I'M JUST BEING SOUR-ASS ABOUT IT -
; ANYWAY, THIS MEANS WE CAN PATCH THINGS UP BY SLAMMING A "START" RIGHT
; BACK AT THE 6803 WHEN IT TELLS US TO "STOP" ....
; ALSO SOMEWHAT UNFORTUNATE THAT THE 6803 ENABLES MIDI CLOCKING WHEN IT
; RECEIVES A "START" EVEN THOUGH WE MAY NOT WANNA BE BOTHERED - IF WE
; COME ON-LINE (I.E., USER HITS "PLAY" SWITCH) AFTER THIS POINT, WE'LL
; GET CLOCKED RIGHT AWAY UNLESS WE DO SOMETHING TO PREVENT IT - SUCH AS
; TELLING THE 6803 TO "STOP" IMMEDIATELY (WHICH IS EXACTLY WHAT WE DO).
;
TC_STOP
               CMP     #2,CLOCK_IN_MODE     ;JUST TO BE SAFE - MAKE SURE WE'RE IN MIDI CLOCK MODE.
               BNE.S   TC_STOP_EXIT         ;EXIT IF NOT, ALTHOUGH THIS MESSAGE SHOULD NOT COME IN
                                            ;FROM 6803 IF WE ARE NOT LISTENING TO MIDI CLOCKS.
               BTST    #PLAY_BIT,XPORT_STATE     ;IS "PLAY" ENABLED?
               BNE.S   TC_STOP_20                ;BRANCH IF YES, CONTINUE -
;
               BSR     STOP_TC                   ;ELSE, TELL 6803 WE DON'T WANT ANY (SEQ CLOCKS) -
                                                 ;WHEN OFF-LINE, WE DON'T HEAR "START".
                                                 ;(SORRY, GOTTA HIT THE PLAY SWITCH AT LEAST ONCE!)
                                                 ;THIS SHOULD ALSO COVER OTHER CASES SUCH AS EMPTY
                                                 ;SEQUENCE WHERE THE CORRECT RESPONSE IS NO ACTION.
               BRA.S   TC_STOP_EXIT              ;HAVING RESTORED ORDER, RIDE OFF INTO THE SUNSET
                                                 ;WITHOUT WAITING TO BE THANKED ....
;
;
TC_STOP_20
                                            ;OKAY THEN -
;
               BSR     START_TC             ;FIRSTORDABIZNISS - GET 6803 BACK ON-LINE BEFORE IT
                                            ;STARTS MISSING MIDI CLOCKS - FUCKING JERK.
;
               CLR     CLICKS_PENDING       ;SINCE WE'RE BEING TOLD TO START FROM SCRATCH,
                                            ;PURGE ANY LEFTOVER SEQ CLOCK SERVICE REQUESTS - THEN,
;
               MOVE    #2000H,SR            ;MAKE SURE ALL INTERRUPTS ARE UNBLOCKED - WE CAN EXPECT
                                            ;TO SEE NEW LEVEL 2 (SEQ CLOCK) INTERRUPTS AT ANY TIME,
                                            ;AND WE WANT TO MAKE SURE WE CATCH EVERY ONE OF THEM,
                                            ;EVEN IF WE CAN'T RESPOND TO THEM QUITE IMMEDIATELY.
                                            ;(SONG-POINTER CUEING MAY HAVE RAISED INTERRUPT LEVEL).
;
               CLR.L   CUR_SPP_CLICK        ;DEFEAT ANY SONG POINTER CUEING IN PROGRESS.
                                            ;NOTE:  LEAVE CUEING_TO_SPP FLAG SET AS A SIGNAL TO
                                            ;RESTART PROCEDURE - NO NOTE-ONS SHOULD HAVE BEEN SENT
                                            ;TO ANYONE, DON'T WASTE TIME ON SENDING NOTE-OFFS -
                                            ;IF, IN FACT, WE DO NEED TO RESTART THE SEQUENCER.
;
               TST.L   OVERALL_CLICK        ;SO - ARE WE POISED AT START OF SEQUENCE OR SONG,
                                            ;JUST WAITING TO BE GIVEN THE GO-AHEAD?
               BEQ.S   TC_STOP_40           ;BRANCH IF YES - SEQUENCER RESTART NOT NECESSARY.
                                            ;ELSE -
;871014               ST      PLAYED_TO_END        ;EVEN THOUGH WE MAY NOT HAVE - THIS ENSURES THAT SONG-
;871014                                            ;MODE RESTART WILL BE COMPLETE (NEW_SONG_SELECTED SHIES
;871014                                            ;AWAY FROM SETTING REPEAT COUNT IF IT THINKS SEQUENCER
;871014                                            ;IS RUNNING).
               BSR     SYNC_PLAY_RESTART    ;WRAP UP AND EJECT THIS SEQUENCE, JAM BACK TO START OF
                                            ;SEQUENCE OR SONG, GET SET UP TO PLAY.
TC_STOP_40
               SF      CUEING_TO_SPP        ;NOW - WIPE OUT ANY LAST VESTIGE OF SPP CUEING.
               SF      PLAYED_TO_END        ;KILL FLAG THAT SAYS WE HAVE PLAYED THROUGH TO END,
                                            ;OR ATTEMPTED TO CUE PAST END OF SEQUENCE OR SONG -
                                            ;NOW WE'RE ABLE TO RESPOND TO SEQUENCER CLOCKS.
;
TC_STOP_EXIT
               RTS
;
                                            ;NOTE - WE SHOULD VIRTUALLY IMMEDIATELY RECEIVE THE
                                            ;"EXIT PAUSE" COMMAND FROM THE 6803 TO ENABLE US TO
                                            ;RESPOND TO THE SEQUENCER CLOCK INTERRUPTS WHICH ARE
                                            ;CERTAIN TO FOLLOW (GENERATED BY THE 6803 IN RESPONSE
                                            ;TO THE INEVITABLE INCOMING MIDI CLOCKS).
;
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
               TITLE   "RESET TO START OF SEQUENCE OR SONG UNDER MIDI/SMPTE CONTROL"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; WE NEED TO GET RID OF THE SEQUENCE CURRENTLY "IN" THE SEQUENCER
; AND GET CUED UP TO THE BEGINNING OF THE CURRENT SEQUENCE OR SONG ASAP:
; (YES, IT MAY VERY WELL BE SAME SEQUENCE AS BEFORE - SIDDOWN, WILLYA?)
;
; FOR SYNC TO MIDI ("START" COMMAND AND CUEING TO SPP), OR FOR
; SMPTE/MTC SYNC (LOST SYNC, WILL HAVE TO CHASE FROM BEGINNING) -
; ALSO USED IN ALL OF ABOVE SYNC MODES TO HANDLE PLAY/CUE TO END OF SEQ
; OR SONG - IN WHICH SITUATION WE GO BACK TO THE START OF WHATEVER IT
; WAS RIGHT AWAY, SINCE WE'RE GONNA HAVE TO ANYWAY BEFORE WE CAN DO
; ANYTHING ELSE.
;
;871014;
;871014; NOTE - IN ORDER TO GUARANTEE FULL RESTART UNDER SONG MODE IT IS
;871014; NECESSARY FOR PLAYED_TO_END(.B) TO BE TRUE WHEN COMING THROUGH HERE
;871014; (EVEN THOUGH WE MAY NOT HAVE ACTUALLY HIT END).  WITHOUT THIS,
;871014; NEW_SONG_SELECTED MAY DECIDE SEQUENCER IS REALLY RUNNING AND FAIL TO
;871014; UPDATE SONG-STEP REPEAT COUNT PER FIRST SONG STEP.
;871014; SOMEDAY I'LL MAKE THIS MORE AUTOMATIC ....
;871014;       TODAY WAS SOMEDAY, FORGET THIS - IT'S AUTOMATIC NOW.
;
; IN FACT, THIS COULD HAVE BEEN CALLED SYNC_BREAK_RESTART - MAYBE IT IS.
;
SYNC_PLAY_RESTART
;
               BSR     EJECT_SEQUENCE       ;GET WASHED OF CURRENT SEQUENCE (IF WE AREN'T ALREADY),
                                            ;RESET THE SEQUENCER FOR NEW PLAYBACK START.
;
               TST     S_OR_S_FLAG          ;ARE WE IN SONG MODE?
               BEQ.S   SP_RST_20            ;BRANCH IF NOT,
               ST      NEW_SONG_NOW         ;ELSE CLEAR THE WAY FOR FULL SONG INSTALLATION,
                ABS_LONG
               JSR     NEW_SONG_SELECTED    ;GET CUED TO SONG STEP 1 (SET CURRENT_SEQUENCE).
                ABS_SHORT
               SF      NEW_SONG_NOW         ;DON'T LEAVE THIS FLAG LYING AROUND.
SP_RST_20
;
;
               SF      CUE_NEW_SEQ          ;SET FLAG AS THOUGH REPLAYING SAME SEQUENCE,
               MOVE    CURRENT_SEQUENCE,D0  ;SEE WHICH SEQUENCE WE'RE ABOUT TO SET UP -
               CMP     FORMER_SEQUENCE,D0   ;SAME AS LAST TIME?
               BEQ.S   SP_RST_40            ;BRANCH IF YES, DO A BIT LESS TO GET SET-UP.
               ST      CUE_NEW_SEQ          ;ELSE - GOTTA DO FULL SET-UP OF NEW SEQUENCE.
SP_RST_40
               BSR     SET_UP_SEQUENCE      ;GO GIVE IT A SHOT -
               TST     NOW_SEQ_STATUS       ;IF WE CUED TO EMPTY OR NULL SEQUENCE, MUST KICK OFF -
               BEQ     STOP_SWITCH          ;RETURN THROUGH STOP SWITCH HANDLER - THIS TAKES US
                                            ;OFF-LINE, AND USER WILL HAVE TO DEAL WITH US DIRECTLY
                                            ;(I.E., BY HAND) IN ORDER TO GET US GOING AGAIN.
;
                                            ;ELSE - SEQUENCE CUED UP NEXT IS PLAYABLE:
               BSR     INIT_WASTE_RECORD    ;CLEAR OUT WASTELAND - SET_UP_SEQUENCE DOESN'T DO THIS,
                                            ;BEING AS HOW IT'S PART OF LOOPING RECORD SYSTEM.
;
                                            ;ALL OTHER SETUP HAS BEEN HANDLED BY SET_UP_SEQUENCE,
                                            ;LEAVING JUST LEDs FOR US TO SET UP:
               BSR     PLAY_LED_SLOW        ;SAY WE'RE ENABLED FOR PLAY, AWAITING SYNC - (TRUE FOR
                                            ;THE SEQUENCER, EVEN IF NOT FOR THE 6803 ....)
               CLR     PLAY_BLINK_TIMER     ;STOP DAEMON FROM TURNING "PLAY" LED ON SOLID AFTER US.
               BRA     PAUSE_LED_SOLID      ;LAST BUT NOT LEAST (OKAY, LEAST) - WE'RE PAUSED.
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               TITLE   "STILL MORE MESSAGES FROM 6803"
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
;             THE 6803 (TC) HAS DETECTED OR RECEIVED A NEW SMPTE/MIDITC MODE, AND IS TELLING US
;              SO.
;
NEW_SMPTE_TYPE
               JSR     GET_LEVEL_5          ;GET TYPE
               MOVE.B  D0,SMPTE_NOW_TYPE    ; SAVE
;
;***** EVENTUALLY BREAK DOWN INTO 0->3 TYPE, TOO
;
               RTS
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

