|
|
1.1 root 1: /*
1.1.1.2 root 2: Hatari - bios.c
3:
1.1.1.13 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: Bios Handler (Trap #13)
8:
1.1.1.14 root 9: Intercept some Bios calls for tracing/debugging
1.1 root 10: */
1.1.1.8 root 11: const char Bios__fileid[] = "Hatari bios.c : " __DATE__ " " __TIME__;
1.1 root 12:
13: #include "main.h"
1.1.1.2 root 14: #include "configuration.h"
1.1 root 15: #include "floppy.h"
1.1.1.3 root 16: #include "log.h"
1.1 root 17: #include "m68000.h"
18: #include "printer.h"
19: #include "rs232.h"
20: #include "stMemory.h"
1.1.1.2 root 21: #include "bios.h"
1.1 root 22:
23:
24: /*-----------------------------------------------------------------------*/
1.1.1.6 root 25: /**
26: * BIOS Read/Write disk sector
27: * Call 4
28: */
1.1.1.12 root 29: static void Bios_RWabs(Uint32 Params)
1.1 root 30: {
1.1.1.13 root 31: #if ENABLE_TRACING
1.1.1.3 root 32: Uint32 pBuffer;
33: Uint16 RWFlag, Number, RecNo, Dev;
34:
35: /* Read details from stack */
1.1.1.12 root 36: RWFlag = STMemory_ReadWord(Params);
37: pBuffer = STMemory_ReadLong(Params+SIZE_WORD);
38: Number = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG);
39: RecNo = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_WORD);
40: Dev = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_WORD+SIZE_WORD);
1.1 root 41:
1.1.1.15! root 42: LOG_TRACE(TRACE_OS_BIOS, "BIOS 0x04 Rwabs(%d,0x%x,%d,%d,%i) at PC 0x%X\n",
! 43: RWFlag, pBuffer, Number, RecNo, Dev,
1.1.1.14 root 44: M68000_GetPC());
1.1.1.13 root 45: #endif
46: }
47:
48: /*-----------------------------------------------------------------------*/
49: /**
50: * BIOS Set/query exception vectors
51: * Call 5
52: */
53: static void Bios_Setexe(Uint32 Params)
54: {
55: #if ENABLE_TRACING
56: Uint16 vec = STMemory_ReadWord(Params);
57: Uint32 addr = STMemory_ReadLong(Params+SIZE_WORD);
58: struct {
59: int vec;
60: const char *name;
61: } *vecname, vecnames[] =
62: {
63: { 0x002, "BUSERROR" },
64: { 0x003, "ADDRESSERROR" },
65: { 0x004, "ILLEGALINSTRUCTION" },
66: { 0x021, "GEMDOS" },
67: { 0x022, "GEM" },
68: { 0x02D, "BIOS" },
69: { 0x02E, "XBIOS" },
70: { 0x100, "TIMER" },
71: { 0x101, "CRITICALERROR" },
72: { 0x102, "TERMINATE" },
73: { 0x000, "???" }
74: };
75: for (vecname = &(vecnames[0]); vecname->vec && vec != vecname->vec; vecname++)
76: ;
1.1.1.14 root 77: LOG_TRACE(TRACE_OS_BIOS, "BIOS 0x05 Setexc(0x%hX VEC_%s, 0x%X) at PC 0x%X\n", vec, vecname->name, addr,
78: M68000_GetPC());
1.1.1.13 root 79: #endif
1.1 root 80: }
81:
1.1.1.2 root 82:
1.1 root 83: /*-----------------------------------------------------------------------*/
1.1.1.2 root 84:
1.1.1.12 root 85: #if ENABLE_TRACING
1.1.1.6 root 86: /**
1.1.1.12 root 87: * Map BIOS call opcode to BIOS function name
1.1.1.10 root 88: */
1.1.1.12 root 89: static const char* Bios_Call2Name(Uint16 opcode)
1.1.1.10 root 90: {
91: /* GCC uses substrings from above trace statements
92: * where they match, so having them again here
93: * wastes only a pointer & simplifies things
94: */
95: static const char* names[] = {
96: "Getmpb", "Bconstat","Bconin", "Bconout",
97: "Rwabs", "Setexc", "Tickcal","Getbpb",
98: "Bcostat","Mediach", "Drvmap", "Kbshift"
99: };
1.1.1.12 root 100: if (opcode < ARRAYSIZE(names) && names[opcode]) {
101: return names[opcode];
1.1.1.10 root 102: }
1.1.1.12 root 103: return "???";
1.1.1.10 root 104: }
105:
1.1.1.15! root 106: void Bios_Info(FILE *fp, Uint32 dummy)
1.1.1.12 root 107: {
108: Uint16 opcode;
109: for (opcode = 0; opcode <= 0xB; ) {
1.1.1.15! root 110: fprintf(fp, "%02x %-9s", opcode,
1.1.1.12 root 111: Bios_Call2Name(opcode));
112: if (++opcode % 6 == 0) {
1.1.1.15! root 113: fputs("\n", fp);
1.1.1.12 root 114: }
115: }
116: }
117: #else /* !ENABLE_TRACING */
1.1.1.15! root 118: void Bios_Info(FILE *fp, Uint32 bShowOpcodes)
1.1.1.12 root 119: {
1.1.1.15! root 120: fputs("Hatari isn't configured with ENABLE_TRACING\n", fp);
1.1.1.12 root 121: }
122: #endif /* !ENABLE_TRACING */
123:
1.1.1.10 root 124:
125: /*-----------------------------------------------------------------------*/
126: /**
127: * Check Bios call and see if we need to re-direct to our own routines.
128: * Return true if we've handled the exception, else return false to let
129: * TOS attempt it
1.1.1.6 root 130: */
1.1.1.7 root 131: bool Bios(void)
1.1 root 132: {
1.1.1.3 root 133: Uint32 Params;
134: Uint16 BiosCall;
1.1 root 135:
1.1.1.3 root 136: /* Get call */
137: Params = Regs[REG_A7];
138: BiosCall = STMemory_ReadWord(Params);
1.1.1.12 root 139: Params += SIZE_WORD;
1.1.1.3 root 140:
141: /* Intercept? */
142: switch(BiosCall)
143: {
1.1.1.13 root 144: case 0x0:
1.1.1.14 root 145: LOG_TRACE(TRACE_OS_BIOS, "BIOS 0x00 Getmpb(0x%X) at PC 0x%X\n",
146: STMemory_ReadLong(Params),
147: M68000_GetPC());
1.1.1.13 root 148: break;
149:
1.1.1.12 root 150: case 0x3:
1.1.1.14 root 151: LOG_TRACE(TRACE_OS_BIOS, "BIOS 0x03 Bconout(%i, 0x%02hX) at PC 0x%X\n",
1.1.1.13 root 152: STMemory_ReadWord(Params),
1.1.1.14 root 153: STMemory_ReadWord(Params+SIZE_WORD),
154: M68000_GetPC());
1.1.1.12 root 155: break;
1.1.1.13 root 156:
1.1.1.12 root 157: case 0x4:
158: Bios_RWabs(Params);
159: break;
160:
161: case 0x5:
1.1.1.13 root 162: Bios_Setexe(Params);
1.1.1.12 root 163: break;
164:
165: case 0x1:
166: case 0x2:
167: case 0x7:
168: case 0x8:
169: case 0x9:
170: case 0xB:
171: /* commands taking a single word */
1.1.1.14 root 172: LOG_TRACE(TRACE_OS_BIOS, "BIOS 0x%02hX %s(0x%hX) at PC 0x%X\n",
1.1.1.12 root 173: BiosCall, Bios_Call2Name(BiosCall),
1.1.1.14 root 174: STMemory_ReadWord(Params),
175: M68000_GetPC());
1.1.1.12 root 176: break;
177:
178: case 0x6:
179: case 0xA:
180: /* commands taking no args */
1.1.1.14 root 181: LOG_TRACE(TRACE_OS_BIOS, "BIOS 0x%02hX %s() at PC 0x%X\n",
182: BiosCall, Bios_Call2Name(BiosCall),
183: M68000_GetPC());
1.1.1.12 root 184: break;
185:
186: default:
1.1.1.14 root 187: Log_Printf(LOG_WARN, "Unknown BIOS call 0x%x! at PC 0x%X\n", BiosCall,
188: M68000_GetPC());
1.1.1.12 root 189: break;
1.1.1.3 root 190: }
1.1.1.12 root 191: return false;
1.1 root 192: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.