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

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.2   root        9:   We intercept and direct some Bios calls to handle input/output to RS-232
                     10:   or the printer etc...
1.1       root       11: */
1.1.1.3 ! root       12: char Bios_rcsid[] = "Hatari $Id: bios.c,v 1.7 2005/04/05 14:41:20 thothy Exp $";
1.1       root       13: 
                     14: #include "main.h"
1.1.1.2   root       15: #include "configuration.h"
1.1       root       16: #include "floppy.h"
1.1.1.3 ! root       17: #include "log.h"
1.1       root       18: #include "m68000.h"
                     19: #include "misc.h"
                     20: #include "printer.h"
                     21: #include "rs232.h"
                     22: #include "stMemory.h"
1.1.1.2   root       23: #include "bios.h"
1.1       root       24: 
                     25: 
1.1.1.3 ! root       26: #define BIOS_DEBUG 0
        !            27: 
        !            28: 
1.1       root       29: /*-----------------------------------------------------------------------*/
                     30: /*
                     31:   BIOS Return input device status
                     32:   Call 1
                     33: */
1.1.1.3 ! root       34: static BOOL Bios_Bconstat(Uint32 Params)
1.1       root       35: {
1.1.1.3 ! root       36:        Uint16 Dev;
1.1       root       37: 
1.1.1.3 ! root       38:        Dev = STMemory_ReadWord(Params+SIZE_WORD);
1.1.1.2   root       39: 
1.1.1.3 ! root       40:        switch(Dev)
        !            41:        {
        !            42:         case 0:                            /* PRT: Centronics */
        !            43:                if (ConfigureParams.Printer.bEnablePrinting)
        !            44:                {
        !            45:                        Regs[REG_D0] = 0;               /* No characters ready (cannot read from printer) */
        !            46:                        return TRUE;
        !            47:                }
        !            48:                else
        !            49:                {
        !            50:                        return FALSE;
        !            51:                }
        !            52:                break;
        !            53:         case 1:                            /* AUX: RS-232 */
        !            54:                if (ConfigureParams.RS232.bEnableRS232)
        !            55:                {
        !            56:                        if (RS232_GetStatus())
        !            57:                                Regs[REG_D0] = -1;      /* Chars waiting */
        !            58:                        else
        !            59:                                Regs[REG_D0] = 0;
        !            60:                        return TRUE;
        !            61:                }
        !            62:                else
        !            63:                {
        !            64:                        return FALSE;
        !            65:                }
        !            66:                break;
        !            67:        }
1.1       root       68: 
1.1.1.3 ! root       69:        return FALSE;
1.1       root       70: }
                     71: 
1.1.1.2   root       72: 
1.1       root       73: /*-----------------------------------------------------------------------*/
                     74: /*
                     75:   BIOS Read character from device
                     76:   Call 2
                     77: */
1.1.1.3 ! root       78: static BOOL Bios_Bconin(Uint32 Params)
1.1       root       79: {
1.1.1.3 ! root       80:        Uint16 Dev;
        !            81:        unsigned char Char;
1.1       root       82: 
1.1.1.3 ! root       83:        Dev = STMemory_ReadWord(Params+SIZE_WORD);
1.1.1.2   root       84: 
1.1.1.3 ! root       85:        switch(Dev)
        !            86:        {
        !            87:         case 0:                            /* PRT: Centronics */
        !            88:                if (ConfigureParams.Printer.bEnablePrinting)
        !            89:                {
        !            90:                        Regs[REG_D0] = 0;           /* Force NULL character (cannot read from printer) */
        !            91:                        return TRUE;
        !            92:                }
        !            93:                else
        !            94:                {
        !            95:                        return FALSE;
        !            96:                }
        !            97:                break;
        !            98:         case 1:                            /* AUX: RS-232 */
        !            99:                if (ConfigureParams.RS232.bEnableRS232)
        !           100:                {
        !           101:                        RS232_ReadBytes(&Char, 1);
        !           102:                        Regs[REG_D0] = Char;
        !           103:                        return TRUE;
        !           104:                }
        !           105:                else
        !           106:                {
        !           107:                        return FALSE;
        !           108:                }
        !           109:                break;
        !           110:        }
1.1       root      111: 
1.1.1.3 ! root      112:        return FALSE;
1.1       root      113: }
                    114: 
1.1.1.2   root      115: 
1.1       root      116: /*-----------------------------------------------------------------------*/
                    117: /*
                    118:   BIOS Write character to device
                    119:   Call 3
                    120: */
1.1.1.3 ! root      121: static BOOL Bios_Bconout(Uint32 Params)
1.1       root      122: {
1.1.1.3 ! root      123:        Uint16 Dev;
        !           124:        unsigned char Char;
1.1       root      125: 
1.1.1.3 ! root      126:        Dev = STMemory_ReadWord(Params+SIZE_WORD);
        !           127:        Char = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD);
1.1.1.2   root      128: 
1.1.1.3 ! root      129:        switch(Dev)
        !           130:        {
        !           131:         case 0:                            /* PRT: Centronics */
        !           132:                if (ConfigureParams.Printer.bEnablePrinting)
        !           133:                {
        !           134:                        Printer_TransferByteTo(Char);
        !           135:                        return TRUE;
        !           136:                }
        !           137:                else
        !           138:                {
        !           139:                        return FALSE;
        !           140:                }
        !           141:                break;
        !           142:         case 1:                            /* AUX: RS-232 */
        !           143:                if (ConfigureParams.RS232.bEnableRS232)
        !           144:                {
        !           145:                        RS232_TransferBytesTo(&Char, 1);
        !           146:                        return TRUE;
        !           147:                }
        !           148:                else
        !           149:                {
        !           150:                        return FALSE;
        !           151:                }
        !           152:                break;
        !           153:        }
1.1       root      154: 
1.1.1.3 ! root      155:        return FALSE;
1.1       root      156: }
                    157: 
1.1.1.2   root      158: 
1.1       root      159: /*-----------------------------------------------------------------------*/
                    160: /*
                    161:   BIOS Read/Write disc sector
                    162:   Call 4
                    163: */
1.1.1.3 ! root      164: static BOOL Bios_RWabs(Uint32 Params)
1.1       root      165: {
1.1.1.3 ! root      166: #if BIOS_DEBUG
        !           167:        Uint32 pBuffer;
        !           168:        Uint16 RWFlag, Number, RecNo, Dev;
        !           169: 
        !           170:        /* Read details from stack */
        !           171:        RWFlag = STMemory_ReadWord(Params+SIZE_WORD);
        !           172:        pBuffer = STMemory_ReadLong(Params+SIZE_WORD+SIZE_WORD);
        !           173:        Number = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_LONG);
        !           174:        RecNo = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_LONG+SIZE_WORD);
        !           175:        Dev = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_LONG+SIZE_WORD+SIZE_WORD);
1.1       root      176: 
1.1.1.3 ! root      177:        Log_Printf(LOG_DEBUG, "RWABS %s,%d,0x%X,%d,%d\n", EmulationDrives[Dev].szFileName,RWFlag, (char *)STRAM_ADDR(pBuffer), RecNo, Number);
1.1       root      178: #endif
                    179: 
1.1.1.3 ! root      180:        return FALSE;
1.1       root      181: }
                    182: 
1.1.1.2   root      183: 
1.1       root      184: /*-----------------------------------------------------------------------*/
                    185: /*
                    186:   BIOS Return output device status
                    187:   Call 8
                    188: */
1.1.1.3 ! root      189: static BOOL Bios_Bcostat(Uint32 Params)
1.1       root      190: {
1.1.1.3 ! root      191:        Uint16 Dev;
1.1       root      192: 
1.1.1.3 ! root      193:        Dev = STMemory_ReadWord(Params+SIZE_WORD);
1.1.1.2   root      194: 
1.1.1.3 ! root      195:        switch(Dev)
        !           196:        {
        !           197:         case 0:                            /* PRT: Centronics */
        !           198:                if (ConfigureParams.Printer.bEnablePrinting)
        !           199:                {
        !           200:                        Regs[REG_D0] = -1;          /* Device ready */
        !           201:                        return TRUE;
        !           202:                }
        !           203:                else
        !           204:                {
        !           205:                        return FALSE;
        !           206:                }
        !           207:                break;
        !           208:         case 1:                            /* AUX: RS-232 */
        !           209:                if (ConfigureParams.RS232.bEnableRS232)
        !           210:                {
        !           211:                        Regs[REG_D0] = -1;          /* Device ready */
        !           212:                        return TRUE;
        !           213:                }
        !           214:                else
        !           215:                {
        !           216:                        return FALSE;
        !           217:                }
        !           218:                break;
        !           219:        }
1.1       root      220: 
1.1.1.3 ! root      221:        return FALSE;
1.1       root      222: }
                    223: 
                    224: 
                    225: /*-----------------------------------------------------------------------*/
                    226: /*
                    227:   Check Bios call and see if we need to re-direct to our own routines
                    228:   Return TRUE if we've handled the exception, else return FALSE to let TOS attempt it
                    229: */
                    230: BOOL Bios(void)
                    231: {
1.1.1.3 ! root      232:        Uint32 Params;
        !           233:        Uint16 BiosCall;
1.1       root      234: 
1.1.1.3 ! root      235:        /* Get call */
        !           236:        Params = Regs[REG_A7];
        !           237:        BiosCall = STMemory_ReadWord(Params);
        !           238: 
        !           239:        /* Debug_File("BIOS %d\n",BiosCall); */
        !           240: 
        !           241:        /* Intercept? */
        !           242:        switch(BiosCall)
        !           243:        {
        !           244:         case 0x1:
        !           245:                return Bios_Bconstat(Params);
        !           246:         case 0x2:
        !           247:                return Bios_Bconin(Params);
        !           248:         case 0x3:
        !           249:                return Bios_Bconout(Params);
        !           250:         case 0x4:
        !           251:                return Bios_RWabs(Params);
        !           252:         case 0x8:
        !           253:                return Bios_Bcostat(Params);
        !           254:         default:           /* Call as normal! */
        !           255:                return FALSE;
        !           256:        }
1.1       root      257: }

unix.superglobalmegacorp.com

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