home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / alt_os / mint / mfs6011 / source / minixfs / tinyxhdi.c < prev    next >
C/C++ Source or Header  |  1994-05-13  |  7KB  |  373 lines

  1. /*
  2.     @(#)XHDI/xhdi.c
  3.     
  4.     Julian F. Reschke, 2. April 1993
  5.     
  6.     Bindings for the XHDI functions
  7.     --- NOT FULLY TESTED, USE AT YOUR OWN RISK ---
  8.  
  9.     Important:
  10.     
  11.     Do calls only if XHGetVersion() was successful
  12. */
  13.  
  14. /* S.N.Henson: this has been hacked up a bit so gcc will tolerate it.
  15.  * Define SUPER_CALL if functions will already be called from supervisor
  16.  * mode (e.g. from an installable filesystem). Also define TINY_XHDI to
  17.  * strip all but minixfs used functions.
  18.  */
  19.  
  20. #include <stddef.h>
  21. #include <stdio.h>
  22. #include <string.h>
  23. #ifdef __GNUC__
  24. #include <osbind.h>
  25. #define BPB _BPB
  26. #else
  27. #include <tos.h>
  28. #endif
  29.  
  30. #include "xhdi.h"
  31.  
  32. #define XHDIMAGIC 0x27011992L
  33.  
  34. #ifdef __GNUC__
  35. typedef LONG (*cookie_fun)(UWORD opcode,...);
  36. #else
  37. typedef LONG cdecl (*cookie_fun)(UWORD opcode,...);
  38. #endif
  39.  
  40. #ifndef SUPER_CALL
  41. static long
  42. cookieptr (void)
  43. {
  44.     return *((long *)0x5a0);
  45. }
  46. #endif
  47.  
  48. static int
  49. getcookie (long cookie, long *p_value)
  50. {
  51.  
  52. #ifdef SUPER_CALL
  53.     long *cookiejar = *((long **)0x5a0);
  54. #else
  55.     long *cookiejar = (long *)Supexec (cookieptr);
  56. #endif
  57.  
  58.     if (!cookiejar) return 0;
  59.  
  60.     do
  61.     {
  62.         if (cookiejar[0] == cookie)
  63.         {
  64.             if (p_value) *p_value = cookiejar[1];
  65.             return 1;
  66.         }
  67.         else
  68.             cookiejar = &(cookiejar[2]);
  69.     } while (cookiejar[-2]);
  70.  
  71.     return 0;
  72. }
  73.  
  74. static cookie_fun
  75. get_fun_ptr (void)
  76. {
  77.     static cookie_fun XHDI = NULL;
  78.     static int have_it = 0;
  79.     
  80.     if (!have_it)
  81.     {
  82.         LONG *magic_test;
  83.     
  84.         getcookie (*((long *)"XHDI"), (LONG *)&XHDI);
  85.         have_it = 1;
  86.  
  87.         /* check magic */
  88.         
  89.         magic_test = (LONG *)XHDI;
  90.         if (magic_test && (magic_test[-1] != XHDIMAGIC))
  91.             XHDI = NULL;
  92.     }
  93.     
  94.     return XHDI;
  95. }
  96.  
  97.  
  98. UWORD
  99. XHGetVersion (void)
  100. {
  101.     cookie_fun XHDI = get_fun_ptr ();
  102.  
  103.     UWORD ret = 0;        /* 0: kein Cookie da */
  104. #ifndef SUPER_CALL
  105.     LONG oldstack = 0;
  106.  
  107.     if (!Super ((void *)1L)) oldstack = Super (0L);
  108. #endif
  109.     if (XHDI)
  110.         ret = (UWORD) XHDI (0);
  111. #ifndef SUPER_CALL        
  112.     if (oldstack) Super ((void *)oldstack);
  113. #endif
  114.     return ret;
  115. }
  116.  
  117. LONG
  118. XHInqTarget (UWORD major, UWORD minor, ULONG *block_size,
  119.              ULONG *device_flags, char *product_name)
  120. {
  121.     cookie_fun XHDI = get_fun_ptr ();
  122.     LONG ret;
  123. #ifndef SUPER_CALL    
  124.     LONG oldstack = 0;
  125.  
  126.     if (!Super ((void *)1L)) oldstack = Super (0L);
  127. #endif    
  128.     ret = XHDI (1, major, minor, block_size, device_flags,
  129.                 product_name);
  130.  
  131. #ifndef SUPER_CALL        
  132.     if (oldstack) Super ((void *)oldstack);
  133. #endif
  134.     return ret;
  135. }
  136. #ifndef TINY_XHDI
  137. LONG
  138. XHReserve (UWORD major, UWORD minor, UWORD do_reserve, UWORD key)
  139. {
  140.     cookie_fun XHDI = get_fun_ptr ();
  141.     LONG ret;
  142. #ifndef SUPER_CALL
  143.     LONG oldstack = 0;
  144.  
  145.     if (!Super ((void *)1L)) oldstack = Super (0L);
  146. #endif
  147.  
  148.     ret = XHDI (2, major, minor, do_reserve, key);
  149.  
  150. #ifndef SUPER_CALL        
  151.     if (oldstack) Super ((void *)oldstack);
  152. #endif
  153.     return ret;
  154. }
  155.  
  156. LONG
  157. XHLock (UWORD major, UWORD minor, UWORD do_lock, UWORD key)
  158. {
  159.     cookie_fun XHDI = get_fun_ptr ();
  160.     LONG ret;
  161. #ifndef SUPER_CALL
  162.     LONG oldstack = 0;
  163.  
  164.     if (!Super ((void *)1L)) oldstack = Super (0L);
  165. #endif
  166.  
  167.     ret = XHDI (3, major, minor, do_lock, key);
  168.  
  169. #ifndef SUPER_CALL        
  170.     if (oldstack) Super ((void *)oldstack);
  171. #endif
  172.     return ret;
  173. }
  174.  
  175. LONG
  176. XHStop (UWORD major, UWORD minor, UWORD do_stop, UWORD key)
  177. {
  178.     cookie_fun XHDI = get_fun_ptr ();
  179.     LONG ret;
  180. #ifndef SUPER_CALL
  181.     LONG oldstack = 0;
  182.  
  183.     if (!Super ((void *)1L)) oldstack = Super (0L);
  184. #endif
  185.  
  186.     ret = XHDI (4, major, minor, do_stop, key);
  187.  
  188. #ifndef SUPER_CALL        
  189.     if (oldstack) Super ((void *)oldstack);
  190. #endif
  191.     return ret;
  192. }
  193.  
  194. LONG
  195. XHEject (UWORD major, UWORD minor, UWORD do_eject, UWORD key)
  196. {
  197.     cookie_fun XHDI = get_fun_ptr ();
  198.     LONG ret;
  199. #ifndef SUPER_CALL
  200.     LONG oldstack = 0;
  201.  
  202.     if (!Super ((void *)1L)) oldstack = Super (0L);
  203. #endif
  204.  
  205.     ret = XHDI (5, major, minor, do_eject, key);
  206.  
  207. #ifndef SUPER_CALL        
  208.     if (oldstack) Super ((void *)oldstack);
  209. #endif
  210.     return ret;
  211. }
  212.  
  213. ULONG
  214. XHDrvMap (void)
  215. {
  216.     cookie_fun XHDI = get_fun_ptr ();
  217.     LONG ret;
  218. #ifndef SUPER_CALL
  219.     LONG oldstack = 0;
  220.  
  221.     if (!Super ((void *)1L)) oldstack = Super (0L);
  222. #endif
  223.     ret = XHDI (6);
  224. #ifndef SUPER_CALL        
  225.     if (oldstack) Super ((void *)oldstack);
  226. #endif
  227.     return ret;
  228. }
  229. #endif
  230. LONG
  231. XHInqDev (UWORD bios_device, UWORD *major, UWORD *minor,
  232.           ULONG *start_sector, BPB *bpb)
  233. {
  234.     cookie_fun XHDI = get_fun_ptr ();
  235.     LONG ret;
  236. #ifndef SUPER_CALL
  237.     LONG oldstack = 0;
  238.  
  239.     if (!Super ((void *)1L)) oldstack = Super (0L);
  240. #endif
  241.     ret = XHDI (7, bios_device, major, minor, start_sector, bpb);
  242. #ifndef SUPER_CALL        
  243.     if (oldstack) Super ((void *)oldstack);
  244. #endif
  245.     return ret;
  246. }
  247. #ifndef TINY_XHDI
  248. LONG
  249. XHInqDriver (UWORD bios_device, char *name, char *version,
  250.     char *company, UWORD *ahdi_version, UWORD *maxIPL)
  251. {
  252.     cookie_fun XHDI = get_fun_ptr ();
  253.     LONG ret;
  254. #ifndef SUPER_CALL
  255.     LONG oldstack = 0;
  256.  
  257.     if (!Super ((void *)1L)) oldstack = Super (0L);
  258. #endif
  259.     ret = XHDI (8, bios_device, name, version, company, ahdi_version,
  260.                 maxIPL);
  261. #ifndef SUPER_CALL
  262.     if (oldstack) Super ((void *)oldstack);
  263. #endif
  264.     return ret;
  265. }
  266.  
  267. LONG
  268. XHNewCookie (void *newcookie)
  269. {
  270.     cookie_fun XHDI = get_fun_ptr ();
  271.     LONG ret;
  272. #ifndef SUPER_CALL
  273.     LONG oldstack = 0;
  274.  
  275.     if (!Super ((void *)1L)) oldstack = Super (0L);
  276. #endif
  277.     ret = XHDI (9, newcookie);
  278. #ifndef SUPER_CALL        
  279.     if (oldstack) Super ((void *)oldstack);
  280. #endif
  281.     return ret;
  282. }
  283. #endif
  284. LONG
  285. XHReadWrite (UWORD major, UWORD minor, UWORD rwflag,
  286.              ULONG recno, UWORD count, void *buf)
  287. {
  288.     cookie_fun XHDI = get_fun_ptr ();
  289.     LONG ret;
  290. #ifndef SUPER_CALL
  291.     LONG oldstack = 0;
  292.  
  293.     if (!Super ((void *)1L)) oldstack = Super (0L);
  294. #endif
  295.     ret = XHDI (10, major, minor, rwflag, recno, count, buf);
  296. #ifndef SUPER_CALL
  297.     if (oldstack) Super ((void *)oldstack);
  298. #endif
  299.     return ret;
  300. }
  301. #ifndef TINY_XHDI
  302. LONG
  303. XHInqTarget2 (UWORD major, UWORD minor, ULONG *block_size,
  304.               ULONG *device_flags, char *product_name,
  305.               UWORD stringlen)
  306. {
  307.     cookie_fun XHDI = get_fun_ptr ();
  308.     LONG ret;
  309. #ifndef SUPER_CALL
  310.     LONG oldstack = 0;
  311.  
  312.     if (!Super ((void *)1L)) oldstack = Super (0L);
  313. #endif
  314.     ret = XHDI (11, major, minor, block_size, device_flags,
  315.                 product_name, stringlen);
  316. #ifndef SUPER_CALL        
  317.     if (oldstack) Super ((void *)oldstack);
  318. #endif
  319.     return ret;
  320. }
  321. #endif
  322. LONG
  323. XHInqDev2 (UWORD bios_device, UWORD *major, UWORD *minor,
  324.            ULONG *start_sector, BPB *bpb, ULONG *blocks,
  325.            char *partid)
  326. {
  327.     cookie_fun XHDI = get_fun_ptr ();
  328.     LONG ret;
  329. #ifndef SUPER_CALL
  330.     LONG oldstack = 0;
  331.  
  332.     if (!Super ((void *)1L)) oldstack = Super (0L);
  333. #endif
  334.     ret = XHDI (12, bios_device, major, minor, start_sector, bpb,
  335.                 blocks, partid);
  336. #ifndef SUPER_CALL        
  337.     if (oldstack) Super ((void *)oldstack);
  338. #endif
  339.     return ret;
  340. }
  341. #ifndef TINY_XHDI
  342. void
  343. XHMakeName (UWORD major, UWORD minor, ULONG start_sector, char *name)
  344. {
  345.     if (major < 8)
  346.     {
  347.         sprintf (name, "ACSI.%d.%d.%ld", major, minor, start_sector);
  348.         return;
  349.     }    
  350.  
  351.     if (major < 16)
  352.     {
  353.         sprintf (name, "SCSI.%d.%d.%ld", major - 8, minor,
  354.             start_sector);
  355.         return;
  356.     }    
  357.  
  358.     if (major < 18)
  359.     {
  360.         sprintf (name, "IDE.%d.%ld", major - 16, start_sector);
  361.         return;
  362.     }    
  363.  
  364.     if (major == 64)
  365.     {
  366.         sprintf (name, "FD.%d.%ld", minor, start_sector);
  367.         return;
  368.     }    
  369.     
  370.     sprintf (name, "XHDI.%d.%d.%ld", major, minor, start_sector);
  371. }
  372. #endif
  373.