1 // license:GPL-2.0+
2 // copyright-holders:Kevin Thacker,Sandro Ronco
3 /*****************************************************************************
4  *
5  * includes/z88.h
6  *
7  ****************************************************************************/
8 
9 #ifndef MAME_INCLUDES_Z88_H
10 #define MAME_INCLUDES_Z88_H
11 
12 #pragma once
13 
14 #include "cpu/z80/z80.h"
15 #include "machine/ram.h"
16 #include "machine/upd65031.h"
17 #include "sound/spkrdev.h"
18 
19 #include "bus/z88/flash.h"
20 #include "bus/z88/ram.h"
21 #include "bus/z88/rom.h"
22 #include "bus/z88/z88.h"
23 
24 #include "emupal.h"
25 #include "screen.h"
26 #include "speaker.h"
27 
28 #define Z88_NUM_COLOURS 3
29 
30 #define Z88_SCREEN_WIDTH        640
31 #define Z88_SCREEN_HEIGHT       64
32 
33 #define Z88_SCR_HW_REV  (1<<4)
34 #define Z88_SCR_HW_HRS  (1<<5)
35 #define Z88_SCR_HW_UND  (1<<1)
36 #define Z88_SCR_HW_FLS  (1<<3)
37 #define Z88_SCR_HW_GRY  (1<<2)
38 #define Z88_SCR_HW_CURS (Z88_SCR_HW_HRS|Z88_SCR_HW_FLS|Z88_SCR_HW_REV)
39 #define Z88_SCR_HW_NULL (Z88_SCR_HW_HRS|Z88_SCR_HW_GRY|Z88_SCR_HW_REV)
40 
41 class z88_state : public driver_device
42 {
43 public:
z88_state(const machine_config & mconfig,device_type type,const char * tag)44 	z88_state(const machine_config &mconfig, device_type type, const char *tag)
45 		: driver_device(mconfig, type, tag)
46 		, m_maincpu(*this, "maincpu")
47 		, m_bios_region(*this, "bios")
48 		, m_ram(*this, RAM_TAG)
49 		, m_screen(*this, "screen")
50 		, m_palette(*this, "palette")
51 		, m_blink(*this, "blink")
52 		, m_lines(*this, "LINE%u", 0U)
53 		, m_banks(*this, "bank%u", 1U)
54 		, m_carts(*this, "slot%u", 0U)
55 	{ }
56 
57 	void z88(machine_config &config);
58 
59 private:
60 	enum
61 	{
62 		Z88_BANK_ROM = 1,
63 		Z88_BANK_RAM,
64 		Z88_BANK_CART,
65 		Z88_BANK_UNMAP
66 	};
67 
68 	virtual void machine_start() override;
69 	virtual void machine_reset() override;
70 	uint8_t kb_r(offs_t offset);
71 	UPD65031_MEMORY_UPDATE(bankswitch_update);
72 	UPD65031_SCREEN_UPDATE(lcd_update);
73 
74 	// cartridges read/write
75 	uint8_t bank0_cart_r(offs_t offset);
76 	uint8_t bank1_cart_r(offs_t offset);
77 	uint8_t bank2_cart_r(offs_t offset);
78 	uint8_t bank3_cart_r(offs_t offset);
79 	void bank0_cart_w(offs_t offset, uint8_t data);
80 	void bank1_cart_w(offs_t offset, uint8_t data);
81 	void bank2_cart_w(offs_t offset, uint8_t data);
82 	void bank3_cart_w(offs_t offset, uint8_t data);
83 
84 	// defined in video/z88.c
85 	inline void plot_pixel(bitmap_ind16 &bitmap, int x, int y, uint16_t color);
86 	inline uint8_t* convert_address(uint32_t offset);
87 	void vh_render_8x8(bitmap_ind16 &bitmap, int x, int y, uint16_t pen0, uint16_t pen1, uint8_t *gfx);
88 	void vh_render_6x8(bitmap_ind16 &bitmap, int x, int y, uint16_t pen0, uint16_t pen1, uint8_t *gfx);
89 	void vh_render_line(bitmap_ind16 &bitmap, int x, int y, uint16_t pen);
90 
91 	void z88_palette(palette_device &palette) const;
92 
93 	void z88_io(address_map &map);
94 	void z88_mem(address_map &map);
95 
96 	required_device<cpu_device> m_maincpu;
97 	required_memory_region m_bios_region;
98 	required_device<ram_device> m_ram;
99 	required_device<screen_device> m_screen;
100 	required_device<palette_device> m_palette;
101 	required_device<upd65031_device> m_blink;
102 	required_ioport_array<8> m_lines;
103 	required_memory_bank_array<5> m_banks;
104 	optional_device_array<z88cart_slot_device, 4> m_carts;
105 
106 	struct
107 	{
108 		uint8_t slot;
109 		uint8_t page;
110 	} m_bank[4];
111 
112 	int         m_bank_type[4];
113 	uint8_t *   m_bios;
114 	uint8_t *   m_ram_base;
115 };
116 
117 #endif // MAME_INCLUDES_Z88_H
118