Annotation of previous_trunk/src/cpu/cpummu030.h, revision 1.1.1.1

1.1       root        1: #ifndef UAE_CPUMMU030_H
                      2: #define UAE_CPUMMU030_H
                      3: 
                      4: #include "mmu_common.h"
                      5: 
                      6: extern uae_u64 srp_030, crp_030;
                      7: extern uae_u32 tt0_030, tt1_030, tc_030;
                      8: extern uae_u16 mmusr_030;
                      9: 
                     10: #define MAX_MMU030_ACCESS 10
                     11: extern uae_u32 mm030_stageb_address;
                     12: extern int mmu030_idx;
                     13: extern bool mmu030_retry;
                     14: extern int mmu030_opcode, mmu030_opcode_stageb;
                     15: extern int mmu030_fake_prefetch;
                     16: extern uaecptr mmu030_fake_prefetch_addr;
                     17: extern uae_u16 mmu030_state[3];
                     18: extern uae_u32 mmu030_data_buffer;
                     19: extern uae_u32 mmu030_disp_store[2];
                     20: extern uae_u32 mmu030_fmovem_store[2];
                     21: 
                     22: #define MMU030_STATEFLAG1_FMOVEM 0x2000
                     23: #define MMU030_STATEFLAG1_MOVEM1 0x4000
                     24: #define MMU030_STATEFLAG1_MOVEM2 0x8000
                     25: #define MMU030_STATEFLAG1_DISP0 0x0001
                     26: #define MMU030_STATEFLAG1_DISP1 0x0002
                     27: 
                     28: struct mmu030_access
                     29: {
                     30:        bool done;
                     31:        uae_u32 val;
                     32: };
                     33: extern struct mmu030_access mmu030_ad[MAX_MMU030_ACCESS];
                     34: 
                     35: uae_u32 REGPARAM3 get_disp_ea_020_mmu030 (uae_u32 base, int idx) REGPARAM;
                     36: void mmu030_page_fault(uaecptr addr, bool read, int flags, uae_u32 fc);
                     37: 
                     38: bool mmu_op30_pmove (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra);
                     39: bool mmu_op30_ptest (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra);
                     40: bool mmu_op30_pload (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra);
                     41: bool mmu_op30_pflush (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra);
                     42: 
                     43: uae_u32 mmu_op30_helper_get_fc(uae_u16 next);
                     44: 
                     45: void mmu030_ptest_atc_search(uaecptr logical_addr, uae_u32 fc, bool write);
                     46: uae_u32 mmu030_ptest_table_search(uaecptr extra, uae_u32 fc, bool write, int level);
                     47: uae_u32 mmu030_table_search(uaecptr addr, uae_u32 fc, bool write, int level);
                     48: 
                     49: 
                     50: typedef struct {
                     51:     uae_u32 addr_base;
                     52:     uae_u32 addr_mask;
                     53:     uae_u32 fc_base;
                     54:     uae_u32 fc_mask;
                     55: } TT_info;
                     56: 
                     57: TT_info mmu030_decode_tt(uae_u32 TT);
                     58: bool mmu030_decode_tc(uae_u32 TC);
                     59: bool mmu030_decode_rp(uae_u64 RP);
                     60: 
                     61: int mmu030_logical_is_in_atc(uaecptr addr, uae_u32 fc, bool write);
                     62: void mmu030_atc_handle_history_bit(int entry_num);
                     63: 
                     64: void mmu030_put_long_atc(uaecptr addr, uae_u32 val, int l, uae_u32 fc);
                     65: void mmu030_put_word_atc(uaecptr addr, uae_u16 val, int l, uae_u32 fc);
                     66: void mmu030_put_byte_atc(uaecptr addr, uae_u8 val, int l, uae_u32 fc);
                     67: uae_u32 mmu030_get_long_atc(uaecptr addr, int l, uae_u32 fc);
                     68: uae_u16 mmu030_get_word_atc(uaecptr addr, int l, uae_u32 fc);
                     69: uae_u8 mmu030_get_byte_atc(uaecptr addr, int l, uae_u32 fc);
                     70: 
                     71: void mmu030_put_atc_generic(uaecptr addr, uae_u32 val, int l, uae_u32 fc, int size, int flags);
                     72: uae_u32 mmu030_get_atc_generic(uaecptr addr, int l, uae_u32 fc, int size, int flags, bool checkwrite);
                     73: 
                     74: void mmu030_flush_atc_fc(uae_u32 fc_base, uae_u32 fc_mask);
                     75: void mmu030_flush_atc_page(uaecptr logical_addr);
                     76: void mmu030_flush_atc_page_fc(uaecptr logical_addr, uae_u32 fc_base, uae_u32 fc_mask);
                     77: void mmu030_flush_atc_all(void);
                     78: void mmu030_reset(int hardreset);
                     79: void mmu030_set_funcs(void);
                     80: uaecptr mmu030_translate(uaecptr addr, bool super, bool data, bool write);
                     81: 
                     82: int mmu030_match_ttr(uaecptr addr, uae_u32 fc, bool write);
                     83: int mmu030_match_ttr_access(uaecptr addr, uae_u32 fc, bool write);
                     84: int mmu030_match_lrmw_ttr_access(uaecptr addr, uae_u32 fc);
                     85: int mmu030_do_match_ttr(uae_u32 tt, TT_info masks, uaecptr addr, uae_u32 fc, bool write);
                     86: int mmu030_do_match_lrmw_ttr(uae_u32 tt, TT_info masks, uaecptr addr, uae_u32 fc);
                     87: 
                     88: void mmu030_put_long(uaecptr addr, uae_u32 val, uae_u32 fc);
                     89: void mmu030_put_word(uaecptr addr, uae_u16 val, uae_u32 fc);
                     90: void mmu030_put_byte(uaecptr addr, uae_u8  val, uae_u32 fc);
                     91: uae_u32 mmu030_get_long(uaecptr addr, uae_u32 fc);
                     92: uae_u16 mmu030_get_word(uaecptr addr, uae_u32 fc);
                     93: uae_u8  mmu030_get_byte(uaecptr addr, uae_u32 fc);
                     94: uae_u32 mmu030_get_ilong(uaecptr addr, uae_u32 fc);
                     95: uae_u16 mmu030_get_iword(uaecptr addr, uae_u32 fc);
                     96: 
                     97: uae_u32 uae_mmu030_get_lrmw(uaecptr addr, int size);
                     98: void uae_mmu030_put_lrmw(uaecptr addr, uae_u32 val, int size);
                     99: 
                    100: void mmu030_put_generic(uaecptr addr, uae_u32 val, uae_u32 fc, int size, int accesssize, int flags);
                    101: uae_u32 mmu030_get_generic(uaecptr addr, uae_u32 fc, int size, int accesssize, int flags);
                    102: 
                    103: extern uae_u16 REGPARAM3 mmu030_get_word_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM;
                    104: extern uae_u32 REGPARAM3 mmu030_get_long_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM;
                    105: extern uae_u32 REGPARAM3 mmu030_get_ilong_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM;
                    106: extern uae_u16 REGPARAM3 mmu030_get_lrmw_word_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM;
                    107: extern uae_u32 REGPARAM3 mmu030_get_lrmw_long_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM;
                    108: extern void REGPARAM3 mmu030_put_word_unaligned(uaecptr addr, uae_u16 val, uae_u32 fc, int flags) REGPARAM;
                    109: extern void REGPARAM3 mmu030_put_long_unaligned(uaecptr addr, uae_u32 val, uae_u32 fc, int flags) REGPARAM;
                    110: 
                    111: static ALWAYS_INLINE uae_u32 uae_mmu030_get_ilong(uaecptr addr)
                    112: {
                    113:     uae_u32 fc = (regs.s ? 4 : 0) | 2;
                    114: 
                    115:        if (unlikely(is_unaligned(addr, 4)))
                    116:                return mmu030_get_ilong_unaligned(addr, fc, 0);
                    117:        return mmu030_get_ilong(addr, fc);
                    118: }
                    119: static ALWAYS_INLINE uae_u16 uae_mmu030_get_iword(uaecptr addr)
                    120: {
                    121:     uae_u32 fc = (regs.s ? 4 : 0) | 2;
                    122:        return mmu030_get_iword(addr, fc);
                    123: }
                    124: static ALWAYS_INLINE uae_u16 uae_mmu030_get_ibyte(uaecptr addr)
                    125: {
                    126:     uae_u32 fc = (regs.s ? 4 : 0) | 2;
                    127: 
                    128:        return mmu030_get_byte(addr, fc);
                    129: }
                    130: static ALWAYS_INLINE uae_u32 uae_mmu030_get_long(uaecptr addr)
                    131: {
                    132:     uae_u32 fc = (regs.s ? 4 : 0) | 1;
                    133: 
                    134:        if (unlikely(is_unaligned(addr, 4)))
                    135:                return mmu030_get_long_unaligned(addr, fc, 0);
                    136:        return mmu030_get_long(addr, fc);
                    137: }
                    138: static ALWAYS_INLINE uae_u16 uae_mmu030_get_word(uaecptr addr)
                    139: {
                    140:     uae_u32 fc = (regs.s ? 4 : 0) | 1;
                    141: 
                    142:        if (unlikely(is_unaligned(addr, 2)))
                    143:                return mmu030_get_word_unaligned(addr, fc, 0);
                    144:        return mmu030_get_word(addr, fc);
                    145: }
                    146: static ALWAYS_INLINE uae_u8 uae_mmu030_get_byte(uaecptr addr)
                    147: {
                    148:     uae_u32 fc = (regs.s ? 4 : 0) | 1;
                    149: 
                    150:        return mmu030_get_byte(addr, fc);
                    151: }
                    152: static ALWAYS_INLINE void uae_mmu030_put_long(uaecptr addr, uae_u32 val)
                    153: {
                    154:     uae_u32 fc = (regs.s ? 4 : 0) | 1;
                    155:     
                    156:        if (unlikely(is_unaligned(addr, 4)))
                    157:                mmu030_put_long_unaligned(addr, val, fc, 0);
                    158:        else
                    159:                mmu030_put_long(addr, val, fc);
                    160: }
                    161: static ALWAYS_INLINE void uae_mmu030_put_word(uaecptr addr, uae_u16 val)
                    162: {
                    163:     uae_u32 fc = (regs.s ? 4 : 0) | 1;
                    164: 
                    165:        if (unlikely(is_unaligned(addr, 2)))
                    166:                mmu030_put_word_unaligned(addr, val, fc, 0);
                    167:        else
                    168:                mmu030_put_word(addr, val, fc);
                    169: }
                    170: static ALWAYS_INLINE void uae_mmu030_put_byte(uaecptr addr, uae_u8 val)
                    171: {
                    172:     uae_u32 fc = (regs.s ? 4 : 0) | 1;
                    173: 
                    174:        mmu030_put_byte(addr, val, fc);
                    175: }
                    176: 
                    177: static ALWAYS_INLINE uae_u32 sfc030_get_long(uaecptr addr)
                    178: {
                    179:     uae_u32 fc = regs.sfc;
                    180: #if MMUDEBUG > 2
                    181:        write_log(_T("sfc030_get_long: FC = %i\n"),fc);
                    182: #endif
                    183:        if (unlikely(is_unaligned(addr, 4)))
                    184:                return mmu030_get_long_unaligned(addr, fc, 0);
                    185:        return mmu030_get_long(addr, fc);
                    186: }
                    187: 
                    188: static ALWAYS_INLINE uae_u16 sfc030_get_word(uaecptr addr)
                    189: {
                    190:     uae_u32 fc = regs.sfc;
                    191: #if MMUDEBUG > 2
                    192:        write_log(_T("sfc030_get_word: FC = %i\n"),fc);
                    193: #endif
                    194:     if (unlikely(is_unaligned(addr, 2)))
                    195:                return mmu030_get_word_unaligned(addr, fc, 0);
                    196:        return mmu030_get_word(addr, fc);
                    197: }
                    198: 
                    199: static ALWAYS_INLINE uae_u8 sfc030_get_byte(uaecptr addr)
                    200: {
                    201:     uae_u32 fc = regs.sfc;
                    202: #if MMUDEBUG > 2
                    203:        write_log(_T("sfc030_get_byte: FC = %i\n"),fc);
                    204: #endif
                    205:        return mmu030_get_byte(addr, fc);
                    206: }
                    207: 
                    208: static ALWAYS_INLINE void dfc030_put_long(uaecptr addr, uae_u32 val)
                    209: {
                    210:     uae_u32 fc = regs.dfc;
                    211: #if MMUDEBUG > 2
                    212:        write_log(_T("dfc030_put_long: %08X = %08X FC = %i\n"), addr, val, fc);
                    213: #endif
                    214:     if (unlikely(is_unaligned(addr, 4)))
                    215:                mmu030_put_long_unaligned(addr, val, fc, 0);
                    216:        else
                    217:                mmu030_put_long(addr, val, fc);
                    218: }
                    219: 
                    220: static ALWAYS_INLINE void dfc030_put_word(uaecptr addr, uae_u16 val)
                    221: {
                    222:     uae_u32 fc = regs.dfc;
                    223: #if MMUDEBUG > 2
                    224:        write_log(_T("dfc030_put_word: %08X = %04X FC = %i\n"), addr, val, fc);
                    225: #endif
                    226:        if (unlikely(is_unaligned(addr, 2)))
                    227:                mmu030_put_word_unaligned(addr, val, fc, 0);
                    228:        else
                    229:                mmu030_put_word(addr, val, fc);
                    230: }
                    231: 
                    232: static ALWAYS_INLINE void dfc030_put_byte(uaecptr addr, uae_u8 val)
                    233: {
                    234:     uae_u32 fc = regs.dfc;
                    235: #if MMUDEBUG > 2
                    236:        write_log(_T("dfc030_put_byte: %08X = %02X FC = %i\n"), addr, val, fc);
                    237: #endif
                    238:        mmu030_put_byte(addr, val, fc);
                    239: }
                    240: 
                    241: #define ACCESS_CHECK_PUT \
                    242:        if (!mmu030_ad[mmu030_idx].done) { \
                    243:                mmu030_ad[mmu030_idx].val = v; \
                    244:        } else if (mmu030_ad[mmu030_idx].done) { \
                    245:                mmu030_idx++; \
                    246:                return; \
                    247:        }
                    248: 
                    249: #define ACCESS_CHECK_GET \
                    250:        if (mmu030_ad[mmu030_idx].done) { \
                    251:                v = mmu030_ad[mmu030_idx].val; \
                    252:                mmu030_idx++; \
                    253:                return v; \
                    254:        }
                    255: 
                    256: #define ACCESS_CHECK_GET_PC(pc) \
                    257:        if (mmu030_ad[mmu030_idx].done) { \
                    258:                v = mmu030_ad[mmu030_idx].val; \
                    259:                mmu030_idx++; \
                    260:                m68k_incpci (pc); \
                    261:                return v; \
                    262:        }
                    263: 
                    264: #define ACCESS_EXIT_PUT \
                    265:        mmu030_ad[mmu030_idx].done = true; \
                    266:        mmu030_idx++; \
                    267:        mmu030_ad[mmu030_idx].done = false;
                    268: 
                    269: #define ACCESS_EXIT_GET \
                    270:        mmu030_ad[mmu030_idx].val = v; \
                    271:        mmu030_ad[mmu030_idx].done = true; \
                    272:        mmu030_idx++; \
                    273:        mmu030_ad[mmu030_idx].done = false;
                    274: 
                    275: STATIC_INLINE void put_byte_mmu030_state (uaecptr addr, uae_u32 v)
                    276: {
                    277:        ACCESS_CHECK_PUT
                    278:     uae_mmu030_put_byte (addr, v);
                    279:        ACCESS_EXIT_PUT
                    280: }
                    281: STATIC_INLINE void put_lrmw_byte_mmu030_state (uaecptr addr, uae_u32 v)
                    282: {
                    283:        ACCESS_CHECK_PUT
                    284:     uae_mmu030_put_lrmw (addr, v, sz_byte);
                    285:        ACCESS_EXIT_PUT
                    286: }
                    287: STATIC_INLINE void put_word_mmu030_state (uaecptr addr, uae_u32 v)
                    288: {
                    289:        ACCESS_CHECK_PUT
                    290:     uae_mmu030_put_word (addr, v);
                    291:        ACCESS_EXIT_PUT
                    292: }
                    293: STATIC_INLINE void put_lrmw_word_mmu030_state (uaecptr addr, uae_u32 v)
                    294: {
                    295:        ACCESS_CHECK_PUT
                    296:     uae_mmu030_put_lrmw (addr, v, sz_word);
                    297:        ACCESS_EXIT_PUT
                    298: }
                    299: STATIC_INLINE void put_long_mmu030_state (uaecptr addr, uae_u32 v)
                    300: {
                    301:        ACCESS_CHECK_PUT
                    302:     uae_mmu030_put_long (addr, v);
                    303:        ACCESS_EXIT_PUT
                    304: }
                    305: STATIC_INLINE void put_lrmw_long_mmu030_state (uaecptr addr, uae_u32 v)
                    306: {
                    307:        ACCESS_CHECK_PUT
                    308:     uae_mmu030_put_lrmw (addr, v, sz_long);
                    309:        ACCESS_EXIT_PUT
                    310: }
                    311: 
                    312: STATIC_INLINE uae_u32 get_byte_mmu030_state (uaecptr addr)
                    313: {
                    314:        uae_u32 v;
                    315:        ACCESS_CHECK_GET
                    316:     v = uae_mmu030_get_byte (addr);
                    317:        ACCESS_EXIT_GET
                    318:        return v;
                    319: }
                    320: STATIC_INLINE uae_u32 get_lrmw_byte_mmu030_state (uaecptr addr)
                    321: {
                    322:        uae_u32 v;
                    323:        ACCESS_CHECK_GET
                    324:     v = uae_mmu030_get_lrmw (addr, sz_byte);
                    325:        ACCESS_EXIT_GET
                    326:        return v;
                    327: }
                    328: 
                    329: STATIC_INLINE uae_u32 get_word_mmu030_state (uaecptr addr)
                    330: {
                    331:        uae_u32 v;
                    332:        ACCESS_CHECK_GET
                    333:        v = uae_mmu030_get_word (addr);
                    334:        ACCESS_EXIT_GET
                    335:        return v;
                    336: }
                    337: STATIC_INLINE uae_u32 get_lrmw_word_mmu030_state (uaecptr addr)
                    338: {
                    339:        uae_u32 v;
                    340:        ACCESS_CHECK_GET
                    341:     v = uae_mmu030_get_lrmw (addr, sz_word);
                    342:        ACCESS_EXIT_GET
                    343:        return v;
                    344: }
                    345: STATIC_INLINE uae_u32 get_long_mmu030_state (uaecptr addr)
                    346: {
                    347:        uae_u32 v;
                    348:        ACCESS_CHECK_GET
                    349:        v = uae_mmu030_get_long (addr);
                    350:        ACCESS_EXIT_GET
                    351:        return v;
                    352: }
                    353: STATIC_INLINE uae_u32 get_lrmw_long_mmu030_state (uaecptr addr)
                    354: {
                    355:        uae_u32 v;
                    356:        ACCESS_CHECK_GET
                    357:     v = uae_mmu030_get_lrmw (addr, sz_long);
                    358:        ACCESS_EXIT_GET
                    359:        return v;
                    360: }
                    361: 
                    362: STATIC_INLINE uae_u32 get_ibyte_mmu030_state (int o)
                    363: {
                    364:        uae_u32 v;
                    365:     uae_u32 addr = m68k_getpci () + o;
                    366:        ACCESS_CHECK_GET
                    367:     v = uae_mmu030_get_iword (addr);
                    368:        ACCESS_EXIT_GET
                    369:        return v;
                    370: }
                    371: STATIC_INLINE uae_u32 get_iword_mmu030_state (int o)
                    372: {
                    373:        uae_u32 v;
                    374:     uae_u32 addr = m68k_getpci () + o;
                    375:        ACCESS_CHECK_GET
                    376:     v = uae_mmu030_get_iword (addr);
                    377:        ACCESS_EXIT_GET
                    378:        return v;
                    379: }
                    380: STATIC_INLINE uae_u32 get_ilong_mmu030_state (int o)
                    381: {
                    382:        uae_u32 v;
                    383:     uae_u32 addr = m68k_getpci () + o;
                    384:        ACCESS_CHECK_GET
                    385:     v = uae_mmu030_get_ilong (addr);
                    386:        ACCESS_EXIT_GET
                    387:        return v;
                    388: }
                    389: STATIC_INLINE uae_u32 next_iword_mmu030_state (void)
                    390: {
                    391:        uae_u32 v;
                    392:     uae_u32 addr = m68k_getpci ();
                    393:        ACCESS_CHECK_GET_PC(2);
                    394:     v = uae_mmu030_get_iword (addr);
                    395:     m68k_incpci (2);
                    396:        ACCESS_EXIT_GET
                    397:        return v;
                    398: }
                    399: STATIC_INLINE uae_u32 next_ilong_mmu030_state (void)
                    400: {
                    401:        uae_u32 v;
                    402:     uae_u32 addr = m68k_getpci ();
                    403:        ACCESS_CHECK_GET_PC(4);
                    404:     v = uae_mmu030_get_ilong (addr);
                    405:     m68k_incpci (4);
                    406:        ACCESS_EXIT_GET
                    407:        return v;
                    408: }
                    409: 
                    410: STATIC_INLINE uae_u32 get_byte_mmu030 (uaecptr addr)
                    411: {
                    412:        return uae_mmu030_get_byte (addr);
                    413: }
                    414: STATIC_INLINE uae_u32 get_word_mmu030 (uaecptr addr)
                    415: {
                    416:        return uae_mmu030_get_word (addr);
                    417: }
                    418: STATIC_INLINE uae_u32 get_long_mmu030 (uaecptr addr)
                    419: {
                    420:        return uae_mmu030_get_long (addr);
                    421: }
                    422: STATIC_INLINE void put_byte_mmu030 (uaecptr addr, uae_u32 v)
                    423: {
                    424:     uae_mmu030_put_byte (addr, v);
                    425: }
                    426: 
                    427: STATIC_INLINE void put_word_mmu030 (uaecptr addr, uae_u32 v)
                    428: {
                    429:     uae_mmu030_put_word (addr, v);
                    430: }
                    431: STATIC_INLINE void put_long_mmu030 (uaecptr addr, uae_u32 v)
                    432: {
                    433:     uae_mmu030_put_long (addr, v);
                    434: }
                    435: 
                    436: STATIC_INLINE uae_u32 get_ibyte_mmu030 (int o)
                    437: {
                    438:     uae_u32 pc = m68k_getpci () + o;
                    439:     return uae_mmu030_get_iword (pc);
                    440: }
                    441: STATIC_INLINE uae_u32 get_iword_mmu030 (int o)
                    442: {
                    443:     uae_u32 pc = m68k_getpci () + o;
                    444:     return uae_mmu030_get_iword (pc);
                    445: }
                    446: STATIC_INLINE uae_u32 get_ilong_mmu030 (int o)
                    447: {
                    448:     uae_u32 pc = m68k_getpci () + o;
                    449:     return uae_mmu030_get_ilong (pc);
                    450: }
                    451: STATIC_INLINE uae_u32 next_iword_mmu030 (void)
                    452: {
                    453:        uae_u32 v;
                    454:     uae_u32 pc = m68k_getpci ();
                    455:     v = uae_mmu030_get_iword (pc);
                    456:     m68k_incpci (2);
                    457:        return v;
                    458: }
                    459: STATIC_INLINE uae_u32 next_ilong_mmu030 (void)
                    460: {
                    461:        uae_u32 v;
                    462:     uae_u32 pc = m68k_getpci ();
                    463:     v = uae_mmu030_get_ilong (pc);
                    464:     m68k_incpci (4);
                    465:        return v;
                    466: }
                    467: 
                    468: extern void m68k_do_rts_mmu030 (void);
                    469: extern void m68k_do_rte_mmu030 (uaecptr a7);
                    470: extern void flush_mmu030 (uaecptr, int);
                    471: extern void m68k_do_bsr_mmu030 (uaecptr oldpc, uae_s32 offset);
                    472: 
                    473: #endif /* UAE_CPUMMU030_H */

unix.superglobalmegacorp.com

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