mirror of
https://github.com/microsoft/MS-DOS
synced 2025-02-23 19:52:16 +08:00
MZ is back!
This commit is contained in:
parent
8ee9712c74
commit
2d04cacc53
@ -1,10 +1,11 @@
|
|||||||
<img width="150" height="150" align="left" style="float: left; margin: 0 10px 0 0;" alt="MS-DOS logo" src="https://github.com/Microsoft/MS-DOS/blob/main/.readmes/msdos-logo.png">
|
<img width="150" height="150" align="left" style="float: left; margin: 0 10px 0 0;" alt="MS-DOS logo" src="https://github.com/Microsoft/MS-DOS/blob/main/.readmes/msdos-logo.png">
|
||||||
|
|
||||||
# MS-DOS v1.25 and v2.0 Source Code
|
# MS-DOS v1.25, v2.0, v4.0 Source Code
|
||||||
|
|
||||||
This repo contains the original source-code and compiled binaries for MS-DOS v1.25 and MS-DOS v2.0.
|
This repo contains the original source-code and compiled binaries for MS-DOS v1.25 and MS-DOS v2.0, plus the source-code for MS-DOS v4.00 jointly developed by IBM and
|
||||||
|
Microsoft.
|
||||||
|
|
||||||
These are the same files [originally shared at the Computer History Museum on March 25th, 2014]( http://www.computerhistory.org/atchm/microsoft-ms-dos-early-source-code/) and are being (re)published in this repo to make them easier to find, reference-to in external writing and works, and to allow exploration and experimentation for those interested in early PC Operating Systems.
|
The MS-DOS v1.25 and v2.0 files [were originally shared at the Computer History Museum on March 25th, 2014]( http://www.computerhistory.org/atchm/microsoft-ms-dos-early-source-code/) and are being (re)published in this repo to make them easier to find, reference-to in external writing and works, and to allow exploration and experimentation for those interested in early PC Operating Systems.
|
||||||
|
|
||||||
# License
|
# License
|
||||||
|
|
||||||
|
BIN
v4.0-ozzie/Multitasking DOS BETA - 286 Compatability.pdf
Normal file
BIN
v4.0-ozzie/Multitasking DOS BETA - 286 Compatability.pdf
Normal file
Binary file not shown.
BIN
v4.0-ozzie/Multitasking DOS BETA - Command Guide.pdf
Normal file
BIN
v4.0-ozzie/Multitasking DOS BETA - Command Guide.pdf
Normal file
Binary file not shown.
BIN
v4.0-ozzie/Multitasking DOS BETA - Device Drivers.pdf
Normal file
BIN
v4.0-ozzie/Multitasking DOS BETA - Device Drivers.pdf
Normal file
Binary file not shown.
BIN
v4.0-ozzie/Multitasking DOS BETA - Dynamic Linking.pdf
Normal file
BIN
v4.0-ozzie/Multitasking DOS BETA - Dynamic Linking.pdf
Normal file
Binary file not shown.
BIN
v4.0-ozzie/Multitasking DOS BETA - Intro.pdf
Normal file
BIN
v4.0-ozzie/Multitasking DOS BETA - Intro.pdf
Normal file
Binary file not shown.
BIN
v4.0-ozzie/Multitasking DOS BETA - Memory Management.pdf
Normal file
BIN
v4.0-ozzie/Multitasking DOS BETA - Memory Management.pdf
Normal file
Binary file not shown.
BIN
v4.0-ozzie/Multitasking DOS BETA - Overview.pdf
Normal file
BIN
v4.0-ozzie/Multitasking DOS BETA - Overview.pdf
Normal file
Binary file not shown.
BIN
v4.0-ozzie/Multitasking DOS BETA - Release Notes.pdf
Normal file
BIN
v4.0-ozzie/Multitasking DOS BETA - Release Notes.pdf
Normal file
Binary file not shown.
BIN
v4.0-ozzie/Multitasking DOS BETA - Session Manager.pdf
Normal file
BIN
v4.0-ozzie/Multitasking DOS BETA - Session Manager.pdf
Normal file
Binary file not shown.
BIN
v4.0-ozzie/Multitasking DOS BETA - System Calls.pdf
Normal file
BIN
v4.0-ozzie/Multitasking DOS BETA - System Calls.pdf
Normal file
Binary file not shown.
BIN
v4.0-ozzie/Multitasking DOS BETA - Welcome Beta Site Letter.pdf
Normal file
BIN
v4.0-ozzie/Multitasking DOS BETA - Welcome Beta Site Letter.pdf
Normal file
Binary file not shown.
BIN
v4.0-ozzie/Multitasking DOS BETA - Welcome OEMs Letter.pdf
Normal file
BIN
v4.0-ozzie/Multitasking DOS BETA - Welcome OEMs Letter.pdf
Normal file
Binary file not shown.
5
v4.0-ozzie/bin/DISK1/AUTOEXEC.BAT
Normal file
5
v4.0-ozzie/bin/DISK1/AUTOEXEC.BAT
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
date
|
||||||
|
time
|
||||||
|
prompt $p$g
|
||||||
|
path a:\bin;a:\
|
||||||
|
|
BIN
v4.0-ozzie/bin/DISK1/BIN/ARENA.EXE
Normal file
BIN
v4.0-ozzie/bin/DISK1/BIN/ARENA.EXE
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DISK1/BIN/BBSET.EXE
Normal file
BIN
v4.0-ozzie/bin/DISK1/BIN/BBSET.EXE
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DISK1/BIN/CHKDSK.EXE
Normal file
BIN
v4.0-ozzie/bin/DISK1/BIN/CHKDSK.EXE
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DISK1/BIN/COUNTDOW.EXE
Normal file
BIN
v4.0-ozzie/bin/DISK1/BIN/COUNTDOW.EXE
Normal file
Binary file not shown.
3
v4.0-ozzie/bin/DISK1/BIN/DEMO1.BAT
Normal file
3
v4.0-ozzie/bin/DISK1/BIN/DEMO1.BAT
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
cd bin
|
||||||
|
pound 290 a:bbset.exe a:sm.exe
|
||||||
|
|
4
v4.0-ozzie/bin/DISK1/BIN/DEMO2.BAT
Normal file
4
v4.0-ozzie/bin/DISK1/BIN/DEMO2.BAT
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
c:
|
||||||
|
cd \bin
|
||||||
|
pound 800 bbset.exe sm.exe
|
||||||
|
|
7
v4.0-ozzie/bin/DISK1/BIN/DEMO3.BAT
Normal file
7
v4.0-ozzie/bin/DISK1/BIN/DEMO3.BAT
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
c:
|
||||||
|
cd \bin
|
||||||
|
cd a:\bin
|
||||||
|
detach pound 800 bbset.exe sm.exe
|
||||||
|
detach pound 290 a:bbset.exe a:sm.exe
|
||||||
|
basica a:prime
|
||||||
|
|
BIN
v4.0-ozzie/bin/DISK1/BIN/DETACH.EXE
Normal file
BIN
v4.0-ozzie/bin/DISK1/BIN/DETACH.EXE
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DISK1/BIN/HE_DAEM.EXE
Normal file
BIN
v4.0-ozzie/bin/DISK1/BIN/HE_DAEM.EXE
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DISK1/BIN/KILL.EXE
Normal file
BIN
v4.0-ozzie/bin/DISK1/BIN/KILL.EXE
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DISK1/BIN/POUND.EXE
Normal file
BIN
v4.0-ozzie/bin/DISK1/BIN/POUND.EXE
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DISK1/BIN/PRIME.BAS
Normal file
BIN
v4.0-ozzie/bin/DISK1/BIN/PRIME.BAS
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DISK1/BIN/SLEEP.EXE
Normal file
BIN
v4.0-ozzie/bin/DISK1/BIN/SLEEP.EXE
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DISK1/BIN/SM.EXE
Normal file
BIN
v4.0-ozzie/bin/DISK1/BIN/SM.EXE
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DISK1/BIN/TEXT.EXE
Normal file
BIN
v4.0-ozzie/bin/DISK1/BIN/TEXT.EXE
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DISK1/COMMAND.COM
Normal file
BIN
v4.0-ozzie/bin/DISK1/COMMAND.COM
Normal file
Binary file not shown.
199
v4.0-ozzie/bin/DISK1/COMMANDS.DOC
Normal file
199
v4.0-ozzie/bin/DISK1/COMMANDS.DOC
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Multi-Tasking MS-DOS
|
||||||
|
Beta Test Release 1.00
|
||||||
|
|
||||||
|
Command Guide
|
||||||
|
|
||||||
|
|
||||||
|
ARENA.EXE - Prints out arena assignments
|
||||||
|
|
||||||
|
arena
|
||||||
|
|
||||||
|
The system's memory arena is printed out. The
|
||||||
|
number listed under the owner field is the PID of
|
||||||
|
the process which owns the memory.
|
||||||
|
|
||||||
|
|
||||||
|
BBSET.EXE - Set and report on behavior bits
|
||||||
|
|
||||||
|
bbset [-o] [ {+|-}bitname ... ] fname ...
|
||||||
|
|
||||||
|
BBSET sets or clears behavior bits in an .EXE file
|
||||||
|
header. Multi-Tasking MS-DOS uses the behavior
|
||||||
|
bits to determine the level of special
|
||||||
|
compatibility support needed to run the
|
||||||
|
application.
|
||||||
|
|
||||||
|
BBSET will set (if +bitname) or clear (if -
|
||||||
|
bitname) the named behavior bit(s) from the
|
||||||
|
specified files. If the -o switch is specified,
|
||||||
|
BBSET writes a report on the current setting of
|
||||||
|
all the defined behavior bits to stdout after
|
||||||
|
making the requested changes.
|
||||||
|
|
||||||
|
For a list of behavior bits that BBSET knows
|
||||||
|
about, type BBSET without any arguments.
|
||||||
|
|
||||||
|
|
||||||
|
COUNTDOW.EXE - Count down a CPU loop
|
||||||
|
|
||||||
|
countdown number
|
||||||
|
|
||||||
|
Its argument is a number; it counts the number
|
||||||
|
down to 0, at about a 1hz rate. It prints out
|
||||||
|
the countdown. Another CPU loop program like
|
||||||
|
TEXT, but this one terminates when the count
|
||||||
|
reaches 0
|
||||||
|
|
||||||
|
|
||||||
|
DETACH.EXE - Detaches a child process
|
||||||
|
|
||||||
|
detach command [argument ...]
|
||||||
|
|
||||||
|
The command given is run as a background process.
|
||||||
|
Detach prints out the Command Subgroup ID (CSID)
|
||||||
|
which may be used as an argument to KILL to
|
||||||
|
terminate the process.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Multi-Tasking MS-DOS Command Guide - Page: 2
|
||||||
|
|
||||||
|
HE_DAEM.EXE - Hard error catcher
|
||||||
|
|
||||||
|
detach he_daem
|
||||||
|
|
||||||
|
Intercepts hard errors, reports them and requests
|
||||||
|
user action. This should always be run in the
|
||||||
|
background for now. Put the above command line in
|
||||||
|
your AUTOEXEC.BAT file if you're not going to use
|
||||||
|
the Session Manager (SM).
|
||||||
|
|
||||||
|
|
||||||
|
KILL.EXE - send a signal to a process
|
||||||
|
|
||||||
|
kill [-nn] [sig=nn] [disp=mm] pid ...
|
||||||
|
|
||||||
|
Sends signal nn with disposition mm to processes
|
||||||
|
mentioned in pid. Defaults to SIGTERM and process
|
||||||
|
tree disposition.
|
||||||
|
|
||||||
|
|
||||||
|
POUND.EXE - Exercise disk I/O system
|
||||||
|
|
||||||
|
pound [t]count filea fileb
|
||||||
|
|
||||||
|
Pound reads sequencially through filea and fileb,
|
||||||
|
reading 512 bytes at a time alternating between
|
||||||
|
the files on each read. When the end of file is
|
||||||
|
read the following read for that file begins at
|
||||||
|
the beginning of the file. If a count is
|
||||||
|
specified without the preceeding "t" then pound
|
||||||
|
reads 512 bytes, count number of times from each
|
||||||
|
file before the program terminates. If "t"
|
||||||
|
preceeds the count value then the files are read
|
||||||
|
for count number of seconds before the program
|
||||||
|
terminates.
|
||||||
|
|
||||||
|
|
||||||
|
SLEEP.EXE - Sleep for a while
|
||||||
|
|
||||||
|
sleep sec[.millisec]
|
||||||
|
|
||||||
|
Sleep will execute a sleep system call for the
|
||||||
|
number of seconds and milliseconds specified.
|
||||||
|
This might be useful in batch files to pause for
|
||||||
|
an interval as opposed to waiting for a user
|
||||||
|
response.
|
||||||
|
|
||||||
|
|
||||||
|
SM.EXE - Session manager
|
||||||
|
|
||||||
|
sm
|
||||||
|
|
||||||
|
Manages multiple processes running on different
|
||||||
|
screens. Uses initialization file SM.INI. This
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Multi-Tasking MS-DOS Command Guide - Page: 3
|
||||||
|
|
||||||
|
program includes the hard error catcher, so don't
|
||||||
|
run HE_DAEM if you're going to use this. See the
|
||||||
|
file SM.DOC for more information.
|
||||||
|
|
||||||
|
|
||||||
|
TEXT.EXE - Loop and print text
|
||||||
|
|
||||||
|
text argument
|
||||||
|
|
||||||
|
CPU loops and prints its argument every 2 CPU
|
||||||
|
seconds or so
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
3
v4.0-ozzie/bin/DISK1/CONFIG.SYS
Normal file
3
v4.0-ozzie/bin/DISK1/CONFIG.SYS
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
buffers = 40
|
||||||
|
files = 20
|
||||||
|
break=on
|
BIN
v4.0-ozzie/bin/DISK1/DOS33/FDISK.COM
Normal file
BIN
v4.0-ozzie/bin/DISK1/DOS33/FDISK.COM
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DISK1/DOS33/FORMAT.COM
Normal file
BIN
v4.0-ozzie/bin/DISK1/DOS33/FORMAT.COM
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DISK1/DOS33/SYS.COM
Normal file
BIN
v4.0-ozzie/bin/DISK1/DOS33/SYS.COM
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DISK1/IBMBIO.COM
Normal file
BIN
v4.0-ozzie/bin/DISK1/IBMBIO.COM
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DISK1/IBMDOS.COM
Normal file
BIN
v4.0-ozzie/bin/DISK1/IBMDOS.COM
Normal file
Binary file not shown.
67
v4.0-ozzie/bin/DISK1/README
Normal file
67
v4.0-ozzie/bin/DISK1/README
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Multi-Taking MS-DOS
|
||||||
|
Beta Test Release 1.00
|
||||||
|
|
||||||
|
Release Notes
|
||||||
|
|
||||||
|
|
||||||
|
Enclosed you will find Microsoft's first beta release
|
||||||
|
of Multi-tasking MS-DOS. This version is based upon MS-DOS
|
||||||
|
Version 2 sources, we will be reimplementing the multi-
|
||||||
|
tasking enhancements on top of Version 3 sources shortly.
|
||||||
|
|
||||||
|
Although we have distributed a bootable disk for the
|
||||||
|
IBM PC, this package can be adapted to any MS-DOS machine.
|
||||||
|
Those manufacturers who are designing IBM compatible ROMs,
|
||||||
|
would be wise to keep multi-tasking in mind. Specifically,
|
||||||
|
this IBM PC implementation has had to hook out the entire
|
||||||
|
disk (both floppy and hard disk) ROM code because after he
|
||||||
|
IBM code set's up the DMA transfer it simply loops in ROM
|
||||||
|
waiting for the interrupt to occur (routine WAIT_INT).
|
||||||
|
|
||||||
|
Problems you may wish to avoid within future ROMs are:
|
||||||
|
1) loading ES with the physical video RAM location
|
||||||
|
(label M3)
|
||||||
|
2) Looping in ROM on Cntrl-NumLock (label K40)
|
||||||
|
3) No way to add special detecting special key
|
||||||
|
strokes which a jump out into RAM after reading
|
||||||
|
the keystroke at KB_INT would avoid
|
||||||
|
4) Not being able to hook the loading of DS to point
|
||||||
|
to DATA (EQU 40H) in numerous routines.
|
||||||
|
Other than these deficiencies the ROM code developed should
|
||||||
|
be very usable.
|
||||||
|
|
||||||
|
By implementing the above suggestions, the size of your
|
||||||
|
BIOS can be reduced since it will not be necessary to
|
||||||
|
duplicate functionality in RAM.
|
||||||
|
|
||||||
|
More detailed specifications of the device driver
|
||||||
|
formats will be forth coming. For the time being you will
|
||||||
|
have to make use of the sample source code for the IBM PC.
|
||||||
|
If you have further questions please contact Microsoft OEM
|
||||||
|
customer support through Technical Assist Requests (TAR).
|
||||||
|
|
||||||
|
|
||||||
|
* * * WARNING * * * WARNING * * * WARNING * * *
|
||||||
|
|
||||||
|
Each copy of this software distribution has been
|
||||||
|
individually serialized to facilitate tracing of
|
||||||
|
unauthorized duplication.
|
||||||
|
|
||||||
|
* * * WARNING * * * WARNING * * * WARNING * * *
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
199
v4.0-ozzie/bin/DISK1/SM.DOC
Normal file
199
v4.0-ozzie/bin/DISK1/SM.DOC
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Multi-Tasking MS-DOS
|
||||||
|
Beta Test Release 1.00
|
||||||
|
|
||||||
|
Session Manager
|
||||||
|
User's Guide
|
||||||
|
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
|
||||||
|
The Session Manager(SM) for Multi-Tasking MS-DOS
|
||||||
|
allows you to run up to six programs at one time and switch
|
||||||
|
between them with a couple of keystrokes. Each program's
|
||||||
|
screen is preserved so that it can be restored when you
|
||||||
|
switch back to it. SM also contains the system-wide, Int24
|
||||||
|
Handler.
|
||||||
|
|
||||||
|
|
||||||
|
Initialization
|
||||||
|
|
||||||
|
The first thing SM does when it is started is look for
|
||||||
|
any program initialization information you may have. SM
|
||||||
|
looks for the initialization information in a file named
|
||||||
|
SM.INI in the current directory. Although recommended, no
|
||||||
|
initialization information is needed.
|
||||||
|
|
||||||
|
There are two types of initialization lines:
|
||||||
|
1) define <program key> <program name> [program args]
|
||||||
|
<working directory>
|
||||||
|
2) start <program key>
|
||||||
|
|
||||||
|
"program key" - a printable ascii character, a control
|
||||||
|
character (^A thru ^^), or a function key (F1
|
||||||
|
- F10).
|
||||||
|
"working directory" - a well formed path; i.e., begins
|
||||||
|
with drive letter (d:\).
|
||||||
|
|
||||||
|
Each define line will associate a key with a program.
|
||||||
|
If there is more than one define line using the same key,
|
||||||
|
only the information in the last one is used.
|
||||||
|
|
||||||
|
A start line is optional. If one exists, the program
|
||||||
|
associated with the key on the start line is run as soon as
|
||||||
|
SM finishes initializing. If more than one start line is
|
||||||
|
given, the last one is used.
|
||||||
|
|
||||||
|
This is what a sample initialization file might look like:
|
||||||
|
|
||||||
|
define f1 a:\command.com c:\bin\src
|
||||||
|
define ^z z.exe foo.c a:\foo\bar
|
||||||
|
start f1
|
||||||
|
|
||||||
|
|
||||||
|
Running the Session Manager
|
||||||
|
|
||||||
|
To run Session Manager, just type SM. It does not
|
||||||
|
require any arguments. If there was a start line in the
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Session Manager User's Guide - Page: 2
|
||||||
|
|
||||||
|
initialization file, the program associated with the start
|
||||||
|
key will be run. Otherwise, the SM screen will be displayed
|
||||||
|
and you will be prompted for input.
|
||||||
|
|
||||||
|
The SM screen contains a chart that describes each
|
||||||
|
defined program's key, status, arguments, and working
|
||||||
|
directory. There are 3 types of program status:
|
||||||
|
|
||||||
|
1) New - the program has never been run.
|
||||||
|
2) Active - the program has been started.
|
||||||
|
3) Dead - the program has terminated.
|
||||||
|
|
||||||
|
The input choices at this point are to either type a
|
||||||
|
program key or hit the <ESC> button to enter command mode.
|
||||||
|
If you hit a program key, the screen associated with that
|
||||||
|
program will be displayed and the program will
|
||||||
|
start/continue executing. If this is the first time the
|
||||||
|
program has been run, a chdir to the program's working
|
||||||
|
directory is made before it is started. If SM cannot start
|
||||||
|
the program you desired, the SM screen will reappear.
|
||||||
|
|
||||||
|
If the program you chose to run has died, its screen
|
||||||
|
will still be displayed so that you can check its output.
|
||||||
|
That is all you can do while in a dead programs screen
|
||||||
|
except switch back to SM.
|
||||||
|
|
||||||
|
To switch back to SM, hit Alt-F10. Alt-F10 is
|
||||||
|
currently the program key for SM and will be recognized no
|
||||||
|
matter what other programs are running. This is the only
|
||||||
|
program key that works this way. All of the others will
|
||||||
|
only be recognized if SM is running and the SM screen is
|
||||||
|
being displayed.
|
||||||
|
|
||||||
|
Whenever any of SM's children die, their status is
|
||||||
|
changed to dead. You will see the status change the next
|
||||||
|
time the SM screen is displayed. If the program using the
|
||||||
|
current screen dies, you will go back into SM.
|
||||||
|
|
||||||
|
|
||||||
|
Command Mode
|
||||||
|
|
||||||
|
When you enter SM's command mode the prompt "SM command or
|
||||||
|
HELP>" is displayed. The valid SM commands are:
|
||||||
|
|
||||||
|
1) INIT <program key>
|
||||||
|
Initialize the program associated with key so that
|
||||||
|
it can be run again. The program's status is
|
||||||
|
changed to "New" and its screen memory is freed.
|
||||||
|
If the program is active, it is killed before it
|
||||||
|
is initialized.
|
||||||
|
|
||||||
|
2) DEFINE <program key> <program name> [program args]
|
||||||
|
<working directory>
|
||||||
|
Define and run a new program using the supplied
|
||||||
|
information. If the key was previously defined,
|
||||||
|
redefine it.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Session Manager User's Guide - Page: 3
|
||||||
|
|
||||||
|
3) RUN <program key>
|
||||||
|
Run the program associated with key.
|
||||||
|
|
||||||
|
4) RESTART <program key>
|
||||||
|
Restart the program associated with key. This
|
||||||
|
like issuing an INIT and a RUN command.
|
||||||
|
|
||||||
|
5) KILL <program key>
|
||||||
|
Kill the program associated with key. Its status
|
||||||
|
is changed to dead.
|
||||||
|
|
||||||
|
6) HELP
|
||||||
|
Display a help screen.
|
||||||
|
|
||||||
|
7) EXIT
|
||||||
|
Kill all of SM's children and exit SM.
|
||||||
|
|
||||||
|
In all of the above commands, "key" is the printable
|
||||||
|
ascii representation of a programs key. If a command fails,
|
||||||
|
you will either be asked to enter a new command or placed in
|
||||||
|
SM's top level.
|
||||||
|
|
||||||
|
|
||||||
|
Session Manager's Int24 Handler
|
||||||
|
|
||||||
|
Whenever an Int24 occurs, SM's Int24 handler is called.
|
||||||
|
No matter what program is using the screen and no matter
|
||||||
|
which program caused the error, SM's Int24 screen is always
|
||||||
|
displayed. This screen will contain information on the type
|
||||||
|
of Int24 that happened, and the name and pid of the program
|
||||||
|
that caused the error. You will then be prompted for one of
|
||||||
|
the valid actions for this type of error. After the action
|
||||||
|
typed in has been taken, you are returned to the screen you
|
||||||
|
were using before the Int24.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
2
v4.0-ozzie/bin/DISK1/SM.INI
Normal file
2
v4.0-ozzie/bin/DISK1/SM.INI
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
define F7 a:\command.com a:\
|
||||||
|
define F8 a:\command.com c:\
|
573
v4.0-ozzie/bin/DISK2/BIOS/ANSI.INC
Normal file
573
v4.0-ozzie/bin/DISK2/BIOS/ANSI.INC
Normal file
@ -0,0 +1,573 @@
|
|||||||
|
; Termcap description of capabilities:
|
||||||
|
|
||||||
|
;ibmans4:mtcon:IBM PC with V4.0 ANSI driver:\
|
||||||
|
; :al=\E[L:am:bs:ce=\E[K:cl=\E[2J\E[H:cm=\E[%;%H:co#80:\
|
||||||
|
; :dl=\E[M:do=\E[B:ho=\E[H:li#24:mi:nd=\E[C:\
|
||||||
|
; :ms:pt:se=\E[m:so=\E[1;36m:up=\E[A:\
|
||||||
|
; :kb=^h:ku=\E[A:kd=\E[B:kl=\E[D:kr=\E[C:kh=\E[H:kn#8:\
|
||||||
|
; :k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:\
|
||||||
|
; :k6=\EP:k7=\EQ:k8=\ER:
|
||||||
|
|
||||||
|
CMDTABL DB 'A'
|
||||||
|
DW CUU ;CUrsor Up
|
||||||
|
DB 'B'
|
||||||
|
DW CUD ;CUrsor Down
|
||||||
|
DB 'C'
|
||||||
|
DW CUF ;CUrsor Forward
|
||||||
|
DB 'D'
|
||||||
|
DW CUB ;CUrsor Back
|
||||||
|
DB 'H'
|
||||||
|
DW CUP ;CUrsor Position
|
||||||
|
DB 'J'
|
||||||
|
DW ED ;Erase in Display
|
||||||
|
DB 'K'
|
||||||
|
DW EL ;Erase in Line
|
||||||
|
DB 'L'
|
||||||
|
DW IL ;Insert Line
|
||||||
|
DB 'M'
|
||||||
|
DW xDL ;Delete Line
|
||||||
|
;; DB 'R'
|
||||||
|
;; DW CPR ;Cursor Postion Report
|
||||||
|
DB 'f'
|
||||||
|
DW HVP ;Horizontal and Vertical Position
|
||||||
|
DB 'h'
|
||||||
|
DW SM ;Set Mode
|
||||||
|
DB 'l'
|
||||||
|
DW RM ;Reset Mode
|
||||||
|
DB 'm'
|
||||||
|
DW SGR ;Select Graphics Rendition
|
||||||
|
;; DB 'n'
|
||||||
|
;; DW DSR ;Device Status Report
|
||||||
|
DB 's'
|
||||||
|
DW SCP ;Save Cursor Position
|
||||||
|
DB 'u'
|
||||||
|
DW RCP ;Restore Cursor Position
|
||||||
|
DB 00
|
||||||
|
|
||||||
|
; Graphic Rendition modes: parameter, mask, set
|
||||||
|
GRMODE DB 00,00000000B,00000111B ; all off
|
||||||
|
DB 01,11111111B,00001000B ; bold (increased intensity)
|
||||||
|
DB 04,11111000B,00000001B ; underscore
|
||||||
|
DB 05,11111111B,10000000B ; blink
|
||||||
|
DB 07,11111000B,01110000B ; reverse video
|
||||||
|
DB 08,10001000B,00000000B ; concealed
|
||||||
|
DB 30,11111000B,00000000B ; foreground colors ...
|
||||||
|
DB 31,11111000B,00000100B
|
||||||
|
DB 32,11111000B,00000010B
|
||||||
|
DB 33,11111000B,00000110B
|
||||||
|
DB 34,11111000B,00000001B
|
||||||
|
DB 35,11111000B,00000101B
|
||||||
|
DB 36,11111000B,00000011B
|
||||||
|
DB 37,11111000B,00000111B
|
||||||
|
DB 40,10001111B,00000000B ; background colors ...
|
||||||
|
DB 41,10001111B,01000000B
|
||||||
|
DB 42,10001111B,00100000B
|
||||||
|
DB 43,10001111B,01100000B
|
||||||
|
DB 44,10001111B,00010000B
|
||||||
|
DB 45,10001111B,01010000B
|
||||||
|
DB 46,10001111B,00110000B
|
||||||
|
DB 47,10001111B,01110000B
|
||||||
|
DB 0FFH
|
||||||
|
|
||||||
|
; Set/Reset Modes: indexed by (SelChar-'<'*8) + (PARAM0 AND 7)
|
||||||
|
SRMODE DW 0,0,0,0,0,0,0,0 ; SelChar '<'
|
||||||
|
DW 1,1,1,1,1,1,1,WRAP ; SelChar '='
|
||||||
|
DW 0,EnaL25,0,0,0,0,0,0 ; SelChar '>'
|
||||||
|
DW 0,0,0,0,0,0,0,WRAP ; SelChar '?'
|
||||||
|
|
||||||
|
PAGE
|
||||||
|
; The following are duplicates of the same variables from the ROM
|
||||||
|
;
|
||||||
|
;* WARNING - the following two variables are accessed as a word
|
||||||
|
MODE DB 3
|
||||||
|
MAXCOL DB 79
|
||||||
|
IF LINE25 ; special treatment of line 25?
|
||||||
|
maxrow equ 24
|
||||||
|
ELSE
|
||||||
|
maxrow equ 25
|
||||||
|
ENDIF
|
||||||
|
;* WARNING - the following two variables are accessed as a word
|
||||||
|
COL DB 0 ; current column
|
||||||
|
ROW DB 0 ; current row
|
||||||
|
|
||||||
|
|
||||||
|
AnsiState LABEL BYTE ; the following must be saved on a screen swap
|
||||||
|
WRAP DB 1 ; 0 = NO WRAP, 1 = WRAP
|
||||||
|
EnaL25 DB 0 ; 0 = 25th line disabled, 1 = enabled
|
||||||
|
STATE DW S1
|
||||||
|
SAVCR DW 0 ; saved cursor position
|
||||||
|
;* WARNING - the following two variables are accessed as a word
|
||||||
|
SelChar DB 0 ; <,=,> or ? private use indicators
|
||||||
|
PRMCNT LABEL BYTE ; number of parameters for command
|
||||||
|
PRMCNTW DW 0
|
||||||
|
NUMPARAM equ 5 ; max. number of parameters
|
||||||
|
PARAM DB NUMPARAM DUP (?) ; buffer for command parameters
|
||||||
|
;* WARNING - the following two variables are accessed as a word
|
||||||
|
attrw LABEL WORD
|
||||||
|
ATTR DB 00000111B ;CHARACTER ATTRIBUTE
|
||||||
|
BPAGE DB 0 ;BASE PAGE
|
||||||
|
|
||||||
|
AnsiSize equ ($-AnsiState)
|
||||||
|
|
||||||
|
IF (AnsiSize GT TermSize)
|
||||||
|
.RADIX 0 ; ERROR - Terminal state not big enough
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
;-------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; CHROUT - WRITE OUT CHAR IN AL USING CURRENT ATTRIBUTE
|
||||||
|
;
|
||||||
|
base dw 0b800h
|
||||||
|
screen_seg dw 00000h
|
||||||
|
|
||||||
|
chrout: cmp al,13 ; carriage return?
|
||||||
|
ja outchr
|
||||||
|
jnz trylf
|
||||||
|
mov [col],0
|
||||||
|
;; jmp short setit
|
||||||
|
jmp setit
|
||||||
|
|
||||||
|
trylf: cmp al,10 ; line feed?
|
||||||
|
jz lf
|
||||||
|
cmp al,7 ; bell?
|
||||||
|
jnz trytab
|
||||||
|
torom:
|
||||||
|
mov bx,[attrw]
|
||||||
|
and bl,7
|
||||||
|
mov ah,14
|
||||||
|
int 10h
|
||||||
|
ret5: ret
|
||||||
|
|
||||||
|
trytab:
|
||||||
|
cmp al,9 ; tab?
|
||||||
|
jnz tryback
|
||||||
|
mov al,[col]
|
||||||
|
add al,8
|
||||||
|
mov ah,al
|
||||||
|
and ah,7
|
||||||
|
sub al,ah
|
||||||
|
cmp al,[maxcol]
|
||||||
|
jb tunder
|
||||||
|
mov al,[maxcol]
|
||||||
|
tunder:
|
||||||
|
mov [col],al
|
||||||
|
jmp short setit
|
||||||
|
|
||||||
|
tryback:
|
||||||
|
cmp al,8 ; backspace?
|
||||||
|
jnz outchr
|
||||||
|
cmp [col],0
|
||||||
|
jz ret5
|
||||||
|
dec [col]
|
||||||
|
jmp short setit
|
||||||
|
|
||||||
|
outchr:
|
||||||
|
mov bx,[attrw]
|
||||||
|
mov cx,1
|
||||||
|
mov ah,9
|
||||||
|
int 10h
|
||||||
|
inc [col]
|
||||||
|
mov al,[col]
|
||||||
|
cmp al,[maxcol]
|
||||||
|
jbe setit
|
||||||
|
cmp [wrap],1
|
||||||
|
jz outchr1
|
||||||
|
dec [col]
|
||||||
|
ret
|
||||||
|
outchr1:
|
||||||
|
mov [col],0
|
||||||
|
lf: cmp [row],(maxrow-1)
|
||||||
|
ja setit ; on line 25, don't move
|
||||||
|
jz lf1 ; on 24th line, scroll
|
||||||
|
inc [row]
|
||||||
|
jmp short setit
|
||||||
|
lf1: call scroll
|
||||||
|
|
||||||
|
setit: mov dx,word ptr col
|
||||||
|
mov bh,[bpage]
|
||||||
|
mov ah,2
|
||||||
|
int 10h
|
||||||
|
ret
|
||||||
|
|
||||||
|
scroll: mov al,mode
|
||||||
|
cmp al,2
|
||||||
|
jz myscroll
|
||||||
|
cmp al,3
|
||||||
|
jz myscroll
|
||||||
|
IF LINE25
|
||||||
|
xor cx,cx ; from 0,0
|
||||||
|
mov dh,(maxrow-1) ; to maxrow-1,maxcol
|
||||||
|
mov dl,maxcol
|
||||||
|
mov bh,attr
|
||||||
|
mov ax,0601h ; scroll up one line
|
||||||
|
int 10h
|
||||||
|
ret
|
||||||
|
ELSE
|
||||||
|
mov al,10
|
||||||
|
jmp torom
|
||||||
|
ENDIF
|
||||||
|
myscroll:
|
||||||
|
mov bh,[attr]
|
||||||
|
mov bl,' '
|
||||||
|
mov bp,80
|
||||||
|
mov ax,[base]
|
||||||
|
add ax,[screen_seg]
|
||||||
|
mov es,ax
|
||||||
|
mov ds,ax
|
||||||
|
xor di,di
|
||||||
|
mov si,160
|
||||||
|
mov cx,(maxrow-1)*80
|
||||||
|
cld
|
||||||
|
|
||||||
|
; This code will never get executed since we get here when
|
||||||
|
; mode = 2 or 3 only.
|
||||||
|
;; cmp cs:[base],0b800h
|
||||||
|
;; jz colorcard
|
||||||
|
|
||||||
|
;; rep movsw
|
||||||
|
;; mov ax,bx
|
||||||
|
;; mov cx,bp
|
||||||
|
;; rep stosw
|
||||||
|
;; jmp short sret
|
||||||
|
|
||||||
|
;;colorcard:
|
||||||
|
mov dx,3dah
|
||||||
|
wait2: in al,dx
|
||||||
|
test al,8
|
||||||
|
jz wait2
|
||||||
|
mov al,25h
|
||||||
|
mov dx,3d8h
|
||||||
|
out dx,al ;turn off video
|
||||||
|
rep movsw
|
||||||
|
mov ax,bx
|
||||||
|
mov cx,bp
|
||||||
|
rep stosw
|
||||||
|
mov al,29h
|
||||||
|
mov dx,3d8h
|
||||||
|
out dx,al ;turn on video
|
||||||
|
sret: push cs
|
||||||
|
pop ds
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
CharOut: PUSH AX ; Main entry point
|
||||||
|
PUSH BX
|
||||||
|
PUSH CX
|
||||||
|
PUSH DX
|
||||||
|
PUSH SI
|
||||||
|
PUSH DI
|
||||||
|
PUSH ES
|
||||||
|
PUSH BP
|
||||||
|
|
||||||
|
MOV [base],0B800H
|
||||||
|
XCHG AX,SI ; SAVE CHARACTER TO STUFF
|
||||||
|
MOV AX,40H ; POINT TO ROS BIOS
|
||||||
|
MOV DS,AX
|
||||||
|
MOV AX,DS:[49H] ; AL=MODE, AH=MAX COL
|
||||||
|
DEC AH ; ANSI NEEDS 0-79 OR 0-39
|
||||||
|
MOV WORD PTR CS:[MODE],AX ; SAVE MODE AND MAX COL
|
||||||
|
CMP AL,7
|
||||||
|
JNZ NOT_BW
|
||||||
|
MOV WORD PTR CS:[base],0B000H
|
||||||
|
NOT_BW: MOV AL,DS:[62H] ; GET ACTIVE PAGE
|
||||||
|
MOV CS:[BPAGE],AL
|
||||||
|
CBW
|
||||||
|
ADD AX,AX
|
||||||
|
MOV BX,AX
|
||||||
|
MOV AX,DS:[BX+50H] ; AL=COL, AH=ROW
|
||||||
|
MOV WORD PTR CS:[COL],AX ; SAVE ROW AND COLUMN
|
||||||
|
MOV AX,DS:[4EH] ; GET START OF SCREEN SEG
|
||||||
|
MOV CL,4
|
||||||
|
SHR AX,CL ; CONVERT TO A SEGMENT
|
||||||
|
PUSH CS
|
||||||
|
POP DS
|
||||||
|
MOV [screen_seg],AX
|
||||||
|
XCHG AX,SI ; GET BACK CHARACTER IN AL
|
||||||
|
|
||||||
|
CALL VIDEO
|
||||||
|
POP BP
|
||||||
|
POP ES
|
||||||
|
POP DI
|
||||||
|
POP SI
|
||||||
|
POP DX
|
||||||
|
POP CX
|
||||||
|
POP BX
|
||||||
|
POP AX
|
||||||
|
RET
|
||||||
|
|
||||||
|
|
||||||
|
;----------------------------------------------------------
|
||||||
|
;
|
||||||
|
; OUTPUT SINGLE CHAR IN AL TO VIDEO DEVICE
|
||||||
|
;
|
||||||
|
VIDEO: MOV SI,OFFSET STATE
|
||||||
|
JMP [SI]
|
||||||
|
|
||||||
|
S2: CMP AL,'['
|
||||||
|
JZ S22
|
||||||
|
JMP S1
|
||||||
|
S22: MOV WORD PTR [SI],OFFSET S30
|
||||||
|
XOR BX,BX
|
||||||
|
MOV WORD PTR SelChar,BX
|
||||||
|
MOV WORD PTR PARAM,BX
|
||||||
|
JMP SHORT S3B
|
||||||
|
|
||||||
|
S30: CMP AL,'?' ; experimental use selector (SM/RM)?
|
||||||
|
JA S7
|
||||||
|
mov SelChar,al
|
||||||
|
MOV WORD PTR [SI],OFFSET S3
|
||||||
|
cmp al,'<'
|
||||||
|
jae S3B
|
||||||
|
|
||||||
|
S3: CMP AL,';'
|
||||||
|
JNZ S3C
|
||||||
|
S3A: INC PRMCNT
|
||||||
|
S3B: CALL GETPTR
|
||||||
|
XOR AX,AX
|
||||||
|
MOV WORD PTR [BX],AX ;DEFAULT VALUE IS ZERO
|
||||||
|
RET
|
||||||
|
|
||||||
|
S3C: CMP AL,'0'
|
||||||
|
JB S3D
|
||||||
|
CMP AL,'9'
|
||||||
|
JA S7
|
||||||
|
CALL GETPTR
|
||||||
|
SUB AL,'0'
|
||||||
|
XCHG AL,BYTE PTR [BX]
|
||||||
|
MOV AH,10
|
||||||
|
MUL AH ;*10
|
||||||
|
ADD BYTE PTR [BX],AL ;MOVE IN DIGIT
|
||||||
|
RET
|
||||||
|
|
||||||
|
S3D:
|
||||||
|
;; CMP AL,'"' ;BEGIN QUOTED STRING
|
||||||
|
;; JZ S3E
|
||||||
|
;; CMP AL,"'"
|
||||||
|
JNZ S7
|
||||||
|
;;S3E: MOV WORD PTR [SI],OFFSET S4
|
||||||
|
;; MOV [INQ],AL
|
||||||
|
S3RET: RET
|
||||||
|
|
||||||
|
;
|
||||||
|
; ENTER QUOTED STRINGS
|
||||||
|
;
|
||||||
|
|
||||||
|
;;S4: CMP AL,[INQ] ;CHECK FOR STRING TERMINATOR
|
||||||
|
;; JNZ S4A
|
||||||
|
;; DEC PRMCNT ;TERMINATE STRING
|
||||||
|
;; MOV WORD PTR [SI],OFFSET S3
|
||||||
|
;; RET
|
||||||
|
|
||||||
|
;;S4A: CALL GETPTR
|
||||||
|
;; MOV BYTE PTR [BX],AL
|
||||||
|
;; MOV WORD PTR [SI],OFFSET S4
|
||||||
|
;; JMP S3A
|
||||||
|
;
|
||||||
|
; LOOK FOR ANSI COMMAND SPECIFIED IN AL
|
||||||
|
;
|
||||||
|
|
||||||
|
S7: MOV BX,OFFSET CMDTABL-3
|
||||||
|
;
|
||||||
|
S7A: ADD BX,3
|
||||||
|
CMP BYTE PTR [BX],0
|
||||||
|
JZ S1B
|
||||||
|
CMP BYTE PTR [BX],AL
|
||||||
|
JNZ S7A
|
||||||
|
;
|
||||||
|
S7B: MOV AX,WORD PTR [BX+1] ;AX = JUMP ADDRESS
|
||||||
|
MOV BX,OFFSET PARAM
|
||||||
|
MOV DL,BYTE PTR [BX]
|
||||||
|
XOR DH,DH ;DX = FIRST PARAMETER
|
||||||
|
MOV CX,DX
|
||||||
|
OR CX,CX
|
||||||
|
JNZ S7C
|
||||||
|
INC CX ; if DX=0, CX=1 else CX = DX
|
||||||
|
S7C: JMP AX ;AL = COMMAND
|
||||||
|
|
||||||
|
S1: CMP AL,1Bh ;ESCAPE SEQUENCE?
|
||||||
|
JNZ S1B
|
||||||
|
MOV WORD PTR [SI],OFFSET S2
|
||||||
|
RET
|
||||||
|
|
||||||
|
S1B: CALL CHROUT
|
||||||
|
S1A: MOV WORD PTR [STATE],OFFSET S1
|
||||||
|
RET
|
||||||
|
|
||||||
|
MOVCUR: CMP BYTE PTR [BX],AH
|
||||||
|
JZ SETCUR
|
||||||
|
ADD BYTE PTR [BX],AL
|
||||||
|
LOOP MOVCUR
|
||||||
|
SETCUR: MOV DX,WORD PTR COL
|
||||||
|
XOR BX,BX
|
||||||
|
MOV AH,2
|
||||||
|
int 10h ; call ROM
|
||||||
|
JMP S1A
|
||||||
|
|
||||||
|
HVP:
|
||||||
|
CUP:
|
||||||
|
IF LINE25
|
||||||
|
CMP CL,(maxrow+1)
|
||||||
|
jb cup3 ; new row is 24 or less
|
||||||
|
JA SETCUR ; error - 26 or greater
|
||||||
|
cmp EnaL25,0 ; else 25, is it allowed?
|
||||||
|
jz SETCUR
|
||||||
|
cup3:
|
||||||
|
ELSE
|
||||||
|
CMP CL,maxrow
|
||||||
|
JA SETCUR
|
||||||
|
ENDIF
|
||||||
|
MOV AL,MAXCOL
|
||||||
|
MOV CH,BYTE PTR [BX+1]
|
||||||
|
OR CH,CH
|
||||||
|
JZ CUP1
|
||||||
|
DEC CH
|
||||||
|
CUP1: CMP AL,CH
|
||||||
|
JA CUP2
|
||||||
|
MOV CH,AL
|
||||||
|
CUP2: XCHG CL,CH
|
||||||
|
DEC CH
|
||||||
|
MOV WORD PTR COL,CX
|
||||||
|
JMP SETCUR
|
||||||
|
|
||||||
|
CUF: MOV AH,MAXCOL
|
||||||
|
MOV AL,1
|
||||||
|
CUF1: MOV BX,OFFSET COL
|
||||||
|
JMP MOVCUR
|
||||||
|
|
||||||
|
CUB: MOV AX,00FFH
|
||||||
|
JMP CUF1
|
||||||
|
|
||||||
|
CUU: MOV AX,00FFH
|
||||||
|
CUU1: MOV BX,OFFSET ROW
|
||||||
|
JMP MOVCUR
|
||||||
|
|
||||||
|
CUD: MOV AX,(maxrow-1)*256+1
|
||||||
|
IF LINE25
|
||||||
|
cmp ah,[row] ; at bottom of screen?
|
||||||
|
ja SETCUR
|
||||||
|
ENDIF
|
||||||
|
JMP CUU1
|
||||||
|
|
||||||
|
SCP: MOV AX,WORD PTR COL
|
||||||
|
MOV SAVCR,AX
|
||||||
|
JMP SETCUR
|
||||||
|
|
||||||
|
RCP: MOV AX,SAVCR
|
||||||
|
IF LINE25
|
||||||
|
cmp ch,maxrow
|
||||||
|
jb rcp1
|
||||||
|
cmp EnaL25,0
|
||||||
|
jz rcp2
|
||||||
|
ENDIF
|
||||||
|
rcp1: MOV WORD PTR COL,AX
|
||||||
|
rcp2: JMP SETCUR
|
||||||
|
|
||||||
|
SGR: XOR CX,CX
|
||||||
|
XCHG CL,PRMCNT
|
||||||
|
CALL GETPTR
|
||||||
|
INC CX
|
||||||
|
SGR1: MOV AL,BYTE PTR [BX]
|
||||||
|
PUSH BX
|
||||||
|
MOV BX,OFFSET GRMODE
|
||||||
|
SGR2: MOV AH,BYTE PTR [BX]
|
||||||
|
ADD BX,3
|
||||||
|
CMP AH,0FFH
|
||||||
|
JZ SGR3
|
||||||
|
CMP AH,AL
|
||||||
|
JNZ SGR2
|
||||||
|
MOV AX,WORD PTR [BX-2]
|
||||||
|
AND ATTR,AL
|
||||||
|
OR ATTR,AH
|
||||||
|
SGR3: POP BX
|
||||||
|
INC BX
|
||||||
|
LOOP SGR1
|
||||||
|
JMP SETCUR
|
||||||
|
|
||||||
|
ED:
|
||||||
|
IF LINE25
|
||||||
|
cmp row,maxrow ; on 25th line?
|
||||||
|
je EL ; yes, treat like Erase in Line
|
||||||
|
ENDIF
|
||||||
|
xor cx,cx
|
||||||
|
mov dl,maxcol
|
||||||
|
mov dh,(maxrow-1)
|
||||||
|
cmp param,1 ; which subcommand?
|
||||||
|
ja el2 ; all
|
||||||
|
jb ed1
|
||||||
|
mov dh,row ; to beginning
|
||||||
|
dec dh
|
||||||
|
jle EL
|
||||||
|
jmp short ed2
|
||||||
|
ed1: mov ch,row ; to end
|
||||||
|
inc ch
|
||||||
|
cmp ch,dh
|
||||||
|
jae EL
|
||||||
|
ed2: mov bh,attr
|
||||||
|
MOV AX,0600H
|
||||||
|
int 10h ; call ROM
|
||||||
|
|
||||||
|
EL: MOV CX,WORD PTR COL
|
||||||
|
MOV dx,cx
|
||||||
|
mov al,param
|
||||||
|
inc al ; 0,1,2 => 1,2,3
|
||||||
|
test al,1 ; to end?
|
||||||
|
je el1
|
||||||
|
mov dl,maxcol
|
||||||
|
el1: test al,2 ; to beginning?
|
||||||
|
je el2
|
||||||
|
mov cl,0
|
||||||
|
el2: mov bh,attr
|
||||||
|
mov ax,0600H
|
||||||
|
int 10h
|
||||||
|
S1A_j: jmp S1A
|
||||||
|
|
||||||
|
IL: mov ah,7 ; scroll down
|
||||||
|
jmp short dl1
|
||||||
|
|
||||||
|
xDL: mov ah,6 ; scroll up
|
||||||
|
dl1: mov al,cl ; number of lines
|
||||||
|
mov ch,row
|
||||||
|
xor cl,cl
|
||||||
|
mov dh,(maxrow-1)
|
||||||
|
mov dl,maxcol
|
||||||
|
mov bh,attr
|
||||||
|
int 10h
|
||||||
|
jmp S1A_j
|
||||||
|
|
||||||
|
RM: XOR CL,CL
|
||||||
|
JMP SHORT SM1
|
||||||
|
|
||||||
|
SM: MOV CL,1
|
||||||
|
SM1: mov bl,SelChar ; get selection character
|
||||||
|
sub bl,'<' ; adjust
|
||||||
|
jb S1A_j ; less than '<'
|
||||||
|
cmp bl,4
|
||||||
|
jae S1A_j ; greater than '?'
|
||||||
|
xor bh,bh
|
||||||
|
shl bx,1
|
||||||
|
shl bx,1
|
||||||
|
shl bx,1
|
||||||
|
MOV AL,DL
|
||||||
|
CMP AL,7
|
||||||
|
JA S1A_j
|
||||||
|
or bl,al
|
||||||
|
shl bx,1
|
||||||
|
mov bx,SRMODE[bx] ; get function indicator
|
||||||
|
cmp bx,1 ; no or special function?
|
||||||
|
jb S1A_j
|
||||||
|
jz SM2 ; sets screen mode
|
||||||
|
MOV [bx],CL
|
||||||
|
JMP S1A_j
|
||||||
|
|
||||||
|
SM2: MOV AH,0
|
||||||
|
int 10h ; call ROM
|
||||||
|
JMP S1A_j
|
||||||
|
|
||||||
|
; GetPtr - get a pointer to the current parameter
|
||||||
|
GETPTR: MOV BX,PRMCNTW
|
||||||
|
CMP BX,NUMPARAM
|
||||||
|
JB GET1
|
||||||
|
DEC PRMCNT
|
||||||
|
JMP GETPTR
|
||||||
|
GET1: ADD BX,OFFSET PARAM
|
||||||
|
RET
|
20
v4.0-ozzie/bin/DISK2/BIOS/BIOSOBJ.MAK
Normal file
20
v4.0-ozzie/bin/DISK2/BIOS/BIOSOBJ.MAK
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
ibmbio.obj: ibmbio.asm defdbug.inc bugcode.inc
|
||||||
|
masm ibmbio;
|
||||||
|
|
||||||
|
ibmmtcon.obj: ibmmtcon.asm ansi.inc defdbug.inc
|
||||||
|
masm ibmmtcon;
|
||||||
|
|
||||||
|
ibmdsk.obj: ibmdsk.asm defdbug.inc
|
||||||
|
masm ibmdsk;
|
||||||
|
|
||||||
|
sysini.obj: sysini.asm dossym.inc devsym.inc syscalls.inc
|
||||||
|
masm sysini;
|
||||||
|
|
||||||
|
sysimes.obj: sysimes.asm
|
||||||
|
masm sysimes;
|
||||||
|
|
||||||
|
ibmbio.exe: ibmbio.obj ibmmtcon.obj ibmdsk.obj sysini.obj sysimes.obj
|
||||||
|
link ibmbio ibmmtcon ibmdsk sysini sysimes,ibmbio,ibmbio/map;
|
||||||
|
|
||||||
|
ibmbio.com: ibmbio.exe
|
||||||
|
exe2bin ibmbio ibmbio.com
|
BIN
v4.0-ozzie/bin/DISK2/BIOS/BOOTPACH.EXE
Normal file
BIN
v4.0-ozzie/bin/DISK2/BIOS/BOOTPACH.EXE
Normal file
Binary file not shown.
553
v4.0-ozzie/bin/DISK2/BIOS/BUGCODE.INC
Normal file
553
v4.0-ozzie/bin/DISK2/BIOS/BUGCODE.INC
Normal file
@ -0,0 +1,553 @@
|
|||||||
|
;*** Bugcode.inc - Debug code for including into sysini.asm and ibmbio.asm
|
||||||
|
;
|
||||||
|
; Can't link in via buglib due to memory and relocation games played
|
||||||
|
; by these modules. Each gets a private, local-only copy of these
|
||||||
|
; modules.
|
||||||
|
|
||||||
|
|
||||||
|
IFDEF DEBUGFLG
|
||||||
|
|
||||||
|
|
||||||
|
;** DPRINTF _ Debug Printf
|
||||||
|
;
|
||||||
|
; Dprintf is a kernel debug print formatting package. It is intended
|
||||||
|
; to produce conviently formatted output.
|
||||||
|
;
|
||||||
|
; Dprintf is called, indirectly, by a macro:
|
||||||
|
;
|
||||||
|
; DEBUG n,m,"string",<a1,...,an>
|
||||||
|
;
|
||||||
|
; string = format string
|
||||||
|
; a1 = first argument
|
||||||
|
; an = last argument
|
||||||
|
;
|
||||||
|
; The format string is an ASCIZ string which can contain 2 types of
|
||||||
|
; specifications: data-format specifications and literal characters.
|
||||||
|
; Data format specifications always begin with a '$' character; all
|
||||||
|
; characters not part of a data format specification are treated as
|
||||||
|
; literal characters.
|
||||||
|
;
|
||||||
|
; Literal characters
|
||||||
|
; - any character not part of a format specification. Special
|
||||||
|
; non-printing characters are:
|
||||||
|
; \n - CRLF
|
||||||
|
; \t - tab
|
||||||
|
; \b - bell
|
||||||
|
; \\ - \
|
||||||
|
; \$ - $
|
||||||
|
;
|
||||||
|
; Format Specifications
|
||||||
|
;
|
||||||
|
; A format specification takes the form:
|
||||||
|
; $ [@] <char>
|
||||||
|
;
|
||||||
|
; where <char> =
|
||||||
|
;
|
||||||
|
; x - print argument as a hex word
|
||||||
|
; d - print argument as decimal word
|
||||||
|
; c - print argument as ascii character
|
||||||
|
; b - print argument as hex byte
|
||||||
|
; For each of the above formats, the supplied argument
|
||||||
|
; is a 16-bit word - the value to be printed. The optional @
|
||||||
|
; (described below) allows a segmented address to be supplied,
|
||||||
|
; instead.
|
||||||
|
;
|
||||||
|
; s[nn] - print argument as asciz string; if optional decimal
|
||||||
|
; argument follows the format character this specifys
|
||||||
|
; a maximum string length. Non printing characters are
|
||||||
|
; printed in the form \nnn where "nnn" is the octal byte
|
||||||
|
; value.
|
||||||
|
; Note that this format character cannot be directly
|
||||||
|
; followed by a digit unless that digit is to be taken
|
||||||
|
; as the start of a length argument.
|
||||||
|
;
|
||||||
|
; Bnn - print argument as hex bytes. The required following
|
||||||
|
; decimal argument is the number of bytes to print.
|
||||||
|
;
|
||||||
|
; Both of these formats take a long address as their argument.
|
||||||
|
; The '@' character is thus invalid for these formats.
|
||||||
|
;
|
||||||
|
; WARNINGS
|
||||||
|
; As befitting a debug routine, DPRINTF does not have a whole lot
|
||||||
|
; of "failsafe" code in it. Supplying screwed up formats can
|
||||||
|
; muck things up. Specifically:
|
||||||
|
; The @ argument must NOT be specified with the 's' or 'B'
|
||||||
|
; format
|
||||||
|
; A string/byte-length argument of 0 is taken as 65536
|
||||||
|
; The string "%% BAD FMT %%" appears in the output when
|
||||||
|
; 1) an illegal format specifier is given, or
|
||||||
|
; 2) the B format is given a 0 or missing length
|
||||||
|
;
|
||||||
|
; ENTRY (sp+n ) = address of format string (offset from return cs value)
|
||||||
|
; (sp+n-2) = first argument word
|
||||||
|
; (sp+n-4) = second argument word
|
||||||
|
; .
|
||||||
|
; (sp+4 ) = last argument word
|
||||||
|
; (sp+2 ) = seg of return address
|
||||||
|
; (sp ) = offset of return address
|
||||||
|
; (bp) = offset of format string on the stack
|
||||||
|
; EXIT none
|
||||||
|
; USES flags
|
||||||
|
|
||||||
|
PUBLIC DPRINTF
|
||||||
|
DPRINTF PROC near
|
||||||
|
|
||||||
|
push ds
|
||||||
|
push es
|
||||||
|
push bp
|
||||||
|
push di
|
||||||
|
push si
|
||||||
|
push dx
|
||||||
|
push cx
|
||||||
|
push bx
|
||||||
|
push ax ; save registers
|
||||||
|
cld
|
||||||
|
|
||||||
|
mov si,[bp] ; get address of format string
|
||||||
|
sub bp,2
|
||||||
|
mov bx,sp
|
||||||
|
mov ds,ss:20[bx] ; (ds:si) = address of format string
|
||||||
|
push cs
|
||||||
|
pop ds
|
||||||
|
|
||||||
|
; Scan format string for next character
|
||||||
|
;
|
||||||
|
; (ds:si) = address of format string
|
||||||
|
; (ss:bp) = address of next argument
|
||||||
|
|
||||||
|
dpf1: lodsb ; (al) = format string byte
|
||||||
|
and al,al
|
||||||
|
je dpf3 ; all done
|
||||||
|
cmp al,'$'
|
||||||
|
je dpf4 ; is data escape
|
||||||
|
cmp al,'\'
|
||||||
|
jnz dpf2 ; got the character
|
||||||
|
|
||||||
|
; it's an "\" escape code - crack the argument character
|
||||||
|
|
||||||
|
lodsb
|
||||||
|
and al,al
|
||||||
|
je dpf3 ; all done, ignore hanging \
|
||||||
|
xchg ah,al
|
||||||
|
mov al,0Ch
|
||||||
|
cmp ah,'n'
|
||||||
|
jne dpf1$5 ; not \n
|
||||||
|
mov al,0dH
|
||||||
|
call putchar
|
||||||
|
mov al,0aH
|
||||||
|
jmp SHORT dpf2 ; print LF
|
||||||
|
|
||||||
|
dpf1$5: cmp ah,'t'
|
||||||
|
mov al,9
|
||||||
|
je dpf2 ; is \t
|
||||||
|
cmp ah,'b'
|
||||||
|
mov al,7
|
||||||
|
je dpf2 ; is \b
|
||||||
|
xchg ah,al
|
||||||
|
dpf2: call putchar
|
||||||
|
jmp dpf1
|
||||||
|
|
||||||
|
; have the end of the format string - exit
|
||||||
|
|
||||||
|
dpf3: pop ax
|
||||||
|
pop bx
|
||||||
|
pop cx
|
||||||
|
pop dx
|
||||||
|
pop si
|
||||||
|
pop di
|
||||||
|
pop bp
|
||||||
|
pop es
|
||||||
|
pop ds
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
;* Have a '$' character - is data format escape
|
||||||
|
;
|
||||||
|
; Get address of data into es:di
|
||||||
|
;
|
||||||
|
; (bp) = address of data value
|
||||||
|
|
||||||
|
dpf4: mov di,bp
|
||||||
|
push ss
|
||||||
|
pop es ; (es:di) = address of data value
|
||||||
|
sub bp,2 ; point to next argument
|
||||||
|
lodsb ; (al) = format specifier
|
||||||
|
cmp al,'@'
|
||||||
|
jne dpf5 ; not an indirect flag
|
||||||
|
les di,[bp]
|
||||||
|
sub bp,2 ; have an extra 2 for @
|
||||||
|
lodsb
|
||||||
|
dpf5: cmp al,'x'
|
||||||
|
jne dpfd1 ; not 'x'
|
||||||
|
|
||||||
|
; is 'x' format - print hex word
|
||||||
|
|
||||||
|
mov ax,es:[di]
|
||||||
|
call THW ; type hex word
|
||||||
|
jmp dpf1
|
||||||
|
|
||||||
|
dpfd1: cmp al,'d'
|
||||||
|
jnz dpfc1 ; not 'd'
|
||||||
|
|
||||||
|
; is 'd' format - print decimal word
|
||||||
|
|
||||||
|
mov ax,es:[di]
|
||||||
|
call TDW ; type decimal word
|
||||||
|
jmp dpf1
|
||||||
|
|
||||||
|
dpfc1: cmp al,'c'
|
||||||
|
jne dpfb1
|
||||||
|
|
||||||
|
; is 'c' format - print character
|
||||||
|
|
||||||
|
mov al,es:[di]
|
||||||
|
call putchar
|
||||||
|
jmp dpf1
|
||||||
|
|
||||||
|
dpfb1: cmp al,'b'
|
||||||
|
jne dpfs1
|
||||||
|
|
||||||
|
; is 'b' format - print hex byte
|
||||||
|
|
||||||
|
mov al,es:[di]
|
||||||
|
call THB ; type hex byte
|
||||||
|
jmp dpf1
|
||||||
|
|
||||||
|
dpfs1: cmp al,'s'
|
||||||
|
jne dpfbb1
|
||||||
|
|
||||||
|
; is 's' format - print ASCIZ string. First, check for
|
||||||
|
; optional decimal limit
|
||||||
|
|
||||||
|
public SSB
|
||||||
|
SSB: sub cx,cx ; set 65536 limit
|
||||||
|
les di,[bp] ; (es:DI) = fwa of string
|
||||||
|
sub bp,2 ; argument to 's' was two words
|
||||||
|
mov al,[si]
|
||||||
|
cmp al,'0'
|
||||||
|
jb dpfs2 ; not decimal
|
||||||
|
cmp al,'9'
|
||||||
|
ja dpfs2 ; not decimal
|
||||||
|
call atod ; (ax) = decimal value, (ds:si) updated
|
||||||
|
xchg cx,ax
|
||||||
|
|
||||||
|
; print asciz string at es:di, max of (cx) characters
|
||||||
|
; (cx) = 0 means max of 65536
|
||||||
|
;
|
||||||
|
; Other sections of code in dpf jump here to print strings
|
||||||
|
|
||||||
|
dpfs2: mov al,es:[di]
|
||||||
|
inc di
|
||||||
|
and al,al
|
||||||
|
je dpfs3
|
||||||
|
call putchar
|
||||||
|
loop dpfs2 ; continue if not at limit
|
||||||
|
dpfs3: jmp dpf1
|
||||||
|
|
||||||
|
dpfbb1: cmp al,'B'
|
||||||
|
je dpfbb2 ; is 'B' format
|
||||||
|
|
||||||
|
; error in format code - print message
|
||||||
|
|
||||||
|
dpferr: push cs
|
||||||
|
pop es
|
||||||
|
mov di,OFFSET dpfa ; (es:di) = error message
|
||||||
|
sub cx,cx
|
||||||
|
jmp dpfs2
|
||||||
|
|
||||||
|
dpfa: DB '%% BAD FMT %%',0
|
||||||
|
|
||||||
|
; have B format
|
||||||
|
|
||||||
|
dpfbb2: call atod ; (ax) = length specifier
|
||||||
|
jc dpferr ; number not there - error
|
||||||
|
xchg cx,ax
|
||||||
|
jcxz dpferr ; number is 0 - error
|
||||||
|
les di,[bp] ; (es:DI) = fwa of string
|
||||||
|
sub bp,2 ; argument to 's' was two words
|
||||||
|
dpfbb3: mov al,es:[di]
|
||||||
|
call THB ; type hex byte
|
||||||
|
mov al,' '
|
||||||
|
call putchar ; space em out
|
||||||
|
inc di
|
||||||
|
loop dpfbb3 ; do em all
|
||||||
|
jmp dpf1
|
||||||
|
|
||||||
|
DPRINTF ENDP
|
||||||
|
|
||||||
|
|
||||||
|
;** THB - Type Hex Byte
|
||||||
|
;
|
||||||
|
; THB types a hex byte (via "putchar")
|
||||||
|
;
|
||||||
|
; ENTRY (AL) = byte
|
||||||
|
; EXIT none
|
||||||
|
; USES ax, flags
|
||||||
|
|
||||||
|
THBA DB '0123456789abcdef'
|
||||||
|
|
||||||
|
PUBLIC THB
|
||||||
|
THB PROC near
|
||||||
|
|
||||||
|
push ax
|
||||||
|
shr al,1
|
||||||
|
shr al,1
|
||||||
|
shr al,1
|
||||||
|
shr al,1
|
||||||
|
and ax,0fH
|
||||||
|
xchg bx,ax
|
||||||
|
mov bl,CS:THBA[bx]
|
||||||
|
xchg ax,bx
|
||||||
|
call putchar ; put first character
|
||||||
|
pop ax
|
||||||
|
and ax,0fH
|
||||||
|
xchg bx,ax
|
||||||
|
mov bl,CS:THBA[bx]
|
||||||
|
xchg ax,bx
|
||||||
|
call putchar
|
||||||
|
ret
|
||||||
|
|
||||||
|
THB ENDP
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;** THW - Type Hex Word
|
||||||
|
;
|
||||||
|
; THW types a word in hex (via "putchar")
|
||||||
|
;
|
||||||
|
; ENTRY (AX) = word
|
||||||
|
; EXIT none
|
||||||
|
; USES AX, flags
|
||||||
|
|
||||||
|
PUBLIC THW
|
||||||
|
THW PROC near
|
||||||
|
|
||||||
|
push ax
|
||||||
|
xchg ah,al
|
||||||
|
call THB
|
||||||
|
pop ax
|
||||||
|
call THB
|
||||||
|
ret
|
||||||
|
|
||||||
|
THW ENDP
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;** TDW - Type Decimal Word
|
||||||
|
;
|
||||||
|
; TDW types (via "putchar") the unsigned decimal representation
|
||||||
|
; of a 16-bit unsigned integer. Only significant digits are
|
||||||
|
; printed; if the number is 0 a "0" is printed.
|
||||||
|
;
|
||||||
|
; ENTRY (AX) = number
|
||||||
|
; EXIT none
|
||||||
|
; USES AX, flags
|
||||||
|
|
||||||
|
PUBLIC TDW
|
||||||
|
TDW PROC near
|
||||||
|
|
||||||
|
push cx ; preserve registers
|
||||||
|
push dx
|
||||||
|
mov cx,10
|
||||||
|
call tdw$ ; recurse cracking digits
|
||||||
|
pop dx
|
||||||
|
pop cx
|
||||||
|
ret
|
||||||
|
|
||||||
|
TDW ENDP
|
||||||
|
|
||||||
|
|
||||||
|
;* tdw$ - crack number recursively
|
||||||
|
;
|
||||||
|
; tdw$ cracks the least significant decimal digit. If there
|
||||||
|
; are no higher-significant digits, print and return.
|
||||||
|
; else, recurse for higher digits
|
||||||
|
;
|
||||||
|
; (AX) = value
|
||||||
|
; (CX) = 10
|
||||||
|
|
||||||
|
tdw$ PROC NEAR
|
||||||
|
|
||||||
|
sub dx,dx
|
||||||
|
div cx ; (ax) = quotient, (dx) = remainder
|
||||||
|
and ax,ax
|
||||||
|
jz tdw$1 ; this is highest-order, do it
|
||||||
|
push dx
|
||||||
|
call tdw$
|
||||||
|
pop dx
|
||||||
|
tdw$1: xchg ax,dx
|
||||||
|
add al,'0'
|
||||||
|
call putchar
|
||||||
|
ret
|
||||||
|
|
||||||
|
TDW$ ENDP
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;** ATOD - Convert ASCII string to decimal number
|
||||||
|
;
|
||||||
|
; ATOD is called to convert an ascii string of digits to a
|
||||||
|
; decimal number. Digits are converted until we run out of them.
|
||||||
|
;
|
||||||
|
; ENTRY (DS:SI) = address of first digit
|
||||||
|
; EXIT 'C' clear if OK
|
||||||
|
; (AX) = value
|
||||||
|
; (SI) updated to first non-digit
|
||||||
|
; 'C' set if error - no digits, or result >65535
|
||||||
|
; (DS:SI) points to error character
|
||||||
|
; USES AX, SI, FLAGS
|
||||||
|
|
||||||
|
PUBLIC ATOD
|
||||||
|
ATOD PROC near
|
||||||
|
|
||||||
|
push dx
|
||||||
|
push cx ; save registers
|
||||||
|
mov al,[si]
|
||||||
|
sub al,'0'
|
||||||
|
jc atod9 ; error - no digits
|
||||||
|
cmp al,10
|
||||||
|
cmc
|
||||||
|
jc atod9 ; error - no digits
|
||||||
|
sub ax,ax ; clear accumulator
|
||||||
|
mov cx,10 ; base 10
|
||||||
|
|
||||||
|
; crack next digit
|
||||||
|
;
|
||||||
|
; (AX) = number accumulated so near
|
||||||
|
; (CX) = 10
|
||||||
|
; (DS:SI) = next character
|
||||||
|
|
||||||
|
atod1: xchg dx,ax ; keep accum in dx for a while
|
||||||
|
lodsb ; (al) = character
|
||||||
|
sub al,'0'
|
||||||
|
jc atod7 ; not digit - all done
|
||||||
|
cmp al,9
|
||||||
|
ja atod7 ; not digit - all done
|
||||||
|
sub ah,ah ; (ax) = digit value (0 - 9)
|
||||||
|
push ax
|
||||||
|
xchg ax,dx
|
||||||
|
mul cx ; (ax) = 10*accum
|
||||||
|
pop dx ; (dx) = digit to add
|
||||||
|
jo atod8 ; overflow
|
||||||
|
add ax,dx
|
||||||
|
jmp atod1 ; go back for more
|
||||||
|
|
||||||
|
; Done with number, all OK
|
||||||
|
;
|
||||||
|
; (dx) = number
|
||||||
|
; (ds:si) = address+1 of first unused character
|
||||||
|
|
||||||
|
atod7: clc
|
||||||
|
|
||||||
|
; Done with number, error
|
||||||
|
; 'C' set
|
||||||
|
|
||||||
|
atod8: dec si ; backup over non-decimal (or error) char
|
||||||
|
atod9: pop cx
|
||||||
|
xchg ax,dx ; (ax) = number iff no error
|
||||||
|
pop dx ; restore registers
|
||||||
|
ret ; exit
|
||||||
|
|
||||||
|
ATOD ENDP
|
||||||
|
|
||||||
|
;** putchar - put a character on the console
|
||||||
|
;
|
||||||
|
; ENTRY (al) = character
|
||||||
|
; EXIT none
|
||||||
|
; USES ax,flags
|
||||||
|
|
||||||
|
|
||||||
|
UR_DAT = 02f8H ; COM1 = 03f8H, COM2 = 02f8H
|
||||||
|
UR_IEN = UR_DAT+1 ; Interrupt enable
|
||||||
|
UR_IER = UR_DAT+2 ; interrupt ID
|
||||||
|
UR_LCR = UR_DAT+3 ; line control registers
|
||||||
|
UR_MCR = UR_DAT+4 ; modem control register
|
||||||
|
UR_LSR = UR_DAT+5 ; line status register
|
||||||
|
UR_MSR = UR_DAT+6 ; modem status regiser
|
||||||
|
UR_DLL = UR_DAT ; divisor latch least sig
|
||||||
|
UR_DLM = UR_DAT+1 ; divisor latch most sig
|
||||||
|
|
||||||
|
iflag DB 0 ; != 0 when initialized 8250
|
||||||
|
|
||||||
|
;* inchr - input character
|
||||||
|
;
|
||||||
|
; EXIT 'z' set if no character
|
||||||
|
; 'z' clear if char
|
||||||
|
; (al) = char
|
||||||
|
|
||||||
|
inchr: mov dx,UR_LSR
|
||||||
|
in al,dx
|
||||||
|
and al,1
|
||||||
|
jz inchr1
|
||||||
|
mov dx,UR_DAT
|
||||||
|
in al,dx
|
||||||
|
and al,07fh
|
||||||
|
inchr1: ret
|
||||||
|
|
||||||
|
|
||||||
|
PUBLIC putchar
|
||||||
|
putchar PROC NEAR
|
||||||
|
pushf
|
||||||
|
cli
|
||||||
|
push dx
|
||||||
|
push cx
|
||||||
|
push bx
|
||||||
|
push ax ; (al) = character
|
||||||
|
test iflag,255
|
||||||
|
jnz putc1 ; is initialized
|
||||||
|
inc iflag
|
||||||
|
|
||||||
|
; program the usart
|
||||||
|
|
||||||
|
mov dx,UR_LCR
|
||||||
|
mov al,80h
|
||||||
|
out dx,al ; command it
|
||||||
|
sub al,al
|
||||||
|
mov dx,UR_DLM
|
||||||
|
out dx,al
|
||||||
|
mov dx,UR_DLL
|
||||||
|
mov al,12 ; 9600 baud = 12, 19.2 Kbaud = 6
|
||||||
|
out dx,al
|
||||||
|
mov al,3
|
||||||
|
mov dx,UR_LCR
|
||||||
|
out dx,al ; command normal mode
|
||||||
|
|
||||||
|
; see if CTL-Q or CTL-S
|
||||||
|
|
||||||
|
putc1: pushf
|
||||||
|
cli
|
||||||
|
call inchr
|
||||||
|
jz putc3 ; no characters incomming
|
||||||
|
cmp al,19 ; ctl-S?
|
||||||
|
jnz putc3 ; no, ignore
|
||||||
|
|
||||||
|
; have ctl-s. wait till we see ctl-Q
|
||||||
|
|
||||||
|
putc2: call inchr
|
||||||
|
jz putc2
|
||||||
|
cmp al,17
|
||||||
|
jnz putc2
|
||||||
|
|
||||||
|
putc3: popf
|
||||||
|
mov dx,UR_LSR
|
||||||
|
putc4: in al,dx
|
||||||
|
test al,020h
|
||||||
|
jz putc4
|
||||||
|
|
||||||
|
; ready. crank it out!
|
||||||
|
|
||||||
|
mov dx,UR_DAT
|
||||||
|
|
||||||
|
pop ax
|
||||||
|
out dx,al
|
||||||
|
|
||||||
|
pop bx
|
||||||
|
pop cx
|
||||||
|
pop dx
|
||||||
|
popf
|
||||||
|
ret
|
||||||
|
|
||||||
|
putchar ENDP
|
||||||
|
|
||||||
|
ENDIF
|
122
v4.0-ozzie/bin/DISK2/BIOS/DEFDBUG.INC
Normal file
122
v4.0-ozzie/bin/DISK2/BIOS/DEFDBUG.INC
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
;** DEFDBUG.ASM - Debugging Macro Definitions
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; DEBUG n,m,<format string>, <arg list>
|
||||||
|
;
|
||||||
|
;
|
||||||
|
|
||||||
|
.sall
|
||||||
|
|
||||||
|
DEBUG MACRO N,M,string,args
|
||||||
|
local b,c
|
||||||
|
IFDEF DEBUGFLG
|
||||||
|
pushf
|
||||||
|
DEBUGTST N,M
|
||||||
|
jz b
|
||||||
|
push ax
|
||||||
|
push bp
|
||||||
|
call c ;; push address of string
|
||||||
|
DB '&string',0
|
||||||
|
c: mov bp,sp
|
||||||
|
; IFNB <args>
|
||||||
|
IRP Y,<args>
|
||||||
|
IFIDN <Y>,<ax>
|
||||||
|
push 4[bp]
|
||||||
|
ELSE
|
||||||
|
IFIDN <Y>,<AX>
|
||||||
|
push 4[bp]
|
||||||
|
ELSE
|
||||||
|
IFIDN <Y>,<bp>
|
||||||
|
push 2[bp]
|
||||||
|
ELSE
|
||||||
|
IFIDN <Y>,<BP>
|
||||||
|
push 2[bp]
|
||||||
|
ELSE
|
||||||
|
mov ax,Y
|
||||||
|
push ax
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
ENDM
|
||||||
|
; ENDIF
|
||||||
|
call DPRINTF
|
||||||
|
mov sp,bp
|
||||||
|
pop ax ;; discard format string offset
|
||||||
|
pop bp
|
||||||
|
pop ax
|
||||||
|
b: popf
|
||||||
|
ENDIF
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;** ERRNZ - generate assembly error if arg != 0
|
||||||
|
;
|
||||||
|
|
||||||
|
ERRNZ MACRO EXPR
|
||||||
|
IF1
|
||||||
|
IFE expr
|
||||||
|
ELSE
|
||||||
|
RADIX 0 ; CONDITION NOT MET - ERROR
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
|
||||||
|
;** DBBEG - Start debugging range
|
||||||
|
;
|
||||||
|
|
||||||
|
DBBEG MACRO N,M
|
||||||
|
LOCAL lab
|
||||||
|
IFDEF DEBUGFLG
|
||||||
|
pushf
|
||||||
|
DEBUGTST N,M
|
||||||
|
jnz lab ;; am to do it
|
||||||
|
DBJMP %DBCNT
|
||||||
|
lab:
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DBJMP MACRO N
|
||||||
|
jmp DBLAB&N
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
|
||||||
|
;** DEBUGTST - Test Debug Flags
|
||||||
|
;
|
||||||
|
; DEBUGTST n,m
|
||||||
|
;
|
||||||
|
; Where N and M are bit masks.
|
||||||
|
;
|
||||||
|
; If one or more of the bits in N is set in the high byte
|
||||||
|
; of BUGBITS, and one or more of the bits in M is set in
|
||||||
|
; the low byte of BUGBITS then clear the Z flag.
|
||||||
|
;
|
||||||
|
; In other words:
|
||||||
|
;
|
||||||
|
; If both masks show a "hit" clear 'Z' else set 'Z'
|
||||||
|
;
|
||||||
|
; USES FLAGS
|
||||||
|
|
||||||
|
DEBUGTST MACRO N,M
|
||||||
|
LOCAL A
|
||||||
|
test BYTE PTR BUGBITS,n
|
||||||
|
jz A
|
||||||
|
test BYTE PTR BUGBITS+1,m
|
||||||
|
A:
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
DBEND MACRO
|
||||||
|
DBLAB %DBCNT
|
||||||
|
DBCNT = DBCNT+1
|
||||||
|
popf
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
DBLAB MACRO N
|
||||||
|
DBLAB&N:
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
DBCNT = 1
|
2214
v4.0-ozzie/bin/DISK2/BIOS/IBMBIO.ASM
Normal file
2214
v4.0-ozzie/bin/DISK2/BIOS/IBMBIO.ASM
Normal file
File diff suppressed because it is too large
Load Diff
BIN
v4.0-ozzie/bin/DISK2/BIOS/IBMBIO.OBJ
Normal file
BIN
v4.0-ozzie/bin/DISK2/BIOS/IBMBIO.OBJ
Normal file
Binary file not shown.
2551
v4.0-ozzie/bin/DISK2/BIOS/IBMDSK.ASM
Normal file
2551
v4.0-ozzie/bin/DISK2/BIOS/IBMDSK.ASM
Normal file
File diff suppressed because it is too large
Load Diff
BIN
v4.0-ozzie/bin/DISK2/BIOS/IBMDSK.OBJ
Normal file
BIN
v4.0-ozzie/bin/DISK2/BIOS/IBMDSK.OBJ
Normal file
Binary file not shown.
1424
v4.0-ozzie/bin/DISK2/BIOS/IBMMTCON.ASM
Normal file
1424
v4.0-ozzie/bin/DISK2/BIOS/IBMMTCON.ASM
Normal file
File diff suppressed because it is too large
Load Diff
BIN
v4.0-ozzie/bin/DISK2/BIOS/IBMMTCON.OBJ
Normal file
BIN
v4.0-ozzie/bin/DISK2/BIOS/IBMMTCON.OBJ
Normal file
Binary file not shown.
25
v4.0-ozzie/bin/DISK2/BIOS/READ_ME
Normal file
25
v4.0-ozzie/bin/DISK2/BIOS/READ_ME
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
29 May 1984
|
||||||
|
|
||||||
|
The object files given here are sufficient to create the BIOS
|
||||||
|
for the IBM system. Some sources are given as examples for
|
||||||
|
OEM supplied device drivers. These sources do not necessarily
|
||||||
|
implement all the features described in the device driver
|
||||||
|
documentation. They have evolved in parallel with the
|
||||||
|
documentation, so some features described in the documentation
|
||||||
|
may not yet be present in the drivers. Below is a summary of
|
||||||
|
the files supplied:
|
||||||
|
|
||||||
|
read_me This file.
|
||||||
|
ibmbio.asm Main body of the BIOS.
|
||||||
|
ibmdsk.asm Floppy and Hard disk drivers.
|
||||||
|
ibmmtcon.asm Multi-screen console driver.
|
||||||
|
ansi.inc ANSI X3.64 terminal emulation.
|
||||||
|
bugcode.inc Module which implements debugging
|
||||||
|
prints. The routine PUTC must be
|
||||||
|
modified for other devices. See
|
||||||
|
also the file DEFDBUG.INC.
|
||||||
|
sys*.obj The SYSINIT program. No source supplied.
|
||||||
|
biosobj.mak Contains instructions for building the
|
||||||
|
IBM BIOS.
|
||||||
|
bootpach.exe Modifies a V2.0 boot sector (on A:) for
|
||||||
|
the IBM to accomodate the larger BIOS.
|
BIN
v4.0-ozzie/bin/DISK2/BIOS/SYSIMES.OBJ
Normal file
BIN
v4.0-ozzie/bin/DISK2/BIOS/SYSIMES.OBJ
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DISK2/BIOS/SYSINI.OBJ
Normal file
BIN
v4.0-ozzie/bin/DISK2/BIOS/SYSINI.OBJ
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DRDOS1.IMD
Normal file
BIN
v4.0-ozzie/bin/DRDOS1.IMD
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DRDOS1_IMD.img
Normal file
BIN
v4.0-ozzie/bin/DRDOS1_IMD.img
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DRDOS2.IMD
Normal file
BIN
v4.0-ozzie/bin/DRDOS2.IMD
Normal file
Binary file not shown.
BIN
v4.0-ozzie/bin/DRDOS2_IMD.img
Normal file
BIN
v4.0-ozzie/bin/DRDOS2_IMD.img
Normal file
Binary file not shown.
21
v4.0/LICENSE
Normal file
21
v4.0/LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) IBM and Microsoft Corporation.
|
||||||
|
|
||||||
|
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, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
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
|
103
v4.0/src/BIOS/BIOSTRUC.INC
Normal file
103
v4.0/src/BIOS/BIOSTRUC.INC
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
%OUT BIOSTRUC.INC...
|
||||||
|
; SCCSID = @(#)BIOSTRUC.INC 1.0 86/09/30
|
||||||
|
; ROM BIOS CALL PACKET STRUCTURES
|
||||||
|
|
||||||
|
;*******************************
|
||||||
|
;System Service call ( Int 15h )
|
||||||
|
;*******************************
|
||||||
|
;Function AH = 0C0h, Return system configuration
|
||||||
|
;For PC and PCJR on return:
|
||||||
|
; (AH) = 80h
|
||||||
|
; (CY) = 1
|
||||||
|
;For PCXT, PC PORTABLE and PCAT on return:
|
||||||
|
; (AH) = 86h
|
||||||
|
; (CY) = 1
|
||||||
|
;For all others:
|
||||||
|
; (AH) = 0
|
||||||
|
; (CY) = 0
|
||||||
|
; (ES:BX) = pointer to system descriptor vector in ROS
|
||||||
|
; System descriptor :
|
||||||
|
; DW xxxx length of descriptor in bytes,
|
||||||
|
; minimum length = 8
|
||||||
|
; DB xx model byte
|
||||||
|
; 0FFh = PC
|
||||||
|
; 0FEh = PC/XT, Portable
|
||||||
|
; 0FDh = PC/JR
|
||||||
|
; 0FCh = PC/AT, 6Mhz PC/AT,
|
||||||
|
; 6Mhz PC/AT running coprocessor(?),
|
||||||
|
; PS/2 Model 50, 50 z
|
||||||
|
; 0FAh = PS/2 Model 25, 30
|
||||||
|
; 0F9h = PC Convertible
|
||||||
|
; 0F8h = PS/2 Model 80
|
||||||
|
; 0F7h = Nova
|
||||||
|
; 0E0 thru 0EFh = reserved
|
||||||
|
;
|
||||||
|
; DB xx secondary model byte
|
||||||
|
; 000h = PC1
|
||||||
|
; 000h = PC/XT, Portable
|
||||||
|
; 000h = PC/JR
|
||||||
|
; 000h = PC/AT
|
||||||
|
; 001h = 6Mhz PC/AT
|
||||||
|
; 003h = 6Mhz PC/AT running coprocessor(?)
|
||||||
|
; 004h = PS/2 Model 50, 50z
|
||||||
|
; 001h = PS/2 Model 25
|
||||||
|
; 000h = PC Convertible
|
||||||
|
; 000h = PS/2 Model 80
|
||||||
|
; 000h = Nova
|
||||||
|
;
|
||||||
|
; DB xx bios revision level
|
||||||
|
; 00 for first release, subsequent release
|
||||||
|
; of code with same model byte and
|
||||||
|
; secondary model byte require revison level
|
||||||
|
; to increase by one.
|
||||||
|
;
|
||||||
|
; DB xx feature information byte 1
|
||||||
|
; X0000000 = 1, bios use DMA channel 3
|
||||||
|
; = 0, DMA channel 3 not used
|
||||||
|
;
|
||||||
|
; 0X000000 = 1, 2nd Interrupt chip present
|
||||||
|
; = 0, 2nd Interrupt chip not present
|
||||||
|
;
|
||||||
|
; 00X00000 = 1, Real Time Clock present
|
||||||
|
; = 0, Real Time Clock not present
|
||||||
|
;
|
||||||
|
; 000X0000 = 1, Keyboard escape sequence(INT15h)
|
||||||
|
; called in keyboard interrupt
|
||||||
|
; (Int 09h).
|
||||||
|
; = 0, Keyboard escape sequence not
|
||||||
|
; called.
|
||||||
|
; 0000XXXX reserved
|
||||||
|
;
|
||||||
|
; DB xx feature information byte 2 - reserved
|
||||||
|
;
|
||||||
|
; DB xx feature information byte 2 - reserved
|
||||||
|
;
|
||||||
|
; DB xx feature information byte 2 - reserved
|
||||||
|
;
|
||||||
|
; DB xx feature information byte 2 - reserved
|
||||||
|
;
|
||||||
|
|
||||||
|
BIOS_SYSTEM_DESCRIPTOR struc
|
||||||
|
bios_SD_leng dw ?
|
||||||
|
bios_SD_modelbyte db ?
|
||||||
|
bios_SD_scnd_modelbyte db ?
|
||||||
|
db ?
|
||||||
|
bios_SD_featurebyte1 db ?
|
||||||
|
db 4 dup (?)
|
||||||
|
BIOS_SYSTEM_DESCRIPTOR ends
|
||||||
|
|
||||||
|
;FeatureByte1 bit map equates
|
||||||
|
DMAchannel3 equ 10000000b
|
||||||
|
ScndIntController equ 01000000b
|
||||||
|
RealTimeClock equ 00100000b
|
||||||
|
KeyEscapeSeq equ 00010000b
|
||||||
|
;
|
||||||
|
;Model Byte
|
||||||
|
MDL_PC1 EQU 0FFH
|
||||||
|
MDL_XT EQU 0FEH
|
||||||
|
MDL_JR EQU 0FDH
|
||||||
|
MDL_AT EQU 0FCH
|
||||||
|
MDL_CONVERT EQU 0F9H
|
||||||
|
|
||||||
|
mdl_ps2_30 equ 0fah
|
||||||
|
mdl_ps2_80 equ 0f8h
|
78
v4.0/src/BIOS/CLOCKSUB.INC
Normal file
78
v4.0/src/BIOS/CLOCKSUB.INC
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
;
|
||||||
|
; date_verify loosely checks bcd date values to be in range in bin_date_time
|
||||||
|
;
|
||||||
|
date_verify: ;
|
||||||
|
assume ds:code,es:nothing
|
||||||
|
cmp byte ptr bin_date_time+0,20h ; century check
|
||||||
|
ja date_error ; jmp error
|
||||||
|
jz century_20 ; jmp in 20th century
|
||||||
|
cmp byte ptr bin_date_time+0,19h ; century check
|
||||||
|
jb date_error ; jmp error
|
||||||
|
cmp byte ptr bin_date_time+1,80h ; year check
|
||||||
|
jb date_error ; jmp error
|
||||||
|
century_20: ;
|
||||||
|
cmp byte ptr bin_date_time+1,99h ; year check
|
||||||
|
ja date_error ; jmp error
|
||||||
|
cmp byte ptr bin_date_time+2,12h ; month check
|
||||||
|
ja date_error ; jmp error
|
||||||
|
cmp byte ptr bin_date_time+2,00h ; month check
|
||||||
|
jbe date_error ; jmp error
|
||||||
|
cmp byte ptr bin_date_time+3,31h ; day check
|
||||||
|
ja date_error ; jmp error
|
||||||
|
cmp byte ptr bin_date_time+3,00h ; day check
|
||||||
|
jbe date_error ; jmp error
|
||||||
|
clc ; set success flag
|
||||||
|
ret ;
|
||||||
|
date_error: ;
|
||||||
|
stc ; set error flag
|
||||||
|
ret ;
|
||||||
|
|
||||||
|
;
|
||||||
|
; time_verify very loosely checks bcd date values to be in range in bin_date_time
|
||||||
|
;
|
||||||
|
time_verify:
|
||||||
|
assume ds:code,es:nothing
|
||||||
|
cmp byte ptr bin_date_time+0,24H
|
||||||
|
ja time_error
|
||||||
|
cmp byte ptr bin_date_time+1,59H
|
||||||
|
ja time_error
|
||||||
|
cmp byte ptr bin_date_time+2,59H
|
||||||
|
ja time_error
|
||||||
|
clc
|
||||||
|
ret
|
||||||
|
time_error:
|
||||||
|
stc
|
||||||
|
ret
|
||||||
|
|
||||||
|
;
|
||||||
|
; bcd_verify checks values in bin_date_time to be valid
|
||||||
|
; bcd numerals. carry set if any nibble out of range
|
||||||
|
;
|
||||||
|
bcd_verify: ;
|
||||||
|
assume ds:code,es:nothing
|
||||||
|
mov cx,4 ; 4 bytes to check
|
||||||
|
mov bx,offset bin_date_time ;
|
||||||
|
bv_loop: ;
|
||||||
|
mov al,[bx] ; get a bcd number (0..99)
|
||||||
|
mov ah,al ;
|
||||||
|
and ax,0f00fh ; 10's place in high ah, 1's in al
|
||||||
|
cmp al,10 ; is 1's place in range?
|
||||||
|
ja bv_error ; jmp out of range
|
||||||
|
shr ah,1 ; swap nibbles
|
||||||
|
shr ah,1 ; ...
|
||||||
|
shr ah,1 ; ...
|
||||||
|
shr ah,1 ; ...
|
||||||
|
and ah,0fh ; get rid of any erroneous bits
|
||||||
|
cmp ah,10 ; is 10's place in range
|
||||||
|
ja bv_error ; jmp out of range
|
||||||
|
inc bx ; next byte
|
||||||
|
dec cx ;
|
||||||
|
jnz bv_loop ;
|
||||||
|
clc ; set success flag
|
||||||
|
ret ;
|
||||||
|
bv_error: ;
|
||||||
|
stc ; set error flag
|
||||||
|
ret ;
|
||||||
|
;
|
||||||
|
; Dos 3.30 - The real time clock structures were moved to msbio2.asm
|
||||||
|
;
|
50
v4.0/src/BIOS/CMOSEQU.INC
Normal file
50
v4.0/src/BIOS/CMOSEQU.INC
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
;;Rev 3.30 Modification
|
||||||
|
;Equates for CMOS.
|
||||||
|
|
||||||
|
;----------------------------------------
|
||||||
|
; CMOS EQUATES FOR THIS SYSTEM :
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
CMOS_PORT EQU 070H ; I/O ADDRESS OF CMOS ADDRESS PORT
|
||||||
|
CMOS_DATA EQU 071H ; I/O ADDRESS OF CMOS DATA PORT
|
||||||
|
NMI EQU 10000000B ; DISABLE NMI INTERRUPTS MASK -
|
||||||
|
; HIGH BIT OF CMOS LOCATION ADDRESS
|
||||||
|
|
||||||
|
;---------- CMOS TABLE LOCATION ADDRESS'S ## -----------------------------------
|
||||||
|
CMOS_SECONDS EQU 000H ; SECONDS
|
||||||
|
CMOS_SEC_ALARM EQU 001H ; SECONDS ALARM ## NOTE: ALL LOCATIONS
|
||||||
|
CMOS_MINUTES EQU 002H ; MINUTES | IN THE CMOS AREA
|
||||||
|
CMOS_MIN_ALARM EQU 003H ; MINUTES ALARM | ARE IBM USE ONLY
|
||||||
|
CMOS_HOURS EQU 004H ; HOURS | AND SUBJECT TO
|
||||||
|
CMOS_HR_ALARM EQU 005H ; HOURS ALARM | CHANGE. ONLY THE
|
||||||
|
CMOS_DAY_WEEK EQU 006H ; DAY OF THE WEEK | POST & BIOS CODE
|
||||||
|
CMOS_DAY_MONTH EQU 007H ; DAY OF THE MONTH | SHOULD DIRECTLY
|
||||||
|
CMOS_MONTH EQU 008H ; MONTH | ACCESS LOCATIONS
|
||||||
|
CMOS_YEAR EQU 009H ; YEAR (TWO DIGITS) | IN CMOS STORAGE.
|
||||||
|
CMOS_REG_A EQU 00AH ; STATUS REGISTER A '-----------------
|
||||||
|
CMOS_REG_B EQU 00BH ; STATUS REGISTER B ALARM
|
||||||
|
CMOS_REG_C EQU 00CH ; STATUS REGISTER C FLAGS
|
||||||
|
CMOS_REG_D EQU 00DH ; STATUS REGISTER D BATTERY
|
||||||
|
CMOS_DIAG EQU 00EH ; POST DIAGNOSTIC STATUS RESULTS BYTE
|
||||||
|
CMOS_SHUT_DOWN EQU 00FH ; SHUTDOWN STATUS COMMAND BYTE
|
||||||
|
CMOS_DISKETTE EQU 010H ; DISKETTE DRIVE TYPE BYTE ;
|
||||||
|
; EQU 011H ; - RESERVED ;C
|
||||||
|
CMOS_DISK EQU 012H ; FIXED DISK TYPE BYTE ;H
|
||||||
|
; EQU 013H ; - RESERVED ;E
|
||||||
|
CMOS_EQUIP EQU 014H ; EQUIPMENT WORD LOW BYTE ;C
|
||||||
|
CMOS_B_M_S_LO EQU 015H ; BASE MEMORY SIZE - LOW BYTE (X1024) ;K
|
||||||
|
CMOS_B_M_S_HI EQU 016H ; BASE MEMORY SIZE - HIGH BYTE ;S
|
||||||
|
CMOS_E_M_S_LO EQU 017H ; EXPANSION MEMORY SIZE - LOW BYTE ;U
|
||||||
|
CMOS_E_M_S_HI EQU 018H ; EXPANSION MEMORY SIZE - HIGH BYTE ;M
|
||||||
|
CMOS_DISK_1 EQU 019H ; FIXED DISK TYPE - DRIVE C EXTENSION ;E
|
||||||
|
CMOS_DISK_2 EQU 01AH ; FIXED DISK TYPE - DRIVE D EXTENSION ;D
|
||||||
|
; EQU 01BH ; - 1BH THROUGH 2DH - RESERVED ;
|
||||||
|
CMOS_CKSUM_HI EQU 02EH ; CMOS CHECKSUM - HIGH BYTE ;*
|
||||||
|
CMOS_CKSUM_LO EQU 02FH ; CMOS CHECKSUM - LOW BYTE ;*
|
||||||
|
CMOS_U_M_S_LO EQU 030H ; USABLE MEMORY ABOVE 1 MEG - LOW BYTE
|
||||||
|
CMOS_U_M_S_HI EQU 031H ; USABLE MEMORY ABOVE 1 MEG - HIGH BYTE
|
||||||
|
CMOS_CENTURY EQU 032H ; DATE CENTURY BYTE (BCD)
|
||||||
|
CMOS_INFO128 EQU 033H ; 128KB INFORMATION STATUS FLAG BYTE
|
||||||
|
; EQU 034H ; - 34H THROUGH 3FH - RESERVED
|
||||||
|
;
|
||||||
|
;;End of Modification
|
||||||
|
|
33
v4.0/src/BIOS/DEFEMS.INC
Normal file
33
v4.0/src/BIOS/DEFEMS.INC
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
;J.K. This is a temporary version of EMS function definitions needed for
|
||||||
|
;IBMBIO SYSINIT.
|
||||||
|
|
||||||
|
EMS_INT equ 67h ;interrupt vector designated for EMS.
|
||||||
|
|
||||||
|
EMS_STATUS equ 40h ;status of memery manager
|
||||||
|
EQ_PAGES equ 42h ;get number of unallocated & total pages
|
||||||
|
E_GET_HANDLE equ 43h ;allocate pages
|
||||||
|
EMAP_L_TO_P equ 44h ;Map logical to physical page
|
||||||
|
EMAP_STATE equ 4Fh ;Mapping status
|
||||||
|
GET_MAP_STATE equ 00h
|
||||||
|
GET_MAP_SIZE equ 02h
|
||||||
|
SET_MAP_STATE equ 01h
|
||||||
|
EDE_ALLOCATE equ 45h ;deallocate pages
|
||||||
|
EMS_VERSION equ 46h ;Get EMM version number
|
||||||
|
GET_PAGE_FRAME equ 58h ;Get page frame address
|
||||||
|
GET_PAGEFRAME_TAB equ 00H
|
||||||
|
GET_NUM_PAGEFRAME equ 01H
|
||||||
|
EMS_HANDLE_NAME equ 53h
|
||||||
|
SET_HANDLE_NAME equ 01h
|
||||||
|
|
||||||
|
IBM_PAGE_ID equ 255 ;Physical page id that will be used by
|
||||||
|
;IBMBIO and IBMDOS for buffer manipulation.
|
||||||
|
|
||||||
|
;MAX_NUM_PAGEFRAME equ 12 ;maximum number of page frames IBMBIO can
|
||||||
|
;handle
|
||||||
|
|
||||||
|
MAX_NUM_PAGEFRAME equ 64 ;maximum number of page frames MSBIO can
|
||||||
|
;handle
|
||||||
|
|
||||||
|
EMSVERSION equ 40h ;4.0
|
||||||
|
|
||||||
|
|
23
v4.0/src/BIOS/DEVMARK.INC
Normal file
23
v4.0/src/BIOS/DEVMARK.INC
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
;Structure, Equtes for DEVMARK for MEM command.
|
||||||
|
|
||||||
|
DEVMARK struc
|
||||||
|
DEVMARK_ID db 0
|
||||||
|
DEVMARK_SEG dw 0
|
||||||
|
DEVMARK_SIZE dw 0
|
||||||
|
DEVMARK_DUM db 3 dup (?)
|
||||||
|
DEVMARK_FILENAME db 8 dup (' ')
|
||||||
|
DEVMARK ends
|
||||||
|
|
||||||
|
DEVMARK_STK equ 'S'
|
||||||
|
DEVMARK_DEVICE equ 'D'
|
||||||
|
DEVMARK_IFS equ 'I'
|
||||||
|
DEVMARK_BUF equ 'B'
|
||||||
|
DEVMARK_CDS equ 'L' ;lastdrive
|
||||||
|
DEVMARK_FILES equ 'F'
|
||||||
|
DEVMARK_FCBS equ 'X'
|
||||||
|
DEVMARK_INST equ 'T' ;used for SYSINIT BASE for INSTALL= command.
|
||||||
|
DEVMARK_EMS_STUB equ 'E'
|
||||||
|
|
||||||
|
SETBRKDONE equ 00000001b
|
||||||
|
FOR_DEVMARK equ 00000010b
|
||||||
|
NOT_FOR_DEVMARK equ 11111101b
|
31
v4.0/src/BIOS/JUMPMAC.INC
Normal file
31
v4.0/src/BIOS/JUMPMAC.INC
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
;;Rev 3.30 Modification
|
||||||
|
;
|
||||||
|
; given a label <lbl> either 2 byte jump to another label <lbl>_J
|
||||||
|
; if it is near enough or 3 byte jump to <lbl>
|
||||||
|
;
|
||||||
|
|
||||||
|
jump macro lbl
|
||||||
|
local a
|
||||||
|
.xcref
|
||||||
|
|
||||||
|
ifndef lbl&_j ;; is this the first invocation
|
||||||
|
a:
|
||||||
|
JMP lbl
|
||||||
|
ELSE
|
||||||
|
IF (lbl&_J GE $) OR ($-lbl&_J GT 126)
|
||||||
|
a:
|
||||||
|
JMP lbl ;; is the jump too far away?
|
||||||
|
ELSE
|
||||||
|
a:
|
||||||
|
JMP lbl&_J ;; do the short one...
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
lbl&_j = a
|
||||||
|
.cref
|
||||||
|
endm
|
||||||
|
.xcref jump
|
||||||
|
;REDEFINE THE ABOVE MACRO TO ALWAYS TRY A 3 BYTE NEAR JUMP
|
||||||
|
JUMP MACRO LBL
|
||||||
|
JMP LBL
|
||||||
|
ENDM ;;End of Modification
|
||||||
|
|
1
v4.0/src/BIOS/LOCSCR
Normal file
1
v4.0/src/BIOS/LOCSCR
Normal file
@ -0,0 +1 @@
|
|||||||
|
70
|
167
v4.0/src/BIOS/MAKEFILE
Normal file
167
v4.0/src/BIOS/MAKEFILE
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
#************************** makefile for bios ***************************
|
||||||
|
|
||||||
|
dest =io
|
||||||
|
msg =..\messages
|
||||||
|
dos =..\dos
|
||||||
|
inc =..\inc
|
||||||
|
hinc =..\h
|
||||||
|
|
||||||
|
#
|
||||||
|
####################### dependencies begin here. #########################
|
||||||
|
#
|
||||||
|
|
||||||
|
all: $(dest).sys
|
||||||
|
|
||||||
|
msbio.cl1: msbio.skl \
|
||||||
|
$(msg)\$(COUNTRY).msg
|
||||||
|
|
||||||
|
msload.obj: msload.asm \
|
||||||
|
makefile \
|
||||||
|
msbio.cl1 \
|
||||||
|
$(inc)\bootform.inc \
|
||||||
|
$(inc)\versiona.inc \
|
||||||
|
msload.inc
|
||||||
|
|
||||||
|
msload.com: msload.obj
|
||||||
|
link msload.obj,msload,,;
|
||||||
|
exe2bin msload.exe msload.com
|
||||||
|
|
||||||
|
msbio1.obj: msbio1.asm \
|
||||||
|
makefile \
|
||||||
|
msbdata.inc \
|
||||||
|
msgroup.inc \
|
||||||
|
jumpmac.inc \
|
||||||
|
pushpop.inc \
|
||||||
|
$(inc)\devsym.inc \
|
||||||
|
msdskpr.inc \
|
||||||
|
msmacro.inc
|
||||||
|
|
||||||
|
mscon.obj: mscon.asm \
|
||||||
|
makefile \
|
||||||
|
msgroup.inc \
|
||||||
|
jumpmac.inc \
|
||||||
|
msmacro.inc
|
||||||
|
|
||||||
|
msaux.obj: msaux.asm \
|
||||||
|
makefile \
|
||||||
|
msgroup.inc \
|
||||||
|
jumpmac.inc \
|
||||||
|
msmacro.inc
|
||||||
|
|
||||||
|
mslpt.obj: mslpt.asm \
|
||||||
|
makefile \
|
||||||
|
msgroup.inc \
|
||||||
|
msequ.inc \
|
||||||
|
$(inc)\msbds.inc \
|
||||||
|
msmacro.inc \
|
||||||
|
$(inc)\devsym.inc \
|
||||||
|
$(inc)\ioctl.inc $(inc)\bpb.inc
|
||||||
|
|
||||||
|
msclock.obj: msclock.asm \
|
||||||
|
makefile \
|
||||||
|
msgroup.inc \
|
||||||
|
msmacro.inc
|
||||||
|
|
||||||
|
msdisk.obj: msdisk.asm \
|
||||||
|
makefile \
|
||||||
|
msgroup.inc \
|
||||||
|
msequ.inc \
|
||||||
|
$(inc)\msbds.inc \
|
||||||
|
pushpop.inc \
|
||||||
|
msmacro.inc \
|
||||||
|
$(inc)\devsym.inc \
|
||||||
|
msdskpr.inc \
|
||||||
|
msioctl.inc $(inc)\ioctl.inc $(inc)\bpb.inc
|
||||||
|
|
||||||
|
msinit.obj: msinit.asm \
|
||||||
|
makefile \
|
||||||
|
msgroup.inc \
|
||||||
|
msdskpr.inc \
|
||||||
|
msequ.inc $(inc)\msbds.inc \
|
||||||
|
$(inc)\cputype.inc \
|
||||||
|
msmacro.inc \
|
||||||
|
readcloc.inc \
|
||||||
|
clocksub.inc \
|
||||||
|
msextrn.inc
|
||||||
|
|
||||||
|
|
||||||
|
sysinit1.obj: sysinit1.asm \
|
||||||
|
makefile \
|
||||||
|
msstack.inc \
|
||||||
|
msbio.cl4 \
|
||||||
|
msbio.cl5 \
|
||||||
|
stkinit.inc \
|
||||||
|
devmark.inc \
|
||||||
|
$(inc)\smifssym.inc \
|
||||||
|
$(inc)\devsym.inc \
|
||||||
|
$(inc)\ioctl.inc \
|
||||||
|
$(inc)\cputype.inc \
|
||||||
|
$(inc)\smdossym.inc $(inc)\dosmac.inc $(inc)\bpb.inc $(inc)\buffer.inc \
|
||||||
|
$(inc)\sysvar.inc $(inc)\vector.inc $(inc)\dirent.inc \
|
||||||
|
$(inc)\dpb.inc $(inc)\curdir.inc \
|
||||||
|
$(inc)\pdb.inc $(inc)\exe.inc $(inc)\sf.inc $(inc)\arena.inc \
|
||||||
|
$(inc)\intnat.inc $(inc)\mi.inc \
|
||||||
|
$(inc)\syscall.inc
|
||||||
|
|
||||||
|
|
||||||
|
sysconf.obj: sysconf.asm \
|
||||||
|
makefile \
|
||||||
|
psoption.inc \
|
||||||
|
devmark.inc \
|
||||||
|
$(inc)\psdata.inc \
|
||||||
|
$(inc)\parse.asm \
|
||||||
|
$(inc)\smifssym.inc \
|
||||||
|
$(inc)\devsym.inc \
|
||||||
|
$(inc)\ioctl.inc \
|
||||||
|
$(inc)\smdossym.inc $(inc)\dosmac.inc $(inc)\bpb.inc $(inc)\buffer.inc \
|
||||||
|
$(inc)\sysvar.inc $(inc)\vector.inc $(inc)\dirent.inc \
|
||||||
|
$(inc)\dpb.inc $(inc)\curdir.inc \
|
||||||
|
$(inc)\pdb.inc $(inc)\exe.inc $(inc)\sf.inc $(inc)\arena.inc \
|
||||||
|
$(inc)\intnat.inc $(inc)\mi.inc \
|
||||||
|
$(inc)\syscall.inc
|
||||||
|
|
||||||
|
sysinit2.obj: sysinit2.asm \
|
||||||
|
makefile \
|
||||||
|
devmark.inc \
|
||||||
|
$(inc)\copyrigh.inc \
|
||||||
|
$(inc)\smifssym.inc \
|
||||||
|
$(inc)\devsym.inc \
|
||||||
|
$(inc)\ioctl.inc \
|
||||||
|
$(inc)\smdossym.inc $(inc)\dosmac.inc $(inc)\bpb.inc $(inc)\buffer.inc \
|
||||||
|
$(inc)\sysvar.inc $(inc)\vector.inc $(inc)\dirent.inc \
|
||||||
|
$(inc)\dpb.inc $(inc)\curdir.inc \
|
||||||
|
$(inc)\pdb.inc $(inc)\exe.inc $(inc)\sf.inc $(inc)\arena.inc \
|
||||||
|
$(inc)\intnat.inc $(inc)\mi.inc \
|
||||||
|
$(inc)\syscall.inc
|
||||||
|
|
||||||
|
sysimes.obj: sysimes.asm \
|
||||||
|
makefile \
|
||||||
|
msmacro.inc \
|
||||||
|
msbio.cl3 \
|
||||||
|
msequ.inc $(inc)\msbds.inc
|
||||||
|
|
||||||
|
msbio2.obj: msbio2.asm \
|
||||||
|
makefile \
|
||||||
|
msgroup.inc \
|
||||||
|
msequ.inc \
|
||||||
|
$(inc)\msbds.inc \
|
||||||
|
$(inc)\devsym.inc \
|
||||||
|
pushpop.inc \
|
||||||
|
msmacro.inc \
|
||||||
|
msbio.cl2 \
|
||||||
|
ms96tpi.inc msvolid.inc
|
||||||
|
|
||||||
|
mshard.obj: mshard.asm $(inc)\postequ.inc $(inc)\dseg.inc
|
||||||
|
|
||||||
|
$(dest).sys: msbio.cl1 msbio1.obj mscon.obj msaux.obj \
|
||||||
|
mslpt.obj msclock.obj msdisk.obj msbio2.obj \
|
||||||
|
msinit.obj mshard.obj sysinit1.obj sysconf.obj \
|
||||||
|
sysinit2.obj sysimes.obj \
|
||||||
|
msload.com \
|
||||||
|
makefile
|
||||||
|
link @msbio.lnk
|
||||||
|
exe2bin msbio.exe msbio.bin <locscr
|
||||||
|
copy /b msload.com+msbio.bin $(dest).sys
|
||||||
|
del msbio.bin
|
||||||
|
del msbio.exe
|
||||||
|
|
536
v4.0/src/BIOS/MS96TPI.INC
Normal file
536
v4.0/src/BIOS/MS96TPI.INC
Normal file
@ -0,0 +1,536 @@
|
|||||||
|
%OUT MS96TPI.INC...
|
||||||
|
;==============================================================================
|
||||||
|
;REVISION HISTORY:
|
||||||
|
;AN000 - New for DOS Version 4.00 - J.K.
|
||||||
|
;AC000 - Changed for DOS Version 4.00 - J.K.
|
||||||
|
;AN00x - PTM number for DOS Version 4.00 - J.K.
|
||||||
|
;==============================================================================
|
||||||
|
;AN001 - p2781 Changeline error behavior incompatibile with DOS 3.3 1/06/88 J.K.
|
||||||
|
;==============================================================================
|
||||||
|
;
|
||||||
|
; DISK OPEN/CLOSE ROUTINES ARR 2.41
|
||||||
|
;
|
||||||
|
|
||||||
|
DSK$OPEN: ;ARR 2.41
|
||||||
|
PUBLIC DSK$OPEN
|
||||||
|
|
||||||
|
MESSAGE FTESTDISK,<"DISK OPEN ">
|
||||||
|
MNUM FTESTDISK,AX
|
||||||
|
MESSAGE FTESTDISK,<CR,LF>
|
||||||
|
; AL IS LOGICAL DRIVE
|
||||||
|
CALL SETDRIVE ;GET BDS FOR DRIVE
|
||||||
|
INC WORD PTR DS:[DI].OPCNT
|
||||||
|
JMP EXIT ;ARR 2.41
|
||||||
|
|
||||||
|
DSK$CLOSE: ;ARR 2.41
|
||||||
|
PUBLIC DSK$CLOSE
|
||||||
|
|
||||||
|
MESSAGE FTESTDISK,<"DISK CLOSE ">
|
||||||
|
MNUM FTESTDISK,AX
|
||||||
|
MESSAGE FTESTDISK,<CR,LF>
|
||||||
|
; AL IS LOGICAL DRIVE
|
||||||
|
CALL SETDRIVE ;GET BDS FOR DRIVE
|
||||||
|
CMP WORD PTR DS:[DI].OPCNT,0
|
||||||
|
JZ EXITJX ; WATCH OUT FOR WRAP ARR 2.41
|
||||||
|
DEC WORD PTR DS:[DI].OPCNT
|
||||||
|
EXITJX:
|
||||||
|
JMP EXIT
|
||||||
|
|
||||||
|
; INPUT : DS:DI POINTS TO CURRENT BDS FOR DRIVE.
|
||||||
|
; RETURN : ZERO SET IF NO OPEN FILES
|
||||||
|
; ZERO RESET IF OPEN FILES
|
||||||
|
CHKOPCNT:
|
||||||
|
MESSAGE FTEST96,<"CHECK OPEN COUNT ">
|
||||||
|
MNUM FTEST96,AX
|
||||||
|
MESSAGE FTEST96,<CR,LF>
|
||||||
|
CMP WORD PTR DS:[DI].OPCNT,0
|
||||||
|
RET
|
||||||
|
|
||||||
|
;
|
||||||
|
; AT MEDIA CHECK TIME, WE NEED TO REALLY GET DOWN AND CHECK WHAT THE CHANGE IS.
|
||||||
|
; THIS IS GUARANTEED TO BE EXPENSIVE.
|
||||||
|
;
|
||||||
|
PUBLIC MEDIACHECK
|
||||||
|
MEDIACHECK:
|
||||||
|
CALL CHECKSINGLE ; MAKE SURE CORRECT DISK IS IN PLACE
|
||||||
|
XOR SI,SI
|
||||||
|
CALL HASCHANGE
|
||||||
|
JZ MEDIARET
|
||||||
|
CALL CHECKROMCHANGE
|
||||||
|
JNZ MEDIADOVOLID
|
||||||
|
PUSH AX
|
||||||
|
PUSH DX
|
||||||
|
;SB33001****************************************************************
|
||||||
|
mov DL, DS:[DI.drivenum] ;SB ; set logical drive number ;3.30*
|
||||||
|
mov AH, 16h ;SB ; get changeline status ;3.30*
|
||||||
|
int 13h ;SB ; call rom diskette routine ;3.30*
|
||||||
|
;SB33001****************************************************************
|
||||||
|
POP DX
|
||||||
|
POP AX
|
||||||
|
JC MEDIADOVOLID
|
||||||
|
MOV SI,1 ; SIGNAL NO CHANGE
|
||||||
|
; THERE ARE SOME DRIVES WITH CHANGELINE THAT "LOSE" THE CHANGELINE INDICATION
|
||||||
|
; IF A DIFFERENT DRIVE IS ACCESSED AFTER THE CURRENT ONE. IN ORDER TO AVOID
|
||||||
|
; MISSING A MEDIA CHANGE, WE RETURN AN "I DON'T KNOW" TO DOS IF THE CHANGELINE
|
||||||
|
; IS NOT ACTIVE AND WE ARE ACCESSING A DIFFERENT DRIVE FROM THE LAST ONE.
|
||||||
|
; IF WE ARE ACCESSING THE SAME DRIVE, THEN WE CAN SAFELY RELY ON THE CHANGELINE
|
||||||
|
; STATUS.
|
||||||
|
PUBLIC LOSECHNG
|
||||||
|
LOSECHNG:
|
||||||
|
MOV BL,CS:[TIM_DRV] ; GET LAST DRIVE ACCESSED
|
||||||
|
CMP BYTE PTR [DI].DRIVENUM,BL
|
||||||
|
JZ MEDIARET
|
||||||
|
; DO THE 2 SECOND TWIDDLE. IF TIME >= 2 SECONDS, DO A VOLID CHECK.
|
||||||
|
; OTHERWISE RETURN "I DON'T KNOW" (STRICTLY SPEAKING, WE SHOULD RETURN A
|
||||||
|
; "NOT CHANGED" HERE SINCE THE 2 SECOND TEST SAID NO CHANGE.) - RS.
|
||||||
|
SAVEREG <AX,CX,DX>
|
||||||
|
CALL CHECK_TIME_OF_ACCESS
|
||||||
|
RESTOREREG <DX,CX,AX>
|
||||||
|
OR SI,SI
|
||||||
|
JZ MEDIADOVOLID ; CHECK_TIME SAYS ">= 2 SECS PASSED"
|
||||||
|
XOR SI,SI ; RETURN "I DON'T KNOW"
|
||||||
|
PUBLIC MEDIARET
|
||||||
|
MEDIARET:
|
||||||
|
RET
|
||||||
|
;
|
||||||
|
; SOMEHOW THE MEDIA WAS CHANGED. LOOK AT VID TO SEE. WE DO NOT LOOK AT FAT
|
||||||
|
; BECAUSE THIS MAY BE DIFFERENT SINCE WE ONLY SET MEDBYT WHEN DOING A READ
|
||||||
|
; OR WRITE.
|
||||||
|
;
|
||||||
|
MEDIADOVOLID:
|
||||||
|
CALL GETBP ; BUILD A NEW BPB IN CURRENT BDS
|
||||||
|
JC MEDIARET
|
||||||
|
CALL CHECK_VID
|
||||||
|
JNC MEDIARET
|
||||||
|
CALL MAPERROR ; FIX UP AL FOR RETURN TO DOS
|
||||||
|
RET
|
||||||
|
;
|
||||||
|
; SIMPLE, QUICK CHECK OF LATCHED CHANGE. IF NO INDICATION, THEN RETURN
|
||||||
|
; OTHERWISE DO EXPENSIVE CHECK. IF THE EXPENSIVE TEST FAILS, POP OFF THE
|
||||||
|
; RETURN AND SET AL = 15 (FOR INVALID MEDIA CHANGE) WHICH WILL BE RETURNED TO
|
||||||
|
; DOS.
|
||||||
|
;J.K. 9/16/86 For DOS 3.3, this will work only for the drive that has
|
||||||
|
;J.K. 9/16/86 changeline.
|
||||||
|
PUBLIC CHECKLATCHIO
|
||||||
|
CHECKLATCHIO:
|
||||||
|
; IF RETURNING FAKE BPB THEN ASSUME THE DISK HAS NOT CHANGED
|
||||||
|
; TEST WORD PTR DS:[DI].FLAGS, RETURN_FAKE_BPB
|
||||||
|
; JNZ CHECKRET
|
||||||
|
;J.K. 9/16/86
|
||||||
|
; call HasChange ;change line supported?
|
||||||
|
; jz CheckRet ;No. Just return
|
||||||
|
CALL CHKOPCNT
|
||||||
|
JNZ CHECKROM
|
||||||
|
CHECKRET:
|
||||||
|
RET
|
||||||
|
;
|
||||||
|
; CHECK FOR PAST ROM INDICATIONS. IF NO ROM CHANGE INDICATED, THEN RETURN OK.
|
||||||
|
;
|
||||||
|
PUBLIC CHECKROM
|
||||||
|
CHECKROM:
|
||||||
|
CALL CHECKROMCHANGE
|
||||||
|
JZ CHECKRET ; NO CHANGE
|
||||||
|
;
|
||||||
|
; WE NOW SEE THAT A CHANGE LINE HAS BEEN SEEN IN THE PAST. LET'S DO THE
|
||||||
|
; EXPENSIVE VERIFICATION.
|
||||||
|
;
|
||||||
|
MESSAGE FTEST96,<"CHECKROMCHANGE SAYS YES...",CR,LF>
|
||||||
|
CALL GETBP ; BUILD BPB IN CURRENT BDS
|
||||||
|
JC RET_NO_ERROR_MAP ; GETBP HAS ALREADY CALLED MAPERROR
|
||||||
|
CALL CHECK_VID
|
||||||
|
JC CHECKLATCHRET ; DISK ERROR TRYING TO READ IN.
|
||||||
|
OR SI,SI ; IS CHANGED FOR SURE?
|
||||||
|
JNS CHECKRET
|
||||||
|
CALL RETURNVID
|
||||||
|
CHECKLATCHRET:
|
||||||
|
CALL MAPERROR ; FIX UP AL FOR RETURN TO DOS
|
||||||
|
RET_NO_ERROR_MAP:
|
||||||
|
STC
|
||||||
|
POP SI ; POP OFF RETURN ADDRESS
|
||||||
|
RET
|
||||||
|
|
||||||
|
;
|
||||||
|
; CHECK THE FAT AND THE VID. RETURN IN DI -1 OR 0. RETURN WITH CARRY SET
|
||||||
|
; ONLY IF THERE WAS A DISK ERROR. RETURN THAT ERROR CODE IN AX.
|
||||||
|
;
|
||||||
|
PUBLIC CHECKFATVID
|
||||||
|
CHECKFATVID:
|
||||||
|
MESSAGE FTEST96,<"CHECK FAT",CR,LF>
|
||||||
|
CALL FAT_CHECK
|
||||||
|
OR SI,SI
|
||||||
|
JS CHANGED_DRV
|
||||||
|
;
|
||||||
|
; THE FAT WAS THE SAME. HOW ABOUT THE VOLUME ID?
|
||||||
|
;
|
||||||
|
CHECK_VID:
|
||||||
|
;J.K. Now with the extended BOOT record, the logic should be enhanced.
|
||||||
|
;If it is the extended BOOT record, then we check the volume serial
|
||||||
|
;number instead of volume id. If it is different, then set SI to -1.
|
||||||
|
;If it is same, then SI= 1 (No change).
|
||||||
|
;If it is not the extended BOOT record, then just follows the old
|
||||||
|
;logic. DOS 4.00 will check if the # of FAT in the boot record BPB
|
||||||
|
;is not 0. If it is 0 then it must be Non_FAT based system and
|
||||||
|
;should have already covered by extended boot structure checking.
|
||||||
|
;So, we will return "I don't know" by setting SI to 0.
|
||||||
|
;This routine assume the newest valid boot record is in CS:[DISKSECTOR].
|
||||||
|
;(This will be gauranteed by a successful GETBP call right before this
|
||||||
|
;routine.)
|
||||||
|
MESSAGE FTEST96,<"CHECK VID",CR,LF>
|
||||||
|
;SB34MS96TPI001*********************************************************
|
||||||
|
;SB check the EXT_Boot_Sig variable for the Extended boot signature
|
||||||
|
;SB if it is set then go to do the extended ID check otherwise continue
|
||||||
|
;SB with code below
|
||||||
|
;SB 2 LOCS
|
||||||
|
|
||||||
|
cmp cs:[Ext_Boot_Sig],Ext_Boot_Signature
|
||||||
|
jz Do_Ext_Check_Id
|
||||||
|
;SB34MS96TPI001*********************************************************
|
||||||
|
call HasChange ;AN000;
|
||||||
|
jz CheckRet ;AN000;
|
||||||
|
|
||||||
|
xor si,si ;AN000; assume I don't know.
|
||||||
|
cmp byte ptr cs:[SECPERCLUSINSECTOR]+3,0 ;AN000; Don't read vol id from
|
||||||
|
je CHECKFATRET ;AN000; the directory if not FAT system
|
||||||
|
CALL READ_VOLUME_ID
|
||||||
|
JC CHECKFATRET
|
||||||
|
CALL CHECK_VOLUME_ID
|
||||||
|
OR SI,SI
|
||||||
|
JNZ CHANGED_DRV
|
||||||
|
MESSAGE FTEST96,<"VID NOT CHANGED",CR,LF>
|
||||||
|
|
||||||
|
VID_NO_Changed:
|
||||||
|
CALL RESETCHANGED
|
||||||
|
clc ;AN000;
|
||||||
|
CHECKFATRET:
|
||||||
|
RET
|
||||||
|
CHANGED_DRV:
|
||||||
|
MOV CS:[TIM_DRV],-1 ; ENSURE THAT WE ASK ROM FOR MEDIA
|
||||||
|
RET ; CHECK NEXT TIME ROUND
|
||||||
|
;
|
||||||
|
; extended ID check
|
||||||
|
;
|
||||||
|
Do_Ext_Check_ID: ;AN000;
|
||||||
|
push ax ;AN000;
|
||||||
|
;SB34MS96TPI002**************************************************************
|
||||||
|
;SB The code to check extended ID is basically a check to see if the
|
||||||
|
;Sb volume serial number is still the same. The volume serial number
|
||||||
|
;SB previously read is in cs:[Boot_Serial_H] and cs:[Boot_Serial_L]
|
||||||
|
;SB high and low words respectively. DS:DI points to the BDS of the
|
||||||
|
;SB drive under consideration. The BDS has fields containing the
|
||||||
|
;SB high and low words of the volume serial number of the media in the
|
||||||
|
;SB drive. Compare these fields to the fields mentioned above. If these
|
||||||
|
;SB fields do not match the media has changed and so we should jump
|
||||||
|
;SB to the code starting at Ext_Changed else return "I don't know" status
|
||||||
|
;SB in the register used for the changeline status and continue executing
|
||||||
|
;SB the code given below. For temporary storage use the register which
|
||||||
|
;SB has been saved and restored around this block.
|
||||||
|
;SB 7 LOCS
|
||||||
|
;SB BDS fields in inc\msbds.inc
|
||||||
|
|
||||||
|
mov ax,cs:[Boot_Serial_L]
|
||||||
|
cmp ax,word ptr ds:[di+VOL_SERIAL]
|
||||||
|
jnz Ext_Changed
|
||||||
|
mov ax,cs:[Boot_Serial_H]
|
||||||
|
cmp ax,word ptr ds:[di+VOL_SERIAL+2]
|
||||||
|
jnz Ext_Changed
|
||||||
|
xor si,si ; don't know
|
||||||
|
|
||||||
|
;SB34MS96TPI002**************************************************************
|
||||||
|
pop ax ;AN000;
|
||||||
|
; jmp CheckFatRet ;AN000;
|
||||||
|
jmp VID_NO_Changed ;AN001;Reset the flag
|
||||||
|
Ext_Changed: ;AN000; Serial number is different!
|
||||||
|
pop ax ;AN000;
|
||||||
|
mov si, -1 ;AN000; disk changed!
|
||||||
|
clc ;AN000; clear carry. Only SI is meaningful here.
|
||||||
|
jmp Changed_Drv ;AN000;
|
||||||
|
|
||||||
|
;
|
||||||
|
; AT I/O TIME, WE DETECTED THE ERROR. NOW WE NEED TO DETERMINE WHETHER THE
|
||||||
|
; MEDIA WAS TRULY CHANGED OR NOT. WE RETURN NORMALLY IF MEDIA CHANGE UNKNOWN.
|
||||||
|
; AND WE POP OFF THE CALL AND JMP TO HARDERR IF WE SEE AN ERROR.
|
||||||
|
;
|
||||||
|
PUBLIC CHECKIO
|
||||||
|
CHECKIO:
|
||||||
|
CMP AH,06
|
||||||
|
JNZ CHECKFATRET
|
||||||
|
CALL CHKOPCNT
|
||||||
|
JZ CHECKFATRET ; NO OPEN FILES
|
||||||
|
; IF RETURNING FAKE BPB THEN IGNORE DISK CHANGES
|
||||||
|
; TEST WORD PTR DS:[DI].FLAGS, RETURN_FAKE_BPB
|
||||||
|
; JNZ IGNORECHANGE
|
||||||
|
CALL GETBP ; BUILD UP A NEW BPB IN CURRENT BDS
|
||||||
|
JC NO_ERROR_MAP ; GETBP HAS ALREADY CALLED MAPERROR
|
||||||
|
CALL CHECKFATVID
|
||||||
|
JC CHECKIORET ; DISK ERROR TRYING TO READ IN.
|
||||||
|
OR SI,SI ; IS CHANGED FOR SURE?
|
||||||
|
JS CHECKIOERR ; YES CHANGED
|
||||||
|
IGNORECHANGE:
|
||||||
|
INC BP ; ALLOW A RETRY
|
||||||
|
RET
|
||||||
|
CHECKIOERR:
|
||||||
|
CALL RETURNVID
|
||||||
|
CHECKIORET:
|
||||||
|
; POP SI ; POP OFF RETURN
|
||||||
|
STC ; MAKE SURE CARRY GETS PASSED THROUGH
|
||||||
|
JMP HARDERR
|
||||||
|
|
||||||
|
NO_ERROR_MAP:
|
||||||
|
JMP HARDERR2
|
||||||
|
;
|
||||||
|
; RETURN VID SETS UP THE VID FOR A RETURN TO DOS.
|
||||||
|
;
|
||||||
|
PUBLIC RETURNVID
|
||||||
|
RETURNVID:
|
||||||
|
MESSAGE FTEST96,<"RETURN VID",CR,LF>
|
||||||
|
PUSH DS ; SAVE POINTER TO CURRENT BDS
|
||||||
|
PUSH DI
|
||||||
|
PUSH CX
|
||||||
|
CALL INIT_VID_LOOP ; SETS ES:DI -> VID
|
||||||
|
LDS BX,CS:[PTRSAV]
|
||||||
|
MOV [BX.EXTRA],DI
|
||||||
|
MOV [BX.EXTRA+2],ES
|
||||||
|
POP CX
|
||||||
|
POP DI ; RESTORE CURRENT BDS
|
||||||
|
POP DS
|
||||||
|
MOV AH,6 ; INVALID MEDIA CHANGE
|
||||||
|
STC
|
||||||
|
RET
|
||||||
|
|
||||||
|
;
|
||||||
|
; MUNGE THE TIME OF LAST SUCCESSFUL ACCESS FOR TWEEKED DRIVES
|
||||||
|
;
|
||||||
|
; DON'T NEED ANY MORE
|
||||||
|
; TWEEKCHECK:
|
||||||
|
; PUSH AX
|
||||||
|
; MOV AX,WORD PTR DS:[DI].FLAGS
|
||||||
|
; TEST AL,FCHANGED_BY_FORMAT
|
||||||
|
; JZ TWEEKDONE
|
||||||
|
; MOV CS:[TIM_DRV],-1
|
||||||
|
; TWEEKDONE:
|
||||||
|
; POP AX
|
||||||
|
; RET
|
||||||
|
|
||||||
|
;
|
||||||
|
; DRIVE IS THE LOGICAL DRIVE TO USE
|
||||||
|
;
|
||||||
|
; FORMAT_MEDIA_CHECK: ;ARR 2.42
|
||||||
|
; PUSH AX
|
||||||
|
; MOV AX,WORD PTR DS:[DI].FLAGS
|
||||||
|
; TEST AL,FCHANGED_BY_FORMAT
|
||||||
|
; JZ RETF1 ; MEDIA NOT CHANGED VIA FORMAT
|
||||||
|
; AND AL,NOT FCHANGED_BY_FORMAT
|
||||||
|
; MOV WORD PTR [DI].FLAGS,AX ; RESET CHANGED_BY_FORMAT BIT
|
||||||
|
; MOV SI,-1 ; MEDIA CHANGED VIA FORMAT
|
||||||
|
; RETF1:
|
||||||
|
; POP AX
|
||||||
|
; RET
|
||||||
|
|
||||||
|
;
|
||||||
|
; MOVES THE POINTER TO THE VOLID FOR THE DRIVE INTO THE ORIGINAL REQUEST PACKET
|
||||||
|
; ON ENTRY, DS:BX POINTS TO THE ORIGINAL PACKET.
|
||||||
|
; NO ATTEMPT IS MADE TO PRESERVE REGISTERS.
|
||||||
|
;
|
||||||
|
MEDIA_SET_VID: ; ARR 2.42
|
||||||
|
PUBLIC MEDIA_SET_VID
|
||||||
|
|
||||||
|
CALL INIT_VID_LOOP ; SETS ES:DI -> VID
|
||||||
|
LDS BX,CS:[PTRSAV] ; GET POINTER TO PACKET
|
||||||
|
MOV WORD PTR [BX.TRANS+1],DI
|
||||||
|
MOV WORD PTR [BX.TRANS+3],ES
|
||||||
|
RET
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; HIDENSITY - EXAMINE A DRIVE/MEDIA DESCRIPTOR TO SET THE MEDIA TYPE. IF
|
||||||
|
; THE MEDIA DESCRIPTOR IS NOT F9 (NOT 96TPI OR 3 1/2), WE RETURN AND LET THE
|
||||||
|
; CALLER DO THE REST. OTHERWISE, WE POP OFF THE RETURN AND JUMP TO THE TAIL
|
||||||
|
; OF GETBP. FOR 3.5" MEDIA, WE JUST RETURN.
|
||||||
|
;
|
||||||
|
; INPUTS: DS:DI POINT TO CORRECT BDS FOR THIS DRIVE
|
||||||
|
; AH HAS MEDIA BYTE
|
||||||
|
;
|
||||||
|
; OUTPUTS: CARRY CLEAR
|
||||||
|
; NO REGISTERS MODIFIED
|
||||||
|
; CARRY SET
|
||||||
|
; AL = SECTORS/FAT
|
||||||
|
; BH = NUMBER OF ROOT DIRECTORY ENTRIES
|
||||||
|
; BL = SECTORS PER TRACK
|
||||||
|
; CX = NUMBER OF SECTORS
|
||||||
|
; DH = SECTORS PER ALLOCATION UNIT
|
||||||
|
; DL = NUMBER OF HEADS
|
||||||
|
;
|
||||||
|
HIDENSITY:
|
||||||
|
PUBLIC HIDENSITY
|
||||||
|
;
|
||||||
|
; CHECK FOR CORRECT DRIVE
|
||||||
|
;
|
||||||
|
TEST WORD PTR DS:[DI].FLAGS,FCHANGELINE ; IS IT SPECIAL?
|
||||||
|
JZ DOFLOPPY ; NO, DO NORMAL FLOPPY TEST
|
||||||
|
;
|
||||||
|
; WE HAVE A MEDIA BYTE THAT IS PRETTY COMPLEX. EXAMINE DRIVE INFORMATION
|
||||||
|
; TABLE TO SEE WHAT KIND IT IS.
|
||||||
|
;
|
||||||
|
CMP BYTE PTR DS:[DI].FORMFACTOR,FFSMALL; IS IT SINGLE-MEDIA?
|
||||||
|
JZ DOFLOPPY ; YES, USE FATID...
|
||||||
|
;
|
||||||
|
; 96 TPI DRIVE
|
||||||
|
;
|
||||||
|
CMP AH,0F9H
|
||||||
|
JNZ DOFLOPPY
|
||||||
|
MOV AL,7 ; SEVEN SECTORS / FAT
|
||||||
|
MOV BX,224*256+0FH ; 224 ROOT DIR ENTRIES & 0F SECTOR MAX
|
||||||
|
MOV CX,80*15*2 ; 80 TRACKS, 15 SECTORS/TRACK, 2 SIDES
|
||||||
|
MOV DX,01*256+2 ; SECTORS/ALLOCATION UNIT & HEAD MAX
|
||||||
|
POPR:
|
||||||
|
ADD SP,2 ; POP OFF RETURN ADDRESS
|
||||||
|
JMP HAS1 ; RETURN TO TAIL OF GETBP
|
||||||
|
|
||||||
|
DOFLOPPY:
|
||||||
|
RET
|
||||||
|
|
||||||
|
PATHSTART 001,TPI96
|
||||||
|
|
||||||
|
;
|
||||||
|
; CERTAIN BOGUS PROGRAMS AVOID DOS ALTOGETHER AND USE INT 13 DIRECTLY. THESE
|
||||||
|
; PROGRAMS EVEN RETRY OPERATIONS AND, THUS, WILL IGNORE THE DISK CHANGE LOGIC.
|
||||||
|
;
|
||||||
|
; WE HOOK INT 13 AND NOTE ALL ERRORS.
|
||||||
|
;
|
||||||
|
ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING
|
||||||
|
PUBLIC REAL13
|
||||||
|
REAL13 DD ?
|
||||||
|
OLDINT DD ?
|
||||||
|
DMY DW ?
|
||||||
|
|
||||||
|
PATHEND 001,TPI96
|
||||||
|
|
||||||
|
PUBLIC INT13
|
||||||
|
INT13 PROC FAR
|
||||||
|
POP WORD PTR OLDINT
|
||||||
|
POP WORD PTR OLDINT+2
|
||||||
|
POP DMY
|
||||||
|
MESSAGE FTEST13,<"*">
|
||||||
|
PUSHF
|
||||||
|
CALL REAL13 ; SIMULATE ANOTHER INT 13
|
||||||
|
JC ERR13 ; DID AN ERROR OCCUR?
|
||||||
|
JMP OLDINT ; NO, RETURN AND POP OFF FLAGS
|
||||||
|
ERR13:
|
||||||
|
MESSAGE FTEST13,<"INT 13 ERROR ">
|
||||||
|
MNUM FTEST13,AX
|
||||||
|
MESSAGE FTEST13,<CR,LF>
|
||||||
|
PUSHF ; SAVE STATE
|
||||||
|
CMP AH,06H ; DID I SEE A CHANGE EVENT?
|
||||||
|
JZ GOTERR ; YES
|
||||||
|
B: POPF ; NO, SOME OTHER ERROR, IGNORE IT
|
||||||
|
JMP OLDINT ; RETURN AND POP OFF FLAGS
|
||||||
|
GOTERR: OR DL,DL ; IS THIS FOR THE HARD DISK?
|
||||||
|
JS B ; YES, IGNORE
|
||||||
|
MOV WORD PTR CS:[FLAGBITS],FCHANGED
|
||||||
|
CALL SET_CHANGED_DL
|
||||||
|
JMP B
|
||||||
|
INT13 ENDP
|
||||||
|
|
||||||
|
;
|
||||||
|
; SET_CHANGED_DL - SETS FLAG BITS ACCORDING TO BITS SET IN [FLAGBITS].
|
||||||
|
; ESSENTIALLY USED TO INDICATE CHANGELINE, OR FORMAT.
|
||||||
|
;
|
||||||
|
; INPUTS: DL CONTAINS PHYSICAL DRIVE NUMBER
|
||||||
|
; [FLAGBITS] CONTAINS BITS TO SET IN THE FLAG FIELD IN THE BDSS
|
||||||
|
; OUTPUTS: NONE
|
||||||
|
; REGISTERS MODIFIED: FLAGS
|
||||||
|
;
|
||||||
|
SET_CHANGED_DL:
|
||||||
|
PUBLIC SET_CHANGED_DL
|
||||||
|
|
||||||
|
MESSAGE FTEST96,<"SET CHANGED",CR,LF>
|
||||||
|
PUSH BX
|
||||||
|
PUSH DX
|
||||||
|
MOV BL,DL
|
||||||
|
ALL_SET:
|
||||||
|
MOV DX,CS:[FLAGBITS] ; GET BITS TO SET IN FLAG FIELD
|
||||||
|
XOR BH,BH
|
||||||
|
;
|
||||||
|
; IN THE VIRTUAL DRIVE SYSTEM WE *MUST* FLAG THE OTHER DRIVES AS BEING CHANGED
|
||||||
|
;
|
||||||
|
; ASSUME FIRST BDS IS IN THIS SEGMENT
|
||||||
|
PUSH AX
|
||||||
|
PUSH DS ; SAVE CURRENT BDS
|
||||||
|
PUSH DI
|
||||||
|
LDS DI,DWORD PTR CS:[START_BDS]
|
||||||
|
SCAN_BDS:
|
||||||
|
CMP DI,-1
|
||||||
|
JZ SKIPSET
|
||||||
|
CMP BYTE PTR [DI].DRIVENUM,BL
|
||||||
|
JNZ GET_NEXT_BDS
|
||||||
|
;
|
||||||
|
; SOMEONE MAY COMPLAIN, BUT THIS *ALWAYS* MUST BE DONE WHEN A DISK CHANGE IS
|
||||||
|
; NOTED. THERE ARE *NO* OTHER COMPROMISING CIRCUMSTANCES.
|
||||||
|
;
|
||||||
|
SETCHANGED:
|
||||||
|
OR WORD PTR DS:[DI].FLAGS,DX ; SIGNAL CHANGE ON OTHER DRIVE
|
||||||
|
GET_NEXT_BDS:
|
||||||
|
MOV AX,WORD PTR [DI].LINK+2 ; GO TO NEXT BDS
|
||||||
|
MOV DI,WORD PTR [DI].LINK
|
||||||
|
MOV DS,AX
|
||||||
|
JMP SHORT SCAN_BDS
|
||||||
|
SKIPSET:
|
||||||
|
POP DI ; RESTORE CURRENT BDS
|
||||||
|
POP DS
|
||||||
|
POP AX
|
||||||
|
POP DX
|
||||||
|
POP BX
|
||||||
|
RET
|
||||||
|
|
||||||
|
;
|
||||||
|
; CHECKROMCHANGE - SEE IF EXTERNAL PROGRAM HAS DIDDLED ROM CHANGE LINE.
|
||||||
|
;
|
||||||
|
; INPUTS: DS:DI POINTS TO CURRENT BDS.
|
||||||
|
; OUTPUTS: ZERO SET - NO CHANGE
|
||||||
|
; ZERO RESET - CHANGE
|
||||||
|
; REGISTERS MODIFIED: NONE
|
||||||
|
|
||||||
|
CHECKROMCHANGE:
|
||||||
|
MESSAGE FTEST13,<"CHECKROM ">
|
||||||
|
MNUM FTEST13
|
||||||
|
MESSAGE FTEST13,<CR,LF>
|
||||||
|
TEST WORD PTR [DI].FLAGS,FCHANGED
|
||||||
|
RET
|
||||||
|
|
||||||
|
;
|
||||||
|
; RESETCHANGED - RESTORE VALUE OF CHANGE LINE
|
||||||
|
;
|
||||||
|
; INPUTS: DS:DI POINTS TO CURRENT BDS
|
||||||
|
; OUTPUTS: NONE
|
||||||
|
; REGISTERS MODIFIED: NONE
|
||||||
|
|
||||||
|
public ResetChanged
|
||||||
|
RESETCHANGED:
|
||||||
|
MESSAGE FTEST13,<"RESETCHANGED ">
|
||||||
|
MNUM FTEST13
|
||||||
|
MESSAGE FTEST13,<CR,LF>
|
||||||
|
AND WORD PTR DS:[DI].FLAGS,NOT FCHANGED
|
||||||
|
RET
|
||||||
|
|
||||||
|
;
|
||||||
|
; HASCHANGE - SEE IF DRIVE CAN SUPPLY CHANGE LINE
|
||||||
|
;
|
||||||
|
; INPUTS: DS:DI POINTS TO CURRENT BDS
|
||||||
|
; OUTPUTS: ZERO SET - NO CHANGE LINE AVAILABLE
|
||||||
|
; ZERO RESET - CHANGE LINE AVAILABLE
|
||||||
|
; REGISTERS MODIFIED: NONE
|
||||||
|
|
||||||
|
PUBLIC HASCHANGE
|
||||||
|
HASCHANGE:
|
||||||
|
MESSAGE FTEST13,<"HASCHANGE ">
|
||||||
|
MNUM FTEST13
|
||||||
|
MESSAGE FTEST13,<CR,LF>
|
||||||
|
TEST WORD PTR [DI].FLAGS,FCHANGELINE
|
||||||
|
RET
|
||||||
|
|
||||||
|
ASSUME DS:CODE
|
||||||
|
|
||||||
|
INCLUDE MSVOLID.INC
|
||||||
|
|
||||||
|
PUBLIC END96TPI
|
||||||
|
END96TPI LABEL BYTE
|
281
v4.0/src/BIOS/MSAUX.ASM
Normal file
281
v4.0/src/BIOS/MSAUX.ASM
Normal file
@ -0,0 +1,281 @@
|
|||||||
|
TITLE MSAUX - DOS 3.3
|
||||||
|
;----------------------------------------------------------------
|
||||||
|
; :
|
||||||
|
; A U X - AUXILARY DEVICE DRIVER :
|
||||||
|
; :
|
||||||
|
; :
|
||||||
|
; This file contains the Auxilary Device Driver. The :
|
||||||
|
; auxilary driver handles calls to and from the RS-232 port. :
|
||||||
|
; Three devices uses this code: AUX, COM1, and COM2. AUX and :
|
||||||
|
; COM1 talk to the zero RS-232 card and COM2 talks to the :
|
||||||
|
; 'one' RS-232 card. The beginning of the interrupt entry :
|
||||||
|
; point for these devices sets the variable AUXNUM in the :
|
||||||
|
; msbio.asm module. If the value is 0 the routines in this :
|
||||||
|
; file will talk to the the 'zero' card. If the value in :
|
||||||
|
; AUXNUM is 1 the routines will talk to the 'one' card. :
|
||||||
|
; The procedure GETDX is called to put the value 0 or 1 in :
|
||||||
|
; the DX register depending on the value in AUXBUF. :
|
||||||
|
; :
|
||||||
|
; The routines in this files are: :
|
||||||
|
; :
|
||||||
|
; routine function :
|
||||||
|
; ------- -------- :
|
||||||
|
; AUX$READ Read characters from the :
|
||||||
|
; specified device. :
|
||||||
|
; AUX$RDND Non-desrucrtive read with :
|
||||||
|
; no waiting. :
|
||||||
|
; AUX$FLSH Flush specified device input :
|
||||||
|
; buffer. :
|
||||||
|
; AUX$WRIT Write characters to the :
|
||||||
|
; specified device. :
|
||||||
|
; AUX$WRST Get status of specified :
|
||||||
|
; device :
|
||||||
|
; :
|
||||||
|
; These routines are not called directly. Call are made via :
|
||||||
|
; the strategy and interrupt entry point (see Device Header). :
|
||||||
|
; :
|
||||||
|
; Data structure: :
|
||||||
|
; The Aux Device has a two byte buffer called AUXBUF. The :
|
||||||
|
; first byte is for the zero card, the second byte is for the :
|
||||||
|
; one card. A zero value in the byte indicates the buffer is :
|
||||||
|
; empty. The routines use GETBX to get the address of the :
|
||||||
|
; buffer. :
|
||||||
|
; :
|
||||||
|
;----------------------------------------------------------------
|
||||||
|
|
||||||
|
;;Ver 3.30 modification ---------------------------
|
||||||
|
itest=0
|
||||||
|
INCLUDE MSGROUP.INC ;DEFINE CODE SEGMENT
|
||||||
|
INCLUDE JUMPMAC.INC
|
||||||
|
INCLUDE MSMACRO.INC
|
||||||
|
|
||||||
|
EXTRN ERR$CNT:NEAR ;MSBIO1
|
||||||
|
EXTRN GETDX:NEAR ;MSBIO1
|
||||||
|
EXTRN RDEXIT:NEAR ;MSCON
|
||||||
|
EXTRN EXIT:NEAR ;MSBIO1
|
||||||
|
EXTRN BUS$EXIT:NEAR ;MSBIO1
|
||||||
|
;DATA
|
||||||
|
EXTRN AUXBUF:BYTE ;MSDATA
|
||||||
|
|
||||||
|
; VALUES IN AH, REQUESTING FUNCTION OF INT 14H IN ROM BIOS
|
||||||
|
AUXFUNC_SEND EQU 1 ;TRANSMIT
|
||||||
|
AUXFUNC_RECEIVE EQU 2 ;READ
|
||||||
|
AUXFUNC_STATUS EQU 3 ;REQUEST STATUS
|
||||||
|
|
||||||
|
; ERROR FLAGS, REPORTED BY INT 14H
|
||||||
|
|
||||||
|
; THESE FLAGS REPORTED IN AH:
|
||||||
|
FLAG_DATA_READY EQU 01H ;DATA READY
|
||||||
|
FLAG_OVERRUN EQU 02H ;OVERRUN ERROR
|
||||||
|
FLAG_PARITY EQU 04H ;PARITY ERROR
|
||||||
|
FLAG_FRAME EQU 08H ;FRAMING ERROR
|
||||||
|
FLAG_BREAK EQU 10H ;BREAK DETECT
|
||||||
|
FLAG_TRANHOL_EMP EQU 20H ;TRANSMIT HOLDING REGISTER EMPTY
|
||||||
|
FLAG_TRANSHF_EMP EQU 40H ;TRANSMIT SHIFT REGISTER EMPTY
|
||||||
|
FLAG_TIMEOUT EQU 80H ;TIMEOUT
|
||||||
|
|
||||||
|
; THESE FLAGS REPORTED IN AL:
|
||||||
|
FLAG_DELTA_CTS EQU 01H ;DELTA CLEAR TO SEND
|
||||||
|
FLAG_DELTA_DSR EQU 02H ;DELTA DATA SET READY
|
||||||
|
FLAG_TRAIL_RING EQU 04H ;TRAILING EDGE RING INDICATOR
|
||||||
|
FLAG_DELTA_SIG EQU 08H ;DELTA RECEIVE LINE SIGNAL DETECT
|
||||||
|
FLAG_CTS EQU 10H ;CLEAR TO SEND
|
||||||
|
FLAG_DSR EQU 20H ;DATA SET READY
|
||||||
|
FLAG_RING EQU 40H ;RING INDICATOR
|
||||||
|
FLAG_REC_SIG EQU 80H ;RECEIVE LINE SIGNAL DETECT
|
||||||
|
;;End of modification ------------------
|
||||||
|
|
||||||
|
|
||||||
|
;----------------------------------------------------------------
|
||||||
|
; :
|
||||||
|
; Read zero or more characters from Auxilary Device :
|
||||||
|
; :
|
||||||
|
; input:es:[di] points to area to receive aux data :
|
||||||
|
; cx has number of bytes to be read :
|
||||||
|
; "auxnum" first byte has number of aux device (rel 0):
|
||||||
|
; :
|
||||||
|
;----------------------------------------------------------------
|
||||||
|
PUBLIC AUX$READ
|
||||||
|
AUX$READ PROC NEAR
|
||||||
|
ASSUME DS:CODE ; SET BY AUX DEVICE DRIVER ENTRY ROUTINE
|
||||||
|
jcxz EXVEC2 ; if no characters, get out
|
||||||
|
call GETBX ; put address of AUXBUF in BX
|
||||||
|
xor AX,AX ; clear AX register
|
||||||
|
xchg AL,[BX] ; Get character , if any, from
|
||||||
|
; buffer and clear buffer
|
||||||
|
or AL,AL ; if AL is nonzero there was a
|
||||||
|
; character in the buffer
|
||||||
|
jnz AUX2 ; if so skip AUXIN call
|
||||||
|
AUX1: ;
|
||||||
|
call AUXIN ; get character from port
|
||||||
|
AUX2: ;
|
||||||
|
stosb ; store character
|
||||||
|
loop AUX1 ; if more character, go around again
|
||||||
|
EXVEC2: ;
|
||||||
|
Jump EXIT ; all done, successful exit
|
||||||
|
AUX$READ ENDP
|
||||||
|
|
||||||
|
;
|
||||||
|
; AUXIN: make a call on ROM BIOS to read character from
|
||||||
|
; the auxilary device, then do some error checking.
|
||||||
|
; If an error occurs then AUXIN jumps to ERR$CNT and
|
||||||
|
; does NOT return to where it was called from.
|
||||||
|
;
|
||||||
|
|
||||||
|
AUXIN PROC NEAR
|
||||||
|
|
||||||
|
mov ah,AUXFUNC_RECEIVE
|
||||||
|
call AUXOP
|
||||||
|
;check for Frame, Parity, or Overrun errors
|
||||||
|
;WARNING: these error bits are unpredictable
|
||||||
|
; if timeout (bit 7) is set
|
||||||
|
test ah,FLAG_FRAME or FLAG_PARITY or FLAG_OVERRUN
|
||||||
|
jz AROK ;No error if all bits are clear
|
||||||
|
|
||||||
|
;Error getting character
|
||||||
|
add sp,+2 ;Remove rtn address (near call)
|
||||||
|
xor al,al
|
||||||
|
or al,FLAG_REC_SIG or FLAG_DSR or FLAG_CTS
|
||||||
|
|
||||||
|
JUMP ERR$CNT
|
||||||
|
AROK:
|
||||||
|
RET ;CHAR JUST READ IS IN AL, STATUS IS IN AH
|
||||||
|
AUXIN ENDP
|
||||||
|
|
||||||
|
;----------------------------------------------------------------
|
||||||
|
; :
|
||||||
|
; Aux non-destructive read with no waiting :
|
||||||
|
; :
|
||||||
|
; input: es:[di] points to area to receive aux data :
|
||||||
|
; :
|
||||||
|
;----------------------------------------------------------------
|
||||||
|
;
|
||||||
|
PUBLIC AUX$RDND
|
||||||
|
AUX$RDND PROC NEAR
|
||||||
|
ASSUME DS:CODE ; SET BY AUX DEVICE DRIVER ENTRY ROUTINE
|
||||||
|
call GETBX ; have BX point to AUXBUF
|
||||||
|
mov AL,[BX] ; copy contents of buffer to AL
|
||||||
|
or AL,AL ; if AL is non-zero (char in buffer)
|
||||||
|
jnz AUXRDX ; then return character
|
||||||
|
call AUXSTAT ; if not, get status of AUX device
|
||||||
|
TEST AH,FLAG_DATA_READY ;TEST DATA READY
|
||||||
|
jz AUXBUS ; then device is busy (not ready)
|
||||||
|
|
||||||
|
TEST AL,FLAG_DSR ;TEST DATA SET READY
|
||||||
|
jz AUXBUS ; then device is busy (not ready)
|
||||||
|
call AUXIN ; else aux is ready, get character
|
||||||
|
call GETBX ; have bx point to AUXBUF
|
||||||
|
mov [BX],AL ; save character in buffer
|
||||||
|
AUXRDX: ;
|
||||||
|
Jump RDEXIT ; return character
|
||||||
|
|
||||||
|
AUXBUS: ;
|
||||||
|
Jump BUS$EXIT ; jump to device busy exit
|
||||||
|
AUX$RDND ENDP
|
||||||
|
|
||||||
|
;----------------------------------------------------------------
|
||||||
|
; :
|
||||||
|
; Aux Output Status :
|
||||||
|
; :
|
||||||
|
;----------------------------------------------------------------
|
||||||
|
PUBLIC AUX$WRST
|
||||||
|
AUX$WRST PROC NEAR
|
||||||
|
ASSUME DS:CODE ; SET BY AUX DEVICE DRIVER ENTRY ROUTINE
|
||||||
|
call AUXSTAT ; get status of AUX in AX
|
||||||
|
; now test to see if device is busy
|
||||||
|
; if this bit is not set,
|
||||||
|
;;Ver 3.30 modification -----------------------
|
||||||
|
TEST AL,FLAG_DSR ;TEST DATA SET READY
|
||||||
|
jz AUXBUS ; then device is busy (not ready)
|
||||||
|
TEST AH,FLAG_TRANHOL_EMP ;TEST TRANSMIT HOLD REG EMPTY
|
||||||
|
;;End of modification -------------------------
|
||||||
|
jz AUXBUS ; then device is busy (not ready)
|
||||||
|
Jump Exit
|
||||||
|
|
||||||
|
AUX$WRST ENDP
|
||||||
|
|
||||||
|
;
|
||||||
|
; AUXSTAT makes a call on the ROM-BIOS to determine the status
|
||||||
|
; of the auxilary device
|
||||||
|
; Outputs:
|
||||||
|
; AX is filled with status of port.
|
||||||
|
; DX is changes to specify which card - either 0, 1 (, 2, 3) ;ba
|
||||||
|
; NO other registers are modified
|
||||||
|
;
|
||||||
|
|
||||||
|
AUXSTAT proc near
|
||||||
|
mov ah,AUXFUNC_STATUS
|
||||||
|
call AUXOP
|
||||||
|
ret
|
||||||
|
AUXSTAT endp
|
||||||
|
|
||||||
|
AUXOP PROC NEAR
|
||||||
|
;AH=FUNCTION CODE
|
||||||
|
;0=INIT, 1=SEND, 2=RECEIVE, 3=STATUS
|
||||||
|
call GETDX ; have DX point to proper card
|
||||||
|
int 14h ; call rom-bios for status
|
||||||
|
ret
|
||||||
|
AUXOP ENDP
|
||||||
|
|
||||||
|
;----------------------------------------------------------------
|
||||||
|
; :
|
||||||
|
; Flush AUX Input buffer - set contents of AUXBUF to zero :
|
||||||
|
; :
|
||||||
|
;----------------------------------------------------------------
|
||||||
|
PUBLIC AUX$FLSH
|
||||||
|
AUX$FLSH PROC NEAR
|
||||||
|
ASSUME DS:CODE ; SET BY AUX DEVICE DRIVER ENTRY ROUTINE
|
||||||
|
call GETBX ; get BX to point to AUXBUF
|
||||||
|
mov BYTE PTR [BX],0 ; zero out buffer
|
||||||
|
Jump Exit ; all done, successful return
|
||||||
|
AUX$FLSH ENDP
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;----------------------------------------------------------------
|
||||||
|
; :
|
||||||
|
; Write to Auxilary Device :
|
||||||
|
; :
|
||||||
|
;----------------------------------------------------------------
|
||||||
|
PUBLIC AUX$WRIT
|
||||||
|
AUX$WRIT PROC NEAR
|
||||||
|
ASSUME DS:CODE ; SET BY AUX DEVICE DRIVER ENTRY ROUTINE
|
||||||
|
jcxz EXVEC2 ; if CX is zero, no characters
|
||||||
|
; to be written, jump to exit
|
||||||
|
AUX$LOOP:
|
||||||
|
mov AL,ES:[DI] ; get character to be written
|
||||||
|
inc DI ; move DI pointer to next character
|
||||||
|
;;Ver 3.30 modification ---------------------------
|
||||||
|
MOV AH,AUXFUNC_SEND ;VALUE=1, INDICATES A WRITE
|
||||||
|
CALL AUXOP ;SEND CHARACTER OVER AUX PORT
|
||||||
|
|
||||||
|
TEST AH,FLAG_TIMEOUT ;CHECK FOR ERROR
|
||||||
|
;;End of modification ---------------------------
|
||||||
|
jz AWOK ; then no error
|
||||||
|
mov AL,10 ; else indicate write fault
|
||||||
|
Jump ERR$CNT ; call error routines
|
||||||
|
|
||||||
|
; if CX is non-zero, still more
|
||||||
|
AWOK:
|
||||||
|
loop AUX$LOOP ; more characrter to print
|
||||||
|
Jump Exit ; all done, successful return
|
||||||
|
AUX$WRIT ENDP
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; GETBX puts the address of AUXBUF (the Auxilary Device buffer)
|
||||||
|
; in BX. After calling GETBX, a routine can get to AUXBUF
|
||||||
|
; with [BX].
|
||||||
|
;
|
||||||
|
; NOTE: The getdx routine is in msbio1 and looks like:
|
||||||
|
; mov dx,word ptr cs:[auxnum]
|
||||||
|
;
|
||||||
|
GETBX PROC NEAR
|
||||||
|
call GETDX
|
||||||
|
mov BX,DX
|
||||||
|
add BX,OFFSET AUXBUF
|
||||||
|
ret
|
||||||
|
GETBX ENDP
|
||||||
|
|
||||||
|
CODE ENDS
|
||||||
|
END
|
722
v4.0/src/BIOS/MSBDATA.INC
Normal file
722
v4.0/src/BIOS/MSBDATA.INC
Normal file
@ -0,0 +1,722 @@
|
|||||||
|
;==============================================================================
|
||||||
|
;REVISION HISTORY:
|
||||||
|
;AN000 - New for DOS Version 3.4 - J.K.
|
||||||
|
;AC000 - Changed for DOS Version 3.4 - J.K.
|
||||||
|
;ANxxx - PTR, DCRs
|
||||||
|
;==============================================================================
|
||||||
|
;AN001 - d9 Double word MOV instruction for 80386 based machine. 7/1/87 J.K.
|
||||||
|
;AN002 - d25 Change DASD ERP to that recommended by Storage Systems. 7/29/87 J.K.
|
||||||
|
;AN003; d304 Boot record structure change for OS2 11/9/87 J.K.
|
||||||
|
;==============================================================================
|
||||||
|
EXTRN INIT:NEAR
|
||||||
|
|
||||||
|
PUBLIC START$
|
||||||
|
START$:
|
||||||
|
JMP INIT ;START$ PATCH BY INIT TO POINT TO
|
||||||
|
;HDRIVE BPB
|
||||||
|
; PUBLIC FORMAT_PATCH
|
||||||
|
;FORMAT_PATCH: ;ARR 2.42
|
||||||
|
; JMP FMTSET ;MJB001 DISPATCH FOR CALL FROM FORMAT UTILITY
|
||||||
|
|
||||||
|
|
||||||
|
PATHSTART 001,BIO
|
||||||
|
|
||||||
|
; DB 20 DUP (0) ;IBM WANTS SOME ZEROED AREA (DELETED)
|
||||||
|
|
||||||
|
|
||||||
|
;HEADER DB "Ver 2.45"
|
||||||
|
;--------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; COMMAND JUMP TABLES
|
||||||
|
;
|
||||||
|
; BEWARE - THESE TABLES OVERLAP SOMEWHAT! -C.P.
|
||||||
|
;
|
||||||
|
ODD
|
||||||
|
DSKTBL LABEL BYTE
|
||||||
|
DB 24 ; THIS IS THE SIZE OF THE TABLE YUK!!!!
|
||||||
|
DW DSK$INIT
|
||||||
|
DW MEDIA$CHK
|
||||||
|
DW GET$BPB
|
||||||
|
DW CMDERR ;RS
|
||||||
|
DW DSK$READ
|
||||||
|
DW BUS$EXIT
|
||||||
|
DW EXIT
|
||||||
|
DW EXIT
|
||||||
|
DW DSK$WRIT
|
||||||
|
DW DSK$WRITV
|
||||||
|
DW EXIT ;ARR 2.41
|
||||||
|
DW EXIT ;ARR 2.41
|
||||||
|
DW CMDERR ;RS
|
||||||
|
|
||||||
|
PUBLIC TABLE_PATCH
|
||||||
|
TABLE_PATCH LABEL WORD ;ARR 2.42
|
||||||
|
DW DSK$OPEN ;ARR 2.41
|
||||||
|
DW DSK$CLOSE ;ARR 2.41
|
||||||
|
DW DSK$REM ;ARR 2.41
|
||||||
|
DW EXIT
|
||||||
|
DW EXIT
|
||||||
|
DW EXIT
|
||||||
|
DW GENERIC$IOCTL ; KGS 3.20
|
||||||
|
DW EXIT
|
||||||
|
DW EXIT
|
||||||
|
DW EXIT
|
||||||
|
DW IOCTL$GETOWN ; RS 3.20
|
||||||
|
DW IOCTL$SETOWN ; RE 3.20
|
||||||
|
|
||||||
|
ODD
|
||||||
|
CONTBL LABEL BYTE
|
||||||
|
DB 10
|
||||||
|
DW EXIT
|
||||||
|
DW EXIT
|
||||||
|
DW EXIT
|
||||||
|
DW CMDERR
|
||||||
|
DW CON$READ
|
||||||
|
DW CON$RDND
|
||||||
|
DW EXIT
|
||||||
|
DW CON$FLSH
|
||||||
|
DW CON$WRIT
|
||||||
|
DW CON$WRIT
|
||||||
|
DW EXIT ;ARR 2.41
|
||||||
|
|
||||||
|
; DW CMDERR ;J.K. 4/29/86 for CON$GENIOCTL support
|
||||||
|
; DW CMDERR ;J.K. 4/29/86
|
||||||
|
; DW CMDERR ;J.K. 4/29/86
|
||||||
|
; DW CMDERR ;J.K. 4/29/86
|
||||||
|
; DW CMDERR ;J.K. 4/29/86
|
||||||
|
; DW CMDERR ;J.K. 4/29/86
|
||||||
|
; DW CMDERR ;J.K. 4/29/86
|
||||||
|
; DW CMDERR ;J.K. 4/29/86
|
||||||
|
; DW CON$GENIOCTL ;J.K. 4/29/86
|
||||||
|
|
||||||
|
ODD
|
||||||
|
AUXTBL LABEL BYTE
|
||||||
|
DB 10
|
||||||
|
DW EXIT
|
||||||
|
DW EXIT
|
||||||
|
DW EXIT
|
||||||
|
DW CMDERR
|
||||||
|
DW AUX$READ
|
||||||
|
DW AUX$RDND
|
||||||
|
DW EXIT
|
||||||
|
DW AUX$FLSH
|
||||||
|
DW AUX$WRIT
|
||||||
|
DW AUX$WRIT
|
||||||
|
DW AUX$WRST
|
||||||
|
|
||||||
|
ODD
|
||||||
|
TIMTBL LABEL BYTE
|
||||||
|
DB 9
|
||||||
|
DW EXIT
|
||||||
|
DW EXIT
|
||||||
|
DW EXIT
|
||||||
|
DW CMDERR
|
||||||
|
DW TIM$READ
|
||||||
|
DW BUS$EXIT
|
||||||
|
DW EXIT
|
||||||
|
DW EXIT
|
||||||
|
DW TIM$WRIT
|
||||||
|
DW TIM$WRIT
|
||||||
|
|
||||||
|
ODD
|
||||||
|
PRNTBL LABEL BYTE
|
||||||
|
DB 24
|
||||||
|
DW EXIT ;INIT
|
||||||
|
DW EXIT
|
||||||
|
DW EXIT
|
||||||
|
DW CMDERR
|
||||||
|
DW EXIT$ZER ;INDICATE ZERO CHARS READ
|
||||||
|
DW BUS$EXIT
|
||||||
|
DW EXIT
|
||||||
|
DW EXIT
|
||||||
|
DW PRN$WRIT
|
||||||
|
DW PRN$WRIT
|
||||||
|
DW PRN$STAT
|
||||||
|
DW EXIT
|
||||||
|
DW EXIT ;ARR 2.41
|
||||||
|
DW EXIT ;ARR 2.41
|
||||||
|
DW EXIT ;ARR 2.41
|
||||||
|
DW EXIT ;ARR 2.41
|
||||||
|
DW PRN$TILBUSY
|
||||||
|
DW EXIT ;RS 3.20
|
||||||
|
DW EXIT ;RS 3.20
|
||||||
|
DW PRN$GENIOCTL ;RS 3.20
|
||||||
|
DW EXIT ;RS 3.20
|
||||||
|
DW EXIT ;RS 3.20
|
||||||
|
DW EXIT ;RS 3.20
|
||||||
|
DW CMDERR ;RS 3.20
|
||||||
|
DW CMDERR ;RS 3.20
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC OLD13 ;(MOVED HERE FROM IBMBIO2)
|
||||||
|
OLD13 label DWORD
|
||||||
|
db '5986' ;J.K. 11/7/86 Secrete Code for DOS 3.30 IBMBIO.
|
||||||
|
PUBLIC ORIG13
|
||||||
|
ORIG13 label DWORD
|
||||||
|
db '21',0,0 ;J.K. 11/8/86 This is my employee serial # !!!
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC PTRSAV
|
||||||
|
PTRSAV DD 0
|
||||||
|
PUBLIC AUXBUF
|
||||||
|
AUXBUF DB 0,0,0,0 ;SET OF 1 BYTE BUFFERS FOR COM 1,2,3, AND 4
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC PREVOPER,NUMBER_OF_SEC
|
||||||
|
PREVOPER DW ? ; HOLDS INT 13 REQUEST (I.E. REGISTER AX).
|
||||||
|
NUMBER_OF_SEC DB ? ; HOLDS NUMBER OF SECTORS TO READ ON AN ECC ERROR
|
||||||
|
|
||||||
|
IF ($-CODE) GT 100H
|
||||||
|
%OUT VDISK BUFFER NOT CORRECTLY LOCATED
|
||||||
|
ELSE
|
||||||
|
ORG 100H
|
||||||
|
ENDIF
|
||||||
|
PUBLIC VDISK_AREA
|
||||||
|
VDISK_AREA DB 108 DUP(0) ;FOR USE BY VDISK
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
; WARNING!!! THESE ARE ADDRESSED TOGETHER IN GETDX
|
||||||
|
AUXNUM DB 0 ;WHICH AUX DEVICE WAS REQUESTED
|
||||||
|
DB 0
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC CONHEADER
|
||||||
|
CONHEADER LABEL WORD ;HEADER FOR DEVICE "CON"
|
||||||
|
DD AUXDEV2
|
||||||
|
DW 1000000000010011B ;CON IN AND CON OUT + SPECIAL
|
||||||
|
DW STRATEGY
|
||||||
|
DW CON$IN
|
||||||
|
DB 'CON '
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC AUXDEV2
|
||||||
|
AUXDEV2 LABEL WORD ;HEADER FOR DEVICE "AUX"
|
||||||
|
DD PRNDEV2
|
||||||
|
DW 1000000000000000B
|
||||||
|
DW STRATEGY
|
||||||
|
DW AUX0$IN
|
||||||
|
DB 'AUX '
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC PRNDEV2
|
||||||
|
PRNDEV2 LABEL WORD ;HEADER FOR DEVICE "PRN"
|
||||||
|
DD TIMDEV
|
||||||
|
DW CHARDEV + OUTTILBUSY + DEV320
|
||||||
|
DW STRATEGY
|
||||||
|
DW PRN0$IN
|
||||||
|
DB 'PRN '
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC TIMDEV
|
||||||
|
TIMDEV LABEL WORD
|
||||||
|
DD DSKDEV
|
||||||
|
DW 1000000000001000B
|
||||||
|
DW STRATEGY
|
||||||
|
DW TIM$IN
|
||||||
|
DB 'CLOCK$ '
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC DSKDEV
|
||||||
|
DSKDEV LABEL WORD
|
||||||
|
DD COM1DEV
|
||||||
|
DW 0000100001000010B ;J.K.I1. 32 bit sector calculation
|
||||||
|
DW STRATEGY
|
||||||
|
DW DSK$IN
|
||||||
|
DRVMAX DB 4
|
||||||
|
PUBLIC DRVMAX
|
||||||
|
|
||||||
|
PUBLIC STEP_DRV
|
||||||
|
STEP_DRV DB -2 ; ARR 2.20 LAST DRIVE ACCESSED
|
||||||
|
|
||||||
|
PUBLIC PHYS_DRV
|
||||||
|
PHYS_DRV DB 0 ; USED BY SETDRIVE FOR GETTING BDS FOR
|
||||||
|
; LOGICAL DRIVE, OR PHYSICAL DRIVE.
|
||||||
|
PUBLIC FHAVE96
|
||||||
|
FHAVE96 DB 0 ; FLAG TO INDICATE PRESENCE OF
|
||||||
|
; 96TPI SUPPORT
|
||||||
|
PUBLIC SINGLE
|
||||||
|
SINGLE DB 0 ; USED TO DETECT SINGLE DRIVE SYSTEMS
|
||||||
|
|
||||||
|
PUBLIC FHAVEK09
|
||||||
|
FHAVEK09 DB 0 ;INDICATES IF THIS IS A K09 OR NOT
|
||||||
|
; USED BY CONSOLE DRIVER.
|
||||||
|
PUBLIC NEW_ROM
|
||||||
|
NEW_ROM DB 0 ;SET TO 1 IF WE HAVE A ROM THAT CAN
|
||||||
|
; HANDLE STRANGE MEDIA LAYOUTS.
|
||||||
|
|
||||||
|
PUBLIC FSETOWNER
|
||||||
|
FSETOWNER DB ? ;=1 IF WE ARE SETTING THE OWNER OF A
|
||||||
|
;DRIVE. (EXAMINED BY CHECKSINGLE).
|
||||||
|
public Secrete_Code
|
||||||
|
Secrete_Code dw 'jk' ;J.K. 11/7/86 Secrete code for DOS 3.30 IBMBIO.
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC COM1DEV
|
||||||
|
COM1DEV LABEL WORD
|
||||||
|
DD LPT1DEV
|
||||||
|
DW 1000000000000000B
|
||||||
|
DW STRATEGY
|
||||||
|
DW AUX0$IN
|
||||||
|
DB 'COM1 '
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC LPT1DEV
|
||||||
|
LPT1DEV LABEL WORD
|
||||||
|
DD LPT2DEV
|
||||||
|
DW CHARDEV + OUTTILBUSY + DEV320
|
||||||
|
DW STRATEGY
|
||||||
|
DW PRN1$IN
|
||||||
|
DB 'LPT1 '
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC LPT2DEV
|
||||||
|
LPT2DEV LABEL WORD
|
||||||
|
DD LPT3DEV
|
||||||
|
DW CHARDEV + OUTTILBUSY + DEV320
|
||||||
|
DW STRATEGY
|
||||||
|
DW PRN2$IN
|
||||||
|
DB 'LPT2 '
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC LPT3DEV
|
||||||
|
LPT3DEV LABEL WORD
|
||||||
|
DD COM2DEV
|
||||||
|
DW CHARDEV + OUTTILBUSY + DEV320
|
||||||
|
DW STRATEGY
|
||||||
|
DW PRN3$IN
|
||||||
|
DB 'LPT3 '
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC COM2DEV
|
||||||
|
COM2DEV LABEL WORD
|
||||||
|
DD COM3DEV
|
||||||
|
DW 1000000000000000B
|
||||||
|
DW STRATEGY
|
||||||
|
DW AUX1$IN
|
||||||
|
DB 'COM2 '
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC COM3DEV
|
||||||
|
COM3DEV LABEL WORD ;EDK
|
||||||
|
DD COM4DEV
|
||||||
|
DW 1000000000000000B
|
||||||
|
DW STRATEGY
|
||||||
|
DW AUX2$IN
|
||||||
|
DB 'COM3 '
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC COM4DEV
|
||||||
|
COM4DEV LABEL WORD ;EDK
|
||||||
|
DW -1,CODE
|
||||||
|
DW 1000000000000000B
|
||||||
|
DW STRATEGY
|
||||||
|
DW AUX3$IN
|
||||||
|
DB 'COM4 '
|
||||||
|
|
||||||
|
; HARD-WIRE THE LINK TO THE NEXT INT2F HANDLER.
|
||||||
|
EVENB
|
||||||
|
PUBLIC NEXT2F_13
|
||||||
|
NEXT2F_13 LABEL WORD
|
||||||
|
EXTRN INT2F_DISK:FAR ;IBMBIO2
|
||||||
|
DD INT2F_DISK
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC START_BDS
|
||||||
|
START_BDS LABEL WORD
|
||||||
|
DD BDS1 ;START OF BDS LINKED LIST.
|
||||||
|
PUBLIC ACCESSCOUNT
|
||||||
|
ACCESSCOUNT DB 0 ; NUMBER OF TIMES MEDIA CHECK CALLED
|
||||||
|
PUBLIC TIM_DRV
|
||||||
|
TIM_DRV DB -1 ; TIME WHEN LAST DISK I/O PERFORMED
|
||||||
|
PUBLIC FLAGBITS
|
||||||
|
FLAGBITS DW 0 ; BITS TO SET IN FLAG FIELD WHEN DOING
|
||||||
|
; A SET_CHANGED_DL
|
||||||
|
PUBLIC MEDBYT
|
||||||
|
MEDBYT DB ?
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC WRTVERIFY
|
||||||
|
WRTVERIFY LABEL WORD
|
||||||
|
PUBLIC RFLAG
|
||||||
|
RFLAG DB ROMREAD ;2 FOR READ, 3 FOR WRITE
|
||||||
|
VERIFY DB 0 ;1 IF VERIFY AFTER WRITE
|
||||||
|
PUBLIC SECCNT
|
||||||
|
SECCNT DW 0
|
||||||
|
PUBLIC HARDNUM
|
||||||
|
HARDNUM DB 99 ;LOGICAL DRIVE NUMBER OF FIRST HARDFILE
|
||||||
|
PUBLIC MOTORSTARTUP,SETTLECURRENT,SETTLESLOW
|
||||||
|
MOTORSTARTUP DB ? ; VALUE FROM TABLE
|
||||||
|
SETTLECURRENT DB ? ; VALUE FROM TABLE
|
||||||
|
SETTLESLOW DB ? ; SLOW SETTLE VALUE
|
||||||
|
|
||||||
|
NEXTSPEED DB ? ; VALUE OF SPEED TO BE USED
|
||||||
|
public save_head_sttl
|
||||||
|
Save_head_sttl db ? ;used by READ_SECTOR routine
|
||||||
|
|
||||||
|
PUBLIC EOT
|
||||||
|
EOT DB 9
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC DPT
|
||||||
|
DPT DD ?
|
||||||
|
|
||||||
|
;KEEP THE NEXT TWO ITEMS CONTIGUOUS - SEE IOCTL_BLOCK FOR REASON
|
||||||
|
PUBLIC CURSEC,CURHD,CURTRK,SPSAV
|
||||||
|
CURSEC DB 0 ;CURRENT SECTOR
|
||||||
|
CURHD DB 0 ;CURRENT HEAD
|
||||||
|
CURTRK DW 0 ;CURRENT TRACK
|
||||||
|
SPSAV DW 0 ;SAVE THE STACK POINTER
|
||||||
|
|
||||||
|
; THE FOLLOWING ARE USED FOR IOCTL FUNCTION CALLS
|
||||||
|
PUBLIC FORMT_EOT,HDNUM,TRKNUM,GAP_PATCH
|
||||||
|
FORMT_EOT DB 8 ; EOT USED FOR FORMAT
|
||||||
|
HDNUM DB 0 ; HEAD NUMBER
|
||||||
|
TRKNUM DW 0 ; TRACK BEING MANIPULATED
|
||||||
|
GAP_PATCH DB 50H ; FORMAT GAP PATCHED INTO DPT
|
||||||
|
|
||||||
|
;DISK ERRORS RETURNED FROM THE IBM ROM
|
||||||
|
PUBLIC ERRIN
|
||||||
|
ERRIN LABEL BYTE
|
||||||
|
db 0cch ;AN002; Write Fault error
|
||||||
|
DB 80H ;NO RESPONSE
|
||||||
|
DB 40H ;SEEK FAILURE
|
||||||
|
DB 10H ;BAD CRC
|
||||||
|
DB 8 ;DMA OVERRUN
|
||||||
|
DB 6 ; MEDIA CHANGE
|
||||||
|
DB 4 ;SECTOR NOT FOUND
|
||||||
|
DB 3 ;WRITE ATTEMPT TO WRITE-PROTECT DISK
|
||||||
|
PUBLIC LSTERR
|
||||||
|
LSTERR DB 0 ;ALL OTHER ERRORS
|
||||||
|
|
||||||
|
;RETURNED ERROR CODES CORRESPONDING TO ABOVE
|
||||||
|
PUBLIC ERROUT
|
||||||
|
ERROUT LABEL BYTE
|
||||||
|
db 10 ;AN002; Write Fault error
|
||||||
|
DB 2 ;NO RESPONSE
|
||||||
|
DB 6 ;SEEK FAILURE
|
||||||
|
DB 4 ;BAD CRC
|
||||||
|
DB 4 ;DMA OVERRUN
|
||||||
|
DB 15 ; INVALID MEDIA CHANGE
|
||||||
|
DB 8 ;SECTOR NOT FOUND
|
||||||
|
DB 0 ;WRITE ATTEMPT ON WRITE-PROTECT DISK
|
||||||
|
DB 12 ;GENERAL ERROR
|
||||||
|
PUBLIC NUMERR
|
||||||
|
NUMERR = ERROUT-ERRIN
|
||||||
|
|
||||||
|
;-------------------------------------------------------------
|
||||||
|
|
||||||
|
; READ IN BOOT SECTOR HERE, READ DONE IN READBOOT.
|
||||||
|
; ALSO READ SECTOR FOR DMA CHECK FOR HARD DISK.
|
||||||
|
|
||||||
|
;J.K. The buffer for a disk sector is going to be at a double word boundary
|
||||||
|
; for 80386 machine.
|
||||||
|
|
||||||
|
IF ($-CODE) Mod 4 ;AN001;
|
||||||
|
Org ($-CODE)+4-(($-CODE) Mod 4) ;AN001;
|
||||||
|
ENDIF ;AN001;
|
||||||
|
|
||||||
|
PUBLIC DISKSECTOR
|
||||||
|
DiskSector DB 11 DUP(?) ; TAKE CARE OF 3 JUMP BYTES PLUS OEM NAME.
|
||||||
|
PUBLIC BPB_IN_SECTOR
|
||||||
|
Bpb_In_Sector DW ?
|
||||||
|
PUBLIC SECPERCLUSINSECTOR
|
||||||
|
SecPerClusInSector DB ?
|
||||||
|
DW ?
|
||||||
|
public NumberOfFats
|
||||||
|
NumberOfFats DB ?
|
||||||
|
DW ?
|
||||||
|
DW ?
|
||||||
|
PUBLIC MEDIABYTE
|
||||||
|
MediaByte DB ?
|
||||||
|
DW ?
|
||||||
|
DW ?
|
||||||
|
DW ?
|
||||||
|
DW ?
|
||||||
|
DW ? ;AN000; Extended Hidden sector (high)
|
||||||
|
DW ? ;AN000; Extended Total sector (low)
|
||||||
|
DW ? ;AN000; Extended Total sector (high)
|
||||||
|
db ? ;AN003; PHYDRV in boot record.
|
||||||
|
db ? ;AN003; CURRENT HEAD in boot record.
|
||||||
|
public Ext_Boot_Sig
|
||||||
|
Ext_Boot_Sig DB ? ;AN000; Extended Boot record sig. (=90h)
|
||||||
|
public Boot_Serial_L
|
||||||
|
Boot_Serial_L DW ? ;AN000; Boot volume serial number (Low)
|
||||||
|
public Boot_Serial_H
|
||||||
|
Boot_Serial_H DW ? ;AN000; Boot volume serial number (High)
|
||||||
|
public Boot_Volume_Label
|
||||||
|
Boot_Volume_Label DB 11 dup (' ') ;AN000; Volume label
|
||||||
|
public Boot_System_ID
|
||||||
|
Boot_System_ID DB 8 dup (' ') ;AN000; File system Id.
|
||||||
|
DB 512-($-DISKSECTOR) DUP (?)
|
||||||
|
|
||||||
|
;*********************************************************************
|
||||||
|
; "BDS" CONTAINS INFORMATION FOR EACH DRIVE IN THE SYSTEM.
|
||||||
|
; VARIOUS VALUES ARE PATCHED WHENEVER ACTIONS ARE PERFORMED.
|
||||||
|
; SECTORS/ALLOC. UNIT IN BPB INITIALLY SET TO -1 TO SIGNIFY THAT
|
||||||
|
; THE BPB HAS NOT BEEN FILLED. LINK ALSO SET TO -1 TO SIGNIFY END
|
||||||
|
; OF LIST. # OF CYLINDERS IN MAXPARMS INITIALIZED TO -1 TO INDICATE
|
||||||
|
; THAT THE PARAMETERS HAVE NOT BEEN SET.
|
||||||
|
;
|
||||||
|
EVENB
|
||||||
|
BDS1 LABEL WORD
|
||||||
|
DD BDS2 ;LINK TO NEXT STRUCTURE
|
||||||
|
DB 0 ;INT 13 DRIVE NUMBER
|
||||||
|
DB 0 ;LOGICAL DRIVE LETTER
|
||||||
|
PUBLIC FDRIVE1
|
||||||
|
FDRIVE1 DW 512 ;PHYSICAL SECTOR SIZE IN BYTES
|
||||||
|
DB -1 ;SECTORS/ALLOCATION UNIT
|
||||||
|
DW 1 ;RESERVED SECTORS FOR DOS
|
||||||
|
DB 2 ;NO. ALLOCATION TABLES
|
||||||
|
DW 64 ;NUMBER DIRECTORY ENTRIES
|
||||||
|
DW 9*40 ;NUMBER SECTORS (AT 512 BYTES EA.)
|
||||||
|
DB 00000000B ;MEDIA DESCRIPTOR, INITIALLY 00H.
|
||||||
|
DW 2 ;NUMBER OF FAT SECTORS
|
||||||
|
DW 9 ;SECTOR LIMIT
|
||||||
|
DW 1 ;HEAD LIMIT
|
||||||
|
DW 0 ;HIDDEN SECTOR COUNT (low word)
|
||||||
|
dw 0 ;J.K. Hidden sector (high)
|
||||||
|
dw 0 ;J.K. Number sectors (low)
|
||||||
|
dw 0 ;J.K. Number sectors (high)
|
||||||
|
DB 0 ; TRUE => LARGE FATS
|
||||||
|
OPCNT1 DW 0 ;OPEN REF. COUNT
|
||||||
|
|
||||||
|
DB 3 ;FORM FACTOR
|
||||||
|
FLAGS1 DW 0020H ;VARIOUS FLAGS
|
||||||
|
; DB 9 DUP (0) ;RESERVED FOR FUTURE USE
|
||||||
|
DW 40 ; NUMBER OF CYLINDERS
|
||||||
|
; RECOMMENDED BPB FOR DRIVE.
|
||||||
|
RECBPB1 DW 512 ;BYTES PER SECTOR
|
||||||
|
DB 1 ;SECTORS/ALLOCATION UNIT
|
||||||
|
DW 1 ;RESERVED SECTORS FOR DOS
|
||||||
|
DB 2 ;NO. ALLOCATION TABLES
|
||||||
|
DW 0E0H ;NUMBER DIRECTORY ENTRIES
|
||||||
|
DW 9*40 ;NUMBER SECTORS (AT 512 BYTES EA.)
|
||||||
|
DB 0F0H ;MEDIA DESCRIPTOR, INITIALLY F0H.
|
||||||
|
DW 2 ;NUMBER OF FAT SECTORS
|
||||||
|
DW 9 ;SECTOR LIMIT
|
||||||
|
DW 2 ;HEAD LIMIT
|
||||||
|
DW 0 ;HIDDEN SECTOR COUNT(low)
|
||||||
|
dw 0 ;J.K. Hidden sector count (high)
|
||||||
|
dw 0 ;J.K. Number sectors (low)
|
||||||
|
dw 0 ;J.K. Number sectors (high)
|
||||||
|
DB 6 DUP (?)
|
||||||
|
TRACK1 DB -1 ;LAST TRACK ACCESSED ON THIS DRIVE
|
||||||
|
TIM_LO1 DW -1 ;KEEP THESE TWO CONTIGUOUS (?)
|
||||||
|
TIM_HI1 DW -1
|
||||||
|
VOLID1 DB "NO NAME ",0 ;VOLUME ID FOR THIS DISK
|
||||||
|
VOLSER1 dd 0 ;Current volume serial number from Boot record
|
||||||
|
SYSID1 db "FAT12 ",0 ;Current file system id from Boot record
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
BDS2 LABEL WORD
|
||||||
|
DD BDS3 ;LINK TO NEXT STRUCTURE
|
||||||
|
DB 0 ;INT 13 DRIVE NUMBER
|
||||||
|
DB 0 ;LOGICAL DRIVE LETTER
|
||||||
|
PUBLIC FDRIVE2
|
||||||
|
FDRIVE2 DW 512 ;PHYSICAL SECTOR SIZE IN BYTES
|
||||||
|
DB -1 ;SECTORS/ALLOCATION UNIT
|
||||||
|
DW 1 ;RESERVED SECTORS FOR DOS
|
||||||
|
DB 2 ;NO. ALLOCATION TABLES
|
||||||
|
DW 64 ;NUMBER DIRECTORY ENTRIES
|
||||||
|
DW 9*40 ;NUMBER SECTORS (AT 512 BYTES EA.)
|
||||||
|
DB 00000000B ;MEDIA DESCRIPTOR, INITIALLY 00H.
|
||||||
|
DW 2 ;NUMBER OF FAT SECTORS
|
||||||
|
DW 9 ;SECTOR LIMIT
|
||||||
|
DW 1 ;HEAD LIMIT
|
||||||
|
DW 0 ;HIDDEN SECTOR COUNT (low word)
|
||||||
|
dw 0 ;J.K. Hidden sector (high)
|
||||||
|
dw 0 ;J.K. Number sectors (low)
|
||||||
|
dw 0 ;J.K. Number sectors (high)
|
||||||
|
DB 0 ; TRUE => LARGE FATS
|
||||||
|
OPCNT2 DW 0 ;OPEN REF. COUNT
|
||||||
|
DB 3 ;FORM FACTOR
|
||||||
|
FLAGS2 DW 0020H ;VARIOUS FLAGS
|
||||||
|
; DB 9 DUP (0) ;RESERVED FOR FUTURE USE
|
||||||
|
DW 40 ; NUMBER OF CYLINDERS
|
||||||
|
; RECOMMENDED BPB FOR DRIVE.
|
||||||
|
RECBPB2 DW 512 ;BYTES PER SECTOR
|
||||||
|
DB 1 ;SECTORS/ALLOCATION UNIT
|
||||||
|
DW 1 ;RESERVED SECTORS FOR DOS
|
||||||
|
DB 2 ;NO. ALLOCATION TABLES
|
||||||
|
DW 0E0H ;NUMBER DIRECTORY ENTRIES
|
||||||
|
DW 9*40 ;NUMBER SECTORS (AT 512 BYTES EA.)
|
||||||
|
DB 0F0H ;MEDIA DESCRIPTOR, INITIALLY F0H.
|
||||||
|
DW 2 ;NUMBER OF FAT SECTORS
|
||||||
|
DW 9 ;SECTOR LIMIT
|
||||||
|
DW 2 ;HEAD LIMIT
|
||||||
|
DW 0 ;HIDDEN SECTOR COUNT(low)
|
||||||
|
dw 0 ;J.K. Hidden sector count (high)
|
||||||
|
dw 0 ;J.K. Number sectors (low)
|
||||||
|
dw 0 ;J.K. Number sectors (high)
|
||||||
|
DB 6 DUP (?)
|
||||||
|
TRACK2 DB -1 ;LAST TRACK ACCESSED ON THIS DRIVE
|
||||||
|
TIM_LO2 DW -1 ;KEEP THESE TWO CONTIGUOUS (?)
|
||||||
|
TIM_HI2 DW -1
|
||||||
|
VOLID2 DB "NO NAME ",0 ;VOLUME ID FOR THIS DISK
|
||||||
|
VOLSER2 dd 0 ;Current volume serial number from Boot record
|
||||||
|
SYSID2 db "FAT12 ",0 ;Current file system id from Boot record
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
BDS3 LABEL WORD
|
||||||
|
DD BDS4 ;LINK TO NEXT STRUCTURE
|
||||||
|
DB 0 ;INT 13 DRIVE NUMBER
|
||||||
|
DB 0 ;LOGICAL DRIVE LETTER
|
||||||
|
PUBLIC FDRIVE3
|
||||||
|
FDRIVE3 DW 512 ;PHYSICAL SECTOR SIZE IN BYTES
|
||||||
|
DB -1 ;SECTORS/ALLOCATION UNIT
|
||||||
|
DW 1 ;RESERVED SECTORS FOR DOS
|
||||||
|
DB 2 ;NO. ALLOCATION TABLES
|
||||||
|
DW 64 ;NUMBER DIRECTORY ENTRIES
|
||||||
|
DW 9*40 ;NUMBER SECTORS (AT 512 BYTES EA.)
|
||||||
|
DB 00000000B ;MEDIA DESCRIPTOR, INITIALLY 00H.
|
||||||
|
DW 2 ;NUMBER OF FAT SECTORS
|
||||||
|
DW 9 ;SECTOR LIMIT
|
||||||
|
DW 1 ;HEAD LIMIT
|
||||||
|
DW 0 ;HIDDEN SECTOR COUNT (low word)
|
||||||
|
dw 0 ;J.K. Hidden sector (high)
|
||||||
|
dw 0 ;J.K. Number sectors (low)
|
||||||
|
dw 0 ;J.K. Number sectors (high)
|
||||||
|
DB 0 ; TRUE => LARGE FATS
|
||||||
|
OPCNT3 DW 0 ;OPEN REF. COUNT
|
||||||
|
DB 3 ;FORM FACTOR
|
||||||
|
FLAGS3 DW 0020H ;VARIOUS FLAGS
|
||||||
|
; DB 9 DUP (0) ;RESERVED FOR FUTURE USE
|
||||||
|
DW 40 ; NUMBER OF CYLINDERS
|
||||||
|
; RECOMMENDED BPB FOR DRIVE.
|
||||||
|
RECBPB3 DW 512 ;BYTES PER SECTOR
|
||||||
|
DB 1 ;SECTORS/ALLOCATION UNIT
|
||||||
|
DW 1 ;RESERVED SECTORS FOR DOS
|
||||||
|
DB 2 ;NO. ALLOCATION TABLES
|
||||||
|
DW 0E0H ;NUMBER DIRECTORY ENTRIES
|
||||||
|
DW 9*40 ;NUMBER SECTORS (AT 512 BYTES EA.)
|
||||||
|
DB 0F0H ;MEDIA DESCRIPTOR, INITIALLY F0H.
|
||||||
|
DW 2 ;NUMBER OF FAT SECTORS
|
||||||
|
DW 9 ;SECTOR LIMIT
|
||||||
|
DW 2 ;HEAD LIMIT
|
||||||
|
DW 0 ;HIDDEN SECTOR COUNT(low)
|
||||||
|
dw 0 ;J.K. Hidden sector count (high)
|
||||||
|
dw 0 ;J.K. Number sectors (low)
|
||||||
|
dw 0 ;J.K. Number sectors (high)
|
||||||
|
DB 6 DUP (?)
|
||||||
|
TRACK3 DB -1 ;LAST TRACK ACCESSED ON THIS DRIVE
|
||||||
|
TIM_LO3 DW -1 ;KEEP THESE TWO CONTIGUOUS (?)
|
||||||
|
TIM_HI3 DW -1
|
||||||
|
VOLID3 DB "NO NAME ",0 ;VOLUME ID FOR THIS DISK
|
||||||
|
VOLSER3 dd 0 ;Current volume serial number from Boot record
|
||||||
|
SYSID3 db "FAT12 ",0 ;Current file system id from Boot record
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
BDS4 LABEL WORD
|
||||||
|
DW -1 ;LINK TO NEXT STRUCTURE
|
||||||
|
DW CODE
|
||||||
|
DB 0 ;INT 13 DRIVE NUMBER
|
||||||
|
DB 0 ;LOGICAL DRIVE LETTER
|
||||||
|
PUBLIC FDRIVE4
|
||||||
|
FDRIVE4 DW 512 ;PHYSICAL SECTOR SIZE IN BYTES
|
||||||
|
DB -1 ;SECTORS/ALLOCATION UNIT
|
||||||
|
DW 1 ;RESERVED SECTORS FOR DOS
|
||||||
|
DB 2 ;NO. ALLOCATION TABLES
|
||||||
|
DW 64 ;NUMBER DIRECTORY ENTRIES
|
||||||
|
DW 9*40 ;NUMBER SECTORS (AT 512 BYTES EA.)
|
||||||
|
DB 00000000B ;MEDIA DESCRIPTOR, INITIALLY 00H.
|
||||||
|
DW 2 ;NUMBER OF FAT SECTORS
|
||||||
|
DW 9 ;SECTOR LIMIT
|
||||||
|
DW 1 ;HEAD LIMIT
|
||||||
|
DW 0 ;HIDDEN SECTOR COUNT (low word)
|
||||||
|
dw 0 ;J.K. Hidden sector (high)
|
||||||
|
dw 0 ;J.K. Number sectors (low)
|
||||||
|
dw 0 ;J.K. Number sectors (high)
|
||||||
|
DB 0 ; TRUE => LARGE FATS
|
||||||
|
OPCNT4 DW 0 ;OPEN REF. COUNT
|
||||||
|
DB 3 ;FORM FACTOR
|
||||||
|
FLAGS4 DW 0020H ;VARIOUS FLAGS
|
||||||
|
; DB 9 DUP (0) ;RESERVED FOR FUTURE USE
|
||||||
|
DW 40 ; NUMBER OF CYLINDERS
|
||||||
|
; RECOMMENDED BPB FOR DRIVE.
|
||||||
|
RECBPB4 DW 512 ;BYTES PER SECTOR
|
||||||
|
DB 1 ;SECTORS/ALLOCATION UNIT
|
||||||
|
DW 1 ;RESERVED SECTORS FOR DOS
|
||||||
|
DB 2 ;NO. ALLOCATION TABLES
|
||||||
|
DW 0E0H ;NUMBER DIRECTORY ENTRIES
|
||||||
|
DW 9*40 ;NUMBER SECTORS (AT 512 BYTES EA.)
|
||||||
|
DB 0F0H ;MEDIA DESCRIPTOR, INITIALLY F0H.
|
||||||
|
DW 2 ;NUMBER OF FAT SECTORS
|
||||||
|
DW 9 ;SECTOR LIMIT
|
||||||
|
DW 2 ;HEAD LIMIT
|
||||||
|
DW 0 ;HIDDEN SECTOR COUNT(low)
|
||||||
|
dw 0 ;J.K. Hidden sector count (high)
|
||||||
|
dw 0 ;J.K. Number sectors (low)
|
||||||
|
dw 0 ;J.K. Number sectors (high)
|
||||||
|
DB 6 DUP (?)
|
||||||
|
TRACK4 DB -1 ;LAST TRACK ACCESSED ON THIS DRIVE
|
||||||
|
TIM_LO4 DW -1 ;KEEP THESE TWO CONTIGUOUS (?)
|
||||||
|
TIM_HI4 DW -1
|
||||||
|
VOLID4 DB "NO NAME ",0 ;VOLUME ID FOR THIS DISK
|
||||||
|
VOLSER4 dd 0 ;Current volume serial number from Boot record
|
||||||
|
SYSID4 db "FAT12 ",0 ;Current file system id from Boot record
|
||||||
|
|
||||||
|
BPBTYPE STRUC
|
||||||
|
SPF DB ?
|
||||||
|
SPT DB ?
|
||||||
|
CDIRE DB ?
|
||||||
|
CSEC DW ?
|
||||||
|
SPA DB ?
|
||||||
|
CHEAD DB ?
|
||||||
|
BPBTYPE ENDS
|
||||||
|
PUBLIC SM92
|
||||||
|
SM92 BPBTYPE <3,9,70H,2*9*80,2,2>
|
||||||
|
|
||||||
|
;-----------------------------------------------
|
||||||
|
;
|
||||||
|
; C O N - CONSOLE DEVICE DRIVER
|
||||||
|
;
|
||||||
|
PUBLIC ALTAH
|
||||||
|
ALTAH DB 0 ;SPECIAL KEY HANDLING
|
||||||
|
public KEYRD_Func
|
||||||
|
KEYRD_Func DB 0 ;AN000; Default is conventional keyboard read
|
||||||
|
public KEYSTS_Func
|
||||||
|
KEYSTS_Func DB 1 ;AN000; Defualt if conventional keyboard status check.
|
||||||
|
|
||||||
|
; PUBLIC SAV_SC_INFO ;J.K. 4/29/86 FOR CON$GENIOCTL
|
||||||
|
; PUBLIC SAV_SC_MODE
|
||||||
|
; PUBLIC SAV_SC_COLORS
|
||||||
|
; PUBLIC SAV_SC_WIDTH
|
||||||
|
; PUBLIC SAV_SC_LENGTH
|
||||||
|
;SAV_SC_INFO LABEL BYTE
|
||||||
|
;SAV_SC_MODE DB 0
|
||||||
|
;SAV_SC_COLORS DW 0
|
||||||
|
;SAV_SC_WIDTH DW 0
|
||||||
|
;SAV_SC_LENGTH DW 0 ;J.K. 4/29/86 FOR CON$GENIOCTL
|
||||||
|
|
||||||
|
;-------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; P R N - PRINTER DEVICE
|
||||||
|
;
|
||||||
|
PUBLIC PRINTDEV
|
||||||
|
PRINTDEV DB 0 ; INDEX INTO ABOVE ARRAY
|
||||||
|
|
||||||
|
; THE FOLLOWING VARIABLE CAN BE MODIFIED VIA IOCTL SUB-FUNCTION 16. IN THIS
|
||||||
|
; WAY, THE WAIT CAN BE SET TO SUIT THE SPEED OF THE PARTICULAR PRINTER BEING
|
||||||
|
; USED. ONE FOR EACH PRINTER DEVICE.
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC WAIT_COUNT
|
||||||
|
WAIT_COUNT DW 4 DUP (50H) ; ARRAY OF RETRY COUNTS FOR PRINTER
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC DAYCNT
|
||||||
|
DAYCNT DW 0
|
||||||
|
|
||||||
|
|
||||||
|
IF iTEST ;Testing Mode for IBMBIO.
|
||||||
|
PUBLIC NUMBUF
|
||||||
|
NUMBUF DB 5 DUP (?)
|
||||||
|
PUBLIC DIGITS
|
||||||
|
DIGITS DB "0123456789ABCDEF"
|
||||||
|
PUBLIC FTESTBITS
|
||||||
|
;FTESTBITS DW FTESTDISK+FTESTINIT
|
||||||
|
FTESTBITS DW fTestDISK
|
||||||
|
;ftestbits dw ftestclock
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
PATHEND 001,BIO
|
||||||
|
|
14
v4.0/src/BIOS/MSBIO.LNK
Normal file
14
v4.0/src/BIOS/MSBIO.LNK
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
msbio1+
|
||||||
|
msCON+
|
||||||
|
msAUX+
|
||||||
|
msLPT+
|
||||||
|
msCLOCK+
|
||||||
|
msDISK+
|
||||||
|
msBIO2+
|
||||||
|
mshard+
|
||||||
|
msinit+
|
||||||
|
sysinit1+
|
||||||
|
sysconf+
|
||||||
|
sysinit2+
|
||||||
|
sysimes,msbio,msBIO/M;
|
||||||
|
|
139
v4.0/src/BIOS/MSBIO.SKL
Normal file
139
v4.0/src/BIOS/MSBIO.SKL
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
;==============================================================================
|
||||||
|
;REVISION HISTORY:
|
||||||
|
;AN000 - New for DOS Version 4.0 - J.K.
|
||||||
|
;AC000 - Changed for DOS Version 4.0 - J.K.
|
||||||
|
;AN00x - PTM number for DOS Version 4.0 - J.K.
|
||||||
|
;==============================================================================
|
||||||
|
;==============================================================================
|
||||||
|
;AN001 D246, P976 Show "Bad command or parameters - ..." msg 9/22/87 J.K.
|
||||||
|
;AN002 D274 Take "file" out from "Incorrect order..." msg 10/07/87 J.K.
|
||||||
|
;AN003 D486 Share installation for large media 02/24/88 J.K.
|
||||||
|
;==============================================================================
|
||||||
|
;===================
|
||||||
|
:class 1
|
||||||
|
;===================
|
||||||
|
; MESSAGES FOR THE IBM BOOT SECTOR. NUL Terminated.
|
||||||
|
; This is used by IBMBOOT and IBMLOAD program and it stays in IBMBOOT directory.
|
||||||
|
|
||||||
|
;For IBMLOAD program
|
||||||
|
;SYSMSG DB 13,10,"Non-System disk or disk error",13,10
|
||||||
|
; DB "Replace and strike any key when ready",13,10,0
|
||||||
|
:use 001 BOOT SYSMSG
|
||||||
|
|
||||||
|
;===================
|
||||||
|
:class 2
|
||||||
|
;===================
|
||||||
|
; SCCSID = @(#)biomes.asm 1.2 85/07/25
|
||||||
|
; SINGLE DRIVE MESSAGE FOR IBMBIO.COM. NUL TERMINATED.
|
||||||
|
;IFNDEF PATHSTART
|
||||||
|
;PATHSTART MACRO INDEX,ABBR
|
||||||
|
; IFDEF PATHGEN
|
||||||
|
; PUBLIC ABBR&INDEX&S,ABBR&INDEX&E
|
||||||
|
; ABBR&INDEX&S LABEL BYTE
|
||||||
|
; ENDIF
|
||||||
|
; ENDM
|
||||||
|
;ENDIF
|
||||||
|
;
|
||||||
|
;IFNDEF PATHEND
|
||||||
|
;PATHEND MACRO INDEX,ABBR
|
||||||
|
; IFDEF PATHGEN
|
||||||
|
; ABBR&INDEX&E LABEL BYTE
|
||||||
|
; ENDIF
|
||||||
|
; ENDM
|
||||||
|
;ENDIF
|
||||||
|
; PATHSTART 001,BIOMS
|
||||||
|
|
||||||
|
|
||||||
|
:def 20 SNGMSG DB 13,10,"Insert diskette for drive "
|
||||||
|
:def 21 DRVLET DB "A: and strike",13,10,"any key when ready",13,10,10,0
|
||||||
|
|
||||||
|
; PATHEND 001,BIOMS
|
||||||
|
|
||||||
|
;==================
|
||||||
|
:class 3
|
||||||
|
;==================
|
||||||
|
|
||||||
|
; PRINTED when there is a bad command in CONFIG.SYS. '$' TERMINATED, note
|
||||||
|
; that this message includes crlfm!
|
||||||
|
;PATHSTART 001,SYSMES
|
||||||
|
|
||||||
|
:def 03 BADOPM DB 13,10,"Unrecognized command in CONFIG.SYS"
|
||||||
|
|
||||||
|
;BADSIZ_POST LABEL BYTE
|
||||||
|
;BADLD_POST LABEL BYTE
|
||||||
|
|
||||||
|
:def 04 CRLFM DB 13,10,'$'
|
||||||
|
|
||||||
|
:def 22 BadParm db 13,10,"Bad command or parameters - $" ;AN001;
|
||||||
|
|
||||||
|
;PRINTED when installed device specifies too large a sector size.'$' terminated.
|
||||||
|
; FORM: <BADSIZ_PRE>device name<BADSIZ_POST>
|
||||||
|
:def 05 BADSIZ_PRE DB 13,10,"Sector size too large in file $"
|
||||||
|
|
||||||
|
;PRINTED when installed device cannot be found. '$' terminated.
|
||||||
|
; FORM: <BADLD_PRE>device name<BADLD_POST>
|
||||||
|
:def 06 BADLD_PRE DB 13,10,"Bad or missing $"
|
||||||
|
|
||||||
|
;PRINTED when command interpreter is not found. NUL terminated.
|
||||||
|
; FORM: <BADLD_PRE><BADCOM><BADLD_POST>
|
||||||
|
:def 07 BADCOM DB "Command Interpreter",0
|
||||||
|
|
||||||
|
;PRINTED when country code, code page combination was not found in country.sys file. '$' terminated.
|
||||||
|
; FORM: <BADCOUNTRY>
|
||||||
|
:def 08 BADCOUNTRY DB 13,10,"Invalid country code or code page",13,10,"$"
|
||||||
|
|
||||||
|
;PRINTED when code page id is missing or wrong syntax. - J.K.
|
||||||
|
; FORM: <BADCOUNTRYCOM>
|
||||||
|
:def 09 BADCOUNTRYCOM DB 13,10,"Error in COUNTRY command",13,10,"$"
|
||||||
|
|
||||||
|
;PRINTED when the memory left is not sufficient to handle COUTRY.SYS file
|
||||||
|
; FORM: <INSUFMEMORY>
|
||||||
|
:def 10 INSUFMEMORY DB 13,10, "Insufficient memory for COUNTRY.SYS file",13,10,"$"
|
||||||
|
|
||||||
|
; PRINTED when there is insufficient memory. '$' TERMINATED, note
|
||||||
|
; that this message includes crlfm!
|
||||||
|
:def 11 BADMEM DB 13,10,"Configuration too large for memory",13,10,"$"
|
||||||
|
|
||||||
|
; PRINTED when the attempt is made to install a block device which would
|
||||||
|
; have a drive letter > 'Z'
|
||||||
|
:def 12 BADBLOCK DB 13,10,"Too many Block Devices",13,10,"$"
|
||||||
|
|
||||||
|
; PRINTED when the attempt is made to install a stack with invalid
|
||||||
|
; combinations of # of stacks, stack size. - J.K. 5/23/86
|
||||||
|
:def 13 BADSTACK DB 13,10,"Invalid STACK parameters",13,10,"$"
|
||||||
|
|
||||||
|
;AN000; - PRINTED when encountering a command that is not "install=" after
|
||||||
|
; we had a "Install=" command. - J.K.I1.
|
||||||
|
; Translation::: Please leave the last blank space at the end of the line
|
||||||
|
; as it is.
|
||||||
|
:def 14 BADORDER DB 13,10,"Incorrect order in CONFIG.SYS line ","$"
|
||||||
|
|
||||||
|
;AN000; - PRINTED when the command failed.
|
||||||
|
; Translation::: Please leave the last blank space at the end of the line
|
||||||
|
; as it is.
|
||||||
|
:def 15 ERRORCMD DB "Error in CONFIG.SYS line ","$"
|
||||||
|
|
||||||
|
;AN003; - PRINTED when SHARE.EXE is not loaded and has a large media > 32 MB.
|
||||||
|
:def 23 SHAREWARNMSG db "WARNING! SHARE should be loaded for large media",13,10,"$"
|
||||||
|
|
||||||
|
;==================
|
||||||
|
:class 4
|
||||||
|
;==================
|
||||||
|
;IBMBIO SYSINIT
|
||||||
|
;Message for SYSINIT_BASE program.
|
||||||
|
:def 16 Mem_alloc_err db 13,10,"Memory allocation error","$"
|
||||||
|
|
||||||
|
|
||||||
|
;==================
|
||||||
|
:class 5
|
||||||
|
;==================
|
||||||
|
; %OUT STKMES.INC...
|
||||||
|
; SCCSID = @(#)stkmes.inc 1.0 86/10/21
|
||||||
|
|
||||||
|
; PUBLIC FATAL_MSG
|
||||||
|
:def 17 FATAL_MSG DB 0DH,0AH,7,0DH,0AH
|
||||||
|
DB "Internal stack overflow",0DH,0AH
|
||||||
|
DB "System halted",0DH,0AH,"$"
|
||||||
|
;
|
||||||
|
:END
|
||||||
|
|
645
v4.0/src/BIOS/MSBIO1.ASM
Normal file
645
v4.0/src/BIOS/MSBIO1.ASM
Normal file
@ -0,0 +1,645 @@
|
|||||||
|
|
||||||
|
PAGE ,132 ;
|
||||||
|
TITLE MSBIO1.asm - BIOS
|
||||||
|
;==============================================================================
|
||||||
|
;REVISION HISTORY:
|
||||||
|
;AN000 - New for DOS Version 4.00 - J.K.
|
||||||
|
;AC000 - Changed for DOS Version 4.00 - J.K.
|
||||||
|
;AN00x - PTM number for DOS Version 4.00 - J.K.
|
||||||
|
;==============================================================================
|
||||||
|
COMMENT *
|
||||||
|
THE LINK STEP IS PERFORMED BY USING THE FOLLOWING "NEW.ARF" FILE:
|
||||||
|
msbio1+
|
||||||
|
msSTACK+
|
||||||
|
MsCON+
|
||||||
|
msAUX+
|
||||||
|
msLPT+
|
||||||
|
msCLOCK+
|
||||||
|
msdISK+
|
||||||
|
msBIO2+
|
||||||
|
C:\BIO2\OLDOBJ\disk+
|
||||||
|
C:\BIO2\OLDOBJ\msinit+
|
||||||
|
C:\BIO2\OLDOBJ\sysinit1+
|
||||||
|
C:\BIO2\OLDOBJ\sysinit2+
|
||||||
|
C:\BIO2\OLDOBJ\sysimes,msbio,/M;
|
||||||
|
|
||||||
|
THE FOLLOWING IS A BATCH FILE THAT CAN BE USED TO CREATE THE IBMBIO.COM
|
||||||
|
WHERE "LOCSCR" IS A FILE THAT JUST HAS THE NUMBER, 70:
|
||||||
|
|
||||||
|
link @NEW.ARF
|
||||||
|
exe2bin ibmbio ibmbio.com <C:\BIO2\Locscr
|
||||||
|
del ibmbio.exe
|
||||||
|
(END OF COMMENT)*
|
||||||
|
|
||||||
|
;***For testing purposes, set the TEST flag to 1. Otherwise reset it.
|
||||||
|
|
||||||
|
iTEST=0
|
||||||
|
|
||||||
|
PATHGEN = 1
|
||||||
|
|
||||||
|
.SALL
|
||||||
|
%OUT ...MSBIO1.ASM
|
||||||
|
|
||||||
|
; THIS IS A DOSMAC MACRO WHICH IS USED IN DEVSYM WHICH IS INCLUDED LATER
|
||||||
|
BREAK MACRO SUBTITLE
|
||||||
|
SUBTTL SUBTITLE
|
||||||
|
PAGE
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
POPFF MACRO
|
||||||
|
JMP $+3
|
||||||
|
IRET
|
||||||
|
PUSH CS
|
||||||
|
CALL $-2
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
INCLUDE MSGROUP.INC ;DEFINE CODE SEGMENT
|
||||||
|
|
||||||
|
SYSINITSEG SEGMENT PUBLIC 'SYSTEM_INIT'
|
||||||
|
SYSINITSEG ENDS
|
||||||
|
|
||||||
|
|
||||||
|
INCLUDE JUMPMAC.INC
|
||||||
|
PATHSTART MACRO INDEX,ABBR
|
||||||
|
IFDEF PATHGEN
|
||||||
|
PUBLIC ABBR&INDEX&S,ABBR&INDEX&E
|
||||||
|
ABBR&INDEX&S LABEL BYTE
|
||||||
|
ENDIF
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
PATHEND MACRO INDEX,ABBR
|
||||||
|
IFDEF PATHGEN
|
||||||
|
ABBR&INDEX&E LABEL BYTE
|
||||||
|
ENDIF
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
INCLUDE PUSHPOP.INC
|
||||||
|
INCLUDE DEVSYM.INC ;MJB001
|
||||||
|
|
||||||
|
; REV 2.1 5/1/83 ARR ADDED TIMER INT HANDLER AND CHANGED ORDER OF AUX
|
||||||
|
; PRN INIT FOR HAL0
|
||||||
|
;
|
||||||
|
; REV 2.15 7/13/83 ARR BECAUSE IBM IS FUNDAMENTALY BRAIN DAMAGED, AND
|
||||||
|
; BASCOM IS RUDE ABOUT THE 1CH TIMER INTERRUPT, THE TIMER
|
||||||
|
; HANDLER HAS TO GO BACK OUT!!!!! IBM SEEMS UNWILLING TO
|
||||||
|
; BELIEVE THE PROBLEM IS WITH THE BASCOM RUNTIME, NOT THE
|
||||||
|
; DOS. THEY HAVE EVEN BEEN GIVEN A PATCH FOR BASCOM!!!!!
|
||||||
|
; THE CORRECT CODE IS COMMENTED OUT AND HAS AN ARR 2.15
|
||||||
|
; ANNOTATION. THIS MEANS THE BIOS WILL GO BACK TO THE
|
||||||
|
; MULTIPLE ROLL OVER BUG.
|
||||||
|
; REV 2.20 8/5/83 ARR IBM MAKES HARDWARE CHANGE. NOW WANTS TO USE HALF
|
||||||
|
; HIGHT DRIVES FOR HAL0, AND BACK FIT FOR PC/PC XT. PROBLEM
|
||||||
|
; WITH HEAD SETTLE TIME. PREVIOUS DRIVES GOT BY ON A 0
|
||||||
|
; SETTLE TIME, 1/2 HIGHT DRIVES NEED 15 HEAD SETTLE WHEN
|
||||||
|
; DOING WRITES (0 OK ON READ) IF THE HEAD IS BEING STEPPED.
|
||||||
|
; THIS REQUIRES A LAST TRACK VALUE TO BE KEPT SO THAT BIOS
|
||||||
|
; KNOWS WHEN HEAD IS BEING MOVED. TO HELP OUT STUPID
|
||||||
|
; PROGRAMS THAT ISSUE INT 13H DIRECTLY, THE HEAD SETTLE WILL
|
||||||
|
; NORMALLY BE SET TO 15. IT WILL BE CHANGED TO 0 ON READS,
|
||||||
|
; OR ON WRITES WHICH DO NOT REQUIRE HEAD STEP.
|
||||||
|
; REV 2.21 8/11/83 MZ IBM WANTS WRITE WITH VERIFY TO USE HEAD SETTLE 0.
|
||||||
|
; USE SAME TRICK AS ABOVE.
|
||||||
|
; REV 2.25 6/20/83 MJB001 ADDED SUPPORT FOR 96TPI AND SALMON
|
||||||
|
; REV 2.30 6/27/83 MJB002 ADDED REAL-TIME CLOCK
|
||||||
|
; REV 2.40 7/8/83 MJB003 ADDED VOLUME-ID CHECKING AND INT 2F MACRO
|
||||||
|
; DEFINITIONS PUSH* AND POP*
|
||||||
|
; REV 2.41 7/12/83 ARR MORE 2.X ENHANCEMENTS. OPEN/CLOSE MEDIA CHANGE
|
||||||
|
; REV 2.42 11/3/83 ARR MORE 2.X ENHANCEMENTS. DISK OPEN/CLOSE, FORMAT
|
||||||
|
; CODE AND OTHER MISC HOOKED OUT TO SHRINK BIOS. CODE FOR
|
||||||
|
; DISK OPEN/CLOSE, FORMAT INCLUDED ONLY WITH 96TPI DISKS.
|
||||||
|
; REV 2.43 12/6/83 MZ EXAMINE BOOT SECTORS ON HARD DISKS FOR 16-BIT FAT
|
||||||
|
; CHECK. EXAMINE LARGE FAT BIT IN BPB FOR WALK OF MEDIA FOR
|
||||||
|
; DOS
|
||||||
|
; REV 2.44 12/9/83 ARR CHANGE TO ERROR REPORTING ON INT 17H
|
||||||
|
; REV 2.45 12/22/83 MZ MAKE HEAD SETTLE CHANGE ONLY WHEN DISK PARM IS 0.
|
||||||
|
|
||||||
|
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
;
|
||||||
|
; IBM ADDRESSES FOR I/O
|
||||||
|
;
|
||||||
|
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
INCLUDE MSDSKPR.INC
|
||||||
|
|
||||||
|
LF = 10 ;LINE FEED
|
||||||
|
CR = 13 ;CARRIAGE RETURN
|
||||||
|
BACKSP = 8 ;BACKSPACE
|
||||||
|
BRKADR = 1BH * 4 ;006C 1BH BREAK VECTOR ADDRESS
|
||||||
|
TIMADR = 1CH * 4 ;0070 1CH TIMER INTERRUPT
|
||||||
|
DSKADR = 1EH * 4 ;ADDRESS OF PTR TO DISK PARAMETERS
|
||||||
|
SEC9 = 522H ;ADDRESS OF DISK PARAMETERS
|
||||||
|
HEADSETTLE = SEC9+9 ; ARR 2.20 ADDRESS OF HEAD SETTLE TIME
|
||||||
|
NORMSETTLE = 15 ; ARR 2.20 NORMAL HEAD SETTLE
|
||||||
|
SPEEDSETTLE = 0 ; ARR 2.20 SPEED UP SETTLE TIME
|
||||||
|
INITSPOT = 534H ; ARR IBM WANTS 4 ZEROS HERE
|
||||||
|
AKPORT = 20H
|
||||||
|
EOI = 20H
|
||||||
|
|
||||||
|
ASSUME CS:CODE,DS:NOTHING,ES:NOTHING
|
||||||
|
|
||||||
|
EXTRN MEDIA$CHK:NEAR
|
||||||
|
EXTRN GET$BPB:NEAR
|
||||||
|
EXTRN DSK$INIT:NEAR
|
||||||
|
EXTRN DSK$READ:NEAR
|
||||||
|
EXTRN DSK$WRIT:NEAR
|
||||||
|
EXTRN DSK$WRITV:NEAR
|
||||||
|
EXTRN DSK$OPEN:NEAR
|
||||||
|
EXTRN DSK$CLOSE:NEAR
|
||||||
|
EXTRN DSK$REM:NEAR
|
||||||
|
EXTRN GENERIC$IOCTL:NEAR
|
||||||
|
EXTRN IOCTL$GETOWN:NEAR
|
||||||
|
EXTRN IOCTL$SETOWN:NEAR
|
||||||
|
EXTRN CON$READ:NEAR
|
||||||
|
EXTRN CON$RDND:NEAR
|
||||||
|
EXTRN CON$FLSH:NEAR
|
||||||
|
EXTRN CON$WRIT:NEAR
|
||||||
|
; EXTRN CON$GENIOCTL:NEAR ;J.K. 4/29/86
|
||||||
|
EXTRN AUX$READ:NEAR
|
||||||
|
EXTRN AUX$WRIT:NEAR
|
||||||
|
EXTRN AUX$FLSH:NEAR
|
||||||
|
EXTRN AUX$RDND:NEAR
|
||||||
|
EXTRN AUX$WRST:NEAR
|
||||||
|
EXTRN TIM$READ:NEAR
|
||||||
|
EXTRN TIM$WRIT:NEAR
|
||||||
|
EXTRN PRN$WRIT:NEAR
|
||||||
|
EXTRN PRN$STAT:NEAR
|
||||||
|
EXTRN PRN$TILBUSY:NEAR
|
||||||
|
EXTRN PRN$GENIOCTL:NEAR
|
||||||
|
EXTRN WRMSG:NEAR
|
||||||
|
|
||||||
|
;DATA AREAS
|
||||||
|
extrn Start_Sec_H:word ;AN000; Starting sector high word for
|
||||||
|
;disk I/O request. IBMDISK.ASM
|
||||||
|
|
||||||
|
INCLUDE MSBDATA.INC
|
||||||
|
|
||||||
|
IF iTEST
|
||||||
|
PUBLIC MSGNUM
|
||||||
|
MSGNUM:
|
||||||
|
PUSHF
|
||||||
|
TEST FTESTBITS,AX
|
||||||
|
JZ MRET
|
||||||
|
PUSH SI
|
||||||
|
PUSH BX
|
||||||
|
PUSH CX
|
||||||
|
PUSH ES
|
||||||
|
PUSH DI
|
||||||
|
MOV DI,OFFSET NUMBUF
|
||||||
|
PUSH CS
|
||||||
|
POP ES
|
||||||
|
MOV CX,4
|
||||||
|
NUMLOOP:
|
||||||
|
PUSH CX
|
||||||
|
MOV CL,4
|
||||||
|
ROL BX,CL
|
||||||
|
POP CX
|
||||||
|
PUSH BX
|
||||||
|
AND BX,0FH
|
||||||
|
MOV AL,DIGITS[BX]
|
||||||
|
STOSB
|
||||||
|
POP BX
|
||||||
|
LOOP NUMLOOP
|
||||||
|
POP DI
|
||||||
|
POP ES
|
||||||
|
POP CX
|
||||||
|
POP BX
|
||||||
|
MOV SI,OFFSET NUMBUF
|
||||||
|
CALL MSGOUT
|
||||||
|
POP SI
|
||||||
|
POPF
|
||||||
|
RET
|
||||||
|
|
||||||
|
PUBLIC MSGOUT
|
||||||
|
MSGOUT:
|
||||||
|
PUSHF
|
||||||
|
TEST FTESTBITS,AX
|
||||||
|
JZ MRET
|
||||||
|
PUSH DS
|
||||||
|
PUSH AX
|
||||||
|
PUSH BX
|
||||||
|
PUSH CS
|
||||||
|
POP DS
|
||||||
|
CALL WRMSG
|
||||||
|
POP BX
|
||||||
|
POP AX
|
||||||
|
POP DS
|
||||||
|
MRET:
|
||||||
|
POPF
|
||||||
|
RET
|
||||||
|
|
||||||
|
PUBLIC DUMPBYTES ;J.K. 4/9/86
|
||||||
|
;Dumpbytes will dump the bytes in memory in hex. Space will be put in between
|
||||||
|
;the bytes and CR, LF will be put at the end. - J.K.
|
||||||
|
;Input: DS:SI -> buffer to dump in Hex.
|
||||||
|
; CX -> # of bytes (Length of the buffer)
|
||||||
|
;
|
||||||
|
DUMPBYTES proc near
|
||||||
|
pushf
|
||||||
|
push ax
|
||||||
|
dumploops:
|
||||||
|
lodsb
|
||||||
|
mov ah, al
|
||||||
|
shr ah, 1
|
||||||
|
shr ah, 1
|
||||||
|
shr ah, 1
|
||||||
|
shr ah, 1
|
||||||
|
call hex_to_ascii
|
||||||
|
push ax
|
||||||
|
mov al, ah
|
||||||
|
call outchar
|
||||||
|
pop ax
|
||||||
|
call outchar
|
||||||
|
mov al, ' '
|
||||||
|
call outchar
|
||||||
|
loop dumploops
|
||||||
|
|
||||||
|
mov al, 0dh
|
||||||
|
call outchar
|
||||||
|
mov al, 0ah
|
||||||
|
call outchar
|
||||||
|
|
||||||
|
pop ax
|
||||||
|
popf
|
||||||
|
ret
|
||||||
|
DUMPBYTES endp
|
||||||
|
|
||||||
|
PUBLIC Hex_to_ascii
|
||||||
|
Hex_to_ascii proc near ;J.K. - 4/9/86
|
||||||
|
and ax, 0f0fh
|
||||||
|
add ah, 30h
|
||||||
|
cmp ah, 3ah
|
||||||
|
jb hta_$1
|
||||||
|
add ah, 7
|
||||||
|
hta_$1:
|
||||||
|
add al, 30h
|
||||||
|
cmp al, 3ah
|
||||||
|
jb hta_$2
|
||||||
|
add al, 7
|
||||||
|
hta_$2:
|
||||||
|
ret
|
||||||
|
Hex_to_ascii endp
|
||||||
|
|
||||||
|
PUBLIC outchar
|
||||||
|
Outchar proc near
|
||||||
|
PUSH AX
|
||||||
|
PUSH SI
|
||||||
|
PUSH DI
|
||||||
|
PUSH BP
|
||||||
|
PUSH BX
|
||||||
|
;SB33002*******************************************************
|
||||||
|
MOV AH, 0Eh ;SET COMMAND TO WRITE A CHAR ;SB;3.30*
|
||||||
|
MOV BX, 7 ;SET FOREGROUND COLOR ;SB;3.30*
|
||||||
|
INT 10h ;CALL ROM-BIOS ;SB;3.30*
|
||||||
|
;SB33002*******************************************************
|
||||||
|
POP BX
|
||||||
|
POP BP
|
||||||
|
POP DI
|
||||||
|
POP SI
|
||||||
|
POP AX
|
||||||
|
RET
|
||||||
|
Outchar endp
|
||||||
|
|
||||||
|
ENDIF
|
||||||
|
INCLUDE MSMACRO.INC
|
||||||
|
|
||||||
|
;---------------------------------------------------
|
||||||
|
;
|
||||||
|
; DEVICE ENTRY POINT
|
||||||
|
;
|
||||||
|
CMDLEN = 0 ;LENGTH OF THIS COMMAND
|
||||||
|
UNIT = 1 ;SUB UNIT SPECIFIER
|
||||||
|
CMD = 2 ;COMMAND CODE
|
||||||
|
STATUS = 3 ;STATUS
|
||||||
|
MEDIA = 13 ;MEDIA DESCRIPTOR
|
||||||
|
TRANS = 14 ;TRANSFER ADDRESS
|
||||||
|
COUNT = 18 ;COUNT OF BLOCKS OR CHARACTERS
|
||||||
|
START = 20 ;FIRST BLOCK TO TRANSFER
|
||||||
|
EXTRA = 22 ;USUALLY A POINTER TO VOL ID FOR ERROR 15
|
||||||
|
START_L = 26 ;AN000; Extended start sector (Low)
|
||||||
|
START_H = 28 ;AN000; Extended start sector (High)
|
||||||
|
|
||||||
|
PUBLIC STRATEGY
|
||||||
|
STRATEGY PROC FAR
|
||||||
|
MOV WORD PTR CS:[PTRSAV],BX
|
||||||
|
MOV WORD PTR CS:[PTRSAV+2],ES
|
||||||
|
RET
|
||||||
|
STRATEGY ENDP
|
||||||
|
|
||||||
|
PUBLIC CON$IN
|
||||||
|
CON$IN PROC FAR
|
||||||
|
PUSH SI
|
||||||
|
MOV SI,OFFSET CONTBL
|
||||||
|
JMP SHORT ENTRY
|
||||||
|
CON$IN ENDP
|
||||||
|
|
||||||
|
PUBLIC AUX0$IN
|
||||||
|
AUX0$IN PROC FAR
|
||||||
|
PUSH SI
|
||||||
|
PUSH AX
|
||||||
|
XOR AL,AL
|
||||||
|
JMP SHORT AUXENT
|
||||||
|
AUX0$IN ENDP
|
||||||
|
|
||||||
|
PUBLIC AUX1$IN
|
||||||
|
AUX1$IN PROC FAR
|
||||||
|
PUSH SI
|
||||||
|
PUSH AX
|
||||||
|
MOV AL,1
|
||||||
|
JMP short AUXENT ;J.K. 4/15/86
|
||||||
|
AUX1$IN ENDP
|
||||||
|
|
||||||
|
;SB33102****************************************************************
|
||||||
|
;SB Add code to handle two more COM Ports
|
||||||
|
;boban
|
||||||
|
|
||||||
|
PUBLIC AUX2$IN
|
||||||
|
AUX2$IN proc far
|
||||||
|
push si
|
||||||
|
push ax
|
||||||
|
mov al,2
|
||||||
|
jmp short AUXENT
|
||||||
|
AUX2$IN endp
|
||||||
|
|
||||||
|
PUBLIC AUX3$IN
|
||||||
|
AUX3$IN proc far
|
||||||
|
push si
|
||||||
|
push ax
|
||||||
|
mov al,3
|
||||||
|
jmp short AUXENT
|
||||||
|
|
||||||
|
;SB33102****************************************************************
|
||||||
|
|
||||||
|
AUXENT:
|
||||||
|
MOV SI,OFFSET AUXTBL
|
||||||
|
JMP SHORT ENTRY1
|
||||||
|
AUX3$IN ENDP
|
||||||
|
|
||||||
|
PRN0$IN PROC FAR
|
||||||
|
PUBLIC PRN0$IN
|
||||||
|
|
||||||
|
PUSH SI
|
||||||
|
PUSH AX
|
||||||
|
XOR AX,AX
|
||||||
|
JMP SHORT PRNENT
|
||||||
|
PRN0$IN ENDP
|
||||||
|
|
||||||
|
PUBLIC PRN1$IN
|
||||||
|
PRN1$IN PROC FAR
|
||||||
|
PUSH SI
|
||||||
|
PUSH AX
|
||||||
|
XOR AL,AL
|
||||||
|
MOV AH,1
|
||||||
|
JMP SHORT PRNENT
|
||||||
|
PRN1$IN ENDP
|
||||||
|
|
||||||
|
PUBLIC PRN2$IN
|
||||||
|
PRN2$IN PROC FAR
|
||||||
|
PUSH SI
|
||||||
|
PUSH AX
|
||||||
|
MOV AL,1
|
||||||
|
MOV AH,2
|
||||||
|
JMP SHORT PRNENT
|
||||||
|
PRN2$IN ENDP
|
||||||
|
|
||||||
|
PUBLIC PRN3$IN
|
||||||
|
PRN3$IN PROC FAR
|
||||||
|
PUSH SI
|
||||||
|
PUSH AX
|
||||||
|
MOV AL,2
|
||||||
|
MOV AH,3
|
||||||
|
PRNENT:
|
||||||
|
MOV SI,OFFSET PRNTBL
|
||||||
|
MOV CS:[PRINTDEV],AH ;SAVE INDEX INTO ARRAY OF RETRY COUNTS
|
||||||
|
JMP SHORT ENTRY1
|
||||||
|
PRN3$IN ENDP
|
||||||
|
|
||||||
|
PUBLIC TIM$IN
|
||||||
|
TIM$IN PROC FAR
|
||||||
|
PUSH SI
|
||||||
|
MOV SI,OFFSET TIMTBL
|
||||||
|
JMP SHORT ENTRY
|
||||||
|
TIM$IN ENDP
|
||||||
|
|
||||||
|
PUBLIC DSK$IN
|
||||||
|
DSK$IN PROC FAR
|
||||||
|
PUSH SI
|
||||||
|
MOV SI,OFFSET DSKTBL
|
||||||
|
|
||||||
|
ENTRY:
|
||||||
|
PUSH AX
|
||||||
|
ENTRY1:
|
||||||
|
PUSH CX
|
||||||
|
PUSH DX
|
||||||
|
PUSH DI
|
||||||
|
PUSH BP
|
||||||
|
PUSH DS
|
||||||
|
PUSH ES
|
||||||
|
PUSH BX
|
||||||
|
|
||||||
|
MOV CS:[AUXNUM],AL ;SAVE CHOICE OF AUX/PRN DEVICE
|
||||||
|
|
||||||
|
LDS BX,CS:[PTRSAV] ;GET POINTER TO I/O PACKET
|
||||||
|
ASSUME DS:NOTHING
|
||||||
|
|
||||||
|
MOV AL,BYTE PTR DS:[BX].UNIT ;AL = UNIT CODE
|
||||||
|
MOV AH,BYTE PTR DS:[BX].MEDIA ;AH = MEDIA DESCRIP
|
||||||
|
MOV CX,WORD PTR DS:[BX].COUNT ;CX = COUNT
|
||||||
|
MOV DX,WORD PTR DS:[BX].START ;DX = START SECTOR
|
||||||
|
|
||||||
|
;SB34MSB100*********************************************************************
|
||||||
|
;SB
|
||||||
|
;SB The disk device driver can now handle 32 bit start sector number.
|
||||||
|
;SB So we should check to see if a 32 bit sector number has been specified
|
||||||
|
;SB and if so get it. Whether a 32 bit sector has been specified or not
|
||||||
|
;SB the disk driver expects a 32 bit sector number with the high word
|
||||||
|
;SB in cs:Start_Sec_H and the low word in dx.
|
||||||
|
;SB
|
||||||
|
;SB Algorithm:
|
||||||
|
;SB 1. Check to see if the request is for the disk driver by
|
||||||
|
;SB checking to see if SI points to DSKTBL.
|
||||||
|
;SB
|
||||||
|
;SB 2. If request not for the disk nothing special needs to be done.
|
||||||
|
;SB
|
||||||
|
;SB 3. If request for the disk then check to see if a 32 bit
|
||||||
|
;SB sector number has been specified by seeing whether the
|
||||||
|
;SB the conventional sector number specified is -1. If so
|
||||||
|
;SB we need to pick the 32 bit sector number from the new
|
||||||
|
;SB fields in the request packet. See the request header
|
||||||
|
;SB struc for the fields you need. If the conventional
|
||||||
|
;SB sector field is not -1 then a 16 bit sector number
|
||||||
|
;SB has been specified and we just need to initalise the
|
||||||
|
;SB high word in cs:Start_Sec_H to 0
|
||||||
|
;SB
|
||||||
|
;SB NOTE: START_L and START_H are the offsets withing the IO_REQUEST packet
|
||||||
|
;SB which contain the low and hi words of the 32 bit start sector if
|
||||||
|
;SB it has been used.
|
||||||
|
;SB
|
||||||
|
;SB NOTE:Remember not to destroy the registers which have been set up before
|
||||||
|
|
||||||
|
CMP SI,OFFSET DSKTBL
|
||||||
|
JNZ DSK_REQ_CONT ; Not Disk Req
|
||||||
|
CMP DX,-1
|
||||||
|
JNZ DSK_REQ_16
|
||||||
|
MOV DX,DS:[BX].START_H ; 32 bits DSK REQ
|
||||||
|
MOV CS:START_SEC_H,DX ; CS:Start_sec_H = Packet.Start_H
|
||||||
|
MOV DX,DS:[BX].START_L ; DX = Packet.Start_L
|
||||||
|
JMP SHORT DSK_REQ_CONT
|
||||||
|
DSK_REQ_16:
|
||||||
|
MOV CS:START_SEC_H,0
|
||||||
|
DSK_REQ_CONT:
|
||||||
|
|
||||||
|
;SB34MSB100*********************************************************************
|
||||||
|
|
||||||
|
XCHG DI,AX
|
||||||
|
MOV AL,BYTE PTR DS:[BX].CMD
|
||||||
|
CMP AL,CS:[SI] ;ARR 2.41
|
||||||
|
JA CMDERR
|
||||||
|
|
||||||
|
CBW ; NOTE THAT AL <= 15 MEANS OK
|
||||||
|
SHL AX,1
|
||||||
|
|
||||||
|
ADD SI,AX
|
||||||
|
XCHG AX,DI
|
||||||
|
|
||||||
|
LES DI,DWORD PTR DS:[BX].TRANS
|
||||||
|
|
||||||
|
PUSH CS
|
||||||
|
POP DS
|
||||||
|
|
||||||
|
ASSUME DS:CODE
|
||||||
|
|
||||||
|
CLD
|
||||||
|
JMP WORD PTR [SI+1] ;GO DO COMMAND
|
||||||
|
DSK$IN ENDP
|
||||||
|
PAGE
|
||||||
|
;=====================================================
|
||||||
|
;=
|
||||||
|
;= SUBROUTINES SHARED BY MULTIPLE DEVICES
|
||||||
|
;=
|
||||||
|
;=====================================================
|
||||||
|
;----------------------------------------------------------
|
||||||
|
;
|
||||||
|
; EXIT - ALL ROUTINES RETURN THROUGH THIS PATH
|
||||||
|
;
|
||||||
|
PUBLIC BUS$EXIT
|
||||||
|
BUS$EXIT PROC FAR
|
||||||
|
ASSUME DS:NOTHING
|
||||||
|
MOV AH,00000011B
|
||||||
|
JMP SHORT ERR1
|
||||||
|
|
||||||
|
PUBLIC CMDERR
|
||||||
|
CMDERR:
|
||||||
|
MOV AL,3 ;UNKNOWN COMMAND ERROR
|
||||||
|
|
||||||
|
PUBLIC ERR$CNT
|
||||||
|
ERR$CNT:
|
||||||
|
LDS BX,CS:[PTRSAV]
|
||||||
|
ASSUME DS:NOTHING
|
||||||
|
SUB WORD PTR [BX].COUNT,CX ;# OF SUCCESSFUL I/O'S
|
||||||
|
|
||||||
|
PUBLIC ERR$EXIT
|
||||||
|
ERR$EXIT:
|
||||||
|
MOV AH,10000001B ;MARK ERROR RETURN
|
||||||
|
JMP SHORT ERR1
|
||||||
|
BUS$EXIT ENDP
|
||||||
|
|
||||||
|
EXITP PROC FAR
|
||||||
|
ASSUME DS:CODE ; WE ARE NOT SURE THIS IS CORRECT 3/18/86
|
||||||
|
EXIT$ZER:
|
||||||
|
LDS BX,[PTRSAV]
|
||||||
|
ASSUME DS:NOTHING
|
||||||
|
XOR AX,AX
|
||||||
|
MOV WORD PTR [BX].COUNT,AX ;INDICATE NO CHARS READ
|
||||||
|
|
||||||
|
PUBLIC EXIT
|
||||||
|
EXIT:
|
||||||
|
ASSUME DS:NOTHING
|
||||||
|
MOV AH,00000001B
|
||||||
|
ERR1:
|
||||||
|
ASSUME DS:NOTHING
|
||||||
|
LDS BX,CS:[PTRSAV]
|
||||||
|
MOV WORD PTR [BX].STATUS,AX ;MARK OPERATION COMPLETE
|
||||||
|
|
||||||
|
POP BX
|
||||||
|
POP ES
|
||||||
|
POP DS
|
||||||
|
POP BP
|
||||||
|
POP DI
|
||||||
|
POP DX
|
||||||
|
POP CX
|
||||||
|
POP AX
|
||||||
|
POP SI
|
||||||
|
RET ;RESTORE REGS AND RETURN
|
||||||
|
EXITP ENDP
|
||||||
|
|
||||||
|
;-------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; CHROUT - WRITE OUT CHAR IN AL USING CURRENT ATTRIBUTE
|
||||||
|
;
|
||||||
|
; CALLED VIA INT 29H
|
||||||
|
;
|
||||||
|
PUBLIC CHROUT
|
||||||
|
CHROUT = 29H
|
||||||
|
|
||||||
|
PUBLIC OUTCHR
|
||||||
|
OUTCHR PROC FAR
|
||||||
|
PUSH AX
|
||||||
|
PUSH SI
|
||||||
|
PUSH DI
|
||||||
|
PUSH BP
|
||||||
|
;SB33002a*******************************************************
|
||||||
|
push bx ; ;SB ;3.30
|
||||||
|
mov AH, 0Eh ; set command to write a character;SB;3.30
|
||||||
|
mov BX, 7 ; set foreground color ;SB ;3.30
|
||||||
|
int 10h ; call rom-bios ;SB ;3.30
|
||||||
|
pop bx ; ;SB ;3.30
|
||||||
|
;SB33002a*******************************************************
|
||||||
|
POP BP
|
||||||
|
POP DI
|
||||||
|
POP SI
|
||||||
|
POP AX
|
||||||
|
IRET
|
||||||
|
OUTCHR ENDP
|
||||||
|
;----------------------------------------------
|
||||||
|
;
|
||||||
|
; SET DX TO AUXNUM
|
||||||
|
;
|
||||||
|
PUBLIC GETDX
|
||||||
|
GETDX PROC NEAR
|
||||||
|
MOV DX,WORD PTR CS:[AUXNUM]
|
||||||
|
RET
|
||||||
|
GETDX ENDP
|
||||||
|
PAGE
|
||||||
|
;************************************************** ARR 2.15
|
||||||
|
|
||||||
|
;-----------------------------------------------
|
||||||
|
;
|
||||||
|
; TIMER INTERRUPT HANDLER
|
||||||
|
;
|
||||||
|
;TIMER_LOW DW 0
|
||||||
|
;TIMER_HIGH DW 0
|
||||||
|
;
|
||||||
|
;TIMER:
|
||||||
|
; STI
|
||||||
|
; PUSH AX
|
||||||
|
; PUSH CX
|
||||||
|
; PUSH DX
|
||||||
|
; PUSH DS
|
||||||
|
; PUSH CS
|
||||||
|
; POP DS
|
||||||
|
; XOR AX,AX
|
||||||
|
; INT 1AH ; GET ROM TIME AND ZAP ROLL OVER
|
||||||
|
; MOV [TIMER_HIGH],CX
|
||||||
|
; MOV [TIMER_LOW],DX
|
||||||
|
; OR AL,AL
|
||||||
|
; JZ T5
|
||||||
|
; INC WORD PTR [DAYCNT] ; ONE DAY GONE BY
|
||||||
|
;T5:
|
||||||
|
; POP DS
|
||||||
|
; POP DX
|
||||||
|
; POP CX
|
||||||
|
; POP AX
|
||||||
|
; IRET
|
||||||
|
;************************************************** ARR 2.15
|
||||||
|
CODE ENDS
|
||||||
|
END
|
572
v4.0/src/BIOS/MSBIO2.ASM
Normal file
572
v4.0/src/BIOS/MSBIO2.ASM
Normal file
@ -0,0 +1,572 @@
|
|||||||
|
PAGE ,132 ;
|
||||||
|
TITLE MSBIO2 - BIOS
|
||||||
|
|
||||||
|
%OUT ...MSBIO2.ASM
|
||||||
|
|
||||||
|
;==============================================================================
|
||||||
|
;REVISION HISTORY:
|
||||||
|
;AN000 - New for DOS Version 4.00 - J.K.
|
||||||
|
;AC000 - Changed for DOS Version 4.00 - J.K.
|
||||||
|
;AN00x - PTM number for DOS Version 4.00 - J.K.
|
||||||
|
;==============================================================================
|
||||||
|
;AN001; - P1820 New Message SKL file 10/20/87 J.K.
|
||||||
|
;AN002; - P5045 New INT 2fh for Get BDS table vector for EMS 06/06/88 J.K.
|
||||||
|
;==============================================================================
|
||||||
|
|
||||||
|
ROMSEGMENT EQU 0F000H
|
||||||
|
MODELBYTE EQU DS:BYTE PTR [0FFFEH]
|
||||||
|
MODELPCJR EQU 0FDH
|
||||||
|
|
||||||
|
itest=0
|
||||||
|
|
||||||
|
INCLUDE MSGROUP.INC ;DEFINE CODE SEGMENT
|
||||||
|
INCLUDE MSEQU.INC
|
||||||
|
INCLUDE DEVSYM.INC
|
||||||
|
INCLUDE PUSHPOP.INC
|
||||||
|
INCLUDE MSMACRO.INC
|
||||||
|
|
||||||
|
ASSUME DS:NOTHING,ES:NOTHING
|
||||||
|
|
||||||
|
EXTRN DSK$IN:NEAR
|
||||||
|
EXTRN SETPTRSAV:NEAR
|
||||||
|
EXTRN OUTCHR:NEAR
|
||||||
|
EXTRN SETDRIVE:NEAR
|
||||||
|
EXTRN FLUSH:NEAR
|
||||||
|
EXTRN HARDERR:NEAR
|
||||||
|
EXTRN HARDERR2:NEAR
|
||||||
|
EXTRN MAPERROR:NEAR
|
||||||
|
EXTRN GETBP:NEAR
|
||||||
|
EXTRN CHECKSINGLE:NEAR
|
||||||
|
EXTRN CHECK_TIME_OF_ACCESS:NEAR
|
||||||
|
EXTRN EXIT:NEAR
|
||||||
|
EXTRN HAS1:NEAR
|
||||||
|
EXTRN READ_SECTOR:NEAR
|
||||||
|
EXTRN INT_2F_13:FAR
|
||||||
|
|
||||||
|
EXTRN OLD13:DWORD
|
||||||
|
|
||||||
|
;DATA
|
||||||
|
EXTRN PTRSAV:DWORD ;IBMBIO1
|
||||||
|
EXTRN START_BDS:WORD
|
||||||
|
EXTRN FDRIVE1:WORD
|
||||||
|
EXTRN FDRIVE2:WORD
|
||||||
|
EXTRN FDRIVE3:WORD
|
||||||
|
EXTRN FDRIVE4:WORD
|
||||||
|
EXTRN FLAGBITS:WORD
|
||||||
|
EXTRN TIM_DRV:BYTE
|
||||||
|
EXTRN MEDBYT:BYTE
|
||||||
|
EXTRN DRVMAX:BYTE
|
||||||
|
extrn Ext_Boot_Sig:byte ;AN000; ibmbdata
|
||||||
|
extrn SecPerClusInSector:byte ;AN000; ibmbdata
|
||||||
|
extrn Boot_Serial_L:word ;AN000; ibmbdata
|
||||||
|
extrn Boot_Serial_H:word ;AN000; ibmbdata
|
||||||
|
|
||||||
|
PATHSTART 005,DISK
|
||||||
|
EVENB
|
||||||
|
public Model_Byte
|
||||||
|
MODEL_BYTE DB 0FFH ; MODEL BYTE. SET UP AT INIT TIME.
|
||||||
|
; FF - PC1
|
||||||
|
; FE - XT (64/256K PLANAR)
|
||||||
|
; FD - PC-JR
|
||||||
|
; FC - PC/AT
|
||||||
|
public Secondary_Model_Byte
|
||||||
|
Secondary_Model_Byte db 0
|
||||||
|
|
||||||
|
PUBLIC ORIG19
|
||||||
|
ORIG19 DD ?
|
||||||
|
|
||||||
|
PUBLIC INT19SEM
|
||||||
|
INT19SEM DB 0 ; INDICATE THAT ALL INT 19
|
||||||
|
; INITIALIZATION IS COMPLETE
|
||||||
|
|
||||||
|
IRP AA,<02,08,09,0A,0B,0C,0D,0E,70,72,73,74,76,77>
|
||||||
|
public Int19OLD&AA
|
||||||
|
Int19OLD&AA dd -1 ;Orignal hardware int. vectors for INT 19h.
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC DSKDRVS
|
||||||
|
DSKDRVS DW FDRIVE1
|
||||||
|
DW FDRIVE2
|
||||||
|
DW FDRIVE3
|
||||||
|
DW FDRIVE4
|
||||||
|
PUBLIC HDSKTAB
|
||||||
|
HDSKTAB DW HDRIVE
|
||||||
|
DW DRIVEX
|
||||||
|
;* Next area is reseved for mini disk BPB pointers *** J.K. 4/7/86
|
||||||
|
;* Don't change this position. Should be addressible from DskDrvs *** J.K. 4/7/86
|
||||||
|
MINI_DISK_BPB_PTRS DB 40 dup (?) ;J.K. 4/7/86 - memory reserved for Mini disk.
|
||||||
|
|
||||||
|
EVENB
|
||||||
|
PUBLIC INT_2F_NEXT
|
||||||
|
INT_2F_NEXT DD ?
|
||||||
|
|
||||||
|
RET_ADDR DD ?
|
||||||
|
|
||||||
|
PATHEND 005,DISK
|
||||||
|
; = = = = = = = = = = = = = = = = = = = =
|
||||||
|
|
||||||
|
; INT19
|
||||||
|
;
|
||||||
|
; WE "HOOK" THE INT 19 VECTOR, BECAUSE CONTRARY TO IBM DOCUMENTATION,
|
||||||
|
; IT DOES NOT "BOOTSTRAP" THE MACHINE. IT LEAVES MEMORY ALMOST UNTOUCHED.
|
||||||
|
; SINCE THE BIOS_INIT CODE ASSUMES THAT CERTAIN INTERRUPT VECTORS POINT TO
|
||||||
|
; THE ROM_BIOS WE MUST "UNHOOK" THEM BEFORE ISSUING THE ACTUAL INT_19.
|
||||||
|
; CURRENTLY THE ONLY VECTORS THAT NEED TO BE UNHOOKED ARE INT_19, INT_13,
|
||||||
|
; AND THE HARDWARE INTERRUPTS.
|
||||||
|
;
|
||||||
|
PUBLIC INT19
|
||||||
|
INT19 PROC FAR
|
||||||
|
XOR AX,AX
|
||||||
|
MOV DS,AX
|
||||||
|
assume ds:nothing
|
||||||
|
assume es:nothing
|
||||||
|
|
||||||
|
LES DI,OLD13
|
||||||
|
MOV DS:[13H*4],DI
|
||||||
|
MOV DS:[13H*4+2],ES
|
||||||
|
|
||||||
|
CMP BYTE PTR INT19SEM, 0
|
||||||
|
JNZ INT19VECS
|
||||||
|
JMP DOINT19
|
||||||
|
|
||||||
|
; ON THE PCJR, DON'T REPLACE ANY VECTORS
|
||||||
|
; MODEL BYTE DEFINITIONS FROM IBMSTACK.ASM
|
||||||
|
MOV AX,ROMSEGMENT
|
||||||
|
MOV DS,AX
|
||||||
|
MOV AL,MODELPCJR
|
||||||
|
|
||||||
|
CMP AL,MODELBYTE
|
||||||
|
JNE INT19VECS
|
||||||
|
JMP DOINT19
|
||||||
|
|
||||||
|
;Stacks code has changed these hardware interrupt vectors
|
||||||
|
;STKINIT in SYSINIT1 will initialzie Int19hOLDxx values.
|
||||||
|
INT19VECS:
|
||||||
|
XOR AX,AX
|
||||||
|
MOV DS,AX
|
||||||
|
|
||||||
|
IRP AA,<02,08,09,0A,0B,0C,0D,0E,70,72,73,74,76,77>
|
||||||
|
|
||||||
|
LES DI,Int19OLD&AA
|
||||||
|
;SB33103******************************************************************
|
||||||
|
|
||||||
|
mov ax,es ;
|
||||||
|
cmp ax,-1 ;OPT 0ffffh is unlikely segment
|
||||||
|
je skip_int&AA ;OPT no need to check selector too
|
||||||
|
cmp di,-1 ;OPT 0ffffh is unlikely offset
|
||||||
|
je skip_int&AA
|
||||||
|
|
||||||
|
;SB33103******************************************************************
|
||||||
|
MOV DS:[AA&H*4],DI
|
||||||
|
MOV DS:[AA&H*4+2],ES
|
||||||
|
skip_int&AA:
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
DOINT19:
|
||||||
|
LES DI,ORIG19
|
||||||
|
MOV DS:[19H*4],DI
|
||||||
|
MOV DS:[19H*4+2],ES
|
||||||
|
|
||||||
|
INT 19H
|
||||||
|
INT19 ENDP
|
||||||
|
|
||||||
|
ASSUME DS:CODE
|
||||||
|
PUBLIC DSK$INIT
|
||||||
|
DSK$INIT PROC NEAR
|
||||||
|
PUSH CS
|
||||||
|
POP DS
|
||||||
|
MOV AH,BYTE PTR DRVMAX
|
||||||
|
MOV DI,OFFSET DSKDRVS
|
||||||
|
JMP SETPTRSAV
|
||||||
|
DSK$INIT ENDP
|
||||||
|
|
||||||
|
;
|
||||||
|
; INT 2F HANDLER FOR EXTERNAL BLOCK DRIVERS TO COMMUNICATE WITH THE INTERNAL
|
||||||
|
; BLOCK DRIVER IN IBMDISK. THE MULTIPLEX NUMBER CHOSEN IS 8. THE HANDLER
|
||||||
|
; SETS UP THE POINTER TO THE REQUEST PACKET IN [PTRSAV] AND THEN JUMPS TO
|
||||||
|
; DSK$IN, THE ENTRY POINT FOR ALL DISK REQUESTS.
|
||||||
|
; ON EXIT FROM THIS DRIVER (AT EXIT), WE WILL RETURN TO THE EXTERNAL DRIVER
|
||||||
|
; THAT ISSUED THIS INT 2F, AND CAN THEN REMOVE THE FLAGS FROM THE STACK.
|
||||||
|
; THIS SCHEME ALLOWS US TO HAVE A SMALL EXTERNAL DEVICE DRIVER, AND MAKES
|
||||||
|
; THE MAINTAINANCE OF THE VARIOUS DRIVERS (DRIVER AND IBMBIO) MUCH EASIER,
|
||||||
|
; SINCE WE ONLY NEED TO MAKE CHANGES IN ONE PLACE (MOST OF THE TIME).
|
||||||
|
;
|
||||||
|
; 06/03/88 J.K. When AL=3, return DS:DI -> Start of BDS table.
|
||||||
|
; (EMS device driver hooks INT 13h to handle 16KB DMA overrun
|
||||||
|
; problem. BDS table is going to be used to get head/sector
|
||||||
|
; informations without calling Generic IOCTL Get Device Parm call.)
|
||||||
|
;
|
||||||
|
; AL CONTAINS THE INT2F FUNCTION:
|
||||||
|
; 0 - CHECK FOR INSTALLED HANDLER - RESERVED
|
||||||
|
; 1 - INSTALL THE BDS INTO THE LINKED LIST
|
||||||
|
; 2 - DOS REQUEST
|
||||||
|
; 3 - Get BDS vector ;06/03/88 J.K.
|
||||||
|
; Return BDS table starting pointer in DS:DI
|
||||||
|
|
||||||
|
MYNUM EQU 8
|
||||||
|
|
||||||
|
PUBLIC INT2F_DISK
|
||||||
|
INT2F_DISK PROC FAR
|
||||||
|
CMP AH,MYNUM
|
||||||
|
JE MINE
|
||||||
|
JMP CS:[INT_2F_NEXT] ; CHAIN TO NEXT INT 2F HANDLER
|
||||||
|
MINE:
|
||||||
|
CMP AL,0F8H ; IRET ON RESERVED FUNCTIONS
|
||||||
|
JB DO_FUNC
|
||||||
|
IRET
|
||||||
|
DO_FUNC:
|
||||||
|
OR AL,AL ; A GET INSTALLED STATE REQUEST?
|
||||||
|
JNE DISP_FUNC
|
||||||
|
MOV AL,0FFH
|
||||||
|
IRET
|
||||||
|
DISP_FUNC:
|
||||||
|
MESSAGE FTESTINIT,<"INT2F_DISK",CR,LF>
|
||||||
|
CMP AL,1 ; REQUEST FOR INSTALLING BDS?
|
||||||
|
JNE DO_DOS_REQ
|
||||||
|
CALL INSTALL_BDS
|
||||||
|
IRET
|
||||||
|
|
||||||
|
DO_DOS_REQ:
|
||||||
|
; SET UP POINTER TO REQUEST PACKET
|
||||||
|
cmp al, 3 ;AN002; Get BDS vector?
|
||||||
|
je DO_Get_BDS_Vector ;AN002;
|
||||||
|
MOV WORD PTR CS:[PTRSAV],BX ;othrwise DOS function.
|
||||||
|
MOV WORD PTR CS:[PTRSAV+2],ES
|
||||||
|
JMP DSK$IN
|
||||||
|
|
||||||
|
DO_Get_BDS_Vector: ;AN002; AL=3
|
||||||
|
push cs ;AN002;
|
||||||
|
pop ds ;AN002;
|
||||||
|
mov di, Start_BDS ;AN002;
|
||||||
|
IRET ;AN002;
|
||||||
|
|
||||||
|
INT2F_DISK ENDP
|
||||||
|
|
||||||
|
;
|
||||||
|
; INSTALL_BDS INSTALLS A BDS A LOCATION DS:DI INTO THE CURRENT LINKED LIST OF
|
||||||
|
; BDS MAINTAINED BY THIS DEVICE DRIVER. IT PLACES THE BDS AT THE END OF THE
|
||||||
|
; LIST.
|
||||||
|
PUBLIC INSTALL_BDS
|
||||||
|
INSTALL_BDS PROC NEAR
|
||||||
|
MESSAGE FTESTINIT,<"INSTALL BDS",CR,LF>
|
||||||
|
; DS:DI POINT TO BDS TO BE INSTALLED
|
||||||
|
LES SI,DWORD PTR CS:[START_BDS] ; START AT BEGINNING OF LIST
|
||||||
|
PUSH ES ; SAVE POINTER TO CURRENT BDS
|
||||||
|
PUSH SI
|
||||||
|
; ES:SI NOW POINT TO BDS IN LINKED LIST
|
||||||
|
LOOP_NEXT_BDS:
|
||||||
|
CMP SI,-1 ; GOT TO END OF LINKED LIST?
|
||||||
|
JZ INSTALL_RET
|
||||||
|
; IF WE HAVE SEVERAL LOGICAL DRIVES USING THE SAME PHYSICAL DRIVE, WE MUST
|
||||||
|
; SET THE I_AM_MULT FLAG IN EACH OF THE APPROPRIATE BDSS.
|
||||||
|
MOV AL,BYTE PTR DS:[DI].DRIVENUM
|
||||||
|
CMP BYTE PTR ES:[SI].DRIVENUM,AL
|
||||||
|
JNZ NEXT_BDS
|
||||||
|
MESSAGE FTESTINIT,<"LOGICAL DRIVES",CR,LF>
|
||||||
|
XOR BX,BX
|
||||||
|
MOV BL,FI_AM_MULT
|
||||||
|
OR WORD PTR DS:[DI].FLAGS,BX ; SET FLAGS IN BOTH BDSS CONCERNED
|
||||||
|
OR WORD PTR ES:[SI].FLAGS,BX
|
||||||
|
MOV BL,FI_OWN_PHYSICAL
|
||||||
|
XOR BX,-1
|
||||||
|
AND WORD PTR DS:[DI].FLAGS,BX ; RESET THAT FLAG FOR 'NEW' BDS
|
||||||
|
; WE MUST ALSO SET THE FCHANGELINE BIT CORRECTLY.
|
||||||
|
MOV BX,WORD PTR ES:[SI].FLAGS ; DETERMINE IF CHANGELINE AVAILABLE
|
||||||
|
AND BL,FCHANGELINE
|
||||||
|
XOR BH,BH
|
||||||
|
OR WORD PTR DS:[DI].FLAGS,BX
|
||||||
|
|
||||||
|
NEXT_BDS:
|
||||||
|
; BEFORE MOVING TO NEXT BDS, PRESERVE POINTER TO CURRENT ONE. THIS IS NEEDED AT
|
||||||
|
; THE END WHEN THE NEW BDS IS LINKED INTO THE LIST.
|
||||||
|
POP BX ; DISCARD PREVIOUS POINTER TO BDS
|
||||||
|
POP BX
|
||||||
|
PUSH ES
|
||||||
|
PUSH SI
|
||||||
|
MOV BX,WORD PTR ES:[SI].LINK + 2
|
||||||
|
MOV SI,WORD PTR ES:[SI].LINK
|
||||||
|
MOV ES,BX
|
||||||
|
JMP SHORT LOOP_NEXT_BDS
|
||||||
|
|
||||||
|
INSTALL_RET:
|
||||||
|
POP SI ; RETRIEVE POINTER TO LAST BDS
|
||||||
|
POP ES ; IN LINKED LIST.
|
||||||
|
MOV AX,DS
|
||||||
|
MOV WORD PTR ES:[SI].LINK+2,AX ; INSTALL BDS
|
||||||
|
MOV WORD PTR ES:[SI].LINK,DI
|
||||||
|
MOV WORD PTR DS:[DI].LINK,-1 ; SET NEXT POINTER TO NULL
|
||||||
|
RET
|
||||||
|
INSTALL_BDS ENDP
|
||||||
|
|
||||||
|
;
|
||||||
|
; RE_INIT INSTALLS THE INT 2F VECTOR THAT WILL HANDLE COMMUNICATION BETWEEN
|
||||||
|
; EXTERNAL BLOCK DRIVERS AND THE INTERNAL DRIVER. IT ALSO INSTALLS THE
|
||||||
|
; RESET_INT_13 INTERFACE. IT IS CALLED BY SYSYINIT
|
||||||
|
;
|
||||||
|
PUBLIC RE_INIT
|
||||||
|
RE_INIT PROC FAR
|
||||||
|
MESSAGE FTESTINIT,<"REINIT",CR,LF>
|
||||||
|
PUSH AX
|
||||||
|
PUSH DS
|
||||||
|
PUSH DI
|
||||||
|
XOR DI,DI
|
||||||
|
MOV DS,DI
|
||||||
|
MOV DI,2FH*4 ; POINT IT TO INT 2F VECTOR
|
||||||
|
MOV AX,WORD PTR DS:[DI]
|
||||||
|
MOV WORD PTR CS:[INT_2F_NEXT],AX
|
||||||
|
MOV AX,WORD PTR DS:[DI+2] ; PRESERVE OLD INT 2F VECTOR
|
||||||
|
MOV WORD PTR CS:[INT_2F_NEXT+2],AX
|
||||||
|
|
||||||
|
; INSTALL THE RESET_INT_13
|
||||||
|
; INTERFACE
|
||||||
|
|
||||||
|
;
|
||||||
|
; THE FOLLOWING TWO LINES ARE NOT NEEDED ANYMORE BECAUSE THE LINK HAS BEEN
|
||||||
|
; HARD-WIRED INTO THE CODE AT NEXT2F_13. - RAJEN.
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
; MOV WORD PTR CS:[NEXT2F_13],OFFSET INT2F_DISK ; PRESERVE INT2F_DISK POINTER
|
||||||
|
; MOV WORD PTR CS:[NEXT2F_13+2],CS
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
CLI
|
||||||
|
MOV WORD PTR DS:[DI],OFFSET INT_2F_13 ; INSTALL NEW VECTORS
|
||||||
|
MOV WORD PTR DS:[DI+2],CS
|
||||||
|
STI
|
||||||
|
POP DI
|
||||||
|
POP DS
|
||||||
|
POP AX
|
||||||
|
|
||||||
|
RET
|
||||||
|
|
||||||
|
RE_INIT ENDP
|
||||||
|
|
||||||
|
;-------------------------------------------------
|
||||||
|
;
|
||||||
|
; ASK TO SWAP THE DISK IN DRIVE A:
|
||||||
|
;
|
||||||
|
PUBLIC SWPDSK
|
||||||
|
SWPDSK PROC NEAR
|
||||||
|
MOV AL,BYTE PTR DS:[DI].DRIVELET ; GET THE DRIVE LETTER
|
||||||
|
;USING A DIFFERENT DRIVE IN A ONE DRIVE SYSTEM SO REQUEST THE USER CHANGE DISKS
|
||||||
|
ADD AL,"A"
|
||||||
|
MOV CS:DRVLET,AL
|
||||||
|
PUSH DS ; PRESERVE SEGMENT REGISTER
|
||||||
|
PUSH CS
|
||||||
|
POP DS
|
||||||
|
MOV SI,OFFSET SNGMSG ; DS:SI -> MESSAGE
|
||||||
|
PUSH BX
|
||||||
|
CALL WRMSG ;PRINT DISK CHANGE MESSAGE
|
||||||
|
CALL FLUSH
|
||||||
|
;SB33003***************************************************************
|
||||||
|
xor AH, AH ; set command to read character;SB
|
||||||
|
int 16h ; call rom-bios ;SB
|
||||||
|
;SB33003***************************************************************
|
||||||
|
POP BX
|
||||||
|
POP DS ; RESTORE SEGMENT REGISTER
|
||||||
|
WRMRET:
|
||||||
|
RET
|
||||||
|
SWPDSK ENDP
|
||||||
|
|
||||||
|
;----------------------------------------------
|
||||||
|
;
|
||||||
|
; WRITE OUT MESSAGE POINTED TO BY [SI]
|
||||||
|
;
|
||||||
|
PUBLIC WRMSG
|
||||||
|
WRMSG PROC NEAR
|
||||||
|
LODSB ;GET THE NEXT CHARACTER OF THE MESSAGE
|
||||||
|
OR AL,AL ;SEE IF END OF MESSAGE
|
||||||
|
JZ WRMRET
|
||||||
|
; INT CHROUT
|
||||||
|
PUSHF
|
||||||
|
PUSH CS
|
||||||
|
CALL OUTCHR
|
||||||
|
JMP SHORT WRMSG
|
||||||
|
WRMSG ENDP
|
||||||
|
|
||||||
|
; INCLUDE BIOMES.INC
|
||||||
|
include MSBIO.CL2
|
||||||
|
|
||||||
|
;
|
||||||
|
; END OF SUPPORT FOR MULTIPLE FLOPPIES WITH NO LOGICAL DRIVES
|
||||||
|
; THIS IS NOT 'SPECIAL' ANY MORE BECAUSE WE NOW HAVE THE CAPABILITY OF
|
||||||
|
; DEFINING LOGICAL DRIVES IN CONFIG.SYS. WE THEREFORE KEEP THE CODE FOR
|
||||||
|
; SWAPPING RESIDENT ALL THE TIME.
|
||||||
|
;
|
||||||
|
|
||||||
|
;J.K. 10/1/86 *******************************************************
|
||||||
|
;Variables for Dynamic Relocatable modules
|
||||||
|
;These should be stay resident.
|
||||||
|
|
||||||
|
public INT6C_RET_ADDR
|
||||||
|
INT6C_RET_ADDR DD ? ; return address from INT 6C for P12 machine
|
||||||
|
|
||||||
|
PATHSTART 001,CLK
|
||||||
|
;
|
||||||
|
; DATA STRUCTURES FOR REAL-TIME DATE AND TIME
|
||||||
|
;
|
||||||
|
public BIN_DATE_TIME
|
||||||
|
public MONTH_TABLE
|
||||||
|
public DAYCNT2
|
||||||
|
public FEB29
|
||||||
|
BIN_DATE_TIME:
|
||||||
|
DB 0 ; CENTURY (19 OR 20) OR HOURS (0-23)
|
||||||
|
DB 0 ; YEAR IN CENTURY (0...99) OR MINUTES (0-59)
|
||||||
|
DB 0 ; MONTH IN YEAR (1...12) OR SECONDS (0-59)
|
||||||
|
DB 0 ; DAY IN MONTH (1...31)
|
||||||
|
MONTH_TABLE: ;
|
||||||
|
DW 0 ;MJB002 JANUARY
|
||||||
|
DW 31 ;MJB002 FEBRUARY
|
||||||
|
DW 59 ;MJB002
|
||||||
|
DW 90 ;MJB002
|
||||||
|
DW 120 ;MJB002
|
||||||
|
DW 151 ;MJB002
|
||||||
|
DW 181 ;MJB002
|
||||||
|
DW 212 ;MJB002
|
||||||
|
DW 243 ;MJB002
|
||||||
|
DW 273 ;MJB002
|
||||||
|
DW 304 ;MJB002
|
||||||
|
DW 334 ;MJB002 DECEMBER
|
||||||
|
DAYCNT2 DW 0000 ;MJB002 TEMP FOR COUNT OF DAYS SINCE 1-1-80
|
||||||
|
FEB29 DB 0 ;MJB002 FEBRUARY 29 IN A LEAP YEAR FLAG
|
||||||
|
PATHEND 001,CLK
|
||||||
|
|
||||||
|
;********************************************************************
|
||||||
|
;
|
||||||
|
|
||||||
|
PUBLIC ENDFLOPPY
|
||||||
|
ENDFLOPPY LABEL BYTE
|
||||||
|
;
|
||||||
|
; END OF CODE FOR VIRTUAL FLOPPY DRIVES
|
||||||
|
;
|
||||||
|
PUBLIC ENDSWAP
|
||||||
|
ENDSWAP LABEL BYTE
|
||||||
|
|
||||||
|
PATHSTART 004,BIO
|
||||||
|
|
||||||
|
PUBLIC HNUM
|
||||||
|
HNUM DB 0 ;NUMBER OF HARDFILES
|
||||||
|
PUBLIC HARDDRV
|
||||||
|
HARDDRV DB 80H ;PHYSICAL DRIVE NUMBER OF FIRST HARDFILE
|
||||||
|
;**********************************************************************
|
||||||
|
; "HDRIVE" IS A HARD DISK WITH 512 BYTE SECTORS
|
||||||
|
;*********************************************************************
|
||||||
|
EVENB
|
||||||
|
PUBLIC BDSH
|
||||||
|
BDSH DW -1 ;LINK TO NEXT STRUCTURE
|
||||||
|
DW CODE
|
||||||
|
DB 80 ;INT 13 DRIVE NUMBER
|
||||||
|
DB "C" ;LOGICAL DRIVE LETTER
|
||||||
|
PUBLIC HDRIVE
|
||||||
|
HDRIVE:
|
||||||
|
DW 512
|
||||||
|
DB 1 ;SECTORS/ALLOCATION UNIT
|
||||||
|
DW 1 ;RESERVED SECTORS FOR DOS
|
||||||
|
DB 2 ;NO. OF ALLOCATION TABLES
|
||||||
|
DW 16 ;NUMBER OF DIRECTORY ENTRIES
|
||||||
|
DW 0000 ;NUMBER OF SECTORS (AT 512 BYTES EACH)
|
||||||
|
DB 11111000B ;MEDIA DESCRIPTOR
|
||||||
|
DW 1 ;NUMBER OF FAT SECTORS
|
||||||
|
DW 00 ;SECTOR LIMIT
|
||||||
|
DW 00 ;HEAD LIMIT
|
||||||
|
DW 00 ;HIDDEN SECTOR COUNT(low)
|
||||||
|
dw 00 ;AN000; Hidden Sector (high)
|
||||||
|
dw 00 ;AN000; Number of Sectors (low)
|
||||||
|
dw 00 ;AN000; Number of Sectors (high)
|
||||||
|
DB 0 ; TRUE => BIGFAT
|
||||||
|
OPCNTH DW 0 ;OPEN REF. COUNT
|
||||||
|
DB 3 ;FORM FACTOR
|
||||||
|
FLAGSH DW 0020H ;VARIOUS FLAGS
|
||||||
|
; DB 9 DUP (0) ;RESERVED FOR FUTURE USE
|
||||||
|
DW 40 ; NUMBER OF CYLINDERS
|
||||||
|
RECBPBH DB 31 DUP (?) ; RECOMMENDED BPB FOR DRIVE
|
||||||
|
TRACKH DB -1 ;LAST TRACK ACCESSED ON THIS DRIVE
|
||||||
|
TIM_LOH DW -1 ;KEEP THESE TWO CONTIGUOUS (?)
|
||||||
|
TIM_HIH DW -1
|
||||||
|
VOLIDH DB "NO NAME ",0 ;AN000; VOLUME ID FOR THIS DISK
|
||||||
|
VolSerH dd 0 ;AN000; Current volume serial number from Boot record
|
||||||
|
SysIDH db "FAT12 " ,0 ;AN000; Current file system id from Boot record
|
||||||
|
|
||||||
|
;
|
||||||
|
; END OF SINGLE HARD DISK SECTION
|
||||||
|
;
|
||||||
|
PUBLIC ENDONEHARD
|
||||||
|
ENDONEHARD LABEL BYTE
|
||||||
|
;**********************************************************************
|
||||||
|
; "DRIVEX " IS AN EXTRA TYPE OF DRIVE USUALLY RESERVED FOR AN
|
||||||
|
; ADDITIONAL HARD FILE
|
||||||
|
;*********************************************************************
|
||||||
|
EVENB
|
||||||
|
PUBLIC BDSX
|
||||||
|
BDSX DW -1 ;LINK TO NEXT STRUCTURE
|
||||||
|
DW CODE
|
||||||
|
DB 81 ;INT 13 DRIVE NUMBER
|
||||||
|
DB "D" ;LOGICAL DRIVE LETTER
|
||||||
|
PUBLIC DRIVEX
|
||||||
|
DRIVEX:
|
||||||
|
DW 512
|
||||||
|
DB 00 ;SECTORS/ALLOCATION UNIT
|
||||||
|
DW 1 ;RESERVED SECTORS FOR DOS
|
||||||
|
DB 2 ;NO. OF ALLOCATION TABLES
|
||||||
|
DW 0000 ;NUMBER OF DIRECTORY ENTRIES
|
||||||
|
DW 0000 ;NUMBER OF SECTORS (AT 512 BYTES EACH)
|
||||||
|
DB 11111000B ;MEDIA DESCRIPTOR
|
||||||
|
DW 0000 ;NUMBER OF FAT SECTORS
|
||||||
|
DW 00 ;SECTOR LIMIT
|
||||||
|
DW 00 ;HEAD LIMIT
|
||||||
|
DW 00 ;HIDDEN SECTOR COUNT (low)
|
||||||
|
dw 00 ;AN000; Hidden Sector (high)
|
||||||
|
dw 00 ;AN000; Number of Sectors (low)
|
||||||
|
dw 00 ;AN000; Number of Sectors (high)
|
||||||
|
DB 0 ; TRUE => BIGFAT
|
||||||
|
OPCNTD DW 0 ;OPEN REF. COUNT
|
||||||
|
DB 3 ;FORM FACTOR
|
||||||
|
FLAGSD DW 0020H ;VARIOUS FLAGS
|
||||||
|
; DB 9 DUP (0) ;RESERVED FOR FUTURE USE
|
||||||
|
DW 40 ; NUMBER OF CYLINDERS
|
||||||
|
RECBPBD DB 31 DUP (?) ; RECOMMENDED BPB FOR DRIVE
|
||||||
|
TRACKD DB -1 ;LAST TRACK ACCESSED ON THIS DRIVE
|
||||||
|
TIM_LOD DW -1 ;KEEP THESE TWO CONTIGUOUS (?)
|
||||||
|
TIM_HID DW -1
|
||||||
|
VOLIDD DB "NO NAME ",0 ;AN000; VOLUME ID FOR THIS DISK
|
||||||
|
VolSerD dd 0 ;AN000; Current volume serial number from Boot record
|
||||||
|
SysIDD db "FAT12 " ,0 ;AN000; Current file system id from Boot record
|
||||||
|
|
||||||
|
;
|
||||||
|
; END OF SECTION FOR TWO HARD DISKS
|
||||||
|
PUBLIC ENDTWOHARD
|
||||||
|
ENDTWOHARD LABEL BYTE
|
||||||
|
|
||||||
|
PATHEND 004,BIO
|
||||||
|
|
||||||
|
PUBLIC TWOHARD
|
||||||
|
TWOHARD LABEL BYTE
|
||||||
|
PAGE
|
||||||
|
INCLUDE MS96TPI.INC
|
||||||
|
|
||||||
|
;*********************************************************************
|
||||||
|
;Memory allocation for BDSM table. - J.K. 2/21/86
|
||||||
|
;*********************************************************************
|
||||||
|
PUBLIC BDSMs
|
||||||
|
BDSMs BDSM_type Max_mini_dsk_num dup (<>) ;currently max. 23
|
||||||
|
|
||||||
|
;** End_of_BDSM defined in IBMINIT.ASM will be used to set the appropriate
|
||||||
|
;** ending address of BDSM table.
|
||||||
|
|
||||||
|
;
|
||||||
|
;;3.3 BUG FIX -SP ------------------------------
|
||||||
|
;;Migrated into 4.00 -MRW
|
||||||
|
;Paragraph buffer between the BDSMs and MSHARD
|
||||||
|
;
|
||||||
|
;The relocation code for MSHARD needs this. this cannot be used for
|
||||||
|
;anything. nothing can come before this or after this.....IMPORTANT!!!!
|
||||||
|
;don't get too smart and using this buffer for anything!!!!!!
|
||||||
|
;
|
||||||
|
db 16 dup(0)
|
||||||
|
;
|
||||||
|
;end of bug fix buffer
|
||||||
|
;;
|
||||||
|
;;3.3 BUG FIX -SP------------------------------
|
||||||
|
|
||||||
|
CODE ENDS
|
||||||
|
END
|
296
v4.0/src/BIOS/MSCLOCK.ASM
Normal file
296
v4.0/src/BIOS/MSCLOCK.ASM
Normal file
@ -0,0 +1,296 @@
|
|||||||
|
TITLE MSCLOCK - DOS 3.3
|
||||||
|
;----------------------------------------------------------------
|
||||||
|
; :
|
||||||
|
; CLOCK DEVICE DRIVER :
|
||||||
|
; :
|
||||||
|
; :
|
||||||
|
; This file contains the Clock Device Driver. :
|
||||||
|
; :
|
||||||
|
; The routines in this files are: :
|
||||||
|
; :
|
||||||
|
; routine function :
|
||||||
|
; ------- -------- :
|
||||||
|
; TIM$WRIT Set the current time :
|
||||||
|
; TIM$READ Read the current time :
|
||||||
|
; Time_To_Ticks Convert time to corresponding :
|
||||||
|
; number of clock ticks :
|
||||||
|
; :
|
||||||
|
; The clock ticks at the rate of: :
|
||||||
|
; :
|
||||||
|
; 1193180/65536 ticks/second (about 18.2 ticks per second):
|
||||||
|
; See each routine for information on the use. :
|
||||||
|
; :
|
||||||
|
;----------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
itest=0
|
||||||
|
INCLUDE MSGROUP.INC ;DEFINE CODE SEGMENT
|
||||||
|
INCLUDE MSMACRO.INC
|
||||||
|
|
||||||
|
EXTRN EXIT:NEAR
|
||||||
|
;
|
||||||
|
; DAYCNT is the number of days since 1-1-80.
|
||||||
|
; Each time the clock is read it is necessary to check if another day has
|
||||||
|
; passed. The ROM only returns the day rollover once so if it is missed
|
||||||
|
; the time will be off by a day.
|
||||||
|
;
|
||||||
|
EXTRN DAYCNT:WORD ;MSDATA
|
||||||
|
|
||||||
|
;;Rev 3.30 Modification ------------------------------------------------
|
||||||
|
; variables for real time clock setting
|
||||||
|
public HaveCMOSClock
|
||||||
|
HaveCMOSClock db 0 ;set by MSINIT.
|
||||||
|
public base_century
|
||||||
|
base_century db 19
|
||||||
|
public base_year
|
||||||
|
base_year db 80
|
||||||
|
public month_tab
|
||||||
|
month_tab db 31,28,31,30,31,30,31,31,30,31,30,31
|
||||||
|
|
||||||
|
; The following are indirect intra-segment call addresses. The
|
||||||
|
;procedures are defined in MSINIT for relocation. MSINIT will set these
|
||||||
|
;address when the relocation is done.
|
||||||
|
public BinToBCD
|
||||||
|
BinToBCD dw 0 ;should point to Bin_To_BCD proc in MSINIT
|
||||||
|
public DaycntToDay
|
||||||
|
DaycntToDay dw 0 ;should point to Daycnt_to_day in MSINIT
|
||||||
|
|
||||||
|
;********************************************************************
|
||||||
|
; Indirect call address of TIME_TO_TICKS procedure.
|
||||||
|
;This will be used by the relocatable portable suspend/resume code.
|
||||||
|
|
||||||
|
public TimeToTicks
|
||||||
|
TimeToTicks dw Time_To_Ticks
|
||||||
|
|
||||||
|
;;End of Modification ------------------------------------------------
|
||||||
|
|
||||||
|
;--------------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; Settime sets the current time
|
||||||
|
;
|
||||||
|
; On entry ES:[DI] has the current time:
|
||||||
|
;
|
||||||
|
; number of days since 1-1-80 (WORD)
|
||||||
|
; minutes (0-59) (BYTE)
|
||||||
|
; hours (0-23) (BYTE)
|
||||||
|
; hundredths of seconds (0-99) (BYTE)
|
||||||
|
; seconds (0-59) (BYTE)
|
||||||
|
;
|
||||||
|
; Each number has been checked for the correct range.
|
||||||
|
;
|
||||||
|
PUBLIC TIM$WRIT
|
||||||
|
TIM$WRIT PROC NEAR
|
||||||
|
ASSUME DS:CODE
|
||||||
|
mov AX,WORD PTR ES:[DI]
|
||||||
|
push AX ;DAYCNT. We need to set this at the very
|
||||||
|
; end to avoid tick windows.
|
||||||
|
;;Rev 3.30 Modification
|
||||||
|
cmp HaveCMOSClock, 0
|
||||||
|
je No_CMOS_1
|
||||||
|
mov al,es:[di+3] ;get binary hours
|
||||||
|
call BinToBCD ;convert to BCD
|
||||||
|
mov ch,al ;CH = BCD hours
|
||||||
|
mov al,es:[di+2] ;get binary minutes
|
||||||
|
call BinToBCD ;convert to BCD
|
||||||
|
mov cl,al ;CL = BCD minutes
|
||||||
|
mov al,es:[di+5] ;get binary seconds
|
||||||
|
call BinToBCD ;convert to BCD
|
||||||
|
mov dh,al ;DH = BCD seconds
|
||||||
|
mov dl,0 ;DL = 0 (ST) or 1 (DST)
|
||||||
|
cli ;turn off timer
|
||||||
|
mov ah,03h ;set RTC time
|
||||||
|
int 1Ah ;call rom bios clock routine
|
||||||
|
sti
|
||||||
|
|
||||||
|
;;End of Modification
|
||||||
|
No_CMOS_1:
|
||||||
|
mov CX,WORD PTR ES:[DI+2]
|
||||||
|
mov DX,WORD PTR ES:[DI+4]
|
||||||
|
;;Rev 3.30 Modification
|
||||||
|
call time_to_ticks ; convert time to ticks
|
||||||
|
;CX:DX now has time in ticks
|
||||||
|
cli ; Turn off timer
|
||||||
|
mov AH, 1 ; command is set time in clock
|
||||||
|
int 1Ah ; call rom-bios clock routines
|
||||||
|
pop [DAYCNT]
|
||||||
|
sti
|
||||||
|
;CMOS clock -------------------------------------
|
||||||
|
cmp HaveCMOSClock, 0
|
||||||
|
je No_CMOS_2
|
||||||
|
call DaycntToDay ; convert to BCD format
|
||||||
|
cli ; Turn off timer
|
||||||
|
mov AH,05h ; set RTC date
|
||||||
|
int 1Ah ; call rom-bios clock routines
|
||||||
|
sti
|
||||||
|
;------------------------------------------------
|
||||||
|
|
||||||
|
No_CMOS_2:
|
||||||
|
jmp EXIT
|
||||||
|
TIM$WRIT ENDP
|
||||||
|
;;End of Modification
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; convert time to ticks
|
||||||
|
; input : time in CX and DX
|
||||||
|
; ticks returned in CX:DX
|
||||||
|
;
|
||||||
|
public time_to_ticks
|
||||||
|
TIME_TO_TICKS PROC NEAR
|
||||||
|
|
||||||
|
; first convert from Hour,min,sec,hund. to
|
||||||
|
; total number of 100th of seconds
|
||||||
|
mov AL,60
|
||||||
|
mul CH ;Hours to minutes
|
||||||
|
mov CH,0
|
||||||
|
add AX,CX ;Total minutes
|
||||||
|
mov CX,6000 ;60*100
|
||||||
|
mov BX,DX ;Get out of the way of the multiply
|
||||||
|
mul CX ;Convert to 1/100 sec
|
||||||
|
mov CX,AX
|
||||||
|
mov AL,100
|
||||||
|
mul BH ;Convert seconds to 1/100 sec
|
||||||
|
add CX,AX ;Combine seconds with hours and min.
|
||||||
|
adc DX,0 ;Ripple carry
|
||||||
|
mov BH,0
|
||||||
|
add CX,BX ;Combine 1/100 sec
|
||||||
|
adc DX,0
|
||||||
|
|
||||||
|
;;Rev 3.30 Modification
|
||||||
|
;DX:CX IS TIME IN 1/100 SEC
|
||||||
|
XCHG AX,DX
|
||||||
|
XCHG AX,CX ;NOW TIME IS IN CX:AX
|
||||||
|
MOV BX,59659
|
||||||
|
MUL BX ;MULTIPLY LOW HALF
|
||||||
|
XCHG DX,CX
|
||||||
|
XCHG AX,DX ;CX->AX, AX->DX, DX->CX
|
||||||
|
MUL BX ;MULTIPLY HIGH HALF
|
||||||
|
ADD AX,CX ;COMBINE OVERLAPPING PRODUCTS
|
||||||
|
ADC DX,0
|
||||||
|
XCHG AX,DX ;AX:DX=TIME*59659
|
||||||
|
MOV BX,5
|
||||||
|
DIV BL ;DIVIDE HIGH HALF BY 5
|
||||||
|
MOV CL,AL
|
||||||
|
MOV CH,0
|
||||||
|
MOV AL,AH ;REMAINDER OF DIVIDE-BY-5
|
||||||
|
CBW
|
||||||
|
XCHG AX,DX ;USE IT TO EXTEND LOW HALF
|
||||||
|
DIV BX ;DIVDE LOW HALF BY 5
|
||||||
|
MOV DX,AX
|
||||||
|
; CX:DX is now number of ticks in time
|
||||||
|
ret
|
||||||
|
TIME_TO_TICKS ENDP
|
||||||
|
;;End of Modification
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; Gettime reads date and time
|
||||||
|
; and returns the following information:
|
||||||
|
;
|
||||||
|
; ES:[DI] =count of days since 1-1-80
|
||||||
|
; ES:[DI+2]=hours
|
||||||
|
; ES:[DI+3]=minutes
|
||||||
|
; ES:[DI+4]=seconds
|
||||||
|
; ES:[DI+5]=hundredths of seconds
|
||||||
|
;
|
||||||
|
PUBLIC TIM$READ
|
||||||
|
TIM$READ PROC NEAR
|
||||||
|
; read the clock
|
||||||
|
xor AH, AH ; set command to read clock
|
||||||
|
int 1Ah ; call rom-bios to get time
|
||||||
|
|
||||||
|
or al,al ; check for a new day
|
||||||
|
jz noroll1 ; if al=0 then don't reset day count
|
||||||
|
INC [DAYCNT] ; CATCH ROLLOVE
|
||||||
|
noroll1:
|
||||||
|
MOV SI,[DAYCNT]
|
||||||
|
|
||||||
|
;
|
||||||
|
; we now need to convert the time in tick to the time in 100th of
|
||||||
|
; seconds. The relation between tick and seconds is:
|
||||||
|
;
|
||||||
|
; 65536 seconds
|
||||||
|
; ----------------
|
||||||
|
; 1,193,180 tick
|
||||||
|
;
|
||||||
|
; To get to 100th of second we need to multiply by 100. The equation is:
|
||||||
|
;
|
||||||
|
; Ticks from clock * 65536 * 100
|
||||||
|
; --------------------------------- = time in 100th of seconds
|
||||||
|
; 1,193,180
|
||||||
|
;
|
||||||
|
; Fortunately this fromula simplifies to:
|
||||||
|
;
|
||||||
|
; Ticks from clock * 5 * 65,536
|
||||||
|
; --------------------------------- = time in 100th of seconds
|
||||||
|
; 59,659
|
||||||
|
;
|
||||||
|
; The calculation is done by first multipling tick by 5. Next we divide by
|
||||||
|
; 59,659. In this division we multiply by 65,536 by shifting the dividend
|
||||||
|
; my 16 bits to the left.
|
||||||
|
;
|
||||||
|
; start with ticks in CX:DX
|
||||||
|
; multiply by 5
|
||||||
|
MOV AX,CX
|
||||||
|
MOV BX,DX
|
||||||
|
SHL DX,1
|
||||||
|
RCL CX,1 ;TIMES 2
|
||||||
|
SHL DX,1
|
||||||
|
RCL CX,1 ;TIMES 4
|
||||||
|
ADD DX,BX
|
||||||
|
ADC AX,CX ;TIMES 5
|
||||||
|
XCHG AX,DX
|
||||||
|
|
||||||
|
|
||||||
|
; now have ticks * 5 in DX:AX
|
||||||
|
; we now need to multiply by 65,536 and divide by 59659 d.
|
||||||
|
|
||||||
|
mov CX,59659 ; get divisor
|
||||||
|
div CX
|
||||||
|
; DX now has remainder
|
||||||
|
; AX has high word of final quotient
|
||||||
|
mov BX,AX ; put high work if safe place
|
||||||
|
xor AX,AX ; this is the multiply by 65536
|
||||||
|
div CX ; BX:AX now has time in 100th of seconds
|
||||||
|
|
||||||
|
;
|
||||||
|
;Rounding based on the remainder may be added here
|
||||||
|
;The result in BX:AX is time in 1/100 second.
|
||||||
|
mov DX,BX
|
||||||
|
mov CX,200 ;Extract 1/100's
|
||||||
|
;Division by 200 is necessary to ensure no overflow--max result
|
||||||
|
;is number of seconds in a day/2 = 43200.
|
||||||
|
div CX
|
||||||
|
cmp DL,100 ;Remainder over 100?
|
||||||
|
jb NOADJ
|
||||||
|
sub DL,100 ;Keep 1/100's less than 100
|
||||||
|
NOADJ:
|
||||||
|
cmc ;If we subtracted 100, carry is now set
|
||||||
|
mov BL,DL ;Save 1/100's
|
||||||
|
;To compensate for dividing by 200 instead of 100, we now multiply
|
||||||
|
;by two, shifting a one in if the remainder had exceeded 100.
|
||||||
|
rcl AX,1
|
||||||
|
mov DL,0
|
||||||
|
rcl DX,1
|
||||||
|
mov CX,60 ;Divide out seconds
|
||||||
|
div CX
|
||||||
|
mov BH,DL ;Save the seconds
|
||||||
|
div CL ;Break into hours and minutes
|
||||||
|
xchg AL,AH
|
||||||
|
|
||||||
|
;Time is now in AX:BX (hours, minutes, seconds, 1/100 sec)
|
||||||
|
|
||||||
|
push AX
|
||||||
|
MOV AX,SI ; DAYCNT
|
||||||
|
stosw
|
||||||
|
pop AX
|
||||||
|
stosw
|
||||||
|
mov AX,BX
|
||||||
|
stosw
|
||||||
|
jmp EXIT
|
||||||
|
|
||||||
|
TIM$READ ENDP
|
||||||
|
CODE ENDS
|
||||||
|
END
|
||||||
|
|
328
v4.0/src/BIOS/MSCON.ASM
Normal file
328
v4.0/src/BIOS/MSCON.ASM
Normal file
@ -0,0 +1,328 @@
|
|||||||
|
PAGE ,132 ;
|
||||||
|
TITLE MSCON - BIOS
|
||||||
|
%OUT ...MSCON.ASM
|
||||||
|
;==============================================================================
|
||||||
|
;REVISION HISTORY:
|
||||||
|
;AN000 - New for DOS Version 4.00 - J.K.
|
||||||
|
;AC000 - Changed for DOS Version 4.00 - J.K.
|
||||||
|
;AN00x - PTM number for DOS Version 4.00 - J.K.
|
||||||
|
;==============================================================================
|
||||||
|
|
||||||
|
itest=0
|
||||||
|
INCLUDE MSGROUP.INC ;DEFINE CODE SEGMENT
|
||||||
|
INCLUDE JUMPMAC.INC
|
||||||
|
INCLUDE MSEQU.INC
|
||||||
|
INCLUDE MSMACRO.INC
|
||||||
|
|
||||||
|
;*** DOS 3.3 will not support more than 25 rows
|
||||||
|
; INCLUDE DEVSYM.INC ;J.K. 4/29/86 for CON$GENIOCTL support
|
||||||
|
; INCLUDE IOCTL.INC ;J.K. 4/29/86 for CON$GENIOCTL support
|
||||||
|
|
||||||
|
EXTRN EXIT:NEAR ;MSBIO1
|
||||||
|
EXTRN BUS$EXIT:NEAR ;MSBIO1
|
||||||
|
|
||||||
|
; EXTRN CMDERR:NEAR ;MSBIO1 J.K. 4/29/86
|
||||||
|
|
||||||
|
;DATA
|
||||||
|
EXTRN PTRSAV:DWORD ;MSBIO1
|
||||||
|
EXTRN FHAVEK09:BYTE ;MSDISK
|
||||||
|
EXTRN ALTAH:BYTE ;MSBDATA
|
||||||
|
EXTRN KEYRD_Func:Byte ;MSBDATA
|
||||||
|
EXTRN KEYSTS_Func:Byte ;MSBDATA
|
||||||
|
|
||||||
|
; EXTRN SAV_SC_INFO:BYTE ;MSBDATA J.K. 4/29/86
|
||||||
|
; EXTRN SAV_SC_MODE:BYTE ;MSBDATA J.K. 4/29/86
|
||||||
|
;------------------------------------------------------
|
||||||
|
;
|
||||||
|
; CONSOLE READ ROUTINE
|
||||||
|
;
|
||||||
|
ASSUME DS:CODE ; THIS WAS SET BY THE CON DD ENTRY POINT
|
||||||
|
PUBLIC CON$READ
|
||||||
|
CON$READ PROC NEAR
|
||||||
|
JCXZ CON$EXIT
|
||||||
|
CON$LOOP:
|
||||||
|
CALL CHRIN ;GET CHAR IN AL
|
||||||
|
STOSB ;STORE CHAR AT ES:DI
|
||||||
|
LOOP CON$LOOP
|
||||||
|
CON$EXIT:
|
||||||
|
JUMP EXIT
|
||||||
|
CON$READ ENDP
|
||||||
|
;---------------------------------------------------------
|
||||||
|
;
|
||||||
|
; INPUT SINGLE CHAR INTO AL
|
||||||
|
;
|
||||||
|
;J.K.5/12/87 We are going to issue extended keyboard function, if supported.
|
||||||
|
;The returning value of the extended key stroke of the extended key board
|
||||||
|
;function uses 0E0h in AL instead of 00 as in the conventional key board
|
||||||
|
;function. This creates a conflict when the user entered real Greek Alpha
|
||||||
|
;charater (= 0E0h) to distinguish the extended key stroke and the Greek Alpha.
|
||||||
|
;This case will be handled in the following manner;
|
||||||
|
; AH = 16h
|
||||||
|
; INT 16h
|
||||||
|
; If AL == 0, then extended code (in AH)
|
||||||
|
; else If AL == 0E0h, then
|
||||||
|
; IF AH <> 0, then extended code (in AH)
|
||||||
|
; else Greek_Alpha character.
|
||||||
|
;Also, for compatibility reason, if an extended code is detected, then we
|
||||||
|
;are going to change the value in AL from 0E0h to 00h.
|
||||||
|
|
||||||
|
|
||||||
|
CHRIN PROC NEAR
|
||||||
|
;AN000;
|
||||||
|
; XOR AX,AX
|
||||||
|
mov ah,KEYRD_Func ;AN000; Set by MSINIT. 0 or 10h
|
||||||
|
xor al,al ;AN000;
|
||||||
|
XCHG AL,ALTAH ;GET CHARACTER & ZERO ALTAH
|
||||||
|
|
||||||
|
OR AL,AL
|
||||||
|
JNZ KEYRET
|
||||||
|
;SB34CON000**************************************************************
|
||||||
|
;SB Keyboard I/O interrupt
|
||||||
|
;SB AH already contains the keyboard read function number
|
||||||
|
;SB 1 LOC
|
||||||
|
|
||||||
|
int 16h
|
||||||
|
;SB34CON000**************************************************************
|
||||||
|
ALT10:
|
||||||
|
OR AX,AX ;CHECK FOR NON-KEY AFTER BREAK
|
||||||
|
JZ CHRIN
|
||||||
|
CMP AX,7200H ;CHECK FOR CTRL-PRTSC
|
||||||
|
JNZ ALT_Ext_Chk ;AN000;
|
||||||
|
MOV AL,16
|
||||||
|
jmp KeyRet ;AN000;
|
||||||
|
ALT_Ext_Chk:
|
||||||
|
;SB34CON001**************************************************************
|
||||||
|
;SB IF operation was extended function (i.e. KEYRD_Func != 0) THEN
|
||||||
|
;SB IF character read was 0E0h THEN
|
||||||
|
;SB IF extended byte was zero (i.e. AH == 0) THEN
|
||||||
|
;SB goto keyret
|
||||||
|
;SB ELSE
|
||||||
|
;SB set AL to zero
|
||||||
|
;SB goto ALT_SAVE
|
||||||
|
;SB ENDIF
|
||||||
|
;SB ENDIF
|
||||||
|
;SB ENDIF
|
||||||
|
;SB 9 LOCS
|
||||||
|
|
||||||
|
cmp BYTE PTR KEYRD_Func,0
|
||||||
|
jz NOT_EXT
|
||||||
|
cmp al,0E0h
|
||||||
|
jnz NOT_EXT
|
||||||
|
or ah,ah
|
||||||
|
jz KEYRET
|
||||||
|
xor al,al
|
||||||
|
jmp short ALT_SAVE
|
||||||
|
NOT_EXT:
|
||||||
|
|
||||||
|
;SB34CON001**************************************************************
|
||||||
|
OR AL,AL ;SPECIAL CASE?
|
||||||
|
JNZ KEYRET
|
||||||
|
ALT_SAVE:
|
||||||
|
MOV ALTAH,AH ;STORE SPECIAL KEY
|
||||||
|
KEYRET:
|
||||||
|
RET
|
||||||
|
CHRIN ENDP
|
||||||
|
|
||||||
|
;--------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; KEYBOARD NON DESTRUCTIVE READ, NO WAIT
|
||||||
|
;
|
||||||
|
; PC-CONVERTIBLE-TYPE MACHINE: IF BIT 10 IS SET BY THE DOS IN THE STATUS WORD
|
||||||
|
; OF THE REQUEST PACKET, AND THERE IS NO CHARACTER IN THE INPUT BUFFER, THE
|
||||||
|
; DRIVER ISSUES A SYSTEM WAIT REQUEST TO THE ROM. ON RETURN FROM THE ROM, IT
|
||||||
|
; RETURNS A 'CHAR-NOT-FOUND' TO THE DOS.
|
||||||
|
;
|
||||||
|
CONBUSJ:
|
||||||
|
ASSUME DS:NOTHING
|
||||||
|
JMP CONBUS
|
||||||
|
|
||||||
|
ASSUME DS:CODE ; THIS WAS SET BY THE CON DD ENTRY POINT
|
||||||
|
PUBLIC CON$RDND
|
||||||
|
CON$RDND:
|
||||||
|
MOV AL,[ALTAH]
|
||||||
|
OR AL,AL
|
||||||
|
JZ RD1
|
||||||
|
JMP RDEXIT
|
||||||
|
|
||||||
|
RD1:
|
||||||
|
;SB34CON002**************************************************************
|
||||||
|
;SB Keyboard I/O interrupt
|
||||||
|
;SB Get keystroke status (KEYSTS_Func)
|
||||||
|
;SB 2 LOCS
|
||||||
|
|
||||||
|
mov ah,KEYSTS_Func
|
||||||
|
int 16h
|
||||||
|
;SB34CON002**************************************************************
|
||||||
|
JZ NOCHR
|
||||||
|
JMP GOTCHR
|
||||||
|
NOCHR:
|
||||||
|
CMP FHAVEK09,0
|
||||||
|
JZ CONBUSJ
|
||||||
|
LDS BX,[PTRSAV]
|
||||||
|
ASSUME DS:NOTHING
|
||||||
|
TEST [BX].STATUS,0400H ; SYSTEM WAIT ENABLED?
|
||||||
|
JZ CONBUSJ
|
||||||
|
|
||||||
|
;********************************
|
||||||
|
; NEED TO WAIT FOR IBM RESPONSE TO REQUEST FOR CODE ON HOW TO USE THE SYSTEM
|
||||||
|
; WAIT CALL.
|
||||||
|
;********************************
|
||||||
|
MESSAGE FTESTCON,<"SYSTEM WAIT STAGE",CR,LF>
|
||||||
|
MOV AX,4100H ; WAIT ON AN EXTERNAL EVENT
|
||||||
|
; MOV BX,0300H ; NO TIMEOUT
|
||||||
|
; MOV DX,60H ; LOOK AT I/O PORT 60H
|
||||||
|
INT 15H ; CALL ROM FOR SYSTEM WAIT
|
||||||
|
MESSAGE FTESTCON,<"OUT OF WAIT. AX IS ">
|
||||||
|
MNUM FTESTCON,AX
|
||||||
|
MESSAGE FTESTCON,<CR,LF>
|
||||||
|
JMP CONBUS
|
||||||
|
|
||||||
|
ASSUME DS:CODE
|
||||||
|
GOTCHR:
|
||||||
|
OR AX,AX
|
||||||
|
JNZ NOTBRK ;CHECK FOR NULL AFTER BREAK
|
||||||
|
;SB34CON004**************************************************************
|
||||||
|
;SB Keyboard I/O interrupt
|
||||||
|
;SB Keyboard read function (KEYRD_Func)
|
||||||
|
;SB 2 LOCS
|
||||||
|
|
||||||
|
mov ah,KEYRD_Func
|
||||||
|
int 16h
|
||||||
|
;SB34CON004**************************************************************
|
||||||
|
JUMP CON$RDND ;AND GET A REAL STATUS
|
||||||
|
NOTBRK:
|
||||||
|
CMP AX,7200H ;CHECK FOR CTRL-PRTSC
|
||||||
|
JNZ RD_Ext_Chk ;AN000;
|
||||||
|
MOV AL,16
|
||||||
|
jmp RDEXIT ;AN000;
|
||||||
|
RD_Ext_Chk: ;AN000;
|
||||||
|
cmp KEYRD_Func, 0 ;AN000; Extended Keyboard function?
|
||||||
|
jz RDEXIT ;AN000; No. Normal exit.
|
||||||
|
cmp al,0E0h ;AN000; Extended key value or Greek Alpha?
|
||||||
|
jne RDEXIT ;AN000;
|
||||||
|
cmp ah, 0 ;AN000; Scan code exist?
|
||||||
|
jz RDEXIT ;AN000; Yes. Greek Alpha char.
|
||||||
|
mov al, 0 ;AN000; No. Extended key stroke. Change it for compatibility
|
||||||
|
PUBLIC RDEXIT
|
||||||
|
RDEXIT:
|
||||||
|
LDS BX,[PTRSAV]
|
||||||
|
ASSUME DS:NOTHING
|
||||||
|
MOV [BX].MEDIA,AL
|
||||||
|
EXVEC:
|
||||||
|
JUMP EXIT
|
||||||
|
|
||||||
|
CONBUS:
|
||||||
|
ASSUME DS:NOTHING
|
||||||
|
JUMP BUS$EXIT
|
||||||
|
;--------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; KEYBOARD FLUSH ROUTINE
|
||||||
|
;
|
||||||
|
ASSUME DS:CODE ; THIS WAS SET BY THE CON DD ENTRY POINT
|
||||||
|
PUBLIC CON$FLSH
|
||||||
|
CON$FLSH:
|
||||||
|
CALL FLUSH
|
||||||
|
JUMP EXIT
|
||||||
|
|
||||||
|
PUBLIC FLUSH
|
||||||
|
FLUSH:
|
||||||
|
MOV [ALTAH],0 ;CLEAR OUT HOLDING BUFFER
|
||||||
|
|
||||||
|
FLLOOP:
|
||||||
|
;SB33012****************************************************************
|
||||||
|
;SB ; Is there a char there?
|
||||||
|
mov AH, 1 ;SB ; command code for check status
|
||||||
|
int 16h ;SB ; call rom-bios keyboard routine
|
||||||
|
;SB33012****************************************************************
|
||||||
|
JZ FLDONE
|
||||||
|
;SB33013****************************************************************
|
||||||
|
xor AH, AH ;SB ; if zf is nof set, get character
|
||||||
|
int 16h ;SB ; call rom-bios to get character
|
||||||
|
;SB33013****************************************************************
|
||||||
|
JMP FLLOOP
|
||||||
|
FLDONE:
|
||||||
|
|
||||||
|
RET
|
||||||
|
;----------------------------------------------------------
|
||||||
|
;
|
||||||
|
; CONSOLE WRITE ROUTINE
|
||||||
|
;
|
||||||
|
ASSUME DS:CODE ; THIS WAS SET BY THE CON DD ENTRY POINT
|
||||||
|
PUBLIC CON$WRIT
|
||||||
|
CON$WRIT:
|
||||||
|
JCXZ EXVEC
|
||||||
|
CON$LP:
|
||||||
|
MOV AL,ES:[DI] ;GET CHAR
|
||||||
|
INC DI
|
||||||
|
INT CHROUT ;OUTPUT CHAR
|
||||||
|
LOOP CON$LP ;REPEAT UNTIL ALL THROUGH
|
||||||
|
JUMP EXIT
|
||||||
|
;-----------------------------------------------
|
||||||
|
;
|
||||||
|
; BREAK KEY HANDLING
|
||||||
|
;
|
||||||
|
PUBLIC CBREAK
|
||||||
|
CBREAK:
|
||||||
|
MOV CS:ALTAH,3 ;INDICATE BREAK KEY SET
|
||||||
|
|
||||||
|
PUBLIC INTRET
|
||||||
|
INTRET:
|
||||||
|
IRET
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;J.K. 4/29/86 - CONSOLE GENERIC IOCTL SUPPORT FOR DOS 3.3.
|
||||||
|
;CON$GENIOCTL supports Get mode information, Set mode information functions.
|
||||||
|
;It will only save the value from "Set mode information" and will return
|
||||||
|
;the value through "Get mode information". It is supposed to be set by
|
||||||
|
;the MODE.COM and other application program can retrieve information
|
||||||
|
;through "Get mode information" call.
|
||||||
|
;Initially, there is no valuable informaton until set by MODE command, so
|
||||||
|
;any attemp to "Get mode information" at that points will fail. (unknown
|
||||||
|
;command with carry set.)
|
||||||
|
;At entry: CS = DS = code
|
||||||
|
; CS:[PTRSAV] has seg, address of the Request Header saved in
|
||||||
|
; in Strategy routine.
|
||||||
|
;
|
||||||
|
; PUBLIC CON$GENIOCTL
|
||||||
|
; ASSUME DS:CODE
|
||||||
|
;CON$GENIOCTL:
|
||||||
|
; les di, CS:[PTRSAV] ;get the request header
|
||||||
|
; cmp es:[di].MajorFunction, IOC_SC
|
||||||
|
; je Major_SC_OK
|
||||||
|
;SC_CMDERR:
|
||||||
|
; stc
|
||||||
|
; jmp cmderr ;carry is set, exit to cmderr
|
||||||
|
;Major_SC_OK:
|
||||||
|
; mov al, es:[di].MinorFunction ;save minor function
|
||||||
|
; les di, es:[di].GenericIOCTL_Packet ;pointer of SC_MODE_INFO structure
|
||||||
|
; mov cx, es:[di].SC_INFO_LENGTH ;save length
|
||||||
|
; inc di
|
||||||
|
; inc di ;ES:DI -> SC_MODE in Info. Packet
|
||||||
|
; cmp cx, SC_INFO_PACKET_LENGTH ;currently 9.
|
||||||
|
; jne SC_CMDERR ;cannot accept the different packet
|
||||||
|
; cmp al, GET_SC_MODE ;minor function = 60h ?
|
||||||
|
; jne SC_SET_MODE_FUNC ;no, check if it is "Set mode function"
|
||||||
|
; cmp SAV_SC_MODE, 0 ;information set before?
|
||||||
|
; je SC_CMDERR ;no, cannot get the info.
|
||||||
|
;;SC_GET_MODE_FUNC: ;es:di -> SC_MODE in info. packet
|
||||||
|
; ;cx - length
|
||||||
|
; mov si, offset SAV_SC_INFO
|
||||||
|
; rep movsb ;ds:si -> sav_sc_info, es:di -> sc_mode
|
||||||
|
; jmp exit
|
||||||
|
;
|
||||||
|
;SC_SET_MODE_FUNC: ;es:di -> SC_MODE
|
||||||
|
; cmp al, SET_SC_MODE ;minor function = 40h ?
|
||||||
|
; jne SC_CMDERR
|
||||||
|
; mov si, offset SAV_SC_INFO
|
||||||
|
; xchg di, si
|
||||||
|
; push es
|
||||||
|
; push ds
|
||||||
|
; pop es
|
||||||
|
; pop ds
|
||||||
|
; rep movsb ;ds:si -> sc_mode, es:di -> sav_sc_info
|
||||||
|
; jmp exit
|
||||||
|
;
|
||||||
|
;J.K. 4/29/86 - End of CONSOLE GENERIC IOCTL SUPPORT FOR DOS 3.3.
|
||||||
|
|
||||||
|
CODE ENDS
|
||||||
|
END
|
2443
v4.0/src/BIOS/MSDISK.ASM
Normal file
2443
v4.0/src/BIOS/MSDISK.ASM
Normal file
File diff suppressed because it is too large
Load Diff
22
v4.0/src/BIOS/MSDSKPR.INC
Normal file
22
v4.0/src/BIOS/MSDSKPR.INC
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
; The following structure defines the disk parameter table
|
||||||
|
; pointed to by Interrupt vector 1EH (location 0:78H)
|
||||||
|
|
||||||
|
DISK_PARMS STRUC
|
||||||
|
DISK_SPECIFY_1 DB ?
|
||||||
|
DISK_SPECIFY_2 DB ?
|
||||||
|
DISK_MOTOR_WAIT DB ? ; Wait till motor off
|
||||||
|
DISK_SECTOR_SIZ DB ? ; Bytes/Sector (2 = 512)
|
||||||
|
DISK_EOT DB ? ; Sectors per track (MAX)
|
||||||
|
DISK_RW_GAP DB ? ; Read Write Gap
|
||||||
|
DISK_DTL DB ?
|
||||||
|
DISK_FORMT_GAP DB ? ; Format Gap Length
|
||||||
|
DISK_FILL DB ? ; Format Fill Byte
|
||||||
|
DISK_HEAD_STTL DB ? ; Head Settle Time (MSec)
|
||||||
|
DISK_MOTOR_STRT DB ? ; Motor start delay
|
||||||
|
DISK_PARMS ENDS
|
||||||
|
|
||||||
|
ROMStatus equ 1
|
||||||
|
ROMRead equ 2
|
||||||
|
ROMWrite equ 3
|
||||||
|
ROMVerify equ 4
|
||||||
|
ROMFormat equ 5
|
76
v4.0/src/BIOS/MSEQU.INC
Normal file
76
v4.0/src/BIOS/MSEQU.INC
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
%OUT MSEQU.INC...
|
||||||
|
;==============================================================================
|
||||||
|
|
||||||
|
FTOOBIG EQU 80H
|
||||||
|
FBIG EQU 40H
|
||||||
|
ROMSTATUS EQU 1
|
||||||
|
ROMREAD EQU 2
|
||||||
|
ROMWRITE EQU 3
|
||||||
|
ROMVERIFY EQU 4
|
||||||
|
ROMFORMAT EQU 5
|
||||||
|
VID_SIZE EQU 12
|
||||||
|
|
||||||
|
INCLUDE MSBDS.INC ; VARIOUS EQUATES FOR BDS
|
||||||
|
|
||||||
|
;AN000; Extended BPB structure.
|
||||||
|
BPB_TYPE STRUC
|
||||||
|
SECSIZE DW ?
|
||||||
|
SECALL DB ?
|
||||||
|
RESNUM DW ?
|
||||||
|
FATNUM DB ?
|
||||||
|
DIRNUM DW ?
|
||||||
|
SECNUM DW ?
|
||||||
|
FATID DB ?
|
||||||
|
FATSIZE DW ?
|
||||||
|
SLIM DW ?
|
||||||
|
HLIM DW ?
|
||||||
|
HIDDEN_L DW ?
|
||||||
|
HIDDEN_H dw 0 ;J.K.
|
||||||
|
SECNUM_L dw 0 ;J.K.
|
||||||
|
SECNUM_H dw 0 ;J.K.
|
||||||
|
BPB_TYPE ENDS
|
||||||
|
|
||||||
|
;;;;;;;;;;;
|
||||||
|
BOOT_SERIAL_SIZE equ 4 ;J.K.
|
||||||
|
BOOT_VOLUME_LABEL_SIZE equ 11 ;J.K.
|
||||||
|
BOOT_SYSTEM_ID_SIZE equ 8 ;J.K.
|
||||||
|
EXT_BOOT_SIGNATURE equ 41 ;J.K.
|
||||||
|
RSINIT=0A3H ;RS232 INITIALIZATION
|
||||||
|
;9600 BAUD:NO PARITY:1 STOP:8 BIT WORD
|
||||||
|
LF=10 ;LINE FEED
|
||||||
|
CR=13 ;CARRIAGE RETURN
|
||||||
|
BACKSP=8 ;BACKSPACE
|
||||||
|
BRKADR=1BH * 4 ;006C 1BH BREAK VECTOR ADDRESS
|
||||||
|
TIMADR=1CH * 4 ;0070 1CH TIMER INTERRUPT
|
||||||
|
DSKADR=1EH * 4 ;ADDRESS OF PTR TO DISK PARAMETERS
|
||||||
|
SEC9=522H ;ADDRESS OF DISK PARAMETERS
|
||||||
|
HEADSETTLE=SEC9+9 ; ARR 2.20 ADDRESS OF HEAD SETTLE TIME
|
||||||
|
NORMSETTLE=15 ; ARR 2.20 NORMAL HEAD SETTLE
|
||||||
|
SPEEDSETTLE=0 ; ARR 2.20 SPEED UP SETTLE TIME
|
||||||
|
INITSPOT=534H ; ARR IBM WANTS 4 ZEROS HERE
|
||||||
|
AKPORT=20H
|
||||||
|
EOI=20H
|
||||||
|
CMDLEN = 0 ;LENGTH OF THIS COMMAND
|
||||||
|
UNIT = 1 ;SUB UNIT SPECIFIER
|
||||||
|
CMD = 2 ;COMMAND CODE
|
||||||
|
STATUS = 3 ;STATUS
|
||||||
|
MEDIA = 13 ;MEDIA DESCRIPTOR
|
||||||
|
TRANS = 14 ;TRANSFER ADDRESS
|
||||||
|
COUNT = 18 ;COUNT OF BLOCKS OR CHARACTERS
|
||||||
|
START = 20 ;FIRST BLOCK TO TRANSFER
|
||||||
|
EXTRA = 22 ;USUALLY A POINTER TO VOL ID FOR ERROR 15
|
||||||
|
CHROUT = 29H
|
||||||
|
MAXERR = 5
|
||||||
|
LSTDRV = 504H
|
||||||
|
|
||||||
|
BOOTBIAS = 200H
|
||||||
|
NOTBUSYSTATUS = 10000000B ; NOT BUSY
|
||||||
|
ACKSTATUS = 01000000B ; ACKNOWLEDGE (FOR WHAT?)
|
||||||
|
NOPAPERSTATUS = 00100000B ; NO MORE PAPER
|
||||||
|
SELECTEDSTATUS = 00010000B ; THE PRINTER SAID IT WAS SELECTED
|
||||||
|
IOERRSTATUS = 00001000B ; SOME KINDA ERROR
|
||||||
|
RESERVED = 00000110B ; NOPS
|
||||||
|
TIMEOUTSTATUS = 00000001B ; TIME OUT.
|
||||||
|
ERROR_UNKNOWN_MEDIA = 7 ; FOR USE IN BUILD BPB CALL
|
||||||
|
|
||||||
|
PATHGEN = 1
|
97
v4.0/src/BIOS/MSEXTRN.INC
Normal file
97
v4.0/src/BIOS/MSEXTRN.INC
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
; SCCSID = @(#)IBMEXTRN.ASM 1.11 85/11/18
|
||||||
|
;This is for IBMINIT module.
|
||||||
|
;=======================================================
|
||||||
|
;REVISION HISTORY:
|
||||||
|
;AN000; - NEW Version 4.00. J.K.
|
||||||
|
;AC000; - Modified Line 4.00. J.K.
|
||||||
|
;ANxxx; - PTMyyy
|
||||||
|
;==============================================================================
|
||||||
|
;AN001; D486 SHARE installation for large media 2/23/88 J.K.
|
||||||
|
;==============================================================================
|
||||||
|
|
||||||
|
EXTRN ORIG13:DWORD,ORIG19:DWORD
|
||||||
|
EXTRN COM2DEV:WORD,COM1DEV:WORD
|
||||||
|
EXTRN COM4DEV:WORD,COM3DEV:WORD
|
||||||
|
EXTRN LPT3DEV:WORD,LPT2DEV:WORD,LPT1DEV:WORD
|
||||||
|
EXTRN HARDDRV:BYTE,HARDNUM:BYTE,DRVMAX:BYTE,HDSKTAB:WORD
|
||||||
|
EXTRN DSKDRVS:WORD,HNUM:BYTE,EOT:BYTE,FHAVE96:BYTE
|
||||||
|
EXTRN REAL13:DWORD,DAYCNT:WORD,CONHEADER:WORD
|
||||||
|
EXTRN TWOHARD:BYTE,INT_2F_NEXT:DWORD
|
||||||
|
EXTRN BDSH:WORD,BDSX:WORD,START_BDS:DWORD
|
||||||
|
EXTRN FHAVEK09:BYTE, NEW_ROM:BYTE
|
||||||
|
EXTRN SINGLE:BYTE
|
||||||
|
EXTRN BDSMs:BYTE ;for Mini Disk -J.K. 4/7/86
|
||||||
|
EXTRN HaveCMOSClock:byte ;set by IBMINIT. Used by IBMCLOCK.ASM
|
||||||
|
EXTRN BinToBCD:word ;set by IBMINIT. Used by IBMCLOCK.ASM
|
||||||
|
EXTRN DaycntToDay:word ;set by IBMINIT. Used by IBMCLOCK.ASM
|
||||||
|
EXTRN OLD13:DWORD
|
||||||
|
extrn Temp_H:word ;J.K. For 32 bit calculation. IBMDISK
|
||||||
|
extrn Start_Sec_H:word ;J.K. IBMDISK.
|
||||||
|
extrn KEYRD_Func:byte ;J.K. For IBMCON. Defined in IBMBDATA.
|
||||||
|
extrn KEYSTS_Func:byte ;J.K. For IBMCON. Defined in IBMBDATA.
|
||||||
|
extrn DiskSector:byte ;J.K. IBMBDATA
|
||||||
|
extrn Bpb_In_Sector:word ;J.K. IBMBDATA
|
||||||
|
extrn SecPerCLusInSector:Byte ;J.K. IBMBDATA
|
||||||
|
extrn NumberOfFats:byte ;J.K. IBMBDATA
|
||||||
|
extrn MediaByte:byte ;J.K. IBMBDATA
|
||||||
|
extrn Ext_Boot_Sig:Byte ;J.K. IBMBDATA
|
||||||
|
extrn Boot_Serial_L:Word ;J.K. IBMBDATA
|
||||||
|
extrn Boot_Serial_H:Word ;J.K. IBMBDATA
|
||||||
|
extrn Boot_Volume_Label:Byte ;J.K. IBMBDATA
|
||||||
|
extrn Boot_System_ID:Byte ;J.K. IBMBDATA
|
||||||
|
extrn Fat_12_ID:Byte ;J.K. IBMDISK
|
||||||
|
extrn Fat_16_ID:Byte ;J.K. IBMDISK
|
||||||
|
extrn Vol_No_Name:Byte ;J.K. IBMDISK
|
||||||
|
extrn MotorStartup:Byte ;J.K. IBMBDATA
|
||||||
|
extrn DoubleWordMov:Byte ;J.K. IBMDISK
|
||||||
|
extrn Model_Byte:Byte ;J.K. IBMBIO2
|
||||||
|
extrn Secondary_Model_Byte:Byte ;J.K. IBMBIO2
|
||||||
|
|
||||||
|
IF iTEST
|
||||||
|
IFNDEF NUMBUF
|
||||||
|
EXTRN NUMBUF:BYTE,DIGITS:BYTE,FTESTBITS:WORD
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
EXTRN START$:NEAR,ERROUT:NEAR,BLOCK13:FAR,INT19:FAR
|
||||||
|
EXTRN INTRET:NEAR,HDRIVE:NEAR,DRIVEX:NEAR,INT13:FAR,CBREAK:NEAR,OUTCHR:NEAR
|
||||||
|
EXTRN DISKRD:NEAR,MEDIA_PATCH:NEAR,GETBP1_PATCH:NEAR
|
||||||
|
EXTRN SET_PATCH:NEAR,DISKIO_PATCH:NEAR,DSKERR:NEAR,INIT_PATCH:NEAR
|
||||||
|
EXTRN TABLE_PATCH:NEAR,EXIT:NEAR,CHANGED_PATCH:NEAR
|
||||||
|
EXTRN ERRIN:NEAR,GETBP:NEAR,SWPDSK:NEAR
|
||||||
|
EXTRN OUTCHR:NEAR,WRMSG:NEAR,TIME_TO_TICKS:NEAR
|
||||||
|
EXTRN INT2F_DISK:NEAR,INSTALL_BDS:NEAR,SETDRIVE:NEAR
|
||||||
|
extrn Mov_Media_IDs:Near ;J.K.
|
||||||
|
extrn Clear_IDs:Near ;J.K.
|
||||||
|
IF iTEST
|
||||||
|
IFNDEF NUMBUF
|
||||||
|
EXTRN MSGNUM:NEAR,MSGOUT:NEAR,dumpbytes:near,hex_to_ascii:near
|
||||||
|
EXTRN outchar:near
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
SYSINITSEG SEGMENT PUBLIC 'SYSTEM_INIT'
|
||||||
|
ASSUME CS:SYSINITSEG
|
||||||
|
EXTRN CURRENT_DOS_LOCATION:WORD
|
||||||
|
EXTRN FINAL_DOS_LOCATION:WORD
|
||||||
|
EXTRN DEVICE_LIST:DWORD
|
||||||
|
EXTRN MEMORY_SIZE:WORD
|
||||||
|
EXTRN DEFAULT_DRIVE:BYTE
|
||||||
|
EXTRN BUFFERS:WORD
|
||||||
|
EXTRN SYSINIT:FAR
|
||||||
|
extrn Big_Media_Flag:Byte ;AN001;
|
||||||
|
SYSINITSEG ENDS
|
||||||
|
|
||||||
|
ASSUME CS:CODE
|
||||||
|
|
||||||
|
; END OF DISK MODULES FOR CONFIGURATION
|
||||||
|
|
||||||
|
EXTRN END96TPI:BYTE
|
||||||
|
EXTRN ENDTWOHARD:BYTE
|
||||||
|
EXTRN ENDONEHARD:BYTE
|
||||||
|
EXTRN ENDSWAP:BYTE
|
||||||
|
EXTRN ENDFLOPPY:BYTE
|
||||||
|
|
||||||
|
; IBM FIXED UP AT ROM
|
||||||
|
|
||||||
|
EXTRN IBM_DISK_IO:FAR
|
46
v4.0/src/BIOS/MSGROUP.INC
Normal file
46
v4.0/src/BIOS/MSGROUP.INC
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
EVBOUND = 1 ;THIS VALUE BEING 0 DOES NO BOUNDARY ALLIGNMENT, VALUE 1 ;3.30
|
||||||
|
; ALIGNS TO EVEN ;3.30
|
||||||
|
; : : : : : : : : : : : : : : ;3.30
|
||||||
|
IF EVBOUND ;;IF EVEN (WORD) ALLIGNMENT IS REQUESTED, ;3.30
|
||||||
|
; : : : : : : : : : : : : : : ;3.30
|
||||||
|
EVENB MACRO ;3.30
|
||||||
|
EVEN ;;ADJUST TO EVEN BOUNDARY ;3.30
|
||||||
|
ENDM ;3.30
|
||||||
|
;3.30
|
||||||
|
ODD MACRO ;3.30
|
||||||
|
;;GENERATE BOUNDARY PADDING TO FORCE ODD OFFSET ;3.30
|
||||||
|
IF (($-CODE) MOD 2) EQ 0 ;3.30
|
||||||
|
DB ? ;3.30
|
||||||
|
ENDIF ;3.30
|
||||||
|
ENDM ;3.30
|
||||||
|
;3.30
|
||||||
|
CODE_SEGMENT MACRO ;3.30
|
||||||
|
;;ALLIGN THE SEGMENT ON WORD BOUNDARY TO ALLOW FOR EVEN ALLIGNMENT OF DATA;3.30
|
||||||
|
CODE SEGMENT WORD PUBLIC 'CODE' ;3.30 ;3.30
|
||||||
|
ENDM ;3.30
|
||||||
|
;3.30
|
||||||
|
; : : : : : : : : : : : : : : ;3.30
|
||||||
|
ELSE ;;SINCE EVEN ALLIGNMENT IS NOT DESIRED, JUST USE BYTE ALLI;3.30 GNMENT
|
||||||
|
; : : : : : : : : : : : : : : ;3.30
|
||||||
|
;3.30
|
||||||
|
EVENB MACRO ;3.30
|
||||||
|
;;REQUEST FOR WORD ALLIGNMENT DOES NOTHING ;3.30
|
||||||
|
ENDM ;3.30
|
||||||
|
;3.30
|
||||||
|
ODD MACRO ;3.30
|
||||||
|
;;REQUEST FOR ODD ALLIGNMENT DOES NOTHING ;3.30
|
||||||
|
ENDM ;3.30
|
||||||
|
;3.30
|
||||||
|
CODE_SEGMENT MACRO ;3.30
|
||||||
|
;;SEGMENT IS ALLIGNED ON BYTE BOUNDARY FOR MINIMUM SIZE OF GENERATION ;3.30
|
||||||
|
CODE SEGMENT BYTE PUBLIC 'CODE' ;3.30
|
||||||
|
ENDM ;3.30
|
||||||
|
;3.30
|
||||||
|
; : : : : : : : : : : : : : : ;3.30
|
||||||
|
ENDIF ;3.30
|
||||||
|
; : : : : : : : : : : : : : : ;3.30
|
||||||
|
;3.30
|
||||||
|
CODE_SEGMENT ;3.30
|
||||||
|
ASSUME CS:CODE ;3.30
|
||||||
|
;3.30
|
||||||
|
|
427
v4.0/src/BIOS/MSHARD.ASM
Normal file
427
v4.0/src/BIOS/MSHARD.ASM
Normal file
@ -0,0 +1,427 @@
|
|||||||
|
;***
|
||||||
|
; Title: Disk
|
||||||
|
; C: (C) Copyright 1988 by Microsoft corp.
|
||||||
|
; Date: 1/11/85
|
||||||
|
;
|
||||||
|
; There is a bug in some versions of IBM's AT ROM BIOS.
|
||||||
|
; Interrupts are not disabled during read operations.
|
||||||
|
;
|
||||||
|
; Use: This program should be chained in line with the disk
|
||||||
|
; interupt 13h, it intercepts read calls to the hard disk
|
||||||
|
; and handles them appropriately. For other functions it
|
||||||
|
; passes controll to OLD13, which should contain the
|
||||||
|
; address of the AT ROM disk routine. The entry point for
|
||||||
|
; this program is IBM_DISK_IO.
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
.286c ;Use 80286 non-protected mode
|
||||||
|
|
||||||
|
BIOSEG = 040h ;Segment for ROM BIOS Data
|
||||||
|
ROMSEG = 0F000h ;Segment of ROM
|
||||||
|
|
||||||
|
|
||||||
|
BAD_DISK = 01
|
||||||
|
|
||||||
|
HF_PORT = 01F0h
|
||||||
|
HF_REG_PORT = 03F6h
|
||||||
|
|
||||||
|
;* Offsets into Fixed disk parameter table
|
||||||
|
FDP_PRECOMP = 5
|
||||||
|
FDP_CONTROL = 8
|
||||||
|
|
||||||
|
DATA SEGMENT AT BIOSEG ;ROM BIOS data segment
|
||||||
|
|
||||||
|
ORG 42h
|
||||||
|
CMD_BLOCK DB 6 DUP (?)
|
||||||
|
|
||||||
|
;* Offsets into CMD_BLOCK for registers
|
||||||
|
PRE_COMP = 0 ;Write Pre-compensation
|
||||||
|
SEC_CNT = 1 ;Sector count
|
||||||
|
SEC_NUM = 2 ;Sector number
|
||||||
|
CYL_LOW = 3 ;Cylinder number, low part
|
||||||
|
CYL_HIGH = 4 ;Cylinder number, high part
|
||||||
|
DRV_HEAD = 5 ;Drive/Head (Bit 7 = ECC mode, Bit 5 = 512 byte sectors,
|
||||||
|
; Bit 4 = drive number, Bits 3-0 have head number)
|
||||||
|
CMD_REG = 6 ;Command register
|
||||||
|
|
||||||
|
|
||||||
|
ORG 074h
|
||||||
|
|
||||||
|
DISK_STATUS1 DB ?
|
||||||
|
HF_NUM DB ?
|
||||||
|
CONTROL_BYTE DB ?
|
||||||
|
|
||||||
|
DATA ENDS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;*** Define where the ROM routines are actually located
|
||||||
|
ROM SEGMENT AT ROMSEG
|
||||||
|
|
||||||
|
ORG 02E1Eh
|
||||||
|
ROMCOMMAND PROC FAR
|
||||||
|
ROMCOMMAND ENDP
|
||||||
|
|
||||||
|
ORG 02E7Fh
|
||||||
|
ROMWAIT PROC FAR
|
||||||
|
ROMWAIT ENDP
|
||||||
|
|
||||||
|
ORG 02EE2h
|
||||||
|
ROMWAIT_DRQ PROC FAR
|
||||||
|
ROMWAIT_DRQ ENDP
|
||||||
|
|
||||||
|
ORG 02EF8h
|
||||||
|
ROMCHECK_STATUS PROC FAR
|
||||||
|
ROMCHECK_STATUS ENDP
|
||||||
|
|
||||||
|
ORG 02F69h
|
||||||
|
ROMCHECK_DMA PROC FAR
|
||||||
|
ROMCHECK_DMA ENDP
|
||||||
|
|
||||||
|
ORG 02F8Eh
|
||||||
|
ROMGET_VEC PROC FAR
|
||||||
|
ROMGET_VEC ENDP
|
||||||
|
|
||||||
|
ORG 0FF65h
|
||||||
|
ROMFRET PROC FAR ;Far return at F000:FF65 in AT ROM.
|
||||||
|
ROMFRET ENDP
|
||||||
|
|
||||||
|
ROM ENDS
|
||||||
|
|
||||||
|
|
||||||
|
CODE SEGMENT BYTE PUBLIC 'code'
|
||||||
|
|
||||||
|
EXTRN OLD13:DWORD ;Link to AT bios int 13h
|
||||||
|
|
||||||
|
PUBLIC IBM_DISK_IO
|
||||||
|
|
||||||
|
|
||||||
|
ASSUME CS:CODE
|
||||||
|
ASSUME DS:DATA
|
||||||
|
|
||||||
|
|
||||||
|
;*** IBM_DISK_IO - main routine, fixes AT ROM bug
|
||||||
|
;
|
||||||
|
; ENTRY: (AH) = function, 02 or 0A for read.
|
||||||
|
; (DL) = drive number (80h or 81h).
|
||||||
|
; (DH) = head number.
|
||||||
|
; (CH) = cylinder number.
|
||||||
|
; (CL) = Sector number (high 2 bits has cylinder number).
|
||||||
|
; (AL) = number of sectors.
|
||||||
|
; (ES:BX) = address of read buffer.
|
||||||
|
; For more on register contents see ROM BIOS listing.
|
||||||
|
; Stack set up for return by an IRET.
|
||||||
|
;
|
||||||
|
; EXIT: (AH) = status of current operation.
|
||||||
|
; (CY) = 1 IF failed, 0 if successful.
|
||||||
|
; For other register contents see ROM BIOS listing.
|
||||||
|
;
|
||||||
|
; USES:
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; WARNING: Uses OLD13 vector for non-read calls.
|
||||||
|
; Does direct calls to the AT ROM.
|
||||||
|
; Does segment arithmatic.
|
||||||
|
;
|
||||||
|
; EFFECTS: Performs DISK I/O operation.
|
||||||
|
;
|
||||||
|
IBM_DISK_IO PROC FAR
|
||||||
|
CMP DL, 80h
|
||||||
|
JB ATD1 ;Pass through floppy disk calls.
|
||||||
|
CMP AH, 02
|
||||||
|
JE ATD2 ;Intercept call 02 (read sectors).
|
||||||
|
CMP AH, 0Ah
|
||||||
|
JE ATD2 ;and call 0Ah (read long).
|
||||||
|
ATD1:
|
||||||
|
JMP OLD13 ;Use ROM INT 13h handler.
|
||||||
|
ATD2:
|
||||||
|
PUSH BX
|
||||||
|
PUSH CX
|
||||||
|
PUSH DX
|
||||||
|
PUSH DI
|
||||||
|
PUSH DS
|
||||||
|
PUSH ES
|
||||||
|
PUSH AX
|
||||||
|
MOV AX,BIOSEG ;Establish BIOS segment addressing.
|
||||||
|
MOV DS,AX
|
||||||
|
MOV DISK_STATUS1, 0 ;Initially no error code.
|
||||||
|
AND DL, 07fh ;Mask to hard disk number
|
||||||
|
CMP DL, HF_NUM
|
||||||
|
JB ATD3 ;Disk number in range
|
||||||
|
MOV DISK_STATUS1, BAD_DISK
|
||||||
|
JMP SHORT ATD4 ;Disk number out of range error, return
|
||||||
|
|
||||||
|
ATD3:
|
||||||
|
PUSH BX
|
||||||
|
MOV AX, ES ;Make ES:BX to Seg:000x form.
|
||||||
|
SHR BX, 4
|
||||||
|
ADD AX, BX
|
||||||
|
MOV ES, AX
|
||||||
|
POP BX
|
||||||
|
AND BX,000Fh
|
||||||
|
PUSH CS
|
||||||
|
CALL CHECK_DMA
|
||||||
|
JC ATD4 ;Abort if DMA across segment boundary
|
||||||
|
|
||||||
|
POP AX ;Restore AX register for SETCMD
|
||||||
|
PUSH AX
|
||||||
|
CALL SETCMD ;Set up command block for disk op
|
||||||
|
MOV DX, HF_REG_PORT
|
||||||
|
OUT DX, AL ;Write out command modifier
|
||||||
|
CALL DOCMD ;Carry out command
|
||||||
|
ATD4:
|
||||||
|
;; Old code - Carry cleared after set by logical or opearation
|
||||||
|
;; POP AX
|
||||||
|
;; MOV AH,DISK_STATUS1 ;On return AH has error code
|
||||||
|
;; STC
|
||||||
|
;; OR AH,AH
|
||||||
|
;; JNZ ATD5 ;Carry set if error
|
||||||
|
;; CLC
|
||||||
|
;;---------------------------------------------------
|
||||||
|
;; New Code - Let Logical or clear carry and then set carry if ah!=0
|
||||||
|
;; And save a couple bytes while were at it.
|
||||||
|
POP AX
|
||||||
|
MOV AH,DISK_STATUS1 ;On return AH has error code
|
||||||
|
OR AH,AH
|
||||||
|
JZ ATD5 ;Carry set if error
|
||||||
|
STC
|
||||||
|
|
||||||
|
ATD5:
|
||||||
|
POP ES
|
||||||
|
POP DS
|
||||||
|
POP DI
|
||||||
|
POP DX
|
||||||
|
POP CX
|
||||||
|
POP BX
|
||||||
|
RET 2 ;Far return, dropping flags
|
||||||
|
IBM_DISK_IO ENDP
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;*** SETCMD - Set up CMD_BLOCK for the disk operation
|
||||||
|
;
|
||||||
|
; ENTRY: (DS) = BIOS Data segment.
|
||||||
|
; (ES:BX) in seg:000x form.
|
||||||
|
; Other registers as in INT 13h call
|
||||||
|
;
|
||||||
|
; EXIT: CMD_BLOCK set up for disk read call.
|
||||||
|
; CONTROL_BYTE set up for disk operation.
|
||||||
|
; (AL) = Control byte modifier
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Sets the fields of CMD_BLOCK using the register contents
|
||||||
|
; and the contents of the disk parameter block for the given drive.
|
||||||
|
;
|
||||||
|
; WARNING: (AX) destroyed.
|
||||||
|
; Does direct calls to the AT ROM.
|
||||||
|
;
|
||||||
|
SETCMD PROC NEAR
|
||||||
|
MOV CMD_BLOCK[SEC_CNT], AL
|
||||||
|
MOV CMD_BLOCK[CMD_REG], 020h ;Assume function 02
|
||||||
|
CMP AH, 2
|
||||||
|
JE SETC1 ;CMD_REG = 20h if function 02 (read)
|
||||||
|
MOV CMD_BLOCK[CMD_REG], 022h ;CMD_REG = 22h if function 0A (" long)
|
||||||
|
SETC1: ;No longer need value in AX
|
||||||
|
MOV AL, CL
|
||||||
|
AND AL, 03fh ;Mask to sector number
|
||||||
|
MOV CMD_BLOCK[SEC_NUM], AL
|
||||||
|
MOV CMD_BLOCK[CYL_LOW], CH
|
||||||
|
MOV AL, CL
|
||||||
|
SHR AL, 6 ;Get two high bits of cylender number
|
||||||
|
MOV CMD_BLOCK[CYL_HIGH], AL
|
||||||
|
MOV AX, DX
|
||||||
|
SHL AL, 4 ;Drive number
|
||||||
|
AND AH, 0Fh
|
||||||
|
OR AL, AH ;Head number
|
||||||
|
OR AL, 0A0h ;Set ECC and 512 bytes per sector
|
||||||
|
MOV CMD_BLOCK[DRV_HEAD], AL
|
||||||
|
PUSH ES ;GET_VEC destroys ES:BX
|
||||||
|
PUSH BX
|
||||||
|
PUSH CS
|
||||||
|
CALL GET_VEC
|
||||||
|
MOV AX, ES:FDP_PRECOMP[BX] ;Write pre-comp from disk parameters
|
||||||
|
SHR AX, 2
|
||||||
|
MOV CMD_BLOCK[PRE_COMP],AL ;Only use low part
|
||||||
|
MOV AL, ES:FDP_CONTROL[BX] ;Control byte modifier
|
||||||
|
POP BX
|
||||||
|
POP ES
|
||||||
|
MOV AH, CONTROL_BYTE
|
||||||
|
AND AH, 0C0h ;Keep disable retry bits
|
||||||
|
OR AH, AL
|
||||||
|
MOV CONTROL_BYTE, AH
|
||||||
|
RET
|
||||||
|
SETCMD ENDP
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;*** DOCMD - Carry out READ operation to AT hard disk
|
||||||
|
;
|
||||||
|
; ENTRY: (ES:BX) = address for read in data.
|
||||||
|
; CMD_BLOCK set up for disk read.
|
||||||
|
;
|
||||||
|
; EXIT: Buffer at (ES:BX) contains data read.
|
||||||
|
; DISK_STATUS1 set to error code (0 if success).
|
||||||
|
;
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; WARNING: (AX), (BL), (CX), (DX), (DI) destroyed.
|
||||||
|
; No check is made for DMA boundary overrun.
|
||||||
|
;
|
||||||
|
; EFFECTS: Programs disk controller.
|
||||||
|
; Performs disk input.
|
||||||
|
;
|
||||||
|
DOCMD PROC NEAR
|
||||||
|
MOV DI, BX ;(ES:DI) = data buffer addr.
|
||||||
|
PUSH CS
|
||||||
|
CALL COMMAND
|
||||||
|
JNZ DOC3
|
||||||
|
DOC1:
|
||||||
|
PUSH CS
|
||||||
|
CALL WAITT ;Wait for controller to complete read
|
||||||
|
JNZ DOC3
|
||||||
|
MOV CX, 100h ;256 words per sector
|
||||||
|
MOV DX, HF_PORT
|
||||||
|
CLD ;String op goes up
|
||||||
|
CLI ;Disable interrupts (BUG WAS FORGETTING THIS)
|
||||||
|
REPZ INSW ;Read in sector
|
||||||
|
STI
|
||||||
|
TEST CMD_BLOCK[CMD_REG], 02
|
||||||
|
JZ DOC2 ;No ECC bytes to read.
|
||||||
|
PUSH CS
|
||||||
|
CALL WAIT_DRQ
|
||||||
|
JC DOC3
|
||||||
|
MOV CX, 4 ;4 bytes of ECC
|
||||||
|
MOV DX, HF_PORT
|
||||||
|
CLI
|
||||||
|
REPZ INSB ;Read in ECC
|
||||||
|
STI
|
||||||
|
DOC2:
|
||||||
|
PUSH CS
|
||||||
|
CALL CHECK_STATUS
|
||||||
|
JNZ DOC3 ;Operation failed
|
||||||
|
DEC CMD_BLOCK[SEC_CNT]
|
||||||
|
JNZ DOC1 ;Loop while more sectors to read
|
||||||
|
DOC3:
|
||||||
|
RET
|
||||||
|
DOCMD ENDP
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;*** GET_VEC - Get pointer to hard disk parameters.
|
||||||
|
;
|
||||||
|
; ENTRY: (DL) = Low bit has hard disk number (0 or 1).
|
||||||
|
;
|
||||||
|
; EXIT: (ES:BX) = address of disk parameters table.
|
||||||
|
;
|
||||||
|
; USES: AX for segment computation.
|
||||||
|
;
|
||||||
|
; Loads ES:BX from interrupt table in low memory, vector 46h (disk 0)
|
||||||
|
; or 70h (disk 1).
|
||||||
|
;
|
||||||
|
; WARNING: (AX) destroyed.
|
||||||
|
; This does a direct call to the AT ROM.
|
||||||
|
;
|
||||||
|
GET_VEC PROC NEAR
|
||||||
|
PUSH OFFSET ROMFRET
|
||||||
|
JMP ROMGET_VEC
|
||||||
|
GET_VEC ENDP
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;*** COMMAND - Send contents of CMD_BLOCK to disk controller.
|
||||||
|
;
|
||||||
|
; ENTRY: Control_byte
|
||||||
|
; CMD_BLOCK - set up with values for hard disk controller.
|
||||||
|
;
|
||||||
|
; EXIT: DISK_STATUS1 = Error code.
|
||||||
|
; NZ if error, ZR for no error.
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; WARNING: (AX), (CX), (DX) destroyed.
|
||||||
|
; Does a direct call to the AT ROM.
|
||||||
|
;
|
||||||
|
; EFFECTS: Programs disk controller.
|
||||||
|
;
|
||||||
|
COMMAND PROC NEAR
|
||||||
|
PUSH OFFSET ROMFRET
|
||||||
|
JMP ROMCOMMAND
|
||||||
|
COMMAND ENDP
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;*** WAITT - Wait for disk interrupt
|
||||||
|
;
|
||||||
|
; ENTRY: Nothing.
|
||||||
|
;
|
||||||
|
; EXIT: DISK_STATUS1 = Error code.
|
||||||
|
; NZ if error, ZR if no error.
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; WARNING: (AX), (BL), (CX) destroyed.
|
||||||
|
; Does a direct call to the AT ROM.
|
||||||
|
;
|
||||||
|
; EFFECTS: Calls int 15h, function 9000h.
|
||||||
|
;
|
||||||
|
WAITT PROC NEAR
|
||||||
|
PUSH OFFSET ROMFRET
|
||||||
|
JMP ROMWAIT
|
||||||
|
WAITT ENDP
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;*** WAIT_DRQ - Wait for data request.
|
||||||
|
;
|
||||||
|
; ENTRY: Nothing.
|
||||||
|
;
|
||||||
|
; EXIT: DISK_STATUS1 = Error code.
|
||||||
|
; CY if error, NC if no error.
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; WARNING: (AL), (CX), (DX) destroyed.
|
||||||
|
; Does a direct call to the AT ROM.
|
||||||
|
;
|
||||||
|
WAIT_DRQ PROC NEAR
|
||||||
|
PUSH OFFSET ROMFRET
|
||||||
|
JMP ROMWAIT_DRQ
|
||||||
|
WAIT_DRQ ENDP
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;*** CHECK_STATUS - Check hard disk status.
|
||||||
|
;
|
||||||
|
; ENTRY: Nothing.
|
||||||
|
;
|
||||||
|
; EXIT: DISK_STATUS1 = Error code.
|
||||||
|
; NZ if error, ZR if no error.
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; WARNING: (AX), (CX), (DX) destroyed.
|
||||||
|
; Does a direct call to the AT ROM.
|
||||||
|
;
|
||||||
|
CHECK_STATUS PROC NEAR
|
||||||
|
PUSH OFFSET ROMFRET
|
||||||
|
JMP ROMCHECK_STATUS
|
||||||
|
CHECK_STATUS ENDP
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;*** CHECK_DMA - check for DMA overrun 64k segment.
|
||||||
|
;
|
||||||
|
; ENTRY: (ES:BX) = addr. of memory buffer in seg:000x form.
|
||||||
|
; CMD_BLOCK set up for operation.
|
||||||
|
;
|
||||||
|
; EXIT: DISK_STATUS1 - Error code.
|
||||||
|
; CY if error, NC if no error.
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; WARNING: Does a direct call to the AT ROM.
|
||||||
|
;
|
||||||
|
CHECK_DMA PROC NEAR
|
||||||
|
PUSH OFFSET ROMFRET
|
||||||
|
JMP ROMCHECK_DMA
|
||||||
|
CHECK_DMA ENDP
|
||||||
|
|
||||||
|
|
||||||
|
CODE ENDS
|
||||||
|
END
|
2819
v4.0/src/BIOS/MSINIT.ASM
Normal file
2819
v4.0/src/BIOS/MSINIT.ASM
Normal file
File diff suppressed because it is too large
Load Diff
1362
v4.0/src/BIOS/MSIOCTL.INC
Normal file
1362
v4.0/src/BIOS/MSIOCTL.INC
Normal file
File diff suppressed because it is too large
Load Diff
1090
v4.0/src/BIOS/MSLOAD.ASM
Normal file
1090
v4.0/src/BIOS/MSLOAD.ASM
Normal file
File diff suppressed because it is too large
Load Diff
7
v4.0/src/BIOS/MSLOAD.INC
Normal file
7
v4.0/src/BIOS/MSLOAD.INC
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
;MSLOAD.INC
|
||||||
|
End_Of_File equ 0FFh
|
||||||
|
FAT12_Bit equ 01h
|
||||||
|
FAT16_Bit equ 04h
|
||||||
|
ROM_TELETYPE equ 14 ;INT 10h, Teletype function
|
||||||
|
|
||||||
|
NUM_DIR_PER_SECTOR equ 16 ; number of directory entries per sector
|
270
v4.0/src/BIOS/MSLPT.ASM
Normal file
270
v4.0/src/BIOS/MSLPT.ASM
Normal file
@ -0,0 +1,270 @@
|
|||||||
|
PAGE ,132 ;
|
||||||
|
TITLE MSLPT - BIOS
|
||||||
|
%OUT ...MSLPT.ASM
|
||||||
|
|
||||||
|
;==============================================================================
|
||||||
|
;REVISION HISTORY:
|
||||||
|
;AN000 - New for DOS Version 4.00 - J.K.
|
||||||
|
;AC000 - Changed for DOS Version 4.00 - J.K.
|
||||||
|
;AN00x - PTM number for DOS Version 4.00 - J.K.
|
||||||
|
;==============================================================================
|
||||||
|
;AN001 - P156 KBMLPT device driver's retry logic. 8/18/87 J.K.
|
||||||
|
;==============================================================================
|
||||||
|
itest=0
|
||||||
|
INCLUDE MSGROUP.INC ;DEFINE CODE SEGMENT
|
||||||
|
INCLUDE MSEQU.INC
|
||||||
|
INCLUDE MSMACRO.INC
|
||||||
|
INCLUDE DEVSYM.INC
|
||||||
|
INCLUDE IOCTL.INC
|
||||||
|
|
||||||
|
EXTRN BUS$EXIT:NEAR ;MSBIO1
|
||||||
|
EXTRN ERR$CNT:NEAR ;MSBIO1
|
||||||
|
EXTRN CMDERR:NEAR ;MSBIO1
|
||||||
|
EXTRN GETDX:NEAR ;MSBIO1
|
||||||
|
EXTRN EXIT:NEAR ;MSBIO1
|
||||||
|
EXTRN ERR$EXIT:NEAR ;MSBIO1
|
||||||
|
;DATA
|
||||||
|
EXTRN PTRSAV:DWORD ;MSBIO1
|
||||||
|
EXTRN TIMDEV:WORD ;MSCLOCK
|
||||||
|
EXTRN LPT2DEV:WORD ;MSBIO2
|
||||||
|
EXTRN WAIT_COUNT:WORD ;MSDATA
|
||||||
|
EXTRN PRINTDEV:BYTE ;MSDATA
|
||||||
|
; IBM ROM STATUS BITS (I DON'T TRUST THEM, NEITHER SHOULD YOU)
|
||||||
|
|
||||||
|
NOTBUSYSTATUS = 10000000B ; NOT BUSY
|
||||||
|
ACKSTATUS = 01000000B ; ACKNOWLEDGE (FOR WHAT?)
|
||||||
|
NOPAPERSTATUS = 00100000B ; NO MORE PAPER
|
||||||
|
SELECTEDSTATUS = 00010000B ; THE PRINTER SAID IT WAS SELECTED
|
||||||
|
IOERRSTATUS = 00001000B ; SOME KINDA ERROR
|
||||||
|
RESERVED = 00000110B ; NOPS
|
||||||
|
TIMEOUTSTATUS = 00000001B ; TIME OUT.
|
||||||
|
|
||||||
|
|
||||||
|
; WARNING!!! THE IBM ROM DOES NOT RETURN JUST ONE BIT. IT RETURNS A
|
||||||
|
; WHOLE SLEW OF BITS, ONLY ONE OF WHICH IS CORRECT.
|
||||||
|
|
||||||
|
;----------------------------------------------------------
|
||||||
|
;J.K. AN001; PRN$WRIT will retry only if error code is TIMEOUT.
|
||||||
|
|
||||||
|
; WRITE TO PRINTER DEVICE
|
||||||
|
|
||||||
|
; CX HAS COUNT OF BYTES
|
||||||
|
; ES:DI POINT TO DESTINATION
|
||||||
|
; AUXNUM HAS PRINTER NUMBER
|
||||||
|
|
||||||
|
PUBLIC PRN$WRIT
|
||||||
|
PRN$WRIT PROC NEAR
|
||||||
|
ASSUME DS:CODE ; SET BY PRINTER DEVICE DRIVER ENTRY
|
||||||
|
|
||||||
|
jcxz Prn$Done ;No char to output
|
||||||
|
Prn$Loop:
|
||||||
|
mov bx, 2 ;Initialize retry count
|
||||||
|
Prn$Out:
|
||||||
|
;SB34LPT000****************************************************************
|
||||||
|
;SB Print the character at ES:[DI]
|
||||||
|
;SB Call the function PrnOP to do this
|
||||||
|
;SB The character to be printed goes in AL and the function code
|
||||||
|
;SB for 'Output character' goes in AH
|
||||||
|
;SB Check for error in printing.
|
||||||
|
;SB If there is no error go to print the next character.
|
||||||
|
;SB If there is an error indicated see if it is due to TIMEOUT. If the
|
||||||
|
;SB error is not TIMEOUT then we can do nothing about it. Just go to
|
||||||
|
;SB print the next character. If it is due to timeout we can execute
|
||||||
|
;SB the code to retry the print which follows this piece of code
|
||||||
|
;SB LOCS: 6
|
||||||
|
|
||||||
|
mov al,es:[di] ; assume AX disposible since enter
|
||||||
|
xor ah,ah ; via int 21h
|
||||||
|
call PrnOp ; print to printer
|
||||||
|
jz Prn$Con ; no error - continue
|
||||||
|
test ah,TIMEOUTSTATUS
|
||||||
|
jz Prn$Con ; NOT time out - continue
|
||||||
|
|
||||||
|
;SB34LPT000****************************************************************
|
||||||
|
dec bx ;Retry until count is exhausted.
|
||||||
|
jnz Prn$Out ;Retry it.
|
||||||
|
jmp short Pmessg ;Return with error.
|
||||||
|
;
|
||||||
|
; next character
|
||||||
|
;
|
||||||
|
Prn$Con:
|
||||||
|
inc di ;point to next char and continue
|
||||||
|
loop Prn$Loop
|
||||||
|
Prn$Done:
|
||||||
|
jmp Exit
|
||||||
|
Pmessg:
|
||||||
|
jmp Err$Cnt
|
||||||
|
PRN$WRIT endp
|
||||||
|
|
||||||
|
; JCXZ EXVEC3 ; NO CHARS TO OUTPUT..
|
||||||
|
;PRN$LOOP:
|
||||||
|
; MOV BX,2 ; INITIALIZE RETRY FLAG
|
||||||
|
;PRN$OUT:
|
||||||
|
; MOV AL,ES:[DI] ; GET CHAR INTO AL
|
||||||
|
; INC DI ; POINT TO NEXT CHAR
|
||||||
|
; XOR AH,AH ; AH=0 => OUTPUT CHAR IN DL
|
||||||
|
; CALL PRNOP ; TO INDICATE PRINT CHAR IN AL
|
||||||
|
; JNZ PRRETRY
|
||||||
|
; LOOP PRN$LOOP
|
||||||
|
;EXVEC3:
|
||||||
|
; JMP EXIT
|
||||||
|
;PRRETRY:
|
||||||
|
; DEC DI ; UNDO THE INC ABOVE...
|
||||||
|
; DEC BX
|
||||||
|
; JNZ PRN$OUT
|
||||||
|
;PMESSG:
|
||||||
|
; JMP ERR$CNT ;RETURN WITH THE ERROR
|
||||||
|
;PRN$WRIT ENDP
|
||||||
|
|
||||||
|
;--------------------------------------------------------
|
||||||
|
|
||||||
|
; PRINTER STATUS ROUTINE
|
||||||
|
|
||||||
|
PUBLIC PRN$STAT
|
||||||
|
PRN$STAT PROC NEAR
|
||||||
|
ASSUME DS:CODE ; SET BY PRINTER DEVICE DRIVER ENTRY
|
||||||
|
|
||||||
|
CALL PRNSTAT ;DEVICE IN DX
|
||||||
|
JNZ PMESSG ; OTHER ERRORS WERE FOUND
|
||||||
|
;J.K. The next three lines are commented out, since it is a dead code.
|
||||||
|
; MOV AL,9 ; AGAIN, ASSUME OUT OF PAPER...
|
||||||
|
; TEST AH,NOPAPERSTATUS
|
||||||
|
; JNZ PMESSG
|
||||||
|
TEST AH,NOTBUSYSTATUS
|
||||||
|
jnz Prn$Done ;No error. Exit
|
||||||
|
JMP BUS$EXIT
|
||||||
|
PRN$STAT ENDP
|
||||||
|
|
||||||
|
; TAKE THE APPROPRIATE PRINTER AND DO THE OPERATION. TRIAGE THE STATUS
|
||||||
|
; RETURNED IN AH INTO SOME MEANINGFUL ERROR.
|
||||||
|
|
||||||
|
PRNSTAT PROC NEAR
|
||||||
|
;SB33037**********************************************************************
|
||||||
|
mov AH, 2 ; set command for get status ;SB ;3.30*
|
||||||
|
PRNOP: ;SB ;3.30*
|
||||||
|
call GETDX ; determine which printer ;SB ;3.30*
|
||||||
|
int 17h ; call ROM-BIOS printer routine ;SB;3.30*
|
||||||
|
|
||||||
|
;SB33037**********************************************************************
|
||||||
|
|
||||||
|
; EXAMINE THE STATUS BITS TO SEE IF AN ERROR OCCURRED. UNFORTUNATELY, SEVERAL
|
||||||
|
; OF THE BITS ARE SET SO WE HAVE TO PICK AND CHOOSE. WE MUST BE EXTREMELY
|
||||||
|
; CAREFUL ABOUT BREAKING BASIC.
|
||||||
|
|
||||||
|
TEST AH,IOERRSTATUS ; I/O ERROR?
|
||||||
|
JZ CHECKNOTREADY ; NO, TRY NOT READY
|
||||||
|
|
||||||
|
; AT THIS POINT, WE KNOW WE HAVE AN ERROR. THE CONVERSE IS NOT TRUE.
|
||||||
|
|
||||||
|
MOV AL,9 ; FIRST, ASSUME OUT OF PAPER
|
||||||
|
TEST AH,NOPAPERSTATUS ; OUT OF PAPER SET?
|
||||||
|
JNZ RET1 ; YES, ERROR IS SET
|
||||||
|
INC AL ; INDICATE I/O ERROR
|
||||||
|
RET1:
|
||||||
|
|
||||||
|
; WE HAVE TRIAGED NOW FOR OUT OF PAPER AND IO ERR (IGNORING TIME-OUT)
|
||||||
|
|
||||||
|
RET ; RETURN WITH ERROR
|
||||||
|
|
||||||
|
; THE BITS SAID NO ERROR. UNFORTUNATELY, THERE MAY BE OTHER THINGS AT WORK
|
||||||
|
; HERE.
|
||||||
|
|
||||||
|
CHECKNOTREADY:
|
||||||
|
MOV AL,2 ; ASSUME NOT-READY
|
||||||
|
TEST AH,TIMEOUTSTATUS ; IS TIME-OUT SET?
|
||||||
|
; IF NZ THEN ERROR, ELSE OK???
|
||||||
|
PRNOP2:
|
||||||
|
RET
|
||||||
|
PRNSTAT ENDP
|
||||||
|
|
||||||
|
; OUTPUT UNTIL BUSY. THIS ENTRY POINT IS USED EXCLUSIVELY BY THE PRINT
|
||||||
|
; SPOOLERS. UNDER NO CURCUMSTANCES SHOULD THE DEVICE DRIVER BLOCK WAITING FOR
|
||||||
|
; THE DEVICE TO BECOME READY.
|
||||||
|
|
||||||
|
; INPUTS: CX HAS COUNT OF BYTES TO OUTPUT.
|
||||||
|
; ES:DI POINTS TO SOURCE BUFFER
|
||||||
|
; OUTPUTS: SET THE NUMBER OF BYTES TRANSFERRED APPROPRIATELY
|
||||||
|
PUBLIC PRN$TILBUSY
|
||||||
|
PRN$TILBUSY PROC NEAR
|
||||||
|
ASSUME DS:CODE ; SET BY PRINTER DEVICE DRIVER ENTRY
|
||||||
|
|
||||||
|
PUSH DS
|
||||||
|
PUSH ES
|
||||||
|
POP DS ; NOW ES AND DS BOTH POINT TO SOURCE BUFFER
|
||||||
|
ASSUME DS:NOTHING
|
||||||
|
|
||||||
|
MOV SI,DI ; EVERYTHING IS SET FOR LODSB
|
||||||
|
PRN$TILBLOOP:
|
||||||
|
PUSH CX
|
||||||
|
PUSH BX
|
||||||
|
XOR BX,BX
|
||||||
|
MOV BL,CS:[PRINTDEV]
|
||||||
|
SHL BX,1
|
||||||
|
MOV CX,CS:WAIT_COUNT[BX] ; WAIT COUNT TIMES TO COME READY
|
||||||
|
POP BX
|
||||||
|
PRN$GETSTAT:
|
||||||
|
CALL PRNSTAT ; GET STATUS
|
||||||
|
JNZ PRN$BPERR ; ERROR
|
||||||
|
TEST AH,10000000B ; READY YET?
|
||||||
|
LOOPZ PRN$GETSTAT ; NO, GO FOR MORE
|
||||||
|
POP CX ; GET ORIGINAL COUNT
|
||||||
|
JZ PRN$BERR ; STILL NOT READY => DONE
|
||||||
|
LODSB
|
||||||
|
XOR AH,AH
|
||||||
|
CALL PRNOP
|
||||||
|
JNZ PRN$BERR ; ERROR
|
||||||
|
LOOP PRN$TILBLOOP ; GO FOR MORE
|
||||||
|
PRN$B:
|
||||||
|
POP DS
|
||||||
|
LDS BX,CS:[PTRSAV]
|
||||||
|
ASSUME DS:NOTHING
|
||||||
|
SUB WORD PTR [BX].COUNT,CX ;# OF SUCCESSFUL I/O'S
|
||||||
|
JMP EXIT
|
||||||
|
PRN$TILBUSY ENDP
|
||||||
|
|
||||||
|
PRN$BPERR PROC NEAR
|
||||||
|
ASSUME DS:CODE
|
||||||
|
POP CX
|
||||||
|
PRN$BERR:
|
||||||
|
POP DS
|
||||||
|
LDS BX,CS:[PTRSAV]
|
||||||
|
ASSUME DS:NOTHING
|
||||||
|
|
||||||
|
SUB WORD PTR [BX].COUNT,CX ;# OF SUCCESSFUL I/O'S
|
||||||
|
JMP ERR$EXIT
|
||||||
|
PRN$BPERR ENDP
|
||||||
|
;
|
||||||
|
; MANIPULATES THE VALUE IN WAIT_COUNT DEPENDING ON THE VALUE PASSED IN THE
|
||||||
|
; GENERIC IOCTL PACKET.
|
||||||
|
; IT EITHER SETS OR RETURNS THE CURRENT VALUE FOR THE RETRY COUNT FOR THE
|
||||||
|
; DEVICE.
|
||||||
|
;
|
||||||
|
PUBLIC PRN$GENIOCTL
|
||||||
|
PRN$GENIOCTL PROC NEAR
|
||||||
|
ASSUME DS:CODE ; SET BY PRINTER DEVICE DRIVER ENTRY
|
||||||
|
|
||||||
|
LES DI,[PTRSAV]
|
||||||
|
CMP ES:[DI].MAJORFUNCTION,IOC_PC
|
||||||
|
JE PRNFUNC_OK
|
||||||
|
PRNFUNCERR:
|
||||||
|
JMP CMDERR
|
||||||
|
|
||||||
|
PRNFUNC_OK:
|
||||||
|
MOV AL,ES:[DI].MINORFUNCTION
|
||||||
|
LES DI,ES:[DI].GENERICIOCTL_PACKET
|
||||||
|
XOR BX,BX
|
||||||
|
MOV BL,[PRINTDEV] ; GET INDEX INTO RETRY COUNTS
|
||||||
|
SHL BX,1
|
||||||
|
MOV CX,WAIT_COUNT[BX] ; PULL OUT RETRY COUNT FOR DEVICE
|
||||||
|
CMP AL,GET_RETRY_COUNT
|
||||||
|
JZ PRNGETCOUNT
|
||||||
|
CMP AL,SET_RETRY_COUNT
|
||||||
|
JNZ PRNFUNCERR
|
||||||
|
MOV CX,ES:[DI].RC_COUNT
|
||||||
|
PRNGETCOUNT:
|
||||||
|
MOV WAIT_COUNT[BX],CX ; PLACE "NEW" RETRY COUNT
|
||||||
|
MOV ES:[DI].RC_COUNT,CX ; RETURN CURRENT RETRY COUNT
|
||||||
|
JMP EXIT
|
||||||
|
PRN$GENIOCTL ENDP
|
||||||
|
CODE ENDS
|
||||||
|
END
|
192
v4.0/src/BIOS/MSMACRO.INC
Normal file
192
v4.0/src/BIOS/MSMACRO.INC
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
;
|
||||||
|
; This file contains three macros used in debugging the system. If the
|
||||||
|
; variable "itest" (in msbio.asm) is nonzero code is included in the
|
||||||
|
; modules to print debugging messages. The level of debugging is controlled
|
||||||
|
; by the value of the variable fTestBits in msbio.asm. Specific bits in
|
||||||
|
; the variable determine which messages to print. The equ's below tell
|
||||||
|
; which bits control which funcitons. For example the fifth bit
|
||||||
|
; cooresponds to disk activity (see fTestDisk equ below).
|
||||||
|
;
|
||||||
|
; The macros in the file are:
|
||||||
|
;
|
||||||
|
; message Prints an ascii string on the screen.
|
||||||
|
; Example usage:
|
||||||
|
;
|
||||||
|
; message fTestDisk, <"Start Disk Write", CR, LF>
|
||||||
|
; message fTestINIT, <"Begin BDS initialization">
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; MNUM Print the value in a register or memory location on
|
||||||
|
; the screen. Value is displayed in hex.
|
||||||
|
; Usage:
|
||||||
|
; MNUM bitpattern, valueLocation
|
||||||
|
;
|
||||||
|
; valueLocation is typically a regester:
|
||||||
|
;
|
||||||
|
; mnum fTestCom, AX
|
||||||
|
; mnum fTestDisk, DX
|
||||||
|
;
|
||||||
|
; ValueLocation can also be a memory location:
|
||||||
|
;
|
||||||
|
; mnum fTestINIT, Final_Dos_Location
|
||||||
|
;
|
||||||
|
; If no valueLocation is given the macro defaults to
|
||||||
|
; the BX register.
|
||||||
|
;
|
||||||
|
; ZWAIT Stops the program until any key is pressed.
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; The three macros preserve all register values. If "test" is zero
|
||||||
|
; defined during assembly then the marco produce no code.
|
||||||
|
;
|
||||||
|
|
||||||
|
IF iTEST ;3.30
|
||||||
|
IFNDEF MSGOUT ;3.30
|
||||||
|
EXTRN MSGOUT:NEAR,MSGNUM:NEAR ;3.30
|
||||||
|
ENDIF ;3.30
|
||||||
|
IFNDEF NUMBUF ;3.30
|
||||||
|
EXTRN NUMBUF:BYTE,DIGITS:BYTE,FTESTBITS:WORD ;3.30
|
||||||
|
ENDIF ;3.30
|
||||||
|
IFNDEF DUMPBYTES ;3.30
|
||||||
|
EXTRN DUMPBYTES:NEAR,OUTCHAR:NEAR,HEX_TO_ASCII:NEAR ;3.30
|
||||||
|
ENDIF ;3.30
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
fTestALL equ 1111111111111111b ; watch everything
|
||||||
|
fTestHARD equ 0000000000000001b ; watch hard disk initialization
|
||||||
|
fTest96 equ 0000000000000010b ; watch 96 tpi activity
|
||||||
|
FTEST13 EQU 0000000000000100B ; WATCH INT 13 ACTIVITY ;3.30
|
||||||
|
FTESTCOM EQU 0000000000001000B ; WATCH PACKET ACTIVITY ;3.30
|
||||||
|
FTESTINIT EQU 0000000000010000B ; WATCH INITIALIZATION MESSAGES ;3.30
|
||||||
|
FTESTDISK EQU 0000000000100000B ; WATCH DISK DEVICE DRIVER CALLS ;3.30
|
||||||
|
FTESTCON EQU 0000000001000000B ; WATCH SYSTEM WAIT ACTIVITY IN CO;3.30 NSOLE
|
||||||
|
FtestClock equ 0000000010000000b ; wathc clock device 5/2/86 ;3.30
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; message macro -- see above for description
|
||||||
|
;
|
||||||
|
|
||||||
|
MESSAGE MACRO Bits,msg
|
||||||
|
LOCAL A,B ;3.30
|
||||||
|
jmp SHORT b
|
||||||
|
a: db msg,0
|
||||||
|
b: push SI
|
||||||
|
push AX
|
||||||
|
mov AX,Bits
|
||||||
|
mov SI,OFFSET a
|
||||||
|
call MSGOUT
|
||||||
|
pop AX
|
||||||
|
pop SI
|
||||||
|
endm
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; mnum macro -- see above for description
|
||||||
|
;
|
||||||
|
|
||||||
|
MNum MACRO Bits,num
|
||||||
|
push AX
|
||||||
|
ifb <num>
|
||||||
|
mov AX,Bits
|
||||||
|
call MSGNUM
|
||||||
|
else
|
||||||
|
push BX
|
||||||
|
mov BX,num
|
||||||
|
mov AX,Bits
|
||||||
|
call MSGNUM
|
||||||
|
pop BX
|
||||||
|
endif
|
||||||
|
pop AX
|
||||||
|
endm
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; zwait macro -- see above for description
|
||||||
|
;
|
||||||
|
|
||||||
|
ZWAIT MACRO
|
||||||
|
Message fTestALL,<"? ">
|
||||||
|
CALL ZWAITrtn
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
ZWAITrtn:
|
||||||
|
pushf ; save the flags
|
||||||
|
push AX ; preserve AX
|
||||||
|
xor AH, AH ; set command to get character ;3.30*
|
||||||
|
int 16h ; call rom keyboard routine ;3.30*
|
||||||
|
pop AX ; restore AX
|
||||||
|
popf ; restore the flags
|
||||||
|
ret
|
||||||
|
|
||||||
|
;Dump_byte dumps the memory contents in hex. ;3.30
|
||||||
|
;DUMPOFFLABEL should be a label or a variable defined in DUMPSEG. ;3.30
|
||||||
|
DUMP_BYTE MACRO DUMPSEG, DUMPOFFLABEL, BYTELENGTH ;3.30
|
||||||
|
push es ;3.30
|
||||||
|
PUSH DS ;3.30
|
||||||
|
PUSH SI ;3.30
|
||||||
|
PUSH CX ;3.30
|
||||||
|
;3.30
|
||||||
|
MOV CX, DUMPSEG ;3.30
|
||||||
|
MOV DS, CX ;3.30
|
||||||
|
MOV SI, OFFSET DUMPOFFLABEL ;3.30
|
||||||
|
MOV CX, BYTELENGTH ;3.30
|
||||||
|
call dumpbytes ;3.30
|
||||||
|
;3.30
|
||||||
|
POP CX ;3.30
|
||||||
|
POP SI ;3.30
|
||||||
|
POP DS ;3.30
|
||||||
|
pop es ;3.30
|
||||||
|
ENDM ;3.30
|
||||||
|
;3.30
|
||||||
|
;Dump_Byte_Reg dumps the memory contents in hex. - 4/9/86 ;3.30
|
||||||
|
;DUMPOFFREG should be a register contains the offset value in DUMPSEG. ;3.30
|
||||||
|
DUMP_BYTE_REG MACRO DUMPSEG, DUMPOFFREG, BYTELENGTH ;3.30
|
||||||
|
push es ;3.30
|
||||||
|
PUSH DS ;3.30
|
||||||
|
PUSH SI ;3.30
|
||||||
|
PUSH CX ;3.30
|
||||||
|
;3.30
|
||||||
|
MOV CX, DUMPSEG ;3.30
|
||||||
|
MOV DS, CX ;3.30
|
||||||
|
MOV SI, DUMPOFFREG ;3.30
|
||||||
|
MOV CX, BYTELENGTH ;3.30
|
||||||
|
call dumpbytes ;3.30
|
||||||
|
;3.30
|
||||||
|
POP CX ;3.30
|
||||||
|
POP SI ;3.30
|
||||||
|
POP DS ;3.30
|
||||||
|
pop es ;3.30
|
||||||
|
ENDM ;3.30
|
||||||
|
|
||||||
|
else
|
||||||
|
; if test is not defined then make macro into null statements
|
||||||
|
Message macro
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
MNUM macro
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
ZWAIT macro
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
DUMP_BYTE MACRO ;3.30
|
||||||
|
ENDM ;3.30
|
||||||
|
DUMP_BYTE_REG MACRO ;3.30
|
||||||
|
ENDM ;3.30
|
||||||
|
ENDIF ;3.30
|
||||||
|
;3.30
|
||||||
|
PATHSTART MACRO INDEX,ABBR ;3.30
|
||||||
|
IFDEF PATHGEN ;3.30
|
||||||
|
PUBLIC ABBR&INDEX&S,ABBR&INDEX&E ;3.30
|
||||||
|
ABBR&INDEX&S LABEL BYTE ;3.30
|
||||||
|
ENDIF ;3.30
|
||||||
|
ENDM ;3.30
|
||||||
|
;3.30
|
||||||
|
PATHEND MACRO INDEX,ABBR ;3.30
|
||||||
|
IFDEF PATHGEN ;3.30
|
||||||
|
ABBR&INDEX&E LABEL BYTE ;3.30
|
||||||
|
ENDIF ;3.30
|
||||||
|
ENDM ;3.30
|
||||||
|
|
306
v4.0/src/BIOS/MSSTACK.INC
Normal file
306
v4.0/src/BIOS/MSSTACK.INC
Normal file
@ -0,0 +1,306 @@
|
|||||||
|
; MSStack.inc
|
||||||
|
;
|
||||||
|
; Interrupt level 2, 3, 4, 5, 6, 7,(10, 11, 12, 14, 15 - AT level)
|
||||||
|
; should follow the standard Interrupt Sharing Scheme which has
|
||||||
|
; a standard header structure.
|
||||||
|
; Fyi, the following shows the relations between
|
||||||
|
; the interrupt vector and interrupt level.
|
||||||
|
; VEC(Hex) 2 8 9 A B C D E 70 72 73 74 76 77
|
||||||
|
; LVL(Deci) 9 0 1 2 3 4 5 6 8 10 11 12 14 15
|
||||||
|
; MSSTACK module modifies the following interrupt vectors
|
||||||
|
; to meet the standard Interrupt Sharing standard;
|
||||||
|
; A, B, C, D, E, 72, 73, 74, 76, 77.
|
||||||
|
; Also, for interrupt level 7 and 15, the FirstFlag in a standard header
|
||||||
|
; should be initialized to indicat whether this interrupt handler is
|
||||||
|
; the first (= 80h) or not. The FirstFlag entry of INT77h's
|
||||||
|
; program header is initialized in STKINIT.INC module.
|
||||||
|
; FirstFlag is only meaningful for interrupt level 7 and 15.
|
||||||
|
;
|
||||||
|
|
||||||
|
; User specifies the number of stack elements - default = 9
|
||||||
|
; minimum = 8
|
||||||
|
; maximum = 64
|
||||||
|
;
|
||||||
|
; Intercepts Asynchronous Hardware Interrupts only
|
||||||
|
;
|
||||||
|
; Picks a stack from pool of stacks and switches to it
|
||||||
|
;
|
||||||
|
; Calls the previously saved interrupt vector after pushing flags
|
||||||
|
;
|
||||||
|
; On return, returns the stack to the stack pool
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
; This is a modification of STACKS:
|
||||||
|
; 1. To fix a bug which was causing the program to take up too much space.
|
||||||
|
; 2. To dispense stack space from hi-mem first rather than low-mem first.
|
||||||
|
; . Clobbers the stack that got too big instead of innocent stack
|
||||||
|
; . Allows system to work if the only stack that got too big was the most
|
||||||
|
; deeply nested one
|
||||||
|
; 3. Disables NMI interrupts while setting the NMI vector.
|
||||||
|
; 4. Does not intercept any interupts on a PCjr.
|
||||||
|
; 5. Double checks that a nested interrupt didn't get the same stack.
|
||||||
|
; 6. Intercepts Ints 70, 72-77 for PC-ATs and other future products
|
||||||
|
|
||||||
|
;The following variables are for MSSTACK.inc
|
||||||
|
EVEN
|
||||||
|
dw 0 ; SPARE FIELD BUT LEAVE THESE IN ORDER
|
||||||
|
StackCount dw 0
|
||||||
|
StackAt dw 0
|
||||||
|
StackSize dw 0
|
||||||
|
Stacks dw 0
|
||||||
|
dw 0
|
||||||
|
|
||||||
|
FirstEntry dw Stacks
|
||||||
|
LastEntry dw Stacks+(DefaultCount*EntrySize)-EntrySize
|
||||||
|
NextEntry dw Stacks+(DefaultCount*EntrySize)-EntrySize
|
||||||
|
|
||||||
|
;End of variables defined for MSSTACK.
|
||||||
|
|
||||||
|
;*******************************************************************
|
||||||
|
;Macro Interrupt handler for the ordinary interrupt vectors and
|
||||||
|
;the shared interrupt vectors.
|
||||||
|
;*****************************
|
||||||
|
Stack_Main MACRO AA
|
||||||
|
ASSUME DS:NOTHING
|
||||||
|
ASSUME ES:NOTHING
|
||||||
|
ASSUME SS:NOTHING
|
||||||
|
PUBLIC Int&AA
|
||||||
|
PUBLIC Old&AA
|
||||||
|
;-----------------------------
|
||||||
|
ife IntSharingFlag ;if not IntSharingFlag
|
||||||
|
;-----------------------------
|
||||||
|
Old&AA DD 0
|
||||||
|
Int&AA PROC FAR
|
||||||
|
;-----------------------------
|
||||||
|
else ;for shared interrupt. A Header exists.
|
||||||
|
|
||||||
|
PUBLIC FirstFlag&AA
|
||||||
|
Int&AA PROC FAR
|
||||||
|
jmp short Entry_Int&AA&_Stk
|
||||||
|
Old&AA dd 0 ;Forward pointer
|
||||||
|
dw 424Bh ;compatible signature for Int. Sharing
|
||||||
|
FirstFlag&AA db 0 ;the firstly hooked.
|
||||||
|
jmp short Intret_&AA ;Reset routine. We don't care this.
|
||||||
|
db 7 dup (0) ;Reserved for future.
|
||||||
|
Entry_Int&AA&_Stk:
|
||||||
|
;-----------------------------
|
||||||
|
endif
|
||||||
|
;-----------------------------
|
||||||
|
|
||||||
|
;
|
||||||
|
; Keyboard interrupt must have a three byte jump, a NOP and a zero byte
|
||||||
|
; as its first instruction for compatibility reasons
|
||||||
|
ifidn <&aa>,<09>
|
||||||
|
jmp Keyboard_lbl
|
||||||
|
nop
|
||||||
|
db 0
|
||||||
|
Keyboard_lbl label near
|
||||||
|
endif
|
||||||
|
|
||||||
|
; This patches INTERRUPT 75h to be "unhooked". We do this Wierdness,
|
||||||
|
; rather than never hooking INT 75h, to maintain maximum compat. with IBMs
|
||||||
|
; post production patch.
|
||||||
|
push ax
|
||||||
|
|
||||||
|
ifidn <&aa>,<02>
|
||||||
|
|
||||||
|
; *********************************************************************
|
||||||
|
;
|
||||||
|
; This is special support for the PC Convertible / NMI handler
|
||||||
|
;
|
||||||
|
; On the PC Convertible, there is a situation where an NMI can be
|
||||||
|
; caused by using the "OUT" instructions to certain ports. When this
|
||||||
|
; occurs, the PC Convertible hardware *GUARANTEES* that **NOTHING**
|
||||||
|
; can stop the NMI or interfere with getting to the NMI handler. This
|
||||||
|
; includes other type of interrupts (hardware and software), and
|
||||||
|
; also includes other type of NMI's. When any NMI has occured,
|
||||||
|
; no other interrtupt (hardware, software or NMI) can occur until
|
||||||
|
; the software takes specific steps to allow further interrupting.
|
||||||
|
;
|
||||||
|
; For PC Convertible, the situation where the NMI is generated by the
|
||||||
|
; "OUT" to a control port requires "fixing-up" and re-attempting. In
|
||||||
|
; otherwords, it is actually a "restartable exception". In this
|
||||||
|
; case, the software handler must be able to get to the stack in
|
||||||
|
; order to figure out what instruction caused the problem, where
|
||||||
|
; it was "OUT"ing to and what value it was "OUT"ing. Therefore,
|
||||||
|
; we will not switch stacks in this situation. This situation is
|
||||||
|
; detected by interrogating port 62h, and checking for a bit value
|
||||||
|
; of 80h. If set, *****DO NOT SWITCH STACKS*****.
|
||||||
|
;
|
||||||
|
; *********************************************************************
|
||||||
|
|
||||||
|
push es
|
||||||
|
mov ax,0f000h
|
||||||
|
mov es,ax
|
||||||
|
cmp byte ptr es:[0fffeh],mdl_convert ;check if convertible
|
||||||
|
pop es
|
||||||
|
jne Normal&aa
|
||||||
|
|
||||||
|
in al,62h
|
||||||
|
test al,80h
|
||||||
|
jz Normal&aa
|
||||||
|
|
||||||
|
Special&aa:
|
||||||
|
pop ax
|
||||||
|
jmp dword ptr Old&aa
|
||||||
|
|
||||||
|
Normal&aa:
|
||||||
|
|
||||||
|
; *********************************************************************
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
push bp
|
||||||
|
push es
|
||||||
|
mov es, cs:[STACKS+2] ; Get segment of stacks
|
||||||
|
|
||||||
|
mov bp,NextEntry ; get most likely candidate
|
||||||
|
mov al,Allocated
|
||||||
|
xchg AllocByte,al ; grab the entry
|
||||||
|
cmp al,Free ; still avail?
|
||||||
|
jne NotFree&aa
|
||||||
|
|
||||||
|
sub NextEntry,EntrySize ; set for next interrupt
|
||||||
|
|
||||||
|
Found&aa:
|
||||||
|
mov SavedSP,sp ; save sp value
|
||||||
|
mov SavedSS,ss ; save ss also
|
||||||
|
; mov IntLevel,aa&h ; save the int level
|
||||||
|
|
||||||
|
mov ax,bp ; temp save of table offset
|
||||||
|
|
||||||
|
mov bp,NewSP ; get new SP value
|
||||||
|
cmp es:[bp],ax ; check for offset into table
|
||||||
|
jne FoundBad&aa
|
||||||
|
|
||||||
|
mov ax,es ; point ss,sp to the new stack
|
||||||
|
mov ss,ax
|
||||||
|
mov sp,bp
|
||||||
|
|
||||||
|
pushf ; go execute the real interrupt handler
|
||||||
|
call dword ptr old&aa ; which will iret back to here
|
||||||
|
|
||||||
|
mov bp,sp ; retrieve the table offset for us
|
||||||
|
mov bp,es:[bp] ; but leave it on the stack
|
||||||
|
mov ss,SavedSS ; get old stack back
|
||||||
|
mov sp,SavedSP
|
||||||
|
|
||||||
|
; cmp AllocByte,Allocated ; If an error occured,
|
||||||
|
; jne NewError&aa ; do not free us
|
||||||
|
|
||||||
|
mov AllocByte,Free ; free the entry
|
||||||
|
mov NextEntry,bp ; setup to use next time
|
||||||
|
|
||||||
|
NewError&aa:
|
||||||
|
pop es
|
||||||
|
pop bp ; saved on entry
|
||||||
|
pop ax ; saved on entry
|
||||||
|
|
||||||
|
INTRET_&AA: ;3.30
|
||||||
|
iret ; done with this interrupt
|
||||||
|
|
||||||
|
NotFree&aa:
|
||||||
|
cmp al,Allocated ; error flag
|
||||||
|
je findnext&aa ; no, continue
|
||||||
|
xchg AllocByte,al ; yes, restore error value
|
||||||
|
|
||||||
|
FindNext&aa:
|
||||||
|
call LongPath
|
||||||
|
jmp Found&aa
|
||||||
|
|
||||||
|
FoundBad&aa:
|
||||||
|
cmp bp,FirstEntry
|
||||||
|
jc findnext&aa
|
||||||
|
mov bp,ax ; flag this entry
|
||||||
|
mov AllocByte,Clobbered
|
||||||
|
; add bp,EntrySize ; and previous entry
|
||||||
|
; mov AllocByte,Overflowed
|
||||||
|
; sub bp,EntrySize
|
||||||
|
jmp findnext&aa ; keep looking
|
||||||
|
|
||||||
|
int&aa endp
|
||||||
|
|
||||||
|
|
||||||
|
endm
|
||||||
|
|
||||||
|
;***************************** ;3.30
|
||||||
|
;End of Macro definition ;3.30
|
||||||
|
;******************************************************************** ;3.30
|
||||||
|
; THESE ARE THE INDIVIDUAL INTERRUPT HANDLERS ;3.30
|
||||||
|
;3.30
|
||||||
|
IRP A,<02,08,09,70> ;3.30
|
||||||
|
IntSharingFlag=0 ;3.30
|
||||||
|
Stack_Main &A ;3.30
|
||||||
|
ENDM ;3.30
|
||||||
|
;3.30
|
||||||
|
IRP A,<0A,0B,0C,0D,0E,72,73,74,76,77> ;3.30
|
||||||
|
IntSharingFlag=1 ;3.30
|
||||||
|
Stack_Main &A ;3.30
|
||||||
|
ENDM ;3.30
|
||||||
|
;3.30
|
||||||
|
;******************************************************************** ;3.30
|
||||||
|
;Common routines ;3.30
|
||||||
|
|
||||||
|
longpath:
|
||||||
|
mov bp,LastEntry ; start with last entry in table
|
||||||
|
|
||||||
|
LPLOOPP: ;3.30
|
||||||
|
cmp AllocByte,Free ; is entry free?
|
||||||
|
jne inuse ; no, try next one
|
||||||
|
|
||||||
|
mov al,Allocated
|
||||||
|
xchg AllocByte,al ; allocate entry
|
||||||
|
cmp al,Free ; is it still free?
|
||||||
|
je found ; yes, go use it
|
||||||
|
|
||||||
|
cmp al,Allocated ; is it other than Allocated or Free?
|
||||||
|
je inuse ; no, check the next one
|
||||||
|
|
||||||
|
mov AllocByte,al ; yes, put back the error state
|
||||||
|
|
||||||
|
inuse:
|
||||||
|
cmp bp,FirstEntry
|
||||||
|
je Fatal
|
||||||
|
sub bp,EntrySize
|
||||||
|
JMP LPLOOPP ;3.30
|
||||||
|
|
||||||
|
found:
|
||||||
|
ret
|
||||||
|
|
||||||
|
page
|
||||||
|
|
||||||
|
fatal proc near
|
||||||
|
push ds ;3.30
|
||||||
|
mov ax, 0f000h ;loook at the model byte ;3.30
|
||||||
|
mov ds, ax ;3.30
|
||||||
|
cmp ds:byte ptr [0fffeh], mdl_convert ;convertible? ;3.30
|
||||||
|
pop ds ;3.30
|
||||||
|
jne Skip_NMIS ;3.30
|
||||||
|
;3.30
|
||||||
|
mov al,07h ; disable PC Convertible NMIs
|
||||||
|
out 72h,al
|
||||||
|
|
||||||
|
Skip_NMIS: ;3.30
|
||||||
|
cli ; disable and mask
|
||||||
|
mov al,0ffh ; all other ints
|
||||||
|
out 021h,al
|
||||||
|
out 0a1h,al
|
||||||
|
|
||||||
|
mov si,cs
|
||||||
|
mov ds,si
|
||||||
|
mov si,offset fatal_msg
|
||||||
|
|
||||||
|
fatal_loop:
|
||||||
|
lodsb
|
||||||
|
cmp al,'$'
|
||||||
|
je fatal_done
|
||||||
|
|
||||||
|
mov bl,7 ;3.30*
|
||||||
|
mov ah,14 ;3.30*
|
||||||
|
int 010h ; whoops, this enables ints ;3.30*
|
||||||
|
jmp fatal_loop
|
||||||
|
|
||||||
|
fatal_done:
|
||||||
|
jmp fatal_done
|
||||||
|
fatal endp
|
297
v4.0/src/BIOS/MSVOLID.INC
Normal file
297
v4.0/src/BIOS/MSVOLID.INC
Normal file
@ -0,0 +1,297 @@
|
|||||||
|
;-------------------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; File: msvolid.asm
|
||||||
|
; This file contains the volume_id subroutines and data structures.
|
||||||
|
;
|
||||||
|
; Routines in this file are:
|
||||||
|
; Set_Volume_ID - main routine, calls other routines.
|
||||||
|
; read_volume_id - read the volume ID and tells if it has
|
||||||
|
; been changed.
|
||||||
|
; Transfer_volume_id - copy the volume ID from TMP to special
|
||||||
|
; drive.
|
||||||
|
; Check_Volume_ID - compare volume ID in TMP area with one
|
||||||
|
; expected for drive.
|
||||||
|
; Fat_Check - see of the fatID has changed in the
|
||||||
|
; specified drive.
|
||||||
|
; Init_Vid_loop - set up for VID scan or move
|
||||||
|
;
|
||||||
|
;
|
||||||
|
;-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
;
|
||||||
|
; length of the volume id
|
||||||
|
;
|
||||||
|
|
||||||
|
vid_size equ 12
|
||||||
|
|
||||||
|
PATHSTART 001,VOLID ;3.30
|
||||||
|
|
||||||
|
;
|
||||||
|
; null volume id
|
||||||
|
;
|
||||||
|
|
||||||
|
nul_vid db "NO NAME ",0
|
||||||
|
|
||||||
|
;
|
||||||
|
; data scratch area used to hold volume ids
|
||||||
|
;
|
||||||
|
|
||||||
|
tmp_vid db "NO NAME ",0
|
||||||
|
|
||||||
|
PATHEND 001,VOLID ;3.30
|
||||||
|
|
||||||
|
;
|
||||||
|
; Set_Volume_ID
|
||||||
|
; If drive has changeline support, read in and set the volume_ID
|
||||||
|
; and the last FAT_ID byte. If no change line support then do nothing.
|
||||||
|
;
|
||||||
|
; On entry:
|
||||||
|
; DS:DI points to the BDS for this disk.
|
||||||
|
; AH contains media byte
|
||||||
|
;
|
||||||
|
; On Exit:
|
||||||
|
; Carry clear:
|
||||||
|
; Successful call
|
||||||
|
; Carry set
|
||||||
|
; Error and AX has error code
|
||||||
|
;
|
||||||
|
|
||||||
|
Set_Volume_ID:
|
||||||
|
PUBLIC SET_VOLUME_ID ;3.30
|
||||||
|
push dx ; save registers
|
||||||
|
push ax
|
||||||
|
CALL HasChange ; does drive have changeline support?
|
||||||
|
jz setvret ; no, get out
|
||||||
|
push di
|
||||||
|
call read_volume_ID ; read the volume ID
|
||||||
|
pop di
|
||||||
|
jc SetErr ; if error go to error routine
|
||||||
|
call transfer_volume_ID ; copy the volume id to special drive
|
||||||
|
call ResetChanged ; restore value of change line
|
||||||
|
|
||||||
|
setvret: ; SET Volume RETurn
|
||||||
|
clc ; no error, clear carry flag
|
||||||
|
pop ax ; restore registers
|
||||||
|
pop dx
|
||||||
|
ret
|
||||||
|
SetErr:
|
||||||
|
pop dx ; pop stack but don't overwrite AX
|
||||||
|
pop dx ; restore DX
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
root_sec DW ? ;Root sector #
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; read_volume_id read the volume ID and tells if it has been changed.
|
||||||
|
;
|
||||||
|
; On entry:
|
||||||
|
; DS:DI points to current BDS for drive.
|
||||||
|
; On Exit:
|
||||||
|
; Carry Clear
|
||||||
|
; SI = 1 No change
|
||||||
|
; SI = 0 ?
|
||||||
|
; SI = -1 Change
|
||||||
|
;
|
||||||
|
; Carry Set:
|
||||||
|
; Error and AX has error code.
|
||||||
|
;
|
||||||
|
|
||||||
|
read_volume_id:
|
||||||
|
push ES ; preserve registers
|
||||||
|
push DX
|
||||||
|
push CX
|
||||||
|
push BX
|
||||||
|
push AX
|
||||||
|
push DS ; Preserve Current BDS
|
||||||
|
push DI
|
||||||
|
push cs ; get ES segment correct
|
||||||
|
pop es
|
||||||
|
push cs ; get DS segment correct
|
||||||
|
pop ds
|
||||||
|
mov di,offset tmp_vid
|
||||||
|
mov si,offset nul_vid
|
||||||
|
mov cx,vid_size
|
||||||
|
rep movsb ; initialize tmp_vid to null vi_id
|
||||||
|
|
||||||
|
pop DI ; Restore Current BDS
|
||||||
|
pop DS
|
||||||
|
mov al,byte ptr ds:[di].cFAT ; # of fats
|
||||||
|
mov cx,word ptr ds:[di].csecfat ; sectors / fat
|
||||||
|
mul cl ; size taken by fats
|
||||||
|
add ax,word ptr ds:[di].ressec ; add on reserved sectors
|
||||||
|
; AX is now sector # (0 based)
|
||||||
|
mov cs:[root_sec],ax ; set initial value
|
||||||
|
mov ax,[di].cDir ; # root dir entries
|
||||||
|
mov cl,4 ; 16 entries/sector
|
||||||
|
shr ax,cl ; divide by 16
|
||||||
|
mov cx,ax ; cx is # of sectors to scan
|
||||||
|
next_sec:
|
||||||
|
push cx ; save outer loop counter
|
||||||
|
mov ax,cs:[root_sec] ; get sector #
|
||||||
|
mov cx,word ptr ds:[di].seclim ; sectors / track
|
||||||
|
xor DX,DX
|
||||||
|
div cx
|
||||||
|
; set up registers for call to read_sector
|
||||||
|
inc DX ; dx= sectors into track, ax= track count from 0
|
||||||
|
mov cl,dl ; sector to read
|
||||||
|
xor DX,DX
|
||||||
|
div word ptr ds:[di].hdlim ; # heads on this disc
|
||||||
|
mov dh,dl ; Head number
|
||||||
|
mov ch,al ; Track #
|
||||||
|
call read_sector ; get first sector of the root directory,
|
||||||
|
; ES:BX -> BOOT
|
||||||
|
jc ReadVIDErr ; error on read
|
||||||
|
mov cx,16 ; # of dir entries in a block of root
|
||||||
|
mov al,08h ; volume label bit
|
||||||
|
fvid_loop:
|
||||||
|
cmp byte ptr es:[bx],0 ; End of dir?
|
||||||
|
jz no_vid ; yes, no vol id
|
||||||
|
cmp byte ptr es:[bx],0E5h ; empty entry?
|
||||||
|
jz ent_loop ; yes, skip
|
||||||
|
test es:[bx+11],al ; is volume label bit set in fcb?
|
||||||
|
jnz found_vid ; jmp yes
|
||||||
|
ent_loop:
|
||||||
|
ADD BX,32 ;MJB003 ADD LENGTH OF DIRECTORY ENTRY ;3.30
|
||||||
|
loop fvid_loop
|
||||||
|
pop cx ; outer loop
|
||||||
|
inc cs:[root_sec] ; next sector
|
||||||
|
loop next_sec ; continue
|
||||||
|
NotFound:
|
||||||
|
XOR SI,SI
|
||||||
|
jmp short fvid_ret
|
||||||
|
|
||||||
|
found_vid:
|
||||||
|
pop cx ; clean stack of outer loop counter
|
||||||
|
mov si,bx ; point to volume_id
|
||||||
|
push ds ; preserve currnet BDS
|
||||||
|
push di
|
||||||
|
push es ; es:si points to volume id.
|
||||||
|
pop ds ; source segment
|
||||||
|
push cs
|
||||||
|
pop es ; destination segment
|
||||||
|
mov di,offset tmp_vid ; dest of volume_id
|
||||||
|
mov cx,vid_size -1 ; length of string minus NUL
|
||||||
|
rep movsb ; mov volume label to tmp_vid
|
||||||
|
xor al,al
|
||||||
|
stosb ; Null terminate
|
||||||
|
XOR SI,SI
|
||||||
|
pop DI ; restore current BDS
|
||||||
|
pop DS
|
||||||
|
fvid_ret:
|
||||||
|
pop ax
|
||||||
|
clc
|
||||||
|
RVIDRet:
|
||||||
|
pop BX ; restore register
|
||||||
|
pop CX
|
||||||
|
pop DX
|
||||||
|
pop ES
|
||||||
|
ret
|
||||||
|
no_vid:
|
||||||
|
pop cx ; clean stack of outer loop counter
|
||||||
|
jmp NotFound ; not found
|
||||||
|
ReadVIDErr:
|
||||||
|
pop SI
|
||||||
|
pop SI
|
||||||
|
jmp RVIDRet
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; Transfer_volume_id - copy the volume ID from TMP to special drive
|
||||||
|
;
|
||||||
|
; Inputs: DS:DI nas current BDS
|
||||||
|
; Outputs: BDS for drive has volume ID from TMP
|
||||||
|
;
|
||||||
|
|
||||||
|
transfer_volume_ID:
|
||||||
|
push DS ; preserve current BDS
|
||||||
|
push DI
|
||||||
|
push ES
|
||||||
|
push SI
|
||||||
|
push CX
|
||||||
|
call init_vid_loop
|
||||||
|
cld
|
||||||
|
rep MOVSB ; transfer
|
||||||
|
pop CX
|
||||||
|
pop SI
|
||||||
|
pop ES
|
||||||
|
pop DI ; restore current BDS
|
||||||
|
pop DS
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; Check_Volume_ID - compare volume ID in TMP area with one expected for
|
||||||
|
; drive
|
||||||
|
;
|
||||||
|
; Inputs: DS:DI has current BDS for drive
|
||||||
|
; Outputs: SI = 0 if compare succeeds
|
||||||
|
; SI = -1 if compare fails.
|
||||||
|
|
||||||
|
check_volume_id:
|
||||||
|
push DS ; preserve current BDS for drive
|
||||||
|
push DI
|
||||||
|
push ES
|
||||||
|
push CX
|
||||||
|
call init_vid_loop
|
||||||
|
cld
|
||||||
|
repz cmpsb ; are the 2 volume_ids the same?
|
||||||
|
mov si,0 ; assume unknown
|
||||||
|
jz check_vid_ret ; carry clear if jump taken
|
||||||
|
mov si,-1 ; failure
|
||||||
|
check_vid_ret:
|
||||||
|
pop CX
|
||||||
|
pop ES
|
||||||
|
pop DI ; restore current BDS
|
||||||
|
pop DS
|
||||||
|
ret
|
||||||
|
|
||||||
|
;
|
||||||
|
; Fat_Check - see of the fatID has changed in the specified drive.
|
||||||
|
; - uses the FAT ID obtained from the boot sector.
|
||||||
|
;
|
||||||
|
; Inputs: MedByt is expected FAT ID
|
||||||
|
; DS:DI points to current BDS
|
||||||
|
; Output: Carry Clear
|
||||||
|
; SI = -1 if fat ID different,
|
||||||
|
; SI = 0 otherwise
|
||||||
|
; No other registers changed.
|
||||||
|
|
||||||
|
FAT_CHECK:
|
||||||
|
push AX
|
||||||
|
xor SI, SI ; say FAT ID's are same.
|
||||||
|
mov AL, cs:MedByt
|
||||||
|
cmp AL, byte ptr [DI].Mediad ; compare it with the BDS medbyte
|
||||||
|
jz OKRET1 ; carry clear
|
||||||
|
dec SI
|
||||||
|
OkRet1: clc
|
||||||
|
pop AX
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; Init_Vid_loop - set up for VID scan or move
|
||||||
|
;
|
||||||
|
; Inputs: DS:DI pionts to BDS for the drive
|
||||||
|
; Outputs: DS:SI points to tmp_vid
|
||||||
|
; ES:DI points to vid for drive
|
||||||
|
; CX has size for VID compare
|
||||||
|
;
|
||||||
|
|
||||||
|
init_vid_loop:
|
||||||
|
push ax
|
||||||
|
push ds
|
||||||
|
pop es
|
||||||
|
push cs
|
||||||
|
pop ds
|
||||||
|
mov si,offset tmp_vid ; source
|
||||||
|
add di,volid
|
||||||
|
mov cx,vid_size
|
||||||
|
pop ax
|
||||||
|
ret
|
||||||
|
|
63
v4.0/src/BIOS/PSOPTION.INC
Normal file
63
v4.0/src/BIOS/PSOPTION.INC
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
;*******************************************************************
|
||||||
|
; Parser Options set for IBMBIO SYSCONF module
|
||||||
|
;*******************************************************************
|
||||||
|
;
|
||||||
|
;**** Default assemble swiches definition **************************
|
||||||
|
|
||||||
|
IFNDEF FarSW
|
||||||
|
FarSW equ 0 ; Near call expected
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFNDEF DateSW
|
||||||
|
DateSW equ 0 ; Check date format
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFNDEF TimeSW
|
||||||
|
TimeSW equ 0 ; Check time format
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFNDEF FileSW
|
||||||
|
FileSW equ 1 ; Check file specification
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFNDEF CAPSW
|
||||||
|
CAPSW equ 0 ; Perform CAPS if specified
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFNDEF CmpxSW
|
||||||
|
CmpxSW equ 0 ; Check complex list
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFNDEF NumSW
|
||||||
|
NumSW equ 1 ; Check numeric value
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFNDEF KeySW
|
||||||
|
KeySW equ 0 ; Support keywords
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFNDEF SwSW
|
||||||
|
SwSW equ 1 ; Support switches
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFNDEF Val1SW
|
||||||
|
Val1SW equ 1 ; Support value definition 1
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFNDEF Val2SW
|
||||||
|
Val2SW equ 0 ; Support value definition 2
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFNDEF Val3SW
|
||||||
|
Val3SW equ 1 ; Support value definition 3
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFNDEF DrvSW
|
||||||
|
DrvSW equ 1 ; Support drive only format
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFNDEF QusSW
|
||||||
|
QusSW equ 0 ; Support quoted string format
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
|
20
v4.0/src/BIOS/PUSHPOP.INC
Normal file
20
v4.0/src/BIOS/PUSHPOP.INC
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
IF1 ;3.30
|
||||||
|
|
||||||
|
SaveReg MACRO reglist ;; push those registers
|
||||||
|
IRP reg,<reglist>
|
||||||
|
?stackdepth = ?stackdepth + 1
|
||||||
|
PUSH reg
|
||||||
|
ENDM
|
||||||
|
ENDM
|
||||||
|
.xcref SaveReg
|
||||||
|
|
||||||
|
|
||||||
|
RestoreReg MACRO reglist ;; pop those registers
|
||||||
|
IRP reg,<reglist>
|
||||||
|
?stackdepth = ?stackdepth - 1
|
||||||
|
POP reg
|
||||||
|
ENDM
|
||||||
|
ENDM
|
||||||
|
.xcref RestoreReg
|
||||||
|
|
||||||
|
ENDIF ;3.30
|
165
v4.0/src/BIOS/READCLOC.INC
Normal file
165
v4.0/src/BIOS/READCLOC.INC
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
; SCCSID = @(#)readclock.asm 1.2 85/07/25
|
||||||
|
;************************************************************************
|
||||||
|
;
|
||||||
|
; read_real_date reads real-time clock for date and returns the number
|
||||||
|
; of days elapsed since 1-1-80 in si
|
||||||
|
;
|
||||||
|
read_real_date: ;mjb002
|
||||||
|
assume ds:code,es:nothing
|
||||||
|
PUSH AX
|
||||||
|
PUSH CX
|
||||||
|
PUSH DX
|
||||||
|
XOR AH,AH ; throw away clock roll over ;3.30*
|
||||||
|
INT 1AH ;3.30*
|
||||||
|
POP DX
|
||||||
|
POP CX
|
||||||
|
POP AX
|
||||||
|
|
||||||
|
PUSH AX
|
||||||
|
PUSH BX
|
||||||
|
PUSH CX
|
||||||
|
PUSH DX
|
||||||
|
MOV CS:DAYCNT2,1 ;MJB002 REAL TIME CLOCK ERROR FLAG (+1 DA;3.30Y)
|
||||||
|
mov ah,4 ;mjb002 read date function code ;3.30*
|
||||||
|
int 1ah ;mjb002 read real-time clock ;3.30*
|
||||||
|
jnc read_ok ;mjb002 jmp success
|
||||||
|
jmp r_d_ret ;mjb002 jmp error
|
||||||
|
read_ok: ;mjb002 ******* get bcd values in binary *****
|
||||||
|
mov byte ptr bin_date_time+0,ch ;mjb002 store as hex value
|
||||||
|
mov byte ptr bin_date_time+1,cl ;mjb002 ...
|
||||||
|
mov byte ptr bin_date_time+2,dh ;mjb002 ...
|
||||||
|
mov byte ptr bin_date_time+3,dl ;mjb002 ...
|
||||||
|
MOV CS:DAYCNT2,2 ;MJB002 READ OF R-T CLOCK SUCCESSFUL ;3.30
|
||||||
|
call bcd_verify ;mjb002 verify bcd values in range
|
||||||
|
jc r_d_ret ;mjb002 jmp some value out of range
|
||||||
|
MOV CS:DAYCNT2,3 ;MJB002 READ OF R-T CLOCK SUCCESSFUL ;3.30
|
||||||
|
call date_verify ;mjb002 verify date values in range
|
||||||
|
jc r_d_ret ;mjb002 jmp some value out of range
|
||||||
|
MOV CS:DAYCNT2,0 ;MJB002 VERIFY SUCCESSFUL ;3.30;3.30
|
||||||
|
call in_bin ;mjb002 convert date to binary
|
||||||
|
;mjb002 ******* years since 1-1-80 *********
|
||||||
|
mov al,byte ptr bin_date_time+1 ;mjb002 get years into century
|
||||||
|
cbw ;mjb002
|
||||||
|
cmp byte ptr bin_date_time+0,20 ;mjb002 20th century?
|
||||||
|
jnz century_19 ;mjb002 jmp no
|
||||||
|
add ax,100 ;mjb002 add in a century
|
||||||
|
century_19: ;mjb002
|
||||||
|
sub ax,80 ;mjb002 subtract off 1-1-80
|
||||||
|
mov cl,4 ;mjb002 leap year every 4
|
||||||
|
div cl ;mjb002 al= # leap year blocks, ah= remainder
|
||||||
|
mov bl,ah ;mjb002 save odd years
|
||||||
|
cbw ;mjb002 zero ah
|
||||||
|
mov cx,366+3*365 ;mjb002 # of days in leap year blocks
|
||||||
|
mul cx ;mjb002 dx:ax is result
|
||||||
|
MOV CS:DAYCNT2,AX ;MJB002 SAVE COUNT OF DAYS ;3.30
|
||||||
|
mov al,bl ;mjb002 get odd years count
|
||||||
|
cbw ;mjb002
|
||||||
|
or ax,ax ;mjb002 is ax= 0?
|
||||||
|
jz leap_year ;mjb002 jmp if none
|
||||||
|
mov cx,365 ;mjb002 days in year
|
||||||
|
mul cx ;mjb002 dx:ax is result
|
||||||
|
ADD CS:DAYCNT2,AX ;MJB002 ADD ON DAYS IN ODD YEARS ;3.30
|
||||||
|
jmp short leap_adjustment ;mjb002 account for leap year
|
||||||
|
leap_year: ;mjb002 possibly account for a leap day
|
||||||
|
cmp byte ptr bin_date_time+2,2 ;mjb002 is month february
|
||||||
|
jbe no_leap_adjustment ;mjb002 jan or feb. no leap day yet.
|
||||||
|
leap_adjustment: ;mjb002 account for leap day
|
||||||
|
INC CS:DAYCNT2 ;MJB002 ... ;3.30
|
||||||
|
no_leap_adjustment: ;mjb002 ******* get days of month *******
|
||||||
|
mov cl,byte ptr bin_date_time+3 ;mjb002 ...
|
||||||
|
xor ch,ch ;mjb002
|
||||||
|
dec cx ;mjb002 because of offset from day 1, not day 0
|
||||||
|
ADD CS:DAYCNT2,CX ;MJB002 ******* GET DAYS IN MONTHS PRECEE;3.30DING *****
|
||||||
|
mov cl,byte ptr bin_date_time+2 ;mjb002 get month
|
||||||
|
xor ch,ch ;mjb002
|
||||||
|
dec cx ;mjb002 january starts at offset 0
|
||||||
|
shl cx,1 ;mjb002 word offset
|
||||||
|
mov si,offset month_table ;mjb002 beginning of month_table
|
||||||
|
add si,cx ;mjb002 point into month table
|
||||||
|
mov ax,word ptr [si];mjb002 get # days in previous months
|
||||||
|
ADD CS:DAYCNT2,AX ;MJB002 ... ;3.30
|
||||||
|
r_d_ret: ;mjb002
|
||||||
|
MOV SI,CS:DAYCNT2 ;MJB002 RESULT IN SI ;3.30
|
||||||
|
POP DX
|
||||||
|
POP CX
|
||||||
|
POP BX
|
||||||
|
POP AX
|
||||||
|
ret ;mjb002
|
||||||
|
|
||||||
|
r_t_retj:
|
||||||
|
xor cx,cx
|
||||||
|
xor dx,dx
|
||||||
|
jmp r_t_ret
|
||||||
|
;
|
||||||
|
; Read_Real_Time reads the time from the RTC. on exit, it has the number of
|
||||||
|
; ticks (at 18.2 ticks per sec.) in CX:DX.
|
||||||
|
;
|
||||||
|
Read_Real_Time:
|
||||||
|
mov ah,2 ;3.30*
|
||||||
|
int 1AH ;3.30*
|
||||||
|
jc r_t_retj
|
||||||
|
oktime:
|
||||||
|
mov byte ptr bin_date_time,ch ; hours
|
||||||
|
mov byte ptr bin_date_time+1,cl ; minutes
|
||||||
|
mov byte ptr bin_date_time+2,dh ; seconds
|
||||||
|
mov byte ptr bin_date_time+3,0 ; unused for time
|
||||||
|
call bcd_verify
|
||||||
|
jc r_t_retj
|
||||||
|
call time_verify
|
||||||
|
jc r_t_retj
|
||||||
|
call in_bin
|
||||||
|
MOV ch,byte ptr bin_date_time
|
||||||
|
MOV cl,byte ptr bin_date_time+1
|
||||||
|
MOV dh,byte PTR bin_date_time+2
|
||||||
|
MOV dl,byte PTR bin_date_time+3
|
||||||
|
message ftestinit,<"Read Time ">
|
||||||
|
mnum ftestinit,cx
|
||||||
|
message ftestinit,<" ">
|
||||||
|
mnum ftestinit,dx
|
||||||
|
message ftestinit,<cr,lf>
|
||||||
|
; get time in ticks in CX:DX
|
||||||
|
CALL word ptr cs:TimeToTicks ;3.30
|
||||||
|
message ftestinit,<"Conv Time ">
|
||||||
|
mnum ftestinit,cx
|
||||||
|
message ftestinit,<" ">
|
||||||
|
mnum ftestinit,dx
|
||||||
|
message ftestinit,<cr,lf>
|
||||||
|
r_t_ret:
|
||||||
|
ret
|
||||||
|
|
||||||
|
;
|
||||||
|
; in_bin converts bin_date_time values from bcd to bin
|
||||||
|
;
|
||||||
|
in_bin: ;mjb002
|
||||||
|
assume ds:code,es:nothing
|
||||||
|
mov al,byte ptr bin_date_time+0 ; century or hours
|
||||||
|
call bcd_to_bin ; ...
|
||||||
|
mov byte ptr bin_date_time+0,al ;
|
||||||
|
mov al,byte ptr bin_date_time+1 ; years or minutes
|
||||||
|
call bcd_to_bin ; ...
|
||||||
|
mov byte ptr bin_date_time+1,al ;
|
||||||
|
mov al,byte ptr bin_date_time+2 ; months or seconds
|
||||||
|
call bcd_to_bin ; ...
|
||||||
|
mov byte ptr bin_date_time+2,al ;
|
||||||
|
mov al,byte ptr bin_date_time+3 ; days (not used for time)
|
||||||
|
call bcd_to_bin ; ...
|
||||||
|
mov byte ptr bin_date_time+3,al ;
|
||||||
|
ret ;
|
||||||
|
;
|
||||||
|
; bcd_to_bin converts two bcd nibbles in al (value <= 99.) to
|
||||||
|
; a binary representation in al
|
||||||
|
; ah is destroyed
|
||||||
|
;
|
||||||
|
bcd_to_bin: ;mjb002
|
||||||
|
assume ds:nothing,es:nothing
|
||||||
|
mov ah,al ;mjb002 copy bcd number to ah
|
||||||
|
and ax,0f00fh ;mjb002 clear unwanted nibbles
|
||||||
|
mov bl,al ;mjb002 save units place
|
||||||
|
xchg ah,al ;mjb002 10's place to al
|
||||||
|
xor ah,ah ;mjb002 ah not wanted
|
||||||
|
mov cl,4 ;mjb002 shift count
|
||||||
|
shr ax,cl ;mjb004 swap nibbles
|
||||||
|
mov cl,10 ;mjb002 convert al to ...
|
||||||
|
mul cl ;mjb002 ... its binary value
|
||||||
|
add al,bl ;mjb002 add in units
|
||||||
|
ret ;mjb002
|
271
v4.0/src/BIOS/STKINIT.INC
Normal file
271
v4.0/src/BIOS/STKINIT.INC
Normal file
@ -0,0 +1,271 @@
|
|||||||
|
;
|
||||||
|
; To follow the standard interrupt sharing scheme, MSSTACK.ASM ;3.30
|
||||||
|
; has been modified. This initialization routine also has to ;3.30
|
||||||
|
; be modified because for the interrupt level 7 and 15, FirstFlag ;3.30
|
||||||
|
; should be set to signal that this interrupt handler is the ;3.30
|
||||||
|
; first handler hooked to this interrupt vector. ;3.30
|
||||||
|
; We determine this by looking at the instruction pointed by ;3.30
|
||||||
|
; this vector. If it is IRET, then this handler should be the ;3.30
|
||||||
|
; first one. In our case, only the interrupt vector 77h is the ;3.30
|
||||||
|
; interrupt level 15. (We don't hook interrupt level 7.) ;3.30
|
||||||
|
; 9/10/1986 ;3.30
|
||||||
|
; The followings are mainly due to M.R.T; PTM fix of P886 12/3/86;3.30
|
||||||
|
; Some design changes are needed to the above interrupt sharing ;3.30
|
||||||
|
; method. The above sharing scheme assumes that 1). Interrupt ;3.30
|
||||||
|
; sharing is NEVER done on levels that have BIOS support. 2). "Phantom" ;3.30
|
||||||
|
; interrupts would only be generated on levels 7 and 15. ;3.30
|
||||||
|
; These assumptions are not true any more. We have to use the FirstFlag ;3.30
|
||||||
|
; for EVERY level of interrupt. We will set the firstFlag on the following;3.30
|
||||||
|
; conditions: ;3.30
|
||||||
|
; a. if the CS portion of the vector is 0000, then "first" ;3.30
|
||||||
|
; b. else if CS:IP points to valid shared header, then NOT "first" ;3.30
|
||||||
|
; c. else if CS:IP points to an IRET, then "first" ;3.30
|
||||||
|
; d. else if CS:IP points to DUMMY, then "first" ;3.30
|
||||||
|
; where DUMMY is - the CS portion must be F000, and the IP portion must ;3.30
|
||||||
|
; be equal to the value at F000:FF01. This location is the initial value ;3.30
|
||||||
|
; from VECTOR_TABLE for interrupt 7, one of the preserved addresses in all;3.30
|
||||||
|
; the BIOSes for all of the machines. ;3.30
|
||||||
|
; ;3.30
|
||||||
|
; System design group requests BIOS to handle the phantom interrupts. ;3.30
|
||||||
|
; ;3.30
|
||||||
|
; The "Phantom" interrupt is an illegal interrupt such as an interrupt ;3.30
|
||||||
|
; produced by the bogus adapter card even without interrupt request is ;3.30
|
||||||
|
; set. More specifically, 1). The 8259 has a feature when running in ;3.30
|
||||||
|
; edge triggered mode to latch a pulse and present the interrupt when ;3.30
|
||||||
|
; the processor indicates interrupt acknowledge (INTA). The interrupt ;3.30
|
||||||
|
; pulse was exist at the time of INTA to get a "phantom" interrupt. ;3.30
|
||||||
|
; 2). or, this is caused by adapter cards placing a glitch on the ;3.30
|
||||||
|
; interrupt line. ;3.30
|
||||||
|
; ;3.30
|
||||||
|
; To handle those "phantom" interrupts, the main stack code will check ;3.30
|
||||||
|
; the own FirstFlag, and if it is not "first" (which means the forward ;3.30
|
||||||
|
; pointer points to the legal shared interrupt handler), then pass the ;3.30
|
||||||
|
; control. If it is the first, then the following action should be ;3.30
|
||||||
|
; taken. We don't have to implement skack logic in this case. ;3.30
|
||||||
|
; ;3.30
|
||||||
|
; To implement this logic, we rather choose a simple method. ;3.30
|
||||||
|
; If ont of the above "FirstFlag" conditions is met, we are not ;3.30
|
||||||
|
; going to hook this interrupt vector. The reason is if the original ;3.30
|
||||||
|
; vector points to "IRET" and do nothing, we don't need ;3.30
|
||||||
|
; to implement the stack logic for it. This will simplify implementation;3.30
|
||||||
|
; while maintaining compatibility with the old version of DOS. ;3.30
|
||||||
|
; This implies that in the main stack code, there might be a stack code ;3.30
|
||||||
|
; that will never be used, a dead code. ;3.30
|
||||||
|
; ;3.30
|
||||||
|
; 12/3/86 ;3.30
|
||||||
|
;3.30
|
||||||
|
;In - CS, DS -> sysinitseg, ES -> relocated stack code & data. ;3.30
|
||||||
|
;3.30
|
||||||
|
PAGE ;3.30
|
||||||
|
assume ds:sysinitseg ; sunilp SB340
|
||||||
|
StackInit proc near ;3.30
|
||||||
|
;3.30
|
||||||
|
PUSH AX ;SAVE ALL ;3.30
|
||||||
|
PUSH DS ;3.30
|
||||||
|
PUSH ES ;3.30
|
||||||
|
PUSH BX ;3.30
|
||||||
|
PUSH CX ;3.30
|
||||||
|
PUSH DX ;3.30
|
||||||
|
PUSH DI ;3.30
|
||||||
|
PUSH SI ;3.30
|
||||||
|
PUSH BP ;3.30
|
||||||
|
;3.30
|
||||||
|
;Currently ES -> stack code area ;3.30
|
||||||
|
MOV AX, cs:[STACK_COUNT] ;defined in CS ;3.30
|
||||||
|
MOV es:[STACKCOUNT], AX ;defined in STACK CODE AREA ;3.30
|
||||||
|
MOV AX, [STACK_SIZE] ;in CS ;3.30
|
||||||
|
MOV es:[STACKSIZE], AX ; ;3.30
|
||||||
|
MOV AX, WORD PTR cs:[STACK_ADDR] ; OFFSET ;3.30
|
||||||
|
MOV WORD PTR es:[STACKS], AX ;3.30
|
||||||
|
MOV AX, WORD PTR cs:[STACK_ADDR+WORD] ; SEGMENT ;3.30
|
||||||
|
MOV WORD PTR es:[STACKS+WORD], AX ;3.30
|
||||||
|
;3.30
|
||||||
|
; INITIALIZE THE DATA FIELDS WITH THE PARAMETERS ;3.30
|
||||||
|
;3.30
|
||||||
|
; "FIRSTENTRY" WILL ALWAYS BE AT STACKS ;3.30
|
||||||
|
;3.30
|
||||||
|
MOV BP, word ptr es:STACKS ; GET OFFSET OF STACK ;3.30
|
||||||
|
MOV es:FIRSTENTRY,BP ;3.30
|
||||||
|
;3.30
|
||||||
|
; THE STACKS WILL ALWAYS IMMEDIATELY FOLLOW THE TABLE ENTRIES ;3.30
|
||||||
|
;3.30
|
||||||
|
MOV AX,ENTRYSIZE ;3.30
|
||||||
|
MOV CX,es:STACKCOUNT ;3.30
|
||||||
|
MUL CX ;3.30
|
||||||
|
ADD AX,BP ;3.30
|
||||||
|
MOV es:STACKAT,AX ;3.30
|
||||||
|
MOV BX,AX ;3.30
|
||||||
|
SUB BX,2 ;3.30
|
||||||
|
;3.30
|
||||||
|
; ZERO THE ENTIRE STACK AREA TO START WITH ;3.30
|
||||||
|
;3.30
|
||||||
|
MOV DI,es:STACKAT ;3.30
|
||||||
|
MOV AX,es:STACKSIZE ;3.30
|
||||||
|
MUL CX ;3.30
|
||||||
|
MOV CX,AX ;3.30
|
||||||
|
xor ax,ax ;3.30
|
||||||
|
push es ;3.30
|
||||||
|
pop ds ;ds = Relocated stack code seg.;3.30
|
||||||
|
assume ds:nothing ;3.30
|
||||||
|
;Now, DS -> stack code area ;3.30
|
||||||
|
MOV ES, word ptr ds:[STACKS+2] ; GET SEGMENT OF STACK AREA.;3.30
|
||||||
|
CLD ;3.30
|
||||||
|
REP STOSB ;3.30
|
||||||
|
;3.30
|
||||||
|
MOV CX, ds:STACKCOUNT ;3.30
|
||||||
|
;3.30
|
||||||
|
; LOOP FOR "COUNT" TIMES, BUILDING A TABLE ENTRY ;3.30
|
||||||
|
; cs = sysinitseg, ds = Relocated stack code seg , es = segment of stack space;3.30
|
||||||
|
; CX = NUMBER OF ENTRIES ;3.30
|
||||||
|
; ES:BP => BASE OF STACKS - 2 ;3.30
|
||||||
|
; ES:BX => FIRST TABLE ENTRY ;3.30
|
||||||
|
;3.30
|
||||||
|
BUILDLOOP: ;3.30
|
||||||
|
MOV ALLOCBYTE,FREE ;3.30
|
||||||
|
MOV INTLEVEL,AL ;AX = 0 ;3.30
|
||||||
|
MOV SAVEDSP,AX ;3.30
|
||||||
|
MOV SAVEDSS,AX ;3.30
|
||||||
|
ADD BX,ds:STACKSIZE ;3.30
|
||||||
|
MOV NEWSP,BX ;3.30
|
||||||
|
MOV ES:[BX],BP ;3.30
|
||||||
|
ADD BP,ENTRYSIZE ;3.30
|
||||||
|
;3.30
|
||||||
|
LOOP BUILDLOOP ;3.30
|
||||||
|
;3.30
|
||||||
|
SUB BP,ENTRYSIZE ;3.30
|
||||||
|
MOV ds:LASTENTRY,BP ;3.30
|
||||||
|
MOV ds:NEXTENTRY,BP ;3.30
|
||||||
|
;3.30
|
||||||
|
push ds ;3.30
|
||||||
|
mov ax, 0f000h ;loook at the model byte ;3.30
|
||||||
|
mov ds, ax ;3.30
|
||||||
|
cmp ds:byte ptr [0fffeh], mdl_convert ;convertible? ;3.30
|
||||||
|
pop ds ;3.30
|
||||||
|
jne Skip_disableNMIS ;3.30
|
||||||
|
;3.30
|
||||||
|
MOV AL,07H ; DISABLE Convertible NMIS ;3.30
|
||||||
|
OUT 72H,AL ;3.30
|
||||||
|
;3.30
|
||||||
|
Skip_disableNMIS: ;3.30
|
||||||
|
XOR AX,AX ;3.30
|
||||||
|
MOV es,AX ;es - SEGID OF VECTOR TABLE AT 0;3.30
|
||||||
|
ASSUME es:NOTHING ;ds - Relocated Stack code segment;3.30
|
||||||
|
;3.30
|
||||||
|
CLI ;3.30
|
||||||
|
;3.30
|
||||||
|
IRP AA,<02,08,09,70> ;3.30
|
||||||
|
;3.30
|
||||||
|
MOV SI,AA&H*4 ;PASS WHERE VECTOR IS TO BE ADJUSTED ;3.30
|
||||||
|
mov di, offset Int19OLD&AA ;we have to set OLD&AA for Int19 handler too.;3.30
|
||||||
|
MOV BX,OFFSET OLD&AA ;PASS WHERE TO SAVE ORIGINAL OWNER POINTER;3.30
|
||||||
|
MOV DX,OFFSET INT&AA ;PASS WHERE NEW HANDLER IS ;3.30
|
||||||
|
CALL NEW_INIT_LOOP ;ADJUST THE VECTOR TO NEW HANDLER, ;3.30
|
||||||
|
; SAVING POINTER TO ORIGINAL OWNER ;3.30
|
||||||
|
ENDM ;3.30
|
||||||
|
;3.30
|
||||||
|
IRP AA,<0A,0B,0C,0D,0E,72,73,74,76,77> ;shared interrupts ;3.30
|
||||||
|
;3.30
|
||||||
|
MOV SI,AA&H*4 ;PASS WHERE VECTOR IS TO BE ADJUSTED ;3.30
|
||||||
|
push ds ;save relocated stack code segment ;3.30
|
||||||
|
lds bx, es:[si] ;ds:bx -> original interrupt handler ;3.30
|
||||||
|
push ds ;3.30
|
||||||
|
pop dx ;dx = segment value ;3.30
|
||||||
|
|
||||||
|
cmp dx,0
|
||||||
|
jz int&AA&_first
|
||||||
|
|
||||||
|
cmp byte ptr ds:[bx],0cfh ;Does vector point to an IRET?
|
||||||
|
jz int&AA&_first
|
||||||
|
|
||||||
|
cmp word ptr ds:[bx.6],424Bh ;Magic offset (see INT&AA, msstack.inc)
|
||||||
|
jz int&AA&_Not_first
|
||||||
|
|
||||||
|
cmp dx,0f000h ;ROM BIOS segment
|
||||||
|
jnz int&AA&_Not_first
|
||||||
|
|
||||||
|
push es
|
||||||
|
push dx
|
||||||
|
mov dx,0f000h
|
||||||
|
mov es,dx
|
||||||
|
cmp bx,word ptr es:0ff01h
|
||||||
|
pop dx
|
||||||
|
pop es
|
||||||
|
jz int&AA&_first
|
||||||
|
|
||||||
|
int&AA&_Not_first: ;Not the first. We are going to hook vector.;3.30
|
||||||
|
pop ds ;3.30
|
||||||
|
mov di, offset Int19OLD&AA ;we have to set OLD&AA for Int19 handler too.;3.30
|
||||||
|
mov BX, OFFSET OLD&AA ;PASS WHERE TO SAVE ORIGINAL OWNER POINTER;3.30
|
||||||
|
MOV DX, OFFSET INT&AA ;PASS WHERE NEW HANDLER IS ;3.30
|
||||||
|
CALL NEW_INIT_LOOP ;ADJUST THE VECTOR TO NEW HANDLER, SAVING;3.30
|
||||||
|
;POINTER TO ORIGINAL OWNER. ;3.30
|
||||||
|
jmp short int&AA&_end ;3.30
|
||||||
|
int&AA&_first: ;the first. Don't have to hook stack code.;3.30
|
||||||
|
pop ds ;3.30
|
||||||
|
int&AA&_end: ;3.30
|
||||||
|
;3.30
|
||||||
|
ENDM ;3.30
|
||||||
|
;3.30
|
||||||
|
push ds ;3.30
|
||||||
|
mov ax, 0f000h ;loook at the model byte ;3.30
|
||||||
|
mov ds, ax ;3.30
|
||||||
|
cmp ds:byte ptr [0fffeh], mdl_convert ;PC convertible? ;3.30
|
||||||
|
pop ds ;3.30
|
||||||
|
jne Skip_EnableNMIS ;3.30
|
||||||
|
;3.30
|
||||||
|
MOV AL,27H ; ENABLE Convertible NMIS ;3.30
|
||||||
|
OUT 72H,AL ;3.30
|
||||||
|
;3.30
|
||||||
|
Skip_EnableNMIS: ;3.30
|
||||||
|
STI ;3.30
|
||||||
|
MOV AX,code ;3.30
|
||||||
|
MOV DS,AX ;3.30
|
||||||
|
ASSUME DS:CODE ;3.30
|
||||||
|
;3.30
|
||||||
|
; MOV SI,OFFSET STKMSG1 ;3.30
|
||||||
|
; CALL WRMSG ;3.30
|
||||||
|
;3.30
|
||||||
|
mov [INT19SEM],1 ; INDICATE THAT INT 19 ;3.30
|
||||||
|
; INITIALIZATION IS COMPLETE ;3.30
|
||||||
|
;3.30
|
||||||
|
POP BP ; RESTORE ALL ;3.30
|
||||||
|
POP SI ;3.30
|
||||||
|
POP DI ;3.30
|
||||||
|
POP DX ;3.30
|
||||||
|
POP CX ;3.30
|
||||||
|
POP BX ;3.30
|
||||||
|
;3.30
|
||||||
|
POP ES ;3.30
|
||||||
|
POP DS ;3.30
|
||||||
|
assume ds:sysinitseg ;3.30
|
||||||
|
POP AX ;3.30
|
||||||
|
RET ;3.30
|
||||||
|
STACKINIT ENDP ;3.30
|
||||||
|
; ;3.30
|
||||||
|
;3.30
|
||||||
|
NEW_INIT_LOOP PROC NEAR ;3.30
|
||||||
|
;INPUT: SI=OFSET INTO VECTOR TABLE OF THE PARTICULAR INT VECTOR BEING ADJUSTED ;3.30
|
||||||
|
; BX=ds:OFFSET OF OLDxx, WHERE WILL BE SAVED THE POINTER TO ORIGINAL OWNER;3.30
|
||||||
|
; DX=ds:OFFSET OF INTxx, THE NEW INTERRUPT HANDLER ;3.30
|
||||||
|
; di=offset value of Int19OLD&AA variable in BIOS. ;3.30
|
||||||
|
; es=ZERO, SEGID OF VECTOR TABLE ;3.30
|
||||||
|
; ds=Relocated Stack code segment ;3.30
|
||||||
|
;3.30
|
||||||
|
MOV AX,es:[SI+0] ;REMEMBER OFFSET IN VECTOR ;3.30
|
||||||
|
MOV WORD PTR ds:[BX],AX ; TO ORIGINAL OWNER in DS ;3.30
|
||||||
|
MOV AX,es:[SI+2] ;REMEMBER SEGID IN VECTOR ;3.30
|
||||||
|
MOV WORD PTR ds:[BX]+2,AX ; TO ORIGINAL OWNER in DS ;3.30
|
||||||
|
push ds ;3.30
|
||||||
|
mov ax, code ;3.30
|
||||||
|
mov ds, ax ;Set Int19OLDxx value in BIOS for ;3.30
|
||||||
|
mov ax,es:[si+0] ;Int 19 handler ;3.30
|
||||||
|
mov word ptr ds:[di],ax ;3.30
|
||||||
|
mov ax,es:[si+2] ;3.30
|
||||||
|
mov word ptr ds:[di]+2,ax ;3.30
|
||||||
|
pop ds ;3.30
|
||||||
|
;3.30
|
||||||
|
MOV WORD PTR es:[SI+0],DX ;SET VECTOR TO POINT TO NEW INT HANDLER ;3.30
|
||||||
|
MOV es:[SI+2],ds ;3.30
|
||||||
|
RET ;3.30
|
||||||
|
NEW_INIT_LOOP ENDP ;3.30
|
||||||
|
;3.30
|
3392
v4.0/src/BIOS/SYSCONF.ASM
Normal file
3392
v4.0/src/BIOS/SYSCONF.ASM
Normal file
File diff suppressed because it is too large
Load Diff
38
v4.0/src/BIOS/SYSIMES.ASM
Normal file
38
v4.0/src/BIOS/SYSIMES.ASM
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
;SCCSID = @(#)sysimes.asm 1.2 85/07/25
|
||||||
|
%OUT ...SYSIMES
|
||||||
|
|
||||||
|
;==============================================================================
|
||||||
|
;REVISION HISTORY:
|
||||||
|
;AN000 - New for DOS Version 4.00 - J.K.
|
||||||
|
;AC000 - Changed for DOS Version 4.00 - J.K.
|
||||||
|
;AN00x - PTM number for DOS Version 4.00 - J.K.
|
||||||
|
;==============================================================================
|
||||||
|
;AN001 D246, P976 Show "Bad command or parameters - ..." msg 9/22/87 J.K.
|
||||||
|
;AN002 P1820 New Message SKL file 10/20/87 J.K.
|
||||||
|
;AN003 D486 Share installation for large media 02/24/88 J.K.
|
||||||
|
;==============================================================================
|
||||||
|
|
||||||
|
iTEST = 0
|
||||||
|
include MSequ.INC
|
||||||
|
include MSmacro.INC
|
||||||
|
|
||||||
|
SYSINITSEG SEGMENT PUBLIC BYTE 'SYSTEM_INIT'
|
||||||
|
|
||||||
|
PUBLIC BADOPM,CRLFM,BADSIZ_PRE,BADLD_PRE,BADCOM,SYSSIZE,BADCOUNTRY
|
||||||
|
; PUBLIC BADLD_POST,BADSIZ_POST,BADMEM,BADBLOCK,BADSTACK
|
||||||
|
PUBLIC BADMEM,BADBLOCK,BADSTACK
|
||||||
|
PUBLIC INSUFMEMORY,BADCOUNTRYCOM
|
||||||
|
public BadOrder,Errorcmd ;AN000;
|
||||||
|
public BadParm ;AN001;
|
||||||
|
public SHAREWARNMSG ;AN003;
|
||||||
|
|
||||||
|
|
||||||
|
;include sysimes.inc
|
||||||
|
include MSbio.cl3 ;AN002;
|
||||||
|
|
||||||
|
SYSSIZE LABEL BYTE
|
||||||
|
|
||||||
|
PATHEND 001,SYSMES
|
||||||
|
|
||||||
|
SYSINITSEG ENDS
|
||||||
|
END
|
2668
v4.0/src/BIOS/SYSINIT1.ASM
Normal file
2668
v4.0/src/BIOS/SYSINIT1.ASM
Normal file
File diff suppressed because it is too large
Load Diff
1624
v4.0/src/BIOS/SYSINIT2.ASM
Normal file
1624
v4.0/src/BIOS/SYSINIT2.ASM
Normal file
File diff suppressed because it is too large
Load Diff
8
v4.0/src/BOOT/BOOT.SKL
Normal file
8
v4.0/src/BOOT/BOOT.SKL
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
:class 1
|
||||||
|
; MESSAGES FOR THE IBM BOOT SECTOR. NUL Terminated.
|
||||||
|
; At this time, for DOS 4.00, we only have maximum 11 bytes left
|
||||||
|
; for translation.!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
|
||||||
|
:use 001 BOOT SYSMSG
|
||||||
|
|
||||||
|
:end
|
25
v4.0/src/BOOT/MAKEFILE
Normal file
25
v4.0/src/BOOT/MAKEFILE
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#******************** makefile for boot *****************************
|
||||||
|
|
||||||
|
msg =..\messages
|
||||||
|
dos =..\dos
|
||||||
|
inc =..\inc
|
||||||
|
hinc =..\h
|
||||||
|
|
||||||
|
#
|
||||||
|
#################### dependencies begin here ############################
|
||||||
|
#
|
||||||
|
|
||||||
|
all: msboot.bin
|
||||||
|
|
||||||
|
boot.cl1: boot.skl \
|
||||||
|
$(msg)\$(COUNTRY).MSG \
|
||||||
|
makefile
|
||||||
|
|
||||||
|
msboot.obj: msboot.asm boot.cl1
|
||||||
|
|
||||||
|
msboot.bin: msboot.obj
|
||||||
|
link msboot;
|
||||||
|
exe2bin msboot.exe msboot.bin
|
||||||
|
dbof msboot.bin boot.inc 7c00 200
|
||||||
|
copy boot.inc $(inc)
|
||||||
|
del boot.inc
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user