--- np2/io/gdc.c 2004/02/11 04:22:18 1.15 +++ np2/io/gdc.c 2004/02/19 03:04:02 1.20 @@ -30,7 +30,7 @@ static const GDCCLK gdcclk[] = { static const UINT8 defdegpal[4] = {0x04,0x15,0x26,0x37}; static const UINT8 defsyncm15[8] = {0x10,0x4e,0x07,0x25,0x0d,0x0f,0xc8,0x94}; -static const UINT8 defsyncs15[8] = {0x06,0x26,0x03,0x11,0x86,0x0f,0xc8,0x84}; +static const UINT8 defsyncs15[8] = {0x06,0x26,0x03,0x11,0x86,0x0f,0xc8,0x94}; static const UINT8 defsyncm24[8] = {0x10,0x4e,0x07,0x25,0x07,0x07,0x90,0x65}; static const UINT8 defsyncs24[8] = {0x06,0x26,0x03,0x11,0x83,0x07,0x90,0x65}; @@ -115,35 +115,54 @@ void gdc_paletteinit(void) { static void vectdraw(void) { - UINT32 csrw; - UINT16 textw; + UINT32 csrw; +const GDCVECT *vect; + REG16 textw; + REG8 ope; csrw = LOADINTELDWORD(gdc.s.para + GDC_CSRW); + vect = (GDCVECT *)(gdc.s.para + GDC_VECTW); textw = LOADINTELWORD(gdc.s.para + GDC_TEXTW); + ope = gdc.s.para[GDC_WRITE]; - if (gdc.s.para[GDC_VECTW] & 0x08) { - gdcsub_line(csrw, (GDCVECT *)(gdc.s.para + GDC_VECTW), - textw, gdc.s.para[GDC_WRITE]); - } - if (gdc.s.para[GDC_VECTW] & 0x20) { - gdcsub_circle(csrw, (GDCVECT *)(gdc.s.para + GDC_VECTW), - textw, gdc.s.para[GDC_WRITE]); - } - if (gdc.s.para[GDC_VECTW] & 0x40) { - gdcsub_box(csrw, (GDCVECT *)(gdc.s.para + GDC_VECTW), - textw, gdc.s.para[GDC_WRITE]); + if (vect->ope & 0x08) { + gdcsub_vectl(csrw, vect, textw, ope); + } + if (vect->ope & 0x10) { // undocumented + gdcsub_vectt(csrw, vect, textw, ope); + } + if (vect->ope & 0x20) { + gdcsub_vectc(csrw, vect, textw, ope); + } + if (vect->ope & 0x40) { + gdcsub_vectr(csrw, vect, textw, ope); } } static void textdraw(void) { - UINT32 csrw; + UINT32 csrw; +const GDCVECT *vect; + REG16 textw; + REG8 ope; - if (gdc.s.para[GDC_VECTW] & 0x10) { - csrw = LOADINTELDWORD(gdc.s.para + GDC_CSRW); - gdcsub_text(csrw, (GDCVECT *)(gdc.s.para + GDC_VECTW), - gdc.s.para + GDC_TEXTW, - gdc.s.para[GDC_WRITE]); + csrw = LOADINTELDWORD(gdc.s.para + GDC_CSRW); + vect = (GDCVECT *)(gdc.s.para + GDC_VECTW); + textw = gdc.s.para[GDC_TEXTW + 7]; + textw = (textw << 8) + textw; + ope = gdc.s.para[GDC_WRITE]; + + if (vect->ope & 0x08) { // undocumented + gdcsub_vectl(csrw, vect, textw, ope); + } + if (vect->ope & 0x10) { + gdcsub_text(csrw, vect, gdc.s.para + GDC_TEXTW, ope); + } + if (vect->ope & 0x20) { // undocumented + gdcsub_vectc(csrw, vect, textw, ope); + } + if (vect->ope & 0x40) { // undocumented + gdcsub_vectr(csrw, vect, textw, ope); } } @@ -152,15 +171,15 @@ void gdc_work(int id) { GDCDATA item; UINT8 *dispflag; UINT i; - BYTE data; + UINT8 data; - item = (id==GDCWORK_MASTER)?&gdc.m:&gdc.s; - dispflag = (id==GDCWORK_MASTER)?&gdcs.textdisp:&gdcs.grphdisp; + item = (id == GDCWORK_MASTER)?&gdc.m:&gdc.s; + dispflag = (id == GDCWORK_MASTER)?&gdcs.textdisp:&gdcs.grphdisp; for (i=0; icnt; i++) { - data = (BYTE)item->fifo[i]; + data = (UINT8)item->fifo[i]; if (item->fifo[i] & 0xff00) { - item->cmd = data; // ver0.29 + item->cmd = data; item->paracb = 0; if ((data & 0x60) == 0x20) { item->para[GDC_WRITE] = data; @@ -189,7 +208,7 @@ void gdc_work(int id) { case CMD_START: case CMD_SYNC_ON: (*dispflag) |= GDCSCRN_ENABLE | GDCSCRN_ALLDRAW2; - screenupdate |= 2; // ver0.28 + screenupdate |= 2; break; case CMD_STOP_: @@ -197,7 +216,7 @@ void gdc_work(int id) { case CMD_SYNC_OFF: (*dispflag) &= (~GDCSCRN_ENABLE); // (*dispflag) |= GDCSCRN_ALLDRAW2; - screenupdate |= 2; // ver0.28 + screenupdate |= 2; break; case CMD_VECTE: @@ -206,7 +225,7 @@ void gdc_work(int id) { } break; - case CMD_TEXTE: // ver0.30 + case CMD_TEXTE: if (id != GDCWORK_MASTER) { textdraw(); } @@ -233,11 +252,11 @@ void gdc_work(int id) { (*dispflag) |= gdc_dirtyflag[id][item->ptr]; } (item->ptr)++; - (item->rcv)--; // ver0.29 + (item->rcv)--; if ((!(item->rcv)) && (id == GDCWORK_SLAVE) && (((item->cmd) & 0xe4) == 0x20)) { gdcsub_write(); - item->paracb = 0; // ver0.29 + item->paracb = 0; } } } @@ -359,7 +378,7 @@ static void IOOUTCALL gdc_o68(UINT port, REG8 bit; - if (!(dat & 0xf0)) { // ver0.28 + if (!(dat & 0xf0)) { bit = 1 << ((dat >> 1) & 7); if (dat & 1) { gdc.mode1 |= bit; @@ -370,7 +389,7 @@ static void IOOUTCALL gdc_o68(UINT port, if (bit & (0x01 | 0x04 | 0x10)) { gdcs.grphdisp |= GDCSCRN_ALLDRAW2; } - else if (bit == 0x02) { // ver0.28 + else if (bit == 0x02) { gdcs.grphdisp |= GDCSCRN_ALLDRAW2; gdcs.palchange = GDCSCRN_REDRAW; } @@ -561,7 +580,7 @@ static void IOOUTCALL gdc_oa0(UINT port, gdc.s.fifo[gdc.s.cnt++] = dat; } // TRACEOUT(("GDC-B %.2x", dat)); - if (gdc.s.paracb) { // ver0.29 + if (gdc.s.paracb) { gdc_work(GDCWORK_SLAVE); } (void)port; @@ -778,13 +797,6 @@ void gdc_reset(void) { gdc.display = 2; } gdc.bitac = 0xff; - -#if 0 // bind で計算される筈 - gdc.rasterclock = pccore.realclock / 24816; - gdc.hsyncclock = (gdc.rasterclock * 4) / 5; - gdc.dispclock = pccore.realclock * 50 / 3102; - gdc.vsyncclock = pccore.realclock * 5 / 3102; -#endif } void gdc_bind(void) {