static u8 read_byte(void){ /* Read a single byte from EEPROM Read LSb first */ int i; int Value; u8 Result=0; #ifndef CONFIG_SYS_IMMR u32 Flags; #endif E_DEBUG("Reading byte\n"); for(i=0;i<8;i++){ /* Small delay between pulses */ udelay(1); #ifndef CONFIG_SYS_IMMR /* Disable irq */ save_flags(Flags); cli(); #endif /* Pull down pin short time to start read See page 26 in data sheet */ WRITE_PORT(0); udelay(READ_LOW); WRITE_PORT(1); /* Wait for chip to drive pin */ udelay(READ_TIMEOUT); Value = READ_PORT; if(Value) Value=1; #ifndef CONFIG_SYS_IMMR /* Enable irq */ restore_flags(Flags); #endif /* Wait for chip to release pin */ udelay(TOTAL_READ_LOW-READ_TIMEOUT); /* LSb first */ Result|=Value<<i; } E_DEBUG("Read byte 0x%x\n",Result); return(Result); }
static void write_byte(u8 Byte){ /* Write a single byte to EEPROM Write LSb first */ int i; int Value; #ifndef CONFIG_SYS_IMMR u32 Flags; #endif E_DEBUG("Writing byte 0x%x\n",Byte); for(i=0;i<8;i++){ /* Small delay between pulses */ udelay(1); Value = Byte&1; #ifndef CONFIG_SYS_IMMR /* Disable irq */ save_flags(Flags); cli(); #endif /* Pull down pin short time for a 1, long time for a 0 See page 26 in data sheet */ WRITE_PORT(0); if(Value){ /* Write a 1 */ udelay(WRITE_1_LOW); } else{ /* Write a 0 */ udelay(WRITE_0_LOW); } WRITE_PORT(1); #ifndef CONFIG_SYS_IMMR /* Enable irq */ restore_flags(Flags); #endif if(Value) /* Wait for chip to read the 1 */ udelay(TOTAL_WRITE_LOW-WRITE_1_LOW); Byte>>=1; } }
static int do_reset(void){ /* Release reset and verify that chip responds with presence pulse */ int Retries = 0; while(Retries<5){ udelay(RESET_LOW_TIME); /* Send reset */ WRITE_PORT(0); udelay(RESET_LOW_TIME); /* Release reset */ WRITE_PORT(1); /* Wait for EEPROM to drive output */ udelay(PRESENCE_TIMEOUT); if(!READ_PORT){ /* Ok, EEPROM is driving a 0 */ E_DEBUG("Presence detected\n"); if(Retries){ E_DEBUG("Retries %d\n",Retries); } /* Make sure chip releases pin */ udelay(PRESENCE_LOW_TIME); return 0; } Retries++; } printk(KERN_ERR"EEPROM did not respond when releasing reset\n"); /* Make sure chip releases pin */ udelay(PRESENCE_LOW_TIME); /* Set to idle again */ set_idle(); return(-EIO); }
UINT8 namcoio_51XX_read(int chip) { #if VERBOSE logerror("%04x: custom 51XX read\n",activecpu_get_pc()); #endif if (io[chip].mode == 0) /* switch mode */ { switch ((io[chip].in_count++) % 3) { default: case 0: return READ_PORT(0) | (READ_PORT(1) << 4); case 1: return READ_PORT(2) | (READ_PORT(3) << 4); case 2: return 0; // nothing? } } else /* credits mode */ { switch ((io[chip].in_count++) % 3) { default: case 0: // number of credits in BCD format { int in,toggle; in = ~(READ_PORT(0) | (READ_PORT(1) << 4)); toggle = in ^ io[chip].lastcoins; io[chip].lastcoins = in; if (io[chip].coins_per_cred[0] > 0) { if (io[chip].credits >= 99) { WRITE_PORT(1,1); // coin lockout } else { WRITE_PORT(1,0); // coin lockout /* check if the user inserted a coin */ if (toggle & in & 0x10) { io[chip].coins[0]++; WRITE_PORT(0,0x04); // coin counter WRITE_PORT(0,0x0c); if (io[chip].coins[0] >= io[chip].coins_per_cred[0]) { io[chip].credits += io[chip].creds_per_coin[0]; io[chip].coins[0] -= io[chip].coins_per_cred[0]; } } if (toggle & in & 0x20) { io[chip].coins[1]++; WRITE_PORT(0,0x08); // coin counter WRITE_PORT(0,0x0c); if (io[chip].coins[1] >= io[chip].coins_per_cred[1]) { io[chip].credits += io[chip].creds_per_coin[1]; io[chip].coins[1] -= io[chip].coins_per_cred[1]; } } if (toggle & in & 0x40) { io[chip].credits++; } } } else io[chip].credits = 100; // free play if (io[chip].mode == 1) { int on = (cpu_getcurrentframe() & 0x10) >> 4; if (io[chip].credits >= 2) WRITE_PORT(0,0x0c | 3*on); // lamps else if (io[chip].credits >= 1) WRITE_PORT(0,0x0c | 2*on); // lamps else WRITE_PORT(0,0x0c); // lamps off /* check for 1 player start button */ if (toggle & in & 0x04) { if (io[chip].credits >= 1) { io[chip].credits--; io[chip].mode = 2; WRITE_PORT(0,0x0c); // lamps off } } /* check for 2 players start button */ else if (toggle & in & 0x08) { if (io[chip].credits >= 2) { io[chip].credits -= 2; io[chip].mode = 2; WRITE_PORT(0,0x0c); // lamps off } } } } if (~readinputport(0) & 0x80) /* check test mode switch */ return 0xbb; return (io[chip].credits / 10) * 16 + io[chip].credits % 10; case 1: { int joy = READ_PORT(2) & 0x0f; int in,toggle; in = ~READ_PORT(0); toggle = in ^ io[chip].lastbuttons; io[chip].lastbuttons = (io[chip].lastbuttons & 2) | (in & 1); /* remap joystick */ if (io[chip].remap_joy) joy = joy_map[joy]; /* fire */ joy |= ((toggle & in & 0x01)^1) << 4; joy |= ((in & 0x01)^1) << 5; return joy; } case 2: { int joy = READ_PORT(3) & 0x0f; int in,toggle; in = ~READ_PORT(0); toggle = in ^ io[chip].lastbuttons; io[chip].lastbuttons = (io[chip].lastbuttons & 1) | (in & 2); /* remap joystick */ if (io[chip].remap_joy) joy = joy_map[joy]; /* fire */ joy |= ((toggle & in & 0x02)^2) << 3; joy |= ((in & 0x02)^2) << 4; return joy; } } }
static void set_idle(void){ /* Send idle and keep start time Continous 1 is idle */ WRITE_PORT(1); }