31 #elif (DOSX & PHARLAP)
35 #if defined(__MSDOS__)
37 #define TIMER_INTR 0x08
40 void (W32_CALL *wintr_chain)(void) = NULL;
44 #if !(DOSX & POWERPAK)
45 static BOOL inside_isr8 = FALSE;
46 static WORD indos_flag_seg, indos_flag_ofs;
47 static WORD crit_err_seg, crit_err_ofs;
49 static void find_DOS_flags (
void);
50 static BOOL DOS_is_idle (
void);
54 static void (*old_sigalrm) (int);
56 #elif !(DOSX & (PHARLAP|X32VM|POWERPAK))
57 static UINT locstack [STK_SIZE];
59 static void stack_probe (
void)
61 #if defined(USE_DEBUG)
65 for (p = locstack, used = 0; *p && used < DIM(locstack); p++)
67 if (used >= DIM(locstack))
69 (*_printf) (
"pcintr.c: Stack overflow. Increase STK_SIZE\n");
77 BOOL wintr_enable (
void)
84 void wintr_disable (
void)
89 #if (DOSX & (PHARLAP|X32VM))
90 static REALPTR oldint, timer_cb;
93 static void NewTimer (
void)
95 _dx_call_real (oldint, &rmRegs, 1);
100 if (on_isr8 && DOS_is_idle())
110 void wintr_shutdown (
void)
114 _dx_rmiv_set (TIMER_INTR, oldint);
115 _dx_free_rmode_wrapper (timer_cb);
120 void wintr_init (
void)
122 timer_cb = _dx_alloc_rmode_wrapper_iret ((pmodeHook)NewTimer, 80000);
125 outsnl (_LANG(
"Cannot allocate real-mode timer callback"));
129 _dx_rmiv_get (TIMER_INTR, &oldint);
130 _dx_rmiv_set (TIMER_INTR, timer_cb);
131 RUNDOWN_ADD (wintr_shutdown, -1);
135 static void NewTimer (
int sig)
141 (*old_sigalrm) (sig);
142 if (on_isr8 && DOS_is_idle())
152 void wintr_shutdown (
void)
156 tim.it_interval.tv_sec = 0;
157 tim.it_interval.tv_usec = 0;
158 signal (SIGALRM, old_sigalrm);
159 setitimer (ITIMER_REAL, &tim, NULL);
162 void wintr_init (
void)
167 tim.it_interval.tv_usec = 54945;
168 tim.it_interval.tv_sec = 0;
169 tim.it_value = tim.it_interval;
170 old_sigalrm = signal (SIGALRM, NewTimer);
171 setitimer (ITIMER_REAL, &tim, NULL);
174 #elif defined(WATCOM386) && (DOSX & DOS4GW)
175 static void (__interrupt __far *oldint)();
177 static void __interrupt __far NewTimer (
void)
182 if (on_isr8 && DOS_is_idle())
185 STACK_SET (&locstack[STK_SIZE-1]);
197 _chain_intr (oldint);
200 void wintr_shutdown (
void)
204 _dos_setvect (TIMER_INTR, oldint);
209 void wintr_init (
void)
212 oldint = _dos_getvect (TIMER_INTR);
213 _dos_setvect (TIMER_INTR, NewTimer);
214 memset (&locstack, 0,
sizeof(locstack));
215 RUNDOWN_ADD (wintr_shutdown, -1);
218 #elif (DOSX & POWERPAK) && defined(NOT_YET)
226 void NewTimerPre (
void);
228 static void NewTimer (
void)
240 if (on_isr8 && DOS_is_idle())
243 STACK_SET (offset locstack[STK_SIZE-1]);
255 dpmi_chain_intr (oldint.selector, oldint.offset);
258 void wintr_shutdown (
void)
262 dpmi_setvect (TIMER_INTR, oldint.selector, oldint.offset);
263 oldint.selector = NULL;
267 void wintr_init (
void)
271 dpmi_getvect (TIMER_INTR, &oldint.selector, &oldint.offset);
272 dpmi_setvect (TIMER_INTR, _CS, (DWORD)NewTimer);
273 memset (&locstack, 0,
sizeof(locstack));
274 RUNDOWN_ADD (wintr_shutdown, -1);
277 #elif (DOSX == 0) && !defined(NO_INLINE_ASM)
279 static W32_IntrHandler oldint;
281 static INTR_PROTOTYPE NewTimer (
void)
289 if (on_isr8 && DOS_is_idle())
293 STACK_SET (&locstack[STK_SIZE-1]);
305 asm lea sp, locstack[STK_SIZE-1]
329 void wintr_shutdown (
void)
333 setvect (TIMER_INTR, oldint);
338 void wintr_init (
void)
341 oldint = getvect (TIMER_INTR);
342 setvect (TIMER_INTR, NewTimer);
343 memset (&locstack, 0,
sizeof(locstack));
344 RUNDOWN_ADD (wintr_shutdown, -1);
348 #if !(DOSX & POWERPAK)
349 static void find_DOS_flags (
void)
353 memset (®s, 0,
sizeof(regs));
356 GEN_INTERRUPT (0x21, ®s);
357 indos_flag_seg = regs.r_es;
358 indos_flag_ofs = regs.r_bx;
361 crit_err_seg = regs.r_es;
362 crit_err_ofs = regs.r_bx - 1;
366 static BOOL DOS_is_idle (
void)
368 BYTE indos, crit = 0;
370 indos = PEEKB (indos_flag_seg, indos_flag_ofs);
372 crit = PEEKB (crit_err_seg, crit_err_ofs);
373 return (crit == 0 && indos == 0);
WORD W32_CALL tcp_tick(sock_type *s)
Must be called periodically by user application (or BSD socket API).