summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/bus/isa/sc499.h
blob: e62035ccb3aa26c64e3153657a8beb646589d051 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
                       
                                                





                                                     

   

                            
 
            
 
                        

                         




                                                                            





                                                                               
                                                                                                                  
 
                                
                                                       
                                            











                                                                                                   
 


                                                          


                                 
                                                
 


                                                                                                                                        
                                          

  

                                       
                                                                      


                                   
                                                                                                      
 
          


                                 

                                 


                                                                                                       
                                                                         
                                                                       

                        

                                                            
                                               
 
                                        
                                                                                                            
 

                                               
 
                              

                                                
 
                          


                                                  

                                       



                                                





                                               






                                          



                          
 

                                
 
                                  
 


                                     
 
                              
 


                                                                                                         
 



                                     
 
                                                  
                                                          





                                                         
                         

                         

  
 
                         
                                             
 
                              
// license:BSD-3-Clause
// copyright-holders:Hans Ostermeyer, R. Belmont
/*
 * sc499.h - Archive Cartridge tape controller SC-499
 *
 *  Created on: February 21, 2011
 *      Author: Hans Ostermeyer
 *
 */

#ifndef MAME_BUS_ISA_SC499_H
#define MAME_BUS_ISA_SC499_H

#pragma once

#include "bus/isa/isa.h"
#include "softlist_dev.h"


//**************************************************************************
//  TYPE DEFINITIONS
//**************************************************************************

// ======================> sc499_ctape_image_device

class sc499_ctape_image_device : public device_t, public device_image_interface
{
public:
	// construction/destruction
	sc499_ctape_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	// image-level overrides
	virtual image_init_result call_load() override;
	virtual void call_unload() override;
	virtual iodevice_t image_type() const noexcept override { return IO_MAGTAPE; }

	virtual bool is_readable()  const noexcept override { return true; }
	virtual bool is_writeable() const noexcept override { return true; }
	virtual bool is_creatable() const noexcept override { return true; }
	virtual bool must_be_loaded() const noexcept override { return false; }
	virtual bool is_reset_on_load() const noexcept override { return false; }
	virtual bool support_command_line_image_creation() const noexcept override { return true; }
	virtual const char *image_interface() const noexcept override { return "sc499_cass"; }
	virtual const char *file_extensions() const noexcept override { return "act,ct"; }
	virtual const char *custom_instance_name() const noexcept override { return "ctape"; }
	virtual const char *custom_brief_instance_name() const noexcept override { return "ct"; }

	uint8_t *read_block(int block_num);
	void write_block(int block_num, uint8_t *ptr);
	uint64_t tapelen() { return m_ctape_data.size(); }

protected:
	// device-level overrides
	virtual void device_start() override { }

	// device_image_interface implementation
	virtual const software_list_loader &get_software_list_loader() const override { return image_software_list_loader::instance(); }

	std::vector<uint8_t> m_ctape_data;
};

// ======================> sc499_device

class sc499_device: public device_t, public device_isa8_card_interface
{
public:
	// construction/destruction
	sc499_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

protected:
	required_ioport m_iobase;
	required_ioport m_irqdrq;

private:
	// device-level overrides
	virtual void device_start() override;
	virtual void device_reset() override;
	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
	virtual void device_add_mconfig(machine_config &config) override;
	virtual ioport_constructor device_input_ports() const override;

	// ISA overrides
	virtual uint8_t dack_r(int line) override;
	virtual void dack_w(int line,uint8_t data) override;
	virtual void eop_w(int state) override;

	std::string cpu_context() const;
	template <typename Format, typename... Params> void logerror(Format &&fmt, Params &&... args) const;

	void tape_status_clear(uint16_t value);
	void tape_status_set(uint16_t value);

	// device register I/O
	uint8_t read(offs_t offset);
	void write(offs_t offset, uint8_t data);

	void check_tape();

	void set_interrupt(enum line_state state);

	void log_command(uint8_t data);
	void do_command(uint8_t data);
	void do_reset();

	void set_dma_drq(enum line_state state);

	void write_command_port( uint8_t data);
	uint8_t read_data_port();
	void write_control_port( uint8_t data);
	uint8_t read_status_port();
	void write_dma_go( uint8_t data);
	void write_dma_reset( uint8_t data);

	void log_block(const char * text);
	void read_block();
	void write_block();
	int block_is_filemark();
	void block_set_filemark();

	uint8_t m_data;
	uint8_t m_command;
	uint8_t m_status;
	uint8_t m_control;

	uint8_t m_has_cartridge;
	uint8_t m_is_writable;

	uint8_t m_current_command;

	uint8_t m_first_block_hack;
	uint8_t m_nasty_readahead;
	uint8_t m_read_block_pending;

	uint16_t m_data_index;

	uint16_t m_tape_status;           /* Drive exception flags */
	uint16_t m_data_error_counter;    /* data error count: nr of blocks rewritten/soft read errors */
	uint16_t m_underrun_counter;      /* underrun count: nr of times streaming was interrupted */

	uint32_t m_tape_pos;
	uint32_t m_ctape_block_count;
	uint32_t m_ctape_block_index;
	uint64_t m_image_length;

	std::vector<uint8_t> m_ctape_block_buffer;
	required_device<sc499_ctape_image_device> m_image;

	enum line_state irq_state;
	enum line_state dma_drq_state;

	emu_timer * m_timer; // timer to delay functions
	emu_timer * m_timer1; // timer to delay functions
	int m_irq, m_drq;

	bool m_installed;
};


// device type definition
DECLARE_DEVICE_TYPE(ISA8_SC499, sc499_device)

#endif // MAME_BUS_ISA_SC499_H