* \file udi_lib/physio/pio.c
* \author John Hodge (thePowersGang)
*/
-#define DEBUG 1
+#define DEBUG 0
#include <udi.h>
#include <udi_physio.h>
#include <acess.h>
case UDI_PIO_IN:
pio_handle->IOFunc(pio_handle->ChildID, pio_handle->RegSet,
operand, tran_size, &tmpval, false);
+ LOG("IN %x = %i %x", operand, tran_size, tmpval.words[0]);
_write_mem(gcb, buf, mem_ptr, (pio_op&0x18), tran_size, reg, &tmpval);
break;
case UDI_PIO_OUT:
break;
case UDI_PIO_LOAD:
_read_mem(gcb, buf, mem_ptr, (pio_op&0x18), tran_size, reg, ®isters[operand]);
+ LOG("LOAD R%x = %i %x", operand, tran_size, registers[operand].words[0]);
_zero_upper(tran_size, ®isters[operand]);
break;
case UDI_PIO_STORE:
+ LOG("STORE R%x (%i %x)", operand, tran_size, registers[operand].words[0]);
_write_mem(gcb, buf, mem_ptr, (pio_op&0x18), tran_size, reg, ®isters[operand]);
break;
}
reg->words[0] = operand;
break;
}
+ LOG("LOAD IMM ");
_zero_upper(tran_size, reg);
ip += (1<<tran_size)/2-1;
break;
}
break; }
case UDI_PIO_IN_IND:
+ LOG("IN IND");
pio_handle->IOFunc(pio_handle->ChildID, pio_handle->RegSet,
registers[operand].words[0], tran_size, reg, false);
_zero_upper(tran_size, reg);
break;
case UDI_PIO_OUT_IND:
+ LOG("OUT IND");
pio_handle->IOFunc(pio_handle->ChildID, pio_handle->RegSet,
registers[operand].words[0], tran_size, reg, true);
break;
_operation_and(tran_size, reg, ®isters[operand]);
break;
case UDI_PIO_AND_IMM:
+ LOG("AND_IMM R%i &= 0x%x", reg_num, operand);
tmpval.words[0] = operand;
_zero_upper(UDI_PIO_2BYTE, &tmpval);
_operation_and(tran_size, reg, &tmpval);
_operation_or(tran_size, reg, ®isters[operand]);
break;
case UDI_PIO_OR_IMM:
+ LOG("OR_IMM R%i |= 0x%x", reg_num, operand);
tmpval.words[0] = operand;
_zero_upper(UDI_PIO_4BYTE, &tmpval);
_operation_or(tran_size, reg, &tmpval);
switch(pio_op)
{
case UDI_PIO_BRANCH:
+ LOG("BRANCH %i", operand);
ip = _get_label(pio_handle, operand);
break;
case UDI_PIO_LABEL:
// nop
+ LOG("LABEL %i", operand);
break;
case UDI_PIO_REP_IN_IND:
case UDI_PIO_REP_OUT_IND: {
ret_status = registers[operand].words[0] & 0xFFFF;
else
ret_status = registers[operand].words[0] & 0xFF;
+ LOG("END R%i 0x%x", operand, ret_status);
goto end;
case UDI_PIO_END_IMM:
+ LOG("END IMM 0x%x", operand);
ASSERTC(tran_size, ==, UDI_PIO_2BYTE);
ret_status = operand;
goto end;
ops);
}
end:
- callback(gcb, NULL, UDI_OK, ret_status);
+ callback(gcb, buf, UDI_OK, ret_status);
return ;
error:
- callback(gcb, NULL, UDI_STAT_HW_PROBLEM, 0);
+ callback(gcb, buf, UDI_STAT_HW_PROBLEM, 0);
}
void udi_pio_probe(udi_pio_probe_call_t *callback, udi_cb_t *gcb,