?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

  1.         module ZX0
  2. ; -----------------------------------------------------------------------------
  3. ; ZX0 decoder by Einar Saukas
  4. ; "Standard" version (69 bytes only)
  5. ; -----------------------------------------------------------------------------
  6. ; Parameters:
  7. ;   HL: source address (compressed data)
  8. ;   DE: destination address (decompressing)
  9. ; -----------------------------------------------------------------------------
  10.  
  11. dzx0_standard:
  12.         ld      bc, $ffff               ; preserve default offset 1
  13.         push    bc
  14.         inc     bc
  15.         ld      a, $80
  16. dzx0s_literals:
  17.         call    dzx0s_elias             ; obtain length
  18.         ldir                            ; copy literals
  19.         add     a, a                    ; copy from last offset or new offset?
  20.         jr      c, dzx0s_new_offset
  21.         call    dzx0s_elias             ; obtain length
  22. dzx0s_copy:
  23.         ex      (sp), hl                ; preserve source, restore offset
  24.         push    hl                      ; preserve offset
  25.         add     hl, de                  ; calculate destination - offset
  26.         ldir                            ; copy from offset
  27.         pop     hl                      ; restore offset
  28.         ex      (sp), hl                ; preserve offset, restore source
  29.         add     a, a                    ; copy from literals or new offset?
  30.         jr      nc, dzx0s_literals
  31. dzx0s_new_offset:
  32.         call    dzx0s_elias             ; obtain offset MSB
  33.         ex      af, af'
  34.        pop     af                      ; discard last offset
  35.        xor     a                       ; adjust for negative offset
  36.        sub     c
  37.        ret     z                       ; check end marker
  38.        ld      b, a
  39.        ex      af, af'
  40.         ld      c, (hl)                 ; obtain offset LSB
  41.         inc     hl
  42.         rr      b                       ; last offset bit becomes first length bit
  43.         rr      c
  44.         push    bc                      ; preserve new offset
  45.         ld      bc, 1                   ; obtain length
  46.         call    nc, dzx0s_elias_backtrack
  47.         inc     bc
  48.         jr      dzx0s_copy
  49. dzx0s_elias:
  50.         inc     c                       ; interlaced Elias gamma coding
  51. dzx0s_elias_loop:
  52.         add     a, a
  53.         jr      nz, dzx0s_elias_skip
  54.         ld      a, (hl)                 ; load another group of 8 bits
  55.         inc     hl
  56.         rla
  57. dzx0s_elias_skip:
  58.         ret     c
  59. dzx0s_elias_backtrack:
  60.         add     a, a
  61.         rl      c
  62.         rl      b
  63.         jr      dzx0s_elias_loop
  64.  
  65.  
  66.         endmodule
  67.