home *** CD-ROM | disk | FTP | other *** search
/ Supremacy 2 / Supremacy-2.iso / Pompey / PP_031.MSA / AUTOMATI.ON / SOURCE / ULTRA.S < prev   
Text File  |  1985-11-20  |  11KB  |  645 lines

  1. *
  2. * Ultraload (Uni-load II)
  3. *
  4. * Written by Dack of The Un-Nameables
  5. * (Based on Uni-load by The Law)
  6. *
  7. * Includes depacker to/from odd addresses
  8. *
  9. * NOTE:-
  10. *
  11. * buff_len  = Max length of a PACKED file
  12. * max_files = No. of files open at once + 6
  13. *
  14. * only packed files are buffered, unpacked data
  15. * is treated as normal...
  16. *
  17. * gam = filename to $4b
  18. *
  19.  
  20.         opt c+,d-
  21.  
  22. buff_len    equ    $18c0a
  23. max_files    equ    32
  24.     bra    main
  25.  
  26. gam        dc.b "entvap",0
  27.         even
  28.  
  29. text    DC.B "Vapour presents . . ."
  30.     DC.B 00,00
  31.  
  32.     EVEN
  33.  
  34. ;SET TABS TO 10 FOR DISASSEMBLY
  35.  
  36.     
  37. main    MOVEA.L    4(A7),A5
  38.     move.l $c(a5),d0
  39.     add.l $14(a5),d0
  40.     add.l $1c(a5),d0
  41.     add.l #$200,d0
  42.     add.l #buff_len,d0    ;add buffer length
  43.     move.l d0,-(sp)
  44.     move.l a5,-(sp)
  45.     move.l #$4a0000,-(sp)
  46.     trap #1
  47.     lea $c(a7),a7
  48.  
  49.     dc.l $a000a00a
  50.     clr.w -(sp)
  51.     pea $ffffffff
  52.     move.l (a7),-(sp)
  53.     move.w #5,-(sp)
  54.     trap #14
  55.     lea $c(a7),a7
  56.     dc.w $a009
  57.  
  58.     pea    text
  59.     move.w    #9,-(a7)
  60.     trap    #1
  61.     addq.l    #6,a7
  62.  
  63. *
  64. * buffer address
  65. * (Can be absolute....)
  66.     move.l    #buff_start,buff_add    ;set buffer start address
  67.  
  68. CHEAT    CLR.L    -(A7)
  69.     MOVE.W    #$20,-(A7)
  70.     TRAP    #$01
  71.     ADDQ.L    #6,A7
  72.     LEA    SUPERLNG(PC),A6
  73.     MOVE.L    D0,(A6)
  74.     MOVE.L    $84,tr1
  75.     MOVE.L    #T1,$84
  76.     MOVE.L    SUPERLNG(PC),-(A7)
  77.     MOVE.W    #$20,-(A7)
  78.     TRAP    #$01
  79.     ADDQ.L    #6,A7
  80. stkk    clr.w    in_use
  81.     clr.l $60000
  82.     pea $60000
  83.     move.l (a7),-(sp)
  84.     move.l #gam,-(sp)
  85.     move.l #$4b0000,-(sp)
  86.     trap #1
  87.     lea $0c(a7),a7
  88.     clr.w -(sp)
  89.     trap #1
  90. SUPERLNG    DC.L    0
  91.  
  92.  
  93. ;multi file read 1st October 1989
  94. ;fix 11th October 1989 for decode from odd address
  95. ;bastard bug to find
  96.  
  97. T1        tst.w    inside
  98.         bne    bye
  99.         MOVEM.L a0-a6/d0-d7,reg
  100.         movea.l    a7,a1
  101.         addq.l     #6,a1
  102.         move.w     (a7),d0
  103.         btst     #$d,d0
  104.         bne.s     ok1
  105.         move.l     usp,a1
  106. ok1        cmpi.w  #0,(a1)
  107.         bne.s next1
  108.         move.l    tr1(pc),$84.w
  109.         bra.s    open
  110. next1        cmpi.w     #$3d,(a1)
  111.         beq    openup
  112.         cmpi.w    #$3f,(a1)
  113.         beq    read
  114.         cmpi.w    #$3e,(a1)
  115.         beq    close
  116.         cmpi.w    #$42,(a1)
  117.         beq    seek
  118.         cmpi.w    #$4e,(a1)
  119.         beq    ffirst
  120.         cmpi.w  #$3c,(a1)
  121.         beq     create
  122.         cmpi.w    #$40,(a1)
  123.         beq     write
  124. open        movem.l     reg(pc),a0-a6/d0-d7
  125. bye        dc.w     $4ef9
  126. tr1        dc.l     $0
  127.  
  128. openup        move.w    #1,inside    ;do normal traps
  129.         lea    f_names,a0
  130.         add.l    #300,a0
  131.         move.l    #5,d0
  132. s_loop        addq.l    #1,d0
  133.         add.l    #60,a0
  134.         tst.b    (a0)
  135.         bne.s    s_loop        ;search for empty slot
  136.  
  137. ;d0=my pretend file handle
  138.  
  139.         move.l    d0,d7
  140.  
  141. ****        
  142.         move.l d0,d6
  143.  
  144.         move.l    a0,a5
  145.         move.l    2(a1),a6    ;save file name address
  146.  
  147. ;open file
  148.         clr.w    -(a7)
  149.         move.l    a6,-(a7)
  150.         move.w    #$3d,-(a7)
  151.         trap    #1
  152.         addq.l    #8,a7
  153.  
  154.         tst.l    d0
  155.         bmi    error        ;in case file not there
  156.  
  157.         move.w    d0,d4
  158.         clr.l i_buff
  159.         pea i_buff
  160.         move.l #8,-(a7)
  161.         move.w d4,-(a7)
  162.         move.w #$3f,-(a7)
  163.         trap #1
  164.         lea 12(a7),a7
  165.         clr.w -(a7)
  166.         move.w d4,-(a7)
  167.         clr.l -(a7)
  168.         move.w #$42,-(a7)
  169.         trap #1
  170.         lea 10(a7),a7
  171.         cmp.l #"LSD!",i_buff
  172.         beq.s nermal    
  173.         lea real_hand,a0
  174.         lsl.l #2,d7
  175.         move.l d4,(a0,d7.w)
  176.         move.b #"0",(a5)
  177.         bra not_good
  178.  
  179. ;copy file name to storage
  180.  
  181. nermal        move.l    #59,d0
  182. c_loop        move.b    (a6)+,(a5)+
  183.         dbra    d0,c_loop
  184.  
  185.         move.l    i_len,d5
  186. not_com        lea    f_lengths,a0
  187.         lsl.l    #2,d7
  188.         move.l    d5,(a0,d7.w)        ;save file length in array
  189.         lea    so_read,a0
  190.         move.l #0,(a0,d7.w)
  191.         lea real_hand,a0
  192.         move.l #-1,(a0,d7.w)
  193.         
  194. ;close file as finished
  195.  
  196.         move.w    d4,-(a7)
  197.         move.w    #$3e,-(a7)
  198.         trap    #1
  199.         addq.l    #4,a7
  200.  
  201. not_good
  202.         clr.w    inside        ;my traps again
  203.         move.l d6,-(a7)
  204.         movem.l reg,a0-a6/d0-d7    
  205.         move.l    (a7)+,d0    ;give back my handle
  206.         rte
  207.  
  208. read        clr.l    d0
  209.         move.w    2(a1),d0    ;get handle
  210.         cmp.l    in_use,d0
  211.         beq    all_in        ;already loaded
  212.  
  213.         move.l d0,d1
  214.         lsl.l #2,d1
  215.         lea real_hand,a0
  216.         move.l (a0,d1.w),d2
  217.         cmp.l #-1,d2
  218.         beq.s cor_blimey
  219.  
  220.         move.l 4(a1),d0
  221.         move.l 8(a1),d1
  222.         move.w #1,inside
  223.         move.l d1,-(a7)
  224.         move.l d0,-(a7)
  225.         move.w d2,-(a7)
  226.         move.w #$3f,-(a7)
  227.         trap #1
  228.         lea 12(a7),a7
  229.         clr.w inside
  230.  
  231.         move.l d0,d4
  232.         bra titter
  233.  
  234. cor_blimey    move.l    a1,a5
  235.         move.w    #1,inside
  236.         move.l    d0,in_use
  237.         mulu     #60,d0
  238.         lea    f_names,a0
  239.         add.l    d0,a0        ;get correct filename
  240.         clr.w    -(a7)
  241.         move.l    a0,-(a7)
  242.         move.w    #$3d,-(a7)
  243.         trap    #1
  244.         addq.l    #8,a7
  245.         move.w    d0,d6
  246.         move.l    buff_add,-(a7)
  247.         move.l    #buff_len,-(a7)
  248.         move.w    d0,-(a7)
  249.         move.w    #$3f,-(a7)
  250.         trap    #1
  251.         lea    12(a7),a7
  252.         move.w    d6,-(a7)
  253.         move.w    #$3e,-(a7)
  254.         trap    #1
  255.         addq.l    #4,a7
  256.         clr.w    inside
  257.         move.l    buff_add,a0
  258.         move.l    a0,a1
  259.         add.l    #200,a1
  260.         move.l    4(a0),d7    ;length
  261.         bsr    DEPACK
  262.         move.l    buff_add,a0
  263.         move.l    a0,a1
  264.         add.l    #200,a1
  265. m2_back        move.b    (a1)+,(a0)+
  266.         subq.l    #1,d7
  267.         bne.s    m2_back
  268. read_in        move.l    a5,a1        ;put stack back in a1
  269. all_in        move.l    4(a1),d0    ;bytes to move
  270.         move.l    d0,d4
  271.         move.l    8(a1),a0    ;whereto
  272.         move.l    in_use,d1
  273.         lsl.l    #2,d1        ;*4
  274.         lea    so_read,a2
  275.         lea    f_lengths,a3
  276.         move.l    (a2,d1.w),d2    ;current offset
  277.         move.l    (a3,d1.w),d3    ;length of this file
  278.         move.l    buff_add,a1
  279.         add.l    d2,a1
  280. do_it        move.b    (a1)+,(a0)+
  281.         addq.l    #1,d2
  282.         cmp.l    d2,d3
  283.         blt.s    past_end
  284.         subq.l    #1,d0
  285.         bne.s    do_it
  286.         bra.s    wibble
  287. past_end    move.l    d3,d2        ;if past end then offset=end
  288. wibble        move.l    d2,(a2,d1.w)    ;save new offset
  289.         sub.l    d0,d4        ;get number of bytes read
  290. titter        move.l    d4,-(a7)
  291.         movem.l    reg,a0-a6/d0-d7
  292.         move.l    (a7)+,d0    ;return #bytes read
  293.         rte
  294.  
  295. close        clr.l    d0
  296.         move.w    2(a1),d0
  297.         cmp.l    in_use,d0    ;closing file currently loaded
  298.         bne.s    lucky
  299.         move.l    #-1,in_use
  300. lucky        move.l d0,d1
  301.         mulu    #60,d0
  302.         lea    f_names,a0
  303.         move.b    #0,(a0,d0.w)
  304.         lsl.l #2,d1
  305.         lea real_hand,a0
  306.         move.l (a0,d1.w),d0
  307.         cmp.l #-1,d0
  308.         beq.s standard
  309.         move.w #1,inside
  310.         move.w d0,-(a7)
  311.         move.w #$3e,-(a7)
  312.         trap #1
  313.         addq.w #4,a7
  314.         clr.w inside
  315. standard    movem.l    reg,a0-a6/d0-d7
  316.         clr.l    d0
  317.         rte
  318.  
  319. seek        lea    so_read,a2
  320.         lea    f_lengths,a3
  321.         clr.l    d0
  322.         move.w    6(a1),d0    ;file handle
  323.         lsl.l    #2,d0
  324.         clr.l    d1
  325.         move.w    8(a1),d1    ;type of seek
  326.         move.l    2(a1),d2    ;offset
  327.  
  328.         lea real_hand,a0
  329.         move.l (a0,d0.w),d3
  330.         cmp.l #-1,d3
  331.         beq.s com_seek
  332.         move.w #1,inside
  333.         move.w d1,-(a7)
  334.         move.w d3,-(a7)
  335.         move.l d2,-(a7)
  336.         move.w #$42,-(a7)
  337.         trap #1
  338.         lea 10(a7),a7
  339.  
  340.         move.l d0,d3
  341.         clr.w inside
  342.         bra com_out
  343.  
  344. com_seek    tst.w    d1        ;type 0?
  345.         bne.s    one_two
  346.  
  347. ;absolute move=type 0
  348.  
  349.         move.l    d2,d3
  350.         bra.s    same_end
  351. one_two        cmp.w    #1,d1
  352.         bne.s    mustbe2
  353.  
  354. ;type 1=from current place
  355.  
  356.         move.l    (a2,d0.w),d3
  357.         add.l    d2,d3
  358.         bra.s    same_end
  359. mustbe2        move.l    (a3,d0.w),d3
  360.         sub.l    d2,d3
  361.  
  362. ;type 2=from end
  363.  
  364. same_end    move.l    (a3,d0.w),d4    ;get length
  365.         cmp.l    d3,d4
  366.         bgt.s    ok_so_far    ;not past end
  367.         move.l    d4,d3
  368. ok_so_far    cmp.l    #0,d3
  369.         bgt.s    still_ok    ;not past start
  370.         clr.l    d3
  371. still_ok    move.l    d3,(a2,d0.w)    ;save new offset
  372. com_out        move.l    d3,-(a7)
  373.         movem.l    reg,a0-a6/d0-d7
  374.         move.l    (a7)+,d0    ;return new offset
  375.         rte
  376.  
  377. error        clr.w    inside
  378.         movem.l    reg,a0-a6/d0-d7
  379.         move.l    #-1,d0
  380.         rte    
  381.  
  382. create        move.w #1,inside
  383.         lea f_names,a0
  384.         add.l #300,a0
  385.         move.l #5,d0
  386. fcl        addq.l #1,d0
  387.         add.l #60,a0
  388.         tst.b (a0)
  389.         bne.s fcl
  390.  
  391.         move.l d0,d7
  392.         move.l a0,a5
  393.         move.w 6(a1),-(a7)
  394.         move.l 2(a1),-(a7)
  395.         move.w #$3c,-(a7)
  396.         trap #1
  397.         addq.l #8,a7
  398.  
  399.         tst.w d0
  400.         bmi nwc
  401.  
  402.         move.b #'i',(a5)
  403.         lea real_hand,a0
  404.         move.l d7,d6
  405.         lsl.l #2,d7
  406.         move.l d0,(a0,d7.w)
  407.         move.l d6,d0
  408. nwc        clr.w inside
  409.         move.l d0,-(a7)
  410.         movem.l reg,a0-a6/d0-d7
  411.         move.l (a7)+,d0
  412.         rte
  413.  
  414. write        clr.l d0
  415.         move.w 2(a1),d0
  416.         lsl.l #2,d0
  417.         lea real_hand,a0
  418.         move.l (a0,d0.w),d1
  419.         move.w d1,2(a1)
  420.         bra open
  421.  
  422. ffirst        move.l    2(a1),d0
  423.         move.l    d0,d5        ;preserve fname
  424.         move.w    6(a1),d1
  425.         move.w    #1,inside
  426.         move.w    d1,-(a7)
  427.         move.l    d0,-(a7)
  428.         move.w    #$4e,-(a7)
  429.         trap    #1
  430.         addq.l    #8,a7
  431.         tst.w    d0
  432.         bne    exit_route
  433.         move.w    #$2f,-(a7)
  434.         trap    #1
  435.         addq.l    #2,a7
  436.         move.l    d0,d7
  437.  
  438.         clr.w    -(a7)
  439.         move.l    d5,-(a7)
  440.         move.w    #$3d,-(a7)
  441.         trap    #1
  442.         addq.l    #8,a7
  443.  
  444.         move.w    d0,d6
  445.         clr.l tmp_read
  446.         pea    tmp_read
  447.         move.l    #8,-(a7)
  448.         move.w    d0,-(a7)
  449.         move.w    #$3f,-(a7)
  450.         trap    #1
  451.         lea    12(a7),a7
  452.         move.w    d6,-(a7)
  453.         move.w    #$3e,-(a7)
  454.         trap    #1
  455.         addq.l    #4,a7
  456.         lea    tmp_read,a0
  457.         cmp.l    #"LSD!",(a0)
  458.         bne.s    doont
  459.         move.l    d7,a1
  460.         move.l    4(a0),26(a1)
  461. doont        clr.l    d0
  462. exit_route    clr.w    inside
  463.         move.l    d0,-(a7)
  464.         movem.l    reg,a0-a6/d0-d7
  465.         move.l    (a7)+,d0
  466.         rte
  467.  
  468. reg        ds.l    16
  469. tmp_read    ds.l    4
  470. crunpos        dc.l 0
  471.  
  472. ;should now be capable of decoding from odd to odd addresses
  473. ;11th October 1989
  474.  
  475. DEPACK        adda.l #4,a0
  476.         move.w $ff8240,-(sp)
  477.         lea    crunpos(pc),a6
  478.         move.l a0,(a6)        ;save crunch position
  479.         move.b (a0)+,d5
  480.         lsl.w     #8,d5
  481.         move.b    (a0)+,d5
  482.         swap    d5
  483.         move.b    (a0)+,d5
  484.         lsl.w    #8,d5
  485.         move.b    (a0)+,d5
  486.         adda.l d5,a1
  487.         move.b    (a0),d0
  488.         lsl.w    #8,d0
  489.         move.b    1(a0),d0
  490.         swap    d0
  491.         move.b    2(a0),d0
  492.         lsl.w    #8,d0
  493.         move.b    3(a0),d0
  494.         adda.l     d0,a0
  495.         subq.l #4,a0
  496.         move.b    -2(a0),d0
  497.         lsl.w    #8,d0
  498.         move.b    -1(a0),d0
  499.         subq.l    #2,a0
  500.         tst.w    d0
  501.         bpl.s L_1
  502.         subq.l #1,a0
  503. L_1        move.b -(a0),d0
  504. L_2        lsl.b #1,d0
  505.         bne.s L_3
  506.         MOVE.B    -(A0),D0
  507.         ROXL.B    #1,D0
  508. L_3        BCC.S    L_10
  509.         CLR.W    D1
  510.         LSL.B    #1,D0
  511.         BNE.S    L_4
  512.         MOVE.B    -(A0),D0
  513.         ROXL.B    #1,D0
  514. L_4        BCC.S    L_9
  515.         LEA    NUMS(PC),A3
  516.         MOVEQ    #3,D3
  517. L_5        CLR.W    D1
  518.         MOVE.B    0(A3,D3.W),D2
  519.         EXT.W    D2
  520.         MOVEQ    #-1,D4
  521.         LSL.W    D2,D4
  522.         NOT.W    D4
  523.         SUBQ.W    #1,D2
  524. L_6        LSL.B    #1,D0
  525.         BNE.S    L_7
  526.         MOVE.B    -(A0),D0
  527.         ROXL.B    #1,D0
  528. L_7        ROXL.W    #1,D1
  529.         DBF    D2,L_6
  530.         TST.W    D3
  531.         BEQ.S    L_8
  532.         CMP.W    D1,D4
  533.         DBNE    D3,L_5
  534. L_8        MOVE.B    4(A3,D3.W),D2
  535.         EXT.W    D2
  536.         ADD.W    D2,D1
  537.         BRA    L_9
  538.  
  539. NUMS        DC.B    $0A,$03,$02,$02,$0E,$07,$04,$01
  540.  
  541. L_9        MOVE.B    -(A0),-(A1)
  542.         eor.w    #$5,$ff8240
  543.         DBF    D1,L_9
  544. L_10        MOVE.L    crunpos(pc),A3        ;get crunch position
  545.         ADDQ.L    #$8,A3
  546.         CMPA.L    A3,A0
  547.         BLE    BYENOW
  548.         LEA    NUMS2(PC),A3
  549.         MOVEQ    #3,D2
  550. L_11        LSL.B    #1,D0
  551.         BNE.S    L_12
  552.         MOVE.B    -(A0),D0
  553.         ROXL.B    #1,D0
  554. L_12        BCC.S    L_13
  555.         DBF    D2,L_11
  556. L_13        CLR.W    D1
  557.         ADDQ.W    #1,D2
  558.         MOVE.B    0(A3,D2.W),D3
  559.         BEQ.S    L_16
  560.         EXT.W    D3
  561.         SUBQ.W    #1,D3
  562. L_14        LSL.B    #1,D0
  563.         BNE.S    L_15
  564.         MOVE.B    -(A0),D0
  565.         ROXL.B    #1,D0
  566. L_15        ROXL.W    #1,D1
  567.         DBF    D3,L_14
  568. L_16        MOVE.B    5(A3,D2.W),D3
  569.         EXT.W    D3
  570.         ADD.W    D3,D1
  571.         BRA    L_161
  572.  
  573. NUMS2        DC.B    $0A,$02,$01,$00,$00,$0A,$06,$04,$03,$02
  574.  
  575. L_161        CMPI.W    #2,D1
  576.         BEQ.S    L_22
  577.         LEA    NUMS3(PC),A3
  578.         MOVEQ    #1,D3
  579. L_17        LSL.B    #1,D0
  580.         BNE.S    L_18
  581.         MOVE.B    -(A0),D0
  582.         ROXL.B    #1,D0
  583. L_18        BCC.S    L_19
  584.         DBF    D3,L_17
  585. L_19        ADDQ.W    #1,D3
  586.         CLR.W    D2
  587.         MOVE.B    0(A3,D3.W),D4
  588.         EXT.W    D4
  589. L_20        LSL.B    #1,D0
  590.         BNE.S    L_21
  591.         MOVE.B    -(A0),D0
  592.         ROXL.B    #1,D0
  593. L_21        ROXL.W    #1,D2
  594.         DBF    D4,L_20
  595.         LSL.W    #1,D3
  596.         ADD.W    4(A3,D3.W),D2
  597.         BRA.S    L_26
  598.  
  599. NUMS3        DC.B    $0B,$04,$07,$00,$01,$20,$00,$00
  600.         DC.B    $00,$20,$00,$00
  601.  
  602. L_22        CLR.W    D2
  603.         MOVEQ    #5,D3
  604.         CLR.W    D4
  605.         LSL.b    #1,D0
  606.         BNE.S    L_23
  607.         MOVE.B    -(A0),D0
  608.         ROXL.B    #1,D0
  609. L_23        BCC.S    L_24
  610.         MOVEQ    #8,D3
  611.         MOVEQ    #$40,D4
  612. L_24        LSL.B    #1,D0
  613.         BNE.S    L_25
  614.         MOVE.B    -(A0),D0
  615.         ROXL.B    #1,D0
  616. L_25        ROXL.W    #1,D2
  617.         DBF    D3,L_24
  618.         ADD.W    D4,D2
  619. L_26        LEA    0(A1,D2.W),A2
  620.         EXT.L    D1
  621.         ADDA.L    D1,A2
  622.         SUBQ.W    #1,D1
  623. L_27        MOVE.B    -(A2),-(A1)
  624.         DBF    D1,L_27
  625.         BRA    L_2
  626. BYENOW        move.w (a7)+,$ff8240
  627.         RTS
  628. stksav        dc.l 0
  629. in_use        ds.l    1
  630. inside        ds.l    1
  631. buff_add    ds.l    1
  632. whereto        ds.l    1
  633. so_read        dcb.l    0,max_files
  634. f_lengths    dcb.l    0,max_files
  635. f_names        rept    max_files
  636.         dcb.b    0,60
  637.         endr
  638. real_hand    dcb.l 0,max_files
  639. i_buff        ds.l     1
  640. i_len        ds.l     1
  641. buff_start    dc.l    0    ;start of buffer space
  642.  
  643.     
  644.