--- Frodo4/Src/SID_linux.h 2003/07/01 17:36:32 1.1 +++ Frodo4/Src/SID_linux.h 2004/01/10 18:11:07 1.3 @@ -1,7 +1,7 @@ /* * SID_linux.h - 6581 emulation, Linux specific stuff * - * Frodo (C) 1994-1997,2002 Christian Bauer + * Frodo (C) 1994-1997,2002-2003 Christian Bauer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,6 +23,18 @@ #include #include +// Catweasel ioctls (included here for convenience) +#include +#define CWSID_IOCTL_TYPE ('S') +#define CWSID_IOCTL_RESET _IO(CWSID_IOCTL_TYPE, 0) +#define CWSID_IOCTL_CARDTYPE _IOR(CWSID_IOCTL_TYPE, 4, int) +#define CWSID_IOCTL_PAL _IO(CWSID_IOCTL_TYPE, 0x11) +#define CWSID_IOCTL_NTSC _IO(CWSID_IOCTL_TYPE, 0x12) +#define CWSID_IOCTL_DOUBLEBUFFER _IOW(CWSID_IOCTL_TYPE, 0x21, int) +#define CWSID_IOCTL_DELAY _IOW(CWSID_IOCTL_TYPE, 0x22, int) +#define CWSID_MAGIC 0x100 +#define HAVE_CWSID 1 + #include "VIC.h" @@ -136,3 +148,76 @@ void DigitalRenderer::EmulateLine(void) buffer_pos = 0; } } + + +/* + * Renderer for Catweasel card + */ + +// Rendere class +class CatweaselRenderer : public SIDRenderer { +public: + CatweaselRenderer(); + virtual ~CatweaselRenderer(); + + virtual void Reset(void); + virtual void EmulateLine(void) {} + virtual void WriteRegister(uint16 adr, uint8 byte); + virtual void NewPrefs(Prefs *prefs) {} + virtual void Pause(void) {} + virtual void Resume(void) {} + +private: + int cwsid_fh; // Catweasel device file handle +}; + +// Constructor: Open Catweasel device and reset SID +CatweaselRenderer::CatweaselRenderer() +{ + cwsid_fh = open("/dev/sid", O_WRONLY); + if (cwsid_fh >= 0) { + int i; + if (ioctl(cwsid_fh, CWSID_IOCTL_CARDTYPE, &i) < 0 || i != CWSID_MAGIC) { + close(cwsid_fh); + cwsid_fh = -1; + } else { + ioctl(cwsid_fh, CWSID_IOCTL_RESET); + ioctl(cwsid_fh, CWSID_IOCTL_DOUBLEBUFFER, 0); + } + } + + Reset(); +} + +// Destructor: Reset SID and close Catweasel device +CatweaselRenderer::~CatweaselRenderer() +{ + Reset(); + + if (cwsid_fh >= 0) { + close(cwsid_fh); + cwsid_fh = -1; + } +} + +// Reset SID +void CatweaselRenderer::Reset(void) +{ + if (cwsid_fh >= 0) { + uint8 zero = 0; + ioctl(cwsid_fh, CWSID_IOCTL_RESET); + lseek(cwsid_fh, 24, SEEK_SET); + write(cwsid_fh, &zero, 1); + } +} + +// Write to register +void CatweaselRenderer::WriteRegister(uint16 adr, uint8 byte) +{ + if (cwsid_fh >= 0 && adr < 0x1a) { + lseek(cwsid_fh, adr, SEEK_SET); + write(cwsid_fh, &byte, 1); + lseek(cwsid_fh, adr, SEEK_SET); + write(cwsid_fh, &byte, 1); + } +}