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