|
|
1.1 ! root 1: #include "main.h" ! 2: #include "configuration.h" ! 3: #include "m68000.h" ! 4: #include "sysdeps.h" ! 5: #include "bmap.h" ! 6: ! 7: ! 8: /* NeXT bmap chip emulation */ ! 9: ! 10: ! 11: uae_u32 NEXTbmap[16]; ! 12: ! 13: int bmap_tpe_select = 0; ! 14: ! 15: uae_u32 bmap_get(uae_u32 addr); ! 16: void bmap_put(uae_u32 addr, uae_u32 val); ! 17: ! 18: ! 19: #define BMAP_DATA_RW 0xD ! 20: ! 21: #define BMAP_TPE_RXSEL 0x80000000 ! 22: #define BMAP_HEARTBEAT 0x20000000 ! 23: #define BMAP_TPE_ILBC 0x10000000 ! 24: #define BMAP_TPE (BMAP_TPE_RXSEL|BMAP_TPE_ILBC) ! 25: ! 26: uae_u32 bmap_lget(uaecptr addr) { ! 27: uae_u32 l; ! 28: ! 29: if (addr&3) { ! 30: Log_Printf(LOG_WARN, "[BMAP] Unaligned access."); ! 31: return 0; ! 32: } ! 33: ! 34: l = bmap_get(addr>>2); ! 35: ! 36: return l; ! 37: } ! 38: ! 39: uae_u32 bmap_wget(uaecptr addr) { ! 40: uae_u32 w; ! 41: int shift; ! 42: ! 43: if (addr&1) { ! 44: Log_Printf(LOG_WARN, "[BMAP] Unaligned access."); ! 45: return 0; ! 46: } ! 47: ! 48: shift = (2 - (addr&2)) * 8; ! 49: ! 50: w = bmap_get(addr>>2); ! 51: w >>= shift; ! 52: w &= 0xFFFF; ! 53: ! 54: return w; ! 55: } ! 56: ! 57: uae_u32 bmap_bget(uaecptr addr) { ! 58: uae_u32 b; ! 59: int shift; ! 60: ! 61: shift = (3 - (addr&3)) * 8; ! 62: ! 63: b = bmap_get(addr>>2); ! 64: b >>= shift; ! 65: b &= 0xFF; ! 66: ! 67: return b; ! 68: } ! 69: ! 70: void bmap_lput(uaecptr addr, uae_u32 l) { ! 71: if (addr&3) { ! 72: Log_Printf(LOG_WARN, "[BMAP] Unaligned access."); ! 73: return; ! 74: } ! 75: ! 76: bmap_put(addr>>2, l); ! 77: } ! 78: ! 79: void bmap_wput(uaecptr addr, uae_u32 w) { ! 80: uae_u32 val; ! 81: int shift; ! 82: ! 83: if (addr&1) { ! 84: Log_Printf(LOG_WARN, "[BMAP] Unaligned access."); ! 85: return; ! 86: } ! 87: ! 88: shift = (2 - (addr&2)) * 8; ! 89: ! 90: val = NEXTbmap[addr>>2]; ! 91: val &= ~(0xFFFF << shift); ! 92: val |= w << shift; ! 93: ! 94: bmap_put(addr>>2, val); ! 95: } ! 96: ! 97: void bmap_bput(uaecptr addr, uae_u32 b) { ! 98: uae_u32 val; ! 99: int shift; ! 100: ! 101: shift = (3 - (addr&3)) * 8; ! 102: ! 103: val = NEXTbmap[addr>>2]; ! 104: val &= ~(0xFF << shift); ! 105: val |= b << shift; ! 106: ! 107: bmap_put(addr>>2, val); ! 108: } ! 109: ! 110: ! 111: uae_u32 bmap_get(uae_u32 bmap_reg) { ! 112: uae_u32 val; ! 113: ! 114: switch (bmap_reg) { ! 115: case BMAP_DATA_RW: ! 116: /* This is for detecing thin wire ethernet. ! 117: * It prevents from switching ethernet ! 118: * transceiver to loopback mode. ! 119: */ ! 120: val = NEXTbmap[BMAP_DATA_RW]; ! 121: ! 122: if (ConfigureParams.Ethernet.bEthernetConnected && ConfigureParams.Ethernet.bTwistedPair) { ! 123: val &= ~BMAP_HEARTBEAT; ! 124: } else { ! 125: val |= BMAP_HEARTBEAT; ! 126: } ! 127: break; ! 128: ! 129: default: ! 130: val = NEXTbmap[bmap_reg]; ! 131: break; ! 132: } ! 133: ! 134: return val; ! 135: } ! 136: ! 137: void bmap_put(uae_u32 bmap_reg, uae_u32 val) { ! 138: switch (bmap_reg) { ! 139: case BMAP_DATA_RW: ! 140: if ((val&BMAP_TPE) != (NEXTbmap[bmap_reg]&BMAP_TPE)) { ! 141: if ((val&BMAP_TPE)==BMAP_TPE) { ! 142: Log_Printf(LOG_WARN, "[BMAP] Switching to twisted pair ethernet."); ! 143: bmap_tpe_select = 1; ! 144: } else if ((val&BMAP_TPE)==0) { ! 145: Log_Printf(LOG_WARN, "[BMAP] Switching to thin ethernet."); ! 146: bmap_tpe_select = 0; ! 147: } ! 148: } ! 149: break; ! 150: ! 151: default: ! 152: break; ! 153: } ! 154: ! 155: NEXTbmap[bmap_reg] = val; ! 156: } ! 157: ! 158: void bmap_init(void) { ! 159: int i; ! 160: ! 161: for (i = 0; i < 16; i++) { ! 162: NEXTbmap[i] = 0; ! 163: } ! 164: bmap_tpe_select = 0; ! 165: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.