src/mess/drivers/vixen.c
| r0 | r9907 | |
| 1 | /* |
| 2 | |
| 3 | Osborne-4 "Vixen" |
| 4 | |
| 5 | Main PCB Layout |
| 6 | --------------- |
| 7 | |
| 8 | TODO |
| 9 | |
| 10 | Notes: |
| 11 | Relevant IC's shown. |
| 12 | |
| 13 | CPU - Zilog Z8400APS Z80A CPU |
| 14 | FDC - SMC FDC1797 |
| 15 | 8155 - Intel P8155H |
| 16 | ROM0 - |
| 17 | ROM1,2 - AMD AM2732-1DC 4Kx8 EPROM |
| 18 | CN1 - keyboard connector |
| 19 | CN2 - |
| 20 | CN3 - |
| 21 | CN4 - floppy connector |
| 22 | CN5 - power connector |
| 23 | CN6 - composite video connector |
| 24 | SW1 - reset switch |
| 25 | SW2 - |
| 26 | |
| 27 | |
| 28 | I/O PCB Layout |
| 29 | -------------- |
| 30 | |
| 31 | TODO |
| 32 | |
| 33 | Notes: |
| 34 | Relevant IC's shown. |
| 35 | |
| 36 | 8155 - Intel P8155H |
| 37 | 8251 - AMD P8251A |
| 38 | CN1 - IEEE488 connector |
| 39 | CN2 - RS232 connector |
| 40 | CN3 - |
| 41 | |
| 42 | */ |
| 43 | |
| 44 | /* |
| 45 | |
| 46 | TODO: |
| 47 | |
| 48 | - force fetch from ROM at reset |
| 49 | - frame rate should be ~60Hz |
| 50 | - video line buffer |
| 51 | - vsync |
| 52 | - floppy |
| 53 | - interrupts |
| 54 | - keyboard |
| 55 | - I/O board (8155 for IEEE488, 8251 for RS-232) |
| 56 | - PCB layouts |
| 57 | |
| 58 | */ |
| 59 | |
| 60 | #define ADDRESS_MAP_MODERN |
| 61 | |
| 62 | #include "emu.h" |
| 63 | #include "cpu/z80/z80.h" |
| 64 | #include "devices/flopdrv.h" |
| 65 | #include "devices/messram.h" |
| 66 | #include "machine/i8155.h" |
| 67 | #include "machine/wd17xx.h" |
| 68 | #include "sound/discrete.h" |
| 69 | #include "includes/vixen.h" |
| 70 | |
| 71 | |
| 72 | |
| 73 | //************************************************************************** |
| 74 | // INTERRUPTS |
| 75 | //************************************************************************** |
| 76 | |
| 77 | //------------------------------------------------- |
| 78 | // update_interrupt - |
| 79 | //------------------------------------------------- |
| 80 | |
| 81 | void vixen_state::update_interrupt() |
| 82 | { |
| 83 | int state = ((!BIT(m_cmd, 0) & m_fdint) | m_vsync) ? ASSERT_LINE : CLEAR_LINE; |
| 84 | |
| 85 | cpu_set_input_line(m_maincpu, INPUT_LINE_IRQ0, state); |
| 86 | } |
| 87 | |
| 88 | |
| 89 | //------------------------------------------------- |
| 90 | // status_r - status read |
| 91 | //------------------------------------------------- |
| 92 | |
| 93 | READ8_MEMBER( vixen_state::status_r ) |
| 94 | { |
| 95 | /* |
| 96 | |
| 97 | bit description |
| 98 | |
| 99 | 0 CMD D0 |
| 100 | 1 CMD D1 |
| 101 | 2 VSYNC |
| 102 | 3 |
| 103 | 4 |
| 104 | 5 |
| 105 | 6 |
| 106 | 7 |
| 107 | |
| 108 | */ |
| 109 | |
| 110 | UINT8 data = 0; |
| 111 | |
| 112 | // command |
| 113 | data |= m_cmd & 0x03; |
| 114 | |
| 115 | // vertical sync |
| 116 | data |= m_vsync << 2; |
| 117 | |
| 118 | return data; |
| 119 | } |
| 120 | |
| 121 | |
| 122 | //------------------------------------------------- |
| 123 | // cmd_w - command write |
| 124 | //------------------------------------------------- |
| 125 | |
| 126 | WRITE8_MEMBER( vixen_state::cmd_w ) |
| 127 | { |
| 128 | /* |
| 129 | |
| 130 | bit description |
| 131 | |
| 132 | 0 VSYNC clear |
| 133 | 1 FDINT enable |
| 134 | 2 |
| 135 | 3 |
| 136 | 4 |
| 137 | 5 |
| 138 | 6 |
| 139 | 7 |
| 140 | |
| 141 | */ |
| 142 | |
| 143 | m_cmd = data; |
| 144 | |
| 145 | if (BIT(data, 0)) |
| 146 | { |
| 147 | // clear vertical sync |
| 148 | m_vsync = 0; |
| 149 | } |
| 150 | |
| 151 | update_interrupt(); |
| 152 | } |
| 153 | |
| 154 | |
| 155 | |
| 156 | //************************************************************************** |
| 157 | // ADDRESS MAPS |
| 158 | //************************************************************************** |
| 159 | |
| 160 | //------------------------------------------------- |
| 161 | // ADDRESS_MAP( vixen_mem ) |
| 162 | //------------------------------------------------- |
| 163 | |
| 164 | static ADDRESS_MAP_START( vixen_mem, ADDRESS_SPACE_PROGRAM, 8, vixen_state ) |
| 165 | ADDRESS_MAP_UNMAP_HIGH |
| 166 | AM_RANGE(0x0000, 0xefff) AM_RAM |
| 167 | AM_RANGE(0xf000, 0xffff) AM_READ_BANK("bank1") AM_WRITE_BANK("bank2") AM_BASE(m_video_ram) |
| 168 | ADDRESS_MAP_END |
| 169 | |
| 170 | |
| 171 | //------------------------------------------------- |
| 172 | // ADDRESS_MAP( vixen_io ) |
| 173 | //------------------------------------------------- |
| 174 | |
| 175 | static ADDRESS_MAP_START( vixen_io, ADDRESS_SPACE_IO, 8, vixen_state ) |
| 176 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 177 | AM_RANGE(0x00, 0x03) AM_DEVREADWRITE_LEGACY(FDC1797_TAG, wd17xx_r, wd17xx_w) |
| 178 | AM_RANGE(0x04, 0x04) AM_MIRROR(0x03) AM_READWRITE(status_r, cmd_w) |
| 179 | AM_RANGE(0x08, 0x08) AM_MIRROR(0x04) AM_DEVREADWRITE(P8155H_TAG, i8155_device, memory_r, memory_w) |
| 180 | AM_RANGE(0x09, 0x09) AM_MIRROR(0x04) AM_DEVREADWRITE(P8155H_TAG, i8155_device, io_r, io_w) |
| 181 | // AM_RANGE(0x10, 0x17) aux1 |
| 182 | // AM_RANGE(0x18, 0x1f) aux2 |
| 183 | // AM_RANGE(0x20, 0x27) port0 |
| 184 | // AM_RANGE(0x28, 0x2f) port1 |
| 185 | // AM_RANGE(0x30, 0x37) port2 |
| 186 | // AM_RANGE(0x38, 0x3f) port3 |
| 187 | ADDRESS_MAP_END |
| 188 | |
| 189 | |
| 190 | |
| 191 | //************************************************************************** |
| 192 | // INPUT PORTS |
| 193 | //************************************************************************** |
| 194 | |
| 195 | //------------------------------------------------- |
| 196 | // INPUT_PORTS( vixen ) |
| 197 | //------------------------------------------------- |
| 198 | |
| 199 | INPUT_PORTS_START( vixen ) |
| 200 | PORT_START("ROW0") |
| 201 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 202 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 203 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 204 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 205 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 206 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 207 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 208 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 209 | |
| 210 | PORT_START("ROW1") |
| 211 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 212 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 213 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 214 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 215 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 216 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 217 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 218 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 219 | |
| 220 | PORT_START("ROW2") |
| 221 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 222 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 223 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 224 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 225 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 226 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 227 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 228 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 229 | |
| 230 | PORT_START("ROW3") |
| 231 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 232 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 233 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 234 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 235 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 236 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 237 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 238 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 239 | |
| 240 | PORT_START("ROW4") |
| 241 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 242 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 243 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 244 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 245 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 246 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 247 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 248 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 249 | |
| 250 | PORT_START("ROW5") |
| 251 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 252 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 253 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 254 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 255 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 256 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 257 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 258 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 259 | |
| 260 | PORT_START("ROW6") |
| 261 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 262 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 263 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 264 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 265 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 266 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 267 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 268 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 269 | |
| 270 | PORT_START("ROW7") |
| 271 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 272 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 273 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 274 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 275 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 276 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 277 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 278 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 279 | INPUT_PORTS_END |
| 280 | |
| 281 | |
| 282 | |
| 283 | //************************************************************************** |
| 284 | // VIDEO |
| 285 | //************************************************************************** |
| 286 | |
| 287 | //------------------------------------------------- |
| 288 | // VIDEO_START( vixenc ) |
| 289 | //------------------------------------------------- |
| 290 | |
| 291 | void vixen_state::video_start() |
| 292 | { |
| 293 | // find memory regions |
| 294 | m_sync_rom = machine->region("video")->base(); |
| 295 | m_char_rom = machine->region("chargen")->base(); |
| 296 | |
| 297 | // register for state saving |
| 298 | state_save_register_global(machine, m_alt); |
| 299 | state_save_register_global(machine, m_256); |
| 300 | state_save_register_global(machine, m_vsync); |
| 301 | state_save_register_global_pointer(machine, m_video_ram, 0x1000); |
| 302 | } |
| 303 | |
| 304 | |
| 305 | //------------------------------------------------- |
| 306 | // VIDEO_UPDATE( vixen ) |
| 307 | //------------------------------------------------- |
| 308 | |
| 309 | bool vixen_state::video_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect) |
| 310 | { |
| 311 | for (int txadr = 0; txadr < 27; txadr++) |
| 312 | { |
| 313 | for (int scan = 0; scan < 16; scan++) |
| 314 | { |
| 315 | for (int chadr = 0; chadr < 128; chadr++) |
| 316 | { |
| 317 | UINT16 sync_addr = (txadr << 7) | chadr; |
| 318 | UINT8 sync_data = m_sync_rom[sync_addr]; |
| 319 | int blank = BIT(sync_data, 4); |
| 320 | /* |
| 321 | int clrchadr = BIT(sync_data, 7); |
| 322 | int hsync = BIT(sync_data, 6); |
| 323 | int clrtxadr = BIT(sync_data, 5); |
| 324 | int vsync = BIT(sync_data, 3); |
| 325 | int comp_sync = BIT(sync_data, 2); |
| 326 | |
| 327 | logerror("SYNC %03x:%02x TXADR %u SCAN %u CHADR %u : COMPSYNC %u VSYNC %u BLANK %u CLRTXADR %u HSYNC %u CLRCHADR %u\n", |
| 328 | sync_addr,sync_data,txadr,scan,chadr,comp_sync,vsync,blank,clrtxadr,hsync,clrchadr); |
| 329 | */ |
| 330 | |
| 331 | int reverse = 0; |
| 332 | int y = (txadr << 4) | scan; |
| 333 | |
| 334 | UINT16 video_addr = chadr + txadr * 40; |
| 335 | UINT8 video_data = m_video_ram[video_addr]; |
| 336 | UINT16 char_addr = 0; |
| 337 | |
| 338 | if (m_256) |
| 339 | { |
| 340 | char_addr = (BIT(video_data, 7) << 11) | (scan << 7) | (video_data & 0x7f); |
| 341 | reverse = m_alt; |
| 342 | } |
| 343 | else |
| 344 | { |
| 345 | char_addr = (scan << 7) | (video_data & 0x7f); |
| 346 | reverse = BIT(video_data, 7); |
| 347 | } |
| 348 | |
| 349 | UINT8 char_data = m_char_rom[char_addr]; |
| 350 | |
| 351 | for (int x = 0; x < 8; x++) |
| 352 | { |
| 353 | int color = (BIT(char_data, 7 - x) ^ reverse) & !blank; |
| 354 | |
| 355 | *BITMAP_ADDR16(&bitmap, y, chadr * 8 + x) = color; |
| 356 | } |
| 357 | } |
| 358 | } |
| 359 | } |
| 360 | |
| 361 | return 0; |
| 362 | } |
| 363 | |
| 364 | |
| 365 | |
| 366 | //************************************************************************** |
| 367 | // VIDEO |
| 368 | //************************************************************************** |
| 369 | |
| 370 | //------------------------------------------------- |
| 371 | // DISCRETE_SOUND( vixen ) |
| 372 | //------------------------------------------------- |
| 373 | |
| 374 | static DISCRETE_SOUND_START( vixen ) |
| 375 | DISCRETE_INPUT_LOGIC(NODE_01) |
| 376 | DISCRETE_SQUAREWAVE(NODE_02, NODE_01, XTAL_23_9616MHz/15360, 100, 50, 0, 90) |
| 377 | DISCRETE_OUTPUT(NODE_02, 5000) |
| 378 | DISCRETE_SOUND_END |
| 379 | |
| 380 | |
| 381 | |
| 382 | //************************************************************************** |
| 383 | // DEVICE CONFIGURATION |
| 384 | //************************************************************************** |
| 385 | |
| 386 | //------------------------------------------------- |
| 387 | // I8155_INTERFACE( i8155_intf ) |
| 388 | //------------------------------------------------- |
| 389 | |
| 390 | READ8_MEMBER( vixen_state::i8155_pa_r ) |
| 391 | { |
| 392 | UINT8 data = 0xff; |
| 393 | |
| 394 | if (!BIT(m_col, 0)) data &= input_port_read(machine, "ROW0"); |
| 395 | if (!BIT(m_col, 1)) data &= input_port_read(machine, "ROW1"); |
| 396 | if (!BIT(m_col, 2)) data &= input_port_read(machine, "ROW2"); |
| 397 | if (!BIT(m_col, 3)) data &= input_port_read(machine, "ROW3"); |
| 398 | if (!BIT(m_col, 4)) data &= input_port_read(machine, "ROW4"); |
| 399 | if (!BIT(m_col, 5)) data &= input_port_read(machine, "ROW5"); |
| 400 | if (!BIT(m_col, 6)) data &= input_port_read(machine, "ROW6"); |
| 401 | if (!BIT(m_col, 7)) data &= input_port_read(machine, "ROW7"); |
| 402 | |
| 403 | return data; |
| 404 | } |
| 405 | |
| 406 | WRITE8_MEMBER( vixen_state::i8155_pb_w ) |
| 407 | { |
| 408 | m_col = data; |
| 409 | } |
| 410 | |
| 411 | WRITE8_MEMBER( vixen_state::i8155_pc_w ) |
| 412 | { |
| 413 | /* |
| 414 | |
| 415 | bit description |
| 416 | |
| 417 | 0 DSEL1 |
| 418 | 1 DSEL2 |
| 419 | 2 DDEN |
| 420 | 3 ALT CHARSET |
| 421 | 4 256 CHARS |
| 422 | 5 BEEP ENB |
| 423 | 6 |
| 424 | 7 |
| 425 | |
| 426 | */ |
| 427 | |
| 428 | // drive select |
| 429 | wd17xx_set_drive(m_fdc, data & 0x03); |
| 430 | |
| 431 | // density select |
| 432 | wd17xx_dden_w(m_fdc, BIT(data, 2)); |
| 433 | |
| 434 | // charset |
| 435 | m_alt = BIT(data, 3); |
| 436 | m_256 = BIT(data, 4); |
| 437 | |
| 438 | // beep enable |
| 439 | discrete_sound_w(m_discrete, NODE_01, !BIT(data, 5)); |
| 440 | } |
| 441 | |
| 442 | static I8155_INTERFACE( i8155_intf ) |
| 443 | { |
| 444 | DEVCB_DRIVER_MEMBER(vixen_state, i8155_pa_r), |
| 445 | DEVCB_NULL, |
| 446 | DEVCB_NULL, |
| 447 | DEVCB_DRIVER_MEMBER(vixen_state, i8155_pb_w), |
| 448 | DEVCB_NULL, |
| 449 | DEVCB_DRIVER_MEMBER(vixen_state, i8155_pc_w), |
| 450 | DEVCB_NULL |
| 451 | }; |
| 452 | |
| 453 | |
| 454 | //------------------------------------------------- |
| 455 | // wd17xx_interface fdc_intf |
| 456 | //------------------------------------------------- |
| 457 | |
| 458 | WRITE_LINE_MEMBER( vixen_state::fdint_w ) |
| 459 | { |
| 460 | m_fdint = state; |
| 461 | update_interrupt(); |
| 462 | } |
| 463 | |
| 464 | static const floppy_config vixen_floppy_config = |
| 465 | { |
| 466 | DEVCB_NULL, |
| 467 | DEVCB_NULL, |
| 468 | DEVCB_NULL, |
| 469 | DEVCB_NULL, |
| 470 | DEVCB_NULL, |
| 471 | FLOPPY_STANDARD_5_25_SSDD_40, |
| 472 | FLOPPY_OPTIONS_NAME(default), |
| 473 | NULL |
| 474 | }; |
| 475 | |
| 476 | static const wd17xx_interface fdc_intf = |
| 477 | { |
| 478 | DEVCB_NULL, |
| 479 | DEVCB_DRIVER_LINE_MEMBER(vixen_state, fdint_w), |
| 480 | DEVCB_NULL, |
| 481 | { FLOPPY_0, FLOPPY_1, NULL, NULL } |
| 482 | }; |
| 483 | |
| 484 | |
| 485 | |
| 486 | //************************************************************************** |
| 487 | // MACHINE INITIALIZATION |
| 488 | //************************************************************************** |
| 489 | |
| 490 | //------------------------------------------------- |
| 491 | // MACHINE_START( vixen ) |
| 492 | //------------------------------------------------- |
| 493 | |
| 494 | void vixen_state::machine_start() |
| 495 | { |
| 496 | // configure memory banking |
| 497 | memory_configure_bank(machine, "bank1", 0, 1, m_video_ram, 0); |
| 498 | memory_configure_bank(machine, "bank1", 1, 1, machine->region(Z8400A_TAG)->base(), 0); |
| 499 | memory_configure_bank(machine, "bank2", 0, 1, m_video_ram, 0); |
| 500 | memory_set_bank(machine, "bank2", 0); |
| 501 | |
| 502 | // register for state saving |
| 503 | state_save_register_global(machine, m_reset); |
| 504 | state_save_register_global(machine, m_col); |
| 505 | state_save_register_global(machine, m_cmd); |
| 506 | state_save_register_global(machine, m_fdint); |
| 507 | } |
| 508 | |
| 509 | |
| 510 | //------------------------------------------------- |
| 511 | // MACHINE_RESET( vixen ) |
| 512 | //------------------------------------------------- |
| 513 | |
| 514 | void vixen_state::machine_reset() |
| 515 | { |
| 516 | memory_set_bank(machine, "bank1", 1); |
| 517 | |
| 518 | m_reset = 1; |
| 519 | } |
| 520 | |
| 521 | |
| 522 | |
| 523 | //************************************************************************** |
| 524 | // MACHINE CONFIGURATION |
| 525 | //************************************************************************** |
| 526 | |
| 527 | //------------------------------------------------- |
| 528 | // MACHINE_CONFIG( vixen ) |
| 529 | //------------------------------------------------- |
| 530 | |
| 531 | static MACHINE_CONFIG_START( vixen, vixen_state ) |
| 532 | // basic machine hardware |
| 533 | MCFG_CPU_ADD(Z8400A_TAG, Z80, XTAL_23_9616MHz/6) |
| 534 | MCFG_CPU_PROGRAM_MAP(vixen_mem) |
| 535 | MCFG_CPU_IO_MAP(vixen_io) |
| 536 | |
| 537 | // video hardware |
| 538 | MCFG_SCREEN_ADD(SCREEN_TAG, RASTER) |
| 539 | MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) |
| 540 | MCFG_SCREEN_RAW_PARAMS(XTAL_23_9616MHz/2, 96*8, 0*8, 81*8, 27*16, 0*16, 26*16) |
| 541 | |
| 542 | MCFG_PALETTE_LENGTH(2) |
| 543 | MCFG_PALETTE_INIT(monochrome_amber) |
| 544 | |
| 545 | // sound hardware |
| 546 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 547 | MCFG_SOUND_ADD(DISCRETE_TAG, DISCRETE, 0) |
| 548 | MCFG_SOUND_CONFIG_DISCRETE(vixen) |
| 549 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) |
| 550 | |
| 551 | // devices |
| 552 | MCFG_I8155_ADD(P8155H_TAG, XTAL_23_9616MHz/6, i8155_intf) |
| 553 | MCFG_WD179X_ADD(FDC1797_TAG, fdc_intf) |
| 554 | MCFG_FLOPPY_2_DRIVES_ADD(vixen_floppy_config) |
| 555 | |
| 556 | // internal ram |
| 557 | MCFG_RAM_ADD("messram") |
| 558 | MCFG_RAM_DEFAULT_SIZE("64K") |
| 559 | MACHINE_CONFIG_END |
| 560 | |
| 561 | |
| 562 | |
| 563 | //************************************************************************** |
| 564 | // ROMS |
| 565 | //************************************************************************** |
| 566 | |
| 567 | //------------------------------------------------- |
| 568 | // ROM( vixen ) |
| 569 | //------------------------------------------------- |
| 570 | |
| 571 | ROM_START( vixen ) |
| 572 | ROM_REGION( 0x1000, Z8400A_TAG, 0 ) |
| 573 | ROM_LOAD( "osborne 4 mon rom v1.04 3p40082-03 a0a9.4c", 0x0000, 0x1000, CRC(5f1038ce) SHA1(e6809fac23650bbb4689e58edc768d917d80a2df) ) // OSBORNE 4 MON ROM / V1.04 3P40082-03 / A0A9 (c) OCC 1985 |
| 574 | |
| 575 | ROM_REGION( 0x1000, "video", 0 ) |
| 576 | ROM_LOAD( "v1.10.3j", 0x0000, 0x1000, CRC(1f93e2d7) SHA1(0c479bfd3ac8d9959c285c020d0096930a9c6867) ) |
| 577 | |
| 578 | ROM_REGION( 0x1000, "chargen", 0 ) |
| 579 | ROM_LOAD( "v1.00 l.1j", 0x0000, 0x1000, CRC(f97c50d9) SHA1(39f73afad68508c4b8a4d241c064f9978098d8f2) ) |
| 580 | ROM_END |
| 581 | |
| 582 | |
| 583 | |
| 584 | //************************************************************************** |
| 585 | // DRIVER INITIALIZATION |
| 586 | //************************************************************************** |
| 587 | |
| 588 | //------------------------------------------------- |
| 589 | // DRIVER_INIT( vixen ) |
| 590 | //------------------------------------------------- |
| 591 | /* |
| 592 | DIRECT_UPDATE_HANDLER( vixen_direct_update_handler ) |
| 593 | { |
| 594 | vixen_state *state = machine->driver_data<vixen_state>(); |
| 595 | |
| 596 | if (state->m_reset) |
| 597 | { |
| 598 | direct.explicit_configure(0x0000, 0xffff, 0x10000, machine->region(Z8400A_TAG)->base()); |
| 599 | state->m_reset = 0; |
| 600 | |
| 601 | return ~0; |
| 602 | } |
| 603 | |
| 604 | return address; |
| 605 | } |
| 606 | |
| 607 | static DRIVER_INIT( vixen ) |
| 608 | { |
| 609 | address_space *program = machine->device<cpu_device>(Z8400A_TAG)->space(AS_PROGRAM); |
| 610 | program->set_direct_update_handler(direct_update_delegate_create_static(vixen_direct_update_handler, *machine)); |
| 611 | } |
| 612 | */ |
| 613 | |
| 614 | |
| 615 | //************************************************************************** |
| 616 | // SYSTEM DRIVERS |
| 617 | //************************************************************************** |
| 618 | |
| 619 | // YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS |
| 620 | COMP( 1984, vixen, 0, 0, vixen, vixen, 0, "Osborne", "Vixen", GAME_NOT_WORKING ) |