Annotation of uae/src/include/memory.h, revision 1.1

1.1     ! root        1:  /* 
        !             2:   * UAE - The Un*x Amiga Emulator
        !             3:   * 
        !             4:   * memory management
        !             5:   * 
        !             6:   * Copyright 1995 Bernd Schmidt
        !             7:   */
        !             8: 
        !             9: #define kickmem_size 0x080000
        !            10: 
        !            11: #define chipmem_start 0x000000
        !            12: #define bogomem_start 0xC00000 
        !            13: #define kickmem_start 0xF80000
        !            14: 
        !            15: extern int ersatzkickfile;
        !            16: 
        !            17: extern char *address_space, *good_address_map;
        !            18: 
        !            19: typedef ULONG (*lget_afunc)(CPTR) REGPARAM;
        !            20: typedef UWORD (*wget_afunc)(CPTR) REGPARAM;
        !            21: typedef ULONG (*lget_func)(CPTR) REGPARAM;
        !            22: typedef UWORD (*wget_func)(CPTR) REGPARAM;
        !            23: typedef UBYTE (*bget_func)(CPTR) REGPARAM;
        !            24: typedef void (*lput_func)(CPTR,ULONG) REGPARAM;
        !            25: typedef void (*wput_func)(CPTR,UWORD) REGPARAM;
        !            26: typedef void (*bput_func)(CPTR,UBYTE) REGPARAM;
        !            27: typedef UBYTE *(*xlate_func)(CPTR) REGPARAM;
        !            28: typedef int (*check_func)(CPTR, ULONG) REGPARAM;
        !            29: 
        !            30: typedef struct {
        !            31:     /* These ones should be self-explanatory... */
        !            32:     lget_afunc alget;
        !            33:     wget_afunc awget;
        !            34:     lget_func lget;
        !            35:     wget_func wget;
        !            36:     bget_func bget;
        !            37:     lput_func lput;
        !            38:     wput_func wput;
        !            39:     bput_func bput;
        !            40:     /* Use xlateaddr to translate an Amiga address to a UWORD * that can
        !            41:      * be used to address memory without calling the wget/wput functions. 
        !            42:      * This doesn't work for all memory banks, so this function may call
        !            43:      * abort(). */
        !            44:     xlate_func xlateaddr;
        !            45:     /* To prevent calls to abort(), use check before calling xlateaddr.
        !            46:      * It checks not only that the memory bank can do xlateaddr, but also
        !            47:      * that the pointer points to an area of at least the specified size. 
        !            48:      * This is used for example to translate bitplane pointers in custom.c */
        !            49:     check_func check;
        !            50: } addrbank;
        !            51: 
        !            52: extern addrbank chipmem_bank;
        !            53: extern addrbank kickmem_bank;
        !            54: extern addrbank custom_bank;
        !            55: extern addrbank clock_bank;
        !            56: extern addrbank cia_bank;
        !            57: extern addrbank rtarea_bank;
        !            58: extern addrbank expamem_bank;
        !            59: extern addrbank fastmem_bank;
        !            60: 
        !            61: extern void rtarea_init (void);
        !            62: extern void expamem_init (void);
        !            63: extern void expamem_reset (void);
        !            64: 
        !            65: extern ULONG fastmem_size, chipmem_size, bogomem_size;
        !            66: 
        !            67: 
        !            68: /* Default memory access functions */
        !            69: 
        !            70: extern int default_check(CPTR addr, ULONG size) REGPARAM;
        !            71: extern UBYTE *default_xlate(CPTR addr) REGPARAM;
        !            72: extern UWORD default_awget(CPTR addr) REGPARAM;
        !            73: extern ULONG default_alget(CPTR addr) REGPARAM;
        !            74: 
        !            75: extern addrbank membanks[65536];
        !            76: static __inline__ unsigned int bankindex(CPTR a)
        !            77: {
        !            78:     return a>>16;
        !            79: }
        !            80: 
        !            81: static __inline__ ULONG alongget(CPTR addr)
        !            82: {
        !            83:     return membanks[bankindex(addr)].alget(addr);
        !            84: }
        !            85: static __inline__ UWORD awordget(CPTR addr)
        !            86: {
        !            87:     return membanks[bankindex(addr)].awget(addr);
        !            88: }
        !            89: static __inline__ ULONG longget(CPTR addr)
        !            90: {
        !            91:     return membanks[bankindex(addr)].lget(addr);
        !            92: }
        !            93: static __inline__ UWORD wordget(CPTR addr)
        !            94: {
        !            95:     return membanks[bankindex(addr)].wget(addr);
        !            96: }
        !            97: static __inline__ UBYTE byteget(CPTR addr) 
        !            98: {
        !            99:     return membanks[bankindex(addr)].bget(addr);
        !           100: }
        !           101: static __inline__ void longput(CPTR addr, ULONG l)
        !           102: {
        !           103:     membanks[bankindex(addr)].lput(addr, l);
        !           104: }
        !           105: static __inline__ void wordput(CPTR addr, UWORD w)
        !           106: {
        !           107:     membanks[bankindex(addr)].wput(addr, w);
        !           108: }
        !           109: static __inline__ void byteput(CPTR addr, UBYTE b)
        !           110: {
        !           111:     membanks[bankindex(addr)].bput(addr, b);
        !           112: }
        !           113: 
        !           114: static __inline__ int check_addr(CPTR a)
        !           115: {
        !           116: #if defined(NO_EXCEPTION_3) || CPU_LEVEL > 1
        !           117:     return 1;
        !           118: #else
        !           119:     return (a & 1) == 0;
        !           120: #endif
        !           121: }
        !           122: extern int buserr;
        !           123:     
        !           124: extern void memory_init(void);    
        !           125: extern void map_banks(addrbank *bank, int first, int count);
        !           126:     
        !           127: static __inline__ ULONG get_along(CPTR addr) 
        !           128: {
        !           129:     if (check_addr(addr))
        !           130:        return longget(addr);
        !           131:     buserr = 1;
        !           132:     return 0;
        !           133: }
        !           134: static __inline__ UWORD get_aword(CPTR addr) 
        !           135: {
        !           136:     if (check_addr(addr))
        !           137:        return wordget(addr);
        !           138:     buserr = 1;
        !           139:     return 0;
        !           140: }
        !           141: static __inline__ ULONG get_long(CPTR addr) 
        !           142: {
        !           143:     if (check_addr(addr))
        !           144:        return longget(addr);
        !           145:     buserr = 1;
        !           146:     return 0;
        !           147: }
        !           148: static __inline__ UWORD get_word(CPTR addr) 
        !           149: {
        !           150:     if (check_addr(addr))
        !           151:        return wordget(addr);
        !           152:     buserr = 1;
        !           153:     return 0;
        !           154: }
        !           155: static __inline__ UBYTE get_byte(CPTR addr) 
        !           156: {
        !           157:     return byteget(addr); 
        !           158: }
        !           159: static __inline__ void put_long(CPTR addr, ULONG l) 
        !           160: {
        !           161:     if (!check_addr(addr))
        !           162:        buserr = 1;
        !           163:     longput(addr, l);
        !           164: }
        !           165: static __inline__ void put_word(CPTR addr, UWORD w) 
        !           166: {
        !           167:     if (!check_addr(addr))
        !           168:        buserr = 1;
        !           169:     wordput(addr, w);
        !           170: }
        !           171: static __inline__ void put_byte(CPTR addr, UBYTE b) 
        !           172: {
        !           173:     byteput(addr, b);
        !           174: }
        !           175: 
        !           176: static __inline__ UBYTE *get_real_address(CPTR addr)
        !           177: {
        !           178:     return membanks[bankindex(addr)].xlateaddr(addr);
        !           179: }
        !           180: 
        !           181: static __inline__ int valid_address(CPTR addr, ULONG size)
        !           182: {
        !           183:     return membanks[bankindex(addr)].check(addr, size);
        !           184: }

unix.superglobalmegacorp.com

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