home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 225_01 / deff3.txt < prev    next >
Text File  |  1987-06-09  |  18KB  |  536 lines

  1.                         DEFF3.TXT
  2.                         ---------
  3.  
  4.          I have given, below, a description of each of the functions
  5.          which I have written for the file -
  6.  
  7.                    DEFF3.C
  8.  
  9.          and which may be accessed through -
  10.  
  11.                    DEFF3(.CRL)
  12.  
  13.          when you use the CLINK function with BDS C.   It is not
  14.          necessary to specify "DEFF3" on the command line as BDS C
  15.          will look for any missing functions in the DEFF files,
  16.          automatically, in answer to a RETURN entered when it asks
  17.          you for instructions as to which CRL files it should search
  18.          for the missing functions.
  19.  
  20.          If you intend to use DEFF3 in this way then it should be on
  21.          the same disk as the BDS C DEFF files.   Now, the functions
  22.          I have written are -
  23.  
  24.  
  25.          BINARY         GET_DEFAULT         RESET_DSK
  26.          BITCOUNT       GET_IOBYTE          REVERSE
  27.          CGET           INDEX               SEARCH_FIRST
  28.          CLOSE_FILE     ISALNUM             SEARCH_NEXT
  29.          CLRSCREEN      ITOA                SELECT_DSK
  30.          CPUT           LISTC               SET_ATTRIBUTES
  31.          CON_STAT       MAKE_RO             SETDMA
  32.          CREATE_FILE    OPEN_FILE           SET_IOBYTE
  33.          DIRECTC        PRINT_DEC           SHELL_SORT
  34.          DPB_ADR        PRT_STR             SWAP_POINTERS
  35.          ERASE_FILE     READ_SEQ_SEC        USER_ID
  36.          GET_CPM        READ_STR            WRITE_SEQ_SEC
  37.  
  38.                    ADDED FUNCTIONS
  39.                    ---------------
  40.  
  41.          L_SHIFT        R_SHIFT             PRT_BIN
  42.          BIT_SET        BIT_RESET           ISPRINT
  43.          SCOPY_N        GET_ALV
  44.  
  45.  
  46.  
  47.          char BINARY(x, v, n)
  48.          int x, v[], n;
  49.          --------------------
  50.  
  51.          Checks whether a binary number (x) occurs in a sorted array
  52.          (v, of n elements) and, if so, returns the binary number or
  53.          else returns -1 if it doesn't occur.
  54.  
  55.  
  56.          char BITCOUNT(n)
  57.          unsigned n;
  58.          ----------------
  59.  
  60.          Returns the number of set bits ( = 1) in a byte.
  61.  
  62.  
  63.          unsigned BIT_RESET(u, n)
  64.          unsigned u;
  65.          int n;
  66.          ------------------------
  67.  
  68.          Will reset (to zero) the nominated bit number ( n = 0 to 15)
  69.          in an unsigned integer "u".   Returns the unsigned integer
  70.          with the nominated bit reset to zero.
  71.  
  72.  
  73.          unsigned BIT_SET(u, n)
  74.          unsigned u;
  75.          int n;
  76.          ----------------------
  77.  
  78.          Will set (to one) the nominated bit number ( n = 0 to 15)
  79.          in an unsigned integer "u".   Returns the unsigned integer
  80.          with the nominated bit set to one.
  81.  
  82.  
  83.          char CGET()
  84.          -----------
  85.  
  86.          Similar to "getchar" in what it does except that it will
  87.          read ANY byte value from the console.  i.e. the value you
  88.          enter doesn't have to be either ASCII or printable.
  89.  
  90.          It returns the value of the byte entry.
  91.  
  92.  
  93.          char CLOSE_FILE(fcb)
  94.          char fcb[36];
  95.          --------------------
  96.  
  97.          This will close the file whose name is included in the file
  98.          control block pointed to by "fcb".   It is the companion
  99.          function to "OPEN_FILE" and should be used to close any file
  100.          previously opened with OPEN_FILE.   It returns the same
  101.          values as OPEN_FILE.
  102.  
  103.  
  104.          void CLRSCREEN()
  105.          ----------------
  106.  
  107.          Will clear the screen and home the cursor, using in-built
  108.          terminal software commands.   It is (probably) only usable
  109.          by Hazeltine family terminals but could be altered to suit
  110.          other terminals provided you know the byte value(s) to send
  111.          to the terminal to activate the clear screen/home function.
  112.  
  113.          Doesn't return anything.
  114.  
  115.  
  116.          char CON_STAT()
  117.          ---------------
  118.  
  119.          This checks the console status and returns ZERO if there is
  120.          no character waiting, else it returns 0xff....NOT the
  121.          character itself.   It is a useful function for those inputs
  122.          where you tell the user -
  123.  
  124.               "Enter any character to continue."
  125.  
  126.  
  127.          void CPUT(c)
  128.          int c;
  129.          ------------
  130.  
  131.          Similar to "putchar" except that it will send ANY byte value
  132.          to the console.   Naturally the console will only display
  133.          the "visible" characters.   Doesn't return anything useful.
  134.  
  135.  
  136.          char CREATE_FILE(fcb)
  137.          char fcb[36];
  138.          ---------------------
  139.  
  140.          This will create the file named in the file control block
  141.          (see open_file for a description of this) an initialise it
  142.          for both read and write functions.   Note particularly that
  143.          it doesn't check to see whether a file of this name already
  144.          exists so you need to do this independently if you want to
  145.          make sure you haven't got two files of the same name in the
  146.          disk directory.
  147.  
  148.          It is supposed to return 0xff (255 decimal) if the disk is
  149.          full and the name can't be created, but I'm not so sure
  150.          that you can rely on it to do so.   Probably the best way
  151.          to be sure is to now try to open the file (with open_file)
  152.          and see what happens then.
  153.  
  154.  
  155.          char DIRECTC(duty)
  156.          int duty;
  157.          ------------------
  158.  
  159.  
  160.          This is CP/M function No. 6 and it can be used to either get
  161.          a character from the terminal, or to send a character to the
  162.          console.   It depends on the value of "duty" which should be
  163.          either -
  164.  
  165.               0xff                for input from the terminal
  166.          or   the byte value      for output to the console
  167.  
  168.          It returns the input character in the first case or zero in
  169.          the second case.
  170.  
  171.          unsigned DPB_ADR()
  172.          ------------------
  173.  
  174.          Gives the Disk Parameter Block address (pointer to).   You
  175.          should first have declared the pointer as -
  176.  
  177.                    struct dpb *pointer;
  178.  
  179.          This allows access to the following values -
  180.  
  181.          int  pointer->SPT        No. of records per track
  182.          char pointer->BSH        Block Shift Factor
  183.          char pointer->BKM        Block Mask
  184.          char pointer->EXM        Extent Mask
  185.          int  pointer->DSM        Disk Space Maximum (highest block)
  186.          int  pointer->DRM        Directory Maximum (highest entry)
  187.          char pointer->AL0        Initial Allocation Vector
  188.          char pointer->AL1        do (high byte)
  189.          int  pointer->CKS        Check Area Size
  190.          int  pointer->OFF        Count of reserved tracks
  191.  
  192.          Note that the definition for "dpb" is given in "PEC.H" and
  193.          this should be "included" in the programme if you wish to
  194.          access the disk parameter block.
  195.  
  196.  
  197.          char ERASE_FILE(fcb)
  198.          char fcb[36];
  199.          --------------------
  200.  
  201.          Erases from the directory the name of the file in the file
  202.          control block.   For a description of this see open_file.
  203.          It will return 0xff if the file isn't found.
  204.  
  205.  
  206.          unsigned GET_ALV()
  207.          ------------------
  208.  
  209.          Returns a pointer to the Allocation Vector which gives the
  210.          allocation block map for the selected disk.   Note the map
  211.          is a number of bytes with a particular bit set if the block
  212.          is in use.   You can obtain the highest allocation block
  213.          number from the Disk Parameter Block (see DPB_ADR).
  214.  
  215.  
  216.          int GET_CPM()
  217.          -------------
  218.  
  219.          Returns a 16-bit number (in HL) with the details -
  220.  
  221.               H = 0x00 for CP/M  OR  H = 0x01 for MP/M
  222.               L = 0x00 for all releases prior to 2.0
  223.               L = 0x20 for version 2.0, 0x21 for version 2.1, 0x22
  224.                   for version 2.2, and so on.
  225.  
  226.          If you want to use any of this information then you will
  227.          need to mask off H (or L) to find out what it was the
  228.          function returned.
  229.  
  230.  
  231.          char GET_DEFAULT()
  232.          ------------------
  233.  
  234.          Returns the name for the current default disk.   Note A = 0,
  235.          B = 1....and so on.
  236.  
  237.  
  238.          char GET_IOBYTE()
  239.          -----------------
  240.  
  241.          Returns the current IOBYTE setting under CP/M 2.2.
  242.  
  243.  
  244.          int INDEX(s, t)
  245.          char s[], t[];
  246.          ---------------
  247.  
  248.          Returns a pointer to the position of string "t" inside
  249.          string "s", else returns -1 if no match is found.
  250.  
  251.  
  252.          char ISALNUM(c)
  253.          char c;
  254.          ---------------
  255.  
  256.          Returns TRUE/FALSE whether the character is alpha-numeric.
  257.  
  258.  
  259.          char ISNUM(c)
  260.          char c;
  261.          -------------
  262.  
  263.          Returns  TRUE/FALSE whether the character is numeric (0..9)
  264.          or not.
  265.  
  266.  
  267.          char ISPRINT(c)
  268.          char c;
  269.          ---------------
  270.  
  271.          Returns TRUE/FALSE whether the character is printable (to the
  272.          console) or not.
  273.  
  274.  
  275.          void ITOA(n, str)
  276.          int n;
  277.          char s[];
  278.          -----------------
  279.  
  280.          Will convert an integer (n) into a printable ASCII string,
  281.          which is placed in "str".   This is one of the obvious
  282.          functions which should already have been included in BDS C.
  283.  
  284.          unsigned L_SHIFT(value, number)
  285.          unsigned value;
  286.          int number;
  287.          -------------------------------
  288.  
  289.          Performs a logical left shift on "value" the number of times
  290.          specified by "number".   Returns the final left-shifted value.
  291.  
  292.  
  293.          void MAKE_RO()
  294.          --------------
  295.  
  296.          Makes the current logical disk read-only status.   I don't
  297.          think it returns anything.
  298.  
  299.  
  300.          char OPEN_FILE(fcb)
  301.          char fcb[36];
  302.          -------------------
  303.  
  304.          Opens the nominated file, the name of which must be in the
  305.          file control block ("fcb") in the manner required by CP/M.
  306.          Note that the file is opened for BOTH reading and writing.
  307.          Before using this function you should have already made a
  308.          file control block with the function -
  309.  
  310.               setfcb(fcb, filename)
  311.  
  312.          Note particularly "fcb" as used in these functions is a
  313.          pointer to the file control block or, as used in assembly
  314.          language programming, it is the address of the fcb which
  315.          holds the file name.   This should be an external buffer so
  316.          that it is known to all functions in the programme.
  317.  
  318.          This will return 0xff if the open was unsuccessful or a
  319.          number 0, 1, 2 or 3 (which is an offset into the DMA buffer)
  320.          if the open succeeded.   For those who understand the way
  321.          CP/M works, this offset may be used to get the directory
  322.          entry information on the opened file.
  323.  
  324.          To be able to access the DMA buffer you must have first
  325.          created a DMA buffer whose address (the pointer to) is
  326.          known to you.   Do this with the function -
  327.  
  328.               set_dma(dma)
  329.               char dma[128];
  330.  
  331.          void PRINT_BIN(n)
  332.          unsigned n;
  333.          -----------------
  334.  
  335.          Prints an unsigned number (Note: No negatives allowed) in
  336.          binary form.  e.g. the number 15 ( = 0xff) will be printed
  337.          to the console as -
  338.  
  339.               0000000011111111
  340.  
  341.          because all 16 bits are accounted for.
  342.  
  343.  
  344.          void PRINT_DEC(n)
  345.          int n;
  346.          -----------------
  347.  
  348.          Prints a decimal number (n) to the console.
  349.  
  350.          void PRT_STR(str)
  351.          char *str;
  352.          -----------------
  353.  
  354.          Prints a string (terminated by the character "$") to the
  355.          console.   Doesn't return anything.
  356.  
  357.          Note you shouldn't use this function if you expect to meet
  358.          with the dollar sign other than as the end of line marker.
  359.  
  360.  
  361.          char READ_SEQ_SEC(fcb)
  362.          char fcb[36];
  363.          ----------------------
  364.  
  365.          Starting from the first available sector (of 128 bytes) it
  366.          will reach each successive sector in the file until the end
  367.          of the file is reached.   Returns zero when the read is
  368.          successful, else returns a non-zero number.   Note that the
  369.          file must already have been opened prior to this function
  370.          being called.
  371.  
  372.  
  373.          void READ_STR(str)
  374.          char *str;
  375.          ------------------
  376.  
  377.          Will read a RETURN-terminated string from the terminal and
  378.          place it, as a NULL-terminated string, into the str buffer.
  379.          Note, when calculating the size of the string buffer you
  380.          will use, you have to add one for the '\0' character which
  381.          will terminate the string.
  382.  
  383.          e.g. if you want the maximum length of the string to be 80
  384.          characters then specify -
  385.  
  386.                    char str[81];
  387.  
  388.          for the string buffer.
  389.  
  390.  
  391.          void RESET_DSK()
  392.          ----------------
  393.  
  394.          This resets the disk system and reads the active disk
  395.          details into memory again.   It is typically used in a
  396.          programme after a disk has been changed, or swapped.   It
  397.          doesn't return anything.
  398.  
  399.  
  400.          void REVERSE(str)
  401.          char str[];
  402.          -----------------
  403.  
  404.          Will reverse a null-terminated string in place.
  405.  
  406.          unsigned R_SHIFT(value, number)
  407.          unsigned value;
  408.          int number;
  409.          -------------------------------
  410.  
  411.          Performs a logical right shift on "value" the number of times
  412.          specified by "number".   Returns the final right-shifted value.
  413.  
  414.  
  415.          void SCOPY_N(str1, str2, n)
  416.          char *str1, *str2;
  417.          int n;
  418.          ---------------------------
  419.  
  420.          This copies "n" characters from string "str2" to string
  421.          "str1".   Note that if n is greater than strlen(str2) then
  422.          only strlen(str2) characters will be copied.   Also str1 is
  423.          not terminated with the '\0' character on completion so this
  424.          function can be used to overwrite a buffer.
  425.  
  426.  
  427.          char SEARCH_FIRST(fcb)
  428.          char fcb[36];
  429.          ----------------------
  430.  
  431.          This searches the disk directory for the first file name
  432.          which matches the name given in the file control block
  433.          pointed to by "fcb".   Note - see OPEN_FILE for a run-down
  434.          on the file control block under CP/M.   The file name you
  435.          choose may be either ambiguous or specific.
  436.  
  437.          If it is ambiguous, this function will return the first
  438.          file name which matches the given name.   When a match has
  439.          occurred, it returns 0, 1, 2 or 3 which is the offset
  440.          into the DMA buffer where the directory information has
  441.          been placed by CP/M.   Knowing the offset (which is a factor
  442.          of 32 bytes) you can now recover the actual directory entry
  443.          as stored by CP/M.
  444.  
  445.          e.g. if the offset is, say, 2 then if you look 2 x 32 = 64
  446.          bytes into the DMA you will find the first byte of the
  447.          directory entry for the matching file name.
  448.  
  449.          If it returns 0xff (255 decimal) then you didn't find any
  450.          file which matched the name you gave.
  451.  
  452.  
  453.          char SEARCH_NEXT()
  454.          -----------------
  455.  
  456.          Carries on from search_first to locate any further names
  457.          which match the name in the file control block.   Note this
  458.          can only be used after a successful search_first.   It will
  459.          return the same parameters as search_first for both failure
  460.          and success.
  461.  
  462.  
  463.          void SELECT_DSK(drive)
  464.          int drive;
  465.          ----------------------
  466.  
  467.          This allows you to change the "logical" drive during the
  468.          course of a programme.   Just enter the drive name as A, B,
  469.          C...M, etc and the function converts this to the value
  470.          required by CP/M.   Doesn't return anything.
  471.  
  472.  
  473.          char SET_ATTRIBUTES(fcb)
  474.          char fcb[36];
  475.          ------------------------
  476.  
  477.          Used to set (or re-set) the attributes for R/O, R/W, DIR,
  478.          SYS and ARC and CPY (in my backup programme) so that CP/M
  479.          will know how to deal with a particular file in the disk
  480.          directory.   To use this function successfully you must
  481.          have first formulated a file control block with the bits
  482.          you want CP/M to recognise either set ( = 1) or re-set to
  483.          zero, as the case may be.   Will return 0xff if the file
  484.          can't be located in the disk directory.
  485.  
  486.  
  487.          void SETDMA(buffer)
  488.          char buffer[128];
  489.          -------------------
  490.  
  491.          Creates a pointer to the DMA (CP/M's direct memory address)
  492.          buffer which can then be used in the read/write and other
  493.          CP/M functions where a DMA is required.   It is probably
  494.          most useful when "buffer" is declared externally.
  495.  
  496.  
  497.          void SET_IOBYTE(iob)
  498.          int iob;
  499.          --------------------
  500.  
  501.          Re-sets the IOBYTE to the specified value.   Doesn't return
  502.          anything.
  503.  
  504.  
  505.          void SHELL_SORT(v, n)
  506.          int v[], n;
  507.          ---------------------
  508.  
  509.          Sorts an array "v" of "n" elements into increasing order.
  510.  
  511.  
  512.          void SWAP_POINTERS(px, py)
  513.          char *px[], *py[];
  514.          --------------------------
  515.  
  516.          Will interchange two pointers.
  517.  
  518.  
  519.          char USER_ID(code)
  520.          int code;
  521.          ------------------
  522.  
  523.          Will either return the current User Number, if code = 255
  524.          (0xff), or will change the User Number if code = 0 to 15.
  525.  
  526.  
  527.          char WRITE_SEQ_SEC(fcb)
  528.          char fcb[36];
  529.          -----------------------
  530.  
  531.          A companion function to read_seq_sec.   This will write
  532.          successive sectors to the open file named in the file
  533.          control block.   It will return zero if successful or a
  534.          non-zero number if not successful in completing the write.
  535. 
  536.          ch