[3ae31e9] | 1 | * ------------------------------------------------------------------------------
|
---|
| 2 | * execins.s -- execute an instrument selection
|
---|
| 3 | * Version 9 -- 1988-09-09 -- D.N. Lynx Crowe
|
---|
| 4 | *
|
---|
| 5 | * Hand optimized C object code from: execins.c -- ver 2 -- 1988-06-29
|
---|
| 6 | * ------------------------------------------------------------------------------
|
---|
| 7 | *
|
---|
| 8 | .text
|
---|
| 9 | *
|
---|
| 10 | DOUBLED .equ 1 * double output to WS table
|
---|
| 11 | *
|
---|
| 12 | .xdef _execins
|
---|
| 13 | *
|
---|
| 14 | .xref _clrvce
|
---|
| 15 | .xref _execkey
|
---|
| 16 | *
|
---|
| 17 | .xref _io_fpu
|
---|
| 18 | .xref _instmod
|
---|
| 19 | .xref _s_inst
|
---|
| 20 | .xref _idefs
|
---|
| 21 | .xref _vbufs
|
---|
| 22 | *
|
---|
| 23 | * register equates
|
---|
| 24 | * ----------------
|
---|
| 25 | SYNC .equ D4
|
---|
| 26 | OLDSR .equ D5
|
---|
| 27 | VCE .equ D7
|
---|
| 28 | *
|
---|
| 29 | IP .equ A5
|
---|
| 30 | P1 .equ A4
|
---|
| 31 | P2 .equ A3
|
---|
| 32 | *
|
---|
| 33 | P3 .equ A2
|
---|
| 34 | P4 .equ A1
|
---|
| 35 | *
|
---|
| 36 | * parameter offsets
|
---|
| 37 | * -----------------
|
---|
| 38 | VOICE .equ 8
|
---|
| 39 | INS .equ 10
|
---|
| 40 | TAG .equ 12
|
---|
| 41 | *
|
---|
| 42 | .page
|
---|
| 43 | *
|
---|
| 44 | _execins: link A6,#0 * link stack frames
|
---|
| 45 | movem.l D3-VCE/P2-IP,-(sp) * preserve registers
|
---|
| 46 | move.w VOICE(A6),VCE * get voice number
|
---|
| 47 | move.w VCE,D0 * calculate IP
|
---|
| 48 | add.w D0,D0 * ...
|
---|
| 49 | add.w D0,D0 * ...
|
---|
| 50 | lea vibtabl,A0 * ...
|
---|
| 51 | movea.l 0(A0,D0.W),IP * ...
|
---|
| 52 | add.l #_vbufs,IP * ...
|
---|
| 53 | move.w VCE,(sp) * clrvce(vce)
|
---|
| 54 | jsr _clrvce * ...
|
---|
| 55 | tst.w TAG(A6) * if (tag) {
|
---|
| 56 | beq L2 * ...
|
---|
| 57 | *
|
---|
| 58 | move.l IP,P1 * p1 = ip;
|
---|
| 59 | move.w INS(A6),D0 * p2 = &idefs[ins]
|
---|
| 60 | add.w D0,D0 * ...
|
---|
| 61 | add.w D0,D0 * ...
|
---|
| 62 | lea vibtabl,A0 * ...
|
---|
| 63 | movea.l 0(A0,D0.W),P2 * ...
|
---|
| 64 | add.l #_idefs,P2 * ...
|
---|
| 65 | move.w #1968,D0 * set move count
|
---|
| 66 | *
|
---|
| 67 | L6: move.w (P2)+,(P1)+ * load voice buffer
|
---|
| 68 | dbra D0,L6 * ...
|
---|
| 69 | *
|
---|
| 70 | .page
|
---|
| 71 | *
|
---|
| 72 | move.w VCE,D0 * calculate FPU offset for voice
|
---|
| 73 | move.w #9,D1 * ...
|
---|
| 74 | asl.w D1,D0 * ...
|
---|
| 75 | asl.w #1,D0 * ...
|
---|
| 76 | ext.l D0 * ...
|
---|
| 77 | move.l D0,P1 * ...
|
---|
| 78 | move.l D0,P3 * ...
|
---|
| 79 | add.l #_io_fpu,P1 * point P1 at FPU WS A
|
---|
| 80 | add.l #$202,P1 * ...
|
---|
| 81 | lea 1778(IP),P2 * point P2 at instdef WS A
|
---|
| 82 | add.l #_io_fpu,P3 * point P3 at FPU WS B
|
---|
| 83 | add.l #2,P3 * ...
|
---|
| 84 | lea 2858(IP),P4 * point P4 at instdef WS B
|
---|
| 85 | move.w #253,D0 * setup move count
|
---|
| 86 | *
|
---|
| 87 | .ifne DOUBLED
|
---|
| 88 | move.l P1,-(a7) * save P1 on stack
|
---|
| 89 | move.l P2,-(a7) * save P2 on stack
|
---|
| 90 | move.l P3,-(a7) * save P3 on stack
|
---|
| 91 | move.l P4,-(a7) * save P4 on stack
|
---|
| 92 | move.w D0,-(a7) * save D0 on stack
|
---|
| 93 | .endc
|
---|
| 94 | *
|
---|
| 95 | move.w SR,OLDSR * turn off FPU interrupts
|
---|
| 96 | move.w #$2200,SR * ...
|
---|
| 97 | *
|
---|
| 98 | L10: move.w (P2)+,(P1)+ * set FPU WS A from instdef
|
---|
| 99 | nop * delay for FPU timing
|
---|
| 100 | nop * ...
|
---|
| 101 | nop * ...
|
---|
| 102 | move.w (P4)+,(P3)+ * set FPU WS B from instdef
|
---|
| 103 | nop * delay for FPU timing
|
---|
| 104 | nop * ...
|
---|
| 105 | dbra D0,L10 * loop until done
|
---|
| 106 | *
|
---|
| 107 | .ifne DOUBLED
|
---|
| 108 | move.w (a7)+,D0 * restore D0 from stack
|
---|
| 109 | movea.l (a7)+,P4 * restore P4 from stack
|
---|
| 110 | movea.l (a7)+,P3 * restore P3 from stack
|
---|
| 111 | movea.l (a7)+,P2 * restore P2 from stack
|
---|
| 112 | movea.l (a7)+,P1 * restore P1 from stack
|
---|
| 113 | *
|
---|
| 114 | L10A: move.w (P2)+,(P1)+ * set FPU WS A from instdef
|
---|
| 115 | nop * delay for FPU timing
|
---|
| 116 | nop * ...
|
---|
| 117 | nop * ...
|
---|
| 118 | move.w (P4)+,(P3)+ * set FPU WS B from instdef
|
---|
| 119 | nop * delay for FPU timing
|
---|
| 120 | nop * ...
|
---|
| 121 | dbra D0,L10A * loop until done
|
---|
| 122 | *
|
---|
| 123 | .endc
|
---|
| 124 | *
|
---|
| 125 | move.w OLDSR,SR * enable FPU interrupts
|
---|
| 126 | *
|
---|
| 127 | .page
|
---|
| 128 | *
|
---|
| 129 | move.w VCE,A0 * instmod[vce] = FALSE
|
---|
| 130 | add.l A0,A0 * ...
|
---|
| 131 | add.l #_instmod,A0 * ...
|
---|
| 132 | clr.w (A0) * ...
|
---|
| 133 | move.w VCE,A0 * s_inst[vce] = ins
|
---|
| 134 | add.l A0,A0 * ...
|
---|
| 135 | add.l #_s_inst,A0 * ...
|
---|
| 136 | move.w INS(A6),(A0) * ...
|
---|
| 137 | move.b 70(IP),SYNC * get config bits
|
---|
| 138 | ext.w SYNC * ...
|
---|
| 139 | asl.w #8,SYNC * ...
|
---|
| 140 | btst #2,74(IP) * sync 2nd osc
|
---|
| 141 | beq L15 * ...
|
---|
| 142 | *
|
---|
| 143 | ori.w #$2000,SYNC * ...
|
---|
| 144 | *
|
---|
| 145 | L15: btst #2,75(IP) * sync 3rd osc
|
---|
| 146 | beq L16 * ...
|
---|
| 147 | *
|
---|
| 148 | ori.w #$4000,SYNC * ...
|
---|
| 149 | *
|
---|
| 150 | L16: btst #2,76(IP) * sync 4th osc
|
---|
| 151 | beq L17 * ...
|
---|
| 152 | *
|
---|
| 153 | ori.w #$8000,SYNC * ...
|
---|
| 154 | *
|
---|
| 155 | L17: move.w VCE,A0 * send sync to FPU
|
---|
| 156 | add.l A0,A0 * ...
|
---|
| 157 | add.l #_io_fpu,A0 * ...
|
---|
| 158 | add.l #$5FE0,A0 * ...
|
---|
| 159 | move.w SYNC,(A0) * ...
|
---|
| 160 | *
|
---|
| 161 | L2: move.w #1,(sp) * execkey(-1, 0, vce, 1)
|
---|
| 162 | move.w VCE,-(sp) * ...
|
---|
| 163 | clr.w -(sp) * ...
|
---|
| 164 | move.w #-1,-(sp) * ...
|
---|
| 165 | jsr _execkey * ...
|
---|
| 166 | addq.l #6,sp * ...
|
---|
| 167 | tst.l (sp)+ * clean up stack
|
---|
| 168 | movem.l (sp)+,SYNC-VCE/P2-IP * restore registers
|
---|
| 169 | unlk A6 * unlink stack frames
|
---|
| 170 | rts * return
|
---|
| 171 | *
|
---|
| 172 | .page
|
---|
| 173 | *
|
---|
| 174 | .data
|
---|
| 175 | *
|
---|
| 176 | * vibtabl -- voice and instrument buffer offset table
|
---|
| 177 | * ------- ----------------------------------------
|
---|
| 178 | vibtabl: .dc.l 0 * 0
|
---|
| 179 | .dc.l 3938 * 1
|
---|
| 180 | .dc.l 7876 * 2
|
---|
| 181 | .dc.l 11814 * 3
|
---|
| 182 | .dc.l 15752 * 4
|
---|
| 183 | .dc.l 19690 * 5
|
---|
| 184 | .dc.l 23628 * 6
|
---|
| 185 | .dc.l 27566 * 7
|
---|
| 186 | .dc.l 31504 * 8
|
---|
| 187 | .dc.l 35442 * 9
|
---|
| 188 | .dc.l 39380 * 10
|
---|
| 189 | .dc.l 43318 * 11
|
---|
| 190 | .dc.l 47256 * 12
|
---|
| 191 | .dc.l 51194 * 13
|
---|
| 192 | .dc.l 55132 * 14
|
---|
| 193 | .dc.l 59070 * 15
|
---|
| 194 | .dc.l 63008 * 16
|
---|
| 195 | .dc.l 66946 * 17
|
---|
| 196 | .dc.l 70884 * 18
|
---|
| 197 | .dc.l 74822 * 19
|
---|
| 198 | .dc.l 78760 * 20
|
---|
| 199 | .dc.l 82698 * 21
|
---|
| 200 | .dc.l 86636 * 22
|
---|
| 201 | .dc.l 90574 * 23
|
---|
| 202 | .dc.l 94512 * 24
|
---|
| 203 | .dc.l 98450 * 25
|
---|
| 204 | .dc.l 102388 * 26
|
---|
| 205 | .dc.l 106326 * 27
|
---|
| 206 | .dc.l 110264 * 28
|
---|
| 207 | .dc.l 114202 * 29
|
---|
| 208 | .dc.l 118140 * 30
|
---|
| 209 | .dc.l 122078 * 31
|
---|
| 210 | .dc.l 126016 * 32
|
---|
| 211 | .dc.l 129954 * 33
|
---|
| 212 | .dc.l 133892 * 34
|
---|
| 213 | .dc.l 137830 * 35
|
---|
| 214 | .dc.l 141768 * 36
|
---|
| 215 | .dc.l 145706 * 37
|
---|
| 216 | .dc.l 149644 * 38
|
---|
| 217 | .dc.l 153582 * 39
|
---|
| 218 | .dc.l 157520 * 40
|
---|
| 219 | *
|
---|
| 220 | .end
|
---|