|
|
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.3 root 9: We intercept and direct some XBios calls to handle the RS-232 etc. and help
10: with floppy 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.8 root 26: #define XBIOS_DEBUG 0 /* for floppy read/write */
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.7 root 51: /**
52: * XBIOS Floppy Read
53: * Call 8
54: */
1.1.1.8 root 55: static bool XBios_Floprd(Uint32 Params)
1.1 root 56: {
1.1.1.4 root 57: #if XBIOS_DEBUG
1.1.1.7 root 58: char *pBuffer;
59: Uint16 Dev,Sector,Side,Track,Count;
1.1 root 60:
1.1.1.7 root 61: /* Read details from stack */
62: pBuffer = (char *)STRAM_ADDR(STMemory_ReadLong(Params+SIZE_WORD));
63: Dev = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG);
64: Sector = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD);
65: Track = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD);
66: Side = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD);
67: Count = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD);
1.1 root 68:
1.1.1.7 root 69: Log_Printf(LOG_DEBUG, "FLOPRD %s,%d,%d,%d,%d at addr 0x%X\n", EmulationDrives[Dev].szFileName,
70: Side, Track, Sector, Count, M68000_GetPC());
1.1 root 71: #endif
72:
1.1.1.10 root 73: return false;
1.1 root 74: }
75:
1.1.1.2 root 76:
1.1.1.7 root 77: /**
78: * XBIOS Floppy Write
79: * Call 9
80: */
1.1.1.8 root 81: static bool XBios_Flopwr(Uint32 Params)
1.1 root 82: {
1.1.1.4 root 83: #if XBIOS_DEBUG
1.1.1.7 root 84: char *pBuffer;
85: Uint16 Dev,Sector,Side,Track,Count;
1.1 root 86:
1.1.1.7 root 87: /* Read details from stack */
88: pBuffer = (char *)STRAM_ADDR(STMemory_ReadLong(Params+SIZE_WORD));
89: Dev = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG);
90: Sector = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD);
91: Track = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD);
92: Side = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD);
93: Count = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD);
1.1 root 94:
1.1.1.7 root 95: Log_Printf(LOG_DEBUG, "FLOPWR %s,%d,%d,%d,%d at addr 0x%X\n", EmulationDrives[Dev].szFileName,
96: Side, Track, Sector, Count, M68000_GetPC());
1.1 root 97: #endif
98:
1.1.1.10 root 99: return false;
1.1 root 100: }
101:
1.1.1.2 root 102:
1.1.1.7 root 103: /**
104: * XBIOS RsConf
105: * Call 15
106: */
1.1.1.8 root 107: static bool XBios_Rsconf(Uint32 Params)
1.1 root 108: {
1.1.1.11! root 109: Sint16 Baud,Ctrl,Ucr,Rsr,Tsr,Scr;
1.1 root 110:
1.1.1.7 root 111: Baud = STMemory_ReadWord(Params+SIZE_WORD);
112: Ctrl = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD);
113: Ucr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD);
114: Rsr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD);
115: Tsr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD);
116: Scr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD);
117:
118: /* Set baud rate and other configuration, if RS232 emaulation is enabled */
119: if (ConfigureParams.RS232.bEnableRS232)
120: {
1.1.1.11! root 121: if (Baud >= 0 && Baud < ARRAYSIZE(BaudRates))
1.1.1.7 root 122: {
123: /* Convert ST baud rate index to value */
124: int BaudRate = BaudRates[Baud];
125: /* And set new baud rate: */
126: RS232_SetBaudRate(BaudRate);
127: }
128:
129: if (Ucr != -1)
130: {
131: RS232_HandleUCR(Ucr);
132: }
133:
134: if (Ctrl != -1)
135: {
136: RS232_SetFlowControl(Ctrl);
137: }
1.1 root 138:
1.1.1.10 root 139: return true;
1.1.1.7 root 140: }
1.1 root 141:
1.1.1.10 root 142: return false;
1.1 root 143: }
144:
1.1.1.2 root 145:
1.1.1.7 root 146: /**
147: * XBIOS Scrdmp
148: * Call 20
149: */
1.1.1.8 root 150: static bool XBios_Scrdmp(Uint32 Params)
1.1 root 151: {
1.1.1.7 root 152: ScreenSnapShot_SaveScreen();
1.1.1.3 root 153:
1.1.1.7 root 154: /* Correct return code? */
155: Regs[REG_D0] = 0;
1.1 root 156:
1.1.1.10 root 157: return true;
158: }
159:
160:
161: /**
162: * XBIOS remote control interface for Hatari
163: * Call 255
164: */
165: static bool XBios_HatariControl(Uint32 Params)
166: {
167: char *pText;
168:
169: pText = (char *)STRAM_ADDR(STMemory_ReadLong(Params+SIZE_WORD));
170: Control_ProcessBuffer(pText);
171: Regs[REG_D0] = 0;
172: return true;
1.1 root 173: }
174:
1.1.1.2 root 175:
1.1.1.11! root 176: #if ENABLE_TRACING
! 177: /**
! 178: * Map XBIOS call opcode to XBIOS function name
! 179: */
! 180: static const char* XBios_Call2Name(Uint16 opcode)
! 181: {
! 182: static const char* names[] = {
! 183: "Initmous",
! 184: "Ssbrk",
! 185: "Physbase",
! 186: "Logbase",
! 187: "Getrez",
! 188: "Setscreen",
! 189: "Setpalette",
! 190: "Setcolor",
! 191: "Floprd",
! 192: "Flopwr",
! 193: "Flopfmt",
! 194: "Dbmsg",
! 195: "Midiws",
! 196: "Mfpint",
! 197: "Iorec",
! 198: "Rsconf",
! 199: "Keytbl",
! 200: "Random",
! 201: "Protobt",
! 202: "Flopver",
! 203: "Scrdmp",
! 204: "Cursconf",
! 205: "Settime",
! 206: "Gettime",
! 207: "Bioskeys",
! 208: "Ikbdws",
! 209: "Jdisint",
! 210: "Jenabint",
! 211: "Giaccess",
! 212: "Offgibit",
! 213: "Ongibit",
! 214: "Xbtimer",
! 215: "Dosound",
! 216: "Setprt",
! 217: "Kbdvbase",
! 218: "Kbrate",
! 219: "Prtblk",
! 220: "Vsync",
! 221: "Supexec",
! 222: "Puntaes",
! 223: NULL, /* 40 */
! 224: "Floprate",
! 225: "DMAread",
! 226: "DMAwrite",
! 227: "Bconmap",
! 228: NULL, /* 45 */
! 229: "NVMaccess",
! 230: NULL, /* 47 */
! 231: "Metainit",
! 232: NULL, /* 49 */
! 233: NULL,
! 234: NULL,
! 235: NULL,
! 236: NULL,
! 237: NULL,
! 238: NULL,
! 239: NULL,
! 240: NULL,
! 241: NULL,
! 242: NULL,
! 243: NULL,
! 244: NULL,
! 245: NULL,
! 246: NULL, /* 63 */
! 247: "Blitmode",
! 248: NULL, /* 65 */
! 249: NULL,
! 250: NULL,
! 251: NULL,
! 252: NULL,
! 253: NULL,
! 254: NULL,
! 255: NULL,
! 256: NULL,
! 257: NULL,
! 258: NULL,
! 259: NULL,
! 260: NULL,
! 261: NULL,
! 262: NULL, /* 79 */
! 263: "EsetShift",
! 264: "EgetShift",
! 265: "EsetBank",
! 266: "EsetColor",
! 267: "EsetPalette",
! 268: "EgetPalette",
! 269: "EsetGray",
! 270: "EsetSmear",
! 271: "VsetMode",
! 272: "VgetMonitor",
! 273: "VsetSync",
! 274: "VgetSize",
! 275: NULL, /* 92 */
! 276: "VsetRGB",
! 277: "VgetRGB",
! 278: NULL, /* 95 */
! 279: "Dsp_DoBlock",
! 280: "Dsp_BlkHandShake",
! 281: "Dsp_BlkUnpacked",
! 282: "Dsp_InStream",
! 283: "Dsp_OutStream",
! 284: "Dsp_IOStream",
! 285: "Dsp_RemoveInterrupts",
! 286: "Dsp_GetWordSize",
! 287: "Dsp_Lock",
! 288: "Dsp_Unlock",
! 289: "Dsp_Available",
! 290: "Dsp_Reserve",
! 291: "Dsp_LoadProg",
! 292: "Dsp_ExecProg",
! 293: "Dsp_ExecBoot",
! 294: "Dsp_LodToBinary",
! 295: "Dsp_TriggerHC",
! 296: "Dsp_RequestUniqueAbility",
! 297: "Dsp_GetProgAbility",
! 298: "Dsp_FlushSubroutines",
! 299: "Dsp_LoadSubroutine",
! 300: "Dsp_InqSubrAbility",
! 301: "Dsp_RunSubroutine",
! 302: "Dsp_Hf0",
! 303: "Dsp_Hf1",
! 304: "Dsp_Hf2",
! 305: "Dsp_Hf3",
! 306: "Dsp_BlkWords",
! 307: "Dsp_BlkBytes",
! 308: "Dsp_HStat",
! 309: "Dsp_SetVectors",
! 310: "Dsp_MultBlocks",
! 311: "Locksnd",
! 312: "Unlocksnd",
! 313: "Soundcmd",
! 314: "Setbuffer",
! 315: "Setmode",
! 316: "Settracks",
! 317: "Setmontracks",
! 318: "Setinterrupt",
! 319: "Buffoper",
! 320: "Dsptristate",
! 321: "Gpio",
! 322: "Devconnect",
! 323: "Sndstatus",
! 324: "Buffptr",
! 325: NULL, /* 142 */
! 326: NULL,
! 327: NULL,
! 328: NULL,
! 329: "VsetMask",
! 330: NULL, /* 147 */
! 331: NULL,
! 332: NULL,
! 333: NULL,
! 334: NULL,
! 335: NULL,
! 336: NULL,
! 337: NULL,
! 338: NULL,
! 339: NULL,
! 340: NULL,
! 341: NULL,
! 342: NULL,
! 343: NULL,
! 344: NULL,
! 345: NULL,
! 346: NULL,
! 347: NULL, /* 164 */
! 348: "WavePlay"
! 349: };
! 350: if (opcode < ARRAYSIZE(names) && names[opcode]) {
! 351: return names[opcode];
! 352: }
! 353: if (opcode == 255) {
! 354: return "HatariControl";
! 355: }
! 356: return "???";
! 357: }
! 358: #endif
! 359:
! 360:
1.1.1.7 root 361: /**
362: * Check if we need to re-direct XBios call to our own routines
363: */
1.1.1.8 root 364: bool XBios(void)
1.1 root 365: {
1.1.1.7 root 366: Uint32 Params;
367: Uint16 XBiosCall;
1.1 root 368:
1.1.1.7 root 369: /* Find call */
370: Params = Regs[REG_A7];
371: XBiosCall = STMemory_ReadWord(Params);
372:
1.1.1.11! root 373: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS %hd (%s)\n",
! 374: XBiosCall, XBios_Call2Name(XBiosCall));
! 375:
1.1.1.7 root 376: switch (XBiosCall)
377: {
378: case 8:
379: return XBios_Floprd(Params);
380: case 9:
381: return XBios_Flopwr(Params);
382: case 15:
383: return XBios_Rsconf(Params);
384: case 20:
385: return XBios_Scrdmp(Params);
1.1.1.10 root 386: case 255:
387: return XBios_HatariControl(Params);
1.1.1.7 root 388:
389: default: /* Call as normal! */
1.1.1.10 root 390: return false;
1.1.1.7 root 391: }
1.1 root 392: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.