return;
}
+ struct param_s {
+ u16 size;
+ u16 buf_off;
+ u16 buf_seg;
+ } *param_far = (void*)(regs->di+0);
+
// Validate and update size.
- u16 size = GET_FARVAR(regs->es, *(u16*)(regs->di+0));
- u16 pirsize = (GET_GLOBAL(pirtable_g->size)
- - sizeof(struct pir_header));
- SET_FARVAR(regs->es, *(u16*)(regs->di+0), pirsize);
- if (size < pirsize) {
+ u16 bufsize = GET_FARVAR(regs->es, param_far->size);
+ u16 pirsize = GET_GLOBAL(pirtable_g->size) - sizeof(struct pir_header);
+ SET_FARVAR(regs->es, param_far->size, pirsize);
+ if (bufsize < pirsize) {
set_code_fail(regs, RET_BUFFER_TOO_SMALL);
return;
}
// Get dest buffer.
- u16 d = (GET_FARVAR(regs->es, *(u16*)(regs->di+2)) + 0);
- u16 destseg = GET_FARVAR(regs->es, *(u16*)(regs->di+4));
+ void *buf_far = (void*)(GET_FARVAR(regs->es, param_far->buf_off)+0);
+ u16 buf_seg = GET_FARVAR(regs->es, param_far->buf_seg);
// Memcpy pir table slots to dest buffer.
- memcpy_fl(MAKE_FLATPTR(destseg, d)
- , MAKE_FLATPTR(SEG_BIOS, pirtable_g->slots)
- , pirsize);
+ memcpy_far(buf_seg, buf_far
+ , get_global_seg(), pirtable_g->slots
+ , pirsize);
// XXX - bochs bios sets bx to (1 << 9) | (1 << 11)
regs->bx = GET_GLOBAL(pirtable_g->exclusive_irqs);