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