void halt_error(THaltError reason, const char *fmt, ...) { halt_printf("HALT_ERROR: "); /* print actual error */ va_list va; va_start(va, fmt); tfp_format(NULL, halt_putcp, fmt, va); va_end(va); /* final line feed */ default_putc('\n'); /* Die. */ halt(reason); }
void do_c70d(word32 arg0) { int cmd; int cmd_list_lo, cmd_list_mid, cmd_list_hi; int rts_lo, rts_hi; word32 rts_addr; word32 cmd_list; int unit; int param_cnt; int status_ptr_lo, status_ptr_mid, status_ptr_hi; int buf_ptr_lo, buf_ptr_hi; int buf_ptr; int block_lo, block_mid, block_hi; int block; word32 status_ptr; int status_code; int ctl_ptr_lo, ctl_ptr_hi; int ctl_ptr; int ctl_code; int mask; int stat_val; int size; int ret; int ext; int i; set_memory_c(0x7f8, 0xc7, 0); if((engine.psr & 0x100) == 0) { disk_printf("c70d called in native mode!\n"); if((engine.psr & 0x30) != 0x30) { halt_printf("c70d called native, psr: %03x!\n", engine.psr); } } engine.stack = ((engine.stack + 1) & 0xff) + 0x100; rts_lo = get_memory_c(engine.stack, 0); engine.stack = ((engine.stack + 1) & 0xff) + 0x100; rts_hi = get_memory_c(engine.stack, 0); rts_addr = (rts_lo + (256*rts_hi) + 1) & 0xffff; disk_printf("rts_addr: %04x\n", rts_addr); cmd = get_memory_c(rts_addr, 0); cmd_list_lo = get_memory_c((rts_addr + 1) & 0xffff, 0); cmd_list_mid = get_memory_c((rts_addr + 2) & 0xffff, 0); cmd_list_hi = 0; mask = 0xffff; if(cmd & 0x40) { /* extended */ mask = 0xffffff; cmd_list_hi = get_memory_c((rts_addr + 3) & 0xffff, 0); } cmd_list = cmd_list_lo + (256*cmd_list_mid) + (65536*cmd_list_hi); disk_printf("cmd: %02x, cmd_list: %06x\n", cmd, cmd_list); param_cnt = get_memory_c(cmd_list, 0); ext = 0; if(cmd & 0x40) { ext = 2; } smartport_log(0xc70d, cmd, rts_addr, cmd_list); switch(cmd & 0x3f) { case 0x00: /* Status == 0x00 and 0x40 */ if(param_cnt != 3) { disk_printf("param_cnt %d is != 3!\n", param_cnt); exit(8); } unit = get_memory_c((cmd_list+1) & mask, 0); status_ptr_lo = get_memory_c((cmd_list+2) & mask, 0); status_ptr_mid = get_memory_c((cmd_list+3) & mask, 0); status_ptr_hi = 0; if(cmd & 0x40) { status_ptr_hi = get_memory_c((cmd_list+4) & mask, 0); } status_ptr = status_ptr_lo + (256*status_ptr_mid) + (65536*status_ptr_hi); if(cmd & 0x40) { status_code = get_memory_c((cmd_list+6) & mask, 0); } else { status_code = get_memory_c((cmd_list+4) & mask, 0); } smartport_log(0, unit, status_ptr, status_code); disk_printf("unit: %02x, status_ptr: %06x, code: %02x\n", unit, status_ptr, status_code); if(unit == 0 && status_code == 0) { /* Smartport driver status */ /* see technotes/smpt/tn-smpt-002 */ set_memory_c(status_ptr, g_highest_smartport_unit+1, 0); set_memory_c(status_ptr+1, 0xff, 0); /* interrupt stat*/ set_memory16_c(status_ptr+2, 0x0002, 0); /* vendor id */ set_memory16_c(status_ptr+4, 0x1000, 0); /* version */ set_memory16_c(status_ptr+6, 0x0000, 0); engine.xreg = 8; engine.yreg = 0; engine.acc &= 0xff00; engine.psr &= ~1; engine.kpc = (rts_addr + 3 + ext) & mask; return; } else if(unit > 0 && status_code == 0) { /* status for unit x */ if(unit > MAX_C7_DISKS || (!iwm.smartport[unit-1].file)){ stat_val = 0x80; size = 0; } else { stat_val = 0xf8; size = iwm.smartport[unit-1].image_size; size = (size+511) / 512; } set_memory_c(status_ptr, stat_val, 0); set_memory24_c(status_ptr +1, size, 0); engine.xreg = 4; if(cmd & 0x40) { set_memory_c(status_ptr + 4, (size >> 16) & 0xff, 0); engine.xreg = 5; } engine.yreg = 0; engine.acc &= 0xff00; engine.psr &= ~1; engine.kpc = (rts_addr + 3 + ext) & mask; disk_printf("just finished unit %d, stat 0\n", unit); return; } else if(status_code == 3) {