mikie.h
  1  //
  2  // Copyright (c) 2004 K. Wilkins
  3  //
  4  // This software is provided 'as-is', without any express or implied warranty.
  5  // In no event will the authors be held liable for any damages arising from
  6  // the use of this software.
  7  //
  8  // Permission is granted to anyone to use this software for any purpose,
  9  // including commercial applications, and to alter it and redistribute it
 10  // freely, subject to the following restrictions:
 11  //
 12  // 1. The origin of this software must not be misrepresented; you must not
 13  //    claim that you wrote the original software. If you use this software
 14  //    in a product, an acknowledgment in the product documentation would be
 15  //    appreciated but is not required.
 16  //
 17  // 2. Altered source versions must be plainly marked as such, and must not
 18  //    be misrepresented as being the original software.
 19  //
 20  // 3. This notice may not be removed or altered from any source distribution.
 21  //
 22  
 23  //////////////////////////////////////////////////////////////////////////////
 24  //                       Handy - An Atari Lynx Emulator                     //
 25  //                          Copyright (c) 1996,1997                         //
 26  //                                 K. Wilkins                               //
 27  //////////////////////////////////////////////////////////////////////////////
 28  // Mikey class header file                                                  //
 29  //////////////////////////////////////////////////////////////////////////////
 30  //                                                                          //
 31  // This header file provides the interface definition and some of the code  //
 32  // for the Mikey chip within the Lynx. The most crucial code is the         //
 33  // Update() function which as you can probably guess updates all of the     //
 34  // Mikey hardware counters and screen DMA from the prevous time it was      //
 35  // called. Yes I know how to spell Mikey but I cant be bothered to change   //
 36  // it everywhere.                                                           //
 37  //                                                                          //
 38  //    K. Wilkins                                                            //
 39  // August 1997                                                              //
 40  //                                                                          //
 41  //////////////////////////////////////////////////////////////////////////////
 42  // Revision History:                                                        //
 43  // -----------------                                                        //
 44  //                                                                          //
 45  // 01Aug1997 KW Document header added & class documented.                   //
 46  //                                                                          //
 47  //////////////////////////////////////////////////////////////////////////////
 48  
 49  #ifndef MIKIE_H
 50  #define MIKIE_H
 51  
 52  //#define	TRACE_MIKIE
 53  
 54  #ifdef TRACE_MIKIE
 55  
 56  #define TRACE_MIKIE0(msg)					_RPT1(_CRT_WARN,"CMikie::"msg" (Time=%012d)\n",gSystemCycleCount)
 57  #define TRACE_MIKIE1(msg,arg1)				_RPT2(_CRT_WARN,"CMikie::"msg" (Time=%012d)\n",arg1,gSystemCycleCount)
 58  #define TRACE_MIKIE2(msg,arg1,arg2)			_RPT3(_CRT_WARN,"CMikie::"msg" (Time=%012d)\n",arg1,arg2,gSystemCycleCount)
 59  #define TRACE_MIKIE3(msg,arg1,arg2,arg3)	_RPT4(_CRT_WARN,"CMikie::"msg" (Time=%012d)\n",arg1,arg2,arg3,gSystemCycleCount)
 60  
 61  #else
 62  
 63  #define TRACE_MIKIE0(msg)
 64  #define TRACE_MIKIE1(msg,arg1)
 65  #define TRACE_MIKIE2(msg,arg1,arg2)
 66  #define TRACE_MIKIE3(msg,arg1,arg2,arg3)
 67  
 68  #endif
 69  
 70  class CSystem;
 71  
 72  #define MIKIE_START	0xfd00
 73  #define MIKIE_SIZE	0x100
 74  
 75  #define DMA_RDWR_CYC	4
 76  
 77  //
 78  // Define counter types and defines
 79  //
 80  
 81  #define CTRL_A_IRQEN	0x80
 82  #define CTRL_A_RTD		0x40
 83  #define CTRL_A_RELOAD	0x10
 84  #define CTRL_A_COUNT	0x08
 85  #define CTRL_A_DIVIDE	0x07
 86  
 87  #define CTRL_B_TDONE	0x08
 88  #define CTRL_B_LASTCK	0x04
 89  #define CTRL_B_CIN		0x02
 90  #define CTRL_B_COUT		0x01
 91  
 92  #define LINE_TIMER		0x00
 93  #define SCREEN_TIMER	0x02
 94  
 95  #define LINE_WIDTH		160
 96  #define LINE_SIZE		80
 97  
 98  #define UART_TX_INACTIVE	0x80000000
 99  #define UART_RX_INACTIVE	0x80000000
100  #define UART_BREAK_CODE		0x00008000
101  #define UART_MAX_RX_QUEUE	32
102  #define UART_TX_TIME_PERIOD	(11)
103  #define UART_RX_TIME_PERIOD	(11)
104  #define UART_RX_NEXT_DELAY	(44)
105  
106  typedef struct
107  {
108     union
109     {
110        struct
111        {
112  #ifdef MSB_FIRST
113           UBYTE unused:8;
114           UBYTE unused2:8;
115           UBYTE unused3:4;
116           UBYTE Blue:4;
117           UBYTE Red:4;
118           UBYTE Green:4;
119  #else
120           UBYTE Green:4;
121           UBYTE Red:4;
122           UBYTE Blue:4;
123  #endif
124        }Colours;
125        ULONG     Index;
126     };
127  }TPALETTE;
128  
129  
130  //
131  // Enumerated types for possible mikie windows independant modes
132  //
133  enum
134  {
135     MIKIE_BAD_MODE=0,
136     MIKIE_NO_ROTATE,
137     MIKIE_ROTATE_L,
138     MIKIE_ROTATE_R
139  };
140  
141  enum
142  {
143     MIKIE_PIXEL_FORMAT_16BPP_565=0,
144     MIKIE_PIXEL_FORMAT_16BPP_565_BE
145  };
146  
147  class CMikie : public CLynxBase
148  {
149     public:
150        CMikie(CSystem& parent, ULONG displayformat, ULONG samplerate);
151        ~CMikie();
152  
153        bool	ContextSave(LSS_FILE *fp);
154        bool	ContextLoad(LSS_FILE *fp);
155        void	Reset(void);
156  
157        UBYTE	Peek(ULONG addr);
158        void	Poke(ULONG addr,UBYTE data);
159        ULONG	ObjectSize(void) {return MIKIE_SIZE;};
160        void	PresetForHomebrew(void);
161  
162        void	ComLynxCable(int status);
163        void	ComLynxRxData(int data);
164        void	ComLynxTxLoopback(int data);
165        void	ComLynxTxCallback(void (*function)(int data,ULONG objref),ULONG objref);
166  
167        void	BuildPalette(void);
168  
169        void Update(void);
170        void SetRotation(UBYTE data) {mDisplayRotate_Pending = data;};
171        inline bool SwitchAudInDir(void){ return(mIODIR&0x10);};
172        inline bool SwitchAudInValue(void){ return (mIODAT&0x10);};
173  
174     private:
175        inline void UpdateSound(void);
176        inline void UpdateCalcSound(void);
177        inline void ResetDisplayPtr();
178        ULONG	DisplayRenderLine(void);
179        void	BlowOut(void);
180  
181     private:
182        CSystem		&mSystem;
183  
184        // Hardware storage
185  
186        ULONG		mDisplayAddress;
187        ULONG		mAudioInputComparator;
188        ULONG		mTimerStatusFlags;
189        ULONG		mTimerInterruptMask;
190        UBYTE    mDisplayRotate;
191        UBYTE    mDisplayRotate_Pending;
192  
193        TPALETTE	mPalette[16];
194        HandyPixel  mColourMap[4096];
195  
196        ULONG		mIODAT;
197        ULONG		mIODIR;
198        ULONG		mIODAT_REST_SIGNAL;
199  
200        ULONG		mDISPCTL_DMAEnable;
201        ULONG		mDISPCTL_Flip;
202        ULONG		mDISPCTL_FourColour;
203        ULONG		mDISPCTL_Colour;
204  
205        ULONG		mTIM_0_BKUP;
206        ULONG		mTIM_0_ENABLE_RELOAD;
207        ULONG		mTIM_0_ENABLE_COUNT;
208        ULONG		mTIM_0_LINKING;
209        ULONG		mTIM_0_CURRENT;
210        ULONG		mTIM_0_TIMER_DONE;
211        ULONG		mTIM_0_LAST_CLOCK;
212        ULONG		mTIM_0_BORROW_IN;
213        ULONG		mTIM_0_BORROW_OUT;
214        ULONG		mTIM_0_LAST_LINK_CARRY;
215        ULONG		mTIM_0_LAST_COUNT;
216  
217        ULONG		mTIM_1_BKUP;
218        ULONG		mTIM_1_ENABLE_RELOAD;
219        ULONG		mTIM_1_ENABLE_COUNT;
220        ULONG		mTIM_1_LINKING;
221        ULONG		mTIM_1_CURRENT;
222        ULONG		mTIM_1_TIMER_DONE;
223        ULONG		mTIM_1_LAST_CLOCK;
224        ULONG		mTIM_1_BORROW_IN;
225        ULONG		mTIM_1_BORROW_OUT;
226        ULONG		mTIM_1_LAST_LINK_CARRY;
227        ULONG		mTIM_1_LAST_COUNT;
228  
229        ULONG		mTIM_2_BKUP;
230        ULONG		mTIM_2_ENABLE_RELOAD;
231        ULONG		mTIM_2_ENABLE_COUNT;
232        ULONG		mTIM_2_LINKING;
233        ULONG		mTIM_2_CURRENT;
234        ULONG		mTIM_2_TIMER_DONE;
235        ULONG		mTIM_2_LAST_CLOCK;
236        ULONG		mTIM_2_BORROW_IN;
237        ULONG		mTIM_2_BORROW_OUT;
238        ULONG		mTIM_2_LAST_LINK_CARRY;
239        ULONG		mTIM_2_LAST_COUNT;
240  
241        ULONG		mTIM_3_BKUP;
242        ULONG		mTIM_3_ENABLE_RELOAD;
243        ULONG		mTIM_3_ENABLE_COUNT;
244        ULONG		mTIM_3_LINKING;
245        ULONG		mTIM_3_CURRENT;
246        ULONG		mTIM_3_TIMER_DONE;
247        ULONG		mTIM_3_LAST_CLOCK;
248        ULONG		mTIM_3_BORROW_IN;
249        ULONG		mTIM_3_BORROW_OUT;
250        ULONG		mTIM_3_LAST_LINK_CARRY;
251        ULONG		mTIM_3_LAST_COUNT;
252  
253        ULONG		mTIM_4_BKUP;
254        ULONG		mTIM_4_ENABLE_RELOAD;
255        ULONG		mTIM_4_ENABLE_COUNT;
256        ULONG		mTIM_4_LINKING;
257        ULONG		mTIM_4_CURRENT;
258        ULONG		mTIM_4_TIMER_DONE;
259        ULONG		mTIM_4_LAST_CLOCK;
260        ULONG		mTIM_4_BORROW_IN;
261        ULONG		mTIM_4_BORROW_OUT;
262        ULONG		mTIM_4_LAST_LINK_CARRY;
263        ULONG		mTIM_4_LAST_COUNT;
264  
265        ULONG		mTIM_5_BKUP;
266        ULONG		mTIM_5_ENABLE_RELOAD;
267        ULONG		mTIM_5_ENABLE_COUNT;
268        ULONG		mTIM_5_LINKING;
269        ULONG		mTIM_5_CURRENT;
270        ULONG		mTIM_5_TIMER_DONE;
271        ULONG		mTIM_5_LAST_CLOCK;
272        ULONG		mTIM_5_BORROW_IN;
273        ULONG		mTIM_5_BORROW_OUT;
274        ULONG		mTIM_5_LAST_LINK_CARRY;
275        ULONG		mTIM_5_LAST_COUNT;
276  
277        ULONG		mTIM_6_BKUP;
278        ULONG		mTIM_6_ENABLE_RELOAD;
279        ULONG		mTIM_6_ENABLE_COUNT;
280        ULONG		mTIM_6_LINKING;
281        ULONG		mTIM_6_CURRENT;
282        ULONG		mTIM_6_TIMER_DONE;
283        ULONG		mTIM_6_LAST_CLOCK;
284        ULONG		mTIM_6_BORROW_IN;
285        ULONG		mTIM_6_BORROW_OUT;
286        ULONG		mTIM_6_LAST_LINK_CARRY;
287        ULONG		mTIM_6_LAST_COUNT;
288  
289        ULONG		mTIM_7_BKUP;
290        ULONG		mTIM_7_ENABLE_RELOAD;
291        ULONG		mTIM_7_ENABLE_COUNT;
292        ULONG		mTIM_7_LINKING;
293        ULONG		mTIM_7_CURRENT;
294        ULONG		mTIM_7_TIMER_DONE;
295        ULONG		mTIM_7_LAST_CLOCK;
296        ULONG		mTIM_7_BORROW_IN;
297        ULONG		mTIM_7_BORROW_OUT;
298        ULONG		mTIM_7_LAST_LINK_CARRY;
299        ULONG		mTIM_7_LAST_COUNT;
300  
301        ULONG		mAUDIO_0_BKUP;
302        ULONG		mAUDIO_0_ENABLE_RELOAD;
303        ULONG		mAUDIO_0_ENABLE_COUNT;
304        ULONG		mAUDIO_0_LINKING;
305        ULONG		mAUDIO_0_CURRENT;
306        ULONG		mAUDIO_0_TIMER_DONE;
307        ULONG		mAUDIO_0_LAST_CLOCK;
308        ULONG		mAUDIO_0_BORROW_IN;
309        ULONG		mAUDIO_0_BORROW_OUT;
310        ULONG		mAUDIO_0_LAST_LINK_CARRY;
311        ULONG		mAUDIO_0_LAST_COUNT;
312        SBYTE		mAUDIO_0_VOLUME;
313        ULONG		mAUDIO_0_INTEGRATE_ENABLE;
314        ULONG		mAUDIO_0_WAVESHAPER;
315  
316        ULONG		mAUDIO_1_BKUP;
317        ULONG		mAUDIO_1_ENABLE_RELOAD;
318        ULONG		mAUDIO_1_ENABLE_COUNT;
319        ULONG		mAUDIO_1_LINKING;
320        ULONG		mAUDIO_1_CURRENT;
321        ULONG		mAUDIO_1_TIMER_DONE;
322        ULONG		mAUDIO_1_LAST_CLOCK;
323        ULONG		mAUDIO_1_BORROW_IN;
324        ULONG		mAUDIO_1_BORROW_OUT;
325        ULONG		mAUDIO_1_LAST_LINK_CARRY;
326        ULONG		mAUDIO_1_LAST_COUNT;
327        SBYTE		mAUDIO_1_VOLUME;
328        ULONG		mAUDIO_1_INTEGRATE_ENABLE;
329        ULONG		mAUDIO_1_WAVESHAPER;
330  
331        ULONG		mAUDIO_2_BKUP;
332        ULONG		mAUDIO_2_ENABLE_RELOAD;
333        ULONG		mAUDIO_2_ENABLE_COUNT;
334        ULONG		mAUDIO_2_LINKING;
335        ULONG		mAUDIO_2_CURRENT;
336        ULONG		mAUDIO_2_TIMER_DONE;
337        ULONG		mAUDIO_2_LAST_CLOCK;
338        ULONG		mAUDIO_2_BORROW_IN;
339        ULONG		mAUDIO_2_BORROW_OUT;
340        ULONG		mAUDIO_2_LAST_LINK_CARRY;
341        ULONG		mAUDIO_2_LAST_COUNT;
342        SBYTE		mAUDIO_2_VOLUME;
343        ULONG		mAUDIO_2_INTEGRATE_ENABLE;
344        ULONG		mAUDIO_2_WAVESHAPER;
345  
346        ULONG		mAUDIO_3_BKUP;
347        ULONG		mAUDIO_3_ENABLE_RELOAD;
348        ULONG		mAUDIO_3_ENABLE_COUNT;
349        ULONG		mAUDIO_3_LINKING;
350        ULONG		mAUDIO_3_CURRENT;
351        ULONG		mAUDIO_3_TIMER_DONE;
352        ULONG		mAUDIO_3_LAST_CLOCK;
353        ULONG		mAUDIO_3_BORROW_IN;
354        ULONG		mAUDIO_3_BORROW_OUT;
355        ULONG		mAUDIO_3_LAST_LINK_CARRY;
356        ULONG		mAUDIO_3_LAST_COUNT;
357        SBYTE		mAUDIO_3_VOLUME;
358        ULONG		mAUDIO_3_INTEGRATE_ENABLE;
359        ULONG		mAUDIO_3_WAVESHAPER;
360  
361        SBYTE		mAUDIO_OUTPUT[4];
362        UBYTE    mAUDIO_ATTEN[4];
363        ULONG		mSTEREO;
364        ULONG		mPAN;
365  
366        //
367        // Serial related variables
368        //
369        ULONG		mUART_RX_IRQ_ENABLE;
370        ULONG		mUART_TX_IRQ_ENABLE;
371  
372        ULONG		mUART_RX_COUNTDOWN;
373        ULONG		mUART_TX_COUNTDOWN;
374  
375        ULONG		mUART_SENDBREAK;
376        ULONG		mUART_TX_DATA;
377        ULONG		mUART_RX_DATA;
378        ULONG		mUART_RX_READY;
379  
380        ULONG		mUART_PARITY_ENABLE;
381        ULONG		mUART_PARITY_EVEN;
382  
383        SLONG		mUART_CABLE_PRESENT;
384        void		(*mpUART_TX_CALLBACK)(int data,ULONG objref);
385        ULONG		mUART_TX_CALLBACK_OBJECT;
386  
387        SLONG		mUART_Rx_input_queue[UART_MAX_RX_QUEUE];
388        ULONG 	mUART_Rx_input_ptr;
389        ULONG 	mUART_Rx_output_ptr;
390        SLONG		mUART_Rx_waiting;
391        SLONG		mUART_Rx_framing_error;
392        SLONG		mUART_Rx_overun_error;
393  
394        //
395        // Screen related
396        //
397  
398        UBYTE		*mpDisplayCurrent;
399        UBYTE		*mpRamPointer;
400        ULONG		mLynxLine;
401        ULONG		mLynxLineDMACounter;
402        ULONG		mLynxAddr;
403  
404        ULONG		mAudioSampleRate;
405        ULONG		mDisplayFormat;
406        ULONG		mDisplayPitch;
407  };
408  
409  
410  #endif