2998 lines
83 KiB
HTML
2998 lines
83 KiB
HTML
<!DOCTYPE html>
|
|
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
|
<meta name="vsisbn" content="1576101746" />
|
|
<meta name="vstitle" content="Michael Abrash's Graphics Programming Black Book, Special Edition" />
|
|
<meta name="vsauthor" content="Michael Abrash" />
|
|
<meta name="vspublisher" content="The Coriolis Group" />
|
|
<meta name="vspubdate" content="07/01/97" />
|
|
<meta name="vscategory" content="Web and Software Development: Game Development,Web and Software Development: Graphics and Multimedia Development" />
|
|
|
|
<title>Michael Abrash's Graphics Programming Black Book Special Edition: Table of Contents</title>
|
|
<meta name="chapter" content="0" />
|
|
<meta name="pages" content="0" />
|
|
<style type="text/css">
|
|
/*<![CDATA[*/
|
|
#index { font-size: 18px; }
|
|
ol, ul { list-style: none; line-height: 1.5em; font-size: 0.95em;}
|
|
/*]]>*/
|
|
</style>
|
|
</head>
|
|
|
|
<body>
|
|
<center>
|
|
<h2>Michael Abrash's Graphics Programming Black Book Special Edition</h2>
|
|
</center>
|
|
<hr />
|
|
|
|
<ol id="index">
|
|
<li>
|
|
<a href="intro.html">Introduction</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="about.html">Foreword</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="about_author.html">About the Author</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="01-01.html">Part I</a>
|
|
|
|
<ol>
|
|
<li>
|
|
<a href="01-01.html#Heading1">Chapter 1—The Best Optimizer Is between Your Ears</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="01-01.html#Heading2">The Human Element of Code Optimization</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="01-01.html#Heading3">Understanding High Performance</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="01-01.html#Heading4">When Fast Isn’t Fast</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="01-02.html#Heading5">Rules for Building High-Performance Code</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="01-02.html#Heading6">Know Where You’re Going</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="01-02.html#Heading7">Make a Big Map</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="01-02.html#Heading8">Make Lots of Little Maps</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="01-03.html#Heading9">Know the Territory</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="01-04.html#Heading10">Know When It Matters</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="01-04.html#Heading11">Always Consider the Alternatives</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="01-05.html#Heading12">Know How to Turn On the Juice</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="01-06.html#Heading13">Where We’ve Been, What We’ve Seen</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="01-06.html#Heading14">Where We’re Going</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="02-01.html#Heading1">Chapter 2—A World Apart</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="02-01.html#Heading2">The Unique Nature of Assembly Language Optimization</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="02-01.html#Heading3">Instructions: The Individual versus the Collective</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="02-01.html#Heading4">Assembly Is Fundamentally Different</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="02-02.html#Heading5">Transformation Inefficiencies</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="02-02.html#Heading6">Self-Reliance</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="02-02.html#Heading7">Knowledge</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="02-03.html#Heading8">The Flexible Mind</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="02-03.html#Heading9">Where to Begin?</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="03-01.html#Heading1">Chapter 3—Assume Nothing</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="03-01.html#Heading2">Understanding and Using the Zen Timer</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="03-01.html#Heading3">The Costs of Ignorance</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="03-01.html#Heading4">The Zen Timer</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="03-03.html#Heading5">The Zen Timer Is a Means, Not an End</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="03-03.html#Heading6">Starting the Zen Timer</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="03-03.html#Heading7">Time and the PC</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="03-04.html#Heading8">Stopping the Zen Timer</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="03-04.html#Heading9">Reporting Timing Results</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="03-05.html#Heading10">Notes on the Zen Timer</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="03-05.html#Heading11">A Sample Use of the Zen Timer</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="03-06.html#Heading12">The Long-Period Zen Timer</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="03-07.html#Heading13">Stopping the Clock</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="03-08.html#Heading14">Example Use of the Long-Period Zen Timer</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="03-09.html#Heading15">Using the Zen Timer from C</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="03-10.html#Heading16">Watch Out for Optimizing Assemblers!</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="03-10.html#Heading17">Further Reading</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="03-10.html#Heading18">Armed with the Zen Timer, Onward and Upward</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-01.html#Heading1">Chapter 4—In the Lair of the Cycle-Eaters</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="04-01.html#Heading2">How the PC Hardware Devours Code Performance</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-01.html#Heading3">Cycle-Eaters</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-01.html#Heading4">The Nature of Cycle-Eaters</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="04-01.html#Heading5">The 8088’s Ancestral Cycle-Eaters</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-01.html#Heading6">The 8-Bit Bus Cycle-Eater</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="04-02.html#Heading7">The Impact of the 8-Bit Bus Cycle-Eater</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-02.html#Heading8">What to Do about the 8-Bit Bus Cycle-Eater?</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-03.html#Heading9">The Prefetch Queue Cycle-Eater</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="04-04.html#Heading10">Official Execution Times Are Only Part of the Story</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-04.html#Heading11">There Is No Such Beast as a True Instruction Execution Time</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-05.html#Heading12">Approximating Overall Execution Times</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-05.html#Heading13">What to Do about the Prefetch Queue Cycle-Eater?</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-06.html#Heading14">Holding Up the 8088</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-06.html#Heading15">Dynamic RAM Refresh: The Invisible Hand</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="04-06.html#Heading16">How DRAM Refresh Works in the PC</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-07.html#Heading17">The Impact of DRAM Refresh</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-07.html#Heading18">What to Do About the DRAM Refresh Cycle-Eater?</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-07.html#Heading19">Wait States</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-08.html#Heading20">The Display Adapter Cycle-Eater</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="04-09.html#Heading21">The Impact of the Display Adapter Cycle-Eater</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-10.html#Heading22">What to Do about the Display Adapter Cycle-Eater?</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-10.html#Heading23">Cycle-Eaters: A Summary</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="04-10.html#Heading24">What Does It All Mean?</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="05-01.html#Heading1">Chapter 5—Crossing the Border</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="05-01.html#Heading2">Searching Files with Restartable Blocks</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="05-01.html#Heading3">Searching for Text</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="05-01.html#Heading4">Avoiding the String Trap</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="05-02.html#Heading5">Brute-Force Techniques</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="05-02.html#Heading6">Using memchr()</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="05-02.html#Heading7">Making a Search Restartable</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="05-04.html#Heading8">Interpreting Where the Cycles Go</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="05-04.html#Heading9">Knowing When Assembly Is Pointless</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="05-05.html#Heading10">Always Look Where Execution Is Going</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="06-01.html#Heading1">Chapter 6—Looking Past Face Value</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="06-01.html#Heading2">How Machine Instructions May Do More Than You Think</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="06-01.html#Heading3">Memory Addressing and Arithmetic</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="06-02.html#Heading4">Math via Memory Addressing</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="06-02.html#Heading5">The Wonders of LEA on the 386</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="06-02.html#Heading6">Multiplication with LEA Using Non-Powers of Two</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="07-01.html#Heading1">Chapter 7—Local Optimization</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="07-01.html#Heading2">Optimizing Halfway between Algorithms and Cycle Counting</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="07-01.html#Heading3">When LOOP Is a Bad Idea</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="07-02.html#Heading4">The Lessons of LOOP and JCXZ</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="07-02.html#Heading5">Avoiding LOOPS of Any Stripe</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="07-02.html#Heading6">Local Optimization</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="07-03.html#Heading7">Unrolling Loops</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="07-05.html#Heading8">Rotating and Shifting with Tables</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="07-05.html#Heading9">NOT Flips Bits—Not Flags</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="07-05.html#Heading10">Incrementing with and without Carry</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="08-01.html#Heading1">Chapter 8—Speeding Up C with Assembly Language</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="08-01.html#Heading2">Jumping Languages When You Know It’ll Help</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="08-01.html#Heading3">Billy, Don’t Be a Compiler</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="08-01.html#Heading4">Don’t Call Your Functions on Me, Baby</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="08-02.html#Heading5">Stack Frames Slow So Much</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="08-02.html#Heading6">Torn Between Two Segments</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="08-02.html#Heading7">Why Speeding Up Is Hard to Do</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="08-02.html#Heading8">Taking It to the Limit</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="08-02.html#Heading9">A C-to-Assembly Case Study</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="09-01.html#Heading1">Chapter 9—Hints My Readers Gave Me</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="09-01.html#Heading2">Optimization Odds and Ends from the Field</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="09-01.html#Heading3">Another Look at LEA</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="09-01.html#Heading4">The Kennedy Portfolio</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="09-02.html#Heading5">Speeding Up Multiplication</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="09-02.html#Heading6">Optimizing Optimized Searching</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="09-05.html#Heading7">Short Sorts</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="09-05.html#Heading8">Full 32-Bit Division</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="09-06.html#Heading9">Sweet Spot Revisited</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="09-07.html#Heading10">Hard-Core Cycle Counting</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="09-07.html#Heading11">Hardwired Far Jumps</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="09-07.html#Heading12">Setting 32-Bit Registers: Time versus Space</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="10-01.html#Heading1">Chapter 10—Patient Coding, Faster Code</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="10-01.html#Heading2">How Working Quickly Can Bring Execution to a Crawl</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="10-01.html#Heading3">The Case for Delayed Gratification</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="10-01.html#Heading4">The Brute-Force Syndrome</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="10-02.html#Heading5">Wasted Breakthroughs</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="10-03.html#Heading6">Recursion</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="10-03.html#Heading7">Patient Optimization</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="11-01.html#Heading1">Chapter 11—Pushing the 286 and 386</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="11-01.html#Heading2">New Registers, New Instructions, New Timings, New Complications</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="11-01.html#Heading3">Family Matters</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="11-01.html#Heading4">Crossing the Gulf to the 286 and the 386</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="11-01.html#Heading5">In the Lair of the Cycle-Eaters, Part II</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="11-02.html#Heading6">System Wait States</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="11-03.html#Heading7">Data Alignment</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="11-03.html#Heading8">Code Alignment</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="11-04.html#Heading9">Alignment and the 386</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="11-04.html#Heading10">Alignment and the Stack</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="11-04.html#Heading11">The DRAM Refresh Cycle-Eater: Still an Act of God</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="11-04.html#Heading12">The Display Adapter Cycle-Eater</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="11-05.html#Heading13">New Instructions and Features: The 286</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="11-05.html#Heading14">New Instructions and Features: The 386</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="11-06.html#Heading15">Optimization Rules: The More Things Change...</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="11-06.html#Heading16">Detailed Optimization</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="11-07.html#Heading17">POPF and the 286</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="12-01.html#Heading1">Chapter 12—Pushing the 486</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="12-01.html#Heading2">It’s Not Just a Bigger 386</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="12-01.html#Heading3">Enter the 486</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="12-01.html#Heading4">Rules to Optimize By</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="12-01.html#Heading5">The Hazards of Indexed Addressing</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="12-02.html#Heading6">Calculate Memory Pointers Ahead of Time</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="12-02.html#Heading7">Caveat Programmor</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="12-03.html#Heading8">Stack Addressing and Address Pipelining</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="12-03.html#Heading9">Problems with Byte Registers</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="12-04.html#Heading10">More Fun with Byte Registers</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="12-04.html#Heading11">Timing Your Own 486 Code</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="12-04.html#Heading12">The Story Continues</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="13-01.html#Heading1">Chapter 13—Aiming the 486</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="13-01.html#Heading2">Pipelines and Other Hazards of the High End</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="13-01.html#Heading3">486 Pipeline Optimization</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="13-02.html#Heading4">BSWAP: More Useful Than You Might Think</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="13-03.html#Heading5">Pushing and Popping Memory</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="13-03.html#Heading6">Optimal 1-Bit Shifts and Rotates</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="13-04.html#Heading7">32-Bit Addressing Modes</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="14-01.html#Heading1">Chapter 14—Boyer-Moore String Searching</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="14-01.html#Heading2">Optimizing a Pretty Optimum Search Algorithm</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="14-01.html#Heading3">String Searching Refresher</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="14-02.html#Heading4">The Boyer-Moore Algorithm</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="14-02.html#Heading5">Boyer-Moore: The Good and the Bad</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="14-06.html#Heading6">Further Optimization of Boyer-Moore</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="14-06.html#Heading7">Know What You Know</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="15-01.html#Heading1">Chapter 15—Linked Lists and plain Unintended Challenges</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="15-01.html#Heading2">Unfamiliar Problems with Familiar Data Structures</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="15-01.html#Heading3">Linked Lists</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="15-02.html#Heading4">Dummies and Sentinels</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="15-03.html#Heading5">Circular Lists</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="15-04.html#Heading6">Hi/Lo in 24 Bytes</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="16-01.html#Heading1">Chapter 16—There Ain’t No Such Thing as the Fastest Code</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="16-01.html#Heading2">Lessons Learned in the Pursuit of the Ultimate Word Counter</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="16-01.html#Heading3">Counting Words in a Hurry</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="16-02.html#Heading4">Which Way to Go from Here?</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="16-03.html#Heading5">Challenges and Hazards</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="16-04.html#Heading6">Blinding Yourself to a Better Approach</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="16-04.html#Heading7">Watch Out for Luggable Assumptions!</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="16-04.html#Heading8">The Astonishment of Right-Brain Optimization</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="16-06.html#Heading9">Levels of Optimization</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="16-06.html#Heading10">Optimization Level 1: Good Code</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="16-07.html#Heading11">Level 2: A New Perspective</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="16-08.html#Heading12">Level 3: Breakthrough</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="16-08.html#Heading13">Enough Word Counting Already!</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="17-01.html#Heading1">Chapter 17—The Game of Life</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="17-01.html#Heading2">The Triumph of Algorithmic Optimization in a Cellular Automata Game</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="17-01.html#Heading3">Conway’s Game</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="17-01.html#Heading4">The Rules of the Game</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="17-03.html#Heading5">Where Does the Time Go?</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="17-03.html#Heading6">The Hazards and Advantages of Abstraction</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="17-05.html#Heading7">Heavy-Duty C++ Optimization</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="17-06.html#Heading8">Bringing In the Right Brain</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="17-06.html#Heading9">Re-Examining the Task</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="17-06.html#Heading10">Acting on What We Know</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="17-08.html#Heading11">The Challenge That Ate My Life</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="18-01.html#Heading1">Chapter 18—It’s a plain Wonderful Life</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="18-01.html#Heading2">Optimization beyond the Pale</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="18-01.html#Heading3">Breaking the Rules</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="18-02.html#Heading4">Table-Driven Magic</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="18-04.html#Heading5">Keeping Track of Change with a Change List</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="18-05.html#Heading6">A Layperson’s Overview of QLIFE</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="19-01.html#Heading1">Chapter 19—Pentium: Not the Same Old Song</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="19-01.html#Heading2">Learning a Whole Different Set of Optimization Rules</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="19-01.html#Heading3">The Return of Optimization as Art</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="19-01.html#Heading4">The Pentium: An Overview</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="19-02.html#Heading5">Crossing Cache Lines</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="19-02.html#Heading6">Cache Organization</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="19-03.html#Heading7">Faster Addressing and More</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="19-04.html#Heading8">Branch Prediction</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="19-04.html#Heading9">Miscellaneous Pentium Topics</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="19-04.html#Heading10">486 versus Pentium Optimization</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="19-04.html#Heading11">Going Superscalar</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="20-01.html#Heading1">Chapter 20—Pentium Rules</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="20-01.html#Heading2">How Your Carbon-Based Optimizer Can Put the “Super” in Superscalar</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="20-01.html#Heading3">An Instruction in Every Pipe</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="20-02.html#Heading4">V-Pipe-Capable Instructions</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="20-03.html#Heading5">Lockstep Execution</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="20-04.html#Heading6">Superscalar Notes</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="20-04.html#Heading7">Register Starvation</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="21-01.html#Heading1">Chapter 21—Unleashing the Pentium’s V-Pipe</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="21-01.html#Heading2">Focusing on Keeping Both Pentium Pipes Full</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="21-01.html#Heading3">Address Generation Interlocks</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="21-02.html#Heading4">Register Contention</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="21-02.html#Heading5">Exceptions to Register Contention</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="21-02.html#Heading6">Who’s in First?</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="21-03.html#Heading7">Pentium Optimization in Action</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="21-05.html#Heading8">A Quick Note on the 386 and 486</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="22-01.html#Heading1">Chapter 22—Zenning and the Flexible Mind</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="22-01.html#Heading2">Taking a Spin through What You’ve Learned</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="22-01.html#Heading3">Zenning</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ol>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="23-01.html">Part II</a>
|
|
|
|
<ol start="23">
|
|
<li>
|
|
<a href="23-01.html#Heading1">Chapter 23—Bones and Sinew</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="23-01.html#Heading2">At the Very Heart of Standard PC Graphics</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="23-01.html#Heading3">The VGA</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="23-01.html#Heading4">An Introduction to VGA Programming</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="23-02.html#Heading5">At the Core</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="23-03.html#Heading6">Linear Planes and True VGA Modes</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="23-04.html#Heading7">Smooth Panning</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="23-05.html#Heading8">Color Plane Manipulation</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="23-05.html#Heading9">Page Flipping</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="23-06.html#Heading10">The Hazards of VGA Clones</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="23-06.html#Heading11">Just the Beginning</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="23-06.html#Heading12">The Macro Assembler</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="24-01.html#Heading1">Chapter 24—Parallel Processing with the VGA</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="24-01.html#Heading2">Taking on Graphics Memory Four Bytes at a Time</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="24-01.html#Heading3">VGA Programming: ALUs and Latches</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="24-03.html#Heading4">Notes on the ALU/Latch Demo Program</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="25-01.html#Heading1">Chapter 25—VGA Data Machinery</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="25-01.html#Heading2">The Barrel Shifter, Bit Mask, and Set/Reset Mechanisms</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="25-01.html#Heading3">VGA Data Rotation</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="25-01.html#Heading4">The Bit Mask</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="25-03.html#Heading5">The VGA’s Set/Reset Circuitry</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="25-04.html#Heading6">Setting All Planes to a Single Color</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="25-05.html#Heading7">Manipulating Planes Individually</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="25-06.html#Heading8">Notes on Set/Reset</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="25-06.html#Heading9">A Brief Note on Word OUTs</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="26-01.html#Heading1">Chapter 26—VGA Write Mode 3</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="26-01.html#Heading2">The Write Mode That Grows on You</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="26-01.html#Heading3">A Mode Born in Strangeness</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="26-03.html#Heading4">A Note on Preserving Register Bits</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="27-01.html#Heading1">Chapter 27—Yet Another VGA Write Mode</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="27-01.html#Heading2">Write Mode 2, Chunky Bitmaps,and Text-Graphics Coexistence</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="27-01.html#Heading3">Write Mode 2 and Set/Reset</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="27-01.html#Heading4">A Byte’s Progress in Write Mode 2</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="27-02.html#Heading5">Copying Chunky Bitmaps to VGA Memory Using Write Mode 2</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="27-03.html#Heading6">Drawing Color-Patterned Lines Using Write Mode 2</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="27-04.html#Heading7">When to Use Write Mode 2 and When to Use Set/Reset</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="27-04.html#Heading8">Mode 13H—320x200 with 256 Colors</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="27-04.html#Heading9">Flipping Pages from Text to Graphics and Back</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="28-01.html#Heading1">Chapter 28—Reading VGA Memory</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="28-01.html#Heading2">Read Modes 0 and 1, and the Color Don’t Care Register</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="28-01.html#Heading3">Read Mode 0</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="28-03.html#Heading4">Read Mode 1</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="28-04.html#Heading5">When all Planes “Don’t Care”</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="29-01.html#Heading1">Chapter 29—Saving Screens and Other VGA Mysteries</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="29-01.html#Heading2">Useful Nuggets from the VGA Zen File</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="29-01.html#Heading3">Saving and Restoring EGA and VGA Screens</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="29-03.html#Heading4">16 Colors out of 64</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="29-05.html#Heading5">Overscan</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="29-05.html#Heading6">A Bonus Blanker</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="29-06.html#Heading7">Modifying VGA Registers</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="30-01.html#Heading1">Chapter 30—Video Est Omnis Divisa</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="30-01.html#Heading2">The Joys and Galling Problems of Using Split Screens on the EGA and VGA</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="30-01.html#Heading3">How the Split Screen Works</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="30-01.html#Heading4">The Split Screen in Action</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="30-03.html#Heading5">VGA and EGA Split-Screen Operation Don’t Mix</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="30-03.html#Heading6">Setting the Split-Screen-Related Registers</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="30-03.html#Heading7">The Problem with the EGA Split Screen</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="30-04.html#Heading8">Split Screen and Panning</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="30-04.html#Heading9">The Split Screen and Horizontal Panning: An Example</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="30-06.html#Heading10">Notes on Setting and Reading Registers</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="30-07.html#Heading11">Split Screens in Other Modes</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="30-07.html#Heading12">How Safe?</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="31-01.html#Heading1">Chapter 31—Higher 256-Color Resolution on the VGA</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="31-01.html#Heading2">When Is 320x200 Really 320x400?</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="31-01.html#Heading3">Why 320x200? Only IBM Knows for Sure</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="31-01.html#Heading4">320x400 256-Color Mode</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="31-01.html#Heading5">Display Memory Organization in 320x400 Mode</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="31-02.html#Heading6">Reading and Writing Pixels</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="31-04.html#Heading7">Two 256-Color Pages</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="31-05.html#Heading8">Something to Think About</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="32-01.html#Heading1">Chapter 32—Be It Resolved: 360x480</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="32-01.html#Heading2">Taking 256-Color Modes About as Far as the Standard VGA Can Take Them</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="32-01.html#Heading3">Extended 256-Color Modes: What’s Not to Like?</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="32-01.html#Heading4">360x480 256-Color Mode</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="32-04.html#Heading5">How 360x480 256-Color Mode Works</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="32-04.html#Heading6">480 Scan Lines per Screen: A Little Slower, But No Big Deal</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="32-04.html#Heading7">360 Pixels per Scan Line: No Mean Feat</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="32-05.html#Heading8">Accessing Display Memory in 360x480 256-Color Mode</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="33-01.html#Heading1">Chapter 33—Yogi Bear and Eurythmics Confront VGA Colors</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="33-01.html#Heading2">The Basics of VGA Color Generation</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="33-01.html#Heading3">VGA Color Basics</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="33-01.html#Heading4">The Palette RAM</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="33-01.html#Heading5">The DAC</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="33-02.html#Heading6">Color Paging with the Color Select Register</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="33-02.html#Heading7">256-Color Mode</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="33-02.html#Heading8">Setting the Palette RAM</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="33-03.html#Heading9">Setting the DAC</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="33-03.html#Heading10">If You Can’t Call the BIOS, Who Ya Gonna Call?</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="33-03.html#Heading11">An Example of Setting the DAC</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="34-01.html#Heading1">Chapter 34—Changing Colors without Writing Pixels</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="34-01.html#Heading2">Special Effects through Realtime Manipulation of DAC Colors</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="34-01.html#Heading3">Color Cycling</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="34-01.html#Heading4">The Heart of the Problem</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="34-02.html#Heading5">Loading the DAC via the BIOS</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="34-02.html#Heading6">Loading the DAC Directly</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="34-03.html#Heading7">A Test Program for Color Cycling</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="34-04.html#Heading8">Color Cycling Approaches that Work</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="34-05.html#Heading9">Odds and Ends</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="34-05.html#Heading10">The DAC Mask</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="34-05.html#Heading11">Reading the DAC</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="34-05.html#Heading12">Cycling Down</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="35-01.html#Heading1">Chapter 35—Bresenham Is Fast, and Fast Is Good</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="35-01.html#Heading2">Implementing and Optimizing Bresenham’s Line-Drawing Algorithm</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="35-01.html#Heading3">The Task at Hand</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="35-01.html#Heading4">Bresenham’s Line-Drawing Algorithm</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="35-02.html#Heading5">Strengths and Weaknesses</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="35-03.html#Heading6">An Implementation in C</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="35-04.html#Heading7">Looking at EVGALine</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="35-05.html#Heading8">Drawing Each Line</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="35-05.html#Heading9">Drawing Each Pixel</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="35-06.html#Heading10">Comments on the C Implementation</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="35-06.html#Heading11">Bresenham’s Algorithm in Assembly</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="36-01.html#Heading1">Chapter 36—The Good, the Bad, and the Run-Sliced</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="36-01.html#Heading2">Faster Bresenham Lines with Run-Length Slice Line Drawing</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="36-01.html#Heading3">Run-Length Slice Fundamentals</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="36-02.html#Heading4">Run-Length Slice Implementation</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="36-03.html#Heading5">Run-Length Slice Details</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="37-01.html#Heading1">Chapter 37—Dead Cats and Lightning Lines</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="37-01.html#Heading2">Optimizing Run-Length Slice Line Drawing in a Major Way</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="37-01.html#Heading3">Fast Run-Length Slice Line Drawing</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="37-02.html#Heading4">How Fast Is Fast?</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="37-02.html#Heading5">Further Optimizations</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="38-01.html#Heading1">Chapter 38—The Polygon Primeval</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="38-01.html#Heading2">Drawing Polygons Efficiently and Quickly</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="38-01.html#Heading3">Filled Polygons</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="38-01.html#Heading4">Which Side Is Inside?</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="38-02.html#Heading5">How Do You Fit Polygons Together?</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="38-02.html#Heading6">Filling Non-Overlapping Convex Polygons</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="38-04.html#Heading7">Oddball Cases</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="39-01.html#Heading1">Chapter 39—Fast Convex Polygons</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="39-01.html#Heading2">Filling Polygons in a Hurry</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="39-01.html#Heading3">Fast Convex Polygon Filling</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="39-01.html#Heading4">Fast Drawing</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="39-02.html#Heading5">Fast Edge Tracing</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="39-03.html#Heading6">The Finishing Touch: Assembly Language</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="39-04.html#Heading7">Maximizing REP STOS</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="39-04.html#Heading8">Faster Edge Tracing</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="40-01.html#Heading1">Chapter 40—Of Songs, Taxes, and the Simplicity of Complex Polygons</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="40-01.html#Heading2">Dealing with Irregular Polygonal Areas</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="40-01.html#Heading3">Filling Arbitrary Polygons</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="40-01.html#Heading4">Active Edges</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="40-03.html#Heading5">Complex Polygon Filling: An Implementation</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="40-04.html#Heading6">More on Active Edges</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="40-04.html#Heading7">Performance Considerations</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="40-05.html#Heading8">Nonconvex Polygons</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="40-05.html#Heading9">Details, Details</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="41-01.html#Heading1">Chapter 41—Those Way-Down Polygon Nomenclature Blues</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="41-01.html#Heading2">Names Do Matter when You Conceptualize a Data Structure</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="41-01.html#Heading3">Nomenclature in Action</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="42-01.html#Heading1">Chapter 42—Wu’ed in Haste; Fried, Stewed at Leisure</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="42-01.html#Heading2">Fast Antialiased Lines Using Wu’s Algorithm</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="42-01.html#Heading3">Wu Antialiasing</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="42-02.html#Heading4">Tracing and Intensity in One</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="42-03.html#Heading5">Sample Wu Antialiasing</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="42-05.html#Heading6">Notes on Wu Antialiasing</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="43-01.html#Heading1">Chapter 43—Bit-Plane Animation</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="43-01.html#Heading2">A Simple and Extremely Fast Animation Method for Limited Color</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="43-01.html#Heading3">Bit-Planes: The Basics</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="43-02.html#Heading4">Stacking the Palette Registers</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="43-02.html#Heading5">Bit-Plane Animation in Action</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="43-04.html#Heading6">Limitations of Bit-Plane Animation</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="43-05.html#Heading7">Shearing and Page Flipping</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="43-06.html#Heading8">Beating the Odds in the Jaw-Dropping Contest</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="44-01.html#Heading1">Chapter 44—Split Screens Save the Page Flipped Day</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="44-01.html#Heading2">640x480 Page Flipped Animation in 64K...Almost</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="44-01.html#Heading3">A Plethora of Challenges</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="44-01.html#Heading4">A Page Flipping Animation Demonstration</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="44-04.html#Heading5">Write Mode 3</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="44-04.html#Heading6">Drawing Text</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="44-05.html#Heading7">Page Flipping</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="44-06.html#Heading8">Knowing When to Flip</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="44-06.html#Heading9">Enter the Split Screen</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="45-01.html#Heading1">Chapter 45—Dog Hair and Dirty Rectangles</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="45-01.html#Heading2">Different Angles on Animation</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="45-01.html#Heading3">Plus ça Change</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="45-01.html#Heading4">VGA Access Times</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="45-02.html#Heading5">Dirty-Rectangle Animation</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="45-02.html#Heading6">So Why Not Use Page Flipping?</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="45-03.html#Heading7">Dirty Rectangles in Action</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="45-04.html#Heading8">Hi-Res VGA Page Flipping</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="45-06.html#Heading9">Another Interesting Twist on Page Flipping</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="46-01.html#Heading1">Chapter 46—Who Was that Masked Image?</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="46-01.html#Heading2">Optimizing Dirty-Rectangle Animation</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="46-01.html#Heading3">Dirty-Rectangle Animation, Continued</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="46-03.html#Heading4">Masked Images</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="46-03.html#Heading5">Internal Animation</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="46-03.html#Heading6">Dirty-Rectangle Management</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="46-03.html#Heading7">Drawing Order and Visual Quality</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="47-01.html#Heading1">Chapter 47—Mode X: 256-Color VGA Magic</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="47-01.html#Heading2">Introducing the VGA’s Undocumented “Animation-Optimal” Mode</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="47-01.html#Heading3">What Makes Mode X Special?</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="47-02.html#Heading4">Selecting 320x240 256-Color Mode</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="47-04.html#Heading5">Designing from a Mode X Perspective</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="47-06.html#Heading6">Hardware Assist from an Unexpected Quarter</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="48-01.html#Heading1">Chapter 48—Mode X Marks the Latch</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="48-01.html#Heading2">The Internals of Animation’s Best Video Display Mode</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="48-03.html#Heading3">Allocating Memory in Mode X</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="48-03.html#Heading4">Copying Pixel Blocks within Display Memory</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="48-05.html#Heading5">Copying to Display Memory</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="48-05.html#Heading6">Who Was that Masked Image Copier?</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="49-01.html#Heading1">Chapter 49—Mode X 256-Color Animation</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="49-01.html#Heading2">How to Make the VGA Really Get up and Dance</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="49-01.html#Heading3">Masked Copying</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="49-02.html#Heading4">Faster Masked Copying</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="49-03.html#Heading5">Notes on Masked Copying</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="49-04.html#Heading6">Animation</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="49-04.html#Heading7">Mode X Animation in Action</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="49-05.html#Heading8">Works Fast, Looks Great</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="50-01.html#Heading1">Chapter 50—Adding a Dimension</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="50-01.html#Heading2">3-D Animation Using Mode X</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="50-01.html#Heading3">References on 3-D Drawing</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="50-01.html#Heading4">The 3-D Drawing Pipeline</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="50-02.html#Heading5">Projection</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="50-02.html#Heading6">Translation</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="50-02.html#Heading7">Rotation</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="50-02.html#Heading8">A Simple 3-D Example</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="50-07.html#Heading9">Notes on the 3-D Animation Example</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="50-07.html#Heading10">An Ongoing Journey</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="51-01.html#Heading1">Chapter 51—Sneakers in Space</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="51-01.html#Heading2">Using Backface Removal to Eliminate Hidden Surfaces</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="51-01.html#Heading3">One-sided Polygons: Backface Removal</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="51-02.html#Heading4">Backface Removal in Action</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="51-05.html#Heading5">Incremental Transformation</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="51-06.html#Heading6">A Note on Rounding Negative Numbers</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="51-06.html#Heading7">Object Representation</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="52-01.html#Heading1">Chapter 52—Fast 3-D Animation: Meet X-Sharp</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="52-01.html#Heading2">The First Iteration of a Generalized 3-D Animation Package</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="52-01.html#Heading3">This Chapter’s Demo Program</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="52-07.html#Heading4">A New Animation Framework: X-Sharp</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="52-07.html#Heading5">Three Keys to Realtime Animation Performance</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="52-08.html#Heading6">Drawbacks</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="52-08.html#Heading7">Where the Time Goes</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="53-01.html#Heading1">Chapter 53—Raw Speed and More</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="53-01.html#Heading2">The Naked Truth About Speed in 3-D Animation</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="53-01.html#Heading3">Raw Speed, Part 1: Assembly Language</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="53-03.html#Heading4">Raw Speed, Part II: Look it Up</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="53-03.html#Heading5">Hidden Surfaces</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="53-04.html#Heading6">Rounding</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="54-01.html#Heading1">Chapter 54—3-D Shading</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="54-01.html#Heading2">Putting Realistic Surfaces on Animated 3-D Objects</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="54-01.html#Heading3">Support for Older Processors</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="54-03.html#Heading4">Shading</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="54-03.html#Heading5">Ambient Shading</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="54-03.html#Heading6">Diffuse Shading</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="54-05.html#Heading7">Shading: Implementation Details</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="55-01.html#Heading1">Chapter 55—Color Modeling in 256-Color Mode</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="55-01.html#Heading2">Pondering X-Sharp’s Color Model in an RGB State of Mind</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="55-01.html#Heading3">A Color Model</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="55-03.html#Heading4">A Bonus from the BitMan</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="56-01.html#Heading1">Chapter 56—Pooh and the Space Station</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="56-01.html#Heading2">Using Fast Texture Mapping to Place Pooh on a Polygon</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="56-01.html#Heading3">Principles of Quick-and-Dirty Texture Mapping</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="56-01.html#Heading4">Mapping Textures Made Easy</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="56-03.html#Heading5">Fast Texture Mapping: An Implementation</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="57-01.html#Heading1">Chapter 57—10,000 Freshly Sheared Sheep on the Screen</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="57-01.html#Heading2">The Critical Role of Experience in Implementing Fast, Smooth Texture Mapping</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="57-01.html#Heading3">Visual Quality: A Black Hole ... Er, Art</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="57-01.html#Heading4">Fixed-Point Arithmetic, Redux</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="57-02.html#Heading5">Texture Mapping: Orientation Independence</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="57-02.html#Heading6">Mapping Textures across Multiple Polygons</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="57-02.html#Heading7">Fast Texture Mapping</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="58-01.html#Heading1">Chapter 58—Heinlein’s Crystal Ball, Spock’s Brain, and the 9-Cycle Dare</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="58-01.html#Heading2">Using the Whole-Brain Approach to Accelerate Texture Mapping</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="58-01.html#Heading3">Texture Mapping Redux</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="58-01.html#Heading4">Left-Brain Optimization</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="58-02.html#Heading5">A 90-Degree Shift in Perspective</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="58-03.html#Heading6">That’s Nice—But it Sure as Heck Ain’t 9 Cycles</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="58-04.html#Heading7">Don’t Stop Thinking about Those Cycles</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="58-05.html#Heading8">Texture Mapping Notes</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="59-01.html#Heading1">Chapter 59—The Idea of BSP Trees</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="59-01.html#Heading2">What BSP Trees Are and How to Walk Them</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="59-01.html#Heading3">BSP Trees</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="59-01.html#Heading4">Visibility Determination</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="59-02.html#Heading5">Limitations of BSP Trees</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="59-02.html#Heading6">Building a BSP Tree</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="59-03.html#Heading7">Visibility Ordering</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="59-04.html#Heading8">Inorder Walks of BSP Trees</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="59-04.html#Heading9">Know It <i>Cold</i></a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="59-05.html#Heading10">Measure and Learn</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="59-06.html#Heading11">Surfing Amidst the Trees</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="59-06.html#Heading12">Related Reading</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="60-01.html#Heading1">Chapter 60—Compiling BSP Trees</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="60-01.html#Heading2">Taking BSP Trees from Concept to Reality</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="60-01.html#Heading3">Compiling BSP Trees</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="60-02.html#Heading4">Parametric Lines</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="60-02.html#Heading5">Parametric Line Clipping</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="60-02.html#Heading6">The BSP Compiler</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="60-04.html#Heading7">Optimizing the BSP Tree</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="60-04.html#Heading8">BSP Optimization: an Undiscovered Country</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="61-01.html#Heading1">Chapter 61—Frames of Reference</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="61-01.html#Heading2">The Fundamentals of the Math behind 3-D Graphics</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="61-01.html#Heading3">3-D Math</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="61-01.html#Heading4">Foundation Definitions</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="61-02.html#Heading5">The Dot Product</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="61-02.html#Heading6">Dot Products of Unit Vectors</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="61-02.html#Heading7">Cross Products and the Generation of Polygon Normals</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="61-03.html#Heading8">Using the Sign of the Dot Product</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="61-04.html#Heading9">Using the Dot Product for Projection</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="61-04.html#Heading10">Rotation by Projection</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="62-01.html#Heading1">Chapter 62—One Story, Two Rules, and a BSP Renderer</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="62-01.html#Heading2">Taking a Compiled BSP Tree from Logical to Visual Reality</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="62-01.html#Heading3">BSP-based Rendering</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="62-03.html#Heading4">The Rendering Pipeline</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="62-03.html#Heading5">Moving the Viewer</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="62-03.html#Heading6">Transformation into Viewspace</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="62-03.html#Heading7">Clipping</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="62-03.html#Heading8">Projection to Screenspace</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="62-04.html#Heading9">Walking the Tree, Backface Culling and Drawing</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="62-04.html#Heading10">Notes on the BSP Renderer</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="63-01.html#Heading1">Chapter 63—Floating-Point for Real-Time 3-D</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="63-01.html#Heading2">Knowing When to Hurl Conventional Math Wisdom Out the Window</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="63-01.html#Heading3">Not Your Father’s Floating-Point</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="63-01.html#Heading4">Pentium Floating-Point Optimization</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="63-02.html#Heading5">Pipelining, Latency, and Throughput</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="63-02.html#Heading6">FXCH</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="63-02.html#Heading7">The Dot Product</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="63-03.html#Heading8">The Cross Product</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="63-03.html#Heading9">Transformation</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="63-04.html#Heading10">Projection</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="63-04.html#Heading11">Rounding Control</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="63-04.html#Heading12">A Farewell to 3-D Fixed-Point</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="64-01.html#Heading1">Chapter 64—Quake’s Visible-Surface Determination</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="64-01.html#Heading2">The Challenge of Separating All Things Seen from All Things Unseen</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="64-01.html#Heading3">VSD: The Toughest 3-D Challenge of All</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="64-02.html#Heading4">The Structure of Quake Levels</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="64-02.html#Heading5">Culling and Visible Surface Determination</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="64-02.html#Heading6">Nodes Inside and Outside the View Frustum</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="64-02.html#Heading7">Overdraw</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="64-03.html#Heading8">The Beam Tree</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="64-03.html#Heading9">3-D Engine du Jour</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="64-03.html#Heading10">Subdividing Raycast</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="64-03.html#Heading11">Vertex-Free Surfaces</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="64-03.html#Heading12">The Draw-Buffer</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="64-03.html#Heading13">Span-Based Drawing</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="64-03.html#Heading14">Portals</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="64-03.html#Heading15">Breakthrough!</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="64-04.html#Heading16">Simplify, and Keep on Trying New Things</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="64-04.html#Heading17">Learn Now, Pay Forward</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="64-04.html#Heading18">References</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="65-01.html#Heading1">Chapter 65—3-D Clipping and Other Thoughts</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="65-01.html#Heading2">Determining What’s Inside Your Field of View</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="65-01.html#Heading3">3-D Clipping Basics</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="65-02.html#Heading4">Intersecting a Line Segment with a Plane</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="65-02.html#Heading5">Polygon Clipping</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="65-03.html#Heading6">Clipping to the Frustum</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="65-04.html#Heading7">The Lessons of Listing 65.3</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="65-04.html#Heading8">Advantages of Viewspace Clipping</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="65-04.html#Heading9">Further Reading</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="66-01.html#Heading1">Chapter 66—Quake’s Hidden-Surface Removal</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="66-01.html#Heading2">Struggling with Z-Order Solutions to the Hidden Surface Problem</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="66-01.html#Heading3">Creative Flux and Hidden Surfaces</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="66-01.html#Heading4">Drawing Moving Objects</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="66-01.html#Heading5">Performance Impact</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="66-01.html#Heading6">Leveling and Improving Performance</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="66-02.html#Heading7">Sorted Spans</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="66-02.html#Heading8">Edges versus Spans</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="66-03.html#Heading9">Edge-Sorting Keys</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="66-04.html#Heading10">Where That 1/Z Equation Comes From</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="66-04.html#Heading11">Quake and Z-Sorting</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="66-04.html#Heading12">Decisions Deferred</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="67-01.html#Heading1">Chapter 67—Sorted Spans in Action</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="67-01.html#Heading2">Implementing Independent Span Sorting for Rendering without Overdraw</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="67-01.html#Heading3">Quake and Sorted Spans</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="67-02.html#Heading4">Types of 1/z Span Sorting</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="67-02.html#Heading5">Intersecting Span Sorting</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="67-02.html#Heading6">Abutting Span Sorting</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="67-03.html#Heading7">Independent Span Sorting</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="67-03.html#Heading8">1/z Span Sorting in Action</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="67-05.html#Heading9">Implementation Notes</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="68-01.html#Heading1">Chapter 68—Quake’s Lighting Model</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="68-01.html#Heading2">A Radically Different Approach to Lighting Polygons</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="68-01.html#Heading3">The Lighting Conundrum</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="68-01.html#Heading4">Gouraud Shading</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="68-01.html#Heading5">Problems with Gouraud Shading</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="68-02.html#Heading6">Perspective Correctness</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="68-02.html#Heading7">The Quest for Alternative Lighting</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="68-02.html#Heading8">Decoupling Lighting from Rasterization</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="68-03.html#Heading9">Size and Speed</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="68-03.html#Heading10">Surface Caching</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="68-04.html#Heading11">Mipmapping To The Rescue</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="68-04.html#Heading12">Two Final Notes on Surface Caching</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="69-01.html#Heading1">Chapter 69—Surface Caching and Quake’s Triangle Models</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="69-01.html#Heading2">Probing Hardware-Assisted Surfaces and Fast Model Animation Without Sprites</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="69-01.html#Heading3">Surface Caching with Hardware Assistance</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="69-02.html#Heading4">Letting the Graphics Card Build the Textures</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="69-02.html#Heading5">The Light Map as Alpha Texture</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="69-02.html#Heading6">Drawing Triangle Models</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="69-02.html#Heading7">Drawing Triangle Models Fast</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="69-03.html#Heading8">Trading Subpixel Precision for Speed</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="69-03.html#Heading9">An Idea that Didn’t Work</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="69-03.html#Heading10">An Idea that Did Work</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="69-04.html#Heading11">More Ideas that Might Work</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="70-01.html#Heading1">Chapter 70—Quake: A Post-Mortem and a Glimpse into the Future</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="70-01.html#Heading2">Preprocessing the World</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="70-02.html#Heading3">The Potentially Visible Set (PVS)</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="70-03.html#Heading4">Passages: The Last-Minute Change that Didn’t Happen</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="70-03.html#Heading5">Drawing the World</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="70-04.html#Heading6">Rasterization</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="70-04.html#Heading7">Lighting</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="70-04.html#Heading8">Dynamic Lighting</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="70-05.html#Heading9">Entities</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="70-05.html#Heading10">BSP Models</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="70-05.html#Heading11">Polygon Models and Z-Buffering</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="70-06.html#Heading12">The Subdivision Rasterizer</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="70-06.html#Heading13">Sprites</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="70-06.html#Heading14">Particles</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="70-06.html#Heading15">How We Spent Our Summer Vacation: After Shipping Quake</a>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="70-06.html#Heading16">Verite Quake</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="70-07.html#Heading17">GLQuake</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="70-07.html#Heading18">WinQuake</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="70-07.html#Heading19">QuakeWorld</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="70-08.html#Heading20">Quake 2</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="70-09.html#Heading21">Looking Forward</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ol>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="appendix-a.html">Appendix A</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="book-index.html">Index</a>
|
|
</li>
|
|
</ol>
|
|
<hr width="90%" size="1" noshade="noshade" />
|
|
|
|
<div align="center">
|
|
Graphics Programming Black Book © 2001 Michael Abrash
|
|
</div>
|
|
</body>
|
|
</html>
|