|
|
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.