trunk/src/emu/machine/i82875p.c
| r241837 | r241838 | |
| 6 | 6 | DEVICE_ADDRESS_MAP_START(agp_translation_map, 32, i82875p_host_device) |
| 7 | 7 | ADDRESS_MAP_END |
| 8 | 8 | |
| 9 | DEVICE_ADDRESS_MAP_START(config_map, 32, i82875p_host_device) |
| 10 | AM_RANGE(0x50, 0x53) AM_READWRITE8 (agpm_r, agpm_w, 0x0000ff00) |
| 11 | AM_RANGE(0x50, 0x53) AM_READ8 (gc_r, 0x00ff0000) |
| 12 | AM_RANGE(0x50, 0x53) AM_READ8 (csabcont_r, 0xff000000) |
| 13 | AM_RANGE(0x58, 0x5b) AM_READ (eap_r) |
| 14 | AM_RANGE(0x5c, 0x5f) AM_READ8 (derrsyn_r, 0x000000ff) |
| 15 | AM_RANGE(0x5c, 0x5f) AM_READ8 (des_r, 0x0000ff00) |
| 16 | AM_RANGE(0x60, 0x63) AM_READWRITE8 (fpllcont_r, fpllcont_w, 0x000000ff) |
| 17 | AM_RANGE(0x90, 0x97) AM_READWRITE8 (pam_r, pam_w, 0xffffffff) |
| 18 | AM_RANGE(0x9c, 0x9f) AM_READWRITE8 (smram_r, smram_w, 0x0000ff00) |
| 19 | AM_RANGE(0x9c, 0x9f) AM_READWRITE8 (esmramc_r, esmramc_w, 0x00ff0000) |
| 20 | AM_RANGE(0xa0, 0xa3) AM_READ (acapid_r) |
| 21 | AM_RANGE(0xa4, 0xa7) AM_READ (agpstat_r) |
| 22 | AM_RANGE(0xa8, 0xab) AM_READ (agpcmd_r) |
| 23 | AM_RANGE(0xb0, 0xb3) AM_READWRITE (agpctrl_r, agpctrl_w) |
| 24 | AM_RANGE(0xb4, 0xb7) AM_READWRITE8 (apsize_r, apsize_w, 0x000000ff) |
| 25 | AM_RANGE(0xb8, 0xbb) AM_READWRITE (attbase_r, attbase_w) |
| 26 | AM_RANGE(0xbc, 0xbf) AM_READWRITE8 (amtt_r, amtt_w, 0x000000ff) |
| 27 | AM_RANGE(0xbc, 0xbf) AM_READWRITE8 (lptt_r, lptt_w, 0x0000ff00) |
| 28 | AM_RANGE(0xc4, 0xc7) AM_READWRITE16(toud_r, toud_w, 0x0000ffff) |
| 29 | AM_RANGE(0xc4, 0xc7) AM_READWRITE16(mchcfg_r, mchcfg_w, 0xffff0000) |
| 30 | AM_RANGE(0xc8, 0xcb) AM_READ16 (errsts_r, 0x0000ffff) |
| 31 | AM_RANGE(0xc8, 0xcb) AM_READWRITE16(errcmd_r, errcmd_w, 0xffff0000) |
| 32 | AM_RANGE(0xcc, 0xcf) AM_READWRITE16(smicmd_r, smicmd_w, 0x0000ffff) |
| 33 | AM_RANGE(0xcc, 0xcf) AM_READWRITE16(scicmd_r, scicmd_w, 0xffff0000) |
| 34 | AM_RANGE(0xdc, 0xdf) AM_READWRITE16(skpd_r, skpd_w, 0xffff0000) |
| 35 | AM_RANGE(0xe4, 0xe7) AM_READ (capreg1_r) |
| 36 | AM_RANGE(0xe8, 0xeb) AM_READ8 (capreg2_r, 0x000000ff) |
| 37 | |
| 38 | AM_INHERIT_FROM(pci_host_device::config_map) |
| 39 | ADDRESS_MAP_END |
| 40 | |
| 9 | 41 | i82875p_host_device::i82875p_host_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 10 | 42 | : pci_host_device(mconfig, I82875P_HOST, "i82875p northbridge", tag, owner, clock, "i82875p_host", __FILE__) |
| 11 | 43 | { |
| r241837 | r241838 | |
| 21 | 53 | ram_size = _ram_size; |
| 22 | 54 | } |
| 23 | 55 | |
| 56 | READ8_MEMBER(i82875p_host_device::capptr_r) |
| 57 | { |
| 58 | return 0xe4; |
| 59 | } |
| 60 | |
| 24 | 61 | void i82875p_host_device::device_start() |
| 25 | 62 | { |
| 26 | 63 | pci_host_device::device_start(); |
| r241837 | r241838 | |
| 41 | 78 | add_map(256*1024*1024, M_MEM, FUNC(i82875p_host_device::agp_translation_map)); |
| 42 | 79 | } |
| 43 | 80 | |
| 81 | READ8_MEMBER( i82875p_host_device::agpm_r) |
| 82 | { |
| 83 | return agpm; |
| 84 | } |
| 85 | |
| 86 | WRITE8_MEMBER( i82875p_host_device::agpm_w) |
| 87 | { |
| 88 | agpm = data; |
| 89 | logerror("%s: agpm = %02x\n", tag(), agpm); |
| 90 | } |
| 91 | |
| 92 | READ8_MEMBER( i82875p_host_device::gc_r) |
| 93 | { |
| 94 | return 0x08; |
| 95 | } |
| 96 | |
| 97 | READ8_MEMBER( i82875p_host_device::csabcont_r) |
| 98 | { |
| 99 | return 0x00; |
| 100 | } |
| 101 | |
| 102 | READ32_MEMBER( i82875p_host_device::eap_r) |
| 103 | { |
| 104 | return 0x00000000; |
| 105 | } |
| 106 | |
| 107 | READ8_MEMBER( i82875p_host_device::derrsyn_r) |
| 108 | { |
| 109 | return 0x00; |
| 110 | } |
| 111 | |
| 112 | READ8_MEMBER( i82875p_host_device::des_r) |
| 113 | { |
| 114 | return 0x00; |
| 115 | } |
| 116 | |
| 117 | READ8_MEMBER( i82875p_host_device::fpllcont_r) |
| 118 | { |
| 119 | return fpllcont; |
| 120 | } |
| 121 | |
| 122 | WRITE8_MEMBER( i82875p_host_device::fpllcont_w) |
| 123 | { |
| 124 | fpllcont = data; |
| 125 | logerror("%s: fpllcont = %02x\n", tag(), data); |
| 126 | } |
| 127 | |
| 128 | READ8_MEMBER( i82875p_host_device::pam_r) |
| 129 | { |
| 130 | return pam[offset]; |
| 131 | } |
| 132 | |
| 133 | WRITE8_MEMBER( i82875p_host_device::pam_w) |
| 134 | { |
| 135 | pam[offset] = data; |
| 136 | logerror("%s: pam[%d] = %02x\n", tag(), offset, data); |
| 137 | remap_cb(); |
| 138 | } |
| 139 | |
| 140 | READ8_MEMBER( i82875p_host_device::smram_r) |
| 141 | { |
| 142 | return smram; |
| 143 | } |
| 144 | |
| 145 | WRITE8_MEMBER( i82875p_host_device::smram_w) |
| 146 | { |
| 147 | if(!(smram & 0x10)) |
| 148 | smram = (data & 0xfe) | 0x02; |
| 149 | logerror("%s: smram = %02x\n", tag(), smram); |
| 150 | remap_cb(); |
| 151 | } |
| 152 | |
| 153 | READ8_MEMBER( i82875p_host_device::esmramc_r) |
| 154 | { |
| 155 | return esmramc; |
| 156 | } |
| 157 | |
| 158 | WRITE8_MEMBER( i82875p_host_device::esmramc_w) |
| 159 | { |
| 160 | if(!(smram & 0x10)) |
| 161 | esmramc = (data & 0x87) | 0x38; |
| 162 | logerror("%s: esmramc = %02x\n", tag(), smram); |
| 163 | remap_cb(); |
| 164 | } |
| 165 | |
| 166 | READ32_MEMBER( i82875p_host_device::acapid_r) |
| 167 | { |
| 168 | return 0x00300002; |
| 169 | } |
| 170 | |
| 171 | READ32_MEMBER( i82875p_host_device::agpstat_r) |
| 172 | { |
| 173 | return 0x1f004a13; |
| 174 | } |
| 175 | |
| 176 | READ32_MEMBER( i82875p_host_device::agpcmd_r) |
| 177 | { |
| 178 | return 0x00000a00; |
| 179 | } |
| 180 | |
| 181 | READ32_MEMBER( i82875p_host_device::agpctrl_r) |
| 182 | { |
| 183 | return agpctrl; |
| 184 | } |
| 185 | |
| 186 | WRITE32_MEMBER(i82875p_host_device::agpctrl_w) |
| 187 | { |
| 188 | COMBINE_DATA(&agpctrl); |
| 189 | logerror("%s: agpctrl = %08x\n", tag(), agpctrl); |
| 190 | } |
| 191 | |
| 192 | READ8_MEMBER( i82875p_host_device::apsize_r) |
| 193 | { |
| 194 | return apsize; |
| 195 | } |
| 196 | |
| 197 | WRITE8_MEMBER( i82875p_host_device::apsize_w) |
| 198 | { |
| 199 | apsize = data; |
| 200 | logerror("%s: apsize = %02x\n", tag(), apsize); |
| 201 | } |
| 202 | |
| 203 | READ32_MEMBER( i82875p_host_device::attbase_r) |
| 204 | { |
| 205 | return attbase; |
| 206 | } |
| 207 | |
| 208 | WRITE32_MEMBER(i82875p_host_device::attbase_w) |
| 209 | { |
| 210 | COMBINE_DATA(&attbase); |
| 211 | logerror("%s: attbase = %08x\n", tag(), attbase); |
| 212 | } |
| 213 | |
| 214 | READ8_MEMBER( i82875p_host_device::amtt_r) |
| 215 | { |
| 216 | return amtt; |
| 217 | } |
| 218 | |
| 219 | WRITE8_MEMBER( i82875p_host_device::amtt_w) |
| 220 | { |
| 221 | amtt = data; |
| 222 | } |
| 223 | |
| 224 | READ8_MEMBER( i82875p_host_device::lptt_r) |
| 225 | { |
| 226 | return lptt; |
| 227 | } |
| 228 | |
| 229 | WRITE8_MEMBER( i82875p_host_device::lptt_w) |
| 230 | { |
| 231 | lptt = data; |
| 232 | } |
| 233 | |
| 234 | READ16_MEMBER( i82875p_host_device::toud_r) |
| 235 | { |
| 236 | return toud; |
| 237 | } |
| 238 | |
| 239 | WRITE16_MEMBER(i82875p_host_device::toud_w) |
| 240 | { |
| 241 | COMBINE_DATA(&toud); |
| 242 | logerror("%s: toud = %08x\n", tag(), 512*toud); |
| 243 | remap_cb(); |
| 244 | } |
| 245 | |
| 246 | READ16_MEMBER( i82875p_host_device::mchcfg_r) |
| 247 | { |
| 248 | return mchcfg; |
| 249 | } |
| 250 | |
| 251 | WRITE16_MEMBER(i82875p_host_device::mchcfg_w) |
| 252 | { |
| 253 | COMBINE_DATA(&mchcfg); |
| 254 | } |
| 255 | |
| 256 | READ16_MEMBER( i82875p_host_device::errsts_r) |
| 257 | { |
| 258 | return 0x0000; |
| 259 | } |
| 260 | |
| 261 | READ16_MEMBER( i82875p_host_device::errcmd_r) |
| 262 | { |
| 263 | return errcmd; |
| 264 | } |
| 265 | |
| 266 | WRITE16_MEMBER(i82875p_host_device::errcmd_w) |
| 267 | { |
| 268 | COMBINE_DATA(&errcmd); |
| 269 | } |
| 270 | |
| 271 | READ16_MEMBER( i82875p_host_device::smicmd_r) |
| 272 | { |
| 273 | return smicmd; |
| 274 | } |
| 275 | |
| 276 | WRITE16_MEMBER(i82875p_host_device::smicmd_w) |
| 277 | { |
| 278 | COMBINE_DATA(&smicmd); |
| 279 | } |
| 280 | |
| 281 | READ16_MEMBER( i82875p_host_device::scicmd_r) |
| 282 | { |
| 283 | return scicmd; |
| 284 | } |
| 285 | |
| 286 | WRITE16_MEMBER(i82875p_host_device::scicmd_w) |
| 287 | { |
| 288 | COMBINE_DATA(&scicmd); |
| 289 | } |
| 290 | |
| 291 | READ16_MEMBER( i82875p_host_device::skpd_r) |
| 292 | { |
| 293 | return skpd; |
| 294 | } |
| 295 | |
| 296 | WRITE16_MEMBER(i82875p_host_device::skpd_w) |
| 297 | { |
| 298 | COMBINE_DATA(&skpd); |
| 299 | } |
| 300 | |
| 301 | READ32_MEMBER( i82875p_host_device::capreg1_r) |
| 302 | { |
| 303 | return 0x0106a009; |
| 304 | } |
| 305 | |
| 306 | READ8_MEMBER( i82875p_host_device::capreg2_r) |
| 307 | { |
| 308 | return 0x00; |
| 309 | } |
| 310 | |
| 44 | 311 | void i82875p_host_device::device_reset() |
| 45 | 312 | { |
| 46 | 313 | pci_host_device::device_reset(); |
| 314 | |
| 315 | agpm = 0x00; |
| 316 | fpllcont = 0x00; |
| 317 | memset(pam, 0, sizeof(pam)); |
| 318 | smram = 0x02; |
| 319 | esmramc = 0x38; |
| 320 | agpctrl = 0x00000000; |
| 321 | apsize = 0x00; |
| 322 | attbase = 0x00000000; |
| 323 | amtt = 0x10; |
| 324 | lptt = 0x10; |
| 325 | toud = 0x0400; |
| 326 | mchcfg = 0x0000; |
| 327 | errcmd = 0x0000; |
| 328 | smicmd = 0x0000; |
| 329 | scicmd = 0x0000; |
| 330 | skpd = 0x0000; |
| 47 | 331 | } |
| 48 | 332 | |
| 49 | 333 | void i82875p_host_device::map_extra(UINT64 memory_window_start, UINT64 memory_window_end, UINT64 memory_offset, address_space *memory_space, |
| 50 | 334 | UINT64 io_window_start, UINT64 io_window_end, UINT64 io_offset, address_space *io_space) |
| 51 | 335 | { |
| 52 | 336 | io_space->install_device(0, 0xffff, *static_cast<pci_host_device *>(this), &pci_host_device::io_configuration_access_map); |
| 337 | |
| 338 | UINT32 top = toud << 16; |
| 339 | if(top > ram_size) |
| 340 | top = ram_size; |
| 341 | |
| 342 | memory_space->install_ram (0x00000000, 0x0007ffff, &ram[0x00000000/4]); |
| 343 | |
| 344 | if(smram & 0x40) |
| 345 | memory_space->install_ram (0x000a0000, 0x000bffff, &ram[0x000a0000/4]); |
| 346 | |
| 347 | if(pam[1] & 0x01) |
| 348 | memory_space->install_rom (0x000c0000, 0x000c3fff, &ram[0x000c0000/4]); |
| 349 | if(pam[1] & 0x02) |
| 350 | memory_space->install_writeonly(0x000c0000, 0x000c3fff, &ram[0x000c0000/4]); |
| 351 | if(pam[1] & 0x10) |
| 352 | memory_space->install_rom (0x000c4000, 0x000c7fff, &ram[0x000c4000/4]); |
| 353 | if(pam[1] & 0x20) |
| 354 | memory_space->install_writeonly(0x000c4000, 0x000c7fff, &ram[0x000c4000/4]); |
| 355 | if(pam[2] & 0x01) |
| 356 | memory_space->install_rom (0x000c8000, 0x000cbfff, &ram[0x000c8000/4]); |
| 357 | if(pam[2] & 0x02) |
| 358 | memory_space->install_writeonly(0x000c8000, 0x000cbfff, &ram[0x000c8000/4]); |
| 359 | if(pam[2] & 0x10) |
| 360 | memory_space->install_rom (0x000cc000, 0x000cffff, &ram[0x000cc000/4]); |
| 361 | if(pam[2] & 0x20) |
| 362 | memory_space->install_writeonly(0x000cc000, 0x000cffff, &ram[0x000cc000/4]); |
| 363 | if(pam[3] & 0x01) |
| 364 | memory_space->install_rom (0x000d0000, 0x000d3fff, &ram[0x000d0000/4]); |
| 365 | if(pam[3] & 0x02) |
| 366 | memory_space->install_writeonly(0x000d0000, 0x000d3fff, &ram[0x000d0000/4]); |
| 367 | if(pam[3] & 0x10) |
| 368 | memory_space->install_rom (0x000d4000, 0x000d7fff, &ram[0x000d4000/4]); |
| 369 | if(pam[3] & 0x20) |
| 370 | memory_space->install_writeonly(0x000d4000, 0x000d7fff, &ram[0x000d4000/4]); |
| 371 | if(pam[4] & 0x01) |
| 372 | memory_space->install_rom (0x000d8000, 0x000dbfff, &ram[0x000d8000/4]); |
| 373 | if(pam[4] & 0x02) |
| 374 | memory_space->install_writeonly(0x000d8000, 0x000dbfff, &ram[0x000d8000/4]); |
| 375 | if(pam[4] & 0x10) |
| 376 | memory_space->install_rom (0x000dc000, 0x000dffff, &ram[0x000dc000/4]); |
| 377 | if(pam[4] & 0x20) |
| 378 | memory_space->install_writeonly(0x000dc000, 0x000dffff, &ram[0x000dc000/4]); |
| 379 | if(pam[5] & 0x01) |
| 380 | memory_space->install_rom (0x000e0000, 0x000e3fff, &ram[0x000e0000/4]); |
| 381 | if(pam[5] & 0x02) |
| 382 | memory_space->install_writeonly(0x000e0000, 0x000e3fff, &ram[0x000e0000/4]); |
| 383 | if(pam[5] & 0x10) |
| 384 | memory_space->install_rom (0x000e4000, 0x000e7fff, &ram[0x000e4000/4]); |
| 385 | if(pam[5] & 0x20) |
| 386 | memory_space->install_writeonly(0x000e4000, 0x000e7fff, &ram[0x000e4000/4]); |
| 387 | if(pam[6] & 0x01) |
| 388 | memory_space->install_rom (0x000e8000, 0x000ebfff, &ram[0x000e8000/4]); |
| 389 | if(pam[6] & 0x02) |
| 390 | memory_space->install_writeonly(0x000e8000, 0x000ebfff, &ram[0x000e8000/4]); |
| 391 | if(pam[6] & 0x10) |
| 392 | memory_space->install_rom (0x000ec000, 0x000effff, &ram[0x000ec000/4]); |
| 393 | if(pam[6] & 0x20) |
| 394 | memory_space->install_writeonly(0x000ec000, 0x000effff, &ram[0x000ec000/4]); |
| 395 | if(pam[0] & 0x10) |
| 396 | memory_space->install_rom (0x000f0000, 0x000fffff, &ram[0x000f0000/4]); |
| 397 | if(pam[0] & 0x20) |
| 398 | memory_space->install_writeonly(0x000f0000, 0x000fffff, &ram[0x000f0000/4]); |
| 399 | |
| 400 | memory_space->install_ram (0x00100000, 0x00efffff, &ram[0x00100000/4]); |
| 401 | if(!(pam[7] & 0x80)) |
| 402 | memory_space->install_ram (0x00f00000, 0x00ffffff, &ram[0x00f00000/4]); |
| 403 | if(top > 0x01000000) |
| 404 | memory_space->install_ram (0x01000000, top-1, &ram[0x01000000/4]); |
| 405 | |
| 406 | if((esmramc & 0x40) && (smram & 0x08)) |
| 407 | memory_space->install_ram (0xfeda0000, 0xfedbffff, &ram[0x000a0000/4]); |
| 408 | |
| 53 | 409 | } |
| 54 | 410 | |
| 55 | 411 | |
trunk/src/emu/machine/i82875p.h
| r241837 | r241838 | |
| 23 | 23 | virtual void map_extra(UINT64 memory_window_start, UINT64 memory_window_end, UINT64 memory_offset, address_space *memory_space, |
| 24 | 24 | UINT64 io_window_start, UINT64 io_window_end, UINT64 io_offset, address_space *io_space); |
| 25 | 25 | |
| 26 | virtual DECLARE_ADDRESS_MAP(config_map, 32); |
| 27 | |
| 28 | virtual DECLARE_READ8_MEMBER(capptr_r); |
| 29 | |
| 30 | DECLARE_READ8_MEMBER( agpm_r); |
| 31 | DECLARE_WRITE8_MEMBER( agpm_w); |
| 32 | DECLARE_READ8_MEMBER( gc_r); |
| 33 | DECLARE_READ8_MEMBER( csabcont_r); |
| 34 | DECLARE_READ32_MEMBER( eap_r); |
| 35 | DECLARE_READ8_MEMBER( derrsyn_r); |
| 36 | DECLARE_READ8_MEMBER( des_r); |
| 37 | DECLARE_READ8_MEMBER( fpllcont_r); |
| 38 | DECLARE_WRITE8_MEMBER( fpllcont_w); |
| 39 | DECLARE_READ8_MEMBER( pam_r); |
| 40 | DECLARE_WRITE8_MEMBER( pam_w); |
| 41 | DECLARE_READ8_MEMBER( smram_r); |
| 42 | DECLARE_WRITE8_MEMBER( smram_w); |
| 43 | DECLARE_READ8_MEMBER( esmramc_r); |
| 44 | DECLARE_WRITE8_MEMBER( esmramc_w); |
| 45 | DECLARE_READ32_MEMBER( acapid_r); |
| 46 | DECLARE_READ32_MEMBER( agpstat_r); |
| 47 | DECLARE_READ32_MEMBER( agpcmd_r); |
| 48 | DECLARE_READ32_MEMBER( agpctrl_r); |
| 49 | DECLARE_WRITE32_MEMBER(agpctrl_w); |
| 50 | DECLARE_READ8_MEMBER( apsize_r); |
| 51 | DECLARE_WRITE8_MEMBER( apsize_w); |
| 52 | DECLARE_READ32_MEMBER( attbase_r); |
| 53 | DECLARE_WRITE32_MEMBER(attbase_w); |
| 54 | DECLARE_READ8_MEMBER( amtt_r); |
| 55 | DECLARE_WRITE8_MEMBER( amtt_w); |
| 56 | DECLARE_READ8_MEMBER( lptt_r); |
| 57 | DECLARE_WRITE8_MEMBER( lptt_w); |
| 58 | DECLARE_READ16_MEMBER( toud_r); |
| 59 | DECLARE_WRITE16_MEMBER(toud_w); |
| 60 | DECLARE_READ16_MEMBER( mchcfg_r); |
| 61 | DECLARE_WRITE16_MEMBER(mchcfg_w); |
| 62 | DECLARE_READ16_MEMBER( errsts_r); |
| 63 | DECLARE_READ16_MEMBER( errcmd_r); |
| 64 | DECLARE_WRITE16_MEMBER(errcmd_w); |
| 65 | DECLARE_READ16_MEMBER( smicmd_r); |
| 66 | DECLARE_WRITE16_MEMBER(smicmd_w); |
| 67 | DECLARE_READ16_MEMBER( scicmd_r); |
| 68 | DECLARE_WRITE16_MEMBER(scicmd_w); |
| 69 | DECLARE_READ16_MEMBER( skpd_r); |
| 70 | DECLARE_WRITE16_MEMBER(skpd_w); |
| 71 | DECLARE_READ32_MEMBER( capreg1_r); |
| 72 | DECLARE_READ8_MEMBER( capreg2_r); |
| 73 | |
| 26 | 74 | protected: |
| 27 | 75 | virtual void device_start(); |
| 28 | 76 | virtual void device_reset(); |
| r241837 | r241838 | |
| 34 | 82 | int ram_size; |
| 35 | 83 | cpu_device *cpu; |
| 36 | 84 | dynamic_array<UINT32> ram; |
| 85 | |
| 86 | UINT8 agpm, fpllcont, pam[8], smram, esmramc; |
| 87 | UINT8 apsize, amtt, lptt; |
| 88 | UINT16 toud, mchcfg, errsts, errcmd, smicmd, scicmd, skpd; |
| 89 | UINT32 agpctrl, attbase; |
| 37 | 90 | }; |
| 38 | 91 | |
| 39 | 92 | class i82875p_agp_device : public agp_bridge_device { |