/***************************************************************************** * * includes/x68k.h * * Sharp X68000 * ****************************************************************************/ #ifndef X68K_H_ #define X68K_H_ #include "machine/rp5c15.h" #define MC68901_TAG "mc68901" #define RP5C15_TAG "rp5c15" #define GFX16 0 #define GFX256 1 #define GFX65536 2 enum { MFP_IRQ_GPIP0 = 0, MFP_IRQ_GPIP1, MFP_IRQ_GPIP2, MFP_IRQ_GPIP3, MFP_IRQ_TIMERD, MFP_IRQ_TIMERC, MFP_IRQ_GPIP4, MFP_IRQ_GPIP5, MFP_IRQ_TIMERB, MFP_IRQ_TX_ERROR, MFP_IRQ_TX_EMPTY, MFP_IRQ_RX_ERROR, MFP_IRQ_RX_FULL, MFP_IRQ_TIMERA, MFP_IRQ_GPIP6, MFP_IRQ_GPIP7 }; // MC68901 IRQ priority levels class x68k_state : public driver_device { public: x68k_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_mfpdev(*this, MC68901_TAG), m_rtc(*this, RP5C15_TAG), m_nvram16(*this, "nvram16"), m_nvram32(*this, "nvram32"), m_gvram16(*this, "gvram16"), m_tvram16(*this, "tvram16"), m_gvram32(*this, "gvram32"), m_tvram32(*this, "tvram32") { } required_device m_mfpdev; required_device m_rtc; optional_shared_ptr m_nvram16; optional_shared_ptr m_nvram32; optional_shared_ptr m_gvram16; optional_shared_ptr m_tvram16; optional_shared_ptr m_gvram32; optional_shared_ptr m_tvram32; DECLARE_WRITE_LINE_MEMBER( mfp_tdo_w ); DECLARE_READ8_MEMBER( mfp_gpio_r ); struct { int sram_writeprotect; int monitor; int contrast; int keyctrl; UINT16 cputype; } m_sysport; struct { int led_ctrl[4]; int led_eject[4]; int eject[4]; int motor[4]; int media_density[4]; int disk_inserted[4]; int selected_drive; int drq_state; } m_fdc; struct { int ioc7; // "Function B operation of joystick # one option" int ioc6; // "Function A operation of joystick # one option" int joy1_enable; // IOC4 int joy2_enable; // IOC5 } m_joy; struct { int rate; // ADPCM sample rate int pan; // ADPCM output switch int clock; // ADPCM clock speed } m_adpcm; struct { int gpdr; // [0] GPIP data register. Typically all inputs. int aer; // [1] GPIP active edge register. Determines on which transition an IRQ is triggered. 0 = 1->0 int ddr; // [2] GPIP data direction register. Determines which GPIP bits are inputs (0) or outputs (1) int iera; // [3] Interrupt enable register A. int ierb; // [4] Interrupt enable register B. int ipra; // [5] Interrupt pending register A. int iprb; // [6] Interrupt pending register B. int isra; // [7] Interrupt in-service register A. int isrb; // [8] Interrupt in-service register B. int imra; // [9] Interrupt mask register A. int imrb; // [10] Interrupt mask register B. int vr; // [11] Vector register int tacr; // [12] Timer A control register int tbcr; // [13] Timer B control register int tcdcr; // [14] Timer C & D control register int tadr; // [15] Timer A data register int tbdr; // [16] Timer B data register int tcdr; // [17] Timer C data register int tddr; // [18] Timer D data register int scr; // [19] Synchronous character register int ucr; // [20] USART control register int rsr; // [21] Receiver status register int tsr; // [22] Transmitter status register int udr; // [23] USART data register struct { int counter; int prescaler; } timer[4]; struct { unsigned char recv_buffer; unsigned char send_buffer; int recv_enable; int send_enable; } usart; int vector; int irqline; int eoi_mode; int current_irq; unsigned char gpio; } m_mfp; // MC68901 Multifunction Peripheral (4MHz) struct { unsigned short reg[24]; // registers int operation; // operation port (0xe80481) int vblank; // 1 if in VBlank int hblank; // 1 if in HBlank int htotal; // Horizontal Total (in characters) int vtotal; // Vertical Total int hbegin; // Horizontal Begin int vbegin; // Vertical Begin int hend; // Horizontal End int vend; // Vertical End int hsync_end; // Horizontal Sync End int vsync_end; // Vertical Sync End int hsyncadjust; // Horizontal Sync Adjustment float hmultiple; // Horizontal pixel multiplier float vmultiple; // Vertical scanline multiplier (x2 for doublescan modes) int height; int width; int visible_height; int visible_width; int hshift; int vshift; int video_width; // horizontal total (in pixels) int video_height; // vertical total int bg_visible_height; int bg_visible_width; int bg_hshift; int bg_vshift; int bg_hvres; // bits 0,1 = H-Res, bits 2,3 = V-Res, bit 4 = L/H Freq (0=15.98kHz, 1=31.5kHz) int bg_double; // 1 if PCG is to be doubled. int interlace; // 1024 vertical resolution is interlaced } m_crtc; // CRTC struct { // video controller at 0xe82000 unsigned short text_pal[0x100]; unsigned short gfx_pal[0x100]; unsigned short reg[3]; int text_pri; int sprite_pri; int gfx_pri; int gfxlayer_pri[4]; // block displayed for each priority level int tile8_dirty[1024]; int tile16_dirty[256]; } m_video; struct { int delay; // keypress delay after initial press int repeat; // keypress repeat rate int enabled; // keyboard enabled? unsigned char led_status; // keyboard LED status unsigned char buffer[16]; int headpos; // scancodes are added here int tailpos; // scancodes are read from here int keynum; // number of scancodes in buffer int keytime[0x80]; // time until next keypress int keyon[0x80]; // is 1 if key is pressed, used to determine if the key state has changed from 1 to 0 int last_pressed; // last key pressed, for repeat key handling } m_keyboard; struct { int irqstatus; int fdcvector; int fddvector; int hdcvector; int prnvector; } m_ioc; struct { int inputtype; // determines which input is to be received int irqactive; // non-zero if IRQ is being serviced char last_mouse_x; // previous mouse x-axis value char last_mouse_y; // previous mouse y-axis value int bufferempty; // non-zero if buffer is empty } m_mouse; struct { // port A int mux1; // multiplexer value int seq1; // part of 6-button input sequence. emu_timer* io_timeout1; // port B int mux2; // multiplexer value int seq2; // part of 6-button input sequence. emu_timer* io_timeout2; } m_mdctrl; UINT16* m_sram; UINT8 m_ppi_port[3]; int m_current_vector[8]; UINT8 m_current_irq_line; unsigned int m_scanline; int m_led_state; emu_timer* m_kb_timer; emu_timer* m_mouse_timer; emu_timer* m_led_timer; emu_timer* m_net_timer; unsigned char m_scc_prev; UINT16 m_ppi_prev; int m_mfp_prev; emu_timer* m_scanline_timer; emu_timer* m_raster_irq; emu_timer* m_vblank_irq; UINT16* m_spriteram; UINT16* m_spritereg; tilemap_t* m_bg0_8; tilemap_t* m_bg1_8; tilemap_t* m_bg0_16; tilemap_t* m_bg1_16; int m_sprite_shift; int m_oddscanline; bool m_is_32bit; DECLARE_DRIVER_INIT(x68kxvi); DECLARE_DRIVER_INIT(x68030); DECLARE_DRIVER_INIT(x68000); TILE_GET_INFO_MEMBER(x68k_get_bg0_tile); TILE_GET_INFO_MEMBER(x68k_get_bg1_tile); TILE_GET_INFO_MEMBER(x68k_get_bg0_tile_16); TILE_GET_INFO_MEMBER(x68k_get_bg1_tile_16); }; /*----------- defined in drivers/x68k.c -----------*/ #ifdef UNUSED_FUNCTION void mfp_trigger_irq(int); TIMER_CALLBACK(mfp_timer_a_callback); TIMER_CALLBACK(mfp_timer_b_callback); TIMER_CALLBACK(mfp_timer_c_callback); TIMER_CALLBACK(mfp_timer_d_callback); #endif /*----------- defined in video/x68k.c -----------*/ TIMER_CALLBACK(x68k_crtc_raster_irq); TIMER_CALLBACK(x68k_crtc_vblank_irq); TIMER_CALLBACK(x68k_hsync); PALETTE_INIT( x68000 ); READ16_HANDLER( x68k_spritereg_r ); WRITE16_HANDLER( x68k_spritereg_w ); READ16_HANDLER( x68k_spriteram_r ); WRITE16_HANDLER( x68k_spriteram_w ); WRITE16_HANDLER( x68k_crtc_w ); READ16_HANDLER( x68k_crtc_r ); WRITE16_HANDLER( x68k_gvram_w ); READ16_HANDLER( x68k_gvram_r ); WRITE16_HANDLER( x68k_tvram_w ); READ16_HANDLER( x68k_tvram_r ); WRITE32_HANDLER( x68k_gvram32_w ); READ32_HANDLER( x68k_gvram32_r ); WRITE32_HANDLER( x68k_tvram32_w ); READ32_HANDLER( x68k_tvram32_r ); SCREEN_UPDATE_IND16( x68000 ); VIDEO_START( x68000 ); #endif /* X68K_H_ */