home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Assembler / dse-src6.dms / in.adf / fillvect.lzh / filledvectors.s
Encoding:
Text File  |  1990-12-22  |  19.0 KB  |  1,248 lines

  1. *****************************************
  2. * Ei järin nopeat fillatut veccirutkut.    *
  3. * Tekijää en tiedä, UZI tehnyt pieniä    *
  4. * muutoksia                *
  5. *****************************************
  6.  
  7. jmp    $40000
  8. org    $40000
  9. load    $40000
  10.  
  11. j:    move.l    4,a6
  12.     jsr    -132(a6)
  13.  
  14.     move.w    #$0020,$dff096
  15.  
  16.     clr.w    hyppy
  17.  
  18.     bsr    OpenLibraries
  19.     bsr    OpenScreen
  20.     bsr    MakeCopperLists
  21.  
  22.     clr.w    STATE
  23.     move.l    GFXBASE,a6
  24.     move.l    $32(a6),OldCop        ;asetetaan copper-lista
  25.  
  26.     move.l    $6c,intadr
  27.     move.l    #inter,$6c
  28.  
  29. MAINLOOP:
  30.  
  31. ;seuraavaksi vaihdetaan näyttöä. Kun toinen näyttö on piirretty,
  32. ;näytetään se ja aletaan piirtämään toista
  33.  
  34.     move.l    GFXBASE,a6
  35.     tst.w    STATE
  36.     beq.s    State1
  37.     clr.w    STATE
  38.     move.l    Copper2,$32(a6)
  39.     bra.s    StateChanged
  40. State1:    move.w    #1,STATE
  41.     move.l    Copper,$32(a6)
  42. StateChanged:
  43.     lea    $dff000,a6
  44.     bsr    SHOWVIEW
  45.     bsr    Rotate        ;suorittaa liikutukset
  46.     add.w    #1,hyppy
  47.     move.w    hyppy,d0
  48.     
  49.     btst.b    #6,$bfe001
  50.     bne.L    MAINLOOP
  51.  
  52. WaitBlitEnd:
  53.     btst    #14,$dff002
  54.     bne.s    WaitBlitEnd
  55.  
  56.     move.l    intadr,$6c
  57.  
  58.     move.w    #$8020,$dff096
  59.  
  60.     move.l    GFXBASE,a6
  61.     move.l    OldCop,$32(a6)
  62.     bsr    CloseScreen
  63.     bsr    FreeCopperLists
  64.     move.l    4,a6
  65.     jsr    -138(a6)
  66.  
  67.     rts
  68.  
  69. ;-------------------------------------------------------------
  70.  
  71. SHOWVIEW:
  72.  
  73.     lea    SinCos,a3        ;sin ja cos -taulukot a3:een ja a4:ään
  74.     lea    2884(a3),a4
  75.     move.w    #128,d2
  76.     move.w    d2,d4
  77.     movem.w    OXA,d5-d7
  78.     lea    W,a2
  79.     bsr    Matriisi        ;matriisi jolla esine pyörii origonsa ympäri
  80.     movem.w    MXA,d5-d7
  81.     move.w    #179,d4
  82.     lea    Q,a2
  83.     bsr    Matriisi        ;pyöritetään kuvaa
  84.  
  85.     sub.l    a4,a4
  86.     move.l    Pisteet,a0
  87. LaskePisteet:
  88.     lea    W,a2
  89.     lea    Q,a3
  90.     movem.w    (a0)+,d2-d4
  91.     move.l    a0,-(a7)
  92.  
  93.     movem.w    OX,d5-d7
  94.     sub.w    MX,d5
  95.     sub.w    MY,d6
  96.     sub.w    MZ,d7
  97.     ext.l    d5
  98.     ext.l    d6
  99.     ext.l    d7
  100.  
  101. ;kerrotaan piste matriisilla W
  102.  
  103. ;HUOM! ohjelma laskee luvuilla jotka on kerrottu 128:lla. Tällöin
  104. ;saadaan riittävä tarkkuus laskuihin. Yksi luku vie tilaa 32-bittiä
  105. ;ylempi osa on desimaalia- alempi kokonaisosaa varten
  106.  
  107.     move.w    d2,d0
  108.     muls.w    (a2)+,d0
  109.     move.w    d3,d1
  110.     muls.w    (a2)+,d1
  111.     add.l    d1,d0
  112.     move.w    d4,d1
  113.     muls.w    (a2)+,d1
  114.     add.l    d1,d0
  115.     divs.w    #128,d0
  116.     add.l    d0,d5
  117.  
  118.     move.w    d2,d0
  119.     muls.w    (a2)+,d0
  120.     move.w    d3,d1
  121.     muls.w    (a2)+,d1
  122.     add.l    d1,d0
  123.     move.w    d4,d1
  124.     muls.w    (a2)+,d1
  125.     add.l    d1,d0
  126.     divs.w    #128,d0
  127.     add.l    d0,d6
  128.  
  129.     move.w    d2,d0
  130.     muls.w    (a2)+,d0
  131.     move.w    d3,d1
  132.     muls.w    (a2)+,d1
  133.     add.l    d1,d0
  134.     move.w    d4,d1
  135.     muls.w    (a2)+,d1
  136.     add.l    d1,d0
  137.     divs.w    #128,d0
  138.     add.l    d0,d7
  139.  
  140.     bsr    SQRoot            ;neliöjuuri???
  141.  
  142.     bsr    CountAPUXYZ        ;kerrotaan piste matriisilla Q
  143.     move.l    d0,d2
  144.     add.l    d1,d2
  145.     bsr    CountAPUXYZ
  146.     move.l    d0,d3
  147.     add.l    d1,d3
  148.     bsr    CountAPUXYZ
  149.     move.l    d0,d4
  150.     add.l    d1,d4
  151.  
  152. ;tästä eteenpäin alkaa rutiini joka laskee perspektiivin
  153.  
  154.     bne.s    ApuzNotZero
  155.     moveq    #1,d4
  156. ApuzNotZero:
  157.     move.w    d4,d0
  158.     muls.w    #128,d0
  159.     swap    d4
  160.     ext.l    d4
  161.     add.l    d0,d4
  162.     divs.w    #128,d4
  163.     bne.s    ApuzNotZeroII
  164.     moveq    #1,d4
  165. ApuzNotZeroII:
  166.     move.w    d2,d0
  167.     move.l    d2,d1
  168.     swap    d1
  169.     muls.w    #192,d0
  170.     muls.w    #3,d1
  171.     divs.w    #2,d1
  172.     ext.l    d1
  173.     add.l    d1,d0
  174.  
  175.     divs.w    d4,d0
  176.     add.w    #160,d0
  177.     lea    X,a0
  178.     move.w    d0,0(a0,a4.w)        ;talletetaan pisteen X-koord.
  179.     move.w    d0,d6
  180.  
  181.     move.w    d3,d0
  182.     move.l    d3,d1
  183.     swap    d1
  184.     muls.w    #200,d0
  185.     muls.w    #200,d1
  186.     divs.w    #128,d1
  187.     ext.l    d1
  188.     add.l    d1,d0
  189.  
  190.     divs.w    d4,d0
  191.     moveq    #100,d1
  192.     sub.w    d0,d1
  193.     lea    Y,a0
  194.     move.w    d1,0(a0,a4.w)        ;talletetaan pisteen Y-koord.
  195.     move.w    d1,d7
  196.  
  197.     addq.l    #2,a4
  198.     move.l    (a7)+,a0
  199.     cmp.w    #9999,(a0)
  200.     bne    LaskePisteet
  201.  
  202. ;seuraava rutiini laskee polygonin etäisyyden katsojasta
  203.  
  204.     move.l    Kuviot,a1
  205.     lea    ET,a2
  206. CountDist:
  207.     move.w    6(a1),d0
  208.     subq.w    #1,d0
  209.     clr.l    d1
  210.     move.w    d1,d2
  211. CountDistLoop:
  212.     move.w    8(a1,d2.w),d3
  213.     lsl.w    #1,d3
  214.     move.w    0(a2,d3.w),d3
  215.     ext.l    d3
  216.     add.l    d3,d1
  217.     addq.l    #2,d2
  218.     dbf    d0,CountDistLoop
  219.  
  220.     move.w    6(a1),d0
  221.     divu.w    d0,d1
  222.     move.w    d1,4(a1)
  223.     mulu.w    #2,d0
  224.     add.l    d0,a1
  225.     addq.l    #8,a1
  226.     cmp.w    #9999,(a1)
  227.     bne.s    CountDist
  228.  
  229.     bsr    PoistaVastakkaiset    ;poistetaan ne pinnat
  230.                     ;jotka eivät kuvassa ehkä näy
  231.     lea    $dff000,a6
  232.     bsr    ClearScreen
  233.  
  234. PiirraKuvio:        ;tämä rutku hakee aina kauimmaisen polygonin
  235.             ;ja piirtää sen
  236.     clr.l    d4
  237.     move.l    d4,d5
  238.     move.l    Kuviot,a4
  239. Etsi:    cmp.w    #9999,(a4)
  240.     beq.s    Piirra
  241.     cmp.w    4(a4),d4
  242.     bge.s    EtsiSeuraava
  243.     move.l    a4,d5
  244.     move.w    4(a4),d4
  245. EtsiSeuraava:
  246.     move.w    6(a4),d0
  247.     mulu.w    #2,d0
  248.     add.l    d0,a4
  249.     addq.l    #8,a4
  250.     bra.s    Etsi
  251.  
  252. PiirrosValmis:
  253.     rts
  254. Piirra:    tst.w    d4
  255.     beq.s    PiirrosValmis
  256.  
  257. AntaaPalaa:        ;itse piirto
  258.     move.l    d5,a4
  259.     clr.w    4(a4)
  260.     lea    X,a3
  261.     lea    Y,a5
  262.     move.w    2(a4),Vari
  263.  
  264.     move.w    8(a4),d5
  265.     lsl.w    #1,d5
  266.  
  267.     move.l    NowAPoints,a0
  268.     move.w    0(a3,d5.w),(a0)+
  269.     move.w    0(a5,d5.w),(a0)
  270.     addq.l    #4,NowAPoints
  271.     addq.w    #1,AreaCount
  272.     move.l    NowAFlags,a0
  273.     clr.b    (a0)
  274.     addq.l    #1,NowAFlags
  275.  
  276.     moveq    #2,d6
  277.     move.w    6(a4),d7
  278.     add.l    #10,a4
  279. TasopintaPiste:
  280.     move.w    (a4)+,d5
  281.     lsl.w    #1,d5
  282.  
  283.     move.l    NowAPoints,a0
  284.     move.l    NowAFlags,a1
  285.     move.w    0(a3,d5.w),d0
  286.     move.w    0(a5,d5.w),d1
  287.     cmp.w    -2(a0),d1
  288.     beq.s    YtSamat
  289.     move.b    #3,(a1)
  290.     bra.s    YtAreaflags
  291. YtSamat:
  292.     move.b    #2,(a1)
  293. YtAreaflags:
  294.     movem.w    d0/d1,(a0)
  295.     addq.l    #4,NowAPoints
  296.     addq.w    #1,AreaCount
  297.     addq.l    #1,NowAFlags
  298.  
  299.     cmp.w    d7,d6
  300.     blt    ContinueDraw
  301.     bsr    Areafill        ;täytetään
  302.  
  303. ;kun polygon on piirretty, se on kopioitava kaikkiin kuvan
  304. ;bittitasoihin
  305.  
  306.     move.l    BlitSTART,d7
  307.     sub.l    TmpBmap,d7
  308.     move.l    ThisRP,a2
  309.     move.w    Vari,d2
  310.  
  311.     move.w    BlitMOD,d4
  312.     swap    d4
  313.     move.w    BlitMOD,d4
  314.     lea    $dff000,a0
  315.     move.l    #$ffffffff,$44(a0)
  316.     move.l    BlitSTART,d5
  317.     move.l    (a2),d6
  318.     btst    #0,d2
  319.     beq.s    CopyNotFirst
  320.     bsr.s    WaitBlitCopy
  321.     bra.s    FirstOK
  322. CopyNotFirst:
  323.     bsr.s    WaitBlitCopy2
  324. FirstOK:
  325.     move.l    4(a2),d6
  326.     btst    #1,d2
  327.     beq.s    CopyNotSecond
  328.     bsr.s    WaitBlitCopy
  329.     bra.s    SecondOK
  330. CopyNotSecond:
  331.     bsr.s    WaitBlitCopy2
  332. SecondOK:
  333.     move.l    8(a2),d6
  334.     btst    #2,d2
  335.     beq.s    CopyNotThird
  336.     bsr.s    WaitBlitCopy
  337.     bra    PiirraKuvio
  338. CopyNotThird:
  339.     bsr.s    WaitBlitCopy2
  340.     bra    PiirraKuvio
  341.  
  342. ContinueDraw:
  343.     addq.w    #1,d6
  344.     bra    TasopintaPiste
  345.  
  346. WaitBlitCopy:
  347.     btst    #14,2(a0)
  348.     bne.s    WaitBlitCopy
  349.     add.l    d7,d6
  350.     move.l    d6,d0
  351.     movem.l    d0/d5/d6,$4c(a0)
  352.  
  353.     move.l    d4,$64(a0)
  354.     move.w    d4,$62(a0)
  355.     move.l    #%00001101111111000000000000000010,$40(a0)
  356.     move.w    BlitSIZE,$58(a0)
  357.     rts
  358.  
  359. WaitBlitCopy2:
  360.     btst    #14,2(a0)
  361.     bne.s    WaitBlitCopy2
  362.     add.l    d7,d6
  363.     move.l    d6,d0
  364.     movem.l    d0/d5/d6,$4c(a0)
  365.  
  366.     move.l    d4,$64(a0)
  367.     move.w    d4,$62(a0)
  368.     move.l    #%00001101000011000000000000000010,$40(a0)
  369.     move.w    BlitSIZE,$58(a0)
  370.     rts
  371.  
  372. PoistaVastakkaiset:
  373.     clr.l    d7
  374.     move.l    Kuviot,a4
  375. Poista:    cmp.w    #9999,0(a4,d7.l)
  376.     beq    Poistettu
  377.     cmp.w    #1,0(a4,d7.l)
  378.     beq.s    PoistaNext
  379.     move.w    6(a4,d7.l),d0
  380.     mulu.w    #2,d0
  381.     add.l    d0,d7
  382.     addq.l    #8,d7
  383.     bra.s    Poista
  384. PoistaNext:
  385.     move.l    d7,d6
  386.     move.w    6(a4,d7.l),d0
  387.     mulu.w    #2,d0
  388.     add.l    d0,d6
  389.     add.l    #12,d6
  390.     move.w    0(a4,d6.l),d0
  391.     cmp.w    4(a4,d7.l),d0
  392.     bgt.s    DoPoisto
  393.     beq.s    PoistoDone
  394.     clr.w    4(a4,d7.l)
  395. PoistoDone:
  396.     move.w    6(a4,d7.l),d0
  397.     mulu.w    #2,d0
  398.     move.l    d0,d7
  399.     add.l    d6,d7
  400.     addq.l    #4,d7
  401.     bra.s    Poista
  402. DoPoisto:
  403.     clr.w    0(a4,d6.l)
  404.     bra.s    PoistoDone
  405. Poistettu:
  406.     rts
  407.  
  408. SQRoot:                ;tämä on nimeltään neliöjuuri
  409.                 ;vaikkei se otakaan luvusta neliöjuurta
  410.                 ;mutta ennen otti, ja siitä nimi
  411.     move.w    d5,d0
  412.     bpl.s    SQRd5ok
  413.     neg.w    d0
  414. SQRd5ok:
  415.     ext.l    d0
  416.     mulu.w    d0,d0
  417.     move.w    d6,d1
  418.     bpl.s    SQRd6ok
  419.     neg.w    d1
  420. SQRd6ok:
  421.     ext.l    d1
  422.     mulu.w    d1,d1
  423.     add.l    d1,d0
  424.     move.w    d7,d1
  425.     bpl.s    SQRd7ok
  426.     neg.w    d1
  427. SQRd7ok:
  428.     ext.l    d1
  429.     mulu.w    d1,d1
  430.     add.l    d1,d0
  431.     lsr.l    #4,d0
  432.     lea    ET,a0
  433.     move.w    d0,0(a0,a4.w)
  434.     rts
  435.  
  436. CountAPUXYZ:
  437.     move.w    d5,d0
  438.     move.l    d5,d1
  439.     swap    d1
  440.     muls.w    (a3),d0
  441.     muls.w    (a3)+,d1
  442.     move.l    d0,a5
  443.     move.l    d1,a6
  444.  
  445.     move.w    d6,d0
  446.     move.l    d6,d1
  447.     swap    d1
  448.     muls.w    (a3),d0
  449.     muls.w    (a3)+,d1
  450.     add.l    d0,a5
  451.     add.l    d1,a6
  452.     
  453.     move.w    d7,d0
  454.     move.l    d7,d1
  455.     swap    d1
  456.     muls.w    (a3),d0
  457.     muls.w    (a3)+,d1
  458.     add.l    a5,d0
  459.     add.l    a6,d1
  460.  
  461.     divs.w    #128,d0
  462.     divs.w    #128,d1
  463.     swap    d1
  464.     and.l    #$ffff0000,d1
  465.     rts
  466.  
  467. Matriisi:
  468.     lsl.w    #2,d5
  469.     lsl.w    #2,d6
  470.     lsl.w    #2,d7
  471.     add.w    #1432,d5
  472.     add.w    #1432,d6
  473.     add.w    #1432,d7
  474.  
  475.     move.w    2(a4,d6.w),d0
  476.     neg.w    d0
  477.     move.w    d0,d1
  478.     muls.w    2(a4,d7.w),d0
  479.     divs.w    d2,d0
  480.     move.w    d0,a0
  481.  
  482.     muls.w    6(a3,d7.w),d1
  483.     divs.w    d2,d1
  484.     move.w    d1,d3
  485.     
  486.     muls.w    2(a4,d5.w),d0
  487.     move.w    6(a3,d5.w),d1
  488.     muls.w    6(a3,d7.w),d1
  489.     add.l    d0,d1
  490.     divs.w    d2,d1
  491.     move.w    d1,(a2)+
  492.     
  493.     move.w    2(a4,d7.w),d0
  494.     muls.w    6(a3,d6.w),d0
  495.     divs.w    d2,d0
  496.     move.w    d0,(a2)+
  497.  
  498.     move.w    6(a3,d7.w),d0
  499.     neg.w    d0
  500.     muls.w    2(a4,d5.w),d0
  501.     move.w    a0,d1
  502.     muls.w    6(a3,d5.w),d1
  503.     add.l    d0,d1
  504.     divs.w    d2,d1
  505.     move.w    d1,(a2)+
  506.  
  507.     move.w    2(a4,d7.w),d0
  508.     neg.w    d0
  509.     muls.w    6(a3,d5.w),d0
  510.     move.w    d3,d1
  511.     muls.w    2(a4,d5.w),d1
  512.     add.l    d0,d1
  513.     divs.w    d2,d1
  514.     move.w    d1,(a2)+
  515.  
  516.     move.w    6(a3,d6.w),d1
  517.     muls.w    6(a3,d7.w),d1
  518.     divs.w    d2,d1
  519.     move.w    d1,(a2)+
  520.     
  521.     move.w    2(a4,d7.w),d0
  522.     muls.w    2(a4,d5.w),d0
  523.     move.w    6(a3,d5.w),d1
  524.     muls.w    d3,d1
  525.     add.l    d0,d1
  526.     divs.w    d2,d1
  527.     move.w    d1,(a2)+
  528.  
  529.     move.w    6(a3,d6.w),d0
  530.     muls.w    2(a4,d5.w),d0
  531.     divs.w    d4,d0
  532.     move.w    d0,(a2)+
  533.  
  534.     move.w    2(a4,d6.w),d0
  535.     muls.w    d2,d0
  536.     divs.w    d4,d0
  537.     move.w    d0,(a2)+
  538.  
  539.     move.w    6(a3,d6.w),d0
  540.     muls.w    6(a3,d5.w),d0
  541.     divs.w    d4,d0
  542.     move.w    d0,(a2)+
  543.     rts
  544.  
  545. Rotate:    addq.w    #1,OXA
  546.     cmp.w    #359,OXA
  547.     blt.s    OKX
  548.     clr.w    OXA
  549. OKX:    addq.w    #2,OYA
  550.     cmp.w    #359,OYA
  551.     blt.s    OKY
  552.     clr.w    OYA
  553. OKY:    addq.w    #2,OZA
  554.     cmp.w    #359,OZA
  555.     blt.s    OKZ
  556.     clr.w    OZA
  557. OKZ:    rts
  558.  
  559. ClearScreen:
  560.     cmp.b    #210,$006(a6)
  561.     blt.s    ClearScreen
  562.     cmp.b    #255,$006(a6)
  563.     bgt.s    ClearScreen
  564.     tst.w    STATE
  565.     bne.s    ClearScr2
  566.     lea    Bmaps1,a2
  567.     move.l    a2,ThisRP
  568.     bra.s    ClearScrSelected
  569. ClearScr2:
  570.     lea    Bmaps2,a2
  571.     move.l    a2,ThisRP
  572. ClearScrSelected:
  573.     btst    #14,$002(a6)
  574.     bne.s    ClearScrSelected
  575.     move.l    (a2),$054(a6)
  576.     move.w    #$0100,$040(a6)
  577.     move.w    #$0000,$042(a6)
  578.     clr.w    $066(a6)
  579.     move.w    #$9614,$058(a6)
  580.     rts
  581.  
  582. OpenScreen:
  583.     move.l    $4,a6
  584.     move.l    #8000,d0
  585.     move.l    #2+65536,d1
  586.     jsr    -198(a6)
  587.     move.l    d0,TmpBmap
  588.  
  589.     move.l    #8000*3,d0
  590.     move.l    #2+65536,d1
  591.     jsr    -198(a6)
  592.     lea    Bmaps1,a0
  593.     move.l    d0,(a0)+
  594.     add.l    #8000,d0
  595.     move.l    d0,(a0)+
  596.     add.l    #8000,d0
  597.     move.l    d0,(a0)+
  598.  
  599.     move.l    #8000*3,d0
  600.     move.l    #2+65536,d1
  601.     jsr    -198(a6)
  602.     lea    Bmaps2,a0
  603.     move.l    d0,(a0)+
  604.     add.l    #8000,d0
  605.     move.l    d0,(a0)+
  606.     add.l    #8000,d0
  607.     move.l    d0,(a0)+
  608.     rts
  609.  
  610. CloseScreen:
  611.     move.l    $4,a6
  612.     move.l    Bmaps1,a1
  613.     move.l    #8000*3,d0
  614.     jsr    -210(a6)
  615.  
  616.     move.l    Bmaps2,a1
  617.     move.l    #8000*3,d0
  618.     jsr    -210(a6)
  619.  
  620.     move.l    TmpBmap,a1
  621.     move.l    #8000,d0
  622.     jsr    -210(a6)
  623.     rts
  624.  
  625. OpenLibraries:
  626.     move.l    $4,a6
  627.     lea    IntLibName,a1
  628.     jsr    -408(a6)
  629.     move.l    d0,INTBASE
  630.     lea    GfxLibName,a1
  631.     jsr    -408(a6)
  632.     move.l    d0,GFXBASE
  633.     rts
  634.  
  635. FreeCopperLists:
  636.     move.l    $4,a6
  637.     move.l    Copper,a1
  638.     move.l    #2000,d0
  639.     jsr    -210(a6)
  640.     rts
  641.  
  642. MakeCopperLists:
  643.     move.l    $4,a6
  644.     move.l    #2000,d0
  645.     move.l    #2+65536,d1
  646.     jsr    -198(a6)
  647.     move.l    d0,Copper
  648.     add.l    #1000,d0
  649.     move.l    d0,Copper2
  650.     lea    MyCopperList,a0
  651.     lea    Bmaps1,a2
  652.     move.l    (a2)+,d0
  653.     move.l    (a2)+,d1
  654.     move.l    (a2),d2
  655.     move.w    d0,6(a0)
  656.     swap.w    d0
  657.     move.w    d0,2(a0)
  658.     move.w    d1,14(a0)
  659.     swap.w    d1
  660.     move.w    d1,10(a0)
  661.     move.w    d2,22(a0)
  662.     swap.w    d2
  663.     move.w    d2,18(a0)
  664.     move.l    Copper,a1
  665. CopyCopLoop:
  666.     move.l    (a0),(a1)+
  667.     cmp.l    #$fffffffe,(a0)+
  668.     bne    CopyCopLoop
  669.  
  670.     lea    MyCopperList2,a0
  671.     lea    Bmaps2,a2
  672.     move.l    (a2)+,d0
  673.     move.l    (a2)+,d1
  674.     move.l    (a2),d2
  675.     move.w    d0,6(a0)
  676.     swap.w    d0
  677.     move.w    d0,2(a0)
  678.     move.w    d1,14(a0)
  679.     swap.w    d1
  680.     move.w    d1,10(a0)
  681.     move.w    d2,22(a0)
  682.     swap.w    d2
  683.     move.w    d2,18(a0)
  684.     move.l    Copper2,a1
  685. CopyCopLoop2:
  686.     move.l    (a0),(a1)+
  687.     cmp.l    #$fffffffe,(a0)+
  688.     bne    CopyCopLoop2
  689.     rts
  690.  
  691. ;tämä areafill-rutiini on riisuttu malli amigan romissa olevasta
  692. ;areafill-rutiinista.
  693.  
  694. Areafill:
  695.     movem.l    d2-d7/a2-a5,-(a7)
  696.     lea    $dff000,a6
  697.     move.l    NowAPoints,a0
  698.     move.l    AreaPoints,d7
  699.     cmp.l    -4(a0),d7
  700.     beq.s    lbC000952
  701.     move.l    NowAFlags,a1
  702.     cmp.w    -2(a0),d7
  703.     bne    AreaLastEiSama
  704.     move.b    #2,(a1)
  705.     bra.s    AreaSetJee
  706. AreaLastEiSama:
  707.     move.b    #3,(a1)
  708. AreaSetJee:
  709.     move.l    d7,(a0)
  710.     addq.l    #4,NowAPoints
  711.     addq.l    #1,NowAFlags
  712.     addq.w    #1,AreaCount
  713.  
  714. lbC000952
  715.     lea    AreaPoints,a0
  716.     movem.w    (a0)+,d0/d2
  717.     move.w    d0,d1
  718.     move.w    d2,d3
  719.     move.w    AreaCount,d7
  720.     subq.w    #2,d7
  721. lbC000964
  722.     movem.w    (a0)+,d5/d6
  723.     cmp.w    d5,d0
  724.     ble.s    lbC00096E
  725.     move.w    d5,d0
  726.     bra.s    lbC000974
  727. lbC00096E
  728.     cmp.w    d5,d1
  729.     bge.s    lbC000974
  730.     move.w    d5,d1
  731. lbC000974
  732.     cmp.w    d6,d2
  733.     ble.s    lbC00097E
  734.     move.w    d6,d2
  735.     bra.s    lbC000984
  736. lbC00097E
  737.     cmp.w    d6,d3
  738.     bge.s    lbC000984
  739.     move.w    d6,d3
  740. lbC000984
  741.     dbra    d7,lbC000964
  742.  
  743.     movem.w    d1/d3,AXS
  744.     and.w    #$fff0,d0
  745.     and.w    #$fff0,d1
  746.     sub.w    d0,d1
  747.     lsr.w    #3,d1
  748.     addq.w    #2,d1
  749.     ext.l    d1
  750.     move.l    d1,d4
  751.     lsr.w    #1,d1
  752.     move.w    d3,d0
  753.     sub.w    d2,d0
  754.     addq.w    #1,d0
  755.     ext.l    d0
  756.     move.l    d0,d2
  757.     lsl.w    #6,d0
  758.     or.w    d0,d1
  759.     moveq    #40,d0
  760.     sub.w    d4,d0
  761.     move.w    AYS,d3
  762.     mulu.w    #40,d3
  763.     move.l    d3,a1
  764.     move.w    AXS,d3
  765.     lsr.w    #4,d3
  766.     mulu    #2,d3
  767.     add.l    d3,a1
  768.     add.l    TmpBmap,a1
  769.  
  770. WaitBlitReady:
  771.     btst    #14,2(a6)
  772.     bne.s    WaitBlitReady
  773.  
  774.     move.l    a1,$54(a6)
  775.     move.l    #$01000002,$40(a6)
  776.     move.w    d0,$66(a6)
  777.     move.w    d1,$58(a6)
  778.  
  779.     movem.w    d0/d1,BlitMOD
  780.     move.l    a1,BlitSTART
  781.  
  782.     move.w    #2,RPFlags1
  783.     lea    AreaPoints,a4
  784.     lea    AreaFlags,a5
  785.     move.l    a4,NowAPoints
  786.     move.l    a5,NowAFlags
  787.     clr.b    d4
  788.     moveq    #1,d5
  789.     move.w    AreaCount,d2
  790.     lea    LinePoints,a1
  791.  
  792. WaitBlitBMod:
  793.     btst    #6,2(a6)
  794.     bne.s    WaitBlitBMod
  795.     move.w    #40,$60(a6)
  796.     moveq    #-1,d4
  797.     move.l    d4,$44(a6)
  798.     move.l    #$ffff8000,$72(a6)
  799.  
  800. lbC000A1C
  801.     bset    #0,RPFlags2
  802.     movem.w    (a4)+,d0/d1
  803.     btst    #0,(a5)+
  804.     beq.s    lbC000A86
  805.     tst.b    d4
  806.     bne.s    lbC000A58
  807.     cmp.w    CP_Y,d1
  808.     ble.s    lbC000A54
  809.     bclr    #0,RPFlags2
  810.     bra.s    lbC000A7A
  811. lbC000A54
  812.     moveq    #1,d4
  813.     bra.s    lbC000A7A
  814. lbC000A58
  815.     tst.b    d4
  816.     ble.s    lbC000A6E
  817.     cmp.w    CP_Y,d1
  818.     bge.s    lbC000A6A
  819.     bclr    #0,RPFlags2
  820.     bra.s    lbC000A7A
  821. lbC000A6A
  822.     clr.b    d4
  823.     bra.s    lbC000A7A
  824. lbC000A6E
  825.     cmp.w    CP_Y,d1
  826.     bge.s    lbC000A78
  827.     moveq    #1,d4
  828.     bra.s    lbC000A7A
  829. lbC000A78
  830.     clr.b    d4
  831. lbC000A7A
  832.     bsr    LineDrawEntry
  833.     tst.b    d5
  834.     bge.s    lbC000AB8
  835.     move.b    d4,d5
  836.     bra.s    lbC000AB8
  837. lbC000A86
  838.     btst    #1,-1(a5)
  839.     bne.s    lbC000AB4
  840. ;    cmp.b    d4,d5
  841. ;    bne.s    lbC000AB0
  842. ;    tst.b    d4
  843. ;    blt.s    lbC000AB0
  844. ;    bsr    WritePixel
  845. lbC000AB0
  846.     moveq    #-1,d4
  847.     move.b    d4,d5
  848. lbC000AB4
  849.     movem.w    d0/d1,CP_X
  850.     ori.w    #1,RPFlags1
  851.     move.b    #$1f,RPLinPatC
  852. lbC000AB8
  853.     subq.w    #1,d2
  854.     bne    lbC000A1C
  855.     move.w    #-1,(a1)+
  856.  
  857. lbC000ABE
  858.     btst.b    #6,2(a6)
  859.     bne.s    lbC000ABE
  860.  
  861.     cmp.b    d4,d5
  862.     bne.s    lbC000AE0
  863.     tst.b    d4
  864.     blt.s    lbC000AE0
  865.  
  866.     movem.w    CP_X,d0/d1
  867.     move.l    TmpBmap,a0
  868.     mulu.w    #40,d1
  869.     add.l    d1,a0
  870.     move.l    d0,d1
  871.     lsr.w    #3,d0
  872.     ext.l    d0
  873.     add.l    d0,a0
  874.     lsl.w    #3,d0
  875.     sub.l    d0,d1
  876.     moveq    #7,d0
  877.     sub.w    d1,d0
  878.     bchg.b    d0,(a0)
  879.  
  880. lbC000AE0
  881.     move.w    BlitMOD,$64(a6)
  882.     move.w    BlitMOD,$66(a6)
  883.     move.l    BlitSTART,$50(a6)
  884.     move.l    BlitSTART,$54(a6)
  885.     move.l    #%00001001111100000000000000001010,$40(a6)
  886.     move.w    BlitSIZE,$58(a6)
  887.  
  888.     lea    LinePoints,a1
  889.     moveq    #-1,d4
  890.     move.l    d4,$44(a6)
  891.     move.w    #$ffff,$72(a6)
  892. AfterLineLoop:
  893.     btst    #6,2(a6)
  894.     bne.s    AfterLineLoop
  895.     cmp.w    #-1,(a1)
  896.     beq.s    AfterLinesDone
  897.     move.w    #$8000,$74(a6)
  898.     move.w    #40,$60(a6)
  899.     move.w    (a1)+,d4
  900.     or.w    #%101111111010,d4
  901.     move.w    d4,$40(a6)
  902.     move.w    (a1)+,$62(a6)
  903.     move.w    (a1)+,$52(a6)
  904.     move.w    (a1)+,$64(a6)
  905.     move.w    (a1)+,d4
  906.     bclr    #1,d4
  907.     move.w    d4,$42(a6)
  908.     move.l    (a1),$48(a6)
  909.     move.l    (a1)+,$54(a6)
  910.     move.w    (a1)+,$58(a6)
  911.     bra.s    AfterLineLoop
  912.  
  913. AfterLinesDone:
  914.     clr.w    AreaCount
  915.     movem.l    (a7)+,d2-d7/a2-a5
  916.     rts
  917.  
  918. LineDrawEntry:
  919.     movem.l    d2-d4/d7/a3,-(a7)
  920.     movem.w    CP_X,d2/d3
  921.     movem.w    d0/d1,CP_X
  922. WaitLineBlitter:
  923.     btst    #6,2(a6)
  924.     bne.s    WaitLineBlitter
  925.     moveq    #15,d4
  926.     and.w    d2,d4
  927.     lsl.w    #8,d4
  928.     lsl.w    #4,d4
  929.     move.w    d4,(a1)+
  930.     or.w    #%101101101010,d4
  931.     move.w    d4,$40(a6)
  932.  
  933.     sub.w    d2,d0
  934.     blt.s    lbC0000CE
  935.     beq    DrawLineNoAfterLine
  936.     sub.w    d3,d1
  937.     blt.s    lbC0000BE
  938.     cmp.w    d0,d1
  939.     bgt.s    lbC0000B8
  940.     beq.s    apulbC1
  941.     moveq    #$13,d7
  942.     bra.s    lbC0000F0
  943. apulbC1:
  944.     subq.l    #2,a1
  945.     bra    xbC0000B8
  946. lbC0000B8
  947.     moveq    #1,d7
  948.     exg    d1,d0
  949.     bra.s    lbC0000F0
  950. lbC0000BE
  951.     neg.w    d1
  952.     cmp.w    d0,d1
  953.     bgt.s    lbC0000C8
  954.     beq.s    apulbC2
  955.     moveq    #$1b,d7
  956.     bra.s    lbC0000F0
  957. apulbC2:
  958.     subq.l    #2,a1
  959.     bra    xbC0000C8
  960. lbC0000C8
  961.     moveq    #7,d7
  962.     exg    d1,d0
  963.     bra.s    lbC0000F0
  964. lbC0000CE
  965.     neg.w    d0
  966.     sub.w    d3,d1
  967.     blt.s    lbC0000E2
  968.     cmp.w    d0,d1
  969.     bgt.s    lbC0000DC
  970.     beq.s    apulbC3
  971.     moveq    #$17,d7
  972.     bra.s    lbC0000F0
  973. apulbC3:
  974.     subq.l    #2,a1
  975.     bra    xbC0000DC
  976. lbC0000DC
  977.     moveq    #$b,d7
  978.     exg    d1,d0
  979.     bra.s    lbC0000F0
  980. lbC0000E2
  981.     neg.w    d1
  982.     cmp.w    d0,d1
  983.     bgt.s    lbC0000EC
  984.     beq.s    apulbC4
  985.     moveq    #$1f,d7
  986.     bra.s    lbC0000F0
  987. apulbC4:
  988.     subq.l    #2,a1
  989.     bra    xbC0000EC
  990. lbC0000EC
  991.     moveq    #15,d7
  992.     exg    d1,d0
  993.  
  994. lbC0000F0
  995.     add.w    d1,d1
  996.     move.w    d1,(a1)+
  997.     move.w    d1,$0062(a6)    ;4y
  998.     sub.w    d0,d1
  999.     bge.s    lbC000102
  1000.     or.w    #$40,d7
  1001. lbC000102
  1002.     move.w    d1,(a1)+
  1003.     move.w    d1,$0052(a6)    ;2y-x
  1004.     sub.w    d0,d1
  1005.     move.w    d1,(a1)+
  1006.     move.w    d7,(a1)+
  1007.     move.w    d1,$0064(a6)    ;4y-4x    
  1008.     move.w    d7,$0042(a6)    ;con1
  1009.  
  1010.     move.w    d2,d4
  1011.  
  1012.     mulu.w    #40,d3
  1013.     asr.w    #3,d2        ;x/8
  1014.     ext.l    d2
  1015.     add.l    d2,d3        ;koko
  1016.     add.l    TmpBmap,d3
  1017.     move.l    d3,(a1)+
  1018.     move.l    d3,$0048(a6)
  1019.     move.l    d3,$0054(a6)
  1020.  
  1021.     asl.w    #6,d0
  1022.     add.w    #66,d0
  1023.  
  1024.     bclr    #0,RPFlags2
  1025.     bne.s    lbChangePoint
  1026.     and.w    #15,d4
  1027.     moveq    #15,d1
  1028.     sub.w    d4,d1
  1029.     move.l    d3,a3
  1030.     bchg    d1,(a3)
  1031. lbChangePoint:
  1032.  
  1033.     move.w    d0,(a1)+
  1034.     move.w    d0,$0058(a6)
  1035.  
  1036.     movem.l    (a7)+,d2-d4/d7/a3
  1037.     rts
  1038.  
  1039. DrawLineNoAfterLine:
  1040.     subq.l    #2,a1
  1041.     sub.w    d3,d1
  1042.     blt.s    xbC0000BE
  1043.     cmp.w    d0,d1
  1044.     bge.s    xbC0000B8
  1045.     moveq    #$13,d7
  1046.     bra.s    xbC0000F0
  1047. xbC0000B8
  1048.     moveq    #1,d7
  1049.     exg    d1,d0
  1050.     bra.s    xbC0000F0
  1051. xbC0000BE
  1052.     neg.w    d1
  1053.     cmp.w    d0,d1
  1054.     bge.s    xbC0000C8
  1055.     moveq    #$1b,d7
  1056.     bra.s    xbC0000F0
  1057. xbC0000C8
  1058.     moveq    #7,d7
  1059.     exg    d1,d0
  1060.     bra.s    xbC0000F0
  1061. xbC0000CE
  1062.     neg.w    d0
  1063.     sub.w    d3,d1
  1064.     blt.s    xbC0000E2
  1065.     cmp.w    d0,d1
  1066.     bge.s    xbC0000DC
  1067.     moveq    #$17,d7
  1068.     bra.s    xbC0000F0
  1069. xbC0000DC
  1070.     moveq    #$b,d7
  1071.     exg    d1,d0
  1072.     bra.s    xbC0000F0
  1073. xbC0000E2
  1074.     neg.w    d1
  1075.     cmp.w    d0,d1
  1076.     bge.s    xbC0000EC
  1077.     moveq    #$1f,d7
  1078.     bra.s    xbC0000F0
  1079. xbC0000EC
  1080.     moveq    #15,d7
  1081.     exg    d1,d0
  1082.  
  1083. xbC0000F0
  1084.     add.w    d1,d1
  1085.     move.w    d1,$0062(a6)    ;4y
  1086.     sub.w    d0,d1
  1087.     bge.s    xbC000102
  1088.     or.w    #$40,d7
  1089. xbC000102
  1090.     move.w    d1,$0052(a6)    ;2y-x
  1091.     sub.w    d0,d1
  1092.     move.w    d1,$0064(a6)    ;4y-4x    
  1093.     move.w    d7,$0042(a6)    ;con1
  1094.  
  1095.     move.w    d2,d4
  1096.  
  1097.     mulu.w    #40,d3
  1098.     asr.w    #3,d2        ;x/8
  1099.     ext.l    d2
  1100.     add.l    d2,d3        ;koko
  1101.     add.l    TmpBmap,d3
  1102.     move.l    d3,$0048(a6)
  1103.     move.l    d3,$0054(a6)
  1104.  
  1105.     asl.w    #6,d0
  1106.     add.w    #66,d0
  1107.  
  1108.     bclr    #0,RPFlags2
  1109.     bne.s    xbChangePoint
  1110.     and.w    #15,d4
  1111.     moveq    #15,d1
  1112.     sub.w    d4,d1
  1113.     move.l    d3,a3
  1114.     bchg    d1,(a3)
  1115. xbChangePoint:
  1116.  
  1117.     move.w    d0,$0058(a6)
  1118.  
  1119.     movem.l    (a7)+,d2-d4/d7/a3
  1120.     rts
  1121.  
  1122. inter:    movem.l    d0-d7/a0-a6,-(sp)
  1123.  
  1124. * Tänne voisi laittaa interrupt-koodia...
  1125.  
  1126.     movem.l    (sp)+,d0-d7/a0-a6
  1127.     jmp    0
  1128. intadr:    =*-4
  1129.  
  1130. MyCopperList:
  1131.     dc.w    $00e0,$0000,$00e2,$0000
  1132.     dc.w    $00e4,$0000,$00e6,$0000
  1133.     dc.w    $00e8,$0000,$00ea,$0000
  1134.     dc.w    $0108,$0000,$010a,$0000
  1135.     dc.w    $0100,$3200,$0102,$0000
  1136.     dc.w    $0104,$0000
  1137.     dc.w    $008e,$2c81,$0090,$2cc1
  1138.     dc.w    $0092,$0038,$0094,$00d0
  1139.     dc.w    $0180,$0000,$0182,$000f,$0184,$00f0,$0186,$00ff
  1140.     dc.w    $0188,$0f00,$018a,$0f0f,$018c,$0ff0,$018e,$0fff
  1141.  
  1142.     dc.w    $f411,$fff0,$0100,$0200
  1143.  
  1144.     dc.w    $ffff,$fffe
  1145.  
  1146. MyCopperList2:
  1147.     dc.w    $00e0,$0000,$00e2,$0000
  1148.     dc.w    $00e4,$0000,$00e6,$0000
  1149.     dc.w    $00e8,$0000,$00ea,$0000
  1150.     dc.w    $0108,$0000,$010a,$0000
  1151.     dc.w    $0100,$3200,$0102,$0000
  1152.     dc.w    $0104,$0000
  1153.     dc.w    $008e,$2c81,$0090,$2cc1
  1154.     dc.w    $0092,$0038,$0094,$00d0
  1155.     dc.w    $0180,$0000,$0182,$000f,$0184,$00f0,$0186,$00ff
  1156.     dc.w    $0188,$0f00,$018a,$0f0f,$018c,$0ff0,$018e,$0fff
  1157.  
  1158.     dc.w    $f411,$fff0,$0100,$0200
  1159.  
  1160.     dc.w    $ffff,$fffe
  1161.  
  1162. Copper:        dc.l    0
  1163. Copper2:    dc.l    0
  1164. X:        ds.w    200
  1165. Y:        ds.w    200
  1166. ET:        ds.w    200
  1167. Q:        ds.w    9
  1168. W:        ds.w    9
  1169. MX:        dc.w    0
  1170. MY:        dc.w    0
  1171. MZ:        dc.w    -512
  1172. MXA:        dc.w    0
  1173. MYA:        dc.w    0 
  1174. MZA:        dc.w    0
  1175. OX:        dc.w    0
  1176. OY:        dc.w    0
  1177. OZ:        dc.w    0
  1178.  
  1179. OXA:        dc.w    45
  1180. OYA:        dc.w    45
  1181. OZA:        dc.w    45
  1182.  
  1183. INTBASE:    dc.l    0
  1184. GFXBASE:    dc.l    0
  1185. TmpBmap:    dc.l    0
  1186. STATE:        dc.w    0
  1187. OldCop:        dc.l    0
  1188. ThisRP:        dc.l    0
  1189. Bmaps1:        ds.l    5
  1190. Bmaps2:        ds.l    5
  1191. LinePoints:    ds.b    1400
  1192. AreaPoints:    ds.l    100
  1193. AreaFlags:    ds.w    100
  1194. NowAPoints:    dc.l    AreaPoints
  1195. NowAFlags:    dc.l    AreaFlags
  1196. AreaCount:    dc.w    0
  1197. Pino:        ds.b    100
  1198. AXS:        dc.w    0
  1199. AYS:        dc.w    0
  1200. Vari:        dc.w    0
  1201. BlitMOD:    dc.w    0
  1202. BlitSIZE:    dc.w    0
  1203. BlitSTART:    dc.l    0
  1204. CP_X:        dc.w    0
  1205. CP_Y:        dc.w    0
  1206. RPFlags1:    dc.b    0
  1207. RPFlags2:    dc.b    0
  1208. RPLinPatC:    dc.w    0
  1209.  
  1210. hyppy:        dc.w    0
  1211.  
  1212. pisteet:    dc.l    kuutiop
  1213. kuviot:        dc.l    kuutiok
  1214.  
  1215. ;kuviot (polygonit) on määritelty muodossa:
  1216.  
  1217. ;    1.    mikäli tämä luku on 1, seuraava polygon on tämän vastakohta
  1218. ;    2.    väri
  1219. ;    3.    etäisyys (ohjelma laskee)
  1220. ;    4.    montako pistettä
  1221. ;    5-    pisteet
  1222.  
  1223. KUUTIOP:
  1224.     dc.w    -70,-70,-70
  1225.     dc.w    -70,70,-70
  1226.     dc.w    70,70,-70
  1227.     dc.w    70,-70,-70
  1228.     dc.w    -70,-70,70
  1229.     dc.w    -70,70,70
  1230.     dc.w    70,70,70
  1231.     dc.w    70,-70,70
  1232.     dc.w    9999
  1233.  
  1234. KUUTIOK:
  1235.     dc.w    0,1,0,4,0,1,2,3
  1236.     dc.w    0,2,0,4,4,5,6,7
  1237.     dc.w    0,3,0,4,0,1,5,4
  1238.     dc.w    0,4,0,4,3,2,6,7
  1239.     dc.w    0,5,0,4,1,2,6,5
  1240.     dc.w    0,6,0,4,0,3,7,4
  1241.     dc.w    9999
  1242.  
  1243. IntLibName:    dc.b    'intuition.library',0
  1244. GfxLibName:    dc.b    'graphics.library',0,0
  1245. SinCos:    incbin    'SinCosL128'            ;tässä tiedostossa on
  1246.                         ;sinin ja cosinin arvot
  1247.                         ;kerrottuna 128:lla
  1248.