Category : Miscellaneous Language Source Code
Archive   : E!518.ZIP
Filename : API.C

 
Output of file : API.C contained in archive : E!518.ZIP
/******************************************************************************/
/* E! API management functions */
/******************************************************************************/

#include
#include
#include "api.h"

/******************************************************************************/
/* This global variable is initialized to the default value used by E! to */
/* install the API interrupt handler. This value may be changed dynamical- */
/* ly using a Profile. So the API program must also change the interrupt */
/* number. */
/******************************************************************************/
int E_Vec = 0xC0;

/**************************************************/
/* Call E! function #funcno and return error code */
/**************************************************/
char Call_E_Function ( unsigned funcno )


{
union REGS regs;

regs.h.ah = 0;
regs.x.bx = funcno;
int86(E_Vec, ®s, ®s);
return ( regs.h.al );
}

/******************************************************************************/
/* Returns a FAR pointer to the requested variables block */
/******************************************************************************/
void far *Request_E_Address ( char request_name )

{
union REGS regs;
struct SREGS sregs;

if ((request_name < 1) || ((request_name > 7) && (request_name < 20)) || (request_name > 21))
return (NULL);
regs.h.ah = request_name;
int86x(E_Vec, ®s, ®s, &sregs);
return ( MK_FP (sregs.es, regs.x.bx) );
}

/******************************************************************************/
/* Loads status members with appropriate values */
/******************************************************************************/
void Get_E_Status ( STATUSRECORD *status)

{
union REGS regs;

regs.h.ah = STATUS_REQUEST;
int86(E_Vec, ®s, ®s);
status->linenum = regs.x.cx;
status->line = regs.x.dx;
status->col = regs.h.ah;
status->firstcol= regs.h.al;
status->lower = regs.h.bh;
status->nbwin = regs.h.bl;
}

/******************************************************************************/
/* Request a special E! API service */
/******************************************************************************/
void Request_E_Service ( char service)

{
union REGS regs;

regs.h.ah = service;
int86(E_Vec, ®s, ®s);
}

/******************************************************************************/
/* Get E! version number */
/******************************************************************************/
void Get_E_Version ( char *major, char *minor)

{
union REGS regs;

regs.h.ah = VERSION_SERVICE;
int86(E_Vec, ®s, ®s);
*major = regs.h.ah;
*minor = regs.h.al;
}

/******************************************************************************/
/* Instruct E! to execute a command on return */
/******************************************************************************/
void RegisterCommand ( commandline commandstr )

{
union REGS regs;
struct SREGS sregs;

regs.h.ah = REGISTER_SERVICE;
sregs.es = FP_SEG ( commandstr );
regs.x.bx = FP_OFF ( commandstr );
int86x(E_Vec, ®s, ®s, &sregs);
}

/******************************************************************************/
/* Call E! seek function and return error code */
/******************************************************************************/

char Seek_E_Line ( unsigned line, char curpos)

{
union REGS regs;

regs.h.ah = SEEK_SERVICE;
regs.x.bx = line;
regs.h.al = curpos;
int86(E_Vec, ®s, ®s);
return (regs.h.al);
}

/******************************************************************************/
/* Instruct E! to allocate memory on its own heap for the program. */
/******************************************************************************/
BOOL Get_E_Memory( unsigned paragraphs,
unsigned memID,
void **blockptr, /* blockptr is a pointer to a far pointer */
BOOL *firsttime) /* that is, it's the address of the pointer */
/* to the variables block. */

{
union REGS regs;
struct SREGS sregs;

regs.h.ah = GETMEM_SERVICE;
regs.x.dx = memID;
regs.x.cx = paragraphs;
int86x(E_Vec, ®s, ®s, &sregs);
*blockptr = regs.h.al == 0 ? MK_FP (sregs.es, regs.x.bx) : NULL;
*firsttime = regs.h.ah;
return (regs.h.al ^ 0xff);
}

/******************************************************************************/
/* Free memory on E! heap */
/******************************************************************************/
BOOL Free_E_Memory ( unsigned memID )

{
union REGS regs;

regs.h.ah = FREEMEM_SERVICE;
regs.x.dx = memID;
int86(E_Vec, ®s, ®s);
return (regs.h.al ^ 0xff);
}

BOOL getflagstatus (unsigned flagid)

{
union REGS regs;

regs.h.ah = flagid;
int86(E_Vec, ®s, ®s);
return (regs.h.al);
}

/******************************************************************************/
/* Is E! idle ? */
/******************************************************************************/
BOOL Is_E_Idle ()

{
return ( getflagstatus (E_IDLE_SERVICE) );
}

/******************************************************************************/
/* Was the file modified ? */
/******************************************************************************/
BOOL Is_File_Modified ()

{
return ( getflagstatus (MODIF_SERVICE) );
}


  3 Responses to “Category : Miscellaneous Language Source Code
Archive   : E!518.ZIP
Filename : API.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/