/********************************************************************** Copyright (C) Antoine Mine' 2006 Thomson 8-bit computers **********************************************************************/ #ifndef _THOMSON_H_ #define _THOMSON_H_ #include "emu.h" #include "cpu/m6809/m6809.h" #include "machine/6821pia.h" #include "machine/mc6846.h" #include "machine/6850acia.h" #include "machine/6551acia.h" #include "sound/dac.h" #include "audio/mea8000.h" #include "machine/ctronics.h" #include "imagedev/cartslot.h" #include "imagedev/cassette.h" #include "machine/mc6843.h" #include "machine/mc6846.h" #include "machine/mc6854.h" #include "formats/thom_cas.h" #include "formats/thom_dsk.h" #include "machine/thomflop.h" /*----------- defined in machine/thomson.c -----------*/ /*************************** common ********************************/ /* 6821 PIAs */ #define THOM_PIA_SYS "pia_0" /* system PIA */ #define THOM_PIA_GAME "pia_1" /* music & game PIA (joypad + sound) */ #define THOM_PIA_IO "pia_2" /* CC 90-232 I/O extension (parallel & RS-232) */ #define THOM_PIA_MODEM "pia_3" /* MD 90-120 MODEM extension */ /* sound ports */ #define THOM_SOUND_BUZ 0 /* 1-bit buzzer */ #define THOM_SOUND_GAME 1 /* 6-bit game port DAC */ #define THOM_SOUND_SPEECH 2 /* speech synthesis */ /* bank-switching */ #define THOM_CART_BANK "bank2" /* cartridge ROM */ #define THOM_RAM_BANK "bank3" /* data RAM */ #define THOM_FLOP_BANK "bank4" /* external floppy controller ROM */ #define THOM_BASE_BANK "bank5" /* system RAM */ extern const pia6821_interface to7_pia6821_sys; extern const pia6821_interface to7_pia6821_io; extern const pia6821_interface to7_pia6821_modem; extern const pia6821_interface to7_pia6821_game; extern const pia6821_interface to770_pia6821_sys; extern const pia6821_interface mo5_pia6821_sys; extern const pia6821_interface to9_pia6821_sys; extern const pia6821_interface to8_pia6821_sys; extern const pia6821_interface to9p_pia6821_sys; extern const pia6821_interface mo6_pia6821_game; extern const pia6821_interface mo6_pia6821_sys; extern const pia6821_interface mo5nr_pia6821_sys; extern const pia6821_interface mo5nr_pia6821_game; /***************************** TO7 / T9000 *************************/ /* cartridge bank-switching */ extern DEVICE_IMAGE_LOAD( to7_cartridge ); extern WRITE8_HANDLER ( to7_cartridge_w ); extern READ8_HANDLER ( to7_cartridge_r ); /* dispatch MODEM or speech synthesis extension */ extern READ8_HANDLER ( to7_modem_mea8000_r ); extern WRITE8_HANDLER ( to7_modem_mea8000_w ); /* MIDI extension (actually an 6850 ACIA) */ extern READ8_HANDLER ( to7_midi_r ); extern WRITE8_HANDLER ( to7_midi_w ); extern MACHINE_START ( to7 ); extern MACHINE_RESET ( to7 ); /* centronics */ extern const centronics_interface to7_centronics_config; extern const centronics_interface mo6_centronics_config; /* timer */ extern const mc6846_interface to7_timer; /* speech synthesis */ extern const mea8000_interface to7_speech; /* modem */ extern const acia6850_interface to7_modem; /***************************** TO7/70 ******************************/ /* gate-array */ extern READ8_HANDLER ( to770_gatearray_r ); extern WRITE8_HANDLER ( to770_gatearray_w ); extern MACHINE_START ( to770 ); extern MACHINE_RESET ( to770 ); extern const mc6846_interface to770_timer; /***************************** MO5 ******************************/ /* gate-array */ extern READ8_HANDLER ( mo5_gatearray_r ); extern WRITE8_HANDLER ( mo5_gatearray_w ); /* cartridge / extended RAM bank-switching */ extern DEVICE_IMAGE_LOAD( mo5_cartridge ); extern WRITE8_HANDLER ( mo5_ext_w ); extern WRITE8_HANDLER ( mo5_cartridge_w ); extern READ8_HANDLER ( mo5_cartridge_r ); extern MACHINE_START ( mo5 ); extern MACHINE_RESET ( mo5 ); /***************************** TO9 ******************************/ /* IEEE extension */ extern WRITE8_HANDLER ( to9_ieee_w ); extern READ8_HANDLER ( to9_ieee_r ); /* ROM bank-switching */ extern WRITE8_HANDLER ( to9_cartridge_w ); extern READ8_HANDLER ( to9_cartridge_r ); /* system gate-array */ extern READ8_HANDLER ( to9_gatearray_r ); extern WRITE8_HANDLER ( to9_gatearray_w ); /* video gate-array */ extern READ8_HANDLER ( to9_vreg_r ); extern WRITE8_HANDLER ( to9_vreg_w ); /* keyboard */ extern READ8_HANDLER ( to9_kbd_r ); extern WRITE8_HANDLER ( to9_kbd_w ); extern MACHINE_START ( to9 ); extern MACHINE_RESET ( to9 ); extern const mc6846_interface to9_timer; /***************************** TO8 ******************************/ /* bank-switching */ #define TO8_SYS_LO "bank5" /* system RAM low 2 Kb */ #define TO8_SYS_HI "bank6" /* system RAM hi 2 Kb */ #define TO8_DATA_LO "bank7" /* data RAM low 2 Kb */ #define TO8_DATA_HI "bank8" /* data RAM hi 2 Kb */ #define TO8_BIOS_BANK "bank9" /* BIOS ROM */ extern UINT8 to8_data_vpage; extern UINT8 to8_cart_vpage; extern WRITE8_HANDLER ( to8_cartridge_w ); extern READ8_HANDLER ( to8_cartridge_r ); /* system gate-array */ extern READ8_HANDLER ( to8_gatearray_r ); extern WRITE8_HANDLER ( to8_gatearray_w ); /* video gate-array */ extern READ8_HANDLER ( to8_vreg_r ); extern WRITE8_HANDLER ( to8_vreg_w ); /* floppy */ extern READ8_HANDLER ( to8_floppy_r ); extern WRITE8_HANDLER ( to8_floppy_w ); extern MACHINE_START ( to8 ); extern MACHINE_RESET ( to8 ); extern const mc6846_interface to8_timer; /***************************** TO9+ ******************************/ extern MACHINE_START ( to9p ); extern MACHINE_RESET ( to9p ); extern const mc6846_interface to9p_timer; /***************************** MO6 ******************************/ extern READ8_HANDLER ( mo6_cartridge_r ); extern WRITE8_HANDLER ( mo6_cartridge_w ); extern WRITE8_HANDLER ( mo6_ext_w ); /* system gate-array */ extern READ8_HANDLER ( mo6_gatearray_r ); extern WRITE8_HANDLER ( mo6_gatearray_w ); /* video gate-array */ extern READ8_HANDLER ( mo6_vreg_r ); extern WRITE8_HANDLER ( mo6_vreg_w ); extern MACHINE_START ( mo6 ); extern MACHINE_RESET ( mo6 ); /***************************** MO5 NR ******************************/ /* network */ extern READ8_HANDLER ( mo5nr_net_r ); extern WRITE8_HANDLER ( mo5nr_net_w ); /* printer */ extern READ8_HANDLER ( mo5nr_prn_r ); extern WRITE8_HANDLER ( mo5nr_prn_w ); extern MACHINE_START ( mo5nr ); extern MACHINE_RESET ( mo5nr ); /*----------- defined in video/thomson.c -----------*/ /* TO7 video: one line (64 us) = 56 left border pixels ( 7 us) + 320 active pixels (40 us) + 56 right border pixels ( 7 us) + horizontal retrace (10 us) one image (20 ms) = 47 top border lines (~3 ms) + 200 active lines (12.8 ms) + 47 bottom border lines (~3 ms) + vertical retrace (~1 ms) TO9 and up introduced a half (160 pixels) and double (640 pixels) horizontal mode, but still in 40 us (no change in refresh rate). */ /***************************** dimensions **************************/ /* original screen dimension (may be different from emulated screen!) */ #define THOM_ACTIVE_WIDTH 320 #define THOM_BORDER_WIDTH 56 #define THOM_ACTIVE_HEIGHT 200 #define THOM_BORDER_HEIGHT 47 #define THOM_TOTAL_WIDTH 432 #define THOM_TOTAL_HEIGHT 294 /* Emulated screen dimension may be doubled to allow hi-res 640x200 mode. Emulated screen can have smaller borders. */ /* maximum number of video pages: 1 for TO7 generation (including MO5) 4 for TO8 generation (including TO9, MO6) */ #define THOM_NB_PAGES 4 /* page 0 is banked */ #define THOM_VRAM_BANK "bank1" extern UINT8* thom_vram; /*********************** video signals *****************************/ struct thom_vsignal { unsigned count; /* pixel counter */ unsigned init; /* 1 -> active vertical windos, 0 -> border/VBLANK */ unsigned inil; /* 1 -> active horizontal window, 0 -> border/HBLANK */ unsigned lt3; /* bit 3 of us counter */ unsigned line; /* line counter */ }; /* current video position */ extern struct thom_vsignal thom_get_vsignal ( running_machine &machine ); /************************* lightpen ********************************/ /* specific TO7 / T9000 lightpen code (no video gate-array) */ extern unsigned to7_lightpen_gpl ( running_machine &machine, int decx, int decy ); /* video position corresponding to lightpen (with some offset) */ extern struct thom_vsignal thom_get_lightpen_vsignal ( running_machine &machine, int xdec, int ydec, int xdec2 ); /* specify a lightpencall-back function, called nb times per frame */ extern void thom_set_lightpen_callback ( running_machine &machine, int nb, void (*cb) ( running_machine &machine, int step ) ); /***************************** commons *****************************/ extern VIDEO_START ( thom ); extern SCREEN_UPDATE_IND16 ( thom ); extern PALETTE_INIT ( thom ); extern SCREEN_VBLANK ( thom ); /* pass video init signal */ extern void thom_set_init_callback ( running_machine &machine, void (*cb) ( running_machine &machine, int init ) ); /* TO7 TO7/70 MO5 video bank switch */ extern void thom_set_mode_point ( running_machine &machine, int point ); /* set the palette index for the border color */ extern void thom_set_border_color ( running_machine &machine, unsigned color ); /* set one of 16 palette indices to one of 4096 colors */ extern void thom_set_palette ( running_machine &machine, unsigned index, UINT16 color ); /* video modes */ #define THOM_VMODE_TO770 0 #define THOM_VMODE_MO5 1 #define THOM_VMODE_BITMAP4 2 #define THOM_VMODE_BITMAP4_ALT 3 #define THOM_VMODE_80 4 #define THOM_VMODE_BITMAP16 5 #define THOM_VMODE_PAGE1 6 #define THOM_VMODE_PAGE2 7 #define THOM_VMODE_OVERLAY 8 #define THOM_VMODE_OVERLAY3 9 #define THOM_VMODE_TO9 10 #define THOM_VMODE_80_TO9 11 #define THOM_VMODE_NB 12 /* change the current video-mode */ extern void thom_set_video_mode ( running_machine &machine, unsigned mode ); /* select which video page shown among the 4 available */ extern void thom_set_video_page ( running_machine &machine, unsigned page ); /* to tell there is some floppy activity, stays up for a few frames */ extern void thom_floppy_active ( running_machine &machine, int write ); /***************************** TO7 / T9000 *************************/ extern WRITE8_HANDLER ( to7_vram_w ); /***************************** TO7/70 ******************************/ extern WRITE8_HANDLER ( to770_vram_w ); /***************************** TO8 ******************************/ /* write to video memory through system space (always page 1) */ WRITE8_HANDLER ( to8_sys_lo_w ); WRITE8_HANDLER ( to8_sys_hi_w ); /* write to video memory through data space */ WRITE8_HANDLER ( to8_data_lo_w ); WRITE8_HANDLER ( to8_data_hi_w ); /* write to video memory page through cartridge addresses space */ WRITE8_HANDLER ( to8_vcart_w ); class to7_io_line_device : public device_t, public device_serial_interface { public: // construction/destruction to7_io_line_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); virtual void input_callback(UINT8 state); /* read data register */ DECLARE_READ8_MEMBER(porta_in); /* write data register */ DECLARE_WRITE8_MEMBER(porta_out); protected: // device-level overrides virtual void device_start(); virtual void device_reset(); }; extern const device_type TO7_IO_LINE; #define MCFG_TO7_IO_LINE_ADD(_tag) \ MCFG_DEVICE_ADD((_tag), TO7_IO_LINE, 0) #endif /* _THOMSON_H_ */