Previous 15994 Revisions Next

r9684 Sunday 28th November, 2010 at 12:18:09 UTC by Nathan Woods
More Atari Ace stuff. [Atari Ace]
[src/mess/drivers]ip20.c ip22.c isbc.c junior.c k1003.c k8915.c kim1.c mk1.c mk2.c partner.c pegasus.c pk8020.c pmd85.c pp01.c psx.c sage2.c sgi_ip2.c sgi_ip6.c svi318.c sym1.c vector4.c
[src/mess/includes]mz700.h partner.h pc8801.h pegasus.h pk8020.h pmd85.h pp01.h svi318.h sym1.h
[src/mess/machine]mz700.c partner.c pc8801.c pk8020.c pmd85.c pp01.c svi318.c sym1.c
[src/mess/video]pc8801.c pegasus.c pk8020.c pp01.c

src/mess/machine/pmd85.c
r9683r9684
1919#include "machine/serial.h"
2020#include "devices/messram.h"
2121
22static UINT8 pmd85_rom_module_present = 0;
2322
24static UINT8 pmd85_ppi_port_outputs[4][3];
2523
26static UINT8 pmd85_startup_mem_map = 0;
27static UINT8 pmd853_memory_mapping;
2824static void (*pmd85_update_memory)(running_machine *);
29static int previous_level;
30static int clk_level;
31static int clk_level_tape;
3225
3326enum {PMD85_LED_1, PMD85_LED_2, PMD85_LED_3};
3427enum {PMD85_1, PMD85_2, PMD85_2A, PMD85_2B, PMD85_3, ALFA, MATO, C2717};
3528
36static UINT8 pmd85_model;
3729
38static emu_timer * pmd85_cassette_timer;
3930
4031static void pmd851_update_memory(running_machine *machine)
4132{
33   pmd85_state *state = machine->driver_data<pmd85_state>();
4234   address_space* space = cputag_get_address_space(machine, "maincpu",ADDRESS_SPACE_PROGRAM);
4335
44   if (pmd85_startup_mem_map)
36   if (state->startup_mem_map)
4537   {
4638      UINT8 *mem = memory_region(machine, "maincpu");
4739
r9683r9684
8274
8375static void pmd852a_update_memory(running_machine *machine)
8476{
77   pmd85_state *state = machine->driver_data<pmd85_state>();
8578   address_space* space = cputag_get_address_space(machine, "maincpu",ADDRESS_SPACE_PROGRAM);
8679
87   if (pmd85_startup_mem_map)
80   if (state->startup_mem_map)
8881   {
8982      UINT8 *mem = memory_region(machine, "maincpu");
9083
r9683r9684
118111
119112static void pmd853_update_memory(running_machine *machine)
120113{
121   if (pmd85_startup_mem_map)
114   pmd85_state *state = machine->driver_data<pmd85_state>();
115   if (state->startup_mem_map)
122116   {
123117      UINT8 *mem = memory_region(machine, "maincpu");
124118
r9683r9684
148142      memory_set_bankptr(machine,  "bank5", messram_get_ptr(machine->device("messram")) + 0x8000);
149143      memory_set_bankptr(machine,  "bank6", messram_get_ptr(machine->device("messram")) + 0xa000);
150144      memory_set_bankptr(machine,  "bank7", messram_get_ptr(machine->device("messram")) + 0xc000);
151      memory_set_bankptr(machine,  "bank8", pmd853_memory_mapping ? memory_region(machine, "maincpu") + 0x010000 : messram_get_ptr(machine->device("messram")) + 0xe000);
145      memory_set_bankptr(machine,  "bank8", state->pmd853_memory_mapping ? memory_region(machine, "maincpu") + 0x010000 : messram_get_ptr(machine->device("messram")) + 0xe000);
152146   }
153147}
154148
155149static void alfa_update_memory(running_machine *machine)
156150{
151   pmd85_state *state = machine->driver_data<pmd85_state>();
157152   address_space* space = cputag_get_address_space(machine, "maincpu",ADDRESS_SPACE_PROGRAM);
158153
159   if (pmd85_startup_mem_map)
154   if (state->startup_mem_map)
160155   {
161156      UINT8 *mem = memory_region(machine, "maincpu");
162157
r9683r9684
186181
187182static void mato_update_memory(running_machine *machine)
188183{
184   pmd85_state *state = machine->driver_data<pmd85_state>();
189185   address_space* space = cputag_get_address_space(machine, "maincpu",ADDRESS_SPACE_PROGRAM);
190186
191   if (pmd85_startup_mem_map)
187   if (state->startup_mem_map)
192188   {
193189      UINT8 *mem = memory_region(machine, "maincpu");
194190
r9683r9684
210206
211207static void c2717_update_memory(running_machine *machine)
212208{
209   pmd85_state *state = machine->driver_data<pmd85_state>();
213210   address_space* space = cputag_get_address_space(machine, "maincpu",ADDRESS_SPACE_PROGRAM);
214211
215212   UINT8 *mem = memory_region(machine, "maincpu");
216   if (pmd85_startup_mem_map)
213   if (state->startup_mem_map)
217214   {
218215      memory_unmap_write(space, 0x0000, 0x3fff, 0, 0);
219216
r9683r9684
245242
246243static  READ8_DEVICE_HANDLER ( pmd85_ppi_0_portb_r )
247244{
245   pmd85_state *state = device->machine->driver_data<pmd85_state>();
248246   static const char *const keynames[] = {
249247      "KEY0", "KEY1", "KEY2", "KEY3", "KEY4", "KEY5", "KEY6", "KEY7",
250248      "KEY8", "KEY9", "KEY10", "KEY11", "KEY12", "KEY13", "KEY14", "KEY15"
251249   };
252250
253   return input_port_read(device->machine, keynames[(pmd85_ppi_port_outputs[0][0] & 0x0f)]) & input_port_read(device->machine, "KEY15");
251   return input_port_read(device->machine, keynames[(state->ppi_port_outputs[0][0] & 0x0f)]) & input_port_read(device->machine, "KEY15");
254252}
255253
256254static  READ8_DEVICE_HANDLER ( pmd85_ppi_0_portc_r )
r9683r9684
260258
261259static WRITE8_DEVICE_HANDLER ( pmd85_ppi_0_porta_w )
262260{
263   pmd85_ppi_port_outputs[0][0] = data;
261   pmd85_state *state = device->machine->driver_data<pmd85_state>();
262   state->ppi_port_outputs[0][0] = data;
264263}
265264
266265static WRITE8_DEVICE_HANDLER ( pmd85_ppi_0_portb_w )
267266{
268   pmd85_ppi_port_outputs[0][1] = data;
267   pmd85_state *state = device->machine->driver_data<pmd85_state>();
268   state->ppi_port_outputs[0][1] = data;
269269}
270270
271271static WRITE8_DEVICE_HANDLER ( pmd85_ppi_0_portc_w )
272272{
273   pmd85_ppi_port_outputs[0][2] = data;
273   pmd85_state *state = device->machine->driver_data<pmd85_state>();
274   state->ppi_port_outputs[0][2] = data;
274275   set_led_status(device->machine, PMD85_LED_2, (data & 0x08) ? 1 : 0);
275276   set_led_status(device->machine, PMD85_LED_3, (data & 0x04) ? 1 : 0);
276277}
r9683r9684
285286
286287static  READ8_DEVICE_HANDLER ( mato_ppi_0_portb_r )
287288{
289   pmd85_state *state = device->machine->driver_data<pmd85_state>();
288290   int i;
289291   UINT8 data = 0xff;
290292   static const char *const keynames[] = { "KEY0", "KEY1", "KEY2", "KEY3", "KEY4", "KEY5", "KEY6", "KEY7" };
291293
292294   for (i = 0; i < 8; i++)
293295   {
294      if (!BIT(pmd85_ppi_port_outputs[0][0], i))
296      if (!BIT(state->ppi_port_outputs[0][0], i))
295297         data &= input_port_read(device->machine, keynames[i]);
296298   }
297299   return data;
r9683r9684
304306
305307static WRITE8_DEVICE_HANDLER ( mato_ppi_0_portc_w )
306308{
307   pmd85_ppi_port_outputs[0][2] = data;
309   pmd85_state *state = device->machine->driver_data<pmd85_state>();
310   state->ppi_port_outputs[0][2] = data;
308311   set_led_status(device->machine, PMD85_LED_2, BIT(data, 3));
309312   set_led_status(device->machine, PMD85_LED_3, BIT(data, 2));
310313}
r9683r9684
334337
335338static WRITE8_DEVICE_HANDLER ( pmd85_ppi_1_porta_w )
336339{
337   pmd85_ppi_port_outputs[1][0] = data;
340   pmd85_state *state = device->machine->driver_data<pmd85_state>();
341   state->ppi_port_outputs[1][0] = data;
338342}
339343
340344static WRITE8_DEVICE_HANDLER ( pmd85_ppi_1_portb_w )
341345{
342   pmd85_ppi_port_outputs[1][1] = data;
346   pmd85_state *state = device->machine->driver_data<pmd85_state>();
347   state->ppi_port_outputs[1][1] = data;
343348}
344349
345350static WRITE8_DEVICE_HANDLER ( pmd85_ppi_1_portc_w )
346351{
347   pmd85_ppi_port_outputs[1][2] = data;
352   pmd85_state *state = device->machine->driver_data<pmd85_state>();
353   state->ppi_port_outputs[1][2] = data;
348354}
349355
350356/*******************************************************************************
r9683r9684
376382
377383static WRITE8_DEVICE_HANDLER ( pmd85_ppi_2_porta_w )
378384{
379   pmd85_ppi_port_outputs[2][0] = data;
385   pmd85_state *state = device->machine->driver_data<pmd85_state>();
386   state->ppi_port_outputs[2][0] = data;
380387}
381388
382389static WRITE8_DEVICE_HANDLER ( pmd85_ppi_2_portb_w )
383390{
384   pmd85_ppi_port_outputs[2][1] = data;
391   pmd85_state *state = device->machine->driver_data<pmd85_state>();
392   state->ppi_port_outputs[2][1] = data;
385393}
386394
387395static WRITE8_DEVICE_HANDLER ( pmd85_ppi_2_portc_w )
388396{
389   pmd85_ppi_port_outputs[2][2] = data;
397   pmd85_state *state = device->machine->driver_data<pmd85_state>();
398   state->ppi_port_outputs[2][2] = data;
390399}
391400
392401/*******************************************************************************
r9683r9684
446455
447456static READ8_DEVICE_HANDLER ( pmd85_ppi_3_porta_r )
448457{
458   pmd85_state *state = device->machine->driver_data<pmd85_state>();
449459   if (memory_region(device->machine, "user1") != NULL)
450      return memory_region(device->machine, "user1")[pmd85_ppi_port_outputs[3][1] | (pmd85_ppi_port_outputs[3][2] << 8)];
460      return memory_region(device->machine, "user1")[state->ppi_port_outputs[3][1] | (state->ppi_port_outputs[3][2] << 8)];
451461   else
452462      return 0;
453463}
r9683r9684
464474
465475static WRITE8_DEVICE_HANDLER ( pmd85_ppi_3_porta_w )
466476{
467   pmd85_ppi_port_outputs[3][0] = data;
477   pmd85_state *state = device->machine->driver_data<pmd85_state>();
478   state->ppi_port_outputs[3][0] = data;
468479}
469480
470481static WRITE8_DEVICE_HANDLER ( pmd85_ppi_3_portb_w )
471482{
472   pmd85_ppi_port_outputs[3][1] = data;
483   pmd85_state *state = device->machine->driver_data<pmd85_state>();
484   state->ppi_port_outputs[3][1] = data;
473485}
474486
475487static WRITE8_DEVICE_HANDLER ( pmd85_ppi_3_portc_w )
476488{
477   pmd85_ppi_port_outputs[3][2] = data;
489   pmd85_state *state = device->machine->driver_data<pmd85_state>();
490   state->ppi_port_outputs[3][2] = data;
478491}
479492
480493/*******************************************************************************
r9683r9684
502515
503516READ8_HANDLER ( pmd85_io_r )
504517{
505   if (pmd85_startup_mem_map)
518   pmd85_state *state = space->machine->driver_data<pmd85_state>();
519   if (state->startup_mem_map)
506520   {
507521      return 0xff;
508522   }
r9683r9684
517531            }
518532            break;
519533      case 0x08:   /* ROM module connector */
520            switch (pmd85_model)
534            switch (state->model)
521535            {
522536               case PMD85_1:
523537               case PMD85_2:
524538               case PMD85_2A:
525539               case C2717:
526540               case PMD85_3:
527                  if (pmd85_rom_module_present)
541                  if (state->rom_module_present)
528542                  {
529543                     switch (offset & 0x80)
530544                     {
r9683r9684
568582
569583WRITE8_HANDLER ( pmd85_io_w )
570584{
571   if (pmd85_startup_mem_map)
585   pmd85_state *state = space->machine->driver_data<pmd85_state>();
586   if (state->startup_mem_map)
572587   {
573      pmd85_startup_mem_map = 0;
588      state->startup_mem_map = 0;
574589      (*pmd85_update_memory)(space->machine);
575590   }
576591
r9683r9684
584599                     /* PMD-85.3 memory banking */
585600                     if ((offset & 0x03) == 0x03)
586601                     {
587                        pmd853_memory_mapping = data & 0x01;
602                        state->pmd853_memory_mapping = data & 0x01;
588603                        (*pmd85_update_memory)(space->machine);
589604                     }
590605                     break;
591606            }
592607            break;
593608      case 0x08:   /* ROM module connector */
594            switch (pmd85_model)
609            switch (state->model)
595610            {
596611               case PMD85_1:
597612               case PMD85_2:
598613               case PMD85_2A:
599614               case C2717:
600615               case PMD85_3:
601                  if (pmd85_rom_module_present)
616                  if (state->rom_module_present)
602617                  {
603618                     switch (offset & 0x80)
604619                     {
r9683r9684
654669
655670 READ8_HANDLER ( mato_io_r )
656671{
657   if (pmd85_startup_mem_map)
672   pmd85_state *state = space->machine->driver_data<pmd85_state>();
673   if (state->startup_mem_map)
658674   {
659675      return 0xff;
660676   }
r9683r9684
676692
677693WRITE8_HANDLER ( mato_io_w )
678694{
679   if (pmd85_startup_mem_map)
695   pmd85_state *state = space->machine->driver_data<pmd85_state>();
696   if (state->startup_mem_map)
680697   {
681      pmd85_startup_mem_map = 0;
698      state->startup_mem_map = 0;
682699      (*pmd85_update_memory)(space->machine);
683700   }
684701
r9683r9684
778795
779796static TIMER_CALLBACK(pmd85_cassette_timer_callback)
780797{
798   pmd85_state *state = machine->driver_data<pmd85_state>();
781799   int data;
782800   int current_level;
783801
r9683r9684
786804      /* tape reading */
787805      if (cassette_get_state(machine->device("cassette"))&CASSETTE_PLAY)
788806      {
789         switch (pmd85_model)
807         switch (state->model)
790808         {
791809            case PMD85_1:
792               if (clk_level_tape)
810               if (state->clk_level_tape)
793811               {
794                  previous_level = (cassette_input(machine->device("cassette")) > 0.038) ? 1 : 0;
795                  clk_level_tape = 0;
812                  state->previous_level = (cassette_input(machine->device("cassette")) > 0.038) ? 1 : 0;
813                  state->clk_level_tape = 0;
796814               }
797815               else
798816               {
799817                  current_level = (cassette_input(machine->device("cassette")) > 0.038) ? 1 : 0;
800818
801                  if (previous_level!=current_level)
819                  if (state->previous_level!=current_level)
802820                  {
803                     data = (!previous_level && current_level) ? 1 : 0;
821                     data = (!state->previous_level && current_level) ? 1 : 0;
804822
805823                     set_out_data_bit(pmd85_cassette_serial_connection.State, data);
806824                     serial_connection_out(machine, &pmd85_cassette_serial_connection);
807825                     msm8251_receive_clock(machine->device("uart"));
808826
809                     clk_level_tape = 1;
827                     state->clk_level_tape = 1;
810828                  }
811829               }
812830               return;
r9683r9684
824842      if (cassette_get_state(machine->device("cassette"))&CASSETTE_RECORD)
825843      {
826844         data = get_in_data_bit(pmd85_cassette_serial_connection.input_state);
827         data ^= clk_level_tape;
845         data ^= state->clk_level_tape;
828846         cassette_output(machine->device("cassette"), data&0x01 ? 1 : -1);
829847
830         if (!clk_level_tape)
848         if (!state->clk_level_tape)
831849            msm8251_transmit_clock(machine->device("uart"));
832850
833         clk_level_tape = clk_level_tape ? 0 : 1;
851         state->clk_level_tape = state->clk_level_tape ? 0 : 1;
834852
835853         return;
836854      }
837855
838      clk_level_tape = 1;
856      state->clk_level_tape = 1;
839857
840      if (!clk_level)
858      if (!state->clk_level)
841859         msm8251_transmit_clock(machine->device("uart"));
842      clk_level = clk_level ? 0 : 1;
860      state->clk_level = state->clk_level ? 0 : 1;
843861   }
844862}
845863
r9683r9684
857875
858876static void pmd85_common_driver_init (running_machine *machine)
859877{
860   previous_level = 0;
861   clk_level = clk_level_tape = 1;
862   pmd85_cassette_timer = timer_alloc(machine, pmd85_cassette_timer_callback, NULL);
863   timer_adjust_periodic(pmd85_cassette_timer, attotime_zero, 0, ATTOTIME_IN_HZ(2400));
878   pmd85_state *state = machine->driver_data<pmd85_state>();
879   state->previous_level = 0;
880   state->clk_level = state->clk_level_tape = 1;
881   state->cassette_timer = timer_alloc(machine, pmd85_cassette_timer_callback, NULL);
882   timer_adjust_periodic(state->cassette_timer, attotime_zero, 0, ATTOTIME_IN_HZ(2400));
864883
865884   serial_connection_init(machine, &pmd85_cassette_serial_connection);
866885   serial_connection_set_in_callback(machine, &pmd85_cassette_serial_connection, pmd85_cassette_write);
r9683r9684
868887
869888DRIVER_INIT ( pmd851 )
870889{
871   pmd85_model = PMD85_1;
890   pmd85_state *state = machine->driver_data<pmd85_state>();
891   state->model = PMD85_1;
872892   pmd85_update_memory = pmd851_update_memory;
873893   pmd85_common_driver_init(machine);
874894}
875895
876896DRIVER_INIT ( pmd852a )
877897{
878   pmd85_model = PMD85_2A;
898   pmd85_state *state = machine->driver_data<pmd85_state>();
899   state->model = PMD85_2A;
879900   pmd85_update_memory = pmd852a_update_memory;
880901   pmd85_common_driver_init(machine);
881902}
882903
883904DRIVER_INIT ( pmd853 )
884905{
885   pmd85_model = PMD85_3;
906   pmd85_state *state = machine->driver_data<pmd85_state>();
907   state->model = PMD85_3;
886908   pmd85_update_memory = pmd853_update_memory;
887909   pmd85_common_driver_init(machine);
888910}
889911
890912DRIVER_INIT ( alfa )
891913{
892   pmd85_model = ALFA;
914   pmd85_state *state = machine->driver_data<pmd85_state>();
915   state->model = ALFA;
893916   pmd85_update_memory = alfa_update_memory;
894917   pmd85_common_driver_init(machine);
895918}
896919
897920DRIVER_INIT ( mato )
898921{
899   pmd85_model = MATO;
922   pmd85_state *state = machine->driver_data<pmd85_state>();
923   state->model = MATO;
900924   pmd85_update_memory = mato_update_memory;
901925}
902926
903927DRIVER_INIT ( c2717 )
904928{
905   pmd85_model = C2717;
929   pmd85_state *state = machine->driver_data<pmd85_state>();
930   state->model = C2717;
906931   pmd85_update_memory = c2717_update_memory;
907932   pmd85_common_driver_init(machine);
908933}
909934
910935static TIMER_CALLBACK( setup_machine_state )
911936{
912   if (pmd85_model != MATO)
937   pmd85_state *state = machine->driver_data<pmd85_state>();
938   if (state->model != MATO)
913939   {
914940      msm8251_connect(machine->device("uart"), &pmd85_cassette_serial_connection);
915941   }
r9683r9684
918944
919945MACHINE_RESET( pmd85 )
920946{
947   pmd85_state *state = machine->driver_data<pmd85_state>();
921948   int i, j;
922949
923950   /* checking for Rom Module */
924   switch (pmd85_model)
951   switch (state->model)
925952   {
926953      case PMD85_1:
927954      case PMD85_2A:
928955      case PMD85_3:
929956      case C2717:
930         pmd85_rom_module_present = (input_port_read(machine, "DSW0") & 0x01) ? 1 : 0;
957         state->rom_module_present = (input_port_read(machine, "DSW0") & 0x01) ? 1 : 0;
931958         break;
932959      case ALFA:
933960      case MATO:
r9683r9684
936963
937964   for (i = 0; i < 4; i++)
938965      for (j = 0; j < 3; j++)
939         pmd85_ppi_port_outputs[i][j] = 0;
966         state->ppi_port_outputs[i][j] = 0;
940967
941968   /* memory initialization */
942969   memset(messram_get_ptr(machine->device("messram")), 0, sizeof(unsigned char)*0x10000);
943   pmd853_memory_mapping = 1;
944   pmd85_startup_mem_map = 1;
970   state->pmd853_memory_mapping = 1;
971   state->startup_mem_map = 1;
945972   pmd85_update_memory(machine);
946973
947974   timer_set(machine, attotime_zero, NULL, 0, setup_machine_state);
src/mess/machine/svi318.c
r9683r9684
2828   SVI_EXPRAM3    = 3
2929};
3030
31typedef struct {
32   /* general */
33   UINT8   svi318;      /* Are we dealing with an SVI-318 or a SVI-328 model. 0 = 328, 1 = 318 */
34   /* memory */
35   UINT8   *empty_bank;
36   UINT8   bank_switch;
37   UINT8   bankLow;
38   UINT8   bankHigh1;
39   UINT8   *bankLow_ptr;
40   UINT8   bankLow_read_only;
41   UINT8   *bankHigh1_ptr;
42   UINT8   bankHigh1_read_only;
43   UINT8   *bankHigh2_ptr;
44   UINT8   bankHigh2_read_only;
45   /* keyboard */
46   UINT8   keyboard_row;
47   /* SVI-806 80 column card */
48   UINT8   svi806_present;
49   UINT8   svi806_ram_enabled;
50   region_info   *svi806_ram;
51   UINT8   *svi806_gfx;
52} SVI_318;
5331
54static SVI_318 svi;
55static UINT8 *pcart;
56static UINT32 pcart_rom_size;
57
5832static void svi318_set_banks(running_machine *machine);
5933
6034
r9683r9684
6236
6337static INS8250_INTERRUPT( svi318_ins8250_interrupt )
6438{
65   if (svi.bankLow != SVI_CART)
39   svi318_state *drvstate = device->machine->driver_data<svi318_state>();
40   if (drvstate->svi.bankLow != SVI_CART)
6641   {
6742      cputag_set_input_line(device->machine, "maincpu", 0, (state ? HOLD_LINE : CLEAR_LINE));
6843   }
r9683r9684
10681
10782DEVICE_START( svi318_cart )
10883{
109   pcart = NULL;
110   pcart_rom_size = 0;
84   svi318_state *state = device->machine->driver_data<svi318_state>();
85   state->pcart = NULL;
86   state->pcart_rom_size = 0;
11187}
11288
11389DEVICE_IMAGE_LOAD( svi318_cart )
11490{
91   svi318_state *state = image.device().machine->driver_data<svi318_state>();
11592   UINT8 *p = memory_region(image.device().machine, "user1");
11693   UINT32 size;
11794
r9683r9684
137114   if (svi318_verify_cart(p) == IMAGE_VERIFY_FAIL)
138115      return IMAGE_INIT_FAIL;
139116
140   pcart = p;
141   pcart_rom_size = size;
117   state->pcart = p;
118   state->pcart_rom_size = size;
142119
143120   return IMAGE_INIT_PASS;
144121}
145122
146123DEVICE_IMAGE_UNLOAD( svi318_cart )
147124{
148   pcart = NULL;
149   pcart_rom_size = 0;
125   svi318_state *state = image.device().machine->driver_data<svi318_state>();
126   state->pcart = NULL;
127   state->pcart_rom_size = 0;
150128}
151129
152130/* PPI */
r9683r9684
192170
193171static READ8_DEVICE_HANDLER ( svi318_ppi_port_b_r )
194172{
173   svi318_state *state = device->machine->driver_data<svi318_state>();
195174   int row;
196175   static const char *const keynames[] = {
197176      "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5",
198177      "LINE6", "LINE7", "LINE8", "LINE9", "LINE10"
199178   };
200179
201   row = svi.keyboard_row;
180   row = state->svi.keyboard_row;
202181   if (row <= 10)
203182      return input_port_read(device->machine, keynames[row]);
204183
r9683r9684
220199
221200static WRITE8_DEVICE_HANDLER ( svi318_ppi_port_c_w )
222201{
202   svi318_state *state = device->machine->driver_data<svi318_state>();
223203   int val;
224204
225205   /* key click */
r9683r9684
239219   /* cassette signal write */
240220   cassette_output(device->machine->device("cassette"), (data & 0x20) ? -1.0 : +1.0);
241221
242   svi.keyboard_row = data & 0x0F;
222   state->svi.keyboard_row = data & 0x0F;
243223}
244224
245225I8255A_INTERFACE( svi318_ppi8255_interface )
r9683r9684
301281
302282WRITE8_HANDLER( svi318_psg_port_b_w )
303283{
304   if ( (svi.bank_switch ^ data) & 0x20)
284   svi318_state *state = space->machine->driver_data<svi318_state>();
285   if ( (state->svi.bank_switch ^ data) & 0x20)
305286      set_led_status (space->machine, 0, !(data & 0x20) );
306287
307   svi.bank_switch = data;
288   state->svi.bank_switch = data;
308289   svi318_set_banks(space->machine);
309290}
310291
311292/* Disk drives  */
312293
313typedef struct
314{
315   UINT8 driveselect;
316   int drq;
317   int irq;
318   UINT8 heads[2];
319} SVI318_FDC_STRUCT;
320
321static SVI318_FDC_STRUCT svi318_fdc;
322
323294static WRITE_LINE_DEVICE_HANDLER( svi_fdc_intrq_w )
324295{
325   svi318_fdc.irq = state;
296   svi318_state *drvstate = device->machine->driver_data<svi318_state>();
297   drvstate->fdc.irq = state;
326298}
327299
328300static WRITE_LINE_DEVICE_HANDLER( svi_fdc_drq_w )
329301{
330   svi318_fdc.drq = state;
302   svi318_state *drvstate = device->machine->driver_data<svi318_state>();
303   drvstate->fdc.drq = state;
331304}
332305
333306const wd17xx_interface svi_wd17xx_interface =
r9683r9684
340313
341314static WRITE8_HANDLER( svi318_fdc_drive_motor_w )
342315{
316   svi318_state *state = space->machine->driver_data<svi318_state>();
343317   running_device *fdc = space->machine->device("wd179x");
344318   switch (data & 3)
345319   {
346320   case 1:
347321      wd17xx_set_drive(fdc,0);
348      svi318_fdc.driveselect = 0;
322      state->fdc.driveselect = 0;
349323      break;
350324   case 2:
351325      wd17xx_set_drive(fdc,1);
352      svi318_fdc.driveselect = 1;
326      state->fdc.driveselect = 1;
353327      break;
354328   }
355329}
r9683r9684
364338
365339static READ8_HANDLER( svi318_fdc_irqdrq_r )
366340{
341   svi318_state *state = space->machine->driver_data<svi318_state>();
367342   UINT8 result = 0;
368343
369   result |= svi318_fdc.drq << 6;
370   result |= svi318_fdc.irq << 7;
344   result |= state->fdc.drq << 6;
345   result |= state->fdc.irq << 7;
371346
372347   return result;
373348}
374349
375350MC6845_UPDATE_ROW( svi806_crtc6845_update_row )
376351{
352   svi318_state *state = device->machine->driver_data<svi318_state>();
377353   int i;
378354
379355   for( i = 0; i < x_count; i++ )
380356   {
381357      int j;
382      UINT8   data = svi.svi806_gfx[ svi.svi806_ram->u8(( ma + i ) & 0x7FF) * 16 + ra ];
358      UINT8   data = state->svi.svi806_gfx[ state->svi.svi806_ram->u8(( ma + i ) & 0x7FF) * 16 + ra ];
383359
384360      if ( i == cursor_x )
385361      {
r9683r9684
398374/* 80 column card init */
399375static void svi318_80col_init(running_machine *machine)
400376{
377   svi318_state *state = machine->driver_data<svi318_state>();
401378   /* 2K RAM, but allocating 4KB to make banking easier */
402379   /* The upper 2KB will be set to FFs and will never be written to */
403   svi.svi806_ram = machine->region_alloc("gfx2", 0x1000, 0 );
404   memset( svi.svi806_ram->base(), 0x00, 0x800 );
405   memset( svi.svi806_ram->base() + 0x800, 0xFF, 0x800 );
406   svi.svi806_gfx = memory_region(machine, "gfx1");
380   state->svi.svi806_ram = machine->region_alloc("gfx2", 0x1000, 0 );
381   memset( state->svi.svi806_ram->base(), 0x00, 0x800 );
382   memset( state->svi.svi806_ram->base() + 0x800, 0xFF, 0x800 );
383   state->svi.svi806_gfx = memory_region(machine, "gfx1");
407384}
408385
409386
410387static WRITE8_HANDLER( svi806_ram_enable_w )
411388{
412   svi.svi806_ram_enabled = ( data & 0x01 );
389   svi318_state *state = space->machine->driver_data<svi318_state>();
390   state->svi.svi806_ram_enabled = ( data & 0x01 );
413391   svi318_set_banks(space->machine);
414392}
415393
r9683r9684
438416
439417MACHINE_RESET( svi328_806 )
440418{
419   svi318_state *state = machine->driver_data<svi318_state>();
441420   MACHINE_RESET_CALL(svi318);
442421
443422   svi318_80col_init(machine);
444   svi.svi806_present = 1;
423   state->svi.svi806_present = 1;
445424   svi318_set_banks(machine);
446425
447426   /* Set SVI-806 80 column card palette */
r9683r9684
575554
576555DRIVER_INIT( svi318 )
577556{
557   svi318_state *state = machine->driver_data<svi318_state>();
578558   /* z80 stuff */
579559   z80_set_cycle_tables( machine->device("maincpu"), cc_op, cc_cb, cc_ed, cc_xy, cc_xycb, cc_ex );
580560
581   memset(&svi, 0, sizeof (svi) );
561   memset(&state->svi, 0, sizeof (state->svi) );
582562
583563   if ( ! strcmp( machine->gamedrv->name, "svi318" ) || ! strcmp( machine->gamedrv->name, "svi318n" ) )
584564   {
585      svi.svi318 = 1;
565      state->svi.svi318 = 1;
586566   }
587567
588568   cpu_set_input_line_vector(machine->device("maincpu"), 0, 0xff);
589569
590570   /* memory */
591   svi.empty_bank = auto_alloc_array(machine, UINT8, 0x8000);
592   memset (svi.empty_bank, 0xff, 0x8000);
571   state->svi.empty_bank = auto_alloc_array(machine, UINT8, 0x8000);
572   memset (state->svi.empty_bank, 0xff, 0x8000);
593573}
594574
595575static const TMS9928a_interface svi318_tms9928a_interface =
r9683r9684
622602
623603static void svi318_load_proc(device_image_interface &image)
624604{
605   svi318_state *state = image.device().machine->driver_data<svi318_state>();
625606   int size;
626607   int id = floppy_get_drive(&image.device());
627608
r9683r9684
629610   switch (size)
630611   {
631612   case 172032:   /* SVI-328 SSDD */
632      svi318_fdc.heads[id] = 1;
613      state->fdc.heads[id] = 1;
633614      break;
634615   case 346112:   /* SVI-328 DSDD */
635      svi318_fdc.heads[id] = 2;
616      state->fdc.heads[id] = 2;
636617      break;
637618   case 348160:   /* SVI-728 DSDD CP/M */
638      svi318_fdc.heads[id] = 2;
619      state->fdc.heads[id] = 2;
639620      break;
640621   }
641622}
642623
643624MACHINE_RESET( svi318 )
644625{
626   svi318_state *state = machine->driver_data<svi318_state>();
645627   int drive;
646628   /* video stuff */
647629   TMS9928A_reset();
648630
649   svi.bank_switch = 0xff;
631   state->svi.bank_switch = 0xff;
650632   svi318_set_banks(machine);
651633
652634   for(drive=0;drive<2;drive++)
r9683r9684
668650
669651WRITE8_HANDLER( svi318_writemem1 )
670652{
671   if ( svi.bankLow_read_only )
653   svi318_state *state = space->machine->driver_data<svi318_state>();
654   if ( state->svi.bankLow_read_only )
672655      return;
673656
674   svi.bankLow_ptr[offset] = data;
657   state->svi.bankLow_ptr[offset] = data;
675658}
676659
677660WRITE8_HANDLER( svi318_writemem2 )
678661{
679   if ( svi.bankHigh1_read_only)
662   svi318_state *state = space->machine->driver_data<svi318_state>();
663   if ( state->svi.bankHigh1_read_only)
680664      return;
681665
682   svi.bankHigh1_ptr[offset] = data;
666   state->svi.bankHigh1_ptr[offset] = data;
683667}
684668
685669WRITE8_HANDLER( svi318_writemem3 )
686670{
687   if ( svi.bankHigh2_read_only)
671   svi318_state *state = space->machine->driver_data<svi318_state>();
672   if ( state->svi.bankHigh2_read_only)
688673      return;
689674
690   svi.bankHigh2_ptr[offset] = data;
675   state->svi.bankHigh2_ptr[offset] = data;
691676}
692677
693678WRITE8_HANDLER( svi318_writemem4 )
694679{
695   if ( svi.svi806_ram_enabled )
680   svi318_state *state = space->machine->driver_data<svi318_state>();
681   if ( state->svi.svi806_ram_enabled )
696682   {
697683      if ( offset < 0x800 )
698684      {
699         svi.svi806_ram->u8(offset) = data;
685         state->svi.svi806_ram->u8(offset) = data;
700686      }
701687   }
702688   else
703689   {
704      if ( svi.bankHigh2_read_only )
690      if ( state->svi.bankHigh2_read_only )
705691         return;
706692
707      svi.bankHigh2_ptr[ 0x3000 + offset] = data;
693      state->svi.bankHigh2_ptr[ 0x3000 + offset] = data;
708694   }
709695}
710696
711697static void svi318_set_banks(running_machine *machine)
712698{
713   const UINT8 v = svi.bank_switch;
699   svi318_state *state = machine->driver_data<svi318_state>();
700   const UINT8 v = state->svi.bank_switch;
714701
715   svi.bankLow = ( v & 1 ) ? ( ( v & 2 ) ? ( ( v & 8 ) ? SVI_INTERNAL : SVI_EXPRAM3 ) : SVI_EXPRAM2 ) : SVI_CART;
716   svi.bankHigh1 = ( v & 4 ) ? ( ( v & 16 ) ? SVI_INTERNAL : SVI_EXPRAM3 ) : SVI_EXPRAM2;
702   state->svi.bankLow = ( v & 1 ) ? ( ( v & 2 ) ? ( ( v & 8 ) ? SVI_INTERNAL : SVI_EXPRAM3 ) : SVI_EXPRAM2 ) : SVI_CART;
703   state->svi.bankHigh1 = ( v & 4 ) ? ( ( v & 16 ) ? SVI_INTERNAL : SVI_EXPRAM3 ) : SVI_EXPRAM2;
717704
718   svi.bankLow_ptr = svi.empty_bank;
719   svi.bankLow_read_only = 1;
705   state->svi.bankLow_ptr = state->svi.empty_bank;
706   state->svi.bankLow_read_only = 1;
720707
721   switch( svi.bankLow )
708   switch( state->svi.bankLow )
722709   {
723710   case SVI_INTERNAL:
724      svi.bankLow_ptr = memory_region(machine, "maincpu");
711      state->svi.bankLow_ptr = memory_region(machine, "maincpu");
725712      break;
726713   case SVI_CART:
727      if ( pcart )
714      if ( state->pcart )
728715      {
729         svi.bankLow_ptr = pcart;
716         state->svi.bankLow_ptr = state->pcart;
730717      }
731718      break;
732719   case SVI_EXPRAM2:
733720      if ( messram_get_size(machine->device("messram")) >= 64 * 1024 )
734721      {
735         svi.bankLow_ptr = messram_get_ptr(machine->device("messram")) + messram_get_size(machine->device("messram")) - 64 * 1024;
736         svi.bankLow_read_only = 0;
722         state->svi.bankLow_ptr = messram_get_ptr(machine->device("messram")) + messram_get_size(machine->device("messram")) - 64 * 1024;
723         state->svi.bankLow_read_only = 0;
737724      }
738725      break;
739726   case SVI_EXPRAM3:
740727      if ( messram_get_size(machine->device("messram")) > 128 * 1024 )
741728      {
742         svi.bankLow_ptr = messram_get_ptr(machine->device("messram")) + messram_get_size(machine->device("messram")) - 128 * 1024;
743         svi.bankLow_read_only = 0;
729         state->svi.bankLow_ptr = messram_get_ptr(machine->device("messram")) + messram_get_size(machine->device("messram")) - 128 * 1024;
730         state->svi.bankLow_read_only = 0;
744731      }
745732      break;
746733   }
747734
748   svi.bankHigh1_ptr = svi.bankHigh2_ptr = svi.empty_bank;
749   svi.bankHigh1_read_only = svi.bankHigh2_read_only = 1;
735   state->svi.bankHigh1_ptr = state->svi.bankHigh2_ptr = state->svi.empty_bank;
736   state->svi.bankHigh1_read_only = state->svi.bankHigh2_read_only = 1;
750737
751   switch( svi.bankHigh1 )
738   switch( state->svi.bankHigh1 )
752739   {
753740   case SVI_INTERNAL:
754741      if ( messram_get_size(machine->device("messram")) == 16 * 1024 )
755742      {
756         svi.bankHigh2_ptr = messram_get_ptr(machine->device("messram"));
757         svi.bankHigh2_read_only = 0;
743         state->svi.bankHigh2_ptr = messram_get_ptr(machine->device("messram"));
744         state->svi.bankHigh2_read_only = 0;
758745      }
759746      else
760747      {
761         svi.bankHigh1_ptr = messram_get_ptr(machine->device("messram"));
762         svi.bankHigh1_read_only = 0;
763         svi.bankHigh2_ptr = messram_get_ptr(machine->device("messram")) + 0x4000;
764         svi.bankHigh2_read_only = 0;
748         state->svi.bankHigh1_ptr = messram_get_ptr(machine->device("messram"));
749         state->svi.bankHigh1_read_only = 0;
750         state->svi.bankHigh2_ptr = messram_get_ptr(machine->device("messram")) + 0x4000;
751         state->svi.bankHigh2_read_only = 0;
765752      }
766753      break;
767754   case SVI_EXPRAM2:
768755      if ( messram_get_size(machine->device("messram")) > 64 * 1024 )
769756      {
770         svi.bankHigh1_ptr = messram_get_ptr(machine->device("messram")) + messram_get_size(machine->device("messram")) - 64 * 1024 + 32 * 1024;
771         svi.bankHigh1_read_only = 0;
772         svi.bankHigh2_ptr = messram_get_ptr(machine->device("messram")) + messram_get_size(machine->device("messram")) - 64 * 1024 + 48 * 1024;
773         svi.bankHigh2_read_only = 0;
757         state->svi.bankHigh1_ptr = messram_get_ptr(machine->device("messram")) + messram_get_size(machine->device("messram")) - 64 * 1024 + 32 * 1024;
758         state->svi.bankHigh1_read_only = 0;
759         state->svi.bankHigh2_ptr = messram_get_ptr(machine->device("messram")) + messram_get_size(machine->device("messram")) - 64 * 1024 + 48 * 1024;
760         state->svi.bankHigh2_read_only = 0;
774761      }
775762      break;
776763   case SVI_EXPRAM3:
777764      if ( messram_get_size(machine->device("messram")) > 128 * 1024 )
778765      {
779         svi.bankHigh1_ptr = messram_get_ptr(machine->device("messram")) + messram_get_size(machine->device("messram")) - 128 * 1024 + 32 * 1024;
780         svi.bankHigh1_read_only = 0;
781         svi.bankHigh2_ptr = messram_get_ptr(machine->device("messram")) + messram_get_size(machine->device("messram")) - 128 * 1024 + 48 * 1024;
782         svi.bankHigh2_read_only = 0;
766         state->svi.bankHigh1_ptr = messram_get_ptr(machine->device("messram")) + messram_get_size(machine->device("messram")) - 128 * 1024 + 32 * 1024;
767         state->svi.bankHigh1_read_only = 0;
768         state->svi.bankHigh2_ptr = messram_get_ptr(machine->device("messram")) + messram_get_size(machine->device("messram")) - 128 * 1024 + 48 * 1024;
769         state->svi.bankHigh2_read_only = 0;
783770      }
784771      break;
785772   }
786773
787774   /* Check for special CART based banking */
788   if ( svi.bankLow == SVI_CART && ( v & 0xc0 ) != 0xc0 )
775   if ( state->svi.bankLow == SVI_CART && ( v & 0xc0 ) != 0xc0 )
789776   {
790      svi.bankHigh1_ptr = svi.empty_bank;
791      svi.bankHigh1_read_only = 1;
792      svi.bankHigh2_ptr = svi.empty_bank;
793      svi.bankHigh2_read_only = 1;
794      if ( pcart && ! ( v & 0x80 ) )
777      state->svi.bankHigh1_ptr = state->svi.empty_bank;
778      state->svi.bankHigh1_read_only = 1;
779      state->svi.bankHigh2_ptr = state->svi.empty_bank;
780      state->svi.bankHigh2_read_only = 1;
781      if ( state->pcart && ! ( v & 0x80 ) )
795782      {
796         svi.bankHigh2_ptr = pcart + 0x4000;
783         state->svi.bankHigh2_ptr = state->pcart + 0x4000;
797784      }
798      if ( pcart && ! ( v & 0x40 ) )
785      if ( state->pcart && ! ( v & 0x40 ) )
799786      {
800         svi.bankHigh1_ptr = pcart;
787         state->svi.bankHigh1_ptr = state->pcart;
801788      }
802789   }
803790
804   memory_set_bankptr(machine, "bank1", svi.bankLow_ptr );
805   memory_set_bankptr(machine, "bank2", svi.bankHigh1_ptr );
806   memory_set_bankptr(machine, "bank3", svi.bankHigh2_ptr );
791   memory_set_bankptr(machine, "bank1", state->svi.bankLow_ptr );
792   memory_set_bankptr(machine, "bank2", state->svi.bankHigh1_ptr );
793   memory_set_bankptr(machine, "bank3", state->svi.bankHigh2_ptr );
807794
808795   /* SVI-806 80 column card specific banking */
809   if ( svi.svi806_present )
796   if ( state->svi.svi806_present )
810797   {
811      if ( svi.svi806_ram_enabled )
798      if ( state->svi.svi806_ram_enabled )
812799      {
813         memory_set_bankptr(machine, "bank4", svi.svi806_ram );
800         memory_set_bankptr(machine, "bank4", state->svi.svi806_ram );
814801      }
815802      else
816803      {
817         memory_set_bankptr(machine, "bank4", svi.bankHigh2_ptr + 0x3000 );
804         memory_set_bankptr(machine, "bank4", state->svi.bankHigh2_ptr + 0x3000 );
818805      }
819806   }
820807}
r9683r9684
834821
835822READ8_HANDLER( svi318_io_ext_r )
836823{
824   svi318_state *state = space->machine->driver_data<svi318_state>();
837825   UINT8 data = 0xff;
838826   running_device *device;
839827
840   if (svi.bankLow == SVI_CART)
828   if (state->svi.bankLow == SVI_CART)
841829   {
842830      return 0xff;
843831   }
r9683r9684
903891
904892WRITE8_HANDLER( svi318_io_ext_w )
905893{
894   svi318_state *state = space->machine->driver_data<svi318_state>();
906895   running_device *device;
907896
908   if (svi.bankLow == SVI_CART)
897   if (state->svi.bankLow == SVI_CART)
909898   {
910899      return;
911900   }
src/mess/machine/mz700.c
r9683r9684
423423/************************ PIT ************************************************/
424424
425425/* Timer 0 is the clock for the speaker output */
426static UINT8 speaker_level = 0;
427static UINT8 prev_state = 0;
428426
429427static WRITE_LINE_DEVICE_HANDLER( pit_out0_changed )
430428{
429   mz_state *drvstate = device->machine->driver_data<mz_state>();
431430   running_device *speaker = device->machine->device("speaker");
432   if((prev_state==0) && (state==1)) {
433      speaker_level ^= 1;
431   if((drvstate->prev_state==0) && (state==1)) {
432      drvstate->speaker_level ^= 1;
434433   }
435   prev_state = state;
436   speaker_level_w( speaker, speaker_level);
434   drvstate->prev_state = state;
435   speaker_level_w( speaker, drvstate->speaker_level);
437436}
438437
439438/* timer 2 is the AM/PM (12 hour) interrupt */
r9683r9684
554553 *
555554 ******************************************************************************/
556555
557static UINT16 mz800_ramaddr = 0;
558556//static UINT8 mz800_display_mode = 0;
559557//static UINT8 mz800_port_e8 = 0;
560static UINT8 mz800_palette[4];
561static UINT8 mz800_palette_bank;
562558
563559
564560/***************************************************************************
r9683r9684
622618/* port EA */
623619 READ8_HANDLER( mz800_ramdisk_r )
624620{
621   mz_state *state = space->machine->driver_data<mz_state>();
625622   UINT8 *mem = memory_region(space->machine, "user1");
626   UINT8 data = mem[mz800_ramaddr];
627   LOG(2,"mz800_ramdisk_r",("[%04X] -> %02X\n", mz800_ramaddr, data),space->machine);
628   if (mz800_ramaddr++ == 0)
623   UINT8 data = mem[state->mz800_ramaddr];
624   LOG(2,"mz800_ramdisk_r",("[%04X] -> %02X\n", state->mz800_ramaddr, data),space->machine);
625   if (state->mz800_ramaddr++ == 0)
629626      LOG(1,"mz800_ramdisk_r",("address wrap 0000\n"),space->machine);
630627    return data;
631628}
r9683r9684
674671/* port EA */
675672WRITE8_HANDLER( mz800_ramdisk_w )
676673{
674   mz_state *state = space->machine->driver_data<mz_state>();
677675   UINT8 *mem = memory_region(space->machine, "user1");
678   LOG(2,"mz800_ramdisk_w",("[%04X] <- %02X\n", mz800_ramaddr, data),space->machine);
679   mem[mz800_ramaddr] = data;
680   if (mz800_ramaddr++ == 0)
676   LOG(2,"mz800_ramdisk_w",("[%04X] <- %02X\n", state->mz800_ramaddr, data),space->machine);
677   mem[state->mz800_ramaddr] = data;
678   if (state->mz800_ramaddr++ == 0)
681679      LOG(1,"mz800_ramdisk_w",("address wrap 0000\n"),space->machine);
682680}
683681
684682/* port EB */
685683WRITE8_HANDLER( mz800_ramaddr_w )
686684{
687   mz800_ramaddr = (cpu_get_reg(space->machine->device("maincpu"), Z80_BC) & 0xff00) | (data & 0xff);
688   LOG(1,"mz800_ramaddr_w",("%04X\n", mz800_ramaddr),space->machine);
685   mz_state *state = space->machine->driver_data<mz_state>();
686   state->mz800_ramaddr = (cpu_get_reg(space->machine->device("maincpu"), Z80_BC) & 0xff00) | (data & 0xff);
687   LOG(1,"mz800_ramaddr_w",("%04X\n", state->mz800_ramaddr),space->machine);
689688}
690689
691690/* port F0 */
692691WRITE8_HANDLER( mz800_palette_w )
693692{
693   mz_state *state = space->machine->driver_data<mz_state>();
694694   if (data & 0x40)
695695   {
696        mz800_palette_bank = data & 3;
697      LOG(1,"mz800_palette_w",("bank: %d\n", mz800_palette_bank),space->machine);
696        state->mz800_palette_bank = data & 3;
697      LOG(1,"mz800_palette_w",("bank: %d\n", state->mz800_palette_bank),space->machine);
698698    }
699699   else
700700   {
701701      int idx = (data >> 4) & 3;
702702      int val = data & 15;
703703      LOG(1,"mz800_palette_w",("palette[%d] <- %d\n", idx, val),space->machine);
704      mz800_palette[idx] = val;
704      state->mz800_palette[idx] = val;
705705   }
706706}
src/mess/machine/sym1.c
r9683r9684
2323#define LED_REFRESH_DELAY  ATTOTIME_IN_USEC(70)
2424
2525
26static UINT8 riot_port_a, riot_port_b;
27static emu_timer *led_update;
2826
2927
3028
r9683r9684
3533
3634static WRITE_LINE_DEVICE_HANDLER( sym1_74145_output_0_w )
3735{
38   if (state) timer_adjust_oneshot(led_update, LED_REFRESH_DELAY, 0);
36   sym1_state *drvstate = device->machine->driver_data<sym1_state>();
37   if (state) timer_adjust_oneshot(drvstate->led_update, LED_REFRESH_DELAY, 0);
3938}
4039
4140
4241static WRITE_LINE_DEVICE_HANDLER( sym1_74145_output_1_w )
4342{
44   if (state) timer_adjust_oneshot(led_update, LED_REFRESH_DELAY, 1);
43   sym1_state *drvstate = device->machine->driver_data<sym1_state>();
44   if (state) timer_adjust_oneshot(drvstate->led_update, LED_REFRESH_DELAY, 1);
4545}
4646
4747
4848static WRITE_LINE_DEVICE_HANDLER( sym1_74145_output_2_w )
4949{
50   if (state) timer_adjust_oneshot(led_update, LED_REFRESH_DELAY, 2);
50   sym1_state *drvstate = device->machine->driver_data<sym1_state>();
51   if (state) timer_adjust_oneshot(drvstate->led_update, LED_REFRESH_DELAY, 2);
5152}
5253
5354
5455static WRITE_LINE_DEVICE_HANDLER( sym1_74145_output_3_w )
5556{
56   if (state) timer_adjust_oneshot(led_update, LED_REFRESH_DELAY, 3);
57   sym1_state *drvstate = device->machine->driver_data<sym1_state>();
58   if (state) timer_adjust_oneshot(drvstate->led_update, LED_REFRESH_DELAY, 3);
5759}
5860
5961
6062static WRITE_LINE_DEVICE_HANDLER( sym1_74145_output_4_w )
6163{
62   if (state) timer_adjust_oneshot(led_update, LED_REFRESH_DELAY, 4);
64   sym1_state *drvstate = device->machine->driver_data<sym1_state>();
65   if (state) timer_adjust_oneshot(drvstate->led_update, LED_REFRESH_DELAY, 4);
6366}
6467
6568
6669static WRITE_LINE_DEVICE_HANDLER( sym1_74145_output_5_w )
6770{
68   if (state) timer_adjust_oneshot(led_update, LED_REFRESH_DELAY, 5);
71   sym1_state *drvstate = device->machine->driver_data<sym1_state>();
72   if (state) timer_adjust_oneshot(drvstate->led_update, LED_REFRESH_DELAY, 5);
6973}
7074
7175
7276static TIMER_CALLBACK( led_refresh )
7377{
74   output_set_digit_value(param, riot_port_a);
78   sym1_state *state = machine->driver_data<sym1_state>();
79   output_set_digit_value(param, state->riot_port_a);
7580}
7681
7782
7883static READ8_DEVICE_HANDLER(sym1_riot_a_r)
7984{
85   sym1_state *state = device->machine->driver_data<sym1_state>();
8086   int data = 0x7f;
8187
8288   /* scan keypad rows */
83   if (!(riot_port_a & 0x80)) data &= input_port_read(device->machine, "ROW-0");
84   if (!(riot_port_b & 0x01)) data &= input_port_read(device->machine, "ROW-1");
85   if (!(riot_port_b & 0x02)) data &= input_port_read(device->machine, "ROW-2");
86   if (!(riot_port_b & 0x04)) data &= input_port_read(device->machine, "ROW-3");
89   if (!(state->riot_port_a & 0x80)) data &= input_port_read(device->machine, "ROW-0");
90   if (!(state->riot_port_b & 0x01)) data &= input_port_read(device->machine, "ROW-1");
91   if (!(state->riot_port_b & 0x02)) data &= input_port_read(device->machine, "ROW-2");
92   if (!(state->riot_port_b & 0x04)) data &= input_port_read(device->machine, "ROW-3");
8793
8894   /* determine column */
89   if ( ((riot_port_a ^ 0xff) & (input_port_read(device->machine, "ROW-0") ^ 0xff)) & 0x7f )
95   if ( ((state->riot_port_a ^ 0xff) & (input_port_read(device->machine, "ROW-0") ^ 0xff)) & 0x7f )
9096      data &= ~0x80;
9197
9298   return data;
r9683r9684
95101
96102static READ8_DEVICE_HANDLER(sym1_riot_b_r)
97103{
104   sym1_state *state = device->machine->driver_data<sym1_state>();
98105   int data = 0xff;
99106
100107   /* determine column */
101   if ( ((riot_port_a ^ 0xff) & (input_port_read(device->machine, "ROW-1") ^ 0xff)) & 0x7f )
108   if ( ((state->riot_port_a ^ 0xff) & (input_port_read(device->machine, "ROW-1") ^ 0xff)) & 0x7f )
102109      data &= ~0x01;
103110
104   if ( ((riot_port_a ^ 0xff) & (input_port_read(device->machine, "ROW-2") ^ 0xff)) & 0x3f )
111   if ( ((state->riot_port_a ^ 0xff) & (input_port_read(device->machine, "ROW-2") ^ 0xff)) & 0x3f )
105112      data &= ~0x02;
106113
107   if ( ((riot_port_a ^ 0xff) & (input_port_read(device->machine, "ROW-3") ^ 0xff)) & 0x1f )
114   if ( ((state->riot_port_a ^ 0xff) & (input_port_read(device->machine, "ROW-3") ^ 0xff)) & 0x1f )
108115      data &= ~0x04;
109116
110117   data &= ~0x80; // else hangs 8b02
r9683r9684
115122
116123static WRITE8_DEVICE_HANDLER(sym1_riot_a_w)
117124{
125   sym1_state *state = device->machine->driver_data<sym1_state>();
118126   logerror("%x: riot_a_w 0x%02x\n", cpu_get_pc( device->machine->device("maincpu") ), data);
119127
120128   /* save for later use */
121   riot_port_a = data;
129   state->riot_port_a = data;
122130}
123131
124132
125133static WRITE8_DEVICE_HANDLER(sym1_riot_b_w)
126134{
135   sym1_state *state = device->machine->driver_data<sym1_state>();
127136   logerror("%x: riot_b_w 0x%02x\n", cpu_get_pc( device->machine->device("maincpu") ), data);
128137
129138   /* save for later use */
130   riot_port_b = data;
139   state->riot_port_b = data;
131140
132141   /* first 4 pins are connected to the 74145 */
133142   ttl74145_w(device->machine->device("ttl74145"), 0, data & 0x0f);
r9683r9684
277286
278287DRIVER_INIT( sym1 )
279288{
289   sym1_state *state = machine->driver_data<sym1_state>();
280290   /* wipe expansion memory banks that are not installed */
281291   if (messram_get_size(machine->device("messram")) < 4*1024)
282292   {
r9683r9684
285295   }
286296
287297   /* allocate a timer to refresh the led display */
288   led_update = timer_alloc(machine, led_refresh, NULL);
298   state->led_update = timer_alloc(machine, led_refresh, NULL);
289299}
290300
291301
292302MACHINE_RESET( sym1 )
293303{
304   sym1_state *state = machine->driver_data<sym1_state>();
294305   /* make 0xf800 to 0xffff point to the last half of the monitor ROM
295306       so that the CPU can find its reset vectors */
296307   memory_install_read_bank(cputag_get_address_space( machine, "maincpu", ADDRESS_SPACE_PROGRAM ),0xf800, 0xffff, 0, 0, "bank1");
297308   memory_nop_write(cputag_get_address_space( machine, "maincpu", ADDRESS_SPACE_PROGRAM ),0xf800, 0xffff, 0, 0);
298   memory_set_bankptr(machine, "bank1", sym1_monitor + 0x800);
309   memory_set_bankptr(machine, "bank1", state->monitor + 0x800);
299310   machine->device("maincpu")->reset();
300311}
src/mess/machine/pc8801.c
r9683r9684
2323#include "machine/upd765.h"
2424#include "sound/beep.h"
2525
26static int ROMmode,RAMmode,maptvram;
27static int no4throm,no4throm2,port71_save;
28static unsigned char *mainROM;
29unsigned char *pc8801_mainRAM=NULL;
30static int is_V2mode,is_Nbasic,is_8MHz;
31int pc88sr_is_highspeed;
32static int port32_save;
33static int text_window;
34static int extmem_mode;
35static UINT8 *extRAM;
36static int extRAM_size;
37static void *ext_bank_80[4],*ext_bank_88[256];
38static UINT8 extmem_ctrl[2];
3926
40static int use_5FD;
4127static void pc8801_init_5fd(running_machine *machine);
4228
43static void pc88sr_init_fmsound(void);
44static int enable_FM_IRQ;
45static int FM_IRQ_save;
29static void pc88sr_init_fmsound(running_machine *machine);
4630#define FM_IRQ_LEVEL 4
4731
4832WRITE8_HANDLER( pc88_rtc_w )
r9683r9684
6347
6448/* interrupt staff */
6549
66static int interrupt_level_reg;
67static int interrupt_mask_reg;
68static int interrupt_trig_reg;
6950
7051static void pc8801_update_interrupt(running_machine *machine)
7152{
53   pc88_state *state = machine->driver_data<pc88_state>();
7254   int level, i;
7355
7456   level = -1;
7557   for (i = 0; i < 8; i++)
7658   {
77      if ((interrupt_trig_reg & (1<<i)) != 0)
59      if ((state->interrupt_trig_reg & (1<<i)) != 0)
7860         level = i;
7961   }
80   if (level >= 0 && level<interrupt_level_reg)
62   if (level >= 0 && level<state->interrupt_level_reg)
8163   {
8264      cputag_set_input_line(machine, "maincpu", 0, HOLD_LINE);
8365   }
r9683r9684
8567
8668static IRQ_CALLBACK( pc8801_interrupt_callback )
8769{
70   pc88_state *state = device->machine->driver_data<pc88_state>();
8871   int level, i;
8972
9073   level = 0;
9174   for (i = 0; i < 8; i++)
9275   {
93      if ((interrupt_trig_reg & (1<<i))!=0)
76      if ((state->interrupt_trig_reg & (1<<i))!=0)
9477         level = i;
9578   }
96   interrupt_trig_reg &= ~(1<<level);
79   state->interrupt_trig_reg &= ~(1<<level);
9780   return level*2;
9881}
9982
10083WRITE8_HANDLER( pc8801_write_interrupt_level )
10184{
102   interrupt_level_reg = data&0x0f;
85   pc88_state *state = space->machine->driver_data<pc88_state>();
86   state->interrupt_level_reg = data&0x0f;
10387   pc8801_update_interrupt(space->machine);
10488}
10589
10690WRITE8_HANDLER( pc8801_write_interrupt_mask )
10791{
108   interrupt_mask_reg = ((data&0x01)<<2) | (data&0x02)
92   pc88_state *state = space->machine->driver_data<pc88_state>();
93   state->interrupt_mask_reg = ((data&0x01)<<2) | (data&0x02)
10994      | ((data&0x04)>>2) | 0xf8;
11095}
11196
11297static void pc8801_raise_interrupt(running_machine *machine, int level)
11398{
114  interrupt_trig_reg |= interrupt_mask_reg & (1<<level);
99   pc88_state *state = machine->driver_data<pc88_state>();
100  state->interrupt_trig_reg |= state->interrupt_mask_reg & (1<<level);
115101  pc8801_update_interrupt(machine);
116102}
117103
r9683r9684
127113
128114static void pc8801_init_interrupt(running_machine *machine)
129115{
130   interrupt_level_reg = 0;
131   interrupt_mask_reg = 0xf8;
132   interrupt_trig_reg = 0x0;
116   pc88_state *state = machine->driver_data<pc88_state>();
117   state->interrupt_level_reg = 0;
118   state->interrupt_mask_reg = 0xf8;
119   state->interrupt_trig_reg = 0x0;
133120   cpu_set_irq_callback(machine->device("maincpu"), pc8801_interrupt_callback);
134121}
135122
r9683r9684
179166   UINT8 r;
180167
181168   r = centronics_busy_r(state->centronics);
182   r |= pc8801_is_24KHz ? 0x00 : 0x02;
183   r |= use_5FD ? 0x00 : 0x08;
169   r |= state->is_24KHz ? 0x00 : 0x02;
170   r |= state->use_5FD ? 0x00 : 0x08;
184171   r |= upd1990a_data_out_r(state->upd1990a) ? 0x10 : 0x00;
185172   if(space->machine->primary_screen->vblank()) r|=0x20;
186173
r9683r9684
199186    bit 7: N88-BASIC version (0 = V2.x, 1 = V1.x)
200187      */
201188{
189   pc88_state *state = space->machine->driver_data<pc88_state>();
202190  int r;
203191
204192  /* read DIP-SW */
205193  r=input_port_read(space->machine, "DSW2")<<1;
206194  /* change bit 6 according speed switch */
207  if(pc88sr_is_highspeed) {
195  if(state->pc88sr_is_highspeed) {
208196    r|=0x40;
209197  } else {
210198    r&=0xbf;
211199  }
212200  /* change bit 7 according BASIC mode */
213  if(is_V2mode) {
201  if(state->is_V2mode) {
214202    r&=0x7f;
215203  } else {
216204    r|=0x80;
r9683r9684
220208
221209static WRITE8_HANDLER( pc8801_writemem1 )
222210{
223  pc8801_mainRAM[offset]=data;
211   pc88_state *state = space->machine->driver_data<pc88_state>();
212  state->mainRAM[offset]=data;
224213}
225214
226215static WRITE8_HANDLER( pc8801_writemem2 )
227216{
228  pc8801_mainRAM[offset+0x6000]=data;
217   pc88_state *state = space->machine->driver_data<pc88_state>();
218  state->mainRAM[offset+0x6000]=data;
229219}
230220
231221static READ8_HANDLER( pc8801_read_textwindow )
232222{
233  return pc8801_mainRAM[(offset+text_window*0x100)&0xffff];
223   pc88_state *state = space->machine->driver_data<pc88_state>();
224  return state->mainRAM[(offset+state->text_window*0x100)&0xffff];
234225}
235226
236227static WRITE8_HANDLER( pc8801_write_textwindow )
237228{
238  pc8801_mainRAM[(offset+text_window*0x100)&0xffff]=data;
229   pc88_state *state = space->machine->driver_data<pc88_state>();
230  state->mainRAM[(offset+state->text_window*0x100)&0xffff]=data;
239231}
240232
241static void select_extmem(char **r,char **w,UINT8 *ret_ctrl)
233static void select_extmem(pc88_state *state, char **r,char **w,UINT8 *ret_ctrl)
242234{
243235  int i;
244236
r9683r9684
281273    } \
282274  } while(0);
283275
284  if(ext_bank_88[extmem_ctrl[1]]!=NULL) {
285    if(extmem_ctrl[0]&0x01) SET_RADDR(ext_bank_88[extmem_ctrl[1]]);
286    if(extmem_ctrl[0]&0x10) SET_WADDR(ext_bank_88[extmem_ctrl[1]]);
287    SET_RET(0,(~extmem_ctrl[0])&0x11)
288    if(ext_bank_88[extmem_ctrl[1]]==ext_bank_88[extmem_ctrl[1]&0x0f]) {
276  if(state->ext_bank_88[state->extmem_ctrl[1]]!=NULL) {
277    if(state->extmem_ctrl[0]&0x01) SET_RADDR(state->ext_bank_88[state->extmem_ctrl[1]]);
278    if(state->extmem_ctrl[0]&0x10) SET_WADDR(state->ext_bank_88[state->extmem_ctrl[1]]);
279    SET_RET(0,(~state->extmem_ctrl[0])&0x11)
280    if(state->ext_bank_88[state->extmem_ctrl[1]]==state->ext_bank_88[state->extmem_ctrl[1]&0x0f]) {
289281      /* PC-8801-N02 */
290      SET_RET(1,extmem_ctrl[1]&0x0f);
282      SET_RET(1,state->extmem_ctrl[1]&0x0f);
291283    } else {
292284      /* PIO-8234H */
293      SET_RET(1,extmem_ctrl[1]);
285      SET_RET(1,state->extmem_ctrl[1]);
294286    }
295287  }
296288
297289  for(i=0;i<4;i++) {
298    if(ext_bank_80[i]!=NULL) {
299      if(extmem_ctrl[0]&(0x01<<i)) {
300   SET_RADDR(ext_bank_80[i]);
290    if(state->ext_bank_80[i]!=NULL) {
291      if(state->extmem_ctrl[0]&(0x01<<i)) {
292   SET_RADDR(state->ext_bank_80[i]);
301293   SET_RET(0,(0x01<<i)|0xf0);
302294      }
303      if(extmem_ctrl[0]&(0x10<<i)) SET_WADDR(ext_bank_80[i]);
295      if(state->extmem_ctrl[0]&(0x10<<i)) SET_WADDR(state->ext_bank_80[i]);
304296    }
305297  }
306298
r9683r9684
311303
312304void pc8801_update_bank(running_machine *machine)
313305{
306   pc88_state *state = machine->driver_data<pc88_state>();
314307   address_space *program = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
315308   char *ext_r,*ext_w;
316309
317   select_extmem(&ext_r,&ext_w,NULL);
310   select_extmem(state, &ext_r,&ext_w,NULL);
318311   if (ext_r!=NULL || ext_w!=NULL)
319312   {
320313      if (ext_r==NULL)
r9683r9684
343336   else
344337   {
345338      /* 0x0000 to 0x7fff */
346      if(RAMmode)
339      if(state->RAMmode)
347340      {
348341         /* RAM */
349342         memory_install_write_bank(program, 0x0000, 0x5fff, 0, 0, "bank1");
350343         memory_install_write_bank(program, 0x6000, 0x7fff, 0, 0, "bank2");
351         memory_set_bankptr(machine, "bank1", pc8801_mainRAM + 0x0000);
352         memory_set_bankptr(machine, "bank2", pc8801_mainRAM + 0x6000);
344         memory_set_bankptr(machine, "bank1", state->mainRAM + 0x0000);
345         memory_set_bankptr(machine, "bank2", state->mainRAM + 0x6000);
353346      }
354347      else
355348      {
r9683r9684
357350         /* write through to main RAM */
358351         memory_install_write8_handler(program, 0x0000, 0x5fff, 0, 0, pc8801_writemem1);
359352         memory_install_write8_handler(program, 0x6000, 0x7fff, 0, 0, pc8801_writemem2);
360         if(ROMmode)
353         if(state->ROMmode)
361354         {
362355            /* N-BASIC */
363            memory_set_bankptr(machine, "bank1", mainROM + 0x0000);
364            memory_set_bankptr(machine, "bank2", mainROM + 0x6000);
356            memory_set_bankptr(machine, "bank1", state->mainROM + 0x0000);
357            memory_set_bankptr(machine, "bank2", state->mainROM + 0x6000);
365358         }
366359         else
367360         {
368361            /* N88-BASIC */
369            memory_set_bankptr(machine, "bank1", mainROM + 0x8000);
370            if(no4throm==1) {
362            memory_set_bankptr(machine, "bank1", state->mainROM + 0x8000);
363            if(state->no4throm==1) {
371364               /* 4th ROM 1 */
372               memory_set_bankptr(machine, "bank2", mainROM + 0x10000 + 0x2000 * no4throm2);
365               memory_set_bankptr(machine, "bank2", state->mainROM + 0x10000 + 0x2000 * state->no4throm2);
373366            } else {
374               memory_set_bankptr(machine, "bank2", mainROM + 0xe000);
367               memory_set_bankptr(machine, "bank2", state->mainROM + 0xe000);
375368            }
376369         }
377370      }
378371   }
379372
380373   /* 0x8000 to 0xffff */
381   if (RAMmode || ROMmode)  {
374   if (state->RAMmode || state->ROMmode)  {
382375      memory_install_readwrite_bank(program, 0x8000, 0x83ff, 0, 0, "bank3");
383376   } else {
384377      memory_install_readwrite8_handler(program, 0x8000, 0x83ff, 0, 0, pc8801_read_textwindow, pc8801_write_textwindow);
385378   }
386379
387   memory_set_bankptr(machine, "bank4", pc8801_mainRAM + 0x8400);
380   memory_set_bankptr(machine, "bank4", state->mainRAM + 0x8400);
388381
389382   if (pc8801_is_vram_select(machine))
390383   {
r9683r9684
396389      memory_install_readwrite_bank(program, 0xc000, 0xefff, 0, 0, "bank5");
397390      memory_install_readwrite_bank(program, 0xf000, 0xffff, 0, 0, "bank6");
398391
399      memory_set_bankptr(machine, "bank5", pc8801_mainRAM + 0xc000);
400      if(maptvram)
401         memory_set_bankptr(machine, "bank6", pc88sr_textRAM);
392      memory_set_bankptr(machine, "bank5", state->mainRAM + 0xc000);
393      if(state->maptvram)
394         memory_set_bankptr(machine, "bank6", state->pc88sr_textRAM);
402395      else
403         memory_set_bankptr(machine, "bank6", pc8801_mainRAM + 0xf000);
396         memory_set_bankptr(machine, "bank6", state->mainRAM + 0xf000);
404397   }
405398}
406399
407400READ8_HANDLER( pc88_extmem_r )
408401{
402   pc88_state *state = space->machine->driver_data<pc88_state>();
409403   UINT8 ret[2];
410   select_extmem(NULL,NULL,ret);
404   select_extmem(state,NULL,NULL,ret);
411405   return ret[offset];
412406}
413407
414408WRITE8_HANDLER( pc88_extmem_w )
415409{
416  extmem_ctrl[offset]=data;
410   pc88_state *state = space->machine->driver_data<pc88_state>();
411  state->extmem_ctrl[offset]=data;
417412  pc8801_update_bank(space->machine);
418413}
419414
420415WRITE8_HANDLER( pc88sr_outport_31 )
421416{
417   pc88_state *state = space->machine->driver_data<pc88_state>();
422418  /* bit 5 not implemented */
423  RAMmode=((data&0x02)!=0);
424  ROMmode=((data&0x04)!=0);
419  state->RAMmode=((data&0x02)!=0);
420  state->ROMmode=((data&0x04)!=0);
425421  pc8801_update_bank(space->machine);
426422  pc88sr_disp_31(space, offset,data);
427423}
428424
429425READ8_HANDLER( pc88sr_inport_32 )
430426{
431  return(port32_save);
427   pc88_state *state = space->machine->driver_data<pc88_state>();
428  return(state->port32_save);
432429}
433430
434431WRITE8_HANDLER( pc88sr_outport_32 )
435432{
433   pc88_state *state = space->machine->driver_data<pc88_state>();
436434  /* bit 2, 3 not implemented */
437  port32_save=data;
438  maptvram=((data&0x10)==0);
439  no4throm2=(data&3);
440  enable_FM_IRQ=((data & 0x80) == 0x00);
441  if(FM_IRQ_save && enable_FM_IRQ) pc8801_raise_interrupt(space->machine, FM_IRQ_LEVEL);
435  state->port32_save=data;
436  state->maptvram=((data&0x10)==0);
437  state->no4throm2=(data&3);
438  state->enable_FM_IRQ=((data & 0x80) == 0x00);
439  if(state->FM_IRQ_save && state->enable_FM_IRQ) pc8801_raise_interrupt(space->machine, FM_IRQ_LEVEL);
442440  pc88sr_disp_32(space, offset,data);
443441  pc8801_update_bank(space->machine);
444442}
445443
446444READ8_HANDLER( pc8801_inport_70 )
447445{
448  return text_window;
446   pc88_state *state = space->machine->driver_data<pc88_state>();
447  return state->text_window;
449448}
450449
451450WRITE8_HANDLER( pc8801_outport_70 )
452451{
453  text_window=data;
452   pc88_state *state = space->machine->driver_data<pc88_state>();
453  state->text_window=data;
454454  pc8801_update_bank(space->machine);
455455}
456456
457457WRITE8_HANDLER( pc8801_outport_78 )
458458{
459  text_window=((text_window+1)&0xff);
459   pc88_state *state = space->machine->driver_data<pc88_state>();
460  state->text_window=((state->text_window+1)&0xff);
460461  pc8801_update_bank(space->machine);
461462}
462463
463464READ8_HANDLER( pc88sr_inport_71 )
464465{
465  return(port71_save);
466   pc88_state *state = space->machine->driver_data<pc88_state>();
467  return(state->port71_save);
466468}
467469
468470WRITE8_HANDLER( pc88sr_outport_71 )
469471/* bit 1-7 not implemented (no ROMs) */
470472{
471  port71_save=data;
473   pc88_state *state = space->machine->driver_data<pc88_state>();
474  state->port71_save=data;
472475  switch(data) {
473  case 0xff: no4throm=0; break;
474  case 0xfe: no4throm=1; break;
475  case 0xfd: no4throm=2; break;
476  case 0xfb: no4throm=3; break;
477  case 0xf7: no4throm=4; break;
478  case 0xef: no4throm=5; break;
479  case 0xdf: no4throm=6; break;
480  case 0xbf: no4throm=7; break;
481  case 0x7f: no4throm=8; break;
476  case 0xff: state->no4throm=0; break;
477  case 0xfe: state->no4throm=1; break;
478  case 0xfd: state->no4throm=2; break;
479  case 0xfb: state->no4throm=3; break;
480  case 0xf7: state->no4throm=4; break;
481  case 0xef: state->no4throm=5; break;
482  case 0xdf: state->no4throm=6; break;
483  case 0xbf: state->no4throm=7; break;
484  case 0x7f: state->no4throm=8; break;
482485  default:
483486    logerror ("pc8801 : write illegal data 0x%.2x to port 0x71, select main rom.\n",data);
484    no4throm=0;
487    state->no4throm=0;
485488    break;
486489  }
487490  pc8801_update_bank(space->machine);
r9683r9684
490493// FIXME: shouldn't we use ram device in place of the below code?
491494static void pc8801_init_bank(running_machine *machine, int hireso)
492495{
496   pc88_state *state = machine->driver_data<pc88_state>();
493497   int i,j;
494498   int num80,num88,numIO;
495499   unsigned char *e;
496500
497   RAMmode=0;
498   ROMmode=0;
499   maptvram=0;
500   no4throm=0;
501   no4throm2=0;
502   port71_save=0xff;
503   port32_save=0x80;
504   mainROM = memory_region(machine, "maincpu");
505   pc8801_mainRAM = auto_alloc_array_clear(machine, UINT8, 0x10000);
501   state->RAMmode=0;
502   state->ROMmode=0;
503   state->maptvram=0;
504   state->no4throm=0;
505   state->no4throm2=0;
506   state->port71_save=0xff;
507   state->port32_save=0x80;
508   state->mainROM = memory_region(machine, "maincpu");
509   state->mainRAM = auto_alloc_array_clear(machine, UINT8, 0x10000);
506510
507   extmem_ctrl[0]=extmem_ctrl[1]=0;
511   state->extmem_ctrl[0]=state->extmem_ctrl[1]=0;
508512   pc8801_update_bank(machine);
509513   pc8801_video_init(machine, hireso);
510514
511   if (extmem_mode != input_port_read(machine, "MEM"))
515   if (state->extmem_mode != input_port_read(machine, "MEM"))
512516   {
513      extmem_mode = input_port_read(machine, "MEM");
517      state->extmem_mode = input_port_read(machine, "MEM");
514518
515519      // reset all the bank-related quantities
516      memset(extRAM, 0, extRAM_size);
520      memset(state->extRAM, 0, state->extRAM_size);
517521
518522      for (i = 0; i < 4; i++)
519         ext_bank_80[i] = NULL;
523         state->ext_bank_80[i] = NULL;
520524
521525      for (i = 0; i < 256; i++)
522         ext_bank_88[i] = NULL;
526         state->ext_bank_88[i] = NULL;
523527
524528      num80 = num88 = numIO = 0;
525529
526530      // set up the required number of banks
527      switch (extmem_mode)
531      switch (state->extmem_mode)
528532      {
529533         case 0x00: /* none */
530534            break;
r9683r9684
578582      // point the banks to the correct memory
579583      if (num80 != 0 || num88 != 0 || numIO != 0)
580584      {
581         e = extRAM;
585         e = state->extRAM;
582586
583587         for (i = 0; i < num80; i++)
584588         {
585            ext_bank_80[i] = e;
589            state->ext_bank_80[i] = e;
586590            e += 0x8000;
587591         }
588592
r9683r9684
590594         {
591595            for (j = i; j < 256; j += 16)
592596            {
593               ext_bank_88[j] = e;
597               state->ext_bank_88[j] = e;
594598            }
595599            e += 0x8000;
596600         }
r9683r9684
599603         {
600604            for (i = 0; i < numIO * 32; i++)
601605            {
602               ext_bank_88[(i & 0x07) | ((i & 0x18) << 1) | ((i & 0x20) >> 2) | (i & 0xc0)] = e;
606               state->ext_bank_88[(i & 0x07) | ((i & 0x18) << 1) | ((i & 0x20) >> 2) | (i & 0xc0)] = e;
603607               e += 0x8000;
604608            }
605609         }
r9683r9684
607611         {
608612            for (i = 0; i < numIO * 32; i++)
609613            {
610               ext_bank_88[(i & 0x07) | ((i & 0x78) << 1) | 0x08] = e;
614               state->ext_bank_88[(i & 0x07) | ((i & 0x78) << 1) | 0x08] = e;
611615               e += 0x8000;
612616            }
613617         }
r9683r9684
615619   }
616620}
617621
618static void fix_V1V2(void)
622static void fix_V1V2(pc88_state *state)
619623{
620  if(is_Nbasic) is_V2mode=0;
621  if(is_V2mode) pc88sr_is_highspeed=1;
622  switch((is_Nbasic ? 1 : 0) |
623    (is_V2mode ? 2 : 0) |
624    (pc88sr_is_highspeed ? 4 : 0))
624  if(state->is_Nbasic) state->is_V2mode=0;
625  if(state->is_V2mode) state->pc88sr_is_highspeed=1;
626  switch((state->is_Nbasic ? 1 : 0) |
627    (state->is_V2mode ? 2 : 0) |
628    (state->pc88sr_is_highspeed ? 4 : 0))
625629  {
626630  case 0:
627631    logerror("N88-BASIC(V1-S)");
r9683r9684
639643    logerror("N88-BASIC(V2)");
640644    break;
641645  default:
642    fatalerror("Illegal basic mode=(%d,%d,%d)",is_Nbasic,is_V2mode,pc88sr_is_highspeed);
646    fatalerror("Illegal basic mode=(%d,%d,%d)",state->is_Nbasic,state->is_V2mode,state->pc88sr_is_highspeed);
643647    break;
644648  }
645  if(is_8MHz) {
649  if(state->is_8MHz) {
646650    logerror(", 8MHz\n");
647651  } else {
648652    logerror(", 4MHz\n");
r9683r9684
651655
652656static void pc88sr_ch_reset(running_machine *machine, int hireso)
653657{
658   pc88_state *state = machine->driver_data<pc88_state>();
654659   running_device *speaker = machine->device("beep");
655660   int a;
656661
r9683r9684
658663   // but I guess this was the reason of bug #1952. So we now allocate the maximum
659664   // possible amount of extended RAM, and then we only use the amount we need.
660665   // eventually, we should convert the driver to use the ram device, imho.
661   extRAM_size = 4 * 0x8000 + 4 * 0x20000 + 8 * 0x100000;
662   extRAM = auto_alloc_array_clear(machine, UINT8, extRAM_size);
666   state->extRAM_size = 4 * 0x8000 + 4 * 0x20000 + 8 * 0x100000;
667   state->extRAM = auto_alloc_array_clear(machine, UINT8, state->extRAM_size);
663668
664669   a = input_port_read(machine, "CFG");
665   is_Nbasic = ((a&0x01)==0x00);
666   is_V2mode = ((a&0x02)==0x00);
667   pc88sr_is_highspeed = ((a&0x04)!=0x00);
668   is_8MHz = ((a&0x08)!=0x00);
669   fix_V1V2();
670   state->is_Nbasic = ((a&0x01)==0x00);
671   state->is_V2mode = ((a&0x02)==0x00);
672   state->pc88sr_is_highspeed = ((a&0x04)!=0x00);
673   state->is_8MHz = ((a&0x08)!=0x00);
674   fix_V1V2(state);
670675   pc8801_init_bank(machine, hireso);
671676   pc8801_init_5fd(machine);
672677   pc8801_init_interrupt(machine);
673678   beep_set_state(speaker, 0);
674679   beep_set_frequency(speaker, 2400);
675   pc88sr_init_fmsound();
680   pc88sr_init_fmsound(machine);
676681}
677682
678683/* 5 inch floppy drive */
r9683r9684
752757
753758static void pc8801_init_5fd(running_machine *machine)
754759{
755   use_5FD = (input_port_read(machine, "DSW2") & 0x80) != 0x00;
760   pc88_state *state = machine->driver_data<pc88_state>();
761   state->use_5FD = (input_port_read(machine, "DSW2") & 0x80) != 0x00;
756762
757   if (!use_5FD)
763   if (!state->use_5FD)
758764      machine->device<cpu_device>("sub")->suspend(SUSPEND_REASON_DISABLE, 1);
759765   else
760766      machine->device<cpu_device>("sub")->resume(SUSPEND_REASON_DISABLE);
r9683r9684
771777  FM sound
772778  */
773779
774static void pc88sr_init_fmsound(void)
780static void pc88sr_init_fmsound(running_machine *machine)
775781{
776  enable_FM_IRQ=0;
777  FM_IRQ_save=0;
782   pc88_state *state = machine->driver_data<pc88_state>();
783  state->enable_FM_IRQ=0;
784  state->FM_IRQ_save=0;
778785}
779786
780787void pc88sr_sound_interupt(running_device *device, int irq)
781788{
782   FM_IRQ_save=irq;
783   if(FM_IRQ_save && enable_FM_IRQ)
789   pc88_state *state = device->machine->driver_data<pc88_state>();
790   state->FM_IRQ_save=irq;
791   if(state->FM_IRQ_save && state->enable_FM_IRQ)
784792      pc8801_raise_interrupt(device->machine, FM_IRQ_LEVEL);
785793}
786794
r9683r9684
846854{
847855   pc88_state *state = machine->driver_data<pc88_state>();
848856
849   extmem_mode = -1;
857   state->extmem_mode = -1;
850858
851859   /* find devices */
852860   state->upd765 = machine->device(UPD765_TAG);
src/mess/machine/partner.c
r9683r9684
1919#include "devices/flopdrv.h"
2020#include "devices/messram.h"
2121
22static UINT8 partner_mem_page;
23static UINT8 partner_win_mem_page;
2422
2523/* Driver initialization */
2624DRIVER_INIT( partner )
r9683r9684
5048
5149static void partner_window_1(running_machine *machine, UINT8 bank_num, UINT16 offset,UINT8 *rom)
5250{
51   partner_state *state = machine->driver_data<partner_state>();
5352   char bank[10];
5453   sprintf(bank,"bank%d",bank_num);
55   switch(partner_win_mem_page) {
54   switch(state->win_mem_page) {
5655       case 2 : // FDD BIOS
5756            memory_set_bankptr(machine, bank, rom + 0x16000 + offset);
5857            break;
r9683r9684
6766
6867static void partner_window_2(running_machine *machine, UINT8 bank_num, UINT16 offset,UINT8 *rom)
6968{
69   partner_state *state = machine->driver_data<partner_state>();
7070   char bank[10];
7171   sprintf(bank,"bank%d",bank_num);
72   switch(partner_win_mem_page) {
72   switch(state->win_mem_page) {
7373       case 4 : // MCPG FONT
7474            memory_set_bankptr(machine, bank, rom + 0x18000 + offset);
7575            break;
r9683r9684
124124
125125static void partner_iomap_bank(running_machine *machine,UINT8 *rom)
126126{
127   partner_state *state = machine->driver_data<partner_state>();
127128   address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
128   switch(partner_win_mem_page) {
129   switch(state->win_mem_page) {
129130      case 2 :
130131            // FDD
131132            memory_install_write8_handler(space, 0xdc00, 0xddff, 0, 0, partner_floppy_w);
r9683r9684
141142}
142143static void partner_bank_switch(running_machine *machine)
143144{
145   partner_state *state = machine->driver_data<partner_state>();
144146   address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
145147   UINT8 *rom = memory_region(machine, "maincpu");
146148
r9683r9684
160162   memory_unmap_write(space, 0xe800, 0xffff, 0, 0);
161163
162164   // BANK 1 (0x0000 - 0x07ff)
163   if (partner_mem_page==0) {
165   if (state->mem_page==0) {
164166      memory_unmap_write(space, 0x0000, 0x07ff, 0, 0);
165167      memory_set_bankptr(machine, "bank1", rom + 0x10000);
166168   } else {
167      if (partner_mem_page==7) {
169      if (state->mem_page==7) {
168170         memory_set_bankptr(machine, "bank1", messram_get_ptr(machine->device("messram")) + 0x8000);
169171      } else {
170172         memory_set_bankptr(machine, "bank1", messram_get_ptr(machine->device("messram")) + 0x0000);
r9683r9684
172174   }
173175
174176    // BANK 2 (0x0800 - 0x3fff)
175   if (partner_mem_page==7) {
177   if (state->mem_page==7) {
176178      memory_set_bankptr(machine, "bank2", messram_get_ptr(machine->device("messram")) + 0x8800);
177179   } else {
178180      memory_set_bankptr(machine, "bank2", messram_get_ptr(machine->device("messram")) + 0x0800);
179181   }
180182
181183    // BANK 3 (0x4000 - 0x5fff)
182   if (partner_mem_page==7) {
184   if (state->mem_page==7) {
183185      memory_set_bankptr(machine, "bank3", messram_get_ptr(machine->device("messram")) + 0xC000);
184186   } else {
185      if (partner_mem_page==10) {
187      if (state->mem_page==10) {
186188         //window 1
187189         memory_unmap_write(space, 0x4000, 0x5fff, 0, 0);
188190         partner_window_1(machine, 3, 0, rom);
r9683r9684
192194   }
193195
194196    // BANK 4 (0x6000 - 0x7fff)
195   if (partner_mem_page==7) {
197   if (state->mem_page==7) {
196198      memory_set_bankptr(machine, "bank4", messram_get_ptr(machine->device("messram")) + 0xe000);
197199   } else {
198200      memory_set_bankptr(machine, "bank4", messram_get_ptr(machine->device("messram")) + 0x6000);
199201   }
200202
201203    // BANK 5 (0x8000 - 0x9fff)
202   switch (partner_mem_page) {
204   switch (state->mem_page) {
203205      case 5:
204206      case 10:
205207            //window 2
r9683r9684
221223   }
222224
223225    // BANK 6 (0xa000 - 0xb7ff)
224   switch (partner_mem_page) {
226   switch (state->mem_page) {
225227      case 5:
226228      case 10:
227229            //window 2
r9683r9684
243245   }
244246
245247    // BANK 7 (0xb800 - 0xbfff)
246   switch (partner_mem_page) {
248   switch (state->mem_page) {
247249      case 4:
248250      case 5:
249251      case 10:
r9683r9684
266268   }
267269
268270    // BANK 8 (0xc000 - 0xc7ff)
269   switch (partner_mem_page) {
271   switch (state->mem_page) {
270272      case 7:
271273            memory_set_bankptr(machine, "bank8", messram_get_ptr(machine->device("messram")) + 0x4000);
272274            break;
r9683r9684
281283   }
282284
283285    // BANK 9 (0xc800 - 0xcfff)
284   switch (partner_mem_page) {
286   switch (state->mem_page) {
285287      case 7:
286288            memory_set_bankptr(machine, "bank9", messram_get_ptr(machine->device("messram")) + 0x4800);
287289            break;
r9683r9684
301303   }
302304
303305    // BANK 10 (0xd000 - 0xd7ff)
304   switch (partner_mem_page) {
306   switch (state->mem_page) {
305307      case 7:
306308            memory_set_bankptr(machine, "bank10", messram_get_ptr(machine->device("messram")) + 0x5000);
307309            break;
r9683r9684
320322   partner_iomap_bank(machine,rom);
321323
322324    // BANK 12 (0xe000 - 0xe7ff)
323   if (partner_mem_page==1) {
325   if (state->mem_page==1) {
324326      memory_set_bankptr(machine, "bank12", rom + 0x10000);
325327   } else {
326328      //window 1
r9683r9684
328330   }
329331
330332    // BANK 13 (0xe800 - 0xffff)
331   switch (partner_mem_page) {
333   switch (state->mem_page) {
332334      case 3:
333335      case 4:
334336      case 5:
r9683r9684
344346
345347WRITE8_HANDLER ( partner_win_memory_page_w )
346348{
347   partner_win_mem_page = ~data;
349   partner_state *state = space->machine->driver_data<partner_state>();
350   state->win_mem_page = ~data;
348351   partner_bank_switch(space->machine);
349352}
350353
351354WRITE8_HANDLER (partner_mem_page_w )
352355{
353   partner_mem_page = (data >> 4) & 0x0f;
356   partner_state *state = space->machine->driver_data<partner_state>();
357   state->mem_page = (data >> 4) & 0x0f;
354358   partner_bank_switch(space->machine);
355359}
356360
r9683r9684
381385
382386MACHINE_RESET( partner )
383387{
384   partner_mem_page = 0;
385   partner_win_mem_page = 0;
388   partner_state *state = machine->driver_data<partner_state>();
389   state->mem_page = 0;
390   state->win_mem_page = 0;
386391   partner_bank_switch(machine);
387392}
src/mess/machine/pp01.c
r9683r9684
1212#include "includes/pp01.h"
1313#include "devices/messram.h"
1414
15static UINT8 memory_block[16];
16UINT8 pp01_video_scroll;
17static UINT8 pp01_video_write_mode;
1815
1916WRITE8_HANDLER( pp01_video_write_mode_w )
2017{
21   pp01_video_write_mode = data & 0x0f;
18   pp01_state *state = space->machine->driver_data<pp01_state>();
19   state->video_write_mode = data & 0x0f;
2220}
2321
2422static void pp01_video_w(running_machine *machine,UINT8 block,UINT16 offset,UINT8 data,UINT8 part)
2523{
24   pp01_state *state = machine->driver_data<pp01_state>();
2625   UINT16 addroffset = part ? 0x1000  : 0x0000;
2726
28   if (BIT(pp01_video_write_mode,3)) {
27   if (BIT(state->video_write_mode,3)) {
2928      // Copy mode
30      if(BIT(pp01_video_write_mode,0)) {
29      if(BIT(state->video_write_mode,0)) {
3130         messram_get_ptr(machine->device("messram"))[0x6000+offset+addroffset] = data;
3231      } else {
3332         messram_get_ptr(machine->device("messram"))[0x6000+offset+addroffset] = 0;
3433      }
35      if(BIT(pp01_video_write_mode,1)) {
34      if(BIT(state->video_write_mode,1)) {
3635         messram_get_ptr(machine->device("messram"))[0xa000+offset+addroffset] = data;
3736      } else {
3837         messram_get_ptr(machine->device("messram"))[0xa000+offset+addroffset] = 0;
3938      }
40      if(BIT(pp01_video_write_mode,2)) {
39      if(BIT(state->video_write_mode,2)) {
4140         messram_get_ptr(machine->device("messram"))[0xe000+offset+addroffset] = data;
4241      } else {
4342         messram_get_ptr(machine->device("messram"))[0xe000+offset+addroffset] = 0;
r9683r9684
132131
133132MACHINE_RESET( pp01 )
134133{
134   pp01_state *state = machine->driver_data<pp01_state>();
135135   int i;
136   memset(memory_block,0xff,16);
136   memset(state->memory_block,0xff,16);
137137   for(i=0;i<16;i++) {
138      memory_block[i] = 0xff;
138      state->memory_block[i] = 0xff;
139139      pp01_set_memory(machine, i, 0xff);
140140   }
141141}
142142
143143WRITE8_HANDLER (pp01_mem_block_w)
144144{
145   memory_block[offset] = data;
145   pp01_state *state = space->machine->driver_data<pp01_state>();
146   state->memory_block[offset] = data;
146147   pp01_set_memory(space->machine, offset, data);
147148}
148149
149150READ8_HANDLER (pp01_mem_block_r)
150151{
151   return   memory_block[offset];
152   pp01_state *state = space->machine->driver_data<pp01_state>();
153   return   state->memory_block[offset];
152154}
153155
154156MACHINE_START(pp01)
r9683r9684
187189
188190static READ8_DEVICE_HANDLER (pp01_8255_porta_r )
189191{
190   return pp01_video_scroll;
192   pp01_state *state = device->machine->driver_data<pp01_state>();
193   return state->video_scroll;
191194}
192195static WRITE8_DEVICE_HANDLER (pp01_8255_porta_w )
193196{
194   pp01_video_scroll = data;
197   pp01_state *state = device->machine->driver_data<pp01_state>();
198   state->video_scroll = data;
195199}
196200
197static UINT8 pp01_key_line = 0;
198201static READ8_DEVICE_HANDLER (pp01_8255_portb_r )
199202{
203   pp01_state *state = device->machine->driver_data<pp01_state>();
200204   static const char *const keynames[] = {
201205      "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7",
202206      "LINE8", "LINE9", "LINEA", "LINEB", "LINEC", "LINED", "LINEE", "LINEF"
203207   };
204208
205   return (input_port_read(device->machine,keynames[pp01_key_line]) & 0x3F) | (input_port_read(device->machine,"LINEALL") & 0xC0);
209   return (input_port_read(device->machine,keynames[state->key_line]) & 0x3F) | (input_port_read(device->machine,"LINEALL") & 0xC0);
206210}
207211static WRITE8_DEVICE_HANDLER (pp01_8255_portb_w )
208212{
r9683r9684
212216
213217static WRITE8_DEVICE_HANDLER (pp01_8255_portc_w )
214218{
215   pp01_key_line = data & 0x0f;
219   pp01_state *state = device->machine->driver_data<pp01_state>();
220   state->key_line = data & 0x0f;
216221}
217222
218223static READ8_DEVICE_HANDLER (pp01_8255_portc_r )
src/mess/machine/pk8020.c
r9683r9684
1414#include "devices/messram.h"
1515#include "devices/flopdrv.h"
1616
17static UINT8 attr = 0;
18static UINT8 text_attr = 0;
19static UINT8 takt = 0;
20UINT8 pk8020_color = 0;
21UINT8 pk8020_video_page = 0;
22UINT8 pk8020_wide = 0;
23UINT8 pk8020_font = 0;
24static UINT8 pk8020_video_page_access = 0;
25static UINT8 portc_data;
2617static void pk8020_set_bank(running_machine *machine,UINT8 data);
27static UINT8 sound_gate = 0;
28static UINT8 sound_level = 0;
2918
3019
3120static READ8_HANDLER( keyboard_r )
r9683r9684
6453}
6554static WRITE8_HANDLER(sysreg_w)
6655{
56   pk8020_state *state = space->machine->driver_data<pk8020_state>();
6757   if (BIT(offset,7)==0) {
6858      pk8020_set_bank(space->machine,data >> 2);
6959   } else if (BIT(offset,6)==0) {
7060      // Color
71      pk8020_color = data;
61      state->color = data;
7262   } else if (BIT(offset,2)==0) {
7363      // Palette set
7464      UINT8 number = data & 0x0f;
r9683r9684
8373
8474static READ8_HANDLER(text_r)
8575{
86    if (attr == 3) text_attr=messram_get_ptr(space->machine->device("messram"))[0x40400+offset];
76   pk8020_state *state = space->machine->driver_data<pk8020_state>();
77    if (state->attr == 3) state->text_attr=messram_get_ptr(space->machine->device("messram"))[0x40400+offset];
8778   return messram_get_ptr(space->machine->device("messram"))[0x40000+offset];
8879}
8980
9081static WRITE8_HANDLER(text_w)
9182{
83   pk8020_state *state = space->machine->driver_data<pk8020_state>();
9284   messram_get_ptr(space->machine->device("messram"))[0x40000+offset] = data;
93   switch (attr) {
85   switch (state->attr) {
9486        case 0: break;
9587        case 1: messram_get_ptr(space->machine->device("messram"))[0x40400+offset]=0x01;break;
9688        case 2: messram_get_ptr(space->machine->device("messram"))[0x40400+offset]=0x00;break;
97        case 3: messram_get_ptr(space->machine->device("messram"))[0x40400+offset]=text_attr;break;
89        case 3: messram_get_ptr(space->machine->device("messram"))[0x40400+offset]=state->text_attr;break;
9890    }
9991}
10092
10193static READ8_HANDLER(gzu_r)
10294{
103   UINT8 *addr = messram_get_ptr(space->machine->device("messram")) + 0x10000 + (pk8020_video_page_access * 0xC000);
95   pk8020_state *state = space->machine->driver_data<pk8020_state>();
96   UINT8 *addr = messram_get_ptr(space->machine->device("messram")) + 0x10000 + (state->video_page_access * 0xC000);
10497   UINT8 p0 = addr[offset];
10598   UINT8 p1 = addr[offset + 0x4000];
10699   UINT8 p2 = addr[offset + 0x8000];
107100   UINT8 retVal = 0;
108   if(pk8020_color & 0x80) {
101   if(state->color & 0x80) {
109102      // Color mode
110      if (!(pk8020_color & 0x10)) {
103      if (!(state->color & 0x10)) {
111104         p0 ^= 0xff;
112105      }
113      if (!(pk8020_color & 0x20)) {
106      if (!(state->color & 0x20)) {
114107         p1 ^= 0xff;
115108      }
116      if (!(pk8020_color & 0x40)) {
109      if (!(state->color & 0x40)) {
117110         p2 ^= 0xff;
118111      }
119112      retVal = (p0 & p1 & p2) ^ 0xff;
120113   } else {
121114      // Plane mode
122      if (pk8020_color & 0x10) {
115      if (state->color & 0x10) {
123116         retVal |= p0;
124117      }
125      if (pk8020_color & 0x20) {
118      if (state->color & 0x20) {
126119         retVal |= p1;
127120      }
128      if (pk8020_color & 0x40) {
121      if (state->color & 0x40) {
129122         retVal |= p2;
130123      }
131124   }
r9683r9684
134127
135128static WRITE8_HANDLER(gzu_w)
136129{
137   UINT8 *addr = messram_get_ptr(space->machine->device("messram")) + 0x10000 + (pk8020_video_page_access * 0xC000);
130   pk8020_state *state = space->machine->driver_data<pk8020_state>();
131   UINT8 *addr = messram_get_ptr(space->machine->device("messram")) + 0x10000 + (state->video_page_access * 0xC000);
138132   UINT8 *plane_0 = addr;
139133   UINT8 *plane_1 = addr + 0x4000;
140134   UINT8 *plane_2 = addr + 0x8000;
141135
142   if(pk8020_color & 0x80)
136   if(state->color & 0x80)
143137   {
144138      // Color mode
145      plane_0[offset] = (plane_0[offset] & ~data) | ((pk8020_color & 2) ? data : 0);
146      plane_1[offset] = (plane_1[offset] & ~data) | ((pk8020_color & 4) ? data : 0);
147      plane_2[offset] = (plane_2[offset] & ~data) | ((pk8020_color & 8) ? data : 0);
139      plane_0[offset] = (plane_0[offset] & ~data) | ((state->color & 2) ? data : 0);
140      plane_1[offset] = (plane_1[offset] & ~data) | ((state->color & 4) ? data : 0);
141      plane_2[offset] = (plane_2[offset] & ~data) | ((state->color & 8) ? data : 0);
148142   } else {
149143      // Plane mode
150      UINT8 mask = (pk8020_color & 1) ? data : 0;
151      if (!(pk8020_color & 0x02)) {
144      UINT8 mask = (state->color & 1) ? data : 0;
145      if (!(state->color & 0x02)) {
152146         plane_0[offset] = (plane_0[offset] & ~data) | mask;
153147      }
154      if (!(pk8020_color & 0x04)) {
148      if (!(state->color & 0x04)) {
155149         plane_1[offset] = (plane_1[offset] & ~data) | mask;
156150      }
157      if (!(pk8020_color & 0x08)) {
151      if (!(state->color & 0x08)) {
158152         plane_2[offset] = (plane_2[offset] & ~data) | mask;
159153      }
160154   }
r9683r9684
853847
854848static READ8_DEVICE_HANDLER(pk8020_porta_r)
855849{
856   return 0xf0 | (takt <<1) | (text_attr)<<3;
850   pk8020_state *state = device->machine->driver_data<pk8020_state>();
851   return 0xf0 | (state->takt <<1) | (state->text_attr)<<3;
857852}
858853
859854static WRITE8_DEVICE_HANDLER(pk8020_portc_w)
860855{
861   pk8020_video_page_access =(data>>6) & 3;
862   attr = (data >> 4) & 3;
863   pk8020_wide = (data >> 3) & 1;
864   pk8020_font = (data >> 2) & 1;
865   pk8020_video_page = (data & 3);
856   pk8020_state *state = device->machine->driver_data<pk8020_state>();
857   state->video_page_access =(data>>6) & 3;
858   state->attr = (data >> 4) & 3;
859   state->wide = (data >> 3) & 1;
860   state->font = (data >> 2) & 1;
861   state->video_page = (data & 3);
866862
867863
868   portc_data = data;
864   state->portc_data = data;
869865}
870866
871867static WRITE8_DEVICE_HANDLER(pk8020_portb_w)
r9683r9684
898894
899895static READ8_DEVICE_HANDLER(pk8020_portc_r)
900896{
901   return portc_data;
897   pk8020_state *state = device->machine->driver_data<pk8020_state>();
898   return state->portc_data;
902899}
903900
904901
r9683r9684
914911
915912static WRITE8_DEVICE_HANDLER(pk8020_2_portc_w)
916913{
914   pk8020_state *state = device->machine->driver_data<pk8020_state>();
917915   running_device *speaker = device->machine->device("speaker");
918916
919   sound_gate = BIT(data,3);
917   state->sound_gate = BIT(data,3);
920918
921   speaker_level_w(speaker, sound_gate ? sound_level : 0);
919   speaker_level_w(speaker, state->sound_gate ? state->sound_level : 0);
922920}
923921
924922I8255A_INTERFACE( pk8020_ppi8255_interface_2 )
r9683r9684
943941
944942static WRITE_LINE_DEVICE_HANDLER( pk8020_pit_out0 )
945943{
944   pk8020_state *drvstate = device->machine->driver_data<pk8020_state>();
946945   running_device *speaker = device->machine->device("speaker");
947946
948   sound_level = state;
947   drvstate->sound_level = state;
949948
950   speaker_level_w(speaker, sound_gate ? sound_level : 0);
949   speaker_level_w(speaker, drvstate->sound_gate ? drvstate->sound_level : 0);
951950}
952951
953952
r9683r9684
994993
995994MACHINE_RESET( pk8020 )
996995{
996   pk8020_state *state = machine->driver_data<pk8020_state>();
997997   pk8020_set_bank(machine,0);
998998   cpu_set_irq_callback(machine->device("maincpu"), pk8020_irq_callback);
999999
1000   sound_gate = 0;
1001   sound_level = 0;
1000   state->sound_gate = 0;
1001   state->sound_level = 0;
10021002}
10031003
10041004INTERRUPT_GEN( pk8020_interrupt )
10051005{
1006   takt ^= 1;
1006   pk8020_state *state = device->machine->driver_data<pk8020_state>();
1007   state->takt ^= 1;
10071008   pic8259_ir4_w(device->machine->device("pic8259"), 1);
10081009}
src/mess/video/pc8801.c
r9683r9684
1414/* NPW 23-Oct-2001 - Adding this so that it compiles */
1515#define palette_transparent_pen   0
1616
17unsigned char *pc88sr_textRAM = NULL;
18int pc8801_is_24KHz;
19static unsigned char *gVRAM = NULL;
20static int selected_vram;
21static int crtc_on, text_on, text_width, text_height, text_invert, text_color;
22static int text_cursor, text_cursorX, text_cursorY;
23static int blink_period;
24static int analog_palette;
25static int alu_1, alu_2, alu_on;
26static unsigned char alu_save0, alu_save1, alu_save2;
2717
28static int dmac_fl;
29static UINT16 dmac_addr[3], dmac_size[3];
30static UINT8 dmac_flag, dmac_status;
3118
3219enum
3320{
r9683r9684
3623   noblink_block,
3724   blink_block
3825};
39static int cursor_mode;
4026
4127enum
4228{
r9683r9684
5137   lpeny,
5238   other
5339};
54static int crtc_state;
5540
5641enum
5742{
r9683r9684
6045   GRAPH_200_BW,
6146   GRAPH_400_BW
6247};
63static int gmode;
6448
65static int disp_plane[3];
6649
6750#define TX_SEC      0x0001
6851#define TX_BL      0x0002
r9683r9684
7962#define TX_WID_MASK   0x0300
8063#define TX_WID_SHIFT   8
8164
82static char *graph_dirty = NULL;
83static unsigned short *attr_tmp = NULL, *attr_old = NULL, *text_old = NULL;
84static bitmap_t *wbm1, *wbm2;
8565
86#define TRAM(x,y) (pc88sr_is_highspeed ? \
87   pc88sr_textRAM[(dmac_addr[2]+(x)+(y)*120)&0xfff] : \
88   pc8801_mainRAM[(dmac_addr[2]+(x)+(y)*120)&0xffff])
89#define ATTR_TMP(x,y) (attr_tmp[(x)+(y)*80])
90#define TEXT_OLD(x,y) (text_old[(x)+(y)*80])
91#define ATTR_OLD(x,y) (attr_old[(x)+(y)*80])
92#define GRP_DIRTY(x,y) (graph_dirty[(x)+(y)*80])
66#define TRAM(x,y) (state->pc88sr_is_highspeed ? \
67   state->pc88sr_textRAM[(state->dmac_addr[2]+(x)+(y)*120)&0xfff] : \
68   state->mainRAM[(state->dmac_addr[2]+(x)+(y)*120)&0xffff])
69#define ATTR_TMP(x,y) (state->attr_tmp[(x)+(y)*80])
70#define TEXT_OLD(x,y) (state->text_old[(x)+(y)*80])
71#define ATTR_OLD(x,y) (state->attr_old[(x)+(y)*80])
72#define GRP_DIRTY(x,y) (state->graph_dirty[(x)+(y)*80])
9373
9474INLINE void pc8801_plot_pixel( bitmap_t *bitmap, int x, int y, UINT32 color )
9575{
r9683r9684
9878
9979void pc8801_video_init( running_machine *machine, int hireso )
10080{
81   pc88_state *state = machine->driver_data<pc88_state>();
10182   screen_device *screen = screen_first(*machine);
10283   int width = screen->width();
10384   int height = screen->height();
10485
105   wbm1 = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16);
106   wbm2 = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16);
107   pc8801_is_24KHz = hireso;
108   crtc_on = 0;
109   text_on = 1;
86   state->wbm1 = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16);
87   state->wbm2 = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16);
88   state->is_24KHz = hireso;
89   state->crtc_on = 0;
90   state->text_on = 1;
11091
111   dmac_fl = 0;
112   dmac_addr[0] = dmac_size[0] = 0;
113   dmac_addr[1] = dmac_size[1] = 0;
114   dmac_addr[2] = dmac_size[2] = 0;
115   dmac_flag = dmac_status = 0;
92   state->dmac_fl = 0;
93   state->dmac_addr[0] = state->dmac_size[0] = 0;
94   state->dmac_addr[1] = state->dmac_size[1] = 0;
95   state->dmac_addr[2] = state->dmac_size[2] = 0;
96   state->dmac_flag = state->dmac_status = 0;
11697
117   gVRAM = auto_alloc_array(machine, UINT8, 0xc000);
118   pc88sr_textRAM = auto_alloc_array(machine, UINT8, 0x1000);
119   attr_tmp = auto_alloc_array(machine, UINT16, 80*25);
120   attr_old = auto_alloc_array(machine, UINT16, 80*100);
121   text_old = auto_alloc_array(machine, UINT16, 80*100);
122   graph_dirty = auto_alloc_array(machine, char, 80*100);
98   state->gVRAM = auto_alloc_array(machine, UINT8, 0xc000);
99   state->pc88sr_textRAM = auto_alloc_array(machine, UINT8, 0x1000);
100   state->attr_tmp = auto_alloc_array(machine, UINT16, 80*25);
101   state->attr_old = auto_alloc_array(machine, UINT16, 80*100);
102   state->text_old = auto_alloc_array(machine, UINT16, 80*100);
103   state->graph_dirty = auto_alloc_array(machine, char, 80*100);
123104
124   memset(gVRAM, 0, 0xc000);
125   memset(pc88sr_textRAM, 0, 0x1000);
126   selected_vram = 0;
127   alu_on = 0;
128   analog_palette = 0;
105   memset(state->gVRAM, 0, 0xc000);
106   memset(state->pc88sr_textRAM, 0, 0x1000);
107   state->selected_vram = 0;
108   state->alu_on = 0;
109   state->analog_palette = 0;
129110}
130111
131112static WRITE8_HANDLER( write_gvram )
132113{
114   pc88_state *state = space->machine->driver_data<pc88_state>();
133115   int x, y;
134116
135   if (gVRAM[offset] != data)
117   if (state->gVRAM[offset] != data)
136118   {
137      gVRAM[offset] = data;
138      switch (gmode)
119      state->gVRAM[offset] = data;
120      switch (state->gmode)
139121      {
140122      case GRAPH_200_COL:
141123      case GRAPH_200_BW:
r9683r9684
164146static WRITE8_HANDLER(write_gvram2_bank6){write_gvram(space, offset + 0x4000 * 2 + 0x3000, data);}
165147
166148
167static UINT8 read_save_alu( int x, UINT32 offset )
149static UINT8 read_save_alu( address_space *space, int x, UINT32 offset )
168150{
169   alu_save0 = gVRAM[offset + 0x0000];
170   alu_save1 = gVRAM[offset + 0x4000];
171   alu_save2 = gVRAM[offset + 0x8000];
151   pc88_state *state = space->machine->driver_data<pc88_state>();
152   state->alu_save0 = state->gVRAM[offset + 0x0000];
153   state->alu_save1 = state->gVRAM[offset + 0x4000];
154   state->alu_save2 = state->gVRAM[offset + 0x8000];
172155
173   return (x & 1 ? gVRAM[offset + 0x0000] : ~gVRAM[offset + 0x0000]) &
174         (x & 2 ? gVRAM[offset + 0x4000] : ~gVRAM[offset + 0x4000]) &
175         (x & 4 ? gVRAM[offset + 0x8000] : ~gVRAM[offset + 0x8000]);
156   return (x & 1 ? state->gVRAM[offset + 0x0000] : ~state->gVRAM[offset + 0x0000]) &
157         (x & 2 ? state->gVRAM[offset + 0x4000] : ~state->gVRAM[offset + 0x4000]) &
158         (x & 4 ? state->gVRAM[offset + 0x8000] : ~state->gVRAM[offset + 0x8000]);
176159}
177160
178static READ8_HANDLER(read_gvram_alu0_bank5){return read_save_alu(0, offset);}
179static READ8_HANDLER(read_gvram_alu0_bank6){return read_save_alu(0, offset + 0x3000);}
180static READ8_HANDLER(read_gvram_alu1_bank5){return read_save_alu(1, offset);}
181static READ8_HANDLER(read_gvram_alu1_bank6){return read_save_alu(1, offset + 0x3000);}
182static READ8_HANDLER(read_gvram_alu2_bank5){return read_save_alu(2, offset);}
183static READ8_HANDLER(read_gvram_alu2_bank6){return read_save_alu(2, offset + 0x3000);}
184static READ8_HANDLER(read_gvram_alu3_bank5){return read_save_alu(3, offset);}
185static READ8_HANDLER(read_gvram_alu3_bank6){return read_save_alu(3, offset + 0x3000);}
186static READ8_HANDLER(read_gvram_alu4_bank5){return read_save_alu(4, offset);}
187static READ8_HANDLER(read_gvram_alu4_bank6){return read_save_alu(4, offset + 0x3000);}
188static READ8_HANDLER(read_gvram_alu5_bank5){return read_save_alu(5, offset);}
189static READ8_HANDLER(read_gvram_alu5_bank6){return read_save_alu(5, offset + 0x3000);}
190static READ8_HANDLER(read_gvram_alu6_bank5){return read_save_alu(6, offset);}
191static READ8_HANDLER(read_gvram_alu6_bank6){return read_save_alu(6, offset + 0x3000);}
192static READ8_HANDLER(read_gvram_alu7_bank5){return read_save_alu(7, offset);}
193static READ8_HANDLER(read_gvram_alu7_bank6){return read_save_alu(7, offset + 0x3000);}
161static READ8_HANDLER(read_gvram_alu0_bank5){return read_save_alu(space, 0, offset);}
162static READ8_HANDLER(read_gvram_alu0_bank6){return read_save_alu(space, 0, offset + 0x3000);}
163static READ8_HANDLER(read_gvram_alu1_bank5){return read_save_alu(space, 1, offset);}
164static READ8_HANDLER(read_gvram_alu1_bank6){return read_save_alu(space, 1, offset + 0x3000);}
165static READ8_HANDLER(read_gvram_alu2_bank5){return read_save_alu(space, 2, offset);}
166static READ8_HANDLER(read_gvram_alu2_bank6){return read_save_alu(space, 2, offset + 0x3000);}
167static READ8_HANDLER(read_gvram_alu3_bank5){return read_save_alu(space, 3, offset);}
168static READ8_HANDLER(read_gvram_alu3_bank6){return read_save_alu(space, 3, offset + 0x3000);}
169static READ8_HANDLER(read_gvram_alu4_bank5){return read_save_alu(space, 4, offset);}
170static READ8_HANDLER(read_gvram_alu4_bank6){return read_save_alu(space, 4, offset + 0x3000);}
171static READ8_HANDLER(read_gvram_alu5_bank5){return read_save_alu(space, 5, offset);}
172static READ8_HANDLER(read_gvram_alu5_bank6){return read_save_alu(space, 5, offset + 0x3000);}
173static READ8_HANDLER(read_gvram_alu6_bank5){return read_save_alu(space, 6, offset);}
174static READ8_HANDLER(read_gvram_alu6_bank6){return read_save_alu(space, 6, offset + 0x3000);}
175static READ8_HANDLER(read_gvram_alu7_bank5){return read_save_alu(space, 7, offset);}
176static READ8_HANDLER(read_gvram_alu7_bank6){return read_save_alu(space, 7, offset + 0x3000);}
194177
195178
196179static WRITE8_HANDLER(write_gvram_alu0)
197180{
198   switch (alu_1 & 0x11)
181   pc88_state *state = space->machine->driver_data<pc88_state>();
182   switch (state->alu_1 & 0x11)
199183   {
200184   case 0x00:
201      write_gvram(space, offset, gVRAM[offset] & ~data);
185      write_gvram(space, offset, state->gVRAM[offset] & ~data);
202186      break;
203187   case 0x01:
204      write_gvram(space, offset, gVRAM[offset] | data);
188      write_gvram(space, offset, state->gVRAM[offset] | data);
205189      break;
206190   case 0x10:
207      write_gvram(space, offset, gVRAM[offset] ^ data);
191      write_gvram(space, offset, state->gVRAM[offset] ^ data);
208192      break;
209193   case 0x11:
210194      break;
211195   }
212196
213   switch (alu_1 & (0x11 << 1))
197   switch (state->alu_1 & (0x11 << 1))
214198   {
215199   case 0x00 << 1:
216      write_gvram(space, offset + 0x4000, gVRAM[offset + 0x4000] & ~data);
200      write_gvram(space, offset + 0x4000, state->gVRAM[offset + 0x4000] & ~data);
217201      break;
218202   case 0x01 << 1:
219      write_gvram(space, offset + 0x4000, gVRAM[offset + 0x4000] | data);
203      write_gvram(space, offset + 0x4000, state->gVRAM[offset + 0x4000] | data);
220204      break;
221205   case 0x10 << 1:
222      write_gvram(space, offset + 0x4000, gVRAM[offset + 0x4000] ^ data);
206      write_gvram(space, offset + 0x4000, state->gVRAM[offset + 0x4000] ^ data);
223207      break;
224208   case 0x11 << 1:
225209      break;
226210   }
227211
228   switch (alu_1 & (0x11 << 2))
212   switch (state->alu_1 & (0x11 << 2))
229213   {
230214   case 0x00 << 2:
231      write_gvram(space, offset + 0x8000, gVRAM[offset + 0x8000] & ~data);
215      write_gvram(space, offset + 0x8000, state->gVRAM[offset + 0x8000] & ~data);
232216      break;
233217   case 0x01 << 2:
234      write_gvram(space, offset + 0x8000, gVRAM[offset + 0x8000] | data);
218      write_gvram(space, offset + 0x8000, state->gVRAM[offset + 0x8000] | data);
235219      break;
236220   case 0x10 << 2:
237      write_gvram(space, offset + 0x8000, gVRAM[offset + 0x8000] ^ data);
221      write_gvram(space, offset + 0x8000, state->gVRAM[offset + 0x8000] ^ data);
238222      break;
239223   case 0x11 << 2:
240224      break;
r9683r9684
243227
244228static WRITE8_HANDLER(write_gvram_alu1)
245229{
246   write_gvram(space, offset + 0x0000 , alu_save0);
247   write_gvram(space, offset + 0x4000 , alu_save1);
248   write_gvram(space, offset + 0x8000 , alu_save2);
230   pc88_state *state = space->machine->driver_data<pc88_state>();
231   write_gvram(space, offset + 0x0000 , state->alu_save0);
232   write_gvram(space, offset + 0x4000 , state->alu_save1);
233   write_gvram(space, offset + 0x8000 , state->alu_save2);
249234}
250235
251static WRITE8_HANDLER(write_gvram_alu2){write_gvram(space, offset + 0x0000, alu_save1);}
236static WRITE8_HANDLER(write_gvram_alu2){
237   pc88_state *state = space->machine->driver_data<pc88_state>();write_gvram(space, offset + 0x0000, state->alu_save1);}
252238
253static WRITE8_HANDLER(write_gvram_alu3){write_gvram(space, offset + 0x4000, alu_save0);}
239static WRITE8_HANDLER(write_gvram_alu3){
240   pc88_state *state = space->machine->driver_data<pc88_state>();write_gvram(space, offset + 0x4000, state->alu_save0);}
254241
255242
256243static WRITE8_HANDLER(write_gvram_alu0_bank5){write_gvram_alu0(space, offset,data);}
r9683r9684
265252
266253int pc8801_is_vram_select( running_machine *machine )
267254{
268   if (alu_on)
255   pc88_state *state = machine->driver_data<pc88_state>();
256   if (state->alu_on)
269257   {
270258      /* ALU mode */
271      if (alu_2 & 0x80)
259      if (state->alu_2 & 0x80)
272260      {
273261         /* ALU VRAM */
274         switch (alu_2 & 0x07)
262         switch (state->alu_2 & 0x07)
275263         {
276264         case 0:
277265            memory_install_read8_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xc000, 0xefff, 0, 0, read_gvram_alu0_bank5);
r9683r9684
307295            break;
308296          }
309297
310         switch (alu_2 & 0x30)
298         switch (state->alu_2 & 0x30)
311299         {
312300         case 0x00:
313301            memory_install_write8_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xc000, 0xefff, 0, 0, write_gvram_alu0_bank5);
r9683r9684
337325   else
338326   {
339327      /* old mode */
340      switch (selected_vram)
328      switch (state->selected_vram)
341329      {
342330      case 1:
343         memory_set_bankptr(machine, "bank5", gVRAM );
344         memory_set_bankptr(machine, "bank6", gVRAM + 0x3000 );
331         memory_set_bankptr(machine, "bank5", state->gVRAM );
332         memory_set_bankptr(machine, "bank6", state->gVRAM + 0x3000 );
345333         memory_install_read_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xc000, 0xefff, 0, 0, "bank5");
346334         memory_install_write8_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xc000, 0xefff, 0, 0, write_gvram0_bank5);
347335         memory_install_read_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xf000, 0xffff, 0, 0, "bank6");
r9683r9684
349337         return 1;
350338
351339      case 2:
352         memory_set_bankptr(machine, "bank5", gVRAM + 0x4000 );
353         memory_set_bankptr(machine, "bank6", gVRAM + 0x4000 + 0x3000 );
340         memory_set_bankptr(machine, "bank5", state->gVRAM + 0x4000 );
341         memory_set_bankptr(machine, "bank6", state->gVRAM + 0x4000 + 0x3000 );
354342         memory_install_read_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xc000, 0xefff, 0, 0, "bank5");
355343         memory_install_write8_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xc000, 0xefff, 0, 0, write_gvram1_bank5);
356344         memory_install_read_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xf000, 0xffff, 0, 0, "bank6");
r9683r9684
358346         return 1;
359347
360348      case 3:
361         memory_set_bankptr(machine, "bank5", gVRAM + 0x8000 );
362         memory_set_bankptr(machine, "bank6", gVRAM + 0x8000 + 0x3000 );
349         memory_set_bankptr(machine, "bank5", state->gVRAM + 0x8000 );
350         memory_set_bankptr(machine, "bank6", state->gVRAM + 0x8000 + 0x3000 );
363351         memory_install_read_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xc000, 0xefff, 0, 0, "bank5");
364352         memory_install_write8_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xc000, 0xefff, 0, 0, write_gvram2_bank5);
365353         memory_install_read_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xf000, 0xffff, 0, 0, "bank6");
r9683r9684
375363
376364WRITE8_HANDLER( pc88sr_disp_32 )
377365{
378   analog_palette = ((data & 0x20) != 0x00);
379   alu_on = ((data & 0x40) != 0x00);
366   pc88_state *state = space->machine->driver_data<pc88_state>();
367   state->analog_palette = ((data & 0x20) != 0x00);
368   state->alu_on = ((data & 0x40) != 0x00);
380369   pc8801_update_bank(space->machine);
381370}
382371
383372WRITE8_HANDLER( pc88sr_alu )
384373{
374   pc88_state *state = space->machine->driver_data<pc88_state>();
385375   switch (offset)
386376   {
387377   case 0:
388      alu_1 = data;
378      state->alu_1 = data;
389379      break;
390380   case 1:
391      alu_2 = data;
381      state->alu_2 = data;
392382      break;
393383   }
394384   pc8801_update_bank(space->machine);
r9683r9684
396386
397387WRITE8_HANDLER( pc88_vramsel_w )
398388{
389   pc88_state *state = space->machine->driver_data<pc88_state>();
399390   if (offset == 3)
400      selected_vram = 0;
391      state->selected_vram = 0;
401392   else
402      selected_vram = offset + 1;
393      state->selected_vram = offset + 1;
403394
404395   pc8801_update_bank(space->machine);
405396}
406397
407398READ8_HANDLER( pc88_vramtest_r )
408399{
409   switch (selected_vram)
400   pc88_state *state = space->machine->driver_data<pc88_state>();
401   switch (state->selected_vram)
410402   {
411403   case 1:  return 0xf9;
412404   case 2:  return 0xfa;
r9683r9684
417409
418410VIDEO_START( pc8801 )
419411{
420   text_width = 40;
421   text_height = 20;
422   blink_period = 24;
412   pc88_state *state = machine->driver_data<pc88_state>();
413   state->text_width = 40;
414   state->text_height = 20;
415   state->blink_period = 24;
423416}
424417
425#define BLOCK_YSIZE (pc8801_is_24KHz ? 4 : 2)
418#define BLOCK_YSIZE (state->is_24KHz ? 4 : 2)
426419
427420VIDEO_UPDATE( pc8801 )
428421{
422   pc88_state *state = screen->machine->driver_data<pc88_state>();
429423   int x, y, attr_new, text_new, i, a, tx, ty, oy, gx, gy, ct, cg;
430424   static int blink_count;
431425   int full_refresh = 1;
432426
433   blink_count = (blink_count + 1) % (blink_period * 4);
427   blink_count = (blink_count + 1) % (state->blink_period * 4);
434428   /* attribute expand */
435429   for (y = 0; y < 25; y++)
436430   {
r9683r9684
439433      for (i = 0; i <= 20; i++)
440434      {
441435         a = TRAM(80 + i * 2 + 1, y);
442         if (text_color)
436         if (state->text_color)
443437         {
444438            /* color mode */
445439            if (a & 0x08)
r9683r9684
481475         x++;
482476      };
483477   }
484   if (text_cursor && (text_cursorX >= 0 || text_cursorX < 80) && (text_cursorY >= 0 || text_cursorY < 25))
478   if (state->text_cursor && (state->text_cursorX >= 0 || state->text_cursorX < 80) && (state->text_cursorY >= 0 || state->text_cursorY < 25))
485479   {
486      ATTR_TMP(text_cursorX, text_cursorY) |= TX_CUR;
480      ATTR_TMP(state->text_cursorX, state->text_cursorY) |= TX_CUR;
487481   }
488482
489483   /* display draw */
490484   for (y = 0; y < 100; y++)
491485   {
492      ty = y / (100 / text_height);
493      oy = y % (100 / text_height);
486      ty = y / (100 / state->text_height);
487      oy = y % (100 / state->text_height);
494488      for (x = 0; x < 80; x++)
495489      {
496490         /* text */
497         if (text_width == 40)
491         if (state->text_width == 40)
498492            tx = x & (~1);
499493         else
500494            tx = x;
r9683r9684
515509         if (attr_new & TX_BL)
516510         {
517511            attr_new &= ~TX_BL;
518            if ((blink_count / blink_period) & 1)
512            if ((blink_count / state->blink_period) & 1)
519513               attr_new ^= TX_REV;
520514         }
521515
522516         if (attr_new & TX_CUR)
523517         {
524518            attr_new &= ~TX_CUR;
525            switch (cursor_mode)
519            switch (state->cursor_mode)
526520            {
527521            case noblink_underline:
528522               attr_new ^= TX_UL;
529523               break;
530524            case blink_underline:
531               if (blink_count / blink_period)
525               if (blink_count / state->blink_period)
532526                  attr_new ^= TX_UL;
533527               break;
534528            case noblink_block:
535529               attr_new ^= TX_REV;
536530               break;
537531            case blink_block:
538               if (blink_count / blink_period)
532               if (blink_count / state->blink_period)
539533                  attr_new ^= TX_REV;
540534               break;
541535            }
r9683r9684
547541         if ((attr_new & TX_OL) && oy != 0)
548542            attr_new &= ~TX_OL;
549543
550         if (text_invert)
544         if (state->text_invert)
551545            attr_new ^= TX_REV;
552546
553         if (!crtc_on || ((dmac_flag & 0x04) == 0x00) || !text_on)
547         if (!state->crtc_on || ((state->dmac_flag & 0x04) == 0x00) || !state->text_on)
554548         {
555549            text_new = 0;
556550            attr_new = 7 << TX_COL_SHIFT;
557551         }
558         if (text_width == 40)
552         if (state->text_width == 40)
559553         {
560554            if (x & 1)
561555               attr_new |= TX_40R;
r9683r9684
569563
570564         if (text_new != TEXT_OLD(x, y) || attr_new != ATTR_OLD(x, y) || GRP_DIRTY(x, y) || full_refresh)
571565         {
572            plot_box(wbm2, x * 8, y * BLOCK_YSIZE, 8, BLOCK_YSIZE, palette_transparent_pen);
566            plot_box(state->wbm2, x * 8, y * BLOCK_YSIZE, 8, BLOCK_YSIZE, palette_transparent_pen);
573567            ct = ((attr_new & TX_COL_MASK) >> TX_COL_SHIFT) + 8;
574568            TEXT_OLD(x, y) = text_new;
575569            ATTR_OLD(x, y) = attr_new;
r9683r9684
584578               {
585579               case TX_80:
586580                  if (text_new & 0x04)
587                     plot_box(wbm2, x * 8, y * BLOCK_YSIZE, 4, BLOCK_YSIZE, ct);
581                     plot_box(state->wbm2, x * 8, y * BLOCK_YSIZE, 4, BLOCK_YSIZE, ct);
588582                  if (text_new & 0x40)
589                     plot_box(wbm2, x * 8 + 4,y * BLOCK_YSIZE, 4, BLOCK_YSIZE, ct);
583                     plot_box(state->wbm2, x * 8 + 4,y * BLOCK_YSIZE, 4, BLOCK_YSIZE, ct);
590584                  break;
591585               case TX_40L:
592586                  if (text_new & 0x04)
593                     plot_box(wbm2, x * 8, y * BLOCK_YSIZE, 8, BLOCK_YSIZE, ct);
587                     plot_box(state->wbm2, x * 8, y * BLOCK_YSIZE, 8, BLOCK_YSIZE, ct);
594588                  break;
595589               case TX_40R:
596590                  if (text_new & 0x40)
597                     plot_box(wbm2, x * 8, y * BLOCK_YSIZE, 8, BLOCK_YSIZE, ct);
591                     plot_box(state->wbm2, x * 8, y * BLOCK_YSIZE, 8, BLOCK_YSIZE, ct);
598592                  break;
599593               }
600594            }
601595            else
602596            {
603597               /* normal text */
604               drawgfx_transpen(wbm2, NULL, screen->machine->gfx[((attr_new & TX_WID_MASK) >> TX_WID_SHIFT) + (pc8801_is_24KHz ? 3 : 0)], text_new,
598               drawgfx_transpen(state->wbm2, NULL, screen->machine->gfx[((attr_new & TX_WID_MASK) >> TX_WID_SHIFT) + (state->is_24KHz ? 3 : 0)], text_new,
605599               ((attr_new & TX_REV) ? 8 : 0) + ((attr_new & TX_COL_MASK) >> TX_COL_SHIFT), 0, 0, x * 8, y * BLOCK_YSIZE, (attr_new & TX_REV) ? 1 : 0);
606600            }
607601            if (attr_new & TX_UL)
608               plot_box(wbm2, x * 8, y * BLOCK_YSIZE + (pc8801_is_24KHz ? 3 : 1), 8, 1, (attr_new & TX_REV) ? palette_transparent_pen : ct);
602               plot_box(state->wbm2, x * 8, y * BLOCK_YSIZE + (state->is_24KHz ? 3 : 1), 8, 1, (attr_new & TX_REV) ? palette_transparent_pen : ct);
609603
610604            if (attr_new & TX_OL)
611               plot_box(wbm2, x * 8, y * BLOCK_YSIZE, 8, 1, (attr_new & TX_REV) ? palette_transparent_pen : ct);
605               plot_box(state->wbm2, x * 8, y * BLOCK_YSIZE, 8, 1, (attr_new & TX_REV) ? palette_transparent_pen : ct);
612606
613607            /* graphics */
614608            GRP_DIRTY(x, y) = 0;
615            if (pc8801_is_24KHz)
609            if (state->is_24KHz)
616610            {
617               switch (gmode)
611               switch (state->gmode)
618612               {
619613               case GRAPH_200_COL:
620614                  for (gy = 0; gy < 2; gy++)
621615                  {
622616                     for (gx = 0; gx < 8; gx++)
623617                     {
624                        cg = (((gVRAM[0x0000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) >> 7) |
625                           (((gVRAM[0x4000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) >> 6) |
626                           (((gVRAM[0x8000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) >> 5);
627                        pc8801_plot_pixel(wbm1, x * 8 + gx, y * 4 + gy * 2, cg);
628                        pc8801_plot_pixel(wbm1, x * 8 + gx, y * 4 + gy * 2 + 1, 17);
618                        cg = (((state->gVRAM[0x0000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) >> 7) |
619                           (((state->gVRAM[0x4000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) >> 6) |
620                           (((state->gVRAM[0x8000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) >> 5);
621                        pc8801_plot_pixel(state->wbm1, x * 8 + gx, y * 4 + gy * 2, cg);
622                        pc8801_plot_pixel(state->wbm1, x * 8 + gx, y * 4 + gy * 2 + 1, 17);
629623                     }
630624                  }
631625                  break;
r9683r9684
634628                  {
635629                     for (gx = 0; gx < 8; gx++)
636630                     {
637                        cg = (((gVRAM[0x0000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) && disp_plane[0]) ||
638                           (((gVRAM[0x4000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) && disp_plane[1]) ||
639                           (((gVRAM[0x8000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) && disp_plane[2]) ?
631                        cg = (((state->gVRAM[0x0000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) && state->disp_plane[0]) ||
632                           (((state->gVRAM[0x4000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) && state->disp_plane[1]) ||
633                           (((state->gVRAM[0x8000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) && state->disp_plane[2]) ?
640634                           ((attr_new & TX_COL_MASK) >> TX_COL_SHIFT) + 8 : 16;
641                        pc8801_plot_pixel(wbm1, x * 8 + gx, y * 4 + gy * 2, cg);
642                        pc8801_plot_pixel(wbm1, x * 8 + gx, y * 4 + gy * 2 + 1, 17);
635                        pc8801_plot_pixel(state->wbm1, x * 8 + gx, y * 4 + gy * 2, cg);
636                        pc8801_plot_pixel(state->wbm1, x * 8 + gx, y * 4 + gy * 2 + 1, 17);
643637                     }
644638                  }
645639                  break;
r9683r9684
648642                  {
649643                     for (gx = 0; gx < 8; gx++)
650644                     {
651                        cg = ((gVRAM[(y < 50 ? 0x0000 : 0x4000) + x + (y % 50) * 4 * 80 + gy * 80] << gx) & 0x80)
652                           && disp_plane[y < 200 ? 0 : 1] ? ((attr_new&TX_COL_MASK) >> TX_COL_SHIFT) + 8 : 16;
653                        pc8801_plot_pixel(wbm1, x * 8 + gx, y * 4 + gy, cg);
645                        cg = ((state->gVRAM[(y < 50 ? 0x0000 : 0x4000) + x + (y % 50) * 4 * 80 + gy * 80] << gx) & 0x80)
646                           && state->disp_plane[y < 200 ? 0 : 1] ? ((attr_new&TX_COL_MASK) >> TX_COL_SHIFT) + 8 : 16;
647                        pc8801_plot_pixel(state->wbm1, x * 8 + gx, y * 4 + gy, cg);
654648                     }
655649                  }
656650                  break;
657651               case GRAPH_NO:
658652               default:
659                  plot_box(wbm1, x * 8, y * 4, 8, 4, 16);
653                  plot_box(state->wbm1, x * 8, y * 4, 8, 4, 16);
660654                  break;
661655               }
662656            }
663657            else
664658            {
665               switch (gmode)
659               switch (state->gmode)
666660               {
667661               case GRAPH_200_COL:
668662                  for (gy = 0; gy < 2; gy++)
669663                  {
670664                     for (gx = 0; gx < 8; gx++)
671665                     {
672                        cg = (((gVRAM[0x0000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) >> 7) |
673                           (((gVRAM[0x4000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) >> 6) |
674                           (((gVRAM[0x8000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) >> 5);
675                        pc8801_plot_pixel(wbm1, x * 8 + gx, y * 2 + gy, cg);
666                        cg = (((state->gVRAM[0x0000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) >> 7) |
667                           (((state->gVRAM[0x4000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) >> 6) |
668                           (((state->gVRAM[0x8000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) >> 5);
669                        pc8801_plot_pixel(state->wbm1, x * 8 + gx, y * 2 + gy, cg);
676670                     }
677671                  }
678672                  break;
r9683r9684
681675                  {
682676                     for (gx = 0; gx < 8; gx++)
683677                     {
684                        cg = (((gVRAM[0x0000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) && disp_plane[0]) ||
685                           (((gVRAM[0x4000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) && disp_plane[1]) ||
686                           (((gVRAM[0x8000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) && disp_plane[2]) ?
678                        cg = (((state->gVRAM[0x0000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) && state->disp_plane[0]) ||
679                           (((state->gVRAM[0x4000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) && state->disp_plane[1]) ||
680                           (((state->gVRAM[0x8000 + x + y * 2 * 80 + gy * 80] << gx) & 0x80) && state->disp_plane[2]) ?
687681                           ((attr_new & TX_COL_MASK) >> TX_COL_SHIFT) + 8 : 16;
688                        pc8801_plot_pixel(wbm1, x * 8 + gx, y * 2 + gy, cg);
682                        pc8801_plot_pixel(state->wbm1, x * 8 + gx, y * 2 + gy, cg);
689683                     }
690684                  }
691685                  break;
692686               case GRAPH_NO:
693687               default:
694                  plot_box(wbm1, x * 8, y * 2, 8, 2, 16);
688                  plot_box(state->wbm1, x * 8, y * 2, 8, 2, 16);
695689                  break;
696690               }
697691            }
r9683r9684
699693      }
700694   }
701695
702   copyscrollbitmap_trans(wbm1, wbm2, 0, 0, 0, 0, NULL, palette_transparent_pen);
703   copybitmap(bitmap, wbm1, 0, 0, 0, 0, NULL);
696   copyscrollbitmap_trans(state->wbm1, state->wbm2, 0, 0, 0, 0, NULL, palette_transparent_pen);
697   copybitmap(bitmap, state->wbm1, 0, 0, 0, 0, NULL);
704698   return 0;
705699}
706700
r9683r9684
734728
735729WRITE8_HANDLER( pc88_crtc_w )
736730{
731   pc88_state *state = space->machine->driver_data<pc88_state>();
737732   if (offset == 1)
738733   {
739734      /* command */
r9683r9684
741736      {
742737      case 0x00:
743738         /* disp stop / initilize */
744         crtc_on = 0;
745         crtc_state = parameter0;
739         state->crtc_on = 0;
740         state->crtc_state = parameter0;
746741         return;
747742      case 0x20:
748743         /* disp on */
749         crtc_on = 1;
750         text_invert = ((data & 1) != 0x00);
744         state->crtc_on = 1;
745         state->text_invert = ((data & 1) != 0x00);
751746         return;
752747      case 0x40:
753748      /* case 0x43: */
r9683r9684
755750         return;
756751      case 0x60:
757752         /* get light pen point */
758         crtc_state = lpenx;
753         state->crtc_state = lpenx;
759754         return;
760755      case 0x80:
761756         /* set cursor */
762         crtc_state = cursorx;
763         text_cursor = ((data & 1) != 0x00);
757         state->crtc_state = cursorx;
758         state->text_cursor = ((data & 1) != 0x00);
764759         return;
765760      default:
766761         logerror("pc8801: illegal crtc command 0x%.2x.\n", data);
r9683r9684
770765   else
771766   {
772767      /* parameter */
773      switch (crtc_state)
768      switch (state->crtc_state)
774769      {
775770      case parameter0:
776         crtc_state = parameter1;
771         state->crtc_state = parameter1;
777772         if (data == 0xce)
778773            return;
779774         logerror("pc8801: illegal crtc parameter0 0x%.2x.\n", data);
780775         return;
781776
782777      case parameter1:
783         crtc_state = parameter2;
778         state->crtc_state = parameter2;
784779         switch (data & 0xc0)
785780         {
786781         case 0x00:
787            blink_period = 8;
782            state->blink_period = 8;
788783            break;
789784         case 0x40:
790            blink_period = 16;
785            state->blink_period = 16;
791786            break;
792787         case 0x80:
793            blink_period = 24;
788            state->blink_period = 24;
794789            break;
795790         case 0xc0:
796            blink_period = 32;
791            state->blink_period = 32;
797792            break;
798793         }
799794         if ((data & 0x3f) == 0x13)
800795         {
801            text_height = 20;
796            state->text_height = 20;
802797            return;
803798         }
804799         else if ((data & 0x3f) == 0x18)
805800         {
806            text_height = 25;
801            state->text_height = 25;
807802            return;
808803         }
809804         logerror("pc8801: illegal crtc parameter1 0x%.2x.\n", data);
810805         return;
811806
812807      case parameter2:
813         crtc_state = parameter3;
808         state->crtc_state = parameter3;
814809         switch (data & 0x60)
815810         {
816811         case 0x00:
817            cursor_mode = noblink_underline;
812            state->cursor_mode = noblink_underline;
818813            break;
819814         case 0x20:
820            cursor_mode = blink_underline;
815            state->cursor_mode = blink_underline;
821816            break;
822817         case 0x40:
823            cursor_mode = noblink_block;
818            state->cursor_mode = noblink_block;
824819            break;
825820         case 0x60:
826            cursor_mode = blink_block;
821            state->cursor_mode = blink_block;
827822            break;
828823         }
829         if (!pc8801_is_24KHz && (data & 0x9f) == 0x09 && text_height == 20)
824         if (!state->is_24KHz && (data & 0x9f) == 0x09 && state->text_height == 20)
830825            return;
831         else if (!pc8801_is_24KHz && (data & 0x9f) == 0x07 && text_height == 25)
826         else if (!state->is_24KHz && (data & 0x9f) == 0x07 && state->text_height == 25)
832827            return;
833         else if (pc8801_is_24KHz && (data & 0x9f) == 0x13 && text_height == 20)
828         else if (state->is_24KHz && (data & 0x9f) == 0x13 && state->text_height == 20)
834829            return;
835         else if (pc8801_is_24KHz && (data & 0x9f) == 0x0f && text_height == 25)
830         else if (state->is_24KHz && (data & 0x9f) == 0x0f && state->text_height == 25)
836831            return;
837832         logerror("pc8801: illegal crtc parameter2 0x%.2x.\n", data);
838833         return;
839834
840835      case parameter3:
841         crtc_state = parameter4;
842         if (!pc8801_is_24KHz && data == 0xbe && text_height == 20)
836         state->crtc_state = parameter4;
837         if (!state->is_24KHz && data == 0xbe && state->text_height == 20)
843838            return;
844         else if (!pc8801_is_24KHz && data == 0xde && text_height == 25)
839         else if (!state->is_24KHz && data == 0xde && state->text_height == 25)
845840            return;
846         else if (pc8801_is_24KHz && data == 0x38 && text_height == 20)
841         else if (state->is_24KHz && data == 0x38 && state->text_height == 20)
847842            return;
848         else if (pc8801_is_24KHz && data == 0x58 && text_height == 25)
843         else if (state->is_24KHz && data == 0x58 && state->text_height == 25)
849844            return;
850845         logerror("pc8801: illegal crtc parameter3 0x%.2x.\n", data);
851846         return;
852847
853848      case parameter4:
854         crtc_state = other;
849         state->crtc_state = other;
855850         if (data == 0x13)
856851         {
857            text_color = 0;
852            state->text_color = 0;
858853            return;
859854         }
860855         else if (data == 0x53)
861856         {
862            text_color = 1;
857            state->text_color = 1;
863858            return;
864859         }
865860         logerror("pc8801: illegal crtc parameter4 0x%.2x.\n", data);
866861         return;
867862
868863      case cursorx:
869         crtc_state = cursory;
870         text_cursorX = data;
864         state->crtc_state = cursory;
865         state->text_cursorX = data;
871866         return;
872867
873868      case cursory:
874         crtc_state = other;
875         text_cursorY = data;
869         state->crtc_state = other;
870         state->text_cursorY = data;
876871         return;
877872
878873      default:
r9683r9684
884879
885880READ8_HANDLER( pc88_crtc_r )
886881{
882   pc88_state *state = space->machine->driver_data<pc88_state>();
887883   if (offset == 0)
888884   {
889885      /* light pen point */
890      switch (crtc_state)
886      switch (state->crtc_state)
891887      {
892888      case lpenx:
893         crtc_state = lpeny;
889         state->crtc_state = lpeny;
894890         return 0xff;
895891      case lpeny:
896         crtc_state = other;
892         state->crtc_state = other;
897893         return 0xff;
898894      default:
899895         logerror("pc8801:illegal light pen read\n");
r9683r9684
903899   else
904900   {
905901      /* status */
906      return crtc_on ? 0x10 : 0x00;
902      return state->crtc_on ? 0x10 : 0x00;
907903   }
908904}
909905
910906WRITE8_HANDLER( pc88_dmac_w )
911907{
908   pc88_state *state = space->machine->driver_data<pc88_state>();
912909   switch (offset)
913910   {
914911   case 8:
915      dmac_fl = 0;
916      dmac_flag = data;
912      state->dmac_fl = 0;
913      state->dmac_flag = data;
917914      return;
918915   case 1:
919916   case 3:
920917   case 5:
921918   case 7:
922      if (dmac_fl == 0)
919      if (state->dmac_fl == 0)
923920      {
924         dmac_fl = 1;
925         dmac_size[offset / 2] = (dmac_size[offset / 2] & 0xff00) | (data & 0x00ff);
921         state->dmac_fl = 1;
922         state->dmac_size[offset / 2] = (state->dmac_size[offset / 2] & 0xff00) | (data & 0x00ff);
926923         return;
927924      }
928925      else
929926      {
930         dmac_fl = 0;
931         dmac_size[offset / 2] = (dmac_size[offset / 2] & 0x00ff) | ((data << 8) & 0xff00);
927         state->dmac_fl = 0;
928         state->dmac_size[offset / 2] = (state->dmac_size[offset / 2] & 0x00ff) | ((data << 8) & 0xff00);
932929         return;
933930      }
934931   case 0:
935932   case 2:
936933   case 4:
937934   case 6:
938      if (dmac_fl == 0)
935      if (state->dmac_fl == 0)
939936      {
940         dmac_fl = 1;
941         dmac_addr[offset / 2] = (dmac_addr[offset / 2] & 0xff00) | (data & 0x00ff);
937         state->dmac_fl = 1;
938         state->dmac_addr[offset / 2] = (state->dmac_addr[offset / 2] & 0xff00) | (data & 0x00ff);
942939         return;
943940      }
944941      else
945942      {
946         dmac_fl = 0;
947         dmac_addr[offset / 2] = (dmac_addr[offset / 2] & 0x00ff) | ((data << 8) & 0xff00);
943         state->dmac_fl = 0;
944         state->dmac_addr[offset / 2] = (state->dmac_addr[offset / 2] & 0x00ff) | ((data << 8) & 0xff00);
948945         return;
949946      }
950947   }
r9683r9684
952949
953950READ8_HANDLER( pc88_dmac_r )
954951{
952   pc88_state *state = space->machine->driver_data<pc88_state>();
955953   switch (offset)
956954   {
957955   case 8:
958      return dmac_status;
956      return state->dmac_status;
959957   case 1:
960958   case 3:
961959   case 5:
962960   case 7:
963      if (dmac_fl == 0)
961      if (state->dmac_fl == 0)
964962      {
965         dmac_fl = 1;
966         return (dmac_size[offset / 2] & 0x00ff);
963         state->dmac_fl = 1;
964         return (state->dmac_size[offset / 2] & 0x00ff);
967965      }
968966      else
969967      {
970         dmac_fl = 0;
971         return ((dmac_size[offset / 2] >> 8) & 0x00ff);
968         state->dmac_fl = 0;
969         return ((state->dmac_size[offset / 2] >> 8) & 0x00ff);
972970      }
973971   case 0:
974972   case 2:
975973   case 4:
976974   case 6:
977      if (dmac_fl == 0)
975      if (state->dmac_fl == 0)
978976      {
979         dmac_fl = 1;
980         return (dmac_addr[offset / 2] & 0x00ff);
977         state->dmac_fl = 1;
978         return (state->dmac_addr[offset / 2] & 0x00ff);
981979      }
982980      else
983981      {
984         dmac_fl = 0;
985         return ((dmac_addr[offset / 2] >> 8) & 0x00ff);
982         state->dmac_fl = 0;
983         return ((state->dmac_addr[offset / 2] >> 8) & 0x00ff);
986984      }
987985   }
988986   return 0;
r9683r9684
990988
991989WRITE8_HANDLER( pc88sr_disp_30 )
992990{
993   text_width = ((data & 0x01) == 0x00) ? 40 : 80;
991   pc88_state *state = space->machine->driver_data<pc88_state>();
992   state->text_width = ((data & 0x01) == 0x00) ? 40 : 80;
994993}
995994
996995WRITE8_HANDLER( pc88sr_disp_31 )
997996{
997   pc88_state *state = space->machine->driver_data<pc88_state>();
998998   int gmode_new = GRAPH_NO;
999999
10001000   switch (data & 0x19)
r9683r9684
10061006      gmode_new = GRAPH_NO;
10071007      break;
10081008   case 0x08:
1009      gmode_new = pc8801_is_24KHz ? GRAPH_400_BW : GRAPH_200_BW;
1009      gmode_new = state->is_24KHz ? GRAPH_400_BW : GRAPH_200_BW;
10101010      break;
10111011   case 0x09:
10121012      gmode_new = GRAPH_200_BW;
r9683r9684
10171017      break;
10181018   }
10191019
1020   if (gmode != gmode_new)
1021      gmode = gmode_new;
1020   if (state->gmode != gmode_new)
1021      state->gmode = gmode_new;
10221022}
10231023
10241024WRITE8_HANDLER(pc88_palette_w)
10251025{
1026   pc88_state *state = space->machine->driver_data<pc88_state>();
10261027   int palno;
10271028   int i;
10281029   static int r[10],g[10],b[10];
r9683r9684
10311032      palno = 16;
10321033   else if (offset == 1)
10331034   {
1034      text_on = (data & 1) == 0x00;
1035      state->text_on = (data & 1) == 0x00;
10351036
10361037      for (i = 0; i < 3; i++)
10371038      {
1038         if (disp_plane[i] != ((data & (2 << i)) == 0x00))
1039            disp_plane[i] = (data & (2<<i)) == 0x00;
1039         if (state->disp_plane[i] != ((data & (2 << i)) == 0x00))
1040            state->disp_plane[i] = (data & (2<<i)) == 0x00;
10401041      }
10411042      return;
10421043   }
10431044   else
10441045      palno = offset - 2;
10451046
1046   if (analog_palette)
1047   if (state->analog_palette)
10471048   {
10481049      if ((data & 0x40) == 0x00)
10491050      {
src/mess/video/pegasus.c
r9683r9684
192192
193193VIDEO_UPDATE( pegasus )
194194{
195   pegasus_state *state = screen->machine->driver_data<pegasus_state>();
195196   UINT16 addr,xpos,x,y;
196197   UINT8 b,j,l,code,inv;
197198   UINT8 *FNT = memory_region(screen->machine, "pcg");
198   UINT8 pcg_mode = pegasus_control_bits & 2;
199   UINT8 pcg_mode = state->control_bits & 2;
199200
200201   for(y = 0; y < 16; y++ )
201202   {
r9683r9684
203204      xpos = 0;
204205      for(x = 0; x < 32; x++ )
205206      {
206         code = pegasus_video_ram[addr|x];
207         code = state->video_ram[addr|x];
207208         inv = (code >> 7) ^ 1;
208209         for(j = 0; j < 16; j++ )
209210         {
src/mess/video/pp01.c
r9683r9684
1717
1818VIDEO_UPDATE( pp01 )
1919{
20   pp01_state *state = screen->machine->driver_data<pp01_state>();
2021    UINT8 code_r,code_g,code_b;
2122    UINT8 col;
2223    int y, x, b;
r9683r9684
2526    {
2627       for (x = 0; x < 32; x++)
2728       {
28            code_r = messram_get_ptr(screen->machine->device("messram"))[0x6000 + ((y+pp01_video_scroll)&0xff)*32 + x];
29            code_g = messram_get_ptr(screen->machine->device("messram"))[0xa000 + ((y+pp01_video_scroll)&0xff)*32 + x];
30            code_b = messram_get_ptr(screen->machine->device("messram"))[0xe000 + ((y+pp01_video_scroll)&0xff)*32 + x];
29            code_r = messram_get_ptr(screen->machine->device("messram"))[0x6000 + ((y+state->video_scroll)&0xff)*32 + x];
30            code_g = messram_get_ptr(screen->machine->device("messram"))[0xa000 + ((y+state->video_scroll)&0xff)*32 + x];
31            code_b = messram_get_ptr(screen->machine->device("messram"))[0xe000 + ((y+state->video_scroll)&0xff)*32 + x];
3132            for (b = 0; b < 8; b++)
3233            {
3334                col = (((code_r >> b) & 0x01) ? 4 : 0) + (((code_g >> b) & 0x01) ? 2 : 0) + (((code_b >> b) & 0x01) ? 1 : 0);
src/mess/video/pk8020.c
r9683r9684
1616
1717VIDEO_UPDATE( pk8020 )
1818{
19   pk8020_state *state = screen->machine->driver_data<pk8020_state>();
1920   int y, x, b, j;
2021   UINT8 *gfx = memory_region(screen->machine, "gfx1");
2122
r9683r9684
2627         UINT8 chr = messram_get_ptr(screen->machine->device("messram"))[x +(y*64) + 0x40000];
2728         UINT8 attr= messram_get_ptr(screen->machine->device("messram"))[x +(y*64) + 0x40400];
2829         for (j = 0; j < 16; j++) {
29            UINT32 addr = 0x10000 + x + ((y*16+j)*64) + (pk8020_video_page * 0xC000);
30            UINT32 addr = 0x10000 + x + ((y*16+j)*64) + (state->video_page * 0xC000);
3031            UINT8 code1 = messram_get_ptr(screen->machine->device("messram"))[addr];
3132            UINT8 code2 = messram_get_ptr(screen->machine->device("messram"))[addr + 0x4000];
3233            UINT8 code3 = messram_get_ptr(screen->machine->device("messram"))[addr + 0x8000];
33            UINT8 code4 = gfx[((chr<<4) + j) + (pk8020_font*0x1000)];
34            if(attr) code4 ^= 0xff;
34            UINT8 code4 = gfx[((chr<<4) + j) + (state->font*0x1000)];
35            if (attr) code4 ^= 0xff;
3536            for (b = 0; b < 8; b++)
3637            {
3738               UINT8 col = (((code4 >> b) & 0x01) ? 0x08 : 0x00);
src/mess/includes/mz700.h
r9683r9684
4747   int screen;          /* screen designation */
4848   UINT8 *colorram;
4949   UINT8 *videoram;
50   UINT8 speaker_level;
51   UINT8 prev_state;
52   UINT16 mz800_ramaddr;
53   UINT8 mz800_palette[4];
54   UINT8 mz800_palette_bank;
5055};
5156
5257
src/mess/includes/sym1.h
r9683r9684
2020#define SYM1_CLOCK  XTAL_1MHz
2121
2222
23class sym1_state : public driver_device
24{
25public:
26   sym1_state(running_machine &machine, const driver_device_config_base &config)
27      : driver_device(machine, config) { }
28
29   UINT8 *ram_1k;
30   UINT8 *ram_2k;
31   UINT8 *ram_3k;
32   UINT8 *riot_ram;
33   UINT8 *monitor;
34   UINT8 riot_port_a;
35   UINT8 riot_port_b;
36   emu_timer *led_update;
37};
38
39
2340/*----------- defined in drivers/sym1.c -----------*/
2441
2542/* Pointer to the monitor ROM, which includes the reset vectors for the CPU */
26extern UINT8 *sym1_monitor;
2743
2844
2945/*----------- defined in machine/sym1.c -----------*/
src/mess/includes/pmd85.h
r9683r9684
99
1010#include "machine/i8255a.h"
1111
12class pmd85_state : public driver_device
13{
14public:
15   pmd85_state(running_machine &machine, const driver_device_config_base &config)
16      : driver_device(machine, config) { }
17
18   UINT8 rom_module_present;
19   UINT8 ppi_port_outputs[4][3];
20   UINT8 startup_mem_map;
21   UINT8 pmd853_memory_mapping;
22   int previous_level;
23   int clk_level;
24   int clk_level_tape;
25   UINT8 model;
26   emu_timer * cassette_timer;
27};
28
29
1230/*----------- defined in machine/pmd85.c -----------*/
1331
1432extern const struct pit8253_config pmd85_pit8253_interface;
src/mess/includes/pc8801.h
r9683r9684
3737   running_device *upd1990a;
3838   running_device *cassette;
3939   running_device *centronics;
40   unsigned char *mainRAM;
41   int pc88sr_is_highspeed;
42   unsigned char *pc88sr_textRAM;
43   int is_24KHz;
44   int ROMmode;
45   int RAMmode;
46   int maptvram;
47   int no4throm;
48   int no4throm2;
49   int port71_save;
50   unsigned char *mainROM;
51   int is_V2mode;
52   int is_Nbasic;
53   int is_8MHz;
54   int port32_save;
55   int text_window;
56   int extmem_mode;
57   UINT8 *extRAM;
58   int extRAM_size;
59   void *ext_bank_80[4];
60   void *ext_bank_88[256];
61   UINT8 extmem_ctrl[2];
62   int use_5FD;
63   int enable_FM_IRQ;
64   int FM_IRQ_save;
65   int interrupt_level_reg;
66   int interrupt_mask_reg;
67   int interrupt_trig_reg;
68   unsigned char *gVRAM;
69   int selected_vram;
70   int crtc_on;
71   int text_on;
72   int text_width;
73   int text_height;
74   int text_invert;
75   int text_color;
76   int text_cursor;
77   int text_cursorX;
78   int text_cursorY;
79   int blink_period;
80   int analog_palette;
81   int alu_1;
82   int alu_2;
83   int alu_on;
84   unsigned char alu_save0;
85   unsigned char alu_save1;
86   unsigned char alu_save2;
87   int dmac_fl;
88   UINT16 dmac_addr[3];
89   UINT16 dmac_size[3];
90   UINT8 dmac_flag;
91   UINT8 dmac_status;
92   int cursor_mode;
93   int crtc_state;
94   int gmode;
95   int disp_plane[3];
96   char *graph_dirty;
97   unsigned short *attr_tmp;
98   unsigned short *attr_old;
99   unsigned short *text_old;
100   bitmap_t *wbm1;
101   bitmap_t *wbm2;
40102};
41103
42104/*----------- defined in machine/pc8801.c -----------*/
r9683r9684
60122READ8_HANDLER(pc88sr_inport_71);
61123WRITE8_HANDLER(pc88sr_outport_71);
62124
63extern INTERRUPT_GEN( pc8801_interrupt );
64extern MACHINE_START( pc88srl );
65extern MACHINE_START( pc88srh );
66extern MACHINE_RESET( pc88srl );
67extern MACHINE_RESET( pc88srh );
125INTERRUPT_GEN( pc8801_interrupt );
126MACHINE_START( pc88srl );
127MACHINE_START( pc88srh );
128MACHINE_RESET( pc88srl );
129MACHINE_RESET( pc88srh );
68130
69131void pc8801_update_bank(running_machine *machine);
70extern unsigned char *pc8801_mainRAM;
71extern int pc88sr_is_highspeed;
72132READ8_HANDLER(pc8801fd_upd765_tc);
73133void pc88sr_sound_interupt(running_device *device, int irq);
74134WRITE8_HANDLER(pc88_kanji_w);
r9683r9684
85145int pc8801_is_vram_select(running_machine *machine);
86146WRITE8_HANDLER(pc88_vramsel_w);
87147 READ8_HANDLER(pc88_vramtest_r);
88extern unsigned char *pc88sr_textRAM;
148VIDEO_START( pc8801 );
149VIDEO_UPDATE( pc8801 );
150PALETTE_INIT( pc8801 );
89151
90extern VIDEO_START( pc8801 );
91extern VIDEO_UPDATE( pc8801 );
92extern PALETTE_INIT( pc8801 );
93
94extern int pc8801_is_24KHz;
95152WRITE8_HANDLER(pc88_crtc_w);
96153 READ8_HANDLER(pc88_crtc_r);
97154WRITE8_HANDLER(pc88_dmac_w);
src/mess/includes/partner.h
r9683r9684
1111#include "machine/i8257.h"
1212#include "machine/wd17xx.h"
1313
14class partner_state : public driver_device
15{
16public:
17   partner_state(running_machine &machine, const driver_device_config_base &config)
18      : driver_device(machine, config) { }
19
20   UINT8 mem_page;
21   UINT8 win_mem_page;
22};
23
24
1425/*----------- defined in machine/partner.c -----------*/
1526
1627extern DRIVER_INIT( partner );
src/mess/includes/pegasus.h
r9683r9684
1/*----------- defined in drivers/pegasus.c -----------*/
1class pegasus_state : public driver_device
2{
3public:
4   pegasus_state(running_machine &machine, const driver_device_config_base &config)
5      : driver_device(machine, config) { }
26
3extern UINT8 pegasus_control_bits;
7   UINT8 kbd_row;
8   UINT8 kbd_irq;
9   running_device *cass;
10   UINT8 *FNT;
11   UINT8 control_bits;
12   UINT8 *video_ram;
13};
414
515
616/*----------- defined in video/pegasus.c -----------*/
717
8extern UINT8 *pegasus_video_ram;
9
1018VIDEO_UPDATE( pegasus );
src/mess/includes/pp01.h
r9683r9684
1010#include "machine/pit8253.h"
1111#include "machine/i8255a.h"
1212
13class pp01_state : public driver_device
14{
15public:
16   pp01_state(running_machine &machine, const driver_device_config_base &config)
17      : driver_device(machine, config) { }
18
19   UINT8 video_scroll;
20   UINT8 memory_block[16];
21   UINT8 video_write_mode;
22   UINT8 key_line;
23};
24
25
1326/*----------- defined in machine/pp01.c -----------*/
1427extern const struct pit8253_config pp01_pit8253_intf;
1528extern const i8255a_interface pp01_ppi8255_interface;
16extern UINT8 pp01_video_scroll;
1729extern MACHINE_START( pp01 );
1830extern MACHINE_RESET( pp01 );
1931extern WRITE8_HANDLER (pp01_mem_block_w);
src/mess/includes/svi318.h
r9683r9684
1313#include "machine/ins8250.h"
1414#include "machine/wd17xx.h"
1515
16typedef struct
17{
18   /* general */
19   UINT8   svi318;      /* Are we dealing with an SVI-318 or a SVI-328 model. 0 = 328, 1 = 318 */
20   /* memory */
21   UINT8   *empty_bank;
22   UINT8   bank_switch;
23   UINT8   bankLow;
24   UINT8   bankHigh1;
25   UINT8   *bankLow_ptr;
26   UINT8   bankLow_read_only;
27   UINT8   *bankHigh1_ptr;
28   UINT8   bankHigh1_read_only;
29   UINT8   *bankHigh2_ptr;
30   UINT8   bankHigh2_read_only;
31   /* keyboard */
32   UINT8   keyboard_row;
33   /* SVI-806 80 column card */
34   UINT8   svi806_present;
35   UINT8   svi806_ram_enabled;
36   region_info   *svi806_ram;
37   UINT8   *svi806_gfx;
38} SVI_318;
39
40typedef struct
41{
42   UINT8 driveselect;
43   int drq;
44   int irq;
45   UINT8 heads[2];
46} SVI318_FDC_STRUCT;
47
48
49class svi318_state : public driver_device
50{
51public:
52   svi318_state(running_machine &machine, const driver_device_config_base &config)
53      : driver_device(machine, config) { }
54
55   SVI_318 svi;
56   UINT8 *pcart;
57   UINT32 pcart_rom_size;
58   SVI318_FDC_STRUCT fdc;
59};
60
61
1662/*----------- defined in machine/svi318.c -----------*/
1763
1864extern const i8255a_interface svi318_ppi8255_interface;
src/mess/includes/pk8020.h
r9683r9684
1515#include "sound/speaker.h"
1616#include "sound/wave.h"
1717
18class pk8020_state : public driver_device
19{
20public:
21   pk8020_state(running_machine &machine, const driver_device_config_base &config)
22      : driver_device(machine, config) { }
23
24   UINT8 color;
25   UINT8 video_page;
26   UINT8 wide;
27   UINT8 font;
28   UINT8 attr;
29   UINT8 text_attr;
30   UINT8 takt;
31   UINT8 video_page_access;
32   UINT8 portc_data;
33   UINT8 sound_gate;
34   UINT8 sound_level;
35};
36
37
1838/*----------- defined in machine/pk8020.c -----------*/
19extern UINT8 pk8020_color;
20extern UINT8 pk8020_video_page;
21extern UINT8 pk8020_wide;
22extern UINT8 pk8020_font;
2339extern MACHINE_RESET( pk8020 );
2440extern const i8255a_interface pk8020_ppi8255_interface_1;
2541extern const i8255a_interface pk8020_ppi8255_interface_2;
src/mess/drivers/mk1.c
r9683r9684
4545#include "machine/f3853.h"
4646#include "mk1.lh"
4747
48
49class mk1_state : public driver_device
50{
51public:
52   mk1_state(running_machine &machine, const driver_device_config_base &config)
53      : driver_device(machine, config) { }
54
55   UINT8 f8[2];
56   UINT8 led[4];
57};
58
59
4860#define MAIN_CLOCK   1000000
4961
50static UINT8 mk1_f8[2];
51static UINT8 mk1_led[4];
5262
5363static READ8_HANDLER( mk1_f8_r ) {
54    UINT8 data = mk1_f8[offset];
64   mk1_state *state = space->machine->driver_data<mk1_state>();
65    UINT8 data = state->f8[offset];
5566
5667    if ( offset == 0 ) {
5768      if ( data & 1 ) data |= input_port_read(space->machine, "LINE1");
r9683r9684
8798}
8899
89100static WRITE8_HANDLER( mk1_f8_w ) {
101   mk1_state *state = space->machine->driver_data<mk1_state>();
90102   /* 0 is high and allows also input */
91   mk1_f8[offset] = data;
103   state->f8[offset] = data;
92104
93   if ( ! ( mk1_f8[1] & 1 ) ) mk1_led[0] = BITSWAP8( mk1_f8[0],2,1,3,4,5,6,7,0 );
94   if ( ! ( mk1_f8[1] & 2 ) ) mk1_led[1] = BITSWAP8( mk1_f8[0],2,1,3,4,5,6,7,0 );
95   if ( ! ( mk1_f8[1] & 4 ) ) mk1_led[2] = BITSWAP8( mk1_f8[0],2,1,3,4,5,6,7,0 );
96   if ( ! ( mk1_f8[1] & 8 ) ) mk1_led[3] = BITSWAP8( mk1_f8[0],2,1,3,4,5,6,7,0 );
105   if ( ! ( state->f8[1] & 1 ) ) state->led[0] = BITSWAP8( state->f8[0],2,1,3,4,5,6,7,0 );
106   if ( ! ( state->f8[1] & 2 ) ) state->led[1] = BITSWAP8( state->f8[0],2,1,3,4,5,6,7,0 );
107   if ( ! ( state->f8[1] & 4 ) ) state->led[2] = BITSWAP8( state->f8[0],2,1,3,4,5,6,7,0 );
108   if ( ! ( state->f8[1] & 8 ) ) state->led[3] = BITSWAP8( state->f8[0],2,1,3,4,5,6,7,0 );
97109}
98110
99111static ADDRESS_MAP_START( mk1_mem, ADDRESS_SPACE_PROGRAM, 8 )
r9683r9684
146158
147159static TIMER_CALLBACK( mk1_update_leds )
148160{
161   mk1_state *state = machine->driver_data<mk1_state>();
149162   int i;
150163
151164   for ( i = 0; i < 4; i++ ) {
152      output_set_digit_value( i, mk1_led[i] >> 1 );
153      output_set_led_value( i, mk1_led[i] & 0x01 );
154      mk1_led[i] = 0;
165      output_set_digit_value( i, state->led[i] >> 1 );
166      output_set_led_value( i, state->led[i] & 0x01 );
167      state->led[i] = 0;
155168   }
156169}
157170
r9683r9684
176189};
177190
178191
179static MACHINE_CONFIG_START( mk1, driver_device )
192static MACHINE_CONFIG_START( mk1, mk1_state )
180193   /* basic machine hardware */
181194   MDRV_CPU_ADD( "maincpu", F8, MAIN_CLOCK )        /* MK3850 */
182195   MDRV_CPU_PROGRAM_MAP( mk1_mem)
src/mess/drivers/sgi_ip6.c
r9683r9684
1616#include "emu.h"
1717#include "cpu/mips/r3000.h"
1818
19
20typedef struct
21{
22   UINT16 unknown_half_0;
23   UINT8 unknown_byte_0;
24   UINT8 unknown_byte_1;
25} ip6_regs_t;
26
27class sgi_ip6_state : public driver_device
28{
29public:
30   sgi_ip6_state(running_machine &machine, const driver_device_config_base &config)
31      : driver_device(machine, config) { }
32
33   ip6_regs_t ip6_regs;
34};
35
36
1937#define VERBOSE_LEVEL ( 0 )
2038
2139#define ENABLE_VERBOSE_LOG (1)
r9683r9684
5472    MACHINE FUNCTIONS
5573***************************************************************************/
5674
57typedef struct
58{
59   UINT16 unknown_half_0;
60   UINT8 unknown_byte_0;
61   UINT8 unknown_byte_1;
62} ip6_regs_t;
6375
64static ip6_regs_t ip6_regs;
65
6676static READ32_HANDLER( ip6_unk1_r )
6777{
78   sgi_ip6_state *state = space->machine->driver_data<sgi_ip6_state>();
6879   UINT32 ret = 0;
6980   switch(offset)
7081   {
r9683r9684
7586         }
7687         if(ACCESSING_BITS_0_15)
7788         {
78            verboselog(space->machine, 0, "ip6_unk1_r: Unknown Halfword 0: %08x & %08x\n", ip6_regs.unknown_half_0, mem_mask );
79            ret |= ip6_regs.unknown_half_0;
89            verboselog(space->machine, 0, "ip6_unk1_r: Unknown Halfword 0: %08x & %08x\n", state->ip6_regs.unknown_half_0, mem_mask );
90            ret |= state->ip6_regs.unknown_half_0;
8091         }
8192         break;
8293      default:
r9683r9684
8899
89100static WRITE32_HANDLER( ip6_unk1_w )
90101{
102   sgi_ip6_state *state = space->machine->driver_data<sgi_ip6_state>();
91103   switch(offset)
92104   {
93105      case 0x0000/4:
r9683r9684
98110         if(ACCESSING_BITS_0_15)
99111         {
100112            verboselog(space->machine, 0, "ip6_unk1_w: Unknown Halfword 0 = %04x & %04x\n", data & 0x0000ffff, mem_mask & 0x0000ffff );
101            ip6_regs.unknown_half_0 = data & 0x0000ffff;
113            state->ip6_regs.unknown_half_0 = data & 0x0000ffff;
102114         }
103115         break;
104116      default:
r9683r9684
109121
110122static READ32_HANDLER( ip6_unk2_r )
111123{
124   sgi_ip6_state *state = space->machine->driver_data<sgi_ip6_state>();
112125   UINT32 ret = 0;
113126   switch(offset)
114127   {
r9683r9684
119132         }
120133         if(ACCESSING_BITS_24_31)
121134         {
122            verboselog(space->machine, 0, "ip6_unk2_r: Unknown Byte 0 = %02x & %02x\n", ip6_regs.unknown_byte_0, mem_mask >> 24 );
123            ret |= ip6_regs.unknown_byte_0 << 24;
135            verboselog(space->machine, 0, "ip6_unk2_r: Unknown Byte 0 = %02x & %02x\n", state->ip6_regs.unknown_byte_0, mem_mask >> 24 );
136            ret |= state->ip6_regs.unknown_byte_0 << 24;
124137         }
125138         break;
126139      default:
r9683r9684
132145
133146static WRITE32_HANDLER( ip6_unk2_w )
134147{
148   sgi_ip6_state *state = space->machine->driver_data<sgi_ip6_state>();
135149   switch(offset)
136150   {
137151      case 0x0000/4:
r9683r9684
142156         if(ACCESSING_BITS_24_31)
143157         {
144158            verboselog(space->machine, 0, "ip6_unk2_w: Unknown Byte 0 = %02x & %02x\n", data >> 24, mem_mask >> 24 );
145            ip6_regs.unknown_byte_0 = (data & 0xff000000) >> 24;
159            state->ip6_regs.unknown_byte_0 = (data & 0xff000000) >> 24;
146160         }
147161         break;
148162      default:
r9683r9684
153167
154168static READ32_HANDLER(ip6_unk3_r)
155169{
170   sgi_ip6_state *state = space->machine->driver_data<sgi_ip6_state>();
156171   UINT32 ret = 0;
157172   if(ACCESSING_BITS_16_23)
158173   {
159      verboselog(space->machine, 0, "ip6_unk3_r: Unknown Byte 1: %02x & %02x\n", ip6_regs.unknown_byte_1, (mem_mask >> 16) & 0x000000ff);
160      ret |= ip6_regs.unknown_byte_1 << 16;
174      verboselog(space->machine, 0, "ip6_unk3_r: Unknown Byte 1: %02x & %02x\n", state->ip6_regs.unknown_byte_1, (mem_mask >> 16) & 0x000000ff);
175      ret |= state->ip6_regs.unknown_byte_1 << 16;
161176   }
162177   else
163178   {
r9683r9684
181196
182197static MACHINE_RESET( sgi_ip6 )
183198{
184   ip6_regs.unknown_byte_0 = 0x80;
185   ip6_regs.unknown_byte_1 = 0x80;
186   ip6_regs.unknown_half_0 = 0;
199   sgi_ip6_state *state = machine->driver_data<sgi_ip6_state>();
200   state->ip6_regs.unknown_byte_0 = 0x80;
201   state->ip6_regs.unknown_byte_1 = 0x80;
202   state->ip6_regs.unknown_half_0 = 0;
187203}
188204
189205/***************************************************************************
r9683r9684
208224   4096   /* data cache size */
209225};
210226
211static MACHINE_CONFIG_START( sgi_ip6, driver_device )
227static MACHINE_CONFIG_START( sgi_ip6, sgi_ip6_state )
212228   MDRV_CPU_ADD( "maincpu", R3000BE, 20000000 ) // FIXME: Should be R2000
213229   MDRV_CPU_CONFIG( config )
214230   MDRV_CPU_PROGRAM_MAP( sgi_ip6_map )
src/mess/drivers/kim1.c
r9683r9684
8888#include "kim1.lh"
8989
9090
91static UINT8      kim1_u2_port_b;
92static UINT8      kim1_311_output;
93static UINT32      kim1_cassette_high_count;
94static UINT8      kim1_led_time[6];
91class kim1_state : public driver_device
92{
93public:
94   kim1_state(running_machine &machine, const driver_device_config_base &config)
95      : driver_device(machine, config) { }
9596
97   UINT8 u2_port_b;
98   UINT8 _311_output;
99   UINT32 cassette_high_count;
100   UINT8 led_time[6];
101};
96102
103
104
105
106
97107static ADDRESS_MAP_START ( kim1_map , ADDRESS_SPACE_PROGRAM, 8)
98108   AM_RANGE(0x0000, 0x03ff) AM_MIRROR(0xe000) AM_RAM
99109   AM_RANGE(0x1700, 0x173f) AM_MIRROR(0xe000) AM_DEVREADWRITE("miot_u3", mos6530_r, mos6530_w )
r9683r9684
159169
160170static READ8_DEVICE_HANDLER( kim1_u2_read_a )
161171{
172   kim1_state *state = device->machine->driver_data<kim1_state>();
162173   UINT8   data = 0xff;
163174
164   switch( ( kim1_u2_port_b >> 1 ) & 0x0f )
175   switch( ( state->u2_port_b >> 1 ) & 0x0f )
165176   {
166177   case 0:
167178      data = input_port_read(device->machine, "LINE0");
r9683r9684
179190
180191static WRITE8_DEVICE_HANDLER( kim1_u2_write_a )
181192{
182   UINT8 idx = ( kim1_u2_port_b >> 1 ) & 0x0f;
193   kim1_state *state = device->machine->driver_data<kim1_state>();
194   UINT8 idx = ( state->u2_port_b >> 1 ) & 0x0f;
183195
184196   if ( idx >= 4 && idx < 10 )
185197   {
186198      if ( data & 0x80 )
187199      {
188200         output_set_digit_value( idx-4, data & 0x7f );
189         kim1_led_time[idx - 4] = 15;
201         state->led_time[idx - 4] = 15;
190202      }
191203   }
192204}
193205
194206static READ8_DEVICE_HANDLER( kim1_u2_read_b )
195207{
208   kim1_state *state = device->machine->driver_data<kim1_state>();
196209   if ( mos6530_portb_out_get(device) & 0x20 )
197210      return 0xFF;
198211
199   return 0x7F | ( kim1_311_output ^ 0x80 );
212   return 0x7F | ( state->_311_output ^ 0x80 );
200213}
201214
202215
203216static WRITE8_DEVICE_HANDLER( kim1_u2_write_b )
204217{
205   kim1_u2_port_b = data;
218   kim1_state *state = device->machine->driver_data<kim1_state>();
219   state->u2_port_b = data;
206220
207221   if ( data & 0x20 )
208222   {
r9683r9684
233247
234248static TIMER_CALLBACK( kim1_cassette_input )
235249{
250   kim1_state *state = machine->driver_data<kim1_state>();
236251   double tap_val = cassette_input( machine->device("cassette") );
237252
238253   if ( tap_val <= 0 )
239254   {
240      if ( kim1_cassette_high_count )
255      if ( state->cassette_high_count )
241256      {
242         kim1_311_output = ( kim1_cassette_high_count < 8 ) ? 0x80 : 0;
243         kim1_cassette_high_count = 0;
257         state->_311_output = ( state->cassette_high_count < 8 ) ? 0x80 : 0;
258         state->cassette_high_count = 0;
244259      }
245260   }
246261
247262   if ( tap_val > 0 )
248263   {
249      kim1_cassette_high_count++;
264      state->cassette_high_count++;
250265   }
251266}
252267
253268
254269static TIMER_CALLBACK( kim1_update_leds )
255270{
271   kim1_state *state = machine->driver_data<kim1_state>();
256272   int i;
257273
258274   for ( i = 0; i < 6; i++ )
259275   {
260      if ( kim1_led_time[i] )
261         kim1_led_time[i]--;
276      if ( state->led_time[i] )
277         state->led_time[i]--;
262278      else
263279         output_set_digit_value( i, 0 );
264280   }
r9683r9684
267283
268284static MACHINE_START( kim1 )
269285{
270   state_save_register_item(machine, "kim1", NULL, 0, kim1_u2_port_b );
271   state_save_register_item(machine, "kim1", NULL, 0, kim1_311_output );
272   state_save_register_item(machine, "kim1", NULL, 0, kim1_cassette_high_count );
286   kim1_state *state = machine->driver_data<kim1_state>();
287   state_save_register_item(machine, "kim1", NULL, 0, state->u2_port_b );
288   state_save_register_item(machine, "kim1", NULL, 0, state->_311_output );
289   state_save_register_item(machine, "kim1", NULL, 0, state->cassette_high_count );
273290   timer_pulse(machine,  ATTOTIME_IN_HZ(60), NULL, 0, kim1_update_leds );
274291   timer_pulse(machine,  ATTOTIME_IN_HZ(44100), NULL, 0, kim1_cassette_input );
275292}
r9683r9684
277294
278295static MACHINE_RESET( kim1 )
279296{
297   kim1_state *state = machine->driver_data<kim1_state>();
280298   int i;
281299
282300
283301   for ( i = 0; i < 6; i++ )
284302   {
285      kim1_led_time[i] = 0;
303      state->led_time[i] = 0;
286304   }
287305
288   kim1_311_output = 0;
289   kim1_cassette_high_count = 0;
306   state->_311_output = 0;
307   state->cassette_high_count = 0;
290308}
291309
292310
r9683r9684
299317};
300318
301319
302static MACHINE_CONFIG_START( kim1, driver_device )
320static MACHINE_CONFIG_START( kim1, kim1_state )
303321   /* basic machine hardware */
304322   MDRV_CPU_ADD("maincpu", M6502, 1000000)        /* 1 MHz */
305323   MDRV_CPU_PROGRAM_MAP(kim1_map)
src/mess/drivers/pmd85.c
r9683r9684
543543
544544
545545/* machine definition */
546static MACHINE_CONFIG_START( pmd85, driver_device )
546static MACHINE_CONFIG_START( pmd85, pmd85_state )
547547   /* basic machine hardware */
548548   MDRV_CPU_ADD("maincpu", I8080, 2000000)      /* 2.048MHz ??? */
549549   MDRV_CPU_PROGRAM_MAP(pmd85_mem)
src/mess/drivers/ip22.c
r9683r9684
5656#include "devices/chd_cd.h"
5757#include "sound/dac.h"
5858
59
60class ip22_state : public driver_device
61{
62public:
63   ip22_state(running_machine &machine, const driver_device_config_base &config)
64      : driver_device(machine, config) { }
65
66   UINT32 *mainram;
67   UINT8 nRTC_Regs[0x80];
68   UINT8 nRTC_UserRAM[0x200];
69   UINT8 nRTC_RAM[0x800];
70   UINT32 nHPC_SCSI0Descriptor;
71   UINT32 nHPC_SCSI0DMACtrl;
72   UINT32 int3_regs[64];
73   UINT32 nIOC_ParReadCnt;
74   UINT32 nHPC3_enetr_nbdp;
75   UINT32 nHPC3_enetr_cbp;
76   UINT32 nHPC3_unk0;
77   UINT32 nHPC3_unk1;
78   UINT32 nHPC3_IC_Unk0;
79   UINT32 nHAL2_IAR;
80   UINT32 nHAL2_IDR[4];
81   UINT8 nPBUS_DMA_Active;
82   UINT32 nPBUS_DMA_CurPtr;
83   UINT32 nPBUS_DMA_DescPtr;
84   UINT32 nPBUS_DMA_NextPtr;
85   UINT32 nPBUS_DMA_WordsLeft;
86   UINT32 *unkpbus0;
87   UINT32 nIntCounter;
88   UINT8 dma_buffer[4096];
89};
90
91
5992#define VERBOSE_LEVEL ( 0 )
6093
61static UINT32 *ip22_mainram;
6294
6395INLINE void ATTR_PRINTF(3,4) verboselog( running_machine *machine, int n_level, const char *s_fmt, ... )
6496{
r9683r9684
73105   }
74106}
75107
76static UINT8 nRTC_Regs[0x80];
77static UINT8 nRTC_UserRAM[0x200];
78static UINT8 nRTC_RAM[0x800];
79108
80static UINT32 nHPC_SCSI0Descriptor, nHPC_SCSI0DMACtrl;
81109
82110static const struct pit8253_config ip22_pit8254_config =
83111{
r9683r9684
100128
101129static NVRAM_HANDLER( ip22 )
102130{
131   ip22_state *state = machine->driver_data<ip22_state>();
103132   if (read_or_write)
104133   {
105      mame_fwrite(file, nRTC_UserRAM, 0x200);
106      mame_fwrite(file, nRTC_RAM, 0x200);
134      mame_fwrite(file, state->nRTC_UserRAM, 0x200);
135      mame_fwrite(file, state->nRTC_RAM, 0x200);
107136   }
108137   else
109138   {
110139      if (file)
111140      {
112         mame_fread(file, nRTC_UserRAM, 0x200);
113         mame_fread(file, nRTC_RAM, 0x200);
141         mame_fread(file, state->nRTC_UserRAM, 0x200);
142         mame_fread(file, state->nRTC_RAM, 0x200);
114143      }
115144   }
116145}
117146
118#define RTC_DAY      nRTC_RAM[0x09]
119#define RTC_HOUR   nRTC_RAM[0x08]
120#define RTC_MINUTE   nRTC_RAM[0x07]
121#define RTC_SECOND   nRTC_RAM[0x06]
122#define RTC_HUNDREDTH   nRTC_RAM[0x05]
147#define RTC_DAY      state->nRTC_RAM[0x09]
148#define RTC_HOUR   state->nRTC_RAM[0x08]
149#define RTC_MINUTE   state->nRTC_RAM[0x07]
150#define RTC_SECOND   state->nRTC_RAM[0x06]
151#define RTC_HUNDREDTH   state->nRTC_RAM[0x05]
123152
124153// interrupt sources handled by INT3
125154#define INT3_LOCAL0_FIFO   (0x01)
r9683r9684
140169#define INT3_LOCAL1_VSYNC   (0x40)
141170#define INT3_LOCAL1_RETRACE   (0x80)
142171
143static UINT32 int3_regs[64];
144172/*static UINT8 nIOC_ParCntl;*/
145static UINT32 nIOC_ParReadCnt;
146173
147174// raise a local0 interrupt
148175static void int3_raise_local0_irq(running_machine *machine, UINT8 source_mask)
149176{
177   ip22_state *state = machine->driver_data<ip22_state>();
150178   // signal the interrupt is pending
151   int3_regs[0] |= source_mask;
179   state->int3_regs[0] |= source_mask;
152180
153181   // if it's not masked, also assert it now at the CPU
154   if (int3_regs[1] & source_mask)
182   if (state->int3_regs[1] & source_mask)
155183   {
156184      cputag_set_input_line(machine, "maincpu", MIPS3_IRQ0, ASSERT_LINE);
157185   }
158186}
159187
160188// lower a local0 interrupt
161static void int3_lower_local0_irq(UINT8 source_mask)
189static void int3_lower_local0_irq(ip22_state *state, UINT8 source_mask)
162190{
163   int3_regs[0] &= ~source_mask;
191   state->int3_regs[0] &= ~source_mask;
164192}
165193
166194#ifdef UNUSED_FUNCTION
167195// raise a local1 interrupt
168196static void int3_raise_local1_irq(running_machine *machine, UINT8 source_mask)
169197{
198   ip22_state *state = machine->driver_data<ip22_state>();
170199   // signal the interrupt is pending
171   int3_regs[2] |= source_mask;
200   state->int3_regs[2] |= source_mask;
172201
173202   // if it's not masked, also assert it now at the CPU
174   if (int3_regs[2] & source_mask)
203   if (state->int3_regs[2] & source_mask)
175204   {
176205      cputag_set_input_line(machine, "maincpu", MIPS3_IRQ1, ASSERT_LINE);
177206   }
r9683r9684
180209// lower a local1 interrupt
181210static void int3_lower_local1_irq(UINT8 source_mask)
182211{
183   int3_regs[2] &= ~source_mask;
212   ip22_state *state = machine->driver_data<ip22_state>();
213   state->int3_regs[2] &= ~source_mask;
184214}
185215#endif
186216
187217static READ32_HANDLER( hpc3_pbus6_r )
188218{
219   ip22_state *state = space->machine->driver_data<ip22_state>();
189220   running_device *lpt = space->machine->device("lpt_0");
190221   UINT8 ret8;
191222   running_machine *machine = space->machine;
r9683r9684
235266   case 0xa8/4:
236267   case 0xac/4:
237268//      mame_printf_info("INT3: r @ %x mask %08x (PC=%x)\n", offset*4, mem_mask, activecpu_get_pc());
238      return int3_regs[offset-0x80/4];
269      return state->int3_regs[offset-0x80/4];
239270   case 0xb0/4:
240271      ret8 = pit8253_r(machine->device("pit8254"), 0);
241272      verboselog( machine, 0, "HPC PBUS6 IOC4 Timer Counter 0 Register Read: 0x%02x (%08x)\n", ret8, mem_mask );
r9683r9684
261292
262293static WRITE32_HANDLER( hpc3_pbus6_w )
263294{
295   ip22_state *state = space->machine->driver_data<ip22_state>();
264296   running_device *lpt = space->machine->device("lpt_0");
265297   char cChar;
266298   running_machine *machine = space->machine;
r9683r9684
319351   case 0xa0/4:
320352   case 0xa4/4:
321353//      mame_printf_info("INT3: w %x to %x (reg %d) mask %08x (PC=%x)\n", data, offset*4, offset-0x80/4, mem_mask, activecpu_get_pc());
322      int3_regs[offset-0x80/4] = data;
354      state->int3_regs[offset-0x80/4] = data;
323355
324356      // if no local0 interrupts now, clear the input to the CPU
325      if ((int3_regs[0] & int3_regs[1]) == 0)
357      if ((state->int3_regs[0] & state->int3_regs[1]) == 0)
326358      {
327359         cputag_set_input_line(machine, "maincpu", MIPS3_IRQ0, CLEAR_LINE);
328360      }
r9683r9684
332364      }
333365
334366      // if no local1 interrupts now, clear the input to the CPU
335      if ((int3_regs[2] & int3_regs[3]) == 0)
367      if ((state->int3_regs[2] & state->int3_regs[3]) == 0)
336368      {
337369         cputag_set_input_line(machine, "maincpu", MIPS3_IRQ1, CLEAR_LINE);
338370      }
r9683r9684
363395   }
364396}
365397
366static UINT32 nHPC3_enetr_nbdp;
367static UINT32 nHPC3_enetr_cbp;
368398//UINT32 nHPC3_hd0_register;
369399//UINT32 nHPC3_hd0_regs[0x20];
370400//UINT32 nHPC3_hd1_regs[0x20];
371401
372402static READ32_HANDLER( hpc3_hd_enet_r )
373403{
404   ip22_state *state = space->machine->driver_data<ip22_state>();
374405   running_machine *machine = space->machine;
375406
376407   switch( offset )
377408   {
378409   case 0x0004/4:
379      verboselog(machine, 0, "HPC3 SCSI0DESC Read: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2), mem_mask, nHPC_SCSI0Descriptor );
380      return nHPC_SCSI0Descriptor;
410      verboselog(machine, 0, "HPC3 SCSI0DESC Read: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2), mem_mask, state->nHPC_SCSI0Descriptor );
411      return state->nHPC_SCSI0Descriptor;
381412   case 0x1004/4:
382      verboselog(machine, 0, "HPC3 SCSI0DMACTRL Read: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2), mem_mask, nHPC_SCSI0DMACtrl );
383      return nHPC_SCSI0DMACtrl;
413      verboselog(machine, 0, "HPC3 SCSI0DMACTRL Read: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2), mem_mask, state->nHPC_SCSI0DMACtrl );
414      return state->nHPC_SCSI0DMACtrl;
384415   case 0x4000/4:
385      verboselog(machine, 2, "HPC3 ENETR CBP Read: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2), mem_mask, nHPC3_enetr_nbdp );
386      return nHPC3_enetr_cbp;
416      verboselog(machine, 2, "HPC3 ENETR CBP Read: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2), mem_mask, state->nHPC3_enetr_nbdp );
417      return state->nHPC3_enetr_cbp;
387418   case 0x4004/4:
388      verboselog(machine, 2, "HPC3 ENETR NBDP Read: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2), mem_mask, nHPC3_enetr_nbdp );
389      return nHPC3_enetr_nbdp;
419      verboselog(machine, 2, "HPC3 ENETR NBDP Read: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2), mem_mask, state->nHPC3_enetr_nbdp );
420      return state->nHPC3_enetr_nbdp;
390421   default:
391422      verboselog(machine, 0, "Unknown HPC3 ENET/HDx Read: %08x (%08x)\n", 0x1fb90000 + ( offset << 2 ), mem_mask );
392423      return 0;
r9683r9684
396427
397428static WRITE32_HANDLER( hpc3_hd_enet_w )
398429{
430   ip22_state *state = space->machine->driver_data<ip22_state>();
399431   running_machine *machine = space->machine;
400432
401433   switch( offset )
402434   {
403435   case 0x0004/4:
404436      verboselog(machine, 2, "HPC3 SCSI0DESC Write: %08x\n", data );
405      nHPC_SCSI0Descriptor = data;
437      state->nHPC_SCSI0Descriptor = data;
406438      break;
407439   case 0x1004/4:
408440      verboselog(machine, 2, "HPC3 SCSI0DMACTRL Write: %08x\n", data );
409      nHPC_SCSI0DMACtrl = data;
441      state->nHPC_SCSI0DMACtrl = data;
410442      break;
411443   case 0x4000/4:
412444      verboselog(machine, 2, "HPC3 ENETR CBP Write: %08x\n", data );
413      nHPC3_enetr_cbp = data;
445      state->nHPC3_enetr_cbp = data;
414446      break;
415447   case 0x4004/4:
416448      verboselog(machine, 2, "HPC3 ENETR NBDP Write: %08x\n", data );
417      nHPC3_enetr_nbdp = data;
449      state->nHPC3_enetr_nbdp = data;
418450      break;
419451   default:
420452      verboselog(machine, 0, "Unknown HPC3 ENET/HDx write: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2 ), mem_mask, data );
r9683r9684
485517   }
486518}
487519
488static UINT32 nHPC3_unk0;
489static UINT32 nHPC3_unk1;
490static UINT32 nHPC3_IC_Unk0;
491520
492521static READ32_HANDLER( hpc3_pbus4_r )
493522{
523   ip22_state *state = space->machine->driver_data<ip22_state>();
494524   running_machine *machine = space->machine;
495525
496526   switch( offset )
497527   {
498528   case 0x0004/4:
499      verboselog(machine, 2, "HPC3 PBUS4 Unknown 0 Read: (%08x): %08x\n", mem_mask, nHPC3_unk0 );
500      return nHPC3_unk0;
529      verboselog(machine, 2, "HPC3 PBUS4 Unknown 0 Read: (%08x): %08x\n", mem_mask, state->nHPC3_unk0 );
530      return state->nHPC3_unk0;
501531   case 0x000c/4:
502      verboselog(machine, 2, "Interrupt Controller(?) Read: (%08x): %08x\n", mem_mask, nHPC3_IC_Unk0 );
503      return nHPC3_IC_Unk0;
532      verboselog(machine, 2, "Interrupt Controller(?) Read: (%08x): %08x\n", mem_mask, state->nHPC3_IC_Unk0 );
533      return state->nHPC3_IC_Unk0;
504534   case 0x0014/4:
505      verboselog(machine, 2, "HPC3 PBUS4 Unknown 1 Read: (%08x): %08x\n", mem_mask, nHPC3_unk1 );
506      return nHPC3_unk1;
535      verboselog(machine, 2, "HPC3 PBUS4 Unknown 1 Read: (%08x): %08x\n", mem_mask, state->nHPC3_unk1 );
536      return state->nHPC3_unk1;
507537   default:
508538      verboselog(machine, 0, "Unknown HPC3 PBUS4 Read: %08x (%08x)\n", 0x1fbd9000 + ( offset << 2 ), mem_mask );
509539      return 0;
r9683r9684
513543
514544static WRITE32_HANDLER( hpc3_pbus4_w )
515545{
546   ip22_state *state = space->machine->driver_data<ip22_state>();
516547   running_machine *machine = space->machine;
517548
518549   switch( offset )
519550   {
520551   case 0x0004/4:
521552      verboselog(machine, 2, "HPC3 PBUS4 Unknown 0 Write: %08x (%08x)\n", data, mem_mask );
522      nHPC3_unk0 = data;
553      state->nHPC3_unk0 = data;
523554      break;
524555   case 0x000c/4:
525556      verboselog(machine, 2, "Interrupt Controller(?) Write: (%08x): %08x\n", mem_mask, data );
526      nHPC3_IC_Unk0 = data;
557      state->nHPC3_IC_Unk0 = data;
527558      break;
528559   case 0x0014/4:
529560      verboselog(machine, 2, "HPC3 PBUS4 Unknown 1 Write: %08x (%08x)\n", data, mem_mask );
530      nHPC3_unk1 = data;
561      state->nHPC3_unk1 = data;
531562      break;
532563   default:
533564      verboselog(machine, 0, "Unknown HPC3 PBUS4 Write: %08x (%08x): %08x\n", 0x1fbd9000 + ( offset << 2 ), mem_mask, data );
r9683r9684
535566   }
536567}
537568
538#define RTC_SECONDS   nRTC_Regs[0x00]
539#define RTC_SECONDS_A   nRTC_Regs[0x01]
540#define RTC_MINUTES   nRTC_Regs[0x02]
541#define RTC_MINUTES_A   nRTC_Regs[0x03]
542#define RTC_HOURS   nRTC_Regs[0x04]
543#define RTC_HOURS_A   nRTC_Regs[0x05]
544#define RTC_DAYOFWEEK   nRTC_Regs[0x06]
545#define RTC_DAYOFMONTH   nRTC_Regs[0x07]
546#define RTC_MONTH   nRTC_Regs[0x08]
547#define RTC_YEAR   nRTC_Regs[0x09]
548#define RTC_REGISTERA   nRTC_Regs[0x0a]
549#define RTC_REGISTERB   nRTC_Regs[0x0b]
550#define RTC_REGISTERC   nRTC_Regs[0x0c]
551#define RTC_REGISTERD   nRTC_Regs[0x0d]
552#define RTC_MODELBYTE   nRTC_Regs[0x40]
553#define RTC_SERBYTE0   nRTC_Regs[0x41]
554#define RTC_SERBYTE1   nRTC_Regs[0x42]
555#define RTC_SERBYTE2   nRTC_Regs[0x43]
556#define RTC_SERBYTE3   nRTC_Regs[0x44]
557#define RTC_SERBYTE4   nRTC_Regs[0x45]
558#define RTC_SERBYTE5   nRTC_Regs[0x46]
559#define RTC_CRC      nRTC_Regs[0x47]
560#define RTC_CENTURY   nRTC_Regs[0x48]
561#define RTC_DAYOFMONTH_A nRTC_Regs[0x49]
562#define RTC_EXTCTRL0   nRTC_Regs[0x4a]
563#define RTC_EXTCTRL1   nRTC_Regs[0x4b]
564#define RTC_RTCADDR2   nRTC_Regs[0x4e]
565#define RTC_RTCADDR3   nRTC_Regs[0x4f]
566#define RTC_RAMLSB   nRTC_Regs[0x50]
567#define RTC_RAMMSB   nRTC_Regs[0x51]
568#define RTC_WRITECNT   nRTC_Regs[0x5e]
569#define RTC_SECONDS   state->nRTC_Regs[0x00]
570#define RTC_SECONDS_A   state->nRTC_Regs[0x01]
571#define RTC_MINUTES   state->nRTC_Regs[0x02]
572#define RTC_MINUTES_A   state->nRTC_Regs[0x03]
573#define RTC_HOURS   state->nRTC_Regs[0x04]
574#define RTC_HOURS_A   state->nRTC_Regs[0x05]
575#define RTC_DAYOFWEEK   state->nRTC_Regs[0x06]
576#define RTC_DAYOFMONTH   state->nRTC_Regs[0x07]
577#define RTC_MONTH   state->nRTC_Regs[0x08]
578#define RTC_YEAR   state->nRTC_Regs[0x09]
579#define RTC_REGISTERA   state->nRTC_Regs[0x0a]
580#define RTC_REGISTERB   state->nRTC_Regs[0x0b]
581#define RTC_REGISTERC   state->nRTC_Regs[0x0c]
582#define RTC_REGISTERD   state->nRTC_Regs[0x0d]
583#define RTC_MODELBYTE   state->nRTC_Regs[0x40]
584#define RTC_SERBYTE0   state->nRTC_Regs[0x41]
585#define RTC_SERBYTE1   state->nRTC_Regs[0x42]
586#define RTC_SERBYTE2   state->nRTC_Regs[0x43]
587#define RTC_SERBYTE3   state->nRTC_Regs[0x44]
588#define RTC_SERBYTE4   state->nRTC_Regs[0x45]
589#define RTC_SERBYTE5   state->nRTC_Regs[0x46]
590#define RTC_CRC      state->nRTC_Regs[0x47]
591#define RTC_CENTURY   state->nRTC_Regs[0x48]
592#define RTC_DAYOFMONTH_A state->nRTC_Regs[0x49]
593#define RTC_EXTCTRL0   state->nRTC_Regs[0x4a]
594#define RTC_EXTCTRL1   state->nRTC_Regs[0x4b]
595#define RTC_RTCADDR2   state->nRTC_Regs[0x4e]
596#define RTC_RTCADDR3   state->nRTC_Regs[0x4f]
597#define RTC_RAMLSB   state->nRTC_Regs[0x50]
598#define RTC_RAMMSB   state->nRTC_Regs[0x51]
599#define RTC_WRITECNT   state->nRTC_Regs[0x5e]
569600
570601static READ32_HANDLER( rtc_r )
571602{
603   ip22_state *state = space->machine->driver_data<ip22_state>();
572604   running_machine *machine = space->machine;
573605
574//  mame_printf_info("RTC_R: offset %x = %x (PC=%x)\n", offset, nRTC_Regs[offset], activecpu_get_pc());
606//  mame_printf_info("RTC_R: offset %x = %x (PC=%x)\n", offset, state->nRTC_Regs[offset], activecpu_get_pc());
575607
576608   if( offset <= 0x0d )
577609   {
r9683r9684
626658   }
627659   if( offset >= 0x0e && offset < 0x40 )
628660   {
629      return nRTC_Regs[offset];
661      return state->nRTC_Regs[offset];
630662   }
631663   if( offset >= 0x40 && offset < 0x80 && !( RTC_REGISTERA & 0x10 ) )
632664   {
633      return nRTC_UserRAM[offset - 0x40];
665      return state->nRTC_UserRAM[offset - 0x40];
634666   }
635667   if( offset >= 0x40 && offset < 0x80 && ( RTC_REGISTERA & 0x10 ) )
636668   {
r9683r9684
685717         verboselog(machine, 3, "RTC RAM MSB Read: %02x \n", RTC_RAMMSB );
686718         return RTC_RAMMSB;
687719      case 0x0053:
688         return nRTC_RAM[ ( RTC_RAMMSB << 8 ) | RTC_RAMLSB ];
720         return state->nRTC_RAM[ ( RTC_RAMMSB << 8 ) | RTC_RAMLSB ];
689721      case 0x005e:
690722         return RTC_WRITECNT;
691723      default:
r9683r9684
695727   }
696728   if( offset >= 0x80 )
697729   {
698      return nRTC_UserRAM[ offset - 0x80 ];
730      return state->nRTC_UserRAM[ offset - 0x80 ];
699731   }
700732   return 0;
701733}
702734
703735static WRITE32_HANDLER( rtc_w )
704736{
737   ip22_state *state = space->machine->driver_data<ip22_state>();
705738   running_machine *machine = space->machine;
706739
707740   RTC_WRITECNT++;
r9683r9684
773806   }
774807   if( offset >= 0x0e && offset < 0x40 )
775808   {
776      nRTC_Regs[offset] = data;
809      state->nRTC_Regs[offset] = data;
777810      return;
778811   }
779812   if( offset >= 0x40 && offset < 0x80 && !( RTC_REGISTERA & 0x10 ) )
780813   {
781      nRTC_UserRAM[offset - 0x40] = data;
814      state->nRTC_UserRAM[offset - 0x40] = data;
782815      return;
783816   }
784817   if( offset >= 0x40 && offset < 0x80 && ( RTC_REGISTERA & 0x10 ) )
r9683r9684
831864         RTC_RAMMSB = data;
832865         break;
833866      case 0x0053:
834         nRTC_RAM[ ( RTC_RAMMSB << 8 ) | RTC_RAMLSB ] = data;
867         state->nRTC_RAM[ ( RTC_RAMMSB << 8 ) | RTC_RAMLSB ] = data;
835868         break;
836869      default:
837870         verboselog(machine, 3, "Unknown RTC Ext. Reg. Write: %02x: %02x\n", offset, data );
r9683r9684
840873   }
841874   if( offset >= 0x80 )
842875   {
843      nRTC_UserRAM[ offset - 0x80 ] = data;
876      state->nRTC_UserRAM[ offset - 0x80 ] = data;
844877   }
845878}
846879
847880// a bit hackish, but makes the memory detection work properly and allows a big cleanup of the mapping
848881static WRITE32_HANDLER( ip22_write_ram )
849882{
883   ip22_state *state = space->machine->driver_data<ip22_state>();
850884   // if banks 2 or 3 are enabled, do nothing, we don't support that much memory
851885   if (sgi_mc_r(space, 0xc8/4, 0xffffffff) & 0x10001000)
852886   {
r9683r9684
860894      // a random perturbation so the memory test fails
861895      data ^= 0xffffffff;
862896   }
863   COMBINE_DATA(&ip22_mainram[offset]);
897   COMBINE_DATA(&state->mainram[offset]);
864898}
865899
866static UINT32 nHAL2_IAR;
867static UINT32 nHAL2_IDR[4];
868900
869901#define H2_IAR_TYPE         0xf000
870902#define H2_IAR_NUM         0x0f00
r9683r9684
897929
898930static WRITE32_HANDLER( hal2_w )
899931{
932   ip22_state *state = space->machine->driver_data<ip22_state>();
900933   running_machine *machine = space->machine;
901934
902935   switch( offset )
r9683r9684
914947      break;
915948   case 0x0030/4:
916949      verboselog(machine, 0, "HAL2 Indirect Address Register Write: 0x%08x (%08x)\n", data, mem_mask );
917      nHAL2_IAR = data;
950      state->nHAL2_IAR = data;
918951      switch( data & H2_IAR_TYPE )
919952      {
920953      case 0x1000:
r9683r9684
9911024      break;
9921025   case 0x0040/4:
9931026      verboselog(machine, 0, "HAL2 Indirect Data Register 0 Write: 0x%08x (%08x)\n", data, mem_mask );
994      nHAL2_IDR[0] = data;
1027      state->nHAL2_IDR[0] = data;
9951028      return;
9961029   case 0x0050/4:
9971030      verboselog(machine, 0, "HAL2 Indirect Data Register 1 Write: 0x%08x (%08x)\n", data, mem_mask );
998      nHAL2_IDR[1] = data;
1031      state->nHAL2_IDR[1] = data;
9991032      return;
10001033   case 0x0060/4:
10011034      verboselog(machine, 0, "HAL2 Indirect Data Register 2 Write: 0x%08x (%08x)\n", data, mem_mask );
1002      nHAL2_IDR[2] = data;
1035      state->nHAL2_IDR[2] = data;
10031036      return;
10041037   case 0x0070/4:
10051038      verboselog(machine, 0, "HAL2 Indirect Data Register 3 Write: 0x%08x (%08x)\n", data, mem_mask );
1006      nHAL2_IDR[3] = data;
1039      state->nHAL2_IDR[3] = data;
10071040      return;
10081041   }
10091042   verboselog(machine, 0, "Unknown HAL2 write: 0x%08x: 0x%08x (%08x)\n", 0x1fbd8000 + offset*4, data, mem_mask );
r9683r9684
10261059#define PBUS_DMADESC_TXD      0x00008000
10271060#define PBUS_DMADESC_BC         0x00003fff
10281061
1029static UINT8 nPBUS_DMA_Active;
1030static UINT32 nPBUS_DMA_CurPtr;
1031static UINT32 nPBUS_DMA_DescPtr;
1032static UINT32 nPBUS_DMA_NextPtr;
1033static UINT32 nPBUS_DMA_WordsLeft;
10341062
10351063static TIMER_CALLBACK(ip22_dma)
10361064{
1065   //ip22_state *state = machine->driver_data<ip22_state>();
10371066   timer_set(machine, attotime_never, NULL, 0, ip22_dma);
10381067#if 0
1039   if( nPBUS_DMA_Active )
1068   if( state->nPBUS_DMA_Active )
10401069   {
1041      UINT16 temp16 = ( ip22_mainram[(nPBUS_DMA_CurPtr - 0x08000000)/4] & 0xffff0000 ) >> 16;
1070      UINT16 temp16 = ( state->mainram[(state->nPBUS_DMA_CurPtr - 0x08000000)/4] & 0xffff0000 ) >> 16;
10421071      INT16 stemp16 = (INT16)((temp16 >> 8) | (temp16 << 8));
10431072
10441073      dac_signed_data_16_w(machine->device("dac"), stemp16 ^ 0x8000);
10451074
1046      nPBUS_DMA_CurPtr += 4;
1075      state->nPBUS_DMA_CurPtr += 4;
10471076
1048      nPBUS_DMA_WordsLeft -= 4;
1049      if( nPBUS_DMA_WordsLeft == 0 )
1077      state->nPBUS_DMA_WordsLeft -= 4;
1078      if( state->nPBUS_DMA_WordsLeft == 0 )
10501079      {
1051         if( nPBUS_DMA_NextPtr != 0 )
1080         if( state->nPBUS_DMA_NextPtr != 0 )
10521081         {
1053            nPBUS_DMA_DescPtr = nPBUS_DMA_NextPtr;
1054            nPBUS_DMA_CurPtr = ip22_mainram[(nPBUS_DMA_DescPtr - 0x08000000)/4];
1055            nPBUS_DMA_WordsLeft = ip22_mainram[(nPBUS_DMA_DescPtr - 0x08000000)/4+1];
1056            nPBUS_DMA_NextPtr = ip22_mainram[(nPBUS_DMA_DescPtr - 0x08000000)/4+2];
1082            state->nPBUS_DMA_DescPtr = state->nPBUS_DMA_NextPtr;
1083            state->nPBUS_DMA_CurPtr = state->mainram[(state->nPBUS_DMA_DescPtr - 0x08000000)/4];
1084            state->nPBUS_DMA_WordsLeft = state->mainram[(state->nPBUS_DMA_DescPtr - 0x08000000)/4+1];
1085            state->nPBUS_DMA_NextPtr = state->mainram[(state->nPBUS_DMA_DescPtr - 0x08000000)/4+2];
10571086         }
10581087         else
10591088         {
1060            nPBUS_DMA_Active = 0;
1089            state->nPBUS_DMA_Active = 0;
10611090            return;
10621091         }
10631092      }
r9683r9684
10751104
10761105static WRITE32_HANDLER( hpc3_pbusdma_w )
10771106{
1107   ip22_state *state = space->machine->driver_data<ip22_state>();
10781108   UINT32 channel = offset / (0x2000/4);
10791109   running_machine *machine = space->machine;
10801110
r9683r9684
10871117      verboselog(machine, 0, "PBUS DMA Channel %d Descriptor Pointer Write: 0x%08x\n", channel, data );
10881118      if( channel == 1 )
10891119      {
1090         nPBUS_DMA_DescPtr = data;
1091         nPBUS_DMA_CurPtr = ip22_mainram[(nPBUS_DMA_DescPtr - 0x08000000)/4];
1092         nPBUS_DMA_WordsLeft = ip22_mainram[(nPBUS_DMA_DescPtr - 0x08000000)/4+1];
1093         nPBUS_DMA_NextPtr = ip22_mainram[(nPBUS_DMA_DescPtr - 0x08000000)/4+2];
1094         verboselog(machine, 0, "nPBUS_DMA_DescPtr = %08x\n", nPBUS_DMA_DescPtr );
1095         verboselog(machine, 0, "nPBUS_DMA_CurPtr = %08x\n", nPBUS_DMA_CurPtr );
1096         verboselog(machine, 0, "nPBUS_DMA_WordsLeft = %08x\n", nPBUS_DMA_WordsLeft );
1097         verboselog(machine, 0, "nPBUS_DMA_NextPtr = %08x\n", nPBUS_DMA_NextPtr );
1120         state->nPBUS_DMA_DescPtr = data;
1121         state->nPBUS_DMA_CurPtr = state->mainram[(state->nPBUS_DMA_DescPtr - 0x08000000)/4];
1122         state->nPBUS_DMA_WordsLeft = state->mainram[(state->nPBUS_DMA_DescPtr - 0x08000000)/4+1];
1123         state->nPBUS_DMA_NextPtr = state->mainram[(state->nPBUS_DMA_DescPtr - 0x08000000)/4+2];
1124         verboselog(machine, 0, "nPBUS_DMA_DescPtr = %08x\n", state->nPBUS_DMA_DescPtr );
1125         verboselog(machine, 0, "nPBUS_DMA_CurPtr = %08x\n", state->nPBUS_DMA_CurPtr );
1126         verboselog(machine, 0, "nPBUS_DMA_WordsLeft = %08x\n", state->nPBUS_DMA_WordsLeft );
1127         verboselog(machine, 0, "nPBUS_DMA_NextPtr = %08x\n", state->nPBUS_DMA_NextPtr );
10981128      }
10991129      return;
11001130   case 0x1000/4:
r9683r9684
11331163      if( ( data & PBUS_CTRL_DMASTART ) || ( data & PBUS_CTRL_LOAD_EN ) )
11341164      {
11351165         timer_set(machine, ATTOTIME_IN_HZ(44100), NULL, 0, ip22_dma);
1136         nPBUS_DMA_Active = 1;
1166         state->nPBUS_DMA_Active = 1;
11371167      }
11381168      return;
11391169   }
11401170   verboselog(machine, 0, "Unknown PBUS DMA Channel %d Write: 0x%08x: 0x%08x (%08x)\n", channel, 0x1fb80000 + offset*4, data, mem_mask );
11411171}
11421172
1143static UINT32 *unkpbus0;
11441173static READ32_HANDLER( hpc3_unkpbus0_r )
11451174{
1175   //ip22_state *state = space->machine->driver_data<ip22_state>();
11461176   return 0;
11471177   //verboselog(space->machine, 0, "Unknown PBUS Read: 0x%08x (%08x)\n", 0x1fbc8000 + offset*4, mem_mask );
1148   //return unkpbus0[offset];
1178   //return state->unkpbus0[offset];
11491179}
11501180
11511181static WRITE32_HANDLER( hpc3_unkpbus0_w )
11521182{
1183   //ip22_state *state = space->machine->driver_data<ip22_state>();
11531184   //verboselog(space->machine, 0, "Unknown PBUS Write: 0x%08x = 0x%08x (%08x)\n", 0x1fbc8000 + offset*4, data, mem_mask );
1154   //COMBINE_DATA(&unkpbus0[offset]);
1185   //COMBINE_DATA(&state->unkpbus0[offset]);
11551186}
11561187
11571188static ADDRESS_MAP_START( ip225015_map, ADDRESS_SPACE_PROGRAM, 32 )
11581189   AM_RANGE( 0x00000000, 0x0007ffff ) AM_RAMBANK( "bank1" )   /* mirror of first 512k of main RAM */
1159   AM_RANGE( 0x08000000, 0x0fffffff ) AM_SHARE("share1") AM_BASE( &ip22_mainram ) AM_RAM_WRITE(ip22_write_ram)      /* 128 MB of main RAM */
1190   AM_RANGE( 0x08000000, 0x0fffffff ) AM_SHARE("share1") AM_BASE_MEMBER(ip22_state, mainram ) AM_RAM_WRITE(ip22_write_ram)      /* 128 MB of main RAM */
11601191   AM_RANGE( 0x1f0f0000, 0x1f0f1fff ) AM_READWRITE( newport_rex3_r, newport_rex3_w )
11611192   AM_RANGE( 0x1fa00000, 0x1fa1ffff ) AM_READWRITE( sgi_mc_r, sgi_mc_w )
11621193   AM_RANGE( 0x1fb90000, 0x1fb9ffff ) AM_READWRITE( hpc3_hd_enet_r, hpc3_hd_enet_w )
11631194   AM_RANGE( 0x1fbb0000, 0x1fbb0003 ) AM_RAM   /* unknown, but read a lot and discarded */
11641195   AM_RANGE( 0x1fbc0000, 0x1fbc7fff ) AM_READWRITE( hpc3_hd0_r, hpc3_hd0_w )
1165   AM_RANGE( 0x1fbc8000, 0x1fbcffff ) AM_READWRITE( hpc3_unkpbus0_r, hpc3_unkpbus0_w ) AM_BASE(&unkpbus0)
1196   AM_RANGE( 0x1fbc8000, 0x1fbcffff ) AM_READWRITE( hpc3_unkpbus0_r, hpc3_unkpbus0_w ) AM_BASE_MEMBER(ip22_state, unkpbus0)
11661197   AM_RANGE( 0x1fb80000, 0x1fb8ffff ) AM_READWRITE( hpc3_pbusdma_r, hpc3_pbusdma_w )
11671198   AM_RANGE( 0x1fbd8000, 0x1fbd83ff ) AM_READWRITE( hal2_r, hal2_w )
11681199   AM_RANGE( 0x1fbd8400, 0x1fbd87ff ) AM_RAM /* hack */
r9683r9684
11751206   AM_RANGE( 0x20000000, 0x27ffffff ) AM_SHARE("share1") AM_RAM_WRITE(ip22_write_ram)
11761207ADDRESS_MAP_END
11771208
1178static UINT32 nIntCounter;
11791209
11801210// sgi_mc_update wants once every millisecond (1/1000th of a second)
11811211static TIMER_CALLBACK(ip22_timer)
r9683r9684
11911221
11921222static MACHINE_RESET( ip225015 )
11931223{
1224   ip22_state *state = machine->driver_data<ip22_state>();
11941225   sgi_mc_init(machine);
1195   nHPC3_enetr_nbdp = 0x80000000;
1196   nHPC3_enetr_cbp = 0x80000000;
1197   nIntCounter = 0;
1226   state->nHPC3_enetr_nbdp = 0x80000000;
1227   state->nHPC3_enetr_cbp = 0x80000000;
1228   state->nIntCounter = 0;
11981229   RTC_REGISTERB = 0x08;
11991230   RTC_REGISTERD = 0x80;
12001231
12011232   timer_set(machine, ATTOTIME_IN_MSEC(1), NULL, 0, ip22_timer);
12021233
12031234   // set up low RAM mirror
1204   memory_set_bankptr(machine, "bank1", ip22_mainram);
1235   memory_set_bankptr(machine, "bank1", state->mainram);
12051236
1206   nPBUS_DMA_Active = 0;
1237   state->nPBUS_DMA_Active = 0;
12071238
12081239   mips3drc_set_options(machine->device("maincpu"), MIPS3DRC_COMPATIBLE_OPTIONS | MIPS3DRC_CHECK_OVERFLOWS);
12091240}
r9683r9684
12251256#define HPC3_DMACTRL_DIR   (0x04)
12261257#define HPC3_DMACTRL_ENABLE   (0x10)
12271258
1228static UINT8 dma_buffer[4096];
12291259
12301260static void scsi_irq(running_machine *machine, int state)
12311261{
1262   ip22_state *drvstate = machine->driver_data<ip22_state>();
12321263   address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
12331264
12341265   if (state)
r9683r9684
12361267      if (wd33c93_get_dma_count())
12371268      {
12381269         printf("wd33c93_get_dma_count() is %d\n", wd33c93_get_dma_count() );
1239         if (nHPC_SCSI0DMACtrl & HPC3_DMACTRL_ENABLE)
1270         if (drvstate->nHPC_SCSI0DMACtrl & HPC3_DMACTRL_ENABLE)
12401271         {
1241            if (nHPC_SCSI0DMACtrl & HPC3_DMACTRL_IRQ) logerror("IP22: Unhandled SCSI DMA IRQ\n");
1272            if (drvstate->nHPC_SCSI0DMACtrl & HPC3_DMACTRL_IRQ) logerror("IP22: Unhandled SCSI DMA IRQ\n");
12421273         }
12431274
12441275         // HPC3 DMA: host to device
1245         if ((nHPC_SCSI0DMACtrl & HPC3_DMACTRL_ENABLE) && (nHPC_SCSI0DMACtrl & HPC3_DMACTRL_DIR))
1276         if ((drvstate->nHPC_SCSI0DMACtrl & HPC3_DMACTRL_ENABLE) && (drvstate->nHPC_SCSI0DMACtrl & HPC3_DMACTRL_DIR))
12461277         {
12471278            UINT32 wptr, tmpword;
12481279            int words, dptr, twords;
r9683r9684
12501281            words = wd33c93_get_dma_count();
12511282            words /= 4;
12521283
1253            wptr = space->read_dword(nHPC_SCSI0Descriptor);
1254            nHPC_SCSI0Descriptor += words*4;
1284            wptr = space->read_dword(drvstate->nHPC_SCSI0Descriptor);
1285            drvstate->nHPC_SCSI0Descriptor += words*4;
12551286            dptr = 0;
12561287
12571288            printf("DMA to device: %d words @ %x\n", words, wptr);
12581289
1259            dump_chain(space, nHPC_SCSI0Descriptor);
1290            dump_chain(space, drvstate->nHPC_SCSI0Descriptor);
12601291
12611292            if (words <= (512/4))
12621293            {
12631294               // one-shot
1264               //wd33c93_get_dma_data(wd33c93_get_dma_count(), dma_buffer);
1295               //wd33c93_get_dma_data(wd33c93_get_dma_count(), drvstate->dma_buffer);
12651296
12661297               while (words)
12671298               {
12681299                  tmpword = space->read_dword(wptr);
12691300
1270                  if (nHPC_SCSI0DMACtrl & HPC3_DMACTRL_ENDIAN)
1301                  if (drvstate->nHPC_SCSI0DMACtrl & HPC3_DMACTRL_ENDIAN)
12711302                  {
1272                     dma_buffer[dptr+3] = (tmpword>>24)&0xff;
1273                     dma_buffer[dptr+2] = (tmpword>>16)&0xff;
1274                     dma_buffer[dptr+1] = (tmpword>>8)&0xff;
1275                     dma_buffer[dptr] = tmpword&0xff;
1303                     drvstate->dma_buffer[dptr+3] = (tmpword>>24)&0xff;
1304                     drvstate->dma_buffer[dptr+2] = (tmpword>>16)&0xff;
1305                     drvstate->dma_buffer[dptr+1] = (tmpword>>8)&0xff;
1306                     drvstate->dma_buffer[dptr] = tmpword&0xff;
12761307                  }
12771308                  else
12781309                  {
1279                     dma_buffer[dptr] = (tmpword>>24)&0xff;
1280                     dma_buffer[dptr+1] = (tmpword>>16)&0xff;
1281                     dma_buffer[dptr+2] = (tmpword>>8)&0xff;
1282                     dma_buffer[dptr+3] = tmpword&0xff;
1310                     drvstate->dma_buffer[dptr] = (tmpword>>24)&0xff;
1311                     drvstate->dma_buffer[dptr+1] = (tmpword>>16)&0xff;
1312                     drvstate->dma_buffer[dptr+2] = (tmpword>>8)&0xff;
1313                     drvstate->dma_buffer[dptr+3] = tmpword&0xff;
12831314                  }
12841315
12851316                  wptr += 4;
r9683r9684
12881319               }
12891320
12901321               words = wd33c93_get_dma_count();
1291               wd33c93_write_data(words, dma_buffer);
1322               wd33c93_write_data(words, drvstate->dma_buffer);
12921323            }
12931324            else
12941325            {
12951326               while (words)
12961327               {
1297                  //wd33c93_get_dma_data(512, dma_buffer);
1328                  //wd33c93_get_dma_data(512, drvstate->dma_buffer);
12981329                  twords = 512/4;
1299                  nHPC_SCSI0Descriptor += 512;
1330                  drvstate->nHPC_SCSI0Descriptor += 512;
13001331                  dptr = 0;
13011332
13021333                  while (twords)
13031334                  {
13041335                     tmpword = space->read_dword(wptr);
13051336
1306                     if (nHPC_SCSI0DMACtrl & HPC3_DMACTRL_ENDIAN)
1337                     if (drvstate->nHPC_SCSI0DMACtrl & HPC3_DMACTRL_ENDIAN)
13071338                     {
1308                        dma_buffer[dptr+3] = (tmpword>>24)&0xff;
1309                        dma_buffer[dptr+2] = (tmpword>>16)&0xff;
1310                        dma_buffer[dptr+1] = (tmpword>>8)&0xff;
1311                        dma_buffer[dptr] = tmpword&0xff;
1339                        drvstate->dma_buffer[dptr+3] = (tmpword>>24)&0xff;
1340                        drvstate->dma_buffer[dptr+2] = (tmpword>>16)&0xff;
1341                        drvstate->dma_buffer[dptr+1] = (tmpword>>8)&0xff;
1342                        drvstate->dma_buffer[dptr] = tmpword&0xff;
13121343                     }
13131344                     else
13141345                     {
1315                        dma_buffer[dptr] = (tmpword>>24)&0xff;
1316                        dma_buffer[dptr+1] = (tmpword>>16)&0xff;
1317                        dma_buffer[dptr+2] = (tmpword>>8)&0xff;
1318                        dma_buffer[dptr+3] = tmpword&0xff;
1346                        drvstate->dma_buffer[dptr] = (tmpword>>24)&0xff;
1347                        drvstate->dma_buffer[dptr+1] = (tmpword>>16)&0xff;
1348                        drvstate->dma_buffer[dptr+2] = (tmpword>>8)&0xff;
1349                        drvstate->dma_buffer[dptr+3] = tmpword&0xff;
13191350                     }
13201351
13211352                     wptr += 4;
r9683r9684
13231354                     twords--;
13241355                  }
13251356
1326                  wd33c93_write_data(512, dma_buffer);
1357                  wd33c93_write_data(512, drvstate->dma_buffer);
13271358
13281359                  words -= (512/4);
13291360               }
r9683r9684
13331364            wd33c93_clear_dma();
13341365#if 0
13351366            UINT32 dptr, tmpword;
1336            UINT32 bc = space->read_dword(nHPC_SCSI0Descriptor + 4);
1337            UINT32 rptr = space->read_dword(nHPC_SCSI0Descriptor);
1367            UINT32 bc = space->read_dword(drvstate->nHPC_SCSI0Descriptor + 4);
1368            UINT32 rptr = space->read_dword(drvstate->nHPC_SCSI0Descriptor);
13381369            int length = bc & 0x3fff;
13391370            int xie = (bc & 0x20000000) ? 1 : 0;
13401371            int eox = (bc & 0x80000000) ? 1 : 0;
13411372
1342            dump_chain(space, nHPC_SCSI0Descriptor);
1373            dump_chain(space, drvstate->nHPC_SCSI0Descriptor);
13431374
13441375            printf("PC is %08x\n", cpu_get_pc(machine->device("maincpu")));
13451376            printf("DMA to device: length %x xie %d eox %d\n", length, xie, eox);
r9683r9684
13501381               while (length > 0)
13511382               {
13521383                  tmpword = space->read_dword(rptr);
1353                  if (nHPC_SCSI0DMACtrl & HPC3_DMACTRL_ENDIAN)
1384                  if (drvstate->nHPC_SCSI0DMACtrl & HPC3_DMACTRL_ENDIAN)
13541385                  {
1355                     dma_buffer[dptr+3] = (tmpword>>24)&0xff;
1356                     dma_buffer[dptr+2] = (tmpword>>16)&0xff;
1357                     dma_buffer[dptr+1] = (tmpword>>8)&0xff;
1358                     dma_buffer[dptr] = tmpword&0xff;
1386                     drvstate->dma_buffer[dptr+3] = (tmpword>>24)&0xff;
1387                     drvstate->dma_buffer[dptr+2] = (tmpword>>16)&0xff;
1388                     drvstate->dma_buffer[dptr+1] = (tmpword>>8)&0xff;
1389                     drvstate->dma_buffer[dptr] = tmpword&0xff;
13591390                  }
13601391                  else
13611392                  {
1362                     dma_buffer[dptr] = (tmpword>>24)&0xff;
1363                     dma_buffer[dptr+1] = (tmpword>>16)&0xff;
1364                     dma_buffer[dptr+2] = (tmpword>>8)&0xff;
1365                     dma_buffer[dptr+3] = tmpword&0xff;
1393                     drvstate->dma_buffer[dptr] = (tmpword>>24)&0xff;
1394                     drvstate->dma_buffer[dptr+1] = (tmpword>>16)&0xff;
1395                     drvstate->dma_buffer[dptr+2] = (tmpword>>8)&0xff;
1396                     drvstate->dma_buffer[dptr+3] = tmpword&0xff;
13661397                  }
13671398
13681399                  dptr += 4;
r9683r9684
13701401                  length -= 4;
13711402               }
13721403
1373               length = space->read_dword(nHPC_SCSI0Descriptor+4) & 0x3fff;
1374               wd33c93_write_data(length, dma_buffer);
1404               length = space->read_dword(drvstate->nHPC_SCSI0Descriptor+4) & 0x3fff;
1405               wd33c93_write_data(length, drvstate->dma_buffer);
13751406
13761407               // clear DMA on the controller too
13771408               wd33c93_clear_dma();
r9683r9684
13841415         }
13851416
13861417         // HPC3 DMA: device to host
1387         if ((nHPC_SCSI0DMACtrl & HPC3_DMACTRL_ENABLE) && !(nHPC_SCSI0DMACtrl & HPC3_DMACTRL_DIR))
1418         if ((drvstate->nHPC_SCSI0DMACtrl & HPC3_DMACTRL_ENABLE) && !(drvstate->nHPC_SCSI0DMACtrl & HPC3_DMACTRL_DIR))
13881419         {
13891420            UINT32 wptr, tmpword;
13901421            int words, sptr, twords;
r9683r9684
13921423            words = wd33c93_get_dma_count();
13931424            words /= 4;
13941425
1395            wptr = space->read_dword(nHPC_SCSI0Descriptor);
1426            wptr = space->read_dword(drvstate->nHPC_SCSI0Descriptor);
13961427            sptr = 0;
13971428
13981429//              mame_printf_info("DMA from device: %d words @ %x\n", words, wptr);
13991430
1400            dump_chain(space, nHPC_SCSI0Descriptor);
1431            dump_chain(space, drvstate->nHPC_SCSI0Descriptor);
14011432
14021433            if (words <= (1024/4))
14031434            {
14041435               // one-shot
1405               wd33c93_get_dma_data(wd33c93_get_dma_count(), dma_buffer);
1436               wd33c93_get_dma_data(wd33c93_get_dma_count(), drvstate->dma_buffer);
14061437
14071438               while (words)
14081439               {
1409                  if (nHPC_SCSI0DMACtrl & HPC3_DMACTRL_ENDIAN)
1440                  if (drvstate->nHPC_SCSI0DMACtrl & HPC3_DMACTRL_ENDIAN)
14101441                  {
1411                     tmpword = dma_buffer[sptr+3]<<24 | dma_buffer[sptr+2]<<16 | dma_buffer[sptr+1]<<8 | dma_buffer[sptr];
1442                     tmpword = drvstate->dma_buffer[sptr+3]<<24 | drvstate->dma_buffer[sptr+2]<<16 | drvstate->dma_buffer[sptr+1]<<8 | drvstate->dma_buffer[sptr];
14121443                  }
14131444                  else
14141445                  {
1415                     tmpword = dma_buffer[sptr]<<24 | dma_buffer[sptr+1]<<16 | dma_buffer[sptr+2]<<8 | dma_buffer[sptr+3];
1446                     tmpword = drvstate->dma_buffer[sptr]<<24 | drvstate->dma_buffer[sptr+1]<<16 | drvstate->dma_buffer[sptr+2]<<8 | drvstate->dma_buffer[sptr+3];
14161447                  }
14171448
14181449                  space->write_dword(wptr, tmpword);
r9683r9684
14251456            {
14261457               while (words)
14271458               {
1428                  wd33c93_get_dma_data(512, dma_buffer);
1459                  wd33c93_get_dma_data(512, drvstate->dma_buffer);
14291460                  twords = 512/4;
14301461                  sptr = 0;
14311462
14321463                  while (twords)
14331464                  {
1434                     if (nHPC_SCSI0DMACtrl & HPC3_DMACTRL_ENDIAN)
1465                     if (drvstate->nHPC_SCSI0DMACtrl & HPC3_DMACTRL_ENDIAN)
14351466                     {
1436                        tmpword = dma_buffer[sptr+3]<<24 | dma_buffer[sptr+2]<<16 | dma_buffer[sptr+1]<<8 | dma_buffer[sptr];
1467                        tmpword = drvstate->dma_buffer[sptr+3]<<24 | drvstate->dma_buffer[sptr+2]<<16 | drvstate->dma_buffer[sptr+1]<<8 | drvstate->dma_buffer[sptr];
14371468                     }
14381469                     else
14391470                     {
1440                        tmpword = dma_buffer[sptr]<<24 | dma_buffer[sptr+1]<<16 | dma_buffer[sptr+2]<<8 | dma_buffer[sptr+3];
1471                        tmpword = drvstate->dma_buffer[sptr]<<24 | drvstate->dma_buffer[sptr+1]<<16 | drvstate->dma_buffer[sptr+2]<<8 | drvstate->dma_buffer[sptr+3];
14411472                     }
14421473                     space->write_dword(wptr, tmpword);
14431474
r9683r9684
14561487      }
14571488
14581489      // clear HPC3 DMA active flag
1459      nHPC_SCSI0DMACtrl &= ~HPC3_DMACTRL_ENABLE;
1490      drvstate->nHPC_SCSI0DMACtrl &= ~HPC3_DMACTRL_ENABLE;
14601491
14611492      // set the interrupt
14621493      int3_raise_local0_irq(machine, INT3_LOCAL0_SCSI0);
14631494   }
14641495   else
14651496   {
1466      int3_lower_local0_irq(INT3_LOCAL0_SCSI0);
1497      int3_lower_local0_irq(drvstate, INT3_LOCAL0_SCSI0);
14671498   }
14681499}
14691500
r9683r9684
15001531
15011532static DRIVER_INIT( ip225015 )
15021533{
1534   ip22_state *state = machine->driver_data<ip22_state>();
15031535   static const struct kbdc8042_interface at8042 =
15041536   {
15051537      KBDC8042_STANDARD, NULL, NULL, ip22_get_out2
r9683r9684
15101542   init_pc_common(machine, PCCOMMON_KEYBOARD_AT, NULL);
15111543   kbdc8042_init(machine, &at8042);
15121544
1513   nIOC_ParReadCnt = 0;
1545   state->nIOC_ParReadCnt = 0;
15141546}
15151547
15161548static INPUT_PORTS_START( ip225015 )
r9683r9684
15221554   PORT_INCLUDE( pc_mouse_microsoft )   /* IN12 - IN14 */
15231555INPUT_PORTS_END
15241556
1525static void rtc_update(void)
1557static void rtc_update(ip22_state *state)
15261558{
15271559   RTC_SECONDS++;
15281560
r9683r9684
15881620
15891621static INTERRUPT_GEN( ip22_vbl )
15901622{
1591   nIntCounter++;
1592//  if( nIntCounter == 60 )
1623   ip22_state *state = device->machine->driver_data<ip22_state>();
1624   state->nIntCounter++;
1625//  if( state->nIntCounter == 60 )
15931626   {
1594      nIntCounter = 0;
1595      rtc_update();
1627      state->nIntCounter = 0;
1628      rtc_update(state);
15961629   }
15971630}
15981631
r9683r9684
16211654   DEVCB_NULL /* no idea if the lpt irq is connected and where */
16221655};
16231656
1624static MACHINE_CONFIG_START( ip225015, driver_device )
1657static MACHINE_CONFIG_START( ip225015, ip22_state )
16251658   MDRV_CPU_ADD( "maincpu", R5000BE, 50000000*3 )
16261659   MDRV_CPU_CONFIG( config )
16271660   MDRV_CPU_PROGRAM_MAP( ip225015_map)
src/mess/drivers/mk2.c
r9683r9684
88#include "sound/dac.h"
99#include "mk2.lh"
1010
11
12class mk2_state : public driver_device
13{
14public:
15   mk2_state(running_machine &machine, const driver_device_config_base &config)
16      : driver_device(machine, config) { }
17
18   UINT8 led[5];
19};
20
21
1122/* usage:
1223
1324   under the black keys are operations to be added as first sign
r9683r9684
7586   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("White 8") PORT_CODE(KEYCODE_8)
7687INPUT_PORTS_END
7788
78static UINT8 mk2_led[5];
7989
8090static TIMER_CALLBACK( update_leds )
8191{
92   mk2_state *state = machine->driver_data<mk2_state>();
8293   int i;
8394
8495   for (i=0; i<4; i++)
85   output_set_digit_value(i, mk2_led[i]);
86   output_set_led_value(0, mk2_led[4]&8?1:0);
87   output_set_led_value(1, mk2_led[4]&0x20?1:0);
88   output_set_led_value(2, mk2_led[4]&0x10?1:0);
89   output_set_led_value(3, mk2_led[4]&0x10?0:1);
96   output_set_digit_value(i, state->led[i]);
97   output_set_led_value(0, state->led[4]&8?1:0);
98   output_set_led_value(1, state->led[4]&0x20?1:0);
99   output_set_led_value(2, state->led[4]&0x10?1:0);
100   output_set_led_value(3, state->led[4]&0x10?0:1);
90101
91   mk2_led[0]= mk2_led[1]= mk2_led[2]= mk2_led[3]= mk2_led[4]= 0;
102   state->led[0]= state->led[1]= state->led[2]= state->led[3]= state->led[4]= 0;
92103}
93104
94105static MACHINE_START( mk2 )
r9683r9684
130141
131142static WRITE8_DEVICE_HANDLER( mk2_write_a )
132143{
144   mk2_state *state = device->machine->driver_data<mk2_state>();
133145   int temp = mos6530_portb_out_get(device);
134146
135147   switch(temp&0x3) {
136148   case 0: case 1: case 2: case 3:
137      mk2_led[temp&3]|=data;
149      state->led[temp&3]|=data;
138150   }
139151}
140152
r9683r9684
147159
148160static WRITE8_DEVICE_HANDLER( mk2_write_b )
149161{
162   mk2_state *state = device->machine->driver_data<mk2_state>();
150163   running_device *dac_device = device->machine->device("dac");
151164
152165   if ((data&0x06)==0x06)
153166      dac_data_w(dac_device,data&1?80:0);
154   mk2_led[4]|=data;
167   state->led[4]|=data;
155168
156169   cputag_set_input_line( device->machine, "maincpu", M6502_IRQ_LINE, (data & 0x80) ? CLEAR_LINE : ASSERT_LINE );
157170}
r9683r9684
165178};
166179
167180
168static MACHINE_CONFIG_START( mk2, driver_device )
181static MACHINE_CONFIG_START( mk2, mk2_state )
169182   /* basic machine hardware */
170183   MDRV_CPU_ADD("maincpu", M6502, 1000000)        /* 6504 */
171184   MDRV_CPU_PROGRAM_MAP(mk2_mem)
src/mess/drivers/isbc.c
r9683r9684
1111#include "cpu/i86/i286.h"
1212#include "machine/terminal.h"
1313
14static UINT8 received_char = 0;
1514
15class isbc_state : public driver_device
16{
17public:
18   isbc_state(running_machine &machine, const driver_device_config_base &config)
19      : driver_device(machine, config) { }
20
21   UINT8 received_char;
22};
23
24
25
1626static WRITE16_HANDLER(isbc_terminal_w)
1727{
1828   running_device *devconf = space->machine->device("terminal");
r9683r9684
2131
2232static READ16_HANDLER(isbc_terminal_status_r)
2333{
24   if (received_char!=0) return 3; // char received
34   isbc_state *state = space->machine->driver_data<isbc_state>();
35   if (state->received_char!=0) return 3; // char received
2536   return 1; // ready
2637}
2738
2839static READ16_HANDLER(isbc_terminal_r)
2940{
30   UINT8 retVal = received_char;
31   received_char = 0;
41   isbc_state *state = space->machine->driver_data<isbc_state>();
42   UINT8 retVal = state->received_char;
43   state->received_char = 0;
3244   return retVal;
3345}
3446
r9683r9684
8294
8395static MACHINE_RESET(isbc)
8496{
85   received_char = 0;
97   isbc_state *state = machine->driver_data<isbc_state>();
98   state->received_char = 0;
8699}
87100
88101static WRITE8_DEVICE_HANDLER( isbc_kbd_put )
89102{
90   received_char = data;
103   isbc_state *state = device->machine->driver_data<isbc_state>();
104   state->received_char = data;
91105}
92106
93107static GENERIC_TERMINAL_INTERFACE( isbc_terminal_intf )
r9683r9684
95109   DEVCB_HANDLER(isbc_kbd_put)
96110};
97111
98static MACHINE_CONFIG_START( isbc86, driver_device )
112static MACHINE_CONFIG_START( isbc86, isbc_state )
99113    /* basic machine hardware */
100114    MDRV_CPU_ADD("maincpu", I8086, XTAL_9_8304MHz)
101115    MDRV_CPU_PROGRAM_MAP(isbc86_mem)
r9683r9684
108122   MDRV_GENERIC_TERMINAL_ADD(TERMINAL_TAG, isbc_terminal_intf)
109123MACHINE_CONFIG_END
110124
111static MACHINE_CONFIG_START( rpc86, driver_device )
125static MACHINE_CONFIG_START( rpc86, isbc_state )
112126    /* basic machine hardware */
113127    MDRV_CPU_ADD("maincpu", I8086, XTAL_9_8304MHz)
114128    MDRV_CPU_PROGRAM_MAP(rpc86_mem)
r9683r9684
121135   MDRV_GENERIC_TERMINAL_ADD(TERMINAL_TAG, isbc_terminal_intf)
122136MACHINE_CONFIG_END
123137
124static MACHINE_CONFIG_START( isbc286, driver_device )
138static MACHINE_CONFIG_START( isbc286, isbc_state )
125139    /* basic machine hardware */
126140    MDRV_CPU_ADD("maincpu", I80286, XTAL_9_8304MHz)
127141    MDRV_CPU_PROGRAM_MAP(isbc286_mem)
r9683r9684
134148   MDRV_GENERIC_TERMINAL_ADD(TERMINAL_TAG, isbc_terminal_intf)
135149MACHINE_CONFIG_END
136150
137static MACHINE_CONFIG_START( isbc2861, driver_device )
151static MACHINE_CONFIG_START( isbc2861, isbc_state )
138152    /* basic machine hardware */
139153    MDRV_CPU_ADD("maincpu", I80286, XTAL_9_8304MHz)
140154    MDRV_CPU_PROGRAM_MAP(isbc2861_mem)
src/mess/drivers/junior.c
r9683r9684
1111#include "machine/6532riot.h"
1212#include "junior.lh"
1313
14static UINT8      junior_port_a;
15static UINT8      junior_port_b;
16static UINT8      junior_led_time[6];
1714
15class junior_state : public driver_device
16{
17public:
18   junior_state(running_machine &machine, const driver_device_config_base &config)
19      : driver_device(machine, config) { }
1820
21   UINT8 port_a;
22   UINT8 port_b;
23   UINT8 led_time[6];
24};
25
26
27
28
1929 static ADDRESS_MAP_START(junior_mem, ADDRESS_SPACE_PROGRAM, 8)
2030   ADDRESS_MAP_GLOBAL_MASK(0x1FFF)
2131   ADDRESS_MAP_UNMAP_HIGH
r9683r9684
8292
8393static READ8_DEVICE_HANDLER(junior_riot_a_r)
8494{
95   junior_state *state = device->machine->driver_data<junior_state>();
8596   UINT8   data = 0xff;
8697
87   switch( ( junior_port_b >> 1 ) & 0x0f )
98   switch( ( state->port_b >> 1 ) & 0x0f )
8899   {
89100   case 0:
90101      data = input_port_read(device->machine, "LINE0");
r9683r9684
113124
114125static WRITE8_DEVICE_HANDLER(junior_riot_a_w)
115126{
116   UINT8 idx = ( junior_port_b >> 1 ) & 0x0f;
127   junior_state *state = device->machine->driver_data<junior_state>();
128   UINT8 idx = ( state->port_b >> 1 ) & 0x0f;
117129
118   junior_port_a = data;
130   state->port_a = data;
119131
120   if ((idx >= 4 && idx < 10) & ( junior_port_a != 0xff ))
132   if ((idx >= 4 && idx < 10) & ( state->port_a != 0xff ))
121133   {
122      output_set_digit_value( idx-4, junior_port_a ^ 0x7f );
123      junior_led_time[idx - 4] = 10;
134      output_set_digit_value( idx-4, state->port_a ^ 0x7f );
135      state->led_time[idx - 4] = 10;
124136   }
125137}
126138
127139
128140static WRITE8_DEVICE_HANDLER(junior_riot_b_w)
129141{
142   junior_state *state = device->machine->driver_data<junior_state>();
130143   UINT8 newdata = data;
131144   UINT8 idx = ( newdata >> 1 ) & 0x0f;
132145
133   junior_port_b = newdata;
146   state->port_b = newdata;
134147
135   if ((idx >= 4 && idx < 10) & ( junior_port_a != 0xff ))
148   if ((idx >= 4 && idx < 10) & ( state->port_a != 0xff ))
136149   {
137      output_set_digit_value( idx-4, junior_port_a ^ 0x7f );
138      junior_led_time[idx - 4] = 10;
150      output_set_digit_value( idx-4, state->port_a ^ 0x7f );
151      state->led_time[idx - 4] = 10;
139152   }
140153}
141154
r9683r9684
158171
159172static TIMER_CALLBACK( junior_update_leds )
160173{
174   junior_state *state = machine->driver_data<junior_state>();
161175   int i;
162176
163177   for ( i = 0; i < 6; i++ )
164178   {
165      if ( junior_led_time[i] )
166         junior_led_time[i]--;
179      if ( state->led_time[i] )
180         state->led_time[i]--;
167181      else
168182         output_set_digit_value( i, 0 );
169183   }
r9683r9684
172186
173187static MACHINE_START( junior )
174188{
175   state_save_register_item(machine, "junior", NULL, 0, junior_port_a );
176   state_save_register_item(machine, "junior", NULL, 0, junior_port_b );
189   junior_state *state = machine->driver_data<junior_state>();
190   state_save_register_item(machine, "junior", NULL, 0, state->port_a );
191   state_save_register_item(machine, "junior", NULL, 0, state->port_b );
177192   timer_pulse(machine,  ATTOTIME_IN_HZ(50), NULL, 0, junior_update_leds );
178193}
179194
180195
181196static MACHINE_RESET(junior)
182197{
198   junior_state *state = machine->driver_data<junior_state>();
183199   int i;
184200
185201   for ( i = 0; i < 6; i++ )
186202   {
187      junior_led_time[i] = 0;
203      state->led_time[i] = 0;
188204   }
189205}
190206
191207
192static MACHINE_CONFIG_START( junior, driver_device )
208static MACHINE_CONFIG_START( junior, junior_state )
193209    /* basic machine hardware */
194210    MDRV_CPU_ADD("maincpu",M6502, XTAL_1MHz)
195211    MDRV_CPU_PROGRAM_MAP(junior_mem)
src/mess/drivers/psx.c
r9683r9684
2121#include "debugger.h"
2222#include "zlib.h"
2323
24typedef struct
25{
26   int n_shiftin;
27   int n_shiftout;
28   int n_bits;
29   int n_state;
30   int n_byte;
31   int b_lastclock;
32   int b_ack;
33} pad_t;
34
35
36class psx1_state : public psx_state
37{
38public:
39   psx1_state(running_machine &machine, const driver_device_config_base &config)
40      : psx_state(machine, config) { }
41
42   cdrom_file *cdrom;
43   UINT8 *exe_buffer;
44   int exe_size;
45   pad_t m_pad[ 2 ];
46   int cd_param_p;
47   int cd_result_p;
48   int cd_result_c;
49   int cd_result_ready;
50   int cd_reset;
51   UINT8 cd_stat;
52   UINT8 cd_io_status;
53   UINT8 cd_param[8];
54   UINT8 cd_result[8];
55};
56
57
2458#define VERBOSE_LEVEL ( 0 )
2559
2660INLINE void ATTR_PRINTF(3,4) verboselog( running_machine *machine, int n_level, const char *s_fmt, ... )
r9683r9684
3670   }
3771}
3872
39static cdrom_file *psx_cdrom;
40static UINT8 *exe_buffer;
41static int exe_size;
4273
4374static void psxexe_conv32( UINT32 *p_uint32 )
4475{
r9683r9684
393424
394425DIRECT_UPDATE_HANDLER( psx_setopbase )
395426{
427   psx1_state *state = machine->driver_data<psx1_state>();
396428   if( address == 0x80030000 )
397429   {
398430      running_device *cpu = machine->device("maincpu");
399431
400432      cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM)->set_direct_update_handler(direct_update_delegate_create_static(psx_default, *machine));
401433     
402      if( load_psxexe( cpu, exe_buffer, exe_size ) ||
403         load_cpe( cpu, exe_buffer, exe_size ) ||
404         load_psf( cpu, exe_buffer, exe_size ) )
434      if( load_psxexe( cpu, state->exe_buffer, state->exe_size ) ||
435         load_cpe( cpu, state->exe_buffer, state->exe_size ) ||
436         load_psf( cpu, state->exe_buffer, state->exe_size ) )
405437      {
406438/*          DEBUGGER_BREAK; */
407439
r9683r9684
412444         logerror( "psx_exe_load: invalid exe\n" );
413445      }
414446
415      exe_size = 0;
416      free( exe_buffer );
447      state->exe_size = 0;
448      free( state->exe_buffer );
417449   }
418450   return address;
419451}
420452
421453static QUICKLOAD_LOAD( psx_exe_load )
422454{
455   psx1_state *state = image.device().machine->driver_data<psx1_state>();
423456   address_space *space = cputag_get_address_space( image.device().machine, "maincpu", ADDRESS_SPACE_PROGRAM );
424457
425   exe_size = 0;
426   exe_buffer = (UINT8*)malloc( quickload_size );
427   if( exe_buffer == NULL )
458   state->exe_size = 0;
459   state->exe_buffer = (UINT8*)malloc( quickload_size );
460   if( state->exe_buffer == NULL )
428461   {
429462      logerror( "psx_exe_load: out of memory\n" );
430463      return IMAGE_INIT_FAIL;
431464   }
432   if( image.fread( exe_buffer, quickload_size ) != quickload_size )
465   if( image.fread( state->exe_buffer, quickload_size ) != quickload_size )
433466   {
434      free( exe_buffer );
467      free( state->exe_buffer );
435468      return IMAGE_INIT_FAIL;
436469   }
437   exe_size = quickload_size;
470   state->exe_size = quickload_size;
438471   space->set_direct_update_handler(direct_update_delegate_create_static(psx_setopbase, *image.device().machine));
439472
440473   return IMAGE_INIT_PASS;
r9683r9684
457490#define PAD_DATA_OK   ( 0x5a ) /* Z */
458491#define PAD_DATA_IDLE ( 0xff )
459492
460typedef struct
461{
462   int n_shiftin;
463   int n_shiftout;
464   int n_bits;
465   int n_state;
466   int n_byte;
467   int b_lastclock;
468   int b_ack;
469} pad_t;
470static pad_t m_pad[ 2 ];
471
472493static TIMER_CALLBACK(psx_pad_ack)
473494{
495   psx1_state *state = machine->driver_data<psx1_state>();
474496   int n_port = param;
475   pad_t *pad = &m_pad[ n_port];
497   pad_t *pad = &state->m_pad[ n_port ];
476498
477499   if( pad->n_state != PAD_STATE_IDLE )
478500   {
r9683r9684
487509
488510static void psx_pad( running_machine *machine, int n_port, int n_data )
489511{
490   pad_t *pad = &m_pad[ n_port];
512   psx1_state *state = machine->driver_data<psx1_state>();
513   pad_t *pad = &state->m_pad[ n_port ];
491514   int b_sel;
492515   int b_clock;
493516   int b_data;
r9683r9684
626649
627650/* ----------------------------------------------------------------------- */
628651
629static int cd_param_p;
630static int cd_result_p;
631static int cd_result_c;
632static int cd_result_ready;
633652static const int cd_readed = -1;
634static int cd_reset;
635static UINT8 cd_stat;
636static UINT8 cd_io_status;
637static UINT8 cd_param[8];
638static UINT8 cd_result[8];
639653
640654/* ----------------------------------------------------------------------- */
641655
r9683r9684
646660
647661static void psx_cdcmd_nop(running_machine *machine)
648662{
649   cd_stat = 0x02;
663   psx1_state *state = machine->driver_data<psx1_state>();
664   state->cd_stat = 0x02;
650665}
651666
652667static void psx_cdcmd_setloc(running_machine *machine)
r9683r9684
691706
692707static void psx_cdcmd_init(running_machine *machine)
693708{
694   cd_result_p = 0;
695   cd_result_c = 1;
696   cd_stat = 0x02;
697   cd_result[0] = cd_stat;
709   psx1_state *state = machine->driver_data<psx1_state>();
710   state->cd_result_p = 0;
711   state->cd_result_c = 1;
712   state->cd_stat = 0x02;
713   state->cd_result[0] = state->cd_stat;
698714   verboselog(machine, 0, "CD Command: Init: Not fully implemented\n" );
699715}
700716
r9683r9684
755771
756772static void psx_cdcmd_test(running_machine *machine)
757773{
774   psx1_state *state = machine->driver_data<psx1_state>();
758775   static const UINT8 test20[] = { 0x98, 0x06, 0x10, 0xC3 };
759776   static const UINT8 test22[] = { 0x66, 0x6F, 0x72, 0x20, 0x45, 0x75, 0x72, 0x6F };
760777   static const UINT8 test23[] = { 0x43, 0x58, 0x44, 0x32, 0x39 ,0x34, 0x30, 0x51 };
761778
762   switch(cd_param[0]) {
779   switch(state->cd_param[0]) {
763780   case 0x04:   /* read SCEx counter (returned in 1st byte?) */
764781      break;
765782   case 0x05:   /* reset SCEx counter. */
766783      break;
767784   case 0x20:
768      memcpy(cd_result, test20, sizeof(test20));
769      cd_result_p = 0;
770      cd_result_c = sizeof(test20);
785      memcpy(state->cd_result, test20, sizeof(test20));
786      state->cd_result_p = 0;
787      state->cd_result_c = sizeof(test20);
771788      break;
772789   case 0x22:
773      memcpy(cd_result, test22, sizeof(test22));
774      cd_result_p = 0;
775      cd_result_c = sizeof(test22);
790      memcpy(state->cd_result, test22, sizeof(test22));
791      state->cd_result_p = 0;
792      state->cd_result_c = sizeof(test22);
776793      break;
777794   case 0x23:
778      memcpy(cd_result, test23, sizeof(test23));
779      cd_result_p = 0;
780      cd_result_c = sizeof(test23);
795      memcpy(state->cd_result, test23, sizeof(test23));
796      state->cd_result_p = 0;
797      state->cd_result_c = sizeof(test23);
781798      break;
782799   }
783   cd_stat = 3;
800   state->cd_stat = 3;
784801}
785802
786803static void psx_cdcmd_id(running_machine *machine)
r9683r9684
842859
843860static READ32_HANDLER( psx_cd_r )
844861{
862   psx1_state *state = space->machine->driver_data<psx1_state>();
845863   UINT32 result = 0;
846864
847865   if( ACCESSING_BITS_0_7 )
848866   {
849867      logerror( "%08x cd0 read\n", cpu_get_pc(space->cpu) );
850868
851      if (cd_result_ready && cd_result_c)
852         cd_io_status |= 0x20;
869      if (state->cd_result_ready && state->cd_result_c)
870         state->cd_io_status |= 0x20;
853871      else
854         cd_io_status &= ~0x20;
872         state->cd_io_status &= ~0x20;
855873
856874      if (cd_readed == 0)
857         result = cd_io_status | 0x40;
875         result = state->cd_io_status | 0x40;
858876      else
859         result = cd_io_status;
877         result = state->cd_io_status;
860878
861879      /* NPW 21-May-2003 - Seems to expect this on boot */
862880      result |= 0x0f;
r9683r9684
865883   {
866884      logerror( "%08x cd1 read\n", cpu_get_pc(space->cpu) );
867885
868      if (cd_result_ready && cd_result_c)
869         result = ((UINT32) cd_result[cd_result_p]) << 8;
886      if (state->cd_result_ready && state->cd_result_c)
887         result = ((UINT32) state->cd_result[state->cd_result_p]) << 8;
870888
871      if (cd_result_ready)
889      if (state->cd_result_ready)
872890      {
873         cd_result_p++;
874         if (cd_result_p == cd_result_c)
875            cd_result_ready = 0;
891         state->cd_result_p++;
892         if (state->cd_result_p == state->cd_result_c)
893            state->cd_result_ready = 0;
876894      }
877895   }
878896   else if( ACCESSING_BITS_16_23 )
r9683r9684
883901   {
884902      logerror( "%08x cd3 read\n", cpu_get_pc(space->cpu) );
885903
886      result = ((UINT32) cd_stat) << 24;
904      result = ((UINT32) state->cd_stat) << 24;
887905   }
888906   else
889907   {
r9683r9684
894912
895913static WRITE32_HANDLER( psx_cd_w )
896914{
915   psx1_state *state = space->machine->driver_data<psx1_state>();
897916   void (*psx_cdcmd)(running_machine* machine);
898917
899918   if( ACCESSING_BITS_0_7 )
r9683r9684
902921      data = (data >> 0) & 0xff;
903922      logerror( "%08x cd0 write %02x\n", cpu_get_pc(space->cpu), data & 0xff );
904923
905      cd_param_p = 0;
924      state->cd_param_p = 0;
906925      if (data == 0x00)
907926      {
908         cd_result_ready = 0;
927         state->cd_result_ready = 0;
909928      }
910929      else
911930      {
912931         if (data & 0x01)
913            cd_result_ready = 1;
932            state->cd_result_ready = 1;
914933         if (data == 0x01)
915            cd_reset = 1;
934            state->cd_reset = 1;
916935      }
917936   }
918937   else if( ACCESSING_BITS_8_15 )
r9683r9684
937956      data = (data >> 16) & 0xff;
938957      logerror( "%08x cd2 write %02x\n", cpu_get_pc(space->cpu), data & 0xff );
939958
940      if ((cd_reset == 2) && (data == 0x07))
959      if ((state->cd_reset == 2) && (data == 0x07))
941960      {
942961         /* copied from SOPE; this code is weird */
943         cd_param_p = 0;
944         cd_result_ready = 1;
945         cd_reset = 0;
946         cd_stat = 0;
947         cd_io_status = 0x00;
948         if (cd_result_ready && cd_result_c)
949            cd_io_status |= 0x20;
962         state->cd_param_p = 0;
963         state->cd_result_ready = 1;
964         state->cd_reset = 0;
965         state->cd_stat = 0;
966         state->cd_io_status = 0x00;
967         if (state->cd_result_ready && state->cd_result_c)
968            state->cd_io_status |= 0x20;
950969         else
951            cd_io_status &= ~0x20;
970            state->cd_io_status &= ~0x20;
952971      }
953972      else
954973      {
955974         /* used for sending arguments */
956         cd_reset = 0;
957         cd_param[cd_param_p] = data;
958         if (cd_param_p < 7)
959            cd_param_p++;
975         state->cd_reset = 0;
976         state->cd_param[state->cd_param_p] = data;
977         if (state->cd_param_p < 7)
978            state->cd_param_p++;
960979      }
961980   }
962981   else if( ACCESSING_BITS_24_31 )
r9683r9684
965984      data = (data >> 24) & 0xff;
966985      logerror( "%08x cd3 write %02x\n", cpu_get_pc(space->cpu), data & 0xff );
967986
968      if ((data == 0x07) && (cd_reset == 1))
987      if ((data == 0x07) && (state->cd_reset == 1))
969988      {
970         cd_reset = 2;
989         state->cd_reset = 2;
971990/*          psxirq_clear(0x0004); */
972991      }
973992      else
974993      {
975         cd_reset = 0;
994         state->cd_reset = 0;
976995      }
977996   }
978997   else
r9683r9684
10111030
10121031static MACHINE_RESET( psx )
10131032{
1033   psx1_state *state = machine->driver_data<psx1_state>();
10141034   running_device *cdrom_dev = machine->device("cdrom");
10151035   if( cdrom_dev )
10161036   {
1017      psx_cdrom = mess_cd_get_cdrom_file(cdrom_dev);
1037      state->cdrom = mess_cd_get_cdrom_file(cdrom_dev);
10181038   }
10191039
10201040   psx_machine_init(machine);
r9683r9684
10801100   psx_dma_install_write_handler
10811101};
10821102
1083static MACHINE_CONFIG_START( psxntsc, psx_state )
1103static MACHINE_CONFIG_START( psxntsc, psx1_state )
10841104   /* basic machine hardware */
10851105   MDRV_CPU_ADD( "maincpu", PSXCPU, XTAL_67_7376MHz )
10861106   MDRV_CPU_PROGRAM_MAP( psx_map)
r9683r9684
11151135   MDRV_CDROM_ADD("cdrom")
11161136MACHINE_CONFIG_END
11171137
1118static MACHINE_CONFIG_START( psxpal, psx_state )
1138static MACHINE_CONFIG_START( psxpal, psx1_state )
11191139   /* basic machine hardware */
11201140   MDRV_CPU_ADD( "maincpu", PSXCPU, XTAL_67_7376MHz )
11211141   MDRV_CPU_PROGRAM_MAP( psx_map)
src/mess/drivers/svi318.c
r9683r9684
298298   MDRV_SOFTWARE_LIST_ADD("cart_list","svi318_cart")
299299MACHINE_CONFIG_END
300300
301static MACHINE_CONFIG_START( svi318, driver_device )
301static MACHINE_CONFIG_START( svi318, svi318_state )
302302   /* Basic machine hardware */
303303   MDRV_CPU_ADD( "maincpu", Z80, 3579545 )   /* 3.579545 MHz */
304304   MDRV_CPU_PROGRAM_MAP( svi318_mem)
r9683r9684
404404   GFXDECODE_ENTRY( "gfx1", 0x0000, svi328_charlayout, 0, 9 )
405405GFXDECODE_END
406406
407static MACHINE_CONFIG_START( svi328_806, driver_device )
407static MACHINE_CONFIG_START( svi328_806, svi318_state )
408408   /* Basic machine hardware */
409409   MDRV_CPU_ADD( "maincpu", Z80, 3579545 )   /* 3.579545 MHz */
410410   MDRV_CPU_PROGRAM_MAP( svi328_806_mem)
src/mess/drivers/sage2.c
r9683r9684
1515#include "machine/msm8251.h"
1616#include "machine/terminal.h"
1717
18static UINT16* sage2_ram;
1918
19class sage2_state : public driver_device
20{
21public:
22   sage2_state(running_machine &machine, const driver_device_config_base &config)
23      : driver_device(machine, config) { }
24
25   UINT16* ram;
26};
27
28
29
2030static ADDRESS_MAP_START(sage2_mem, ADDRESS_SPACE_PROGRAM, 16)
2131   ADDRESS_MAP_UNMAP_HIGH
22   AM_RANGE(0x00000000, 0x0007ffff) AM_RAM AM_BASE(&sage2_ram) // 512 KB RAM / ROM at boot
32   AM_RANGE(0x00000000, 0x0007ffff) AM_RAM AM_BASE_MEMBER(sage2_state, ram) // 512 KB RAM / ROM at boot
2333   AM_RANGE(0x00fe0000, 0x00feffff) AM_ROM AM_REGION("user1",0)
2434//  AM_RANGE(0x00ffc070, 0x00ffc071 ) AM_DEVREADWRITE8("uart", msm8251_data_r,msm8251_data_w, 0xffff)
2535//  AM_RANGE(0x00ffc072, 0x00ffc073 ) AM_DEVREADWRITE8("uart", msm8251_status_r,msm8251_control_w, 0xffff)
r9683r9684
3343
3444static MACHINE_RESET(sage2)
3545{
46   sage2_state *state = machine->driver_data<sage2_state>();
3647   UINT8* user1 = memory_region(machine, "user1");
3748
38   memcpy((UINT8*)sage2_ram,user1,0x2000);
49   memcpy((UINT8*)state->ram,user1,0x2000);
3950
4051   machine->device("maincpu")->reset();
4152}
r9683r9684
4960   DEVCB_HANDLER(sage2_kbd_put)
5061};
5162
52static MACHINE_CONFIG_START( sage2, driver_device )
63static MACHINE_CONFIG_START( sage2, sage2_state )
5364    /* basic machine hardware */
5465    MDRV_CPU_ADD("maincpu",M68000, XTAL_8MHz)
5566    MDRV_CPU_PROGRAM_MAP(sage2_mem)
src/mess/drivers/k8915.c
r9683r9684
99#include "emu.h"
1010#include "cpu/z80/z80.h"
1111
12static UINT8 *k8915_ram;
1312
13class k8915_state : public driver_device
14{
15public:
16   k8915_state(running_machine &machine, const driver_device_config_base &config)
17      : driver_device(machine, config) { }
18
19   UINT8 *ram;
20};
21
22
23
1424static ADDRESS_MAP_START(k8915_mem, ADDRESS_SPACE_PROGRAM, 8)
1525   ADDRESS_MAP_UNMAP_HIGH
16   AM_RANGE(0x0000, 0xffff) AM_RAM AM_BASE(&k8915_ram)
26   AM_RANGE(0x0000, 0xffff) AM_RAM AM_BASE_MEMBER(k8915_state, ram)
1727ADDRESS_MAP_END
1828
1929static ADDRESS_MAP_START( k8915_io, ADDRESS_SPACE_IO, 8 )
r9683r9684
2636
2737static MACHINE_RESET(k8915)
2838{
39   k8915_state *state = machine->driver_data<k8915_state>();
2940   UINT8* bios = memory_region(machine, "maincpu");
30   memcpy(k8915_ram,bios, 0x1000);
41   memcpy(state->ram,bios, 0x1000);
3142}
3243
3344static VIDEO_START( k8915 )
r9683r9684
3950   return 0;
4051}
4152
42static MACHINE_CONFIG_START( k8915, driver_device )
53static MACHINE_CONFIG_START( k8915, k8915_state )
4354    /* basic machine hardware */
4455    MDRV_CPU_ADD("maincpu", Z80, XTAL_16MHz / 4)
4556    MDRV_CPU_PROGRAM_MAP(k8915_mem)
src/mess/drivers/k1003.c
r9683r9684
1010#include "cpu/i8008/i8008.h"
1111#include "k1003.lh"
1212
13
14class k1003_state : public driver_device
15{
16public:
17   k1003_state(running_machine &machine, const driver_device_config_base &config)
18      : driver_device(machine, config) { }
19
20   UINT8 disp_1;
21   UINT8 disp_2;
22};
23
24
1325static ADDRESS_MAP_START(k1003_mem, ADDRESS_SPACE_PROGRAM, 8)
1426   AM_RANGE(0x0000,0x07ff) AM_ROM
1527   AM_RANGE(0x0800,0x17ff) AM_RAM
r9683r9684
2941   return 0x00;
3042}
3143
32static UINT8 disp_1;
33static UINT8 disp_2;
3444
3545static WRITE8_HANDLER (disp_1_w)
3646{
37   disp_1 = data;
47   k1003_state *state = space->machine->driver_data<k1003_state>();
48   state->disp_1 = data;
3849}
3950
4051static WRITE8_HANDLER (disp_2_w)
4152{
42   disp_2 = data;
53   k1003_state *state = space->machine->driver_data<k1003_state>();
54   state->disp_2 = data;
4355}
4456
4557static UINT8 bit_to_dec(UINT8 val) {
r9683r9684
5567}
5668static WRITE8_HANDLER (disp_w)
5769{
58   output_set_digit_value(bit_to_dec(data)*2,   disp_1);
59   output_set_digit_value(bit_to_dec(data)*2+1, disp_2);
70   k1003_state *state = space->machine->driver_data<k1003_state>();
71   output_set_digit_value(bit_to_dec(data)*2,   state->disp_1);
72   output_set_digit_value(bit_to_dec(data)*2+1, state->disp_2);
6073}
6174
6275static ADDRESS_MAP_START( k1003_io , ADDRESS_SPACE_IO, 8)
r9683r9684
7891{
7992}
8093
81static MACHINE_CONFIG_START( k1003, driver_device )
94static MACHINE_CONFIG_START( k1003, k1003_state )
8295    /* basic machine hardware */
8396    MDRV_CPU_ADD("maincpu",I8008, 800000)
8497    MDRV_CPU_PROGRAM_MAP(k1003_mem)
src/mess/drivers/sgi_ip2.c
r9683r9684
4848#include "machine/68681.h" /* DUART0, DUART1 */
4949#include "machine/terminal.h"
5050
51
52class sgi_ip2_state : public driver_device
53{
54public:
55   sgi_ip2_state(running_machine &machine, const driver_device_config_base &config)
56      : driver_device(machine, config) { }
57
58   UINT8 mbut;
59   UINT16 mquad;
60   UINT32 *ptmap;
61   UINT16 tdbase;
62   UINT16 tdlmt;
63   UINT16 stkbase;
64   UINT16 stklmt;
65   UINT32 *mainram;
66   UINT32 *bss;
67};
68
69
5170#define VERBOSE_LEVEL ( 0 )
5271
5372#define ENABLE_VERBOSE_LOG (0)
r9683r9684
7998#define BOARD_REV1      0x60   /* Board revision - #1 */
8099#define BOARD_REV2      0x50   /* Board revision - #2 */
81100
82static UINT8 sgi_ip2_mbut;
83101
84102static READ8_HANDLER(sgi_ip2_m_but_r)
85103{
86   verboselog(space->machine, 0, "sgi_ip2_m_but_r: %02x\n", sgi_ip2_mbut | BOARD_REV1);
87   return sgi_ip2_mbut | BOARD_REV1;
104   sgi_ip2_state *state = space->machine->driver_data<sgi_ip2_state>();
105   verboselog(space->machine, 0, "sgi_ip2_m_but_r: %02x\n", state->mbut | BOARD_REV1);
106   return state->mbut | BOARD_REV1;
88107}
89108
90109static WRITE8_HANDLER(sgi_ip2_m_but_w)
91110{
111   sgi_ip2_state *state = space->machine->driver_data<sgi_ip2_state>();
92112   verboselog(space->machine, 0, "sgi_ip2_m_but_w: %02x\n", data);
93   sgi_ip2_mbut = data;
113   state->mbut = data;
94114}
95115
96116#define MOUSE_XFIRE      0x01   /* X Quadrature Fired, active low */
r9683r9684
98118#define MOUSE_YFIRE      0x04   /* Y Quadrature Fired, active low */
99119#define MOUSE_YCHANGE   0x08   /* MOUSE_YCHANGE ? y-- : y++ */
100120
101static UINT16 sgi_ip2_mquad;
102121
103122static READ16_HANDLER(sgi_ip2_m_quad_r)
104123{
105   verboselog(space->machine, 0, "sgi_ip2_m_quad_r: %04x\n", sgi_ip2_mquad);
106   return sgi_ip2_mquad;
124   sgi_ip2_state *state = space->machine->driver_data<sgi_ip2_state>();
125   verboselog(space->machine, 0, "sgi_ip2_m_quad_r: %04x\n", state->mquad);
126   return state->mquad;
107127}
108128
109129static WRITE16_HANDLER(sgi_ip2_m_quad_w)
110130{
131   sgi_ip2_state *state = space->machine->driver_data<sgi_ip2_state>();
111132   verboselog(space->machine, 0, "sgi_ip2_m_quad_w = %04x & %04x\n", data, mem_mask);
112   COMBINE_DATA(&sgi_ip2_mquad);
133   COMBINE_DATA(&state->mquad);
113134}
114135
115136static READ16_HANDLER(sgi_ip2_swtch_r)
r9683r9684
238259   sgi_ip2_mbp = data;
239260}
240261
241static UINT32 *sgi_ip2_ptmap;
242262
243263static READ32_HANDLER(sgi_ip2_ptmap_r)
244264{
245   verboselog(space->machine, 0, "sgi_ip2_ptmap_r: %08x = %08x & %08x\n", 0x3b000000 + (offset << 2), sgi_ip2_ptmap[offset], mem_mask);
246   return sgi_ip2_ptmap[offset];
265   sgi_ip2_state *state = space->machine->driver_data<sgi_ip2_state>();
266   verboselog(space->machine, 0, "sgi_ip2_ptmap_r: %08x = %08x & %08x\n", 0x3b000000 + (offset << 2), state->ptmap[offset], mem_mask);
267   return state->ptmap[offset];
247268}
248269
249270static WRITE32_HANDLER(sgi_ip2_ptmap_w)
250271{
272   sgi_ip2_state *state = space->machine->driver_data<sgi_ip2_state>();
251273   verboselog(space->machine, 0, "sgi_ip2_ptmap_w: %08x = %08x & %08x\n", 0x3b000000 + (offset << 2), data, mem_mask);
252   COMBINE_DATA(&sgi_ip2_ptmap[offset]);
274   COMBINE_DATA(&state->ptmap[offset]);
253275}
254276
255static UINT16 sgi_ip2_tdbase;
256277
257278static READ16_HANDLER(sgi_ip2_tdbase_r)
258279{
259   verboselog(space->machine, 0, "sgi_ip2_tdbase_r: %04x\n", sgi_ip2_tdbase);
260   return sgi_ip2_tdbase;
280   sgi_ip2_state *state = space->machine->driver_data<sgi_ip2_state>();
281   verboselog(space->machine, 0, "sgi_ip2_tdbase_r: %04x\n", state->tdbase);
282   return state->tdbase;
261283}
262284
263285static WRITE16_HANDLER(sgi_ip2_tdbase_w)
264286{
287   sgi_ip2_state *state = space->machine->driver_data<sgi_ip2_state>();
265288   verboselog(space->machine, 0, "sgi_ip2_tdbase_w: %04x & %04x\n", data, mem_mask);
266   COMBINE_DATA(&sgi_ip2_tdbase);
289   COMBINE_DATA(&state->tdbase);
267290}
268291
269static UINT16 sgi_ip2_tdlmt;
270292
271293static READ16_HANDLER(sgi_ip2_tdlmt_r)
272294{
273   verboselog(space->machine, 0, "sgi_ip2_tdlmt_r: %04x\n", sgi_ip2_tdlmt);
274   return sgi_ip2_tdlmt;
295   sgi_ip2_state *state = space->machine->driver_data<sgi_ip2_state>();
296   verboselog(space->machine, 0, "sgi_ip2_tdlmt_r: %04x\n", state->tdlmt);
297   return state->tdlmt;
275298}
276299
277300static WRITE16_HANDLER(sgi_ip2_tdlmt_w)
278301{
302   sgi_ip2_state *state = space->machine->driver_data<sgi_ip2_state>();
279303   verboselog(space->machine, 0, "sgi_ip2_tdlmt_w: %04x & %04x\n", data, mem_mask);
280   COMBINE_DATA(&sgi_ip2_tdlmt);
304   COMBINE_DATA(&state->tdlmt);
281305}
282306
283static UINT16 sgi_ip2_stkbase;
284307
285308static READ16_HANDLER(sgi_ip2_stkbase_r)
286309{
287   verboselog(space->machine, 0, "sgi_ip2_stkbase_r: %04x\n", sgi_ip2_stkbase);
288   return sgi_ip2_stkbase;
310   sgi_ip2_state *state = space->machine->driver_data<sgi_ip2_state>();
311   verboselog(space->machine, 0, "sgi_ip2_stkbase_r: %04x\n", state->stkbase);
312   return state->stkbase;
289313}
290314
291315static WRITE16_HANDLER(sgi_ip2_stkbase_w)
292316{
317   sgi_ip2_state *state = space->machine->driver_data<sgi_ip2_state>();
293318   verboselog(space->machine, 0, "sgi_ip2_stkbase_w: %04x & %04x\n", data, mem_mask);
294   COMBINE_DATA(&sgi_ip2_stkbase);
319   COMBINE_DATA(&state->stkbase);
295320}
296321
297static UINT16 sgi_ip2_stklmt;
298322
299323static READ16_HANDLER(sgi_ip2_stklmt_r)
300324{
301   verboselog(space->machine, 0, "sgi_ip2_stklmt_r: %04x\n", sgi_ip2_stklmt);
302   return sgi_ip2_stklmt;
325   sgi_ip2_state *state = space->machine->driver_data<sgi_ip2_state>();
326   verboselog(space->machine, 0, "sgi_ip2_stklmt_r: %04x\n", state->stklmt);
327   return state->stklmt;
303328}
304329
305330static WRITE16_HANDLER(sgi_ip2_stklmt_w)
306331{
332   sgi_ip2_state *state = space->machine->driver_data<sgi_ip2_state>();
307333   verboselog(space->machine, 0, "sgi_ip2_stklmt_w: %04x & %04x\n", data, mem_mask);
308   COMBINE_DATA(&sgi_ip2_stklmt);
334   COMBINE_DATA(&state->stklmt);
309335}
310336
311337static WRITE8_DEVICE_HANDLER( sgi_kbd_put )
r9683r9684
335361    ADDRESS MAPS
336362***************************************************************************/
337363
338static UINT32 *mainram;
339static UINT32 *bss;
340364
341365static ADDRESS_MAP_START(sgi_ip2_map, ADDRESS_SPACE_PROGRAM, 32)
342   AM_RANGE(0x00000000, 0x00ffffff) AM_RAM AM_BASE(&mainram)
343   AM_RANGE(0x02100000, 0x0210ffff) AM_RAM AM_BASE(&bss) // ??? I don't understand the need for this...
366   AM_RANGE(0x00000000, 0x00ffffff) AM_RAM AM_BASE_MEMBER(sgi_ip2_state, mainram)
367   AM_RANGE(0x02100000, 0x0210ffff) AM_RAM AM_BASE_MEMBER(sgi_ip2_state, bss) // ??? I don't understand the need for this...
344368   AM_RANGE(0x30000000, 0x30017fff) AM_ROM AM_REGION("user1", 0)
345369   AM_RANGE(0x30800000, 0x30800003) AM_READWRITE8(sgi_ip2_m_but_r,       sgi_ip2_m_but_w,      0xffffffff)
346370   AM_RANGE(0x31000000, 0x31000003) AM_READWRITE16(sgi_ip2_m_quad_r,      sgi_ip2_m_quad_w,      0xffffffff)
r9683r9684
354378   AM_RANGE(0x38000000, 0x38000003) AM_READWRITE16(sgi_ip2_status_r,      sgi_ip2_status_w,      0xffffffff)
355379   AM_RANGE(0x39000000, 0x39000003) AM_READWRITE8(sgi_ip2_parctl_r,      sgi_ip2_parctl_w,      0xffffffff)
356380   AM_RANGE(0x3a000000, 0x3a000003) AM_READWRITE8(sgi_ip2_mbp_r,         sgi_ip2_mbp_w,         0xffffffff)
357   AM_RANGE(0x3b000000, 0x3b003fff) AM_READWRITE(sgi_ip2_ptmap_r, sgi_ip2_ptmap_w) AM_BASE(&sgi_ip2_ptmap)
381   AM_RANGE(0x3b000000, 0x3b003fff) AM_READWRITE(sgi_ip2_ptmap_r, sgi_ip2_ptmap_w) AM_BASE_MEMBER(sgi_ip2_state, ptmap)
358382   AM_RANGE(0x3c000000, 0x3c000003) AM_READWRITE16(sgi_ip2_tdbase_r,      sgi_ip2_tdbase_w,      0xffffffff)
359383   AM_RANGE(0x3d000000, 0x3d000003) AM_READWRITE16(sgi_ip2_tdlmt_r,      sgi_ip2_tdlmt_w,      0xffffffff)
360384   AM_RANGE(0x3e000000, 0x3e000003) AM_READWRITE16(sgi_ip2_stkbase_r,      sgi_ip2_stkbase_w,      0xffffffff)
r9683r9684
427451   duartb_output
428452};
429453
430static MACHINE_CONFIG_START( sgi_ip2, driver_device )
454static MACHINE_CONFIG_START( sgi_ip2, sgi_ip2_state )
431455   /* basic machine hardware */
432456   MDRV_CPU_ADD("maincpu", M68020, 16000000)
433457   MDRV_CPU_PROGRAM_MAP(sgi_ip2_map)
r9683r9684
501525
502526static DRIVER_INIT( sgi_ip2 )
503527{
528   sgi_ip2_state *state = machine->driver_data<sgi_ip2_state>();
504529   UINT32 *src = (UINT32*)memory_region(machine, "user1");
505   UINT32 *dst = mainram;
530   UINT32 *dst = state->mainram;
506531   memcpy(dst, src, 8);
507532
508533   machine->device("maincpu")->reset();
src/mess/drivers/sym1.c
r9683r9684
2424
2525
2626/* pointers to memory locations */
27UINT8 *sym1_monitor;
28static UINT8 *sym1_ram_1k;
29static UINT8 *sym1_ram_2k;
30static UINT8 *sym1_ram_3k;
31static UINT8 *sym1_riot_ram;
3227
3328
3429
r9683r9684
3934
4035static ADDRESS_MAP_START( sym1_map, ADDRESS_SPACE_PROGRAM, 8 )
4136   AM_RANGE(0x0000, 0x03ff) AM_RAM                              /* U12/U13 RAM */
42   AM_RANGE(0x0400, 0x07ff) AM_RAMBANK("bank2") AM_BASE(&sym1_ram_1k)
43   AM_RANGE(0x0800, 0x0bff) AM_RAMBANK("bank3") AM_BASE(&sym1_ram_2k)
44   AM_RANGE(0x0c00, 0x0fff) AM_RAMBANK("bank4") AM_BASE(&sym1_ram_3k)
45   AM_RANGE(0x8000, 0x8fff) AM_ROM AM_BASE(&sym1_monitor)       /* U20 Monitor ROM */
37   AM_RANGE(0x0400, 0x07ff) AM_RAMBANK("bank2") AM_BASE_MEMBER(sym1_state, ram_1k)
38   AM_RANGE(0x0800, 0x0bff) AM_RAMBANK("bank3") AM_BASE_MEMBER(sym1_state, ram_2k)
39   AM_RANGE(0x0c00, 0x0fff) AM_RAMBANK("bank4") AM_BASE_MEMBER(sym1_state, ram_3k)
40   AM_RANGE(0x8000, 0x8fff) AM_ROM AM_BASE_MEMBER(sym1_state, monitor)       /* U20 Monitor ROM */
4641   AM_RANGE(0xa000, 0xa00f) AM_DEVREADWRITE_MODERN("via6522_0", via6522_device, read, write)      /* U25 VIA #1 */
4742   AM_RANGE(0xa400, 0xa40f) AM_DEVREADWRITE("riot", riot6532_r, riot6532_w)  /* U27 RIOT */
48   AM_RANGE(0xa600, 0xa67f) AM_RAMBANK("bank5") AM_BASE(&sym1_riot_ram)  /* U27 RIOT RAM */
43   AM_RANGE(0xa600, 0xa67f) AM_RAMBANK("bank5") AM_BASE_MEMBER(sym1_state, riot_ram)  /* U27 RIOT RAM */
4944   AM_RANGE(0xa800, 0xa80f) AM_DEVREADWRITE_MODERN("via6522_1", via6522_device, read, write)      /* U28 VIA #2 */
5045   AM_RANGE(0xac00, 0xac0f) AM_DEVREADWRITE_MODERN("via6522_2", via6522_device, read, write)      /* U29 VIA #3 */
5146   AM_RANGE(0xb000, 0xefff) AM_ROM
r9683r9684
122117******************************************************************************/
123118
124119
125static MACHINE_CONFIG_START( sym1, driver_device )
120static MACHINE_CONFIG_START( sym1, sym1_state )
126121   /* basic machine hardware */
127122   MDRV_CPU_ADD("maincpu", M6502, SYM1_CLOCK)  /* 1 MHz */
128123   MDRV_CPU_PROGRAM_MAP(sym1_map)
src/mess/drivers/vector4.c
r9683r9684
1010#include "cpu/z80/z80.h"
1111#include "machine/terminal.h"
1212
13static UINT8 received_char = 0;
1413
14class vector4_state : public driver_device
15{
16public:
17   vector4_state(running_machine &machine, const driver_device_config_base &config)
18      : driver_device(machine, config) { }
19
20   UINT8 received_char;
21};
22
23
24
1525static WRITE8_HANDLER(vector_terminal_w)
1626{
1727   running_device *devconf = space->machine->device("terminal");
r9683r9684
2030
2131static READ8_HANDLER(vector_terminal_status_r)
2232{
23   if (received_char!=0) return 3; // char received
33   vector4_state *state = space->machine->driver_data<vector4_state>();
34   if (state->received_char!=0) return 3; // char received
2435   return 1; // ready
2536}
2637
2738static READ8_HANDLER(vector_terminal_r)
2839{
29   UINT8 retVal = received_char;
30   received_char = 0;
40   vector4_state *state = space->machine->driver_data<vector4_state>();
41   UINT8 retVal = state->received_char;
42   state->received_char = 0;
3143   return retVal;
3244}
3345
r9683r9684
5567
5668static MACHINE_RESET(vector4)
5769{
58   received_char = 0;
70   vector4_state *state = machine->driver_data<vector4_state>();
71   state->received_char = 0;
5972   cpu_set_reg(machine->device("maincpu"), Z80_PC, 0xe000);
6073}
6174
6275static WRITE8_DEVICE_HANDLER( vector4_kbd_put )
6376{
64   received_char = data;
77   vector4_state *state = device->machine->driver_data<vector4_state>();
78   state->received_char = data;
6579}
6680
6781static GENERIC_TERMINAL_INTERFACE( vector4_terminal_intf )
r9683r9684
7084};
7185
7286
73static MACHINE_CONFIG_START( vector4, driver_device )
87static MACHINE_CONFIG_START( vector4, vector4_state )
7488    /* basic machine hardware */
7589    MDRV_CPU_ADD("maincpu",Z80, XTAL_4MHz)
7690    MDRV_CPU_PROGRAM_MAP(vector4_mem)
src/mess/drivers/partner.c
r9683r9684
186186GFXDECODE_END
187187
188188
189static MACHINE_CONFIG_START( partner, driver_device )
189static MACHINE_CONFIG_START( partner, partner_state )
190190    /* basic machine hardware */
191191    MDRV_CPU_ADD("maincpu", I8080, XTAL_16MHz / 9)
192192    MDRV_CPU_PROGRAM_MAP(partner_mem)
src/mess/drivers/pegasus.c
r9683r9684
3636#include "devices/cassette.h"
3737#include "includes/pegasus.h"
3838
39static UINT8 pegasus_kbd_row = 0;
40static UINT8 pegasus_kbd_irq;
4139UINT8 pegasus_control_bits = 0;
42static running_device *pegasus_cass;
43static UINT8 *FNT;
4440
4541static TIMER_DEVICE_CALLBACK( pegasus_firq )
4642{
r9683r9684
5551
5652static READ8_DEVICE_HANDLER( pegasus_keyboard_r )
5753{
54   pegasus_state *state = device->machine->driver_data<pegasus_state>();
5855   static const char *const keynames[] = { "X0", "X1", "X2", "X3", "X4", "X5", "X6", "X7" };
5956   UINT8 bit,data = 0xff;
6057   for (bit = 0; bit < 8; bit++)
61      if (!BIT(pegasus_kbd_row, bit)) data &= input_port_read(device->machine, keynames[bit]);
58      if (!BIT(state->kbd_row, bit)) data &= input_port_read(device->machine, keynames[bit]);
6259
63   pegasus_kbd_irq = (data == 0xff) ? 1 : 0;
64   if (pegasus_control_bits & 8) data<<=4;
60   state->kbd_irq = (data == 0xff) ? 1 : 0;
61   if (state->control_bits & 8) data<<=4;
6562   return data;
6663}
6764
6865static WRITE8_DEVICE_HANDLER( pegasus_keyboard_w )
6966{
70   pegasus_kbd_row = data;
67   pegasus_state *state = device->machine->driver_data<pegasus_state>();
68   state->kbd_row = data;
7169}
7270
7371static WRITE8_DEVICE_HANDLER( pegasus_controls )
7472{
73   pegasus_state *state = device->machine->driver_data<pegasus_state>();
7574/*  d0,d2 - not emulated
7675    d0 - Blank - Video blanking
7776    d1 - Char - select character rom or ram
r9683r9684
7978    d3 - Asc - Select which half of the keyboard to read
8079*/
8180
82   pegasus_control_bits = data;
81   state->control_bits = data;
8382}
8483
8584static READ_LINE_DEVICE_HANDLER( pegasus_keyboard_irq )
8685{
87   return pegasus_kbd_irq;
86   pegasus_state *state = device->machine->driver_data<pegasus_state>();
87   return state->kbd_irq;
8888}
8989
9090static READ_LINE_DEVICE_HANDLER( pegasus_cassette_r )
9191{
92   return cassette_input(pegasus_cass);
92   pegasus_state *state = device->machine->driver_data<pegasus_state>();
93   return cassette_input(state->cass);
9394}
9495
9596static WRITE_LINE_DEVICE_HANDLER( pegasus_cassette_w )
9697{
97   cassette_output(pegasus_cass, state ? 1 : -1);
98   pegasus_state *drvstate = device->machine->driver_data<pegasus_state>();
99   cassette_output(drvstate->cass, state ? 1 : -1);
98100}
99101
100102static READ8_HANDLER( pegasus_pcg_r )
101103{
102   UINT8 code = pegasus_video_ram[offset] & 0x7f;
103   return FNT[(code << 4) | (~pegasus_kbd_row & 15)];
104   pegasus_state *state = space->machine->driver_data<pegasus_state>();
105   UINT8 code = state->video_ram[offset] & 0x7f;
106   return state->FNT[(code << 4) | (~state->kbd_row & 15)];
104107}
105108
106109static WRITE8_HANDLER( pegasus_pcg_w )
107110{
108//  if (pegasus_control_bits & 2)
111   pegasus_state *state = space->machine->driver_data<pegasus_state>();
112//  if (state->control_bits & 2)
109113   {
110      UINT8 code = pegasus_video_ram[offset] & 0x7f;
111      FNT[(code << 4) | (~pegasus_kbd_row & 15)] = data;
114      UINT8 code = state->video_ram[offset] & 0x7f;
115      state->FNT[(code << 4) | (~state->kbd_row & 15)] = data;
112116   }
113117}
114118
r9683r9684
124128   ADDRESS_MAP_UNMAP_HIGH
125129   AM_RANGE(0x0000, 0x2fff) AM_ROM
126130   AM_RANGE(0xb000, 0xbdff) AM_RAM
127   AM_RANGE(0xbe00, 0xbfff) AM_RAM AM_BASE(&pegasus_video_ram)
131   AM_RANGE(0xbe00, 0xbfff) AM_RAM AM_BASE_MEMBER(pegasus_state, video_ram)
128132   AM_RANGE(0xc000, 0xdfff) AM_ROM AM_WRITENOP
129133   AM_RANGE(0xe000, 0xe1ff) AM_READ(pegasus_protection_r)
130134   AM_RANGE(0xe200, 0xe3ff) AM_READWRITE(pegasus_pcg_r,pegasus_pcg_w)
r9683r9684
137141   ADDRESS_MAP_UNMAP_HIGH
138142   AM_RANGE(0x0000, 0x2fff) AM_ROM
139143   AM_RANGE(0x5000, 0xbdff) AM_RAM
140   AM_RANGE(0xbe00, 0xbfff) AM_RAM AM_BASE(&pegasus_video_ram)
144   AM_RANGE(0xbe00, 0xbfff) AM_RAM AM_BASE_MEMBER(pegasus_state, video_ram)
141145   AM_RANGE(0xc000, 0xdfff) AM_ROM AM_WRITENOP
142146   AM_RANGE(0xe000, 0xe1ff) AM_READ(pegasus_protection_r)
143147   AM_RANGE(0xe200, 0xe3ff) AM_READWRITE(pegasus_pcg_r,pegasus_pcg_w)
r9683r9684
334338
335339static MACHINE_START( pegasus )
336340{
337   pegasus_cass = machine->device("cassette");
338   FNT = memory_region(machine, "pcg");
341   pegasus_state *state = machine->driver_data<pegasus_state>();
342   state->cass = machine->device("cassette");
343   state->FNT = memory_region(machine, "pcg");
339344}
340345
341346static MACHINE_RESET( pegasus )
342347{
343   pegasus_kbd_row = 0;
344   pegasus_kbd_irq = 1;
345   pegasus_control_bits = 0;
348   pegasus_state *state = machine->driver_data<pegasus_state>();
349   state->kbd_row = 0;
350   state->kbd_irq = 1;
351   state->control_bits = 0;
346352}
347353
348354static DRIVER_INIT( pegasus )
r9683r9684
350356   pegasus_decrypt_rom( machine, 0xf000 );
351357}
352358
353static MACHINE_CONFIG_START( pegasus, driver_device )
359static MACHINE_CONFIG_START( pegasus, pegasus_state )
354360   /* basic machine hardware */
355361   MDRV_CPU_ADD("maincpu", M6809E, XTAL_4MHz)   // actually a 6809C
356362   MDRV_CPU_PROGRAM_MAP(pegasus_mem)
src/mess/drivers/pp01.c
r9683r9684
195195INPUT_PORTS_END
196196
197197/* Machine driver */
198static MACHINE_CONFIG_START( pp01, driver_device )
198static MACHINE_CONFIG_START( pp01, pp01_state )
199199   /* basic machine hardware */
200200   MDRV_CPU_ADD("maincpu", I8080, 2000000)
201201   MDRV_CPU_PROGRAM_MAP(pp01_mem)
src/mess/drivers/ip20.c
r9683r9684
2727#include "devices/harddriv.h"
2828#include "devices/chd_cd.h"
2929
30
31class ip20_state : public driver_device
32{
33public:
34   ip20_state(running_machine &machine, const driver_device_config_base &config)
35      : driver_device(machine, config) { }
36
37   UINT8 nHPC_MiscStatus;
38   UINT32 nHPC_ParBufPtr;
39   UINT32 nHPC_LocalIOReg0Mask;
40   UINT32 nHPC_LocalIOReg1Mask;
41   UINT32 nHPC_VMEIntMask0;
42   UINT32 nHPC_VMEIntMask1;
43   UINT8 nRTC_RAM[32];
44   UINT8 nRTC_Temp;
45   UINT32 nHPC_SCSI0Descriptor;
46   UINT32 nHPC_SCSI0DMACtrl;
47};
48
49
3050#define VERBOSE_LEVEL ( 2 )
3151
3252INLINE void ATTR_PRINTF(3,4) verboselog(running_machine *machine, int n_level, const char *s_fmt, ... )
r9683r9684
6282   "*10011xxxxxxx",   // unlock       100x 11xxxx
6383};
6484
65static UINT8 nHPC_MiscStatus;
66static UINT32 nHPC_ParBufPtr;
67static UINT32 nHPC_LocalIOReg0Mask;
68static UINT32 nHPC_LocalIOReg1Mask;
69static UINT32 nHPC_VMEIntMask0;
70static UINT32 nHPC_VMEIntMask1;
7185
72static UINT8 nRTC_RAM[32];
73static UINT8 nRTC_Temp;
7486
75static UINT32 nHPC_SCSI0Descriptor, nHPC_SCSI0DMACtrl;
7687
77#define RTC_DAYOFWEEK   nRTC_RAM[0x0e]
78#define RTC_YEAR      nRTC_RAM[0x0b]
79#define RTC_MONTH      nRTC_RAM[0x0a]
80#define RTC_DAY         nRTC_RAM[0x09]
81#define RTC_HOUR      nRTC_RAM[0x08]
82#define RTC_MINUTE      nRTC_RAM[0x07]
83#define RTC_SECOND      nRTC_RAM[0x06]
84#define RTC_HUNDREDTH   nRTC_RAM[0x05]
88#define RTC_DAYOFWEEK   state->nRTC_RAM[0x0e]
89#define RTC_YEAR      state->nRTC_RAM[0x0b]
90#define RTC_MONTH      state->nRTC_RAM[0x0a]
91#define RTC_DAY         state->nRTC_RAM[0x09]
92#define RTC_HOUR      state->nRTC_RAM[0x08]
93#define RTC_MINUTE      state->nRTC_RAM[0x07]
94#define RTC_SECOND      state->nRTC_RAM[0x06]
95#define RTC_HUNDREDTH   state->nRTC_RAM[0x05]
8596
8697static READ32_HANDLER( hpc_r )
8798{
99   ip20_state *state = space->machine->driver_data<ip20_state>();
88100   running_device *scc;
89101   running_machine *machine = space->machine;
90102
91103   offset <<= 2;
92104   if( offset >= 0x0e00 && offset <= 0x0e7c )
93105   {
94      verboselog(machine, 2, "RTC RAM[0x%02x] Read: %02x\n", ( offset - 0xe00 ) >> 2, nRTC_RAM[ ( offset - 0xe00 ) >> 2 ] );
95      return nRTC_RAM[ ( offset - 0xe00 ) >> 2 ];
106      verboselog(machine, 2, "RTC RAM[0x%02x] Read: %02x\n", ( offset - 0xe00 ) >> 2, state->nRTC_RAM[ ( offset - 0xe00 ) >> 2 ] );
107      return state->nRTC_RAM[ ( offset - 0xe00 ) >> 2 ];
96108   }
97109   switch( offset )
98110   {
r9683r9684
100112      verboselog(machine, 2, "HPC Unknown Read: %08x (%08x) (returning 0x000000a5 as kludge)\n", 0x1fb80000 + offset, mem_mask );
101113      return 0x0000a500;
102114   case 0x00ac:
103      verboselog(machine, 2, "HPC Parallel Buffer Pointer Read: %08x (%08x)\n", nHPC_ParBufPtr, mem_mask );
104      return nHPC_ParBufPtr;
115      verboselog(machine, 2, "HPC Parallel Buffer Pointer Read: %08x (%08x)\n", state->nHPC_ParBufPtr, mem_mask );
116      return state->nHPC_ParBufPtr;
105117   case 0x00c0:
106118      verboselog(machine, 2, "HPC Endianness Read: %08x (%08x)\n", 0x0000001f, mem_mask );
107119      return 0x0000001f;
r9683r9684
124136         return 0;
125137      }
126138   case 0x01b0:
127      verboselog(machine, 2, "HPC Misc. Status Read: %08x (%08x)\n", nHPC_MiscStatus, mem_mask );
128      return nHPC_MiscStatus;
139      verboselog(machine, 2, "HPC Misc. Status Read: %08x (%08x)\n", state->nHPC_MiscStatus, mem_mask );
140      return state->nHPC_MiscStatus;
129141   case 0x01bc:
130142//      verboselog(machine, 2, "HPC CPU Serial EEPROM Read\n" );
131143      return ( ( eeprom_read_bit(space->machine->device("eeprom")) << 4 ) );
132144   case 0x01c4:
133      verboselog(machine, 2, "HPC Local IO Register 0 Mask Read: %08x (%08x)\n", nHPC_LocalIOReg0Mask, mem_mask );
134      return nHPC_LocalIOReg0Mask;
145      verboselog(machine, 2, "HPC Local IO Register 0 Mask Read: %08x (%08x)\n", state->nHPC_LocalIOReg0Mask, mem_mask );
146      return state->nHPC_LocalIOReg0Mask;
135147   case 0x01cc:
136      verboselog(machine, 2, "HPC Local IO Register 1 Mask Read: %08x (%08x)\n", nHPC_LocalIOReg0Mask, mem_mask );
137      return nHPC_LocalIOReg1Mask;
148      verboselog(machine, 2, "HPC Local IO Register 1 Mask Read: %08x (%08x)\n", state->nHPC_LocalIOReg0Mask, mem_mask );
149      return state->nHPC_LocalIOReg1Mask;
138150   case 0x01d4:
139      verboselog(machine, 2, "HPC VME Interrupt Mask 0 Read: %08x (%08x)\n", nHPC_LocalIOReg0Mask, mem_mask );
140      return nHPC_VMEIntMask0;
151      verboselog(machine, 2, "HPC VME Interrupt Mask 0 Read: %08x (%08x)\n", state->nHPC_LocalIOReg0Mask, mem_mask );
152      return state->nHPC_VMEIntMask0;
141153   case 0x01d8:
142      verboselog(machine, 2, "HPC VME Interrupt Mask 1 Read: %08x (%08x)\n", nHPC_LocalIOReg0Mask, mem_mask );
143      return nHPC_VMEIntMask1;
154      verboselog(machine, 2, "HPC VME Interrupt Mask 1 Read: %08x (%08x)\n", state->nHPC_LocalIOReg0Mask, mem_mask );
155      return state->nHPC_VMEIntMask1;
144156   case 0x0d00:
145157      verboselog(machine, 2, "HPC DUART0 Channel B Control Read\n" );
146158//      return 0x00000004;
r9683r9684
202214
203215static WRITE32_HANDLER( hpc_w )
204216{
217   ip20_state *state = space->machine->driver_data<ip20_state>();
205218   running_device *scc;
206219   running_device *eeprom;
207220   running_machine *machine = space->machine;
r9683r9684
211224   if( offset >= 0x0e00 && offset <= 0x0e7c )
212225   {
213226      verboselog(machine, 2, "RTC RAM[0x%02x] Write: %02x\n", ( offset - 0xe00 ) >> 2, data & 0x000000ff );
214      nRTC_RAM[ ( offset - 0xe00 ) >> 2 ] = data & 0x000000ff;
227      state->nRTC_RAM[ ( offset - 0xe00 ) >> 2 ] = data & 0x000000ff;
215228      switch( ( offset - 0xe00 ) >> 2 )
216229      {
217230      case 0:
218231         break;
219232      case 4:
220         if( !( nRTC_RAM[0x00] & 0x80 ) )
233         if( !( state->nRTC_RAM[0x00] & 0x80 ) )
221234         {
222235            if( data & 0x80 )
223236            {
224               nRTC_RAM[0x19] = RTC_SECOND;
225               nRTC_RAM[0x1a] = RTC_MINUTE;
226               nRTC_RAM[0x1b] = RTC_HOUR;
227               nRTC_RAM[0x1c] = RTC_DAY;
228               nRTC_RAM[0x1d] = RTC_MONTH;
237               state->nRTC_RAM[0x19] = RTC_SECOND;
238               state->nRTC_RAM[0x1a] = RTC_MINUTE;
239               state->nRTC_RAM[0x1b] = RTC_HOUR;
240               state->nRTC_RAM[0x1c] = RTC_DAY;
241               state->nRTC_RAM[0x1d] = RTC_MONTH;
229242            }
230243         }
231244         break;
r9683r9684
235248   switch( offset )
236249   {
237250   case 0x0090:   // SCSI0 next descriptor pointer
238      nHPC_SCSI0Descriptor = data;
251      state->nHPC_SCSI0Descriptor = data;
239252      break;
240253
241254   case 0x0094:   // SCSI0 control flags
242      nHPC_SCSI0DMACtrl = data;
255      state->nHPC_SCSI0DMACtrl = data;
243256      #if 0
244257      if (data & 0x80)
245258      {
r9683r9684
248261         mame_printf_info("DMA activated for SCSI0\n");
249262         mame_printf_info("Descriptor block:\n");
250263         mame_printf_info("CTL: %08x BUFPTR: %08x DESCPTR %08x\n",
251            program_read_dword(nHPC_SCSI0Descriptor), program_read_dword(nHPC_SCSI0Descriptor+4),
252            program_read_dword(nHPC_SCSI0Descriptor+8));
264            program_read_dword(state->nHPC_SCSI0Descriptor), program_read_dword(state->nHPC_SCSI0Descriptor+4),
265            program_read_dword(state->nHPC_SCSI0Descriptor+8));
253266
254         next = program_read_dword(nHPC_SCSI0Descriptor+8);
267         next = program_read_dword(state->nHPC_SCSI0Descriptor+8);
255268         mame_printf_info("CTL: %08x BUFPTR: %08x DESCPTR %08x\n",
256269            program_read_dword(next), program_read_dword(next+4),
257270            program_read_dword(next+8));
r9683r9684
261274
262275   case 0x00ac:
263276      verboselog(machine, 2, "HPC Parallel Buffer Pointer Write: %08x (%08x)\n", data, mem_mask );
264      nHPC_ParBufPtr = data;
277      state->nHPC_ParBufPtr = data;
265278      break;
266279   case 0x0120:
267280      if (ACCESSING_BITS_8_15)
r9683r9684
311324      {
312325         verboselog(machine, 2, "  SRAM size:  8K\n" );
313326      }
314      nHPC_MiscStatus = data;
327      state->nHPC_MiscStatus = data;
315328      break;
316329   case 0x01bc:
317330//      verboselog(machine, 2, "HPC CPU Serial EEPROM Write: %08x (%08x)\n", data, mem_mask );
r9683r9684
325338      break;
326339   case 0x01c4:
327340      verboselog(machine, 2, "HPC Local IO Register 0 Mask Write: %08x (%08x)\n", data, mem_mask );
328      nHPC_LocalIOReg0Mask = data;
341      state->nHPC_LocalIOReg0Mask = data;
329342      break;
330343   case 0x01cc:
331344      verboselog(machine, 2, "HPC Local IO Register 1 Mask Write: %08x (%08x)\n", data, mem_mask );
332      nHPC_LocalIOReg1Mask = data;
345      state->nHPC_LocalIOReg1Mask = data;
333346      break;
334347   case 0x01d4:
335348      verboselog(machine, 2, "HPC VME Interrupt Mask 0 Write: %08x (%08x)\n", data, mem_mask );
336      nHPC_VMEIntMask0 = data;
349      state->nHPC_VMEIntMask0 = data;
337350      break;
338351   case 0x01d8:
339352      verboselog(machine, 2, "HPC VME Interrupt Mask 1 Write: %08x (%08x)\n", data, mem_mask );
340      nHPC_VMEIntMask1 = data;
353      state->nHPC_VMEIntMask1 = data;
341354      break;
342355   case 0x0d00:
343356      verboselog(machine, 2, "HPC DUART0 Channel B Control Write: %08x (%08x)\n", data, mem_mask );
r9683r9684
485498// sgi_mc_update wants once every millisecond (1/1000th of a second)
486499static TIMER_CALLBACK(ip20_timer)
487500{
501   ip20_state *state = machine->driver_data<ip20_state>();
488502   sgi_mc_update();
489503
490504   // update RTC every 10 milliseconds
491   nRTC_Temp++;
492   if (nRTC_Temp >= 10)
505   state->nRTC_Temp++;
506   if (state->nRTC_Temp >= 10)
493507   {
494      nRTC_Temp = 0;
508      state->nRTC_Temp = 0;
495509      RTC_HUNDREDTH++;
496510
497511      if( ( RTC_HUNDREDTH & 0x0f ) == 0x0a )
r9683r9684
544558
545559static MACHINE_START( ip204415 )
546560{
561   ip20_state *state = machine->driver_data<ip20_state>();
547562   sgi_mc_timer_init(machine);
548563
549564   wd33c93_init(machine, &scsi_intf);
550565
551566   sgi_mc_init(machine);
552567
553   nHPC_MiscStatus = 0;
554   nHPC_ParBufPtr = 0;
555   nHPC_LocalIOReg0Mask = 0;
556   nHPC_LocalIOReg1Mask = 0;
557   nHPC_VMEIntMask0 = 0;
558   nHPC_VMEIntMask1 = 0;
568   state->nHPC_MiscStatus = 0;
569   state->nHPC_ParBufPtr = 0;
570   state->nHPC_LocalIOReg0Mask = 0;
571   state->nHPC_LocalIOReg1Mask = 0;
572   state->nHPC_VMEIntMask0 = 0;
573   state->nHPC_VMEIntMask1 = 0;
559574
560   nRTC_Temp = 0;
575   state->nRTC_Temp = 0;
561576
562577   timer_set(machine, ATTOTIME_IN_MSEC(1), NULL, 0, ip20_timer);
563578}
r9683r9684
573588   32768   /* data cache size */
574589};
575590
576static MACHINE_CONFIG_START( ip204415, driver_device )
591static MACHINE_CONFIG_START( ip204415, ip20_state )
577592   MDRV_CPU_ADD( "maincpu", R4600BE, 50000000*3 )
578593   MDRV_CPU_CONFIG( config )
579594   MDRV_CPU_PROGRAM_MAP( ip204415_map)
src/mess/drivers/pk8020.c
r9683r9684
197197
198198
199199/* Machine driver */
200static MACHINE_CONFIG_START( pk8020, driver_device )
200static MACHINE_CONFIG_START( pk8020, pk8020_state )
201201   /* basic machine hardware */
202202   MDRV_CPU_ADD("maincpu", I8080, XTAL_20MHz / 8)
203203   MDRV_CPU_PROGRAM_MAP(pk8020_mem)

Previous 15994 Revisions Next


© 1998-2018 The MESS Team