home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti_3d / 3d2 / filledvectors.s < prev    next >
Text File  |  1995-05-15  |  28KB  |  1,132 lines

  1. wblt: MACRO            ; "wblt" als Macro definieren
  2.  
  3. \@ btst #6,$dff002        ; \@ = Label, das bei jedem Macro-Aufruf einen
  4.    bne.s \@            ; anderen Namen trägt
  5.  
  6.  ENDM
  7.  
  8. Start:
  9.  move.w #$4000,$dff09a        ; Interrupts sperren
  10.  bsr.s init            ; Initialisierung
  11.  bsr DoVector            ; HauptRoutine
  12.  wblt
  13.  move.l 4.w,a6            ; System wieder herholen
  14.  lea gfxname(pc),a1
  15.  jsr -408(a6)
  16.  move.l d0,a1
  17.  move.l 38(a1),$dff080
  18.  move.w d0,$dff088
  19.  jsr -414(a6)
  20.  move.l screen(pc),a1
  21.  move.l #$12000,d0
  22.  jsr -210(a6)
  23.  move.l oldvbi(pc),$6c.w
  24.  move.w intena(pc),d0
  25.  or.w #$8000,d0
  26.  move.w #$7fff,$dff096
  27.  move.w #$83f0,$dff096
  28.  move.w #$7fff,$dff09c
  29.  move.w d0,$dff09a
  30.  moveq #0,d0
  31.  rts
  32.  
  33. init:                ; INITIALISIERUNG
  34.  move.l 4.w,a6
  35.  move.l #$12000,d0
  36.  move.l #$30002,d1
  37.  jsr -198(a6)            ; ChipRAM
  38.  move.l d0,screen        ; er reicht doch?
  39.  lea $dff000,a6            ; Register-Init
  40.  move.w #$7fff,$96(a6)
  41.  move.l #0,$144(a6)
  42.  move.l #copperlist,$80(a6)
  43.  move.w d0,$88(a6)
  44.  move.l #$2c812cc1,$8e(a6)
  45.  move.l #$3800d0,$92(a6)
  46.  move.l #0,$102(a6)
  47.  move.w #0,$1fc(a6)
  48.  move.l #0,$108(a6)
  49.  move.w #$3200,$100(a6)
  50.  move.l d0,a0            ; Bildschirm-Seiten
  51.  move.l a0,a1
  52.  add.l #$12000,a1
  53.  move.l d0,pgh
  54.  add.l #$8000,d0
  55.  move.l d0,pgs
  56.  add.l #$8000,d0
  57.  move.l d0,tmpadr
  58.  moveq #0,d0
  59. clrlp:
  60.  move.l d0,(a0)+
  61.  cmp.l a1,a0
  62.  blt.s clrlp
  63.  move.l #rottab+2,rotptr
  64.  move.w rottab(pc),rotcnt
  65.  bsr dorot            ; bei Verwendung eigener Objekte entfernen!
  66.  move.l $6c.w,oldvbi        ; Interrupt-Init
  67.  move.l #vbiserver,$6c.w
  68.  move.w $1c(a6),intena
  69.  move.w #$7fff,$9a(a6)
  70.  move.w #$c020,$9a(a6)        ; Nur VBI erlauben
  71.  move.w #$87c0,$96(a6)
  72.  rts
  73.  
  74. vbiserver:            ; INTERRUPT
  75.  movem.l d0-d7/a0-a6,-(a7)
  76.  lea $dff000,a6
  77.  bsr joy            ; Joystick-Abfrage
  78.  bsr rotob            ; Mutation des Rotations-Körpers (bei Ver-
  79.                                 ; wendung eigener Objekte entfernen!)
  80.  move.w #1,vbi
  81.  move.w #$20,$9c(a6)
  82.  movem.l (a7)+,d0-d7/a0-a6
  83.  rte
  84.  
  85. joy:                ; JOYSTICK
  86.  move.w $dff00c,d0
  87.  btst #1,d0
  88.  bne.s right
  89.  btst #9,d0
  90.  bne.s left
  91. testud:
  92.  move.w d0,d1
  93.  lsr.w d1
  94.  eor.w d1,d0
  95.  btst #0,d0
  96.  bne.s bckw
  97.  btst #8,d0
  98.  bne.w forw
  99.  rts
  100. right:                ; rechts
  101.  btst #7,$bfe001        ; rechts + Feuer ?
  102.  bne.s nfr
  103.  addq.w #6,rzb            ; Feuer -> z-rot + 3°
  104.  cmp.w #720,rzb
  105.  blt.s ok1
  106.  move.w #0,rzb
  107. ok1:
  108.  bra.s testud
  109. nfr:                ; kein Feuer -> y-rot + 3°
  110.  addq.w #6,ryb
  111.  cmp.w #720,ryb
  112.  blt.s ok
  113.  move.w #0,ryb
  114. ok:
  115.  bra.s testud
  116. left:                ; links
  117.  btst #7,$bfe001        ; links + Feuer ?
  118.  bne.s nfrl
  119.  subq.w #6,rzb            ; Feuer -> z-rot - 3°
  120.  bge.s ok11
  121.  add.w #720,rzb
  122. ok11:
  123.  bra.s testud
  124. nfrl:
  125.  subq.w #6,ryb            ; kein Feuer -> y-rot - 3°
  126.  bne.s ok21
  127.  add.w #720,ryb
  128. ok21:
  129.  bra testud
  130. bckw:                ; zurück
  131.  btst #7,$bfe001        ; zurück + Feuer
  132.  bne.s nfr2
  133.  cmp.l #-5000,addzb        ; Feuer -> 1000 Punkte näher ran
  134.  bge.s ok22
  135.  add.l #1000,addzb
  136. ok22:
  137.  rts
  138. nfr2:                ; kein Feuer -> x-rot - 3°
  139.  subq.w #6,rxb
  140.  bge.s ok23
  141.  add.w #720,rxb
  142. ok23:
  143.  rts
  144. forw:                ; vorwärts
  145.  btst #7,$bfe001        ; vorwärts + Feuer
  146.  bne.s nfr3
  147.  cmp.l #-250000,addzb        ; Feuer -> 1000 Punkte weiter weg
  148.  ble.s ok24
  149.  sub.l #1000,addzb
  150. ok24:
  151.  rts
  152. nfr3:                ; kein Feuer -> x-rot + 3°
  153.  addq.w #6,rxb
  154.  cmp.w #720,rxb
  155.  blt.s ok25
  156.  move.w #0,rxb
  157. ok25:
  158.  rts
  159.  
  160. DoVector:            ; HAUPT-ROUTINE
  161.  movem.l d2-d7/a2-a6,-(a7)
  162. vcloop:                ; warten auf VBI
  163.  tst.w vbi
  164.  beq.s vcloop
  165.  move.w #-1,drawnum
  166.  bsr clrscreen            ; Bildlöschen starten
  167.  bsr vector            ; Berechnung und Zeichnung
  168.  move.w #0,vbi
  169.  btst #6,$bfe001        ; Left Mouse Button ?
  170.  bne.s vcloop
  171.  movem.l (a7)+,d2-d7/a2-a6
  172.  rts
  173.  
  174. clrscreen:            ; BILDLÖSCHEN
  175.  movem.l pgh,d0-d1        ; Page Flipping
  176.  move.l d0,pgs            ; für Double Buffering
  177.  move.l d1,pgh
  178.  lea page,a0            ; neue Seiten in CopperList
  179.  move.w d0,6(a0)
  180.  swap d0
  181.  move.w d0,2(a0)
  182.  swap d0
  183.  add.l #148*40,d0
  184.  move.w d0,14(a0)
  185.  swap d0
  186.  move.w d0,10(a0)
  187.  swap d0
  188.  add.l #148*40,d0
  189.  move.w d0,22(a0)
  190.  swap d0
  191.  move.w d0,18(a0)
  192.  movem.l addxb(pc),d0-d4    ; gebufferte Joystickbewegungen
  193.  movem.l d0-d4,addx        ; für gültig erklären.
  194.  move.w #$4000,$9a(a6)        ; Int's sperren (falls Blitter auch im VBI
  195.  wblt                ; gebraucht würde)
  196.  moveq #-1,d0
  197.  move.l d0,$44(a6)
  198.  move.w #0,$66(a6)
  199.  move.l #$1000000,$40(a6)
  200.  move.l pgh(pc),$54(a6)
  201.  move.w #148*3*64+(40/2),$58(a6); Starten des Löschens
  202.  move.w #$c000,$9a(a6)
  203.  rts
  204.  
  205. quicksort:            ; QUICKSORT-Algorithmus
  206.  moveq #0,d4
  207.  move.l #ztab,d5
  208.  lea lrtab(pc),a0
  209.  lea dttab(pc),a1
  210.  move.l d5,0(a0,d4.w)
  211.  move.l zend(pc),a5
  212.  move.l a5,4(a0,d4.w)
  213. l20:
  214.  move.l 0(a0,d4.w),d5
  215.  move.l 4(a0,d4.w),a5
  216.  subq.w #8,d4
  217. l30:
  218.  move.l d5,a2
  219.  move.l a5,a3
  220.  move.l a2,d1
  221.  sub.l #ztab,d1
  222.  move.w d1,d3
  223.  add.w d1,d1
  224.  add.w d3,d1
  225.  asr.w #1,d3
  226.  add.w d3,d1
  227.  move.l a3,d2
  228.  sub.l #ztab,d2
  229.  move.w d2,d3
  230.  add.w d2,d2
  231.  add.w d3,d2
  232.  asr.w #1,d3
  233.  add.w d3,d2
  234.  move.l d5,d0
  235.  add.l a5,d0
  236.  asr.l #3,d0
  237.  asl.l #2,d0
  238.  move.l d0,a6
  239.  move.l (a6),d3
  240. l40:
  241.  cmp.l (a2),d3
  242.  ble.s l41
  243.  addq.l #4,a2
  244.  add.w #14,d1
  245.  bra.s l40
  246. l41:
  247.  cmp.l (a3),d3
  248.  bge.s l42
  249.  subq.l #4,a3
  250.  sub.w #14,d2
  251.  bra.s l41
  252. l42:
  253.  cmp.l a3,a2
  254.  bgt.s l50
  255.  move.l (a3),d0
  256.  move.l (a2),(a3)
  257.  move.l d0,(a2)
  258.  exg.l d0,d5
  259.  movem.l 0(a1,d1.w),d5-d7
  260.  move.l 0(a1,d2.w),0(a1,d1.w)
  261.  move.l 4(a1,d2.w),4(a1,d1.w)
  262.  move.l 8(a1,d2.w),8(a1,d1.w)
  263.  movem.l d5-d7,0(a1,d2.w)
  264.  move.w 12(a1,d1.w),d5
  265.  move.w 12(a1,d2.w),12(a1,d1.w)
  266.  move.w d5,12(a1,d2.w)
  267.  exg.l d0,d5
  268.  addq.l #4,a2
  269.  subq.l #4,a3
  270.  add.w #14,d1
  271.  sub.w #14,d2
  272.  cmp.l a3,a2
  273.  ble.s l40
  274. l50:
  275.  cmp.l a5,a2
  276.  blt.s l52
  277. l51:
  278.  move.l a3,a5
  279.  cmp.l a5,d5
  280.  blt l30
  281.  tst.w d4
  282.  bge l20
  283.  rts
  284. l52:
  285.  addq.w #8,d4
  286.  move.l a2,0(a0,d4.w)
  287.  move.l a5,4(a0,d4.w)
  288.  bra.s l51
  289.  
  290. vector:                ; hier erfolgt die Hauptarbeit
  291.  bsr transform            ; Rotation + 3D-Projektion
  292.  bsr backs            ; Flächenrücken-Überprüfung
  293.  tst.w drawnum            ; keine Fläche zu sehen?
  294.  blt end            ; dann Ende
  295.  bsr quicksort            ; schneller Sortieralgorithmus
  296.  lea dttab(pc),a5        ; Tabelle mit Zeigern auf die sortierten,
  297.  lea $dff000,a6            ; verbleibenden Flächen
  298.  lea hix(pc),a1
  299.  move.w drawnum(pc),d7
  300. lp:
  301.  move.l (a5)+,a3        ; Flächen-Info-Adresse
  302.  move.l 6(a5),a2
  303.  move.w (a3)+,d5        ; Eckenzahl holen
  304.  lea 10(a5),a5            ; Zeiger auf nächste Fläche erhöhen
  305.  subq.w #1,d5
  306.  move.w (a3)+,-(a7)        ; Farbe auf Stack
  307.  moveq #-1,d0
  308.  move.w #640,2(a1)        ; Ausmaße für Füll- und Kopier-Fenster reseten
  309.  move.w d0,(a1)
  310.  move.w #640,6(a1)
  311.  move.w d0,4(a1)
  312.  move.w #0,line
  313.  lea scx1(pc),a4        ; Eintrag in Rechte-Rand-Clip löschen
  314.  move.l d0,(a4)
  315.  move.l d0,4(a4)
  316. linelp:
  317.  move.w (a3)+,d6        ; Eckpunktnummer aus Flächen-Info holen
  318.                                 ; (Startpunkt)
  319.  movem.w 0(a2,d6.w),d0-d1    ; entsprechende 2D-Koordinaten aus ttab holen
  320.  move.w (a3),d6
  321.  movem.w 0(a2,d6.w),d2-d3    ; Endpunkt holen
  322.  asr.w #4,d0            ; wieder durch 16 dividieren
  323.  asr.w #4,d1
  324.  asr.w #4,d2
  325.  asr.w #4,d3
  326.  bsr drawl            ; Clippen + Linie zeichnen
  327.  dbf d5,linelp            ; alle Linien einer Fläche?
  328.  tst.w scx1            ; wurde Eintrag in
  329.  blt.s noclip            ; Rechte-Rand-Clip gemacht?
  330.  tst.w scx2            ; ja -> Clip-Linie zeichnen
  331.  blt.s noclip
  332.  lea scx1(pc),a4
  333.  movem.w (a4),d0-d3
  334.  bsr.s drawl            ; Clip-Linie zeichnen
  335. noclip:                ; kein Rechte-Rand-Clip
  336.  tst.w line            ; gar keine Linie gezeichnet?
  337.  beq.s nodraw
  338.  bsr calcwindow            ; erhaltene Fill-/Copy-Fenster Maße umrechnen
  339.  move.w (a7)+,d4        ; Farbe holen
  340.  bsr copy
  341.  dbf d7,lp            ; alle Flächen?
  342. end:
  343.  rts
  344. nodraw:
  345.  move.w (a7)+,d4        ; Farbe holen
  346.  dbf d7,lp            ; alle Flächen
  347.  rts
  348.  
  349. drawl:                ; LINIE clippen + zeichnen
  350.  movem.l d4-d7/a5-a6,-(a7)
  351.  cmp.w d1,d3            ; weiter unten liegendes Koordinaten-Paar
  352.                  ; nach d2-d3
  353.  bge.s ec
  354.  exg.l d0,d2
  355.  exg.l d1,d3
  356. ec:
  357.  cmp.w 6(a1),d1            ; neues lo-y?
  358.  bge.s lyk
  359.  move.w d1,6(a1)
  360. lyk:
  361.  cmp.w 4(a1),d3            ; neues hi-y?
  362.  ble.s hyk
  363.  move.w d3,4(a1)
  364. hyk:
  365.  move.w d0,d4            ; höheres x nach d5
  366.  move.w d2,d5            ; niederes x nach d4
  367.  cmp.w d4,d5
  368.  bge.s ok13
  369.  exg.l d4,d5            ; d4/d6 ggf. austauschen
  370. ok13:
  371.  cmp.w 2(a1),d4            ; neues lo-x?
  372.  bge.s lxk
  373.  move.w d4,2(a1)
  374. lxk:
  375.  cmp.w (a1),d5            ; neues hi-x?
  376.  ble.s chky
  377.  move.w d5,(a1)
  378. chky:                ; Clipping, rechts zuerst
  379.  move.w #319,d6
  380.  cmp.w d6,d0            ; P1 rechts von rechter Kante
  381.  bgt.s ctx21            ; ja -> x = 319 und neues y
  382.  cmp.w d6,d2            ; P2 rechts von rechter Kante
  383.  bgt.w ctx22            ; ja -> x = 319 und neues y
  384.  moveq #0,d6
  385.  tst.w d1            ; P1 über Oberkante ?
  386.  bmi.s cty11            ; ja -> y = 0 und neues x
  387.  tst.w d3            ; P2 über Oberkante ?
  388.  bmi.s cty12            ; ja -> y = 0 und neues x
  389.  move.w #147,d6
  390.  cmp.w d6,d1            ; P1 unter Unterkante ?
  391.  bgt.s cty21            ; ja -> x = 147 und neues y
  392.  cmp.w d6,d3            ; P2 unter Unterkante ?
  393.  bgt.s cty22            ; ja -> x = 147 und neues y
  394. chkx:
  395.  moveq #0,d6
  396.  tst.w d0            ; P1 links von linker Kante ?
  397.  bmi.s ctx11            ; ja -> x = 0 und neues y
  398.  tst.w d2            ; P2 links von linker Kante ?
  399.  bmi.s ctx12            ; ja -> x = 0 und neues y
  400.  bra dline
  401. cty11:                ; Clip Oberkante
  402.  tst.w d3            ; auch P2 über Oberkante (-> Line unsichtbar) ?
  403.  bmi.s clpend
  404.  bsr.s clipy
  405.  move.w d4,d0            ; berechnete x-Koordinate
  406.  moveq #0,d1            ; y=0
  407.  bra chky            ; noch einmal überprüfen
  408. cty12:
  409.  bsr.s clipy            ; Clip Oberkante
  410.  move.w d4,d2            ; berechnete x-Koordinate
  411.  moveq #0,d3            ; y=0
  412.  bra chky
  413. cty21:                ; Clip Unterkante
  414.  cmp.w d6,d3            ; auch P2 unter Unterkante ?
  415.  bgt.s clpend
  416.  bsr.s clipy
  417.  move.w d4,d0            ; berechnete x-Koordinate
  418.  move.w d6,d1            ; y=147
  419.  bra chky
  420. cty22:                ; Clip Unterkante
  421.  bsr.s clipy
  422.  move.w d4,d2            ; berechnete x-Koordinate
  423.  move.w d6,d3            ; y=147
  424.  bra chky
  425. ctx11:                ; Clip linke Kante
  426.  tst.w d2            ; auch P2 links von linker Kante ?
  427.  bmi.s clpend
  428.  bsr.s clipx
  429.  move.w d4,d1            ; berechnete y-Koordinate
  430.  moveq #0,d0            ; x=0
  431.  bra chky
  432. ctx12:                ; Clip linke Kante
  433.  bsr.s clipx
  434.  move.w d4,d3            ; berechnete y-Koordinate
  435.  moveq #0,d2            ; x=0
  436.  bra chky
  437. ctx21:                ; Clip rechte Kante
  438.  cmp.w d6,d2            ; auch P2 rechts von rechter Kante ?
  439.  bgt.s clpend
  440.  bsr.s clipx
  441.  move.w d4,d1            ; berechnete y-Koordinate
  442.  move.w d6,d0            ; x=319
  443.  movem.w d0-d1,(a4)        ; Schnittpunkt mit rechter Kante merken
  444.  addq.l #4,a4
  445.  bra chky            ; noch einmal überprüfen
  446. ctx22:                ; Clip rechte Kante
  447.  bsr.s clipx
  448.  move.w d4,d3            ; berechnete y-Koordinate
  449.  move.w d6,d2            ; x=319
  450.  movem.w d2-d3,(a4)        ; Schnittpunkt mit rechter Kante merken
  451.  addq.l #4,a4
  452.  bra chky            ; noch einmal überprüfen
  453. clpend:                ; Linie unsichtbar
  454.  movem.l (a7)+,d4-d7/a5-a6
  455.  rts
  456. clipy:                ; yb bekannt (Unter-/Oberkante)
  457.  move.w d0,d4            ; xn berechnen
  458.  sub.w d2,d4            ; x' = x1-x2
  459.  move.w d3,d5
  460.  move.w d3,d7
  461.  sub.w d6,d7            ; y' = y2-yb
  462.  muls d7,d4            ; xn = x' * y'
  463.  sub.w d1,d5
  464.  divs d5,d4            ; xn = xn / (y2-y1)
  465.  add.w d2,d4            ; xn = xn + x2
  466.  rts
  467. clipx:                ; xb bekannt (Linke/Rechte Kante)
  468.  move.w d1,d4            ; yn berechnen
  469.  sub.w d3,d4            ; y' = y1-y2
  470.  move.w d2,d5
  471.  move.w d2,d7
  472.  sub.w d6,d7            ; x' = x2-xb
  473.  muls d7,d4            ; yn = x' * y'
  474.  sub.w d0,d5
  475.  divs d5,d4            ; yn = yn / (x2-x1)
  476.  add.w d3,d4            ; yn = yn + y2
  477.  rts
  478.  
  479. dline:                ; Hier wird gezeichnet
  480.  cmp.w d1,d3            ; Falls y1 = y2 -> Keine Linie,
  481.  beq drawend            ; da Blitter im Single-Mode
  482.  move.w d1,d5
  483.  move.w d1,d4
  484.  asl.w #5,d5
  485.  asl.w #3,d4
  486.  add.w d4,d5
  487.  move.l tmpadr(pc),a5        ; In Hilfs-Ebene zeichnen
  488.  lea 0(a5,d5.w),a5
  489.  move.w d0,d4
  490.  asr.w #4,d4
  491.  add.w d4,d4
  492.  lea 0(a5,d4.w),a5        ; Adresse für Prozessor-EOR
  493.  sub.w d0,d2
  494.  sub.w d1,d3
  495.  moveq #15,d5
  496.  and.l d5,d0
  497.  move.w d0,d4
  498.  ror.l #4,d0
  499.  eor.w d5,d4
  500.  moveq #0,d5
  501.  bset d4,d5            ; Genaues Bit für Prozessor-EOR
  502.  move.w #4,d0
  503.  tst.w d2
  504.  bpl.s d2g0
  505.  addq.w #1,d0
  506.  neg.w d2
  507. d2g0:
  508.  cmp.w d2,d3
  509.  ble.s d2gd3
  510.  exg.l d2,d3
  511.  subq.w #4,d0
  512.  add.w d0,d0
  513. d2gd3:
  514.  move.w d3,d4
  515.  sub.w d2,d4
  516.  add.w d4,d4
  517.  add.w d4,d4
  518.  add.w d3,d3
  519.  moveq #0,d6
  520.  move.w d3,d6
  521.  sub.w d2,d6
  522.  bpl.s d6gd2
  523.  or.w #16,d0
  524. d6gd2:
  525.  add.w d3,d3
  526.  add.w d0,d0
  527.  add.w d0,d0
  528.  addq.w #1,d2
  529.  asl.w #6,d2
  530.  addq.w #2,d2
  531.  swap d3
  532.  move.w d4,d3
  533.  or.l #$b4a0003,d0        ; EOR-MiniTerms + SING-Bit + Line-Bit
  534.  move.w #$4000,$9a(a6)        ; Interrupts wegen Blitter sperren (falls
  535.  wblt                ; im VBI Blitterzugriff erfolgt)
  536.  moveq #40,d1            ; Register für Line initialisieren
  537.  move.w d1,$60(a6)
  538.  move.w d1,$66(a6)
  539.  moveq #-1,d1
  540.  move.l d1,$44(a6)
  541.  move.w d1,$72(a6)
  542.  move.w #$8000,$74(a6)
  543.  eor.w d5,(a5)            ; Prozessor-EOR
  544.  move.l d3,$62(a6)
  545.  move.l a5,$48(a6)
  546.  move.l a5,$54(a6)
  547.  move.w d6,$52(a6)
  548.  move.l d0,$40(a6)
  549.  move.w d2,$58(a6)
  550.  move.w #$c000,$9a(a6)        ; Interrupts wieder freigeben
  551.  add.w #1,line
  552. drawend:
  553.  movem.l (a7)+,d4-d7/a5-a6
  554.  rts
  555.  
  556. calcwindow:            ; GRÖSSE des Fill-/Copy- Fensters
  557.  cmp.w #319,(a1)        ; in Adressen u. Modulo umrechnen
  558.  ble.s ok14
  559.  move.w #319,(a1)        ; Überprüfung auf Rand-Überschreitung
  560.  ok14:
  561.   tst 2(a1)
  562.   bge.s ok15            ; ...
  563.   move.w #0,2(a1)
  564.  ok15:
  565.   cmp.w #147,4(a1)
  566.   ble.s ok16
  567.   move.w #147,4(a1)
  568.  ok16:
  569.   tst.w 6(a1)
  570.   bge.s ok17
  571.   move.w #0,6(a1)
  572.  ok17:
  573.   move.w (a1),d0
  574.   asr.w #4,d0            ; x-Offset des Blitterfensters
  575.   asl.w #1,d0
  576.   move.w d0,woffx
  577.   asr.w #1,d0
  578.   move.w 2(a1),d1
  579.   asr.w #4,d1
  580.   sub.w d1,d0            ; x-Größe des Blitterfensters
  581.   addq.w #1,d0
  582.   move.w d0,wsizex
  583.   asl.w #1,d0
  584.   moveq #40,d1            ; Modulo
  585.   sub.w d0,d1            ; für temporäre
  586.   move.w d1,tmpmod        ; Hilfsebene
  587.   move.w 4(a1),d0
  588.   sub.w 6(a1),d0        ; y-Ausdehnung des Blitterfensters
  589.   addq.w #1,d0
  590.   move.w d0,wsizey
  591.   move.w 4(a1),d0
  592.   move.w d0,d1
  593.   asl.w #3,d0
  594.   asl.w #5,d1            ; y-Offset des Blitterfensters
  595.   add.w d1,d0
  596.   move.w d0,woffy
  597.   rts
  598.  
  599. transform:            ; TRANSFORMATION
  600.  lea objpd(pc),a2        ; 3D-Eckpunkt-Daten
  601.  lea ttab(pc),a3        ; Tabelle für 2D-Ergebnis-Daten
  602.  lea sintab(pc),a0        ; Zeiger auf Sinus-Tabelle
  603.  lea costab(pc),a1        ; Zeiger auf Cosinus-Tabelle
  604.  lea z2tab(pc),a4        ; Zwischen-Tabelle für 3D-Z-Koords der
  605.  moveq #15,d6            ; einzelnen Punkte
  606.  move.w (a2)+,d5
  607.  subq.w #1,d5            ; Eckenzahl - 1
  608. translp:
  609.  movem.w (a2)+,d0-d2        ; 3D-Koordinaten holen
  610.  asl.w #4,d0            ; Zwecks höherer Genauigkeit der
  611.  asl.w #4,d1            ; Rechnungen, Multiplikation mit 16
  612.  asl.w #4,d2
  613.  move.w rx(pc),d3        ; Rotation um x-Achse
  614.  move.w d1,d4
  615.  move.w d2,d7
  616.  muls 0(a1,d3.w),d1
  617.  muls 0(a0,d3.w),d2
  618.  sub.l d2,d1
  619.  asr.l d6,d1
  620.  muls 0(a0,d3.w),d4
  621.  muls 0(a1,d3.w),d7
  622.  add.l d7,d4
  623.  asr.l d6,d4
  624.  move.w d4,d2
  625.  move.w ry(pc),d3        ; Rotation um y-Achse
  626.  move.w d0,d4
  627.  move.w d2,d7
  628.  muls 0(a1,d3.w),d0
  629.  muls 0(a0,d3.w),d2
  630.  add.l d2,d0
  631.  asr.l d6,d0
  632.  neg.w d4
  633.  muls 0(a0,d3.w),d4
  634.  muls 0(a1,d3.w),d7
  635.  add.l d7,d4
  636.  asr.l d6,d4
  637.  move.w d4,d2
  638.  move.w rz(pc),d3        ; Rotation um z-Achse
  639.  move.w d0,d4
  640.  move.w d1,d7
  641.  muls 0(a1,d3.w),d0
  642.  muls 0(a0,d3.w),d1
  643.  sub.l d1,d0
  644.  asr.l d6,d0
  645.  muls 0(a0,d3.w),d4
  646.  muls 0(a1,d3.w),d7
  647.  add.l d7,d4
  648.  asr.l d6,d4
  649.  move.w d4,d1
  650.  move.w d2,(a4)+        ; z-Koordinate jedes einzelnen Echpunktes
  651.  ext.l d0            ; nach Zwischentabelle
  652.  ext.l d1
  653.  ext.l d2
  654.  add.l addx(pc),d0        ; Verschiebung addieren
  655.  add.l addy(pc),d1
  656.  add.l addz(pc),d2
  657.  beq.s ptjend
  658.  moveq #10,d3            ; Strahlensatz:
  659.  asl.l d3,d0            ;      f*x
  660.  asl.l d3,d1            ; x' = -
  661.  asr.l #3,d2            ;       z
  662.  divs d2,d0
  663.  divs d2,d1            ;        f*y
  664.  neg.w d0            ; y' = - -
  665.  add.w #160*16,d0        ;         z
  666.  add.w #74*16,d1        ; Zentrieren
  667. ptjend:
  668.  movem.w d0-d1,(a3)        ; und nach 2D-Tabelle speichern
  669.  addq.l #4,a3
  670.  dbf d5,translp
  671.  rts
  672.  
  673. backs:                ; FLÄCHENRÜCKEN-Überprüfung
  674.  lea objad(pc),a2
  675.  lea ttab(pc),a3
  676.  lea z2tab(pc),a1
  677.  lea ztab(pc),a0
  678.  lea dttab(pc),a4
  679.  move.w (a2)+,d7
  680.  subq.w #1,d7
  681. backslp:
  682.  move.w 4(a2),d5
  683.  movem.w 0(a3,d5.w),d0-d1    ; 2D-Koordinaten der drei ersten Punkte
  684.  move.w 6(a2),d5        ; (im Text D, E, F, genannt)
  685.  movem.w 0(a3,d5.w),d2-d3
  686.  move.w 8(a2),d5
  687.  movem.w 0(a3,d5.w),d4-d5
  688.  sub.w d0,d2            ; Daraus Vektoren
  689.  sub.w d1,d3            ; v
  690.  sub.w d0,d4            ; und
  691.  sub.w d1,d5            ; w berechnen
  692.  muls d2,d5            ; Multiplikation f+r
  693.  muls d3,d4            ; Vektorprodukt
  694.  sub.l d4,d5            ; und Subtraktion dazu
  695.  bmi.s notvisib            ; <0 -> nix sichtbar
  696.  move.w (a2),d6
  697.  subq.w #1,d6
  698.  moveq #4,d5
  699.  moveq #0,d1
  700. avlp:
  701.  move.w 0(a2,d5.w),d0        ; Addition der z-Koordinaten
  702.  asr.w #1,d0            ; der Eckpunkte aus der
  703.  add.w 0(a1,d0.w),d1        ; Zwischen-Tabelle ...
  704.  addq.w #2,d5
  705.  dbf d6,avlp
  706.  addq.w #1,drawnum
  707.  ext.l d1
  708.  divs (a2),d1            ; ... Division durch Anzahl der Eckpunkte
  709.  ext.l d1            ; zur Durchschnittsberechnung
  710.  add.l addz(pc),d1
  711.  move.l d1,(a0)+        ; In ztab zum Sortieren speichern.
  712.  move.l a2,(a4)+        ; Eintrag für sichtbare Fläche
  713.  addq.l #6,a4            ; in dttab anlegen (Zeiger auf
  714.  move.l a3,(a4)+        ; objad-Eintrag, ...)
  715. notvisib:
  716.  lea 22(a2),a2
  717.  dbf d7,backslp            ; alle Flächen?
  718.  subq.l #4,a0
  719.  move.l a0,zend            ; Ende von ztab (für Quicksort)
  720.  rts
  721.  
  722. copy:                ; FÜLLEN der Fläche in Hilfsebene
  723.  move.l tmpadr(pc),a0        ; + KOPIEREN in Hauptscreen
  724.  move.l pgh(pc),a1        ; + LÖSCHEN der Hilfsebene
  725.  moveq #0,d2
  726.  move.w woffx(pc),d2        ; berechnete Window-Werte holen
  727.  add.w woffy(pc),d2
  728.  add.l d2,a0
  729.  add.l d2,a1
  730.  move.w wsizey(pc),d2
  731.  asl.w #6,d2
  732.  add.w wsizex(pc),d2
  733.  move.w tmpmod(pc),d0
  734.  moveq #-1,d1
  735.  move.w #$4000,$9a(a6)
  736.  wblt
  737.  move.w d0,$62(a6)
  738.  move.w d0,$64(a6)
  739.  move.w d0,$66(a6)
  740.  move.l d1,$44(a6)
  741.  move.l a0,$50(a6)
  742.  move.l a0,$54(a6)
  743.  move.l #$9f00012,$40(a6)
  744.  move.w d2,$58(a6)        ; Füllen
  745.  move.l #$dfc0002,d1
  746.  moveq #0,d0
  747.  move.l #$f00000,d3        ; Wechseln für
  748. copylp:                ; löschend oder
  749.  btst d0,d4            ; setzend kopieren
  750.  bne.s ok18
  751.  sub.l d3,d1
  752. ok18:
  753.  wblt
  754.  move.l d1,$40(a6)
  755.  move.l a0,$50(a6)
  756.  move.l a1,$4c(a6)
  757.  move.l a1,$54(a6)
  758.  move.w d2,$58(a6)        ; Nach Farb-Wert in die
  759.  or.l d3,d1            ; drei Ebenen kopieren
  760.  lea 148*40(a1),a1
  761.  addq.w #1,d0
  762.  cmp.w #2,d0
  763.  ble.s copylp            ; Alle drei Ebenen?
  764.  wblt
  765.  move.l #$1000002,$40(a6)
  766.  move.l a0,$54(a6)
  767.  move.w d2,$58(a6)        ; Fläche in Hilfsebene
  768.  move.w #$c000,$9a(a6)        ; wieder löschen
  769.  rts
  770.  
  771. rotob:                ; BEARBEITUNG von "rottab"
  772.  subq.w #1,animcnt
  773.  bge.s endrot            ; Nur jeden dritten Aufruf
  774.  move.w #2,animcnt        ; abarbeiten
  775.  lea objpd(pc),a2
  776.  move.l rotptr(pc),a3
  777.  moveq #5,d6            ; sechs Einschnitte
  778. rotlp:
  779.  move.w 2(a2),d0
  780.  cmp.w (a3),d0            ; vorgegebenes x erreicht?
  781.  beq.s okx
  782.  blt.s lowx
  783.  subq.w #2,2(a2)        ; noch zu groß ->
  784.  bra.s okx            ; Verringerung um 8
  785. lowx:
  786.  addq.w #8,2(a2)        ; noch zu klein ->
  787. okx:                ; Vergrößerung um 8
  788.  move.w 4(a2),d0
  789.  cmp.w 2(a3),d0            ; vorgegebenes y erreicht?
  790.  beq.s oky
  791.  blt.s lowy
  792.  subq.w #8,4(a2)        ; noch zu groß ->
  793.  bra.s oky            ; Verringerung um 8
  794. lowy:
  795.  addq.w #8,4(a2)        ; noch zu klein ->
  796. oky:                ; Vergrößerung um 8
  797.  lea 8*6(a2),a2
  798.  addq.l #4,a3
  799.  dbf d6,rotlp
  800.  subq.w #1,rotcnt
  801.  bgt.s ok30            ; Darstellungszeit zu ende?
  802.  tst.w (a3)
  803.  bge.s ok20            ; "rottab" zu ende?
  804.  lea rottab(pc),a3
  805. ok20:
  806.  move.w (a3)+,rotcnt
  807.  move.l a3,rotptr
  808. ok30:
  809.  bsr.s dorot
  810. endrot
  811.  rts
  812.  
  813. dorot:                ; ermittelte Kontur des
  814.  lea sintab(pc),a0        ; Körpers dreidimensionalisieren
  815.  lea costab(pc),a1
  816.  lea objpd(pc),a2
  817.  moveq #5,d6            ; sechs Einschnitte
  818.  moveq #15,d7
  819.  addq.l #2,a2
  820. roto:
  821.  moveq #7,d5            ; Kreis in acht Abschnitte a 45°
  822.  moveq #0,d4            ; zerteilen
  823.  move.w (a2),d3            ; x-Koordinate
  824.  move.w 2(a2),d1        ; und y-Koordinate des Kontur-
  825. roti:                ; Einschnittes holen (y nur für movem)
  826.  move.w d3,d0
  827.  move.w d3,d2
  828.  muls 0(a1,d4.w),d0        ; x mit cos multiplizieren -> neu_x
  829.  muls 0(a0,d4.w),d2        ; x mit sin multiplizieren -> neu_z
  830.  asr.l d7,d0
  831.  asr.l d7,d2
  832.  movem d0-d2,(a2)        ; als 3D-Koords in "objpd" speichern
  833.  addq.l #6,a2
  834.  add.w #90,d4
  835.  dbf d5,roti
  836.  dbf d6,roto
  837.  rts
  838.  
  839. tmpadr dc.l 0
  840. screen dc.l 0
  841. vbi dc.w 0
  842. pgh dc.l 0             ; ******
  843. pgs dc.l 0
  844. addx dc.l 0            ; WICHTIG!!
  845. addy dc.l 0
  846. addz dc.l 0            ; Diese
  847. rx dc.w 0
  848. ry dc.w 0            ; Konstellation
  849. rz dc.w 0
  850.    dc.w 0            ; darf
  851. hix dc.w 0
  852. lox dc.w 0            ; unter
  853. hiy dc.w 0
  854. loy dc.w 0            ; keinen
  855. addxb dc.l 0
  856. addyb dc.l 0            ; Umständen
  857. addzb dc.l -25000    ; (Start-Z)
  858. rxb dc.w 0            ; geändert
  859. ryb dc.w 0
  860. rzb dc.w 0            ; werden
  861. scx1 dc.w 0            ; !!
  862. scy1 dc.w 0            ; !!
  863. scx2 dc.w 0            ; !!
  864. scy2 dc.w 0            ; ******
  865. zend dc.l 0
  866. wsizex dc.w 1
  867. wsizey dc.w 1
  868. woffx dc.w 0
  869. woffy dc.w 0
  870. tmpmod dc.w 0
  871. drawnum dc.w 0
  872. line dc.w 0
  873. animcnt dc.w 0
  874. oldvbi dc.l 0
  875. intena dc.w 0
  876. rotcnt dc.w 0
  877. rotptr dc.l 0
  878.  
  879. ttab:                ; Tabelle für 2D-Koordinaten
  880.  dcb.w 50*2
  881.  
  882. z2tab:                ; Zwischen-Tabelle für z-Koords jedes Punktes
  883.  dcb.w 50
  884.  cnop 0,4
  885.  
  886. ztab:                ; z-Koordinaten-Tabelle für Flächendurch-
  887.  dcb.l 50            ; schnitt (Sortieren)
  888.  
  889. dttab:                ; Tabelle mit Einträgen der sichtbaren Flächen
  890.  dcb.w 50*7
  891.  
  892. lrtab:                ; Hilfs-Tabelle für Quicksort
  893.  dcb.l 50
  894.  
  895. rottab:                ; Tabelle für Mutation des Körpers
  896.  dc.w 30            ; Dauer der Darstellung dieser Mutation
  897.  dc.w -$a*3,$40*3        ; x, y-Ziel für ersten Einschnitt
  898.  dc.w -$14*3,$28*3        ; x, y-Ziel für zweiten Einschnitt
  899.  dc.w -$40*3,$8*3        ; x, y-Ziel für dritten Einschnitt
  900.  dc.w -$40*3,-$8*3        ; x, y-Ziel für vierten Einschnitt
  901.  dc.w -$14*3,-$28*3        ; x, y-Ziel für fünften Einschnitt
  902.  dc.w -$a*3,-$40*3        ; x, y-Ziel für sechsten Einschnitt
  903.  dc.w 30            ; Dauer der Darstellung der nächsten Mutation
  904.  dc.w -$3a*3,$40*3
  905.  dc.w -$24*3,$20*3
  906.  dc.w -$10*3,$20*3
  907.  dc.w -$10*3,-$20*3
  908.  dc.w -$24*3,-$20*3
  909.  dc.w -$3a*3,-$40*3
  910.  dc.w 30
  911.  dc.w -$a*3,$40*3
  912.  dc.w -$34*3,$20*3
  913.  dc.w -$10*3,$20*3
  914.  dc.w -$10*3,-$20*3
  915.  dc.w -$34*3,-$20*3
  916.  dc.w -$a*3,-$40*3
  917.  dc.w 30
  918.  dc.w -$a*3,$28*3
  919.  dc.w -$34*3,$8*3
  920.  dc.w -$10*3,$8*3
  921.  dc.w -$10*3,-$8*3
  922.  dc.w -$34*3,-$8*3
  923.  dc.w -$a*3,-$28*3
  924.  dc.w 30
  925.  dc.w -$a*3,$40*3
  926.  dc.w -$14*3,$8*3
  927.  dc.w -$40*3,$8*3
  928.  dc.w -$40*3,-$8*3
  929.  dc.w -$14*3,-$8*3
  930.  dc.w -$a*3,-$40*3
  931.  dc.w 30
  932.  dc.w -$a*3,$40*3
  933.  dc.w -$3c*3,$28*3
  934.  dc.w -$50*3,$10*3
  935.  dc.w -$50*3,-$10*3
  936.  dc.w -$3c*3,-$28*3
  937.  dc.w -$a*3,-$40*3
  938.  dc.w 30
  939.  dc.w -$a*3,$8*3
  940.  dc.w -$3c*3,$28*3
  941.  dc.w -$50*3,$10*3
  942.  dc.w -$50*3,-$10*3
  943.  dc.w -$3c*3,-$28*3
  944.  dc.w -$a*3,-$8*3
  945.  dc.w 50
  946.  dc.w -$a*3,$40*3
  947.  dc.w -$24*3,$30*3
  948.  dc.w -$40*3,-$8*3
  949.  dc.w -$10*3,-$10*3
  950.  dc.w -$24*3,-$20*3
  951.  dc.w -$a*3,-$40*3
  952.  dc.w 50
  953.  dc.w -$a*3,$40*3
  954.  dc.w -$24*3,$20*3
  955.  dc.w -$8*3,-$10*3
  956.  dc.w -$20*3,-$10*3
  957.  dc.w -$24*3,-$20*3
  958.  dc.w -$a*3,-$40*3
  959.  dc.w 50
  960.  dc.w -$3a*3,$40*3
  961.  dc.w -$24*3,$20*3
  962.  dc.w -$20*3,$10*3
  963.  dc.w -$8*3,$10*3
  964.  dc.w -$c*3,-$20*3
  965.  dc.w -$3a*3,-$40*3
  966.  dc.w 50
  967.  dc.w -$a*3,$10*3
  968.  dc.w -$3c*3,$40*3
  969.  dc.w -$20*3,$10*3
  970.  dc.w -$8*3,$10*3
  971.  dc.w -$c*3,-$30*3
  972.  dc.w -$32*3,-$40*3
  973.  dc.w 50
  974.  dc.w -$a*3,$40*3
  975.  dc.w -$44*3,$20*3
  976.  dc.w -$8*3,$20*3
  977.  dc.w -$20*3,-$10*3
  978.  dc.w -$c*3,-$20*3
  979.  dc.w -$a*3,-$40*3
  980.  dc.w -1
  981.  
  982. objpd:                ; Eckpunkt-Tabelle
  983.  dc.w 6*8            ; Anzahl Eckpunkte
  984.  dc.w -$a*3,$40*3,0        ; x,y,z
  985.  dcb.w 7*3            ; sieben leer-x,y,z; werden von "dorot"
  986.  dc.w -$14*3,$28*3,0        ; beschrieben
  987.  dcb.w 7*3
  988.  dc.w -$40*3,$8*3,0
  989.  dcb.w 7*3
  990.  dc.w -$40*3,-$8*3,0
  991.  dcb.w 7*3
  992.  dc.w -$14*3,-$28*3,0
  993.  dcb.w 7*3
  994.  dc.w -$a*3,-$40*3,0
  995.  dcb.w 7*3
  996.  
  997. objad:        ; Flächen-Tabelle: Eckenzahl,Farbe, 9 mal Platz für Punkte
  998.  dc.w 2+8+8+8+8+8 ; Anzahl der Flächen
  999.  dc.w 8,7,0*4,1*4,2*4,3*4,4*4,5*4,6*4,7*4,0*4
  1000.  dc.w 8,7,47*4,46*4,45*4,44*4,43*4,42*4,41*4,40*4,47*4
  1001.  
  1002.  dc.w 4,3,40*4,41*4,33*4,32*4,40*4,0,0,0,0
  1003.  dc.w 4,4,41*4,42*4,34*4,33*4,41*4,0,0,0,0
  1004.  dc.w 4,3,42*4,43*4,35*4,34*4,42*4,0,0,0,0
  1005.  dc.w 4,4,43*4,44*4,36*4,35*4,43*4,0,0,0,0
  1006.  dc.w 4,3,44*4,45*4,37*4,36*4,44*4,0,0,0,0
  1007.  dc.w 4,4,45*4,46*4,38*4,37*4,45*4,0,0,0,0
  1008.  dc.w 4,3,46*4,47*4,39*4,38*4,46*4,0,0,0,0
  1009.  dc.w 4,4,47*4,40*4,32*4,39*4,47*4,0,0,0,0
  1010.  
  1011.  dc.w 4,3,8*4,9*4,1*4,0*4,8*4,0,0,0,0
  1012.  dc.w 4,4,9*4,10*4,2*4,1*4,9*4,0,0,0,0
  1013.  dc.w 4,3,10*4,11*4,3*4,2*4,10*4,0,0,0,0
  1014.  dc.w 4,4,11*4,12*4,4*4,3*4,11*4,0,0,0,0
  1015.  dc.w 4,3,12*4,13*4,5*4,4*4,12*4,0,0,0,0
  1016.  dc.w 4,4,13*4,14*4,6*4,5*4,13*4,0,0,0,0
  1017.  dc.w 4,3,14*4,15*4,7*4,6*4,14*4,0,0,0,0
  1018.  dc.w 4,4,15*4,8*4,0*4,7*4,15*4,0,0,0,0
  1019.  
  1020.  dc.w 4,2,16*4,17*4,9*4,8*4,16*4,0,0,0,0
  1021.  dc.w 4,1,17*4,18*4,10*4,9*4,17*4,0,0,0,0
  1022.  dc.w 4,2,18*4,19*4,11*4,10*4,18*4,0,0,0,0
  1023.  dc.w 4,1,19*4,20*4,12*4,11*4,19*4,0,0,0,0
  1024.  dc.w 4,2,20*4,21*4,13*4,12*4,20*4,0,0,0,0
  1025.  dc.w 4,1,21*4,22*4,14*4,13*4,21*4,0,0,0,0
  1026.  dc.w 4,2,22*4,23*4,15*4,14*4,22*4,0,0,0,0
  1027.  dc.w 4,1,23*4,16*4,8*4,15*4,23*4,0,0,0,0
  1028.  
  1029.  dc.w 4,5,24*4,25*4,17*4,16*4,24*4,0,0,0,0
  1030.  dc.w 4,6,25*4,26*4,18*4,17*4,25*4,0,0,0,0
  1031.  dc.w 4,5,26*4,27*4,19*4,18*4,26*4,0,0,0,0
  1032.  dc.w 4,6,27*4,28*4,20*4,19*4,27*4,0,0,0,0
  1033.  dc.w 4,5,28*4,29*4,21*4,20*4,28*4,0,0,0,0
  1034.  dc.w 4,6,29*4,30*4,22*4,21*4,29*4,0,0,0,0
  1035.  dc.w 4,5,30*4,31*4,23*4,22*4,30*4,0,0,0,0
  1036.  dc.w 4,6,31*4,24*4,16*4,23*4,31*4,0,0,0,0
  1037.  
  1038.  dc.w 4,2,32*4,33*4,25*4,24*4,32*4,0,0,0,0
  1039.  dc.w 4,1,33*4,34*4,26*4,25*4,33*4,0,0,0,0
  1040.  dc.w 4,2,34*4,35*4,27*4,26*4,34*4,0,0,0,0
  1041.  dc.w 4,1,35*4,36*4,28*4,27*4,35*4,0,0,0,0
  1042.  dc.w 4,2,36*4,37*4,29*4,28*4,36*4,0,0,0,0
  1043.  dc.w 4,1,37*4,38*4,30*4,29*4,37*4,0,0,0,0
  1044.  dc.w 4,2,38*4,39*4,31*4,30*4,38*4,0,0,0,0
  1045.  dc.w 4,1,39*4,32*4,24*4,31*4,39*4,0,0,0,0
  1046.  
  1047. ; Neue Sinus/Cosinus-Tabelle:
  1048. ; -$8000 bis $7fff
  1049.  
  1050. sintab DC.W 0,$23B,$477,$6B2,$8ED,$B27,$D61,$F99
  1051.        DC.W $11D0,$1405,$1639,$186C,$1A9C,$1CCA,$1EF7,$2120
  1052.        DC.W $2347,$256C,$278D,$29AB,$2BC6,$2DDE,$2FF2,$3203
  1053.        DC.W $340F,$3617,$381C,$3A1B,$3C17,$3E0D,$3FFF,$41EC
  1054.        DC.W $43D3,$45B6,$4793,$496A,$4B3B,$4D07,$4ECD,$508C
  1055.        DC.W $5246,$53F9,$55A5,$574B,$58E9,$5A81,$5C12,$5D9C
  1056.        DC.W $5F1E,$6099,$620C,$6378,$64DC,$6638,$678D,$68D9
  1057.        DC.W $6A1D,$6B58,$6C8C,$6DB6,$6ED9,$6FF2,$7103,$720B
  1058.        DC.W $730A,$7400,$74EE,$75D2,$76AD,$777E,$7846,$7905
  1059.        DC.W $79BB,$7A67,$7B09,$7BA2,$7C31,$7CB7,$7D32,$7DA4
  1060.        DC.W $7E0D,$7E6B,$7EC0,$7F0A,$7F4B,$7F82,$7FAF,$7FD2
  1061.        DC.W $7FEB,$7FFA
  1062. costab DC.W $7FFF,$7FFA,$7FEB,$7FD2,$7FAF,$7F82
  1063.        DC.W $7F4B,$7F0A,$7EC0,$7E6B,$7E0D,$7DA4,$7D32,$7CB7
  1064.        DC.W $7C31,$7BA2,$7B09,$7A67,$79BB,$7905,$7846,$777E
  1065.        DC.W $76AD,$75D2,$74EE,$7400,$730A,$720B,$7103,$6FF2
  1066.        DC.W $6ED9,$6DB6,$6C8B,$6B58,$6A1D,$68D9,$678D,$6638
  1067.        DC.W $64DC,$6378,$620C,$6099,$5F1E,$5D9C,$5C12,$5A81
  1068.        DC.W $58E9,$574B,$55A5,$5EF9,$5246,$508C,$4ECD,$4D07
  1069.        DC.W $4B3B,$496A,$4793,$45B6,$43D3,$41EC,$3FFF,$3E0D
  1070.        DC.W $3C17,$3A1B,$381C,$3618,$340F,$3203,$2FF2,$2DDE
  1071.        DC.W $2BC7,$29AB,$278D,$256C,$2347,$2120,$1EF7,$1CCB
  1072.        DC.W $1A9C,$186C,$163A,$1406,$11D0,$F99,$D61,$B27
  1073.        DC.W $8ED,$6B3,$477,$23C,0,$FDC5,$FB89,$F94E
  1074.        DC.W $F713,$F4D9,$F2A0,$F067,$EE30,$EBFB,$E9C7,$E794
  1075.        DC.W $E564,$E336,$E10A,$DEE0,$DCB9,$DA95,$D873,$D655
  1076.        DC.W $D43A,$D222,$D00E,$CDFE,$CBF1,$C9E9,$C7E5,$C5E5
  1077.        DC.W $C3EA,$C1F3,$C001,$BE14,$BC2D,$BA4B,$B86E,$B696
  1078.        DC.W $B4C5,$B2F9,$B133,$AF74,$ADBB,$AC08,$AA5B,$A8B6
  1079.        DC.W $A717,$A57F,$A3EE,$A264,$A0E2,$9F67,$9DF4,$9C88
  1080.        DC.W $9B24,$99C8,$9874,$9728,$95E4,$94A8,$9375,$924A
  1081.        DC.W $9128,$900E,$8EFD,$8DF5,$8CF6,$8C00,$8B13,$8A2E
  1082.        DC.W $8954,$8882,$87BA,$86FB,$8645,$8599,$84F7,$845E
  1083.        DC.W $83CF,$8349,$82CE,$825C,$81FE,$8195,$8140,$80F6
  1084.        DC.W $80B5,$807E,$8051,$802E,$8015,$8006,$8001,$8006
  1085.        DC.W $8015,$802E,$8051,$807E,$80B5,$80F6,$8140,$8195
  1086.        DC.W $81F3,$825B,$82CD,$8349,$83CF,$845E,$84F7,$8599
  1087.        DC.W $8645,$86FB,$87B9,$8882,$8953,$8A2E,$8B12,$8BFF
  1088.        DC.W $8CF5,$8DF5,$8EFD,$900E,$9127,$9249,$9374,$94A7
  1089.        DC.W $95E3,$9727,$9873,$99C7,$9B23,$9C87,$9DF3,$9F67
  1090.        DC.W $A0E1,$A264,$A3ED,$A57E,$A716,$A8B5,$AA5B,$AC07
  1091.        DC.W $ADBA,$AF73,$B133,$B2F8,$B4C4,$B696,$B86D,$BA4A
  1092.        DC.W $BC2C,$BE14,$C000,$C1F2,$C3E9,$C5E4,$C7E4,$C9E8
  1093.        DC.W $CBF0,$CDFD,$D00D,$D221,$D439,$D654,$D872,$DA94
  1094.        DC.W $DCB8,$DEDF,$E109,$E335,$E563,$E794,$E9C6,$EBFA
  1095.        DC.W $EE30,$F066,$F29F,$F4D8,$F712,$F49D,$FB88,$FDC4
  1096. sinend DC.W 0,$23B,$477,$6B2,$8ED,$B27,$D61,$F99
  1097.        DC.W $11D0,$1405,$1639,$186C,$1A9C,$1CCA,$1EF7,$2120
  1098.        DC.W $2347,$256C,$278D,$29AB,$2BC6,$2DDE,$2FF2,$3203
  1099.        DC.W $340F,$3617,$381C,$3A1B,$3C17,$3E0D,$3FFF,$41EC
  1100.        DC.W $43D3,$45B6,$4793,$496A,$4B3B,$4D07,$4ECD,$508C
  1101.        DC.W $5246,$53F9,$55A5,$574B,$58E9,$5A81,$5C12,$5D9C
  1102.        DC.W $5F1E,$6099,$620C,$6378,$64DC,$6638,$678D,$68D9
  1103.        DC.W $6A1D,$6B58,$6C8C,$6DB6,$6ED9,$6FF2,$7103,$720B
  1104.        DC.W $730A,$7400,$74EE,$75D2,$76AD,$777E,$7846,$7905
  1105.        DC.W $79BB,$7A67,$7B09,$7BA2,$7C31,$7CB7,$7D32,$7DA4
  1106.        DC.W $7E0D,$7E6B,$7EC0,$7F0A,$7F4B,$7F82,$7FAF,$7FD2
  1107.        DC.W $7FEB,$7FFA
  1108. cosend
  1109.  
  1110. gfxname dc.b "graphics.library",0
  1111.  
  1112.    section copperlist,data_c
  1113.  
  1114. copperlist:
  1115.  dc.w $2001,-2
  1116.  dc.w $180,$000,$182,$0a0,$184,$080
  1117.  dc.w $186,$00c,$188,$00a,$18a,$a0a
  1118.  dc.w $18c,$808,$18e,$00f
  1119.  dc.w $5e01,-2,$180,$05a
  1120.  dc.w $5f01,-2,$180,$07c
  1121.  dc.w $6001,-2,$180,$0af
  1122.  dc.w $6101,-2,$180,$05a
  1123.  dc.w $620f,-2,$96,$8100,$180,0
  1124. page:
  1125.  dc.w $e0,0,$e2,0,$e4,0,$e6,0,$e8,0,$ea,0
  1126.  dc.w $f601,-2,$96,$100,$180,$05a
  1127.  dc.w $f701,-2,$180,$0af
  1128.  dc.w $f801,-2,$180,$07c
  1129.  dc.w $f901,-2,$180,$05a
  1130.  dc.w $fa01,-2,$180,0
  1131.  dc.w -1,-2
  1132.