Index
- Numbers
-
1/z sorting
- abutting span sorting, 1229-1230
- AddPolygonEdges function, 1232-1233, 1238
- vs. BSP-order sorting, 1226-1227
- calculating 1/z value, 1220-1222
- ClearEdgeLists function, 1236-1237
- DrawSpans function, 1236
- independent span sorting, 1230, 1231-1238, 1239-1241
- intersecting span sorting, 1228-1229
- PolyFacesViewer function, 1232
- reliability, 1227
- ScanEdges function, 1234-1236, 1238-1239
- UpdateWorld function, 1237-1238
-
3-D animation
- See also Hidden surface removal; 3-D drawing; 3-D polygon rotation demo program; X-Sharp 3-D animation package.
-
demo programs
- solid cube rotation program, 957-961, 962-963, 964-966, 967
- 3-D polygon rotation program, 939, 940-945, 948-949
- 12-cube rotation program, 972, 973-984, 985-987
- depth sorting, 1000, 1001-1002
-
rotation
- ConcatXforms function, 944
- matrix representation, 938-939
- multiple axes of rotation, 948
- XformVec function, 943
- rounding vs. truncation, 1002-1003
- translation of objects, 937-938
-
3-D clipping
- arithmetic imprecision, handling, 1240
- line segments, clipping to planes, 1195-1197
- overview, 1195
-
polygon clipping
- BackRotateVector function, 1203
- clipping to frustum, 1200, 1201-1206, 1206-1207
- ClipToFrustum function, 1204
- ClipToPlane function, 1199
- optimization, 1207
- overview, 1197-1200
- PolyFacesViewer function, 1203
- ProjectPolygon function, 1201
- SetUpFrustum function, 1204
- SetWorldspace function, 1204
- TransformPoint function, 1203
- TransformPolygon function, 1203
- UpdateWorld function, 1205
- viewspace clipping, 1207
- ZSortObjects function, 1201
-
3-D drawing
- See also BSP (Binary Space Partitioning) trees; Hidden surface removal; Polygons, filling; Shading; 3-D animation.
-
backface removal
- BSP tree rendering, 1160-1161
- calculations, 955-957
- motivation for, 954-955
- and sign of dot product, 1140
- solid cube rotation demo program, 957-961, 962-963, 964-966, 967
- background surfaces, 1240
- draw-buffers, and beam trees, 1187
- and dynamic objects, 1100-1101
- Gouraud shading, 1246-1250
-
lighting
- Gouraud shading, 1246-1250
- overlapping lights, 1247
- perspective correctness, 1248-1250
- rotational variance, 1249
- surface-based lighting, 1250-1256, 1260-1262
- viewing variance, 1249
- moving models in 3-D drawings, 1212-1222
- painter’s algorithm, 1099, 1104-1105
- perspective correctness problem, 1248-1250
- portals, and beam trees, 1188
-
projection
- dot products, 1141-1142
- overview, 937, 948
- raycast, subdividing, and beam trees, 1187
- reference materials, 934-935
-
rendering BSP trees
- clipping, 1158-1159
- ClipWalls function, 1152-1155, 1158-1159
- DrawWallsBackToFront function, 1155-1156, 1160-1161
- overview, 1149
- reference materials, 1157
- TransformVertices function, 1151-1152, 1158
- UpdateViewPos function, 1151, 1157
- UpdateWorld function, 1156-1157, 1157
- viewspace, transformation of objects to, 1158
- wall orientation testing, 1160-1161
- WallFacingViewer function, 1150-1151, 1161
- span-based drawing, and beam trees, 1187
- transformation of objects, 935-936
-
triangle model drawing
- fast triangle drawing, 1263-1265
- overview, 1262-1263
- precision, 1265
- subdivision rasterization, 1266-1267, 1267-1270
- vertex-free surfaces, and beam trees, 1187
- visibility determination, 1099-1106
-
visible surface determination (VSD)
- beam trees, 1185-1189
- culling to frustum, 1181-1184
- overdraw problem, 1184-1185
- potentially visible set (PVS), precalculating, 1188-1189
-
3-D engine, Quake
- BSP trees, 1276-1277
- lighting, 1282-1283
- model overview, 1276-1277
- portals, 1279-1280
- potentially visible set (PVS), 1278-1279
- rasterization, 1282
- world, drawing, 1280-1281
-
3-D math
- cross products, 1139-1140
-
dot products
- calculating, 1135-1137
- calculating light intensity, 1137
- projection, 1141-1142
- rotation, 1143-1144
- sign of, 1140-1141
- of unit vectors, 1136
- of vectors, 1135-1136
-
matrix math
- assembly routines, 992, 996-999
- C-language implementations, 974-976
- normal vectors, calculating, 955-956
- rotation of 3-D objects, 938-939, 943-944, 948
- transformation, optimized, 1172-1173, 1173-1174
- vector length, 1135
-
3-D polygon rotation demo program
- matrix multiplication functions, 943-944, 948
- overview, 939
- performance, 949
- polygon filling with clipping support, 940-943
- transformation and projection, 944-945, 948
-
3-D solid cube rotation demo program
- basic implementation, 957-961, 962-963
- incremental transformations, 964-966
- object representation, 967
-
8-bit bus cycle-eater
- 286 and 386 processors, 210
-
8088 processor
- effects on performance, 82
- optimizing for, 83-85
- overview, 79-82
- and registers, 85
-
12-cube rotation demo program
- limitations of, 986
- optimizations in, 985-986
- performance, 986
- X-Sharp animation package, 972, 973-984, 984-985
-
16-bit checksum program
- See also TCP/IP checksum program.
- assembly implementation, 10-12, 17-18
- C language implementation, 8-9, 15-16
- overview, 8
- redesigning, 9
-
16-color VGA modes
- color paging, 628-629
- DAC (Digital/Analog Converter), 626-628
- palette RAM, 626
- 24-byte hi/lo function, 292-293
- 32-bit addressing modes, 256-258
- 32-bit division, 181-184, 1008
- 32-bit fixed-point arithmetic, optimizing, 1086-1089, 1090-1091, 1092-1093
- 32-bit instructions, optimizing, 1091
-
32-bit registers
- See also Registers; VGA registers.
- adding with LEA, 131
- BSWAP instruction, 252
- multiplying with LEA, 132-133
- 386 processor, 222
- time vs. space tradeoff, 187
- using as two 16-bit registers, 253-254
-
256-color modes
- See also 320x400 256-color mode.
- DAC settings, 629
- mapping RGB model to, 1036, 1037-1038, 1039
- resolution, 360x480 256-color mode, 619-620
-
286 processor
- CMP instruction, 161, 306
- code alignment, 215-218
- cycle-eaters, 209-210
- data alignment, 213-215
- data transfer rates, 212
- display adapter cycle-eater, 219-221
- display memory wait states, 220
- DRAM refresh cycle-eater, 219
- effective address calculations, 129, 223-225
- instruction fetching, 215-218
- LEA vs. ADD instructions, 130
- lookup tables, vs. rotating or shifting, 145-146
- LOOP instruction vs. DEC/JNZ sequence, 139
- memory access, performance, 223-225
- new features, 221
- POPF instruction, and interrupts, 226
- protected mode, 208-209
- stack pointer alignment, 218-219
- system wait states, 210-212
- 320x240 256-color mode. See Mode X.
-
320x400 256-color mode
- advantages of, 590-591
- display memory organization, 591-593
- line drawing, 600
- page flipping demo program, 600-605
- performance, 599-600
- pixel drawing demo program, 593-598, 599-600
-
360x480 256-color mode
- display memory, accessing, 621-622
- Draw360x480Dot subroutine, 613-614
- drawing speed, 618
- horizontal resolution, 620
- line drawing demo program, 615-618, 618-619
- mode set routine (John Bridges), 609, 612, 620-621
- on VGA clones, 610-611
- Read360x480Dot subroutine, 614-615
- 256-color resolution, 619-620
- vertical resolution, 619
- 386 native mode, 32-bit displacements, 187
-
386 processor
- alignment, stack pointer, 218-219
- CMP instruction, 161, 306
- cycle-eaters, 209-210
- data alignment, 213, 218
- and display adapter cycle-eater, 107
- display adapter cycle-eater, 219-221
- doubleword alignment, 218
- DRAM refresh cycle-eater, 219
- effective address calculations, 129, 223-225
- LEA instruction, 130-133, 172
- LODSD vs. MOV/LEA sequence, 171
- lookup tables, vs. rotating or shifting, 145-146
- LOOP instruction vs. DEC/JNZ sequence, 139
- memory access, performance, 223-225
- MUL and IMUL instructions, 173-174
- multiplication operations, increasing speed of, 173-174
- new instructions and features, 222
- Pentium code, running on, 411
- protected mode, 208-209
- rotation instructions, clock cycles, 185-186
- system wait states, 210-212
- 32-bit addressing modes, 256-258
- 32-bit multiply and divide operations, 985
- using 32-bit register as two 16-bit registers, 253-254
- XCHG vs. MOV instructions, 377, 832
- 386SX processor, 16-bit bus cycle-eater, 81
-
486 processor
- AX register, setting to absolute value, 172
- byte registers and lost cycles, 242-245
-
CMP instruction
- operands, order of, 306
- vs. SCASW, 161
- copying bytes between registers, 172
- and display adapter cycle-eater, 107
- indexed addressing, 237-238
-
internal cache
- effect on code timing, 246
- optimization, 236
- LAHF and SAHF instructions, 148
- LEA instruction, vs. ADD, 131
- LODSB instruction, 304
- LODSD instruction, vs. MOV/LEA sequence, 171
- lookup tables, vs. rotating or shifting, 145-146
- LOOP instruction, vs. DEC/JNZ sequence, 139
- MOV instruction, vs. XCHG, 377
- n-bit vs. 1-bit shift and rotate instructions, 255-256
- Pentium code, running on, 411
-
pipelining
- address calculation, 238-240, 250
- stack addressing, 241-242
- rotation instructions, clock cycles, 185-186
- stack-based variables, 184-184
- 32-bit addressing modes, 256-258
- timing code, 245-246
- using 32-bit register as two 16-bit registers, 253-254
- XCHG instruction, vs. MOV, 377, 832
- 640x400 mode, mode set routine, 852-853
- 640x480 mode, page flipping, 836-837
- 8086 processor vs. 8088 processor, 79-81
-
8088 processor
- CMP instruction, 161, 306
-
cycle-eaters
- 8-bit bus cycle-eater, 79-85
- display adapter cycle-eater, 101-108
- DRAM refresh cycle-eater, 95-99
- overview, 78-79, 80
- prefetch queue cycle-eater, 86-94
- wait states, 99-101
- display memory access, 220
- effective address calculation options, 129
- vs. 8086 processor, 79-81
- LAHF and SAHF instructions, 148
- LEA vs. ADD, 130
- LODSB instruction, 304
- lookup tables, vs. rotating or shifting, 145-146
- LOOP instruction vs. DEC/JNZ sequence, 139
- memory variables, size of, 83-85
- stack-based variables, placement of, 184-184
-
8253 timer chip
- and DRAM refresh, 95
- reference material, 72
- resetting, 43
-
system clock inaccuracies
- long-period Zen timer, 53, 54
- Zen timer, 43, 45-46, 48
-
timer 0
- operation, 44
- stopping, 54, 65
- timer modes, 44, 45
- timer operation, 43-45
- undocumented features, 54, 65
- A
- Absolute value, setting AX register, 171
- Abstraction, and optimization, 330-332, 345-346
- Abutting span sorting, 1229-1230
-
AC (Attribute Controller), VGA
- addressing, 427-428
- Color Select register, 628-629
- Index register, 443, 555
- Mode Control register, 575
-
Mode register
- color paging, 628-629
- 256-color modes, 629
- palette RAM registers, setting, 631-632
- Pel Panning register, 574
- registers, setting and reading, 583
- screen blanking demo program, 556-557
- Active edge table (AET), 744
- Adapters, display. See Display adapter cycle-eater.
-
ADD instruction
- and Carry flag, 147-148
- vs. INC, 147-148, 219
- vs. LEA, 130, 170-171
- AddDirtyRect function, 867-869
- Addition, using LEA, 130, 131
- AddObject function, 1001-1002
- AddPolygonEdges function, 1232-1233, 1238
- Addressable memory, protected mode, 221
-
Addressing modes
-
486 processor
- indexed addressing, 237-238
- 32-bit addressing modes, 256-258
- 386 processor, 130-133, 222
- VGA, internal indexing, 427-428
-
Addressing pipeline penalty
- See also Pipeline stalls.
- 486 processor, 238-240, 250
- Pentium processor, 400-403
-
AdvanceAET function
- complex polygons, 748-749
- monotone-vertical polygons, 769
- AET (active edge table), 744
-
AGIs (Address Generation Interlocks), 400-403
- See also Addressing pipeline penalty; Pipeline stalls.
- Algorithms In C (book), 192, 196
-
Alignment
-
Pentium processor
- non-alignment penalties, 376
- TCP/IP checksum program, 409
- REP STOS instruction, 735
- 386 processor, 218
-
286 processor
- code alignment, 215-218
- data alignment, 213-215
- stack pointer alignment, 218-219
- ALU and latch demo program, 453-457, 458-460
-
ALUs (Arithmetic Logic Units), VGA
- ALU and latch demo program, 453-457, 458-460
- logical functions, 458
- operational modes, 458
- overview, 451-452
- Ambient shading, 1023, 1025-1027
-
AND instruction, Pentium processor
- AGIs (Address Generation Interlocks), 401-402
- vs. TEST, 377
-
Animation
- See also Animation demo programs; Mode X; 3-D animation.
- apparent motion, 1064
- ball animation demo program, 431-441
- challenges in, 819-820
- on PCs, 795-796
- page flipping, flicker-free animation, 444-446
- speed, importance of, 1064
-
Animation demo programs
- Mode X animation, 924-925, 925-930
-
page flipping animation
- assembly code, 825-830
- C code, 820-825
- split screen and page flipping, 830-837
-
3-D polygon rotation
- matrix multiplication functions, 943-944, 948
- overview, 939
- performance, 949
- polygon filling with clipping support, 940-943
- transformation and projection, 944-945, 948
-
3-D solid cube rotation demo program
- basic implementation, 957-961, 962-963
- incremental transformations, 964-966
- object representation, 967
-
Animation techniques
-
bit-plane animation
- assembly implementation, 801-809, 810
- limitations, 811-813
- page flipping, 814
- palette registers, 799-801
- principles, 796-798
- shearing, 813
-
dirty-rectangle animation
- C implementation, 847-851, 863-869
- description, 844-845
- ordering rectangles, 873
- overlapping rectangles, 872-873
- vs. page flipping, 846, 862
- performance, 873
- system memory buffer size, 851
- writing to display memory, 856-857
- internal animation, 872
- masked images, 871-872
- Antialiasing, Wu’s algorithm, 776-779, 780-791, 791-792
- Apparent motion, in animation, 1064
- AppendRotationX function, 964, 975
- AppendRotationY function, 964-965, 975
- AppendRotationZ function, 965, 976
- Appropriate technology, 775-776
- Arithmetic flags. See Flags.
- Arrays, sorting, 180-181
- Aspect ratio, Mode X, 878
-
Assemblers
- MASM (Microsoft Assembler), 187
- optimizing assemblers, 71-72
- TASM (Turbo Assembler), 71-72
-
Assembly language optimization
- See also Clock cycles; Local optimization; Optimization.
- data, placing limitations on, 274
- instruction size vs. execution time, 90-92, 93
- multi-bit rotations, 23-24
- objectives, 28
- optimizing instructions, 23-24
- programmer’s responsibilities, 27-29
- rearranging instructions, 418-419
- reducing size of code, 416-418
- stack addressing, 420
- understanding data, importance of, 122
- Assembly language programmers, vs. compilers, 154-155
- Assembly language, transformation issues, 25-26
-
AT computer
- display adapter cycle-eater, 107
- 286 processor, data transfer rates, 212
- Attribute Controller, VGA. See AC (Attribute Controller), VGA.
- Automatic variables, 184-185
- AX register, setting to absolute value, 171
- B
- Backface culling. See Backface removal.
-
Backface removal
- See also Hidden surface removal; Visible surface determination.
- BSP tree rendering, 1160-1161
- calculations, 955-957
- motivation for, 954-955
- and sign of dot product, 1140
- solid cube rotation demo program, 957-961, 962-963, 964-966, 967
- Background surfaces, 1240
- BackRotateVector function, 1203
- Ball animation demo program, 431-441
- Barrel shifter, VGA, 463-464
-
Beam trees
- improvement, attempts at, 1187-1188
- overview, 1185
- performance, 1186
- potentially visible set (PVS), precalculating, 1188-1189
- Benchmarks, reliability of, 729
- Biased perceptions, and optimization, 1080, 1085
- Big endian format, 252
- BIOS. See EGA BIOS; VGA BIOS.
-
Bit mask
- bitmapped text demo program, 466-469, 470-471
- and latches, 470
- overview, 464-466
-
Bit Mask register
- bit mask, controlling, 465
- drawing solid text, 1040
- setting inside a loop, 429
- vs. write mode 3, 832, 844
- BitMan, 1039-1041, 1042-1044
- Bitmap organization, Mode X, 882-883
-
Bitmapped text
- demo program using bit mask, 466-469, 470-471
- reference material, 471
- Bitmapped text demo program, 466-469, 470-471
-
Bitmaps
- chunky, converting to planar, 504-505, 505-508
- relocating, 516-517
- transient color effects, 509
-
Bit-plane animation
- assembly implementation, 801-809, 810
- limitations, 811-813
- overview, 796
- page flipping, 814
- palette registers, 799-801
- principles, 796-798
- shearing, 813
- “Black box” approach, and future of programming, 725-726
- Blocks. See Restartable blocks.
- Borders (overscan), 555-556
- BOUND instruction, 221
-
Boundary pixels, polygons
- rules for selecting, 712
- texture mapping, 1049-1052, 1065-1066, 1067
- Bounding volumes, 1184
-
Boyer-Moore algorithm
- assembly implementations, 271-274, 274-277
- C language implementation, 269
- overview, 263-265
- performance, 266-268
- test-bed program, 270
- Branch prediction, Pentium processor, 377-378
-
Branching instructions
- See also Branch prediction.
-
286 and 386 processors
- non-word-alignment penalty, 216
- and prefetch queue cycle-eater, 210
- eliminating, 312-313
-
Pentium processor
- branches within loops, 378
- pairing in U-pipe, 405
- x86 family CPUs, performance, 140
-
Bresenham’s line-drawing algorithm
-
basic algorithm
- assembly implementation, 655-656, 671-677
- C language implementation, 661-665, 665-671
- description, 657-660
- strengths and weaknesses, 660-661
-
run-length slice algorithm
- assembly implementation, 698-704
- C-language implementations, 688-692, 692-693
- description, 683-684
- implementation details, 685-687
- integer-based implementation, 685-687
- potential optimizations, 705
- Bresenham’s run-length slice algorithm. See Run-length slice algorithm.
-
Bridges, John
- mode set routine, 360x480 256-color mode, 609, 612, 620-621
- 256-color modes, undocumented, 879
- Brute-force solutions, 193
-
BSP (Binary Space Partitioning) trees
- 2-D line representation, 1120
- 3-D rendering, 1162
-
beam trees
- improvement, attempts at, 1187-1188
- overview, 1185
- performance, 1186
- potentially visible set (PVS), precalculating, 1188-1189
-
BSP compiler
- BuildBSPTree function, 1125-1127
- SelectBSPTree function, 1124-1125
- BuildBSPTree function, 1125-1127
- building, 1101-1104
- BuildTree function, 1112
- data recursion vs. code recursion, 1108-1113
- description, 1098-1099, 1119
- and dynamic objects, 1100-1101
- edge sorting for hidden surface removal, 1220, 1226
- inorder traversal, 1107-1113
- leaves, storing polygons in, 1181
- multiple BSP trees, sorting, 1227
- optimizations, 1128-1129
- performance, 1100, 1111-1113
-
potentially visible set (PVS)
- precalculating, 1188-1189
- world, drawing, 1280-1281
- reference materials, 1114
-
rendering recursively
- backface removal, 1160-1161
- clipping, 1158-1159
- ClipWalls function, 1152-1155, 1158-1159
- DrawWallsBackToFront function, 1155-1156, 1160-1161
- overview, 1149
- reference materials, 1157
- TransformVertices function, 1151-1152, 1158
- UpdateViewPos function, 1151, 1157
- UpdateWorld function, 1156-1157, 1157
- viewspace, transformation of objects to, 1158
- wall orientation testing, 1160-1161
- WallFacingViewer function, 1150-1151, 1161
- SelectBSPTree function, 1124-1125
- splitting heuristic, 1128-1129
-
3-D engine, Quake
- overview, 1276-1277
- potentially visible set (PVS) management, 1278-1279
-
visible surface determination (VSD)
- beam trees, 1185-1189
- culling to frustum, 1181-1184
- overdraw problem, 1184-1185
- painter’s algorithm, 1099-1106
- polygon culling, 1181-1184
- PVS, precalculating, 1188-1189
- WalkBSPTree function, 1106
- WalkTree function, 1109-1110
-
BSP compiler
- BuildBSPTree function, 1125-1127
- overview, 1123
- SelectBSPTree function, 1124-1125
- BSP models, Quake 3-D engine, 1284
-
BSWAP instruction, 486 processor
- 32-bit registers, using as two 16-bit registers, 253-254
- rotating pixel bits, 252
- Bubble sort, 755
-
Buffer-filling routine, optimizations
- rearranging instructions, 418-419
- reducing size of code, 416-418
- stack addressing, 420
-
Buffers, internal
- in 16-bit checksum program, 15-16
- in search engine, 114-115
- BuildBSPTree function, 1125-1127
- BuildGET function, 768-769
- BuildGETStructure function, 747-748
- BuildMaps function, 353-355
- BuildTree function, 1112
-
Bus access
- 8088 processor, 81, 99-101
- Pentium processor, 377
- Byte registers, 486 processor, 242-245
- Byte-OUT instruction, 429
- Byte-per-pixel mode. See Mode X.
- C
-
C library functions
- getc() function, 12, 14
- memchr() function, 116
- memcmp() function, 116
- memcpy() function, 1147-1148
- memset() function, 727
- optimization, 15
- read() function, 12, 121
- strstr() function, 115
- Cache, internal. See Internal cache.
- Cache lines, Pentium processor, 374
- Calculations, redundant, and optimization, 682-683
- Calculus and Analytic Geometry (book), 1135
-
CALL instruction
- 486 processor, 241-242
- Pentium processor, 404
-
Carmack, John
- and id Software, 1118
- overdraw, 1184-1186
- subdivision rasterization, 1266-1267, 1267-1270
-
Carry flag
- DEC instruction, 148
- INC vs. ADD instructions, 147-148
- LOOP instruction, 148
- rotating bits through, 185
- in word count program (David Stafford), 317-319
- Cats, shipping via air freight, 697-698
- Cellmap class, 325-329, 333-335, 341-345
- Cellmap wrapping, Game of Life, 331-332, 333-335, 336, 337-338
- Cell_state method, 327, 334, 344
-
CGA (Color/Graphics Adapter)
- display adapter cycle-eater, 104
- VGA compatibility with, 430
-
Challenges
-
Game of Life
- rules, 346, 350
- 3-cell-per-word implementation (David Stafford), 351-352, 353-363, 363-365
- ScanBuffer routine, 305, 307-319
- Change list, in Game of Life, 363-366
- Chaplin, Michael, 776
- Character/attribute map, VGA mode 3, 517
- Chartreuse moose story, 399
- Checksum programs. See 16-bit checksum program; TCP/IP checksum program.
- Chunky bitmap conversion demo program, 505-508
- Chunky bitmaps, converting to planar, 504-505, 505-508
- Circular linked lists, 288-292
- Clear_cell method, 327, 334, 343
- ClearEdgeLists function, 1236-1237
- Clements, Willem, 313-315
- Client-server architecture, and QuakeWorld, 1291
-
Clipping
- See also Hidden surface removal (HSR); Visible surface determination (VSD).
- arithmetic imprecision, handling, 1240
- in BSP tree rendering, 1158-1159
- line segments, clipping to planes, 1195-1197
- masked copying, Mode X, 923
- overview, 1195
-
polygon clipping
- BackRotateVector function, 1203
- clipping to frustum, 1200, 1201-1206, 1206-1207
- ClipToFrustum function, 1204
- ClipToPlane function, 1199
- optimization, 1207
- overview, 1197-1200
- PolyFacesViewer function, 1203
- ProjectPolygon function, 1201
- SetUpFrustum function, 1204
- SetWorldspace function, 1204
- TransformPoint function, 1203
- TransformPolygon function, 1203
- UpdateViewPos function, 1202
- UpdateWorld function, 1205
- viewspace clipping, 1207
- ZSortObjects function, 1201
- ClipToFrustum function, 1204
- ClipToPlane function, 1199
-
Clock cycles
- See also Cycle-eaters.
- address calculation pipeline, 238-240
- branch prediction, 377-378
- byte registers and lost cycles, 242-245
- cross product floating point optimization, 1171, 1172
- and data alignment, 213-215
- data transfer rates, 81, 82
- dot product floating point optimization, 1170
- dual-pipe execution, 405
-
effective address calculations
- 286 and 386 processors, 223-225
- Pentium processor, 375-376
-
8088 processor
- data transfer rates, 81, 82
- memory access, 82, 83-85
- floating point instructions, 1167-1170
-
486 processor
- address calculation pipeline, 238-240, 250
- byte registers and lost cycles, 242-245
- indexed addressing, 237-238
- stack addressing, 241-242
- 32-bit addressing modes, 256-258
- FXCH instruction, 1170
- indexed addressing, 237-238
- instruction execution times, 86-93
- lockstep execution, 390-394, 400-403
- matrix transformation optimization, 1173
- memory access, 82, 83-85
- non-alignment penalties, 376
- non-word-alignment penalty, 217
- 1/z value of planes, calculating, 1221
- OUT instructions, 843, 1082-1083
-
Pentium processor
- branch prediction, 377-378
- cross product floating point optimization, 1171, 1172
- dot product floating point optimization, 1170
- effective address calculations, 375-376
- floating point instructions, 1167-1168
- FXCH instruction, 1170
- initial pipe, effect of, 405
- lockstep execution, 390-394, 400-403
- matrix transformation optimization, 1173
- non-alignment penalties, 376
- pipelining, 1168-1170
- prefix bytes, 376, 395, 407
- prefix bytes, 376, 395, 407
- vs. program size, 28
- projection, floating point optimization, 1174
- stack addressing, 241-242
- string instructions, 82
- system wait states, 211
- 32-bit addressing modes, 256-258
- 386 processor, effective address calculation, 223-225
-
286 processor
- effective address calculation, 223-225
- system wait states, 211
-
CMP instruction
- operands, order of, 306
- vs. SCASW, 161
- CMPXCHG8B instruction, Pentium processor, 378
-
Code alignment
- 386 processor, 218
- 286 processor, 215-218
- Code generator, for Game of Life (David Stafford), 351-352, 353-363, 363-365
-
Code recursion
- vs. data recursion, 1108-1110
- Euclid’s algorithm, 198-199
- Collision detection demo program, 531-534
-
Color
- adapter-dependent mapping, 1036
- color perception research, 1035
- reflective vs. emissive, 1035
- Color Compare register, 531
-
Color cycling
- bit-by-bit loading of DAC, 650-651
- demo program, 643, 644-648, 648-649
- interleaved loading of DAC, 649-650
- loading DAC, 640-643
- overview, 639-640
- using page flipping, 650
- using subset of DAC, 649
- Color cycling demo program, 643, 644-648, 648-649
- Color Don’t Care register, 534
- Color Don’t Care register demo program, 535-537, 535
- Color mapping demo program, EGA, 551-555
- Color models. See RGB (red, green, blue) color model.
- Color paging, 628-629
-
Color path, VGA
- color paging, 628-629
- DAC (Digital/Analog Converter), 626-628
- palette RAM, 626
- Color planes. See Planes, VGA.
- Color Select register, 628-629
-
Color selection
-
EGA
- overscan, 555-556
- palette registers, 548-551, 551-555
- screen blanking, 556-557
- VGA, 557
- ColorBarsUp subroutine, 604
- Color-forcing demo program, 474-476
- Color-patterned lines demo program, 509-515
- Compiled DLLs, Quake 2, 1293
-
Compiler-based optimization
- cautions for use of, 9
- data recursion vs. code recursion, 1112-1113
- in FindIDAverage function, 159
-
Compilers
- vs. assembly language programmers, 154-155
- avoiding thinking like, 152, 154-155
- bitblt compiler for Game of Life (David Stafford), 351-352, 353-363, 363-365
- handling of segments, 154
-
Complex polygons
- defined, 710, 742
- edges, keeping track of, 742-744, 753, 755, 756
- polygon-filling programs, 745-752, 754
- Computational Geometry, An Introduction (book), 759-760
- Computer Graphics: Principles and Practice (book), 660, 934, 1121
- Computer Graphics (book), 1135, 1157
-
ConcatXforms function
- assembly implementation, 997-999, 1019-1022
- C-language implementation, 944, 976
- CONSTANT_TO_INDEXED_REGISTER macro, 594
-
Coordinate systems
- left-handed, 1140
- right-handed, 935-937
- Copy_cells method, 327, 333
- CopyDirtyRectangles function, 850
- CopyDirtyRectangleToScreen function, 866-867
-
Copying
- bytes between registers, 172
- pixels, using latches (Mode X), 905-907, 908,
- 871
- CopyScreenToScreenMaskedX subroutine, 918, 919-921
- CopyScreenToScreenX subroutine, 905-907, 908
- CopySystemToScreenMaskedX subroutine, 916-918
- CopySystemToScreenX subroutine, 908, 909-911
- CosSin subroutine, 994-996, 999, 1013-1015
- Count_neighbors method, 334-335
- CPU reads from VGA memory, 526
- CPUID instruction, Pentium processor, 378
- CreateAlignedMaskedImage function, 922-923
-
Cross products
- calculating, 955-956, 1139-1140
- floating point optimization, 1171, 1172
- CRT Controller, VGA. See CRTC (CRT Controller), VGA.
-
CRTC (CRT Controller), VGA
- addressing, 427-428
- Line Compare register, 565
- Overflow register, 565
- shearing, 813-814
- start address registers, setting, 583
-
Cycle-eaters
-
286 and 386 processors
- data alignment cycle-eater,
- display adapter cycle-eater, 219-221
- DRAM refresh cycle-eater, 219
- overview, 209-210
- prefetch queue cycle-eater, 211-212
- system wait states, 210-212
-
data alignment cycle-eater
- 386 processor, 218
- 286 processor, 213-215
-
display adapter cycle-eater
- 286 and 386 processors, 219-221
- 8088 processor, 101-108
-
DRAM refresh cycle-eater
- 286 and 386 processors, 219
- 8088 processor, 95-99, 108
- 8-bit bus cycle-eater, 79-85, 108
-
8088 processor
- display adapter cycle-eater, 101-108
- DRAM refresh cycle-eater, 95-99, 108
- 8-bit bus cycle-eater, 79-85, 108
- prefetch queue cycle-eater, 86-94, 108
- wait states, 99-101
-
overview
- 286 and 386 processors, 209-210
- 8088 processor, 78-79, 80
-
prefetch queue cycle-eater
- 286 and 386 processors, 211-212
- 8088 processor, 86-94, 108
- system wait states, 210-212
- wait states, 99-101
- Cycles. See Clock cycles; Cycle-eaters.
- D
-
DAC (Digital/Analog Converter)
-
color cycling
- bit-by-bit loading, 650-651
- color cycling demo program, 643, 644-648, 648-649
- interleaved loading, 649-650
- problems, 640-643
- using subset of, 649
- Data register, 642-643
- index wrapping, 651
-
loading
- bit-by-bit loading, 650-651
- directly, 642-643
- interleaved loading, 649-650
- via VGA BIOS, 641-642, 648
- and Write Index register, 642-643, 651
- Mask register, blanking screen, 651
- Read Index register, 651-652
- reading, 651-652
- setting registers, 630, 631-632
- in VGA color path, 626-628
-
Write Index register
- DAC index wrapping, 651
- loading DAC, 642-643
- DAC registers demo program, 632-635
-
Data alignment cycle-eater
- 386 processor, 218
- 286 processor, 213-215
-
Data bus, 8-bit
- See also 8-bit bus cycle-eater.
- Data manipulation instructions, and flags, 147
-
Data recursion
- vs. code recursion, 1108
- Euclid’s algorithm, 200
- inorder tree traversal, 1108, 1109-1110, 1110
- Data register, loading DAC, 642-643
-
Data Rotate register
- barrel shifter, controlling, 463
- vs. CPU-based rotations, 489
- effect on ALUs, 452
-
Data rotation, VGA
- barrel shifter, 463-464
- bit mask, 464-471
- CPU vs. Data Rotate register, 489
-
Data transfer rates
- display adapters, 220
- 8088 processor vs. 8086 processor, 81, 82
- 286 processor, 212
-
DDA (digital differential analyzer) texture mapping
- assembly implementation, 1069-1073, 1074
- C implementation, 1053-1058
- disadvantages, 1052-1053, 1059
- DrawTexturedPolygon, 1055-1056
- hardware dependence, 1053
- multiple adjacent polygons, 1068
- optimized implementation, 1069-1073, 1074
- orientation independence, 1065-1067, 1067
- performance, 1074
- ScanOutLine function, 1058-1059, 1067, 1069-1073, 1074
- SetUpEdge function, 1057-1058
- StepEdge function, 1056-1057
- techniques, 1048-1051
- DDJ Essential Books on Graphics Programming (CD), 1157
-
DEC instruction
- and Carry flag, 148
- memory accesses, 83
- vs. SUB, 219
- DEC/JNZ sequence, 139
-
Delay sequences
- loading palette RAM or DAC registers, 632
- VGA programming, 558
- DeleteNodeAfter function, 284
- Depth sorting of nonconvex objects, 1000, 1001-1002
- Diffuse shading, 1023-1025, 1025-1027
- Digital differential analyzer. See DDA (digital differential analyzer).
- Direct far jumps, 186
- Direct memory access. See DMA.
- Directed lighting, and shading, 1023, 1028
-
Directives
- EVEN, 214
- NOSMART, 72
-
Dirty-rectangle animation
- demo program, C implementation, 847-851, 863-869
- description, 844-845
- ordering rectangles, 873
- overlapping rectangles, 872-873
- vs. page flipping, 846, 862
- performance, 873
- system memory buffer size, 851
- writing to display memory, 856-857
- Disk caches, 19
-
Display adapter cycle-eater
- 286 and 386 processors, 219-221
- data transfer rates, 220
-
8088 processor
- graphics routines, impact on, 106
- optimizing for, 107
- overview, 101-104
- performance, impact on, 104
- read/write/modify operations, 107
- wait states, 99-101
-
Display memory
- See also Bit mask; Displaymemory access.
-
Mode X
- copying between memory locations, 905-907, 908
- copying from system memory, 908, 909-911
- masked copy from system memory, 916-918, 916
- masked copying between locations, 918-919, 919-921
- memory allocation, 903-904
- running code from, 104
- start address, changing, 857
-
VGA
- access times, 842-844
- 360x480 256-color mode, 621-622
- 320 x 400 256-color mode, 591-593, 605
-
Display memory access
- See also Display memory; Memory access.
- display adapter cycle-eater, 101-103, 105, 107
- and string instructions, 107
- VGA access times, 842-844
- wait states, 101-103, 220, 733
- Display memory planes. See Planes, VGA.
- DIV instruction, 32-bit division, 181-184, 1008
- Divide By Zero interrupt, 181
- Divide-by-N timer mode, 45
- Division, 32-bit, 181-184, 1008
- DMA (direct memory access), and DRAM refresh, 95
- “Don’t care” planes, 535
-
DOS function calls
- overhead, 9
- and restartable blocks, 123
-
Dot products
- calculating, 1135-1137
- calculating light intensity, 1137
- floating point optimization, 1170, 1171
- line segments, clipping to planes, 1196-1197
- projection, 1141-1142
- rotation, 1143-1144
- sign of, 1140-1141
- of unit vectors, 1136
- of vectors, 1135-1136
- Double-DDA texture mapping. See DDA (digital differential analyzer) texture mapping.
- D_PolysetRecursiveTriangle function, 1267-1270
- Dr. Dobbs Journal, 1190
-
DRAM (dynamic RAM) refresh cycle-eater
- 286 and 386 processors, 219
-
8088 processor
- impact on performance, 97-98
- optimizing for, 98-99
- overview, 95-97
- vs. wait states, 100
- and 8253 timer chip, 95
- and Zen timer, 99
- Draw360x480Dot subroutine, 613-614
- DrawBackground function, 928
- Draw-buffers, and beam trees, 1187
- DrawBumperList function, 823
- DrawEntities function, 849, 866
- DrawGridCross subroutine, 808
- DrawGridVert subroutine, 808-809
-
DrawHorizontalLineList function
- monotone-vertical polygons, filling, 765
-
non-overlapping convex polygon
- assembly implementation, 734
- C implementation, 717, 720-721
- using memset() function, 727, 729
- DrawHorizontalLineList subroutine, 941-943
-
DrawHorizontalLineSeg function
- assembly implementation, 754
- C implementation, 750-751
- DrawHorizontalRun function, 692
- DrawImage subroutine, 828
-
Drawing
- See also Line-drawing algorithms; Lines; 3-D drawing.
- fill patterns, using latches, 453
-
pixel drawing
- EVGADot function, 661-662, 669-670
- optimization, 1074, 1086
- painter’s algorithm and overdraw problem, 1184
- single-color drawing with write mode 3, 831-832
- speeding up, 727-729
-
text
- bitmapped text using bit mask, 466-469, 470-471
- bitmapped text using write mode 3, 484-489, 489-490, 490-496
- solid text using latches, 1039-1041, 1042-1044
- using write mode 0, 832-833
- DrawLine function, 785
- DrawMasked subroutine, 870
- DrawObject subroutine, 809-810
- Draw_pixel function, 328, 330
- DrawPObject function, 978-979, 1025-1027
- DrawRect subroutine, 826-827
- DrawSpans function, 1236
- DrawSplitScreen function, 824
- DrawTextString subroutine, 1043-1044
- DrawTexturedPolygon function, 1055-1056
- DrawVerticalRun function, 692
- DrawVisibleFaces function, 961
-
DrawWuLine function
- assembly implementation, 787-791
- C implementation, 780-781
- Duntemann, Jeff, 127-128
-
Dynamic lighting
- in GLQuake, 1289-1290
- in Quake 3-D engine, 1282-1283
- Dynamic objects, and BSP trees, 1100-1101
- Dynamic palette adjustment, 1039
- Dynamic RAM. See DRAM (dynamic RAM) refresh.
- E
-
EA (effective address) calculations
- 286 and 386 processors, 223-225
- 8088 processor, 129
-
486 processor
- address calculation pipeline, 238-240
- stack addressing, 241-242
- Pentium processor, 375-376
- 320x400 256-color mode, 599-600
- EBP register, 257
-
Edge tracing
- overview, 711-713
-
ScanEdge function
- assembly implementation, 735-738, 735
- floating-point C implementation, 716-717
- integer-based C implementation, 730-732
- Edge triggered devices, 316
- Edges vs. spans, sorted span hidden surface removal, 1215-1220
- EGA BIOS, video function 10H, 550-551, 555
-
EGA (Enhanced Graphics Adapter)
- color mapping, 548-551, 551-555
- and display adapter cycle-eater, 104-108
- mode 10H, 515-517, 518-521
- palette registers, 549-550
- registers, and high-level languages, 548
- screens, capturing and restoring, 541-542, 543-547, 547-548
-
split screens
- EGA bug, 573-574
- horizontal panning, 574-575, 575-582, 583
- overview, 563-565
- registers, setting, 573
- safety of, 585
- split screen demo program, 565, 566-572, 572
- text mode, 584
- turning on and off, 565
-
8-bit bus cycle-eater
- 286 and 386 processors, 210
-
8088 processor
- effects on performance, 82
- optimizing for, 83-85
- overview, 79-82
- and registers, 85
- 8086 processor vs. 8088 processor, 79-81
-
8088 processor
- CMP instruction, 161, 306
-
cycle-eaters
- 8-bit bus cycle-eater, 79-85
- display adapter cycle-eater, 101-108
- DRAM refresh cycle-eater, 95-99
- overview, 78-79, 80
- prefetch queue cycle-eater, 86-94
- wait states, 99-101
- display memory access, 220
- vs. 8086 processor, 79-81
- effective address calculation options, 129
- LAHF and SAHF instructions, 148
- LEA vs. ADD, 130
- LODSB instruction, 304
- lookup tables, vs. rotating or shifting, 145-146
- LOOP instruction vs. DEC/JNZ sequence, 139
- memory variables, size of, 83-85
- stack-based variables, placement of, 184-184
-
8253 timer chip
- and DRAM refresh, 95
- reference material, 72
- resetting, 43
-
system clock inaccuracies
- long-period Zen timer, 53, 54
- Zen timer, 43, 45-46, 48
-
timer 0
- operation, 44
- stopping, 54, 65
- timer modes, 44, 45
- timer operation, 43-45
- undocumented features, 54, 65
- Emissive color, vs. reflective color, 1035
-
Enable Set/Reset register
- setting drawing color, 666
- specifying plane, 474
- EnableSplitScreen function, 824
-
ENTER instruction
- 486 processor, 241-242
- Pentium processor, 377
- 286 processor, 221
- Enter_display_mode function, 328, 362
-
Entities, Quake 3-D engine
- BSP models, 1284
- particles, 1287
- polygon models, 1285-1286
- sprites, 1287
- subdivision rasterization, 1286
- z-buffering, 1285-1286
- EraseEntities function, 850, 867
- Error accumulation, Wu antialiasing algorithm, 778-779, 792
-
EU (Execution Unit)
-
286 and 386 processors
- instruction execution times, 223-225
- and prefetch queue, 210
-
8088 processor
- 8-bit bus cycle-eater, 80
- prefetch queue cycle-eater, 86
- wait states, 101
-
Euclid’s algorithm
- algorithm, 197
- optimized assembly implementation, 200-202
- recursive implementations, 198, 200
- EVEN directive, 214
- EVGADot function, 661-662, 669-670
-
EVGALine function
-
Bresenham’s algorithm
- assembly implementation, 671, 675-677
- C-language implementation, 664-665, 665-668, 670-671
- 360x480 256-color mode line drawing program, 616-617
- Execution times. See Clock cycles; Instruction execution time.
- Exit_display_mode function, 328, 329, 362
- F
- FADD instruction, Pentium processor, 1167-1170
- Far jumps, to absolute addresses, 186-187
- FDIV instruction, Pentium processor, 1167-1170
-
Fetch time
- See also Instruction fetching.
- 286 and 386 processors, 210, 211
- 8088 processor, 86-93
-
Files
-
reading from
- getc() function, 12, 14
- read() function, 12
- restartable blocks, 16
- text, searching for. See Search engine.
- Fill patterns, drawing using latches, 453
- FillConvexPolygon function, 714-716, 720-721
- FillMonotoneVerticalPolygon function, 763-764
- FillPatternX subroutine, 899, 900-903, 903-904
-
FillPolygon function
- complex polygons, 746
- monotone-vertical polygons, 767
- FillRect subroutine, 869-870
-
FillRectangleX subroutine
- four-plane parallel processing, 888-891, 891-893
- pixel-by-pixel plane selection, 885-887
- plane-by-plane processing, 887-889
-
FindIDAverage function
-
assembly implementations
- based on compiler optimization, 160
- data structure reorganization, 163, 165-166
- unrolled loop, 161, 162
- C language implementation, 158
- compiler optimization, 159
- FindNodeBeforeValue function, 289
- FindNodeBeforeValueNotLess function, 286, 287
-
FindString function
- Boyer-Moore algorithm, 269, 271-274, 274-277
- overview, 175
- scan-on-first-character approach, 176
- scan-on-specified-character approach, 178
- FirstPass function, 355-358
- Fix function, 358, 365
- FixedDiv subroutine, 982, 993, 1010-1012
- FIXED_MUL macro, 1016-1017
- FixedMul subroutine, 981, 993-994, 1009-1010
-
Fixed-point arithmetic
- vs. floating point, 985, 1206
- vs. integer arithmetic, 730, 1065
- 32-bit fixed-point arithmetic, 1086-1089, 1090-1091, 1092-1093
-
Flags
- and BSWAP instruction, 254
- Carry flag, 147-148, 185, 317-319
- INC vs. ADD, 147-148
- and LOOP instruction, 148
- and NOT instruction, 146-147
- FLD instruction, Pentium processor, 1167-1170
-
Floating point optimization
- clock cycles, core instructions, 1167-1168
- cross product optimization, 1171, 1172
- dot product optimization, 1170, 1171
- FXCH instruction, 1169-1170
- interleaved instructions, 1169-1170
- matrix transformation optimization, 1172-1173, 1173-1174
- overview, 1167-1170
- pipelining, 1168-1170
- projection to screen space, 1174
- rounding control, 1174-1175
-
Floating-point calculations
- vs. fixed-point calculations, 985, 1206
- vs. integer calculations, 730
-
FMUL instruction
- 486 processor, 236
- Pentium processor, 1167-1170
-
486 processor
- AX register, setting to absolute value, 172
- byte registers and lost cycles, 242-245
-
CMP instruction
- operands, order of, 306
- vs. SCASW, 161
- copying bytes between registers, 172
- and display adapter cycle-eater, 107
- indexed addressing, 237-238
-
internal cache
- effect on code timing, 246
- optimization, 236
- LAHF and SAHF instructions, 148
- LEA instruction, vs. ADD, 131
- LODSB instruction, 304
- LODSD instruction, vs. MOV/LEA sequence, 171
- lookup tables, vs. rotating or shifting, 145-146
- LOOP instruction, vs. DEC/JNZ sequence, 139
- MOV instruction, vs. XCHG, 377
- n-bit vs. 1-bit shift and rotate instructions, 255-256
- Pentium code, running on, 411
-
pipelining
- address calculation, 238-240, 250
- stack addressing, 241-242
- rotation instructions, clock cycles, 185-186
- stack-based variables, 184-184
- 32-bit addressing modes, 256-258
- timing code, 245-246
- using 32-bit register as two 16-bit registers, 253-254
- XCHG instruction, vs. MOV, 377, 832
-
FPU, Pentium processor
- clock cycles, core instructions, 1167-1168
- cross product optimization, 1171, 1172
- dot product optimization, 1170, 1171
- FXCH instruction, 1169-1170
- interleaved instructions, 1169-1170
- matrix transformation optimization, 1172-1173, 1173-1174
- overview, 1167-1170
- pipelining, 1168-1170
- projection to screen space, 1174
- rounding control, 1174-1175
- Frustum, clipping to, 1200, 1201-1206, 1206-1207
- FST instruction, Pentium processor, 1167-1170
- FSUB instruction, Pentium processor, 1167-1170
- Function 13H, VGA BIOS, 459
- Function calls, performance, 153
- Fundamentals of Interactive Computer Graphics (book), 660
- FXCH instruction, Pentium processor, 1169-1170
- G
-
Game of Life
- abstraction and performance, 330-332, 345-346
- byte-per-cell implementation, 339-340, 341-345
-
C++ implementation
- basic, 324, 325-328
- optimized, 336, 337-338
- cellmap-wrapped implementation, 331-332, 333-335, 336, 337-338
-
challenge to readers
- rules, 346, 350
- 3-cell-per-word implementation (David Stafford), 351-352, 353-363, 363-365
- change list, 363-366
- performance analysis, 329-330, 332, 338, 340, 350
- re-examining problem, 338-339, 363
- rules, 324
-
3-cell-per-word implementation
- discussion, 363-365
- listing, 352-363
- overview, 351-352
-
GC (Graphics Controller), VGA
- addressing, 427-428
-
architecture
- ALUs, 451-452
- barrel shifter, 463-464
- bit mask, 464-471
- latches, 452-453
- set/reset circuitry, 471-479
-
Bit Mask register
- bit mask, controlling, 465
- drawing solid text, 1040
- setting inside a loop, 429
- vs. write mode 3, 832, 844
- Color Compare register, 531
-
Data Rotate register
- barrel shifter, controlling, 463
- vs. CPU-based rotations, 489
- effect on ALUs, 452
-
Enable Set/Reset register
- setting drawing color, 666
- specifying plane, 474
-
Graphics Mode register
- read mode 0, selecting, 525
- read mode 1, selecting, 531
-
Read Map register
- plane, selecting, for CPU reads, 526
- planes, specifying to be read, 542
- Set/Reset register, 666
-
Gcd() function
- brute-force approach, 195
-
Euclid’s algorithm
- code recursive approach, 198
- data recursion approach, 200
- subtraction approach, 196
-
GCD (Greatest Common Denominator) problem
- brute-force approach, 193-196
- Euclid’s algorithm, 197-200
- subtraction approach, 196-197
- Gcd_recurs() function, 199
- Generality, vs. performance, 335
- Gerrold, David, 298
- GET (global edge table), 744
-
Getc() function
- overhead, 14
- vs. read() function, 12
- GetNextKey subroutine, 598, 605
- GetUpAndDown function, 355
- Global edge table (GET), 744
- GLQuake, 1288-1290
-
Gouraud shading
- overview, 1246-1247
- perspective correction, 1248-1250
- problems with, 1247-1250
- Graphics cards, and surface caching, 1261-1262
- Graphics Controller, VGA. See GC (Graphics Controller), VGA.
-
Graphics Mode register
- read mode 0, selecting, 525
- read mode 1, selecting, 531
- Graphics screen capture demo program, 543-545
- Graphics screen restore demo program, 545-547
- Graphics-to-text demo program, 518-521
- Great Buffalo Sauna Fiasco, 137-138
- GUIs, and future of programming profession, 725-726
- H
- Hardware dependence, DDA (digital differential analyzer) texture mapping, 1053
-
Hecker, Chris
- texture mapping insight, 1083
- underlying functionality of different approaches, 1189
- Heinlein, Robert A., 1079-1080
- Herbert, Frank, 1193
- HGC (Hercules Graphics Card), 104
-
Hidden surface removal (HSR)
- backface removal, 954-957
- depth sorting, 1000, 1001-1002
-
sorted spans approach
- abutting span sorting, 1229-1230
- AddPolygonEdges function, 1232-1233, 1238
- BSP order vs. 1/z order, 1220, 1226
- ClearEdgeLists function, 1236-1237
- DrawSpans function, 1236
- edge sorting, 1220-1222
- edges vs. spans, 1215-1220
- independent span sorting, 1230, 1231-1238, 1239-1241
- intersecting span sorting, 1228-1229
- 1/z sorting, 1220-1222, 1227-1231, 1231-1238, 1239-1241
- overview, 1214-1215
- PolyFacesViewer function, 1232
- rotation instructions, clock cycles, 185-186
- ScanEdges function, 1234-1236, 1238-1239
- UpdateWorld function, 1237-1238
- High school graduates in Hawaii, 991-992
- Horizontal Pel Panning register, 442
- Horizontal resolution, 360x480 256-color mode, 620
- Horizontal smooth panning. See Panning.
- I
- id Software, 1118, 1190
- Ideas, selling, 1193-1194
- Illowsky, Dan, 187, 315
- Image precedence. See Bit-plane animation.
-
IMUL instruction
- 486 processor, 236
- on 386 processor, 173-174
-
INC instruction
- vs. ADD, 147-148, 219
- and Carry flag, 147-148
- Incremental transformations of 3-D objects, 964
-
Independent span sorting
- AddPolygonEdges function, 1232-1233, 1238
- ClearEdgeLists function, 1236-1237
- DrawSpans function, 1236
- overview, 1230
- PolyFacesViewer function, 1232
- ScanEdges function, 1234-1236, 1238-1239
- texture mapping, 1238
- UpdateWorld function, 1237-1238
-
Index registers, VGA
- AC Index register, 443
- overview, 427-428
- Indexed addressing, 237-238
- Indirect far jumps, 186
- Information, sharing, 1190, 1194
- InitCellmap function, 361
- InitializeCubes function, 980-981
- InitializeFixedPoint function, 977
- InitializeObjectList function, 1001
- InitializePalette function, 1037
- InitLinkedList function, 289
-
Inorder tree traversal
- code recursion vs. data recursion, 1107-1108
- data recursive implementation, 1108, 1109-1110, 1110
- performance, 1111-1113
- INS instruction, 221
- InsertNodeSorted assembly routine, 290
- InsertNodeSorted function, 289
-
Instruction execution times
- See also Clock cycles; Zen timer.
- DRAM refresh cycle-eater, 97, 99
- 8-bit bus cycle-eater, 82-85
- estimating, 93
- and instruction fetching, 225
- vs. instruction size, 90-92, 93, 211
- memory-addressing vs. register-only instructions, 223-225
- prefetch queue cycle-eater, 86-93
-
Instruction fetching
- See also Prefetch queue cycle-eater.
- code alignment, 215-218
- 8088 processor, 86-93
- and instruction execution times, 225
- Pentium processor, 374
- and system wait states, 211
- 286 processor, 215-218
- and wait states, 101
- Instruction size, 32-bit addressing modes, 257
-
Instructions, assembly language
- optimizing, 23-24
-
Pentium processor
- pairable instructions, 388, 390-394
- V-pipe-capable instructions, 386-387
- size vs. execution time, 90-92, 93
- Integer calculations, vs. fixed-point, 730, 1065
- Integers, sorting, 180-181
- Interleaved color cycling, 649-650
-
Interleaved operations, Pentium processor
- FXCH instruction and floating point operations, 1169-1170
- matrix transformation, 1172-1173, 1173-1174
- overview, 394-395
- TCP/IP checksum program, 408
- Internal animation, 872
-
Internal buffering
- See also Restartable blocks.
- in 16-bit checksum program, 15-16
- in search engine, 114-115
-
Internal cache
-
486 processor
- effect on optimization, 236
- timing code, 246
-
Pentium processor
- instruction fetching, 374
- organization, 374-375
- paired instructions, 391, 396
- Internal indexing, VGA, 427-429
-
Internet support
- Quake 2, 1293
- QuakeWorld, 1291
-
Interrupts
- DAC, loading, 643, 648
- Divide By Zero interrupt, 181
- and IRET instruction, 227
- and long-period Zen timer, 53, 66
- and page flipping, 446
- and POPF instruction, 226
- and Zen timer, 43, 45-46
- Intersecting lines, 1121-1123
- Intersecting span sorting, 1228-1229
- Intuitive leaps, 1098
- IRET instruction, vs. POPF instruction, 226-231
- IRQ0 interrupts, and Zen timer, 45
- IS_VGA equate, 572, 575
- J
- Jet Propulsion Lab, color perception research, 1035
- JMP $+2 instructions, 558, 632
- JMP DWORD PTR instruction, 186-187
- Jumps, to absolute addresses, 186-187
- K
- Kennedy, John, 171-172
-
Kent, Jim
- dynamic palette adjustment, 1039
- monotone-vertical polygons, filling, 760-761
-
Kissing, learning to,
- 281-282
- Kitchen floor story, 261-262
- Klerings, Peter, 350
- Knuth, Donald, 323
- L
- LAHF instruction, 148
-
Large code model
- linking Zen timer, 71
- optimizing assemblers, 71-72
-
Latches
- and bit mask, 470
- and Color Don’t Care register, 535-537, 535
- and CPU reads, 530
- drawing solid text, 1039-1041, 1042-1044
-
Mode X
- copying pixels, 905-907, 908, 909-911
- loading, with double copying process, 903
- masked copying, 918-919, 919-921, 922-923
- pattern fills, 899, 900-903, 903-904
- overview, 452-453, 897-898
- Latency, in QuakeWorld, 1291-1292
-
LEA instruction
- vs. ADD, 130, 170-171
- multiplication operations, 132-133, 172, 375-376
-
32-bit registers
- addition, 131
- multiplication, 132-133
-
LEAVE instruction
- 486 processor, 241-242
- Pentium processor, 377
- 286 processor, 221
- Level performance, 1213-1214
- Life, Game of. See Game of Life.
-
Lighting
- See also Shading.
-
Gouraud shading
- overview, 1246-1247
- perspective correction, 1248-1250
- problems with, 1247-1250
- intensity, calculating, 1137
- overlapping lights, 1247
- perspective correctness, 1248-1250
- in Quake 3-D engine, 1282-1283
- rotational variance, 1249
-
surface-based lighting
- description, 1250-1251
- mipmapping, 1254-1255
- performance, 1251-1253
- surface caching, 1253-1256, 1260-1262
- two-pass approach, 1262
- viewing variance, 1249
- Limits, transcending, in creative design, 1179-1180
- Lindley, Bill, 854-855
- LINE1 macro, 672-674
- LINE2 macro, 674-675
- Line Compare register, 565
-
Line segments
- clipping to planes, 1195-1197
- representation, 1195, 1196
- Linear addressing, VGA, 430
- Linear-time sorting, 1099
-
LineDraw function
- assembly implementation, 699-704, 704-706
- C-language implementation, 688-691
-
Line-drawing algorithms
- accumulated pixels approach (Jim Mackraz), 678
-
Bresenham’s algorithms
- basic line-drawing algorithm, 655-661, 661-665, 665-671, 671-677
- run-length slice algorithm, 683-693, 698-704, 705
- characteristics of, 656-657
- run-length slice algorithm, 683-693, 698-704, 705
- Wu antialiasing algorithm, 776-779, 780-791, 791-792
- Line-drawing demo program, 615-618, 618-619
- LineIntersectPlane function, 1142-1143
-
Lines
-
drawing
- See also Line-drawing algorithms.
- color-patterned lines demo program, 509-515
- 320See also Restartable blocks.400 256-color mode, 600
- write mode 2, 509
- intersecting, 1121-1123
-
parametric lines
- clipping, 1121-1123
- overview, 1119-1120
-
Linked lists
- basic implementation, 283-285
- circular lists, 288-292
- dummy nodes, 285-287
- head pointers, 284, 285
- InsertNodeSorted assembly routine, 290
- overview, 282
- sentinels, 285-287
- sorting techniques, 755
- tail nodes, 286
- test-bed program, 291
- Little endian format, 252
-
Local optimization
- See also Assembly language optimization; Optimization.
- bit flipping and flags, 146-147
- defined, 140
- incrementing and decrementing, 147-148
- lookup tables, 145-146
- unrolling loops, 143-145, 305, 312, 377-378, 410
- LOCK instruction, 377
- Lockstep execution, Pentium processor, 390-394, 400-403
- LODSB instruction, 304, 312
- LODSD instruction, 171
- LODSW instruction, 312
- Logical functions, ALU, 458
- Logical height, virtual screen, 442
- Logical width, virtual screen, 442
-
Long-period Zen timer
- See also Zen timer.
- calling from C code, 69-72
- and interrupts, 53
- LZTEST.ASM listing, 66-67
- LZTIME.BAT listing, 67-68
- LZTIMER.ASM listing, 55-65
- overview, 53
- PS2 equate, 65-66
- system clock inaccuracies, 43, 45-46, 48
- test-bed program, 66-69
- TESTCODE listing, 69
- ZTimerOff subroutine, 59-63
- ZTimerOn subroutine, 58-59
- ZTimerReport subroutine, 63-65
-
Lookup tables
- CosSin subroutine, 994-996, 999
- vs. rotating or shifting, 145-146
- 3-cell-per-word implementation, Game of Life, 365
-
word count program
- author’s implementation, 303, 304
- David Stafford’s implementation, 309-311, 317-319
- WC50 (Terje Mathisen), 307
-
LOOP instruction
- See also Loops.
- vs. DEC/JNZ sequence, 139, 140-141
- and flags, 148
-
Loops
- See also LOOP instruction.
- avoiding, 140
- and branch prediction, Pentium processor, 377-378
- unrolling, 143-145, 305, 312, 377-378, 410
- M
- Mackraz, Jim, 678
-
Map Mask register
- demo program, 472-473
- drawing text, 833
- optimizing Mode X, 1074
- vs. Read Map register, 526
- selecting planes for CPU writes, 443-444, 471-472
- with set/reset circuitry, 474
- write mode 1, 443
- Map Mask register demo program, 472-473
- Mask register, blanking screen, 651
-
Masked copying, Mode X
- clipping, 923
- between display memory locations, 918-919, 919-921
- image and mask alignments, generating, 922-923
- performance, 924
- system memory to display memory, 916-918, 916
- Masked images, 871-872
- MASM (Microsoft Assembler), 187
-
Math, 3-D
- cross products, 1139-1140
-
dot products
- calculating, 1135-1137
- calculating light intensity, 1137
- projection, 1141-1142
- rotation, 1143-1144
- sign of, 1140-1141
- of unit vectors, 1136
- of vectors, 1135-1136
-
matrix math
- assembly routines, 992, 996-999
- C-language implementations, 974-976
- normal vectors, calculating, 955-956
- rotation of 3-D objects, 938-939, 943-944, 948
- transformation, optimized, 1172-1173, 1173-1174
- vector length, 1135
- Mathiew, Serge, 855-857
- Mathisen, Terje, 250-252, 306, 319
-
Matrices
- incremental transformations, 964
- optimization of, 986, 1172-1173, 1173-1174
- 3-D rotation, representation of, 938-939
-
Matrix math
- assembly routines, 992, 996-999
- C-language implementations, 974-976
- normal vectors, calculating, 955-956
- rotation of 3-D objects, 938-939, 943-944, 948
- transformation, optimized, 1172-1173, 1173-1174
- MDA (Monochrome Display Adapter), 104
- Memchr() function, 116
- Memcmp() function, 116
- Memcpy() function, 1147-1148
-
Memory access
- See also Display memory access.
- clock cycles, bytes vs. words, 82, 83-85
- DEC instruction, 83
- and DRAM refresh, 98
- 8-bit bus cycle-eater, 82
- performance, 286 and 386 processors, 223-225
- prefetch queue cycle-eater, 86
- system wait states, 210-213
- and wait states, 100
- Memory addressing, 221
- Memory addressing modes, and arithmetic operations, 130-133
-
Memory allocation
- display memory, 903-904
- page flipping, 834
- Memory locations, pushing and popping, 254-255
-
Memory variables
- data alignment, 213-215
- 8088 processor, optimization, 83-85
- Memory-addressing instructions, 223-225
- Memset() C library function, 727
- Miles, John, 1081, 1093
- Mipmapping, 1254-1255
- Mode 12H (hi-res mode), 851-855
- Mode 13H, 515, 590
- Mode Control register, 575
-
Mode register
- color paging, 628-629
- 256-color modes, 629
-
Mode X
- See also X-Sharp 3-D animation package.
-
animation demo programs
- page-flipped animation, 924-925, 925-930
- 3-D polygon rotation, 939, 940-945, 948
- bitmap organization, 882-883
- features, 878-879
-
FillRectangleX subroutine
- four-plane parallel processing, 888-891, 891-893
- pixel-by-pixel plane selection, 885-887
- plane-by-plane processing, 887-889
- four-plane parallel processing, 888-891, 891-893
-
latches
- copying pixels, 905-907, 908, 909-911
- loading, with double copying process, 903
- overview, 897-898
- pattern fills, 899, 900-903, 903-904
-
masked copying
- animation demo program, 924-925, 925-930
- clipping, 923
- between display memory locations, 918-919, 919-921
- image and mask alignments, generating, 922-923
- performance, 924
- system memory to display memory, 916-918, 916
- memory allocation, 903-904
- mode set routine, 880-881, 882
- optimization, 1074
- pattern fills, 899, 900-903, 903-904
- pixel access and hardware planes, 1082
- ReadPixelX subroutine, 884-885
- vertical scanlines vs. horizontal, 1084-1086
- WritePixelX subroutine, 883-884
- ModelColor structure, 1035
- ModelColorToColorIndex function, 1036, 1038
- Mod-R/M byte, 257
-
Modular code
- and future of programming profession, 725-726
- optimizing, 153
- Monotone-vertical polygons, filling, 760-761, 761-771, 771
- MOV instruction, 236, 377, 832
- MoveBouncer function, 824-825
- MoveObject function, 929
-
MoveXSortedToAET function
- complex polygons, 749
- monotone-vertical polygons, 770
- MOVSD instruction, 222, 386
- MUL instruction, 97, 173-174
-
Multiplication
- increasing speed of, 173-174
- using LEA, 132-133, 172
- Multi-word arithmetic, 147-148
- N
- NEG EAX instruction, 222
- Negation, two’s complement, 171
- Next1 function, 353
- Next2 function, 353
- Next_generation method, 327-328, 335, 336, 337-338, 344
- Nonconvex objects, depth sorting, 1000, 1001-1002
-
Normal vectors
- building BSP trees, 1106
- calculating, 955-956
- direction of, 1140
- Normals. See Normal vectors.
- NOSMART assembler directive, 72
- NOT instruction, 146-147, 147
- O
- Object collisions, detecting, 531-534
- Object space, 935, 1135
- Object-oriented programming, 725-726
-
Octant0 function
- 360x480 256-color mode line drawing demo program, 615
- Bresenham’s line-drawing algorithm, 662, 668-669
-
Octant1 function
- 360x480 256-color mode line drawing demo program, 616
- Bresenham’s line-drawing algorithm, 663, 668-669
- Octants, and line orientations, 666-667
-
1/z sorting
- abutting span sorting, 1229-1230
- AddPolygonEdges function, 1232-1233, 1238
- vs. BSP-order sorting, 1226-1227
- calculating 1/z value, 1220-1222
- ClearEdgeLists function, 1236-1237
- DrawSpans function, 1236
- independent span sorting, 1230, 1231-1238, 1239-1241
- intersecting span sorting, 1228-1229
- PolyFacesViewer function, 1232
- reliability, 1227
- ScanEdges function, 1234-1236, 1238-1239
- UpdateWorld function, 1237-1238
- On-screen object collisions, detecting, 531-534
- OpenGL API, GLQuake, 1288-1290
- Operands, order of, 173-174
- OPT2.ASM listing, 313-315
-
Optimization
- See also Assembly language optimization; Local optimization.
- 32-bit registers, 187
- and abstraction, 330-332, 345-346
- and application parameters, 122
- assemblers, optimizing, 71-72
- avoiding thinking like a compiler, 152, 154-155
- and biased perceptions, 1080, 1085
- breakthrough level, 316
- BSP trees, 1128-1129
- buffer-filling routine, 416-420
- C library functions, 15
-
compiler-based
- data recursion vs. code recursion, 1112-1113
- on vs. off, 9
- data recursion, 1108-1113
- data structures, 155-166
- disk caches, 19
- display adapter cycle-eater, 107
- DRAM refresh, 98-99
- 8-bit bus cycle-eater, 83-85
- fine-tuning existing code, 312-313
-
floating point operations
- clock cycles, core instructions, 1167-1168
- cross product optimization, 1171, 1172
- dot product optimization, 1170, 1171
- FXCH instruction, 1169-1170
- interleaved instructions, 1169-1170
- matrix transformation optimization, 1172-1173, 1173-1174
- overview, 1167-1170
- pipelining, 1168-1170
- projection to screen space, 1174
- rounding control, 1174-1175
-
486 processor
- addressing pipeline penalty, 238-240, 243, 250-252
- internal cache, 236
- vs. Pentium processor, 378-379
- pushing and popping, 254-255
- reference materials, 236
- shift and rotate instructions, 255-256
- single cycle, importance of, 238
- stack addressing, 241-242
- general rules, 223
- generality, decreasing, 335
- hardware efficiency, 1084-1086
- knowing when to stop, 735
- local optimization, 138-148
- Mode X, 1074
- modular code, 153
- objectives and rules, 7-19, 156
- pattern matching, 191-192, 202
-
Pentium processor
- and branch prediction, 378
- code size and performance, 390
- floating point operations, 1167-1175
- interleaving operations, 394-395
- pairing instructions, 390-394
- pixel-drawing code, 1086
- prefix bytes, 376, 395, 407
- reference material, 374
- superscalar execution, 384-396
- vs. 386 and 486 processors, 378-379, 384
- perspective on problem, changing, 315-316, 1084
- pixel drawing, 1074
- pointer advancement optimization, 1086-1089, 1090-1091, 1092-1093
- prefetch queue cycle-eater, 93
- problem definition, changing, 332
- rearranging instructions, 418-419
- reducing size of code, 416-418
- redundant calculations, 682-683
- re-examining problem, 338-339
- register variables, 338
- restartable blocks, 118
- sorting techniques, 755
- stack addressing, 420
- sufficient, 312
-
superscalar execution
- initial pipe, effect of, 405
- overview, 384-386
- pairable instructions, 388
- V-pipe-capable instructions, 386-387
-
texture-mapping optimization
- inner-loop optimizations, 1069-1073, 1074, 1081-1084
- instruction-by-instruction optimizations, 1086-1092
- pointer advancement optimization, 1086-1089, 1090-1091
- vertical scanlines, 1084-1086
- 32-bit fixed-point arithmetic, 1086-1089, 1090-1091, 1092-1093
- 32-bit instructions, 1091
- 386 processor, 378-379
- time vs. space tradeoff, 187
- transformation inefficiencies, 25-26
- transformation matrices, 986
- understanding data, importance of, 122, 175, 180, 305
- understanding how things work, 726
- unifying model, developing, 1110-1111
- unrolling loops, 143-145, 410
- using restartable blocks, 118
- and VGA memory speed, 704-705
- Optimized searching, 174-180
- Optimizing assemblers, 71-72
- OR instruction, 377
- Orientation-independent texture mapping, 1065-1066, 1067
-
OUT instruction
- clock cycles, 1082-1083
- loading DAC, 640, 642-643
- loading palette RAM or DAC registers, 632
- performance, 444, 843
- word-OUT vs. byte-OUT, 429, 479
- vs. write mode 3, 483-484
- OUTS instruction, 221
- OUT_WORD macro, 566, 594
-
Overdraw problem, VSD
- and beam trees, 1185-1186
- painter’s algorithm, 1184-1185
- sorted spans, 1215
- Overflow register, split screen operation, 565
-
Overhead
-
DOS function calls
- in 16-bit checksum program, 12
- in search engine, 121
- memcmp() function, 116
- strstr() function, 115
- of Zen timer, timing, 46, 72
- Overlapping rectangles, in dirty-rectangle animation, 872-873
- Overscan, 555-556, 641
- P
-
Page flipping
- and bit-plane animation, 814
- color cycling, 650
- vs. dirty-rectangle animation, 846, 862
- display memory start address, changing, 857
- mechanics of, 833-836
- memory allocation, 834, 903-904
- overview, 444-446
- single-page technique, 855-857
- 640x480 mode, 836-837
- with split screen, 836-837
- 320x400 256-color mode, 600-605
- timing updates, 835-836
- VGA mode 12H (hi-res mode), 851-855
-
Page flipping animation demo programs
- Mode X, 924-925, 925-930
- split screen and page flipping, 820-825, 825-830, 836-837
- 320x400 256-color mode, 600-605
-
Painter’s algorithm
- See also 3-D animation; 3-D drawing.
- and BSP trees, 1099, 1104-1105
- overdraw problem, 1184-1185
- potentially visible set (PVS), precalculating, 1188-1189
- Pairable instructions, Pentium processor, 388
- Palette adjustment, dynamic, 1039
-
Palette RAM
- See also Palette registers.
- color paging, 628-629
- setting registers, 629-630, 631-632
- VGA color path, 626
-
Palette registers
- See also Palette RAM.
- EGA, 549-550
- setting for bit-plane animation, 799-801, 811-813
-
Panning
- byte-by-byte vs. pixel-by-pixel, 574
- overview, 441-442
- in split screens, 574-575, 575-582, 582-583
- in text mode, 442
- PanRight subroutine, 582
-
Parametric lines
- clipping, 1121-1123
- overview, 1119-1120
- Particles, Quake 3-D engine, 1287
- Pattern fills, 899, 900-903, 903-904
- Pattern matching, 191-192, 202
- PC compatibility, Zen timer, 48-49
- Pel panning. See Panning.
- Pel Panning register, 574, 583
-
Pentium processor
- AGIs (Address Generation Interlocks), 400-403
- alignment, 376
- branch instructions, pairing, 404-405
- branch prediction, 377-378
- bus, locking, 377
- cache lines, 374
- code size and performance, 390
- data cache and paired instructions, 391
- display adapter cycle-eater, 107
- EA (effective address) calculations, 375-376
-
floating point optimization
- clock cycles, core instructions, 1167-1168
- cross product optimization, 1171, 1172
- dot product optimization, 1170, 1171
- FXCH instruction, 1169-1170
- interleaved instructions, 1169-1170
- matrix transformation optimization, 1172-1173, 1173-1174
- overview, 1167-1170
- pipelining, 1168-1170
- projection to screen space, 1174
- rounding control, 1174-1175
- FPU pipelining, 1168-1170
- instruction fetching, 374
- internal cache, 374-375, 396
- LAHF and SAHF instructions, 148
- LEA vs. ADD instructions, 131
- LODSB instruction, 304
- LOOP instruction vs. DEC/JNZ sequence, 139
- MOV vs. XCHG instructions, 377
-
optimization
- pairing instructions, 390-394
- pixel-drawing code, 1086
- reference material, 374
- overview, 373-375
-
pipeline stalls
- FPU, 1168-1170
- overview, 375
- texture-mapping code, 1092
- prefix bytes, 376, 395, 407
- running Pentium code on 386 or 486, 411
-
superscalar execution
- initial pipe, effect of, 405
- interleaving operations, 394-395
- internal cache, 396
- lockstep execution, 390-394, 400-403
- overview, 384-386
- pairable instructions, 388
- prefix bytes, 395
- register contention, 403-405
- registers, small set, 395
- U-pipe, 385-386
- V-pipe, 385-386, 386-387
- XCHG vs. MOV instructions, 377, 832
- Pentium Processor Optimization Tools (book), 1148
-
Performance
- See also Assembly language optimization; Clock cycles; Cycle-eaters; Local optimization; Optimization; Zen timer.
- and abstraction, 330-332, 345-346
- beam trees, 1186
- Boyer-Moore algorithm, 266-268
- branching, 140
- BSP (Binary Space Partitioning) trees, 1100, 1111-1113
- bubble sort, 755
- complex polygons, filling, 753
- dirty-rectangle animation, 873
- display adapter cycle-eater, 221
- DRAM refresh, 97
- function calls, 153
-
Game of Life
- byte-per-cell implementation, 340
- cellmap-wrapped implementation, 332, 338
- challenge results, 351
- general analysis, 329-330
- and generality, 335
- level performance, 1213-1214
- lookup tables, vs. rotating or shifting, 145-146
- masked copying, Mode X, 924
- measuring, importance of, 34, 396
- memory access, 223-225
- OUT instruction, 444
- OUT instructions, 843
- PC-compatible computers, 48-49
- polygon-filling implementations, 728
- precalculated potentially visible set (PVS), 1213-1214
- profiling and 80x87 emulator, Borland C++, 999
- stack frames, 153
- SuperVGA, with 486 processor, 842-844
- texture mapping, 1074-1074
- 3-D polygon rotation demo programs, 949
- 360x480 256-color mode, 618
- 320x400 256-color mode, 599-600
- time-critical code, 13
- vertical scanlines in texture mapping, 1084
- video performance, 104
- Wu antialiasing algorithm, 777-778
- z-buffers, 1213
- Perspective correction in texture mapping, 1093
- Perspective correctness problem, Gouraud shading, 1248-1250
-
Perspective projection, 937, 1135
- See also Projection.
-
Pipeline stalls, Pentium processor, 375
- See also Addressing pipeline penalty; AGIs (Address Generation Interlocks).
-
Pipelining
-
486 processor
- addressing pipeline penalty, 238-240, 250
- stack addressing, 241-242
- FPU, Pentium processor, 1168-1170
- Pitch angle, in polygon clipping, 1206
- Pixel bits, rotating, 252
-
Pixel drawing
- See also Pixels.
- EVGADot function, 661-662, 669-670
- optimization, 1074, 1086
- painter’s algorithm and overdraw problem, 1184
- Pixel intensity calculations, Wu’s antialiasing algorithm, 778-779
- Pixel values, mapping to colors, 548-551, 551-555
-
Pixels
- See also Boundary pixels, polygons; Pixel drawing.
- copying, using latches (Mode X), 905-907, 908, 909-911
- reading (320x400 256-color mode), 599
- redrawing, display adapter cycle-eater, 102
- rotating bits, 252
- writing (320x400 256-color mode), 599, 600
- Plane mask, 1074
- Plane-manipulation demo program, 476-478
-
Planes
- clipping line segments to, 1195-1197
- 1/z value, calculating, 1221
- representation, 1196
-
Planes, VGA
- See also Bit-plane animation.
- ALUs and latches, 451-453
- and bit mask, 465
- capturing and restoring screens, 541-542, 543-547, 547-548
- and Color Don’t Care register, 534-535, 535-537
- fonts, in text modes, 516
- manipulating, 443-444, 476-478
- and Map Mask register, 471-472
-
Mode X
- bitmap organization, 882-883
- four-plane parallel processing, 888-891, 891-893
- pixel-by-pixel plane selection, 885-887
- plane-by-plane processing, 887-889
- Mode X pixel access, 1082
- overview, 430
- and Read Map register, 542
- read mode 0, 525-526
- and set/reset circuitry, 471-478
- setting all to single color, 473-474
- single-color drawing with write mode 3, 831-832
- write mode 2, 502-504, 509
- Pohl, Frederick, 1275
- Pointer advancement optimization, 1086-1089, 1090-1091, 1092-1093
- Pointer arithmetic, 171
- Points, representation of, 1196
- PolyFacesViewer function, 1203, 1232
-
Polygon clipping
- BackRotateVector function, 1203
- clipping to frustum, 1200, 1201-1206, 1206-1207
- ClipToFrustum function, 1204
- ClipToPlane function, 1199
- optimization, 1207
- overview, 1197-1200
- PolyFacesViewer function, 1203
- ProjectPolygon function, 1201
- SetUpFrustum function, 1204
- SetWorldspace function, 1204
- TransformPoint function, 1203
- TransformPolygon function, 1203
- UpdateViewPos function, 1202
- UpdateWorld function, 1205
- viewspace clipping, 1207
- ZSortObjects function, 1201
-
POLYGON.H header file
- complex polygons, 751
- monotone-vertical polygons, filling, 771
- non-overlapping convex polygons, 719-720
- texture mapped polygons, 1054
- 3-D polygon rotation, 945-946
- 3-D solid cube rotation program, 965
- X-Sharp 3-D animation package, 982-984
- Polygon models, Quake 3-D engine, 1285-1286
-
Polygon-filling programs
- See also Polygons, filling.
- complex polygons, 742-744, 745-752, 753, 754, 755-756
- monotone-vertical polygons, 760, 761-771
-
non-overlapping convex polygons
- assembly implementations, 732-733, 733-734, 735-739
- C-language implementations, 713-720, 720-721, 729-732
- PolygonIsMonotoneVertical function, 761
-
Polygons
- See also Texture mapping.
- adjacent, and 1/z span sorting, 1230
- backface removal, 954-957, 1160-1161
- categories of, 710, 742, 759-760
- clipping, 1158-1159
- Gouraud shading, 1247
- hidden surface removal, 1214-1222
- normal vector, calculating, 955-956
- projection in 3-D space, 937, 944-945, 948
- representation, 1196
-
3-D polygon rotation demo program
- matrix multiplication functions, 943-944, 948
- overview, 939
- performance, 949
- polygon filling with clipping support, 940-943
- transformation and projection, 944-945, 948
- transformation to 3-D space, 935
- unit normal, calculating, 1027-1028, 1137-1140
- visibility, calculating, 955-956
-
visible surface determination (VSD)
- beam trees, 1185-1189
- overdraw problem, 1184-1185
- polygon culling, 1181-1184
- potentially visible set (PVS), precalculating, 1188-1189
- visible surface determination (VSD)culling to frustum, 1181-1184
- wall orientation testing, BSP tree rendering, 1160-1161
-
Polygons, filling
- See also Polygon-filling programs; Polygons; Texture mapping.
- active edges, 742-744, 753, 755, 756
- boundary pixels, selecting, 712
- with clipping support, 940-943
- complex polygons, 742
- drawing, speeding up, 727-729
-
edge tracing
- overview, 711-713
- ScanEdge function, 716-717, 720-721, 730-732, 735-738
- fitting adjacent polygons, 712-713
- flat vs. pointed top, 720
- integer vs. fixed-point arithmetic, 1065
- in Mode X, 940-943
- monotone-vertical polygons, 760-761, 771
- nonconvex polygons, 755
- non-overlapping convex polygons, 720-721
- performance, comparison of implementations, 728
- rasterization, 710-712
-
scan conversion, 710, 720-721
- active edges, 721, 742-744, 753, 755, 756
- C-language implementation, 713-717, 720-721
- defined, 710
- zero-length segments, 721
-
Polyhedrons
- hidden surfaces, 955, 1000, 1001-1002
- representation of, 962
-
3-D solid cube rotation demo program
- basic implementation, 957-961, 962-963
- incremental transformations, 964-966
- object representation, 967
- POP instruction, 241-242, 404
- POPA instruction, 221
- POPF instruction, 226, 226-231
- Popping, memory locations vs. registers, 254-255
- Portable code, and future of programming profession, 725-726
-
Portals
- and beam trees, 1188
- in Quake 3-D engine, 1279-1280
-
Potentially visible set (PVS)
- vs. portals, 1279-1280
- precalculating, 1188-1189, 1213-1214
- Quake 3-D engine, 1278-1279
-
Precalculated results
- BSP trees and potentially visible set (PVS), 1188-1189
- lookup tables, 146
-
Precision
- long-period Zen timer, 53
- rounding vs. truncation, 1002-1003
- Zen timer, 48, 52
-
Prefetch queue
- 286 and 386 processors, 225
-
Prefetch queue cycle-eater
- 286 and 386 processors, 210
- instruction execution times, 87-93
- optimizing for, 93
- overview, 86
- system wait states, 210
- and Zen timer, 88, 92
-
Prefix bytes
- Pentium processor, 376, 395, 407
- and stack-based variables, 184
- Prefixes. See Prefix bytes.
- Principles of Interactive Computer Graphics (book), 934
- Problems, quick responses to, 1166
- Profiling, and 80x87 emulator, Borland C++, 999
- Program size vs. clock cycles, 28
- Programmer’s Guide to PC Video Systems (book), 651
-
Projection
- defined, 1135
- floating point optimization, 1174
- LineIntersectPlane function, 1142-1143
-
overview, 937, 948
- XformAndProjectPoly function, 944-945
- rotation without matrices, 1143-1144
- using dot product, 1141-1142
- ProjectPolygon function, 1201
- Proportional text, 489
-
Protected mode
- addressable memory, 221
-
486 processor
- addressing calculation pipeline, 239
- indexed addressing, 237-238
- general tips, 140
- overview, 208-209
- 32-bit addressing modes, 256-258
- PS2 equate, long-period Zen timer, 65-66
- PS/2 computers, 54, 66
- PUSH instruction, 222, 241-242, 404
- PUSHA instruction, 221
- Pushing, memory locations vs. registers, 254-255
- PZTEST.ASM listing, Zen timer, 49
- PZTIME.BAT listing, Zen timer, 51
- PZTIMER.ASM listing, Zen timer, 35-42
- Q
- QLife program, 352-363
- QSCAN3.ASM listing, 309-311
- Quake 2, 1293
-
Quake
- surface caching, 1253-1256, 1260-1262
-
surface-based lighting
- description, 1250-1251
- mipmapping, 1254-1255
- performance, 1251-1253
- surface caching, 1253-1256, 1260-1262
- texture mapping, 1261-1262
-
3-D engine
- BSP trees, 1276-1277
- lighting, 1282-1283
- model overview, 1276-1277
- portals, 1279-1280
- potentially visible set (PVS), 1278-1279
- rasterization, 1282
- world, drawing, 1280-1281
- and visible surface determination (VSD), 1181
- QuakeWorld, 1291-1292
- R
- Radiosity lighting, Quake 2, 1293
-
Rasterization of polygons
- See also Polygons, filling.
- boundary pixels, selecting, 712
- efficient implementation, 711
- in Quake 3-D engine, 1282
- Rate of divergence, in 3-D drawing, 937
- Raycast, subdividing, and beam trees, 1187
- RCL instruction, 185-186
- RCR instruction, 185-186
- Read360x480Dot subroutine, 614-615
-
Read() C library function
- vs. getc() function, 12
- overhead, 121
- Read Index register, 651-652
-
Read Map register
- demo program, 526-530
- planes, specifying to be read, 542
- read mode, 0, 526
- Read Map register demo program, 526-530
- Read mode, 0, 521
-
Read mode 1
- Color Don’t Care register, 534
- overview, 525-526
- vs. read mode 0, 521
- selecting, 525
- Read/write/modify operations, 107
- Read-after-write register contention, 404
- ReadPixel subroutine, 598, 599
- ReadPixelX subroutine, 884-885
- Real mode. See 386 processor.
-
Real mode
- addressing calculation pipeline, 239
- 32-bit addressing modes, 256-258
-
Rectangle fill, Mode X
- four-plane parallel processing, 888-891, 891-893
- pixel-by-pixel plane selection, 885-887
- plane-by-plane processing, 887-889
-
Recursion
-
BSP trees
- building BSP trees, 1101-1104
- data recursive inorder traversal, 1107-1113
- visibility ordering, 1104-1106
-
code recursion
- vs. data recursion, 1108-1110
- Euclid’s algorithm, 198-199
- compiler-based optimization, 1112-1113
-
data recursion
- vs. code recursion, 1108-1110
- compiler-based optimization, 1112-1113
- Euclid’s algorithm, 200
- inorder tree traversal, 1108-1110
- performance, 1111-1113
- performance, 1111-1113
-
Reference materials
- 3-D drawing, 934-935
- 3-D math, 1135
- bitmapped text, drawing, 471
- Bresenham’s line-drawing algorithm, 660
- BSP trees, 1114, 1157
- circle drawing, 626
- color perception, 625
- 8253 timer chip, 72
- 486 processor, 236
- parametric line clipping, 1121
- Pentium processor, 374, 1148
- SVGA programming, 626
- VGA registers, 583
- ReferenceZTimerOff subroutine, 41
- ReferenceZTimerOn subroutine, 40
- Reflections, in GLQuake, 1290
- Reflective color, vs. emissive color, 1035
- Register contention, Pentium processor, 403-405
- Register-only instructions, 223-225
-
Registers
- See also 32-bit registers; VGA registers.
- AX register, 171
- copying bytes between, 172
- EGA palette registers, 549-550
- 8-bit bus cycle-eater, 85
-
486 processor
- addressing pipeline penalty, 238-240, 250
- byte registers and lost cycles, 242-245
- indexed addressing, 237-238
- pushing or popping, vs. memory locations, 254-255
- scaled, 256-258
- stack addressing, 241-242
- 32-bit addressing modes, 256-258
- prefetch queue cycle-eater, 94
- and split screen operations, 573
- and stack frames, 153
- VGA architecture, 427-429
- Relocating bitmaps, 516-517
-
Rendering BSP trees
- backface removal, 1160-1161
- clipping, 1158-1159
- ClipWalls function, 1152-1155, 1158-1159
- DrawWallsBackToFront function, 1155-1156, 1160-1161
- overview, 1149
- reference materials, 1157
- TransformVertices function, 1151-1152, 1158
- UpdateViewPos function, 1151, 1157
- UpdateWorld function, 1156-1157, 1157
- viewspace, transformation of objects to, 1158
- wall orientation testing, 1160-1161
- WallFacingViewer function, 1150-1151, 1161
- RenderMan Companion (book), 742
- REP MOVS instruction, 148
- REP MOVSW instruction, 82, 105, 220
- REP SCASW instruction, 166
- REP STOS instruction, 727, 735
-
REPNZ SCASB instruction
- vs. Boyer-Moore algorithm, 267-268, 271, 274
- in string searching problem, 121-122, 174-175, 262-263
-
REPZ CMPS instruction
- vs. Boyer-Moore algorithm, 267-268, 271, 274
- in string searching problem, 121-122, 174-175, 262-263
-
Restartable blocks
- in 16-bit checksum program, 16
- optimizing file processing, 118
- performance, 122
- in search engine, 117-118
- size of, 114, 121
-
Results, precalculating
- See also lookup tables.
- BSP trees and potentially visible set (PVS), 1188-1189
- RET instruction, 241-242
- Reusable code, and future of programming profession, 725-726
-
RGB (red, green, blue) color model
- mapping to 256-color mode, 1036, 1037-1038, 1039
- overview, 1034-1035
- Richardson, John, 316
- Right-handed coordinate system, 935-937
- ROL instruction, 185-186
- Roll angle, in polygon clipping, 1206
- ROR instruction, 185-186
-
Rotate instructions
- hand assembling, 255-256
- n-bit vs. 1-bit, 255-256
- 286 processor, 222
- RotateAndMovePObject function, 977-978
-
Rotation, 3-D animation
- ConcatXforms function, 944
- matrix representation, 938-939
- multiple axes of rotation, 948
- using dot product, 1143-1144
- XformVec function, 943
- Rotational variance, 1249
-
Rotations, bitwise
- vs. lookup tables, 145-146
- multi-bit vs. single-bit, 185-186
-
Rounding vs. truncation
- in 3-D animation, 1002-1003
- floating point optimization, 1174-1175
- texture mapping, 1066-1067
-
Run-length slice algorithm
- assembly implementation, 698-704
- C-language implementations, 688-692, 692-693
- description, 683-684
- implementation details, 685-687
- integer-based implementation, 685-687
- potential optimizations, 705
- Ruts, mental, staying out of, 1147-1148
- S
- SAHF instruction, 148
- Sam the Golden Retriever, 841-842
-
SC (Sequence Controller), VGA
- addressing, 427-428
-
Map Mask register
- CPU writes, selecting planes, 443-444, 471-472
- drawing text, 833
- optimizing Mode X, 1074
- vs. Read Map register, 526
- with set/reset circuitry, 474
- write mode 1, 444
- Scaled registers, 256-258
-
Scan conversion, polygons
- active edges, 721, 742-744, 753, 755, 756
- C-language implementation, 713-717, 720-721
- defined, 710
- zero-length segments, 721
-
Scan lines
- redefining length of, 442
- in split screens, 564-565, 573
- 360x480 256-color mode, 619
- vertical, in texture mapping, 1084-1086
-
ScanBuffer assembly routine
- author’s implementation, 301-302, 303-304
- hand-optimized implementation(Willem Clements), 313-315
- lookup table implementation (David Stafford), 309-311, 317-319
-
ScanEdge function
- assembly implementation, 735-738, 735
- floating-point C implementation, 716-717, 720-721
- integer-based C implementation, 730-732
- ScanEdges function, 1234-1236, 1238-1239
-
ScanOutAET function
- complex polygons, 749-750
- monotone-vertical polygons, 770
-
ScanOutLine function
- assembly implementation, 1069-1073, 1074
- C-language implementation, 1058-1059, 1067-1069
- SCASW instruction, 161
-
Screen blanking
- demo program, 556-557
- using DAC Mask register, 651
- Screen blanking demo program, 556-557
- Screen capture programs, 541-548
- Screen redraws, and display adapter cycle-eater, 101, 102
- Screen refresh rate, 619
-
Screenspace
- defined, 1135
- and normals of polygons, 1137-1138
- projecting to, BSP tree rendering, 1159
- uses for, 967
- SEARCH.C listing, 118-121
-
Search engine
- See also Searching.
- Boyer-Moore algorithm, 263-277
- design considerations, 114
- execution profile, 121
- FindString function, 175, 176, 178, 269
- optimization, 174-180
- restartable blocks, 117-118
- search space and optimization, 122, 175
- search techniques, 115-116, 175
- SearchForString function, 118
-
Searching
- See also Search engine.
- Boyer-Moore algorithm, 263-277
- in linked list of arrays, 156-166
- for specified byte in buffer, 141-145
- using REP SCASW, 166
- SecondPass function, 358-360
- Sedgewick, Robert (Algorithms), 192, 196
-
Segments
- compiler handling of, 154
- and far jumps, 186
- protected mode, 208-209
- 386 processor, 222
- SelectBSPTree function, 1124-1125
- Selling ideas, 1193-1194
- Sentinels, in linked lists, 286
- Sequence Controller, VGA. See SC (Sequence Controller), VGA.
- Set320x400Mode subroutine, 593, 596-597, 599, 602-604
- Set320x240Mode subroutine, 881-882
- Set360x480Mode subroutine, 612, 620-621
- Set640x400 function, 855
-
Set/reset circuitry, VGA
- color-forcing demo program, 474-476
- and CPU data, 474
- emulating write mode 3, 490
- overview, 471-472, 478-479
- plane-manipulation demo program, 476-478
- planes, setting all to single color, 473-474
- and write mode 2, 501-502, 509, 515
- Set/Reset register, 666
- SetBIOS8x8Font subroutine, 830
- Set_cell method, 327, 334, 342
- SETGC macro, 454, 475
- SetPalette function, 783-784
- SetPelPan subroutine, 580
- SETSC macro, 474
- SetSplitScreenScanLine subroutine, 570-571, 581
- SetStartAddress subroutine, 570, 580
- SetUpEdge function, 1057-1058
- SetWorldspace function, 1204
-
Shading
- See also Lighting; 3-D drawing.
- ambient shading, 1023
- diffuse shading, 1023-1024
- directed light sources, 1028
- effects, 360x480 256-color mode, 618
- overall shading, calculating, 1025
- of polygons, 1025-1026, 1027-1029
-
Shearing
- cause of, 813
- in dirty-rectangle animation, 846
- page flipping, 814
- sheep, 1063
- Shift instructions, 222, 255-256
- Shifting bits, vs. lookup tables, 145-146
- SHL instruction, 376
- ShowBounceCount function, 823-824
-
ShowPage subroutine
- masked copying animation, Mode X, 929-930
- page flipping animation, 827
- Show_text function, 329, 363
- SHR instruction, 88-91, 97
- SIB byte, 257
- 640x400 mode, mode set routine, 852-853
- 640x480 mode, page flipping, 836-837
-
16-bit checksum program
- See also TCP/IP checksum program.
- assembly implementation, 10-12, 17-18
- C language implementation, 8-9, 15-16
- overview, 8
- redesigning, 9
-
16-color VGA modes
- color paging, 628-629
- DAC (Digital/Analog Converter), 626-628
- palette RAM, 626
- Small code model, linking Zen timer, 70
- Software patents, 1194
-
Sorted span hidden surface removal
- abutting span sorting, 1229-1230
- AddPolygonEdges function, 1232-1233, 1238
- BSP order vs. 1/z order, 1220, 1226
- ClearEdgeLists function, 1236-1237
- DrawSpans function, 1236
- edge sorting, 1220-1222
- edges vs. spans, 1215-1220
- independent span sorting, 1230, 1231-1238, 1239-1241
- intersecting span sorting, 1228-1229
- 1/z sorting, 1220-1222, 1227-1231, 1231-1238, 1239-1241
- overview, 1214-1215
- PolyFacesViewer function, 1232
- ScanEdges function, 1234-1236, 1238-1239
- UpdateWorld function, 1237-1238
-
Sorting techniques
- 25-byte sorting routine, 180-181
- BSP trees, 1099
- moving models in 3-D drawings, 1212-1222
- 1/z sorting for hidden surface removal, 1220-1222
- and optimization, 755
- z-buffers, 1212-1213
- SortObjects function, 1002
- Span-based drawing, and beam trees, 1187
- Specular reflection, 1023
-
Split screens
- EGA bug, 573-574
- horizontal panning, 574-575, 575-582, 583
- overview, 563-565
- page flipping, 640x480 mode, 836-837
- registers, setting, 573
- safety of, 585
- split screen demo program, 565, 566-572, 572
- text mode, 584
- turning on and off, 565
- SplitScreenDown subroutine, 572
- SplitScreenUp subroutine, 572
-
Spotlights
- Gouraud shading, 1247
- shading implementation, 1028
-
Sprites
- masked images, 871-872
- Quake 3-D engine, 1287
- Square wave timer mode, 44
-
Stack addressing
- address pipeline effects, 241-242
- assembly language optimization, 420
- Stack frames, performance, 153
- Stack pointer alignment, 218-219
- Stack-based variables, placement of, 184-185
- Stacks, POPF vs. IRET, 226-231
-
Stafford, David
- 25-byte sorting routine, 180-181
- Game of Life implementation, 351-352, 353-363, 363-365
- ScanBuffer assembly routine, word count program, 309-311, 317-319
- 24-byte hi/lo function, 292-293
- Start Address High and Low registers, 834-836
-
State machines
- 3-cell-per-word implementation, Game of Life, 363-366
- word count program, 315
- StepEdge function, 1056-1057
- STOSB instruction, 236
- String instructions, 107
- String searching. See Search engine; Searching.
- Strstr() function, 115
- SUB instruction, 219
- Subdivision rasterization, 1266-1267, 1267-1270, 1286
-
Superscalar execution
- initial pipe, effect of, 405
- interleaving operations, 394-395
- lockstep execution, 390-394, 400-403
- overview, 384-386
- register contention, 403-405
- V-pipe-capable instructions, 386-387
- SuperVGA, 104, 107, 842-844
-
Surface caching
- hardware interactions, 1260-1262
- surface-based lighting, 1253-1256
- in VQuake, 1288
-
Surface-based lighting
- description, 1250-1251
- mipmapping, 1254-1255
- performance, 1251-1253
- surface caching, 1253-1256, 1260-1262
- texture mapping, 1261-1262
-
System clock
-
inaccuracies
- long-period Zen timer, 53, 54
- Zen timer, 43, 45-46, 48
- timer 0, 8253 chip, 44, 54
-
System memory, Mode X
- copying to display memory, 908, 909-911
- masked copy to display memory, 916-918, 916
- System wait states, 210-213
- T
- Table-driven state machines, 316-319
- Tail nodes, in linked lists, 286
- TASM (Turbo Assembler), 71-72
-
TCP/IP checksum program
- basic implementation, 406
- dword implementation, 409
- interleaved implementation, 408
- unrolled loop implementation, 410
- Test function, 358, 365
- TEST instruction, 377, 401-402
-
Texels
- Gouraud shading, 1247
- mipmapping, 1254-1255
-
Text, drawing
-
bitmapped text demo program
- using bit mask, 466-469, 470-471
- using write mode 3, 484-489, 489-490, 490-496
- high-speed text demo program, using write mode 3, 490-496
- solid text demo program, using latches, 1039-1041, 1042-1044
- using write mode 0, 832-833
-
Text mode
- display adapter cycle-eater, 104
- horizontal resolution, 620
- panning, 443
- split screen operations, 584-585
- Text pages, flipping from graphics to text, 517
- TEXT_UP macro, 454, 459
- TextUp subroutine, 829
-
Texture mapping
- See also DDA (digital differential analyzer) texture mapping.
- boundary pixels, polygons, 1049-1052, 1066, 1067
- C implementation, 1053-1058
- independent span sorting, 1238
- onto 2-D transformed polygons, 1050
- onto 3-D transformed polygons, 1051
- onto untransformed polygon, 1049
-
optimization
- inner-loop optimizations, 1069-1073, 1074, 1081-1084
- instruction-by-instruction optimizations, 1086-1092
- pointer advancement optimization, 1086-1089, 1090-1091
- vertical scanlines, 1084-1086
- orientation independence, 1065-1066, 1067
- overview, 1048
- Pentium pipeline stalls, 1092
- perspective correction, 1093
- surface-based lighting, 1261-1262
- vertical scanlines, 1084-1086
- 32-bit addressing modes, 256-258
- 32-bit division, 181-184, 1008
- 32-bit fixed-point arithmetic, optimizing, 1086-1089, 1090-1091, 1092-1093
- 32-bit instructions, optimizing, 1091
-
32-bit registers
- See also Registers; VGA registers.
- adding with LEA, 131
- BSWAP instruction, 252
- multiplying with LEA, 132-133
- 386 processor, 222
- time vs. space tradeoff, 187
- using as two 16-bit registers, 253-254
-
3-D animation
- See also Hidden surface removal; 3-D drawing; 3-D polygon rotation demo program; X-Sharp 3-D animation package.
-
demo programs
- solid cube rotation program, 957-961, 962-963, 964-966, 967
- 3-D polygon rotation program, 939, 940-945, 948-949
- 12-cube rotation program, 972, 973-984, 985-987
- depth sorting, 1000, 1001-1002
-
rotation
- ConcatXforms function, 944
- matrix representation, 938-939
- multiple axes of rotation, 948
- XformVec function, 943
- rounding vs. truncation, 1002-1003
- translation of objects, 937-938
-
3-D clipping
- arithmetic imprecision, handling, 1240
- line segments, clipping to planes, 1195-1197
- overview, 1195
-
polygon clipping
- BackRotateVector function, 1203
- clipping to frustum, 1200, 1201-1206, 1206-1207
- ClipToFrustum function, 1204
- ClipToPlane function, 1199
- optimization, 1207
- overview, 1197-1200
- PolyFacesViewer function, 1203
- ProjectPolygon function, 1201
- SetUpFrustum function, 1204
- SetWorldspace function, 1204
- TransformPoint function, 1203
- TransformPolygon function, 1203
- UpdateViewPos function, 1202
- UpdateWorld function, 1205
- viewspace clipping, 1207
- ZSortObjects function, 1201
-
3-D drawing
- See also BSP (Binary Space Partitioning) trees; Hidden surface removal; Polygons, filling; Shading; 3-D animation.
-
backface removal
- BSP tree rendering, 1160-1161
- calculations, 955-957
- motivation for, 954-955
- and sign of dot product, 1140
- solid cube rotation demo program, 957-961, 962-963, 964-966, 967
- background surfaces, 1240
- draw-buffers, and beam trees, 1187
- and dynamic objects, 1100-1101
- Gouraud shading, 1246-1250
-
lighting
- Gouraud shading, 1246-1250
- overlapping lights, 1247
- perspective correctness, 1248-1250
- rotational variance, 1249
- surface-based lighting, 1250-1256, 1260-1262
- viewing variance, 1249
- moving models in 3-D drawings, 1212-1222
- painter’s algorithm, 1099, 1104-1105
- perspective correctness problem, 1248-1250
- portals, and beam trees, 1188
-
projection
- dot products, 1141-1142
- overview, 937, 948
- raycast, subdividing, and beam trees, 1187
- reference materials, 934-935
-
rendering BSP trees
- backface removal, 1160-1161
- clipping, 1158-1159
- ClipWalls function, 1152-1155, 1158-1159
- DrawWallsBackToFront function, 1155-1156, 1160-1161
- overview, 1149
- reference materials, 1157
- TransformVertices function, 1151-1152, 1158
- UpdateViewPos function, 1151, 1157
- UpdateWorld function, 1156-1157, 1157
- viewspace, transformation of objects to, 1158
- wall orientation testing, 1160-1161
- WallFacingViewer function, 1150-1151, 1161
- span-based drawing, and beam trees, 1187
- transformation of objects, 935-936
-
triangle model drawing
- fast triangle drawing, 1263-1265
- overview, 1262-1263
- precision, 1265
- subdivision rasterization, 1266-1267, 1267-1270
- vertex-free surfaces, and beam trees, 1187
- visibility determination, 1099-1106
-
visible surface determination (VSD)
- beam trees, 1185-1189
- culling to frustum, 1181-1184
- overdraw problem, 1184-1185
- polygon culling, 1181-1184
- potentially visible set (PVS), precalculating, 1188-1189
-
3-D engine, Quake
- BSP trees, 1276-1277
- lighting, 1282-1283
- model overview, 1276-1277
- portals, 1279-1280
- potentially visible set (PVS), 1278-1279
- rasterization, 1282
- world, drawing, 1280-1281
-
3-D math
- cross products, 1139-1140
-
dot products
- calculating, 1135-1137
- calculating light intensity, 1137
- projection, 1141-1142
- rotation, 1143-1144
- sign of, 1140-1141
- of unit vectors, 1136
- of vectors, 1135-1136
-
matrix math
- assembly routines, 992, 996-999
- C-language implementations, 974-976
- normal vectors, calculating, 955-956
- rotation of 3-D objects, 938-939, 943-944, 948
- transformation, optimized, 1172-1173, 1173-1174
- vector length, 1135
-
3-D polygon rotation demo program
- matrix multiplication functions, 943-944, 948
- overview, 939
- performance, 949
- polygon filling with clipping support, 940-943
- transformation and projection, 944-945, 948
-
3-D solid cube rotation demo program
- basic implementation, 957-961, 962-963
- incremental transformations, 964-966
- object representation, 967
- 386 native mode, 32-bit displacements, 187
-
386 processor
- alignment, stack pointer, 218-219
- CMP instruction, 161, 306
- cycle-eaters, 209-210
- data alignment, 213, 218
- and display adapter cycle-eater, 107
- display adapter cycle-eater, 219-221
- doubleword alignment, 218
- DRAM refresh cycle-eater, 219
- effective address calculations, 129, 223-225
- LEA instruction, 130-133, 172
- LODSD vs. MOV/LEA sequence, 171
- lookup tables, vs. rotating or shifting, 145-146
- LOOP instruction vs. DEC/JNZ sequence, 139
- memory access, performance, 223-225
- MUL and IMUL instructions, 173-174
- multiplication operations, increasing speed of, 173-174
- new instructions and features, 222
- Pentium code, running on, 411
- protected mode, 208-209
- rotation instructions, clock cycles, 185-186
- system wait states, 210-212
- 32-bit addressing modes, 256-258
- 32-bit multiply and divide operations, 985
- using 32-bit register as two 16-bit registers, 253-254
- XCHG vs. MOV instructions, 377, 832
- 386SX processor, 16-bit bus cycle-eater, 81
-
360x480 256-color mode
- display memory, accessing, 621-622
- Draw360x480Dot subroutine, 613-614
- drawing speed, 618
- horizontal resolution, 620
- line drawing demo program, 615-618, 618-619
- mode set routine (John Bridges), 609, 612, 620-621
- on VGA clones, 610-611
- Read360x480Dot subroutine, 614-615
- 256-color resolution, 619-620
- vertical resolution, 619
-
320x400 256-color mode
- advantages of, 590-591
- display memory organization, 591-593
- line drawing, 600
- page flipping demo program, 600-605
- performance, 599-600
- pixel drawing demo program, 593-598, 599-600
- 320x240 256-color mode. See Mode X.
- Time perception, subjectivity of, 972
- Time-critical code, 13
-
Timer 0, 8253 timer chip
- operation, 44
- stopping, 54, 65
- Timer modes, 44, 45
- TIMER_INT BIOS routine, 44
-
Timers
- See also 8253 timer chip; Long-period Zen timer; Zen timer.
- divide-by-N mode, 45
- square wave mode, 44
- Timeslicing delays, 446
-
Timing intervals
- long-period Zen timer, 53
- Zen timer, 45
- Transformation inefficiencies, 25-26
- Transformation matrices. See Matrices; Matrix math.
-
Transformation of 3-D objects
- defined, 1135
- floating point optimization, 1172-1173, 1173-1174
- incremental transformations, 964
- steps in, 935-936
- TransformPolygon function, 1203
- Translation in 3-D space, 937-938
- Treuenfels, Anton, 756
-
Triangle model drawing
- fast triangle drawing, 1263-1265
- overview, 1262-1263
- precision, 1265
- subdivision rasterization, 1266-1267, 1267-1270
- Triangles, and rotational variance, 1249-1250
- Trinity, 1294
- Truncation errors, in 3-D animation, 1002-1003
-
Truncation vs. rounding
- floating point optimization, 1174-1175
- texture mapping, 1066-1067
- TSRs, and DAC, loading, 643, 648
- Turbo Profiler, and 80x87 emulator, Borland C++, 999
-
12-cube rotation demo program
- limitations of, 986
- optimizations in, 985-986
- performance, 986
- X-Sharp animation package, 972, 973-984, 984-985
- 24-byte hi/lo function, 292-293
-
286 processor
- CMP instruction, 161, 306
- code alignment, 215-218
- cycle-eaters, 209-210
- data alignment, 213-215
- data transfer rates, 212
- display adapter cycle-eater, 219-221
- display memory wait states, 220
- DRAM refresh cycle-eater, 219
- effective address calculations, 129, 223-225
- instruction fetching, 215-218
- LEA vs. ADD instructions, 130
- lookup tables, vs. rotating or shifting, 145-146
- LOOP instruction vs. DEC/JNZ sequence, 139
- memory access, performance, 223-225
- new features, 221
- POPF instruction, and interrupts, 226
- protected mode, 208-209
- stack pointer alignment, 218-219
- system wait states, 210-212
-
256-color modes
- See also 320x400 256-color mode.
- DAC settings, 629
- mapping RGB model to, 1036, 1037-1038, 1039
- resolution, 360x480 256-color mode, 619-620
- Two-pass lighting, 1262
- Two’s complement negation, 171
- U
- Unifying models, and optimization, 1110-1111
- Unit normal of polygons, calculating, 1027-1028, 1137-1140
- Unit vectors, dot product, 1136-1137
- Unrolling loops, 143-145, 305, 312, 377-378, 410
- UpdateViewPos function, 1202
- UpdateWorld function, 1205, 1237-1238
-
U-pipe, Pentium processor
- branch instructions, 404-405
- overview, 385-386
- pairable instructions, 388
- V
- Variables, word-sized vs. byte-sized, 82, 83-85
-
Vectors
- cross product, 1139-1140
- cross-products, calculating, 955-956
- dot product, 1135-1137
- length equation, 1135
- optimization of, 986
- unit vectors, dot product, 1136-1137
-
VectorsUp function
- Bresenham’s line-drawing algorithm, 664-665
- 360x480 256-color mode line drawing program, 617-618
- Verite Quake, 1287-1280
- Vertex-free surfaces, and beam trees, 1187
- Vertical blanking, loading DAC, 641
- Vertical resolution, 360x480 256-color mode, 619
- Vertical scanlines, in texture mapping, 1084-1086
-
Vertical sync pulse
- loading DAC, 641, 648
- and page flipping, 444-446, 835-836
- split screens, 573
-
VGA BIOS
-
DAC (Digital/Analog Converter)
- loading, 641-642, 648
- setting registers, 630, 631-632
- vs. direct hardware programming, 458-459
- function 13H, 459
- and nonstandard modes, 854-855
- palette RAM, setting registers, 629-630, 631-632
- reading from DAC, 652
- text routines, in 320x400 256-color mode, 592
- and VGA registers, 458
-
VGA clones
- potential incompatibilities, 446-447
- 360x480 256-color mode, 610-611
-
VGA color path
- color paging, 628-629
- DAC (Digital/Analog Converter), 626-628, 630, 631-632
- palette RAM, 626, 629-630, 631-632
- VGA compatibility, 446-447, 610-611
-
VGA memory
- Color Don’t Care register, 535-537, 535
- CPU reads, 520, 526
-
VGA modes
- bit-plane animation, 811
- color compare mode, 531-534, 531
- mode 0, set/reset circuitry, 471-472, 474-479
- mode 12H (hi-res mode), page flipping, 851-855
-
mode 13H
- converting to 320x400 256-color mode, 593
- overview, 515
- resolution, 590
-
Mode X
- bitmap organization, 882-883
- copying pixels using latches, 905-907, 908, 909-911
- features, 878-879
- four-plane parallel processing, 888-891, 891-893
- masked copying, 916-918, 916, 918-919, 919-921
- memory allocation, 903-904
- mode set routine, 880-881, 882
- pattern fills, 899, 900-903, 903-904
- pixel-by-pixel plane selection, 885-887
- plane-by-plane processing, 887-889
- ReadPixelX subroutine, 884-885
- WritePixelX subroutine, 883-884
- and page flipping, 444-445
-
read mode 1
- Color Don’t Care register, 534
- overview, 525-526, 531
- selecting, 525
- and set/reset circuitry, 478
- 640x400 mode set routine, 852-853
- split screen operations, 584-585
- text mode, panning, 443
-
320x400 256-color mode
- advantages, 590-591
- converting mode 13H to, 593
- display memory organization, 591-593
- page flipping demo program, 600-605
- and virtual screens, 441
- write mode 0, drawing text, 832-833
- write mode 1, overview, 444
-
write mode 2
- chunky bitmaps, converting to planar, 504-505, 505-508
- mechanics, 502
- overview, 501-502
- selecting, 504
-
write mode 3
- vs. Bit Mask register, 844
- drawing bitmapped text, 484-489, 489-490, 490-496
- overview, 483-484, 496
- single-color drawing, 831-832
- vs. write mode 0, 490
-
VGA registers
- AC Index register, bit 5 settings, 443
-
Bit Mask register
- bit mask, controlling, 465
- drawing solid text, 1040
- setting inside a loop, 429
- vs. write mode 3, 832, 844
- Color Compare register, in read mode 1, 531
- Color Don’t Care register, in read mode 1, 534
- Color Select register, color paging, 628-629
- Data register, loading DAC, 642-643
-
Data Rotate register
- barrel shifter, controlling, 463
- vs. CPU-based rotations, 489
- effect on ALUs, 452
-
Enable Set/Reset register
- setting drawing color, 666
- specifying plane, 474
-
Graphics Mode register
- read mode 0, selecting, 525
- read mode 1, selecting, 531
- and high-level languages, 548
- Horizontal Pel Panning register, 442
- internal indexing, 427-429
- Line Compare register, split screen operation, 565
-
Map Mask register
- drawing text, 833
- optimizing Mode X, 1074
- vs. Read Map register, 526
- selecting planes for CPU writes, 443-444, 471-472
- with set/reset circuitry, 474
- write mode 1, 444
- Mask register, blanking screen, 651
- Mode Control register, pel panning in split screen, 575
-
Mode register
- color paging, 628-629
- 256-color modes, 629
- Overflow register, split screen operation, 565
- palette RAM registers, setting, 631-632
- Pel Panning register, 574, 583
- Read Index register, 651-652
-
Read Map register
- plane, selecting, for CPU reads, 526
- planes, specifying to be read, 542
- Set/Reset register, setting drawing color, 666
- setting, 504, 558
- setting and reading, 582
- Start Address High and Low registers, 834-836
- and VGA BIOS, 458
-
Write Index register
- DAC index wrapping, 651
- loading DAC, 642-643
-
VGA (Video Graphics Adapter)
- ALU and latch demo program, 453-457, 458-460
-
architecture, 426-429
- ALUs, 451-452
- barrel shifter, 463-464
- bit mask, 464-471
- latches, 452-453
- set/reset circuitry, 471-479
- ball animation demo program, 431-441
- CGA compatibility, 430
- delay sequences, 558
- and display adapter cycle-eater, 104-108
- display memory, 446
- fill patterns, drawing, 453
- GC (Graphics Controller), architecture, 451-453, 463-479
- I/O access times, 842-844
- linear addressing, 430
- memory access times, 842-844
- overview, 426
- page flipping, 444-446
- panning, 441-443
- performance, with 486 processor, 842-844
- potential incompatibilities, 446-447
- registers, internal indexing, 426-429
- screens, capturing and restoring, 541-542, 543-547, 547-548
-
split screens
- horizontal panning, 574-575, 575-582, 583
- overview, 563-565
- registers, setting, 573
- safety of, 585
- split screen demo program, 565, 566-572, 572
- text mode, 584
- turning on and off, 565
- 25 MHz clock and 28 MHz clock, switching between, 620-621
-
virtual screens
- overview, 430
- panning, 441-443
- Video function 10H, EGA BIOS, 550-551, 555
- Viewing angle, and BSP tree rendering, 1157-1158
- Viewing variance, 1249
-
Viewspace
- defined, 1135
- and normals of polygons, 1137-1138
- in 3-D transformation, 935
- transformation to, BSP rendering, 1158
- uses for, 967
- Viewspace clipping, 1207
-
Virtual screens
- overview, 430
- panning, 441-443
-
Visibility determination
- See also Visible surface determination.
- and BSP trees, 1099-1106
- Visibility of polygons, calculating, 955-956
-
Visible surface determination (VSD)
- beam trees, 1185-1189
- culling to frustum, 1181-1184
- overdraw problem, 1184-1185
- polygon culling, 1181-1184
- and portals, 1279-1280
- potentially visible set (PVS), precalculating, 1188-1189
-
V-pipe, Pentium processor
- branch instructions, 404-405
- overview, 385-386
- V-pipe-capable instructions, 386-387
- VQuake, 1287-1280
- VSD. See Visible surface determination (VSD).
- W
- Wait30Frames function, 854
-
Wait states
-
display memory wait states
- 8088 processor, 101-103
- 286 processor, 220
- vs. DRAM refresh, 100
- overview, 99
- system memory wait states, 210-213
- WaitForVerticalSyncEnd subroutine, 569, 579-580
- WaitForVerticalSyncStart subroutine, 569, 579
- WalkBSPTree function, 1106
-
WalkTree function
- code recursive version, 1108
- data recursive version, 1109-1110
- Wall orientation testing, BSP tree rendering, 1160-1161
- WC word counting program (TerjeMathisen), optimization, 250-252, 306, 319
- Williams, Rob, 174
- Winnie the Pooh orbiting Saturn, 1047
- WinQuake, 1290
-
Word alignment, 286 processor
- code alignment, 215-218
- data alignment, 213-215
- stack pointer alignment, 218-219
-
Word count program
- edge triggered device, 316
- fine-tuning optimization, 312-313
- initial C implementation, 299
- lookup table, 303, 304, 317-319
-
ScanBuffer assembly routine
- author’s implementation, 301-302
- Stafford, David’s, 309-311, 317-319
- Willem Clements’ implementation, 313-315
- as state machine, 315
- theoretical maximum performance, 319
- Word-OUT instruction, 429
-
Word-sized variables, 8088 processor
- memory access, 82
- optimization, 83-85
- World, drawing, in Quake 3-D engine, 1280-1281
-
Worldspace
- defined, 1135
- in 3-D transformation, 935
- uses for, 967
-
Write Index register
- DAC index wrapping, 651
- loading DAC, 642-643
-
Write mode 0
- drawing text, 832-833
- vs. write mode 2, 503
-
Write mode 1
- overview, 444
- vs. write mode 3, 490
-
Write mode 2
- chunky bitmaps, converting to planar, 504-505, 505-508
- color-patterned lines demo program, 509-515
- mechanics, 502
- overview, 501-502
- selecting, 504
- vs. set/reset circuitry, 509, 515
- vs. write mode 0, 503
-
Write mode 3
- vs. Bit Mask register, 844
- character/attribute map, 517
- drawing bitmapped text, 484-489, 489-490, 490-496
- drawing solid text, 1039-1041, 1042-1044
- graphics, preserving on switch to, 515-517, 518-521
- overview, 483-484, 496
- single-color drawing, 831-832
- vs. write mode 1, 490
- Write mode 3 demo program, 484-489, 489-490, 490-496
-
Write modes, VGA
- and set/reset circuitry, 478
- text, drawing, 484, 490, 496
- Write-after-write register contention, 404
- WritePixel subroutine, 597, 599
- WritePixelX subroutine, 883-884
-
Writing pixels
- 320x400 256-color mode, 599, 600
-
Wu antialiasing algorithm
- assembly implementation, 787-791
- C-language implementation, 780-786
- description, 776-778, 791-792
- error accumulation, 778-779, 792
- performance, 777-778
- pixel intensity calculations, 778-779
- Wu, Xiaolin. See Wu antialiasing algorithm.
- X
-
X86 family CPUs
- See also 8088 processor.
- 32-bit division, 181-184, 1008
- branching, performance, 140
- copying bytes between registers, 172
- interrupts, 9
- limitations for assembly programmers, 27
- lookup tables, vs. rotating or shifting, 145-146
- LOOP instruction vs. DEC/JNZ sequence, 139
- machine instructions, versatility, 128
- memory addressing modes, 129-133
- overview, 208
- transformation inefficiencies, 26
- XCHG instruction, 377, 832
- X-clipping, in BSP tree rendering, 1159
- XformAndProjectPObject function, 974
- XformAndProjectPoints function, 960
- XformAndProjectPoly function, 944-945
-
XformVec function
- assembly implementation, 996-997, 1017-1019
- C implementation, 943, 976
-
XLAT instruction
- in Boyer-Moore algorithm, 274-277
- byte registers, 243
- with lookup table, 304
- XOR instruction, vs. NOT, 147
-
X-Sharp 3-D animation package
- AppendRotationX function, 975
- AppendRotationY function, 964-965, 975
- AppendRotationZ function, 965, 976
- code archives on diskette, 985
-
ConcatXforms function
- assembly implementation, 997-999, 1019-1022
- C implementations, 944, 976
- CosSin subroutine, 994-996, 999, 1013-1015
-
DDA (digital differential analyzer) texture mapping
- assembly implementation, 1069-1073, 1074
- C implementation, 1053-1058
- disadvantages, 1052-1053, 1059
- DrawTexturedPolygon, 1055-1056
- hardware dependence, 1053
- multiple adjacent polygons, 1068
- optimized implementation, 1069-1073, 1074
- orientation independence, 1065-1067, 1067
- performance, 1074
- ScanOutLine function, 1058-1059, 1067
- SetUpEdge function, 1057-1058
- StepEdge function, 1056-1057
- techniques, 1048-1051
-
DrawPObject function, 978-979
- ambient and diffuse shading support, 1025-1027
- FixedDiv subroutine, 982, 993, 1010-1012
- FIXED_MUL macro, 1016-1017
- FixedMul subroutine, 981, 993-994, 1009-1010
- InitializeCubes function, 980-981
- InitializeFixedPoint function, 977
- matrix math, assembly routines, 992, 996-999
- ModelColorToColorIndex function, 1036, 1038
- older processors, support for, 1007-1008, 1008-1023
- overview, 984-985
- POLYGON.H header file, 982-984
-
RGB color model
- mapping to 256-color mode, 1036, 1037-1038, 1039
- overview, 1034-1035
- RotateAndMovePObject function, 977-978
- XformAndProjectPObject function, 974
-
XformVec function
- assembly implementation, 996-997, 1017-1019
- C implementation, 976
-
XSortAET function
- complex polygons, 748
- monotone-vertical polygons, 769
- Y
- Yaw angle, in polygon clipping, 1206
- Y-clipping, in BSP tree rendering, 1159
- Z
-
Z-buffers
- performance, 1213
- Quake 3-D engine, 1285-1286
- vs. sorted spans, 1215
- sorting moving models, 1212-1213
- Z-clipping, in BSP tree rendering, 1158
-
Zen timer
- See also Long-period Zen timer.
- calling, 48
- calling from C code, 69-72
- and DRAM refresh, 99
- and interrupts, 43
- interval length, 45
- overhead of, timing, 46, 72
- PC compatibility, 48-49
- precision, 48, 52
- prefetch queue cycle-eater, 88, 92
- PS/2 compatibility, 66
- PZTEST.ASM listing, 49
- PZTIME.BAT listing, 51
- PZTIMER.ASM listing, 35-42
- ReferenceZTimerOff subroutine, 41
- ReferenceZTimerOn subroutine, 40
- reporting results, 47
- starting, 43
- stopping, 46
- system clock inaccuracies, 43, 45-46, 48
- test-bed program, 48-52
- TESTCODE listing, 50
- timing 486 code, 245-246
- ZTimerOff subroutine, 38-41, 46-47
- ZTimerOn subroutine, 37-38, 43
- ZTimerReport subroutine, 41-42, 47-48
- Zero-wait-state memory, 211
- Z-order display, masked images, 872
- Z-sorting, for hidden surface removal, 1220-1222
- ZSortObjects function, 1201
-
ZTimerOff subroutine
- long-period Zen timer, 59-63
- Zen timer, 38-41, 46-47
-
ZTimerOn subroutine
- long-period Zen timer, 58-59
- Zen timer, 37-38, 43
-
ZTimerReport subroutine
- long-period Zen timer, 63-65
- Zen timer, 41-42, 47-48
Graphics Programming Black Book © 2001 Michael Abrash