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