home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga Shareware Floppies / ma35.dms / ma35.adf / Grawitacja / Program / source.lha / Circle.S < prev    next >
Encoding:
Text File  |  1995-03-14  |  17.9 KB  |  810 lines

  1. ;//////////////////////////////////////////////////////////////////////////////
  2. ;
  3. ;            Procedury wspomagajâce animacjë programu Grawitacja.
  4. ;                Autor: Grzegorz Malewicz   Kielce, 1993-10-03
  5. ;
  6. ;                                 Mój adres:
  7. ;                   ul. Alabastrowa 56 Kielce  25705 POLAND
  8. ;
  9. ;   Jeôli chcesz wykorzystaê którâô z poniûszych procedur lub dokonaê zmian
  10. ;                 w programie MUSISZ uzyskaê zgodë autora!!!
  11. ;
  12. ;   DO ASEMBLACJI SAS/C 680x0 Assembler V6.00. Uzyskany object file naleûy
  13. ;                doîâczyê przy konsolidacji programu gîównego
  14. ;
  15. ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  16.  
  17. bm_BytesPerRow    EQU    0
  18. bm_Rows        EQU    2
  19. bm_Flags    EQU    4
  20. bm_Depth    EQU    5
  21. bm_Pad        EQU    6
  22. bm_Planes    EQU    8
  23.  
  24. MEMF_ANY    EQU    0
  25.  
  26. _LVOAllocMem    EQU    -198
  27. _LVOFreeMem    EQU    -210
  28.  
  29.         XDEF    _CircleInit
  30.         XDEF    _Circle
  31.         XDEF    _RemoveCircles
  32.         XDEF    _ResetBoxPtrs
  33.         XDEF    _CircleEnd
  34.  
  35.         XDEF    _ClearPlaneInit
  36.         XDEF    _ClearPlane
  37.                 
  38.                 XDEF    _LMB
  39.                 XDEF    _RMB
  40.  
  41.         section    code,code
  42.  
  43. ;------------------------------------------------------------------------------
  44. ;   Procedura inicjuje tablicë przesuniëê do linii ekranu oraz tablicë do
  45. ; usuwania kóî _RemoveCircles. Procedura _CircleInit powinna byê wywoîana
  46. ; przed rysowaniem kóîek. Kóîka mogâ byê rysowane tylko gdy zwróci TRUE
  47. ;   WEJÔCIE: a4=BitMap
  48. ;            d0=screen width
  49. ;   WYJÔCIE: d0=0 - BÎÂD (FALSE)
  50. ;            d0=1 - OK   (TRUE)
  51. ;------------------------------------------------------------------------------
  52.  
  53. MAXCIAL        EQU    20    ;Uwaga zdefiniowana takûe w Graw.c, obie muszâ
  54.                 ;byê równe
  55. box_x        EQU    0
  56. box_y        EQU    2
  57. box_s        EQU    4
  58. box_sizeof    EQU    6
  59.  
  60. _CircleInit
  61.         movem.l    d2/a4/a6,-(a7)
  62.         move.w    d0,cir_width
  63.         move.l    bm_Planes(a4),cir_firstbpl
  64.     ;przydziel pamiëê na tablicë przesuniëê do linii
  65.         moveq.l    #0,d0
  66.         move.w    bm_Rows(a4),d0
  67.         beq    cirinit_err2
  68.         lsl.w    #2,d0
  69.         move.l    d0,cir_tabsize
  70.         move.l    #MEMF_ANY,d1
  71.         move.l    4,a6
  72.         jsr    _LVOAllocMem(a6)
  73.         move.l    d0,cir_tabaddr
  74.         beq    cirinit_err2
  75.     ;przydziel pamiëê na box do czyszczenia narysowanych kóîek
  76.         move.w    #MAXCIAL,d0
  77.         mulu.w    #box_sizeof,d0
  78.         add.l    d0,d0
  79.         move.l    d0,cir_boxessize
  80.         move.l    #MEMF_ANY,d1
  81.         move.l    4,a6
  82.         jsr    _LVOAllocMem(a6)
  83.         move.l    d0,cir_boxesaddr
  84.         beq    cirinit_err1
  85.         move.l    d0,cir_box1begin
  86.         move.l    d0,cir_box1ptr
  87.         move.l    cir_boxessize,d1
  88.         lsr.l    #1,d1
  89.         add.l    d1,d0
  90.         move.l    d0,cir_box2begin
  91.         move.l    d0,cir_box2ptr
  92.     ;zapisz wysokoôê bitplanu
  93.         move.w    bm_Rows(a4),cir_height
  94.     ;okreôê szerokoôê widocznej czëôci bitplanu w bajtach
  95.         move.w    cir_width,d0
  96.         move.w    d0,d1
  97.         lsr.w    #3,d0
  98.         and.w    #$0007,d1
  99.         beq    cirinit_d1
  100.         addq.w    #1,d0
  101. cirinit_d1    subq.w    #1,d0
  102.         move.w    d0,cir_bwidth
  103.     ;wypeîï tablicë przesuniëciami do linii
  104.         move.l    cir_tabaddr,a0
  105.         moveq.l    #0,d0
  106.         move.l    d0,d2
  107.         move.w    bm_Rows(a4),d1
  108.         move.w    bm_BytesPerRow(a4),d2
  109.         subq.w    #1,d1
  110. cirinit_p1    move.l    d0,(a0)+
  111.         add.l    d2,d0
  112.         dbf    d1,cirinit_p1
  113.         movem.l    (a7)+,d2/a4/a6
  114.         moveq.l    #1,d0
  115.         rts
  116. cirinit_err1    move.l    cir_tabaddr,a1
  117.         move.l    cir_tabsize,d0
  118.         move.l    4,a6
  119.         jsr    _LVOFreeMem(a6)
  120. cirinit_err2    movem.l    (a7)+,d2/a4/a6
  121.         moveq.l    #0,d0
  122.         rts
  123.  
  124. cir_tabaddr    dc.l    0
  125. cir_tabsize    dc.l    0
  126.  
  127. cir_boxesaddr    dc.l    0
  128. cir_boxessize    dc.l    0
  129.  
  130. cir_box1begin    dc.l    0
  131. cir_box1ptr    dc.l    0
  132. cir_box2begin    dc.l    0
  133. cir_box2ptr    dc.l    0
  134.  
  135. cir_width    dc.w    0
  136. cir_bwidth    dc.w    0
  137. cir_height    dc.w    0
  138.  
  139. cir_firstbpl    dc.l    0
  140.  
  141. ;------------------------------------------------------------------------------
  142. ;   Procedura zwalniajâca pamiëê po inicjacji _CircleInit. Powinna byê
  143. ; wywoîana po narysowyniu kóîek. Moûna jâ woîaê nawet gdy inicjacja zwróciîa
  144. ; FALSE
  145. ;------------------------------------------------------------------------------
  146.  
  147. _CircleEnd
  148.         movem.l    a6,-(a7)
  149.         move.l    cir_tabaddr,d0
  150.         beq    cirend_d1
  151.         move.l    d0,a1
  152.         move.l    #0,cir_tabaddr
  153.         move.l    cir_tabsize,d0
  154.         move.l    4,a6
  155.         jsr    _LVOFreeMem(a6)
  156. cirend_d1    move.l    cir_boxesaddr,d0
  157.         beq    cirend_d2
  158.         move.l    d0,a1
  159.         move.l    #0,cir_boxesaddr
  160.         move.l    cir_boxessize,d0
  161.         move.l    4,a6
  162.         jsr    _LVOFreeMem(a6)
  163. cirend_d2    movem.l    (a7)+,a6
  164.         rts
  165.         
  166. ;------------------------------------------------------------------------------
  167. ;  Procedura przygotowuje parametry dla _ClearPlane
  168. ; WEJÔCIE: a4=BitMap
  169. ;------------------------------------------------------------------------------
  170.  
  171. _ClearPlaneInit
  172.         movem.l    d2/d3/a4,-(a7)
  173.     ;zapisz rozmiar bitplanu
  174.         moveq.l    #0,d0
  175.         move.l    d0,d2
  176.         move.w    bm_Rows(a4),d1
  177.         move.w    bm_BytesPerRow(a4),d2
  178.         move.w    d1,d3
  179.         mulu.w    d2,d3
  180.         move.l    d3,clr_planesize
  181.     ;zapisz iloôê paczek po 52 bajty zawartych w bitplanie - 1
  182.         divu.w    #52,d3
  183.         subq.w    #1,d3
  184.         move.w    d3,clr_ilepack
  185.     ;zapisz iloôê pozostaîych bajtów - 1
  186.         swap    d3
  187.         subq.w    #1,d3
  188.         move.w    d3,clr_ileleft
  189.         movem.l    (a7)+,d2/d3/a4
  190.         rts
  191.  
  192. clr_planesize    dc.l    0
  193. clr_ilepack    dc.w    0
  194. clr_ileleft    dc.w    0
  195.  
  196. ;------------------------------------------------------------------------------
  197. ;   Procedura czyôci bitplan. Jego rozmiar jest ustalany przez _ClearPlaneInit
  198. ; Z tego wzglëdu naleûy obowiâzkowo wywoîaê _ClearPlaneInit przed _ClearPlane
  199. ; WEJÔCIE: a6=adres bitplanu
  200. ;------------------------------------------------------------------------------
  201.  
  202. _ClearPlane
  203.         movem.l    d2-d7/a2-a6,-(a7)
  204.     ;weú adres koïca bitplanu
  205.         move.l    clr_planesize,d0
  206.         add.l    d0,a6
  207.     ;wyzeruj rejestry
  208.         sub.l    d1,d1
  209.         move.w    clr_ilepack,d0
  210.         bmi    cp_d1
  211.         move.l    d1,d2
  212.         move.l    d1,d3
  213.         move.l    d1,d4
  214.         move.l    d1,d5
  215.         move.l    d1,d6
  216.         move.l    d1,d7
  217.         move.l    d1,a0
  218.         move.l    d1,a1
  219.         move.l    d1,a2
  220.         move.l    d1,a3
  221.         move.l    d1,a4
  222.         move.l    d1,a5
  223.     ;wypeîï packi
  224. cp_p1        movem.l    d1-d7/a0-a5,-(a6)    ;13*4=52 bajtów na raz
  225.         dbf    d0,cp_p1
  226.     ;dopeîï resztë
  227. cp_d1        move.w    clr_ileleft,d0
  228.         bmi    cp_d2
  229. cp_p2        move.b    d1,-(a6)
  230.         dbf    d0,cp_p2
  231. cp_d2        movem.l    (a7)+,d2-d7/a2-a6
  232.         rts
  233.  
  234. ;------------------------------------------------------------------------------
  235. ;   Procedura rysujâca linië poziomâ poczâwszy od punktu (x,y) o szerokoôci d.
  236. ; Linia jest rysowana w prawo od punktu. Przy rysowaniu zastosowany jest
  237. ; clipping. Z tego wzglëdu naleûy podaê szerokoôê i wysokoôê ekranu.
  238. ; WEJÔCIE: d6.w=x
  239. ;          d7.w=y
  240. ;          d2.w=d
  241. ;          a0=adres li_T1
  242. ;          a4=adres cir_bwidth
  243. ;          a5=adres cir_width
  244. ;          a6=adres cir_height
  245. ;          a2=adres spod adresu cir_tabaddr
  246. ;          a3=adres bitplanu
  247. ;------------------------------------------------------------------------------
  248.  
  249. Linia
  250.         movem.w    d0/d2/d6/d7,-(a7)
  251.     ;sprawdú szerokoôê
  252.         cmp.w    #1,d2
  253.         blt    li_niewidoczny
  254.     ;czy mieôci sië w zakresie na y
  255.         tst.w    d7
  256.         bmi    li_nad
  257.         move.w    (a6),d0
  258.         cmp.w    d0,d7
  259.         bcc    li_pod
  260.     ;co z x
  261.         tst.w    d6
  262.         bmi    li_xujemny
  263.         beq    li_xzerowy
  264.         move.w    (a5),d0
  265.         cmp.w    d6,d0
  266.         bls    li_poprawej
  267.         sub.w    d6,d0
  268.         cmp.w    d2,d0
  269.         bls    li_tillend
  270. ;na ôrodku
  271.         lsl.w    #2,d7
  272.         move.l    0(a2,d7.w),d7
  273.         move.l    a3,a1
  274.         adda.l    d7,a1            ;adres linii
  275.         move.w    d6,d7
  276.         lsr.w    #3,d7
  277.         lea    0(a1,d7.w),a1        ;adres bajtu
  278.         andi.w    #$0007,d6
  279.         beq    li_sd1
  280.         add.w    d6,d2
  281.         subq.w    #8,d2
  282.         bcs    li_sd3
  283.         move.b    8(a0,d6.w),d6
  284.         or.b    d6,(a1)+
  285. li_sd1        move.w    d2,d7            ;zaczyna sië równo z bajtem
  286.         lsr.w    #3,d7
  287.         beq    li_sd2
  288.         subq.w    #1,d7
  289.         moveq.l    #-1,d6
  290. li_p4        move.b    d6,(a1)+        ;wypeîï bajtami $ff
  291.         dbf    d7,li_p4
  292. li_sd2        andi.w    #$0007,d2        ;dopisz prawy koniec
  293.         beq    li_sd4
  294.         move.b    0(a0,d2.w),d2
  295.         or.b    d2,(a1)
  296. li_sd4        movem.w    (a7)+,d0/d2/d6/d7
  297.         rts
  298. li_sd3        move.b    8(a0,d6.w),d6        ;wszystko w jednym bajcie
  299.         move.b    8(a0,d2.w),d7
  300.         and.b    d7,d6
  301.         or.b    d6,(a1)
  302.         movem.w    (a7)+,d0/d2/d6/d7
  303.         rts
  304.         
  305. li_xujemny    neg.w    d6
  306.         sub.w    d6,d2
  307.         bls    li_polewej
  308. li_xzerowy
  309.         move.w    (a5),d0
  310.         cmp.w    d2,d0
  311.         bls    li_fullline
  312. ;od lewego brzegu do ôrodka
  313.         lsl.w    #2,d7
  314.         move.l    0(a2,d7.w),d7
  315.         move.l    a3,a1
  316.         adda.l    d7,a1            ;adres linii
  317.         move.w    d2,d7
  318.         lsr.w    #3,d7
  319.         beq    li_lsd1
  320.         subq.w    #1,d7
  321.         moveq.l    #-1,d6
  322. li_p2        move.b    d6,(a1)+
  323.         dbf    d7,li_p2
  324. li_lsd1        andi.w    #$0007,d2
  325.         beq    li_lsd2
  326.         move.b    0(a0,d2.w),d2
  327.         or.b    d2,(a1)
  328. li_lsd2        movem.w    (a7)+,d0/d2/d6/d7
  329.         rts
  330.  
  331. li_tillend
  332. ;od ôrodka do prawego brzegu
  333.         lsl.w    #2,d7
  334.         move.l    0(a2,d7.w),d7
  335.         move.l    a3,a1
  336.         adda.l    d7,a1            ;adres linii
  337.         move.w    d6,d7
  338.         lsr.w    #3,d7
  339.         lea    0(a1,d7.w),a1        ;adres bajtu
  340.         andi.w    #$0007,d6
  341.         beq    li_spd1
  342.         move.b    8(a0,d6.w),d6
  343.         or.b    d6,(a1)+
  344.         addq.w    #1,d7
  345. li_spd1        move.w    (a4),d6
  346.         sub.w    d7,d6
  347.         bcs    li_spd2
  348.         moveq.l    #-1,d7
  349. li_p3        move.b    d7,(a1)+
  350.         dbf    d6,li_p3
  351. li_spd2        movem.w    (a7)+,d0/d2/d6/d7
  352.         rts
  353.  
  354. li_fullline
  355. ;od lewego brzegu do prawego brzegu
  356.         lsl.w    #2,d7
  357.         move.l    0(a2,d7.w),d7
  358.         move.l    a3,a1
  359.         adda.l    d7,a1            ;adres linii
  360.         move.w    (a4),d7
  361.         moveq.l    #-1,d6
  362. li_p1        move.b    d6,(a1)+
  363.         dbf    d7,li_p1
  364.         movem.w    (a7)+,d0/d2/d6/d7
  365.         rts
  366.  
  367. ;jeôli linia jest poza ekranem
  368. li_niewidoczny
  369. li_poprawej
  370. li_polewej
  371. li_nad
  372. li_pod
  373.         movem.w    (a7)+,d0/d2/d6/d7
  374.         rts
  375.  
  376. li_T1        dc.b    %00000000
  377.         dc.b    %10000000
  378.         dc.b    %11000000
  379.         dc.b    %11100000
  380.         dc.b    %11110000
  381.         dc.b    %11111000
  382.         dc.b    %11111100
  383.         dc.b    %11111110
  384.  
  385.         dc.b    %11111111
  386.         dc.b    %01111111
  387.         dc.b    %00111111
  388.         dc.b    %00011111
  389.         dc.b    %00001111
  390.         dc.b    %00000111
  391.         dc.b    %00000011
  392.         dc.b    %00000001
  393.  
  394. ;------------------------------------------------------------------------------
  395. ;   Makro stawiajâce punkt. Lewy górny róg to (0,0). Iksy rosnâ w prawo,
  396. ; a igreki w dóî
  397. ; WEJÔCIE: \1.w=x
  398. ;          \2.w=y
  399. ;          a2=wartoôê komórki cir_tabaddr
  400. ;          a3=adres bitplanu
  401. ; WYJÔCIE: a1=adres bajtu
  402. ;          a5=adres cir_width
  403. ;          a6=adres cir_height
  404. ;          niszczy \2.l, d7
  405. ;------------------------------------------------------------------------------
  406.  
  407. PUNKT        MACRO
  408.         move.w    (a5),d7
  409.         cmp.w    d7,\1
  410.         bcc    \@pkt_end
  411.         move.w    (a6),d7
  412.         cmp.w    d7,\2
  413.         bcc    \@pkt_end
  414.         move.w    d0,-(a7)
  415.         lsl.w    #2,\2
  416.         move.l    0(a2,\2.w),\2
  417.         move.l    a3,a1
  418.         adda.l    \2,a1            ;adres linii
  419.         move.w    \1,\2
  420.         lsr.w    #3,\2
  421.         lea    0(a1,\2.w),a1        ;adres bajtu
  422.         andi.b    #$07,\1
  423.         neg.b    \1
  424.         addq.b    #7,\1
  425.         bset.b    \1,(a1)
  426.         move.w    (a7)+,d0
  427. \@pkt_end
  428.         ENDM
  429.         
  430. ;------------------------------------------------------------------------------
  431. ;   Procedura rysujâca wypeînione kîóka i zapisuje ich pozycjë do tablicy,
  432. ; by moûna je byîo póúniej usunâê _RemoveCircles. Przed uûyciem _Circle naleûy
  433. ; wywoîaê _CircleInit. Nie moûna narysowaê wiëcej kóîek niû MAXCIAL
  434. ; WEJÔCIE: a3=adres bitplanu
  435. ;          d0.l=x
  436. ;          d1.l=y
  437. ;          d2.l=r
  438. ;------------------------------------------------------------------------------
  439.  
  440. _Circle
  441.         movem.l    d2-d7/a2-a6,-(a7)
  442.     ;kontrola czy x,y naleûa <-10000,10000> oraz r<=10000
  443.         cmp.l    #10000,d0
  444.         bgt    cir_end
  445.         cmp.l    #10000,d1
  446.         bgt    cir_end
  447.         cmp.l    #10000,d2
  448.         bgt    cir_end
  449.         cmp.l    #-10000,d0
  450.         blt    cir_end
  451.         cmp.l    #-10000,d1
  452.         blt    cir_end
  453.     ;zapisz kwadrat, w którym rysowane bëdzie kóîko
  454.         cmpa.l    cir_firstbpl,a3
  455.         beq    cir_d2
  456.         lea    cir_box2ptr,a1            ;second bitplan
  457.         bra    cir_d3
  458. cir_d2        lea    cir_box1ptr,a1            ;first bitplan
  459. cir_d3        move.l    (a1),a0
  460.         move.w    d0,d3
  461.         sub.w    d2,d3
  462.         move.w    d3,(a0)+
  463.         move.w    d1,d3
  464.         sub.w    d2,d3
  465.         move.w    d3,(a0)+
  466.         move.w    d2,d3
  467.         add.w    d3,d3
  468.         move.w    d3,(a0)+
  469.         move.l    a0,(a1)
  470.     ;ustaw rejestry adresowe
  471.         move.l    cir_tabaddr,a2
  472.         lea    cir_width(pc),a5
  473.         lea    cir_height(pc),a6
  474.         tst.w    d2
  475.         bne    cir_d1
  476.         PUNKT    d0,d1
  477.         movem.l    (a7)+,d2-d7/a2-a6
  478.         rts
  479. cir_d1        lea    li_T1(pc),a0
  480.         lea    cir_bwidth(pc),a4
  481.     ;parametry poczâtkowe pëtli
  482.         moveq.l    #0,d3            ;d3=xp
  483.         move.w    d2,d4            ;d4=yp
  484.         moveq.l    #3,d5
  485.         add.w    d2,d2
  486.         sub.w    d2,d5            ;d5=par
  487.     ;poczâtkowe punkty i linia
  488.         move.w    d1,d6
  489.         add.w    d4,d6
  490.         PUNKT    d0,d6            ;x, y+yp
  491.         move.w    d1,d6
  492.         sub.w    d4,d6
  493.         PUNKT    d0,d6            ;x, y-yp
  494.         move.w    d0,d6
  495.         sub.w    d4,d6
  496.         move.w    d1,d7
  497.         bsr    Linia            ;d6,d7,d2   x-yp, y, 2*r
  498.     ;pëtla
  499. cir_do        tst.w    d5            ;if( par>=0 )
  500.         bmi    cir_ujemne
  501.         move.w    d3,d6
  502.         sub.w    d4,d6
  503.         add.w    d6,d6
  504.         add.w    #10,d6
  505.         add.w    d6,d5            ;par+=((xp-yp)<<2)+10
  506.         subq.w    #1,d4            ;yp--
  507.         bra    cir_ifend
  508. cir_ujemne    move.w    d3,d6            ;else
  509.         add.w    d6,d6
  510.         addq.w    #6,d6
  511.         add.w    d6,d5            ;par+=(xp<<2)+6
  512. cir_ifend    addq.w    #1,d3            ;xp++
  513.  
  514.         move.w    d3,d2
  515.         add.w    d2,d2
  516.         move.w    d0,d6
  517.         sub.w    d3,d6
  518.         move.w    d1,d7
  519.         add.w    d4,d7
  520.         bsr    Linia            ;d6,d7,d2   x-xp, y+yp, 2*xp
  521.         move.w    d1,d7
  522.         sub.w    d4,d7
  523.         bsr    Linia            ;d6,d7,d2   x-xp, y-yp, 2*xp
  524.  
  525.         move.w    d4,d2
  526.         add.w    d2,d2
  527.         move.w    d0,d6
  528.         sub.w    d4,d6
  529.         move.w    d1,d7
  530.         add.w    d3,d7
  531.         bsr    Linia            ;d6,d7,d2   x-yp, y+xp, 2*yp
  532.         move.w    d1,d7
  533.         sub.w    d3,d7
  534.         bsr    Linia            ;d6,d7,d2   x-yp, y-xp, 2*yp
  535.  
  536.         cmp.w    d3,d4
  537.         bpl    cir_do            ;while( xp<yp )
  538. cir_end        movem.l    (a7)+,d2-d7/a2-a6
  539.         rts
  540.  
  541. ;------------------------------------------------------------------------------
  542. ;   Procedura kasuje prostokât o szerokoôci d i wysokoôci d+1. Jego lewy-górny
  543. ; wierzchoîek znajduje sië w punkcie (x,y). Przy kasowaniu zastosowany jest
  544. ; clipping. Z tego wzglëdu naleûy podaê szerokoôê i wysokoôê ekranu. Kasowany
  545. ; prostokât jest równany do bajtu.
  546. ; WEJÔCIE: d6.w=x
  547. ;          d7.w=y
  548. ;          d2.w=d
  549. ;          a4=adres cir_bwidth
  550. ;          a5=adres cir_width
  551. ;          a6=adres cir_height
  552. ;          a2=adres spod adresu cir_tabaddr
  553. ;          a3=adres bitplanu
  554. ;------------------------------------------------------------------------------
  555.  
  556. ClearSquare
  557.         move.w    d2,d1            ;operuj na kopii
  558.     ;czy nie punkt
  559.         tst.w    d1
  560.         bne    csq_d1
  561.         lsl.w    #2,d7
  562.         move.l    0(a2,d7.w),d7
  563.         move.l    a3,a1
  564.         adda.l    d7,a1            ;adres linii
  565.         move.w    d6,d7
  566.         lsr.w    #3,d7
  567.         lea    0(a1,d7.w),a1        ;adres bajtu
  568.         move.b    #0,(a1)
  569.         bra    csq_end
  570.     ;sprawdú czy szerokoôê<1
  571. csq_d1        cmp.w    #1,d1
  572.         blt    csq_niewidoczny
  573.         addq.w    #1,d1
  574.     ;sprawdú czy lewy-górny poniûej bitmapy
  575.         cmp.w    (a6),d7
  576.         bge    csq_niewidoczny
  577.     ;sprawdú czy lewy-górny nie jest powyûej bitmapy
  578.         tst.w    d7
  579.         bpl    csq_ydodatni
  580.     ;sprawdú czy kwadrat powyûej
  581.         neg.w    d7
  582.         sub.w    d1,d7
  583.         bpl    csq_niewidoczny
  584.         move.w    d7,d1
  585.         neg.w    d1
  586.         moveq.l    #0,d7
  587.     ;sprawdú czy nie wystaje poniûej bitmapy
  588. csq_ydodatni    move.w    d7,d0
  589.         add.w    d1,d0
  590.         cmp.w    (a6),d0
  591.         ble    csq_sprx
  592.     ;wystaje
  593.         sub.w    (a6),d0
  594.         sub.w    d0,d1
  595. csq_sprx
  596.         subq.w    #1,d1
  597.     ;w tym momencie d7 i d1 zawierajâ wartoôci po obciëciu niewidocznych
  598.  
  599.     ;co z x
  600.         tst.w    d6
  601.         bmi    csq_xujemny
  602.         beq    csq_xzerowy
  603.         move.w    (a5),d0
  604.         cmp.w    d6,d0
  605.         bls    csq_poprawej
  606.         sub.w    d6,d0
  607.         cmp.w    d2,d0
  608.         bls    csq_tillend
  609. ;na ôrodku
  610.         lsl.w    #2,d7
  611.         move.l    0(a2,d7.w),d7
  612.         move.l    a3,a1
  613.         adda.l    d7,a1            ;adres linii
  614.         move.w    d6,d7
  615.         lsr.w    #3,d7
  616.         lea    0(a1,d7.w),a1        ;adres bajtu
  617.     ;oblicz szerokoôê paska w bajtach
  618.         moveq.l    #-1,d0
  619.         andi.w    #7,d6            ;lewy (poczâtek)
  620.         beq    csq_sd1
  621.         addq.w    #1,d0
  622.         add.w    d6,d2
  623.         subq.w    #8,d2
  624.         bcs    csq_sd2
  625. csq_sd1        move.w    d2,d7            ;zaczyna sië równo z bajtem
  626.         lsr.w    #3,d7
  627.         add.w    d7,d0
  628.         andi.w    #$0007,d2        ;dopisz prawy koniec
  629.         beq    csq_sd2
  630.         addq.w    #1,d0
  631.         tst.w    d0
  632.         bmi    csq_sd3
  633.     ;wyczyôê prostokât
  634. csq_sd2        moveq.l    #0,d6
  635.         move.l    4(a2),d7
  636. csq_sp1        move.l    a1,a0
  637.         move.w    d0,d2
  638. csq_sp2        move.b    d6,(a0)+
  639.         dbf    d2,csq_sp2
  640.         add.l    d7,a1
  641.         dbf    d1,csq_sp1
  642. csq_sd3        rts
  643.  
  644. csq_xujemny    neg.w    d6
  645.         sub.w    d6,d2
  646.         bls    csq_polewej
  647. csq_xzerowy
  648.         move.w    (a5),d0
  649.         cmp.w    d2,d0
  650.         bls    csq_fullline
  651. ;od lewego brzegu do ôrodka
  652.         lsl.w    #2,d7
  653.         move.l    0(a2,d7.w),d7
  654.         move.l    a3,a1
  655.         adda.l    d7,a1            ;adres linii
  656.     ;oblicz szerokoôê paska w bajtach
  657.         move.w    d2,d7
  658.         lsr.w    #3,d7
  659.         andi.w    #7,d2
  660.         beq    csq_lsd1
  661.         addq.w    #1,d7
  662. csq_lsd1    tst.w    d7
  663.         beq    csq_lsd2
  664.         subq.w    #1,d7
  665.     ;wyczyôê prostokât
  666.         moveq.l    #0,d6
  667.         move.l    4(a2),d0
  668. csq_lsp1    move.l    a1,a0
  669.         move.w    d7,d2
  670. csq_lsp2    move.b    d6,(a0)+
  671.         dbf    d2,csq_lsp2
  672.         add.l    d0,a1
  673.         dbf    d1,csq_lsp1
  674. csq_lsd2    rts
  675.  
  676. csq_tillend
  677. ;od ôrodka do prawego brzegu
  678.         lsl.w    #2,d7
  679.         move.l    0(a2,d7.w),d7
  680.         move.l    a3,a1
  681.         adda.l    d7,a1            ;adres linii
  682.         move.w    d6,d7
  683.         lsr.w    #3,d7
  684.         lea    0(a1,d7.w),a1        ;adres bajtu
  685.     ;oblicz szerokoôê paska w bajtach
  686.         move.w    (a4),d2
  687.         sub.w    d7,d2
  688.         andi.w    #7,d6
  689.         beq    csq_spd1
  690.         addq.w    #1,d2
  691. csq_spd1    tst.w    d2
  692.         beq    csq_spd2
  693.         subq.w    #1,d2
  694.     ;wyczyôê prostokât
  695.         moveq.l    #0,d6
  696.         move.l    4(a2),d0
  697. csq_spp1    move.l    a1,a0
  698.         move.w    d2,d7
  699. csq_spp2    move.b    d6,(a0)+
  700.         dbf    d7,csq_spp2
  701.         add.l    d0,a1
  702.         dbf    d1,csq_spp1
  703. csq_spd2    rts
  704.  
  705. csq_fullline
  706. ;od lewego brzegu do prawego brzegu
  707.         lsl.w    #2,d7
  708.         move.l    0(a2,d7.w),d7
  709.         move.l    a3,a1
  710.         adda.l    d7,a1            ;adres linii
  711.     ;oblicz szerokoôê paska w bajtach
  712.         move.w    (a4),d2
  713.         bmi    csq_fld1
  714.     ;wyczyôê prostokât
  715.         moveq.l    #0,d6
  716.         move.l    4(a2),d0
  717. csq_flp1    move.l    a1,a0
  718.         move.w    d2,d7
  719. csq_flp2    move.b    d6,(a0)+
  720.         dbf    d7,csq_flp2
  721.         add.l    d0,a1
  722.         dbf    d1,csq_flp1
  723. csq_fld1    rts
  724.  
  725. ;jeôli linia jest poza ekranem
  726. csq_end
  727. csq_niewidoczny
  728. csq_poprawej
  729. csq_polewej
  730. csq_nad
  731. csq_pod
  732.         rts
  733.  
  734. ;------------------------------------------------------------------------------
  735. ;  Procedura usuwajâca narysowane przez _Circle kóîka. Procedura _RemoveCircles
  736. ; odôwieûa tablicë.
  737. ; WEJÔCIE: a3=adres bitplanu
  738. ;------------------------------------------------------------------------------
  739.  
  740. _RemoveCircles
  741.         movem.l    d2-d4/d6/d7/a2-a6,-(a7)
  742.     ;weú odpowiedni adres zapamiëtanych kóîek i odôwieû odpowiedniâ tablicë
  743.         cmpa.l    cir_firstbpl,a3
  744.         beq    rc_d1
  745.         move.l    cir_box2begin,d3        ;z second bpl
  746.         move.l    cir_box2ptr,d4
  747.         move.l    cir_box2begin,cir_box2ptr
  748.         bra    rc_d2        
  749. rc_d1        move.l    cir_box1begin,d3        ;z first bpl
  750.         move.l    cir_box1ptr,d4
  751.         move.l    cir_box1begin,cir_box1ptr
  752. rc_d2
  753.     ;parametry potrzebne dla ClearSquare
  754.         move.l    cir_tabaddr,a2
  755.         lea    cir_width(pc),a5
  756.         lea    cir_height(pc),a6
  757.         lea    cir_bwidth(pc),a4
  758.     ;kasuj kwadraty
  759. rc_p1        cmp.l    d3,d4
  760.         beq    rc_d3
  761.         move.l    d3,a1
  762.         move.w    (a1)+,d6
  763.         move.w    (a1)+,d7
  764.         move.w    (a1)+,d2
  765.         move.l    a1,d3
  766.         bsr    ClearSquare
  767.         bra    rc_p1
  768.     ;odôwieû tablicë
  769. rc_d3        movem.l    (a7)+,d2-d4/d6/d7/a2-a6
  770.         rts
  771.  
  772. ;------------------------------------------------------------------------------
  773. ;  Procedura ustawia na poczâtek tablic wskaúniki do danych o kwadratach do
  774. ; skasowania. Procedura _ResetBoxPtrs jest potrzebna przy animowaniu ze ôladem
  775. ;------------------------------------------------------------------------------
  776.  
  777. _ResetBoxPtrs
  778.         move.l    cir_box1begin,cir_box1ptr
  779.         move.l    cir_box2begin,cir_box2ptr
  780.         rts
  781.  
  782. ;------------------------------------------------------------------------------
  783. ;  Procedura sprawdza, czy przyciôniëty jest LMB. Zwraca d0.l=1 jeôli tak
  784. ; w przeciwnym wypadku d0.l=0
  785. ;------------------------------------------------------------------------------
  786.  
  787. _LMB
  788.         moveq.l    #0,d0
  789.         move.b    $bfe001,d0
  790.         andi.b    #$40,d0
  791.         lsr.b    #6,d0
  792.         bchg.l    #0,d0
  793.         rts
  794.  
  795. ;------------------------------------------------------------------------------
  796. ;  Procedura sprawdza, czy przyciôniëty jest RMB. Zwraca d0.l=1 jeôli tak
  797. ; w przeciwnym wypadku d0.l=0
  798. ;------------------------------------------------------------------------------
  799.  
  800. _RMB
  801.         moveq.l    #0,d0
  802.         move.w    $dff016,d0
  803.         andi.w    #$400,d0
  804.         rol.w    #6,d0
  805.         bchg.l    #0,d0
  806.         rts
  807.  
  808.                 END
  809.                 
  810.