1;===========================================================================
2; Copyright (c) 1990-1999 Info-ZIP.  All rights reserved.
3;
4; See the accompanying file LICENSE, version 1999-Oct-05 or later
5; (the contents of which are also included in zip.h) for terms of use.
6; If, for some reason, both of these files are missing, the Info-ZIP license
7; also may be found at:  ftp://ftp.cdrom.com/pub/infozip/license.html
8;===========================================================================
9; match.a -- optional optimized asm version of longest match in deflate.c
10; Written by Jean-loup Gailly
11;
12; Adapted for the Amiga by Carsten Steger <stegerc@informatik.tu-muenchen.de>
13; using the code in match.S.
14; The major change in this code consists of removing all unaligned
15; word accesses, because they cause 68000-based Amigas to crash.
16; For maximum speed, UNALIGNED_OK can be defined in Makefile.sasc.
17; The program will then only run on 68020-based Amigas, though.
18;
19; This code will run with registerized parameters too, unless SAS
20; changes parameter passing conventions between new releases of SAS/C.
21
22
23;;Cur_Match      equr     d0      ; Must be in d0!
24;;Best_Len       equr     d1
25;;Loop_Counter   equr     d2
26;;Scan_Start     equr     d3
27;;Scan_End       equr     d4
28;;Limit          equr     d5
29;;Chain_Length   equr     d6
30;;Scan_Test      equr     d7
31;;Scan           equr     a0
32;;Match          equr     a1
33;;Prev_Address   equr     a2
34;;Scan_Ini       equr     a3
35;;Match_Ini      equr     a4
36
37MAX_MATCH       equ     258
38MIN_MATCH       equ     3
39WSIZE           equ     32768
40MAX_DIST        equ     WSIZE-MAX_MATCH-MIN_MATCH-1
41
42
43        .globl    _max_chain_length
44        .globl    _prev_length
45        .globl    _prev
46        .globl    _window
47        .globl    _strstart
48        .globl    _good_match
49        .globl    _match_start
50        .globl    _nice_match
51
52        .text
53        .globl   _match_init
54        .globl   _longest_match
55
56_match_init:
57        rts
58
59
60_longest_match:
61        move.l  4(sp),d0
62        movem.l d2-d7/a2-a4,-(sp)
63        move.l  _max_chain_length,d6
64        move.l  _prev_length,d1
65        lea     _prev,a2
66        lea     _window+MIN_MATCH,a4
67        move.l  _strstart,d5
68        move.l  a4,a3
69        add.l   d5,a3
70        subi.w  #MAX_DIST,d5
71        bhi     limit_ok
72        moveq   #0,d5
73limit_ok:
74        cmp.l   _good_match,d1
75        bcs     length_ok
76        lsr.l   #2,d6
77length_ok:
78        subq.l  #1,d6
79
80        move.b  -MIN_MATCH(a3),d3
81        lsl.w   #8,d3
82        move.b  -MIN_MATCH+1(a3),d3
83        move.b  -MIN_MATCH-1(a3,d1),d4
84        lsl.w   #8,d4
85        move.b  -MIN_MATCH(a3,d1),d4
86
87        bra     do_scan
88
89long_loop:
90
91        move.b  -MIN_MATCH-1(a3,d1),d4
92        lsl.w   #8,d4
93        move.b  -MIN_MATCH(a3,d1),d4
94
95short_loop:
96        lsl.w   #1,d0
97        move.w  0(a2,d0.l),d0
98        cmp.w   d5,d0
99        dbls    d6,do_scan
100        bra     return
101
102do_scan:
103        move.l  a4,a1
104        add.l   d0,a1
105
106        move.b  -MIN_MATCH-1(a1,d1),d7
107        lsl.w   #8,d7
108        move.b  -MIN_MATCH(a1,d1),d7
109        cmp.w   d7,d4
110        bne     short_loop
111        move.b  -MIN_MATCH(a1),d7
112        lsl.w   #8,d7
113        move.b  -MIN_MATCH+1(a1),d7
114        cmp.w   d7,d3
115        bne     short_loop
116
117        move.w  #(MAX_MATCH-MIN_MATCH),d2
118        move.l  a3,a0
119
120scan_loop:
121        cmpm.b  (a1)+,(a0)+
122        dbne    d2,scan_loop
123
124        sub.l   a3,a0
125        addq.l  #(MIN_MATCH-1),a0
126        cmp.l   d1,a0
127        bls     short_loop
128        move.l  a0,d1
129        move.l  d0,_match_start
130        cmp.l   _nice_match,d1
131        bcs     long_loop
132return:
133        move.l  d1,d0
134        movem.l (sp)+,d2-d7/a2-a4
135        rts
136        end
137
138
139