Manx Aztec C86 v5.2a

This commit is contained in:
davidly 2024-07-02 08:25:54 -07:00
parent 7addaf4bad
commit 1a1aaf034e
506 changed files with 153213 additions and 0 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

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,4 @@
path %PATH%;c:\ntvdm\az86\bin
set CLIB=c:\ntvdm\az86\lib\libs\
set INCLUDE=c:\ntvdm\az86\include
set AZTEC=c:\ntvdm\az86\bin

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,58 @@
Changes to AHEX:
1/16/92
- ahex was using wrong memory model for stricmp()
- when path was specified on file to be hexed, ahex generated an invalid
name for a temporary file.
- cleaned up log of ahex messages.
1/23/92
- added support to ahex for separation of binary output to odd and even
bytes.
1/27/92
- added support for splitting binary files into ROM-sized chunks.
- Got rid of the fluff reporting stuff - it got in the way too much! It
can be re-enabled by #define'ing MSDOS, if need be.
- Added warning:
WARNING: Segment '%s' in the input file not specified in order list.
for when the -a or -s options are used and a segment is found which
isn't on the list. It does not warn about 0-length segments or the
_bss segment, which should cut down on spurious warnings (however,
spurious warnings of this type can still occur on occasion).
3/5/92
I was angrered by ahex's poor design, and so sent devastating rains for 40
days and 40 nights to deluge the source code and render it unusable.
After the waters resided, a new ahex rose from the destruction, and lo!, it
was good.
- When in non-ICE mode, ahex acts like a mini-locator, locating
segments and classes with ROM.
- Option syntax based on aloc syntax.
4/9/92 ---------------------- Released v5.2a beta 1 ------------------
8/14/92 conv_to_hex() *jd
ahex was outputting screwy data after putting out extended address record,
because counter not being reset.
8/27/92 add_extension() *jd
ahex was not generating correct extension when input file specified a
path using dots (e.g. ..)
8/27/92 conv_to_hex() *jd
ahex output extended addr record after each 65535 bytes, not 65536.
8/27/92 conv_to_hex() *jd
ahex was not deleting its temporary file
8/31/92 layout.c *jd
ahex did not properly handle segments whose memory address was 0

View File

@ -0,0 +1,85 @@
Changes to ALN:
10/12/91
1) LNR would put out a bad .lnk file when it encountered static data
(i.e., data declared with the 'static' keyword in C). When the bad
.lnk file was given to aloc, aloc would abort with a fatal error.
2) LNR would abort if it was given more than ~17 files to link.
3) In some situations LNR would put out a bad .lnk file if RDB debugging
information was desired, which aloc would subsequently reject.
10/22/91
4) LNR would exit w/ an error if it encountered control characters in
a -f file (including ^Z, which some editors put out at the end of a
file).
11/19/91 mapfile.c *jd
lnr was only outputting \n to map file, not \r\n.
added code to pm_putchar to add the \r when passed \n.
11/20/91 debug.c *mks
lnr was putting out bad index fields in the debugging records
1/10/92 MWS
Changed name from lnr to aln to be consistent with the rest of the
ROM tools. So, we've now got aln, aloc, and ahex.
1/16/92 azpass2.c MWS
Modified expression fixup code so that SUB expressions with
two symbols will work. i.e.:
Expr SUB
GBLSYM 0, endtbl
GBLSYM 1, ledxref
The only reason this works is because SUBS of this type always turn
out to be constants. In other words, the #$%!@ assembler should be
doing this itself.
2/10/92 pass1.h MWS
Modified 'Data_seg' segment definition to reserve 2 bytes at the beginning
of the Data group. This makes it easier to catch NULL-pointer write
bugs, and also matches what ln does.
4/9/92 ------------------ Released v5.2a beta 1 ---------------------
8/26/92 omffile.c jd
changed omfinit() to compute acbp field in segdef records, so that
segment alignment codes work
8/28/92 alnmain.c jd
When generating output file name from first input name that includes
a path having dots (e.g. ../foo.o), aln didn't generate correct output
name.
9/3/92 pass1.h *jd
aln leaves 2 unused bytes at beginning of _data (aka dataseg) segment,
but wasn't adjusting size of segment for those bytes
10/4/92 ------------------ Released v5.2a beta 2 ---------------------
10/12/92 jd: link.h
aln was creating invalid fixup records, because it was creating LEDATA
records that were longer than the maximum 1024 byte length.
10/12/92 jd: seglook()
aln was not gathering together segments in the same class, but this
is required by rdb (it expects all code symbols to be grouped together
in the .dbg file, followed by the data symbols). aloc could handle
this separation of segments, but not rdb.
10/19/92 jd: getval()
aln was not correctly processing the DATAREF, CODEREF, and BSSREF
loader items, which are generated when sqz optimizes the object module
libraries.
10/28/92 jd: omf_fixup()
aln was not generating the correct offset for a fixup record that
referenced the first data bytes of the previous LEDATA record
11/10/92 jd: outrecord(), omf_fixup(), outbyte(), RecordAlmostFull()
Added code to flush omf record buffer when it's almost full

View File

@ -0,0 +1,23 @@
Changes to AS:
4/9/92 ------------- Released v5.2a beta 1 --------------------
6/4/92 jd
changed EVEN directive to output NOP opcode instead of 0.
8/3/92 jd
definition of record instance could not specify a number
as a field override.
9/10/92 jd: maktrm()
assembler was counting two fixups for the expr "seg myseg", where myseg
is a segment or group. Also for statement "dd myseg".
9/23/92 jd: options
-o option didn't work when using -f option to generate OMF
10/4/92 ---------------- Released v5.2a beta 2 ----------------------------
10/5/92 jd: execvp()
Relinked 'as' to use fixed execvp() - previous execvp() didn't always
correctly search all directories specified in PATH.

View File

@ -0,0 +1,111 @@
Changes to CC:
1/9/92 MWS
Added -x option to generate function prototypes in the compiler.
Look for references to the OutProtos flag to see the relevant code.
1/12/92 MWS
Added -w option to generate preprocessed source file (i.e., it just
preprocesses the input file and writes out the result). Look for
references to the OutPrep flag to see the relevant code.
1/16/92 MWS
Added -f option to compiler to generate prototypes for static functions.
The -x option now generates prototypes only for non-statics.
1/16/92 MWS
Kludged autoprototyping code to distinguish between INT and SHORT
types. Look for OutProtos being OR'd with 4 in the code to see
what's going on.
4/9/92 -------------- Released v5.2a beta --------------------------
4/21/92 jd: print_asm_line()
%% in inline assembler was trashing chrcls table.
4/21/92 jd: makquest() and doif()
added checks for condition of type void for if() statement
and ?: operator.
9/8/92 jd:
cc was not generating correct prototype for a function's union argument.
9/9/92 jd: ptype() & declsym()
cc was not generating correct prototype for a function that returned
a long or ulong.
cc didn't generate correct prototypes when program was compiled to use
large data memory model.
9/11/92 jd: cinit()
cc didn't allow static initializations like
long a = (long)"b";
9/11/92 jd: multidef() refs&def
cc put out screwy msg for multi-defined symbols
9/14/92 jd: pbstring()
__FILE__ macro was wrong if input filename had backslashes.
9/14/92 jd: decllist()
cc didn't report error if struct or union had multidefined symbol.
9/14/92 jd: options(), makcall()
Added -m option to issue warning if a function is called without a
prototype for it being in scope.
9/15/92 jd: peek(), pushback(), token()
cc didn't accept "struct mystr far" but did accept "far struct mystr".
9/15/92 cm: fixed earlier
cc didn't report error but generated bad code for:
void f(void);
...
if (f())
...
9/15/92 jd: addfunc()
cc didn't report error for declaration of huge function, but generated
near calls to it. Now treating such decls as an error.
9/15/92 jd: verror.c
error msg 157 applies to data as well as functions.
9/16/92 jd: cinit()
Don't allow initialization of static ptr to auto:
m(){int i; static int *ip=&i;}
9/16/92 cm: fixed earlier
cc gave error 86 "null dimension in array" for
typedef int arr[];
9/17/92 jd: newfunc()
cc generated bad debug record for:
f(long){}
9/23/92 jd: options(), etc
-o option didn't work when using +j option to generate OMF
9/23/92 jd: bmain.c, cstat.c
Changed cc so that both -x and -f can be specified at once, to get
prototypes for both static and global functions.
10/4/92 ---------------- Released v5.2a beta 2 ----------------------------
10/5/92 jd: execvp()
Relinked 'cc' to use fixed execvp() - previous execvp() didn't always
correctly search all directories specified in PATH.
10/6/92 jd: cinit()
cc v4.10d allowed aggregate initializers to have nothing between the braces,
which allowed cc to do the correct thing for:
struct str { char a[5], b[5], c[5]} mystr = { {}, {}, "abc" };
The v5.2a cc did not allow this, in conformance with ANSI. The compiler
has been changed so that this is disallowed when in strict ANSI mode
(i.e. compiler with -ansi), and allowed otherwise.
10/26/92 jd: newfunc()
when generating prototypes, cc did not correctly handle functions defined
using the new syntax (e.g. void f(int a){} instead of void f(a)int a;{} )

View File

@ -0,0 +1,53 @@
Changes to CGEN:
4/9/92 ---------- Released v5.2a beta 1 ---------------------
9/2/92 trailer() *jd
Added +t option to force $$var's (used for far data items) into codeseg
instead of dataseg.
9/11/92 starregs() *jd
Bad code generated for:
int a; huge struct mystr {int i,k,j;} *mp;
m() { a = mp->j; a = mp->i; }
9/14/92 gencast() *jd
When a null ptr was cast from near to far, result was not null (it was ds:0)
9/15/92 jd: outoper()
For the following:
(*(far void(*)())0x12345678L)()
cgen generated far call to 5678h, not 0x12345678.
9/16/92 jd: genstr()
For some structure copying, cgen generated bad code, because it
always prepared right side first, even if left was more complex.
Changed cgen to do hardest side first.
9/16/92 jd: templ.inp
For addition of constant to a huge pointer, compiler wasn't generating
extrn references to $hadd. For inc of huge ptr, it wasn't generating
extrn ref to $hinx.
10/4/92 ---------------- Released v5.2a beta 2 ----------------------------
10/5/92 jd: execvp()
Relinked 'cgen' to use fixed execvp() - previous execvp() didn't always
correctly search all directories specified in PATH.
10/22/92 jd: EvalRightFirst()
For some expressions, cgen was dereferencing a null pointer, causing
random areas of memory to be modified
10/22/92 jd: gencast()
The check for a null pointer in a cast of a near pointer to far
does not always have to be done. cgen was modified so that if the
near pointer is guarenteed not to be null, the check is not done,
thus saving space.
10/23/92 jd: outstatic()
cgen was putting near static uninitialized variables in the data
segment, not the bss segment, thus increasing the size of the data
seg.

View File

@ -0,0 +1,8 @@
Changes to hex86:
4/9/92 ------------- Released v5.2a beta 1 ------------------------
5/10/92 jd
When generating a jump instruction at reset vector for system in which
odd bytes are in one set of ROMs and even bytes in another, HEX86
put the jump instruction at the wrong address

View File

@ -0,0 +1,10 @@
Changes to LN:
11/25/91
Linker was mixing calls to sbrk and malloc, resulting in linker incorrectly
reporting 'out of memory' error messages
4/9/92 ---------- Release v5.2a beta 1 -----------------------
10/2/92
One minor bug fixed related to parsing of command line arguments.

View File

@ -0,0 +1,28 @@
Changes to ALOC:
10/22/91
ALOC would exit w/ an error if it encountered control characters in
a -f file (including ^Z, which some editors put out at the end of a
file).
11/19/91 mapfile.c *jd
aloc was only outputting \n to map file, not \r\n.
added code to pm_putchar to add the \r when passed \n.
4/9/92 -------------------- Released v5.2a beta 1 ---------------------
8/14/92 getinfo.c *jd
aloc was incorrectly computing the address of _Uend.
8/28/92 locmain.c jd
When generating output file name from first input name that includes
a path having dots (e.g. ../foo.lnk), aloc didn't generate correct output
name.
10/4/92 -------------------- Released v5.2a beta 2 ---------------------
10/9/92 jd: getinfo.c
+JUMP created reset code in segment named _RESET_CODE, but ahex was
looking for it in segment named RESET_CODE, so ahex was not correctly
positioning it in ROM.

View File

@ -0,0 +1,27 @@
Changes to MAKE:
1/5/89
changed stksiz.c:
increased stack size from 4kb to 6kb,
and decreased stack red zone size from 2kb to 1kb.
(customer was getting STACK OVERFLOW message)
11/26/90 *jd
relinked make to use croot that treats quoted strings as a single arg.
6/3/91 make.c *jd
allow rules that consist of just dependencies, no commands. e.g. a makefile
that is just
clib: hello.o
4/9/92 --------------- Released v5.2a beta 1 ---------------------
8/28/92 jd
make didn't correctly handle makefiles that ended in ctrl-z. Fixed bug
in c.lib and rebuilt make.
9/9/92 jd
make wasn't testing for malloc failure.
10/4/92 --------------- Released v5.2a beta 2 ---------------------

View File

@ -0,0 +1,102 @@
8/19/90
token() wasn't handling macro expansion correctly. body must be
unget()-ed from last to first, not first to last.
bpchk() wasn't recognizing conditional breakpoints - setting Mptr
to condition doesnt cause gch() to get the condition's chars.
?/?/91
added -a option to rwdb's 'lp' command, for loading absolute symbols
7/16/91
added +i command to wdb and rwdb to allow stepping into int handler
1/27/92 MWS
Changed default absolute Intel OMF file extension from ".omf" to
".loc", to match how other Aztec tools work.
2/10/92 MWS \windpro\hype\src\dispnode.c
Changed hypertext system to look for an environment variable named
'AZTEC' to find help files. It does this _last_, after all its other
gyrations.
4/9/92 --------------- Released v5.2a beta 1 ----------------------------
9/21/92 jd: woption.c
On some systems, mouse wouldn't go below line 25 when in 50-line mode.
9/22/92 jd: reg_mod()
sdb didn't allow 'r' command to take parameter; e.g. "r ip=.4"
9/22/92 jd: parse()
If typed-in command contained invalid expression, sdb displayed error
msg on user screen, not on sdb's screen.
9/22/92 jd: draw_thumbs()
If mouse was in source or message window when command was typed, mouse
disappeared and didn't reappear until it was moved.
9/25/92 jd: remote/monomf.c
When downloading omf file, rdb sent too many bytes.
9/28/92 jd: wbpexpr.c
Counldn't set an Expression True breakpoint from dialog box.
9/28/92 jd: wmemops.c
With multiple memory dump windows open, each one's 'set options' dialog
box showed same values, which were those set last.
9/28/92 jd: getch()
Couldn't read in a program's macro (.mac) file or redirect command input
to a disk file.
9/28/92 jd: remote/monexec.c
When rdb was loading a program's symbols in response to an 'ls' command,
it didn't load the program's macros; and when quitting it didn't save
the program's macros to a .mac file.
9/28/92 jd: IsEGA()
To see if host system has EGA attached, rdb used peek() instead of
hostpeek().
9/29/92 jd: text(), int.asm, localint.asm, setjmp.asm, setjmp.h
Ctrl-Break handler wasn't supported.
9/29/92 jd: fixup()
Changed debugger so that ctrl-break justs interrupts executing program,
without terminating it.
9/30/92 jd: dbgcall()
sdb locked up when evaluating a function call: eg "e myfunc()"
10/1/92 jd: ShowStats(), main(), cmdtab.c, etc
Added 'di' command to display info about sdb's heap usage.
10/4/92 --------------- Released v5.2a beta 2 ----------------------------
10/20/92 jd: OMFload(), loadexe()
Changed rdb so that when .loc or abs .exe program is downloaded to ROM
system, initial stack is set to area at top of monitor data. Previously,
.loc's initial stack was random and abs .exe's was 64k above _Dorg; when
monitor transfered control to user program by pushing info on this random
stack, random areas of memory were overwritten.
11/3/92 jd: whelp.c wdbpro.c
sdb and rdb couldn't find the help files sdb.hyp and sdb.idx, even when
the AZTEC environment variable pointed at the directory that held them.
11/4/92 jd: wconfig.c
Changed name of default config file to sdb.set, to avoid conflict with
4.10d sdb, which used sdb.ini.
Changed order in which sdb searches for config file. It's now
current dir,
AZTEC dir, if AZTEC env exists
if config file not found and AZTEC doesn't exist, sdb.set is created
in current directory
Added sdb.set file, with default settings, to sdb.lzh, so that install
program will put this in bin directory, where it can be found during
standard usage of sdb and rdb

View File

@ -0,0 +1,7 @@
Changes to unitools GREP, DIFF, LS:
4/9/92 ------------- Released v5.2a beta 1 -------------------------
9/21/92 jd: grep
changed grep to ignore directories.

View File

@ -0,0 +1,18 @@
Changes to utilities:
4/9/92 ----------------- Released v5.2a beta 1 ---------------------
9/10/92 jd: cnm
cnm wasn't printing segment, class, group info correctly when in long mode.
9/21/92 jd: lb
changed lb to make file & module searches case insensitive.
10/4/92 ----------------- Released v5.2a beta 2 ---------------------
10/27/92 jd: cnm
Added -U option to cnm, to display info about unnamed symbols
11/17/92 jd: ai
Added ai program to util.lzh

View File

@ -0,0 +1,12 @@
Changes to Z:
4/9/92 ---------------- Released v5.2a beta 1 ------------------------
9/17/92 jd: termpc.c, colon.c
Added support for vga 50-line mode.
New command- :se 50={1|0}
10/4/92 ---------------- Released v5.2a beta 2 ------------------------
10/14/92 jd: dobang()
Before executing an external program for the :! command, z now clears
the screen and homes the cursor.

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.

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,22 @@
ALN, ALOC, & AHEX, beta v5.2a
Release Notes
8/28/92
In addition to the executable files for ALN, ALOC, and AHEX, this archive
contains information about what's changed about each program, in the following
files:
File What's changed in...
------------ --------------------
CHANGES.ALN ALN
CHANGES.ALOC ALOC
CHANGES.AHX AHEX
Please report any problems to me:
* By voice: 908-542-1795, between 2:30 and 5pm, Eastern time;
* By modem: 908-542-2793, any time. Modem parameters: up to 2400 baud,
8 data bits, 1 stop, no parity;
* By fax: 908-542-8386, any time.
Thanks for your help.
- Jeff Davis

Binary file not shown.

View File

@ -0,0 +1,505 @@
^9999
!Breakpoint commands
1000
!Display commands
2000
!Frame commands
3000
!I/O commands
6000
!Memory commands
4000
!Formatted output
8000
!Register command
9000
!Unassemble commands
10000
!Macro commands
28000
!Display value
29000
!Change sdb console
27000
!Copy ouput to a file
14000
!Shell to dos
15000
!Display current context
16000
!Evaluate a C expression
17000
!Execute program
18000
!(re)load program file
19000
!Quit
20000
!Single step
5000
!Toggle screen swapping
21000
!Toggle source/assembly mode
22000
!Find string in current file
23000
!Redirect input
24000
!Log commands only to a file
25000
General SDB commands
Breakpoint commands Display current context
Display commands Evaluate a C expression
Frame commands Execute program
I/O commands (re)load program file
Memory commands
Formatted output Quit
Register command Single step
Unassemble commands Toggle screen swapping
Macro commands Toggle source/assembly mode
Display value Find string in current file
Change sdb console Redirect input
Copy ouput to a file Log commands only to a file
Shell to dos
#
^11000
Using the Help system
Use TAB key to move cursor, and Spacebar or ENTER key to
select an option. Your options are:
CONTINUE: Return back to screen prior to last F1.
PREVIOUS: Return back to the previous screen.
TOPICS: Review index of topics.
KEYS: Review Keystrokes & their functions.
Use TAB key to move cursor past the 4 buttons to select
highlighted keywords and then press Spacebar/ENTER key to
obtain further information on related topics.
#
^12000
Using the Help system
Use TAB key to move cursor, and Spacebar or ENTER key to
select an option. Your options are:
CONTINUE: Return back to screen prior to last F1.
PREVIOUS: Return back to the previous screen.
TOPICS: Review index of topics.
KEYS: Review Keystrokes & their functions.
Use TAB key to move cursor past the 4 buttons to select
highlighted keywords and then press Spacebar/ENTER key to
obtain further information on related topics.
#
^1000
!bc
30000
!bC
30000
!bd
31000
!br
32000
!bs
33000
!bt
34000
!bT
34000
!bm
35000
!be
36000
!ADDR
7000
!CMDLIST
26000
Breakpoint commands
bc ADDR Clear breakpoint
bC Clear all breakpoints
bd Display breakpoints
br [ADDR] Reset breakpoint counters
#bs ADDR [;COND][;CMDLIST] Set or modify a breakpoint
bt Toggle call trace
bT Toggle source line trace
bm Set memory change breakpoint
be Set expression breakpoint
#
^2000
!RANGE
13000
Display commands
da Display local addresses
dc Display code addresses
db RANGE Display memory as bytes
dd Display data addresses
df [FILENAME,]RANGE Display file
dg Display globals' values
dm Display DOS RAM map
dn Display 8087
#ds Display stack backtrace
#dS Display stack with autos
dw RANGE Display memory as words
#
^3000
Frame commands
#fu Frame up
#fd Frame down
#
^4000
!ADDR
7000
!RANGE
13000
Memory commands
mb ADDR VAL1 VAL2 ... Modify memory as bytes
mc RANGE = ADDR Compare memory
mf RANGE = VAL Fill memory with value
mm RANGE = ADDR Move memory
ms RANGE = VAL1 VAL2 ... Search memory for value
mw ADDR VAL1 VAL2 ... Modify memory as words
#
^5000
!CMDLIST
26000
Single step commands (step into called functions)
#s [;CMDLIST] Single step the program # times
#S [;CMDLIST] Single step without display
Single step commands (step over called functions)
#t [;CMDLIST] Single step # times
#T [;CMDLIST] Same as 't'
but don't display until last
#
^6000
Outport commands
ob PORT,VAL Output byte to port
ow PORT,VAL Output word to port
Inport commands
ib PORT Input byte from port
iw PORT Input word from port
#
^7000
The Definition of ADDR
An ADDR is the name of a C variable,
an address constant, or a C expression that yields an address.
Examples of an ADDR are as follows:
linkmain.c.19 Address of the code corresponding
to line 19 of linkmain.c
.19 Same as above if current file is linkmain.c
main Address of main
cs:0x1532 Address formed by using the current
code and an offset of 0x1532
token[j] Address of jth element of array token
#
^8000
!RANGE
13000
Print command
p [@FORMAT] [RANGE][,NEXT] - formatted output
where
FORMAT is sequence of [COUNT][INDIR][COUNT]DESC
COUNT is a decimal number (defaults to 1)
INDIR is '*' - short indirect pointer
or '#' - long indirect pointer
DESC is:
d (D) - 2-byte (4-byte) decimal
o (O) - 2-byte (4-byte) octal
u (U) - 2-byte (4-byte) unsigned decimal
x (X) - 2-byte (4-byte) hexadecimal
f (F) - single (double) floating point
b[xdo] - byte in hex or (hex, decimal, or octal)
c (C) - character with (without) translation
s (S) - string with (without) translation
p (P) - short (long) pointer
n (N) - output a newline
r (R) - print a name
t (T) - output a tab
\"STRING\" - output STRING
. - display floats to COUNT significance
+ (-) - advance (reduce) address COUNT bytes
^ - reduce address by size of last item
a (A) - set print address to follow short (long)
pointer chain
#
^9000
Register command
r [REG = VAL]
#
^10000
!RANGE
13000
Unassemble commands
u RANGE - unassemble the program
U RANGE - unassemble without symbols
#
^13000
!ADDR
7000
The Definition of RANGE
A RANGE defines a block of memory.
It has one of the following forms:
ADDR,CNT
ADDR to ADDR (the word `to' must be included)
ADDR
,CNT
The form ADDR,CNT specifies the starting address, ADDR, and
a number, CNT. CNT is interpreted differently by different
commands. For example, the `disassemble code' command, u, will
display CNT lines, while the `display bytes' command, db, will
display CNT bytes.
The form ADDR to ADDR specifies the starting and ending
addresses of the range.
A full range need not be explicitly specified, because db
remembers the last-used range and will set unspecified RANGE
parameters from the remembered values:
* When a RANGE is specified which consists of a single
ADDR, the last used CNT is used.
* When a RANGE is specified which consists of `,CNT', the
next consecutive address is used, and the remembered
count is changed to the new value.
* When nothing is specified as the RANGE, the next
consecutive address is used as the starting ADDR, and
the CNT is set to the remembered value.
#
^14000
Copy ouput to a file
#
^15000
Shell to dos
#
^16000
Display current context
#
^17000
Evaluate a C expression
#
^18000
Execute program
#
^19000
(re)load program file
#
^20000
Quit
#
^21000
Toggle screen swapping
#
^22000
Toggle source/assembly mode
#
^23000
Find string in current file
#
^24000
Redirect input
#
^25000
Log commands only to a file
#
^26000
The Definition of CMDLIST
A CMDLIST is a list of commands.
It consists of a sequence of commands or macros separated by semicolons:
COMMAND [;COMMAND ...]
If a macro is in a CMDLIST, it must be the last
command in the list.
#
^27000
Change sdb console
#
^28000
Macro commands
x NAME MACRO - create a macro
X NAME - display a macro
#
^29000
!EXPR
37000
Display value
= EXPR - display the value of EXPR
#
^30000
!ADDR
7000
bc - Clear a single breakpoint
bC - Clear all breakpoints
Syntax:
bc ADDR
bC
These commands delete breakpoints from the breakpoint table.
bc deletes the single breakpoint specified by the address
ADDR, and bC deletes all breakpoints from the table.
#
^31000
bd - Display breakpoints
Syntax:
bd
bd displays all entries in the breakpoint table.
For each breakpoint, the following information is displayed:
* Its address, using a symbolic name, if possible.
* The number of times it's been `hit' without a
breakpoint being taken.
* The skip count for it.
* The command list for it, if any.
For example, a bd display might be:
address hits skip command
cs:printf_ 1 2
cs:putc_ 0 0 db ds:_Cbuffs
In this example, two breakpoints are in the table.
The first is at the beginning of the function printf_;
a breakpoint will be taken for it every third time it is reached,
and no command will be executed.
Given its current hit count, a breakpoint will be
taken the next time printf_ is reached.
The second breakpoint is at the function putc_; a breakpoint
will be taken each time the function is reached, and will display
memory, in bytes, starting at ds:_Cbuffs.
#
^32000
!ADDR
7000
br - Reset breakpoint counters
.sP
Syntax:
br [ADDR]
br resets the `hit' counter for the specified breakpoint
which is at the address, ADDR.
If ADDR isn't given, the `hit'
counters for all breakpoints in the breakpoint table are reset.
#
^33000
!ADDR
7000
!CMDLIST
26000
bs - Set or modify a breakpoint
.sP
Syntax:
[#] bs ADDR [;CMDLIST]
bs enters a breakpoint into the breakpoint table, or
modifies an existing entry.
The optional parameter # is the skip count for the
breakpoint.
If not specified, the skip count is set to 0, meaning
that each time the breakpoint is reached it will be taken.
The optional parameter CMDLIST is a list of debugger
commands to be executed when the breakpoint is taken.
#
^34000
bt - Toggle the call trace mode flag
bT - Toggle the source line trace mode flag
Syntax:
bt
bT
bt and bT toggle the call trace mode and source line
trace mode flags, respectively.
The state of the trace mode flag determines whether trace
mode is enabled or disabled.
In call trace mode, the debugger will print the names and
arguments of each call within the program as it executes.
On return, the value of the function's return will be printed.
In source line trace mode, each statement of the program will
be displayed just before it is executed.
#
^35000
!RANGE
13000
bm - Set memory change breakpoint
Syntax:
bm [RANGE]
bm sets and clears a memory change breakpoint. Only one such
breakpoint can be active at a time.
A memory change breakpoint is set by specifying the optional
RANGE parameter; in this case, a breakpoint will be taken
whenever the specified RANGE changes.
A memory change breakpoint is cleared when the bm command
is specified with no parameter.
When a memory change breakpoint is set, the debugger will
check the specified RANGE at the following times:
* on function entry and exit, when call trace mode is active
(see the bt command);
* after each instruction execution, when source line trace
mode is active (see the bT command), or when single-stepping
(see the s and t commands).
#
^36000
!EXPR
37000
be - Set expression change breakpoint
Syntax:
be [EXPR]
be sets and clears the expression breakpoint.
Only one such breakpoint can be active at a time.
An expression breakpoint is set by specifying the optional
EXPR parameter; in this case, a breakpoint will be taken
whenever the specified EXPR is true.
An expression breakpoint is cleared when the be command
is specified with no parameter.
When an expression breakpoint is set, the debugger will check the
specified RANGE at the following times:
* on function entry and exit, when call trace mode is active
(see the bt command);
* after each instruction execution, when source line trace
mode is active (see the bT command), or when single-stepping
(see the s and t commands).
#
^37000
The Definition of EXPR
An EXPR is any valid C expression.
For example, an EXPR can consist of a single term, a series of
terms separated by operators, the use of registers by their
standard names, or 16 bit values representing memory locations
of the form segment:offset.
Here are some examples of EXPR:
si
x + 2.0
(i == j) ? 2 : 3
ds:0x4127
sin(y)
array[j]
#

View File

@ -0,0 +1,40 @@
9999,0
11000,1302
12000,1828
1000,2357
2000,3012
3000,3625
4000,3731
5000,4086
6000,4465
7000,4714
8000,5261
9000,6520
10000,6565
13000,6712
14000,7870
15000,7903
16000,7929
17000,7966
18000,8002
19000,8030
20000,8064
21000,8081
22000,8116
23000,8156
24000,8196
25000,8224
26000,8264
27000,8514
28000,8545
29000,8653
30000,8744
31000,9048
32000,10062
33000,10342
34000,10844
35000,11447
36000,12268
37000,13079
37000,13482
#

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,858 @@
Aztec C86
Release notes
Beta version 5.2a
17 Nov 1992
This release document describes version 5.2a of Aztec C86.
It's organized into the following sections:
1. Installation instructions, which describes how to install
the Aztec C files from the distribution disks onto your
disks;
2. Disk contents, which describes what's on the distribution
disks;
3. New features, which describes what's changed in going
from version 4.2b to the current release;
4. New features, which describe what's changed in going from
the 9 April beta release to the current release.
5. New features, which describe what's changed in going from
the 4 Oct beta release to the current release.
After installation, additional documentation is also
available in file README2.TXT in the DOC subdirectory that's
within your root Aztec directory.
To report problems with this beta release, please call Manx
Tech Support at 908-542-1795, between 2:30pm and 5pm Eastern
time.
1. Installation
To install Aztec C86, put the first distribution disk in a
floppy drive, make that drive the current drive, and type
install
The install program will display a dialog box containing
text fields, check box fields, and button fields that you can
adjust to customize the installation. To move around within
this dialog box, you can use a mouse, or the tab key. You can
get help by pressing the F1 key.
Once you've made your selections, press the "Proceed" button
to continue with the installation, or press the "Abort" button
to terminate the installation. After you press the "Proceed"
button, insert the distribution disks in the source drive as
prompted by the program.
When the files are all installed to the hard disk, the
program will return to DOS.
After the installation program is complete, the bin
subdirectory of your main Aztec directory will contain a batch
file named AZ86.BAT. The commands in this file will initialize
your system for use with Aztec C86. You may wish to place the
contents of this file directly in your AUTOEXEC.BAT file.
Release notes page 1
Aztec C86, beta v5.2a 11/17/92
The following paragraphs describe the fields in the
installation program's dialog box.
1.1 The 'Source drive' text field
In the 'source drive' text field, type the name of the
floppy drive in which you will place the distribution disks.
This field defaults to the A: drive.
1.2 The 'Destination directory' text field
In the 'destination directory' text field, type the name of
the drive and directory into which you want the installation
program to place the Aztec C86 files. This field defaults to
C:\AZ86.
The installation program will place files in the following
subdirectories of the destination directory:
BIN The executable programs;
INCLUDE Include files;
LIB Library source, object modules, and libraries;
MON86 Code for RDB monitor program.
1.3 The 'Install programs, includes, and source' check boxes
Check these boxes depending on what you want installed.
You toggle the setting of a box by pressing the space bar,
or by clicking the mouse in the box.
1.4 The 'Object libraries' check boxes
The Aztec C86 distribution disks contain the following
categories of object module libraries:
C libraries Non-floating point functions;
IEEE math libraries Floating point functions, which
perform calculations using software;
8087 math libraries Floating point functions, which
perform calculations using an 8087;
Sensing math libraries Floating point functions, which
perform calculations using an 8087 if
present or using software if not;
Screen libraries Functions for accessing the screen
and keyboard via the ROM BIOS;
Graphics libraries Graphics functions.
Check the boxes that define the libraries you want
installed.
1.5 The 'Memory models' check boxes
Check on the 'library memory models' boxes to define the
memory models of the libraries that you want installed.
Release notes page 2
Aztec C86, beta v5.2a 11/17/92
For example, if you want the C libraries installed that use
the small code and small data memory model, you would check
the 'C libraries' and the 'small code, small data' boxes.
1.6 The 'Optional components' check boxes
If you've purchased the optional Level 2 or Level 3
Extensions to Aztec C86, check the appropriate boxes to
specify which of the Extension components you want installed.
Don't check these boxes if you don't have the extensions.
1.7 Bypassing the installation program
Most of the files on the distribution disks are in standard
LHARC format. So if you want, you can bypass the installation
program altogether and dearchive the archive files that are on
the distribution disks using the LHARC program that is
provided with Aztec C. This archive program is installed in
the Aztec root directory's BIN subdirectory; this program, and
documentation on how to use it, is also on distribution disk
1. The LHARC program is in file LHA.EXE, and documentation is
in file LHA.DOC.
1.8 Re-entering the installation program
The installation program can be run more than once. For
example, during one execution you could install the programs,
include files, and object libraries; and during a second
execution you could install the library source files.
2. Contents of distribution disks
v5.2a of Aztec C86 is packaged into a base package and two
levels of optional extensions. The components of these
packages are:
* Base package:
+ Compiler, assembler, DOS linker
+ Include files
+ Object module utilities
+ Object libraries
+ SDB source level debugger.
* Level 2 extensions:
+ Library source;
+ HEX86, startup routines, and heap-management
routines, for ROMming programs that have non-complex
segmentation requirements.
* Level 3 extensions:
+ RDB debugger and MON86 monitor, for remote source-
level debugging of ROM- and DOS-based programs;
+ ALN linker, ALOC locator, AHEX hexer, and startup
routines, for ROMming programs that have complex
segmentation requirements
The following paragraphs describe the files that are on the
Aztec distribution disks.
Release notes page 3
Aztec C86, beta v5.2a 11/17/92
2.1 Disk 1 contents
File Contents
INSTALL.EXE Installation program
LHA.EXE LHARC program (this replaces the ARCV
and MKARCV programs that are described
in the manual)
LHA.HLP LHARC help
LHA.DOC LHARC documentation
2.2 Disk 2 contents
File Contents
CC.LZH Compiler
AS.LZH Assembler
LN.LZH Linker
INCLUDE.LZH include files
UTIL.LZH Object module utilities, HEX86, and
miscellaneous utilities
UNITOOLS.LZH Unix-compatible programs
2.3 Disk 3 contents
File Contents
SDB.LZH SDB source level debuger
2.4 Disk 4 contents
File Contents
C.LZH Small code, small data c & m libraries
CL.LZH Large code, large data c & m libraries
CLC.LZH Large code, small data c & m libraries
CLD.LZH Small code, large data c & m libraries
M87.LZH 8087 math libraries (all memory models)
MS.LZH Sensing math libraries (all models);
G.LZH Graphics libraries
S.LZH Screen libraries
2.5 Disk 5 contents
Disk 5 contains the optional Level 2 extensions.
File Contents
86SUP.LZH LIB\86SUP source files
DOS.LZH LIB\DOS source
GRAPHICS.LZH LIB\GRAPHICS source
INP.LZH LIB\INP files
LIB.LZH LIB files
MISC.LZH LIB\MISC source
MATH.LZH LIB\MATH source
ROM86.LZH LIB\ROM86 source
SCREEN.LZH LIB\SCREEN source
STDIO.LZH LIB\STDIO source
STDLIB.LZH LIB\STDLIB source
STRING.LZH LIB\STRING source
SYSIO.LZH LIB\SYSIO source
TIME.LZH LIB\TIME source
UTIL2.LZH Programs for level 2 extensions
2.6 Disk 6 contents
Disk 6 contains the optional Level 3 extensions.
File Contents
Release notes page 4
Aztec C86, beta v5.2a 11/17/92
LNKLOC.LZH Advanced linker, locator, and hexer
programs
RDB.LZH Remote source level debugger
3. New Features since v4.2a
This section describes functional changes that have been
made in going from the v4.2b release to the 9 April v5.2a beta
release.
3.1 Compiler changes
The following paragraphs describe the changes that have been
made to the compiler in going from version 4.2b to 5.2a.
3.1.1 New compiler options
-J Enable trigraph support.
-F Generate prototypes for static functions, without
generating executable code. Send prototypes by default to
a file whose name is derived from input file, by changing
the extension to .PRO. The -O option can be used to
select the output file name. This option replaces the
PROTO program.
-X Generate prototypes for non-static functions, without
generating executable code. Send prototypes by default to
a file whose name is derived from input file, by changing
the extension to .PRO. The -O option can be used to
select the output file name.
-W Preprocess source. Send preprocessed C source by default
to a file whose name is derived from input file, by
changing the extension to .PRE. The -O option can be used
to select the output file name. This option replaces the
CPP program.
3.1.2 New predefined symbols
__VERSION Predefined with the version of the compiler. It
has the value 520;
_LARGE_CODE Predefined with value 1 if program is compiled
to use the large code memory model;
_LARGE_DATA Predefined with value 1 if program is compiled
to use the large data memory model;
3.1.3 New language features
Support for the following language features has been added
to the v5.2 compiler:
* Initialization of auto aggregate variables;
* Trigraphs.
3.1.4 New support for 8086 segmentation
The compiler now allows you to define, using the new
"#pragma segment" directive, the segments into which variables
are placed. This directive has the following form:
Release notes page 5
Aztec C86, beta v5.2a 11/17/92
#pragma segment [segname]
[class classname] [at addr] [near | far]
sym1, sym2 ...
where the parameters have the following meanings:
sym1, sym2, ...
Symbols that are to be placed in a
specified segment;
segname
'segname' is the segment that's to hold
the symbols.
class classname
'classname' is the class in which the
segment is located. If not specified, the
class defaults to 'DATA'.
at addr 'addr' is the segment's starting address;
near | far A NEAR segment is always accessible via
the DS segment register, and a FAR segment
is not. To access a FAR segment, the ES
register must first be loaded with the
segment's paragraph address. Defaults to
FAR.
Previous versions of the compiler allowed you to specify
that variables were to go into their own segments, but the
compiler itself chose the names of these segments. With the
ability to choose segment names yourself, and with the new ALN
linker and ALOC locator, you can now easily position variables
in special areas of memory. For example, if your system has
memory-mapped I/O, you can create structure that matches the
memory-mapped I/O section of memory, place that structure in
its own segment, and position the segment at the memory-mapped
I/O's section of memory.
Previous versions of the compiler did not allow you to put
near data items into special segments. With this capability,
and with the new ALN linker and ALOC locator, you can now
easily take advantage of battery-backed-up RAM. For example,
you can place variables that should not be initialized on
system startup in a DS-accessible near segment, and position
that segment at the beginning of RAM. The other standard
Aztec-created, DS-accessible, near segments can be placed
after the special segment in RAM, where they can safely be
initialized on system startup.
3.2 Assembler changes
* ORG directive now fully supported;
* The "AT addr" clause of the SEGMENT directive is now
supported.
3.3 DOS linker changes
* None.
3.4 Library changes
* Libraries are now ANSI compatible (previously they were
K&R compatible). Probably the main change you will have
to make to your programs is to change your calls to
fopen(), to support fopen's TEXT and BINARY modes.
Release notes page 6
Aztec C86, beta v5.2a 11/17/92
* The time() function now returns the current time as the
number of seconds that have elapsed since Jan 1, 1970.
Previously it returned the current time in the format
used for file directory time fields.
3.5 Include file changes
* Include files are now completely ANSI compatible
(previously they were K&R compatible).
3.6 Level 2 extensions for creating ROMable code
The optional Level 2 extensions contain components for
creating ROMable code of systems whose segmentation
requirements are not too demanding. For example, a typical
system might have its code in one set of ROM chips and its
data in one set of RAM chips.
These components are:
* The HEX86 utility that was in v4.2b, for converting a
program into Intel hex code;
* BEGIN-SD.ASM and HEAP-SD.ASM, the startup and heap
management routines for programs that use the small data
memory model;
* BEGIN-LD.ASM and HEAP-LD.ASM, the startup and heap
management routines for programs that use the large data
memory model;
The heap management routines are new; the routines in 4.2b
and earlier releases were for DOS-based systems.
BEGIN-SD.ASM and BEGIN-LD.ASM have replaced the ROM86.ASM
startup routine that was in 4.2b. They were changed so that
they now initialize the heap as required by the new heap
management routines.
3.7 Level 3 extensions for creating ROMable code
The new, optional, Level 3 extensions to Aztec C86 contain
the following utility programs and startup code for creating
multi-segmented romable code:
* The ALN linker. This program links object modules
together, and outputs a relocatable object module. The
input modules can be in Aztec object format, Microsoft
OMF format, or Intel OMF format. The output module is in
Intel OMF format.
* The ALOC locator. This program 'locates' an object module
that is in relocatable Intel OMF format; that is, defines
the starting memory addresses of the module's segments
and converts relocatable items to absolute.
* The AHEX hexer. This program converts an object module
that is in absolute Intel OMF format into Intel hex code
or binary code.
* The ABEGINSD and ABEGINLD startup routines, which gain
control when a program created with ALN, ALOC, and AHEX
is activated.
Release notes page 7
Aztec C86, beta v5.2a 11/17/92
For heap management, programs that use the Level 3
extensions should use the heap management routines that are in
the Level 2 extensions.
ALN, ALOC, and AHEX are described at the end of this
document. ABEGIN is described in the following section.
3.8 The ABEGIN startup routine.
ABEGIN is the startup routine that's used by programs that
have been generated using the ALN, ALOC, and AHEX programs.
3.8.1 ABEGIN files
To support different memory models, ABEGIN is provided in
two source files and four object module files, in directory
LIB\ROM86. Source files:
ABEGINSD.ASM Source for programs that use small data
memory model;
ABEGINLD.ASM Source for programs that use large data
memory model;
Object files:
ABEGINSD.O Object module for programs that use small
code, small data memory model. Generated
from ABEGINSD.ASM;
ABEGINSD.OLC Object module for programs that use large
code, small data memory model; Generated
from ABEGINSD.ASM;
ABEGINLD.OLD Object module for programs that use small
code, large data memory model; Generated
from ABEGINLD.ASM;
ABEGINLD.OL Object module for programs that use large
code, large data memory model. Generated
from ABEGINLD.ASM;
3.8.2 Notes about ABEGIN
* By default, ABEGIN initializes a program's DATA class in
RAM from a copy in ROM. The copy must immediately follow
the program's CODE class in ROM.
* ABEGIN can optionally initialize a program's FAR_DATA
class in RAM from a copy in ROM. This is the class in
which the compiler by default places a program's far
data. This class must immediately follow the program's
DATA class in ROM.
* ABEGIN contains the target system's reset code, in the
RESET_CODE segment. By default, AHEX will position this
segment so that it resides at the system's reset vector
location.
* ABEGIN contains code that will initialize an 80186. To
enable generation of this code, assemble ABEGINxx.ASM
with the symbol CPU_186 defined.
* The small data version of ABEGIN (ABEGINSD.ASM) puts a
program's stack within the program's uninitialized data
area, beginning at the location defined by symbol
'cstack'. The number of paragraphs in the stack area is
defined by the symbol 'stacksize', which defaults to 80h
paragraphs.
Release notes page 8
Aztec C86, beta v5.2a 11/17/92
* The small data version of ABEGIN puts a program's heap
right after the program's uninitialized data area. The
number of paragraphs in the heap is defined by the symbol
'heapsize', which defaults to 80h paragraphs.
* The large data version of ABEGIN (ABEGINLD.ASM) puts a
program's stack right after the program's uninitialized
data area. The symbol 'stacksize' defines the number of
paragraphs in this area, and defaults to 80h paragraphs.
* The large data version of ABEGIN puts a program's heap
right after the program's stack area. The symbol
'heapsize' defines the number of paragraphs in this area,
and defaults to 80h paragraphs.
3.9 SDB changes
* There are now two versions of SDB: the regular SDB; and
RDB, which allows remote source level debugging of a
program that resides in another MSDOS/PCDOS- or ROM-based
system.
* Both SDB and RDB have a new windowed interface, and
hypertext help.
* INITSDB is no longer needed for configuring SDB.
* RDB and SDB occupy significantly more RAM memory than
v4.10d SDB. This is not a problem for RDB, since the
program being debugged resides in a separate machine. But
it is a problem with SDB since it and the program being
debugged must reside in the same system. Until we resolve
this problem with SDB, which we will probably do by
moving SDB up into extended memory, we are providing the
v4.10d SDB, in file SDB410D.EXE, and INITSDB (for
configuring the SDB410D).
3.10 Z changes
* The command :se 50=1 can be used on VGA screens to
display 50 lines.
3.11 Other program changes
Other new programs in v5.2 are these:
* XREF, which generates a cross-reference listing of symbol
references and definitions in object modules.
Programs that are no longer provided:
* PROTO, which has been replaced with the new compiler
options -F and -X;
* CPP, which has been replaced with the new compiler option
-W;
* ENGTOC;
* CTOENG;
* ARCV.
3.12 Building libraries
Library source is in the optional Level 1 extensions to
Aztec C86. The INSTALL program will create a LIB subdirectory
of the root Aztec directory and several subdirectories of LIB,
and then install the source in these subdirectories.
Release notes page 9
Aztec C86, beta v5.2a 11/17/92
You can build one or more libraries by CD'ing into the LIB
directory and then invoking MAKE with codes that identify the
libraries you want made. The codes and their associated
libraries are:
ALL All libraries
C_ALL All C libraries
C C.LIB
CL CL.LIB
CLC CLC.LIB
CLD CLD.LIB
M_ALL All M libraries
M M.LIB
ML ML.LIB
MLC MLC.LIB
MLD MLD.LIB
M87_ALL All M87 libraries
M87 M87.LIB
M87L M87L.LIB
M87LC M87LC.LIB
M87LD M87LD.LIB
MS_ALL All MS (8087-sensing) math libraries
MS MS.LIB
MSL MSL.LIB
MSLC MSLC.LIB
MSLD MSLD.LIB
S_ALL All S (screen) libraries
S S.LIB
SL SL.LIB
SLC SLC.LIB
SLD SLD.LIB
G_ALL All G (graphics) libraries
G G.LIB
GL GL.LIB
GLC GLC.LIB
GLD GLD.LIB
To build libraries, MAKE will invoke a second copy of MAKE,
passing to it parameters that define what's to be made.
For each library that it's to make, this second MAKE will do
the following:
* CD into each required subdirectory of the LIB
subdirectory and invoke a third copy of MAKE. This third
MAKE will generate object modules for the library, from
the source that's in the subdirectory.
* CD into the INP subdirectory and sort the names of the
object modules that will go into the library, using the
ORD utility;
* Build the library into the LIBS subdirectory of the LIB
directory, using the LB utility.
Release notes page 10
Aztec C86, beta v5.2a 11/17/92
4. New Features since the 4/9/92 beta
This section describes changes that have been made since the
9 April 92 beta release. It first describes functional changes
that have been made, and then bug fixes.
4.1 Compiler changes
* The new -M option causes the compiler to issue a warning
if a function is called without a prototype being in
scope.
* The new +T option causes $$var statements (used to access
far data) to be put into the code segment instead of the
data segment.
4.2 Z changes
* On a VGA display, the command :se 50=1 can be used to
display 50 lines.
4.3 Library changes
* The new TimeFile2TM() function converts a time value
that's in the format used for file directory time fields
to the format that's used by the time() function.
* The new TimeTM2File() function converts a time value
that's in the format used by the time() function to file
system format.
* The graphics functions now support VGA modes 0x10, 0x11,
0x12, and 0x13.
* The movblock() function has been changed. A length
argument of 0 now means don't copy anything; used to mean
copy 64kbytes.
* The scdir() function has been changed. When passed a
NULL, it resets itself so that the next call can specify
a new pattern.
4.4 SDB/RDB changes
* The DI command causes sdb/rdb to display information
about the debugger's heap usage.
5. New features since the 10/4/92 beta
5.1 SDB/RDB changes
* The name of the default configuration file for SDB and
RDB has been changed to SDB.SET, from SDB.INI.
* The sequence in which SDB/RDB search for SDB.SET has been
changed. On startup they look in the following places:
1. The current directory;
2. The directory whose name is assigned to the AZTEC
environment variable;
3. If SDB.SET is not found and AZTEC environment
variable doesn't exist, SDB.SET is created in the
current directory.
5.2 CNM changes
* The -U option has been added, to display information
about a module's unnamed symbols.
Release notes page 11
Aztec C86, beta v5.2a 11/17/92
5.3 Library changes
* The following functions have been added:
+ fnsplit(), which breaks a file name up into drive,
path, filename, and extension components; Calling
sequence:
int fnsplit(char *name, char *drive, char *dir,
char *fname, char *ext);
where
- name points at the name to be broken down;
- drive points at the area where the name's drive
component is placed;
- dir points at the area where the name's
directory component is placed;
- fname points at the area where the name's
filename component is placed;
- ext points at the area where the name's
extension is placed.
+ fnmerge(), which creates a file name from drive,
path, filename, and extension components. It has the
same arguments as fnsplit(); a complete file name is
built up from the drive, dir, fname, and ext args,
and stored in the area pointed at by name.
+ strdup(), which makes a copy of a string in the
heap. Calling sequence:
char *strdup(char *str);
+ lfind(), which performs a linear search of an array
for a specified item. Calling sequence:
void *lfind(void *key, void *base, size_t *num,
size_t width, int (*fcmp)(void *, void *));
where:
- key points at the value to be located;
- base points at the array to be searched;
- num points at the number of array elements;
- width is the width in bytes of each array
element;
- fcmp points at a function that compares two
keys. The function returns 0 if the items are
identical, and non-zero if different.
lfind() returns a pointer to the matching array
element, or NULL if not found.
+ lsearch(), same as lfind(), except it appends the
item if not found. The calling sequence is the same
as for lfind().
+ min(), returns the lesser of two ints. Calling
sequence:
int min(int a, int b);
where a and b are the items to be compared.
+ max(), returns the greater of two ints. Calling
sequence:
int max(int a, int b);
where a and b are the items to be compared.
* The following symbols were added to the ABEGINSD.ASM and
ABEGINLD.ASM startup routines:
+ NEAR_DATA_INIT. If 1, the initialized near data
segment (dataseg) is initialized from a copy in ROM.
If 0, this initialization is not done. Default
value: 1.
Release notes page 12
Aztec C86, beta v5.2a 11/17/92
+ FAR_DATA_INIT. If 1, the initialized far data class
FAR_DATA is initialized from a copy in ROM. If 0,
this initialization is not done. Default value: 0.
+ FAR_BSS_INIT. If 1, the uninitialized fat data class
FAR_BSS is cleared. If 0, FAR_BSS is not cleared.
Default value: 0.
+ CPU_186. Set to 1 if processor is an 80186/80188, or
0 if not. Default value: 0.
5.4 The AI program
AI is a new program that displays information about Aztec
C86 programs. For information, type AI.
5.5 Bug fixes
Numerous bugs have been fixed, in programs, library
functions, and include files. These fixes are described
in the CHANGES.* files that are stored in the BIN,
INCLUDE, and LIB subdirectories of the main Aztec
directory. Once you've finished examining these files,
you can delete them.
Release notes page 13

View File

@ -0,0 +1,18 @@
/* Copyright 1992 Manx Software Systems, Inc. All rights reserved */
#ifndef __ALLOC_H
#define __ALLOC_H
int brk(void *ptr);
void * sbrk(int _size);
huge void * lcalloc(long _nelem, long _size);
huge void * lfree(huge void *_ptr);
huge void * lmalloc(long _size);
huge void * lrealloc(huge void *_ptr, long _size);
unsigned int rsvstk(int _size);
#endif /* __ALLOC_H */

View File

@ -0,0 +1,13 @@
/* Copyright Manx Software Systems, Inc. 1990. All rights reserved */
#ifndef __ASSERT_H
#define __ASSERT_H
#ifndef NDEBUG
void _assert(char *, char *, unsigned int);
#define assert(x) (x == 0 ? _assert(#x, __FILE__, __LINE__):(void)0)
#else
#define assert(x) ((void)0)
#endif
#endif

View File

@ -0,0 +1,19 @@
Changes to include files:
4/9/92 ------------- Released v5.2a beta 1 -------------------
9/18/92 jd: time.h
LocalFileTime() replaced by TimeFile2TM(), so replaced prototype in time.h.
Added prototype to time.h for new function TimeTM2File()
10/4/92 ------------- Released v5.2a beta 2 -------------------
11/17/92 jd:
stdlib.h:
Added prototypes for non-ANSI functions lsearch(), lfind(), lfree(),
min(), max()
fcntl.h:
Added prototypes for non-ANSI functions fnsplit(), fnmerge()
string.h:
Added prototype for non-ANSI function strdup()

View File

@ -0,0 +1,13 @@
#define BLACK 0
#define BLUE 1
#define GREEN 2
#define CYAN 3
#define RED 4
#define MAGENTA 5
#define YELLOW 6
#define WHITE 7
#define BLINK 1
#define NO_BLINK 0
#define HIGH 1
#define LOW 0

View File

@ -0,0 +1,51 @@
/* Copyright 1990 Manx Software Systems, Inc. */
/* All rights reserved. */
#ifndef __CTYPE_H
#define __CTYPE_H
extern char _ctype[];
#define _U 0x01 /* Upper-case */
#define _L 0x02 /* Lower-case */
#define _D 0x04 /* Decimal-digit */
#define _H 0x08 /* Hex-digit */
#define _W 0x10 /* White-space */
#define _C 0x20 /* Control char */
#define _P 0x40 /* Punctuation */
#define _B 0x80 /* Blank */
int isalpha(int _c);
int isupper(int _c);
int islower(int _c);
int isdigit(int _c);
int isxdigit(int _c);
int isalnum(int _c);
int isspace(int _c);
int ispunct(int _c);
int iscntrl(int _c);
int isprint(int _c);
int isgraph(int _c);
int isascii(int _c);
int tolower(int _c);
int toupper(int _c);
#define isalpha(x) ((_ctype+1)[(unsigned char)(x)]&(_L|_U))
#define isupper(x) ((_ctype+1)[(unsigned char)(x)]&(_U))
#define islower(x) ((_ctype+1)[(unsigned char)(x)]&(_L))
#define isdigit(x) ((_ctype+1)[(unsigned char)(x)]&(_D))
#define isxdigit(x) ((_ctype+1)[(unsigned char)(x)]&(_H))
#define isalnum(x) ((_ctype+1)[(unsigned char)(x)]&(_L|_U|_D))
#define isspace(x) ((_ctype+1)[(unsigned char)(x)]&(_W))
#define ispunct(x) ((_ctype+1)[(unsigned char)(x)]&(_P))
#define iscntrl(x) ((_ctype+1)[(unsigned char)(x)]&(_C))
#define isprint(x) ((_ctype+1)[(unsigned char)(x)]&(_P|_L|_U|_D|_B))
#define isgraph(x) ((_ctype+1)[(unsigned char)(x)]&(_P|_L|_U|_D))
#define isascii(x) (((x)&0x80)==0)
#define toascii(x) ((x)&0x7f)
#define _tolower(x) ((x)|0x20)
#define _toupper(x) ((x)&0x5f)
#endif /* _CTYPE_H */

View File

@ -0,0 +1,114 @@
/* Copyright (C) 1985 by Manx Software Systems, Inc. */
#define RECORDSIZE 64
#define DBG_MAGIC 0x356e /* Magic # for relative .dbg files */
#define DBG_MAGICROM 0x4d53 /* Magic # for absolute .dbg files */
#define LINE_MAGIC 0x3039 /* Magic # for line number records */
#define BLOCK_MAGIC 0x3c48 /* Magic # for block records */
#define LOCAL_MAGIC 0x3c47 /* Magic # for symbol records */
#define LOCSIZE 6 /* # of local symbols per record */
#define BLKSIZE 6 /* # of blocks per record */
#define STRSIZE (RECORDSIZE/sizeof(struct structab)) /* # of structs/record */
struct dbgheader {
short h_stsize; /* 02 */ /* # of struct table entries */
short h_stpos; /* 04 */ /* record # for start of structs */
short h_stgsize; /* 06 */ /* # of string table entries */
unsigned short h_stgbytes; /* 08 */ /* total length of strings */
short h_stgpos; /* 0a */ /* record # for start of strings */
short h_linerec; /* 0c */ /* # of line # records */
short h_blkrec; /* 0e */ /* # of block records */
short h_symrec; /* 10 */ /* # of symbol table records */
unsigned short h_abssym; /* 12 */ /* symbol # of first absolute global */
unsigned short h_codesym; /* 14 */ /* symbol # of first code global */
unsigned short h_datasym; /* 16 */ /* symbol # of first data global */
};
struct structab {
unsigned short st_tag;
unsigned short st_size;
unsigned short st_first; /* first member contained in this struct */
unsigned short st_last; /* last member "" */
};
/* macros for bit field stuff in localsym records for struct members */
#define FIELDPACK(pos, wid) ((pos)&0x7f | ((wid)&0x7f)<<8)
#define GETPOS(x) ((x)&0x7f)
#define GETWID(x) ((x)>>8 & 0x7f)
/* special flag values for ls_seg */
#define AUTOFLG -2 /* auto-variable on the stack */
#define REGFLG -3 /* Register variable */
#define ARGFLG -4 /* function-parameter on the stack */
#define AREGFLG -5 /* Register fucntion-parameter */
#define TDEFFLG -6 /* Typedef */
struct localsym {
unsigned short ls_name;
unsigned short ls_type;
short ls_struct; /* for bit fields, pos and wid */
short ls_offset;
short ls_seg; /* see special flag values above */
/* for struct members: 0 for standard members, !0 for bit fields */
};
struct block {
short b_function; /* function containing this block */
unsigned short b_start; /* start of block (relative to function start) */
unsigned short b_end; /* end of block */
unsigned short b_first; /* first local contained in this block */
unsigned short b_last; /* last local "" */
};
#define LINEENTRY (RECORDSIZE-5*sizeof(short))
struct lineinfo {
unsigned short l_offset, l_seg;
unsigned short l_file;
unsigned short l_lnum;
unsigned char l_data[LINEENTRY];
};
/* codes in LINE info blocks */
#define NEXTREC 0xff /* line info continues in the next line record */
#define EXTADDR 0x80 /* if bit on then 15 bit address increment */
#define EXTMAX 0x7f00 /* largest possible displacement + 1 */
#define db_blk db_u.u_block
#define db_syms db_u.u_syms
#define db_line db_u.u_line
#define db_head db_u.u_head
typedef struct {
short db_magic;
union {
struct block u_block[BLKSIZE];
struct localsym u_syms[LOCSIZE];
struct lineinfo u_line;
struct dbgheader u_head;
char u_buffer[RECORDSIZE-sizeof(short)];
} db_u;
} dbgrec;
/* type modifiers */
#define D_PTR '*'
#define D_LPTR '#'
#define D_ARRAY '['
#define D_FUNC '('
#define D_FFUNC '{'
/* base type values (always last char of type string) */
#define D_CHAR 'c'
#define D_UCHAR 'C'
#define D_INT 'i'
#define D_UINT 'I'
#define D_LONG 'l'
#define D_ULONG 'L'
#define D_FLOAT 'f'
#define D_DOUBLE 'd'
#define D_VOID 'v'
#define D_STRUCT ':' /* type string is followed by struct # */
#define BASETYPES "cCiIlLfdv:"

View File

@ -0,0 +1,26 @@
/* Copyright (C) 1983 by Manx Software Systems */
#define TIOCGETP 0 /* read contents of tty control structure */
#define TIOCSETP 1 /* set contents of tty control structure */
#define TIOCSETN 1 /* ditto only don't wait for output to flush */
/* special codes for MSDOS 2.x only */
#define TIOCREAD 2 /* read control info from device */
#define TIOCWRITE 3 /* write control info to device */
#define TIOCDREAD 4 /* same as 2 but for drives */
#define TIOCDWRITE 5 /* same as 3 but for drives */
#define GETISTATUS 6 /* get input status */
#define GETOSTATUS 7 /* get output status */
struct sgttyb {
short sg_flags; /* control flags */
char sg_erase; /* ignored */
char sg_kill; /* ignored */
};
/* settings for flags */
#define RAW 0x20 /* no echo or mapping of input/output BDOS(6) */
/* Refer to the MSDOS technical reference for detailed information on
* the remaining flags.
*/

View File

@ -0,0 +1,14 @@
/* Copyright 1992 Manx Software Systems, Inc. All rights reserved */
#ifndef __DOS_H
#define __DOS_H
int bdos(int _func, int _dx, int _cx);
int bdosx(int _func, far void *_dsdx, int _cx);
int dos(int _func, int _bx, int _cx, int _dx, int _di, int _si);
int dosx(int _func, int _bx, int _cx, void *_dsdx, int _di, int _si);
int dup(int _oldfd);
int fcbinit(char *_name, void *_fcb);
int fdup(int _oldfd, int _newfd);
#endif /* __DOS_H */

View File

@ -0,0 +1,40 @@
/* Copyright Manx Software Systems, Inc. 1990. All rights reserved */
#ifndef __ERRNO_H
#define __ERRNO_H
extern int errno;
/* MsDos return codes */
#define EINVAL 1
#define ENOENT 2
#define ENOTDIR 3
#define EMFILE 4
#define EACCES 5
#define EBADF 6
#define EARENA 7
#define ENOMEM 8
#define EFAULT 9
#define EINVENV 10
#define EBADFMT 11
#define EINVACC 12
#define EINVDAT 13
#define ENODEV 15
#define ERMCD 16
#define EXDEV 17
#define ENOMORE 18
/* additional codes used by Aztec C */
#define EEXIST 19
#define ENOTTY 20
/* used by the math library */
#define ERANGE 21
#define EDOM 22
/* non ANSI C definitions */
extern char *_sys_errlist[];
extern int _sys_nerr;
#endif

View File

@ -0,0 +1,27 @@
/* Copyright (C) 1982 by Manx Software Systems */
struct fcb {
char f_driv;
char f_name[8];
char f_type[3];
char f_ext;
char f_resv[2];
char f_rc;
char f_sydx[16];
char f_cr;
unsigned f_record; char f_overfl;
};
#define OPNFIL 15
#define CLSFIL 16
#define DELFIL 19
#define READSQ 20
#define WRITSQ 21
#define MAKFIL 22
#define SETDMA 26
#define GETUSR 32
#define READRN 33
#define WRITRN 34
#define FILSIZ 35
#define SETREC 36

View File

@ -0,0 +1,83 @@
/* Copyright Manx Software Systems, Inc. 1990. All rights reserved */
#include <time.h>
#ifndef __FCNTL_H
#define __FCNTL_H
#ifndef _SIZE_T
#define _SIZE_T
typedef unsigned int size_t;
#endif
#define O_RDONLY 0
#define O_WRONLY 1
#define O_RDWR 2
#define O_DENYRW 0x10
#define O_DENYW 0x20
#define O_DENYR 0x30
#define O_DENYN 0x40
#define O_INHER 0x80
#define O_COMP 0x00
#define O_CREAT 0x0100
#define O_TRUNC 0x0200
#define O_EXCL 0x0400
#define O_APPEND 0x0800
#define O_TEXT 0x1000
#define O_ISOPEN 0x2000 /* not for use except in io library */
#define O_CONRAW 0x4000
#define O_ISTTY 0x8000
#define MAXCHAN 20 /* maximum number of I/O channels *jd 9/8/92 */
int _creat(const char *_name, int _mode);
int _open(const char * _name, int _mode, ...);
int _access(char *, int);
int _close(int);
size_t _read(int, void *, size_t);
size_t _write(int, void *, size_t);
long _lseek(int, long, int);
struct sgttyb;
int _ioctl(int, int, ...);
int _isatty(int);
int _unlink(char *);
int creat(const char *_name, int _mode);
int open(const char * _name, int _mode, ...);
int access(char *, int);
int close(int);
size_t read(int, void *, size_t);
size_t write(int, void *, size_t);
long lseek(int, long, int);
int ioctl(int, int, struct sgttyb *);
int isatty(int);
int unlink(char *);
int _csread(int _fd, char *_buff, size_t _size);
int filelock(int _fd, int _flag, long _offset, long _len);
void _exit(int _code);
int chmod(char *_name, int _attr);
int chdir(char *_path);
char * getcwd(char *_path, int _size);
int mkdir(char *_name);
char * mktemp(char * _template);
int rmdir(char *_dir);
char * scdir(char *_pat);
int wait(void);
int fexecl(char *_file, char *_arg0, ...);
int fexecv(char *_file, char **_argv);
int execl(char *_file, char *_arg0, ...);
int execv(char *_file, char **_argv);
int execlp(char *_file, char *arg0, ...);
int execvp(char *_file, char **_argv);
int fnsplit(char *_name, char *_drive, char *_dir,
char *_fname, char *_ext);
int fnmerge(char *_name, char *_drive, char *_dir,
char *_fname, char *_ext);
#endif

View File

@ -0,0 +1,73 @@
/* Copyright Manx Software Systems, Inc. 1990. All rights reserved */
#ifndef __FLOAT_H
#define __FLOAT_H
#ifdef _FLT_IEEE
#define FLT_ROUNDS -1
#define FLT_RADIX 2
#define FLT_MANT_DIG 24
#define FLT_EPSILON 1.19209290E-07F
#define FLT_DIG 6
#define FLT_MIN_EXP -125
#define FLT_MIN 1.17549435E-38F
#define FLT_MIN_10_EXP -37
#define FLT_MAX_EXP +128
#define FLT_MAX 3.40282347E+38F
#define FLT_MAX_10_EXP +38
#define DBL_MANT_DIG 53
#define DBL_EPSILON 2.2204460492503131E-16
#define DBL_DIG 15
#define DBL_MIN_EXP -1021
#define DBL_MIN 2.225073858507201E-308
#define DBL_MIN_10_EXP -307
#define DBL_MAX_EXP +1024
#define DBL_MAX 1.797693134862316E+308
#define DBL_MAX_10_EXP +308
#define LDBL_MANT_DIG 53
#define LDBL_EPSILON 2.2204460492503131E-16
#define LDBL_DIG 15
#define LDBL_MIN_EXP -1021
#define LDBL_MIN 2.225073858507201E-308
#define LDBL_MIN_10_EXP -307
#define LDBL_MAX_EXP +1024
#define LDBL_MAX 1.797693134862316E+308
#define LDBL_MAX_10_EXP +308
#else
#define FLT_ROUNDS -1
#define FLT_RADIX 2
#define FLT_MANT_DIG 24
#define FLT_EPSILON 1.19209290E-07F
#define FLT_DIG 6
#define FLT_MIN_EXP -125
#define FLT_MIN 1.17549435E-38F
#define FLT_MIN_10_EXP -37
#define FLT_MAX_EXP +128
#define FLT_MAX 3.40282347E+38F
#define FLT_MAX_10_EXP +38
#define DBL_MANT_DIG 53
#define DBL_EPSILON 2.2204460492503131E-16
#define DBL_DIG 15
#define DBL_MIN_EXP -1021
#define DBL_MIN 2.225073858507201E-308
#define DBL_MIN_10_EXP -307
#define DBL_MAX_EXP +1024
#define DBL_MAX 1.797693134862316E+308
#define DBL_MAX_10_EXP +308
#define LDBL_MANT_DIG 53
#define LDBL_EPSILON 2.2204460492503131E-16
#define LDBL_DIG 15
#define LDBL_MIN_EXP -1021
#define LDBL_MIN 2.225073858507201E-308
#define LDBL_MIN_10_EXP -307
#define LDBL_MAX_EXP +1024
#define LDBL_MAX 1.797693134862316E+308
#define LDBL_MAX_10_EXP +308
#endif
#endif

View File

@ -0,0 +1,30 @@
/* Copyright 1992 Manx Software Systems, Inc. All rights reserved */
#ifndef __GRAPHICS_H
#define __GRAPHICS_H
#define BLACK 0
#define BLUE 1
#define GREEN 2
#define CYAN 3
#define RED 4
#define MAGENTA 5
#define YELLOW 6
#define WHITE 7
#define BLINK 1
#define NO_BLINK 0
#define HIGH 1
#define LOW 0
void circle(int _x, int _y, int _r);
void color(int _clr);
void ground(int _color);
void line(int _x1, int _y1, int _x2, int _y2);
void lineto(int _x2, int _y2);
void mode(int _newmode);
void palette(int _val);
void point(int _x, int _y);
void set_asp(int _x_asp, int _y_asp);
#endif /* __GRAPHICS_H */

View File

@ -0,0 +1,82 @@
/* Copyright (C) 1982 by Manx Software Systems */
/*
* if MAXCHAN is changed then the initialization of chantab in croot.c
* should be adjusted so that it initializes EXACTLY MAXCHAN elements of
* the array. If this is not done, the I/O library may exhibit
* strange behavior.
*/
#define MAXCHAN 11 /* maximum number of I/O channels */
/*
* argument to device routines.
* this is a typedef to allow future redeclaration to guarantee
* enough space to store either a pointer or an integer.
*/
typedef char *_arg;
/*
* device control structure
*/
struct device {
char d_read;
char d_write;
char d_ioctl; /* used by character special devices (eg CON:) */
char d_seek; /* used by random I/O devices (eg: a file) */
int (*d_open)(); /* for special open handling */
};
/*
* device table, contains names and pointers to device entries
*/
struct devtabl {
char *d_name;
struct device *d_dev;
_arg d_arg;
};
/*
* channel table: relates fd's to devices
*/
struct channel {
char c_read;
char c_write;
char c_ioctl;
char c_seek;
int (*c_close)();
_arg c_arg;
} ;
extern struct channel chantab[MAXCHAN];
struct fcb {
char f_driv;
char f_name[8];
char f_type[3];
char f_ext;
char f_resv[2];
char f_rc;
char f_sydx[16];
char f_cr;
unsigned f_record; char f_overfl;
};
struct fcbtab {
struct fcb fcb;
char offset;
char flags;
char user;
};
#define OPNFIL 15
#define CLSFIL 16
#define DELFIL 19
#define READSQ 20
#define WRITSQ 21
#define MAKFIL 22
#define SETDMA 26
#define GETUSR 32
#define READRN 33
#define WRITRN 34
#define FILSIZ 35
#define SETREC 36
#define Wrkbuf ((char *)0x80)

View File

@ -0,0 +1,24 @@
/* Copyright Manx Software Systems, Inc. 1990. All rights reserved */
#ifndef __LIMITS_H
#define __LIMITS_H
#define CHAR_BIT 8
#define SCHAR_MIN -127
#define SCHAR_MAX 127
#define UCHAR_MAX 255U
#define CHAR_MIN SCHAR_MIN
#define CHAR_MAX SCHAR_MAX
#define MB_LEN_MAX 1
#define SHRT_MIN -32767
#define SHRT_MAX +32767
#define USHRT_MAX 65535U
#define LONG_MIN -2147483647
#define LONG_MAX +2147483647
#define ULONG_MAX 4294967295U
#define INT_MIN -32767
#define INT_MAX +32767
#define UINT_MAX 65535U
#endif

View File

@ -0,0 +1,210 @@
nlist
; Copyright (C) 1985 by Manx Software Systems, Inc.
; :ts=8
ifndef MODEL
MODEL equ 0
endif
if MODEL and 1
largecode
FARPROC equ 1
FPTRSIZE equ 4
else
FPTRSIZE equ 2
endif
if MODEL and 2
LONGPTR equ 1
endif
;this macro to be used on returning
;restores bp and registers
pret macro
if havbp
pop bp
endif
ret
endm
internal macro pname
public pname
pname proc
endm
intrdef macro pname
public pname
ifdef FARPROC
pname label far
else
pname label near
endif
endm
procdef macro pname, args
public pname&_
ifdef FARPROC
_arg = 6
pname&_ proc far
else
_arg = 4
pname&_ proc near
endif
ifnb <args>
push bp
mov bp,sp
havbp = 1
decll <args>
else
havbp = 0
endif
endm
entrdef macro pname, args
public pname&_
ifdef FARPROC
_arg = 6
pname&_:
else
_arg = 4
pname&_:
endif
ifnb <args>
if havbp
push bp
mov bp,sp
else
error must declare main proc with args, if entry has args
endif
decll <args>
endif
endm
;this macro equates 'aname' to arg on stack
decl macro aname, type
;;'byte' or anything else
havtyp = 0
ifidn <type>,<byte>
aname equ byte ptr _arg[bp]
_arg = _arg + 2
havtyp = 1
endif
ifidn <type>,<dword>
aname equ dword ptr _arg[bp]
_arg = _arg + 4
havtyp = 1
endif
ifidn <type>,<cdouble>
aname equ qword ptr _arg[bp]
_arg = _arg + 8
havtyp = 1
endif
ifidn <type>, <ptr>
ifdef LONGPTR
aname equ dword ptr _arg[bp]
_arg = _arg + 4
else
aname equ word ptr _arg[bp]
_arg = _arg + 2
endif
havtyp = 1
endif
ifidn <type>, <fptr>
ifdef FARPROC
aname equ dword ptr _arg[bp]
_arg = _arg + 4
else
aname equ word ptr _arg[bp]
_arg = _arg + 2
endif
havtyp = 1
endif
ifidn <type>, <word>
aname equ word ptr _arg[bp]
_arg = _arg + 2
havtyp = 1
endif
ife havtyp
error -- type is unknown.
endif
endm
;this macro loads an arg pointer into DEST, with optional SEGment
ldptr macro dest, argname, seg
ifdef LONGPTR
ifnb <seg> ;;get segment if specified
ifidn <seg>,<es>
les dest,argname
else
ifidn <seg>,<ds>
lds dest,argname
else
mov dest, word ptr argname
mov seg, word ptr argname[2]
endif
endif
else
ifidn <dest>,<si> ;;si gets seg in ds
lds si, argname
else
ifidn <dest>,<di> ;;or, es:di
les di, argname
else
garbage error: no seg for long pointer
endif
endif
endif
else
mov dest, word ptr argname ;;get the pointer
ENDIF
ENDM
decll macro list
IRP i,<list>
decl i
ENDM
ENDM
pend macro pname
pname&_ endp
endm
retptrm macro src,seg
mov ax, word ptr src
ifdef LONGPTR
mov dx, word ptr src+2
endif
endm
retptrr macro src,seg
mov ax,src
ifdef LONGPTR
ifnb <seg>
mov dx, seg
endif
endif
endm
retnull macro
ifdef LONGPTR
sub dx,dx
endif
sub ax,ax
endm
pushds macro
ifdef LONGPTR
push ds
endif
endm
popds macro
ifdef LONGPTR
pop ds
endif
endm
finish macro
codeseg ends
endm
list
codeseg segment byte public 'code'
assume cs:codeseg

View File

@ -0,0 +1,42 @@
/* Copyright Manx Software Systems, Inc. 1990. All rights reserved */
#ifndef __LOCALE_H
#define __LOCALE_H
#ifndef NULL
#define NULL ((void *)0)
#endif
#define LC_ALL 0
#define LC_COLLATE 1
#define LC_CTYPE 2
#define LC_MONETARY 3
#define LC_NUMERIC 4
#define LC_TIME 5
typedef struct lconv {
char *decimal_point; /* "." */
char *thousands_sep; /* "" */
char *grouping; /* "" */
char *int_curr_symbol; /* "" */
char *currency_symbol; /* "" */
char *mon_decimal_point; /* "" */
char *mon_thousands_sep; /* "" */
char *mon_grouping; /* "" */
char *positive_sign; /* "" */
char *negative_sign; /* "" */
char int_frac_digits; /* CHAR_MAX */
char frac_digits; /* CHAR_MAX */
char p_cs_precedes; /* CHAR_MAX */
char p_sep_by_space; /* CHAR_MAX */
char n_cs_precedes; /* CHAR_MAX */
char n_sep_by_space; /* CHAR_MAX */
char p_sign_posn; /* CHAR_MAX */
char n_sign_posn; /* CHAR_MAX */
} lconv;
char *setlocale(int _category, const char *_locale);
struct lconv *localeconv(void);
#endif

View File

@ -0,0 +1,49 @@
/* Copyright Manx Software Systems, Inc. 1990. All rights reserved */
#ifndef __MATH_H
#define __MATH_H
double atof(const char *);
double frexp(double, int *);
double ldexp(double, int);
double modf(double, double *);
double cotan(double);
double log10(double);
#if 0
#define pow(x,y) power(x,y)
#endif
double log(double);
double pow(double, double);
double sqrt(double);
double fabs(double);
double fmod(double, double);
double sin(double);
double cos(double);
double tan(double);
double exp(double);
double floor(double);
double ceil(double);
double sinh(double);
double cosh(double);
double tanh(double);
double asin(double);
double acos(double);
double atan(double);
double atan2(double, double);
#define HUGE_VAL 1.797693134862316E+308
#define HUGE HUGE_VAL
#define LOGHUGE (709.778)
#define TINY_VAL (2.2e-308)
#define TINY TINY_VAL
#define LOGTINY (-708.396)
#if !__STDC__ /* non ANSI C functions */
double ran(void);
double randl(double _x);
void sran(long _seed);
#endif /* !__STDC__ */
#endif

View File

@ -0,0 +1,23 @@
/* Copyright 1992 Manx Software Systems, Inc. All rights reserved */
#ifndef __MCH86_H
#define __MCH86_H
far void * abstoptr(long _addr);
int farcall(void (*_func)(void),
struct regs *_inregs, struct regs *_outregs);
int inportb(int _port);
int inportw(int _port);
void outportb(int _port, int _val);
void outportw(int _port, int _val);
far void * _ptradd(far void *_lptr, long _val);
long _ptrdiff(far void *_lptr1, far void *_lptr2);
void pokeb(far char *_addr, int);
void pokew(far int *_addr, int);
unsigned char peekb(far char *_addr);
unsigned int peekw(far int *_addr);
void segread(unsigned *_ptr);
int sysint(int _sint, struct regs *_inregs, struct regs *_outregs);
#endif /* __MCH86_H */

View File

@ -0,0 +1,2 @@
extern char *memcpy(), *memchr(), *memccpy(), memset();
extern int memcmp();

View File

@ -0,0 +1,7 @@
#if (sizeof(int (*)()) == 4)
#define _LARGECODE
#endif
#if (sizeof(char *) == 4)
#define _LARGEDATA
#endif

View File

@ -0,0 +1,8 @@
int _intr_sp(int _speed);
void monitor(
void (*_lowpc)(),
void (*_highpc)(),
unsigned int *_buf,
int _pockets,
int _nfunc
);

View File

@ -0,0 +1,255 @@
/* Copyright (C) 1990 by Manx Software Systems, Inc. - All rights reserved */
/*****************************************************************************
OBJ86.H - Aztec 8086 Object Format definitions.
*****************************************************************************/
/*---------------------------------------------------------------------------
OBJECT RECORD TYPES
---------------------------------------------------------------------------*/
#define SPECIAL 0xf0 /* Mask for primary loader codes */
#define SPEC2 0x00 /* Value of above mask for debug items */
#define EXTEND 0x0f /* Shift-code for extended object records (2-bytes) */
/* PRIMARY LOADER ITEM SET */
#define THEEND 0x00 /* End of the object module */
/* Debugging information types */
#define BLOCKST 0x01 /* block start */
#define AUTOSYM 0x02 /* auto variable def */
#define ARGSYM 0x03 /* function argument def */
#define REGSYM 0x04 /* register variable def */
#define AREGSYM 0x05 /* register var argument */
#define STATSYM 0x06 /* static variable def */
#define FILESYM 0x07 /* file scope static var def */
#define GBLTYPE 0x08 /* global variable type info */
#define TDEFSYM 0x09 /* typedef name */
#define STRCTAG 0x0a /* structure tag definition */
#define STRCDEF 0x0b /* start of structure definition */
#define SETFILE 0x0c /* set working file name for line table */
#define SETLINE 0x0d /* set current line # */
/* 0x0f reserved for EXTEND shift-code */
/* 'Normal' loader items (may use lower nybble for data) */
#define ABSDATA 0x10 /* Raw data items */
#define EXPR 0x20 /* Expression to follow */
#define SMLINT 0x30 /* Small sized integer (generally part of an EXPR) */
#define SMLNEG 0x40 /* Small sized neg int (generally part of an EXPR) */
#define MEDINT 0x50 /* Medium sized integer (generally part of an EXPR) */
#define LCLSYM 0x60 /* Unnamed symbol reference (ex: $20000) */
#define GBLSYM 0x70 /* Named symbol reference */
#define SPACE 0x80 /* Blank space (dup (?) in assembly) */
#define USECOMN 0x90 /* Switch current segment */
#define CODEREF 0xa0 /* Code reference w/ small offset */
#define DATAREF 0xb0 /* Data reference w/ small offset */
#define BSSREF 0xc0 /* BSS reference w/ small offset */
#define SEGREL 0xd0 /* General segment relative reference */
/* 'Special' loader items (use lower nybble for type code) */
#define DATASEG 0xf0 /* para # of data segment */
#define BEXPR 0xf1 /* Fixup modifier - byte-sized absolute ref */
#define BREL 0xf2 /* Fixup modifier - byte-sized self-relative ref */
#define LRGINT 0xf3 /* Large-sized integer (generally part of an EXPR) */
#define USECODE 0xf4 /* Switch to code segment */
#define USEDATA 0xf5 /* Switch to data segment */
#define STARTAD 0xf6 /* Specify starting address of program */
#define LRGCODE 0xf7 /* Code reference w/ large offset */
#define LRGDATA 0xf8 /* Data reference w/ large offset */
#define INTJSR 0xf9 /* interpreter call instruction (unused on 8086) */
#define WREL 0xfa /* Fixup modifier - word-sized self-relative ref */
#define LRGBSS 0xfb /* BSS reference w/ large offset */
#define HUGINT 0xfc /* Really-large-sized int (generally part of an EXPR) */
#define LEXPR 0xfd /* Fixup modifier - 32-bit absolute reference */
#define CODESEG 0xfe /* para # of code segment */
#define NLINE 0xff /* Increment source code line counter by one */
/*
If no Fixup modifier is specified (BREL, BEXPR, etc.) then word-sized
absolute is assumed.
*/
/* EXTENDED LOADER ITEM SET */
/*
Extended loader item set (Selected by loader item EXTEND)
Codes 01->3f in the extended set are reserved as normal 1-byte IDs
Codes 40->f0 in the extended set are reserved as high-nybble IDs, with
the low nybble usable for data.
*/
#define ORIGIN 0x01 /* Set location to an abs off w/in current seg */
/* LOW-NYBBLE OBJECT RECORD INFORMATION */
/* within STRCDEF the following are used */
#define MEMBDEF 0x01 /* structure member info */
#define FLDDEF 0x02 /* bit field member */
/* low nibble of EXPR item (operators) */
#define ADD 1
#define SUB 2
#define MUL 3
#define DIV 4
#define MOD 5
#define AND 6
#define OR 7
#define XOR 8
#define RSH 9
#define LSH 10
#define NOT 11 /* must be the first unary op, and only unarys may follow */
#define NEG 12
#define OHIGH 13
#define OLOW 14
#define OSEG 15
/*---------------------------------------------------------------------------
MODULE MAGIC NUMBERS
---------------------------------------------------------------------------*/
#define M_MAGIC 0x5466 /* Small code object module */
#define M_LMAGIC 0x020c /* Large code object module */
#define M_OVROOT ((short)0xcf56) /* Root symbol table (overlay) */
#define M_LIBRARY ((short)0xec62) /* Object code library */
/*---------------------------------------------------------------------------
LIBRARY AND MODULE HEADER RECORDS
---------------------------------------------------------------------------*/
/* Header record for an object module */
struct module {
short m_magic; /* magic number for object files */
char m_name[8]; /* module name */
unsigned short m_code; /* size of code in this module */
unsigned short m_data; /* size of data in this module */
unsigned short m_static;/* size of static storage (bss) in this module */
unsigned short m_global;/* offset of start of global symbols */
short m_nglobal; /* # of global symbols */
unsigned short m_local; /* offset of start of local symbols */
short m_nlocal; /* # of local symbols */
unsigned short m_end; /* end of local symbols */
unsigned short m_next; /* offset of next module in this file */
unsigned short m_nfix; /* number of segment fixes required */
};
#define LBSIZE (2048-2*sizeof(short))
/* Header record for a library file */
struct newlib {
short nl_magic; /* magic number for library files */
unsigned short nl_next; /* location of next dictionary block */
char nl_dict[LBSIZE]; /* dictionary buffer */
/* the format of the dictionary is:
two bytes - (position of module defining symbol) / 128
nul terminated string - name of symbol
*/
};
/*---------------------------------------------------------------------------
NAMED AND UNNAMED SYMBOL STRUCTURE
---------------------------------------------------------------------------*/
struct symtab {
char s_type,s_flags;
unsigned short s_value;
};
/*
symbol table entry is followed by a segment or group # if the SF_HAVSEG
flag is set.
Global symbols are followed by a nul terminated string which is the
name of the symbol.
*/
/*---------------------------------------------------------------------------
SYMBOL TYPES AND FLAGS
---------------------------------------------------------------------------*/
/* S_TYPE FIELD VALUES FOR SYMBOLS/SEGMENTS */
#define S_ABS 1 /* Equ-type absolute symbols & abs segments */
#define S_CODE 2 /* Item in code segment */
#define S_DATA 3 /* Item in data segment */
#define S_COMN 4 /* common segment (obsolete) */
#define S_CMNREF 5 /* Item in a general segment */
#define S_ROOTSYM 6 /* used by DOS linker to tag root symbols */
#define S_ABSOLUTE 6 /* used by ROM linker to designate absolute syms */
#define S_EXPR 6 /* Used internally by assembler */
#define S_UND 7 /* Symbol is undefined or BSS */
#define S_WEAK 8 /* Currently unused */
#define S_BSS 9 /* Symbol is BSS */
#define S_GROUP 10 /* Group */
#define S_PSEG 11 /* public segment */
#define S_SSEG 12 /* stack segment */
#define S_MSEG 13 /* memory segment */
#define S_CSEG 14 /* common segment (new form) */
#define S_CLASS 15 /* segment class name */
#define ST_TYPE 0x0f /* Mask for type portion of a symbol */
/* S_TYPE FIELD MODIFIERS (SEGMENTS) */
#define ST_ALIGN 0x70 /* Mask for alignment type (for segments) */
#define ST_BYTE 0x00 /* alignment boundarys (byte) */
#define ST_WORD 0x10 /* even */
#define ST_PARA 0x20 /* 16-byte */
#define ST_PAGE 0x30 /* 256-byte */
#define ST_INPAGE 0x40 /* Must fit completely within 256 byte page */
#define ST_ABSSEG 0x70 /* segment @ absolute address */
#define ST_BIGSEG 0x80 /* set for 64k segment */
/* S_FLAGS FIELD VALUES (MIXED SEGMENT/NON-SEGMENT) */
#define SF_HAVEAT 0x01 /* Segment followed by par # (seg only) */
#define SF_HAVTYPE 0x01 /* symbol is followed by type info (sym only) */
#define SF_DATAREF 0x02 /* used for dataseg references */
#define SF_HAVCLAS 0x04 /* symbol is followed by class index */
#define SF_GLOBL 0x08 /* symbol is public/extern */
#define SF_HAVSEG 0x10 /* symbol is followed by segment/group # */
#define SF_OVSYM 0x20 /* overlay symbol */
#define S_FIXED 0x40
#define S_UNNAMED 0x80
/*
TYPICAL DATA DECLATAIONS
------------------------
extern code:
Declaration: extern int func();
s_type: S_UND
s_flags: S_FIXED | SF_GLOBL
s_value: always 0
defined code:
Declaration: int func() { }
s_type: S_CODE
s_flags: S_FIXED | SF_GLOBL
s_value: offset from the base of the module's code segment
extern data:
Declaration: extern int an_int;
s_type: S_UND
s_flags: S_FIXED | SF_GLOBL
s_value: always 0
defined BSS data:
Declaration: int an_int;
s_type: S_DATA
s_flags: S_FIXED | SF_GLOBL | SF_DATAREF
s_value: size of the object
defined init data:
Declaration: int an_int = 5;
s_type: S_DATA
s_flags: S_FIXED | SF_GLOBL | SF_DATAREF
s_value: offset from the base of the module's data segment
*/

View File

@ -0,0 +1,14 @@
/* Copyright Manx Software Systems, Inc. 1990. All rights reserved */
#ifndef __SETJMP_H
#define __SETJMP_H
#define __JBUFSIZE (6*sizeof(char *))
typedef char jmp_buf[__JBUFSIZE];
int setjmp(jmp_buf _env);
void longjmp(jmp_buf _env, int _val);
#endif

View File

@ -0,0 +1,52 @@
/* Copyright Manx Software Systems, Inc. 1990. All rights reserved */
#ifndef __SGTTY_H
#define __SGTTY_H
#define TIOCGETP 0 /* read contents of tty control structure */
#define TIOCSETP 1 /* set contents of tty control structure */
#define TIOCSETN 1 /* ditto only don't wait for output to flush */
struct sgttyb {
char sg_erase; /* ignored */
char sg_kill; /* ignored */
short sg_flags; /* control flags */
};
/* settings for flags */
#define _VALID 0x3a
#define RAW 0x20 /* no echo or mapping of input/output BDOS(6) */
#define CRMOD 0x10 /* map input CR to NL, output NL to CR LF */
#define ECHO 0x08 /* ignored unless CBREAK is set */
#define CBREAK 0x02 /* input using BDOS(1), unless echo off then */
/* same as RAW */
#if 0 /* Not yet implemented */
#define TIOCNTLC 3 /* check for control C */
#define TIOCGETC 4 /* get tchars structure */
#define TIOCSETC 5 /* set tchars structure */
#define TIOCFLUSH 6 /* flush input/typeahead queues */
/* settings for flags */
#define TABSIZ 0x000f /* size of tab if XTABS is set */
#define XTABS 0x0010 /* convert tabs to spaces on output */
#define CRMOD 0x0020 /* CR -> LF on input, LF -> CR/LF on output */
#define ECHO 0x0040 /* echo input to output */
#define ECHOE 0x0080 /* follow erase character by space, BS */
#define CBREAK 0x0100 /* don't wait for the whole line */
#define NODELAY 0x0200 /* return even if no characters */
#define RAW 0x0400 /* no input or output mapping at all */
#define CHKKEY 0x0800 /* check for keyboard characters during output */
#define ERASE 0x1000 /* erase character space before drawing */
struct tchars {
char t_intrc; /* interrupt - ^C (not [yet] implemented) */
char t_quitc; /* quit - ^\ (not [yet] implemented) */
/* char t_startc; /* start output (not supported) */
/* char t_stop; /* stop output (not supported) */
char t_eofc; /* end-of-file - ^D */
/* char t_brck; /* input delimiter (like nl) (not supported) */
};
#endif
#endif

View File

@ -0,0 +1,25 @@
/* Copyright Manx Software Systems, Inc. 1990. All rights reserved */
#ifndef __SIGNAL_H
#define __SIGNAL_H
typedef char sig_atomic_t;
#define SIGINT 1
#define SIGTERM 2
#define SIGABRT 3
#define SIGFPE 4
#define SIGILL 5
#define SIGSEGV 6
#define _NUMSIG 6
#define _FSTSIG 1
#define SIG_DFL ((void (*)(int))0)
#define SIG_IGN ((void (*)(int))1)
#define SIG_ERR ((void (*)(int))-1)
void (*signal(int _sig, void (*_func)(int)))(int);
int raise(int _sig);
#endif

View File

@ -0,0 +1,36 @@
/* Copyright Manx Software Systems, Inc. 1990. All rights reserved */
#ifndef __STAT_H
#define __STAT_H
struct stat {
char st_attr; /* file's attributes */
long st_mtime; /* date&time file was created or last modified */
long st_size; /* size of file, in bytes */
};
/* settings of the st_attr field */
#define ST_RDONLY 0x01 /* read only file */
#define ST_HIDDEN 0x02 /* hidden file */
#define ST_SYSTEM 0x04 /* system file */
#define ST_VLABEL 0x08 /* volume label */
#define ST_DIRECT 0x10 /* file is a sub-directory */
#define ST_ARCHIV 0x20 /* set when file has been written and closed */
/* the format of the st_mtime field is:
< year > < month> < day > < hours > < minutes > < sec/2 >
3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
where:
year is from 0-119 for 1980-2099
month is 1-12
day is 1-31
hours is 0-23
minutes is 0-59
sec/2 is 0-29
*/
int stat(char *_file, struct stat *_sp);
#endif

View File

@ -0,0 +1,11 @@
/* Copyright Manx Software Systems, Inc. 1990. All rights reserved */
#ifndef __STDARG_H
#define __STDARG_H
typedef char *va_list;
#define va_start(ap, parmN) ((ap) = (char *)(&parmN + 1))
#define va_arg(ap, type) ((ap) += sizeof(type), ((type *)(ap))[-1])
#define va_end(ap)
#endif

View File

@ -0,0 +1,30 @@
/* Copyright 1990 Manx Software Systems, Inc */
#ifndef __STDDEF_H
#define __STDDEF_H
#ifndef _SIZE_T
#define _SIZE_T
typedef unsigned int size_t;
#endif
#ifndef _PTRDIFF_T
#define _PTRDIFF_T
typedef int ptrdiff_t;
#endif
#ifndef _WCHAR_T
#define _WCHAR_T
typedef char wchar_t;
#endif
#ifndef NULL
#define NULL ((void *)0)
#endif
extern int errno;
#define offsetof(type,memb) ((size_t)((unsigned long)&((type *)0)->memb))
#endif

View File

@ -0,0 +1,133 @@
/* Copyright 1989 Manx Software Systems, Inc. All rights reserved */
#ifndef __STDIO_H
#define __STDIO_H
#include <stdarg.h>
#ifndef _SIZE_T
#define _SIZE_T
typedef unsigned int size_t;
#endif
#ifndef NULL
#define NULL ((void *)0)
#endif
#define BUFSIZ 1024
#define EOF (-1)
#define L_tmpnam 40
#define FOPEN_MAX 20 /* must agree with MAXCHAN in fcntl.h */
#define FILENAME_MAX 126
#define TMP_MAX 25
#define SEEK_SET 0 /* from beginning of file */
#define SEEK_CUR 1 /* from current position */
#define SEEK_END 2 /* from end of file */
#define stdin (&_iob[0])
#define stdout (&_iob[1])
#define stderr (&_iob[2])
typedef long int fpos_t;
typedef struct __stdio {
unsigned char *_bp; /* current position in buffer */
unsigned char *_bend; /* last character in buffer + 1 */
unsigned char *_buff; /* address of buffer */
unsigned short _flags; /* open mode, etc. */
char _unit; /* fd returned by open */
unsigned char _bytbuf; /* single byte buffer for unbuffered streams */
size_t _buflen; /* length of buffer */
unsigned short _tmpnum; /* name of file for temporaries */
} FILE;
extern FILE _iob[];
#define _IOMYBUF 0x0001 /* malloced buffer */
#define _IOEOF 0x0002 /* end-of-file encountered */
#define _IOERR 0x0004 /* error occurred */
#define _IOSTRNG 0x0008 /* special string stream */
#define _IOBIN 0x0010 /* file is binary ("b") */
#define _IOLBF 0x0020 /* line buffered */
#define _IOFBF 0x0040 /* fully buffered */
#define _IONBF 0x0080 /* completely unbuffered */
#define _IOCON 0x0100 /* console device */
#define _IOR 0x0200 /* stream opened in read mode */
#define _IOW 0x0400 /* stream opened in write mode */
#define _IORW 0x0800 /* stream opened in update mode */
#define _IOUNG 0x1000 /* ungetc was called */
#define _IOSYNC 0x2000 /* MPW compatibility */
#define _IODIRTY 0x4000 /* buffer has been written */
int remove(const char *_filename);
int rename(const char *_old, const char *_new);
FILE *tmpfile(void);
char *tmpnam(char *_s);
int fclose(FILE *_stream);
int fflush(FILE *_stream);
FILE *fopen(const char *_filename, const char *_mode);
FILE *freopen(const char *_filename, const char *_mode, FILE *_stream);
void setbuf(FILE *_stream, char *_buf);
int setvbuf(FILE *_stream, char *_buf, int _mode, size_t _size);
int fprintf(FILE *_stream, const char *_format, ...);
int fscanf(FILE *_stream, const char *_format, ...);
int printf(const char *_format, ...);
int scanf(const char *_format, ...);
int sprintf(char *_s, const char *_format, ...);
int sscanf(const char *_s, const char *_format, ...);
int vfprintf(FILE *_stream, const char *_format, va_list _arg);
int vprintf(const char *_format, va_list _arg);
int vsprintf(char *_s, const char *_format, va_list _arg);
int fgetc(FILE *_stream);
char *fgets(char *_s, int _n, FILE *_stream);
int fputc(int _c, FILE *_stream);
int fputs(const char *_s, FILE *_stream);
int getc(FILE *_stream);
int getchar(void);
char *gets(char *_s);
int putc(int _c, FILE *_stream);
int putchar(int _c);
int puts(const char *_s);
int ungetc(int _c, FILE *_stream);
size_t fread(void *_ptr, size_t _size, size_t _nmemb, FILE *_stream);
size_t fwrite(const void *_ptr, size_t _size, size_t _nmemb, FILE *_stream);
int fgetpos(FILE *_stream, fpos_t *_pos);
int fseek(FILE *_stream, long int _offset, int _whence);
int fsetpos(FILE *_stream, const fpos_t *_pos);
long int ftell(FILE *_stream);
void rewind(FILE *_stream);
void clearerr(FILE *_stream);
int feof(FILE *_stream);
int ferror(FILE *_stream);
void perror(const char *_s);
#ifdef __C_MACROS__
#define getc(fp) (((fp)->_flags & (_IOBIN|_IOSTRNG)) ? _getc(fp) : _agetc(fp))
#define putc(c,fp) (((fp)->_flags & (_IOBIN|_IOSTRNG)) ? _putc(c,fp) : _aputc(c,fp))
#define getchar() getc(stdin)
#define putchar(c) putc((c), stdout)
#define clearerr(fp) ((void)((fp)->_flags &= ~(_IOERR|_IOEOF)))
#define feof(fp) ((fp)->_flags&_IOEOF)
#define ferror(fp) ((fp)->_flags&_IOERR)
#endif
int _flsbuf(FILE *, int);
int _filbuf(FILE *);
#if !__STDC__ /* non ANSI C user-visible stuff */
FILE * fdopen(int, const char *);
#define fileno(fp) ((int)(fp)->_unit)
#define puterr(c) (putc((c),stderr))
int format(int (*_func)(int), const char *_fmt, va_list _varargs);
int putw(int _w, FILE *_stream);
int getw(FILE *_stream);
#endif /* !__STDC__ */
#endif /* _STDIO_H */

View File

@ -0,0 +1,93 @@
/* Copyright 1989 Manx Software Systems, Inc. All rights reserved */
#ifndef __STDLIB_H
#define __STDLIB_H
# ifndef _SIZE_T
# define _SIZE_T
typedef unsigned int size_t;
# endif
#ifndef _WCHAR_T
#define _WCHAR_T
typedef char wchar_t;
#endif
# ifndef ERANGE
#define ERANGE 21 /* Was 13 */
# endif
#ifndef NULL
#define NULL ((void *)0)
#endif
#define EXIT_FAILURE (-1)
#define EXIT_SUCCESS 0
#define HUGE_VAL 1.797693134862316E+308
#define RAND_MAX 32767
#define MB_CUR_MAX 1
#define MB_LEN_MAX 1
typedef struct {
int quot;
int rem;
} div_t; /* quotient and remainder for div() */
typedef struct {
long quot;
long rem;
} ldiv_t; /* quotient and remainder for ldiv() */
double atof(const char *_nptr);
int atoi(const char *_nptr);
long int atol(const char *_nptr);
double strtod(const char *_nptr, char **_endptr);
long int strtol(const char *_nptr, char **_endptr, int _base);
unsigned long int strtoul(const char *_nptr, char **_endptr, int _base);
int rand(void);
void srand(unsigned int _seed);
void *calloc(size_t _nmemb, size_t _size);
void free(void *_ptr);
void *malloc(size_t _size);
void *realloc(void *_ptr, size_t _size);
void abort(void);
int atexit(void (*_func)(void));
void exit(int _status);
char *getenv(const char *_name);
int system(const char *_string);
void *bsearch(const void *_key, const void *_base, size_t _nmemb, size_t _size,
int (*_compar)(const void *, const void *));
void qsort(void *_base, size_t _nmemb, size_t _size,
int (*_compar)(const void *, const void *));
int abs(int _j);
div_t div(int _numer, int _denom);
long int labs(long int _j);
ldiv_t ldiv(long int _numer, long int _denom);
int mblen(const char *_s, size_t _n);
int mbtowc(wchar_t *_pwc, const char *_s, size_t _n);
int wctomb(char *_s, wchar_t _wchar);
size_t mbstowcs(wchar_t *_pwcs, const char *_s, size_t _n);
size_t wcstombs(char *_s, const wchar_t *_pwcs, size_t _n);
#if !__STDC__
/* non ANSI C functions */
void ftoa(double _val, char *_buf, int, int);
void *lfind(const void *_key, const void *_base,
size_t *_num, size_t _width, int (*_fcmp)(const void *, const void *));
void *lsearch(const void *_key, const void *_base,
size_t *_num , size_t _width, int (*_fcmp)(const void *, const void *));
int max(int _x1, int _x2);
int min(int _x1, int _x2);
long double strtold(const char *_nptr, char **_endptr);
#endif /* !__STDC__ */
#endif /* _STDLIB_H */

View File

@ -0,0 +1,57 @@
/* Copyright 1989 Manx Software Systems, Inc. All rights reserved */
#ifndef __STRING_H
#define __STRING_H
#ifndef _SIZE_T
#define _SIZE_T
typedef unsigned int size_t;
#endif
#ifndef NULL
#define NULL ((void *)0)
#endif
void *memcpy(void *_dst, const void *_src, size_t _n);
void *memmove(void *_dst,const void *_src, size_t _n);
char *strcpy(char *_dst, const char *_src);
char *strncpy(char *_dst, const char *_src, size_t _n);
char *strcat(char *_dst, const char *_src);
char *strncat(char *_dst, const char *_src, size_t _n);
void *memchr(const void *_s, int _c, size_t _n);
void *memset(void *_s, int _c, size_t _n);
int memcmp(const void *_s1, const void *_s2, size_t _n);
int strcmp(const char *_s1, const char *_s2);
int strncmp(const char *_s1, const char *_s2, size_t _n);
char *strpbrk(const char *_s1, const char *_s2);
char *strchr(const char *_s, int _c);
char *strrchr(const char *_s, int _c);
char *strstr(const char *_s1, const char *_s2);
char *strtok(char *_s1, const char *_s2);
char *strerror(int _errnum);
size_t strcspn(const char *_s1, const char *_s2);
size_t strlen(const char *_s);
size_t strspn(const char *_s1, const char *_s2);
int strcoll(const char *_s1, const char *_s2);
size_t strxfrm(char *_s1, const char *_s2, size_t _n);
#if !__STDC__ /* non ANSI C functions */
void *memccpy(void *_dst, const void *_src, int _c, size_t _n);
void movblock(far char *_src, far char *_dest, int _len);
void movmem(const void *_src, void *_dest, int _len);
char *index(char *_s, int _c);
char *rindex(char *_s, int _c);
void setmem(void *_area, int _len, int _val);
void swapmem(void *_s1, void *_s2, size_t _n);
char *strdup(char *_s);
int stricmp(const char *_str1, const char *_str2);
char *strlwr(char *_str);
int strnicmp(const char *_str1, const char *_str2, int _max);
char *strrev(char *_str);
#endif /* !__STDC__ */
#endif /* _STRING_H */

View File

@ -0,0 +1,58 @@
/* Copyright 1990 Manx Software Systems, Inc */
#ifndef __TIME_H
#define __TIME_H
#ifndef __STDDEF_H
#include <stddef.h>
#endif
#define CLOCKS_PER_SEC 100 /* clock() ticks per second */
typedef unsigned long clock_t;
typedef unsigned long time_t;
struct tm {
int tm_sec; /* seconds after the minute [0,60] */
int tm_min; /* minutes after the hour [0,59] */
int tm_hour; /* hours since midnight [0,23] */
int tm_mday; /* day of the month [1,31] */
int tm_mon; /* months since jan [0,11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since sunday [0,6] */
int tm_yday; /* days since jan 1 [0,365] */
int tm_isdst; /* pos if DST in effect; 0 if not; neg if can't tell */
int tm_hsec; /* hundreths of second; not in ANSI C */
};
clock_t clock(void);
double difftime(time_t _time1, time_t _time2);
time_t mktime(struct tm *_timeptr);
time_t time(time_t *_timer);
char *asctime(const struct tm *_timeptr);
char *ctime(const time_t *_timer);
struct tm *gmtime(const time_t *_timer);
struct tm *localtime(const time_t *_timer);
size_t strftime(char *_s, size_t _maxsize, const char *_format,
const struct tm *_timeptr);
#if !__STDC__
struct ft {
unsigned sec : 5,
min : 6,
hour : 5,
day : 5,
month : 4,
year : 7;
};
void dostime(struct tm *_buf);
struct tm * TimeFile2TM(struct ft *);
struct ft * TimeTM2File(struct tm *);
int utime(char *_name, struct utimebuf *_timeptr);
#endif /* !__STDC__ */
#endif

View File

@ -0,0 +1,15 @@
; :ts=8
;Copyright (C) 1983 by Manx Software Systems
include lmacros.h
ifdef FARPROC
extrn _brk_:far
else
extrn _brk_:near
endif
procdef brk
jmp _brk_
pend brk
finish
end

View File

@ -0,0 +1,52 @@
; Copyright (C) 1983, 85 by Manx Software Systems
; :ts=8
include lmacros.h
public $clswt
$clswt proc
pop bx ; get address of table
ifdef FARPROC
pop es
endif
push di
push si
mov si,bx ; save base address
dec cx
mov di,cx ; save number of entries in di
ltop:
ifdef FARPROC
cmp ax,es:word ptr [bx]
jne notit
cmp dx,es:word ptr 2[bx]
je found
else
cmp ax,cs:word ptr [bx]
jne notit
cmp dx,cs:word ptr 2[bx]
je found
endif
notit:
add bx,4
loop ltop
found:
shl di,1
shl di,1 ; adjust di for length of values
add di,si ; di now points at array of labels
sub bx,si ; find which entry matched
shr bx,1 ; divide by 2 to get offset to label
ifdef FARPROC
mov ax,es:word ptr [di][bx] ; get address to return to
pop si
pop di
push es
push ax
ret
else
mov ax,cs:word ptr [di][bx] ; get address to return to
pop si
pop di
jmp ax
endif
$clswt endp
finish
end

View File

@ -0,0 +1,256 @@
codeseg segment para public 'code'
dataseg segment para public 'data'
dataseg ends
assume cs:codeseg,ds:dataseg,es:dataseg,ss:dataseg
;/* Copyright (C) 1981,1982, 1983 by Manx Software Systems */
;#include "errno.h"
;#include "fcntl.h"
;
;static char **Argv;
;static int Argc;
;
;extern int _ioflg[];
;
;_Croot(cp, first)
;register char *cp;
# 10 'croot.c'
^| $3
public _Croot_
_Croot_ proc near
ifdef $20004
push bp
mov bp,sp
endif
ifdef $20001
add sp,$20001
endif
ifdef $20002
push di
endif
ifdef $20003
push si
endif
;{
mov si,4[bp]
; register char **cpp;
; char *_sbrk();
;#ifdef REDIR
;
; /* start the timer */
;
; (void)_clock(0);
~ cpp di "**c"
~ cp si "*c"
~~ first 6 "i"
^^^^^^^^^^^ mov ax,00H
push ax
call near ptr _clock_
pop cx
;
; _ioflg[0] = _ioflg[1] = _ioflg[2] = O_TEXT;
^^ mov ax,01000H
mov word ptr _ioflg_+4,01000H
mov word ptr _ioflg_+2,ax
mov word ptr _ioflg_,ax
; _ioflg[0] |= _isatty(0) ? O_ISTTY:0; /* set flag for i/o routines */
^ mov ax,00H
push ax
call near ptr _isatty_
pop cx
test ax,ax
beq $20005
mov ax,08000H
jmp $20006
$20005:
mov ax,00H
$20006:
or ax, word ptr _ioflg_
mov word ptr _ioflg_,ax
; _ioflg[1] |= _isatty(1) ? O_ISTTY:0; /* set flag for i/o routines */
^ mov ax,01H
push ax
call near ptr _isatty_
pop cx
test ax,ax
beq $20007
mov ax,08000H
jmp $20008
$20007:
mov ax,00H
$20008:
or ax, word ptr _ioflg_+2
mov word ptr _ioflg_+2,ax
; _ioflg[2] |= _isatty(2) ? O_ISTTY:0; /* set flag for i/o routines */
^ mov ax,02H
push ax
call near ptr _isatty_
pop cx
test ax,ax
beq $20009
mov ax,08000H
jmp $20010
$20009:
mov ax,00H
$20010:
or ax, word ptr _ioflg_+4
mov word ptr _ioflg_+4,ax
;
; Argv = (char **)_sbrk((first+1)*sizeof(char *));
^^ mov ax,word ptr 6[bp]
shl ax,1
inc ax
inc ax
push ax
call near ptr _sbrk_
pop cx
mov word ptr Argv_,ax
; Argv[0] = "";
^ mov ax, offset $20000+0
mov bx, word ptr Argv_
mov word ptr [bx], offset $20000+0
; cpp = &Argv[Argc = first];
^ mov ax,word ptr 6[bp]
mov word ptr Argc_,ax
shl ax,1
mov di, word ptr Argv_
add di,ax
; for (;;) {
^$6:
; while (*cp == ' ' || *cp == '\t')
^$7:
cmp byte ptr [si],020H
beq $20011
cmp byte ptr [si],09H
bne $8
$20011:
; ++cp;
^ inc si
jmp $7
$8:
; if (*cp == 0)
^; break;
cmp byte ptr [si],0
beq $5
;#ifdef REDIR
; {
^^^^^^^^^^^^^^^^^^^^^
^^^^^; *cpp++ = cp;
^ mov word ptr [di],si
inc di
inc di
; Argc++;
^ inc word ptr Argc_
; if (_sbrk(sizeof(char *)) == (char *)-1) {
^ mov ax,02H
push ax
call near ptr _sbrk_
pop cx
cmp ax,0ffffH
bne $9
; _write(2, "Too many args.", 14);
^ mov ax,0eH
push ax
mov ax, offset $20000+1
push ax
mov ax,02H
push ax
call near ptr _write_
add sp,6
; _exit(200);
^ mov ax,0c8H
push ax
call near ptr _exit_
pop cx
; }
^; while (*++cp)
$9:
^$10:
inc si
cmp byte ptr [si],0
beq $11
; if (*cp == ' ' || *cp == '\t') {
^ mov al,byte ptr [si]
cmp al,020H
beq $20012
cmp al,09H
bne $12
$20012:
; *cp++ = 0;
^ mov byte ptr [si],00H
inc si
; break;
^ jmp $11
; }
^; }
$12:
jmp $10
$11:
^; }
^$4:
jmp $6
$5:
; *cpp = 0;
^ mov word ptr [di],00H
; main(Argc,Argv);
^ push word ptr Argv_
push word ptr Argc_
call near ptr main_
add sp,4
; exit(0);
^ mov ax,00H
push ax
call near ptr exit_
pop cx
;}
^$20013:
ifdef $20003
pop si
endif
ifdef $20002
pop di
endif
ifdef $20004
mov sp,bp
pop bp
endif
ret
$20004 equ 1
$20003 equ 1
$20002 equ 1
_Croot_ endp
$3:
dataseg segment word public 'data'
$20000 db 0,84,111,111,32,109
db 97,110,121,32,97,114
db 103,115,46,0
dataseg ends
;
;#ifdef REDIR
|
~ size_t "L"
~ _exit_ . "(v"
bss Argv_:word,2
~ Argv Argv_ "**c"
bss Argc_:word,2
~ Argc Argc_ "i"
~ _ioflg_ . "[0i"
~ _Croot_ . "(i"
~ _sbrk_ . "(*c"
~ _clock_ . "(i"
~ _isatty_ . "(i"
~ _write_ . "(i"
~ main_ . "(i"
~ exit_ . "(i"
extrn exit_:near
extrn main_:near
extrn _exit_:near
extrn _write_:near
extrn _sbrk_:near
extrn _isatty_:near
extrn _clock_:near
codeseg ends
dataseg segment word public 'data'
extrn _ioflg_:word
dataseg ends
end

View File

@ -0,0 +1,106 @@
/* Copyright (C) 1981,1982, 1983 by Manx Software Systems */
#include "errno.h"
#include "fcntl.h"
static char **Argv;
static int Argc;
extern int _ioflg[];
_Croot(cp, first)
register char *cp;
{
register char **cpp;
char *_sbrk();
#ifdef REDIR
register int k;
register char *fname;
#endif
/* start the timer */
(void)_clock(0);
_ioflg[0] = _ioflg[1] = _ioflg[2] = O_TEXT;
_ioflg[0] |= _isatty(0) ? O_ISTTY:0; /* set flag for i/o routines */
_ioflg[1] |= _isatty(1) ? O_ISTTY:0; /* set flag for i/o routines */
_ioflg[2] |= _isatty(2) ? O_ISTTY:0; /* set flag for i/o routines */
Argv = (char **)_sbrk((first+1)*sizeof(char *));
Argv[0] = "";
cpp = &Argv[Argc = first];
for (;;) {
while (*cp == ' ' || *cp == '\t')
++cp;
if (*cp == 0)
break;
#ifdef REDIR
if (*cp == '>') { /* redirect output */
k = 1;
goto redirect;
} else if (*cp == '<') { /* redirect input */
k = 0;
redirect:
while (*++cp == ' ' || *cp == '\t')
;
fname = cp;
while (*++cp)
if (*cp == ' ' || *cp == '\t') {
*cp++ = 0;
break;
}
_close(k);
if (k)
k = _creat(fname, 0666);
else
k = _open(fname, O_RDONLY);
if (k == -1)
_redir_err(fname);
} else
#endif
{
Argc++;
if (_sbrk(sizeof(char *)) == (char *)-1) {
_write(2, "Too many args.", 14);
_exit(200);
}
if (*cp=='"'){
++cp;
while (*cp == ' ' || *cp == '\t')
++cp;
if (*cp == 0)
break;
*cpp++ = cp;
while (*++cp)
if (*cp == '"'){
*cp++ = 0;
break;
}
} else {
*cpp++ = cp;
while (*++cp)
if (*cp == ' ' || *cp == '\t') {
*cp++ = 0;
break;
}
}
}
}
*cpp = 0;
main(Argc,Argv);
exit(0);
}
#ifdef REDIR
static _redir_err(name)
char *name;
{
char buff[200];
strcpy(buff, "Can't open file for redirection: ");
strcat(buff, name);
strcat(buff, "\n");
_write(2, buff, strlen(buff));
exit(10);
}
#endif

View File

@ -0,0 +1,41 @@
; Copyright (C) 1983-1992 by Manx Software Systems
; :ts=8
; Note: This module must be assembled using Microsoft's MASM
; or Borland's TASM assembler, not the Manx as assembler.
PGROUP group @CODE,PROG
@CODE segment byte public 'CODE'
@CODE ends
PROG segment byte public 'CODE'
PROG ends
DGROUP group @DATAB,@DATAI,@DATAT,@DATAU,@DATAV,@STACK
@DATAB segment para public 'DATAB'
@DATAB ends
@DATAI segment word public 'DATAI'
db 'Aztec C86 version 5.2a',0
even
public __Dorg
__Dorg label byte
@DATAI ends
@DATAT segment word public 'DATAT'
public __Dend
__Dend label byte
public __Uorg
__Uorg label byte
@DATAT ends
@DATAU segment word public 'DATAU'
@DATAU ends
@DATAV segment word public 'DATAV'
public __Uend
__Uend label byte
@DATAV ends
@STACK segment para stack 'STACK'
First db 2048 dup (?)
@STACK ends
end

View File

@ -0,0 +1,59 @@
; Copyright (C) 1983 by Manx Software Systems
; :ts=8
include lmacros.h
dataseg segment para public 'data'
extrn _sbot_:word
extrn _lowwater_:word
dataseg ends
assume ds:dataseg,cs:codeseg
ifdef FARPROC
extrn _stkover_:far
else
extrn _stkover_:near
endif
extrn $begin:far
dw near ptr $begin
public $csav, $cret
$csav proc
pop bx
ifdef FARPROC
pop dx
endif
push bp
mov bp,sp
add sp,ax
cmp sp,bp ;check for wrap around
ja stackfault
cmp sp,word ptr _sbot_ ;or moving into the RED zone
jb stackfault
cmp sp,word ptr _lowwater_
ja nodeeper
mov word ptr _lowwater_,sp
nodeeper:
push di
push si
ifdef FARPROC
push cs
mov ax,offset $cret
push ax
push dx
push bx
ret
else
call bx
endif
$csav endp
$cret proc
pop si
pop di
mov sp,bp
pop bp
ret
$cret endp
stackfault:
mov sp,bp ;put stack back the way it was
jmp _stkover_
finish
end

View File

@ -0,0 +1,29 @@
; Copyright (C) 1983, 85 by Manx Software Systems
; :ts=8
include lmacros.h
public $cswt
$cswt proc
ifndef FARPROC
pop bx ; get address of table
push di
ifndef LONGPTR
push es
endif
mov di,cs
mov es,di
mov di,bx ; make di to point to table of values
mov bx,cx ; save number of entries in bx
shl bx,1 ; adjusted for size of an entry
cld
repne scasw ; find the right entry
mov cx,es:word ptr -4[di][bx] ; pick up target address
ifndef LONGPTR
pop es
endif
pop di
jmp cx ; jump there
endif
$cswt endp
finish
end

View File

@ -0,0 +1,51 @@
; Copyright (C) 1983, 85 by Manx Software Systems
; :ts=8
include lmacros.h
ifdef FARPROC
data equ word ptr es:[bx]
addr equ word ptr es:2[bx]
dflt equ word ptr es:[bx]
else
data equ word ptr cs:[bx]
addr equ word ptr cs:2[bx]
dflt equ word ptr cs:[bx]
endif
slot equ 4
public $swt
$swt proc
pop bx
ifdef FARPROC
ifndef LONGPTR
mov dx,es
endif
pop es
push es
endif
mov cx,data
add bx,2
jcxz eswt
swtloop:
cmp ax,data
je found
add bx,slot
loop swtloop
eswt:
push dflt
ifdef FARPROC
ifndef LONGPTR
mov es,dx
endif
endif
ret
found:
push addr
ifdef FARPROC
ifndef LONGPTR
mov es,dx
endif
endif
ret
$swt endp
finish
end

View File

@ -0,0 +1,46 @@
; Copyright (C) 1985, 1986 by Manx Software Systems, Inc.
; :ts=8
include lmacros.h
dataseg segment word public 'data'
public __lastclock_
__lastclock_ dw 0,0
dataseg ends
assume ds:dataseg
procdef _clock,<<kind,word>> ; long _clock(kind)
mov ah,2ch
int 21h ; get time
mov al,100
mul dh ;get seconds as hundredths into ax
sub dh,dh
add ax,dx ;add in hundredths
mov bx,ax ;save total hundredths
mov al,60
mul ch ; get hours as mins into ax
sub ch,ch
add ax,cx ; add minutes to converted hours
mov cx,6000
mul cx ; convert to hundredths of seconds
add ax,bx ; add in seconds+hundredths
adc dx,0 ; axdx now contains value in hunredths
cmp dx,word ptr __lastclock_+2
ja valok
jne clktrn
cmp ax,word ptr __lastclock_
jae valok
clktrn: ; clock turned over since last call
add ax,0d600h
adc dx,083h ; add in 24 hours
valok:
mov cx,kind
jne doret
mov word ptr __lastclock_+2,dx
mov word ptr __lastclock_,ax
pret
doret:
sub ax,__lastclock_
sbb dx,__lastclock_+2
pret
pend _clock
finish
end

View File

@ -0,0 +1,45 @@
; :ts=8
;Copyright (C) 1983, 85 by Manx Software Systems
include lmacros.h
procdef farcall, <<where,dword>, <srcregs,ptr>, <dstregs,ptr>>
push si
push di
push ds
push es
;
ldptr bx,srcregs,ds
mov ax,[bx]
push 2[bx] ;save BX value for later
mov cx,4[bx]
mov dx,6[bx]
mov si,8[bx]
mov di,10[bx]
mov es,14[bx]
mov ds,12[bx] ;trash DS last
pop bx ;now get value for BX
push bp
call where
pop bp
push ds ;save returned DS
push bx ;save returned BX
mov ds,-6[bp] ;fetch C's data seg, for small model
ldptr bx,dstregs,ds
mov [bx],ax
pop 2[bx] ;value returned in BX
mov 4[bx],cx
mov 6[bx],dx
mov 8[bx],si
mov 10[bx],di
pop 12[bx] ;value returned in DS
mov 14[bx],es
pop es
pop ds
pop di
pop si
pop bp
pushf
pop ax
ret
pend farcall
finish
end

View File

@ -0,0 +1,13 @@
; Copyright (C) 1985 by Manx Software Systems
; :ts=8
largecode
codeseg segment byte public 'code'
assume cs:codeseg
public $fcall
$fcall proc far
push dx
push ax
ret
$fcall endp
codeseg ends
end

Some files were not shown because too many files have changed in this diff Show More