You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

164 lines
6.3 KiB
Markdown

# 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.