// The OS/K Team licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #include #include #include #include //----------------------------------------------------------------------------// void do_hlt(ctx_t *ctx) { SDL_Event evt; while (1) { if (SDL_WaitEvent(&evt) == 1) { if (evt.type == SDL_QUIT) die(0); if (evt.type == SDL_KEYDOWN) { console_handle_input(ctx, evt.key.keysym.sym); if (evt.key.keysym.sym == SDLK_RETURN) break; } } } } //----------------------------------------------------------------------------// IMPL_START_0(hlt) { CHK_SUPERV(); do_hlt(ctx); } IMPL_END; IMPL_START_0(stop) { CHK_SUPERV(); _except(ctx, E_SHT, "STOP INSTR"); } IMPL_END; IMPL_START_0(crash) { CHK_SUPERV(); _except(ctx, 1023, "CRASH instruction"); } IMPL_END; //----------------------------------------------------------------------------// IMPL_START_1(trap) { if (v1 > 255) _except(ctx, E_ILL, "TRAP number greater than 255"); _except(ctx, v1 + 256, "TRAP instruction"); } IMPL_END; IMPL_START_0(iret) { if (ctx->dumpsw) trace("\nReturning from exception #%ld\n\n", R(R13)); // should do more checks R(RIP) = R(R15); rfs_current_idx = R(R14); ctx->rf = rfs[R(R14)]; } IMPL_END; IMPL_START_0(cli) { CHK_SUPERV(); R(CR0) &= ~IF; } IMPL_END; IMPL_START_0(sti) { CHK_SUPERV(); R(CR0) |= IF; } IMPL_END; //----------------------------------------------------------------------------// // // code common to devctl and iocall // dev_t *devctl_common(ctx_t *ctx, ulong v1, ulong v2) { dev_t *dev = devget(ctx, v1); if (!dev) rax = -2; else if (dev->state == DEVPWOF) rax = -3; else if (dev->state == DEVFERR) rax = -4; else if (dev->state == DEVPLUG) rax = -5; else return dev; return NULL; } IMPL_START_2(devctl) { CHK_SUPERV(); dev_t *dev = devctl_common(ctx, v1, v2); if (dev == NULL) return 0; switch (v2) { case 0: writestr(ctx, ax0, DEVLEN, dev->type); break; case 1: writestr(ctx, ax0, DEVLEN, dev->name); break; case 2: writestr(ctx, ax0, DEVLEN, dev->modl); break; case 3: writestr(ctx, ax0, DEVLEN, dev->vend); break; case 4: rax = dev->major; rdx = dev->minor; break; case 5: rax = dev->feats; rdx = dev->revis; break; default: rax = -6; break; } } IMPL_END; IMPL_START_2(iocall) { CHK_SUPERV(); long rc; dev_t *dev = devctl_common(ctx, v1, v2); if (dev == NULL) return 0; else if (v2 >= DEVSLOTS || dev->fslots[v2] == NULL) rax = -6; else { rc = dev->fslots[v2](ctx, dev); if (rc < 0) { rax = rc; rdx = 0; } } } IMPL_END; //----------------------------------------------------------------------------//