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