1 /*        $NetBSD: ym2149reg.h,v 1.7 2009/10/20 19:10:11 snj Exp $    */
2 
3 /*
4  * Copyright (c) 1996 Leo Weppelman.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #ifndef _YM2149REG_H
29 #define _YM2149REG_H
30 /*
31  * Yahama YM-2149 Programmable Sound Generator
32  */
33 
34 #define   YM2149    ((struct ym2149 *)AD_SOUND)
35 
36 struct ym2149 {
37           volatile u_char     sdb[4];   /* use only the even bytes              */
38 };
39 
40 #define   sd_selr             sdb[0]    /* select register                      */
41 #define   sd_rdat             sdb[0]    /* read register data                             */
42 #define   sd_wdat             sdb[2]    /* write register data                            */
43 
44 /*
45  * Accessing the YM-2149 registers is indirect through ST-specific
46  * circuitry by writing the register number into sd_selr.
47  */
48 #define   YM_PA0              0         /* Period Channel A, bits 0-7           */
49 #define   YM_PA1              1         /* Period Channel A, bits 8-11                    */
50 #define   YM_PB0              2         /* Period Channel B, bits 0-7           */
51 #define   YM_PB1              3         /* Period Channel B, bits 8-11                    */
52 #define   YM_PC0              4         /* Period Channel C, bits 0-7           */
53 #define   YM_PC1              5         /* Period Channel C, bits 8-11                    */
54 #define   YM_PNG              6         /* Period Noise Generator, bits 0-4     */
55 #define   YM_MFR              7         /* Multi Function Register              */
56 #define   YM_VA               8         /* Volume Channel A                     */
57 #define   YM_VB               9         /* Volume Channel B                     */
58 #define   YM_VC               10        /* Volume Channel C                     */
59 #define   YM_PE0              11        /* Period Envelope, bits 0-7            */
60 #define   YM_PE1              12        /* Period Envelope, bits 8-15           */
61 #define   YM_WFE              13        /* Wave Form Envelope                             */
62 #define   YM_IOA              14        /* I/O port A                                     */
63 #define   YM_IOB              15        /* I/O port B                                     */
64 
65 /* bits in MFR: */
66 #define   SA_OFF              0x01      /* Sound Channel A off                            */
67 #define   SB_OFF              0x02      /* Sound Channel B off                            */
68 #define   SC_OFF              0x04      /* Sound Channel C off                            */
69 #define   NA_OFF              0x08      /* Noise Channel A off                            */
70 #define   NB_OFF              0x10      /* Noise Channel B off                            */
71 #define   NC_OFF              0x20      /* Noise Channel C off                            */
72 #define   PA_OUT              0x40      /* Port A for Output                              */
73 #define   PB_OUT              0x80      /* Port B for Output                              */
74 
75 /* bits in Vx: */
76 #define   VOLUME              0x0F      /* 16 steps                                       */
77 #define   ENVELOP             0x10      /* volume steered by envelope           */
78 
79 /* bits in WFE: */
80 #define   WF_HOLD             0x01      /* hold after one period                */
81 #define   WF_ALTERNAT         0x02      /* up and down (no saw teeth)           */
82 #define   WF_ATTACK 0x04      /* start up                                       */
83 #define   WF_CONTINUE         0x08      /* multiple periods                     */
84 
85 /* names for bits in Port A (ST specific): */
86 #define   PA_SIDEB  0x01      /* select floppy head - if double sided */
87 #define   PA_FLOP0  0x02      /* Drive Select Floppy 0                */
88 #define   PA_FLOP1  0x04      /* Drive Select Floppy 1                */
89 #define   PA_FDSEL  (PA_SIDEB|PA_FLOP0|PA_FLOP1)
90 #define   PA_SRTS             0x08      /* Serial RTS                                     */
91 #define   PA_SDTR             0x10      /* Serial DTR                                     */
92 #define   PA_PSTROBE          0x20      /* Parallel Strobe                      */
93 #define   PA_USER             0x40      /* Free Pin on Monitor Connector        */
94 #define   PA_SER2             0x80      /* Choose between LAN or Ser2 port      */
95 
96 /*
97  * Access macro's for Port A
98  * Port A is defined as an output port. Reading the port does not work
99  * reliably so keeping a 'soft-copy' seems to be the only way to make
100  * things work.
101  */
102 extern u_char       ym2149_ioa;         /* Soft-copy of port-A                            */
103 
104 #define ym2149_write_ioport(port, value) {                                      \
105           int       _os = splhigh();                                            \
106                                                                                           \
107           YM2149->sd_selr = port;                                                         \
108           YM2149->sd_wdat = value;                                              \
109           splx(_os);                                                                      \
110 }
111 
112 #define ym2149_write_ioport2(port, value) {                                     \
113           YM2149->sd_selr = port;                                                         \
114           YM2149->sd_wdat = value;                                              \
115 }
116 
117 #define ym2149_fd_select(select) {                                              \
118           int _s = splhigh();                                                   \
119                                                                                           \
120           ym2149_ioa = (ym2149_ioa & ~PA_FDSEL) | (select & PA_FDSEL);          \
121           ym2149_write_ioport(YM_IOA, ym2149_ioa);                              \
122           splx(_s);                                                             \
123           }
124 
125 #define ym2149_rts(set) {                                                       \
126           int _s = splhigh();                                                   \
127                                                                                           \
128           ym2149_ioa = set ? ym2149_ioa | PA_SRTS : ym2149_ioa & ~PA_SRTS;\
129           ym2149_write_ioport(YM_IOA, ym2149_ioa);                              \
130           splx(_s);                                                             \
131           }
132 
133 #define ym2149_dtr(set) {                                                       \
134           int _s = splhigh();                                                   \
135                                                                                           \
136           ym2149_ioa = set ? ym2149_ioa | PA_SDTR : ym2149_ioa & ~PA_SDTR;\
137           ym2149_write_ioport(YM_IOA, ym2149_ioa);                              \
138           splx(_s);                                                             \
139           }
140 
141 #define ym2149_strobe(set) {                                                    \
142           int _s = splhigh();                                                   \
143                                                                                           \
144           ym2149_ioa = set ? ym2149_ioa | PA_PSTROBE : ym2149_ioa & ~PA_PSTROBE;\
145           ym2149_write_ioport(YM_IOA, ym2149_ioa);                              \
146           splx(_s);                                                             \
147           }
148 
149 #define ym2149_ser2(set) {                                                      \
150           int _s = splhigh();                                                   \
151                                                                                           \
152           ym2149_ioa = set ? ym2149_ioa | PA_SER2 : ym2149_ioa & ~PA_SER2;\
153           ym2149_write_ioport(YM_IOA, ym2149_ioa);                              \
154           splx(_s);                                                             \
155           }
156 
157 #undef ym2149_write_ioport2
158 
159 #ifdef _KERNEL
160 /*
161  * Prototypes
162  */
163 void ym2149_init(void);
164 #endif
165 
166 #endif /*  _YM2149REG_H */
167