Annotation of hatari/src/uae-cpu/memory.c, revision 1.1.1.1

1.1       root        1:  /*
                      2:   * UAE - The Un*x Amiga Emulator
                      3:   *
                      4:   * Memory management
                      5:   *
                      6:   * (c) 1995 Bernd Schmidt
                      7:   */
                      8: 
                      9: /*#include "sysconfig.h"*/
                     10: #include "sysdeps.h"
                     11: #include "hatari-glue.h"
                     12: #include "maccess.h"
                     13: #include "memory.h"
                     14: #include "../includes/tos.h"
                     15: /*
                     16: #include "config.h"
                     17: #include "options.h"
                     18: #include "uae.h"
                     19: */
                     20: #ifdef USE_MAPPED_MEMORY
                     21: #include <sys/mman.h>
                     22: #endif
                     23: 
                     24: #include "../includes/intercept.h"
                     25: 
                     26: 
                     27: extern   unsigned char STRam[16*1024*1024];  /* See hatari.c */
                     28: 
                     29: 
                     30: /* Set by each memory handler that does not simply access real memory.  */
                     31: int special_mem;
                     32: 
                     33: uae_u32 allocated_STmem;
                     34: uae_u32 allocated_TTmem;
                     35: 
                     36: uae_u32 STmem_mask, ROMmem_mask, IOmem_mask, TTmem_mask;
                     37: 
                     38: 
                     39: #ifdef SAVE_MEMORY_BANKS
                     40: addrbank *mem_banks[65536];
                     41: #else
                     42: addrbank mem_banks[65536];
                     43: #endif
                     44: 
                     45: #ifdef NO_INLINE_MEMORY_ACCESS
                     46: __inline__ uae_u32 longget (uaecptr addr)
                     47: {
                     48:     return call_mem_get_func (get_mem_bank (addr).lget, addr);
                     49: }
                     50: __inline__ uae_u32 wordget (uaecptr addr)
                     51: {
                     52:     return call_mem_get_func (get_mem_bank (addr).wget, addr);
                     53: }
                     54: __inline__ uae_u32 byteget (uaecptr addr)
                     55: {
                     56:     return call_mem_get_func (get_mem_bank (addr).bget, addr);
                     57: }
                     58: __inline__ void longput (uaecptr addr, uae_u32 l)
                     59: {
                     60:     call_mem_put_func (get_mem_bank (addr).lput, addr, l);
                     61: }
                     62: __inline__ void wordput (uaecptr addr, uae_u32 w)
                     63: {
                     64:     call_mem_put_func (get_mem_bank (addr).wput, addr, w);
                     65: }
                     66: __inline__ void byteput (uaecptr addr, uae_u32 b)
                     67: {
                     68:     call_mem_put_func (get_mem_bank (addr).bput, addr, b);
                     69: }
                     70: #endif
                     71: 
                     72: 
                     73: /* A dummy bank that only contains zeros */
                     74: 
                     75: static uae_u32 dummy_lget (uaecptr) REGPARAM;
                     76: static uae_u32 dummy_wget (uaecptr) REGPARAM;
                     77: static uae_u32 dummy_bget (uaecptr) REGPARAM;
                     78: static void dummy_lput (uaecptr, uae_u32) REGPARAM;
                     79: static void dummy_wput (uaecptr, uae_u32) REGPARAM;
                     80: static void dummy_bput (uaecptr, uae_u32) REGPARAM;
                     81: static int dummy_check (uaecptr addr, uae_u32 size) REGPARAM;
                     82: 
                     83: uae_u32 REGPARAM2 dummy_lget (uaecptr addr)
                     84: {
                     85:     special_mem |= S_READ;
                     86:     if (illegal_mem)
                     87:        write_log ("Illegal lget at %08lx\n", addr);
                     88: 
                     89:     return 0;
                     90: }
                     91: 
                     92: uae_u32 REGPARAM2 dummy_wget (uaecptr addr)
                     93: {
                     94:     special_mem |= S_READ;
                     95:     if (illegal_mem)
                     96:        write_log ("Illegal wget at %08lx\n", addr);
                     97: 
                     98:     return 0;
                     99: }
                    100: 
                    101: uae_u32 REGPARAM2 dummy_bget (uaecptr addr)
                    102: {
                    103:     special_mem |= S_READ;
                    104:     if (illegal_mem)
                    105:        write_log ("Illegal bget at %08lx\n", addr);
                    106: 
                    107:     return 0;
                    108: }
                    109: 
                    110: void REGPARAM2 dummy_lput (uaecptr addr, uae_u32 l)
                    111: {
                    112:     special_mem |= S_WRITE;
                    113:     if (illegal_mem)
                    114:        write_log ("Illegal lput at %08lx\n", addr);
                    115: }
                    116: void REGPARAM2 dummy_wput (uaecptr addr, uae_u32 w)
                    117: {
                    118:     special_mem |= S_WRITE;
                    119:     if (illegal_mem)
                    120:        write_log ("Illegal wput at %08lx\n", addr);
                    121: }
                    122: void REGPARAM2 dummy_bput (uaecptr addr, uae_u32 b)
                    123: {
                    124:     special_mem |= S_WRITE;
                    125:     if (illegal_mem)
                    126:        write_log ("Illegal bput at %08lx\n", addr);
                    127: }
                    128: 
                    129: int REGPARAM2 dummy_check (uaecptr addr, uae_u32 size)
                    130: {
                    131:     if (illegal_mem)
                    132:        write_log ("Illegal check at %08lx\n", addr);
                    133: 
                    134:     return 0;
                    135: }
                    136: 
                    137: 
                    138: /* ST RAM memory */
                    139: 
                    140: uae_u8 *STmemory;
                    141: 
                    142: static int STmem_check (uaecptr addr, uae_u32 size) REGPARAM;
                    143: static uae_u8 *STmem_xlate (uaecptr addr) REGPARAM;
                    144: 
                    145: uae_u32 REGPARAM2 STmem_lget (uaecptr addr)
                    146: {
                    147:     uae_u32 *m;
                    148: 
                    149:     addr -= STmem_start & STmem_mask;
                    150:     addr &= STmem_mask;
                    151:     m = (uae_u32 *)(STmemory + addr);
                    152:     return do_get_mem_long (m);
                    153: }
                    154: 
                    155: uae_u32 REGPARAM2 STmem_wget (uaecptr addr)
                    156: {
                    157:     uae_u16 *m;
                    158: 
                    159:     addr -= STmem_start & STmem_mask;
                    160:     addr &= STmem_mask;
                    161:     m = (uae_u16 *)(STmemory + addr);
                    162:     return do_get_mem_word (m);
                    163: }
                    164: 
                    165: uae_u32 REGPARAM2 STmem_bget (uaecptr addr)
                    166: {
                    167:     addr -= STmem_start & STmem_mask;
                    168:     addr &= STmem_mask;
                    169:     return STmemory[addr];
                    170: }
                    171: 
                    172: void REGPARAM2 STmem_lput (uaecptr addr, uae_u32 l)
                    173: {
                    174:     uae_u32 *m;
                    175: 
                    176:     addr -= STmem_start & STmem_mask;
                    177:     addr &= STmem_mask;
                    178:     m = (uae_u32 *)(STmemory + addr);
                    179:     do_put_mem_long (m, l);
                    180: }
                    181: 
                    182: void REGPARAM2 STmem_wput (uaecptr addr, uae_u32 w)
                    183: {
                    184:     uae_u16 *m;
                    185: 
                    186:     addr -= STmem_start & STmem_mask;
                    187:     addr &= STmem_mask;
                    188:     m = (uae_u16 *)(STmemory + addr);
                    189:     do_put_mem_word (m, w);
                    190: }
                    191: 
                    192: void REGPARAM2 STmem_bput (uaecptr addr, uae_u32 b)
                    193: {
                    194:     addr -= STmem_start & STmem_mask;
                    195:     addr &= STmem_mask;
                    196:     STmemory[addr] = b;
                    197: }
                    198: 
                    199: int REGPARAM2 STmem_check (uaecptr addr, uae_u32 size)
                    200: {
                    201:     addr -= STmem_start & STmem_mask;
                    202:     addr &= STmem_mask;
                    203:     return (addr + size) <= allocated_STmem;
                    204: }
                    205: 
                    206: uae_u8 REGPARAM2 *STmem_xlate (uaecptr addr)
                    207: {
                    208:     addr -= STmem_start & STmem_mask;
                    209:     addr &= STmem_mask;
                    210:     return STmemory + addr;
                    211: }
                    212: 
                    213: 
                    214: /* TT fast memory */
                    215: 
                    216: static uae_u8 *TTmemory;
                    217: 
                    218: static uae_u32 TTmem_lget (uaecptr) REGPARAM;
                    219: static uae_u32 TTmem_wget (uaecptr) REGPARAM;
                    220: static uae_u32 TTmem_bget (uaecptr) REGPARAM;
                    221: static void TTmem_lput (uaecptr, uae_u32) REGPARAM;
                    222: static void TTmem_wput (uaecptr, uae_u32) REGPARAM;
                    223: static void TTmem_bput (uaecptr, uae_u32) REGPARAM;
                    224: static int TTmem_check (uaecptr addr, uae_u32 size) REGPARAM;
                    225: static uae_u8 *TTmem_xlate (uaecptr addr) REGPARAM;
                    226: 
                    227: uae_u32 REGPARAM2 TTmem_lget (uaecptr addr)
                    228: {
                    229:     uae_u32 *m;
                    230:     addr -= TTmem_start & TTmem_mask;
                    231:     addr &= TTmem_mask;
                    232:     m = (uae_u32 *)(TTmemory + addr);
                    233:     return do_get_mem_long (m);
                    234: }
                    235: 
                    236: uae_u32 REGPARAM2 TTmem_wget (uaecptr addr)
                    237: {
                    238:     uae_u16 *m;
                    239:     addr -= TTmem_start & TTmem_mask;
                    240:     addr &= TTmem_mask;
                    241:     m = (uae_u16 *)(TTmemory + addr);
                    242:     return do_get_mem_word (m);
                    243: }
                    244: 
                    245: uae_u32 REGPARAM2 TTmem_bget (uaecptr addr)
                    246: {
                    247:     addr -= TTmem_start & TTmem_mask;
                    248:     addr &= TTmem_mask;
                    249:     return TTmemory[addr];
                    250: }
                    251: 
                    252: void REGPARAM2 TTmem_lput (uaecptr addr, uae_u32 l)
                    253: {
                    254:     uae_u32 *m;
                    255:     addr -= TTmem_start & TTmem_mask;
                    256:     addr &= TTmem_mask;
                    257:     m = (uae_u32 *)(TTmemory + addr);
                    258:     do_put_mem_long (m, l);
                    259: }
                    260: 
                    261: void REGPARAM2 TTmem_wput (uaecptr addr, uae_u32 w)
                    262: {
                    263:     uae_u16 *m;
                    264:     addr -= TTmem_start & TTmem_mask;
                    265:     addr &= TTmem_mask;
                    266:     m = (uae_u16 *)(TTmemory + addr);
                    267:     do_put_mem_word (m, w);
                    268: }
                    269: 
                    270: void REGPARAM2 TTmem_bput (uaecptr addr, uae_u32 b)
                    271: {
                    272:     addr -= TTmem_start & TTmem_mask;
                    273:     addr &= TTmem_mask;
                    274:     TTmemory[addr] = b;
                    275: }
                    276: 
                    277: int REGPARAM2 TTmem_check (uaecptr addr, uae_u32 size)
                    278: {
                    279:     addr -= TTmem_start & TTmem_mask;
                    280:     addr &= TTmem_mask;
                    281:     return (addr + size) <= allocated_TTmem;
                    282: }
                    283: 
                    284: uae_u8 REGPARAM2 *TTmem_xlate(uaecptr addr)
                    285: {
                    286:     addr -= TTmem_start & TTmem_mask;
                    287:     addr &= TTmem_mask;
                    288:     return TTmemory + addr;
                    289: }
                    290: 
                    291: /* ROM memory */
                    292: 
                    293: uae_u8 *ROMmemory;
                    294: 
                    295: static uae_u32 ROMmem_lget (uaecptr) REGPARAM;
                    296: static uae_u32 ROMmem_wget (uaecptr) REGPARAM;
                    297: static uae_u32 ROMmem_bget (uaecptr) REGPARAM;
                    298: static void  ROMmem_lput (uaecptr, uae_u32) REGPARAM;
                    299: static void  ROMmem_wput (uaecptr, uae_u32) REGPARAM;
                    300: static void  ROMmem_bput (uaecptr, uae_u32) REGPARAM;
                    301: static int  ROMmem_check (uaecptr addr, uae_u32 size) REGPARAM;
                    302: static uae_u8 *ROMmem_xlate (uaecptr addr) REGPARAM;
                    303: 
                    304: uae_u32 REGPARAM2 ROMmem_lget (uaecptr addr)
                    305: {
                    306:     uae_u32 *m;
                    307:     addr -= ROMmem_start & ROMmem_mask;
                    308:     addr &= ROMmem_mask;
                    309:     m = (uae_u32 *)(ROMmemory + addr);
                    310:     return do_get_mem_long (m);
                    311: }
                    312: 
                    313: uae_u32 REGPARAM2 ROMmem_wget (uaecptr addr)
                    314: {
                    315:     uae_u16 *m;
                    316:     addr -= ROMmem_start & ROMmem_mask;
                    317:     addr &= ROMmem_mask;
                    318:     m = (uae_u16 *)(ROMmemory + addr);
                    319:     return do_get_mem_word (m);
                    320: }
                    321: 
                    322: uae_u32 REGPARAM2 ROMmem_bget (uaecptr addr)
                    323: {
                    324:     addr -= ROMmem_start & ROMmem_mask;
                    325:     addr &= ROMmem_mask;
                    326:     return ROMmemory[addr];
                    327: }
                    328: 
                    329: void REGPARAM2 ROMmem_lput (uaecptr addr, uae_u32 b)
                    330: {
                    331:     if (illegal_mem)
                    332:        write_log ("Illegal ROMmem lput at %08lx\n", addr);
                    333: }
                    334: 
                    335: void REGPARAM2 ROMmem_wput (uaecptr addr, uae_u32 b)
                    336: {
                    337:     if (illegal_mem)
                    338:        write_log ("Illegal ROMmem wput at %08lx\n", addr);
                    339: }
                    340: 
                    341: void REGPARAM2 ROMmem_bput (uaecptr addr, uae_u32 b)
                    342: {
                    343:     if (illegal_mem)
                    344:        write_log ("Illegal ROMmem lput at %08lx\n", addr);
                    345: }
                    346: 
                    347: int REGPARAM2 ROMmem_check (uaecptr addr, uae_u32 size)
                    348: {
                    349:     addr -= ROMmem_start & ROMmem_mask;
                    350:     addr &= ROMmem_mask;
                    351:     return (addr + size) <= ROMmem_size;
                    352: }
                    353: 
                    354: uae_u8 REGPARAM2 *ROMmem_xlate (uaecptr addr)
                    355: {
                    356:     addr -= ROMmem_start & ROMmem_mask;
                    357:     addr &= ROMmem_mask;
                    358:     return ROMmemory + addr;
                    359: }
                    360: 
                    361: 
                    362: /* Hardware IO memory */
                    363: /* see also intercept.c */
                    364: 
                    365: uae_u8 *IOmemory;
                    366: 
                    367: static int  IOmem_check (uaecptr addr, uae_u32 size) REGPARAM;
                    368: static uae_u8 *IOmem_xlate (uaecptr addr) REGPARAM;
                    369: 
                    370: int REGPARAM2 IOmem_check (uaecptr addr, uae_u32 size)
                    371: {
                    372:     addr -= IOmem_start & IOmem_mask;
                    373:     addr &= IOmem_mask;
                    374:     return (addr + size) <= IOmem_size;
                    375: }
                    376: 
                    377: uae_u8 REGPARAM2 *IOmem_xlate (uaecptr addr)
                    378: {
                    379:     addr -= IOmem_start & IOmem_mask;
                    380:     addr &= IOmem_mask;
                    381:     return IOmemory + addr;
                    382: }
                    383: 
                    384: 
                    385: 
                    386: /* Default memory access functions */
                    387: 
                    388: int REGPARAM2 default_check (uaecptr a, uae_u32 b)
                    389: {
                    390:     return 0;
                    391: }
                    392: 
                    393: uae_u8 REGPARAM2 *default_xlate (uaecptr a)
                    394: {
                    395:     write_log ("Your Atari program just did something terribly stupid\n");
                    396:     Reset_Warm();
                    397:     return ROMmem_xlate (get_long (0xFC0000)); /* So we don't crash. */
                    398: }
                    399: 
                    400: 
                    401: /* Address banks */
                    402: 
                    403: addrbank dummy_bank = {
                    404:     dummy_lget, dummy_wget, dummy_bget,
                    405:     dummy_lput, dummy_wput, dummy_bput,
                    406:     default_xlate, dummy_check
                    407: };
                    408: 
                    409: addrbank STmem_bank = {
                    410:     STmem_lget, STmem_wget, STmem_bget,
                    411:     STmem_lput, STmem_wput, STmem_bput,
                    412:     STmem_xlate, STmem_check
                    413: };
                    414: 
                    415: addrbank TTmem_bank = {
                    416:     TTmem_lget, TTmem_wget, TTmem_bget,
                    417:     TTmem_lput, TTmem_wput, TTmem_bput,
                    418:     TTmem_xlate, TTmem_check
                    419: };
                    420: 
                    421: addrbank ROMmem_bank = {
                    422:     ROMmem_lget, ROMmem_wget, ROMmem_bget,
                    423:     ROMmem_lput, ROMmem_wput, ROMmem_bput,
                    424:     ROMmem_xlate, ROMmem_check
                    425: };
                    426: 
                    427: addrbank IOmem_bank = {
                    428:     Intercept_ReadLong, Intercept_ReadWord, Intercept_ReadByte,
                    429:     Intercept_WriteLong, Intercept_WriteWord, Intercept_WriteByte,
                    430:     IOmem_xlate, IOmem_check
                    431: };
                    432: 
                    433: 
                    434: char *address_space, *good_address_map;
                    435: int good_address_fd;
                    436: 
                    437: static void init_mem_banks (void)
                    438: {
                    439:     int i;
                    440:     for (i = 0; i < 65536; i++)
                    441:        put_mem_bank (i<<16, &dummy_bank);
                    442: }
                    443: 
                    444: #define MAKE_USER_PROGRAMS_BEHAVE 1
                    445: void memory_init (void)
                    446: {
                    447:     char buffer[4096];
                    448:     char *nam;
                    449:     int i, fd;
                    450:     /*int custom_start;*/
                    451: 
                    452:     allocated_STmem = STmem_size;
                    453:     allocated_TTmem = TTmem_size;
                    454: 
                    455: #ifdef USE_MAPPED_MEMORY
                    456: #error So nicht
                    457:     fd = open ("/dev/zero", O_RDWR);
                    458:     good_address_map = mmap (NULL, 1 << 24, PROT_READ, MAP_PRIVATE, fd, 0);
                    459:     /* Don't believe USER_PROGRAMS_BEHAVE. Otherwise, we'd segfault as soon
                    460:      * as a decrunch routine tries to do color register hacks. */
                    461:     address_space = mmap (NULL, 1 << 24, PROT_READ | (USER_PROGRAMS_BEHAVE || MAKE_USER_PROGRAMS_BEHAVE? PROT_WRITE : 0), MAP_PRIVATE, fd, 0);
                    462:     if ((int)address_space < 0 || (int)good_address_map < 0) {
                    463:        write_log ("Your system does not have enough virtual memory - increase swap.\n");
                    464:        abort ();
                    465:     }
                    466: #ifdef MAKE_USER_PROGRAMS_BEHAVE
                    467:     memset (address_space + 0xDFF180, 0xFF, 32*2);
                    468: #else
                    469:     /* Likewise. This is mostly for mouse button checks. */
                    470:     if (USER_PROGRAMS_BEHAVE)
                    471:        memset (address_space + 0xA00000, 0xFF, 0xF00000 - 0xA00000);
                    472: #endif
                    473:     STmemory = mmap (address_space, 0x200000, PROT_READ|PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0);
                    474:     ROMmemory = mmap (address_space + TOSAddress, ROMmem_size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, fd, 0);
                    475: 
                    476:     close(fd);
                    477: 
                    478:     good_address_fd = open (nam = tmpnam (NULL), O_CREAT|O_RDWR, 0600);
                    479:     memset (buffer, 1, sizeof(buffer));
                    480:     write (good_address_fd, buffer, sizeof buffer);
                    481:     unlink (nam);
                    482: 
                    483:     for (i = 0; i < allocated_STmem; i += 4096)
                    484:        mmap (good_address_map + i, 4096, PROT_READ, MAP_FIXED | MAP_PRIVATE,
                    485:              good_address_fd, 0);
                    486:     for (i = 0; i < ROMmem_size; i += 4096)
                    487:        mmap (good_address_map + i + 0x1000000 - ROMmem_size, 4096, PROT_READ,
                    488:              MAP_FIXED | MAP_PRIVATE, good_address_fd, 0);
                    489: #else
                    490:     ROMmemory = STRam+TOSAddress;  /*(uae_u8 *)malloc (ROMmem_size)*/;
                    491:     STmemory = STRam; /*(uae_u8 *)malloc (allocated_STmem);*/
                    492: /*
                    493:     while (! STmemory && allocated_STmem > 512*1024) {
                    494:        allocated_STmem >>= 1;
                    495:        STmemory = (uae_u8 *)malloc (allocated_STmem);
                    496:        if (STmemory)
                    497:            fprintf (stderr, "Reducing STmem size to %dkb\n", allocated_STmem >> 10);
                    498:     }
                    499:     if (! STmemory) {
                    500:        write_log ("virtual memory exhausted (STmemory)!\n");
                    501:        abort ();
                    502:     }
                    503: */
                    504: #endif
                    505: 
                    506:     do_put_mem_long ((uae_u32 *)(STmemory), do_get_mem_long((uae_u32 *)ROMmemory));
                    507:     do_put_mem_long ((uae_u32 *)(STmemory + 4), do_get_mem_long((uae_u32 *)(ROMmemory+4)));
                    508:     init_mem_banks ();
                    509: 
                    510:     /* Map the STmem into all of the lower 16MB */
                    511:     map_banks (&STmem_bank, 0x00, 256);
                    512: /*
                    513:     custom_start = 0xC0;
                    514:     map_banks (&custom_bank, custom_start, 0xE0-custom_start);
                    515:     map_banks (&cia_bank, 0xA0, 32);
                    516:     map_banks (&clock_bank, 0xDC, 1);
                    517: */
                    518:     /* @@@ Does anyone have a clue what should be in the 0x200000 - 0xA00000
                    519:      * range on an Amiga without expansion memory?  */
                    520: /*
                    521:     custom_start = allocated_STmem >> 16;
                    522:     if (custom_start < 0x20)
                    523:        custom_start = 0x20;
                    524:     map_banks (&dummy_bank, custom_start, 0xA0 - custom_start);
                    525: */
                    526:     /*map_banks (&TTram_bank, 0xDE, 1);*/
                    527: 
                    528:     if (allocated_TTmem > 0)
                    529:        TTmemory = (uae_u8 *)malloc (allocated_TTmem);
                    530:     if (TTmemory != 0)
                    531:        map_banks (&TTmem_bank, TTmem_start >> 16, allocated_TTmem >> 16);
                    532:     else
                    533:        allocated_TTmem = 0;
                    534: 
                    535:     map_banks(&ROMmem_bank, ROMmem_start >> 16, ROMmem_size/65536);
                    536: /*    map_banks(&ROMmem_bank, 0xFFFC, 4);*/
                    537: 
                    538:     map_banks(&IOmem_bank, IOmem_start>>16, 1);
                    539: 
                    540:     STmem_mask = 0x00ffffff /*allocated_STmem- 1*/;
                    541:     ROMmem_mask = 0x00ffffff /*ROMmem_size - 1*/;
                    542:     TTmem_mask = allocated_TTmem - 1;
                    543:     IOmem_mask = IOmem_size - 1;
                    544: }
                    545: 
                    546: void map_banks (addrbank *bank, int start, int size)
                    547: {
                    548:     int bnr;
                    549:     unsigned long int hioffs = 0, endhioffs = 0x100;
                    550: 
                    551:     if (start >= 0x100) {
                    552:        for (bnr = start; bnr < start + size; bnr++)
                    553:            put_mem_bank (bnr << 16, bank);
                    554:        return;
                    555:     }
                    556:     /* Some ROMs apparently require a 24 bit address space... */
                    557:     if (address_space_24)
                    558:        endhioffs = 0x10000;
                    559:     for (hioffs = 0; hioffs < endhioffs; hioffs += 0x100)
                    560:        for (bnr = start; bnr < start+size; bnr++)
                    561:            put_mem_bank ((bnr + hioffs) << 16, bank);
                    562: }

unix.superglobalmegacorp.com

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