|
|
1.1 ! root 1: /* ! 2: * UAE - The Unusable Amiga Emulator ! 3: * ! 4: * memory management v0.1 ! 5: * v0.0: 950225 four simple functions to get/put bytes/words ! 6: * v0.1: 950228 made banks classes instead of 64k arrays to support ! 7: * custom chips as well ! 8: * ! 9: * (c) 1995 Bernd Schmidt ! 10: */ ! 11: ! 12: #include <iostream.h> ! 13: #include <fstream.h> ! 14: ! 15: #include "amiga.h" ! 16: #include "memory.h" ! 17: ! 18: const char romfile[] = "kick.rom"; ! 19: ! 20: UWORD ram64k::wget(UWORD addr) ! 21: { ! 22: return ram[addr>>1]; ! 23: } ! 24: ! 25: UBYTE ram64k::bget(UWORD addr) ! 26: { ! 27: return ram[addr>>1] >> (addr & 1 ? 0 : 8); ! 28: } ! 29: ! 30: void ram64k::wput(UWORD addr,UWORD value) ! 31: { ! 32: ram[addr>>1] = value; ! 33: } ! 34: ! 35: void ram64k::bput(UWORD addr,UBYTE value) ! 36: { ! 37: if (!(addr & 1)) { ! 38: ram[addr>>1] = (ram[addr>>1] & 0xff) | (((UWORD)value) << 8); ! 39: } else { ! 40: ram[addr>>1] = (ram[addr>>1] & 0xff00) | value; ! 41: } ! 42: } ! 43: ! 44: class rom64k: public ram64k { ! 45: public: ! 46: rom64k(ifstream &); ! 47: virtual void wput(UWORD addr, UWORD value) { /* READ ONLY */ }; ! 48: virtual void bput(UWORD addr, UBYTE value) { /* READ ONLY */ }; ! 49: }; ! 50: ! 51: rom64k::rom64k(ifstream &romin) ! 52: { ! 53: for (int i=0; i<32768; i++){ ! 54: UWORD data = romin.get(); ! 55: data = (data << 8) | romin.get(); ! 56: ram[i] = data; ! 57: } ! 58: } ! 59: ! 60: amigamemory mem; ! 61: ! 62: amigamemory::amigamemory() ! 63: { ! 64: // init chipmem ! 65: ! 66: int bank = 0; ! 67: for(int i=0;i<chipmem_size;i+=64){ ! 68: banks[bank++] = new ram64k; // allocate chipmem banks ! 69: cout << "got 64k chipmem\n"; ! 70: } ! 71: for(int b2=bank;b2<256;b2++) { // mirror the chipram everywhere, so ! 72: banks[b2] = banks[b2 % bank]; // that we don't have holes ! 73: } ! 74: ! 75: // init rom ! 76: ifstream romin(romfile); ! 77: for (bank = 0;bank<8;bank++){ ! 78: cout << "got 64k rom\n"; ! 79: banks[248+bank] = new rom64k(romin); ! 80: } ! 81: // init custom chips ! 82: banks[192] = new custom64k; ! 83: for (bank = 193; bank < 224; bank++) { ! 84: banks[bank] = banks[192]; ! 85: } ! 86: // init CIA ! 87: banks[191] = new cia64k; ! 88: cout << "Memory initialized OK\n"; ! 89: } ! 90: ! 91: amigamemory::~amigamemory() ! 92: { ! 93: ! 94: } ! 95:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.