;; Aplib decrunching routine
;; (c) CNGSOFT
;
;; Maxam source by T&J/GPA -  01/18/2008
;; Nothing changed, except thy damned hidden opcodes
;; and a new variable for Maxam ( 13+8*0 = 0 for Maxam )

ORG &A000
NOLIST
WRITE "APLIB.BIN"

;; Attention, cette routine contient un assemblage conditionnel.
;; Si Aplib8flag = 0, le code decompacte est ecrite du bas de la
;; memoire vers le haut de la memoire. C est ce que font par defaut
;; les programmes modifies par Dadman/CEZ - Team (APPACK.EXE et
;; aPPackWin.exe.

;; Si Aplib8flag = 1, le code decompacte est ecrit du haut de la
;; memoire vers le bas de la memoire. Le code compacte doit bien
;; evidemment etre organise en consequence.


aplib8flag equ &0  ; = DEC  &00 pour INC

flagdecde equ aplib8flag*8 ; for Maxam compatibility


;; En entree, on a :
;; HL = implantation du code compacte
;; DE = implantation du code decompacte

Start   DI
        LD HL,&4000
        LD DE,&C000

        CALL boot
        JP &000F

Boot
 PUSH HL ; used for EX HL,(SP)
 PUSH HL
  POP IX
 DB &FD,&26,&80 ; LD IYh,&80

aplib8literal

 LD A,(IX+ &00)

 DB &DD,&23 + flagdecde ; INC IX/DEC IX

 LD (DE),A

 DB &13 + flagdecde ; INC DE/DEC DE
 DB &FD,&2E,&02       ; LD IYl,&2

aplib8nexttag

 CALL aplib8getbit
  JR NC, aplib8literal
 LD BC,&0000
 CALL aplib8getbit
 JR NC, aplib8codepair
 LD H,B
 CALL aplib8getbit
 JR NC, aplib8shortmatch
 DB &FD,&2E,&02      ; LD IYl,2
 INC C ; bc
 LD L,&10

aplib8getmorebits

 CALL aplib8getbit
 RL L
 JR NC, aplib8getmorebits
 JR NZ, aplib8domatch
  LD A,L
 LD (DE),A
 DB &13+ flagdecde ; INC DE/DEC DE
 JR aplib8nexttag

aplib8codepair

 CALL aplib8getgamma
  DB &FD,&4D  ; LD C,IYl
 SBC HL,BC
  JR NZ, aplib8normalcodepair
 CALL aplib8getgamma
  LD B,H
 JR aplib8domatch_lastpos

aplib8normalcodepair

 DEC L
 LD H,L
  LD L,(IX + &00)
 DB &DD,&23+ flagdecde ; INC IX/DEC IX
  PUSH HL
 CALL aplib8getgamma
 LD B,H
  POP HL
 LD A,H
 CP 125 ; cmp eax,32000
  JR NC, aplib8domatch_with_2inc
 CP &05
  JR NC, aplib8domatch_with_inc
 AND A
  JR NZ, aplib8domatch_new_lastpos
 LD A,L
  ADD A
 JR C, aplib8domatch_new_lastpos

aplib8domatch_with_2inc

 INC BC

aplib8domatch_with_inc

 INC BC
aplib8domatch_new_lastpos

 EX (SP),HL

aplib8domatch_lastpos

 POP HL
 PUSH HL
  DB &FD,&2E,&01  ; LD IYl,1

aplib8domatch

if aplib8flag ; LDIR/LDDR

  ADD HL,DE
   LDDR
else
 AND A
  EX DE,HL
   SBC HL,DE
   EX DE,HL
   ADD HL,DE
 EX DE,HL
  LDIR
endif
 JR aplib8nexttag

aplib8shortmatch

 LD L,(IX+&00)
 DB &DD,&23+ flagdecde ; INC IX/DEC IX
  SRL L
 JR Z, aplib8donedepacking
  RL C
 JR aplib8domatch_with_2inc

aplib8getbit

 DB &FD,&7C ; LD A,IYh
 ADD A
  JR NZ,aplib8getbit_
  LD A,(IX + &00)
 DB &DD,&23+ flagdecde ; INC IX/DEC IX
  ADC A

aplib8getbit_

 DB &FD,&67 ; LD  IYh,A
 RET

aplib8getgamma

 LD HL,&0001

aplib8getgamma_
 CALL aplib8getbit
 ADC HL,HL
  CALL aplib8getbit
 JR C, aplib8getgamma_
  LD C,L
 RET

aplib8donedepacking

 POP HL ; used for EX HL,(SP)
 PUSH IX
  POP HL
 RET ; Warning, A might not be 0!