850 lines
33 KiB
Plaintext
850 lines
33 KiB
Plaintext
|
From: raymoon@ms1.dgsys.com (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: <70vrlr$1p4$1@news.dgsys.com>
|
||
|
Followup-To: alt.lang.asm,comp.lang.asm.x86
|
||
|
Date: 23 Nov 1998 18:07:27 GMT
|
||
|
Organization: MoonWare
|
||
|
Lines: 829
|
||
|
Approved: news-answers-request@MIT.EDU
|
||
|
Distribution: world
|
||
|
Expires: Sun, 20 Dec 1998 23:59:59 GMT
|
||
|
Message-ID: <73c88v$nos$1@news.dgsys.com>
|
||
|
Reply-To: raymoon@moonware.dgsys.com
|
||
|
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 Assemby Language ASM FAQ General
|
||
|
|
||
|
|
||
|
Archive-Name: assembly-language/x86/general/part1
|
||
|
Posting-Frequency: monthly (21st of every month)
|
||
|
Last-modified: 1998/10/25
|
||
|
|
||
|
------------------------------
|
||
|
|
||
|
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.
|
||
|
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: ftp://ds.internic.net/rfc/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, raymoon@moonware.dgsys.com
|
||
|
Copyright 1998 - Raymond Moon
|
||
|
ALL RIGHTS RESERVED
|
||
|
Last Changed: 25 Oct 98
|
||
|
|
||
|
------------------------------
|
||
|
|
||
|
Subject: 2. Table of Contents
|
||
|
|
||
|
Part I
|
||
|
|
||
|
1. Introduction and Intent
|
||
|
2. Table of Contents REVISED
|
||
|
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 REVISED
|
||
|
|
||
|
Part II
|
||
|
|
||
|
15. Accessing 4 Gegs of Memory in Real Mode
|
||
|
16. What Is Available at developer.intel.com REVISED
|
||
|
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 REVISED
|
||
|
25. Undocumented OpCodes
|
||
|
|
||
|
Part III
|
||
|
|
||
|
26. WWW Assembly HomePages REVISED
|
||
|
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 NEW
|
||
|
45. 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 an 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, raymoon@moonware.dgsys.com
|
||
|
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, patrik@astrakan.hgs.se
|
||
|
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/pro/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, raymoon@moonware.dgsys.com
|
||
|
Last changed: 8 Mar 97
|
||
|
|
||
|
------------------------------
|
||
|
|
||
|
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 is 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, raymoon@moonware.dgsys.com
|
||
|
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, raymoon@moonware.dgsys.com
|
||
|
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/stderrf.zip
|
||
|
|
||
|
Contributor: Raymond Moon, raymoon@moonware.dgsys.com
|
||
|
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 himself. 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/index.html
|
||
|
|
||
|
Contributor: Raymond Moon, raymoon@moonware.dgsys.com
|
||
|
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, raymoon@moonware.dgsys.com
|
||
|
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 5.9, dated 30 Jun
|
||
|
98. 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:
|
||
|
inter59a.zip Comprehensive listing of interrupt calls, 1of4
|
||
|
inter59b.zip Comprehensive listing of interrupt calls, 2of4
|
||
|
inter59c.zip Comprehensive listing of interrupt calls, 3of4
|
||
|
inter59d.zip Comprehensive listing of interrupt calls, 4of4
|
||
|
inter59e.zip Utility programs/source code for interrupt list
|
||
|
inter59f.zip WinHelp conversion programs for interrupt list
|
||
|
inter59g.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 9200 entries and over 5000 tables
|
||
|
|
||
|
11.3 WHAT IS NEW
|
||
|
|
||
|
Nearly 400k of updates, including Intel 440EX/X and 82371MX chipsets,
|
||
|
OPTi "Vendetta" and 82C493/82C382 chipsets, Via VT82C496G and VT82C570M
|
||
|
"Apollo Master" chipset, PicoPower Vesuvius chipset, C&T 82C9001A and
|
||
|
64200/64310 video chips, Ensoniq ES1370/1371 sound chips, Cirrus CL-PD6710/22/29 network adapters, Award-BIOS password algorithm, more PCI
|
||
|
vendor IDs, and a substantially expanded OPCODES.LST (now including
|
||
|
instruction timing tables for most CPUs). Also added a new viewer for
|
||
|
use under MS Windows (in inter59e).
|
||
|
|
||
|
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, raymoon@moonware.dgsys.com
|
||
|
Last changed: 5 Sep 98
|
||
|
|
||
|
------------------------------
|
||
|
|
||
|
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 more
|
||
|
tricky. 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 (mikeaver@prairienet.org)
|
||
|
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://www.x86.org/articles/pmbasics/tspec_a1_doc.html
|
||
|
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
|
||
|
|
||
|
Jens Hohmuth PMODE Tutorial
|
||
|
http://www.fh-zwickau.de/~hoh/pm_eng/text/index.htm
|
||
|
HTML format
|
||
|
|
||
|
pmode-l FAQ
|
||
|
http://www.lysator.liu.se/~redhog
|
||
|
|
||
|
13.2 Source code Archives
|
||
|
|
||
|
Walnut Creek PMODE Archives
|
||
|
ftp://ftp.cdrom.com/pub/demos/code/hardware/pmode/index.html
|
||
|
|
||
|
X2FTP.OULU.FI
|
||
|
ftp://x2ftp.oulu.fi/pub/msdos/programming/pmode
|
||
|
Protected mode utilities and some source code
|
||
|
|
||
|
13.3 PMODE Websites
|
||
|
|
||
|
Cameron's 386+ Programming Page NOT CURRENTLY WORKING
|
||
|
http://free.prohosting.com/~cameron/
|
||
|
32 bit DOS extender/Utilities/pmode extender
|
||
|
File formats and specifications/Game programming
|
||
|
Knowledge Base with ASM tutorials, Denthor's VGA Trainer and
|
||
|
Univ. of Guadalajara ASM tutorial
|
||
|
|
||
|
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.eikon.e-technik.tu-muenchen.de/~et_514/pass32.html
|
||
|
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.netwurx.net/~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:pmode-l-request@fys.ruu.nl
|
||
|
subject: none
|
||
|
body: subscribe pmode-l email@yourisp.name (Note that is pmode-l (ell) not pmode-1 (one)
|
||
|
|
||
|
Use pmode-l@fys.ruu.nl to send email to others in the list.
|
||
|
|
||
|
To unsubscribe:
|
||
|
Send: mailto:pmode-l-request@fys.ruu.nl
|
||
|
subject: none
|
||
|
body: unsubscribe pmode-l email@yourisp.name
|
||
|
|
||
|
Contributor: Raymond Moon, raymoon@moonware.dgsys.com
|
||
|
Last changed: 19 Sep 98
|
||
|
|
||
|
------------------------------
|
||
|
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.ucr.edu/Page_asm/RHUCRLib.html
|
||
|
|
||
|
Unlike the previous libraries, there are no registrations 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 REVISED
|
||
|
|
||
|
ALIB is Jeff Ownens' shareware assembly language library. This library
|
||
|
is available from SimTel.
|
||
|
|
||
|
ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/alib40.zip
|
||
|
|
||
|
Like 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, raymoon@moonware.dgsys.com
|
||
|
Last changed: 23 Nov 98
|
||
|
|