/********************************************************************** Copyright (C) Antoine Mine' 2008 Hewlett Packard HP48 S/SX & G/GX **********************************************************************/ #ifdef CHARDEV #include "devices/chardev.h" #endif /* model */ typedef enum { HP48_S, HP48_SX, HP48_G, HP48_GX, HP48_GP, } hp48_models; /* memory module configuration */ typedef struct { /* static part */ UINT32 off_mask; /* offset bit-mask, indicates the real size */ read8_space_func read; const char *read_name; write8_space_func write; const char *write_name; void* data; /* non-NULL for banks */ int isnop; /* configurable part */ UINT8 state; /* one of HP48_MODULE_ */ UINT32 base; /* base address */ UINT32 mask; /* often improperly called size, it is an address select mask */ } hp48_module; /* screen image averaging */ #define HP48_NB_SCREENS 3 class hp48_state : public driver_device { public: hp48_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) { } UINT8 *m_videoram; UINT8 m_io[64]; hp48_models m_model; UINT16 m_out; UINT8 m_kdn; hp48_module m_modules[6]; UINT32 m_port_size[2]; UINT8 m_port_write[2]; UINT8* m_port_data[2]; UINT32 m_bank_switch; UINT32 m_io_addr; UINT16 m_crc; UINT8 m_timer1; UINT32 m_timer2; #ifdef CHARDEV chardev* m_chardev; #endif UINT8 m_screens[ HP48_NB_SCREENS ][ 64 ][ 144 ]; int m_cur_screen; DECLARE_DRIVER_INIT(hp48); }; /*************************************************************************** MACROS ***************************************************************************/ /* read from I/O memory */ #define HP48_IO_4(x) (state->m_io[(x)]) #define HP48_IO_8(x) (state->m_io[(x)] | (state->m_io[(x)+1] << 4)) #define HP48_IO_12(x) (state->m_io[(x)] | (state->m_io[(x)+1] << 4) | (state->m_io[(x)+2] << 8)) #define HP48_IO_20(x) (state->m_io[(x)] | (state->m_io[(x)+1] << 4) | (state->m_io[(x)+2] << 8) | \ (state->m_io[(x)+3] << 12) | (state->m_io[(x)+4] << 16)) /*----------- defined in machine/hp48.c -----------*/ /*************************************************************************** GLOBAL VARIABLES & CONSTANTS ***************************************************************************/ /* I/O memory */ /*************************************************************************** FUNCTION PROTOTYPES ***************************************************************************/ /************************ Saturn's I/O *******************************/ /* memory controller */ void hp48_mem_reset( device_t *device ); void hp48_mem_config( device_t *device, int v ); void hp48_mem_unconfig( device_t *device, int v ); int hp48_mem_id( device_t *device ); /* CRC computation */ void hp48_mem_crc( device_t *device, int addr, int data ); /* IN/OUT registers */ int hp48_reg_in( device_t *device ); void hp48_reg_out( device_t *device, int v ); /* keybord interrupt system */ void hp48_rsi( device_t *device ); /***************************** serial ********************************/ extern void hp48_rs232_start_recv_byte( running_machine &machine, UINT8 data ); /****************************** cards ********************************/ /* port specification */ struct hp48_port_interface { int port; /* port index: 0 or 1 (for port 1 and 2) */ int module; /* memory module where the port is visible */ int max_size; /* maximum size, in bytes 128 KB or 4 GB */ }; class hp48_port_image_device : public device_t, public device_image_interface, public hp48_port_interface { public: // construction/destruction hp48_port_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); // image-level overrides virtual iodevice_t image_type() const { return IO_MEMCARD; } virtual bool is_readable() const { return 1; } virtual bool is_writeable() const { return 1; } virtual bool is_creatable() const { return 1; } virtual bool must_be_loaded() const { return 0; } virtual bool is_reset_on_load() const { return 0; } virtual const char *image_interface() const { return NULL; } virtual const char *file_extensions() const { return "crd"; } virtual const option_guide *create_option_guide() const { return NULL; } virtual bool call_load(); virtual void call_unload(); virtual bool call_create(int format_type, option_resolution *format_options); protected: // device-level overrides virtual void device_config_complete(); virtual void device_start(); private: void hp48_fill_port(); void hp48_unfill_port(); }; extern const struct hp48_port_interface hp48sx_port1_config; extern const struct hp48_port_interface hp48sx_port2_config; extern const struct hp48_port_interface hp48gx_port1_config; extern const struct hp48_port_interface hp48gx_port2_config; // device type definition extern const device_type HP48_PORT; #define MCFG_HP48_PORT_ADD(_tag, _intrf) \ MCFG_DEVICE_ADD(_tag, HP48_PORT, 0) \ MCFG_DEVICE_CONFIG(_intrf) /****************************** machine ******************************/ extern MACHINE_START( hp48s ); extern MACHINE_START( hp48sx ); extern MACHINE_START( hp48g ); extern MACHINE_START( hp48gx ); extern MACHINE_START( hp48gp ); extern MACHINE_RESET( hp48 ); /*----------- defined in video/hp48.c -----------*/ /****************************** video ********************************/ extern SCREEN_UPDATE_IND16 ( hp48 ); extern PALETTE_INIT ( hp48 );