|
|
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.7 root 109: short int 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: {
121: if (Baud>=0 && Baud<=15)
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.7 root 176: /**
177: * Check if we need to re-direct XBios call to our own routines
178: */
1.1.1.8 root 179: bool XBios(void)
1.1 root 180: {
1.1.1.7 root 181: Uint32 Params;
182: Uint16 XBiosCall;
1.1 root 183:
1.1.1.7 root 184: /* Find call */
185: Params = Regs[REG_A7];
186: XBiosCall = STMemory_ReadWord(Params);
187:
188: switch (XBiosCall)
189: {
190: case 8:
1.1.1.10! root 191: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS Floprd()\n");
1.1.1.7 root 192: return XBios_Floprd(Params);
193: case 9:
1.1.1.10! root 194: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS Flopwr()\n");
1.1.1.7 root 195: return XBios_Flopwr(Params);
196: case 15:
1.1.1.10! root 197: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS Rsconf()\n");
1.1.1.7 root 198: return XBios_Rsconf(Params);
199: case 20:
1.1.1.10! root 200: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS Scrdmp()\n");
1.1.1.7 root 201: return XBios_Scrdmp(Params);
1.1.1.10! root 202: case 255:
! 203: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS HatariControl()\n");
! 204: return XBios_HatariControl(Params);
1.1.1.7 root 205:
206: default: /* Call as normal! */
1.1.1.10! root 207: LOG_TRACE(TRACE_OS_XBIOS, "XBIOS %d\n", XBiosCall);
! 208: return false;
1.1.1.7 root 209: }
1.1 root 210: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.