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 | } |