summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/includes/abc80x.h
blob: 81405a0d1005189c7d5b4869bfe9aca930180e14 (plain) (tree)
1
2
3
4
5
6
7
8
9

                               

            

                              
 
                              
                            
                        
                             

                              
                              

                               


                            
                           
                        
                          


                           

                     
 



                                                                            

                                    














                                       
                             










                                                        
                                          

                                    
                                    


                                           










                                                                            
                                                                                        




                                                  

                                                










                                                

           
                                              

                                               
                                             
                                                          

                                                          
                                     

                                                 
                                
 

                                              
 
                          
                                             
 
                                             
                                        



                                              


                                                

                                                            
 

                                             
                       
                                                                                                

                       
                     
                     






                       
                      

                                                                      
 
                 
                                    
                                            
                                         


                                           

  


                                        


                                         
                                                                                         




                                                 


                                              
                                                  

                                            
 
                                                                                                       


                                                                        
                                                

                                                   

  


                                        


                                         
                                                                                         



                                                 

           
                                               
                                                  
                                            
 
                                                                                                       
 
                                                                        
 
                                              
                                           
                                        

                                                   
                                           

  
 




                                        
                                                                                        




                                                 


                                              
                                                  
                                          
                                 
 

                                              
 

                          
                                              


                                                
                                               

                    
                                                     

                      


                                                          


                                                  

                                          







                                        
                                                                                        







                                                 


                                              
                                                  
                                            


                                           
                                                
 

                                              
 
                                            
                                                                                                       
 
                                                                                                                    

                                                                        


                                              














                                              
                                       
                                               

                       

                                                             
                                                             

                      



                                                          



                                                                   
                                                                 
                                                                     

                                                            


                                                  

                                          

  
      
// license:BSD-3-Clause
// copyright-holders:Curt Coder
#pragma once

#ifndef MAME_INCLUDES_ABC800_H
#define MAME_INCLUDES_ABC800_H

#include "bus/abcbus/abcbus.h"
#include "bus/rs232/rs232.h"
#include "cpu/z80/z80.h"
#include "machine/z80daisy.h"
#include "cpu/mcs48/mcs48.h"
#include "imagedev/cassette.h"
#include "imagedev/snapquik.h"
#include "bus/abckb/abckb.h"
#include "bus/abckb/abc800kb.h"
#include "machine/e0516.h"
#include "machine/z80ctc.h"
#include "machine/z80dart.h"
#include "machine/z80sio.h"
#include "machine/ram.h"
#include "machine/timer.h"
#include "sound/discrete.h"
#include "video/mc6845.h"
#include "video/saa5050.h"
#include "softlist.h"
#include "speaker.h"

//**************************************************************************
//  MACROS / CONSTANTS
//**************************************************************************

#define ABC800_X01  XTAL(12'000'000)
#define ABC806_X02  XTAL(32'768)

#define ABC802_AT0  0x01
#define ABC802_AT1  0x02
#define ABC802_ATD  0x40
#define ABC802_ATE  0x80
#define ABC802_INV  0x80

#define ABC800C_CHAR_RAM_SIZE   0x400
#define ABC800M_CHAR_RAM_SIZE   0x800
#define ABC800_VIDEO_RAM_SIZE   0x4000
#define ABC802_CHAR_RAM_SIZE    0x800
#define ABC806_CHAR_RAM_SIZE    0x800
#define ABC806_ATTR_RAM_SIZE    0x800
#define ABC806_VIDEO_RAM_SIZE   0x20000

#define ABC800_CHAR_WIDTH   6
#define ABC800_CCLK         ABC800_X01/ABC800_CHAR_WIDTH

#define SCREEN_TAG          "screen"
#define Z80_TAG             "z80"
#define E0516_TAG           "j13"
#define MC6845_TAG          "b12"
#define SAA5052_TAG         "5c"
#define Z80CTC_TAG          "z80ctc"
#define Z80SIO_TAG          "z80sio"
#define Z80DART_TAG         "z80dart"
#define DISCRETE_TAG        "discrete"
#define CASSETTE_TAG		"cassette"
#define RS232_A_TAG         "rs232a"
#define RS232_B_TAG         "rs232b"
#define ABC_KEYBOARD_PORT_TAG   "kb"
#define TIMER_CTC_TAG		"timer_ctc"
#define TIMER_CASSETTE_TAG  "timer_cass"



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

// ======================> abc800_state

class abc800_state : public driver_device
{
public:
	abc800_state(const machine_config &mconfig, device_type type, const char *tag) :
		driver_device(mconfig, type, tag),
		m_maincpu(*this, Z80_TAG),
		m_ctc(*this, Z80CTC_TAG),
		m_dart(*this, Z80DART_TAG),
		m_sio(*this, Z80SIO_TAG),
		m_discrete(*this, DISCRETE_TAG),
		m_cassette(*this, CASSETTE_TAG),
		m_ram(*this, RAM_TAG),
		m_rom(*this, Z80_TAG),
		m_video_ram(*this, "video_ram"),
		m_char_ram(*this, "char_ram"),
		m_io_sb(*this, "SB"),
		m_ctc_z0(0),
		m_sio_txcb(0),
		m_sio_txdb(1),
		m_sio_rtsb(1),
		m_dfd_out(0),
		m_tape_ctr(4)
	{ }

	required_device<cpu_device> m_maincpu;
	required_device<z80ctc_device> m_ctc;
	required_device<z80dart_device> m_dart;
	required_device<z80sio_device> m_sio;
	optional_device<discrete_sound_device> m_discrete;
	optional_device<cassette_image_device> m_cassette;
	required_device<ram_device> m_ram;
	required_memory_region m_rom;
	optional_shared_ptr<uint8_t> m_video_ram;
	optional_shared_ptr<uint8_t> m_char_ram;
	required_ioport m_io_sb;

	virtual void machine_start() override;
	virtual void machine_reset() override;

	void bankswitch();
	void cassette_output_tick(int state);

	virtual DECLARE_READ8_MEMBER( m1_r );
	DECLARE_READ8_MEMBER( pling_r );
	DECLARE_WRITE8_MEMBER( hrs_w );
	DECLARE_WRITE8_MEMBER( hrc_w );
	DECLARE_WRITE_LINE_MEMBER( ctc_z0_w );
	DECLARE_WRITE_LINE_MEMBER( ctc_z1_w );
	DECLARE_WRITE_LINE_MEMBER( sio_txdb_w );
	DECLARE_WRITE_LINE_MEMBER( sio_dtrb_w );
	DECLARE_WRITE_LINE_MEMBER( sio_rtsb_w );
	TIMER_DEVICE_CALLBACK_MEMBER( ctc_tick );
	TIMER_DEVICE_CALLBACK_MEMBER( cassette_input_tick );

	DECLARE_QUICKLOAD_LOAD_MEMBER( bac );

	// memory state
	bool m_fetch_charram;        // opcode fetched from character RAM region (0x7800-0x7fff)

	// serial state
	uint8_t m_sb;
	int m_ctc_z0;
	int m_sio_txcb;
	int m_sio_txdb;
	int m_sio_rtsb;
	int m_dfd_out;
	int m_dfd_in;
	int m_tape_ctr;

	// video state
	uint8_t m_hrs;                    // HR picture start scanline
	uint8_t m_fgctl;                  // HR foreground control

	// timers
	emu_timer *m_cassette_timer;
	void common(machine_config &config);
	void abc800_m1(address_map &map);
	void abc800c_io(address_map &map);
	void abc800m_io(address_map &map);
	void abc800m_mem(address_map &map);
};


// ======================> abc800m_state

class abc800m_state : public abc800_state
{
public:
	abc800m_state(const machine_config &mconfig, device_type type, const char *tag) :
		abc800_state(mconfig, type, tag),
		m_crtc(*this, MC6845_TAG),
		m_palette(*this, "palette"),
		m_fgctl_prom(*this, "hru2"),
		m_char_rom(*this, MC6845_TAG)
	{ }

	required_device<mc6845_device> m_crtc;
	required_device<palette_device> m_palette;
	required_memory_region m_fgctl_prom;
	required_memory_region m_char_rom;

	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);

	void hr_update(bitmap_rgb32 &bitmap, const rectangle &cliprect);

	MC6845_UPDATE_ROW( abc800m_update_row );
	void abc800m(machine_config &config);
	void abc800m_video(machine_config &config);
};


// ======================> abc800c_state

class abc800c_state : public abc800_state
{
public:
	abc800c_state(const machine_config &mconfig, device_type type, const char *tag) :
		abc800_state(mconfig, type, tag),
		m_trom(*this, SAA5052_TAG),
		m_palette(*this, "palette"),
		m_fgctl_prom(*this, "hru2")
	{ }

	required_device<saa5052_device> m_trom;
	required_device<palette_device> m_palette;
	required_memory_region m_fgctl_prom;

	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);

	void hr_update(bitmap_rgb32 &bitmap, const rectangle &cliprect);

	DECLARE_READ8_MEMBER( m1_r ) override;
	DECLARE_READ8_MEMBER( char_ram_r );
	DECLARE_PALETTE_INIT( abc800c );
	void abc800c(machine_config &config);
	void abc800c_video(machine_config &config);
	void abc800c_mem(address_map &map);
};


// ======================> abc802_state

class abc802_state : public abc800_state
{
public:
	abc802_state(const machine_config &mconfig, device_type type, const char *tag) :
		abc800_state(mconfig, type, tag),
		m_crtc(*this, MC6845_TAG),
		m_palette(*this, "palette"),
		m_char_rom(*this, MC6845_TAG),
		m_config(*this, "CONFIG")
	{ }

	required_device<mc6845_device> m_crtc;
	required_device<palette_device> m_palette;
	required_memory_region m_char_rom;
	required_ioport m_config;

	virtual void machine_start() override;
	virtual void machine_reset() override;

	void bankswitch();

	DECLARE_READ8_MEMBER( m1_r ) override;
	DECLARE_WRITE_LINE_MEMBER( lrs_w );
	DECLARE_WRITE_LINE_MEMBER( mux80_40_w );
	DECLARE_WRITE_LINE_MEMBER( vs_w );
	MC6845_UPDATE_ROW( abc802_update_row );

	// cpu state
	int m_lrs;                  // low RAM select

	// video state
	int m_flshclk_ctr;          // flash clock counter
	int m_flshclk;              // flash clock
	int m_80_40_mux;            // 40/80 column mode

	void abc802(machine_config &config);
	void abc802_video(machine_config &config);
	void abc802_io(address_map &map);
	void abc802_mem(address_map &map);
};


// ======================> abc806_state

class abc806_state : public abc800_state
{
public:
	abc806_state(const machine_config &mconfig, device_type type, const char *tag) :
		abc800_state(mconfig, type, tag),
		m_crtc(*this, MC6845_TAG),
		m_palette(*this, "palette"),
		m_rtc(*this, E0516_TAG),
		m_rad_prom(*this, "rad"),
		m_hru2_prom(*this, "hru"),
		m_char_rom(*this, MC6845_TAG),
		m_attr_ram(*this, "attr_ram")
	{ }

	required_device<mc6845_device> m_crtc;
	required_device<palette_device> m_palette;
	required_device<e0516_device> m_rtc;
	required_memory_region m_rad_prom;
	required_memory_region m_hru2_prom;
	required_memory_region m_char_rom;
	optional_shared_ptr<uint8_t> m_attr_ram;

	virtual void machine_start() override;
	virtual void machine_reset() override;

	virtual void video_start() override;
	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);

	void read_pal_p4(offs_t offset, bool m1l, bool xml, offs_t &m, bool &romd, bool &ramd, bool &hre, bool &vr);
	void hr_update(bitmap_rgb32 &bitmap, const rectangle &cliprect);

	DECLARE_READ8_MEMBER( read );
	DECLARE_WRITE8_MEMBER( write );
	DECLARE_READ8_MEMBER( m1_r ) override;
	DECLARE_READ8_MEMBER( mai_r );
	DECLARE_WRITE8_MEMBER( mao_w );
	DECLARE_WRITE8_MEMBER( hrs_w );
	DECLARE_WRITE8_MEMBER( hrc_w );
	DECLARE_READ8_MEMBER( charram_r );
	DECLARE_WRITE8_MEMBER( charram_w );
	DECLARE_READ8_MEMBER( ami_r );
	DECLARE_WRITE8_MEMBER( amo_w );
	DECLARE_READ8_MEMBER( cli_r );
	DECLARE_WRITE8_MEMBER( sso_w );
	DECLARE_READ8_MEMBER( sti_r );
	DECLARE_WRITE8_MEMBER( sto_w );
	DECLARE_WRITE_LINE_MEMBER( keydtr_w );
	DECLARE_WRITE_LINE_MEMBER( hs_w );
	DECLARE_WRITE_LINE_MEMBER( vs_w );
	DECLARE_PALETTE_INIT( abc806 );
	MC6845_UPDATE_ROW( abc806_update_row );

	// memory state
	int m_keydtr;               // keyboard DTR
	int m_eme;                  // extended memory enable
	uint8_t m_map[16];            // memory page register

	// video state
	int m_txoff;                // text display enable
	int m_40;                   // 40/80 column mode
	int m_flshclk_ctr;          // flash clock counter
	int m_flshclk;              // flash clock
	uint8_t m_attr_data;          // attribute data latch
	uint8_t m_hrc[16];            // HR palette
	uint8_t m_sync;               // line synchronization delay
	uint8_t m_v50_addr;           // vertical sync PROM address
	int m_hru2_a8;              // HRU II PROM address line 8
	uint32_t m_vsync_shift;       // vertical sync shift register
	int m_vsync;                // vertical sync
	int m_d_vsync;              // delayed vertical sync

	void abc806(machine_config &config);
	void abc806_video(machine_config &config);
	void abc806_io(address_map &map);
	void abc806_mem(address_map &map);
};

#endif