Annotation of uae/ersatz.c, revision 1.1.1.2

1.1       root        1:  /* 
                      2:   * UAE - The Un*x Amiga Emulator
                      3:   * 
                      4:   * A "replacement" for a missing Kickstart
                      5:   * Warning! Q&D
                      6:   *
                      7:   * (c) 1995 Bernd Schmidt
                      8:   */
                      9: 
1.1.1.2 ! root       10: #include "sysconfig.h"
        !            11: #include "sysdeps.h"
1.1       root       12: 
                     13: #include "config.h"
                     14: #include "options.h"
                     15: #include "memory.h"
                     16: #include "custom.h"
                     17: #include "newcpu.h"
                     18: #include "cia.h"
                     19: #include "disk.h"
                     20: #include "ersatz.h"
                     21: 
                     22: #define EOP_INIT     0
                     23: #define EOP_NIMP     1
                     24: #define EOP_SERVEINT 2
                     25: #define EOP_DOIO     3
                     26: #define EOP_OPENLIB  4
                     27: #define EOP_AVAILMEM 5
                     28: #define EOP_ALLOCMEM 6
                     29: #define EOP_ALLOCABS 7
                     30: 
                     31: void init_ersatz_rom (UWORD *data)
                     32: {
                     33:     fprintf(stderr, "Trying to use Kickstart replacement.\n");
                     34:     *data++ = 0x0008; /* initial SP */
                     35:     *data++ = 0;
                     36:     *data++ = 0x00F8; /* initial PC */
                     37:     *data++ = 0x0008;
                     38: 
                     39:     *data++ = 0xF00D;
                     40:     *data++ = EOP_INIT;
                     41:     *data++ = 0xF00D;
                     42:     *data++ = EOP_NIMP;
                     43:     
                     44:     *data++ = 0xF00D;
                     45:     *data++ = EOP_DOIO;
                     46:     *data++ = 0x4E75;
                     47:     *data++ = 0xF00D;
                     48:     
                     49:     *data++ = EOP_SERVEINT;
                     50:     *data++ = 0x4E73;
                     51:     *data++ = 0xF00D;
                     52:     *data++ = EOP_AVAILMEM;
                     53:     
                     54:     *data++ = 0x4E75;
                     55:     *data++ = 0xF00D;
                     56:     *data++ = EOP_ALLOCMEM;    
                     57:     *data++ = 0x4E75;
                     58: 
                     59:     *data++ = 0xF00D;
                     60:     *data++ = EOP_ALLOCABS;
                     61:     *data++ = 0x4E75;
                     62: }
                     63: 
                     64: static void ersatz_doio (void)
                     65: {
                     66:     CPTR request = regs.a[1];
                     67:     switch (get_word (request + 0x1C)) {
                     68:      case 9: /* TD_MOTOR is harmless */
                     69:      case 2: case 0x8002: /* READ commands */
                     70:        break;
                     71:        
                     72:      default:
                     73:        fprintf(stderr, "Only CMD_READ supported in DoIO()\n");
                     74:        abort();
                     75:     }
                     76:     {
                     77:        CPTR dest = get_long (request + 0x28);
                     78:        int start = get_long (request + 0x2C) / 512;
                     79:        int nsecs = get_long (request + 0x24) / 512;
                     80:        int tr = start / 11;
                     81:        int sec = start % 11;
                     82:        while (nsecs--) {
                     83:            DISK_ersatz_read (tr, sec, dest);
                     84:            dest += 512;
                     85:            if (++sec == 11)
                     86:                sec = 0, tr++;
                     87:        }
                     88:     }
                     89: }
                     90: 
                     91: static void ersatz_init (void)
                     92: {
                     93:     int f;
                     94:     CPTR request;
                     95:     CPTR a;
                     96:     
                     97:     regs.s = 0;
                     98:     /* Set some interrupt vectors */
                     99:     for (a = 8; a < 0xC0; a += 4) {
                    100:        put_long (a, 0xF80016);
                    101:     }
                    102:     regs.usp = 0x80000;
                    103:     regs.a[7] = 0x7F000;
                    104:     regs.intmask = 0;
                    105:     
                    106:     /* Build a dummy execbase */
                    107:     put_long (4, regs.a[6] = 0x676);
                    108:     put_byte (0x676 + 0x129, 0);    
                    109:     for (f = 1; f < 105; f++) {        
                    110:        put_word (0x676 - 6*f, 0x4EF9);
                    111:        put_long (0x676 - 6*f + 2, 0xF8000C);
                    112:     }
                    113:     /* Some "supported" functions */
                    114:     put_long (0x676 - 456 + 2, 0xF80010);
                    115:     put_long (0x676 - 216 + 2, 0xF8001C);
                    116:     put_long (0x676 - 198 + 2, 0xF80022);
                    117:     put_long (0x676 - 204 + 2, 0xF80028);
                    118:     put_long (0x676 - 210 + 2, 0xF80026);
                    119:     
                    120:     /* Build an IORequest */
                    121:     request = 0x800;
                    122:     put_word (request + 0x1C, 2);
                    123:     put_long (request + 0x28, 0x4000);
                    124:     put_long (request + 0x2C, 0);
                    125:     put_long (request + 0x24, 0x200 * 4);
                    126:     regs.a[1] = request;
                    127:     ersatz_doio ();
                    128:     m68k_setpc (0x400C);
                    129: 
                    130:     /* Init the hardware */
                    131:     put_long (0x3000, 0xFFFFFFFE);
                    132:     put_long (0xDFF080, 0x3000);
                    133:     put_word (0xDFF088, 0);
                    134:     put_word (0xDFF096, 0xE390);
                    135:     put_word (0xDFF09A, 0xE02C);
1.1.1.2 ! root      136:     put_word (0xDFF09E, 0x0000);
1.1       root      137:     put_word (0xDFF092, 0x0038);
                    138:     put_word (0xDFF094, 0x00D0);
                    139:     put_word (0xDFF08E, 0x2C81);
                    140:     put_word (0xDFF090, 0xF4C1);
1.1.1.2 ! root      141:     put_word (0xDFF02A, 0x8000);
        !           142:     
        !           143:     put_byte (0xBFD100, 0xF7);
        !           144:     put_byte (0xBFEE01, 0);
        !           145:     put_byte (0xBFEF01, 0x08);
        !           146:     put_byte (0xBFDE00, 0x04);
        !           147:     put_byte (0xBFDF00, 0x84);
        !           148:     put_byte (0xBFDD00, 0x9F);
        !           149:     put_byte (0xBFED01, 0x9F);
1.1       root      150: }
                    151: 
                    152: void ersatz_perform (UWORD what)
                    153: {
                    154:     switch (what) {
                    155:      case EOP_INIT:
                    156:        ersatz_init ();
                    157:        break;
                    158:        
                    159:      case EOP_SERVEINT:
                    160:        /* Just reset all the interrupt request bits */
                    161:        put_word (0xDFF09C, get_word (0xDFF01E) & 0x3FFF);
                    162:        break;
                    163:        
                    164:      case EOP_DOIO:
                    165:        ersatz_doio ();
                    166:        break;
                    167:        
                    168:      case EOP_AVAILMEM:
                    169:        regs.d[0] = regs.d[1] & 4 ? 0 : 0x70000;
                    170:        break;
                    171:        
                    172:      case EOP_ALLOCMEM:
                    173:        regs.d[0] = regs.d[1] & 4 ? 0 : 0x0F000;
                    174:        break;
                    175: 
                    176:      case EOP_ALLOCABS:
                    177:        regs.d[0] = regs.a[1];
                    178:        break;
                    179: 
                    180:      case EOP_NIMP:
                    181:        fprintf(stderr, "Unimplemented Kickstart function called\n");
                    182:        abort ();
                    183:      case EOP_OPENLIB: 
                    184:      default:
                    185:        fprintf(stderr, "Internal error. Giving up.\n");
                    186:        abort ();
                    187:     }
                    188: }

unix.superglobalmegacorp.com

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