home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD1.iso / Emulatoren / UAE061.LZH / uae-0.6.1 / include / memory.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-28  |  3.2 KB  |  150 lines

  1.  /* 
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   * memory management
  5.   * 
  6.   * (c) 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. typedef ULONG (*lget_func)(CPTR) REGPARAM;
  18. typedef UWORD (*wget_func)(CPTR) REGPARAM;
  19. typedef UBYTE (*bget_func)(CPTR) REGPARAM;
  20. typedef void (*lput_func)(CPTR,ULONG) REGPARAM;
  21. typedef void (*wput_func)(CPTR,UWORD) REGPARAM;
  22. typedef void (*bput_func)(CPTR,UBYTE) REGPARAM;
  23. typedef UWORD *(*xlate_func)(CPTR) REGPARAM;
  24. typedef int (*check_func)(CPTR, ULONG) REGPARAM;
  25.  
  26. typedef struct {
  27.     lget_func lget;
  28.     wget_func wget;
  29.     bget_func bget;
  30.     lput_func lput;
  31.     wput_func wput;
  32.     bput_func bput;
  33.     xlate_func xlateaddr;
  34.     check_func check;
  35. } addrbank;
  36.  
  37. extern addrbank chipmem_bank;
  38. extern addrbank kickmem_bank;
  39. extern addrbank custom_bank;
  40. extern addrbank clock_bank;
  41. extern addrbank cia_bank;
  42. extern addrbank rtarea_bank;
  43. extern addrbank expamem_bank;
  44. extern addrbank fastmem_bank;
  45.  
  46. extern void rtarea_init (void);
  47. extern void expamem_init (void);
  48. extern void expamem_reset (void);
  49.  
  50. extern ULONG fastmem_size, chipmem_size, bogomem_size;
  51.  
  52.  
  53. /* Default memory access functions */
  54.  
  55. extern int default_check(CPTR addr, ULONG size) REGPARAM;
  56. extern UWORD *default_xlate(CPTR addr) REGPARAM;
  57.  
  58. extern addrbank membanks[65536];
  59. static __inline__ unsigned int bankindex(CPTR a)
  60. {
  61.     return a>>16;
  62. }
  63.  
  64. static __inline__ ULONG longget(CPTR addr)
  65. {
  66.     return membanks[bankindex(addr)].lget(addr);
  67. }
  68. static __inline__ UWORD wordget(CPTR addr)
  69. {
  70.     return membanks[bankindex(addr)].wget(addr);
  71. }
  72. static __inline__ UBYTE byteget(CPTR addr) 
  73. {
  74.     return membanks[bankindex(addr)].bget(addr);
  75. }
  76. static __inline__ void longput(CPTR addr, ULONG l)
  77. {
  78.     membanks[bankindex(addr)].lput(addr, l);
  79. }
  80. static __inline__ void wordput(CPTR addr, UWORD w)
  81. {
  82.     membanks[bankindex(addr)].wput(addr, w);
  83. }
  84. static __inline__ void byteput(CPTR addr, UBYTE b)
  85. {
  86.     membanks[bankindex(addr)].bput(addr, b);
  87. }
  88.  
  89. static __inline__ int check_addr(CPTR a)
  90. {
  91. #ifdef NO_EXCEPTION_3
  92.     return 1;
  93. #else
  94.     return (a & 1) == 0;
  95. #endif
  96. }
  97. extern int buserr;
  98.     
  99. extern void memory_init(void);    
  100. extern void map_banks(addrbank bank, int first, int count);
  101.     
  102. static __inline__ ULONG get_long(CPTR addr) 
  103. {
  104.     if (check_addr(addr))
  105.     return longget(addr);
  106.     buserr = 1;
  107.     return 0;
  108. }
  109. static __inline__ UWORD get_word(CPTR addr) 
  110. {
  111.     if (check_addr(addr))
  112.     return wordget(addr);
  113.     buserr = 1;
  114.     return 0;
  115. }
  116. static __inline__ UBYTE get_byte(CPTR addr) 
  117. {
  118.     return byteget(addr); 
  119. }
  120. static __inline__ void put_long(CPTR addr, ULONG l) 
  121. {
  122.     if (!check_addr(addr))
  123.     buserr = 1;
  124.     longput(addr, l);
  125. }
  126. static __inline__ void put_word(CPTR addr, UWORD w) 
  127. {
  128.     if (!check_addr(addr))
  129.     buserr = 1;
  130.     wordput(addr, w);
  131. }
  132. static __inline__ void put_byte(CPTR addr, UBYTE b) 
  133. {
  134.     byteput(addr, b);
  135. }
  136.  
  137. static __inline__ UWORD *get_real_address(CPTR addr)
  138. {
  139.     if (!check_addr(addr))
  140.     buserr = 1;
  141.     return membanks[bankindex(addr)].xlateaddr(addr);
  142. }
  143.  
  144. static __inline__ int valid_address(CPTR addr, ULONG size)
  145. {
  146.     if (!check_addr(addr))
  147.     buserr = 1;
  148.     return membanks[bankindex(addr)].check(addr, size);
  149. }
  150.