1 |
|
/* |
2 |
|
* SID_linux.h - 6581 emulation, Linux specific stuff |
3 |
|
* |
4 |
< |
* Frodo (C) 1994-1997,2002 Christian Bauer |
4 |
> |
* Frodo (C) 1994-1997,2002-2004 Christian Bauer |
5 |
|
* |
6 |
|
* This program is free software; you can redistribute it and/or modify |
7 |
|
* it under the terms of the GNU General Public License as published by |
23 |
|
#include <sys/ioctl.h> |
24 |
|
#include <linux/soundcard.h> |
25 |
|
|
26 |
+ |
// Catweasel ioctls (included here for convenience) |
27 |
+ |
#include <linux/ioctl.h> |
28 |
+ |
#define CWSID_IOCTL_TYPE ('S') |
29 |
+ |
#define CWSID_IOCTL_RESET _IO(CWSID_IOCTL_TYPE, 0) |
30 |
+ |
#define CWSID_IOCTL_CARDTYPE _IOR(CWSID_IOCTL_TYPE, 4, int) |
31 |
+ |
#define CWSID_IOCTL_PAL _IO(CWSID_IOCTL_TYPE, 0x11) |
32 |
+ |
#define CWSID_IOCTL_NTSC _IO(CWSID_IOCTL_TYPE, 0x12) |
33 |
+ |
#define CWSID_IOCTL_DOUBLEBUFFER _IOW(CWSID_IOCTL_TYPE, 0x21, int) |
34 |
+ |
#define CWSID_IOCTL_DELAY _IOW(CWSID_IOCTL_TYPE, 0x22, int) |
35 |
+ |
#define CWSID_MAGIC 0x100 |
36 |
+ |
#define HAVE_CWSID 1 |
37 |
+ |
|
38 |
|
#include "VIC.h" |
39 |
|
|
40 |
|
|
148 |
|
buffer_pos = 0; |
149 |
|
} |
150 |
|
} |
151 |
+ |
|
152 |
+ |
|
153 |
+ |
/* |
154 |
+ |
* Renderer for Catweasel card |
155 |
+ |
*/ |
156 |
+ |
|
157 |
+ |
// Rendere class |
158 |
+ |
class CatweaselRenderer : public SIDRenderer { |
159 |
+ |
public: |
160 |
+ |
CatweaselRenderer(); |
161 |
+ |
virtual ~CatweaselRenderer(); |
162 |
+ |
|
163 |
+ |
virtual void Reset(void); |
164 |
+ |
virtual void EmulateLine(void) {} |
165 |
+ |
virtual void WriteRegister(uint16 adr, uint8 byte); |
166 |
+ |
virtual void NewPrefs(Prefs *prefs) {} |
167 |
+ |
virtual void Pause(void) {} |
168 |
+ |
virtual void Resume(void) {} |
169 |
+ |
|
170 |
+ |
private: |
171 |
+ |
int cwsid_fh; // Catweasel device file handle |
172 |
+ |
}; |
173 |
+ |
|
174 |
+ |
// Constructor: Open Catweasel device and reset SID |
175 |
+ |
CatweaselRenderer::CatweaselRenderer() |
176 |
+ |
{ |
177 |
+ |
cwsid_fh = open("/dev/sid", O_WRONLY); |
178 |
+ |
if (cwsid_fh >= 0) { |
179 |
+ |
int i; |
180 |
+ |
if (ioctl(cwsid_fh, CWSID_IOCTL_CARDTYPE, &i) < 0 || i != CWSID_MAGIC) { |
181 |
+ |
close(cwsid_fh); |
182 |
+ |
cwsid_fh = -1; |
183 |
+ |
} else { |
184 |
+ |
ioctl(cwsid_fh, CWSID_IOCTL_RESET); |
185 |
+ |
ioctl(cwsid_fh, CWSID_IOCTL_DOUBLEBUFFER, 0); |
186 |
+ |
} |
187 |
+ |
} |
188 |
+ |
|
189 |
+ |
Reset(); |
190 |
+ |
} |
191 |
+ |
|
192 |
+ |
// Destructor: Reset SID and close Catweasel device |
193 |
+ |
CatweaselRenderer::~CatweaselRenderer() |
194 |
+ |
{ |
195 |
+ |
Reset(); |
196 |
+ |
|
197 |
+ |
if (cwsid_fh >= 0) { |
198 |
+ |
close(cwsid_fh); |
199 |
+ |
cwsid_fh = -1; |
200 |
+ |
} |
201 |
+ |
} |
202 |
+ |
|
203 |
+ |
// Reset SID |
204 |
+ |
void CatweaselRenderer::Reset(void) |
205 |
+ |
{ |
206 |
+ |
if (cwsid_fh >= 0) { |
207 |
+ |
uint8 zero = 0; |
208 |
+ |
ioctl(cwsid_fh, CWSID_IOCTL_RESET); |
209 |
+ |
lseek(cwsid_fh, 24, SEEK_SET); |
210 |
+ |
write(cwsid_fh, &zero, 1); |
211 |
+ |
} |
212 |
+ |
} |
213 |
+ |
|
214 |
+ |
// Write to register |
215 |
+ |
void CatweaselRenderer::WriteRegister(uint16 adr, uint8 byte) |
216 |
+ |
{ |
217 |
+ |
if (cwsid_fh >= 0 && adr < 0x1a) { |
218 |
+ |
lseek(cwsid_fh, adr, SEEK_SET); |
219 |
+ |
write(cwsid_fh, &byte, 1); |
220 |
+ |
lseek(cwsid_fh, adr, SEEK_SET); |
221 |
+ |
write(cwsid_fh, &byte, 1); |
222 |
+ |
} |
223 |
+ |
} |