src/mess/video/hd61830.c
| r9328 | r9329 | |
| 12 | 12 | TODO: |
| 13 | 13 | |
| 14 | 14 | - external ROM |
| 15 | | - text mode |
| 16 | | |
| 15 | - slave mode |
| 16 | |
| 17 | 17 | */ |
| 18 | 18 | |
| 19 | 19 | #include "emu.h" |
| r9328 | r9329 | |
| 38 | 38 | HD61830_INSTRUCTION_CURSOR_ADDRESS_HIGH, |
| 39 | 39 | HD61830_INSTRUCTION_DISPLAY_DATA_WRITE, |
| 40 | 40 | HD61830_INSTRUCTION_DISPLAY_DATA_READ, |
| 41 | | HD61830_INSTRUCTION_CLEAR_BIT, /* not supported */ |
| 42 | | HD61830_INSTRUCTION_SET_BIT /* not supported */ |
| 41 | HD61830_INSTRUCTION_CLEAR_BIT, |
| 42 | HD61830_INSTRUCTION_SET_BIT |
| 43 | 43 | }; |
| 44 | 44 | |
| 45 | 45 | static const int HD61830_CYCLES[] = { |
| r9328 | r9329 | |
| 47 | 47 | }; |
| 48 | 48 | |
| 49 | 49 | #define HD61830_MODE_EXTERNAL_CG 0x01 /* not supported */ |
| 50 | | #define HD61830_MODE_GRAPHIC 0x02 /* text mode not supported */ |
| 51 | | #define HD61830_MODE_CURSOR 0x04 /* not supported */ |
| 52 | | #define HD61830_MODE_BLINK 0x08 /* not supported */ |
| 50 | #define HD61830_MODE_GRAPHIC 0x02 |
| 51 | #define HD61830_MODE_CURSOR 0x04 |
| 52 | #define HD61830_MODE_BLINK 0x08 |
| 53 | 53 | #define HD61830_MODE_MASTER 0x10 /* not supported */ |
| 54 | 54 | #define HD61830_MODE_DISPLAY_ON 0x20 |
| 55 | 55 | |
| r9328 | r9329 | |
| 60 | 60 | typedef struct _hd61830_t hd61830_t; |
| 61 | 61 | struct _hd61830_t |
| 62 | 62 | { |
| 63 | | address_space *space; /* memory space */ |
| 63 | address_space *ram; /* video RAM memory space */ |
| 64 | address_space *rom; /* character ROM memory space */ |
| 64 | 65 | |
| 65 | 66 | int bf; /* busy flag */ |
| 66 | 67 | |
| r9328 | r9329 | |
| 77 | 78 | int nx; /* number of time divisions */ |
| 78 | 79 | int cp; /* cursor position */ |
| 79 | 80 | |
| 80 | | int blink; /* blinking */ |
| 81 | UINT8 blink; /* blinking */ |
| 81 | 82 | |
| 82 | 83 | /* devices */ |
| 83 | 84 | screen_device *screen; |
| r9328 | r9329 | |
| 169 | 170 | |
| 170 | 171 | if (LOG) logerror("HD61380 '%s' Display Data Read %02x\n", device->tag(), hd61830->dor); |
| 171 | 172 | |
| 172 | | hd61830->dor = hd61830->space->read_byte(hd61830->cac); |
| 173 | hd61830->dor = hd61830->ram->read_byte(hd61830->cac); |
| 173 | 174 | |
| 174 | 175 | hd61830->cac++; |
| 175 | 176 | |
| r9328 | r9329 | |
| 183 | 184 | WRITE8_DEVICE_HANDLER( hd61830_data_w ) |
| 184 | 185 | { |
| 185 | 186 | hd61830_t *hd61830 = get_safe_token(device); |
| 187 | |
| 186 | 188 | switch (hd61830->ir) |
| 187 | 189 | { |
| 188 | 190 | case HD61830_INSTRUCTION_MODE_CONTROL: |
| r9328 | r9329 | |
| 257 | 259 | break; |
| 258 | 260 | |
| 259 | 261 | case HD61830_INSTRUCTION_DISPLAY_DATA_WRITE: |
| 260 | | hd61830->space->write_byte(hd61830->cac, data); |
| 262 | hd61830->ram->write_byte(hd61830->cac, data); |
| 261 | 263 | |
| 262 | 264 | if (LOG) logerror("HD61380 '%s' Display Data Write %02x -> %04x row %u col %u\n", device->tag(), data, hd61830->cac, hd61830->cac / 40, hd61830->cac % 40); |
| 263 | 265 | |
| r9328 | r9329 | |
| 267 | 269 | case HD61830_INSTRUCTION_CLEAR_BIT: |
| 268 | 270 | { |
| 269 | 271 | int nb = data & 0x07; |
| 270 | | UINT8 data_ = hd61830->space->read_byte(hd61830->cac); |
| 272 | UINT8 data_ = hd61830->ram->read_byte(hd61830->cac); |
| 271 | 273 | |
| 272 | 274 | data_ &= ~(2 << nb); |
| 273 | 275 | |
| 274 | 276 | if (LOG) logerror("HD61380 '%s' Clear Bit %u at %04x\n", device->tag(), nb + 1, hd61830->cac); |
| 275 | 277 | |
| 276 | | hd61830->space->write_byte(hd61830->cac, data_); |
| 278 | hd61830->ram->write_byte(hd61830->cac, data_); |
| 277 | 279 | |
| 278 | 280 | hd61830->cac++; |
| 279 | 281 | } |
| r9328 | r9329 | |
| 282 | 284 | case HD61830_INSTRUCTION_SET_BIT: |
| 283 | 285 | { |
| 284 | 286 | int nb = data & 0x07; |
| 285 | | UINT8 data_ = hd61830->space->read_byte(hd61830->cac); |
| 287 | UINT8 data_ = hd61830->ram->read_byte(hd61830->cac); |
| 286 | 288 | |
| 287 | 289 | data_ |= 2 << nb; |
| 288 | 290 | |
| 289 | 291 | if (LOG) logerror("HD61380 '%s' Set Bit %u at %04x\n", device->tag(), nb + 1, hd61830->cac); |
| 290 | 292 | |
| 291 | | hd61830->space->write_byte(hd61830->cac, data_); |
| 293 | hd61830->ram->write_byte(hd61830->cac, data_); |
| 292 | 294 | |
| 293 | 295 | hd61830->cac++; |
| 294 | 296 | } |
| r9328 | r9329 | |
| 310 | 312 | static void draw_scanline(running_device *device, bitmap_t *bitmap, const rectangle *cliprect, int y, UINT16 ra) |
| 311 | 313 | { |
| 312 | 314 | hd61830_t *hd61830 = get_safe_token(device); |
| 313 | | int sx, x; |
| 314 | 315 | |
| 315 | | for (sx = 0; sx < hd61830->hn; sx++) |
| 316 | for (int sx = 0; sx < hd61830->hn; sx++) |
| 316 | 317 | { |
| 317 | | UINT8 data = hd61830->space->read_byte(ra++); |
| 318 | UINT8 data = hd61830->ram->read_byte(ra++); |
| 318 | 319 | |
| 319 | | for (x = 0; x < hd61830->hp; x++) |
| 320 | for (int x = 0; x < hd61830->hp; x++) |
| 320 | 321 | { |
| 321 | 322 | *BITMAP_ADDR16(bitmap, y, (sx * hd61830->hp) + x) = BIT(data, 0); |
| 322 | 323 | data >>= 1; |
| r9328 | r9329 | |
| 331 | 332 | static void update_graphics(running_device *device, bitmap_t *bitmap, const rectangle *cliprect) |
| 332 | 333 | { |
| 333 | 334 | hd61830_t *hd61830 = get_safe_token(device); |
| 334 | | int y; |
| 335 | 335 | |
| 336 | | for (y = 0; y < hd61830->nx; y++) |
| 336 | for (int y = 0; y < hd61830->nx; y++) |
| 337 | 337 | { |
| 338 | 338 | UINT16 rac1 = hd61830->dsa + (y * hd61830->hn); |
| 339 | 339 | UINT16 rac2 = rac1 + (hd61830->nx * hd61830->hn); |
| r9328 | r9329 | |
| 357 | 357 | if (char_code < 0x20 || char_code > 0x7f) |
| 358 | 358 | return; |
| 359 | 359 | |
| 360 | | for(int cl = 0; cl < 7; cl++) |
| 360 | for (int cl = 0; cl < 7; cl++) |
| 361 | 361 | { |
| 362 | | for(int cr = 0; cr < 5; cr++) |
| 362 | for (int cr = 0; cr < 5; cr++) |
| 363 | 363 | { |
| 364 | | if (hd61830->screen->height() > y * hd61830->vp + cl && hd61830->screen->width() > x * hd61830->hp + cr ) |
| 364 | if ((hd61830->screen->height() > y * hd61830->vp + cl) && (hd61830->screen->width() > x * hd61830->hp + cr)) |
| 365 | { |
| 365 | 366 | *BITMAP_ADDR16(bitmap, y * hd61830->vp + cl, x * hd61830->hp + cr) = device->subregion("hd61830")->u8(((char_code - 0x20) * 7 + cl)) & (1<<(4 - cr)) ? 1 : 0; |
| 367 | } |
| 366 | 368 | } |
| 367 | 369 | } |
| 368 | 370 | } |
| r9328 | r9329 | |
| 375 | 377 | { |
| 376 | 378 | hd61830_t *hd61830 = get_safe_token(device); |
| 377 | 379 | |
| 378 | | if (hd61830->blink < 0xff) |
| 379 | | hd61830->blink++; |
| 380 | | else |
| 381 | | hd61830->blink = 0; |
| 380 | hd61830->blink++; |
| 382 | 381 | |
| 383 | | for(int y = 0; y < 8; y++) |
| 384 | | for(int x = 0; x < hd61830->hn; x++) |
| 382 | for (int y = 0; y < 8; y++) |
| 383 | { |
| 384 | for (int x = 0; x < hd61830->hn; x++) |
| 385 | 385 | { |
| 386 | | UINT8 char_code = hd61830->space->read_byte(y * hd61830->hn + x); |
| 386 | UINT8 char_code = hd61830->ram->read_byte(y * hd61830->hn + x); |
| 387 | 387 | |
| 388 | 388 | if (hd61830->cac == y * hd61830->hn + x) |
| 389 | 389 | { |
| 390 | 390 | /* update cursor */ |
| 391 | 391 | switch ((hd61830->mcr >> 2) & 0x03) |
| 392 | 392 | { |
| 393 | | case 0: //cursor OFF |
| 393 | case 0: //cursor OFF |
| 394 | draw_char(device, bitmap, cliprect, x, y, char_code); |
| 395 | break; |
| 396 | |
| 397 | case 1: //cursor ON |
| 398 | if (hd61830->blink & 0x20) |
| 399 | { |
| 400 | for(int cr = 0; cr < hd61830->hp; cr++) |
| 401 | { |
| 402 | *BITMAP_ADDR16(bitmap, y * hd61830->vp + (hd61830->cp - 1), x * hd61830->hp + cr) = 1; |
| 403 | } |
| 404 | } |
| 405 | else |
| 406 | { |
| 394 | 407 | draw_char(device, bitmap, cliprect, x, y, char_code); |
| 395 | | break; |
| 396 | | case 1: //cursor ON |
| 397 | | if (hd61830->blink & 0x20) |
| 398 | | for(int cr = 0; cr < hd61830->hp; cr++) |
| 399 | | *BITMAP_ADDR16(bitmap, y * hd61830->vp + (hd61830->cp - 1), x * hd61830->hp + cr) = 1; |
| 400 | | else |
| 401 | | draw_char(device, bitmap, cliprect, x, y, char_code); |
| 402 | | break; |
| 403 | | case 2: //cursor OFF character blink |
| 404 | | case 3: //cursor blank |
| 405 | | if (hd61830->blink & 0x20) |
| 406 | | draw_char(device, bitmap, cliprect, x, y, 0x20); |
| 407 | | else |
| 408 | | draw_char(device, bitmap, cliprect, x, y, char_code); |
| 409 | | break; |
| 408 | } |
| 409 | break; |
| 410 | |
| 411 | case 2: //cursor OFF character blink |
| 412 | case 3: //cursor blank |
| 413 | if (hd61830->blink & 0x20) |
| 414 | { |
| 415 | draw_char(device, bitmap, cliprect, x, y, 0x20); |
| 416 | } |
| 417 | else |
| 418 | { |
| 419 | draw_char(device, bitmap, cliprect, x, y, char_code); |
| 420 | } |
| 421 | break; |
| 410 | 422 | } |
| 411 | 423 | } |
| 412 | 424 | else |
| 425 | { |
| 413 | 426 | draw_char(device, bitmap, cliprect, x, y, char_code); |
| 427 | } |
| 414 | 428 | } |
| 429 | } |
| 415 | 430 | } |
| 416 | 431 | |
| 417 | 432 | /*------------------------------------------------- |
| r9328 | r9329 | |
| 464 | 479 | ADDRESS_MAP( hd61830 ) |
| 465 | 480 | -------------------------------------------------*/ |
| 466 | 481 | |
| 467 | | static ADDRESS_MAP_START( hd61380, 0, 8 ) |
| 482 | static ADDRESS_MAP_START( hd61380_ram, 0, 8 ) |
| 468 | 483 | AM_RANGE(0x0000, 0xffff) AM_RAM |
| 469 | 484 | ADDRESS_MAP_END |
| 470 | 485 | |
| 486 | static ADDRESS_MAP_START( hd61380_rom, 1, 8 ) |
| 487 | AM_RANGE(0x0000, 0xffff) AM_UNMAP |
| 488 | ADDRESS_MAP_END |
| 489 | |
| 471 | 490 | /*------------------------------------------------- |
| 472 | 491 | DEVICE_START( hd61830 ) |
| 473 | 492 | -------------------------------------------------*/ |
| r9328 | r9329 | |
| 481 | 500 | hd61830->screen = device->machine->device<screen_device>(config->screen_tag); |
| 482 | 501 | assert(hd61830->screen != NULL); |
| 483 | 502 | |
| 484 | | hd61830->space = device_get_space(device, ADDRESS_SPACE_0); |
| 503 | hd61830->ram = device_get_space(device, ADDRESS_SPACE_0); |
| 504 | hd61830->rom = device_get_space(device, ADDRESS_SPACE_1); |
| 485 | 505 | |
| 486 | 506 | /* create the busy timer */ |
| 487 | 507 | hd61830->busy_timer = timer_alloc(device->machine, busy_tick, (void *)device); |
| r9328 | r9329 | |
| 490 | 510 | state_save_register_device_item(device, 0, hd61830->bf); |
| 491 | 511 | state_save_register_device_item(device, 0, hd61830->ir); |
| 492 | 512 | state_save_register_device_item(device, 0, hd61830->mcr); |
| 493 | | state_save_register_device_item(device, 0, hd61830->dor); |
| 513 | state_save_register_device_item(device, 0, hd61830->dor); |
| 494 | 514 | state_save_register_device_item(device, 0, hd61830->cac); |
| 495 | 515 | state_save_register_device_item(device, 0, hd61830->dsa); |
| 496 | 516 | state_save_register_device_item(device, 0, hd61830->vp); |
| r9328 | r9329 | |
| 526 | 546 | case DEVINFO_INT_DATABUS_WIDTH_0: info->i = 8; break; |
| 527 | 547 | case DEVINFO_INT_ADDRBUS_WIDTH_0: info->i = 16; break; |
| 528 | 548 | case DEVINFO_INT_ADDRBUS_SHIFT_0: info->i = 0; break; |
| 549 | case DEVINFO_INT_DATABUS_WIDTH_1: info->i = 8; break; |
| 550 | case DEVINFO_INT_ADDRBUS_WIDTH_1: info->i = 16; break; |
| 551 | case DEVINFO_INT_ADDRBUS_SHIFT_1: info->i = 0; break; |
| 529 | 552 | |
| 530 | 553 | /* --- the following bits of info are returned as pointers --- */ |
| 531 | 554 | case DEVINFO_PTR_ROM_REGION: info->romregion = ROM_NAME(hd61830); break; |
| 532 | 555 | |
| 533 | 556 | /* --- the following bits of info are returned as pointers to data --- */ |
| 534 | | case DEVINFO_PTR_DEFAULT_MEMORY_MAP_0: info->default_map8 = ADDRESS_MAP_NAME(hd61380); break; |
| 557 | case DEVINFO_PTR_DEFAULT_MEMORY_MAP_0: info->default_map8 = ADDRESS_MAP_NAME(hd61380_ram); break; |
| 558 | case DEVINFO_PTR_DEFAULT_MEMORY_MAP_1: info->default_map8 = ADDRESS_MAP_NAME(hd61380_rom); break; |
| 535 | 559 | |
| 536 | 560 | /* --- the following bits of info are returned as pointers to functions --- */ |
| 537 | 561 | case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(hd61830); break; |
src/mess/drivers/portfoli.c
| r9328 | r9329 | |
| 5 | 5 | http://portfolio.wz.cz/ |
| 6 | 6 | http://www.pofowiki.de/doku.php |
| 7 | 7 | http://www.best-electronics-ca.com/portfoli.htm |
| 8 | http://www.atari-portfolio.co.uk/pfnews/pf9.txt |
| 8 | 9 | |
| 9 | | */ |
| 10 | | |
| 11 | | /* |
| 12 | | |
| 13 | 10 | Undumped cartridges: |
| 14 | 11 | |
| 15 | 12 | Utility-Card HPC-701 |
| r9328 | r9329 | |
| 32 | 29 | |
| 33 | 30 | TODO: |
| 34 | 31 | |
| 35 | | - ERROR: Low Battery |
| 36 | | - main RAM is non-volatile |
| 32 | - boot is always cold |
| 33 | - memory error interrupt vector |
| 34 | - i/o port 8051 |
| 37 | 35 | - screen contrast |
| 38 | | - interrupts |
| 39 | | - system tick |
| 36 | - system tick frequency selection (1 or 128 Hz) |
| 40 | 37 | - speaker |
| 41 | 38 | - serial interface |
| 42 | 39 | - parallel interface |
| 43 | | - credit card memory |
| 40 | - credit card memory (A:/B:) |
| 41 | - software list |
| 44 | 42 | |
| 45 | 43 | */ |
| 46 | 44 | |
| r9328 | r9329 | |
| 53 | 51 | #include "machine/ctronics.h" |
| 54 | 52 | #include "machine/i8255a.h" |
| 55 | 53 | #include "machine/ins8250.h" |
| 54 | #include "machine/nvram.h" |
| 56 | 55 | #include "sound/speaker.h" |
| 57 | 56 | #include "video/hd61830.h" |
| 58 | 57 | |
| 58 | //************************************************************************** |
| 59 | // MACROS / CONSTANTS |
| 60 | //************************************************************************** |
| 61 | |
| 62 | enum |
| 63 | { |
| 64 | INT_TICK = 0, |
| 65 | INT_KEYBOARD, |
| 66 | INT_ERROR, |
| 67 | INT_EXTERNAL |
| 68 | }; |
| 69 | |
| 70 | static UINT8 INTERRUPT_VECTOR[] = { 0x08, 0x09, 0x00 }; |
| 71 | |
| 72 | //************************************************************************** |
| 73 | // INTERRUPTS |
| 74 | //************************************************************************** |
| 75 | |
| 76 | //------------------------------------------------- |
| 77 | // check_interrupt - check interrupt status |
| 78 | //------------------------------------------------- |
| 79 | |
| 80 | static void check_interrupt(running_machine *machine) |
| 81 | { |
| 82 | portfolio_state *state = machine->driver_data<portfolio_state>(); |
| 83 | |
| 84 | int level = (state->ip & state->ie) ? ASSERT_LINE : CLEAR_LINE; |
| 85 | |
| 86 | cputag_set_input_line(machine, M80C88A_TAG, INPUT_LINE_INT0, level); |
| 87 | } |
| 88 | |
| 89 | //------------------------------------------------- |
| 90 | // trigger_interrupt - trigger interrupt request |
| 91 | //------------------------------------------------- |
| 92 | |
| 93 | static void trigger_interrupt(running_machine *machine, int level) |
| 94 | { |
| 95 | portfolio_state *state = machine->driver_data<portfolio_state>(); |
| 96 | |
| 97 | // set interrupt pending bit |
| 98 | state->ip |= 1 << level; |
| 99 | |
| 100 | check_interrupt(machine); |
| 101 | } |
| 102 | |
| 103 | //------------------------------------------------- |
| 104 | // irq_mask_w - interrupt enable mask |
| 105 | //------------------------------------------------- |
| 106 | |
| 107 | static WRITE8_HANDLER( irq_mask_w ) |
| 108 | { |
| 109 | portfolio_state *state = space->machine->driver_data<portfolio_state>(); |
| 110 | |
| 111 | state->ie = data; |
| 112 | //logerror("IE %02x\n", data); |
| 113 | |
| 114 | check_interrupt(space->machine); |
| 115 | } |
| 116 | |
| 117 | //------------------------------------------------- |
| 118 | // sivr_w - serial interrupt vector register |
| 119 | //------------------------------------------------- |
| 120 | |
| 121 | static WRITE8_HANDLER( sivr_w ) |
| 122 | { |
| 123 | portfolio_state *state = space->machine->driver_data<portfolio_state>(); |
| 124 | |
| 125 | state->sivr = data; |
| 126 | } |
| 127 | |
| 128 | //------------------------------------------------- |
| 129 | // IRQ_CALLBACK( portfolio_int_ack ) |
| 130 | //------------------------------------------------- |
| 131 | |
| 132 | static IRQ_CALLBACK( portfolio_int_ack ) |
| 133 | { |
| 134 | portfolio_state *state = device->machine->driver_data<portfolio_state>(); |
| 135 | |
| 136 | UINT8 vector = state->sivr; |
| 137 | |
| 138 | for (int i = 0; i < 4; i++) |
| 139 | { |
| 140 | if (BIT(state->ip, i)) |
| 141 | { |
| 142 | // clear interrupt pending bit |
| 143 | state->ip &= ~(1 << i); |
| 144 | |
| 145 | if (i == 3) |
| 146 | vector = state->sivr; |
| 147 | else |
| 148 | vector = INTERRUPT_VECTOR[i]; |
| 149 | |
| 150 | break; |
| 151 | } |
| 152 | } |
| 153 | |
| 154 | check_interrupt(device->machine); |
| 155 | |
| 156 | return vector; |
| 157 | } |
| 158 | |
| 159 | //************************************************************************** |
| 160 | // KEYBOARD |
| 161 | //************************************************************************** |
| 162 | |
| 163 | //------------------------------------------------- |
| 164 | // scan_keyboard - scan keyboard |
| 165 | //------------------------------------------------- |
| 166 | |
| 167 | static void scan_keyboard(running_machine *machine) |
| 168 | { |
| 169 | portfolio_state *state = machine->driver_data<portfolio_state>(); |
| 170 | |
| 171 | UINT8 keycode = 0xff; |
| 172 | |
| 173 | static const char *const keynames[] = { "ROW0", "ROW1", "ROW2", "ROW3", "ROW4", "ROW5", "ROW6", "ROW7" }; |
| 174 | |
| 175 | for (int row = 0; row < 8; row++) |
| 176 | { |
| 177 | UINT8 data = input_port_read(machine, keynames[row]); |
| 178 | |
| 179 | if (data != 0xff) |
| 180 | { |
| 181 | for (int col = 0; col < 8; col++) |
| 182 | { |
| 183 | if (!BIT(data, col)) |
| 184 | { |
| 185 | keycode = (row * 8) + col; |
| 186 | } |
| 187 | } |
| 188 | } |
| 189 | } |
| 190 | |
| 191 | if (keycode != 0xff) |
| 192 | { |
| 193 | // key pressed |
| 194 | if (keycode != state->keylatch) |
| 195 | { |
| 196 | state->keylatch = keycode; |
| 197 | |
| 198 | trigger_interrupt(machine, INT_KEYBOARD); |
| 199 | } |
| 200 | } |
| 201 | else |
| 202 | { |
| 203 | // key released |
| 204 | if (state->keylatch != 0xff) |
| 205 | { |
| 206 | state->keylatch |= 0x80; |
| 207 | |
| 208 | trigger_interrupt(machine, INT_KEYBOARD); |
| 209 | } |
| 210 | } |
| 211 | } |
| 212 | |
| 213 | //------------------------------------------------- |
| 214 | // TIMER_DEVICE_CALLBACK( keyboard_tick ) |
| 215 | //------------------------------------------------- |
| 216 | |
| 217 | static TIMER_DEVICE_CALLBACK( keyboard_tick ) |
| 218 | { |
| 219 | scan_keyboard(timer.machine); |
| 220 | } |
| 221 | |
| 222 | //------------------------------------------------- |
| 223 | // keyboard_r - keyboard scan code register |
| 224 | //------------------------------------------------- |
| 225 | |
| 226 | static READ8_HANDLER( keyboard_r ) |
| 227 | { |
| 228 | portfolio_state *state = space->machine->driver_data<portfolio_state>(); |
| 229 | |
| 230 | return state->keylatch; |
| 231 | } |
| 232 | |
| 233 | //************************************************************************** |
| 234 | // INTERNAL SPEAKER |
| 235 | //************************************************************************** |
| 236 | |
| 237 | //------------------------------------------------- |
| 238 | // speaker_w - internal speaker output |
| 239 | //------------------------------------------------- |
| 240 | |
| 241 | static WRITE8_HANDLER( speaker_w ) |
| 242 | { |
| 243 | /* |
| 244 | |
| 245 | bit description |
| 246 | |
| 247 | 0 |
| 248 | 1 |
| 249 | 2 |
| 250 | 3 |
| 251 | 4 |
| 252 | 5 |
| 253 | 6 |
| 254 | 7 speaker level |
| 255 | |
| 256 | */ |
| 257 | |
| 258 | portfolio_state *state = space->machine->driver_data<portfolio_state>(); |
| 259 | |
| 260 | speaker_level_w(state->speaker, !BIT(data, 7)); |
| 261 | |
| 262 | //logerror("SPEAKER %02x\n", data); |
| 263 | } |
| 264 | |
| 265 | //************************************************************************** |
| 266 | // POWER MANAGEMENT |
| 267 | //************************************************************************** |
| 268 | |
| 269 | //------------------------------------------------- |
| 270 | // power_w - power management |
| 271 | //------------------------------------------------- |
| 272 | |
| 273 | static WRITE8_HANDLER( power_w ) |
| 274 | { |
| 275 | /* |
| 276 | |
| 277 | bit description |
| 278 | |
| 279 | 0 |
| 280 | 1 |
| 281 | 2 |
| 282 | 3 |
| 283 | 4 |
| 284 | 5 |
| 285 | 6 |
| 286 | 7 |
| 287 | |
| 288 | */ |
| 289 | |
| 290 | //logerror("POWER %02x\n", data); |
| 291 | } |
| 292 | |
| 293 | //------------------------------------------------- |
| 294 | // battery_r - battery status |
| 295 | //------------------------------------------------- |
| 296 | |
| 297 | static READ8_HANDLER( battery_r ) |
| 298 | { |
| 299 | /* |
| 300 | |
| 301 | bit description |
| 302 | |
| 303 | 0 |
| 304 | 1 |
| 305 | 2 |
| 306 | 3 |
| 307 | 4 |
| 308 | 5 |
| 309 | 6 0=battery low |
| 310 | 7 |
| 311 | |
| 312 | */ |
| 313 | |
| 314 | return 0xc2; |
| 315 | } |
| 316 | |
| 317 | //************************************************************************** |
| 318 | // SYSTEM TIMERS |
| 319 | //************************************************************************** |
| 320 | |
| 321 | //------------------------------------------------- |
| 322 | // TIMER_DEVICE_CALLBACK( system_tick ) |
| 323 | //------------------------------------------------- |
| 324 | |
| 325 | static TIMER_DEVICE_CALLBACK( system_tick ) |
| 326 | { |
| 327 | trigger_interrupt(timer.machine, INT_TICK); |
| 328 | } |
| 329 | |
| 330 | //------------------------------------------------- |
| 331 | // TIMER_DEVICE_CALLBACK( counter_tick ) |
| 332 | //------------------------------------------------- |
| 333 | |
| 334 | static TIMER_DEVICE_CALLBACK( counter_tick ) |
| 335 | { |
| 336 | portfolio_state *state = timer.machine->driver_data<portfolio_state>(); |
| 337 | |
| 338 | state->counter++; |
| 339 | } |
| 340 | |
| 341 | //------------------------------------------------- |
| 342 | // counter_r - counter register read |
| 343 | //------------------------------------------------- |
| 344 | |
| 345 | static READ8_HANDLER( counter_r ) |
| 346 | { |
| 347 | portfolio_state *state = space->machine->driver_data<portfolio_state>(); |
| 348 | |
| 349 | UINT8 data = 0; |
| 350 | |
| 351 | switch (offset) |
| 352 | { |
| 353 | case 0: |
| 354 | data = state->counter & 0xff; |
| 355 | break; |
| 356 | |
| 357 | case 1: |
| 358 | data = state->counter >> 1; |
| 359 | break; |
| 360 | } |
| 361 | |
| 362 | return data; |
| 363 | } |
| 364 | |
| 365 | //------------------------------------------------- |
| 366 | // counter_w - counter register write |
| 367 | //------------------------------------------------- |
| 368 | |
| 369 | static WRITE8_HANDLER( counter_w ) |
| 370 | { |
| 371 | portfolio_state *state = space->machine->driver_data<portfolio_state>(); |
| 372 | |
| 373 | switch (offset) |
| 374 | { |
| 375 | case 0: |
| 376 | state->counter = (state->counter & 0xff00) | data; |
| 377 | break; |
| 378 | |
| 379 | case 1: |
| 380 | state->counter = (data << 8) | (state->counter & 0xff); |
| 381 | break; |
| 382 | } |
| 383 | } |
| 384 | |
| 385 | //************************************************************************** |
| 386 | // EXPANSION |
| 387 | //************************************************************************** |
| 388 | |
| 389 | //------------------------------------------------- |
| 390 | // ncc1_w - credit card memory select |
| 391 | //------------------------------------------------- |
| 392 | |
| 59 | 393 | static WRITE8_HANDLER( ncc1_w ) |
| 60 | 394 | { |
| 61 | 395 | address_space *program = cputag_get_address_space(space->machine, M80C88A_TAG, ADDRESS_SPACE_PROGRAM); |
| r9328 | r9329 | |
| 71 | 405 | // credit card memory |
| 72 | 406 | memory_unmap_readwrite(program, 0xc0000, 0xdffff, 0, 0); |
| 73 | 407 | } |
| 408 | |
| 409 | //logerror("NCC %02x\n", data); |
| 74 | 410 | } |
| 75 | 411 | |
| 412 | //------------------------------------------------- |
| 413 | // pid_r - peripheral identification |
| 414 | //------------------------------------------------- |
| 415 | |
| 76 | 416 | static READ8_HANDLER( pid_r ) |
| 77 | 417 | { |
| 78 | 418 | /* |
| r9328 | r9329 | |
| 94 | 434 | return 0xff; |
| 95 | 435 | } |
| 96 | 436 | |
| 97 | | static WRITE8_HANDLER( sivr_w ) |
| 98 | | { |
| 99 | | portfolio_state *state = space->machine->driver_data<portfolio_state>(); |
| 437 | //************************************************************************** |
| 438 | // ADDRESS MAPS |
| 439 | //************************************************************************** |
| 100 | 440 | |
| 101 | | state->sivr = data; |
| 102 | | } |
| 441 | //------------------------------------------------- |
| 442 | // ADDRESS_MAP( portfolio_mem ) |
| 443 | //------------------------------------------------- |
| 103 | 444 | |
| 104 | 445 | static ADDRESS_MAP_START( portfolio_mem, ADDRESS_SPACE_PROGRAM, 8 ) |
| 105 | | AM_RANGE(0x00000, 0x3efff) AM_RAM |
| 106 | | AM_RANGE(0x3f000, 0x9efff) AM_RAM // expansion |
| 107 | | AM_RANGE(0xb0000, 0xb0fff) AM_MIRROR(0xf000) AM_RAM // video RAM |
| 446 | AM_RANGE(0x00000, 0x1efff) AM_RAM AM_SHARE("nvram1") |
| 447 | AM_RANGE(0x1f000, 0x9efff) AM_RAM // expansion |
| 448 | AM_RANGE(0xb0000, 0xb0fff) AM_MIRROR(0xf000) AM_RAM AM_SHARE("nvram2") // video RAM |
| 108 | 449 | AM_RANGE(0xc0000, 0xdffff) AM_ROM AM_REGION(M80C88A_TAG, 0) // or credit card memory |
| 109 | 450 | AM_RANGE(0xe0000, 0xfffff) AM_ROM AM_REGION(M80C88A_TAG, 0x20000) |
| 110 | 451 | ADDRESS_MAP_END |
| 111 | 452 | |
| 453 | //------------------------------------------------- |
| 454 | // ADDRESS_MAP( portfolio_io ) |
| 455 | //------------------------------------------------- |
| 456 | |
| 112 | 457 | static ADDRESS_MAP_START( portfolio_io, ADDRESS_SPACE_IO, 8 ) |
| 113 | | // AM_RANGE(0x8000, 0x800f) Keyboard |
| 458 | AM_RANGE(0x8000, 0x8000) AM_READ(keyboard_r) |
| 114 | 459 | AM_RANGE(0x8010, 0x8010) AM_DEVREADWRITE(HD61830_TAG, hd61830_data_r, hd61830_data_w) |
| 115 | 460 | AM_RANGE(0x8011, 0x8011) AM_DEVREADWRITE(HD61830_TAG, hd61830_status_r, hd61830_control_w) |
| 116 | | // AM_RANGE(0x8020, 0x8020) Speaker |
| 461 | AM_RANGE(0x8020, 0x8020) AM_WRITE(speaker_w) |
| 462 | AM_RANGE(0x8030, 0x8030) AM_WRITE(power_w) |
| 463 | AM_RANGE(0x8040, 0x8041) AM_READWRITE(counter_r, counter_w) |
| 464 | AM_RANGE(0x8050, 0x8050) AM_WRITE(irq_mask_w) |
| 465 | AM_RANGE(0x8051, 0x8051) AM_READ(battery_r) |
| 117 | 466 | AM_RANGE(0x8060, 0x8060) AM_RAM AM_BASE_MEMBER(portfolio_state, contrast) |
| 118 | 467 | // AM_RANGE(0x8070, 0x8077) AM_DEVREADWRITE(M82C50A_TAG, ins8250_r, ins8250_w) Serial Interface |
| 119 | 468 | // AM_RANGE(0x8078, 0x807b) AM_DEVREADWRITE(M82C55A_TAG, i8255a_r, i8255a_w) Parallel Interface |
| r9328 | r9329 | |
| 121 | 470 | AM_RANGE(0x807f, 0x807f) AM_READWRITE(pid_r, sivr_w) |
| 122 | 471 | ADDRESS_MAP_END |
| 123 | 472 | |
| 473 | //------------------------------------------------- |
| 474 | // ADDRESS_MAP( portfolio_lcdc ) |
| 475 | //------------------------------------------------- |
| 476 | |
| 477 | static ADDRESS_MAP_START( portfolio_lcdc, 0, 8 ) |
| 478 | AM_RANGE(0x0000, 0x07ff) AM_ROM AM_REGION(HD61830_TAG, 0) |
| 479 | ADDRESS_MAP_END |
| 480 | |
| 481 | //************************************************************************** |
| 482 | // INPUT PORTS |
| 483 | //************************************************************************** |
| 484 | |
| 485 | //------------------------------------------------- |
| 486 | // INPUT_PORTS( portfolio ) |
| 487 | //------------------------------------------------- |
| 488 | |
| 124 | 489 | static INPUT_PORTS_START( portfolio ) |
| 490 | PORT_START("ROW0") |
| 491 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Atari") PORT_CODE(KEYCODE_TILDE) |
| 492 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED) |
| 493 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') |
| 494 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') |
| 495 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') |
| 496 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') |
| 497 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') |
| 498 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') |
| 499 | |
| 500 | PORT_START("ROW1") |
| 501 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Del Ins") PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL)) |
| 502 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Alt") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) |
| 503 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') |
| 504 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') |
| 505 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') |
| 506 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') |
| 507 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Backspace") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) |
| 508 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') |
| 509 | |
| 510 | PORT_START("ROW2") |
| 511 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(UCHAR_MAMEKEY(TAB)) |
| 512 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') |
| 513 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) |
| 514 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') |
| 515 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') |
| 516 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') |
| 517 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) |
| 518 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') |
| 519 | |
| 520 | PORT_START("ROW3") |
| 521 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') |
| 522 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') |
| 523 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') |
| 524 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) |
| 525 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') |
| 526 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xE2\x86\x91") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) |
| 527 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('"') PORT_CHAR('`') |
| 528 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') |
| 529 | |
| 530 | PORT_START("ROW4") |
| 531 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') |
| 532 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') |
| 533 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') |
| 534 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') |
| 535 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) |
| 536 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xE2\x86\x93") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) |
| 537 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') |
| 538 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') |
| 539 | |
| 540 | PORT_START("ROW5") |
| 541 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') |
| 542 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') |
| 543 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') |
| 544 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xE2\x86\x90") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) |
| 545 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xE2\x86\x92") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) |
| 546 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) |
| 547 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('8') |
| 548 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') |
| 549 | |
| 550 | PORT_START("ROW6") |
| 551 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') |
| 552 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') |
| 553 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') |
| 554 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') |
| 555 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') |
| 556 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') |
| 557 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Fn") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) |
| 558 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') |
| 559 | |
| 560 | PORT_START("ROW7") |
| 561 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') |
| 562 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') |
| 563 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') |
| 564 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') |
| 565 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') |
| 566 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') |
| 567 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') |
| 568 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) |
| 125 | 569 | INPUT_PORTS_END |
| 126 | 570 | |
| 571 | //************************************************************************** |
| 572 | // VIDEO |
| 573 | //************************************************************************** |
| 574 | |
| 575 | //------------------------------------------------- |
| 576 | // PALETTE_INIT( portfolio ) |
| 577 | //------------------------------------------------- |
| 578 | |
| 127 | 579 | static PALETTE_INIT( portfolio ) |
| 128 | 580 | { |
| 129 | 581 | palette_set_color(machine, 0, MAKE_RGB(138, 146, 148)); |
| 130 | 582 | palette_set_color(machine, 1, MAKE_RGB(92, 83, 88)); |
| 131 | 583 | } |
| 132 | 584 | |
| 585 | //------------------------------------------------- |
| 586 | // VIDEO_UPDATE( portfolio ) |
| 587 | //------------------------------------------------- |
| 588 | |
| 133 | 589 | static VIDEO_UPDATE( portfolio ) |
| 134 | 590 | { |
| 135 | 591 | portfolio_state *state = screen->machine->driver_data<portfolio_state>(); |
| r9328 | r9329 | |
| 139 | 595 | return 0; |
| 140 | 596 | } |
| 141 | 597 | |
| 598 | //************************************************************************** |
| 599 | // DEVICE CONFIGURATION |
| 600 | //************************************************************************** |
| 601 | |
| 602 | //------------------------------------------------- |
| 603 | // I8255A_INTERFACE( ppi_intf ) |
| 604 | //------------------------------------------------- |
| 605 | |
| 142 | 606 | static WRITE8_DEVICE_HANDLER( ppi_pb_w ) |
| 143 | 607 | { |
| 144 | 608 | /* |
| r9328 | r9329 | |
| 220 | 684 | DEVCB_NULL // Port C write |
| 221 | 685 | }; |
| 222 | 686 | |
| 687 | //------------------------------------------------- |
| 688 | // ins8250_interface i8250_intf |
| 689 | //------------------------------------------------- |
| 690 | |
| 223 | 691 | static INS8250_INTERRUPT( i8250_intrpt_w ) |
| 224 | 692 | { |
| 225 | | // connected to EINT |
| 693 | trigger_interrupt(device->machine, INT_EXTERNAL); |
| 226 | 694 | } |
| 227 | 695 | |
| 228 | 696 | const ins8250_interface i8250_intf = |
| r9328 | r9329 | |
| 234 | 702 | NULL |
| 235 | 703 | }; |
| 236 | 704 | |
| 705 | //************************************************************************** |
| 706 | // IMAGE LOADING |
| 707 | //************************************************************************** |
| 708 | |
| 709 | //------------------------------------------------- |
| 710 | // DEVICE_IMAGE_LOAD( portfolio_cart ) |
| 711 | //------------------------------------------------- |
| 712 | |
| 237 | 713 | static DEVICE_IMAGE_LOAD( portfolio_cart ) |
| 238 | 714 | { |
| 239 | 715 | return IMAGE_INIT_FAIL; |
| 240 | 716 | } |
| 241 | 717 | |
| 718 | //************************************************************************** |
| 719 | // MACHINE INITIALIZATION |
| 720 | //************************************************************************** |
| 721 | |
| 722 | //------------------------------------------------- |
| 723 | // MACHINE_START( portfolio ) |
| 724 | //------------------------------------------------- |
| 725 | |
| 242 | 726 | static MACHINE_START( portfolio ) |
| 243 | 727 | { |
| 244 | 728 | portfolio_state *state = machine->driver_data<portfolio_state>(); |
| 245 | 729 | address_space *program = cputag_get_address_space(machine, M80C88A_TAG, ADDRESS_SPACE_PROGRAM); |
| 246 | 730 | |
| 731 | /* set CPU interrupt vector callback */ |
| 732 | cpu_set_irq_callback(machine->device(M80C88A_TAG), portfolio_int_ack); |
| 733 | |
| 247 | 734 | /* find devices */ |
| 248 | 735 | state->hd61830 = machine->device(HD61830_TAG); |
| 249 | 736 | state->centronics = machine->device(CENTRONICS_TAG); |
| 250 | 737 | state->speaker = machine->device(SPEAKER_TAG); |
| 738 | state->timer_tick = machine->device<timer_device>(TIMER_TICK_TAG); |
| 251 | 739 | |
| 252 | 740 | /* memory expansions */ |
| 253 | 741 | switch (messram_get_size(machine->device("messram"))) |
| 254 | 742 | { |
| 255 | 743 | case 128 * 1024: |
| 256 | | memory_unmap_readwrite(program, 0x3f000, 0x9efff, 0, 0); |
| 744 | memory_unmap_readwrite(program, 0x1f000, 0x9efff, 0, 0); |
| 257 | 745 | break; |
| 258 | 746 | |
| 259 | 747 | case 384 * 1024: |
| 260 | 748 | memory_unmap_readwrite(program, 0x5f000, 0x9efff, 0, 0); |
| 261 | 749 | break; |
| 262 | 750 | } |
| 751 | |
| 752 | /* set initial values */ |
| 753 | state->keylatch = 0xff; |
| 754 | state->sivr = 0x2a; |
| 263 | 755 | } |
| 264 | 756 | |
| 757 | //************************************************************************** |
| 758 | // MACHINE CONFIGURATION |
| 759 | //************************************************************************** |
| 760 | |
| 761 | //------------------------------------------------- |
| 762 | // MACHINE_CONFIG( portfolio ) |
| 763 | //------------------------------------------------- |
| 764 | |
| 265 | 765 | static MACHINE_CONFIG_START( portfolio, portfolio_state ) |
| 266 | 766 | /* basic machine hardware */ |
| 267 | 767 | MDRV_CPU_ADD(M80C88A_TAG, I8088, XTAL_4_9152MHz) |
| r9328 | r9329 | |
| 284 | 784 | |
| 285 | 785 | MDRV_VIDEO_UPDATE(portfolio) |
| 286 | 786 | |
| 287 | | MDRV_HD61830_ADD(HD61830_TAG, XTAL_4_9152MHz/2/2, SCREEN_TAG) |
| 787 | MDRV_HD61830_CGROM_ADD(HD61830_TAG, XTAL_4_9152MHz/2/2, SCREEN_TAG, portfolio_lcdc) |
| 288 | 788 | |
| 289 | 789 | /* sound hardware */ |
| 290 | 790 | MDRV_SPEAKER_STANDARD_MONO("mono") |
| r9328 | r9329 | |
| 295 | 795 | MDRV_I8255A_ADD(M82C55A_TAG, ppi_intf) |
| 296 | 796 | MDRV_CENTRONICS_ADD(CENTRONICS_TAG, standard_centronics) |
| 297 | 797 | MDRV_INS8250_ADD(M82C50A_TAG, i8250_intf) // should be MDRV_INS8250A_ADD |
| 798 | MDRV_TIMER_ADD_PERIODIC("counter", counter_tick, HZ(XTAL_32_768kHz/16384)) |
| 799 | MDRV_TIMER_ADD_PERIODIC(TIMER_TICK_TAG, system_tick, HZ(XTAL_32_768kHz/32768)) |
| 298 | 800 | |
| 801 | /* fake keyboard */ |
| 802 | MDRV_TIMER_ADD_PERIODIC("keyboard", keyboard_tick, USEC(2500)) |
| 803 | |
| 299 | 804 | /* cartridge */ |
| 300 | 805 | MDRV_CARTSLOT_ADD("cart") |
| 301 | 806 | MDRV_CARTSLOT_EXTENSION_LIST("bin") |
| 302 | 807 | MDRV_CARTSLOT_INTERFACE("portfolio_cart") |
| 303 | 808 | MDRV_CARTSLOT_LOAD(portfolio_cart) |
| 304 | 809 | |
| 810 | /* memory card */ |
| 811 | /* MDRV_MEMCARD_ADD("memcard_a") |
| 812 | MDRV_MEMCARD_EXTENSION_LIST("bin") |
| 813 | MDRV_MEMCARD_LOAD(portfolio_memcard) |
| 814 | MDRV_MEMCARD_SIZE_OPTIONS("32K,64K,128K") |
| 815 | |
| 816 | MDRV_MEMCARD_ADD("memcard_b") |
| 817 | MDRV_MEMCARD_EXTENSION_LIST("bin") |
| 818 | MDRV_MEMCARD_LOAD(portfolio_memcard) |
| 819 | MDRV_MEMCARD_SIZE_OPTIONS("32K,64K,128K")*/ |
| 820 | |
| 305 | 821 | /* software lists */ |
| 306 | 822 | // MDRV_SOFTWARE_LIST_ADD("cart_list", "pofo") |
| 307 | 823 | |
| r9328 | r9329 | |
| 309 | 825 | MDRV_RAM_ADD("messram") |
| 310 | 826 | MDRV_RAM_DEFAULT_SIZE("128K") |
| 311 | 827 | MDRV_RAM_EXTRA_OPTIONS("384K,640K") |
| 828 | |
| 829 | MDRV_NVRAM_ADD_RANDOM_FILL("nvram1") |
| 830 | MDRV_NVRAM_ADD_RANDOM_FILL("nvram2") |
| 312 | 831 | MACHINE_CONFIG_END |
| 313 | 832 | |
| 833 | //************************************************************************** |
| 834 | // ROMS |
| 835 | //************************************************************************** |
| 836 | |
| 837 | //------------------------------------------------- |
| 838 | // ROM( pofo ) |
| 839 | //------------------------------------------------- |
| 840 | |
| 314 | 841 | ROM_START( pofo ) |
| 315 | 842 | ROM_REGION( 0x40000, M80C88A_TAG, 0 ) |
| 316 | | ROM_LOAD( "rom b.u4", 0x00000, 0x20000, BAD_DUMP CRC(c9852766) SHA1(c74430281bc717bd36fd9b5baec1cc0f4489fe82) ) // dumped with debug.com |
| 317 | | ROM_LOAD( "rom a.u3", 0x20000, 0x20000, BAD_DUMP CRC(b8fb730d) SHA1(1b9d82b824cab830256d34912a643a7d048cd401) ) // dumped with debug.com |
| 843 | ROM_SYSTEM_BIOS( 0, "dip1072", "DIP DOS 1.072" ) |
| 844 | ROMX_LOAD( "rom b.u4", 0x00000, 0x20000, BAD_DUMP CRC(c9852766) SHA1(c74430281bc717bd36fd9b5baec1cc0f4489fe82), ROM_BIOS(1) ) // dumped with debug.com |
| 845 | ROMX_LOAD( "rom a.u3", 0x20000, 0x20000, BAD_DUMP CRC(b8fb730d) SHA1(1b9d82b824cab830256d34912a643a7d048cd401), ROM_BIOS(1) ) // dumped with debug.com |
| 846 | |
| 847 | ROM_REGION( 0x800, HD61830_TAG, 0 ) |
| 848 | ROM_LOAD( "hd61830 external character generator", 0x000, 0x800, NO_DUMP ) |
| 318 | 849 | ROM_END |
| 319 | 850 | |
| 851 | //************************************************************************** |
| 852 | // SYSTEM DRIVERS |
| 853 | //************************************************************************** |
| 854 | |
| 320 | 855 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ |
| 321 | | COMP( 1989, pofo, 0, 0, portfolio, portfolio, 0, "Atari", "Portfolio", GAME_NOT_WORKING | GAME_NO_SOUND ) |
| 856 | COMP( 1989, pofo, 0, 0, portfolio, portfolio, 0, "Atari", "Portfolio", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |