home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / falcon / sound / dsppaula / dsppav22.q < prev    next >
Text File  |  1993-11-01  |  20KB  |  598 lines

  1. ;Hallo Independent-Members:
  2. ;so, hier die fertige Version von unserem DSP-Player.
  3. ;Bitte nur innerhalb der Independent benutzen. Falls jemand außerhalb
  4. ;der Independent die Rout benutzen möchte, mich vorher fragen
  5. ;(an sich kein Problem, aber nur damit ich Bescheid weiß)!!
  6. ;
  7. ;signed: Chris of AURA of the Independent
  8.  
  9. ;Versin V2.2: done at Risk-HQ 30.10-1.11.93
  10. ;             DSP-Paula fäuft nun auch mit anderen DSP-Programmen
  11. ;              L-R-Kanäle werden nun nicht mehr vertauscht.
  12.  
  13.  
  14.  
  15. example:    equ    -1                        ;0=kein Beispiel
  16.  
  17.         mc68030
  18.  
  19.     IFNE    example=-1
  20.         opt    d+
  21.  
  22.         pea        prg
  23.         move.w  #38,-(sp)
  24.         trap    #14
  25.         clr.w    -(sp)
  26.         trap     #1
  27. prg:
  28.         bclr    #5,$fffffa09.w
  29.         bsr        dsp_system                ;DSP installieren
  30.  
  31. prescale:        equ    1                      ;PCM-Prescale
  32. ssi_or_host:    equ    -1                     ;0=Host/-1=SSI
  33. vbl_or_timer:    equ    -1                     ;0=VBL/-1=Timer-A
  34. vga_flag:        equ    0                    ;0=ext. Lautspr./-1=int. Lautspr.
  35.  
  36.     IFNE    vga_flag=0
  37.          move.b    #14,$ffff8800.w
  38.         move.b    $ffff8800.w,d0
  39.         bset    #6,d0
  40.         move.b    d0,$ffff8802.w
  41.     ELSE
  42.         move.b    #14,$ffff8800.w
  43.         move.b    $ffff8800.w,d0
  44.         bclr    #6,d0
  45.         move.b    d0,$ffff8802.w
  46.     ENDIF
  47.         lea        module,a0                ;Moduladresse
  48.         bsr        ice_decrunch_2            ;File gegf. vorher decrunchen
  49.  
  50.         move.w    #prescale,d0            ;PCM-Prescale-Code
  51.         moveq    #ssi_or_host,d1            ;SSI oder Host-Ausgabe
  52.         moveq    #vbl_or_timer,d2
  53.     IFNE    vbl_or_timer=-1
  54.         lea        timer_a_irq,a1            ;Timer-A-IRQ-Adr. bei d2=-1
  55.     ENDIF
  56.         bsr        ap_grand_init            ;Hauptinstallation
  57.  
  58.         move.w    #$8000,main_voice
  59.         move.w    #$3919,d0
  60.          movec    d0,cacr
  61.         
  62.         pea    info(pc)
  63.         move.w    #9,-(sp)
  64.         trap    #1
  65.         addq.w    #6,sp
  66.  
  67.     IFNE    vbl_or_timer=0        
  68.         move.l    #play,$4d2.w
  69.     ENDIF
  70.         clr.l    $4d6.w
  71. wait2:    cmp.b    #$39,$fffffc02.w
  72.         bne.s    wait2
  73.  
  74.         moveq    #0,d7
  75.         move.w    main_voice(pc),d7
  76. fade_out:
  77.         move.w    #37,-(sp)
  78.         trap    #14
  79.         addq.w    #2,sp
  80.         move.w    d7,main_voice
  81.         sub.l    #$200,d7
  82.         bpl.s    fade_out
  83.  
  84.         bsr        ap_small_deinit                
  85.         clr.l    $4d2.w        
  86.         move.w    #$0fff,$ffff8240.w
  87.         bset    #5,$fffffa09.w
  88.         rts
  89.  
  90. info:   dc.b 27,"EDSP-Paula V2.2/Proplayer 3.0B",13,10
  91.         dc.b    "coded by Chris of AURA/15.05.93",13,10
  92.         dc.b    "now playing real 50 KHz/16 Bit/SSI-Output.",13,10,13,10
  93.         dc.b    "blue       : required time to swap sampledata with DSP",13,10
  94.         dc.b    "             +AMIGA-Proplayer",13,10
  95.         dc.b    "blue+yellow: total DSP-time",13,10
  96.         dc.b    "red        : free DSP time",13,10
  97.         dc.b    "red+yellow : free CPU time",0        
  98.  
  99. play:
  100.         movem.l    d0-a6,-(sp)
  101.         move.w    #10000,d0
  102. wait:    dbra    d0,wait
  103.         move.w    #$007,$ffff8240.w
  104.         move.l    #$ff,$ffff9800.w
  105.         bsr        ap_dsp_paula_do
  106.         move.w    #$770,$ffff8240.w
  107.         move.l    #$ffff0000,$ffff9800.w
  108. sss:    btst    #3,$ffffa202.w            ;Bit zum Testen ob DSP mit
  109.         bne.s    sss                     ;der Vorberechnung fertig ist
  110.         move.w    #$700,$ffff8240.w        ;und somit weiter benutzt werden
  111.         move.l    #$ff000000,$ffff9800.w    ;kann
  112.         movem.l    (sp)+,d0-a6
  113.         rts
  114.  
  115. timer_a_irq:
  116.         movem.l    d0-a6,-(sp)
  117.         move.w    #$007,$ffff8240.w
  118.         bsr        ap_dsp_paula_do
  119.         move.w    #$770,$ffff8240.w
  120. ssss:    btst    #3,$ffffa202.w            ;Bit zum Testen ob DSP mit
  121.         bne.s    ssss                    ;der Vorberechnung fertig ist
  122.         move.w    #$700,$ffff8240.w        ;und somit weiter benutzt werden
  123.                                         ;kann
  124.         movem.l    (sp)+,d0-a6
  125.         rte
  126.  
  127.             path "d:\source\dsppaula\"
  128.             include "ice_unp2.s"
  129. ;!!!!!ADS muß mit diesem Label eingebunden werden!!!!!
  130. dsp_system:    path "d:\source\aura_dsp.sys\"
  131.             inline    "dsp_sy11.inl"
  132.     ENDIF
  133. *****************************************************************************
  134. **************************    D S P - P A U L A    **************************
  135. ****************  coded by Chris of AURA of the INDEPENDENT  ****************
  136. ****************************   DSP-Paula V2.2   *****************************
  137. ************************** Host- and SSI-Version ****************************
  138. **********************  AMIGA-Proplayer V1.1B/V3.0B  ************************
  139. ************************  first code  :  14.04.93  **************************
  140. ************************  last changes:  15.05.93  **************************
  141. *****************************************************************************
  142. ************************** about 85-95% CPU free ****************************
  143. ************************** about 75-90% DSP free ****************************
  144. ****************  thanx to bITmASTER and Questor of Inter  ******************
  145. ************************** for the SSI-Information **************************
  146. *****************************************************************************
  147. ;Hinweise zum DSP-Coding mit der DSP-Paula:
  148. ;------------------------------------------
  149. ;>>Host-Betrieb<<
  150. ;- alle Register sind frei
  151. ;- Host-Command 1 ist belegt
  152. ;- P-Speicher $2C46 bis $4000 ist von der DSP-Paula belegt
  153. ;- nach Ausführung des Hostcommands steht die volle Rechenzeit zur Verfügung
  154.  
  155. ;>>SSI-Betrieb<<
  156. ;- r7/m7 werden für den SSI-IRQ benötigt, sonst sind alle Register frei
  157. ;- Host-Command 1 ist belegt
  158. ;- P-Speicher $2444 bis $4000 ist von der DSP-Paula belegt
  159. ;- während und nach der Ausführung des Hostcommands ist der SSI-IRQ aktiv
  160. ;  und muß laufende Programme unterbrechen können. Der SSI-IRQ benötigt
  161. ;  aber nur 4 Tz, somit ist er keine große Bremse.
  162.  
  163. ;Hinweise zum MC-Coding:
  164. ;------------------------------------------
  165. ;- der Code ist nur an den zeitkritischen Stellen optimiert, also nicht
  166. ;  schimpfen.
  167. ;- programmiert mit dem EasyAss 4.0L.
  168. ;
  169. ;1. Bra: Initialisierung.
  170. ;        d0.w: PCM-Prescalewert von 1-5 und 7
  171. ;         d1.w: -1: SSI-Paula  (schneller, kann aber für DSP-Coder
  172. ;                               ungeeignet sein, da SSI-IRQ)
  173. ;                0: Host-Paula (langsamer, aber für DSP-Coder geeignet, da
  174. ;                               kein SSI-IRQ dazwischenfunkt)
  175. ;         d2.w: -1: Timer-A-IRQ (in a1 wird die IRQ-Adr. erwartet)
  176. ;                0: 50Hz-VBL
  177. ;        a0.l: Moduladresse
  178. ;        a1.l: Adr. des Timer-A-IRQs bei d2.w=-1
  179. ;2. Bra: Paula-Emulation+AMIGA-Proplayer, im IRQ benutzen
  180. ;        bei d2.w= 0: in den 50Hz-VBL hängen
  181. ;         bei d2.w=-1: in den Timer-A-IRQ hängen dessen Startadr. in a1 
  182. ;                      erwartet wird
  183. ;3. Bra: Deinstallation
  184.     TEXT
  185. dsp_paula:
  186.         bra.w    ap_grand_init            ;Installation 
  187.         bra.w    ap_dsp_paula_do            ;VBL-IRQ
  188.         bra.w    ap_small_deinit            ;Deinstallation        
  189. main_voice:        dc.w    $ffff            ;Hauptlautstärke 16 Bit (0-$ffff)
  190. ***************************************************************************
  191. ;Schnittstelle zwischen Player und DSP-Paula
  192. ;vor jedem Player-Aufruf anspringen
  193. ***************************************************************************
  194.     TEXT
  195. ap_dsp_paula_do:
  196.          move.b    #$93,$ffffa201.w        ;DSP-Paula im DSP starten
  197.         tst.w    ap_ssi_flag(pc)            ;SSI-Version?
  198.         bne.s    ap_no_dma_set
  199.         movem.l    ap_pcm_buf_adr(pc),d0/a0    ;PCM-Pufferadressen
  200.         exg.l    d0,a0
  201.         movem.l    d0/a0,ap_pcm_buf_adr    ;vertauschen
  202.  
  203.         lea        $ffff8900.w,a1            ;PCM-Basisadr.
  204.         clr.w    (a1)
  205.         movep.w    d0,5(a1)                ;Lowbyte/Midbyte
  206.         swap    d0
  207.         move.b    d0,3(a1)                ;Highbyte
  208.         move.w    #$3,(a1)                ;DMA-an
  209. ap_no_dma_set:
  210.         movec    cacr,d0                    ;CACR holen
  211.         move.w    d0,cacr_rett            ;retten
  212.         move.w    #$3919,d0                ;I- und D-Cache an + Burstmode
  213.         movec    d0,cacr                    ;Cache setzen
  214.         lea        $ffffa200.w,a1            ;DSP-Basisadr.
  215.         lea        6(a1),a3
  216. ap_wait_to_command:
  217.         btst    #3,2(a1)                ;HF2-Bit zum Testen ob DSP-Paula 
  218.         beq.s    ap_wait_to_command        ;bereit ist
  219.  
  220.         tst.w    ap_ssi_flag(pc)            ;SSI-Version angewählt?
  221.         bne        ap_ssi_do_it            ;>> SSI erledigt den Job
  222. ;vorberechnete PCM-Daten vom DSP abholen
  223. ap_sam_clc_lp:
  224.         move.w    #0,d0                    ;Schleifenanzahl holen
  225. ap_dspcopy_to_pcmbuf:                
  226.     REPEAT
  227.          move.w    (a3),(a0)+                ;vorberechnete Daten in den Puffer
  228.     UNTIL    #31
  229.         subq.w    #1,d0
  230.         bgt.s    ap_dspcopy_to_pcmbuf        
  231. ap_dsp_copy_jmp:
  232.         bra.s    *+0                        ;Aussprung
  233.     REPEAT
  234.         move.w    (a3),(a0)+
  235.     UNTIL    #31
  236.     REPEAT
  237.         move.w    -2(a0),(a0)+            ;Knacksen verhindern
  238.     UNTIL    #7    
  239. ap_ssi_do_it:
  240.         lea        DFF0A0(pc),a0            ;Stimme 1 Basisadr.
  241.         moveq    #0,d1                    ;DMA-Bit 0
  242.         bsr.s    ap_compute_voice
  243.         lea        DFF0B0(pc),a0            ;Stimme 2 Basisadr.
  244.         moveq    #1,d1                    ;DMA-Bit 1
  245.         bsr.s    ap_compute_voice
  246.         lea        DFF0C0(pc),a0            ;Stimme 3 Basisadr.
  247.         moveq    #2,d1                    ;DMA-Bit 2
  248.         bsr.s    ap_compute_voice
  249.         lea        DFF0D0(pc),a0            ;Stimme 4 Basisadr.
  250.         moveq    #3,d1                    ;DMA-Bit 3
  251.         bsr.s    ap_compute_voice
  252.  
  253.         bsr        ap_playmusic            ;Proplayer
  254.         move.w    cacr_rett(pc),d0
  255.         movec    d0,cacr                    ;CACR zurücksetzen
  256.         rts
  257.     DATA
  258. cacr_rett:    dc.w    0
  259.     TEXT
  260. ap_compute_voice:
  261.         moveq    #0,d0
  262.         move.w    (a3),d0                    ;Anzahl der tatsächlich bearb. Bytes holen
  263.  
  264.         btst    d1,dff096+1(pc)            ;DMA-Bit an?
  265.         beq.s    ap_compute_dum_sample    ;an >> Sample abarbeiten
  266.         tst.b    (a0)                    ;wurde neues Sample eingetragen?
  267.         bmi.s    ap_no_new_sample
  268. ;neues Sample im Anmarsch
  269.         moveq    #0,d0                    ;Anzahl löschen da Samplebeginn erforderlich
  270.         st        (a0)                    ;Sampleadr. markieren
  271. ;altes Sample wird weiterbearbeitet
  272. ap_no_new_sample:
  273.         move.l    (a0),a2                    ;akt. Sampleadr. holen
  274.         add.w    d0,a2                    ;+Sample-Anzahl >> neue Sampleadr.
  275.         asr.w    #1,d0                    ;/2
  276.         moveq    #0,d7
  277.         move.w    4(a0),d7                ;akt. Samplelänge holen
  278.         sub.l    d0,d7                    ;Samplelänge verringern>> neue Samplelänge
  279.         bgt.s    ap_compute_sample        ;noch >0 >> Sampleende nicht erreicht
  280.  
  281. ;Test auf Samplerepeat
  282.         move.l    d7,d6
  283.         move.w    14(a0),d7                ;Repeatlänge holen
  284.         cmp.w    #1,d7                    ;Länge<=1 >> Sample zuende
  285.         bhi.s    ap_sample_repeat
  286. ap_no_sample_repeat:  
  287.         st        10(a0)                    ;markieren
  288.         move.l    10(a0),a2                ;Loopadr. holen
  289.         bra.s    ap_compute_sample
  290. ap_sample_repeat:
  291.         st        10(a0)                    ;Sampleadr. markieren
  292.         move.l    10(a0),a2                ;Repeatsampleadr. holen
  293.         neg.l    d6                        ;neg. Restsamplelänge >> positiv
  294.         divu.w    d7,d6                    ;Repeatlänge/Restsamplelänge
  295.         swap    d6                        ;Rest holen 
  296.         ext.l    d6
  297.         sub.w    d6,d7                    ;Samplelänge-bereits abgespielte Bytes
  298.         lea        (a2,d6.l*2),a2            ;zur Repeatadr.
  299. ap_compute_sample:
  300.         move.l    a2,(a0)+                ;neue Sampleadr. speichern
  301.         move.w    d7,(a0)+                ;neue Samplelänge speichern
  302.         move.w    (a0)+,d1                ;Periode holen
  303.         move.w  (a0)+,d0                ;Lautstärke holen
  304.  
  305.         cmp.w    #1,d7                    ;Samplelänge<=1?
  306.         bhi.s    ap_no_dummy_sample
  307.         cmp.w    #1,14-10(a0)            ;Repeatlänge auch =1?
  308.            bhi.s    ap_no_dummy_sample
  309. ap_compute_dum_sample:
  310.         lea        ap_dum_sample(pc),a2    ;Leersampleadr.
  311.         move.w    #107,d1                    ;Sonderperiode
  312.         moveq    #0,d0                    ;Lautstärke 0
  313. ap_no_dummy_sample:    
  314.         mulu.w    main_voice(pc),d0        ;*frakt. Hauptlautstärke
  315.         swap    d0                        ;ganzzahliger Wert holen 
  316.         move.l    (ap_vol_tab.w,PC,d0.w*4),4(a1) ;Lautstärkewert in den DSP
  317.         move.l    (ap_freq_tab-107*8.w,PC,d1.w*8),4(a1) ;ganzzahliger Offset an den DSP
  318.         move.l    (ap_freq_tab+4-107*8.w,PC,d1.w*8),4(a1) ;fraktionaler Offset an den DSP
  319.         move.w    (ap_samclc_tab-107*2.w,PC,d1.w*2),d0    ;Samplebytesanzahl die zu senden sind holen
  320.         clr.b    5(a1)                    ;oberstes Byte reinigen
  321.           move.w    d0,(a3)                    ;Transferanzahl senden
  322.         move.w    (a2)+,(a3)                ;1 Wort senden
  323.         subq.w    #1,d0                    ;-1
  324.         beq.s    ap_copy_sample_to_dsp_end    ;falls nur 1 Samplewort >> Ende
  325.         move.w    d0,d1
  326.         asr.w    #5,d0                    ;/32
  327.         and.w    #$1f,d1
  328.         lea        (ap_rts_set.w,PC,d1.w*2),a0    ;RTS-Adr. bestimmen
  329.         move.w    #$4e75,(a0)                ;RTS setzen
  330.         move.w    #$3919,d2                ;Instruktionscache
  331.         movec    d2,cacr                 ;löschen
  332.         bsr.s    ap_copy_sample_to_dsp
  333.         move.w    #$369a,(a0)                ;move.w (a2)+,(a3) setzen
  334. ap_copy_sample_to_dsp_end:
  335.         rts    
  336. ap_copy_sample_to_dsp:
  337.     REPEAT
  338.         move.w    (a2)+,(a3)                ;Samples in den DSP
  339.     UNTIL    #31
  340.         subq.w    #1,d0
  341.         bgt    ap_copy_sample_to_dsp
  342. ap_rts_set:
  343.     REPEAT
  344.         move.w    (a2)+,(a3)                ;restliche Samples in den DSP
  345.     UNTIL    #31
  346.         rts
  347.  
  348.     DATA
  349. ap_pcm_buf_adr:    dc.l ap_pcm_play,ap_pcm_calc
  350. ap_dum_sample:    dc.l    $80808080        ;Dummysample für Kanalabschaltung
  351.  
  352. ap_pcm_play:    ds.w    983+8            ;Puffer für 
  353. ap_pcm_calc:    ds.w    983+8            ;die Stereodaten
  354. ap_pcm_buf_end:
  355.  
  356. *****************************************************************************
  357. ;Hauptinstallation des Players
  358. *****************************************************************************
  359. ;a0.l: Moduladr.
  360. ;a1.l: Timer-A-IRQ-Adr. bei d2=-1
  361. ;d0.w: Prescalewert (1-5/7)
  362. ;d1.w: =0 = Hostversion / -1 = SSI-Version anwählen
  363. ;d2.w: =0 = 50Hz-VBL / -1 = IRQ-7
  364.     TEXT
  365. ap_grand_init:
  366.         move.l    a0,a6
  367.         move.w    d1,ap_ssi_flag            ;gleich speichern
  368.         move.w    d2,ap_irq_flag
  369.         moveq    #0,d1
  370.         move.w    (ap_sampling_tab-2.w,PC,d0.w*2),d1    ;Abspielfrequenz holen
  371.         move.l    d1,ap_play_rate            ;und speichern
  372.         divu.w    #50,d1                    ;/ VBL-Frequenz
  373.         ext.l    d1
  374.         move.l    d1,ap_sam_clc            ;Sampleworte pro VBL    
  375. ;Schleife für die Stereodaten modifizieren
  376.         tst.w    ap_ssi_flag(pc)            ;SSI angewählt?
  377.         bne.s    ap_ssi_no_code_mod
  378. ;im Hostbetrieb Code modifizieren
  379.         move.w    d1,d6
  380.         asr.w    #5,d6                    ;/32 
  381.         move.w    d6,ap_sam_clc_lp+2        ;Schleifenanzahl speichern
  382.         and.w    #$1f,d1                 ;MOD 32 holen
  383.         eor.w    #$1f,d1                 ;invertieren
  384.         add.w    d1,d1                    ;*2
  385.         addq.w    #2,d1                       ;+2 da bra.s
  386.         move.b    d1,ap_dsp_copy_jmp+1    ;Branch modifizieren
  387. ap_ssi_no_code_mod:
  388.     DATA
  389. ap_ssi_flag:    dc.w    0                ;SSI-Flag
  390. ap_irq_flag:    dc.w    0                ;IRQ-Flag
  391. ap_sam_clc:        dc.l    0                ;Anzahl der Sampleworte pro VBL
  392. ap_play_rate:    dc.l    0                ;Abspielfrequenz des Players
  393. ap_sampling_tab:
  394.         dc.w    49150                ;50 Khz
  395.         dc.w    32750                ;33 KHz
  396.         dc.w    24600                ;25 KHz
  397.         dc.w    19650                ;20 KHz
  398.         dc.w    16400                ;16 KHz
  399.         dc.w    12300                ;unzulässig
  400.         dc.w    12300                ;12 KHz
  401. *****************************************************************************
  402.     TEXT
  403. ap_install_pcm:
  404.         lea        $ffff8900.w,a2            ;PCM-Basisadr.
  405.         clr.w    (a2)                    ;IRQs aus/DMA stop
  406.         clr.w    $20(a2)                    ;8 Bit/stereo
  407.         move.w    $34(a2),d7                ;Prescale holen
  408.         and.w    #$ff00,d7
  409.         and.w    #$7,d0
  410.         or.w    d0,d7                    ;KHz-Rate setzen
  411.         move.w    d7,$34(a2)
  412.         bset    #2,$37(a2)                ;Input vom Multiplexer
  413.         clr.w    $3a(a2)                    ;volle Lautstärke
  414.         move.w    #-1,main_voice            ;volle Lautstärke
  415.         tst.w    ap_ssi_flag(pc)            ;SSI-Version?
  416.         bne.s    ap_ssi_soundh_set
  417.  
  418. ;Soundsystem für Hostbetrieb vorbereiten
  419.         move.w    $30(a2),d7                ;Device-Prescale holen
  420.         and.w    #$fff0,d7
  421.          or.w    #%1001,d7                ;kein Handshake/25.175 MHz-Rate
  422.         move.w    d7,$30(a2)
  423.         move.w    $32(a2),d7                ;Destination holen
  424.         and.w    #$0fff,d7                ;Source: DMA
  425.         move.w    d7,$32(a2)
  426.         move.l    #ap_pcm_buf_end,d7        ;Endadresse
  427.         movep.w    d7,$11(a2)                ;Lowbyte/Midbyte
  428.         swap    d7
  429.         move.b    d7,$f(a2)                ;Highbyte
  430.         lea        ap_dsp_paula_host(pc),a0
  431.         bsr        dsp_system+4            ;DSP-Paula im Hostbetrieb
  432.         bra        ap_calc_freq
  433.  
  434. ;Soundsystem für SSI-Betrieb vorbereiten
  435. ap_ssi_soundh_set:
  436.         move.w    $30(a2),d7                ;Device-Prescale holen
  437.         and.w    #$ff0f,d7
  438.          or.w    #$90,d7                    ;kein Handshake/25.175 MHz-Rate
  439.                                          ;kein Tri-State
  440.         move.w    d7,$30(a2)
  441.         move.w    $32(a2),d7                ;Destination holen
  442.         and.w    #$0f7f,d7                ;>> DSP-REC auf Tri-State
  443.         or.w    #$2000,d7                ;Source: DSP-XMIT
  444.         move.w    d7,$32(a2)
  445.         lea        ap_dsp_paula_ssi(pc),a0
  446.         bsr        dsp_system+4            ;DSP-Paula im Hostbetrieb
  447. *****************************************************************************
  448. ;Berechnung    der    Frequenztabelle
  449.     TEXT
  450. ap_calc_freq:
  451.         lea        ap_freq_tab(pc),a2        ;Frequenztabelle
  452.         lea        ap_samclc_tab(pc),a3
  453.         clr.l    (a2)+                    ;Periode 107 >> Leersample
  454.         clr.l    (a2)+                   ;Offset auf 0
  455.         move.w    #1,(a3)+                ;nur 1 Samplewort an den DSP
  456.  
  457.         moveq    #108,d7                    ;mit Periode 108 beginnen
  458. ap_calc_freq_do:
  459.         move.l    #3579546,d2                ;Halbe Taktfrequenz    des    Amigas
  460.         divu.l    d7,d2                    ;/Paula-Timerwert>>    Spielfrequenz
  461.         move.l    d2,d3
  462.         lsr        #8,d2                    ;oberes    Byte ins untere
  463.         swap    d3                        ;mittleres Byte
  464.         lsl.l    #8,d3                    ;ins oberste >>    d2:    Highbyte
  465.                                         ;                d3:    Lowbyte
  466.         divu.l    ap_play_rate(pc),d2:d3    ;64-Bit/32-Bit
  467.         move.l    d3,d2
  468.         rol.l    #8,d2                    ;Highbyte holen    >> Vorkommawert
  469.         and.l    #$ff,d2
  470.         move.l    d2,(a2)+                ;Vorkommawert speichern
  471.         mulu.w    ap_sam_clc+2(pc),d2        ;*Samplebyteanzahl pro VBL
  472.         and.l    #$00ffffff,d3            ;Nachkommawert in 24-Bit holen
  473.         move.l    d3,(a2)+                ;und speichern
  474.         rol.l    #8,d3
  475.         mulu.l    ap_sam_clc(pc),d4:d3    ;*Samplebyteanzahl pro VBL
  476.         add.l    d4,d2                    ;+
  477.         asr.w    #1,d2                    ;/2    >> da Wortübertragung
  478.         addq.w    #2,d2                    ;2 Worte mehr >> Sicherheit
  479.         move.w    d2,(a3)+                ;und speichern
  480.         addq.w    #1,d7                    ;Periode erhöhen
  481.         cmp.w    #907+1,d7
  482.         bne.s    ap_calc_freq_do
  483.     DATA
  484. ap_freq_tab:    ds.l    2*(907-107+1)
  485. ap_samclc_tab:    ds.w    (907-107+1)
  486. *****************************************************************************
  487. ;Volumeberechnung
  488.     TEXT
  489. ap_calc_vol:
  490.         lea        ap_vol_tab(pc),a2        ;Volumetabelle
  491.         moveq    #65-1,d7                ;noch 64 Volume-Abstufungen
  492.         moveq    #64,d5                    ;mit Lautstärkewert 1 beginnen
  493.         move.l    #$800000/2,d6            ;0.999999/2 
  494.         tst.w    ap_ssi_flag(pc)            ;SSI-Version?
  495.         beq.s    ap_calc_vol_host
  496.         move.l    #$8000/2,d6                ;0.99999/2 auf 16 Bit
  497. ap_calc_vol_host:
  498.         divu.l    d5,d6                   ;/Lautstärkeskala (64 Stufen)
  499.         moveq    #0,d5
  500. ap_calc_vol_do:
  501.            move.l  d5,(a2)+                ;Lautstärkewert als Kommawert
  502.            add.l    d6,d5
  503.            dbra    d7,ap_calc_vol_do
  504.     DATA
  505. ap_vol_tab:    ds.l    65                    ;65 Volume-Abstufungen
  506. *****************************************************************************
  507.     TEXT
  508. ap_wait_to_host:
  509.         btst    #1,$ffffa202.w            ;auf DSP warten
  510.         beq.s    ap_wait_to_host
  511.         move.l    ap_sam_clc(pc),$ffffa204.w     ;Samplebyteanzahl an den DSP
  512. *****************************************************************************
  513.         pea        (a1)
  514.         bsr        ap_mod_init                ;Modul installieren
  515.         move.l    (sp)+,a1
  516. *****************************************************************************
  517. ap_handle_irq:
  518.         tst.w    ap_irq_flag(pc)            ;50Hz-VBL oder IRQ-7?
  519.         beq.s    ap_vbl_handle
  520.         clr.b    $fffffa19.w
  521.         move.l    a1,$134.w                ;Timer-A-Vektor
  522.         bset    #5,$fffffa07.w            ;IER
  523.         bset    #5,$fffffa13.w            ;IMR
  524.         bclr    #3,$fffffa17.w            ;EOI
  525.         move.b    #245,$fffffa1f.w        ;Timer-Wert
  526.         move.b    #$7,$fffffa19.w            ;Vorteiler 1:200
  527.                                         ;>> Timer-A wird alle 1/50s aufgerufen
  528. ap_vbl_handle:
  529.         rts
  530. *****************************************************************************
  531.     TEXT
  532. ap_small_deinit:
  533.         clr.w    main_voice                ;Hauptlautstärke auf 0
  534.         tst.w    ap_irq_flag(pc)
  535.         beq.s    ap_no_irq
  536.         bclr    #5,$fffffa07.w            ;IER
  537.         bclr    #5,$fffffa13.w            ;IMR
  538.         clr.b    $fffffa19.w                ;Timer-Stop
  539. ap_no_irq:
  540.         tst.w    ap_ssi_flag(pc)            ;SSI-Version?
  541.         bne.s    ap_ssi_deinstall
  542.         clr.w    $ffff8900.w                ;DMA stoppen
  543.         rts
  544. ap_ssi_deinstall:
  545.         bclr    #7,$ffff8931.w            ;DSP-XMIT auf Tristate
  546.         rts
  547. *****************************************************************************
  548. ;Paula-Pseudoregister
  549.     DATA 
  550. DFF096:        dc.w $0000        ;Amiga:DMA-Controlregister
  551. DFF0A0:        dc.l $00000000    ;Amiga:Adressregister »» Audio-Kanal 1 ««
  552. DFF0A4:        dc.w $0000        ;Amiga:Sample-Länge
  553. DFF0A6:        dc.w $0000        ;Amiga:Abtastfrequenz
  554. DFF0A8:        dc.w $0000        ;Amiga:Lautstärke
  555. DFF0AA:        dc.l $00000000    ;XXXXX:Pseudo-Loop-Adressregister
  556. DFF0AE:        dc.w $0000        ;XXXXX:Pseudo-Loop-Länge
  557.  
  558. DFF0B0:        dc.l $00000000    ;Amiga:Adressregister »» Audio-Kanal 2 ««
  559. DFF0B4:        dc.w $0000        ;Amiga:Sample-Länge
  560. DFF0B6:        dc.w $0000        ;Amiga:Abtastfrequenz
  561. DFF0B8:        dc.w $0000        ;Amiga:Lautstärke
  562. DFF0BA:        dc.l $00000000    ;XXXXX:Pseudo-Loop-Adressregister
  563. DFF0BE:        dc.w $0000        ;XXXXX:Pseudo-Loop-Länge
  564.  
  565. DFF0C0:        dc.l $00000000    ;Amiga:Adressregister »» Audio-Kanal 3 ««
  566. DFF0C4:        dc.w $0000        ;Amiga:Sample-Länge
  567. DFF0C6:        dc.w $0000        ;Amiga:Abtastfrequenz
  568. DFF0C8:        dc.w $0000        ;Amiga:Lautstärke
  569. DFF0CA:        dc.l $00000000    ;XXXXX:Pseudo-Loop-Adressregister
  570. DFF0CE:        dc.w $0000        ;XXXXX:Pseudo-Loop-Länge
  571.  
  572. DFF0D0:        dc.l $00000000    ;Amiga:Adressregister »» Audio-Kanal 4 ««
  573. DFF0D4:        dc.w $0000        ;Amiga:Sample-Länge
  574. DFF0D6:        dc.w $0000        ;Amiga:Abtastfrequenz
  575. DFF0D8:        dc.w $0000        ;Amiga:Lautstärke
  576. DFF0DA:        dc.l $00000000    ;XXXXX:Pseudo-Loop-Adressregister
  577. DFF0DE:        dc.w $0000        ;XXXXX:Pseudo-Loop-Länge
  578. *****************************************************************************
  579.     DATA
  580. ap_dsp_paula_host:
  581.             path "d:\source\dsppaula\"
  582.             inline "dsppauv1.ads"        ;DSP-Paula im Hostbetrieb
  583. ap_dsp_paula_ssi:
  584.             path "d:\source\dsppaula\"
  585.             inline "dsppauv2.ads"        ;DSP-Paula im SSI-Betrieb
  586. *****************************************************************************
  587.     TEXT
  588.             path "D:\source\dsppaula\"
  589.             include    "pro__30b.q"        ;Proplayer
  590. *****************************************************************************
  591.     DATA
  592.     IFNE    example=-1
  593. module:        path "e:\mods\new_soun.d"
  594.             inline "reach_te.mod"
  595.     ENDIF
  596. *****************************************************************************
  597.  
  598.         end