Source to src/decomp.gas


Enter a symbol's name here to quickly find it.

 .long
 .dc.l	codeend - _decomp_start
_decomp_start::
 .gpu
	.org $f03100

S_LE	.ccdef  $14     ; PL
U_LE	.ccdef  $04     ; CC
S_GT    .ccdef	$18   	; MI
U_GT    .ccdef	$08  	; CS

S_LT	.ccdef	$15		; PL+NE
U_LT	.ccdef	$05		; CC+NE

FP .equr r14
scratch .equr r10
scratch2 .equr r11
RETURNVALUE .equr r29
RETURNPOINT .equr r28
MATH_A .equr r27
MATH_B .equr r26
MATH_C .equr r25
MATH_RTS .equr r24
MATH_SIGN .equr r23


;=============================================================================
;
; unsigned char *decomp_input;
; unsigned char *decomp_output;
	.extern	_decomp_input, _decomp_output
;=============================================================================

getidbyte       .equr   r4
idbyte          .equr   r5
ptr_input       .equr   r6
ptr_output      .equr   r7
pos             .equr   r8
ptr_source      .equr   r9
len             .equr   r10
lbl_main        .equr   r11
const_f			.equr	r12

;   decompress an lzss-compressed lump
		
;	Initialize vairables

	movei	#_decomp_input,ptr_input
	load	(ptr_input),ptr_input
	movei	#_decomp_output,ptr_output
	load	(ptr_output),ptr_output

	movei	#W_RL_main, lbl_main
	moveq	#$f,const_f

; getidbyte = 0
	moveq	#1, getidbyte
	
;	Main decompression loop

	
	subq	#1,getidbyte
W_RL_main:
	jr		EQ,w_loadidbyte	
	
; test low bit of idbyte
W_RL_testidbyte:
	btst	#0, idbyte		; a harmless delay slot
	jr		NE, W_RL_uncompress
	shrq	#1, idbyte		; delay slot
	
; copy one character
	loadb	(ptr_input), r0
	addq	#1, ptr_input
	storeb	r0, (ptr_output)
	addq	#1, ptr_output
	jump	T, (lbl_main)
	subq	#1,getidbyte	; delay slot

; load idbyte and reset getidbyte
w_loadidbyte:
	loadb	(ptr_input), idbyte
	addq	#1, ptr_input
	jr		T,W_RL_testidbyte
	moveq	#8,getidbyte	; delay slot
		
W_RL_uncompress:

; get the position offset

	loadb	(ptr_input), r0
	addq	#1, ptr_input
	shlq	#4, r0
	loadb	(ptr_input), pos
	shrq	#4, pos
	or	r0, pos

; add position offset to the output and store in ptr_source
	addq	#1,pos
	move	ptr_output, ptr_source
	sub		pos, ptr_source

; get the length

	loadb	(ptr_input), len
	and		const_f, len
	jump	EQ, (RETURNPOINT)		; if byte & 0xf == 0, done	
	addq	#1, ptr_input

	loadb	(ptr_source), r0
	
W_RL_copyloop:
	addq	#1, ptr_source
	storeb	r0, (ptr_output)
	subq	#1, len
	addqt	#1, ptr_output
	jr		PL, W_RL_copyloop
	loadb	(ptr_source), r0	; delay slot

	jump	T, (lbl_main)
	subq	#1,getidbyte	; delay slot

	.phrase
	.68000
codeend: