📄 bits.ash
字号:
; bits.ash -- bit access for decompression;; This file is part of the UCL data compression library.;; Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer; All Rights Reserved.;; The UCL library is free software; you can redistribute it and/or; modify it under the terms of the GNU General Public License as; published by the Free Software Foundation; either version 2 of; the License, or (at your option) any later version.;; The UCL library is distributed in the hope that it will be useful,; but WITHOUT ANY WARRANTY; without even the implied warranty of; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the; GNU General Public License for more details.;; You should have received a copy of the GNU General Public License; along with the UCL library; see the file COPYING.; If not, write to the Free Software Foundation, Inc.,; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.;; Markus F.X.J. Oberhumer; <markus@oberhumer.com>; http://www.oberhumer.com/ucl;; ------------- ADDBITS -------------macro(ADDBITS)#if (NRV_BB == 8) add.b d0,d0 ; sets Z, C and X ; 4#elif (NRV_BB == 32) add.l d0,d0 ; sets Z, C and X ; 6#endif endm#if 0macro(ADDXBITS)#if (NRV_BB == 8) addx.b d0,d0 ; sets C and X ; 4#elif (NRV_BB == 32) addx.l d0,d0 ; sets C and X ; 8#endif endm#endif; ------------- FILLBYTES_xx -------------; get 1 byte; then get 1 bit into both C and Xmacro(FILLBYTES_8) ; note: we shift the X flag through -> must init d0.b with $80 move.b (a0)+,d0 ; 8 addx.b d0,d0 ; sets C and X ; 4 endm; get 32 bits in little endian format; then get 1 bit into both C and Xmacro(FILLBYTES_LE32)#if 0 move.b (a0)+,d0 ; 8 ror.l #8,d0 ; 24 move.b (a0)+,d0 ; 8 ror.l #8,d0 ; 24 move.b (a0)+,d0 ; 8 ror.l #8,d0 ; 24 move.b (a0)+,d0 ; 8 ror.l #8,d0 ; 24 add.l d0,d0 ; sets C and X ; 6 bset #0,d0 ; only changes Z ; 12#elif 0 move.b 3(a0),d0 ; 12 lsl.w #8,d0 ; 22 move.b 2(a0),d0 ; 12 swap d0 ; 4 move.b 1(a0),d0 ; 12 lsl.w #8,d0 ; 22 move.b (a0),d0 ; 8 addq.l #4,a0 ; does not affect flags ; 8 add.l d0,d0 ; sets C and X ; 6 bset #0,d0 ; only changes Z ; 12#else ; note: we shift the X flag through -> must init d0.l with $80000000 ; note: must use dc.l because of a bug in the pasm assembler ; note: may access past the end of the input; this is ok for UPX dc.l $01080003 ; movep.w 3(a0),d0 ; 16 move.b 2(a0),d0 ; 12 swap d0 ; 4 dc.l $01080001 ; movep.w 1(a0),d0 ; 16 move.b (a0),d0 ; 8 addq.l #4,a0 ; does not affect flags ; 8 addx.l d0,d0 ; sets C and X ; 8#endif endm; ------------- FILLBITS -------------macro(FILLBITS)#if (NRV_BB == 8) ; no need for a subroutine FILLBYTES_8#elif (NRV_BB == 32)# ifdef SMALL# define FILLBYTES_SR FILLBYTES_LE32 bsr fillbytes_sr ; 18# else FILLBYTES_LE32# endif#endif endm; ------------- GETBIT -------------; get one bit into both the Carry and eXtended flagmacro(GETBIT)#if defined(__A68K__) ADDBITS ; 4 / 6 bne \@ ; 10 (if jump) FILLBITS\@:#elif defined(__ASL__) ADDBITS ; 4 / 6 bne done ; 10 (if jump) FILLBITSdone:#elseLOCAL done ADDBITS ; 4 / 6 bne done ; 10 (if jump) FILLBITSdone:#endif endm; vi:ts=8:et
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -