]> git.sur5r.net Git - cc65/blob - libsrc/lynx/lynx-snd.s
Add basic sound support
[cc65] / libsrc / lynx / lynx-snd.s
1 ;
2 ; Sound driver for the Atari Lynx.
3 ;
4 ; Karri Kaksonen and Bjoern Spruck, 11.12.2012
5 ;
6
7         .include        "lynx.inc"
8         .include        "zeropage.inc"
9
10         .export         _lynx_snd_init
11
12 ;----------------------------------------------------------------------------
13 ; ZP variables that go into APPZP
14 ;
15
16         .segment "APPZP" : zeropage
17
18 SndSema:                .res    1
19 SndPtrTmp:              .res    2
20 SndTmp:                 .res    2
21 SndEnvPtr:              .res    2
22
23 ;----------------------------------------------------------------------------
24 ; Global variables
25 ;
26
27         .bss
28
29 SndRetAFlag2:           .res    1
30 SndRetAFlag:            .res    1
31 SndPtrLo:               .res    4
32 SndPtrHi:               .res    4
33 SndDelay:               .res    4
34 SndLoopCnt:             .res    4
35 SndLoopPtrLo:           .res    4
36 SndLoopPtrHi:           .res    4
37 SndVolume:              .res    4
38 SndMaxVolume:           .res    4
39 SndNotePlaying:         .res    4
40 SndRetAddr:             .res    8
41 SndActive:              .res    4
42 SndReqStop:             .res    4
43 SndEnvVol:              .res    4
44 SndEnvFrq:              .res    4
45 SndEnvWave:             .res    4
46 SndChannel:             .res    32
47 SndEnvVolCnt:           .res    4
48 SndEnvVolInc:           .res    4
49 SndEnvVolOff:           .res    4
50 SndEnvVolLoop:          .res    4
51 SndEnvVolParts:         .res    4
52 SndEnvVolParts2:        .res    4
53 SndEnvFrqCnt:           .res    4
54 SndEnvFrqInc:           .res    4
55 SndEnvFrqOff:           .res    4
56 SndEnvFrqLoop:          .res    4
57 SndEnvFrqParts:         .res    4
58 SndEnvFrqParts2:        .res    4
59 SndEnvWaveCnt:          .res    4
60 SndEnvWaveOff:          .res    4
61 SndEnvWaveLoop:         .res    4
62 SndEnvWaveParts:        .res    4
63 SndEnvWaveParts2:       .res    4
64
65 MAX_INSTRUMENTS         .set    64
66 SndEnvVolPtrLo:         .res    MAX_INSTRUMENTS
67 SndEnvVolPtrHi:         .res    MAX_INSTRUMENTS
68 SndEnvFrqPtrLo:         .res    MAX_INSTRUMENTS
69 SndEnvFrqPtrHi:         .res    MAX_INSTRUMENTS
70 SndEnvWavePtrLo:        .res    MAX_INSTRUMENTS
71 SndEnvWavePtrHi:        .res    MAX_INSTRUMENTS
72
73         .rodata
74
75 SndOffsets:             .byte   $00,$08,$10,$18
76
77         .code
78
79 ;----------------------------------------------------------------------------
80 ; void lynx_snd_init() will initialize the sound engine.
81 ;
82
83 _31250Hz        .set    %101
84
85 _lynx_snd_init:
86         php
87         sei
88         lda     #%10011000|_31250Hz
89         sta     STIMCTLA
90         lda     #129
91         sta     STIMBKUP        ; set up a 240Hz IRQ
92
93         stz     AUD0VOL
94         stz     AUD1VOL
95         stz     AUD2VOL
96         stz     AUD3VOL
97
98         stz     $fd44           ; all channels full volume / no attenuation
99         lda     #$ff
100         stz     MSTEREO
101
102         lda     #0
103         sta     AUD0CTLA
104         sta     AUD1CTLA
105         sta     AUD2CTLA
106         sta     AUD3CTLA
107
108         ldx     #3
109         lda     #0
110 init0:  stz     SndActive,x
111         stz     SndReqStop,x
112         stz     SndEnvVol,x
113         stz     SndEnvFrq,x
114         stz     SndEnvWave,x
115         ldy     SndOffsets,x
116         sta     SndChannel+2,y
117         dex
118         bpl     init0
119         stz     SndRetAFlag
120         stz     SndRetAFlag2
121         stz     SndSema
122         plp
123         rts
124