void vm_xgetchxy(char x, char y, char *attr, char *ch) { unsigned long address; address = vm_screenaddress(x, y); *ch = (char)_farpeekb(_go32_conventional_mem_selector(), address); *attr = (char)_farpeekb(_go32_conventional_mem_selector(), address + 1L); }
unsigned long msdosUSleep (unsigned long microseconds) { unsigned long ticks; if (!isBackgrounded) { usleep(microseconds); return microseconds; } saveState(&mainState); restoreState(&interruptState); /* clock ticks to wait */ ticks = (microseconds * MSDOS_PIT_FREQUENCY) / UINT64_C(1000000); /* we're starting in the middle of a timer period */ { int wasEnabled = disable(); elapsedTickIncrement = getTicksTillNextTimerInterrupt(); elapsedTickCount = 0; if (wasEnabled) enable(); } while (elapsedTickCount < ticks) { /* wait for next interrupt */ if (!setjmp(mainContext)) longjmp(interruptContext, 1); /* interrupt returned */ } /* wait for Dos to be free */ setjmp(mainContext); /* critical sections of DOS are never reentrant */ if (_farpeekb(_dos_ds, criticalOffset) /* DOS is busy but not idle */ || (!inIdleInterrupt && _farpeekb(_dos_ds, inDosFlagPointer))) longjmp(interruptContext, 1); saveState(&interruptState); restoreState(&mainState); return (elapsedTickCount * UINT64_C(1000000)) / MSDOS_PIT_FREQUENCY; }
unsigned long tsr_usleep(unsigned long usec) { unsigned long count; int intsWereEnabled; if (!backgrounded) { usleep(usec); return usec; } saveState(&mainState); restoreState(&intState); /* clock ticks to wait */ count = (usec * PIT_FREQ) / UINT64_C(1000000); /* we're starting in the middle of a timer period */ intsWereEnabled = disable(); toBeElapsedTicks = countToNextTimerInt(); elapsedTicks = 0; if (intsWereEnabled) enable(); while (elapsedTicks < count) { /* wait for next interrupt */ if (!setjmp(mainCtx)) longjmp(intCtx, 1); /* interrupt returned */ } /* wait for Dos to be free */ setjmp(mainCtx); /* critical sections of DOS are never reentrant */ if (_farpeekb(_dos_ds, criticalOffset) /* DOS is busy but not idle */ || (!inIdle && _farpeekb(_dos_ds, inDosOffset))) longjmp(intCtx, 1); saveState(&intState); restoreState(&mainState); return (elapsedTicks * UINT64_C(1000000)) / PIT_FREQ; }
void key_delete(void) { if (keyboard_handler_replaced) { int kflags; _go32_dpmi_set_protected_mode_interrupt_vector(0x9, &old_key_handler); /*set the original keyboard LED settings*/ kflags=_farpeekb(_dos_ds,0x417); outportb(0x60,0xed); asm("nop; nop"); outportb(0x60,((kflags>>4)&0x7)); } }
/** * drawText * Draws the specified string at the specified position in the specified color * using text blitting. **/ void drawText(int x, int y, char text[], char color, int font) { // defines segment for text int mytext = __dpmi_allocate_ldt_descriptors(1); __dpmi_set_segment_base_address(mytext, 0xffa6e); __dpmi_set_segment_limit(mytext, 8*128); char row; int i,j,k; for (i=0; text[i]!=0; i++) { //iterates through string for (j=0; j<8; j++) { //iterates through rows //gets jth row of char row = _farpeekb(mytext, text[i]*8+j); for (k=0; k<8; k++) { //iterates through pixels // decides if pixel should be drawn at position if (row & 0x80) { drawScaledPixel(x+(k+8*i)*font,y+j*font,font,color); } row <<= 1; //shifts bits to left by one } } } }
int Main(int argc, char **argv) { if(argc > 1 && festring(argv[1]) == "--version") { std::cout << "Iter Vehemens ad Necem version " << IVAN_VERSION << std::endl; return 0; } #ifdef __DJGPP__ /* Saves numlock state and toggles it off */ char ShiftByteState = _farpeekb(_dos_ds, 0x417); _farpokeb(_dos_ds, 0x417, 0); #endif /* __DJGPP__ */ femath::SetSeed(time(0)); game::InitGlobalValueMap(); scriptsystem::Initialize(); databasesystem::Initialize(); game::InitLuxTable(); ivanconfig::Initialize(); igraph::Init(); game::CreateBusyAnimationCache(); globalwindowhandler::SetQuitMessageHandler(game::HandleQuitMessage); msgsystem::Init(); protosystem::Initialize(); igraph::LoadMenu(); for(;;) { int Select = iosystem::Menu(igraph::GetMenuGraphic(), v2(RES.X / 2, RES.Y / 2 - 20), CONST_S("\r"), CONST_S("Start Game\rContinue Game\r" "Configuration\rHighscores\r" "Quit\r"), LIGHT_GRAY, CONST_S("Released under the GNU\r" "General Public License\r" "More info: see COPYING\r"), CONST_S("IVAN v" IVAN_VERSION "\r")); switch(Select) { case 0: if(game::Init()) { igraph::UnLoadMenu(); game::Run(); game::DeInit(); igraph::LoadMenu(); } break; case 1: { festring LoadName = iosystem::ContinueMenu(WHITE, LIGHT_GRAY, game::GetSaveDir()); if(LoadName.GetSize()) { LoadName.Resize(LoadName.GetSize() - 4); if(game::Init(LoadName)) { igraph::UnLoadMenu(); game::Run(); game::DeInit(); igraph::LoadMenu(); } } break; } case 2: ivanconfig::Show(); break; case 3: { highscore HScore; HScore.Draw(); break; } case 4: #ifdef __DJGPP__ /* Loads numlock state */ _farpokeb(_dos_ds, 0x417, ShiftByteState); #endif return 0; } } }
unsigned char vga_readb(unsigned addr) { return _farpeekb(_dos_ds, addr); }
char vm_wherey(void) { return (char)(_farpeekb(_go32_conventional_mem_selector(), 0x0451) + 1); }
char vm_getscreenheight(void) { return (char)(_farpeekb(_go32_conventional_mem_selector(), 0x0484) + 1); }
char vm_getscreenwidth(void) { return (char)_farpeekb(_go32_conventional_mem_selector(), 0x044a); }
static char vm_getscreenmode(void) { return (char)_farpeekb(_go32_conventional_mem_selector(), 0x0449); }
char vm_getattrxy(char x, char y) { unsigned long address; address = vm_screenaddress(x, y); return (char)_farpeekb(_go32_conventional_mem_selector(), address + 1L); }