MZ is back!

This commit is contained in:
Mark Zbikowski
2024-04-25 21:24:10 +01:00
committed by Microsoft Open Source
parent 8ee9712c74
commit 2d04cacc53
1339 changed files with 527719 additions and 3 deletions

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.

View File

@@ -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.

View File

@@ -0,0 +1,3 @@
cd bin
pound 290 a:bbset.exe a:sm.exe


View File

@@ -0,0 +1,4 @@
c:
cd \bin
pound 800 bbset.exe sm.exe


View File

@@ -0,0 +1,7 @@
c:
cd \bin
cd a:\bin
detach pound 800 bbset.exe sm.exe
detach pound 290 a:bbset.exe a:sm.exe
basica a:prime


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.

View File

@@ -0,0 +1,199 @@
Multi-Tasking MS-DOS
Beta Test Release 1.00
Command Guide
ARENA.EXE - Prints out arena assignments
arena
The system's memory arena is printed out. The
number listed under the owner field is the PID of
the process which owns the memory.
BBSET.EXE - Set and report on behavior bits
bbset [-o] [ {+|-}bitname ... ] fname ...
BBSET sets or clears behavior bits in an .EXE file
header. Multi-Tasking MS-DOS uses the behavior
bits to determine the level of special
compatibility support needed to run the
application.
BBSET will set (if +bitname) or clear (if -
bitname) the named behavior bit(s) from the
specified files. If the -o switch is specified,
BBSET writes a report on the current setting of
all the defined behavior bits to stdout after
making the requested changes.
For a list of behavior bits that BBSET knows
about, type BBSET without any arguments.
COUNTDOW.EXE - Count down a CPU loop
countdown number
Its argument is a number; it counts the number
down to 0, at about a 1hz rate. It prints out
the countdown. Another CPU loop program like
TEXT, but this one terminates when the count
reaches 0
DETACH.EXE - Detaches a child process
detach command [argument ...]
The command given is run as a background process.
Detach prints out the Command Subgroup ID (CSID)
which may be used as an argument to KILL to
terminate the process.
Multi-Tasking MS-DOS Command Guide - Page: 2
HE_DAEM.EXE - Hard error catcher
detach he_daem
Intercepts hard errors, reports them and requests
user action. This should always be run in the
background for now. Put the above command line in
your AUTOEXEC.BAT file if you're not going to use
the Session Manager (SM).
KILL.EXE - send a signal to a process
kill [-nn] [sig=nn] [disp=mm] pid ...
Sends signal nn with disposition mm to processes
mentioned in pid. Defaults to SIGTERM and process
tree disposition.
POUND.EXE - Exercise disk I/O system
pound [t]count filea fileb
Pound reads sequencially through filea and fileb,
reading 512 bytes at a time alternating between
the files on each read. When the end of file is
read the following read for that file begins at
the beginning of the file. If a count is
specified without the preceeding "t" then pound
reads 512 bytes, count number of times from each
file before the program terminates. If "t"
preceeds the count value then the files are read
for count number of seconds before the program
terminates.
SLEEP.EXE - Sleep for a while
sleep sec[.millisec]
Sleep will execute a sleep system call for the
number of seconds and milliseconds specified.
This might be useful in batch files to pause for
an interval as opposed to waiting for a user
response.
SM.EXE - Session manager
sm
Manages multiple processes running on different
screens. Uses initialization file SM.INI. This
Multi-Tasking MS-DOS Command Guide - Page: 3
program includes the hard error catcher, so don't
run HE_DAEM if you're going to use this. See the
file SM.DOC for more information.
TEXT.EXE - Loop and print text
text argument
CPU loops and prints its argument every 2 CPU
seconds or so

View File

@@ -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.

View File

@@ -0,0 +1,67 @@
Multi-Taking MS-DOS
Beta Test Release 1.00
Release Notes
Enclosed you will find Microsoft's first beta release
of Multi-tasking MS-DOS. This version is based upon MS-DOS
Version 2 sources, we will be reimplementing the multi-
tasking enhancements on top of Version 3 sources shortly.
Although we have distributed a bootable disk for the
IBM PC, this package can be adapted to any MS-DOS machine.
Those manufacturers who are designing IBM compatible ROMs,
would be wise to keep multi-tasking in mind. Specifically,
this IBM PC implementation has had to hook out the entire
disk (both floppy and hard disk) ROM code because after he
IBM code set's up the DMA transfer it simply loops in ROM
waiting for the interrupt to occur (routine WAIT_INT).
Problems you may wish to avoid within future ROMs are:
1) loading ES with the physical video RAM location
(label M3)
2) Looping in ROM on Cntrl-NumLock (label K40)
3) No way to add special detecting special key
strokes which a jump out into RAM after reading
the keystroke at KB_INT would avoid
4) Not being able to hook the loading of DS to point
to DATA (EQU 40H) in numerous routines.
Other than these deficiencies the ROM code developed should
be very usable.
By implementing the above suggestions, the size of your
BIOS can be reduced since it will not be necessary to
duplicate functionality in RAM.
More detailed specifications of the device driver
formats will be forth coming. For the time being you will
have to make use of the sample source code for the IBM PC.
If you have further questions please contact Microsoft OEM
customer support through Technical Assist Requests (TAR).
* * * WARNING * * * WARNING * * * WARNING * * *
Each copy of this software distribution has been
individually serialized to facilitate tracing of
unauthorized duplication.
* * * WARNING * * * WARNING * * * WARNING * * *

199
v4.0-ozzie/bin/DISK1/SM.DOC Normal file
View File

@@ -0,0 +1,199 @@
Multi-Tasking MS-DOS
Beta Test Release 1.00
Session Manager
User's Guide
Introduction
The Session Manager(SM) for Multi-Tasking MS-DOS
allows you to run up to six programs at one time and switch
between them with a couple of keystrokes. Each program's
screen is preserved so that it can be restored when you
switch back to it. SM also contains the system-wide, Int24
Handler.
Initialization
The first thing SM does when it is started is look for
any program initialization information you may have. SM
looks for the initialization information in a file named
SM.INI in the current directory. Although recommended, no
initialization information is needed.
There are two types of initialization lines:
1) define <program key> <program name> [program args]
<working directory>
2) start <program key>
"program key" - a printable ascii character, a control
character (^A thru ^^), or a function key (F1
- F10).
"working directory" - a well formed path; i.e., begins
with drive letter (d:\).
Each define line will associate a key with a program.
If there is more than one define line using the same key,
only the information in the last one is used.
A start line is optional. If one exists, the program
associated with the key on the start line is run as soon as
SM finishes initializing. If more than one start line is
given, the last one is used.
This is what a sample initialization file might look like:
define f1 a:\command.com c:\bin\src
define ^z z.exe foo.c a:\foo\bar
start f1
Running the Session Manager
To run Session Manager, just type SM. It does not
require any arguments. If there was a start line in the
Session Manager User's Guide - Page: 2
initialization file, the program associated with the start
key will be run. Otherwise, the SM screen will be displayed
and you will be prompted for input.
The SM screen contains a chart that describes each
defined program's key, status, arguments, and working
directory. There are 3 types of program status:
1) New - the program has never been run.
2) Active - the program has been started.
3) Dead - the program has terminated.
The input choices at this point are to either type a
program key or hit the <ESC> button to enter command mode.
If you hit a program key, the screen associated with that
program will be displayed and the program will
start/continue executing. If this is the first time the
program has been run, a chdir to the program's working
directory is made before it is started. If SM cannot start
the program you desired, the SM screen will reappear.
If the program you chose to run has died, its screen
will still be displayed so that you can check its output.
That is all you can do while in a dead programs screen
except switch back to SM.
To switch back to SM, hit Alt-F10. Alt-F10 is
currently the program key for SM and will be recognized no
matter what other programs are running. This is the only
program key that works this way. All of the others will
only be recognized if SM is running and the SM screen is
being displayed.
Whenever any of SM's children die, their status is
changed to dead. You will see the status change the next
time the SM screen is displayed. If the program using the
current screen dies, you will go back into SM.
Command Mode
When you enter SM's command mode the prompt "SM command or
HELP>" is displayed. The valid SM commands are:
1) INIT <program key>
Initialize the program associated with key so that
it can be run again. The program's status is
changed to "New" and its screen memory is freed.
If the program is active, it is killed before it
is initialized.
2) DEFINE <program key> <program name> [program args]
<working directory>
Define and run a new program using the supplied
information. If the key was previously defined,
redefine it.
Session Manager User's Guide - Page: 3
3) RUN <program key>
Run the program associated with key.
4) RESTART <program key>
Restart the program associated with key. This
like issuing an INIT and a RUN command.
5) KILL <program key>
Kill the program associated with key. Its status
is changed to dead.
6) HELP
Display a help screen.
7) EXIT
Kill all of SM's children and exit SM.
In all of the above commands, "key" is the printable
ascii representation of a programs key. If a command fails,
you will either be asked to enter a new command or placed in
SM's top level.
Session Manager's Int24 Handler
Whenever an Int24 occurs, SM's Int24 handler is called.
No matter what program is using the screen and no matter
which program caused the error, SM's Int24 screen is always
displayed. This screen will contain information on the type
of Int24 that happened, and the name and pid of the program
that caused the error. You will then be prompted for one of
the valid actions for this type of error. After the action
typed in has been taken, you are returned to the screen you
were using before the Int24.

View File

@@ -0,0 +1,2 @@
define F7 a:\command.com a:\
define F8 a:\command.com c:\

View File

@@ -0,0 +1,573 @@
; Termcap description of capabilities:
;ibmans4:mtcon:IBM PC with V4.0 ANSI driver:\
; :al=\E[L:am:bs:ce=\E[K:cl=\E[2J\E[H:cm=\E[%;%H:co#80:\
; :dl=\E[M:do=\E[B:ho=\E[H:li#24:mi:nd=\E[C:\
; :ms:pt:se=\E[m:so=\E[1;36m:up=\E[A:\
; :kb=^h:ku=\E[A:kd=\E[B:kl=\E[D:kr=\E[C:kh=\E[H:kn#8:\
; :k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:\
; :k6=\EP:k7=\EQ:k8=\ER:
CMDTABL DB 'A'
DW CUU ;CUrsor Up
DB 'B'
DW CUD ;CUrsor Down
DB 'C'
DW CUF ;CUrsor Forward
DB 'D'
DW CUB ;CUrsor Back
DB 'H'
DW CUP ;CUrsor Position
DB 'J'
DW ED ;Erase in Display
DB 'K'
DW EL ;Erase in Line
DB 'L'
DW IL ;Insert Line
DB 'M'
DW xDL ;Delete Line
;; DB 'R'
;; DW CPR ;Cursor Postion Report
DB 'f'
DW HVP ;Horizontal and Vertical Position
DB 'h'
DW SM ;Set Mode
DB 'l'
DW RM ;Reset Mode
DB 'm'
DW SGR ;Select Graphics Rendition
;; DB 'n'
;; DW DSR ;Device Status Report
DB 's'
DW SCP ;Save Cursor Position
DB 'u'
DW RCP ;Restore Cursor Position
DB 00
; Graphic Rendition modes: parameter, mask, set
GRMODE DB 00,00000000B,00000111B ; all off
DB 01,11111111B,00001000B ; bold (increased intensity)
DB 04,11111000B,00000001B ; underscore
DB 05,11111111B,10000000B ; blink
DB 07,11111000B,01110000B ; reverse video
DB 08,10001000B,00000000B ; concealed
DB 30,11111000B,00000000B ; foreground colors ...
DB 31,11111000B,00000100B
DB 32,11111000B,00000010B
DB 33,11111000B,00000110B
DB 34,11111000B,00000001B
DB 35,11111000B,00000101B
DB 36,11111000B,00000011B
DB 37,11111000B,00000111B
DB 40,10001111B,00000000B ; background colors ...
DB 41,10001111B,01000000B
DB 42,10001111B,00100000B
DB 43,10001111B,01100000B
DB 44,10001111B,00010000B
DB 45,10001111B,01010000B
DB 46,10001111B,00110000B
DB 47,10001111B,01110000B
DB 0FFH
; Set/Reset Modes: indexed by (SelChar-'<'*8) + (PARAM0 AND 7)
SRMODE DW 0,0,0,0,0,0,0,0 ; SelChar '<'
DW 1,1,1,1,1,1,1,WRAP ; SelChar '='
DW 0,EnaL25,0,0,0,0,0,0 ; SelChar '>'
DW 0,0,0,0,0,0,0,WRAP ; SelChar '?'
PAGE
; The following are duplicates of the same variables from the ROM
;
;* WARNING - the following two variables are accessed as a word
MODE DB 3
MAXCOL DB 79
IF LINE25 ; special treatment of line 25?
maxrow equ 24
ELSE
maxrow equ 25
ENDIF
;* WARNING - the following two variables are accessed as a word
COL DB 0 ; current column
ROW DB 0 ; current row
AnsiState LABEL BYTE ; the following must be saved on a screen swap
WRAP DB 1 ; 0 = NO WRAP, 1 = WRAP
EnaL25 DB 0 ; 0 = 25th line disabled, 1 = enabled
STATE DW S1
SAVCR DW 0 ; saved cursor position
;* WARNING - the following two variables are accessed as a word
SelChar DB 0 ; <,=,> or ? private use indicators
PRMCNT LABEL BYTE ; number of parameters for command
PRMCNTW DW 0
NUMPARAM equ 5 ; max. number of parameters
PARAM DB NUMPARAM DUP (?) ; buffer for command parameters
;* WARNING - the following two variables are accessed as a word
attrw LABEL WORD
ATTR DB 00000111B ;CHARACTER ATTRIBUTE
BPAGE DB 0 ;BASE PAGE
AnsiSize equ ($-AnsiState)
IF (AnsiSize GT TermSize)
.RADIX 0 ; ERROR - Terminal state not big enough
ENDIF
;-------------------------------------------------------------
;
; CHROUT - WRITE OUT CHAR IN AL USING CURRENT ATTRIBUTE
;
base dw 0b800h
screen_seg dw 00000h
chrout: cmp al,13 ; carriage return?
ja outchr
jnz trylf
mov [col],0
;; jmp short setit
jmp setit
trylf: cmp al,10 ; line feed?
jz lf
cmp al,7 ; bell?
jnz trytab
torom:
mov bx,[attrw]
and bl,7
mov ah,14
int 10h
ret5: ret
trytab:
cmp al,9 ; tab?
jnz tryback
mov al,[col]
add al,8
mov ah,al
and ah,7
sub al,ah
cmp al,[maxcol]
jb tunder
mov al,[maxcol]
tunder:
mov [col],al
jmp short setit
tryback:
cmp al,8 ; backspace?
jnz outchr
cmp [col],0
jz ret5
dec [col]
jmp short setit
outchr:
mov bx,[attrw]
mov cx,1
mov ah,9
int 10h
inc [col]
mov al,[col]
cmp al,[maxcol]
jbe setit
cmp [wrap],1
jz outchr1
dec [col]
ret
outchr1:
mov [col],0
lf: cmp [row],(maxrow-1)
ja setit ; on line 25, don't move
jz lf1 ; on 24th line, scroll
inc [row]
jmp short setit
lf1: call scroll
setit: mov dx,word ptr col
mov bh,[bpage]
mov ah,2
int 10h
ret
scroll: mov al,mode
cmp al,2
jz myscroll
cmp al,3
jz myscroll
IF LINE25
xor cx,cx ; from 0,0
mov dh,(maxrow-1) ; to maxrow-1,maxcol
mov dl,maxcol
mov bh,attr
mov ax,0601h ; scroll up one line
int 10h
ret
ELSE
mov al,10
jmp torom
ENDIF
myscroll:
mov bh,[attr]
mov bl,' '
mov bp,80
mov ax,[base]
add ax,[screen_seg]
mov es,ax
mov ds,ax
xor di,di
mov si,160
mov cx,(maxrow-1)*80
cld
; This code will never get executed since we get here when
; mode = 2 or 3 only.
;; cmp cs:[base],0b800h
;; jz colorcard
;; rep movsw
;; mov ax,bx
;; mov cx,bp
;; rep stosw
;; jmp short sret
;;colorcard:
mov dx,3dah
wait2: in al,dx
test al,8
jz wait2
mov al,25h
mov dx,3d8h
out dx,al ;turn off video
rep movsw
mov ax,bx
mov cx,bp
rep stosw
mov al,29h
mov dx,3d8h
out dx,al ;turn on video
sret: push cs
pop ds
ret
CharOut: PUSH AX ; Main entry point
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH ES
PUSH BP
MOV [base],0B800H
XCHG AX,SI ; SAVE CHARACTER TO STUFF
MOV AX,40H ; POINT TO ROS BIOS
MOV DS,AX
MOV AX,DS:[49H] ; AL=MODE, AH=MAX COL
DEC AH ; ANSI NEEDS 0-79 OR 0-39
MOV WORD PTR CS:[MODE],AX ; SAVE MODE AND MAX COL
CMP AL,7
JNZ NOT_BW
MOV WORD PTR CS:[base],0B000H
NOT_BW: MOV AL,DS:[62H] ; GET ACTIVE PAGE
MOV CS:[BPAGE],AL
CBW
ADD AX,AX
MOV BX,AX
MOV AX,DS:[BX+50H] ; AL=COL, AH=ROW
MOV WORD PTR CS:[COL],AX ; SAVE ROW AND COLUMN
MOV AX,DS:[4EH] ; GET START OF SCREEN SEG
MOV CL,4
SHR AX,CL ; CONVERT TO A SEGMENT
PUSH CS
POP DS
MOV [screen_seg],AX
XCHG AX,SI ; GET BACK CHARACTER IN AL
CALL VIDEO
POP BP
POP ES
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
;----------------------------------------------------------
;
; OUTPUT SINGLE CHAR IN AL TO VIDEO DEVICE
;
VIDEO: MOV SI,OFFSET STATE
JMP [SI]
S2: CMP AL,'['
JZ S22
JMP S1
S22: MOV WORD PTR [SI],OFFSET S30
XOR BX,BX
MOV WORD PTR SelChar,BX
MOV WORD PTR PARAM,BX
JMP SHORT S3B
S30: CMP AL,'?' ; experimental use selector (SM/RM)?
JA S7
mov SelChar,al
MOV WORD PTR [SI],OFFSET S3
cmp al,'<'
jae S3B
S3: CMP AL,';'
JNZ S3C
S3A: INC PRMCNT
S3B: CALL GETPTR
XOR AX,AX
MOV WORD PTR [BX],AX ;DEFAULT VALUE IS ZERO
RET
S3C: CMP AL,'0'
JB S3D
CMP AL,'9'
JA S7
CALL GETPTR
SUB AL,'0'
XCHG AL,BYTE PTR [BX]
MOV AH,10
MUL AH ;*10
ADD BYTE PTR [BX],AL ;MOVE IN DIGIT
RET
S3D:
;; CMP AL,'"' ;BEGIN QUOTED STRING
;; JZ S3E
;; CMP AL,"'"
JNZ S7
;;S3E: MOV WORD PTR [SI],OFFSET S4
;; MOV [INQ],AL
S3RET: RET
;
; ENTER QUOTED STRINGS
;
;;S4: CMP AL,[INQ] ;CHECK FOR STRING TERMINATOR
;; JNZ S4A
;; DEC PRMCNT ;TERMINATE STRING
;; MOV WORD PTR [SI],OFFSET S3
;; RET
;;S4A: CALL GETPTR
;; MOV BYTE PTR [BX],AL
;; MOV WORD PTR [SI],OFFSET S4
;; JMP S3A
;
; LOOK FOR ANSI COMMAND SPECIFIED IN AL
;
S7: MOV BX,OFFSET CMDTABL-3
;
S7A: ADD BX,3
CMP BYTE PTR [BX],0
JZ S1B
CMP BYTE PTR [BX],AL
JNZ S7A
;
S7B: MOV AX,WORD PTR [BX+1] ;AX = JUMP ADDRESS
MOV BX,OFFSET PARAM
MOV DL,BYTE PTR [BX]
XOR DH,DH ;DX = FIRST PARAMETER
MOV CX,DX
OR CX,CX
JNZ S7C
INC CX ; if DX=0, CX=1 else CX = DX
S7C: JMP AX ;AL = COMMAND
S1: CMP AL,1Bh ;ESCAPE SEQUENCE?
JNZ S1B
MOV WORD PTR [SI],OFFSET S2
RET
S1B: CALL CHROUT
S1A: MOV WORD PTR [STATE],OFFSET S1
RET
MOVCUR: CMP BYTE PTR [BX],AH
JZ SETCUR
ADD BYTE PTR [BX],AL
LOOP MOVCUR
SETCUR: MOV DX,WORD PTR COL
XOR BX,BX
MOV AH,2
int 10h ; call ROM
JMP S1A
HVP:
CUP:
IF LINE25
CMP CL,(maxrow+1)
jb cup3 ; new row is 24 or less
JA SETCUR ; error - 26 or greater
cmp EnaL25,0 ; else 25, is it allowed?
jz SETCUR
cup3:
ELSE
CMP CL,maxrow
JA SETCUR
ENDIF
MOV AL,MAXCOL
MOV CH,BYTE PTR [BX+1]
OR CH,CH
JZ CUP1
DEC CH
CUP1: CMP AL,CH
JA CUP2
MOV CH,AL
CUP2: XCHG CL,CH
DEC CH
MOV WORD PTR COL,CX
JMP SETCUR
CUF: MOV AH,MAXCOL
MOV AL,1
CUF1: MOV BX,OFFSET COL
JMP MOVCUR
CUB: MOV AX,00FFH
JMP CUF1
CUU: MOV AX,00FFH
CUU1: MOV BX,OFFSET ROW
JMP MOVCUR
CUD: MOV AX,(maxrow-1)*256+1
IF LINE25
cmp ah,[row] ; at bottom of screen?
ja SETCUR
ENDIF
JMP CUU1
SCP: MOV AX,WORD PTR COL
MOV SAVCR,AX
JMP SETCUR
RCP: MOV AX,SAVCR
IF LINE25
cmp ch,maxrow
jb rcp1
cmp EnaL25,0
jz rcp2
ENDIF
rcp1: MOV WORD PTR COL,AX
rcp2: JMP SETCUR
SGR: XOR CX,CX
XCHG CL,PRMCNT
CALL GETPTR
INC CX
SGR1: MOV AL,BYTE PTR [BX]
PUSH BX
MOV BX,OFFSET GRMODE
SGR2: MOV AH,BYTE PTR [BX]
ADD BX,3
CMP AH,0FFH
JZ SGR3
CMP AH,AL
JNZ SGR2
MOV AX,WORD PTR [BX-2]
AND ATTR,AL
OR ATTR,AH
SGR3: POP BX
INC BX
LOOP SGR1
JMP SETCUR
ED:
IF LINE25
cmp row,maxrow ; on 25th line?
je EL ; yes, treat like Erase in Line
ENDIF
xor cx,cx
mov dl,maxcol
mov dh,(maxrow-1)
cmp param,1 ; which subcommand?
ja el2 ; all
jb ed1
mov dh,row ; to beginning
dec dh
jle EL
jmp short ed2
ed1: mov ch,row ; to end
inc ch
cmp ch,dh
jae EL
ed2: mov bh,attr
MOV AX,0600H
int 10h ; call ROM
EL: MOV CX,WORD PTR COL
MOV dx,cx
mov al,param
inc al ; 0,1,2 => 1,2,3
test al,1 ; to end?
je el1
mov dl,maxcol
el1: test al,2 ; to beginning?
je el2
mov cl,0
el2: mov bh,attr
mov ax,0600H
int 10h
S1A_j: jmp S1A
IL: mov ah,7 ; scroll down
jmp short dl1
xDL: mov ah,6 ; scroll up
dl1: mov al,cl ; number of lines
mov ch,row
xor cl,cl
mov dh,(maxrow-1)
mov dl,maxcol
mov bh,attr
int 10h
jmp S1A_j
RM: XOR CL,CL
JMP SHORT SM1
SM: MOV CL,1
SM1: mov bl,SelChar ; get selection character
sub bl,'<' ; adjust
jb S1A_j ; less than '<'
cmp bl,4
jae S1A_j ; greater than '?'
xor bh,bh
shl bx,1
shl bx,1
shl bx,1
MOV AL,DL
CMP AL,7
JA S1A_j
or bl,al
shl bx,1
mov bx,SRMODE[bx] ; get function indicator
cmp bx,1 ; no or special function?
jb S1A_j
jz SM2 ; sets screen mode
MOV [bx],CL
JMP S1A_j
SM2: MOV AH,0
int 10h ; call ROM
JMP S1A_j
; GetPtr - get a pointer to the current parameter
GETPTR: MOV BX,PRMCNTW
CMP BX,NUMPARAM
JB GET1
DEC PRMCNT
JMP GETPTR
GET1: ADD BX,OFFSET PARAM
RET

View File

@@ -0,0 +1,20 @@
ibmbio.obj: ibmbio.asm defdbug.inc bugcode.inc
masm ibmbio;
ibmmtcon.obj: ibmmtcon.asm ansi.inc defdbug.inc
masm ibmmtcon;
ibmdsk.obj: ibmdsk.asm defdbug.inc
masm ibmdsk;
sysini.obj: sysini.asm dossym.inc devsym.inc syscalls.inc
masm sysini;
sysimes.obj: sysimes.asm
masm sysimes;
ibmbio.exe: ibmbio.obj ibmmtcon.obj ibmdsk.obj sysini.obj sysimes.obj
link ibmbio ibmmtcon ibmdsk sysini sysimes,ibmbio,ibmbio/map;
ibmbio.com: ibmbio.exe
exe2bin ibmbio ibmbio.com

Binary file not shown.

View File

@@ -0,0 +1,553 @@
;*** Bugcode.inc - Debug code for including into sysini.asm and ibmbio.asm
;
; Can't link in via buglib due to memory and relocation games played
; by these modules. Each gets a private, local-only copy of these
; modules.
IFDEF DEBUGFLG
;** DPRINTF _ Debug Printf
;
; Dprintf is a kernel debug print formatting package. It is intended
; to produce conviently formatted output.
;
; Dprintf is called, indirectly, by a macro:
;
; DEBUG n,m,"string",<a1,...,an>
;
; string = format string
; a1 = first argument
; an = last argument
;
; The format string is an ASCIZ string which can contain 2 types of
; specifications: data-format specifications and literal characters.
; Data format specifications always begin with a '$' character; all
; characters not part of a data format specification are treated as
; literal characters.
;
; Literal characters
; - any character not part of a format specification. Special
; non-printing characters are:
; \n - CRLF
; \t - tab
; \b - bell
; \\ - \
; \$ - $
;
; Format Specifications
;
; A format specification takes the form:
; $ [@] <char>
;
; where <char> =
;
; x - print argument as a hex word
; d - print argument as decimal word
; c - print argument as ascii character
; b - print argument as hex byte
; For each of the above formats, the supplied argument
; is a 16-bit word - the value to be printed. The optional @
; (described below) allows a segmented address to be supplied,
; instead.
;
; s[nn] - print argument as asciz string; if optional decimal
; argument follows the format character this specifys
; a maximum string length. Non printing characters are
; printed in the form \nnn where "nnn" is the octal byte
; value.
; Note that this format character cannot be directly
; followed by a digit unless that digit is to be taken
; as the start of a length argument.
;
; Bnn - print argument as hex bytes. The required following
; decimal argument is the number of bytes to print.
;
; Both of these formats take a long address as their argument.
; The '@' character is thus invalid for these formats.
;
; WARNINGS
; As befitting a debug routine, DPRINTF does not have a whole lot
; of "failsafe" code in it. Supplying screwed up formats can
; muck things up. Specifically:
; The @ argument must NOT be specified with the 's' or 'B'
; format
; A string/byte-length argument of 0 is taken as 65536
; The string "%% BAD FMT %%" appears in the output when
; 1) an illegal format specifier is given, or
; 2) the B format is given a 0 or missing length
;
; ENTRY (sp+n ) = address of format string (offset from return cs value)
; (sp+n-2) = first argument word
; (sp+n-4) = second argument word
; .
; (sp+4 ) = last argument word
; (sp+2 ) = seg of return address
; (sp ) = offset of return address
; (bp) = offset of format string on the stack
; EXIT none
; USES flags
PUBLIC DPRINTF
DPRINTF PROC near
push ds
push es
push bp
push di
push si
push dx
push cx
push bx
push ax ; save registers
cld
mov si,[bp] ; get address of format string
sub bp,2
mov bx,sp
mov ds,ss:20[bx] ; (ds:si) = address of format string
push cs
pop ds
; Scan format string for next character
;
; (ds:si) = address of format string
; (ss:bp) = address of next argument
dpf1: lodsb ; (al) = format string byte
and al,al
je dpf3 ; all done
cmp al,'$'
je dpf4 ; is data escape
cmp al,'\'
jnz dpf2 ; got the character
; it's an "\" escape code - crack the argument character
lodsb
and al,al
je dpf3 ; all done, ignore hanging \
xchg ah,al
mov al,0Ch
cmp ah,'n'
jne dpf1$5 ; not \n
mov al,0dH
call putchar
mov al,0aH
jmp SHORT dpf2 ; print LF
dpf1$5: cmp ah,'t'
mov al,9
je dpf2 ; is \t
cmp ah,'b'
mov al,7
je dpf2 ; is \b
xchg ah,al
dpf2: call putchar
jmp dpf1
; have the end of the format string - exit
dpf3: pop ax
pop bx
pop cx
pop dx
pop si
pop di
pop bp
pop es
pop ds
ret
;* Have a '$' character - is data format escape
;
; Get address of data into es:di
;
; (bp) = address of data value
dpf4: mov di,bp
push ss
pop es ; (es:di) = address of data value
sub bp,2 ; point to next argument
lodsb ; (al) = format specifier
cmp al,'@'
jne dpf5 ; not an indirect flag
les di,[bp]
sub bp,2 ; have an extra 2 for @
lodsb
dpf5: cmp al,'x'
jne dpfd1 ; not 'x'
; is 'x' format - print hex word
mov ax,es:[di]
call THW ; type hex word
jmp dpf1
dpfd1: cmp al,'d'
jnz dpfc1 ; not 'd'
; is 'd' format - print decimal word
mov ax,es:[di]
call TDW ; type decimal word
jmp dpf1
dpfc1: cmp al,'c'
jne dpfb1
; is 'c' format - print character
mov al,es:[di]
call putchar
jmp dpf1
dpfb1: cmp al,'b'
jne dpfs1
; is 'b' format - print hex byte
mov al,es:[di]
call THB ; type hex byte
jmp dpf1
dpfs1: cmp al,'s'
jne dpfbb1
; is 's' format - print ASCIZ string. First, check for
; optional decimal limit
public SSB
SSB: sub cx,cx ; set 65536 limit
les di,[bp] ; (es:DI) = fwa of string
sub bp,2 ; argument to 's' was two words
mov al,[si]
cmp al,'0'
jb dpfs2 ; not decimal
cmp al,'9'
ja dpfs2 ; not decimal
call atod ; (ax) = decimal value, (ds:si) updated
xchg cx,ax
; print asciz string at es:di, max of (cx) characters
; (cx) = 0 means max of 65536
;
; Other sections of code in dpf jump here to print strings
dpfs2: mov al,es:[di]
inc di
and al,al
je dpfs3
call putchar
loop dpfs2 ; continue if not at limit
dpfs3: jmp dpf1
dpfbb1: cmp al,'B'
je dpfbb2 ; is 'B' format
; error in format code - print message
dpferr: push cs
pop es
mov di,OFFSET dpfa ; (es:di) = error message
sub cx,cx
jmp dpfs2
dpfa: DB '%% BAD FMT %%',0
; have B format
dpfbb2: call atod ; (ax) = length specifier
jc dpferr ; number not there - error
xchg cx,ax
jcxz dpferr ; number is 0 - error
les di,[bp] ; (es:DI) = fwa of string
sub bp,2 ; argument to 's' was two words
dpfbb3: mov al,es:[di]
call THB ; type hex byte
mov al,' '
call putchar ; space em out
inc di
loop dpfbb3 ; do em all
jmp dpf1
DPRINTF ENDP
;** THB - Type Hex Byte
;
; THB types a hex byte (via "putchar")
;
; ENTRY (AL) = byte
; EXIT none
; USES ax, flags
THBA DB '0123456789abcdef'
PUBLIC THB
THB PROC near
push ax
shr al,1
shr al,1
shr al,1
shr al,1
and ax,0fH
xchg bx,ax
mov bl,CS:THBA[bx]
xchg ax,bx
call putchar ; put first character
pop ax
and ax,0fH
xchg bx,ax
mov bl,CS:THBA[bx]
xchg ax,bx
call putchar
ret
THB ENDP
;** THW - Type Hex Word
;
; THW types a word in hex (via "putchar")
;
; ENTRY (AX) = word
; EXIT none
; USES AX, flags
PUBLIC THW
THW PROC near
push ax
xchg ah,al
call THB
pop ax
call THB
ret
THW ENDP
;** TDW - Type Decimal Word
;
; TDW types (via "putchar") the unsigned decimal representation
; of a 16-bit unsigned integer. Only significant digits are
; printed; if the number is 0 a "0" is printed.
;
; ENTRY (AX) = number
; EXIT none
; USES AX, flags
PUBLIC TDW
TDW PROC near
push cx ; preserve registers
push dx
mov cx,10
call tdw$ ; recurse cracking digits
pop dx
pop cx
ret
TDW ENDP
;* tdw$ - crack number recursively
;
; tdw$ cracks the least significant decimal digit. If there
; are no higher-significant digits, print and return.
; else, recurse for higher digits
;
; (AX) = value
; (CX) = 10
tdw$ PROC NEAR
sub dx,dx
div cx ; (ax) = quotient, (dx) = remainder
and ax,ax
jz tdw$1 ; this is highest-order, do it
push dx
call tdw$
pop dx
tdw$1: xchg ax,dx
add al,'0'
call putchar
ret
TDW$ ENDP
;** ATOD - Convert ASCII string to decimal number
;
; ATOD is called to convert an ascii string of digits to a
; decimal number. Digits are converted until we run out of them.
;
; ENTRY (DS:SI) = address of first digit
; EXIT 'C' clear if OK
; (AX) = value
; (SI) updated to first non-digit
; 'C' set if error - no digits, or result >65535
; (DS:SI) points to error character
; USES AX, SI, FLAGS
PUBLIC ATOD
ATOD PROC near
push dx
push cx ; save registers
mov al,[si]
sub al,'0'
jc atod9 ; error - no digits
cmp al,10
cmc
jc atod9 ; error - no digits
sub ax,ax ; clear accumulator
mov cx,10 ; base 10
; crack next digit
;
; (AX) = number accumulated so near
; (CX) = 10
; (DS:SI) = next character
atod1: xchg dx,ax ; keep accum in dx for a while
lodsb ; (al) = character
sub al,'0'
jc atod7 ; not digit - all done
cmp al,9
ja atod7 ; not digit - all done
sub ah,ah ; (ax) = digit value (0 - 9)
push ax
xchg ax,dx
mul cx ; (ax) = 10*accum
pop dx ; (dx) = digit to add
jo atod8 ; overflow
add ax,dx
jmp atod1 ; go back for more
; Done with number, all OK
;
; (dx) = number
; (ds:si) = address+1 of first unused character
atod7: clc
; Done with number, error
; 'C' set
atod8: dec si ; backup over non-decimal (or error) char
atod9: pop cx
xchg ax,dx ; (ax) = number iff no error
pop dx ; restore registers
ret ; exit
ATOD ENDP
;** putchar - put a character on the console
;
; ENTRY (al) = character
; EXIT none
; USES ax,flags
UR_DAT = 02f8H ; COM1 = 03f8H, COM2 = 02f8H
UR_IEN = UR_DAT+1 ; Interrupt enable
UR_IER = UR_DAT+2 ; interrupt ID
UR_LCR = UR_DAT+3 ; line control registers
UR_MCR = UR_DAT+4 ; modem control register
UR_LSR = UR_DAT+5 ; line status register
UR_MSR = UR_DAT+6 ; modem status regiser
UR_DLL = UR_DAT ; divisor latch least sig
UR_DLM = UR_DAT+1 ; divisor latch most sig
iflag DB 0 ; != 0 when initialized 8250
;* inchr - input character
;
; EXIT 'z' set if no character
; 'z' clear if char
; (al) = char
inchr: mov dx,UR_LSR
in al,dx
and al,1
jz inchr1
mov dx,UR_DAT
in al,dx
and al,07fh
inchr1: ret
PUBLIC putchar
putchar PROC NEAR
pushf
cli
push dx
push cx
push bx
push ax ; (al) = character
test iflag,255
jnz putc1 ; is initialized
inc iflag
; program the usart
mov dx,UR_LCR
mov al,80h
out dx,al ; command it
sub al,al
mov dx,UR_DLM
out dx,al
mov dx,UR_DLL
mov al,12 ; 9600 baud = 12, 19.2 Kbaud = 6
out dx,al
mov al,3
mov dx,UR_LCR
out dx,al ; command normal mode
; see if CTL-Q or CTL-S
putc1: pushf
cli
call inchr
jz putc3 ; no characters incomming
cmp al,19 ; ctl-S?
jnz putc3 ; no, ignore
; have ctl-s. wait till we see ctl-Q
putc2: call inchr
jz putc2
cmp al,17
jnz putc2
putc3: popf
mov dx,UR_LSR
putc4: in al,dx
test al,020h
jz putc4
; ready. crank it out!
mov dx,UR_DAT
pop ax
out dx,al
pop bx
pop cx
pop dx
popf
ret
putchar ENDP
ENDIF

View File

@@ -0,0 +1,122 @@
;** DEFDBUG.ASM - Debugging Macro Definitions
;
;
; DEBUG n,m,<format string>, <arg list>
;
;
.sall
DEBUG MACRO N,M,string,args
local b,c
IFDEF DEBUGFLG
pushf
DEBUGTST N,M
jz b
push ax
push bp
call c ;; push address of string
DB '&string',0
c: mov bp,sp
; IFNB <args>
IRP Y,<args>
IFIDN <Y>,<ax>
push 4[bp]
ELSE
IFIDN <Y>,<AX>
push 4[bp]
ELSE
IFIDN <Y>,<bp>
push 2[bp]
ELSE
IFIDN <Y>,<BP>
push 2[bp]
ELSE
mov ax,Y
push ax
ENDIF
ENDIF
ENDIF
ENDIF
ENDM
; ENDIF
call DPRINTF
mov sp,bp
pop ax ;; discard format string offset
pop bp
pop ax
b: popf
ENDIF
ENDM
;** ERRNZ - generate assembly error if arg != 0
;
ERRNZ MACRO EXPR
IF1
IFE expr
ELSE
RADIX 0 ; CONDITION NOT MET - ERROR
ENDIF
ENDIF
ENDM
;** DBBEG - Start debugging range
;
DBBEG MACRO N,M
LOCAL lab
IFDEF DEBUGFLG
pushf
DEBUGTST N,M
jnz lab ;; am to do it
DBJMP %DBCNT
lab:
ENDM
DBJMP MACRO N
jmp DBLAB&N
ENDM
;** DEBUGTST - Test Debug Flags
;
; DEBUGTST n,m
;
; Where N and M are bit masks.
;
; If one or more of the bits in N is set in the high byte
; of BUGBITS, and one or more of the bits in M is set in
; the low byte of BUGBITS then clear the Z flag.
;
; In other words:
;
; If both masks show a "hit" clear 'Z' else set 'Z'
;
; USES FLAGS
DEBUGTST MACRO N,M
LOCAL A
test BYTE PTR BUGBITS,n
jz A
test BYTE PTR BUGBITS+1,m
A:
ENDM
DBEND MACRO
DBLAB %DBCNT
DBCNT = DBCNT+1
popf
ENDM
DBLAB MACRO N
DBLAB&N:
ENDM
DBCNT = 1

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.

View File

@@ -0,0 +1,25 @@
29 May 1984
The object files given here are sufficient to create the BIOS
for the IBM system. Some sources are given as examples for
OEM supplied device drivers. These sources do not necessarily
implement all the features described in the device driver
documentation. They have evolved in parallel with the
documentation, so some features described in the documentation
may not yet be present in the drivers. Below is a summary of
the files supplied:
read_me This file.
ibmbio.asm Main body of the BIOS.
ibmdsk.asm Floppy and Hard disk drivers.
ibmmtcon.asm Multi-screen console driver.
ansi.inc ANSI X3.64 terminal emulation.
bugcode.inc Module which implements debugging
prints. The routine PUTC must be
modified for other devices. See
also the file DEFDBUG.INC.
sys*.obj The SYSINIT program. No source supplied.
biosobj.mak Contains instructions for building the
IBM BIOS.
bootpach.exe Modifies a V2.0 boot sector (on A:) for
the IBM to accomodate the larger BIOS.

Binary file not shown.

Binary file not shown.

BIN
v4.0-ozzie/bin/DRDOS1.IMD Normal file

Binary file not shown.

Binary file not shown.

BIN
v4.0-ozzie/bin/DRDOS2.IMD Normal file

Binary file not shown.

Binary file not shown.