trunk/src/emu/machine/6522via.c
r26882 | r26883 | |
157 | 157 | m_cb1_handler(*this), |
158 | 158 | m_cb2_handler(*this), |
159 | 159 | m_irq_handler(*this), |
| 160 | m_in_a(0), |
| 161 | m_in_ca1(0), |
| 162 | m_in_ca2(0), |
| 163 | m_in_b(0), |
| 164 | m_in_cb1(0), |
| 165 | m_in_cb2(0), |
160 | 166 | m_irq(CLEAR_LINE) |
161 | 167 | { |
162 | 168 | } |
r26882 | r26883 | |
188 | 194 | m_ca2_timer = timer_alloc(TIMER_CA2); |
189 | 195 | m_shift_timer = timer_alloc(TIMER_SHIFT); |
190 | 196 | m_pcr = 0; |
191 | | m_in_ca1 = 0; |
192 | | m_in_ca2 = 0; |
193 | 197 | |
194 | 198 | /* Default clock is from CPU1 */ |
195 | 199 | if (clock() == 0) |
r26882 | r26883 | |
236 | 240 | |
237 | 241 | void via6522_device::device_reset() |
238 | 242 | { |
239 | | m_in_a = 0; |
240 | | m_in_ca1 = 0; |
241 | | m_in_ca2 = 0; |
242 | 243 | m_out_a = 0; |
243 | 244 | m_out_ca2 = 0; |
244 | 245 | m_ddr_a = 0; |
245 | | m_in_b = 0; |
246 | | m_in_cb1 = 0; |
247 | | m_in_cb2 = 0; |
248 | 246 | m_out_b = 0; |
249 | 247 | m_out_cb2 = 0; |
250 | 248 | m_ddr_b = 0; |
r26882 | r26883 | |
322 | 320 | |
323 | 321 | m_cb2_handler(m_out_cb2); |
324 | 322 | |
325 | | m_in_cb1=1; |
326 | | |
327 | 323 | /* this should be one cycle wide */ |
328 | 324 | m_cb1_handler(0); |
329 | 325 | m_cb1_handler(1); |
r26882 | r26883 | |
957 | 953 | |
958 | 954 | WRITE_LINE_MEMBER( via6522_device::write_ca1 ) |
959 | 955 | { |
960 | | /* handle the active transition */ |
961 | | if (state != m_in_ca1) |
| 956 | if (m_in_ca1 != state) |
962 | 957 | { |
| 958 | m_in_ca1 = state; |
| 959 | |
963 | 960 | if (TRACE_VIA) |
964 | | logerror("%s:6522VIA chip %s: CA1 = %02X\n", machine().describe_context(), tag(), state); |
| 961 | logerror("%s:6522VIA chip %s: CA1 = %02X\n", machine().describe_context(), tag(), m_in_ca1); |
965 | 962 | |
966 | | if ((CA1_LOW_TO_HIGH(m_pcr) && state) || (CA1_HIGH_TO_LOW(m_pcr) && !state)) |
| 963 | if ((m_in_ca1 && CA1_LOW_TO_HIGH(m_pcr)) || (!m_in_ca1 && CA1_HIGH_TO_LOW(m_pcr))) |
967 | 964 | { |
968 | 965 | if (PA_LATCH_ENABLE(m_acr)) |
969 | 966 | { |
r26882 | r26883 | |
993 | 990 | } |
994 | 991 | } |
995 | 992 | } |
996 | | |
997 | | m_in_ca1 = state; |
998 | 993 | } |
999 | 994 | } |
1000 | 995 | |
r26882 | r26883 | |
1005 | 1000 | |
1006 | 1001 | WRITE_LINE_MEMBER( via6522_device::write_ca2 ) |
1007 | 1002 | { |
1008 | | /* CA2 is in input mode */ |
1009 | | if (CA2_INPUT(m_pcr)) |
| 1003 | if (m_in_ca2 != state) |
1010 | 1004 | { |
1011 | | /* the new state has caused a transition */ |
1012 | | if (m_in_ca2 != state) |
| 1005 | m_in_ca2 = state; |
| 1006 | |
| 1007 | /* CA2 is in input mode */ |
| 1008 | if (CA2_INPUT(m_pcr)) |
1013 | 1009 | { |
1014 | 1010 | /* handle the active transition */ |
1015 | | if ((state && CA2_LOW_TO_HIGH(m_pcr)) || (!state && CA2_HIGH_TO_LOW(m_pcr))) |
| 1011 | if ((m_in_ca2 && CA2_LOW_TO_HIGH(m_pcr)) || (!m_in_ca2 && CA2_HIGH_TO_LOW(m_pcr))) |
1016 | 1012 | { |
1017 | 1013 | /* mark the IRQ */ |
1018 | 1014 | set_int(INT_CA2); |
1019 | 1015 | } |
1020 | | /* set the new value for CA2 */ |
1021 | | m_in_ca2 = state; |
1022 | 1016 | } |
1023 | 1017 | } |
1024 | 1018 | } |
r26882 | r26883 | |
1037 | 1031 | |
1038 | 1032 | WRITE_LINE_MEMBER( via6522_device::write_cb1 ) |
1039 | 1033 | { |
1040 | | /* handle the active transition */ |
1041 | | if (state != m_in_cb1) |
| 1034 | if (m_in_cb1 != state) |
1042 | 1035 | { |
1043 | | if ((CB1_LOW_TO_HIGH(m_pcr) && state) || (CB1_HIGH_TO_LOW(m_pcr) && !state)) |
| 1036 | m_in_cb1 = state; |
| 1037 | |
| 1038 | if ((m_in_cb1 && CB1_LOW_TO_HIGH(m_pcr)) || (!m_in_cb1 && CB1_HIGH_TO_LOW(m_pcr))) |
1044 | 1039 | { |
1045 | 1040 | if (PB_LATCH_ENABLE(m_acr)) |
1046 | 1041 | { |
r26882 | r26883 | |
1053 | 1048 | logerror("%s:6522VIA chip %s: Port B is being read but has no handler\n", machine().describe_context(), tag()); |
1054 | 1049 | } |
1055 | 1050 | } |
| 1051 | |
1056 | 1052 | if (SO_EXT_CONTROL(m_acr) || SI_EXT_CONTROL(m_acr)) |
1057 | 1053 | { |
1058 | 1054 | shift(); |
r26882 | r26883 | |
1074 | 1070 | } |
1075 | 1071 | } |
1076 | 1072 | } |
1077 | | m_in_cb1 = state; |
1078 | 1073 | } |
1079 | 1074 | } |
1080 | 1075 | |
r26882 | r26883 | |
1085 | 1080 | |
1086 | 1081 | WRITE_LINE_MEMBER( via6522_device::write_cb2 ) |
1087 | 1082 | { |
1088 | | /* the new state has caused a transition */ |
1089 | 1083 | if (m_in_cb2 != state) |
1090 | 1084 | { |
| 1085 | m_in_cb2 = state; |
| 1086 | |
1091 | 1087 | /* CB2 is in input mode */ |
1092 | 1088 | if (CB2_INPUT(m_pcr)) |
1093 | 1089 | { |
1094 | 1090 | /* handle the active transition */ |
1095 | | if ((state && CB2_LOW_TO_HIGH(m_pcr)) || (!state && CB2_HIGH_TO_LOW(m_pcr))) |
| 1091 | if ((m_in_cb2 && CB2_LOW_TO_HIGH(m_pcr)) || (!m_in_cb2 && CB2_HIGH_TO_LOW(m_pcr))) |
1096 | 1092 | { |
1097 | 1093 | /* mark the IRQ */ |
1098 | 1094 | set_int(INT_CB2); |
1099 | 1095 | } |
1100 | 1096 | } |
1101 | | |
1102 | | /* set the new value for CB2 */ |
1103 | | m_in_cb2 = state; |
1104 | 1097 | } |
1105 | 1098 | } |