|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.