|
|
1.1 root 1: /*
1.1.1.3 root 2: Hatari - xbios.c
3:
4: This file is distributed under the GNU Public License, version 2 or at
5: your option any later version. Read the file gpl.txt for details.
1.1 root 6:
7: XBios Handler (Trap #14)
8:
1.1.1.13! root 9: We intercept and direct some XBios calls to handle the RS-232 etc.
! 10: and to help with debugging.
1.1 root 11: */
1.1.1.10 root 12: const char XBios_fileid[] = "Hatari xbios.c : " __DATE__ " " __TIME__;
1.1 root 13:
14: #include "main.h"
1.1.1.3 root 15: #include "configuration.h"
1.1.1.10 root 16: #include "control.h"
1.1 root 17: #include "floppy.h"
1.1.1.4 root 18: #include "log.h"
1.1 root 19: #include "m68000.h"
20: #include "rs232.h"
1.1.1.3 root 21: #include "screenSnapShot.h"
1.1 root 22: #include "stMemory.h"
1.1.1.3 root 23: #include "xbios.h"
24:
1.1 root 25:
1.1.1.13! root 26: #define HATARI_CONTROL_OPCODE 255
1.1.1.4 root 27:
28:
1.1 root 29: /* List of Atari ST RS-232 baud rates */
1.1.1.7 root 30: static const int BaudRates[] =
31: {
32: 19200, /* 0 */
33: 9600, /* 1 */
34: 4800, /* 2 */
35: 3600, /* 3 */
36: 2400, /* 4 */
37: 2000, /* 5 */
38: 1800, /* 6 */
39: 1200, /* 7 */
40: 600, /* 8 */
41: 300, /* 9 */
42: 200, /* 10 */
43: 150, /* 11 */
44: 134, /* 12 */
45: 110, /* 13 */
46: 75, /* 14 */
47: 50 /* 15 */
1.1 root 48: };
49:
1.1.1.2 root 50:
1.1.1.13! root 51: #if ENABLE_TRACING
1.1.1.7 root 52: /**
53: * XBIOS Floppy Read
54: * Call 8
55: */
1.1.1.8 root 56: static bool XBios_Floprd(Uint32 Params)
1.1 root 57: {
1.1.1.12 root 58: Uint32 pBuffer;
1.1.1.7 root 59: Uint16 Dev,Sector,Side,Track,Count;
1.1 root 60:
1.1.1.7 root 61: /* Read details from stack */
1.1.1.13! root 62: pBuffer = STMemory_ReadLong(Params);
! 63: Dev = STMemory_ReadWord(Params+SIZE_LONG+SIZE_LONG); /* skip reserved long */
! 64: Sector = STMemory_ReadWord(Params+SIZE_LONG+SIZE_LONG+SIZE_WORD);
! 65: Track = STMemory_ReadWord(Params+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD);
! 66: Side = STMemory_ReadWord(Params+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD);
! 67: Count = STMemory_ReadWord(Params+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD);
! 68:
! 69: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS 0x08 Floprd(0x%x, %d, %d, %d, %d, %d) at PC 0x%X for: %s\n",
! 70: pBuffer, Dev, Sector, Track, Side, Count,
! 71: M68000_GetPC(), EmulationDrives[Dev].sFileName);
1.1.1.10 root 72: return false;
1.1 root 73: }
74:
1.1.1.2 root 75:
1.1.1.7 root 76: /**
77: * XBIOS Floppy Write
78: * Call 9
79: */
1.1.1.8 root 80: static bool XBios_Flopwr(Uint32 Params)
1.1 root 81: {
1.1.1.12 root 82: Uint32 pBuffer;
1.1.1.7 root 83: Uint16 Dev,Sector,Side,Track,Count;
1.1 root 84:
1.1.1.7 root 85: /* Read details from stack */
1.1.1.13! root 86: pBuffer = STMemory_ReadLong(Params);
! 87: Dev = STMemory_ReadWord(Params+SIZE_LONG+SIZE_LONG); /* skip reserved long */
! 88: Sector = STMemory_ReadWord(Params+SIZE_LONG+SIZE_LONG+SIZE_WORD);
! 89: Track = STMemory_ReadWord(Params+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD);
! 90: Side = STMemory_ReadWord(Params+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD);
! 91: Count = STMemory_ReadWord(Params+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD);
! 92:
! 93: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS 0x09 Flopwr(0x%x, %d, %d, %d, %d, %d) at PC 0x%X for: %s\n",
! 94: pBuffer, Dev, Sector, Track, Side, Count,
! 95: M68000_GetPC(), EmulationDrives[Dev].sFileName);
! 96: return false;
! 97: }
1.1 root 98:
99:
1.1.1.13! root 100: /**
! 101: * XBIOS Devconnect
! 102: * Call 139
! 103: */
! 104: static bool XBios_Devconnect(Uint32 Params)
! 105: {
! 106: Uint16 src,dst,clk,prescale,protocol;
! 107:
! 108: /* Read details from stack */
! 109: src = STMemory_ReadWord(Params);
! 110: dst = STMemory_ReadWord(Params+SIZE_WORD);
! 111: clk = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD);
! 112: prescale = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD);
! 113: protocol = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD);
! 114:
! 115: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS 0x8B Devconnect(%d, 0x%x, %d, %d, %d)\n",
! 116: src, dst, clk, prescale, protocol);
1.1.1.10 root 117: return false;
1.1 root 118: }
119:
1.1.1.13! root 120: #else /* !ENABLE_TRACING */
! 121: #define XBios_Floprd(params) false
! 122: #define XBios_Flopwr(params) false
! 123: #define XBios_Devconnect(params) false
! 124: #endif
! 125:
1.1.1.2 root 126:
1.1.1.7 root 127: /**
128: * XBIOS RsConf
129: * Call 15
130: */
1.1.1.8 root 131: static bool XBios_Rsconf(Uint32 Params)
1.1 root 132: {
1.1.1.12 root 133: Sint16 Baud,Ctrl,Ucr;
1.1 root 134:
1.1.1.13! root 135: Baud = STMemory_ReadWord(Params);
! 136: Ctrl = STMemory_ReadWord(Params+SIZE_WORD);
! 137: Ucr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD);
! 138: #if ENABLE_TRACING
1.1.1.12 root 139: Sint16 Rsr,Tsr,Scr;
1.1.1.13! root 140: Rsr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD);
! 141: Tsr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD);
! 142: Scr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD);
! 143: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS 0x0F Rsconf(%d, %d, %d, %d, %d, %d)\n",
1.1.1.12 root 144: Baud, Ctrl, Ucr, Rsr, Tsr, Scr);
145: #endif
1.1.1.7 root 146: /* Set baud rate and other configuration, if RS232 emaulation is enabled */
147: if (ConfigureParams.RS232.bEnableRS232)
148: {
1.1.1.11 root 149: if (Baud >= 0 && Baud < ARRAYSIZE(BaudRates))
1.1.1.7 root 150: {
151: /* Convert ST baud rate index to value */
152: int BaudRate = BaudRates[Baud];
153: /* And set new baud rate: */
154: RS232_SetBaudRate(BaudRate);
155: }
156:
157: if (Ucr != -1)
158: {
159: RS232_HandleUCR(Ucr);
160: }
161:
162: if (Ctrl != -1)
163: {
164: RS232_SetFlowControl(Ctrl);
165: }
1.1 root 166:
1.1.1.10 root 167: return true;
1.1.1.7 root 168: }
1.1 root 169:
1.1.1.10 root 170: return false;
1.1 root 171: }
172:
1.1.1.2 root 173:
1.1.1.7 root 174: /**
175: * XBIOS Scrdmp
176: * Call 20
177: */
1.1.1.8 root 178: static bool XBios_Scrdmp(Uint32 Params)
1.1 root 179: {
1.1.1.13! root 180: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS 0x14 Scrdmp()\n");
1.1.1.7 root 181: ScreenSnapShot_SaveScreen();
1.1.1.3 root 182:
1.1.1.7 root 183: /* Correct return code? */
184: Regs[REG_D0] = 0;
1.1 root 185:
1.1.1.10 root 186: return true;
187: }
188:
189:
190: /**
191: * XBIOS remote control interface for Hatari
192: * Call 255
193: */
194: static bool XBios_HatariControl(Uint32 Params)
195: {
196: char *pText;
1.1.1.13! root 197: pText = (char *)STRAM_ADDR(STMemory_ReadLong(Params));
! 198: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS 0x%02X HatariControl(%s)\n", HATARI_CONTROL_OPCODE, pText);
1.1.1.10 root 199: Control_ProcessBuffer(pText);
200: Regs[REG_D0] = 0;
201: return true;
1.1 root 202: }
203:
1.1.1.2 root 204:
1.1.1.11 root 205: #if ENABLE_TRACING
206: /**
207: * Map XBIOS call opcode to XBIOS function name
208: */
209: static const char* XBios_Call2Name(Uint16 opcode)
210: {
211: static const char* names[] = {
212: "Initmous",
213: "Ssbrk",
214: "Physbase",
215: "Logbase",
216: "Getrez",
217: "Setscreen",
218: "Setpalette",
219: "Setcolor",
220: "Floprd",
221: "Flopwr",
222: "Flopfmt",
223: "Dbmsg",
224: "Midiws",
225: "Mfpint",
226: "Iorec",
227: "Rsconf",
228: "Keytbl",
229: "Random",
230: "Protobt",
231: "Flopver",
232: "Scrdmp",
233: "Cursconf",
234: "Settime",
235: "Gettime",
236: "Bioskeys",
237: "Ikbdws",
238: "Jdisint",
239: "Jenabint",
240: "Giaccess",
241: "Offgibit",
242: "Ongibit",
243: "Xbtimer",
244: "Dosound",
245: "Setprt",
246: "Kbdvbase",
247: "Kbrate",
248: "Prtblk",
249: "Vsync",
250: "Supexec",
251: "Puntaes",
252: NULL, /* 40 */
253: "Floprate",
254: "DMAread",
255: "DMAwrite",
256: "Bconmap",
257: NULL, /* 45 */
258: "NVMaccess",
259: NULL, /* 47 */
260: "Metainit",
261: NULL, /* 49 */
262: NULL,
263: NULL,
264: NULL,
265: NULL,
266: NULL,
267: NULL,
268: NULL,
269: NULL,
270: NULL,
271: NULL,
272: NULL,
273: NULL,
274: NULL,
275: NULL, /* 63 */
276: "Blitmode",
277: NULL, /* 65 */
278: NULL,
279: NULL,
280: NULL,
281: NULL,
282: NULL,
283: NULL,
284: NULL,
285: NULL,
286: NULL,
287: NULL,
288: NULL,
289: NULL,
290: NULL,
291: NULL, /* 79 */
292: "EsetShift",
293: "EgetShift",
294: "EsetBank",
295: "EsetColor",
296: "EsetPalette",
297: "EgetPalette",
298: "EsetGray",
299: "EsetSmear",
300: "VsetMode",
301: "VgetMonitor",
302: "VsetSync",
303: "VgetSize",
304: NULL, /* 92 */
305: "VsetRGB",
306: "VgetRGB",
307: NULL, /* 95 */
308: "Dsp_DoBlock",
309: "Dsp_BlkHandShake",
310: "Dsp_BlkUnpacked",
311: "Dsp_InStream",
312: "Dsp_OutStream",
313: "Dsp_IOStream",
314: "Dsp_RemoveInterrupts",
315: "Dsp_GetWordSize",
316: "Dsp_Lock",
317: "Dsp_Unlock",
318: "Dsp_Available",
319: "Dsp_Reserve",
320: "Dsp_LoadProg",
321: "Dsp_ExecProg",
322: "Dsp_ExecBoot",
323: "Dsp_LodToBinary",
324: "Dsp_TriggerHC",
325: "Dsp_RequestUniqueAbility",
326: "Dsp_GetProgAbility",
327: "Dsp_FlushSubroutines",
328: "Dsp_LoadSubroutine",
329: "Dsp_InqSubrAbility",
330: "Dsp_RunSubroutine",
331: "Dsp_Hf0",
332: "Dsp_Hf1",
333: "Dsp_Hf2",
334: "Dsp_Hf3",
335: "Dsp_BlkWords",
336: "Dsp_BlkBytes",
337: "Dsp_HStat",
338: "Dsp_SetVectors",
339: "Dsp_MultBlocks",
340: "Locksnd",
341: "Unlocksnd",
342: "Soundcmd",
343: "Setbuffer",
344: "Setmode",
345: "Settracks",
346: "Setmontracks",
347: "Setinterrupt",
348: "Buffoper",
349: "Dsptristate",
350: "Gpio",
351: "Devconnect",
352: "Sndstatus",
353: "Buffptr",
354: NULL, /* 142 */
355: NULL,
356: NULL,
357: NULL,
358: "VsetMask",
359: NULL, /* 147 */
360: NULL,
361: NULL,
362: NULL,
363: NULL,
364: NULL,
365: NULL,
366: NULL,
367: NULL,
368: NULL,
369: NULL,
370: NULL,
371: NULL,
372: NULL,
373: NULL,
374: NULL,
375: NULL,
376: NULL, /* 164 */
377: "WavePlay"
378: };
379: if (opcode < ARRAYSIZE(names) && names[opcode]) {
380: return names[opcode];
381: }
382: return "???";
383: }
1.1.1.13! root 384:
! 385: void XBios_Info(Uint32 dummy)
! 386: {
! 387: Uint16 opcode;
! 388: for (opcode = 0; opcode < 168; ) {
! 389: fprintf(stderr, "%02x %-21s", opcode,
! 390: XBios_Call2Name(opcode));
! 391: if (++opcode % 3 == 0) {
! 392: fputs("\n", stderr);
! 393: }
! 394: }
! 395: }
! 396: #else /* !ENABLE_TRACING */
! 397: void XBios_Info(Uint32 bShowOpcodes)
! 398: {
! 399: fputs("Hatari isn't configured with ENABLE_TRACING\n", stderr);
! 400: }
! 401: #endif /* !ENABLE_TRACING */
1.1.1.11 root 402:
403:
1.1.1.7 root 404: /**
405: * Check if we need to re-direct XBios call to our own routines
406: */
1.1.1.8 root 407: bool XBios(void)
1.1 root 408: {
1.1.1.7 root 409: Uint32 Params;
410: Uint16 XBiosCall;
1.1 root 411:
1.1.1.7 root 412: /* Find call */
413: Params = Regs[REG_A7];
414: XBiosCall = STMemory_ReadWord(Params);
1.1.1.13! root 415: Params += SIZE_WORD;
1.1.1.11 root 416:
1.1.1.7 root 417: switch (XBiosCall)
418: {
1.1.1.13! root 419: /* commands with special handling */
! 420: case 8:
1.1.1.7 root 421: return XBios_Floprd(Params);
1.1.1.13! root 422: case 9:
1.1.1.7 root 423: return XBios_Flopwr(Params);
1.1.1.13! root 424: case 15:
1.1.1.7 root 425: return XBios_Rsconf(Params);
1.1.1.13! root 426: case 20:
1.1.1.7 root 427: return XBios_Scrdmp(Params);
1.1.1.13! root 428: case 139:
! 429: return XBios_Devconnect(Params);
! 430: case HATARI_CONTROL_OPCODE:
1.1.1.10 root 431: return XBios_HatariControl(Params);
1.1.1.7 root 432:
1.1.1.13! root 433: case 2: /* Physbase */
! 434: case 3: /* Logbase */
! 435: case 4: /* Getrez */
! 436: case 17: /* Random */
! 437: case 23: /* Gettime */
! 438: case 24: /* Bioskeys */
! 439: case 34: /* Kbdvbase */
! 440: case 37: /* Vsync */
! 441: case 39: /* Puntaes */
! 442: case 81: /* EgetShift */
! 443: case 89: /* VgetMonitor */
! 444: case 103: /* Dsp_GetWordSize */
! 445: case 104: /* Dsp_Lock */
! 446: case 105: /* Dsp_Unlock */
! 447: case 113: /* Dsp_RequestUniqueAbility */
! 448: case 114: /* Dsp_GetProgAbility */
! 449: case 115: /* Dsp_FlushSubroutines */
! 450: case 121: /* Dsp_Hf2 */
! 451: case 122: /* Dsp_Hf3 */
! 452: case 125: /* Dsp_Hstat */
! 453: case 128: /* Locksnd */
! 454: case 129: /* Unlocksnd */
! 455: /* commands with no args */
! 456: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS 0x%02hX %s()\n",
! 457: XBiosCall, XBios_Call2Name(XBiosCall));
! 458: return false;
! 459:
! 460: case 1: /* Ssbrk */
! 461: case 14: /* Iorec */
! 462: case 26: /* Jdisint */
! 463: case 27: /* Jenabint */
! 464: case 29: /* Offgibit */
! 465: case 30: /* Ongibit */
! 466: case 33: /* Setprt */
! 467: case 44: /* Bconmap */
! 468: case 64: /* Blitmode */
! 469: case 80: /* EsetShift */
! 470: case 82: /* EsetBank */
! 471: case 86: /* EsetGray */
! 472: case 87: /* EsetSmear */
! 473: case 88: /* VsetMode */
! 474: case 90: /* VsetSync */
! 475: case 91: /* VgetSize */
! 476: case 102: /* Dsp_RemoveInterrupts */
! 477: case 112: /* Dsp_TriggerHC */
! 478: case 117: /* Dsp_InqSubrAbility */
! 479: case 118: /* Dsp_RunSubroutine */
! 480: case 119: /* Dsp_Hf0 */
! 481: case 120: /* Dsp_Hf1 */
! 482: case 132: /* Setmode */
! 483: case 134: /* Setmontracks */
! 484: case 136: /* Buffoper */
! 485: case 140: /* Sndstatus */
! 486: /* ones taking single word */
! 487: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS 0x%02hX %s(0x%hX)\n",
! 488: XBiosCall, XBios_Call2Name(XBiosCall),
! 489: STMemory_ReadWord(Params));
! 490: return false;
! 491:
! 492: case 6: /* Setpalette */
! 493: case 22: /* Settime */
! 494: case 32: /* Dosound */
! 495: case 36: /* Ptrblt */
! 496: case 38: /* Supexec */
! 497: case 48: /* Metainit */
! 498: case 141: /* Buffptr */
! 499: /* ones taking long or pointer */
! 500: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS 0x%02hX %s(0x%X)\n",
! 501: XBiosCall, XBios_Call2Name(XBiosCall),
! 502: STMemory_ReadLong(Params));
! 503: return false;
! 504:
! 505: case 7: /* Setcolor */
! 506: case 21: /* Cursconf */
! 507: case 28: /* Giaccess */
! 508: case 35: /* Kbrate */
! 509: case 41: /* Floprate */
! 510: case 83: /* EsetColor */
! 511: case 130: /* Soundcmd */
! 512: case 133: /* Settracks */
! 513: case 137: /* Dsptristate */
! 514: case 135: /* Setinterrupt */
! 515: case 138: /* Gpio */
! 516: /* ones taking two words */
! 517: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS 0x%02hX %s(0x%hX, 0x%hX)\n",
! 518: XBiosCall, XBios_Call2Name(XBiosCall),
! 519: STMemory_ReadWord(Params),
! 520: STMemory_ReadWord(Params+SIZE_WORD));
! 521: return false;
! 522:
! 523: case 12: /* Midiws */
! 524: case 13: /* Mfpint */
! 525: case 25: /* Ikbdws */
! 526: /* ones taking word lenght/index and pointer */
! 527: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS 0x%02hX %s(%hd, 0x%X)\n",
! 528: XBiosCall, XBios_Call2Name(XBiosCall),
! 529: STMemory_ReadWord(Params),
! 530: STMemory_ReadLong(Params+SIZE_WORD));
! 531: return false;
! 532:
! 533: case 11: /* Dbmsg */
! 534: case 84: /* EsetPalette */
! 535: case 85: /* EgetPalette */
! 536: case 93: /* VsetRGB */
! 537: case 94: /* VgetRGB */
! 538: /* ones taking word, word and long/pointer */
! 539: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS 0x%02hX %s(0x%hX, 0x%hX, 0x%X)\n",
! 540: XBiosCall, XBios_Call2Name(XBiosCall),
! 541: STMemory_ReadWord(Params),
! 542: STMemory_ReadWord(Params+SIZE_WORD),
! 543: STMemory_ReadLong(Params+SIZE_WORD+SIZE_WORD));
! 544: return false;
! 545:
! 546: case 106: /* Dsp_Available */
! 547: case 107: /* Dsp_Reserve */
! 548: case 111: /* Dsp_LodToBinary */
! 549: case 126: /* Dsp_SetVectors */
! 550: /* ones taking two longs/pointers */
! 551: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS 0x%02hX %s(0x%X, 0x%X)\n",
! 552: XBiosCall, XBios_Call2Name(XBiosCall),
! 553: STMemory_ReadLong(Params),
! 554: STMemory_ReadLong(Params+SIZE_LONG));
! 555: return false;
! 556:
! 557: case 5: /* Setscreen */
! 558: case 109: /* Dsp_ExecProg */
! 559: case 110: /* Dsp_ExecBoot */
! 560: case 116: /* Dsp_LoadSubroutine */
! 561: case 146: /* VsetMask */
! 562: /* ones taking two longs/pointers and a word */
! 563: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS 0x%02hX %s(0x%X, 0x%X, 0x%hX)\n",
! 564: XBiosCall, XBios_Call2Name(XBiosCall),
! 565: STMemory_ReadLong(Params),
! 566: STMemory_ReadLong(Params+SIZE_LONG),
! 567: STMemory_ReadWord(Params+SIZE_LONG+SIZE_LONG));
! 568: return false;
! 569:
! 570: default: /* rest of XBios calls */
! 571: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS 0x%02hX (%s)\n",
! 572: XBiosCall, XBios_Call2Name(XBiosCall));
1.1.1.10 root 573: return false;
1.1.1.7 root 574: }
1.1 root 575: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.