|
|
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[] = { ! 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 ! 37: }; ! 38: ! 39: //----------------------------------------------------------------------- ! 40: /* ! 41: XBIOS Floppy Read ! 42: Call 8 ! 43: */ ! 44: BOOL XBios_Floprd(unsigned long Params) ! 45: { ! 46: #ifdef DEBUG_TO_FILE ! 47: char *pBuffer; ! 48: unsigned short int Dev,Sector,Side,Track,Count; ! 49: ! 50: // Read details from stack ! 51: pBuffer = (char *)STRAM_ADDR(STMemory_ReadLong(Params+SIZE_WORD)); ! 52: Dev = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG); ! 53: Sector = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD); ! 54: Track = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD); ! 55: Side = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD); ! 56: Count = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD); ! 57: ! 58: Debug_FDC("FLOPRD %s,%d,%d,%d,%d at addr 0x%X\n",EmulationDrives[Dev].szFileName,Side,Track,Sector,Count,PC); ! 59: #endif ! 60: ! 61: return(FALSE); ! 62: } ! 63: ! 64: //----------------------------------------------------------------------- ! 65: /* ! 66: XBIOS Floppy Write ! 67: Call 9 ! 68: */ ! 69: BOOL XBios_Flopwr(unsigned long Params) ! 70: { ! 71: #ifdef DEBUG_TO_FILE ! 72: char *pBuffer; ! 73: unsigned short int Dev,Sector,Side,Track,Count; ! 74: ! 75: // Read details from stack ! 76: pBuffer = (char *)STRAM_ADDR(STMemory_ReadLong(Params+SIZE_WORD)); ! 77: Dev = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG); ! 78: Sector = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD); ! 79: Track = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD); ! 80: Side = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD); ! 81: Count = STMemory_ReadWord(Params+SIZE_WORD+SIZE_LONG+SIZE_LONG+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD); ! 82: ! 83: Debug_FDC("FLOPWR %s,%d,%d,%d,%d at addr 0x%X\n",EmulationDrives[Dev].szFileName,Side,Track,Sector,Count,PC); ! 84: #endif ! 85: ! 86: return(FALSE); ! 87: } ! 88: ! 89: //----------------------------------------------------------------------- ! 90: /* ! 91: XBIOS RsConf ! 92: Call 15 ! 93: */ ! 94: BOOL XBios_Rsconf(unsigned long Params) ! 95: { ! 96: short int Baud,Ctrl,Ucr,Rsr,Tsr,Scr; ! 97: int BaudRate=-1; ! 98: ! 99: Baud = STMemory_ReadWord(Params+SIZE_WORD); ! 100: Ctrl = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD); ! 101: Ucr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD); ! 102: Rsr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD); ! 103: Tsr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD); ! 104: Scr = STMemory_ReadWord(Params+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD+SIZE_WORD); ! 105: ! 106: // Set baud, if passed valid setting ! 107: if ( (Baud>=0) && (Baud<=15) ) { ! 108: // Convert ST baud rate index to value ! 109: BaudRate = BaudRates[Baud]; ! 110: // Set RS-232, pass Communication Control and USART Control register ! 111: RS232_SetConfig(BaudRate,Ctrl,Ucr); ! 112: ! 113: return(TRUE); ! 114: } ! 115: ! 116: return(FALSE); ! 117: } ! 118: ! 119: //----------------------------------------------------------------------- ! 120: /* ! 121: XBIOS Scrdmp ! 122: Call 20 ! 123: */ ! 124: BOOL XBios_Scrdmp(unsigned long Params) ! 125: { ! 126: // Correct return code? ! 127: Regs[REG_D0] = 0; ! 128: ! 129: return(TRUE); ! 130: } ! 131: ! 132: //----------------------------------------------------------------------- ! 133: /* ! 134: XBIOS Prtblk ! 135: Call 36 ! 136: */ ! 137: BOOL XBios_Prtblk(unsigned long Params) ! 138: { ! 139: // Correct return code? ! 140: Regs[REG_D0] = 0; ! 141: ! 142: return(TRUE); ! 143: } ! 144: ! 145: //----------------------------------------------------------------------- ! 146: /* ! 147: XBIOS BlitMode ! 148: Call 64 ! 149: */ ! 150: BOOL XBios_BlitMode(unsigned long Params) ! 151: { ! 152: // No blitter ! 153: Regs[REG_D0] = 0; ! 154: ! 155: return(TRUE); ! 156: } ! 157: ! 158: //----------------------------------------------------------------------- ! 159: /* ! 160: Check if we need to re-direct XBios call to our own routines ! 161: */ ! 162: BOOL XBios(void) ! 163: { ! 164: unsigned long Params; ! 165: unsigned short int XBiosCall; ! 166: ! 167: /* Find call */ ! 168: Params = Regs[REG_A7]; ! 169: XBiosCall = STMemory_ReadWord(Params); ! 170: // Debug_File("XBIOS %d\n",XBiosCall); ! 171: ! 172: switch(XBiosCall) { ! 173: case 8: ! 174: return(XBios_Floprd(Params)); ! 175: case 9: ! 176: return(XBios_Flopwr(Params)); ! 177: case 15: ! 178: return(XBios_Rsconf(Params)); ! 179: case 20: ! 180: return(XBios_Scrdmp(Params)); ! 181: case 36: ! 182: return(XBios_Prtblk(Params)); ! 183: case 64: ! 184: return(XBios_BlitMode(Params)); ! 185: ! 186: default: // Call as normal! ! 187: return(FALSE); ! 188: } ! 189: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.