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