; Z80 depacker for megalz V4 packed files   (C) fyrex^mhm
;
; DESCRIPTION
;
; Depacker is fully relocatable, not self-modifying,
; it's length is 110 bytes starting from DEC40.
; Register usage; AF,AF',BC,DE,HL. Must be CALL'ed, return is done by RET.
; Provide extra stack location for store 2 bytes (1 word). Depacker does not
; disable or enable interrupts, as well as could be interrupted at any time
; (no f*cking wicked stack usage =).

; USAGE
;
; - put depacker anywhere you want,
; - put starting address of packed block in HL,
; - put location where you want data to be depacked in DE,
;   (much like LDIR command, but without BC)
; - make CALL to depacker (DEC40).
; - enjoy! ;)

; PRECAUTIONS
;
; Be very careful if packed and depacked blocks coincide somewhere in memory.
; Here are some advices:
;
; 1. put packed block to the highest addresses possible.
;     Best if last byte of packed block has address #FFFF.
;
; 2. Leave some gap between ends of packed and depacked block.
;     For example, last byte of depacked block at #FF00,
;     last byte of packed block at #FFFF.
;
; 3. Place nonpackable data to the end of block.
;
; 4. Always check whether depacking occurs OK and neither corrupts depacked data
;     nor hangs computer.
;

depack_megalz:
					LD      A,&80
					EX      AF,AF'
_depack_megalz_MS		LDI
_depack_megalz_M0		LD      BC,&2FF
_depack_megalz_M1		EX      AF,AF'
_depack_megalz_M1X		ADD     A,A
					JR      NZ,_depack_megalz_M2
					LD      A,(HL)
					INC     HL
					RLA
_depack_megalz_M2		RL      C
					JR      NC,_depack_megalz_M1X
					EX      AF,AF'
					DJNZ    _depack_megalz_X2
					LD      A,2
					SRA     C
					JR      C,_depack_megalz_N1
					INC     A
					INC     C
					JR      Z,_depack_megalz_N2
					LD      BC,&33F
					JR      _depack_megalz_M1

_depack_megalz_X2		DJNZ    _depack_megalz_X3
					SRL     C
					JR      C,_depack_megalz_MS
					INC     B
					JR      _depack_megalz_M1
_depack_megalz_X6
					ADD     A,C
_depack_megalz_N2
					LD      BC,&4FF
					JR      _depack_megalz_M1
_depack_megalz_N1
					INC     C
					JR      NZ,_depack_megalz_M4
					EX      AF,AF'
					INC     B
_depack_megalz_N5		RR      C
					RET     C
					RL      B
					ADD     A,A
					JR      NZ,_depack_megalz_N6
					LD      A,(HL)
					INC     HL
					RLA
_depack_megalz_N6		JR      NC,_depack_megalz_N5
					EX      AF,AF'
					ADD     A,B
					LD      B,6
					JR      _depack_megalz_M1
_depack_megalz_X3
					DJNZ    _depack_megalz_X4
					LD      A,1
					JR      _depack_megalz_M3
_depack_megalz_X4		DJNZ    _depack_megalz_X5
					INC     C
					JR      NZ,_depack_megalz_M4
					LD      BC,&51F
					JR      _depack_megalz_M1
_depack_megalz_X5
					DJNZ    _depack_megalz_X6
					LD      B,C
_depack_megalz_M4		LD      C,(HL)
					INC     HL
_depack_megalz_M3		DEC     B
					PUSH    HL
					LD      L,C
					LD      H,B
					ADD     HL,DE
					LD      C,A
					LD      B,0
					LDIR
					POP     HL
					JR      _depack_megalz_M0

