//ѕосле операции частное помещаетс¤ в ax, а остаток - в dx. void _div (tCommandWithOperands cmd) { tWord left = getOperandValue(cmd.left); tWord right = getOperandValue(cmd.right); if (right == 0) { printf("ERROR: Division by zero!"); _hlt(cmd); } regValue[AX] = left / right; regValue[DX] = left % right; regValue[FLAGS] = ZeroFlag*(regValue[AX] == 0); }
int getc(FILE *stream) { char ch; if (stream->lastc) { ch = stream->lastc; stream->lastc = 0; return (int)ch; } while (!read(stream->fd, (void *)&ch, 1)) _hlt(); return (int)ch; }
void keDoSched() { uint32 i; uint32 j; _cli(); i=keSchedNextTask(); while(i==0xFFFFFFFF) { _sti(); _hlt(); _cli(); i=keSchedNextTask(); } // not any task can be sched if(i==currentTaskId) { _sti(); return; // only the current task can be sched } j=currentTaskId; currentTaskId=i; _switch(&(tasks[i]->esp), &(tasks[j]->esp)); }