Annotation of hatari/src/bios.c, revision 1.1.1.14

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.14! root       42:        LOG_TRACE(TRACE_OS_BIOS, "BIOS 0x04 Rwabs(%d,0x%lX,%d,%d,%i) at PC 0x%X\n",
        !            43:                  RWFlag, STRAM_ADDR(pBuffer), Number, RecNo, Dev,
        !            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.12  root      106: void Bios_Info(Uint32 dummy)
                    107: {
                    108:        Uint16 opcode;
                    109:        for (opcode = 0; opcode <= 0xB; ) {
                    110:                fprintf(stderr, "%02x %-9s", opcode,
                    111:                        Bios_Call2Name(opcode));
                    112:                if (++opcode % 6 == 0) {
                    113:                        fputs("\n", stderr);
                    114:                }
                    115:        }
                    116: }
                    117: #else /* !ENABLE_TRACING */
                    118: void Bios_Info(Uint32 bShowOpcodes)
                    119: {
                    120:                fputs("Hatari isn't configured with ENABLE_TRACING\n", stderr);
                    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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.