|
|
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.4 ! 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.4 ! root 33: put_long (tmp1 + 24, m68k_dreg (regs, 0)); /* io_Unit */
! 34: put_byte (tmp1 + 31, 0); /* io_Error */
! 35: put_byte (tmp1 + 8, 7); /* ln_type = NT_REPLYMSG */
1.1 root 36: return 0;
37: }
38:
1.1.1.4 ! root 39: put_long (tmp1 + 20, (uae_u32)-1);
! 40: put_byte (tmp1 + 31, (uae_u8)-1);
1.1.1.3 root 41: return (uae_u32)-1;
1.1 root 42: }
43:
1.1.1.4 ! root 44: static uae_u32 hardfile_close (void)
1.1 root 45: {
46: opencount--;
1.1.1.4 ! 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.4 ! root 52: static uae_u32 hardfile_expunge (void)
1.1 root 53: {
54: return 0; /* Simply ignore this one... */
55: }
56:
1.1.1.4 ! 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.4 ! 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:
1.1.1.4 ! root 179: void hardfile_install (void)
1.1 root 180: {
1.1.1.4 ! root 181: uae_u32 functable, datatable;
1.1.1.3 root 182: uae_u32 initcode, openfunc, closefunc, expungefunc;
183: uae_u32 beginiofunc, abortiofunc;
1.1 root 184:
1.1.1.4 ! root 185: ROM_hardfile_resname = ds ("uaehf.device");
! 186: ROM_hardfile_resid = ds ("UAE hardfile.device 0.2");
1.1 root 187:
188: /* initcode */
1.1.1.3 root 189: #if 0
1.1.1.4 ! 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 */
1.1.1.4 ! root 196: openfunc = here ();
! 197: calltrap (deftrap (hardfile_open)); dw (RTS);
1.1 root 198:
199: /* Close */
1.1.1.4 ! root 200: closefunc = here ();
! 201: calltrap (deftrap (hardfile_close)); dw (RTS);
1.1 root 202:
203: /* Expunge */
1.1.1.4 ! root 204: expungefunc = here ();
! 205: calltrap (deftrap (hardfile_expunge)); dw (RTS);
1.1 root 206:
207: /* BeginIO */
1.1.1.4 ! root 208: beginiofunc = here ();
! 209: calltrap (deftrap (hardfile_beginio));
1.1.1.3 root 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 */
1.1.1.4 ! root 216: dw (RTS);
1.1 root 217:
218: /* AbortIO */
1.1.1.4 ! root 219: abortiofunc = here ();
! 220: calltrap (deftrap (hardfile_abortio)); dw (RTS);
1.1 root 221:
222: /* FuncTable */
1.1.1.4 ! root 223: functable = here ();
! 224: dl (openfunc); /* Open */
! 225: dl (closefunc); /* Close */
! 226: dl (expungefunc); /* Expunge */
! 227: dl (EXPANSION_nullfunc); /* Null */
! 228: dl (beginiofunc); /* BeginIO */
! 229: dl (abortiofunc); /* AbortIO */
! 230: dl (0xFFFFFFFFul); /* end of table */
1.1 root 231:
232: /* DataTable */
1.1.1.4 ! root 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);
1.1 root 259: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.