mirror of
https://github.com/LIV2/a4091-software.git
synced 2025-12-06 06:22:44 +00:00
Support RNC PRO-PACK compressed filesystem
This way we can transparently decompress both the driver and filesystem. File | Orig. | Comp. | Saved -----------------+-------+-------+---------------- BootCDFileSystem | 19248 | 12274 | 6974 (36.23%) a4091.device | 36652 | 23504 | 13148 (35.87%) -----------------+-------+-------+---------------- Total | 55900 | 35778 | 20122 (36.00%) This brings down the ROM usage for both components from 85.3% to 54.6%, leaving plenty of room for debug builds, other versions of CDFileSystem, etc.
This commit is contained in:
parent
f36d77c635
commit
e499131390
12
Makefile
12
Makefile
@ -101,7 +101,7 @@ ifeq (, $(shell which $(CC) 2>/dev/null ))
|
||||
$(error "No $(CC) in PATH: maybe do PATH=$$PATH:/opt/amiga/bin")
|
||||
endif
|
||||
|
||||
all: $(PROG) $(PROGU) $(PROGD) $(ROM) $(ROM_ND)
|
||||
all: $(PROG) $(PROG).rnc $(PROGU) $(PROGD) $(ROM) $(ROM_ND)
|
||||
|
||||
ifneq (,$(wildcard BootCDFileSystem))
|
||||
all: $(ROM_CD)
|
||||
@ -163,10 +163,14 @@ $(SC_ASM): ncr53cxxx.c
|
||||
$(OBJDIR)/version.i: version.h
|
||||
$(QUIET)awk '/#define DEVICE_/{print $$2" EQU "$$3}' $< > $@
|
||||
|
||||
$(OBJDIR)/reloc.o: reloc.S
|
||||
$(OBJDIR)/%.o: %.S
|
||||
@echo Building $@
|
||||
$(QUIET)$(VASM) -quiet -m68020 -Fhunk -o $@ $< -I $(NDK_PATH) -DHAVE_ERRNO
|
||||
|
||||
%.rnc: % $(OBJDIR)/rnc
|
||||
@echo Compressing $<
|
||||
$(QUIET)$(OBJDIR)/rnc p $< $@ -m 1
|
||||
|
||||
$(OBJDIR)/rom.o $(OBJDIR)/rom_nd.o $(OBJDIR)/rom_com.o: rom.S reloc.S $(OBJDIR)/version.i Makefile
|
||||
@echo Building $@
|
||||
$(QUIET)$(VASM) -quiet -m68020 -Fhunk -o $@ $< -I $(OBJDIR) -I $(NDK_PATH) $(ROMDRIVER)
|
||||
@ -187,6 +191,10 @@ test: reloctest
|
||||
@echo Running relocation test
|
||||
$(QUIET)vamos reloctest
|
||||
|
||||
$(OBJDIR)/rnc: 3rdparty/propack/main.c
|
||||
@echo Building $@
|
||||
$(QUIET)$(HOSTCC) -O3 -flto -Wno-unused-result $^ -o $@
|
||||
|
||||
$(ROM): $(OBJSROM) rom.ld
|
||||
$(ROM_ND): $(OBJSROM_ND) rom.ld
|
||||
$(ROM_CD): $(OBJSROM_CD) rom.ld
|
||||
|
||||
78
reloc.S
78
reloc.S
@ -22,6 +22,81 @@ _relocate
|
||||
|
||||
; fetch file header
|
||||
bsr RomFetch32
|
||||
cmp.l #$524e4301,d0 ; Are we compressed?
|
||||
beq.b .decompress
|
||||
|
||||
bra real_relocate
|
||||
|
||||
.decompress
|
||||
bsr RomFetch32
|
||||
; d0 = original length
|
||||
move.l d0,d3
|
||||
moveq.l #MEMF_PUBLIC,d1
|
||||
move.l 4,a6 ; execbase
|
||||
jsr _LVOAllocMem(a6)
|
||||
move.l d0,d2
|
||||
; d2 / d3 = Original Ptr/Size
|
||||
|
||||
bsr RomFetch32
|
||||
add.l #18,d0 ; magic 18 bytes at the beginning
|
||||
move.l d0,d5
|
||||
moveq.l #MEMF_PUBLIC,d1
|
||||
jsr _LVOAllocMem(a6)
|
||||
move.l d0,d4
|
||||
; d4 / d5 = Compressed Ptr/Size
|
||||
|
||||
; Reset ReadHandle
|
||||
lea ReadHandle(pc),a1
|
||||
move.l (a1),d0
|
||||
tst.l 4(a1)
|
||||
beq .direct
|
||||
sub.l #48,d0 ; 12 bytes
|
||||
bra .storeHandle
|
||||
.direct
|
||||
sub.l #12,d0 ; 12 bytes
|
||||
.storeHandle
|
||||
move.l d0,(a1)
|
||||
|
||||
; Copy compressed file to ram.
|
||||
move.l d4,a0
|
||||
move.l d5,d1
|
||||
addq.l #3,d1 ; round up
|
||||
lsr.l #2,d1
|
||||
.Copy
|
||||
bsr RomFetch32
|
||||
move.l d0,(a0)
|
||||
addq.l #4,a0
|
||||
dbra d1,.Copy
|
||||
|
||||
move.l d4,a0
|
||||
move.l d2,a1
|
||||
jsr _Unpack
|
||||
|
||||
move.l d4,a1
|
||||
move.l d5,d0
|
||||
jsr _LVOFreeMem(a6)
|
||||
|
||||
lea ReadHandle(pc),a1
|
||||
move.l d2,(a1) ; memory location passed in a0
|
||||
move.l #0,4(a1) ; Set access type: 0 = memory, Z3 otherwise
|
||||
|
||||
bsr RomFetch32
|
||||
|
||||
bsr real_relocate
|
||||
; save return value
|
||||
move.l d0,d4
|
||||
|
||||
move.l d2,a1
|
||||
move.l d3,d0
|
||||
jsr _LVOFreeMem(a6)
|
||||
|
||||
move.l d4,d0
|
||||
movem.l (sp)+,d1-d7/a0-a6
|
||||
rts
|
||||
|
||||
real_relocate
|
||||
movem.l d1-d7/a0-a6,-(sp)
|
||||
|
||||
cmp.l #$3f3,d0 ; We only know hunk_hdr
|
||||
bne .RelocateFail
|
||||
|
||||
@ -308,6 +383,7 @@ InitHandle
|
||||
; nibble mapped nature of the AutoConfig ROM.
|
||||
; ROM_ADDRESS is passed in a0
|
||||
; ROM_OFFSET is passed in d0
|
||||
movem.l a0-a1,-(sp)
|
||||
|
||||
lsl.l #2,d0
|
||||
|
||||
@ -321,6 +397,7 @@ InitHandle
|
||||
jsr _LVOAllocMem(a6)
|
||||
lea pHunks(pc),a1
|
||||
move.l d0,(a1)
|
||||
movem.l (sp)+,a0-a1
|
||||
rts
|
||||
|
||||
ReadHandle
|
||||
@ -335,4 +412,5 @@ pHunks
|
||||
_rErrno
|
||||
dc.l 0
|
||||
ENDIF
|
||||
INCLUDE "rnc.S"
|
||||
CODE
|
||||
|
||||
413
rnc.S
Normal file
413
rnc.S
Normal file
@ -0,0 +1,413 @@
|
||||
*------------------------------------------------------------------------------
|
||||
* PRO-PACK Unpack Source Code - MC68000, Method 1
|
||||
*
|
||||
* Copyright (c) 1991,92 Rob Northen Computing, U.K. All Rights Reserved.
|
||||
*
|
||||
* File: RNC_1.S
|
||||
*
|
||||
* Date: 24.3.92
|
||||
*------------------------------------------------------------------------------
|
||||
|
||||
*------------------------------------------------------------------------------
|
||||
* Conditional Assembly Flags
|
||||
*------------------------------------------------------------------------------
|
||||
|
||||
CHECKSUMS EQU 0 ; set this flag to 1 if you require
|
||||
; the data to be validated
|
||||
|
||||
PROTECTED EQU 0 ; set this flag to 1 if you are unpacking
|
||||
; a file packed with option "-K"
|
||||
|
||||
*------------------------------------------------------------------------------
|
||||
* Return Codes
|
||||
*------------------------------------------------------------------------------
|
||||
|
||||
NOT_PACKED EQU 0
|
||||
PACKED_CRC EQU -1
|
||||
UNPACKED_CRC EQU -2
|
||||
|
||||
*------------------------------------------------------------------------------
|
||||
* Other Equates
|
||||
*------------------------------------------------------------------------------
|
||||
|
||||
PACK_TYPE EQU 1
|
||||
PACK_ID EQU "R"<<24+"N"<<16+"C"<<8+PACK_TYPE
|
||||
HEADER_LEN EQU 18
|
||||
MIN_LENGTH EQU 2
|
||||
CRC_POLY EQU $A001
|
||||
RAW_TABLE EQU 0
|
||||
POS_TABLE EQU RAW_TABLE+16*8
|
||||
LEN_TABLE EQU POS_TABLE+16*8
|
||||
|
||||
|
||||
IFEQ CHECKSUMS
|
||||
BUFSIZE EQU 16*8*3
|
||||
ELSE
|
||||
BUFSIZE EQU 512
|
||||
ENDC
|
||||
|
||||
counts EQUR d4
|
||||
key EQUR d5
|
||||
bit_buffer EQUR d6
|
||||
bit_count EQUR d7
|
||||
|
||||
input EQUR a3
|
||||
input_hi EQUR a4
|
||||
output EQUR a5
|
||||
output_hi EQUR a6
|
||||
|
||||
*------------------------------------------------------------------------------
|
||||
* Macros
|
||||
*------------------------------------------------------------------------------
|
||||
|
||||
getrawREP MACRO
|
||||
getrawREP2\@
|
||||
move.b (input)+,(output)+
|
||||
IFNE PROTECTED
|
||||
eor.b key,-1(output)
|
||||
ENDC
|
||||
dbra d0,getrawREP2\@
|
||||
IFNE PROTECTED
|
||||
ror.w #1,key
|
||||
ENDC
|
||||
ENDM
|
||||
|
||||
*------------------------------------------------------------------------------
|
||||
* PRO-PACK Unpack Routine - MC68000, Method 1
|
||||
*
|
||||
* on entry,
|
||||
* d0.l = packed data key, or 0 if file was not packed with a key
|
||||
* a0.l = start address of packed file
|
||||
* a1.l = start address to write unpacked file
|
||||
* on exit,
|
||||
* d0.l = length of unpacked file in bytes OR error code
|
||||
* 0 = not a packed file
|
||||
* -1 = packed data CRC error
|
||||
* -2 = unpacked data CRC error
|
||||
*
|
||||
* all other registers are preserved
|
||||
*------------------------------------------------------------------------------
|
||||
public _Unpack
|
||||
_Unpack
|
||||
movem.l d0-d7/a0-a6,-(sp)
|
||||
lea -BUFSIZE(sp),sp
|
||||
move.l sp,a2
|
||||
|
||||
IFNE PROTECTED
|
||||
move.w d0,key
|
||||
ENDC
|
||||
|
||||
bsr read_long
|
||||
moveq.l #NOT_PACKED,d1
|
||||
cmp.l #PACK_ID,d0
|
||||
bne unpack16
|
||||
bsr read_long
|
||||
move.l d0,BUFSIZE(sp)
|
||||
lea HEADER_LEN-8(a0),input
|
||||
move.l a1,output
|
||||
lea (output,d0.l),output_hi
|
||||
bsr read_long
|
||||
lea (input,d0.l),input_hi
|
||||
|
||||
IFNE CHECKSUMS
|
||||
move.l input,a1
|
||||
bsr crc_block
|
||||
lea -6(input),a0
|
||||
bsr read_long
|
||||
moveq.l #PACKED_CRC,d1
|
||||
cmp.w d2,d0
|
||||
bne unpack16
|
||||
swap d0
|
||||
move.w d0,-(sp)
|
||||
ENDC
|
||||
|
||||
clr.w -(sp)
|
||||
cmp.l input_hi,output
|
||||
bcc.s unpack7
|
||||
moveq.l #0,d0
|
||||
move.b -2(input),d0
|
||||
lea (output_hi,d0.l),a0
|
||||
cmp.l input_hi,a0
|
||||
bls.s unpack7
|
||||
addq.w #2,sp
|
||||
|
||||
move.l input_hi,d0
|
||||
btst #0,d0
|
||||
beq.s unpack2
|
||||
addq.w #1,input_hi
|
||||
addq.w #1,a0
|
||||
unpack2
|
||||
move.l a0,d0
|
||||
btst #0,d0
|
||||
beq.s unpack3
|
||||
addq.w #1,a0
|
||||
unpack3
|
||||
moveq.l #0,d0
|
||||
unpack4
|
||||
cmp.l a0,output_hi
|
||||
beq.s unpack5
|
||||
move.b -(a0),d1
|
||||
move.w d1,-(sp)
|
||||
addq.b #1,d0
|
||||
bra.s unpack4
|
||||
unpack5
|
||||
move.w d0,-(sp)
|
||||
add.l d0,a0
|
||||
IFNE PROTECTED
|
||||
move.w key,-(sp)
|
||||
ENDC
|
||||
unpack6
|
||||
lea -8*4(input_hi),input_hi
|
||||
movem.l (input_hi),d0-d7
|
||||
movem.l d0-d7,-(a0)
|
||||
cmp.l input,input_hi
|
||||
bhi.s unpack6
|
||||
sub.l input_hi,input
|
||||
add.l a0,input
|
||||
IFNE PROTECTED
|
||||
move.w (sp)+,key
|
||||
ENDC
|
||||
|
||||
unpack7
|
||||
moveq.l #0,bit_count
|
||||
move.b 1(input),bit_buffer
|
||||
rol.w #8,bit_buffer
|
||||
move.b (input),bit_buffer
|
||||
moveq.l #2,d0
|
||||
moveq.l #2,d1
|
||||
bsr input_bits
|
||||
unpack8
|
||||
move.l a2,a0
|
||||
bsr make_huftable
|
||||
lea POS_TABLE(a2),a0
|
||||
bsr make_huftable
|
||||
lea LEN_TABLE(a2),a0
|
||||
bsr make_huftable
|
||||
unpack9
|
||||
moveq.l #-1,d0
|
||||
moveq.l #16,d1
|
||||
bsr input_bits
|
||||
move.w d0,counts
|
||||
subq.w #1,counts
|
||||
bra.s unpack12
|
||||
unpack10
|
||||
lea POS_TABLE(a2),a0
|
||||
moveq.l #0,d0
|
||||
bsr.s input_value
|
||||
neg.l d0
|
||||
lea -1(output,d0.l),a1
|
||||
lea LEN_TABLE(a2),a0
|
||||
bsr.s input_value
|
||||
move.b (a1)+,(output)+
|
||||
unpack11
|
||||
move.b (a1)+,(output)+
|
||||
dbra d0,unpack11
|
||||
unpack12
|
||||
move.l a2,a0
|
||||
bsr.s input_value
|
||||
subq.w #1,d0
|
||||
bmi.s unpack13
|
||||
getrawREP
|
||||
move.b 1(input),d0
|
||||
rol.w #8,d0
|
||||
move.b (input),d0
|
||||
lsl.l bit_count,d0
|
||||
moveq.l #1,d1
|
||||
lsl.w bit_count,d1
|
||||
subq.w #1,d1
|
||||
and.l d1,bit_buffer
|
||||
or.l d0,bit_buffer
|
||||
unpack13
|
||||
dbra counts,unpack10
|
||||
cmp.l output_hi,output
|
||||
bcs.s unpack8
|
||||
|
||||
move.w (sp)+,d0
|
||||
beq.s unpack15
|
||||
IFNE CHECKSUMS
|
||||
move.l output,a0
|
||||
ENDC
|
||||
unpack14
|
||||
move.w (sp)+,d1
|
||||
IFNE CHECKSUMS
|
||||
move.b d1,(a0)+
|
||||
ELSEIF
|
||||
move.b d1,(output)+
|
||||
ENDC
|
||||
subq.b #1,d0
|
||||
bne.s unpack14
|
||||
unpack15
|
||||
|
||||
IFNE CHECKSUMS
|
||||
move.l BUFSIZE+2(sp),d0
|
||||
sub.l d0,output
|
||||
move.l output,a1
|
||||
bsr crc_block
|
||||
moveq.l #UNPACKED_CRC,d1
|
||||
cmp.w (sp)+,d2
|
||||
beq.s unpack17
|
||||
ELSEIF
|
||||
bra.s unpack17
|
||||
ENDC
|
||||
unpack16
|
||||
move.l d1,BUFSIZE(sp)
|
||||
unpack17
|
||||
lea BUFSIZE(sp),sp
|
||||
movem.l (sp)+,d0-d7/a0-a6
|
||||
rts
|
||||
|
||||
input_value
|
||||
move.w (a0)+,d0
|
||||
and.w bit_buffer,d0
|
||||
sub.w (a0)+,d0
|
||||
bne.s input_value
|
||||
move.b 16*4-4(a0),d1
|
||||
sub.b d1,bit_count
|
||||
bge.s input_value2
|
||||
bsr.s input_bits3
|
||||
input_value2
|
||||
lsr.l d1,bit_buffer
|
||||
move.b 16*4-3(a0),d0
|
||||
cmp.b #2,d0
|
||||
blt.s input_value4
|
||||
subq.b #1,d0
|
||||
move.b d0,d1
|
||||
move.b d0,d2
|
||||
move.w 16*4-2(a0),d0
|
||||
and.w bit_buffer,d0
|
||||
sub.b d1,bit_count
|
||||
bge.s input_value3
|
||||
bsr.s input_bits3
|
||||
input_value3
|
||||
lsr.l d1,bit_buffer
|
||||
bset d2,d0
|
||||
input_value4
|
||||
rts
|
||||
|
||||
input_bits
|
||||
and.w bit_buffer,d0
|
||||
sub.b d1,bit_count
|
||||
bge.s input_bits2
|
||||
bsr.s input_bits3
|
||||
input_bits2
|
||||
lsr.l d1,bit_buffer
|
||||
rts
|
||||
|
||||
input_bits3
|
||||
add.b d1,bit_count
|
||||
lsr.l bit_count,bit_buffer
|
||||
swap bit_buffer
|
||||
addq.w #4,input
|
||||
move.b -(input),bit_buffer
|
||||
rol.w #8,bit_buffer
|
||||
move.b -(input),bit_buffer
|
||||
swap bit_buffer
|
||||
sub.b bit_count,d1
|
||||
moveq.l #16,bit_count
|
||||
sub.b d1,bit_count
|
||||
rts
|
||||
|
||||
read_long
|
||||
moveq.l #3,d1
|
||||
read_long2
|
||||
lsl.l #8,d0
|
||||
move.b (a0)+,d0
|
||||
dbra d1,read_long2
|
||||
rts
|
||||
|
||||
make_huftable
|
||||
moveq.l #$1f,d0
|
||||
moveq.l #5,d1
|
||||
bsr.s input_bits
|
||||
subq.w #1,d0
|
||||
bmi.s make_huftable8
|
||||
move.w d0,d2
|
||||
move.w d0,d3
|
||||
lea -16(sp),sp
|
||||
move.l sp,a1
|
||||
make_huftable3
|
||||
moveq.l #$f,d0
|
||||
moveq.l #4,d1
|
||||
bsr.s input_bits
|
||||
move.b d0,(a1)+
|
||||
dbra d2,make_huftable3
|
||||
moveq.l #1,d0
|
||||
ror.l #1,d0
|
||||
moveq.l #1,d1
|
||||
moveq.l #0,d2
|
||||
movem.l d5-d7,-(sp)
|
||||
make_huftable4
|
||||
move.w d3,d4
|
||||
lea 12(sp),a1
|
||||
make_huftable5
|
||||
cmp.b (a1)+,d1
|
||||
bne.s make_huftable7
|
||||
moveq.l #1,d5
|
||||
lsl.w d1,d5
|
||||
subq.w #1,d5
|
||||
move.w d5,(a0)+
|
||||
move.l d2,d5
|
||||
swap d5
|
||||
move.w d1,d7
|
||||
subq.w #1,d7
|
||||
make_huftable6
|
||||
roxl.w #1,d5
|
||||
roxr.w #1,d6
|
||||
dbra d7,make_huftable6
|
||||
moveq.l #16,d5
|
||||
sub.b d1,d5
|
||||
lsr.w d5,d6
|
||||
move.w d6,(a0)+
|
||||
move.b d1,16*4-4(a0)
|
||||
move.b d3,d5
|
||||
sub.b d4,d5
|
||||
move.b d5,16*4-3(a0)
|
||||
moveq.l #1,d6
|
||||
subq.b #1,d5
|
||||
lsl.w d5,d6
|
||||
subq.w #1,d6
|
||||
move.w d6,16*4-2(a0)
|
||||
add.l d0,d2
|
||||
make_huftable7
|
||||
dbra d4,make_huftable5
|
||||
lsr.l #1,d0
|
||||
addq.b #1,d1
|
||||
cmp.b #17,d1
|
||||
bne.s make_huftable4
|
||||
movem.l (sp)+,d5-d7
|
||||
lea 16(sp),sp
|
||||
make_huftable8
|
||||
rts
|
||||
|
||||
IFNE CHECKSUMS
|
||||
crc_block
|
||||
move.l a2,a0
|
||||
moveq.l #0,d3
|
||||
crc_block2
|
||||
move.l d3,d1
|
||||
moveq.l #7,d2
|
||||
crc_block3
|
||||
lsr.w #1,d1
|
||||
bcc.s crc_block4
|
||||
eor.w #CRC_POLY,d1
|
||||
crc_block4
|
||||
dbra d2,crc_block3
|
||||
move.w d1,(a0)+
|
||||
addq.b #1,d3
|
||||
bne.s crc_block2
|
||||
moveq.l #0,d2
|
||||
crc_block5
|
||||
move.b (a1)+,d1
|
||||
eor.b d1,d2
|
||||
move.w d2,d1
|
||||
and.w #$ff,d2
|
||||
add.w d2,d2
|
||||
move.w (a2,d2.w),d2
|
||||
lsr.w #8,d1
|
||||
eor.b d1,d2
|
||||
subq.l #1,d0
|
||||
bne.s crc_block5
|
||||
rts
|
||||
ENDC
|
||||
|
||||
end
|
||||
11
romfile.c
11
romfile.c
@ -39,16 +39,19 @@ void parse_romfiles(void)
|
||||
asave->romfile[1]=RomFetch32((i*32*1024) - 24);
|
||||
|
||||
printf("Detected %dkB ROM.\n", i*32);
|
||||
if(asave->romfile_len[0])
|
||||
if(asave->romfile_len[0]) {
|
||||
printf(" Driver @ 0x%05x (%d bytes)\n", asave->romfile[0],
|
||||
asave->romfile_len[0]);
|
||||
else
|
||||
} else
|
||||
printf(" Driver not found. Huh?\n");
|
||||
|
||||
if(asave->romfile_len[1])
|
||||
if(asave->romfile_len[1]) {
|
||||
printf(" CDFS @ 0x%05x (%d bytes)\n", asave->romfile[1],
|
||||
asave->romfile_len[1]);
|
||||
else
|
||||
if (RomFetch32(asave->romfile[1]) == 0x524e4301)
|
||||
printf(" compressed (%d bytes)\n",
|
||||
RomFetch32(asave->romfile[1] + 4));
|
||||
} else
|
||||
printf(" CDFS not found.\n");
|
||||
|
||||
break;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user