home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / falcon / sound / dsppaula / dsppauv1.asm < prev    next >
Assembly Source File  |  1993-10-31  |  10KB  |  303 lines

  1. ;****************************************************************************
  2. ;**************************    D S P - P A U L A    *************************
  3. ;****************  coded by Chris of AURA of the INEPENDENT  ****************
  4. ;***************   first code  : 14.04.93                      ***************
  5. ;***************   last changes: 30.04.93                      ***************
  6. ;****************************************************************************
  7.  
  8. ;wichtige Hinweise:
  9. ;die DSP-Paula darf nur komplett im Y-Ram betrieben werden.
  10. ;Hostcommand $13 wird durch die DSP-Paula belegt-
  11. ;es werden insgesamt 2 Stackeinträge benötigt-
  12.  
  13. dsp_paula_start:    equ $4000-5050        ;Startadr. des DSP-Paulacodes
  14.  
  15. v_hz:        equ    50                    ;VBL-Frequenz
  16. sam_bufcnt:    equ    33300/v_hz            ;max. Bytedurchsatzpufferlänge pro VBL
  17.                                     ;Erfahrungswert
  18.  
  19. ;*********************************************************************
  20. ;Vektor für Hostcommand 1 setzen
  21.         org        P:$26                ;Hostcommandvektor 1
  22.         jsr        dsp_paula
  23. ;*********************************************************************        
  24.         org        P:dsp_paula_start
  25.  
  26. install_paula:
  27.         clr        a
  28.         move    a1,P:voice1_par            ;Stimme 1-Parameter setzen
  29.         move    a1,P:voice1_par+4        ;Restoffset
  30.         move    a1,P:voice1_par+5        ;auf 0,0
  31.         move    a1,P:voice2_par            ;Stimme 2-Parameter setzen
  32.         move    a1,P:voice2_par+4        ;Restoffset
  33.         move    a1,P:voice2_par+5        ;auf 0,0
  34.         move    a1,P:voice3_par            ;Stimme 3-Parameter setzen
  35.         move    a1,P:voice3_par+4        ;Restoffset
  36.         move    a1,P:voice3_par+5        ;auf 0,0
  37.         move    a1,P:voice4_par            ;Stimme 4-Parameter setzen
  38.         move    a1,P:voice4_par+4        ;Restoffset
  39.         move    a1,P:voice4_par+5        ;auf 0,0
  40.  
  41.         move    #sam_clc,r1
  42.         jclr    #0,X:<<$ffe9,*
  43.         movep    X:<<$ffeb,Y:(r1)        ;Samplebyteanzahl holen
  44.  
  45.         move    #mono1_trk,r0            ;Monospuren
  46.         rep        #990*2
  47.         move    a,Y:(r0)+                ;löschen
  48.  
  49. infinity:
  50.         jmp        infinity
  51.  
  52. ;*********************************************************************
  53. dsp_paula:
  54. ;vorberechnete Stereodaten an den Host
  55.         ori        #$3,mr                    ;alle IRQs sperren
  56.  
  57.         move    r0,P:save_reg
  58.         move    #save_reg+1,r0
  59.         move    m0,P:save_reg+19
  60.         movec    #$ffff,m0
  61.         nop
  62.         move    r1,Y:(r0)+                ;Adressregister
  63.         move    r2,Y:(r0)+
  64.         move    r3,Y:(r0)+
  65.         move    n0,Y:(r0)+
  66.         move    n2,Y:(r0)+
  67.         move    m1,Y:(r0)+                ;Modifierreg.
  68.         move    m2,Y:(r0)+
  69.         move    m3,Y:(r0)+
  70.         move    x0,Y:(r0)+                ;Arithmetikregister
  71.         move    x1,Y:(r0)+
  72.         move    y0,Y:(r0)+
  73.         move    y1,Y:(r0)+
  74.         move    a2,Y:(r0)+
  75.         move    a1,Y:(r0)+
  76.         move    a0,Y:(r0)+
  77.         move    b2,Y:(r0)+
  78.         move    b1,Y:(r0)+
  79.         move    b0,Y:(r0)+    
  80.         
  81.         movec    m0,m1
  82.         movec    m0,m2                    ;setzen
  83.         movec    m0,m3
  84.  
  85.         bset    #3,X:<<$ffe8            ;HF2 setzen >> DSP-Paula am Werk
  86.                         
  87.         move    #mono1_trk,r0            ;1. Monospur
  88.         move    #mono2_trk,r1            ;2. Monospur
  89.         jsr        send_sample_data        ;Stereo an den Host
  90.  
  91. ;Samples der 4 Stimmen holen
  92.         move    #voice1_par,r0
  93.         jsr        get_sample_data            ;Sampledaten holen
  94.  
  95.         move    #voice2_par,r0            ;2. Stimme
  96.         jsr        get_sample_data            ;Sampledaten holen
  97.  
  98.         move    #voice3_par,r0            ;3. Stimme
  99.         jsr        get_sample_data            ;Sampledaten holen
  100.  
  101.         move    #voice4_par,r0            ;4. Stimme
  102.         jsr        get_sample_data            ;Sampledaten holen
  103.  
  104. ;Stimmen mischen
  105.         move    #voice1_par,r0            ;Puffer der 1. Stimme
  106.         move    #mono1_trk,r1            ;1. Monopuffer
  107.         jsr        calc_one_voice            ;berechnen
  108.  
  109.         move    #voice4_par,r0            ;Puffer der 4. Stimme
  110.         move    #mono1_trk,r1            ;1. Monopuffer
  111.         jsr        mix_one_voice            ;berechnen und dazumischen
  112.  
  113.         move    #voice2_par,r0            ;Puffer der 2. Stimme
  114.         move    #mono2_trk,r1            ;2. Monopuffer
  115.         jsr        calc_one_voice            ;berechnen
  116.  
  117.         move    #voice3_par,r0            ;Puffer der 3. Stimme
  118.         move    #mono2_trk,r1            ;3. Monopuffer
  119.         jsr        mix_one_voice            ;berechnen und dazumischen
  120.  
  121.         move    #save_reg+1,r0
  122.         nop
  123.         move    Y:(r0)+,r1                ;Adressregister
  124.         move    Y:(r0)+,r2
  125.         move    Y:(r0)+,r3
  126.         move    Y:(r0)+,n0
  127.         move    Y:(r0)+,n2
  128.         move    Y:(r0)+,m1                ;Modifierreg.
  129.         move    Y:(r0)+,m2
  130.         move    Y:(r0)+,m3
  131.         move    Y:(r0)+,x0                ;Arithmetikregister
  132.         move    Y:(r0)+,x1
  133.         move    Y:(r0)+,y0
  134.         move    Y:(r0)+,y1
  135.         move    Y:(r0)+,a2
  136.         move    Y:(r0)+,a1
  137.         move    Y:(r0)+,a0
  138.         move    Y:(r0)+,b2
  139.         move    Y:(r0)+,b1
  140.         move    Y:(r0)+,b0    
  141.         move    Y:(r0)+,m0                ;Modifierreg.
  142.         move    P:save_reg,r0
  143.  
  144.         bclr    #3,X:<<$ffe8            ;HF2 löschen >> DSP nun frei
  145.         rti
  146. ;***************************************
  147. ;Berechnet 1 Spur ohne mischen
  148. ;r0: Parameteradr. des Samples
  149. ;r1: Monopuffer für den PCM-Chip
  150. calc_one_voice:
  151.         lua        (r0)+,r2                ;1 Eintrag überspringen
  152.         nop                                ;Pipeline-NOP
  153.         move    Y:(r2)+,y1                ;Lautstärke holen
  154.         move    Y:(r2)+,x1                ;Sample-Vorkommaoffset holen
  155.         move    Y:(r2)+,x0                ;Sample-Nachkommaoffset holen
  156.         move    r2,r3
  157.         move    Y:(r2)+,b                ;Restvorkomma holen
  158.         move    Y:(r2)+,b0                ;Restnachkomma holen
  159.         move    r2,y0                    ;Sampleadr. 
  160.         add        y0,b    r2,n2            ;+,Sampleadr. retten
  161.         move    b1,r2                    ;Startadr. im Samplepuffer
  162.         move    P:sam_clc,y0            ;Anzahl holen
  163.         
  164.         do        y0,calc_one_voice_do
  165.         add        x,b        Y:(r2),y0        ;Sampleoffset addieren
  166.                                         ;Samplebyte holen
  167.         mpy        y1,y0,a        b1,r2        ;*Lautstärke,neue Sampleadr. holen    
  168.         move    a,Y:(r1)+                ;und speichern
  169. calc_one_voice_do:
  170.  
  171.         move    n2,x0                    ;Samplestart holen
  172.         sub        x0,b                    ;- akt. Sampleposition
  173.         move    b1,x0
  174.         bclr    #0,x0                    ;auf Wort abrunden
  175.         move    x0,Y:(r0)                ;und speichern
  176.         sub        x0,b                    ;- >> Restoffset errechnen
  177.         move    b1,Y:(r3)+                ;und für nächsten VBL speichern        
  178.         move    b0,Y:(r3)
  179.         rts
  180. ;***************************************
  181. ;Berechnet 1 Spur mit mischen
  182. ;r0: Pufferadr. des Samples
  183. ;r1: Monopuffer für den PCM-Chip
  184. mix_one_voice:
  185.         lua        (r0)+,r2                ;1 Eintrag überspringen
  186.         nop                                ;Pipeline-NOP
  187.         move    Y:(r2)+,y1                ;Lautstärke holen
  188.         move    Y:(r2)+,x1                ;Sample-Vorkommaoffset holen
  189.         move    Y:(r2)+,x0                ;Sample-Nachkommaoffset holen
  190.         move    r2,r3
  191.         move    Y:(r2)+,b                ;Restvorkomma holen
  192.         move    Y:(r2)+,b0                ;Restnachkomma holen
  193.         move    r2,y0                    ;Sampleadr. 
  194.         add        y0,b    r2,n2            ;+,Sampleadr. retten
  195.         move    b1,r2                    ;Startadr. im Samplepuffer
  196.          move    P:sam_clc,y0            ;Anzahl
  197.  
  198.         do        y0,mix_one_voice_do
  199.         add        x,b        Y:(r2),y0        ;Sampleoffset addieren
  200.                                         ;Samplebyte holen
  201.         move    Y:(r1),a                ;zuvor berechn. Samplewert holen
  202.         mac        y1,y0,a        b1,r2        ;*Lautstärke,neue Sampleadr. holen    
  203.         move    a,Y:(r1)+                ;und speichern
  204. mix_one_voice_do:
  205.  
  206.         move    n2,x0                    ;Samplestart holen
  207.         sub        x0,b                    ;- akt. Sampleposition
  208.         move    b1,x0
  209.         bclr    #0,x0                    ;auf Wort abrunden
  210.         move    x0,Y:(r0)                ;und speichern
  211.         sub        x0,b                    ;- >> Restoffset errechnen
  212.         move    b1,Y:(r3)+                ;und für nächsten VBL speichern        
  213.         move    b0,Y:(r3)
  214.         rts
  215. ;***************************************
  216. ;Läd Lautstärke und Sample in den Y-Speicher
  217. ;Sampledaten von 0 bis 255
  218. ;r0: Parameteradr. des Sampels
  219. get_sample_data:
  220.         jclr    #1,X:<<$ffe9,*
  221.         movep    Y:(r0)+,X:<<$ffeb            ;Tatsächlich bearb. Bytes senden
  222.         jclr    #0,X:<<$ffe9,*
  223.         movep    X:<<$ffeb,Y:(r0)+            ;Lautstärke holen
  224.         jclr    #0,X:<<$ffe9,*
  225.         movep    X:<<$ffeb,Y:(r0)+            ;Schrittweite Vorkomma holen
  226.         jclr    #0,X:<<$ffe9,*
  227.         movep    X:<<$ffeb,Y:(r0)+            ;Schrittweite Nachkomma holen
  228.  
  229.         move    #<2,n0
  230.         nop                                    ;Pipeline-NOP
  231.         lua        (r0)+n0,r0                    ;Restwert überspringen
  232.  
  233.         jclr    #0,X:<<$ffe9,*
  234.         movep    X:<<$ffeb,y0                ;Anzahl der zu übertr. Worte holen
  235.  
  236.         move    #>$10000/2,x0                ;Verschiebungswert durch mpy
  237.         move    #>128,x1                    ;Subr.Wert
  238.         move    #>$0000FF,y1                ;Ausmaskierungswert
  239.         do        y0,load_sample
  240.         jclr    #0,X:<<$ffe9,*
  241.         movep    X:<<$ffeb,y0                ;2 8-bit-Samplewerte holen
  242. ;wichtig: oberstes Byte muß null sein
  243.         mpy        x0,y0,a                        ;oberes Byte nach a1 schieben
  244.         sub        x1,a                        ;-128
  245.         move    y0,a    a,Y:(r0)+            ;und speichern
  246.         and        y1,a                        ;unteres Byte holen
  247.         sub        x1,a                        ;-128
  248.         move    a,Y:(r0)+                    ;unteres Byte speichern        
  249. load_sample:
  250.         rts
  251. ;***************************************
  252. ;Sendet fertiges Stereosample aus dem Y-Speicher
  253. ;r0: Pufferadr. der 1. Spur
  254. ;r1: Pufferadr. der 2. Spur
  255. send_sample_data:
  256.         move    #>$100/2,x0                    ;Verschiebungswert durch mpy
  257.         move    #>$0000ff,x1                ;Ausmaskierungswert
  258.  
  259.         move    P:sam_clc,y0                ;Anzahl holen
  260.         do        y0,send_sample
  261.         move    Y:(r1)+,a                    ;2. Monowert holen
  262.         and        x1,a    Y:(r0)+,y0            ;1. Monowert holen
  263.         move    a1,a0
  264.         mac        x0,y0,a                        ;um 8 Bit links und dazuodern
  265.                                             ;oberstes Byte unwichtig da nur 
  266.                                             ;wortweise vom DSP gelesen wird
  267.         jclr    #1,X:<<$ffe9,*
  268.         movep    a0,X:<<$ffeb                ;Stereosamplewert senden
  269. send_sample:
  270.         rts
  271. ;***************************************
  272. save_reg:    ds    20
  273. sam_clc:    ds    1                            ;Anzahl der Samplebytes
  274. ;Parameter und Puffer für die Samples
  275. voice1_par: ds    1                            ;tatsächlich abgearb. Bytes
  276.                                             ;auf Wortgrenze abgerundet
  277.                                             ;muß dem Host vor neuer Sampleübergabe
  278.                                             ;übermittelt werden
  279. ;Lautstärke als Fraktionalwert (zw. 0 und 1)
  280.             ds    1                            ;Lautstärke als Kommawert
  281.                                             ;vom Host pro VBL übermittelt
  282. ;Schrittweite innerhalb des Samples
  283.             ds    2                            ;Sampleoffset (48 Bit)
  284. ;Da der Samplepuffer nie vollständig abgearbeitet wird, bleibt ein Rest
  285. ;übrig der das nächste Mal zur voice_buf-Adr. dazuaddiert werden muß.
  286.             ds    2                            ;Restoffset von der letzten Berechnung
  287. voice1_buf:    ds    sam_bufcnt                    ;Puffer der Sampledaten
  288.  
  289. voice2_par: ds    6
  290. voice2_buf:    ds    sam_bufcnt                    ;Puffer der Sampledaten
  291. voice3_par: ds    6
  292. voice3_buf:    ds    sam_bufcnt                    ;Puffer der Sampledaten
  293. voice4_par: ds    6
  294. voice4_buf:    ds    sam_bufcnt                    ;Puffer der Sampledaten
  295.  
  296.  
  297. ;****************************************
  298. ;Stereopuffer, jedoch noch in 2 Spuren getrennt
  299. mono1_trk:    ds    990                            ;Monospur 1
  300. mono2_trk:  ds    990                            ;Monospur 2
  301. ;****************************************
  302. end:
  303.         end        dsp_paula_start            ;Installierung starten