home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / manutenzione / smartinfo / sfs / customclass.asm next >
Assembly Source File  |  1999-10-26  |  17KB  |  995 lines

  1. *-----------------------------------------------*
  2. *    @Defrag_AskMinMax            *
  3. *-----------------------------------------------*
  4.  
  5. Defrag_AskMinMax:
  6.     bsr    DoSuperMethod
  7.     move.l    4(a1),a0
  8.     add.w    #120,MMM_MinWidth(a0)
  9.     add.w    #4096,MMM_MaxWidth(a0)
  10.     add.w    #120,MMM_MinHeight(a0)
  11.     add.w    #4096,MMM_MaxHeight(a0)
  12.     add.w    #400,MMM_DefWidth(a0)        ; 513
  13.     add.w    #300,MMM_DefHeight(a0)        ; 641
  14.     moveq    #0,d0
  15.     rts
  16.  
  17. *-----------------------------------------------*
  18. *    @Tee_CustomClass            *
  19. *-----------------------------------------------*
  20.  
  21. Tee_CustomClass:
  22.     move.l    muimaster(a4),a6
  23.     suba.l    a0,a0                ; base
  24.     lea    MUIC_Area-t(a5),a1        ; supername
  25.     suba.l    a2,a2                ; supermcc
  26.     lea    DefragDispatcher(pc),a3
  27.     move.l    #4,d0
  28.     jsr    _LVOMUI_CreateCustomClass(a6)
  29.     move.l    d0,Defrag_mcc(a4)
  30.     rts
  31.  
  32. *-----------------------------------------------*
  33. *    DefragDispatcher            *
  34. *                        *
  35. *    A0    - IClass            *
  36. *    A1    - Msg                *
  37. *    A2    - Object            *
  38. *-----------------------------------------------*
  39.  
  40. DefragDispatcher:
  41.     move.l    (a1),d0                ; MethodID
  42.     cmp.l    #MUIM_Draw,d0
  43.     beq    Defrag_Draw
  44.     cmp.l    #MUIM_Oma_Render,d0
  45.     beq    Defrag_Oma_Render
  46.     cmp.l    #MUIM_Oma_ReDraw,d0
  47.     beq    Defrag_Oma_ReDraw
  48.     cmp.l    #MUIM_AskMinMax,d0
  49.     beq    Defrag_AskMinMax
  50.     cmp.l    #MUIM_Setup,d0
  51.     beq    Defrag_Setup
  52.     cmp.l    #MUIM_Cleanup,0
  53.     beq    Defrag_Cleanup
  54.     bra    DoSuperMethod
  55.  
  56. *-----------------------------------------------*
  57. *    @Defrag_Draw                *
  58. *-----------------------------------------------*
  59.  
  60. Defrag_Draw:
  61.     bsr    DoSuperMethod
  62.  
  63.     movem.l    d1-d7/a0-a6,-(sp)
  64.     lea    t,a5
  65.     move.l    (a5),a4
  66.  
  67.     tst.b    bfBitMapExists(a4)
  68.     beq.b    .pois
  69.  
  70.     move.l    4(a1),d0        ; flags
  71.     btst.l    #0,d0            ; DRAWOBJECT
  72.     bne.b    .draw_object
  73.     btst.l    #1,d0            ; DRAWUPDATE
  74.     beq.b    .pois
  75.  
  76.     move.l    RenderData(a4),d3
  77.     beq    .pois
  78.  
  79.     clr.l    RenderData(a4)
  80.  
  81.     bsr    .get_sizes
  82.  
  83.     move.l    d3,a3
  84.     move.l    gfxbase(a4),a6
  85.  
  86.     tst.l    lastblocks(a4)
  87.     beq.b    .ohita
  88.  
  89. .loop    move.l    lastread(a4),d1
  90.     move.l    lastblocks(a4),d2
  91.     moveq    #0,d0
  92.     bsr    render
  93.     move.l    lastwritten(a4),d1
  94.     move.l    lastblocks(a4),d2
  95.     move.w    UsedPen+2(a4),d0    ; #1
  96.     bsr    render
  97.  
  98. .ohita    cmp.l    #'MOVE',(a3)
  99.     bne.b    .pois            ; esim. DONE
  100.     cmp.l    #3,4(a3)
  101.     bne.b    .skip
  102.  
  103.     move.l    12(a3),d1
  104.     move.l    8(a3),d2
  105.     move.w    RemovedPen+2(a4),d0    ; #2
  106.  
  107.     move.l    d1,lastread(a4)
  108.     move.l    d2,lastblocks(a4)
  109.  
  110.     bsr    render
  111.  
  112.     move.l    16(a3),d1
  113.     move.l    8(a3),d2
  114.     move.w    NewPen+2(a4),d0        ; #3
  115.     move.l    d1,lastwritten(a4)
  116.     bsr    render
  117.  
  118.     move.l    8(a3),-(sp)
  119.     move.l    16(a3),-(sp)
  120.     move.l    btotal(a4),-(sp)
  121.     bsr    bmclr
  122.  
  123.     move.l    12(a3),4(sp)
  124.     bsr    bmset
  125.     add.w    #12,sp
  126.  
  127. .skip    move.l    4(a3),d0
  128.     lea    8(a3,d0.w*4),a3
  129.     tst.l    (a3)
  130.     bne.b    .loop
  131.  
  132. .pois    movem.l    (sp)+,d1-d7/a0-a6
  133.     moveq    #0,d0
  134.     rts
  135.  
  136. .draw_object:
  137.     bsr    .get_sizes
  138.  
  139.     tst.b    bfUpdatePens(a4)
  140.     beq.b    .init
  141.  
  142.     bsr    VapautaKynät
  143.     bsr    VaraaKynät
  144.     clr.b    bfUpdatePens(a4)
  145.  
  146. .init    bsr    InitField
  147.  
  148.     movem.l    (sp)+,d1-d7/a0-a6
  149.     moveq    #0,d0
  150.     rts
  151.  
  152. .get_sizes:
  153.     lea    MUI_NotifyData_SIZEOF(a2),a0
  154.     move.l    mad_RenderInfo(a0),a1
  155.     move.l    mri_RastPort(a1),MUI_RastPort(a4)
  156.  
  157.     move.w    mad_Box+ibox_Left(a0),d0
  158.     move.w    mad_Box+ibox_Top(a0),d1
  159.     add.b    mad_addleft(a0),d0
  160.     add.b    mad_addtop(a0),d1
  161.     move.w    d0,MUI_LeftOffset+2(a4)
  162.     move.w    d1,MUI_TopOffset+2(a4)
  163.  
  164.     move.w    mad_Box+ibox_Width(a0),d0
  165.     move.w    mad_Box+ibox_Height(a0),d1
  166.     sub.b    mad_subwidth(a0),d0
  167.     sub.b    mad_subheight(a0),d1
  168.     move.w    d0,MUI_Width+2(a4)
  169.     move.w    d1,MUI_Height+2(a4)
  170.     rts
  171.  
  172. *-----------------------------------------------*
  173. *    @Defrag_Oma_ReDraw            *
  174. *-----------------------------------------------*
  175.  
  176. Defrag_Oma_ReDraw:
  177.     movem.l    d0-d1/a0-a1/a6,-(sp)
  178.     move.l    b+muimaster,a6
  179.     move.l    a2,a0
  180.     move.l    #MADF_DRAWOBJECT,d0
  181.     jsr    _LVOMUI_Redraw(a6)
  182.     movem.l    (sp)+,d0-d1/a0-a1/a6
  183.     rts
  184.  
  185. *-----------------------------------------------*
  186. *    @Defrag_Oma_Render            *
  187. *-----------------------------------------------*
  188.  
  189. Defrag_Oma_Render:
  190.     movem.l    d0-d1/a0-a1/a6,-(sp)
  191.     move.l    b+muimaster,a6
  192.     move.l    a2,a0
  193.     move.l    #MADF_DRAWUPDATE,d0
  194.     jsr    _LVOMUI_Redraw(a6)
  195.     movem.l    (sp)+,d0-d1/a0-a1/a6
  196.     rts
  197.  
  198. *-----------------------------------------------*
  199. *    @DoSuperMethod                *
  200. *-----------------------------------------------*
  201.  
  202. DoSuperMethod:
  203.     movem.l    a0-a1,-(sp)
  204.     move.l    a2,d0            ; be safe (object)
  205.     beq.b    cmreturn
  206.     move.l    a0,d0            ; be safe (class)
  207.     beq.b    cmreturn
  208.     move.l    h_SIZEOF+4(a0),a0    ; substitute superclass
  209.     pea.l    cmreturn(pc)        ; cminvoke
  210.     move.l    h_Entry(a0),-(sp)
  211.     rts
  212. cmreturn:
  213.     movem.l    (sp)+,a0-a1
  214.     rts
  215.  
  216. *-----------------------------------------------*
  217. *    @render                    *
  218. *-----------------------------------------------*
  219. ;void render(ULONG block, ULONG blocks, WORD pen)
  220. ;        d1        d2    d0
  221.  
  222. render:    movem.l    d3-d7,-(sp)
  223.  
  224.     ;  ULONG firstunit=block/bpu;
  225.     move.l    d1,d4
  226.     divul.l    bpu(a4),d4
  227.     ;  ULONG lastunit=(block+blocks-1)/bpu;
  228.     add.l    d1,d2
  229.     subq.l    #1,d2
  230.     divul.l    bpu(a4),d2
  231.  
  232.     and.l    #$ffff,d0
  233.     move.l    MUI_RastPort(a4),a1
  234.     jsr    _LVOSetAPen(a6)
  235.  
  236.     ;  line=firstunit / uhor;
  237.     move.l    uhor(a4),d0
  238.     move.l    d4,d3
  239.     divul.l    d0,d3
  240.     ;  offset=firstunit % uhor;
  241.     move.l    uhor(a4),d0
  242.     divul.l    d0,d0:d4
  243.     move.l    d0,d4
  244.     ;  endline=lastunit / uhor;
  245.     move.l    uhor(a4),d0
  246.     move.l    d2,d1
  247.     divul.l    d0,d1
  248.     move.l    d1,endline(a4)
  249.     ;  endoffset=lastunit % uhor;
  250.     move.l    uhor(a4),d0
  251.     divul.l    d0,d0:d2
  252.     move.l    d0,d7
  253.     ;  for(;;
  254. L62
  255.     ;    if(line==endline) 
  256.     cmp.l    endline(a4),d3
  257.     bne    L67
  258. L63
  259.     ;      i=uh;
  260.     move.l    uh(a4),d2
  261.     ;      while(i-->0) 
  262.     bra    L65
  263.  
  264. L64    ;    Move(rastport, dx + offset * uw, dy + line * uh + i);
  265.     move.l    MUI_TopOffset(a4),d1
  266.     move.l    uh(a4),d0
  267.     mulu.l    d3,d0
  268.     add.l    d0,d1
  269.     moveq    #0,d0
  270.     move.w    d2,d0
  271.     add.l    d0,d1
  272.     move.l    MUI_LeftOffset(a4),d0
  273.     move.l    uw(a4),d5
  274.     mulu.l    d4,d5
  275.     add.l    d5,d0
  276.     move.l    MUI_RastPort(a4),a1
  277.     jsr    _LVOMove(a6)
  278.     ;    Draw(rastport, dx + endoffset * uw + uw-1, dy + line * uh + i);
  279.     move.l    MUI_TopOffset(a4),d1
  280.     move.l    uh(a4),d0
  281.     mulu.l    d3,d0
  282.     add.l    d0,d1
  283.     moveq    #0,d0
  284.     move.w    d2,d0
  285.     add.l    d0,d1
  286.     move.l    MUI_LeftOffset(a4),d0
  287.     move.l    uw(a4),d5
  288.     mulu.l    d7,d5
  289.     add.l    d5,d0
  290.     move.l    uw(a4),d5
  291.     add.l    d5,d0
  292.     subq.l    #1,d0
  293.     move.l    MUI_RastPort(a4),a1
  294.     jsr    _LVODraw(a6)
  295. L65    move.w    d2,d0
  296.     subq.w    #1,d2
  297.     tst.w    d0
  298.     bne    L64
  299.     bra    L72
  300.  
  301. L67
  302.     ;      i=uh;
  303.     move.l    uh(a4),d2
  304.     ;      while(i-->0) 
  305.     bra    L69
  306. L68
  307.     ;    Move(rastport, dx + offset * uw, dy + line * uh + i);
  308.     move.l    MUI_TopOffset(a4),d1
  309.     move.l    uh(a4),d0
  310.     mulu.l    d3,d0
  311.     add.l    d0,d1
  312.     moveq    #0,d0
  313.     move.w    d2,d0
  314.     add.l    d0,d1
  315.     move.l    MUI_LeftOffset(a4),d0
  316.     move.l    uw(a4),d5
  317.     mulu.l    d4,d5
  318.     add.l    d5,d0
  319.     move.l    MUI_RastPort(a4),a1
  320.     jsr    _LVOMove(a6)
  321.     ;    Draw(rastport, dx + (uhor * uw) - 1, dy + line * uh + i);
  322.     move.l    MUI_TopOffset(a4),d1
  323.     move.l    uh(a4),d0
  324.     mulu.l    d3,d0
  325.     add.l    d0,d1
  326.     moveq    #0,d0
  327.     move.w    d2,d0
  328.     add.l    d0,d1
  329.     move.l    MUI_LeftOffset(a4),d0
  330.     move.l    uhor(a4),d5
  331.     mulu.l    uw(a4),d5
  332.     add.l    d5,d0
  333.     subq.l    #1,d0
  334.     move.l    MUI_RastPort(a4),a1
  335.     jsr    _LVODraw(a6)
  336. L69
  337.     move.w    d2,d0
  338.     subq.w    #1,d2
  339.     tst.w    d0
  340.     bne    L68
  341. L70
  342. ;    line++;
  343.     addq.l    #1,d3
  344. ;    offset=0;
  345.     moveq    #0,d4
  346. L71
  347.     bra    L62
  348. L72
  349.     movem.l    (sp)+,d3-d7
  350.     rts
  351.  
  352. *-----------------------------------------------*
  353. *    @bfset                    *
  354. *-----------------------------------------------*
  355. ;ULONG bfset(ULONG data,WORD bitoffset,WORD bits) 
  356.  
  357. bfset:    movem.l    d2/d3,-(a7)
  358.     move.l    $C(a7),d0
  359.     move.w    $12(a7),d1
  360.     move.w    $10(a7),d2
  361. L102
  362. ;  mask=~((1<<(32-bits))-1);
  363.     ext.l    d1
  364.     moveq    #$20,d3
  365.     sub.l    d1,d3
  366.     moveq    #1,d1
  367.     asl.l    d3,d1
  368.     subq.l    #1,d1
  369.     not.l    d1
  370. ;  mask>>=bitoffset;
  371.     ext.l    d2
  372.     lsr.l    d2,d1
  373.     or.l    d1,d0
  374.     movem.l    (a7)+,d2/d3
  375.     rts
  376.  
  377. *-----------------------------------------------*
  378. *    @bfclr                    *
  379. *-----------------------------------------------*
  380. ;ULONG bfclr(ULONG data,WORD bitoffset,WORD bits) 
  381.  
  382. bfclr:    movem.l    d2/d3,-(a7)
  383.     move.l    $C(a7),d0
  384.     move.w    $12(a7),d1
  385.     move.w    $10(a7),d2
  386.     ;  mask=~((1<<(32-bits))-1);
  387.     ext.l    d1
  388.     moveq    #$20,d3
  389.     sub.l    d1,d3
  390.     moveq    #1,d1
  391.     asl.l    d3,d1
  392.     subq.l    #1,d1
  393.     not.l    d1
  394.     ;  mask>>=bitoffset;
  395.     ext.l    d2
  396.     lsr.l    d2,d1
  397.     not.l    d1
  398.     and.l    d1,d0
  399.     movem.l    (a7)+,d2/d3
  400.     rts
  401.  
  402. *-----------------------------------------------*
  403. *    @bmclr                    *
  404. *-----------------------------------------------*
  405. ;LONG bmclr(LONG longs,LONG bitoffset,LONG bits) 
  406.  
  407. bmclr:    movem.l    d2-d5/a2,-(sp)
  408.     move.l    32(sp),d2
  409.     move.l    24(sp),d3
  410.     move.l    28(sp),d4
  411.  
  412.     move.l    DefragBitMap(a4),a0
  413.  
  414.     ;  ULONG *scan=bitmap;
  415.     move.l    a0,a2
  416.     ;  LONG orgbits=bits;
  417.     move.l    d2,d5
  418.     ;  longoffset=bitoffset>>5;
  419.     move.l    d4,d0
  420.     asr.l    #5,d0
  421. ;  longs-=longoffset;
  422.     sub.l    d0,d3
  423. ;  scan+=longoffset;
  424.     asl.l    #2,d0
  425.     add.l    d0,a2
  426. ;  bitoffset=bitoffset & 0x1F;
  427.     and.l    #$1F,d4
  428. ;  if(bitoffset!=0) 
  429.     beq.b    L114
  430. L105
  431. ;    if(bits<32) 
  432.     cmp.l    #32,d2
  433.     bge.b    L107
  434. L106
  435. ;      *scan=bfclr(*scan,bitoffset,bits);
  436.     move.w    d2,-(a7)
  437.     move.w    d4,-(a7)
  438.     move.l    (a2),-(a7)
  439.     bsr    bfclr
  440.     addq.w    #$8,a7
  441.     move.l    d0,(a2)
  442.     bra.b    L108
  443. L107
  444. ;      *scan=bfclr(*scan,bitoffset,32);
  445.     move.w    #$20,-(a7)
  446.     move.w    d4,-(a7)
  447.     move.l    (a2),-(a7)
  448.     bsr    bfclr
  449.     addq.w    #$8,a7
  450.     move.l    d0,(a2)
  451. L108
  452. ;    scan++;
  453.     addq.w    #4,a2
  454. ;    longs--;
  455.     subq.l    #1,d3
  456. ;    bits-=32-bitoffset;
  457.     moveq    #$20,d0
  458.     sub.l    d4,d0
  459.     sub.l    d0,d2
  460. L109
  461. ;  while(bits>0 && longs-->0) 
  462.     bra.b    L114
  463. L110
  464. ;    if(bits>31) 
  465.     cmp.l    #$1F,d2
  466.     ble.b    L112
  467. L111
  468. ;      *scan++=0;
  469.     clr.l    (a2)+
  470.     bra.b    L113
  471. L112
  472. ;      *scan=bfclr(*scan,0,bits);
  473.     move.w    d2,-(a7)
  474.     clr.w    -(a7)
  475.     move.l    (a2),-(a7)
  476.     bsr    bfclr
  477.     addq.w    #8,a7
  478.     move.l    d0,(a2)
  479. L113
  480. ;    bits-=32;
  481.     sub.l    #$20,d2
  482. L114
  483.     cmp.l    #0,d2
  484.     ble.b    L116
  485. L115
  486.     move.l    d3,d0
  487.     subq.l    #1,d3
  488.     cmp.l    #0,d0
  489.     bgt.b    L110
  490. L116
  491. ;  if(bits<=0) 
  492.     cmp.l    #0,d2
  493.     bgt.b    L118
  494. L117
  495.     move.l    d5,d0
  496.     movem.l    (a7)+,d2-d5/a2
  497.     rts
  498. L118
  499.     move.l    d5,d0
  500.     sub.l    d2,d0
  501.     movem.l    (a7)+,d2-d5/a2
  502.     rts
  503.  
  504. *-----------------------------------------------*
  505. *    @bmset                    *
  506. *-----------------------------------------------*
  507. ;LONG bmset(LONG longs,LONG bitoffset,LONG bits) 
  508.  
  509. bmset:    movem.l    d2-d5/a2,-(a7)
  510.     move.l    32(a7),d2
  511.     move.l    24(a7),d3
  512.     move.l    28(a7),d4
  513.  
  514.     move.l    DefragBitMap(a4),a0
  515.  
  516.     ;  ULONG *scan=bitmap;
  517.     move.l    a0,a2
  518. ;  LONG orgbits=bits;
  519.     move.l    d2,d5
  520. ;  longoffset=bitoffset>>5;
  521.     move.l    d4,d0
  522.     asr.l    #5,d0
  523. ;  longs-=longoffset;
  524.     sub.l    d0,d3
  525. ;  scan+=longoffset;
  526.     asl.l    #2,d0
  527.     add.l    d0,a2
  528. ;  bitoffset=bitoffset & 0x1F;
  529.     and.l    #$1F,d4
  530. ;  if(bitoffset!=0) 
  531.     beq.b    L129
  532. L120
  533. ;    if(bits<32) 
  534.     cmp.l    #$20,d2
  535.     bge.b    L122
  536. L121
  537. ;      *scan=bfset(*scan,bitoffset,bits);
  538.     move.w    d2,-(a7)
  539.     move.w    d4,-(a7)
  540.     move.l    (a2),-(a7)
  541.     bsr    bfset
  542.     addq.w    #$8,a7
  543.     move.l    d0,(a2)
  544.     bra.b    L123
  545. L122
  546. ;      *scan=bfset(*scan,bitoffset,32);
  547.     move.w    #$20,-(a7)
  548.     move.w    d4,-(a7)
  549.     move.l    (a2),-(a7)
  550.     bsr    bfset
  551.     addq.w    #$8,a7
  552.     move.l    d0,(a2)
  553. L123
  554. ;    scan++;
  555.     addq.w    #4,a2
  556. ;    longs--;
  557.     subq.l    #1,d3
  558. ;    bits-=32-bitoffset;
  559.     moveq    #$20,d0
  560.     sub.l    d4,d0
  561.     sub.l    d0,d2
  562. L124
  563. ;  while(bits>0 && longs-->0) 
  564.     bra.b    L129
  565. L125
  566. ;    if(bits>31) 
  567.     cmp.l    #$1F,d2
  568.     ble.b    L127
  569. L126
  570. ;      *scan++=0xFFFFFFFF;
  571.     move.l    #-1,(a2)+
  572.     bra.b    L128
  573. L127
  574. ;      *scan=bfset(*scan,0,bits);
  575.     move.w    d2,-(a7)
  576.     clr.w    -(a7)
  577.     move.l    (a2),-(a7)
  578.     bsr    bfset
  579.     addq.w    #$8,a7
  580.     move.l    d0,(a2)
  581. L128
  582. ;    bits-=32;
  583.     sub.l    #$20,d2
  584. L129
  585.     cmp.l    #0,d2
  586.     ble.b    L131
  587. L130
  588.     move.l    d3,d0
  589.     subq.l    #1,d3
  590.     cmp.l    #0,d0
  591.     bgt.b    L125
  592. L131
  593. ;  if(bits<=0) 
  594.     cmp.l    #0,d2
  595.     bgt.b    L133
  596. L132
  597.     move.l    d5,d0
  598.     movem.l    (sp)+,d2-d5/a2
  599.     rts
  600. L133
  601.     move.l    d5,d0
  602.     sub.l    d2,d0
  603.     movem.l    (sp)+,d2-d5/a2
  604.     rts
  605.  
  606. *-----------------------------------------------*
  607. *    @bfffo                    *
  608. *-----------------------------------------------*
  609. ;WORD bfffo(ULONG data,WORD bitoffset) 
  610.  
  611. bfffo:    movem.l    d2-d4,-(sp)
  612.     move.w    20(sp),d0
  613.     move.l    16(sp),d3
  614.     ;  ULONG bitmask=1<<(31-bitoffset);
  615.     move.w    d0,d1
  616.     ext.l    d1
  617.     moveq    #$1F,d2
  618.     sub.l    d1,d2
  619.     moveq    #1,d1
  620.     asl.l    d2,d1
  621. ;  
  622. L75
  623. ;    if((data & bitmask)!=0) 
  624.     move.l    d3,d2
  625.     and.l    d1,d2
  626.     beq.b    L77
  627. L76
  628.     movem.l    (sp)+,d2-d4
  629.     rts
  630. L77
  631. ;    bitoffset++;
  632.     addq.w    #1,d0
  633. ;    bitmask>>=1;
  634.     lsr.l    #1,d1
  635.     tst.l    d1
  636.     bne.b    L75
  637. L78
  638.     moveq    #-1,d0
  639.     movem.l    (sp)+,d2-d4
  640.     rts
  641.  
  642. *-----------------------------------------------*
  643. *    @bmffo                    *
  644. *-----------------------------------------------*
  645. ;LONG bmffo(LONG longs,LONG bitoffset) 
  646.  
  647. bmffo:    movem.l    d2/d3/a2/a3,-(sp)
  648.     move.l    24(sp),d0
  649.     move.l    20(sp),d2
  650.     move.l    DefragBitMap(a4),a3
  651.  
  652. ;  ULONG *scan=bitmap;
  653. ;  longoffset=bitoffset>>5;
  654.     move.l    d0,d1
  655.     asr.l    #5,d1
  656. ;  longs-=longoffset;
  657.     sub.l    d1,d2
  658. ;  scan+=longoffset;
  659.     asl.l    #2,d1
  660.     lea    0(a3,d1.l),a2
  661. ;  bitoffset=bitoffset & 0x1F;
  662.     and.l    #$1F,d0
  663. ;  if(bitoffset!=0) 
  664.     beq.b    L91
  665. L85
  666. ;    if((bit=bfffo(*scan,bitoffset))>=0) 
  667.     move.w    d0,-(sp)
  668.     move.l    (a2),-(sp)
  669.     bsr    bfffo
  670.     addq.w    #6,sp
  671.     tst.w    d0
  672.     bmi.b    L87
  673. L86
  674.     ext.l    d0
  675.     move.l    a2,d1
  676.     sub.l    a3,d1
  677.     asr.l    #2,d1
  678.     asl.l    #5,d1
  679.     add.l    d1,d0
  680.     movem.l    (sp)+,d2/d3/a2/a3
  681.     rts
  682.  
  683. L87    ;    scan++;
  684.     addq.w    #4,a2
  685.     ;    longs--;
  686.     subq.l    #1,d2
  687. L88
  688. ;  while(longs-->0) 
  689.     bra.b    L91
  690. L89
  691. ;    if(*scan++!=0) 
  692.     tst.l    (a2)+
  693.     beq.b    L91
  694. L90
  695.     clr.w    -(sp)
  696.     move.l    -(a2),-(sp)
  697.     bsr    bfffo
  698.     addq.w    #6,sp
  699.     ext.l    d0
  700.     move.l    a2,d1
  701.     sub.l    a3,d1
  702.     asr.l    #2,d1
  703.     asl.l    #5,d1
  704.     add.l    d1,d0
  705.     movem.l    (sp)+,d2/d3/a2/a3
  706.     rts
  707. L91
  708.     move.l    d2,d0
  709.     subq.l    #1,d2
  710.     cmp.l    #0,d0
  711.     bgt.b    L89
  712. L92    ;      return
  713.     moveq    #-1,d0
  714.     movem.l    (sp)+,d2/d3/a2/a3
  715.     rts
  716.  
  717. *-----------------------------------------------*
  718. *    @bmffz                    *
  719. *-----------------------------------------------*
  720. ;LONG bmffz(LONG longs,LONG bitoffset) 
  721. bmffz    movem.l    d2/d3/a2/a3,-(sp)
  722.     move.l    24(sp),d0        ; bitoffset
  723.     move.l    20(sp),d2        ; longs
  724.     move.l    DefragBitMap(a4),a3
  725.  
  726. ;  ULONG *scan=bitmap;
  727. ;  longoffset=bitoffset>>5;
  728.  
  729.     move.l    d0,d1
  730.     asr.l    #5,d1
  731. ;  longs-=longoffset;
  732.     sub.l    d1,d2
  733. ;  scan+=longoffset;
  734.     asl.l    #2,d1
  735.     lea    0(a3,d1.l),a2
  736. ;  bitoffset=bitoffset & 0x1F;
  737.     and.l    #$1F,d0
  738. ;  if(bitoffset!=0) 
  739.     beq.b    .L100
  740. .L94    ;    if((bit=bfffz(*scan,bitoffset))>=0) 
  741.     move.w    d0,-(sp)
  742.     move.l    (a2),-(sp)
  743.     bsr    bfffz
  744.     addq.w    #6,sp
  745.     tst.w    d0
  746.     bmi.b    .L96
  747.  
  748. .L95    ext.l    d0
  749.     move.l    a2,d1
  750.     sub.l    a3,d1
  751.     asr.l    #2,d1
  752.     asl.l    #5,d1
  753.     add.l    d1,d0
  754.     movem.l    (sp)+,d2/d3/a2/a3
  755.     rts
  756.  
  757.     ;    scan++;
  758. .L96    addq.w    #4,a2
  759.     ;    longs--;
  760.     subq.l    #1,d2
  761. .L97    ;  while(longs-->0) 
  762.     bra.b    .L100
  763. .L98    ;    if(*scan++!=0xFFFFFFFF) 
  764.     move.l    (a2)+,d0
  765.     cmp.l    #-1,d0
  766.     beq.b    .L100
  767.  
  768. .L99    clr.w    -(sp)
  769.     move.l    -(a2),-(sp)
  770.     bsr    bfffz
  771.     addq.w    #6,sp
  772.     ext.l    d0
  773.     move.l    a2,d1
  774.     sub.l    a3,d1
  775.     asr.l    #2,d1
  776.     asl.l    #5,d1
  777.     add.l    d1,d0
  778.     movem.l    (sp)+,d2/d3/a2/a3
  779.     rts
  780.  
  781. .L100    move.l    d2,d0
  782.     subq.l    #1,d2
  783.     cmp.l    #0,d0
  784.     bgt.b    .L98
  785.  
  786. .L101    ;      return
  787.     moveq    #-1,d0
  788.     movem.l    (sp)+,d2/d3/a2/a3
  789.     rts
  790.  
  791. *-----------------------------------------------*
  792. *    @bfffz                    *
  793. *-----------------------------------------------*
  794. ;WORD bfffz(ULONG data,WORD bitoffset) 
  795.  
  796. bfffz:    movem.l    d2-d4,-(sp)
  797.     move.w    20(sp),d0
  798.     move.l    16(sp),d3
  799. L79
  800.     ;  ULONG bitmask=1<<(31-bitoffset);
  801.     move.w    d0,d1
  802.     ext.l    d1
  803.     moveq    #$1F,d2
  804.     sub.l    d1,d2
  805.     moveq    #1,d1
  806.     asl.l    d2,d1
  807. ;  
  808. L80
  809. ;    if((data & bitmask)==0) 
  810.     move.l    d3,d2
  811.     and.l    d1,d2
  812.     bne.b    L82
  813. L81
  814.     movem.l    (sp)+,d2-d4
  815.     rts
  816. L82
  817. ;    bitoffset++;
  818.     addq.w    #1,d0
  819. ;    bitmask>>=1;
  820.     lsr.l    #1,d1
  821.     tst.l    d1
  822.     bne.b    L80
  823. L83
  824.     moveq    #-1,d0
  825.     movem.l    (sp)+,d2-d4
  826.     rts
  827.  
  828. *-----------------------------------------------*
  829. *    @ReCalc                    *
  830. *-----------------------------------------------*
  831.  
  832. *    D5 - units
  833. *    D6 - uhor
  834. *    D7 - uver
  835.  
  836. ReCalc:
  837.     moveq    #0,d2
  838.     moveq    #0,d3
  839.     moveq    #0,d4
  840.     moveq    #16,d0
  841.     lea    pixw-t(a5),a0
  842.     lea    pixh-t(a5),a1
  843.  
  844. .loop    move.b    0(a0,d0.w),d3    ; uw
  845.     move.b    0(a1,d0.w),d4    ; uh
  846.     ;    uw    = pixw[i];
  847.     ;    uh    = pixh[i];
  848.     move.l    d3,d1
  849.     mulu.w    d4,d1        ; uw * uh
  850.     move.l    d1,ppu(a4)
  851.  
  852.     move.l    MUI_Width(a4),d6
  853.     divsl.l    d3,d6        ; w/uw=uhor
  854.  
  855.     move.l    MUI_Height(a4),d7
  856.     divsl.l    d4,d7        ; h/uh=uver
  857.  
  858.     move.l    d6,d5
  859.     mulu.w    d7,d5        ; uhor * uver = units
  860.  
  861.     move.l    MUI_TotalBlocks(a4),d1
  862.     add.l    d5,d1
  863.     subq.l    #1,d1        ; blocks_total+units-1
  864.     divul.l    d5,d1
  865.  
  866.     cmp.l    #1,d1
  867.     bhi.b    .L54
  868.     bra.b    .L57
  869.  
  870. .L54    subq.w    #1,d0
  871.     tst.w    d0
  872.     bpl.b    .loop
  873.  
  874. .L57    ;  if(bpu==0) 
  875.     tst.l    d1
  876.     bne.b    .L59
  877.     ;    bpu=1;
  878.     move.l    #1,d1
  879. .L59    move.l    d1,bpu(a4)
  880.     move.l    d3,uw(a4)
  881.     move.l    d4,uh(a4)
  882.     move.l    d6,uhor(a4)
  883.     move.l    d7,uver(a4)
  884.     rts
  885.  
  886. *-----------------------------------------------*
  887. *    @InitField                *
  888. *-----------------------------------------------*
  889.  
  890. InitField:
  891.     bsr    ReCalc
  892.  
  893.     ;  ULONG current=0;
  894.     moveq    #0,d2
  895.     move.l    MUI_TotalBlocks(a4),d3
  896.  
  897.     ;  while(current<blocks_total)
  898.  
  899.     move.l    gfxbase(a4),a6
  900.     bra.b    .ohita
  901.  
  902. *    D2 - current
  903.  
  904. .loop    ;    start=bmffz((blocks_total+31)/32, current);
  905.     move.l    d2,-(sp)
  906.     move.l    btotal(a4),-(sp)
  907.     bsr    bmffz
  908.     move.l    d0,d4            ; start
  909.  
  910.     ;    end=bmffo((blocks_total+31)/32, start);
  911.     move.l    d0,4(sp)        ; start
  912.     bsr    bmffo
  913.     add.w    #8,sp
  914.     move.l    d0,d2
  915.     ;    if(end==-1) 
  916.     addq.l    #1,d0
  917.     bne.b    .jatka            ; jos <> -1
  918.     ;      end=blocks_total;
  919.     move.l    d3,d2
  920.  
  921. .jatka    ;    render(start, end-start, 1)(d1,d2,d0)
  922.     move.l    d2,d7
  923.     move.w    UsedPen+2(a4),d0    ; #1
  924.     sub.l    d4,d2            ; end-start
  925.     move.l    d4,d1            ; start
  926.     bsr    render
  927.     move.l    d7,d2
  928.     ;    current=end;
  929.  
  930.     ;  while(current<blocks_total)
  931. .ohita    cmp.l    d3,d2
  932.     blo.b    .loop
  933.     rts
  934.  
  935. *-----------------------------------------------*
  936. *    @Defrag_Setup                *
  937. *-----------------------------------------------*
  938.  
  939. Defrag_Setup:
  940.     bsr    DoSuperMethod
  941.     tst.l    d0
  942.     beq.b    .x
  943.     movem.l    d1-d2/a0-a4/a6,-(sp)
  944.     move.l    #b,a4
  945.     move.l    4(a1),RenderInfo(a4)
  946.     move.l    muimaster(a4),a6
  947.     bsr    VaraaKynät
  948.     movem.l    (sp)+,d1-d2/a0-a4/a6
  949.     move.l    #TRUE,d0
  950. .x    rts
  951.  
  952. *-----------------------------------------------*
  953. *    @VaraaKynät                *
  954. *-----------------------------------------------*
  955.  
  956. VaraaKynät:
  957.     lea    PenSpec1(a4),a2
  958.     lea    MyPen(a4),a3
  959.  
  960.     moveq    #2,d2
  961.  
  962. .loop    move.l    RenderInfo(a4),a0
  963.     move.l    (a2)+,a1
  964.     moveq    #0,d0
  965.     jsr    _LVOMUI_ObtainPen(a6)
  966.     move.l    d0,(a3)+
  967.     dbf    d2,.loop
  968.     rts
  969.  
  970. *-----------------------------------------------*
  971. *    @Defrag_Cleanup                *
  972. *-----------------------------------------------*
  973.  
  974. Defrag_Cleanup:
  975.     movem.l    d1-d2/a0-a2/a4/a6,-(sp)
  976.     move.l    #b,a4
  977.     bsr    VapautaKynät
  978.     movem.l    (sp)+,d1-d2/a0-a2/a4/a6
  979.     bra    DoSuperMethod
  980.  
  981. *-----------------------------------------------*
  982. *    @VapautaKynät                *
  983. *-----------------------------------------------*
  984.  
  985. VapautaKynät:
  986.     move.l    muimaster(a4),a6
  987.     moveq    #2,d2
  988.     lea    MyPen(a4),a2
  989.  
  990. .loop    move.l    RenderInfo(a4),a0
  991.     move.l    (a2)+,d0
  992.     jsr    _LVOMUI_ReleasePen(a6)
  993.     dbf    d2,.loop
  994.     rts
  995.