Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 507 | savelij | 1 | ;Z80 depacker for megalz V4 packed files (C) fyrex^mhm |
| 2 | |||
| 3 | ; DESCRIPTION: |
||
| 4 | ; |
||
| 5 | ; Depacker is fully relocatable, not self-modifying, |
||
| 6 | ;it's length is 110 bytes starting from DEC40. |
||
| 7 | ;Register usage: AF,AF',BC,DE,HL. Must be CALL'ed, return is done by RET. |
||
| 8 | ;Provide extra stack location for store 2 bytes (1 word). Depacker does not |
||
| 9 | ;disable or enable interrupts, as well as could be interrupted at any time |
||
| 10 | ;(no f*cking wicked stack usage :). |
||
| 11 | |||
| 12 | ; USAGE: |
||
| 13 | ; |
||
| 14 | ; - put depacker anywhere you want, |
||
| 15 | ; - put starting address of packed block in HL, |
||
| 16 | ; - put location where you want data to be depacked in DE, |
||
| 17 | ; (much like LDIR command, but without BC) |
||
| 18 | ; - make CALL to depacker (DEC40). |
||
| 19 | ; - enjoy! ;) |
||
| 20 | |||
| 21 | ; PRECAUTIONS: |
||
| 22 | ; |
||
| 23 | ; Be very careful if packed and depacked blocks coincide somewhere in memory. |
||
| 24 | ;Here are some advices: |
||
| 25 | ; |
||
| 26 | ; 1. put packed block to the highest addresses possible. |
||
| 27 | ; Best if last byte of packed block has address #FFFF. |
||
| 28 | ; |
||
| 29 | ; 2. Leave some gap between ends of packed and depacked block. |
||
| 30 | ; For example, last byte of depacked block at #FF00, |
||
| 31 | ; last byte of packed block at #FFFF. |
||
| 32 | ; |
||
| 33 | ; 3. Place nonpackable data to the end of block. |
||
| 34 | ; |
||
| 35 | ; 4. Always check whether depacking occurs OK and neither corrupts depacked data |
||
| 36 | ; nor hangs computer. |
||
| 37 | ; |
||
| 38 | |||
| 39 | DEC40 |
||
| 40 | LD A,0X80 |
||
| 41 | EX AF,AF' |
||
| 42 | MS LDI |
||
| 43 | M0 LD BC,0X2FF |
||
| 44 | M1 EX AF,AF' |
||
| 45 | M1X ADD A,A |
||
| 46 | JR NZ,M2 |
||
| 47 | LD A,(HL) |
||
| 48 | INC HL |
||
| 49 | RLA |
||
| 50 | M2 RL C |
||
| 51 | JR NC,M1X |
||
| 52 | EX AF,AF' |
||
| 53 | DJNZ X2 |
||
| 54 | LD A,2 |
||
| 55 | SRA C |
||
| 56 | JR C,N1 |
||
| 57 | INC A |
||
| 58 | INC C |
||
| 59 | JR Z,N2 |
||
| 60 | LD BC,0X33F |
||
| 61 | JR M1 |
||
| 62 | |||
| 63 | X2 DJNZ X3 |
||
| 64 | SRL C |
||
| 65 | JR C,MS |
||
| 66 | INC B |
||
| 67 | JR M1 |
||
| 68 | X6 |
||
| 69 | ADD A,C |
||
| 70 | N2 |
||
| 71 | LD BC,0X4FF |
||
| 72 | JR M1 |
||
| 73 | N1 |
||
| 74 | INC C |
||
| 75 | JR NZ,M4 |
||
| 76 | EX AF,AF' |
||
| 77 | INC B |
||
| 78 | N5 RR C |
||
| 79 | RET C |
||
| 80 | RL B |
||
| 81 | ADD A,A |
||
| 82 | JR NZ,N6 |
||
| 83 | LD A,(HL) |
||
| 84 | INC HL |
||
| 85 | RLA |
||
| 86 | N6 JR NC,N5 |
||
| 87 | EX AF,AF' |
||
| 88 | ADD A,B |
||
| 89 | LD B,6 |
||
| 90 | JR M1 |
||
| 91 | X3 |
||
| 92 | DJNZ X4 |
||
| 93 | LD A,1 |
||
| 94 | JR M3 |
||
| 95 | X4 DJNZ X5 |
||
| 96 | INC C |
||
| 97 | JR NZ,M4 |
||
| 98 | LD BC,0X51F |
||
| 99 | JR M1 |
||
| 100 | X5 |
||
| 101 | DJNZ X6 |
||
| 102 | LD B,C |
||
| 103 | M4 LD C,(HL) |
||
| 104 | INC HL |
||
| 105 | M3 DEC B |
||
| 106 | PUSH HL |
||
| 107 | LD L,C |
||
| 108 | LD H,B |
||
| 109 | ADD HL,DE |
||
| 110 | LD C,A |
||
| 111 | LD B,0 |
||
| 112 | LDIR |
||
| 113 | POP HL |
||
| 114 | JR M0 |
||
| 115 | END_DEC40 |
||
| 116 |