/* read data port */ static int I8741_data_r(const address_space *space, int num) { I8741 *st = &taito8741[num]; int ret = st->toData; st->status &= 0xfe; LOG(("%s:8741-%d DATA Read %02x\n",cpuexec_describe_context(space->machine),num,ret)); /* update chip */ taito8741_update(space, num); switch( st->mode ) { case TAITO8741_PORT: /* parallel data */ taito8741_hostdata_w(st,st->portHandler ? st->portHandler(space, st->parallelselect) : st->portName ? input_port_read(space->machine, st->portName) : 0); break; } return ret; }
/* read data port */ static int I8741_data_r(address_space &space, int num) { I8741 *st = &taito8741[num]; int ret = st->toData; st->status &= 0xfe; LOG(("%s:8741-%d DATA Read %02x\n",space.machine().describe_context(),num,ret)); /* update chip */ taito8741_update(space, num); switch( st->mode ) { case TAITO8741_PORT: /* parallel data */ taito8741_hostdata_w(st,st->portHandler ? st->portHandler(space, st->parallelselect, 0xff) : st->portName ? space.machine().root_device().ioport(st->portName)->read() : 0); break; } return ret; }
/* read data port */ static int I8741_data_r(int num) { I8741 *st = &taito8741[num]; int ret = st->toData; st->status &= 0xfe; #if __log__ logerror("8741-%d DATA Read %02x PC=%04x\n",num,ret,activecpu_get_pc()); #endif /* update chip */ taito8741_update(num); switch( st->mode ) { case TAITO8741_PORT: /* parallel data */ taito8741_hostdata_w(st,st->portHandler ? st->portHandler(st->parallelselect) : 0); break; } return ret; }
/* 8741 update */ static void taito8741_update(int num) { I8741 *st,*sst; int next = num; int data; do{ num = next; st = &taito8741[num]; if( st->connect != -1 ) sst = &taito8741[st->connect]; else sst = 0; next = -1; /* check pending command */ switch(st->phase) { case CMD_08: /* serial data latch */ if( st->serial_out) { st->status &= 0xfb; /* patch for gsword */ st->phase = CMD_IDLE; next = num; /* continue this chip */ } break; case CMD_4a: /* wait for syncronus ? */ if(!st->pending4a) { taito8741_hostdata_w(st,0); st->phase = CMD_IDLE; next = num; /* continue this chip */ } break; case CMD_IDLE: /* ----- data in port check ----- */ data = taito8741_hostdata_r(st); if( data != -1 ) { switch(st->mode) { case TAITO8741_MASTER: case TAITO8741_SLAVE: /* buffering transmit data */ if( st->txpoint < 8 ) { //if (st->txpoint == 0 && num==1 && data&0x80) logerror("Coin Put\n"); st->txd[st->txpoint++] = data; } break; case TAITO8741_PORT: if( data & 0xf8) { /* ?? */ } else { /* port select */ st->parallelselect = data & 0x07; taito8741_hostdata_w(st,st->portHandler ? st->portHandler(st->parallelselect) : 0); } } } /* ----- new command fetch ----- */ data = taito8741_hostcmd_r(st); switch( data ) { case -1: /* no command data */ break; case 0x00: /* read from parallel port */ taito8741_hostdata_w(st,st->portHandler ? st->portHandler(0) : 0 ); break; case 0x01: /* read receive buffer 0 */ case 0x02: /* read receive buffer 1 */ case 0x03: /* read receive buffer 2 */ case 0x04: /* read receive buffer 3 */ case 0x05: /* read receive buffer 4 */ case 0x06: /* read receive buffer 5 */ case 0x07: /* read receive buffer 6 */ //if (data == 2 && num==0 && st->rxd[data-1]&0x80) logerror("Coin Get\n"); taito8741_hostdata_w(st,st->rxd[data-1]); break; case 0x08: /* latch received serial data */ st->txd[0] = st->portHandler ? st->portHandler(0) : 0; if( sst ) { timer_set (TIME_NOW,num,taito8741_serial_tx); st->serial_out = 0; st->status |= 0x04; st->phase = CMD_08; } break; case 0x0a: /* 8741-0 : set serial comminucation mode 'MASTER' */ //st->mode = TAITO8741_MASTER; break; case 0x0b: /* 8741-1 : set serial comminucation mode 'SLAVE' */ //st->mode = TAITO8741_SLAVE; break; case 0x1f: /* 8741-2,3 : ?? set parallelport mode ?? */ case 0x3f: /* 8741-2,3 : ?? set parallelport mode ?? */ case 0xe1: /* 8741-2,3 : ?? set parallelport mode ?? */ st->mode = TAITO8741_PORT; st->parallelselect = 1; /* preset read number */ break; case 0x62: /* 8741-3 : ? */ break; case 0x4a: /* ?? syncronus with other cpu and return 00H */ if( sst ) { if(sst->pending4a) { sst->pending4a = 0; /* syncronus */ taito8741_hostdata_w(st,0); /* return for host */ next = st->connect; } else st->phase = CMD_4a; } break; case 0x80: /* 8741-3 : return check code */ taito8741_hostdata_w(st,0x66); break; case 0x81: /* 8741-2 : return check code */ taito8741_hostdata_w(st,0x48); break; case 0xf0: /* GSWORD 8741-1 : initialize ?? */ break; case 0x82: /* GSWORD 8741-2 unknown */ break; } break; } }while(next>=0); }