home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 4: The Falcon Archive / nf_archive_four_v1.0.iso / ARCHIVE / DEMOS / LAZER / LAZEROS.ZIP / LAZEROS / MAIN / PACKFIRE / FIREUNP2.S < prev    next >
Text File  |  1987-04-22  |  6KB  |  228 lines

  1. ;********************************************* Unpackroutine von FIRE-PACK
  2. ; Eingabe: a0 = Adresse gepackter Daten
  3.  
  4. fire_decrunch_2:
  5.     link    a3,#-120
  6.     movem.l    d0-a6,-(sp)
  7.     lea    120(a0),a4    ; a4 = Anfang entpackte Daten
  8.     move.l    a4,a6        ; a6 = Ende entpackte Daten
  9.     bsr.s    .getinfo
  10.     cmpi.l    #'FIRE',d0    ; Kennung gefunden?
  11.     bne    .not_packed
  12.     bsr.s    .getinfo        ; gepackte Länge holen
  13.     lea.l    -8(a0,d0.l),a5    ; a5 = Ende der gepackten Daten
  14.     bsr.s    .getinfo        ; ungepackte Länge holen (original)
  15.     move.l    d0,(sp)        ; Originallänge: später nach d0
  16.     adda.l    d0,a6        ; a6 = Ende entpackte Daten
  17.     move.l    a6,a1
  18.     moveq    #119,d0        ; 120 Bytes hinter entpackten Daten
  19. .save:    move.b    -(a1),-(a3)    ; in sicheren Bereich sichern
  20.     dbf    d0,.save
  21.     move.l    a6,a3        ; merken für später
  22.  
  23.     move.b    -(a5),d7        ; erstes Informationsbyte
  24.     lea    .tabellen(pc),a2    ; a2 = Zeiger auf Datenbereich
  25.     moveq    #1,d6
  26.     swap    d6        ; d6 = $10000
  27.     moveq    #0,d5        ; d5 = 0 (oberes Wort: immer 0!)
  28.  
  29. .normal_bytes:
  30.     bsr.s    .get_1_bit
  31.     bcc.s    .test_if_end    ; Bit %0: keine Daten
  32.     moveq    #0,d1        ; falls zu .copy_direkt
  33.     bsr.s    .get_1_bit
  34.     bcc.s    .copy_direkt     ; Bitfolge: %10: 1 Byte direkt kop.
  35. ;    lea.l    .direkt_tab+16-.tabellen(a2),a0 ; ...siehe nächste Zeile
  36.     move.l    a2,a0
  37.     moveq    #3,d3
  38. .nextgb:    move.l    -(a0),d0        ; d0.w Bytes lesen
  39.     bsr.s    .get_d0_bits
  40.     swap    d0
  41.     cmp.w    d0,d1        ; alle gelesenen Bits gesetzt?
  42.     dbne    d3,.nextgb    ; ja: dann weiter Bits lesen
  43. .no_more: add.l    16(a0),d1     ; Anzahl der zu übertragenen Bytes
  44. .copy_direkt:
  45.     move.b    -(a5),-(a6)    ; Daten direkt kopieren
  46.     dbf    d1,.copy_direkt    ; noch ein Byte
  47. .test_if_end:
  48.     cmp.l    a4,a6        ; Fertig?
  49.     bgt.s    .strings        ; Weiter wenn Ende nicht erreicht
  50.  
  51.     movem.l    (sp),d0-a2/a5    ; hole nötige Register
  52. .move    move.b    (a4)+,(a0)+
  53.     subq.l    #1,d0
  54.     bne.s    .move
  55.     moveq    #119,d0        ; um überschriebenen Bereich
  56. .rest    move.b    -(a5),-(a3)    ; wieder herzustellen
  57.     dbf    d0,.rest
  58. .not_packed:
  59.     movem.l    (sp)+,d0-a6
  60.     unlk    a3
  61.     rts
  62.  
  63. ;************************** Unterroutinen: wegen Optimierung nicht am Schluß
  64. .getinfo:
  65.     moveq    #3,d1
  66. .glw:    rol.l    #8,d0
  67.     move.b    (a0)+,d0
  68.     dbf    d1,.glw
  69.     rts
  70.  
  71.  
  72. .get_1_bit:
  73.     add.b    d7,d7        ; hole ein Bit
  74.     beq.s    .no_bit_found
  75.     rts
  76. .no_bit_found:
  77.     move.b    -(a5),d7
  78.     addx.b    d7,d7
  79.     rts
  80.  
  81. .get_d0_bits:
  82.     moveq    #0,d1        ; ergebnisfeld vorbereiten
  83. .hole_bit_loop:
  84.     add.b    d7,d7        ; hole ein Bit
  85.     beq.s    .not_found    ; quellfeld leer
  86. .on_d0:    addx.w    d1,d1        ; und übernimm es
  87.     dbf    d0,.hole_bit_loop    ; bis alle Bits geholt wurden
  88.     rts
  89.  
  90. .not_found:
  91.     move.b    -(a5),d7        ; hole sonst ein weiters longword
  92.     addx.b    d7,d7        ; hole ein Bit
  93.     bra.s    .on_d0
  94.  
  95. ;************************************ Ende der Unterroutinen
  96.  
  97.  
  98. .strings:
  99.     moveq    #1,d0        ; 2 Bits lesen
  100.     bsr.s    .get_d0_bits
  101.     subq.w    #1,d1
  102.     bmi.s    .gleich_morestring    ; %00
  103.     beq.s    .length_2     ; %01
  104.     subq.w    #1,d1
  105.     beq.s    .length_3     ; %10
  106.     bsr.s    .get_1_bit
  107.     bcc.s    .bitset        ; %110
  108.     bsr.s    .get_1_bit
  109.     bcc.s    .length_4     ; %1110
  110.     bra.s    .length_5     ; %1111
  111.  
  112. .get_short_offset:
  113.     moveq    #1,d0
  114.     bsr.s    .get_d0_bits    ; d1:  0,  1,  2,  3
  115.     subq.w    #1,d1
  116.     bpl.s    .contoffs
  117.     moveq    #0,d0        ; Sonderfall
  118.     rts
  119.  
  120. .get_long_offset:
  121.     moveq    #1,d0        ; 2 Bits lesen
  122.     bsr.s    .get_d0_bits    ; d1:  0,  1,  2,  3
  123. .contoffs add.w    d1,d1        ; d1:  0,  2,  4,  6
  124.     add.w    d1,d1        ; d1:  0,  4,  8, 12
  125.     movem.w    .offset_table-.tabellen(a2,d1),d0/d5
  126.     bsr.s    .get_d0_bits    ; 4, 8, 12 oder 16 Bits lesen
  127.     add.l    d5,d1
  128.     rts
  129.  
  130.  
  131. .gleich_morestring:         ; %00
  132.     moveq    #1,d0        ; 2 Bits lesen
  133.     bsr.s    .get_d0_bits    ; d1:  0,  1,  2,  3
  134.     subq.w    #1,d1
  135.     bmi.s    .gleich_string    ; %0000
  136.  
  137.     add.w    d1,d1        ; d1:     0,  2,  4
  138.     add.w    d1,d1        ; d1:     0,  4,  8
  139.     movem.w    .more_table-.tabellen(a2,d1),d0/d2
  140.     bsr.s    .get_d0_bits
  141.     add.w    d1,d2        ; d2 = Stringlänge
  142.     bsr.s    .get_long_offset
  143.     move.w    d2,d0        ; d0 = Stringlänge
  144.     bra.s    .copy_longstring
  145.  
  146. .bitset:    moveq    #2,d0        ; %110
  147.     bsr.s    .get_d0_bits
  148.     moveq    #0,d0
  149.     bset    d1,d0
  150.     bra.s    .put_d0
  151.  
  152. .length_2:
  153.     moveq    #7,d0        ; %01
  154.     bsr.s    .get_d0_bits
  155.     moveq    #2-2,d0
  156.     bra.s    .copy_string
  157.  
  158. .length_3:
  159.     bsr.s    .get_short_offset    ; %10
  160.     tst.w    d0
  161.     beq    .put_d0        ; 0 ablegen
  162.     moveq    #3-2,d0
  163.     bra.s    .copy_string
  164.  
  165. .length_4:
  166.     bsr.s    .get_short_offset    ; %1110
  167.     tst.w    d0
  168.     beq.s    .vorgänger_kopieren
  169.     moveq    #4-2,d0
  170.     bra.s    .copy_string
  171.  
  172. .length_5:
  173.     bsr.s    .get_short_offset    ; %1111
  174.     tst.w    d0
  175.     beq.s    .put_ff
  176.     moveq    #5-2,d0
  177.     bra.s    .copy_string
  178.  
  179.  
  180. .put_ff:    moveq    #-1,d0
  181.     bra.s    .put_d0
  182.  
  183. .vorgänger_kopieren:
  184.     move.b    (a6),d0
  185. ;    bra.s    .put_d0
  186.  
  187. .put_d0:    move.b    d0,-(a6)
  188.     bra.s    .backmain
  189.  
  190.  
  191. .gleich_string:
  192.     bsr.s    .get_long_offset    ; Anzahl gleicher Bytes lesen
  193.     beq.s    .backmain     ; 0: zurück
  194.     move.b    (a6),d0
  195. .copy_gl: move.b    d0,-(a6)
  196.     dbf    d1,.copy_gl
  197.     sub.l    d6,d1
  198.     bmi.s    .backmain
  199.     bra.s    .copy_gl
  200.  
  201. .copy_longstring:
  202.     subq.w    #2,d0        ; Stringlänge - 2 (wegen dbf)
  203. .copy_string:            ; d1 = Offset, d0 = Anzahl Bytes -2
  204.     lea.l    2(a6,d1.l),a0    ; Hier stehen die Originaldaten
  205.     add.w    d0,a0        ; dazu die Stringlänge-2
  206.     move.b    -(a0),-(a6)    ; ein Byte auf jeden Fall kopieren
  207. .dep_b:    move.b    -(a0),-(a6)    ; mehr Bytes kopieren
  208.     dbf    d0,.dep_b     ; und noch ein Mal
  209. .backmain bra    .normal_bytes    ; Jetzt kommen wieder normale Bytes
  210.  
  211.  
  212. .direkt_tab:
  213.     dc.l    $03ff0009,$00070002,$00030001,$00030001 ; Anzahl 1-Bits
  214. .tabellen:dc.l        15-1,      8-1,      5-1,      2-1    ; Anz. Bytes
  215.  
  216. .offset_table:
  217.     dc.w     3,          0
  218.     dc.w     7,       16+0
  219.     dc.w    11,      256+16+0
  220.     dc.w    15, 4096+256+16+0
  221. .more_table:
  222.     dc.w    3,       5
  223.     dc.w    5,    16+5
  224.     dc.w    7, 64+16+5
  225.  
  226. ende_fire_decrunch_2:
  227. ;*************************************************** Ende der Unpackroutine
  228.