home *** CD-ROM | disk | FTP | other *** search
/ CD Shareware Masterblend / cdsharewaremasterblend.iso / utils / adj-ramd / adjram30.c < prev    next >
C/C++ Source or Header  |  1986-09-09  |  36KB  |  1,110 lines

  1. /*      Adjustable Ram Disk
  2.  
  3.  (c)    Copyright 1986 by Gary Cramblitt.  All Rights Reserved.
  4.  
  5.  v2.2    1 Jul 86   Initial version
  6.  v2.3   24 Aug 86   Bug.  FAT media byte not updated properly.
  7.  v2.4    29 Aug 86   If current drive is memory disk drive, reset current
  8.             directory on exit.
  9.  v2.5    30 Aug 86   Increase FAT to permit max size of 2043K;
  10.             Increase size of root directory to 128 entries;
  11.             Start code for /E option (Expanded Memory Support)
  12.  v3.0    30 Aug 86   Finish code for /E option.
  13.  
  14.     For program usage, see the last routine.
  15.  
  16.     This program is coded in DeSmet C v2.4.  Any function beginning
  17. with underscore (_) is a non-standard routine from the DeSmet library.
  18. They are:
  19.     _showcs()
  20.         Synopsis: unsigned _showcs()
  21.  
  22.         Returns the current value of CS.
  23.  
  24.     _showds()
  25.         Synopsis: unsigned _showds()
  26.  
  27.         Returns the current value of DS (= SS in DeSmet C).
  28.  
  29.     _peek()
  30.         Synopsis: char _peek(offset,segment)
  31.               char *offset;
  32.               unsigned segment;
  33.         Returns the byte at specified far address.
  34.  
  35.     _doint()
  36.         Synopsis: set any or all of the externs
  37.                   _rax,_rbx,_rcx,_rdx,_rsi,_rdi,_res,_rds
  38.         followed by
  39.               _doint(interrupt number);
  40.         Performs the specified interrupt with the specified
  41.         registers set from the externs.
  42.  
  43.         After the call, _rax, etc. can be used.  _carryf
  44.         and _zerof are extern char variables set to 1 if
  45.         the carry or zero flag is set.
  46.  
  47. In addition, the following routines are semi_standard, and may have
  48. slightly different implementations with your compiler:
  49.  
  50.     strncmp()
  51.         Synopsis: char *strncmp(leftstring,rightstring,max)
  52.                   char *leftstring, *rightstring
  53.               int max        
  54.         strncmp() compares up to a specified number of chars
  55.         in two strings.  It returns 0 if the specified number
  56.         of characters in the string are the same.
  57.  
  58.         free()
  59.         Synopsis: int free(pointer)
  60.               char *pointer
  61.         free memory previously allocated (by calloc).  Called
  62.         "cfree" in K&R.
  63. */
  64.  
  65. /* ==== Definitions ==== */
  66.  
  67. /* ---- Overall Definitions ---- */
  68.  
  69. #define true            1
  70. #define false            0
  71. #define max_size        2043    /* max memory disk size    */
  72.  
  73. /*
  74.    ---- To compile without LOTUS/INTEL/Microsoft Expanded Memory
  75.     support, change the "1" to "0" in the next statement.  This
  76.     will save about 2500 bytes in the .EXE file.
  77. */
  78.  
  79. #define em_support        1    /* compile for EM support */
  80.  
  81. /*
  82.     The following symbols must correspond to the same symbols in
  83.     file amdisk.asm.  If one is changed, so must the other.
  84.     This is because the first memory block may not be
  85.     deallocated.
  86. */
  87.  
  88. #define    min_size        64    /* minimum 64K = 128 sectors */
  89. #define    sec_per_blk        64    /* increment in 32K blocks */
  90.  
  91. /*
  92.    ---- Disk definitions.  Note: These constants should be made into
  93.     variables or functions if this program's algorithms need to
  94.     be generalized to disks of any type, especially high density disks.
  95.     Since this program works only in conjunction with amdisk.asm,
  96.     is OK to make them constants here.
  97. */
  98.  
  99. #define bytes_per_sec        512    /* 512 bytes per sector */
  100. #define par_per_sec        (512/16)
  101.                     /* 32 paragraphs per sector */
  102. #define sec_per_K        (1024/512)
  103.                     /* sectors per 1024 bytes */
  104. #define dir_per_sec        (512/sizeof(struct dir_entry))
  105.                     /* directory entries per sector */
  106. #define em_pag_per_blk        2    /* two 16K EM pages per mem block */
  107.  
  108. /* ---- Program Segment Prefix ---- */
  109.  
  110. #define    environment_segment    0x2c    /* segment address of the environment */
  111.  
  112. /* ---- DOS interrupts ---- */
  113.  
  114. #define    dosi_dosf        0x21    /* DOS function interrupt */
  115. #define    dosi_dsk_read        0x25    /* DOS absolute disk read interrupt */
  116. #define    dosi_dsk_write        0x26    /* DOS absolute disk write interrupt */
  117.  
  118. /* ---- User interrupts ---- */
  119.  
  120. #define usri_emm        0x67    /* LOTUS/INTEL/Microsoft Expanded
  121.                        Memory Manager */
  122. /* ---- DOS functions ---- */
  123.  
  124. #define dosf_seldisk        0x0e    /* set default disk */
  125. #define dosf_getdisk        0x19    /* get current default disk */
  126. #define dosf_getver        0x30    /* get DOS version number */
  127. #define    dosf_keepprc        0x31    /* keep process (term and stay resident) */
  128. #define dosf_drvfre        0x36    /* get disk free space */
  129. #define dosf_chdir        0x3b    /* set default directory */
  130. #define dosf_openh        0x3d    /* open file handle */
  131. #define dosf_closeh        0x3e    /* close file handle */
  132. #define dosf_ioctl        0x44    /* IOCTL */
  133. #define dosf_cwd        0x47    /* get current directory */
  134. #define dosf_alloc        0x48    /* allocate memory block */
  135. #define    dosf_dealloc        0x49    /* deallocate memory block */
  136. #define    dosf_setblk        0x4a    /* modify memory block */
  137.  
  138. /* ---- LOTUS/INTEL/Microsoft Expanded Memory Manager functions ---- */
  139.  
  140. #define emm_status        0x40    /* get manager status */
  141. #define emm_get_PFseg        0x41    /* get page frame segment */
  142. #define emm_get_pages        0x42    /* get number of pages */
  143. #define emm_get_handle        0x43    /* get handle and allocate memory */
  144. #define emm_map_memory        0x44    /* map memory */
  145. #define emm_fre_handle        0x45    /* free handle and memory */
  146. #define emm_get_ver        0x46    /* get EMM version */
  147. #define emm_sav_map        0x47    /* save mapping context */
  148. #define emm_res_map        0x48    /* restore mapping context */
  149. #define emm_num_handles        0x4b    /* get number of EMM handles */
  150. #define emm_hdl_pages        0x4c    /* get pages owned by handle */
  151. #define emm_all_pages        0x4d    /* get pages for all handles */
  152. #define emm_pag_map        0x4e    /* get or set page map */
  153.  
  154. #define nor_flg            0    /* memory block is in normal memory */
  155. #define em_flg            1    /* memory block is in expaned memory */
  156.  
  157. /*
  158.    ---- DOS Errors ----
  159.     These codes are returned by program and can be tested with DOS
  160.     IF statement.
  161. */
  162.  
  163. #define    dose_noerr        0    /* no error */
  164. #define dose_invfunc        1    /* invalid function */
  165. #define dose_arena        7    /* arena trashed */
  166. #define dose_noram        8    /* not enough memory */
  167. #define dose_invdrv        15    /* invalid drive */
  168.  
  169. /* ---- Directory definitions ---- */
  170.  
  171. #define never_used        0    /* directory entry never used */
  172. #define erased            0xe5    /* file has been erased */
  173. #define dir_bit            0x10    /* this bit indicates subdirectory */
  174.  
  175. /* ---- FAT definitions ---- */
  176.  
  177. #define available        0    /* cluster is available for use */
  178. #define bad            0xff7    /* cluster is bad */
  179. #define last_low        0xff8    /* last cluster for the file */
  180. #define last_high        0xfff    /* last cluster for the file */
  181.  
  182. extern unsigned _rax, _rbx, _rcx, _rdx, _rsi, _rdi, _res, _rds;
  183. extern char    _carryf, _zerof;
  184.  
  185. /* ---- Directory entry ---- */
  186.  
  187. struct dir_entry {
  188.   union dir_name {
  189.     char        name[8];
  190.     unsigned char    status;
  191.   } u_name;
  192.   char        ext[3];
  193.   unsigned char    attr;
  194.   unsigned char    reserved[10];
  195.   unsigned int    time;
  196.   unsigned int    date;
  197.   unsigned int    first_cluster;
  198.   unsigned long    size;
  199. };
  200.  
  201. /* ==== Global Data Storage ==== */
  202.  
  203. unsigned int pgm_seg;        /* CS at start of program saved here */
  204. int    drive_number;        /* memory disk drive number A=0, B=1, etc */
  205. int    mdisk_size;        /* user's desired memory disk size in K */
  206. int    mdisk_secs;        /* user's desired memory disk size in sectors */
  207. int    mdisk_chg;        /* the difference between disk's current size
  208.                    and the desired size (in sectors) */
  209. int    free_secs;        /* unused sectors in the memory disk */
  210. int    first_dir_sector;
  211. int    last_dir_sector;      /* loc of directory */
  212. int    first_fat_sector;
  213. int    last_fat_sector;    /* loc of FAT */
  214. int    free_cluster;        /* ptr to first free cluster */
  215. int    first_data_sector;    /* first sector after the last FAT */
  216.  
  217. /* ---- Memory Disk Boot Record ---- */
  218.  
  219. struct    boot_record {
  220.   unsigned char jmp[3];      /* non-bootable (no jump instruction ) */
  221.   char      ident[8];      /* identification */
  222.   unsigned int  bytes_in_sector;/* bytes/sector */
  223.   unsigned char sec_per_cluster;/* sectors/cluster */
  224.   unsigned int  bpb_reserved;      /* reserved sectors */
  225.   unsigned char bpb_fats;      /* number of FAT's */
  226.   unsigned int  bpb_root;      /* directory entries in root */
  227.   unsigned int  bpb_total;      /* total number of sectors */
  228.   unsigned char bpb_media;      /* media byte = number of mem blocks */
  229.   unsigned int  bpb_fat_size;      /* sectors/FAT */
  230.  
  231.   unsigned int  sec_per_track;    /* sectors/track */
  232.   unsigned int  heads;          /* number of heads */
  233.   unsigned int  hidden;          /* hidden se