r7289 Monday 8th February, 2010 at 03:37:56 UTC by Nathan Woods
More Atari Ace changes
[src/mess/drivers]atm.c elwro800.c mod8.c pasogo.c pentagon.c scorpion.c sord.c spec128.c specpls3.c spectrum.c timex.c
[src/mess/formats]spec_snqk.c timex_dck.c timex_dck.h
[src/mess/includes]spectrum.h
[src/mess/osd/windows]dialog.h
[src/mess/video]spectrum.c timex.c
[src/osd/winui]datamap.c

src/osd/winui/datamap.c
r7288r7289
2525#include <tchar.h>
2626
2727// standard C headers
28#include <stdlib.h>
2829#include <stdarg.h>
2930#include <ctype.h>
3031#include <assert.h>
src/mess/video/spectrum.c
r7288r7289
1919#include "video/border.h"
2020
2121
22unsigned char *spectrum_video_ram;
23static UINT8 retrace_cycles;
24int spectrum_frame_number;    /* Used for handling FLASH 1 */
25int spectrum_flash_invert;
26
2722/***************************************************************************
2823  Start the video hardware emulation.
2924***************************************************************************/
3025VIDEO_START( spectrum )
3126{
32   spectrum_frame_number = 0;
33   spectrum_flash_invert = 0;
27   spectrum_state *state = (spectrum_state *)machine->driver_data;
28   state->frame_number = 0;
29   state->flash_invert = 0;
3430
3531   EventList_Initialise(machine, 30000);
3632
37   retrace_cycles = SPEC_RETRACE_CYCLES;
33   state->retrace_cycles = SPEC_RETRACE_CYCLES;
3834
39   spectrum_screen_location = spectrum_video_ram;
35   state->screen_location = state->video_ram;
4036}
4137
4238VIDEO_START( spectrum_128 )
4339{
44   spectrum_frame_number = 0;
45   spectrum_flash_invert = 0;
40   spectrum_state *state = (spectrum_state *)machine->driver_data;
41   state->frame_number = 0;
42   state->flash_invert = 0;
4643
4744   EventList_Initialise(machine, 30000);
4845
49   retrace_cycles = SPEC128_RETRACE_CYCLES;
46   state->retrace_cycles = SPEC128_RETRACE_CYCLES;
5047}
5148
5249
5350/* return the color to be used inverting FLASHing colors if necessary */
5451INLINE unsigned char get_display_color (unsigned char color, int invert)
5552{
56        if (invert && (color & 0x80))
57                return (color & 0xc0) + ((color & 0x38) >> 3) + ((color & 0x07) << 3);
58        else
59                return color;
53   if (invert && (color & 0x80))
54      return (color & 0xc0) + ((color & 0x38) >> 3) + ((color & 0x07) << 3);
55   else
56      return color;
6057}
6158
6259/* Code to change the FLASH status every 25 frames. Note this must be
6360   independent of frame skip etc. */
6461VIDEO_EOF( spectrum )
6562{
66        EVENT_LIST_ITEM *pItem;
67        int NumItems;
63   spectrum_state *state = (spectrum_state *)machine->driver_data;
64   EVENT_LIST_ITEM *pItem;
65   int NumItems;
6866
69        spectrum_frame_number++;
70        if (spectrum_frame_number >= 25)
71        {
72                spectrum_frame_number = 0;
73                spectrum_flash_invert = !spectrum_flash_invert;
74        }
67   state->frame_number++;
68   if (state->frame_number >= 25)
69   {
70      state->frame_number = 0;
71      state->flash_invert = !state->flash_invert;
72   }
7573
76        /* Empty event buffer for undisplayed frames noting the last border
77           colour (in case colours are not changed in the next frame). */
78        NumItems = EventList_NumEvents();
79        if (NumItems)
80        {
81                pItem = EventList_GetFirstItem();
82                border_set_last_color ( pItem[NumItems-1].Event_Data );
83                EventList_Reset();
84            EventList_SetOffsetStartTime ( cpu_attotime_to_clocks(machine->firstcpu, attotime_mul(video_screen_get_scan_period(machine->primary_screen), video_screen_get_vpos(machine->primary_screen))) );
85                logerror ("Event log reset in callback fn.\n");
86        }
74   /* Empty event buffer for undisplayed frames noting the last border
75       colour (in case colours are not changed in the next frame). */
76   NumItems = EventList_NumEvents();
77   if (NumItems)
78   {
79      pItem = EventList_GetFirstItem();
80      border_set_last_color ( pItem[NumItems-1].Event_Data );
81      EventList_Reset();
82      EventList_SetOffsetStartTime ( cpu_attotime_to_clocks(machine->firstcpu, attotime_mul(video_screen_get_scan_period(machine->primary_screen), video_screen_get_vpos(machine->primary_screen))) );
83      logerror ("Event log reset in callback fn.\n");
84   }
8785}
8886
8987
r7288r7289
119117VIDEO_UPDATE( spectrum )
120118{
121119        /* for now do a full-refresh */
122        int x, y, b, scrx, scry;
123        unsigned short ink, pap;
124        unsigned char *attr, *scr;
120   spectrum_state *state = (spectrum_state *)screen->machine->driver_data;
121   int x, y, b, scrx, scry;
122   unsigned short ink, pap;
123   unsigned char *attr, *scr;
125124      int full_refresh = 1;
126125
127        scr=spectrum_screen_location;
126   scr=state->screen_location;
128127
129        for (y=0; y<192; y++)
130        {
131                scrx=SPEC_LEFT_BORDER;
132                scry=((y&7) * 8) + ((y&0x38)>>3) + (y&0xC0);
133                attr=spectrum_screen_location + ((scry>>3)*32) + 0x1800;
128   for (y=0; y<192; y++)
129   {
130      scrx=SPEC_LEFT_BORDER;
131      scry=((y&7) * 8) + ((y&0x38)>>3) + (y&0xC0);
132      attr=state->screen_location + ((scry>>3)*32) + 0x1800;
134133
135                for (x=0;x<32;x++)
136                {
137                        /* Get ink and paper colour with bright */
138                        if (spectrum_flash_invert && (*attr & 0x80))
139                        {
140                                ink=((*attr)>>3) & 0x0f;
141                                pap=((*attr) & 0x07) + (((*attr)>>3) & 0x08);
142                        }
143                        else
144                        {
145                                ink=((*attr) & 0x07) + (((*attr)>>3) & 0x08);
146                                pap=((*attr)>>3) & 0x0f;
147                        }
134      for (x=0;x<32;x++)
135      {
136         /* Get ink and paper colour with bright */
137         if (state->flash_invert && (*attr & 0x80))
138         {
139            ink=((*attr)>>3) & 0x0f;
140            pap=((*attr) & 0x07) + (((*attr)>>3) & 0x08);
141         }
142         else
143         {
144            ink=((*attr) & 0x07) + (((*attr)>>3) & 0x08);
145            pap=((*attr)>>3) & 0x0f;
146         }
148147
149                        for (b=0x80;b!=0;b>>=1)
150                        {
151                                if (*scr&b)
152                                        spectrum_plot_pixel(bitmap,scrx++,SPEC_TOP_BORDER+scry,ink);
153                                else
154                                        spectrum_plot_pixel(bitmap,scrx++,SPEC_TOP_BORDER+scry,pap);
155                        }
156                scr++;
157                attr++;
158                }
159        }
148         for (b=0x80;b!=0;b>>=1)
149         {
150            if (*scr&b)
151               spectrum_plot_pixel(bitmap,scrx++,SPEC_TOP_BORDER+scry,ink);
152            else
153               spectrum_plot_pixel(bitmap,scrx++,SPEC_TOP_BORDER+scry,pap);
154         }
160155
156         scr++;
157         attr++;
158      }
159   }
160
161161   border_draw(screen->machine, bitmap, full_refresh,
162162      SPEC_TOP_BORDER, SPEC_DISPLAY_YSIZE, SPEC_BOTTOM_BORDER,
163163      SPEC_LEFT_BORDER, SPEC_DISPLAY_XSIZE, SPEC_RIGHT_BORDER,
164164      SPEC_LEFT_BORDER_CYCLES, SPEC_DISPLAY_XSIZE_CYCLES,
165      SPEC_RIGHT_BORDER_CYCLES, retrace_cycles, 200, 0xfe);
165      SPEC_RIGHT_BORDER_CYCLES, state->retrace_cycles, 200, 0xfe);
166166   return 0;
167167}
168168
src/mess/video/timex.c
r7288r7289
2727/* Update FLASH status for ts2068. Assumes flash update every 1/2s. */
2828VIDEO_EOF( ts2068 )
2929{
30        EVENT_LIST_ITEM *pItem;
31        int NumItems;
30   spectrum_state *state = (spectrum_state *)machine->driver_data;
31   EVENT_LIST_ITEM *pItem;
32   int NumItems;
3233
33        spectrum_frame_number++;
34        if (spectrum_frame_number >= 30)
35        {
36                spectrum_frame_number = 0;
37                spectrum_flash_invert = !spectrum_flash_invert;
38        }
34   state->frame_number++;
35   if (state->frame_number >= 30)
36   {
37      state->frame_number = 0;
38      state->flash_invert = !state->flash_invert;
39   }
3940
40        /* Empty event buffer for undisplayed frames noting the last border
41           colour (in case colours are not changed in the next frame). */
42        NumItems = EventList_NumEvents();
43        if (NumItems)
44        {
45                pItem = EventList_GetFirstItem();
46                border_set_last_color ( pItem[NumItems-1].Event_Data );
47                EventList_Reset();
48            EventList_SetOffsetStartTime ( cpu_attotime_to_clocks(machine->firstcpu, attotime_mul(video_screen_get_scan_period(machine->primary_screen), video_screen_get_vpos(machine->primary_screen))) );
49                logerror ("Event log reset in callback fn.\n");
50        }
41   /* Empty event buffer for undisplayed frames noting the last border
42       colour (in case colours are not changed in the next frame). */
43   NumItems = EventList_NumEvents();
44   if (NumItems)
45   {
46      pItem = EventList_GetFirstItem();
47      border_set_last_color ( pItem[NumItems-1].Event_Data );
48      EventList_Reset();
49      EventList_SetOffsetStartTime ( cpu_attotime_to_clocks(machine->firstcpu, attotime_mul(video_screen_get_scan_period(machine->primary_screen), video_screen_get_vpos(machine->primary_screen))) );
50      logerror ("Event log reset in callback fn.\n");
51   }
5152}
5253
5354
r7288r7289
7677/* Draw a scanline in TS2068/TC2048 hires mode (code modified from COUPE.C) */
7778static void ts2068_hires_scanline(running_machine *machine,bitmap_t *bitmap, int y, int borderlines)
7879{
80   spectrum_state *state = (spectrum_state *)machine->driver_data;
7981   int x,b,scrx,scry;
8082   unsigned short ink,pap;
81        unsigned char *attr, *scr;
83   unsigned char *attr, *scr;
8284
83        scrx=TS2068_LEFT_BORDER;
85   scrx=TS2068_LEFT_BORDER;
8486   scry=((y&7) * 8) + ((y&0x38)>>3) + (y&0xC0);
8587
86        scr=messram_get_ptr(devtag_get_device(machine, "messram")) + y*32;
87        attr=scr + 0x2000;
88   scr=messram_get_ptr(devtag_get_device(machine, "messram")) + y*32;
89   attr=scr + 0x2000;
8890
89        for (x=0;x<32;x++)
91   for (x=0;x<32;x++)
9092   {
91                /* Get ink and paper colour with bright */
92                if (spectrum_flash_invert && (*attr & 0x80))
93                {
94                        ink=((*attr)>>3) & 0x0f;
95                        pap=((*attr) & 0x07) + (((*attr)>>3) & 0x08);
96                }
97                else
98                {
99                        ink=((*attr) & 0x07) + (((*attr)>>3) & 0x08);
100                        pap=((*attr)>>3) & 0x0f;
101                }
93      /* Get ink and paper colour with bright */
94      if (state->flash_invert && (*attr & 0x80))
95      {
96         ink=((*attr)>>3) & 0x0f;
97         pap=((*attr) & 0x07) + (((*attr)>>3) & 0x08);
98      }
99      else
100      {
101         ink=((*attr) & 0x07) + (((*attr)>>3) & 0x08);
102         pap=((*attr)>>3) & 0x0f;
103      }
102104
103105      for (b=0x80;b!=0;b>>=1)
104106      {
105                        if (*scr&b)
107         if (*scr&b)
106108         {
107                                spectrum_plot_pixel(bitmap,scrx++,scry+borderlines,ink);
108                                spectrum_plot_pixel(bitmap,scrx++,scry+borderlines,ink);
109            spectrum_plot_pixel(bitmap,scrx++,scry+borderlines,ink);
110            spectrum_plot_pixel(bitmap,scrx++,scry+borderlines,ink);
109111         }
110112         else
111113         {
112                                spectrum_plot_pixel(bitmap,scrx++,scry+borderlines,pap);
113                                spectrum_plot_pixel(bitmap,scrx++,scry+borderlines,pap);
114            spectrum_plot_pixel(bitmap,scrx++,scry+borderlines,pap);
115            spectrum_plot_pixel(bitmap,scrx++,scry+borderlines,pap);
114116         }
115117      }
116                scr++;
117                attr++;
118      scr++;
119      attr++;
118120   }
119121}
120122
r7288r7289
122124static void ts2068_64col_scanline(running_machine *machine,bitmap_t *bitmap, int y, int borderlines, unsigned short inkcolor)
123125{
124126   int x,b,scrx,scry;
125        unsigned char *scr1, *scr2;
127   unsigned char *scr1, *scr2;
126128
127        scrx=TS2068_LEFT_BORDER;
129   scrx=TS2068_LEFT_BORDER;
128130   scry=((y&7) * 8) + ((y&0x38)>>3) + (y&0xC0);
129131
130        scr1=messram_get_ptr(devtag_get_device(machine, "messram")) + y*32;
131        scr2=scr1 + 0x2000;
132   scr1=messram_get_ptr(devtag_get_device(machine, "messram")) + y*32;
133   scr2=scr1 + 0x2000;
132134
133        for (x=0;x<32;x++)
135   for (x=0;x<32;x++)
134136   {
135137      for (b=0x80;b!=0;b>>=1)
136138      {
137                        if (*scr1&b)
138                                spectrum_plot_pixel(bitmap,scrx++,scry+borderlines,inkcolor);
139         if (*scr1&b)
140            spectrum_plot_pixel(bitmap,scrx++,scry+borderlines,inkcolor);
139141         else
140                                spectrum_plot_pixel(bitmap,scrx++,scry+borderlines,7-inkcolor);
142            spectrum_plot_pixel(bitmap,scrx++,scry+borderlines,7-inkcolor);
141143      }
142                scr1++;
144      scr1++;
143145
144146      for (b=0x80;b!=0;b>>=1)
145147      {
146                        if (*scr2&b)
147                                spectrum_plot_pixel(bitmap,scrx++,scry+borderlines,inkcolor);
148         if (*scr2&b)
149            spectrum_plot_pixel(bitmap,scrx++,scry+borderlines,inkcolor);
148150         else
149                                spectrum_plot_pixel(bitmap,scrx++,scry+borderlines,7-inkcolor);
151            spectrum_plot_pixel(bitmap,scrx++,scry+borderlines,7-inkcolor);
150152      }
151                scr2++;
153      scr2++;
152154   }
153155}
154156
155157/* Draw a scanline in TS2068/TC2048 lores (normal Spectrum) mode */
156158static void ts2068_lores_scanline(running_machine *machine,bitmap_t *bitmap, int y, int borderlines, int screen)
157159{
160   spectrum_state *state = (spectrum_state *)machine->driver_data;
158161   int x,b,scrx,scry;
159162   unsigned short ink,pap;
160163   unsigned char *attr, *scr;
r7288r7289
168171   for (x=0;x<32;x++)
169172   {
170173      /* Get ink and paper colour with bright */
171      if (spectrum_flash_invert && (*attr & 0x80))
174      if (state->flash_invert && (*attr & 0x80))
172175      {
173176         ink=((*attr)>>3) & 0x0f;
174177         pap=((*attr) & 0x07) + (((*attr)>>3) & 0x08);
r7288r7289
200203VIDEO_UPDATE( ts2068 )
201204{
202205   /* for now TS2068 will do a full-refresh */
206   spectrum_state *state = (spectrum_state *)screen->machine->driver_data;
203207   int count;
204208   int full_refresh = 1;
205209
206        if ((ts2068_port_ff_data & 7) == 6)
207        {
208                /* 64 Column mode */
209                unsigned short inkcolor = (ts2068_port_ff_data & 0x38) >> 3;
210                for (count = 0; count < 192; count++)
211                        ts2068_64col_scanline(screen->machine,bitmap, count, TS2068_TOP_BORDER, inkcolor);
212        }
213        else if ((ts2068_port_ff_data & 7) == 2)
214        {
215                /* Extended Color mode */
216                for (count = 0; count < 192; count++)
217                        ts2068_hires_scanline(screen->machine,bitmap, count, TS2068_TOP_BORDER);
218        }
219        else if ((ts2068_port_ff_data & 7) == 1)
220        {
221                /* Screen 6000-7aff */
222                for (count = 0; count < 192; count++)
223                        ts2068_lores_scanline(screen->machine,bitmap, count, TS2068_TOP_BORDER, 1);
224        }
225        else
226        {
227                /* Screen 4000-5aff */
228                for (count = 0; count < 192; count++)
229                        ts2068_lores_scanline(screen->machine,bitmap, count, TS2068_TOP_BORDER, 0);
230        }
210   if ((state->port_ff_data & 7) == 6)
211   {
212      /* 64 Column mode */
213      unsigned short inkcolor = (state->port_ff_data & 0x38) >> 3;
214      for (count = 0; count < 192; count++)
215         ts2068_64col_scanline(screen->machine,bitmap, count, TS2068_TOP_BORDER, inkcolor);
216   }
217   else if ((state->port_ff_data & 7) == 2)
218   {
219      /* Extended Color mode */
220      for (count = 0; count < 192; count++)
221         ts2068_hires_scanline(screen->machine,bitmap, count, TS2068_TOP_BORDER);
222   }
223   else if ((state->port_ff_data & 7) == 1)
224   {
225      /* Screen 6000-7aff */
226      for (count = 0; count < 192; count++)
227         ts2068_lores_scanline(screen->machine,bitmap, count, TS2068_TOP_BORDER, 1);
228   }
229   else
230   {
231      /* Screen 4000-5aff */
232      for (count = 0; count < 192; count++)
233         ts2068_lores_scanline(screen->machine,bitmap, count, TS2068_TOP_BORDER, 0);
234   }
231235
232        border_draw(screen->machine, bitmap, full_refresh,
233                TS2068_TOP_BORDER, SPEC_DISPLAY_YSIZE, TS2068_BOTTOM_BORDER,
234                TS2068_LEFT_BORDER, TS2068_DISPLAY_XSIZE, TS2068_RIGHT_BORDER,
235                SPEC_LEFT_BORDER_CYCLES, SPEC_DISPLAY_XSIZE_CYCLES,
236                SPEC_RIGHT_BORDER_CYCLES, SPEC_RETRACE_CYCLES, 200, 0xfe);
236   border_draw(screen->machine, bitmap, full_refresh,
237      TS2068_TOP_BORDER, SPEC_DISPLAY_YSIZE, TS2068_BOTTOM_BORDER,
238      TS2068_LEFT_BORDER, TS2068_DISPLAY_XSIZE, TS2068_RIGHT_BORDER,
239      SPEC_LEFT_BORDER_CYCLES, SPEC_DISPLAY_XSIZE_CYCLES,
240      SPEC_RIGHT_BORDER_CYCLES, SPEC_RETRACE_CYCLES, 200, 0xfe);
237241   return 0;
238242}
239243
240244VIDEO_UPDATE( tc2048 )
241245{
242246   /* for now TS2068 will do a full-refresh */
247   spectrum_state *state = (spectrum_state *)screen->machine->driver_data;
243248   int count;
244249   int full_refresh = 1;
245250
246   if ((ts2068_port_ff_data & 7) == 6)
251   if ((state->port_ff_data & 7) == 6)
247252   {
248253      /* 64 Column mode */
249      unsigned short inkcolor = (ts2068_port_ff_data & 0x38) >> 3;
254      unsigned short inkcolor = (state->port_ff_data & 0x38) >> 3;
250255      for (count = 0; count < 192; count++)
251256         ts2068_64col_scanline(screen->machine,bitmap, count, SPEC_TOP_BORDER, inkcolor);
252257   }
253   else if ((ts2068_port_ff_data & 7) == 2)
258   else if ((state->port_ff_data & 7) == 2)
254259   {
255260      /* Extended Color mode */
256261      for (count = 0; count < 192; count++)
257262         ts2068_hires_scanline(screen->machine,bitmap, count, SPEC_TOP_BORDER);
258263   }
259   else if ((ts2068_port_ff_data & 7) == 1)
264   else if ((state->port_ff_data & 7) == 1)
260265   {
261266      /* Screen 6000-7aff */
262267      for (count = 0; count < 192; count++)
src/mess/includes/spectrum.h
r7288r7289
4646#define TS2068_RIGHT_BORDER  96   /* Number of right hand border pixels */
4747#define TS2068_SCREEN_WIDTH (TS2068_LEFT_BORDER + TS2068_DISPLAY_XSIZE + TS2068_RIGHT_BORDER)
4848
49typedef struct _spectrum_state spectrum_state;
50struct _spectrum_state
51{
52   int port_fe_data;
53   int port_7ffd_data;
54   int port_1ffd_data;   /* scorpion and plus3 */
55   int port_ff_data; /* Display enhancement control */
56   int port_f4_data; /* Horizontal Select Register */
57
58   /* video support */
59   int frame_number;    /* Used for handling FLASH 1 */
60   int flash_invert;
61   UINT8 retrace_cycles;
62   UINT8 *video_ram;
63   UINT8 *screen_location;
64
65   int ROMSelection;
66};
67
68
4969/*----------- defined in drivers/spectrum.c -----------*/
50extern unsigned char *spectrum_screen_location;
5170
5271INPUT_PORTS_EXTERN( spectrum );
5372INPUT_PORTS_EXTERN( spec_plus );
r7288r7289
6079extern READ8_HANDLER(spectrum_port_df_r);
6180extern READ8_HANDLER(spectrum_port_fe_r);
6281extern WRITE8_HANDLER(spectrum_port_fe_w);
63extern int spectrum_PreviousFE;
6482
6583/*----------- defined in drivers/spec128.c -----------*/
6684MACHINE_DRIVER_EXTERN( spectrum_128 );
6785
6886extern void spectrum_128_update_memory(running_machine *machine);
69extern int spectrum_128_port_7ffd_data;
7087
7188/*----------- defined in drivers/specpls3.c -----------*/
72extern int spectrum_plus3_port_1ffd_data;
7389extern void spectrum_plus3_update_memory(running_machine *machine);
7490
7591/*----------- defined in drivers/timex.c -----------*/
7692extern void ts2068_update_memory(running_machine *machine);
77extern int ts2068_port_ff_data;
78extern int ts2068_port_f4_data;
7993
8094/*----------- defined in video/spectrum.c -----------*/
81extern int spectrum_frame_number;    /* Used for handling FLASH 1 */
82extern int spectrum_flash_invert;
8395
8496extern PALETTE_INIT( spectrum );
8597
r7288r7289
89101extern VIDEO_UPDATE( spectrum );
90102extern VIDEO_EOF( spectrum );
91103
92extern unsigned char *spectrum_video_ram;
93
94104/*----------- defined in video/timex.c -----------*/
95105extern VIDEO_EOF( ts2068 );
96106extern VIDEO_UPDATE( ts2068 );
src/mess/osd/windows/dialog.h
r7288r7289
3434char *win_dialog_strdup(dialog_box *dialog, const char *s);
3535WCHAR *win_dialog_wcsdup(dialog_box *dialog, const WCHAR *s);
3636
37#ifdef UNICODE
3738#define win_dialog_tcsdup   win_dialog_wcsdup
39#else
40#define win_dialog_tcsdup   win_dialog_strdup
41#endif
3842
3943/* dialog operations */
4044void win_dialog_runmodal(running_machine *machine, HWND wnd, dialog_box *dialog);
src/mess/formats/spec_snqk.c
r7288r7289
5252 *******************************************************************/
5353static void spectrum_update_paging(running_machine *machine)
5454{
55    if (spectrum_128_port_7ffd_data == -1)
55    spectrum_state *state = (spectrum_state *)machine->driver_data;
56    if (state->port_7ffd_data == -1)
5657        return;
57    if (spectrum_plus3_port_1ffd_data == -1)
58    if (state->port_1ffd_data == -1)
5859        spectrum_128_update_memory(machine);
5960
6061    else
6162    {
62        if (spectrum_128_port_7ffd_data & 0x10)
63        if (state->port_7ffd_data & 0x10)
6364            /* Page in Spec 48K basic ROM */
64            spectrum_plus3_port_1ffd_data = 0x04;
65            state->port_1ffd_data = 0x04;
6566        else
66            spectrum_plus3_port_1ffd_data = 0;
67            state->port_1ffd_data = 0;
6768        spectrum_plus3_update_memory(machine);
6869    }
6970}
r7288r7289
7172/* Page in the 48K Basic ROM. Used when running 48K snapshots on a 128K machine. */
7273static void spectrum_page_basicrom(running_machine *machine)
7374{
74    if (spectrum_128_port_7ffd_data == -1)
75    spectrum_state *state = (spectrum_state *)machine->driver_data;
76    if (state->port_7ffd_data == -1)
7577        return;
76    spectrum_128_port_7ffd_data |= 0x10;
78    state->port_7ffd_data |= 0x10;
7779    spectrum_update_paging(machine);
7880}
7981
r7288r7289
156158 *******************************************************************/
157159void spectrum_setup_sp(running_machine *machine, unsigned char *pSnapshot, unsigned long SnapshotSize)
158160{
161   spectrum_state *state = (spectrum_state *)machine->driver_data;
159162   int i;
160163   UINT8 lo, hi, data;
161164   UINT16 offset, size;
r7288r7289
220223      logerror("Unknown meaning of word on position 32: %04x.\n", (hi << 8) | lo);
221224
222225   /* Set border colour */
223   spectrum_PreviousFE = (spectrum_PreviousFE & 0xf8) | (pSnapshot[34] & 0x07);
226   state->port_fe_data = (state->port_fe_data & 0xf8) | (pSnapshot[34] & 0x07);
224227   EventList_Reset();
225228   border_set_last_color(pSnapshot[34] & 0x07);
226229   border_force_redraw();
r7288r7289
294297 *******************************************************************/
295298void spectrum_setup_sna(running_machine *machine, unsigned char *pSnapshot, unsigned long SnapshotSize)
296299{
300   spectrum_state *state = (spectrum_state *)machine->driver_data;
297301   int i, j, usedbanks[8];
298302   long bank_offset;
299303   unsigned char lo, hi, data;
300304   unsigned short addr;
301305   const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
302306
303   if ((SnapshotSize != 49179) && (spectrum_128_port_7ffd_data == -1))
307   if ((SnapshotSize != 49179) && (state->port_7ffd_data == -1))
304308   {
305309      logerror("Can't load 128K .SNA file into 48K machine\n");
306310      return;
r7288r7289
349353   cpu_set_reg(devtag_get_device(machine, "maincpu"), Z80_IM, data);
350354
351355   /* Set border colour */
352   spectrum_PreviousFE = (spectrum_PreviousFE & 0xf8) | (pSnapshot[26] & 0x07);
356   state->port_fe_data = (state->port_fe_data & 0xf8) | (pSnapshot[26] & 0x07);
353357   EventList_Reset();
354358   border_set_last_color(pSnapshot[26] & 0x07);
355359   border_force_redraw();
r7288r7289
364368   else
365369   {
366370      /* 128K Snapshot */
367      spectrum_128_port_7ffd_data = (pSnapshot[49181] & 0x0ff);
371      state->port_7ffd_data = (pSnapshot[49181] & 0x0ff);
368372      spectrum_update_paging(machine);
369373   }
370374
r7288r7289
399403
400404      usedbanks[5] = 1;            /* 0x4000-0x7fff */
401405      usedbanks[2] = 1;            /* 0x8000-0xbfff */
402      usedbanks[spectrum_128_port_7ffd_data & 0x07] = 1;   /* Banked memory */
406      usedbanks[state->port_7ffd_data & 0x07] = 1;   /* Banked memory */
403407
404408      for (i = 0; i < 8; i++)
405409      {
406410         if (!usedbanks[i])
407411         {
408412            logerror("Loading bank %d from offset %ld\n", i, bank_offset);
409            spectrum_128_port_7ffd_data &= 0xf8;
410            spectrum_128_port_7ffd_data += i;
413            state->port_7ffd_data &= 0xf8;
414            state->port_7ffd_data += i;
411415            spectrum_update_paging(machine);
412416            for (j = 0; j < 16384; j++)
413417               memory_write_byte(space,j + 49152, pSnapshot[bank_offset + j]);
r7288r7289
416420      }
417421
418422      /* Reset paging */
419      spectrum_128_port_7ffd_data = (pSnapshot[49181] & 0x0ff);
423      state->port_7ffd_data = (pSnapshot[49181] & 0x0ff);
420424      spectrum_update_paging(machine);
421425
422426      /* program counter */
r7288r7289
544548/* now supports 48k & 128k .Z80 files */
545549void spectrum_setup_z80(running_machine *machine, unsigned char *pSnapshot, unsigned long SnapshotSize)
546550{
551   spectrum_state *state = (spectrum_state *)machine->driver_data;
547552   int i;
548553   unsigned char lo, hi, data;
549554   SPECTRUM_Z80_SNAPSHOT_TYPE z80_type;
r7288r7289
564569            break;
565570      case SPECTRUM_Z80_SNAPSHOT_128K:
566571            logerror("128K .Z80 file\n");
567            if (spectrum_128_port_7ffd_data == -1)
572            if (state->port_7ffd_data == -1)
568573            {
569574               logerror("Not a 48K .Z80 file\n");
570575               return;
r7288r7289
611616   cpu_set_reg(devtag_get_device(machine, "maincpu"), Z80_R, data);
612617
613618   /* Set border colour */
614   spectrum_PreviousFE = (spectrum_PreviousFE & 0xf8) | ((pSnapshot[12] & 0x0e) >> 1);
619   state->port_fe_data = (state->port_fe_data & 0xf8) | ((pSnapshot[12] & 0x0e) >> 1);
615620   EventList_Reset();
616621   border_set_last_color((pSnapshot[12] & 0x0e) >> 1);
617622   border_force_redraw();
r7288r7289
749754            if ((page >= 3) && (page <= 10))
750755            {
751756               /* Page the appropriate bank into 0xc000 - 0xfff */
752               spectrum_128_port_7ffd_data = page - 3;
757               state->port_7ffd_data = page - 3;
753758               spectrum_update_paging(machine);
754759               Dest = 0x0c000;
755760            }
r7288r7289
783788      }
784789      while ((pSource - pSnapshot) < SnapshotSize);
785790
786      if ((spectrum_128_port_7ffd_data != -1) && (z80_type != SPECTRUM_Z80_SNAPSHOT_48K))
791      if ((state->port_7ffd_data != -1) && (z80_type != SPECTRUM_Z80_SNAPSHOT_48K))
787792      {
788793         /* Set up paging */
789         spectrum_128_port_7ffd_data = (pSnapshot[35] & 0x0ff);
794         state->port_7ffd_data = (pSnapshot[35] & 0x0ff);
790795         spectrum_update_paging(machine);
791796      }
792797      if ((z80_type == SPECTRUM_Z80_SNAPSHOT_48K) && !strcmp(machine->gamedrv->name,"ts2068"))
793798      {
794         ts2068_port_f4_data = 0x03;
795         ts2068_port_ff_data = 0x00;
799         state->port_f4_data = 0x03;
800         state->port_ff_data = 0x00;
796801         ts2068_update_memory(machine);
797802      }
798803      if (z80_type == SPECTRUM_Z80_SNAPSHOT_TS2068 && !strcmp(machine->gamedrv->name,"ts2068"))
799804      {
800         ts2068_port_f4_data = pSnapshot[35];
801         ts2068_port_ff_data = pSnapshot[36];
805         state->port_f4_data = pSnapshot[35];
806         state->port_ff_data = pSnapshot[36];
802807         ts2068_update_memory(machine);
803808      }
804809   }
src/mess/formats/timex_dck.c
r7288r7289
3030#include "utils.h"
3131
3232
33int timex_cart_type;
34UINT8 timex_cart_chunks;
35UINT8 *timex_cart_data;
3336
37
38
3439DEVICE_IMAGE_LOAD( timex_cart )
3540{
3641   int file_size;
src/mess/formats/timex_dck.h
r7288r7289
1212
1313typedef enum
1414{
15    TIMEX_CART_NONE,
16    TIMEX_CART_DOCK,
17    TIMEX_CART_EXROM,
18    TIMEX_CART_HOME
19} TIMEX_CART_TYPE;
15   TIMEX_CART_NONE,
16   TIMEX_CART_DOCK,
17   TIMEX_CART_EXROM,
18   TIMEX_CART_HOME
19};
2020
21extern TIMEX_CART_TYPE timex_cart_type;
21extern int timex_cart_type;
2222extern UINT8 timex_cart_chunks;
2323extern UINT8 *timex_cart_data;
2424
src/mess/drivers/scorpion.c
r7288r7289
184184
185185/* rom 0=zx128, 1=zx48, 2 = service monitor, 3=tr-dos */
186186
187static int scorpion_256_port_1ffd_data = 0;
188
189static int ROMSelection;
190
191static running_device* beta;
192
193//static UINT8 *rom_pointer;
194
195187static void scorpion_update_memory(running_machine *machine)
196188{
189   spectrum_state *state = (spectrum_state *)machine->driver_data;
190   UINT8 *messram = messram_get_ptr(devtag_get_device(machine, "messram"));
197191   const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
198   spectrum_screen_location = messram_get_ptr(devtag_get_device(machine, "messram")) + ((spectrum_128_port_7ffd_data & 8) ? (7<<14) : (5<<14));
199192
200   memory_set_bankptr(machine, "bank4", messram_get_ptr(devtag_get_device(machine, "messram")) + (((spectrum_128_port_7ffd_data & 0x07) | ((scorpion_256_port_1ffd_data & 0x10)>>1)) * 0x4000));
193   state->screen_location = messram + ((state->port_7ffd_data & 8) ? (7<<14) : (5<<14));
201194
202   if ((scorpion_256_port_1ffd_data & 0x01)==0x01)
195   memory_set_bankptr(machine, "bank4", messram + (((state->port_7ffd_data & 0x07) | ((state->port_1ffd_data & 0x10)>>1)) * 0x4000));
196
197   if ((state->port_1ffd_data & 0x01)==0x01)
203198   {
204199      memory_install_write_bank(space, 0x0000, 0x3fff, 0, 0, "bank1");
205      memory_set_bankptr(machine, "bank1", messram_get_ptr(devtag_get_device(machine, "messram"))+(8<<14));
200      memory_set_bankptr(machine, "bank1", messram+(8<<14));
206201      logerror("RAM\n");
207202   }
208203   else
209204   {
210      if ((scorpion_256_port_1ffd_data & 0x02)==0x02)
205      if ((state->port_1ffd_data & 0x02)==0x02)
211206      {
212         ROMSelection = 2;
207         state->ROMSelection = 2;
213208      }
214209      else
215210      {
216         ROMSelection = ((spectrum_128_port_7ffd_data>>4) & 0x01) ? 1 : 0;
211         state->ROMSelection = ((state->port_7ffd_data>>4) & 0x01) ? 1 : 0;
217212      }
218213      memory_unmap_write(space, 0x0000, 0x3fff, 0, 0);
219      memory_set_bankptr(machine, "bank1", memory_region(machine, "maincpu") + 0x010000 + (ROMSelection<<14));
214      memory_set_bankptr(machine, "bank1", memory_region(machine, "maincpu") + 0x010000 + (state->ROMSelection<<14));
220215   }
221216
222217
r7288r7289
224219
225220static DIRECT_UPDATE_HANDLER( scorpion_direct )
226221{
222   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
223   running_device *beta = devtag_get_device(space->machine, BETA_DISK_TAG);
227224   UINT16 pc = cpu_get_reg(devtag_get_device(space->machine, "maincpu"), REG_GENPCBASE);
225
228226   if (betadisk_is_active(beta))
229227   {
230228      if (pc >= 0x4000)
231229      {
232         ROMSelection = ((spectrum_128_port_7ffd_data>>4) & 0x01) ? 1 : 0;
230         state->ROMSelection = ((state->port_7ffd_data>>4) & 0x01) ? 1 : 0;
233231         betadisk_disable(beta);
234232         memory_unmap_write(space, 0x0000, 0x3fff, 0, 0);
235         memory_set_bankptr(space->machine, "bank1", memory_region(space->machine, "maincpu") + 0x010000 + (ROMSelection<<14));
233         memory_set_bankptr(space->machine, "bank1", memory_region(space->machine, "maincpu") + 0x010000 + (state->ROMSelection<<14));
236234      }
237   } else if (((pc & 0xff00) == 0x3d00) && (ROMSelection==1))
235   }
236   else if (((pc & 0xff00) == 0x3d00) && (state->ROMSelection==1))
238237   {
239      ROMSelection = 3;
238      state->ROMSelection = 3;
240239      betadisk_enable(beta);
241
242240   }
243241   if((address>=0x0000) && (address<=0x3fff))
244242   {
245243      memory_unmap_write(space, 0x0000, 0x3fff, 0, 0);
246      direct->raw = direct->decrypted =  memory_region(space->machine, "maincpu") + 0x010000 + (ROMSelection<<14);
244      direct->raw = direct->decrypted =  memory_region(space->machine, "maincpu") + 0x010000 + (state->ROMSelection<<14);
247245      memory_set_bankptr(space->machine, "bank1", direct->raw);
248246      return ~0;
249247   }
r7288r7289
252250
253251static TIMER_CALLBACK(nmi_check_callback)
254252{
253   spectrum_state *state = (spectrum_state *)machine->driver_data;
254
255255   if ((input_port_read(machine, "NMI") & 1)==1)
256256   {
257      scorpion_256_port_1ffd_data |= 0x02;
257      state->port_1ffd_data |= 0x02;
258258      scorpion_update_memory(machine);
259259      cputag_set_input_line(machine, "maincpu", INPUT_LINE_NMI, PULSE_LINE);
260260   }
r7288r7289
262262
263263static WRITE8_HANDLER(scorpion_port_7ffd_w)
264264{
265   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
266
265267   /* disable paging */
266   if (spectrum_128_port_7ffd_data & 0x20)
268   if (state->port_7ffd_data & 0x20)
267269      return;
268270
269271   /* store new state */
270   spectrum_128_port_7ffd_data = data;
272   state->port_7ffd_data = data;
271273
272274   /* update memory */
273275   scorpion_update_memory(space->machine);
r7288r7289
275277
276278static WRITE8_HANDLER(scorpion_port_1ffd_w)
277279{
280   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
281
278282   /* if paging not disabled */
279   if ((spectrum_128_port_7ffd_data & 0x20)==0)
283   if ((state->port_7ffd_data & 0x20)==0)
280284   {
281      scorpion_256_port_1ffd_data = data;
285      state->port_1ffd_data = data;
282286      scorpion_update_memory(space->machine);
283287   }
284288}
r7288r7289
300304
301305static MACHINE_RESET( scorpion )
302306{
307   spectrum_state *state = (spectrum_state *)machine->driver_data;
308   UINT8 *messram = messram_get_ptr(devtag_get_device(machine, "messram"));
309   running_device *beta = devtag_get_device(machine, BETA_DISK_TAG);
303310   const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
304   beta = devtag_get_device(machine, BETA_DISK_TAG);
305311
306312   memory_install_read_bank (space, 0x0000, 0x3fff, 0, 0, "bank1");
307313
308314   betadisk_disable(beta);
309315   betadisk_clear_status(beta);
310316
311   memory_set_direct_update_handler(space, scorpion_direct );
317   memory_set_direct_update_handler(space, scorpion_direct);
312318
313   memset(messram_get_ptr(devtag_get_device(machine, "messram")),0,256*1024);
319   memset(messram,0,256*1024);
314320
315321   /* Bank 5 is always in 0x4000 - 0x7fff */
316   memory_set_bankptr(machine, "bank2", messram_get_ptr(devtag_get_device(machine, "messram")) + (5<<14));
322   memory_set_bankptr(machine, "bank2", messram + (5<<14));
317323
318324   /* Bank 2 is always in 0x8000 - 0xbfff */
319   memory_set_bankptr(machine, "bank3", messram_get_ptr(devtag_get_device(machine, "messram")) + (2<<14));
325   memory_set_bankptr(machine, "bank3", messram + (2<<14));
320326
321   spectrum_128_port_7ffd_data = 0;
322   scorpion_256_port_1ffd_data = 0;
323
327   state->port_7ffd_data = 0;
328   state->port_1ffd_data = 0;
324329   scorpion_update_memory(machine);
325330}
326331static MACHINE_START( scorpion )
src/mess/drivers/spectrum.c
r7288r7289
156156#include "formats/tzx_cas.h"
157157#include "formats/spec_snqk.h"
158158
159unsigned char *spectrum_screen_location = NULL;
160
161159/****************************************************************************************************/
162160/* Spectrum 48k functions */
163161
r7288r7289
168166 bit 2-0: border colour
169167*/
170168
171int spectrum_PreviousFE = 0;
172
173169WRITE8_HANDLER(spectrum_port_fe_w)
174170{
171   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
175172   running_device *speaker = devtag_get_device(space->machine, "speaker");
176173   unsigned char Changed;
177174
178   Changed = spectrum_PreviousFE^data;
175   Changed = state->port_fe_data^data;
179176
180177   /* border colour changed? */
181178   if ((Changed & 0x07)!=0)
r7288r7289
196193      cassette_output(devtag_get_device(space->machine, "cassette"), (data & (1<<3)) ? -1.0 : +1.0);
197194   }
198195
199   spectrum_PreviousFE = data;
196   state->port_fe_data = data;
200197}
201198
202199static DIRECT_UPDATE_HANDLER(spectrum_direct)
r7288r7289
213210
214211MACHINE_RESET( spectrum )
215212{
216    const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
217    memory_set_direct_update_handler(space, spectrum_direct);
213   spectrum_state *state = (spectrum_state *)machine->driver_data;
214   const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
215
216   memory_set_direct_update_handler(space, spectrum_direct);
217   state->port_7ffd_data = -1;
218   state->port_1ffd_data = -1;
218219}
219220
220221static ADDRESS_MAP_START (spectrum_mem, ADDRESS_SPACE_PROGRAM, 8)
221222   AM_RANGE(0x0000, 0x3fff) AM_ROM
222   AM_RANGE(0x4000, 0x5aff) AM_RAM AM_BASE(&spectrum_video_ram )
223   AM_RANGE(0x4000, 0x5aff) AM_RAM AM_BASE_MEMBER(spectrum_state,video_ram)
223224   AM_RANGE(0x5b00, 0xffff) AM_RAM
224225ADDRESS_MAP_END
225226
r7288r7289
314315
315316static  READ8_HANDLER ( spectrum_port_ula_r )
316317{
317   return video_screen_get_vpos(space->machine->primary_screen)<193 ? spectrum_video_ram[(video_screen_get_vpos(space->machine->primary_screen)&0xf8)<<2]:0xff;
318   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
319   int vpos = video_screen_get_vpos(space->machine->primary_screen);
320
321   return vpos<193 ? state->video_ram[(vpos&0xf8)<<2]:0xff;
318322}
319323
320324/* ports are not decoded full.
r7288r7289
526530};
527531
528532MACHINE_DRIVER_START( spectrum )
533
534   MDRV_DRIVER_DATA( spectrum_state )
535
529536   /* basic machine hardware */
530537   MDRV_CPU_ADD("maincpu", Z80, 3500000)        /* 3.5 MHz */
531538   MDRV_CPU_PROGRAM_MAP(spectrum_mem)
src/mess/drivers/spec128.c
r7288r7289
170170/****************************************************************************************************/
171171/* Spectrum 128 specific functions */
172172
173int spectrum_128_port_7ffd_data = -1;
174
175173static WRITE8_HANDLER(spectrum_128_port_7ffd_w)
176174{
175   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
176
177177   /* D0-D2: RAM page located at 0x0c000-0x0ffff */
178178   /* D3 - Screen select (screen 0 in ram page 5, screen 1 in ram page 7 */
179179   /* D4 - ROM select - which rom paged into 0x0000-0x03fff */
180180   /* D5 - Disable paging */
181181
182182   /* disable paging? */
183   if (spectrum_128_port_7ffd_data & 0x20)
183   if (state->port_7ffd_data & 0x20)
184184         return;
185185
186186   /* store new state */
187   spectrum_128_port_7ffd_data = data;
187   state->port_7ffd_data = data;
188188
189189   /* update memory */
190190   spectrum_128_update_memory(space->machine);
r7288r7289
192192
193193void spectrum_128_update_memory(running_machine *machine)
194194{
195   spectrum_state *state = (spectrum_state *)machine->driver_data;
196   UINT8 *messram = messram_get_ptr(devtag_get_device(machine, "messram"));
195197   unsigned char *ChosenROM;
196198   int ROMSelection;
197199
198   if (spectrum_128_port_7ffd_data & 8)
200   if (state->port_7ffd_data & 8)
199201   {
200         spectrum_screen_location = messram_get_ptr(devtag_get_device(machine, "messram")) + (7<<14);
202      state->screen_location = messram + (7<<14);
201203   }
202204   else
203205   {
204         spectrum_screen_location = messram_get_ptr(devtag_get_device(machine, "messram")) + (5<<14);
206      state->screen_location = messram + (5<<14);
205207   }
206208
207209   /* select ram at 0x0c000-0x0ffff */
208210   {
209         int ram_page;
210         unsigned char *ram_data;
211      int ram_page;
212      unsigned char *ram_data;
211213
212         ram_page = spectrum_128_port_7ffd_data & 0x07;
213         ram_data = messram_get_ptr(devtag_get_device(machine, "messram")) + (ram_page<<14);
214      ram_page = state->port_7ffd_data & 0x07;
215      ram_data = messram + (ram_page<<14);
214216
215         memory_set_bankptr(machine, "bank4", ram_data);
217      memory_set_bankptr(machine, "bank4", ram_data);
216218   }
217219
218220   /* ROM switching */
219   ROMSelection = ((spectrum_128_port_7ffd_data>>4) & 0x01);
221   ROMSelection = ((state->port_7ffd_data>>4) & 0x01);
220222
221223   /* rom 0 is 128K rom, rom 1 is 48 BASIC */
222224
r7288r7289
227229
228230static  READ8_HANDLER ( spectrum_128_ula_r )
229231{
230   return video_screen_get_vpos(space->machine->primary_screen)<193 ? spectrum_screen_location[0x1800|(video_screen_get_vpos(space->machine->primary_screen)&0xf8)<<2]:0xff;
232   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
233   int vpos = video_screen_get_vpos(space->machine->primary_screen);
234
235   return vpos<193 ? state->screen_location[0x1800|(vpos&0xf8)<<2]:0xff;
231236}
232237
233238static ADDRESS_MAP_START (spectrum_128_io, ADDRESS_SPACE_IO, 8)
r7288r7289
250255
251256static MACHINE_RESET( spectrum_128 )
252257{
253   memset(messram_get_ptr(devtag_get_device(machine, "messram")),0,128*1024);
258   spectrum_state *state = (spectrum_state *)machine->driver_data;
259   UINT8 *messram = messram_get_ptr(devtag_get_device(machine, "messram"));
260
261   memset(messram,0,128*1024);
254262   /* 0x0000-0x3fff always holds ROM */
255263
256264   /* Bank 5 is always in 0x4000 - 0x7fff */
257   memory_set_bankptr(machine, "bank2", messram_get_ptr(devtag_get_device(machine, "messram")) + (5<<14));
265   memory_set_bankptr(machine, "bank2", messram + (5<<14));
258266
259267   /* Bank 2 is always in 0x8000 - 0xbfff */
260   memory_set_bankptr(machine, "bank3", messram_get_ptr(devtag_get_device(machine, "messram")) + (2<<14));
268   memory_set_bankptr(machine, "bank3", messram + (2<<14));
261269
270   MACHINE_RESET_CALL(spectrum);
271
262272   /* set initial ram config */
263   spectrum_128_port_7ffd_data = 0;
273   state->port_7ffd_data = 0;
274   state->port_1ffd_data = -1;
264275   spectrum_128_update_memory(machine);
265
266   MACHINE_RESET_CALL(spectrum);
267276}
268277
269278/* F4 Character Displayer */
src/mess/drivers/atm.c
r7288r7289
1010#include "machine/beta.h"
1111#include "devices/messram.h"
1212
13static int ROMSelection;
14static running_device* beta;
15
1613static DIRECT_UPDATE_HANDLER( atm_direct )
1714{
15   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
16   running_device *beta = devtag_get_device(space->machine, BETA_DISK_TAG);
1817   UINT16 pc = cpu_get_reg(devtag_get_device(space->machine, "maincpu"), REG_GENPCBASE);
1918
2019   if (beta->started && betadisk_is_active(beta))
2120   {
2221      if (pc >= 0x4000)
2322      {
24         ROMSelection = ((spectrum_128_port_7ffd_data>>4) & 0x01) ? 1 : 0;
23         state->ROMSelection = ((state->port_7ffd_data>>4) & 0x01) ? 1 : 0;
2524         betadisk_disable(beta);
2625         memory_unmap_write(space, 0x0000, 0x3fff, 0, 0);
27         memory_set_bankptr(space->machine, "bank1", memory_region(space->machine, "maincpu") + 0x010000 + (ROMSelection<<14));
26         memory_set_bankptr(space->machine, "bank1", memory_region(space->machine, "maincpu") + 0x010000 + (state->ROMSelection<<14));
2827      }
29   } else if (((pc & 0xff00) == 0x3d00) && (ROMSelection==1))
28   }
29   else if (((pc & 0xff00) == 0x3d00) && (state->ROMSelection==1))
3030   {
31      ROMSelection = 3;
31      state->ROMSelection = 3;
3232      if (beta->started)
3333         betadisk_enable(beta);
3434
r7288r7289
3636   if((address>=0x0000) && (address<=0x3fff))
3737   {
3838      memory_unmap_write(space, 0x0000, 0x3fff, 0, 0);
39      if (ROMSelection == 3) {
39      if (state->ROMSelection == 3) {
4040         direct->raw = direct->decrypted =  memory_region(space->machine, "maincpu") + 0x018000 ;
4141      } else {
42         direct->raw = direct->decrypted =  memory_region(space->machine, "maincpu") + 0x010000 + (ROMSelection<<14);
42         direct->raw = direct->decrypted =  memory_region(space->machine, "maincpu") + 0x010000 + (state->ROMSelection<<14);
4343      }
4444      memory_set_bankptr(space->machine, "bank1", direct->raw);
4545      return ~0;
r7288r7289
4949
5050static void atm_update_memory(running_machine *machine)
5151{
52   spectrum_screen_location = messram_get_ptr(devtag_get_device(machine, "messram")) + ((spectrum_128_port_7ffd_data & 8) ? (7<<14) : (5<<14));
52   spectrum_state *state = (spectrum_state *)machine->driver_data;
53   running_device *beta = devtag_get_device(machine, BETA_DISK_TAG);
54   UINT8 *messram = messram_get_ptr(devtag_get_device(machine, "messram"));
5355
54   memory_set_bankptr(machine, "bank4", messram_get_ptr(devtag_get_device(machine, "messram")) + ((spectrum_128_port_7ffd_data & 0x07) * 0x4000));
56   state->screen_location = messram + ((state->port_7ffd_data & 8) ? (7<<14) : (5<<14));
5557
56   if (beta->started && betadisk_is_active(beta) && !( spectrum_128_port_7ffd_data & 0x10 ) )
58   memory_set_bankptr(machine, "bank4", messram + ((state->port_7ffd_data & 0x07) * 0x4000));
59
60   if (beta->started && betadisk_is_active(beta) && !( state->port_7ffd_data & 0x10 ) )
5761   {
58      ROMSelection = 3;
62      state->ROMSelection = 3;
5963   }
6064   else {
6165      /* ROM switching */
62      ROMSelection = ((spectrum_128_port_7ffd_data>>4) & 0x01) ;
66      state->ROMSelection = ((state->port_7ffd_data>>4) & 0x01) ;
6367   }
6468   /* rom 0 is 128K rom, rom 1 is 48 BASIC */
65   memory_set_bankptr(machine, "bank1", memory_region(machine, "maincpu") + 0x010000 + (ROMSelection<<14));
69   memory_set_bankptr(machine, "bank1", memory_region(machine, "maincpu") + 0x010000 + (state->ROMSelection<<14));
6670}
6771
6872static WRITE8_HANDLER(atm_port_7ffd_w)
6973{
74   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
75
7076   /* disable paging */
71   if (spectrum_128_port_7ffd_data & 0x20)
77   if (state->port_7ffd_data & 0x20)
7278      return;
7379
7480   /* store new state */
75   spectrum_128_port_7ffd_data = data;
81   state->port_7ffd_data = data;
7682
7783   /* update memory */
7884   atm_update_memory(space->machine);
r7288r7289
9399
94100static MACHINE_RESET( atm )
95101{
102   spectrum_state *state = (spectrum_state *)machine->driver_data;
103   UINT8 *messram = messram_get_ptr(devtag_get_device(machine, "messram"));
96104   const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
97   beta = devtag_get_device(machine, BETA_DISK_TAG);
105   running_device *beta = devtag_get_device(machine, BETA_DISK_TAG);
98106
99107   memory_install_read_bank(space, 0x0000, 0x3fff, 0, 0, "bank1");
100108   memory_unmap_write(space, 0x0000, 0x3fff, 0, 0);
r7288r7289
106114
107115   memory_set_direct_update_handler( space, atm_direct );
108116
109   memset(messram_get_ptr(devtag_get_device(machine, "messram")),0,128*1024);
117   memset(messram,0,128*1024);
110118
111119   /* Bank 5 is always in 0x4000 - 0x7fff */
112   memory_set_bankptr(machine, "bank2", messram_get_ptr(devtag_get_device(machine, "messram")) + (5<<14));
120   memory_set_bankptr(machine, "bank2", messram + (5<<14));
113121
114122   /* Bank 2 is always in 0x8000 - 0xbfff */
115   memory_set_bankptr(machine, "bank3", messram_get_ptr(devtag_get_device(machine, "messram")) + (2<<14));
123   memory_set_bankptr(machine, "bank3", messram + (2<<14));
116124
117   spectrum_128_port_7ffd_data = 0;
125   state->port_7ffd_data = 0;
126   state->port_1ffd_data = -1;
118127
119128   atm_update_memory(machine);
120129}
src/mess/drivers/mod8.c
r7288r7289
1111#include "cpu/i8008/i8008.h"
1212#include "machine/teleprinter.h"
1313
14static UINT16 tty_data;
15static UINT8 tty_key_data;
16static int tty_cnt  = 0;
14typedef struct _mod8_state mod8_state;
15struct _mod8_state
16{
17   UINT16 tty_data;
18   UINT8 tty_key_data;
19   int tty_cnt;
20};
1721
1822static WRITE8_HANDLER(out_w)
1923{
24   mod8_state *state = (mod8_state *)space->machine->driver_data;
2025   running_device *devconf = devtag_get_device(space->machine, TELEPRINTER_TAG);
2126
22   tty_data >>= 1;
23   tty_data |= (data & 0x01) ? 0x8000 : 0;
24   tty_cnt++;
25   if (tty_cnt==10) {
26      teleprinter_write(devconf,0,(tty_data >> 7) & 0x7f);
27      tty_cnt = 0;
27   state->tty_data >>= 1;
28   state->tty_data |= (data & 0x01) ? 0x8000 : 0;
29   state->tty_cnt++;
30   if (state->tty_cnt==10) {
31      teleprinter_write(devconf,0,(state->tty_data >> 7) & 0x7f);
32      state->tty_cnt = 0;
2833   }
2934}
3035
3136static WRITE8_HANDLER(tty_w)
3237{
33   tty_data = 0;
34   tty_cnt = 0;
38   mod8_state *state = (mod8_state *)space->machine->driver_data;
39
40   state->tty_data = 0;
41   state->tty_cnt = 0;
3542}
3643
3744static READ8_HANDLER(tty_r)
3845{
39   UINT8 d = tty_key_data & 0x01;
40   tty_key_data >>= 1;
46   mod8_state *state = (mod8_state *)space->machine->driver_data;
47   UINT8 d = state->tty_key_data & 0x01;
48
49   state->tty_key_data >>= 1;
4150   return d;
4251}
4352
r7288r7289
7180
7281static WRITE8_DEVICE_HANDLER( mod8_kbd_put )
7382{
74   tty_key_data = data ^ 0xff;
83   mod8_state *state = (mod8_state *)device->machine->driver_data;
84
85   state->tty_key_data = data ^ 0xff;
7586   cputag_set_input_line(device->machine, "maincpu", 0, HOLD_LINE);
7687}
7788
r7288r7289
8192};
8293
8394static MACHINE_DRIVER_START( mod8 )
95
96    MDRV_DRIVER_DATA( mod8_state )
97
8498    /* basic machine hardware */
8599    MDRV_CPU_ADD("maincpu",I8008, 800000)
86100    MDRV_CPU_PROGRAM_MAP(mod8_mem)
src/mess/drivers/sord.c
r7288r7289
5858/* PI-5 interface is required. mode 2 of the 8255 is used to communicate with the FD-5 */
5959
6060
61typedef struct _sord_state sord_state;
62struct _sord_state
63{
64   UINT8 fd5_databus;
65   int fd5_port_0x020_data;
66   int obfa;
67   int ibfa;
68   int intra;
69};
70
6171static MACHINE_RESET( sord_m5 );
6272
63static UINT8 fd5_databus;
64
6573static ADDRESS_MAP_START( sord_fd5_mem , ADDRESS_SPACE_PROGRAM, 8)
6674   AM_RANGE(0x0000, 0x03fff) AM_ROM   /* internal rom */
6775   AM_RANGE(0x4000, 0x0ffff) AM_RAM
6876ADDRESS_MAP_END
6977
7078
71static int obfa,ibfa, intra;
72static int fd5_port_0x020_data;
73
7479/* stb and ack automatically set on read/write? */
7580static WRITE8_HANDLER(fd5_communication_w)
7681{
82   sord_state *state = (sord_state *)space->machine->driver_data;
83
7784   cpu_yield(space->cpu);
7885
79   fd5_port_0x020_data = data;
86   state->fd5_port_0x020_data = data;
8087   LOG(("fd5 0x020: %02x %04x\n",data,cpu_get_pc(space->cpu)));
8188}
8289
8390static  READ8_HANDLER(fd5_communication_r)
8491{
92   sord_state *state = (sord_state *)space->machine->driver_data;
8593   int data;
8694
8795   cpu_yield(space->cpu);
8896
89   data = (obfa<<3)|(ibfa<<2)|2;
97   data = (state->obfa<<3)|(state->ibfa<<2)|2;
9098   LOG(("fd5 0x030: %02x %04x\n",data, cpu_get_pc(space->cpu)));
9199
92100   return data;
r7288r7289
94102
95103static READ8_HANDLER(fd5_data_r)
96104{
105   sord_state *state = (sord_state *)space->machine->driver_data;
106
97107   cpu_yield(space->cpu);
98108
99   LOG(("fd5 0x010 r: %02x %04x\n",fd5_databus,cpu_get_pc(space->cpu)));
109   LOG(("fd5 0x010 r: %02x %04x\n",state->fd5_databus,cpu_get_pc(space->cpu)));
100110
101111   ppi8255_set_port_c(devtag_get_device(space->machine, "ppi8255"), 0x50);
102112   ppi8255_set_port_c(devtag_get_device(space->machine, "ppi8255"), 0x10);
103113   ppi8255_set_port_c(devtag_get_device(space->machine, "ppi8255"), 0x50);
104114
105   return fd5_databus;
115   return state->fd5_databus;
106116}
107117
108118static WRITE8_HANDLER(fd5_data_w)
109119{
120   sord_state *state = (sord_state *)space->machine->driver_data;
121
110122   LOG(("fd5 0x010 w: %02x %04x\n",data,cpu_get_pc(space->cpu)));
111123
112   fd5_databus = data;
124   state->fd5_databus = data;
113125
114126   /* set stb on data write */
115127   ppi8255_set_port_c(devtag_get_device(space->machine, "ppi8255"), 0x50);
r7288r7289
185197
186198static READ8_DEVICE_HANDLER(sord_ppi_porta_r)
187199{
200   sord_state *state = (sord_state *)device->machine->driver_data;
201
188202   cpu_yield(devtag_get_device(device->machine, "maincpu"));
189203
190   return fd5_databus;
204   return state->fd5_databus;
191205}
192206
193207static READ8_DEVICE_HANDLER(sord_ppi_portb_r)
r7288r7289
201215
202216static READ8_DEVICE_HANDLER(sord_ppi_portc_r)
203217{
218   sord_state *state = (sord_state *)device->machine->driver_data;
219
204220   cpu_yield(devtag_get_device(device->machine, "maincpu"));
205221
206222   LOG(("m5 read from pi5 port c %04x\n", cpu_get_pc(devtag_get_device(device->machine, "maincpu"))));
r7288r7289
222238   /* FD5 bit 1 -> M5 bit 0 */
223239   return (
224240         /* FD5 bit 0-> M5 bit 2 */
225         ((fd5_port_0x020_data & 0x01)<<2) |
241         ((state->fd5_port_0x020_data & 0x01)<<2) |
226242         /* FD5 bit 2-> M5 bit 1 */
227         ((fd5_port_0x020_data & 0x04)>>1) |
243         ((state->fd5_port_0x020_data & 0x04)>>1) |
228244         /* FD5 bit 1-> M5 bit 0 */
229         ((fd5_port_0x020_data & 0x02)>>1)
245         ((state->fd5_port_0x020_data & 0x02)>>1)
230246         );
231247}
232248
233249static WRITE8_DEVICE_HANDLER(sord_ppi_porta_w)
234250{
251   sord_state *state = (sord_state *)device->machine->driver_data;
252
235253   cpu_yield(devtag_get_device(device->machine, "maincpu"));
236254
237   fd5_databus = data;
255   state->fd5_databus = data;
238256}
239257
240258static WRITE8_DEVICE_HANDLER(sord_ppi_portb_w)
r7288r7289
261279
262280static WRITE8_DEVICE_HANDLER(sord_ppi_portc_w)
263281{
264   obfa = (data & 0x80) ? 1 : 0;
265   intra = (data & 0x08) ? 1 : 0;
266   ibfa = (data & 0x20) ? 1 : 0;
282   sord_state *state = (sord_state *)device->machine->driver_data;
267283
284   state->obfa = (data & 0x80) ? 1 : 0;
285   state->intra = (data & 0x08) ? 1 : 0;
286   state->ibfa = (data & 0x20) ? 1 : 0;
287
268288   cpu_yield(devtag_get_device(device->machine, "maincpu"));
269289   LOG(("m5 write to pi5 port c: %02x %04x\n", data, cpu_get_pc(devtag_get_device(device->machine, "maincpu"))));
270290}
r7288r7289
517537
518538
519539static MACHINE_DRIVER_START( sord_m5 )
540
541   MDRV_DRIVER_DATA( sord_state )
542
520543   /* basic machine hardware */
521544   MDRV_CPU_ADD("maincpu", Z80, XTAL_14_31818MHz/4)
522545   MDRV_CPU_PROGRAM_MAP(sord_m5_mem)
src/mess/drivers/pentagon.c
r7288r7289
1010#include "machine/beta.h"
1111#include "devices/messram.h"
1212
13static int ROMSelection;
14static running_device* beta;
15
1613static DIRECT_UPDATE_HANDLER( pentagon_direct )
1714{
15   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
16   running_device *beta = devtag_get_device(space->machine, BETA_DISK_TAG);
1817   UINT16 pc = cpu_get_reg(devtag_get_device(space->machine, "maincpu"), REG_GENPCBASE);
1918
2019   if (beta->started && betadisk_is_active(beta))
2120   {
2221      if (pc >= 0x4000)
2322      {
24         ROMSelection = ((spectrum_128_port_7ffd_data>>4) & 0x01) ? 1 : 0;
23         state->ROMSelection = ((state->port_7ffd_data>>4) & 0x01) ? 1 : 0;
2524         betadisk_disable(beta);
2625         memory_unmap_write(space, 0x0000, 0x3fff, 0, 0);
27         memory_set_bankptr(space->machine, "bank1", memory_region(space->machine, "maincpu") + 0x010000 + (ROMSelection<<14));
26         memory_set_bankptr(space->machine, "bank1", memory_region(space->machine, "maincpu") + 0x010000 + (state->ROMSelection<<14));
2827      }
29   } else if (((pc & 0xff00) == 0x3d00) && (ROMSelection==1))
28   } else if (((pc & 0xff00) == 0x3d00) && (state->ROMSelection==1))
3029   {
31      ROMSelection = 3;
30      state->ROMSelection = 3;
3231      if (beta->started)
3332         betadisk_enable(beta);
3433
r7288r7289
3635   if((address>=0x0000) && (address<=0x3fff))
3736   {
3837      memory_unmap_write(space, 0x0000, 0x3fff, 0, 0);
39      if (ROMSelection == 3) {
38      if (state->ROMSelection == 3) {
4039         if (beta->started)
4140            direct->raw = direct->decrypted =  memory_region(space->machine, "beta:beta");
4241      } else {
43         direct->raw = direct->decrypted =  memory_region(space->machine, "maincpu") + 0x010000 + (ROMSelection<<14);
42         direct->raw = direct->decrypted =  memory_region(space->machine, "maincpu") + 0x010000 + (state->ROMSelection<<14);
4443      }
4544      memory_set_bankptr(space->machine, "bank1", direct->raw);
4645      return ~0;
r7288r7289
5049
5150static void pentagon_update_memory(running_machine *machine)
5251{
53   spectrum_screen_location = messram_get_ptr(devtag_get_device(machine, "messram")) + ((spectrum_128_port_7ffd_data & 8) ? (7<<14) : (5<<14));
52   spectrum_state *state = (spectrum_state *)machine->driver_data;
53   running_device *beta = devtag_get_device(machine, BETA_DISK_TAG);
54   UINT8 *messram = messram_get_ptr(devtag_get_device(machine, "messram"));
55   state->screen_location = messram + ((state->port_7ffd_data & 8) ? (7<<14) : (5<<14));
5456
55   memory_set_bankptr(machine, "bank4", messram_get_ptr(devtag_get_device(machine, "messram")) + ((spectrum_128_port_7ffd_data & 0x07) * 0x4000));
57   memory_set_bankptr(machine, "bank4", messram + ((state->port_7ffd_data & 0x07) * 0x4000));
5658
57   if (beta->started && betadisk_is_active(beta) && !( spectrum_128_port_7ffd_data & 0x10 ) )
59   if (beta->started && betadisk_is_active(beta) && !( state->port_7ffd_data & 0x10 ) )
5860   {
5961      /* GLUK */
6062      if (strcmp(machine->gamedrv->name, "pent1024")==0) {
61         ROMSelection = 2;
63         state->ROMSelection = 2;
6264      } else {
63         ROMSelection = ((spectrum_128_port_7ffd_data>>4) & 0x01) ;
65         state->ROMSelection = ((state->port_7ffd_data>>4) & 0x01) ;
6466      }
6567   }
6668   else {
6769      /* ROM switching */
68      ROMSelection = ((spectrum_128_port_7ffd_data>>4) & 0x01) ;
70      state->ROMSelection = ((state->port_7ffd_data>>4) & 0x01) ;
6971   }
7072   /* rom 0 is 128K rom, rom 1 is 48 BASIC */
71   memory_set_bankptr(machine, "bank1", memory_region(machine, "maincpu") + 0x010000 + (ROMSelection<<14));
73   memory_set_bankptr(machine, "bank1", memory_region(machine, "maincpu") + 0x010000 + (state->ROMSelection<<14));
7274}
7375
7476static WRITE8_HANDLER(pentagon_port_7ffd_w)
7577{
78   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
79
7680   /* disable paging */
77   if (spectrum_128_port_7ffd_data & 0x20)
81   if (state->port_7ffd_data & 0x20)
7882      return;
7983
8084   /* store new state */
81   spectrum_128_port_7ffd_data = data;
85   state->port_7ffd_data = data;
8286
8387   /* update memory */
8488   pentagon_update_memory(space->machine);
r7288r7289
99103
100104static MACHINE_RESET( pentagon )
101105{
106   spectrum_state *state = (spectrum_state *)machine->driver_data;
107   UINT8 *messram = messram_get_ptr(devtag_get_device(machine, "messram"));
108   running_device *beta = devtag_get_device(machine, BETA_DISK_TAG);
102109   const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
103   beta = devtag_get_device(machine, BETA_DISK_TAG);
104110
105111   memory_install_read_bank(space, 0x0000, 0x3fff, 0, 0, "bank1");
106112   memory_unmap_write(space, 0x0000, 0x3fff, 0, 0);
r7288r7289
112118
113119   memory_set_direct_update_handler( space, pentagon_direct );
114120
115   memset(messram_get_ptr(devtag_get_device(machine, "messram")),0,128*1024);
121   memset(messram,0,128*1024);
116122
117123   /* Bank 5 is always in 0x4000 - 0x7fff */
118   memory_set_bankptr(machine, "bank2", messram_get_ptr(devtag_get_device(machine, "messram")) + (5<<14));
124   memory_set_bankptr(machine, "bank2", messram + (5<<14));
119125
120126   /* Bank 2 is always in 0x8000 - 0xbfff */
121   memory_set_bankptr(machine, "bank3", messram_get_ptr(devtag_get_device(machine, "messram")) + (2<<14));
127   memory_set_bankptr(machine, "bank3", messram + (2<<14));
122128
123   spectrum_128_port_7ffd_data = 0;
124
129   state->port_7ffd_data = 0;
130   state->port_1ffd_data = -1;
125131   pentagon_update_memory(machine);
126132}
127133
src/mess/drivers/pasogo.c
r7288r7289
1818  rtc interrupt irq 2
1919 */
2020
21static struct {
21typedef struct _vg230_t vg230_t;
22struct _vg230_t
23{
2224   UINT8 index;
2325   UINT8 data[0x100];
2426   struct {
r7288r7289
3638   struct {
3739      int write_protected;
3840   } pmu;
39} vg230;
41};
4042
43typedef struct _ems_t ems_t;
44struct _ems_t
45{
46   UINT8 data;
47   int index;
48   struct {
49      UINT8 data[2];
50      int address;
51      int type;
52      int on;
53   } mapper[26];
54};
4155
56typedef struct _pasogo_state pasogo_state;
57struct _pasogo_state
58{
59   struct _vg230_t vg230;
60   struct _ems_t ems;
61};
62
63
4264static TIMER_CALLBACK( vg230_timer )
4365{
44   vg230.rtc.seconds+=1;
45   if (vg230.rtc.seconds>=60)
66   pasogo_state *state = (pasogo_state *)machine->driver_data;
67   vg230_t *vg230 = &state->vg230;
68
69   vg230->rtc.seconds+=1;
70   if (vg230->rtc.seconds>=60)
4671   {
47      vg230.rtc.seconds=00;
48      vg230.rtc.minutes+=1;
49      if (vg230.rtc.minutes>=60)
72      vg230->rtc.seconds=00;
73      vg230->rtc.minutes+=1;
74      if (vg230->rtc.minutes>=60)
5075      {
51         vg230.rtc.minutes=0;
52         vg230.rtc.hours+=1;
53         if (vg230.rtc.hours>=24)
76         vg230->rtc.minutes=0;
77         vg230->rtc.hours+=1;
78         if (vg230->rtc.hours>=24)
5479         {
55            vg230.rtc.hours=0;
56            vg230.rtc.days=(vg230.rtc.days+1)&0xfff;
80            vg230->rtc.hours=0;
81            vg230->rtc.days=(vg230->rtc.days+1)&0xfff;
5782         }
5883      }
5984   }
6085
61   if (vg230.rtc.seconds==vg230.rtc.alarm_seconds
62      && vg230.rtc.minutes==vg230.rtc.alarm_minutes
63      && vg230.rtc.hours==vg230.rtc.alarm_hours
64      && (vg230.rtc.days&0x1f)==vg230.rtc.alarm_hours)
86   if (vg230->rtc.seconds==vg230->rtc.alarm_seconds
87      && vg230->rtc.minutes==vg230->rtc.alarm_minutes
88      && vg230->rtc.hours==vg230->rtc.alarm_hours
89      && (vg230->rtc.days&0x1f)==vg230->rtc.alarm_hours)
6590   {
6691      // generate alarm
6792   }
r7288r7289
6994
7095static void vg230_reset(running_machine *machine)
7196{
97   pasogo_state *state = (pasogo_state *)machine->driver_data;
98   vg230_t *vg230 = &state->vg230;
7299   mame_system_time systime;
73100
74   memset(&vg230, 0, sizeof(vg230));
75   vg230.pmu.write_protected=TRUE;
101   memset(vg230, 0, sizeof(*vg230));
102   vg230->pmu.write_protected=TRUE;
76103   timer_pulse(machine, ATTOTIME_IN_HZ(1), NULL, 0, vg230_timer);
77104
78105
79106   mame_get_base_datetime(machine, &systime);
80107
81   vg230.rtc.seconds= systime.local_time.second;
82   vg230.rtc.minutes= systime.local_time.minute;
83   vg230.rtc.hours = systime.local_time.hour;
84   vg230.rtc.days = 0;
108   vg230->rtc.seconds= systime.local_time.second;
109   vg230->rtc.minutes= systime.local_time.minute;
110   vg230->rtc.hours = systime.local_time.hour;
111   vg230->rtc.days = 0;
85112
86   vg230.bios_timer.data=0x7200; // HACK
113   vg230->bios_timer.data=0x7200; // HACK
87114}
88115
89116static void vg230_init(running_machine *machine)
r7288r7289
94121
95122static READ8_HANDLER( vg230_io_r )
96123{
124   pasogo_state *state = (pasogo_state *)space->machine->driver_data;
125   vg230_t *vg230 = &state->vg230;
97126   int log=TRUE;
98127   UINT8 data=0;
99   vg230.bios_timer.data+=0x100; //HACK
128
129   vg230->bios_timer.data+=0x100; //HACK
100130   if (offset&1)
101131   {
102      data=vg230.data[vg230.index];
103      switch (vg230.index)
132      data=vg230->data[vg230->index];
133      switch (vg230->index)
104134      {
105135         case 0x09: break;
106136         case 0x0a:
107            if (vg230.data[9]&1)
137            if (vg230->data[9]&1)
108138            {
109139               data=input_port_read(space->machine, "JOY");
110140            }
r7288r7289
115145            break;
116146
117147         case 0x30:
118            data=vg230.bios_timer.data&0xff;
148            data=vg230->bios_timer.data&0xff;
119149            break;
120150
121151         case 0x31:
122            data=vg230.bios_timer.data>>8;
152            data=vg230->bios_timer.data>>8;
123153            log=FALSE;
124154            break;
125155
126         case 0x70: data=vg230.rtc.seconds; log=FALSE; break;
127         case 0x71: data=vg230.rtc.minutes; log=FALSE; break;
128         case 0x72: data=vg230.rtc.hours; log=FALSE; break;
129         case 0x73: data=vg230.rtc.days; break;
130         case 0x74: data=vg230.rtc.days>>8; break;
156         case 0x70: data=vg230->rtc.seconds; log=FALSE; break;
157         case 0x71: data=vg230->rtc.minutes; log=FALSE; break;
158         case 0x72: data=vg230->rtc.hours; log=FALSE; break;
159         case 0x73: data=vg230->rtc.days; break;
160         case 0x74: data=vg230->rtc.days>>8; break;
131161         case 0x79: /*rtc status*/log=FALSE; break;
132162         case 0x7a:
133163            data&=~3;
134            if (vg230.rtc.alarm_interrupt_request) data|=1<<1;
135            if (vg230.rtc.onehertz_interrupt_request) data|=1<<0;
164            if (vg230->rtc.alarm_interrupt_request) data|=1<<1;
165            if (vg230->rtc.onehertz_interrupt_request) data|=1<<0;
136166            break;
137167
138168         case 0xc1:
139169            data&=~1;
140            if (vg230.pmu.write_protected) data|=1;
141            vg230.pmu.write_protected=FALSE;
170            if (vg230->pmu.write_protected) data|=1;
171            vg230->pmu.write_protected=FALSE;
142172            log=FALSE;
143173            break;
144174      }
145175
146176      if (log)
147         logerror("%.5x vg230 %02x read %.2x\n",(int) cpu_get_pc(space->cpu),vg230.index,data);
177         logerror("%.5x vg230 %02x read %.2x\n",(int) cpu_get_pc(space->cpu),vg230->index,data);
148178      //    data=memory_region(machine, "maincpu")[0x4000+offset];
149179   }
150180   else
151181   {
152      data=vg230.index;
182      data=vg230->index;
153183    }
154184   return data;
155185}
156186
157187static WRITE8_HANDLER( vg230_io_w )
158188{
189   pasogo_state *state = (pasogo_state *)space->machine->driver_data;
190   vg230_t *vg230 = &state->vg230;
159191   int log=TRUE;
192
160193   if (offset&1)
161194   {
162195      //  memory_region(machine, "maincpu")[0x4000+offset]=data;
163      vg230.data[vg230.index]=data;
164      switch (vg230.index)
196      vg230->data[vg230->index]=data;
197      switch (vg230->index)
165198      {
166199         case 0x09: break;
167         case 0x70: vg230.rtc.seconds=data&0x3f; break;
168         case 0x71: vg230.rtc.minutes=data&0x3f; break;
169         case 0x72: vg230.rtc.hours=data&0x1f;break;
170         case 0x73: vg230.rtc.days=(vg230.rtc.days&~0xff)|data; break;
171         case 0x74: vg230.rtc.days=(vg230.rtc.days&0xff)|((data&0xf)<<8); break;
172         case 0x75: vg230.rtc.alarm_seconds=data&0x3f; break;
173         case 0x76: vg230.rtc.alarm_minutes=data&0x3f; break;
174         case 0x77: vg230.rtc.alarm_hours=data&0x1f; break;
175         case 0x78: vg230.rtc.days=data&0x1f; break;
200         case 0x70: vg230->rtc.seconds=data&0x3f; break;
201         case 0x71: vg230->rtc.minutes=data&0x3f; break;
202         case 0x72: vg230->rtc.hours=data&0x1f;break;
203         case 0x73: vg230->rtc.days=(vg230->rtc.days&~0xff)|data; break;
204         case 0x74: vg230->rtc.days=(vg230->rtc.days&0xff)|((data&0xf)<<8); break;
205         case 0x75: vg230->rtc.alarm_seconds=data&0x3f; break;
206         case 0x76: vg230->rtc.alarm_minutes=data&0x3f; break;
207         case 0x77: vg230->rtc.alarm_hours=data&0x1f; break;
208         case 0x78: vg230->rtc.days=data&0x1f; break;
176209         case 0x79:
177            vg230.rtc.onehertz_interrupt_on=data&1;
178            vg230.rtc.alarm_interrupt_on=data&2;
210            vg230->rtc.onehertz_interrupt_on=data&1;
211            vg230->rtc.alarm_interrupt_on=data&2;
179212            log=FALSE;
180213            break;
181214
182215         case 0x7a:
183216            if (data&2)
184217            {
185               vg230.rtc.alarm_interrupt_request=FALSE; vg230.rtc.onehertz_interrupt_request=FALSE; /* update interrupt */
218               vg230->rtc.alarm_interrupt_request=FALSE; vg230->rtc.onehertz_interrupt_request=FALSE; /* update interrupt */
186219            }
187220            break;
188221      }
189222
190223      if (log)
191         logerror("%.5x vg230 %02x write %.2x\n",(int)cpu_get_pc(space->cpu),vg230.index,data);
224         logerror("%.5x vg230 %02x write %.2x\n",(int)cpu_get_pc(space->cpu),vg230->index,data);
192225   }
193226   else
194227   {
195      vg230.index=data;
228      vg230->index=data;
196229   }
197230}
198231
199static struct {
200   UINT8 data;
201   int index;
202   struct {
203      UINT8 data[2];
204      int address;
205      int type;
206      int on;
207   } mapper[26];
208} ems/*?*/;
209
210232static READ8_HANDLER( ems_r )
211233{
234   pasogo_state *state = (pasogo_state *)space->machine->driver_data;
235   ems_t *ems = &state->ems;
212236   UINT8 data=0;
237
213238   switch (offset)
214239   {
215      case 0: data=ems.data; break;
216      case 2: case 3: data=ems.mapper[ems.index].data[offset&1]; break;
240      case 0: data=ems->data; break;
241      case 2: case 3: data=ems->mapper[ems->index].data[offset&1]; break;
217242   }
218243   return data;
219244}
220245
221246static WRITE8_HANDLER( ems_w )
222247{
248   pasogo_state *state = (pasogo_state *)space->machine->driver_data;
249   ems_t *ems = &state->ems;
223250   char bank[10];
251
224252   switch (offset)
225253   {
226254   case 0:
227      ems.data=data;
255      ems->data=data;
228256      switch (data&~3)
229257      {
230      case 0x80: ems.index=0; break;
231      case 0x84: ems.index=1; break;
232      case 0x88: ems.index=2; break;
233      case 0x8c: ems.index=3; break;
234      case 0x90: ems.index=4; break;
235      case 0x94: ems.index=5; break;
236      case 0x98: ems.index=6; break;
237      case 0x9c: ems.index=7; break;
238      case 0xa0: ems.index=8; break;
239      case 0xa4: ems.index=9; break;
240      case 0xa8: ems.index=10; break;
241      case 0xac: ems.index=11; break;
242      case 0xb0: ems.index=12; break;
243      case 0xb4: ems.index=13; break;
244      //  case 0xb8: ems.index=14; break;
245      //  case 0xbc: ems.index=15; break;
246      case 0xc0: ems.index=14; break;
247      case 0xc4: ems.index=15; break;
248      case 0xc8: ems.index=16; break;
249      case 0xcc: ems.index=17; break;
250      case 0xd0: ems.index=18; break;
251      case 0xd4: ems.index=19; break;
252      case 0xd8: ems.index=20; break;
253      case 0xdc: ems.index=21; break;
254      case 0xe0: ems.index=22; break;
255      case 0xe4: ems.index=23; break;
256      case 0xe8: ems.index=24; break;
257      case 0xec: ems.index=25; break;
258      case 0x80: ems->index=0; break;
259      case 0x84: ems->index=1; break;
260      case 0x88: ems->index=2; break;
261      case 0x8c: ems->index=3; break;
262      case 0x90: ems->index=4; break;
263      case 0x94: ems->index=5; break;
264      case 0x98: ems->index=6; break;
265      case 0x9c: ems->index=7; break;
266      case 0xa0: ems->index=8; break;
267      case 0xa4: ems->index=9; break;
268      case 0xa8: ems->index=10; break;
269      case 0xac: ems->index=11; break;
270      case 0xb0: ems->index=12; break;
271      case 0xb4: ems->index=13; break;
272      //  case 0xb8: ems->index=14; break;
273      //  case 0xbc: ems->index=15; break;
274      case 0xc0: ems->index=14; break;
275      case 0xc4: ems->index=15; break;
276      case 0xc8: ems->index=16; break;
277      case 0xcc: ems->index=17; break;
278      case 0xd0: ems->index=18; break;
279      case 0xd4: ems->index=19; break;
280      case 0xd8: ems->index=20; break;
281      case 0xdc: ems->index=21; break;
282      case 0xe0: ems->index=22; break;
283      case 0xe4: ems->index=23; break;
284      case 0xe8: ems->index=24; break;
285      case 0xec: ems->index=25; break;
258286      }
259287      break;
260288
261289   case 2:
262290   case 3:
263      ems.mapper[ems.index].data[offset&1]=data;
264      ems.mapper[ems.index].address=(ems.mapper[ems.index].data[0]<<14)|((ems.mapper[ems.index].data[1]&0xf)<<22);
265      ems.mapper[ems.index].on=ems.mapper[ems.index].data[1]&0x80;
266      ems.mapper[ems.index].type=(ems.mapper[ems.index].data[1]&0x70)>>4;
267      logerror("%.5x ems mapper %d(%05x)on:%d type:%d address:%07x\n",(int)cpu_get_pc(space->cpu),ems.index, ems.data<<12,
268         ems.mapper[ems.index].on, ems.mapper[ems.index].type, ems.mapper[ems.index].address );
269      switch (ems.mapper[ems.index].type)
291      ems->mapper[ems->index].data[offset&1]=data;
292      ems->mapper[ems->index].address=(ems->mapper[ems->index].data[0]<<14)|((ems->mapper[ems->index].data[1]&0xf)<<22);
293      ems->mapper[ems->index].on=ems->mapper[ems->index].data[1]&0x80;
294      ems->mapper[ems->index].type=(ems->mapper[ems->index].data[1]&0x70)>>4;
295      logerror("%.5x ems mapper %d(%05x)on:%d type:%d address:%07x\n",(int)cpu_get_pc(space->cpu),ems->index, ems->data<<12,
296         ems->mapper[ems->index].on, ems->mapper[ems->index].type, ems->mapper[ems->index].address );
297      switch (ems->mapper[ems->index].type)
270298      {
271299      case 0: /*external*/
272300      case 1: /*ram*/
273      sprintf(bank,"bank%d",ems.index+1);
274      memory_set_bankptr( space->machine, bank, memory_region(space->machine, "maincpu") + (ems.mapper[ems.index].address&0xfffff) );
301      sprintf(bank,"bank%d",ems->index+1);
302      memory_set_bankptr( space->machine, bank, memory_region(space->machine, "maincpu") + (ems->mapper[ems->index].address&0xfffff) );
275303      break;
276304      case 3: /* rom 1 */
277305      case 4: /* pc card a */
r7288r7289
279307      default:
280308      break;
281309      case 2:
282      sprintf(bank,"bank%d",ems.index+1);
283      memory_set_bankptr( space->machine,  bank, memory_region(space->machine, "user1") + (ems.mapper[ems.index].address&0xfffff) );
310      sprintf(bank,"bank%d",ems->index+1);
311      memory_set_bankptr( space->machine,  bank, memory_region(space->machine, "user1") + (ems->mapper[ems->index].address&0xfffff) );
284312      break;
285313      }
286314      break;
r7288r7289
367395
368396static VIDEO_UPDATE( pasogo )
369397{
370   static int width=-1, height=-1;
398   //static int width=-1,height=-1;
371399   UINT8 *rom = memory_region(screen->machine, "maincpu")+0xb8000;
372400   UINT16 c[]={ 3, 0 };
373401   int x,y;
r7288r7289
412440         }
413441      }
414442   }
443#if 0
415444   if (w!=width || h!=height)
416445   {
417446      width=w; height=h;
418447//      video_screen_set_visarea(machine->primary_screen, 0, width-1, 0, height-1);
419448      video_screen_set_visarea(screen, 0, width-1, 0, height-1);
420449   }
450#endif
421451   return 0;
422452}
423453
r7288r7289
486516}
487517
488518static MACHINE_DRIVER_START( pasogo )
519
520   MDRV_DRIVER_DATA( pasogo_state )
521
489522   MDRV_CPU_ADD("maincpu", I80188/*V30HL in vadem vg230*/, 10000000/*?*/)
490523   MDRV_CPU_PROGRAM_MAP(pasogo_mem)
491524   MDRV_CPU_IO_MAP( pasogo_io)
r7288r7289
527560
528561static DRIVER_INIT( pasogo )
529562{
563   pasogo_state *state = (pasogo_state *)machine->driver_data;
530564   vg230_init(machine);
531   memset(&ems, 0, sizeof(ems));
565   memset(&state->ems, 0, sizeof(state->ems));
532566   memory_set_bankptr( machine, "bank27", memory_region(machine, "user1") + 0x00000 );
533567   memory_set_bankptr( machine, "bank28", memory_region(machine, "maincpu") + 0xb8000/*?*/ );
534568}
src/mess/drivers/specpls3.c
r7288r7289
164164/* This driver uses some of the spectrum_128 functions. The +3 is similar to a spectrum 128
165165but with a disc drive */
166166
167int spectrum_plus3_port_1ffd_data = -1;
168
169
170167static const upd765_interface spectrum_plus3_upd765_interface =
171168{
172169   DEVCB_NULL,
r7288r7289
211208
212209void spectrum_plus3_update_memory(running_machine *machine)
213210{
211   spectrum_state *state = (spectrum_state *)machine->driver_data;
214212   const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
213   UINT8 *messram = messram_get_ptr(devtag_get_device(machine, "messram"));
215214
216   if (spectrum_128_port_7ffd_data & 8)
215   if (state->port_7ffd_data & 8)
217216   {
218         logerror("+3 SCREEN 1: BLOCK 7\n");
219         spectrum_screen_location = messram_get_ptr(devtag_get_device(machine, "messram")) + (7 << 14);
217      logerror("+3 SCREEN 1: BLOCK 7\n");
218      state->screen_location = messram + (7 << 14);
220219   }
221220   else
222221   {
223         logerror("+3 SCREEN 0: BLOCK 5\n");
224         spectrum_screen_location = messram_get_ptr(devtag_get_device(machine, "messram")) + (5 << 14);
222      logerror("+3 SCREEN 0: BLOCK 5\n");
223      state->screen_location = messram + (5 << 14);
225224   }
226225
227   if ((spectrum_plus3_port_1ffd_data & 0x01) == 0)
226   if ((state->port_1ffd_data & 0x01) == 0)
228227   {
229228         int ram_page;
230229         unsigned char *ram_data;
r7288r7289
234233         int ROMSelection;
235234
236235         /* select ram at 0x0c000-0x0ffff */
237         ram_page = spectrum_128_port_7ffd_data & 0x07;
238         ram_data = messram_get_ptr(devtag_get_device(machine, "messram")) + (ram_page<<14);
236         ram_page = state->port_7ffd_data & 0x07;
237         ram_data = messram + (ram_page<<14);
239238
240239         memory_set_bankptr(machine, "bank4", ram_data);
241240
r7288r7289
243242
244243         /* Reset memory between 0x4000 - 0xbfff in case extended paging was being used */
245244         /* Bank 5 in 0x4000 - 0x7fff */
246         memory_set_bankptr(machine, "bank2", messram_get_ptr(devtag_get_device(machine, "messram")) + (5 << 14));
245         memory_set_bankptr(machine, "bank2", messram + (5 << 14));
247246
248247         /* Bank 2 in 0x8000 - 0xbfff */
249         memory_set_bankptr(machine, "bank3", messram_get_ptr(devtag_get_device(machine, "messram")) + (2 << 14));
248         memory_set_bankptr(machine, "bank3", messram + (2 << 14));
250249
251250
252         ROMSelection = ((spectrum_128_port_7ffd_data >> 4) & 0x01) |
253            ((spectrum_plus3_port_1ffd_data >> 1) & 0x02);
251         ROMSelection = ((state->port_7ffd_data >> 4) & 0x01) |
252            ((state->port_1ffd_data >> 1) & 0x02);
254253
255254         /* rom 0 is editor, rom 1 is syntax, rom 2 is DOS, rom 3 is 48 BASIC */
256255
r7288r7289
269268         int MemorySelection;
270269         unsigned char *ram_data;
271270
272         MemorySelection = (spectrum_plus3_port_1ffd_data >> 1) & 0x03;
271         MemorySelection = (state->port_1ffd_data >> 1) & 0x03;
273272
274273         memory_selection = &spectrum_plus3_memory_selections[(MemorySelection << 2)];
275274
276         ram_data = messram_get_ptr(devtag_get_device(machine, "messram")) + (memory_selection[0] << 14);
275         ram_data = messram + (memory_selection[0] << 14);
277276         memory_set_bankptr(machine, "bank1", ram_data);
278277         /* allow writes to 0x0000-0x03fff */
279278         memory_install_write_bank(space, 0x0000, 0x3fff, 0, 0, "bank1");
280279
281         ram_data = messram_get_ptr(devtag_get_device(machine, "messram")) + (memory_selection[1] << 14);
280         ram_data = messram + (memory_selection[1] << 14);
282281         memory_set_bankptr(machine, "bank2", ram_data);
283282
284         ram_data = messram_get_ptr(devtag_get_device(machine, "messram")) + (memory_selection[2] << 14);
283         ram_data = messram + (memory_selection[2] << 14);
285284         memory_set_bankptr(machine, "bank3", ram_data);
286285
287         ram_data = messram_get_ptr(devtag_get_device(machine, "messram")) + (memory_selection[3] << 14);
286         ram_data = messram + (memory_selection[3] << 14);
288287         memory_set_bankptr(machine, "bank4", ram_data);
289288
290289         logerror("extended memory paging: %02x\n", MemorySelection);
r7288r7289
300299      /* D4 - ROM select - which rom paged into 0x0000-0x03fff */
301300      /* D5 - Disable paging */
302301
303      /* disable paging? */
304      if (spectrum_128_port_7ffd_data & 0x20)
305            return;
302   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
306303
307      /* store new state */
308      spectrum_128_port_7ffd_data = data;
304   /* disable paging? */
305   if (state->port_7ffd_data & 0x20)
306      return;
309307
310      /* update memory */
311      spectrum_plus3_update_memory(space->machine);
308   /* store new state */
309   state->port_7ffd_data = data;
310
311   /* update memory */
312   spectrum_plus3_update_memory(space->machine);
312313}
313314
314315static WRITE8_HANDLER(spectrum_plus3_port_1ffd_w)
r7288r7289
318319   /* D3 - Disk motor on/off */
319320   /* D4 - parallel port strobe */
320321
322   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
323
321324   floppy_mon_w(floppy_get_device(space->machine, 0), !BIT(data, 3));
322325   floppy_mon_w(floppy_get_device(space->machine, 1), !BIT(data, 3));
323326   floppy_drive_set_ready_state(floppy_get_device(space->machine, 0), 1, 1);
324327   floppy_drive_set_ready_state(floppy_get_device(space->machine, 1), 1, 1);
325328
326   spectrum_plus3_port_1ffd_data = data;
329   state->port_1ffd_data = data;
327330
328331   /* disable paging? */
329   if ((spectrum_128_port_7ffd_data & 0x20)==0)
332   if ((state->port_7ffd_data & 0x20)==0)
330333   {
331334         /* no */
332335         spectrum_plus3_update_memory(space->machine);
r7288r7289
349352
350353static MACHINE_RESET( spectrum_plus3 )
351354{
352   memset(messram_get_ptr(devtag_get_device(machine, "messram")),0,128*1024);
355   spectrum_state *state = (spectrum_state *)machine->driver_data;
356   UINT8 *messram = messram_get_ptr(devtag_get_device(machine, "messram"));
357   memset(messram,0,128*1024);
353358
359   MACHINE_RESET_CALL(spectrum);
360
354361   /* Initial configuration */
355   spectrum_128_port_7ffd_data = 0;
356   spectrum_plus3_port_1ffd_data = 0;
362   state->port_7ffd_data = 0;
363   state->port_1ffd_data = 0;
357364   spectrum_plus3_update_memory(machine);
358
359   MACHINE_RESET_CALL(spectrum);
360365}
361366
362367static const floppy_config specpls3_floppy_config =
src/mess/drivers/timex.c
r7288r7289
159159#include "machine/beta.h"
160160#include "devices/messram.h"
161161
162TIMEX_CART_TYPE timex_cart_type = TIMEX_CART_NONE;
163UINT8 timex_cart_chunks = 0x00;
164UINT8 *timex_cart_data;
165
166162static const ay8910_interface spectrum_ay_interface =
167163{
168164   AY8910_LEGACY_OUTPUT,
r7288r7289
174170/* TS2048 specific functions */
175171
176172
177int ts2068_port_ff_data = -1; /* Display enhancement control */
178int ts2068_port_f4_data = -1; /* Horizontal Select Register */
179
180173static  READ8_HANDLER(ts2068_port_f4_r)
181174{
182      return ts2068_port_f4_data;
175   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
176
177   return state->port_f4_data;
183178}
184179
185180static WRITE8_HANDLER(ts2068_port_f4_w)
186181{
187      ts2068_port_f4_data = data;
188      ts2068_update_memory(space->machine);
182   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
183
184   state->port_f4_data = data;
185   ts2068_update_memory(space->machine);
189186}
190187
191188static  READ8_HANDLER(ts2068_port_ff_r)
192189{
193      return ts2068_port_ff_data;
190   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
191
192   return state->port_ff_data;
194193}
195194
196195static WRITE8_HANDLER(ts2068_port_ff_w)
r7288r7289
201200           Bit  6   17ms Interrupt Inhibit
202201           Bit  7   Cartridge (0) / EXROM (1) select
203202        */
204      ts2068_port_ff_data = data;
205      ts2068_update_memory(space->machine);
206      logerror("Port %04x write %02x\n", offset, data);
203   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
204
205   state->port_ff_data = data;
206   ts2068_update_memory(space->machine);
207   logerror("Port %04x write %02x\n", offset, data);
207208}
208209
209210/*******************************************************************
r7288r7289
226227 *******************************************************************/
227228void ts2068_update_memory(running_machine *machine)
228229{
230   spectrum_state *state = (spectrum_state *)machine->driver_data;
231   UINT8 *messram = messram_get_ptr(devtag_get_device(machine, "messram"));
229232   const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
230233   unsigned char *ChosenROM, *ExROM, *DOCK;
231234
r7288r7289
233236
234237   ExROM = memory_region(machine, "maincpu") + 0x014000;
235238
236   if (ts2068_port_f4_data & 0x01)
239   if (state->port_f4_data & 0x01)
237240   {
238      if (ts2068_port_ff_data & 0x80)
241      if (state->port_ff_data & 0x80)
239242      {
240243            memory_install_read_bank(space, 0x0000, 0x1fff, 0, 0, "bank1");
241244            memory_unmap_write(space, 0x0000, 0x1fff, 0, 0);
r7288r7289
272275      logerror("0000-1fff HOME\n");
273276   }
274277
275   if (ts2068_port_f4_data & 0x02)
278   if (state->port_f4_data & 0x02)
276279   {
277      if (ts2068_port_ff_data & 0x80)
280      if (state->port_ff_data & 0x80)
278281      {
279282         memory_set_bankptr(machine, "bank2", ExROM);
280283         memory_install_read_bank(space, 0x2000, 0x3fff, 0, 0, "bank2");
r7288r7289
310313      logerror("2000-3fff HOME\n");
311314   }
312315
313   if (ts2068_port_f4_data & 0x04)
316   if (state->port_f4_data & 0x04)
314317   {
315      if (ts2068_port_ff_data & 0x80)
318      if (state->port_ff_data & 0x80)
316319      {
317320         memory_set_bankptr(machine, "bank3", ExROM);
318321         memory_install_read_bank(space, 0x4000, 0x5fff, 0, 0, "bank3");
r7288r7289
340343   }
341344   else
342345   {
343      memory_set_bankptr(machine, "bank3", messram_get_ptr(devtag_get_device(machine, "messram")));
344      memory_set_bankptr(machine, "bank11", messram_get_ptr(devtag_get_device(machine, "messram")));
346      memory_set_bankptr(machine, "bank3", messram);
347      memory_set_bankptr(machine, "bank11", messram);
345348      memory_install_read_bank(space, 0x4000, 0x5fff, 0, 0, "bank3");
346349      memory_install_write_bank(space, 0x4000, 0x5fff, 0, 0, "bank11");
347350      logerror("4000-5fff RAM\n");
348351   }
349352
350   if (ts2068_port_f4_data & 0x08)
353   if (state->port_f4_data & 0x08)
351354   {
352      if (ts2068_port_ff_data & 0x80)
355      if (state->port_ff_data & 0x80)
353356      {
354357         memory_set_bankptr(machine, "bank4", ExROM);
355358         memory_install_read_bank(space, 0x6000, 0x7fff, 0, 0, "bank4");
r7288r7289
377380   }
378381   else
379382   {
380      memory_set_bankptr(machine, "bank4", messram_get_ptr(devtag_get_device(machine, "messram")) + 0x2000);
381      memory_set_bankptr(machine, "bank12", messram_get_ptr(devtag_get_device(machine, "messram")) + 0x2000);
383      memory_set_bankptr(machine, "bank4", messram + 0x2000);
384      memory_set_bankptr(machine, "bank12", messram + 0x2000);
382385      memory_install_read_bank(space, 0x6000, 0x7fff, 0, 0, "bank4");
383386      memory_install_write_bank(space, 0x6000, 0x7fff, 0, 0, "bank12");
384387      logerror("6000-7fff RAM\n");
385388   }
386389
387   if (ts2068_port_f4_data & 0x10)
390   if (state->port_f4_data & 0x10)
388391   {
389      if (ts2068_port_ff_data & 0x80)
392      if (state->port_ff_data & 0x80)
390393      {
391394         memory_set_bankptr(machine, "bank5", ExROM);
392395         memory_install_read_bank(space, 0x8000, 0x9fff, 0, 0, "bank5");
r7288r7289
414417   }
415418   else
416419   {
417      memory_set_bankptr(machine, "bank5", messram_get_ptr(devtag_get_device(machine, "messram")) + 0x4000);
418      memory_set_bankptr(machine, "bank13", messram_get_ptr(devtag_get_device(machine, "messram")) + 0x4000);
420      memory_set_bankptr(machine, "bank5", messram + 0x4000);
421      memory_set_bankptr(machine, "bank13", messram + 0x4000);
419422      memory_install_read_bank(space, 0x8000, 0x9fff, 0, 0,"bank5");
420423      memory_install_write_bank(space, 0x8000, 0x9fff, 0, 0,"bank13");
421424      logerror("8000-9fff RAM\n");
422425   }
423426
424   if (ts2068_port_f4_data & 0x20)
427   if (state->port_f4_data & 0x20)
425428   {
426      if (ts2068_port_ff_data & 0x80)
429      if (state->port_ff_data & 0x80)
427430      {
428431         memory_set_bankptr(machine, "bank6", ExROM);
429432         memory_install_read_bank(space, 0xa000, 0xbfff, 0, 0, "bank6");
r7288r7289
452455   }
453456   else
454457   {
455      memory_set_bankptr(machine, "bank6", messram_get_ptr(devtag_get_device(machine, "messram")) + 0x6000);
456      memory_set_bankptr(machine, "bank14", messram_get_ptr(devtag_get_device(machine, "messram")) + 0x6000);
458      memory_set_bankptr(machine, "bank6", messram + 0x6000);
459      memory_set_bankptr(machine, "bank14", messram + 0x6000);
457460      memory_install_read_bank(space, 0xa000, 0xbfff, 0, 0, "bank6");
458461      memory_install_write_bank(space, 0xa000, 0xbfff, 0, 0, "bank14");
459462      logerror("a000-bfff RAM\n");
460463   }
461464
462   if (ts2068_port_f4_data & 0x40)
465   if (state->port_f4_data & 0x40)
463466   {
464      if (ts2068_port_ff_data & 0x80)
467      if (state->port_ff_data & 0x80)
465468      {
466469         memory_set_bankptr(machine, "bank7", ExROM);
467470         memory_install_read_bank(space, 0xc000, 0xdfff, 0, 0, "bank7");
r7288r7289
489492   }
490493   else
491494   {
492      memory_set_bankptr(machine, "bank7", messram_get_ptr(devtag_get_device(machine, "messram")) + 0x8000);
493      memory_set_bankptr(machine, "bank15", messram_get_ptr(devtag_get_device(machine, "messram")) + 0x8000);
495      memory_set_bankptr(machine, "bank7", messram + 0x8000);
496      memory_set_bankptr(machine, "bank15", messram + 0x8000);
494497      memory_install_read_bank(space, 0xc000, 0xdfff, 0, 0, "bank7");
495498      memory_install_write_bank(space, 0xc000, 0xdfff, 0, 0, "bank15");
496499      logerror("c000-dfff RAM\n");
497500   }
498501
499   if (ts2068_port_f4_data & 0x80)
502   if (state->port_f4_data & 0x80)
500503   {
501      if (ts2068_port_ff_data & 0x80)
504      if (state->port_ff_data & 0x80)
502505      {
503506         memory_set_bankptr(machine, "bank8", ExROM);
504507         memory_install_read_bank(space, 0xe000, 0xffff, 0, 0, "bank8");
r7288r7289
526529   }
527530   else
528531   {
529      memory_set_bankptr(machine, "bank8", messram_get_ptr(devtag_get_device(machine, "messram")) + 0xa000);
530      memory_set_bankptr(machine, "bank16", messram_get_ptr(devtag_get_device(machine, "messram")) + 0xa000);
532      memory_set_bankptr(machine, "bank8", messram + 0xa000);
533      memory_set_bankptr(machine, "bank16", messram + 0xa000);
531534      memory_install_read_bank(space, 0xe000, 0xffff, 0, 0, "bank8");
532535      memory_install_write_bank(space, 0xe000, 0xffff, 0, 0, "bank16");
533536      logerror("e000-ffff RAM\n");
534537   }
535538}
536539
537static ADDRESS_MAP_START (ts2068_io, ADDRESS_SPACE_IO, 8)
540static ADDRESS_MAP_START(ts2068_io, ADDRESS_SPACE_IO, 8)
538541   AM_RANGE(0x1f, 0x1f) AM_READ( spectrum_port_1f_r ) AM_MIRROR(0xff00)
539542   AM_RANGE(0x7f, 0x7f) AM_READ( spectrum_port_7f_r ) AM_MIRROR(0xff00)
540543   AM_RANGE(0xdf, 0xdf) AM_READ( spectrum_port_df_r ) AM_MIRROR(0xff00)
r7288r7289
545548   AM_RANGE(0xff, 0xff) AM_READWRITE( ts2068_port_ff_r,ts2068_port_ff_w ) AM_MIRROR(0xff00)
546549ADDRESS_MAP_END
547550
548static ADDRESS_MAP_START (ts2068_mem, ADDRESS_SPACE_PROGRAM, 8)
551static ADDRESS_MAP_START(ts2068_mem, ADDRESS_SPACE_PROGRAM, 8)
549552   AM_RANGE(0x0000, 0x1fff) AM_READ_BANK("bank1") AM_WRITE_BANK("bank9")
550553   AM_RANGE(0x2000, 0x3fff) AM_READ_BANK("bank2") AM_WRITE_BANK("bank10")
551554   AM_RANGE(0x4000, 0x5fff) AM_READ_BANK("bank3") AM_WRITE_BANK("bank11")
r7288r7289
559562
560563static MACHINE_RESET( ts2068 )
561564{
562   ts2068_port_ff_data = 0;
563   ts2068_port_f4_data = 0;
565   spectrum_state *state = (spectrum_state *)machine->driver_data;
566
567   state->port_ff_data = 0;
568   state->port_f4_data = 0;
564569   ts2068_update_memory(machine);
570   MACHINE_RESET_CALL(spectrum);
565571
566   MACHINE_RESET_CALL(spectrum);
567572}
568573
569574
r7288r7289
571576/* TC2048 specific functions */
572577
573578
574static WRITE8_HANDLER (tc2048_port_ff_w)
579static WRITE8_HANDLER( tc2048_port_ff_w )
575580{
576      ts2068_port_ff_data = data;
577      logerror("Port %04x write %02x\n", offset, data);
581   spectrum_state *state = (spectrum_state *)space->machine->driver_data;
582
583   state->port_ff_data = data;
584   logerror("Port %04x write %02x\n", offset, data);
578585}
579586
580static ADDRESS_MAP_START (tc2048_io, ADDRESS_SPACE_IO, 8)
587static ADDRESS_MAP_START(tc2048_io, ADDRESS_SPACE_IO, 8)
581588   AM_RANGE(0x00, 0x00) AM_READWRITE(spectrum_port_fe_r,spectrum_port_fe_w) AM_MIRROR(0xfffe) AM_MASK(0xffff)
582589   AM_RANGE(0x1f, 0x1f) AM_READ(spectrum_port_1f_r) AM_MIRROR(0xff00)
583590   AM_RANGE(0x7f, 0x7f) AM_READ(spectrum_port_7f_r) AM_MIRROR(0xff00)
r7288r7289
585592   AM_RANGE(0xff, 0xff) AM_READWRITE(ts2068_port_ff_r,tc2048_port_ff_w)  AM_MIRROR(0xff00)
586593ADDRESS_MAP_END
587594
588static ADDRESS_MAP_START (tc2048_mem, ADDRESS_SPACE_PROGRAM, 8)
595static ADDRESS_MAP_START(tc2048_mem, ADDRESS_SPACE_PROGRAM, 8)
589596   AM_RANGE( 0x0000, 0x3fff) AM_ROM
590597   AM_RANGE( 0x4000, 0xffff) AM_READ_BANK("bank1") AM_WRITE_BANK("bank2")
591598ADDRESS_MAP_END
592599
593600static MACHINE_RESET( tc2048 )
594601{
595   memory_set_bankptr(machine, "bank1", messram_get_ptr(devtag_get_device(machine, "messram")));
596   memory_set_bankptr(machine, "bank2", messram_get_ptr(devtag_get_device(machine, "messram")));
597   ts2068_port_ff_data = 0;
602   spectrum_state *state = (spectrum_state *)machine->driver_data;
603   UINT8 *messram = messram_get_ptr(devtag_get_device(machine, "messram"));
598604
605   memory_set_bankptr(machine, "bank1", messram);
606   memory_set_bankptr(machine, "bank2", messram);
607   state->port_ff_data = 0;
608   state->port_f4_data = -1;
599609   MACHINE_RESET_CALL(spectrum);
600610}
601611
src/mess/drivers/elwro800.c
r7288r7289
3535 *  State/Globals
3636 *
3737 *************************************/
38static UINT8 elwro800_df_on_databus = 0xdf;
3938
4039typedef struct _elwro800_state elwro800_state;
4140struct _elwro800_state
4241{
42   spectrum_state spectrum;
43
4344   /* RAM mapped at 0 */
4445   UINT8 ram_at_0000;
4546
4647   /* NR signal */
4748   UINT8 NR;
49   UINT8 df_on_databus;
4850};
4951
5052/*************************************
r7288r7289
5961   elwro800_state *state = (elwro800_state *)space->machine->driver_data;
6062   if (state->ram_at_0000 && address == 0x66)
6163   {
62      direct->raw = direct->decrypted = &elwro800_df_on_databus;
64      direct->raw = direct->decrypted = &state->df_on_databus;
6365      direct->bytemask = 0;
6466      return ~0;
6567   }
r7288r7289
104106static void elwro800jr_mmu_w(running_machine *machine, UINT8 data)
105107{
106108   UINT8 *prom = memory_region(machine, "proms") + 0x200;
109   UINT8 *messram = messram_get_ptr(devtag_get_device(machine, "messram"));
107110   UINT8 cs;
108111   UINT8 ls175;
109112   elwro800_state *state = (elwro800_state *)machine->driver_data;
r7288r7289
128131   else
129132   {
130133      // RAM
131      memory_set_bankptr(machine, "bank1", messram_get_ptr(devtag_get_device(machine, "messram")));
134      memory_set_bankptr(machine, "bank1", messram);
132135      memory_install_write_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x0000, 0x1fff, 0, 0, "bank1");
133136      state->ram_at_0000 = 1;
134137   }
r7288r7289
141144   }
142145   else
143146   {
144      memory_set_bankptr(machine, "bank2", messram_get_ptr(devtag_get_device(machine, "messram")) + 0x2000); /* RAM */
147      memory_set_bankptr(machine, "bank2", messram + 0x2000); /* RAM */
145148      memory_install_write_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x2000, 0x3fff, 0, 0, "bank2");
146149   }
147150
148151   if (BIT(ls175,2))
149152   {
150153      // relok
151      spectrum_screen_location = messram_get_ptr(devtag_get_device(machine, "messram")) + 0xe000;
154      state->spectrum.screen_location = messram + 0xe000;
152155   }
153156   else
154157   {
155      spectrum_screen_location = messram_get_ptr(devtag_get_device(machine, "messram")) + 0x4000;
158      state->spectrum.screen_location = messram + 0x4000;
156159   }
157160
158161   state->NR = BIT(ls175,3);
r7288r7289
507510
508511static MACHINE_RESET(elwro800)
509512{
510   memset(messram_get_ptr(devtag_get_device(machine, "messram")), 0, 64*1024);
513   elwro800_state *state = (elwro800_state *)machine->driver_data;
514   UINT8 *messram = messram_get_ptr(devtag_get_device(machine, "messram"));
511515
512   memory_set_bankptr(machine, "bank3", messram_get_ptr(devtag_get_device(machine, "messram")) + 0x4000);
516   state->df_on_databus = 0xdf;
517   memset(messram, 0, 64*1024);
513518
519   memory_set_bankptr(machine, "bank3", messram + 0x4000);
520
521   state->spectrum.port_7ffd_data = 0;
522   state->spectrum.port_1ffd_data = -1;
523
514524   // this is a reset of ls175 in mmu
515525   elwro800jr_mmu_w(machine, 0);
516526

Previous 509078 RevisionsNext 50


© 1998-2010 The MESS Team