123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- ;===========================================================================
- ; Copyright (c) 1990-1999 Info-ZIP. All rights reserved.
- ;
- ; See the accompanying file LICENSE, version 1999-Oct-05 or later
- ; (the contents of which are also included in zip.h) for terms of use.
- ; If, for some reason, both of these files are missing, the Info-ZIP license
- ; also may be found at: ftp://ftp.cdrom.com/pub/infozip/license.html
- ;===========================================================================
- ; match.a -- optional optimized asm version of longest match in deflate.c
- ; Written by Jean-loup Gailly
- ;
- ; Adapted for the Amiga by Carsten Steger <stegerc@informatik.tu-muenchen.de>
- ; using the code in match.S.
- ; The major change in this code consists of removing all unaligned
- ; word accesses, because they cause 68000-based Amigas to crash.
- ; For maximum speed, UNALIGNED_OK can be defined in Makefile.sasc.
- ; The program will then only run on 68020-based Amigas, though.
- ;
- ; This code will run with registerized parameters too, unless SAS
- ; changes parameter passing conventions between new releases of SAS/C.
- ;;Cur_Match equr d0 ; Must be in d0!
- ;;Best_Len equr d1
- ;;Loop_Counter equr d2
- ;;Scan_Start equr d3
- ;;Scan_End equr d4
- ;;Limit equr d5
- ;;Chain_Length equr d6
- ;;Scan_Test equr d7
- ;;Scan equr a0
- ;;Match equr a1
- ;;Prev_Address equr a2
- ;;Scan_Ini equr a3
- ;;Match_Ini equr a4
- MAX_MATCH equ 258
- MIN_MATCH equ 3
- WSIZE equ 32768
- MAX_DIST equ WSIZE-MAX_MATCH-MIN_MATCH-1
- .globl _max_chain_length
- .globl _prev_length
- .globl _prev
- .globl _window
- .globl _strstart
- .globl _good_match
- .globl _match_start
- .globl _nice_match
- .text
- .globl _match_init
- .globl _longest_match
- _match_init:
- rts
- _longest_match:
- move.l 4(sp),d0
- movem.l d2-d7/a2-a4,-(sp)
- move.l _max_chain_length,d6
- move.l _prev_length,d1
- lea _prev,a2
- lea _window+MIN_MATCH,a4
- move.l _strstart,d5
- move.l a4,a3
- add.l d5,a3
- subi.w #MAX_DIST,d5
- bhi limit_ok
- moveq #0,d5
- limit_ok:
- cmp.l _good_match,d1
- bcs length_ok
- lsr.l #2,d6
- length_ok:
- subq.l #1,d6
- move.b -MIN_MATCH(a3),d3
- lsl.w #8,d3
- move.b -MIN_MATCH+1(a3),d3
- move.b -MIN_MATCH-1(a3,d1),d4
- lsl.w #8,d4
- move.b -MIN_MATCH(a3,d1),d4
- bra do_scan
- long_loop:
- move.b -MIN_MATCH-1(a3,d1),d4
- lsl.w #8,d4
- move.b -MIN_MATCH(a3,d1),d4
- short_loop:
- lsl.w #1,d0
- move.w 0(a2,d0.l),d0
- cmp.w d5,d0
- dbls d6,do_scan
- bra return
- do_scan:
- move.l a4,a1
- add.l d0,a1
- move.b -MIN_MATCH-1(a1,d1),d7
- lsl.w #8,d7
- move.b -MIN_MATCH(a1,d1),d7
- cmp.w d7,d4
- bne short_loop
- move.b -MIN_MATCH(a1),d7
- lsl.w #8,d7
- move.b -MIN_MATCH+1(a1),d7
- cmp.w d7,d3
- bne short_loop
- move.w #(MAX_MATCH-MIN_MATCH),d2
- move.l a3,a0
- scan_loop:
- cmpm.b (a1)+,(a0)+
- dbne d2,scan_loop
- sub.l a3,a0
- addq.l #(MIN_MATCH-1),a0
- cmp.l d1,a0
- bls short_loop
- move.l a0,d1
- move.l d0,_match_start
- cmp.l _nice_match,d1
- bcs long_loop
- return:
- move.l d1,d0
- movem.l (sp)+,d2-d7/a2-a4
- rts
- end
|