|
|
1.1 root 1: /*
1.1.1.2 root 2: Hatari - bios.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: Bios Handler (Trap #13)
8:
1.1.1.7 root 9: We intercept some Bios calls for 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 Return input device status
27: * Call 1
28: */
1.1.1.7 root 29: static bool Bios_Bconstat(Uint32 Params)
1.1 root 30: {
1.1.1.3 root 31: Uint16 Dev;
1.1 root 32:
1.1.1.3 root 33: Dev = STMemory_ReadWord(Params+SIZE_WORD);
1.1.1.2 root 34:
1.1.1.9 root 35: LOG_TRACE(TRACE_OS_BIOS, "BIOS Bconstat(%i)\n", Dev);
1.1 root 36:
1.1.1.9 root 37: return false;
1.1 root 38: }
39:
1.1.1.2 root 40:
1.1 root 41: /*-----------------------------------------------------------------------*/
1.1.1.6 root 42: /**
43: * BIOS Read character from device
44: * Call 2
45: */
1.1.1.7 root 46: static bool Bios_Bconin(Uint32 Params)
1.1 root 47: {
1.1.1.3 root 48: Uint16 Dev;
1.1 root 49:
1.1.1.3 root 50: Dev = STMemory_ReadWord(Params+SIZE_WORD);
1.1.1.2 root 51:
1.1.1.9 root 52: LOG_TRACE(TRACE_OS_BIOS, "BIOS Bconin(%i)\n", Dev);
1.1 root 53:
1.1.1.9 root 54: return false;
1.1 root 55: }
56:
1.1.1.2 root 57:
1.1 root 58: /*-----------------------------------------------------------------------*/
1.1.1.6 root 59: /**
60: * BIOS Write character to device
61: * Call 3
62: */
1.1.1.7 root 63: static bool Bios_Bconout(Uint32 Params)
1.1 root 64: {
1.1.1.3 root 65: Uint16 Dev;
66: unsigned char Char;
1.1 root 67:
1.1.1.3 root 68: Dev = STMemory_ReadWord(Params+SIZE_WORD);
69: Char = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD);
1.1.1.2 root 70:
1.1.1.9 root 71: LOG_TRACE(TRACE_OS_BIOS, "BIOS Bconout(%i, 0x%02x)\n", Dev, Char);
1.1 root 72:
1.1.1.9 root 73: return false;
1.1 root 74: }
75:
1.1.1.2 root 76:
1.1 root 77: /*-----------------------------------------------------------------------*/
1.1.1.6 root 78: /**
79: * BIOS Read/Write disk sector
80: * Call 4
81: */
1.1.1.7 root 82: static bool Bios_RWabs(Uint32 Params)
1.1 root 83: {
1.1.1.3 root 84: Uint32 pBuffer;
85: Uint16 RWFlag, Number, RecNo, Dev;
86:
87: /* Read details from stack */
88: RWFlag = STMemory_ReadWord(Params+SIZE_WORD);
89: pBuffer = STMemory_ReadLong(Params+SIZE_WORD+SIZE_WORD);
90: Number = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_LONG);
91: RecNo = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_LONG+SIZE_WORD);
92: Dev = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_LONG+SIZE_WORD+SIZE_WORD);
1.1 root 93:
1.1.1.10! root 94: LOG_TRACE(TRACE_OS_BIOS, "BIOS Rwabs %i,%d,0x%lX,%d,%d\n",
1.1.1.9 root 95: Dev, RWFlag, STRAM_ADDR(pBuffer), RecNo, Number);
1.1 root 96:
1.1.1.9 root 97: return false;
1.1 root 98: }
99:
1.1.1.2 root 100:
1.1 root 101: /*-----------------------------------------------------------------------*/
1.1.1.6 root 102: /**
103: * BIOS Return output device status
104: * Call 8
105: */
1.1.1.7 root 106: static bool Bios_Bcostat(Uint32 Params)
1.1 root 107: {
1.1.1.3 root 108: Uint16 Dev;
1.1 root 109:
1.1.1.3 root 110: Dev = STMemory_ReadWord(Params+SIZE_WORD);
1.1.1.2 root 111:
1.1.1.9 root 112: LOG_TRACE(TRACE_OS_BIOS, "BIOS Bcostat(%i)\n", Dev);
1.1 root 113:
1.1.1.9 root 114: return false;
1.1 root 115: }
116:
117:
118: /*-----------------------------------------------------------------------*/
1.1.1.6 root 119: /**
1.1.1.10! root 120: * Print BIOS call name when BIOS tracing enabled.
! 121: */
! 122: static bool Bios_Trace(Uint16 BiosCall)
! 123: {
! 124: #if ENABLE_TRACING
! 125: /* GCC uses substrings from above trace statements
! 126: * where they match, so having them again here
! 127: * wastes only a pointer & simplifies things
! 128: */
! 129: static const char* names[] = {
! 130: "Getmpb", "Bconstat","Bconin", "Bconout",
! 131: "Rwabs", "Setexc", "Tickcal","Getbpb",
! 132: "Bcostat","Mediach", "Drvmap", "Kbshift"
! 133: };
! 134: if (BiosCall < ARRAYSIZE(names)) {
! 135: LOG_TRACE(TRACE_OS_BIOS, "BIOS %s()\n", names[BiosCall]);
! 136: } else {
! 137: LOG_TRACE(TRACE_OS_BIOS, "BIOS %d?\n", BiosCall);
! 138: }
! 139: #endif
! 140: /* let TOS handle it */
! 141: return false;
! 142: }
! 143:
! 144:
! 145: /*-----------------------------------------------------------------------*/
! 146: /**
! 147: * Check Bios call and see if we need to re-direct to our own routines.
! 148: * Return true if we've handled the exception, else return false to let
! 149: * TOS attempt it
1.1.1.6 root 150: */
1.1.1.7 root 151: bool Bios(void)
1.1 root 152: {
1.1.1.3 root 153: Uint32 Params;
154: Uint16 BiosCall;
1.1 root 155:
1.1.1.3 root 156: /* Get call */
157: Params = Regs[REG_A7];
158: BiosCall = STMemory_ReadWord(Params);
159:
160: /* Intercept? */
161: switch(BiosCall)
162: {
163: case 0x1:
164: return Bios_Bconstat(Params);
165: case 0x2:
166: return Bios_Bconin(Params);
167: case 0x3:
168: return Bios_Bconout(Params);
169: case 0x4:
170: return Bios_RWabs(Params);
171: case 0x8:
172: return Bios_Bcostat(Params);
1.1.1.10! root 173: default:
! 174: return Bios_Trace(BiosCall);
1.1.1.3 root 175: }
1.1 root 176: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.