summaryrefslogtreecommitdiffstats
path: root/src/mame/drivers/sega_beena.cpp
blob: 02cef4abd52c37e351532675fcac1ef3cb4b282b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
// license:BSD-3-Clause
// copyright-holders:R. Belmont
/******************************************************************************

    Sega Beena

    apbeena.cpp

    Skeleton driver for the Sega Advanced Pico BEENA

    H/W is custom Sega SoC with ARM7TDMI core at 81 MHz.

    TODO:
            Everything!
            Needs the internal BIOS dumped.
            Component list / PCB diagram

    Cartridge ROM has 'edinburgh' in the header, maybe a system codename?
    ROM is also full of OGG files containing the string 'Encoded with Speex speex-1.0.4'
    as well as .mid files for music.

    Cartridges pinout:

        Glob down, PCB cut corner at upper right
        Top row of pins A25 on left to A1 on right.
        Bottom row of pins B25 on left to B1 on right.

        A1  /CE (tied high with resistor)
        A2  D11
        A3  D3
        A4  D10
        A5  D2
        A6  D9
        A7  D1
        A8  D8
        A9  D0
        A10 /OE
        A11 N/C
        A12 A0
        A13 A1
        A14 A2
        A15 A3
        A16 A4
        A17 A5
        A18 A6
        A19 A7
        A20 A17
        A21 A18
        A22 N/C
        A23 VCC
        A24 N/C
        A25 GND

        B1  N/C
        B2  D4
        B3  D12
        B4  D5
        B5  D13
        B6  D6
        B7  D14
        B8  D7
        B9  D15
        B10 A16
        B11 A15
        B12 A14
        B13 A13
        B14 A12
        B15 A11
        B16 A10
        B17 A9
        B18 A8
        B19 A19
        B20 A20
        B21 N/C
        B22 A21
        B23 VCC
        B24 N/C
        B25 GND

*******************************************************************************/

#include "emu.h"

#include "bus/generic/slot.h"
#include "bus/generic/carts.h"
#include "cpu/arm7/arm7.h"

#include "softlist_dev.h"
#include "speaker.h"
#include "screen.h"


class sega_beena_state : public driver_device
{
public:
	sega_beena_state(const machine_config &mconfig, device_type type, const char *tag)
		: driver_device(mconfig, type, tag)
		, m_maincpu(*this, "arm7")
		, m_cart(*this, "cartslot")
		, m_cart_region(nullptr)
		, m_bank(*this, "cartbank")
	{ }

	void sega_beena(machine_config &config);

private:
	virtual void machine_start() override;
	virtual void machine_reset() override;

	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);

	DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);

	void beena_arm7_map(address_map &map);

	required_device<arm7_cpu_device> m_maincpu;
	optional_device<generic_slot_device> m_cart;
	memory_region *m_cart_region;
	optional_memory_bank m_bank;
};

void sega_beena_state::beena_arm7_map(address_map &map)
{
	map(0x00000000, 0x000001ff).rom().bankr("cartbank");
	map(0x80000000, 0x807fffff).rom().bankr("cartbank");
}

void sega_beena_state::machine_start()
{
	// if there's a cart, override the standard mapping
	if (m_cart && m_cart->exists())
	{
		std::string region_tag;
		m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());

		m_bank->configure_entries(0, (m_cart_region->bytes() + 0x7fffff) / 0x800000, m_cart_region->base(), 0x800000);
	}
	else
		m_bank->configure_entries(0, 1, memregion("bios")->base(), 0x800000);

	m_bank->set_entry(0);
}

void sega_beena_state::machine_reset()
{
}

DEVICE_IMAGE_LOAD_MEMBER(sega_beena_state::cart_load)
{
	uint32_t size = m_cart->common_get_size("rom");

	m_cart->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
	m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");


	return image_init_result::PASS;
}

static INPUT_PORTS_START( sega_beena )
INPUT_PORTS_END


uint32_t sega_beena_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
	return 0;
}

void sega_beena_state::sega_beena(machine_config &config)
{
	ARM7_BE(config, m_maincpu, 81'000'000);
	m_maincpu->set_addrmap(AS_PROGRAM, &sega_beena_state::beena_arm7_map);

	screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
	screen.set_refresh_hz(60);
	screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
	screen.set_size(640, 480);
	screen.set_visarea(0, 640-1, 0, 480-1);
	screen.set_screen_update(FUNC(sega_beena_state::screen_update));

	SPEAKER(config, "lspeaker").front_left();
	SPEAKER(config, "rspeaker").front_right();

	GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "sega_beena_cart");
	m_cart->set_width(GENERIC_ROM16_WIDTH);
	m_cart->set_device_load(FUNC(sega_beena_state::cart_load));
	m_cart->set_must_be_loaded(true);

	SOFTWARE_LIST(config, "cart_list").set_original("sega_beena_cart");
}

ROM_START( beena )
	ROM_REGION32_BE( 0x80000, "bios", 0 )   // SoC internal BIOS
	ROM_LOAD16_WORD_SWAP( "beenabios.bin", 0x000000, 0x080000, NO_DUMP )
ROM_END


//    year, name,         parent,  compat, machine,      input,        class,              init,       company,  fullname,                             flags
CONS( 2009, beena,      0,       0,      sega_beena, sega_beena, sega_beena_state, empty_init, "Sega", "Advanced Pico BEENA", MACHINE_IS_SKELETON )