Previous 15994 Revisions Next

r9643 Tuesday 23rd November, 2010 at 10:45:59 UTC by Curt Coder
[SG1000] Refactored driver to define ADDRESS_MAP_MODERN.
[docs]messnew.txt
[src/mess/drivers]sg1000.c
[src/mess/includes]sg1000.h

src/mess/includes/sg1000.h
r9642r9643
2828{
2929public:
3030   sg1000_state(running_machine &machine, const driver_device_config_base &config)
31      : driver_device(machine, config) { }
31      : driver_device(machine, config),
32        m_maincpu(*this, Z80_TAG),
33        m_ram(*this, "messram")
34   { }
3235
36   required_device<cpu_device> m_maincpu;
37   required_device<running_device> m_ram;
38
39   virtual void machine_start();
40   
41   void install_cartridge(UINT8 *ptr, int size);
42
43   DECLARE_WRITE8_MEMBER( tvdraw_axis_w );
44   DECLARE_READ8_MEMBER( tvdraw_status_r );
45   DECLARE_READ8_MEMBER( tvdraw_data_r );
46   DECLARE_READ8_MEMBER( joysel_r );
47
3348   /* keyboard state */
34   UINT8 keylatch;
49   UINT8 m_keylatch;
3550
3651   /* TV Draw state */
37   UINT8 tvdraw_data;
52   UINT8 m_tvdraw_data;
53};
3854
39   /* floppy state */
40   int fdc_irq;
41   int fdc_index;
55class sc3000_state : public sg1000_state
56{
57public:
58   sc3000_state(running_machine &machine, const driver_device_config_base &config)
59      : sg1000_state(machine, config),
60        m_cassette(*this, CASSETTE_TAG)
61   { }
4262
43   /* devices */
44   running_device *upd765;
45   running_device *centronics;
46   running_device *cassette;
63   required_device<running_device> m_cassette;
64
65   virtual void machine_start();
66
67   void install_cartridge(UINT8 *ptr, int size);
68
69   DECLARE_READ8_MEMBER( ppi_pa_r );
70   DECLARE_READ8_MEMBER( ppi_pb_r );
71   DECLARE_WRITE8_MEMBER( ppi_pc_w );
4772};
4873
74class sf7000_state : public sc3000_state
75{
76public:
77   sf7000_state(running_machine &machine, const driver_device_config_base &config)
78      : sc3000_state(machine, config),
79        m_fdc(*this, UPD765_TAG),
80        m_centronics(*this, CENTRONICS_TAG),
81        m_floppy0(*this, FLOPPY_0)
82   { }
83
84   required_device<running_device> m_fdc;
85   required_device<running_device> m_centronics;
86   required_device<running_device> m_floppy0;
87
88   virtual void machine_start();
89   virtual void machine_reset();
90
91   DECLARE_READ8_MEMBER( ppi_pa_r );
92   DECLARE_WRITE8_MEMBER( ppi_pc_w );
93   DECLARE_WRITE_LINE_MEMBER( fdc_intrq_w );
94
95   /* floppy state */
96   int m_fdc_irq;
97   int m_fdc_index;
98};
99
49100#endif
src/mess/drivers/sg1000.c
r9642r9643
6262
6363*/
6464
65#define ADDRESS_MAP_MODERN
66
6567#include "emu.h"
6668#include "cpu/z80/z80.h"
67#include "includes/sg1000.h"
6869#include "devices/flopdrv.h"
6970#include "devices/cartslot.h"
7071#include "devices/cassette.h"
r9642r9643
7980#include "sound/sn76496.h"
8081#include "video/tms9928a.h"
8182#include "crsshair.h"
83#include "includes/sg1000.h"
8284
8385/***************************************************************************
8486    READ/WRITE HANDLERS
r9642r9643
105107    tvdraw_axis_w - TV Draw axis select
106108-------------------------------------------------*/
107109
108static WRITE8_HANDLER( tvdraw_axis_w )
110WRITE8_MEMBER( sg1000_state::tvdraw_axis_w )
109111{
110   sg1000_state *state = space->machine->driver_data<sg1000_state>();
111
112112   if (data & 0x01)
113113   {
114      state->tvdraw_data = input_port_read(space->machine, "TVDRAW_X");
114      m_tvdraw_data = input_port_read(machine, "TVDRAW_X");
115115
116      if (state->tvdraw_data < 4) state->tvdraw_data = 4;
117      if (state->tvdraw_data > 251) state->tvdraw_data = 251;
116      if (m_tvdraw_data < 4) m_tvdraw_data = 4;
117      if (m_tvdraw_data > 251) m_tvdraw_data = 251;
118118   }
119119   else
120120   {
121      state->tvdraw_data = input_port_read(space->machine, "TVDRAW_Y") + 32;
121      m_tvdraw_data = input_port_read(machine, "TVDRAW_Y") + 32;
122122   }
123123}
124124
r9642r9643
126126    tvdraw_status_r - TV Draw status read
127127-------------------------------------------------*/
128128
129static READ8_HANDLER( tvdraw_status_r )
129READ8_MEMBER( sg1000_state::tvdraw_status_r )
130130{
131   return input_port_read(space->machine, "TVDRAW_PEN");
131   return input_port_read(machine, "TVDRAW_PEN");
132132}
133133
134134/*-------------------------------------------------
135135    tvdraw_data_r - TV Draw data read
136136-------------------------------------------------*/
137137
138static READ8_HANDLER( tvdraw_data_r )
138READ8_MEMBER( sg1000_state::tvdraw_data_r )
139139{
140   sg1000_state *state = space->machine->driver_data<sg1000_state>();
141
142   return state->tvdraw_data;
140   return m_tvdraw_data;
143141}
144142
145143/*-------------------------------------------------
146    sg1000_joysel_r -
144    joysel_r -
147145-------------------------------------------------*/
148146
149static READ8_HANDLER( sg1000_joysel_r )
147READ8_MEMBER( sg1000_state::joysel_r )
150148{
151149   return 0x80;
152150}
r9642r9643
159157    ADDRESS_MAP( sg1000_map )
160158-------------------------------------------------*/
161159
162static ADDRESS_MAP_START( sg1000_map, ADDRESS_SPACE_PROGRAM, 8 )
160static ADDRESS_MAP_START( sg1000_map, ADDRESS_SPACE_PROGRAM, 8, sg1000_state )
163161   AM_RANGE(0x0000, 0x7fff) AM_ROM
164162   AM_RANGE(0x8000, 0xbfff) AM_RAMBANK("bank1")
165163   AM_RANGE(0xc000, 0xffff) AM_RAMBANK("bank2")
r9642r9643
169167    ADDRESS_MAP( sg1000_io_map )
170168-------------------------------------------------*/
171169
172static ADDRESS_MAP_START( sg1000_io_map, ADDRESS_SPACE_IO, 8 )
170static ADDRESS_MAP_START( sg1000_io_map, ADDRESS_SPACE_IO, 8, sg1000_state )
173171   ADDRESS_MAP_GLOBAL_MASK(0xff)
174   AM_RANGE(0x40, 0x40) AM_MIRROR(0x3f) AM_DEVWRITE(SN76489A_TAG, sn76496_w)
175   AM_RANGE(0x80, 0x80) AM_MIRROR(0x3e) AM_READWRITE(TMS9928A_vram_r, TMS9928A_vram_w)
176   AM_RANGE(0x81, 0x81) AM_MIRROR(0x3e) AM_READWRITE(TMS9928A_register_r, TMS9928A_register_w)
172   AM_RANGE(0x40, 0x40) AM_MIRROR(0x3f) AM_DEVWRITE_LEGACY(SN76489A_TAG, sn76496_w)
173   AM_RANGE(0x80, 0x80) AM_MIRROR(0x3e) AM_READWRITE_LEGACY(TMS9928A_vram_r, TMS9928A_vram_w)
174   AM_RANGE(0x81, 0x81) AM_MIRROR(0x3e) AM_READWRITE_LEGACY(TMS9928A_register_r, TMS9928A_register_w)
177175   AM_RANGE(0xdc, 0xdc) AM_READ_PORT("PA7")
178176   AM_RANGE(0xdd, 0xdd) AM_READ_PORT("PB7")
179   AM_RANGE(0xde, 0xde) AM_READ(sg1000_joysel_r) AM_WRITENOP
177   AM_RANGE(0xde, 0xde) AM_READ(joysel_r) AM_WRITENOP
180178   AM_RANGE(0xdf, 0xdf) AM_NOP
181179ADDRESS_MAP_END
182180
r9642r9643
184182    ADDRESS_MAP( omv_map )
185183-------------------------------------------------*/
186184
187static ADDRESS_MAP_START( omv_map, ADDRESS_SPACE_PROGRAM, 8 )
185static ADDRESS_MAP_START( omv_map, ADDRESS_SPACE_PROGRAM, 8, sg1000_state )
188186   AM_RANGE(0x0000, 0x7fff) AM_ROM
189187   AM_RANGE(0x8000, 0xbfff) AM_RAMBANK("bank1")
190188   AM_RANGE(0xc000, 0xc7ff) AM_MIRROR(0x3800) AM_RAM
r9642r9643
194192    ADDRESS_MAP( omv_io_map )
195193-------------------------------------------------*/
196194
197static ADDRESS_MAP_START( omv_io_map, ADDRESS_SPACE_IO, 8 )
195static ADDRESS_MAP_START( omv_io_map, ADDRESS_SPACE_IO, 8, sg1000_state )
198196   ADDRESS_MAP_GLOBAL_MASK(0xff)
199   AM_RANGE(0x40, 0x40) AM_MIRROR(0x3f) AM_DEVWRITE(SN76489A_TAG, sn76496_w)
200   AM_RANGE(0x80, 0x80) AM_MIRROR(0x3e) AM_READWRITE(TMS9928A_vram_r, TMS9928A_vram_w)
201   AM_RANGE(0x81, 0x81) AM_MIRROR(0x3e) AM_READWRITE(TMS9928A_register_r, TMS9928A_register_w)
197   AM_RANGE(0x40, 0x40) AM_MIRROR(0x3f) AM_DEVWRITE_LEGACY(SN76489A_TAG, sn76496_w)
198   AM_RANGE(0x80, 0x80) AM_MIRROR(0x3e) AM_READWRITE_LEGACY(TMS9928A_vram_r, TMS9928A_vram_w)
199   AM_RANGE(0x81, 0x81) AM_MIRROR(0x3e) AM_READWRITE_LEGACY(TMS9928A_register_r, TMS9928A_register_w)
202200   AM_RANGE(0xc0, 0xc0) AM_MIRROR(0x38) AM_READ_PORT("C0")
203201   AM_RANGE(0xc1, 0xc1) AM_MIRROR(0x38) AM_READ_PORT("C1")
204202   AM_RANGE(0xc2, 0xc2) AM_MIRROR(0x38) AM_READ_PORT("C2")
r9642r9643
211209    ADDRESS_MAP( sc3000_map )
212210-------------------------------------------------*/
213211
214static ADDRESS_MAP_START( sc3000_map, ADDRESS_SPACE_PROGRAM, 8 )
212static ADDRESS_MAP_START( sc3000_map, ADDRESS_SPACE_PROGRAM, 8, sg1000_state )
215213   AM_RANGE(0x0000, 0x7fff) AM_ROM
216214   AM_RANGE(0x8000, 0xbfff) AM_RAMBANK("bank1")
217215   AM_RANGE(0xc000, 0xffff) AM_RAMBANK("bank2")
r9642r9643
221219    ADDRESS_MAP( sc3000_io_map )
222220-------------------------------------------------*/
223221
224static ADDRESS_MAP_START( sc3000_io_map, ADDRESS_SPACE_IO, 8 )
222static ADDRESS_MAP_START( sc3000_io_map, ADDRESS_SPACE_IO, 8, sg1000_state )
225223   ADDRESS_MAP_GLOBAL_MASK(0xff)
226   AM_RANGE(0x7f, 0x7f) AM_DEVWRITE(SN76489A_TAG, sn76496_w)
227   AM_RANGE(0xbe, 0xbe) AM_READWRITE(TMS9928A_vram_r, TMS9928A_vram_w)
228   AM_RANGE(0xbf, 0xbf) AM_READWRITE(TMS9928A_register_r, TMS9928A_register_w)
229   AM_RANGE(0xdc, 0xdf) AM_DEVREADWRITE(UPD9255_TAG, i8255a_r, i8255a_w)
224   AM_RANGE(0x7f, 0x7f) AM_DEVWRITE_LEGACY(SN76489A_TAG, sn76496_w)
225   AM_RANGE(0xbe, 0xbe) AM_READWRITE_LEGACY(TMS9928A_vram_r, TMS9928A_vram_w)
226   AM_RANGE(0xbf, 0xbf) AM_READWRITE_LEGACY(TMS9928A_register_r, TMS9928A_register_w)
227   AM_RANGE(0xdc, 0xdf) AM_DEVREADWRITE_LEGACY(UPD9255_TAG, i8255a_r, i8255a_w)
230228ADDRESS_MAP_END
231229
232230/* This is how the I/O ports are really mapped, but MAME does not support overlapping ranges
233static ADDRESS_MAP_START( sc3000_io_map, ADDRESS_SPACE_IO, 8 )
231static ADDRESS_MAP_START( sc3000_io_map, ADDRESS_SPACE_IO, 8, sg1000_state )
234232    ADDRESS_MAP_GLOBAL_MASK(0xff)
235    AM_RANGE(0x00, 0x00) AM_MIRROR(0xdf) AM_DEVREADWRITE(UPD9255_TAG, i8255a_r, i8255a_w)
236    AM_RANGE(0x00, 0x00) AM_MIRROR(0x7f) AM_DEVWRITE(SN76489A_TAG, sn76496_w)
237    AM_RANGE(0x00, 0x00) AM_MIRROR(0xae) AM_READWRITE(TMS9928A_vram_r, TMS9928A_vram_w)
238    AM_RANGE(0x01, 0x01) AM_MIRROR(0xae) AM_READWRITE(TMS9928A_register_r, TMS9928A_register_w)
233    AM_RANGE(0x00, 0x00) AM_MIRROR(0xdf) AM_DEVREADWRITE_LEGACY(UPD9255_TAG, i8255a_r, i8255a_w)
234    AM_RANGE(0x00, 0x00) AM_MIRROR(0x7f) AM_DEVWRITE_LEGACY(SN76489A_TAG, sn76496_w)
235    AM_RANGE(0x00, 0x00) AM_MIRROR(0xae) AM_READWRITE_LEGACY(TMS9928A_vram_r, TMS9928A_vram_w)
236    AM_RANGE(0x01, 0x01) AM_MIRROR(0xae) AM_READWRITE_LEGACY(TMS9928A_register_r, TMS9928A_register_w)
239237    AM_RANGE(0x60, 0x60) AM_MIRROR(0x9f) AM_READ(sc3000_r_r)
240238ADDRESS_MAP_END
241239*/
r9642r9643
244242    ADDRESS_MAP( sf7000_map )
245243-------------------------------------------------*/
246244
247static ADDRESS_MAP_START( sf7000_map, ADDRESS_SPACE_PROGRAM, 8 )
245static ADDRESS_MAP_START( sf7000_map, ADDRESS_SPACE_PROGRAM, 8, sf7000_state )
248246   AM_RANGE(0x0000, 0x3fff) AM_READ_BANK("bank1") AM_WRITE_BANK("bank2")
249247   AM_RANGE(0x4000, 0xffff) AM_RAM
250248ADDRESS_MAP_END
r9642r9643
253251    ADDRESS_MAP( sf7000_io_map )
254252-------------------------------------------------*/
255253
256static ADDRESS_MAP_START( sf7000_io_map, ADDRESS_SPACE_IO, 8 )
254static ADDRESS_MAP_START( sf7000_io_map, ADDRESS_SPACE_IO, 8, sf7000_state )
257255   ADDRESS_MAP_GLOBAL_MASK(0xff)
258   AM_RANGE(0x7f, 0x7f) AM_DEVWRITE(SN76489A_TAG, sn76496_w)
259   AM_RANGE(0xbe, 0xbe) AM_READWRITE(TMS9928A_vram_r, TMS9928A_vram_w)
260   AM_RANGE(0xbf, 0xbf) AM_READWRITE(TMS9928A_register_r, TMS9928A_register_w)
261   AM_RANGE(0xdc, 0xdf) AM_DEVREADWRITE(UPD9255_0_TAG, i8255a_r, i8255a_w)
262   AM_RANGE(0xe0, 0xe0) AM_DEVREAD(UPD765_TAG, upd765_status_r)
263   AM_RANGE(0xe1, 0xe1) AM_DEVREADWRITE(UPD765_TAG, upd765_data_r, upd765_data_w)
264   AM_RANGE(0xe4, 0xe7) AM_DEVREADWRITE(UPD9255_1_TAG, i8255a_r, i8255a_w)
265   AM_RANGE(0xe8, 0xe8) AM_DEVREADWRITE(UPD8251_TAG, msm8251_data_r, msm8251_data_w)
266   AM_RANGE(0xe9, 0xe9) AM_DEVREADWRITE(UPD8251_TAG, msm8251_status_r, msm8251_control_w)
256   AM_RANGE(0x7f, 0x7f) AM_DEVWRITE_LEGACY(SN76489A_TAG, sn76496_w)
257   AM_RANGE(0xbe, 0xbe) AM_READWRITE_LEGACY(TMS9928A_vram_r, TMS9928A_vram_w)
258   AM_RANGE(0xbf, 0xbf) AM_READWRITE_LEGACY(TMS9928A_register_r, TMS9928A_register_w)
259   AM_RANGE(0xdc, 0xdf) AM_DEVREADWRITE_LEGACY(UPD9255_0_TAG, i8255a_r, i8255a_w)
260   AM_RANGE(0xe0, 0xe0) AM_DEVREAD_LEGACY(UPD765_TAG, upd765_status_r)
261   AM_RANGE(0xe1, 0xe1) AM_DEVREADWRITE_LEGACY(UPD765_TAG, upd765_data_r, upd765_data_w)
262   AM_RANGE(0xe4, 0xe7) AM_DEVREADWRITE_LEGACY(UPD9255_1_TAG, i8255a_r, i8255a_w)
263   AM_RANGE(0xe8, 0xe8) AM_DEVREADWRITE_LEGACY(UPD8251_TAG, msm8251_data_r, msm8251_data_w)
264   AM_RANGE(0xe9, 0xe9) AM_DEVREADWRITE_LEGACY(UPD8251_TAG, msm8251_status_r, msm8251_control_w)
267265ADDRESS_MAP_END
268266
269267/***************************************************************************
r9642r9643
559557    I8255A_INTERFACE( sc3000_ppi_intf )
560558-------------------------------------------------*/
561559
562static READ8_DEVICE_HANDLER( sc3000_ppi_pa_r )
560READ8_MEMBER( sc3000_state::ppi_pa_r )
563561{
564562   /*
565563        Signal  Description
r9642r9643
574572        PA7     Keyboard input
575573    */
576574
577   sg1000_state *state = device->machine->driver_data<sg1000_state>();
578
579575   static const char *const keynames[] = { "PA0", "PA1", "PA2", "PA3", "PA4", "PA5", "PA6", "PA7" };
580576
581   return input_port_read(device->machine, keynames[state->keylatch]);
577   return input_port_read(machine, keynames[m_keylatch]);
582578}
583579
584static READ8_DEVICE_HANDLER( sc3000_ppi_pb_r )
580READ8_MEMBER( sc3000_state::ppi_pb_r )
585581{
586582   /*
587583        Signal  Description
r9642r9643
596592        PB7     Cassette tape input
597593    */
598594
599   sg1000_state *state = device->machine->driver_data<sg1000_state>();
600
601595   static const char *const keynames[] = { "PB0", "PB1", "PB2", "PB3", "PB4", "PB5", "PB6", "PB7" };
602596
603597   /* keyboard */
604   UINT8 data = input_port_read(device->machine, keynames[state->keylatch]);
598   UINT8 data = input_port_read(machine, keynames[m_keylatch]);
605599
606600   /* cartridge contact */
607601   data |= 0x10;
r9642r9643
610604   data |= 0x60;
611605
612606   /* tape input */
613   if (cassette_input(state->cassette) > +0.0) data |= 0x80;
607   if (cassette_input(m_cassette) > +0.0) data |= 0x80;
614608
615609   return data;
616610}
617611
618static WRITE8_DEVICE_HANDLER( sc3000_ppi_pc_w )
612WRITE8_MEMBER( sc3000_state::ppi_pc_w )
619613{
620614   /*
621615        Signal  Description
r9642r9643
630624        PC7     /FEED to printer
631625    */
632626
633   sg1000_state *state = device->machine->driver_data<sg1000_state>();
634
635627   /* keyboard */
636   state->keylatch = data & 0x07;
628   m_keylatch = data & 0x07;
637629
638630   /* cassette */
639   cassette_output(state->cassette, BIT(data, 4) ? +1.0 : -1.0);
631   cassette_output(m_cassette, BIT(data, 4) ? +1.0 : -1.0);
640632
641633   /* TODO printer */
642634}
643635
644636static I8255A_INTERFACE( sc3000_ppi_intf )
645637{
646   DEVCB_HANDLER(sc3000_ppi_pa_r),   // Port A read
647   DEVCB_HANDLER(sc3000_ppi_pb_r),   // Port B read
648   DEVCB_NULL,                  // Port C read
649   DEVCB_NULL,                  // Port A write
650   DEVCB_NULL,                  // Port B write
651   DEVCB_HANDLER(sc3000_ppi_pc_w),   // Port C write
638   DEVCB_DRIVER_MEMBER(sc3000_state, ppi_pa_r),   // Port A read
639   DEVCB_DRIVER_MEMBER(sc3000_state, ppi_pb_r),   // Port B read
640   DEVCB_NULL,                              // Port C read
641   DEVCB_NULL,                              // Port A write
642   DEVCB_NULL,                              // Port B write
643   DEVCB_DRIVER_MEMBER(sc3000_state, ppi_pc_w),   // Port C write
652644};
653645
654646/*-------------------------------------------------
r9642r9643
667659    I8255A_INTERFACE( sf7000_ppi_intf )
668660-------------------------------------------------*/
669661
670static READ8_DEVICE_HANDLER( sf7000_ppi_pa_r )
662READ8_MEMBER( sf7000_state::ppi_pa_r )
671663{
672664   /*
673665        Signal  Description
r9642r9643
682674        PA7
683675    */
684676
685   sg1000_state *state = device->machine->driver_data<sg1000_state>();
686   UINT8 result = 0;
677   UINT8 data = 0;
687678
688   result |= state->fdc_irq;
689   result |= centronics_busy_r(state->centronics) << 1;
690   result |= state->fdc_index << 2;
679   data |= m_fdc_irq;
680   data |= centronics_busy_r(m_centronics) << 1;
681   data |= m_fdc_index << 2;
691682
692   return result;
683   return data;
693684}
694685
695static WRITE8_DEVICE_HANDLER( sf7000_ppi_pc_w )
686WRITE8_MEMBER( sf7000_state::ppi_pc_w )
696687{
697688   /*
698689        Signal  Description
r9642r9643
707698        PC7     /STROBE to Centronics printer
708699    */
709700
710   sg1000_state *state = device->machine->driver_data<sg1000_state>();
711
712701   /* floppy motor */
713   floppy_mon_w(floppy_get_device(device->machine, 0), BIT(data, 1));
714   floppy_drive_set_ready_state(floppy_get_device(device->machine, 0), 1, 1);
702   floppy_mon_w(m_floppy0, BIT(data, 1));
703   floppy_drive_set_ready_state(m_floppy0, 1, 1);
715704
716705   /* FDC terminal count */
717   upd765_tc_w(state->upd765, BIT(data, 2));
706   upd765_tc_w(m_fdc, BIT(data, 2));
718707
719708   /* FDC reset */
720709   if (BIT(data, 3))
721710   {
722      upd765_reset(state->upd765, 0);
711      upd765_reset(m_fdc, 0);
723712   }
724713
725714   /* ROM selection */
726   memory_set_bank(device->machine, "bank1", BIT(data, 6));
715   memory_set_bank(machine, "bank1", BIT(data, 6));
727716
728717   /* printer strobe */
729   centronics_strobe_w(state->centronics, BIT(data, 7));
718   centronics_strobe_w(m_centronics, BIT(data, 7));
730719}
731720
732721static I8255A_INTERFACE( sf7000_ppi_intf )
733722{
734   DEVCB_HANDLER(sf7000_ppi_pa_r),      // Port A read
735   DEVCB_NULL,                     // Port B read
736   DEVCB_NULL,                     // Port C read
737   DEVCB_NULL,                     // Port A write
723   DEVCB_DRIVER_MEMBER(sf7000_state, ppi_pa_r),            // Port A read
724   DEVCB_NULL,                                       // Port B read
725   DEVCB_NULL,                                       // Port C read
726   DEVCB_NULL,                                       // Port A write
738727   DEVCB_DEVICE_HANDLER(CENTRONICS_TAG, centronics_data_w),   // Port B write
739   DEVCB_HANDLER(sf7000_ppi_pc_w)      // Port C write
728   DEVCB_DRIVER_MEMBER(sf7000_state, ppi_pc_w)               // Port C write
740729};
741730
742731/*-------------------------------------------------
743732    upd765_interface sf7000_upd765_interface
744733-------------------------------------------------*/
745734
746static WRITE_LINE_DEVICE_HANDLER( sf7000_fdc_interrupt )
735WRITE_LINE_MEMBER( sf7000_state::fdc_intrq_w )
747736{
748   sg1000_state *driver_state = device->machine->driver_data<sg1000_state>();
749
750   driver_state->fdc_irq = state;
737   m_fdc_irq = state;
751738}
752739
753740static const struct upd765_interface sf7000_upd765_interface =
754741{
755   DEVCB_LINE(sf7000_fdc_interrupt),
742   DEVCB_DRIVER_LINE_MEMBER(sf7000_state, fdc_intrq_w),
756743   DEVCB_NULL,
757744   NULL,
758745   UPD765_RDY_PIN_CONNECTED,
r9642r9643
793780***************************************************************************/
794781
795782/*-------------------------------------------------
796    sg1000_map_cartridge_memory -
783    sg1000_install_cartridge -
797784-------------------------------------------------*/
798785
799static void sg1000_map_cartridge_memory(running_machine *machine, UINT8 *ptr, int size)
786void sg1000_state::install_cartridge(UINT8 *ptr, int size)
800787{
801   address_space *program = cputag_get_address_space(machine, Z80_TAG, ADDRESS_SPACE_PROGRAM);
788   address_space *program = cpu_get_address_space(m_maincpu, ADDRESS_SPACE_PROGRAM);
802789
803790   switch (size)
804791   {
r9642r9643
819806   default:
820807      if (IS_CARTRIDGE_TV_DRAW(ptr))
821808      {
822         memory_install_write8_handler(program, 0x6000, 0x6000, 0, 0, &tvdraw_axis_w);
823         memory_install_read8_handler(program, 0x8000, 0x8000, 0, 0, &tvdraw_status_r);
824         memory_install_read8_handler(program, 0xa000, 0xa000, 0, 0, &tvdraw_data_r);
809         program->install_handler(0x6000, 0x6000, 0, 0, write8_delegate_create(sg1000_state, tvdraw_axis_w, *this), 0);
810         program->install_handler(0x8000, 0x8000, 0, 0, read8_delegate_create(sg1000_state, tvdraw_status_r, *this), 0);
811         program->install_handler(0xa000, 0xa000, 0, 0, read8_delegate_create(sg1000_state, tvdraw_data_r, *this), 0);
825812         memory_nop_write(program, 0xa000, 0xa000, 0, 0);
826813      }
827814      else if (IS_CARTRIDGE_THE_CASTLE(ptr))
r9642r9643
838825
839826static DEVICE_IMAGE_LOAD( sg1000_cart )
840827{
841   address_space *program = cputag_get_address_space(image.device().machine, Z80_TAG, ADDRESS_SPACE_PROGRAM);
828   running_machine *machine = image.device().machine;
829   sg1000_state *state = machine->driver_data<sg1000_state>();
830   address_space *program = cputag_get_address_space(machine, Z80_TAG, ADDRESS_SPACE_PROGRAM);
831   UINT8 *ptr = memory_region(machine, Z80_TAG);
842832   UINT32 size;
843   UINT8 *ptr = memory_region(image.device().machine, Z80_TAG);
844833
845834   if (image.software_entry() == NULL)
846835   {
r9642r9643
855844   }
856845
857846   /* cartridge ROM banking */
858   sg1000_map_cartridge_memory(image.device().machine, ptr, size);
847   state->install_cartridge(ptr, size);
859848
860849   /* work RAM banking */
861850   memory_install_readwrite_bank(program, 0xc000, 0xc3ff, 0, 0x3c00, "bank2");
r9642r9643
869858
870859static DEVICE_IMAGE_LOAD( omv_cart )
871860{
861   running_machine *machine = image.device().machine;
862   sg1000_state *state = machine->driver_data<sg1000_state>();
872863   UINT32 size;
873   UINT8 *ptr = memory_region(image.device().machine, Z80_TAG);
864   UINT8 *ptr = memory_region(machine, Z80_TAG);
874865
875866   if (image.software_entry() == NULL)
876867   {
r9642r9643
885876   }
886877
887878   /* cartridge ROM banking */
888   sg1000_map_cartridge_memory(image.device().machine, ptr, size);
879   state->install_cartridge(ptr, size);
889880
890881   return IMAGE_INIT_PASS;
891882}
892883
893884/*-------------------------------------------------
894    sc3000_map_cartridge_memory -
885    sc3000_install_cartridge -
895886-------------------------------------------------*/
896887
897static void sc3000_map_cartridge_memory(running_machine *machine, UINT8 *ptr, int size)
888void sc3000_state::install_cartridge(UINT8 *ptr, int size)
898889{
899   address_space *program = cputag_get_address_space(machine, Z80_TAG, ADDRESS_SPACE_PROGRAM);
890   address_space *program = cpu_get_address_space(m_maincpu, ADDRESS_SPACE_PROGRAM);
900891
901892   /* include SG-1000 mapping */
902   sg1000_map_cartridge_memory(machine, ptr, size);
893   sg1000_state::install_cartridge(ptr, size);
903894
904895   if (IS_CARTRIDGE_BASIC_LEVEL_III(ptr))
905896   {
r9642r9643
924915
925916static DEVICE_IMAGE_LOAD( sc3000_cart )
926917{
918   running_machine *machine = image.device().machine;
919   sc3000_state *state = machine->driver_data<sc3000_state>();
920   UINT8 *ptr = memory_region(machine, Z80_TAG);
927921   UINT32 size;
928   UINT8 *ptr = memory_region(image.device().machine, Z80_TAG);
929922
930923   if (image.software_entry() == NULL)
931924   {
r9642r9643
940933   }
941934
942935   /* cartridge ROM and work RAM banking */
943   sc3000_map_cartridge_memory(image.device().machine, ptr, size);
936   state->install_cartridge(ptr, size);
944937
945938   return IMAGE_INIT_PASS;
946939}
r9642r9643
973966    MACHINE_START( sg1000 )
974967-------------------------------------------------*/
975968
976static MACHINE_START( sg1000 )
969void sg1000_state::machine_start()
977970{
978   sg1000_state *state = machine->driver_data<sg1000_state>();
979
980971   /* configure VDP */
981972   TMS9928A_configure(&tms9928a_interface);
982973
r9642r9643
984975   timer_set(machine, attotime_zero, NULL, 0, lightgun_tick);
985976
986977   /* register for state saving */
987   state_save_register_global(machine, state->tvdraw_data);
978   state_save_register_global(machine, m_tvdraw_data);
988979}
989980
990981/*-------------------------------------------------
991982    MACHINE_START( sc3000 )
992983-------------------------------------------------*/
993984
994static MACHINE_START( sc3000 )
985void sc3000_state::machine_start()
995986{
996   sg1000_state *state = machine->driver_data<sg1000_state>();
997
998   /* find devices */
999   state->cassette = machine->device(CASSETTE_TAG);
1000
1001987   /* configure VDP */
1002988   TMS9928A_configure(&tms9928a_interface);
1003989
r9642r9643
1005991   timer_set(machine, attotime_zero, NULL, 0, lightgun_tick);
1006992
1007993   /* register for state saving */
1008   state_save_register_global(machine, state->tvdraw_data);
1009   state_save_register_global(machine, state->keylatch);
994   state_save_register_global(machine, m_tvdraw_data);
995   state_save_register_global(machine, m_keylatch);
1010996}
1011997
1012998/*-------------------------------------------------
r9642r9643
10151001
10161002static void sf7000_fdc_index_callback(running_device *controller, running_device *img, int state)
10171003{
1018   sg1000_state *driver_state = img->machine->driver_data<sg1000_state>();
1004   sf7000_state *driver_state = img->machine->driver_data<sf7000_state>();
10191005
1020   driver_state->fdc_index = state;
1006   driver_state->m_fdc_index = state;
10211007}
10221008
10231009/*-------------------------------------------------
10241010    MACHINE_START( sf7000 )
10251011-------------------------------------------------*/
10261012
1027static MACHINE_START( sf7000 )
1013void sf7000_state::machine_start()
10281014{
1029   sg1000_state *state = machine->driver_data<sg1000_state>();
1030
1031   /* find devices */
1032   state->upd765 = machine->device(UPD765_TAG);
1033   state->cassette = machine->device(CASSETTE_TAG);
1034   state->centronics = machine->device(CENTRONICS_TAG);
1035
10361015   /* configure VDP */
10371016   TMS9928A_configure(&tms9928a_interface);
10381017
10391018   /* configure FDC */
1040   floppy_drive_set_index_pulse_callback(floppy_get_device(machine, 0), sf7000_fdc_index_callback);
1019   floppy_drive_set_index_pulse_callback(m_floppy0, sf7000_fdc_index_callback);
10411020
10421021   /* configure memory banking */
10431022   memory_configure_bank(machine, "bank1", 0, 1, memory_region(machine, Z80_TAG), 0);
1044   memory_configure_bank(machine, "bank1", 1, 1, messram_get_ptr(machine->device("messram")), 0);
1045   memory_configure_bank(machine, "bank2", 0, 1, messram_get_ptr(machine->device("messram")), 0);
1023   memory_configure_bank(machine, "bank1", 1, 1, messram_get_ptr(m_ram), 0);
1024   memory_configure_bank(machine, "bank2", 0, 1, messram_get_ptr(m_ram), 0);
10461025
10471026   /* register for state saving */
1048   state_save_register_global(machine, state->keylatch);
1049   state_save_register_global(machine, state->fdc_irq);
1050   state_save_register_global(machine, state->fdc_index);
1027   state_save_register_global(machine, m_keylatch);
1028   state_save_register_global(machine, m_fdc_irq);
1029   state_save_register_global(machine, m_fdc_index);
10511030}
10521031
10531032/*-------------------------------------------------
10541033    MACHINE_RESET( sf7000 )
10551034-------------------------------------------------*/
10561035
1057static MACHINE_RESET( sf7000 )
1036void sf7000_state::machine_reset()
10581037{
10591038   memory_set_bank(machine, "bank1", 0);
10601039   memory_set_bank(machine, "bank2", 0);
r9642r9643
10691048-------------------------------------------------*/
10701049
10711050static MACHINE_CONFIG_START( sg1000, sg1000_state )
1072
10731051   /* basic machine hardware */
10741052   MDRV_CPU_ADD(Z80_TAG, Z80, XTAL_10_738635MHz/3)
10751053   MDRV_CPU_PROGRAM_MAP(sg1000_map)
10761054   MDRV_CPU_IO_MAP(sg1000_io_map)
10771055   MDRV_CPU_VBLANK_INT(SCREEN_TAG, sg1000_int)
10781056
1079   MDRV_MACHINE_START(sg1000)
1080
10811057    /* video hardware */
10821058   MDRV_FRAGMENT_ADD(tms9928a)
10831059   MDRV_SCREEN_MODIFY(SCREEN_TAG)
r9642r9643
11091085-------------------------------------------------*/
11101086
11111087static MACHINE_CONFIG_DERIVED( omv, sg1000 )
1112
11131088   MDRV_CPU_MODIFY(Z80_TAG)
11141089   MDRV_CPU_PROGRAM_MAP(omv_map)
11151090   MDRV_CPU_IO_MAP(omv_io_map)
r9642r9643
11271102    MACHINE_CONFIG_START( sc3000, driver_device )
11281103-------------------------------------------------*/
11291104
1130static MACHINE_CONFIG_START( sc3000, sg1000_state )
1131
1105static MACHINE_CONFIG_START( sc3000, sc3000_state )
11321106   /* basic machine hardware */
11331107   MDRV_CPU_ADD(Z80_TAG, Z80, XTAL_10_738635MHz/3) // LH0080A
11341108   MDRV_CPU_PROGRAM_MAP(sc3000_map)
11351109   MDRV_CPU_IO_MAP(sc3000_io_map)
11361110   MDRV_CPU_VBLANK_INT(SCREEN_TAG, sg1000_int)
11371111
1138   MDRV_MACHINE_START(sc3000)
1139
11401112    /* video hardware */
11411113   MDRV_FRAGMENT_ADD(tms9928a)
11421114   MDRV_SCREEN_MODIFY(SCREEN_TAG)
r9642r9643
11711143    MACHINE_CONFIG_START( sf7000, driver_device )
11721144-------------------------------------------------*/
11731145
1174static MACHINE_CONFIG_START( sf7000, sg1000_state )
1175
1146static MACHINE_CONFIG_START( sf7000, sf7000_state )
11761147   /* basic machine hardware */
11771148   MDRV_CPU_ADD(Z80_TAG, Z80, XTAL_10_738635MHz/3)
11781149   MDRV_CPU_PROGRAM_MAP(sf7000_map)
11791150   MDRV_CPU_IO_MAP(sf7000_io_map)
11801151   MDRV_CPU_VBLANK_INT(SCREEN_TAG, sg1000_int)
11811152
1182   MDRV_MACHINE_START(sf7000)
1183   MDRV_MACHINE_RESET(sf7000)
1184
11851153    /* video hardware */
11861154   MDRV_FRAGMENT_ADD(tms9928a)
11871155   MDRV_SCREEN_MODIFY(SCREEN_TAG)
docs/messnew.txt
r9642r9643
4343
4444- [MM1M6] Refactored driver to define ADDRESS_MAP_MODERN. [Curt Coder]
4545
46- [SG1000] Refactored driver to define ADDRESS_MAP_MODERN. [Curt Coder]
47
4648- [SMS] Improved Light Phaser emulation and converted it to use timers
4749  that control when the beam will reach the aim area, to run the function
4850  that checks if the pixel displayed is bright enough to activate the

Previous 15994 Revisions Next


© 1998-2018 The MESS Team