Annotation of hatari/src/xbios.c, revision 1.1.1.12

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.12! root       26: #define XBIOS_DEBUG 0  /* for floppy read/write & rsconf */
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.12! root       58:        Uint32 pBuffer;
1.1.1.7   root       59:        Uint16 Dev,Sector,Side,Track,Count;
1.1       root       60: 
1.1.1.7   root       61:        /* Read details from stack */
1.1.1.12! root       62:        pBuffer = STMemory_ReadLong(Params+SIZE_WORD);
1.1.1.7   root       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.12! root       69:        Log_Printf(LOG_DEBUG, "FLOPRD %s,0x%x,%d,%d,%d,%d at addr 0x%X\n", EmulationDrives[Dev].sFileName,
        !            70:                   pBuffer, 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.12! root       84:        Uint32 pBuffer;
1.1.1.7   root       85:        Uint16 Dev,Sector,Side,Track,Count;
1.1       root       86: 
1.1.1.7   root       87:        /* Read details from stack */
1.1.1.12! root       88:        pBuffer = STMemory_ReadLong(Params+SIZE_WORD);
1.1.1.7   root       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.12! root       95:        Log_Printf(LOG_DEBUG, "FLOPWR %s,0x%x,%d,%d,%d,%d at addr 0x%X\n", EmulationDrives[Dev].sFileName,
        !            96:                   pBuffer, 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.12! root      109:        Sint16 Baud,Ctrl,Ucr;
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);
1.1.1.12! root      114: #if XBIOS_DEBUG
        !           115:        Sint16 Rsr,Tsr,Scr;
1.1.1.7   root      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);
1.1.1.12! root      119:        Log_Printf(LOG_DEBUG, "RSCONF baud,ctrl,ucr,rsr,tsr,scr: %d,%d,%d,%d,%d,%d\n",
        !           120:                   Baud, Ctrl, Ucr, Rsr, Tsr, Scr);
        !           121: #endif
1.1.1.7   root      122:        /* Set baud rate and other configuration, if RS232 emaulation is enabled */
                    123:        if (ConfigureParams.RS232.bEnableRS232)
                    124:        {
1.1.1.11  root      125:                if (Baud >= 0 && Baud < ARRAYSIZE(BaudRates))
1.1.1.7   root      126:                {
                    127:                        /* Convert ST baud rate index to value */
                    128:                        int BaudRate = BaudRates[Baud];
                    129:                        /* And set new baud rate: */
                    130:                        RS232_SetBaudRate(BaudRate);
                    131:                }
                    132: 
                    133:                if (Ucr != -1)
                    134:                {
                    135:                        RS232_HandleUCR(Ucr);
                    136:                }
                    137: 
                    138:                if (Ctrl != -1)
                    139:                {
                    140:                        RS232_SetFlowControl(Ctrl);
                    141:                }
1.1       root      142: 
1.1.1.10  root      143:                return true;
1.1.1.7   root      144:        }
1.1       root      145: 
1.1.1.10  root      146:        return false;
1.1       root      147: }
                    148: 
1.1.1.2   root      149: 
1.1.1.7   root      150: /**
                    151:  * XBIOS Scrdmp
                    152:  * Call 20
                    153:  */
1.1.1.8   root      154: static bool XBios_Scrdmp(Uint32 Params)
1.1       root      155: {
1.1.1.7   root      156:        ScreenSnapShot_SaveScreen();
1.1.1.3   root      157: 
1.1.1.7   root      158:        /* Correct return code? */
                    159:        Regs[REG_D0] = 0;
1.1       root      160: 
1.1.1.10  root      161:        return true;
                    162: }
                    163: 
                    164: 
                    165: /**
                    166:  * XBIOS remote control interface for Hatari
                    167:  * Call 255
                    168:  */
                    169: static bool XBios_HatariControl(Uint32 Params)
                    170: {
                    171:        char *pText;
                    172: 
                    173:        pText = (char *)STRAM_ADDR(STMemory_ReadLong(Params+SIZE_WORD));
                    174:        Control_ProcessBuffer(pText);
                    175:        Regs[REG_D0] = 0;
                    176:        return true;
1.1       root      177: }
                    178: 
1.1.1.2   root      179: 
1.1.1.11  root      180: #if ENABLE_TRACING
                    181: /**
                    182:  * Map XBIOS call opcode to XBIOS function name
                    183:  */
                    184: static const char* XBios_Call2Name(Uint16 opcode)
                    185: {
                    186:        static const char* names[] = {
                    187:                "Initmous",
                    188:                "Ssbrk",
                    189:                "Physbase",
                    190:                "Logbase",
                    191:                "Getrez",
                    192:                "Setscreen",
                    193:                "Setpalette",
                    194:                "Setcolor",
                    195:                "Floprd",
                    196:                "Flopwr",
                    197:                "Flopfmt",
                    198:                "Dbmsg",
                    199:                "Midiws",
                    200:                "Mfpint",
                    201:                "Iorec",
                    202:                "Rsconf",
                    203:                "Keytbl",
                    204:                "Random",
                    205:                "Protobt",
                    206:                "Flopver",
                    207:                "Scrdmp",
                    208:                "Cursconf",
                    209:                "Settime",
                    210:                "Gettime",
                    211:                "Bioskeys",
                    212:                "Ikbdws",
                    213:                "Jdisint",
                    214:                "Jenabint",
                    215:                "Giaccess",
                    216:                "Offgibit",
                    217:                "Ongibit",
                    218:                "Xbtimer",
                    219:                "Dosound",
                    220:                "Setprt",
                    221:                "Kbdvbase",
                    222:                "Kbrate",
                    223:                "Prtblk",
                    224:                "Vsync",
                    225:                "Supexec",
                    226:                "Puntaes",
                    227:                NULL,   /* 40 */
                    228:                "Floprate",
                    229:                "DMAread",
                    230:                "DMAwrite",
                    231:                "Bconmap",
                    232:                NULL,   /* 45 */
                    233:                "NVMaccess",
                    234:                NULL,   /* 47 */
                    235:                "Metainit",
                    236:                NULL,   /* 49 */
                    237:                NULL,
                    238:                NULL,
                    239:                NULL,
                    240:                NULL,
                    241:                NULL,
                    242:                NULL,
                    243:                NULL,
                    244:                NULL,
                    245:                NULL,
                    246:                NULL,
                    247:                NULL,
                    248:                NULL,
                    249:                NULL,
                    250:                NULL,   /* 63 */
                    251:                "Blitmode",
                    252:                NULL,   /* 65 */
                    253:                NULL,
                    254:                NULL,
                    255:                NULL,
                    256:                NULL,
                    257:                NULL,
                    258:                NULL,
                    259:                NULL,
                    260:                NULL,
                    261:                NULL,
                    262:                NULL,
                    263:                NULL,
                    264:                NULL,
                    265:                NULL,
                    266:                NULL,   /* 79 */
                    267:                "EsetShift",
                    268:                "EgetShift",
                    269:                "EsetBank",
                    270:                "EsetColor",
                    271:                "EsetPalette",
                    272:                "EgetPalette",
                    273:                "EsetGray",
                    274:                "EsetSmear",
                    275:                "VsetMode",
                    276:                "VgetMonitor",
                    277:                "VsetSync",
                    278:                "VgetSize",
                    279:                NULL,   /* 92 */
                    280:                "VsetRGB",
                    281:                "VgetRGB",
                    282:                NULL,   /* 95 */
                    283:                "Dsp_DoBlock",
                    284:                "Dsp_BlkHandShake",
                    285:                "Dsp_BlkUnpacked",
                    286:                "Dsp_InStream",
                    287:                "Dsp_OutStream",
                    288:                "Dsp_IOStream",
                    289:                "Dsp_RemoveInterrupts",
                    290:                "Dsp_GetWordSize",
                    291:                "Dsp_Lock",
                    292:                "Dsp_Unlock",
                    293:                "Dsp_Available",
                    294:                "Dsp_Reserve",
                    295:                "Dsp_LoadProg",
                    296:                "Dsp_ExecProg",
                    297:                "Dsp_ExecBoot",
                    298:                "Dsp_LodToBinary",
                    299:                "Dsp_TriggerHC",
                    300:                "Dsp_RequestUniqueAbility",
                    301:                "Dsp_GetProgAbility",
                    302:                "Dsp_FlushSubroutines",
                    303:                "Dsp_LoadSubroutine",
                    304:                "Dsp_InqSubrAbility",
                    305:                "Dsp_RunSubroutine",
                    306:                "Dsp_Hf0",
                    307:                "Dsp_Hf1",
                    308:                "Dsp_Hf2",
                    309:                "Dsp_Hf3",
                    310:                "Dsp_BlkWords",
                    311:                "Dsp_BlkBytes",
                    312:                "Dsp_HStat",
                    313:                "Dsp_SetVectors",
                    314:                "Dsp_MultBlocks",
                    315:                "Locksnd",
                    316:                "Unlocksnd",
                    317:                "Soundcmd",
                    318:                "Setbuffer",
                    319:                "Setmode",
                    320:                "Settracks",
                    321:                "Setmontracks",
                    322:                "Setinterrupt",
                    323:                "Buffoper",
                    324:                "Dsptristate",
                    325:                "Gpio",
                    326:                "Devconnect",
                    327:                "Sndstatus",
                    328:                "Buffptr",
                    329:                NULL,   /* 142 */
                    330:                NULL,
                    331:                NULL,
                    332:                NULL,
                    333:                "VsetMask",
                    334:                NULL,   /* 147 */
                    335:                NULL,
                    336:                NULL,
                    337:                NULL,
                    338:                NULL,
                    339:                NULL,
                    340:                NULL,
                    341:                NULL,
                    342:                NULL,
                    343:                NULL,
                    344:                NULL,
                    345:                NULL,
                    346:                NULL,
                    347:                NULL,
                    348:                NULL,
                    349:                NULL,
                    350:                NULL,
                    351:                NULL,   /* 164 */
                    352:                "WavePlay"
                    353:        };
                    354:        if (opcode < ARRAYSIZE(names) && names[opcode]) {
                    355:                return names[opcode];
                    356:        }
                    357:        if (opcode == 255) {
                    358:                return "HatariControl";
                    359:        }
                    360:        return "???";
                    361: }
                    362: #endif
                    363: 
                    364: 
1.1.1.7   root      365: /**
                    366:  * Check if we need to re-direct XBios call to our own routines
                    367:  */
1.1.1.8   root      368: bool XBios(void)
1.1       root      369: {
1.1.1.7   root      370:        Uint32 Params;
                    371:        Uint16 XBiosCall;
1.1       root      372: 
1.1.1.7   root      373:        /* Find call */
                    374:        Params = Regs[REG_A7];
                    375:        XBiosCall = STMemory_ReadWord(Params);
                    376: 
1.1.1.11  root      377:        LOG_TRACE(TRACE_OS_XBIOS, "XBIOS %hd (%s)\n",
                    378:                  XBiosCall, XBios_Call2Name(XBiosCall));
                    379: 
1.1.1.7   root      380:        switch (XBiosCall)
                    381:        {
                    382:         case 8:
                    383:                return XBios_Floprd(Params);
                    384:         case 9:
                    385:                return XBios_Flopwr(Params);
                    386:         case 15:
                    387:                return XBios_Rsconf(Params);
                    388:         case 20:
                    389:                return XBios_Scrdmp(Params);
1.1.1.10  root      390:         case 255:
                    391:                return XBios_HatariControl(Params);
1.1.1.7   root      392: 
                    393:         default:  /* Call as normal! */
1.1.1.10  root      394:                return false;
1.1.1.7   root      395:        }
1.1       root      396: }

unix.superglobalmegacorp.com

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