home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / xfd_developer / sources / asm / bytekillerclone.a < prev    next >
Encoding:
Text File  |  2000-06-27  |  22.5 KB  |  1,284 lines

  1. *******************************************************
  2. **     XFD external decruncher for CRUN Cruncher     **
  3. **        written by Mr. Larmer / Wanted Team        **
  4. **               fixed by SDI in 2000             **
  5. *******************************************************
  6.  
  7.         SECTION    CRUNDecrunch,CODE
  8.  
  9.         INCLUDE    "AINCLUDE:IncDirs.i"
  10.         INCLUDE    "libraries/xfdmaster.i"
  11.  
  12. ; xfdForeman structure MUST be first thing in all external decrunchers
  13.  
  14. F_CRUN        moveq    #-1,d0        ;security
  15.         rts
  16.         dc.l    XFDF_ID        ;id
  17.         dc.w    1        ;version
  18.         dc.w    0
  19.         dc.l    0,0        ;private
  20.         dc.l    S_CRUN        ;first slave
  21.  
  22.         dc.b    "$VER: ByteKillerClone 2.0 (01.05.2000) by Mr.Larmer",0
  23. N_CRUN        dc.b    "(CRUN) Data Cruncher",0
  24. N_CRND        dc.b    "(CRND) Data Cruncher",0
  25. N_FUCK        dc.b    "(FUCK) Data Cruncher",0
  26. N_Gary        dc.b    "(Gary Symons) Data Cruncher",0
  27. N_MARC        dc.b    "(MARC) Data Cruncher",0
  28. N_TXIC        dc.b    "(TXIC) Data Cruncher",0
  29. N_xVdg        dc.b    "(xVdg) Data Cruncher",0
  30. N_AMOS        dc.b    "AMOS Compiler Cruncher",0
  31. N_ARPF        dc.b    "Action Replay II (ARPF) Data Cruncher",0
  32. N_ARP3        dc.b    "Action Replay III (ARP3) Data Cruncher",0
  33. N_ACE        dc.b    "(ACE!) Data Cruncher",0
  34.         cnop    0,4
  35.  
  36. **************************************************
  37.  
  38. ; xfdSlave structure: this one doesn't support segment decrunching
  39.  
  40. S_CRUN        dc.l    S_CRND        ;more slaves
  41.         dc.w    1        ;version
  42.         dc.w    33        ;master version
  43.         dc.l    N_CRUN        ;name
  44.         dc.w    XFDPFF_DATA    ;flags
  45.         dc.w    0
  46.         dc.l    RB_CRUN        ;recog buffer
  47.         dc.l    DB_CRUN        ;decrunch buffer
  48.         dc.l    0        ;recog segment
  49.         dc.l    0        ;decrunch segment
  50.  
  51. ;-------------------------------------------------
  52.  
  53. ; Recog buffer function: receives buffer + length in a0/d0
  54.  
  55. RB_CRUN        cmp.l    #12+2,d0
  56.         ble.s    .Exit
  57.  
  58.         cmp.l    #"CRUN",(a0)
  59.         bne.s    .Exit
  60.  
  61.         moveq    #1,d0
  62.         rts
  63.  
  64. .Exit        moveq    #0,d0
  65.         rts
  66.  
  67. ;-------------------------------------------------
  68.  
  69. ;Decrunch buffer function: receives bufferinfo in a0
  70.  
  71. DB_CRUN        movem.l    d2-d7/a2-a6,-(a7)
  72.         move.l    a0,a5
  73.         move.l    xfdbi_SourceBuffer(a5),a2
  74.  
  75.         move.l    8(a2),d0
  76.  
  77.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  78.         move.l    d0,xfdbi_TargetBufLen(a5)
  79.  
  80.         move.l    xfdbi_TargetBufMemType(a5),d1
  81.         move.l    4.w,a6
  82.         jsr    -198(a6)
  83.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  84.         move.l    d0,xfdbi_TargetBuffer(a5)
  85.         beq.s    Exit
  86.  
  87.         movem.l    d1-a6,-(a7)
  88.  
  89.         move.l    d0,a1
  90.         move.l    a2,a0
  91.  
  92.         move.l    4(a0),d0
  93.         move.l    8(a0),d1
  94.         lea    12(a0),a0
  95.         movea.l    a1,a2
  96.         adda.l    d1,a2
  97.         adda.l    d0,a0
  98.         move.l    -(a0),d5
  99.         move.l    -(a0),d0
  100.  
  101.         bsr.s    D_CRUN
  102.  
  103.         movem.l    (a7)+,d1-a6
  104.  
  105.         tst.l    d0
  106.         bne.b    Error
  107.  
  108.         moveq    #1,d0
  109. Exit        movem.l    (a7)+,d2-d7/a2-a6
  110.         rts
  111.  
  112. Error
  113.         move.l    xfdbi_TargetBufLen(a5),d0
  114.         move.l    xfdbi_TargetBuffer(a5),a1
  115.         jsr    -210(a6)
  116.  
  117.         move.w    #XFDERR_CORRUPTEDDATA,xfdbi_Error(a5)
  118.         moveq    #0,d0
  119.         bra.b    Exit
  120.  
  121. **************************************************
  122.  
  123. D_CRUN
  124.         movem.l    d0-d7/a0-a6,-(sp)
  125.  
  126.         eor.l    d0,d5
  127. lbC000046:
  128.         lsr.l    #1,d0
  129.         bne.s    lbC000054
  130.         move.l    -(a0),d0
  131.         eor.l    d0,d5
  132.         move.w    #$0010,ccr
  133.         roxr.l    #1,d0
  134. lbC000054:
  135.         bcs.s    lbC0000B0
  136.         moveq    #8,d1
  137.         moveq    #1,d3
  138.         lsr.l    #1,d0
  139.         bne.s    lbC000068
  140.         move.l    -(a0),d0
  141.         eor.l    d0,d5
  142.         move.w    #$0010,ccr
  143.         roxr.l    #1,d0
  144. lbC000068:
  145.         bcs.w    lbC0000FE
  146.         moveq    #3,d1
  147.         clr.w    d4
  148. lbC000070:
  149.         subq.w    #1,d1
  150.         clr.w    d2
  151. lbC000074:
  152.         lsr.l    #1,d0
  153.         bne.s    lbC000082
  154.         move.l    -(a0),d0
  155.         eor.l    d0,d5
  156.         move.w    #$0010,ccr
  157.         roxr.l    #1,d0
  158. lbC000082:
  159.         roxl.l    #1,d2
  160.         dbra    d1,lbC000074
  161.         move.w    d2,d3
  162.         add.w    d4,d3
  163. lbC00008C:
  164.         moveq    #7,d1
  165. lbC00008E:
  166.         lsr.l    #1,d0
  167.         bne.s    lbC00009C
  168.         move.l    -(a0),d0
  169.         eor.l    d0,d5
  170.         move.w    #$0010,ccr
  171.         roxr.l    #1,d0
  172. lbC00009C:
  173.         roxl.l    #1,d2
  174.         dbra    d1,lbC00008E
  175.  
  176.         cmpa.l    a1,a2
  177.         ble.w    lbC00013A
  178.  
  179.         move.b    d2,-(a2)
  180.         dbra    d3,lbC00008C
  181.         bra.s    lbC000120
  182. lbC0000AA:
  183.         moveq    #8,d1
  184.         moveq    #8,d4
  185.         bra.s    lbC000070
  186. lbC0000B0:
  187.         moveq    #2,d1
  188.         subq.w    #1,d1
  189.         clr.w    d2
  190. lbC0000B6:
  191.         lsr.l    #1,d0
  192.         bne.s    lbC0000C4
  193.         move.l    -(a0),d0
  194.         eor.l    d0,d5
  195.         move.w    #$0010,ccr
  196.         roxr.l    #1,d0
  197. lbC0000C4:
  198.         roxl.l    #1,d2
  199.         dbra    d1,lbC0000B6
  200.         cmpi.b    #2,d2
  201.         blt.s    lbC0000F6
  202.         cmpi.b    #3,d2
  203.         beq.s    lbC0000AA
  204.         moveq    #8,d1
  205.         subq.w    #1,d1
  206.         clr.w    d2
  207. lbC0000DC:
  208.         lsr.l    #1,d0
  209.         bne.s    lbC0000EA
  210.         move.l    -(a0),d0
  211.         eor.l    d0,d5
  212.         move.w    #$0010,ccr
  213.         roxr.l    #1,d0
  214. lbC0000EA:
  215.         roxl.l    #1,d2
  216.         dbra    d1,lbC0000DC
  217.         move.w    d2,d3
  218.         moveq    #12,d1
  219.         bra.s    lbC0000FE
  220. lbC0000F6:
  221.         moveq    #9,d1
  222.         add.w    d2,d1
  223.         addq.w    #2,d2
  224.         move.w    d2,d3
  225. lbC0000FE:
  226.         subq.w    #1,d1
  227.         clr.w    d2
  228. lbC000102:
  229.         lsr.l    #1,d0
  230.         bne.s    lbC000110
  231.         move.l    -(a0),d0
  232.         eor.l    d0,d5
  233.         move.w    #$0010,ccr
  234.         roxr.l    #1,d0
  235. lbC000110:
  236.         roxl.l    #1,d2
  237.         dbra    d1,lbC000102
  238. lbC000116:
  239.         subq.w    #1,a2            ;nop
  240.  
  241.         cmpa.l    a1,a2
  242.         blt.s    lbC00013A
  243.  
  244.         move.b    0(a2,d2.w),(a2)        ;move.b -1(A2,D2.W),-(A2)
  245.         dbra    d3,lbC000116
  246. lbC000120:
  247.         cmpa.l    a2,a1
  248.         blt.w    lbC000046
  249.         tst.l    d5
  250.         bne.s    lbC00013A
  251.         movem.l    (sp)+,d0-d7/a0-a6
  252.         moveq    #0,d0
  253.         rts
  254. lbC00013A:
  255.         movem.l    (sp)+,d0-d7/a0-a6
  256.         moveq    #-1,d0
  257.         rts
  258.  
  259. **************************************************
  260.  
  261. ; xfdSlave structure: this one doesn't support segment decrunching
  262.  
  263. S_CRND        dc.l    S_FUCK        ;more slaves
  264.         dc.w    1        ;version
  265.         dc.w    33        ;master version
  266.         dc.l    N_CRND        ;name
  267.         dc.w    XFDPFF_DATA    ;flags
  268.         dc.w    0
  269.         dc.l    RB_CRND        ;recog buffer
  270.         dc.l    DB_CRND        ;decrunch buffer
  271.         dc.l    0        ;recog segment
  272.         dc.l    0        ;decrunch segment
  273.  
  274. ;-------------------------------------------------
  275.  
  276. ; Recog buffer function: receives buffer + length in a0/d0
  277.  
  278. RB_CRND        cmp.l    #12+2,d0
  279.         ble.s    .Exit
  280.  
  281.         cmp.l    #"CRND",(a0)
  282.         bne.s    .Exit
  283.  
  284.         moveq    #1,d0
  285.         rts
  286.  
  287. .Exit        moveq    #0,d0
  288.         rts
  289.  
  290. ;-------------------------------------------------
  291.  
  292. ;Decrunch buffer function: receives bufferinfo in a0
  293.  
  294. DB_CRND        movem.l    d2-d7/a2-a6,-(a7)
  295.         move.l    a0,a5
  296.         move.l    xfdbi_SourceBuffer(a5),a2
  297.  
  298.         move.l    a2,a0
  299.         add.l    xfdbi_SourceBufLen(a5),a0
  300.         move.l    -16(a0),d0
  301.  
  302.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  303.         move.l    d0,xfdbi_TargetBufLen(a5)
  304.  
  305.         move.l    xfdbi_TargetBufMemType(a5),d1
  306.         move.l    4.w,a6
  307.         jsr    -198(a6)
  308.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  309.         move.l    d0,xfdbi_TargetBuffer(a5)
  310.         beq.s    .Exit
  311.  
  312.         movem.l    d1-a6,-(a7)
  313.  
  314.         move.l    d0,a1
  315.         move.l    a2,a0
  316.         move.l    xfdbi_SourceBufLen(a5),d0
  317.  
  318.         move.l    a0,a4
  319.         adda.l    D0,A0
  320.         movem.l    -8(a0),a2/a3
  321.         movem.l    a2/a3,(a4)
  322.         LEA    -16(A0),A0
  323.         movea.l    (A0),A2
  324.         adda.l    A1,A2
  325.  
  326.         move.l    4(a0),d5
  327.         move.l    -(a0),d0
  328.  
  329.         bsr.w    D_CRUN
  330.  
  331.         movem.l    (a7)+,d1-a6
  332.  
  333.         tst.l    d0
  334.         bne.w    Error
  335.  
  336.         moveq    #1,d0
  337. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  338.         rts
  339.  
  340. **************************************************
  341.  
  342. ; xfdSlave structure: this one doesn't support segment decrunching
  343.  
  344. S_FUCK        dc.l    S_Gary        ;more slaves
  345.         dc.w    1        ;version
  346.         dc.w    33        ;master version
  347.         dc.l    N_FUCK        ;name
  348.         dc.w    XFDPFF_DATA    ;flags
  349.         dc.w    0
  350.         dc.l    RB_FUCK        ;recog buffer
  351.         dc.l    DB_FUCK        ;decrunch buffer
  352.         dc.l    0        ;recog segment
  353.         dc.l    0        ;decrunch segment
  354.  
  355. ;-------------------------------------------------
  356.  
  357. ; Recog buffer function: receives buffer + length in a0/d0
  358.  
  359. RB_FUCK        cmp.l    #12+2,d0
  360.         ble.s    .Exit
  361.  
  362.         cmp.l    #"FUCK",(a0)
  363.         bne.s    .Exit
  364.         cmp.b    #"M",-4(a0,d0.l)
  365.         bne.s    .Exit
  366.         cmp.b    #"A",-3(a0,d0.l)
  367.         bne.s    .Exit
  368.         cmp.b    #"R",-2(a0,d0.l)
  369.         bne.s    .Exit
  370.         cmp.b    #"C",-1(a0,d0.l)
  371.         bne.s    .Exit
  372.  
  373.         moveq    #1,d0
  374.         rts
  375.  
  376. .Exit        moveq    #0,d0
  377.         rts
  378.  
  379. ;-------------------------------------------------
  380.  
  381. ;Decrunch buffer function: receives bufferinfo in a0
  382.  
  383. DB_FUCK        movem.l    d2-d7/a2-a6,-(a7)
  384.         move.l    a0,a5
  385.         move.l    xfdbi_SourceBuffer(a5),a2
  386.  
  387.         move.l    a2,a0
  388.         add.l    xfdbi_SourceBufLen(a5),a0
  389.         move.l    -8(a0),d0
  390.  
  391.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  392.         move.l    d0,xfdbi_TargetBufLen(a5)
  393.  
  394.         move.l    xfdbi_TargetBufMemType(a5),d1
  395.         move.l    4.w,a6
  396.         jsr    -198(a6)
  397.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  398.         move.l    d0,xfdbi_TargetBuffer(a5)
  399.         beq.s    .Exit
  400.  
  401.         movem.l    d1-a6,-(a7)
  402.  
  403.         move.l    d0,a1
  404.         move.l    a2,a0
  405.         move.l    xfdbi_SourceBufLen(a5),d0
  406.  
  407.         adda.l    D0,A0
  408.         subq.l    #4,A0
  409.         movea.l    -(A0),A2
  410.         adda.l    A1,A2
  411.         move.l    -(a0),d5
  412.         move.l    -(a0),d0
  413.  
  414.         bsr.w    D_CRUN
  415.  
  416.         movem.l    (a7)+,d1-a6
  417.  
  418.         tst.l    d0
  419.         bne.w    Error
  420.  
  421.         moveq    #1,d0
  422. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  423.         rts
  424.  
  425. **************************************************
  426.  
  427. ; xfdSlave structure: this one doesn't support segment decrunching
  428.  
  429. S_Gary        dc.l    S_MARC        ;more slaves
  430.         dc.w    1        ;version
  431.         dc.w    33        ;master version
  432.         dc.l    N_Gary        ;name
  433.         dc.w    XFDPFF_DATA    ;flags
  434.         dc.w    0
  435.         dc.l    RB_Gary        ;recog buffer
  436.         dc.l    DB_Gary        ;decrunch buffer
  437.         dc.l    0        ;recog segment
  438.         dc.l    0        ;decrunch segment
  439.  
  440. ;-------------------------------------------------
  441.  
  442. ; Recog buffer function: receives buffer + length in a0/d0
  443.  
  444. RB_Gary        cmp.l    #12+2,d0
  445.         ble.s    .Exit
  446.  
  447.         cmp.b    #"G",-12(a0,d0.l)
  448.         bne.s    .Exit
  449.         cmp.b    #"a",-11(a0,d0.l)
  450.         bne.s    .Exit
  451.         cmp.b    #"r",-10(a0,d0.l)
  452.         bne.s    .Exit
  453.         cmp.b    #"y",-9(a0,d0.l)
  454.         bne.s    .Exit
  455.         cmp.b    #" ",-8(a0,d0.l)
  456.         bne.s    .Exit
  457.         cmp.b    #"S",-7(a0,d0.l)
  458.         bne.s    .Exit
  459.         cmp.b    #"y",-6(a0,d0.l)
  460.         bne.s    .Exit
  461.         cmp.b    #"m",-5(a0,d0.l)
  462.         bne.s    .Exit
  463.         cmp.b    #"o",-4(a0,d0.l)
  464.         bne.s    .Exit
  465.         cmp.b    #"n",-3(a0,d0.l)
  466.         bne.s    .Exit
  467.         cmp.b    #"s",-2(a0,d0.l)
  468.         bne.s    .Exit
  469.         cmp.b    #" ",-1(a0,d0.l)
  470.         bne.s    .Exit
  471.  
  472.         moveq    #1,d0
  473.         rts
  474.  
  475. .Exit        moveq    #0,d0
  476.         rts
  477.  
  478. ;-------------------------------------------------
  479.  
  480. ;Decrunch buffer function: receives bufferinfo in a0
  481.  
  482. DB_Gary        movem.l    d2-d7/a2-a6,-(a7)
  483.         move.l    a0,a5
  484.         move.l    xfdbi_SourceBuffer(a5),a2
  485.  
  486.         move.l    a2,a0
  487.         add.l    xfdbi_SourceBufLen(a5),a0
  488.         move.l    -16(a0),d0
  489.  
  490.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  491.         move.l    d0,xfdbi_TargetBufLen(a5)
  492.  
  493.         move.l    xfdbi_TargetBufMemType(a5),d1
  494.         move.l    4.w,a6
  495.         jsr    -198(a6)
  496.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  497.         move.l    d0,xfdbi_TargetBuffer(a5)
  498.         beq.s    .Exit
  499.  
  500.         movem.l    d1-a6,-(a7)
  501.  
  502.         move.l    d0,a1
  503.         move.l    a2,a0
  504.         move.l    xfdbi_SourceBufLen(a5),d0
  505.  
  506.         adda.l    D0,A0
  507.         LEA    -12(A0),A0
  508.         movea.l    -(A0),A2
  509.         adda.l    A1,A2
  510.         move.l    -(a0),d5
  511.         move.l    -(a0),d0
  512.  
  513.         bsr.w    D_CRUN
  514.  
  515.         movem.l    (a7)+,d1-a6
  516.  
  517.         tst.l    d0
  518.         bne.w    Error
  519.  
  520.         moveq    #1,d0
  521. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  522.         rts
  523.  
  524. **************************************************
  525.  
  526. ; xfdSlave structure: this one doesn't support segment decrunching
  527.  
  528. S_MARC        dc.l    S_TXIC        ;more slaves
  529.         dc.w    1        ;version
  530.         dc.w    33        ;master version
  531.         dc.l    N_MARC        ;name
  532.         dc.w    XFDPFF_DATA    ;flags
  533.         dc.w    0
  534.         dc.l    RB_MARC        ;recog buffer
  535.         dc.l    DB_MARC        ;decrunch buffer
  536.         dc.l    0        ;recog segment
  537.         dc.l    0        ;decrunch segment
  538.  
  539. ;-------------------------------------------------
  540.  
  541. ; Recog buffer function: receives buffer + length in a0/d0
  542.  
  543. RB_MARC        cmp.l    #12+2,d0
  544.         ble.s    .Exit
  545.  
  546.         cmp.b    #"M",-4(a0,d0.l)
  547.         bne.s    .Exit
  548.         cmp.b    #"A",-3(a0,d0.l)
  549.         bne.s    .Exit
  550.         cmp.b    #"R",-2(a0,d0.l)
  551.         bne.s    .Exit
  552.         cmp.b    #"C",-1(a0,d0.l)
  553.         bne.s    .Exit
  554.  
  555.         moveq    #1,d0
  556.         rts
  557.  
  558. .Exit        moveq    #0,d0
  559.         rts
  560.  
  561. ;-------------------------------------------------
  562.  
  563. ;Decrunch buffer function: receives bufferinfo in a0
  564.  
  565. DB_MARC        movem.l    d2-d7/a2-a6,-(a7)
  566.         move.l    a0,a5
  567.         move.l    xfdbi_SourceBuffer(a5),a2
  568.  
  569.         move.l    a2,a0
  570.         add.l    xfdbi_SourceBufLen(a5),a0
  571.         move.l    -8(a0),d0
  572.  
  573.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  574.         move.l    d0,xfdbi_TargetBufLen(a5)
  575.  
  576.         move.l    xfdbi_TargetBufMemType(a5),d1
  577.         move.l    4.w,a6
  578.         jsr    -198(a6)
  579.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  580.         move.l    d0,xfdbi_TargetBuffer(a5)
  581.         beq.s    .Exit
  582.  
  583.         movem.l    d1-a6,-(a7)
  584.  
  585.         move.l    d0,a1
  586.         move.l    a2,a0
  587.         move.l    xfdbi_SourceBufLen(a5),d0
  588.  
  589.         adda.l    D0,A0
  590.         subq.l    #4,A0
  591.         movea.l    -(A0),A2
  592.         adda.l    A1,A2
  593.         move.l    -(a0),d5
  594.         move.l    -(a0),d0
  595.  
  596.         bsr.w    D_CRUN
  597.  
  598.         movem.l    (a7)+,d1-a6
  599.  
  600.         tst.l    d0
  601.         bne.w    Error
  602.  
  603.         moveq    #1,d0
  604. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  605.         rts
  606.  
  607. **************************************************
  608.  
  609. ; xfdSlave structure: this one doesn't support segment decrunching
  610.  
  611. S_TXIC        dc.l    S_xVdg        ;more slaves
  612.         dc.w    1        ;version
  613.         dc.w    33        ;master version
  614.         dc.l    N_TXIC        ;name
  615.         dc.w    XFDPFF_DATA    ;flags
  616.         dc.w    0
  617.         dc.l    RB_TXIC        ;recog buffer
  618.         dc.l    DB_TXIC        ;decrunch buffer
  619.         dc.l    0        ;recog segment
  620.         dc.l    0        ;decrunch segment
  621.  
  622. ;-------------------------------------------------
  623.  
  624. ; Recog buffer function: receives buffer + length in a0/d0
  625.  
  626. RB_TXIC        cmp.l    #12+2,d0
  627.         ble.s    .Exit
  628.  
  629.         cmp.b    #"T",-4(a0,d0.l)
  630.         bne.s    .Exit
  631.         cmp.b    #"X",-3(a0,d0.l)
  632.         bne.s    .Exit
  633.         cmp.b    #"I",-2(a0,d0.l)
  634.         bne.s    .Exit
  635.         cmp.b    #"C",-1(a0,d0.l)
  636.         bne.s    .Exit
  637.  
  638.         moveq    #1,d0
  639.         rts
  640.  
  641. .Exit        moveq    #0,d0
  642.         rts
  643.  
  644. ;-------------------------------------------------
  645.  
  646. ;Decrunch buffer function: receives bufferinfo in a0
  647.  
  648. DB_TXIC        movem.l    d2-d7/a2-a6,-(a7)
  649.         move.l    a0,a5
  650.         move.l    xfdbi_SourceBuffer(a5),a2
  651.  
  652.         move.l    a2,a0
  653.         add.l    xfdbi_SourceBufLen(a5),a0
  654.         move.l    -8(a0),d0
  655.  
  656.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  657.         move.l    d0,xfdbi_TargetBufLen(a5)
  658.  
  659.         move.l    xfdbi_TargetBufMemType(a5),d1
  660.         move.l    4.w,a6
  661.         jsr    -198(a6)
  662.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  663.         move.l    d0,xfdbi_TargetBuffer(a5)
  664.         beq.s    .Exit
  665.  
  666.         movem.l    d1-a6,-(a7)
  667.  
  668.         move.l    d0,a1
  669.         move.l    a2,a0
  670.         move.l    xfdbi_SourceBufLen(a5),d0
  671.  
  672.         adda.l    D0,A0
  673.         subq.l    #4,A0
  674.         movea.l    -(A0),A2
  675.         adda.l    A1,A2
  676.         move.l    -(a0),d5
  677.         move.l    -(a0),d0
  678.  
  679.         bsr.w    D_CRUN
  680.  
  681.         movem.l    (a7)+,d1-a6
  682.  
  683.         tst.l    d0
  684.         bne.w    Error
  685.  
  686.         moveq    #1,d0
  687. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  688.         rts
  689.  
  690. **************************************************
  691.  
  692. ; xfdSlave structure: this one doesn't support segment decrunching
  693.  
  694. S_xVdg        dc.l    S_AMOS        ;more slaves
  695.         dc.w    1        ;version
  696.         dc.w    33        ;master version
  697.         dc.l    N_xVdg        ;name
  698.         dc.w    XFDPFF_DATA    ;flags
  699.         dc.w    0
  700.         dc.l    RB_xVdg        ;recog buffer
  701.         dc.l    DB_xVdg        ;decrunch buffer
  702.         dc.l    0        ;recog segment
  703.         dc.l    0        ;decrunch segment
  704.  
  705. ;-------------------------------------------------
  706.  
  707. ; Recog buffer function: receives buffer + length in a0/d0
  708.  
  709. RB_xVdg        cmp.l    #12+2,d0
  710.         ble.s    .Exit
  711.  
  712.         cmp.l    #"xVdg",(a0)
  713.         bne.s    .Exit
  714.  
  715.         moveq    #1,d0
  716.         rts
  717.  
  718. .Exit        moveq    #0,d0
  719.         rts
  720.  
  721. ;-------------------------------------------------
  722.  
  723. ;Decrunch buffer function: receives bufferinfo in a0
  724.  
  725. DB_xVdg        movem.l    d2-d7/a2-a6,-(a7)
  726.         move.l    a0,a5
  727.         move.l    xfdbi_SourceBuffer(a5),a2
  728.  
  729.         move.l    4(a2),d0
  730.  
  731.         subi.l    #$c,d0
  732.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  733.         move.l    d0,xfdbi_TargetBufLen(a5)
  734.  
  735.         move.l    xfdbi_TargetBufMemType(a5),d1
  736.         move.l    4.w,a6
  737.         jsr    -198(a6)
  738.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  739.         move.l    d0,xfdbi_TargetBuffer(a5)
  740.         beq.s    .Exit
  741.  
  742.         movem.l    d1-a6,-(a7)
  743.  
  744.         move.l    d0,a1
  745.         move.l    a2,a0
  746.         move.l    xfdbi_SourceBufLen(a5),d0
  747.  
  748.         adda.l    D0,A0
  749.         movea.l    -(A0),A2
  750.         adda.l    A1,A2
  751.         move.l    -(a0),d5
  752.         move.l    -(a0),d0
  753.  
  754.         bsr.w    D_CRUN
  755.  
  756.         movem.l    (a7)+,d1-a6
  757.  
  758.         tst.l    d0
  759.         bne.w    Error
  760.  
  761.         moveq    #1,d0
  762. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  763.         rts
  764.  
  765. **************************************************
  766.  
  767. ; xfdSlave structure: this one doesn't support segment decrunching
  768.  
  769. S_AMOS        dc.l    S_ARPF        ;more slaves
  770.         dc.w    1        ;version
  771.         dc.w    33        ;master version
  772.         dc.l    N_AMOS        ;name
  773.         dc.w    XFDPFF_RELOC    ;flags
  774.         dc.w    0
  775.         dc.l    RB_AMOS        ;recog buffer
  776.         dc.l    DB_AMOS        ;decrunch buffer
  777.         dc.l    0        ;recog segment
  778.         dc.l    0        ;decrunch segment
  779.  
  780. ;-------------------------------------------------
  781.  
  782. ; Recog buffer function: receives buffer + length in a0/d0
  783.  
  784. RB_AMOS        cmp.l    #4000,d0
  785.         ble.w    .Exit
  786.  
  787.         cmp.l    #$3F3,(a0)
  788.         bne.w    .Exit
  789.  
  790.         move.l    a0,-(a7)
  791.  
  792.         move.l    8(a0),d1    ;how much hunks
  793.         lsl.l    #2,d1        ; * 4
  794.         CMP.L    D1,D0
  795.         BLO.B    .Ex
  796.         add.l    d1,a0
  797.         add.w    #$1c,a0
  798.  
  799.         cmp.l    #'CmdL',$332-$22(a0)    ; Amos Pro CLI
  800.         bne.b    .Ex1
  801.         cmp.l    #'CmdL',$3A0-$22(a0)
  802.         bne.b    .Ex1
  803.         cmp.l    #'CmdL',$490-$22(a0)
  804.         bne.b    .Ex1
  805.         cmp.l    #'xVdg',$8DE-$22(a0)
  806.         bne.b    .Ex1
  807.         bra.w    .Ok
  808. .Ex1
  809.         cmp.l    #'CmdL',$418-$22(a0)    ; Amos Pro Wb
  810.         bne.b    .Ex2
  811.         cmp.l    #'CmdL',$486-$22(a0)
  812.         bne.b    .Ex2
  813.         cmp.l    #'CmdL',$576-$22(a0)
  814.         bne.b    .Ex2
  815.         cmp.l    #'xVdg',$9C4-$22(a0)
  816.         bne.b    .Ex2
  817.         bra.b    .Ok
  818. .Ex2
  819.         cmp.l    #'CmdL',$362-$22(a0)    ; Amos Wb
  820.         bne.b    .Ex3
  821.         cmp.l    #'xVdg',$708-$22(a0)
  822.         bne.b    .Ex3
  823.         cmp.l    #'xVdg',$776-$22(a0)
  824.         bne.b    .Ex3
  825.         bra.b    .Ok
  826. .Ex3
  827.         cmp.l    #'CmdL',$262(a0)    ; Amos Wb
  828.         bne.b    .Ex31
  829.         cmp.l    #'xVdg',$5BA(a0)
  830.         bne.b    .Ex31
  831.         cmp.l    #'xVdg',$628(a0)
  832.         bne.b    .Ex31
  833.         bra.b    .Ok
  834. .Ex31
  835.         cmp.l    #'CmdL',$2D0-$22(a0)    ; Amos CLI
  836.         bne.b    .Ex
  837.         cmp.l    #'CmdL',$2F0-$22(a0)
  838.         bne.b    .Ex
  839.         cmp.l    #'CmdL',$540-$22(a0)
  840.         bne.b    .Ex
  841.         cmp.l    #'xVdg',$7B2-$22(a0)
  842.         bne.b    .Ex
  843.         cmp.l    #'xVdg',$820-$22(a0)
  844.         bne.b    .Ex
  845.  
  846. .Ok
  847.         move.l    (a7)+,a0
  848.  
  849.         move.l    8(a0),d1    ;how much hunks
  850.         add.l    $14(a0),d1    ;first hunk size
  851.         lsl.l    #2,d1        ; * 4
  852.         add.l    #$1c+$c,d1
  853.         CMP.L    D1,D0
  854.         BLO.B    .Ex
  855.         add.l    d1,a0
  856.  
  857.         cmp.l    #'xVdg',(a0)
  858.         bne.b    .Exit
  859.  
  860.         moveq    #1,d0
  861.         rts
  862. .Ex
  863.         move.l    (a7)+,a0
  864.  
  865. .Exit        moveq    #0,d0
  866.         rts
  867.  
  868. ;-------------------------------------------------
  869.  
  870. ;Decrunch buffer function: receives bufferinfo in a0
  871.  
  872. DB_AMOS        movem.l    d2-d7/a2-a6,-(a7)
  873.         move.l    a0,a5
  874.         move.l    xfdbi_SourceBuffer(a5),a2
  875.  
  876.         move.l    a2,a0
  877.         move.l    8(a0),d0    ; how much hunks
  878.         move.l    d0,d1
  879.         lsl.l    #2,d1        ; * 4
  880.         add.l    d1,a0
  881.         add.w    #$1c,a0
  882.         move.l    a0,a1
  883.         subq.l    #1,d0
  884. .Loop
  885.         cmpi.l    #'xVdg',(a0)
  886.         bne.b    .NotPacked
  887.  
  888.         add.l    4(a0),a1    ; unpack len
  889.         move.l    -4(a0),d1    ; hunk size
  890.         lsl.l    #2,d1        ; * 4
  891.         add.l    d1,a0
  892.         add.w    #$c,a0
  893.         dbf    d0,.Loop
  894.         bra.b    .Alloc
  895. .NotPacked
  896.         move.l    -4(a0),d1    ; hunk size
  897.         lsl.l    #2,d1        ; * 4
  898.         add.l    d1,a0
  899.         add.w    #$c,a0
  900.         add.l    d1,a1
  901.         add.w    #$c,a1
  902.         dbf    d0,.Loop
  903. .Alloc
  904.         sub.l    a2,a1
  905.         move.l    a1,d0
  906.  
  907.         subq.l    #8,d0
  908.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  909.         addq.l    #8,d0
  910.         move.l    d0,xfdbi_TargetBufLen(a5)
  911.  
  912.         move.l    xfdbi_TargetBufMemType(a5),d1
  913.         move.l    4.w,a6
  914.         jsr    -198(a6)
  915.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  916.         move.l    d0,xfdbi_TargetBuffer(a5)
  917.         beq.s    .Exit
  918.  
  919.         movem.l    d1-a6,-(a7)
  920.  
  921.         move.l    d0,a1
  922.         move.l    a2,a0
  923.         bsr.s    D_AMOS
  924.  
  925.         movem.l    (a7)+,d1-a6
  926.  
  927.         tst.l    d0
  928.         bne.w    Error
  929.  
  930.         moveq    #1,d0
  931. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  932.         rts
  933.  
  934. **************************************************
  935.  
  936. D_AMOS
  937.         lea    $14(a1),a2        ;first hunk length
  938.         move.l    8(a0),d0        ;how much hunks
  939.         move.l    d0,d1
  940.         lsl.l    #2,d1            ; * 4
  941.         addi.w    #$1c-1,d1
  942. .Copy
  943.         move.b    (a0)+,(a1)+        ;copy header to dest
  944.         dbf    d1,.Copy
  945.         subq.w    #1,d0
  946. .Loop
  947.         cmpi.l    #'xVdg',(a0)        ;segment packed ?
  948.         bne.b    .NotPacked
  949.  
  950.         move.l    4(a0),d1        ;unpacked length
  951.         subi.w    #$c,d1
  952.         lsr.l    #2,d1            ; / 4
  953.         move.l    d1,-4(a1)
  954.         and.l    #$ff000000,(a2)        ; unpacked hunk len
  955.         add.l    d1,(a2)+
  956.  
  957.         movem.l    d0-d7/a0-a6,-(a7)
  958.  
  959.         bsr.b    .Decrunch
  960.         tst.l    d0
  961.         bne.b    .Corrupt
  962.  
  963.         movem.l    (a7)+,d0-d7/a0-a6
  964.  
  965.         add.l    4(a0),a1        ; add unpacked len
  966.         sub.w    #$c,a1
  967.         move.l    -4(a0),d1
  968.         lsl.l    #2,d1            ; * 4
  969.         add.l    d1,a0
  970.  
  971.         moveq    #$b,d1
  972. .Copy1
  973.         move.b    (a0)+,(a1)+
  974.         dbf    d1,.Copy1
  975.  
  976.         dbf    d0,.Loop
  977.         bra.b    .EndDecr
  978. .NotPacked
  979.         addq.w    #4,a2
  980.         move.l    -4(a0),d1
  981.         lsl.l    #2,d1            ; * 4
  982.         add.w    #$c-1,d1
  983. .Copy2
  984.         move.b    (a0)+,(a1)+
  985.         dbf    d1,.Copy2
  986.  
  987.         dbf    d0,.Loop
  988. .EndDecr
  989.         moveq    #0,d0
  990.         rts
  991.  
  992. .Corrupt
  993.         movem.l    (a7)+,d0-d7/a0-a6
  994.         moveq    #1,d0
  995.         rts
  996.  
  997. .Decrunch
  998.         move.l    8(a0),d0
  999.         add.w    #12,D0
  1000.  
  1001.         adda.l    D0,A0
  1002.         movea.l    -(A0),A2
  1003.         adda.l    A1,A2
  1004.         move.l    -(a0),d5
  1005.         move.l    -(a0),d0
  1006.  
  1007.         bsr.w    D_CRUN
  1008.         rts
  1009.  
  1010. **************************************************
  1011.  
  1012. ; xfdSlave structure: this one doesn't support segment decrunching
  1013.  
  1014. S_ARPF        dc.l    S_ARP3        ;more slaves
  1015.         dc.w    1        ;version
  1016.         dc.w    33        ;master version
  1017.         dc.l    N_ARPF        ;name
  1018.         dc.w    XFDPFF_DATA    ;flags
  1019.         dc.w    0
  1020.         dc.l    RB_ARPF        ;recog buffer
  1021.         dc.l    DB_ARPF        ;decrunch buffer
  1022.         dc.l    0        ;recog segment
  1023.         dc.l    0        ;decrunch segment
  1024.  
  1025. ;-------------------------------------------------
  1026.  
  1027. ; Recog buffer function: receives buffer + length in a0/d0
  1028.  
  1029. RB_ARPF        cmp.l    #12+2,d0
  1030.         ble.s    .Exit
  1031.  
  1032.         cmp.l    #"ARPF",(a0)
  1033.         bne.s    .Exit
  1034.  
  1035.         moveq    #1,d0
  1036.         rts
  1037.  
  1038. .Exit        moveq    #0,d0
  1039.         rts
  1040.  
  1041. ;-------------------------------------------------
  1042.  
  1043. ;Decrunch buffer function: receives bufferinfo in a0
  1044.  
  1045. DB_ARPF        movem.l    d2-d7/a2-a6,-(a7)
  1046.         move.l    a0,a5
  1047.         move.l    xfdbi_SourceBuffer(a5),a2
  1048.  
  1049.         move.l    a2,a0
  1050.         add.l    4(a0),a0
  1051.         addq.l    #8,a0
  1052.         move.l    (a0),d0
  1053.  
  1054.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  1055.         move.l    d0,xfdbi_TargetBufLen(a5)
  1056.  
  1057.         move.l    xfdbi_TargetBufMemType(a5),d1
  1058.         move.l    4.w,a6
  1059.         jsr    -198(a6)
  1060.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  1061.         move.l    d0,xfdbi_TargetBuffer(a5)
  1062.         beq.s    .Exit
  1063.  
  1064.         movem.l    d1-a6,-(a7)
  1065.  
  1066.         move.l    d0,a1
  1067.         move.l    a2,a0
  1068.         move.l    4(a0),d0
  1069.         add.l    #12,d0
  1070.  
  1071.         adda.l    D0,A0
  1072.         movea.l    -(A0),A2
  1073.         adda.l    A1,A2
  1074.         move.l    -(a0),d5
  1075.         move.l    -(a0),d0
  1076.  
  1077.         bsr.w    D_CRUN
  1078.  
  1079.         movem.l    (a7)+,d1-a6
  1080.  
  1081.         tst.l    d0
  1082.         bne.w    Error
  1083.  
  1084.         moveq    #1,d0
  1085. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  1086.         rts
  1087.  
  1088. **************************************************
  1089.  
  1090. ; xfdSlave structure: this one doesn't support segment decrunching
  1091.  
  1092. S_ARP3        dc.l    S_ACE        ;more slaves
  1093.         dc.w    1        ;version
  1094.         dc.w    33        ;master version
  1095.         dc.l    N_ARP3        ;name
  1096.         dc.w    XFDPFF_DATA    ;flags
  1097.         dc.w    0
  1098.         dc.l    RB_ARP3        ;recog buffer
  1099.         dc.l    DB_ARP3        ;decrunch buffer
  1100.         dc.l    0        ;recog segment
  1101.         dc.l    0        ;decrunch segment
  1102.  
  1103. ;-------------------------------------------------
  1104.  
  1105. ; Recog buffer function: receives buffer + length in a0/d0
  1106.  
  1107. RB_ARP3        cmp.l    #12+2,d0
  1108.         ble.s    .Exit
  1109.  
  1110.         cmp.l    #"ARP3",(a0)
  1111.         bne.s    .Exit
  1112.  
  1113.         moveq    #1,d0
  1114.         rts
  1115.  
  1116. .Exit        moveq    #0,d0
  1117.         rts
  1118.  
  1119. ;-------------------------------------------------
  1120.  
  1121. ;Decrunch buffer function: receives bufferinfo in a0
  1122.  
  1123. DB_ARP3        movem.l    d2-d7/a2-a6,-(a7)
  1124.         move.l    a0,a5
  1125.         move.l    xfdbi_SourceBuffer(a5),a2
  1126.  
  1127.         move.l    a2,a0
  1128.         add.l    4(A2),a0
  1129.         lea    $1C(a0),a0
  1130.         move.l    (a0),d0
  1131.  
  1132.         tst.l    8(A2)
  1133.         beq.b    .skip
  1134.         add.l    8(A2),A0
  1135.         sub.l    #$C00000,A0
  1136.         add.l    (A0),D0
  1137. .skip
  1138.         tst.l    12(A2)
  1139.         beq.b    .skip2
  1140.         add.l    12(A2),A0
  1141.         sub.l    #$200000,A0
  1142.         add.l    (A0),D0
  1143. .skip2
  1144.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  1145.         move.l    d0,xfdbi_TargetBufLen(a5)
  1146.  
  1147.         move.l    xfdbi_TargetBufMemType(a5),d1
  1148.         move.l    4.w,a6
  1149.         jsr    -198(a6)
  1150.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  1151.         move.l    d0,xfdbi_TargetBuffer(a5)
  1152.         beq.b    .Exit
  1153.  
  1154.         movem.l    d1-a6,-(a7)
  1155.  
  1156.         move.l    d0,a1
  1157.         move.l    a2,a0
  1158.         move.l    4(a0),d0
  1159.         add.l    #$20,d0
  1160.  
  1161.         adda.l    D0,A0
  1162.         movea.l    -(A0),A2
  1163.         adda.l    A1,A2
  1164.         move.l    -(a0),d5
  1165.         move.l    -(a0),d0
  1166.  
  1167.         bsr.w    D_CRUN
  1168.  
  1169.         move.l    xfdbi_SourceBuffer(a5),a2
  1170.         tst.l    8(A2)
  1171.         beq.b    .skip3
  1172.         addq.l    #8,A0
  1173.         add.l    (A0)+,A1
  1174.         add.l    8(A2),A0
  1175.         sub.l    #$C00000,A0
  1176.         movea.l    -(A0),A2
  1177.         adda.l    A1,A2
  1178.         move.l    -(a0),d5
  1179.         move.l    -(a0),d0
  1180.  
  1181.         bsr.w    D_CRUN
  1182. .skip3
  1183.         move.l    xfdbi_SourceBuffer(a5),a2
  1184.         tst.l    12(A2)
  1185.         beq.b    .skip4
  1186.         addq.l    #8,A0
  1187.         add.l    (A0)+,A1
  1188.         add.l    12(A2),A0
  1189.         sub.l    #$200000,A0
  1190.         movea.l    -(A0),A2
  1191.         adda.l    A1,A2
  1192.         move.l    -(a0),d5
  1193.         move.l    -(a0),d0
  1194.  
  1195.         bsr.w    D_CRUN
  1196. .skip4
  1197.         movem.l    (a7)+,d1-a6
  1198.  
  1199.         tst.l    d0
  1200.         bne.w    Error
  1201.  
  1202.         moveq    #1,d0
  1203. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  1204.         rts
  1205.  
  1206. **************************************************
  1207.  
  1208. ; xfdSlave structure: this one doesn't support segment decrunching
  1209.  
  1210. S_ACE        dc.l    0        ;no more slaves
  1211.         dc.w    1        ;version
  1212.         dc.w    33        ;master version
  1213.         dc.l    N_ACE        ;name
  1214.         dc.w    XFDPFF_DATA    ;flags
  1215.         dc.w    0
  1216.         dc.l    RB_ACE        ;recog buffer
  1217.         dc.l    DB_ACE        ;decrunch buffer
  1218.         dc.l    0        ;recog segment
  1219.         dc.l    0        ;decrunch segment
  1220.  
  1221. ;-------------------------------------------------
  1222.  
  1223. ; Recog buffer function: receives buffer + length in a0/d0
  1224.  
  1225. RB_ACE        cmp.l    #12+2,d0
  1226.         ble.s    .Exit
  1227.  
  1228.         cmp.l    #"ACE!",(a0)
  1229.         bne.s    .Exit
  1230.  
  1231.         moveq    #1,d0
  1232.         rts
  1233.  
  1234. .Exit        moveq    #0,d0
  1235.         rts
  1236.  
  1237. ;-------------------------------------------------
  1238.  
  1239. ;Decrunch buffer function: receives bufferinfo in a0
  1240.  
  1241. DB_ACE        movem.l    d2-d7/a2-a6,-(a7)
  1242.         move.l    a0,a5
  1243.         move.l    xfdbi_SourceBuffer(a5),a2
  1244.  
  1245.         move.l    8(a2),d0
  1246.  
  1247.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  1248.         move.l    d0,xfdbi_TargetBufLen(a5)
  1249.  
  1250.         move.l    xfdbi_TargetBufMemType(a5),d1
  1251.         move.l    4.w,a6
  1252.         jsr    -198(a6)
  1253.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  1254.         move.l    d0,xfdbi_TargetBuffer(a5)
  1255.         beq.s    .Exit
  1256.  
  1257.         movem.l    d1-a6,-(a7)
  1258.  
  1259.         move.l    d0,a1
  1260.         move.l    a2,a0
  1261.         move.l    4(a0),d0
  1262.         add.l    #12,d0
  1263.  
  1264.         move.l    8(a0),a2
  1265.         move.l    12(a0),d5
  1266.         adda.l    D0,A0
  1267. ;        movea.l    -(A0),A2
  1268.         adda.l    A1,A2
  1269. ;        move.l    -(a0),d5
  1270.         move.l    -(a0),d0
  1271.  
  1272.         bsr.w    D_CRUN
  1273.  
  1274.         movem.l    (a7)+,d1-a6
  1275.  
  1276.         tst.l    d0
  1277.         bne.w    Error
  1278.  
  1279.         moveq    #1,d0
  1280. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  1281.         rts
  1282.  
  1283.         END
  1284.