|
|
| version 1.2, 2004/08/02 11:48:14 | version 1.16, 2004/08/17 14:46:37 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "pccore.h" | #include "pccore.h" |
| #include "iocore.h" | #include "iocore.h" |
| #include "x1_io.h" | #include "nevent.h" |
| #include "x1_crtc.h" | #include "makescrn.h" |
| #include "x1_vram.h" | |
| #include "draw.h" | |
| // ---- 8255 PPI〜 | // ---- 8255 PPI〜 |
| void IOOUTCALL ppi_o(UINT port, REG8 value) { | static REG8 getportb(void) { |
| REG8 ret; | |
| SINT32 clock; | |
| ret = cmt_test(); // | cmt_read(); // THUNDER BALL | |
| UINT8 bak_c; | clock = nevent_getwork(NEVENT_FRAMES); |
| UINT8 bit; | if (corestat.vsync) { |
| UINT8 xl; | clock += corestat.dispclock; |
| } | |
| if (clock < crtc.e.dispclock) { | |
| ret |= 0x80; // 1:DISP | |
| } | |
| clock -= crtc.e.vsyncstart; | |
| if ((clock >= 0) && (clock < crtc.e.vpulseclock)) { | |
| ret |= 0x04; // 1:V-SYNC | |
| } | |
| if (crtc.TXT_XL == 40) { | if (subcpu.IBF) { |
| ppi.PORT_C |= 0x40; | subcpu.IBF = 0; |
| ret |= 0x40; // 1:SUB-CPU BUSY | |
| } | |
| if (subcpu.OBF) { | |
| ret |= 0x20; // 1:SUB-CPU Data empty | |
| } | } |
| else { | if (memio.ram) { |
| ppi.PORT_C &= ~0x40; | ret |= 0x10; // 1:RAM |
| } | } |
| bak_c = ppi.PORT_C; | return(ret); |
| } | |
| static void setportc(REG8 dat) { | |
| REG8 modify; | |
| modify = ppi.portc ^ dat; | |
| ppi.portc = dat; | |
| // cmt_write((REG8)(dat & 1)); | |
| if ((modify & 0x20) && (!(dat & 0x20))) { | |
| iocore.s.mode = 1; | |
| } | |
| if (modify & 0x40) { | |
| crtc_setwidth((REG8)(dat & 0x40)); | |
| } | |
| #if 0 | |
| xl = ((dat & 0x40)?40:80); | |
| if (crtc.s.reg[CRTCREG_HDISP] != xl) { | |
| crtc.s.reg[CRTCREG_HDISP] = (UINT8)xl; | |
| crtc_bankupdate(); | |
| scrnallflash = 1; | |
| } | |
| #endif | |
| } | |
| // ---- | |
| void IOOUTCALL ppi_o(UINT port, REG8 value) { | |
| REG8 bit; | |
| switch(port & 0x0f) { | switch(port & 0x0f) { |
| case 0: | case 0: |
| if (!(ppi.MODE & 0x10)) { | ppi.porta = value; |
| ppi.PORT_A = value; | |
| } | |
| return; | return; |
| case 1: | case 1: |
| if (!(ppi.MODE & 0x02)) { | ppi.portb = value; |
| ppi.PORT_B = value; | |
| } | |
| return; | return; |
| case 2: | case 2: |
| if (!(ppi.MODE & 0x01)) { | setportc(value); |
| ppi.PORT_C &= 0xf0; | |
| ppi.PORT_C |= (value & 0x0f); | |
| } | |
| if (!(ppi.MODE & 0x08)) { | |
| ppi.PORT_C &= 0x0f; | |
| ppi.PORT_C |= (value & 0xf0); | |
| } | |
| break; | break; |
| case 3: | case 3: |
| if (value & 0x80) { | if (value & 0x80) { |
| ppi.MODE = value; | ppi.mode = value; |
| return; | return; |
| } | } |
| else { | else { |
| bit = (UINT8)(1 << ((value >> 1) & 7)); | bit = 1 << ((value >> 1) & 7); |
| if (value & 0x01) { | if (value & 0x01) { |
| ppi.PORT_C |= bit; | setportc((REG8)(ppi.portc | bit)); |
| } | } |
| else { | else { |
| ppi.PORT_C &= ~bit; | setportc((REG8)(ppi.portc & (~bit))); |
| } | } |
| } | } |
| break; | break; |
| default: | |
| return; | |
| } | |
| // cmt_write(ppi.PORT_C & 1); | |
| if ((bak_c & 0x20) && (!(ppi.PORT_C & 0x20))) { | |
| ppi.IO_MODE = 1; | |
| } | |
| xl = ((ppi.PORT_C & 0x40)?40:80); | |
| if (crtc.TXT_XL != xl) { | |
| crtc.TXT_XL = (UINT8)xl; | |
| crtc.GRP_XL = xl << 3; | |
| vrambank_patch(); | |
| scrnallflash = 1; | |
| } | } |
| } | } |
| REG8 IOINPCALL ppi_i(UINT port) { | REG8 IOINPCALL ppi_i(UINT port) { |
| ppi.PORT_B = cmt_test(); // | cmt_read(); // THUNDER BALL | |
| if (v_cnt < crtc.CRT_YL) { | |
| ppi.PORT_B |= 0x80; // 1:DISP | |
| } | |
| if (subcpu.IBF) { | |
| subcpu.IBF = 0; | |
| ppi.PORT_B |= 0x40; // 1:SUB-CPU BUSY | |
| } | |
| if (subcpu.OBF) { | |
| ppi.PORT_B |= 0x20; // 1:SUB-CPU Data empty | |
| } | |
| if (!pccore.ROM_SW) { | |
| ppi.PORT_B |= 0x10; // 1:RAM | |
| } | |
| #if 1 | |
| if (!(v_cnt < crtc.CRT_VS)) { | |
| ppi.PORT_B |= 0x04; // V-SYNC | |
| } | |
| #else // ラプラステスト…VYSNCが長すぎるらしい | |
| if (v_cnt == crtc.CRT_VS) { | |
| ppi.PORT_B |= 0x04; | |
| } | |
| #endif | |
| if (crtc.TXT_XL == 40) { | |
| ppi.PORT_C |= 0x40; | |
| } | |
| else { | |
| ppi.PORT_C &= ~0x40; | |
| } | |
| switch(port & 0x0f) { | switch(port & 0x0f) { |
| case 0: | case 0: |
| return(ppi.PORT_A); | // if (!(ppi.mode & 0x10)) { |
| // return(ppi.porta); | |
| // } | |
| return(ppi.porta); | |
| case 1: | case 1: |
| return(ppi.PORT_B); | if (!(ppi.mode & 0x02)) { |
| return(ppi.portb); | |
| } | |
| return(getportb()); | |
| case 2: | case 2: |
| return(ppi.PORT_C); | // mode? |
| return(ppi.portc); | |
| case 3: | case 3: |
| return(ppi.MODE); | return(ppi.mode); |
| } | } |
| return(0xff); | return(0xff); |
| } | } |
| Line 133 REG8 IOINPCALL ppi_i(UINT port) { | Line 130 REG8 IOINPCALL ppi_i(UINT port) { |
| void ppi_initialize(void) { | void ppi_initialize(void) { |
| ppi.PORT_A = 0x00; | ppi.porta = 0x00; |
| ppi.PORT_B = 0xff; | ppi.portb = 0xff; |
| ppi.PORT_C = 0xff; | ppi.portc = 0xff; |
| ppi.MODE = 0; | ppi.mode = 0x82; |
| ppi.IO_MODE = 0; | |
| } | } |
| void ppi_reset(void) { | void ppi_reset(void) { |
| ppi.MODE = 0; | ppi.porta = 0x00; |
| ppi.PORT_A = 0; | ppi.portc |= 0x40; |
| ppi.PORT_C |= 0x40; | ppi.mode = 0x82; |
| ppi.IO_MODE = 0; | |
| } | } |