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

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.11! root      109:        Sint16 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:        {
1.1.1.11! root      121:                if (Baud >= 0 && Baud < ARRAYSIZE(BaudRates))
1.1.1.7   root      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.11! root      176: #if ENABLE_TRACING
        !           177: /**
        !           178:  * Map XBIOS call opcode to XBIOS function name
        !           179:  */
        !           180: static const char* XBios_Call2Name(Uint16 opcode)
        !           181: {
        !           182:        static const char* names[] = {
        !           183:                "Initmous",
        !           184:                "Ssbrk",
        !           185:                "Physbase",
        !           186:                "Logbase",
        !           187:                "Getrez",
        !           188:                "Setscreen",
        !           189:                "Setpalette",
        !           190:                "Setcolor",
        !           191:                "Floprd",
        !           192:                "Flopwr",
        !           193:                "Flopfmt",
        !           194:                "Dbmsg",
        !           195:                "Midiws",
        !           196:                "Mfpint",
        !           197:                "Iorec",
        !           198:                "Rsconf",
        !           199:                "Keytbl",
        !           200:                "Random",
        !           201:                "Protobt",
        !           202:                "Flopver",
        !           203:                "Scrdmp",
        !           204:                "Cursconf",
        !           205:                "Settime",
        !           206:                "Gettime",
        !           207:                "Bioskeys",
        !           208:                "Ikbdws",
        !           209:                "Jdisint",
        !           210:                "Jenabint",
        !           211:                "Giaccess",
        !           212:                "Offgibit",
        !           213:                "Ongibit",
        !           214:                "Xbtimer",
        !           215:                "Dosound",
        !           216:                "Setprt",
        !           217:                "Kbdvbase",
        !           218:                "Kbrate",
        !           219:                "Prtblk",
        !           220:                "Vsync",
        !           221:                "Supexec",
        !           222:                "Puntaes",
        !           223:                NULL,   /* 40 */
        !           224:                "Floprate",
        !           225:                "DMAread",
        !           226:                "DMAwrite",
        !           227:                "Bconmap",
        !           228:                NULL,   /* 45 */
        !           229:                "NVMaccess",
        !           230:                NULL,   /* 47 */
        !           231:                "Metainit",
        !           232:                NULL,   /* 49 */
        !           233:                NULL,
        !           234:                NULL,
        !           235:                NULL,
        !           236:                NULL,
        !           237:                NULL,
        !           238:                NULL,
        !           239:                NULL,
        !           240:                NULL,
        !           241:                NULL,
        !           242:                NULL,
        !           243:                NULL,
        !           244:                NULL,
        !           245:                NULL,
        !           246:                NULL,   /* 63 */
        !           247:                "Blitmode",
        !           248:                NULL,   /* 65 */
        !           249:                NULL,
        !           250:                NULL,
        !           251:                NULL,
        !           252:                NULL,
        !           253:                NULL,
        !           254:                NULL,
        !           255:                NULL,
        !           256:                NULL,
        !           257:                NULL,
        !           258:                NULL,
        !           259:                NULL,
        !           260:                NULL,
        !           261:                NULL,
        !           262:                NULL,   /* 79 */
        !           263:                "EsetShift",
        !           264:                "EgetShift",
        !           265:                "EsetBank",
        !           266:                "EsetColor",
        !           267:                "EsetPalette",
        !           268:                "EgetPalette",
        !           269:                "EsetGray",
        !           270:                "EsetSmear",
        !           271:                "VsetMode",
        !           272:                "VgetMonitor",
        !           273:                "VsetSync",
        !           274:                "VgetSize",
        !           275:                NULL,   /* 92 */
        !           276:                "VsetRGB",
        !           277:                "VgetRGB",
        !           278:                NULL,   /* 95 */
        !           279:                "Dsp_DoBlock",
        !           280:                "Dsp_BlkHandShake",
        !           281:                "Dsp_BlkUnpacked",
        !           282:                "Dsp_InStream",
        !           283:                "Dsp_OutStream",
        !           284:                "Dsp_IOStream",
        !           285:                "Dsp_RemoveInterrupts",
        !           286:                "Dsp_GetWordSize",
        !           287:                "Dsp_Lock",
        !           288:                "Dsp_Unlock",
        !           289:                "Dsp_Available",
        !           290:                "Dsp_Reserve",
        !           291:                "Dsp_LoadProg",
        !           292:                "Dsp_ExecProg",
        !           293:                "Dsp_ExecBoot",
        !           294:                "Dsp_LodToBinary",
        !           295:                "Dsp_TriggerHC",
        !           296:                "Dsp_RequestUniqueAbility",
        !           297:                "Dsp_GetProgAbility",
        !           298:                "Dsp_FlushSubroutines",
        !           299:                "Dsp_LoadSubroutine",
        !           300:                "Dsp_InqSubrAbility",
        !           301:                "Dsp_RunSubroutine",
        !           302:                "Dsp_Hf0",
        !           303:                "Dsp_Hf1",
        !           304:                "Dsp_Hf2",
        !           305:                "Dsp_Hf3",
        !           306:                "Dsp_BlkWords",
        !           307:                "Dsp_BlkBytes",
        !           308:                "Dsp_HStat",
        !           309:                "Dsp_SetVectors",
        !           310:                "Dsp_MultBlocks",
        !           311:                "Locksnd",
        !           312:                "Unlocksnd",
        !           313:                "Soundcmd",
        !           314:                "Setbuffer",
        !           315:                "Setmode",
        !           316:                "Settracks",
        !           317:                "Setmontracks",
        !           318:                "Setinterrupt",
        !           319:                "Buffoper",
        !           320:                "Dsptristate",
        !           321:                "Gpio",
        !           322:                "Devconnect",
        !           323:                "Sndstatus",
        !           324:                "Buffptr",
        !           325:                NULL,   /* 142 */
        !           326:                NULL,
        !           327:                NULL,
        !           328:                NULL,
        !           329:                "VsetMask",
        !           330:                NULL,   /* 147 */
        !           331:                NULL,
        !           332:                NULL,
        !           333:                NULL,
        !           334:                NULL,
        !           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,   /* 164 */
        !           348:                "WavePlay"
        !           349:        };
        !           350:        if (opcode < ARRAYSIZE(names) && names[opcode]) {
        !           351:                return names[opcode];
        !           352:        }
        !           353:        if (opcode == 255) {
        !           354:                return "HatariControl";
        !           355:        }
        !           356:        return "???";
        !           357: }
        !           358: #endif
        !           359: 
        !           360: 
1.1.1.7   root      361: /**
                    362:  * Check if we need to re-direct XBios call to our own routines
                    363:  */
1.1.1.8   root      364: bool XBios(void)
1.1       root      365: {
1.1.1.7   root      366:        Uint32 Params;
                    367:        Uint16 XBiosCall;
1.1       root      368: 
1.1.1.7   root      369:        /* Find call */
                    370:        Params = Regs[REG_A7];
                    371:        XBiosCall = STMemory_ReadWord(Params);
                    372: 
1.1.1.11! root      373:        LOG_TRACE(TRACE_OS_XBIOS, "XBIOS %hd (%s)\n",
        !           374:                  XBiosCall, XBios_Call2Name(XBiosCall));
        !           375: 
1.1.1.7   root      376:        switch (XBiosCall)
                    377:        {
                    378:         case 8:
                    379:                return XBios_Floprd(Params);
                    380:         case 9:
                    381:                return XBios_Flopwr(Params);
                    382:         case 15:
                    383:                return XBios_Rsconf(Params);
                    384:         case 20:
                    385:                return XBios_Scrdmp(Params);
1.1.1.10  root      386:         case 255:
                    387:                return XBios_HatariControl(Params);
1.1.1.7   root      388: 
                    389:         default:  /* Call as normal! */
1.1.1.10  root      390:                return false;
1.1.1.7   root      391:        }
1.1       root      392: }

unix.superglobalmegacorp.com

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