;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.
 
;
 
 
 
DEC40
 
        LD      A,#80
 
        EX      AF,AF'
 
MS      LDI
 
M0      LD      BC,#2FF
 
M1      EX      AF,AF'
 
M1X     ADD     A,A
 
        JR      NZ,M2
 
        LD      A,(HL)
 
        INC     HL
 
        RLA
 
M2      RL      C
 
        JR      NC,M1X
 
        EX      AF,AF'
 
        DJNZ    X2
 
        LD      A,2
 
        SRA     C
 
        JR      C,N1
 
        INC     A
 
        INC     C
 
        JR      Z,N2
 
        LD      BC,#33F
 
        JR      M1
 
 
 
X2      DJNZ    X3
 
        SRL     C
 
        JR      C,MS
 
        INC     B
 
        JR      M1
 
X6
 
        ADD     A,C
 
N2
 
        LD      BC,#4FF
 
        JR      M1
 
N1
 
        INC     C
 
        JR      NZ,M4
 
        EX      AF,AF'
 
        INC     B
 
N5      RR      C
 
        RET     C
 
        RL      B
 
        ADD     A,A
 
        JR      NZ,N6
 
        LD      A,(HL)
 
        INC     HL
 
        RLA
 
N6      JR      NC,N5
 
        EX      AF,AF'
 
        ADD     A,B
 
        LD      B,6
 
        JR      M1
 
X3
 
        DJNZ    X4
 
        LD      A,1
 
        JR      M3
 
X4      DJNZ    X5
 
        INC     C
 
        JR      NZ,M4
 
        LD      BC,#51F
 
        JR      M1
 
X5
 
        DJNZ    X6
 
        LD      B,C
 
M4      LD      C,(HL)
 
        INC     HL
 
M3      DEC     B
 
        PUSH    HL
 
        LD      L,C
 
        LD      H,B
 
        ADD     HL,DE
 
        LD      C,A
 
        LD      B,0
 
        LDIR
 
        POP     HL
 
        JR      M0
 
END_DEC40