Previous 15994 Revisions Next

r6576 Tuesday 8th December, 2009 at 09:31:07 UTC by Tim Schuerewegen
[GP32] Fixed lost I2C interrupt. Fixed UART 1 transmit status.
[src/mess/drivers]gp32.c

src/mess/drivers/gp32.c
r6575r6576
115115      }
116116      break;
117117   }
118//   logerror( "(LCD) %08X -> %08X (PC %08X)\n", 0x14A00000 + (offset << 2), data, cpu_get_pc( space->cpu));
118119   return data;
119120}
120121
121122static WRITE32_HANDLER( s3c240x_vidregs_w )
122123{
123//   logerror( "(LCD) %08X <- %08X\n", 0x14A00000 + (offset << 2), data);
124//   logerror( "(LCD) %08X <- %08X (PC %08X)\n", 0x14A00000 + (offset << 2), data, cpu_get_pc( space->cpu));
124125   COMBINE_DATA(&s3c240x_vidregs[offset]);
125126}
126127
r6575r6576
187188
188189static WRITE32_HANDLER( s3c240x_clkpow_w )
189190{
190//   logerror( "(CLKPOW) %08X <- %08X\n", 0x14800000 + (offset << 2), data);
191//   logerror( "(CLKPOW) %08X <- %08X (PC %08X)\n", 0x14800000 + (offset << 2), data, cpu_get_pc( space->cpu));
191192   COMBINE_DATA(&s3c240x_clkpow_regs[offset]);
192193   switch (offset)
193194   {
r6575r6576
204205
205206static UINT32 s3c240x_irq_regs[0x18/4];
206207
208static void s3c240x_check_pending_irq( running_machine *machine)
209{
210   if (s3c240x_irq_regs[0] != 0)
211   {
212      UINT32 int_type = 0, temp;
213      temp = s3c240x_irq_regs[0];
214      while (!(temp & 1))
215      {
216         int_type++;
217         temp = temp >> 1;
218      }
219      s3c240x_irq_regs[4] |= (1 << int_type); // INTPND
220      s3c240x_irq_regs[5] = int_type; // INTOFFSET
221      cpu_set_input_line( cputag_get_cpu( machine, "maincpu"), ARM7_IRQ_LINE, ASSERT_LINE);
222   }
223   else
224   {
225      cpu_set_input_line( cputag_get_cpu( machine, "maincpu"), ARM7_IRQ_LINE, CLEAR_LINE);
226   }
227}
228
229static void s3c240x_request_irq( running_machine *machine, UINT32 int_type)
230{
231//   logerror( "request irq %d\n", int_type);
232//   logerror( "(1) %08X %08X %08X %08X %08X %08X\n", s3c240x_irq_regs[0], s3c240x_irq_regs[1], s3c240x_irq_regs[2], s3c240x_irq_regs[3], s3c240x_irq_regs[4], s3c240x_irq_regs[5]);
233   if (s3c240x_irq_regs[0] == 0)
234   {
235      s3c240x_irq_regs[0] |= (1 << int_type); // SRCPND
236      s3c240x_irq_regs[4] |= (1 << int_type); // INTPND
237      s3c240x_irq_regs[5] = int_type; // INTOFFSET
238      cpu_set_input_line( cputag_get_cpu( machine, "maincpu"), ARM7_IRQ_LINE, ASSERT_LINE);
239   }
240   else
241   {
242      s3c240x_irq_regs[0] |= (1 << int_type); // SRCPND
243      s3c240x_check_pending_irq( machine);
244   }
245}
246
247
207248static READ32_HANDLER( s3c240x_irq_r )
208249{
209250   UINT32 data = s3c240x_irq_regs[offset];
210//   logerror( "(IRQ) %08X -> %08X\n", 0x14400000 + (offset << 2), data);
251//   logerror( "(IRQ) %08X -> %08X (PC %08X)\n", 0x14400000 + (offset << 2), data, cpu_get_pc( space->cpu));
211252   return data;
212253}
213254
214255static WRITE32_HANDLER( s3c240x_irq_w )
215256{
216//   logerror( "(IRQ) %08X <- %08X\n", 0x14400000 + (offset << 2), data);
257   UINT32 old_value = s3c240x_irq_regs[offset];
258//   logerror( "(IRQ) %08X <- %08X (PC %08X)\n", 0x14400000 + (offset << 2), data, cpu_get_pc( space->cpu));
259   COMBINE_DATA(&s3c240x_irq_regs[offset]);
217260   switch (offset)
218261   {
219262      // SRCPND
220263      case 0x00 / 4 :
221264      {
222         cpu_set_input_line( cputag_get_cpu( space->machine, "maincpu"), ARM7_IRQ_LINE, CLEAR_LINE);
265         s3c240x_irq_regs[0] = (old_value & ~data); // clear only the bit positions of SRCPND corresponding to those set to one in the data
266//         logerror( "(2) %08X %08X %08X %08X %08X %08X\n", s3c240x_irq_regs[0], s3c240x_irq_regs[1], s3c240x_irq_regs[2], s3c240x_irq_regs[3], s3c240x_irq_regs[4], s3c240x_irq_regs[5]);
267         s3c240x_check_pending_irq( space->machine);
223268      }
224269      break;
270      // INTPND
271      case 0x10 / 4 :
272      {
273         s3c240x_irq_regs[4] = (old_value & ~data); // clear only the bit positions of INTPND corresponding to those set to one in the data
274//         logerror( "(3) %08X %08X %08X %08X %08X %08X\n", s3c240x_irq_regs[0], s3c240x_irq_regs[1], s3c240x_irq_regs[2], s3c240x_irq_regs[3], s3c240x_irq_regs[4], s3c240x_irq_regs[5]);
275      }
276      break;
225277   }
226   COMBINE_DATA(&s3c240x_irq_regs[offset]);
227278}
228279
229static void s3c240x_request_irq( running_machine *machine, UINT32 int_type)
230{
231//   logerror( "request irq %d\n", int_type);
232//   logerror( "%08X %08X %08X %08X %08X %08X\n", s3c240x_irq_regs[0], s3c240x_irq_regs[1], s3c240x_irq_regs[2], s3c240x_irq_regs[3], s3c240x_irq_regs[4], s3c240x_irq_regs[5]);
233   s3c240x_irq_regs[5] = int_type; // INTOFFSET
234   cpu_set_input_line( cputag_get_cpu( machine, "maincpu"), ARM7_IRQ_LINE, ASSERT_LINE);
235//   cpu_set_input_line( cputag_get_cpu( machine, "maincpu"), ARM7_IRQ_LINE, CLEAR_LINE);
236}
237
238280// PWM TIMER
239281
240282#if 0
r6575r6576
267309static READ32_HANDLER( s3c240x_timer_r )
268310{
269311   UINT32 data = s3c240x_timer_regs[offset];
270//   logerror( "(TIMER) %08X -> %08X\n", 0x15100000 + (offset << 2), data);
312//   logerror( "(TIMER) %08X -> %08X (PC %08X)\n", 0x15100000 + (offset << 2), data, cpu_get_pc( space->cpu));
271313   return data;
272314}
273315
r6575r6576
311353static WRITE32_HANDLER( s3c240x_timer_w )
312354{
313355   UINT32 old_value = s3c240x_timer_regs[offset];
314//   logerror( "(TIMER) %08X <- %08X\n", 0x15100000 + (offset << 2), data);
356//   logerror( "(TIMER) %08X <- %08X (PC %08X)\n", 0x15100000 + (offset << 2), data, cpu_get_pc( space->cpu));
315357   COMBINE_DATA(&s3c240x_timer_regs[offset]);
316358   if (offset == 2)   // TCON
317359   {
r6575r6576
382424static READ32_HANDLER( s3c240x_dma_r )
383425{
384426   UINT32 data = s3c240x_dma_regs[offset];
385//   logerror( "(DMA) %08X -> %08X\n", 0x14600000 + (offset << 2), data);
427//   logerror( "(DMA) %08X -> %08X (PC %08X)\n", 0x14600000 + (offset << 2), data, cpu_get_pc( space->cpu));
386428   return data;
387429}
388430
389431static WRITE32_HANDLER( s3c240x_dma_w )
390432{
391//   logerror( "(DMA) %08X <- %08X\n", 0x14600000 + (offset << 2), data);
433//   logerror( "(DMA) %08X <- %08X (PC %08X)\n", 0x14600000 + (offset << 2), data, cpu_get_pc( space->cpu));
392434   COMBINE_DATA(&s3c240x_dma_regs[offset]);
393435   switch (offset)
394436   {
r6575r6576
434476   UINT8 datatx;
435477} smc;
436478
437void smc_reset(void)
479static void smc_reset(void)
438480{
439481//   logerror( "smc_reset\n");
440482   smc.add_latch = 0;
r6575r6576
506548static READ32_HANDLER( s3c240x_gpio_r )
507549{
508550   UINT32 data = s3c240x_gpio[offset];
509//   logerror("read GPIO @ 0x156000%02x (PC %x)\n", offset*4, cpu_get_pc(space->cpu));
510551   switch (offset)
511552   {
512553      // PBCON
r6575r6576
553594      }
554595      break;
555596   }
597//   logerror( "(GPIO) %08X -> %08X (PC %08X)\n", 0x15600000 + (offset << 2), data, cpu_get_pc( space->cpu));
556598   return data;
557599}
558600
r6575r6576
560602{
561603//   UINT32 old_value = s3c240x_timer_regs[offset];
562604   COMBINE_DATA(&s3c240x_gpio[offset]);
563//   logerror("%08x to GPIO @ 0x156000%02x (PC %x)\n", data, offset*4, cpu_get_pc(space->cpu));
564//   if (offset == 0x30/4) logerror("[%08x] %s %s\n", data, (data & 0x200) ? "SCL" : "scl", (data & 0x400) ? "SDL" : "sdl");
605//   logerror( "(GPIO) %08X <- %08X (PC %08X)\n", 0x15600000 + (offset << 2), data, cpu_get_pc( space->cpu));
565606   switch (offset)
566607   {
567608      // PBCON
568609      case 0x08 / 4 :
569610      {
570611         // smartmedia
571         //if ((old_value & 0x00000001) != (data & 0x00000001))
572         {
573            smc.read = ((data & 0x00000001) == 0);
574            smc_update( space->machine);
575         }
612         smc.read = ((data & 0x00000001) == 0);
613         smc_update( space->machine);
576614      }
577615      break;
578616      // PBDAT
r6575r6576
586624      case 0x24 / 4 :
587625      {
588626         // smartmedia
589         //if ((old_value & 0x000001C0) != (data & 0x000001C0))
590         {
591            smc.do_read = ((data & 0x00000100) == 0);
592            smc.chip = ((data & 0x00000080) == 0);
593            smc.wp = ((data & 0x00000040) == 0);
594            smc_update( space->machine);
595         }
627         smc.do_read = ((data & 0x00000100) == 0);
628         smc.chip = ((data & 0x00000080) == 0);
629         smc.wp = ((data & 0x00000040) == 0);
630         smc_update( space->machine);
596631      }
597632      break;
598633      // PEDAT
599634      case 0x30 / 4 :
600635      {
601636         // smartmedia
602         //if ((old_value & 0x00000038) != (data & 0x00000038))
603         {
604            smc.cmd_latch = ((data & 0x00000020) != 0);
605            smc.add_latch = ((data & 0x00000010) != 0);
606            smc.do_write  = ((data & 0x00000008) == 0);
607            smc_update( space->machine);
608         }
637         smc.cmd_latch = ((data & 0x00000020) != 0);
638         smc.add_latch = ((data & 0x00000010) != 0);
639         smc.do_write  = ((data & 0x00000008) == 0);
640         smc_update( space->machine);
609641      }
610642      break;
611643   }
r6575r6576
622654
623655static WRITE32_HANDLER( s3c240x_memcon_w )
624656{
625//   logerror( "(MEMCON) %08X <- %08X\n", 0x14000000 + (offset << 2), data);
657//   logerror( "(MEMCON) %08X <- %08X (PC %08X)\n", 0x14000000 + (offset << 2), data, cpu_get_pc( space->cpu));
626658   COMBINE_DATA(&s3c240x_memcon_regs[offset]);
627659}
628660
r6575r6576
637669
638670static WRITE32_HANDLER( s3c240x_usb_host_w )
639671{
640//   logerror( "(USB H) %08X <- %08X\n", 0x14200000 + (offset << 2), data);
672//   logerror( "(USB H) %08X <- %08X (PC %08X)\n", 0x14200000 + (offset << 2), data, cpu_get_pc( space->cpu));
641673   COMBINE_DATA(&s3c240x_usb_host_regs[offset]);
642674}
643675
r6575r6576
653685      // UTRSTAT0
654686      case 0x10 / 4 :
655687      {
656         data = (data & ~0x00000006) | 0x00000004 | 0x00000002;
688         data = (data & ~0x00000006) | 0x00000004 | 0x00000002; // [bit 2] Transmitter empty / [bit 1] Transmit buffer empty
657689      }
658690      break;
659691   }
692//   logerror( "(UART 0) %08X -> %08X (PC %08X)\n", 0x15000000 + (offset << 2), data, cpu_get_pc( space->cpu));
660693   return data;
661694}
662695
663696static WRITE32_HANDLER( s3c240x_uart_0_w )
664697{
665//   logerror( "(UART 0) %08X <- %08X\n", 0x15000000 + (offset << 2), data);
698//   logerror( "(UART 0) %08X <- %08X (PC %08X)\n", 0x15000000 + (offset << 2), data, cpu_get_pc( space->cpu));
666699   COMBINE_DATA(&s3c240x_uart_0_regs[offset]);
667700}
668701
r6575r6576
672705
673706static READ32_HANDLER( s3c240x_uart_1_r )
674707{
675   return s3c240x_uart_1_regs[offset];
708   UINT32 data = s3c240x_uart_1_regs[offset];
709   switch (offset)
710   {
711      // UTRSTAT1
712      case 0x10 / 4 :
713      {
714         data = (data & ~0x00000006) | 0x00000004 | 0x00000002; // [bit 2] Transmitter empty / [bit 1] Transmit buffer empty
715      }
716      break;
717   }
718//   logerror( "(UART 1) %08X -> %08X (PC %08X)\n", 0x15004000 + (offset << 2), data, cpu_get_pc( space->cpu));
719   return data;
676720}
677721
678722static WRITE32_HANDLER( s3c240x_uart_1_w )
679723{
680//   logerror( "(UART 1) %08X <- %08X\n", 0x15004000 + (offset << 2), data);
724//   logerror( "(UART 1) %08X <- %08X (PC %08X)\n", 0x15004000 + (offset << 2), data, cpu_get_pc( space->cpu));
681725   COMBINE_DATA(&s3c240x_uart_1_regs[offset]);
682726}
683727
r6575r6576
687731
688732static READ32_HANDLER( s3c240x_usb_device_r )
689733{
690   return s3c240x_usb_device_regs[offset];
734   UINT32 data = s3c240x_usb_device_regs[offset];
735//   logerror( "(USB D) %08X -> %08X (PC %08X)\n", 0x15200140 + (offset << 2), data, cpu_get_pc( space->cpu));
736   return data;
691737}
692738
693739static WRITE32_HANDLER( s3c240x_usb_device_w )
694740{
695//   logerror( "(USB D) %08X <- %08X\n", 0x15200140 + (offset << 2), data);
741//   logerror( "(USB D) %08X <- %08X (PC %08X)\n", 0x15200140 + (offset << 2), data, cpu_get_pc( space->cpu));
696742   COMBINE_DATA(&s3c240x_usb_device_regs[offset]);
697743}
698744
r6575r6576
707753
708754static WRITE32_HANDLER( s3c240x_watchdog_w )
709755{
710//   logerror( "(WDOG) %08X <- %08X\n", 0x15300000 + (offset << 2), data);
756//   logerror( "(WDOG) %08X <- %08X (PC %08X)\n", 0x15300000 + (offset << 2), data, cpu_get_pc( space->cpu));
711757   COMBINE_DATA(&s3c240x_watchdog_regs[offset]);
712758}
713759
r6575r6576
784830      }
785831      break;
786832   }
787//   logerror( "(IIC) %08X -> %08X\n", 0x15400000 + (offset << 2), data);
833//   logerror( "(IIC) %08X -> %08X (PC %08X)\n", 0x15400000 + (offset << 2), data, cpu_get_pc( space->cpu));
788834   return data;
789835}
790836
791837static WRITE32_HANDLER( s3c240x_iic_w )
792838{
793//   logerror( "(IIC) %08X <- %08X\n", 0x15400000 + (offset << 2), data);
839//   logerror( "(IIC) %08X <- %08X (PC %08X)\n", 0x15400000 + (offset << 2), data, cpu_get_pc( space->cpu));
794840   COMBINE_DATA(&s3c240x_iic_regs[offset]);
795841   switch (offset)
796842   {
r6575r6576
880926static READ32_HANDLER( s3c240x_iis_r )
881927{
882928   UINT32 data = s3c240x_iis_regs[offset];
883   //if (offset == 0) data = data & (~0x01); // mp3
929//   logerror( "(IIS) %08X -> %08X (PC %08X)\n", 0x15508000 + (offset << 2), data, cpu_get_pc( space->cpu));
884930   return data;
885931}
886932
887933static WRITE32_HANDLER( s3c240x_iis_w )
888934{
889//   logerror( "(IIS) %08X <- %08X\n", 0x15508000 + (offset << 2), data);
935//   logerror( "(IIS) %08X <- %08X (PC %08X)\n", 0x15508000 + (offset << 2), data, cpu_get_pc( space->cpu));
890936   COMBINE_DATA(&s3c240x_iis_regs[offset]);
891937}
892938
r6575r6576
901947
902948static WRITE32_HANDLER( s3c240x_rtc_w )
903949{
904//   logerror( "(RTC) %08X <- %08X\n", 0x15700040 + (offset << 2), data);
950//   logerror( "(RTC) %08X <- %08X (PC %08X)\n", 0x15700040 + (offset << 2), data, cpu_get_pc( space->cpu));
905951   COMBINE_DATA(&s3c240x_rtc_regs[offset]);
906952}
907953
r6575r6576
916962
917963static WRITE32_HANDLER( s3c240x_adc_w )
918964{
919//   logerror( "(ADC) %08X <- %08X\n", 0x15800000 + (offset << 2), data);
965//   logerror( "(ADC) %08X <- %08X (PC %08X)\n", 0x15800000 + (offset << 2), data, cpu_get_pc( space->cpu));
920966   COMBINE_DATA(&s3c240x_adc_regs[offset]);
921967}
922968
r6575r6576
931977
932978static WRITE32_HANDLER( s3c240x_spi_w )
933979{
934//   logerror( "(SPI) %08X <- %08X\n", 0x15900000 + (offset << 2), data);
980//   logerror( "(SPI) %08X <- %08X (PC %08X)\n", 0x15900000 + (offset << 2), data, cpu_get_pc( space->cpu));
935981   COMBINE_DATA(&s3c240x_spi_regs[offset]);
936982}
937983

Previous 15994 Revisions Next


© 1998-2018 The MESS Team