diff options
author | H. Peter Anvin <hpa@zytor.com> | 2009-06-26 17:44:22 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2009-06-26 17:44:22 -0700 |
commit | b1deeb181382bad22846f9c467b64fbda6665e8f (patch) | |
tree | dab19a181948aab07de5d0be28dec020f556757d /dosutil | |
parent | 621eb2d9deb094d78001f841f3aadcf0f63f2477 (diff) | |
download | syslinux-b1deeb181382bad22846f9c467b64fbda6665e8f.tar.gz |
Create a dosutil subdirectory and move mdiskchk there
DOS utilities aren't really "samples". Create a dedicated "dosutil"
directory, and move mdiskchk there for now.
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'dosutil')
-rw-r--r-- | dosutil/mdiskchk.c | 146 | ||||
-rwxr-xr-x | dosutil/mdiskchk.com | bin | 0 -> 9680 bytes |
2 files changed, 146 insertions, 0 deletions
diff --git a/dosutil/mdiskchk.c b/dosutil/mdiskchk.c new file mode 100644 index 00000000..eec5be40 --- /dev/null +++ b/dosutil/mdiskchk.c @@ -0,0 +1,146 @@ +/* -*- c -*- ------------------------------------------------------------- * + * + * Copyright 2003-2008 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, + * Boston MA 02111-1307, USA; either version 2 of the License, or + * (at your option) any later version; incorporated herein by reference. + * + * ----------------------------------------------------------------------- */ + +/* + * 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 short uint16_t; +typedef unsigned char uint8_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; + uint8_t bootloaderid; + + uint8_t _pad; + + /* 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; + uint16_t bytes; + + __asm { + .386; + mov eax, 454 d0800h; + mov ecx, 444 d0000h; + mov edx, 53490000 h; + mov dl, _dl; + mov ebx, 3f 4 b0000h; + int 13 h; + 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; + + memset(&mm, 0, sizeof mm); + + bytes = *(uint16_t far *) MK_FP(_es, _di); + + /* 27 is the most we know how to handle */ + if (bytes > 27) + bytes = 27; + + _fmemcpy((void far *)&mm, (void far *)MK_FP(_es, _di), bytes); + + mm.cylinders = ((_ecx >> 8) & 0xff) + ((_ecx & 0xc0) << 2) + 1; + mm.heads = ((_edx >> 8) & 0xff) + 1; + mm.sectors = (_ecx & 0x3f); + + return &mm; +} + +const char *bootloadername(uint8_t id) +{ + static const struct { + uint8_t id, mask; + const char *name; + } *lp, list[] = { + { + 0x00, 0xf0, "LILO"}, { + 0x10, 0xf0, "LOADLIN"}, { + 0x31, 0xff, "SYSLINUX"}, { + 0x32, 0xff, "PXELINUX"}, { + 0x33, 0xff, "ISOLINUX"}, { + 0x34, 0xff, "EXTLINUX"}, { + 0x30, 0xf0, "SYSLINUX family"}, { + 0x40, 0xf0, "Etherboot"}, { + 0x50, 0xf0, "ELILO"}, { + 0x70, 0xf0, "GrUB"}, { + 0x80, 0xf0, "U-Boot"}, { + 0xA0, 0xf0, "Gujin"}, { + 0xB0, 0xf0, "Qemu"}, { + 0x00, 0x00, "unknown"} + }; + + for (lp = list;; lp++) { + if (((id ^ lp->id) & lp->mask) == 0) + return lp->name; + } +} + +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" + "\tloader = 0x%02x (%s),\n" + "\tcmdline = %Fs\n", + d, m->version >> 8, m->version & 0xff, + m->base, m->size, m->cylinders, m->heads, m->sectors, + m->bootloaderid, bootloadername(m->bootloaderid), + m->cmdline); + found++; + } + } + + return found; +} diff --git a/dosutil/mdiskchk.com b/dosutil/mdiskchk.com Binary files differnew file mode 100755 index 00000000..07e1471b --- /dev/null +++ b/dosutil/mdiskchk.com |