home *** CD-ROM | disk | FTP | other *** search
/ ST-Computer Leser 2002 January / STC_CD_01_2002.iso / SCENE / IMATROLL / SRC / SYS / LOADER.S < prev    next >
Text File  |  2001-11-28  |  5KB  |  227 lines

  1. ; Falcon demosystem
  2. ;
  3. ; January 13, 2000
  4. ;
  5. ; Anders Eriksson
  6. ; ae@dhs.nu
  7. ;
  8. ; loader.s
  9.  
  10. ; in:   filename.l = address to filename (null term)
  11. ;     filebuffer.l = destination address
  12.  
  13.  
  14.         even
  15.  
  16. ; --------------------------------------------------------------
  17.         section    text
  18. ; --------------------------------------------------------------
  19.  
  20. loader:        move.w    #0,-(sp)                ;fsfirst() get fileinfo
  21.         move.l    filename,-(sp)                ;
  22.         move.w    #$4e,-(sp)                ;
  23.         trap    #1                    ;
  24.         addq.l    #8,sp                    ;
  25.  
  26.         tst.l    d0                    ;
  27.         beq.s    .ok                    ;ok
  28.         move.l    #exit_filenotfound_text,error_adr    ;error message
  29.         bra.w    exit                    ;
  30.  
  31. .ok:        move.l    dta+26,filelength            ;filelength
  32.  
  33.         move.w    #0,-(sp)                ;open file read only
  34.         move.l    filename,-(sp)                ;address to filename
  35.         move.w    #$3d,-(sp)                ;
  36.         trap    #1                    ;
  37.         addq.l    #8,sp                    ;
  38.         move.w    d0,filenumber                ;store filenumber
  39.  
  40.         move.l    filebuffer,-(sp)            ;buffer address
  41.         move.l    filelength,-(sp)            ;length of file
  42.         move.w    filenumber,-(sp)            ;filenumber
  43.         move.w    #$3f,-(sp)                ;
  44.         trap    #1                    ;
  45.         lea.l    12(sp),sp                ;
  46.  
  47.         move.w    filenumber,-(sp)            ;filenumber for closing
  48.         move.w    #$3e,-(sp)                ;
  49.         trap    #1                    ;
  50.         addq.l    #4,sp                    ;
  51.  
  52.         move.l    filebuffer,a0                ;ice depack (autodetect)
  53.         jsr    ice_decrunch_2                ;
  54.  
  55.         clr.l    filename
  56.  
  57.         rts
  58.  
  59. ;********************************************* Unpacking routine of PACK-ICE
  60. ; a0 = AdTRESs of packed data
  61. ; "bsr" or "jsr" to ice_decrunch_2 with register a0 prepared.
  62. ice_decrunch_2
  63.     link    a3,#-120
  64.     movem.L    d0-a6,-(sp)
  65.     lea    120(a0),a4
  66.     move.L    a4,a6
  67.     bsr    .getinfo
  68.     cmpi.L    #'ICE!',d0
  69.     bne.S    .not_packed
  70.     bsr.s    .getinfo
  71.     lea.L    -8(a0,d0.L),a5
  72.     bsr.s    .getinfo
  73.     move.L    d0,(sp)
  74.     adda.L    d0,a6
  75.     move.L    a6,a1
  76.     moveq    #119,d0
  77. .save    move.B    -(a1),-(a3)
  78.     dbf    d0,.save
  79.     move.L    a6,a3
  80.     move.B    -(a5),d7
  81.     bsr.s    .normal_bytes
  82.     move.L    a3,a5
  83.     bsr    .get_1_bit
  84.     bcc.s    .no_picture
  85.     move.W    #$0f9f,d7
  86.     bsr    .get_1_bit
  87.     bcc.s    .ice_00
  88.     moveq    #15,d0
  89.     bsr    .get_d0_bits
  90.     move.W    d1,d7
  91. .ice_00    moveq    #3,d6
  92. .ice_01    move.W    -(a3),d4
  93.     moveq    #3,d5
  94. .ice_02    add.W    d4,d4
  95.     addx.W    d0,d0
  96.     add.W    d4,d4
  97.     addx.W    d1,d1
  98.     add.W    d4,d4
  99.     addx.W    d2,d2
  100.     add.W    d4,d4
  101.     addx.W    d3,d3
  102.     dbra    d5,.ice_02
  103.     dbra    d6,.ice_01
  104.     movem.W    d0-d3,(a3)
  105.     dbra    d7,.ice_00
  106. .no_picture
  107.     movem.L    (sp),d0-a3
  108.  
  109. .move    move.B    (a4)+,(a0)+
  110.     subq.L    #1,d0
  111.     bne.s    .move
  112.     moveq    #119,d0
  113. .TRESt    move.B    -(a3),-(a5)
  114.     dbf    d0,.TRESt
  115. .not_packed    movem.L    (sp)+,d0-a6
  116.     unlk    a3
  117.     rts
  118. .getinfo    moveq    #3,d1
  119. .getbytes    lsl.L    #8,d0
  120.     move.B    (a0)+,d0
  121.     dbf    d1,.getbytes
  122.     rts
  123. .normal_bytes    
  124.     bsr.s    .get_1_bit
  125.     bcc.s    .test_if_end
  126.     moveq.L    #0,d1
  127.     bsr.s    .get_1_bit
  128.     bcc.s    .copy_direkt
  129.     lea.L    .direkt_tab+20(pc),a1
  130.     moveq.L    #4,d3
  131. .nextgb    move.L    -(a1),d0
  132.     bsr.s    .get_d0_bits
  133.     swap.W    d0
  134.     cmp.W    d0,d1
  135.     dbne    d3,.nextgb
  136. .no_more add.L    20(a1),d1
  137. .copy_direkt    move.B    -(a5),-(a6)
  138.     dbf    d1,.copy_direkt
  139. .test_if_end    cmpa.L    a4,a6
  140.     bgt.s    .strings
  141.     rts    
  142. .get_1_bit    add.B    d7,d7
  143.     bne.s    .Bitfound
  144.     move.B    -(a5),d7
  145.     addx.B    d7,d7
  146. .Bitfound    rts    
  147. .get_d0_bits    
  148.     moveq.L    #0,d1
  149. .hole_bit_loop    
  150.     add.B    d7,d7
  151.     bne.s    .on_d0
  152.     move.B    -(a5),d7
  153.     addx.B    d7,d7
  154. .on_d0    addx.W    d1,d1
  155.     dbf    d0,.hole_bit_loop
  156.     rts    
  157. .strings    lea.L    .Length_tab(pc),a1
  158.     moveq.L    #3,d2
  159. .get_length_bit    
  160.     bsr.s    .get_1_bit
  161.     dbcc    d2,.get_length_bit
  162. .no_length_bit    
  163.     moveq.L    #0,d4
  164.     moveq.L    #0,d1
  165.     move.B    1(a1,d2.W),d0
  166.     ext.W    d0
  167.     bmi.s    .no_über
  168. .get_über    bsr.s    .get_d0_bits
  169. .no_über    move.B    6(a1,d2.W),d4
  170.     add.W    d1,d4
  171.     beq.s    .get_offset_2
  172.     lea.L    .more_offset(pc),a1
  173.     moveq.L    #1,d2
  174. .getoffs    bsr.s    .get_1_bit
  175.     dbcc    d2,.getoffs
  176.     moveq.L    #0,d1
  177.     move.B    1(a1,d2.W),d0
  178.     ext.W    d0
  179.     bsr.s    .get_d0_bits
  180.     add.W    d2,d2
  181.     add.W    6(a1,d2.W),d1
  182.     bpl.s    .depack_bytes
  183.     sub.W    d4,d1
  184.     bra.s    .depack_bytes
  185. .get_offset_2    
  186.     moveq.L    #0,d1
  187.     moveq.L    #5,d0
  188.     moveq.L    #-1,d2
  189.     bsr.s    .get_1_bit
  190.     bcc.s    .Less_40
  191.     moveq.L    #8,d0
  192.     moveq.L    #$3f,d2
  193. .Less_40 bsr.s    .get_d0_bits
  194.     add.W    d2,d1
  195. .depack_bytes
  196.     lea.L    2(a6,d4.W),a1
  197.     adda.W    d1,a1
  198.     move.B    -(a1),-(a6)
  199. .dep_b    move.B    -(a1),-(a6)
  200.     dbf    d4,.dep_b
  201.     bra    .normal_bytes
  202. .direkt_tab    dc.L    $7fff000e,$00ff0007,$00070002,$00030001,$00030001
  203.     dc.L     270-1,    15-1,     8-1,     5-1,     2-1
  204. .Length_tab    dc.B    9,1,0,-1,-1
  205.     dc.B    8,4,2,1,0
  206. .more_offset    dc.B      11,   4,   7,  0    ; Bits lesen
  207.     dc.W    $11f,  -1, $1f    ; Standard Offset
  208. ende_ice_decrunch_2
  209.  
  210.  
  211. ; --------------------------------------------------------------
  212.         section    bss
  213. ; --------------------------------------------------------------
  214.  
  215.         even
  216.  
  217. filenumber:    ds.w    1
  218. filename:    ds.l    1
  219. filelength:    ds.l    1
  220. filebuffer:    ds.l    1
  221.  
  222.         even
  223.  
  224. ; --------------------------------------------------------------
  225.         section    text
  226. ; --------------------------------------------------------------
  227.