; pletter v0.5c msx unpacker

; call unpack with hl pointing to some pletter5 data, and de pointing to the destination.
; changes all registers

; define lengthindata when the original size is written in the pletter data

;  define LENGTHINDATA

  module pletter

  macro GETBIT
  add a,a
  call z,getbit
  endmacro

  macro GETBITEXX
  add a,a
  call z,getbitexx
  endmacro

@unpack

  ifdef LENGTHINDATA
  inc hl
  inc hl
  endif

  ld a,(hl)
  inc hl
  exx
  ld de,0
  add a,a
  inc a
  rl e
  add a,a
  rl e
  add a,a
  rl e
  rl e
  ld hl,modes
  add hl,de
  ld e,(hl)
  ld ixl,e
  inc hl
  ld e,(hl)
  ld ixh,e
  ld e,1
  exx
  ld iy,loop
literal
  ldi
loop
  GETBIT
  jr nc,literal
  exx
  ld h,d
  ld l,e
getlen
  GETBITEXX
  jr nc,.lenok
.lus
  GETBITEXX
  adc hl,hl
  ret c
  GETBITEXX
  jr nc,.lenok
  GETBITEXX
  adc hl,hl
  ret c
  GETBITEXX
  jp c,.lus
.lenok
  inc hl
  exx
  ld c,(hl)
  inc hl
  ld b,0
  bit 7,c
  jp z,offsok
  jp ix

mode6
  GETBIT
  rl b
mode5
  GETBIT
  rl b
mode4
  GETBIT
  rl b
mode3
  GETBIT
  rl b
mode2
  GETBIT
  rl b
  GETBIT
  jr nc,offsok
  or a
  inc b
  res 7,c
offsok
  inc bc
  push hl
  exx
  push hl
  exx
  ld l,e
  ld h,d
  sbc hl,bc
  pop bc
  ldir
  pop hl
  jp iy

getbit
  ld a,(hl)
  inc hl
  rla
  ret

getbitexx
  exx
  ld a,(hl)
  inc hl
  exx
  rla
  ret

modes
  word offsok
  word mode2
  word mode3
  word mode4
  word mode5
  word mode6

  endmodule

;eof
