Previous 15994 Revisions Next

r6582 Tuesday 8th December, 2009 at 14:32:10 UTC by Tim Schuerewegen
[GP32] Added NVRAM. It is now possible to load executables from SmartMedia cards that are encrypted with the GP32 unique ID.
[src/mess/drivers]gp32.c

src/mess/drivers/gp32.c
r6581r6582
2626#define BITS(x,m,n) (((x)>>(n))&((1<<((m)-(n)+1))-1))
2727
2828static UINT32 *s3c240x_ram;
29static UINT8 *eeprom_data;
2930
3031// LCD CONTROLLER
3132
r6581r6582
856857
857858static emu_timer *s3c240x_iic_timer;
858859static UINT32 s3c240x_iic_regs[0x10/4];
860static UINT8 s3c240x_iic_data[3];
861static int s3c240x_iic_data_index = 0;
862static UINT16 s3c240x_iic_addr = 0;
859863
860static UINT8 iic_read( running_machine *machine, int last)
864/*
865static UINT8 i2cmem_read_byte( running_machine *machine, int last)
861866{
862867   UINT8 data = 0;
863/*
864868   int i;
865869   i2cmem_write( machine, 0, I2CMEM_SDA, 1);
866870   for (i=0;i<8;i++)
r6581r6582
872876   i2cmem_write( machine, 0, I2CMEM_SDA, last);
873877   i2cmem_write( machine, 0, I2CMEM_SCL, 1);
874878   i2cmem_write( machine, 0, I2CMEM_SCL, 0);
875*/
876879   return data;
877880}
881*/
878882
879static void iic_write( running_machine *machine, UINT8 data)
883/*
884static void i2cmem_write_byte( running_machine *machine, UINT8 data)
880885{
881/*
882886   int i;
883887   for (i=0;i<8;i++)
884888   {
r6581r6582
887891      i2cmem_write( machine, 0, I2CMEM_SCL, 1);
888892      i2cmem_write( machine, 0, I2CMEM_SCL, 0);
889893   }
890   i2cmem_write( machine, 0, I2CMEM_SDA, 1);
894   i2cmem_write( machine, 0, I2CMEM_SDA, 1); // ack bit
891895   i2cmem_write( machine, 0, I2CMEM_SCL, 1);
892896   i2cmem_write( machine, 0, I2CMEM_SCL, 0);
897}
893898*/
894}
895899
896static void iic_start( running_machine *machine)
900/*
901static void i2cmem_start( running_machine *machine)
897902{
898/*
899903   i2cmem_write( machine, 0, I2CMEM_SDA, 1);
900904   i2cmem_write( machine, 0, I2CMEM_SCL, 1);
901905   i2cmem_write( machine, 0, I2CMEM_SDA, 0);
902906   i2cmem_write( machine, 0, I2CMEM_SCL, 0);
907}
903908*/
904}
905909
906static void iic_stop( running_machine *machine)
910/*
911static void i2cmem_stop( running_machine *machine)
907912{
908/*
909913   i2cmem_write( machine, 0, I2CMEM_SDA, 0);
910914   i2cmem_write( machine, 0, I2CMEM_SCL, 1);
911915   i2cmem_write( machine, 0, I2CMEM_SDA, 1);
912916   i2cmem_write( machine, 0, I2CMEM_SCL, 0);
917}
913918*/
919
920static void iic_start( running_machine *machine)
921{
922//   logerror( "IIC start\n");
923   s3c240x_iic_data_index = 0;
924   timer_adjust_oneshot( s3c240x_iic_timer, ATTOTIME_IN_MSEC( 1), 0);
914925}
915926
927static void iic_stop( running_machine *machine)
928{
929//   logerror( "IIC stop\n");
930   timer_adjust_oneshot( s3c240x_iic_timer, attotime_never, 0);
931}
932
933static void iic_resume( running_machine *machine)
934{
935//   logerror( "IIC resume\n");
936   timer_adjust_oneshot( s3c240x_iic_timer, ATTOTIME_IN_MSEC( 1), 0);
937}
938
916939static READ32_HANDLER( s3c240x_iic_r )
917940{
918941   UINT32 data = s3c240x_iic_regs[offset];
r6581r6582
946969//         tx_clock_source_selection = (data >> 6) & 1;
947970//         enable_interrupt = (data >> 5) & 1;
948971//         clock = (double)(s3c240x_get_pclk( MPLLCON) / div_table[tx_clock_source_selection] / (transmit_clock_value + 1));
949         interrupt_pending_flag = (data >> 4) & 1;
972         interrupt_pending_flag = BIT( data, 4);
950973         if (interrupt_pending_flag == 0)
951974         {
952975            int start_stop_condition;
953            start_stop_condition = (s3c240x_iic_regs[1] >> 5) & 1;
976            start_stop_condition = BIT( s3c240x_iic_regs[1], 5);
954977            if (start_stop_condition != 0)
955978            {
956//               logerror( "IIC resume\n");
957               timer_adjust_oneshot( s3c240x_iic_timer, ATTOTIME_IN_MSEC( 10), 0);
979               iic_resume( space->machine);
958980            }
959981         }
960982      }
r6581r6582
962984      // IICSTAT
963985      case 0x04 / 4 :
964986      {
965         int start_stop_condition, mode_selection;
966         mode_selection = (data >> 6) & 3;
967         start_stop_condition = (data >> 5) & 1;
987         int start_stop_condition;
988         start_stop_condition = BIT( data, 5);
968989         if (start_stop_condition != 0)
969990         {
970//            logerror( "IIC start (mode %d)\n", mode_selection);
971991            iic_start( space->machine);
972            timer_adjust_oneshot( s3c240x_iic_timer, ATTOTIME_IN_MSEC( 10), 0);
973992         }
974993         else
975994         {
976//            logerror( "IIC stop\n");
977995            iic_stop( space->machine);
978            timer_adjust_oneshot( s3c240x_iic_timer, attotime_never, 0);
979996         }
980997      }
981998      break;
r6581r6582
9851002static TIMER_CALLBACK( s3c240x_iic_timer_exp )
9861003{
9871004   int enable_interrupt, mode_selection;
988//   logerror( "s3c240x_iic_timer_exp\n");
989   mode_selection = (s3c240x_iic_regs[1] >> 6) & 3;
1005//   logerror( "IIC timer callback\n");
1006   mode_selection = BITS( s3c240x_iic_regs[1], 7, 6);
9901007   switch (mode_selection)
9911008   {
9921009      // master receive mode
9931010      case 2 :
9941011      {
995         UINT8 data_shift = iic_read( machine, 0);
996//         logerror( "IIC READ %02X\n", data_shift);
997         s3c240x_iic_regs[3] = (s3c240x_iic_regs[3] & ~0xFF) | data_shift;
1012         if (s3c240x_iic_data_index == 0)
1013         {
1014//            UINT8 data_shift = s3c240x_iic_regs[3] & 0xFF;
1015//            logerror( "IIC write %02X\n", data_shift);
1016         }
1017         else
1018         {
1019            UINT8 data_shift = eeprom_data[s3c240x_iic_addr];
1020//            logerror( "IIC read %02X [%04X]\n", data_shift, s3c240x_iic_addr);
1021            s3c240x_iic_regs[3] = (s3c240x_iic_regs[3] & ~0xFF) | data_shift;
1022         }
1023         s3c240x_iic_data_index++;
9981024      }
9991025      break;
10001026      // master transmit mode
10011027      case 3 :
10021028      {
10031029         UINT8 data_shift = s3c240x_iic_regs[3] & 0xFF;
1004//         logerror( "IIC WRITE %02X\n", data_shift);
1005         iic_write( machine, data_shift);
1030//         logerror( "IIC write %02X\n", data_shift);
1031         s3c240x_iic_data[s3c240x_iic_data_index++] = data_shift;
1032         if (s3c240x_iic_data_index == 3)
1033         {
1034            s3c240x_iic_addr = (s3c240x_iic_data[1] << 8) | s3c240x_iic_data[2];
1035         }
10061036      }
10071037      break;
10081038   }
1009   enable_interrupt = (s3c240x_iic_regs[0] >> 5) & 1;
1039   enable_interrupt = BIT( s3c240x_iic_regs[0], 5);
10101040   if (enable_interrupt)
10111041   {
10121042//      logerror( "IIC request irq\n");
r6581r6582
11821212   s3c240x_pwm_timer[4] = timer_alloc(machine, s3c240x_pwm_timer_exp, (void *)(FPTR)4);
11831213   s3c240x_iic_timer = timer_alloc(machine, s3c240x_iic_timer_exp, (void *)(FPTR)0);
11841214   s3c240x_iis_timer = timer_alloc(machine, s3c240x_iis_timer_exp, (void *)(FPTR)0);
1215   eeprom_data = auto_alloc_array( machine, UINT8, 0x2000);
11851216   smc_init( machine);
11861217   i2s_init( machine);
11871218}
r6581r6582
11921223   i2s_reset( machine);
11931224}
11941225
1226static NVRAM_HANDLER( gp32 )
1227{
1228   if (read_or_write)
1229   {
1230      if (file)
1231      {
1232         mame_fwrite( file, eeprom_data, 0x2000);
1233      }
1234   }
1235   else
1236   {
1237      if (file)
1238      {
1239         mame_fread( file, eeprom_data, 0x2000);
1240      }
1241      else
1242      {
1243         memset( eeprom_data, 0, 0x2000);
1244      }
1245   }
1246}
1247
11951248static ADDRESS_MAP_START( gp32_map, ADDRESS_SPACE_PROGRAM, 32 )
11961249   AM_RANGE(0x00000000, 0x0007ffff) AM_ROM
11971250   AM_RANGE(0x0c000000, 0x0c7fffff) AM_RAM AM_BASE(&s3c240x_ram)
r6581r6582
12671320   MDRV_SOUND_ADD("dac2", DMADAC, 0)
12681321   MDRV_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
12691322
1323   MDRV_NVRAM_HANDLER(gp32)
1324
12701325   MDRV_SMARTMEDIA_ADD("smartmedia")
12711326MACHINE_DRIVER_END
12721327

Previous 15994 Revisions Next


© 1998-2018 The MESS Team