www.digitalmars.com [Home] [Search] [Contents]

int.h


int_gen

Header

int.h

Prototype

void int_gen(int intno);

Description

The int_gen function generates a standard Intel 80x86 interrupt, where intno is the interrupt to generate.

Return Value

None

Compatibility

DOS Windows 3.x Phar Lap DOSX Win32

See Also

The other int_functions

Example

	/* 	Example for int_gen */ 

	#include <int. h> 
	#include <stdlib. h>

	void main () 
	{
	   int_gen (5); /* print-screen interrupt */ 
	} 



int_getvector

Header

int.h

Prototype

void int_getvector(unsigned vector, unsigned *poffset, unsigned *psegment);

Description

The int_getvector function gets the contents of the specified interrupt vector, splits it into its segment and offset components, and stores each in the unsigned integers pointed to by poffset and psegment.

Return Value

None

Compatibility

DOS Windows 3.x Phar Lap DOSX Win32

See Also

The other int_functions


int_intercept

Header

int.h

Prototype

int int_intercept(unsigned vector, int(* funcptr) (struct INT_DATA *pd), unsigned stacksize);

Description

The int_intercept function links a standard C function to an interrupt vector that handles interrupts when they occur. The funcptr is a pointer to the C function that will handle the interrupt. This function must be declared as having C linkage. The vector argument defines which interrupt vector the function will be attached to (0 through 255). The stacksize argument is the number of bytes of memory allocated for the stack within the interrupt handler. stacksize should be a minimum of 256 bytes, except that if stacksize is 0, no stack is allocated, and the program stack is used. This is essential for interrupt routines that are required to be re-entrant, such as serial handlers.

If a zero value is returned from the interrupt handler (* funcptr)(), then the previous interrupt vector for this vector is called. Otherwise, a return from the interrupt is performed. Values in registers can be read/ written through the pointer pd, which points to the INT_DATA struct that is passed to (* funcptr)().

Follow these rules when handling interrupts in C++.

1. Do not use DOS or BIOS calls during interrupt handling if the possibility exists that an interrupt can occur when DOS or BIOS is executing. This is because DOS and BIOS are not re-entrant. Beware of functions like new and malloc, which use DOS calls internally.
2. Do not let the interrupt handler, or any function called by it, use more than the allocated stack space. If the handler is intended to be re-entrant, use a stacksize of zero to int_intercept so that a local stack is not created and the normal program stack is used instead.
3. Do not call any function that is not re-entrant. For example be careful in your use of global variables; unpredictable results can occur.
4. Do not perform I/ O from within the interrupt handler. This is especially true for high level file I/ O.
5. When using variables set by interrupt handlers, declare the variables to be volatile.
6. Turn off stack overflow checking for the handler.

Note
Intercepting interrupts is an advanced technique and requires a good understanding of DOS and the IBM family of PCs to use it successfully.

Return Value

Returns zero if successful. Otherwise, -1 is returned.

Compatibility

DOS Windows 3.x Phar Lap DOSX Win32

See Also

The other int_functions

Example

	/* 	Example for int_intercept */ 

	#include <int. h> 
	#include <stdio.h>
	#include <stdlib. h>

	static volatile int ctrl_c_count = 0; 

	int do_ctrl_c (struct INT_DATA *pd) 
	{ 
	   ++ ctrl_c_count; 
	   return 1; 
	} 

	void main () 
	{ 
	   int_intercept (0x23, do_ctrl_c, 256); 
	   while (ctrl_c_count < 3) 
	      printf (" Number of ctrl-C's is %d\n", 
		        ctrl_c_count); 
	   int_restore (0x23); 
	} 


Output

Number of ctrl-C's is 0
Number of ctrl-C's is 0
Number of ctrl-C's is 0
Number of ctrl-C's is 0
Number of ctrl-C's is 0
Number of ctrl-C's is 0
Number of ctrl-C's is 0
Number of ctrl-C's is ^C
0
Number of ctrl-C's is 0
Number of ctrl-C's is 0
Number of ctrl-C's is 0
Number of ctrl-C's is 1
Number of ctrl-C's is 1
Number of ctrl-C's is 1
Number of ctrl-C's is 1
Number of ctrl-C's is 1
Number of ctrl-C's ^C
is 1
Number of ctrl-C's is 1
Number of ctrl-C's is 1
Number of ctrl-C's is 1
Number of ctrl-C's is 1
Number of ctrl-C's is 1
Number of ctrl-C's is 2
Number of ctrl-C's is 2
Number of ctrl-C's is 2
Number of ctrl^ C
-C's is 2
Number of ctrl-C's is 2
Number of ctrl-C's is 2
Number of ctrl-C's is 2
Number of ctrl-C's is 2

int_on, int_off

Header

int. h

Prototype

void int_off(void); void int_on(on);

Description

These functions turn on or off the interrupts. The int_on function does it via an STI (set interrupt flat) instruction; the int_off function does it via a CLI (clear interrupt flag) instruction.

Return Value

None

Compatibility

DOS Windows 3.x Phar Lap DOSX Win32

See Also

The other int_functions


int_prev

Header

int.h

Prototype

long int_prev(struct INT_DATA *idp);

Description

The int_prev function calls the standard interrupt handler from within a user-handler that was installed using int_intercept. The parameter *ipd passes register values into the routine. On exit, it contains the register values at the end of the standard interrupt handler.

Return Value

A long containing the values in the DX and AX registers at the end of the called routine.

Compatibility

DOS Windows 3.x Phar Lap DOSX Win32

See Also

The other int_functions


int_restore

Header

int.h

Prototype

void int_restore(unsigned vector);

Description

The int_restore function unlinks the first interrupt handler that was hooked into the specified vector via int_intercept. This function must not be called unless an interrupt handler was linked to the vector using int_intercept. int_restore is the complement to the int_intercept function.

Return Value

If successful, a zero is returned. Otherwise, -1 is returned.

Compatibility

DOS Windows 3.x Phar Lap DOSX Win32

See Also

int_intercept


Example

See int_intercept



int_setvector

Header

int.h

Prototype

void int_setvector(unsigned vector, unsigned offset, unsigned segment);

Description

The int_setvector installs the address of a user routine supplied in offset and segment in the specified interrupt vector. The routine where you set the interrupt vector must be marked as __interupt. For example if you want your C function to be a Ctrl_C vector, declare the function as:
void __interupt __far __cdecl func

If the routine is written in assembly, save and restore all registers and return via an IRET instruction.

Return Value

None

Compatibility

DOS Windows 3.x Phar Lap DOSX Win32

See Also

The other int_functions