1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 #ifndef MAME_INCLUDES_XEROX820_H
4 #define MAME_INCLUDES_XEROX820_H
5 
6 #pragma once
7 
8 #include "bus/scsi/sa1403d.h"
9 #include "bus/rs232/rs232.h"
10 #include "cpu/z80/z80.h"
11 #include "machine/z80daisy.h"
12 #include "cpu/i86/i86.h"
13 #include "machine/com8116.h"
14 #include "machine/ram.h"
15 #include "bus/scsi/scsi.h"
16 #include "bus/scsi/scsihd.h"
17 #include "machine/timer.h"
18 #include "machine/wd_fdc.h"
19 #include "machine/x820kb.h"
20 #include "machine/z80pio.h"
21 #include "machine/z80ctc.h"
22 #include "machine/z80sio.h"
23 #include "sound/spkrdev.h"
24 #include "sound/beep.h"
25 #include "machine/timer.h"
26 #include "imagedev/floppy.h"
27 #include "imagedev/snapquik.h"
28 #include "emupal.h"
29 
30 #define SCREEN_TAG      "screen"
31 
32 #define Z80_TAG         "u46"
33 #define Z80PIO_KB_TAG   "u105"
34 #define Z80PIO_GP_TAG   "u101"
35 #define Z80PIO_RD_TAG   "u8"
36 #define Z80SIO_TAG      "u96"
37 #define Z80CTC_TAG      "u99"
38 #define FD1771_TAG      "u109"
39 #define FD1797_TAG      "u109"
40 #define COM8116_TAG     "u76"
41 #define I8086_TAG       "i8086"
42 #define SASIBUS_TAG     "sasi"
43 #define RS232_A_TAG     "rs232a"
44 #define RS232_B_TAG     "rs232b"
45 #define KEYBOARD_TAG    "kb"
46 
47 #define XEROX820_VIDEORAM_SIZE  0x1000
48 #define XEROX820_VIDEORAM_MASK  0x0fff
49 
50 class xerox820_state : public driver_device
51 {
52 public:
xerox820_state(const machine_config & mconfig,device_type type,const char * tag)53 	xerox820_state(const machine_config &mconfig, device_type type, const char *tag) :
54 		driver_device(mconfig, type, tag),
55 		m_maincpu(*this, Z80_TAG),
56 		m_kbpio(*this, Z80PIO_KB_TAG),
57 		m_ctc(*this, Z80CTC_TAG),
58 		m_sio(*this, Z80SIO_TAG),
59 		m_fdc(*this, FD1771_TAG),
60 		m_ram(*this, RAM_TAG),
61 		m_palette(*this, "palette"),
62 		m_floppy0(*this, FD1771_TAG":0"),
63 		m_floppy1(*this, FD1771_TAG":1"),
64 		m_kb(*this, KEYBOARD_TAG),
65 		m_rom(*this, Z80_TAG),
66 		m_char_rom(*this, "chargen"),
67 		m_video_ram(*this, "video_ram"),
68 		m_fdc_irq(0),
69 		m_fdc_drq(0),
70 		m_8n5(0),
71 		m_400_460(0)
72 	{ }
73 
74 	void mk83(machine_config &config);
75 	void xerox820(machine_config &config);
76 
77 	DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb);
78 
79 	uint8_t fdc_r(offs_t offset);
80 	void fdc_w(offs_t offset, uint8_t data);
81 	void scroll_w(offs_t offset, uint8_t data);
82 	//void x120_system_w(uint8_t data);
83 	uint8_t kbpio_pa_r();
84 	void kbpio_pa_w(uint8_t data);
85 	uint8_t kbpio_pb_r();
86 	DECLARE_WRITE_LINE_MEMBER( fdc_intrq_w );
87 	DECLARE_WRITE_LINE_MEMBER( fdc_drq_w );
88 
89 protected:
90 	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
91 
92 
93 	TIMER_DEVICE_CALLBACK_MEMBER(ctc_tick);
94 
95 	void mk83_mem(address_map &map);
96 	void xerox820_io(address_map &map);
97 	void xerox820_mem(address_map &map);
98 
99 	virtual void machine_start() override;
100 	virtual void machine_reset() override;
101 
102 	required_device<z80_device> m_maincpu;
103 	required_device<z80pio_device> m_kbpio;
104 	required_device<z80ctc_device> m_ctc;
105 	required_device<z80sio_device> m_sio;
106 	required_device<wd_fdc_device_base> m_fdc;
107 	required_device<ram_device> m_ram;
108 	required_device<palette_device> m_palette;
109 	required_device<floppy_connector> m_floppy0;
110 	required_device<floppy_connector> m_floppy1;
111 	required_device<xerox_820_keyboard_device> m_kb;
112 	required_memory_region m_rom;
113 	required_memory_region m_char_rom;
114 	required_shared_ptr<uint8_t> m_video_ram;
115 
116 	virtual void bankswitch(int bank);
117 	void update_nmi();
118 
119 	/* video state */
120 	uint8_t m_scroll;                     /* vertical scroll */
121 	uint8_t m_framecnt;
122 	int m_ncset2;                       /* national character set */
123 	int m_vatt;                         /* X120 video attribute */
124 	int m_lowlite;                      /* low light attribute */
125 	int m_chrom;                        /* character ROM index */
126 
127 	/* floppy state */
128 	bool m_fdc_irq;                     /* interrupt request */
129 	bool m_fdc_drq;                     /* data request */
130 	int m_8n5;                          /* 5.25" / 8" drive select */
131 	int m_400_460;                      /* double sided disk detect */
132 };
133 
134 class bigboard_state : public xerox820_state
135 {
136 public:
bigboard_state(const machine_config & mconfig,device_type type,const char * tag)137 	bigboard_state(const machine_config &mconfig, device_type type, const char *tag)
138 		: xerox820_state(mconfig, type, tag)
139 		, m_beeper(*this, "beeper")
140 		, m_beep_timer(*this, "beep_timer")
141 	{ }
142 
143 	void kbpio_pa_w(uint8_t data);
144 
145 	void bigboard(machine_config &config);
146 protected:
147 	virtual void machine_reset() override;
148 
149 	TIMER_DEVICE_CALLBACK_MEMBER(beep_timer);
150 
151 	required_device<beep_device> m_beeper;
152 	required_device<timer_device> m_beep_timer;
153 
154 	bool m_bit5;
155 };
156 
157 class xerox820ii_state : public xerox820_state
158 {
159 public:
xerox820ii_state(const machine_config & mconfig,device_type type,const char * tag)160 	xerox820ii_state(const machine_config &mconfig, device_type type, const char *tag) :
161 		xerox820_state(mconfig, type, tag),
162 		m_speaker(*this, "speaker"),
163 		m_sasibus(*this, SASIBUS_TAG)
164 	{
165 	}
166 
167 	void bell_w(offs_t offset, uint8_t data);
168 	void slden_w(offs_t offset, uint8_t data);
169 	void chrom_w(offs_t offset, uint8_t data);
170 	void lowlite_w(uint8_t data);
171 	void sync_w(offs_t offset, uint8_t data);
172 
173 	void rdpio_pb_w(uint8_t data);
174 	DECLARE_WRITE_LINE_MEMBER( rdpio_pardy_w );
175 
176 	void xerox168(machine_config &config);
177 	void xerox820ii(machine_config &config);
178 	void xerox168_mem(address_map &map);
179 	void xerox820ii_io(address_map &map);
180 	void xerox820ii_mem(address_map &map);
181 protected:
182 	virtual void machine_reset() override;
183 
184 	void bankswitch(int bank) override;
185 
186 	required_device<speaker_sound_device> m_speaker;
187 	required_device<scsi_port_device> m_sasibus;
188 };
189 
190 #endif // MAME_INCLUDES_XEROX820_H
191