summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/includes/cgc7900.h
blob: b70d38f5751f9bff00f3c602a435fb464eec754f (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
// license:BSD-3-Clause
// copyright-holders:Curt Coder
#pragma once

#ifndef MAME_INCLUDES_CGC7900_H
#define MAME_INCLUDES_CGC7900_H


#include "bus/rs232/rs232.h"
#include "cpu/m68000/m68000.h"
#include "cpu/mcs48/mcs48.h"
#include "machine/ram.h"
#include "machine/i8251.h"
#include "machine/com8116.h"
#include "machine/mm58167.h"
#include "machine/keyboard.h"
#include "machine/timer.h"
#include "sound/ay8910.h"

#include "screen.h"

#define M68000_TAG      "uh8"
#define INS8251_0_TAG   "uc10"
#define INS8251_1_TAG   "uc8"
#define MM58167_TAG     "uc6"
#define AY8910_TAG      "uc4"
#define K1135A_TAG      "uc11"
#define I8035_TAG       "i8035"
#define AM2910_TAG      "11d"
#define SCREEN_TAG      "screen"

class cgc7900_state : public driver_device
{
public:
	cgc7900_state(const machine_config &mconfig, device_type type, const char *tag)
		: driver_device(mconfig, type, tag),
			m_maincpu(*this, M68000_TAG),
			m_palette(*this, "palette"),
			m_screen(*this, "screen"),
			m_char_rom(*this, "gfx1"),
			m_chrom_ram(*this, "chrom_ram"),
			m_plane_ram(*this, "plane_ram"),
			m_clut_ram(*this, "clut_ram"),
			m_overlay_ram(*this, "overlay_ram"),
			m_roll_bitmap(*this, "roll_bitmap"),
			m_pan_x(*this, "pan_x"),
			m_pan_y(*this, "pan_y"),
			m_zoom(*this, "zoom"),
			m_blink_select(*this, "blink_select"),
			m_plane_select(*this, "plane_select"),
			m_plane_switch(*this, "plane_switch"),
			m_color_status_fg(*this, "color_status_fg"),
			m_color_status_bg(*this, "color_status_bg"),
			m_roll_overlay(*this, "roll_overlay"),
			m_i8251_0(*this, INS8251_0_TAG),
			m_i8251_1(*this, INS8251_1_TAG),
			m_dbrg(*this, K1135A_TAG)
	{ }

	required_device<cpu_device> m_maincpu;
	required_device<palette_device> m_palette;
	required_device<screen_device> m_screen;
	required_memory_region m_char_rom;
	required_shared_ptr<uint16_t> m_chrom_ram;
	required_shared_ptr<uint16_t> m_plane_ram;
	required_shared_ptr<uint16_t> m_clut_ram;
	required_shared_ptr<uint16_t> m_overlay_ram;
	required_shared_ptr<uint16_t> m_roll_bitmap;
	required_shared_ptr<uint16_t> m_pan_x;
	required_shared_ptr<uint16_t> m_pan_y;
	required_shared_ptr<uint16_t> m_zoom;
	required_shared_ptr<uint16_t> m_blink_select;
	required_shared_ptr<uint16_t> m_plane_select;
	required_shared_ptr<uint16_t> m_plane_switch;
	required_shared_ptr<uint16_t> m_color_status_fg;
	required_shared_ptr<uint16_t> m_color_status_bg;
	required_shared_ptr<uint16_t> m_roll_overlay;
	required_device<i8251_device> m_i8251_0;
	required_device<i8251_device> m_i8251_1;
	required_device<com8116_device> m_dbrg;

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

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

	DECLARE_READ16_MEMBER( keyboard_r );
	DECLARE_WRITE16_MEMBER( keyboard_w );
	DECLARE_WRITE16_MEMBER( interrupt_mask_w );
	DECLARE_READ16_MEMBER( disk_data_r );
	DECLARE_WRITE16_MEMBER( disk_data_w );
	DECLARE_READ16_MEMBER( disk_status_r );
	DECLARE_WRITE16_MEMBER( disk_command_w );
	DECLARE_READ16_MEMBER( z_mode_r );
	DECLARE_WRITE16_MEMBER( z_mode_w );
	DECLARE_WRITE16_MEMBER( color_status_w );
	DECLARE_READ16_MEMBER( sync_r );
	DECLARE_READ16_MEMBER( unmapped_r );

	template <unsigned N> DECLARE_WRITE_LINE_MEMBER(irq) { irq_encoder(N, state); }

	DECLARE_WRITE8_MEMBER(baud_write);
	DECLARE_WRITE_LINE_MEMBER(write_rs232_clock);
	DECLARE_WRITE_LINE_MEMBER(write_rs449_clock);

	void update_clut();
	void draw_bitmap(screen_device *screen, bitmap_rgb32 &bitmap);
	void draw_overlay(screen_device *screen, bitmap_rgb32 &bitmap);

	/* interrupt state */
	uint16_t m_int_mask, m_int_active;

	/* video state */
	rgb_t m_clut[256];
	int m_blink;

	TIMER_DEVICE_CALLBACK_MEMBER(blink_tick);

	void kbd_put(u8 data);

private:
	u16 kbd_mods;
	u8 kbd_data;
	bool kbd_ready;

	void irq_encoder(int pin, int state);
};

/*----------- defined in video/cgc7900.c -----------*/

MACHINE_CONFIG_EXTERN( cgc7900_video );

#endif