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

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

unix.superglobalmegacorp.com

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