/*
       The BDS C Standard I/O header file --  v1.45    11/12/81

       This file contains global definitions, for use in all C programs
       in PLACE of (yechhh) CONSTANTS. Characteristics of your system such
       as video screen size, interface port numbers and masks, buffered I/O
       allocations, etc., should all be configured just once within this
       file. Any program which needs them should contain the preprocessor
       directive:

               #include "bdscio.h"

       near the beginning.
       Go through and set all this stuff as soon as you get the package,
       and most terminal-dependent sample programs should run much better.
*/


/*
       Some console (video) terminal characteristics:
       (pre-configured for H19/Z19/H89/Z89)
*/

#define TWIDTH  80      /* # of columns */
#define TLENGTH 24      /* # of lines   */
#define CLEARS  "\033E" /* String to clear screen on console    */
#define INTOREV "\033p" /* String to switch console into reverse video  */
#define OUTAREV "\033q" /* String to switch console OUT of reverse video  */
#define CURSOROFF "\033x5"      /* String to turn cursor off    */
#define CURSORON "\033y5"       /* String to turn cursor on     */
#define ESC     '\033'  /* Standard ASCII 'escape' character    */

/*
       Console serial port characteristics:
*/

#define CSTAT   0355    /* status port  */
#define CDATA   0350    /* data port    */
#define CIMASK  0x01    /* input data ready mask   */
#define COMASK  0x20    /* output data ready mask  */
#define CAHI    1       /* True if status active high   */
#define CRESET  0       /* True if status port needs to be reset after input */
#define CRESETVAL 0     /* If CRESET is true, this is the value to send */

/*
        Modem characteristics:
*/

#define MSTAT   0335    /* status port  */
#define MDATA   0330    /* data port    */
#define MIMASK  0x01    /* input data ready mask        */
#define MOMASK  0x20    /* ready to send a character mask       */
#define MAHI    1       /* True if status logic active high  */
#define MRESET  0       /* True if status port needs to be reset */
#define MRESETVAL 0     /* If MRESET true, this is the byte to send */

/*
       General purpose Symbolic constants:
*/

#define BASE 0          /* Base of CP/M system RAM (0 or 0x4200)  */
#define NULL 0
#define EOF -1          /* Physical EOF returned by low level I/O functions */
#define ERROR -1        /* General "on error" return value */
#define OK 0            /* General purpose "no error" return value */
#define JBUFSIZE 6      /* Length of setjump/longjump buffer    */
#define CPMEOF 0x1a     /* CP/M End-of-text-file marker (sometimes!)  */
#define SECSIZ 128      /* Sector size for CP/M read/write calls */
#define MAXLINE 135     /* Longest line of input expected from the console */
#define TRUE 1          /* general purpose true truth value     */
#define FALSE 0         /* general purpose false truth value    */

/*
  The NSECTS symbol controls the compilation of the buffered
  I/O routines within STDLIB2.C, allowing each user to set the
  buffer size most convenient for his system, while keeping
  the numbers totally invisible to the C source programs using
  buffered I/O (via the BUFSIZ defined symbol.) For larger
  NSECTS, the disk I/O is faster...but more ram is taken up.
  Note that pre-1.4 versions of the library functions
  were not set up to support this customizable buffer size,
  and always compiled as if NSECTS were 1 in this version. To
  change the buffer size allocation, follow these steps:

    1) Alter NSECTS to the desired value here in bdscio.h
    2) Re-compile STDLIB1.C and STDLIB2.C
    3) Use CLIB to combine STDLIB1.CRL and STDLIB2.CRL to make
       a new DEFF.CRL.

  Make sure you use declare all your I/O buffers with the a
  statement such as:
               char buf_name[BUFSIZ];
        instead of the older and now obsolete:
               char buf_name[134];
       (and always #include "bdscio.h" in your programs!)
*/

#define NSECTS 8        /* Number of sectors to buffer up in ram */

#define BUFSIZ (NSECTS * SECSIZ + 6 )   /* Don't touch this */

struct _buf {                           /* Or this...       */
       int _fd;
       int _nleft;
       char *_nextp;
       char _buff[NSECTS * SECSIZ];
};



/*
       If you plan to use the high-level storage allocation functions
       from the library ("alloc" and "free") then:

         1) Uncomment (enable) the "ALLOC_ON" definition, and comment out the
            "ALLOC_OFF" definition from this file.

         2) Re-compile STDLIB1.C, and use CLIB to transfer "alloc"
            and "free" into the DEFF.CRL library file.

         3) THIS IS IMPORTANT!!! Include the statement:

               _allocp = NULL;    /* initialize allocation pointer */

            somewhere in your "main" function PRIOR to the first use
            of the "alloc" function. DON'T FORGET THIS INITIALIZATION!!

       Remember to include bdscio.h in ALL files of your C program.

       The lack of static variables is the reason for all this messiness.
*/

#define ALLOC_OFF 1     /* disables storage allocation if uncommented */

                       /* only ONE of these two lines should be uncommented */
/*
#define ALLOC_ON 1      /* enables storgage allocation if uncommented */
*/


#ifdef ALLOC_ON                 /* if storage allocation enabled, */

struct _header  {
       struct _header *_ptr;
       unsigned _size;
};

struct _header _base;           /* declare this external data to  */
struct _header *_allocp;        /* be used by alloc() and free()  */

#endif