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