Use backtick code blocks for syntax highlighting
This commit is contained in:
parent
8ed9dea394
commit
f658bfbb40
203 changed files with 26546 additions and 25801 deletions
96
16-08.md
96
16-08.md
|
|
@ -12,20 +12,21 @@ pages: 316-319
|
|||
|
||||
**Listing 16.7 L16-7.ASM**
|
||||
|
||||
ScanLoop:
|
||||
lodsw ;get the next 2 bytes (AL = first, AH = 2nd)
|
||||
xlat ;look up first's char/not status
|
||||
xor dl,al ;see if there's a new char/not status
|
||||
add di,dx ;we add 1 for each char/not transition
|
||||
mov dl,al
|
||||
mov al,ah ;look at the second byte
|
||||
xlat ;look up its char/not status
|
||||
xor dl,al ;see if there's a new char/not status
|
||||
add di,dx ;we add 1 for each char/not transition
|
||||
mov dl,al
|
||||
dec dx
|
||||
jnz ScanLoop
|
||||
|
||||
```nasm
|
||||
ScanLoop:
|
||||
lodsw ;get the next 2 bytes (AL = first, AH = 2nd)
|
||||
xlat ;look up first's char/not status
|
||||
xor dl,al ;see if there's a new char/not status
|
||||
add di,dx ;we add 1 for each char/not transition
|
||||
mov dl,al
|
||||
mov al,ah ;look at the second byte
|
||||
xlat ;look up its char/not status
|
||||
xor dl,al ;see if there's a new char/not status
|
||||
add di,dx ;we add 1 for each char/not transition
|
||||
mov dl,al
|
||||
dec dx
|
||||
jnz ScanLoop
|
||||
```
|
||||
|
||||
John later divides the transition count by two to get the word count.
|
||||
(Food for thought: It's also possible to use **CMP** and **ADC** to
|
||||
|
|
@ -66,39 +67,40 @@ report a "location counter overflow" warning; ignore it.)
|
|||
|
||||
**LISTING 16.8 MAKETAB.C**
|
||||
|
||||
// MAKETAB.C — Build QSCAN3.INC for QSCAN3.ASM
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#define ChType( c ) (((c) & 0x7f) == ‘\'' || isalnum((c) & 0x7f))
|
||||
|
||||
int NoCarry[ 4 ] = { 0, 0x80, 1, 0x80 };
|
||||
int Carry[ 4 ] = { 1, 0x81, 1, 0x80 };
|
||||
|
||||
void main( void )
|
||||
{
|
||||
int ahChar, alChar, i;
|
||||
FILE *t = fopen( "QSCAN3.INC", "wt" );
|
||||
|
||||
printf( "Building table. Please wait..." );
|
||||
|
||||
for( ahChar = 0; ahChar < 128; ahChar++ )
|
||||
{
|
||||
for( alChar = 0; alChar < 256; alChar++ )
|
||||
{
|
||||
i = ChType( alChar ) * 2 + ChType( ahChar );
|
||||
|
||||
if( alChar % 8 == 0 ) fprintf( t, "\ndb %02Xh", NoCarry[ i ] );
|
||||
else fprintf( t, ",%02Xh", NoCarry[ i ] );
|
||||
|
||||
fprintf( t, ",%02Xh", Carry[ i ] );
|
||||
}
|
||||
}
|
||||
|
||||
fclose( t );
|
||||
}
|
||||
|
||||
```c
|
||||
// MAKETAB.C — Build QSCAN3.INC for QSCAN3.ASM
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#define ChType( c ) (((c) & 0x7f) == ‘\'' || isalnum((c) & 0x7f))
|
||||
|
||||
int NoCarry[ 4 ] = { 0, 0x80, 1, 0x80 };
|
||||
int Carry[ 4 ] = { 1, 0x81, 1, 0x80 };
|
||||
|
||||
void main( void )
|
||||
{
|
||||
int ahChar, alChar, i;
|
||||
FILE *t = fopen( "QSCAN3.INC", "wt" );
|
||||
|
||||
printf( "Building table. Please wait..." );
|
||||
|
||||
for( ahChar = 0; ahChar < 128; ahChar++ )
|
||||
{
|
||||
for( alChar = 0; alChar < 256; alChar++ )
|
||||
{
|
||||
i = ChType( alChar ) * 2 + ChType( ahChar );
|
||||
|
||||
if( alChar % 8 == 0 ) fprintf( t, "\ndb %02Xh", NoCarry[ i ] );
|
||||
else fprintf( t, ",%02Xh", NoCarry[ i ] );
|
||||
|
||||
fprintf( t, ",%02Xh", Carry[ i ] );
|
||||
}
|
||||
}
|
||||
|
||||
fclose( t );
|
||||
}
|
||||
```
|
||||
|
||||
David's approach is simplicity itself, although his implementation
|
||||
arguably is not. Consider any three sequential bytes in the buffer.
|
||||
|
|
|
|||
Loading…
Reference in a new issue