trunk/src/emu/cpu/tms0980/tms0980.c
| r242963 | r242964 | |
| 69 | 69 | */ |
| 70 | 70 | |
| 71 | 71 | /* Microinstructions */ |
| 72 | | #define M_15TN 0x00000001 /* 15 to -ALU */ |
| 73 | | #define M_ATN 0x00000002 /* ACC to -ALU */ |
| 74 | | #define M_AUTA 0x00000004 /* ALU to ACC */ |
| 75 | | #define M_AUTY 0x00000008 /* ALU to Y */ |
| 76 | | #define M_C8 0x00000010 /* CARRY8 to STATUS */ |
| 77 | | #define M_CIN 0x00000020 /* Carry In to ALU */ |
| 78 | | #define M_CKM 0x00000040 /* CKB to MEM */ |
| 79 | | #define M_CKN 0x00000080 /* CKB to -ALU */ |
| 80 | | #define M_CKP 0x00000100 /* CKB to +ALU */ |
| 81 | | #define M_MTN 0x00000200 /* MEM to -ALU */ |
| 82 | | #define M_MTP 0x00000400 /* MEM to +ALU */ |
| 83 | | #define M_NATN 0x00000800 /* ~ACC to -ALU */ |
| 84 | | #define M_NE 0x00001000 /* COMP to STATUS */ |
| 85 | | #define M_STO 0x00002000 /* ACC to MEM */ |
| 86 | | #define M_STSL 0x00004000 /* STATUS to Status Latch */ |
| 87 | | #define M_YTP 0x00008000 /* Y to +ALU */ |
| 72 | #define M_15TN (1<<0) /* 15 to -ALU */ |
| 73 | #define M_ATN (1<<1) /* ACC to -ALU */ |
| 74 | #define M_AUTA (1<<2) /* ALU to ACC */ |
| 75 | #define M_AUTY (1<<3) /* ALU to Y */ |
| 76 | #define M_C8 (1<<4) /* CARRY8 to STATUS */ |
| 77 | #define M_CIN (1<<5) /* Carry In to ALU */ |
| 78 | #define M_CKM (1<<6) /* CKB to MEM */ |
| 79 | #define M_CKN (1<<7) /* CKB to -ALU */ |
| 80 | #define M_CKP (1<<8) /* CKB to +ALU */ |
| 81 | #define M_MTN (1<<9) /* MEM to -ALU */ |
| 82 | #define M_MTP (1<<10) /* MEM to +ALU */ |
| 83 | #define M_NATN (1<<11) /* ~ACC to -ALU */ |
| 84 | #define M_NE (1<<12) /* COMP to STATUS */ |
| 85 | #define M_STO (1<<13) /* ACC to MEM */ |
| 86 | #define M_STSL (1<<14) /* STATUS to Status Latch */ |
| 87 | #define M_YTP (1<<15) /* Y to +ALU */ |
| 88 | 88 | |
| 89 | | #define M_CME 0x00010000 /* Conditional Memory Enable */ |
| 90 | | #define M_DMTP 0x00020000 /* DAM to +ALU */ |
| 91 | | #define M_NDMTP 0x00040000 /* ~DAM to +ALU */ |
| 92 | | #define M_SSE 0x00080000 /* Special Status Enable */ |
| 93 | | #define M_SSS 0x00100000 /* Special Status Sample */ |
| 89 | #define M_CME (1<<16) /* Conditional Memory Enable */ |
| 90 | #define M_DMTP (1<<17) /* DAM to +ALU */ |
| 91 | #define M_NDMTP (1<<18) /* ~DAM to +ALU */ |
| 92 | #define M_SSE (1<<19) /* Special Status Enable */ |
| 93 | #define M_SSS (1<<20) /* Special Status Sample */ |
| 94 | 94 | |
| 95 | | #define M_RSTR 0x00200000 /* -> line #36, F_RSTR (TMS02x0 custom) */ |
| 96 | | #define M_UNK1 0x00400000 /* -> line #37, F_???? (TMS0270 custom) */ |
| 95 | #define M_RSTR (1<<21) /* -> line #36, F_RSTR (TMS02x0 custom) */ |
| 96 | #define M_UNK1 (1<<22) /* -> line #37, F_???? (TMS0270 custom) */ |
| 97 | 97 | |
| 98 | 98 | /* Standard/fixed instructions - these are documented more in their specific handlers below */ |
| 99 | | #define F_BR 0x00000001 |
| 100 | | #define F_CALL 0x00000002 |
| 101 | | #define F_CLO 0x00000004 |
| 102 | | #define F_COMC 0x00000008 |
| 103 | | #define F_COMX 0x00000010 |
| 104 | | #define F_COMX8 0x00000020 |
| 105 | | #define F_LDP 0x00000040 |
| 106 | | #define F_LDX 0x00000080 |
| 107 | | #define F_RBIT 0x00000100 |
| 108 | | #define F_RETN 0x00000200 |
| 109 | | #define F_RSTR 0x00000400 |
| 110 | | #define F_SBIT 0x00000800 |
| 111 | | #define F_SETR 0x00001000 |
| 112 | | #define F_TDO 0x00002000 |
| 99 | #define F_BR (1<<0) |
| 100 | #define F_CALL (1<<1) |
| 101 | #define F_CLO (1<<2) |
| 102 | #define F_COMC (1<<3) |
| 103 | #define F_COMX (1<<4) |
| 104 | #define F_COMX8 (1<<5) |
| 105 | #define F_LDP (1<<6) |
| 106 | #define F_LDX (1<<7) |
| 107 | #define F_RBIT (1<<8) |
| 108 | #define F_RETN (1<<9) |
| 109 | #define F_RSTR (1<<10) |
| 110 | #define F_SBIT (1<<11) |
| 111 | #define F_SETR (1<<12) |
| 112 | #define F_TDO (1<<13) |
| 113 | #define F_TPC (1<<14) |
| 113 | 114 | |
| 114 | | #define F_OFF 0x00004000 |
| 115 | | #define F_REAC 0x00008000 |
| 116 | | #define F_SAL 0x00010000 |
| 117 | | #define F_SBL 0x00020000 |
| 118 | | #define F_SEAC 0x00040000 |
| 119 | | #define F_XDA 0x00080000 |
| 115 | #define F_OFF (1<<15) |
| 116 | #define F_REAC (1<<16) |
| 117 | #define F_SAL (1<<17) |
| 118 | #define F_SBL (1<<18) |
| 119 | #define F_SEAC (1<<19) |
| 120 | #define F_XDA (1<<20) |
| 120 | 121 | |
| 121 | 122 | |
| 122 | 123 | // supported types: |
| r242963 | r242964 | |
| 132 | 133 | // - 20-term output PLA(opla) at the top-left |
| 133 | 134 | // - the ALU is between the opla and mpla |
| 134 | 135 | const device_type TMS1000 = &device_creator<tms1000_cpu_device>; // 28-pin DIP, 11 R pins |
| 135 | | const device_type TMS1070 = &device_creator<tms1070_cpu_device>; // same as tms1000, just supports higher voltage |
| 136 | const device_type TMS1070 = &device_creator<tms1070_cpu_device>; // almost same as tms1000, just supports higher voltage |
| 136 | 137 | const device_type TMS1200 = &device_creator<tms1200_cpu_device>; // 40-pin DIP, 13 R pins |
| 137 | 138 | // TMS1270 has 10 O pins, how does that work? |
| 138 | 139 | |
| 139 | 140 | // TMS1100 is nearly the same as TMS1000, some different opcodes, and with double the RAM and ROM |
| 140 | 141 | const device_type TMS1100 = &device_creator<tms1100_cpu_device>; // 28-pin DIP, 11 R pins |
| 142 | const device_type TMS1170 = &device_creator<tms1170_cpu_device>; // almost same as tms1100, just supports higher voltage |
| 141 | 143 | const device_type TMS1300 = &device_creator<tms1300_cpu_device>; // 40-pin DIP, 16 R pins |
| 144 | const device_type TMS1370 = &device_creator<tms1370_cpu_device>; // almost same as tms1300, just supports higher voltage |
| 142 | 145 | |
| 146 | // TMS1400 follows the TMS1100, it doubles the ROM size again (4 chapters of 16 pages), and adds a 3-level callstack |
| 147 | // - rotate the view and mirror the OR-mask to get the proper layout of the mpla, the default is identical to tms1100 |
| 148 | // - the opla size is increased from 20 to 32 terms |
| 149 | const device_type TMS1400 = &device_creator<tms1400_cpu_device>; // 28-pin DIP, 11 R pins |
| 150 | const device_type TMS1470 = &device_creator<tms1470_cpu_device>; // almost same as tms1400, just supports higher voltage |
| 151 | |
| 143 | 152 | // TMS0980 |
| 144 | 153 | // - 64x9bit RAM array at the bottom-left (set up as 144x4) |
| 145 | 154 | // - 2048x9bit ROM array at the bottom-left |
| r242963 | r242964 | |
| 177 | 186 | AM_RANGE(0x000, 0x7ff) AM_ROM |
| 178 | 187 | ADDRESS_MAP_END |
| 179 | 188 | |
| 189 | static ADDRESS_MAP_START(program_12bit_8, AS_PROGRAM, 8, tms1xxx_cpu_device) |
| 190 | AM_RANGE(0x000, 0xfff) AM_ROM |
| 191 | ADDRESS_MAP_END |
| 180 | 192 | |
| 193 | |
| 181 | 194 | static ADDRESS_MAP_START(data_64x4, AS_DATA, 8, tms1xxx_cpu_device) |
| 182 | 195 | AM_RANGE(0x00, 0x3f) AM_RAM |
| 183 | 196 | ADDRESS_MAP_END |
| r242963 | r242964 | |
| 217 | 230 | : tms1000_cpu_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source) |
| 218 | 231 | { } |
| 219 | 232 | |
| 233 | tms1170_cpu_device::tms1170_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 234 | : tms1100_cpu_device(mconfig, TMS1170, "TMS1170", tag, owner, clock, 8, 11, 6, 8, 3, 11, ADDRESS_MAP_NAME(program_11bit_8), 7, ADDRESS_MAP_NAME(data_128x4), "tms1170", __FILE__) |
| 235 | { } |
| 236 | |
| 220 | 237 | tms1300_cpu_device::tms1300_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 221 | | : tms1100_cpu_device(mconfig, TMS1300, "TMS1200", tag, owner, clock, 8, 16, 6, 8, 3, 11, ADDRESS_MAP_NAME(program_11bit_8), 7, ADDRESS_MAP_NAME(data_128x4), "tms1300", __FILE__) |
| 238 | : tms1100_cpu_device(mconfig, TMS1300, "TMS1300", tag, owner, clock, 8, 16, 6, 8, 3, 11, ADDRESS_MAP_NAME(program_11bit_8), 7, ADDRESS_MAP_NAME(data_128x4), "tms1300", __FILE__) |
| 222 | 239 | { } |
| 223 | 240 | |
| 241 | tms1370_cpu_device::tms1370_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 242 | : tms1100_cpu_device(mconfig, TMS1370, "TMS1370", tag, owner, clock, 8, 16, 6, 8, 3, 11, ADDRESS_MAP_NAME(program_11bit_8), 7, ADDRESS_MAP_NAME(data_128x4), "tms1370", __FILE__) |
| 243 | { } |
| 224 | 244 | |
| 245 | |
| 246 | tms1400_cpu_device::tms1400_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 247 | : tms1100_cpu_device(mconfig, TMS1400, "TMS1400", tag, owner, clock, 8, 11, 6, 8, 3, 12, ADDRESS_MAP_NAME(program_12bit_8), 7, ADDRESS_MAP_NAME(data_128x4), "tms1400", __FILE__) |
| 248 | { } |
| 249 | |
| 250 | tms1400_cpu_device::tms1400_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source) |
| 251 | : tms1100_cpu_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source) |
| 252 | { } |
| 253 | |
| 254 | tms1470_cpu_device::tms1470_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 255 | : tms1400_cpu_device(mconfig, TMS1470, "TMS1470", tag, owner, clock, 8, 10, 6, 8, 3, 12, ADDRESS_MAP_NAME(program_12bit_8), 7, ADDRESS_MAP_NAME(data_128x4), "tms1470", __FILE__) |
| 256 | { } |
| 257 | |
| 258 | |
| 225 | 259 | tms0970_cpu_device::tms0970_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 226 | 260 | : tms1000_cpu_device(mconfig, TMS0970, "TMS0970", tag, owner, clock, 8, 11, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4), "tms0970", __FILE__) |
| 227 | 261 | { } |
| r242963 | r242964 | |
| 264 | 298 | } |
| 265 | 299 | |
| 266 | 300 | |
| 301 | static MACHINE_CONFIG_FRAGMENT(tms1400) |
| 302 | |
| 303 | // microinstructions PLA, output PLA |
| 304 | MCFG_PLA_ADD("mpla", 8, 16, 30) |
| 305 | MCFG_PLA_FILEFORMAT(PLA_FMT_BERKELEY) |
| 306 | MCFG_PLA_ADD("opla", 5, 8, 32) |
| 307 | MCFG_PLA_FILEFORMAT(PLA_FMT_BERKELEY) |
| 308 | MACHINE_CONFIG_END |
| 309 | |
| 310 | machine_config_constructor tms1400_cpu_device::device_mconfig_additions() const |
| 311 | { |
| 312 | return MACHINE_CONFIG_NAME(tms1400); |
| 313 | } |
| 314 | |
| 315 | |
| 267 | 316 | static MACHINE_CONFIG_FRAGMENT(tms0970) |
| 268 | 317 | |
| 269 | 318 | // main opcodes PLA, microinstructions PLA, output PLA, segment PLA |
| r242963 | r242964 | |
| 380 | 429 | m_sr = 0; |
| 381 | 430 | m_pa = 0; |
| 382 | 431 | m_pb = 0; |
| 432 | m_ps = 0; |
| 383 | 433 | m_a = 0; |
| 384 | 434 | m_x = 0; |
| 385 | 435 | m_y = 0; |
| r242963 | r242964 | |
| 417 | 467 | save_item(NAME(m_sr)); |
| 418 | 468 | save_item(NAME(m_pa)); |
| 419 | 469 | save_item(NAME(m_pb)); |
| 470 | save_item(NAME(m_ps)); |
| 420 | 471 | save_item(NAME(m_a)); |
| 421 | 472 | save_item(NAME(m_x)); |
| 422 | 473 | save_item(NAME(m_y)); |
| r242963 | r242964 | |
| 582 | 633 | for (int i = 0x3c; i < 0x40; i++) m_fixed_decode[i] = 0; |
| 583 | 634 | } |
| 584 | 635 | |
| 636 | void tms1400_cpu_device::device_reset() |
| 637 | { |
| 638 | tms1100_cpu_device::device_reset(); |
| 585 | 639 | |
| 640 | // small differences in 00-3f area |
| 641 | m_fixed_decode[0x09] = F_COMX; |
| 642 | m_fixed_decode[0x0b] = F_TPC; |
| 643 | } |
| 644 | |
| 645 | |
| 586 | 646 | void tms0970_cpu_device::device_reset() |
| 587 | 647 | { |
| 588 | 648 | // common reset |
| r242963 | r242964 | |
| 899 | 959 | // fixed opcode set |
| 900 | 960 | //------------------------------------------------- |
| 901 | 961 | |
| 902 | | // TMS1000/common: |
| 962 | // handle branches: |
| 903 | 963 | |
| 964 | // TMS1000/common |
| 965 | // note: add(latch) and bl(branch latch) are specific to 0980 series, |
| 966 | // c(chapter) bits are specific to 1100(and 1400) series |
| 967 | |
| 968 | void tms1xxx_cpu_device::op_br() |
| 969 | { |
| 970 | // BR/BL: conditional branch |
| 971 | if (m_status) |
| 972 | { |
| 973 | if (m_clatch == 0) |
| 974 | m_pa = m_pb; |
| 975 | m_ca = m_cb; |
| 976 | m_pc = m_opcode & m_pc_mask; |
| 977 | } |
| 978 | } |
| 979 | |
| 980 | void tms1xxx_cpu_device::op_call() |
| 981 | { |
| 982 | // CALL/CALLL: conditional call |
| 983 | if (m_status) |
| 984 | { |
| 985 | UINT8 prev_pa = m_pa; |
| 986 | |
| 987 | if (m_clatch == 0) |
| 988 | { |
| 989 | m_clatch = 1; |
| 990 | m_sr = m_pc; |
| 991 | m_pa = m_pb; |
| 992 | m_cs = m_ca; |
| 993 | } |
| 994 | m_ca = m_cb; |
| 995 | m_pb = prev_pa; |
| 996 | m_pc = m_opcode & m_pc_mask; |
| 997 | } |
| 998 | } |
| 999 | |
| 1000 | void tms1xxx_cpu_device::op_retn() |
| 1001 | { |
| 1002 | // RETN: return from subroutine |
| 1003 | if (m_clatch == 1) |
| 1004 | { |
| 1005 | m_clatch = 0; |
| 1006 | m_pc = m_sr; |
| 1007 | m_ca = m_cs; |
| 1008 | } |
| 1009 | m_add = 0; |
| 1010 | m_bl = 0; |
| 1011 | m_pa = m_pb; |
| 1012 | } |
| 1013 | |
| 1014 | |
| 1015 | // TMS1400-specific |
| 1016 | |
| 1017 | void tms1400_cpu_device::op_br() |
| 1018 | { |
| 1019 | // BR/BL: conditional branch |
| 1020 | if (m_status) |
| 1021 | { |
| 1022 | m_pa = m_pb; // don't care about clatch |
| 1023 | m_ca = m_cb; |
| 1024 | m_pc = m_opcode & m_pc_mask; |
| 1025 | } |
| 1026 | } |
| 1027 | |
| 1028 | void tms1400_cpu_device::op_call() |
| 1029 | { |
| 1030 | // CALL/CALLL: conditional call |
| 1031 | if (m_status) |
| 1032 | { |
| 1033 | // 3-level stack, mask clatch 3 bits (no need to mask others) |
| 1034 | m_clatch = (m_clatch << 1 | 1) & 7; |
| 1035 | |
| 1036 | m_sr = m_sr << m_pc_bits | m_pc; |
| 1037 | m_pc = m_opcode & m_pc_mask; |
| 1038 | |
| 1039 | m_ps = m_ps << 4 | m_pa; |
| 1040 | m_pa = m_pb; |
| 1041 | |
| 1042 | m_cs = m_cs << 2 | m_ca; |
| 1043 | m_ca = m_cb; |
| 1044 | } |
| 1045 | else |
| 1046 | { |
| 1047 | m_pb = m_pa; |
| 1048 | m_cb = m_ca; |
| 1049 | } |
| 1050 | } |
| 1051 | |
| 1052 | void tms1400_cpu_device::op_retn() |
| 1053 | { |
| 1054 | // RETN: return from subroutine |
| 1055 | if (m_clatch & 1) |
| 1056 | { |
| 1057 | m_clatch >>= 1; |
| 1058 | |
| 1059 | m_pc = m_sr & m_pc_mask; |
| 1060 | m_sr >>= m_pc_bits; |
| 1061 | |
| 1062 | m_pa = m_pb = m_ps & 0xf; |
| 1063 | m_ps >>= 4; |
| 1064 | |
| 1065 | m_ca = m_cb = m_cs & 3; |
| 1066 | m_cs >>= 2; |
| 1067 | } |
| 1068 | } |
| 1069 | |
| 1070 | |
| 1071 | // handle other: |
| 1072 | |
| 1073 | // TMS1000/common |
| 1074 | |
| 904 | 1075 | void tms1xxx_cpu_device::op_sbit() |
| 905 | 1076 | { |
| 906 | 1077 | // SBIT: set memory bit |
| r242963 | r242964 | |
| 992 | 1163 | } |
| 993 | 1164 | |
| 994 | 1165 | |
| 1166 | // TMS1400-specific |
| 1167 | |
| 1168 | void tms1xxx_cpu_device::op_tpc() |
| 1169 | { |
| 1170 | // TPC: transfer page buffer to chapter buffer |
| 1171 | m_cb = m_pb & 3; |
| 1172 | } |
| 1173 | |
| 1174 | |
| 995 | 1175 | // TMS0970-specific (and possibly child classes) |
| 996 | 1176 | void tms0970_cpu_device::op_setr() |
| 997 | 1177 | { |
| r242963 | r242964 | |
| 1010 | 1190 | |
| 1011 | 1191 | |
| 1012 | 1192 | // TMS0980-specific (and possibly child classes) |
| 1193 | |
| 1013 | 1194 | void tms0980_cpu_device::op_comx() |
| 1014 | 1195 | { |
| 1015 | 1196 | // COMX: complement X register, but not the MSB |
| r242963 | r242964 | |
| 1055 | 1236 | |
| 1056 | 1237 | |
| 1057 | 1238 | // TMS0270-specific |
| 1239 | |
| 1058 | 1240 | void tms0270_cpu_device::op_setr() |
| 1059 | 1241 | { |
| 1060 | 1242 | // same as default, but handle write to output in dynamic_output |
| r242963 | r242964 | |
| 1095 | 1277 | // fetch: rom address 1/2 |
| 1096 | 1278 | |
| 1097 | 1279 | // execute: br/call 2/2 |
| 1098 | | // note: add(latch) and bl(branch latch) are specific to 0980 series, |
| 1099 | | // c(chapter) bits are specific to 1100 series |
| 1100 | | if (m_status) |
| 1101 | | { |
| 1102 | | UINT8 new_pc = m_opcode & m_pc_mask; |
| 1280 | if (m_fixed & F_BR) op_br(); |
| 1281 | if (m_fixed & F_CALL) op_call(); |
| 1282 | if (m_fixed & F_RETN) op_retn(); |
| 1103 | 1283 | |
| 1104 | | // BR: conditional branch |
| 1105 | | if (m_fixed & F_BR) |
| 1106 | | { |
| 1107 | | if (m_clatch == 0) |
| 1108 | | m_pa = m_pb; |
| 1109 | | m_ca = m_cb; |
| 1110 | | m_pc = new_pc; |
| 1111 | | } |
| 1112 | | |
| 1113 | | // CALL: conditional call |
| 1114 | | if (m_fixed & F_CALL) |
| 1115 | | { |
| 1116 | | UINT8 prev_pa = m_pa; |
| 1117 | | if (m_clatch == 0) |
| 1118 | | { |
| 1119 | | m_sr = m_pc; |
| 1120 | | m_clatch = 1; |
| 1121 | | m_pa = m_pb; |
| 1122 | | m_cs = m_ca; |
| 1123 | | } |
| 1124 | | m_ca = m_cb; |
| 1125 | | m_pb = prev_pa; |
| 1126 | | m_pc = new_pc; |
| 1127 | | } |
| 1128 | | } |
| 1129 | | |
| 1130 | | // RETN: return from subroutine |
| 1131 | | if (m_fixed & F_RETN) |
| 1132 | | { |
| 1133 | | if (m_clatch == 1) |
| 1134 | | { |
| 1135 | | m_pc = m_sr; |
| 1136 | | m_clatch = 0; |
| 1137 | | m_ca = m_cs; |
| 1138 | | } |
| 1139 | | m_add = 0; |
| 1140 | | m_bl = 0; |
| 1141 | | m_pa = m_pb; |
| 1142 | | } |
| 1143 | | |
| 1144 | 1284 | // execute: k input valid, read ram, clear alu inputs |
| 1145 | 1285 | dynamic_output(); |
| 1146 | 1286 | set_cki_bus(); |
| r242963 | r242964 | |
| 1216 | 1356 | if (m_fixed & F_COMX8) op_comx8(); |
| 1217 | 1357 | if (m_fixed & F_LDP) op_ldp(); |
| 1218 | 1358 | if (m_fixed & F_COMC) op_comc(); |
| 1359 | if (m_fixed & F_TPC) op_tpc(); |
| 1219 | 1360 | if (m_fixed & F_OFF) op_off(); |
| 1220 | 1361 | if (m_fixed & F_SEAC) op_seac(); |
| 1221 | 1362 | if (m_fixed & F_REAC) op_reac(); |
trunk/src/emu/cpu/tms0980/tms0980.h
| r242963 | r242964 | |
| 106 | 106 | virtual void dynamic_output() { ; } // not used by default |
| 107 | 107 | virtual void read_opcode(); |
| 108 | 108 | |
| 109 | virtual void op_br(); |
| 110 | virtual void op_call(); |
| 111 | virtual void op_retn(); |
| 112 | |
| 109 | 113 | virtual void op_sbit(); |
| 110 | 114 | virtual void op_rbit(); |
| 111 | 115 | virtual void op_setr(); |
| r242963 | r242964 | |
| 118 | 122 | virtual void op_ldp(); |
| 119 | 123 | |
| 120 | 124 | virtual void op_comc(); |
| 125 | virtual void op_tpc(); |
| 121 | 126 | virtual void op_xda(); |
| 122 | 127 | virtual void op_off(); |
| 123 | 128 | virtual void op_seac(); |
| r242963 | r242964 | |
| 134 | 139 | optional_device<pla_device> m_spla; |
| 135 | 140 | |
| 136 | 141 | UINT8 m_pc; // 6 or 7-bit program counter |
| 137 | | UINT8 m_sr; // 6 or 7-bit subroutine return register |
| 142 | UINT32 m_sr; // 6 or 7-bit subroutine return register(s) |
| 138 | 143 | UINT8 m_pa; // 4-bit page address register |
| 139 | 144 | UINT8 m_pb; // 4-bit page buffer register |
| 145 | UINT16 m_ps; // 4-bit page subroutine register(s) |
| 140 | 146 | UINT8 m_a; // 4-bit accumulator |
| 141 | 147 | UINT8 m_x; // 2,3,or 4-bit RAM X register |
| 142 | 148 | UINT8 m_y; // 4-bit RAM Y register |
| 143 | | UINT8 m_ca; // chapter address bit |
| 144 | | UINT8 m_cb; // chapter buffer bit |
| 145 | | UINT8 m_cs; // chapter subroutine bit |
| 149 | UINT8 m_ca; // chapter address register |
| 150 | UINT8 m_cb; // chapter buffer register |
| 151 | UINT16 m_cs; // chapter subroutine register(s) |
| 146 | 152 | UINT16 m_r; |
| 147 | 153 | UINT16 m_o; |
| 148 | 154 | UINT8 m_cki_bus; |
| r242963 | r242964 | |
| 155 | 161 | UINT8 m_status; |
| 156 | 162 | UINT8 m_status_latch; |
| 157 | 163 | UINT8 m_eac; // end around carry bit |
| 158 | | UINT8 m_clatch; // call latch bit |
| 164 | UINT8 m_clatch; // call latch bit(s) |
| 159 | 165 | UINT8 m_add; // add latch bit |
| 160 | 166 | UINT8 m_bl; // branch latch bit |
| 161 | 167 | |
| r242963 | r242964 | |
| 244 | 250 | virtual void op_rstr(); |
| 245 | 251 | }; |
| 246 | 252 | |
| 253 | class tms1170_cpu_device : public tms1100_cpu_device |
| 254 | { |
| 255 | public: |
| 256 | tms1170_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 257 | }; |
| 258 | |
| 247 | 259 | class tms1300_cpu_device : public tms1100_cpu_device |
| 248 | 260 | { |
| 249 | 261 | public: |
| 250 | 262 | tms1300_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 251 | 263 | }; |
| 252 | 264 | |
| 265 | class tms1370_cpu_device : public tms1100_cpu_device |
| 266 | { |
| 267 | public: |
| 268 | tms1370_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 269 | }; |
| 253 | 270 | |
| 271 | |
| 272 | class tms1400_cpu_device : public tms1100_cpu_device |
| 273 | { |
| 274 | public: |
| 275 | tms1400_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 276 | tms1400_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source); |
| 277 | |
| 278 | protected: |
| 279 | // overrides |
| 280 | virtual void device_reset(); |
| 281 | virtual machine_config_constructor device_mconfig_additions() const; |
| 282 | |
| 283 | virtual void op_br(); |
| 284 | virtual void op_call(); |
| 285 | virtual void op_retn(); |
| 286 | |
| 287 | virtual void op_setr() { tms1xxx_cpu_device::op_setr(); } // no anomaly with MSB of X register |
| 288 | virtual void op_rstr() { tms1xxx_cpu_device::op_rstr(); } // " |
| 289 | }; |
| 290 | |
| 291 | class tms1470_cpu_device : public tms1400_cpu_device |
| 292 | { |
| 293 | public: |
| 294 | tms1470_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 295 | }; |
| 296 | |
| 297 | |
| 254 | 298 | class tms0970_cpu_device : public tms1000_cpu_device |
| 255 | 299 | { |
| 256 | 300 | public: |
| r242963 | r242964 | |
| 344 | 388 | extern const device_type TMS1070; |
| 345 | 389 | extern const device_type TMS1200; |
| 346 | 390 | extern const device_type TMS1100; |
| 391 | extern const device_type TMS1170; |
| 347 | 392 | extern const device_type TMS1300; |
| 393 | extern const device_type TMS1370; |
| 394 | extern const device_type TMS1400; |
| 395 | extern const device_type TMS1470; |
| 348 | 396 | extern const device_type TMS0970; |
| 349 | 397 | extern const device_type TMS0980; |
| 350 | 398 | extern const device_type TMS0270; |
trunk/src/emu/netlist/analog/nld_solver.c
| r242963 | r242964 | |
| 44 | 44 | switch (size) |
| 45 | 45 | { |
| 46 | 46 | case 1: |
| 47 | | return new vector_ops_impl_t<1>(); |
| 47 | return nl_alloc(vector_ops_impl_t<1>); |
| 48 | 48 | case 2: |
| 49 | | return new vector_ops_impl_t<2>(); |
| 49 | return nl_alloc(vector_ops_impl_t<2>); |
| 50 | 50 | case 3: |
| 51 | | return new vector_ops_impl_t<3>(); |
| 51 | return nl_alloc(vector_ops_impl_t<3>); |
| 52 | 52 | case 4: |
| 53 | | return new vector_ops_impl_t<4>(); |
| 53 | return nl_alloc(vector_ops_impl_t<4>); |
| 54 | 54 | case 5: |
| 55 | | return new vector_ops_impl_t<5>(); |
| 55 | return nl_alloc(vector_ops_impl_t<5>); |
| 56 | 56 | case 6: |
| 57 | | return new vector_ops_impl_t<6>(); |
| 57 | return nl_alloc(vector_ops_impl_t<6>); |
| 58 | 58 | case 7: |
| 59 | | return new vector_ops_impl_t<7>(); |
| 59 | return nl_alloc(vector_ops_impl_t<7>); |
| 60 | 60 | case 8: |
| 61 | | return new vector_ops_impl_t<8>(); |
| 61 | return nl_alloc(vector_ops_impl_t<8>); |
| 62 | 62 | case 9: |
| 63 | | return new vector_ops_impl_t<9>(); |
| 63 | return nl_alloc(vector_ops_impl_t<9>); |
| 64 | 64 | case 10: |
| 65 | | return new vector_ops_impl_t<10>(); |
| 65 | return nl_alloc(vector_ops_impl_t<10>); |
| 66 | 66 | case 11: |
| 67 | | return new vector_ops_impl_t<11>(); |
| 67 | return nl_alloc(vector_ops_impl_t<11>); |
| 68 | 68 | case 12: |
| 69 | | return new vector_ops_impl_t<12>(); |
| 69 | return nl_alloc(vector_ops_impl_t<12>); |
| 70 | 70 | default: |
| 71 | | return new vector_ops_impl_t<0>(size); |
| 71 | return nl_alloc(vector_ops_impl_t<0>, size); |
| 72 | 72 | } |
| 73 | 73 | } |
| 74 | 74 | |
| r242963 | r242964 | |
| 91 | 91 | m_term[i]->m_Idr1 = &m_Idr[i]; |
| 92 | 92 | m_other_curanalog[i] = &m_term[i]->m_otherterm->net().as_analog().m_cur_Analog; |
| 93 | 93 | } |
| 94 | | |
| 95 | | m_ops = vector_ops_t::create_ops(m_gt.count()); |
| 96 | 94 | } |
| 97 | 95 | |
| 98 | 96 | // ---------------------------------------------------------------------------------------- |
| r242963 | r242964 | |
| 112 | 110 | ATTR_COLD netlist_matrix_solver_t::~netlist_matrix_solver_t() |
| 113 | 111 | { |
| 114 | 112 | for (int i = 0; i < m_inps.count(); i++) |
| 115 | | delete m_inps[i]; |
| 113 | global_free(m_inps[i]); |
| 116 | 114 | } |
| 117 | 115 | |
| 118 | 116 | ATTR_COLD void netlist_matrix_solver_t::setup(netlist_analog_net_t::list_t &nets) |
| r242963 | r242964 | |
| 176 | 174 | |
| 177 | 175 | if (net_proxy_output == NULL) |
| 178 | 176 | { |
| 179 | | net_proxy_output = new netlist_analog_output_t(); |
| 177 | net_proxy_output = nl_alloc(netlist_analog_output_t); |
| 180 | 178 | net_proxy_output->init_object(*this, this->name() + "." + pstring::sprintf("m%d", m_inps.count())); |
| 181 | 179 | m_inps.add(net_proxy_output); |
| 182 | 180 | net_proxy_output->m_proxied_net = &p->net().as_analog(); |
| r242963 | r242964 | |
| 380 | 378 | while (e != NULL) |
| 381 | 379 | { |
| 382 | 380 | netlist_matrix_solver_t * const *en = m_mat_solvers.next(e); |
| 383 | | delete *e; |
| 381 | global_free(*e); |
| 384 | 382 | e = en; |
| 385 | 383 | } |
| 386 | 384 | |
| r242963 | r242964 | |
| 435 | 433 | netlist_matrix_solver_t * NETLIB_NAME(solver)::create_solver(int size, const int gs_threshold, const bool use_specific) |
| 436 | 434 | { |
| 437 | 435 | if (use_specific && m_N == 1) |
| 438 | | return new netlist_matrix_solver_direct1_t(m_params); |
| 436 | return nl_alloc(netlist_matrix_solver_direct1_t, m_params); |
| 439 | 437 | else if (use_specific && m_N == 2) |
| 440 | | return new netlist_matrix_solver_direct2_t(m_params); |
| 438 | return nl_alloc(netlist_matrix_solver_direct2_t, m_params); |
| 441 | 439 | else |
| 442 | 440 | { |
| 441 | typedef netlist_matrix_solver_gauss_seidel_t<m_N,_storage_N> solver_N; |
| 443 | 442 | if (size >= gs_threshold) |
| 444 | | return new netlist_matrix_solver_gauss_seidel_t<m_N,_storage_N>(m_params, size); |
| 443 | return nl_alloc(solver_N, m_params, size); |
| 445 | 444 | else |
| 446 | | return new netlist_matrix_solver_direct_t<m_N, _storage_N>(m_params, size); |
| 445 | return nl_alloc(solver_N, m_params, size); |
| 447 | 446 | } |
| 448 | 447 | } |
| 449 | 448 | |
trunk/src/emu/netlist/nl_base.h
| r242963 | r242964 | |
| 444 | 444 | ATTR_HOT inline const state_e state() const { return m_state; } |
| 445 | 445 | ATTR_HOT inline void set_state(const state_e astate) |
| 446 | 446 | { |
| 447 | | assert(astate != STATE_NONEX); |
| 447 | nl_assert(astate != STATE_NONEX); |
| 448 | 448 | m_state = astate; |
| 449 | 449 | } |
| 450 | 450 | |
| r242963 | r242964 | |
| 453 | 453 | protected: |
| 454 | 454 | ATTR_COLD virtual void save_register() |
| 455 | 455 | { |
| 456 | | save(NAME(m_state)); |
| 456 | save(NLNAME(m_state)); |
| 457 | 457 | netlist_owned_object_t::save_register(); |
| 458 | 458 | } |
| 459 | 459 | |
| r242963 | r242964 | |
| 710 | 710 | */ |
| 711 | 711 | ATTR_COLD inline netlist_sig_t &Q_state_ptr() |
| 712 | 712 | { |
| 713 | | assert(family() == LOGIC); |
| 713 | nl_assert(family() == LOGIC); |
| 714 | 714 | return m_cur_Q; |
| 715 | 715 | } |
| 716 | 716 | |
| r242963 | r242964 | |
| 738 | 738 | |
| 739 | 739 | ATTR_HOT inline const double Q_Analog() const |
| 740 | 740 | { |
| 741 | | //assert(object_type(SIGNAL_MASK) == SIGNAL_ANALOG); |
| 742 | | assert(family() == ANALOG); |
| 741 | //nl_assert(object_type(SIGNAL_MASK) == SIGNAL_ANALOG); |
| 742 | nl_assert(family() == ANALOG); |
| 743 | 743 | return m_cur_Analog; |
| 744 | 744 | } |
| 745 | 745 | |
| 746 | 746 | ATTR_COLD inline double &Q_Analog_state_ptr() |
| 747 | 747 | { |
| 748 | | //assert(object_type(SIGNAL_MASK) == SIGNAL_ANALOG); |
| 749 | | assert(family() == ANALOG); |
| 748 | //nl_assert(object_type(SIGNAL_MASK) == SIGNAL_ANALOG); |
| 749 | nl_assert(family() == ANALOG); |
| 750 | 750 | return m_cur_Analog; |
| 751 | 751 | } |
| 752 | 752 | |
| r242963 | r242964 | |
| 883 | 883 | protected: |
| 884 | 884 | ATTR_COLD virtual void save_register() |
| 885 | 885 | { |
| 886 | | save(NAME(m_param)); |
| 886 | save(NLNAME(m_param)); |
| 887 | 887 | netlist_param_t::save_register(); |
| 888 | 888 | } |
| 889 | 889 | |
| r242963 | r242964 | |
| 905 | 905 | protected: |
| 906 | 906 | ATTR_COLD virtual void save_register() |
| 907 | 907 | { |
| 908 | | save(NAME(m_param)); |
| 908 | save(NLNAME(m_param)); |
| 909 | 909 | netlist_param_t::save_register(); |
| 910 | 910 | } |
| 911 | 911 | |
| r242963 | r242964 | |
| 988 | 988 | |
| 989 | 989 | ATTR_HOT inline const netlist_sig_t INPLOGIC(const netlist_logic_input_t &inp) const |
| 990 | 990 | { |
| 991 | | assert(inp.state() != netlist_input_t::STATE_INP_PASSIVE); |
| 991 | nl_assert(inp.state() != netlist_input_t::STATE_INP_PASSIVE); |
| 992 | 992 | return inp.Q(); |
| 993 | 993 | } |
| 994 | 994 | |
| r242963 | r242964 | |
| 1262 | 1262 | |
| 1263 | 1263 | ATTR_HOT inline netlist_logic_net_t & RESTRICT netlist_net_t::as_logic() |
| 1264 | 1264 | { |
| 1265 | | assert(family() == LOGIC); |
| 1265 | nl_assert(family() == LOGIC); |
| 1266 | 1266 | return static_cast<netlist_logic_net_t &>(*this); |
| 1267 | 1267 | } |
| 1268 | 1268 | |
| 1269 | 1269 | ATTR_HOT inline const netlist_logic_net_t & RESTRICT netlist_net_t::as_logic() const |
| 1270 | 1270 | { |
| 1271 | | assert(family() == LOGIC); |
| 1271 | nl_assert(family() == LOGIC); |
| 1272 | 1272 | return static_cast<const netlist_logic_net_t &>(*this); |
| 1273 | 1273 | } |
| 1274 | 1274 | |
| 1275 | 1275 | ATTR_HOT inline netlist_analog_net_t & RESTRICT netlist_net_t::as_analog() |
| 1276 | 1276 | { |
| 1277 | | assert(family() == ANALOG); |
| 1277 | nl_assert(family() == ANALOG); |
| 1278 | 1278 | return static_cast<netlist_analog_net_t &>(*this); |
| 1279 | 1279 | } |
| 1280 | 1280 | |
| 1281 | 1281 | ATTR_HOT inline const netlist_analog_net_t & RESTRICT netlist_net_t::as_analog() const |
| 1282 | 1282 | { |
| 1283 | | assert(family() == ANALOG); |
| 1283 | nl_assert(family() == ANALOG); |
| 1284 | 1284 | return static_cast<const netlist_analog_net_t &>(*this); |
| 1285 | 1285 | } |
| 1286 | 1286 | |
| r242963 | r242964 | |
| 1370 | 1370 | } |
| 1371 | 1371 | } |
| 1372 | 1372 | |
| 1373 | | |
| 1374 | | // ----------------------------------------------------------------------------- |
| 1375 | | // net_dev class factory |
| 1376 | | // ----------------------------------------------------------------------------- |
| 1377 | | |
| 1378 | | class net_device_t_base_factory |
| 1379 | | { |
| 1380 | | NETLIST_PREVENT_COPYING(net_device_t_base_factory) |
| 1381 | | public: |
| 1382 | | ATTR_COLD net_device_t_base_factory(const pstring &name, const pstring &classname, |
| 1383 | | const pstring &def_param) |
| 1384 | | : m_name(name), m_classname(classname), m_def_param(def_param) |
| 1385 | | {} |
| 1386 | | |
| 1387 | | ATTR_COLD virtual ~net_device_t_base_factory() {} |
| 1388 | | |
| 1389 | | ATTR_COLD virtual netlist_device_t *Create() const = 0; |
| 1390 | | |
| 1391 | | ATTR_COLD const pstring &name() const { return m_name; } |
| 1392 | | ATTR_COLD const pstring &classname() const { return m_classname; } |
| 1393 | | ATTR_COLD const pstring ¶m_desc() const { return m_def_param; } |
| 1394 | | ATTR_COLD const nl_util::pstring_list term_param_list(); |
| 1395 | | ATTR_COLD const nl_util::pstring_list def_params(); |
| 1396 | | |
| 1397 | | protected: |
| 1398 | | pstring m_name; /* device name */ |
| 1399 | | pstring m_classname; /* device class name */ |
| 1400 | | pstring m_def_param; /* default parameter */ |
| 1401 | | }; |
| 1402 | | |
| 1403 | | template <class C> |
| 1404 | | class net_device_t_factory : public net_device_t_base_factory |
| 1405 | | { |
| 1406 | | NETLIST_PREVENT_COPYING(net_device_t_factory) |
| 1407 | | public: |
| 1408 | | ATTR_COLD net_device_t_factory(const pstring &name, const pstring &classname, |
| 1409 | | const pstring &def_param) |
| 1410 | | : net_device_t_base_factory(name, classname, def_param) { } |
| 1411 | | |
| 1412 | | ATTR_COLD netlist_device_t *Create() const |
| 1413 | | { |
| 1414 | | netlist_device_t *r = new C(); |
| 1415 | | //r->init(setup, name); |
| 1416 | | return r; |
| 1417 | | } |
| 1418 | | }; |
| 1419 | | |
| 1420 | | class netlist_factory_t |
| 1421 | | { |
| 1422 | | public: |
| 1423 | | typedef plinearlist_t<net_device_t_base_factory *> list_t; |
| 1424 | | |
| 1425 | | ATTR_COLD netlist_factory_t(); |
| 1426 | | ATTR_COLD ~netlist_factory_t(); |
| 1427 | | |
| 1428 | | ATTR_COLD void initialize(); |
| 1429 | | |
| 1430 | | template<class _C> |
| 1431 | | ATTR_COLD void register_device(const pstring &name, const pstring &classname, |
| 1432 | | const pstring &def_param) |
| 1433 | | { |
| 1434 | | m_list.add(new net_device_t_factory< _C >(name, classname, def_param) ); |
| 1435 | | } |
| 1436 | | |
| 1437 | | ATTR_COLD netlist_device_t *new_device_by_classname(const pstring &classname, netlist_setup_t &setup) const; |
| 1438 | | ATTR_COLD netlist_device_t *new_device_by_name(const pstring &name, netlist_setup_t &setup) const; |
| 1439 | | ATTR_COLD net_device_t_base_factory * factory_by_name(const pstring &name, netlist_setup_t &setup) const; |
| 1440 | | |
| 1441 | | const list_t &list() { return m_list; } |
| 1442 | | |
| 1443 | | private: |
| 1444 | | list_t m_list; |
| 1445 | | |
| 1446 | | }; |
| 1447 | | |
| 1448 | | |
| 1449 | 1373 | #endif /* NLBASE_H_ */ |
trunk/src/emu/netlist/nl_config.h
| r242963 | r242964 | |
| 10 | 10 | |
| 11 | 11 | /* FIXME: at some time, make it compile on it's own */ |
| 12 | 12 | |
| 13 | | #include "emu.h" |
| 13 | #include "osdcore.h" |
| 14 | #include "corealloc.h" |
| 15 | #include <math.h> |
| 16 | #include <exception> |
| 17 | #include <typeinfo> |
| 14 | 18 | |
| 15 | 19 | //============================================================ |
| 16 | 20 | // SETUP |
| r242963 | r242964 | |
| 102 | 106 | #define end_timing(v) do { } while (0) |
| 103 | 107 | #endif |
| 104 | 108 | |
| 109 | // this macro passes an item followed by a string version of itself as two consecutive parameters |
| 110 | #define NLNAME(x) x, #x |
| 105 | 111 | |
| 106 | 112 | //============================================================ |
| 113 | // Exceptions |
| 114 | //============================================================ |
| 115 | |
| 116 | // emu_fatalerror is a generic fatal exception that provides an error string |
| 117 | class nl_fatalerror : public std::exception |
| 118 | { |
| 119 | public: |
| 120 | nl_fatalerror(const char *format, ...) ATTR_PRINTF(2,3) |
| 121 | { |
| 122 | char text[1024]; |
| 123 | va_list ap; |
| 124 | va_start(ap, format); |
| 125 | vsprintf(text, format, ap); |
| 126 | va_end(ap); |
| 127 | osd_printf_error("%s\n", text); |
| 128 | } |
| 129 | nl_fatalerror(const char *format, va_list ap) |
| 130 | { |
| 131 | char text[1024]; |
| 132 | vsprintf(text, format, ap); |
| 133 | osd_printf_error("%s\n", text); |
| 134 | } |
| 135 | }; |
| 136 | |
| 137 | //============================================================ |
| 138 | // Memory allocation |
| 139 | //============================================================ |
| 140 | |
| 141 | #define nl_alloc(T, ...) global_alloc(T(__VA_ARGS__)) |
| 142 | #define nl_alloc_array(T, N) global_alloc_array(T, N) |
| 143 | |
| 144 | #define nl_free(_ptr) global_free(_ptr) |
| 145 | #define nl_free_array(_ptr) global_free_array(_ptr) |
| 146 | |
| 147 | |
| 148 | //============================================================ |
| 149 | // Asserts |
| 150 | //============================================================ |
| 151 | |
| 152 | #ifdef MAME_DEBUG |
| 153 | #define nl_assert(x) do { if (!(x)) throw nl_fatalerror("assert: %s:%d: %s", __FILE__, __LINE__, #x); } while (0) |
| 154 | #define nl_assert_always(x, msg) do { if (!(x)) throw nl_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0) |
| 155 | #else |
| 156 | #define nl_assert(x) do { } while (0) |
| 157 | //#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s (%s:%d)", msg, __FILE__, __LINE__); } while (0) |
| 158 | #define nl_assert_always(x, msg) do { } while (0) |
| 159 | #endif |
| 160 | |
| 161 | //============================================================ |
| 107 | 162 | // Compiling standalone |
| 108 | 163 | //============================================================ |
| 109 | 164 | |
| 110 | 165 | // Compiling without mame ? |
| 111 | 166 | |
| 112 | 167 | #ifndef ATTR_HOT |
| 113 | | //#warning ATTR_HOT not defined |
| 168 | #warning ATTR_HOT not defined |
| 114 | 169 | |
| 115 | 170 | // standard C includes |
| 116 | 171 | #include <math.h> |
| r242963 | r242964 | |
| 132 | 187 | #define UNEXPECTED |
| 133 | 188 | #define ATTR_UNUSED __attribute__((__unused__)) |
| 134 | 189 | |
| 135 | | // this macro passes an item followed by a string version of itself as two consecutive parameters |
| 136 | | #define NAME(x) x, #x |
| 137 | | |
| 138 | 190 | /* 8-bit values */ |
| 139 | 191 | typedef unsigned char UINT8; |
| 140 | 192 | typedef signed char INT8; |
| r242963 | r242964 | |
| 160 | 212 | #endif |
| 161 | 213 | #endif |
| 162 | 214 | |
| 163 | | #ifdef MAME_DEBUG |
| 164 | | #define assert(x) do { if (!(x)) throw emu_fatalerror("assert: %s:%d: %s", __FILE__, __LINE__, #x); } while (0) |
| 165 | | #define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0) |
| 166 | | #else |
| 167 | | #define assert(x) do { } while (0) |
| 168 | | //#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s (%s:%d)", msg, __FILE__, __LINE__); } while (0) |
| 169 | | #define assert_always(x, msg) do { } while (0) |
| 170 | | #endif |
| 171 | | |
| 172 | 215 | /* U64 and S64 are used to wrap long integer constants. */ |
| 173 | 216 | #if defined(__GNUC__) || defined(_MSC_VER) |
| 174 | 217 | #define U64(val) val##ULL |
trunk/src/emu/netlist/nl_factory.c
| r0 | r242964 | |
| 1 | // license:GPL-2.0+ |
| 2 | // copyright-holders:Couriersud |
| 3 | /*************************************************************************** |
| 4 | |
| 5 | nl_factory.c |
| 6 | |
| 7 | Discrete netlist implementation. |
| 8 | |
| 9 | **************************************************************************** |
| 10 | |
| 11 | Couriersud reserves the right to license the code under a less restrictive |
| 12 | license going forward. |
| 13 | |
| 14 | Copyright Nicola Salmoria and the MAME team |
| 15 | All rights reserved. |
| 16 | |
| 17 | Redistribution and use of this code or any derivative works are permitted |
| 18 | provided that the following conditions are met: |
| 19 | |
| 20 | * Redistributions may not be sold, nor may they be used in a commercial |
| 21 | product or activity. |
| 22 | |
| 23 | * Redistributions that are modified from the original source must include the |
| 24 | complete source code, including the source code for all components used by a |
| 25 | binary built from the modified sources. However, as a special exception, the |
| 26 | source code distributed need not include anything that is normally distributed |
| 27 | (in either source or binary form) with the major components (compiler, kernel, |
| 28 | and so on) of the operating system on which the executable runs, unless that |
| 29 | component itself accompanies the executable. |
| 30 | |
| 31 | * Redistributions must reproduce the above copyright notice, this list of |
| 32 | conditions and the following disclaimer in the documentation and/or other |
| 33 | materials provided with the distribution. |
| 34 | |
| 35 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| 36 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 37 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 38 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
| 39 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| 40 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| 41 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| 42 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| 43 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| 44 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| 45 | POSSIBILITY OF SUCH DAMAGE. |
| 46 | |
| 47 | |
| 48 | ****************************************************************************/ |
| 49 | |
| 50 | #include "nl_factory.h" |
| 51 | #include "nl_setup.h" |
| 52 | |
| 53 | netlist_factory_t::netlist_factory_t() |
| 54 | { |
| 55 | } |
| 56 | |
| 57 | netlist_factory_t::~netlist_factory_t() |
| 58 | { |
| 59 | for (net_device_t_base_factory * const *e = m_list.first(); e != NULL; e = m_list.next(e)) |
| 60 | { |
| 61 | net_device_t_base_factory *p = *e; |
| 62 | global_free(p); |
| 63 | } |
| 64 | m_list.clear(); |
| 65 | } |
| 66 | |
| 67 | netlist_device_t *netlist_factory_t::new_device_by_classname(const pstring &classname, netlist_setup_t &setup) const |
| 68 | { |
| 69 | for (net_device_t_base_factory * const *e = m_list.first(); e != NULL; e = m_list.next(e)) |
| 70 | { |
| 71 | net_device_t_base_factory *p = *e; |
| 72 | if (strcmp(p->classname(), classname) == 0) |
| 73 | { |
| 74 | netlist_device_t *ret = p->Create(); |
| 75 | return ret; |
| 76 | } |
| 77 | p++; |
| 78 | } |
| 79 | setup.netlist().error("Class %s not found!\n", classname.cstr()); |
| 80 | return NULL; // appease code analysis |
| 81 | } |
| 82 | |
| 83 | netlist_device_t *netlist_factory_t::new_device_by_name(const pstring &name, netlist_setup_t &setup) const |
| 84 | { |
| 85 | net_device_t_base_factory *f = factory_by_name(name, setup); |
| 86 | return f->Create(); |
| 87 | } |
| 88 | |
| 89 | net_device_t_base_factory * netlist_factory_t::factory_by_name(const pstring &name, netlist_setup_t &setup) const |
| 90 | { |
| 91 | for (net_device_t_base_factory * const *e = m_list.first(); e != NULL; e = m_list.next(e)) |
| 92 | { |
| 93 | net_device_t_base_factory *p = *e; |
| 94 | if (strcmp(p->name(), name) == 0) |
| 95 | { |
| 96 | return p; |
| 97 | } |
| 98 | p++; |
| 99 | } |
| 100 | setup.netlist().error("Class %s not found!\n", name.cstr()); |
| 101 | return NULL; // appease code analysis |
| 102 | } |
trunk/src/emu/ui/devopt.c
| r0 | r242964 | |
| 1 | /********************************************************************* |
| 2 | |
| 3 | ui/devopt.c |
| 4 | |
| 5 | Internal menu for the device configuration. |
| 6 | |
| 7 | Copyright Nicola Salmoria and the MAME Team. |
| 8 | Visit http://mamedev.org for licensing and usage restrictions. |
| 9 | |
| 10 | *********************************************************************/ |
| 11 | |
| 12 | #include "emu.h" |
| 13 | #include "ui/ui.h" |
| 14 | #include "ui/devopt.h" |
| 15 | |
| 16 | /*------------------------------------------------- |
| 17 | ui_device_config - handle the game information |
| 18 | menu |
| 19 | -------------------------------------------------*/ |
| 20 | |
| 21 | ui_menu_device_config::ui_menu_device_config(running_machine &machine, render_container *container, device_slot_interface *slot, device_slot_option *option) : ui_menu(machine, container) |
| 22 | { |
| 23 | astring tmp_tag; |
| 24 | tmp_tag.cpy(slot->device().tag()).cat(":").cat(option->name()); |
| 25 | m_option = option; |
| 26 | m_owner = slot; |
| 27 | m_mounted = false; |
| 28 | |
| 29 | device_iterator deviter(machine.config().root_device()); |
| 30 | for (device_t *device = deviter.first(); device != NULL; device = deviter.next()) |
| 31 | { |
| 32 | if (strcmp(device->tag(), tmp_tag.cstr()) == 0) |
| 33 | { |
| 34 | m_mounted = true; |
| 35 | break; |
| 36 | } |
| 37 | } |
| 38 | } |
| 39 | |
| 40 | void ui_menu_device_config::populate() |
| 41 | { |
| 42 | astring string; |
| 43 | device_t *dev; |
| 44 | |
| 45 | string.printf("[This option is%s currently mounted in the running system]\n\n", m_mounted ? "" : " NOT"); |
| 46 | string.catprintf("Option: %s\n", m_option->name()); |
| 47 | |
| 48 | dev = const_cast<machine_config &>(machine().config()).device_add(&machine().config().root_device(), m_option->name(), m_option->devtype(), 0); |
| 49 | |
| 50 | string.catprintf("Device: %s\n", dev->name()); |
| 51 | if (!m_mounted) |
| 52 | string.cat("\nIf you select this option, the following items will be enabled:\n"); |
| 53 | else |
| 54 | string.cat("\nThe selected option enables the following items:\n"); |
| 55 | |
| 56 | // loop over all CPUs |
| 57 | execute_interface_iterator execiter(*dev); |
| 58 | if (execiter.count() > 0) |
| 59 | { |
| 60 | string.cat("* CPU:\n"); |
| 61 | tagmap_t<UINT8> exectags; |
| 62 | for (device_execute_interface *exec = execiter.first(); exec != NULL; exec = execiter.next()) |
| 63 | { |
| 64 | if (exectags.add(exec->device().tag(), 1, FALSE) == TMERR_DUPLICATE) |
| 65 | continue; |
| 66 | |
| 67 | // get cpu specific clock that takes internal multiplier/dividers into account |
| 68 | int clock = exec->device().clock(); |
| 69 | |
| 70 | // count how many identical CPUs we have |
| 71 | int count = 1; |
| 72 | const char *name = exec->device().name(); |
| 73 | execute_interface_iterator execinneriter(*dev); |
| 74 | for (device_execute_interface *scan = execinneriter.first(); scan != NULL; scan = execinneriter.next()) |
| 75 | { |
| 76 | if (exec->device().type() == scan->device().type() && strcmp(name, scan->device().name()) == 0 && exec->device().clock() == scan->device().clock()) |
| 77 | if (exectags.add(scan->device().tag(), 1, FALSE) != TMERR_DUPLICATE) |
| 78 | count++; |
| 79 | } |
| 80 | |
| 81 | // if more than one, prepend a #x in front of the CPU name |
| 82 | if (count > 1) |
| 83 | string.catprintf(" %d" UTF8_MULTIPLY, count); |
| 84 | else |
| 85 | string.cat(" "); |
| 86 | string.cat(name); |
| 87 | |
| 88 | // display clock in kHz or MHz |
| 89 | if (clock >= 1000000) |
| 90 | string.catprintf(" %d.%06d" UTF8_NBSP "MHz\n", clock / 1000000, clock % 1000000); |
| 91 | else |
| 92 | string.catprintf(" %d.%03d" UTF8_NBSP "kHz\n", clock / 1000, clock % 1000); |
| 93 | } |
| 94 | } |
| 95 | |
| 96 | // display screen information |
| 97 | screen_device_iterator scriter(*dev); |
| 98 | if (scriter.count() > 0) |
| 99 | { |
| 100 | string.cat("* Video:\n"); |
| 101 | for (screen_device *screen = scriter.first(); screen != NULL; screen = scriter.next()) |
| 102 | { |
| 103 | string.catprintf(" Screen '%s': ", screen->tag()); |
| 104 | |
| 105 | if (screen->screen_type() == SCREEN_TYPE_VECTOR) |
| 106 | string.cat("Vector\n"); |
| 107 | else |
| 108 | { |
| 109 | const rectangle &visarea = screen->visible_area(); |
| 110 | |
| 111 | string.catprintf("%d " UTF8_MULTIPLY " %d (%s) %f" UTF8_NBSP "Hz\n", |
| 112 | visarea.width(), visarea.height(), |
| 113 | (machine().system().flags & ORIENTATION_SWAP_XY) ? "V" : "H", |
| 114 | ATTOSECONDS_TO_HZ(screen->frame_period().attoseconds)); |
| 115 | } |
| 116 | } |
| 117 | } |
| 118 | |
| 119 | // loop over all sound chips |
| 120 | sound_interface_iterator snditer(*dev); |
| 121 | if (snditer.count() > 0) |
| 122 | { |
| 123 | string.cat("* Sound:\n"); |
| 124 | tagmap_t<UINT8> soundtags; |
| 125 | for (device_sound_interface *sound = snditer.first(); sound != NULL; sound = snditer.next()) |
| 126 | { |
| 127 | if (soundtags.add(sound->device().tag(), 1, FALSE) == TMERR_DUPLICATE) |
| 128 | continue; |
| 129 | |
| 130 | // count how many identical sound chips we have |
| 131 | int count = 1; |
| 132 | sound_interface_iterator sndinneriter(*dev); |
| 133 | for (device_sound_interface *scan = sndinneriter.first(); scan != NULL; scan = sndinneriter.next()) |
| 134 | { |
| 135 | if (sound->device().type() == scan->device().type() && sound->device().clock() == scan->device().clock()) |
| 136 | if (soundtags.add(scan->device().tag(), 1, FALSE) != TMERR_DUPLICATE) |
| 137 | count++; |
| 138 | } |
| 139 | // if more than one, prepend a #x in front of the CPU name |
| 140 | if (count > 1) |
| 141 | string.catprintf(" %d" UTF8_MULTIPLY, count); |
| 142 | else |
| 143 | string.cat(" "); |
| 144 | string.cat(sound->device().name()); |
| 145 | |
| 146 | // display clock in kHz or MHz |
| 147 | int clock = sound->device().clock(); |
| 148 | if (clock >= 1000000) |
| 149 | string.catprintf(" %d.%06d" UTF8_NBSP "MHz\n", clock / 1000000, clock % 1000000); |
| 150 | else if (clock != 0) |
| 151 | string.catprintf(" %d.%03d" UTF8_NBSP "kHz\n", clock / 1000, clock % 1000); |
| 152 | else |
| 153 | string.cat("\n"); |
| 154 | } |
| 155 | } |
| 156 | |
| 157 | int input = 0, input_mj = 0, input_hana = 0, input_gamble = 0, input_analog = 0, input_adjust = 0; |
| 158 | int dips = 0, confs = 0; |
| 159 | astring errors, dips_opt, confs_opt; |
| 160 | ioport_list portlist; |
| 161 | device_iterator iptiter(*dev); |
| 162 | for (device_t *iptdev = iptiter.first(); iptdev != NULL; iptdev = iptiter.next()) |
| 163 | portlist.append(*iptdev, errors); |
| 164 | |
| 165 | // check if the device adds inputs to the system |
| 166 | for (ioport_port *port = portlist.first(); port != NULL; port = port->next()) |
| 167 | for (ioport_field *field = port->first_field(); field != NULL; field = field->next()) |
| 168 | { |
| 169 | if (field->type() >= IPT_MAHJONG_FIRST && field->type() < IPT_MAHJONG_LAST) |
| 170 | input_mj++; |
| 171 | else if (field->type() >= IPT_HANAFUDA_FIRST && field->type() < IPT_HANAFUDA_LAST) |
| 172 | input_hana++; |
| 173 | else if (field->type() >= IPT_GAMBLING_FIRST && field->type() < IPT_GAMBLING_LAST) |
| 174 | input_gamble++; |
| 175 | else if (field->type() >= IPT_ANALOG_FIRST && field->type() < IPT_ANALOG_LAST) |
| 176 | input_analog++; |
| 177 | else if (field->type() == IPT_ADJUSTER) |
| 178 | input_adjust++; |
| 179 | else if (field->type() >= IPT_START1 && field->type() < IPT_UI_FIRST) |
| 180 | input++; |
| 181 | else if (field->type() == IPT_DIPSWITCH) |
| 182 | { |
| 183 | dips++; |
| 184 | dips_opt.cat(" ").cat(field->name()); |
| 185 | for (ioport_setting *setting = field->first_setting(); setting != NULL; setting = setting->next()) |
| 186 | { |
| 187 | if (setting->value() == field->defvalue()) |
| 188 | { |
| 189 | dips_opt.catprintf(" [default: %s]\n", setting->name()); |
| 190 | break; |
| 191 | } |
| 192 | } |
| 193 | } |
| 194 | else if (field->type() == IPT_CONFIG) |
| 195 | { |
| 196 | confs++; |
| 197 | confs_opt.cat(" ").cat(field->name()); |
| 198 | for (ioport_setting *setting = field->first_setting(); setting != NULL; setting = setting->next()) |
| 199 | { |
| 200 | if (setting->value() == field->defvalue()) |
| 201 | { |
| 202 | confs_opt.catprintf(" [default: %s]\n", setting->name()); |
| 203 | break; |
| 204 | } |
| 205 | } |
| 206 | } |
| 207 | } |
| 208 | |
| 209 | if (dips) |
| 210 | string.cat("* Dispwitch settings:\n").cat(dips_opt); |
| 211 | if (confs) |
| 212 | string.cat("* Configuration settings:\n").cat(confs_opt); |
| 213 | if (input + input_mj + input_hana + input_gamble + input_analog + input_adjust) |
| 214 | string.cat("* Input device(s):\n"); |
| 215 | if (input) |
| 216 | string.catprintf(" Player inputs [%d inputs]\n", input); |
| 217 | if (input_mj) |
| 218 | string.catprintf(" Mahjong inputs [%d inputs]\n", input_mj); |
| 219 | if (input_hana) |
| 220 | string.catprintf(" Hanafuda inputs [%d inputs]\n", input_hana); |
| 221 | if (input_gamble) |
| 222 | string.catprintf(" Gambling inputs [%d inputs]\n", input_gamble); |
| 223 | if (input_analog) |
| 224 | string.catprintf(" Analog inputs [%d inputs]\n", input_analog); |
| 225 | if (input_adjust) |
| 226 | string.catprintf(" Adjuster inputs [%d inputs]\n", input_adjust); |
| 227 | |
| 228 | image_interface_iterator imgiter(*dev); |
| 229 | if (imgiter.count() > 0) |
| 230 | { |
| 231 | string.cat("* Media Options:\n"); |
| 232 | for (const device_image_interface *imagedev = imgiter.first(); imagedev != NULL; imagedev = imgiter.next()) |
| 233 | string.catprintf(" %s [tag: %s]\n", imagedev->image_type_name(), imagedev->device().tag()); |
| 234 | } |
| 235 | |
| 236 | slot_interface_iterator slotiter(*dev); |
| 237 | if (slotiter.count() > 0) |
| 238 | { |
| 239 | string.cat("* Slot Options:\n"); |
| 240 | for (const device_slot_interface *slot = slotiter.first(); slot != NULL; slot = slotiter.next()) |
| 241 | string.catprintf(" %s [default: %s]\n", slot->device().tag(), slot->default_option() ? slot->default_option() : "----"); |
| 242 | } |
| 243 | |
| 244 | if ((execiter.count() + scriter.count() + snditer.count() + imgiter.count() + slotiter.count() + input + input_mj + input_hana + input_gamble + input_analog + input_adjust) == 0) |
| 245 | string.cat("[None]\n"); |
| 246 | |
| 247 | const_cast<machine_config &>(machine().config()).device_remove(&machine().config().root_device(), m_option->name()); |
| 248 | item_append(string, NULL, MENU_FLAG_MULTILINE, NULL); |
| 249 | } |
| 250 | |
| 251 | void ui_menu_device_config::handle() |
| 252 | { |
| 253 | /* process the menu */ |
| 254 | process(0); |
| 255 | } |
| 256 | |
| 257 | ui_menu_device_config::~ui_menu_device_config() |
| 258 | { |
| 259 | } |
trunk/src/emu/ui/filemngr.c
| r242963 | r242964 | |
| 59 | 59 | } |
| 60 | 60 | |
| 61 | 61 | |
| 62 | void ui_menu_file_manager::fill_image_line(device_image_interface *img, astring &instance, astring &filename) |
| 63 | { |
| 64 | // get the image type/id |
| 65 | instance.printf("%s (%s)", img->instance_name(), img->brief_instance_name()); |
| 66 | |
| 67 | // get the base name |
| 68 | if (img->basename() != NULL) |
| 69 | { |
| 70 | filename.cpy(img->basename()); |
| 71 | |
| 72 | // if the image has been loaded through softlist, also show the loaded part |
| 73 | if (img->part_entry() != NULL) |
| 74 | { |
| 75 | const software_part *tmp = img->part_entry(); |
| 76 | if (tmp->name() != NULL) |
| 77 | { |
| 78 | filename.cat(" ("); |
| 79 | filename.cat(tmp->name()); |
| 80 | // also check if this part has a specific part_id (e.g. "Map Disc", "Bonus Disc", etc.), and in case display it |
| 81 | if (img->get_feature("part_id") != NULL) |
| 82 | { |
| 83 | filename.cat(": "); |
| 84 | filename.cat(img->get_feature("part_id")); |
| 85 | } |
| 86 | filename.cat(")"); |
| 87 | } |
| 88 | } |
| 89 | } |
| 90 | else |
| 91 | filename.cpy("---"); |
| 92 | } |
| 93 | |
| 62 | 94 | //------------------------------------------------- |
| 63 | 95 | // populate |
| 64 | 96 | //------------------------------------------------- |
| 65 | 97 | |
| 66 | 98 | void ui_menu_file_manager::populate() |
| 67 | 99 | { |
| 68 | | astring buffer; |
| 69 | | bool first = true; |
| 100 | astring buffer, tmp_inst, tmp_name; |
| 101 | bool first_entry = true; |
| 102 | astring prev_owner; |
| 70 | 103 | |
| 71 | 104 | // cycle through all devices for this system |
| 72 | | image_interface_iterator iter(machine().root_device()); |
| 73 | | for (device_image_interface *image = iter.first(); image != NULL; image = iter.next()) |
| 105 | device_iterator iter(machine().root_device()); |
| 106 | tagmap_t<UINT8> devtags; |
| 107 | for (device_t *dev = iter.first(); dev != NULL; dev = iter.next()) |
| 74 | 108 | { |
| 75 | | if (first) |
| 76 | | first = false; |
| 77 | | else |
| 78 | | item_append("", NULL, MENU_FLAG_DISABLE, NULL); |
| 109 | bool tag_appended = false; |
| 110 | if (devtags.add(dev->tag(), 1, FALSE) == TMERR_DUPLICATE) |
| 111 | continue; |
| 79 | 112 | |
| 80 | | // get the image type/id |
| 81 | | buffer.printf("%s (%s)", image->instance_name(), image->brief_instance_name()); |
| 82 | | item_append(buffer, "", MENU_FLAG_DISABLE, NULL); |
| 83 | | item_append("Device", image->device().tag(), MENU_FLAG_DISABLE, NULL); |
| 84 | | |
| 85 | | // get the base name |
| 86 | | if (image->basename() != NULL) |
| 87 | | { |
| 88 | | buffer.cpy(image->basename()); |
| 89 | | |
| 90 | | // if the image has been loaded through softlist, also show the loaded part |
| 91 | | if (image->part_entry() != NULL) |
| 113 | // check whether it owns an image interface |
| 114 | image_interface_iterator subiter(*dev); |
| 115 | if (subiter.count() > 0) |
| 116 | { |
| 117 | // if so, cycle through all its image interfaces |
| 118 | image_interface_iterator subiter(*dev); |
| 119 | for (device_image_interface *scan = subiter.first(); scan != NULL; scan = subiter.next()) |
| 92 | 120 | { |
| 93 | | const software_part *tmp = image->part_entry(); |
| 94 | | if (tmp->name() != NULL) |
| 95 | | { |
| 96 | | buffer.cat(" ("); |
| 97 | | buffer.cat(tmp->name()); |
| 98 | | // also check if this part has a specific part_id (e.g. "Map Disc", "Bonus Disc", etc.), and in case display it |
| 99 | | if (image->get_feature("part_id") != NULL) |
| 121 | // if it is a children device, and not something further down the device tree, we want it in the menu! |
| 122 | if (strcmp(scan->device().owner()->tag(), dev->tag()) == 0) |
| 123 | if (devtags.add(scan->device().tag(), 1, FALSE) != TMERR_DUPLICATE) |
| 100 | 124 | { |
| 101 | | buffer.cat(": "); |
| 102 | | buffer.cat(image->get_feature("part_id")); |
| 125 | // check whether we already had some devices with the same owner: if not, output the owner tag! |
| 126 | if (!tag_appended) |
| 127 | { |
| 128 | if (first_entry) |
| 129 | first_entry = false; |
| 130 | else |
| 131 | item_append(MENU_SEPARATOR_ITEM, NULL, 0, NULL); |
| 132 | buffer.printf("[root%s]", dev->tag()); |
| 133 | item_append(buffer, NULL, 0, NULL); |
| 134 | tag_appended = true; |
| 135 | } |
| 136 | // finally, append the image interface to the menu |
| 137 | fill_image_line(scan, tmp_inst, tmp_name); |
| 138 | item_append(tmp_inst, tmp_name, 0, (void *) scan); |
| 103 | 139 | } |
| 104 | | buffer.cat(")"); |
| 105 | | } |
| 106 | 140 | } |
| 107 | 141 | } |
| 108 | | else |
| 109 | | buffer.cpy("---"); |
| 110 | | |
| 111 | | // record the menu item |
| 112 | | item_append("Mounted File", buffer, 0, (void *) image); |
| 113 | 142 | } |
| 114 | 143 | item_append(MENU_SEPARATOR_ITEM, NULL, 0, NULL); |
| 115 | 144 | item_append("Reset", NULL, 0, (void *)1); |
trunk/src/mame/audio/mario.c
| r242963 | r242964 | |
| 2 | 2 | #include "cpu/z80/z80.h" |
| 3 | 3 | #include "cpu/mcs48/mcs48.h" |
| 4 | 4 | #include "sound/ay8910.h" |
| 5 | | #include "sound/discrete.h" |
| 6 | 5 | |
| 7 | 6 | #include "includes/mario.h" |
| 8 | 7 | |
| r242963 | r242964 | |
| 39 | 38 | #define I8035_P1_W_AH(M,B,D) I8035_P1_W(M,ACTIVEHIGH_PORT_BIT(I8035_P1_R(M),B,(D))) |
| 40 | 39 | #define I8035_P2_W_AH(M,B,D) I8035_P2_W(M,ACTIVEHIGH_PORT_BIT(I8035_P2_R(M),B,(D))) |
| 41 | 40 | |
| 41 | |
| 42 | #if !OLD_SOUND |
| 43 | |
| 44 | /* ---------------------------------------------------------------------- */ |
| 45 | /* mario sound */ |
| 46 | /* ---------------------------------------------------------------------- */ |
| 47 | static NETLIST_START(nl_mario_snd0) |
| 48 | |
| 49 | RES(R17, RES_K(27)) /* 20 according to parts list */ |
| 50 | /* 27 verified, 30K in schematics */ |
| 51 | CAP(C14, CAP_U(4.7)) /* verified */ |
| 52 | |
| 53 | TTL_74123(2H_A) |
| 54 | NET_C(2H_A.VCC, V5) |
| 55 | NET_C(2H_A.GND, GND) |
| 56 | NET_C(SOUND0.Q, 2H_A.B) |
| 57 | NET_C(GND, 2H_A.A) |
| 58 | NET_C(2H_A.CLRQ, ttlhigh) /* NOT IN SCHEMATICS */ |
| 59 | DIODE(D1, "1N4148") /* FIXME: try to identify */ |
| 60 | TTL_7404_INVERT(1H_A, 2H_A.QQ) |
| 61 | NET_C(R17.1, V5) |
| 62 | NET_C(R17.2, D1.A, C14.1) |
| 63 | NET_C(D1.K, 2H_A.RC) |
| 64 | NET_C(C14.2, 2H_A.C) |
| 65 | |
| 66 | RES(R6, RES_K(4.7)) /* verified */ |
| 67 | CAP(C3, CAP_U(10)) /* verified */ |
| 68 | |
| 69 | NET_C(1H_A.Q, R6.1) |
| 70 | NET_C(R6.2, C3.1, 1J_A.FC) |
| 71 | NET_C(R6.2, 2J_A.FC) |
| 72 | NET_C(C3.2, GND) |
| 73 | |
| 74 | //#define MR_C6 CAP_N(3.9) /* verified */ |
| 75 | |
| 76 | SN74LS629(1J_A, CAP_N(3.9)) |
| 77 | NET_C(1J_A.RNG, V5) |
| 78 | NET_C(1J_A.ENQ, ttllow) |
| 79 | NET_C(GND, 1J_A.GND) |
| 80 | |
| 81 | //#define MR_C17 CAP_N(22) /* verified */ |
| 82 | |
| 83 | SN74LS629(2J_A, CAP_N(22)) |
| 84 | NET_C(2J_A.RNG, V5) |
| 85 | NET_C(2J_A.ENQ, ttllow) |
| 86 | NET_C(GND, 2J_A.GND) |
| 87 | |
| 88 | TTL_7486_XOR(1K_A, 1J_A.Y, 2J_A.Y) |
| 89 | TTL_7408_AND(2K_A, 2H_A.Q, 1K_A) |
| 90 | NETLIST_END() |
| 91 | |
| 92 | /* ---------------------------------------------------------------------- */ |
| 93 | /* skid sound */ |
| 94 | /* ---------------------------------------------------------------------- */ |
| 95 | |
| 96 | // FIXME: Diodes are 1S953 |
| 97 | static NETLIST_START(nl_mario_snd7) |
| 98 | |
| 99 | RES(R61, RES_K(47)) |
| 100 | CAP(C41, CAP_U(4.7)) /* verified */ |
| 101 | |
| 102 | TTL_74123(4L_A) |
| 103 | NET_C(4L_A.VCC, V5) |
| 104 | NET_C(4L_A.GND, GND) |
| 105 | NET_C(SOUND7.Q, 4L_A.B) |
| 106 | NET_C(GND, 4L_A.A) |
| 107 | NET_C(4L_A.CLRQ, ttlhigh) /* NOT IN SCHEMATICS */ |
| 108 | DIODE(D10, "1N4148") /* FIXME: try to identify */ |
| 109 | TTL_7404_INVERT(4J_A, 4L_A.Q) |
| 110 | NET_C(R61.1, V5) |
| 111 | NET_C(R61.2, D10.A, C41.1) |
| 112 | NET_C(D10.K, 4L_A.RC) |
| 113 | NET_C(C41.2, 4L_A.C) |
| 114 | |
| 115 | RES(R65, RES_K(10)) |
| 116 | CAP(C44, CAP_U(3.3)) /* verified */ |
| 117 | |
| 118 | SN74LS629(4K_A, CAP_U(0.022)) |
| 119 | NET_C(4K_A.RNG, V5) |
| 120 | NET_C(4K_A.ENQ, ttllow) |
| 121 | NET_C(GND, 4K_A.GND) |
| 122 | NET_C(R65.1, 4J_A.Q) |
| 123 | NET_C(R65.2, 4K_A.FC, C44.1) |
| 124 | NET_C(C44.2, GND) |
| 125 | |
| 126 | CD_4020(3H, 4K_B.Y, ttllow, V5, GND) |
| 127 | TTL_7404_INVERT(4J_B, 3H.Q12) |
| 128 | |
| 129 | RES(R64, RES_K(20)) |
| 130 | CAP(C43, CAP_U(3.3)) /* verified */ |
| 131 | |
| 132 | SN74LS629(4K_B, CAP_U(0.0047)) |
| 133 | NET_C(4K_B.RNG, V5) |
| 134 | NET_C(4K_B.ENQ, ttllow) |
| 135 | NET_C(GND, 4K_B.GND) |
| 136 | NET_C(R64.1, 4J_B.Q) |
| 137 | NET_C(R64.2, 4K_B.FC, C43.1) |
| 138 | NET_C(C43.2, GND) |
| 139 | |
| 140 | TTL_7486_XOR(1K_C, 3H.Q4, 4K_A.Y) |
| 141 | TTL_7408_AND(2K_C, 4L_A.Q, 1K_C) |
| 142 | |
| 143 | NETLIST_END() |
| 144 | |
| 145 | /* ---------------------------------------------------------------------- */ |
| 146 | /* DAC sound */ |
| 147 | /* ---------------------------------------------------------------------- */ |
| 148 | static NETLIST_START(nl_mario_dac) |
| 149 | RES(R34, RES_M(2)) |
| 150 | RES(R35, RES_M(1)) |
| 151 | RES(R36, RES_M(1.8)) |
| 152 | LM3900(3M_1) |
| 153 | NET_C(3M_1.VM, GND) |
| 154 | NET_C(3M_1.VP, V5) |
| 155 | |
| 156 | NET_C(DAC.VOUT, R34.1) |
| 157 | NET_C(3M_1.MINUS, R34.2, R35.2) |
| 158 | NET_C(3M_1.OUT, R35.1) |
| 159 | NET_C(3M_1.PLUS, R36.1) |
| 160 | NET_C(R36.2, GND) |
| 161 | |
| 162 | RES(R21, RES_M(1.8)) |
| 163 | RES(R23, RES_K(10)) |
| 164 | RES(R25, RES_K(10)) |
| 165 | RES(R37, RES_K(750)) |
| 166 | RES(R38, RES_K(360)) |
| 167 | RES(R39, RES_K(750)) |
| 168 | |
| 169 | CAP(C18, CAP_P(100)) |
| 170 | CAP(C19, CAP_U(10)) |
| 171 | CAP(C20, CAP_U(1)) |
| 172 | CAP(C30, CAP_P(100)) |
| 173 | |
| 174 | LM3900(3M_2) |
| 175 | NET_C(3M_2.VM, GND) |
| 176 | NET_C(3M_2.VP, V5) |
| 177 | |
| 178 | NET_C(R35.1, C20.1) |
| 179 | NET_C(C20.2, R37.1) |
| 180 | NET_C(R37.2, R38.2, C18.1, R39.2) |
| 181 | |
| 182 | NET_C(C18.2, GND) |
| 183 | NET_C(R38.1, C30.2, 3M_2.MINUS) |
| 184 | NET_C(3M_2.OUT, R39.1, C30.1) |
| 185 | |
| 186 | NET_C(R21.1, 3M_2.PLUS) |
| 187 | NET_C(R21.2, C19.1, R25.2, R23.1) |
| 188 | NET_C(C19.2, R23.2, GND) |
| 189 | NET_C(R25.1, V5) |
| 190 | NETLIST_END() |
| 191 | |
| 192 | static NETLIST_START(nl_mario) |
| 193 | |
| 194 | /* Standard stuff */ |
| 195 | |
| 196 | SOLVER(Solver, 48000) |
| 197 | PARAM(Solver.ACCURACY, 1e-8) |
| 198 | PARAM(Solver.SOR_FACTOR, 1.0) |
| 199 | PARAM(Solver.GS_THRESHOLD, 5) |
| 200 | PARAM(Solver.GS_LOOPS, 4) |
| 201 | //PARAM(Solver.LTE, 5e-2) // Default is not enough for paddle control |
| 202 | PARAM(Solver.DYNAMIC_TS, 0) |
| 203 | ANALOG_INPUT(V5, 5) |
| 204 | |
| 205 | TTL_INPUT(SOUND0, 1) |
| 206 | INCLUDE(nl_mario_snd0) |
| 207 | |
| 208 | TTL_INPUT(SOUND7, 1) |
| 209 | INCLUDE(nl_mario_snd7) |
| 210 | |
| 211 | R2R_DAC(DAC, 3.4, 10000.0, 8) |
| 212 | NET_C(DAC.VGND, GND) |
| 213 | |
| 214 | INCLUDE(nl_mario_dac) |
| 215 | |
| 216 | /* ---------------------------------------------------------------------- */ |
| 217 | /* mixing */ |
| 218 | /* ---------------------------------------------------------------------- */ |
| 219 | |
| 220 | RES(R20, RES_K(22)) /* verified */ |
| 221 | RES(R19, RES_K(22)) /* verified */ |
| 222 | RES(R40, RES_K(22)) /* verified */ |
| 223 | RES(R41, RES_K(100)) /* verified */ |
| 224 | CAP(C31, CAP_U(0.022)) /* */ |
| 225 | |
| 226 | NET_C(2K_A.Q, R20.1) |
| 227 | NET_C(GND, R19.1) //FIXME |
| 228 | NET_C(2K_C.Q, R41.1) |
| 229 | |
| 230 | #if 1 |
| 231 | RES(DUM, RES_K(22)) |
| 232 | NET_C(R39.1, DUM.1) |
| 233 | NET_C(DUM.2, GND) |
| 234 | FRONTIER(front1, R39.1, R40.1) |
| 235 | #else |
| 236 | NET_C(R39.1, R40.1) |
| 237 | #endif |
| 238 | |
| 239 | NET_C(R20.2, R19.2, R40.2, R41.2, C31.1) |
| 240 | NET_C(C31.2, GND) |
| 241 | |
| 242 | CAP(C32, CAP_U(1)) /* verified */ |
| 243 | RES(R42, RES_K(43)) /* verified */ |
| 244 | RES(R43, RES_K(100)) /* verified */ |
| 245 | |
| 246 | NET_C(C31.1, C32.1) |
| 247 | NET_C(C32.2, R42.1, R43.2, Q10.B) |
| 248 | //NET_C(C32.2, R42.1, R43.2) |
| 249 | NET_C(R43.1, V5) |
| 250 | NET_C(R42.2, GND) |
| 251 | #if 1 |
| 252 | RES(R63, RES_K(1)) /* */ |
| 253 | RES(R62, 150) /* */ |
| 254 | |
| 255 | QBJT_EB(Q10, "2SC1815") |
| 256 | |
| 257 | NET_C(R62.2, GND) |
| 258 | NET_C(R62.1, Q10.E) |
| 259 | |
| 260 | NET_C(R63.1, V5) |
| 261 | NET_C(R63.2, Q10.C) |
| 262 | |
| 263 | CAP(C42, CAP_U(0.1)) |
| 264 | CAP(C47, CAP_U(4.7)) |
| 265 | RES(VR1, RES_K(10)) |
| 266 | |
| 267 | NET_C(C42.1, C47.1, R62.1) |
| 268 | NET_C(C42.2, GND) |
| 269 | NET_C(C47.2, VR1.1) |
| 270 | NET_C(VR1.2, GND) |
| 271 | #endif |
| 272 | /* ---------------------------------------------------------------------- */ |
| 273 | /* Output */ |
| 274 | /* ---------------------------------------------------------------------- */ |
| 275 | |
| 276 | RES(ROUT, 1000000) |
| 277 | |
| 278 | //NET_C(Q10.C, ROUT.1) |
| 279 | //NET_C(R43.2, ROUT.1) |
| 280 | NET_C(VR1.1, ROUT.1) |
| 281 | |
| 282 | NET_C(GND, ROUT.2) |
| 283 | |
| 284 | NETLIST_END() |
| 285 | |
| 286 | #else |
| 42 | 287 | /**************************************************************** |
| 43 | 288 | * |
| 44 | 289 | * Discrete Sound defines |
| r242963 | r242964 | |
| 390 | 635 | DISCRETE_TASK_END() |
| 391 | 636 | |
| 392 | 637 | DISCRETE_SOUND_END |
| 393 | | |
| 638 | #endif |
| 394 | 639 | /**************************************************************** |
| 395 | 640 | * |
| 396 | 641 | * EA / Banking |
| r242963 | r242964 | |
| 498 | 743 | |
| 499 | 744 | WRITE8_MEMBER(mario_state::mario_sh_sound_w) |
| 500 | 745 | { |
| 746 | #if OLD_SOUND |
| 501 | 747 | m_discrete->write(space, DS_DAC, data); |
| 748 | #else |
| 749 | m_audio_dac->write(data); |
| 750 | #endif |
| 502 | 751 | } |
| 503 | 752 | |
| 504 | 753 | WRITE8_MEMBER(mario_state::mario_sh_p1_w) |
| r242963 | r242964 | |
| 538 | 787 | /* Mario running sample */ |
| 539 | 788 | WRITE8_MEMBER(mario_state::mario_sh1_w) |
| 540 | 789 | { |
| 790 | #if OLD_SOUND |
| 541 | 791 | m_discrete->write(space, DS_SOUND0_INP, 0); |
| 792 | #else |
| 793 | m_audio_snd0->write(data); |
| 794 | #endif |
| 542 | 795 | } |
| 543 | 796 | |
| 544 | 797 | /* Luigi running sample */ |
| 545 | 798 | WRITE8_MEMBER(mario_state::mario_sh2_w) |
| 546 | 799 | { |
| 800 | #if OLD_SOUND |
| 547 | 801 | m_discrete->write(space, DS_SOUND1_INP, 0); |
| 802 | #endif |
| 548 | 803 | } |
| 549 | 804 | |
| 550 | 805 | /* Misc samples */ |
| r242963 | r242964 | |
| 577 | 832 | I8035_P1_W_AH(space, 3, data & 1); |
| 578 | 833 | break; |
| 579 | 834 | case 7: /* skid */ |
| 835 | #if OLD_SOUND |
| 580 | 836 | machine().device<discrete_device>("discrete")->write(space, DS_SOUND7_INP, data & 1); |
| 837 | #else |
| 838 | m_audio_snd7->write((data & 1) ^ 1); |
| 839 | #endif |
| 581 | 840 | break; |
| 582 | 841 | } |
| 583 | 842 | } |
| r242963 | r242964 | |
| 626 | 885 | MCFG_CPU_IO_MAP(mario_sound_io_map) |
| 627 | 886 | |
| 628 | 887 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 888 | |
| 889 | #if OLD_SOUND |
| 629 | 890 | MCFG_SOUND_ADD("discrete", DISCRETE, 0) |
| 630 | 891 | MCFG_DISCRETE_INTF(mario) |
| 631 | 892 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1) |
| 893 | #else |
| 894 | MCFG_SOUND_ADD("snd_nl", NETLIST_SOUND, 48000) |
| 895 | MCFG_NETLIST_SETUP(nl_mario) |
| 896 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) |
| 632 | 897 | |
| 898 | MCFG_NETLIST_LOGIC_INPUT("snd_nl", "snd0", "SOUND0.IN", 0, 1) |
| 899 | MCFG_NETLIST_LOGIC_INPUT("snd_nl", "snd7", "SOUND7.IN", 0, 1) |
| 900 | MCFG_NETLIST_LOGIC_INPUT("snd_nl", "dac", "DAC.VAL", 0, 255) |
| 901 | |
| 902 | MCFG_NETLIST_STREAM_OUTPUT("snd_nl", 0, "ROUT.1") |
| 903 | MCFG_NETLIST_ANALOG_MULT_OFFSET(150000.0, 0.0) |
| 904 | #endif |
| 905 | |
| 633 | 906 | MACHINE_CONFIG_END |
| 634 | 907 | |
| 635 | 908 | MACHINE_CONFIG_FRAGMENT( masao_audio ) |
trunk/src/mame/drivers/aleck64.c
| r242963 | r242964 | |
| 103 | 103 | JAPAN |
| 104 | 104 | |
| 105 | 105 | |
| 106 | | On bootup, they also mention 'T.L.S' (Temporary Landing System), which seems |
| 107 | | to be the hardware system, designed by Arika Co. Ltd. |
| 108 | 106 | |
| 109 | 107 | |
| 110 | 108 | PCB Layout |
| r242963 | r242964 | |
| 185 | 183 | DECLARE_DRIVER_INIT(aleck64); |
| 186 | 184 | DECLARE_WRITE32_MEMBER(aleck_dips_w); |
| 187 | 185 | DECLARE_READ32_MEMBER(aleck_dips_r); |
| 186 | DECLARE_READ16_MEMBER(e90_prot_r); |
| 187 | DECLARE_WRITE16_MEMBER(e90_prot_w); |
| 188 | 188 | private: |
| 189 | 189 | UINT32 m_dip_read_offset; |
| 190 | 190 | }; |
| r242963 | r242964 | |
| 311 | 311 | AM_RANGE(0x1fc00000, 0x1fc007bf) AM_ROM AM_REGION("user1", 0) // PIF ROM |
| 312 | 312 | AM_RANGE(0x1fc007c0, 0x1fc007ff) AM_DEVREADWRITE("rcp", n64_periphs, pif_ram_r, pif_ram_w) |
| 313 | 313 | |
| 314 | | /* |
| 315 | | Surely this should mirror main ram? srmvs crashes, and |
| 316 | | vivdolls overwrites it's memory test code if it does mirror |
| 317 | | */ |
| 318 | | AM_RANGE(0xc0000000, 0xc07fffff) AM_RAM |
| 314 | AM_RANGE(0xc0000000, 0xc07fffff) AM_RAM // SDRAM, Aleck 64 specific |
| 319 | 315 | |
| 320 | 316 | AM_RANGE(0xc0800000, 0xc0800fff) AM_READWRITE(aleck_dips_r,aleck_dips_w) |
| 321 | | AM_RANGE(0xd0000000, 0xd00fffff) AM_RAM // mtetrisc, write only, mirror? |
| 317 | ADDRESS_MAP_END |
| 322 | 318 | |
| 319 | /* |
| 320 | E90 protection handlers |
| 321 | */ |
| 322 | |
| 323 | READ16_MEMBER(aleck64_state::e90_prot_r) |
| 324 | { |
| 325 | // offset 0 $800 = status ready, active high |
| 326 | return 0; |
| 327 | } |
| 328 | |
| 329 | WRITE16_MEMBER(aleck64_state::e90_prot_w) |
| 330 | { |
| 331 | switch(offset*2) |
| 332 | { |
| 333 | case 0x16: |
| 334 | if(data != 6 && data != 7) |
| 335 | printf("! %04x %04x %08x\n",offset*2,data,mem_mask); |
| 336 | |
| 337 | if(data & 1) // 0 -> 1 transition |
| 338 | { |
| 339 | //for(int i=0;i<0x1000;i+=4) |
| 340 | // space.write_dword(0x007502f4+i,space.read_dword(0xd0000000+i)); |
| 341 | } |
| 342 | break; |
| 343 | //0x1e bit 0 probably enables the chip |
| 344 | default: |
| 345 | printf("%04x %04x %08x\n",offset*2,data,mem_mask); |
| 346 | break; |
| 347 | } |
| 348 | } |
| 349 | |
| 350 | static ADDRESS_MAP_START( e90_map, AS_PROGRAM, 32, aleck64_state ) |
| 351 | AM_IMPORT_FROM( n64_map ) |
| 352 | AM_RANGE(0xd0000000, 0xd0000fff) AM_RAM // x/y offsets |
| 353 | AM_RANGE(0xd0010000, 0xd0010fff) AM_RAM // RGB555 palette |
| 354 | AM_RANGE(0xd0030000, 0xd003001f) AM_READWRITE16(e90_prot_r, e90_prot_w,0xffffffff) |
| 323 | 355 | ADDRESS_MAP_END |
| 324 | 356 | |
| 325 | 357 | static ADDRESS_MAP_START( rsp_map, AS_PROGRAM, 32, aleck64_state ) |
| r242963 | r242964 | |
| 351 | 383 | PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_PLAYER(1) |
| 352 | 384 | |
| 353 | 385 | PORT_START("P1_ANALOG_Y") |
| 354 | | PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_MINMAX(0xff,0x00) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_PLAYER(1) |
| 386 | PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_PLAYER(1) PORT_REVERSE |
| 355 | 387 | |
| 356 | 388 | PORT_START("P2") |
| 357 | 389 | PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) // Button A |
| r242963 | r242964 | |
| 374 | 406 | PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_PLAYER(2) |
| 375 | 407 | |
| 376 | 408 | PORT_START("P2_ANALOG_Y") |
| 377 | | PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_MINMAX(0xff,0x00) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_PLAYER(2) |
| 409 | PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_PLAYER(2) PORT_REVERSE |
| 378 | 410 | |
| 379 | 411 | PORT_START("IN0") |
| 380 | 412 | PORT_DIPNAME( 0x80000000, 0x80000000, "DIPSW1 #8" ) PORT_DIPLOCATION("SW1:8") |
| r242963 | r242964 | |
| 457 | 489 | PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 458 | 490 | PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 459 | 491 | PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) |
| 460 | | |
| 461 | | PORT_MODIFY("P1_ANALOG_Y") |
| 462 | | PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_REVERSE PORT_PLAYER(1) |
| 463 | | |
| 464 | | PORT_MODIFY("P2_ANALOG_Y") |
| 465 | | PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_REVERSE PORT_PLAYER(2) |
| 466 | | |
| 467 | 492 | INPUT_PORTS_END |
| 468 | 493 | |
| 469 | 494 | static INPUT_PORTS_START( mtetrisc ) |
| r242963 | r242964 | |
| 848 | 873 | MCFG_N64_PERIPHS_ADD("rcp"); |
| 849 | 874 | MACHINE_CONFIG_END |
| 850 | 875 | |
| 876 | static MACHINE_CONFIG_DERIVED( a64_e90, aleck64 ) |
| 877 | MCFG_CPU_MODIFY("maincpu") |
| 878 | MCFG_CPU_PROGRAM_MAP(e90_map) |
| 879 | MACHINE_CONFIG_END |
| 880 | |
| 851 | 881 | DRIVER_INIT_MEMBER(aleck64_state,aleck64) |
| 852 | 882 | { |
| 853 | 883 | UINT8 *rom = memregion("user2")->base(); |
| r242963 | r242964 | |
| 1082 | 1112 | |
| 1083 | 1113 | // games |
| 1084 | 1114 | GAME( 1998, 11beat, aleck64, aleck64, 11beat, aleck64_state, aleck64, ROT0, "Hudson", "Eleven Beat", GAME_NOT_WORKING ) // crashes at kick off / during attract with DRC |
| 1085 | | GAME( 1998, mtetrisc, aleck64, aleck64, mtetrisc, aleck64_state, aleck64, ROT0, "Capcom", "Magical Tetris Challenge (981009 Japan)", GAME_NOT_WORKING|GAME_IMPERFECT_GRAPHICS ) |
| 1115 | GAME( 1998, mtetrisc, aleck64, a64_e90, mtetrisc, aleck64_state, aleck64, ROT0, "Capcom", "Magical Tetris Challenge (981009 Japan)", GAME_NOT_WORKING|GAME_IMPERFECT_GRAPHICS ) |
| 1086 | 1116 | GAME( 1998, starsldr, aleck64, aleck64, starsldr, aleck64_state, aleck64, ROT0, "Hudson / Seta", "Star Soldier: Vanishing Earth", GAME_IMPERFECT_GRAPHICS ) |
| 1087 | 1117 | GAME( 1998, vivdolls, aleck64, aleck64, aleck64, aleck64_state, aleck64, ROT0, "Visco", "Vivid Dolls", GAME_IMPERFECT_GRAPHICS ) |
| 1088 | 1118 | GAME( 1999, srmvs, aleck64, aleck64, srmvs, aleck64_state, aleck64, ROT0, "Seta", "Super Real Mahjong VS", GAME_NOT_WORKING|GAME_IMPERFECT_GRAPHICS ) |
trunk/src/mame/drivers/naomi.c
| r242963 | r242964 | |
| 521 | 521 | Star Horse (satellite) 840-0056C 23627 6 (128Mb)* 315-6319 315-6213 not present * +1 (64Mb), requires 837-13785 ARCNET&IO BD |
| 522 | 522 | Star Horse Progress (satellite) (Rev A) 840-0123C 24122A 7 (128Mb) 315-6319A 315-6213 not present requires 837-13785 ARCNET&IO BD |
| 523 | 523 | The King of Route 66 (Rev A) 840-0087C 23819A 10 (128Mb) 315-6319A 315-6213 not present |
| 524 | Virtua Striker 3 840-0061C 23663 11 (128Mb) 315-6319A 315-6213 317-0310-COM |
| 524 | 525 | Virtua Striker 3 (Rev B) 840-0061C 23663B 11 (128Mb) 315-6319A 315-6213 317-0310-COM |
| 525 | | Virtua Striker 3 (Rev C) 840-0061C 23663C 11 (128Mb) 315-6319A 315-6213 317-0310-COM |
| 526 | 526 | Wave Runner GP 840-0064C 24059 6 (128Mb) 315-6319A 315-6213 not present |
| 527 | 527 | Wild Riders 840-0046C 23622 10 (128Mb) 315-6319A 315-6213 317-0301-COM |
| 528 | 528 | WWF Royal Rumble 840-0040C 22261 8 (128Mb) 315-6319 315-6213 317-0285-COM |
| r242963 | r242964 | |
| 7790 | 7790 | NAOMI_DEFAULT_EEPROM |
| 7791 | 7791 | |
| 7792 | 7792 | ROM_REGION( 0xb000000, "rom_board", ROMREGION_ERASEFF) |
| 7793 | | ROM_LOAD( "epr-23663c.ic22",0x0000000, 0x0400000, CRC(7007fec7) SHA1(523168f0b218d0bd5c815d65bf0caba2c8468c9d) ) |
| 7793 | // rom was handmade from 2 damaged dumps, needs to be verified |
| 7794 | ROM_LOAD( "epr-23663.ic22", 0x0000000, 0x0400000, BAD_DUMP CRC(6910a008) SHA1(865affff1cf31321725ef727a17be384555e3aae) ) |
| 7794 | 7795 | ROM_LOAD( "mpr-23652.ic1", 0x0800000, 0x1000000, CRC(992758a2) SHA1(5e2a25c520c1795128e5026fc00d355c24852ded) ) |
| 7795 | 7796 | ROM_LOAD( "mpr-23653.ic2", 0x1800000, 0x1000000, CRC(e210e932) SHA1(2f6f0a31c3e98b21f1ff3af1680e50b3535b130f) ) |
| 7796 | 7797 | ROM_LOAD( "mpr-23654.ic3", 0x2800000, 0x1000000, CRC(91335971) SHA1(fc7599b836fb7995dd7da940e64b08b3c09cb180) ) |
| r242963 | r242964 | |
| 9034 | 9035 | |
| 9035 | 9036 | /* 840-xxxxx (Sega Naomi 2 cart games) */ |
| 9036 | 9037 | /* 0046 */ GAME( 2001, wldrider, naomi2, naomi2m2, naomi, naomi_state, naomi2, ROT0, "Sega", "Wild Riders (JPN, USA, EXP, KOR, AUS)", GAME_FLAGS ) |
| 9037 | | /* 0061 */ GAME( 2001, vstrik3c, naomi2, naomi2m2, naomi, naomi_state, naomi2, ROT0, "Sega", "Virtua Striker 3 (USA, EXP, KOR, AUS) (Cart, Rev C)", GAME_FLAGS ) |
| 9038 | /* 0061 */ GAME( 2001, vstrik3c, naomi2, naomi2m2, naomi, naomi_state, naomi2, ROT0, "Sega", "Virtua Striker 3 (USA, EXP, KOR, AUS) (Cart)", GAME_FLAGS ) |
| 9038 | 9039 | /* 0061 */ GAME( 2001, vstrik3cb,vstrik3c,naomi2m2, naomi, naomi_state, naomi2, ROT0, "Sega", "Virtua Striker 3 (USA, EXP, KOR, AUS) (Cart, Rev B)", GAME_FLAGS ) |
| 9039 | 9040 | /* 0062 */ GAME( 2001, clubkrte, naomi2, naomi2m2, naomi, naomi_state, naomi2, ROT0, "Sega", "Club Kart: European Session", GAME_FLAGS ) |
| 9040 | 9041 | /* 0062 */ GAME( 2001, clubkrtd, clubkrte,naomi2m2, naomi, naomi_state, naomi2, ROT0, "Sega", "Club Kart: European Session (Rev D)", GAME_FLAGS ) |
trunk/src/mame/drivers/peplus.c
| r242963 | r242964 | |
| 3687 | 3687 | ROM_REGION( 0x020000, "gfx1", 0 ) |
| 3688 | 3688 | ROM_LOAD( "mro-cg2153.u72", 0x00000, 0x8000, CRC(004c9c8e) SHA1(ec3fa9d2c658de59e722d9979513d6b0c71d5742) ) /* 05/01/95 @ IGT L95-1123 */ |
| 3689 | 3689 | ROM_LOAD( "mgo-cg2153.u73", 0x08000, 0x8000, CRC(e6843b35) SHA1(2d5219a3cb054ce8b470797c0496c7e24e94ed81) ) |
| 3690 | | ROM_LOAD( "mbo-cg2153.u74", 0x10000, 0x8000, CRC(e3e28611) SHA1(d040f1df6203dc0bd6a79a391fb90fb930f8dd1a) ) /* Custom Arizona Charlie's Casino graphics */ |
| 3690 | ROM_LOAD( "mbo-cg2153.u74", 0x10000, 0x8000, CRC(e3e28611) SHA1(d040f1df6203dc0bd6a79a391fb90fb930f8dd1a) ) /* Custom Arizona Charlie's Casino card backs */ |
| 3691 | 3691 | ROM_LOAD( "mxo-cg2153.u75", 0x18000, 0x8000, CRC(3ae44f7e) SHA1(00d625b60bffef6ce622cb50a3aa93b92131f578) ) |
| 3692 | 3692 | |
| 3693 | 3693 | ROM_REGION( 0x100, "proms", 0 ) |
| r242963 | r242964 | |
| 4772 | 4772 | Four of a Kind Bonus Poker |
| 4773 | 4773 | Deuces Wild Poker |
| 4774 | 4774 | |
| 4775 | Also uses a Dallas (Maxim) DS1216 SmartWatch RAM for RTC (Real Time Clock) functions |
| 4776 | |
| 4775 | 4777 | Came out of an IGT machine with belly glass calling it Montana Choice |
| 4776 | 4778 | */ |
| 4777 | 4779 | ROM_REGION( 0x10000, "maincpu", 0 ) |
| r242963 | r242964 | |
| 5391 | 5393 | ROM_LOAD( "x000055p.u66", 0x00000, 0x10000, CRC(e06819df) SHA1(36590c4588b8036908e63714fbb3e77d23e60eae) ) /* Deuces Wild Poker */ |
| 5392 | 5394 | |
| 5393 | 5395 | ROM_REGION( 0x020000, "gfx1", 0 ) |
| 5394 | | ROM_LOAD( "mro-cg2291.u77", 0x00000, 0x8000, CRC(db4e491c) SHA1(e371e7b236962a0f30640c683d3a0a302c51aee9) ) /* Custom The Orleans graphics */ |
| 5396 | ROM_LOAD( "mro-cg2291.u77", 0x00000, 0x8000, CRC(db4e491c) SHA1(e371e7b236962a0f30640c683d3a0a302c51aee9) ) /* Custom The Orleans card backs */ |
| 5395 | 5397 | ROM_LOAD( "mgo-cg2291.u78", 0x08000, 0x8000, CRC(17bb35f8) SHA1(ba9e8aa3ff42b17c7be6ee46c70db22d8e60e52c) ) /* Compatible with most "standard" game sets */ |
| 5396 | 5398 | ROM_LOAD( "mbo-cg2291.u79", 0x10000, 0x8000, CRC(de1036e4) SHA1(774bbcda301754dc4a606974248847a2264c3827) ) |
| 5397 | 5399 | ROM_LOAD( "mxo-cg2291.u80", 0x18000, 0x8000, CRC(7049403c) SHA1(3a29a00fb8dfdb30dba757c1536151827ea09068) ) |
| r242963 | r242964 | |
| 5416 | 5418 | ROM_LOAD( "x000055p.u66", 0x00000, 0x10000, CRC(e06819df) SHA1(36590c4588b8036908e63714fbb3e77d23e60eae) ) /* Deuces Wild Poker */ |
| 5417 | 5419 | |
| 5418 | 5420 | ROM_REGION( 0x020000, "gfx1", 0 ) |
| 5419 | | ROM_LOAD( "mro-cg2399.u72", 0x00000, 0x8000, CRC(0424f4ba) SHA1(c8b192a6f63c8c9937cb3923d27b9ba2c39823cd) ) /* Custom The Fun Ships graphics */ |
| 5421 | ROM_LOAD( "mro-cg2399.u72", 0x00000, 0x8000, CRC(0424f4ba) SHA1(c8b192a6f63c8c9937cb3923d27b9ba2c39823cd) ) /* Custom The Fun Ships card backs */ |
| 5420 | 5422 | ROM_LOAD( "mgo-cg2399.u73", 0x08000, 0x8000, CRC(5848a2fa) SHA1(4173a473016b7a776d2b59bf3ded0be35bd43721) ) |
| 5421 | 5423 | ROM_LOAD( "mbo-cg2399.u74", 0x10000, 0x8000, CRC(5c3e16f6) SHA1(a4aa457f239527bffa6472e0d6f9d836f796b326) ) |
| 5422 | 5424 | ROM_LOAD( "mxo-cg2399.u75", 0x18000, 0x8000, CRC(bd7669d5) SHA1(4343a9764fd563e2e1cdd8558f2f53f77006b159) ) |
| r242963 | r242964 | |
| 5441 | 5443 | ROM_LOAD( "x000055p.u66", 0x00000, 0x10000, CRC(e06819df) SHA1(36590c4588b8036908e63714fbb3e77d23e60eae) ) /* Deuces Wild Poker */ |
| 5442 | 5444 | |
| 5443 | 5445 | ROM_REGION( 0x020000, "gfx1", 0 ) |
| 5444 | | ROM_LOAD( "mro-cg2185.u77", 0x00000, 0x8000, CRC(7e64bd1a) SHA1(e988a380ee58078bf5bdc7747e83aed1393cfad8) ) /* 07/10/95 @ IGT L95-1506 */ |
| 5445 | | ROM_LOAD( "mgo-cg2185.u78", 0x08000, 0x8000, CRC(d4127893) SHA1(75039c45ba6fd171a66876c91abc3191c7feddfc) ) |
| 5446 | | ROM_LOAD( "mbo-cg2185.u79", 0x10000, 0x8000, CRC(17dba955) SHA1(5f77379c88839b3a04e235e4fb0120c77e17b60e) ) |
| 5447 | | ROM_LOAD( "mxo-cg2185.u80", 0x18000, 0x8000, CRC(583eb3b1) SHA1(4a2952424969917fb1594698a779fe5a1e99bff5) ) |
| 5446 | ROM_LOAD( "mro-cg2374.u72", 0x00000, 0x8000, CRC(ceeb714d) SHA1(6de908d04bcaa243195943affa9ad0d725de5c81) ) /* Custom Horseshoe Casino card backs */ |
| 5447 | ROM_LOAD( "mgo-cg2374.u73", 0x08000, 0x8000, CRC(d0fabad5) SHA1(438ebe074fa3eaa3073ef042f481449f416d0665) ) |
| 5448 | ROM_LOAD( "mbo-cg2374.u74", 0x10000, 0x8000, CRC(9a0fbc8d) SHA1(aa39f47cbeaf8218fd2d753c9a350e9eab5df5d3) ) |
| 5449 | ROM_LOAD( "mxo-cg2374.u75", 0x18000, 0x8000, CRC(99814562) SHA1(2d8e132f4cc4edd06332c0327927219513b22832) ) |
| 5448 | 5450 | |
| 5449 | 5451 | ROM_REGION( 0x200, "proms", 0 ) |
| 5450 | | ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) |
| 5452 | ROM_LOAD( "capx2374.u43", 0x0000, 0x0200, CRC(f922e1b8) SHA1(4aa5291c59431c022dc0561a6e3b38209f60286a) ) |
| 5451 | 5453 | ROM_END |
| 5452 | 5454 | |
| 5453 | 5455 | ROM_START( pex0055pd ) /* Superboard : Deuces Wild Poker (X000055P+XP000035) */ |
| r242963 | r242964 | |
| 7938 | 7940 | ROM_LOAD( "x002374p.u66", 0x00000, 0x10000, CRC(fc4b6c8d) SHA1(b101f9042bd54dbfdeed4c7a3acf3798096f6857) ) /* Super Aces Poker */ |
| 7939 | 7941 | |
| 7940 | 7942 | ROM_REGION( 0x020000, "gfx1", 0 ) |
| 7941 | | ROM_LOAD( "mro-cg2374.u72", 0x00000, 0x8000, CRC(ceeb714d) SHA1(6de908d04bcaa243195943affa9ad0d725de5c81) ) /* Custom Horseshoe Casino card backs */ |
| 7942 | | ROM_LOAD( "mgo-cg2374.u73", 0x08000, 0x8000, CRC(d0fabad5) SHA1(438ebe074fa3eaa3073ef042f481449f416d0665) ) |
| 7943 | | ROM_LOAD( "mbo-cg2374.u74", 0x10000, 0x8000, CRC(9a0fbc8d) SHA1(aa39f47cbeaf8218fd2d753c9a350e9eab5df5d3) ) |
| 7944 | | ROM_LOAD( "mxo-cg2374.u75", 0x18000, 0x8000, CRC(99814562) SHA1(2d8e132f4cc4edd06332c0327927219513b22832) ) |
| 7943 | ROM_LOAD( "mro-cg2324.u77", 0x00000, 0x8000, CRC(6eceef42) SHA1(a2ddd2a3290c41e510f483c6b633fe0002694d0b) ) |
| 7944 | ROM_LOAD( "mgo-cg2324.u78", 0x08000, 0x8000, CRC(26d0acbe) SHA1(09a9127deb88185cd5b748bac657461eadb2f48f) ) |
| 7945 | ROM_LOAD( "mbo-cg2324.u79", 0x10000, 0x8000, CRC(47baee32) SHA1(d8af09022ccb5fc06aa3aa4c200a734b66cbee00) ) |
| 7946 | ROM_LOAD( "mxo-cg2324.u80", 0x18000, 0x8000, CRC(60449fc0) SHA1(251d1e04786b70c1d2bc7b02f3b69cd58ac76398) ) |
| 7945 | 7947 | |
| 7946 | 7948 | ROM_REGION( 0x200, "proms", 0 ) |
| 7947 | | ROM_LOAD( "cap2374.u43", 0x0000, 0x0200, CRC(f922e1b8) SHA1(4aa5291c59431c022dc0561a6e3b38209f60286a) ) |
| 7949 | ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) |
| 7948 | 7950 | ROM_END |
| 7949 | 7951 | |
| 7950 | 7952 | ROM_START( pex2377p ) /* Superboard : Super Double Bonus Poker (X002377P+XP000112) */ |
| r242963 | r242964 | |
| 9263 | 9265 | GAMEL(1995, pex0055p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000055P+XP000019) Deuces Wild Poker", 0, layout_pe_poker ) |
| 9264 | 9266 | GAMEL(1995, pex0055pa, pex0055p, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000055P+XP000022) Deuces Wild Poker (The Orleans)", 0, layout_pe_poker ) |
| 9265 | 9267 | GAMEL(1995, pex0055pb, pex0055p, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000055P+XP000023) Deuces Wild Poker (The Fun Ships)", 0, layout_pe_poker ) |
| 9266 | | GAMEL(1995, pex0055pc, pex0055p, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000055P+XP000028) Deuces Wild Poker", 0, layout_pe_poker ) |
| 9268 | GAMEL(1995, pex0055pc, pex0055p, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000055P+XP000028) Deuces Wild Poker (Horseshoe)", 0, layout_pe_poker ) |
| 9267 | 9269 | GAMEL(1995, pex0055pd, pex0055p, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000055P+XP000035) Deuces Wild Poker", 0, layout_pe_poker ) |
| 9268 | 9270 | GAMEL(1995, pex0055pe, pex0055p, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000055P+XP000038) Deuces Wild Poker", 0, layout_pe_poker ) |
| 9269 | 9271 | GAMEL(1995, pex0055pf, pex0055p, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000055P+XP000040) Deuces Wild Poker", 0, layout_pe_poker ) |
| r242963 | r242964 | |
| 9361 | 9363 | GAMEL(1995, pex2308p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002308P+XP000112) Triple Double Bonus Poker", 0, layout_pe_poker ) |
| 9362 | 9364 | GAMEL(1995, pex2310p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002310P+XP000112) Triple Double Bonus Poker", 0, layout_pe_poker ) |
| 9363 | 9365 | GAMEL(1995, pex2314p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002314P+XP000112) Triple Bonus Poker Plus", 0, layout_pe_poker ) |
| 9364 | | GAMEL(1995, pex2374p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002374P+XP000112) Super Aces Poker (Horseshoe)", 0, layout_pe_poker ) |
| 9366 | GAMEL(1995, pex2374p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002374P+XP000112) Super Aces Poker", 0, layout_pe_poker ) |
| 9365 | 9367 | GAMEL(1995, pex2377p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002377P+XP000112) Super Double Bonus Poker", 0, layout_pe_poker ) |
| 9366 | 9368 | GAMEL(1995, pex2419p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002419P+XP000064) Deuces Wild Bonus Poker - French", 0, layout_pe_poker ) |
| 9367 | 9369 | GAMEL(1995, pex2420p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002420P+XP000064) Deuces Wild Bonus Poker - French", 0, layout_pe_poker ) |
trunk/src/mame/drivers/stfight.c
| r242963 | r242964 | |
| 247 | 247 | #include "cpu/z80/z80.h" |
| 248 | 248 | #include "cpu/m6805/m6805.h" |
| 249 | 249 | #include "sound/2203intf.h" |
| 250 | | #include "sound/msm5205.h" |
| 251 | 250 | #include "includes/stfight.h" |
| 252 | 251 | |
| 253 | 252 | static ADDRESS_MAP_START( cpu1_map, AS_PROGRAM, 8, stfight_state ) |
| r242963 | r242964 | |
| 1037 | 1036 | ROM_END |
| 1038 | 1037 | |
| 1039 | 1038 | // Note: Marked GAME_IMPERFECT_SOUND due to YM2203 clock issue |
| 1040 | | GAME( 1986, empcity, 0, stfight, stfight, stfight_state, empcity, ROT0, "Seibu Kaihatsu", "Empire City: 1931 (bootleg?)", GAME_IMPERFECT_SOUND ) |
| 1041 | | GAME( 1986, empcityu, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Taito / Romstar license)", "Empire City: 1931 (US)", GAME_IMPERFECT_SOUND ) // different title logo |
| 1042 | | GAME( 1986, empcityj, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Taito license)", "Empire City: 1931 (Japan)", GAME_IMPERFECT_SOUND ) |
| 1043 | | GAME( 1986, empcityi, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Eurobed license)", "Empire City: 1931 (Italy)", GAME_IMPERFECT_SOUND ) |
| 1044 | | GAME( 1986, stfight, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Tuning license)", "Street Fight (Germany)", GAME_IMPERFECT_SOUND ) |
| 1045 | | GAME( 1986, stfighta, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu", "Street Fight (bootleg?)", GAME_IMPERFECT_SOUND ) |
| 1039 | GAME( 1986, empcity, 0, stfight, stfight, stfight_state, empcity, ROT0, "Seibu Kaihatsu", "Empire City: 1931 (bootleg?)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) |
| 1040 | GAME( 1986, empcityu, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Taito / Romstar license)", "Empire City: 1931 (US)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // different title logo |
| 1041 | GAME( 1986, empcityj, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Taito license)", "Empire City: 1931 (Japan)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) |
| 1042 | GAME( 1986, empcityi, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Eurobed license)", "Empire City: 1931 (Italy)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) |
| 1043 | GAME( 1986, stfight, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Tuning license)", "Street Fight (Germany)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) |
| 1044 | GAME( 1986, stfighta, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu", "Street Fight (bootleg?)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) |
| 1046 | 1045 | /* Cross Shooter runs on a slightly modified PCB, with a different text tilemap and gfx blobs (see also cshooter.c) */ |
| 1047 | | GAME( 1987, cshooter, 0, cshooter,cshooter, stfight_state, cshooter,ROT270,"Seibu Kaihatsu (Taito license)", "Cross Shooter (not encrypted)", GAME_NOT_WORKING ) |
| 1046 | GAME( 1987, cshooter, 0, cshooter,cshooter, stfight_state, cshooter,ROT270,"Seibu Kaihatsu (Taito license)", "Cross Shooter (not encrypted)", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) |
trunk/src/mame/includes/stfight.h
| r242963 | r242964 | |
| 10 | 10 | |
| 11 | 11 | stfight_state(const machine_config &mconfig, device_type type, const char *tag) |
| 12 | 12 | : driver_device(mconfig, type, tag), |
| 13 | | m_text_char_ram(*this, "text_char_ram"), |
| 14 | | m_text_attr_ram(*this, "text_attr_ram"), |
| 15 | | m_tx_vram(*this, "tx_vram"), |
| 16 | | m_vh_latch_ram(*this, "vh_latch_ram"), |
| 17 | | m_sprite_ram(*this, "sprite_ram"), |
| 18 | 13 | m_maincpu(*this, "maincpu"), |
| 19 | 14 | m_audiocpu(*this, "audiocpu"), |
| 20 | 15 | m_mcu(*this, "mcu"), |
| 21 | 16 | m_msm(*this, "msm"), |
| 22 | 17 | m_gfxdecode(*this, "gfxdecode"), |
| 23 | | m_palette(*this, "palette") { } |
| 18 | m_palette(*this, "palette"), |
| 19 | m_text_char_ram(*this, "text_char_ram"), |
| 20 | m_text_attr_ram(*this, "text_attr_ram"), |
| 21 | m_tx_vram(*this, "tx_vram"), |
| 22 | m_vh_latch_ram(*this, "vh_latch_ram"), |
| 23 | m_sprite_ram(*this, "sprite_ram") { } |
| 24 | 24 | |
| 25 | | optional_shared_ptr<UINT8> m_text_char_ram; |
| 26 | | optional_shared_ptr<UINT8> m_text_attr_ram; |
| 27 | | optional_shared_ptr<UINT8> m_tx_vram; |
| 28 | | required_shared_ptr<UINT8> m_vh_latch_ram; |
| 29 | | required_shared_ptr<UINT8> m_sprite_ram; |
| 30 | 25 | required_device<cpu_device> m_maincpu; |
| 31 | 26 | required_device<cpu_device> m_audiocpu; |
| 32 | 27 | required_device<cpu_device> m_mcu; |
| 33 | 28 | required_device<msm5205_device> m_msm; |
| 34 | 29 | required_device<gfxdecode_device> m_gfxdecode; |
| 35 | 30 | required_device<palette_device> m_palette; |
| 31 | |
| 32 | optional_shared_ptr<UINT8> m_text_char_ram; |
| 33 | optional_shared_ptr<UINT8> m_text_attr_ram; |
| 34 | optional_shared_ptr<UINT8> m_tx_vram; |
| 35 | required_shared_ptr<UINT8> m_vh_latch_ram; |
| 36 | required_shared_ptr<UINT8> m_sprite_ram; |
| 36 | 37 | |
| 37 | 38 | UINT8 *m_decrypt; |
| 38 | 39 | UINT8 m_fm_data; |
| r242963 | r242964 | |
| 79 | 80 | |
| 80 | 81 | DECLARE_VIDEO_START(stfight); |
| 81 | 82 | DECLARE_VIDEO_START(cshooter); |
| 83 | virtual void machine_start(); |
| 82 | 84 | virtual void machine_reset(); |
| 83 | 85 | DECLARE_PALETTE_INIT(stfight); |
| 84 | 86 | UINT32 screen_update_stfight(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| r242963 | r242964 | |
| 106 | 108 | UINT8 m_portB_out, m_portB_in; |
| 107 | 109 | UINT8 m_portC_out, m_portC_in; |
| 108 | 110 | UINT8 m_ddrA, m_ddrB, m_ddrC; |
| 109 | | UINT8 m_from_main, m_main_sent; |
| 110 | 111 | |
| 111 | 112 | protected: |
| 112 | 113 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
trunk/src/mame/includes/stlforce.h
| r242963 | r242964 | |
| 6 | 6 | public: |
| 7 | 7 | stlforce_state(const machine_config &mconfig, device_type type, const char *tag) |
| 8 | 8 | : driver_device(mconfig, type, tag), |
| 9 | m_maincpu(*this, "maincpu"), |
| 10 | m_oki(*this, "oki"), |
| 11 | m_eeprom(*this, "eeprom"), |
| 12 | m_gfxdecode(*this, "gfxdecode"), |
| 13 | m_palette(*this, "palette"), |
| 9 | 14 | m_bg_videoram(*this, "bg_videoram"), |
| 10 | 15 | m_mlow_videoram(*this, "mlow_videoram"), |
| 11 | 16 | m_mhigh_videoram(*this, "mhigh_videoram"), |
| r242963 | r242964 | |
| 14 | 19 | m_mlow_scrollram(*this, "mlow_scrollram"), |
| 15 | 20 | m_mhigh_scrollram(*this, "mhigh_scrollram"), |
| 16 | 21 | m_vidattrram(*this, "vidattrram"), |
| 17 | | m_spriteram(*this, "spriteram"), |
| 18 | | m_maincpu(*this, "maincpu"), |
| 19 | | m_oki(*this, "oki"), |
| 20 | | m_eeprom(*this, "eeprom"), |
| 21 | | m_gfxdecode(*this, "gfxdecode"), |
| 22 | | m_palette(*this, "palette") { } |
| 22 | m_spriteram(*this, "spriteram") { } |
| 23 | 23 | |
| 24 | | tilemap_t *m_bg_tilemap; |
| 25 | | tilemap_t *m_mlow_tilemap; |
| 26 | | tilemap_t *m_mhigh_tilemap; |
| 27 | | tilemap_t *m_tx_tilemap; |
| 24 | required_device<cpu_device> m_maincpu; |
| 25 | required_device<okim6295_device> m_oki; |
| 26 | required_device<eeprom_serial_93cxx_device> m_eeprom; |
| 27 | required_device<gfxdecode_device> m_gfxdecode; |
| 28 | required_device<palette_device> m_palette; |
| 28 | 29 | |
| 29 | 30 | required_shared_ptr<UINT16> m_bg_videoram; |
| 30 | 31 | required_shared_ptr<UINT16> m_mlow_videoram; |
| r242963 | r242964 | |
| 34 | 35 | required_shared_ptr<UINT16> m_mlow_scrollram; |
| 35 | 36 | required_shared_ptr<UINT16> m_mhigh_scrollram; |
| 36 | 37 | required_shared_ptr<UINT16> m_vidattrram; |
| 37 | | |
| 38 | 38 | required_shared_ptr<UINT16> m_spriteram; |
| 39 | |
| 40 | tilemap_t *m_bg_tilemap; |
| 41 | tilemap_t *m_mlow_tilemap; |
| 42 | tilemap_t *m_mhigh_tilemap; |
| 43 | tilemap_t *m_tx_tilemap; |
| 39 | 44 | |
| 40 | 45 | int m_sprxoffs; |
| 46 | |
| 41 | 47 | DECLARE_WRITE16_MEMBER(stlforce_bg_videoram_w); |
| 42 | 48 | DECLARE_WRITE16_MEMBER(stlforce_mlow_videoram_w); |
| 43 | 49 | DECLARE_WRITE16_MEMBER(stlforce_mhigh_videoram_w); |
| 44 | 50 | DECLARE_WRITE16_MEMBER(stlforce_tx_videoram_w); |
| 45 | 51 | DECLARE_WRITE16_MEMBER(eeprom_w); |
| 46 | 52 | DECLARE_WRITE16_MEMBER(oki_bank_w); |
| 53 | |
| 47 | 54 | DECLARE_DRIVER_INIT(twinbrat); |
| 48 | 55 | DECLARE_DRIVER_INIT(stlforce); |
| 56 | |
| 49 | 57 | TILE_GET_INFO_MEMBER(get_stlforce_bg_tile_info); |
| 50 | 58 | TILE_GET_INFO_MEMBER(get_stlforce_mlow_tile_info); |
| 51 | 59 | TILE_GET_INFO_MEMBER(get_stlforce_mhigh_tile_info); |
| 52 | 60 | TILE_GET_INFO_MEMBER(get_stlforce_tx_tile_info); |
| 61 | |
| 53 | 62 | virtual void video_start(); |
| 54 | 63 | UINT32 screen_update_stlforce(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 55 | 64 | void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect ); |
| 56 | | required_device<cpu_device> m_maincpu; |
| 57 | | required_device<okim6295_device> m_oki; |
| 58 | | required_device<eeprom_serial_93cxx_device> m_eeprom; |
| 59 | | required_device<gfxdecode_device> m_gfxdecode; |
| 60 | | required_device<palette_device> m_palette; |
| 61 | 65 | }; |
trunk/src/mame/video/tia.c
| r242963 | r242964 | |
| 430 | 430 | helper[0] = auto_bitmap_ind16_alloc(machine(), cx, TIA_MAX_SCREEN_HEIGHT); |
| 431 | 431 | helper[1] = auto_bitmap_ind16_alloc(machine(), cx, TIA_MAX_SCREEN_HEIGHT); |
| 432 | 432 | helper[2] = auto_bitmap_ind16_alloc(machine(), cx, TIA_MAX_SCREEN_HEIGHT); |
| 433 | |
| 434 | register_save_state(); |
| 433 | 435 | } |
| 434 | 436 | |
| 435 | 437 | |
| r242963 | r242964 | |
| 665 | 667 | |
| 666 | 668 | int tia_video_device::current_x() |
| 667 | 669 | { |
| 668 | | return 3 * ((machine().firstcpu->total_cycles() - frame_cycles) % 76) - 68; |
| 670 | return 3 * ((machine().device<cpu_device>("maincpu")->total_cycles() - frame_cycles) % 76) - 68; |
| 669 | 671 | } |
| 670 | 672 | |
| 671 | 673 | |
| 672 | 674 | int tia_video_device::current_y() |
| 673 | 675 | { |
| 674 | | return (machine().firstcpu->total_cycles() - frame_cycles) / 76; |
| 676 | return (machine().device<cpu_device>("maincpu")->total_cycles() - frame_cycles) / 76; |
| 675 | 677 | } |
| 676 | 678 | |
| 677 | 679 | |
| r242963 | r242964 | |
| 1010 | 1012 | |
| 1011 | 1013 | WRITE8_MEMBER( tia_video_device::WSYNC_w ) |
| 1012 | 1014 | { |
| 1013 | | int cycles = machine().firstcpu->total_cycles() - frame_cycles; |
| 1015 | int cycles = machine().device<cpu_device>("maincpu")->total_cycles() - frame_cycles; |
| 1014 | 1016 | |
| 1015 | 1017 | if (cycles % 76) |
| 1016 | 1018 | { |
| r242963 | r242964 | |
| 1051 | 1053 | { |
| 1052 | 1054 | if (data & 0x80) |
| 1053 | 1055 | { |
| 1054 | | paddle_start = machine().firstcpu->total_cycles(); |
| 1056 | paddle_start = machine().device<cpu_device>("maincpu")->total_cycles(); |
| 1055 | 1057 | } |
| 1056 | 1058 | if ( ! ( VBLANK & 0x40 ) ) { |
| 1057 | 1059 | INPT4 = 0x80; |
| r242963 | r242964 | |
| 1804 | 1806 | |
| 1805 | 1807 | READ8_MEMBER( tia_video_device::INPT_r ) |
| 1806 | 1808 | { |
| 1807 | | UINT64 elapsed = machine().firstcpu->total_cycles() - paddle_start; |
| 1809 | UINT64 elapsed = machine().device<cpu_device>("maincpu")->total_cycles() - paddle_start; |
| 1808 | 1810 | UINT16 input = TIA_INPUT_PORT_ALWAYS_ON; |
| 1809 | 1811 | if ( !m_read_input_port_cb.isnull() ) |
| 1810 | 1812 | { |
| r242963 | r242964 | |
| 2177 | 2179 | COLUBK = 0; |
| 2178 | 2180 | COLUPF = 0; |
| 2179 | 2181 | } |
| 2182 | |
| 2183 | |
| 2184 | void tia_video_device::register_save_state() |
| 2185 | { |
| 2186 | save_item(NAME(p0gfx.start_pixel)); |
| 2187 | save_item(NAME(p0gfx.start_drawing)); |
| 2188 | save_item(NAME(p0gfx.size)); |
| 2189 | save_item(NAME(p0gfx.skipclip)); |
| 2190 | save_item(NAME(p1gfx.start_pixel)); |
| 2191 | save_item(NAME(p1gfx.start_drawing)); |
| 2192 | save_item(NAME(p1gfx.size)); |
| 2193 | save_item(NAME(p1gfx.skipclip)); |
| 2194 | save_item(NAME(frame_cycles)); |
| 2195 | save_item(NAME(paddle_start)); |
| 2196 | save_item(NAME(horzP0)); |
| 2197 | save_item(NAME(horzP1)); |
| 2198 | save_item(NAME(horzM0)); |
| 2199 | save_item(NAME(horzM1)); |
| 2200 | save_item(NAME(horzBL)); |
| 2201 | save_item(NAME(motclkP0)); |
| 2202 | save_item(NAME(motclkP1)); |
| 2203 | save_item(NAME(motclkM0)); |
| 2204 | save_item(NAME(motclkM1)); |
| 2205 | save_item(NAME(motclkBL)); |
| 2206 | save_item(NAME(startP0)); |
| 2207 | save_item(NAME(startP1)); |
| 2208 | save_item(NAME(startM0)); |
| 2209 | save_item(NAME(startM1)); |
| 2210 | save_item(NAME(skipclipP0)); |
| 2211 | save_item(NAME(skipclipP1)); |
| 2212 | save_item(NAME(skipM0delay)); |
| 2213 | save_item(NAME(skipM1delay)); |
| 2214 | save_item(NAME(current_bitmap)); |
| 2215 | save_item(NAME(prev_x)); |
| 2216 | save_item(NAME(prev_y)); |
| 2217 | save_item(NAME(VSYNC)); |
| 2218 | save_item(NAME(VBLANK)); |
| 2219 | save_item(NAME(COLUP0)); |
| 2220 | save_item(NAME(COLUP1)); |
| 2221 | save_item(NAME(COLUBK)); |
| 2222 | save_item(NAME(COLUPF)); |
| 2223 | save_item(NAME(CTRLPF)); |
| 2224 | save_item(NAME(GRP0)); |
| 2225 | save_item(NAME(GRP1)); |
| 2226 | save_item(NAME(REFP0)); |
| 2227 | save_item(NAME(REFP1)); |
| 2228 | save_item(NAME(HMP0)); |
| 2229 | save_item(NAME(HMP1)); |
| 2230 | save_item(NAME(HMM0)); |
| 2231 | save_item(NAME(HMM1)); |
| 2232 | save_item(NAME(HMBL)); |
| 2233 | save_item(NAME(VDELP0)); |
| 2234 | save_item(NAME(VDELP1)); |
| 2235 | save_item(NAME(VDELBL)); |
| 2236 | save_item(NAME(NUSIZ0)); |
| 2237 | save_item(NAME(NUSIZ1)); |
| 2238 | save_item(NAME(ENAM0)); |
| 2239 | save_item(NAME(ENAM1)); |
| 2240 | save_item(NAME(ENABL)); |
| 2241 | save_item(NAME(CXM0P)); |
| 2242 | save_item(NAME(CXM1P)); |
| 2243 | save_item(NAME(CXP0FB)); |
| 2244 | save_item(NAME(CXP1FB)); |
| 2245 | save_item(NAME(CXM0FB)); |
| 2246 | save_item(NAME(CXM1FB)); |
| 2247 | save_item(NAME(CXBLPF)); |
| 2248 | save_item(NAME(CXPPMM)); |
| 2249 | save_item(NAME(RESMP0)); |
| 2250 | save_item(NAME(RESMP1)); |
| 2251 | save_item(NAME(PF0)); |
| 2252 | save_item(NAME(PF1)); |
| 2253 | save_item(NAME(PF2)); |
| 2254 | save_item(NAME(INPT4)); |
| 2255 | save_item(NAME(INPT5)); |
| 2256 | save_item(NAME(prevGRP0)); |
| 2257 | save_item(NAME(prevGRP1)); |
| 2258 | save_item(NAME(prevENABL)); |
| 2259 | save_item(NAME(HMOVE_started)); |
| 2260 | save_item(NAME(HMOVE_started_previous)); |
| 2261 | save_item(NAME(HMP0_latch)); |
| 2262 | save_item(NAME(HMP1_latch)); |
| 2263 | save_item(NAME(HMM0_latch)); |
| 2264 | save_item(NAME(HMM1_latch)); |
| 2265 | save_item(NAME(HMBL_latch)); |
| 2266 | save_item(NAME(REFLECT)); |
| 2267 | save_item(NAME(NUSIZx_changed)); |
| 2268 | } |
trunk/src/mess/drivers/ngen.c
| r242963 | r242964 | |
| 87 | 87 | m_vram(*this,"vram"), |
| 88 | 88 | m_fontram(*this,"fontram"), |
| 89 | 89 | m_fdc(*this,"fdc"), |
| 90 | | m_fd0(*this,"fdc:0") |
| 90 | m_fd0(*this,"fdc:0"), |
| 91 | m_fdc_timer(*this,"fdc_timer"), |
| 92 | m_hdc_timer(*this,"hdc_timer") |
| 91 | 93 | {} |
| 92 | 94 | |
| 93 | 95 | DECLARE_WRITE_LINE_MEMBER(pit_out0_w); |
| r242963 | r242964 | |
| 98 | 100 | DECLARE_WRITE16_MEMBER(cpu_peripheral_cb); |
| 99 | 101 | DECLARE_WRITE16_MEMBER(peripheral_w); |
| 100 | 102 | DECLARE_READ16_MEMBER(peripheral_r); |
| 101 | | DECLARE_WRITE16_MEMBER(port00_w); |
| 102 | | DECLARE_READ16_MEMBER(port00_r); |
| 103 | DECLARE_WRITE16_MEMBER(xbus_w); |
| 104 | DECLARE_READ16_MEMBER(xbus_r); |
| 103 | 105 | DECLARE_WRITE_LINE_MEMBER(dma_hrq_changed); |
| 104 | 106 | DECLARE_WRITE_LINE_MEMBER(dma_eop_changed); |
| 105 | 107 | DECLARE_WRITE_LINE_MEMBER(dack0_w); |
| r242963 | r242964 | |
| 118 | 120 | DECLARE_WRITE8_MEMBER( dma_1_dack_w ){ } |
| 119 | 121 | DECLARE_WRITE8_MEMBER( dma_2_dack_w ){ } |
| 120 | 122 | DECLARE_WRITE8_MEMBER( dma_3_dack_w ){ popmessage("IOW3: data %02x",data); } |
| 123 | |
| 124 | DECLARE_WRITE16_MEMBER(hfd_w); |
| 125 | DECLARE_READ16_MEMBER(fhd_r); |
| 121 | 126 | DECLARE_WRITE_LINE_MEMBER(fdc_irq_w); |
| 122 | 127 | DECLARE_WRITE_LINE_MEMBER(fdc_drq_w); |
| 123 | 128 | DECLARE_WRITE8_MEMBER(fdc_control_w); |
| r242963 | r242964 | |
| 141 | 146 | optional_shared_ptr<UINT16> m_fontram; |
| 142 | 147 | optional_device<wd2797_t> m_fdc; |
| 143 | 148 | optional_device<floppy_connector> m_fd0; |
| 149 | optional_device<pit8253_device> m_fdc_timer; |
| 150 | optional_device<pit8253_device> m_hdc_timer; |
| 144 | 151 | |
| 145 | 152 | void set_dma_channel(int channel, int state); |
| 146 | 153 | |
| 154 | UINT8 m_xbus_current; // currently selected X-Bus module |
| 147 | 155 | UINT16 m_peripheral; |
| 148 | 156 | UINT16 m_upper; |
| 149 | 157 | UINT16 m_middle; |
| r242963 | r242964 | |
| 265 | 273 | if(mem_mask & 0x00ff) |
| 266 | 274 | m_dma_offset[offset-0x80] = data & 0xff; |
| 267 | 275 | break; |
| 276 | case 0xc0: // X-Bus modules reset |
| 277 | m_xbus_current = 0; |
| 278 | break; |
| 268 | 279 | case 0x10c: |
| 269 | 280 | if(mem_mask & 0x00ff) |
| 270 | 281 | m_pic->write(space,0,data & 0xff); |
| r242963 | r242964 | |
| 386 | 397 | |
| 387 | 398 | // X-bus module select |
| 388 | 399 | // The bootstrap ROM creates a table at 0:FC9h, with a count, followed by the module IDs of each |
| 389 | | // expansion module. The base I/O address for each module is 0x100*module number. |
| 390 | | // Module 0 is the main processor module, module 1 is the next module attached, and so on. |
| 391 | | WRITE16_MEMBER(ngen_state::port00_w) |
| 400 | // expansion module. The base I/O address for the currently selected module is set by writing to |
| 401 | // this register (bits 0-7 are ignored) |
| 402 | // TODO: make expansion modules slot devices |
| 403 | WRITE16_MEMBER(ngen_state::xbus_w) |
| 392 | 404 | { |
| 393 | | m_port00 = data; |
| 394 | | logerror("SYS: X-Bus module select %04x\n",data); |
| 405 | UINT16 addr = (data & 0x00ff) << 8; |
| 406 | address_space& io = m_maincpu->device_t::memory().space(AS_IO); |
| 407 | switch(m_xbus_current) |
| 408 | { |
| 409 | case 0x00: // Floppy/Hard disk module |
| 410 | io.install_readwrite_handler(addr,addr+0xff,0,0,read16_delegate(FUNC(ngen_state::fhd_r),this),write16_delegate(FUNC(ngen_state::hfd_w),this)); |
| 411 | break; |
| 412 | default: |
| 413 | m_maincpu->set_input_line(INPUT_LINE_NMI,PULSE_LINE); // reached end of the modules |
| 414 | break; |
| 415 | } |
| 416 | if(addr != 0) |
| 417 | logerror("SYS: X-Bus module %i address set %04x\n",m_xbus_current+1,addr); |
| 418 | m_xbus_current++; |
| 395 | 419 | } |
| 396 | 420 | |
| 397 | | // returns X-bus module ID (what is the low byte for?) |
| 398 | | READ16_MEMBER(ngen_state::port00_r) |
| 421 | // returns X-bus module ID and info in the low byte (can indicate if the device is bootable, has a boot ROM (needs to be written to RAM via DMA), or if it supports a non-80186 CPU) |
| 422 | // bit 6, I think, indicates a bootable device |
| 423 | // Known module IDs: |
| 424 | // 0x1070 - Floppy/Hard disk module |
| 425 | // 0x3141 - QIC Tape module |
| 426 | READ16_MEMBER(ngen_state::xbus_r) |
| 399 | 427 | { |
| 400 | | if(m_port00 > 0) |
| 401 | | m_maincpu->set_input_line(INPUT_LINE_NMI,PULSE_LINE); |
| 402 | | if(m_port00 == 0) |
| 403 | | return 0x1070; // module ID of 0x1070, according to the floppy/hard disk tech manual |
| 404 | | else |
| 405 | | return 0x0080; // invalid device? |
| 428 | UINT16 ret = 0xffff; |
| 429 | |
| 430 | switch(m_xbus_current) |
| 431 | { |
| 432 | case 0x00: |
| 433 | ret = 0x1070; // Floppy/Hard disk module |
| 434 | break; |
| 435 | default: |
| 436 | m_maincpu->set_input_line(INPUT_LINE_NMI,PULSE_LINE); // reached the end of the modules |
| 437 | ret = 0x0080; |
| 438 | break; |
| 439 | } |
| 440 | return ret; |
| 406 | 441 | } |
| 407 | 442 | |
| 443 | |
| 444 | // Floppy/Hard disk module |
| 445 | WRITE16_MEMBER(ngen_state::hfd_w) |
| 446 | { |
| 447 | switch(offset) |
| 448 | { |
| 449 | case 0x00: |
| 450 | case 0x01: |
| 451 | case 0x02: |
| 452 | case 0x03: |
| 453 | if(mem_mask & 0x00ff) |
| 454 | m_fdc->write(space,offset,data & 0xff); |
| 455 | break; |
| 456 | case 0x04: |
| 457 | if(mem_mask & 0x00ff) |
| 458 | fdc_control_w(space,offset,data & 0xff); |
| 459 | break; |
| 460 | case 0x05: |
| 461 | if(mem_mask & 0x00ff) |
| 462 | hdc_control_w(space,offset,data & 0xff); |
| 463 | break; |
| 464 | case 0x07: |
| 465 | if(mem_mask & 0x00ff) |
| 466 | disk_addr_ext(space,offset,data & 0xff); |
| 467 | break; |
| 468 | case 0x08: |
| 469 | case 0x09: |
| 470 | case 0x0a: |
| 471 | case 0x0b: |
| 472 | if(mem_mask & 0x00ff) |
| 473 | m_fdc_timer->write(space,offset,data & 0xff); |
| 474 | break; |
| 475 | case 0x10: |
| 476 | case 0x11: |
| 477 | case 0x12: |
| 478 | case 0x13: |
| 479 | case 0x14: |
| 480 | case 0x15: |
| 481 | case 0x16: |
| 482 | case 0x17: |
| 483 | logerror("WD1010 register %i write %02x mask %04x\n",offset-0x10,data & 0xff,mem_mask); |
| 484 | break; |
| 485 | case 0x18: |
| 486 | case 0x19: |
| 487 | case 0x1a: |
| 488 | case 0x1b: |
| 489 | if(mem_mask & 0x00ff) |
| 490 | m_hdc_timer->write(space,offset,data & 0xff); |
| 491 | break; |
| 492 | } |
| 493 | } |
| 494 | |
| 495 | READ16_MEMBER(ngen_state::fhd_r) |
| 496 | { |
| 497 | UINT16 ret = 0xffff; |
| 498 | |
| 499 | switch(offset) |
| 500 | { |
| 501 | case 0x00: |
| 502 | case 0x01: |
| 503 | case 0x02: |
| 504 | case 0x03: |
| 505 | if(mem_mask & 0x00ff) |
| 506 | ret = m_fdc->read(space,offset); |
| 507 | break; |
| 508 | case 0x08: |
| 509 | case 0x09: |
| 510 | case 0x0a: |
| 511 | case 0x0b: |
| 512 | if(mem_mask & 0x00ff) |
| 513 | ret = m_fdc_timer->read(space,offset); |
| 514 | break; |
| 515 | case 0x10: |
| 516 | case 0x11: |
| 517 | case 0x12: |
| 518 | case 0x13: |
| 519 | case 0x14: |
| 520 | case 0x15: |
| 521 | case 0x16: |
| 522 | case 0x17: |
| 523 | logerror("WD1010 register %i read, mask %04x\n",offset-0x10,mem_mask); |
| 524 | break; |
| 525 | case 0x18: |
| 526 | case 0x19: |
| 527 | case 0x1a: |
| 528 | case 0x1b: |
| 529 | if(mem_mask & 0x00ff) |
| 530 | ret = m_hdc_timer->read(space,offset); |
| 531 | break; |
| 532 | } |
| 533 | |
| 534 | return ret; |
| 535 | } |
| 536 | |
| 408 | 537 | WRITE_LINE_MEMBER(ngen_state::fdc_irq_w) |
| 409 | 538 | { |
| 410 | 539 | m_pic->ir7_w(state); |
| r242963 | r242964 | |
| 564 | 693 | { |
| 565 | 694 | m_port00 = 0; |
| 566 | 695 | m_control = 0; |
| 696 | m_xbus_current = 0; |
| 567 | 697 | m_viduart->write_dsr(0); |
| 568 | 698 | m_viduart->write_cts(0); |
| 569 | 699 | m_fd0->get_device()->set_rpm(300); |
| r242963 | r242964 | |
| 578 | 708 | ADDRESS_MAP_END |
| 579 | 709 | |
| 580 | 710 | static ADDRESS_MAP_START( ngen_io, AS_IO, 16, ngen_state ) |
| 581 | | AM_RANGE(0x0000, 0x0001) AM_READWRITE(port00_r,port00_w) |
| 711 | AM_RANGE(0x0000, 0x0001) AM_READWRITE(xbus_r,xbus_w) |
| 582 | 712 | |
| 583 | | // TODO: allow for expansion modules to be allocated where asked to |
| 584 | 713 | // Floppy/Hard disk module |
| 585 | | AM_RANGE(0x0100, 0x0107) AM_DEVREADWRITE8("fdc",wd2797_t,read,write,0x00ff) // a guess for now |
| 586 | | AM_RANGE(0x0108, 0x0109) AM_WRITE8(fdc_control_w,0x00ff) |
| 587 | | AM_RANGE(0x010a, 0x010b) AM_WRITE8(hdc_control_w,0x00ff) |
| 588 | | AM_RANGE(0x010e, 0x010f) AM_WRITE8(disk_addr_ext,0x00ff) // X-Bus extended address register |
| 589 | | AM_RANGE(0x0110, 0x0117) AM_DEVREADWRITE8("fdc_timer",pit8253_device,read,write,0x00ff) |
| 714 | // AM_RANGE(0x0100, 0x0107) AM_DEVREADWRITE8("fdc",wd2797_t,read,write,0x00ff) // a guess for now |
| 715 | // AM_RANGE(0x0108, 0x0109) AM_WRITE8(fdc_control_w,0x00ff) |
| 716 | // AM_RANGE(0x010a, 0x010b) AM_WRITE8(hdc_control_w,0x00ff) |
| 717 | // AM_RANGE(0x010e, 0x010f) AM_WRITE8(disk_addr_ext,0x00ff) // X-Bus extended address register |
| 718 | // AM_RANGE(0x0110, 0x0117) AM_DEVREADWRITE8("fdc_timer",pit8253_device,read,write,0x00ff) |
| 590 | 719 | // 0x0120-0x012f - WD1010 Winchester disk controller (unemulated) |
| 591 | | AM_RANGE(0x0130, 0x0137) AM_DEVREADWRITE8("hdc_timer",pit8253_device,read,write,0x00ff) |
| 720 | // AM_RANGE(0x0130, 0x0137) AM_DEVREADWRITE8("hdc_timer",pit8253_device,read,write,0x00ff) |
| 592 | 721 | |
| 593 | 722 | ADDRESS_MAP_END |
| 594 | 723 | |
trunk/src/mess/drivers/splitsec.c
| r0 | r242964 | |
| 1 | // license:BSD-3-Clause |
| 2 | // copyright-holders:hap |
| 3 | /*************************************************************************** |
| 4 | |
| 5 | Parker Brothers Split Second |
| 6 | * TMS1400NLL MP7314-N2 (die labeled MP7314) |
| 7 | |
| 8 | |
| 9 | ***************************************************************************/ |
| 10 | |
| 11 | #include "emu.h" |
| 12 | #include "cpu/tms0980/tms0980.h" |
| 13 | #include "sound/speaker.h" |
| 14 | |
| 15 | #include "splitsec.lh" |
| 16 | |
| 17 | // master clock is a single stage RC oscillator: R=24K, C=100pf, |
| 18 | // according to the TMS 1000 series data manual this is around 375kHz |
| 19 | #define MASTER_CLOCK (375000) |
| 20 | |
| 21 | |
| 22 | class splitsec_state : public driver_device |
| 23 | { |
| 24 | public: |
| 25 | splitsec_state(const machine_config &mconfig, device_type type, const char *tag) |
| 26 | : driver_device(mconfig, type, tag), |
| 27 | m_maincpu(*this, "maincpu"), |
| 28 | m_button_matrix(*this, "IN"), |
| 29 | m_speaker(*this, "speaker") |
| 30 | { } |
| 31 | |
| 32 | required_device<cpu_device> m_maincpu; |
| 33 | required_ioport_array<2> m_button_matrix; |
| 34 | required_device<speaker_sound_device> m_speaker; |
| 35 | |
| 36 | UINT16 m_r; |
| 37 | UINT16 m_o; |
| 38 | |
| 39 | UINT16 m_leds_state[0x10]; |
| 40 | UINT16 m_leds_cache[0x10]; |
| 41 | UINT8 m_leds_decay[0x100]; |
| 42 | |
| 43 | DECLARE_READ8_MEMBER(read_k); |
| 44 | DECLARE_WRITE16_MEMBER(write_o); |
| 45 | DECLARE_WRITE16_MEMBER(write_r); |
| 46 | |
| 47 | TIMER_DEVICE_CALLBACK_MEMBER(leds_decay_tick); |
| 48 | void leds_update(); |
| 49 | |
| 50 | virtual void machine_start(); |
| 51 | }; |
| 52 | |
| 53 | |
| 54 | |
| 55 | /*************************************************************************** |
| 56 | |
| 57 | LEDs |
| 58 | |
| 59 | ***************************************************************************/ |
| 60 | |
| 61 | // The device strobes the outputs very fast, it is unnoticeable to the user. |
| 62 | // To prevent flickering here, we need to simulate a decay. |
| 63 | |
| 64 | // decay time, in steps of 10ms |
| 65 | #define LEDS_DECAY_TIME 4 |
| 66 | |
| 67 | void splitsec_state::leds_update() |
| 68 | { |
| 69 | UINT16 active_state[0x10]; |
| 70 | |
| 71 | for (int i = 0; i < 0x10; i++) |
| 72 | { |
| 73 | // update current state |
| 74 | if (m_r >> i & 1) |
| 75 | m_leds_state[i] = m_o; |
| 76 | |
| 77 | active_state[i] = 0; |
| 78 | |
| 79 | for (int j = 0; j < 0x10; j++) |
| 80 | { |
| 81 | int di = j << 4 | i; |
| 82 | |
| 83 | // turn on powered leds |
| 84 | if (m_leds_state[i] >> j & 1) |
| 85 | m_leds_decay[di] = LEDS_DECAY_TIME; |
| 86 | |
| 87 | // determine active state |
| 88 | int ds = (m_leds_decay[di] != 0) ? 1 : 0; |
| 89 | active_state[i] |= (ds << j); |
| 90 | } |
| 91 | } |
| 92 | |
| 93 | // on difference, send to output |
| 94 | for (int i = 0; i < 0x10; i++) |
| 95 | if (m_leds_cache[i] != active_state[i]) |
| 96 | { |
| 97 | for (int j = 0; j < 8; j++) |
| 98 | output_set_lamp_value(i*10 + j, active_state[i] >> j & 1); |
| 99 | } |
| 100 | |
| 101 | memcpy(m_leds_cache, active_state, sizeof(m_leds_cache)); |
| 102 | } |
| 103 | |
| 104 | TIMER_DEVICE_CALLBACK_MEMBER(splitsec_state::leds_decay_tick) |
| 105 | { |
| 106 | // slowly turn off unpowered leds |
| 107 | for (int i = 0; i < 0x100; i++) |
| 108 | if (!(m_leds_state[i & 0xf] >> (i>>4) & 1) && m_leds_decay[i]) |
| 109 | m_leds_decay[i]--; |
| 110 | |
| 111 | leds_update(); |
| 112 | } |
| 113 | |
| 114 | |
| 115 | |
| 116 | /*************************************************************************** |
| 117 | |
| 118 | I/O |
| 119 | |
| 120 | ***************************************************************************/ |
| 121 | |
| 122 | READ8_MEMBER(splitsec_state::read_k) |
| 123 | { |
| 124 | UINT8 k = 0; |
| 125 | |
| 126 | // read selected button rows |
| 127 | for (int i = 0; i < 2; i++) |
| 128 | if (m_r >> (i+9) & 1) |
| 129 | k |= m_button_matrix[i]->read(); |
| 130 | |
| 131 | return k; |
| 132 | } |
| 133 | |
| 134 | WRITE16_MEMBER(splitsec_state::write_r) |
| 135 | { |
| 136 | // R8: speaker out |
| 137 | m_speaker->level_w(data >> 8 & 1); |
| 138 | |
| 139 | // R9,R10: input mux |
| 140 | // R0-R7: led columns |
| 141 | m_r = data; |
| 142 | leds_update(); |
| 143 | } |
| 144 | |
| 145 | WRITE16_MEMBER(splitsec_state::write_o) |
| 146 | { |
| 147 | // O0-O6: led rows |
| 148 | // O7: N/C |
| 149 | m_o = data; |
| 150 | leds_update(); |
| 151 | } |
| 152 | |
| 153 | |
| 154 | |
| 155 | /*************************************************************************** |
| 156 | |
| 157 | Inputs |
| 158 | |
| 159 | ***************************************************************************/ |
| 160 | |
| 161 | static INPUT_PORTS_START( splitsec ) |
| 162 | PORT_START("IN.0") // R9 |
| 163 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) |
| 164 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) |
| 165 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) |
| 166 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 167 | |
| 168 | PORT_START("IN.1") // R10 |
| 169 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) |
| 170 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Select") |
| 171 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Start") |
| 172 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 173 | INPUT_PORTS_END |
| 174 | |
| 175 | |
| 176 | |
| 177 | /*************************************************************************** |
| 178 | |
| 179 | Machine Config |
| 180 | |
| 181 | ***************************************************************************/ |
| 182 | |
| 183 | void splitsec_state::machine_start() |
| 184 | { |
| 185 | // zerofill |
| 186 | memset(m_leds_state, 0, sizeof(m_leds_state)); |
| 187 | memset(m_leds_cache, 0, sizeof(m_leds_cache)); |
| 188 | memset(m_leds_decay, 0, sizeof(m_leds_decay)); |
| 189 | |
| 190 | m_r = 0; |
| 191 | m_o = 0; |
| 192 | |
| 193 | // register for savestates |
| 194 | save_item(NAME(m_leds_state)); |
| 195 | save_item(NAME(m_leds_cache)); |
| 196 | save_item(NAME(m_leds_decay)); |
| 197 | |
| 198 | save_item(NAME(m_r)); |
| 199 | save_item(NAME(m_o)); |
| 200 | } |
| 201 | |
| 202 | |
| 203 | static MACHINE_CONFIG_START( splitsec, splitsec_state ) |
| 204 | |
| 205 | /* basic machine hardware */ |
| 206 | MCFG_CPU_ADD("maincpu", TMS1400, MASTER_CLOCK) |
| 207 | MCFG_TMS1XXX_READ_K_CB(READ8(splitsec_state, read_k)) |
| 208 | MCFG_TMS1XXX_WRITE_O_CB(WRITE16(splitsec_state, write_o)) |
| 209 | MCFG_TMS1XXX_WRITE_R_CB(WRITE16(splitsec_state, write_r)) |
| 210 | |
| 211 | MCFG_TIMER_DRIVER_ADD_PERIODIC("leds_decay", splitsec_state, leds_decay_tick, attotime::from_msec(10)) |
| 212 | |
| 213 | MCFG_DEFAULT_LAYOUT(layout_splitsec) |
| 214 | |
| 215 | /* no video! */ |
| 216 | |
| 217 | /* sound hardware */ |
| 218 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 219 | MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) |
| 220 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 221 | MACHINE_CONFIG_END |
| 222 | |
| 223 | |
| 224 | |
| 225 | /*************************************************************************** |
| 226 | |
| 227 | Game driver(s) |
| 228 | |
| 229 | ***************************************************************************/ |
| 230 | |
| 231 | ROM_START( splitsec ) |
| 232 | ROM_REGION( 0x1000, "maincpu", 0 ) |
| 233 | ROM_LOAD( "tms1400nll_mp7314", 0x0000, 0x1000, CRC(0cccdf59) SHA1(06a533134a433aaf856b80f0ca239d0498b98d5f) ) |
| 234 | |
| 235 | ROM_REGION( 867, "maincpu:mpla", 0 ) |
| 236 | ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) |
| 237 | ROM_REGION( 557, "maincpu:opla", 0 ) |
| 238 | ROM_LOAD( "tms1400_splitsec_opla.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) ) |
| 239 | ROM_END |
| 240 | |
| 241 | |
| 242 | CONS( 1980, splitsec, 0, 0, splitsec, splitsec, driver_device, 0, "Parker Brothers", "Split Second", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) |
trunk/src/mess/layout/splitsec.lay
| r0 | r242964 | |
| 1 | <?xml version="1.0"?> |
| 2 | <mamelayout version="2"> |
| 3 | |
| 4 | <!-- define elements --> |
| 5 | |
| 6 | <element name="static_black"><rect><color red="0.0" green="0.0" blue="0.0" /></rect></element> |
| 7 | |
| 8 | <element name="lamp_disk" defstate="0"> |
| 9 | <disk state="1"><color red="1.0" green="0.24" blue="0.26" /></disk> |
| 10 | <disk state="0"><color red="0.15" green="0.043" blue="0.047" /></disk> |
| 11 | </element> |
| 12 | <element name="lamp_rect" defstate="0"> |
| 13 | <rect state="1"><color red="1.0" green="0.24" blue="0.26" /></rect> |
| 14 | <rect state="0"><color red="0.15" green="0.043" blue="0.047" /></rect> |
| 15 | </element> |
| 16 | |
| 17 | |
| 18 | <!-- build screen --> |
| 19 | |
| 20 | <view name="Internal Layout"> |
| 21 | <bounds left="0" right="18" top="0" bottom="28" /> |
| 22 | <bezel element="static_black"> |
| 23 | <bounds left="0" right="18" top="0" bottom="28" /> |
| 24 | </bezel> |
| 25 | |
| 26 | <!-- maze of lamps --> |
| 27 | |
| 28 | <bezel name="lamp6" element="lamp_rect"><bounds x="2" y="1" width="4" height="1" /></bezel> |
| 29 | <bezel name="lamp4" element="lamp_rect"><bounds x="7" y="1" width="4" height="1" /></bezel> |
| 30 | <bezel name="lamp2" element="lamp_rect"><bounds x="12" y="1" width="4" height="1" /></bezel> |
| 31 | |
| 32 | <bezel name="lamp16" element="lamp_rect"><bounds x="1" y="2" width="1" height="4" /></bezel> |
| 33 | <bezel name="lamp5" element="lamp_disk"><bounds x="3" y="3" width="2" height="2" /></bezel> |
| 34 | <bezel name="lamp14" element="lamp_rect"><bounds x="6" y="2" width="1" height="4" /></bezel> |
| 35 | <bezel name="lamp3" element="lamp_disk"><bounds x="8" y="3" width="2" height="2" /></bezel> |
| 36 | <bezel name="lamp12" element="lamp_rect"><bounds x="11" y="2" width="1" height="4" /></bezel> |
| 37 | <bezel name="lamp1" element="lamp_disk"><bounds x="13" y="3" width="2" height="2" /></bezel> |
| 38 | <bezel name="lamp10" element="lamp_rect"><bounds x="16" y="2" width="1" height="4" /></bezel> |
| 39 | |
| 40 | <bezel name="lamp15" element="lamp_rect"><bounds x="2" y="6" width="4" height="1" /></bezel> |
| 41 | <bezel name="lamp13" element="lamp_rect"><bounds x="7" y="6" width="4" height="1" /></bezel> |
| 42 | <bezel name="lamp11" element="lamp_rect"><bounds x="12" y="6" width="4" height="1" /></bezel> |
| 43 | |
| 44 | <bezel name="lamp26" element="lamp_rect"><bounds x="1" y="7" width="1" height="4" /></bezel> |
| 45 | <bezel name="lamp25" element="lamp_disk"><bounds x="3" y="8" width="2" height="2" /></bezel> |
| 46 | <bezel name="lamp24" element="lamp_rect"><bounds x="6" y="7" width="1" height="4" /></bezel> |
| 47 | <bezel name="lamp23" element="lamp_disk"><bounds x="8" y="8" width="2" height="2" /></bezel> |
| 48 | <bezel name="lamp22" element="lamp_rect"><bounds x="11" y="7" width="1" height="4" /></bezel> |
| 49 | <bezel name="lamp21" element="lamp_disk"><bounds x="13" y="8" width="2" height="2" /></bezel> |
| 50 | <bezel name="lamp20" element="lamp_rect"><bounds x="16" y="7" width="1" height="4" /></bezel> |
| 51 | |
| 52 | <bezel name="lamp35" element="lamp_rect"><bounds x="2" y="11" width="4" height="1" /></bezel> |
| 53 | <bezel name="lamp33" element="lamp_rect"><bounds x="7" y="11" width="4" height="1" /></bezel> |
| 54 | <bezel name="lamp31" element="lamp_rect"><bounds x="12" y="11" width="4" height="1" /></bezel> |
| 55 | |
| 56 | <bezel name="lamp36" element="lamp_rect"><bounds x="1" y="12" width="1" height="4" /></bezel> |
| 57 | <bezel name="lamp45" element="lamp_disk"><bounds x="3" y="13" width="2" height="2" /></bezel> |
| 58 | <bezel name="lamp34" element="lamp_rect"><bounds x="6" y="12" width="1" height="4" /></bezel> |
| 59 | <bezel name="lamp43" element="lamp_disk"><bounds x="8" y="13" width="2" height="2" /></bezel> |
| 60 | <bezel name="lamp32" element="lamp_rect"><bounds x="11" y="12" width="1" height="4" /></bezel> |
| 61 | <bezel name="lamp41" element="lamp_disk"><bounds x="13" y="13" width="2" height="2" /></bezel> |
| 62 | <bezel name="lamp30" element="lamp_rect"><bounds x="16" y="12" width="1" height="4" /></bezel> |
| 63 | |
| 64 | <bezel name="lamp55" element="lamp_rect"><bounds x="2" y="16" width="4" height="1" /></bezel> |
| 65 | <bezel name="lamp53" element="lamp_rect"><bounds x="7" y="16" width="4" height="1" /></bezel> |
| 66 | <bezel name="lamp51" element="lamp_rect"><bounds x="12" y="16" width="4" height="1" /></bezel> |
| 67 | |
| 68 | <bezel name="lamp46" element="lamp_rect"><bounds x="1" y="17" width="1" height="4" /></bezel> |
| 69 | <bezel name="lamp65" element="lamp_disk"><bounds x="3" y="18" width="2" height="2" /></bezel> |
| 70 | <bezel name="lamp44" element="lamp_rect"><bounds x="6" y="17" width="1" height="4" /></bezel> |
| 71 | <bezel name="lamp63" element="lamp_disk"><bounds x="8" y="18" width="2" height="2" /></bezel> |
| 72 | <bezel name="lamp42" element="lamp_rect"><bounds x="11" y="17" width="1" height="4" /></bezel> |
| 73 | <bezel name="lamp61" element="lamp_disk"><bounds x="13" y="18" width="2" height="2" /></bezel> |
| 74 | <bezel name="lamp40" element="lamp_rect"><bounds x="16" y="17" width="1" height="4" /></bezel> |
| 75 | |
| 76 | <bezel name="lamp75" element="lamp_rect"><bounds x="2" y="21" width="4" height="1" /></bezel> |
| 77 | <bezel name="lamp73" element="lamp_rect"><bounds x="7" y="21" width="4" height="1" /></bezel> |
| 78 | <bezel name="lamp71" element="lamp_rect"><bounds x="12" y="21" width="4" height="1" /></bezel> |
| 79 | |
| 80 | <bezel name="lamp56" element="lamp_rect"><bounds x="1" y="22" width="1" height="4" /></bezel> |
| 81 | <bezel name="lamp66" element="lamp_disk"><bounds x="3" y="23" width="2" height="2" /></bezel> |
| 82 | <bezel name="lamp54" element="lamp_rect"><bounds x="6" y="22" width="1" height="4" /></bezel> |
| 83 | <bezel name="lamp64" element="lamp_disk"><bounds x="8" y="23" width="2" height="2" /></bezel> |
| 84 | <bezel name="lamp52" element="lamp_rect"><bounds x="11" y="22" width="1" height="4" /></bezel> |
| 85 | <bezel name="lamp62" element="lamp_disk"><bounds x="13" y="23" width="2" height="2" /></bezel> |
| 86 | <bezel name="lamp50" element="lamp_rect"><bounds x="16" y="22" width="1" height="4" /></bezel> |
| 87 | |
| 88 | <bezel name="lamp76" element="lamp_rect"><bounds x="2" y="26" width="4" height="1" /></bezel> |
| 89 | <bezel name="lamp74" element="lamp_rect"><bounds x="7" y="26" width="4" height="1" /></bezel> |
| 90 | <bezel name="lamp72" element="lamp_rect"><bounds x="12" y="26" width="4" height="1" /></bezel> |
| 91 | |
| 92 | </view> |
| 93 | </mamelayout> |
trunk/src/osd/sdl/sdlmain.c
| r242963 | r242964 | |
| 717 | 717 | // font with the given name |
| 718 | 718 | //------------------------------------------------- |
| 719 | 719 | |
| 720 | | osd_font sdl_osd_interface::font_open(const char *_name, int &height) |
| 720 | class osd_font |
| 721 | 721 | { |
| 722 | public: |
| 723 | CTFontRef m_font; |
| 724 | }; |
| 725 | |
| 726 | osd_font *sdl_osd_interface::font_open(const char *_name, int &height) |
| 727 | { |
| 722 | 728 | CFStringRef font_name = NULL; |
| 723 | 729 | CTFontRef ct_font = NULL; |
| 724 | 730 | CTFontDescriptorRef font_descriptor; |
| r242963 | r242964 | |
| 770 | 776 | line_height += CTFontGetLeading(ct_font); |
| 771 | 777 | height = ceilf(line_height * EXTRA_HEIGHT); |
| 772 | 778 | |
| 773 | | return (osd_font)ct_font; |
| 779 | osd_font *ret = global_alloc(osd_font); |
| 780 | ret->m_font = ct_font; |
| 781 | return ret; |
| 774 | 782 | } |
| 775 | 783 | |
| 776 | 784 | //------------------------------------------------- |
| r242963 | r242964 | |
| 778 | 786 | // a given OSD font |
| 779 | 787 | //------------------------------------------------- |
| 780 | 788 | |
| 781 | | void sdl_osd_interface::font_close(osd_font font) |
| 789 | void sdl_osd_interface::font_close(osd_font *font) |
| 782 | 790 | { |
| 783 | | CTFontRef ct_font = (CTFontRef)font; |
| 791 | CTFontRef ct_font = font->m_font; |
| 784 | 792 | |
| 785 | 793 | if( ct_font != NULL ) |
| 786 | 794 | { |
| 787 | 795 | CFRelease( ct_font ); |
| 788 | 796 | } |
| 797 | global_free(font); |
| 789 | 798 | } |
| 790 | 799 | |
| 791 | 800 | //------------------------------------------------- |
| r242963 | r242964 | |
| 796 | 805 | // pixel of a black & white font |
| 797 | 806 | //------------------------------------------------- |
| 798 | 807 | |
| 799 | | bool sdl_osd_interface::font_get_bitmap(osd_font font, unicode_char chnum, bitmap_argb32 &bitmap, INT32 &width, INT32 &xoffs, INT32 &yoffs) |
| 808 | bool sdl_osd_interface::font_get_bitmap(osd_font *font, unicode_char chnum, bitmap_argb32 &bitmap, INT32 &width, INT32 &xoffs, INT32 &yoffs) |
| 800 | 809 | { |
| 801 | 810 | UniChar uni_char; |
| 802 | 811 | CGGlyph glyph; |
| 803 | | CTFontRef ct_font = (CTFontRef)font; |
| 812 | CTFontRef ct_font = font->m_font; |
| 804 | 813 | const CFIndex count = 1; |
| 805 | 814 | CGRect bounding_rect, success_rect; |
| 806 | 815 | CGContextRef context_ref; |
| r242963 | r242964 | |
| 1009 | 1018 | // font with the given name |
| 1010 | 1019 | //------------------------------------------------- |
| 1011 | 1020 | |
| 1012 | | osd_font sdl_osd_interface::font_open(const char *_name, int &height) |
| 1021 | class osd_font |
| 1013 | 1022 | { |
| 1023 | public: |
| 1024 | TTF_Font *m_font; |
| 1025 | }; |
| 1026 | |
| 1027 | osd_font *sdl_osd_interface::font_open(const char *_name, int &height) |
| 1028 | { |
| 1014 | 1029 | TTF_Font *font = (TTF_Font *)NULL; |
| 1015 | 1030 | bool bakedstyles = false; |
| 1016 | 1031 | int style = 0; |
| r242963 | r242964 | |
| 1081 | 1096 | |
| 1082 | 1097 | height = TTF_FontLineSkip(font); |
| 1083 | 1098 | |
| 1084 | | return (osd_font)font; |
| 1099 | osd_font *ret = global_alloc(osd_font); |
| 1100 | ret->m_font = font; |
| 1101 | return ret; |
| 1085 | 1102 | } |
| 1086 | 1103 | |
| 1087 | 1104 | //------------------------------------------------- |
| r242963 | r242964 | |
| 1089 | 1106 | // a given OSD font |
| 1090 | 1107 | //------------------------------------------------- |
| 1091 | 1108 | |
| 1092 | | void sdl_osd_interface::font_close(osd_font font) |
| 1109 | void sdl_osd_interface::font_close(osd_font *font) |
| 1093 | 1110 | { |
| 1094 | | TTF_Font *ttffont; |
| 1095 | | |
| 1096 | | ttffont = (TTF_Font *)font; |
| 1097 | | |
| 1098 | | TTF_CloseFont(ttffont); |
| 1111 | TTF_CloseFont(font->m_font); |
| 1112 | global_free(font); |
| 1099 | 1113 | } |
| 1100 | 1114 | |
| 1101 | 1115 | //------------------------------------------------- |
| r242963 | r242964 | |
| 1106 | 1120 | // pixel of a black & white font |
| 1107 | 1121 | //------------------------------------------------- |
| 1108 | 1122 | |
| 1109 | | bool sdl_osd_interface::font_get_bitmap(osd_font font, unicode_char chnum, bitmap_argb32 &bitmap, INT32 &width, INT32 &xoffs, INT32 &yoffs) |
| 1123 | bool sdl_osd_interface::font_get_bitmap(osd_font *font, unicode_char chnum, bitmap_argb32 &bitmap, INT32 &width, INT32 &xoffs, INT32 &yoffs) |
| 1110 | 1124 | { |
| 1111 | 1125 | TTF_Font *ttffont; |
| 1112 | 1126 | SDL_Surface *drawsurf; |
| 1113 | 1127 | SDL_Color fcol = { 0xff, 0xff, 0xff }; |
| 1114 | 1128 | UINT16 ustr[16]; |
| 1115 | 1129 | |
| 1116 | | ttffont = (TTF_Font *)font; |
| 1130 | ttffont = font->m_font; |
| 1117 | 1131 | |
| 1118 | 1132 | memset(ustr,0,sizeof(ustr)); |
| 1119 | 1133 | ustr[0] = (UINT16)chnum; |