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