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

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"
                     16: #include "newcpu.h"
                     17: #include "disk.h"
                     18: #include "xwin.h"
                     19: #include "autoconf.h"
                     20: 
                     21: static int opencount = 0;
                     22: static int uaedevfd;
                     23: int numtracks = 512;
                     24: 
                     25: static ULONG hardfile_init(void)
                     26: {
                     27:     ULONG tmp1, devicenode, bootnode;
                     28:     int have36 = 1;
                     29:     ULONG retval = regs.d[0];
                     30: 
                     31:     filesys_init();
                     32: 
                     33:     return retval;
                     34: }
                     35: 
                     36: static ULONG hardfile_open(void)
                     37: {
                     38:     CPTR tmp1 = regs.a[1]; /* IOReq */
                     39: 
                     40:     /* Check unit number */
                     41:     if (regs.d[0] == 0) {
                     42:        opencount++;
                     43:        put_word (regs.a[6]+32, get_word (regs.a[6]+32) + 1);
                     44:        put_long (tmp1+24, 0); /* io_Unit */
                     45:        put_byte (tmp1+31, 0); /* io_Error */
                     46:        put_byte (tmp1+8, 7); /* ln_type = NT_REPLYMSG */
                     47:        return 0;
                     48:     }
                     49: 
                     50:     put_long (tmp1+20, (ULONG)-1);
                     51:     put_byte (tmp1+31, (UBYTE)-1);
                     52:     return (ULONG)-1;
                     53: }
                     54: 
                     55: static ULONG hardfile_close(void)
                     56: {
                     57:     opencount--;
                     58:     put_word (regs.a[6]+32, get_word (regs.a[6]+32) - 1);
                     59: 
                     60:     return regs.d[0];
                     61: }
                     62: 
                     63: static ULONG hardfile_expunge(void)
                     64: {
                     65:     return 0; /* Simply ignore this one... */
                     66: }
                     67: 
                     68: static ULONG hardfile_beginio(void)
                     69: {
                     70:     ULONG tmp1, tmp2, dataptr, offset;
                     71:     ULONG retval = regs.d[0];
                     72: 
                     73:     tmp1 = regs.a[1];
                     74:     put_byte (tmp1+8, 5); /* set ln_type to NT_MESSAGE */
                     75:     put_byte (tmp1+31, 0); /* no error yet */
                     76:     tmp2 = get_word (tmp1+28); /* io_Command */
                     77:     switch (tmp2) {
                     78:      case 2: /* Read */
                     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;
                     88:        if (tmp2 + offset > (ULONG)numtracks * 32 * 512)
                     89:            goto bad_command;
                     90: 
                     91:        put_long (tmp1 + 32, tmp2); /* set io_Actual */
                     92:        lseek (uaedevfd, offset, SEEK_SET);
                     93:        while (tmp2) {
                     94:            int i;
                     95:            char buffer[512];
                     96:            read (uaedevfd, buffer, 512);
                     97:            for (i = 0; i < 512; i++, dataptr++)
                     98:                put_byte(dataptr, buffer[i]);
                     99:            tmp2 -= 512;
                    100:        }
                    101:        break;
                    102: 
                    103:      case 3: /* Write */
                    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;
                    114:        if (tmp2 + offset > (ULONG)numtracks * 32 * 512)
                    115:            goto bad_command;
                    116: 
                    117:        put_long (tmp1 + 32, tmp2); /* set io_Actual */
                    118:        lseek (uaedevfd, offset, SEEK_SET);
                    119:        while (tmp2) {
                    120:            char buffer[512];
                    121:            int i;
                    122:            for (i=0; i < 512; i++, dataptr++)
                    123:                buffer[i] = get_byte(dataptr);
                    124:            write (uaedevfd, buffer, 512);
                    125:            tmp2 -= 512;
                    126:        }
                    127:        break;
                    128: 
                    129:        bad_command:
                    130:        break;
                    131: 
                    132:      case 18: /* GetDriveType */
                    133:        put_long (tmp1 + 32, 1); /* not exactly a 3.5" drive, but... */
                    134:        break;
                    135: 
                    136:      case 19: /* GetNumTracks */
                    137:        put_long (tmp1 + 32, numtracks);
                    138:        break;
                    139: 
                    140:        /* Some commands that just do nothing and return zero */
                    141:      case 4: /* Update */
                    142:      case 5: /* Clear */
                    143:      case 9: /* Motor */
                    144:      case 10: /* Seek */
                    145:      case 12: /* Remove */
                    146:      case 13: /* ChangeNum */
                    147:      case 14: /* ChangeStatus */
                    148:      case 15: /* ProtStatus */
                    149:      case 20: /* AddChangeInt */
                    150:      case 21: /* RemChangeInt */
                    151:        put_long (tmp1+32, 0); /* io_Actual */
                    152:        retval = 0;
                    153:        break;
                    154: 
                    155:      default:
                    156:        /* Command not understood. */
                    157:        put_byte (tmp1+31, (UBYTE)-3); /* io_Error */
                    158:        retval = 0;
                    159:        break;
                    160:     }
                    161:     if ((get_byte (tmp1+30) & 1) == 0) {
                    162:        /* Not IOF_QUICK -- need to ReplyMsg */
                    163:        regs.a[1] = tmp1;
                    164:        CallLib (get_long(4), -378);
                    165:     }
                    166:     return retval;
                    167: }
                    168: 
                    169: static ULONG hardfile_abortio(void)
                    170: {
                    171:     return (ULONG)-3;
                    172: }
                    173: 
                    174: void hardfile_install(void)
                    175: {
                    176:     ULONG functable, datatable, inittable;
                    177:     ULONG initcode, openfunc, closefunc, expungefunc;
                    178:     ULONG nullfunc, beginiofunc, abortiofunc;
                    179: 
                    180:     uaedevfd = open ("hardfile", O_RDWR | O_BINARY);
                    181: 
                    182:     ROM_hardfile_resname = ds("hardfile.device");
                    183:     ROM_hardfile_resid = ds("UAE hardfile.device 0.2");
                    184: 
                    185:     numtracks = hardfile_size / 16384;
                    186: 
                    187:     /* initcode */
                    188:     initcode = here();
                    189:     calltrap(deftrap(hardfile_init)); dw(RTS);
                    190: 
                    191:     /* Open */
                    192:     openfunc = here();
                    193:     calltrap(deftrap(hardfile_open)); dw(RTS);
                    194: 
                    195:     /* Close */
                    196:     closefunc = here();
                    197:     calltrap(deftrap(hardfile_close)); dw(RTS);
                    198: 
                    199:     /* Expunge */
                    200:     expungefunc = here();
                    201:     calltrap(deftrap(hardfile_expunge)); dw(RTS);
                    202: 
                    203:     /* Null */
                    204:     nullfunc = here();
                    205:     dw(0x7000); /* return 0; */
                    206:     dw(RTS);
                    207: 
                    208:     /* BeginIO */
                    209:     beginiofunc = here();
                    210:     calltrap(deftrap(hardfile_beginio)); dw(RTS);
                    211: 
                    212:     /* AbortIO */
                    213:     abortiofunc = here();
                    214:     calltrap(deftrap(hardfile_abortio)); dw(RTS);
                    215: 
                    216:     /* FuncTable */
                    217:     functable = here();
                    218:     dl(openfunc); /* Open */
                    219:     dl(closefunc); /* Close */
                    220:     dl(expungefunc); /* Expunge */
                    221:     dl(nullfunc); /* Null */
                    222:     dl(beginiofunc); /* BeginIO */
                    223:     dl(abortiofunc); /* AbortIO */
                    224:     dl(0xFFFFFFFF); /* end of table */
                    225: 
                    226:     /* DataTable */
                    227:     datatable = here();
                    228:     dw(0xE000); /* INITBYTE */
                    229:     dw(0x0008); /* LN_TYPE */
                    230:     dw(0x0300); /* NT_DEVICE */
                    231:     dw(0xC000); /* INITLONG */
                    232:     dw(0x000A); /* LN_NAME */
                    233:     dl(ROM_hardfile_resname);
                    234:     dw(0xE000); /* INITBYTE */
                    235:     dw(0x000E); /* LIB_FLAGS */
                    236:     dw(0x0600); /* LIBF_SUMUSED | LIBF_CHANGED */
                    237:     dw(0xD000); /* INITWORD */
                    238:     dw(0x0014); /* LIB_VERSION */
                    239:     dw(0x0004); /* 0.4 */
                    240:     dw(0xD000);
                    241:     dw(0x0016); /* LIB_REVISION */
                    242:     dw(0x0000);
                    243:     dw(0xC000);
                    244:     dw(0x0018); /* LIB_IDSTRING */
                    245:     dl(ROM_hardfile_resid);
                    246:     dw(0x0000); /* end of table */
                    247: 
                    248:     ROM_hardfile_init = here();
                    249:     dl(0x00000100); /* ??? */
                    250:     dl(functable);
                    251:     dl(datatable);
                    252:     dl(initcode);
                    253: 
                    254:     if (uaedevfd >= 0) {
                    255:        CPTR initfunc;
                    256:        
                    257:        add_filesys_unit(NULL, "hardfile", 1);
                    258:     }
                    259: }

unix.superglobalmegacorp.com

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