|
|
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.9 ! root 12: const char XBios_rcsid[] = "Hatari $Id: xbios.c,v 1.18 2008-11-03 20:24:25 thothy Exp $";
1.1 root 13:
14: #include "main.h"
1.1.1.3 root 15: #include "configuration.h"
1.1 root 16: #include "floppy.h"
1.1.1.4 root 17: #include "log.h"
1.1 root 18: #include "m68000.h"
19: #include "rs232.h"
1.1.1.3 root 20: #include "screenSnapShot.h"
1.1 root 21: #include "stMemory.h"
1.1.1.3 root 22: #include "xbios.h"
23:
1.1 root 24:
1.1.1.8 root 25: #define XBIOS_DEBUG 0 /* for floppy read/write */
1.1.1.4 root 26:
27:
1.1 root 28: /* List of Atari ST RS-232 baud rates */
1.1.1.7 root 29: static const int BaudRates[] =
30: {
31: 19200, /* 0 */
32: 9600, /* 1 */
33: 4800, /* 2 */
34: 3600, /* 3 */
35: 2400, /* 4 */
36: 2000, /* 5 */
37: 1800, /* 6 */
38: 1200, /* 7 */
39: 600, /* 8 */
40: 300, /* 9 */
41: 200, /* 10 */
42: 150, /* 11 */
43: 134, /* 12 */
44: 110, /* 13 */
45: 75, /* 14 */
46: 50 /* 15 */
1.1 root 47: };
48:
1.1.1.2 root 49:
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.7 root 73: return FALSE;
1.1 root 74: }
75:
1.1.1.2 root 76:
77: /*-----------------------------------------------------------------------*/
1.1.1.7 root 78: /**
79: * XBIOS Floppy Write
80: * Call 9
81: */
1.1.1.8 root 82: static bool XBios_Flopwr(Uint32 Params)
1.1 root 83: {
1.1.1.4 root 84: #if XBIOS_DEBUG
1.1.1.7 root 85: char *pBuffer;
86: Uint16 Dev,Sector,Side,Track,Count;
1.1 root 87:
1.1.1.7 root 88: /* Read details from stack */
89: pBuffer = (char *)STRAM_ADDR(STMemory_ReadLong(Params+SIZE_WORD));
90: Dev = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG);
91: Sector = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD);
92: Track = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD);
93: Side = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD);
94: Count = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD);
1.1 root 95:
1.1.1.7 root 96: Log_Printf(LOG_DEBUG, "FLOPWR %s,%d,%d,%d,%d at addr 0x%X\n", EmulationDrives[Dev].szFileName,
97: Side, Track, Sector, Count, M68000_GetPC());
1.1 root 98: #endif
99:
1.1.1.7 root 100: return FALSE;
1.1 root 101: }
102:
1.1.1.2 root 103:
104: /*-----------------------------------------------------------------------*/
1.1.1.7 root 105: /**
106: * XBIOS RsConf
107: * Call 15
108: */
1.1.1.8 root 109: static bool XBios_Rsconf(Uint32 Params)
1.1 root 110: {
1.1.1.7 root 111: short int Baud,Ctrl,Ucr,Rsr,Tsr,Scr;
1.1 root 112:
1.1.1.7 root 113: Baud = STMemory_ReadWord(Params+SIZE_WORD);
114: Ctrl = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD);
115: Ucr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD);
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);
119:
120: /* Set baud rate and other configuration, if RS232 emaulation is enabled */
121: if (ConfigureParams.RS232.bEnableRS232)
122: {
123: if (Baud>=0 && Baud<=15)
124: {
125: /* Convert ST baud rate index to value */
126: int BaudRate = BaudRates[Baud];
127: /* And set new baud rate: */
128: RS232_SetBaudRate(BaudRate);
129: }
130:
131: if (Ucr != -1)
132: {
133: RS232_HandleUCR(Ucr);
134: }
135:
136: if (Ctrl != -1)
137: {
138: RS232_SetFlowControl(Ctrl);
139: }
1.1 root 140:
1.1.1.7 root 141: return TRUE;
142: }
1.1 root 143:
1.1.1.7 root 144: return FALSE;
1.1 root 145: }
146:
1.1.1.2 root 147:
148: /*-----------------------------------------------------------------------*/
1.1.1.7 root 149: /**
150: * XBIOS Scrdmp
151: * Call 20
152: */
1.1.1.8 root 153: static bool XBios_Scrdmp(Uint32 Params)
1.1 root 154: {
1.1.1.7 root 155: ScreenSnapShot_SaveScreen();
1.1.1.3 root 156:
1.1.1.7 root 157: /* Correct return code? */
158: Regs[REG_D0] = 0;
1.1 root 159:
1.1.1.7 root 160: return TRUE;
1.1 root 161: }
162:
1.1.1.2 root 163:
164: /*-----------------------------------------------------------------------*/
1.1.1.7 root 165: /**
166: * Check if we need to re-direct XBios call to our own routines
167: */
1.1.1.8 root 168: bool XBios(void)
1.1 root 169: {
1.1.1.7 root 170: Uint32 Params;
171: Uint16 XBiosCall;
1.1 root 172:
1.1.1.7 root 173: /* Find call */
174: Params = Regs[REG_A7];
175: XBiosCall = STMemory_ReadWord(Params);
176:
177: switch (XBiosCall)
178: {
179: case 8:
1.1.1.8 root 180: HATARI_TRACE ( HATARI_TRACE_OS_XBIOS, "XBIOS Floprd()\n" );
1.1.1.7 root 181: return XBios_Floprd(Params);
182: case 9:
1.1.1.8 root 183: HATARI_TRACE ( HATARI_TRACE_OS_XBIOS, "XBIOS Flopwr()\n" );
1.1.1.7 root 184: return XBios_Flopwr(Params);
185: case 15:
1.1.1.8 root 186: HATARI_TRACE ( HATARI_TRACE_OS_XBIOS, "XBIOS Rsconf()\n" );
1.1.1.7 root 187: return XBios_Rsconf(Params);
188: case 20:
1.1.1.8 root 189: HATARI_TRACE ( HATARI_TRACE_OS_XBIOS, "XBIOS Scrdmp()\n" );
1.1.1.7 root 190: return XBios_Scrdmp(Params);
191:
192: default: /* Call as normal! */
1.1.1.8 root 193: HATARI_TRACE ( HATARI_TRACE_OS_XBIOS, "XBIOS %d\n", XBiosCall );
1.1.1.7 root 194: return FALSE;
195: }
1.1 root 196: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.