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

1.1       root        1: /*
                      2:  * UAE - The U*nix Amiga Emulator
                      3:  * 
                      4:  * UAE Library v0.1
                      5:  * 
                      6:  * (c) 1996 Tauno Taipaleenmaki <[email protected]>
                      7:  *
                      8:  * Change UAE parameters and other stuff from inside the emulation. Creates
                      9:  * a library called "uae.library" before the boot-up. To check if emulation
                     10:  * is running we simply try to open the library. 
                     11:  * 
                     12:  * NOTE: The VERY FIRST attempt to open the library will actually create
                     13:  *       it, so you should always try to open it twice.
                     14:  * 
                     15:  * Functions:            Offset  Purpose                      Arguments
                     16:  * ----------
                     17:  * D0 = GetVersion()      -0x1E Returns UAE version               -
                     18:  * D0 = GetUaeConfig(A0)  -0x24 Get UAE Configuration       Pointer to memory
                     19:  *                                                          block with the size
                     20:  *                                                          of sizeof(UaeCfg)
                     21:  *!D0 = SetUaeConfig(A0)  -0x2A Sets UAE Configuration      Pointer to struct
                     22:  *                                                          UAE_CONFIG
                     23:  *!D0 = HardReset()       -0x30 Resets the Amiga                  - 
                     24:  *!D0 = Reset()           -0x36  -- "" --                         -
                     25:  * D0 = EjectDisk(D0)     -0x3C Ejects a disk               D0 = Drive Number
                     26:  * D0 = InsertDisk(A0,D0) -0x42 Inserts a disk              D0 = drive number,
                     27:  *                                                          A0 = ptr to name
                     28:  * D0 = EnableSound()     -0x48 Enables SOUND (if it was          -
                     29:  *                              compiled in)      
                     30:  * D0 = DisableSound()    -0x4E Disables SOUND                    -
                     31:  * D0 = EnableJoystick()  -0x54 Enables FAKE_JOYSTICK             -
                     32:  * D0 = DisableJoystick() -0x5A Disables FAKE_JOYSTICK            -
                     33:  * D0 = SetFrameRate(D0)  -0x60 Changes frame rate          D0 = Framerate
                     34:  *!D0 = ChgCMemSize(D0)   -0x66 Changes ChipMemSize         D0 = New Mem Size
                     35:  *                              (DOES A HARD RESET!)
                     36:  *!D0 = ChgSMemSize(D0)   -0x6C Changes SlowMemSize         D0 = New Mem Size
                     37:  *                              (DOES A HARD RESET!)
                     38:  *!D0 = ChgFMemSize(D0)   -0x72 Changes FastmemSize         D0 = New Mem Size
                     39:  *                              (DOES A HARD RESET!)
                     40:  * D0 = ChangeLanguage(D0)-0x78 Changes kbd lang.           D0 = Language 
                     41:  * D0 = ExitEmu()         -0x7E Exits the emulator                -
                     42:  * D0 = GetDisk(D0,A0)    -0x84 Gets the disks name         D0 = Drive
                     43:  *                                                          A0 = Space for name
                     44:  * D0 = Debug()           -0x8A Enters internal debugger          -
                     45:  * ! means not implemented yet 
                     46:  */
                     47: 
                     48: #include "sysconfig.h"
                     49: #include "sysdeps.h"
                     50: 
                     51: #include <assert.h>
                     52: #include <string.h>
                     53: 
                     54: #include "config.h"
                     55: #include "options.h"
1.1.1.2 ! root       56: 
1.1       root       57: #include "memory.h"
                     58: #include "custom.h"
1.1.1.2 ! root       59: #include "readcpu.h"
1.1       root       60: #include "newcpu.h"
                     61: #include "xwin.h"
                     62: #include "autoconf.h"
                     63: #include "disk.h"
                     64: #include "os.h"
                     65: 
                     66: extern int quit_program;
                     67: 
                     68: static ULONG LibBase;
                     69: 
                     70: static ULONG opencount=0;
                     71: static ULONG emulibname, functable,resname,resid, datatable;
                     72: static CPTR GetVersion,HardReset,Reset,EnableSound,DisableSound,
                     73:             EnableJoystick,DisableJoystick,SetFrameRate,ChangeLanguage,
                     74:             ChgCMemSize,ChgSMemSize,ChgFMemSize,EjectDisk,InsertDisk,
                     75:             ExitEmu, GetUaeConfig, SetUaeConfig,Open,Close,Expunge,Null,
                     76:             GetDisk,FakeInit,segList,DebugFunc;
                     77: 
                     78: /*
                     79:  * Library "open"
                     80:  */
                     81: static ULONG emulib_Open(void)
                     82: {
                     83:        opencount++;
                     84:        put_word( LibBase + 32, get_word( LibBase + 32) + 1 );
                     85:        return LibBase;
                     86: }
                     87: 
                     88: static ULONG emulib_Close(void)
                     89: {
                     90:        if (opencount <= 1)
                     91:         return 0;
                     92:        else {
                     93:              opencount--;
                     94:              put_word( LibBase + 32, get_word( LibBase + 32) - 1 );
                     95:              return 0;
                     96:        }
                     97: }
                     98: static ULONG emulib_Expunge(void)
                     99: {
                    100:        return 0;
                    101: }
                    102: 
                    103: static ULONG emulib_Null(void)
                    104: {
                    105:        return 0;
                    106: }
                    107: 
                    108: /*
                    109:  * Returns UAE Version
                    110:  */
                    111: static ULONG emulib_GetVersion(void)
                    112: {
                    113:        return version;
                    114: }
                    115: 
                    116: /*
                    117:  * Resets your amiga
                    118:  * 
                    119:  * DOES NOT WORK YET ! It obviously crashes when this routine returns().. ?
                    120:  */
                    121: static ULONG emulib_HardReset(void)
                    122: {
                    123:        m68k_reset();
                    124:        return 0;
                    125: }
                    126: 
                    127: static ULONG emulib_Reset(void)
                    128: {
                    129:        m68k_reset();
                    130:        return 0;
                    131: }
                    132: 
                    133: /*
                    134:  * Enables SOUND
                    135:  */
                    136: static ULONG emulib_EnableSound(void)
                    137: {
                    138:     if (!sound_available || produce_sound == 2)
                    139:        return 0;
                    140: 
                    141:     produce_sound = 2;
                    142:     return 1;
                    143: }
                    144: 
                    145: /*
                    146:  * Disables SOUND
                    147:  */
                    148: static ULONG emulib_DisableSound(void)
                    149: {
                    150:     produce_sound = 1;
                    151:     return 1;
                    152: }
                    153: 
                    154: /*
                    155:  * Enables FAKE JOYSTICK
                    156:  */
                    157: static ULONG emulib_EnableJoystick(void)
                    158: {
                    159:     fake_joystick = 1;
                    160:     return 1;
                    161: }
                    162: 
                    163: /*
                    164:  * Disables FAKE JOYSTICK
                    165:  */
                    166: static ULONG emulib_DisableJoystick(void)
                    167: {
                    168:        fake_joystick = 0;
                    169:        return 1;
                    170: }
                    171: 
                    172: /*
                    173:  * Sets the framerate
                    174:  */
                    175: static ULONG emulib_SetFrameRate(void)
                    176: {
1.1.1.2 ! root      177:     if (m68k_dreg(regs, 0) == 0)
1.1       root      178:        return 0;
1.1.1.2 ! root      179:     else if (m68k_dreg(regs, 0) > 20)
1.1       root      180:        return 0;
                    181:     else {
1.1.1.2 ! root      182:        framerate = m68k_dreg(regs, 0);
1.1       root      183:        return 1;
                    184:     }
                    185: }
                    186: 
                    187: /*
                    188:  * Changes keyboard language settings
                    189:  */
                    190: static ULONG emulib_ChangeLanguage(void)
                    191: {
1.1.1.2 ! root      192:     if (m68k_dreg(regs, 0) > 5)
1.1       root      193:        return 0;
                    194:     else {
1.1.1.2 ! root      195:        switch( m68k_dreg(regs, 0) ) {
1.1       root      196:         case 0:
                    197:            keyboard_lang = KBD_LANG_US;
                    198:            break;
                    199:         case 1:
                    200:            keyboard_lang = KBD_LANG_DE;
                    201:            break;
                    202:         case 2:
                    203:            keyboard_lang = KBD_LANG_SE;
                    204:            break;
                    205:         case 3:
                    206:            keyboard_lang = KBD_LANG_FR;
                    207:            break;
                    208:         case 4:
                    209:            keyboard_lang = KBD_LANG_IT;
                    210:            break;
1.1.1.2 ! root      211:         case 5:
        !           212:            keyboard_lang = KBD_LANG_ES;
        !           213:            break;
1.1       root      214:         default:
                    215:            break;
                    216:        }
                    217:        return 1;
                    218:     }
                    219: }
                    220: 
                    221: /*
                    222:  * Changes CHIPMEMORY Size
                    223:  *  (reboots)
                    224:  * 
                    225:  * DOES NOT WORK YET !  - The m68k_reset does not work from here
                    226:  */
                    227: static ULONG emulib_ChgCMemSize(void)
                    228: {
1.1.1.2 ! root      229:     ULONG memsize = m68k_dreg(regs, 0);
1.1       root      230:        
                    231:     if (memsize != 0x80000 && memsize != 0x100000 && 
                    232:        memsize != 0x200000) {
                    233:        memsize = 0x200000;
                    234:        fprintf(stderr, "Unsupported chipmem size!\n");
                    235:     }
1.1.1.2 ! root      236:     m68k_dreg(regs, 0) = 0;
1.1       root      237:     
                    238:     chipmem_size = memsize;
                    239:     m68k_reset();
                    240:     return 1;
                    241: }
                    242: 
                    243: /*
                    244:  * Changes SLOWMEMORY Size
                    245:  *  (reboots)
                    246:  * 
                    247:  * DOES NOT WORK YET! - the m68k_reset does not work from here
                    248:  */
                    249: static ULONG emulib_ChgSMemSize(void)
                    250: {
1.1.1.2 ! root      251:        ULONG memsize = m68k_dreg(regs, 0);
1.1       root      252:        
                    253:        if (memsize != 0x80000 && memsize != 0x100000 &&
                    254:           memsize != 0x180000 && memsize != 0x1C0000) {
                    255:              memsize = 0;
                    256:              fprintf(stderr, "Unsupported bogomem size!\n");
                    257:        }
                    258:        
1.1.1.2 ! root      259:        m68k_dreg(regs, 0) = 0;
1.1       root      260:        bogomem_size = memsize;
                    261:        m68k_reset();
                    262:        return 1;
                    263: }
                    264: 
                    265: /* 
                    266:  * Changes FASTMEMORY Size
                    267:  *  (reboots)
                    268:  * 
                    269:  * DOES NOT WORK YET! - the m68k_reset() does not work from here
                    270:  */
                    271: static ULONG emulib_ChgFMemSize(void)
                    272: {
1.1.1.2 ! root      273:        ULONG memsize = m68k_dreg(regs, 0);
1.1       root      274:        
                    275:        if (memsize != 0x100000 && memsize != 0x200000 &&
                    276:           memsize != 0x400000 && memsize != 0x800000) {
                    277:              memsize = 0;
                    278:              fprintf(stderr, "Unsupported fastmem size!\n");
                    279:        }
1.1.1.2 ! root      280:        m68k_dreg(regs, 0) = 0;
1.1       root      281:        fastmem_size = memsize;
                    282:        m68k_reset();
                    283:        return 0;
                    284: }
                    285: 
                    286: /*
                    287:  * Ejects a disk
                    288:  */
                    289: static ULONG emulib_EjectDisk(void)
                    290: {
1.1.1.2 ! root      291:     ULONG drive = m68k_dreg(regs, 0);
1.1       root      292:        
                    293:     if (drive > 3)
                    294:        return 0;
                    295:     
                    296:     disk_eject( drive );
                    297:     return 1;
                    298: }
                    299: 
                    300: /*
                    301:  * Inserts a disk
                    302:  */
                    303: static ULONG emulib_InsertDisk(void)
                    304: {
                    305:     int    quit = 0,i=0,j;
                    306:     char   real_name[256];
                    307:     UBYTE  abyte;
1.1.1.2 ! root      308:     ULONG drive = m68k_dreg(regs, 0);
        !           309:     CPTR  name = m68k_areg(regs, 0);
1.1       root      310:     FILE   *file;
                    311:        
                    312:     if (drive > 3)
                    313:        return 0;
                    314: 
                    315:     if  (!disk_empty( drive )) {
                    316:        disk_eject( drive );
                    317:     }
                    318:        
                    319:     while( quit == 0 ) {
                    320:        abyte = get_byte(name + i);
                    321:        if (abyte == '\0') {
                    322:            real_name[i++] = '\0';
                    323:            quit = 1;
                    324:        } else {
                    325:            real_name[i++] = abyte;
                    326:        }
                    327:     }
                    328:     j = strlen( real_name );
                    329:     if (j <= 0 || j > 255)
                    330:        return 0;
                    331: 
                    332:     if (!(file = fopen(real_name, "r")))
                    333:        return 0;
                    334: 
                    335:     fclose(file);
                    336:     disk_insert(drive, real_name);
                    337:     return 1;
                    338: 
                    339: }
                    340: 
                    341: /*
                    342:  * Exits the emulator
                    343:  */
                    344: static ULONG emulib_ExitEmu(void)
                    345: {
                    346:        broken_in = 1;
                    347:        regs.spcflags |= SPCFLAG_BRK;
                    348:        quit_program = 1;
                    349:        return 1;
                    350: }
                    351: 
                    352: /*
                    353:  * Gets UAE Configuration
                    354:  */
                    355: static ULONG emulib_GetUaeConfig(void)
                    356: {
                    357:        int i,j;
1.1.1.2 ! root      358:        CPTR place = m68k_areg(regs, 0);
1.1       root      359: 
                    360:        put_long(place     , version);
                    361:        put_long(place +  4, chipmem_size);
                    362:        put_long(place +  8, bogomem_size);
                    363:        put_long(place + 12, fastmem_size);
                    364:        put_long(place + 16, framerate);
                    365:        put_long(place + 20, produce_sound);
                    366:        put_long(place + 24, fake_joystick);
                    367:        put_long(place + 28, keyboard_lang);
                    368:        if (disk_empty(0))
                    369:         put_byte(place + 32, 0);
                    370:        else
                    371:         put_byte(place + 32, 1);
                    372:        if (disk_empty(1))
                    373:         put_byte(place + 33, 0);
                    374:        else
                    375:         put_byte(place + 33, 1);
                    376:        if (disk_empty(2))
                    377:         put_byte(place + 34, 0);
                    378:        else
                    379:         put_byte(place + 34, 1);
                    380:        if (disk_empty(3))
                    381:         put_byte(place + 35, 0);
                    382:        else
                    383:         put_byte(place + 35, 1);
                    384:        
                    385:        for(i=0;i<256;i++) {
                    386:              put_byte((place + 36 + i), df0[i]);
                    387:              put_byte((place + 36 + i + 256), df1[i]);
                    388:              put_byte((place + 36 + i + 512), df2[i]);
                    389:              put_byte((place + 36 + i + 768), df3[i]);
                    390:        }
                    391:        return 1;
                    392: }
                    393: 
                    394: /*
                    395:  * Sets UAE Configuration
                    396:  * 
                    397:  * NOT IMPLEMENTED YET
                    398:  */
                    399: static ULONG emulib_SetUaeConfig(void)
                    400: {
                    401:        return 1;
                    402: }
                    403: 
                    404: /*
                    405:  * Gets the name of the disk in the given drive
                    406:  */
                    407: static ULONG emulib_GetDisk(void)
                    408: {
                    409:     int i;
1.1.1.2 ! root      410:     if (m68k_dreg(regs, 0) > 3) 
1.1       root      411:        return 0;
                    412: 
1.1.1.2 ! root      413:     switch( m68k_dreg(regs, 0) ) {
1.1       root      414:      case 0:
                    415:        for(i=0;i<256;i++) {
1.1.1.2 ! root      416:            put_byte( m68k_areg(regs, 0) + i, df0[i] );
1.1       root      417:        }
                    418:        break;
                    419:      case 1:
                    420:        for(i=0;i<256;i++) {
1.1.1.2 ! root      421:            put_byte( m68k_areg(regs, 0) + i, df1[i] );
1.1       root      422:        }
                    423:        break;
                    424:      case 2:
                    425:        for(i=0;i<256;i++) {
1.1.1.2 ! root      426:            put_byte( m68k_areg(regs, 0) + i, df2[i] );
1.1       root      427:        }
                    428:        break;
                    429:      case 3:
                    430:        for(i=0;i<256;i++) {
1.1.1.2 ! root      431:            put_byte( m68k_areg(regs, 0) + i, df3[i] );
1.1       root      432:        }
                    433:        break;
                    434:      default:
                    435:        break;
                    436:     }
                    437:     return 1;
                    438: }
                    439: 
                    440: /*
                    441:  * Enter debugging state
                    442:  */
                    443: static ULONG emulib_Debug(void)
                    444: {
                    445:     broken_in = 1;
                    446:     regs.spcflags |= SPCFLAG_BRK;
                    447:     return 1;
                    448: }
                    449: 
                    450: static ULONG emulib_FakeInit(void)
                    451: {
1.1.1.2 ! root      452:     segList = m68k_areg(regs, 0);
        !           453:     return m68k_dreg(regs, 0);
1.1       root      454: }
                    455: 
                    456: /*
                    457:  * Creates the UAE.library in memory
                    458:  */
                    459: static ULONG emulib_Init(void)
                    460: {
                    461:     ULONG tmp1, quit,i;
                    462:     UBYTE bitti;
                    463:     ULONG dosbase;
                    464: 
                    465:     if (LibBase != 0)
                    466:        return 0;
                    467:        
1.1.1.2 ! root      468:     m68k_areg(regs, 0) = functable;
        !           469:     m68k_areg(regs, 1) = datatable;
        !           470:     m68k_areg(regs, 2) = FakeInit;
        !           471:     m68k_dreg(regs, 0) = 1024;
        !           472:     m68k_dreg(regs, 1) = 0;
        !           473:     tmp1 = CallLib(m68k_areg(regs, 6), -0x54);
1.1       root      474:     if (tmp1 == 0) {
                    475:        fprintf(stderr, "Cannot create UAE.library! ");
                    476:        return 0;
                    477:     }
1.1.1.2 ! root      478:     m68k_areg(regs, 1) = tmp1;
        !           479:     CallLib(m68k_areg(regs, 6), -0x18c);
1.1       root      480:     LibBase = tmp1;
                    481: #if 0
1.1.1.2 ! root      482:     m68k_areg(regs, 1) = ds("dos.library");
        !           483:     m68k_dreg(regs, 0) = 0;
        !           484:     dosbase = CallLib(m68k_areg(regs, 6), -552);
1.1       root      485:     printf("%08lx\n", dosbase);
                    486: #endif
1.1.1.2 ! root      487:     m68k_dreg(regs, 0) = 1;
1.1       root      488:     return 0;
                    489: }
                    490: 
                    491: 
                    492: /*
                    493:  * Installs the UAE LIBRARY
                    494:  */
                    495: void emulib_install(void)
                    496: {
                    497:     ULONG begin, end, inittable, initroutine;
                    498:     ULONG jotain, func_place, data_place, init_place;
                    499:        
                    500:     resname = ds("uae.library");
                    501:     resid = ds("UAE library 0.1");
                    502:        
                    503:     begin = here();
                    504:     dw(0x4AFC);
                    505:     dl(begin);
                    506:     dl(0);
                    507:     dw(0x8001);
                    508:     dw(0x0988);
                    509:     dl(resname);
                    510:     dl(resid);
                    511:     dl(here() + 4);
                    512: 
                    513:     dl(1024);
                    514:     func_place = here();
                    515:     dl(0);
                    516:     data_place = here();
                    517:     dl(0);
                    518:     init_place = here();
                    519:     dl(0);
                    520:  
                    521: /* Code to set up our library */
                    522: 
                    523:     initroutine = here();
                    524:     calltrap(deftrap(emulib_Init));
                    525:     dw(RTS);
                    526:        
                    527:     /* Function table */
                    528:     Open = here();
                    529:     calltrap(deftrap(emulib_Open));
                    530:     dw(RTS);
                    531:        
                    532:     Close = here();
                    533:     calltrap(deftrap(emulib_Close));
                    534:     dw(RTS);
                    535:        
                    536:     Expunge = here();
                    537:     calltrap(deftrap(emulib_Expunge));
                    538:     dw(RTS);
                    539:        
                    540:     Null = here();
                    541:     dw(0x203c); dl(1);
                    542:     dw(RTS);
                    543: 
                    544:     GetVersion = here();
                    545:     calltrap(deftrap(emulib_GetVersion));
                    546:     dw(RTS);
                    547:        
                    548:     GetUaeConfig = here();
                    549:     calltrap(deftrap(emulib_GetUaeConfig));
                    550:     dw(RTS);
                    551:        
                    552:     SetUaeConfig = here();
                    553:     calltrap(deftrap(emulib_SetUaeConfig));
                    554:     dw(RTS);
                    555: 
                    556:     HardReset = here();
                    557:     calltrap(deftrap(emulib_HardReset));
                    558:     dw(RTS);
                    559:        
                    560:     Reset = here();
                    561:     calltrap(deftrap(emulib_Reset));
                    562:     dw(RTS);
                    563:        
                    564:     EjectDisk = here();
                    565:     calltrap(deftrap(emulib_EjectDisk));
                    566:     dw(RTS);
                    567:        
                    568:     InsertDisk = here();
                    569:     calltrap(deftrap(emulib_InsertDisk));
                    570:     dw(RTS);
                    571:        
                    572:     EnableSound = here();
                    573:     calltrap(deftrap(emulib_EnableSound));
                    574:     dw(RTS);
                    575:        
                    576:     DisableSound = here();
                    577:     calltrap(deftrap(emulib_DisableSound));
                    578:     dw(RTS);
                    579:        
                    580:     EnableJoystick = here();
                    581:     calltrap(deftrap(emulib_EnableJoystick));
                    582:     dw(RTS);
                    583: 
                    584:     DisableJoystick = here();
                    585:     calltrap(deftrap(emulib_DisableJoystick));
                    586:     dw(RTS);
                    587:        
                    588:     SetFrameRate = here();
                    589:     calltrap(deftrap(emulib_SetFrameRate));
                    590:     dw(RTS);
                    591:        
                    592:     ChgCMemSize = here();
                    593:     calltrap(deftrap(emulib_ChgCMemSize));
                    594:     dw(RTS);
                    595:        
                    596:     ChgSMemSize = here();
                    597:     calltrap(deftrap(emulib_ChgSMemSize));
                    598:     dw(RTS);
                    599:        
                    600:     ChgFMemSize = here();
                    601:     calltrap(deftrap(emulib_ChgFMemSize));
                    602:     dw(RTS);
                    603:        
                    604:     ChangeLanguage = here();
                    605:     calltrap(deftrap(emulib_ChangeLanguage));
                    606:     dw(RTS);
                    607: 
                    608:     ExitEmu = here();
                    609:     calltrap(deftrap(emulib_ExitEmu));
                    610:     dw(RTS);
                    611: 
                    612:     GetDisk = here();
                    613:     calltrap(deftrap(emulib_GetDisk));
                    614:     dw(RTS);
                    615: 
                    616:     DebugFunc = here();
                    617:     calltrap(deftrap(emulib_Debug));
                    618:     dw(RTS);
                    619:        
                    620:     FakeInit = here();
                    621:     calltrap(deftrap(emulib_FakeInit));
                    622:     dw(RTS);
                    623:        
                    624:     functable = here();
                    625:     dl(Open);
                    626:     dl(Close);
                    627:     dl(Expunge);
                    628:     dl(Null);
                    629:     dl(GetVersion);
                    630:     dl(GetUaeConfig);
                    631:     dl(SetUaeConfig);
                    632:     dl(HardReset);
                    633:     dl(Reset);
                    634:     dl(EjectDisk);
                    635:     dl(InsertDisk);
                    636:     dl(EnableSound);
                    637:     dl(DisableSound);
                    638:     dl(EnableJoystick);
                    639:     dl(DisableJoystick);
                    640:     dl(SetFrameRate);
                    641:     dl(ChgCMemSize);
                    642:     dl(ChgSMemSize);
                    643:     dl(ChgFMemSize);
                    644:     dl(ChangeLanguage);
                    645:     dl(ExitEmu);
                    646:     dl(GetDisk);
                    647:     dl(DebugFunc);
                    648:     dl(0xFFFFFFFF);
                    649: 
                    650:     datatable = here();
                    651:     dw(0xE000);
                    652:     dw(0x0008);
                    653:     dw(0x0900);
                    654:     dw(0xC000);
                    655:     dw(0x000A);
                    656:     dl(resname);
                    657:     dw(0xE000);
                    658:     dw(0x000E);
                    659:     dw(0x0600);
                    660:     dw(0xD000);
                    661:     dw(0x0014);
                    662:     dw(0x0001);
                    663:     dw(0xD000);
                    664:     dw(0x0000);
                    665:     dw(0x0000);
                    666:     dw(0xC000);
                    667:     dw(0x0018);
                    668:     dl(resid);
                    669:     dl(0x00000000);
                    670:     
                    671:     end = here();
                    672: 
                    673:     org(begin + 6);           /* Load END value */
                    674:     dl(end);
                    675: 
                    676:     org(data_place);
                    677:     dl(datatable);
                    678:        
                    679:     org(func_place);
                    680:     dl(functable);
                    681: 
                    682:     org(init_place);
                    683:     dl(initroutine);
                    684:        
                    685:     org(end);
                    686: }

unix.superglobalmegacorp.com

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