|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * AutoConfig devices
5: *
6: * (c) 1995 Bernd Schmidt
7: */
8:
9: #include "sysconfig.h"
10: #include "sysdeps.h"
11:
12: #include "config.h"
13: #include "options.h"
14: #include "memory.h"
15: #include "custom.h"
1.1.1.2 ! root 16: #include "readcpu.h"
1.1 root 17: #include "newcpu.h"
18: #include "disk.h"
19: #include "xwin.h"
20: #include "autoconf.h"
1.1.1.2 ! root 21: #include "execlib.h"
1.1 root 22:
23: static int opencount = 0;
24: static int uaedevfd;
25: int numtracks = 512;
26:
27: static ULONG hardfile_init(void)
28: {
29: ULONG tmp1, devicenode, bootnode;
30: int have36 = 1;
1.1.1.2 ! root 31: ULONG retval = m68k_dreg(regs, 0);
1.1 root 32:
33: filesys_init();
34:
35: return retval;
36: }
37:
38: static ULONG hardfile_open(void)
39: {
1.1.1.2 ! root 40: CPTR tmp1 = m68k_areg(regs, 1); /* IOReq */
1.1 root 41:
42: /* Check unit number */
1.1.1.2 ! root 43: if (m68k_dreg(regs, 0) == 0) {
1.1 root 44: opencount++;
1.1.1.2 ! root 45: put_word (m68k_areg(regs, 6)+32, get_word (m68k_areg(regs, 6)+32) + 1);
1.1 root 46: put_long (tmp1+24, 0); /* io_Unit */
47: put_byte (tmp1+31, 0); /* io_Error */
48: put_byte (tmp1+8, 7); /* ln_type = NT_REPLYMSG */
49: return 0;
50: }
51:
52: put_long (tmp1+20, (ULONG)-1);
53: put_byte (tmp1+31, (UBYTE)-1);
54: return (ULONG)-1;
55: }
56:
57: static ULONG hardfile_close(void)
58: {
59: opencount--;
1.1.1.2 ! root 60: put_word (m68k_areg(regs, 6)+32, get_word (m68k_areg(regs, 6)+32) - 1);
1.1 root 61:
1.1.1.2 ! root 62: return 0;
1.1 root 63: }
64:
65: static ULONG hardfile_expunge(void)
66: {
67: return 0; /* Simply ignore this one... */
68: }
69:
70: static ULONG hardfile_beginio(void)
71: {
72: ULONG tmp1, tmp2, dataptr, offset;
1.1.1.2 ! root 73: ULONG retval = m68k_dreg(regs, 0);
1.1 root 74:
1.1.1.2 ! root 75: tmp1 = m68k_areg(regs, 1);
! 76: put_byte (tmp1+8, NT_MESSAGE);
1.1 root 77: put_byte (tmp1+31, 0); /* no error yet */
78: tmp2 = get_word (tmp1+28); /* io_Command */
79: switch (tmp2) {
1.1.1.2 ! root 80: case CMD_READ:
1.1 root 81: dataptr = get_long (tmp1 + 40);
82: if (dataptr & 1)
83: goto bad_command;
84: offset = get_long (tmp1 + 44);
85: if (offset & 511)
86: goto bad_command;
87: tmp2 = get_long (tmp1 + 36); /* io_Length */
88: if (tmp2 & 511)
89: goto bad_command;
90: if (tmp2 + offset > (ULONG)numtracks * 32 * 512)
91: goto bad_command;
92:
93: put_long (tmp1 + 32, tmp2); /* set io_Actual */
94: lseek (uaedevfd, offset, SEEK_SET);
95: while (tmp2) {
96: int i;
97: char buffer[512];
98: read (uaedevfd, buffer, 512);
99: for (i = 0; i < 512; i++, dataptr++)
100: put_byte(dataptr, buffer[i]);
101: tmp2 -= 512;
102: }
103: break;
104:
1.1.1.2 ! root 105: case CMD_WRITE:
1.1 root 106: case 11: /* Format */
107: dataptr = get_long (tmp1 + 40);
108: if (dataptr & 1)
109: goto bad_command;
110: offset = get_long (tmp1 + 44);
111: if (offset & 511)
112: goto bad_command;
113: tmp2 = get_long (tmp1 + 36); /* io_Length */
114: if (tmp2 & 511)
115: goto bad_command;
116: if (tmp2 + offset > (ULONG)numtracks * 32 * 512)
117: goto bad_command;
118:
119: put_long (tmp1 + 32, tmp2); /* set io_Actual */
120: lseek (uaedevfd, offset, SEEK_SET);
121: while (tmp2) {
122: char buffer[512];
123: int i;
124: for (i=0; i < 512; i++, dataptr++)
125: buffer[i] = get_byte(dataptr);
126: write (uaedevfd, buffer, 512);
127: tmp2 -= 512;
128: }
129: break;
130:
131: bad_command:
132: break;
133:
134: case 18: /* GetDriveType */
135: put_long (tmp1 + 32, 1); /* not exactly a 3.5" drive, but... */
136: break;
137:
138: case 19: /* GetNumTracks */
139: put_long (tmp1 + 32, numtracks);
140: break;
141:
142: /* Some commands that just do nothing and return zero */
1.1.1.2 ! root 143: case CMD_UPDATE:
! 144: case CMD_CLEAR:
1.1 root 145: case 9: /* Motor */
146: case 10: /* Seek */
147: case 12: /* Remove */
148: case 13: /* ChangeNum */
149: case 14: /* ChangeStatus */
150: case 15: /* ProtStatus */
151: case 20: /* AddChangeInt */
152: case 21: /* RemChangeInt */
153: put_long (tmp1+32, 0); /* io_Actual */
154: retval = 0;
155: break;
156:
157: default:
158: /* Command not understood. */
159: put_byte (tmp1+31, (UBYTE)-3); /* io_Error */
160: retval = 0;
161: break;
162: }
163: if ((get_byte (tmp1+30) & 1) == 0) {
164: /* Not IOF_QUICK -- need to ReplyMsg */
1.1.1.2 ! root 165: m68k_areg(regs, 1) = tmp1;
1.1 root 166: CallLib (get_long(4), -378);
167: }
168: return retval;
169: }
170:
171: static ULONG hardfile_abortio(void)
172: {
173: return (ULONG)-3;
174: }
175:
176: void hardfile_install(void)
177: {
178: ULONG functable, datatable, inittable;
179: ULONG initcode, openfunc, closefunc, expungefunc;
1.1.1.2 ! root 180: ULONG beginiofunc, abortiofunc;
1.1 root 181:
182: uaedevfd = open ("hardfile", O_RDWR | O_BINARY);
183:
184: ROM_hardfile_resname = ds("hardfile.device");
185: ROM_hardfile_resid = ds("UAE hardfile.device 0.2");
186:
187: numtracks = hardfile_size / 16384;
188:
189: /* initcode */
190: initcode = here();
191: calltrap(deftrap(hardfile_init)); dw(RTS);
192:
193: /* Open */
194: openfunc = here();
195: calltrap(deftrap(hardfile_open)); dw(RTS);
196:
197: /* Close */
198: closefunc = here();
199: calltrap(deftrap(hardfile_close)); dw(RTS);
200:
201: /* Expunge */
202: expungefunc = here();
203: calltrap(deftrap(hardfile_expunge)); dw(RTS);
204:
205: /* BeginIO */
206: beginiofunc = here();
207: calltrap(deftrap(hardfile_beginio)); dw(RTS);
208:
209: /* AbortIO */
210: abortiofunc = here();
211: calltrap(deftrap(hardfile_abortio)); dw(RTS);
212:
213: /* FuncTable */
214: functable = here();
215: dl(openfunc); /* Open */
216: dl(closefunc); /* Close */
217: dl(expungefunc); /* Expunge */
1.1.1.2 ! root 218: dl(EXPANSION_nullfunc); /* Null */
1.1 root 219: dl(beginiofunc); /* BeginIO */
220: dl(abortiofunc); /* AbortIO */
1.1.1.2 ! root 221: dl(0xFFFFFFFFul); /* end of table */
1.1 root 222:
223: /* DataTable */
224: datatable = here();
225: dw(0xE000); /* INITBYTE */
226: dw(0x0008); /* LN_TYPE */
227: dw(0x0300); /* NT_DEVICE */
228: dw(0xC000); /* INITLONG */
229: dw(0x000A); /* LN_NAME */
230: dl(ROM_hardfile_resname);
231: dw(0xE000); /* INITBYTE */
232: dw(0x000E); /* LIB_FLAGS */
233: dw(0x0600); /* LIBF_SUMUSED | LIBF_CHANGED */
234: dw(0xD000); /* INITWORD */
235: dw(0x0014); /* LIB_VERSION */
236: dw(0x0004); /* 0.4 */
237: dw(0xD000);
238: dw(0x0016); /* LIB_REVISION */
239: dw(0x0000);
240: dw(0xC000);
241: dw(0x0018); /* LIB_IDSTRING */
242: dl(ROM_hardfile_resid);
243: dw(0x0000); /* end of table */
244:
245: ROM_hardfile_init = here();
246: dl(0x00000100); /* ??? */
247: dl(functable);
248: dl(datatable);
249: dl(initcode);
250:
251: if (uaedevfd >= 0) {
252: CPTR initfunc;
253:
254: add_filesys_unit(NULL, "hardfile", 1);
255: }
256: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.