static void int10() {
uint8_t cmd = regs.byteregs[regah];
uint8_t al = regs.byteregs[regal];
uint16_t dx = regs.wordregs[regdx];
switch (cmd) {
case 0x02: // at-xy
wmove(w, dx>>8, dx&0xff);
break;
case 0x0e: // emit
if (al >= 0x20 || al == '\n') {
wechochar(w, al);
} else if (al == 0x08) {
int y, x; getyx(w, y, x);
wmove(w, y, x-1);
}
break;
}
}
static void int13() {
uint8_t cmd = regs.byteregs[regah];
uint8_t al = regs.byteregs[regal];
uint8_t cl = regs.byteregs[regcl];
uint8_t ch = regs.byteregs[regch];
uint8_t dh = regs.byteregs[regdh];
uint16_t bx = regs.wordregs[regbx];
switch (cmd) {
case 0x02: // read disk sector(s)
case 0x03: // write disk sector(s)
// CL = sector number (1-based), AL = sector count
// DH = head number, CH = track number
// ES:BX = dest addr
fseek(fp, (((ch*HEADCNT*SEC_PER_TRK)+(dh*SEC_PER_TRK))+cl-1)*512, SEEK_SET);
for (int i=0; i<(al*512); i++) {
if (cmd == 0x03) { // write
fputc(getmem8(segregs[reges], bx+i), fp);
} else { // read
putmem8(segregs[reges], bx+i, fgetc(fp));
}
}
break;
case 0x08: // poll sectors per track / per head
// we just report a lot of them
regs.wordregs[regcx] = SEC_PER_TRK;
regs.byteregs[regdh] = HEADCNT-1;
break;
}
}
static void int16() {
uint8_t cmd = regs.byteregs[regah];
switch (cmd) {
case 0x00: // get keystroke
while (lastkey == ERR) {
lastkey = wgetch(w);
}
regs.byteregs[regal] = lastkey;
lastkey = ERR;
break;
case 0x01: // check for keystroke
if (lastkey == ERR) {
lastkey = wgetch(w);
}
zf = lastkey == ERR;
regs.byteregs[regal] = lastkey;
break;
}
}