Make the stuff compile

git-svn-id: svn://svn.cc65.org/cc65/trunk@2445 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz
2003-09-23 20:11:39 +00:00
parent 73941d8f48
commit 03560318ef
5 changed files with 298 additions and 255 deletions

1
libsrc/zlib/.cvsignore Normal file
View File

@@ -0,0 +1 @@
uncompress.s

42
libsrc/zlib/Makefile Normal file
View File

@@ -0,0 +1,42 @@
#
# Makefile for the zlib subdirectory of the cc65 runtime library
#
.SUFFIXES: .o .s .c
#--------------------------------------------------------------------------
# Rules
%.o: %.c
@$(CC) $(CFLAGS) $<
@$(AS) -g -o $@ $(AFLAGS) $(*).s
%.o: %.s
@$(AS) -g -o $@ $(AFLAGS) $<
#--------------------------------------------------------------------------
# Object files
C_OBJS = uncompress.o
S_OBJS = adler32.o \
crc32.o \
inflatemem.o
#--------------------------------------------------------------------------
# Targets
.PHONY: all clean zap
all: $(C_OBJS) $(S_OBJS)
clean:
@rm -f *~
@rm -f $(C_OBJS:.o=.s)
@rm -f $(C_OBJS)
@rm -f $(S_OBJS)
zap: clean

View File

@@ -1,85 +1,85 @@
; ;
; Piotr Fusik, 18.11.2001 ; Piotr Fusik, 18.11.2001
; ;
; unsigned long __fastcall__ adler32 (unsigned long adler, unsigned char* buf, ; unsigned long __fastcall__ adler32 (unsigned long adler, unsigned char* buf,
; unsigned len); ; unsigned len);
; ;
.export _adler32 .export _adler32
.import incsp2, incsp4, popax, popeax .import incsp2, incsp4, popax, popeax
.importzp sreg, ptr1, ptr2, tmp1 .importzp sreg, ptr1, ptr2, tmp1
BASE = 65521 ; largest prime smaller than 65536 BASE = 65521 ; largest prime smaller than 65536
_adler32: _adler32:
; ptr2 = (len & 0xff) == 0 ? len : len + 0x100; ; ptr2 = (len & 0xff) == 0 ? len : len + 0x100;
tay tay
beq @L1 beq @L1
inx inx
@L1: sta ptr2 @L1: sta ptr2
stx ptr2+1 stx ptr2+1
; ptr1 = buf ; ptr1 = buf
jsr popax jsr popax
sta ptr1 sta ptr1
stx ptr1+1 stx ptr1+1
; if (buf == NULL) return 1L; ; if (buf == NULL) return 1L;
ora ptr1+1 ora ptr1+1
beq @L0 beq @L0
; s1 = adler & 0xFFFF; s2 = adler >> 16; ; s1 = adler & 0xFFFF; s2 = adler >> 16;
jsr popeax jsr popeax
; if (len == 0) return adler; ; if (len == 0) return adler;
ldy ptr2 ldy ptr2
bne @L2 bne @L2
ldy ptr2+1 ldy ptr2+1
beq @RET beq @RET
@L2: ldy #0 @L2: ldy #0
; s1 += *ptr++; if (s1 >= BASE) s1 -= BASE; ; s1 += *ptr++; if (s1 >= BASE) s1 -= BASE;
@L3: clc @L3: clc
adc (ptr1),y adc (ptr1),y
bcc @L4 bcc @L4
inx inx
beq @L5 ; C flag is set beq @L5 ; C flag is set
@L4: cpx #>BASE @L4: cpx #>BASE
bcc @L6 bcc @L6
cmp #<BASE cmp #<BASE
bcc @L6 bcc @L6
inx ; ldx #0 inx ; ldx #0
@L5: sbc #<BASE ; C flag is set @L5: sbc #<BASE ; C flag is set
clc clc
@L6: sta tmp1 @L6: sta tmp1
; s2 += s1; if (s2 >= BASE) s2 -= BASE; ; s2 += s1; if (s2 >= BASE) s2 -= BASE;
adc sreg ; C flag is clear adc sreg ; C flag is clear
sta sreg sta sreg
txa txa
adc sreg+1 adc sreg+1
sta sreg+1 sta sreg+1
bcs @L7 bcs @L7
cmp #>BASE cmp #>BASE
bcc @L8 bcc @L8
lda sreg lda sreg
cmp #<BASE cmp #<BASE
bcc @L8 bcc @L8
@L7: lda sreg @L7: lda sreg
sbc #<BASE ; C flag is set sbc #<BASE ; C flag is set
sta sreg sta sreg
lda sreg+1 lda sreg+1
sbc #>BASE sbc #>BASE
sta sreg+1 sta sreg+1
@L8: lda tmp1 @L8: lda tmp1
iny iny
bne @L9 bne @L9
inc ptr1+1 inc ptr1+1
@L9: dec ptr2 @L9: dec ptr2
bne @L3 bne @L3
dec ptr2+1 dec ptr2+1
bne @L3 bne @L3
; return (s2 << 16) | s1; ; return (s2 << 16) | s1;
@RET: rts @RET: rts
; return 1L ; return 1L
@L0: sta sreg @L0: sta sreg
sta sreg+1 sta sreg+1
lda #1 lda #1
; ignore adler ; ignore adler
jmp incsp4 jmp incsp4

View File

@@ -1,134 +1,134 @@
; ;
; Piotr Fusik, 14.11.2001 ; Piotr Fusik, 14.11.2001
; ;
; unsigned long __fastcall__ crc32 (unsigned long crc, unsigned char* buf, ; unsigned long __fastcall__ crc32 (unsigned long crc, unsigned char* buf,
; unsigned len); ; unsigned len);
; ;
.export _crc32 .export _crc32
.import compleax, incsp2, incsp4, popax, popeax .import compleax, incsp2, incsp4, popax, popeax
.importzp sreg, ptr1, ptr2, tmp1, tmp2 .importzp sreg, ptr1, ptr2, tmp1, tmp2
POLYNOMIAL = $EDB88320 POLYNOMIAL = $EDB88320
make_table: make_table:
ldx #0 ldx #0
@L1: lda #0 @L1: lda #0
sta tmp2 sta tmp2
sta sreg sta sreg
sta sreg+1 sta sreg+1
ldy #8 ldy #8
txa txa
@L2: sta tmp1 @L2: sta tmp1
lsr a lsr a
bcc @L3 bcc @L3
lda sreg+1 lda sreg+1
lsr a lsr a
eor #(POLYNOMIAL>>24)&$FF eor #(POLYNOMIAL>>24)&$FF
sta sreg+1 sta sreg+1
lda sreg lda sreg
ror a ror a
eor #(POLYNOMIAL>>16)&$FF eor #(POLYNOMIAL>>16)&$FF
sta sreg sta sreg
lda tmp2 lda tmp2
ror a ror a
eor #(POLYNOMIAL>>8)&$FF eor #(POLYNOMIAL>>8)&$FF
sta tmp2 sta tmp2
lda tmp1 lda tmp1
ror a ror a
eor #POLYNOMIAL&$FF eor #POLYNOMIAL&$FF
bcs @L4 ; branch always bcs @L4 ; branch always
@L3: rol a @L3: rol a
lsr sreg+1 lsr sreg+1
ror sreg ror sreg
ror tmp2 ror tmp2
ror a ror a
@L4: dey @L4: dey
bne @L2 bne @L2
sta table_0,x sta table_0,x
lda tmp2 lda tmp2
sta table_1,x sta table_1,x
lda sreg lda sreg
sta table_2,x sta table_2,x
lda sreg+1 lda sreg+1
sta table_3,x sta table_3,x
inx inx
bne @L1 bne @L1
inc table_initialised inc table_initialised
RET: RET:
rts rts
_crc32: _crc32:
; ptr2 = (len & 0xff) == 0 ? len : len + 0x100; ; ptr2 = (len & 0xff) == 0 ? len : len + 0x100;
tay tay
beq @L1 beq @L1
inx inx
@L1: sta ptr2 @L1: sta ptr2
stx ptr2+1 stx ptr2+1
; ptr1 = buf ; ptr1 = buf
jsr popax jsr popax
sta ptr1 sta ptr1
stx ptr1+1 stx ptr1+1
; if (buf == NULL) return 0; ; if (buf == NULL) return 0;
ora ptr1+1 ora ptr1+1
beq @L0 beq @L0
; if (!tables_initialised) make_tables(); ; if (!tables_initialised) make_tables();
lda table_initialised lda table_initialised
bne @dont_make bne @dont_make
jsr make_table jsr make_table
@dont_make: @dont_make:
; eax = crc ; eax = crc
jsr popeax jsr popeax
; if (len == 0) return crc; ; if (len == 0) return crc;
ldy ptr2 ldy ptr2
bne @L2 bne @L2
ldy ptr2+1 ldy ptr2+1
beq RET beq RET
@L2: @L2:
; eax = ~crc ; eax = ~crc
jsr compleax jsr compleax
stx tmp2 stx tmp2
ldy #0 ldy #0
; crc = (crc >> 8) ^ table[(crc & 0xff) ^ *p++]; ; crc = (crc >> 8) ^ table[(crc & 0xff) ^ *p++];
@L3: eor (ptr1),y @L3: eor (ptr1),y
tax tax
lda table_0,x lda table_0,x
eor tmp2 eor tmp2
sta tmp1 sta tmp1
lda table_1,x lda table_1,x
eor sreg eor sreg
sta tmp2 sta tmp2
lda table_2,x lda table_2,x
eor sreg+1 eor sreg+1
sta sreg sta sreg
lda table_3,x lda table_3,x
sta sreg+1 sta sreg+1
lda tmp1 lda tmp1
iny iny
bne @L4 bne @L4
inc ptr1+1 inc ptr1+1
@L4: dec ptr2 @L4: dec ptr2
bne @L3 bne @L3
dec ptr2+1 dec ptr2+1
bne @L3 bne @L3
ldx tmp2 ldx tmp2
jmp compleax jmp compleax
; return 0L ; return 0L
@L0: sta sreg @L0: sta sreg
sta sreg+1 sta sreg+1
; ignore crc ; ignore crc
jmp incsp4 jmp incsp4
.data .data
table_initialised: table_initialised:
.byte 0 .byte 0
.bss .bss
table_0: .res 256 table_0: .res 256
table_1: .res 256 table_1: .res 256
table_2: .res 256 table_2: .res 256
table_3: .res 256 table_3: .res 256

View File

@@ -1,36 +1,36 @@
/* /*
* uncompress.c * uncompress.c
* *
* Piotr Fusik, 18.11.2001 * Piotr Fusik, 18.11.2001
*/ */
#include <zlib.h> #include <zlib.h>
int uncompress (char* dest, unsigned* destLen, int uncompress (char* dest, unsigned* destLen,
const char* source, unsigned sourceLen) const char* source, unsigned sourceLen)
{ {
unsigned len; unsigned len;
unsigned char* ptr; unsigned char* ptr;
unsigned long csum; unsigned long csum;
/* source[0]: Compression method and flags /* source[0]: Compression method and flags
bits 0 to 3: Compression method (must be Z_DEFLATED) bits 0 to 3: Compression method (must be Z_DEFLATED)
bits 4 to 7: Compression info (must be <= 7) bits 4 to 7: Compression info (must be <= 7)
source[1]: Flags source[1]: Flags
bits 0 to 4: Check bits bits 0 to 4: Check bits
bit 5: Preset dictionary (not supported, sorry) bit 5: Preset dictionary (not supported, sorry)
bits 6 to 7: Compression level bits 6 to 7: Compression level
*/ */
if ((source[0] & 0x8f) != Z_DEFLATED || source[1] & 0x20) if ((source[0] & 0x8f) != Z_DEFLATED || source[1] & 0x20)
return Z_DATA_ERROR; return Z_DATA_ERROR;
if ((((unsigned) source[0] << 8) | (unsigned char) source[1]) % 31) if ((((unsigned) source[0] << 8) | (unsigned char) source[1]) % 31)
return Z_DATA_ERROR; return Z_DATA_ERROR;
*destLen = len = inflatemem(dest, source + 2); *destLen = len = inflatemem(dest, source + 2);
ptr = (unsigned char*) source + sourceLen - 4; ptr = (unsigned char*) source + sourceLen - 4;
csum = adler32(adler32(0L, Z_NULL, 0), dest, len); csum = adler32(adler32(0L, Z_NULL, 0), dest, len);
if ((unsigned char) csum != ptr[3] if ((unsigned char) csum != ptr[3]
|| (unsigned char) (csum >> 8) != ptr[2] || (unsigned char) (csum >> 8) != ptr[2]
|| (unsigned char) (csum >> 16) != ptr[1] || (unsigned char) (csum >> 16) != ptr[1]
|| (unsigned char) (csum >> 24) != ptr[0]) || (unsigned char) (csum >> 24) != ptr[0])
return Z_DATA_ERROR; return Z_DATA_ERROR;
return Z_OK; return Z_OK;
} }