home *** CD-ROM | disk | FTP | other *** search
/ Brotikasten / BROTCD01.iso / amiga / frodov13.lha / src / 6581.asm < prev    next >
Assembly Source File  |  1995-02-13  |  5KB  |  276 lines

  1. *
  2. * 6581.asm - SID-Emulation
  3. *
  4. * Copyright (C) 1994-1995 by Christian Bauer
  5. *
  6.  
  7. *
  8. * Anmerkungen:
  9. * ------------
  10. *
  11. * Funktionsprinzip:
  12. *  - Es bestehen zwei M÷glichkeiten zur SID-Emulation, die ⁿber das
  13. *    Flag UseSIDCard ausgewΣhlt werden. Zum einen die Verwendung der
  14. *    SID-Karte, zum anderen die der "6581sid.library"
  15. *
  16. * SID-Karte:
  17. *  - Die SID-Karte enthΣlt einen echten C64-SID, der im Adre▀raum
  18. *    $a00001-$a00039 (Register an den ungeraden Adressen) eingeblendet
  19. *    ist (z.B. auf einer Zorro-II-Karte)
  20. *  - Wegen Timing-Problemen mit der Karte werden Lesezugriffe aus
  21. *    SID-Registern nur simuliert
  22. *  - Die Power-LED ist mit dem Reset-Eingang des SID verbunden,
  23. *    d.h. ein kurzes Aus- und Einschalten der LED setzt den SID
  24. *    zurⁿck
  25. *
  26.  
  27.         MACHINE    68020
  28.  
  29.         INCLUDE    "exec/types.i"
  30.         INCLUDE    "exec/macros.i"
  31.         INCLUDE    "exec/nodes.i"
  32.         INCLUDE    "hardware/intbits.i"
  33.  
  34.         XREF    _SysBase
  35.         XREF    _GfxBase
  36.         XREF    _SID6581Base
  37.  
  38.         XDEF    Reset6581
  39.         XDEF    ReadFrom6581
  40.         XDEF    WriteTo6581
  41.         XDEF    PauseSound
  42.         XDEF    ResumeSound
  43.         XDEF    ChangedSID
  44.         XDEF    CloseSID
  45.         XDEF    UseSIDCard    ;Prefs
  46.  
  47.         SECTION    "CODE",CODE
  48.  
  49. *
  50. * Definitionen
  51. *
  52.  
  53. ; 6581sid.library
  54. SID_AllocSID    = -30
  55. SID_FreeSID    = -36
  56. SID_Interrupt    = -42
  57. SID_Initialize    = -48
  58. SID_ResetSID    = -54
  59. SID_IRQOnOff    = -60
  60. SID_ReadReg    = -72
  61. SID_WriteReg    = -78
  62.  
  63. ; SID Handle Struktur
  64. sid_Enabled    = 4
  65. sid_Filter    = 5
  66. sid_60Hz    = 6
  67. sid_RingQual    = 7
  68. sid_SyncQual    = 8
  69. sid_ADSRQual    = 13
  70. sid_IRQRate    = 18
  71.  
  72.  
  73. **
  74. ** SID-Einstellung wurde verΣndert.
  75. ** Emulation ⁿber Library ein-/ausschalten
  76. **
  77.  
  78. ChangedSID    tst.w    UseSIDCard
  79.         beq    OpenSID
  80.  
  81. ; Emulation ⁿber Library ausschalten
  82. CloseSID    move.l    SIDHandle,d0
  83.         beq    1$
  84.  
  85.         move.l    a6,-(sp)
  86.         move.l    _SID6581Base,a6        ;SID abschalten
  87.         move.l    d0,a1
  88.         moveq    #-1,d0
  89.         jsr    SID_IRQOnOff(a6)
  90.  
  91.         move.l    _SysBase,a6        ;VBI entfernen
  92.         lea    VBInterrupt,a1
  93.         moveq    #INTB_VERTB,d0
  94.         JSRLIB    RemIntServer
  95.  
  96.         move.l    _SID6581Base,a6
  97.         move.l    SIDHandle,a1        ;Und SIDHandle freigeben
  98.         jsr    SID_FreeSID(a6)
  99.         clr.l    SIDHandle
  100.         move.l    (sp)+,a6
  101. 1$        rts
  102.  
  103. ; Emulation ⁿber Library einschalten
  104. OpenSID        tst.l    SIDHandle
  105.         bne    1$
  106.  
  107.         move.l    _SID6581Base,d0        ;6581sid.library offen?
  108.         beq    1$
  109.  
  110.         move.l    a6,-(sp)        ;Ja, SIDHandle holen
  111.         move.l    d0,a6
  112.         jsr    SID_AllocSID(a6)
  113.         move.l    d0,SIDHandle
  114.         beq    2$
  115.  
  116.         move.l    d0,a1            ;Parameter setzen
  117.         st.b    sid_Enabled(a1)
  118.         clr.b    sid_Filter(a1)
  119.         st.b    sid_60Hz(a1)
  120.         move.b    #48,sid_RingQual(a1)
  121.         move.b    #48,sid_SyncQual(a1)
  122.         move.b    #48,sid_ADSRQual(a1)
  123.         move.w    #60,sid_IRQRate(a1)
  124.         jsr    SID_Initialize(a6)
  125.  
  126.         move.l    SIDHandle,a1        ;SID anschalten
  127.         moveq    #0,d0
  128.         jsr    SID_IRQOnOff(a6)
  129.  
  130.         move.l    _SysBase,a6        ;VBI einrichten
  131.         lea    VBInterrupt,a1
  132.         moveq    #INTB_VERTB,d0
  133.         JSRLIB    AddIntServer
  134.  
  135. 2$        move.l    (sp)+,a6
  136. 1$        rts
  137.  
  138.  
  139. **
  140. ** Interrupt-Routine
  141. ** a1: SIDHandle
  142. **
  143.  
  144. IntProc        move.l    _SID6581Base,a6
  145.         jsr    SID_Interrupt(a6)
  146.         moveq    #0,d0            ;NΣchsten Server aufrufen
  147.         rts
  148.  
  149.  
  150. **
  151. ** Sound stummschalten
  152. **
  153.  
  154. PauseSound    move.l    SIDHandle,d0
  155.         beq    1$
  156.         move.l    a6,-(sp)
  157.         move.l    _SID6581Base,a6
  158.         move.l    d0,a1
  159.         moveq    #-1,d0
  160.         jsr    SID_IRQOnOff(a6)
  161.         move.l    (sp)+,a6
  162. 1$        rts
  163.  
  164.  
  165. **
  166. ** Sound wieder laut machen
  167. **
  168.  
  169. ResumeSound    move.l    SIDHandle,d0
  170.         beq    1$
  171.         move.l    a6,-(sp)
  172.         move.l    _SID6581Base,a6
  173.         move.l    d0,a1
  174.         moveq    #0,d0
  175.         jsr    SID_IRQOnOff(a6)
  176.         move.l    (sp)+,a6
  177. 1$        rts
  178.  
  179.  
  180. **
  181. ** SID zurⁿcksetzen
  182. **
  183.  
  184. Reset6581    move.l    a6,-(sp)
  185.         tst.w    UseSIDCard
  186.         beq    1$
  187.         move.l    _GfxBase,a6
  188.         JSRLIB    WaitTOF
  189.         bset    #1,$bfe001    ;LED aus
  190.         JSRLIB    WaitTOF
  191.         bclr    #1,$bfe001    ;LED an
  192.         move.l    (sp)+,a6
  193.         rts
  194.  
  195. 1$        move.l    SIDHandle,d0
  196.         beq    2$
  197.         move.l    _SID6581Base,a6
  198.         move.l    d0,a1
  199.         jsr    SID_ResetSID(a6)
  200. 2$        move.l    (sp)+,a6
  201.         rts
  202.  
  203.  
  204. **
  205. ** Aus einem SID-Register lesen
  206. ** d0.w: Registernummer ($00-$1f)
  207. ** Rⁿckgabe: d0.b: Byte
  208. **
  209. ** Darf das obere Wort von d0 und d1 nicht verΣndern!
  210. ** Darf a1 nicht verΣndern!
  211. **
  212.  
  213. ReadFrom6581    cmp.b    #$19,d0
  214.         beq    ReadFF
  215.         cmp.b    #$1a,d0
  216.         beq    ReadFF
  217.         cmp.b    #$1b,d0
  218.         beq    ReadRnd
  219.         moveq    #0,d0
  220.         rts
  221.  
  222. ReadFF        move.b    #-1,d0        ;A/D-Wandler
  223.         rts
  224.  
  225. ReadRnd        move.b    $dff007,d0    ;Zufallswert
  226.         rts
  227.  
  228.  
  229. **
  230. ** In ein SID-Register schreiben
  231. ** d0.w: Registernummer ($00-$1f)
  232. ** d1.b: Byte
  233. **
  234. ** Darf das obere Wort von d0 und d1 nicht verΣndern!
  235. **
  236.  
  237. WriteTo6581    tst.w    UseSIDCard
  238.         beq    1$
  239.         lea    $a00001,a0    ;SID-Karte
  240.         move.b    d1,(a0,d0.w*2)
  241.         rts
  242.  
  243. 1$        tst.l    SIDHandle
  244.         beq    2$
  245.         move.l    a6,-(sp)
  246.         move.l    _SID6581Base,a6
  247.         move.l    SIDHandle,a1    ;d0: Regnum, d1: Byte
  248.         jsr    SID_WriteReg(a6)
  249.         move.l    (sp)+,a6
  250.         moveq    #0,d0
  251.         moveq    #0,d1
  252. 2$        rts
  253.  
  254.  
  255. **
  256. ** Konstanten
  257. **
  258.  
  259. IntName        dc.b    "Frodo SID VBI",0
  260.  
  261. **
  262. ** Datenbereich
  263. **
  264.  
  265.         SECTION    "DATA",DATA
  266.  
  267. VBInterrupt    dc.l    0,0
  268.         dc.b    NT_INTERRUPT,0
  269.         dc.l    IntName
  270. SIDHandle    dc.l    0    ;Handle fⁿr die 6581sid.library und Flag, da▀ sie verfⁿgbar ist
  271.         dc.l    IntProc
  272.  
  273. UseSIDCard    dc.w    0    ;Flag: SID-Karte ansprechen
  274.  
  275.         END
  276.