From 983124da7cfafca83757ea7fbaaec7b14c7efa2b Mon Sep 17 00:00:00 2001 From: James Gregory Date: Mon, 20 Jan 2014 20:34:29 +1100 Subject: [PATCH 01/55] Mention the releases and online versions --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index cd279ff..9785661 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ This is the source for an ebook version of Michael Abrash's Black Book of Graphi Reproduced with permission of Michael Abrash, converted and maintained by [James Gregory](mailto:james@jagregory.com). +The [Github releases list](https://github.com/jagregory/abrash-black-book/releases) has an Epub and Mobi version available for download, and you can find a mirror of the HTML version at [www.jagregory.com/abrash-black-book](http://www.jagregory.com/abrash-black-book/). + ## How does this differ from the previously released versions? The book is now out of print, and hard to come by. Last time I checked it was going for over $200 on ebay. From 340429d486a969dec509728cb8eb59acff75f754 Mon Sep 17 00:00:00 2001 From: Michael Stum Date: Mon, 27 Jan 2014 22:49:56 -0800 Subject: [PATCH 02/55] Chapter 1 typos --- src/chapter-01.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/chapter-01.md b/src/chapter-01.md index fc56d44..91f721a 100644 --- a/src/chapter-01.md +++ b/src/chapter-01.md @@ -254,7 +254,7 @@ requires over two and one-half minutes to checksum *one* file! These results make it clear that it's folly to rely on your compiler's optimization to make your programs fast. Listing 1.1 is simply poorly designed, and no amount of compiler optimization will compensate for -that failing. To drive home the point, conListings 1.2 and 1.3, which +that failing. To drive home the point, Listings 1.2 and 1.3, which together are equivalent to Listing 1.1 except that the entire checksum loop is written in tight assembly code. The assembly language implementation is indeed faster than any of the C versions, as shown in @@ -419,7 +419,7 @@ Listing 1.1. How can we speed up Listing 1.1? It should be clear that we must somehow avoid invoking DOS for every byte in the file, and that means reading more than one byte at a time, then buffering the data and parceling it -out for examination one byte at a time. By gosh, that's a description of +out for examination one byte at a time. My gosh, that's a description of C's stream I/O feature, whereby C reads files in chunks and buffers the bytes internally, doling them out to the application as needed by reading them from memory rather than calling DOS. Let's try using stream @@ -500,7 +500,7 @@ your programs that directly affect response time. Notice, for example, that I haven't bothered to implement a version of the checksum program entirely in assembly; Listings 1.2 and 1.6 call assembly subroutines that handle the time-critical operations, but C is still used for -checking command-line parameters, operning files, printing, and the +checking command-line parameters, opening files, printing, and the like. > ![](images/i.jpg) @@ -521,7 +521,7 @@ Listing 1.4 is good, but let's see if there are other—perhaps less obvious—ways to get the same results faster. Let's start by considering why Listing 1.4 is so much better than Listing 1.1. Like `read()`, `getc()` calls DOS to read from the file; the speed improvement of -Listing 1.4 over Listing 1.1 occurs because `getc()` eads many bytes +Listing 1.4 over Listing 1.1 occurs because `getc()` reads many bytes at once via DOS, then manages those bytes for us. That's faster than reading them one at a time using `read()`—but there's no reason to think that it's faster than having our program read and manage blocks @@ -563,7 +563,7 @@ The third reason is often fallacious. C library functions are not always written in assembly, nor are they always particularly well-optimized. (In fact, they're often written for *portability*, which has nothing to do with optimization.) What's more, they're general-purpose functions, -and often can be outperformed by well-but-not- brilliantly-written code +and often can be outperformed by well-but-not-brilliantly-written code that is well-matched to a specific task. As an example, consider Listing 1.5, which uses internal buffering to handle blocks of bytes at a time. Table 1.1 shows that Listing 1.5 is 2.5 to 4 times faster than Listing @@ -667,7 +667,7 @@ indeed make a significant difference. Table 1.1 indicates that the optimized version of Listing 1.5 produced by Microsoft C outperforms an unoptimized version of the same code by more than 60 percent. What's more, a mostly-assembly version of Listing 1.5, shown in Listings 1.6 -and 1.7, outperforms even the best-optimized C version of List1.5 by 26 +and 1.7, outperforms even the best-optimized C version of Listing 1.5 by 26 percent. These are considerable improvements, well worth pursuing—once the design has been maxed out. From e54d0fa5d262a7ba6932e5ede7293c607e571e2e Mon Sep 17 00:00:00 2001 From: Michael Stum Date: Mon, 27 Jan 2014 23:04:19 -0800 Subject: [PATCH 03/55] Chapter 2 typos --- src/chapter-02.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-02.md b/src/chapter-02.md index 5143edb..c283050 100644 --- a/src/chapter-02.md +++ b/src/chapter-02.md @@ -293,7 +293,7 @@ all the more so given that compilers are constrained by the limitations of high-level languages and by the process of transformation from high-level to machine language. Consequently, carefully optimized assembly is not just the language of choice but the *only* choice for -the 1percent to 10 percent of code—usually consisting of small, +the 1 percent to 10 percent of code—usually consisting of small, well-defined subroutines—that determines overall program performance, and it is the only choice for code that must be as compact as possible, as well. In the run-of-the-mill, non-time-critical portions of your From 753657938b57fa9bc3e5c635c70c863d15cf4c55 Mon Sep 17 00:00:00 2001 From: Michael Stum Date: Tue, 28 Jan 2014 00:18:10 -0800 Subject: [PATCH 04/55] Chapter 3 typos (and 1 Chapter 2 one) --- src/chapter-02.md | 2 +- src/chapter-03.md | 160 +++++++++++++++++++++++----------------------- 2 files changed, 81 insertions(+), 81 deletions(-) diff --git a/src/chapter-02.md b/src/chapter-02.md index c283050..25baba6 100644 --- a/src/chapter-02.md +++ b/src/chapter-02.md @@ -200,7 +200,7 @@ enough. The single most critical aspect of the hardware, and the one about which it is hardest to learn, is the CPU. The x86 family CPUs have a complex, irregular instruction set, and, unlike most processors, they are neither -straightforward nor wellregarding true code performance. What's more, +straightforward nor well-documented true code performance. What's more, assembly is so difficult to learn that most articles and books that present assembly code settle for code that just works, rather than code that pushes the CPU to its limits. In fact, since most articles and diff --git a/src/chapter-03.md b/src/chapter-03.md index 2afe5ce..0b91926 100644 --- a/src/chapter-03.md +++ b/src/chapter-03.md @@ -671,7 +671,7 @@ count reaches zero, the timer turns over and starts counting down again without stopping, and a pulse is generated for a single clock period. While the pulse is not held for nearly as long as in square wave mode, it doesn't matter, since the 8259 interrupt controller is configured in -the PC to be edgeand hence cares only about the existence of a pulse +the PC to be edge-triggered and hence cares only about the existence of a pulse from timer 0, not the duration of the pulse. As a result, timer 0 continues to generate timer interrupts in divide-by-N mode, and the system clock continues to maintain good time. @@ -688,7 +688,7 @@ the Zen timer shown in Listing 3.1 supports. In fact, the Zen timer shown in Listing 3.1 can only time intervals of up to about 54 ms in length, since that is the period of time that can be measured by timer 0 before its count turns over and repeats. -fifty-four ms may not seem like a very long time, but even a CPU as slow +Fifty-four ms may not seem like a very long time, but even a CPU as slow as the 8088 can perform more than 1,000 divides in 54 ms, and division is the single instruction that the 8088 performs most slowly. If a measured period turns out to be longer than 54 ms (that is, if timer 0 @@ -730,11 +730,11 @@ restart until the timing interval ends, losing time all the while. The effects on the system time of the Zen timer aren't a matter for great concern, as they are temporary, lasting only until the next warm -or cold boot. System that have batteryclocks, (AT-style machines; that +or cold boot. System that have battery-backed clocks, (AT-style machines; that is, virtually all machines in common use) automatically reset the correct time whenever the computer is booted, and systems without -battery-clocks prompt for the correct date and time when booted. -Also,repeated use of the Zen timer usually makes the system clock slow +battery-backed clocks prompt for the correct date and time when booted. +Also, repeated use of the Zen timer usually makes the system clock slow by at most a total of a few seconds, unless code that takes much longer than 54 ms to run is timed (in which case the Zen timer will notify you that the code is too long to time). @@ -789,8 +789,8 @@ from timer counts to microseconds, and prints the resulting time in microseconds to the standard output. Note that `ZTimerReport` need not be called immediately after -`ZTimerOff`. In fact, after a given call to `ZTimerOff, -ZTimerReport` can be called at any time right up until the next call to +`ZTimerOff`. In fact, after a given call to `ZTimerOff`, +`ZTimerReport` can be called at any time right up until the next call to `ZTimerOn`. You may want to use the Zen timer to measure several portions of a @@ -880,7 +880,7 @@ performance will be similar even on different IBM models; in fact, quite the opposite is true. For example, every PS/2 computer, even the relatively slow Model 30, executes code much faster than does a PC or XT. As another example, I set out to do the timings for my earlier book -*Zen of Assembly Language* on an XTcomputer, only to find that the +*Zen of Assembly Language* on an XT-compatible computer, only to find that the computer wasn't quite IBM-compatible regarding code performance. The differences were minor, mind you, but my experience illustrates the risk of assuming that a specific make of computer will perform in a certain @@ -996,7 +996,7 @@ timing interval. Listing 3.3 is used by naming it TESTCODE, assembling both Listing 3.2 (which includes TESTCODE) and Listing 3.1 with TASM or MASM, and linking -the two resulting OBJ files together by way of the Borland orMicrosoft +the two resulting OBJ files together by way of the Borland or Microsoft linker. Listing 3.4 shows a batch file, PZTIME.BAT, which does all that; when run, this batch file generates and runs the executable file PZTEST.EXE. PZTIME.BAT (Listing 3.4) assumes that the file PZTIMER.ASM @@ -1111,8 +1111,8 @@ pztime In fact, that's exactly how I timed each of the listings in this book. Code fragments you write yourself can be timed in just the same way. If you wish to time code directly in place in your programs, rather than in -the test-bed program of Listing 3.2, simply insert calls to `ZTimerOn, -ZTimerOff`, and `ZTimerReport` in the appropriate places and link +the test-bed program of Listing 3.2, simply insert calls to `ZTimerOn`, +`ZTimerOff`, and `ZTimerReport` in the appropriate places and link PZTIMER to your program. ### The Long-Period Zen Timer @@ -1303,8 +1303,8 @@ computers. ; All registers and all flags are preserved by all routines. ; -Code segment word public ‘CODE' - assume cs: Code, ds:nothing +Code segment word public 'CODE' + assume cs:Code, ds:nothing public ZTimerOn, ZTimerOff, ZTimerReport ; @@ -1326,24 +1326,24 @@ Code segment word public ‘CODE' ; which support the undocumented timer-stopping feature of the ; 8253. The choice is yours. ; -PS2 equ1 +PS2 equ 1 ; ; Base address of the 8253 timer chip. ; -BASE_8253 equ40h +BASE_8253 equ 40h ; ; The address of the timer 0 count registers in the 8253. ; -TIMER_0_8253 equBASE_8253 + 0 +TIMER_0_8253 equ BASE_8253 + 0 ; ; The address of the mode register in the 8253. ; -MODE_8253 equBASE_8253 + 3 +MODE_8253 equ BASE_8253 + 3 ; ; The address of the BIOS timer count variable in the BIOS ; data segment. ; -TIMER_COUNT equ46ch +TIMER_COUNT equ 46ch ; ; Macro to emulate a POPF instruction in order to fix the bug in some ; 80286 chips which allows interrupts to occur during a POPF even when @@ -1353,9 +1353,9 @@ MPOPF macro local p1, p2 jmp short p2 p1: iret ;jump to pushed address & pop flags -p2: pushcs ;construct far return address to +p2: push cs ;construct far return address to call p1 ; the next instruction -endm + endm ; ; Macro to delay briefly to ensure that enough time has elapsed @@ -1383,11 +1383,11 @@ ReferenceCount dw ? ;number of counts required to ; ; String printed to report results. ; -OutputStr labelbyte - db 0dh, 0ah, ‘Timed count: ‘ -TimedCountStr db10 dup (?) - db' microseconds', 0dh, 0ah - db ‘$' +OutputStr label byte + db 0dh, 0ah, 'Timed count: ' +TimedCountStr db 10 dup (?) + db ' microseconds', 0dh, 0ah + db '$' ; ; Temporary storage for timed count as it's divided down by powers ; of ten when converting from doubleword binary to ASCII. @@ -1398,7 +1398,7 @@ CurrentCountHigh dw ? ; Powers of ten table used to perform division by 10 when doing ; doubleword conversion from binary to ASCII. ; -PowersOfTenlabelword +PowersOfTen label word dd 1 dd 10 dd 100 @@ -1409,33 +1409,33 @@ PowersOfTenlabelword dd 10000000 dd 100000000 dd 1000000000 -PowersOfTenEnd labelword +PowersOfTenEnd label word ; ; String printed to report that the high word of the BIOS count ; changed while timing (an hour elapsed or midnight was crossed), ; and so the count is invalid and the test needs to be rerun. ; -TurnOverStrlabelbyte - db 0dh, 0ah - db ‘****************************************************' +TurnOverStr label byte db 0dh, 0ah - db'* Either midnight passed or an hour or more passed *' + db '****************************************************' db 0dh, 0ah - db'* while timing was in progress. If the former was *' + db '* Either midnight passed or an hour or more passed *' db 0dh, 0ah - db'* the case, please rerun the test; if the latter *' + db '* while timing was in progress. If the former was *' db 0dh, 0ah - db'* was the case, the test code takes too long to *' + db '* the case, please rerun the test; if the latter *' db 0dh, 0ah - db'* run to be timed by the long-period Zen timer. *' + db '* was the case, the test code takes too long to *' db 0dh, 0ah - db ‘* Suggestions: use the DOS TIME command, the DOS *' + db '* run to be timed by the long-period Zen timer. *' db 0dh, 0ah - db ‘* time function, or a watch. *' + db '* Suggestions: use the DOS TIME command, the DOS *' db 0dh, 0ah - db ‘****************************************************' + db '* time function, or a watch. *' db 0dh, 0ah - db'$' + db '****************************************************' + db 0dh, 0ah + db '$' ;******************************************************************** ;* Routine called to start timing. * @@ -1447,7 +1447,7 @@ ZTimerOn proc near ; Save the context of the program being timed. ; push ax - pus hf + pushf ; ; Set timer 0 of the 8253 to mode 2 (divide-by-N), to cause ; linear counting rather than count-by-two counting. Also stops @@ -1463,10 +1463,10 @@ ZTimerOn proc near ; clock count each time it is executed. ; DELAY - subal,al - outTIMER_0_8253,al ;lsb + sub al,al + out TIMER_0_8253,al ;lsb DELAY - outTIMER_0_8253,al ;msb + out TIMER_0_8253,al ;msb ; ; In case interrupts are disabled, enable interrupts briefly to allow ; the interrupt generated when switching from mode 3 to mode 2 to be @@ -1488,12 +1488,12 @@ ZTimerOn proc near ; interrupts in order to avoid getting a half-changed count.) ; push ds - subax, ax - movds, ax - movax, ds:[TIMER_COUNT+2] - movcs: [StartBIOSCountHigh],ax - movax, ds:[TIMER_COUNT] - movcs: [StartBIOSCountLow],ax + sub ax, ax + mov ds, ax + mov ax, ds:[TIMER_COUNT+2] + mov cs:[StartBIOSCountHigh],ax + mov ax, ds:[TIMER_COUNT] + mov cs:[StartBIOSCountLow],ax pop ds ; ; Set the timer count to 0 again to start the timing interval. @@ -1501,7 +1501,7 @@ ZTimerOn proc near mov al,00110100b ;set up to load initial out MODE_8253,al ; timer count DELAY - subal, al + sub al, al out TIMER_0_8253,al; load count lsb DELAY out TIMER_0_8253,al; load count msb @@ -1512,20 +1512,20 @@ ZTimerOn proc near popax ret -ZTimerOnendp +ZTimerOn endp ;******************************************************************** ;* Routine called to stop timing and get count. * ;******************************************************************** -ZTimerOff procnear +ZTimerOff proc near ; ; Save the context of the program being timed. ; pushf - pushax - pushcx + push ax + push cx ; ; In case interrupts are disabled, enable interrupts briefly to allow ; any pending timer interrupt to be handled. Interrupts must be @@ -1618,7 +1618,7 @@ ife PS2 endif -sti;let the BIOS count continue + sti ;let the BIOS count continue ; ; Time a zero-length code fragment, to get a reference for how ; much overhead this routine has. Time it 16 times and average it, @@ -1633,14 +1633,14 @@ RefLoop: call ReferenceZTimerOff loop RefLoop sti - add cs:[ReferenceCount],8; total + (0.5 * 16) + add cs:[ReferenceCount],8 ;total + (0.5 * 16) mov cl,4 - shr cs:[ReferenceCount],cl;(total) / 16 + 0.5 + shr cs:[ReferenceCount],cl ;(total) / 16 + 0.5 ; ; Restore the context of the program being timed and return to it. ; - popcx - popax + pop cx + pop ax MPOPF ret @@ -1650,11 +1650,11 @@ ZTimerOff endp ; Called by ZTimerOff to start the timer for overhead measurements. ; -ReferenceZTimerOnprocnear +ReferenceZTimerOn proc near ; ; Save the context of the program being timed. ; - pushax + push ax pushf ; ; Set timer 0 of the 8253 to mode 2 (divide-by-N), to cause @@ -1677,7 +1677,7 @@ ReferenceZTimerOnprocnear popax ret -ReferenceZTimerOnendp +ReferenceZTimerOn endp ; ; Called by ZTimerOff to stop the timer and add the result to @@ -1686,20 +1686,20 @@ ReferenceZTimerOnendp ; isn't going to take anywhere near 54 ms. ; -ReferenceZTimerOff procnear +ReferenceZTimerOff proc near ; ; Save the context of the program being timed. ; pushf - pushax - pushcx + push ax + push cx ; ; Match the interrupt-window delay in ZTimerOff. ; sti - rept10 - jmp$+2 + rept 10 + jmp $+2 endm mov al,00000000b @@ -1720,8 +1720,8 @@ ReferenceZTimerOff procnear ; ; Restore the context and return. ; - popcx - popax + pop cx + pop ax MPOPF ret @@ -1731,7 +1731,7 @@ ReferenceZTimerOff endp ;* Routine called to report timing results. * ;******************************************************************** -ZTimerReportprocnear +ZTimerReport proc near pushf push ax @@ -1741,7 +1741,7 @@ ZTimerReportprocnear push si push di push ds - ; +; push cs ;DOS functions require that DS point pop ds ; to text to be displayed on the screen assume ds :Code @@ -1780,7 +1780,7 @@ TestTooLong: ; Convert the BIOS time to microseconds. ; CalcBIOSTime: - mov ax,[EndBIOSCountLow] + mov ax,[EndBIOSCountLow] sub ax,[StartBIOSCountLow] mov dx,54925 ;number of microseconds each ; BIOS count represents @@ -1808,7 +1808,7 @@ CalcBIOSTime: mov si,8381 ;convert the reference count mul si ; to microseconds mov si,10000 - div si;* .8381 = * 8381 / 10000 + div si ;* .8381 = * 8381 / 10000 sub bx,ax sbb cx,0 mov [CurrentCountLow],bx @@ -1896,7 +1896,7 @@ substantially. Finally, please note that the *precision* Zen timer works perfectly well on both PS/2 and non-PS/2 computers. The PS/2 and 8253 considerations -we've just discussed apply *only* to the longZen timer. +we've just discussed apply *only* to the long-period Zen timer. ### Example Use of the Long-Period Zen Timer @@ -2126,7 +2126,7 @@ be dealt with here: small code model and large; I'll tackle the simpler one, the small code model, first. Altering the Zen timer for linking to a small code model C program -involves the following steps: `C` hange `ZTimerOn` to +involves the following steps: Change `ZTimerOn` to `_ZTimerOn`, change `ZTimerOff` to `_ZTimerOff`, change `ZTimerReport` to `_ZTimerReport`, and change `Code` to `_TEXT` . Figure 3.2 shows the line numbers and new states of all @@ -2187,16 +2187,16 @@ push cs call near ptr ReferenceZTimerOn ``` -(and likewise for `ReferenceZTimerOff` ), which works because +(and likewise for `ReferenceZTimerOff`), which works because `ReferenceZTimerOn` is in the same segment as the calling code. This is normally a great optimization, being both smaller and faster than a -far call. However, it's not so great for the Zen +far call. ![**Figure 3.3**  *Changes for use with large code model C.*](images/03-03.jpg) -timer, because our purpose in calling the reference timing code is to +However, it's not so great for the Zen timer, because our purpose in calling the reference timing code is to determine exactly how much time is taken by overhead code—including the -far calls to `ZTimerOn` and `ZTimerOf`f! By converting the far calls +far calls to `ZTimerOn` and `ZTimerOf`! By converting the far calls to push/near call pairs within the Zen timer module, TASM makes it impossible to emulate exactly the overhead of the Zen timer, and makes timings slightly (about 16 cycles on a 386) less accurate. @@ -2255,7 +2255,7 @@ processor cache at the start of the code being timed, because the timing code is not necessarily fetched and does not necessarily access memory in exactly the same time sequence as the code immediately preceding the code under measurement normally does. This prefetch effect can introduce -as much as 3 to 4 µ of inaccuracy. Similarly, the state of the prefetch +as much as 3 to 4 µs of inaccuracy. Similarly, the state of the prefetch queue at the end of the code being timed affects how long the code that stops the timer takes to execute. Consequently, the Zen timer tends to be more accurate for longer code sequences, since the relative magnitude From 548f7146d754054e829859ce0308aa9dd7929217 Mon Sep 17 00:00:00 2001 From: James Gregory Date: Tue, 28 Jan 2014 19:58:11 +1100 Subject: [PATCH 05/55] Revert By->My Gosh, it was right originally. --- src/chapter-01.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-01.md b/src/chapter-01.md index 91f721a..85a9f77 100644 --- a/src/chapter-01.md +++ b/src/chapter-01.md @@ -419,7 +419,7 @@ Listing 1.1. How can we speed up Listing 1.1? It should be clear that we must somehow avoid invoking DOS for every byte in the file, and that means reading more than one byte at a time, then buffering the data and parceling it -out for examination one byte at a time. My gosh, that's a description of +out for examination one byte at a time. By gosh, that's a description of C's stream I/O feature, whereby C reads files in chunks and buffers the bytes internally, doling them out to the application as needed by reading them from memory rather than calling DOS. Let's try using stream From 9ebbb12fc96728c12af9a08a652959fe7bb6fd2c Mon Sep 17 00:00:00 2001 From: James Gregory Date: Thu, 30 Jan 2014 20:50:01 +1100 Subject: [PATCH 06/55] Remove line about rights. They're complicated. --- src/copyright.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/copyright.md b/src/copyright.md index f4240b4..05d6e1d 100644 --- a/src/copyright.md +++ b/src/copyright.md @@ -1,7 +1,5 @@ # About this version -All rights belong to Michael Abrash. Reproduced with permission. - This version was extracted from the PDFs which were [released by Michael Abrash and Dr. Dobbs in 2001](http://www.drdobbs.com/parallel/graphics-programming-black-book/184404919). The intention is to maintain a canonical electronic version of the book, and make it easier to read in other formats and on other devices than were available when the book was released online. For comments, suggestions, and improvements contact James Gregory at [james@jagregory.com](mailto:james@jagregory.com). From 836b1c13a6e2caa4f0e885a44845a9f1663e41e0 Mon Sep 17 00:00:00 2001 From: picomancer Date: Thu, 30 Jan 2014 16:52:13 -0500 Subject: [PATCH 07/55] README.md: Fix typos; improve grammar and spelling. --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9785661..784036c 100644 --- a/README.md +++ b/README.md @@ -8,17 +8,17 @@ The [Github releases list](https://github.com/jagregory/abrash-black-book/releas ## How does this differ from the previously released versions? -The book is now out of print, and hard to come by. Last time I checked it was going for over $200 on ebay. +The book is now out of print, and hard to come by. Last time I checked, it was going for over $200 on ebay. -The version which Michael and Dr. Dobbs released in 2001 was as a collection PDFs. This version is [still available](http://www.drdobbs.com/parallel/graphics-programming-black-book/184404919); however, the structure (multiple files) and the format (PDF) doesn't lend itself well to reading on a ebook reader or other mobile device. +The version which Michael and Dr. Dobbs released in 2001 was a collection of PDF files. That version is [still available](http://www.drdobbs.com/parallel/graphics-programming-black-book/184404919). However, the structure (multiple files) and the format (PDF) result in a poor user experience on an ebook reader or other mobile device. -This version has been thoroughly cleaned of artefacts and condensed into something which can be easily converted into a ebook friendly format. You can read this version online at Github, or download any of the Epub or Mobi releases. You can clone the repository and generate your own version with [pandoc](http://johnmacfarlane.net/pandoc/) if necessary. +This version has been thoroughly cleaned of artifacts and condensed into something which can easily be converted into an ebook-friendly format. You can read this version online at Github, or download any of the Epub or Mobi releases. You can clone the repository and generate your own version with [pandoc](http://johnmacfarlane.net/pandoc/) if necessary. ## Contributing -Changes are welcome, especially conversion related ones. If you spot any issues whilst reading, please submit an issue and I'll correct it. Pull Requests are always welcome. +Changes are welcome, especially conversion-related ones. If you spot any problems while reading, please [submit an issue](https://github.com/jagregory/abrash-black-book/issues) and I'll correct it. Pull Requests are always welcome. -There's some larger changes that could be made to help preserve the content longer term. I'd love to see some of the images converted to a vector representation so we can provide higher-resolution versions, and similarly formulas and maths could be represented in MathML. +Some larger changes could be made to improve the content. I'd love to see some of the images converted to a vector representation so we can provide higher-resolution versions. Formulas and equations could be typeset with MathML. ## Generating your own ebook From 0bcbb14c0ff9d080c81f97d6225d2a31fac21f48 Mon Sep 17 00:00:00 2001 From: picomancer Date: Thu, 30 Jan 2014 17:01:38 -0500 Subject: [PATCH 08/55] README.md: MathML -> MathJax --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 784036c..58cf3ce 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ This version has been thoroughly cleaned of artifacts and condensed into somethi Changes are welcome, especially conversion-related ones. If you spot any problems while reading, please [submit an issue](https://github.com/jagregory/abrash-black-book/issues) and I'll correct it. Pull Requests are always welcome. -Some larger changes could be made to improve the content. I'd love to see some of the images converted to a vector representation so we can provide higher-resolution versions. Formulas and equations could be typeset with MathML. +Some larger changes could be made to improve the content. I'd love to see some of the images converted to a vector representation so we can provide higher-resolution versions. Formulas and equations could be typeset with [MathJax](http://www.mathjax.org/). ## Generating your own ebook From 3c4c99501b5be49aee1657a5757f66dd3a417f92 Mon Sep 17 00:00:00 2001 From: James Gregory Date: Fri, 31 Jan 2014 13:45:02 +1100 Subject: [PATCH 09/55] Change permission to blessing. The rights situation is ambiguous. Michael is happy with this project, and has given permission as much as he is able; sadly, the actual rights to the book are ambiguous, with the publisher going out of business and the PDF being released by Dr. Dobbs Journal. Removed the word permission as to not imply that Michael Abrash has the ability to grant legal permission. He doesn't. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 58cf3ce..b48011e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ This is the source for an ebook version of Michael Abrash's Black Book of Graphics Programming (Special Edition), originally published in 1997 and [released online for free in 2001](http://www.drdobbs.com/parallel/graphics-programming-black-book/184404919). -Reproduced with permission of Michael Abrash, converted and maintained by [James Gregory](mailto:james@jagregory.com). +Reproduced with blessing of Michael Abrash, converted and maintained by [James Gregory](mailto:james@jagregory.com). The [Github releases list](https://github.com/jagregory/abrash-black-book/releases) has an Epub and Mobi version available for download, and you can find a mirror of the HTML version at [www.jagregory.com/abrash-black-book](http://www.jagregory.com/abrash-black-book/). From 1d697446a58cae70e9733c65c5bd5051504d06a0 Mon Sep 17 00:00:00 2001 From: Andrew Steets Date: Fri, 31 Jan 2014 10:09:26 -0600 Subject: [PATCH 10/55] Delete errant space --- src/chapter-06.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-06.md b/src/chapter-06.md index 47c6772..cc797ed 100644 --- a/src/chapter-06.md +++ b/src/chapter-06.md @@ -188,7 +188,7 @@ standard memory addressing operand, but does nothing more than store the calculated memory offset in the specified register, which may be any general-purpose register. The operation of `LEA` is illustrated in Figure 6.1, which also shows the operation of register-to-register -`ADD`, for comparis on. +`ADD`, for comparison. What does that give us? Two things that `ADD` doesn't provide: the ability to perform addition with either two or three operands, and the From e93ef444d4529ffa85ae92dc7f0959ea3ef8d779 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Roh=C3=A9e?= Date: Sat, 1 Feb 2014 14:39:18 +0100 Subject: [PATCH 11/55] misaligned brace in listing 1.5 --- src/chapter-01.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-01.md b/src/chapter-01.md index 85a9f77..0e27fbc 100644 --- a/src/chapter-01.md +++ b/src/chapter-01.md @@ -629,7 +629,7 @@ main(int argc, char *argv[]) { while ( LengthCount-- ) { /* Add each byte in turn into the checksum accumulator */ Checksum += (unsigned int) *WorkingPtr++; - } + } } while ( WorkingLength ); /* Report the result */ From 897e853a42060b5e3338b7c69513d166aeabbfa1 Mon Sep 17 00:00:00 2001 From: Dennis Yurichev Date: Thu, 13 Aug 2015 06:16:59 +0300 Subject: [PATCH 12/55] typos --- src/chapter-03.md | 8 +++--- src/chapter-09.md | 20 +++++++-------- src/chapter-12.md | 2 +- src/chapter-28.md | 2 +- src/chapter-29.md | 2 +- src/chapter-30.md | 4 +-- src/chapter-31.md | 24 +++++++++--------- src/chapter-34.md | 2 +- src/chapter-37.md | 4 +-- src/chapter-39.md | 4 +-- src/chapter-43.md | 12 ++++----- src/chapter-44.md | 6 ++--- src/chapter-46.md | 10 ++++---- src/chapter-48.md | 2 +- src/chapter-53.md | 38 ++++++++++++++-------------- src/chapter-54.md | 64 +++++++++++++++++++++++------------------------ 16 files changed, 102 insertions(+), 102 deletions(-) diff --git a/src/chapter-03.md b/src/chapter-03.md index 0b91926..e183327 100644 --- a/src/chapter-03.md +++ b/src/chapter-03.md @@ -350,9 +350,9 @@ ZTimerOff proc near ; timer interrupt. ; mov al,00001010b ; OCW3, set up to read - out OCW3,al; Int errupt Request register + out OCW3,al ; Interrupt Request register DELAY - ina l,IRR; read Interrupt Request + in al,IRR ; read Interrupt Request ; register and al,1 ; set AL to 1 if IRQ0 (the ; timer interrupt) is pending @@ -1509,7 +1509,7 @@ ZTimerOn proc near ; Restore the context of the program being timed and return to it. ; MPOPF - popax + pop ax ret ZTimerOn endp @@ -1674,7 +1674,7 @@ ReferenceZTimerOn proc near ; Restore the context of the program being timed and return to it. ; MPOPF - popax + pop ax ret ReferenceZTimerOn endp diff --git a/src/chapter-09.md b/src/chapter-09.md index 40631f0..c836fc7 100644 --- a/src/chapter-09.md +++ b/src/chapter-09.md @@ -213,13 +213,13 @@ display modes): ```nasm SHL AX,1 ;*2 -SH LAX,1 ;*4 -SH LAX,1 ;*8 -SH LAX,1 ;*16 -MO VBX,AX -SH LAX,1 ;*32 -SH LAX,1 ;*64 -ADD AX,BX ;*80 +SHL AX,1 ;*4 +SHL AX,1 ;*8 +SHL AX,1 ;*16 +MOV BX,AX +SHL AX,1 ;*32 +SHL AX,1 ;*64 +ADD AX,BX ;*80 ``` Using `LEA` on the 386, the above could be reduced to @@ -242,7 +242,7 @@ Of course, on the 386, the shift and add version could also be reduced to this considerably more efficient code: ```nasm -SH LAX,4 ;*16 +SHL AX,4 ;*16 MOV BX,AX SHL AX,2 ;*64 ADD AX,BX ;*80 @@ -766,9 +766,9 @@ _Divprocnear sub dx,dx ;convert initial divisor word to a 32-bit ;value for DIV DivLoop: - lod sw ;get next most significant word of divisor + lodsw ;get next most significant word of divisor div bx - sto sw ;save this word of the quotient + stosw ;save this word of the quotient ;DX contains the remainder at this point, ; ready to prepend to the next divisor word loop DivLoop diff --git a/src/chapter-12.md b/src/chapter-12.md index 0ccfbfb..12c2ea8 100644 --- a/src/chapter-12.md +++ b/src/chapter-12.md @@ -346,7 +346,7 @@ For example, you'd certainly expect a sequence such as pop ax ret pop ax -et +ret : ``` diff --git a/src/chapter-28.md b/src/chapter-28.md index 9801f5f..2e88c67 100644 --- a/src/chapter-28.md +++ b/src/chapter-28.md @@ -410,7 +410,7 @@ Start proc near mov al,1 ;blue is color 1 call SelectSetResetColor ;set to draw in blue mov ax,VGA_SEGMENT - move s,ax + mov es,ax sub di,di mov cx,7000h rep stosb ;the value written actually doesn't diff --git a/src/chapter-29.md b/src/chapter-29.md index 918f058..da8e8dc 100644 --- a/src/chapter-29.md +++ b/src/chapter-29.md @@ -262,7 +262,7 @@ RestoreTheScreen: RestoreLoop: mov dx,SC_INDEX mov al,MAP_MASK ;set SC Index to Map Mask register -outdx,al + out dx,al inc dx mov cl,[Plane] ;get the # of the plane we want ; to restore diff --git a/src/chapter-30.md b/src/chapter-30.md index 9d2b345..bc390d8 100644 --- a/src/chapter-30.md +++ b/src/chapter-30.md @@ -810,7 +810,7 @@ RowLoop: mov cx,LOGICAL_SCREEN_WIDTH/8/4 ;fill 1 scan line ColumnLoop: - sto sw ;draw part of a diagonal line + stosw ;draw part of a diagonal line mov word ptr es:[di],0 ;make vertical blank spaces so ; panning effects can be seen easily inc di @@ -832,7 +832,7 @@ RowLoop2: mov cx,LOGICAL_SCREEN_WIDTH/8/4 ;fill 1 scan line ColumnLoop2: - sto sw ;draw part of a diagonal line + stosw ;draw part of a diagonal line mov word ptr es:[di],0 ;make vertical blank spaces so ; panning effects can be seen easily inc di diff --git a/src/chapter-31.md b/src/chapter-31.md index 3406187..e5da35b 100644 --- a/src/chapter-31.md +++ b/src/chapter-31.md @@ -373,22 +373,22 @@ Set320By400Mode proc near mov al,MEMORY_MODE out dx,al inc dx - ina l,dx + in al,dx and al,not 08h ;turn off chain 4 - ora l,04h ;turn off odd/even + or al,04h ;turn off odd/even out dx,al mov dx,GC_INDEX mov al,GRAPHICS_MODE out dx,al inc dx - ina l,dx + in al,dx and al,not 10h ;turn off odd/even out dx,al dec dx mov al,MISCELLANEOUS out dx,al inc dx - ina l,dx + in al,dx and al,not 02h ;turn off chain out dx,al ; @@ -677,14 +677,14 @@ stack ends ; OUT_WORDmacro if WORD_OUTS_OK - outdx,ax + out dx,ax else out dx,al inc dx - xch gah,al + xchg ah,al out dx,al dec dx - xch gah,al + xchg ah,al endif endm ; @@ -777,22 +777,22 @@ Set320By400Modeprocnear mov al,MEMORY_MODE out dx,al inc dx - ina l,dx + in al,dx and al,not 08h ;turn off chain 4 - ora l,04h ;turn off odd/even + or al,04h ;turn off odd/even out dx,al mov dx,GC_INDEX mov al,GRAPHICS_MODE out dx,al inc dx - ina l,dx + in al,dx and al,not 10h ;turn off odd/even out dx,al dec dx mov al,MISCELLANEOUS out dx,al inc dx - ina l,dx + in al,dx and al,not 02h ;turn off chain out dx,al ; @@ -830,7 +830,7 @@ CONSTANT_TO_INDEXED_REGISTER SC_INDEX,MAP_MASK,0fh mov al,UNDERLINE out dx,al inc dx - ina l,dx + in al,dx and al,not40h ;turn off doubleword out dx,al dec dx diff --git a/src/chapter-34.md b/src/chapter-34.md index 6f99e27..988d421 100644 --- a/src/chapter-34.md +++ b/src/chapter-34.md @@ -390,7 +390,7 @@ RowLoop: ColumnLoop: stosb ;draw a pixel add al,1 ;increment the attribute - ad cal,0 ;if the attribute just turned + adc al,0 ;if the attribute just turned ; over to 0, increment it to 1 ; because we're not going to ; cycle DAC location 0, so diff --git a/src/chapter-37.md b/src/chapter-37.md index 3585b08..82225f9 100644 --- a/src/chapter-37.md +++ b/src/chapter-37.md @@ -104,7 +104,7 @@ _LineDraw proc near cld push bp ;preserve caller's stack frame mov bp,sp ;point to our stack frame - sub sp, LOCAL_SIZE ;allocate space for local variables + sub sp, LOCAL_SIZE ;allocate space for local variables push si ;preserve C register variables push di push ds ;preserve caller's DS @@ -115,7 +115,7 @@ _LineDraw proc near jle LineIsTopToBottom xchg [bp].YEnd,ax; swap endpoints mov [bp].YStart,ax - movbx, [bp].XStart + mov bx,[bp].XStart xchg [bp].XEnd,bx mov [bp].XStart,bx LineIsTopToBottom: diff --git a/src/chapter-39.md b/src/chapter-39.md index 60ff6ee..4da6d80 100644 --- a/src/chapter-39.md +++ b/src/chapter-39.md @@ -718,7 +718,7 @@ DiagonalSkipEntry: jmp ScanEdgeDone align 2 YMajor: - pushbp ;preserve stack frame pointer + push bp ;preserve stack frame pointer mov si,[bp+X1] ;starting X coordinate cmp [bp+SkipFirst],1 ;skip the first point? mov bp,bx ;put Height in BP for error term calcs @@ -734,7 +734,7 @@ YMajorSkipEntry: YMajorNoAdvance: dec bx ;count off this scan line jnz YMajorLoop - popbp ;restore stack frame pointer + pop bp ;restore stack frame pointer ScanEdgeDone: cmp [bp+SetXStart],1 ;were we working with XStart field? jz UpdateHLinePtr ;yes, DI points to the next XStart diff --git a/src/chapter-43.md b/src/chapter-43.md index 4a866e4..1e8736b 100644 --- a/src/chapter-43.md +++ b/src/chapter-43.md @@ -443,7 +443,7 @@ Dataends ; ; Macro to output a word value to a port. ; -OUT_WORDmacro +OUT_WORD macro if WORD_OUTS_OK out dx,ax else @@ -459,9 +459,9 @@ endif ; Macro to output a constant value to an indexed VGA ; register. ; -CONSTANT_TO_INDEXED_REGISTERmacro ADDRESS, INDEX, VALUE - movdx, ADDRESS - movax, (VALUE shl 8) + INDEX +CONSTANT_TO_INDEXED_REGISTER macro ADDRESS, INDEX, VALUE + mov dx, ADDRESS + mov ax, (VALUE shl 8) + INDEX OUT_WORD endm ; @@ -704,7 +704,7 @@ DrawObject proc near mov dx,ax ;# of lines in the image lodsw ;# of bytes across the image mov bp,SCREEN_WIDTH - subbp,ax ;# of bytes to add to the display + sub bp,ax ;# of bytes to add to the display ; memory offset after copying a line ; of the image to display memory in ; order to point to the address @@ -718,7 +718,7 @@ DrawLoop: ; next line will go in display ; memory dec dx ;count down the lines of the image - jnzDrawLoop + jnz DrawLoop ret DrawObjectendp ; diff --git a/src/chapter-44.md b/src/chapter-44.md index 164f567..d8926c0 100644 --- a/src/chapter-44.md +++ b/src/chapter-44.md @@ -447,7 +447,7 @@ DrawRectParms ends mov dh,RightMask[bx] ;set the right-edge clip mask mov bx,LeftX[bp] and bx,NOT 7 ;intrapixel address of left edge - su si,bx + sub si,bx shr si,1 shr si,1 shr si,1 ;# of bytes across spanned by rectangle - 1 @@ -455,7 +455,7 @@ DrawRectParms ends and dl,dh ; combine the masks MasksSet: mov bx,BottomY[bp] - su bx,TopY[bp] ;# of scan lines to fill - 1 + sub bx,TopY[bp] ;# of scan lines to fill - 1 FillLoop: push di ;remember line start offset mov al,dl ;left edge clip mask @@ -661,7 +661,7 @@ TextUpDone: CharUp: ;draws the character in AL at ES:DI lds si,[BIOS8x8Ptr] ;point to the 8x8 font start mov bl,al - su bh,bh + sub bh,bh shl bx,1 shl bx,1 shl bx,1 ;*8 to look up character offset in font diff --git a/src/chapter-46.md b/src/chapter-46.md index 4e5f0a9..cffd3a1 100644 --- a/src/chapter-46.md +++ b/src/chapter-46.md @@ -499,7 +499,7 @@ parms ends les di,[bp+BufferPtr] mov dx,[bp+RectHeight] mov bx,[bp+BufferWidth] - su bx,[bp+RectWidth] ;distance from end of one dest scan + sub bx,[bp+RectWidth] ;distance from end of one dest scan ; to start of next mov al,byte ptr [bp+Color] mov ah,al ;double the color for REP STOSW @@ -544,7 +544,7 @@ parms2 ends mov bx,[bp+Pixels] mov dx,[bp+ImageHeight] mov ax,[bp+BufferWidth2] - su ax,[bp+ImageWidth] ;distance from end of one dest scan + sub ax,[bp+ImageWidth] ;distance from end of one dest scan mov [bp+BufferWidth2],ax ; to start of next RowLoop2: mov cx,[bp+ImageWidth] @@ -556,7 +556,7 @@ ColumnLoop: mov es:[di],al SkipPixel: inc bx ;point to next source pixel - inc d ;point to next dest pixel + inc di ;point to next dest pixel dec cx jnz ColumnLoop add di,[bp+BufferWidth2] ;point to next scan to fill @@ -596,9 +596,9 @@ parms3 ends lds si,[bp+SrcBufferPtr] mov dx,[bp+CopyHeight] mov bx,[bp+DestBufferWidth] ;distance from end of one dest scan - su bx,[bp+CopyWidth] ; of copy to the next + sub bx,[bp+CopyWidth] ; of copy to the next mov ax,[bp+SrcBufferWidth] ;distance from end of one source scan - su ax,[bp+CopyWidth] ; of copy to the next + sub ax,[bp+CopyWidth] ; of copy to the next RowLoop3: mov cx,[bp+CopyWidth] ;# of bytes to copy shr cx,1 diff --git a/src/chapter-48.md b/src/chapter-48.md index 04ac5a8..e3a6942 100644 --- a/src/chapter-48.md +++ b/src/chapter-48.md @@ -521,7 +521,7 @@ MasksSet: mov [bp+SourceNextScanOffset],ax mov [bp+RectAddrWidth],cx ;remember width in addresses - 1 ;----------------------BUG FIX -mov dx,SC_INDEX + mov dx,SC_INDEX mov al,MAP_MASK out dx,al ;point SC Index reg to Map Mask inc dx ;point to SC Data reg diff --git a/src/chapter-53.md b/src/chapter-53.md index 10d5582..5bcd56e 100644 --- a/src/chapter-53.md +++ b/src/chapter-53.md @@ -174,7 +174,7 @@ else ; !ROUNDING-ON sub eax,eax shrd eax,edx,16 ;position so that result ends up sar edx,16 ; in EAX - idivdword ptr [bp+Divisor] + idiv dword ptr [bp+Divisor] endif ;ROUNDING-ON shld edx,eax,16 ;whole part of result in DX; ; fractional part is already in AX @@ -224,9 +224,9 @@ jg MakeInRange ja Quadrant1 ;quadrant 0 shl bx,2 - move ax,CosTable[bx] ;look up sine + mov eax,CosTable[bx] ;look up sine neg bx ;sin(Angle) = cos(90-Angle) - move dx,CosTable[bx+90*10*4] ;look up cosine + mov edx,CosTable[bx+90*10*4] ;look up cosine jmp short CSDone align ALIGNMENT @@ -237,7 +237,7 @@ Quadrant1: mov eax,CosTable[bx] ;look up cosine neg eax ;negative in this quadrant neg bx ;sin(Angle) = cos(90-Angle) - move dx,CosTable[bx+90*10*4] ;look up cosine + mov edx,CosTable[bx+90*10*4] ;look up cosine jmp short CSDone align ALIGNMENT @@ -248,11 +248,11 @@ BottomHalf: ;quadrant 2 or 3 ja Quadrant2 ;quadrant 3 shl bx, 2 - mov eax,CosTable[bx] ;look up cosine - neg bx ;sin(Angle) = cos(90-Angle) - movedx,CosTable[90*10*4+bx] ;look up sine - nege dx ;negative in this quadrant - jmp short CSDone + mov eax,CosTable[bx] ;look up cosine + neg bx ;sin(Angle) = cos(90-Angle) + mov edx,CosTable[90*10*4+bx] ;look up sine + neg edx ;negative in this quadrant + jmp short CSDone align ALIGNMENT Quadrant2: @@ -262,8 +262,8 @@ Quadrant2: mov eax,CosTable[bx] ;look up cosine neg eax ;negative in this quadrant neg bx ;sin(Angle) = cos(90-Angle) - move dx,CosTable[90*10*4+bx] ;look up sine - nege dx ;negative in this quadrant + mov edx,CosTable[90*10*4+bx] ;look up sine + neg edx ;negative in this quadrant CSDone: mov bx,[bp].Cos mov [bx],eax @@ -347,9 +347,9 @@ soff=soff+16 doff=doff+4 ENDM -popdi;restore register variables -popsi -popbp;restore stack frame +pop di;restore register variables +pop si +pop bp;restore stack frame ret -XformVecendp ;===================================================================== @@ -391,7 +391,7 @@ CXparms ends push bp ;preserve stack frame mov bp,sp ;set up local stack frame push si ;preserve register variables -pushdi + push di mov bx,[bp].SourceXform2 ;BX points to xform2 matrix mov si,[bp].SourceXform1 ;SI points to xform1 matrix @@ -407,7 +407,7 @@ coff=0 ;column offset imul dword ptr [bx+coff];times row 0 entry in column if ROUNDING-ON add eax,8000h ;round by adding 2^(-17) - adcedx,0;whole part of result is in DX + adc edx,0 ;whole part of result is in DX endif ;ROUNDING-ON shrd eax,edx,16 ;shift the result back to 16.16 form mov ecx,eax ;set running total @@ -471,9 +471,9 @@ coff=coff+4 ;point to next col in xform2 & dest roff=roff+16 ;point to next col in xform2 & dest ENDM -popdi;restore register variables -popsi -popbp;restore stack frame +pop di;restore register variables +pop si +pop bp;restore stack frame ret -ConcatXformsendp end diff --git a/src/chapter-54.md b/src/chapter-54.md index 1fb0579..9bb7b63 100644 --- a/src/chapter-54.md +++ b/src/chapter-54.md @@ -203,14 +203,14 @@ _FixedMul endp ; Fixedpoint FixedDiv(Fixedpoint Dividend, Fixedpoint Divisor); FDparms struc dw 2 dup(?) ;return address & pushed BP -Dividend dd? -Divisor dd? +Dividend dd ? +Divisor dd ? FDparms ends - alignALIGNMENT - public_FixedDiv + align ALIGNMENT + public _FixedDiv _FixedDivproc near - pushbp - movbp,sp + push bp + mov bp,sp if USE386 @@ -268,13 +268,13 @@ else ;!USE386 ; projection can't be performed for points closer to the viewpoint than Z=1. ;figure out signs, so we can use ; unsigned divisions - subcx, cx ;assume both operands positive + sub cx,cx ;assume both operands positive mov ax,word ptr [bp+Dividend+2] and ax,ax;first operand negative? jns CheckSecondOperandD ;no neg ax ;yes, so negate first operand neg word ptr [bp+Dividend] - sbbax,0 + sbb ax,0 inc cx ;mark that first operand is negative CheckSecondOperandD: mov bx,word ptr [bp+Divisor+2] @@ -366,9 +366,9 @@ CheckInRange: ja Quadrant1 ;quadrant 0 shl bx,2 - move ax,CosTable[bx] ;look up sine + mov eax,CosTable[bx] ;look up sine neg bx;sin(Angle) = cos(90-Angle) - move dx,CosTable[bx+90*10*4] ;look up cosine + mov edx,CosTable[bx+90*10*4] ;look up cosine jmp short CSDone align ALIGNMENT @@ -376,10 +376,10 @@ Quadrant1: neg bx add bx,180*10 ;convert to angle between 0 and 90 shl bx,2 - move ax,CosTable[bx] ;look up cosine + mov eax,CosTable[bx] ;look up cosine neg eax ;negative in this quadrant neg bx ;sin(Angle) = cos(90-Angle) - move dx,CosTable[bx+90*10*4] ;look up cosine + mov edx,CosTable[bx+90*10*4] ;look up cosine jmp short CSDone align ALIGNMENT @@ -390,9 +390,9 @@ BottomHalf: ;quadrant 2 or 3 ja Quadrant2 ;quadrant 3 shl bx,2 - move ax,CosTable[bx] ;look up cosine + mov eax,CosTable[bx] ;look up cosine neg bx;sin(Angle) = cos(90-Angle) - move dx,CosTable[90*10*4+bx] ;look up sine + mov edx,CosTable[90*10*4+bx] ;look up sine neg edx ;negative in this quadrant jmp short CSDone @@ -401,10 +401,10 @@ Quadrant2: neg bx add bx,180*10 ;convert to angle between 0 and 90 shl bx,2 - move ax,CosTable[bx] ;look up cosine + mov eax,CosTable[bx] ;look up cosine neg eax ;negative in this quadrant neg bx ;sin(Angle) = cos(90-Angle) - move dx,CosTable[90*10*4+bx] ;look up sine + mov edx,CosTable[90*10*4+bx] ;look up sine neg edx ;negative in this quadrant CSDone: mov bx,[bp].Cos @@ -619,9 +619,9 @@ if MUL-ROUNDING-ON adc edx,0 ;whole part of result is in DX endif ;MUL-ROUNDING-ON shrd eax,edx,16 ;shift the result back to 16.16 form - move cx,eax ;set running total + mov ecx,eax ;set running total - move ax,[si+soff+4] ;column 1 entry on this row + mov eax,[si+soff+4] ;column 1 entry on this row imul dword ptr [bx+4] ;xform entry times source Y entry if MUL-ROUNDING-ON add eax,8000h ;round by adding 2^(-17) @@ -630,7 +630,7 @@ endif ;MUL-ROUNDING-ON shrd eax,edx,16 ;shift the result back to 16.16 form add ecx,eax ;running total for this row - move ax,[si+soff+8] ;column 2 entry on this row + mov eax,[si+soff+8] ;column 2 entry on this row imul dword ptr [bx+8] ;xform entry times source Z entry if MUL-ROUNDING-ON add eax,8000h ;round by adding 2^(-17) @@ -759,17 +759,17 @@ coff=0 ;column offset REPT 3 ;once for each of the first 3 columns, ; assuming 0 as the bottom entry (no ; translation) - move ax,[si+roff] ;column 0 entry on this row + mov eax,[si+roff] ;column 0 entry on this row imul dword ptr [bx+coff] ;times row 0 entry in column if MUL-ROUNDING-ON add eax,8000h ;round by adding 2^(-17) adc edx,0 ;whole part of result is in DX endif ;MUL-ROUNDING-ON shrd eax,edx,16 ;shift the result back to 16.16 form - move cx,eax ;set running total + mov ecx,eax ;set running total - move ax,[si+roff+4] ;column 1 entry on this row - imuld word ptr [bx+coff+16] ;times row 1 entry in col + mov eax,[si+roff+4] ;column 1 entry on this row + imul dword ptr [bx+coff+16] ;times row 1 entry in col if MUL-ROUNDING-ON add eax,8000h ;round by adding 2^(-17) adc edx,0 ;whole part of result is in DX @@ -777,8 +777,8 @@ endif ;MUL-ROUNDING-ON shrd eax,edx,16 ;shift the result back to 16.16 form add ecx,eax ;running total - move ax,[si+roff+8] ;column 2 entry on this row - imuld word ptr [bx+coff+32] ;times row 2 entry in col + mov eax,[si+roff+8] ;column 2 entry on this row + imul dword ptr [bx+coff+32] ;times row 2 entry in col if MUL-ROUNDING-ON add eax,8000h ;round by adding 2^(-17) adc edx,0 ;whole part of result is in DX @@ -792,17 +792,17 @@ coff=coff+4 ;point to next col in xform2 & dest ;now do the fourth column, assuming ; 1 as the bottom entry, causing ; translation to be performed - move ax,[si+roff] ;column 0 entry on this row - imuld word ptr [bx+coff] ;times row 0 entry in column + mov eax,[si+roff] ;column 0 entry on this row + imul dword ptr [bx+coff] ;times row 0 entry in column if MUL-ROUNDING-ON add eax,8000h ;round by adding 2^(-17) adc edx,0 ;whole part of result is in DX endif ;MUL-ROUNDING-ON shrd eax,edx,16 ;shift the result back to 16.16 form - move cx,eax ;set running total + mov ecx,eax ;set running total - move ax,[si+roff+4] ;column 1 entry on this row - imuld word ptr [bx+coff+16] ;times row 1 entry in col + mov eax,[si+roff+4] ;column 1 entry on this row + imul dword ptr [bx+coff+16] ;times row 1 entry in col if MUL-ROUNDING-ON add eax,8000h ;round by adding 2^(-17) adc edx,0 ;whole part of result is in DX @@ -810,8 +810,8 @@ endif ;MUL-ROUNDING-ON shrd eax,edx,16 ;shift the result back to 16.16 form add ecx,eax ;running total - move ax,[si+roff+8] ;column 2 entry on this row - imuld word ptr [bx+coff+32] ;times row 2 entry in col + mov eax,[si+roff+8] ;column 2 entry on this row + imul dword ptr [bx+coff+32] ;times row 2 entry in col if MUL-ROUNDING-ON add eax,8000h ;round by adding 2^(-17) adc edx,0 ;whole part of result is in DX From a07f8de8839a0fc2837a42e8c54c26279fdf55b7 Mon Sep 17 00:00:00 2001 From: Dennis Yurichev Date: Fri, 14 Aug 2015 01:18:56 +0300 Subject: [PATCH 13/55] typos --- src/chapter-11.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/chapter-11.md b/src/chapter-11.md index 0543d00..d8ac7cc 100644 --- a/src/chapter-11.md +++ b/src/chapter-11.md @@ -1020,7 +1020,7 @@ pushed on the stack will point to the instruction we want to continue with. The code works out like this: ```nasm - jmpshort popfskip + jmp short popfskip popfiret: iret; branches to the instruction after the ; call, popping the word below the address @@ -1082,8 +1082,8 @@ an 8088.) .286 : EMULATE_POPFmacro - pushcs - pushoffset $+4 + push cs + push offset $+4 iret endm ``` From b85ec11c007287cf744ee3c5aab516ef3137dceb Mon Sep 17 00:00:00 2001 From: Jose Prous Date: Sun, 13 Sep 2015 19:33:56 -0400 Subject: [PATCH 14/55] remove duplicate text --- src/chapter-15.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/chapter-15.md b/src/chapter-15.md index 6a64e1f..b86dd08 100644 --- a/src/chapter-15.md +++ b/src/chapter-15.md @@ -302,8 +302,7 @@ the pike. The success or failure of the search can then be determined outside the loop, if necessary, by checking for the tail node's special pointer—but the inside of the loop is streamlined to just one test, as shown in Listing 15.5. Not all linked lists lend themselves to -sentinels, but the performance benefits are considerable for those lend -themselves to sentinels, but the performance benefits are considerable +sentinels, but the performance benefits are considerable for those that do. ![**Figure 15.3**  *Representing an empty list.*](images/15-03.jpg) From 30b83be20dd830f906517fa56dae8929afddd7e8 Mon Sep 17 00:00:00 2001 From: Jose Prous Date: Sun, 13 Sep 2015 19:41:36 -0400 Subject: [PATCH 15/55] typo --- src/chapter-21.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-21.md b/src/chapter-21.md index e6db869..787a427 100644 --- a/src/chapter-21.md +++ b/src/chapter-21.md @@ -237,7 +237,7 @@ contention. Such operations, as in ```nasm mov eax,edx ;U-pipe cycle 1 -sub edx,edxX ;V-pipe cycle 1 +sub edx,edx ;V-pipe cycle 1 ``` are free of charge. From 101714d9051c21017e4a7e2f6044f301fe7d642e Mon Sep 17 00:00:00 2001 From: rnndxb wxcy Date: Thu, 3 Mar 2016 13:07:27 -0500 Subject: [PATCH 16/55] Correct typos in listing 3.1 --- src/chapter-03.md | 50 +++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/chapter-03.md b/src/chapter-03.md index e183327..4513658 100644 --- a/src/chapter-03.md +++ b/src/chapter-03.md @@ -163,34 +163,34 @@ presented in Chapter K on the companion CD-ROM. ; in when ZTimerOn was called. ; -Code segment word public ‘CODE' - assumecs: Code, ds:nothing +Code segment word public 'CODE' + assume cs:Code, ds:nothing public ZTimerOn, ZTimerOff, ZTimerReport ; ; Base address of the 8253 timer chip. ; -BASE_8253equ40h +BASE_8253 equ 40h ; ; The address of the timer 0 count registers in the 8253. ; -TIMER_0_8253 equBASE_8253 + 0 +TIMER_0_8253 equ BASE_8253 + 0 ; ; The address of the mode register in the 8253. ; -MODE_8253 equBASE_8253 + 3 +MODE_8253 equ BASE_8253 + 3 ; ; The address of Operation Command Word 3 in the 8259 Programmable ; Interrupt Controller (PIC) (write only, and writable only when ; bit 4 of the byte written to this address is 0 and bit 3 is 1). ; -OCW3 equ20h +OCW3 equ 20h ; ; The address of the Interrupt Request register in the 8259 PIC ; (read only, and readable only when bit 1 of OCW3 = 1 and bit 0 ; of OCW3 = 0). ; -IRR equ20h +IRR equ 20h ; ; Macro to emulate a POPF instruction in order to fix the bug in some ; 80286 chips which allows interrupts to occur during a POPF even when @@ -220,7 +220,7 @@ OriginalFlags db ? ; storage for upper byte of ; ZTimerOn called TimedCount dw ? ; timer 0 count when the timer ; is stopped -ReferenceCount dw ; number of counts required to +ReferenceCount dw ? ; number of counts required to ; execute timer overhead code OverflowFlag db ? ; used to indicate whether the ; timer overflowed during the @@ -229,28 +229,28 @@ OverflowFlag db ? ; used to indicate whether the ; String printed to report results. ; OutputStr label byte - db 0dh, 0ah, ‘Timed count: ‘, 5 dup (?) -ASCIICountEnd labelbyte - db ‘ microseconds', 0dh, 0ah - db ‘$' + db 0dh, 0ah, 'Timed count: ', 5 dup (?) +ASCIICountEnd label byte + db ' microseconds', 0dh, 0ah + db '$' ; ; String printed to report timer overflow. ; OverflowStr label byte db 0dh, 0ah - db ‘****************************************************' + db '****************************************************' db 0dh, 0ah - db ‘* The timer overflowed, so the interval timed was *' + db '* The timer overflowed, so the interval timed was *' db 0dh, 0ah - db ‘* too long for the precision timer to measure. *' + db '* too long for the precision timer to measure. *' db 0dh, 0ah - db ‘* Please perform the timing test again with the *' -db0dh, 0ah - db ‘* long-period timer. *' + db '* Please perform the timing test again with the *' db 0dh, 0ah - db ‘****************************************************' + db '* long-period timer. *' db 0dh, 0ah - db ‘$' + db '****************************************************' + db 0dh, 0ah + db '$' ; ******************************************************************** ; * Routine called to start timing. * @@ -418,7 +418,7 @@ ZTimerOff endp ; Called by ZTimerOff to start timer for overhead measurements. ; -ReferenceZTimerOnproc near +ReferenceZTimerOn proc near ; ; Save the context of the program being timed. ; @@ -445,7 +445,7 @@ ReferenceZTimerOnproc near pop ax ret -ReferenceZTimerOnendp +ReferenceZTimerOn endp ; ; Called by ZTimerOff to stop timer and add result to ReferenceCount @@ -488,7 +488,7 @@ ReferenceZTimerOff endp ; * Routine called to report timing results. * ; ******************************************************************** -ZTimerReport procnear +ZTimerReport proc near pushf push ax @@ -541,7 +541,7 @@ CTSLoop: ; mov ah, 9 mov dx, offset OutputStr - int 21h + int 21h ; EndZTimerReport: pop ds @@ -2190,7 +2190,7 @@ call near ptr ReferenceZTimerOn (and likewise for `ReferenceZTimerOff`), which works because `ReferenceZTimerOn` is in the same segment as the calling code. This is normally a great optimization, being both smaller and faster than a -far call. +far call. ![**Figure 3.3**  *Changes for use with large code model C.*](images/03-03.jpg) From 6d7fcf71b1c480c2af5ab55a6a0b3d57af5ba14c Mon Sep 17 00:00:00 2001 From: rnndxb wxcy Date: Thu, 3 Mar 2016 13:21:25 -0500 Subject: [PATCH 17/55] Correct typos in listing 3.2 --- src/chapter-03.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/chapter-03.md b/src/chapter-03.md index 4513658..6121388 100644 --- a/src/chapter-03.md +++ b/src/chapter-03.md @@ -913,13 +913,13 @@ and should contain calls to `ZTimerOn` and `ZTimerOff` . ; ; By Michael Abrash ; -mystack segment para stack ‘STACK' +mystack segment para stack 'STACK' db 512 dup(?) mystack ends ; -Code segment para public ‘CODE' +Code segment para public 'CODE' assume cs:Code, ds:Code - extrnZTimerOn:near, ZTimerOff:near, ZTimerReport:near + extrn ZTimerOn:near, ZTimerOff:near, ZTimerReport:near Start proc near push cs pop ds ; set DS to point to the code segment, From 879524acd5a85ea67fccc95a82b3ae2ca97511bc Mon Sep 17 00:00:00 2001 From: rnndxb wxcy Date: Thu, 3 Mar 2016 13:56:41 -0500 Subject: [PATCH 18/55] Correct typos and formatting in listing 3.6 --- src/chapter-03.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/chapter-03.md b/src/chapter-03.md index 6121388..a3ae7a7 100644 --- a/src/chapter-03.md +++ b/src/chapter-03.md @@ -1932,25 +1932,25 @@ timing. ; ; By Michael Abrash ; -mystack segment para stack ‘STACK' +mystack segment para stack 'STACK' db 512 dup(?) -mystack ends +mystack ends ; -Code segment para public ‘CODE' +Code segment para public 'CODE' assume cs:Code, ds:Code - extrn ZTimerOn:near, ZTimerOff:near, ZTimerReport:near -Startproc near - push cs - pop ds ;point DS to the code segment, + extrn ZTimerOn:near, ZTimerOff:near, ZTimerReport:near +Start proc near + push cs + pop ds ;point DS to the code segment, ; so data as well as code can easily ; be included in TESTCODE ; ; Delay for 6-7 seconds, to let the Enter keystroke that started the ; program come back up. ; - mov ah,2ch - int 21h ;get the current time - mov bh,dh ;set the current time aside + mov ah,2ch + int 21h ;get the current time + mov bh,dh ;set the current time aside DelayLoop: mov ah,2ch push bx ;preserve start time @@ -1962,12 +1962,12 @@ DelayLoop: add dh,60 ;yes, a minute must have turned over, ; so add one minute CheckDelayTime: - sub dh,bh ;get time that's passed - cmp dh,7 ;has it been more than 6 seconds yet? - jb DelayLoop ;not yet + sub dh,bh ;get time that's passed + cmp dh,7 ;has it been more than 6 seconds yet? + jb DelayLoop ;not yet ; - include TESTCODE ;code to be measured, including calls - ; to ZTimerOn and ZTimerOff + include TESTCODE ;code to be measured, including calls + ; to ZTimerOn and ZTimerOff ; ; Display the results. ; @@ -1975,8 +1975,8 @@ CheckDelayTime: ; ; Terminate the program. ; - mov ah,4ch - int 21h + mov ah,4ch + int 21h Start endp Code ends end Start From 37a1456cc8b8b32ba0370b1440386595e0ce57d0 Mon Sep 17 00:00:00 2001 From: rnndxb wxcy Date: Thu, 3 Mar 2016 14:13:54 -0500 Subject: [PATCH 19/55] Correct typos and formatting in listing 3.8 --- src/chapter-03.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/chapter-03.md b/src/chapter-03.md index a3ae7a7..85db21c 100644 --- a/src/chapter-03.md +++ b/src/chapter-03.md @@ -2075,23 +2075,23 @@ the precision Zen timer to handle on the 8088. ; Note: takes about ten minutes to assemble on a slow PC if ;you are using MASM ; -jmpSkip;jump around defined data + jmp Skip ;jump around defined data ; -MemVardb? +MemVar db ? ; Skip: ; ; Start timing. ; -callZTimerOn + call ZTimerOn ; -rept20000 -moval,[MemVar] -endm + rept 20000 + mov al,[MemVar] + endm ; ; Stop timing. ; -callZTimerOff + call ZTimerOff ``` When LZTIME.BAT is run on a PC with the following command line (assuming From 5ece9ece8c09888df68c50bb89aa343f63badcb3 Mon Sep 17 00:00:00 2001 From: Dennis Yurichev Date: Thu, 11 Aug 2016 03:04:43 +0300 Subject: [PATCH 20/55] minor listing formatting --- src/chapter-21.md | 78 +++++++------- src/chapter-22.md | 252 +++++++++++++++++++++++----------------------- 2 files changed, 165 insertions(+), 165 deletions(-) mode change 100644 => 100755 src/chapter-21.md mode change 100644 => 100755 src/chapter-22.md diff --git a/src/chapter-21.md b/src/chapter-21.md old mode 100644 new mode 100755 index e6db869..523f050 --- a/src/chapter-21.md +++ b/src/chapter-21.md @@ -236,7 +236,7 @@ contention. Happily, write-after-read operations do *not* cause contention. Such operations, as in ```nasm -mov eax,edx ;U-pipe cycle 1 +mov eax,edx ;U-pipe cycle 1 sub edx,edxX ;V-pipe cycle 1 ``` @@ -475,33 +475,33 @@ ckloopsetup: mov dx,[esi] ;load most of 1st word to mov bl,[esi+2] ; checksum (last byte loaded in loop) dec ecx ;any more dwords to checksum? - jz short ckloopend ;no + jz short ckloopend ;no ckloop: - mov bh,[esi+3] ;cycle 1 U-pipe - add esi,4 ;cycle 1 V-pipe - shl ebx,16 ;cycle 2 U-pipe - ;cycle 2 V-pipe idle - ; (register contention) - or ebx,edx ;cycle 3 U-pipe - mov dl,[esi] ;cycle 3 V-pipe - add eax,ebx ;cycle 4 U-pipe - mov bl,[esi+2] ;cycle 4 V-pipe - adc eax,0 ;cycle 5 U-pipe - mov dh,[esi+1] ;cycle 5 V-pipe - dec ecx ;cycle 6 U-pipe - jnz ckloop ;cycle 6 V-pipe + mov bh,[esi+3] ;cycle 1 U-pipe + add esi,4 ;cycle 1 V-pipe + shl ebx,16 ;cycle 2 U-pipe + ;cycle 2 V-pipe idle + ; (register contention) + or ebx,edx ;cycle 3 U-pipe + mov dl,[esi] ;cycle 3 V-pipe + add eax,ebx ;cycle 4 U-pipe + mov bl,[esi+2] ;cycle 4 V-pipe + adc eax,0 ;cycle 5 U-pipe + mov dh,[esi+1] ;cycle 5 V-pipe + dec ecx ;cycle 6 U-pipe + jnz ckloop ;cycle 6 V-pipe ckloopend: - mov bh,[esi+3] ;checksum the last dword - add ax,dx - adc ax,bx - adc ax,0 + mov bh,[esi+3] ;checksum the last dword + add ax,dx + adc ax,bx + adc ax,0 - mov edx,eax ;compress the 32-bit checksum - shr edx,16 ; into a 16-bit checksum - add ax,dx - adc eax,0 + mov edx,eax ;compress the 32-bit checksum + shr edx,16 ; into a 16-bit checksum + add ax,dx + adc eax,0 ckloopdone: ``` @@ -598,29 +598,29 @@ more registers. jz short ckloopdone ;no, done add esi,4 ;point to the next dword noodddword: - mov edx,[esi] ;preload the first dword - mov ebx,[esi+4] ;preload the second dword - dec ecx ;we'll do 1 checksum outside the loop - jz short ckloopend ;only 1 checksum to do - add esi,8 ;point to the next dword + mov edx,[esi] ;preload the first dword + mov ebx,[esi+4] ;preload the second dword + dec ecx ;we'll do 1 checksum outside the loop + jz short ckloopend ;only 1 checksum to do + add esi,8 ;point to the next dword ckloop: - add eax,edx ;cycle 1 U-pipe - mov edx,[esi] ;cycle 1 V-pipe - adc eax,ebx ;cycle 2 U-pipe - mov ebx,[esi+4] ;cycle 2 V-pipe - adc eax,0 ;cycle 3 U-pipe - add esi,8 ;cycle 3 V-pipe - dec ecx ;cycle 4 U-pipe - jnz ckloop ;cycle 4 V-pipe + add eax,edx ;cycle 1 U-pipe + mov edx,[esi] ;cycle 1 V-pipe + adc eax,ebx ;cycle 2 U-pipe + mov ebx,[esi+4] ;cycle 2 V-pipe + adc eax,0 ;cycle 3 U-pipe + add esi,8 ;cycle 3 V-pipe + dec ecx ;cycle 4 U-pipe + jnz ckloop ;cycle 4 V-pipe ckloopend: - add eax,edx ;checksum the last two dwords + add eax,edx ;checksum the last two dwords adc eax,ebx adc eax,0 ckloopdone: - mov edx,eax ;compress the 32-bit checksum - shr edx,16 ; into a 16-bit checksum + mov edx,eax ;compress the 32-bit checksum + shr edx,16 ; into a 16-bit checksum add ax,dx adc eax,0 ``` diff --git a/src/chapter-22.md b/src/chapter-22.md old mode 100644 new mode 100755 index a9f1515..5bf0eee --- a/src/chapter-22.md +++ b/src/chapter-22.md @@ -68,29 +68,29 @@ BufSeg dw ? ;buffer segment EndMrk db ? ;marker for the end of the stack frame OnStack ends ; -ClearS proc near - push bp ;save caller's BP - mov bp,sp ;point to stack frame - cmp word ptr [bp].BufSeg,0 ;skip the fill if a null - jne Start ; pointer is passed - cmp word ptr [bp].BufOfs,0 - je Bye -Start: cld ;make STOSW count up - mov ax,[bp].Attrib ;load AX with attribute parameter - and ax,0ff00h ;prepare for merging with fill char - mov bx,[bp].Filler ;load BX with fill char - and bx,0ffh ;prepare for merging with attribute - or ax,bx ;combine attribute and fill char - mov bx,[bp].BufOfs ;load DI with target buffer offset - mov di,bx - mov bx,[bp].BufSeg ;load ES with target buffer segment - mov es,bx - mov cx,[bp].BufSize ;load CX with buffer size - rep stosw ;fill the buffer -Bye:mov sp,bp ;restore original stack pointer - pop bp ; and caller's BP - ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack -ClearS endp +ClearS proc near + push bp ;save caller's BP + mov bp,sp ;point to stack frame + cmp word ptr [bp].BufSeg,0 ;skip the fill if a null + jne Start ; pointer is passed + cmp word ptr [bp].BufOfs,0 + je Bye +Start: cld ;make STOSW count up + mov ax,[bp].Attrib ;load AX with attribute parameter + and ax,0ff00h ;prepare for merging with fill char + mov bx,[bp].Filler ;load BX with fill char + and bx,0ffh ;prepare for merging with attribute + or ax,bx ;combine attribute and fill char + mov bx,[bp].BufOfs ;load DI with target buffer offset + mov di,bx + mov bx,[bp].BufSeg ;load ES with target buffer segment + mov es,bx + mov cx,[bp].BufSize ;load CX with buffer size + rep stosw ;fill the buffer +Bye: mov sp,bp ;restore original stack pointer + pop bp ; and caller's BP + ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack +ClearS endp ``` The first thing you'll notice about Listing 22.1 is that `ClearS` uses @@ -121,27 +121,27 @@ DI directly as shown in Listing 22.2. **LISTING 22.2 L22-2.ASM** ```nasm -ClearS proc near - push bp ;save caller's BP - mov bp,sp ;point to stack frame - cmp word ptr [bp].BufSeg,0 ;skip the fill if a null - jne Start ; pointer is passed - cmp word ptr [bp].BufOfs,0 - je Bye +ClearS proc near + push bp ;save caller's BP + mov bp,sp ;point to stack frame + cmp word ptr [bp].BufSeg,0 ;skip the fill if a null + jne Start ; pointer is passed + cmp word ptr [bp].BufOfs,0 + je Bye Start: cld ;make STOSW count up - mov ax,[bp].Attrib ;load AX with attribute parameter - and ax,0ff00h ;prepare for merging with fill char - mov bx,[bp].Filler ;load BX with fill char - and bx,0ffh ;prepare for merging with attribute - or ax,bx ;combine attribute and fill char - mov di,[bp].BufOfs ;load DI with target buffer offset - mov es,[bp].BufSeg ;load ES with target buffer segment - mov cx,[bp].BufSize ;load CX with buffer size - rep stosw ;fill the buffer + mov ax,[bp].Attrib ;load AX with attribute parameter + and ax,0ff00h ;prepare for merging with fill char + mov bx,[bp].Filler ;load BX with fill char + and bx,0ffh ;prepare for merging with attribute + or ax,bx ;combine attribute and fill char + mov di,[bp].BufOfs ;load DI with target buffer offset + mov es,[bp].BufSeg ;load ES with target buffer segment + mov cx,[bp].BufSize ;load CX with buffer size + rep stosw ;fill the buffer Bye: - pop bp ;restore caller's BP - ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack -ClearS endp + pop bp ;restore caller's BP + ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack +ClearS endp ``` (The `OnStack` structure definition doesn't change in any of our @@ -158,27 +158,27 @@ loading ES and DI as shown in Listing 22.3. **LISTING 22.3 L22-3.ASM** ```nasm -ClearS proc near - push bp ;save caller's BP - mov bp,sp ;point to stack frame - cmp word ptr [bp].BufSeg,0 ;skip the fill if a null - jne Start ; pointer is passed - cmp word ptr [bp].BufOfs,0 - je Bye +ClearS proc near + push bp ;save caller's BP + mov bp,sp ;point to stack frame + cmp word ptr [bp].BufSeg,0 ;skip the fill if a null + jne Start ; pointer is passed + cmp word ptr [bp].BufOfs,0 + je Bye Start: cld ;make STOSW count up - mov ax,[bp].Attrib ;load AX with attribute parameter - and ax,0ff00h ;prepare for merging with fill char - mov bx,[bp].Filler ;load BX with fill char - and bx,0ffh ;prepare for merging with attribute - or ax,bx ;combine attribute and fill char - les di,dword ptr [bp].BufOfs ;load ES:DI with target buffer + mov ax,[bp].Attrib ;load AX with attribute parameter + and ax,0ff00h ;prepare for merging with fill char + mov bx,[bp].Filler ;load BX with fill char + and bx,0ffh ;prepare for merging with attribute + or ax,bx ;combine attribute and fill char + les di,dword ptr [bp].BufOfs ;load ES:DI with target buffer ;segment:offset - mov cx,[bp].BufSize ;load CX with buffer size - rep stosw ;fill the buffer + mov cx,[bp].BufSize ;load CX with buffer size + rep stosw ;fill the buffer Bye: - pop bp ;restore caller's BP - ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack -ClearS endp + pop bp ;restore caller's BP + ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack +ClearS endp ``` That's good for another three bytes. We're down to 43 bytes, and @@ -190,27 +190,27 @@ values as shown in Listing 22.4. **LISTING 22.4 L22-4.ASM** - ClearS proc near - push bp ;save caller's BP - mov bp,sp ;point to stack frame - cmp word ptr [bp].BufSeg,0 ;skip the fill if a null - jne Start ; pointer is passed - cmp word ptr [bp].BufOfs,0 - je Bye - Start: cld ;make STOSW count up - mov ax,[bp].Attrib ;load AX with attribute parameter - sub al,al ;prepare for merging with fill char - mov bx,[bp].Filler ;load BX with fill char - sub bh,bh ;prepare for merging with attribute - or ax,bx ;combine attribute and fill char - les di,dword ptr [bp].BufOfs ;load ES:DI with target buffer - ;segment:offset - mov cx,[bp].BufSize ;load CX with buffer size - rep stosw ;fill the buffer + ClearS proc near + push bp ;save caller's BP + mov bp,sp ;point to stack frame + cmp word ptr [bp].BufSeg,0 ;skip the fill if a null + jne Start ; pointer is passed + cmp word ptr [bp].BufOfs,0 + je Bye + Start: cld ;make STOSW count up + mov ax,[bp].Attrib ;load AX with attribute parameter + sub al,al ;prepare for merging with fill char + mov bx,[bp].Filler ;load BX with fill char + sub bh,bh ;prepare for merging with attribute + or ax,bx ;combine attribute and fill char + les di,dword ptr [bp].BufOfs ;load ES:DI with target buffer + ;segment:offset + mov cx,[bp].BufSize ;load CX with buffer size + rep stosw ;fill the buffer Bye: - pop bp ;restore caller's BP - ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack - ClearS endp + pop bp ;restore caller's BP + ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack + ClearS endp Now we're down to 40 bytes—more than 20 percent smaller than the original code. That's pretty much it for simple instruction @@ -232,23 +232,23 @@ shows the new code. **LISTING 22.5 L22-5.ASM** ```nasm -ClearS proc near - push bp ;save caller's BP - mov bp,sp ;point to stack frame - cmp word ptr [bp].BufSeg,0 ;skip the fill if a null - jne Start ; pointer is passed - cmp word ptr [bp].BufOfs,0 - je Bye -Start: cld ;make STOSW count up - mov ah,byte ptr [bp].Attrib[1];load AH with attribute - mov al,byte ptr [bp].Filler ;load AL with fill char - les di,dword ptr [bp].BufOfs ;load ES:DI with target buffer segment:offset - mov cx,[bp].BufSize ;load CX with buffer size - rep stosw ;fill the buffer +ClearS proc near + push bp ;save caller's BP + mov bp,sp ;point to stack frame + cmp word ptr [bp].BufSeg,0 ;skip the fill if a null + jne Start ; pointer is passed + cmp word ptr [bp].BufOfs,0 + je Bye +Start: cld ;make STOSW count up + mov ah,byte ptr [bp].Attrib[1] ;load AH with attribute + mov al,byte ptr [bp].Filler ;load AL with fill char + les di,dword ptr [bp].BufOfs ;load ES:DI with target buffer segment:offset + mov cx,[bp].BufSize ;load CX with buffer size + rep stosw ;fill the buffer Bye: - pop bp ;restore caller's BP - ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack -ClearS endp + pop bp ;restore caller's BP + ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack +ClearS endp ``` (We could get rid of yet another instruction by having the calling code @@ -266,22 +266,22 @@ shown in Listing 22.6. **LISTING 22.6 L22-6.ASM** ```nasm -ClearS proc near - push bp ;save caller's BP - mov bp,sp ;point to stack frame - les di,dword ptr [bp].BufOfs ;load ES:DI with target buffer;segment:offset - mov ax,es ;put segment where we can test it - or ax,di ;is it a null pointer? - je Bye ;yes, so we're done -Start: cld ;make STOSW count up - mov ah,byte ptr [bp].Attrib[1];load AH with attribute - mov al,byte ptr [bp].Filler ;load AL with fill char - mov cx,[bp].BufSize ;load CX with buffer size - rep stosw ;fill the buffer +ClearS proc near + push bp ;save caller's BP + mov bp,sp ;point to stack frame + les di,dword ptr [bp].BufOfs ;load ES:DI with target buffer;segment:offset + mov ax,es ;put segment where we can test it + or ax,di ;is it a null pointer? + je Bye ;yes, so we're done +Start: cld ;make STOSW count up + mov ah,byte ptr [bp].Attrib[1] ;load AH with attribute + mov al,byte ptr [bp].Filler ;load AL with fill char + mov cx,[bp].BufSize ;load CX with buffer size + rep stosw ;fill the buffer Bye: - pop bp ;restore caller's BP - ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack -ClearS endp + pop bp ;restore caller's BP + ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack +ClearS endp ``` Well. Now we're down to 28 bytes, having reduced the size of this @@ -327,22 +327,22 @@ With that problem dealt with, Listing 22.7 shows the Zenned version of **LISTING 22.7 L22-7.ASM** ```nasm -ClearS procnear - pop dx ;get the return address - pop ax ;put fill char into AL - pop bx ;get the attribute - mov ah,bh ;put attribute into AH - pop cx ;get the buffer size - pop di ;get the offset of the buffer origin - pop es ;get the segment of the buffer origin - mov bx,es ;put the segment where we can test it - or bx,di ;null pointer? - je Bye ;yes, so we're done - cld ;make STOSW count up - rep stosw ;do the string store +ClearS proc near + pop dx ;get the return address + pop ax ;put fill char into AL + pop bx ;get the attribute + mov ah,bh ;put attribute into AH + pop cx ;get the buffer size + pop di ;get the offset of the buffer origin + pop es ;get the segment of the buffer origin + mov bx,es ;put the segment where we can test it + or bx,di ;null pointer? + je Bye ;yes, so we're done + cld ;make STOSW count up + rep stosw ;do the string store Bye: - jmp dx ;return to the calling code -ClearS endp + jmp dx ;return to the calling code +ClearS endp ``` At long last, we're down to the bare metal. This version of `ClearS` From 93fa15fd199d4807ba0dd3d883827f763bd42d0f Mon Sep 17 00:00:00 2001 From: Dennis Yurichev Date: Thu, 11 Aug 2016 03:07:21 +0300 Subject: [PATCH 21/55] ... --- README.md | 0 epub/epub.css | 0 epub/template.html | 0 html/book.css | 0 html/template.html | 0 images/02-01.jpg | Bin images/02-02.jpg | Bin images/03-01.jpg | Bin images/03-02.jpg | Bin images/03-03.jpg | Bin images/04-01.jpg | Bin images/04-02.jpg | Bin images/04-03.jpg | Bin images/04-04.jpg | Bin images/04-05.jpg | Bin images/04-06.jpg | Bin images/04-07.jpg | Bin images/04-08.jpg | Bin images/05-01.jpg | Bin images/05-02.jpg | Bin images/06-01.jpg | Bin images/06-02.jpg | Bin images/08-01.jpg | Bin images/08-02.jpg | Bin images/08-03.jpg | Bin images/09-01.jpg | Bin images/09-02.jpg | Bin images/09-03.jpg | Bin images/09-04.jpg | Bin images/10-01.jpg | Bin images/10-02.jpg | Bin images/10-03.jpg | Bin images/11-01.jpg | Bin images/11-02.jpg | Bin images/11-03.jpg | Bin images/11-04.jpg | Bin images/11-05.jpg | Bin images/11-06.jpg | Bin images/12-01.jpg | Bin images/12-02.jpg | Bin images/13-01.jpg | Bin images/13-02.jpg | Bin images/14-01.jpg | Bin images/14-02.jpg | Bin images/14-03.jpg | Bin images/15-01.jpg | Bin images/15-02.jpg | Bin images/15-03.jpg | Bin images/15-04.jpg | Bin images/15-05.jpg | Bin images/16-01.jpg | Bin images/16-02.jpg | Bin images/17-01.jpg | Bin images/17-02.jpg | Bin images/17-03.jpg | Bin images/18-01.jpg | Bin images/20-01.jpg | Bin images/20-02.jpg | Bin images/20-03.jpg | Bin images/20-04.jpg | Bin images/20-05.jpg | Bin images/20-06.jpg | Bin images/20-07.jpg | Bin images/20-08.jpg | Bin images/21-01.jpg | Bin images/21-02.jpg | Bin images/23-01.jpg | Bin images/23-02.jpg | Bin images/24-01.jpg | Bin images/25-01.jpg | Bin images/25-02.jpg | Bin images/25-03.jpg | Bin images/27-01.jpg | Bin images/29-01.jpg | Bin images/29-02.jpg | Bin images/29-03.jpg | Bin images/29-04.jpg | Bin images/30-01.jpg | Bin images/31-01.jpg | Bin images/32-01.jpg | Bin images/33-01.jpg | Bin images/35-01.jpg | Bin images/35-02.jpg | Bin images/35-03.jpg | Bin images/35-04.jpg | Bin images/35-05.jpg | Bin images/36-01.jpg | Bin images/36-02.jpg | Bin images/36-03.jpg | Bin images/36-04.jpg | Bin images/36-05.jpg | Bin images/38-01.jpg | Bin images/38-02.jpg | Bin images/38-03.jpg | Bin images/40-01.jpg | Bin images/40-02.jpg | Bin images/40-03.jpg | Bin images/41-01.jpg | Bin images/41-02.jpg | Bin images/42-01.jpg | Bin images/42-02.jpg | Bin images/43-01.jpg | Bin images/43-02.jpg | Bin images/43-03.jpg | Bin images/43-04.jpg | Bin images/43-05.jpg | Bin images/44-01.jpg | Bin images/44-02.jpg | Bin images/45-01.jpg | Bin images/45-02.jpg | Bin images/47-01.jpg | Bin images/47-02.jpg | Bin images/48-01.jpg | Bin images/48-02.jpg | Bin images/48-03.jpg | Bin images/49-01.jpg | Bin images/50-01.jpg | Bin images/50-02.jpg | Bin images/50-03.jpg | Bin images/50-04.jpg | Bin images/50-05.jpg | Bin images/51-01.jpg | Bin images/51-02.jpg | Bin images/51-03.jpg | Bin images/51-04.jpg | Bin images/53-01.jpg | Bin images/54-01.jpg | Bin images/54-02.jpg | Bin images/54-03.jpg | Bin images/54-04.jpg | Bin images/55-01.jpg | Bin images/55-02.jpg | Bin images/55-03.jpg | Bin images/56-01.jpg | Bin images/56-02.jpg | Bin images/56-03.jpg | Bin images/56-04.jpg | Bin images/56-05.jpg | Bin images/57-01.jpg | Bin images/58-01.jpg | Bin images/58-02.jpg | Bin images/58-03.jpg | Bin images/58-04.jpg | Bin images/58-05.jpg | Bin images/58-06.jpg | Bin images/58-07.jpg | Bin images/59-01.jpg | Bin images/59-02.jpg | Bin images/59-03.jpg | Bin images/59-04.jpg | Bin images/59-05.jpg | Bin images/59-06.jpg | Bin images/59-07.jpg | Bin images/59-08.jpg | Bin images/59-09.jpg | Bin images/60-01.jpg | Bin images/60-02.jpg | Bin images/60-03.jpg | Bin images/61-01.jpg | Bin images/61-01d.jpg | Bin images/61-02.jpg | Bin images/61-02d.jpg | Bin images/61-03.jpg | Bin images/61-03d.jpg | Bin images/61-04.jpg | Bin images/61-04d.jpg | Bin images/61-05.jpg | Bin images/61-05d.jpg | Bin images/61-06.jpg | Bin images/61-06d.jpg | Bin images/61-07.jpg | Bin images/61-07d.jpg | Bin images/61-08.jpg | Bin images/61-08d.jpg | Bin images/62-01.jpg | Bin images/62-02.jpg | Bin images/62-03.jpg | Bin images/62-04.jpg | Bin images/64-01.jpg | Bin images/64-02.jpg | Bin images/64-03.jpg | Bin images/64-04.jpg | Bin images/64-05.jpg | Bin images/65-01.jpg | Bin images/65-02.jpg | Bin images/65-03.jpg | Bin images/66-01.jpg | Bin images/66-02.jpg | Bin images/66-03.jpg | Bin images/66-04.jpg | Bin images/67-01.jpg | Bin images/67-02.jpg | Bin images/68-01.jpg | Bin images/68-02.jpg | Bin images/68-03.jpg | Bin images/68-04.jpg | Bin images/69-01.jpg | Bin images/69-02.jpg | Bin images/cover.png | Bin images/i.jpg | Bin src/about.md | 0 src/about_author.md | 0 src/appendix-a.md | 0 src/chapter-01.md | 0 src/chapter-02.md | 0 src/chapter-03.md | 0 src/chapter-04.md | 0 src/chapter-05.md | 0 src/chapter-06.md | 0 src/chapter-07.md | 0 src/chapter-08.md | 0 src/chapter-09.md | 0 src/chapter-10.md | 0 src/chapter-11.md | 0 src/chapter-12.md | 0 src/chapter-13.md | 0 src/chapter-14.md | 0 src/chapter-15.md | 0 src/chapter-16.md | 0 src/chapter-17.md | 0 src/chapter-18.md | 0 src/chapter-19.md | 0 src/chapter-20.md | 0 src/chapter-23.md | 0 src/chapter-24.md | 0 src/chapter-25.md | 0 src/chapter-26.md | 0 src/chapter-27.md | 0 src/chapter-28.md | 0 src/chapter-29.md | 0 src/chapter-30.md | 0 src/chapter-31.md | 0 src/chapter-32.md | 0 src/chapter-33.md | 0 src/chapter-34.md | 0 src/chapter-35.md | 0 src/chapter-36.md | 0 src/chapter-37.md | 0 src/chapter-38.md | 0 src/chapter-39.md | 0 src/chapter-40.md | 0 src/chapter-41.md | 0 src/chapter-42.md | 0 src/chapter-43.md | 0 src/chapter-44.md | 0 src/chapter-45.md | 0 src/chapter-46.md | 0 src/chapter-47.md | 0 src/chapter-48.md | 0 src/chapter-49.md | 0 src/chapter-50.md | 0 src/chapter-51.md | 0 src/chapter-52.md | 0 src/chapter-53.md | 0 src/chapter-54.md | 0 src/chapter-55.md | 0 src/chapter-56.md | 0 src/chapter-57.md | 0 src/chapter-58.md | 0 src/chapter-59.md | 0 src/chapter-60.md | 0 src/chapter-61.md | 0 src/chapter-62.md | 0 src/chapter-63.md | 0 src/chapter-64.md | 0 src/chapter-65.md | 0 src/chapter-66.md | 0 src/chapter-67.md | 0 src/chapter-68.md | 0 src/chapter-69.md | 0 src/chapter-70.md | 0 src/copyright.md | 0 src/intro.md | 0 273 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 README.md mode change 100644 => 100755 epub/epub.css mode change 100644 => 100755 epub/template.html mode change 100644 => 100755 html/book.css mode change 100644 => 100755 html/template.html mode change 100644 => 100755 images/02-01.jpg mode change 100644 => 100755 images/02-02.jpg mode change 100644 => 100755 images/03-01.jpg mode change 100644 => 100755 images/03-02.jpg mode change 100644 => 100755 images/03-03.jpg mode change 100644 => 100755 images/04-01.jpg mode change 100644 => 100755 images/04-02.jpg mode change 100644 => 100755 images/04-03.jpg mode change 100644 => 100755 images/04-04.jpg mode change 100644 => 100755 images/04-05.jpg mode change 100644 => 100755 images/04-06.jpg mode change 100644 => 100755 images/04-07.jpg mode change 100644 => 100755 images/04-08.jpg mode change 100644 => 100755 images/05-01.jpg mode change 100644 => 100755 images/05-02.jpg mode change 100644 => 100755 images/06-01.jpg mode change 100644 => 100755 images/06-02.jpg mode change 100644 => 100755 images/08-01.jpg mode change 100644 => 100755 images/08-02.jpg mode change 100644 => 100755 images/08-03.jpg mode change 100644 => 100755 images/09-01.jpg mode change 100644 => 100755 images/09-02.jpg mode change 100644 => 100755 images/09-03.jpg mode change 100644 => 100755 images/09-04.jpg mode change 100644 => 100755 images/10-01.jpg mode change 100644 => 100755 images/10-02.jpg mode change 100644 => 100755 images/10-03.jpg mode change 100644 => 100755 images/11-01.jpg mode change 100644 => 100755 images/11-02.jpg mode change 100644 => 100755 images/11-03.jpg mode change 100644 => 100755 images/11-04.jpg mode change 100644 => 100755 images/11-05.jpg mode change 100644 => 100755 images/11-06.jpg mode change 100644 => 100755 images/12-01.jpg mode change 100644 => 100755 images/12-02.jpg mode change 100644 => 100755 images/13-01.jpg mode change 100644 => 100755 images/13-02.jpg mode change 100644 => 100755 images/14-01.jpg mode change 100644 => 100755 images/14-02.jpg mode change 100644 => 100755 images/14-03.jpg mode change 100644 => 100755 images/15-01.jpg mode change 100644 => 100755 images/15-02.jpg mode change 100644 => 100755 images/15-03.jpg mode change 100644 => 100755 images/15-04.jpg mode change 100644 => 100755 images/15-05.jpg mode change 100644 => 100755 images/16-01.jpg mode change 100644 => 100755 images/16-02.jpg mode change 100644 => 100755 images/17-01.jpg mode change 100644 => 100755 images/17-02.jpg mode change 100644 => 100755 images/17-03.jpg mode change 100644 => 100755 images/18-01.jpg mode change 100644 => 100755 images/20-01.jpg mode change 100644 => 100755 images/20-02.jpg mode change 100644 => 100755 images/20-03.jpg mode change 100644 => 100755 images/20-04.jpg mode change 100644 => 100755 images/20-05.jpg mode change 100644 => 100755 images/20-06.jpg mode change 100644 => 100755 images/20-07.jpg mode change 100644 => 100755 images/20-08.jpg mode change 100644 => 100755 images/21-01.jpg mode change 100644 => 100755 images/21-02.jpg mode change 100644 => 100755 images/23-01.jpg mode change 100644 => 100755 images/23-02.jpg mode change 100644 => 100755 images/24-01.jpg mode change 100644 => 100755 images/25-01.jpg mode change 100644 => 100755 images/25-02.jpg mode change 100644 => 100755 images/25-03.jpg mode change 100644 => 100755 images/27-01.jpg mode change 100644 => 100755 images/29-01.jpg mode change 100644 => 100755 images/29-02.jpg mode change 100644 => 100755 images/29-03.jpg mode change 100644 => 100755 images/29-04.jpg mode change 100644 => 100755 images/30-01.jpg mode change 100644 => 100755 images/31-01.jpg mode change 100644 => 100755 images/32-01.jpg mode change 100644 => 100755 images/33-01.jpg mode change 100644 => 100755 images/35-01.jpg mode change 100644 => 100755 images/35-02.jpg mode change 100644 => 100755 images/35-03.jpg mode change 100644 => 100755 images/35-04.jpg mode change 100644 => 100755 images/35-05.jpg mode change 100644 => 100755 images/36-01.jpg mode change 100644 => 100755 images/36-02.jpg mode change 100644 => 100755 images/36-03.jpg mode change 100644 => 100755 images/36-04.jpg mode change 100644 => 100755 images/36-05.jpg mode change 100644 => 100755 images/38-01.jpg mode change 100644 => 100755 images/38-02.jpg mode change 100644 => 100755 images/38-03.jpg mode change 100644 => 100755 images/40-01.jpg mode change 100644 => 100755 images/40-02.jpg mode change 100644 => 100755 images/40-03.jpg mode change 100644 => 100755 images/41-01.jpg mode change 100644 => 100755 images/41-02.jpg mode change 100644 => 100755 images/42-01.jpg mode change 100644 => 100755 images/42-02.jpg mode change 100644 => 100755 images/43-01.jpg mode change 100644 => 100755 images/43-02.jpg mode change 100644 => 100755 images/43-03.jpg mode change 100644 => 100755 images/43-04.jpg mode change 100644 => 100755 images/43-05.jpg mode change 100644 => 100755 images/44-01.jpg mode change 100644 => 100755 images/44-02.jpg mode change 100644 => 100755 images/45-01.jpg mode change 100644 => 100755 images/45-02.jpg mode change 100644 => 100755 images/47-01.jpg mode change 100644 => 100755 images/47-02.jpg mode change 100644 => 100755 images/48-01.jpg mode change 100644 => 100755 images/48-02.jpg mode change 100644 => 100755 images/48-03.jpg mode change 100644 => 100755 images/49-01.jpg mode change 100644 => 100755 images/50-01.jpg mode change 100644 => 100755 images/50-02.jpg mode change 100644 => 100755 images/50-03.jpg mode change 100644 => 100755 images/50-04.jpg mode change 100644 => 100755 images/50-05.jpg mode change 100644 => 100755 images/51-01.jpg mode change 100644 => 100755 images/51-02.jpg mode change 100644 => 100755 images/51-03.jpg mode change 100644 => 100755 images/51-04.jpg mode change 100644 => 100755 images/53-01.jpg mode change 100644 => 100755 images/54-01.jpg mode change 100644 => 100755 images/54-02.jpg mode change 100644 => 100755 images/54-03.jpg mode change 100644 => 100755 images/54-04.jpg mode change 100644 => 100755 images/55-01.jpg mode change 100644 => 100755 images/55-02.jpg mode change 100644 => 100755 images/55-03.jpg mode change 100644 => 100755 images/56-01.jpg mode change 100644 => 100755 images/56-02.jpg mode change 100644 => 100755 images/56-03.jpg mode change 100644 => 100755 images/56-04.jpg mode change 100644 => 100755 images/56-05.jpg mode change 100644 => 100755 images/57-01.jpg mode change 100644 => 100755 images/58-01.jpg mode change 100644 => 100755 images/58-02.jpg mode change 100644 => 100755 images/58-03.jpg mode change 100644 => 100755 images/58-04.jpg mode change 100644 => 100755 images/58-05.jpg mode change 100644 => 100755 images/58-06.jpg mode change 100644 => 100755 images/58-07.jpg mode change 100644 => 100755 images/59-01.jpg mode change 100644 => 100755 images/59-02.jpg mode change 100644 => 100755 images/59-03.jpg mode change 100644 => 100755 images/59-04.jpg mode change 100644 => 100755 images/59-05.jpg mode change 100644 => 100755 images/59-06.jpg mode change 100644 => 100755 images/59-07.jpg mode change 100644 => 100755 images/59-08.jpg mode change 100644 => 100755 images/59-09.jpg mode change 100644 => 100755 images/60-01.jpg mode change 100644 => 100755 images/60-02.jpg mode change 100644 => 100755 images/60-03.jpg mode change 100644 => 100755 images/61-01.jpg mode change 100644 => 100755 images/61-01d.jpg mode change 100644 => 100755 images/61-02.jpg mode change 100644 => 100755 images/61-02d.jpg mode change 100644 => 100755 images/61-03.jpg mode change 100644 => 100755 images/61-03d.jpg mode change 100644 => 100755 images/61-04.jpg mode change 100644 => 100755 images/61-04d.jpg mode change 100644 => 100755 images/61-05.jpg mode change 100644 => 100755 images/61-05d.jpg mode change 100644 => 100755 images/61-06.jpg mode change 100644 => 100755 images/61-06d.jpg mode change 100644 => 100755 images/61-07.jpg mode change 100644 => 100755 images/61-07d.jpg mode change 100644 => 100755 images/61-08.jpg mode change 100644 => 100755 images/61-08d.jpg mode change 100644 => 100755 images/62-01.jpg mode change 100644 => 100755 images/62-02.jpg mode change 100644 => 100755 images/62-03.jpg mode change 100644 => 100755 images/62-04.jpg mode change 100644 => 100755 images/64-01.jpg mode change 100644 => 100755 images/64-02.jpg mode change 100644 => 100755 images/64-03.jpg mode change 100644 => 100755 images/64-04.jpg mode change 100644 => 100755 images/64-05.jpg mode change 100644 => 100755 images/65-01.jpg mode change 100644 => 100755 images/65-02.jpg mode change 100644 => 100755 images/65-03.jpg mode change 100644 => 100755 images/66-01.jpg mode change 100644 => 100755 images/66-02.jpg mode change 100644 => 100755 images/66-03.jpg mode change 100644 => 100755 images/66-04.jpg mode change 100644 => 100755 images/67-01.jpg mode change 100644 => 100755 images/67-02.jpg mode change 100644 => 100755 images/68-01.jpg mode change 100644 => 100755 images/68-02.jpg mode change 100644 => 100755 images/68-03.jpg mode change 100644 => 100755 images/68-04.jpg mode change 100644 => 100755 images/69-01.jpg mode change 100644 => 100755 images/69-02.jpg mode change 100644 => 100755 images/cover.png mode change 100644 => 100755 images/i.jpg mode change 100644 => 100755 src/about.md mode change 100644 => 100755 src/about_author.md mode change 100644 => 100755 src/appendix-a.md mode change 100644 => 100755 src/chapter-01.md mode change 100644 => 100755 src/chapter-02.md mode change 100644 => 100755 src/chapter-03.md mode change 100644 => 100755 src/chapter-04.md mode change 100644 => 100755 src/chapter-05.md mode change 100644 => 100755 src/chapter-06.md mode change 100644 => 100755 src/chapter-07.md mode change 100644 => 100755 src/chapter-08.md mode change 100644 => 100755 src/chapter-09.md mode change 100644 => 100755 src/chapter-10.md mode change 100644 => 100755 src/chapter-11.md mode change 100644 => 100755 src/chapter-12.md mode change 100644 => 100755 src/chapter-13.md mode change 100644 => 100755 src/chapter-14.md mode change 100644 => 100755 src/chapter-15.md mode change 100644 => 100755 src/chapter-16.md mode change 100644 => 100755 src/chapter-17.md mode change 100644 => 100755 src/chapter-18.md mode change 100644 => 100755 src/chapter-19.md mode change 100644 => 100755 src/chapter-20.md mode change 100644 => 100755 src/chapter-23.md mode change 100644 => 100755 src/chapter-24.md mode change 100644 => 100755 src/chapter-25.md mode change 100644 => 100755 src/chapter-26.md mode change 100644 => 100755 src/chapter-27.md mode change 100644 => 100755 src/chapter-28.md mode change 100644 => 100755 src/chapter-29.md mode change 100644 => 100755 src/chapter-30.md mode change 100644 => 100755 src/chapter-31.md mode change 100644 => 100755 src/chapter-32.md mode change 100644 => 100755 src/chapter-33.md mode change 100644 => 100755 src/chapter-34.md mode change 100644 => 100755 src/chapter-35.md mode change 100644 => 100755 src/chapter-36.md mode change 100644 => 100755 src/chapter-37.md mode change 100644 => 100755 src/chapter-38.md mode change 100644 => 100755 src/chapter-39.md mode change 100644 => 100755 src/chapter-40.md mode change 100644 => 100755 src/chapter-41.md mode change 100644 => 100755 src/chapter-42.md mode change 100644 => 100755 src/chapter-43.md mode change 100644 => 100755 src/chapter-44.md mode change 100644 => 100755 src/chapter-45.md mode change 100644 => 100755 src/chapter-46.md mode change 100644 => 100755 src/chapter-47.md mode change 100644 => 100755 src/chapter-48.md mode change 100644 => 100755 src/chapter-49.md mode change 100644 => 100755 src/chapter-50.md mode change 100644 => 100755 src/chapter-51.md mode change 100644 => 100755 src/chapter-52.md mode change 100644 => 100755 src/chapter-53.md mode change 100644 => 100755 src/chapter-54.md mode change 100644 => 100755 src/chapter-55.md mode change 100644 => 100755 src/chapter-56.md mode change 100644 => 100755 src/chapter-57.md mode change 100644 => 100755 src/chapter-58.md mode change 100644 => 100755 src/chapter-59.md mode change 100644 => 100755 src/chapter-60.md mode change 100644 => 100755 src/chapter-61.md mode change 100644 => 100755 src/chapter-62.md mode change 100644 => 100755 src/chapter-63.md mode change 100644 => 100755 src/chapter-64.md mode change 100644 => 100755 src/chapter-65.md mode change 100644 => 100755 src/chapter-66.md mode change 100644 => 100755 src/chapter-67.md mode change 100644 => 100755 src/chapter-68.md mode change 100644 => 100755 src/chapter-69.md mode change 100644 => 100755 src/chapter-70.md mode change 100644 => 100755 src/copyright.md mode change 100644 => 100755 src/intro.md diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/epub/epub.css b/epub/epub.css old mode 100644 new mode 100755 diff --git a/epub/template.html b/epub/template.html old mode 100644 new mode 100755 diff --git a/html/book.css b/html/book.css old mode 100644 new mode 100755 diff --git a/html/template.html b/html/template.html old mode 100644 new mode 100755 diff --git a/images/02-01.jpg b/images/02-01.jpg old mode 100644 new mode 100755 diff --git a/images/02-02.jpg b/images/02-02.jpg old mode 100644 new mode 100755 diff --git a/images/03-01.jpg b/images/03-01.jpg old mode 100644 new mode 100755 diff --git a/images/03-02.jpg b/images/03-02.jpg old mode 100644 new mode 100755 diff --git a/images/03-03.jpg b/images/03-03.jpg old mode 100644 new mode 100755 diff --git a/images/04-01.jpg b/images/04-01.jpg old mode 100644 new mode 100755 diff --git a/images/04-02.jpg b/images/04-02.jpg old mode 100644 new mode 100755 diff --git a/images/04-03.jpg b/images/04-03.jpg old mode 100644 new mode 100755 diff --git a/images/04-04.jpg b/images/04-04.jpg old mode 100644 new mode 100755 diff --git a/images/04-05.jpg b/images/04-05.jpg old mode 100644 new mode 100755 diff --git a/images/04-06.jpg b/images/04-06.jpg old mode 100644 new mode 100755 diff --git a/images/04-07.jpg b/images/04-07.jpg old mode 100644 new mode 100755 diff --git a/images/04-08.jpg b/images/04-08.jpg old mode 100644 new mode 100755 diff --git a/images/05-01.jpg b/images/05-01.jpg old mode 100644 new mode 100755 diff --git a/images/05-02.jpg b/images/05-02.jpg old mode 100644 new mode 100755 diff --git a/images/06-01.jpg b/images/06-01.jpg old mode 100644 new mode 100755 diff --git a/images/06-02.jpg b/images/06-02.jpg old mode 100644 new mode 100755 diff --git a/images/08-01.jpg b/images/08-01.jpg old mode 100644 new mode 100755 diff --git a/images/08-02.jpg b/images/08-02.jpg old mode 100644 new mode 100755 diff --git a/images/08-03.jpg b/images/08-03.jpg old mode 100644 new mode 100755 diff --git a/images/09-01.jpg b/images/09-01.jpg old mode 100644 new mode 100755 diff --git a/images/09-02.jpg b/images/09-02.jpg old mode 100644 new mode 100755 diff --git a/images/09-03.jpg b/images/09-03.jpg old mode 100644 new mode 100755 diff --git a/images/09-04.jpg b/images/09-04.jpg old mode 100644 new mode 100755 diff --git a/images/10-01.jpg b/images/10-01.jpg old mode 100644 new mode 100755 diff --git a/images/10-02.jpg b/images/10-02.jpg old mode 100644 new mode 100755 diff --git a/images/10-03.jpg b/images/10-03.jpg old mode 100644 new mode 100755 diff --git a/images/11-01.jpg b/images/11-01.jpg old mode 100644 new mode 100755 diff --git a/images/11-02.jpg b/images/11-02.jpg old mode 100644 new mode 100755 diff --git a/images/11-03.jpg b/images/11-03.jpg old mode 100644 new mode 100755 diff --git a/images/11-04.jpg b/images/11-04.jpg old mode 100644 new mode 100755 diff --git a/images/11-05.jpg b/images/11-05.jpg old mode 100644 new mode 100755 diff --git a/images/11-06.jpg b/images/11-06.jpg old mode 100644 new mode 100755 diff --git a/images/12-01.jpg b/images/12-01.jpg old mode 100644 new mode 100755 diff --git a/images/12-02.jpg b/images/12-02.jpg old mode 100644 new mode 100755 diff --git a/images/13-01.jpg b/images/13-01.jpg old mode 100644 new mode 100755 diff --git a/images/13-02.jpg b/images/13-02.jpg old mode 100644 new mode 100755 diff --git a/images/14-01.jpg b/images/14-01.jpg old mode 100644 new mode 100755 diff --git a/images/14-02.jpg b/images/14-02.jpg old mode 100644 new mode 100755 diff --git a/images/14-03.jpg b/images/14-03.jpg old mode 100644 new mode 100755 diff --git a/images/15-01.jpg b/images/15-01.jpg old mode 100644 new mode 100755 diff --git a/images/15-02.jpg b/images/15-02.jpg old mode 100644 new mode 100755 diff --git a/images/15-03.jpg b/images/15-03.jpg old mode 100644 new mode 100755 diff --git a/images/15-04.jpg b/images/15-04.jpg old mode 100644 new mode 100755 diff --git a/images/15-05.jpg b/images/15-05.jpg old mode 100644 new mode 100755 diff --git a/images/16-01.jpg b/images/16-01.jpg old mode 100644 new mode 100755 diff --git a/images/16-02.jpg b/images/16-02.jpg old mode 100644 new mode 100755 diff --git a/images/17-01.jpg b/images/17-01.jpg old mode 100644 new mode 100755 diff --git a/images/17-02.jpg b/images/17-02.jpg old mode 100644 new mode 100755 diff --git a/images/17-03.jpg b/images/17-03.jpg old mode 100644 new mode 100755 diff --git a/images/18-01.jpg b/images/18-01.jpg old mode 100644 new mode 100755 diff --git a/images/20-01.jpg b/images/20-01.jpg old mode 100644 new mode 100755 diff --git a/images/20-02.jpg b/images/20-02.jpg old mode 100644 new mode 100755 diff --git a/images/20-03.jpg b/images/20-03.jpg old mode 100644 new mode 100755 diff --git a/images/20-04.jpg b/images/20-04.jpg old mode 100644 new mode 100755 diff --git a/images/20-05.jpg b/images/20-05.jpg old mode 100644 new mode 100755 diff --git a/images/20-06.jpg b/images/20-06.jpg old mode 100644 new mode 100755 diff --git a/images/20-07.jpg b/images/20-07.jpg old mode 100644 new mode 100755 diff --git a/images/20-08.jpg b/images/20-08.jpg old mode 100644 new mode 100755 diff --git a/images/21-01.jpg b/images/21-01.jpg old mode 100644 new mode 100755 diff --git a/images/21-02.jpg b/images/21-02.jpg old mode 100644 new mode 100755 diff --git a/images/23-01.jpg b/images/23-01.jpg old mode 100644 new mode 100755 diff --git a/images/23-02.jpg b/images/23-02.jpg old mode 100644 new mode 100755 diff --git a/images/24-01.jpg b/images/24-01.jpg old mode 100644 new mode 100755 diff --git a/images/25-01.jpg b/images/25-01.jpg old mode 100644 new mode 100755 diff --git a/images/25-02.jpg b/images/25-02.jpg old mode 100644 new mode 100755 diff --git a/images/25-03.jpg b/images/25-03.jpg old mode 100644 new mode 100755 diff --git a/images/27-01.jpg b/images/27-01.jpg old mode 100644 new mode 100755 diff --git a/images/29-01.jpg b/images/29-01.jpg old mode 100644 new mode 100755 diff --git a/images/29-02.jpg b/images/29-02.jpg old mode 100644 new mode 100755 diff --git a/images/29-03.jpg b/images/29-03.jpg old mode 100644 new mode 100755 diff --git a/images/29-04.jpg b/images/29-04.jpg old mode 100644 new mode 100755 diff --git a/images/30-01.jpg b/images/30-01.jpg old mode 100644 new mode 100755 diff --git a/images/31-01.jpg b/images/31-01.jpg old mode 100644 new mode 100755 diff --git a/images/32-01.jpg b/images/32-01.jpg old mode 100644 new mode 100755 diff --git a/images/33-01.jpg b/images/33-01.jpg old mode 100644 new mode 100755 diff --git a/images/35-01.jpg b/images/35-01.jpg old mode 100644 new mode 100755 diff --git a/images/35-02.jpg b/images/35-02.jpg old mode 100644 new mode 100755 diff --git a/images/35-03.jpg b/images/35-03.jpg old mode 100644 new mode 100755 diff --git a/images/35-04.jpg b/images/35-04.jpg old mode 100644 new mode 100755 diff --git a/images/35-05.jpg b/images/35-05.jpg old mode 100644 new mode 100755 diff --git a/images/36-01.jpg b/images/36-01.jpg old mode 100644 new mode 100755 diff --git a/images/36-02.jpg b/images/36-02.jpg old mode 100644 new mode 100755 diff --git a/images/36-03.jpg b/images/36-03.jpg old mode 100644 new mode 100755 diff --git a/images/36-04.jpg b/images/36-04.jpg old mode 100644 new mode 100755 diff --git a/images/36-05.jpg b/images/36-05.jpg old mode 100644 new mode 100755 diff --git a/images/38-01.jpg b/images/38-01.jpg old mode 100644 new mode 100755 diff --git a/images/38-02.jpg b/images/38-02.jpg old mode 100644 new mode 100755 diff --git a/images/38-03.jpg b/images/38-03.jpg old mode 100644 new mode 100755 diff --git a/images/40-01.jpg b/images/40-01.jpg old mode 100644 new mode 100755 diff --git a/images/40-02.jpg b/images/40-02.jpg old mode 100644 new mode 100755 diff --git a/images/40-03.jpg b/images/40-03.jpg old mode 100644 new mode 100755 diff --git a/images/41-01.jpg b/images/41-01.jpg old mode 100644 new mode 100755 diff --git a/images/41-02.jpg b/images/41-02.jpg old mode 100644 new mode 100755 diff --git a/images/42-01.jpg b/images/42-01.jpg old mode 100644 new mode 100755 diff --git a/images/42-02.jpg b/images/42-02.jpg old mode 100644 new mode 100755 diff --git a/images/43-01.jpg b/images/43-01.jpg old mode 100644 new mode 100755 diff --git a/images/43-02.jpg b/images/43-02.jpg old mode 100644 new mode 100755 diff --git a/images/43-03.jpg b/images/43-03.jpg old mode 100644 new mode 100755 diff --git a/images/43-04.jpg b/images/43-04.jpg old mode 100644 new mode 100755 diff --git a/images/43-05.jpg b/images/43-05.jpg old mode 100644 new mode 100755 diff --git a/images/44-01.jpg b/images/44-01.jpg old mode 100644 new mode 100755 diff --git a/images/44-02.jpg b/images/44-02.jpg old mode 100644 new mode 100755 diff --git a/images/45-01.jpg b/images/45-01.jpg old mode 100644 new mode 100755 diff --git a/images/45-02.jpg b/images/45-02.jpg old mode 100644 new mode 100755 diff --git a/images/47-01.jpg b/images/47-01.jpg old mode 100644 new mode 100755 diff --git a/images/47-02.jpg b/images/47-02.jpg old mode 100644 new mode 100755 diff --git a/images/48-01.jpg b/images/48-01.jpg old mode 100644 new mode 100755 diff --git a/images/48-02.jpg b/images/48-02.jpg old mode 100644 new mode 100755 diff --git a/images/48-03.jpg b/images/48-03.jpg old mode 100644 new mode 100755 diff --git a/images/49-01.jpg b/images/49-01.jpg old mode 100644 new mode 100755 diff --git a/images/50-01.jpg b/images/50-01.jpg old mode 100644 new mode 100755 diff --git a/images/50-02.jpg b/images/50-02.jpg old mode 100644 new mode 100755 diff --git a/images/50-03.jpg b/images/50-03.jpg old mode 100644 new mode 100755 diff --git a/images/50-04.jpg b/images/50-04.jpg old mode 100644 new mode 100755 diff --git a/images/50-05.jpg b/images/50-05.jpg old mode 100644 new mode 100755 diff --git a/images/51-01.jpg b/images/51-01.jpg old mode 100644 new mode 100755 diff --git a/images/51-02.jpg b/images/51-02.jpg old mode 100644 new mode 100755 diff --git a/images/51-03.jpg b/images/51-03.jpg old mode 100644 new mode 100755 diff --git a/images/51-04.jpg b/images/51-04.jpg old mode 100644 new mode 100755 diff --git a/images/53-01.jpg b/images/53-01.jpg old mode 100644 new mode 100755 diff --git a/images/54-01.jpg b/images/54-01.jpg old mode 100644 new mode 100755 diff --git a/images/54-02.jpg b/images/54-02.jpg old mode 100644 new mode 100755 diff --git a/images/54-03.jpg b/images/54-03.jpg old mode 100644 new mode 100755 diff --git a/images/54-04.jpg b/images/54-04.jpg old mode 100644 new mode 100755 diff --git a/images/55-01.jpg b/images/55-01.jpg old mode 100644 new mode 100755 diff --git a/images/55-02.jpg b/images/55-02.jpg old mode 100644 new mode 100755 diff --git a/images/55-03.jpg b/images/55-03.jpg old mode 100644 new mode 100755 diff --git a/images/56-01.jpg b/images/56-01.jpg old mode 100644 new mode 100755 diff --git a/images/56-02.jpg b/images/56-02.jpg old mode 100644 new mode 100755 diff --git a/images/56-03.jpg b/images/56-03.jpg old mode 100644 new mode 100755 diff --git a/images/56-04.jpg b/images/56-04.jpg old mode 100644 new mode 100755 diff --git a/images/56-05.jpg b/images/56-05.jpg old mode 100644 new mode 100755 diff --git a/images/57-01.jpg b/images/57-01.jpg old mode 100644 new mode 100755 diff --git a/images/58-01.jpg b/images/58-01.jpg old mode 100644 new mode 100755 diff --git a/images/58-02.jpg b/images/58-02.jpg old mode 100644 new mode 100755 diff --git a/images/58-03.jpg b/images/58-03.jpg old mode 100644 new mode 100755 diff --git a/images/58-04.jpg b/images/58-04.jpg old mode 100644 new mode 100755 diff --git a/images/58-05.jpg b/images/58-05.jpg old mode 100644 new mode 100755 diff --git a/images/58-06.jpg b/images/58-06.jpg old mode 100644 new mode 100755 diff --git a/images/58-07.jpg b/images/58-07.jpg old mode 100644 new mode 100755 diff --git a/images/59-01.jpg b/images/59-01.jpg old mode 100644 new mode 100755 diff --git a/images/59-02.jpg b/images/59-02.jpg old mode 100644 new mode 100755 diff --git a/images/59-03.jpg b/images/59-03.jpg old mode 100644 new mode 100755 diff --git a/images/59-04.jpg b/images/59-04.jpg old mode 100644 new mode 100755 diff --git a/images/59-05.jpg b/images/59-05.jpg old mode 100644 new mode 100755 diff --git a/images/59-06.jpg b/images/59-06.jpg old mode 100644 new mode 100755 diff --git a/images/59-07.jpg b/images/59-07.jpg old mode 100644 new mode 100755 diff --git a/images/59-08.jpg b/images/59-08.jpg old mode 100644 new mode 100755 diff --git a/images/59-09.jpg b/images/59-09.jpg old mode 100644 new mode 100755 diff --git a/images/60-01.jpg b/images/60-01.jpg old mode 100644 new mode 100755 diff --git a/images/60-02.jpg b/images/60-02.jpg old mode 100644 new mode 100755 diff --git a/images/60-03.jpg b/images/60-03.jpg old mode 100644 new mode 100755 diff --git a/images/61-01.jpg b/images/61-01.jpg old mode 100644 new mode 100755 diff --git a/images/61-01d.jpg b/images/61-01d.jpg old mode 100644 new mode 100755 diff --git a/images/61-02.jpg b/images/61-02.jpg old mode 100644 new mode 100755 diff --git a/images/61-02d.jpg b/images/61-02d.jpg old mode 100644 new mode 100755 diff --git a/images/61-03.jpg b/images/61-03.jpg old mode 100644 new mode 100755 diff --git a/images/61-03d.jpg b/images/61-03d.jpg old mode 100644 new mode 100755 diff --git a/images/61-04.jpg b/images/61-04.jpg old mode 100644 new mode 100755 diff --git a/images/61-04d.jpg b/images/61-04d.jpg old mode 100644 new mode 100755 diff --git a/images/61-05.jpg b/images/61-05.jpg old mode 100644 new mode 100755 diff --git a/images/61-05d.jpg b/images/61-05d.jpg old mode 100644 new mode 100755 diff --git a/images/61-06.jpg b/images/61-06.jpg old mode 100644 new mode 100755 diff --git a/images/61-06d.jpg b/images/61-06d.jpg old mode 100644 new mode 100755 diff --git a/images/61-07.jpg b/images/61-07.jpg old mode 100644 new mode 100755 diff --git a/images/61-07d.jpg b/images/61-07d.jpg old mode 100644 new mode 100755 diff --git a/images/61-08.jpg b/images/61-08.jpg old mode 100644 new mode 100755 diff --git a/images/61-08d.jpg b/images/61-08d.jpg old mode 100644 new mode 100755 diff --git a/images/62-01.jpg b/images/62-01.jpg old mode 100644 new mode 100755 diff --git a/images/62-02.jpg b/images/62-02.jpg old mode 100644 new mode 100755 diff --git a/images/62-03.jpg b/images/62-03.jpg old mode 100644 new mode 100755 diff --git a/images/62-04.jpg b/images/62-04.jpg old mode 100644 new mode 100755 diff --git a/images/64-01.jpg b/images/64-01.jpg old mode 100644 new mode 100755 diff --git a/images/64-02.jpg b/images/64-02.jpg old mode 100644 new mode 100755 diff --git a/images/64-03.jpg b/images/64-03.jpg old mode 100644 new mode 100755 diff --git a/images/64-04.jpg b/images/64-04.jpg old mode 100644 new mode 100755 diff --git a/images/64-05.jpg b/images/64-05.jpg old mode 100644 new mode 100755 diff --git a/images/65-01.jpg b/images/65-01.jpg old mode 100644 new mode 100755 diff --git a/images/65-02.jpg b/images/65-02.jpg old mode 100644 new mode 100755 diff --git a/images/65-03.jpg b/images/65-03.jpg old mode 100644 new mode 100755 diff --git a/images/66-01.jpg b/images/66-01.jpg old mode 100644 new mode 100755 diff --git a/images/66-02.jpg b/images/66-02.jpg old mode 100644 new mode 100755 diff --git a/images/66-03.jpg b/images/66-03.jpg old mode 100644 new mode 100755 diff --git a/images/66-04.jpg b/images/66-04.jpg old mode 100644 new mode 100755 diff --git a/images/67-01.jpg b/images/67-01.jpg old mode 100644 new mode 100755 diff --git a/images/67-02.jpg b/images/67-02.jpg old mode 100644 new mode 100755 diff --git a/images/68-01.jpg b/images/68-01.jpg old mode 100644 new mode 100755 diff --git a/images/68-02.jpg b/images/68-02.jpg old mode 100644 new mode 100755 diff --git a/images/68-03.jpg b/images/68-03.jpg old mode 100644 new mode 100755 diff --git a/images/68-04.jpg b/images/68-04.jpg old mode 100644 new mode 100755 diff --git a/images/69-01.jpg b/images/69-01.jpg old mode 100644 new mode 100755 diff --git a/images/69-02.jpg b/images/69-02.jpg old mode 100644 new mode 100755 diff --git a/images/cover.png b/images/cover.png old mode 100644 new mode 100755 diff --git a/images/i.jpg b/images/i.jpg old mode 100644 new mode 100755 diff --git a/src/about.md b/src/about.md old mode 100644 new mode 100755 diff --git a/src/about_author.md b/src/about_author.md old mode 100644 new mode 100755 diff --git a/src/appendix-a.md b/src/appendix-a.md old mode 100644 new mode 100755 diff --git a/src/chapter-01.md b/src/chapter-01.md old mode 100644 new mode 100755 diff --git a/src/chapter-02.md b/src/chapter-02.md old mode 100644 new mode 100755 diff --git a/src/chapter-03.md b/src/chapter-03.md old mode 100644 new mode 100755 diff --git a/src/chapter-04.md b/src/chapter-04.md old mode 100644 new mode 100755 diff --git a/src/chapter-05.md b/src/chapter-05.md old mode 100644 new mode 100755 diff --git a/src/chapter-06.md b/src/chapter-06.md old mode 100644 new mode 100755 diff --git a/src/chapter-07.md b/src/chapter-07.md old mode 100644 new mode 100755 diff --git a/src/chapter-08.md b/src/chapter-08.md old mode 100644 new mode 100755 diff --git a/src/chapter-09.md b/src/chapter-09.md old mode 100644 new mode 100755 diff --git a/src/chapter-10.md b/src/chapter-10.md old mode 100644 new mode 100755 diff --git a/src/chapter-11.md b/src/chapter-11.md old mode 100644 new mode 100755 diff --git a/src/chapter-12.md b/src/chapter-12.md old mode 100644 new mode 100755 diff --git a/src/chapter-13.md b/src/chapter-13.md old mode 100644 new mode 100755 diff --git a/src/chapter-14.md b/src/chapter-14.md old mode 100644 new mode 100755 diff --git a/src/chapter-15.md b/src/chapter-15.md old mode 100644 new mode 100755 diff --git a/src/chapter-16.md b/src/chapter-16.md old mode 100644 new mode 100755 diff --git a/src/chapter-17.md b/src/chapter-17.md old mode 100644 new mode 100755 diff --git a/src/chapter-18.md b/src/chapter-18.md old mode 100644 new mode 100755 diff --git a/src/chapter-19.md b/src/chapter-19.md old mode 100644 new mode 100755 diff --git a/src/chapter-20.md b/src/chapter-20.md old mode 100644 new mode 100755 diff --git a/src/chapter-23.md b/src/chapter-23.md old mode 100644 new mode 100755 diff --git a/src/chapter-24.md b/src/chapter-24.md old mode 100644 new mode 100755 diff --git a/src/chapter-25.md b/src/chapter-25.md old mode 100644 new mode 100755 diff --git a/src/chapter-26.md b/src/chapter-26.md old mode 100644 new mode 100755 diff --git a/src/chapter-27.md b/src/chapter-27.md old mode 100644 new mode 100755 diff --git a/src/chapter-28.md b/src/chapter-28.md old mode 100644 new mode 100755 diff --git a/src/chapter-29.md b/src/chapter-29.md old mode 100644 new mode 100755 diff --git a/src/chapter-30.md b/src/chapter-30.md old mode 100644 new mode 100755 diff --git a/src/chapter-31.md b/src/chapter-31.md old mode 100644 new mode 100755 diff --git a/src/chapter-32.md b/src/chapter-32.md old mode 100644 new mode 100755 diff --git a/src/chapter-33.md b/src/chapter-33.md old mode 100644 new mode 100755 diff --git a/src/chapter-34.md b/src/chapter-34.md old mode 100644 new mode 100755 diff --git a/src/chapter-35.md b/src/chapter-35.md old mode 100644 new mode 100755 diff --git a/src/chapter-36.md b/src/chapter-36.md old mode 100644 new mode 100755 diff --git a/src/chapter-37.md b/src/chapter-37.md old mode 100644 new mode 100755 diff --git a/src/chapter-38.md b/src/chapter-38.md old mode 100644 new mode 100755 diff --git a/src/chapter-39.md b/src/chapter-39.md old mode 100644 new mode 100755 diff --git a/src/chapter-40.md b/src/chapter-40.md old mode 100644 new mode 100755 diff --git a/src/chapter-41.md b/src/chapter-41.md old mode 100644 new mode 100755 diff --git a/src/chapter-42.md b/src/chapter-42.md old mode 100644 new mode 100755 diff --git a/src/chapter-43.md b/src/chapter-43.md old mode 100644 new mode 100755 diff --git a/src/chapter-44.md b/src/chapter-44.md old mode 100644 new mode 100755 diff --git a/src/chapter-45.md b/src/chapter-45.md old mode 100644 new mode 100755 diff --git a/src/chapter-46.md b/src/chapter-46.md old mode 100644 new mode 100755 diff --git a/src/chapter-47.md b/src/chapter-47.md old mode 100644 new mode 100755 diff --git a/src/chapter-48.md b/src/chapter-48.md old mode 100644 new mode 100755 diff --git a/src/chapter-49.md b/src/chapter-49.md old mode 100644 new mode 100755 diff --git a/src/chapter-50.md b/src/chapter-50.md old mode 100644 new mode 100755 diff --git a/src/chapter-51.md b/src/chapter-51.md old mode 100644 new mode 100755 diff --git a/src/chapter-52.md b/src/chapter-52.md old mode 100644 new mode 100755 diff --git a/src/chapter-53.md b/src/chapter-53.md old mode 100644 new mode 100755 diff --git a/src/chapter-54.md b/src/chapter-54.md old mode 100644 new mode 100755 diff --git a/src/chapter-55.md b/src/chapter-55.md old mode 100644 new mode 100755 diff --git a/src/chapter-56.md b/src/chapter-56.md old mode 100644 new mode 100755 diff --git a/src/chapter-57.md b/src/chapter-57.md old mode 100644 new mode 100755 diff --git a/src/chapter-58.md b/src/chapter-58.md old mode 100644 new mode 100755 diff --git a/src/chapter-59.md b/src/chapter-59.md old mode 100644 new mode 100755 diff --git a/src/chapter-60.md b/src/chapter-60.md old mode 100644 new mode 100755 diff --git a/src/chapter-61.md b/src/chapter-61.md old mode 100644 new mode 100755 diff --git a/src/chapter-62.md b/src/chapter-62.md old mode 100644 new mode 100755 diff --git a/src/chapter-63.md b/src/chapter-63.md old mode 100644 new mode 100755 diff --git a/src/chapter-64.md b/src/chapter-64.md old mode 100644 new mode 100755 diff --git a/src/chapter-65.md b/src/chapter-65.md old mode 100644 new mode 100755 diff --git a/src/chapter-66.md b/src/chapter-66.md old mode 100644 new mode 100755 diff --git a/src/chapter-67.md b/src/chapter-67.md old mode 100644 new mode 100755 diff --git a/src/chapter-68.md b/src/chapter-68.md old mode 100644 new mode 100755 diff --git a/src/chapter-69.md b/src/chapter-69.md old mode 100644 new mode 100755 diff --git a/src/chapter-70.md b/src/chapter-70.md old mode 100644 new mode 100755 diff --git a/src/copyright.md b/src/copyright.md old mode 100644 new mode 100755 diff --git a/src/intro.md b/src/intro.md old mode 100644 new mode 100755 From f1c36f03daab87b3e9bb2d2a2231fd7e1daea987 Mon Sep 17 00:00:00 2001 From: Dennis Yurichev Date: Thu, 11 Aug 2016 03:11:13 +0300 Subject: [PATCH 22/55] ... --- Makefile | 0 README.md | 0 epub/epub.css | 0 epub/template.html | 0 html/book.css | 0 html/template.html | 0 images/02-01.jpg | Bin images/02-02.jpg | Bin images/03-01.jpg | Bin images/03-02.jpg | Bin images/03-03.jpg | Bin images/04-01.jpg | Bin images/04-02.jpg | Bin images/04-03.jpg | Bin images/04-04.jpg | Bin images/04-05.jpg | Bin images/04-06.jpg | Bin images/04-07.jpg | Bin images/04-08.jpg | Bin images/05-01.jpg | Bin images/05-02.jpg | Bin images/06-01.jpg | Bin images/06-02.jpg | Bin images/08-01.jpg | Bin images/08-02.jpg | Bin images/08-03.jpg | Bin images/09-01.jpg | Bin images/09-02.jpg | Bin images/09-03.jpg | Bin images/09-04.jpg | Bin images/10-01.jpg | Bin images/10-02.jpg | Bin images/10-03.jpg | Bin images/11-01.jpg | Bin images/11-02.jpg | Bin images/11-03.jpg | Bin images/11-04.jpg | Bin images/11-05.jpg | Bin images/11-06.jpg | Bin images/12-01.jpg | Bin images/12-02.jpg | Bin images/13-01.jpg | Bin images/13-02.jpg | Bin images/14-01.jpg | Bin images/14-02.jpg | Bin images/14-03.jpg | Bin images/15-01.jpg | Bin images/15-02.jpg | Bin images/15-03.jpg | Bin images/15-04.jpg | Bin images/15-05.jpg | Bin images/16-01.jpg | Bin images/16-02.jpg | Bin images/17-01.jpg | Bin images/17-02.jpg | Bin images/17-03.jpg | Bin images/18-01.jpg | Bin images/20-01.jpg | Bin images/20-02.jpg | Bin images/20-03.jpg | Bin images/20-04.jpg | Bin images/20-05.jpg | Bin images/20-06.jpg | Bin images/20-07.jpg | Bin images/20-08.jpg | Bin images/21-01.jpg | Bin images/21-02.jpg | Bin images/23-01.jpg | Bin images/23-02.jpg | Bin images/24-01.jpg | Bin images/25-01.jpg | Bin images/25-02.jpg | Bin images/25-03.jpg | Bin images/27-01.jpg | Bin images/29-01.jpg | Bin images/29-02.jpg | Bin images/29-03.jpg | Bin images/29-04.jpg | Bin images/30-01.jpg | Bin images/31-01.jpg | Bin images/32-01.jpg | Bin images/33-01.jpg | Bin images/35-01.jpg | Bin images/35-02.jpg | Bin images/35-03.jpg | Bin images/35-04.jpg | Bin images/35-05.jpg | Bin images/36-01.jpg | Bin images/36-02.jpg | Bin images/36-03.jpg | Bin images/36-04.jpg | Bin images/36-05.jpg | Bin images/38-01.jpg | Bin images/38-02.jpg | Bin images/38-03.jpg | Bin images/40-01.jpg | Bin images/40-02.jpg | Bin images/40-03.jpg | Bin images/41-01.jpg | Bin images/41-02.jpg | Bin images/42-01.jpg | Bin images/42-02.jpg | Bin images/43-01.jpg | Bin images/43-02.jpg | Bin images/43-03.jpg | Bin images/43-04.jpg | Bin images/43-05.jpg | Bin images/44-01.jpg | Bin images/44-02.jpg | Bin images/45-01.jpg | Bin images/45-02.jpg | Bin images/47-01.jpg | Bin images/47-02.jpg | Bin images/48-01.jpg | Bin images/48-02.jpg | Bin images/48-03.jpg | Bin images/49-01.jpg | Bin images/50-01.jpg | Bin images/50-02.jpg | Bin images/50-03.jpg | Bin images/50-04.jpg | Bin images/50-05.jpg | Bin images/51-01.jpg | Bin images/51-02.jpg | Bin images/51-03.jpg | Bin images/51-04.jpg | Bin images/53-01.jpg | Bin images/54-01.jpg | Bin images/54-02.jpg | Bin images/54-03.jpg | Bin images/54-04.jpg | Bin images/55-01.jpg | Bin images/55-02.jpg | Bin images/55-03.jpg | Bin images/56-01.jpg | Bin images/56-02.jpg | Bin images/56-03.jpg | Bin images/56-04.jpg | Bin images/56-05.jpg | Bin images/57-01.jpg | Bin images/58-01.jpg | Bin images/58-02.jpg | Bin images/58-03.jpg | Bin images/58-04.jpg | Bin images/58-05.jpg | Bin images/58-06.jpg | Bin images/58-07.jpg | Bin images/59-01.jpg | Bin images/59-02.jpg | Bin images/59-03.jpg | Bin images/59-04.jpg | Bin images/59-05.jpg | Bin images/59-06.jpg | Bin images/59-07.jpg | Bin images/59-08.jpg | Bin images/59-09.jpg | Bin images/60-01.jpg | Bin images/60-02.jpg | Bin images/60-03.jpg | Bin images/61-01.jpg | Bin images/61-01d.jpg | Bin images/61-02.jpg | Bin images/61-02d.jpg | Bin images/61-03.jpg | Bin images/61-03d.jpg | Bin images/61-04.jpg | Bin images/61-04d.jpg | Bin images/61-05.jpg | Bin images/61-05d.jpg | Bin images/61-06.jpg | Bin images/61-06d.jpg | Bin images/61-07.jpg | Bin images/61-07d.jpg | Bin images/61-08.jpg | Bin images/61-08d.jpg | Bin images/62-01.jpg | Bin images/62-02.jpg | Bin images/62-03.jpg | Bin images/62-04.jpg | Bin images/64-01.jpg | Bin images/64-02.jpg | Bin images/64-03.jpg | Bin images/64-04.jpg | Bin images/64-05.jpg | Bin images/65-01.jpg | Bin images/65-02.jpg | Bin images/65-03.jpg | Bin images/66-01.jpg | Bin images/66-02.jpg | Bin images/66-03.jpg | Bin images/66-04.jpg | Bin images/67-01.jpg | Bin images/67-02.jpg | Bin images/68-01.jpg | Bin images/68-02.jpg | Bin images/68-03.jpg | Bin images/68-04.jpg | Bin images/69-01.jpg | Bin images/69-02.jpg | Bin images/cover.png | Bin images/i.jpg | Bin src/about.md | 0 src/about_author.md | 0 src/appendix-a.md | 0 src/chapter-01.md | 0 src/chapter-02.md | 0 src/chapter-03.md | 0 src/chapter-04.md | 0 src/chapter-05.md | 0 src/chapter-06.md | 0 src/chapter-07.md | 0 src/chapter-08.md | 0 src/chapter-09.md | 0 src/chapter-10.md | 0 src/chapter-11.md | 0 src/chapter-12.md | 0 src/chapter-13.md | 0 src/chapter-14.md | 0 src/chapter-15.md | 0 src/chapter-16.md | 0 src/chapter-17.md | 0 src/chapter-18.md | 0 src/chapter-19.md | 0 src/chapter-20.md | 0 src/chapter-21.md | 0 src/chapter-22.md | 0 src/chapter-23.md | 0 src/chapter-24.md | 0 src/chapter-25.md | 0 src/chapter-26.md | 0 src/chapter-27.md | 0 src/chapter-28.md | 0 src/chapter-29.md | 0 src/chapter-30.md | 0 src/chapter-31.md | 0 src/chapter-32.md | 0 src/chapter-33.md | 0 src/chapter-34.md | 0 src/chapter-35.md | 0 src/chapter-36.md | 0 src/chapter-37.md | 0 src/chapter-38.md | 0 src/chapter-39.md | 0 src/chapter-40.md | 0 src/chapter-41.md | 0 src/chapter-42.md | 0 src/chapter-43.md | 0 src/chapter-44.md | 0 src/chapter-45.md | 0 src/chapter-46.md | 0 src/chapter-47.md | 0 src/chapter-48.md | 0 src/chapter-49.md | 0 src/chapter-50.md | 0 src/chapter-51.md | 0 src/chapter-52.md | 0 src/chapter-53.md | 0 src/chapter-54.md | 0 src/chapter-55.md | 0 src/chapter-56.md | 0 src/chapter-57.md | 0 src/chapter-58.md | 0 src/chapter-59.md | 0 src/chapter-60.md | 0 src/chapter-61.md | 0 src/chapter-62.md | 0 src/chapter-63.md | 0 src/chapter-64.md | 0 src/chapter-65.md | 0 src/chapter-66.md | 0 src/chapter-67.md | 0 src/chapter-68.md | 0 src/chapter-69.md | 0 src/chapter-70.md | 0 src/copyright.md | 0 src/intro.md | 0 276 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 Makefile mode change 100755 => 100644 README.md mode change 100755 => 100644 epub/epub.css mode change 100755 => 100644 epub/template.html mode change 100755 => 100644 html/book.css mode change 100755 => 100644 html/template.html mode change 100755 => 100644 images/02-01.jpg mode change 100755 => 100644 images/02-02.jpg mode change 100755 => 100644 images/03-01.jpg mode change 100755 => 100644 images/03-02.jpg mode change 100755 => 100644 images/03-03.jpg mode change 100755 => 100644 images/04-01.jpg mode change 100755 => 100644 images/04-02.jpg mode change 100755 => 100644 images/04-03.jpg mode change 100755 => 100644 images/04-04.jpg mode change 100755 => 100644 images/04-05.jpg mode change 100755 => 100644 images/04-06.jpg mode change 100755 => 100644 images/04-07.jpg mode change 100755 => 100644 images/04-08.jpg mode change 100755 => 100644 images/05-01.jpg mode change 100755 => 100644 images/05-02.jpg mode change 100755 => 100644 images/06-01.jpg mode change 100755 => 100644 images/06-02.jpg mode change 100755 => 100644 images/08-01.jpg mode change 100755 => 100644 images/08-02.jpg mode change 100755 => 100644 images/08-03.jpg mode change 100755 => 100644 images/09-01.jpg mode change 100755 => 100644 images/09-02.jpg mode change 100755 => 100644 images/09-03.jpg mode change 100755 => 100644 images/09-04.jpg mode change 100755 => 100644 images/10-01.jpg mode change 100755 => 100644 images/10-02.jpg mode change 100755 => 100644 images/10-03.jpg mode change 100755 => 100644 images/11-01.jpg mode change 100755 => 100644 images/11-02.jpg mode change 100755 => 100644 images/11-03.jpg mode change 100755 => 100644 images/11-04.jpg mode change 100755 => 100644 images/11-05.jpg mode change 100755 => 100644 images/11-06.jpg mode change 100755 => 100644 images/12-01.jpg mode change 100755 => 100644 images/12-02.jpg mode change 100755 => 100644 images/13-01.jpg mode change 100755 => 100644 images/13-02.jpg mode change 100755 => 100644 images/14-01.jpg mode change 100755 => 100644 images/14-02.jpg mode change 100755 => 100644 images/14-03.jpg mode change 100755 => 100644 images/15-01.jpg mode change 100755 => 100644 images/15-02.jpg mode change 100755 => 100644 images/15-03.jpg mode change 100755 => 100644 images/15-04.jpg mode change 100755 => 100644 images/15-05.jpg mode change 100755 => 100644 images/16-01.jpg mode change 100755 => 100644 images/16-02.jpg mode change 100755 => 100644 images/17-01.jpg mode change 100755 => 100644 images/17-02.jpg mode change 100755 => 100644 images/17-03.jpg mode change 100755 => 100644 images/18-01.jpg mode change 100755 => 100644 images/20-01.jpg mode change 100755 => 100644 images/20-02.jpg mode change 100755 => 100644 images/20-03.jpg mode change 100755 => 100644 images/20-04.jpg mode change 100755 => 100644 images/20-05.jpg mode change 100755 => 100644 images/20-06.jpg mode change 100755 => 100644 images/20-07.jpg mode change 100755 => 100644 images/20-08.jpg mode change 100755 => 100644 images/21-01.jpg mode change 100755 => 100644 images/21-02.jpg mode change 100755 => 100644 images/23-01.jpg mode change 100755 => 100644 images/23-02.jpg mode change 100755 => 100644 images/24-01.jpg mode change 100755 => 100644 images/25-01.jpg mode change 100755 => 100644 images/25-02.jpg mode change 100755 => 100644 images/25-03.jpg mode change 100755 => 100644 images/27-01.jpg mode change 100755 => 100644 images/29-01.jpg mode change 100755 => 100644 images/29-02.jpg mode change 100755 => 100644 images/29-03.jpg mode change 100755 => 100644 images/29-04.jpg mode change 100755 => 100644 images/30-01.jpg mode change 100755 => 100644 images/31-01.jpg mode change 100755 => 100644 images/32-01.jpg mode change 100755 => 100644 images/33-01.jpg mode change 100755 => 100644 images/35-01.jpg mode change 100755 => 100644 images/35-02.jpg mode change 100755 => 100644 images/35-03.jpg mode change 100755 => 100644 images/35-04.jpg mode change 100755 => 100644 images/35-05.jpg mode change 100755 => 100644 images/36-01.jpg mode change 100755 => 100644 images/36-02.jpg mode change 100755 => 100644 images/36-03.jpg mode change 100755 => 100644 images/36-04.jpg mode change 100755 => 100644 images/36-05.jpg mode change 100755 => 100644 images/38-01.jpg mode change 100755 => 100644 images/38-02.jpg mode change 100755 => 100644 images/38-03.jpg mode change 100755 => 100644 images/40-01.jpg mode change 100755 => 100644 images/40-02.jpg mode change 100755 => 100644 images/40-03.jpg mode change 100755 => 100644 images/41-01.jpg mode change 100755 => 100644 images/41-02.jpg mode change 100755 => 100644 images/42-01.jpg mode change 100755 => 100644 images/42-02.jpg mode change 100755 => 100644 images/43-01.jpg mode change 100755 => 100644 images/43-02.jpg mode change 100755 => 100644 images/43-03.jpg mode change 100755 => 100644 images/43-04.jpg mode change 100755 => 100644 images/43-05.jpg mode change 100755 => 100644 images/44-01.jpg mode change 100755 => 100644 images/44-02.jpg mode change 100755 => 100644 images/45-01.jpg mode change 100755 => 100644 images/45-02.jpg mode change 100755 => 100644 images/47-01.jpg mode change 100755 => 100644 images/47-02.jpg mode change 100755 => 100644 images/48-01.jpg mode change 100755 => 100644 images/48-02.jpg mode change 100755 => 100644 images/48-03.jpg mode change 100755 => 100644 images/49-01.jpg mode change 100755 => 100644 images/50-01.jpg mode change 100755 => 100644 images/50-02.jpg mode change 100755 => 100644 images/50-03.jpg mode change 100755 => 100644 images/50-04.jpg mode change 100755 => 100644 images/50-05.jpg mode change 100755 => 100644 images/51-01.jpg mode change 100755 => 100644 images/51-02.jpg mode change 100755 => 100644 images/51-03.jpg mode change 100755 => 100644 images/51-04.jpg mode change 100755 => 100644 images/53-01.jpg mode change 100755 => 100644 images/54-01.jpg mode change 100755 => 100644 images/54-02.jpg mode change 100755 => 100644 images/54-03.jpg mode change 100755 => 100644 images/54-04.jpg mode change 100755 => 100644 images/55-01.jpg mode change 100755 => 100644 images/55-02.jpg mode change 100755 => 100644 images/55-03.jpg mode change 100755 => 100644 images/56-01.jpg mode change 100755 => 100644 images/56-02.jpg mode change 100755 => 100644 images/56-03.jpg mode change 100755 => 100644 images/56-04.jpg mode change 100755 => 100644 images/56-05.jpg mode change 100755 => 100644 images/57-01.jpg mode change 100755 => 100644 images/58-01.jpg mode change 100755 => 100644 images/58-02.jpg mode change 100755 => 100644 images/58-03.jpg mode change 100755 => 100644 images/58-04.jpg mode change 100755 => 100644 images/58-05.jpg mode change 100755 => 100644 images/58-06.jpg mode change 100755 => 100644 images/58-07.jpg mode change 100755 => 100644 images/59-01.jpg mode change 100755 => 100644 images/59-02.jpg mode change 100755 => 100644 images/59-03.jpg mode change 100755 => 100644 images/59-04.jpg mode change 100755 => 100644 images/59-05.jpg mode change 100755 => 100644 images/59-06.jpg mode change 100755 => 100644 images/59-07.jpg mode change 100755 => 100644 images/59-08.jpg mode change 100755 => 100644 images/59-09.jpg mode change 100755 => 100644 images/60-01.jpg mode change 100755 => 100644 images/60-02.jpg mode change 100755 => 100644 images/60-03.jpg mode change 100755 => 100644 images/61-01.jpg mode change 100755 => 100644 images/61-01d.jpg mode change 100755 => 100644 images/61-02.jpg mode change 100755 => 100644 images/61-02d.jpg mode change 100755 => 100644 images/61-03.jpg mode change 100755 => 100644 images/61-03d.jpg mode change 100755 => 100644 images/61-04.jpg mode change 100755 => 100644 images/61-04d.jpg mode change 100755 => 100644 images/61-05.jpg mode change 100755 => 100644 images/61-05d.jpg mode change 100755 => 100644 images/61-06.jpg mode change 100755 => 100644 images/61-06d.jpg mode change 100755 => 100644 images/61-07.jpg mode change 100755 => 100644 images/61-07d.jpg mode change 100755 => 100644 images/61-08.jpg mode change 100755 => 100644 images/61-08d.jpg mode change 100755 => 100644 images/62-01.jpg mode change 100755 => 100644 images/62-02.jpg mode change 100755 => 100644 images/62-03.jpg mode change 100755 => 100644 images/62-04.jpg mode change 100755 => 100644 images/64-01.jpg mode change 100755 => 100644 images/64-02.jpg mode change 100755 => 100644 images/64-03.jpg mode change 100755 => 100644 images/64-04.jpg mode change 100755 => 100644 images/64-05.jpg mode change 100755 => 100644 images/65-01.jpg mode change 100755 => 100644 images/65-02.jpg mode change 100755 => 100644 images/65-03.jpg mode change 100755 => 100644 images/66-01.jpg mode change 100755 => 100644 images/66-02.jpg mode change 100755 => 100644 images/66-03.jpg mode change 100755 => 100644 images/66-04.jpg mode change 100755 => 100644 images/67-01.jpg mode change 100755 => 100644 images/67-02.jpg mode change 100755 => 100644 images/68-01.jpg mode change 100755 => 100644 images/68-02.jpg mode change 100755 => 100644 images/68-03.jpg mode change 100755 => 100644 images/68-04.jpg mode change 100755 => 100644 images/69-01.jpg mode change 100755 => 100644 images/69-02.jpg mode change 100755 => 100644 images/cover.png mode change 100755 => 100644 images/i.jpg mode change 100755 => 100644 src/about.md mode change 100755 => 100644 src/about_author.md mode change 100755 => 100644 src/appendix-a.md mode change 100755 => 100644 src/chapter-01.md mode change 100755 => 100644 src/chapter-02.md mode change 100755 => 100644 src/chapter-03.md mode change 100755 => 100644 src/chapter-04.md mode change 100755 => 100644 src/chapter-05.md mode change 100755 => 100644 src/chapter-06.md mode change 100755 => 100644 src/chapter-07.md mode change 100755 => 100644 src/chapter-08.md mode change 100755 => 100644 src/chapter-09.md mode change 100755 => 100644 src/chapter-10.md mode change 100755 => 100644 src/chapter-11.md mode change 100755 => 100644 src/chapter-12.md mode change 100755 => 100644 src/chapter-13.md mode change 100755 => 100644 src/chapter-14.md mode change 100755 => 100644 src/chapter-15.md mode change 100755 => 100644 src/chapter-16.md mode change 100755 => 100644 src/chapter-17.md mode change 100755 => 100644 src/chapter-18.md mode change 100755 => 100644 src/chapter-19.md mode change 100755 => 100644 src/chapter-20.md mode change 100755 => 100644 src/chapter-21.md mode change 100755 => 100644 src/chapter-22.md mode change 100755 => 100644 src/chapter-23.md mode change 100755 => 100644 src/chapter-24.md mode change 100755 => 100644 src/chapter-25.md mode change 100755 => 100644 src/chapter-26.md mode change 100755 => 100644 src/chapter-27.md mode change 100755 => 100644 src/chapter-28.md mode change 100755 => 100644 src/chapter-29.md mode change 100755 => 100644 src/chapter-30.md mode change 100755 => 100644 src/chapter-31.md mode change 100755 => 100644 src/chapter-32.md mode change 100755 => 100644 src/chapter-33.md mode change 100755 => 100644 src/chapter-34.md mode change 100755 => 100644 src/chapter-35.md mode change 100755 => 100644 src/chapter-36.md mode change 100755 => 100644 src/chapter-37.md mode change 100755 => 100644 src/chapter-38.md mode change 100755 => 100644 src/chapter-39.md mode change 100755 => 100644 src/chapter-40.md mode change 100755 => 100644 src/chapter-41.md mode change 100755 => 100644 src/chapter-42.md mode change 100755 => 100644 src/chapter-43.md mode change 100755 => 100644 src/chapter-44.md mode change 100755 => 100644 src/chapter-45.md mode change 100755 => 100644 src/chapter-46.md mode change 100755 => 100644 src/chapter-47.md mode change 100755 => 100644 src/chapter-48.md mode change 100755 => 100644 src/chapter-49.md mode change 100755 => 100644 src/chapter-50.md mode change 100755 => 100644 src/chapter-51.md mode change 100755 => 100644 src/chapter-52.md mode change 100755 => 100644 src/chapter-53.md mode change 100755 => 100644 src/chapter-54.md mode change 100755 => 100644 src/chapter-55.md mode change 100755 => 100644 src/chapter-56.md mode change 100755 => 100644 src/chapter-57.md mode change 100755 => 100644 src/chapter-58.md mode change 100755 => 100644 src/chapter-59.md mode change 100755 => 100644 src/chapter-60.md mode change 100755 => 100644 src/chapter-61.md mode change 100755 => 100644 src/chapter-62.md mode change 100755 => 100644 src/chapter-63.md mode change 100755 => 100644 src/chapter-64.md mode change 100755 => 100644 src/chapter-65.md mode change 100755 => 100644 src/chapter-66.md mode change 100755 => 100644 src/chapter-67.md mode change 100755 => 100644 src/chapter-68.md mode change 100755 => 100644 src/chapter-69.md mode change 100755 => 100644 src/chapter-70.md mode change 100755 => 100644 src/copyright.md mode change 100755 => 100644 src/intro.md diff --git a/Makefile b/Makefile old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/epub/epub.css b/epub/epub.css old mode 100755 new mode 100644 diff --git a/epub/template.html b/epub/template.html old mode 100755 new mode 100644 diff --git a/html/book.css b/html/book.css old mode 100755 new mode 100644 diff --git a/html/template.html b/html/template.html old mode 100755 new mode 100644 diff --git a/images/02-01.jpg b/images/02-01.jpg old mode 100755 new mode 100644 diff --git a/images/02-02.jpg b/images/02-02.jpg old mode 100755 new mode 100644 diff --git a/images/03-01.jpg b/images/03-01.jpg old mode 100755 new mode 100644 diff --git a/images/03-02.jpg b/images/03-02.jpg old mode 100755 new mode 100644 diff --git a/images/03-03.jpg b/images/03-03.jpg old mode 100755 new mode 100644 diff --git a/images/04-01.jpg b/images/04-01.jpg old mode 100755 new mode 100644 diff --git a/images/04-02.jpg b/images/04-02.jpg old mode 100755 new mode 100644 diff --git a/images/04-03.jpg b/images/04-03.jpg old mode 100755 new mode 100644 diff --git a/images/04-04.jpg b/images/04-04.jpg old mode 100755 new mode 100644 diff --git a/images/04-05.jpg b/images/04-05.jpg old mode 100755 new mode 100644 diff --git a/images/04-06.jpg b/images/04-06.jpg old mode 100755 new mode 100644 diff --git a/images/04-07.jpg b/images/04-07.jpg old mode 100755 new mode 100644 diff --git a/images/04-08.jpg b/images/04-08.jpg old mode 100755 new mode 100644 diff --git a/images/05-01.jpg b/images/05-01.jpg old mode 100755 new mode 100644 diff --git a/images/05-02.jpg b/images/05-02.jpg old mode 100755 new mode 100644 diff --git a/images/06-01.jpg b/images/06-01.jpg old mode 100755 new mode 100644 diff --git a/images/06-02.jpg b/images/06-02.jpg old mode 100755 new mode 100644 diff --git a/images/08-01.jpg b/images/08-01.jpg old mode 100755 new mode 100644 diff --git a/images/08-02.jpg b/images/08-02.jpg old mode 100755 new mode 100644 diff --git a/images/08-03.jpg b/images/08-03.jpg old mode 100755 new mode 100644 diff --git a/images/09-01.jpg b/images/09-01.jpg old mode 100755 new mode 100644 diff --git a/images/09-02.jpg b/images/09-02.jpg old mode 100755 new mode 100644 diff --git a/images/09-03.jpg b/images/09-03.jpg old mode 100755 new mode 100644 diff --git a/images/09-04.jpg b/images/09-04.jpg old mode 100755 new mode 100644 diff --git a/images/10-01.jpg b/images/10-01.jpg old mode 100755 new mode 100644 diff --git a/images/10-02.jpg b/images/10-02.jpg old mode 100755 new mode 100644 diff --git a/images/10-03.jpg b/images/10-03.jpg old mode 100755 new mode 100644 diff --git a/images/11-01.jpg b/images/11-01.jpg old mode 100755 new mode 100644 diff --git a/images/11-02.jpg b/images/11-02.jpg old mode 100755 new mode 100644 diff --git a/images/11-03.jpg b/images/11-03.jpg old mode 100755 new mode 100644 diff --git a/images/11-04.jpg b/images/11-04.jpg old mode 100755 new mode 100644 diff --git a/images/11-05.jpg b/images/11-05.jpg old mode 100755 new mode 100644 diff --git a/images/11-06.jpg b/images/11-06.jpg old mode 100755 new mode 100644 diff --git a/images/12-01.jpg b/images/12-01.jpg old mode 100755 new mode 100644 diff --git a/images/12-02.jpg b/images/12-02.jpg old mode 100755 new mode 100644 diff --git a/images/13-01.jpg b/images/13-01.jpg old mode 100755 new mode 100644 diff --git a/images/13-02.jpg b/images/13-02.jpg old mode 100755 new mode 100644 diff --git a/images/14-01.jpg b/images/14-01.jpg old mode 100755 new mode 100644 diff --git a/images/14-02.jpg b/images/14-02.jpg old mode 100755 new mode 100644 diff --git a/images/14-03.jpg b/images/14-03.jpg old mode 100755 new mode 100644 diff --git a/images/15-01.jpg b/images/15-01.jpg old mode 100755 new mode 100644 diff --git a/images/15-02.jpg b/images/15-02.jpg old mode 100755 new mode 100644 diff --git a/images/15-03.jpg b/images/15-03.jpg old mode 100755 new mode 100644 diff --git a/images/15-04.jpg b/images/15-04.jpg old mode 100755 new mode 100644 diff --git a/images/15-05.jpg b/images/15-05.jpg old mode 100755 new mode 100644 diff --git a/images/16-01.jpg b/images/16-01.jpg old mode 100755 new mode 100644 diff --git a/images/16-02.jpg b/images/16-02.jpg old mode 100755 new mode 100644 diff --git a/images/17-01.jpg b/images/17-01.jpg old mode 100755 new mode 100644 diff --git a/images/17-02.jpg b/images/17-02.jpg old mode 100755 new mode 100644 diff --git a/images/17-03.jpg b/images/17-03.jpg old mode 100755 new mode 100644 diff --git a/images/18-01.jpg b/images/18-01.jpg old mode 100755 new mode 100644 diff --git a/images/20-01.jpg b/images/20-01.jpg old mode 100755 new mode 100644 diff --git a/images/20-02.jpg b/images/20-02.jpg old mode 100755 new mode 100644 diff --git a/images/20-03.jpg b/images/20-03.jpg old mode 100755 new mode 100644 diff --git a/images/20-04.jpg b/images/20-04.jpg old mode 100755 new mode 100644 diff --git a/images/20-05.jpg b/images/20-05.jpg old mode 100755 new mode 100644 diff --git a/images/20-06.jpg b/images/20-06.jpg old mode 100755 new mode 100644 diff --git a/images/20-07.jpg b/images/20-07.jpg old mode 100755 new mode 100644 diff --git a/images/20-08.jpg b/images/20-08.jpg old mode 100755 new mode 100644 diff --git a/images/21-01.jpg b/images/21-01.jpg old mode 100755 new mode 100644 diff --git a/images/21-02.jpg b/images/21-02.jpg old mode 100755 new mode 100644 diff --git a/images/23-01.jpg b/images/23-01.jpg old mode 100755 new mode 100644 diff --git a/images/23-02.jpg b/images/23-02.jpg old mode 100755 new mode 100644 diff --git a/images/24-01.jpg b/images/24-01.jpg old mode 100755 new mode 100644 diff --git a/images/25-01.jpg b/images/25-01.jpg old mode 100755 new mode 100644 diff --git a/images/25-02.jpg b/images/25-02.jpg old mode 100755 new mode 100644 diff --git a/images/25-03.jpg b/images/25-03.jpg old mode 100755 new mode 100644 diff --git a/images/27-01.jpg b/images/27-01.jpg old mode 100755 new mode 100644 diff --git a/images/29-01.jpg b/images/29-01.jpg old mode 100755 new mode 100644 diff --git a/images/29-02.jpg b/images/29-02.jpg old mode 100755 new mode 100644 diff --git a/images/29-03.jpg b/images/29-03.jpg old mode 100755 new mode 100644 diff --git a/images/29-04.jpg b/images/29-04.jpg old mode 100755 new mode 100644 diff --git a/images/30-01.jpg b/images/30-01.jpg old mode 100755 new mode 100644 diff --git a/images/31-01.jpg b/images/31-01.jpg old mode 100755 new mode 100644 diff --git a/images/32-01.jpg b/images/32-01.jpg old mode 100755 new mode 100644 diff --git a/images/33-01.jpg b/images/33-01.jpg old mode 100755 new mode 100644 diff --git a/images/35-01.jpg b/images/35-01.jpg old mode 100755 new mode 100644 diff --git a/images/35-02.jpg b/images/35-02.jpg old mode 100755 new mode 100644 diff --git a/images/35-03.jpg b/images/35-03.jpg old mode 100755 new mode 100644 diff --git a/images/35-04.jpg b/images/35-04.jpg old mode 100755 new mode 100644 diff --git a/images/35-05.jpg b/images/35-05.jpg old mode 100755 new mode 100644 diff --git a/images/36-01.jpg b/images/36-01.jpg old mode 100755 new mode 100644 diff --git a/images/36-02.jpg b/images/36-02.jpg old mode 100755 new mode 100644 diff --git a/images/36-03.jpg b/images/36-03.jpg old mode 100755 new mode 100644 diff --git a/images/36-04.jpg b/images/36-04.jpg old mode 100755 new mode 100644 diff --git a/images/36-05.jpg b/images/36-05.jpg old mode 100755 new mode 100644 diff --git a/images/38-01.jpg b/images/38-01.jpg old mode 100755 new mode 100644 diff --git a/images/38-02.jpg b/images/38-02.jpg old mode 100755 new mode 100644 diff --git a/images/38-03.jpg b/images/38-03.jpg old mode 100755 new mode 100644 diff --git a/images/40-01.jpg b/images/40-01.jpg old mode 100755 new mode 100644 diff --git a/images/40-02.jpg b/images/40-02.jpg old mode 100755 new mode 100644 diff --git a/images/40-03.jpg b/images/40-03.jpg old mode 100755 new mode 100644 diff --git a/images/41-01.jpg b/images/41-01.jpg old mode 100755 new mode 100644 diff --git a/images/41-02.jpg b/images/41-02.jpg old mode 100755 new mode 100644 diff --git a/images/42-01.jpg b/images/42-01.jpg old mode 100755 new mode 100644 diff --git a/images/42-02.jpg b/images/42-02.jpg old mode 100755 new mode 100644 diff --git a/images/43-01.jpg b/images/43-01.jpg old mode 100755 new mode 100644 diff --git a/images/43-02.jpg b/images/43-02.jpg old mode 100755 new mode 100644 diff --git a/images/43-03.jpg b/images/43-03.jpg old mode 100755 new mode 100644 diff --git a/images/43-04.jpg b/images/43-04.jpg old mode 100755 new mode 100644 diff --git a/images/43-05.jpg b/images/43-05.jpg old mode 100755 new mode 100644 diff --git a/images/44-01.jpg b/images/44-01.jpg old mode 100755 new mode 100644 diff --git a/images/44-02.jpg b/images/44-02.jpg old mode 100755 new mode 100644 diff --git a/images/45-01.jpg b/images/45-01.jpg old mode 100755 new mode 100644 diff --git a/images/45-02.jpg b/images/45-02.jpg old mode 100755 new mode 100644 diff --git a/images/47-01.jpg b/images/47-01.jpg old mode 100755 new mode 100644 diff --git a/images/47-02.jpg b/images/47-02.jpg old mode 100755 new mode 100644 diff --git a/images/48-01.jpg b/images/48-01.jpg old mode 100755 new mode 100644 diff --git a/images/48-02.jpg b/images/48-02.jpg old mode 100755 new mode 100644 diff --git a/images/48-03.jpg b/images/48-03.jpg old mode 100755 new mode 100644 diff --git a/images/49-01.jpg b/images/49-01.jpg old mode 100755 new mode 100644 diff --git a/images/50-01.jpg b/images/50-01.jpg old mode 100755 new mode 100644 diff --git a/images/50-02.jpg b/images/50-02.jpg old mode 100755 new mode 100644 diff --git a/images/50-03.jpg b/images/50-03.jpg old mode 100755 new mode 100644 diff --git a/images/50-04.jpg b/images/50-04.jpg old mode 100755 new mode 100644 diff --git a/images/50-05.jpg b/images/50-05.jpg old mode 100755 new mode 100644 diff --git a/images/51-01.jpg b/images/51-01.jpg old mode 100755 new mode 100644 diff --git a/images/51-02.jpg b/images/51-02.jpg old mode 100755 new mode 100644 diff --git a/images/51-03.jpg b/images/51-03.jpg old mode 100755 new mode 100644 diff --git a/images/51-04.jpg b/images/51-04.jpg old mode 100755 new mode 100644 diff --git a/images/53-01.jpg b/images/53-01.jpg old mode 100755 new mode 100644 diff --git a/images/54-01.jpg b/images/54-01.jpg old mode 100755 new mode 100644 diff --git a/images/54-02.jpg b/images/54-02.jpg old mode 100755 new mode 100644 diff --git a/images/54-03.jpg b/images/54-03.jpg old mode 100755 new mode 100644 diff --git a/images/54-04.jpg b/images/54-04.jpg old mode 100755 new mode 100644 diff --git a/images/55-01.jpg b/images/55-01.jpg old mode 100755 new mode 100644 diff --git a/images/55-02.jpg b/images/55-02.jpg old mode 100755 new mode 100644 diff --git a/images/55-03.jpg b/images/55-03.jpg old mode 100755 new mode 100644 diff --git a/images/56-01.jpg b/images/56-01.jpg old mode 100755 new mode 100644 diff --git a/images/56-02.jpg b/images/56-02.jpg old mode 100755 new mode 100644 diff --git a/images/56-03.jpg b/images/56-03.jpg old mode 100755 new mode 100644 diff --git a/images/56-04.jpg b/images/56-04.jpg old mode 100755 new mode 100644 diff --git a/images/56-05.jpg b/images/56-05.jpg old mode 100755 new mode 100644 diff --git a/images/57-01.jpg b/images/57-01.jpg old mode 100755 new mode 100644 diff --git a/images/58-01.jpg b/images/58-01.jpg old mode 100755 new mode 100644 diff --git a/images/58-02.jpg b/images/58-02.jpg old mode 100755 new mode 100644 diff --git a/images/58-03.jpg b/images/58-03.jpg old mode 100755 new mode 100644 diff --git a/images/58-04.jpg b/images/58-04.jpg old mode 100755 new mode 100644 diff --git a/images/58-05.jpg b/images/58-05.jpg old mode 100755 new mode 100644 diff --git a/images/58-06.jpg b/images/58-06.jpg old mode 100755 new mode 100644 diff --git a/images/58-07.jpg b/images/58-07.jpg old mode 100755 new mode 100644 diff --git a/images/59-01.jpg b/images/59-01.jpg old mode 100755 new mode 100644 diff --git a/images/59-02.jpg b/images/59-02.jpg old mode 100755 new mode 100644 diff --git a/images/59-03.jpg b/images/59-03.jpg old mode 100755 new mode 100644 diff --git a/images/59-04.jpg b/images/59-04.jpg old mode 100755 new mode 100644 diff --git a/images/59-05.jpg b/images/59-05.jpg old mode 100755 new mode 100644 diff --git a/images/59-06.jpg b/images/59-06.jpg old mode 100755 new mode 100644 diff --git a/images/59-07.jpg b/images/59-07.jpg old mode 100755 new mode 100644 diff --git a/images/59-08.jpg b/images/59-08.jpg old mode 100755 new mode 100644 diff --git a/images/59-09.jpg b/images/59-09.jpg old mode 100755 new mode 100644 diff --git a/images/60-01.jpg b/images/60-01.jpg old mode 100755 new mode 100644 diff --git a/images/60-02.jpg b/images/60-02.jpg old mode 100755 new mode 100644 diff --git a/images/60-03.jpg b/images/60-03.jpg old mode 100755 new mode 100644 diff --git a/images/61-01.jpg b/images/61-01.jpg old mode 100755 new mode 100644 diff --git a/images/61-01d.jpg b/images/61-01d.jpg old mode 100755 new mode 100644 diff --git a/images/61-02.jpg b/images/61-02.jpg old mode 100755 new mode 100644 diff --git a/images/61-02d.jpg b/images/61-02d.jpg old mode 100755 new mode 100644 diff --git a/images/61-03.jpg b/images/61-03.jpg old mode 100755 new mode 100644 diff --git a/images/61-03d.jpg b/images/61-03d.jpg old mode 100755 new mode 100644 diff --git a/images/61-04.jpg b/images/61-04.jpg old mode 100755 new mode 100644 diff --git a/images/61-04d.jpg b/images/61-04d.jpg old mode 100755 new mode 100644 diff --git a/images/61-05.jpg b/images/61-05.jpg old mode 100755 new mode 100644 diff --git a/images/61-05d.jpg b/images/61-05d.jpg old mode 100755 new mode 100644 diff --git a/images/61-06.jpg b/images/61-06.jpg old mode 100755 new mode 100644 diff --git a/images/61-06d.jpg b/images/61-06d.jpg old mode 100755 new mode 100644 diff --git a/images/61-07.jpg b/images/61-07.jpg old mode 100755 new mode 100644 diff --git a/images/61-07d.jpg b/images/61-07d.jpg old mode 100755 new mode 100644 diff --git a/images/61-08.jpg b/images/61-08.jpg old mode 100755 new mode 100644 diff --git a/images/61-08d.jpg b/images/61-08d.jpg old mode 100755 new mode 100644 diff --git a/images/62-01.jpg b/images/62-01.jpg old mode 100755 new mode 100644 diff --git a/images/62-02.jpg b/images/62-02.jpg old mode 100755 new mode 100644 diff --git a/images/62-03.jpg b/images/62-03.jpg old mode 100755 new mode 100644 diff --git a/images/62-04.jpg b/images/62-04.jpg old mode 100755 new mode 100644 diff --git a/images/64-01.jpg b/images/64-01.jpg old mode 100755 new mode 100644 diff --git a/images/64-02.jpg b/images/64-02.jpg old mode 100755 new mode 100644 diff --git a/images/64-03.jpg b/images/64-03.jpg old mode 100755 new mode 100644 diff --git a/images/64-04.jpg b/images/64-04.jpg old mode 100755 new mode 100644 diff --git a/images/64-05.jpg b/images/64-05.jpg old mode 100755 new mode 100644 diff --git a/images/65-01.jpg b/images/65-01.jpg old mode 100755 new mode 100644 diff --git a/images/65-02.jpg b/images/65-02.jpg old mode 100755 new mode 100644 diff --git a/images/65-03.jpg b/images/65-03.jpg old mode 100755 new mode 100644 diff --git a/images/66-01.jpg b/images/66-01.jpg old mode 100755 new mode 100644 diff --git a/images/66-02.jpg b/images/66-02.jpg old mode 100755 new mode 100644 diff --git a/images/66-03.jpg b/images/66-03.jpg old mode 100755 new mode 100644 diff --git a/images/66-04.jpg b/images/66-04.jpg old mode 100755 new mode 100644 diff --git a/images/67-01.jpg b/images/67-01.jpg old mode 100755 new mode 100644 diff --git a/images/67-02.jpg b/images/67-02.jpg old mode 100755 new mode 100644 diff --git a/images/68-01.jpg b/images/68-01.jpg old mode 100755 new mode 100644 diff --git a/images/68-02.jpg b/images/68-02.jpg old mode 100755 new mode 100644 diff --git a/images/68-03.jpg b/images/68-03.jpg old mode 100755 new mode 100644 diff --git a/images/68-04.jpg b/images/68-04.jpg old mode 100755 new mode 100644 diff --git a/images/69-01.jpg b/images/69-01.jpg old mode 100755 new mode 100644 diff --git a/images/69-02.jpg b/images/69-02.jpg old mode 100755 new mode 100644 diff --git a/images/cover.png b/images/cover.png old mode 100755 new mode 100644 diff --git a/images/i.jpg b/images/i.jpg old mode 100755 new mode 100644 diff --git a/src/about.md b/src/about.md old mode 100755 new mode 100644 diff --git a/src/about_author.md b/src/about_author.md old mode 100755 new mode 100644 diff --git a/src/appendix-a.md b/src/appendix-a.md old mode 100755 new mode 100644 diff --git a/src/chapter-01.md b/src/chapter-01.md old mode 100755 new mode 100644 diff --git a/src/chapter-02.md b/src/chapter-02.md old mode 100755 new mode 100644 diff --git a/src/chapter-03.md b/src/chapter-03.md old mode 100755 new mode 100644 diff --git a/src/chapter-04.md b/src/chapter-04.md old mode 100755 new mode 100644 diff --git a/src/chapter-05.md b/src/chapter-05.md old mode 100755 new mode 100644 diff --git a/src/chapter-06.md b/src/chapter-06.md old mode 100755 new mode 100644 diff --git a/src/chapter-07.md b/src/chapter-07.md old mode 100755 new mode 100644 diff --git a/src/chapter-08.md b/src/chapter-08.md old mode 100755 new mode 100644 diff --git a/src/chapter-09.md b/src/chapter-09.md old mode 100755 new mode 100644 diff --git a/src/chapter-10.md b/src/chapter-10.md old mode 100755 new mode 100644 diff --git a/src/chapter-11.md b/src/chapter-11.md old mode 100755 new mode 100644 diff --git a/src/chapter-12.md b/src/chapter-12.md old mode 100755 new mode 100644 diff --git a/src/chapter-13.md b/src/chapter-13.md old mode 100755 new mode 100644 diff --git a/src/chapter-14.md b/src/chapter-14.md old mode 100755 new mode 100644 diff --git a/src/chapter-15.md b/src/chapter-15.md old mode 100755 new mode 100644 diff --git a/src/chapter-16.md b/src/chapter-16.md old mode 100755 new mode 100644 diff --git a/src/chapter-17.md b/src/chapter-17.md old mode 100755 new mode 100644 diff --git a/src/chapter-18.md b/src/chapter-18.md old mode 100755 new mode 100644 diff --git a/src/chapter-19.md b/src/chapter-19.md old mode 100755 new mode 100644 diff --git a/src/chapter-20.md b/src/chapter-20.md old mode 100755 new mode 100644 diff --git a/src/chapter-21.md b/src/chapter-21.md old mode 100755 new mode 100644 diff --git a/src/chapter-22.md b/src/chapter-22.md old mode 100755 new mode 100644 diff --git a/src/chapter-23.md b/src/chapter-23.md old mode 100755 new mode 100644 diff --git a/src/chapter-24.md b/src/chapter-24.md old mode 100755 new mode 100644 diff --git a/src/chapter-25.md b/src/chapter-25.md old mode 100755 new mode 100644 diff --git a/src/chapter-26.md b/src/chapter-26.md old mode 100755 new mode 100644 diff --git a/src/chapter-27.md b/src/chapter-27.md old mode 100755 new mode 100644 diff --git a/src/chapter-28.md b/src/chapter-28.md old mode 100755 new mode 100644 diff --git a/src/chapter-29.md b/src/chapter-29.md old mode 100755 new mode 100644 diff --git a/src/chapter-30.md b/src/chapter-30.md old mode 100755 new mode 100644 diff --git a/src/chapter-31.md b/src/chapter-31.md old mode 100755 new mode 100644 diff --git a/src/chapter-32.md b/src/chapter-32.md old mode 100755 new mode 100644 diff --git a/src/chapter-33.md b/src/chapter-33.md old mode 100755 new mode 100644 diff --git a/src/chapter-34.md b/src/chapter-34.md old mode 100755 new mode 100644 diff --git a/src/chapter-35.md b/src/chapter-35.md old mode 100755 new mode 100644 diff --git a/src/chapter-36.md b/src/chapter-36.md old mode 100755 new mode 100644 diff --git a/src/chapter-37.md b/src/chapter-37.md old mode 100755 new mode 100644 diff --git a/src/chapter-38.md b/src/chapter-38.md old mode 100755 new mode 100644 diff --git a/src/chapter-39.md b/src/chapter-39.md old mode 100755 new mode 100644 diff --git a/src/chapter-40.md b/src/chapter-40.md old mode 100755 new mode 100644 diff --git a/src/chapter-41.md b/src/chapter-41.md old mode 100755 new mode 100644 diff --git a/src/chapter-42.md b/src/chapter-42.md old mode 100755 new mode 100644 diff --git a/src/chapter-43.md b/src/chapter-43.md old mode 100755 new mode 100644 diff --git a/src/chapter-44.md b/src/chapter-44.md old mode 100755 new mode 100644 diff --git a/src/chapter-45.md b/src/chapter-45.md old mode 100755 new mode 100644 diff --git a/src/chapter-46.md b/src/chapter-46.md old mode 100755 new mode 100644 diff --git a/src/chapter-47.md b/src/chapter-47.md old mode 100755 new mode 100644 diff --git a/src/chapter-48.md b/src/chapter-48.md old mode 100755 new mode 100644 diff --git a/src/chapter-49.md b/src/chapter-49.md old mode 100755 new mode 100644 diff --git a/src/chapter-50.md b/src/chapter-50.md old mode 100755 new mode 100644 diff --git a/src/chapter-51.md b/src/chapter-51.md old mode 100755 new mode 100644 diff --git a/src/chapter-52.md b/src/chapter-52.md old mode 100755 new mode 100644 diff --git a/src/chapter-53.md b/src/chapter-53.md old mode 100755 new mode 100644 diff --git a/src/chapter-54.md b/src/chapter-54.md old mode 100755 new mode 100644 diff --git a/src/chapter-55.md b/src/chapter-55.md old mode 100755 new mode 100644 diff --git a/src/chapter-56.md b/src/chapter-56.md old mode 100755 new mode 100644 diff --git a/src/chapter-57.md b/src/chapter-57.md old mode 100755 new mode 100644 diff --git a/src/chapter-58.md b/src/chapter-58.md old mode 100755 new mode 100644 diff --git a/src/chapter-59.md b/src/chapter-59.md old mode 100755 new mode 100644 diff --git a/src/chapter-60.md b/src/chapter-60.md old mode 100755 new mode 100644 diff --git a/src/chapter-61.md b/src/chapter-61.md old mode 100755 new mode 100644 diff --git a/src/chapter-62.md b/src/chapter-62.md old mode 100755 new mode 100644 diff --git a/src/chapter-63.md b/src/chapter-63.md old mode 100755 new mode 100644 diff --git a/src/chapter-64.md b/src/chapter-64.md old mode 100755 new mode 100644 diff --git a/src/chapter-65.md b/src/chapter-65.md old mode 100755 new mode 100644 diff --git a/src/chapter-66.md b/src/chapter-66.md old mode 100755 new mode 100644 diff --git a/src/chapter-67.md b/src/chapter-67.md old mode 100755 new mode 100644 diff --git a/src/chapter-68.md b/src/chapter-68.md old mode 100755 new mode 100644 diff --git a/src/chapter-69.md b/src/chapter-69.md old mode 100755 new mode 100644 diff --git a/src/chapter-70.md b/src/chapter-70.md old mode 100755 new mode 100644 diff --git a/src/copyright.md b/src/copyright.md old mode 100755 new mode 100644 diff --git a/src/intro.md b/src/intro.md old mode 100755 new mode 100644 From 7f2f1f56899c5b9b11756200a2477852d0cde5a2 Mon Sep 17 00:00:00 2001 From: Daniel George Holz Date: Tue, 1 Aug 2017 10:38:28 +0100 Subject: [PATCH 23/55] fix typo 'new' -> 'knew' in about.md --- src/about.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/about.md b/src/about.md index 0e7a007..ab92676 100644 --- a/src/about.md +++ b/src/about.md @@ -23,7 +23,7 @@ learn in the space of a few months on the PC. The biggest benefit to me of actually making money as a programmer was the ability to buy all the books and magazines I wanted. I bought a lot. -I was in territory that I new almost nothing about, so I read +I was in territory that I knew almost nothing about, so I read *everything* that I could get my hands on. Feature articles, editorials, even advertisements held information for me to assimilate. From 3f04c2c77fd02b827b8ded28750a85dae95be27c Mon Sep 17 00:00:00 2001 From: TheFakeMontyOnTheRun Date: Sun, 27 Aug 2017 20:29:36 +0100 Subject: [PATCH 24/55] Fix OCR error/typo in chapter 4 Not only cycles were eaten ;-P --- src/chapter-04.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-04.md b/src/chapter-04.md index c0b364d..cb765b6 100644 --- a/src/chapter-04.md +++ b/src/chapter-04.md @@ -1053,7 +1053,7 @@ reduction can vary considerably and unpredictably, depending on how the DRAM refreshes interact with your code's pattern of memory accesses. When you use the Zen timer and get a fractional cycle count for the execution time of an instruction, that's often the DRAM refresh -cycle-eater at work. (The display adapter cycleis another possible +cycle-eater at work. (The display adapter cycle is another possible culprit, and, on 386s and later processors, cache misses and pipeline execution hazards produce this sort of effect as well.) Whenever you get two timing results that differ less or more than they seemingly should, From ff14db2bacae900c1dd7d222db31b86ee767a7bf Mon Sep 17 00:00:00 2001 From: Amro Ibrahim Date: Thu, 31 Aug 2017 10:00:41 -0700 Subject: [PATCH 25/55] Update chapter-02.md --- src/chapter-02.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-02.md b/src/chapter-02.md index 25baba6..b8a7b76 100644 --- a/src/chapter-02.md +++ b/src/chapter-02.md @@ -89,7 +89,7 @@ much different from the original, and in fact still contains exactly the same number of instructions, the performance of the entire subroutine improved by about 10 percent from just this one change. (Incidentally, that wasn't the end of the optimization; I eliminated the `DEC` and -`JNJ` instructions by expanding the four iterations of the loop—but +`JNZ` instructions by expanding the four iterations of the loop—but that's a tale for another chapter.) The point is this: To write truly superior assembly programs, you need From 4f23917dbe9b4ba14e4b19d45ce27c1487a3715b Mon Sep 17 00:00:00 2001 From: Shlomi Fish Date: Sat, 2 Sep 2017 10:32:43 +0300 Subject: [PATCH 26/55] Fix spelling, capitalisation and grammar. In README.md. I hereby put all my changes under CC0/Public-Domain. --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b48011e..b7657a7 100644 --- a/README.md +++ b/README.md @@ -4,19 +4,19 @@ This is the source for an ebook version of Michael Abrash's Black Book of Graphi Reproduced with blessing of Michael Abrash, converted and maintained by [James Gregory](mailto:james@jagregory.com). -The [Github releases list](https://github.com/jagregory/abrash-black-book/releases) has an Epub and Mobi version available for download, and you can find a mirror of the HTML version at [www.jagregory.com/abrash-black-book](http://www.jagregory.com/abrash-black-book/). +The [GitHub releases list](https://github.com/jagregory/abrash-black-book/releases) has an EPUB and Mobi version available for download, and you can find a mirror of the HTML version at [www.jagregory.com/abrash-black-book](http://www.jagregory.com/abrash-black-book/). ## How does this differ from the previously released versions? -The book is now out of print, and hard to come by. Last time I checked, it was going for over $200 on ebay. +The book is now out of print, and hard to come by. Last time I checked, it was going for over $200 on eBay. The version which Michael and Dr. Dobbs released in 2001 was a collection of PDF files. That version is [still available](http://www.drdobbs.com/parallel/graphics-programming-black-book/184404919). However, the structure (multiple files) and the format (PDF) result in a poor user experience on an ebook reader or other mobile device. -This version has been thoroughly cleaned of artifacts and condensed into something which can easily be converted into an ebook-friendly format. You can read this version online at Github, or download any of the Epub or Mobi releases. You can clone the repository and generate your own version with [pandoc](http://johnmacfarlane.net/pandoc/) if necessary. +This version has been thoroughly cleaned of artifacts and condensed into something which can easily be converted into an ebook-friendly format. You can read this version online at GitHub, or download any of the EPUB or Mobi releases. You can clone the repository and generate your own version with [pandoc](http://johnmacfarlane.net/pandoc/) if necessary. ## Contributing -Changes are welcome, especially conversion-related ones. If you spot any problems while reading, please [submit an issue](https://github.com/jagregory/abrash-black-book/issues) and I'll correct it. Pull Requests are always welcome. +Changes are welcome, especially conversion-related ones. If you spot any problems while reading, please [submit an issue](https://github.com/jagregory/abrash-black-book/issues) and I'll correct it. Pull requests are always welcome. Some larger changes could be made to improve the content. I'd love to see some of the images converted to a vector representation so we can provide higher-resolution versions. Formulas and equations could be typeset with [MathJax](http://www.mathjax.org/). @@ -24,16 +24,16 @@ Some larger changes could be made to improve the content. I'd love to see some o You need to have the following software installed and on your `PATH` before you begin: - * [pandoc](http://johnmacfarlane.net/pandoc/) for Markdown to HTML and Epub conversion. - * [kindlegen](http://www.amazon.com/gp/feature.html?docId=1000765211) for Epub to Mobi conversion. + * [pandoc](http://johnmacfarlane.net/pandoc/) for Markdown to HTML and EPUB conversion. + * [kindlegen](http://www.amazon.com/gp/feature.html?docId=1000765211) for EPUB to Mobi conversion. To generate an e-reader friendly version of the book, you can use `make` with one of the following options: - * `html` - build a HTML5 single-page version of the book - * `epub` - build an Epub3 ebook + * `html` - build an HTML5 single-page version of the book + * `epub` - build an EPUB3 ebook * `mobi` - build a Kindle-friendly Mobi * `all` - do all of the above -Once complete, there'll be an `out` directory with a `black-book.epub`, a `black-book.mobi` and a `html` directory with a `black-book.html` file. +Once complete, there will be an `out` directory with a `black-book.epub`, a `black-book.mobi` and an `html` directory with a `black-book.html` file. -> Note: Generating a mobi requires an epub to already exist. Also, mobi generation can be *slow* because of compression. If you want a quick mobi conversion you can just run `kindlegen out/black-book.epub`. +> Note: Generating a Mobi requires an EPUB to already exist. Also, Mobi generation can be *slow* because of compression. If you want a quick Mobi conversion you can just run `kindlegen out/black-book.epub`. From e5e611fe7a649d40ba8a605a0877493c7a7a2444 Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Fri, 22 Jun 2018 12:27:38 +0200 Subject: [PATCH 27/55] Fix time unit: Milliseconds instead of microseconds DRAM refresh is usually measured in milliseconds, and from the calculations below one can see that it must be milliseconds. And same for the other changes: Multiplying microsecond values by a factor of ~ 1000 will result in milliseconds. This is also cross-checked with the PDF available here: http://twimgs.com/ddj/abrashblackbook/gpbb4.pdf --- src/chapter-04.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/chapter-04.md b/src/chapter-04.md index c0b364d..a4ab774 100644 --- a/src/chapter-04.md +++ b/src/chapter-04.md @@ -878,8 +878,8 @@ the PC must be completely refreshed about once every four milliseconds in order to ensure the integrity of the data it stores. Obviously, it's highly desirable that the memory in the PC retain the correct data indefinitely, so each DRAM chip in the PC *must* always be refreshed -within 4 µs of the last refresh. Since there's no guarantee that a given -program will access each and every DRAM block once every 4 µs, the PC +within 4 ms of the last refresh. Since there's no guarantee that a given +program will access each and every DRAM block once every 4 ms, the PC contains special circuitry and programming for providing DRAM refresh. #### How DRAM Refresh Works in the PC @@ -900,8 +900,8 @@ purpose of refreshing the DRAM; the data that is read isn't used.) The 256 addresses accessed by the refresh DMA accesses are arranged so that taken together they properly refresh all the memory in the PC. By accessing one of the 256 addresses every 15.08 µs, all of the PC's DRAM -is refreshed in 256 x 15.08 µs, or 3.86 µs, which is just about the -desired 4 µs time I mentioned earlier. (Only the first 640K of memory is +is refreshed in 256 x 15.08 µs, or 3.86 ms, which is just about the +desired 4 ms time I mentioned earlier. (Only the first 640K of memory is refreshed in the PC; video adapters and other adapters above 640K containing memory that requires refreshing must provide their own DRAM refresh in pre-AT systems.) @@ -1223,7 +1223,7 @@ display, and even with the display adapter cycle-eater it just doesn't take that long to manipulate 4,000 bytes. Even if the display adapter cycle-eater were to cause the 8088 to take as much as 5µs per display memory access—more than five times normal—it would still take only -4,000x 2x 5µs, or 40 µs, to read and write every byte of display memory. +4,000x 2x 5µs, or 40 ms, to read and write every byte of display memory. That's a lot of time as measured in 8088 cycles, but it's less than the blink of an eye in human time, and video performance only matters in human time. After all, the whole point of drawing graphics is to convey @@ -1261,7 +1261,7 @@ seriously impact code performance, even as measured in human time. For example, if we assume the same 5 µs per display memory access for the EGA's high-resolution graphics mode that we assumed for text mode, -it would take 26,000 x 2 x 5 µs, or 260 µs, to scroll the screen once in +it would take 26,000 x 2 x 5 µs, or 260 ms, to scroll the screen once in the EGA's high-resolution graphics mode, mode 10H. That's more than one-quarter of a second—noticeable by human standards, an eternity by computer standards. From c25e885362239c9b2ef192eed1c98b07d307d417 Mon Sep 17 00:00:00 2001 From: Igor de Sant'Ana Fontana Date: Mon, 23 Jul 2018 16:40:27 -0300 Subject: [PATCH 28/55] Listing 1.3: fix typos --- src/chapter-01.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/chapter-01.md b/src/chapter-01.md index 0e27fbc..8f4a05e 100644 --- a/src/chapter-01.md +++ b/src/chapter-01.md @@ -363,12 +363,12 @@ _ChecksumFile proc near ChecksumLoop: mov ah,3fh ;DOS read file function # int 21h ;read the byte -jcErrorEnd;an error occurred + jc ErrorEnd ;an error occurred and ax,ax ;any bytes read? jz Success ;no-end of file reached-we're done add si,[TempWord] ;add the byte into the ;checksum total -jmpChecksumLoop + jmp ChecksumLoop ErrorEnd: sub ax,ax ;error jmp short Done @@ -381,7 +381,7 @@ Done: pop si ;restore C's register variable pop bp ret -_ChecksumFileendp +_ChecksumFile endp end ``` From 6140424123eb97bf39d2c8e921ca03e5e5a39bba Mon Sep 17 00:00:00 2001 From: Matthieu Texier Date: Tue, 24 Jul 2018 14:44:41 +0200 Subject: [PATCH 29/55] Fix listing 59.4 --- src/chapter-59.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-59.md b/src/chapter-59.md index ff13c30..376634f 100644 --- a/src/chapter-59.md +++ b/src/chapter-59.md @@ -547,7 +547,7 @@ void WalkTree(NODE *pNode) // Pop the next node from the stack so // we can visit it and see if it has a // right subtree to be traversed - if ((pNode = *—pNodeStack) == NULL) + if ((pNode = *--pNodeStack) == NULL) { // Stack is empty and the current node // has no right child; we're done From 44f7df0b280ab94aad6e30881999d67afeb9a438 Mon Sep 17 00:00:00 2001 From: rnndxb wxcy Date: Thu, 6 Sep 2018 09:59:58 -0400 Subject: [PATCH 30/55] Use Pandoc +smart extension in Makefile The --smart/-S option has been removed from Pandoc 2.0. Use the +smart extension instead. --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 776d8a8..4de9dda 100644 --- a/Makefile +++ b/Makefile @@ -7,12 +7,12 @@ all: html epub mobi html: rm -rf out/html && mkdir -p out/html cp -r images html/book.css out/html/ - pandoc -S --to html5 -o out/html/black-book.html --section-divs --toc --standalone --template=html/template.html $(FILES) + pandoc --to html5+smart -o out/html/black-book.html --section-divs --toc --standalone --template=html/template.html $(FILES) epub: mkdir -p out rm -f out/black-book.epub - pandoc -S --to epub3 -o out/black-book.epub --epub-cover-image images/cover.png --toc --epub-chapter-level=2 --data-dir=epub --template=epub/template.html $(FILES) + pandoc --to epub3+smart -o out/black-book.epub --epub-cover-image images/cover.png --toc --epub-chapter-level=2 --data-dir=epub --template=epub/template.html $(FILES) mobi: rm -f out/black-book.mobi From c1e37c257b7af9d17ad8487200501102f1d7e0ec Mon Sep 17 00:00:00 2001 From: rnndxb wxcy Date: Thu, 6 Sep 2018 10:14:06 -0400 Subject: [PATCH 31/55] Update README.md to specify Pandoc 2.0 or greater --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b48011e..ecb612d 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Some larger changes could be made to improve the content. I'd love to see some o You need to have the following software installed and on your `PATH` before you begin: - * [pandoc](http://johnmacfarlane.net/pandoc/) for Markdown to HTML and Epub conversion. + * [pandoc](http://johnmacfarlane.net/pandoc/) version 2.0 or greater for Markdown to HTML and Epub conversion. * [kindlegen](http://www.amazon.com/gp/feature.html?docId=1000765211) for Epub to Mobi conversion. To generate an e-reader friendly version of the book, you can use `make` with one of the following options: From 264f0b2624f4b3da85c297bcdab16cd667796aa6 Mon Sep 17 00:00:00 2001 From: James Gregory Date: Tue, 13 Aug 2019 22:40:21 +1000 Subject: [PATCH 32/55] Sourced a higher-res 13-01 image Fixes #18 --- images/13-01.jpg | Bin 4879 -> 0 bytes images/13-01.png | Bin 0 -> 89907 bytes src/chapter-13.md | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 images/13-01.jpg create mode 100644 images/13-01.png diff --git a/images/13-01.jpg b/images/13-01.jpg deleted file mode 100644 index eb9ca7a68e93b925740a1e579d923f3738b7c01b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4879 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 literal 0 HcmV?d00001 diff --git a/src/chapter-13.md b/src/chapter-13.md index cf27058..afd149c 100644 --- a/src/chapter-13.md +++ b/src/chapter-13.md @@ -107,7 +107,7 @@ from the use of DI to address memory (remember, the loop is unrolled, so the last instruction is followed by the first instruction), but because the intervening instruction takes two cycles, there's no penalty at all. -![**Figure 13.1**  *Cycle-eaters in the original WC.*](images/13-01.jpg) +![**Figure 13.1**  *Cycle-eaters in the original WC.*](images/13-01.png) > ![](images/i.jpg) > Remember, pipeline penalties diminish with increasing number of cycles, From 9373e5d2ee27f6b6fc73e412c737635d3fd74498 Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 10:54:08 +0200 Subject: [PATCH 33/55] Fix 'procnear' -> ' proc near' Automatically done using: sed -i '' -e 's/procnear/ proc near/g' src/*.md --- src/chapter-01.md | 2 +- src/chapter-07.md | 4 ++-- src/chapter-09.md | 6 +++--- src/chapter-28.md | 6 +++--- src/chapter-29.md | 2 +- src/chapter-30.md | 4 ++-- src/chapter-31.md | 8 ++++---- src/chapter-32.md | 6 +++--- src/chapter-53.md | 2 +- src/chapter-54.md | 6 +++--- 10 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/chapter-01.md b/src/chapter-01.md index 8f4a05e..c5fa5f1 100644 --- a/src/chapter-01.md +++ b/src/chapter-01.md @@ -759,7 +759,7 @@ Parmsends .model small .code public _ChecksumChunk -_ChecksumChunkprocnear +_ChecksumChunk proc near push bp mov bp,sp push si ;save C's register variable diff --git a/src/chapter-07.md b/src/chapter-07.md index 5d73234..97dcded 100644 --- a/src/chapter-07.md +++ b/src/chapter-07.md @@ -263,7 +263,7 @@ NoByteFoundMsg db 0dh,0ah db ‘Buffer exhausted with no match.', 0dh, 0ah, ‘$' .code -Startprocnear +Start proc near mov ax,@data ;point to standard data segment mov ds,ax mov dx,offset Prompt @@ -306,7 +306,7 @@ Startendp ; byte is found ; Carry Flag = set if searched-for byte found, reset otherwise -SearchMaxLengthprocnear +SearchMaxLength proc near cld SearchMaxLengthLoop: lodsb ;get the next byte diff --git a/src/chapter-09.md b/src/chapter-09.md index c836fc7..1f50b8a 100644 --- a/src/chapter-09.md +++ b/src/chapter-09.md @@ -395,7 +395,7 @@ Parmsends .model small .code public _FindString -_FindStringprocnear +_FindString proc near push bp ;preserve caller's stack frame mov bp,sp ;point to our stack frame push si ;preserve caller's register variables @@ -492,7 +492,7 @@ Parmsends .model small .code public _FindString -_FindStringprocnear +_FindString proc near push bp ;preserve caller's stack frame mov bp,sp ;point to our stack frame push si ;preserve caller's register variables @@ -743,7 +743,7 @@ parmsends .model small .code public _Div -_Divprocnear +_Div proc near push bp ;preserve caller's stack frame mov bp,sp ;point to our stack frame push si ;preserve caller's register variables diff --git a/src/chapter-28.md b/src/chapter-28.md index 2e88c67..4576cbf 100644 --- a/src/chapter-28.md +++ b/src/chapter-28.md @@ -202,7 +202,7 @@ Startendp ; Draws the image at offset DS:SI to the current image location in ; VGA memory. ; -DrawImageprocnear +DrawImage proc near mov ax,VGA_SEGMENT mov es,ax call GetImageOffset ;ES:DI is the destination address for the @@ -518,7 +518,7 @@ Startendp ; Enables set/reset for all planes, and sets the set/reset color ; to AL. ; -SelectSetResetColorprocnear +SelectSetResetColor proc near mov dx,GC_INDEX push ax ;preserve color mov al,SET_RESET @@ -636,7 +636,7 @@ COLOR_DONT_CARE EQU 7 ;Color Don't Care register index in GC ; code segment word 'CODE' assume cs:code -Startprocnear +Start proc near ; ; Select graphics mode 12h. ; diff --git a/src/chapter-29.md b/src/chapter-29.md index da8e8dc..2bf80c9 100644 --- a/src/chapter-29.md +++ b/src/chapter-29.md @@ -574,7 +574,7 @@ Data ends ; Code segment assume cs:Code, ds:Data -Start procnear +Start proc near cld mov ax,Data mov ds,ax diff --git a/src/chapter-30.md b/src/chapter-30.md index bc390d8..4fa8d60 100644 --- a/src/chapter-30.md +++ b/src/chapter-30.md @@ -328,7 +328,7 @@ Startendp ; ; Registers altered: AL, DX ; -WaitForVerticalSyncStartprocnear +WaitForVerticalSyncStart proc near mov dx,INPUT_STATUS_0 WaitNotVerticalSync: in al,dx @@ -349,7 +349,7 @@ WaitForVerticalSyncStart endp ; ; Registers altered: AL, DX ; -WaitForVerticalSyncEndprocnear +WaitForVerticalSyncEnd proc near mov dx,INPUT_STATUS_0 WaitVerticalSync2: in al,dx diff --git a/src/chapter-31.md b/src/chapter-31.md index e5da35b..91818d8 100644 --- a/src/chapter-31.md +++ b/src/chapter-31.md @@ -491,7 +491,7 @@ WritePixelendp ; ; Registers altered: AX, CX, DX, SI, ES ; -ReadPixelprocnear +ReadPixel proc near mov ax,VGA_SEGMENT mov es,ax ;point to display memory mov ax,SCREEN_WIDTH/4 @@ -757,7 +757,7 @@ Start endp ; ; Output: none ; -Set320By400Modeprocnear +Set320By400Mode proc near ; ; First, go to normal 320x200 256-color mode, which is really a ; 320x400 256-color mode with each line scanned twice. @@ -853,7 +853,7 @@ Set320By400Mode endp ; make them slant down and to the left, 0 to make ; them vertical. ; -ColorBarsUpprocnear +ColorBarsUp proc near mov ax,VGA_SEGMENT mov es,ax ;point to display memory sub bh,bh ;start with color 0 @@ -891,7 +891,7 @@ ColorBarsUpendp ; ; Waits for the next key and returns it in AX. ; -GetNextKeyprocnear +GetNextKey proc near WaitKey: mov ah,1 int 16h diff --git a/src/chapter-32.md b/src/chapter-32.md index bba9b2f..e8df20d 100644 --- a/src/chapter-32.md +++ b/src/chapter-32.md @@ -199,7 +199,7 @@ _TEXTsegment byte public ‘CODE' ; Returns: nothing ; public _Set360x480Mode -_Set360x480Modeprocnear +_Set360x480Mode proc near push si ;preserve C register vars push di mov ax,12h ; start with mode 12h @@ -258,7 +258,7 @@ Color dw ? ;color in which to draw (in the DParms ends ; public _Draw360x480Dot -_Draw360x480Dotprocnear +_Draw360x480Dot proc near push bp ;preserve caller's BP mov bp,sp ;point to stack frame push si ;preserve C register vars @@ -306,7 +306,7 @@ ReadY dw ? ;Y coordinate from which to read RParms ends ; public _Read360x480Dot -_Read360x480Dotprocnear +_Read360x480Dot proc near push bp ;preserve caller's BP mov bp,sp ;point to stack frame push si ;preserve C register vars diff --git a/src/chapter-53.md b/src/chapter-53.md index 5bcd56e..1253897 100644 --- a/src/chapter-53.md +++ b/src/chapter-53.md @@ -199,7 +199,7 @@ SCparms ends align ALIGNMENT public -CosSin --CosSinprocnear +-CosSin proc near push bp ;preserve stack frame mov bp,sp ;set up local stack frame diff --git a/src/chapter-54.md b/src/chapter-54.md index 9bb7b63..f0b72be 100644 --- a/src/chapter-54.md +++ b/src/chapter-54.md @@ -339,7 +339,7 @@ SCparms ends alignALIGNMENT public _CosSin -_CosSin procnear +_CosSin proc near push bp ;preserve stack frame mov bp,sp ;set up local stack frame @@ -597,7 +597,7 @@ FixedMulDone: align ALIGNMENT public _XformVec -_XformVecprocnear +_XformVec proc near push bp ;preserve stack frame mov bp,sp ;set up local stack frame push si ;preserve register variables @@ -741,7 +741,7 @@ CXparms ends align ALIGNMENT public _ConcatXforms -_ConcatXformsprocnear +_ConcatXforms proc near push bp ;preserve stack frame mov bp,sp ;set up local stack frame push si ;preserve register variables From 97d436fb730d5ec4fe5d13102b6f142d34dc11cf Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 10:55:36 +0200 Subject: [PATCH 34/55] Fix 'endp' -> ' endp' Automatically done using: sed -i '' -e 's/\([^ ]\)endp/\1 endp/g' src/*.md --- src/chapter-01.md | 2 +- src/chapter-07.md | 8 ++++---- src/chapter-09.md | 6 +++--- src/chapter-28.md | 12 ++++++------ src/chapter-29.md | 2 +- src/chapter-30.md | 8 ++++---- src/chapter-31.md | 6 +++--- src/chapter-32.md | 4 ++-- src/chapter-43.md | 2 +- src/chapter-53.md | 6 +++--- src/chapter-54.md | 2 +- 11 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/chapter-01.md b/src/chapter-01.md index c5fa5f1..960d07a 100644 --- a/src/chapter-01.md +++ b/src/chapter-01.md @@ -779,7 +779,7 @@ ChecksumLoop: pop si ;restore C's register variable pop bp ret -_ChecksumChunkendp +_ChecksumChunk endp end ``` diff --git a/src/chapter-07.md b/src/chapter-07.md index 97dcded..7ba7d2d 100644 --- a/src/chapter-07.md +++ b/src/chapter-07.md @@ -289,7 +289,7 @@ PrintStatus: int 21h ;report status mov ah,4ch ;return to DOS int 21h -Startendp +Start endp ; Function to search a buffer of a specified length until either a ; specified byte or a zero byte is encountered. @@ -324,7 +324,7 @@ ByteFound: ;we found the searched-for byte stc ;return "found" status ret -SearchMaxLengthendp +SearchMaxLength endp end Start ``` @@ -403,7 +403,7 @@ PrintStatus: mov ah,4ch ;return to DOS int 21h -Startendp +Start endp ; Function to search a buffer of a specified length until either a ; specified byte or a zero byte is encountered. @@ -468,7 +468,7 @@ ByteFound: ; we found the searched-for byte stc ;return "found" status ret -SearchMaxLengthendp +SearchMaxLength endp end Start ``` diff --git a/src/chapter-09.md b/src/chapter-09.md index 1f50b8a..5ee0fac 100644 --- a/src/chapter-09.md +++ b/src/chapter-09.md @@ -458,7 +458,7 @@ FindStringDone: pop si pop bp ;restore caller's stack frame ret -_FindStringendp +_FindString endp end ``` @@ -559,7 +559,7 @@ FindStringDone: pop si pop bp ;restore caller's stack frame ret -_FindStringendp +_FindString endp end ``` @@ -778,7 +778,7 @@ DivLoop: pop si pop bp ;restore caller's stack frame ret -_Divendp +_Div endp end ``` diff --git a/src/chapter-28.md b/src/chapter-28.md index 4576cbf..7dc354b 100644 --- a/src/chapter-28.md +++ b/src/chapter-28.md @@ -197,7 +197,7 @@ DelayLoop: int 10h mov ah,4ch int 21h -Startendp +Start endp ; ; Draws the image at offset DS:SI to the current image location in ; VGA memory. @@ -233,7 +233,7 @@ DrawImageLoop: cmp al,10h ;have we done all four planes? jnz DrawImagePlaneLoop ret -DrawImageendp +DrawImage endp ; ; Copies the image from its current location in VGA memory into the ; buffer at DS:DI. @@ -274,7 +274,7 @@ GetImageLoop: push es pop ds ;restore original DS ret -GetImageendp +GetImage endp ; ; Erases the image at its current location. ; @@ -513,7 +513,7 @@ WaitKeyLoop: int 10h ;return to text mode mov ah,4ch int 21h ;done -Startendp +Start endp ; ; Enables set/reset for all planes, and sets the set/reset color ; to AL. @@ -533,7 +533,7 @@ SelectSetResetColor proc near mov al,0fh out dx,al ;enable set/reset for all planes ret -SelectSetResetColorendp +SelectSetResetColor endp code ends end Start ``` @@ -713,7 +713,7 @@ WaitKeyLoop: int 10h ;return to text mode mov ah,4ch int 21h ;done -Startendp +Start endp code ends end Start ``` diff --git a/src/chapter-29.md b/src/chapter-29.md index 2bf80c9..6f095cb 100644 --- a/src/chapter-29.md +++ b/src/chapter-29.md @@ -764,7 +764,7 @@ ColorNumberLoop: mov dx,offset ColorNumbers int 21h ;put up the attribute numbers ret -ColorNumbersUpendp +ColorNumbersUp endp ; Start endp Code ends diff --git a/src/chapter-30.md b/src/chapter-30.md index 4fa8d60..8cd1427 100644 --- a/src/chapter-30.md +++ b/src/chapter-30.md @@ -318,7 +318,7 @@ CountVerticalSyncsLoop: int 10h ;return to text mode mov ah,4ch int 21h ;return to DOS -Startendp +Start endp ;********************************************************************* ; Waits for the leading edge of the vertical sync pulse. ; @@ -360,7 +360,7 @@ WaitNotVerticalSync2: test al,08h jnz WaitNotVerticalSync2 ret -WaitForVerticalSyncEndendp +WaitForVerticalSyncEnd endp ;********************************************************************* ; Sets the start address to the value specifed by StartAddress. ; Wait for the trailing edge of vertical sync before setting so that @@ -904,7 +904,7 @@ endif int 10h ;return to text mode mov ah,4ch int 21h ;return to DOS -Startendp +Start endp ;********************************************************************* ; Waits for the leading edge of the vertical sync pulse. ; @@ -997,7 +997,7 @@ SetPelPan proc near mov al,[PelPan] out dx,al ;load the new Pel Pan setting ret -SetPelPanendp +SetPelPan endp ;********************************************************************* ; Sets the scan line the split screen starts after to the scan line ; specified by SplitScreenLine. diff --git a/src/chapter-31.md b/src/chapter-31.md index 91818d8..ebe281a 100644 --- a/src/chapter-31.md +++ b/src/chapter-31.md @@ -477,7 +477,7 @@ WritePixel proc near ; the pixel mov es:[di],bl ;draw the pixel ret -WritePixelendp +WritePixel endp ; ; Reads the color of the pixel at the specified location in 320x400 ; 256-color mode. @@ -513,7 +513,7 @@ ReadPixel proc near ; the pixel lodsbyte ptr es:[si] ;read the pixel ret -ReadPixelendp +ReadPixel endp ; ; Waits for the next key and returns it in AX. ; @@ -887,7 +887,7 @@ MAP_SELECT = MAP_SELECT shl 1 dec si ;count down lines on the screen jnz RowLoop ret -ColorBarsUpendp +ColorBarsUp endp ; ; Waits for the next key and returns it in AX. ; diff --git a/src/chapter-32.md b/src/chapter-32.md index e8df20d..05f0adc 100644 --- a/src/chapter-32.md +++ b/src/chapter-32.md @@ -239,7 +239,7 @@ _Set360x480Mode proc near pop di ;restore C register vars pop si ret -_Set360x480Modeendp +_Set360x480Mode endp ; ; Draws a pixel in the specified color at the specified ; location in 360x480 256-color mode. @@ -289,7 +289,7 @@ _Draw360x480Dot proc near pop si pop bp ;restore caller's BP ret -_Draw360x480Dotendp +_Draw360x480Dot endp ; ; Reads the color of the pixel at the specified ; location in 360x480 256-color mode. diff --git a/src/chapter-43.md b/src/chapter-43.md index 1e8736b..7e2289f 100644 --- a/src/chapter-43.md +++ b/src/chapter-43.md @@ -720,7 +720,7 @@ DrawLoop: dec dx ;count down the lines of the image jnz DrawLoop ret -DrawObjectendp +DrawObject endp ; Code ends end Start diff --git a/src/chapter-53.md b/src/chapter-53.md index 1253897..1f5905e 100644 --- a/src/chapter-53.md +++ b/src/chapter-53.md @@ -272,7 +272,7 @@ CSDone: pop bp;restore stack frame ret --CosSinendp +-CosSin endp ;===================================================================== ; Matrix multiplies Xform by SourceVec, and stores the result in ; DestVec. Multiplies a 4x4 matrix times a 4x1 matrix; the result @@ -351,7 +351,7 @@ pop di;restore register variables pop si pop bp;restore stack frame ret --XformVecendp +-XformVec endp ;===================================================================== ; Matrix multiplies SourceXform1 by SourceXform2 and stores the ; result in DestXform. Multiplies a 4x4 matrix times a 4x4 matrix; @@ -475,7 +475,7 @@ pop di;restore register variables pop si pop bp;restore stack frame ret --ConcatXformsendp +-ConcatXforms endp end ``` diff --git a/src/chapter-54.md b/src/chapter-54.md index f0b72be..466388a 100644 --- a/src/chapter-54.md +++ b/src/chapter-54.md @@ -704,7 +704,7 @@ endif ;USE386 pop si pop bp ;restore stack frame ret -_XformVecendp +_XformVec endp ;===================================================================== ; Matrix multiplies SourceXform1 by SourceXform2 and stores the From 9072e5d500becc5efb7e5fffbe762fc4ba339524 Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:06:10 +0200 Subject: [PATCH 35/55] Fix various (ends) code OCR errors --- src/chapter-01.md | 2 +- src/chapter-28.md | 18 +++++++++--------- src/chapter-30.md | 4 ++-- src/chapter-31.md | 4 ++-- src/chapter-32.md | 4 ++-- src/chapter-33.md | 2 +- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/chapter-01.md b/src/chapter-01.md index 960d07a..390b347 100644 --- a/src/chapter-01.md +++ b/src/chapter-01.md @@ -754,7 +754,7 @@ Parms struc Buffer dw ? BufferLength dw ? Checksum dw ? -Parmsends +Parms ends ; .model small .code diff --git a/src/chapter-28.md b/src/chapter-28.md index 7dc354b..b06f793 100644 --- a/src/chapter-28.md +++ b/src/chapter-28.md @@ -85,12 +85,12 @@ registers. ; ; By Michael Abrash ; -stacksegmentword stack 'STACK' -db512 dup (?) -stackends +stack segment word stack 'STACK' + db 512 dup (?) +stack ends ; -datasegment word 'DATA' -IMAGE_WIDTHEQU 4 ;in bytes +data segment word 'DATA' +IMAGE_WIDTH EQU 4 ;in bytes IMAGE_HEIGHT EQU 32 ;in pixels LEFT_BOUND EQU 10 ;in bytes RIGHT_BOUND EQU 66 ;in bytes @@ -105,11 +105,11 @@ READ_MAP EQU 4 ;Read Map register index in GC ; PatternPlane0 label byte db 32 dup (0ffh,0ffh,0,0) -PatternPlane1 labelbyte +PatternPlane1 label byte db 32 dup (0ffh,0,0ffh,0) -PatternPlane2 labelbyte +PatternPlane2 label byte db 32 dup (0f0h,0f0h,0f0h,0f0h) -PatternPlane3 labelbyte +PatternPlane3 label byte db 32 dup (0cch,0cch,0cch,0cch) ; ; Temporary storage for 16-color image during animation. @@ -124,7 +124,7 @@ ImagePlane3 db 32*4 dup (?) ImageX dw 40 ;in bytes ImageY dw 100 ;in pixels ImageXDirection dw 1 ;in bytes -dataends +data ends ; code segment word 'CODE' assume cs:code,ds:data diff --git a/src/chapter-30.md b/src/chapter-30.md index 8cd1427..8fed718 100644 --- a/src/chapter-30.md +++ b/src/chapter-30.md @@ -1104,8 +1104,8 @@ DoSetStartAddress: ret PanRight endp ;********************************************************************* -Codeends -endStart +Code ends +end Start ``` ### Notes on Setting and Reading Registers diff --git a/src/chapter-31.md b/src/chapter-31.md index ebe281a..6aac0bf 100644 --- a/src/chapter-31.md +++ b/src/chapter-31.md @@ -901,9 +901,9 @@ WaitKey: ret GetNextKey endp ; -Codeends +Code ends ; -endStart +end Start ``` When you run Listing 31.2, note the extremely smooth edges and fine diff --git a/src/chapter-32.md b/src/chapter-32.md index 05f0adc..5a5c0bb 100644 --- a/src/chapter-32.md +++ b/src/chapter-32.md @@ -171,7 +171,7 @@ vptbl dw 06b00h ; horz total dw 00616h ; v blank end dw 0e317h ; turn on byte mode vpend label word -_DATAends +_DATA ends ; ; Macro to output a word value to a port. ; @@ -336,7 +336,7 @@ _Read360x480Dot proc near pop bp ;restore caller's BP ret _Read360x480Dot endp -_TEX Tends +_TEXT ends end ``` diff --git a/src/chapter-33.md b/src/chapter-33.md index 9af64a5..3d77be3 100644 --- a/src/chapter-33.md +++ b/src/chapter-33.md @@ -532,7 +532,7 @@ FillVertLoop: jnz FillHorzLoop ;no, do the next column ret; - endStart + end Start ``` Note the jagged lines at the corners of the screen when you run Listing From b3144a21455b117964f0ece09a008681cfa55dd8 Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:06:40 +0200 Subject: [PATCH 36/55] Startproc near -> Start proc near --- src/chapter-30.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-30.md b/src/chapter-30.md index 8fed718..e06b49e 100644 --- a/src/chapter-30.md +++ b/src/chapter-30.md @@ -763,7 +763,7 @@ Data ends Code segment assume cs:Code, ds:Data ;********************************************************************* -Startproc near +Start proc near mov ax,Data mov ds,ax ; From a4df877739ec16c75de9b02861b517296c53de8e Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:07:02 +0200 Subject: [PATCH 37/55] Datasegment -> Data segment --- src/chapter-30.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-30.md b/src/chapter-30.md index e06b49e..4ee51fc 100644 --- a/src/chapter-30.md +++ b/src/chapter-30.md @@ -751,7 +751,7 @@ MyStack segment para stack 'STACK' db 512 dup (0) MyStack ends ;********************************************************************* -Datasegment +Data segment SplitScreenLine dw ? ;line the split screen currently ; starts after StartAddress dw ? ;display memory offset at which From 03978b9651f8916371e549ee1b2d9cbb1dda8e47 Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:07:47 +0200 Subject: [PATCH 38/55] Fix looping/calling OCR bugs --- src/chapter-30.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chapter-30.md b/src/chapter-30.md index 4ee51fc..9c72957 100644 --- a/src/chapter-30.md +++ b/src/chapter-30.md @@ -837,7 +837,7 @@ ColumnLoop2: ; panning effects can be seen easily inc di inc di -loopColumnLoop2 +loop ColumnLoop2 ror ax,1 ;shift pattern word dec dx jnz RowLoop2 @@ -847,7 +847,7 @@ loopColumnLoop2 ; screen jerks back and forth as the pel panning setting cycles. ; mov cx,200 ;pan 200 pixels to the left -callPanRight +call PanRight ; ; Wait for a key press (don't echo character). ; From 670082d3477fb94dade037cd944930843a94a837 Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:08:17 +0200 Subject: [PATCH 39/55] Fix MAXIMUM_SCAN_LINEequ --- src/chapter-30.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-30.md b/src/chapter-30.md index 9c72957..bc8f3b8 100644 --- a/src/chapter-30.md +++ b/src/chapter-30.md @@ -146,7 +146,7 @@ SCREEN_WIDTH equ 640 SCREEN_HEIGHT equ 350 CRTC_INDEX equ 3d4h ;CRT Controller Index register OVERFLOW equ 7 ;index of Overflow reg in CRTC -MAXIMUM_SCAN_LINEequ 9 ;index of Maximum Scan Line register +MAXIMUM_SCAN_LINE equ 9 ;index of Maximum Scan Line register ; in CRTC START_ADDRESS_HIGH equ 0ch ;index of Start Address High register ; in CRTC From 2342c2d49d39c86c5cd235f24c2c34cd136eab60 Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:08:49 +0200 Subject: [PATCH 40/55] Fix typo --- src/chapter-31.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-31.md b/src/chapter-31.md index 6aac0bf..c3273bc 100644 --- a/src/chapter-31.md +++ b/src/chapter-31.md @@ -37,7 +37,7 @@ the way up to 360x480—and that's with the vanilla IBM VGA! In this chapter, I'm going to focus on one of my favorite 256-color modes, which provides 320x400 resolution and two graphics pages and can -be set up with very little reof the VGA. In the next chapter, I'll +be set up with very little reprogramming of the VGA. In the next chapter, I'll discuss higher-resolution 256-color modes, and starting in Chapter 47, I'll cover the high-performance "Mode X" 256-color programming that many games use. From f87c4484c29eac0bbcea7b8437e60c68a229738f Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:09:07 +0200 Subject: [PATCH 41/55] Fix db512->db 512 --- src/chapter-29.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-29.md b/src/chapter-29.md index 6f095cb..45f7c3f 100644 --- a/src/chapter-29.md +++ b/src/chapter-29.md @@ -820,7 +820,7 @@ WAIT_KEY macro endm ; stack segment para stack ‘STACK' - db512 dup (?) + db 512 dup (?) stack ends ; Data segment word ‘DATA' From 700514a4885d09f8d915e6bba3cc79532b0004bd Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:10:09 +0200 Subject: [PATCH 42/55] Code OCR fix: lodsbyte -> lods byte --- src/chapter-31.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-31.md b/src/chapter-31.md index c3273bc..c8825ff 100644 --- a/src/chapter-31.md +++ b/src/chapter-31.md @@ -511,7 +511,7 @@ ReadPixel proc near mov dx,GC_INDEX OUT_WORD ;set to read from the proper plane for ; the pixel - lodsbyte ptr es:[si] ;read the pixel + lods byte ptr es:[si] ;read the pixel ret ReadPixel endp ; From f2025ac6e85d5346ed707b93507a5da83c2803dc Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:10:54 +0200 Subject: [PATCH 43/55] Add missing ; for ASM comment --- src/chapter-31.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-31.md b/src/chapter-31.md index c8825ff..677c870 100644 --- a/src/chapter-31.md +++ b/src/chapter-31.md @@ -341,7 +341,7 @@ LinesDone: ; call GetNextKey mov ax,0003h - int 10h text mode + int 10h ;text mode mov ah,4ch int 21h ;done ; From 6adf8f912ba43d01a833a40d8aada36823f301e8 Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:11:16 +0200 Subject: [PATCH 44/55] Fix cmpcx->cmp cx --- src/chapter-31.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-31.md b/src/chapter-31.md index 677c870..7d5247f 100644 --- a/src/chapter-31.md +++ b/src/chapter-31.md @@ -309,7 +309,7 @@ ColorLoop: ; line descriptor list LineLoop: mov cx,[si+StartX] ;set the initial X coordinate - cmpcx,-1 + cmp cx,-1 jz LinesDone ;a descriptor with a -1 X ; coordinate marks the end ; of the list From 73e56070b465f6042e5f9db3203dfab47b5923b6 Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:11:50 +0200 Subject: [PATCH 45/55] Fix function calling (OCR) --- src/chapter-31.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-31.md b/src/chapter-31.md index 7d5247f..e60ca76 100644 --- a/src/chapter-31.md +++ b/src/chapter-31.md @@ -702,7 +702,7 @@ Start proc near ; ; Set 320x400 256-color mode. ; -callSet320By400Mode +call Set320By400Mode ; ; We're in 320x400 256-color mode, with page 0 displayed. ; Let's fill page 0 with color bars slanting down and to the right. From b96792917b1950f77263b159511e2ff38b6c9f23 Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:12:10 +0200 Subject: [PATCH 46/55] Fix more ASM calling (OCR) --- src/chapter-31.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chapter-31.md b/src/chapter-31.md index e60ca76..d21c061 100644 --- a/src/chapter-31.md +++ b/src/chapter-31.md @@ -722,7 +722,7 @@ call Set320By400Mode ; ; Wait for a key and flip to page 1 when one is pressed. ; - callGetNextKey + call GetNextKey CONSTANT_TO_INDEXED_REGISTER CRTC_INDEX,START_ADDRESS_HIGH,80h ;set the Start Address High register ; to 80h, for a start address of 8000h @@ -735,7 +735,7 @@ call Set320By400Mode ; ; Wait for another key and flip back to page 0 when one is pressed. ; - callGetNextKey + call GetNextKey CONSTANT_TO_INDEXED_REGISTER CRTC_INDEX,START_ADDRESS_HIGH,00h ;set the Start Address High register ; to 00h, for a start address of 0000h From 51194d49280fd0e796ebeedf8d87721b1d3a1b95 Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:12:28 +0200 Subject: [PATCH 47/55] not40h -> not 40h --- src/chapter-31.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-31.md b/src/chapter-31.md index d21c061..8dae0fa 100644 --- a/src/chapter-31.md +++ b/src/chapter-31.md @@ -831,7 +831,7 @@ CONSTANT_TO_INDEXED_REGISTER SC_INDEX,MAP_MASK,0fh out dx,al inc dx in al,dx - and al,not40h ;turn off doubleword + and al,not 40h ;turn off doubleword out dx,al dec dx mov al,MODE_CONTROL From 28e420e66541bfdec3023637edc056f9bd526e13 Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:13:06 +0200 Subject: [PATCH 48/55] Fix ASM OCR of macros --- src/chapter-31.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chapter-31.md b/src/chapter-31.md index 8dae0fa..d9215cd 100644 --- a/src/chapter-31.md +++ b/src/chapter-31.md @@ -283,7 +283,7 @@ endif ; ; Macro to output a constant value to an indexed VGA register. ; -CONSTANT_TO_INDEXED_REGISTERmacroADDRESS, INDEX, VALUE +CONSTANT_TO_INDEXED_REGISTER macro ADDRESS, INDEX, VALUE mov dx,ADDRESS mov ax,(VALUE shl 8) + INDEX OUT_WORD @@ -690,7 +690,7 @@ endif ; ; Macro to output a constant value to an indexed VGA register. ; -CONSTANT_TO_INDEXED_REGISTERmacroADDRESS, INDEX, VALUE +CONSTANT_TO_INDEXED_REGISTER macro ADDRESS, INDEX, VALUE mov dx,ADDRESS mov ax,(VALUE shl 8) + INDEX OUT_WORD From 1a87045a95f58ec52f4a4c781d30cbb7f857833e Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:13:30 +0200 Subject: [PATCH 49/55] pus h -> push --- src/chapter-31.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-31.md b/src/chapter-31.md index d9215cd..677289e 100644 --- a/src/chapter-31.md +++ b/src/chapter-31.md @@ -867,7 +867,7 @@ RowLoop: ;4 pixels at each address, so ; each 320-pixel row is 80 bytes wide ; in each plane - pus h bx ;save the row-start color + push bx ;save the row-start color ColumnLoop: MAP_SELECT = 1 rept 4 ;do all 4 pixels at this address with From b9bf2eb0edc3a8e3c9b1a058c2f6f17e9301e73b Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:14:12 +0200 Subject: [PATCH 50/55] _DATAsegmentpublic -> _DATA segment public --- src/chapter-32.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-32.md b/src/chapter-32.md index 5a5c0bb..847b598 100644 --- a/src/chapter-32.md +++ b/src/chapter-32.md @@ -148,7 +148,7 @@ WORD_OUTS_OK equ 1 ;set to 0 to assemble for ; computers that can't handle ; word outs to indexed VGA registers ; -_DATAsegmentpublic byte ‘DATA' +_DATA segment public byte ‘DATA' ; ; 360x480 256-color mode CRT Controller register settings. ; (Courtesy of John Bridges.) From beff664727278d1da3b821d03f9d02c7a0c474c0 Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:23:42 +0200 Subject: [PATCH 51/55] labelbyte -> label byte --- src/chapter-07.md | 4 ++-- src/chapter-29.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/chapter-07.md b/src/chapter-07.md index 7ba7d2d..8707015 100644 --- a/src/chapter-07.md +++ b/src/chapter-07.md @@ -245,7 +245,7 @@ the whole point.) .stack 100h .data ; Sample string to search through. -SampleString labelbyte +SampleString label byte db ‘This is a sample string of a long enough length ' db ‘so that raw searching speed can outweigh any ' db ‘extra set-up time that may be required.',0 @@ -350,7 +350,7 @@ all the difference. .stack 100h .data ; Sample string to search through. -SampleStringlabelbyte +SampleString label byte db ‘This is a sample string of a long enough length ' db ‘so that raw searching speed can outweigh any ' db ‘extra set-up time that may be required.',0 diff --git a/src/chapter-29.md b/src/chapter-29.md index 45f7c3f..afd9703 100644 --- a/src/chapter-29.md +++ b/src/chapter-29.md @@ -557,7 +557,7 @@ x= x+1 ; Used to label the colors of the color bars. (Color values are ; filled in on the fly.) ; -ColorNumberslabelbyte +ColorNumbers label byte rept 16 db ‘000h', 0ah, 8, 8, 8, 8 endm From 7388cf370c445316379187e1b2cb052912c1bda8 Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:24:18 +0200 Subject: [PATCH 52/55] loopVLineLoop -> loop VLineLoop --- src/chapter-28.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-28.md b/src/chapter-28.md index b06f793..349e792 100644 --- a/src/chapter-28.md +++ b/src/chapter-28.md @@ -435,7 +435,7 @@ VLineLoop: ; provides the data written to display ; memory, and AL is actually ignored) add di,SCREEN_WIDTH-1 ;point to the next scan line -loopVLineLoop +loop VLineLoop ; ; Select write mode 0 and read mode 1. ; From 8d29240973e68c9b1f3fd9c8656aa33d453fd80c Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:24:43 +0200 Subject: [PATCH 53/55] loopDrawDiagonalLoop -> loop DrawDiagonalLoop --- src/chapter-28.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-28.md b/src/chapter-28.md index 349e792..41b178d 100644 --- a/src/chapter-28.md +++ b/src/chapter-28.md @@ -698,7 +698,7 @@ DrawDiagonalLoop: ; point to the next scan line ror al,1 ;move the pixel mask one pixel to the right adc bx,0 ;advance to the next byte if the pixel mask wrapped -loopDrawDiagonalLoop +loop DrawDiagonalLoop ; ; Wait for a key to be pressed to end, then return to text mode and ; return to DOS. From 4b5c1696956daa2f9a79b8cdf148982f778557af Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:25:15 +0200 Subject: [PATCH 54/55] COLOR_ENTRY_LENGTHequ -> COLOR_ENTRY_LENGTH equ --- src/chapter-29.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-29.md b/src/chapter-29.md index afd9703..eb57047 100644 --- a/src/chapter-29.md +++ b/src/chapter-29.md @@ -561,7 +561,7 @@ ColorNumbers label byte rept 16 db ‘000h', 0ah, 8, 8, 8, 8 endm -COLOR_ENTRY_LENGTHequ($-ColorNumbers)/16 +COLOR_ENTRY_LENGTH equ ($-ColorNumbers)/16 db ‘$' ; CurrentColordb? From d54e14ca74153fe415e8b66dbd24f47265361130 Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Thu, 21 May 2020 11:25:45 +0200 Subject: [PATCH 55/55] CurrentColordb -> CurrentColor db --- src/chapter-29.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chapter-29.md b/src/chapter-29.md index eb57047..7918865 100644 --- a/src/chapter-29.md +++ b/src/chapter-29.md @@ -564,7 +564,7 @@ ColorNumbers label byte COLOR_ENTRY_LENGTH equ ($-ColorNumbers)/16 db ‘$' ; -CurrentColordb? +CurrentColor db ? ; ; Space for the array of 16 colors we'll pass to the BIOS, plus ; an overscan setting of black.