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">
|
||||
|
||||
# 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
|
||||
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,5 @@
|
|||
date
|
||||
time
|
||||
prompt $p$g
|
||||
path a:\bin;a:\
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,3 @@
|
|||
cd bin
|
||||
pound 290 a:bbset.exe a:sm.exe
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
c:
|
||||
cd \bin
|
||||
pound 800 bbset.exe sm.exe
|
||||
|
|
@ -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
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
buffers = 40
|
||||
files = 20
|
||||
break=on
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -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 * * *
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -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.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
define F7 a:\command.com a:\
|
||||
define F8 a:\command.com c:\
|
|
@ -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
|
|
@ -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
|
Binary file not shown.
|
@ -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
|
|
@ -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
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
@ -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.
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
;
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -0,0 +1 @@
|
|||
70
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
msbio1+
|
||||
msCON+
|
||||
msAUX+
|
||||
msLPT+
|
||||
msCLOCK+
|
||||
msDISK+
|
||||
msBIO2+
|
||||
mshard+
|
||||
msinit+
|
||||
sysinit1+
|
||||
sysconf+
|
||||
sysinit2+
|
||||
sysimes,msbio,msBIO/M;
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -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
|
|
@ -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