diff options
| author | hpa <hpa> | 2003-11-26 00:10:40 +0000 |
|---|---|---|
| committer | hpa <hpa> | 2003-11-26 00:10:40 +0000 |
| commit | bfae00f12b0ec32d6826f171ff5811d3066a7632 (patch) | |
| tree | 6ec5adcdf0f603abfe4e727e3ba79c0b805f1829 /sample | |
| parent | 16f5c17703a99c5fdef488274a037962b2fb72c1 (diff) | |
| download | syslinux-bfae00f12b0ec32d6826f171ff5811d3066a7632.tar.gz | |
Add API to query for the existence of MEMDISK.
Diffstat (limited to 'sample')
| -rw-r--r-- | sample/mdiskchk.c | 105 | ||||
| -rwxr-xr-x | sample/mdiskchk.com | bin | 0 -> 10946 bytes |
2 files changed, 105 insertions, 0 deletions
diff --git a/sample/mdiskchk.c b/sample/mdiskchk.c new file mode 100644 index 00000000..cf2987ea --- /dev/null +++ b/sample/mdiskchk.c @@ -0,0 +1,105 @@ +/* -*- c -*- ------------------------------------------------------------- * + * + * Copyright 2003 H. Peter Anvin - All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, Inc., 53 Temple Place Ste 330, + * Bostom MA 02111-1307, USA; either version 2 of the License, or + * (at your option) any later version; incorporated herein by reference. + * + * ----------------------------------------------------------------------- */ +/* $Id$ */ + +/* + * mdiskchk.c + * + * DOS program to check for the existence of a memdisk. + * + * This program can be compiled for DOS with the OpenWatcom compiler + * (http://www.openwatcom.org/): + * + * wcl -3 -osx -mt mdiskchk.c + */ + +#include <stdio.h> +#include <string.h> +#include <i86.h> /* For MK_FP() */ + +typedef unsigned long uint32_t; +typedef unsigned int uint16_t; + +struct memdiskinfo { + uint16_t bytes; /* Bytes from memdisk */ + uint16_t version; /* Memdisk version */ + uint32_t base; /* Base of disk in high memory */ + uint32_t size; /* Size of disk in sectors */ + char far * cmdline; /* Command line */ + void far * oldint13; /* Old INT 13h */ + void far * oldint15; /* Old INT 15h */ + uint16_t olddosmem; + + /* We add our own fields at the end */ + int cylinders; + int heads; + int sectors; +}; + +struct memdiskinfo * query_memdisk(int drive) +{ + static struct memdiskinfo mm; + uint32_t _eax, _ebx, _ecx, _edx; + uint16_t _es, _di; + unsigned char _dl = drive; + + __asm { + .386 ; + mov eax, 454d0800h ; + mov ecx, 444d0000h ; + mov edx, 53490000h ; + mov dl, _dl ; + mov ebx, 3f4b0000h ; + int 13h ; + mov _eax, eax ; + mov _ecx, ecx ; + mov _edx, edx ; + mov _ebx, ebx ; + mov _es, es ; + mov _di, di + } + + if ( _eax >> 16 != 0x4d21 || + _ecx >> 16 != 0x4d45 || + _edx >> 16 != 0x4944 || + _ebx >> 16 != 0x4b53 ) + return NULL; + + _fmemcpy((void far *)&mm, (void far *)MK_FP(_es,_di), 26); + mm.cylinders = ((_ecx >> 8) & 0xff) + ((_ecx & 0xc0) << 2) + 1; + mm.heads = ((_edx >> 8) & 0xff) + 1; + mm.sectors = (_ecx & 0x3f); + + return &mm; +} + + +int main(int argc, char *argv[]) +{ + int d; + int found = 0; + struct memdiskinfo *m; + + for ( d = 0 ; d <= 0xff ; d++ ) { + if ( (m = query_memdisk(d)) != NULL ) { + printf("Drive %02X is MEMDISK %u.%02u:\n" + "\tAddress = 0x%08lx, len = %lu sectors, chs = %u/%u/%u\n" + "\tCmdline = %Fs\n", + d, m->version >> 8, m->version & 0xff, + m->base, m->size, m->cylinders, m->heads, m->sectors, + m->cmdline); + found++; + } + } + + return found; +} diff --git a/sample/mdiskchk.com b/sample/mdiskchk.com Binary files differnew file mode 100755 index 00000000..0391f94d --- /dev/null +++ b/sample/mdiskchk.com |
