Annotation of uae/src/hardfile.c, revision 1.1.1.6

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.