|
|
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.3 ! root 12: char XBios_rcsid[] = "Hatari $Id: xbios.c,v 1.7 2004/07/25 13:50:30 thothy Exp $"; 1.1 root 13: 14: #include "main.h" 1.1.1.3 ! root 15: #include "configuration.h" 1.1 root 16: #include "debug.h" 17: #include "floppy.h" 18: #include "m68000.h" 19: #include "misc.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: 26: /* List of Atari ST RS-232 baud rates */ 27: static int BaudRates[] = { 1.1.1.2 root 28: 19200, /* 0 */ 29: 9600, /* 1 */ 30: 4800, /* 2 */ 31: 3600, /* 3 */ 32: 2400, /* 4 */ 33: 2000, /* 5 */ 34: 1800, /* 6 */ 35: 1200, /* 7 */ 36: 600, /* 8 */ 37: 300, /* 9 */ 38: 200, /* 10 */ 39: 150, /* 11 */ 40: 134, /* 12 */ 41: 110, /* 13 */ 42: 75, /* 14 */ 43: 50 /* 15 */ 1.1 root 44: }; 45: 1.1.1.2 root 46: 47: /*-----------------------------------------------------------------------*/ 1.1 root 48: /* 49: XBIOS Floppy Read 50: Call 8 51: */ 1.1.1.3 ! root 52: static BOOL XBios_Floprd(unsigned long Params) 1.1 root 53: { 54: #ifdef DEBUG_TO_FILE 55: char *pBuffer; 56: unsigned short int Dev,Sector,Side,Track,Count; 57: 1.1.1.2 root 58: /* Read details from stack */ 1.1 root 59: pBuffer = (char *)STRAM_ADDR(STMemory_ReadLong(Params+SIZE_WORD)); 60: Dev = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG); 61: Sector = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD); 62: Track = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD); 63: Side = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD); 64: Count = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD); 65: 66: Debug_FDC("FLOPRD %s,%d,%d,%d,%d at addr 0x%X\n",EmulationDrives[Dev].szFileName,Side,Track,Sector,Count,PC); 67: #endif 68: 69: return(FALSE); 70: } 71: 1.1.1.2 root 72: 73: /*-----------------------------------------------------------------------*/ 1.1 root 74: /* 75: XBIOS Floppy Write 76: Call 9 77: */ 1.1.1.3 ! root 78: static BOOL XBios_Flopwr(unsigned long Params) 1.1 root 79: { 80: #ifdef DEBUG_TO_FILE 81: char *pBuffer; 82: unsigned short int Dev,Sector,Side,Track,Count; 83: 1.1.1.2 root 84: /* Read details from stack */ 1.1 root 85: pBuffer = (char *)STRAM_ADDR(STMemory_ReadLong(Params+SIZE_WORD)); 86: Dev = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG); 87: Sector = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD); 88: Track = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD); 89: Side = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD); 90: Count = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD); 91: 92: Debug_FDC("FLOPWR %s,%d,%d,%d,%d at addr 0x%X\n",EmulationDrives[Dev].szFileName,Side,Track,Sector,Count,PC); 93: #endif 94: 95: return(FALSE); 96: } 97: 1.1.1.2 root 98: 99: /*-----------------------------------------------------------------------*/ 1.1 root 100: /* 101: XBIOS RsConf 102: Call 15 103: */ 1.1.1.3 ! root 104: static BOOL XBios_Rsconf(unsigned long Params) 1.1 root 105: { 106: short int Baud,Ctrl,Ucr,Rsr,Tsr,Scr; 107: 108: Baud = STMemory_ReadWord(Params+SIZE_WORD); 109: Ctrl = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD); 110: Ucr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD); 111: Rsr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD); 112: Tsr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD); 113: Scr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD); 114: 1.1.1.3 ! root 115: /* Set baud rate and other configuration, if RS232 emaulation is enabled */ ! 116: if (ConfigureParams.RS232.bEnableRS232) ! 117: { ! 118: if (Baud>=0 && Baud<=15) ! 119: { ! 120: /* Convert ST baud rate index to value */ ! 121: int BaudRate = BaudRates[Baud]; ! 122: /* And set new baud rate: */ ! 123: RS232_SetBaudRate(BaudRate); ! 124: } ! 125: ! 126: if (Ucr != -1) ! 127: { ! 128: RS232_HandleUCR(Ucr); ! 129: } ! 130: ! 131: if (Ctrl != -1) ! 132: { ! 133: RS232_SetFlowControl(Ctrl); ! 134: } 1.1 root 135: 136: return(TRUE); 137: } 138: 139: return(FALSE); 140: } 141: 1.1.1.2 root 142: 143: /*-----------------------------------------------------------------------*/ 1.1 root 144: /* 145: XBIOS Scrdmp 146: Call 20 147: */ 1.1.1.3 ! root 148: static BOOL XBios_Scrdmp(unsigned long Params) 1.1 root 149: { 1.1.1.3 ! root 150: fprintf(stderr, "XBIOS screendump!\n"); ! 151: ! 152: ScreenSnapShot_SaveScreen(); ! 153: 1.1.1.2 root 154: /* Correct return code? */ 1.1 root 155: Regs[REG_D0] = 0; 156: 157: return(TRUE); 158: } 159: 1.1.1.2 root 160: 161: /*----------------------------------------------------------------------- */ 1.1 root 162: /* 163: XBIOS Prtblk 164: Call 36 165: */ 1.1.1.3 ! root 166: static BOOL XBios_Prtblk(unsigned long Params) 1.1 root 167: { 1.1.1.3 ! root 168: fprintf(stderr, "Intercepted XBIOS Prtblk()\n"); 1.1.1.2 root 169: 1.1.1.3 ! root 170: /* Correct return code? */ 1.1 root 171: Regs[REG_D0] = 0; 172: 173: return(TRUE); 174: } 175: 1.1.1.2 root 176: 177: /*-----------------------------------------------------------------------*/ 1.1 root 178: /* 179: Check if we need to re-direct XBios call to our own routines 180: */ 181: BOOL XBios(void) 182: { 183: unsigned long Params; 184: unsigned short int XBiosCall; 185: 186: /* Find call */ 187: Params = Regs[REG_A7]; 188: XBiosCall = STMemory_ReadWord(Params); 1.1.1.3 ! root 189: 1.1.1.2 root 190: /*Debug_File("XBIOS %d\n",XBiosCall);*/ 1.1 root 191: 1.1.1.3 ! root 192: switch(XBiosCall) ! 193: { 1.1 root 194: case 8: 195: return(XBios_Floprd(Params)); 196: case 9: 197: return(XBios_Flopwr(Params)); 198: case 15: 199: return(XBios_Rsconf(Params)); 200: case 20: 201: return(XBios_Scrdmp(Params)); 202: case 36: 203: return(XBios_Prtblk(Params)); 204: 1.1.1.2 root 205: default: /* Call as normal! */ 1.1 root 206: return(FALSE); 207: } 208: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.