GitHunt
SU

Replacement for MS-DOS FINDCD.EXE batch utility that uses filename argument and written in ASM

GETCD: MS-DOS .BAT Utility For Locating CD-ROM Drive

GETCD.COM is "batch utility" for MS-DOS to assist in locating a
CD-ROM drive based on file search. It is similar to FINDCD.EXE
with the following exceptions

  • it takes an argument to specify a file
  • automatically creates/manages the CDROM= variable

It is written in NASM assembler; and is mostly the thing I wrote
while attempting to learn learning assembler.

Usage

GETCD.COM does not display much in the way of user output. The
largest chunk can be seen by calling the basic help:

getcd /?

If you were to "place a CD" in a "CD drive" with the file what.txt
on it and ran this:

getcd what.txt

It looks like nothing happened. However, if you call set from the
command prompt to see the current variables; you should see CDROM=D:
(or whatever the actual drive letter is) now exists.

getcd on it's own will default to a wildcard (*) search. This has
the effect of returning the first CD drive that has a disc in it, or
doesn't return some kind of error.

Wildcards are allowed in the search string; as well as just directory
names. The first drive that doesn't fail search is returned.

NO ENV FREE is the only displayed error message if you don't have
enough environment space free. Most failures should result in nothing
being changed. This plays well with being a batch utility:

@echo off
set CDROM=0:
getcd what.txt
if %CDROM%=0: goto nocd
(do stuff)
goto exit
nocd:
(stuff for no cd)
exit:

Additionally, you can look for errorlevel 255, which is returned if
there are no CDROM drives.

Adapting scripts for FINDCD.EXE

You'll just need to modify FINDCD to GETCD [file]

My scripts want a \ in the variable

GETCD is kind of picky in that it will make the CDROM variable
a drive letter, a colon, and no backslash. I may change this by
assuming an extra character is a backslash an not delete it.

But, for now; just do this in your .bat

set CDROM=%CDROM%\

What does this do?

  • It lets you specify a file to search CD-ROM drives for and puts
    that drive letter in to the CDROM= environment variable. Then
    fancy .BAT scripts can go call %CDROM%\install.bat and
    run the .bat off the CD.

How does it differ from other utilities?

  • The only utility I've actually found has been FINDCD.EXE. The
    alternative is apparently for loops. I've seen mentions of other
    utlities on sites devoted to .bat scripting; but never found an
    exe.
    The differences from FINDCD are passing a filename as an argument
    and the automatic management of the variable. FINDCD used a hard
    coded file in the binary as well as requiring you to preset the
    variable.
    I decided to just toss all that aside and assume the user might
    not do it right; or in the case of FINDCD; the variable length
    pre-set is longer than necessary. I have no clue what FINDCD is
    doing with the variable.

Building

nasm -o getcd.com getcd.asm

The build system was FreeDOS with WatcomC, DJGPP, IA16, and a few other things on it.

It was tested on MS-DOS 6.22 under an 86Box emulated 486/DX4 100.

Random Things Passed As FAQ:

Why a .COM and not a .EXE?

  • We didn't need any of the fancy options a .exe gave us. Our binary is not over 65kB in size and doesn't have to be relocated to run. That is primarily what .exe would give me; the ability to relocate my code once loaded. I could have assembled this to an object file then linked it to an .EXE, but I still wouldn't be using any "EXE features"

What are the minimum requirements?

  • DOS 3.3 and a CD-ROM drive. The program doesn't use much ram and
    while will technically run on an 8088, the lack of CD-ROM drivers
    are a bigger issue.

Will this work on FreeDOS?

  • Yes, it's been known to. I have not tested the memory manipulating
    version; but early versions worked.

What about n-DOS?

  • No comment. It should, but it will depend if your CD-ROM extensions
    respond to the interrupts I use.

Why did you do this?

  • I'd wanted to see if I could write x86 ASM for quite some time. I
    hadn't learned ASM beyond knowing how CPU's work at a low level
    and what ASM was. I had an incorrect assumption that I didn't know
    the levels of math required to make it work that I'd held for years.
    Anyway; I'd also incorrectly assumed after diving in that the magic
    of low-level would give me a secret way to look at drives without
    triggering errors. It did; but changing the interrupt vector isn't
    ASM specific..it was, like most things; a concept I'd heard about
    but really didn't undertand back in my teens when I first tried.
    I almost gave up and went to C when I was just trying to get the
    byte in the env block realizing that's why people have libaries.
    And, no; what little I read about the subject involved inline ASM.
    My most optimized version was 98 bytes. Yes, 98. It had no file
    argument or memory management. You had to make the environment;
    variable, it put the letter at the byte after =, and that was it.
    Then I decided to add features for the sake of stability and users;
    plus what good is a clone if you don't improve it.
    So despite serving no real purpose and being a huge time-sink for
    something only I'll probably use; I'm at least better in ASM than
    when I started. Huge bar given I started at almost zero.

License

MIT No Attribution

Copyright 2024 Jay Moore

Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

subtlecaffeine/GETCD | GitHunt