/* @(#)XHDI/xhdi.c @(#)Julian F. Reschke, 27. Januar 1992 Bindings for the XHDI functions --- NOT FULLY TESTED, USE AT YOUR OWN RISK --- Important: Do calls only if XHGetVersion() was successful */ #include #include #include #include #include "xhdi.h" #define XHDIMAGIC 0x27011992L typedef LONG cdecl (*cookie_fun)(UWORD opcode,...); static int getcookie (long cookie, long *p_value) { long oldstack = 0L; long *cookiejar; if (!Super ((void *)1L)) oldstack = Super (0L); cookiejar = *((long **)0x5a0L); if (oldstack) Super ((void *)oldstack); if (!cookiejar) return 0; do { if (cookiejar[0] == cookie) { if (p_value) *p_value = cookiejar[1]; return 1; } else cookiejar = &(cookiejar[2]); } while (cookiejar[-2]); return 0; } static cookie_fun get_fun_ptr (void) { static cookie_fun XHDI = NULL; static int have_it = 0; if (!have_it) { LONG *magic_test; getcookie ('XHDI', (LONG *)&XHDI); have_it = 1; /* check magic */ magic_test = (LONG *)XHDI; if (magic_test && (magic_test[-1] != XHDIMAGIC)) XHDI = NULL; } return XHDI; } UWORD XHGetVersion (void) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; UWORD ret = 0; /* 0: kein Cookie da */ if (!Super ((void *)1L)) oldstack = Super (0L); if (XHDI) ret = (UWORD) XHDI (0); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHInqTarget (UWORD major, UWORD minor, ULONG *block_size, ULONG *device_flags, char *product_name) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (1, major, minor, block_size, device_flags, product_name); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHReserve (UWORD major, UWORD minor, UWORD do_reserve, UWORD key) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (2, major, minor, do_reserve, key); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHLock (UWORD major, UWORD minor, UWORD do_lock, UWORD key) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (3, major, minor, do_lock, key); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHStop (UWORD major, UWORD minor, UWORD do_stop, UWORD key) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (4, major, minor, do_stop, key); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHEject (UWORD major, UWORD minor, UWORD do_eject, UWORD key) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (5, major, minor, do_eject, key); if (oldstack) Super ((void *)oldstack); return ret; } ULONG XHDrvMap (void) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (6); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHInqDev (UWORD bios_device, UWORD *major, UWORD *minor, ULONG *start_sector, BPB *bpb) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (7, bios_device, major, minor, start_sector, bpb); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHInqDriver (UWORD bios_device, char *name, char *version, char *company, UWORD *ahdi_version, UWORD *maxIPL) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (8, bios_device, name, version, company, ahdi_version, maxIPL); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHNewCookie (void *newcookie) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (9, newcookie); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHReadWrite (UWORD major, UWORD minor, UWORD rwflag, ULONG recno, UWORD count, void *buf) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (10, major, minor, rwflag, recno, count, buf); if (oldstack) Super ((void *)oldstack); return ret; } void XHMakeName (UWORD major, UWORD minor, ULONG start_sector, char *name) { if (major < 8) { sprintf (name, "ACSI.%d.%d.%ld", major, minor, start_sector); return; } if (major < 16) { sprintf (name, "SCSI.%d.%d.%ld", major - 8, minor, start_sector); return; } if (major == 64) { sprintf (name, "FD.%d.%ld", minor, start_sector); return; } sprintf (name, "XHDI.%d.%d.%ld", major, minor, start_sector); }