AY-Track: L I G H T
__________________________________________
(C) 1999 DaniEl / PGC / BDA and MAX / Cyberax / BDA
__________________________________________
The optimization # 02
If you are already coded and soptimizirivali
All that could, today I offer you
smash his head.
Objective: Build a table repetition of bytes. Based on an
array of length CODLEN. The first byte of the table is the most
frequent, last, respectively, the rarest,
if some codes in the array not applicable,
the frequency of repetition of this byte is equal to
zero.
Below is a listing that performs
this task. This requires you to try
soptimizirovat this protsedurku (to reduce the volume of the
object code). Results necessarily be published in subsequent
issues Deja VU.
Describe the algorithm will not, try to understand
themselves. I can only say that first creates a table of 512
bytes, the first two bytes - the number of codes # 00 in the
array length CODLEN, second two bytes - the number of codes #
01, etc., to # FF.
; (C) 19.02.1999 DaniEl / BDA
; Last optimization 22.02.1999
ORG # 8000
CODLEN EQU # 4000; the length of the code block
STRTAD EQU # C000; start code block
START DI
LD HL, D_BUFF
PUSH HL
LD DE, D_BUFF +1
LD BC, # 2FF
SUB A
LD (HL), A
LDIR
LD B, A
POP IX; IX = D_BUFF
M1 PUSH BC
LD DE, 0
LD BC, CODLEN
LD HL, STRTAD
LOOP CPIR
JR NZ, JUMP
INC DE
JP PE, LOOP
JUMP LD (IX +0), E
LD (IX +1), D
INC IX
INC IX
POP BC
INC A
DJNZ M1
LD IY, KERNAL
LD DE, CODLEN
L2 LD IX, D_BUFF
LD BC, 0
L1 LD L, (IX +0)
LD H, (IX +1)
OR A
SBC HL, DE
CALL Z, MAX
L3 INC IX
INC IX
INC C
DJNZ L1
DEC DE
LD A, D
OR E
JR NZ, L2
LD IY, 23610
EI
RET
MAX LD (IY +0), C
INC IY
RET
D_BUFF DEFS # 200; first 2 bytes - number
; Honors # 00 bytes, then
; Two bytes - the number of bytes
, # 01, etc., up to # FF.
KERNAL DEFS # 100; result of work-tabulated
; Ka repetition rate
; Bytes. First, the hour
, Th, the last-best Ed
; Cue.
The length of the procedure exactly 100 bytes. Disadvantage
- very slow work, and about 40 seconds on one bank of memory
(depends on density data).
After writing this procedure, it decided to soptimizirovat
MAX / Cyberax / BDA. The result of his work was the procedure
length of 93 bytes and a maximum of 4 working seconds at one
bank.
Disadvantages - bind to address, aligned along the boundary
of 256 bytes (from the beginning of this section), in addition,
a small deviation from the goal, and specifically, the
resulting table contains the full range bytes from # 00 to #
FF, while it is not should contain bytes that are absent in
the test array.
The algorithm of this procedure is absolutely
another. First, a table 512 bytes (two sections), in the first
paragraph are the low byte, the second-highest. However, the
major and minor B form the number of repetitions in the test
array in the range from # 00 to # FF. Further sorting occurs in
the following way - compares the first two items in the table
if the second than the first, then they change places, and then
compare the elements of the second and third ..., etc. As a
result, sorted both tables. (But we need
only the second - 256 bytes)
For maximum speed MAX
decided to almost completely eliminate the use of index
registers, as well as used in large loops team JP
instead of JR.
Here's listing of this procedure:
; (C) MAX / CYBERAX / BDA, 02.1999
; OPTIMIZATION
ORG # 7000
BUFF EQU # 80; SENIOR address byte # 8000
; For tables of 512 bytes.
TABLE EQU BUFF +2; STARSH.BAYT address # 8200
; FOR TABLES 256 bytes.
BLOCK EQU # C000; STARTING ADDRESS BLOCK.
CODLEN EQU # 4000; block length
MK_TAB LD HL, BUFF * 256
LD DE, BUFF * 256 1
LD BC, # 200
LD (HL), L
LDIR
MK_TB LD (HL), L
INC L
JP NZ, MK_TB
LD H, BUFF
LD DE, BLOCK
LD C, CODLEN/256; SENIOR BYTES LONG
; B = 0
TB_LP LD A, (DE)
LD L, A
INC (HL)
JP NZ, NO_HIGH
INC H
INC (HL)
DEC H
NO_HIGH INC DE
DJNZ TB_LP
DEC C
JP NZ, TB_LP
; Start sorting
SORT0 LD HL, BUFF * 256
LD HX, 0
SORT1 LD E, (HL)
INC H
LD D, (HL)
INC H
LD A, (HL)
INC L
DEC H
LD B, (HL)
DEC H
LD C, (HL)
EX DE, HL
AND A
SBC HL, BC
EX AF, AF '
ADD HL, BC
EX AF, AF '
EX DE, HL
JR NC, NO_SWAP
LD (HL), E
INC H
LD (HL), D
INC H
LD E, (HL)
LD (HL), A
DEC L
LD (HL), E
DEC H
LD (HL), B
DEC H
LD (HL), C
INC L
LD HX, # FF
NO_SWAP LD A, L
INC A
JP NZ, SORT1
INC HX
JP Z, SORT0
RET
You may be interested area
application of these procedures? My answer is that their
can be applied, for example, when writing
different packers. I wonder - what
thinks about Dmitry Pyankov of
Gorno-Altaisk?
And let the luck you can not leave!