mirror of
https://github.com/microsoft/MS-DOS.git
synced 2026-06-12 15:36:59 +01:00
MZ is back!
This commit is contained in:
committed by
Microsoft Open Source
parent
8ee9712c74
commit
2d04cacc53
@@ -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.
Reference in New Issue
Block a user