Previous 199869 Revisions Next

r34725 Thursday 29th January, 2015 at 20:14:23 UTC by Couriersud
Merge branch 'master' of https://github.com/mamedev/mame.git
[/trunk]makefile
[src/emu/bus/nes_ctrl]ctrl.c miracle.c miracle.h
[src/emu/cpu/tms0980]tms0980d.c
[src/mame/drivers]limenko.c lordgun.c
[src/mame/includes]lordgun.h
[src/mess/drivers]c65.c c65_old.c*
[src/mess/machine]c65_old.c*

trunk/makefile
r243236r243237
756756ZLIB = $(OBJ)/libz.a
757757else
758758LIBS += -lz
759BASELIBS += -lz
759760ZLIB =
760761endif
761762
r243236r243237
766767# $(OBJ)/libflac++.a
767768else
768769LIBS += -lFLAC
770BASELIBS += -lFLAC
769771FLAC_LIB =
770772endif
771773
trunk/src/emu/bus/nes_ctrl/ctrl.c
r243236r243237
168168   SLOT_INTERFACE("joypad", NES_JOYPAD)
169169   SLOT_INTERFACE("zapper", NES_ZAPPER)
170170   SLOT_INTERFACE("4score_p1p3", NES_4SCORE_P1P3)
171//  SLOT_INTERFACE("miracle_piano", NES_MIRACLE)
171   SLOT_INTERFACE("miracle_piano", NES_MIRACLE)
172172SLOT_INTERFACE_END
173173
174174SLOT_INTERFACE_START( nes_control_port2_devices )
trunk/src/emu/bus/nes_ctrl/miracle.c
r243236r243237
2424
2525MACHINE_CONFIG_FRAGMENT( nes_miracle )
2626   MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
27   MCFG_MIDI_RX_HANDLER(WRITELINE(nes_miracle_device, rx_w))
28
2729   MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
2830MACHINE_CONFIG_END
2931
r243236r243237
99101   set_tra_rate(31250);
100102
101103   m_xmit_read = m_xmit_write = 0;
104   m_recv_read = m_recv_write = 0;
105   m_read_status = m_status_bit = false;
102106   m_tx_busy = false;
103107}
104108
r243236r243237
107111//  read
108112//-------------------------------------------------
109113
110// TODO: here, reads from serial midi in bit0, when in MIDI_SEND mode
111
112114UINT8 nes_miracle_device::read_bit0()
113115{
114116   UINT8 ret = 0;
115117
116118   if (m_midi_mode == MIRACLE_MIDI_RECEIVE)
117119   {
118      //NES reads from Miracle Piano!
119      // ret |= ...
120      if (m_status_bit)
121      {
122         m_status_bit = false;
123         ret = (m_read_status) ? 1 : 0;
124      }
125      else
126      {
127         ret = (m_data_sent & 0x80) ? 0 : 1;
128         m_data_sent <<= 1;
129      }
120130   }
121131
122132   return ret;
r243236r243237
126136//  write
127137//-------------------------------------------------
128138
129// TODO: here, writes to serial midi in bit0, when in MIDI_RECEIVE mode
130139// c4fc = start of recv routine
131140// c53a = start of send routine
132141
r243236r243237
175184            strobe_timer->reset();
176185            m_strobe_on = 0;
177186            m_strobe_clock = 0;
187
188            m_status_bit = true;
189            if (m_recv_read != m_recv_write)
190            {
191//               printf("Getting %02x from Miracle[%d]\n", m_recvring[m_recv_read], m_recv_read);
192               m_data_sent = m_recvring[m_recv_read++];
193               if (m_recv_read >= RECV_RING_SIZE)
194               {
195                  m_recv_read = 0;
196               }
197               m_read_status = true;
198            }
199            else
200            {
201               m_read_status = false;
202//               printf("Miracle has no data\n");
203            }
178204            return;
179205         }
180206         else if (m_strobe_clock >= 66)
r243236r243237
202228void nes_miracle_device::rcv_complete()    // Rx completed receiving byte
203229{
204230   receive_register_extract();
205//   UINT8 rcv = get_received_char();
231   UINT8 rcv = get_received_char();
232
233//   printf("Got %02x -> [%d]\n", rcv, m_recv_write);
234   m_recvring[m_recv_write++] = rcv;
235   if (m_recv_write >= RECV_RING_SIZE)
236   {
237      m_recv_write = 0;
238   }
206239}
207240
208241void nes_miracle_device::tra_complete()    // Tx completed sending byte
trunk/src/emu/bus/nes_ctrl/miracle.h
r243236r243237
2929{
3030public:
3131   static const int XMIT_RING_SIZE = 64;
32   static const int RECV_RING_SIZE = 64;
3233
3334   // construction/destruction
3435   nes_miracle_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
r243236r243237
5960   int m_strobe_on, m_midi_mode, m_sent_bits;
6061   UINT32 m_strobe_clock;
6162   UINT8 m_data_sent;
62   UINT8 m_xmitring[XMIT_RING_SIZE];
63   UINT8 m_xmitring[XMIT_RING_SIZE], m_recvring[RECV_RING_SIZE];
6364   int m_xmit_read, m_xmit_write;
64   bool m_tx_busy;
65   int m_recv_read, m_recv_write;
66   bool m_tx_busy, m_read_status, m_status_bit;
6567};
6668
6769// device type definition
trunk/src/emu/cpu/tms0980/tms0980d.c
r243236r243237
1/*******************************************************************
1// license:BSD-3-Clause
2// copyright-holders:Wilbert Pol, hap
3/*
24
3  TMS0980 disassembly
5  TMS0980/TMS1000-family disassembler
46
5*******************************************************************/
7*/
68
79#include "emu.h"
810#include "debugger.h"
911#include "tms0980.h"
1012
1113
12#define _OVER DASMFLAG_STEP_OVER
13#define _OUT  DASMFLAG_STEP_OUT
14
15
1614enum e_mnemonics {
1715   zA10AAC=0, zA6AAC, zA8AAC, zAC1AC, zACACC, zACNAA, zALEC, zALEM, zAMAAC, zBRANCH, zCALL, zCCLA,
1816   zCLA, zCLO, zCOMC, zCOMX, zCOMX8, zCPAIZ, zCTMDYN, zDAN, zDMAN, zDMEA, zDNAA,
r243236r243237
2422   zILL
2523};
2624
27
28enum e_addressing {
29   zB0=0, zI2, zI3, zI4, zB7
30};
31
32
3325static const char *const s_mnemonic[] = {
34   "a10aac", "a6aac", "a8aac", "ac1ac", "acacc", "acnaa", "alec", "alem", "amaac", "branch", "call", "ccla",
35   "cla", "clo", "comc", "comx", "comx8", "cpaiz", "ctmdyn", "dan", "dman", "dmea", "dnaa",
36   "dyn", "ia", "imac", "iyc", "knez", "ldp", "ldx", "ldx", "ldx", "mnea", "mnez",
37   "ndmea", "off", "rbit", "reac", "retn", "rstr", "sal", "saman", "sbit",
38   "sbl", "seac", "setr", "tam", "tamacs", "tamdyn", "tamiy", "tamiyc", "tamza",
39   "tay", "tbit", "tcmiy", "tcy", "tdo", "tka", "tkm", "tma",
40   "tmy", "tya", "xda", "xma", "ymcy", "ynea", "ynec",
41   "illegal"
26   "A10AAC", "A6AAC", "A8AAC", "AC1AC", "ACACC", "ACNAA", "ALEC", "ALEM", "AMAAC", "BRANCH", "CALL", "CCLA",
27   "CLA", "CLO", "COMC", "COMX", "COMX8", "CPAIZ", "CTMDYN", "DAN", "DMAN", "DMEA", "DNAA",
28   "DYN", "IA", "IMAC", "IYC", "KNEZ", "LDP", "LDX", "LDX", "LDX", "MNEA", "MNEZ",
29   "NDMEA", "OFF", "RBIT", "REAC", "RETN", "RSTR", "SAL", "SAMAN", "SBIT",
30   "SBL", "SEAC", "SETR", "TAM", "TAMACS", "TAMDYN", "TAMIY", "TAMIYC", "TAMZA",
31   "TAY", "TBIT", "TCMIY", "TCY", "TDO", "TKA", "TKM", "TMA",
32   "TMY", "TYA", "XDA", "XMA", "YMCY", "YNEA", "YNEC",
33   "?"
4234};
4335
4436
37#define _OVER DASMFLAG_STEP_OVER
38#define _OUT  DASMFLAG_STEP_OUT
39
4540static const UINT32 s_flags[] = {
4641   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _OVER, 0,
4742   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
r243236r243237
5449};
5550
5651
52enum e_addressing {
53   zB0=0, zI2, zI3, zI4, zB7
54};
55
5756static const UINT8 s_addressing[] = {
5857   zB0, zB0, zB0, zI4, zI4, zI4, zI4, zB0, zB0, zB7, zB7, zB0,
5958   zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0,
trunk/src/mame/drivers/limenko.c
r243236r243237
3434public:
3535   limenko_state(const machine_config &mconfig, device_type type, const char *tag)
3636      : driver_device(mconfig, type, tag),
37      m_maincpu(*this, "maincpu"),
38      m_oki(*this, "oki"),
39      m_qs1000(*this, "qs1000"),
40      m_gfxdecode(*this, "gfxdecode"),
41      m_palette(*this, "palette"),
3742      m_mainram(*this, "mainram"),
3843      m_fg_videoram(*this, "fg_videoram"),
3944      m_md_videoram(*this, "md_videoram"),
4045      m_bg_videoram(*this, "bg_videoram"),
4146      m_spriteram(*this, "spriteram"),
4247      m_spriteram2(*this, "spriteram2"),
43      m_videoreg(*this, "videoreg"),
44      m_maincpu(*this, "maincpu"),
45      m_oki(*this, "oki"),
46      m_gfxdecode(*this, "gfxdecode"),
47      m_palette(*this, "palette")   { }
48      m_videoreg(*this, "videoreg") { }
4849
50   required_device<cpu_device> m_maincpu;
51   optional_device<okim6295_device> m_oki;
52   optional_device<qs1000_device> m_qs1000;
53   required_device<gfxdecode_device> m_gfxdecode;
54   required_device<palette_device> m_palette;
55   
4956   required_shared_ptr<UINT32> m_mainram;
5057   required_shared_ptr<UINT32> m_fg_videoram;
5158   required_shared_ptr<UINT32> m_md_videoram;
r243236r243237
5360   required_shared_ptr<UINT32> m_spriteram;
5461   required_shared_ptr<UINT32> m_spriteram2;
5562   required_shared_ptr<UINT32> m_videoreg;
63   
5664   tilemap_t *m_bg_tilemap;
5765   tilemap_t *m_md_tilemap;
5866   tilemap_t *m_fg_tilemap;
67   
5968   int m_spriteram_bit;
6069   bitmap_ind16 m_sprites_bitmap;
6170   bitmap_ind8 m_sprites_bitmap_pri;
6271   int m_prev_sprites_count;
6372   UINT8 m_spotty_sound_cmd;
73   
6474   DECLARE_WRITE32_MEMBER(limenko_coincounter_w);
6575   DECLARE_WRITE32_MEMBER(bg_videoram_w);
6676   DECLARE_WRITE32_MEMBER(md_videoram_w);
r243236r243237
7585   DECLARE_READ32_MEMBER(legendoh_speedup_r);
7686   DECLARE_READ32_MEMBER(sb2003_speedup_r);
7787   DECLARE_READ32_MEMBER(spotty_speedup_r);
78   DECLARE_CUSTOM_INPUT_MEMBER(spriteram_bit_r);
79
8088   DECLARE_READ8_MEMBER(qs1000_p1_r);
8189   DECLARE_WRITE8_MEMBER(qs1000_p1_w);
8290   DECLARE_WRITE8_MEMBER(qs1000_p2_w);
8391   DECLARE_WRITE8_MEMBER(qs1000_p3_w);
92   
93   DECLARE_CUSTOM_INPUT_MEMBER(spriteram_bit_r);
94
8495   DECLARE_DRIVER_INIT(common);
8596   DECLARE_DRIVER_INIT(sb2003);
8697   DECLARE_DRIVER_INIT(dynabomb);
8798   DECLARE_DRIVER_INIT(legendoh);
8899   DECLARE_DRIVER_INIT(spotty);
100   
89101   TILE_GET_INFO_MEMBER(get_bg_tile_info);
90102   TILE_GET_INFO_MEMBER(get_md_tile_info);
91103   TILE_GET_INFO_MEMBER(get_fg_tile_info);
104   
92105   virtual void video_start();
93106   UINT32 screen_update_limenko(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
94107   void draw_single_sprite(bitmap_ind16 &dest_bmp,const rectangle &clip,gfx_element *gfx,UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy,int priority);
95108   void draw_sprites(UINT32 *sprites, const rectangle &cliprect, int count);
96109   void copy_sprites(bitmap_ind16 &bitmap, bitmap_ind16 &sprites_bitmap, bitmap_ind8 &priority_bitmap, const rectangle &cliprect);
97   required_device<cpu_device> m_maincpu;
98   optional_device<okim6295_device> m_oki;
99   required_device<gfxdecode_device> m_gfxdecode;
100   required_device<palette_device> m_palette;
101110};
102111
103112/*****************************************************************************************************
r243236r243237
165174
166175WRITE32_MEMBER(limenko_state::limenko_soundlatch_w)
167176{
168   qs1000_device *qs1000 = machine().device<qs1000_device>("qs1000");
169
170177   soundlatch_byte_w(space, 0, data >> 16);
171   qs1000->set_irq(ASSERT_LINE);
178   m_qs1000->set_irq(ASSERT_LINE);
172179
173180   machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(100));
174181}
r243236r243237
198205   // ...x .... - ?
199206   // ..x. .... - /IRQ clear
200207
201   qs1000_device *qs1000 = machine().device<qs1000_device>("qs1000");
202
203208   membank("qs1000:bank")->set_entry(data & 0x07);
204209
205210   if (!BIT(data, 5))
206      qs1000->set_irq(CLEAR_LINE);
211      m_qs1000->set_irq(CLEAR_LINE);
207212}
208213
209214/*****************************************************************************************************
r243236r243237
500505
501506   m_sprites_bitmap.allocate(384,240);
502507   m_sprites_bitmap_pri.allocate(384,240);
508   
509   save_item(NAME(m_spriteram_bit));
510   save_item(NAME(m_prev_sprites_count));
503511}
504512
505513UINT32 limenko_state::screen_update_limenko(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
r243236r243237
11381146   m_maincpu->space(AS_PROGRAM).install_read_handler(0x6626c, 0x6626f, read32_delegate(FUNC(limenko_state::spotty_speedup_r), this));
11391147
11401148   m_spriteram_bit = 1;
1149   
1150   save_item(NAME(m_spotty_sound_cmd));
11411151}
11421152
1143GAME( 2000, dynabomb, 0,      limenko, sb2003, limenko_state,   dynabomb, ROT0, "Limenko", "Dynamite Bomber (Korea, Rev 1.5)",   GAME_IMPERFECT_SOUND )
1144GAME( 2000, legendoh, 0,      limenko, legendoh, limenko_state, legendoh, ROT0, "Limenko", "Legend of Heroes",                   GAME_IMPERFECT_SOUND )
1145GAME( 2003, sb2003,   0,      limenko, sb2003, limenko_state,   sb2003,   ROT0, "Limenko", "Super Bubble 2003 (World, Ver 1.0)", GAME_IMPERFECT_SOUND )
1146GAME( 2003, sb2003a,  sb2003, limenko, sb2003, limenko_state,   sb2003,   ROT0, "Limenko", "Super Bubble 2003 (Asia, Ver 1.0)",  GAME_IMPERFECT_SOUND )
1153GAME( 2000, dynabomb, 0,      limenko, sb2003, limenko_state,   dynabomb, ROT0, "Limenko", "Dynamite Bomber (Korea, Rev 1.5)",   GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
1154GAME( 2000, legendoh, 0,      limenko, legendoh, limenko_state, legendoh, ROT0, "Limenko", "Legend of Heroes",                   GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
1155GAME( 2003, sb2003,   0,      limenko, sb2003, limenko_state,   sb2003,   ROT0, "Limenko", "Super Bubble 2003 (World, Ver 1.0)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
1156GAME( 2003, sb2003a,  sb2003, limenko, sb2003, limenko_state,   sb2003,   ROT0, "Limenko", "Super Bubble 2003 (Asia, Ver 1.0)",  GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
11471157
1148// this game only use the same graphics chip used in limenko's system
1149GAME( 2001, spotty,   0,      spotty,  spotty, limenko_state,   spotty,   ROT0, "Prince Co.", "Spotty (Ver. 2.0.2)",             GAME_NO_SOUND )
1158// this game only uses the same graphics chip used in Limenko's system
1159GAME( 2001, spotty,   0,      spotty,  spotty, limenko_state,   spotty,   ROT0, "Prince Co.", "Spotty (Ver. 2.0.2)",             GAME_NO_SOUND | GAME_SUPPORTS_SAVE )
trunk/src/mame/drivers/lordgun.c
r243236r243237
4747#include "sound/ymf278b.h"
4848#include "includes/lordgun.h"
4949
50
5051/***************************************************************************
5152
5253    Memory Maps - Main
r243236r243237
5960   {
6061      case 0x00/2: // increment counter
6162      {
62         m_lordgun_protection_data++;
63         m_lordgun_protection_data &= 0x1f;
63         m_protection_data++;
64         m_protection_data &= 0x1f;
6465
6566         return;
6667      }
6768
6869      case 0xc0/2: // reset protection device
6970      {
70         m_lordgun_protection_data = 0;
71         m_protection_data = 0;
7172
7273         return;
7374      }
r243236r243237
8081   {
8182      case 0x40/2: // bitswap and xor counter
8283      {
83         UINT8 x = m_lordgun_protection_data;
84         UINT8 x = m_protection_data;
8485
85         m_lordgun_protection_data  = ((( x >> 0) | ( x >> 1)) & 1) << 4;
86         m_lordgun_protection_data |=  ((~x >> 2) & 1) << 3;
87         m_lordgun_protection_data |= (((~x >> 4) | ( x >> 0)) & 1) << 2;
88         m_lordgun_protection_data |=  (( x >> 3) & 1) << 1;
89         m_lordgun_protection_data |= (((~x >> 0) | ( x >> 2)) & 1) << 0;
86         m_protection_data  = ((( x >> 0) | ( x >> 1)) & 1) << 4;
87         m_protection_data |=  ((~x >> 2) & 1) << 3;
88         m_protection_data |= (((~x >> 4) | ( x >> 0)) & 1) << 2;
89         m_protection_data |=  (( x >> 3) & 1) << 1;
90         m_protection_data |= (((~x >> 0) | ( x >> 2)) & 1) << 0;
9091
9192         return 0;
9293      }
9394
9495      case 0x80/2: // return value if conditions are met
9596      {
96         if ((m_lordgun_protection_data & 0x11) == 0x01) return 0x10;
97         if ((m_lordgun_protection_data & 0x06) == 0x02) return 0x10;
98         if ((m_lordgun_protection_data & 0x09) == 0x08) return 0x10;
97         if ((m_protection_data & 0x11) == 0x01) return 0x10;
98         if ((m_protection_data & 0x06) == 0x02) return 0x10;
99         if ((m_protection_data & 0x09) == 0x08) return 0x10;
99100
100101         return 0;
101102      }
r243236r243237
110111   {
111112      case 0xc0/2: // reset protection device
112113      {
113         m_lordgun_protection_data = 0;
114         m_protection_data = 0;
114115
115116         return;
116117      }
r243236r243237
123124   {
124125      case 0x00/2: // de-increment counter
125126      {
126         m_lordgun_protection_data--;
127         m_lordgun_protection_data &= 0x1f;
127         m_protection_data--;
128         m_protection_data &= 0x1f;
128129
129130         return 0;
130131      }
131132
132133      case 0x40/2: // bitswap and xor counter
133134      {
134         UINT8 x = m_lordgun_protection_data;
135         UINT8 x = m_protection_data;
135136
136         m_lordgun_protection_data  = (((x >> 3) ^ (x >> 2)) & 1) << 4;
137         m_lordgun_protection_data |= (((x >> 2) ^ (x >> 1)) & 1) << 3;
138         m_lordgun_protection_data |= (((x >> 1) ^ (x >> 0)) & 1) << 2;
139         m_lordgun_protection_data |= (((x >> 4) ^ (x >> 0)) & 1) << 1;
140         m_lordgun_protection_data |= (((x >> 4) ^ (x >> 3)) & 1) << 0;
137         m_protection_data  = (((x >> 3) ^ (x >> 2)) & 1) << 4;
138         m_protection_data |= (((x >> 2) ^ (x >> 1)) & 1) << 3;
139         m_protection_data |= (((x >> 1) ^ (x >> 0)) & 1) << 2;
140         m_protection_data |= (((x >> 4) ^ (x >> 0)) & 1) << 1;
141         m_protection_data |= (((x >> 4) ^ (x >> 3)) & 1) << 0;
141142
142143         return 0;
143144      }
144145
145146      case 0x80/2: // return value if conditions are met
146147      {
147         if ((m_lordgun_protection_data & 0x11) == 0x00) return 0x20;
148         if ((m_lordgun_protection_data & 0x06) != 0x06) return 0x20;
149         if ((m_lordgun_protection_data & 0x18) == 0x00) return 0x20;
148         if ((m_protection_data & 0x11) == 0x00) return 0x20;
149         if ((m_protection_data & 0x06) != 0x06) return 0x20;
150         if ((m_protection_data & 0x18) == 0x00) return 0x20;
150151
151152         return 0;
152153      }
r243236r243237
622623
623624***************************************************************************/
624625
626void lordgun_state::machine_start()
627{
628   save_item(NAME(m_protection_data));
629   save_item(NAME(m_priority));
630   save_item(NAME(m_whitescreen));
631}
632
625633static MACHINE_CONFIG_START( lordgun, lordgun_state )
626634   MCFG_CPU_ADD("maincpu", M68000, XTAL_20MHz / 2)
627635   MCFG_CPU_PROGRAM_MAP(lordgun_map)
r243236r243237
10271035
10281036***************************************************************************/
10291037
1030DRIVER_INIT_MEMBER(lordgun_state,lordgun)
1038DRIVER_INIT_MEMBER(lordgun_state, lordgun)
10311039{
1032   int i;
10331040   UINT16 *rom = (UINT16 *)memregion("maincpu")->base();
10341041   int rom_size = 0x100000;
10351042
1036   for(i = 0; i < rom_size/2; i++)
1043   for(int i = 0; i < rom_size/2; i++)
10371044   {
10381045      UINT16 x = rom[i];
10391046
r243236r243237
10421049
10431050      rom[i] = x;
10441051   }
1052   
1053   save_item(NAME(m_old));
1054   
1055   for (int i = 0; i < 2; i++)
1056   {
1057      save_item(NAME(m_gun[i].scr_x), i);
1058      save_item(NAME(m_gun[i].scr_y), i);
1059      save_item(NAME(m_gun[i].hw_x), i);
1060      save_item(NAME(m_gun[i].hw_y), i);
1061   }
10451062}
10461063
1064DRIVER_INIT_MEMBER(lordgun_state, aliencha)
1065{
1066   save_item(NAME(m_aliencha_dip_sel));
1067}
1068
10471069/***************************************************************************
10481070
10491071    Game Drivers
10501072
10511073***************************************************************************/
10521074
1053GAME( 1994, lordgun,   0,        lordgun,  lordgun,  lordgun_state, lordgun,  ROT0, "IGS", "Lord of Gun (USA)",       GAME_IMPERFECT_GRAPHICS )
1054GAME( 1994, aliencha,  0,        aliencha, aliencha, driver_device, 0,        ROT0, "IGS", "Alien Challenge (World)", 0 )
1055GAME( 1994, alienchac, aliencha, aliencha, aliencha, driver_device, 0,        ROT0, "IGS", "Alien Challenge (China)", 0 )
1075GAME( 1994, lordgun,   0,        lordgun,  lordgun,  lordgun_state, lordgun,  ROT0, "IGS", "Lord of Gun (USA)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE )
1076GAME( 1994, aliencha,  0,        aliencha, aliencha, driver_device, 0,        ROT0, "IGS", "Alien Challenge (World)", GAME_SUPPORTS_SAVE )
1077GAME( 1994, alienchac, aliencha, aliencha, aliencha, driver_device, 0,        ROT0, "IGS", "Alien Challenge (China)", GAME_SUPPORTS_SAVE )
trunk/src/mame/includes/lordgun.h
r243236r243237
1717public:
1818   lordgun_state(const machine_config &mconfig, device_type type, const char *tag)
1919      : driver_device(mconfig, type, tag),
20         m_priority_ram(*this, "priority_ram"),
21         m_scrollram(*this, "scrollram"),
22         m_spriteram(*this, "spriteram"),
23         m_vram(*this, "vram"),
24         m_scroll_x(*this, "scroll_x"),
25         m_scroll_y(*this, "scroll_y") ,
2620      m_maincpu(*this, "maincpu"),
2721      m_soundcpu(*this, "soundcpu"),
2822      m_oki(*this, "oki"),
r243236r243237
3024      m_gfxdecode(*this, "gfxdecode"),
3125      m_screen(*this, "screen"),
3226      m_palette(*this, "palette"),
33      m_generic_paletteram_16(*this, "paletteram") { }
27      m_generic_paletteram_16(*this, "paletteram"),
28      m_priority_ram(*this, "priority_ram"),
29      m_scrollram(*this, "scrollram"),
30      m_spriteram(*this, "spriteram"),
31      m_vram(*this, "vram"),
32      m_scroll_x(*this, "scroll_x"),
33      m_scroll_y(*this, "scroll_y") { }
3434
35   required_device<cpu_device> m_maincpu;
36   required_device<cpu_device> m_soundcpu;
37   required_device<okim6295_device> m_oki;
38   required_device<eeprom_serial_93cxx_device> m_eeprom;
39   required_device<gfxdecode_device> m_gfxdecode;
40   required_device<screen_device> m_screen;
41   required_device<palette_device> m_palette;
42   
43   required_shared_ptr<UINT16> m_generic_paletteram_16;
3544   required_shared_ptr<UINT16> m_priority_ram;
3645   required_shared_ptr<UINT16> m_scrollram;
3746   required_shared_ptr<UINT16> m_spriteram;
47   required_shared_ptr_array<UINT16, 4> m_vram;
48   required_shared_ptr_array<UINT16, 4> m_scroll_x;
49   required_shared_ptr_array<UINT16, 4> m_scroll_y;
3850
3951   UINT8 m_old;
4052   UINT8 m_aliencha_dip_sel;
4153   UINT16 m_priority;
42   required_shared_ptr_array<UINT16, 4> m_vram;
43   required_shared_ptr_array<UINT16, 4> m_scroll_x;
44   required_shared_ptr_array<UINT16, 4> m_scroll_y;
4554   int m_whitescreen;
4655   lordgun_gun_data m_gun[2];
4756   tilemap_t *m_tilemap[4];
4857   bitmap_ind16 *m_bitmaps[5];
4958
50   UINT16 m_lordgun_protection_data;
59   UINT16 m_protection_data;
5160   DECLARE_WRITE16_MEMBER(lordgun_protection_w);
5261   DECLARE_READ16_MEMBER(lordgun_protection_r);
5362   DECLARE_WRITE16_MEMBER(aliencha_protection_w);
r243236r243237
7180   DECLARE_READ8_MEMBER(aliencha_dip_r);
7281   DECLARE_WRITE8_MEMBER(aliencha_dip_w);
7382   DECLARE_WRITE8_MEMBER(lordgun_okibank_w);
83
84   DECLARE_DRIVER_INIT(aliencha);
7485   DECLARE_DRIVER_INIT(lordgun);
86
7587   TILE_GET_INFO_MEMBER(get_tile_info_0);
7688   TILE_GET_INFO_MEMBER(get_tile_info_1);
7789   TILE_GET_INFO_MEMBER(get_tile_info_2);
7890   TILE_GET_INFO_MEMBER(get_tile_info_3);
91
92   virtual void machine_start();
7993   virtual void video_start();
94
8095   UINT32 screen_update_lordgun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
8196   inline void get_tile_info(tile_data &tileinfo, tilemap_memory_index tile_index, int _N_);
8297   inline void lordgun_vram_w(offs_t offset, UINT16 data, UINT16 mem_mask, int _N_);
8398   void lorddgun_calc_gun_scr(int i);
8499   void lordgun_update_gun(int i);
85100   void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
86   required_device<cpu_device> m_maincpu;
87   required_device<cpu_device> m_soundcpu;
88   required_device<okim6295_device> m_oki;
89   required_device<eeprom_serial_93cxx_device> m_eeprom;
90   required_device<gfxdecode_device> m_gfxdecode;
91   required_device<screen_device> m_screen;
92   required_device<palette_device> m_palette;
93   required_shared_ptr<UINT16> m_generic_paletteram_16;
94101};
95102
96103/*----------- defined in video/lordgun.c -----------*/
trunk/src/mess/drivers/c65.c
r243236r243237
125125         int ym = (y & 7);
126126         UINT8 tile = m_workram[xi+yi*80+0x800];
127127         UINT8 attr = m_cram[xi+yi*80];
128         if(attr & 0xf0)
129            attr = machine().rand() & 0xf;
130         
128131         int enable_dot = ((m_iplrom[(tile<<3)+ym+0xd000] >> xm) & 1);
129132                 
130133         //if(cliprect.contains(x, y))
131                 
132            bitmap.pix16(y, x) = m_palette->pen((enable_dot) ? attr & 0xf : border_color);
134         bitmap.pix16(y, x) = m_palette->pen((enable_dot) ? attr & 0xf : border_color);
133135
134136         
135137         //gfx->opaque(bitmap,cliprect,tile,0,0,0,x*8,y*8);
r243236r243237
247249   dst|=(space.read_byte(address++)<<8);
248250   dst|=(space.read_byte(address++)<<16);
249251
252   if(cmd & 0xfc)
253      printf("%02x\n",cmd & 0xfc);
250254   switch(cmd & 3)
251255   {
252256      case 0: // copy - TODO: untested
trunk/src/mess/drivers/c65_old.c
r0r243237
1/***************************************************************************
2
3    commodore c65 home computer
4    PeT mess@utanet.at
5
6    documention
7     www.funet.fi
8
9***************************************************************************/
10
11/*
12
132008 - Driver Updates
14---------------------
15
16(most of the informations are taken from http://www.zimmers.net/cbmpics/ )
17
18
19[CBM systems which belong to this driver]
20
21* Commodore 65 (1989)
22
23Also known as C64 DX at early stages of the project. It was cancelled
24around 1990-1991. Only few units survive (they were sold after Commodore
25liquidation in 1994).
26
27CPU: CSG 4510 (3.54 MHz)
28RAM: 128 kilobytes, expandable to 8 megabytes
29ROM: 128 kilobytes
30Video: CSG 4569 "VIC-III" (6 Video modes; Resolutions from 320x200 to
31    1280x400; 80 columns text; Palette of 4096 colors)
32Sound: CSG 8580 "SID" x2 (6 voice stereo synthesizer/digital sound
33    capabilities)
34Ports: CSG 4510 (2 Joystick/Mouse ports; CBM Serial port; CBM 'USER'
35    port; CBM Monitor port; Power and reset switches; C65 bus drive
36    port; RGBI video port; 2 RCA audio ports; RAM expansion port; C65
37    expansion port)
38Keyboard: Full-sized 77 key QWERTY (12 programmable function keys;
39    4 direction cursor-pad)
40Additional Hardware: Built in 3.5" DD disk drive (1581 compatible)
41Miscellaneous: Partially implemented Commodore 64 emulation
42
43[Notes]
44
45The datasette port was removed here. C65 supports an additional "dumb"
46drive externally. It also features, in addition to the standard CBM
47bus serial (available in all modes), a Fast and a Burst serial bus
48(both available in C65 mode only)
49
50*/
51
52
53#include "emu.h"
54#include "cpu/m6502/m4510.h"
55#include "machine/mos6526.h"
56#include "machine/cbm_snqk.h"
57#include "includes/c65.h"
58#include "bus/cbmiec/cbmiec.h"
59#include "machine/ram.h"
60
61static void cbm_c65_quick_sethiaddress( address_space &space, UINT16 hiaddress )
62{
63   space.write_byte(0x82, hiaddress & 0xff);
64   space.write_byte(0x83, hiaddress >> 8);
65}
66
67QUICKLOAD_LOAD_MEMBER( c65_state, cbm_c65 )
68{
69   return general_cbm_loadsnap(image, file_type, quickload_size, m_maincpu->space(AS_PROGRAM), 0, cbm_c65_quick_sethiaddress);
70}
71
72/*************************************
73 *
74 *  Main CPU memory handlers
75 *
76 *************************************/
77
78static ADDRESS_MAP_START( c65_mem , AS_PROGRAM, 8, c65_state )
79   AM_RANGE(0x00000, 0x07fff) AM_RAMBANK("bank11")
80   AM_RANGE(0x08000, 0x09fff) AM_READ_BANK("bank1") AM_WRITE_BANK("bank12")
81   AM_RANGE(0x0a000, 0x0bfff) AM_READ_BANK("bank2") AM_WRITE_BANK("bank13")
82   AM_RANGE(0x0c000, 0x0cfff) AM_READ_BANK("bank3") AM_WRITE_BANK("bank14")
83   AM_RANGE(0x0d000, 0x0d7ff) AM_READ_BANK("bank4") AM_WRITE_BANK("bank5")
84   AM_RANGE(0x0d800, 0x0dbff) AM_READ_BANK("bank6") AM_WRITE_BANK("bank7")
85   AM_RANGE(0x0dc00, 0x0dfff) AM_READ_BANK("bank8") AM_WRITE_BANK("bank9")
86   AM_RANGE(0x0e000, 0x0ffff) AM_READ_BANK("bank10") AM_WRITE_BANK("bank15")
87   AM_RANGE(0x10000, 0x1f7ff) AM_RAM
88   AM_RANGE(0x1f800, 0x1ffff) AM_RAM AM_SHARE("colorram")
89
90   AM_RANGE(0x20000, 0x23fff) AM_ROM /* &c65_dos,     maps to 0x8000    */
91   AM_RANGE(0x24000, 0x28fff) AM_ROM /* reserved */
92   AM_RANGE(0x29000, 0x29fff) AM_ROM AM_SHARE("c65_chargen")
93   AM_RANGE(0x2a000, 0x2bfff) AM_ROM AM_SHARE("basic")
94   AM_RANGE(0x2c000, 0x2cfff) AM_ROM AM_SHARE("interface")
95   AM_RANGE(0x2d000, 0x2dfff) AM_ROM AM_SHARE("chargen")
96   AM_RANGE(0x2e000, 0x2ffff) AM_ROM AM_SHARE("kernal")
97
98   AM_RANGE(0x30000, 0x31fff) AM_ROM /*&c65_monitor,     monitor maps to 0x6000    */
99   AM_RANGE(0x32000, 0x37fff) AM_ROM /*&c65_basic, */
100   AM_RANGE(0x38000, 0x3bfff) AM_ROM /*&c65_graphics, */
101   AM_RANGE(0x3c000, 0x3dfff) AM_ROM /* reserved */
102   AM_RANGE(0x3e000, 0x3ffff) AM_ROM /* &c65_kernal, */
103
104   AM_RANGE(0x40000, 0x7ffff) AM_NOP
105   /* 8 megabyte full address space! */
106ADDRESS_MAP_END
107
108
109/*************************************
110 *
111 *  Input Ports
112 *
113 *************************************/
114
115static INPUT_PORTS_START( c65 )
116   PORT_START( "ROW0" )
117   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Crsr Down Up") PORT_CODE(KEYCODE_RALT)        PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CHAR(UCHAR_MAMEKEY(UP))
118   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3)                                    PORT_CHAR(UCHAR_MAMEKEY(F5))
119   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2)                                    PORT_CHAR(UCHAR_MAMEKEY(F3))
120   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1)                                    PORT_CHAR(UCHAR_MAMEKEY(F1))
121   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4)                                    PORT_CHAR(UCHAR_MAMEKEY(F7))
122   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Crsr Right Left") PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
123   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER)             PORT_CHAR(13)
124   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("INST DEL") PORT_CODE(KEYCODE_BACKSPACE)       PORT_CHAR(8) PORT_CHAR(UCHAR_MAMEKEY(INSERT))
125
126   PORT_START( "ROW1" )
127   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Shift (Left)") PORT_CODE(KEYCODE_LSHIFT)      PORT_CHAR(UCHAR_SHIFT_1)
128   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E)         PORT_CHAR('E')
129   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S)         PORT_CHAR('S')
130   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z)         PORT_CHAR('Z')
131   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4)         PORT_CHAR('4') PORT_CHAR('$')
132   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A)         PORT_CHAR('A')
133   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W)         PORT_CHAR('W')
134   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3)         PORT_CHAR('3') PORT_CHAR('#')
135
136   PORT_START( "ROW2" )
137   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X)         PORT_CHAR('X')
138   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T)         PORT_CHAR('T')
139   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F)         PORT_CHAR('F')
140   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C)         PORT_CHAR('C')
141   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6)         PORT_CHAR('6') PORT_CHAR('&')
142   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D)         PORT_CHAR('D')
143   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R)         PORT_CHAR('R')
144   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5)         PORT_CHAR('5') PORT_CHAR('%')
145
146   PORT_START( "ROW3" )
147   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V)         PORT_CHAR('V')
148   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U)         PORT_CHAR('U')
149   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H)         PORT_CHAR('H')
150   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B)         PORT_CHAR('B')
151   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8)         PORT_CHAR('8') PORT_CHAR('(')
152   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G)         PORT_CHAR('G')
153   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y)         PORT_CHAR('Y')
154   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7)         PORT_CHAR('7') PORT_CHAR('\'')
155
156   PORT_START( "ROW4" )
157   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N)         PORT_CHAR('N')
158   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O)         PORT_CHAR('O')
159   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K)         PORT_CHAR('K')
160   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M)         PORT_CHAR('M')
161   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0)         PORT_CHAR('0')
162   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J)         PORT_CHAR('J')
163   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I)         PORT_CHAR('I')
164   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9)         PORT_CHAR('9') PORT_CHAR(')')
165
166   PORT_START( "ROW5" )
167   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA)     PORT_CHAR(',') PORT_CHAR('<')
168   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@')
169   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON)     PORT_CHAR(':') PORT_CHAR('[')
170   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP)      PORT_CHAR('.') PORT_CHAR('>')
171   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS)    PORT_CHAR('-')
172   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L)         PORT_CHAR('L')
173   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P)         PORT_CHAR('P')
174   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS)     PORT_CHAR('+')
175
176   PORT_START( "ROW6" )
177   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH)                             PORT_CHAR('/') PORT_CHAR('?')
178   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x91  Pi") PORT_CODE(KEYCODE_DEL) PORT_CHAR(0x2191) PORT_CHAR(0x03C0)
179   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH)                         PORT_CHAR('=')
180   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Shift (Right)") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
181   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CLR HOME") PORT_CODE(KEYCODE_INSERT)      PORT_CHAR(UCHAR_MAMEKEY(HOME))
182   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE)                             PORT_CHAR(';') PORT_CHAR(']')
183   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE)                        PORT_CHAR('*')
184   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2)                        PORT_CHAR('\xA3')
185
186   PORT_START( "ROW7" )
187   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("RUN STOP") PORT_CODE(KEYCODE_HOME)
188   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q)                                 PORT_CHAR('Q')
189   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CBM") PORT_CODE(KEYCODE_LALT)
190   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE)                             PORT_CHAR(' ')
191   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2)                                 PORT_CHAR('2') PORT_CHAR('"')
192   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB)                               PORT_CHAR(UCHAR_SHIFT_2)
193   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x90") PORT_CODE(KEYCODE_TILDE)   PORT_CHAR(0x2190)
194   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1)                                 PORT_CHAR('1') PORT_CHAR('!')
195   PORT_START("FUNCT")
196   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("ESC") PORT_CODE(KEYCODE_F1)
197   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F13 F14") PORT_CODE(KEYCODE_F11)
198   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F11 F12") PORT_CODE(KEYCODE_F10)
199   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F9 F10") PORT_CODE(KEYCODE_F9)
200   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("HELP") PORT_CODE(KEYCODE_F12)
201   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("ALT") PORT_CODE(KEYCODE_F2)       /* non blocking */
202   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("TAB") PORT_CODE(KEYCODE_TAB)
203   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("NO SCRL") PORT_CODE(KEYCODE_F4)
204
205   PORT_START( "SPECIAL" )  /* special keys */
206   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Restore") PORT_CODE(KEYCODE_PRTSCR)
207   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Shift Lock (switch)") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
208   PORT_CONFNAME( 0x20, 0x00, "(C65) Caps Lock (switch)") PORT_CODE(KEYCODE_F3)
209   PORT_CONFSETTING(   0x00, DEF_STR( Off ) )
210   PORT_CONFSETTING(   0x20, DEF_STR( On ) )
211   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
212
213   PORT_START("CTRLSEL")   /* Controller selection */
214   PORT_CONFNAME( 0x07, 0x00, "Gameport A" )
215   PORT_CONFSETTING( 0x00, DEF_STR( Joystick ) )
216   PORT_CONFSETTING( 0x01, "Paddles 1 & 2" )
217   PORT_CONFSETTING( 0x02, "Mouse 1351" )
218   PORT_CONFSETTING( 0x03, "Mouse (Non Proportional) 1350" )
219   PORT_CONFSETTING( 0x04, "Lightpen" )
220//  PORT_CONFSETTING( 0x05, "Koala Pad" )
221   PORT_CONFSETTING( 0x06, "Lightgun" )
222   PORT_CONFSETTING( 0x07, "No Device Connected" )
223   PORT_CONFNAME( 0x70, 0x00, "Gameport B" )
224   PORT_CONFSETTING( 0x00, DEF_STR( Joystick ) )
225   PORT_CONFSETTING( 0x10, "Paddles 3 & 4" )
226//  PORT_CONFSETTING( 0x20, "Mouse 1351" )
227//  PORT_CONFSETTING( 0x30, "Mouse (Non Proportional) 1350" )
228   PORT_CONFSETTING( 0x70, "No Device Connected" )
229   PORT_CONFNAME( 0x80, 0x00, "Swap Gameport A and B") PORT_CODE(KEYCODE_F1) PORT_TOGGLE
230   PORT_CONFSETTING(   0x00, DEF_STR( No ) )
231   PORT_CONFSETTING(   0x80, DEF_STR( Yes ) )
232
233   PORT_START("JOY1_1B")
234   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x00)
235   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x00)
236   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x00)
237   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x00)
238   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x00)
239   PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNUSED )
240
241   PORT_START("JOY2_1B")
242   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) PORT_CODE(KEYCODE_HOME) PORT_CODE(JOYCODE_Y_UP_SWITCH) PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x00)
243   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) PORT_CODE(KEYCODE_END) PORT_CODE(JOYCODE_Y_DOWN_SWITCH) PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x00)
244   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) PORT_CODE(KEYCODE_DEL) PORT_CODE(JOYCODE_X_LEFT_SWITCH) PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x00)
245   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) PORT_CODE(KEYCODE_PGDN) PORT_CODE(JOYCODE_X_RIGHT_SWITCH) PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x00)
246   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_INSERT) PORT_CODE(JOYCODE_BUTTON1) PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x00)
247   PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNUSED )
248
249   /* Mouse Commodore 1350 was basically working as a Joystick */
250   PORT_START("JOY1_2B")
251   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Mouse 1350 Up") PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x03)
252   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Mouse 1350 Down") PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x03)
253   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Mouse 1350 Left") PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x03)
254   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Mouse 1350 Right") PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x03)
255   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("Mouse 1350 Button 1") PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x03)
256   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("Mouse 1350 Button 2") PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x03)
257   PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_UNUSED )
258
259   /* Still to verify how many mices you were able to plug into a c64 */
260   /* Only one, for now */
261   PORT_START("JOY2_2B")
262   PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
263/*  PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) PORT_CODE(KEYCODE_HOME) PORT_CODE(JOYCODE_Y_UP_SWITCH)
264    PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) PORT_CODE(KEYCODE_END) PORT_CODE(JOYCODE_Y_DOWN_SWITCH) PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x30)
265    PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) PORT_CODE(KEYCODE_DEL) PORT_CODE(JOYCODE_X_LEFT_SWITCH) PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x30)
266    PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) PORT_CODE(KEYCODE_PGDN) PORT_CODE(JOYCODE_X_RIGHT_SWITCH) PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x30)
267    PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_INSERT) PORT_CODE(JOYCODE_BUTTON1) PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x30)
268    PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_PGUP) PORT_CODE(JOYCODE_BUTTON2) PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x30)
269    PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_UNUSED )
270*/
271   PORT_START("PADDLE1")
272   PORT_BIT( 0xff, 128, IPT_PADDLE) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_MINMAX(0,255) PORT_CENTERDELTA(0) PORT_CODE_DEC(KEYCODE_LEFT) PORT_CODE_INC(KEYCODE_RIGHT) PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH) PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH) PORT_PLAYER(1) PORT_REVERSE PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x01)
273
274   PORT_START("PADDLE2")
275   PORT_BIT( 0xff, 128, IPT_PADDLE) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_MINMAX(0,255) PORT_CENTERDELTA(0) PORT_CODE_DEC(KEYCODE_DOWN) PORT_CODE_INC(KEYCODE_UP) PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH) PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH) PORT_PLAYER(2) PORT_REVERSE PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x01)
276
277   PORT_START("PADDLE3")
278   PORT_BIT( 0xff, 128, IPT_PADDLE) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_MINMAX(0,255) PORT_CENTERDELTA(0) PORT_CODE_DEC(KEYCODE_HOME) PORT_CODE_INC(KEYCODE_PGUP) PORT_PLAYER(3) PORT_REVERSE PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x10)
279
280   PORT_START("PADDLE4")
281   PORT_BIT( 0xff, 128, IPT_PADDLE) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_MINMAX(0,255) PORT_CENTERDELTA(0) PORT_CODE_DEC(KEYCODE_END) PORT_CODE_INC(KEYCODE_PGDN) PORT_PLAYER(4) PORT_REVERSE PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x10)
282
283   PORT_START("TRACKX")
284   PORT_BIT( 0x7e, 0x00, IPT_TRACKBALL_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_PLAYER(1) PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x02)
285
286   PORT_START("TRACKY")
287   PORT_BIT( 0x7e, 0x00, IPT_TRACKBALL_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_PLAYER(1) PORT_REVERSE PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x02)
288
289   PORT_START("LIGHTX")
290   PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X) PORT_NAME("Lightpen X Axis") PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_PLAYER(1) PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x04)
291
292   PORT_START("LIGHTY")
293   PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y) PORT_NAME("Lightpen Y Axis") PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_PLAYER(1) PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x04)
294
295   PORT_START("OTHER")
296   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Paddle 1 Button") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(JOYCODE_BUTTON1) PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x01)
297   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_NAME("Paddle 2 Button") PORT_CODE(KEYCODE_LALT) PORT_CODE(JOYCODE_BUTTON2) PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x01)
298   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_NAME("Paddle 3 Button") PORT_CODE(KEYCODE_INSERT) PORT_CODE(JOYCODE_BUTTON1) PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x10)
299   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON4) PORT_NAME("Paddle 4 Button") PORT_CODE(KEYCODE_DEL) PORT_CODE(JOYCODE_BUTTON2) PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x10)
300   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Lightpen Signal") PORT_CODE(KEYCODE_LCONTROL) PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x04)
301   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Mouse Button Left") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(JOYCODE_BUTTON1) PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x02)
302   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_NAME("Mouse Button Right") PORT_CODE(KEYCODE_LALT) PORT_CODE(JOYCODE_BUTTON2) PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x02)INPUT_PORTS_END
303
304
305static INPUT_PORTS_START( c65ger )
306   PORT_INCLUDE( c65 )
307
308   PORT_MODIFY( "ROW1" )
309   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Z  { Y }") PORT_CODE(KEYCODE_Z)                   PORT_CHAR('Z')
310   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("3  #  { 3  Paragraph }") PORT_CODE(KEYCODE_3)     PORT_CHAR('3') PORT_CHAR('#')
311
312   PORT_MODIFY( "ROW3" )
313   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Y  { Z }") PORT_CODE(KEYCODE_Y)                   PORT_CHAR('Y')
314   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("7 ' { 7  / }") PORT_CODE(KEYCODE_7)               PORT_CHAR('7') PORT_CHAR('\'')
315
316   PORT_MODIFY( "ROW4" )
317   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("0  { = }") PORT_CODE(KEYCODE_0)                   PORT_CHAR('0')
318
319   PORT_MODIFY( "ROW5" )
320   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(",  <  { ; }") PORT_CODE(KEYCODE_COMMA)            PORT_CHAR(',') PORT_CHAR('<')
321   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Paragraph  \xE2\x86\x91  { \xc3\xbc }") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(0x00A7) PORT_CHAR(0x2191)
322   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(":  [  { \xc3\xa4 }") PORT_CODE(KEYCODE_COLON)     PORT_CHAR(':') PORT_CHAR('[')
323   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(".  >  { : }") PORT_CODE(KEYCODE_STOP)             PORT_CHAR('.') PORT_CHAR('>')
324   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("-  { '  ` }") PORT_CODE(KEYCODE_EQUALS)           PORT_CHAR('-')
325   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("+  { \xc3\x9f ? }") PORT_CODE(KEYCODE_MINUS)      PORT_CHAR('+')
326
327   PORT_MODIFY( "ROW6" )
328   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("/  ?  { -  _ }") PORT_CODE(KEYCODE_SLASH)         PORT_CHAR('/') PORT_CHAR('?')
329   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Sum Pi  { ]  \\ }") PORT_CODE(KEYCODE_DEL)        PORT_CHAR(0x03A3) PORT_CHAR(0x03C0)
330   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("=  { #  ' }") PORT_CODE(KEYCODE_BACKSLASH)        PORT_CHAR('=')
331   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(";  ]  { \xc3\xb6 }") PORT_CODE(KEYCODE_QUOTE)     PORT_CHAR(';') PORT_CHAR(']')
332   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("*  `  { +  * }") PORT_CODE(KEYCODE_CLOSEBRACE)    PORT_CHAR('*') PORT_CHAR('`')
333   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\\  { [ \xE2\x86\x91 }") PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('\xa3')
334
335   PORT_MODIFY( "ROW7" )
336   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("_  { <  > }") PORT_CODE(KEYCODE_TILDE)            PORT_CHAR('_')
337
338   PORT_MODIFY("SPECIAL") /* special keys */
339   PORT_DIPNAME( 0x20, 0x00, "(C65) DIN ASC (switch)") PORT_CODE(KEYCODE_F3)
340   PORT_DIPSETTING(    0x00, "ASC" )
341   PORT_DIPSETTING(    0x20, "DIN" )
342INPUT_PORTS_END
343
344
345
346/*************************************
347 *
348 *  Sound definitions
349 *
350 *************************************/
351
352int c65_state::c64_paddle_read( device_t *device, address_space &space, int which )
353{
354   int pot1 = 0xff, pot2 = 0xff, pot3 = 0xff, pot4 = 0xff, temp;
355   UINT8 cia0porta = machine().device<mos6526_device>("cia_0")->pa_r(space, 0);
356   int controller1 = ioport("CTRLSEL")->read() & 0x07;
357   int controller2 = ioport("CTRLSEL")->read() & 0x70;
358   /* Notice that only a single input is defined for Mouse & Lightpen in both ports */
359   switch (controller1)
360   {
361      case 0x01:
362         if (which)
363            pot2 = ioport("PADDLE2")->read();
364         else
365            pot1 = ioport("PADDLE1")->read();
366         break;
367
368      case 0x02:
369         if (which)
370            pot2 = ioport("TRACKY")->read();
371         else
372            pot1 = ioport("TRACKX")->read();
373         break;
374
375      case 0x03:
376         if (which && (ioport("JOY1_2B")->read() & 0x20))  /* Joy1 Button 2 */
377            pot1 = 0x00;
378         break;
379
380      case 0x04:
381         if (which)
382            pot2 = ioport("LIGHTY")->read();
383         else
384            pot1 = ioport("LIGHTX")->read();
385         break;
386
387      case 0x06:
388         if (which && (ioport("OTHER")->read() & 0x04))    /* Lightpen Signal */
389            pot2 = 0x00;
390         break;
391
392      case 0x00:
393      case 0x07:
394         break;
395
396      default:
397         logerror("Invalid Controller Setting %d\n", controller1);
398         break;
399   }
400
401   switch (controller2)
402   {
403      case 0x10:
404         if (which)
405            pot4 = ioport("PADDLE4")->read();
406         else
407            pot3 = ioport("PADDLE3")->read();
408         break;
409
410      case 0x20:
411         if (which)
412            pot4 = ioport("TRACKY")->read();
413         else
414            pot3 = ioport("TRACKX")->read();
415         break;
416
417      case 0x30:
418         if (which && (ioport("JOY2_2B")->read() & 0x20))  /* Joy2 Button 2 */
419            pot4 = 0x00;
420         break;
421
422      case 0x40:
423         if (which)
424            pot4 = ioport("LIGHTY")->read();
425         else
426            pot3 = ioport("LIGHTX")->read();
427         break;
428
429      case 0x60:
430         if (which && (ioport("OTHER")->read() & 0x04))    /* Lightpen Signal */
431            pot4 = 0x00;
432         break;
433
434      case 0x00:
435      case 0x70:
436         break;
437
438      default:
439         logerror("Invalid Controller Setting %d\n", controller1);
440         break;
441   }
442
443   if (ioport("CTRLSEL")->read() & 0x80)     /* Swap */
444   {
445      temp = pot1; pot1 = pot3; pot3 = temp;
446      temp = pot2; pot2 = pot4; pot4 = temp;
447   }
448
449   switch (cia0porta & 0xc0)
450   {
451      case 0x40:
452         return which ? pot2 : pot1;
453
454      case 0x80:
455         return which ? pot4 : pot3;
456
457      case 0xc0:
458         return which ? pot2 : pot1;
459
460      default:
461         return 0;
462   }
463}
464
465READ8_MEMBER( c65_state::sid_potx_r )
466{
467   return c64_paddle_read(m_sid_r, space, 0);
468}
469
470READ8_MEMBER( c65_state::sid_poty_r )
471{
472   return c64_paddle_read(m_sid_r, space, 1);
473}
474
475
476/*************************************
477 *
478 *  VIC III interfaces
479 *
480 *************************************/
481
482UINT32 c65_state::screen_update_c65(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
483{
484   m_vic->video_update(bitmap, cliprect);
485   return 0;
486}
487
488READ8_MEMBER(c65_state::c65_lightpen_x_cb)
489{
490   return ioport("LIGHTX")->read() & ~0x01;
491}
492
493READ8_MEMBER(c65_state::c65_lightpen_y_cb)
494{
495   return ioport("LIGHTY")->read() & ~0x01;
496}
497
498READ8_MEMBER(c65_state::c65_lightpen_button_cb)
499{
500   return ioport("OTHER")->read() & 0x04;
501}
502
503READ8_MEMBER(c65_state::c65_c64_mem_r)
504{
505   return m_memory[offset];
506}
507
508INTERRUPT_GEN_MEMBER(c65_state::vic3_raster_irq)
509{
510   m_vic->raster_interrupt_gen();
511}
512
513/*************************************
514 *
515 *  Machine driver
516 *
517 *************************************/
518
519static MACHINE_CONFIG_START( c65, c65_state )
520   /* basic machine hardware */
521   MCFG_CPU_ADD("maincpu", M4510, 3500000)  /* or VIC6567_CLOCK, */
522   MCFG_CPU_PROGRAM_MAP(c65_mem)
523   MCFG_CPU_VBLANK_INT_DRIVER("screen", c65_state,  c65_frame_interrupt)
524   MCFG_CPU_PERIODIC_INT_DRIVER(c65_state, vic3_raster_irq,  VIC6567_HRETRACERATE)
525
526   MCFG_MACHINE_START_OVERRIDE(c65_state, c65 )
527
528   /* video hardware */
529   MCFG_SCREEN_ADD("screen", RASTER)
530   MCFG_SCREEN_REFRESH_RATE(VIC6567_VRETRACERATE)
531   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
532   MCFG_SCREEN_SIZE(525 * 2, 520 * 2)
533   MCFG_SCREEN_VISIBLE_AREA(VIC6567_STARTVISIBLECOLUMNS ,(VIC6567_STARTVISIBLECOLUMNS + VIC6567_VISIBLECOLUMNS - 1) * 2, VIC6567_STARTVISIBLELINES, VIC6567_STARTVISIBLELINES + VIC6567_VISIBLELINES - 1)
534   MCFG_SCREEN_UPDATE_DRIVER(c65_state, screen_update_c65)
535   MCFG_SCREEN_PALETTE("vic3:palette")
536
537   MCFG_DEVICE_ADD("vic3", VIC3, 0)
538   MCFG_VIC3_CPU("maincpu")
539   MCFG_VIC3_TYPE(VIC4567_NTSC)
540   MCFG_VIC3_LIGHTPEN_X_CB(READ8(c65_state, c65_lightpen_x_cb))
541   MCFG_VIC3_LIGHTPEN_Y_CB(READ8(c65_state, c65_lightpen_y_cb))
542   MCFG_VIC3_LIGHTPEN_BUTTON_CB(READ8(c65_state, c65_lightpen_button_cb))
543   MCFG_VIC3_DMA_READ_CB(READ8(c65_state, c65_dma_read))
544   MCFG_VIC3_DMA_READ_COLOR_CB(READ8(c65_state, c65_dma_read_color))
545   MCFG_VIC3_INTERRUPT_CB(WRITELINE(c65_state, c65_vic_interrupt))
546   MCFG_VIC3_PORT_CHANGED_CB(WRITE8(c65_state, c65_bankswitch_interface))
547   MCFG_VIC3_C64_MEM_R_CB(READ8(c65_state, c65_c64_mem_r))
548
549   /* sound hardware */
550   MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
551   MCFG_SOUND_ADD("sid_r", MOS8580, 985248)
552   MCFG_MOS6581_POTX_CALLBACK(READ8(c65_state, sid_potx_r))
553   MCFG_MOS6581_POTY_CALLBACK(READ8(c65_state, sid_poty_r))
554   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
555   MCFG_SOUND_ADD("sid_l", MOS8580, 985248)
556   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
557
558   /* quickload */
559   MCFG_QUICKLOAD_ADD("quickload", c65_state, cbm_c65, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS)
560
561   /* cia */
562   MCFG_DEVICE_ADD("cia_0", MOS6526, 3500000)
563   MCFG_MOS6526_TOD(60)
564   MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(c65_state, c65_cia0_interrupt))
565   MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(c65_state, c65_cia0_port_a_r))
566   MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(c65_state, c65_cia0_port_b_r))
567   MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(c65_state, c65_cia0_port_b_w))
568
569   MCFG_DEVICE_ADD("cia_1", MOS6526, 3500000)
570   MCFG_MOS6526_TOD(60)
571   MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(c65_state, c65_cia1_interrupt))
572   MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(c65_state, c65_cia1_port_a_r))
573   MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(c65_state, c65_cia1_port_a_w))
574
575   /* floppy from serial bus */
576   MCFG_CBM_IEC_ADD(NULL)
577
578   /* internal ram */
579   MCFG_RAM_ADD(RAM_TAG)
580   MCFG_RAM_DEFAULT_SIZE("128K")
581   MCFG_RAM_EXTRA_OPTIONS("640K,4224K")
582MACHINE_CONFIG_END
583
584static MACHINE_CONFIG_DERIVED( c65pal, c65 )
585   MCFG_SCREEN_MODIFY("screen")
586   MCFG_SCREEN_REFRESH_RATE(VIC6569_VRETRACERATE)
587   MCFG_SCREEN_SIZE(625 * 2, 520 * 2)
588   MCFG_SCREEN_VISIBLE_AREA(VIC6569_STARTVISIBLECOLUMNS, (VIC6569_STARTVISIBLECOLUMNS + VIC6569_VISIBLECOLUMNS - 1) * 2, VIC6569_STARTVISIBLELINES, VIC6569_STARTVISIBLELINES + VIC6569_VISIBLELINES - 1)
589   MCFG_SCREEN_PALETTE("vic3:palette")
590
591   MCFG_DEVICE_MODIFY("vic3")
592   MCFG_VIC3_TYPE(VIC4567_PAL)
593
594   /* sound hardware */
595   MCFG_SOUND_REPLACE("sid_r", MOS8580, 1022727)
596   MCFG_MOS6581_POTX_CALLBACK(READ8(c65_state, sid_potx_r))
597   MCFG_MOS6581_POTY_CALLBACK(READ8(c65_state, sid_poty_r))
598   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
599   MCFG_SOUND_REPLACE("sid_l", MOS8580, 1022727)
600   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
601
602   /* cia */
603   MCFG_DEVICE_MODIFY("cia_0")
604   MCFG_MOS6526_TOD(50)
605
606   MCFG_DEVICE_MODIFY("cia_1")
607   MCFG_MOS6526_TOD(50)
608MACHINE_CONFIG_END
609
610
611/*************************************
612 *
613 *  ROM definition(s)
614 *
615 *************************************/
616
617
618ROM_START( c65 )
619   ROM_REGION( 0x400000, "maincpu", 0 )
620   ROM_SYSTEM_BIOS( 0, "910111", "V0.9.910111" )
621   ROMX_LOAD( "910111.bin", 0x20000, 0x20000, CRC(c5d8d32e) SHA1(71c05f098eff29d306b0170e2c1cdeadb1a5f206), ROM_BIOS(1) )
622   ROM_SYSTEM_BIOS( 1, "910523", "V0.9.910523" )
623   ROMX_LOAD( "910523.bin", 0x20000, 0x20000, CRC(e8235dd4) SHA1(e453a8e7e5b95de65a70952e9d48012191e1b3e7), ROM_BIOS(2) )
624   ROM_SYSTEM_BIOS( 2, "910626", "V0.9.910626" )
625   ROMX_LOAD( "910626.bin", 0x20000, 0x20000, CRC(12527742) SHA1(07c185b3bc58410183422f7ac13a37ddd330881b), ROM_BIOS(3) )
626   ROM_SYSTEM_BIOS( 3, "910828", "V0.9.910828" )
627   ROMX_LOAD( "910828.bin", 0x20000, 0x20000, CRC(3ee40b06) SHA1(b63d970727a2b8da72a0a8e234f3c30a20cbcb26), ROM_BIOS(4) )
628   ROM_SYSTEM_BIOS( 4, "911001", "V0.9.911001" )
629   ROMX_LOAD( "911001.bin", 0x20000, 0x20000, CRC(0888b50f) SHA1(129b9a2611edaebaa028ac3e3f444927c8b1fc5d), ROM_BIOS(5) )
630ROM_END
631
632ROM_START( c64dx )
633   ROM_REGION( 0x400000, "maincpu", 0 )
634   ROM_LOAD( "910429.bin", 0x20000, 0x20000, CRC(b025805c) SHA1(c3b05665684f74adbe33052a2d10170a1063ee7d) )
635ROM_END
636
637/***************************************************************************
638
639  Game driver(s)
640
641***************************************************************************/
642
643/*    YEAR  NAME    PARENT  COMPAT  MACHINE INPUT   INIT    COMPANY                         FULLNAME                                              FLAGS */
644
645COMP( 1991, c65,    0,      0,      c65,    c65, c65_state,    c65,    "Commodore Business Machines",  "Commodore 65 Development System (Prototype, NTSC)", GAME_NOT_WORKING )
646COMP( 1991, c64dx,  c65,    0,      c65pal, c65ger, c65_state, c65pal, "Commodore Business Machines",  "Commodore 64DX Development System (Prototype, PAL, German)", GAME_NOT_WORKING )
647
648
trunk/src/mess/machine/c65_old.c
r0r243237
1/***************************************************************************
2    commodore c65 home computer
3    peter.trauner@jk.uni-linz.ac.at
4    documention
5     www.funet.fi
6 ***************************************************************************/
7
8#include "emu.h"
9
10#include "includes/c65.h"
11#include "cpu/m6502/m4510.h"
12#include "sound/mos6581.h"
13#include "machine/mos6526.h"
14#include "bus/cbmiec/cbmiec.h"
15#include "machine/ram.h"
16#include "video/vic4567.h"
17#include "imagedev/cassette.h"
18#include "crsshair.h"
19#include "formats/cbm_tap.h"
20
21#define VERBOSE_LEVEL 0
22#define DBG_LOG( MACHINE, N, M, A ) \
23   do { \
24      if(VERBOSE_LEVEL >= N) \
25      { \
26         if( M ) \
27            logerror("%11.6f: %-24s", MACHINE.time().as_double(), (char*) M ); \
28         logerror A; \
29      } \
30   } while (0)
31
32
33
34/***********************************************
35
36    Input Reading - Common Components
37
38***********************************************/
39
40/* These are needed by c64, c65 and c128, each machine has also additional specific
41components in its INTERRUPT_GEN */
42
43/* keyboard lines */
44UINT8 c64_keyline[10];
45
46void cbm_common_init(void)
47{
48   int i;
49
50   for (i = 0; i < ARRAY_LENGTH(c64_keyline); i++)
51      c64_keyline[i] = 0xff;
52}
53
54static TIMER_CALLBACK( lightpen_tick )
55{
56   if (((machine.root_device().ioport("CTRLSEL")->read() & 0x07) == 0x04) || ((machine.root_device().ioport("CTRLSEL")->read() & 0x07) == 0x06))
57   {
58      /* enable lightpen crosshair */
59      crosshair_set_screen(machine, 0, CROSSHAIR_SCREEN_ALL);
60   }
61   else
62   {
63      /* disable lightpen crosshair */
64      crosshair_set_screen(machine, 0, CROSSHAIR_SCREEN_NONE);
65   }
66}
67
68void cbm_common_interrupt( device_t *device )
69{
70   int value, i;
71   int controller1 = device->machine().root_device().ioport("CTRLSEL")->read() & 0x07;
72   int controller2 = device->machine().root_device().ioport("CTRLSEL")->read() & 0x70;
73   static const char *const c64ports[] = { "ROW0", "ROW1", "ROW2", "ROW3", "ROW4", "ROW5", "ROW6", "ROW7" };
74
75   /* Lines 0-7 : common keyboard */
76   for (i = 0; i < 8; i++)
77   {
78      value = 0xff;
79      value &= ~device->machine().root_device().ioport(c64ports[i])->read();
80
81      /* Shift Lock is mapped on Left Shift */
82      if ((i == 1) && (device->machine().root_device().ioport("SPECIAL")->read() & 0x40))
83         value &= ~0x80;
84
85      c64_keyline[i] = value;
86   }
87
88
89   value = 0xff;
90   switch(controller1)
91   {
92      case 0x00:
93         value &= ~device->machine().root_device().ioport("JOY1_1B")->read();            /* Joy1 Directions + Button 1 */
94         break;
95
96      case 0x01:
97         if (device->machine().root_device().ioport("OTHER")->read() & 0x40)         /* Paddle2 Button */
98            value &= ~0x08;
99         if (device->machine().root_device().ioport("OTHER")->read() & 0x80)         /* Paddle1 Button */
100            value &= ~0x04;
101         break;
102
103      case 0x02:
104         if (device->machine().root_device().ioport("OTHER")->read() & 0x02)         /* Mouse Button Left */
105            value &= ~0x10;
106         if (device->machine().root_device().ioport("OTHER")->read() & 0x01)         /* Mouse Button Right */
107            value &= ~0x01;
108         break;
109
110      case 0x03:
111         value &= ~(device->machine().root_device().ioport("JOY1_2B")->read() & 0x1f);   /* Joy1 Directions + Button 1 */
112         break;
113
114      case 0x04:
115/* was there any input on the lightpen? where is it mapped? */
116//          if (device->machine().root_device().ioport("OTHER")->read() & 0x04)           /* Lightpen Signal */
117//              value &= ?? ;
118         break;
119
120      case 0x07:
121         break;
122
123      default:
124         logerror("Invalid Controller 1 Setting %d\n", controller1);
125         break;
126   }
127
128   c64_keyline[8] = value;
129
130
131   value = 0xff;
132   switch(controller2)
133   {
134      case 0x00:
135         value &= ~device->machine().root_device().ioport("JOY2_1B")->read();            /* Joy2 Directions + Button 1 */
136         break;
137
138      case 0x10:
139         if (device->machine().root_device().ioport("OTHER")->read() & 0x10)         /* Paddle4 Button */
140            value &= ~0x08;
141         if (device->machine().root_device().ioport("OTHER")->read() & 0x20)         /* Paddle3 Button */
142            value &= ~0x04;
143         break;
144
145      case 0x20:
146         if (device->machine().root_device().ioport("OTHER")->read() & 0x02)         /* Mouse Button Left */
147            value &= ~0x10;
148         if (device->machine().root_device().ioport("OTHER")->read() & 0x01)         /* Mouse Button Right */
149            value &= ~0x01;
150         break;
151
152      case 0x30:
153         value &= ~(device->machine().root_device().ioport("JOY2_2B")->read() & 0x1f);   /* Joy2 Directions + Button 1 */
154         break;
155
156      case 0x40:
157/* was there any input on the lightpen? where is it mapped? */
158//          if (device->machine().root_device().ioport("OTHER")->read() & 0x04)           /* Lightpen Signal */
159//              value &= ?? ;
160         break;
161
162      case 0x70:
163         break;
164
165      default:
166         logerror("Invalid Controller 2 Setting %d\n", controller2);
167         break;
168   }
169
170   c64_keyline[9] = value;
171
172//  vic2_frame_interrupt does nothing so this is not necessary
173//  vic2_frame_interrupt (device);
174
175   /* check if lightpen has been chosen as input: if so, enable crosshair */
176   device->machine().scheduler().timer_set(attotime::zero, FUNC(lightpen_tick));
177
178   set_led_status (device->machine(), 1, device->machine().root_device().ioport("SPECIAL")->read() & 0x40 ? 1 : 0);        /* Shift Lock */
179   set_led_status (device->machine(), 0, device->machine().root_device().ioport("CTRLSEL")->read() & 0x80 ? 1 : 0);        /* Joystick Swap */
180}
181
182
183/***********************************************
184
185    CIA Common Handlers
186
187***********************************************/
188
189/* These are shared by c64, c65 and c128. c65 and c128 also have additional specific
190components (to select/read additional keyboard lines) */
191
192/*
193 *  CIA 0 - Port A
194 * bits 7-0 keyboard line select
195 * bits 7,6: paddle select( 01 port a, 10 port b)
196 * bit 4: joystick a fire button
197 * bits 3,2: Paddles port a fire button
198 * bits 3-0: joystick a direction
199 *
200 *  CIA 0 - Port B
201 * bits 7-0: keyboard raw values
202 * bit 4: joystick b fire button, lightpen select
203 * bits 3,2: paddle b fire buttons (left,right)
204 * bits 3-0: joystick b direction
205 *
206 * flag cassette read input, serial request in
207 * irq to irq connected
208 */
209
210UINT8 cbm_common_cia0_port_a_r( device_t *device, UINT8 output_b )
211{
212   UINT8 value = 0xff;
213
214   if (!(output_b & 0x80))
215   {
216      UINT8 t = 0xff;
217      if (!(c64_keyline[7] & 0x80)) t &= ~0x80;
218      if (!(c64_keyline[6] & 0x80)) t &= ~0x40;
219      if (!(c64_keyline[5] & 0x80)) t &= ~0x20;
220      if (!(c64_keyline[4] & 0x80)) t &= ~0x10;
221      if (!(c64_keyline[3] & 0x80)) t &= ~0x08;
222      if (!(c64_keyline[2] & 0x80)) t &= ~0x04;
223      if (!(c64_keyline[1] & 0x80)) t &= ~0x02;
224      if (!(c64_keyline[0] & 0x80)) t &= ~0x01;
225      value &= t;
226   }
227
228   if (!(output_b & 0x40))
229   {
230      UINT8 t = 0xff;
231      if (!(c64_keyline[7] & 0x40)) t &= ~0x80;
232      if (!(c64_keyline[6] & 0x40)) t &= ~0x40;
233      if (!(c64_keyline[5] & 0x40)) t &= ~0x20;
234      if (!(c64_keyline[4] & 0x40)) t &= ~0x10;
235      if (!(c64_keyline[3] & 0x40)) t &= ~0x08;
236      if (!(c64_keyline[2] & 0x40)) t &= ~0x04;
237      if (!(c64_keyline[1] & 0x40)) t &= ~0x02;
238      if (!(c64_keyline[0] & 0x40)) t &= ~0x01;
239      value &= t;
240   }
241
242   if (!(output_b & 0x20))
243   {
244      UINT8 t = 0xff;
245      if (!(c64_keyline[7] & 0x20)) t &= ~0x80;
246      if (!(c64_keyline[6] & 0x20)) t &= ~0x40;
247      if (!(c64_keyline[5] & 0x20)) t &= ~0x20;
248      if (!(c64_keyline[4] & 0x20)) t &= ~0x10;
249      if (!(c64_keyline[3] & 0x20)) t &= ~0x08;
250      if (!(c64_keyline[2] & 0x20)) t &= ~0x04;
251      if (!(c64_keyline[1] & 0x20)) t &= ~0x02;
252      if (!(c64_keyline[0] & 0x20)) t &= ~0x01;
253      value &= t;
254   }
255
256   if (!(output_b & 0x10))
257   {
258      UINT8 t = 0xff;
259      if (!(c64_keyline[7] & 0x10)) t &= ~0x80;
260      if (!(c64_keyline[6] & 0x10)) t &= ~0x40;
261      if (!(c64_keyline[5] & 0x10)) t &= ~0x20;
262      if (!(c64_keyline[4] & 0x10)) t &= ~0x10;
263      if (!(c64_keyline[3] & 0x10)) t &= ~0x08;
264      if (!(c64_keyline[2] & 0x10)) t &= ~0x04;
265      if (!(c64_keyline[1] & 0x10)) t &= ~0x02;
266      if (!(c64_keyline[0] & 0x10)) t &= ~0x01;
267      value &= t;
268   }
269
270   if (!(output_b & 0x08))
271   {
272      UINT8 t = 0xff;
273      if (!(c64_keyline[7] & 0x08)) t &= ~0x80;
274      if (!(c64_keyline[6] & 0x08)) t &= ~0x40;
275      if (!(c64_keyline[5] & 0x08)) t &= ~0x20;
276      if (!(c64_keyline[4] & 0x08)) t &= ~0x10;
277      if (!(c64_keyline[3] & 0x08)) t &= ~0x08;
278      if (!(c64_keyline[2] & 0x08)) t &= ~0x04;
279      if (!(c64_keyline[1] & 0x08)) t &= ~0x02;
280      if (!(c64_keyline[0] & 0x08)) t &= ~0x01;
281      value &= t;
282   }
283
284   if (!(output_b & 0x04))
285   {
286      UINT8 t = 0xff;
287      if (!(c64_keyline[7] & 0x04)) t &= ~0x80;
288      if (!(c64_keyline[6] & 0x04)) t &= ~0x40;
289      if (!(c64_keyline[5] & 0x04)) t &= ~0x20;
290      if (!(c64_keyline[4] & 0x04)) t &= ~0x10;
291      if (!(c64_keyline[3] & 0x04)) t &= ~0x08;
292      if (!(c64_keyline[2] & 0x04)) t &= ~0x04;
293      if (!(c64_keyline[1] & 0x04)) t &= ~0x02;
294      if (!(c64_keyline[0] & 0x04)) t &= ~0x01;
295      value &= t;
296   }
297
298   if (!(output_b & 0x02))
299   {
300      UINT8 t = 0xff;
301      if (!(c64_keyline[7] & 0x02)) t &= ~0x80;
302      if (!(c64_keyline[6] & 0x02)) t &= ~0x40;
303      if (!(c64_keyline[5] & 0x02)) t &= ~0x20;
304      if (!(c64_keyline[4] & 0x02)) t &= ~0x10;
305      if (!(c64_keyline[3] & 0x02)) t &= ~0x08;
306      if (!(c64_keyline[2] & 0x02)) t &= ~0x04;
307      if (!(c64_keyline[1] & 0x02)) t &= ~0x02;
308      if (!(c64_keyline[0] & 0x02)) t &= ~0x01;
309      value &= t;
310   }
311
312   if (!(output_b & 0x01))
313   {
314      UINT8 t = 0xff;
315      if (!(c64_keyline[7] & 0x01)) t &= ~0x80;
316      if (!(c64_keyline[6] & 0x01)) t &= ~0x40;
317      if (!(c64_keyline[5] & 0x01)) t &= ~0x20;
318      if (!(c64_keyline[4] & 0x01)) t &= ~0x10;
319      if (!(c64_keyline[3] & 0x01)) t &= ~0x08;
320      if (!(c64_keyline[2] & 0x01)) t &= ~0x04;
321      if (!(c64_keyline[1] & 0x01)) t &= ~0x02;
322      if (!(c64_keyline[0] & 0x01)) t &= ~0x01;
323      value &= t;
324   }
325
326   if ( device->machine().root_device().ioport("CTRLSEL")->read() & 0x80 )
327      value &= c64_keyline[8];
328   else
329      value &= c64_keyline[9];
330
331   return value;
332}
333
334UINT8 cbm_common_cia0_port_b_r( device_t *device, UINT8 output_a )
335{
336   UINT8 value = 0xff;
337
338   if (!(output_a & 0x80)) value &= c64_keyline[7];
339   if (!(output_a & 0x40)) value &= c64_keyline[6];
340   if (!(output_a & 0x20)) value &= c64_keyline[5];
341   if (!(output_a & 0x10)) value &= c64_keyline[4];
342   if (!(output_a & 0x08)) value &= c64_keyline[3];
343   if (!(output_a & 0x04)) value &= c64_keyline[2];
344   if (!(output_a & 0x02)) value &= c64_keyline[1];
345   if (!(output_a & 0x01)) value &= c64_keyline[0];
346
347   if ( device->machine().root_device().ioport("CTRLSEL")->read() & 0x80 )
348      value &= c64_keyline[9];
349   else
350      value &= c64_keyline[8];
351
352   return value;
353}
354
355
356/***********************************************
357
358    CBM Cartridges
359
360***********************************************/
361
362
363/*  All the cartridge specific code has been moved
364    to machine/ drivers. Once more informations
365    surface about the cart expansions for systems
366    in c65.c, c128.c, cbmb.c and pet.c, the shared
367    code could be refactored to have here the
368    common functions                                */
369
370
371
372/***********************************************
373
374    CBM Datasette Tapes
375
376***********************************************/
377
378#if 0
379const cassette_interface cbm_cassette_interface =
380{
381   cbm_cassette_formats,
382   NULL,
383   (cassette_state) (CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED),
384   NULL
385};
386#endif
387
388
389/*UINT8 *c65_basic; */
390/*UINT8 *c65_kernal; */
391/*UINT8 *c65_dos; */
392/*UINT8 *c65_monitor; */
393/*UINT8 *c65_graphics; */
394
395
396void c65_state::c65_nmi(  )
397{
398   if (m_nmilevel != (ioport("SPECIAL")->read() & 0x80) || m_cia1_irq)   /* KEY_RESTORE */
399   {
400      m_maincpu->set_input_line(INPUT_LINE_NMI, (ioport("SPECIAL")->read() & 0x80) || m_cia1_irq);
401
402      m_nmilevel = (ioport("SPECIAL")->read() & 0x80) || m_cia1_irq;
403   }
404}
405
406
407/***********************************************
408
409    CIA Interfaces
410
411***********************************************/
412
413/*
414 *  CIA 0 - Port A keyboard line select
415 *  CIA 0 - Port B keyboard line read
416 *
417 *  flag cassette read input, serial request in
418 *  irq to irq connected
419 *
420 *  see machine/cbm.c
421 */
422
423READ8_MEMBER(c65_state::c65_cia0_port_a_r)
424{
425   UINT8 cia0portb = m_cia0->pb_r(space, 0);
426
427   return cbm_common_cia0_port_a_r(m_cia0, cia0portb);
428}
429
430READ8_MEMBER(c65_state::c65_cia0_port_b_r)
431{
432   UINT8 value = 0xff;
433   UINT8 cia0porta = m_cia0->pa_r(space, 0);
434
435   value &= cbm_common_cia0_port_b_r(m_cia0, cia0porta);
436
437   if (!(m_6511_port & 0x02))
438      value &= m_keyline;
439
440   return value;
441}
442
443WRITE8_MEMBER(c65_state::c65_cia0_port_b_w)
444{
445//  was there lightpen support in c65 video chip?
446//  vic3_device *vic3 = machine().device<vic3_device>("vic3");
447//  vic3->lightpen_write(data & 0x10);
448}
449
450void c65_state::c65_irq( int level )
451{
452   if (level != m_old_level)
453   {
454      DBG_LOG(machine(), 3, "mos4510", ("irq %s\n", level ? "start" : "end"));
455      m_maincpu->set_input_line(M4510_IRQ_LINE, level);
456      m_old_level = level;
457   }
458}
459
460/* is this correct for c65 as well as c64? */
461WRITE_LINE_MEMBER(c65_state::c65_cia0_interrupt)
462{
463   m_cia0_irq = state;
464   c65_irq(state || m_vicirq);
465}
466
467/* is this correct for c65 as well as c64? */
468WRITE_LINE_MEMBER(c65_state::c65_vic_interrupt)
469{
470#if 1
471   if (state != m_vicirq)
472   {
473      c65_irq (state || m_cia0_irq);
474      m_vicirq = state;
475   }
476#endif
477}
478
479/*
480 * CIA 1 - Port A
481 * bit 7 serial bus data input
482 * bit 6 serial bus clock input
483 * bit 5 serial bus data output
484 * bit 4 serial bus clock output
485 * bit 3 serial bus atn output
486 * bit 2 rs232 data output
487 * bits 1-0 vic-chip system memory bank select
488 *
489 * CIA 1 - Port B
490 * bit 7 user rs232 data set ready
491 * bit 6 user rs232 clear to send
492 * bit 5 user
493 * bit 4 user rs232 carrier detect
494 * bit 3 user rs232 ring indicator
495 * bit 2 user rs232 data terminal ready
496 * bit 1 user rs232 request to send
497 * bit 0 user rs232 received data
498 *
499 * flag restore key or rs232 received data input
500 * irq to nmi connected ?
501 */
502READ8_MEMBER(c65_state::c65_cia1_port_a_r)
503{
504   UINT8 value = 0xff;
505
506   if (!m_iec->clk_r())
507      value &= ~0x40;
508
509   if (!m_iec->data_r())
510      value &= ~0x80;
511
512   return value;
513}
514
515WRITE8_MEMBER(c65_state::c65_cia1_port_a_w)
516{
517   static const int helper[4] = {0xc000, 0x8000, 0x4000, 0x0000};
518
519   m_iec->atn_w(!BIT(data, 3));
520   m_iec->clk_w(!BIT(data, 4));
521   m_iec->data_w(!BIT(data, 5));
522
523   m_vicaddr = m_memory + helper[data & 0x03];
524}
525
526WRITE_LINE_MEMBER(c65_state::c65_cia1_interrupt)
527{
528   m_cia1_irq = state;
529   c65_nmi();
530}
531
532/***********************************************
533
534    Memory Handlers
535
536***********************************************/
537
538/* processor has only 1 mega address space !? */
539/* and system 8 megabyte */
540/* dma controller and bankswitch hardware ?*/
541READ8_MEMBER( c65_state::c65_read_mem )
542{
543   UINT8 result;
544   if (offset <= 0x0ffff)
545      result = m_memory[offset];
546   else
547      result = space.read_byte(offset);
548   return result;
549}
550
551WRITE8_MEMBER( c65_state::c65_write_mem )
552{
553   if (offset <= 0x0ffff)
554      m_memory[offset] = data;
555   else
556      space.write_byte(offset, data);
557}
558
559/* dma chip at 0xd700
560  used:
561   writing banknumber to offset 2
562   writing hibyte to offset 1
563   writing lobyte to offset 0
564    cpu holded, dma transfer(data at address) executed, cpu activated
565
566  command data:
567   0 command (0 copy, 3 fill)
568   1,2 length
569   3,4,5 source
570   6,7,8 dest
571   9 subcommand
572   10 mod
573
574   version 1:
575   seldom copy (overlapping) from 0x402002 to 0x402008
576   (making place for new line in basic area)
577   for whats this bit 0x400000, or is this really the address?
578   maybe means add counter to address for access,
579   so allowing up or down copies, and reordering copies
580
581   version 2:
582   cmd 0x30 used for this
583*/
584void c65_state::c65_dma_port_w( int offset, int value )
585{
586   PAIR pair, src, dst, len;
587   UINT8 cmd, fill;
588   int i;
589   address_space &space = m_maincpu->space(AS_PROGRAM);
590
591   switch (offset & 3)
592   {
593   case 2:
594   case 1:
595      m_dma.data[offset & 3] = value;
596      break;
597   case 0:
598      pair.b.h3 = 0;
599      pair.b.h2 = m_dma.data[2];
600      pair.b.h = m_dma.data[1];
601      pair.b.l = m_dma.data[0]=value;
602      cmd = c65_read_mem(space, pair.d++);
603      len.w.h = 0;
604      len.b.l = c65_read_mem(space, pair.d++);
605      len.b.h = c65_read_mem(space, pair.d++);
606      src.b.h3 = 0;
607      fill = src.b.l = c65_read_mem(space, pair.d++);
608      src.b.h = c65_read_mem(space, pair.d++);
609      src.b.h2 = c65_read_mem(space, pair.d++);
610      dst.b.h3 = 0;
611      dst.b.l = c65_read_mem(space, pair.d++);
612      dst.b.h = c65_read_mem(space, pair.d++);
613      dst.b.h2 = c65_read_mem(space, pair.d++);
614
615      switch (cmd)
616      {
617      case 0:
618         if (src.d == 0x3ffff) m_dump_dma = 1;
619         if (m_dump_dma)
620            DBG_LOG(space.machine(), 1,"dma copy job",
621                  ("len:%.4x src:%.6x dst:%.6x sub:%.2x modrm:%.2x\n",
622                     len.w.l, src.d, dst.d, c65_read_mem(space, pair.d),
623                     c65_read_mem(space, pair.d + 1) ) );
624         if ((m_dma.version == 1)
625               && ( (src.d&0x400000) || (dst.d & 0x400000)))
626         {
627            if (!(src.d & 0x400000))
628            {
629               dst.d &= ~0x400000;
630               for (i = 0; i < len.w.l; i++)
631                  c65_write_mem(space, dst.d--, c65_read_mem(space, src.d++));
632            }
633            else if (!(dst.d & 0x400000))
634            {
635               src.d &= ~0x400000;
636               for (i = 0; i < len.w.l; i++)
637                  c65_write_mem(space, dst.d++, c65_read_mem(space, src.d--));
638            }
639            else
640            {
641               src.d &= ~0x400000;
642               dst.d &= ~0x400000;
643               for (i = 0; i < len.w.l; i++)
644                  c65_write_mem(space, --dst.d, c65_read_mem(space, --src.d));
645            }
646         }
647         else
648         {
649            for (i = 0; i < len.w.l; i++)
650               c65_write_mem(space, dst.d++, c65_read_mem(space, src.d++));
651         }
652         break;
653      case 3:
654         DBG_LOG(space.machine(), 3,"dma fill job",
655               ("len:%.4x value:%.2x dst:%.6x sub:%.2x modrm:%.2x\n",
656                  len.w.l, fill, dst.d, c65_read_mem(space, pair.d),
657                  c65_read_mem(space, pair.d + 1)));
658            for (i = 0; i < len.w.l; i++)
659               c65_write_mem(space, dst.d++, fill);
660            break;
661      case 0x30:
662         DBG_LOG(space.machine(), 1,"dma copy down",
663               ("len:%.4x src:%.6x dst:%.6x sub:%.2x modrm:%.2x\n",
664                  len.w.l, src.d, dst.d, c65_read_mem(space, pair.d),
665                  c65_read_mem(space, pair.d + 1) ) );
666         for (i = 0; i < len.w.l; i++)
667            c65_write_mem(space, dst.d--,c65_read_mem(space, src.d--));
668         break;
669      default:
670         DBG_LOG(space.machine(), 1,"dma job",
671               ("cmd:%.2x len:%.4x src:%.6x dst:%.6x sub:%.2x modrm:%.2x\n",
672                  cmd,len.w.l, src.d, dst.d, c65_read_mem(space, pair.d),
673                  c65_read_mem(space, pair.d + 1)));
674      }
675      break;
676   default:
677      DBG_LOG(space.machine(), 1, "dma chip write", ("%.3x %.2x\n", offset, value));
678      break;
679   }
680}
681
682int c65_state::c65_dma_port_r( int offset )
683{
684   /* offset 3 bit 7 in progress ? */
685   DBG_LOG(machine(), 2, "dma chip read", ("%.3x\n", offset));
686   return 0x7f;
687}
688
689void c65_state::c65_6511_port_w( int offset, int value )
690{
691   if (offset == 7)
692   {
693      m_6511_port = value;
694   }
695   DBG_LOG(machine(), 2, "r6511 write", ("%.2x %.2x\n", offset, value));
696}
697
698int c65_state::c65_6511_port_r( int offset )
699{
700   int data = 0xff;
701
702   if (offset == 7)
703   {
704      if (ioport("SPECIAL")->read() & 0x20)
705         data &= ~1;
706   }
707   DBG_LOG(machine(), 2, "r6511 read", ("%.2x\n", offset));
708
709   return data;
710}
711
712/* one docu states custom 4191 disk controller
713 (for 2 1MB MFM disk drives, 1 internal, the other extern (optional) 1565
714 with integrated 512 byte buffer
715
716 0->0 reset ?
717
718 0->1, 0->0, wait until 2 positiv, 1->0 ???
719
720 0->0, 0 not 0 means no drive ???, other system entries
721
722
723 reg 0 write/read
724  0,1 written
725  bit 1 set
726  bit 2 set
727  bit 3 set
728  bit 4 set
729
730
731 reg 0 read
732  bit 0
733  bit 1
734  bit 2
735  0..2 ->$1d4
736
737 reg 1 write
738  $01 written
739  $18 written
740  $46 written
741  $80 written
742  $a1 written
743  $01 written, dec
744  $10 written
745
746 reg 2 read/write?(lsr)
747  bit 2
748  bit 4
749  bit 5 busy waiting until zero, then reading reg 7
750  bit 6 operation not activ flag!? or set overflow pin used
751  bit 7 busy flag?
752
753 reg 3 read/write?(rcr)
754  bit 1
755  bit 3
756  bit 7 busy flag?
757
758 reg 4
759  track??
760  0 written
761  read -> $1d2
762  cmp #$50
763  bcs
764
765
766 reg 5
767  sector ??
768  1 written
769  read -> $1d3
770  cmp #$b bcc
771
772
773 reg 6
774  head ??
775  0 written
776  read -> $1d1
777  cmp #2 bcc
778
779 reg 7 read
780  #4e written
781  12 times 0, a1 a1 a1 fe  written
782
783 reg 8 read
784  #ff written
785  16 times #ff written
786
787 reg 9
788  #60 written
789
790might use the set overflow input
791
792$21a6c 9a6c format
793$21c97 9c97 write operation
794$21ca0 9ca0 get byte?
795$21cab 9cab read reg 7
796$21caf 9caf write reg 7
797$21cb3
798*/
799
800#define FDC_LOST 4
801#define FDC_CRC 8
802#define FDC_RNF 0x10
803#define FDC_BUSY 0x80
804#define FDC_IRQ 0x200
805
806#define FDC_CMD_MOTOR_SPIN_UP 0x10
807
808#if 0
809void c65_state::c65_fdc_state(void)
810{
811   switch (m_fdc.state)
812   {
813   case FDC_CMD_MOTOR_SPIN_UP:
814      if (machine().time() - m_fdc.time)
815      {
816         m_fdc.state = 0;
817         m_fdc.status &= ~FDC_BUSY;
818      }
819      break;
820   }
821}
822#endif
823
824void c65_state::c65_fdc_w( int offset, int data )
825{
826   DBG_LOG(machine(), 1, "fdc write", ("%.5x %.2x %.2x\n", machine().device("maincpu")->safe_pc(), offset, data));
827   switch (offset & 0xf)
828   {
829   case 0:
830      m_fdc.reg[0] = data;
831      break;
832   case 1:
833      m_fdc.reg[1] = data;
834      switch (data & 0xf9)
835      {
836      case 0x20: // wait for motor spin up
837         m_fdc.status &= ~(FDC_IRQ|FDC_LOST|FDC_CRC|FDC_RNF);
838         m_fdc.status |= FDC_BUSY;
839         m_fdc.time = machine().time();
840         m_fdc.state = FDC_CMD_MOTOR_SPIN_UP;
841         break;
842      case 0: // cancel
843         m_fdc.status &= ~(FDC_BUSY);
844         m_fdc.state = 0;
845         break;
846      case 0x80: // buffered write
847      case 0x40: // buffered read
848      case 0x81: // unbuffered write
849      case 0x41: // unbuffered read
850      case 0x30:case 0x31: // step
851         break;
852      }
853      break;
854   case 2: case 3: // read only
855      break;
856   case 4:
857      m_fdc.reg[offset & 0xf] = data;
858      m_fdc.track = data;
859      break;
860   case 5:
861      m_fdc.reg[offset & 0xf] = data;
862      m_fdc.sector = data;
863      break;
864   case 6:
865      m_fdc.reg[offset & 0xf] = data;
866      m_fdc.head = data;
867      break;
868   case 7:
869      m_fdc.buffer[m_fdc.cpu_pos++] = data;
870      break;
871   default:
872      m_fdc.reg[offset & 0xf] = data;
873      break;
874   }
875}
876
877int c65_state::c65_fdc_r( int offset )
878{
879   UINT8 data = 0;
880   switch (offset & 0xf)
881   {
882   case 0:
883      data = m_fdc.reg[0];
884      break;
885   case 1:
886      data = m_fdc.reg[1];
887      break;
888   case 2:
889      data = m_fdc.status;
890      break;
891   case 3:
892      data = m_fdc.status >> 8;
893      break;
894   case 4:
895      data = m_fdc.track;
896      break;
897   case 5:
898      data = m_fdc.sector;
899      break;
900   case 6:
901      data = m_fdc.head;
902      break;
903   case 7:
904      data = m_fdc.buffer[m_fdc.cpu_pos++];
905      break;
906   default:
907      data = m_fdc.reg[offset & 0xf];
908      break;
909   }
910   DBG_LOG(machine(), 1, "fdc read", ("%.5x %.2x %.2x\n", machine().device("maincpu")->safe_pc(), offset, data));
911   return data;
912}
913
914/* version 1 ramcheck
915   write 0:0
916   read write read write 80000,90000,f0000
917   write 0:8
918   read write read write 80000,90000,f0000
919
920   version 2 ramcheck???
921   read 0:
922   write 0:0
923   read 0:
924   first read and second read bit 0x80 set --> nothing
925   write 0:0
926   read 0
927   write 0:ff
928*/
929
930READ8_MEMBER( c65_state::c65_ram_expansion_r )
931{
932   UINT8 data = 0xff;
933   if (m_ram->size() > (128 * 1024))
934      data = m_expansion_ram.reg;
935   return data;
936}
937
938WRITE8_MEMBER( c65_state::c65_ram_expansion_w )
939{
940   offs_t expansion_ram_begin;
941   offs_t expansion_ram_end;
942
943   if (m_ram->size() > (128 * 1024))
944   {
945      m_expansion_ram.reg = data;
946
947      expansion_ram_begin = 0x80000;
948      expansion_ram_end = 0x80000 + (m_ram->size() - 128*1024) - 1;
949
950      if (data == 0x00) {
951         space.install_readwrite_bank(expansion_ram_begin, expansion_ram_end,"bank16");
952         membank("bank16")->set_base(m_ram->pointer() + 128*1024);
953      } else {
954         space.nop_readwrite(expansion_ram_begin, expansion_ram_end);
955      }
956   }
957}
958
959WRITE8_MEMBER( c65_state::c65_write_io )
960{
961   mos6581_device *sid_0 = machine().device<mos6581_device>("sid_r");
962   mos6581_device *sid_1 = machine().device<mos6581_device>("sid_l");
963   vic3_device *vic3 = machine().device<vic3_device>("vic3");
964
965   switch (offset & 0xf00)
966   {
967   case 0x000:
968      if (offset < 0x80)
969         vic3->port_w(space, offset & 0x7f, data);
970      else if (offset < 0xa0)
971         c65_fdc_w(offset & 0x1f, data);
972      else
973      {
974         c65_ram_expansion_w(space, offset & 0x1f, data, mem_mask);
975         /*ram expansion crtl optional */
976      }
977      break;
978   case 0x100:
979   case 0x200:
980   case 0x300:
981      vic3->palette_w(space, offset - 0x100, data);
982      break;
983   case 0x400:
984      if (offset<0x420) /* maybe 0x20 */
985         sid_0->write(space, offset & 0x3f, data);
986      else if (offset<0x440)
987         sid_1->write(space, offset & 0x3f, data);
988      else
989         DBG_LOG(machine(), 1, "io write", ("%.3x %.2x\n", offset, data));
990      break;
991   case 0x500:
992      DBG_LOG(machine(), 1, "io write", ("%.3x %.2x\n", offset, data));
993      break;
994   case 0x600:
995      c65_6511_port_w(offset & 0xff,data);
996      break;
997   case 0x700:
998      c65_dma_port_w(offset & 0xff, data);
999      break;
1000   }
1001}
1002
1003WRITE8_MEMBER( c65_state::c65_write_io_dc00 )
1004{
1005   switch (offset & 0xf00)
1006   {
1007   case 0x000:
1008      m_cia0->write(space, offset, data);
1009      break;
1010   case 0x100:
1011      m_cia1->write(space, offset, data);
1012      break;
1013   case 0x200:
1014   case 0x300:
1015      DBG_LOG(machine(), 1, "io write", ("%.3x %.2x\n", offset+0xc00, data));
1016      break;
1017   }
1018}
1019
1020READ8_MEMBER( c65_state::c65_read_io )
1021{
1022   mos6581_device *sid_0 = machine().device<mos6581_device>("sid_r");
1023   mos6581_device *sid_1 = machine().device<mos6581_device>("sid_l");
1024   vic3_device *vic3 = machine().device<vic3_device>("vic3");
1025
1026   switch (offset & 0xf00)
1027   {
1028   case 0x000:
1029      if (offset < 0x80)
1030         return vic3->port_r(space, offset & 0x7f);
1031      if (offset < 0xa0)
1032         return c65_fdc_r(offset & 0x1f);
1033      else
1034      {
1035         return c65_ram_expansion_r(space, offset & 0x1f, mem_mask);
1036         /*return; ram expansion crtl optional */
1037      }
1038   case 0x100:
1039   case 0x200:
1040   case 0x300:
1041   /* read only !? */
1042      DBG_LOG(machine(), 1, "io read", ("%.3x\n", offset));
1043      break;
1044   case 0x400:
1045      if (offset < 0x420)
1046         return sid_0->read(space, offset & 0x3f);
1047      if (offset < 0x440)
1048         return sid_1->read(space, offset & 0x3f);
1049      DBG_LOG(machine(), 1, "io read", ("%.3x\n", offset));
1050      break;
1051   case 0x500:
1052      DBG_LOG(machine(), 1, "io read", ("%.3x\n", offset));
1053      break;
1054   case 0x600:
1055      return c65_6511_port_r(offset&0xff);
1056   case 0x700:
1057      return c65_dma_port_r(offset&0xff);
1058   }
1059   return 0xff;
1060}
1061
1062READ8_MEMBER( c65_state::c65_read_io_dc00 )
1063{
1064   switch (offset & 0x300)
1065   {
1066   case 0x000:
1067      return m_cia0->read(space, offset);
1068   case 0x100:
1069      return m_cia1->read(space, offset);
1070   case 0x200:
1071   case 0x300:
1072      DBG_LOG(machine(), 1, "io read", ("%.3x\n", offset+0xc00));
1073      break;
1074   }
1075   return 0xff;
1076}
1077
1078
1079/*
1080d02f:
1081 init a5 96 written (seems to be switch to c65 or vic3 mode)
1082 go64 0 written
1083*/
1084
1085/* bit 1 external sync enable (genlock)
1086   bit 2 palette enable
1087   bit 6 vic3 c65 character set */
1088WRITE8_MEMBER(c65_state::c65_bankswitch_interface)
1089{
1090   DBG_LOG(machine(), 2, "c65 bankswitch", ("%.2x\n",data));
1091
1092   if (m_io_on)
1093   {
1094      if (data & 1)
1095      {
1096         membank("bank8")->set_base(m_colorram + 0x400);
1097         membank("bank9")->set_base(m_colorram + 0x400);
1098         m_maincpu->space(AS_PROGRAM).install_read_bank(0x0dc00, 0x0dfff, "bank8");
1099         m_maincpu->space(AS_PROGRAM).install_write_bank(0x0dc00, 0x0dfff, "bank9");
1100      }
1101      else
1102      {
1103         m_maincpu->space(AS_PROGRAM).install_read_handler(0x0dc00, 0x0dfff, read8_delegate(FUNC(c65_state::c65_read_io_dc00),this));
1104         m_maincpu->space(AS_PROGRAM).install_write_handler(0x0dc00, 0x0dfff, write8_delegate(FUNC(c65_state::c65_write_io_dc00),this));
1105      }
1106   }
1107
1108   m_io_dc00_on = !(data & 1);
1109#if 0
1110   /* cartridge roms !?*/
1111   if (data & 0x08)
1112      membank("bank1")->set_base(m_roml);
1113   else
1114      membank("bank1")->set_base(m_memory + 0x8000);
1115
1116   if (data & 0x10)
1117      membank("bank2")->set_base(m_basic);
1118   else
1119      membank("bank2")->set_base(m_memory + 0xa000);
1120#endif
1121   if ((m_old_value^data) & 0x20)
1122   {
1123   /* bankswitching faulty when doing actual page */
1124      if (data & 0x20)
1125         membank("bank3")->set_base(m_basic);
1126      else
1127         membank("bank3")->set_base(m_memory + 0xc000);
1128   }
1129   m_charset_select = data & 0x40;
1130#if 0
1131   /* cartridge roms !?*/
1132   if (data & 0x80)
1133      membank("bank8")->set_base(m_kernal);
1134   else
1135      membank("bank6")->set_base(m_memory + 0xe000);
1136#endif
1137   m_old_value = data;
1138}
1139
1140void c65_state::c65_bankswitch(  )
1141{
1142   int data, loram, hiram, charen;
1143
1144   data = 0x00; // machine().device<m4510_device>("maincpu")->get_port();
1145   if (data == m_old_data)
1146      return;
1147
1148   DBG_LOG(machine(), 1, "bankswitch", ("%d\n", data & 7));
1149   loram = (data & 1) ? 1 : 0;
1150   hiram = (data & 2) ? 1 : 0;
1151   charen = (data & 4) ? 1 : 0;
1152
1153   if ((!m_game && m_exrom) || (loram && hiram && !m_exrom))
1154      membank("bank1")->set_base(m_roml);
1155   else
1156      membank("bank1")->set_base(m_memory + 0x8000);
1157
1158   if ((!m_game && m_exrom && hiram) || (!m_exrom))
1159      membank("bank2")->set_base(m_romh);
1160   else if (loram && hiram)
1161      membank("bank2")->set_base(m_basic);
1162   else
1163      membank("bank2")->set_base(m_memory + 0xa000);
1164
1165   if ((!m_game && m_exrom) || (charen && (loram || hiram)))
1166   {
1167      m_io_on = 1;
1168      membank("bank6")->set_base(m_colorram);
1169      membank("bank7")->set_base(m_colorram);
1170
1171      if (m_io_dc00_on)
1172      {
1173         m_maincpu->space(AS_PROGRAM).install_read_handler(0x0dc00, 0x0dfff, read8_delegate(FUNC(c65_state::c65_read_io_dc00),this));
1174         m_maincpu->space(AS_PROGRAM).install_write_handler(0x0dc00, 0x0dfff, write8_delegate(FUNC(c65_state::c65_write_io_dc00),this));
1175      }
1176      else
1177      {
1178         m_maincpu->space(AS_PROGRAM).install_read_bank(0x0dc00, 0x0dfff, "bank8");
1179         m_maincpu->space(AS_PROGRAM).install_write_bank(0x0dc00, 0x0dfff, "bank9");
1180         membank("bank8")->set_base(m_colorram + 0x400);
1181         membank("bank9")->set_base(m_colorram + 0x400);
1182      }
1183      m_maincpu->space(AS_PROGRAM).install_read_handler(0x0d000, 0x0d7ff, read8_delegate(FUNC(c65_state::c65_read_io),this));
1184      m_maincpu->space(AS_PROGRAM).install_write_handler(0x0d000, 0x0d7ff, write8_delegate(FUNC(c65_state::c65_write_io),this));
1185   }
1186   else
1187   {
1188      m_io_on = 0;
1189      membank("bank5")->set_base(m_memory + 0xd000);
1190      membank("bank7")->set_base(m_memory + 0xd800);
1191      membank("bank9")->set_base(m_memory + 0xdc00);
1192      if (!charen && (loram || hiram))
1193      {
1194         membank("bank4")->set_base(m_chargen);
1195         membank("bank6")->set_base(m_chargen + 0x800);
1196         membank("bank8")->set_base(m_chargen + 0xc00);
1197      }
1198      else
1199      {
1200         membank("bank4")->set_base(m_memory + 0xd000);
1201         membank("bank6")->set_base(m_memory + 0xd800);
1202         membank("bank8")->set_base(m_memory + 0xdc00);
1203      }
1204      m_maincpu->space(AS_PROGRAM).install_read_bank(0x0d000, 0x0d7ff, "bank4");
1205      m_maincpu->space(AS_PROGRAM).install_write_bank(0x0d000, 0x0d7ff, "bank5");
1206   }
1207
1208   if (!m_game && m_exrom)
1209   {
1210      membank("bank10")->set_base(m_romh);
1211   }
1212   else
1213   {
1214      if (hiram)
1215      {
1216         membank("bank10")->set_base(m_kernal);
1217      }
1218      else
1219      {
1220         membank("bank10")->set_base(m_memory + 0xe000);
1221      }
1222   }
1223   m_old_data = data;
1224}
1225
1226#ifdef UNUSED_FUNCTION
1227void c65_state::c65_colorram_write( int offset, int value )
1228{
1229   m_colorram[offset & 0x7ff] = value | 0xf0;
1230}
1231#endif
1232
1233/*
1234 * only 14 address lines
1235 * a15 and a14 portlines
1236 * 0x1000-0x1fff, 0x9000-0x9fff char rom
1237 */
1238READ8_MEMBER(c65_state::c65_dma_read)
1239{
1240   if (!m_game && m_exrom)
1241   {
1242      if (offset < 0x3000)
1243         return m_memory[offset];
1244      return m_romh[offset & 0x1fff];
1245   }
1246   if ((m_vicaddr == m_memory) || (m_vicaddr == m_memory + 0x8000))
1247   {
1248      if (offset < 0x1000)
1249         return m_vicaddr[offset & 0x3fff];
1250      if (offset < 0x2000) {
1251         if (m_charset_select)
1252            return m_chargen[offset & 0xfff];
1253         else
1254            return m_chargen[offset & 0xfff];
1255      }
1256      return m_vicaddr[offset & 0x3fff];
1257   }
1258   return m_vicaddr[offset & 0x3fff];
1259}
1260
1261READ8_MEMBER(c65_state::c65_dma_read_color)
1262{
1263   if (m_c64mode)
1264      return m_colorram[offset & 0x3ff] & 0xf;
1265   return m_colorram[offset & 0x7ff];
1266}
1267
1268void c65_state::c65_common_driver_init(  )
1269{
1270   m_memory = auto_alloc_array_clear(machine(), UINT8, 0x10000);
1271   membank("bank11")->set_base(m_memory + 0x00000);
1272   membank("bank12")->set_base(m_memory + 0x08000);
1273   membank("bank13")->set_base(m_memory + 0x0a000);
1274   membank("bank14")->set_base(m_memory + 0x0c000);
1275   membank("bank15")->set_base(m_memory + 0x0e000);
1276
1277   cbm_common_init();
1278   m_keyline = 0xff;
1279
1280   m_pal = 0;
1281   m_charset_select = 0;
1282   m_6511_port = 0xff;
1283   m_vicirq = 0;
1284   m_old_data = -1;
1285
1286   /* C65 had no datasette port */
1287   m_tape_on = 0;
1288   m_game = 1;
1289   m_exrom = 1;
1290
1291   /*memset(m_memory + 0x40000, 0, 0x800000 - 0x40000); */
1292}
1293
1294DRIVER_INIT_MEMBER(c65_state,c65)
1295{
1296   m_dma.version = 2;
1297   c65_common_driver_init();
1298}
1299
1300DRIVER_INIT_MEMBER(c65_state,c65pal)
1301{
1302   m_dma.version = 1;
1303   c65_common_driver_init();
1304   m_pal = 1;
1305}
1306
1307MACHINE_START_MEMBER(c65_state,c65)
1308{
1309   /* clear upper memory */
1310   memset(m_ram->pointer() + 128*1024, 0xff, m_ram->size() -  128*1024);
1311
1312//removed   cbm_drive_0_config (SERIAL, 10);
1313//removed   cbm_drive_1_config (SERIAL, 11);
1314   m_vicaddr = m_memory;
1315
1316   m_c64mode = 0;
1317
1318   c65_bankswitch_interface(m_maincpu->space(AS_PROGRAM),0,0xff);
1319   c65_bankswitch();
1320}
1321
1322
1323INTERRUPT_GEN_MEMBER(c65_state::c65_frame_interrupt)
1324{
1325   int value;
1326
1327   c65_nmi();
1328
1329   /* common keys input ports */
1330   cbm_common_interrupt(&device);
1331
1332   /* c65 specific: function keys input ports */
1333   value = 0xff;
1334
1335   value &= ~ioport("FUNCT")->read();
1336   m_keyline = value;
1337}
1338


Previous 199869 Revisions Next


© 1997-2024 The MAME Team