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