Previous 199869 Revisions Next

r33756 Tuesday 9th December, 2014 at 03:21:23 UTC by Robbbert
(MESS) excalibur : added video, gets a bootup screen (nw)
[src/mess/drivers]excali64.c

trunk/src/mess/drivers/excali64.c
r242267r242268
1212
1313#include "emu.h"
1414#include "cpu/z80/z80.h"
15#include "video/mc6845.h"
1516#include "machine/i8251.h"
1617#include "bus/rs232/rs232.h"
1718//#include "machine/clock.h"
r242267r242268
2829public:
2930   excali64_state(const machine_config &mconfig, device_type type, const char *tag)
3031      : driver_device(mconfig, type, tag)
32      , m_palette(*this, "palette")
3133      , m_maincpu(*this, "maincpu")
3234      , m_cass(*this, "cassette")
3335   { }
3436
37   DECLARE_DRIVER_INIT(excali64);
3538   DECLARE_READ8_MEMBER(ppic_r);
3639   DECLARE_WRITE8_MEMBER(ppic_w);
3740   DECLARE_READ8_MEMBER(port50_r);
3841   DECLARE_WRITE8_MEMBER(port70_w);
42   DECLARE_WRITE8_MEMBER(video_w);
43   MC6845_UPDATE_ROW(update_row);
44   DECLARE_WRITE_LINE_MEMBER(crtc_de);
45   DECLARE_WRITE_LINE_MEMBER(crtc_vs);
46
47   const UINT8 *m_p_chargen;
48   UINT8 *m_p_videoram;
49   required_device<palette_device> m_palette;
3950   
4051private:
4152   UINT8 m_sys_status;
53   bool m_crtc_vs;
54   bool m_crtc_de;
4255   required_device<cpu_device> m_maincpu;
4356   required_device<cassette_image_device> m_cass;
4457};
4558
4659static ADDRESS_MAP_START(excali64_mem, AS_PROGRAM, 8, excali64_state)
47   AM_RANGE(0x0000, 0x3FFF) AM_ROM
60   AM_RANGE(0x0000, 0x1FFF) AM_ROM
61   AM_RANGE(0x2000, 0x2FFF) AM_ROM AM_WRITE(video_w)
62   AM_RANGE(0x3000, 0x3FFF) AM_ROM
4863   AM_RANGE(0x4000, 0xFFFF) AM_RAM
4964ADDRESS_MAP_END
5065
r242267r242268
5368   AM_RANGE(0x10, 0x10) AM_MIRROR(0x0e) AM_DEVREADWRITE("uart",i8251_device, data_r, data_w)
5469   AM_RANGE(0x11, 0x11) AM_MIRROR(0x0e) AM_DEVREADWRITE("uart", i8251_device, status_r, control_w)
5570   AM_RANGE(0x20, 0x23) AM_MIRROR(0x0c) AM_DEVREADWRITE("pit", pit8253_device, read, write)
71   AM_RANGE(0x30, 0x30) AM_DEVREADWRITE("crtc", mc6845_device, status_r, address_w)
72   AM_RANGE(0x31, 0x31) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
73   AM_RANGE(0x50, 0x5f) AM_READ(port50_r)
5674   AM_RANGE(0x60, 0x63) AM_MIRROR(0x0c) AM_DEVREADWRITE("ppi", i8255_device, read, write)
75   AM_RANGE(0x70, 0x7f) AM_WRITE(port70_w)
5776ADDRESS_MAP_END
5877
5978
r242267r242268
7897READ8_MEMBER( excali64_state::port50_r )
7998{
8099   UINT8 data = m_sys_status & 7;
100   data |= (UINT8)m_crtc_vs << 4;
101   data |= (UINT8)m_crtc_de << 5;
81102   return data;
82103}
83104
r242267r242268
95116   m_sys_status = data;
96117}
97118
119WRITE8_MEMBER( excali64_state::video_w )
120{
121   m_p_videoram[offset] = data;
122}
123
124WRITE_LINE_MEMBER( excali64_state::crtc_de )
125{
126   m_crtc_de = state;
127}
128
129WRITE_LINE_MEMBER( excali64_state::crtc_vs )
130{
131   m_crtc_vs = state;
132}
133
134DRIVER_INIT_MEMBER( excali64_state, excali64 )
135{
136   m_p_chargen = memregion("chargen")->base();
137   m_p_videoram = memregion("videoram")->base();
138}
139
140MC6845_UPDATE_ROW( excali64_state::update_row )
141{
142   const rgb_t *palette = m_palette->palette()->entry_list_raw();
143   UINT8 chr,gfx=0;
144   UINT16 mem,x;
145   UINT32 *p = &bitmap.pix32(y);
146
147   for (x = 0; x < x_count; x++)
148   {
149      UINT8 inv=0;
150      if (x == cursor_x) inv=0xff;
151      mem = (ma + x) & 0xfff;
152      chr = m_p_videoram[mem];
153      gfx = m_p_chargen[(chr<<4) | ra] ^ inv;
154
155      /* Display a scanline of a character */
156      *p++ = palette[BIT(gfx, 0)];
157      *p++ = palette[BIT(gfx, 1)];
158      *p++ = palette[BIT(gfx, 2)];
159      *p++ = palette[BIT(gfx, 3)];
160      *p++ = palette[BIT(gfx, 4)];
161      *p++ = palette[BIT(gfx, 5)];
162      *p++ = palette[BIT(gfx, 6)];
163      *p++ = palette[BIT(gfx, 7)];
164   }
165}
166
98167static MACHINE_CONFIG_START( excali64, excali64_state )
99168   /* basic machine hardware */
100169   MCFG_CPU_ADD("maincpu", Z80, XTAL_16MHz / 4)
r242267r242268
130199   MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette")
131200   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
132201
202   /* Video hardware */
203   MCFG_SCREEN_ADD("screen", RASTER)
204   MCFG_SCREEN_REFRESH_RATE(50)
205   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
206   MCFG_SCREEN_SIZE(80*8, 25*10)
207   MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 25*10-1)
208   MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
209   MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
210   MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_16MHz / 16) // 1MHz for lowres; 2MHz for highres
211   MCFG_MC6845_SHOW_BORDER_AREA(false)
212   MCFG_MC6845_CHAR_WIDTH(8)
213   MCFG_MC6845_UPDATE_ROW_CB(excali64_state, update_row)
214   MCFG_MC6845_OUT_DE_CB(WRITELINE(excali64_state, crtc_de))
215   MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(excali64_state, crtc_vs))
216
133217   /* Devices */
134218   MCFG_CASSETTE_ADD( "cassette" )
135219   MACHINE_CONFIG_END
r242267r242268
148232
149233/* Driver */
150234
151/*    YEAR  NAME      PARENT  COMPAT   MACHINE    INPUT     CLASS          INIT    COMPANY         FULLNAME        FLAGS */
152COMP( 1984, excali64, 0,      0,       excali64,  excali64, driver_device,  0,  "BGR Computers", "Excalibur 64", GAME_IS_SKELETON )
235/*    YEAR  NAME      PARENT  COMPAT   MACHINE    INPUT     CLASS             INIT        COMPANY         FULLNAME        FLAGS */
236COMP( 1984, excali64, 0,      0,       excali64,  excali64, excali64_state, excali64,  "BGR Computers", "Excalibur 64", GAME_IS_SKELETON )


Previous 199869 Revisions Next


© 1997-2024 The MAME Team