/* I/O write */ EXPORT W writeIO(UW addr, UW data, W unit) { W n; UW pa; /* address misalignment is reported as error */ if (addr & (unit - 1)) return 0; /* I/O address check & conversion to physical address */ n = chkIOAddr(addr, &pa, unit); if (n < unit) return 0; switch(unit) { case 4: out_w(pa, data); break; case 2: out_h(pa, data); break; default: out_b(pa, data); } return unit; }
/* I/O read */ EXPORT W readIO(UW addr, UW *data, W unit) { W n; UW pa; // address misalignment is reported as error if (addr & (unit - 1)) return 0; // I/O address check & conversion to physical address n = chkIOAddr(addr, &pa, unit); if (n < unit) return 0; #if TEF_EM1D switch(unit) { case 4: *data = in_w(pa); break; case 2: *data = in_h(pa); break; default: *data = in_b(pa); } #endif return unit; }