summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/drivers/cb2001.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/drivers/cb2001.c')
-rw-r--r--trunk/src/mame/drivers/cb2001.c889
1 files changed, 889 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/cb2001.c b/trunk/src/mame/drivers/cb2001.c
new file mode 100644
index 00000000000..c6a1686b88e
--- /dev/null
+++ b/trunk/src/mame/drivers/cb2001.c
@@ -0,0 +1,889 @@
+/*************************************************************************************************
+
+ Cherry Bonus 2001 (c)2000/2001 Dyna
+
+
+Produttore Dyna
+N.revisione
+CPU
+
+1x DYNA CPU91A-011-0016JK004 (QFP84) custom
+1x DYNA DC3001-0051A (QFP128) custom
+1x DYNA 22A078803 (DIP42) (I think it's an I/O)
+1x WINBOND WF19054 (equivalent to AY-3-8910)
+1x oscillator 24.000MHz
+
+ROMs
+
+1x M27C4002 (12a)
+1x M27C1001 (11f)
+2x AM27S29PC (9b,11b)
+2x GAL16V8D (not dumped)
+
+
+Note
+
+1x 36x2 edge connector
+1x 10x2 edge connector
+1x trimmer (volume)
+1x pushbutton (sw8)
+1x battery
+7x 8x switches dip (sw1-7)
+------------------------------
+
+In title screen (c) is 2001
+In test mode (c) is 2000
+
+------------------------------
+
+this seems more like 8-bit hardware, maybe it should be v25, not v35...
+
+*************************************************************************************************/
+
+#include "emu.h"
+#include "cpu/nec/nec.h"
+#include "sound/ay8910.h"
+#include "machine/8255ppi.h"
+
+
+class cb2001_state : public driver_device
+{
+public:
+ cb2001_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag) { }
+
+ UINT16 *m_vram_fg;
+ UINT16* m_vram_bg;
+ int m_videobank;
+ int m_videomode;
+ tilemap_t *m_reel1_tilemap;
+ tilemap_t *m_reel2_tilemap;
+ tilemap_t *m_reel3_tilemap;
+ int m_other1;
+ int m_other2;
+};
+
+
+#define xxxx 0x90 /* Unknown */
+
+static const UINT8 cb2001_decryption_table[256] = {
+ 0xe8,xxxx,xxxx,xxxx,0x80,0xe4,0x12,0x2f, 0x3c,xxxx,xxxx,0x23,xxxx,xxxx,xxxx,0x5f, /* 00 */
+// ssss ---- **** pppp pppp ssss pppp pppp
+ 0x86,xxxx,xxxx,0x27,0x1c,xxxx,xxxx,xxxx, 0x32,0x40,0xa0,0xd3,0x3a,0x14,0x89,0x1f, /* 10 */
+// rrrr **** pppp pppp pppp pppp pppp ppp? pppp pppp ssss
+ xxxx,0x8e,xxxx,0x0f,xxxx,0x49,0xb5,xxxx, 0x56,xxxx,xxxx,0x75,0x33,0xb6,xxxx,0x39, /* 20 */
+// ssss ssss pppp pppp pppp ssss pppp pppp ****
+ 0x89,xxxx,xxxx,xxxx,xxxx,0x22,0x5b,xxxx, xxxx,xxxx,0x74,xxxx,xxxx,0xa6,xxxx,0x74, /* 30 */
+// wwww **** pppp debu pppp ssss
+ xxxx,0xea,xxxx,xxxx,0xd0,0xb0,0x5e,xxxx, xxxx,0xa2,xxxx,xxxx,0xa3,xxxx,xxxx,0xb3, /* 40 */
+// ssss **** pppp pppp pppp ssss pppp
+ 0x13,xxxx,0x2c,xxxx,0x9d,xxxx,0x42,0xc0, 0x04,xxxx,0xb7,xxxx,0xeb,0xab,xxxx,xxxx, /* 50 */
+// ???? ssss **** pppp pppp **** **** ssss pppp
+ xxxx,xxxx,xxxx,xxxx,0x0a,xxxx,xxxx,xxxx, 0xa1,0xa5,xxxx,xxxx,xxxx,0xbb,0xba,xxxx, /* 60 */
+// pppp ssss pppp pppp ssss
+ 0xc3,0x53,0x02,0x58,xxxx,xxxx,0x24,xxxx, 0x72,xxxx,0xf3,xxxx,xxxx,0x43,xxxx,0x34, /* 70 */
+// ssss pppp pppp ssss pppp ssss pppp ssss ****
+ 0x26,xxxx,0xd1,xxxx,xxxx,0x3d,0xfb,0xf6, xxxx,xxxx,0x59,xxxx,0x73,xxxx,0x2a,xxxx, /* 80 */
+// pppp rrrr pppp **** ssss pppp ssss pppp
+ xxxx,0x3d,0xe9,xxxx,xxxx,0xbe,0xf9,xxxx, xxxx,xxxx,0x57,xxxx,0xb9,xxxx,0xbf,xxxx, /* 90 */
+// wwww pppp pppp **** pppp ssss ssss
+ 0xc1,xxxx,0xe6,0x06,0xaa,0x9c,0xad,0xb8, 0x4e,xxxx,0x8d,0x50,0x51,0xa4,xxxx,0x1a, /* A0 */
+// **** pppp ssss pppp **** pppp ssss pppp ssss ssss pppp pppp pppp
+ 0xac,xxxx,0xb4,xxxx,xxxx,0x83,xxxx,xxxx, xxxx,0x05,0x03,xxxx,0x1e,0x43,0x07,0xcf, /* B0 */
+// pppp ssss pppp pppp pppp ssss **** ssss ssss
+ 0xcb,0xec,0xee,xxxx,xxxx,0xe2,0x87,xxxx, xxxx,xxxx,0x76,0x61,0x48,xxxx,0x2e,xxxx, /* C0 */
+// ssss ssss pppp ssss pppp pppp **** **** pppp
+ xxxx,0xf2,0x46,xxxx,0x60,xxxx,0x4f,0x47, 0x88,xxxx,xxxx,0xff,xxxx,0xfa,0xc7,0x8b, /* D0 */
+// pppp pppp **** pppp pppp pppp ssss **** ssss pppp
+ 0x8a,0xb1,xxxx,0xc6,xxxx,0x5a,xxxx,0xb2, 0x9a,0x52,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, /* E0 */
+// ssss gggg ssss **** pppp pppp ****
+ xxxx,0xae,0xfe,xxxx,xxxx,xxxx,xxxx,0x3a, xxxx,xxxx,0x34,xxxx,0x81,xxxx,xxxx,xxxx, /* F0 */
+// pppp ssss ppp? wwww pppp
+};
+
+/* robiza's notes:
+
+f7 -> 3a very probable, but 1c -> 3a
+d1 f1 -> same effect of "z80 cpir" opcode (repne cmpmb) d1 -> f2, f1 -> ae (cmast91 from 2682, cb2001 from e2156)
+
+e0022 a5 push psw ?
+e0023 d4 push r ?
+e0024 bc push ds0 (bc -> 1e)
+e0025 a3 push ds1 (a3 -> 06)
+e0026 dd di ?
+e0027 a7 00 00 mov aw,0
+e002a 21 d8 mov ds0,aw
+e002c 21 c0 mov ds1,aw
+e002e 18 c0 xor al,al
+e0030 49 67 07 mov [767],al
+e0033 45 01 mov al,1
+e0035 49 d3 06 mov [6d3],al
+...
+e00a6 be pop ds1 (be -> 07)
+e00a7 1f pop ds0 (1f -> 1f)
+e00a8 05 30 in al, 30 ?
+e00aa cb pop r ?
+e00ab 54 pop psw ?
+e00ac 23 92 fint (23 -> 0f)
+e00ae bf reti
+
+cmast91 and cmv4 seems similar to this cb2001:
+
+cmast91: cb2001:
+
+0089 call 2a9d e0038 call e30a2
+ 2a9d ld hl,d0b3 e30a2 lea bw,[04a6]
+ 2aa0 inc (hl) e30a5 inc b ptr[bw]
+ 2aa1 inc hl e30a8 inc bw
+ 2aa2 inc (hl) e30a9 inc b ptr[bw]
+ 2aa3 ld a,(hl) e30ab mov al,b ptr[bw]
+ 2aa4 cp 3c e30ad cmp al,3c
+ 2aa6 ret c e30af bc e30b7
+
+0c4f ld a,(d44d) e003b mov al,[512]
+0c52 or a,a e003e and al,al
+0c53 ret nz e0040 be e0083
+0c54 ld hl,d461 .
+0c57 ld a,(d476) e0042 mov aw,[4b9] (68 -> a1)
+0c5a or a e0045 and aw,aw
+0c5b jr nz,0c6d e0047 be e0083
+0c5d ld a,(hl) .
+0c5e or a e0049 and al,al
+0c5f jr nz,0c71 e004b be e0054
+0c61 inc hl e004d dec al
+0c62 inc (hl) e004f mov [4b9],aw (4c -> a3)
+0c63 ld a,(hl) .
+. e0052 br e0083
+. e0054 and ah,ah
+. e0056 be e007b
+0c64 cp 3c e0058 mov al,3c
+0c66 jr c,c71 .
+0c68 dec hl e005a dec ah
+0c69 ld (hl),ff e005c mov [4b9],aw
+0c6b jr c71 .
+0c6d xor a .
+0c6e ld (hl),a .
+0c6f inc (hl) .
+0c70 ld (hl),a .
+0c71 ld a,(d463) e005f mov aw,[4bb]
+0c74 or a e0062 and aw,aw
+0c75 ret nz e0064 bne e006b
+. e0066 mov aw,1
+. e0069 br e006e
+
+0067 ld a,$07 e0130 mov al,7h
+0069 out ($23),a e0132 mov dw,23h
+ e0135 out dw,al
+
+006b ld a,$3f e0136 mov al,3fh
+006d out ($22),a e0138 mov dw,22h
+ e013b out dw,al
+
+006f ld a,$9b e0124 mov al,0ffh
+0071 out ($13),a e0126 mov dw,13h
+ e0129 out dw,al
+
+-----------------
+
+cmv4 cb2001 (en -> de)
+
+. e025f mov dw,2h
+02b2 in a,($06) e0262 in al,dw (c1 -> ec)
+. e0263 xor al,d0h
+. e0265 and l,c0h
+02b4 bit 6,a e0267 test1 al,6h (23 -> 0f)
+02b6 jp z,$41e2 e026b be e0270
+. e026d br e39fe
+02b9 bit 7,a e0270 test1 al,7h
+02bb jp z,$41e2 e0274 be e0279
+02be call $0ab2 .
+. e0276 br e6120
+02c1 ld bc,$8000 e0279 mov cw,8000h
+
+029f ld b,$fc
+02a1 call $0c38 e0239 call 0e30b8h
+02a4 ld hl,$d023 e023d mov ix,90h (36 -> be)
+02a7 call $2b2d e0240 call 0e32a6h (00 -> e8)
+ 2b2d ld a,$01 e32a6 mov al,1h
+ 2b2f or a e32a8 and al,al
+ 2b30 add a,(hl) e32aa add al,b ptr [ix]
+ 2b31 daa e32ac daa (13 -> 27) not sure
+ 2b32 ld (hl),a e32ad mov b ptr [ix],al
+ 2b33 push bc e32af push cw (ac -> 51)
+ 2b34 ld b,$03 e32b0 mov cw,3h (9c -> b9)
+ 2b36 dec hl e32b3 inc ix or dec ix?
+ 2b37 ld a,(hl) e32b4 mov al,b ptr [ix] (e0 -> 8a)
+ 2b38 adc a,$00 e32b6 adc al,0h (1d -> 14)
+ 2b3a daa e32b8 daa
+ 2b3b ld (hl),a e32b9 mov b ptr [ix],al
+ 2b3c djnz $2b36 e32bb dbnz e32b3h (c5 -> e2)
+ 2b3e pop bc e32bd pop cw (8a -> 59)
+ 2b3f ret e32be ret
+
+ 2b40-2b4b e32bf-e32d1 (06 -> 12) (07 -> 27 not sure) (d7 -> 4f dec iy or 47 inc iy)
+ 2b4c-2b57 e32d2-e32e4 (af -> 1a)
+ . e32e5- (8e -> 2a) (14 -> 1c)
+
+02aa ld a,$01 e0243 mov al,1h
+02ac ld ($d618),a e0245 mov [72dh],al
+02af call $4a8e e0248 call 0e66cbh
+ 4a8e ld a,($d618) e66cb mov al,[72dh] (1a -> a0)
+ 4a91 and a e66ce and al,al (64 -> 22)
+ 4a92 jr z,$4abe e66d0 be e6703 (3f -> 74)
+ 4a94 cp $02 e66d2 cmp al,2h (08 -> 3c)
+ 4a96 jr nz,$4aa6 e66d4 bne e66e9 (2b -> 75)
+ 4a98 ld a,$0d e66d6 mov al,0dh (45 -> b0)
+ . e66d8 mov dw,23h (6e -> ba)
+ 4a9a out ($03),a e66db out dw,al (c2 -> ee)
+ 4a9c ld a,$00 e66dc mov al,00h
+ . e66de mov dw,22h
+ 4a9e out ($02),a e66e1 out dw,al
+ 4aa0 xor a e66e2 xor al,al (18 -> 32)
+ 4aa1 ld ($d618),al e66e4 mov [72dh],al (49 -> a2)
+ 4aa4 jr $4abe e66e7 br 0e6703h (5c -> eb)
+
+ 4aa6 add a,a e66e9 add al,al (72 -> 02)
+ 4aa7 ld e,a .
+ 4aa8 ld d,$00 e66eb mov ah,00h (b2 -> b4)
+ 4aaa ld hl,$4b62 e66ed mov bw,67cbh (6d -> bb)
+ 4aad add lh,de e66f0 add bw,aw (ba -> 03)
+ 4aae ld e,(hl) .
+ 4aaf inc hl .
+ 4abo ld d,(hl) .
+ 4ab1 ex de,hl e66f2 mov bw,w ptr ss[bw](df -> 8b)
+ 4ab2 xor a .
+ 4ab3 ld ($d618),a e66f5 mov b ptr[72dh],ah (d8 -> 88)
+ 4ab6 ld ($d619),a e66f9 mov b ptr[72eh],ah
+ 4ab9 ld ($d61a),hl e66fd mov w ptr[72fh],bw
+ 4abc jr $4ac9 e6701 br 0e6712h
+
+ 4abe ld a,($d619) e6703 mov al,[72eh]
+ 4ac1 and a e6706 and al,al
+ 4ac2 jr z,$4ac9 e6708 be 0e6712h
+ 4ac4 dec a e670a dec al (f2 -> fe)
+ 4ac5 ld ($d619),a e670c mov [72eh],al
+ . e670f be 0e6712h
+ 4ac8 ret nz e6711 ret (70 -> c3)
+
+ 4ac9 ld hl,($d61a) e6712 mov bw,w ptr[72fh]
+ . e6716 or bw,bw ??? (0b -> 23) ???
+ . e6718 bne 0e671bh
+ . e671a ret
+ 4acc ld a,(hl) e671b mov al,b ptr ps[bw](ce -> 2e) (e0 -> 8a)
+ 4acd inc hl e671e inc bw (7d -> 43)
+ 4ace cp $f0 e671f cmp al,0f0h
+ 4ad0 jr nc,$4b14 e6721 bnc 0e676fh (8c -> 73)
+
+ 4add sub $50 e672f sub al,50h (52 -> 2c)
+ 4adf cp $50 e6731 cmp al,50h
+ 4ae1 jr c,$4ae7 e6733 bc 0e6739 (78 -> 72)
+ 4ae3 ld b,$04 e6735 mov ch,4h (26 -> b5)
+ 4ae5 sub $50 e6737 sub al,50h
+ 4ae7 ld c,a e6739 mov cl,al
+ 4ae8 and $0f e673b and al,0fh (76 -> 24)
+ 4aea add a,a e673d add al,al
+ 4aeb ld e,a .
+ 4aec ld d,$00 e673f mov ah,0h
+ 4aee ld hl,$4b42 e6741 mov bw,67ab
+ 4af1 add hl,de e6744 add bw,aw
+ 4af2 ld e,(hl) e6746 mov bw,w ptr ps[bw] not sure the prefix
+ 4af3 inc hl .
+ 4af4 ld d,(hl) .
+ 4af5 ld a,c .
+ 4af6 and $f0 e6749 and cl,f0h (04 -> 80)
+ 4af8 jr z,$4b05 e674c be 0e6753
+ 4afa rrca .
+ 4afb rrca .
+ 4afc rrca .
+ 4afd rrca e674e ror cl,4h (57 -> c0)
+ 4afe srl d .
+ 4b00 rr e e6751 shr bw,cl (1b -> d3)
+ 4b02 dec a .
+ 4b03 jr nz,$4afe .
+ 4b05 ld a,b e6753 mov al,ch
+ . e6755 mov dw,23h
+ 4b06 out ($03),a e6758 out dw,al
+
+-------------------------------------------------
+
+56 -> 42 (inc dw or dec dw)
+
+92 -> e9 (probably)
+dd -> fa (di) (probably)
+
+checked against gussun (from 10000) and quizf1 (start up code):
+41 -> ea (jmp_far)
+21 -> 8e
+a7 -> b8
+de -> c7
+e3 -> c6
+
+*/
+
+
+// these areas are wrong
+static const rectangle visible1 = { 0*8, (14+48)*8-1, 3*8, (3+7)*8-1 };
+static const rectangle visible2 = { 0*8, (14+48)*8-1, 10*8, (10+7)*8-1 };
+static const rectangle visible3 = { 0*8, (14+48)*8-1, 17*8, (17+7)*8-1 };
+
+static SCREEN_UPDATE(cb2001)
+{
+ cb2001_state *state = screen->machine().driver_data<cb2001_state>();
+ int count,x,y;
+ bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine()));
+
+ count = 0x0000;
+
+ // render bg as 8x8 tilemaps
+ if (state->m_other1 & 0x02)
+ {
+ if (!(state->m_other1 & 0x04))
+ {
+ for (y=0;y<32;y++)
+ {
+ for (x=0;x<64;x++)
+ {
+ int tile;
+ int colour;
+
+ tile = (state->m_vram_bg[count] & 0x0fff);
+ colour = (state->m_vram_bg[count] & 0xf000)>>12;
+ tile += state->m_videobank*0x2000;
+
+
+ drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0],tile,colour,0,0,x*8,y*8);
+
+ count++;
+ }
+ }
+ }
+ else
+ {
+ int i;
+
+ for (i= 0;i < 64;i++)
+ {
+ UINT16 scroll;
+
+ scroll = state->m_vram_bg[0xa00/2 + i/2];
+ if (i&1)
+ scroll >>=8;
+ scroll &=0xff;
+
+ tilemap_set_scrolly(state->m_reel2_tilemap, i, scroll);
+
+ scroll = state->m_vram_bg[0x800/2 + i/2];
+ if (i&1)
+ scroll >>=8;
+ scroll &=0xff;
+
+ tilemap_set_scrolly(state->m_reel1_tilemap, i, scroll);
+
+ scroll = state->m_vram_bg[0xc00/2 + i/2];
+ if (i&1)
+ scroll >>=8;
+ scroll &=0xff;
+
+ tilemap_set_scrolly(state->m_reel3_tilemap, i, scroll);
+
+ }
+
+ tilemap_draw(bitmap, &visible1, state->m_reel1_tilemap, 0, 0);
+ tilemap_draw(bitmap, &visible2, state->m_reel2_tilemap, 0, 0);
+ tilemap_draw(bitmap, &visible3, state->m_reel3_tilemap, 0, 0);
+ }
+ }
+
+ count = 0x0000;
+
+ for (y=0;y<32;y++)
+ {
+ for (x=0;x<64;x++)
+ {
+ int tile;
+ int colour;
+
+ tile = (state->m_vram_fg[count] & 0x0fff);
+ colour = (state->m_vram_fg[count] & 0xf000)>>12;
+ tile += state->m_videobank*0x2000;
+
+ if (state->m_other2 & 0x4)
+ {
+ tile += 0x1000;
+ }
+
+ drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0],tile,colour,0,0,x*8,y*8,0);
+ count++;
+ }
+ }
+
+ popmessage("%02x %02x %02x %02x\n",state->m_videobank,state->m_videomode, state->m_other1, state->m_other2);
+
+ return 0;
+}
+
+
+/* these ports sometimes get written with similar values
+ - they could be hooked up wrong, or subject to change it the code
+ is being executed incorrectly */
+WRITE16_HANDLER( cb2001_vidctrl_w )
+{
+ cb2001_state *state = space->machine().driver_data<cb2001_state>();
+ if (mem_mask&0xff00) // video control?
+ {
+ printf("cb2001_vidctrl_w %04x %04x\n", data, mem_mask);
+ state->m_videobank = (data & 0x0800)>>11;
+ }
+ else // something else
+ state->m_other1 = data & 0x00ff;
+}
+
+WRITE16_HANDLER( cb2001_vidctrl2_w )
+{
+ cb2001_state *state = space->machine().driver_data<cb2001_state>();
+ if (mem_mask&0xff00) // video control?
+ {
+ printf("cb2001_vidctrl2_w %04x %04x\n", data, mem_mask); // i think this switches to 'reels' mode
+ state->m_videomode = (data>>8) & 0x03; // which bit??
+ }
+ else // something else
+ state->m_other2 = data & 0x00ff;
+
+// printf("cb2001_vidctrl2_w %04x %04x\n", data, mem_mask); // bank could be here instead
+}
+
+
+static TILE_GET_INFO( get_cb2001_reel1_tile_info )
+{
+ cb2001_state *state = machine.driver_data<cb2001_state>();
+ int code = state->m_vram_bg[(0x0000/2) + tile_index/2];
+
+ if (tile_index&1)
+ code >>=8;
+
+ code &=0xff;
+
+ int colour = 0;//= (cb2001_out_c&0x7) + 8;
+
+ SET_TILE_INFO(
+ 1,
+ code+0x800,
+ colour,
+ 0);
+}
+
+static TILE_GET_INFO( get_cb2001_reel2_tile_info )
+{
+ cb2001_state *state = machine.driver_data<cb2001_state>();
+ int code = state->m_vram_bg[(0x0200/2) + tile_index/2];
+
+ if (tile_index&1)
+ code >>=8;
+
+ code &=0xff;
+
+ int colour = 0;//(cb2001_out_c&0x7) + 8;
+
+ SET_TILE_INFO(
+ 1,
+ code+0x800,
+ colour,
+ 0);
+}
+
+
+static TILE_GET_INFO( get_cb2001_reel3_tile_info )
+{
+ cb2001_state *state = machine.driver_data<cb2001_state>();
+ int code = state->m_vram_bg[(0x0400/2) + tile_index/2];
+ int colour = 0;//(cb2001_out_c&0x7) + 8;
+
+ if (tile_index&1)
+ code >>=8;
+
+ code &=0xff;
+
+ SET_TILE_INFO(
+ 1,
+ code+0x800,
+ colour,
+ 0);
+}
+
+
+static VIDEO_START(cb2001)
+{
+ cb2001_state *state = machine.driver_data<cb2001_state>();
+ state->m_reel1_tilemap = tilemap_create(machine,get_cb2001_reel1_tile_info,tilemap_scan_rows, 8, 32, 64, 8);
+ state->m_reel2_tilemap = tilemap_create(machine,get_cb2001_reel2_tile_info,tilemap_scan_rows, 8, 32, 64, 8);
+ state->m_reel3_tilemap = tilemap_create(machine,get_cb2001_reel3_tile_info,tilemap_scan_rows, 8, 32, 64, 8);
+
+ tilemap_set_scroll_cols(state->m_reel1_tilemap, 64);
+ tilemap_set_scroll_cols(state->m_reel2_tilemap, 64);
+ tilemap_set_scroll_cols(state->m_reel3_tilemap, 64);
+}
+
+WRITE16_HANDLER( cb2001_bg_w )
+{
+ cb2001_state *state = space->machine().driver_data<cb2001_state>();
+ COMBINE_DATA(&state->m_vram_bg[offset]);
+
+ // also used for the reel tilemaps in a different mode
+/*
+ if (offset<0x200/2)
+ {
+ tilemap_mark_tile_dirty(state->m_reel1_tilemap,(offset&0xff)/2);
+ }
+ else if (offset<0x400/2)
+ {
+ tilemap_mark_tile_dirty(state->m_reel2_tilemap,(offset&0xff)/2);
+ }
+ else if (offset<0x600/2)
+ {
+ tilemap_mark_tile_dirty(state->m_reel3_tilemap,(offset&0xff)/2);
+ }
+ else if (offset<0x800/2)
+ {
+ // tilemap_mark_tile_dirty(reel4_tilemap,(offset&0xff)/2);
+ }
+*/
+ tilemap_mark_all_tiles_dirty (state->m_reel1_tilemap);
+ tilemap_mark_all_tiles_dirty (state->m_reel2_tilemap);
+ tilemap_mark_all_tiles_dirty (state->m_reel3_tilemap);
+
+
+}
+
+static ADDRESS_MAP_START( cb2001_map, AS_PROGRAM, 16 )
+ AM_RANGE(0x00000, 0x1ffff) AM_RAM
+ AM_RANGE(0x20000, 0x20fff) AM_RAM AM_BASE_MEMBER(cb2001_state, m_vram_fg)
+ AM_RANGE(0x21000, 0x21fff) AM_RAM_WRITE(&cb2001_bg_w) AM_BASE_MEMBER(cb2001_state, m_vram_bg)
+ AM_RANGE(0xc0000, 0xfffff) AM_ROM AM_REGION("boot_prg",0)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( cb2001_io, AS_IO, 16 )
+ AM_RANGE(0x00, 0x03) AM_DEVREADWRITE8("ppi8255_0", ppi8255_r, ppi8255_w, 0xffff) /* Input Ports */
+ AM_RANGE(0x10, 0x13) AM_DEVREADWRITE8("ppi8255_1", ppi8255_r, ppi8255_w, 0xffff) /* DIP switches */
+ AM_RANGE(0x20, 0x21) AM_DEVREAD8("aysnd", ay8910_r, 0xff00)
+ AM_RANGE(0x22, 0x23) AM_DEVWRITE8("aysnd", ay8910_data_address_w, 0xffff)
+
+ AM_RANGE(0x30, 0x31) AM_WRITE(cb2001_vidctrl_w)
+ AM_RANGE(0x32, 0x33) AM_WRITE(cb2001_vidctrl2_w)
+ADDRESS_MAP_END
+
+static INPUT_PORTS_START( cb2001 )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_SERVICE )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SLOT_STOP2 ) PORT_NAME("Stop 2 / Big")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SLOT_STOP1 ) PORT_NAME("Stop 1 / D-UP")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SLOT_STOP_ALL ) PORT_NAME("Stop All / Take")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_BET )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SLOT_STOP3 ) PORT_NAME("Stop 3 / Small / Info")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Start")
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(2) /* Coin B */
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_IMPULSE(2) /* Coin D */
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_IMPULSE(2) /* Coin C */
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_GAMBLE_KEYIN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) /* Coin A */
+
+ PORT_START("IN2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) PORT_NAME("Key Out / Attendant")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_GAMBLE_SERVICE ) PORT_NAME("Settings")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) PORT_NAME("Stats")
+
+ PORT_START("DSW1")
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:1") /* OK */
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, "Hopper Out Switch" ) PORT_DIPLOCATION("DSW1:2") /* OK */
+ PORT_DIPSETTING( 0x02, "Active Low" )
+ PORT_DIPSETTING( 0x00, "Active High" )
+ PORT_DIPNAME( 0x04, 0x04, "Payout Mode" ) PORT_DIPLOCATION("DSW1:3") /* OK */
+ PORT_DIPSETTING( 0x04, "Payout Switch" )
+ PORT_DIPSETTING( 0x00, "Automatic" )
+ PORT_DIPNAME( 0x08, 0x00, "W-UP '7'" ) PORT_DIPLOCATION("DSW1:4") /* not checked */
+ PORT_DIPSETTING( 0x08, "Loss" )
+ PORT_DIPSETTING( 0x00, "Even" )
+ PORT_DIPNAME( 0x10, 0x00, "W-UP Pay Rate" ) PORT_DIPLOCATION("DSW1:5") /* OK */
+ PORT_DIPSETTING( 0x00, "80%" )
+ PORT_DIPSETTING( 0x10, "90%" )
+ PORT_DIPNAME( 0x20, 0x00, "W-UP Game" ) PORT_DIPLOCATION("DSW1:6") /* OK */
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0xc0, 0xc0, "Bet Max" ) PORT_DIPLOCATION("DSW1:7,8") /* OK */
+ PORT_DIPSETTING( 0x00, "16" )
+ PORT_DIPSETTING( 0x40, "32" )
+ PORT_DIPSETTING( 0x80, "64" )
+ PORT_DIPSETTING( 0xc0, "96" )
+
+ PORT_START("DSW2")
+ PORT_DIPNAME( 0x07, 0x00, "Main Game Pay Rate" ) PORT_DIPLOCATION("DSW2:1,2,3") /* OK */
+ PORT_DIPSETTING( 0x07, "35%" )
+ PORT_DIPSETTING( 0x06, "40%" )
+ PORT_DIPSETTING( 0x05, "45%" )
+ PORT_DIPSETTING( 0x04, "50%" )
+ PORT_DIPSETTING( 0x03, "55%" )
+ PORT_DIPSETTING( 0x02, "60%" )
+ PORT_DIPSETTING( 0x01, "65%" )
+ PORT_DIPSETTING( 0x00, "70%" )
+ PORT_DIPNAME( 0x18, 0x00, "Hopper Limit" ) PORT_DIPLOCATION("DSW2:4,5") /* OK */
+ PORT_DIPSETTING( 0x18, "300" )
+ PORT_DIPSETTING( 0x10, "500" )
+ PORT_DIPSETTING( 0x08, "1000" )
+ PORT_DIPSETTING( 0x00, "Unlimited" )
+ PORT_DIPNAME( 0x20, 0x00, "100 Odds Sound" ) PORT_DIPLOCATION("DSW2:6") /* not checked */
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, "Key-In Type" ) PORT_DIPLOCATION("DSW2:7") /* OK */
+ PORT_DIPSETTING( 0x40, "A-Type" )
+ PORT_DIPSETTING( 0x00, "B-Type" )
+ PORT_DIPNAME( 0x80, 0x00, "Center Super 7 Bet Limit" ) PORT_DIPLOCATION("DSW2:8") /* related with DSW 4-6 */
+ PORT_DIPSETTING( 0x80, "Unlimited" )
+ PORT_DIPSETTING( 0x00, "Limited" )
+
+ PORT_START("DSW3")
+ PORT_DIPNAME( 0x03, 0x03, "Key In Rate" ) PORT_DIPLOCATION("DSW3:1,2") /* OK */
+ PORT_DIPSETTING( 0x00, "1 Coin/10 Credits" ) PORT_CONDITION("DSW2",0x40,PORTCOND_EQUALS,0x40) /* A-Type */
+ PORT_DIPSETTING( 0x01, "1 Coin/20 Credits" ) PORT_CONDITION("DSW2",0x40,PORTCOND_EQUALS,0x40)
+ PORT_DIPSETTING( 0x02, "1 Coin/50 Credits" ) PORT_CONDITION("DSW2",0x40,PORTCOND_EQUALS,0x40)
+ PORT_DIPSETTING( 0x03, "1 Coin/100 Credits" ) PORT_CONDITION("DSW2",0x40,PORTCOND_EQUALS,0x40)
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) ) PORT_CONDITION("DSW2",0x40,PORTCOND_EQUALS,0x00) /* B-Type */
+ PORT_DIPSETTING( 0x01, "1 Coin/10 Credits" ) PORT_CONDITION("DSW2",0x40,PORTCOND_EQUALS,0x00)
+ PORT_DIPSETTING( 0x02, "1 Coin/25 Credits" ) PORT_CONDITION("DSW2",0x40,PORTCOND_EQUALS,0x00)
+ PORT_DIPSETTING( 0x03, "1 Coin/50 Credits" ) PORT_CONDITION("DSW2",0x40,PORTCOND_EQUALS,0x00)
+ PORT_DIPNAME( 0x0c, 0x0c, "Coin A Rate" ) PORT_DIPLOCATION("DSW3:3,4") /* OK */
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x0c, "1 Coin/10 Credits" )
+ PORT_DIPNAME( 0x30, 0x30, "Coin D Rate" ) PORT_DIPLOCATION("DSW3:5,6") /* OK */
+ PORT_DIPSETTING( 0x30, DEF_STR( 5C_1C ) ) PORT_CONDITION("DSW4",0x10,PORTCOND_EQUALS,0x10) /* C-Type */
+ PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C ) ) PORT_CONDITION("DSW4",0x10,PORTCOND_EQUALS,0x10)
+ PORT_DIPSETTING( 0x10, DEF_STR( 1C_1C ) ) PORT_CONDITION("DSW4",0x10,PORTCOND_EQUALS,0x10)
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_2C ) ) PORT_CONDITION("DSW4",0x10,PORTCOND_EQUALS,0x10)
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) ) PORT_CONDITION("DSW4",0x10,PORTCOND_EQUALS,0x00) /* D-Type */
+ PORT_DIPSETTING( 0x10, "1 Coin/10 Credits" ) PORT_CONDITION("DSW4",0x10,PORTCOND_EQUALS,0x00)
+ PORT_DIPSETTING( 0x20, "1 Coin/25 Credits" ) PORT_CONDITION("DSW4",0x10,PORTCOND_EQUALS,0x00)
+ PORT_DIPSETTING( 0x30, "1 Coin/50 Credits" ) PORT_CONDITION("DSW4",0x10,PORTCOND_EQUALS,0x00)
+ PORT_DIPNAME( 0xc0, 0xc0, "Coin C Rate" ) PORT_DIPLOCATION("DSW3:7,8") /* OK */
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0xc0, "1 Coin/10 Credits" )
+
+ PORT_START("DSW4")
+ PORT_DIPNAME( 0x07, 0x07, "Credit Limit" ) PORT_DIPLOCATION("DSW4:1,2,3") /* not checked */
+ PORT_DIPSETTING( 0x07, "5,000" )
+ PORT_DIPSETTING( 0x06, "10,000" )
+ PORT_DIPSETTING( 0x05, "20,000" )
+ PORT_DIPSETTING( 0x04, "30,000" )
+ PORT_DIPSETTING( 0x03, "40,000" )
+ PORT_DIPSETTING( 0x02, "50,000" )
+ PORT_DIPSETTING( 0x01, "100,000" )
+ PORT_DIPSETTING( 0x00, "Unlimited" )
+ PORT_DIPNAME( 0x08, 0x08, "Display Of Payout Limit" ) PORT_DIPLOCATION("DSW4:4") /* not working */
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, "Type Of Coin D" ) PORT_DIPLOCATION("DSW4:5") /* OK */
+ PORT_DIPSETTING( 0x10, "C-Type" )
+ PORT_DIPSETTING( 0x00, "D-Type" )
+ PORT_DIPNAME( 0x20, 0x20, "Min. Bet For Bonus Play" ) PORT_DIPLOCATION("DSW4:6") /* OK */
+ PORT_DIPSETTING( 0x20, "16 Bet" )
+ PORT_DIPSETTING( 0x00, "8 Bet" )
+ PORT_DIPNAME( 0x40, 0x40, "Reel Speed" ) PORT_DIPLOCATION("DSW4:7") /* OK */
+ PORT_DIPSETTING( 0x40, DEF_STR( Low ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( High ) )
+ PORT_DIPNAME( 0x80, 0x80, "Hopper Out By Coin A" ) PORT_DIPLOCATION("DSW4:8") /* not checked */
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("DSW5")
+ PORT_DIPNAME( 0x01, 0x00, "Display Of Doll On Demo" ) PORT_DIPLOCATION("DSW5:1") /* not working */
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x06, 0x06, "Coin In Limit" ) PORT_DIPLOCATION("DSW5:2,3") /* not checked */
+ PORT_DIPSETTING( 0x06, "1,000" )
+ PORT_DIPSETTING( 0x04, "5,000" )
+ PORT_DIPSETTING( 0x02, "10,000" )
+ PORT_DIPSETTING( 0x00, "20,000" )
+ PORT_DIPNAME( 0x18, 0x18, "Condition For 3 Kind Of Bonus" ) PORT_DIPLOCATION("DSW5:4,5") /* not checked */
+ PORT_DIPSETTING( 0x18, "12-7-1" )
+ PORT_DIPSETTING( 0x10, "9-5-1" )
+ PORT_DIPSETTING( 0x08, "6-3-1" )
+ PORT_DIPSETTING( 0x00, "3-2-1" )
+ PORT_DIPNAME( 0x20, 0x00, "Display Of Doll At All Fr. Bonus" ) PORT_DIPLOCATION("DSW5:6") /* not checked */
+ PORT_DIPSETTING( 0x20, DEF_STR( Low ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( High ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:7") /* listed as unused */
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, "Test Mode For Disp. Of Doll" ) PORT_DIPLOCATION("DSW5:8") /* not working */
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+INPUT_PORTS_END
+
+static INTERRUPT_GEN( vblank_irq )
+{
+ generic_pulse_irq_line(device, NEC_INPUT_LINE_INTP0);
+}
+
+static const gfx_layout cb2001_layout =
+{
+ 8,8,
+ RGN_FRAC(1,1),
+ 4,
+ { 0,1,2,3 },
+ { 8,12,0,4,24,28, 16,20 },
+ { 0*32,1*32,2*32,3*32,4*32,5*32,6*32,7*32 },
+ 8*32
+};
+
+
+static const gfx_layout cb2001_layout32 =
+ {
+ 8,32,
+ RGN_FRAC(1,1),
+ 4,
+ { 0,1,2,3 },
+ { 8,12,0,4,24,28, 16,20 },
+ { 0*32,1*32,2*32,3*32,4*32,5*32,6*32,7*32, 8*32, 9*32, 10*32, 11*32, 12*32, 13*32,14*32,15*32,16*32,17*32,18*32,19*32,20*32,21*32,22*32,23*32,24*32,25*32,26*32,27*32,28*32,29*32,30*32,31*32 },
+ 32*32
+};
+
+static GFXDECODE_START( cb2001 )
+ GFXDECODE_ENTRY( "gfx", 0, cb2001_layout, 0x0, 32 )
+ GFXDECODE_ENTRY( "gfx", 0, cb2001_layout32, 0x0, 32 )
+GFXDECODE_END
+
+static PALETTE_INIT(cb2001)
+{
+ int i;
+ for (i = 0; i < 0x200; i++)
+ {
+ int r,g,b;
+
+ UINT8*proms = machine.region("proms")->base();
+ int length = machine.region("proms")->bytes();
+ UINT16 dat;
+
+ dat = (proms[0x000+i] << 8) | proms[0x200+i];
+
+
+ b = ((dat >> 1) & 0x1f)<<3;
+ r = ((dat >> 6 )& 0x1f)<<3;
+ g = ((dat >> 11 ) & 0x1f)<<3;
+
+ if (length==0x400) // are the cb2001 proms dumped incorrectly?
+ {
+ if (!(i&0x20)) palette_set_color(machine, (i&0x1f) | ((i&~0x3f)>>1), MAKE_RGB(r, g, b));
+ }
+ else
+ {
+ palette_set_color(machine, i, MAKE_RGB(r, g, b));
+ }
+ }
+}
+
+static const ppi8255_interface cb2001_ppi8255_intf[2] =
+{
+ { /* A, B & C set as input */
+ DEVCB_INPUT_PORT("IN0"), /* Port A read */
+ DEVCB_INPUT_PORT("IN1"), /* Port B read */
+ DEVCB_INPUT_PORT("IN2"), /* Port C read */
+ DEVCB_NULL, /* Port A write */
+ DEVCB_NULL, /* Port B write */
+ DEVCB_NULL /* Port C write */
+ },
+ { /* A, B & C set as input */
+ DEVCB_INPUT_PORT("DSW1"), /* Port A read */
+ DEVCB_INPUT_PORT("DSW2"), /* Port B read */
+ DEVCB_INPUT_PORT("DSW3"), /* Port C read */
+ DEVCB_NULL, /* Port A write */
+ DEVCB_NULL, /* Port B write */
+ DEVCB_NULL /* Port C write */
+ }
+};
+
+static const ay8910_interface cb2001_ay8910_config =
+{
+ AY8910_LEGACY_OUTPUT,
+ AY8910_DEFAULT_LOADS,
+ DEVCB_INPUT_PORT("DSW4"),
+ DEVCB_INPUT_PORT("DSW5"),
+ DEVCB_NULL,
+ DEVCB_NULL
+};
+
+static const nec_config cb2001_config = { cb2001_decryption_table, };
+static MACHINE_CONFIG_START( cb2001, cb2001_state )
+ MCFG_CPU_ADD("maincpu", V35, 20000000) // CPU91A-011-0016JK004; encrypted cpu like nec v25/35 used in some irem game
+ MCFG_CPU_CONFIG(cb2001_config)
+ MCFG_CPU_PROGRAM_MAP(cb2001_map)
+ MCFG_CPU_IO_MAP(cb2001_io)
+ MCFG_CPU_VBLANK_INT("screen", vblank_irq)
+
+ MCFG_PPI8255_ADD( "ppi8255_0", cb2001_ppi8255_intf[0] )
+ MCFG_PPI8255_ADD( "ppi8255_1", cb2001_ppi8255_intf[1] )
+
+ MCFG_GFXDECODE(cb2001)
+
+ MCFG_PALETTE_INIT( cb2001 )
+
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
+ MCFG_SCREEN_SIZE(64*8, 64*8)
+ MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 32*8-1)
+ MCFG_SCREEN_UPDATE(cb2001)
+
+ MCFG_PALETTE_LENGTH(0x100)
+
+ MCFG_VIDEO_START(cb2001)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("aysnd", AY8910, 1500000) // wrong
+ MCFG_SOUND_CONFIG(cb2001_ay8910_config)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+MACHINE_CONFIG_END
+
+
+ROM_START( cb2001 )
+ ROM_REGION( 0x040000, "boot_prg", 0 )
+ ROM_LOAD16_WORD( "c01111.11f", 0x020000, 0x20000, CRC(ec6269f1) SHA1(f2428562a10e30192f2c95053f5ce448302e7cf5) )
+
+ ROM_REGION( 0x080000, "gfx", 0 )
+ ROM_LOAD( "c0111.12a", 0x000000, 0x80000, CRC(342b760e) SHA1(bc168bec384ccacd73543f604e3ab5b2b8f4f441) )
+
+ ROM_REGION( 0x400, "proms", 0 ) // ?
+ ROM_LOAD( "am27s29.9b", 0x000, 0x200, CRC(6c90f6a2) SHA1(f3f592954000d189ded0ed8c6c4444ace0b616a4) )
+ ROM_LOAD( "am27s29.11b", 0x200, 0x200, CRC(e5aa3ec7) SHA1(675711dd6788b3d0c37573b49b6297cbcd8c8209) )
+ROM_END
+
+ROM_START( scherrym )
+ ROM_REGION( 0x040000, "boot_prg", 0 )
+ ROM_LOAD16_WORD( "f11.bin", 0x000000, 0x40000, CRC(8967f58d) SHA1(eb01a16b7d108f5fbe5de8f611b4f77869aedbf1) )
+
+ ROM_REGION( 0x080000, "gfx", ROMREGION_ERASEFF )
+// ROM_LOAD( "12a.bin", 0x000000, 0x80000,NO_DUMP ) // missing on PCB - 2 PCBs have been found this way, it probably uploads the GFX.
+
+ ROM_REGION( 0x400, "proms", 0 )
+ ROM_LOAD( "n82s135-1.bin", 0x000, 0x100, CRC(66ed363f) SHA1(65bd37842c441c2e712844b07c0cfe37ef16d0ef) )
+ ROM_LOAD( "n82s135-2.bin", 0x200, 0x100, CRC(a19821db) SHA1(62dda90dd67dfbc0b96f161f1f2b7a46a5805eae) )
+ROM_END
+
+GAME( 2001, cb2001, 0, cb2001, cb2001, 0, ROT0, "Dyna", "Cherry Bonus 2001", GAME_NOT_WORKING|GAME_NO_SOUND )
+GAME( 2001, scherrym, 0, cb2001, cb2001, 0, ROT0, "Dyna", "Super Cherry Master", GAME_NOT_WORKING|GAME_NO_SOUND ) // 2001 version? (we have bootlegs running on z80 hw of a 1996 version)