Annotation of 43BSDReno/contrib/emacs-18.55/gdb/m-pn.h, revision 1.1.1.1

1.1       root        1: /* Parameters for execution on a Gould PN, for GDB, the GNU debugger.
                      2:    Copyright (C) 1986, 1987 Free Software Foundation, Inc.
                      3: 
                      4: GDB is distributed in the hope that it will be useful, but WITHOUT ANY
                      5: WARRANTY.  No author or distributor accepts responsibility to anyone
                      6: for the consequences of using it or for whether it serves any
                      7: particular purpose or works at all, unless he says so in writing.
                      8: Refer to the GDB General Public License for full details.
                      9: 
                     10: Everyone is granted permission to copy, modify and redistribute GDB,
                     11: but only under the conditions described in the GDB General Public
                     12: License.  A copy of this license is supposed to have been given to you
                     13: along with GDB so you can know your rights and responsibilities.  It
                     14: should be in a file named COPYING.  Among other things, the copyright
                     15: notice and this notice must be preserved on all copies.
                     16: 
                     17: In other words, go ahead and share GDB, but don't try to stop
                     18: anyone else from sharing it farther.  Help stamp out software hoarding! */
                     19: 
                     20: /* Read file headers properly in core.c */
                     21: #define gould
                     22: 
                     23: /* Macro for text-offset and data info (in PN a.out format).  */
                     24: #define        TEXTINFO                                                \
                     25:        text_offset = N_TXTOFF (exec_coffhdr);                  \
                     26:        exec_data_offset = N_TXTOFF (exec_coffhdr)              \
                     27:                + exec_aouthdr.a_text
                     28: 
                     29: /* Macro for number of symbol table entries */
                     30: #define END_OF_TEXT_DEFAULT                                    \
                     31:        (0xffffff)
                     32: 
                     33: /* Macro for number of symbol table entries */
                     34: #define NUMBER_OF_SYMBOLS                                      \
                     35:        (coffhdr.f_nsyms)
                     36: 
                     37: /* Macro for file-offset of symbol table (in usual a.out format).  */
                     38: #define SYMBOL_TABLE_OFFSET                                    \
                     39:        N_SYMOFF (coffhdr)
                     40: 
                     41: /* Macro for file-offset of string table (in usual a.out format).  */
                     42: #define STRING_TABLE_OFFSET                                    \
                     43:        (N_STROFF (coffhdr) + sizeof(int))
                     44: 
                     45: /* Macro to store the length of the string table data in INTO.  */
                     46: #define READ_STRING_TABLE_SIZE(INTO)                           \
                     47:        { INTO = hdr.a_stsize; }
                     48: 
                     49: /* Macro to declare variables to hold the file's header data.  */
                     50: #define DECLARE_FILE_HEADERS  struct old_exec hdr;             \
                     51:                              FILHDR coffhdr
                     52: 
                     53: /* Macro to read the header data from descriptor DESC and validate it.
                     54:    NAME is the file name, for error messages.  */
                     55: #define READ_FILE_HEADERS(DESC, NAME)                          \
                     56: { val = myread (DESC, &coffhdr, sizeof coffhdr);               \
                     57:   if (val < 0)                                                 \
                     58:     perror_with_name (NAME);                                   \
                     59:   val = myread (DESC, &hdr, sizeof hdr);                       \
                     60:   if (val < 0)                                                 \
                     61:     perror_with_name (NAME);                                   \
                     62:   if (coffhdr.f_magic != GNP1MAGIC)                            \
                     63:     error ("File \"%s\" not in coff executable format.", NAME);        \
                     64:   if (N_BADMAG (hdr))                                          \
                     65:     error ("File \"%s\" not in executable format.", NAME); }
                     66: 
                     67: /* Define COFF and other symbolic names needed on NP1 */
                     68: #define        NS32GMAGIC      GDPMAGIC
                     69: #define        NS32SMAGIC      PN_MAGIC
                     70: #define vprintf                printf
                     71: 
                     72: /* Get rid of any system-imposed stack limit if possible.  */
                     73: #define SET_STACK_LIMIT_HUGE
                     74: 
                     75: /* Define this if the C compiler puts an underscore at the front
                     76:    of external names before giving them to the linker.  */
                     77: #define NAMES_HAVE_UNDERSCORE
                     78: 
                     79: /* Debugger information will be in DBX format.  */
                     80: #define READ_DBX_FORMAT
                     81: 
                     82: /* Offset from address of function to start of its code.
                     83:    Zero on most machines.  */
                     84: #define FUNCTION_START_OFFSET  4
                     85: 
                     86: /* Advance PC across any function entry prologue instructions
                     87:    to reach some "real" code.  One PN we can have one or two startup
                     88:    sequences depending on the size of the local stack:
                     89: 
                     90:    Either:
                     91:       "suabr b2, #"
                     92:    of
                     93:       "lil r4, #", "suabr b2, #(r4)"
                     94: 
                     95:    "lwbr b6, #", "stw r1, 8(b2)"
                     96:    Optional "stwbr b3, c(b2)"
                     97:    Optional "trr r2,r7"      (Gould first argument register passing)
                     98:      or
                     99:    Optional "stw r2,8(b3)"   (Gould first argument register passing)
                    100:  */
                    101: #define SKIP_PROLOGUE(pc) {                                            \
                    102:        register int op = read_memory_integer ((pc), 4);                \
                    103:        if ((op & 0xffff0000) == 0x580B0000) {                          \
                    104:            pc += 4;                                                    \
                    105:            op = read_memory_integer ((pc), 4);                         \
                    106:            if ((op & 0xffff0000) == 0x59400000) {                      \
                    107:                pc += 4;                                                \
                    108:                op = read_memory_integer ((pc), 4);                     \
                    109:                if ((op & 0xffff0000) == 0x5F000000) {                  \
                    110:                    pc += 4;                                            \
                    111:                    op = read_memory_integer ((pc), 4);                 \
                    112:                    if (op == 0xD4820008) {                             \
                    113:                        pc += 4;                                        \
                    114:                        op = read_memory_integer ((pc), 4);             \
                    115:                        if (op == 0x5582000C) {                         \
                    116:                            pc += 4;                                    \
                    117:                            op = read_memory_integer ((pc), 2);         \
                    118:                            if (op == 0x2fa0) {                         \
                    119:                                pc += 2;                                \
                    120:                            } else {                                    \
                    121:                                op = read_memory_integer ((pc), 4);     \
                    122:                                if (op == 0xd5030008) {                 \
                    123:                                    pc += 4;                            \
                    124:                                }                                       \
                    125:                            }                                           \
                    126:                        } else {                                        \
                    127:                            op = read_memory_integer ((pc), 2);         \
                    128:                            if (op == 0x2fa0) {                         \
                    129:                                pc += 2;                                \
                    130:                            }                                           \
                    131:                        }                                               \
                    132:                    }                                                   \
                    133:                }                                                       \
                    134:            }                                                           \
                    135:        }                                                               \
                    136:        if ((op & 0xffff0000) == 0x59000000) {                          \
                    137:            pc += 4;                                                    \
                    138:            op = read_memory_integer ((pc), 4);                         \
                    139:            if ((op & 0xffff0000) == 0x5F000000) {                      \
                    140:                pc += 4;                                                \
                    141:                op = read_memory_integer ((pc), 4);                     \
                    142:                if (op == 0xD4820008) {                                 \
                    143:                    pc += 4;                                            \
                    144:                    op = read_memory_integer ((pc), 4);                 \
                    145:                    if (op == 0x5582000C) {                             \
                    146:                        pc += 4;                                        \
                    147:                        op = read_memory_integer ((pc), 2);             \
                    148:                        if (op == 0x2fa0) {                             \
                    149:                            pc += 2;                                    \
                    150:                        } else {                                        \
                    151:                            op = read_memory_integer ((pc), 4);         \
                    152:                            if (op == 0xd5030008) {                     \
                    153:                                pc += 4;                                \
                    154:                            }                                           \
                    155:                        }                                               \
                    156:                    } else {                                            \
                    157:                        op = read_memory_integer ((pc), 2);             \
                    158:                        if (op == 0x2fa0) {                             \
                    159:                            pc += 2;                                    \
                    160:                        }                                               \
                    161:                    }                                                   \
                    162:                }                                                       \
                    163:            }                                                           \
                    164:        }                                                               \
                    165: }
                    166: 
                    167: /* Immediately after a function call, return the saved pc.
                    168:    Can't go through the frames for this because on some machines
                    169:    the new frame is not set up until the new function executes
                    170:    some instructions.  True on PN!  Return address is in R1.
                    171:    Note: true return location is 4 bytes past R1! */
                    172: #define SAVED_PC_AFTER_CALL(frame) \
                    173:        (read_register(R1_REGNUM) + 4)
                    174: 
                    175: /* Address of U in kernel space */
                    176: #define        KERNEL_U_ADDR           0x3fc000
                    177: 
                    178: /* Address of end of stack space.  */
                    179: #define STACK_END_ADDR                 0x480000
                    180: 
                    181: /* Stack grows downward.  */
                    182: #define INNER_THAN             <
                    183: 
                    184: /* Sequence of bytes for breakpoint instruction.  */
                    185: #define BREAKPOINT             {0x28, 0x09}
                    186: 
                    187: /* Amount PC must be decremented by after a breakpoint.
                    188:    This is often the number of bytes in BREAKPOINT
                    189:    but not always.  */
                    190: #define DECR_PC_AFTER_BREAK    2
                    191: 
                    192: /* Nonzero if instruction at PC is a return instruction. "bu 4(r1)" */
                    193: #define ABOUT_TO_RETURN(pc)    (read_memory_integer (pc, 4) == 0xEC100004)
                    194: 
                    195: /* Return 1 if P points to an invalid floating point value.  */
                    196: #define INVALID_FLOAT(p, len)  ((*(short *)p & 0xff80) == 0x8000)
                    197: 
                    198: /* Say how long (ordinary) registers are.  */
                    199: #define REGISTER_TYPE          long
                    200: 
                    201: /* Number of machine registers */
                    202: #define NUM_REGS               19
                    203: #define NUM_GEN_REGS           16
                    204: #define NUM_CPU_REGS           3
                    205: 
                    206: /* Initializer for an array of names of registers.
                    207:    There should be NUM_REGS strings in this initializer.  */
                    208: #define REGISTER_NAMES { \
                    209:   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
                    210:   "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7", \
                    211:   "sp", "ps", "pc", \
                    212: }
                    213: 
                    214: /* Register numbers of various important registers.
                    215:    Note that some of these values are "real" register numbers,
                    216:    and correspond to the general registers of the machine,
                    217:    and some are "phony" register numbers which are too large
                    218:    to be actual register numbers as far as the user is concerned
                    219:    but do serve to get the desired values when passed to read_register.  */
                    220: #define R1_REGNUM      1       /* Gr1 => return address of caller */
                    221: #define R4_REGNUM      4       /* Gr4 => register save area */
                    222: #define R5_REGNUM      5       /* Gr5 => register save area */
                    223: #define R6_REGNUM      6       /* Gr6 => register save area */
                    224: #define R7_REGNUM      7       /* Gr7 => register save area */
                    225: #define B1_REGNUM      9       /* Br1 => start of this code routine */
                    226: #define FP_REGNUM      10      /* Br2 == (sp) */
                    227: #define AP_REGNUM      11      /* Br3 == (ap) */
                    228: #define SP_REGNUM      16      /* A copy of Br2 saved in trap */
                    229: #define PS_REGNUM      17      /* Contains processor status */
                    230: #define PC_REGNUM      18      /* Contains program counter */
                    231: 
                    232: /* This is a piece of magic that is given a register number REGNO
                    233:    and as BLOCKEND the address in the system of the end of the user structure
                    234:    and stores in ADDR the address in the kernel or core dump
                    235:    of that register. */
                    236: #define REGISTER_U_ADDR(addr, blockend, regno) {                       \
                    237:        addr = blockend + regno * 4;                                    \
                    238:        if (regno == PC_REGNUM) addr = blockend - 8 * 4;                \
                    239:        if (regno == PS_REGNUM) addr = blockend - 7 * 4;                \
                    240:        if (regno == SP_REGNUM) addr = blockend - 6 * 4;                \
                    241: }
                    242: 
                    243: /* Total amount of space needed to store our copies of the machine's
                    244:    register state, the array `registers'.  */
                    245: #define REGISTER_BYTES                 (NUM_GEN_REGS*4 + NUM_CPU_REGS*4)
                    246: 
                    247: /* Index within `registers' of the first byte of the space for
                    248:    register N.  */
                    249: #define REGISTER_BYTE(N)               ((N) * 4)
                    250: 
                    251: /* Number of bytes of storage in the actual machine representation
                    252:    for register N.  On the PN, all normal regs are 4 bytes. */
                    253: #define REGISTER_RAW_SIZE(N)           (4)
                    254: 
                    255: /* Number of bytes of storage in the program's representation
                    256:    for register N.  On the PN, all regs are 4 bytes. */
                    257: #define REGISTER_VIRTUAL_SIZE(N)       (4)
                    258: 
                    259: /* Largest value REGISTER_RAW_SIZE can have.  */
                    260: #define MAX_REGISTER_RAW_SIZE          (4)
                    261: 
                    262: /* Largest value REGISTER_VIRTUAL_SIZE can have.  */
                    263: #define MAX_REGISTER_VIRTUAL_SIZE      (4)
                    264: 
                    265: /* Nonzero if register N requires conversion
                    266:    from raw format to virtual format.  */
                    267: #define REGISTER_CONVERTIBLE(N)                (0)
                    268: 
                    269: /* Convert data from raw format for register REGNUM
                    270:    to virtual format for register REGNUM.  */
                    271: #define REGISTER_CONVERT_TO_VIRTUAL(REGNUM,FROM,TO)    \
                    272:        bcopy ((FROM), (TO), REGISTER_RAW_SIZE(REGNUM));
                    273: 
                    274: /* Convert data from virtual format for register REGNUM
                    275:    to raw format for register REGNUM.  */
                    276: #define REGISTER_CONVERT_TO_RAW(REGNUM,FROM,TO)        \
                    277:        bcopy ((FROM), (TO), REGISTER_VIRTUAL_SIZE(REGNUM));
                    278: 
                    279: /* Return the GDB type object for the "standard" data type
                    280:    of data in register N.  */
                    281: #define REGISTER_VIRTUAL_TYPE(N)       (builtin_type_int)
                    282: 
                    283: /* Extract from an arrary REGBUF containing the (raw) register state
                    284:    a function return value of type TYPE, and copy that, in virtual format,
                    285:    into VALBUF. */
                    286: 
                    287: #define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
                    288:        bcopy (REGBUF, VALBUF, TYPE_LENGTH (TYPE))
                    289: 
                    290: /* Write into appropriate registers a function return value
                    291:    of type TYPE, given in virtual format.  */
                    292: 
                    293: #define STORE_RETURN_VALUE(TYPE,VALBUF) \
                    294:        write_register_bytes (0, VALBUF, TYPE_LENGTH (TYPE))
                    295: 
                    296: /* Extract from an array REGBUF containing the (raw) register state
                    297:    the address in which a function should return its structure value,
                    298:    as a CORE_ADDR (or an expression that can be used as one).  */
                    299: 
                    300: #define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) (*(int *)(REGBUF))
                    301: 
                    302: 
                    303: /* Describe the pointer in each stack frame to the previous stack frame
                    304:    (its caller).  */
                    305: 
                    306: /* FRAME_CHAIN takes a frame's nominal address
                    307:    and produces the frame's chain-pointer.
                    308: 
                    309:    FRAME_CHAIN_COMBINE takes the chain pointer and the frame's nominal address
                    310:    and produces the nominal address of the caller frame.
                    311: 
                    312:    However, if FRAME_CHAIN_VALID returns zero,
                    313:    it means the given frame is the outermost one and has no caller.
                    314:    In that case, FRAME_CHAIN_COMBINE is not used.  */
                    315: 
                    316: /* In the case of the NPL, the frame's norminal address is Br2 and the 
                    317:    previous routines frame is up the stack X bytes, where X is the
                    318:    value stored in the code function header xA(Br1). */
                    319: #define FRAME_CHAIN(thisframe)         (findframe(thisframe))
                    320: 
                    321: #define FRAME_CHAIN_VALID(chain, thisframe) \
                    322:         (chain != 0 && chain != thisframe)
                    323: 
                    324: #define FRAME_CHAIN_COMBINE(chain, thisframe) \
                    325:        (chain)
                    326: 
                    327: /* Define other aspects of the stack frame on NPL.  */
                    328: #define FRAME_SAVED_PC(frame) \
                    329:        (read_memory_integer (frame + 8, 4))
                    330: 
                    331: #define FRAME_ARGS_ADDRESS(fi) \
                    332:        ((fi).next_frame ? \
                    333:         read_memory_integer ((fi).frame + 12, 4) : \
                    334:         read_register (AP_REGNUM))
                    335: 
                    336: #define FRAME_LOCALS_ADDRESS(fi)       ((fi).frame + 80)
                    337: 
                    338: /* Set VAL to the number of args passed to frame described by FI.
                    339:    Can set VAL to -1, meaning no way to tell.  */
                    340: 
                    341: /* We can check the stab info to see how
                    342:    many arg we have.  No info in stack will tell us */
                    343: #define FRAME_NUM_ARGS(val,fi)         (val = findarg(fi))
                    344: 
                    345: /* Return number of bytes at start of arglist that are not really args.  */
                    346: #define FRAME_ARGS_SKIP                        8
                    347: 
                    348: /* Put here the code to store, into a struct frame_saved_regs,
                    349:    the addresses of the saved registers of frame described by FRAME_INFO.
                    350:    This includes special registers such as pc and fp saved in special
                    351:    ways in the stack frame.  sp is even more special:
                    352:    the address we return for it IS the sp for the next frame.  */
                    353: 
                    354: #define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs)            \
                    355: {                                                                       \
                    356:   bzero (&frame_saved_regs, sizeof frame_saved_regs);                  \
                    357:   (frame_saved_regs).regs[PC_REGNUM] = (frame_info).frame + 8;         \
                    358:   (frame_saved_regs).regs[R4_REGNUM] = (frame_info).frame + 0x30;      \
                    359:   (frame_saved_regs).regs[R5_REGNUM] = (frame_info).frame + 0x34;      \
                    360:   (frame_saved_regs).regs[R6_REGNUM] = (frame_info).frame + 0x38;      \
                    361:   (frame_saved_regs).regs[R7_REGNUM] = (frame_info).frame + 0x3C;      \
                    362: }
                    363: 
                    364: /* Things needed for making the inferior call functions.  */
                    365: 
                    366: /* Push an empty stack frame, to record the current PC, etc.  */
                    367: 
                    368: #define PUSH_DUMMY_FRAME \
                    369: { register CORE_ADDR sp = read_register (SP_REGNUM);                   \
                    370:   register int regnum;                                                 \
                    371:   sp = push_word (sp, read_register (PC_REGNUM));                      \
                    372:   sp = push_word (sp, read_register (FP_REGNUM));                      \
                    373:   write_register (FP_REGNUM, sp);                                      \
                    374:   for (regnum = FP_REGNUM - 1; regnum >= 0; regnum--)                  \
                    375:     sp = push_word (sp, read_register (regnum));                       \
                    376:   sp = push_word (sp, read_register (PS_REGNUM));                      \
                    377:   write_register (SP_REGNUM, sp);  }
                    378: 
                    379: /* Discard from the stack the innermost frame, 
                    380:    restoring all saved registers.  */
                    381: 
                    382: #define POP_FRAME  \
                    383: { register CORE_ADDR fp = read_register (FP_REGNUM);            \
                    384:   register int regnum;                                          \
                    385:   struct frame_saved_regs fsr;                                  \
                    386:   struct frame_info fi;                                                 \
                    387:   fi = get_frame_info (fp);                                     \
                    388:   get_frame_saved_regs (&fi, &fsr);                             \
                    389:   for (regnum = FP_REGNUM - 1; regnum >= 0; regnum--)           \
                    390:     if (fsr.regs[regnum])                                       \
                    391:       write_register (regnum, read_memory_integer (fsr.regs[regnum], 4)); \
                    392:   if (fsr.regs[PS_REGNUM])                                      \
                    393:     write_register (PS_REGNUM, read_memory_integer (fsr.regs[PS_REGNUM], 4)); \
                    394:   write_register (FP_REGNUM, read_memory_integer (fp, 4));      \
                    395:   write_register (PC_REGNUM, read_memory_integer (fp + 4, 4));   \
                    396:   write_register (SP_REGNUM, fp + 8);                           \
                    397:   set_current_frame (read_register (FP_REGNUM)); }
                    398: 
                    399: /* This sequence of words is the instructions:
                    400:      halt
                    401:      halt
                    402:      halt
                    403:      halt
                    404:      suabr     b2, #<stacksize>
                    405:      lwbr      b6, #con
                    406:      stw       r1, 8(b2)       - save caller address, do we care?
                    407:      lw                r2, 60(b2)      - arg1
                    408:      labr      b3, 50(b2)
                    409:      std       r4, 30(b2)      - save r4-r7
                    410:      std       r6, 38(b2)
                    411:      lwbr      b1, #<func>     - load function call address
                    412:      brlnk     r1, 8(b1)       - call function
                    413:      halt
                    414:      halt
                    415:      ld                r4, 30(b2)      - restore r4-r7
                    416:      ld                r6, 38(b2)
                    417: 
                    418:    Setup our stack frame, load argumemts, call and then restore registers.
                    419: */
                    420: 
                    421: #define CALL_DUMMY {0xf227e0ff, 0x48e7fffc, 0x426742e7, 0x4eb93232, 0x3232dffc, 0x69696969, 0x4e4f4e71}
                    422: 
                    423: #define CALL_DUMMY_LENGTH 28
                    424: 
                    425: #define CALL_DUMMY_START_OFFSET 12
                    426: 
                    427: /* Insert the specified number of args and function address
                    428:    into a call sequence of the above form stored at DUMMYNAME.  */
                    429: 
                    430: #define FIX_CALL_DUMMY(dummyname, fun, nargs)     \
                    431: { *(int *)((char *) dummyname + 20) = nargs * 4;  \
                    432:   *(int *)((char *) dummyname + 14) = fun; }
                    433: 
                    434: /*
                    435:  * No KDB support, Yet! */
                    436: /* Interface definitions for kernel debugger KDB.  */
                    437: 
                    438: /* Map machine fault codes into signal numbers.
                    439:    First subtract 0, divide by 4, then index in a table.
                    440:    Faults for which the entry in this table is 0
                    441:    are not handled by KDB; the program's own trap handler
                    442:    gets to handle then.  */
                    443: 
                    444: #define FAULT_CODE_ORIGIN 0
                    445: #define FAULT_CODE_UNITS 4
                    446: #define FAULT_TABLE    \
                    447: { 0, 0, 0, 0, SIGTRAP, 0, 0, 0, \
                    448:   0, SIGTRAP, 0, 0, 0, 0, 0, SIGKILL, \
                    449:   0, 0, 0, 0, 0, 0, 0, 0, \
                    450:   SIGILL }
                    451: 
                    452: /* Start running with a stack stretching from BEG to END.
                    453:    BEG and END should be symbols meaningful to the assembler.
                    454:    This is used only for kdb.  */
                    455: 
                    456: #define INIT_STACK(beg, end)  \
                    457: { asm (".globl end");         \
                    458:   asm ("movel $ end, sp");      \
                    459:   asm ("clrl fp"); }
                    460: 
                    461: /* Push the frame pointer register on the stack.  */
                    462: #define PUSH_FRAME_PTR        \
                    463:   asm ("movel fp, -(sp)");
                    464: 
                    465: /* Copy the top-of-stack to the frame pointer register.  */
                    466: #define POP_FRAME_PTR  \
                    467:   asm ("movl (sp), fp");
                    468: 
                    469: /* After KDB is entered by a fault, push all registers
                    470:    that GDB thinks about (all NUM_REGS of them),
                    471:    so that they appear in order of ascending GDB register number.
                    472:    The fault code will be on the stack beyond the last register.  */
                    473: 
                    474: #define PUSH_REGISTERS        \
                    475: { asm ("clrw -(sp)");        \
                    476:   asm ("pea 10(sp)");        \
                    477:   asm ("movem $ 0xfffe,-(sp)"); }
                    478: 
                    479: /* Assuming the registers (including processor status) have been
                    480:    pushed on the stack in order of ascending GDB register number,
                    481:    restore them and return to the address in the saved PC register.  */
                    482: 
                    483: #define POP_REGISTERS          \
                    484: { asm ("subil $8,28(sp)");     \
                    485:   asm ("movem (sp),$ 0xffff"); \
                    486:   asm ("rte"); }

unix.superglobalmegacorp.com

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