1 // license:BSD-3-Clause
2 // copyright-holders:Olivier Galibert
3 #ifndef MAME_BUS_NSCSI_CD_H
4 #define MAME_BUS_NSCSI_CD_H
5 
6 #pragma once
7 
8 #include "machine/nscsi_bus.h"
9 #include "imagedev/chd_cd.h"
10 #include "cdrom.h"
11 
12 class nscsi_cdrom_device : public nscsi_full_device
13 {
14 public:
15 	nscsi_cdrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
16 
17 	void set_block_size(u32 block_size);
18 
19 protected:
20 	nscsi_cdrom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock = 0);
21 
nscsi_cdrom_device(const machine_config & mconfig,device_type type,const char * tag,device_t * owner,const char * mfr,const char * product,const char * rev,uint8_t inq_data,uint8_t compliance)22 	nscsi_cdrom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, const char *mfr, const char *product, const char *rev, uint8_t inq_data, uint8_t compliance)
23 		: nscsi_cdrom_device(mconfig, type, tag, owner, 0)
24 	{
25 		strncpy(manufacturer, mfr, 8);
26 		strncpy(this->product, product, 16);
27 		strncpy(revision, rev, 4);
28 		inquiry_data = inq_data;
29 		this->compliance = compliance;
30 	}
31 
32 	virtual void device_start() override;
33 	virtual void device_reset() override;
34 	virtual void device_add_mconfig(machine_config &config) override;
35 
36 	virtual void scsi_command() override;
37 	virtual uint8_t scsi_get_data(int id, int pos) override;
38 	virtual void scsi_put_data(int buf, int offset, uint8_t data) override;
39 
40 	cdrom_file *cdrom;
41 
42 private:
43 	static constexpr uint32_t bytes_per_sector = 2048;
44 
45 	uint8_t sector_buffer[bytes_per_sector];
46 	uint32_t bytes_per_block;
47 	int lba, cur_sector;
48 	required_device<cdrom_image_device> image;
49 	uint8_t mode_data[12];
50 
51 	char manufacturer[8];
52 	char product[16];
53 	char revision[4];
54 	uint8_t inquiry_data;
55 	uint8_t compliance;
56 
57 	void return_no_cd();
58 	static int to_msf(int frame);
59 };
60 
61 class nscsi_cdrom_sgi_device : public nscsi_cdrom_device
62 {
63 public:
64 	nscsi_cdrom_sgi_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
65 
66 protected:
67 	virtual void scsi_command() override;
68 	virtual bool scsi_command_done(uint8_t command, uint8_t length) override;
69 };
70 
71 class nscsi_dec_rrd45_device : public nscsi_cdrom_device
72 {
73 public:
74 	nscsi_dec_rrd45_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
75 };
76 
77 class nscsi_toshiba_xm3301_device : public nscsi_cdrom_device
78 {
79 public:
80 	nscsi_toshiba_xm3301_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
81 };
82 
83 class nscsi_toshiba_xm5301_sun_device : public nscsi_cdrom_device
84 {
85 public:
86 	nscsi_toshiba_xm5301_sun_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
87 };
88 
89 class nscsi_toshiba_xm5401_sun_device : public nscsi_cdrom_device
90 {
91 public:
92 	nscsi_toshiba_xm5401_sun_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
93 };
94 
95 class nscsi_toshiba_xm5701_device : public nscsi_cdrom_device
96 {
97 public:
98 	nscsi_toshiba_xm5701_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
99 };
100 
101 class nscsi_toshiba_xm5701_sun_device : public nscsi_cdrom_device
102 {
103 public:
104 	nscsi_toshiba_xm5701_sun_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
105 };
106 
107 class nscsi_cdrom_apple_device : public nscsi_cdrom_device
108 {
109 public:
110 	nscsi_cdrom_apple_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
111 
112 protected:
113 	virtual void scsi_command() override;
114 };
115 
116 DECLARE_DEVICE_TYPE(NSCSI_CDROM, nscsi_cdrom_device)
117 DECLARE_DEVICE_TYPE(NSCSI_CDROM_SGI, nscsi_cdrom_sgi_device)
118 DECLARE_DEVICE_TYPE(NSCSI_RRD45, nscsi_dec_rrd45_device)
119 DECLARE_DEVICE_TYPE(NSCSI_XM3301, nscsi_toshiba_xm3301_device)
120 DECLARE_DEVICE_TYPE(NSCSI_XM5301SUN, nscsi_toshiba_xm5301_sun_device)
121 DECLARE_DEVICE_TYPE(NSCSI_XM5401SUN, nscsi_toshiba_xm5401_sun_device)
122 DECLARE_DEVICE_TYPE(NSCSI_XM5701, nscsi_toshiba_xm5701_device)
123 DECLARE_DEVICE_TYPE(NSCSI_XM5701SUN, nscsi_toshiba_xm5701_sun_device)
124 DECLARE_DEVICE_TYPE(NSCSI_CDROM_APPLE, nscsi_cdrom_apple_device)
125 
126 #endif // MAME_BUS_NSCSI_CD_H
127