trunk/src/mess/drivers/pc100.c
| r18936 | r18937 | |
| 2 | 2 | |
| 3 | 3 | NEC PC-100 |
| 4 | 4 | |
| 5 | preliminary driver by Angelo Salese |
| 6 | Thanks to Carl for the i8259 tip; |
| 7 | |
| 5 | 8 | TODO: |
| 6 | | - there's a regression with i8259, check this code: |
| 9 | - floppy support (no images available right now); |
| 10 | - i8259 works in edge triggering mode, kludged to work somehow. |
| 11 | |
| 12 | Notes: |
| 13 | - First two POST checks are for the irqs, first one checks the timer irq: |
| 7 | 14 | F8209: B8 FB 00 mov ax,0FBh |
| 8 | 15 | F820C: E6 02 out 2h,al |
| 9 | 16 | F820E: B9 00 00 mov cx,0h |
| 10 | 17 | F8211: FB sti |
| 11 | | F8212: 0A E4 or ah,ah <- it's supposed to trigger an irq there! |
| 18 | F8212: 0A E4 or ah,ah <- irq fires here |
| 12 | 19 | F8214: E1 FC loopz 0F8212h |
| 13 | 20 | F8216: FA cli |
| 14 | 21 | F8217: 0A E9 or ch,cl |
| 15 | 22 | F8219: 74 15 je 0F8230h |
| 23 | - Second one is for the vblank irq timing: |
| 24 | F8238: 8B D3 mov dx,bx |
| 25 | F823A: 8B D9 mov bx,cx |
| 26 | F823C: CF iret |
| 27 | F824D: E4 02 in al,2h |
| 28 | F824F: 8A E0 mov ah,al |
| 29 | F8251: B0 EF mov al,0EFh |
| 30 | F8253: E6 02 out 2h,al |
| 31 | F8255: BB 00 00 mov bx,0h |
| 32 | F8258: BA 00 00 mov dx,0h |
| 33 | F825B: B9 20 4E mov cx,4E20h |
| 34 | F825E: FB sti |
| 35 | F825F: E2 FE loop 0F825Fh ;calculates the vblank here |
| 36 | F8261: FA cli |
| 37 | F8262: 8A C4 mov al,ah |
| 38 | F8264: E6 02 out 2h,al |
| 39 | F8266: 2B D3 sub dx,bx |
| 40 | F8268: 81 FA 58 1B cmp dx,1B58h |
| 41 | F826C: 78 06 js 0F8274h ;error if DX is smaller than 0x1b58 |
| 42 | F826E: 81 FA 40 1F cmp dx,1F40h |
| 43 | F8272: 78 0A js 0F827Eh ;error if DX is greater than 0x1f40 |
| 44 | F8274: B1 05 mov cl,5h |
| 45 | F8276: E8 CB 03 call 0F8644h |
| 46 | F8279: E8 79 FF call 0F81F5h |
| 47 | F827C: EB FE jmp 0F827Ch |
| 48 | F827E: B0 FF mov al,0FFh |
| 49 | fwiw with current timings, we get DX=0x1f09, enough for passing the test; |
| 16 | 50 | |
| 17 | 51 | ****************************************************************************/ |
| 18 | 52 | |
| r18936 | r18937 | |
| 221 | 255 | WRITE8_MEMBER( pc100_state::pc100_crtc_data_w ) |
| 222 | 256 | { |
| 223 | 257 | m_crtc.reg[m_crtc.addr] = data; |
| 258 | printf("%02x %02x\n",m_crtc.addr,data); |
| 224 | 259 | } |
| 225 | 260 | |
| 226 | 261 | |
| r18936 | r18937 | |
| 349 | 384 | |
| 350 | 385 | INTERRUPT_GEN_MEMBER(pc100_state::pc100_vblank_irq) |
| 351 | 386 | { |
| 387 | pic8259_ir4_w(machine().device("pic8259"), 0); |
| 352 | 388 | pic8259_ir4_w(machine().device("pic8259"), 1); |
| 353 | 389 | } |
| 354 | 390 | |
| 355 | 391 | TIMER_DEVICE_CALLBACK_MEMBER(pc100_state::pc100_600hz_irq) |
| 356 | 392 | { |
| 357 | | |
| 358 | 393 | if(m_timer_mode == 0) |
| 394 | { |
| 395 | pic8259_ir2_w(machine().device("pic8259"), 0); |
| 359 | 396 | pic8259_ir2_w(machine().device("pic8259"), 1); |
| 397 | } |
| 360 | 398 | } |
| 361 | 399 | |
| 362 | 400 | TIMER_DEVICE_CALLBACK_MEMBER(pc100_state::pc100_100hz_irq) |
| 363 | 401 | { |
| 364 | | |
| 365 | 402 | if(m_timer_mode == 1) |
| 403 | { |
| 404 | pic8259_ir2_w(machine().device("pic8259"), 0); |
| 366 | 405 | pic8259_ir2_w(machine().device("pic8259"), 1); |
| 406 | } |
| 367 | 407 | } |
| 368 | 408 | |
| 369 | 409 | TIMER_DEVICE_CALLBACK_MEMBER(pc100_state::pc100_50hz_irq) |
| 370 | 410 | { |
| 371 | | |
| 372 | 411 | if(m_timer_mode == 2) |
| 412 | { |
| 413 | pic8259_ir2_w(machine().device("pic8259"), 0); |
| 373 | 414 | pic8259_ir2_w(machine().device("pic8259"), 1); |
| 415 | } |
| 374 | 416 | } |
| 375 | 417 | |
| 376 | 418 | TIMER_DEVICE_CALLBACK_MEMBER(pc100_state::pc100_10hz_irq) |
| 377 | 419 | { |
| 378 | | |
| 379 | 420 | if(m_timer_mode == 3) |
| 421 | { |
| 422 | pic8259_ir2_w(machine().device("pic8259"), 0); |
| 380 | 423 | pic8259_ir2_w(machine().device("pic8259"), 1); |
| 424 | } |
| 381 | 425 | } |
| 382 | 426 | |
| 383 | 427 | #define MASTER_CLOCK 6988800 |
| r18936 | r18937 | |
| 392 | 436 | |
| 393 | 437 | /* video hardware */ |
| 394 | 438 | MCFG_SCREEN_ADD("screen", RASTER) |
| 395 | | MCFG_SCREEN_REFRESH_RATE(60) |
| 396 | | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ |
| 397 | | MCFG_SCREEN_SIZE(1024, 1024) |
| 398 | | MCFG_SCREEN_VISIBLE_AREA(0, 768-1, 0, 512-1) |
| 439 | // MCFG_SCREEN_REFRESH_RATE(60) |
| 440 | // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ |
| 441 | // MCFG_SCREEN_SIZE(1024, 264*2) |
| 442 | // MCFG_SCREEN_VISIBLE_AREA(0, 768-1, 0, 512-1) |
| 443 | /* TODO: Unknown Pixel Clock and CRTC is dynamic */ |
| 444 | MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK*4, 1024, 0, 768, 264*2, 0, 512) |
| 399 | 445 | MCFG_SCREEN_UPDATE_DRIVER(pc100_state, screen_update_pc100) |
| 400 | 446 | MCFG_GFXDECODE(pc100) |
| 401 | 447 | MCFG_PALETTE_LENGTH(16) |