DOS Extender (Often Called a DOS Extender,Or Even Just an Extender) Is a Library That Assists in Running 32-Bit MS-DOS-Based Programs

Total Page:16

File Type:pdf, Size:1020Kb

DOS Extender (Often Called a DOS Extender,Or Even Just an Extender) Is a Library That Assists in Running 32-Bit MS-DOS-Based Programs Chen_Rev_Appendix B.qxp 12/6/06 10:54 AM Page 1 HOW TO ENSURE THAT YOUR PROGRAM DOES NOT RUN HUNDER WINDOWS 95 My primary focus for much of the Windows 95 project was MS-DOS application compatibility, specifically games. To help maintain my sanity, I found myself writing the following account, illustrating the phenomenal creativity of software developers in doing everything within their power to be incompatible with Windows 95. This chapter is a very technical one, originally written for an audience con- sisting of developers deeply steeped in the minutiae of protected-mode pro- gramming. I have attempted to clarify the jargon, but the issue is unavoidably technical. Here are some terms you will encounter: •The Global Descriptor Table (GDT) is a central data structure that is used by the CPU and that controls how programs access memory. Allowing access to the GDT effectively grants total control of the computer. • Real mode was the only mode supported by the CPU prior to the introduction of the 80286. MS-DOS was originally developed to run in real mode. Real mode has no memory protection. Modern operating systems use real mode only transitionally on their way to 1 Chen_Rev_Appendix B.qxp 12/6/06 10:54 AM Page 2 2 the old new thing protected mode, which is a mode of the CPU in which memory protection becomes available. •The DOS Protected-Mode Interface (DPMI) and the Virtual Control Program Interface (VCPI) are two popular interfaces for writing 32-bit DOS-based programs. Windows 3.0 and higher support DPMI. •An MS-DOS extender (often called a DOS extender,or even just an extender) is a library that assists in running 32-bit MS-DOS-based programs. DOS extenders typically detect that a DPMI or VCPI server is already running and use the corresponding interface to provide necessary services to the 32-bit MS-DOS-based program. In the absence of such a server, the DOS extender will provide one on its own. At the time of the Windows 95 project, there were several commercial DOS extenders available to choose from. The interface to MS-DOS and the MS-DOS extender is a register-based one, so all the programs of the era in which these programs were written con- tained some degree of assembly language. Furthermore, it was considered standard practice for applications to do such things as reprogram hardware devices and replace hardware interrupt handlers (operations that in today’s programming environment would be considered beyond the scope of what applications can or even should be allowed to do). Such activities necessitated the use of assembly language, and as a result, many of the topics covered here will be heavy on 80386 assembly language, both 16-bit and 32-bit. I have con- verted the assembly language back to pseudo-C when possible; when this is not possible, I have attempted to explain, in the accompanying text, what the assembly language does. Bear in mind that I wrote this chapter back in 1995 as a way of letting off steam. Its purpose was not to ridicule the vendors in question; that was just a side effect of the ironic tone. But just to make sure nobody takes it person- ally, I’ve made all the product and company names anonymous. Chen_Rev_Appendix B.qxp 12/6/06 10:54 AM Page 3 How to Ensure That Your Program Does Not Run . 3 Prologue There have been myriad articles describing how to write programs to run properly under Windows 95, but a title sorely lacking is one describing how to write a program that will fail spectacularly when run under Windows 95. This document attempts to fill that void by describing steps you can take when developing your application to ensure that it encounters as many com- patibility problems as possible. By carefully following these steps, you can be relatively certain that your program will not run on any Microsoft operating system well into the next century. MS-DOS-Extended programs Congratulations on your decision to write an MS-DOS-extended program. You stand at the frontier of protected-mode programming. Unwilling to take the leap to a protected-mode operating system like Windows, you prefer to keep one foot in the comfortable world of MS-DOS while venturing with the other foot into the gnarly depths of protected mode. Here are some tips for making sure your program will resist the pull of Windows for as long as possible. Just party the GDT yourself Remember that the Global Descriptor Table (GDT) belongs to the operating system. Any operating system that even pretends to protect itself from applica- tions will not allow applications to access the GDT, much less try to change it. The easiest way to ensure that you will not run under any operating system whatsoever is to execute an lgdt instruction, which loads a new global descriptor table. This instruction bypasses the operating system and enters protected mode directly. It helps if you don’t even check if the CPU is in real mode before doing this. Chen_Rev_Appendix B.qxp 12/6/06 10:54 AM Page 4 4 the old new thing Example 1 All known versions of one game try to enter protected mode by loading the global descriptor table register directly. Under a protected-mode operating system, this crashes with a general protection fault. Another game refuses to run unless it is in real mode and can take complete control of the machine. Example 2 One game goes into protected mode with the help of a particular DOS extender (which we will call Extender 2), thereby creating the illusion that it wants to play friendly with the operating system. But then it goes ahead and edits GDT selectors directly. Use VCPI Windows 95 does not support the Virtual Control Program Interface (VCPI) because that interface gives applications total control of the computer at the lowest level, something generally frowned on in today’s computing environ- ment. If you design your program to require VCPI, it will never run on any operating system that wants to remain in charge. It helps if you also display a really confusing error message when you fail to detect a VCPI server. Example 3 Two games by a popular game publisher (which we will call Publisher 3) merely display the message EMS driver is not VCPI compliant. and unceremoniously exit if a VCPI server cannot be found. Example 4 Another program by Publisher 3 displays the wonderfully useful error message Protected mode driver is not responding to EMS function calls. Make sure your EMS driver is not configured with the NOEMS option. If it is, replace the option 'NOEMS' with 'RAM'. This leads the user on a wild goose chase trying to configure expanded memory in myriad ways, when the real problem has nothing to do with EMS. Maxim 1: The more confusing the error message, the better. Chen_Rev_Appendix B.qxp 12/6/06 10:54 AM Page 5 How to Ensure That Your Program Does Not Run . 5 Write your own (DPMI) DOS extender An excellent first step in writing an MS-DOS-extended program that will not run under Windows 95 is to try to write your own extender. Writing a DOS extender is not something that should be left in the hands of qualified professionals. If you use a third-party DOS extender, you run the risk that any problems resulting from the extender might be fixed by the vendor, or that the operating system developers might come up with a workaround for the problem in the DOS extender. By writing your own DOS extender, you can ensure that any problem in the extender is completely your own. This way,the operating system developers will give higher priority to prob- lems with commercial DOS extenders rather than your problem, because any such workaround would fix only your program and no other. Example 5 The DOS extender used by one game is a home-grown one. (You might find it amusing that the author of this extender subsequently came to work for Microsoft for several years.) The application makes an Int 21h function 250Dh call to the DOS extender to set the interrupt vector for IRQ 5, the sound card. The extender saves the application’s vector address into a private table and loads AX:ECX with the address of the extender’s private wrapper. And then, oh wait, it gets distracted for a little bit, and goes down a random code path that scrambles the AX and ECX registers, loading it instead with random values from uninitialized memory. And then it jumps back to the main code, which tries to set this as the interrupt vector to this garbage address, which fails. The application then hangs waiting for a hardware interrupt that never arrives. The application documentation says Do NOT run Program 5 from a shell in Windows. The virtual memory 'feature' [sic] of Windows causes Program Name to crash. This is an important lesson. Maxim 2: If it doesn’t run under Windows, then it’s Windows’ fault. The flag that the program in Example 5 checks to decide whether to scram- ble AX:ECX appears to be a flag that is set if the extender is acting as a DPMI client rather than a server. Maxim 3: Detect Windows, and crash. Chen_Rev_Appendix B.qxp 12/6/06 10:54 AM Page 6 6 the old new thing Ignore the manuals If you choose to go with a commercial DOS extender, make sure never to read the manual.
Recommended publications
  • Virtual Memory
    Chapter 4 Virtual Memory Linux processes execute in a virtual environment that makes it appear as if each process had the entire address space of the CPU available to itself. This virtual address space extends from address 0 all the way to the maximum address. On a 32-bit platform, such as IA-32, the maximum address is 232 − 1or0xffffffff. On a 64-bit platform, such as IA-64, this is 264 − 1or0xffffffffffffffff. While it is obviously convenient for a process to be able to access such a huge ad- dress space, there are really three distinct, but equally important, reasons for using virtual memory. 1. Resource virtualization. On a system with virtual memory, a process does not have to concern itself with the details of how much physical memory is available or which physical memory locations are already in use by some other process. In other words, virtual memory takes a limited physical resource (physical memory) and turns it into an infinite, or at least an abundant, resource (virtual memory). 2. Information isolation. Because each process runs in its own address space, it is not possible for one process to read data that belongs to another process. This improves security because it reduces the risk of one process being able to spy on another pro- cess and, e.g., steal a password. 3. Fault isolation. Processes with their own virtual address spaces cannot overwrite each other’s memory. This greatly reduces the risk of a failure in one process trig- gering a failure in another process. That is, when a process crashes, the problem is generally limited to that process alone and does not cause the entire machine to go down.
    [Show full text]
  • Optimizing and Protecting Hard Drives ‐ Chapter # 9
    Optimizing and Protecting Hard Drives ‐ Chapter # 9 Amy Hissom Key Terms antivirus (AV) software — Utility programs that prevent infection or scan a system to detect and remove viruses. McAfee Associates’ VirusScan and Norton AntiVirus are two popular AV packages. backup — An extra copy of a file, used in the event that the original becomes damaged or destroyed. boot sector virus — An infectious program that can replace the boot program with a modified, infected version of the boot command utilities, often causing boot and data retrieval problems. buffer — A temporary memory area where data is kept before being written to a hard drive or sent to a printer, thus reducing the number of writes to the devices. chain — A group of clusters used to hold a single file. child, parent, grandparent backup method — A plan for backing up and reusing tapes or removable disks by rotating them each day (child), week (parent), and month (grandparent). cross-linked clusters — Errors caused when more than one file points to a cluster, and the files appear to share the same disk space, according to the file allocation table. defragment — To “optimize” or rewrite a file to a disk in one contiguous chain of clusters, thus speeding up data retrieval. differential backup — Backup method that backs up only files that have changed or have been created since the last full backup. When recovering data, only two backups are needed: the full backup and the last differential backup. disk cache — A method whereby recently retrieved data and adjacent data are read into memory in advance, anticipating the next CPU request.
    [Show full text]
  • Linux Physical Memory Analysis
    Linux Physical Memory Analysis Paul Movall International Business Machines Corporation 3605 Highway 52N, Rochester, MN Ward Nelson International Business Machines Corporation 3605 Highway 52N, Rochester, MN Shaun Wetzstein International Business Machines Corporation 3605 Highway 52N, Rochester, MN Abstract A significant amount of this information can alo be found in the /proc filesystem provided by the kernel. We present a tool suite for analysis of physical memory These /proc entries can be used to obtain many statis- usage within the Linux kernel environment. This tool tics including several related to memory usage. For ex- suite can be used to collect and analyze how the physi- ample, /proc/<pid>/maps can be used to display a pro- cal memory within a Linuxenvironment is being used. cess' virtual memory map. Likewise, the contents of / proc/<pid>/status can be used to retreive statistics about virtual memory usage as well as the Resident Set Size (RSS). Embedded subsystems are common in today's computer In most cases, this process level detail is sufficient to systems. These embedded subsystems range from the analyze memory usage. In systems that do not have very simple to the very complex. In such embedded sys- backing store, more details are often needed to analyze tems, memory is scarce and swap is non-existent. When memory usage. For example, it's useful to know which adapting Linux for use in this environment, we needed pages in a process' address map are resident, not just to keep a close eye on physical memory usage. how many. This information can be used to get some clues on the usage of a shared library.
    [Show full text]
  • Installation and Performance
    Installation and Performance Welcome Thank you for purchasing Visual Reality software. Visual Reality is designed to offer an easy but extremely powerful, three dimensional environment in which full color still images and 3D animations can be created. Visual Reality 2.0 includes: Renderize Live. Load 2D and 3D models from a variety of drawing and modeling programs or drag and drop from Visual Model and Visual Font and compose unique scenes in an intuitive 3D environment using a wide variety of material, lighting and camera effects. Load bitmap images from a variety of common file formats for backgrounds in scenes and as color, bump or reflection maps in material definitions. Render your compositions as full-color photorealistic images at any resolution. Animate just about anything with just a few button clicks. Objects, camera views, color intensity and location of lights and the bump height of materials can all be set in motion or transformed. Rotoscoping allows you to create moving water and flickering fire. Bend, twist, stretch and morph objects over time. An advanced channel editor gives you precise time line control of every attribute, for every element or object. The 'Ease to' and 'Ease from' functions and hierarchical linking of objects give your animations a natural feel with smooth, fully controllable motion. Visual Font. Load Windows TrueType fonts and create 3D text objects by defining extrusion and bevel properties. Load extruded text into Renderize Live for inclusion in 3D scenes. Visual Image. Load and modify bitmap images from a wide variety of file formats. Work on individual images, or use the powerful layering tools to create digital collages.
    [Show full text]
  • Install Guide
    THIS BOX CONTAINS: • (1) CD (your game!) • Install Guide (16 pp.) with quick installation instructions, directions for creating a floppy boot disk, configurations for a variety of memory management systems and Troubleshooting answers to possible problems. • Playguide (24 pp.) covering movement, fighting, interaction and so on. • Reference Card lists keyboard commands for a single-glance reminder. • Top Line — news brief, courtesy of the World Economic Consortium. • Anti-Terrorist Site Security — guide to keeping your WEC installation safe from armored, gun-toting turncoats and other menaces, annotated by General Maxis. • Resistance Handbook — written briefing for new rebel recruits. • Registration Card — please tell us who you are! CRUSADER: NO REMORSE ™ INSTALL GUIDE Welcome to Crusader: No Remorse. This guide includes quick installation instructions for users more familiar with the process, and a detailed, step-by- step guide to installing the game. If you experience any difficulty, consult Troubleshooting (page 9). To avoid compatibility or memory problems, please take a moment to confirm that your machine matches the System Require- ments described on page 2. Remember, you may safely stop at any time during installation and return to DOS with q, except when files are being copied. QUICK INSTALLATION Note: If you are running a disk cache such as SMARTDrive, you need to disable it to ensure a clean installation. (This only affects the installation of the game. SMARTDrive will work normally during gameplay.) Refer to your SMARTDrive documentation or make a system boot disk as described in Boot Disks (page 4) to disable this cache. 1. Turn on your computer and wait for the DOS prompt.
    [Show full text]
  • LECTURE NOTE 5: the MEMORY MANAGEMENT REAL MODE Allows the Microprocessor to Address Only the First 1Mbyte of Memory Even If Its Pentium II Microprocessor
    LECTURE NOTE 5: THE MEMORY MANAGEMENT REAL MODE Allows the microprocessor to address only the first 1Mbyte of memory even if its Pentium II microprocessor. The first 1Mbyte of memory is called either the real mode or conventional memory system. The DOS operating system requires the microprocessor to operate in this mode. It allows application software. Segment and Offset Through the combination of these two, a memory location is accessed in the real mode. All real mode memory address must consist of a segment address plus an offset address. Segment Address Defines the beginning address of any 64k-byte memory segment. Offset Address Sometimes called displacement or relative. Selects any location within the 64k-byte memory segment. It is the distance above the start of the segment. Note: Each segment register is internally appended with a 0H on its right end. The segment address can begin only at a 16-byte boundary, which is called paragraph. Once the beginning address in known, an ending address is known, by adding FFFFH. The code segment register defines the start of the code segment and the instruction pointer to locate the next instruction within the code segment. This combination (CS:IP or CS:EIP) locates the next instruction executed by the microprocessor. Stack data are referenced through the stack segment at the memory location addressed by either the stack pointer (SP/ESP) or the base pointer (BP/EBP). These combinations are referred to as SS:SP (SS:ESP) or SS:BP (SS:EBP). Addressing Modes 1. Register Addressing Mode transfer a copy of a byte or word from the source register or memory location to the destination register or memory location.
    [Show full text]
  • The Pentium Processor
    Chapter 7 The Pentium Processor 7–1 The main purpose of registers is to provide a scratch pad so that the processor can keep data on a temporary basis. For example, the processor may keep the procedure return address, stack pointer, instruction pointer, and so on. Registers are also used to keep the data handy so that it can avoid costly memory accesses. Keeping frequently accessed data in registers is a common compiler optimization technique. 7–2 Pentium supports the following three address spaces: 1. Linear address space 2. Physical address space 3. I/O address space (from discussion in Section 1.7) 7–3 In segmented memory organization, memory is partitioned into segments, where each segment is a small part of the memory. In the real mode, each segment of memory is a linear contiguous sequence of up to 64 KB. In the protected mode, it can be up to 4 GB. Pentium supports segmentation largely to provide backward compatibility to 8086. Note that 8086 is a 16-bit processor with 20 address lines. This mismatch between the processor’s 16-bit registers and 20-bit addresses is solved by using the segmented memory architecture. This segmented architecture has been carried over to Pentium. However, in the protected mode, it is possible to consider the entire memory as a single segment; thus, segmentation is completely turned off. 7–4 In the real mode, a segment is limited to 64 KB due to the fact that 16 bits are used to indicate the offset value into a segment. This magic number 16 is due to the 16-bit registers used 8086 processor.
    [Show full text]
  • Thank You for Purchasing the Elder Scrolls: Arena. Dedicated Rpgers
    The Elder Scrolls ARENA hank you for purchasing The Elder Scrolls: Arena. Dedicated RPGers have invested an incredible amount of effort into creating this detailed simulation. If you enjoy the game, please pass the word! There is no better advertising than a satisfied customer. TYou can also purchase the second chapter of The Elder Scrolls, entitled Daggerfall, in Fall 1996. TES: Daggerfall will feature the same open-endedness and breadth as Arena, but will feature increased NPC (Non-Player-Character) interaction, a faster, more sophisticated 3-D engine, and a more extensive storyline. With all the planned enhancements, Daggerfall will give you even more of an opportunity to role-play your character as you choose. We are very excited about Daggerfall and what it will mean to the role-playing community. On our part, we promise to keep bringing you the best in computer simulation software and welcome any suggestions you may have for how we can serve you better. Journey well, and peace be with you. —The Bethesda Team Installing the Game Place the CD into your computer’s CD-ROM drive. Type the drive letter followed by a colon (Ex: D: for most CD-ROM drives) and hit <ENTER>. Next type INSTALL and hit <ENTER>. If you are installing Arena from floppy disks, select ‘Install Game’ and follow the prompts. Because you are installing from the CDROM, 5 megabytes of data will be copied to your hard drive when you select ‘Exit’. The next step is to configure your game (see below). Configuring Arena to your System To configure any Sound FX and Music drivers once Arena has successfully installed (if you wish to play the game with sound and/or music), choose the ‘Configure Game’ option.
    [Show full text]
  • Xv6 Booting: Transitioning from 16 to 32 Bit Mode
    238P Operating Systems, Fall 2018 xv6 Boot Recap: Transitioning from 16 bit mode to 32 bit mode 3 November 2018 Aftab Hussain University of California, Irvine BIOS xv6 Boot loader what it does Sets up the hardware. Transfers control to the Boot Loader. BIOS xv6 Boot loader what it does Sets up the hardware. Transfers control to the Boot Loader. how it transfers control to the Boot Loader Boot loader is loaded from the 1st 512-byte sector of the boot disk. This 512-byte sector is known as the boot sector. Boot loader is loaded at 0x7c00. Sets processor’s ip register to 0x7c00. BIOS xv6 Boot loader 2 source source files bootasm.S - 16 and 32 bit assembly code. bootmain.c - C code. BIOS xv6 Boot loader 2 source source files bootasm.S - 16 and 32 bit assembly code. bootmain.c - C code. executing bootasm.S 1. Disable interrupts using cli instruction. (Code). > Done in case BIOS has initialized any of its interrupt handlers while setting up the hardware. Also, BIOS is not running anymore, so better to disable them. > Clear segment registers. Use xor for %ax, and copy it to the rest (Code). 2. Switch from real mode to protected mode. (References: a, b). > Note the difference between processor modes and kernel privilege modes > We do the above switch to increase the size of the memory we can address. BIOS xv6 Boot loader 2 source source file executing bootasm.S m. Let’s 2. Switch from real mode to protected mode. expand on this a little bit Addressing in Real Mode In real mode, the processor sends 20-bit addresses to the memory.
    [Show full text]
  • XICE Lnstallationguide for Motorola 68000, 68HCOOO, 68ECOOO and 68302 Development Systems for DOS and UNIX Hosts
    1mmm Applied Microsystems Corporation XICE lnstallationGuide for Motorola 68000, 68HCOOO, 68ECOOO and 68302 Development Systems for DOS and UNIX Hosts May 1993 PIN 922-17140-03 Copyright© 1993 Applied Microsystems Corporation All rights reserved. \' '\'9~t\B<\', nnt:iubmv ~'9\nt . ,:~ s no gnilis' IBM XT and IBM AT are trademarks of IBM Corporation Microsoft and MS-DOS™ are trademarks of Microsoft Corporation. Microtec is a registered trademarks of Microtec Research, Inc. SP ARC, SPARCstation, Sun, Sun-3, Sun-4, NFS, and PC-NFS are trademarks o Microsystems, Inc. UNIX is a registered trademark of AT&T. VALIDATE is a registered tradmark of Applied Microsystems Corporation I Contents Chapter 1 Introduction Organization of the documentation................................... 1-2 Overview of the toolchain................................................... 1-4 XICE ............................................................................. 1-4 XRAY............................................................................ 1-4 C Cross Compiler......................................................... 1-4 C++ Compiler............................................................... 1-4 Chapter2 Installing on a Sun Workstation Step 1: Check minimum requirements ................ ............. 2-2 Requirements for Sun 4 (SPARC) workstations........ 2-2 Step 2: Set up the directory structure............................... 2-3 · Step 3: Copy the software from the tape........................... 2-4 Step 4: Define individual user's setup..............................
    [Show full text]
  • Computing :: Operatingsystems :: DOS Beyond 640K 2Nd
    DOS® Beyond 640K 2nd Edition DOS® Beyond 640K 2nd Edition James S. Forney Windcrest®/McGraw-Hill SECOND EDITION FIRST PRINTING © 1992 by James S. Forney. First Edition © 1989 by James S. Forney. Published by Windcrest Books, an imprint of TAB Books. TAB Books is a division of McGraw-Hill, Inc. The name "Windcrest" is a registered trademark of TAB Books. Printed in the United States of America. All rights reserved. The publisher takes no responsibility for the use of any of the materials or methods described in this book, nor for the products thereof. Library of Congress Cataloging-in-Publication Data Forney, James. DOS beyond 640K / by James S. Forney. - 2nd ed. p. cm. Rev. ed. of: MS-DOS beyond 640K. Includes index. ISBN 0-8306-9717-9 ISBN 0-8306-3744-3 (pbk.) 1. Operating systems (Computers) 2. MS-DOS (Computer file) 3. PC -DOS (Computer file) 4. Random access memory. I. Forney, James. MS-DOS beyond 640K. II. Title. QA76.76.063F644 1991 0058.4'3--dc20 91-24629 CIP TAB Books offers software for sale. For information and a catalog, please contact TAB Software Department, Blue Ridge Summit, PA 17294-0850. Acquisitions Editor: Stephen Moore Production: Katherine G. Brown Book Design: Jaclyn J. Boone Cover: Sandra Blair Design, Harrisburg, PA WTl To Sheila Contents Preface Xlll Acknowledgments xv Introduction xvii Chapter 1. The unexpanded system 1 Physical limits of the system 2 The physical machine 5 Life beyond 640K 7 The operating system 10 Evolution: a two-way street 12 What else is in there? 13 Out of hiding 13 Chapter 2.
    [Show full text]
  • Open WATCOM Programmer's Guide
    this document downloaded from... Use of this document the wings of subject to the terms and conditions as flight in an age stated on the website. of adventure for more downloads visit our other sites Positive Infinity and vulcanhammer.net chet-aero.com Watcom FORTRAN 77 Programmer's Guide Version 1.8 Notice of Copyright Copyright 2002-2008 the Open Watcom Contributors. Portions Copyright 1984-2002 Sybase, Inc. and its subsidiaries. All rights reserved. Any part of this publication may be reproduced, transmitted, or translated in any form or by any means, electronic, mechanical, manual, optical, or otherwise, without the prior written permission of anyone. For more information please visit http://www.openwatcom.org/ Portions of this manual are reprinted with permission from Tenberry Software, Inc. ii Preface The Watcom FORTRAN 77 Programmer's Guide includes the following major components: · DOS Programming Guide · The DOS/4GW DOS Extender · Windows 3.x Programming Guide · Windows NT Programming Guide · OS/2 Programming Guide · Novell NLM Programming Guide · Mixed Language Programming · Common Problems Acknowledgements This book was produced with the Watcom GML electronic publishing system, a software tool developed by WATCOM. In this system, writers use an ASCII text editor to create source files containing text annotated with tags. These tags label the structural elements of the document, such as chapters, sections, paragraphs, and lists. The Watcom GML software, which runs on a variety of operating systems, interprets the tags to format the text into a form such as you see here. Writers can produce output for a variety of printers, including laser printers, using separately specified layout directives for such things as font selection, column width and height, number of columns, etc.
    [Show full text]