add directory Linux-0.95

This commit is contained in:
gohigh
2024-02-19 00:21:03 -05:00
parent 059f8848b1
commit b6d98600bf
139 changed files with 25302 additions and 0 deletions

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,34 @@
If you are running a Cache program, and do not have it set to write
through, then (if you have Autocon set for a Warm or Cold boot -- and
probably External) you must configure Autocon to "Flush" your cache.
Hit the <F4> key, and put in the command string that causes your cache
to flush. The command should be listed in the documentation for your
Cache program. Autocon will then save the information, and perform a
"Flush" before each reboot.
If you are not sure if your Cache is set to "write through", please
configure Autocon to do the "Flush", just to be on the safe side.
The symptoms of a cache problem is that the Autoexec and Config files do
not get updated, and/or any edited Autocon configurations do not get
saved. In the worst case, the Autocon.Dat file will get corrupted, and
your screen colors will disappear (screen will be blank when you start
AutoCon).
Setting Autocon up to do the "Flush" will remove the problems.
Some Flush commands that I know are:
PC-KWIK - SUPERPCK /F
PC-CACHE - PC-CACHE /FLUSH
FLASH - FLASH /F?
HYPERDISK - HYPERDK W
SMARTDRV - SMARTDRV /C (new ver with WINDOWS 3.1)
Sorry for any inconvenience,
-Larry Weaver

View File

@@ -0,0 +1,61 @@
CHANGES
I don't know if you read the changes file in the previous version,
so I will summarize it. I sold my home in Santa Barbara, and moved
to a small town in Northern California to concentrate on writing
shareware full time. Well (you may ask), how's it going.
Since my program was reviewed on page 50 in the Nov. 13, 1990 issue
of PC Magazine, registrations have increased significantly.
Appearantly a lot of people read (and pay attention to) PC
Magazine. Site registrations have really increased, and I now have
some Fortune 50 customers. Banks, however, make up the bulk of
the Site Licensees.
I ran into a few tax problems (it was either pay Uncle a lot of
money, or put a lot of money into my house), so I've been
consulting pretty heavily the last year and doing major
reconstruction to my house. I think I am finally through with any
big consulting jobs (and with rebuilding my house), so now AutoCon
will be getting a lot more attention.
This is still not the release I had planned (it will probably show
up some time around July), but one of my competitors was on
Compuserve saying how much better he was than I because his program
could handle DOS 5.0's HIGH and UMB flags. I decided I needed to
add this capability to AutoCon and get out a new release before he
could cause any more problems. So with this release, AutoCon will
handle both MSDOS 5.0's HIGH and UMB flags, and it is compatible
with DRDOS which is one up on my competitor.
The 2.1 release of AutoCon will have a lot more editor
enhancements. I'm planning pull down menus (similar to the front
screen), and a split screen capability. I also intend to allow
Search/Replace operations to go automatically through all
configurations. I will also be able to use the screen size in
effect when AutoCon is started, instead of switching everything to
the 80X25 mode.
I have a support BBS online and functional. The number is (916)
623 4455, and it is in operation 24 hours a day. It has a 9600+
BAUD modem that is CompuCom CSP, V32, and V42 compatible (of course
it connects just fine at 2400 <or less> BAUD). The main function
of the BBS is (of course ) AutoCon support. If it gets busy
enough, it will grow into a full multi-line BBS. As a consequence
there are several megabytes of downloadable files on it, always
including the latest shareware release of AutoCon. I will also set
up a section for a group of Beta testers, so let me know if you are
interested in becomming one. I see several enhancements in
AutoCons future, as well as a few other programs that I have in
mind.
This is my first BBS and I'm sure there will be will be some
growing pains, so please bear with me.
I love the place I've moved to and I thank you very much for the
support you have given to AUTOCON, and for giving me the incentive
to change careers.
-Larry Weaver

View File

@@ -0,0 +1,8 @@
AutoCon V2.0g is a database manager for
Autoexec and Config Files. Allows up to
50 configurations, and makes switching
between them easy. Run full interactive
(editor, mouse, menus, context sensitive
help, etc.) or command line. MENU.CTL
device driver can setup menu of
configurations during boot. (ASP)

View File

@@ -0,0 +1,175 @@
The following is a list of the all of the editor functions, and the
default key assignments.
CURSOR MOVEMENT:
<Left>, <CtrlS>
Cursor left one character.
<Right>, <CtrlD>
Cursor right one character.
<CtrlLeft>, <CtrlA>
Cursor left one word. A 'word' is a series of non-separator
characters followed by one or more of the following :
' ', ';', '/', '='
<CtrlRight>, <CtrlF>
Cursor right one word.
<Home>, <CtrlQ><S>
Cursor to beginning of line.
<End>, <CtrlQ><D>
Cursor to end of line.
<Up>, <CtrlE>
Cursor up one line.
<Down>, <CtrlX>
Cursor down one line.
<CtrlW>
Scroll display up one line.
<CtrlZ>
Scroll display down one line.
<PgUp>, <CtrlR>
Scroll display up one page.
<PgDn>, <CtrlC>
Scroll display down one page.
<CtrlHome>, <CtrlQ><E>
Move cursor to top of edit window.
<CtrlEnd>, <CtrlQ><X>
Move cursor to bottom of edit window.
<CtrlPgUp>, <CtrlQ><R>
Move cursor to beginning of field.
<CtrlPgDn>, <CtrlQ><C>
Move cursor to end of field.
<Tab>, <CtrlI>
Move the cursor to the next tab stop.
<ClickLeft>
Move the cursor to the position indicated by the mouse.
DELETE FUNCTIONS:
<Del>, <CtrlG>
Delete character at cursor.
<Bksp>, <CtrlH>, <CtrlBksp>
Delete character to left of cursor.
<CtrlY>
Delete current line.
<CtrlQ><Y>
Delete from cursor to end of line.
<CtrlT>
Delete word to right of cursor.
NEW LINE:
<Enter>, <CtrlM>
Start a new line.
<CtrlN>
Split the current line at the cursor.
DEFAULT CONTROLS:
<CtrlP>
Insert control character. For example, to insert a ^G, you
would enter <CtrlP><CtrlG>.
<Ins>
Toggle insert mode on and off. Fat cursor indicates insert
mode; thin cursor indicates overtype mode.
<CtrlO><I>
Toggle auto-indent mode. In auto-indent mode, pressing
<Enter> in insert mode causes the new line to have the same
indentation as the previous line. Auto-indent also affects
the way that text is formatted when word wrap occurs.
<CtrlB>
Reformat the current paragraph. Use with caution.
<AltR>
Reformat the entire field. Use this command with caution.
<CtrlQ><L>
Restore original contents of the line and continue editing.
SAVE COMMANDS:
<Esc>, <CtrlBreak>, <ClickRight>, <CtrlK><Q>,
<AltF2>
Quit editing and abandon changes (With Question).
<F2>, <CtrlK><S>
Save the data, but continue editing.
<CtrlF2>, <CtrlK><X>, <CtrlK><D>, <AltX>
Save the data (if modified), and quit editing.
BLOCK COMMANDS:
<CtrlK><B>, <F7> <CtrlK><K>, <F8>
Begin a block mark. End a block mark.
<CtrlK><C> <CtrlK><V>
Copy a marked block. Move a marked block.
<CtrlK><Y> <F5>
Delete a marked block. Delete Contents of Entire field.
<CtrlK><U> <CtrlK><P>
Put marked block in buffer. Copy cUt buffer to Fieeld.
Allows moving data between records.
<CtrlK><W>
Write the Marked Block to the selected file name.
<CtrlK><R>
Read the selected file name into the edit field. You can
popup a file list and use a point and shoot select
SEARCH COMMANDS:
<CtrlQ><CtrlF>
Pops up a window for you to enter a string of text to search for.
The string remains valid across all records until it is changed with
another search function.
<CtrlQ><CtrlA>
Pops up a window for you to enter a string of text to search for,
then pops up a window for you to enter a string of text to replace
the search string with. You will be asked to confirm the
replacement. The strings remain valid across all records until it
is changed with another search function.
<CtrlL>
Repeats the last Search(/Replace) function without going through the
exercise of entering new strings.
MISCELLANEOUS COMMANDS:
<F1>, <ClickBoth>
Help. This command invokes the help routine for this topic
if it exists. Otherwise it does nothing.
<F6>
Pops up a key edit window to allow chaging all of the editor key
assignments.
<AltE>
Creates a "SET AUTOCON=<configuration name>" command for the
Autoexec field. If each Autoexec has the correct one, the name of
the boot configuration will be in the environment.
<AltF6>, <AltF7>, <AltF8>
Changes the keys assigned to change the colors used in the editor.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,94 @@
------------------- REGISTRATION ----------------------
Please support AutoCon!
Thank you for your support.
Remit To: Larry Weaver
P.O. Box 2639
Weaverville CA 96093-2639
---------------------------
You must check one registration option, and one disk option!
---------------------------
_
|_| AutoCon Standard registration ($15.00 -- no disk sent) $______
_
|_| AutoCon Site License and Registration (no disk sent)
$120.00 for the first 100 (or fewer) users or machines
100.00 for each additional 100 (or fewer) users or machines $______
---------------------------
_
|_| AutoCon Upgrade to the newest version ($8.00; $10.00 foreign) $______
Registered users only
_
|_| Subscription plan for REGISTERED users ($21.00; $26.00 foreign) $______
(Receive the next three updates of AutoCon, as they
become available. This fee is in addition to the
$15.00 or $120.00 registration.)
---------------------------
_
|_| Printed Manual ($8.00) $______
If you desire, I will print out the AUTOCON.DOC file and
send it to you. You can achieve the same results by printing
it out yourself, but several people seem to want this.
---------------------------
"Foreign" means outside the USA and Canada; the extra charge covers postage.
_ _
Payment by: |_| Check or |_| Money Order enclosed.
TOTAL in USA Funds. $______
Foreign checks are acceptable if they have the US Federal Reserve
Routing Number on them, use the current exchange rate.
_ _
Disk Type: |_| 5 1/4" (normally sent); |_| 3 1/2" required
Name ___________________________________________________________________
Address ___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
Day Phone: _________________________ Eve: ______________________
Compuserve ID: _____________________
_
Invoice Required |_| P. O. Number: ______________________
------------------------ User comments -------------------------
I acquired AutoCon V2.0g from
[ ] - Friend [ ] - Software product
[ ] - Computer Club [ ] - Computer Store
[ ] - Data Base Service [ ] - Support BBS
[ ] - Electronic BBS - Please give phone no. _____________
[ ] - Other (please specify) ___________________________
I would also appreciate any input you would care to provide
concerning AutoCon. If you have any ideas or comments which would
make AutoCon a better program, please let me know.
I value your comments!
Comments and/or suggestions:
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________

View File

@@ -0,0 +1,441 @@
Version 2.0g
I still had complaints about people seeing Echo Off in the Autoexec
Bat file, so now if you have a DOS higher than 3.2, it will start
with @Echo off.
If you are using DOS 5.0, A DOS=HIGH,NOUMB line will be appended to
the bottom of the Autoexec.bat file, and you will have to put a
DOS=LOW (and/ or a DOS=UMB) in the configurations you need them in.
Menu.Ctl will control the flags.
If you are using DRDOS, Menu.Ctl will now work with it as well as
MSDOS.
I've changed the way I load configurations, so you will be able to
run AutoCon with less memory, and there is no longer a 6K or 2K
limit on the Autoexec and Config fields.
Each configuration now has the names of the files that the field is
written to. (I've had several requests for this one.)
The help screen colors are now installable.
The MENU.CTL interface has been rewritten to show up more distinctly
when booting. I had several complaints that it was easy to miss.
It will now put up some distinctive boxex, and show up in color if
you have a color monitor. The colors are installable from AutoCon.
Each configuration now has the names of the files that the field is written
to. (I've had several requests for this one.)
You can tell AutoCon not to restore the screen on exit (eliminates the
need for AutoConx.exe.
Version 2.0e (mainly bug fix)
In Single mode if the Enviornment name wasn't set (AltE in the
editor) AutoCon could get the wrong cache 'Flush' information. This
is fixed, but I highly reccommend setting the Autocon Environment
variable if you are using Single mode.
If an external editor were being used, and the Autocon or Config
field size got too large, the AutoCon.Dat file could get messed up -
fixed.
Several people have complained that 4K and 2K is not large enough
for the Autoexec and Config fields, so I'm pushing the size up to 6K
and 4K. Please note that this adds 4K/configuration to AutoCon's
memory requirements.
There are two extra EXE files on the BBS. AutoCons.exe will still
use 4K and 2K for those needing the smaller memory requirements.
AutoConx.exe will not restore the screen when it exits. Try this if
you lose the cursor or the screen blanks out when you exit (I've had
two complaints about this).
Version 2.0d (bug fix)
If AutoCon followed an "ECHO OFF" and a "CLS" statement in a batch
file, the screen could get slightly messed up - fixed.
Version 2.0c (bug fix)
The user modified colors were getting lost if a reboot was performed
from the command line - fixed.
Version 2.0b (bug fix)
MENU.CTL had a problem with the name of the eighth configuration,
which is now fixed. It also had a tendency to leave menu choice 2
in the hi-lite mode, also fixed.
Several people complained about seeing the Errorlevel statements in
the AUTOEXEC.BAT during the boot process. AUTOEXEC.BAT files will
now start with ECHO OFF as the first statement if you choose the
MENU.CTL option.
Version 2.0 would allow you to choose more than the eight default
configurations. This is no longer allowed.
Version 2.0 had a problem writing the AUTOEXEC.BAT file for the Menu
mode if the Autoexec fields didn't end in a Carriage Return. This
is now fixed.
Version 2.0
I'm jumping the version number from 1.4 to 2.0 for this release.
The reason is that AutoCon's capability has changed so much in this
release that I think it warrants a Major revision number change.
The major change is the inclusion of two new files. These are
MENU.CTL and MENUNUM.COM. Menu.Ctl is a device driver that can
disable commands in the CONFIG.SYS file. MenuNum.Com is a file that
will ask the portion of Menu.Ctl that stays resident which
configuration was chosen, and set the DOS ERRORLEVEL to that number.
This allows setting up menu choices in the AUTOEXEC.BAT file to
match the choice made from the CONFIG.SYS file. Together these two
files allow you to choose a system configuration from a menu of
configurations during the boot process itself.
AutoCon will handle all of the interface details to these two
commands for you, and allow you to return to a "Normal" system
configuration in just a couple of keystrokes. This will allow you
to run programs like "Optimize" from Quarterdeck.
There is a pull-down menu system available on the main screen. Each
item on the menu has a context sensitive help entry. This should
make it very easy to get AutoCon up and running the first time, and
allow you to look up those commands you can't remember the
keystrokes for.
There are two new command line options. If you enter
AutoCon /<return>
on the command line, a window of your configurations will pop up
asking you to choose which configuration you wish to use to reboot
the system. This is equivalent to the "AutoCon <configuraion name>,
except that AutoCon lets you choose the name from a pick list.
The second new command is
AutoCon /@<configuration name>
where <configuration name> is the name shown on the main screen for
each configuration. If the name matches the configuration that was
used for the boot process, the DOS errorlevel will be set to 1. It
will be set to 0 otherwise. For this function to work correctly,
you need to boot up with Menu.Ctl, or assure that each Autoexec
field has the correct name assigned with a SET command. See the new
"Put Name in Environment" editor function defined below.
The internal editor has a few new capabilities. In order to access
most them you will have to edit your keystrokes (using the F6 key).
The block operations are no longer constrained to full lines. The
default keys for reformating were removed. You may reassign them.
"Search Function" (default assigned to ^Q^F) allows you to search
the text for a specified string of text. The string is active for
the entire AutoCon session, and will be the same across records.
"Search/Replace Function" (default assigned to ^Q^A) allows you to
search the text for a specified string of text, and relpace it
with another string of text. You will be asked to confirm the
replacement.
"Repeat Search Function" (default assigned to ^L) This will
repeat the last Search, or Search/Replace that was performed. The
informations is retained during the AutoCon session, and will be
the same across records.
"Install Editor Keys" (default assigned to F6) allows you to
change the editor keys during an edit session.
"Put Name in Environment" (default assigned to AltE) will put a
SET command in your edit field. This will guarantee that the
configuration you are editing has its name placed correctly in the
environment. AutoCon will use this name for various command line
functions.
"Change (Text - AltF6, Block - AltF7, Control Char - AltF8)
Attribute" will allow you to change the keys that call up the
editor color installation windows.
"View Last Dos Screen" (default assigned to AltV) allows you to
see the DOS screen as it was when AutoCOn was started. Could be
useful if the reason your changing a configuration is shown there.
By March 1, 1991 I will have a support BBS in place operating 24
hours a day. The number will be (916) 623 4455.
Version 1.4
One of the WhatsNews has to do with me, I am now a member of the ASP
(Association of ShareWare Professionals). The rest of the WhatsNews
all concern changes (and additions) to the program.
You now have the option to use the built in editor to edit the
Autoexec and Config fields, or to install an external editor to do
the job. <CtrlF6> will pop up a window for you to enter an external
editor's file name. The Path will be checked for the entered file
name, and if found, it will be used to edit the Autoexec and Config
fields in the future. For more info, see the "Installing External
Editor" section of AUTOCON.DOC.
From the command line, typing <AUTOCON /=> will check the Autoexec
and Config fields of the current configuration record against the
file contents of the current Configuration files (usually
C:\AUTOEXEC.BAT and C:\CONFIG.SYS). The results of the comparison
will be shown on the screen. SPECIAL NOTE! - the configuration will
need to have been saved with the 1.4 version of AUTOCON.
From the command line, typing <AUTOCON /*> will update the Autoexec
and Config fields of the current configuration record from the file
contents of the current Configuration files (usually C:\AUTOEXEC.BAT
and C:\CONFIG.SYS). You might want to be a little careful with this
one.
The internal editor has a few new capabilities. In order to access
them, you will probably have to edit your keystrokes (using the <F6>
key). The new commands are "Split Line", "Cut the marked block",
and "Paste the last Cut block". These commands will be a little
more convenient than the current "Write marked block" and "Read
marked block" file commands.
"Split Line" (default assigned to <CtrlN> key) splits the current
line at the cursor, leaving the cursor where it is, and moving the
rest of the line down to the next line.
"Cut the marked block" (default assigned to <CtrlK> <U> key
combination) will put the current marked block into a text buffer.
"Paste the last Cut block" (default assigned to <CtrlK> <P> key
combination) will paste the contents of the cut buffer to the
current cursor location. This command can be used to move the
data in the same record, or across records. After a cUt, the data
will stay in the buffer until a new cUt is performed, or AUTOCON
is exited.
Formerly the editor only recognized a ' ' (space) as a word mark
(for <CtrlF>, <CtrlA>, <CtrlRarw>, etc.). This has been enhanced
to also recognize the following characters as word marks :
'/', ';', and '='.
Line length was increased to 254 for those long path names (and
any other long lines needed). This necessitated removing the
word-wrap capability while editing the Autoexec and Config
fields (I don't think this will be a hardship, you probably don't
want to word-wrap the lines in your Autoexec and Config files
anyway). Word-wrap is still used in the Notes field, but please
don't enter a line longer than 127 characters in there.
A couple of functions were also added to the Interactive Mode.
<AltC> will pop-up a pick list of the current configuration
records, and allow you to select one. The contents of the
Autoexec and Config fields of the selected configuration record
will be copied to the current configuration record. Be careful
with this one, there is NO "Undo" command. You can always
use ESC to get out of the pick list without doing a copy.
<AltV> will now show the Dos screen as it was when Autocon was
started.
<Alt=> will check the Autoexec and Config fields of the current
configuration record against the contents of the current
configuration files (C:\AUTOEXEC.BAT and C:\CONFIG.SYS, unless you
have changed them with <F8> or <F9> keys). SPECIAL NOTE! - the
configuration will need to have been saved with the 1.4 version of
AUTOCON.
All of the color changes now show up instantly (you previously had
to wait till the next time Autocon was executed to see some of the
color changes).
ESC is no longer accepted as a "Yes" answer (there were a lot of
complaints on this one). A "Yes" answer now requires a <Y> or
<Enter> key (accept default).
There are a few cosmetic changes on the screens (all in response to
comments by users). I won't take the space to list each one.
There are a couple more entrys on the help screen, and (I hope) the
entries are arranged in a little more logical fashion.
UltraVision : Autocon is now UltraVision "Aware". Autocon will
detect if UltraVision is installed and active. If it is, Autocon
will use UltraVision to switch modes, and restore screens (in other
words, Autocon won't mess up your screen).
Windows Problems : After spending a very unproductive day on the
phone with Microsoft, I decided to add another boot type option to
Autocon. Several people use Autocon to reconfigure in and out of
Windows. When Windows is running in 386 enhanced mode, a software
boot (usually) doesn't work. Microsoft's recommendation : "Never
reboot while running Windows". They say that this may trash hard
disks and worse (I'm not sure what could be "worse" than trashing a
hard disk). I don't know about you, but I've had to reboot out of
Windows several times. I know it's probably not a good idea, but
there are times it should be quite safe (and times when it is forced
upon us). Anyway, they say that is no way they are aware of to
ensure that a software reboot will work.
Therefore :
You may now select (N)one as an alternate boot type (using the
<F5> key). If you select (N)one, Autocon will now reconfigure the
files, but will not attempt a reboot. Now you may run Autocon
under Windows, and after the system files are reconfigured, you
can hit the dreaded CtrlAltDel key combination.
By the way, I'm not much of an artist, so if someone (out of the
goodness of their hearts) designs a nice Icon for Autocon, I would
appreciate them sending me a copy.
A potentially nasty bug was squashed. Since I never received a
complaint on this one, I assume that I was the only one "bit". If
your current configuration record was the last one, and you deleted
it, Autocon tried to find it again the next time it was started.
This could lead to bizarre behavior (a messed up pointer for those
technical people). If the current record number is larger than the
max record number, it will now be adjusted (with appropriate warning
message). It will still be pointing to the wrong record, but it
will behave in a known fashion.
______________________________________________________________________
Version 1.3a
There are a few bug fixes, and a couple of enhancements in this
version. If you used F2 to save changes in the previous versions,
when you hit ESC to exit it would issue a warning that the changes
were about to be lost, this has been corrected.
AUTOCON will now attempt to detect and restore the EGA/VGA (45/50)
small character mode upon exit.
After updating the configuration with 1.3a, when AUTOCON is started
in the interactive mode, it will default to the configuration used
in the last update.
On the command line if you type <AUTOCON /?> the name of the current
configuration will be displayed (Note: you must have saved a
configuration with V1.3a first).
If you are in the full screen entry mode, hitting <F7> will update
the Autoexec and Config fields in the current record from the
current AUTOEXEC.BAT and CONFIG.SYS files. This saves going into
each of the two fields and doing a <F5> <^KR> <AltX>.
From the command line, typing AUTOCON followed by a / and the name
of a configuration (e.g. <AUTOCON /NoTSRs>) will cause that
configuration to have it's Autoexec and Config fields updated from
the current AUTOEXEC.BAT and CONFIG.SYS files.
There was a bug in V1.3 that caused AUTOCON to have a problem with
reading files that were not terminated with ^Z. If you got an
"Edit Buffer Full" message when you tried to edit a field that you
know wasn't too big, then you were bitten by this bug. This is
fixed in 1.3a.
If you were in one of the fields and issued an <^KW> (block save)
and didn't have a marked block, you were not given an error message
in previous versions. This is fixed in 1.3a.
The help screen displayed in a color change window was the one for
changing the editor keystrokes. This is fixed in 1.3a.
______________________________________________________________________
Version 1.3
There are several changes in this version. If you have added
several extra configurations that you no longer need, the <CtrlF3>
key will delete the current configuration (you can't delete record
one, nor can you go below five records).
You can change the keystrokes used by the built in editor. Hitting
the <F6> key in the main menu will pop up a key editor which will
allow changing the actions of all of the control keys used in the
editor.
You can change the colors used by AUTOCON. Hitting the <Alt> key in
combination with the function keys will allow customization of most
of the colors. The use of each key is detailed in the pop-up help.
The DAT file format for 1.3 is quite different than the one for 1.2.
The white space has been eliminated, and as a consequence it is
significantly smaller (mine are about 1/4 the previous size). The
first time you run 1.3 it will change the format, and the DAT file
will no longer be compatible with 1.2. You may want to make a copy
of AUTOCON.DAT (just to be on the safe side) before running 1.3.
______________________________________________________________________
Version 1.2d keeps current file attributes
A request was made to update the Autoexec and Config files, but to
not change their current attributes (system, read only, hidden,
etc.). Therefore AUTOCON now reads the current file attributes of
Autoexec.Bat and Config.Sys before updating them, and restores the
attributes after the update.
______________________________________________________________________
Version 1.2c adds a boot type select.
Some computers have trouble with the warm boot that AUTOCON was
originally configured with. These seem to mainly be machines with
large hard disks, and a large hard disk manager. The <F5> key now
allows you to change the boot type from warm to cold to get around
this problem.
______________________________________________________________________
Version 1.2a is a bug fix.
AUTOCON didn't recognize more than three configurations from the
command line.
Version 1.2 is a bug fix.
When you attempted to read in your old configuration files to the
AUTOEXEC and CONFIG fields, it always defaulted to C:\AUTOEXEC.BAT
an C:\CONFIG.SYS no matter what files you had selected. The read
file option now works correctly.
______________________________________________________________________
Version 1.1 charges are as follows.
1. AUTOCON now does a Reboot when a reconfiguration is done from the
command line.
2. AUTOCON now handles up to 50 configurations (originally only 5).
3. You can now read any file into an AUTOEXEC or CONFIG edit field
(allows you to use your old configurations).
4. The On-line Help has been updated/enhanced.
5. The Doc file has been enhanced (left out a few things the first
time).
6. Allows you the choice of a Reboot when reconfiguring in the data
entry mode.
7. Hopefully a better choice of colors on an LCD screen. If you have
an LCD, you need to have your mode set to BW80 (2).

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,3 @@
@echo This batch file uses Turbo C to build pfdisk.exe
@echo Note that only SMALL model has been tested...
tcc -v- -epfdisk.exe pfdiskaz.c syscodes.c s_msdos.c

View File

@@ -0,0 +1,264 @@
PFDISK(8) MAINTENANCE COMMANDS PFDISK(8)
NAME
pfdisk - partition fixed disk
SYNOPSIS
pfdisk device
DESCRIPTION
pfdisk partitions the fixed disk identified as device into (at
most) four parts, each of which may be independently loaded with
an operating system. The actual name of device depends on the
operating system in use. For ESIX (System V/386) the device
name is either "/dev/rdsk/0s0" or "/dev/rdsk/1s0". For Minix,
it is "/dev/hd0" or "/dev/hd5". For MS-DOS it is a single digit
(zero or one).
pfdisk reads the hard disk partition table from block zero of
device into memory and allows the user to examine, modify, or
save the partition table. A regular file may be used instead of
a real device for testing purposes, though the device geometry
must be specified manually, and some systems will requrire a
file-name argument with the "R" and "W" commands (DOS, ESIX).
The partition table on device is NOT modified unless the write
command (W) is used with no argument.
USAGE
Commands
All pfdisk commands consist of a command word followed by
optional blank-separated command arguments. Note that only the
first letter of a command word is significant (except for "wq"
and "q!"). All command letters are accepted in either upper or
lower case. Numeric arguments are specified using C syntax.
Extra arguments are silently ignored.
The commands are:
? Prints a command summary (help).
1 sys_id first last sys_name
Set the partition table entry for part one, using:
sys_id as its system ID code, first as the lowest num-
bered cylinder it uses, last as the highest numbered
cylinder it uses, and sys_name (optional) as the system
name (in the menu name table).
2|3|4 sys-id first last sys-name
Similar to 1 but sets partition two, three, or four,
respectively.
Release 1.3 Last change: Oct 1990 1
PFDISK(8) MAINTENANCE COMMANDS PFDISK(8)
A number
Mark partition number as active (so it will be used for
booting). If number is zero, no partition will be
active.
G cylinders heads sectors
Inform pfdisk what the geometry of the device is.
I Print a summary of the known ID codes.
L List the partition table. See Output Format below.
Q Quit without saving. If the memory copy of the parti-
tion table was modified, a warning will be issued and
the command ignored.
Q! Quit, even if the memory copy of the partition table was
not saved.
R file-name
Read boot sector from file-name (if given) otherwise
read from device.
W file-name
Write boot sector to file-name. (if given) otherwise
write to device.
WQ Same as "write" followed by "quit".
# This line is a comment (to be ignored).
Output Format
Here is a sample of the output from the L command:
# Partition table on device: /dev/rdsk/0s0
geometry 1222 15 34 (cyls heads sectors)
# ID First(cyl) Last(cyl) Name # start, length (sectors)
1 4 0 127 MS-LOSS # 34, 65246
2 129 128 255 Minix # 65280, 65280
3 0 0 0 # 0, 0
4 99 256 1220 ESIX # 130560, 492150
# note: last(4): phys=(1023,14,34) logical=(1220,14,34)
active: 4
This output format is carefully constructed so that it may be
saved in a file (by redirecting standard output) and later used
as input (by redirecting standard input). On a UNIX system, one
can save this output using the command:
Release 1.3 Last change: Oct 1990 2
PFDISK(8) MAINTENANCE COMMANDS PFDISK(8)
(echo L) | pfdisk device-name > save-file
save-file is a complete record of the partition table. On a
UNIX system, one could use save-file to re-initialize the parti-
tion table using the command:
(cat save-file ; echo wq) | pfdisk device-name
Consistency of each partition table entry is checked while the
table is listed. Any inconsistencies discovered are reported in
a commentary note as shown above.
Physical vs. Logical
Each partition table entry has both "physical" and a "logical"
fields. The physical fields specify the lowest and highest
cylinder,head,sector combinations to be used in that partition.
The logical start field has the total number of sectors which
precede this partition, and the logical length field has the
total number of sectors contained in this partition. These
fields should be self consistent unless the disk has more than
1024 cylinders.
The physical cylinder fields are only ten-bits wide so the con-
tents are limited to 1023. The logical sector fields are 32 bits
wide and always show the true logical beginning and length of
the partition. Generally, the physical start field is used only
to locate the secondary boot sector, and the logical start and
length fields are used to actually delimit the partition used by
a particular system.
Partition Names
The Name field in the partition table is treated specially if
the bootmenu program is installed in the primary boot sector.
(See the file bootmenu.doc for more information.) pfdisk can
recognize the name table used by bootmenu and will show the
actual names present in that name table. If any other boot pro-
gram is used then the Name field reflects the result of a
table-lookup of the system ID.
If you provide a name when setting any partition entry, the
boot-sector is marked as using a name table, so that on subse-
quent uses of pfdisk you will see the partition names you have
specified.
Boot program replacement
You can replace the boot program in your boot sector without
affecting the partition table by using pfdisk as follows.
First, (as always) save a copy of the current boot sector (on a
Release 1.3 Last change: Oct 1990 3
PFDISK(8) MAINTENANCE COMMANDS PFDISK(8)
floppy) using the "W file" command. Then, use the "R file" com-
mand to read the new boot program. If the boot program read in
is less than 446 bytes long, the partition table will be
unchanged.
Unlike the DOS or UNIX fdisk programs, pfdisk has NO boot pro-
gram compiled into its executable image. If you wish to use
pfdisk to partition a newly formatted hard disk, you must have a
boot program image available to read in using the "r file" com-
mand. Two boot programs, "bootmenu.bin" and "bootauto.bin" are
distributed with pfdisk and should be found with its source
files. See the file bootmenu.doc for further information about
these boot programs.
AUTHOR
Gordon W. Ross
Release 1.3 Last change: Oct 1990 4

Binary file not shown.

View File

@@ -0,0 +1,605 @@
/*
* pfdisk - Partition a Fixed DISK
* by Gordon W. Ross, Jan. 1990
*
* See the file "pfdisk.doc" for user instructions.
*
* This program uses a simple, line-oriented interpreter,
* designed for both interactive and non-interactive use.
* To facilitate non-interactive use, the output from the
* 'L' (list partitions) command is carefully arranged so it
* can be used directly as command input. Neat trick, eh?
*/
char *versionString =
"# pfdisk version 1.2.1 by Gordon W. Ross Aug. 1990\nModified by S. Lubkin Oct. 1991\n";
/* These don't really matter. The user is asked to set them. */
#define DEFAULT_CYLS 306
#define DEFAULT_HEADS 4
#define DEFAULT_SECTORS 17
#define PROMPT_STRING "pfdisk> "
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "sysdep.h"
#include "syscodes.h"
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
struct part { /* An entry in the partition table */
uchar active; /* active flag (0x80 or 0) */
uchar b_head; /* begin head */
uchar b_sec; /* sector */
uchar b_cyl; /* cylinder */
uchar sysid; /* system id (see sysid.c) */
uchar e_head; /* end head */
uchar e_sec; /* end sector */
uchar e_cyl; /* end cylinder */
/* These two are just longs, but this way is machine independent. */
/* uchar lsBeg[4]; /* logical sectors, beginning Saul */
ulong lsBeg; /* logical sectors, beginning Saul */
/* uchar lsLen[4]; /* logical sectors, length Saul */
ulong lsLen; /* logical sectors, length Saul */
};
#define LOC_PT 0x1BE
#define LOC_NT 0x1AA /* Saul */
/* #define LOC_NT 0x180 Saul */
/* #define LOC_GWR 0x1A0 Saul */
#define LOC_GWR 0x1A9 /* Saul */
#define MAGIC_LOC 0x1FE
#define MAGIC_0 0x55
#define MAGIC_1 0xAA
#define MAX_LINE 80
#define NT_ENTRY_SIZE 5 /* Saul */
/* Note: Entry in "printf" command, should be manually changed, to
"%-NT_ENTRY_SIZE.NT_ENTRY_SIZEs" Saul */
/* And header printf line should have blanks adjusted Saul */
char s[22]; /* For holding error string */
char buffer[SECSIZE]; /* The boot block buffer */
int bufmod=0; /* buffer modified... */
/* (zero means buffer is unmodified) */
int useNTable; /* boot sector uses name table */
/* device parameters (force someone to set them!) */
unsigned cyls = DEFAULT_CYLS;
unsigned heads = DEFAULT_HEADS;
unsigned sectors = DEFAULT_SECTORS;
char *devname; /* device name */
char cmdline[MAX_LINE];
char filename[80]; /* used by r/w commands */
char *prompt; /* null if no tty input */
/* Some of these strings are used in more than one place.
* For consistency, I put a newline on all of them.
*/
char h_h[] = "? <enter> : Help summary\n";
char h_l[] = "L : List partition table\n";
char h_1[] = "1 id first last [name]: set partition 1\n";
char h_2[] = "2,3,4 ... (like 1) : set respective partition\n";
char h_a[] = "A n [m, ...] : Activate partition(s) n [m, ...]\n";
char h_g[] = "G cyls heads sectors : set disk Geometry\n";
char h_i[] = "I : list known ID numbers\n";
char h_r[] = "R [optional-file] : Read device (or specified file)\n";
char h_w[] = "W [optional-file] : Write device (or specified file)\n";
char h_q[] = "Q[!] : Quit (! means force)\n";
char * helpTable[] = {
h_h, h_l, h_1, h_2, h_a, h_g, h_i, h_r, h_w, h_q,
"# (All command letters have lower-case equivalents.)\n",
(char *) 0 }; /* This MUST have a zero as the last element */
char *BadArg="Error: bad argument: %s\n";
char *WarnNotSaved =
"Warning, modified partition table not saved.\n";
help()
{
char ** p;
for (p = helpTable; *p; p++)
printf(*p);
}
/* forward declarations */
void checkValidity();
char * setPartition();
char * makeActive();
char * setGeometry();
ulong chs2long();
char * nameID();
int printIDs();
main(argc,argv)
int argc;
char *argv[];
{
char *cmdp; /* points to command word */
char *argp; /* points to command args */
/* check command line args (device name) */
if (argc != 2) {
usage(argv[0]); /* See s-sysname.c */
exit(1);
}
devname = argv[1];
/* Should we prompt? */
prompt = (isatty(fileno(stdin))) ? PROMPT_STRING : (char *) 0;
/* Print version name. */
fputs(versionString, stderr);
/* get disk parameters */
getGeometry(devname,&cyls,&heads,&sectors);
/* Get the boot block. */
if (getBBlk(devname, buffer) < 0)
fprintf(stderr,"%s: read failed\n", devname);
checkValidity();
if (prompt) fprintf(stderr,"For help, enter: '?'\n");
/* Read and process commands a line at a time. */
while (1) {
if (prompt) fputs(prompt,stdout);
if (! fgets(cmdline, MAX_LINE, stdin)) break;
/* Find beginning of command word */
cmdp = cmdline;
while (isspace(*cmdp)) cmdp++;
/* find beginning of args */
argp = cmdp;
while (*argp && !isspace(*argp)) argp++;
while (isspace(*argp) || *argp=='=') argp++;
switch (*cmdp) {
case '\0': /* blank line */
case '#': /* line comment */
break;
case '?': case 'h': case 'H':
help();
break;
case '1': /* set partition entry */
case '2': case '3': case '4':
argp = setPartition(cmdp, argp);
if (argp) { /* arg list error */
fprintf(stderr,BadArg,argp);
fprintf(stderr,h_1);
fprintf(stderr,h_2);
break;
}
bufmod = 1;
break;
case 'a': case 'A': /* activate partition */
argp = makeActive(argp);
if (argp) {
fprintf(stderr,BadArg,argp);
fprintf(stderr,h_a);
break;
}
bufmod = 1;
break;
case 'g': case 'G': /* set disk parameters (Geometry) */
argp = setGeometry(argp);
if (argp) { /* arg list error */
fprintf(stderr,BadArg,argp);
fprintf(stderr,h_g);
}
break;
case 'i': case 'I': /* List known ID numbers */
printIDs();
break;
case 'l': case 'L': /* List the partition table */
listPTable();
break;
case 'q': case 'Q': /* Quit */
if (bufmod && (cmdp[1] != '!')) {
fprintf(stderr,"\007%s%s\n", WarnNotSaved,
"Use 'wq' or 'q!' (enter ? for help).");
break;
}
exit(0);
/*NOTREACHED*/
case 'r': case 'R': /* read from device or file */
if (sscanf(argp,"%80s",filename) == 1) {
/* Arg specified, read from filename */
if (getFile(filename, buffer, SECSIZE) < 0)
fprintf(stderr,"%s: read failed\n", filename);
bufmod = 1;
} else {
/* No arg, use device. */
if (getBBlk(devname, buffer) < 0)
fprintf(stderr,"%s: read failed\n", devname);
bufmod = 0;
}
checkValidity();
break;
case 'w': case 'W': /* Write to file or device */
if (sscanf(argp,"%80s",filename) == 1) {
/* Arg specified, write to filename */
if (putFile(filename, buffer, SECSIZE) < 0)
fprintf(stderr, "%s: write failed\n", filename);
} else { /* No arg, use device. */
if (putBBlk(devname, buffer) < 0)
fprintf(stderr, "%s: write failed\n", devname);
bufmod = 0;
}
if (cmdp[1] == 'q' || cmdp[1] == 'Q') exit(0);
break;
default:
fprintf(stderr,"'%c': unrecognized. Enter '?' for help.\n", *cmdp);
break;
} /* switch */
} /* while */
if (bufmod) fprintf(stderr, WarnNotSaved);
exit(0);
} /* main */
/* Check for valid boot block (magic number in last two bytes).
* Also, check for presence of partition name table.
*/
void checkValidity()
{
/* Check the magic number. */
if ((buffer[MAGIC_LOC] & 0xFF) != MAGIC_0 ||
(buffer[MAGIC_LOC+1] & 0xFF) != MAGIC_1 ) {
/* The boot sector is not valid -- Fix it. */
buffer[MAGIC_LOC] = MAGIC_0;
buffer[MAGIC_LOC+1] = MAGIC_1;
bufmod = 1;
fprintf(stderr,
"\n\tWarning: The boot sector has an invalid magic number.\n\
\tThe magic number has been fixed, but the other contents\n\
\tare probably garbage. Initialize using the command:\n\
\t\tR boot-program-file (i.e. bootmenu.bin)\n\
\tthen set each partition entry if necessary.\n");
}
/* Does it use a name table (for a boot menu)?
* My boot program does, and can be identified by
* finding my name in a particular (unused) area.
*/
useNTable = ( buffer[LOC_GWR] == (char)0x3A ); /* Saul */
/* useNTable = !strcmp(&buffer[LOC_GWR], "Gordon W. Ross"); Saul */
}
char * setPartition(cmdp,argp) /* return string on error */
char *cmdp,*argp;
{
struct part *pp; /* partition entry */
char * np; /* name table pointer */
char tmpname[20];
char * newname = tmpname; /* name field */
int index; /* partition index (0..3) */
uint id; /* ID code (see syscodes.c) */
uint first,last; /* user supplied cylinders */
uint c,h,s; /* working cyl,head,sect, */
int i; /* returned by sscanf */
ulong lsbeg, lslen; /* logical begin, length */
/* Value check the index */
index = *cmdp - '1';
if (index < 0 || index > 3)
return("index");
pp = (struct part *) &buffer[LOC_PT + index * 16];
np = &buffer[LOC_NT + index * NT_ENTRY_SIZE]; /* Saul */
/* np = &buffer[LOC_NT + index * 8]; Saul */
/* Read System ID */
if ((i=sscanf(argp,"%d%d%d%s", &id, &first, &last, newname)) < 1)
return("id");
/* If ID==0, just clear out the entry and return. */
if (id == 0) {
strncpy( (char *) pp, "", 16);
if (useNTable) strncpy( np, "", NT_ENTRY_SIZE); /* Saul */
/* if (useNTable) strncpy( np, "", 8); Saul */
return((char *)0);
}
/* Read first and last cylinder */
if (i < 3)
return("first last (missing)");
/* Reasonable start,end cylinder numbers? */
if (first > last) return("first > last");
if (first > 1023) return("first > 1023");
if (last >= cyls) return("last >= cyls");
/* Get (optional) system name. */
if (i == 3) { /* no name given, use default */
newname = nameID(id);
}
else useNTable = 1;
/* Set the ID and name. */
pp->sysid = id;
if (useNTable) {
strncpy(np, newname, NT_ENTRY_SIZE); /* Saul */
/* strncpy(np, newname, 8); Saul */
/* strcpy(&buffer[LOC_GWR], "Gordon W. Ross"); Saul */
buffer[LOC_GWR] = (char)0x3A; /* Saul */
}
/* set beginning c,h,s */
c = first;
/* if c == 0, head == 1 (reserve track 0) */
h = (first) ? 0 : 1;
s = 1;
pp->b_cyl = c & 0xFF;
pp->b_head = h;
pp->b_sec = s | ((c >> 2) & 0xC0);
/* Set the logical sector begin field */
lsbeg = lslen = chs2long(c,h,s); /* using lslen as temp. */
/* pp->lsBeg[0] = lslen & 0xff; lslen >>= 8;
pp->lsBeg[1] = lslen & 0xff; lslen >>= 8;
pp->lsBeg[2] = lslen & 0xff; lslen >>= 8;
pp->lsBeg[3] = lslen & 0xff; lslen >>= 8; Saul */
pp->lsBeg = lslen; /* Saul */
/* set ending c,h,s (last may be larger than 1023) */
c = (last>1023) ? 1023 : last; /* limit c to 1023 */
h = heads - 1; s = sectors;
pp->e_cyl = c & 0xFF;
pp->e_head = h;
pp->e_sec = s | ((c >> 2) & 0xC0);
/* Set the logical sector length field (using REAL end cylinder) */
lslen = chs2long(last,h,s) + 1 - lsbeg;
/* pp->lsLen[0] = lslen & 0xff; lslen >>= 8;
pp->lsLen[1] = lslen & 0xff; lslen >>= 8;
pp->lsLen[2] = lslen & 0xff; lslen >>= 8;
pp->lsLen[3] = lslen & 0xff; lslen >>= 8; Saul */
pp->lsLen = lslen; /* Saul */
return((char *)0); /* success */
} /* setPartition() */
char * makeActive(argp) /* return error string or zero */
char *argp;
{
struct part *pp; /* partition entry */
int i,act1,act2,act3,act4,act5; /* which one becomes active */
act1=0;
act2=0;
act3=0;
act4=0;
if ((i=sscanf(argp,"%d%d%d%d%d", &act1, &act2, &act3, &act4, &act5)) < 1)
return("missing partition number");
if ( i > 4)
return("at most four partition numbers");
act1--; /* make it zero-origin */
act2--; /* make it zero-origin */
act3--; /* make it zero-origin */
act4--; /* make it zero-origin */
i=0; pp = (struct part *) &buffer[LOC_PT];
while (i<4) {
if (pp->sysid == 0 && (i == act1|| i == act2 || i == act3 || i == act4)) {
sprintf(s, "partition %d empty", i+1);
return(s);
}
i++; pp++;
}
i=0; pp -= 4;
while (i<4) {
if (i == act1|| i == act2 || i == act3 || i == act4)
pp->active = 0x80;
else
pp->active = 0;
i++; pp++;
}
return((char *)0);
}
char * setGeometry(argp) /* return string on error */
char *argp;
{
int c,h,s;
if (sscanf(argp,"%d%d%d", &c, &h, &s) < 3)
return("(missing)");
if (c<1) return("cyls");
if (h<1) return("heads");
if (s<1) return("sectors");
cyls=c; heads=h; sectors=s;
return((char *)0);
}
listPTable() /* print out partition table */
{
struct part * pp; /* partition table entry */
char *name;
int i; /* partition number */
/* int numActive=0; /* active partition [1-4], 0==none */
char Active[20]; /* active partitions [1-4], 0==none */
uint pbc,pbh,pbs; /* physical beginning c,h,s */
uint pec,peh,pes; /* physical ending c,h,s */
uint lbc,lbh,lbs; /* logical beginning c,h,s */
uint lec,leh,les; /* logical ending c,h,s */
ulong lsbeg,lslen; /* logical sectors: begin, length */
strcpy(Active, "active:");
printf("# Partition table on device: %s\n", devname);
printf("geometry %d %d %d (cyls heads sectors)\n",
cyls, heads, sectors);
/* printf("# ID First(cyl) Last(cyl) Name "); Saul */
printf("# ID First(cyl) Last(cyl) Name "); /* Saul */
printf("# start, length (sectors)\n");
for (i=0; i<4; i++) {
pp = (struct part *) &buffer[LOC_PT + i * 16];
if (pp->active) {
char s[3];
sprintf(s, " %d", i+1);
strcat(Active,s);
if (pp->active != 0x80)
fprintf(stderr, "Warning: Partition %d is active, with the illegal activity byte %d.\nCorrect with the \"A\" command.\n", i+1, pp->active);
/* if(numActive)
fprintf(stderr,"Error: multiple active partitions.\n");
else numActive = i+1; */
}
/* physical beginning c,h,s */
pbc = pp->b_cyl & 0xff | (pp->b_sec << 2) & 0x300;
pbh = pp->b_head;
pbs = pp->b_sec & 0x3F;
/* physical ending c,h,s */
pec = pp->e_cyl & 0xff | (pp->e_sec << 2) & 0x300;
peh = pp->e_head;
pes = pp->e_sec & 0x3F;
/* compute logical beginning (c,h,s) */
/* lsbeg = ((((((pp->lsBeg[3] ) << 8 )
| pp->lsBeg[2] ) << 8 )
| pp->lsBeg[1] ) << 8 )
| pp->lsBeg[0] ; Saul */
lsbeg = pp->lsBeg; /* Saul */
long2chs(lsbeg, &lbc, &lbh, &lbs);
/* compute logical ending (c,h,s) */
/* lslen = ((((((pp->lsLen[3]) << 8 )
| pp->lsLen[2]) << 8 )
| pp->lsLen[1]) << 8 )
| pp->lsLen[0] ; Saul */
lslen = pp->lsLen; /* Saul*/
/* keep beginning <= end ... */
if (lslen > 0) long2chs(lsbeg+lslen-1, &lec, &leh, &les);
else long2chs(lsbeg, &lec, &leh, &les);
if (useNTable)
name = &buffer[LOC_NT + i * NT_ENTRY_SIZE ]; /* Saul */
/* name = &buffer[LOC_NT + i * 8]; Saul */
else
name = nameID((uint) pp->sysid);
/* show physical begin, logical end (works for cyl>1023) */
/* # ID First(cyl) Last(cyl) Name... # ... */
/* printf("%d %3d %4d %4d %-8.8s # %ld, %ld\n", Saul */
printf("%d %3d %4d %4d %-5.5s # %ld, %ld\n", /* Saul */
i+1, pp->sysid, pbc, lec, name, lsbeg, lslen );
/* That's all, for an empty partition. */
if (pp->sysid == 0) continue;
/*
* Now do some consistency checks...
*/
/* Same physical / logical beginning? */
if (pbc != lbc || pbh != lbh || pbs != lbs ) {
printf("# note: first(%d): ", i+1);
printf("phys=(%d,%d,%d) ", pbc, pbh, pbs);
printf("logical=(%d,%d,%d)\n",lbc, lbh, lbs);
}
/* Same physical / logical ending? */
if (pec != lec || peh != leh || pes != les ) {
printf("# note: last(%d): ", i+1);
printf("phys=(%d,%d,%d) ", pec, peh, pes);
printf("logical=(%d,%d,%d)\n",lec, leh, les);
}
/* Beginning on cylinder boundary? */
if (pbc == 0) { /* exception: start on head 1 */
if (pbh != 1 || pbs != 1) {
printf("# note: first(%i): ", i+1);
printf("phys=(%d,%d,%d) ", pbc, pbh, pbs);
printf("should be (%d,1,1)\n", pbc);
}
} else { /* not on cyl 0 */
if (pbh != 0 || pbs != 1) {
printf("# note: first(%i): ", i+1);
printf("phys=(%d,%d,%d) ", pbc, pbh, pbs);
printf("should be (%d,0,1)\n", pbc);
}
}
/* Ending on cylinder boundary? */
if (peh != (heads-1) || pes != sectors) {
printf("# note: last(%i): ", i+1);
printf("phys=(%d,%d,%d) ", pec, peh, pes);
printf("should be (%d,%d,%d)\n",
pec, heads-1, sectors);
}
} /* for */
if ( !Active[7] ) /* No active partitions */
strcat(Active, " 0 (none)");
strcat(Active, "\n");
printf(Active);
/* printf("active: %d %s\n", numActive,
(numActive) ? "" : "(none)"); */
} /* listPTable() */
ulong chs2long(c,h,s)
uint c,h,s;
{
ulong l;
if (s<1) s=1;
l = c; l *= heads;
l += h; l *= sectors;
l += (s - 1);
return(l);
}
long2chs(ls, c, h, s) /* convert logical sec-num to c,h,s */
ulong ls; /* Logical Sector number */
uint *c,*h,*s; /* cyl, head, sector */
{
int spc = heads * sectors;
*c = ls / spc;
ls = ls % spc;
*h = ls / sectors;
*s = ls % sectors + 1; /* sectors count from 1 */
}
char * nameID(n)
unsigned int n;
{
struct intString *is;
is = sysCodes;
while (is->i) {
if (is->i == n) return(is->s);
is++;
}
if (!n) return(is->s);
return("unknown");
}
int printIDs() /* print the known system IDs */
{
struct intString * is = sysCodes;
/* This might need to do more processing eventually, i.e.
* if (prompt) { ... do more processing ... }
*/
printf("_ID_\t__Name__ ____Description____\n");
while (is->i) {
printf("%3d\t%s\n", is->i, is->s);
is++;
}
}

View File

@@ -0,0 +1,43 @@
/* This file holds all knowledge of partition ID codes.
* Thanks to leendert@cs.vu.nl (Leendert van Doorn) for
* collecting most of this information.
*/
#define extern
#include "syscodes.h"
#undef extern
/* Note that my boot program menu can only use the first 8 characters
* of these names. The colon in the nineth position shows where the
* first truncated char is. (There's not much room in the bootblock!)
* changed sysCodes[] below, adding SIZE tms */
struct intString sysCodes[SIZE] = {
{ 0x01, "DOS12 :12-bit FAT" },
{ 0x02, "XENIX :root" },
{ 0x03, "XENIX :usr" },
{ 0x04, "DOS16 :16-bit FAT" },
{ 0x05, "DOSex :DOS 3.3 extended volume" },
{ 0x06, "DOSbi :DOS 4.0 large volume" },
{ 0x07, "OS/2 :OS/2 (or QNX or Adv. UNIX...)" },
{ 0x08, "AIX :file system" },
{ 0x09, "AIXbt:boot partition" },
{ 0x10, "OPUS :?" },
{ 0x40, "VENIX :Venix 80286" },
{ 0x51, "NOVEL :?" },
{ 0x52, "CPM :?" },
{ 0x63, "UNIX :System V/386" },
{ 0x64, "NOVEL :?" },
{ 0x75, "PC/IX :?" },
{ 0x80, "Minix :Minix (ver. 1.4a and earlier)" },
{ 0x81, "Minix :Minix (ver. 1.4b and later)" },
{ 0x93, "Ameba :Amoeba file system" },
{ 0x94, "Ameba :Amoeba bad block table?" },
{ 0xDB, "C.DOS :Concurrent DOS" },
/* { 0xF2, "DOS-2nd :DOS 3.3+ second partition" }, */
/* { 0xFF, "BAD-TRK :Bad track table?" }, */
/* Make sure this is last! */
{ 0, "empty" }
};

View File

@@ -0,0 +1,4 @@
#define SIZE 40 /* added tms */
struct intString { unsigned int i; char * s; };
extern struct intString sysCodes[SIZE]; /* was sysCodes[] modified tms */

View File

@@ -0,0 +1,22 @@
/* communicate declarations from the files: s_*.c */
#define SECSIZE 0x200
extern int usage(); /* print a usage message */
/* (char *progname) */
extern void getGeometry(); /* determine disk parameters */
/* (char *dev, uint *cyls, uint *heads, uint *sectors) */
extern int getFile(); /* open, read, close, return(num-read) */
/* (char *name, char *buf, int len) */
extern int putFile(); /* open, write, close, return(num-writen) */
/* (char *name, char *buf, int len) */
extern int getBBlk(); /* open, read, close, return(num-read) */
/* (char *dev, char *buf) */
extern int putBBlk(); /* open, write, close, return(num-writen) */
/* (char *dev, char *buf) */

View File

@@ -0,0 +1,163 @@
/* This file contains system-specific functions for MS-DOS.
* The program pfdisk.c calls these routines.
*/
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dos.h>
#define extern
#include "sysdep.h"
#undef extern
int usage(prog) /* print a usage message */
char *prog; /* program name */
{
fprintf(stderr,"Usage: %s <disk>\n", prog);
fprintf(stderr,"\twhere <disk> is a digit [0-9]\n");
}
void getGeometry(name, c, h, s)
char *name; /* device name */
unsigned *c,*h,*s; /* cyls, heads, sectors */
{
int dev; /* hard disk number */
union REGS regs;
struct SREGS sregs;
if (name[0] < '0' ||
name[0] > '9' ||
name[1] != 0 )
{
fprintf(stderr,"%s: device name must be a digit\n", name);
return;
}
dev = (name[0] - '0');
regs.h.ah = 8; /* get param. */
regs.h.dl = dev | 0x80;
int86x(0x13,&regs,&regs,&sregs);
/* Are that many drives responding? */
if (regs.h.dl <= dev ) {
fprintf(stderr,"%s: drive not found\n", name);
return;
}
if (regs.x.cflag) {
fprintf(stderr,"%s: can't get disk parameters\n", name);
return;
}
*c = ((((int) regs.h.cl << 2) & 0x300) | regs.h.ch) + 1;
*h = regs.h.dh + 1;
*s = regs.h.cl & 0x3F;
}
int getFile(name, buf, len) /* read file into buffer */
char *name, *buf;
int len;
{ /* (open, read, close) */
int devfd, retval;
devfd = open(name, O_RDONLY|O_BINARY, 0);
if (devfd < 0) {
fprintf(stderr,"%s: can't open for reading\n", name);
return(devfd);
}
retval = read(devfd, buf, len);
if (retval < 0)
fprintf(stderr,"%s: read failed\n", name);
close(devfd);
return(retval);
}
int putFile(name, buf, len) /* write buffer to file */
char *name, *buf;
int len;
{ /* (open, write, close) */
int devfd, retval;
devfd = open(name,
O_WRONLY|O_CREAT|O_BINARY,
S_IREAD|S_IWRITE ); /* stupid DOS... */
if (devfd < 0) {
fprintf(stderr,"%s: can't open for writing\n", name);
return(devfd);
}
retval = write(devfd, buf, len);
if (retval < 0)
fprintf(stderr,"%s: write failed\n", name);
close(devfd);
return(retval);
}
int getBBlk(name, buf) /* read boot block into buffer */
char *name, *buf;
{ /* BIOS absolute disk read */
int dev;
union REGS regs;
struct SREGS sregs;
if (name[0] < '0' ||
name[0] > '9' ||
name[1] != 0 )
{
fprintf(stderr,"%s: device name must be a digit\n",name);
return(-1);
}
dev = (name[0] - '0');
segread(&sregs); /* get ds */
sregs.es = sregs.ds; /* buffer address */
regs.x.bx = (int) buf;
regs.h.ah = 2; /* read */
regs.h.al = 1; /* sector count */
regs.h.ch = 0; /* track */
regs.h.cl = 1; /* start sector */
regs.h.dh = 0; /* head */
regs.h.dl = dev|0x80; /* drive */
int86x(0x13,&regs,&regs,&sregs);
if (regs.x.cflag) {
fprintf(stderr,"%s: read failed\n", name);
return(-1);
}
return(SECSIZE);
}
int putBBlk(name, buf) /* write buffer to boot block */
char *name, *buf;
{ /* BIOS absolute disk write */
int dev;
union REGS regs;
struct SREGS sregs;
if (name[0] < '0' ||
name[0] > '9' ||
name[1] != 0 )
{
fprintf(stderr,"%s: device name must be a digit\n", name);
return(-1);
}
dev = (name[0] - '0');
segread(&sregs); /* get ds */
sregs.es = sregs.ds; /* buffer address */
regs.x.bx = (int) buf;
regs.h.ah = 3; /* write */
regs.h.al = 1; /* sector count */
regs.h.ch = 0; /* track */
regs.h.cl = 1; /* start sector */
regs.h.dh = 0; /* head */
regs.h.dl = dev|0x80; /* drive */
int86x(0x13,&regs,&regs,&sregs);
if (regs.x.cflag) {
fprintf(stderr,"%s: write failed\n",name);
return(-1);
}
return(SECSIZE);
}

Binary file not shown.

View File

@@ -0,0 +1,182 @@
/*
rawrite.c Write a binary image to a 360K diskette.
By Mark Becker
Usage:
MS-DOS prompt> RAWRITE
And follow the prompts.
History
-------
1.0 - Initial release
1.1 - Beta test (fixing bugs) 4/5/91
Some BIOS's don't like full-track writes.
1.101 - Last beta release. 4/8/91
Fixed BIOS full-track write by only
writing 3 sectors at a time.
1.2 - Final code and documentation clean-ups. 4/9/91
*/
#include <alloc.h>
#include <bios.h>
#include <ctype.h>
#include <dir.h>
#include <dos.h>
#include <io.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE (!FALSE)
#define SECTORSIZE 512
#define RESET 0
#define LAST 1
#define READ 2
#define WRITE 3
#define VERIFY 4
#define FORMAT 5
int done;
/*
Catch ^C and ^Break.
*/
int handler(void)
{
done = TRUE;
return(0);
}
void msg(char (*s))
{
fprintf(stderr, "%s\n", s);
_exit(1);
}
/*
Identify the error code with a real error message.
*/
void Error(int (status))
{
switch (status) {
case 0x00: msg("Operation Successful"); break;
case 0x01: msg("Bad command"); break;
case 0x02: msg("Address mark not found"); break;
case 0x03: msg("Attempt to write on write-protected disk"); break;
case 0x04: msg("Sector not found"); break;
case 0x05: msg("Reset failed (hard disk)"); break;
case 0x06: msg("Disk changed since last operation"); break;
case 0x07: msg("Drive parameter activity failed"); break;
case 0x08: msg("DMA overrun"); break;
case 0x09: msg("Attempt to DMA across 64K boundary"); break;
case 0x0A: msg("Bad sector detected"); break;
case 0x0B: msg("Bad track detected"); break;
case 0x0C: msg("Unsupported track"); break;
case 0x10: msg("Bad CRC/ECC on disk read"); break;
case 0x11: msg("CRC/ECC corrected data error"); break;
case 0x20: msg("Controller has failed"); break;
case 0x40: msg("Seek operation failed"); break;
case 0x80: msg("Attachment failed to respond"); break;
case 0xAA: msg("Drive not ready (hard disk only"); break;
case 0xBB: msg("Undefined error occurred (hard disk only)"); break;
case 0xCC: msg("Write fault occurred"); break;
case 0xE0: msg("Status error"); break;
case 0xFF: msg("Sense operation failed"); break;
}
_exit(1);
}
/*
Identify what kind of diskette is installed in the specified drive.
Return the number of sectors per track assumed as follows:
9 - 360 K and 720 K 5.25".
15 - 1.2 M HD 5.25".
18 - 1.44 M 3.5".
*/
int nsects(int (drive))
{
static int nsect[] = {18, 15, 9};
char *buffer;
int i, status;
/*
Read sector 1, head 0, track 0 to get the BIOS running.
*/
buffer = (char *)malloc(SECTORSIZE);
biosdisk(RESET, drive, 0, 0, 0, 0, buffer);
status = biosdisk(READ, drive, 0, 10, 1, 1, buffer);
if (status == 0x06) /* Door signal change? */
status = biosdisk(READ, drive, 0, 0, 1, 1, buffer);
for (i=0; i < sizeof(nsect)/sizeof(int); ++i) {
biosdisk(RESET, drive, 0, 0, 0, 0, buffer);
status = biosdisk(READ, drive, 0, 0, nsect[i], 1, buffer);
if (status == 0x06)
status = biosdisk(READ, drive, 0, 0, nsect[i], 1, buffer);
if (status == 0x00) break;
}
if (i == sizeof(nsect)/sizeof(int)) {
msg("Can't figure out how many sectors/track for this diskette.");
}
free(buffer);
return(nsect[i]);
}
void main(void)
{
char fname[MAXPATH];
char *buffer, *pbuf;
int count, fdin, drive, head, track, status, spt, buflength, ns;
puts("RaWrite 1.2 - Write disk file to raw floppy diskette\n");
ctrlbrk(handler);
printf("Enter source file name: ");
scanf("%s", fname);
_fmode = O_BINARY;
if ((fdin = open(fname, O_RDONLY)) <= 0) {
perror(fname);
exit(1);
}
printf("Enter destination drive: ");
scanf("%s", fname);
drive = fname[0];
drive = (islower(drive) ? toupper(drive) : drive) - 'A';
printf("Please insert a formatted diskette into ");
printf("drive %c: and press -ENTER- :", drive + 'A');
while (bioskey(1) == 0) ; /* Wait... */
if ((bioskey(0) & 0x7F) == 3) exit(1); /* Check for ^C */
putchar('\n');
done = FALSE;
/*
* Determine number of sectors per track and allocate buffers.
*/
spt = nsects(drive);
buflength = spt * SECTORSIZE;
buffer = (char *)malloc(buflength);
printf("Number of sectors per track for this disk is %d\n", spt);
printf("Writing image to drive %c:. Press ^C to abort.\n", drive+'A');
/*
* Start writing data to diskette until there is no more data to write.
*/
head = track = 0;
while ((count = read(fdin, buffer, buflength)) > 0 && !done) {
pbuf = buffer;
for (ns = 1; count > 0 && !done; ns+=3) {
printf("Track: %02d Head: %2d Sector: %2d\r", track, head, ns);
status = biosdisk(WRITE, drive, head, track, ns, 3, pbuf);
if (status != 0) Error(status);
count -= (3*SECTORSIZE);
pbuf += (3*SECTORSIZE);
}
if ((head = (head + 1) & 1) == 0) ++track;
}
if (eof(fdin)) {
printf("\nDone.\n");
biosdisk(2, drive, 0, 0, 1, 1, buffer); /* Retract head */
}
} /* end main */

View File

@@ -0,0 +1,86 @@
RaWrite 1.2
-----------
Purpose
-------
Write a disk image file to a 360K floppy disk.
Equipment/Software Requirements
-------------------------------
PC/XT/AT with a floppy disk drive capable of reading and writing a 360K
diskette.
This program uses generic low-level BIOS diskette read/write functions. It
should be portable to nearly every PC in existance. PS/2's should be able
to run RawWrite but this has not been tested.
CAVEAT
------
This program will write ANY disk file to a floppy, overwriting any previous
information that may have been present. If you wish to re-use a diskette
under MS-DOS thats been written to by RawWrite then the disk will need to be
reformatted; all MS-DOS specific information will have been erased.
How to Compile
--------------
TCC rawrite.c
The source code is specific to Borland International's Turbo C 2.01 and has
been tested in all memory models.
Usage
-----
C> RAWRITE
And follow the prompts. All arguments are case-insensitive.
A sample run is shown below. The disk file being written, in this example,
is named DEMODISK and the destination - where the image is being written -
is the B: drive.
This program may be aborted at any time by typing ^C.
Sample Run
----------
C> RAWRITE
RaWrite 1.2 - Write disk file to raw floppy diskette
Enter source file name: DEMODISK
Enter destination drive: B
Please insert a formatted 360K diskette into drive B: and press -ENTER- :
Writing image to drive B:
Errors
------
RaWrite attempts to determine if the diskette is a 360K, 720K, 1.2M, or
1.44M diskette by reading specific sectors. If the inserted diskette is not
one of the mentioned types, then RaWrite will abort with a short error
message.
Errors such as write protect, door open, bad disk, bad sector, etc. cause a
program abort with a short error message.
History
-------
1.0 - Initial release
1.1 - Beta test (fixing bugs) 4/5/91
Some BIOS's don't like full-track writes.
1.101 - Last beta release. 4/8/91
Fixed BIOS full-track write by only only
writing 3 sectors at a time.
1.2 - Final code and documentation clean-ups. 4/9/91

Binary file not shown.