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

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

unix.superglobalmegacorp.com

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