Changeset 4f508e6 in buchla-68k for ram/sedisp.s


Ignore:
Timestamp:
07/01/2017 02:34:46 PM (7 years ago)
Author:
Thomas Lopatic <thomas@…>
Branches:
master
Children:
08e1da1
Parents:
f40a309
Message:

Converted assembly language files.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ram/sedisp.s

    rf40a309 r4f508e6  
    1 * ------------------------------------------------------------------------------
    2 * sedisp.s -- score event display driver
    3 * Version 43 -- 1988-09-26 -- D.N. Lynx Crowe
    4 *
    5 *       se_disp(ep, sd, gdstb, cf)
    6 *       struct s_entry *ep;
    7 *       short sd;
    8 *       struct gdsel *gdstb[];
    9 *       short cf;
    10 *
    11 *               Displays the event at 'ep', scrolling in direction 'sd', by
    12 *               updating 'gdstb'.  Uses the accidental code in 'ac_code', and
    13 *               the note type table 'nsvtab'.  Checks 'cf' to determine if
    14 *               we're displaying in the center of the screen.
    15 *               Allocates gdsel events as needed for new events.
    16 * ------------------------------------------------------------------------------
     1| ------------------------------------------------------------------------------
     2| sedisp.s -- score event display driver
     3| Version 43 -- 1988-09-26 -- D.N. Lynx Crowe
     4
     5|       se_disp(ep, sd, gdstb, cf)
     6|       struct s_entry |ep;
     7|       short sd;
     8|       struct gdsel |gdstb[];
     9|       short cf;
     10
     11|               Displays the event at 'ep', scrolling in direction 'sd', by
     12|               updating 'gdstb'.  Uses the accidental code in 'ac_code', and
     13|               the note type table 'nsvtab'.  Checks 'cf' to determine if
     14|               we're displaying in the center of the screen.
     15|               Allocates gdsel events as needed for new events.
     16| ------------------------------------------------------------------------------
    1717                .text
    18 *
     18
    1919                .xdef   _se_disp
    20 *
     20
    2121                .xdef   _ac_code
    2222                .xdef   numstr
    23 *
     23
    2424                .xref   _dclkmd
    2525                .xref   _dsgmodz
     
    2929                .xref   _vputc
    3030                .xref   _vputs
    31 *
     31
    3232                .xref   _angroup
    3333                .xref   _ctrsw
     
    4949                .xref   _vrbw15
    5050                .xref   _vrcw
    51 *
    52                 .page
    53 *
    54 * parameter offsets
    55 * -----------------
    56 * for se_disp:
    57 * ------------
    58 P_EP            .equ    8               * LONG - event pointer
    59 P_SD            .equ    12              * WORD - scroll direction
    60 P_SL            .equ    14              * LONG - slice control table pointer
    61 P_CF            .equ    18              * WORD - center slice flag
    62 *
    63 * for vputa:
    64 * ----------
    65 ROW             .equ    4               * WORD - 'row' parameter offset
    66 COL             .equ    6               * WORD - 'col' parameter offset
    67 ATR             .equ    8               * WORD - 'atr' parameter offset
    68 *
    69 * Character field attributes for highlighting
    70 * -------------------------------------------
    71 AT01            .equ    $0054
    72 AT04            .equ    $0053
    73 AT05            .equ    $0054
    74 AT06            .equ    $0053
    75 AT07            .equ    $0054
    76 AT08            .equ    $0053
    77 AT09            .equ    $0054
    78 AT10            .equ    $0053
    79 AT11            .equ    $0052
    80 AT12            .equ    $0052
    81 *
    82 * Special character equates
    83 * -------------------------
    84 SP_M1           .equ    $A1                     * -1
    85 SP_P1           .equ    $A0                     * +1
    86 *
    87                 .page
    88 *
    89 * event structure offsets
    90 * -----------------------
    91 *                     offset             length
    92 *                     ------             ------
    93 E_TIME          .equ    0               * LONG
    94 E_SIZE          .equ    4               * BYTE
    95 E_TYPE          .equ    5               * BYTE
    96 E_DATA1         .equ    6               * BYTE
    97 E_NOTE          .equ    6               * BYTE
    98 E_DATA2         .equ    7               * BYTE
    99 E_GROUP         .equ    7               * BYTE
    100 E_BAK           .equ    8               * LONG
    101 E_FWD           .equ    12              * LONG
    102 E_DN            .equ    16              * LONG
    103 E_VEL           .equ    16              * WORD
    104 E_DATA4         .equ    18              * WORD
    105 E_UP            .equ    20              * LONG
    106 E_LFT           .equ    24              * LONG
    107 E_RGT           .equ    28              * LONG
    108 *
    109 N_ETYPES        .equ    25              * number of event types
    110 *
    111 * gdsel structure definitions
    112 * ---------------------------
    113 G_NEXT          .equ    0               * long - 'next' field   (struct gdsel *)
    114 G_NOTE          .equ    4               * word - 'note' field   (short)
    115 G_CODE          .equ    6               * word - 'code' field   (short)
    116 *
    117 NATCH_B         .equ    3               * uslice note code:  'begin natural'
    118 NOTE_E          .equ    6               * uslice note code:  'end note'
    119 *
    120 NGDSEL          .equ    17              * number of event slots in gdstb
    121 *
    122 BARFLAG         .equ    4*(NGDSEL-1)    * offset to the bar marker flag
    123 *
    124                 .page
    125 *
    126 * A few words about se_disp:
    127 * --------------------------
    128 * se_disp has to be very fast, so it's written in assembly language,
    129 * rather than C, which is usually pretty good, but not quite good enough
    130 * for this application.  The faster this routine runs, the higher the
    131 * tempo we can keep up with.  If this code is fast enough, we end up
    132 * hardware limited by the maximum rate of the timer, and the VSDD update rate.
    133 *
    134 _se_disp:       link    a6,#0                   * allocate and link stack frame
    135                 movea.l P_EP(a6),a0             * get event pointer 'ep' into a0
    136                 move.b  E_TYPE(a0),d1           * get event type into d1.W
    137                 andi.w  #$007F,d1               * mask off new-note flag
    138                 cmp.b   #N_ETYPES,d1            * see if it's valid
    139                 blt     seds1                   * jump if it is
    140 *
    141 dsexit:         unlk    a6                      * done -- unlink stack frames
    142                 rts                             * return to caller
    143 *
    144 seds1:          lea     sddtab,a1               * get base of dispatch table
    145                 lsl.w   #2,d1                   * multiplty event by 4 for index
    146                 movea.l 0(a1,d1.W),a2           * get address of event routine
    147                 jmp     (a2)                    * jump to event display routine
    148 *
    149 * On entry, the individual display routines only depend on a0 pointing at the
    150 * event they were dispatched for.  Registers a6 and a7 have their usual meaning,
    151 * a6 = frame pointer, a7 = stack pointer.
    152 *
    153 * d0..d2 are used for scratch, as are a0..a2, and are not saved by this code.
    154 *
    155                 .page
    156 *
    157 * dsnbx -- dispatch to begin / end based on sd
    158 * -----    -----------------------------------
    159 dsnbx:          tst.w   P_SD(a7)                * check direction
    160                 bne     dsne                    * treat as end if going backward
    161 *
    162 * dsnb -- display note begin
    163 * ----    ------------------
    164 dsnb:           move.b  E_TYPE(a0),d1           * get event type
    165                 move.w  d1,d2                   * save in d2
    166                 andi.w  #$007F,d1               * clear new-note flag
    167                 move.b  d1,E_TYPE(a0)           * store type back in event
    168                 clr.w   d0                      * get group number
    169                 move.b  E_GROUP(a0),d0          * ... in d0
    170                 move.w  d0,d1                   * save group in d1
    171                 add.w   d0,d0                   * make d0 a word offset
    172                 lea     _grpstat,a1             * check grpstat[grp]
    173                 tst.w   0(a1,d0.W)              * ...
    174                 beq     dsexit                  * done if not enabled
    175 *
    176                 tst.w   P_CF(a6)                * check center slice flag
    177                 beq     dsnb0                   * jump if not center slice
    178 *
    179                 tst.w   _velflag                * see if we display velocity
    180                 beq     dsnvx                   * jump if not
    181 *
    182                 move.w  d2,-(a7)                * save new-note flag on stack
    183                 move.w  d1,-(a7)                * save group number on stack
    184                 move.w  E_VEL(a0),d0            * get velocity
    185                 move.w  d1,d2                   * point into lastvel[]
    186                 add.w   d2,d2                   * ...
    187                 lea     _lastvel,a1             * ...
    188                 move.w  d0,0(a1,d2.W)           * update lastvel[group]
    189                 ext.l   d0                      * scale
    190                 divu    #252,d0                 * ...
    191                 cmpi.w  #100,d0                 * convert MS digit
    192                 bcs     dsnv0                   * ...
    193 *
    194                 move.b  #'1',numstr             * ...
    195                 subi.w  #100,d0                 * ...
    196                 bra     dsnv1                   * ...
    197 *
    198 dsnv0:          move.b  #'0',numstr             * ...
    199 *
    200 dsnv1:          ext.l   d0                      * convert middle & LS digits
    201                 divu    #10,d0                  * ...
    202                 addi.l  #$00300030,d0           * ...
    203                 move.b  d0,numstr+1             * ...
    204                 swap    d0                      * ...
    205                 move.b  d0,numstr+2             * ...
    206                 clr.b   numstr+3                * terminate string
    207                 move.w  d1,d0                   * col = group
    208                 asl.w   #2,d0                   * ... * 5
    209                 add.w   d1,d0                   * ...
    210                 add.w   #6,d0                   * ... + 6
    211                 move.l  a0,-(a7)                * save event pointer on stack
    212                 move.w  #AT11,-(a7)             * put attribute on stack
    213                 move.l  #numstr,-(a7)           * put string address on stack
    214                 move.w  d0,-(a7)                * put column on stack
    215                 move.w  #5,-(a7)                * put row on stack
    216                 move.l  _obj8,-(a7)             * put VSDD address on stack
    217                 jsr     _vputs                  * update the screen
    218                 add.l   #14,a7                  * clean up stack
    219                 movea.l (a7)+,a0                * restore event pointer
    220 *
    221                 .page
    222 *
    223                 move.w  (a7)+,d0                * get group from stack
    224                 cmpi.w  #12,d0                  * see which byte it's in
    225                 bcc     dsnv2                   * jump if in MS byte
    226 *
    227                 bset    d0,_vrbw12+1            * set group bit in LS byte
    228                 bra     dsnv3                   * ...
    229 *
    230 dsnv2:          bset    d0,_vrbw12              * set group bit in MS byte
    231 *
    232 dsnv3:          bset    #4,_vrcw                * set video reset type bit
    233                 move.w  (a7)+,d2                * get new-note flag from stack
    234 *
    235 dsnvx:          btst.l  #7,d2                   * check new-note flag
    236                 beq     dsexit                  * done if not set
    237 *
    238 dsnb0:          clr.w   d1                      * get note number nn (0..127)
    239                 move.b  E_NOTE(a0),d1           * ... in d1
    240                 sub.w   #21,d1                  * subtract base of piano scale
    241                 bmi     dsexit                  * done if not displayable
    242 *
    243                 cmp.w   #87,d1                  * see if it's too high
    244                 bgt     dsexit                  * done if not displayable
    245 *
    246                 move.l  _gdfsep,d0              * quit if no elements left
    247                 beq     dsexit                  * ...
    248 *
    249                 movea.l d0,a1                   * a1 = gdsp
    250                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    251                 clr.w   d2                      * d2 = ep->group
    252                 move.b  E_GROUP(a0),d2          * ...
    253                 lsl.w   #2,d2                   * ... * 4
    254                 movea.l P_SL(a6),a2             * a2 points at gdstb
    255                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[ep->group]
    256                 move.l  a1,0(a2,d2.W)           * gdstb[ep->group] = gdsp
    257                 move.w  d1,G_NOTE(a1)           * gdsp->note = nn
    258                 lea     _nsvtab,a2              * a2 points at nsvtab
    259                 tst.b   0(a2,d1.W)              * check nsvtab[nn]
    260                 beq     dsnb1                   * jump if natural note
    261 *
    262                 move.b  _ac_code,d1             * setup for an accidental note
    263                 bra     dsnb2                   * ...
    264 *
    265 dsnb1:          move.b  #NATCH_B,d1             * setup for a natural note
    266 *
    267 dsnb2:          move.w  d1,G_CODE(a1)           * gdsp->code = note type
    268                 bra     dsexit                  * done
    269 *
    270                 .page
    271 *
    272 * dsnex -- dispatch to end/begin based on sd
    273 * -----    ---------------------------------
    274 dsnex:          tst.w   P_SD(a7)                * check direction
    275                 bne     dsnb                    * treat as begin if going backward
    276 *
    277 * dsne -- display note end
    278 * ----    ----------------
    279 dsne:           move.b  E_TYPE(a0),d1           * get event type
    280                 move.w  d1,d2                   * save in d2
    281                 andi.w  #$007F,d1               * clear new-note flag
    282                 move.b  d1,E_TYPE(a0)           * store type back in event
    283                 clr.w   d0                      * get group number
    284                 move.b  E_GROUP(a0),d0          * ... in d0
    285                 add.w   d0,d0                   * ... as a word offset
    286                 lea     _grpstat,a1             * check grpstat[grp]
    287                 tst.w   0(a1,d0.W)              * ...
    288                 beq     dsexit                  * done if not enabled
    289 *
    290                 tst.w   P_CF(a6)                * check center slice flag
    291                 beq     dsne3                   * jump if not center slice
    292 *
    293                 btst.l  #7,d2                   * check new-note flag
    294                 beq     dsexit                  * done if not set
    295 *
    296 dsne3:          move.b  E_NOTE(a0),d1           * d1 = note number nn (0..127)
    297                 sub.w   #21,d1                  * subtract base of piano scale
    298                 bmi     dsexit                  * done if not displayable
    299 *
    300                 cmp.w   #87,d1                  * see if it's too high
    301                 bgt     dsexit                  * done if not displayable
    302 *
    303                 movea.l P_SL(a6),a2             * a2 points at gdstb
    304                 clr.w   d2                      * get group in d2
    305                 move.b  E_GROUP(a0),d2          * ...
    306                 lsl.w   #2,d2                   * ... * 4
    307                 move.l  0(a2,d2.W),d0           * check gdstb[ep->group]
     51
     52                .page
     53
     54| parameter offsets
     55| -----------------
     56| for se_disp:
     57| ------------
     58P_EP            =       8               | LONG - event pointer
     59P_SD            =       12              | WORD - scroll direction
     60P_SL            =       14              | LONG - slice control table pointer
     61P_CF            =       18              | WORD - center slice flag
     62
     63| for vputa:
     64| ----------
     65ROW             =       4               | WORD - 'row' parameter offset
     66COL             =       6               | WORD - 'col' parameter offset
     67ATR             =       8               | WORD - 'atr' parameter offset
     68
     69| Character field attributes for highlighting
     70| -------------------------------------------
     71AT01            =       0x0054
     72AT04            =       0x0053
     73AT05            =       0x0054
     74AT06            =       0x0053
     75AT07            =       0x0054
     76AT08            =       0x0053
     77AT09            =       0x0054
     78AT10            =       0x0053
     79AT11            =       0x0052
     80AT12            =       0x0052
     81
     82| Special character equates
     83| -------------------------
     84SP_M1           =       0xA1                    | -1
     85SP_P1           =       0xA0                    | +1
     86
     87                .page
     88
     89| event structure offsets
     90| -----------------------
     91|                     offset             length
     92|                     ------             ------
     93E_TIME          =       0               | LONG
     94E_SIZE          =       4               | BYTE
     95E_TYPE          =       5               | BYTE
     96E_DATA1         =       6               | BYTE
     97E_NOTE          =       6               | BYTE
     98E_DATA2         =       7               | BYTE
     99E_GROUP         =       7               | BYTE
     100E_BAK           =       8               | LONG
     101E_FWD           =       12              | LONG
     102E_DN            =       16              | LONG
     103E_VEL           =       16              | WORD
     104E_DATA4         =       18              | WORD
     105E_UP            =       20              | LONG
     106E_LFT           =       24              | LONG
     107E_RGT           =       28              | LONG
     108
     109N_ETYPES        =       25              | number of event types
     110
     111| gdsel structure definitions
     112| ---------------------------
     113G_NEXT          =       0               | long - 'next' field   (struct gdsel |)
     114G_NOTE          =       4               | word - 'note' field   (short)
     115G_CODE          =       6               | word - 'code' field   (short)
     116
     117NATCH_B         =       3               | uslice note code:  'begin natural'
     118NOTE_E          =       6               | uslice note code:  'end note'
     119
     120NGDSEL          =       17              | number of event slots in gdstb
     121
     122BARFLAG         =       4|(NGDSEL-1)    | offset to the bar marker flag
     123
     124                .page
     125
     126| A few words about se_disp:
     127| --------------------------
     128| se_disp has to be very fast, so it's written in assembly language,
     129| rather than C, which is usually pretty good, but not quite good enough
     130| for this application.  The faster this routine runs, the higher the
     131| tempo we can keep up with.  If this code is fast enough, we end up
     132| hardware limited by the maximum rate of the timer, and the VSDD update rate.
     133
     134_se_disp:       link    a6,#0                   | allocate and link stack frame
     135                movea.l P_EP(a6),a0             | get event pointer 'ep' into a0
     136                move.b  E_TYPE(a0),d1           | get event type into d1.W
     137                andi.w  #0x007F,d1              | mask off new-note flag
     138                cmp.b   #N_ETYPES,d1            | see if it's valid
     139                blt     seds1                   | jump if it is
     140
     141dsexit:         unlk    a6                      | done -- unlink stack frames
     142                rts                             | return to caller
     143
     144seds1:          lea     sddtab,a1               | get base of dispatch table
     145                lsl.w   #2,d1                   | multiplty event by 4 for index
     146                movea.l 0(a1,d1.W),a2           | get address of event routine
     147                jmp     (a2)                    | jump to event display routine
     148
     149| On entry, the individual display routines only depend on a0 pointing at the
     150| event they were dispatched for.  Registers a6 and a7 have their usual meaning,
     151| a6 = frame pointer, a7 = stack pointer.
     152
     153| d0..d2 are used for scratch, as are a0..a2, and are not saved by this code.
     154
     155                .page
     156
     157| dsnbx -- dispatch to begin / end based on sd
     158| -----    -----------------------------------
     159dsnbx:          tst.w   P_SD(a7)                | check direction
     160                bne     dsne                    | treat as end if going backward
     161
     162| dsnb -- display note begin
     163| ----    ------------------
     164dsnb:           move.b  E_TYPE(a0),d1           | get event type
     165                move.w  d1,d2                   | save in d2
     166                andi.w  #0x007F,d1              | clear new-note flag
     167                move.b  d1,E_TYPE(a0)           | store type back in event
     168                clr.w   d0                      | get group number
     169                move.b  E_GROUP(a0),d0          | ... in d0
     170                move.w  d0,d1                   | save group in d1
     171                add.w   d0,d0                   | make d0 a word offset
     172                lea     _grpstat,a1             | check grpstat[grp]
     173                tst.w   0(a1,d0.W)              | ...
     174                beq     dsexit                  | done if not enabled
     175
     176                tst.w   P_CF(a6)                | check center slice flag
     177                beq     dsnb0                   | jump if not center slice
     178
     179                tst.w   _velflag                | see if we display velocity
     180                beq     dsnvx                   | jump if not
     181
     182                move.w  d2,-(a7)                | save new-note flag on stack
     183                move.w  d1,-(a7)                | save group number on stack
     184                move.w  E_VEL(a0),d0            | get velocity
     185                move.w  d1,d2                   | point into lastvel[]
     186                add.w   d2,d2                   | ...
     187                lea     _lastvel,a1             | ...
     188                move.w  d0,0(a1,d2.W)           | update lastvel[group]
     189                ext.l   d0                      | scale
     190                divu    #252,d0                 | ...
     191                cmpi.w  #100,d0                 | convert MS digit
     192                bcs     dsnv0                   | ...
     193
     194                move.b  #'1',numstr             | ...
     195                subi.w  #100,d0                 | ...
     196                bra     dsnv1                   | ...
     197
     198dsnv0:          move.b  #'0',numstr             | ...
     199
     200dsnv1:          ext.l   d0                      | convert middle & LS digits
     201                divu    #10,d0                  | ...
     202                addi.l  #0x00300030,d0          | ...
     203                move.b  d0,numstr+1             | ...
     204                swap    d0                      | ...
     205                move.b  d0,numstr+2             | ...
     206                clr.b   numstr+3                | terminate string
     207                move.w  d1,d0                   | col = group
     208                asl.w   #2,d0                   | ... | 5
     209                add.w   d1,d0                   | ...
     210                add.w   #6,d0                   | ... + 6
     211                move.l  a0,-(a7)                | save event pointer on stack
     212                move.w  #AT11,-(a7)             | put attribute on stack
     213                move.l  #numstr,-(a7)           | put string address on stack
     214                move.w  d0,-(a7)                | put column on stack
     215                move.w  #5,-(a7)                | put row on stack
     216                move.l  _obj8,-(a7)             | put VSDD address on stack
     217                jsr     _vputs                  | update the screen
     218                add.l   #14,a7                  | clean up stack
     219                movea.l (a7)+,a0                | restore event pointer
     220
     221                .page
     222
     223                move.w  (a7)+,d0                | get group from stack
     224                cmpi.w  #12,d0                  | see which byte it's in
     225                bcc     dsnv2                   | jump if in MS byte
     226
     227                bset    d0,_vrbw12+1            | set group bit in LS byte
     228                bra     dsnv3                   | ...
     229
     230dsnv2:          bset    d0,_vrbw12              | set group bit in MS byte
     231
     232dsnv3:          bset    #4,_vrcw                | set video reset type bit
     233                move.w  (a7)+,d2                | get new-note flag from stack
     234
     235dsnvx:          btst.l  #7,d2                   | check new-note flag
     236                beq     dsexit                  | done if not set
     237
     238dsnb0:          clr.w   d1                      | get note number nn (0..127)
     239                move.b  E_NOTE(a0),d1           | ... in d1
     240                sub.w   #21,d1                  | subtract base of piano scale
     241                bmi     dsexit                  | done if not displayable
     242
     243                cmp.w   #87,d1                  | see if it's too high
     244                bgt     dsexit                  | done if not displayable
     245
     246                move.l  _gdfsep,d0              | quit if no elements left
     247                beq     dsexit                  | ...
     248
     249                movea.l d0,a1                   | a1 = gdsp
     250                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     251                clr.w   d2                      | d2 = ep->group
     252                move.b  E_GROUP(a0),d2          | ...
     253                lsl.w   #2,d2                   | ... | 4
     254                movea.l P_SL(a6),a2             | a2 points at gdstb
     255                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[ep->group]
     256                move.l  a1,0(a2,d2.W)           | gdstb[ep->group] = gdsp
     257                move.w  d1,G_NOTE(a1)           | gdsp->note = nn
     258                lea     _nsvtab,a2              | a2 points at nsvtab
     259                tst.b   0(a2,d1.W)              | check nsvtab[nn]
     260                beq     dsnb1                   | jump if natural note
     261
     262                move.b  _ac_code,d1             | setup for an accidental note
     263                bra     dsnb2                   | ...
     264
     265dsnb1:          move.b  #NATCH_B,d1             | setup for a natural note
     266
     267dsnb2:          move.w  d1,G_CODE(a1)           | gdsp->code = note type
     268                bra     dsexit                  | done
     269
     270                .page
     271
     272| dsnex -- dispatch to end/begin based on sd
     273| -----    ---------------------------------
     274dsnex:          tst.w   P_SD(a7)                | check direction
     275                bne     dsnb                    | treat as begin if going backward
     276
     277| dsne -- display note end
     278| ----    ----------------
     279dsne:           move.b  E_TYPE(a0),d1           | get event type
     280                move.w  d1,d2                   | save in d2
     281                andi.w  #0x007F,d1              | clear new-note flag
     282                move.b  d1,E_TYPE(a0)           | store type back in event
     283                clr.w   d0                      | get group number
     284                move.b  E_GROUP(a0),d0          | ... in d0
     285                add.w   d0,d0                   | ... as a word offset
     286                lea     _grpstat,a1             | check grpstat[grp]
     287                tst.w   0(a1,d0.W)              | ...
     288                beq     dsexit                  | done if not enabled
     289
     290                tst.w   P_CF(a6)                | check center slice flag
     291                beq     dsne3                   | jump if not center slice
     292
     293                btst.l  #7,d2                   | check new-note flag
     294                beq     dsexit                  | done if not set
     295
     296dsne3:          move.b  E_NOTE(a0),d1           | d1 = note number nn (0..127)
     297                sub.w   #21,d1                  | subtract base of piano scale
     298                bmi     dsexit                  | done if not displayable
     299
     300                cmp.w   #87,d1                  | see if it's too high
     301                bgt     dsexit                  | done if not displayable
     302
     303                movea.l P_SL(a6),a2             | a2 points at gdstb
     304                clr.w   d2                      | get group in d2
     305                move.b  E_GROUP(a0),d2          | ...
     306                lsl.w   #2,d2                   | ... | 4
     307                move.l  0(a2,d2.W),d0           | check gdstb[ep->group]
    308308                beq     dsexit
    309 *
    310 dsne0:          movea.l d0,a1                   * a1 = gdsp
    311 *
    312 dsne1:          cmp.w   G_NOTE(a1),d1           * compare nn to gdsp->note
    313                 bne     dsne2                   * jump if not the one we want
    314 *
    315                 move.w  #NOTE_E,G_CODE(a1)      * gdsp->code = NOTE_E  (end note)
    316 *
    317 dsne2:          move.l  G_NEXT(a1),d0           * get gdsp->next
    318                 beq     dsexit                  * done if next = NULL
    319 *
    320                 bra     dsne0                   * loop for next one
    321 *
    322                 .page
    323 *
    324 * dssbgn -- display section begin
    325 * ------    ---------------------
    326 dssbgn:         tst.w   P_CF(a6)                * center update ?
    327                 beq     dsbgn0                  * jump if not
    328 *
    329                 clr.w   d1                      * get section number
    330                 move.b  E_DATA1(a0),d1          * ... from the event
    331                 addq.w  #1,d1                   * ... adjusted for display
    332                 ext.l   d1                      * ... as a long in d1
    333                 divu    #10,d1                  * divide by 10 for conversion
    334                 add.l   #$00300030,d1           * add '0' for ASCII conversion
    335                 move.b  d1,numstr               * put MS byte in work area
    336                 swap    d1                      * swap register halves
    337                 move.b  d1,numstr+1             * put LS byte in work area
    338                 clr.b   numstr+2                * terminate string
    339                 move.w  #AT01,-(a7)             * put attribute on stack
    340                 move.l  #numstr,-(a7)           * put buffer address on stack
    341                 move.w  #6,-(a7)                * put column on stack
    342                 move.w  #0,-(a7)                * put row on stack
    343                 move.l  _obj8,-(a7)             * put sbase on stack
    344                 jsr     _vputs                  * update the screen
    345                 add.l   #14,a7                  * clean up stack
    346                 bset    #4,_vrcw+1              * set video reset type bit
    347                 tst.w   _ctrsw                  * update center for scupd ?
    348                 beq     dsexit                  * done if not
    349 *
    350 dsbgn0:         move.l  _gdfsep,d0              * quit if no elements left
    351                 beq     dsexit                  * ...
    352 *
    353                 movea.l d0,a1                   * a1 = gdsp
    354                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    355                 move.w  #48,d2                  * d2 = event PRIORITY * 4
    356                 movea.l P_SL(a6),a2             * a2 points at gdstb
    357                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[pri]
    358                 move.w  #$1111,G_NOTE(a1)       * gdsp->note = COLOR
    359                 move.w  #0,G_CODE(a1)           * gdsp->code = PATTERN
    360                 move.l  a1,0(a2,d2.W)           * gdstb[pri] = gdsp
    361                 bra     dsexit                  * done
    362 *
    363                 .page
    364 *
    365 * dssend -- display section end
    366 * ------    -------------------
    367 dssend:         tst.w   P_CF(a6)                * center update ?
    368                 beq     dssend0                 * jump if not
    369 *
    370                 tst.w   _ctrsw                  * update center for scupd ?
    371                 beq     dsexit                  * done if not
    372 *
    373 dssend0:        move.l  _gdfsep,d0              * quit if no elements left
    374                 beq     dsexit                  * ...
    375 *
    376                 movea.l d0,a1                   * a1 = gdsp
    377                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    378                 move.w  #48,d2                  * d2 = event PRIORITY * 4
    379                 movea.l P_SL(a6),a2             * a2 points at gdstb
    380                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[pri]
    381                 move.w  #$1111,G_NOTE(a1)       * gdsp->note = COLOR
    382                 move.w  #2,G_CODE(a1)           * gdsp->code = PATTERN
    383                 move.l  a1,0(a2,d2.W)           * gdstb[pri] = gdsp
    384                 bra     dsexit                  * done
    385 *
    386 * dsbeat -- display beat
    387 * ------    ------------
    388 dsbeat:         tst.w   P_CF(a6)                * center update ?
    389                 bne     dsexit                  * done if so
    390 *
    391                 move.l  _gdfsep,d0              * quit if no elements left
    392                 beq     dsexit                  * ...
    393 *
    394                 movea.l d0,a1                   * a1 = gdsp
    395                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    396                 move.w  #48,d2                  * d2 = event PRIORITY * 4
    397                 movea.l P_SL(a6),a2             * a2 points at gdstb
    398                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[pri]
    399                 move.w  #$1111,G_NOTE(a1)       * gdsp->note = COLOR
    400                 move.w  #1,G_CODE(a1)           * gdsp->code = PATTERN
    401                 move.l  a1,0(a2,d2.W)           * gdstb[pri] = gdsp
    402                 bra     dsexit                  * done
    403 *
    404                 .page
    405 *
    406 * dstune -- display tuning
    407 * ------    --------------
    408 dstune:         tst.w   P_CF(a6)                * center update ?
    409                 beq     dstune0                 * jump if not
    410 *
    411                 clr.w   d1                      * get current tuning
    412                 move.b  E_DATA1(a0),d1          * ...
    413                 add.w   #$0030,d1               * add '0' for ASCII conversion
    414                 move.w  #AT05,-(a7)             * put attribute on stack
    415                 move.w  d1,-(a7)                * put character on stack
    416                 move.w  #19,-(a7)               * put column on stack
    417                 move.w  #1,-(a7)                * put row on stack
    418                 move.l  _obj8,-(a7)             * put sbase on stack
    419                 jsr     _vputc                  * display character
    420                 add.l   #12,a7                  * clean up stack
    421                 bset    #1,_vrcw+1              * set video reset type bit
    422                 tst.w   _ctrsw                  * update center for scupd ?
    423                 beq     dsexit                  * done if not
    424 *
    425 dstune0:        move.l  _gdfsep,d0              * quit if no elements left
    426                 beq     dsexit                  * ...
    427 *
    428                 movea.l d0,a1                   * a1 = gdsp
    429                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    430                 move.w  #52,d2                  * d2 = event PRIORITY * 4
    431                 movea.l P_SL(a6),a2             * a2 points at gdstb
    432                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[pri]
    433                 move.w  #$CCCC,G_NOTE(a1)       * gdsp->note = COLOR
    434                 move.w  #3,G_CODE(a1)           * gdsp->code = PATTERN
    435                 move.l  a1,0(a2,d2.W)           * gdstb[priority] = gdsp
    436                 bra     dsexit                  * done
    437 *
    438                 .page
    439 *
    440 * dstrns -- display transposition
    441 * ------    ---------------------
    442 dstrns:         clr.w   d0                      * get group number
    443                 move.b  E_DATA1(a0),d0          * ... in d0
    444                 add.w   d0,d0                   * ... as a word offset
    445                 lea     _grpstat,a1             * check grpstat[grp]
    446                 tst.w   0(a1,d0.W)              * ...
    447                 beq     dsexit                  * done if not enabled
    448 *
    449                 tst.w   P_CF(a6)                * center update
    450                 beq     dstrns0                 * jump if not
    451 *
    452                 move.w  E_LFT(a0),d1            * get transposition value
    453                 bpl     dstrns1                 * jump if positive
    454 *
    455                 move.b  #'-',numstr             * note negative sign
    456                 neg.w   d1                      * make number positive
    457                 bra     dstrns2                 * ...
    458 *
    459 dstrns1:        move.b  #'+',numstr             * note positive sign
    460 *
    461 dstrns2:        cmpi.w  #1000,d1                * is number GE 1000 ?
    462                 bcs     dstrns3                 * jump if not
    463 *
    464                 subi.w  #1000,d1                * adjust number
    465                 cmpi.b  #'-',numstr             * was number negative
    466                 bne     dstrns4                 * jump if not
    467 *
    468                 move.b  #SP_M1,numstr           * set -1 in numstr
    469                 bra     dstrns3                 * ...
    470 *
    471 dstrns4:        move.b  #SP_P1,numstr           * set +1 in numstr
    472 *
    473 dstrns3:        ext.l   d1                      * make d1 a long
    474                 divu    #100,d1                 * convert 1st digit
    475                 addi.w  #$0030,d1               * ... to ASCII
    476                 move.b  d1,numstr+1             * ... in numstr
    477                 swap    d1                      * convert 2nd digit
    478                 ext.l   d1                      * ...
    479                 divu    #10,d1                  * ...
    480                 addi.w  #$0030,d1               * ... to ASCII
    481                 move.b  d1,numstr+2             * ... in numstr
    482                 swap    d1                      * convert 3rd digit
    483                 addi.w  #$0030,d1               * ... to ASCII
    484                 move.b  d1,numstr+3             * ... in numstr
    485                 clr.b   numstr+4                * terminate numstr
    486 *
    487                 .page
    488 *
    489                 move.w  d0,d1                   * get group number
    490                 asr.w   #1,d1                   * ... in d1
    491                 move.w  d1,-(a7)                * save group number on stack
    492                 add.w   d0,d0                   * calculate column
    493                 add.w   d0,d1                   * ... = 5 * group
    494                 addi.w  #5,d1                   * ... + 5
    495                 move.w  #AT11,-(a7)             * vputs(obj8, 3, col, numstr, atr11)
    496                 move.l  #numstr,-(a7)           * ...
    497                 move.w  d1,-(a7)                * ...
    498                 move.w  #3,-(a7)                * ...
    499                 move.l  _obj8,-(a7)             * ...
    500                 jsr     _vputs                  * ...
    501                 add.l   #14,a7                  * ...
    502                 move.w  (a7)+,d0                * get group number
    503                 cmpi.w  #8,d0                   * see which byte it's in
    504                 bcc     dstrns5                 * jump if in MS byte
    505 *
    506                 bset    d0,_vrbw09+1            * set group bit in LS byte
    507                 bra     dstrns6                 * ...
    508 *
    509 dstrns5:        sub.w   #8,d0                   * adjust for byte
    510                 bset    d0,_vrbw09              * set group bit in MS byte
    511 *
    512 dstrns6:        bset    #1,_vrcw                * set video reset type bit
    513                 tst.w   _ctrsw                  * update center for scupd ?
    514                 beq     dsexit                  * done if not
    515 *
    516 dstrns0:        move.l  _gdfsep,d0              * quit if no elements left
    517                 beq     dsexit                  * ...
    518 *
    519                 movea.l d0,a1                   * a1 = gdsp
    520                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    521                 move.w  #52,d2                  * d2 = event PRIORITY * 4
    522                 movea.l P_SL(a6),a2             * a2 points at gdstb
    523                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[pri]
    524                 move.w  #$9999,G_NOTE(a1)       * gdsp->note = COLOR
    525                 move.w  #4,G_CODE(a1)           * gdsp->code = PATTERN
    526                 move.l  a1,0(a2,d2.W)           * gdstb[pri] = gdsp
    527                 bra     dsexit                  * done
    528 *
    529                 .page
    530 *
    531 * dsdyn -- display dynamics
    532 * -----    ----------------
    533 dsdyn:          clr.w   d0                      * get group number
    534                 move.b  E_DATA1(a0),d0          * ... in d0
    535                 add.w   d0,d0                   * ... as a word offset
    536                 lea     _grpstat,a1             * check grpstat[grp]
    537                 tst.w   0(a1,d0.W)              * ...
    538                 beq     dsexit                  * done if not enabled
    539 *
    540                 tst.w   P_CF(a6)                * center update ?
    541                 beq     dsdyn00                 * jump if not
    542 *
    543                 clr.w   d0                      * get dynamics
    544                 move.b  E_DATA2(a0),d0          * ... in d0
    545                 move.w  d0,-(a7)                * save dyanmics
    546                 clr.w   d1                      * get group number
    547                 move.b  E_DATA1(a0),d1          * ... in d1
    548                 move.w  d1,-(a7)                * save group number
    549                 move.w  (a7),d0                 * col = group number
    550                 add.w   d0,d0                   * ... * 5
    551                 add.w   d0,d0                   * ...
    552                 move.w  (a7)+,d2                * ...  (d2 = group number)
    553                 add.w   d2,d0                   * ...
    554                 add.w   #6,d0                   * ... + 6
    555                 move.w  (a7)+,d1                * get dynamics
    556                 add.w   #$0030,d1               * add '0' for ASCII conversion
    557                 move.w  d2,-(a7)                * save group number
    558                 move.w  #AT11,-(a7)             * put attribute on stack
    559                 move.w  d1,-(a7)                * put digit on stack
    560                 move.w  d0,-(a7)                * put column on stack
    561                 move.w  #4,-(a7)                * put row on stack
    562                 move.l  _obj8,-(a7)             * put object address on stack
    563                 jsr     _vputc                  * update the screen
    564                 add.l   #12,a7                  * clean up stack
    565                 move.w  (a7)+,d0                * get group number
    566                 cmp.w   #8,d0                   * see which word it's in
    567                 bcc     dsdyn1                  * jump if in MS word
    568 *
    569                 bset    d0,_vrbw10+1            * set group bit in LS byte
    570                 bra     dsdyn2                  * ...
    571 *
    572 dsdyn1:         sub.w   #8,d0                   * adjust for for byte
    573                 bset    d0,_vrbw10              * set group bit in MS byte
    574 *
    575 dsdyn2:         bset    #2,_vrcw                * set video reset type bit
    576                 tst.w   _ctrsw                  * update center for scupd ?
    577                 beq     dsexit                  * done if not
    578 *
    579                 .page
    580 dsdyn00:        move.l  _gdfsep,d0              * quit if no elements left
    581                 beq     dsexit                  * ...
    582 *
    583                 movea.l d0,a1                   * a1 = gdsp
    584                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    585                 move.w  #52,d2                  * d2 = event PRIORITY * 4
    586                 movea.l P_SL(a6),a2             * a2 points at gdstb
    587                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[pri]
    588                 move.w  #$9999,G_NOTE(a1)       * gdsp->note = COLOR
    589                 move.w  #5,G_CODE(a1)           * gdsp->code = PATTERN
    590                 move.l  a1,0(a2,d2.W)           * gdstb[pri] = gdsp
    591                 bra     dsexit                  * done
    592 *
    593                 .page
    594 *
    595 * dslocn -- display location
    596 * ------    ----------------
    597 dslocn:         clr.w   d0                      * get group number
    598                 move.b  E_DATA1(a0),d0          * ... in d0
    599                 add.w   d0,d0                   * ... as a word offset
    600                 lea     _grpstat,a1             * check grpstat[grp]
    601                 tst.w   0(a1,d0.W)              * ...
    602                 beq     dsexit                  * done if not enabled
    603 *
    604                 tst.w   P_CF(a6)                * center update ?
    605                 beq     dsloc00                 * jump if not
    606 *
    607                 clr.w   d0                      * get location
    608                 move.b  E_DATA2(a0),d0          * ... in d0
    609                 move.w  d0,-(a7)                * save location
    610                 clr.w   d1                      * get group number
    611                 move.b  E_DATA1(a0),d1          * ... in d1
    612                 move.w  d1,-(a7)                * save group number
    613                 move.w  (a7),d0                 * col = group number
    614                 add.w   d0,d0                   * ... * 5
    615                 add.w   d0,d0                   * ...
    616                 move.w  (a7)+,d2                * ...  (d2 = group number)
    617                 add.w   d2,d0                   * ...
    618                 add.w   #8,d0                   * ... + 8
    619                 move.w  (a7)+,d1                * get location
    620                 add.w   #$0031,d1               * add '0' for ASCII conversion
    621                 move.w  d2,-(a7)                * save group number
    622                 move.w  #AT11,-(a7)             * put attribute on stack
    623                 move.w  d1,-(a7)                * put character on stack
    624                 move.w  d0,-(a7)                * put column on stack
    625                 move.w  #4,-(a7)                * put row on stack
    626                 move.l  _obj8,-(a7)             * put object address on stack
    627                 jsr     _vputc                  * update the screen
    628                 add.l   #12,a7                  * clean up stack
    629                 move.w  (a7)+,d0                * get group number
    630                 cmp.w   #8,d0                   * see which word it's in
    631                 bcc     dslocn1                 * jump if in MS word
    632 *
    633                 bset    d0,_vrbw11+1            * set group bit in LS byte
    634                 bra     dslocn2                 * ...
    635 *
    636 dslocn1:        sub.w   #8,d0                   * adjust for for byte
    637                 bset    d0,_vrbw11              * set group bit in MS byte
    638 *
    639 dslocn2:        bset    #3,_vrcw                * set video reset type bit
    640                 tst.w   _ctrsw                  * update center for scupd ?
    641                 beq     dsexit                  * done if not
    642 *
    643                 .page
    644 dsloc00:        move.l  _gdfsep,d0              * quit if no elements left
    645                 beq     dsexit                  * ...
    646 *
    647                 movea.l d0,a1                   * a1 = gdsp
    648                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    649                 move.w  #52,d2                  * d2 = event PRIORITY * 4
    650                 movea.l P_SL(a6),a2             * a2 points at gdstb
    651                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[pri]
    652                 move.w  #$9999,G_NOTE(a1)       * gdsp->note = COLOR
    653                 move.w  #5,G_CODE(a1)           * gdsp->code = PATTERN
    654                 move.l  a1,0(a2,d2.W)           * gdstb[pri] = gdsp
    655                 bra     dsexit                  * done
    656 *
    657                 .page
    658 *
    659 * dsanrs -- display analog resolution
    660 * ------    -------------------------
    661 dsanrs:         move.b  E_DATA1(a0),d1          * get var / group
    662                 move.w  d1,d0                   * extract group number
    663                 andi.w  #$000F,d0               * ... in d0
    664                 add.w   d0,d0                   * ... as a word offset
    665                 lea     _grpstat,a1             * check grpstat[grp]
    666                 tst.w   0(a1,d0.W)              * ...
    667                 beq     dsexit                  * done if not enabled
    668 *
    669                 tst.w   P_CF(a6)                * center update ?
    670                 beq     dsanrs0                 * jump if not
    671 *
    672                 move.w  _angroup,d2             * see if we display
    673                 bmi     dsexit                  * jump if not
    674 *
    675                 subq.w  #1,d2                   * adust selected group number
    676                 move.w  d1,d0                   * extract group from event
    677                 andi.w  #$000F,d0               * ...
    678                 cmp.w   d0,d2                   * see if we display
    679                 bne     dsexit                  * jump if not
    680 *
    681                 lsr.w   #4,d1                   * extract variable number
    682                 andi.w  #$000F,d1               * ...
    683                 move.w  d1,-(a7)                * save variable number
    684                 move.w  d1,d0                   * calculate display offset
    685                 lsl.w   #3,d0                   * ... (var * 9) + 6
    686                 add.w   d0,d1                   * ... in d1
    687                 addq.w  #6,d1                   * ...
    688                 move.b  E_DATA2(a0),d0          * get resolution
    689                 addi.w  #$0030,d0               * convert for display
    690                 move.w  #AT12,-(a7)             * put attribute on stack
    691                 move.w  d0,-(a7)                * put character on stack
    692                 move.w  d1,-(a7)                * put column on stack
    693                 move.w  #7,-(a7)                * put row on stack
    694                 move.l  _obj8,-(a7)             * put sbase on stack
    695                 jsr     _vputc                  * update the screen
    696                 add.l   #12,a7                  * clean up stack
    697                 move.w  (a7)+,d0                * get variable number
    698                 bset    d0,_vrbw13+1            * set variable bit
    699                 bset    #5,_vrcw                * set video reset type bit
    700                 tst.w   _ctrsw                  * update center for scupd ?
    701                 beq     dsexit                  * done if not
    702 *
    703                 .page
    704 dsanrs0:        move.l  _gdfsep,d0              * quit if no elements left
    705                 beq     dsexit                  * ...
    706 *
    707                 movea.l d0,a1                   * a1 = gdsp
    708                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    709                 move.w  #52,d2                  * d2 = event PRIORITY * 4
    710                 movea.l P_SL(a6),a2             * a2 points at gdstb
    711                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[pri]
    712                 move.w  #$9999,G_NOTE(a1)       * gdsp->note = COLOR
    713                 move.w  #6,G_CODE(a1)           * gdsp->code = PATTERN
    714                 move.l  a1,0(a2,d2.W)           * gdstb[pri] = gdsp
    715                 bra     dsexit                  * done
    716 *
    717                 .page
    718 *
    719 * dsanvl -- display analog value
    720 * ------    --------------------
    721 dsanvl:         move.w  _angroup,d2             * see if we display
    722                 bmi     dsexit                  * jump if not
    723 *
    724                 move.b  E_DATA1(a0),d1          * get var / group
    725                 move.w  d1,d0                   * extract group number
    726                 andi.w  #$000F,d0               * ... in d0
    727                 add.w   d0,d0                   * ... as a word offset
    728                 lea     _grpstat,a1             * check grpstat[grp]
    729                 tst.w   0(a1,d0.W)              * ...
    730                 beq     dsexit                  * done if not enabled
    731 *
    732                 tst.w   P_CF(a6)                * center update ?
    733                 beq     dsanvl0                 * jump if not
    734 *
    735                 subq.w  #1,d2                   * adust group number
    736                 move.w  d1,d0                   * extract group
    737                 andi.w  #$000F,d0               * ...
    738                 cmp.w   d0,d2                   * see if we display
    739                 bne     dsexit                  * jump if not
    740 *
    741                 lsr.w   #4,d1                   * extract variable number
    742                 andi.w  #$000F,d1               * ...
    743                 move.w  d1,-(a7)                * save variable number
    744                 move.w  d1,d0                   * calculate display offset
    745                 lsl.w   #3,d0                   * ... (var * 9) + 8
    746                 add.w   d0,d1                   * ... in d1
    747                 addi.w  #8,d1                   * ...
    748                 move.w  E_DN(a0),d0             * get value
    749                 asr.w   #5,d0                   * adjust to low 11 bits
    750                 bpl     dsanvl1                 * jump if positive
    751 *
    752                 move.b  #'-',numstr             * set sign = '-'
    753                 neg.w   d0                      * make value positive
     309
     310dsne0:          movea.l d0,a1                   | a1 = gdsp
     311
     312dsne1:          cmp.w   G_NOTE(a1),d1           | compare nn to gdsp->note
     313                bne     dsne2                   | jump if not the one we want
     314
     315                move.w  #NOTE_E,G_CODE(a1)      | gdsp->code = NOTE_E  (end note)
     316
     317dsne2:          move.l  G_NEXT(a1),d0           | get gdsp->next
     318                beq     dsexit                  | done if next = NULL
     319
     320                bra     dsne0                   | loop for next one
     321
     322                .page
     323
     324| dssbgn -- display section begin
     325| ------    ---------------------
     326dssbgn:         tst.w   P_CF(a6)                | center update ?
     327                beq     dsbgn0                  | jump if not
     328
     329                clr.w   d1                      | get section number
     330                move.b  E_DATA1(a0),d1          | ... from the event
     331                addq.w  #1,d1                   | ... adjusted for display
     332                ext.l   d1                      | ... as a long in d1
     333                divu    #10,d1                  | divide by 10 for conversion
     334                add.l   #0x00300030,d1          | add '0' for ASCII conversion
     335                move.b  d1,numstr               | put MS byte in work area
     336                swap    d1                      | swap register halves
     337                move.b  d1,numstr+1             | put LS byte in work area
     338                clr.b   numstr+2                | terminate string
     339                move.w  #AT01,-(a7)             | put attribute on stack
     340                move.l  #numstr,-(a7)           | put buffer address on stack
     341                move.w  #6,-(a7)                | put column on stack
     342                move.w  #0,-(a7)                | put row on stack
     343                move.l  _obj8,-(a7)             | put sbase on stack
     344                jsr     _vputs                  | update the screen
     345                add.l   #14,a7                  | clean up stack
     346                bset    #4,_vrcw+1              | set video reset type bit
     347                tst.w   _ctrsw                  | update center for scupd ?
     348                beq     dsexit                  | done if not
     349
     350dsbgn0:         move.l  _gdfsep,d0              | quit if no elements left
     351                beq     dsexit                  | ...
     352
     353                movea.l d0,a1                   | a1 = gdsp
     354                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     355                move.w  #48,d2                  | d2 = event PRIORITY | 4
     356                movea.l P_SL(a6),a2             | a2 points at gdstb
     357                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[pri]
     358                move.w  #0x1111,G_NOTE(a1)      | gdsp->note = COLOR
     359                move.w  #0,G_CODE(a1)           | gdsp->code = PATTERN
     360                move.l  a1,0(a2,d2.W)           | gdstb[pri] = gdsp
     361                bra     dsexit                  | done
     362
     363                .page
     364
     365| dssend -- display section end
     366| ------    -------------------
     367dssend:         tst.w   P_CF(a6)                | center update ?
     368                beq     dssend0                 | jump if not
     369
     370                tst.w   _ctrsw                  | update center for scupd ?
     371                beq     dsexit                  | done if not
     372
     373dssend0:        move.l  _gdfsep,d0              | quit if no elements left
     374                beq     dsexit                  | ...
     375
     376                movea.l d0,a1                   | a1 = gdsp
     377                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     378                move.w  #48,d2                  | d2 = event PRIORITY | 4
     379                movea.l P_SL(a6),a2             | a2 points at gdstb
     380                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[pri]
     381                move.w  #0x1111,G_NOTE(a1)      | gdsp->note = COLOR
     382                move.w  #2,G_CODE(a1)           | gdsp->code = PATTERN
     383                move.l  a1,0(a2,d2.W)           | gdstb[pri] = gdsp
     384                bra     dsexit                  | done
     385
     386| dsbeat -- display beat
     387| ------    ------------
     388dsbeat:         tst.w   P_CF(a6)                | center update ?
     389                bne     dsexit                  | done if so
     390
     391                move.l  _gdfsep,d0              | quit if no elements left
     392                beq     dsexit                  | ...
     393
     394                movea.l d0,a1                   | a1 = gdsp
     395                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     396                move.w  #48,d2                  | d2 = event PRIORITY | 4
     397                movea.l P_SL(a6),a2             | a2 points at gdstb
     398                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[pri]
     399                move.w  #0x1111,G_NOTE(a1)      | gdsp->note = COLOR
     400                move.w  #1,G_CODE(a1)           | gdsp->code = PATTERN
     401                move.l  a1,0(a2,d2.W)           | gdstb[pri] = gdsp
     402                bra     dsexit                  | done
     403
     404                .page
     405
     406| dstune -- display tuning
     407| ------    --------------
     408dstune:         tst.w   P_CF(a6)                | center update ?
     409                beq     dstune0                 | jump if not
     410
     411                clr.w   d1                      | get current tuning
     412                move.b  E_DATA1(a0),d1          | ...
     413                add.w   #0x0030,d1              | add '0' for ASCII conversion
     414                move.w  #AT05,-(a7)             | put attribute on stack
     415                move.w  d1,-(a7)                | put character on stack
     416                move.w  #19,-(a7)               | put column on stack
     417                move.w  #1,-(a7)                | put row on stack
     418                move.l  _obj8,-(a7)             | put sbase on stack
     419                jsr     _vputc                  | display character
     420                add.l   #12,a7                  | clean up stack
     421                bset    #1,_vrcw+1              | set video reset type bit
     422                tst.w   _ctrsw                  | update center for scupd ?
     423                beq     dsexit                  | done if not
     424
     425dstune0:        move.l  _gdfsep,d0              | quit if no elements left
     426                beq     dsexit                  | ...
     427
     428                movea.l d0,a1                   | a1 = gdsp
     429                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     430                move.w  #52,d2                  | d2 = event PRIORITY | 4
     431                movea.l P_SL(a6),a2             | a2 points at gdstb
     432                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[pri]
     433                move.w  #0xCCCC,G_NOTE(a1)      | gdsp->note = COLOR
     434                move.w  #3,G_CODE(a1)           | gdsp->code = PATTERN
     435                move.l  a1,0(a2,d2.W)           | gdstb[priority] = gdsp
     436                bra     dsexit                  | done
     437
     438                .page
     439
     440| dstrns -- display transposition
     441| ------    ---------------------
     442dstrns:         clr.w   d0                      | get group number
     443                move.b  E_DATA1(a0),d0          | ... in d0
     444                add.w   d0,d0                   | ... as a word offset
     445                lea     _grpstat,a1             | check grpstat[grp]
     446                tst.w   0(a1,d0.W)              | ...
     447                beq     dsexit                  | done if not enabled
     448
     449                tst.w   P_CF(a6)                | center update
     450                beq     dstrns0                 | jump if not
     451
     452                move.w  E_LFT(a0),d1            | get transposition value
     453                bpl     dstrns1                 | jump if positive
     454
     455                move.b  #'-',numstr             | note negative sign
     456                neg.w   d1                      | make number positive
     457                bra     dstrns2                 | ...
     458
     459dstrns1:        move.b  #'+',numstr             | note positive sign
     460
     461dstrns2:        cmpi.w  #1000,d1                | is number GE 1000 ?
     462                bcs     dstrns3                 | jump if not
     463
     464                subi.w  #1000,d1                | adjust number
     465                cmpi.b  #'-',numstr             | was number negative
     466                bne     dstrns4                 | jump if not
     467
     468                move.b  #SP_M1,numstr           | set -1 in numstr
     469                bra     dstrns3                 | ...
     470
     471dstrns4:        move.b  #SP_P1,numstr           | set +1 in numstr
     472
     473dstrns3:        ext.l   d1                      | make d1 a long
     474                divu    #100,d1                 | convert 1st digit
     475                addi.w  #0x0030,d1              | ... to ASCII
     476                move.b  d1,numstr+1             | ... in numstr
     477                swap    d1                      | convert 2nd digit
     478                ext.l   d1                      | ...
     479                divu    #10,d1                  | ...
     480                addi.w  #0x0030,d1              | ... to ASCII
     481                move.b  d1,numstr+2             | ... in numstr
     482                swap    d1                      | convert 3rd digit
     483                addi.w  #0x0030,d1              | ... to ASCII
     484                move.b  d1,numstr+3             | ... in numstr
     485                clr.b   numstr+4                | terminate numstr
     486
     487                .page
     488
     489                move.w  d0,d1                   | get group number
     490                asr.w   #1,d1                   | ... in d1
     491                move.w  d1,-(a7)                | save group number on stack
     492                add.w   d0,d0                   | calculate column
     493                add.w   d0,d1                   | ... = 5 | group
     494                addi.w  #5,d1                   | ... + 5
     495                move.w  #AT11,-(a7)             | vputs(obj8, 3, col, numstr, atr11)
     496                move.l  #numstr,-(a7)           | ...
     497                move.w  d1,-(a7)                | ...
     498                move.w  #3,-(a7)                | ...
     499                move.l  _obj8,-(a7)             | ...
     500                jsr     _vputs                  | ...
     501                add.l   #14,a7                  | ...
     502                move.w  (a7)+,d0                | get group number
     503                cmpi.w  #8,d0                   | see which byte it's in
     504                bcc     dstrns5                 | jump if in MS byte
     505
     506                bset    d0,_vrbw09+1            | set group bit in LS byte
     507                bra     dstrns6                 | ...
     508
     509dstrns5:        sub.w   #8,d0                   | adjust for byte
     510                bset    d0,_vrbw09              | set group bit in MS byte
     511
     512dstrns6:        bset    #1,_vrcw                | set video reset type bit
     513                tst.w   _ctrsw                  | update center for scupd ?
     514                beq     dsexit                  | done if not
     515
     516dstrns0:        move.l  _gdfsep,d0              | quit if no elements left
     517                beq     dsexit                  | ...
     518
     519                movea.l d0,a1                   | a1 = gdsp
     520                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     521                move.w  #52,d2                  | d2 = event PRIORITY | 4
     522                movea.l P_SL(a6),a2             | a2 points at gdstb
     523                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[pri]
     524                move.w  #0x9999,G_NOTE(a1)      | gdsp->note = COLOR
     525                move.w  #4,G_CODE(a1)           | gdsp->code = PATTERN
     526                move.l  a1,0(a2,d2.W)           | gdstb[pri] = gdsp
     527                bra     dsexit                  | done
     528
     529                .page
     530
     531| dsdyn -- display dynamics
     532| -----    ----------------
     533dsdyn:          clr.w   d0                      | get group number
     534                move.b  E_DATA1(a0),d0          | ... in d0
     535                add.w   d0,d0                   | ... as a word offset
     536                lea     _grpstat,a1             | check grpstat[grp]
     537                tst.w   0(a1,d0.W)              | ...
     538                beq     dsexit                  | done if not enabled
     539
     540                tst.w   P_CF(a6)                | center update ?
     541                beq     dsdyn00                 | jump if not
     542
     543                clr.w   d0                      | get dynamics
     544                move.b  E_DATA2(a0),d0          | ... in d0
     545                move.w  d0,-(a7)                | save dyanmics
     546                clr.w   d1                      | get group number
     547                move.b  E_DATA1(a0),d1          | ... in d1
     548                move.w  d1,-(a7)                | save group number
     549                move.w  (a7),d0                 | col = group number
     550                add.w   d0,d0                   | ... | 5
     551                add.w   d0,d0                   | ...
     552                move.w  (a7)+,d2                | ...  (d2 = group number)
     553                add.w   d2,d0                   | ...
     554                add.w   #6,d0                   | ... + 6
     555                move.w  (a7)+,d1                | get dynamics
     556                add.w   #0x0030,d1              | add '0' for ASCII conversion
     557                move.w  d2,-(a7)                | save group number
     558                move.w  #AT11,-(a7)             | put attribute on stack
     559                move.w  d1,-(a7)                | put digit on stack
     560                move.w  d0,-(a7)                | put column on stack
     561                move.w  #4,-(a7)                | put row on stack
     562                move.l  _obj8,-(a7)             | put object address on stack
     563                jsr     _vputc                  | update the screen
     564                add.l   #12,a7                  | clean up stack
     565                move.w  (a7)+,d0                | get group number
     566                cmp.w   #8,d0                   | see which word it's in
     567                bcc     dsdyn1                  | jump if in MS word
     568
     569                bset    d0,_vrbw10+1            | set group bit in LS byte
     570                bra     dsdyn2                  | ...
     571
     572dsdyn1:         sub.w   #8,d0                   | adjust for for byte
     573                bset    d0,_vrbw10              | set group bit in MS byte
     574
     575dsdyn2:         bset    #2,_vrcw                | set video reset type bit
     576                tst.w   _ctrsw                  | update center for scupd ?
     577                beq     dsexit                  | done if not
     578
     579                .page
     580dsdyn00:        move.l  _gdfsep,d0              | quit if no elements left
     581                beq     dsexit                  | ...
     582
     583                movea.l d0,a1                   | a1 = gdsp
     584                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     585                move.w  #52,d2                  | d2 = event PRIORITY | 4
     586                movea.l P_SL(a6),a2             | a2 points at gdstb
     587                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[pri]
     588                move.w  #0x9999,G_NOTE(a1)      | gdsp->note = COLOR
     589                move.w  #5,G_CODE(a1)           | gdsp->code = PATTERN
     590                move.l  a1,0(a2,d2.W)           | gdstb[pri] = gdsp
     591                bra     dsexit                  | done
     592
     593                .page
     594
     595| dslocn -- display location
     596| ------    ----------------
     597dslocn:         clr.w   d0                      | get group number
     598                move.b  E_DATA1(a0),d0          | ... in d0
     599                add.w   d0,d0                   | ... as a word offset
     600                lea     _grpstat,a1             | check grpstat[grp]
     601                tst.w   0(a1,d0.W)              | ...
     602                beq     dsexit                  | done if not enabled
     603
     604                tst.w   P_CF(a6)                | center update ?
     605                beq     dsloc00                 | jump if not
     606
     607                clr.w   d0                      | get location
     608                move.b  E_DATA2(a0),d0          | ... in d0
     609                move.w  d0,-(a7)                | save location
     610                clr.w   d1                      | get group number
     611                move.b  E_DATA1(a0),d1          | ... in d1
     612                move.w  d1,-(a7)                | save group number
     613                move.w  (a7),d0                 | col = group number
     614                add.w   d0,d0                   | ... | 5
     615                add.w   d0,d0                   | ...
     616                move.w  (a7)+,d2                | ...  (d2 = group number)
     617                add.w   d2,d0                   | ...
     618                add.w   #8,d0                   | ... + 8
     619                move.w  (a7)+,d1                | get location
     620                add.w   #0x0031,d1              | add '0' for ASCII conversion
     621                move.w  d2,-(a7)                | save group number
     622                move.w  #AT11,-(a7)             | put attribute on stack
     623                move.w  d1,-(a7)                | put character on stack
     624                move.w  d0,-(a7)                | put column on stack
     625                move.w  #4,-(a7)                | put row on stack
     626                move.l  _obj8,-(a7)             | put object address on stack
     627                jsr     _vputc                  | update the screen
     628                add.l   #12,a7                  | clean up stack
     629                move.w  (a7)+,d0                | get group number
     630                cmp.w   #8,d0                   | see which word it's in
     631                bcc     dslocn1                 | jump if in MS word
     632
     633                bset    d0,_vrbw11+1            | set group bit in LS byte
     634                bra     dslocn2                 | ...
     635
     636dslocn1:        sub.w   #8,d0                   | adjust for for byte
     637                bset    d0,_vrbw11              | set group bit in MS byte
     638
     639dslocn2:        bset    #3,_vrcw                | set video reset type bit
     640                tst.w   _ctrsw                  | update center for scupd ?
     641                beq     dsexit                  | done if not
     642
     643                .page
     644dsloc00:        move.l  _gdfsep,d0              | quit if no elements left
     645                beq     dsexit                  | ...
     646
     647                movea.l d0,a1                   | a1 = gdsp
     648                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     649                move.w  #52,d2                  | d2 = event PRIORITY | 4
     650                movea.l P_SL(a6),a2             | a2 points at gdstb
     651                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[pri]
     652                move.w  #0x9999,G_NOTE(a1)      | gdsp->note = COLOR
     653                move.w  #5,G_CODE(a1)           | gdsp->code = PATTERN
     654                move.l  a1,0(a2,d2.W)           | gdstb[pri] = gdsp
     655                bra     dsexit                  | done
     656
     657                .page
     658
     659| dsanrs -- display analog resolution
     660| ------    -------------------------
     661dsanrs:         move.b  E_DATA1(a0),d1          | get var / group
     662                move.w  d1,d0                   | extract group number
     663                andi.w  #0x000F,d0              | ... in d0
     664                add.w   d0,d0                   | ... as a word offset
     665                lea     _grpstat,a1             | check grpstat[grp]
     666                tst.w   0(a1,d0.W)              | ...
     667                beq     dsexit                  | done if not enabled
     668
     669                tst.w   P_CF(a6)                | center update ?
     670                beq     dsanrs0                 | jump if not
     671
     672                move.w  _angroup,d2             | see if we display
     673                bmi     dsexit                  | jump if not
     674
     675                subq.w  #1,d2                   | adust selected group number
     676                move.w  d1,d0                   | extract group from event
     677                andi.w  #0x000F,d0              | ...
     678                cmp.w   d0,d2                   | see if we display
     679                bne     dsexit                  | jump if not
     680
     681                lsr.w   #4,d1                   | extract variable number
     682                andi.w  #0x000F,d1              | ...
     683                move.w  d1,-(a7)                | save variable number
     684                move.w  d1,d0                   | calculate display offset
     685                lsl.w   #3,d0                   | ... (var | 9) + 6
     686                add.w   d0,d1                   | ... in d1
     687                addq.w  #6,d1                   | ...
     688                move.b  E_DATA2(a0),d0          | get resolution
     689                addi.w  #0x0030,d0              | convert for display
     690                move.w  #AT12,-(a7)             | put attribute on stack
     691                move.w  d0,-(a7)                | put character on stack
     692                move.w  d1,-(a7)                | put column on stack
     693                move.w  #7,-(a7)                | put row on stack
     694                move.l  _obj8,-(a7)             | put sbase on stack
     695                jsr     _vputc                  | update the screen
     696                add.l   #12,a7                  | clean up stack
     697                move.w  (a7)+,d0                | get variable number
     698                bset    d0,_vrbw13+1            | set variable bit
     699                bset    #5,_vrcw                | set video reset type bit
     700                tst.w   _ctrsw                  | update center for scupd ?
     701                beq     dsexit                  | done if not
     702
     703                .page
     704dsanrs0:        move.l  _gdfsep,d0              | quit if no elements left
     705                beq     dsexit                  | ...
     706
     707                movea.l d0,a1                   | a1 = gdsp
     708                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     709                move.w  #52,d2                  | d2 = event PRIORITY | 4
     710                movea.l P_SL(a6),a2             | a2 points at gdstb
     711                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[pri]
     712                move.w  #0x9999,G_NOTE(a1)      | gdsp->note = COLOR
     713                move.w  #6,G_CODE(a1)           | gdsp->code = PATTERN
     714                move.l  a1,0(a2,d2.W)           | gdstb[pri] = gdsp
     715                bra     dsexit                  | done
     716
     717                .page
     718
     719| dsanvl -- display analog value
     720| ------    --------------------
     721dsanvl:         move.w  _angroup,d2             | see if we display
     722                bmi     dsexit                  | jump if not
     723
     724                move.b  E_DATA1(a0),d1          | get var / group
     725                move.w  d1,d0                   | extract group number
     726                andi.w  #0x000F,d0              | ... in d0
     727                add.w   d0,d0                   | ... as a word offset
     728                lea     _grpstat,a1             | check grpstat[grp]
     729                tst.w   0(a1,d0.W)              | ...
     730                beq     dsexit                  | done if not enabled
     731
     732                tst.w   P_CF(a6)                | center update ?
     733                beq     dsanvl0                 | jump if not
     734
     735                subq.w  #1,d2                   | adust group number
     736                move.w  d1,d0                   | extract group
     737                andi.w  #0x000F,d0              | ...
     738                cmp.w   d0,d2                   | see if we display
     739                bne     dsexit                  | jump if not
     740
     741                lsr.w   #4,d1                   | extract variable number
     742                andi.w  #0x000F,d1              | ...
     743                move.w  d1,-(a7)                | save variable number
     744                move.w  d1,d0                   | calculate display offset
     745                lsl.w   #3,d0                   | ... (var | 9) + 8
     746                add.w   d0,d1                   | ... in d1
     747                addi.w  #8,d1                   | ...
     748                move.w  E_DN(a0),d0             | get value
     749                asr.w   #5,d0                   | adjust to low 11 bits
     750                bpl     dsanvl1                 | jump if positive
     751
     752                move.b  #'-',numstr             | set sign = '-'
     753                neg.w   d0                      | make value positive
    754754                bra     dsanvl2
    755 *
    756 dsanvl1:        move.b  #'+',numstr             * set sign = '+'
    757 *
    758                 .page
    759 dsanvl2:        ext.l   d0                      * convert MS digit
    760                 divu    #1000,d0                * ...
    761                 add.w   #$0030,d0               * ...
    762                 move.b  d0,numstr+1             * ...
    763                 swap    d0                      * convert middle digit
    764                 ext.l   d0                      * ...
    765                 divu    #100,d0                 * ...
    766                 add.w   #$0030,d0               * ...
    767                 move.b  d0,numstr+2             * ...
    768                 move.b  #'.',numstr+3           * insert decimal point
    769                 swap    d0                      * convert LS digit
    770                 ext.l   d0                      * ...
    771                 divu    #10,d0                  * ...
    772                 add.w   #$0030,d0               * ...
    773                 move.b  d0,numstr+4             * ...
    774                 clr.b   numstr+5                * terminate string
    775                 move.w  #AT12,-(a7)             * put attribute on stack
    776                 move.l  #numstr,-(a7)           * put buffer address on stack
    777                 move.w  d1,-(a7)                * put column on stack
    778                 move.w  #7,-(a7)                * put row on stack
    779                 move.l  _obj8,-(a7)             * put sbase on stack
    780                 jsr     _vputs                  * update the screen
    781                 add.l   #14,a7                  * clean up stack
    782                 move.w  (a7)+,d0                * get variable number
    783                 bset    d0,_vrbw14+1            * set variable bit
    784                 bset    #6,_vrcw                * set video reset type bit
    785                 tst.w   _ctrsw                  * update center for scupd ?
    786                 beq     dsexit                  * done if not
    787 *
    788 dsanvl0:        move.l  _gdfsep,d0              * quit if no elements left
    789                 beq     dsexit                  * ...
    790 *
    791                 movea.l d0,a1                   * a1 = gdsp
    792                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    793                 move.w  #52,d2                  * d2 = event PRIORITY * 4
    794                 movea.l P_SL(a6),a2             * a2 points at gdstb
    795                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[pri]
    796                 move.w  #$9999,G_NOTE(a1)       * gdsp->note = COLOR
    797                 move.w  #6,G_CODE(a1)           * gdsp->code = PATTERN
    798                 move.l  a1,0(a2,d2.W)           * gdstb[pri] = gdsp
    799                 bra     dsexit                  * done
    800 *
    801                 .page
    802 *
    803 * dsasgn -- display assignment
    804 * ------    ------------------
    805 dsasgn:         tst.w   P_CF(a6)                * center update ?
    806                 beq     dsasgn0                 * jump if not
    807 *
    808                 move.l  a0,-(a7)                * stash a0
    809                 jsr     _mpcupd                 * update changed stuff
    810                 movea.l (a7)+,a0                * restore a0
    811                 clr.w   d1                      * get assignment
    812                 move.b  E_DATA1(a0),d1          * ... from the event
    813                 ext.l   d1                      * ... as a long in d1
    814                 divu    #10,d1                  * divide by 10 for conversion
    815                 add.l   #$00300030,d1           * add '0' for ASCII conversion
    816                 move.b  d1,numstr               * put MS byte in work area
    817                 swap    d1                      * swap register halves
    818                 move.b  d1,numstr+1             * put LS byte in work area
    819                 clr.b   numstr+2                * terminate string
    820                 move.w  #AT04,-(a7)             * put attribute on stack
    821                 move.l  #numstr,-(a7)           * put buffer address on stack
    822                 move.w  #11,-(a7)               * put column on stack
    823                 move.w  #1,-(a7)                * put row on stack
    824                 move.l  _obj8,-(a7)             * put sbase on stack
    825                 jsr     _vputs                  * update the screen
    826                 add.l   #14,a7                  * clean up stack
    827                 bset    #0,_vrcw+1              * set video reset type bit
    828                 tst.w   _ctrsw                  * update center for scupd ?
    829                 beq     dsexit                  * done if not
    830 *
    831 dsasgn0:        move.l  _gdfsep,d0              * quit if no elements left
    832                 beq     dsexit                  * ...
    833 *
    834                 movea.l d0,a1                   * a1 = gdsp
    835                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    836                 move.w  #56,d2                  * d2 = event PRIORITY * 4
    837                 movea.l P_SL(a6),a2             * a2 points at gdstb
    838                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[pri]
    839                 move.w  #$3333,G_NOTE(a1)       * gdsp->note = COLOR
    840                 move.w  #3,G_CODE(a1)           * gdsp->code = PATTERN
    841                 move.l  a1,0(a2,d2.W)           * gdstb[pri] = gdsp
    842                 bra     dsexit                  * done
    843 *
    844                 .page
    845 *
    846 * dstmpo -- display tempo
    847 * ------    -------------
    848 dstmpo:         tst.w   P_CF(a6)                * center update ?
    849                 beq     dstmpo0                 * jump if not
    850 *
    851                 clr.w   d1                      * get tempo
    852                 move.b  E_DATA1(a0),d1          * ... from event
    853                 ext.l   d1                      * ... as a long in d1
    854                 divu    #10,d1                  * divide by 10 for conversion
    855                 swap    d1                      * swap register halves
    856                 add.w   #$0030,d1               * add '0' for ASCII conversion
    857                 move.b  d1,numstr+2             * put LS byte in work area
    858                 swap    d1                      * swap register halves
    859                 ext.l   d1                      * divide again
    860                 divu    #10,d1                  * ...
    861                 add.l   #$00300030,d1           * add '0' for ASCII conversion
    862                 move.b  d1,numstr               * put MS byte in work area
    863                 swap    d1                      * swap register halves
    864                 move.b  d1,numstr+1             * put middle byte in work area
    865                 clr.b   numstr+3                * terminate string
    866                 move.w  #AT06,-(a7)             * put attribute on stack
    867                 move.l  #numstr,-(a7)           * put buffer address on stack
    868                 move.w  #27,-(a7)               * put column on stack
    869                 move.w  #1,-(a7)                * put row on stack
    870                 move.l  _obj8,-(a7)             * put sbase on stack
    871                 jsr     _vputs                  * display tempo
    872                 add.l   #14,a7                  * clean up stack
    873                 bset    #2,_vrcw+1              * set video reset type bit
    874                 tst.w   _ctrsw                  * update center for scupd ?
    875                 beq     dsexit                  * done if not
    876 *
    877 dstmpo0:        move.l  _gdfsep,d0              * quit if no elements left
    878                 beq     dsexit                  * ...
    879 *
    880                 movea.l d0,a1                   * a1 = gdsp
    881                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    882                 move.w  #56,d2                  * d2 = event PRIORITY * 4
    883                 movea.l P_SL(a6),a2             * a2 points at gdstb
    884                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[pri]
    885                 move.w  #$3333,G_NOTE(a1)       * gdsp->note = COLOR
    886                 move.w  #4,G_CODE(a1)           * gdsp->code = PATTERN
    887                 move.l  a1,0(a2,d2.W)           * gdstb[pri] = gdsp
    888                 bra     dsexit                  * done
    889 *
    890                 .page
    891 *
    892 * dsstop -- display stop
    893 * ------    ------------
    894 dsstop:         tst.w   P_CF(a6)                * center update ?
    895                 beq     dsstop0                 * jump if not
    896 *
    897                 jsr     _dclkmd                 * show that clock is stopped
    898                 move.w  #AT08,-(a7)             * put attribute on stack
    899                 move.w  #40,-(a7)               * put 1st column on stack
    900                 move.w  #1,-(a7)                * put row on stack
    901                 move.l  _obj8,-(a7)             * put sbase on stack
    902                 jsr     _vputa                  * hilite first column
    903                 move.w  #41,COL(a7)             * put 2nd column on stack
    904                 jsr     _vputa                  * hilite second column
    905                 move.w  #42,COL(a7)             * put 3rd column on stack
    906                 jsr     _vputa                  * hilite third column
    907                 move.w  #43,COL(a7)             * put 4th column on stack
    908                 jsr     _vputa                  * hilite fourth column
    909                 add.l   #10,a7                  * clean up stack
    910                 bset    #7,_vrcw                * set video reset type bits
    911                 bset    #0,_vrbw15              * ...
    912                 tst.w   _ctrsw                  * update center for scupd ?
    913                 beq     dsexit                  * done if not
    914 *
    915 dsstop0:        move.l  _gdfsep,d0              * quit if no elements left
    916                 beq     dsexit                  * ...
    917 *
    918                 movea.l d0,a1                   * a1 = gdsp
    919                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    920                 move.w  #56,d2                  * d2 = event PRIORITY * 4
    921                 movea.l P_SL(a6),a2             * a2 points at gdstb
    922                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[pri]
    923                 move.w  #$3333,G_NOTE(a1)       * gdsp->note = COLOR
    924                 move.w  #5,G_CODE(a1)           * gdsp->code = PATTERN
    925                 move.l  a1,0(a2,d2.W)           * gdstb[pri] = gdsp
    926                 bra     dsexit                  * done
    927 *
    928                 .page
    929 *
    930 * dsnext -- display next
    931 * ------    ------------
    932 dsnext:         tst.w   P_CF(a6)                * center update ?
    933                 beq     dsnext0                 * jump if not
    934 *
    935                 move.w  #AT08,-(a7)             * put attribute on stack
    936                 move.w  #45,-(a7)               * put 1st column on stack
    937                 move.w  #1,-(a7)                * put row on stack
    938                 move.l  _obj8,-(a7)             * put sbase on stack
    939                 jsr     _vputa                  * hilite first column
    940                 move.w  #46,COL(a7)             * put 2nd column on stack
    941                 jsr     _vputa                  * hilite second column
    942                 move.w  #47,COL(a7)             * put 3rd column on stack
    943                 jsr     _vputa                  * hilite third column
    944                 move.w  #48,COL(a7)             * put 4th column on stack
    945                 jsr     _vputa                  * hilite fourth column
    946                 add.l   #10,a7                  * clean up stack
    947                 bset    #7,_vrcw                * set video reset type bits
    948                 bset    #1,_vrbw15              * ...
    949                 tst.w   _ctrsw                  * update center for scupd ?
    950                 beq     dsexit                  * done if not
    951 *
    952 dsnext0:        move.l  _gdfsep,d0              * quit if no elements left
    953                 beq     dsexit                  * ...
    954 *
    955                 movea.l d0,a1                   * a1 = gdsp
    956                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    957                 move.w  #56,d2                  * d2 = event PRIORITY * 4
    958                 movea.l P_SL(a6),a2             * a2 points at gdstb
    959                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[pri]
    960                 move.w  #$3333,G_NOTE(a1)       * gdsp->note = COLOR
    961                 move.w  #5,G_CODE(a1)           * gdsp->code = PATTERN
    962                 move.l  a1,0(a2,d2.W)           * gdstb[pri] = gdsp
    963                 bra     dsexit                  * done
    964 *
    965                 .page
    966 *
    967 * dsgrp -- display group status
    968 * -----    --------------------
    969 dsgrp:          tst.w   P_CF(a6)                * center update ?
    970                 beq     dsgrp0                  * jump if not
    971 *
    972                 tst.w   _ctrsw                  * update center for scupd ?
    973                 beq     dsexit                  * done if not
    974 *
    975 dsgrp0:         move.l  _gdfsep,d0              * quit if no elements left
    976                 beq     dsexit                  * ...
    977 *
    978                 movea.l d0,a1                   * a1 = gdsp
    979                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    980                 move.w  #60,d2                  * d2 = event PRIORITY * 4
    981                 movea.l P_SL(a6),a2             * a2 points at gdstb
    982                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[pri]
    983                 move.w  #$9999,G_NOTE(a1)       * gdsp->note = COLOR
    984                 move.w  #3,G_CODE(a1)           * gdsp->code = PATTERN
    985                 move.l  a1,0(a2,d2.W)           * gdstb[pri] = gdsp
    986                 bra     dsexit                  * done
    987 *
    988                 .page
    989 *
    990 * dsinst -- display instrument
    991 * ------    ------------------
    992 dsinst:         clr.w   d0                      * get group number
    993                 move.b  E_DATA1(a0),d0          * ... in d0
    994                 add.w   d0,d0                   * ... as a word offset
    995                 lea     _grpstat,a1             * check grpstat[grp]
    996                 tst.w   0(a1,d0.W)              * ...
    997                 beq     dsexit                  * done if not enabled
    998 *
    999                 tst.w   P_CF(a6)                * center update ?
    1000                 beq     dsins00                 * jump if not
    1001 *
    1002                 lea     _ins2grp,a1             * point at ins2grp[]
    1003                 clr.w   d0                      * get instrument number
    1004                 move.b  E_DATA2(a0),d0          * ... in d0
    1005                 move.w  d0,-(a7)                * save instrument number
    1006                 clr.w   d1                      * get group number
    1007                 move.b  E_DATA1(a0),d1          * ... in d1
    1008                 move.w  d1,-(a7)                * save group number
    1009                 move.w  (a7),d0                 * col = group number
    1010                 add.w   d0,d0                   * ... * 5
    1011                 add.w   d0,d0                   * ...
    1012                 move.w  (a7)+,d2                * ...  (d2 = group number)
    1013                 add.w   d2,d0                   * ...
    1014                 add.w   #7,d0                   * ... + 7
    1015                 clr.l   d1                      * get instrument number
    1016                 move.w  (a7)+,d1                * ... as a long in d1
    1017                 divu    #10,d1                  * divide by 10 for conversion
    1018                 add.l   #$00300030,d1           * add '0' for ASCII conversion
    1019                 move.b  d1,numstr               * put MS byte in work area
    1020                 swap    d1                      * swap register halves
    1021                 move.b  d1,numstr+1             * put LS byte in work area
    1022                 clr.b   numstr+2                * terminate string
    1023                 move.w  d2,-(a7)                * save group number
    1024                 move.w  #AT11,-(a7)             * put attribute on stack
    1025                 move.l  #numstr,-(a7)           * put buffer address on stack
    1026                 move.w  d0,-(a7)                * put column on stack
    1027                 move.w  #2,-(a7)                * put row on stack
    1028                 move.l  _obj8,-(a7)             * put object address on stack
    1029                 jsr     _vputs                  * update the screen
    1030                 add.l   #14,a7                  * clean up stack
    1031 *
    1032                 .page
    1033                 move.w  (a7)+,d0                * get group number
    1034                 cmp.w   #8,d0                   * see which word it's in
    1035                 bcc     dsinst1                 * jump if in MS word
    1036 *
    1037                 bset    d0,_vrbw08+1            * set group bit in LS byte
    1038                 bra     dsinst2                 * ...
    1039 *
    1040 dsinst1:        sub.w   #8,d0                   * adjust for for byte
    1041                 bset    d0,_vrbw08              * set group bit in MS byte
    1042 *
    1043 dsinst2:        bset    #0,_vrcw                * set video reset type bit
    1044                 tst.w   _ctrsw                  * update center for scupd ?
    1045                 beq     dsexit                  * done if not
    1046 *
    1047 dsins00:        move.l  _gdfsep,d0              * quit if no elements left
    1048                 beq     dsexit                  * ...
    1049 *
    1050                 movea.l d0,a1                   * a1 = gdsp
    1051                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    1052                 move.w  #60,d2                  * d2 = event PRIORITY * 4
    1053                 movea.l P_SL(a6),a2             * a2 points at gdstb
    1054                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[pri]
    1055                 move.w  #$9999,G_NOTE(a1)       * gdsp->note = COLOR
    1056                 move.w  #3,G_CODE(a1)           * gdsp->code = PATTERN
    1057                 move.l  a1,0(a2,d2.W)           * gdstb[pri] = gdsp
    1058                 bra     dsexit                  * done
    1059 *
    1060                 .page
    1061 *
    1062 * dsintp -- display interpolation
    1063 * ------    ---------------------
    1064 dsintp:         tst.w   P_CF(a6)                * center update ?
    1065                 beq     dsintp0                 * jump if not
    1066 *
    1067                 move.w  E_DATA1(a0),-(a7)       * get interpolate value
    1068                 jsr     _fromfpu                * convert to milliseconds
    1069                 tst.w   (a7)+                   * ...
    1070                 andi.l  #$0000FFFF,d0           * clear high bits
    1071                 divu    #10000,d0               * convert 1st digit
    1072                 addi.w  #$0030,d0               * ... to ASCII
    1073                 move.b  d0,numstr               * ... in numstr
    1074                 swap    d0                      * convert 2nd digit
    1075                 ext.l   d0                      * ...
    1076                 divu    #1000,d0                * ...
    1077                 addi.w  #$0030,d0               * ... to ASCII
    1078                 move.b  d0,numstr+1             * ... in numstr
    1079                 move.b  #'.',numstr+2           * insert decimal point
    1080                 swap    d0                      * convert 3rd digit
    1081                 ext.l   d0                      * ...
    1082                 divu    #100,d0                 * ...
    1083                 addi.w  #$0030,d0               * ... to ASCII
    1084                 move.b  d0,numstr+3             * ... in numstr
    1085                 clr.b   numstr+4                * terminate numstr
    1086                 move.w  #AT07,-(a7)             * vputs(obj8, 1, 35, numstr, AT07)
    1087                 move.l  #numstr,-(a7)           * ...
    1088                 move.w  #35,-(a7)               * ...
    1089                 move.w  #1,-(a7)                * ...
    1090                 move.l  _obj8,-(a7)             * ...
    1091                 jsr     _vputs                  * ...
    1092                 add.l   #14,a7                  * ...
    1093                 bset    #3,_vrcw+1              * set video reset bit
    1094                 tst.w   _ctrsw                  * update center for scupd ?
    1095                 beq     dsexit                  * done if not
    1096 *
    1097 dsintp0:        move.l  _gdfsep,d0              * quit if no elements left
    1098                 beq     dsexit                  * ...
    1099 *
    1100                 movea.l d0,a1                   * a1 = gdsp
    1101                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    1102                 move.w  #60,d2                  * d2 = event PRIORITY * 4
    1103                 movea.l P_SL(a6),a2             * a2 points at gdstb
    1104                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[pri]
    1105                 move.w  #$CCCC,G_NOTE(a1)       * gdsp->note = COLOR
    1106                 move.w  #4,G_CODE(a1)           * gdsp->code = PATTERN
    1107                 move.l  a1,0(a2,d2.W)           * gdstb[pri] = gdsp
    1108                 bra     dsexit                  * done
    1109 *
    1110                 .page
    1111 *
    1112 * dspnch -- display punch in/out
    1113 * ------    --------------------
    1114 dspnch:         tst.w   P_CF(a6)                * center update ?
    1115                 beq     dspnch0                 * jump if not
    1116 *
    1117                 tst.w   E_DATA1(a0)             * punch in ?
    1118                 beq     dspnch1                 * jump if not
    1119 *
    1120                 move.w  #AT09,-(a7)             * put attribute on stack
    1121                 move.w  #50,-(a7)               * put 1st col on stack
    1122                 move.w  #1,-(a7)                * put row on stack
    1123                 move.l  _obj8,-(a7)             * put object address on stack
    1124                 jsr     _vputa                  * highlight 1st column
    1125                 move.w  #51,COL(a7)             * put 2nd col on stack
    1126                 jsr     _vputa                  * highlight 2nd col
    1127                 add.l   #10,a7                  * clean up stack
    1128                 bset    #5,_vrcw+1              * set video reset bit
    1129                 bra     dspnch2                 * go do maker update
    1130 *
    1131 dspnch1:        move.w  #AT09,-(a7)             * put attribute on stack
    1132                 move.w  #53,-(a7)               * put 1st col on stack
    1133                 move.w  #1,-(a7)                * put row on stack
    1134                 move.l  _obj8,-(a7)             * put object address on stack
    1135                 jsr     _vputa                  * highlight 1st column
    1136                 move.w  #54,COL(a7)             * put 2nd col on stack
    1137                 jsr     _vputa                  * highlight 2nd column
    1138                 move.w  #55,COL(a7)             * put 3rd col on stack
    1139                 jsr     _vputa                  * highlight 3rd column
    1140                 add.l   #10,a7                  * clean up stack
    1141                 bset    #6,_vrcw+1              * set video reset bit
    1142 *
    1143 dspnch2:        jsr     _dsgmodz                * display updated modes
    1144                 tst.w   _ctrsw                  * update center for scupd ?
    1145                 beq     dsexit                  * done if not
    1146 *
    1147 dspnch0:        move.l  _gdfsep,d0              * quit if no elements left
    1148                 beq     dsexit                  * ...
    1149 *
    1150                 movea.l d0,a1                   * a1 = gdsp
    1151                 move.l  G_NEXT(a1),_gdfsep      * gdfsep = gdsp->next
    1152                 move.w  #60,d2                  * d2 = event PRIORITY * 4
    1153                 movea.l P_SL(a6),a2             * a2 points at gdstb
    1154                 move.l  0(a2,d2.W),G_NEXT(a1)   * gdsp->next = gdstb[pri]
    1155                 move.w  #$CCCC,G_NOTE(a1)       * gdsp->note = COLOR
    1156                 tst.w   E_DATA1(a0)             * see which kind we have
    1157                 bne     dspnchi                 * jump if 'punch in'
    1158 *
    1159                 move.w  #6,G_CODE(a1)           * gdsp->code = 'out' PATTERN
     755
     756dsanvl1:        move.b  #'+',numstr             | set sign = '+'
     757
     758                .page
     759dsanvl2:        ext.l   d0                      | convert MS digit
     760                divu    #1000,d0                | ...
     761                add.w   #0x0030,d0              | ...
     762                move.b  d0,numstr+1             | ...
     763                swap    d0                      | convert middle digit
     764                ext.l   d0                      | ...
     765                divu    #100,d0                 | ...
     766                add.w   #0x0030,d0              | ...
     767                move.b  d0,numstr+2             | ...
     768                move.b  #'.',numstr+3           | insert decimal point
     769                swap    d0                      | convert LS digit
     770                ext.l   d0                      | ...
     771                divu    #10,d0                  | ...
     772                add.w   #0x0030,d0              | ...
     773                move.b  d0,numstr+4             | ...
     774                clr.b   numstr+5                | terminate string
     775                move.w  #AT12,-(a7)             | put attribute on stack
     776                move.l  #numstr,-(a7)           | put buffer address on stack
     777                move.w  d1,-(a7)                | put column on stack
     778                move.w  #7,-(a7)                | put row on stack
     779                move.l  _obj8,-(a7)             | put sbase on stack
     780                jsr     _vputs                  | update the screen
     781                add.l   #14,a7                  | clean up stack
     782                move.w  (a7)+,d0                | get variable number
     783                bset    d0,_vrbw14+1            | set variable bit
     784                bset    #6,_vrcw                | set video reset type bit
     785                tst.w   _ctrsw                  | update center for scupd ?
     786                beq     dsexit                  | done if not
     787
     788dsanvl0:        move.l  _gdfsep,d0              | quit if no elements left
     789                beq     dsexit                  | ...
     790
     791                movea.l d0,a1                   | a1 = gdsp
     792                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     793                move.w  #52,d2                  | d2 = event PRIORITY | 4
     794                movea.l P_SL(a6),a2             | a2 points at gdstb
     795                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[pri]
     796                move.w  #0x9999,G_NOTE(a1)      | gdsp->note = COLOR
     797                move.w  #6,G_CODE(a1)           | gdsp->code = PATTERN
     798                move.l  a1,0(a2,d2.W)           | gdstb[pri] = gdsp
     799                bra     dsexit                  | done
     800
     801                .page
     802
     803| dsasgn -- display assignment
     804| ------    ------------------
     805dsasgn:         tst.w   P_CF(a6)                | center update ?
     806                beq     dsasgn0                 | jump if not
     807
     808                move.l  a0,-(a7)                | stash a0
     809                jsr     _mpcupd                 | update changed stuff
     810                movea.l (a7)+,a0                | restore a0
     811                clr.w   d1                      | get assignment
     812                move.b  E_DATA1(a0),d1          | ... from the event
     813                ext.l   d1                      | ... as a long in d1
     814                divu    #10,d1                  | divide by 10 for conversion
     815                add.l   #0x00300030,d1          | add '0' for ASCII conversion
     816                move.b  d1,numstr               | put MS byte in work area
     817                swap    d1                      | swap register halves
     818                move.b  d1,numstr+1             | put LS byte in work area
     819                clr.b   numstr+2                | terminate string
     820                move.w  #AT04,-(a7)             | put attribute on stack
     821                move.l  #numstr,-(a7)           | put buffer address on stack
     822                move.w  #11,-(a7)               | put column on stack
     823                move.w  #1,-(a7)                | put row on stack
     824                move.l  _obj8,-(a7)             | put sbase on stack
     825                jsr     _vputs                  | update the screen
     826                add.l   #14,a7                  | clean up stack
     827                bset    #0,_vrcw+1              | set video reset type bit
     828                tst.w   _ctrsw                  | update center for scupd ?
     829                beq     dsexit                  | done if not
     830
     831dsasgn0:        move.l  _gdfsep,d0              | quit if no elements left
     832                beq     dsexit                  | ...
     833
     834                movea.l d0,a1                   | a1 = gdsp
     835                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     836                move.w  #56,d2                  | d2 = event PRIORITY | 4
     837                movea.l P_SL(a6),a2             | a2 points at gdstb
     838                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[pri]
     839                move.w  #0x3333,G_NOTE(a1)      | gdsp->note = COLOR
     840                move.w  #3,G_CODE(a1)           | gdsp->code = PATTERN
     841                move.l  a1,0(a2,d2.W)           | gdstb[pri] = gdsp
     842                bra     dsexit                  | done
     843
     844                .page
     845
     846| dstmpo -- display tempo
     847| ------    -------------
     848dstmpo:         tst.w   P_CF(a6)                | center update ?
     849                beq     dstmpo0                 | jump if not
     850
     851                clr.w   d1                      | get tempo
     852                move.b  E_DATA1(a0),d1          | ... from event
     853                ext.l   d1                      | ... as a long in d1
     854                divu    #10,d1                  | divide by 10 for conversion
     855                swap    d1                      | swap register halves
     856                add.w   #0x0030,d1              | add '0' for ASCII conversion
     857                move.b  d1,numstr+2             | put LS byte in work area
     858                swap    d1                      | swap register halves
     859                ext.l   d1                      | divide again
     860                divu    #10,d1                  | ...
     861                add.l   #0x00300030,d1          | add '0' for ASCII conversion
     862                move.b  d1,numstr               | put MS byte in work area
     863                swap    d1                      | swap register halves
     864                move.b  d1,numstr+1             | put middle byte in work area
     865                clr.b   numstr+3                | terminate string
     866                move.w  #AT06,-(a7)             | put attribute on stack
     867                move.l  #numstr,-(a7)           | put buffer address on stack
     868                move.w  #27,-(a7)               | put column on stack
     869                move.w  #1,-(a7)                | put row on stack
     870                move.l  _obj8,-(a7)             | put sbase on stack
     871                jsr     _vputs                  | display tempo
     872                add.l   #14,a7                  | clean up stack
     873                bset    #2,_vrcw+1              | set video reset type bit
     874                tst.w   _ctrsw                  | update center for scupd ?
     875                beq     dsexit                  | done if not
     876
     877dstmpo0:        move.l  _gdfsep,d0              | quit if no elements left
     878                beq     dsexit                  | ...
     879
     880                movea.l d0,a1                   | a1 = gdsp
     881                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     882                move.w  #56,d2                  | d2 = event PRIORITY | 4
     883                movea.l P_SL(a6),a2             | a2 points at gdstb
     884                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[pri]
     885                move.w  #0x3333,G_NOTE(a1)      | gdsp->note = COLOR
     886                move.w  #4,G_CODE(a1)           | gdsp->code = PATTERN
     887                move.l  a1,0(a2,d2.W)           | gdstb[pri] = gdsp
     888                bra     dsexit                  | done
     889
     890                .page
     891
     892| dsstop -- display stop
     893| ------    ------------
     894dsstop:         tst.w   P_CF(a6)                | center update ?
     895                beq     dsstop0                 | jump if not
     896
     897                jsr     _dclkmd                 | show that clock is stopped
     898                move.w  #AT08,-(a7)             | put attribute on stack
     899                move.w  #40,-(a7)               | put 1st column on stack
     900                move.w  #1,-(a7)                | put row on stack
     901                move.l  _obj8,-(a7)             | put sbase on stack
     902                jsr     _vputa                  | hilite first column
     903                move.w  #41,COL(a7)             | put 2nd column on stack
     904                jsr     _vputa                  | hilite second column
     905                move.w  #42,COL(a7)             | put 3rd column on stack
     906                jsr     _vputa                  | hilite third column
     907                move.w  #43,COL(a7)             | put 4th column on stack
     908                jsr     _vputa                  | hilite fourth column
     909                add.l   #10,a7                  | clean up stack
     910                bset    #7,_vrcw                | set video reset type bits
     911                bset    #0,_vrbw15              | ...
     912                tst.w   _ctrsw                  | update center for scupd ?
     913                beq     dsexit                  | done if not
     914
     915dsstop0:        move.l  _gdfsep,d0              | quit if no elements left
     916                beq     dsexit                  | ...
     917
     918                movea.l d0,a1                   | a1 = gdsp
     919                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     920                move.w  #56,d2                  | d2 = event PRIORITY | 4
     921                movea.l P_SL(a6),a2             | a2 points at gdstb
     922                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[pri]
     923                move.w  #0x3333,G_NOTE(a1)      | gdsp->note = COLOR
     924                move.w  #5,G_CODE(a1)           | gdsp->code = PATTERN
     925                move.l  a1,0(a2,d2.W)           | gdstb[pri] = gdsp
     926                bra     dsexit                  | done
     927
     928                .page
     929
     930| dsnext -- display next
     931| ------    ------------
     932dsnext:         tst.w   P_CF(a6)                | center update ?
     933                beq     dsnext0                 | jump if not
     934
     935                move.w  #AT08,-(a7)             | put attribute on stack
     936                move.w  #45,-(a7)               | put 1st column on stack
     937                move.w  #1,-(a7)                | put row on stack
     938                move.l  _obj8,-(a7)             | put sbase on stack
     939                jsr     _vputa                  | hilite first column
     940                move.w  #46,COL(a7)             | put 2nd column on stack
     941                jsr     _vputa                  | hilite second column
     942                move.w  #47,COL(a7)             | put 3rd column on stack
     943                jsr     _vputa                  | hilite third column
     944                move.w  #48,COL(a7)             | put 4th column on stack
     945                jsr     _vputa                  | hilite fourth column
     946                add.l   #10,a7                  | clean up stack
     947                bset    #7,_vrcw                | set video reset type bits
     948                bset    #1,_vrbw15              | ...
     949                tst.w   _ctrsw                  | update center for scupd ?
     950                beq     dsexit                  | done if not
     951
     952dsnext0:        move.l  _gdfsep,d0              | quit if no elements left
     953                beq     dsexit                  | ...
     954
     955                movea.l d0,a1                   | a1 = gdsp
     956                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     957                move.w  #56,d2                  | d2 = event PRIORITY | 4
     958                movea.l P_SL(a6),a2             | a2 points at gdstb
     959                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[pri]
     960                move.w  #0x3333,G_NOTE(a1)      | gdsp->note = COLOR
     961                move.w  #5,G_CODE(a1)           | gdsp->code = PATTERN
     962                move.l  a1,0(a2,d2.W)           | gdstb[pri] = gdsp
     963                bra     dsexit                  | done
     964
     965                .page
     966
     967| dsgrp -- display group status
     968| -----    --------------------
     969dsgrp:          tst.w   P_CF(a6)                | center update ?
     970                beq     dsgrp0                  | jump if not
     971
     972                tst.w   _ctrsw                  | update center for scupd ?
     973                beq     dsexit                  | done if not
     974
     975dsgrp0:         move.l  _gdfsep,d0              | quit if no elements left
     976                beq     dsexit                  | ...
     977
     978                movea.l d0,a1                   | a1 = gdsp
     979                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     980                move.w  #60,d2                  | d2 = event PRIORITY | 4
     981                movea.l P_SL(a6),a2             | a2 points at gdstb
     982                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[pri]
     983                move.w  #0x9999,G_NOTE(a1)      | gdsp->note = COLOR
     984                move.w  #3,G_CODE(a1)           | gdsp->code = PATTERN
     985                move.l  a1,0(a2,d2.W)           | gdstb[pri] = gdsp
     986                bra     dsexit                  | done
     987
     988                .page
     989
     990| dsinst -- display instrument
     991| ------    ------------------
     992dsinst:         clr.w   d0                      | get group number
     993                move.b  E_DATA1(a0),d0          | ... in d0
     994                add.w   d0,d0                   | ... as a word offset
     995                lea     _grpstat,a1             | check grpstat[grp]
     996                tst.w   0(a1,d0.W)              | ...
     997                beq     dsexit                  | done if not enabled
     998
     999                tst.w   P_CF(a6)                | center update ?
     1000                beq     dsins00                 | jump if not
     1001
     1002                lea     _ins2grp,a1             | point at ins2grp[]
     1003                clr.w   d0                      | get instrument number
     1004                move.b  E_DATA2(a0),d0          | ... in d0
     1005                move.w  d0,-(a7)                | save instrument number
     1006                clr.w   d1                      | get group number
     1007                move.b  E_DATA1(a0),d1          | ... in d1
     1008                move.w  d1,-(a7)                | save group number
     1009                move.w  (a7),d0                 | col = group number
     1010                add.w   d0,d0                   | ... | 5
     1011                add.w   d0,d0                   | ...
     1012                move.w  (a7)+,d2                | ...  (d2 = group number)
     1013                add.w   d2,d0                   | ...
     1014                add.w   #7,d0                   | ... + 7
     1015                clr.l   d1                      | get instrument number
     1016                move.w  (a7)+,d1                | ... as a long in d1
     1017                divu    #10,d1                  | divide by 10 for conversion
     1018                add.l   #0x00300030,d1          | add '0' for ASCII conversion
     1019                move.b  d1,numstr               | put MS byte in work area
     1020                swap    d1                      | swap register halves
     1021                move.b  d1,numstr+1             | put LS byte in work area
     1022                clr.b   numstr+2                | terminate string
     1023                move.w  d2,-(a7)                | save group number
     1024                move.w  #AT11,-(a7)             | put attribute on stack
     1025                move.l  #numstr,-(a7)           | put buffer address on stack
     1026                move.w  d0,-(a7)                | put column on stack
     1027                move.w  #2,-(a7)                | put row on stack
     1028                move.l  _obj8,-(a7)             | put object address on stack
     1029                jsr     _vputs                  | update the screen
     1030                add.l   #14,a7                  | clean up stack
     1031
     1032                .page
     1033                move.w  (a7)+,d0                | get group number
     1034                cmp.w   #8,d0                   | see which word it's in
     1035                bcc     dsinst1                 | jump if in MS word
     1036
     1037                bset    d0,_vrbw08+1            | set group bit in LS byte
     1038                bra     dsinst2                 | ...
     1039
     1040dsinst1:        sub.w   #8,d0                   | adjust for for byte
     1041                bset    d0,_vrbw08              | set group bit in MS byte
     1042
     1043dsinst2:        bset    #0,_vrcw                | set video reset type bit
     1044                tst.w   _ctrsw                  | update center for scupd ?
     1045                beq     dsexit                  | done if not
     1046
     1047dsins00:        move.l  _gdfsep,d0              | quit if no elements left
     1048                beq     dsexit                  | ...
     1049
     1050                movea.l d0,a1                   | a1 = gdsp
     1051                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     1052                move.w  #60,d2                  | d2 = event PRIORITY | 4
     1053                movea.l P_SL(a6),a2             | a2 points at gdstb
     1054                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[pri]
     1055                move.w  #0x9999,G_NOTE(a1)      | gdsp->note = COLOR
     1056                move.w  #3,G_CODE(a1)           | gdsp->code = PATTERN
     1057                move.l  a1,0(a2,d2.W)           | gdstb[pri] = gdsp
     1058                bra     dsexit                  | done
     1059
     1060                .page
     1061
     1062| dsintp -- display interpolation
     1063| ------    ---------------------
     1064dsintp:         tst.w   P_CF(a6)                | center update ?
     1065                beq     dsintp0                 | jump if not
     1066
     1067                move.w  E_DATA1(a0),-(a7)       | get interpolate value
     1068                jsr     _fromfpu                | convert to milliseconds
     1069                tst.w   (a7)+                   | ...
     1070                andi.l  #0x0000FFFF,d0          | clear high bits
     1071                divu    #10000,d0               | convert 1st digit
     1072                addi.w  #0x0030,d0              | ... to ASCII
     1073                move.b  d0,numstr               | ... in numstr
     1074                swap    d0                      | convert 2nd digit
     1075                ext.l   d0                      | ...
     1076                divu    #1000,d0                | ...
     1077                addi.w  #0x0030,d0              | ... to ASCII
     1078                move.b  d0,numstr+1             | ... in numstr
     1079                move.b  #'.',numstr+2           | insert decimal point
     1080                swap    d0                      | convert 3rd digit
     1081                ext.l   d0                      | ...
     1082                divu    #100,d0                 | ...
     1083                addi.w  #0x0030,d0              | ... to ASCII
     1084                move.b  d0,numstr+3             | ... in numstr
     1085                clr.b   numstr+4                | terminate numstr
     1086                move.w  #AT07,-(a7)             | vputs(obj8, 1, 35, numstr, AT07)
     1087                move.l  #numstr,-(a7)           | ...
     1088                move.w  #35,-(a7)               | ...
     1089                move.w  #1,-(a7)                | ...
     1090                move.l  _obj8,-(a7)             | ...
     1091                jsr     _vputs                  | ...
     1092                add.l   #14,a7                  | ...
     1093                bset    #3,_vrcw+1              | set video reset bit
     1094                tst.w   _ctrsw                  | update center for scupd ?
     1095                beq     dsexit                  | done if not
     1096
     1097dsintp0:        move.l  _gdfsep,d0              | quit if no elements left
     1098                beq     dsexit                  | ...
     1099
     1100                movea.l d0,a1                   | a1 = gdsp
     1101                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     1102                move.w  #60,d2                  | d2 = event PRIORITY | 4
     1103                movea.l P_SL(a6),a2             | a2 points at gdstb
     1104                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[pri]
     1105                move.w  #0xCCCC,G_NOTE(a1)      | gdsp->note = COLOR
     1106                move.w  #4,G_CODE(a1)           | gdsp->code = PATTERN
     1107                move.l  a1,0(a2,d2.W)           | gdstb[pri] = gdsp
     1108                bra     dsexit                  | done
     1109
     1110                .page
     1111
     1112| dspnch -- display punch in/out
     1113| ------    --------------------
     1114dspnch:         tst.w   P_CF(a6)                | center update ?
     1115                beq     dspnch0                 | jump if not
     1116
     1117                tst.w   E_DATA1(a0)             | punch in ?
     1118                beq     dspnch1                 | jump if not
     1119
     1120                move.w  #AT09,-(a7)             | put attribute on stack
     1121                move.w  #50,-(a7)               | put 1st col on stack
     1122                move.w  #1,-(a7)                | put row on stack
     1123                move.l  _obj8,-(a7)             | put object address on stack
     1124                jsr     _vputa                  | highlight 1st column
     1125                move.w  #51,COL(a7)             | put 2nd col on stack
     1126                jsr     _vputa                  | highlight 2nd col
     1127                add.l   #10,a7                  | clean up stack
     1128                bset    #5,_vrcw+1              | set video reset bit
     1129                bra     dspnch2                 | go do maker update
     1130
     1131dspnch1:        move.w  #AT09,-(a7)             | put attribute on stack
     1132                move.w  #53,-(a7)               | put 1st col on stack
     1133                move.w  #1,-(a7)                | put row on stack
     1134                move.l  _obj8,-(a7)             | put object address on stack
     1135                jsr     _vputa                  | highlight 1st column
     1136                move.w  #54,COL(a7)             | put 2nd col on stack
     1137                jsr     _vputa                  | highlight 2nd column
     1138                move.w  #55,COL(a7)             | put 3rd col on stack
     1139                jsr     _vputa                  | highlight 3rd column
     1140                add.l   #10,a7                  | clean up stack
     1141                bset    #6,_vrcw+1              | set video reset bit
     1142
     1143dspnch2:        jsr     _dsgmodz                | display updated modes
     1144                tst.w   _ctrsw                  | update center for scupd ?
     1145                beq     dsexit                  | done if not
     1146
     1147dspnch0:        move.l  _gdfsep,d0              | quit if no elements left
     1148                beq     dsexit                  | ...
     1149
     1150                movea.l d0,a1                   | a1 = gdsp
     1151                move.l  G_NEXT(a1),_gdfsep      | gdfsep = gdsp->next
     1152                move.w  #60,d2                  | d2 = event PRIORITY | 4
     1153                movea.l P_SL(a6),a2             | a2 points at gdstb
     1154                move.l  0(a2,d2.W),G_NEXT(a1)   | gdsp->next = gdstb[pri]
     1155                move.w  #0xCCCC,G_NOTE(a1)      | gdsp->note = COLOR
     1156                tst.w   E_DATA1(a0)             | see which kind we have
     1157                bne     dspnchi                 | jump if 'punch in'
     1158
     1159                move.w  #6,G_CODE(a1)           | gdsp->code = 'out' PATTERN
    11601160                bra     dspnchx
    1161 *
    1162 dspnchi:        move.w  #5,G_CODE(a1)           * gdsp->code = 'in' PATTERN
    1163 *
    1164 dspnchx:        move.l  a1,0(a2,d2.W)           * gdstb[pri] = gdsp
    1165                 bra     dsexit                  * done
    1166 *
    1167                 .page
    1168 *
    1169 * dsbar -- display a bar marker
    1170 * -----    --------------------
    1171 dsbar:          tst.w   P_CF(a6)                * center update ?
    1172                 beq     dsbar0                  * jump if not
    1173 *
    1174                 tst.w   _ctrsw                  * update center for scupd ?
    1175                 beq     dsexit                  * done if not
    1176 *
    1177 dsbar0:         movea.l P_SL(a6),a2             * a2 points at gdstb
    1178                 move.l  #-1,BARFLAG(a2)         * set the bar marker flag
    1179                 bra     dsexit                  * done
    1180 *
    1181                 .page
    1182 *
    1183 * ==============================================================================
     1161
     1162dspnchi:        move.w  #5,G_CODE(a1)           | gdsp->code = 'in' PATTERN
     1163
     1164dspnchx:        move.l  a1,0(a2,d2.W)           | gdstb[pri] = gdsp
     1165                bra     dsexit                  | done
     1166
     1167                .page
     1168
     1169| dsbar -- display a bar marker
     1170| -----    --------------------
     1171dsbar:          tst.w   P_CF(a6)                | center update ?
     1172                beq     dsbar0                  | jump if not
     1173
     1174                tst.w   _ctrsw                  | update center for scupd ?
     1175                beq     dsexit                  | done if not
     1176
     1177dsbar0:         movea.l P_SL(a6),a2             | a2 points at gdstb
     1178                move.l  #-1,BARFLAG(a2)         | set the bar marker flag
     1179                bra     dsexit                  | done
     1180
     1181                .page
     1182
     1183| ==============================================================================
    11841184                .data
    1185 * ==============================================================================
    1186 *
    1187 * sddtab -- score display dispatch table -- MUST match score.h definitions
    1188 * ------    ----------------------------    ------------------------------
    1189 sddtab:         dc.l    dsexit          * 0     null
    1190                 dc.l    dsexit          * 1     score begin
    1191                 dc.l    dssbgn          * 2     section begin
    1192                 dc.l    dssend          * 3     section end
    1193                 dc.l    dsinst          * 4     instrument change
    1194                 dc.l    dsnbx           * 5     note begin
    1195                 dc.l    dsnex           * 6     note end
    1196                 dc.l    dsstop          * 7     stop
    1197                 dc.l    dsintp          * 8     interpolate
    1198                 dc.l    dstmpo          * 9     tempo
    1199                 dc.l    dstune          * 10    tuning
    1200                 dc.l    dsgrp           * 11    group status
    1201                 dc.l    dslocn          * 12    location
    1202                 dc.l    dsdyn           * 13    dynamics
    1203                 dc.l    dsanvl          * 14    analog value
    1204                 dc.l    dsanrs          * 15    analog resolution
    1205                 dc.l    dsasgn          * 16    I/O assign
    1206                 dc.l    dstrns          * 17    transposition
    1207                 dc.l    dsexit          * 18    repeat
    1208                 dc.l    dspnch          * 19    punch in/out
    1209                 dc.l    dsexit          * 20    polyphonic pressure
    1210                 dc.l    dsexit          * 21    score end
    1211                 dc.l    dsexit          * 22    channel pressure
    1212                 dc.l    dsbar           * 23    bar marker
    1213                 dc.l    dsnext          * 24    next score
    1214 *
    1215 * ==============================================================================
     1185| ==============================================================================
     1186
     1187| sddtab -- score display dispatch table -- MUST match score.h definitions
     1188| ------    ----------------------------    ------------------------------
     1189sddtab:         dc.l    dsexit          | 0     null
     1190                dc.l    dsexit          | 1     score begin
     1191                dc.l    dssbgn          | 2     section begin
     1192                dc.l    dssend          | 3     section end
     1193                dc.l    dsinst          | 4     instrument change
     1194                dc.l    dsnbx           | 5     note begin
     1195                dc.l    dsnex           | 6     note end
     1196                dc.l    dsstop          | 7     stop
     1197                dc.l    dsintp          | 8     interpolate
     1198                dc.l    dstmpo          | 9     tempo
     1199                dc.l    dstune          | 10    tuning
     1200                dc.l    dsgrp           | 11    group status
     1201                dc.l    dslocn          | 12    location
     1202                dc.l    dsdyn           | 13    dynamics
     1203                dc.l    dsanvl          | 14    analog value
     1204                dc.l    dsanrs          | 15    analog resolution
     1205                dc.l    dsasgn          | 16    I/O assign
     1206                dc.l    dstrns          | 17    transposition
     1207                dc.l    dsexit          | 18    repeat
     1208                dc.l    dspnch          | 19    punch in/out
     1209                dc.l    dsexit          | 20    polyphonic pressure
     1210                dc.l    dsexit          | 21    score end
     1211                dc.l    dsexit          | 22    channel pressure
     1212                dc.l    dsbar           | 23    bar marker
     1213                dc.l    dsnext          | 24    next score
     1214
     1215| ==============================================================================
    12161216                .bss
    1217 * ==============================================================================
    1218 *
    1219 * globals:
    1220 * --------
    1221 _ac_code:       ds.b    1               * accidental code
    1222 *
    1223 * locals:
    1224 * -------
    1225 numstr:         ds.b    65              * video display update work area
    1226 *
    1227 * ------------------------------------------------------------------------------
    1228 *
     1217| ==============================================================================
     1218
     1219| globals:
     1220| --------
     1221_ac_code:       ds.b    1               | accidental code
     1222
     1223| locals:
     1224| -------
     1225numstr:         ds.b    65              | video display update work area
     1226
     1227| ------------------------------------------------------------------------------
     1228
    12291229                .end
Note: See TracChangeset for help on using the changeset viewer.