Previous 199869 Revisions Next

r34712 Wednesday 28th January, 2015 at 23:46:51 UTC by Angelo Salese
Re-added old version drivers for reference. Added debug for vram attribute & 0xf0, which eventually hides blinking ....
[src/mame/drivers]hikaru.c model2.c model3.c naomi.c
[src/mame/machine]315-5881_crypt.c
[src/mess/drivers]c65.c c65_old.c*
[src/mess/machine]c65_old.c*

trunk/src/mame/drivers/hikaru.c
r243223r243224
571571   /* ic66 unpopulated */
572572
573573   // 834-14149   2000     317-0294-COM   Hikaru
574   ROM_PARAMETER( ":rom_board:segam2crypt:key", "291b02c7" )
574   ROM_PARAMETER( ":rom_board:segam2crypt:key", "091b02c7" )
575575ROM_END
576576
577577
r243223r243224
609609   ROM_LOAD32_WORD( "mpr-23564.ic66", 0xe000002, 0x1000000, CRC(255724b6) SHA1(1b382fad165831de3f2e39352c031146759dfc69) )
610610
611611   // 834-14144   2001     317-0297-COM   Hikaru
612   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2912c68a" )
612   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0912c68a" )
613613ROM_END
614614
615615ROM_START( podrace )
r243223r243224
663663
664664   // current 315-5881 decryption simulation code can't produce valid output data with any of keys
665665   // 834-14002   2001     317-0277-COM   Hikaru
666   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2903dad5" )
666   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0903dad5" )
667667ROM_END
668668
669669ROM_START( braveff )
trunk/src/mame/drivers/model2.c
r243223r243224
35713571   ROM_LOAD("mpr-20815.37", 0x600000, 0x200000, CRC(1b5aaae4) SHA1(32b4bf6c096fdccdd5d8f1ddb6c27d3389a52234) )
35723572
35733573   //             1998     317-0236-COM   Model 2
3574   ROM_PARAMETER( ":315_5881:key", "2c2a4a93" )
3574   ROM_PARAMETER( ":315_5881:key", "0c2a4a93" )
35753575
35763576   MODEL2_CPU_BOARD
35773577   MODEL2A_VID_BOARD
r243223r243224
36223622   ROM_LOAD("mpr-20815.37", 0x600000, 0x200000, CRC(1b5aaae4) SHA1(32b4bf6c096fdccdd5d8f1ddb6c27d3389a52234) )
36233623
36243624   //             1998     317-0236-COM   Model 2
3625   ROM_PARAMETER( ":315_5881:key", "2c2a4a93" )
3625   ROM_PARAMETER( ":315_5881:key", "0c2a4a93" )
36263626
36273627   MODEL2_CPU_BOARD
36283628   MODEL2A_VID_BOARD
r243223r243224
36733673   ROM_LOAD("mpr-20815.37", 0x600000, 0x200000, CRC(1b5aaae4) SHA1(32b4bf6c096fdccdd5d8f1ddb6c27d3389a52234) )
36743674
36753675   //             1998     317-0236-COM   Model 2
3676   ROM_PARAMETER( ":315_5881:key", "2c2a4a93" )
3676   ROM_PARAMETER( ":315_5881:key", "0c2a4a93" )
36773677ROM_END
36783678
36793679ROM_START( dyndeka2b ) /* Dynamite Deka 2 (Japan), Model 2B */
r243223r243224
37213721   ROM_LOAD("mpr-20815.37", 0x600000, 0x200000, CRC(1b5aaae4) SHA1(32b4bf6c096fdccdd5d8f1ddb6c27d3389a52234) )
37223722
37233723   //             1998     317-0236-COM   Model 2
3724   ROM_PARAMETER( ":315_5881:key", "2c2a4a93" )
3724   ROM_PARAMETER( ":315_5881:key", "0c2a4a93" )
37253725ROM_END
37263726
37273727ROM_START( dynamcopc ) /* Dynamite Cop (USA), Model 2C */
r243223r243224
37693769   ROM_LOAD("mpr-20815.37", 0x600000, 0x200000, CRC(1b5aaae4) SHA1(32b4bf6c096fdccdd5d8f1ddb6c27d3389a52234) ) /* Located at position 35 on 2C-CRX rom board */
37703770
37713771   //             1998     317-0236-COM   Model 2
3772   ROM_PARAMETER( ":315_5881:key", "2c2a4a93" )
3772   ROM_PARAMETER( ":315_5881:key", "0c2a4a93" )
37733773ROM_END
37743774
37753775ROM_START( schamp ) /* Sonic Championship, Model 2B - Sega ROM board ID# 834-12786 */
trunk/src/mame/drivers/model3.c
r243223r243224
33363336   ROM_FILL( 0x000000, 0x80000, 0 )
33373337
33383338   //             ????     317-0237-COM   Model 3
3339   ROM_PARAMETER( ":315_5881:key", "29234e96" )
3339   ROM_PARAMETER( ":315_5881:key", "09234e96" )
33403340ROM_END
33413341
33423342ROM_START( vs29815 )    /* Step 1.5, ROM board ID# 834-13495 VS2 VER98 STEP 1.5 */
r243223r243224
34893489   ROM_FILL( 0x000000, 0x80000, 0 )
34903490
34913491   //             ????     317-0245-COM   Model 3
3492   ROM_PARAMETER( ":315_5881:key", "29222ac8" )
3492   ROM_PARAMETER( ":315_5881:key", "09222ac8" )
34933493ROM_END
34943494
34953495ROM_START( vs299b ) /* Step 2.0 */
r243223r243224
35673567   ROM_FILL( 0x000000, 0x80000, 0 )
35683568
35693569   //             ????     317-0245-COM   Model 3
3570   ROM_PARAMETER( ":315_5881:key", "29222ac8" )
3570   ROM_PARAMETER( ":315_5881:key", "09222ac8" )
35713571ROM_END
35723572
35733573ROM_START( vs299a ) /* Step 2.0 */
r243223r243224
37233723   ROM_FILL( 0x000000, 0x80000, 0 )
37243724
37253725   //             ????     317-0245-COM   Model 3
3726   ROM_PARAMETER( ":315_5881:key", "29222ac8" )
3726   ROM_PARAMETER( ":315_5881:key", "09222ac8" )
37273727ROM_END
37283728
37293729ROM_START( von2 )   /* Step 2.0 */
r243223r243224
38023802   ROM_FILL( 0x000000, 0x80000, 0 )
38033803
38043804   //             ????     317-0234-COM   Model 3
3805   ROM_PARAMETER( ":315_5881:key", "292a0e97" )
3805   ROM_PARAMETER( ":315_5881:key", "092a0e97" )
38063806ROM_END
38073807
38083808ROM_START( von254g )    /* Step 2.0, Sega game ID# is 833-13789 */
r243223r243224
38813881   ROM_FILL( 0x000000, 0x80000, 0 )
38823882
38833883   //             ????     317-0234-COM   Model 3
3884   ROM_PARAMETER( ":315_5881:key", "292a0e97" )
3884   ROM_PARAMETER( ":315_5881:key", "092a0e97" )
38853885ROM_END
38863886
38873887ROM_START( skichamp )   /* Step 2.0 */
r243223r243224
40284028   ROM_LOAD( "epr21119.ic8",  0x00000, 0x10000, CRC(65082b14) SHA1(6c3c192dd6ef3780c6202dd63fc6086328928818) )
40294029
40304030   //             ????     317-0241-COM   Model 3
4031   ROM_PARAMETER( ":315_5881:key", "31272a01" )
4031   ROM_PARAMETER( ":315_5881:key", "11272a01" )
40324032ROM_END
40334033
40344034ROM_START( swtrilgya )  /* Step 2.1, Sega game ID# is 833-13586, ROM board ID# 834-13587 STAR WARS TRILOGY, Security board ID# 837-13588-COM */
r243223r243224
41004100   ROM_FILL( 0x000000, 0x80000, 0 )
41014101
41024102   //             ????     317-0241-COM   Model 3
4103   ROM_PARAMETER( ":315_5881:key", "31272a01" )
4103   ROM_PARAMETER( ":315_5881:key", "11272a01" )
41044104ROM_END
41054105
41064106ROM_START( dirtdvls )   /* Step 2.1, Sega game ID# is 833-13427, ROM board ID# 834-13528 DRT */
r243223r243224
41644164   ROM_FILL( 0x000000, 0x80000, 0 )
41654165
41664166   //             ????     317-0238-COM   Model 3
4167   ROM_PARAMETER( ":315_5881:key", "29290f17" )
4167   ROM_PARAMETER( ":315_5881:key", "09290f17" )
41684168ROM_END
41694169
41704170ROM_START( dirtdvlsa )  /* Step 2.1 */
r243223r243224
43114311   ROM_LOAD( "epr-20985.bin", 0x000000, 0x010000, CRC(b139481d) SHA1(05fca7db7c8b084c53bd157ba3e8296f1a961a99) )
43124312
43134313   //             ????     317-0239-COM   Model 3
4314   ROM_PARAMETER( ":315_5881:key", "29250e16" )
4314   ROM_PARAMETER( ":315_5881:key", "09250e16" )
43154315ROM_END
43164316
43174317ROM_START( dayto2pe )   /* Step 2.1, Sega game ID# is 833-13610 DAYTONA USA2 SP, ROM board ID# 834-13609 DAYTONA USA2 SP, Security board ID# 837-13645-COM */
r243223r243224
43944394   ROM_LOAD( "epr-20985.bin", 0x000000, 0x010000, CRC(b139481d) SHA1(05fca7db7c8b084c53bd157ba3e8296f1a961a99) )
43954395
43964396   //             ????     317-5045-COM   Model 3
4397   ROM_PARAMETER( ":315_5881:key", "29222cc4" )
4397   ROM_PARAMETER( ":315_5881:key", "0" ) // unknown
43984398ROM_END
43994399
44004400ROM_START( srally2 )    /* Step 2.0, Sega game ID# is 833-13373, ROM board ID# 834-13374 SRT TWIN */
r243223r243224
47494749   ROM_FILL( 0x000000, 0x80000, 0 )
47504750
47514751   //             ????     317-0235-COM   Model 3
4752   ROM_PARAMETER( ":315_5881:key", "29260e96" )
4752   ROM_PARAMETER( ":315_5881:key", "09260e96" )
47534753ROM_END
47544754
47554755ROM_START( spikeout )   /* Step 2.1 */
r243223r243224
48294829   ROM_FILL( 0x000000, 0x80000, 0 )
48304830
48314831   //             ????     317-0240-COM   Model 3
4832   ROM_PARAMETER( ":315_5881:key", "292f2b04" )
4832   ROM_PARAMETER( ":315_5881:key", "092f2b04" )
48334833ROM_END
48344834
48354835ROM_START( spikeofe )   /* Step 2.1, Sega game ID# is 833-13746, ROM board ID# 834-13747 SPK F/E, Security board ID# 837-13726-COM */
r243223r243224
49094909   ROM_FILL( 0x000000, 0x80000, 0 )
49104910
49114911   //             ????     317-0247-COM   Model 3
4912   ROM_PARAMETER( ":315_5881:key", "29236fc8" )
4912   ROM_PARAMETER( ":315_5881:key", "09236fc8" )
49134913ROM_END
49144914
49154915ROM_START( eca )    /* Step 2.1, ROM board ID# 834-13946-01 ECA */
r243223r243224
49804980   ROM_FILL( 0x000000, 0x80000, 0 )
49814981
49824982   //             ????     317-0265-COM   Model 3
4983   ROM_PARAMETER( ":315_5881:key", "2923aa91" )
4983   ROM_PARAMETER( ":315_5881:key", "0923aa91" )
49844984ROM_END
49854985
49864986ROM_START( ecax )   /* Step 2.1 */
r243223r243224
50515051   ROM_FILL( 0x000000, 0x80000, 0 )
50525052
50535053   //             ????     317-0265-COM   Model 3
5054   ROM_PARAMETER( ":315_5881:key", "2923aa91" )
5054   ROM_PARAMETER( ":315_5881:key", "0923aa91" )
50555055ROM_END
50565056
50575057ROM_START( ecap )   /* Step 2.1 - Proto or Location test - No security dongle */
r243223r243224
51255125   ROM_FILL( 0x000000, 0x80000, 0 )
51265126
51275127   //             ????     317-0265-COM   Model 3
5128   ROM_PARAMETER( ":315_5881:key", "2923aa91" )
5128   ROM_PARAMETER( ":315_5881:key", "0923aa91" )
51295129ROM_END
51305130
51315131ROM_START( magtruck )   /* Step 2.1, Sega game ID# is 833-13601-01 (Export), ROM board ID# 834-13600-01 RCS EXP (Export), Security board ID# 837-13599-COM */
r243223r243224
51845184   ROM_FILL( 0x000000, 0x80000, 0 )
51855185
51865186   //             ????     317-0243-COM   Model 3
5187   ROM_PARAMETER( ":315_5881:key", "29266e45" )
5187   ROM_PARAMETER( ":315_5881:key", "09266e45" )
51885188ROM_END
51895189
51905190ROM_START( oceanhun )   /* Step 2.0, Sega game ID# is 833-13571, ROM board ID# 834-13572 THE OCEAN HUNTER, 317-0242-COM security chip (837-13576-COM security board) */
r243223r243224
52555255   ROM_FILL( 0x000000, 0x80000, 0 )
52565256
52575257   //             ????     317-0242-COM   Model 3
5258   ROM_PARAMETER( ":315_5881:key", "292b6a01" )
5258   ROM_PARAMETER( ":315_5881:key", "092b6a01" )
52595259ROM_END
52605260
52615261ROM_START( lamachin )   /* Step 2.0, Sega game ID# is 833-13664, ROM board ID# 834-13665 L.A.MACHINEGUNS, 317-0244-COM security chip (837-13666-COM security board) */
r243223r243224
53275327   ROM_FILL( 0x000000, 0x80000, 0 )
53285328
53295329   //             ????     317-0244-COM   Model 3
5330   ROM_PARAMETER( ":315_5881:key", "292a2bc5" )
5330   ROM_PARAMETER( ":315_5881:key", "092a2bc5" )
53315331ROM_END
53325332
53335333/* Model 3 sound board emulation */
trunk/src/mame/drivers/naomi.c
r243223r243224
32213221   ROM_LOAD("mpr-23427.ic8",   0x4000000, 0x0800000, CRC(5851d525) SHA1(1cb1073542d75a3bcc0d363ed31d49bcaf1fd494) )
32223222
32233223   // 840-0044    2000     317-0289-COM   Naomi
3224   ROM_PARAMETER( ":rom_board:segam2crypt:key", "28103347" )
3224   ROM_PARAMETER( ":rom_board:segam2crypt:key", "08103347" )
32253225ROM_END
32263226
32273227ROM_START( csmasho )
r243223r243224
32403240   ROM_LOAD("mpr-23427.ic8", 0x4000000, 0x0800000, CRC(5851d525) SHA1(1cb1073542d75a3bcc0d363ed31d49bcaf1fd494) )
32413241
32423242   // 840-0044    2000     317-0289-COM   Naomi
3243   ROM_PARAMETER( ":rom_board:segam2crypt:key", "28103347" )
3243   ROM_PARAMETER( ":rom_board:segam2crypt:key", "08103347" )
32443244ROM_END
32453245
32463246/*
r243223r243224
34653465   ROM_LOAD("mpr-22098.ic14s", 0x7000000, 0x0800000, CRC(f9824d2e) SHA1(f20f8cc2b1bef9077ede1cb874da8f2a335d39de) )
34663466
34673467   // 840-0016    1999     317-0262-JPN   Naomi
3468   ROM_PARAMETER( ":rom_board:segam2crypt:key", "280fee35" )
3468   ROM_PARAMETER( ":rom_board:segam2crypt:key", "080fee35" )
34693469ROM_END
34703470
34713471ROM_START( derbyocw )
r243223r243224
36073607   ROM_LOAD("mpr-21574.ic21s", 0xa800000, 0x0800000, CRC(d794a42c) SHA1(a79c7818c6ec993e718494b1d5407eb270a29abe) )
36083608
36093609   // 840-0001    1998     317-0246-JPN   Naomi
3610   ROM_PARAMETER( ":rom_board:segam2crypt:key", "280e6ae1" )
3610   ROM_PARAMETER( ":rom_board:segam2crypt:key", "080e6ae1" )
36113611ROM_END
36123612
36133613/*
r243223r243224
36713671   ROM_LOAD("mpr-22140.ic19s", 0x9800000, 0x0800000, CRC(4cb54893) SHA1(a99b39cc3c82c3cf90f794bb8c8ba60638a6f921) )
36723672
36733673   // 840-0019    1999     317-0269-JPN   Naomi
3674   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2804ae71" )
3674   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0804ae71" )
36753675ROM_END
36763676
36773677ROM_START( smlg99 )
r243223r243224
37043704   ROM_LOAD( "mpr-22058.ic21s", 0xa800000, 0x800000, CRC(f16edaa0) SHA1(e093f5594df43c592a9acd45002ecc65035c2435) )
37053705
37063706   // 840-0012    1999     317-0259-COM   Naomi
3707   ROM_PARAMETER( ":rom_board:segam2crypt:key", "28048a01" )
3707   ROM_PARAMETER( ":rom_board:segam2crypt:key", "08048a01" )
37083708ROM_END
37093709
37103710/*
r243223r243224
37463746   ROM_LOAD("mpr-21901.ic21s", 0xa800000, 0x0800000, CRC(266a3eea) SHA1(795ecc5589a0152b9cf1e03e454ed1ea01501942) )
37473747
37483748   // 834-13842   1999     317-0254-COM   Naomi
3749   ROM_PARAMETER( ":rom_board:segam2crypt:key", "280e8f84" )
3749   ROM_PARAMETER( ":rom_board:segam2crypt:key", "080e8f84" )
37503750
37513751   ROM_REGION( 0x10000, "drivebd", 0 ) /* drive board ROM */
37523752   ROM_LOAD( "epr-21867.bin", 0x000000, 0x010000, CRC(4f93a2a0) SHA1(875907e7fcfc44850e2c60c12268ac61c742f217) )
r243223r243224
37813781   ROM_LOAD( "mpr-22847.ic21s", 0xa800000, 0x800000, CRC(955ad42e) SHA1(e396ca02b5786557434632c4fac56af3a4a9f8ce) )
37823782
37833783   // 834-13950   1999     317-0267-COM   Naomi
3784   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2806efd4" )
3784   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0806efd4" )
37853785ROM_END
37863786
37873787// There is also a development cart (171-7885A). Content is the same.
r243223r243224
38143814   ROM_LOAD( "mpr-23398.ic21s", 0xa800000, 0x800000, CRC(ea4d4d2a) SHA1(3dc9c7164516ae7f3b988c088ab819d8fd40d75e) )
38153815
38163816   // 840-0042    2001     317-0287-COM   Naomi
3817   ROM_PARAMETER( ":rom_board:segam2crypt:key", "281666c6" )
3817   ROM_PARAMETER( ":rom_board:segam2crypt:key", "081666c6" )
38183818ROM_END
38193819
38203820ROM_START( alpiltdx )
r243223r243224
38363836   ROM_LOAD( "mpr-21738.ic11", 0x5800000, 0x800000, CRC(95a592e8) SHA1(862dce467e8805381bab001df68262f1baf3c498) )
38373837
38383838   // 834-?????   1999     317-0251-COM   Naomi
3839   ROM_PARAMETER( ":rom_board:segam2crypt:key", "28070e41" )
3839   ROM_PARAMETER( ":rom_board:segam2crypt:key", "08070e41" )
38403840
38413841   // on-cart X76F100 eeprom contents
38423842   ROM_REGION( 0x84, "naomibd_eeprom", 0 )
r243223r243224
38623862   ROM_LOAD( "mpr-21738.ic11", 0x5800000, 0x800000, CRC(95a592e8) SHA1(862dce467e8805381bab001df68262f1baf3c498) )
38633863
38643864   // 840-0005    1999     317-0251-COM   Naomi
3865   ROM_PARAMETER( ":rom_board:segam2crypt:key", "28070e41" )
3865   ROM_PARAMETER( ":rom_board:segam2crypt:key", "08070e41" )
38663866ROM_END
38673867
38683868ROM_START( hotd2 )
r243223r243224
40004000   ROM_LOAD("mpr-21831.ic11", 0x5800000, 0x0800000, CRC(751848d0) SHA1(9c2267fd3c6f9ea5f2679bb2ca20d511a49b2845) )
40014001
40024002   // 840-0007    1999     317-0253-JPN   Naomi
4003   ROM_PARAMETER( ":rom_board:segam2crypt:key", "28074a61" )
4003   ROM_PARAMETER( ":rom_board:segam2crypt:key", "08074a61" )
40044004ROM_END
40054005
40064006/*
r243223r243224
40904090   ROM_LOAD( "x76f100.ic37", 0x000000, 0x000084, CRC(c79251d5) SHA1(3e70bbbb6d28bade7eec7e27d716463045656f98) )
40914091
40924092   // 840-0008    1999     317-0255-JPN   Naomi
4093   ROM_PARAMETER( ":rom_board:segam2crypt:key", "28028ea5" )
4093   ROM_PARAMETER( ":rom_board:segam2crypt:key", "08028ea5" )
40944094ROM_END
40954095
40964096ROM_START( tduno2 )
r243223r243224
41674167   ROM_LOAD( "mpr-23534.ic10", 0x9800000, 0x1000000, CRC(62ed85b6) SHA1(b88336bc6115c92a839981cb0c0d0a67b1f7eda5) )
41684168
41694169   // 840-0043    2000     317-0288-COM   Naomi
4170   ROM_PARAMETER( ":rom_board:segam2crypt:key", "281c2347" )
4170   ROM_PARAMETER( ":rom_board:segam2crypt:key", "081c2347" )
41714171ROM_END
41724172
41734173ROM_START( crakndj2 )
r243223r243224
42014201   ROM_LOAD( "rom20.ic20s",  0xa000000, 0x800000, CRC(aabcd580) SHA1(9455e218ab381c7ad5adb2884da39ca7948169d5) )
42024202
42034203   // 840-0068    2001     317-0311-COM   Naomi
4204   ROM_PARAMETER( ":rom_board:segam2crypt:key", "28428247" )
4204   ROM_PARAMETER( ":rom_board:segam2crypt:key", "08428247" )
42054205ROM_END
42064206
42074207ROM_START( samba2k )
r243223r243224
42234223   ROM_LOAD( "mpr-23599.ic11", 0x0a800000, 0x1000000, CRC(1fd2e792) SHA1(6f299e527be529f85d0e8b4ce0e7a06ac0d25fe9) )
42244224
42254225   // 840-0047    2000     317-0295-COM   Naomi
4226   ROM_PARAMETER( ":rom_board:segam2crypt:key", "281702cf" )
4226   ROM_PARAMETER( ":rom_board:segam2crypt:key", "081702cf" )
42274227ROM_END
42284228
42294229ROM_START( alienfnt )
r243223r243224
42394239   ROM_LOAD( "mpr-23585.ic5",   0x4800000, 0x1000000, CRC(883a6482) SHA1(e3145710df793b7fd67f02707904416210a71978) )
42404240
42414241   // 840-0048    2001     317-0293-COM   Naomi
4242   ROM_PARAMETER( ":rom_board:segam2crypt:key", "28174343" )
4242   ROM_PARAMETER( ":rom_board:segam2crypt:key", "08174343" )
42434243ROM_END
42444244
42454245ROM_START( alienfnta )
r243223r243224
42554255   ROM_LOAD( "mpr-23585.ic5",   0x4800000, 0x1000000, CRC(883a6482) SHA1(e3145710df793b7fd67f02707904416210a71978) )
42564256
42574257   // 840-0048    2001     317-0293-COM   Naomi
4258   ROM_PARAMETER( ":rom_board:segam2crypt:key", "28174343" )
4258   ROM_PARAMETER( ":rom_board:segam2crypt:key", "08174343" )
42594259ROM_END
42604260
42614261/*
r243223r243224
45184518   ROM_LOAD("mpr-22034.ic10",0x5000000, 0x0800000, CRC(3aa5ce5e) SHA1(f00a906235e4522d6fc2ac771324114346875314) )
45194519
45204520   // 840-0011    1999     317-0257-COM   Naomi
4521   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2802ca85" )
4521   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0802ca85" )
45224522ROM_END
45234523
45244524/* Crazy Taxi */
r243223r243224
45434543   ROM_LOAD( "mpr-21683.ic15s", 0x7800000, 0x800000, CRC(ac8a27e0) SHA1(8e71d853a102dd6c164d5326e6d157ccfb8c7b36) )
45444544
45454545   // 840-0002    1999     317-0248-COM   Naomi
4546   ROM_PARAMETER( ":rom_board:segam2crypt:key", "280d2f45" )
4546   ROM_PARAMETER( ":rom_board:segam2crypt:key", "080d2f45" )
45474547ROM_END
45484548
45494549/* Jambo! Safari */
r243223r243224
45634563   ROM_LOAD( "mpr-22825.ic8",  0x4000000, 0x800000, CRC(85bada10) SHA1(b6e15d8f1d6bca12ffa4816ed0393c04ca500fba) )
45644564
45654565   // 840-0013    1999     317-0264-COM   Naomi
4566   ROM_PARAMETER( ":rom_board:segam2crypt:key", "280fab95" )
4566   ROM_PARAMETER( ":rom_board:segam2crypt:key", "080fab95" )
45674567ROM_END
45684568
45694569/* 18 Wheeler (deluxe) (Rev A) */
r243223r243224
45954595   ROM_LOAD( "mpr-22183.ic20s", 0xa000000, 0x800000, CRC(776af308) SHA1(7d29cb4dce75d34c622549fea7e102868d0da60a) )
45964596
45974597   // 840-0023    2000     317-0273-COM   Naomi
4598   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2807cf54" )
4598   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0807cf54" )
45994599
46004600   // JVS I/O board 837-13844, code is for a Z80 of unknown type (it's inside the big Sega ASIC)
46014601   ROM_REGION( 0x20000, "jvsio", ROMREGION_ERASEFF)
r243223r243224
46374637   ROM_LOAD( "mpr-22183.ic20s", 0xa000000, 0x800000, CRC(776af308) SHA1(7d29cb4dce75d34c622549fea7e102868d0da60a) )
46384638
46394639   // 840-0023    2000     317-0273-COM   Naomi
4640   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2807cf54" )
4640   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0807cf54" )
46414641
46424642   // JVS I/O board 837-13844, code is for a Z80 of unknown type (it's inside the big Sega ASIC)
46434643   ROM_REGION( 0x20000, "jvsio", ROMREGION_ERASEFF)
r243223r243224
46794679   ROM_LOAD( "mpr-22183.ic20s", 0xa000000, 0x800000, CRC(776af308) SHA1(7d29cb4dce75d34c622549fea7e102868d0da60a) )
46804680
46814681   // 840-0023    2000     317-0273-COM   Naomi
4682   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2807cf54" )
4682   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0807cf54" )
46834683
46844684   // JVS I/O board 837-13844, code is for a Z80 of unknown type (it's inside the big Sega ASIC)
46854685   ROM_REGION( 0x20000, "jvsio", ROMREGION_ERASEFF)
r243223r243224
47124712   ROM_LOAD( "mpr-22992.ic15s", 0x7800000, 0x800000, CRC(5eb6c4c6) SHA1(5dc1bced7ebd7d7e01f74d03706ec4a96585628d) )
47134713
47144714   // 840-0025    1999     317-0274-JPN   Naomi
4715   ROM_PARAMETER( ":rom_board:segam2crypt:key", "280b8ef5" )
4715   ROM_PARAMETER( ":rom_board:segam2crypt:key", "080b8ef5" )
47164716ROM_END
47174717
47184718/* Sega Strike Fighter */
r243223r243224
47444744   ROM_LOAD( "mpr-23321.ic20s", 0xa000000, 0x800000, CRC(018627d4) SHA1(2519f39ad046d14f602648fed39bc3719185b55e) )
47454745
47464746   // 840-0035    2000     317-0281-COM   Naomi
4747   ROM_PARAMETER( ":rom_board:segam2crypt:key", "28132303" )
4747   ROM_PARAMETER( ":rom_board:segam2crypt:key", "08132303" )
47484748ROM_END
47494749
47504750// EPR ROM have different number, possible updated/bugfixed re-release or STD/DLX version, difference with original set is unknown, have "Rev.A" label too
r243223r243224
47764776   ROM_LOAD( "mpr-23321.ic20s", 0xa000000, 0x800000, CRC(018627d4) SHA1(2519f39ad046d14f602648fed39bc3719185b55e) )
47774777
47784778   // 840-0035    2000     317-0281-COM   Naomi
4779   ROM_PARAMETER( ":rom_board:segam2crypt:key", "28132303" )
4779   ROM_PARAMETER( ":rom_board:segam2crypt:key", "08132303" )
47804780ROM_END
47814781
47824782
r243223r243224
47964796   ROM_LOAD( "mpr-22915.ic6", 0x3000000, 0x800000, CRC(e48148ac) SHA1(c1273353eeaf9bb6b185f133281d7d04271bc895) )
47974797
47984798   // 840-0018    1999     317-0268-COM   Naomi
4799   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2808ae51" )
4799   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0808ae51" )
48004800ROM_END
48014801
48024802/*
r243223r243224
48534853   ROM_LOAD("mpr-23340.ic17s",0x8800000, 0x0800000, CRC(001604f8) SHA1(615ec027d383d44d4aadb1175be6320e4139d7d1) )
48544854
48554855   // 840-0041    2000     317-0286-COM   Naomi
4856   ROM_PARAMETER( ":rom_board:segam2crypt:key", "281a66ca" )
4856   ROM_PARAMETER( ":rom_board:segam2crypt:key", "081a66ca" )
48574857ROM_END
48584858
48594859
r243223r243224
50615061   ROM_LOAD("mpr-22160.ic19s",0x9800000, 0x0800000, CRC(579eef4e) SHA1(bfcabd57f623647053afcedcabfbc74e5736819f) )
50625062
50635063   // 840-0017    1999     317-0266-COM   Naomi
5064   ROM_PARAMETER( ":rom_board:segam2crypt:key", "280fea94" )
5064   ROM_PARAMETER( ":rom_board:segam2crypt:key", "080fea94" )
50655065ROM_END
50665066
50675067/*
r243223r243224
51545154   ROM_LOAD("mpr-22965.ic16s",0x8000000, 0x0800000, CRC(8f7bfa8a) SHA1(19f137b1552978d232785c4408805b71835585c6) )
51555155
51565156   // 840-0020    1999     317-0270-COM   Naomi
5157   ROM_PARAMETER( ":rom_board:segam2crypt:key", "280a8b5d" )
5157   ROM_PARAMETER( ":rom_board:segam2crypt:key", "080a8b5d" )
51585158ROM_END
51595159
51605160// prototype - only works with US BIOS
r243223r243224
51825182   ROM_LOAD("mpr-22965.ic16s",0x8000000, 0x0800000, CRC(8f7bfa8a) SHA1(19f137b1552978d232785c4408805b71835585c6) )
51835183
51845184   // 840-0020    1999     317-0270-COM   Naomi
5185   ROM_PARAMETER( ":rom_board:segam2crypt:key", "280a8b5d" )
5185   ROM_PARAMETER( ":rom_board:segam2crypt:key", "080a8b5d" )
51865186ROM_END
51875187
51885188/*
r243223r243224
54655465   ROM_LOAD("mpr-22948.ic21s", 0xa800000, 0x0800000, CRC(1b0de917) SHA1(fd1742ea9bb2f1ce871ee3266171f26634e1c8e7) )
54665466
54675467   // 840-0021    2000     317-0271-COM   Naomi
5468   ROM_PARAMETER( ":rom_board:segam2crypt:key", "28068b58" )
5468   ROM_PARAMETER( ":rom_board:segam2crypt:key", "08068b58" )
54695469ROM_END
54705470
54715471ROM_START( virnbap )
r243223r243224
54975497   ROM_LOAD("mpr-22948.ic21s", 0xa800000, 0x0800000, CRC(1b0de917) SHA1(fd1742ea9bb2f1ce871ee3266171f26634e1c8e7) )
54985498
54995499   // 840-0021    2000     317-0271-COM   Naomi
5500   ROM_PARAMETER( ":rom_board:segam2crypt:key", "28068b58" )
5500   ROM_PARAMETER( ":rom_board:segam2crypt:key", "08068b58" )
55015501ROM_END
55025502
55035503/*
r243223r243224
55505550   ROM_LOAD("mpr-21923.ic15s",0x7800000, 0x0400000, CRC(d127d9a5) SHA1(78c95357344ea15469b84fa8b1332e76521892cd) )
55515551
55525552   // 840-0010    1999     317-0258-COM   Naomi
5553   ROM_PARAMETER( ":rom_board:segam2crypt:key", "28088b08" )
5553   ROM_PARAMETER( ":rom_board:segam2crypt:key", "08088b08" )
55545554ROM_END
55555555
55565556/*
r243223r243224
55955595   ROM_LOAD("mpr-22926.ic11",0x5800000, 0x0800000, CRC(57eec89d) SHA1(dd8f9a9155e51ee5260f559449fb0ea245077952) )
55965596
55975597   // 840-0015    1999     317-0263-COM   Naomi
5598   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2803eb15" )
5598   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0803eb15" )
55995599ROM_END
56005600
56015601/*
r243223r243224
56215621   ROM_LOAD( "mpr-22269.ic8", 0x7800000, 0x1000000, CRC(6c0cf740) SHA1(da10b33a6e54afbe1d7e52801216e7119b0b33b1) )
56225622
56235623   // 840-0040    2000     317-0285-COM   Naomi
5624   ROM_PARAMETER( ":rom_board:segam2crypt:key", "281627c3" )
5624   ROM_PARAMETER( ":rom_board:segam2crypt:key", "081627c3" )
56255625ROM_END
56265626
56275627ROM_START( mushik2e )
r243223r243224
59385938   ROM_LOAD("mpr-21726.ic19s",0x9800000, 0x0800000, CRC(429bf290) SHA1(6733e1bcf100e73ab43273f6feedc187fcaa55d4) )
59395939
59405940   // 840-0003    1999     317-0249-COM   Naomi
5941   ROM_PARAMETER( ":rom_board:segam2crypt:key", "28012b41" )
5941   ROM_PARAMETER( ":rom_board:segam2crypt:key", "08012b41" )
59425942ROM_END
59435943
59445944ROM_START( gunsur2 )
r243223r243224
62006200   ROM_LOAD( "maz1ma8.4d",  0x8000000, 0x1000000, CRC(d46c9f40) SHA1(45eec7fa3d4261f12438e841254fa75d572331b3) )
62016201
62026202   // 25869812    2002     317-0266-COM   Naomi
6203   ROM_PARAMETER( ":rom_board:segam2crypt:key", "280fea94" )
6203   ROM_PARAMETER( ":rom_board:segam2crypt:key", "080fea94" )
62046204ROM_END
62056205
62066206ROM_START( mazana )
r243223r243224
62196219   ROM_LOAD( "maz1ma8.4d",  0x8000000, 0x1000000, CRC(d46c9f40) SHA1(45eec7fa3d4261f12438e841254fa75d572331b3) )
62206220
62216221   // 25869812    2002     317-0266-COM   Naomi
6222   ROM_PARAMETER( ":rom_board:segam2crypt:key", "280fea94" )
6222   ROM_PARAMETER( ":rom_board:segam2crypt:key", "080fea94" )
62236223ROM_END
62246224
62256225ROM_START( vtenis2c )
r243223r243224
63926392   ROM_LOAD( "ic16s.bin", 0x8000000, 0x800000, CRC(b8493dbe) SHA1(b641417e1bda49341e7ff86340072d74e3330665) )
63936393
63946394   // 840-0073    2001     317-0316-JPN   Naomi
6395   ROM_PARAMETER( ":rom_board:segam2crypt:key", "294bc3e3" )
6395   ROM_PARAMETER( ":rom_board:segam2crypt:key", "094bc3e3" )
63966396ROM_END
63976397
63986398ROM_START( ringout )
r243223r243224
64136413   ROM_LOAD( "mpr-21770.ic10", 0x5000000, 0x800000, CRC(c5308e61) SHA1(e51f8026351d5ffbda2a5bed39aeef543366febf) )
64146414
64156415   // 840-0004    1999     317-0250-COM   Naomi
6416   ROM_PARAMETER( ":rom_board:segam2crypt:key", "280b1e40" )
6416   ROM_PARAMETER( ":rom_board:segam2crypt:key", "080b1e40" )
64176417ROM_END
64186418
64196419ROM_START( vonot )
r243223r243224
64376437   ROM_LOAD( "mpr-23194.ic13s", 0x6800000, 0x800000, CRC(5adea0bd) SHA1(f8614ba83d5f61556c3db1a1796a02ed2c51ce2a) )
64386438
64396439   // 840-0028    2000     317-0279-COM   Naomi
6440   ROM_PARAMETER( ":rom_board:segam2crypt:key", "28010715" )
6440   ROM_PARAMETER( ":rom_board:segam2crypt:key", "08010715" )
64416441ROM_END
64426442
64436443ROM_START( derbyo2k )
r243223r243224
78017801   ROM_LOAD( "mpr-23662.ic11", 0xa800000, 0x0800000, CRC(d6ef7d68) SHA1(4ee396af6c5caf4c5af6e9ad0e03a7ac2c5039f4) )
78027802
78037803   // 840-0061    2001     317-0310-COM   Naomi 2
7804   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2cee834a" )
7804   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0cee834a" )
78057805ROM_END
78067806
78077807ROM_START( vstrik3cb )
r243223r243224
78237823   ROM_LOAD( "mpr-23662.ic11", 0xa800000, 0x0800000, CRC(d6ef7d68) SHA1(4ee396af6c5caf4c5af6e9ad0e03a7ac2c5039f4) )
78247824
78257825   // 840-0061    2001     317-0310-COM   Naomi 2
7826   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2cee834a" )
7826   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0cee834a" )
78277827ROM_END
78287828
78297829ROM_START( wldrider )
r243223r243224
78447844   ROM_LOAD( "mpr-23620.ic10", 0x9800000, 0x1000000, CRC(67aa15a9) SHA1(42c24cbf7069c27430a71509a872cd1c4224aaeb) )
78457845
78467846   // 840-0046    2001     317-0301-COM   Naomi 2
7847   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2ce7a703" )
7847   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0ce7a703" )
78487848ROM_END
78497849
78507850ROM_START( vf4cart )
r243223r243224
78667866   ROM_LOAD( "mpr-23784.ic11", 0xa800000, 0x1000000, CRC(f74f2fee) SHA1(84b07baa6d116727e66ef27e24ba6484c3393891) )
78677867
78687868   // 840-0080    2002     317-0324-COM   Naomi 2
7869   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2eef2f96" )
7869   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0eef2f96" )
78707870ROM_END
78717871
78727872// There is also a development cart (171-7885A) with 20x 64Mb FlashROMs instead of 10x 128Mb MaskROMs. Content is the same.
r243223r243224
79897989   ROM_LOAD( "mpr-23703.ic11", 0xa800000, 0x1000000, CRC(702b8b4a) SHA1(3a8dfde458f341e7db20664382b9fce2b6e5d462) )
79907990
79917991   // 840-0062    2001     317-0313-COM   Naomi 2
7992   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2ce7d742" )
7992   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0ce7d742" )
79937993ROM_END
79947994
79957995ROM_START( clubkrtd )
r243223r243224
80338033   ROM_LOAD( "mpr-23703.ic11", 0xa800000, 0x1000000, CRC(702b8b4a) SHA1(3a8dfde458f341e7db20664382b9fce2b6e5d462) )
80348034
80358035   // 840-0062    2001     317-0313-COM   Naomi 2
8036   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2ce7d742" )
8036   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0ce7d742" )
80378037ROM_END
80388038
80398039ROM_START( clubkprz )
r243223r243224
80668066   ROM_LOAD( "at25010.ic3s", 0x000000, 0x000084, CRC(0142d8be) SHA1(5922b6c47b12b19e1fa7bbe9aae391905038a7ff) )
80678067
80688068   // 840-0062    2001     317-0313-COM   Naomi 2
8069   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2ce7d742" )
8069   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0ce7d742" )
80708070ROM_END
80718071
80728072ROM_START( clubkpzb )
r243223r243224
80958095   ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 )
80968096
80978097   // 840-0062    2001     317-0313-COM   Naomi 2
8098   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2ce7d742" )
8098   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0ce7d742" )
80998099
81008100   // this dump can't be used as main_eeprom, because that's exactly 0x80 bytes
81018101   ROM_REGION(0x84, "some_eeprom", 0)
r243223r243224
81308130   ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 )
81318131
81328132   // 840-0062    2001     317-0313-COM   Naomi 2
8133   ROM_PARAMETER( ":rom_board:segam2crypt:key", "2ce7d742" )
8133   ROM_PARAMETER( ":rom_board:segam2crypt:key", "0ce7d742" )
81348134ROM_END
81358135
81368136// uses the same mask roms data as clubk2k3, but not in 32bit dissected form, EPR doesn't have checksumms for them, so rom test shows all roms as BAD
trunk/src/mame/machine/315-5881_crypt.c
r243223r243224
148148given plaintext word, and the remaining 2 to the next plaintext word.
149149
150150The underlying block cipher consists of two 4-round Feistel Networks (FN): the first one takes the counter (16 bits),
151the game-key (>=30 bits; probably 64) and the sequence-key (16 bits) and output a middle result (16 bits) which will act
151the game-key (>=29 bits; probably 64) and the sequence-key (16 bits) and output a middle result (16 bits) which will act
152152as another key for the second one. The second FN will take the encrypted word (16 bits), the game-key, the sequence-key
153153and the result from the first FN and will output the decrypted word (16 bits).
154154
r243223r243224
199199that the real key is 64 bits long, exactly as in the related CPS-2 scheme, and the designers tried to cover all 96 input bits with
200200the bits provening from the game key, the sequence key and the result from the first feistel network (64+16+16=96). In the first
201201Feistel Network, as only 80 bits are available, some bits would be used twice (as can be partially seen in the current implementation).
202The fact that only 30 bits out of the expected 64 have been observed till now would be due to the generation of the key by composing
202The fact that only 29 bits out of the expected 64 have been observed till now would be due to the generation of the key by composing
203203low-entropy sources.
204204
205205****************************************************************************************/
r243223r243224
511511
512512const int sega_315_5881_crypt_device::fn1_game_key_scheduling[FN1GK][2] = {
513513   {1,29},  {1,71},  {2,4},   {2,54},  {3,8},   {4,56},  {4,73},  {5,11},
514   {6,51},  {7,92},  {8,89},  {9,9},   {9,39},  {9,58},  {10,90}, {11,6},
515   {12,64}, {13,49}, {14,44}, {15,40}, {16,69}, {17,15}, {18,23}, {18,43},
516   {19,82}, {20,81}, {21,32}, {22,5},  {23,66}, {24,13}, {24,45}, {25,12},
517   {25,35}, {26,61}, {27,10}, {27,59}, {28,25}, {29,86}
514   {6,51},  {7,92},  {8,89},  {9,9},   {9,39},  {9,58},  {9,86},  {10,90},
515   {11,6},  {12,64}, {13,49}, {14,44}, {15,40}, {16,69}, {17,15}, {18,23},
516   {18,43}, {19,82}, {20,81}, {21,32}, {22,5},  {23,66}, {24,13}, {24,45},
517   {25,12}, {25,35}, {26,61}, {27,10}, {27,59}, {28,25}
518518};
519519
520520const int sega_315_5881_crypt_device::fn2_game_key_scheduling[FN2GK][2] = {
521521   {0,0},   {1,3},   {2,11},  {3,20},  {4,22},  {5,23},  {6,29},  {7,38},
522   {8,39},  {9,55},  {9,86},  {9,87},  {10,50}, {11,57}, {12,59}, {13,61},
523   {14,63}, {15,67}, {16,72}, {17,83}, {18,88}, {19,94}, {20,35}, {21,17},
524   {22,6},  {23,85}, {24,16}, {25,25}, {26,92}, {27,47}, {28,28}, {29,90}
522   {8,39},  {9,55},  {9,86},  {9,87},  {9,90},  {10,50}, {11,57}, {12,59},
523   {13,61}, {14,63}, {15,67}, {16,72}, {17,83}, {18,88}, {19,94}, {20,35},
524   {21,17}, {22,6},  {23,85}, {24,16}, {25,25}, {26,92}, {27,47}, {28,28}
525525};
526526
527527const int sega_315_5881_crypt_device::fn1_sequence_key_scheduling[20][2] = {
trunk/src/mess/drivers/c65.c
r243223r243224
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);
r243223r243224
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
r0r243224
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
r0r243224
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