825 lines
32 KiB
Plaintext
825 lines
32 KiB
Plaintext
From: raymoon@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: <5h6dvs$b4q@reader1.news.act.net>
|
|
Followup-To: alt.lang.asm,comp.lang.asm.x86
|
|
Date: 21 Apr 1997 21:20:34 GMT
|
|
Organization: MoonWare
|
|
Lines: 804
|
|
Approved: news-answers-request@MIT.EDU
|
|
Distribution: world
|
|
Expires: Tue, 20 May 1997 23:59:59 GMT
|
|
Message-ID: <5jgln2$ijs@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: 1997/03/18
|
|
|
|
------------------------------
|
|
|
|
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 on both newsgroups and news.answers, alt.answers and
|
|
comp.answers. It also is archived at the normal FAQ archival sites and the
|
|
SimTel mirror sites in the msdos/info 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 out 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 time frame.
|
|
|
|
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 the me.
|
|
|
|
Author: Raymond Moon, raymoon@moonware.dgsys.com
|
|
Copyright 1997 - Raymond Moon
|
|
ALL RIGHTS RESERVED
|
|
Last Changed: 6 Jan 97
|
|
|
|
------------------------------
|
|
|
|
|
|
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. Real Mode/Protected Mode
|
|
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. 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 unmoderated newsgroup comp.lang.asm.x86 is open to discussions on all
|
|
topics related to assembly language and low-level programming on IBM
|
|
machines with '86 processors. Appropriate topics would include, but not be
|
|
limited to:
|
|
|
|
Assembly language tips and tricks (code techniques)
|
|
MASM, TASM, and other commercial assemblers
|
|
Graphics, sound, and other hardware programming
|
|
Assembly language code
|
|
Assembly language related share/freeware
|
|
Linking assembly language with other languages
|
|
Etc...
|
|
|
|
Topics that are discouraged are:
|
|
|
|
Flames about "{Language X} is {better/worse} than ASM"
|
|
Flames like "{Assembler 1} is {better/worse} than {Assembler 2}"
|
|
High-level language code, except when used for hardware programming
|
|
|
|
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: Michael Averbuch, mikeaver@firefly.prairienet.org
|
|
Raymond Moon, raymoon@moonware.dgsys.com
|
|
Last changed: 28 Dec 94
|
|
|
|
------------------------------
|
|
|
|
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 teadious, 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's 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_1.pdf
|
|
|
|
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
|
|
|
|
or Christian Luddoff's Web Site:
|
|
|
|
http://www.sandpile.org/xxx
|
|
|
|
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 specifically 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
|
|
displaysthe 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:
|
|
|
|
http://www.x86.org/ddj/ddj.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 and alikes. 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.1, dated 28 Jul 96.
|
|
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:
|
|
inter53a.zip Comprehensive listing of interrupt calls, 1of4
|
|
inter53b.zip Comprehensive listing of interrupt calls, 2of4
|
|
inter53c.zip Comprehensive listing of interrupt calls, 3of4
|
|
inter53d.zip Comprehensive listing of interrupt calls, 4of4
|
|
inter53e.zip Utility progs/source code for interrupt list
|
|
inter53f.zip WinHelp conversion programs for interrupt list
|
|
inter53g.zip Hypertext conversion progs. for interrupt list
|
|
Above available from all sites. Below files are available from SimTel
|
|
inter53z.zip HC31/HCP phrases file for interrupt list
|
|
intwin53.zip WINHELP hypertext
|
|
|
|
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 and I/O ports. This
|
|
release contains more than 8100 entries and nearly 3300 tables.
|
|
|
|
11.3 WHAT IS NEW
|
|
|
|
Version 5.1
|
|
COMBINE.BAT has been replaced by COMBINE.COM. New info includes PCMCIA v2,
|
|
Player's Tool, ShowGFX, Iomega, additional virus checks, OS/2 INT 21h, and
|
|
various miscellaneous updates.
|
|
|
|
Version 5.2
|
|
Three new hypertext conversion programs (for WinHelp, ASMEdit, and Turbo
|
|
Pascal) and a new text file MSR.LST. INTLIST.E has been enhanced, a
|
|
repeated error in Novell NetWare multiplexor functions has been corrected,
|
|
and a variety of incorrect cross-references has been fixed. New info
|
|
includes APM v1.2, TI Professional PC BIOS, Cherry keyboard chipcard
|
|
reader, KeyRus, Volkov Commander, and XPACK.
|
|
|
|
Version 5.3
|
|
More than 370k of updates, including ACPI, OpenHCI, PCI configuration
|
|
registers for various Intel chipsets, SCSI CDB and ASPI updates, Novell
|
|
TCP/IP API, Banyan VINES printing, additional virus installation checks,
|
|
MODRES, Toshiba model IDs, MS-DOS7/Win95 info, FAT32, CardBus, InterWave
|
|
Game API, PCI Power Management, ATAPI Removable Media, and an updated
|
|
OPCODES.LST (now includes MMX instructions)
|
|
|
|
11.4 INTWIN.HLP
|
|
|
|
INTWIN.HLP was compiled from Ralf Brown's Interrupt List with Christian
|
|
Mueller Planitz's and Bent Lynggaard's INT2WHLP program to a hypertext
|
|
format of the List. Most of the supplementary *.LST files in the Interrupt
|
|
List are included in INTWIN.HLP.
|
|
|
|
INTWIN displays table references in a secondary window to ease the
|
|
reference between the source and the referenced text. The package includes
|
|
an editor to edit the secondary window size as appropriate for the graphics
|
|
platform used.
|
|
|
|
INTWIN has extensive search facilities with almost 30,000 keywords (below
|
|
WinHelp 4.00's keyword limit) for search on interrupt numbers, register
|
|
contents, interrupt categories, and topic headings. The package includes
|
|
also a full text search facility.
|
|
|
|
11.5 INTWIN.PH
|
|
|
|
INTWIN.PH is a phrases (Windows help file compression information) file
|
|
compiled from Ralf Brown's Interrupt List with Christian Mueller Planitz's
|
|
and Bent Lynggaard's INT2WHLP program. Most of the supplementary *.LST
|
|
files in the Interrupt List were included in the compilation.
|
|
|
|
The phrases file is used by the HC31 and HCP help file compiles when
|
|
compiling in high compression mode. The compilation of this phrases file
|
|
requires more DOS memory and disk space than is easily available on many
|
|
computers (630-730 kb and 38-52 Mb).
|
|
|
|
11.6 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: 19 Jan 97
|
|
|
|
------------------------------
|
|
|
|
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. Real Mode/Protected Mode
|
|
|
|
13.1 AVAILABILITY
|
|
|
|
[Note: because of a crash at zfja-gate, the below information of files on
|
|
zfja-gate may not be accurate.]
|
|
|
|
All the files below are available from:
|
|
ftp://zfja-gate.fuw.edu.pl/user/net/ka9q/guest/cpu/protect.mod
|
|
|
|
The authors e-mail addresses are given below.
|
|
|
|
These files can be received by e-mail. Send e-mail to:
|
|
|
|
listserv@zfja-gate.fuw.edu.pl
|
|
|
|
with GET CPU/PROTECT.MOD/PMFAQ/* in the text.
|
|
|
|
A .zip file with all the latest files described below has been uploaded to
|
|
SimTel but as of 19 Dec has not been made available for download. The URL
|
|
to this file when available should be:
|
|
|
|
ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/pmtut002.zip
|
|
|
|
Watch this site or for the upload announcement in the newsgroups.
|
|
|
|
13.2 FAQ - PMFAQ.ZIP
|
|
|
|
This file contains a preliminary protected mode FAQ by Jerzy Tarasiuk.
|
|
|
|
13.3 TUTORIAL - PMTUT002.ZIP
|
|
|
|
Till Gerken has written a Protected Mode Tutorial. This tutorial contains
|
|
code and applicable function calls that comprise the Virtual Control
|
|
Program Interface (VCPI). Till Gerken's tutorial is available:
|
|
|
|
ftp://x2ftp.oulu.fi/pub/msdos/programming/pmode/pmtut002.zip
|
|
|
|
13.4 SAMPLE ASM CODE - SIMPL_PM.ASM
|
|
|
|
Jerzy Tarasiuk has posted an example program switching to Protected Mode
|
|
and back to again to Real Mode.
|
|
|
|
13.5 REAL MODE IDT SWITCHING - CHANGIDT.FAQ
|
|
|
|
Lastly Jerzy Tarasiuk has included some of his e-mail that covers real mode
|
|
IDT switching.
|
|
|
|
Contributors: Till Gerken, tig@ngo.ol.ni.schule.de, and
|
|
Jerzy Tarasiuk, JT@zfja-gate.fuw.edu.pl
|
|
Last changed: 19 Dec 95
|
|
|
|
------------------------------
|
|
|
|
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 3.0
|
|
|
|
ALIB is Jeff Ownens' shareware assembly language library. This library is
|
|
available from SimTel.
|
|
|
|
ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/alib30.zip
|
|
|
|
Like the UCR library described above, registration fees are not requested.
|
|
The library consists of 179 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
|
|
|
|
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: 20 Dec 96
|
|
|
|
|