|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * memory management
5: *
6: * (c) 1995 Bernd Schmidt
7: */
8:
9: #ifdef DUALCPU
10: extern bool allowmem;
11: extern bool incpu;
12: extern bool customacc;
13: extern ULONG mempattern;
14: extern int memlogptr;
15: #endif
16:
17: #define chipmem_size 0x200000
18: #define fastmem_size 0
19: #define bogomem_size 0x80000 /* C00000 crap mem */
20: #define kickmem_size 0x80000
21:
22: #define chipmem_start 0
23: #define fastmem_start 0x200000
24: #define bogomem_start 0xC00000
25: #define kickmem_start 0xF80000
26:
27: typedef ULONG (*lget_func)(CPTR) REGPARAM;
28: typedef UWORD (*wget_func)(CPTR) REGPARAM;
29: typedef UBYTE (*bget_func)(CPTR) REGPARAM;
30: typedef void (*lput_func)(CPTR,ULONG) REGPARAM;
31: typedef void (*wput_func)(CPTR,UWORD) REGPARAM;
32: typedef void (*bput_func)(CPTR,UBYTE) REGPARAM;
33: typedef UWORD *(*xlate_func)(CPTR) REGPARAM;
34: typedef bool (*check_func)(CPTR, ULONG) REGPARAM;
35:
36: typedef struct {
37: lget_func lget;
38: wget_func wget;
39: bget_func bget;
40: lput_func lput;
41: wput_func wput;
42: bput_func bput;
43: xlate_func xlateaddr;
44: check_func check;
45: } addrbank;
46:
47: extern addrbank chipmem_bank;
48: extern addrbank kickmem_bank;
49: extern addrbank custom_bank;
50: extern addrbank clock_bank;
51: extern addrbank cia_bank;
52: extern addrbank rtarea_bank;
53:
54: extern void rtarea_init (void);
55:
56: /* Default memory access functions */
57:
58: extern bool default_check(CPTR addr, ULONG size) REGPARAM;
59: extern UWORD *default_xlate(CPTR addr) REGPARAM;
60:
61: extern lget_func do_lget[256];
62: extern wget_func do_wget[256];
63: extern bget_func do_bget[256];
64: extern lput_func do_lput[256];
65: extern wput_func do_wput[256];
66: extern bput_func do_bput[256];
67: extern xlate_func do_xlateaddr[256];
68: extern check_func do_check[256];
69:
70: static __inline__ int bankindex(CPTR a)
71: {
72: #ifdef HAVE_BROKEN_SOFTWARE
73: return (a>>16) & 0xFF;
74: #else
75: return a>>16;
76: #endif
77: }
78:
79: static __inline__ ULONG longget(CPTR addr)
80: {
81: return do_lget[bankindex(addr)](addr);
82: }
83: static __inline__ UWORD wordget(CPTR addr)
84: {
85: return do_wget[bankindex(addr)](addr);
86: }
87: static __inline__ UBYTE byteget(CPTR addr)
88: {
89: return do_bget[bankindex(addr)](addr);
90: }
91: static __inline__ void longput(CPTR addr, ULONG l)
92: {
93: do_lput[bankindex(addr)](addr, l);
94: }
95: static __inline__ void wordput(CPTR addr, UWORD w)
96: {
97: do_wput[bankindex(addr)](addr, w);
98: }
99: static __inline__ void byteput(CPTR addr, UBYTE b)
100: {
101: do_bput[bankindex(addr)](addr, b);
102: }
103:
104: static __inline__ bool check_addr(CPTR a)
105: {
106: #ifdef NO_EXCEPTION_3
107: return true;
108: #else
109: return (a & 1) == 0;
110: #endif
111: }
112: extern bool buserr;
113:
114: extern void memory_init(void);
115: extern void map_banks(addrbank bank, int first, int count);
116:
117: #ifdef DUALCPU
118: extern ULONG get_long(CPTR addr);
119: extern UWORD get_word(CPTR addr);
120: extern UBYTE get_byte(CPTR addr);
121: extern void put_long(CPTR a,ULONG l);
122: extern void put_word(CPTR a,UWORD w);
123: extern void put_byte(CPTR a,UBYTE b);
124: #else
125: static __inline__ ULONG get_long(CPTR addr)
126: {
127: if (check_addr(addr))
128: return longget(addr);
129: buserr = true;
130: return 0;
131: }
132: static __inline__ UWORD get_word(CPTR addr)
133: {
134: if (check_addr(addr))
135: return wordget(addr);
136: buserr = true;
137: return 0;
138: }
139: static __inline__ UBYTE get_byte(CPTR addr)
140: {
141: return byteget(addr);
142: }
143: static __inline__ void put_long(CPTR addr, ULONG l)
144: {
145: if (!check_addr(addr))
146: buserr = true;
147: longput(addr, l);
148: }
149: static __inline__ void put_word(CPTR addr, UWORD w)
150: {
151: if (!check_addr(addr))
152: buserr = true;
153: wordput(addr, w);
154: }
155: static __inline__ void put_byte(CPTR addr, UBYTE b)
156: {
157: byteput(addr, b);
158: }
159: #endif
160:
161: static __inline__ UWORD *get_real_address(CPTR addr)
162: {
163: if (!check_addr(addr))
164: buserr = true;
165: return do_xlateaddr[bankindex(addr)](addr);
166: }
167:
168: static __inline__ bool valid_address(CPTR addr, ULONG size)
169: {
170: if (!check_addr(addr))
171: buserr = true;
172: return do_check[bankindex(addr)](addr, size);
173: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.