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
Plaintext
164 lines
6.3 KiB
Plaintext
3 weeks ago
|
# 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.
|