Previous 199869 Revisions Next

r29250 Friday 4th April, 2014 at 09:58:00 UTC by Curt Coder
upd3301: devcb2 & delegate. (nw)
[src/emu]delegate.h
[src/emu/video]upd3301.c upd3301.h
[src/mess/drivers]pc8001.c
[src/mess/includes]pc8001.h

trunk/src/emu/delegate.h
r29249r29250
160160// dummy class used to indicate a non-existant parameter
161161class _noparam { };
162162
163template<typename _ClassType, typename _ReturnType, typename _P1Type, typename _P2Type, typename _P3Type, typename _P4Type, typename _P5Type, typename _P6Type, typename _P7Type, typename _P8Type, typename _P9Type, typename _P10Type, typename _P11Type>
163// specialization for 12 parameters
164template<typename _ClassType, typename _ReturnType, typename _P1Type, typename _P2Type, typename _P3Type, typename _P4Type, typename _P5Type, typename _P6Type, typename _P7Type, typename _P8Type, typename _P9Type, typename _P10Type, typename _P11Type, typename _P12Type>
164165struct delegate_traits
165166{
167   typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _P11Type, _P12Type);
168   typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _P11Type, _P12Type);
169   typedef _ReturnType (_ClassType::*member_func_type)(_P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _P11Type, _P12Type);
170};
171
172// specialization for 11 parameters
173template<typename _ClassType, typename _ReturnType, typename _P1Type, typename _P2Type, typename _P3Type, typename _P4Type, typename _P5Type, typename _P6Type, typename _P7Type, typename _P8Type, typename _P9Type, typename _P10Type, typename _P11Type>
174struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _P11Type, _noparam>
175{
166176   typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _P11Type);
167177   typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _P11Type);
168178   typedef _ReturnType (_ClassType::*member_func_type)(_P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _P11Type);
169179};
170180
181// specialization for 10 parameters
171182template<typename _ClassType, typename _ReturnType, typename _P1Type, typename _P2Type, typename _P3Type, typename _P4Type, typename _P5Type, typename _P6Type, typename _P7Type, typename _P8Type, typename _P9Type, typename _P10Type>
172struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _noparam>
183struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _noparam, _noparam>
173184{
174185   typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type);
175186   typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type);
176187   typedef _ReturnType (_ClassType::*member_func_type)(_P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type);
177188};
178189
190// specialization for 9 parameters
179191template<typename _ClassType, typename _ReturnType, typename _P1Type, typename _P2Type, typename _P3Type, typename _P4Type, typename _P5Type, typename _P6Type, typename _P7Type, typename _P8Type, typename _P9Type>
180struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _noparam, _noparam>
192struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _noparam, _noparam, _noparam>
181193{
182194   typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type);
183195   typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type);
184196   typedef _ReturnType (_ClassType::*member_func_type)(_P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type);
185197};
186198
199// specialization for 8 parameters
187200template<typename _ClassType, typename _ReturnType, typename _P1Type, typename _P2Type, typename _P3Type, typename _P4Type, typename _P5Type, typename _P6Type, typename _P7Type, typename _P8Type>
188struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _noparam, _noparam, _noparam>
201struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _noparam, _noparam, _noparam, _noparam>
189202{
190203   typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type);
191204   typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type);
192205   typedef _ReturnType (_ClassType::*member_func_type)(_P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type);
193206};
194207
208// specialization for 7 parameters
195209template<typename _ClassType, typename _ReturnType, typename _P1Type, typename _P2Type, typename _P3Type, typename _P4Type, typename _P5Type, typename _P6Type, typename _P7Type>
196struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _noparam, _noparam, _noparam, _noparam>
210struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _noparam, _noparam, _noparam, _noparam, _noparam>
197211{
198212   typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type);
199213   typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type);
200214   typedef _ReturnType (_ClassType::*member_func_type)(_P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type);
201215};
202216
217// specialization for 6 parameters
203218template<typename _ClassType, typename _ReturnType, typename _P1Type, typename _P2Type, typename _P3Type, typename _P4Type, typename _P5Type, typename _P6Type>
204struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _noparam, _noparam, _noparam, _noparam, _noparam>
219struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam>
205220{
206221   typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type);
207222   typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type);
208223   typedef _ReturnType (_ClassType::*member_func_type)(_P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type);
209224};
210225
226// specialization for 5 parameters
211227template<typename _ClassType, typename _ReturnType, typename _P1Type, typename _P2Type, typename _P3Type, typename _P4Type, typename _P5Type>
212struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam>
228struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam>
213229{
214230   typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type);
215231   typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type);
r29249r29250
218234
219235// specialization for 4 parameters
220236template<typename _ClassType, typename _ReturnType, typename _P1Type, typename _P2Type, typename _P3Type, typename _P4Type>
221struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam>
237struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam>
222238{
223239   typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type, _P2Type, _P3Type, _P4Type);
224240   typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type, _P2Type, _P3Type, _P4Type);
r29249r29250
227243
228244// specialization for 3 parameters
229245template<typename _ClassType, typename _ReturnType, typename _P1Type, typename _P2Type, typename _P3Type>
230struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam>
246struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam>
231247{
232248   typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type, _P2Type, _P3Type);
233249   typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type, _P2Type, _P3Type);
r29249r29250
236252
237253// specialization for 2 parameters
238254template<typename _ClassType, typename _ReturnType, typename _P1Type, typename _P2Type>
239struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam>
255struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam>
240256{
241257   typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type, _P2Type);
242258   typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type, _P2Type);
r29249r29250
245261
246262// specialization for 1 parameter
247263template<typename _ClassType, typename _ReturnType, typename _P1Type>
248struct delegate_traits<_ClassType, _ReturnType, _P1Type, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam>
264struct delegate_traits<_ClassType, _ReturnType, _P1Type, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam>
249265{
250266   typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type);
251267   typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type);
r29249r29250
254270
255271// specialization for no parameters
256272template<typename _ClassType, typename _ReturnType>
257struct delegate_traits<_ClassType, _ReturnType, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam>
273struct delegate_traits<_ClassType, _ReturnType, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam, _noparam>
258274{
259275   typedef _ReturnType (*static_func_type)(_ClassType *);
260276   typedef _ReturnType (*static_ref_func_type)(_ClassType &);
r29249r29250
427443      return (reinterpret_cast<_FunctionClass *>(_this->m_realobject)->*mfp)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11);
428444   }
429445
446   template<class _FunctionClass, typename _ReturnType, typename _P1Type, typename _P2Type, typename _P3Type, typename _P4Type, typename _P5Type, typename _P6Type, typename _P7Type, typename _P8Type, typename _P9Type, typename _P10Type, typename _P11Type, typename _P12Type>
447   static _ReturnType method_stub(delegate_generic_class *object, _P1Type p1, _P2Type p2, _P3Type p3, _P4Type p4, _P5Type p5, _P6Type p6, _P7Type p7, _P8Type p8, _P9Type p9, _P10Type p10, _P11Type p11, _P12Type p12)
448   {
449      delegate_mfp *_this = reinterpret_cast<delegate_mfp *>(object);
450      typedef _ReturnType (_FunctionClass::*mfptype)(_P1Type p1, _P2Type p2, _P3Type p3, _P4Type p4, _P5Type p5, _P6Type p6, _P7Type p7, _P8Type p8, _P9Type p9, _P10Type p10, _P11Type p11, _P12Type p12);
451      mfptype &mfp = *reinterpret_cast<mfptype *>(&_this->m_rawdata);
452      return (reinterpret_cast<_FunctionClass *>(_this->m_realobject)->*mfp)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12);
453   }
430454   // helper to convert a function of a given type to a generic function, forcing template
431455   // instantiation to match the source type
432456   template <typename _SourceType>
r29249r29250
515539// ======================> delegate_base
516540
517541// general delegate class template supporting up to 5 parameters
518template<typename _ReturnType, typename _P1Type = _noparam, typename _P2Type = _noparam, typename _P3Type = _noparam, typename _P4Type = _noparam, typename _P5Type = _noparam, typename _P6Type = _noparam, typename _P7Type = _noparam, typename _P8Type = _noparam, typename _P9Type = _noparam, typename _P10Type = _noparam, typename _P11Type = _noparam>
542template<typename _ReturnType, typename _P1Type = _noparam, typename _P2Type = _noparam, typename _P3Type = _noparam, typename _P4Type = _noparam, typename _P5Type = _noparam, typename _P6Type = _noparam, typename _P7Type = _noparam, typename _P8Type = _noparam, typename _P9Type = _noparam, typename _P10Type = _noparam, typename _P11Type = _noparam, typename _P12Type = _noparam>
519543class delegate_base
520544{
521545public:
r29249r29250
523547   template<class _FunctionClass>
524548   struct traits
525549   {
526      typedef typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _P11Type>::member_func_type member_func_type;
527      typedef typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _P11Type>::static_func_type static_func_type;
528      typedef typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _P11Type>::static_ref_func_type static_ref_func_type;
550      typedef typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _P11Type, _P12Type>::member_func_type member_func_type;
551      typedef typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _P11Type, _P12Type>::static_func_type static_func_type;
552      typedef typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _P11Type, _P12Type>::static_ref_func_type static_ref_func_type;
529553   };
530554   typedef typename traits<delegate_generic_class>::static_func_type generic_static_func;
531555
r29249r29250
633657   _ReturnType operator()(_P1Type p1, _P2Type p2, _P3Type p3, _P4Type p4, _P5Type p5, _P6Type p6, _P7Type p7, _P8Type p8, _P9Type p9) const { return (*m_function)(m_object, p1, p2, p3, p4, p5, p6, p7, p8, p9); }
634658   _ReturnType operator()(_P1Type p1, _P2Type p2, _P3Type p3, _P4Type p4, _P5Type p5, _P6Type p6, _P7Type p7, _P8Type p8, _P9Type p9, _P10Type p10) const { return (*m_function)(m_object, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); }
635659   _ReturnType operator()(_P1Type p1, _P2Type p2, _P3Type p3, _P4Type p4, _P5Type p5, _P6Type p6, _P7Type p7, _P8Type p8, _P9Type p9, _P10Type p10, _P11Type p11) const { return (*m_function)(m_object, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); }
660   _ReturnType operator()(_P1Type p1, _P2Type p2, _P3Type p3, _P4Type p4, _P5Type p5, _P6Type p6, _P7Type p7, _P8Type p8, _P9Type p9, _P10Type p10, _P11Type p11, _P12Type p12) const { return (*m_function)(m_object, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); }
636661
637662   // getters
638663   bool has_object() const { return (object() != NULL); }
r29249r29250
896921   template<class _FunctionClass> delegate(typename basetype::template traits<_FunctionClass>::static_ref_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { }
897922   delegate &operator=(const basetype &src) { *static_cast<basetype *>(this) = src; return *this; }
898923};
924
925// specialize for 12 parameters
926template<typename _ReturnType, typename _P1Type, typename _P2Type, typename _P3Type, typename _P4Type, typename _P5Type, typename _P6Type, typename _P7Type, typename _P8Type, typename _P9Type, typename _P10Type, typename _P11Type, typename _P12Type>
927class delegate<_ReturnType (_P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _P11Type, _P12Type)> : public delegate_base<_ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _P11Type, _P12Type>
928{
929   typedef delegate_base<_ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type, _P6Type, _P7Type, _P8Type, _P9Type, _P10Type, _P11Type, _P12Type> basetype;
930
931public:
932   // create a standard set of constructors
933   delegate() : basetype() { }
934   delegate(const basetype &src) : basetype(src) { }
935   delegate(const basetype &src, delegate_late_bind &object) : basetype(src, object) { }
936   template<class _FunctionClass> delegate(typename basetype::template traits<_FunctionClass>::member_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { }
937   template<class _FunctionClass> delegate(typename basetype::template traits<_FunctionClass>::static_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { }
938   template<class _FunctionClass> delegate(typename basetype::template traits<_FunctionClass>::static_ref_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { }
939   delegate &operator=(const basetype &src) { *static_cast<basetype *>(this) = src; return *this; }
940};
941
899942#endif  /* __DELEGATE_H__ */
trunk/src/emu/video/upd3301.c
r29249r29250
2222
2323*/
2424
25#include "emu.h"
2625#include "upd3301.h"
2726
2827
29// device type definition
30const device_type UPD3301 = &device_creator<upd3301_device>;
3128
32
3329//**************************************************************************
3430//  MACROS / CONSTANTS
3531//**************************************************************************
r29249r29250
6662
6763
6864//**************************************************************************
69//  INLINE HELPERS
65//  DEVICE DEFINITIONS
7066//**************************************************************************
7167
72//-------------------------------------------------
73//  set_interrupt -
74//-------------------------------------------------
68const device_type UPD3301 = &device_creator<upd3301_device>;
7569
76inline void upd3301_device::set_interrupt(int state)
77{
78   if (LOG) logerror("UPD3301 '%s' Interrupt: %u\n", tag(), state);
7970
80   m_out_int_func(state);
8171
82   if (!state)
83   {
84      m_status &= ~(STATUS_N | STATUS_E);
85   }
86}
87
88
89//-------------------------------------------------
90//  set_drq -
91//-------------------------------------------------
92
93inline void upd3301_device::set_drq(int state)
94{
95   if (LOG) logerror("UPD3301 '%s' DRQ: %u\n", tag(), state);
96
97   m_out_drq_func(state);
98}
99
100
101//-------------------------------------------------
102//  set_display -
103//-------------------------------------------------
104
105inline void upd3301_device::set_display(int state)
106{
107   if (state)
108   {
109      m_status |= STATUS_VE;
110   }
111   else
112   {
113      m_status &= ~STATUS_VE;
114   }
115}
116
117
118//-------------------------------------------------
119//  reset_counters -
120//-------------------------------------------------
121
122inline void upd3301_device::reset_counters()
123{
124   set_interrupt(0);
125   set_drq(0);
126}
127
128
129//-------------------------------------------------
130//  update_hrtc_timer -
131//-------------------------------------------------
132
133inline void upd3301_device::update_hrtc_timer(int state)
134{
135   int y = m_screen->vpos();
136
137   int next_x = state ? m_h : 0;
138   int next_y = state ? y : ((y + 1) % ((m_l + m_v) * m_width));
139
140   attotime duration = m_screen->time_until_pos(next_y, next_x);
141
142   m_hrtc_timer->adjust(duration, !state);
143}
144
145
146//-------------------------------------------------
147//  update_vrtc_timer -
148//-------------------------------------------------
149
150inline void upd3301_device::update_vrtc_timer(int state)
151{
152   int next_y = state ? (m_l * m_r) : 0;
153
154   attotime duration = m_screen->time_until_pos(next_y, 0);
155
156   m_vrtc_timer->adjust(duration, !state);
157}
158
159
160//-------------------------------------------------
161//  recompute_parameters -
162//-------------------------------------------------
163
164inline void upd3301_device::recompute_parameters()
165{
166   int horiz_pix_total = (m_h + m_z) * m_width;
167   int vert_pix_total = (m_l + m_v) * m_r;
168
169   attoseconds_t refresh = HZ_TO_ATTOSECONDS(clock()) * horiz_pix_total * vert_pix_total;
170
171   rectangle visarea;
172
173   visarea.set(0, (m_h * m_width) - 1, 0, (m_l * m_r) - 1);
174
175   if (LOG)
176   {
177      if (LOG) logerror("UPD3301 '%s' Screen: %u x %u @ %f Hz\n", tag(), horiz_pix_total, vert_pix_total, 1 / ATTOSECONDS_TO_DOUBLE(refresh));
178      if (LOG) logerror("UPD3301 '%s' Visible Area: (%u, %u) - (%u, %u)\n", tag(), visarea.min_x, visarea.min_y, visarea.max_x, visarea.max_y);
179   }
180
181   m_screen->configure(horiz_pix_total, vert_pix_total, visarea, refresh);
182
183   update_hrtc_timer(0);
184   update_vrtc_timer(0);
185}
186
187
188
18972//**************************************************************************
19073//  LIVE DEVICE
19174//**************************************************************************
r29249r29250
19477//  upd3301_device - constructor
19578//-------------------------------------------------
19679
197upd3301_device::upd3301_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
198   : device_t(mconfig, UPD3301, "UPD3301", tag, owner, clock, "upd3301", __FILE__),
199      device_video_interface(mconfig, *this),
200      m_status(0),
201      m_param_count(0),
202      m_data_fifo_pos(0),
203      m_attr_fifo_pos(0),
204      m_input_fifo(0),
205      m_me(0),
206      m_h(80),
207      m_l(20),
208      m_r(10),
209      m_v(6),
210      m_z(32),
211      m_attr_blink(0),
212      m_attr_frame(0),
213      m_cm(0),
214      m_cx(0),
215      m_cy(0),
216      m_cursor_blink(0),
217      m_cursor_frame(0)
80upd3301_device::upd3301_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
81   device_t(mconfig, UPD3301, "UPD3301", tag, owner, clock, "upd3301", __FILE__),
82   device_video_interface(mconfig, *this),
83   m_write_int(*this),
84   m_write_drq(*this),
85   m_write_hrtc(*this),
86   m_write_vrtc(*this),
87   m_width(0),
88   m_status(0),
89   m_param_count(0),
90   m_data_fifo_pos(0),
91   m_attr_fifo_pos(0),
92   m_input_fifo(0),
93   m_me(0),
94   m_h(80),
95   m_l(20),
96   m_r(10),
97   m_v(6),
98   m_z(32),
99   m_attr_blink(0),
100   m_attr_frame(0),
101   m_cm(0),
102   m_cx(0),
103   m_cy(0),
104   m_cursor_blink(0),
105   m_cursor_frame(0)
218106{
219107}
220108
221109
222110//-------------------------------------------------
223//  device_config_complete - perform any
224//  operations now that the configuration is
225//  complete
226//-------------------------------------------------
227
228void upd3301_device::device_config_complete()
229{
230   // inherit a copy of the static data
231   const upd3301_interface *intf = reinterpret_cast<const upd3301_interface *>(static_config());
232   if (intf != NULL)
233      *static_cast<upd3301_interface *>(this) = *intf;
234
235   // or initialize to defaults if none provided
236   else
237   {
238      memset(&m_out_int_cb, 0, sizeof(m_out_int_cb));
239      memset(&m_out_drq_cb, 0, sizeof(m_out_drq_cb));
240      memset(&m_out_hrtc_cb, 0, sizeof(m_out_hrtc_cb));
241      memset(&m_out_vrtc_cb, 0, sizeof(m_out_vrtc_cb));
242   }
243}
244
245
246//-------------------------------------------------
247111//  device_start - device-specific startup
248112//-------------------------------------------------
249113
250114void upd3301_device::device_start()
251115{
116   // resolve callbacks
117   m_display_cb.bind_relative_to(*owner());
118   m_write_drq.resolve_safe();
119   m_write_int.resolve_safe();
120   m_write_hrtc.resolve_safe();
121   m_write_vrtc.resolve_safe();
122
252123   // allocate timers
253124   m_hrtc_timer = timer_alloc(TIMER_HRTC);
254125   m_vrtc_timer = timer_alloc(TIMER_VRTC);
255126   m_drq_timer = timer_alloc(TIMER_DRQ);
256127
257   // resolve callbacks
258   m_out_int_func.resolve(m_out_int_cb, *this);
259   m_out_drq_func.resolve(m_out_drq_cb, *this);
260   m_out_hrtc_func.resolve(m_out_hrtc_cb, *this);
261   m_out_vrtc_func.resolve(m_out_vrtc_cb, *this);
262
263128   // state saving
264129   save_item(NAME(m_y));
265130   save_item(NAME(m_hrtc));
r29249r29250
329194   case TIMER_HRTC:
330195      if (LOG) logerror("UPD3301 '%s' HRTC: %u\n", tag(), param);
331196
332      m_out_hrtc_func(param);
197      m_write_hrtc(param);
333198      m_hrtc = param;
334199
335200      update_hrtc_timer(param);
r29249r29250
338203   case TIMER_VRTC:
339204      if (LOG) logerror("UPD3301 '%s' VRTC: %u\n", tag(), param);
340205
341      m_out_vrtc_func(param);
206      m_write_vrtc(param);
342207      m_vrtc = param;
343208
344209      if (param && !m_me)
r29249r29250
609474         int csr = m_cm && m_cursor_blink && ((y / m_r) == m_cy) && (sx == m_cx);
610475         int gpa = 0; // TODO
611476
612         m_display_cb(this, *m_bitmap, y, sx, cc, lc, hlgt, rvv, vsp, sl0, sl12, csr, gpa);
477         m_display_cb(*m_bitmap, y, sx, cc, lc, hlgt, rvv, vsp, sl0, sl12, csr, gpa);
613478      }
614479   }
615480
r29249r29250
655520   }
656521   return 0;
657522}
523
524
525//-------------------------------------------------
526//  set_interrupt -
527//-------------------------------------------------
528
529void upd3301_device::set_interrupt(int state)
530{
531   if (LOG) logerror("UPD3301 '%s' Interrupt: %u\n", tag(), state);
532
533   m_write_int(state);
534
535   if (!state)
536   {
537      m_status &= ~(STATUS_N | STATUS_E);
538   }
539}
540
541
542//-------------------------------------------------
543//  set_drq -
544//-------------------------------------------------
545
546void upd3301_device::set_drq(int state)
547{
548   if (LOG) logerror("UPD3301 '%s' DRQ: %u\n", tag(), state);
549
550   m_write_drq(state);
551}
552
553
554//-------------------------------------------------
555//  set_display -
556//-------------------------------------------------
557
558void upd3301_device::set_display(int state)
559{
560   if (state)
561   {
562      m_status |= STATUS_VE;
563   }
564   else
565   {
566      m_status &= ~STATUS_VE;
567   }
568}
569
570
571//-------------------------------------------------
572//  reset_counters -
573//-------------------------------------------------
574
575void upd3301_device::reset_counters()
576{
577   set_interrupt(0);
578   set_drq(0);
579}
580
581
582//-------------------------------------------------
583//  update_hrtc_timer -
584//-------------------------------------------------
585
586void upd3301_device::update_hrtc_timer(int state)
587{
588   int y = m_screen->vpos();
589
590   int next_x = state ? m_h : 0;
591   int next_y = state ? y : ((y + 1) % ((m_l + m_v) * m_width));
592
593   attotime duration = m_screen->time_until_pos(next_y, next_x);
594
595   m_hrtc_timer->adjust(duration, !state);
596}
597
598
599//-------------------------------------------------
600//  update_vrtc_timer -
601//-------------------------------------------------
602
603void upd3301_device::update_vrtc_timer(int state)
604{
605   int next_y = state ? (m_l * m_r) : 0;
606
607   attotime duration = m_screen->time_until_pos(next_y, 0);
608
609   m_vrtc_timer->adjust(duration, !state);
610}
611
612
613//-------------------------------------------------
614//  recompute_parameters -
615//-------------------------------------------------
616
617void upd3301_device::recompute_parameters()
618{
619   int horiz_pix_total = (m_h + m_z) * m_width;
620   int vert_pix_total = (m_l + m_v) * m_r;
621
622   attoseconds_t refresh = HZ_TO_ATTOSECONDS(clock()) * horiz_pix_total * vert_pix_total;
623
624   rectangle visarea;
625
626   visarea.set(0, (m_h * m_width) - 1, 0, (m_l * m_r) - 1);
627
628   if (LOG)
629   {
630      if (LOG) logerror("UPD3301 '%s' Screen: %u x %u @ %f Hz\n", tag(), horiz_pix_total, vert_pix_total, 1 / ATTOSECONDS_TO_DOUBLE(refresh));
631      if (LOG) logerror("UPD3301 '%s' Visible Area: (%u, %u) - (%u, %u)\n", tag(), visarea.min_x, visarea.min_y, visarea.max_x, visarea.max_y);
632   }
633
634   m_screen->configure(horiz_pix_total, vert_pix_total, visarea, refresh);
635
636   update_hrtc_timer(0);
637   update_vrtc_timer(0);
638}
639
trunk/src/emu/video/upd3301.h
r29249r29250
4242
4343
4444//**************************************************************************
45//  MACROS / CONSTANTS
45//  INTERFACE CONFIGURATION MACROS
4646//**************************************************************************
4747
48#define UPD3301_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int y, int sx, UINT8 cc, UINT8 lc, int hlgt, int rvv, int vsp, int sl0, int sl12, int csr, int gpa)
4849
4950
51#define MCFG_UPD3301_CHARACTER_WIDTH(_value) \
52   upd3301_device::static_set_character_width(*device, _value);
5053
51//**************************************************************************
52//  INTERFACE CONFIGURATION MACROS
53//**************************************************************************
54#define MCFG_UPD3301_DRAW_CHARACTER_CALLBACK_OWNER(_class, _method) \
55   upd3301_device::static_set_display_callback(*device, upd3301_draw_character_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
5456
55#define MCFG_UPD3301_ADD(_tag, _clock, _intrf) \
56   MCFG_DEVICE_ADD(_tag, UPD3301, _clock) \
57   MCFG_DEVICE_CONFIG(_intrf)
57#define MCFG_UPD3301_DRQ_CALLBACK(_write) \
58   devcb = &upd3301_device::set_drq_wr_callback(*device, DEVCB2_##_write);
5859
60#define MCFG_UPD3301_INT_CALLBACK(_write) \
61   devcb = &upd3301_device::set_int_wr_callback(*device, DEVCB2_##_write);
5962
60#define UPD3301_INTERFACE(name) \
61   const upd3301_interface (name) =
63#define MCFG_UPD3301_HRTC_CALLBACK(_write) \
64   devcb = &upd3301_device::set_hrtc_wr_callback(*device, DEVCB2_##_write);
6265
66#define MCFG_UPD3301_VRTC_CALLBACK(_write) \
67   devcb = &upd3301_device::set_vrtc_wr_callback(*device, DEVCB2_##_write);
6368
6469
70
6571//**************************************************************************
6672//  TYPE DEFINITIONS
6773//**************************************************************************
6874
69// ======================> upd3301_display_pixels_func
75typedef device_delegate<void (bitmap_rgb32 &bitmap, int y, int sx, UINT8 cc, UINT8 lc, int hlgt, int rvv, int vsp, int sl0, int sl12, int csr, int gpa)> upd3301_draw_character_delegate;
7076
71typedef void (*upd3301_display_pixels_func)(device_t *device, bitmap_rgb32 &bitmap, int y, int sx, UINT8 cc, UINT8 lc, int hlgt, int rvv, int vsp, int sl0, int sl12, int csr, int gpa);
72#define UPD3301_DISPLAY_PIXELS(name) void name(device_t *device, bitmap_rgb32 &bitmap, int y, int sx, UINT8 cc, UINT8 lc, int hlgt, int rvv, int vsp, int sl0, int sl12, int csr, int gpa)
7377
74
75// ======================> upd3301_interface
76
77struct upd3301_interface
78{
79   int m_width;                    // char width in pixels
80
81   upd3301_display_pixels_func m_display_cb;
82
83   devcb_write_line        m_out_int_cb;
84   devcb_write_line        m_out_drq_cb;
85   devcb_write_line        m_out_hrtc_cb;
86   devcb_write_line        m_out_vrtc_cb;
87};
88
89
90
9178// ======================> upd3301_device
9279
9380class upd3301_device :  public device_t,
94                  public device_video_interface,
95                  public upd3301_interface
81                  public device_video_interface
9682{
9783public:
9884   // construction/destruction
9985   upd3301_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
10086
87   static void static_set_character_width(device_t &device, int value) { downcast<upd3301_device &>(device).m_width = value; }
88   static void static_set_display_callback(device_t &device, upd3301_draw_character_delegate callback) { downcast<upd3301_device &>(device).m_display_cb = callback; }
89
90   template<class _Object> static devcb2_base &set_drq_wr_callback(device_t &device, _Object object) { return downcast<upd3301_device &>(device).m_write_drq.set_callback(object); }
91   template<class _Object> static devcb2_base &set_int_wr_callback(device_t &device, _Object object) { return downcast<upd3301_device &>(device).m_write_int.set_callback(object); }
92   template<class _Object> static devcb2_base &set_hrtc_wr_callback(device_t &device, _Object object) { return downcast<upd3301_device &>(device).m_write_hrtc.set_callback(object); }
93   template<class _Object> static devcb2_base &set_vrtc_wr_callback(device_t &device, _Object object) { return downcast<upd3301_device &>(device).m_write_vrtc.set_callback(object); }
94
10195   DECLARE_READ8_MEMBER( read );
10296   DECLARE_WRITE8_MEMBER( write );
10397   DECLARE_WRITE8_MEMBER( dack_w );
r29249r29250
109103
110104protected:
111105   // device-level overrides
112   virtual void device_config_complete();
113106   virtual void device_start();
114107   virtual void device_reset();
115108   virtual void device_clock_changed();
116109   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
117110
118111private:
119   static const device_timer_id TIMER_HRTC = 0;
120   static const device_timer_id TIMER_VRTC = 1;
121   static const device_timer_id TIMER_DRQ = 2;
112   enum
113   {
114      TIMER_HRTC,
115      TIMER_VRTC,
116      TIMER_DRQ
117   };
122118
123   inline void set_interrupt(int state);
124   inline void set_drq(int state);
125   inline void set_display(int state);
126   inline void reset_counters();
127   inline void update_hrtc_timer(int state);
128   inline void update_vrtc_timer(int state);
129   inline void recompute_parameters();
119   void set_interrupt(int state);
120   void set_drq(int state);
121   void set_display(int state);
122   void reset_counters();
123   void update_hrtc_timer(int state);
124   void update_vrtc_timer(int state);
125   void recompute_parameters();
130126
131127   void draw_scanline();
132128
133   devcb_resolved_write_line       m_out_int_func;
134   devcb_resolved_write_line       m_out_drq_func;
135   devcb_resolved_write_line       m_out_hrtc_func;
136   devcb_resolved_write_line       m_out_vrtc_func;
129   devcb2_write_line   m_write_int;
130   devcb2_write_line   m_write_drq;
131   devcb2_write_line   m_write_hrtc;
132   devcb2_write_line   m_write_vrtc;
137133
134   upd3301_draw_character_delegate m_display_cb;
135   int m_width;
136
138137   // screen drawing
139138   bitmap_rgb32 *m_bitmap;     // bitmap
140139   int m_y;                        // current scanline
trunk/src/mess/includes/pc8001.h
r29249r29250
7979
8080   DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
8181   DECLARE_WRITE_LINE_MEMBER(write_centronics_ack);
82   UPD3301_DRAW_CHARACTER_MEMBER( pc8001_display_pixels );
8283};
8384
8485class pc8001mk2_state : public pc8001_state
trunk/src/mess/drivers/pc8001.c
r29249r29250
364364   rgb_t::white
365365};
366366
367static UPD3301_DISPLAY_PIXELS( pc8001_display_pixels )
367UPD3301_DRAW_CHARACTER_MEMBER( pc8001_state::pc8001_display_pixels )
368368{
369   pc8001_state *state = device->machine().driver_data<pc8001_state>();
370
371   UINT8 data = state->m_char_rom->base()[(cc << 3) | lc];
369   UINT8 data = m_char_rom->base()[(cc << 3) | lc];
372370   int i;
373371
374372   if (lc >= 8) return;
375373   if (csr) data = 0xff;
376374
377   if (state->m_width80)
375   if (m_width80)
378376   {
379377      for (i = 0; i < 8; i++)
380378      {
r29249r29250
401399   }
402400}
403401
404static UPD3301_INTERFACE( pc8001_upd3301_intf )
405{
406   8,
407   pc8001_display_pixels,
408   DEVCB_NULL,
409   DEVCB_DEVICE_LINE_MEMBER(I8257_TAG, i8257_device, i8257_drq2_w),
410   DEVCB_NULL,
411   DEVCB_NULL
412};
413
414402/* 8255 Interface */
415403
416404static I8255A_INTERFACE( ppi_intf )
r29249r29250
559547   MCFG_I8255A_ADD(I8255A_TAG, ppi_intf)
560548   MCFG_I8257_ADD(I8257_TAG, 4000000, dmac_intf)
561549   MCFG_UPD1990A_ADD(UPD1990A_TAG, XTAL_32_768kHz, NULL, NULL)
562   MCFG_UPD3301_ADD(UPD3301_TAG, 14318180, pc8001_upd3301_intf)
550   
551   MCFG_DEVICE_ADD(UPD3301_TAG, UPD3301, 14318180)
552   MCFG_UPD3301_CHARACTER_WIDTH(8)
553   MCFG_UPD3301_DRAW_CHARACTER_CALLBACK_OWNER(pc8001_state, pc8001_display_pixels)
554   MCFG_UPD3301_VRTC_CALLBACK(DEVWRITELINE(I8257_TAG, i8257_device, i8257_drq2_w))
563555
564556   MCFG_CENTRONICS_ADD(CENTRONICS_TAG, centronics_printers, "image")
565557   MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(pc8001_state, write_centronics_ack))
r29249r29250
599591   MCFG_I8255A_ADD(I8255A_TAG, ppi_intf)
600592   MCFG_I8257_ADD(I8257_TAG, 4000000, dmac_intf)
601593   MCFG_UPD1990A_ADD(UPD1990A_TAG, XTAL_32_768kHz, NULL, NULL)
602   MCFG_UPD3301_ADD(UPD3301_TAG, 14318180, pc8001_upd3301_intf)
603594
595   MCFG_DEVICE_ADD(UPD3301_TAG, UPD3301, 14318180)
596   MCFG_UPD3301_CHARACTER_WIDTH(8)
597   MCFG_UPD3301_DRAW_CHARACTER_CALLBACK_OWNER(pc8001_state, pc8001_display_pixels)
598   MCFG_UPD3301_VRTC_CALLBACK(DEVWRITELINE(I8257_TAG, i8257_device, i8257_drq2_w))
599
604600   MCFG_CENTRONICS_ADD(CENTRONICS_TAG, centronics_printers, "image")
605601
606602   MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team