branches/alto2/src/emu/cpu/alto2/alto2.c
| r26188 | r26189 | |
| 44 | 44 | alto2_cpu_device::alto2_cpu_device(const machine_config& mconfig, const char* tag, device_t* owner, UINT32 clock) : |
| 45 | 45 | cpu_device(mconfig, ALTO2, "Xerox Alto-II", tag, owner, clock, "alto2", __FILE__), |
| 46 | 46 | #if ALTO2_DEBUG |
| 47 | | m_log_types(LOG_DISK|LOG_KSEC|LOG_KWD), |
| 47 | m_log_types(LOG_CPU|LOG_DISK|LOG_KSEC|LOG_KWD), |
| 48 | 48 | m_log_level(6), |
| 49 | 49 | m_log_newline(true), |
| 50 | 50 | #endif |
| r26188 | r26189 | |
| 2574 | 2574 | * early f2 has to be done before early bs, because the |
| 2575 | 2575 | * emulator f2 acsource or acdest may change rsel |
| 2576 | 2576 | */ |
| 2577 | | if (m_f2[0][m_task][f2]) |
| 2578 | | ((*this).*m_f2[0][m_task][f2])(); |
| 2577 | ((*this).*m_f2[0][m_task][f2])(); |
| 2579 | 2578 | |
| 2580 | 2579 | /* |
| 2581 | 2580 | * early bs can be done now |
| 2582 | 2581 | */ |
| 2583 | 2582 | if (do_bs) |
| 2584 | | if (m_bs[0][m_task][bs]) |
| 2585 | | ((*this).*m_bs[0][m_task][bs])(); |
| 2583 | ((*this).*m_bs[0][m_task][bs])(); |
| 2586 | 2584 | |
| 2587 | 2585 | /* |
| 2588 | 2586 | * early f1 |
| 2589 | 2587 | */ |
| 2590 | | if (m_f1[0][m_task][f1]) |
| 2591 | | ((*this).*m_f1[0][m_task][f1])(); |
| 2588 | ((*this).*m_f1[0][m_task][f1])(); |
| 2592 | 2589 | |
| 2593 | 2590 | /* compute the ALU function */ |
| 2594 | 2591 | switch (aluf) { |
| r26188 | r26189 | |
| 2914 | 2911 | } |
| 2915 | 2912 | |
| 2916 | 2913 | /* late F1 is done now, if any */ |
| 2917 | | if (m_f1[1][m_task][f1]) |
| 2918 | | ((*this).*m_f1[1][m_task][f1])(); |
| 2914 | ((*this).*m_f1[1][m_task][f1])(); |
| 2919 | 2915 | |
| 2920 | 2916 | /* late F2 is done now, if any */ |
| 2921 | | if (m_f2[1][m_task][f2]) |
| 2922 | | ((*this).*m_f2[1][m_task][f2])(); |
| 2917 | ((*this).*m_f2[1][m_task][f2])(); |
| 2923 | 2918 | |
| 2924 | 2919 | /* late BS is done now, if no constant was put on the bus */ |
| 2925 | 2920 | if (do_bs) |
| 2926 | | if (m_bs[1][m_task][bs]) |
| 2927 | | ((*this).*m_bs[1][m_task][bs])(); |
| 2921 | ((*this).*m_bs[1][m_task][bs])(); |
| 2928 | 2922 | |
| 2929 | 2923 | /* |
| 2930 | 2924 | * update L register and LALUC0, and also M register, |
| r26188 | r26189 | |
| 2977 | 2971 | /* get address modifier after task switch (?) */ |
| 2978 | 2972 | m_next2 = m_task_next2[m_task]; |
| 2979 | 2973 | |
| 2980 | | if (m_active_callback[m_task]) { |
| 2981 | | /* |
| 2982 | | * let the task know it becomes active now |
| 2983 | | * and (most probably) reset the wakeup |
| 2984 | | */ |
| 2985 | | ((*this).*m_active_callback[m_task])(); |
| 2986 | | } |
| 2974 | /* |
| 2975 | * let the task know it becomes active now |
| 2976 | * and (most probably) reset the wakeup |
| 2977 | */ |
| 2978 | ((*this).*m_active_callback[m_task])(); |
| 2987 | 2979 | } |
| 2988 | 2980 | } |
| 2989 | 2981 | } while (m_icount-- > 0); |
| r26188 | r26189 | |
| 3006 | 2998 | |
| 3007 | 2999 | // every task starts at mpc = task number, in either ROM0 or RAM0 |
| 3008 | 3000 | m_task_mpc[task] = (m_ctl2k_u38[task] >> 4) ^ 017; |
| 3001 | m_active_callback[task] = &alto2_cpu_device::noop; |
| 3009 | 3002 | if (0 == (m_reset_mode & (1 << task))) |
| 3010 | 3003 | m_task_mpc[task] |= ALTO2_UCODE_RAM_BASE; |
| 3011 | 3004 | |
branches/alto2/src/emu/cpu/alto2/alto2dsm.c
| r26188 | r26189 | |
| 125 | 125 | "R37" |
| 126 | 126 | }; |
| 127 | 127 | |
| 128 | //! for ALUF which is the value loaded into T, if t flags is set |
| 129 | static const char* t_bus_alu[16] = { |
| 130 | "ALU", |
| 131 | "BUS", |
| 132 | "ALU", |
| 133 | "BUS", |
| 134 | "BUS", |
| 135 | "ALU", |
| 136 | "ALU", |
| 137 | "BUS", |
| 138 | "BUS", |
| 139 | "BUS", |
| 140 | "ALU", |
| 141 | "ALU", |
| 142 | "ALU", |
| 143 | "BUS", |
| 144 | "BUS", |
| 145 | "BUS", |
| 146 | }; |
| 147 | |
| 128 | 148 | /** |
| 129 | 149 | * @brief copy of the constant PROM, which this disassembler may not have access to |
| 130 | 150 | */ |
| r26188 | r26189 | |
| 216 | 236 | if (next != pc + 1) |
| 217 | 237 | result |= DASMFLAG_STEP_OUT; |
| 218 | 238 | |
| 239 | if (t) |
| 240 | dst += snprintf(dst, len - (size_t)(dst - buffer), "T←%s ", t_bus_alu[aluf]); |
| 241 | if (l) |
| 242 | dst += snprintf(dst, len - (size_t)(dst - buffer), "L← "); |
| 243 | if (bs == 1) |
| 244 | dst += snprintf(dst, len - (size_t)(dst - buffer), "%s← ", regname[rsel]); |
| 219 | 245 | switch (aluf) { |
| 220 | 246 | case 0: // T?: BUS |
| 221 | | if (t) |
| 222 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "T←ALU "); |
| 223 | | if (l) |
| 224 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "L← "); |
| 225 | | if (bs == 1) |
| 226 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "%s← ", regname[rsel]); |
| 227 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(BUS) "); |
| 247 | // this is somehow redundant and just wasting space |
| 248 | // dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(BUS) "); |
| 228 | 249 | break; |
| 229 | 250 | case 1: // : T |
| 230 | | if (t) |
| 231 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "T←BUS "); |
| 232 | | if (l) |
| 233 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "L← "); |
| 234 | | if (bs == 1) |
| 235 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "%s← ", regname[rsel]); |
| 236 | 251 | dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(T) "); |
| 237 | 252 | break; |
| 238 | 253 | case 2: // T?: BUS OR T |
| 239 | | if (t) |
| 240 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "T←ALU "); |
| 241 | | if (l) |
| 242 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "L← "); |
| 243 | | if (bs == 1) |
| 244 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "%s← ", regname[rsel]); |
| 245 | 254 | dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(BUS OR T) "); |
| 246 | 255 | break; |
| 247 | 256 | case 3: // : BUS AND T |
| 248 | | if (t) |
| 249 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "T←BUS "); |
| 250 | | if (l) |
| 251 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "L← "); |
| 252 | | if (bs == 1) |
| 253 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "%s← ", regname[rsel]); |
| 254 | 257 | dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(BUS AND T) "); |
| 255 | 258 | break; |
| 256 | 259 | case 4: // : BUS XOR T |
| 257 | | if (t) |
| 258 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "T←BUS "); |
| 259 | | if (l) |
| 260 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "L← "); |
| 261 | | if (bs == 1) |
| 262 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "%s← ", regname[rsel]); |
| 263 | 260 | dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(BUS XOR T) "); |
| 264 | 261 | break; |
| 265 | 262 | case 5: // T?: BUS + 1 |
| 266 | | if (t) |
| 267 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "T←ALU "); |
| 268 | | if (l) |
| 269 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "L← "); |
| 270 | | if (bs == 1) |
| 271 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "%s← ", regname[rsel]); |
| 272 | 263 | dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(BUS + 1) "); |
| 273 | 264 | break; |
| 274 | 265 | case 6: // T?: BUS - 1 |
| 275 | | if (t) |
| 276 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "T←ALU "); |
| 277 | | if (l) |
| 278 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "L← "); |
| 279 | | if (bs == 1) |
| 280 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "%s← ", regname[rsel]); |
| 281 | 266 | dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(BUS - 1) "); |
| 282 | 267 | break; |
| 283 | 268 | case 7: // : BUS + T |
| 284 | | if (t) |
| 285 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "T←BUS "); |
| 286 | | if (l) |
| 287 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "L← "); |
| 288 | | if (bs == 1) |
| 289 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "%s← ", regname[rsel]); |
| 290 | 269 | dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(BUS + T) "); |
| 291 | 270 | break; |
| 292 | 271 | case 8: // : BUS - T |
| 293 | | if (t) |
| 294 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "T←BUS "); |
| 295 | | if (l) |
| 296 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "L← "); |
| 297 | | if (bs == 1) |
| 298 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "%s← ", regname[rsel]); |
| 299 | 272 | dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(BUS - T) "); |
| 300 | 273 | break; |
| 301 | 274 | case 9: // : BUS - T - 1 |
| 302 | | if (t) |
| 303 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "T←BUS "); |
| 304 | | if (l) |
| 305 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "L← "); |
| 306 | | if (bs == 1) |
| 307 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "%s← ", regname[rsel]); |
| 308 | 275 | dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(BUS - T - 1) "); |
| 309 | 276 | break; |
| 310 | 277 | case 10: // T?: BUS + T + 1 |
| 311 | | if (t) |
| 312 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "T←ALU "); |
| 313 | | if (l) |
| 314 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "L← "); |
| 315 | | if (bs == 1) |
| 316 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "%s← ", regname[rsel]); |
| 317 | 278 | dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(BUS + T + 1) "); |
| 318 | 279 | break; |
| 319 | 280 | case 11: // T?: BUS + SKIP |
| 320 | | if (t) |
| 321 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "T←ALU "); |
| 322 | | if (l) |
| 323 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "L← "); |
| 324 | | if (bs == 1) |
| 325 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "%s← ", regname[rsel]); |
| 326 | 281 | dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(BUS + SKIP) "); |
| 327 | 282 | break; |
| 328 | 283 | case 12: // T?: BUS, T (AND) |
| 329 | | if (t) |
| 330 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "T←ALU "); |
| 331 | | if (l) |
| 332 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "L← "); |
| 333 | | if (bs == 1) |
| 334 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "%s← ", regname[rsel]); |
| 335 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(BUS AND T) "); |
| 284 | dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(BUS, T) "); |
| 336 | 285 | break; |
| 337 | 286 | case 13: // : BUS AND NOT T |
| 338 | | if (t) |
| 339 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "T←BUS "); |
| 340 | | if (l) |
| 341 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "L← "); |
| 342 | | if (bs == 1) |
| 343 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "%s← ", regname[rsel]); |
| 344 | 287 | dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(BUS AND NOT T) "); |
| 345 | 288 | break; |
| 346 | 289 | case 14: // : undefined |
| 347 | | if (t) |
| 348 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "T←BUS "); |
| 349 | | if (l) |
| 350 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "L← "); |
| 351 | | if (bs == 1) |
| 352 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "%s← ", regname[rsel]); |
| 353 | 290 | dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(14) "); |
| 354 | 291 | break; |
| 355 | 292 | case 15: // : undefined |
| 356 | | if (t) |
| 357 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "T←BUS "); |
| 358 | | if (l) |
| 359 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "L← "); |
| 360 | | if (bs == 1) |
| 361 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "%s← ", regname[rsel]); |
| 362 | 293 | dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(15) "); |
| 363 | 294 | break; |
| 364 | 295 | } |
| r26188 | r26189 | |
| 414 | 345 | break; |
| 415 | 346 | case 7: // put the constant from PROM (RSELECT,BS) on the bus |
| 416 | 347 | pa = (rsel << 3) | bs; |
| 417 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS←[%03o]%05o ", pa, const_prom[pa]); |
| 348 | dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS←%05o CONST[%03o]", const_prom[pa], pa); |
| 418 | 349 | break; |
| 419 | 350 | default: |
| 420 | 351 | dst += snprintf(dst, len - (size_t)(dst - buffer), "F1_%02o ", f1); |
| r26188 | r26189 | |
| 451 | 382 | dst += snprintf(dst, len - (size_t)(dst - buffer), "MD←BUS "); |
| 452 | 383 | break; |
| 453 | 384 | case 7: // put on the bus the constant from PROM (RSELECT,BS) |
| 454 | | pa = 8 * rsel + bs; |
| 455 | | dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS←%05o CONST[%03o]", const_prom[pa], pa); |
| 385 | if (f1 != 7) { |
| 386 | pa = 8 * rsel + bs; |
| 387 | dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS←%05o CONST[%03o]", const_prom[pa], pa); |
| 388 | } |
| 456 | 389 | break; |
| 457 | 390 | default: |
| 458 | 391 | dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS←F2_%02o ", f2); |