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

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 "xwin.h"
                     20: #include "autoconf.h"
1.1.1.2 ! root       21: #include "execlib.h"
1.1       root       22: 
                     23: static int opencount = 0;
                     24: static int uaedevfd;
                     25: int numtracks = 512;
                     26: 
                     27: static ULONG hardfile_init(void)
                     28: {
                     29:     ULONG tmp1, devicenode, bootnode;
                     30:     int have36 = 1;
1.1.1.2 ! root       31:     ULONG retval = m68k_dreg(regs, 0);
1.1       root       32: 
                     33:     filesys_init();
                     34: 
                     35:     return retval;
                     36: }
                     37: 
                     38: static ULONG hardfile_open(void)
                     39: {
1.1.1.2 ! root       40:     CPTR tmp1 = m68k_areg(regs, 1); /* IOReq */
1.1       root       41: 
                     42:     /* Check unit number */
1.1.1.2 ! root       43:     if (m68k_dreg(regs, 0) == 0) {
1.1       root       44:        opencount++;
1.1.1.2 ! root       45:        put_word (m68k_areg(regs, 6)+32, get_word (m68k_areg(regs, 6)+32) + 1);
1.1       root       46:        put_long (tmp1+24, 0); /* io_Unit */
                     47:        put_byte (tmp1+31, 0); /* io_Error */
                     48:        put_byte (tmp1+8, 7); /* ln_type = NT_REPLYMSG */
                     49:        return 0;
                     50:     }
                     51: 
                     52:     put_long (tmp1+20, (ULONG)-1);
                     53:     put_byte (tmp1+31, (UBYTE)-1);
                     54:     return (ULONG)-1;
                     55: }
                     56: 
                     57: static ULONG hardfile_close(void)
                     58: {
                     59:     opencount--;
1.1.1.2 ! root       60:     put_word (m68k_areg(regs, 6)+32, get_word (m68k_areg(regs, 6)+32) - 1);
1.1       root       61: 
1.1.1.2 ! root       62:     return 0;
1.1       root       63: }
                     64: 
                     65: static ULONG hardfile_expunge(void)
                     66: {
                     67:     return 0; /* Simply ignore this one... */
                     68: }
                     69: 
                     70: static ULONG hardfile_beginio(void)
                     71: {
                     72:     ULONG tmp1, tmp2, dataptr, offset;
1.1.1.2 ! root       73:     ULONG retval = m68k_dreg(regs, 0);
1.1       root       74: 
1.1.1.2 ! root       75:     tmp1 = m68k_areg(regs, 1);
        !            76:     put_byte (tmp1+8, NT_MESSAGE);
1.1       root       77:     put_byte (tmp1+31, 0); /* no error yet */
                     78:     tmp2 = get_word (tmp1+28); /* io_Command */
                     79:     switch (tmp2) {
1.1.1.2 ! root       80:      case CMD_READ:
1.1       root       81:        dataptr = get_long (tmp1 + 40);
                     82:        if (dataptr & 1)
                     83:            goto bad_command;
                     84:        offset = get_long (tmp1 + 44);
                     85:        if (offset & 511)
                     86:            goto bad_command;
                     87:        tmp2 = get_long (tmp1 + 36); /* io_Length */
                     88:        if (tmp2 & 511)
                     89:            goto bad_command;
                     90:        if (tmp2 + offset > (ULONG)numtracks * 32 * 512)
                     91:            goto bad_command;
                     92: 
                     93:        put_long (tmp1 + 32, tmp2); /* set io_Actual */
                     94:        lseek (uaedevfd, offset, SEEK_SET);
                     95:        while (tmp2) {
                     96:            int i;
                     97:            char buffer[512];
                     98:            read (uaedevfd, buffer, 512);
                     99:            for (i = 0; i < 512; i++, dataptr++)
                    100:                put_byte(dataptr, buffer[i]);
                    101:            tmp2 -= 512;
                    102:        }
                    103:        break;
                    104: 
1.1.1.2 ! root      105:      case CMD_WRITE:
1.1       root      106:      case 11: /* Format */
                    107:        dataptr = get_long (tmp1 + 40);
                    108:        if (dataptr & 1)
                    109:            goto bad_command;
                    110:        offset = get_long (tmp1 + 44);
                    111:        if (offset & 511)
                    112:            goto bad_command;
                    113:        tmp2 = get_long (tmp1 + 36); /* io_Length */
                    114:        if (tmp2 & 511)
                    115:            goto bad_command;
                    116:        if (tmp2 + offset > (ULONG)numtracks * 32 * 512)
                    117:            goto bad_command;
                    118: 
                    119:        put_long (tmp1 + 32, tmp2); /* set io_Actual */
                    120:        lseek (uaedevfd, offset, SEEK_SET);
                    121:        while (tmp2) {
                    122:            char buffer[512];
                    123:            int i;
                    124:            for (i=0; i < 512; i++, dataptr++)
                    125:                buffer[i] = get_byte(dataptr);
                    126:            write (uaedevfd, buffer, 512);
                    127:            tmp2 -= 512;
                    128:        }
                    129:        break;
                    130: 
                    131:        bad_command:
                    132:        break;
                    133: 
                    134:      case 18: /* GetDriveType */
                    135:        put_long (tmp1 + 32, 1); /* not exactly a 3.5" drive, but... */
                    136:        break;
                    137: 
                    138:      case 19: /* GetNumTracks */
                    139:        put_long (tmp1 + 32, numtracks);
                    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. */
                    159:        put_byte (tmp1+31, (UBYTE)-3); /* io_Error */
                    160:        retval = 0;
                    161:        break;
                    162:     }
                    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:     }
                    168:     return retval;
                    169: }
                    170: 
                    171: static ULONG hardfile_abortio(void)
                    172: {
                    173:     return (ULONG)-3;
                    174: }
                    175: 
                    176: void hardfile_install(void)
                    177: {
                    178:     ULONG functable, datatable, inittable;
                    179:     ULONG initcode, openfunc, closefunc, expungefunc;
1.1.1.2 ! root      180:     ULONG beginiofunc, abortiofunc;
1.1       root      181: 
                    182:     uaedevfd = open ("hardfile", O_RDWR | O_BINARY);
                    183: 
                    184:     ROM_hardfile_resname = ds("hardfile.device");
                    185:     ROM_hardfile_resid = ds("UAE hardfile.device 0.2");
                    186: 
                    187:     numtracks = hardfile_size / 16384;
                    188: 
                    189:     /* initcode */
                    190:     initcode = here();
                    191:     calltrap(deftrap(hardfile_init)); dw(RTS);
                    192: 
                    193:     /* Open */
                    194:     openfunc = here();
                    195:     calltrap(deftrap(hardfile_open)); dw(RTS);
                    196: 
                    197:     /* Close */
                    198:     closefunc = here();
                    199:     calltrap(deftrap(hardfile_close)); dw(RTS);
                    200: 
                    201:     /* Expunge */
                    202:     expungefunc = here();
                    203:     calltrap(deftrap(hardfile_expunge)); dw(RTS);
                    204: 
                    205:     /* BeginIO */
                    206:     beginiofunc = here();
                    207:     calltrap(deftrap(hardfile_beginio)); dw(RTS);
                    208: 
                    209:     /* AbortIO */
                    210:     abortiofunc = here();
                    211:     calltrap(deftrap(hardfile_abortio)); dw(RTS);
                    212: 
                    213:     /* FuncTable */
                    214:     functable = here();
                    215:     dl(openfunc); /* Open */
                    216:     dl(closefunc); /* Close */
                    217:     dl(expungefunc); /* Expunge */
1.1.1.2 ! root      218:     dl(EXPANSION_nullfunc); /* Null */
1.1       root      219:     dl(beginiofunc); /* BeginIO */
                    220:     dl(abortiofunc); /* AbortIO */
1.1.1.2 ! root      221:     dl(0xFFFFFFFFul); /* end of table */
1.1       root      222: 
                    223:     /* DataTable */
                    224:     datatable = here();
                    225:     dw(0xE000); /* INITBYTE */
                    226:     dw(0x0008); /* LN_TYPE */
                    227:     dw(0x0300); /* NT_DEVICE */
                    228:     dw(0xC000); /* INITLONG */
                    229:     dw(0x000A); /* LN_NAME */
                    230:     dl(ROM_hardfile_resname);
                    231:     dw(0xE000); /* INITBYTE */
                    232:     dw(0x000E); /* LIB_FLAGS */
                    233:     dw(0x0600); /* LIBF_SUMUSED | LIBF_CHANGED */
                    234:     dw(0xD000); /* INITWORD */
                    235:     dw(0x0014); /* LIB_VERSION */
                    236:     dw(0x0004); /* 0.4 */
                    237:     dw(0xD000);
                    238:     dw(0x0016); /* LIB_REVISION */
                    239:     dw(0x0000);
                    240:     dw(0xC000);
                    241:     dw(0x0018); /* LIB_IDSTRING */
                    242:     dl(ROM_hardfile_resid);
                    243:     dw(0x0000); /* end of table */
                    244: 
                    245:     ROM_hardfile_init = here();
                    246:     dl(0x00000100); /* ??? */
                    247:     dl(functable);
                    248:     dl(datatable);
                    249:     dl(initcode);
                    250: 
                    251:     if (uaedevfd >= 0) {
                    252:        CPTR initfunc;
                    253:        
                    254:        add_filesys_unit(NULL, "hardfile", 1);
                    255:     }
                    256: }

unix.superglobalmegacorp.com

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