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

1.1       root        1: /*
                      2:   Hatari
                      3: 
                      4:   XBios Handler (Trap #14)
                      5: 
                      6:   We intercept and direct some XBios calls to handle the RS-232/Blitter and help with floppy
                      7:   debugging
                      8: */
                      9: 
                     10: #include "main.h"
                     11: #include "debug.h"
                     12: #include "decode.h"
                     13: #include "floppy.h"
                     14: #include "m68000.h"
                     15: #include "misc.h"
                     16: #include "rs232.h"
                     17: #include "stMemory.h"
                     18: 
                     19: /* List of Atari ST RS-232 baud rates */
                     20: static int BaudRates[] = {
1.1.1.2 ! root       21:   19200, /* 0 */
        !            22:   9600,  /* 1 */
        !            23:   4800,  /* 2 */
        !            24:   3600,  /* 3 */
        !            25:   2400,  /* 4 */
        !            26:   2000,  /* 5 */
        !            27:   1800,  /* 6 */
        !            28:   1200,  /* 7 */
        !            29:   600,   /* 8 */
        !            30:   300,   /* 9 */
        !            31:   200,   /* 10 */
        !            32:   150,   /* 11 */
        !            33:   134,   /* 12 */
        !            34:   110,   /* 13 */
        !            35:   75,    /* 14 */
        !            36:   50     /* 15 */
1.1       root       37: };
                     38: 
1.1.1.2 ! root       39: 
        !            40: /*-----------------------------------------------------------------------*/
1.1       root       41: /*
                     42:   XBIOS Floppy Read
                     43:   Call 8
                     44: */
                     45: BOOL XBios_Floprd(unsigned long Params)
                     46: {
                     47: #ifdef DEBUG_TO_FILE
                     48:   char *pBuffer;
                     49:   unsigned short int Dev,Sector,Side,Track,Count;
                     50: 
1.1.1.2 ! root       51:   /* Read details from stack */
1.1       root       52:   pBuffer = (char *)STRAM_ADDR(STMemory_ReadLong(Params+SIZE_WORD));
                     53:   Dev = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG);
                     54:   Sector = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD);
                     55:   Track = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD);
                     56:   Side = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD);
                     57:   Count = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD);
                     58: 
                     59:   Debug_FDC("FLOPRD %s,%d,%d,%d,%d at addr 0x%X\n",EmulationDrives[Dev].szFileName,Side,Track,Sector,Count,PC);
                     60: #endif
                     61: 
                     62:   return(FALSE);
                     63: }
                     64: 
1.1.1.2 ! root       65: 
        !            66: /*-----------------------------------------------------------------------*/
1.1       root       67: /*
                     68:   XBIOS Floppy Write
                     69:   Call 9
                     70: */
                     71: BOOL XBios_Flopwr(unsigned long Params)
                     72: {
                     73: #ifdef DEBUG_TO_FILE
                     74:   char *pBuffer;
                     75:   unsigned short int Dev,Sector,Side,Track,Count;
                     76: 
1.1.1.2 ! root       77:   /* Read details from stack */
1.1       root       78:   pBuffer = (char *)STRAM_ADDR(STMemory_ReadLong(Params+SIZE_WORD));
                     79:   Dev = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG);
                     80:   Sector = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD);
                     81:   Track = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD);
                     82:   Side = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD);
                     83:   Count = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD);
                     84: 
                     85:   Debug_FDC("FLOPWR %s,%d,%d,%d,%d at addr 0x%X\n",EmulationDrives[Dev].szFileName,Side,Track,Sector,Count,PC);
                     86: #endif
                     87: 
                     88:   return(FALSE);
                     89: }
                     90: 
1.1.1.2 ! root       91: 
        !            92: /*-----------------------------------------------------------------------*/
1.1       root       93: /*
                     94:   XBIOS RsConf
                     95:   Call 15
                     96: */
                     97: BOOL XBios_Rsconf(unsigned long Params)
                     98: {
                     99:   short int Baud,Ctrl,Ucr,Rsr,Tsr,Scr;
                    100:   int BaudRate=-1;
                    101: 
                    102:   Baud = STMemory_ReadWord(Params+SIZE_WORD);
                    103:   Ctrl = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD);
                    104:   Ucr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD);
                    105:   Rsr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD);
                    106:   Tsr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD);
                    107:   Scr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD);
                    108: 
1.1.1.2 ! root      109:   /* Set baud, if passed valid setting */
1.1       root      110:   if ( (Baud>=0) && (Baud<=15) ) {
1.1.1.2 ! root      111:     /* Convert ST baud rate index to value */
1.1       root      112:     BaudRate = BaudRates[Baud];
1.1.1.2 ! root      113:     /* Set RS-232, pass Communication Control and USART Control register */
1.1       root      114:     RS232_SetConfig(BaudRate,Ctrl,Ucr);
                    115: 
                    116:     return(TRUE);
                    117:   }
                    118: 
                    119:   return(FALSE);
                    120: }
                    121: 
1.1.1.2 ! root      122: 
        !           123: /*-----------------------------------------------------------------------*/
1.1       root      124: /*
                    125:   XBIOS Scrdmp
                    126:   Call 20
                    127: */
                    128: BOOL XBios_Scrdmp(unsigned long Params)
                    129: {
1.1.1.2 ! root      130:   /* Correct return code? */
1.1       root      131:   Regs[REG_D0] = 0;
                    132: 
                    133:   return(TRUE);
                    134: }
                    135: 
1.1.1.2 ! root      136: 
        !           137: /*----------------------------------------------------------------------- */
1.1       root      138: /*
                    139:   XBIOS Prtblk
                    140:   Call 36
                    141: */
                    142: BOOL XBios_Prtblk(unsigned long Params)
                    143: {
1.1.1.2 ! root      144:   /* Correct return code? */
1.1       root      145:   Regs[REG_D0] = 0;
                    146: 
                    147:   return(TRUE);
                    148: }
                    149: 
1.1.1.2 ! root      150: 
        !           151: /*----------------------------------------------------------------------- */
1.1       root      152: /*
                    153:   XBIOS BlitMode
                    154:   Call 64
                    155: */
                    156: BOOL XBios_BlitMode(unsigned long Params)
                    157: {
1.1.1.2 ! root      158:   /* No blitter */
1.1       root      159:   Regs[REG_D0] = 0;
                    160: 
                    161:   return(TRUE);
                    162: }
                    163: 
1.1.1.2 ! root      164: 
        !           165: /*-----------------------------------------------------------------------*/
1.1       root      166: /*
                    167:   Check if we need to re-direct XBios call to our own routines
                    168: */
                    169: BOOL XBios(void)
                    170: {
                    171:   unsigned long Params;
                    172:   unsigned short int XBiosCall;
                    173: 
                    174:   /* Find call */
                    175:   Params = Regs[REG_A7];
                    176:   XBiosCall = STMemory_ReadWord(Params);
1.1.1.2 ! root      177:   /*Debug_File("XBIOS %d\n",XBiosCall);*/
1.1       root      178: 
                    179:   switch(XBiosCall) {
                    180:     case 8:
                    181:       return(XBios_Floprd(Params));
                    182:     case 9:
                    183:       return(XBios_Flopwr(Params));
                    184:     case 15:
                    185:       return(XBios_Rsconf(Params));
                    186:     case 20:
                    187:       return(XBios_Scrdmp(Params));
                    188:     case 36:
                    189:       return(XBios_Prtblk(Params));
                    190:     case 64:
                    191:       return(XBios_BlitMode(Params));
                    192: 
1.1.1.2 ! root      193:     default:  /* Call as normal! */
1.1       root      194:       return(FALSE);
                    195:   }
                    196: }

unix.superglobalmegacorp.com

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