-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmegalz_dec40.asm
116 lines (110 loc) · 2.59 KB
/
megalz_dec40.asm
1
;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 LDIM0 LD BC,#2FFM1 EX AF,AF'M1X ADD A,A JR NZ,M2 LD A,(HL) INC HL RLAM2 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 M1X2 DJNZ X3 SRL C JR C,MS INC B JR M1X6 ADD A,CN2 LD BC,#4FF JR M1N1 INC C JR NZ,M4 EX AF,AF' INC BN5 RR C RET C RL B ADD A,A JR NZ,N6 LD A,(HL) INC HL RLAN6 JR NC,N5 EX AF,AF' ADD A,B LD B,6 JR M1X3 DJNZ X4 LD A,1 JR M3X4 DJNZ X5 INC C JR NZ,M4 LD BC,#51F JR M1X5 DJNZ X6 LD B,CM4 LD C,(HL) INC HLM3 DEC B PUSH HL LD L,C LD H,B ADD HL,DE LD C,A LD B,0 LDIR POP HL JR M0END_DEC40