Path: senator-bedfellow.mit.edu!bloom-beacon.mit.edu!howland.erols.net!pants.skycache.com.MISMATCH!triton.skycache.com!portc01.blue.aol.com!portc.blue.aol.com!feed.newsreader.com!news!not-for-mail
From: [email protected] (Raymond Moon)
Newsgroups: alt.lang.asm,comp.lang.asm.x86,news.answers,alt.answers,comp.answers
Subject: x86 Assembly Language FAQ - General Part 1/3
Supersedes: <[email protected]>
Followup-To: alt.lang.asm,comp.lang.asm.x86
Date: 21 Mar 2000 23:02:28 GMT
Organization: MoonWare
Lines: 823
Approved: [email protected]
Distribution: world
Expires: Thu, 20 Apr 2000 23:59:59 GMT
Message-ID: <[email protected]>
Reply-To: [email protected]
NNTP-Posting-Host: dgs.dgsys.com
X-Trace: news.dgsys.com 953679748 23794 207.154.12.1 (21 Mar 2000 23:02:28 GMT)
X-Complaints-To: [email protected]
NNTP-Posting-Date: 21 Mar 2000 23:02:28 GMT
Summary: This is the FAQ for the x86 Assembly Language programmers for
the alt.lang.asm and comp.lang.asm.x86 newsgroups.  This particular
section of the FAQ is part one of three parts that contain x86
assembly language information common to all assemblers.
Keywords: x86 Assembly Language ASM FAQ General
X-Newsreader: TIN [UNIX 1.3 950824BETA PL0]
Xref: senator-bedfellow.mit.edu alt.lang.asm:25270 comp.lang.asm.x86:83703 news.answers:179899 alt.answers:47940 comp.answers:40152

Archive-Name: assembly-language/x86/general/part1
Posting-Frequency: monthly (21st of every month)
Last-modified: 2000/02/20

------------------------------

Subject: 1.  Introduction and Intent

This is the x86 Assembly Language FAQ for the comp.lang.asm.x86 and
alt.lang.asm newsgroups.  This FAQ is posted monthly on or about the
21st of the month to both newsgroups and news.answers, alt.answers and
comp.answers.  It also is archived at the normal FAQ archival site,
ftp://rtfm.mit.edu and to SimTel and its mirror sites in the msdos/info
directory and Garbo and its mirrors in the pc/doc-net directory.  When
uploaded to SimTel or Garbo, the filenames are asmxxyyz.zip, where xx is
the two digit year, yy is the number of the month and z is t for text or
h for HTML format.  Lastly, the current version is available from my web
page as:
   As text files:
       http://www2.dgsys.com/~raymoon/faq/asmfaq.zip
   As HTML documents:
       http://www2.dgsys.com/~raymoon/faq/asmfaqh.zip
Currently, this FAQ is broken into six sections.  The following are the
section filenames and the scope of each section of the FAQ.

assembly-language/x86/general/part1 - This is the basic portion of the
   FAQ that contains information of interest to all assembly language
   programmers.  In general, the information contained in this portion
   of the FAQ is not specific to any particular assembler.
assembly-language/x86/general/part2 - This is a continuation of the
   above FAQ.
assembly-language/x86/general/part3 - This is a continuation of the
   above FAQ.
assembly-language/x86/microsoft - This portion of the FAQ contains
   information specific for the Microsoft MASM.
assembly-language/x86/borland - This portion of the FAQ contains
   information specific for the Borland TASM.
assembly-language/x86/a86 - This portion of the FAQ contains information
   specific for the Shareware A86 Assembler and D86 Debugger.

The scope and content of this FAQ is to go beyond just answering the
frequently asked questions.  I am including pointers to assembly
language treasure troves that are hidden on the Internet.  I believe
that this will enhance the FAQ�s value not only to the novices but also
to the old hands.

For the ease of determining what has changed since the last FAQ, the
Table of Contents will have �REVISED� at the end of the subject line for
all revised subjects.  If more than one FAQ revision has been missed,
the �Last Changed:� entry at the end of each subject can be used to
determine which subjects have been revised during the intervening
period.

The information in this FAQ is free for all to use as long as you
acknowledge the source.  This FAQ can be reproduced in part or in its
entirety as long as the copyright is included.  This FAQ can be made
available on public servers, like ftp, gopher or WWW servers.  Please do
not modify the file, such as converting it into some other format,
without prior permission of the author.

All references to files and locations are in Uniform Resource Locators
(URLs) format.  Some web browser will be able to use these URLs directly
as hot links.  If the format is not clear to you, get RFC 1738.  It is
available from:
   http://info.internet.isi.edu:80/in-notes/rfc/files/rfc1738.txt

Suggestions for changes and comments are always welcome.  They can be
posted to either newsgroup or e-mailed directly to me.

Author: Raymond Moon, [email protected]
Copyright 2000 - Raymond Moon
ALL RIGHTS RESERVED
Last Changed: 5 Feb 2000

------------------------------

Subject: 2. Table of Contents

Part I

1.  Introduction and Intent
2.  Table of Contents
3.  Charters For comp.lang.asm.x86 and alt.lang.asm Newsgroups
4.  What is Assembly Language
5.  List of x86 OpCodes
6.  What is HELPPC and Where It Is Available
7.  How To Truncate a File
8.  How Can STDERR Be Redirected To a File
9.  How To Determine the CPU Type
10. IRQ Assignments
11. Ralf Brown's Interrupt List
12. Using VGA Mode 13h for Fast Graphics
13. Protected Mode Programming
14. Shareware ASM Libraries

Part II

15. Accessing 4 Gegs of Memory in Real Mode
16. What Is Available at developer.intel.com
17. Interrupts and Exceptions
18. ASM Books Available
19. ASM Code Available on Internet
20. How To Commit a File
21. Using Extended Memory Manager
22. EXE2BIN Replacement
23. ASM Tutorials Available on the Internet
24. Shareware Assemblers
25. Undocumented OpCodes

Part III

26. WWW Assembly HomePages
27. Common Reason Why Memory Allocation Fails
28. Volume Serial Numbers
29. .obj File Format
30. Rebooting from Software
31. Other FAQs
32. Pseudo Random Number Generator in Assembly Language
33. Command Line Arguments
34. Free 32-bit and DJGPP
35. TERSE Programming Language
36. Assembly Language IDEs
37. Disassemblers
38. How to Optimize for the Pentium
39. Assembly Language Programming Style Guidelines
40. Other Assembly-Related Newsgroups
41. ZD-86 Debugger
42. Links to x86 Processor Manufacturers
43. Linkers Available
44. ASM Mailing Lists
45. ASM Programming Journal
46. Acknowledgments

------------------------------

Subject: 3. Charters For comp.lang.asm.x86 and alt.lang.asm Newsgroups

To know whether or not these newsgroups will meet your needs, the
purpose for which they were created are given below.

3.1  COMP.LANG.ASM.X86

comp.lang.asm.x86 was created based upon voting on a Request for
Discussion (RFD).  The RFD for this newsgroup is:

The moderated newsgroup comp.lang.asm.x86 will be open to discussions on
all topics related to assembly language and low-level programming on any
machine using a x86 processor or its clones.  Appropriate topics would
include, but not be limited to:

Assembly language code tips, tricks, and techniques.
MASM, TASM, and other commercial assemblers
NASM, and other non-commercial assemblers
Graphics, sound, and other hardware programming
Assembly language related utilities commercial/share/free-ware
Linking assembly language with other languages
Inline x86 programming utilizing assembly emulators in higher level
   languages
Propagation of non-commercial Internet x86 resources
Any question/discussion of the direct programming of the x86
Etc...

Topics that will be filtered are:

Flames about "{Language X} is {better/worse} than ASM"
Flames like "{Assembler 1} is {better/worse} than {Assembler 2}"
Flames, personal attacks, insults, etc.
HLL code, except when used for low-level hardware programming.
Product comparisons except when presented in an unbiased fashion.
Advertisements unrelated to assembly programming or utilities.
Posts in languages other than English will be examined for approval
 if any of the moderators can read the language in question.  There
 is no guarantee of approval for a post in any language other than
 English.

Posting to comp.lang.asm.x86, a moderated newsgroup, is not any
different for you as posting to an unmoderated newsgroup.  When you are
finished composing your post just send it as you normally do.  Your
ISP�s news server will send the post to the moderator�s e-mail address.
Once approved, the moderator will post it.  Therefore, you will not see
your postings immediately in the newsgroup.  It should take no longer
than a day or so to see it.

3.2  ALT.LANG.ASM

Alt newsgroups are initiated with a Proposal posting to the alt.config
newsgroup.  The proposal for alt.lang.asm is:

alt.lang.asm will address the problems of machine language programmers
out there in Internet land.  It will be a forum for discussion of coding
techniques and efficiency problems related to machine language.  The
scope will be broad.  We will not discriminate by machine architecture,
race or sex.

Contributors: Raymond Moon, [email protected]
Last changed: 9 Dec 97

------------------------------

Subject: 4. What Is Assembly Language

4.1  WHAT IS MACHINE LANGUAGE?

Although programmers tend to use C or C++ or Pascal these days, the
language closest to the PC hardware is machine language.  Not one second
during a PCS powered on lifetime passes where the computer is not
executing machine language.

4.2  ASSEMBLY LANGUAGE OR MACHINE LANGUAGE

To word this simply, you can say that say that assembly language is a
human-readable text, and machine language is machine-readable binary
code. When you program in assembly language, you are programming on the
machine language level.

To program directly in machine language is tedious, so you use assembly
language instead, and use an assembler to produce the actual machine
code.

4.3  WHEN TO USE ASSEMBLY LANGUAGE

I personally think that except as a learning exercise it is a waste of
time writing something in ASM that can be written acceptably fast in a
high-level language.

Assembly language fits for the following:

*  Low level control.  When you need to change the flags, or the
   control registers of the processor, as when entering protected
   mode.

*  Speed.  Programs written in machine language execute fast!  It can
   execute 10-100 times the speed of BASIC, and about twice as fast as
   a program written in C or Pascal.

*  Time Critical Code.  Critical sections of programs written in
   higher level languages can be written in assembly to speed up
   sections.

*  Small program size.  When you write a TSR for example this is very
   useful.  Writing interrupt handlers is where assembly language
   shines.

Assembly language is very flexible and powerful; anything that the
hardware of the computer is capable of doing can be done in assembly.

Contributor: Patrik Ohman, [email protected]
Last changed: 10 Jan 95

------------------------------

Subject: 5.  List Of x86 OpCodes

5.1  x86 OPCODES

The best source of OpCodes up to and including the Pentium Pro processor
is in the Intel Architecture Software Developer�s Manual, Volume 2:
Instruction Set Reference Manual.  It is available in .pdf format from
Intel�s Web Site:

   http://developer.intel.com/design/pentiumii/manuals/243191.htm

5.2  MMX OPCODES

Intel has a chapter covering these new OpCodes in the MMX Technology
Programmer�s Reference Manual.  This chapter is Chapter Five - Intel
Architecture MMX Instruction Set.

   http://developer.intel.com/drg/mmx/Manuals/prm/PRM_CHP5.HTM

5.3  OTHER SOURCES OF THESE DOCUMENTS

These manuals are available on the Intel Developer�s CD-ROM, see Subject
#16.  You also can find these manuals on Robert Collins� Web Site:

   http://www.x86.org/intel.doc/IntelDocs.html

Contributor: Raymond Moon, [email protected]
Last changed: 17 Oct 99

------------------------------

Subject: 6.  What Is HELPPC and Where Is It Available

HELPPC is a Quick Reference Utility for the intermediate to advanced
programmer.  It is a shareware program written by David Jurgens.  The
latest version is 2.10

The topics distributed in an easy database format are:
   BIOS interrupts;
   DOS interrupts and DOS functions;
   EMS and Mouse functions;
   BIOS and DOS data structures;
   diagnostic codes;
   DOS commands;
   80x86 assembler instructions;
   standard and vendor specific C functions; and
   various hardware specifications.

HELPPC is customizable by users.  The documentation describes how users
can incorporate their own information into the help file format.  These
user help files then can be incorporated into the database and accessed
via HELPPC application.

HELPPC comes in two versions.  The first is a DOS command line program.
The second is a TSR.  The TSR supports context sensitive help within
many editors.  Only 32K are taken by the TSR version.

HELPPC requires:
   DOS 2.0 or greater;
   64K of RAM for DOS Command Line or 32K for TSR; and
   Hard disk recommended.

HELPPC is available from:

   ftp://ftp.simtel.net/pub/simtelnet/msdos/info/helppc21.zip

HELPPC also is available from any site that mirrors the SimTel
directory.

Contributor:  Raymond Moon, [email protected]
Last changed: 28 Dec 94

------------------------------

Subject: 7. How To Truncate A File

There is not any single DOS Int 21h function that performs this
operation.  A file can be truncated using two functions.  The procedure
is:

1.  Use Int 21h function 42h, Move File Pointer, to move the file
   pointer to the position where you want the file to be truncated.
2.  Use Int 21h function 40h, Write File or Device, to write zero bytes
   to the file.

Execution of the last DOS function will update the directory to the new
file length.

Contributor: Raymond Moon, [email protected]
Last changed: 28 Dec 94

------------------------------

Subject: 8. How Can STDERR Be Redirected To A File

I understand that 4DOS has this capability at its command line.  If you
are looking in the assembly language FAQ for this information, an
assembly language answer probably is desired.  Here it is.

You will need to write a short program that performs the STDERR
redirection before loading and executing the desired program.  This
loader program relies upon the fact that a child program inherits all
open files of the parent program unless the parent program opens a file
with the inheritance flag set to no.

Because the full code for such a program is too large for this FAQ, I
will give the salient specifications for such a program.

1.  The loader program accepts three command line arguments:
   a.  The full path and filename of the file into which STDERR is to
       be written.
   b.  The full path and filename of the program to be executed.
   c.  The command line for the program to be executed (should be
       delimited by double quotes to allow multiple arguments).  This
       argument is optional.
2.  Release all memory above the program using Int 21 function 4ah so
   that there will be room enough to load and execute the designated
   program.
3.  Open the file from step 1.a above into which STDERR is to be
   written.
4.  Duplicate STDERR filehandle, which is 2, using Int 21h function
   45h.
5.  Using Int 21h function 46h, force STDERR filehandle, again 2, to
   have the filehandle of the opened file from step 2.
6.  Use Int 21h function 4b00h to load and execute the program from
   step 1.a.  Use the default environment and the command line from
   step 1.c above.
7.  Upon return from the function 4b00h, close the file opened in step
   2.
8.  To restore STDERR, use Int 21h function 46h to force STDERR, again
   2, to point to the filehandle saved from step 3 above.

This same technique can be applied to any of the standard devices.

I have written a full featured demonstration program.  I believe that
asm programmers will find the source code useful even if they do not
want to redirect stderr to a file.  The URL to the file is:

   ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/stderrf1.zip

Contributor: Raymond Moon, [email protected]
Last changed: 3 Jun 95

------------------------------

Subject: 9.  How To Determine The CPU Type

9.1  CPUID PROGRAM

The type of processor and math coprocessor can be determined using two
functions that have been provided by Intel.  The source code to these
functions can be obtained from Intel by:

   ftp://ftp.intel.com/pub/IAL/tools_utils_demos/cpuid3.zip

Three source files are included in this .zip file.
   cpuid3a.asm - This source code file contains two assembly language
       functions.  One determines the type of cpu from 8088/8086 to
       Pentium.  The second detects and identifies, if present, the
       type of math coprocessor.
   cpuid3b.c - a c program that calls the above two functions and
       displays the results.
   cpuid3c.asm - this is an assembly program equivalent to cpuid3b.c.

9.2  AP-485 INTEL PROCESSOR IDENTIFICATION WITH THE CPUID INSTRUCTION

This Application Note explains how to use the CPUID instruction in
software applications, BIOS implementations, and various processor
tools.  By taking advantage of the CPUID instruction, software
developers can create software applications and tools that can execute
compatibly across the widest range of Intel processor generations and
models, past, present, and future.

   http://developer.intel.com/design/pro/applnots/241618.htm

9.3  Robert Collins' CPUID.ASM

Robert Collins has written two columns for Dr. Dobb�s Journal on this
subject.  These articles with source code is available on his web site:

   Part 1: http://www.x86.org/ddj/Sep96/Sep96.html
   Part 2: http://www.x86.org/ddj/Nov96/Nov96.html

9.4  Grzegorz Mazur's x86 CPU Identification

Grzegorz has a series of hypertext articles that explain x86 CPU
identification algorithms developed by him.  Covered are not only the
Intel chips but also V20, V30 (remember them), and Cyrix.  His page is
located:

   http://grafi.ii.pw.edu.pl/gbm/x86/

Contributor: Raymond Moon, [email protected]
Last changed: 18 Mar 97

------------------------------

Subject: 10.  IRQ Assignments

A list of IRQ assignments are available in David Jurgens' HELPPC
database.  See Subject #6 for details on how to obtain this program.

Contributor: Raymond Moon, [email protected]
Last changed: 28 Dec 94

------------------------------

Subject: 11.  Ralf Brown's Interrupt List

11.1  FILE AVAILABILITY

The latest version of Ralf Brown's Interrupt List is 60, dated 3 Jan 99.
The files are available directly from his home page, from SimTel, or
Garbo:

   http://www.cs.cmu.edu/afs/cs.cmu.edu/user/ralf/pub/WWW/files.html
   ftp://ftp.simtel.net/pub/simtelnet/msdos/info
   ftp://garbo.uwasa.fi/pc/programming

The files are:
inter60a.zip    Comprehensive listing of interrupt calls, 1 of 4
inter60b.zip    Comprehensive listing of interrupt calls, 2 of 4
inter60c.zip    Comprehensive listing of interrupt calls, 3 of 4
inter60d.zip    Comprehensive listing of interrupt calls, 4 of 4
inter60e.zip    Utility programs/source code for interrupt list
inter60f.zip    WinHelp conversion programs for interrupt list
inter60g.zip    Hypertext conversion programs for interrupt list

11.2  DESCRIPTION

The interrupt list is a comprehensive listing of functions available
through interrupt calls and FAR calls, both documented and (officially)
undocumented, plus maps of CMOS and BIOS memory, I/O ports, I2C-bus
devices, and System Management Mode save areas.  This release contains
more than 9500 entries and over 5300 tables.

11.3  WHAT IS NEW

New in this release: 140k of updates, including Econet, VESA VBE/AF,
Matrox VESA-OEM functions, more Soft-ICE backdoor commands, XBIOS,
EZ-Drive, Adaptec AIC-7xxx and AHA-152x ports, GEM/ViewMAX, WinTel API,
TrLit API, VHRBIOS.SYS, Philips SAA7110(A), Intel 82595FX, an updated
OPCODES.LST.  Also includes a new version of INT2WHLP which can handle
the new five-character table numbers.

11.4  OTHER INCLUDED GEMS

OVERVIEW.LST - A brief description of each of the 256 interrupts.
86BUGS.LST - A list of undocumented and buggy instructions with
   descriptions of the x86 Intel processor and compatible
   processors.  And you thought that the Intel FDIV was the first
   bug in a processor!
CMOS.LST - a CMOS memory map.
OPCODE.LST - A list of undocumented instructions and documented
   instructions of any last processor.
PORTS.LST - I/O port addressed for XT, AT and PS/2 computers.
GLOSSARY.LST - glossary of PC terms.
MEMORY.LST - The format for various memory locations, such as the
   BIOS Data Segment, Interrupt Vector Table, and much, much more.
INTERRUP.PRI - iAPX 86 Interrupt Primer

Contributor: Raymond Moon, [email protected]
Last changed: 21 Feb 99

------------------------------

Subject: 12. Using VGA Mode 13h for Fast Graphics

12.1  INTRODUCTION AND PREPARATION

Mode 13h is so widely used for graphics applications in DOS because it
is very easy to use.  The screen is constantly being redrawn by the
video card.  To affect what the card draws, it is necessary to write to
the screen buffer.  The screen buffer in mode 13h is always at
segment:offset = A000:0000.  Thus, to set up drawing directly to the
video buffer, this is what you'd most often first do:

 ;Change the video mode to 13h
   xor  ah, ah         ;VIDEO Function 00h: Change screen
   mov  al, 13h        ;Put the desired graphics mode into AL
   int  10h            ;Call VIDEO

 ;Prepare for writing to the video buffer
   mov  di, 0a000h     ;Put the video segment into DI
   mov  es, di         ; so it can easily be put into ES
   xor  di, di         ;Start writing at coordinates (0,0)

12.2  WRITING PIXELS TO THE SCREEN

Why is Mode 13h so popular?  To understand, you must know a few basic
facts.  In Mode 13h, the screen is 320 by 200, or 320 pixels across and
200 pixels down.  In each pixel, there's a possibility of 256 colors,
which can be fit into one byte.  Thus, 320*200*1 = 64000 bytes, about
the size of one segment.  Think of the screen as an array of colors.
The first row takes up addresses A000:0000 to A000:013F (decimal 319),
the second row takes up addresses A000:0140 to A000:027F (decimal 639),
and so on.  To plot a pixel, assuming ES=A000:

 ;Plot a pixel in video mode 13h, where
 ;PixelAddress = (320 * Y) + X
   mov  ax, 320        ; Prepare for the multiplication
   mul  [Y]            ; Assuming that Y is defined in the data segment
                       ;   earlier in the program
   mov  di, ax         ; Put in into the pointer to the offset of ES
   add  di, [X]        ; Assuming that X is defined in the data segment
                       ;   earlier in the program
   mov  al, [Color]    ; Assuming that Color is defined in the data
                       ;   segment earlier in the program
   stosb               ; Write it to the screen!

See how easy that was?  Something to remember is that it is zero-based.
The upper-left corner is (0,0), and the lower-right is (319,199).  A
complete TASM Ideal mode procedure might look something like this (it
assumes that the video card is already set to mode 13h):

PROC WritePixel BASIC   ; Or whatever language you might want to link
                       ;  it to
   USES es, di         ; It's always a good idea to preserve ES and DI
   ARG  X:word, Y:word, Color:BYTE
   mov  di, 0a000h     ; Put the video segment into DI
   mov  es, di         ;   so it can easily be put into ES
   mov  ax, 320        ; Prepare for the multiplication
   mul  [Y]            ; Offset pointer by the Y value passed in
   mov  di, ax         ; Put in into pointer to the offset of ES
   add  di, [X]        ; Offset the pointer by the X value passed in
   mov  al, [Color]    ; Put color to be written to the screen in AL
   stosb               ; Write it to the screen!
   ret
ENDP WritePixel

To write a horizontal line, just put the length in CX, and replace the
STOSB with a REP STOSB.  Writing a vertical line is only a little
trickier.  Observe the following TASM Ideal mode procedure:

PROC VerticalLine BASIC ; Or whatever language you might want to link
                       ;  it to
   USES es, di         ; It's always a good idea to preserve ES and
                       ;  DI
   ARG  X:word, Y:word, Color:BYTE, Length:word
   mov  di, 0a000h     ; Put the video segment into DI
   mov  es, di         ; so it can easily be put into ES
   mov  ax, 320        ; Prepare for the multiplication
   mul  [Y]            ; Offset the pointer by the Y value passed in
   mov  di, ax         ; Put in into the pointer to the offset of ES
   add  di, [X]        ; Offset the pointer by the X value passed in
   mov  al, [Color]    ; Put the color to be written to the screen
                       ; in AL
   mov  cx, [Length]   ; Prepare for the loop
YLoop:
   stosb               ; Write it to the screen!
   add  di, 319        ; Move down one row (DI has already advanced
                       ;  once because of the STOSB, thus the 319)
   loop YLoop
   ret
ENDP VerticleLine

Observe how there is a tight loop that moves DI down one row each
iteration.

In short, the easiest way to write directly to the Mode 13h video buffer
is to think of the screen as just a 320 by 200 array of bytes, starting
at A000:0000.

Author: Michael Averbuch ([email protected])
Last Change: 29 Dec 94

------------------------------

Subject: 13.  Protected Mode Programming

13.1  PMODE Tutorials, FAQ, and other reference documentation

Protected Mode Basics by Robert Collins
   http://x86.ddj.com/articles/pmbasics/tspec_a1_doc.htm
   Excellent starting tutorial with source code.

PMODE FAQ
   ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/pmtut002.zip

Protected Mode Book List
   http://www.interactive.net/~viren/Janz/Books/pmode_books.htm
(Broken)

Christopher Giese�s PMODE Tutorial
   http://www.execpc.com/~geezer/os/pm.htm
   HTML format

pmode-l FAQs
   http://www.lysator.liu.se/~redhog
   http://bphantom.tripod.com/pmode-l_FAQ.html
   http://pmode-l.webjump.com/  (in HTML)

13.2  Source code Archives

Walnut Creek PMODE Archives
   ftp://ftp.cdrom.com/pub/demos/code/hardware/pmode/

X2FTP.OULU.FI
   ftp://x2ftp.oulu.fi/pub/msdos/programming/pmode/00index.html
   Protected mode utilities and some source code

13.3  PMODE Websites

Peter's PMODE Home Page
   http://www.geocities.com/SiliconValley/Peaks/1231/
   PMODE tutorials and programming related files

Niko Komin's Assembler for PCs page
   http://www.inx.de/~nkomin/html/assembe.htm

Shareware, pmode, x86 mnemonics, ASM related links.
   http://www.alaska.net/~zumwalt
   Archives, Source Code, Technical Documentation, OS Chat Room
       and much more

PASS-32, Dieter's Assembler
   http://www.geocities.com/SiliconValley/Bay/3437/
   Debugger and DOS extender also available

Dario Alpern's programs
   http://members.tripod.com/~alpertron/ENGLISH2.HTM
   PMODE examples

Christopher Giese�s Triple Fault Club
   http://www.execpc.com/~geezer/os/index.htm
   NASM and DJGPP Code, Protected Mode Code, OS Code

Gaz's Little Web Programming Page
   http://www.fortunecity.com/skyscraper/fatbit/427/programming.html
   Protected Mode Tutorial and large library of NASM source code
       written for the WDosX 32 bit DOS extender

5.4  PMODE Mailing Lists

Protected Mode Mailing list:
   To subscribe:
   Send: mailto:[email protected]
   subject: none
   body: subscribe pmode-l [email protected] (Note that is pmode-l
       (ell) not pmode-1 (one)

Use [email protected] to send email to others in the list.

To unsubscribe:
   Send: mailto:[email protected]
   subject: none
   body: unsubscribe pmode-l [email protected]

Contributor: Raymond Moon, [email protected]
Last changed: 20 Feb 2000

------------------------------
Subject: 14.  Shareware ASM Libraries

14.1  ASMLIB PROGRAMMER'S TOOLKIT, VERSION 4.0

Douglas Herr's shareware assembly language library.  This library is
available from SimTel.

   ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/asmlib40.zip

The zip file contains only the medium model of the library.  There are
405 assembly subroutines in a .lib file and documentation.  Source code
is available with registration and extra fee.  The library covers the
following areas:
   string/integer data manipulation        screen mode subroutines
   text-mode multi-window subroutines      disk & file subroutines
   text-mode video subroutines             EMS and XMS subroutines
   floating-point subroutines              graphics
   keyboard input subroutines              mathematical solutions
   subroutines which determine PC status

asmlib40 also comes with an editor, E16, written entirely with asmlib.

Improvements since version 3.7 is auto-sizing of the near heap in the
startup code.  There have been some incremental improvements including
32k-color graphics and virtual graphics screens.

14.2  THE ASSEMBLY WIZARD'S LIBRARY, VERSION 2.1

This is Chris Walker�s shareware assembly language library.  This
library used to be Thomas Hanlin's.

   ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/asmwiz21.zip

This library comes with documentation and one .lib file that supports
small and tiny memory models.  Source code is available with
registration. The library covers the following areas:

   Base Conversions        Mouse Services
   Exception Handling      Sound and Music
   Delays and Countdowns   String Services
   File Handling           Telecommunications
   Filename Manipulation   Time and Date
   Keyboard Services       Video Services
   Long Integer Math       Miscellaneous Services
   Memory Services

14.3  UCR Standard Library for Assembly Language Programmers

This library is written by Randall Hyde and others.  This library is
available from many sites but most of them are seriously out of date.
You can get the latest version at:

   http://webster.cs.ucr.edu/Page_asm/RHUCRLib.html

Unlike the previous libraries, there are no registration fees and the
included source code is released to the public domain.  The author does
request that if you use the library, you contribute at least one routine
to the library.

   Standard Input Routines     Character Set Routines
   Standard Output Routines    Memory Management Routines
   Conversion Routines         String Handling Routines
   Utility Routines

14.4  ALIB Version 4.0

ALIB is Jeff Ownens' shareware assembly language library.  This library
is available from SimTel.

   ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/alib40.zip

Similar to the UCR library described above, registration fees are not
requested.  The library consists of over 400 assembly source files
covering the following areas:

   compress    - data compression and expansion
   config      - program configuration, colors, paths, etc.
   compare     - compare strings
   convert     - hex/decimal/ascii conversions
   database    - simple database functions
   disk        - disk information, path changes, file searches
   display     - fast display functions, write to display memory
   error       - error handlers
   float       - simple floating point math package
   math        - dword math, crc, roots
   memory      - memory manager, extended, xms, ems, conventional
   menu        - menuing system
   message     - messages in windows on screen
   misc        - misc routines
   mouse/key   - mouse and keyboard functions
   parse       - extraction of parameters from command line
   random      - random number generators
   search      - search for character or string
   sort        - sort buffer or file
   sound       - sounds
   string      - ascii string handling
   stdout      - characters, strings, spaces to stdout
   system      - system interrogation and setup
   time        - time and date conversions

Also included are 15 sample programs.

14.5  FREELIB, Version 3.0

Freelib v3.0 is a library of 200 routines that may be useful for
assembly language programming.  Freelib includes routines that do many
of the tasks that make assembly language difficult - like buffered file
I/O, formatted string output, memory allocation, etc.  Also includes
16.16bit fixed point arithmetic, text screen output (EGA 80x25 or VGA
90x34), and VGA graphics in both 16 and 256 colors.  All routines are
highly optimized for size and speed, and average only 60 bytes each.
Full source code and documentation is included for all routines.
Freelib is public domain software, free for non-commercial use.  The
library is available from SimTel:

   ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/freeli30.zip

Contributor: Raymond Moon, [email protected]
Last changed: 23 Nov 98