summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/stvcd.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/stvcd.h')
-rw-r--r--src/devices/machine/stvcd.h198
1 files changed, 198 insertions, 0 deletions
diff --git a/src/devices/machine/stvcd.h b/src/devices/machine/stvcd.h
index 165407d736e..a20985fd394 100644
--- a/src/devices/machine/stvcd.h
+++ b/src/devices/machine/stvcd.h
@@ -1,2 +1,200 @@
// license:LGPL-2.1+
// copyright-holders:Angelo Salese, R. Belmont
+
+#ifndef MAME_MACHINE_STVCD_H
+#define MAME_MACHINE_STVCD_H
+
+#pragma once
+
+#include "cdrom.h"
+#include "imagedev/chd_cd.h"
+#include "machine/timer.h"
+#include "sound/cdda.h"
+
+class stvcd_device : public device_t
+{
+ static constexpr unsigned MAX_FILTERS = 24;
+ static constexpr unsigned MAX_BLOCKS = 200;
+ static constexpr uint32_t MAX_DIR_SIZE = 256*1024;
+
+public:
+ stvcd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ DECLARE_READ32_MEMBER( stvcd_r );
+ DECLARE_WRITE32_MEMBER( stvcd_w );
+
+ void set_tray_open();
+ void set_tray_close();
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_stop() override;
+
+private:
+ TIMER_DEVICE_CALLBACK_MEMBER( stv_sector_cb );
+ TIMER_DEVICE_CALLBACK_MEMBER( stv_sh1_sim );
+
+ struct direntryT
+ {
+ uint8_t record_size;
+ uint8_t xa_record_size;
+ uint32_t firstfad; // first sector of file
+ uint32_t length; // length of file
+ uint8_t year;
+ uint8_t month;
+ uint8_t day;
+ uint8_t hour;
+ uint8_t minute;
+ uint8_t second;
+ uint8_t gmt_offset;
+ uint8_t flags; // iso9660 flags
+ uint8_t file_unit_size;
+ uint8_t interleave_gap_size;
+ uint16_t volume_sequencer_number;
+ uint8_t name[128];
+ };
+
+ struct filterT
+ {
+ uint8_t mode;
+ uint8_t chan;
+ uint8_t smmask;
+ uint8_t cimask;
+ uint8_t fid;
+ uint8_t smval;
+ uint8_t cival;
+ uint8_t condtrue;
+ uint8_t condfalse;
+ uint32_t fad;
+ uint32_t range;
+ };
+
+ struct blockT
+ {
+ int32_t size; // size of block
+ int32_t FAD; // FAD on disc
+ uint8_t data[CD_MAX_SECTOR_DATA];
+ uint8_t chan; // channel
+ uint8_t fnum; // file number
+ uint8_t subm; // subchannel mode
+ uint8_t cinf; // coding information
+ };
+
+ struct partitionT
+ {
+ int32_t size;
+ blockT *blocks[MAX_BLOCKS];
+ uint8_t bnum[MAX_BLOCKS];
+ uint8_t numblks;
+ };
+
+ // 16-bit transfer types
+ enum transT
+ {
+ XFERTYPE_INVALID,
+ XFERTYPE_TOC,
+ XFERTYPE_FILEINFO_1,
+ XFERTYPE_FILEINFO_254,
+ XFERTYPE_SUBQ,
+ XFERTYPE_SUBRW
+ };
+
+ // 32-bit transfer types
+ enum trans32T
+ {
+ XFERTYPE32_INVALID,
+ XFERTYPE32_GETSECTOR,
+ XFERTYPE32_GETDELETESECTOR,
+ XFERTYPE32_PUTSECTOR,
+ XFERTYPE32_MOVESECTOR
+ };
+
+ int get_track_index(uint32_t fad);
+ int sega_cdrom_get_adr_control(cdrom_file *file, int track);
+ void cr_standard_return(uint16_t cur_status);
+ void mpeg_standard_return(uint16_t cur_status);
+ void cd_free_block(blockT *blktofree);
+ void cd_defragblocks(partitionT *part);
+ void cd_getsectoroffsetnum(uint32_t bufnum, uint32_t *sectoffs, uint32_t *sectnum);
+
+ uint16_t cd_readWord(uint32_t addr);
+ void cd_writeWord(uint32_t addr, uint16_t data);
+ uint32_t cd_readLong(uint32_t addr);
+ void cd_writeLong(uint32_t addr, uint32_t data);
+
+ void cd_readTOC();
+ void cd_readblock(uint32_t fad, uint8_t *dat);
+ void cd_playdata();
+
+ void cd_exec_command( void );
+ // iso9660 utilities
+ void make_dir_current(uint32_t fad);
+ void read_new_dir(uint32_t fileno);
+
+ blockT *cd_alloc_block(uint8_t *blknum);
+ partitionT *cd_filterdata(filterT *flt, int trktype, uint8_t *p_ok);
+ partitionT *cd_read_filtered_sector(int32_t fad, uint8_t *p_ok);
+
+ cdrom_file *cdrom;// = (cdrom_file *)nullptr;
+
+ // local variables
+ partitionT partitions[MAX_FILTERS];
+ partitionT *transpart;
+
+ blockT blocks[MAX_BLOCKS];
+ blockT curblock;
+
+ uint8_t tocbuf[102*4];
+ uint8_t subqbuf[5*2];
+ uint8_t subrwbuf[12*2];
+ uint8_t finfbuf[256];
+
+ int32_t sectlenin, sectlenout;
+
+ uint8_t lastbuf, playtype;
+
+ transT xfertype;
+ trans32T xfertype32;
+ uint32_t xfercount, calcsize;
+ uint32_t xferoffs, xfersect, xfersectpos, xfersectnum, xferdnum;
+
+ filterT filters[MAX_FILTERS];
+ filterT *cddevice;
+ int cddevicenum;
+
+ uint16_t cr1, cr2, cr3, cr4;
+ uint16_t prev_cr1, prev_cr2, prev_cr3, prev_cr4;
+ uint8_t status_type;
+ uint16_t hirqmask, hirqreg;
+ uint16_t cd_stat;
+ uint32_t cd_curfad;// = 0;
+ uint32_t cd_fad_seek;
+ uint32_t fadstoplay;// = 0;
+ uint32_t in_buffer;// = 0; // amount of data in the buffer
+ int oddframe;// = 0;
+ int buffull, sectorstore, freeblocks;
+ int cur_track;
+ uint8_t cmd_pending;
+ uint8_t cd_speed;
+ uint8_t cdda_maxrepeat;
+ uint8_t cdda_repeat_count;
+ uint8_t tray_is_closed;
+ int get_timing_command( void );
+
+ direntryT curroot; // root entry of current filesystem
+ std::vector<direntryT> curdir; // current directory
+ int numfiles; // # of entries in current directory
+ int firstfile; // first non-directory file
+
+ required_device<cdrom_image_device> m_cdrom_image;
+ required_device<timer_device> m_sector_timer;
+ required_device<timer_device> m_sh1_timer;
+ required_device<cdda_device> m_cdda;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(STVCD, stvcd_device)
+
+#endif // MAME_MACHINE_STVCD_H