|
|
1.1 ! root 1: _dspbase:: ! 2: .dsp ! 3: .org $f1b000 ! 4: ! 5: ! 6: RISC_FLAGS .equ $f1a100 ! 7: MODMASK .equ $f1a118 ! 8: DIVCONTROL .equ $f1a11c ! 9: ! 10: ;MAIN_STACK .equ $f1d000 ! 11: MAIN_STACK .equ $f1ce00 ! 12: PERM_DATA .equ $f1ce00 ! 13: LOADPOINT .equ $f1b140 ! 14: ! 15: _soundbuffer == $1f0000 ! 16: ! 17: R_DAC .equ $f1a148 ! 18: L_DAC .equ $f1a14c ! 19: ! 20: ;============================================================================= ! 21: ! 22: S_LE .ccdef $14 ; PL ! 23: U_LE .ccdef $04 ; CC ! 24: S_GT .ccdef $18 ; MI ! 25: U_GT .ccdef $08 ; CS ! 26: ! 27: S_LT .ccdef $15 ; PL+NE ! 28: U_LT .ccdef $05 ; CC+NE ! 29: ! 30: FP .equr r14 ! 31: scratch .equr r10 ! 32: scratch2 .equr r11 ! 33: RETURNVALUE .equr r29 ! 34: RETURNPOINT .equr r28 ! 35: MATH_A .equr r27 ! 36: MATH_B .equr r26 ! 37: MATH_C .equr r25 ! 38: MATH_RTS .equr r24 ! 39: MATH_SIGN .equr r23 ! 40: ! 41: ;============================================================================== ! 42: ! 43: nop ! 44: nop ! 45: nop ! 46: nop ! 47: nop ! 48: nop ! 49: nop ! 50: nop ! 51: ! 52: ALT_RISC_FLAGS .equr r13 ! 53: ALT_FLAGSTEMP .equr r14 ! 54: ALT_PCTEMP .equr r15 ! 55: ALT_SAMPLECOUNT_P .equr r16 ! 56: ALT_SCRATCH .equr r17 ! 57: ALT_LDAC .equr r18 ! 58: ALT_RDAC .equr r19 ! 59: ALT_STACKRESET .equr r20 ! 60: ALT_SAMPLE_P .equr r21 ! 61: ALT_SAMPLE .equr r22 ! 62: ALT_SAMPLECOUNT .equr r23 ! 63: ! 64: ;---------------------- ! 65: ; ! 66: ; int_1 ! 67: ; ! 68: ; Sample output ! 69: ; org $f1b010 ! 70: ;---------------------- ! 71: int_1: ! 72: load (ALT_RISC_FLAGS),ALT_FLAGSTEMP ; get current flags ! 73: ; start load of sample from external memory ! 74: loadw (ALT_SAMPLE_P),ALT_SAMPLE ! 75: addqmod #2,ALT_SAMPLE_P ; bump sample pos after getting flags ! 76: ! 77: ; start interrupt cleanup ! 78: bclr #3,ALT_FLAGSTEMP ; clear IMASK ! 79: bset #10,ALT_FLAGSTEMP ; and interrupt 1 latch ! 80: addq #1,ALT_SAMPLECOUNT ; bump fast timing counter ! 81: ! 82: load (r31),ALT_PCTEMP ; get last instruction address ! 83: move ALT_STACKRESET,r31 ; reset stack to safe spot ! 84: addq #2,ALT_PCTEMP ; point to next instruction to execute ! 85: store ALT_SAMPLECOUNT,(ALT_SAMPLECOUNT_P) ; store it to memory ! 86: ! 87: ; play left and right samples through dacs ! 88: store ALT_SAMPLE,(ALT_LDAC) ! 89: store ALT_SAMPLE,(ALT_RDAC) ! 90: ! 91: ; return from interrupt ! 92: jump T,(ALT_PCTEMP) ; return ! 93: store ALT_FLAGSTEMP,(ALT_RISC_FLAGS) ; restore flags ! 94: ! 95: .long ! 96: ! 97: _samplecount:: .dc.l 0 ! 98: ! 99: _dspcodestart:: .dc.l 0 ! 100: _dspfinished:: .dc.l $def6 ! 101: ! 102: _olddspcodestart:: .dc.l 0 ! 103: ! 104: _int_stack: .dc.l 0,0,0,0 ; give it some room to be flaky... ! 105: ! 106: ;-------------------- ! 107: ; ! 108: ; startup code ! 109: ; ! 110: ;-------------------- ! 111: _dspbase_init:: ! 112: ; ! 113: ; set up bank 0 registers for interrupt usage ! 114: ; ! 115: movei #RISC_FLAGS,ALT_RISC_FLAGS ! 116: movei #_samplecount,ALT_SAMPLECOUNT_P ! 117: movei #L_DAC,ALT_LDAC ! 118: movei #R_DAC,ALT_RDAC ! 119: movei #_int_stack+8,ALT_STACKRESET ! 120: movei #_soundbuffer,ALT_SAMPLE_P ! 121: moveq #0,ALT_SAMPLECOUNT ! 122: ! 123: movei #MODMASK,scratch ! 124: movei #$ffffe000,scratch2 ! 125: store scratch2,(scratch) ; set up for 16k circular buffers ! 126: ! 127: move ALT_STACKRESET,r31 ; in register bank 0 ! 128: ! 129: movei #(1<<5)+(1<<14),r0 ; enable I2S interrupts and regpage ! 130: store r0,(ALT_RISC_FLAGS) ! 131: ! 132: nop ; wait for the reg page to flip ! 133: nop ! 134: nop ! 135: nop ! 136: ! 137: ;-------------------- ! 138: ; ! 139: ; wait for a load command ! 140: ; ! 141: ;-------------------- ! 142: nothingwaiting: ! 143: ! 144: waitcmd: ! 145: movei #_dspcodestart,r2 ! 146: load (r2),r1 ! 147: or r1,r1 ! 148: jr EQ,nothingwaiting ! 149: nop ! 150: ! 151: ; ! 152: ; if still in memory, skip the load ! 153: ; ! 154: movei #_olddspcodestart,r3 ! 155: load (r3),r4 ! 156: cmp r1,r4 ! 157: movei #skipload,r5 ! 158: jump EQ,(r5) ; still in memory ! 159: store r1,(r3) ; delay slot ! 160: ! 161: move r1,r2 ! 162: subq #4,r2 ; code size is just before start ! 163: load (r2),r2 ! 164: addq #7,r2 ! 165: shrq #3,r2 ; number of phrases to bopy ! 166: ! 167: movei #LOADPOINT,r0 ; destination for code ! 168: move r1,r3 ! 169: move r0,r4 ! 170: addq #4,r3 ! 171: addq #4,r4 ! 172: loadloop: ! 173: load (r1),r5 ! 174: load (r3),r6 ! 175: store r5,(r0) ! 176: addqt #8,r1 ! 177: addqt #8,r3 ! 178: store r6,(r4) ! 179: subq #1,r2 ; decrement count ! 180: addqt #8,r4 ! 181: jr PL,loadloop ! 182: addqt #8,r0 ! 183: nop ! 184: ! 185: ; ! 186: ; call it ! 187: ; ! 188: skipload: ! 189: movei #LOADPOINT,r0 ! 190: movei #dspreturn,RETURNPOINT ! 191: movei #MAIN_STACK,r14 ! 192: ! 193: jump T,(r0) ! 194: nop ! 195: ! 196: dspreturn: ! 197: movei #_dspcodestart,r2 ! 198: moveq #0,r0 ! 199: store r0,(r2) ; dspcodestart = 0 ! 200: ! 201: movei #_dspfinished,r2 ! 202: movei #$def6,r0 ! 203: store r0,(r2) ; dspcodestart = 0 ! 204: ! 205: movei #waitcmd,r0 ! 206: jump T,(r0) ! 207: nop ! 208: ! 209: ! 210: ! 211: ! 212: .phrase ! 213: .68000
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.