1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder, Frode van der Meeren
3 #ifndef MAME_INCLUDES_TIKI100_H
4 #define MAME_INCLUDES_TIKI100_H
5 
6 #pragma once
7 
8 #include "bus/centronics/ctronics.h"
9 #include "bus/rs232/rs232.h"
10 #include "bus/tiki100/exp.h"
11 #include "cpu/z80/z80.h"
12 #include "machine/z80daisy.h"
13 #include "formats/tiki100_dsk.h"
14 #include "imagedev/cassette.h"
15 #include "imagedev/floppy.h"
16 #include "machine/ram.h"
17 #include "machine/timer.h"
18 #include "machine/z80ctc.h"
19 #include "machine/z80pio.h"
20 #include "machine/z80sio.h"
21 #include "machine/wd_fdc.h"
22 #include "sound/ay8910.h"
23 #include "emupal.h"
24 
25 #define Z80_TAG         "z80"
26 #define Z80DART_TAG     "z80dart"
27 #define Z80PIO_TAG      "z80pio"
28 #define Z80CTC_TAG      "z80ctc"
29 #define FD1797_TAG      "fd1797"
30 #define AY8912_TAG      "ay8912"
31 #define RS232_A_TAG     "rs232a"
32 #define RS232_B_TAG     "rs232b"
33 #define CASSETTE_TAG    "cassette"
34 #define CENTRONICS_TAG  "centronics"
35 #define SCREEN_TAG      "screen"
36 
37 #define TIKI100_VIDEORAM_SIZE   0x8000
38 #define TIKI100_VIDEORAM_MASK   0x7fff
39 
40 #define BANK_ROM        0
41 #define BANK_RAM        1
42 #define BANK_VIDEO_RAM  2
43 
44 class tiki100_state : public driver_device
45 {
46 public:
tiki100_state(const machine_config & mconfig,device_type type,const char * tag)47 	tiki100_state(const machine_config &mconfig, device_type type, const char *tag) :
48 		driver_device(mconfig, type, tag),
49 		m_screen(*this, "screen"),
50 		m_maincpu(*this, Z80_TAG),
51 		m_ctc(*this, Z80CTC_TAG),
52 		m_fdc(*this, FD1797_TAG),
53 		m_pio(*this, Z80PIO_TAG),
54 		m_dart(*this, Z80DART_TAG),
55 		m_psg(*this, AY8912_TAG),
56 		m_ram(*this, RAM_TAG),
57 		m_floppy0(*this, FD1797_TAG":0"),
58 		m_floppy1(*this, FD1797_TAG":1"),
59 		m_cassette(*this, CASSETTE_TAG),
60 		m_centronics(*this, CENTRONICS_TAG),
61 		m_exp(*this, "tiki100bus"),
62 		m_rom(*this, Z80_TAG),
63 		m_prom(*this, "u4"),
64 		m_video_ram(*this, "video_ram"),
65 		m_y(*this, "Y%u", 1),
66 		m_st_io(*this, "ST"),
67 		m_palette(*this, "palette"),
68 		m_leds(*this, "led%u", 1U),
69 		m_rome(1),
70 		m_vire(1)
71 	{ }
72 
73 	void tiki100(machine_config &config);
74 
75 private:
76 	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
77 
78 	uint8_t mrq_r(offs_t offset);
79 	void mrq_w(offs_t offset, uint8_t data);
80 	uint8_t iorq_r(offs_t offset);
81 	void iorq_w(offs_t offset, uint8_t data);
82 
83 	uint8_t keyboard_r();
84 	void keyboard_w(uint8_t data);
85 	void video_mode_w(uint8_t data);
86 	void palette_w(uint8_t data);
87 	void system_w(uint8_t data);
88 	DECLARE_WRITE_LINE_MEMBER( bar0_w );
89 	DECLARE_WRITE_LINE_MEMBER( bar2_w );
90 	void video_scroll_w(uint8_t data);
91 
92 	uint8_t pio_pb_r();
93 	void pio_pb_w(uint8_t data);
94 
95 	DECLARE_FLOPPY_FORMATS( floppy_formats );
96 
97 	TIMER_DEVICE_CALLBACK_MEMBER( ctc_tick );
98 	TIMER_DEVICE_CALLBACK_MEMBER( tape_tick );
99 	TIMER_DEVICE_CALLBACK_MEMBER( scanline_start );
100 
101 	DECLARE_WRITE_LINE_MEMBER(write_centronics_ack);
102 	DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
103 	DECLARE_WRITE_LINE_MEMBER(write_centronics_perror);
104 
105 	DECLARE_WRITE_LINE_MEMBER( busrq_w );
106 
107 	void tiki100_io(address_map &map);
108 	void tiki100_mem(address_map &map);
109 
110 	virtual void machine_start() override;
111 	virtual void machine_reset() override;
112 
113 	required_device<screen_device> m_screen;
114 	required_device<z80_device> m_maincpu;
115 	required_device<z80ctc_device> m_ctc;
116 	required_device<fd1797_device> m_fdc;
117 	required_device<z80pio_device> m_pio;
118 	required_device<z80dart_device> m_dart;
119 	required_device<ay8912_device> m_psg;
120 	required_device<ram_device> m_ram;
121 	required_device<floppy_connector> m_floppy0;
122 	required_device<floppy_connector> m_floppy1;
123 	required_device<cassette_image_device> m_cassette;
124 	required_device<centronics_device> m_centronics;
125 	required_device<tiki100_bus_device> m_exp;
126 	required_memory_region m_rom;
127 	required_memory_region m_prom;
128 	optional_shared_ptr<uint8_t> m_video_ram;
129 	required_ioport_array<13> m_y;
130 	required_ioport m_st_io;
131 	required_device<palette_device> m_palette;
132 	output_finder<2> m_leds;
133 
134 	enum
135 	{
136 		ROM0 = 0x01,
137 		ROM1 = 0x02,
138 		VIR  = 0x04,
139 		RAM0 = 0x08
140 	};
141 
142 	// memory state
143 	bool m_rome;
144 	bool m_vire;
145 
146 	// video state
147 	uint8_t m_scroll;
148 	uint8_t m_mode;
149 	uint8_t m_palette_val;
150 	uint8_t m_current_pixel;
151 
152 	// keyboard state
153 	int m_keylatch;
154 
155 	// printer state
156 	int m_centronics_ack;
157 	int m_centronics_busy;
158 	int m_centronics_perror;
159 
160 	// serial state
161 	bool m_st;
162 
163 };
164 
165 #endif // MAME_INCLUDES_TIKI100_H
166