home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 594b.lha / VectorLibrary / vector.s < prev   
Text File  |  1991-11-09  |  43KB  |  2,344 lines

  1.  ; ****  vector.library V1.66   ©1991 by A.Lippert
  2.  
  3.  
  4.  incdir dh0:include/
  5.  include exec/types.i
  6.  include exec/nodes.i
  7.  include exec/libraries.i
  8.  include exec/initializers.i
  9.  include exec/lists.i
  10.  include exec/resident.i
  11.  include libraries/dos.i
  12.  
  13. wblt MACRO
  14.  
  15. .\@ btst  #6,$dff002
  16.     bne.s .\@
  17.  
  18.  ENDM
  19.  
  20.  
  21.  STRUCTURE My_Lib,LIB_SIZE
  22.            ULONG ml_SysLib
  23.            ULONG ml_DosLib
  24.            ULONG ml_SegList
  25.            ULONG ml_Flags
  26.            ULONG ml_pad
  27.            LABEL MyLib_SIZE
  28.  
  29. Start:
  30.  moveq  #0,d0
  31.  rts
  32.  
  33. Version  = 1
  34. Revision = 66
  35. Priority = 0
  36.  
  37. Resident:
  38.  dc.w RTC_MATCHWORD
  39.  dc.l Resident
  40.  dc.l CodeEnd
  41.  dc.b RTF_AUTOINIT
  42.  dc.b Version
  43.  dc.b NT_LIBRARY
  44.  dc.b Priority
  45.  dc.l LibName
  46.  dc.l IDString
  47.  dc.l Init
  48.  
  49. LibName:
  50.  dc.b "vector.library",0
  51. IDString:
  52.  dc.b "vector.library V1.66  (16-Sep-91)   Coding by Alexander Lippert",0
  53. dosname:
  54.  dc.b "dos.library",0
  55.  
  56.  even
  57.  
  58. CodeEnd:
  59.  
  60. Init:
  61.  dc.l MyLib_SIZE
  62.  dc.l FuncTab
  63.  dc.l DataTab
  64.  dc.l InitRoutine
  65.  
  66. FuncTab:
  67.  dc.l Open
  68.  dc.l Close
  69.  dc.l Expunge
  70.  dc.l Nil
  71.  
  72.  dc.l SetVBI
  73.  dc.l InitVBOBs
  74.  dc.l OpenVScreen
  75.  dc.l CloseVScreen
  76.  dc.l UseJoy
  77.  dc.l DoAnim
  78.  dc.l RotateX
  79.  dc.l RotateY
  80.  dc.l RotateZ
  81.  dc.l FreeVBOBs
  82.  dc.l AutoScaleOn
  83.  dc.l AutoScaleOff
  84.  dc.l FreeJoy
  85.  dc.l SetColors
  86.  
  87.  dc.l -1
  88.  
  89. DataTab:
  90.  INITBYTE LH_TYPE,NT_LIBRARY
  91.  INITLONG LN_NAME,LibName
  92.  INITBYTE LIB_FLAGS,LIBF_SUMUSED!LIBF_CHANGED
  93.  INITWORD LIB_VERSION,Version
  94.  INITWORD LIB_REVISION,Revision
  95.  INITLONG LIB_IDSTRING,IDString
  96.  dc.l 0
  97.  
  98. InitRoutine: 
  99.  move.l a5,-(a7)
  100.  move.l d0,a5
  101.  move.l a6,ml_SysLib(a5)
  102.  move.l a0,ml_SegList(a5)
  103.  lea    dosname(pc),a1
  104.  jsr    -408(a6)
  105.  move.l d0,ml_DosLib(a5)
  106.  move.l d0,dosbase
  107.  move.l a5,d0
  108.  move.l (a7)+,a5
  109.  rts
  110.  
  111. Open:
  112.  addq.w #1,LIB_OPENCNT(a6)
  113.  bclr   #LIBB_DELEXP,ml_Flags(a6)
  114.  move.l a6,d0
  115.  cmp.w  #1,LIB_OPENCNT(a6)
  116.  bne    .end
  117.  movem.l d0-d1/a0-a1/a6,-(a7)
  118.  move.l 4.w,a6
  119.  move.w #1,vbi
  120.  lea    vbistruc(pc),a1
  121.  moveq  #5,d0
  122.  jsr    -168(a6)
  123.  lea    gfxname(pc),a1
  124.  jsr    -408(a6)
  125.  move.l d0,gfxbase
  126.  lea    intname(pc),a1
  127.  jsr    -408(a6)
  128.  move.l d0,intbase
  129.  movem.l (a7)+,d0-d1/a0-a1/a6
  130.  rts
  131. .end:
  132.  subq.w #1,LIB_OPENCNT(a6)
  133.  moveq  #0,d0
  134.  rts
  135.  
  136. vbistruc:
  137.  dc.l 0,0
  138.  dc.b 2,5
  139.  dc.l 0
  140.  dc.l vbidata
  141.  dc.l vbiserver
  142. vbidata:
  143.  dc.l 5,0
  144.  
  145. vbiserver:
  146.  movem.l d1-d7/a0-a6,-(a7)
  147.  tst.w  vbi
  148.  bne    .noflip
  149.  movem.l plnh(pc),d0-1
  150.  move.l d0,plns
  151.  move.l d1,plnh
  152.  movem.l bmh(pc),d0-1
  153.  move.l d0,bms
  154.  move.l d1,bmh
  155.  move.l d0,rasinfo+4
  156.  move.l clist1(pc),a0
  157.  move.l (a0),a0
  158.  add.l  delta(pc),a0
  159.  cmp.w  #$e0,-2(a0)
  160.  beq.s  .cok
  161.  bra.s  .noflip
  162. .cok:
  163.  move.w (a0),d0
  164.  swap   d0
  165.  move.w 4(a0),d0
  166.  sub.l  plnh(pc),d0
  167.  cmp.l  #-4,d0
  168.  blt.s  .noflip
  169.  cmp.l  #4,d0
  170.  bgt.s  .noflip
  171.  add.l plns(pc),d0
  172.  move.l d0,d3
  173.  moveq  #1,d2
  174. .colp:
  175.  move.w used(pc),d1
  176.  subq.w #1,d1
  177. .clp:
  178.  move.w d0,4(a0)
  179.  swap   d0
  180.  move.w d0,(a0)
  181.  swap   d0
  182.  add.l  onepln(pc),d0
  183.  addq.l #8,a0
  184.  dbf    d1,.clp
  185.  btst   #2,flags+1
  186.  beq.s  .noflip
  187.  move.w width(pc),d0
  188.  ext.l  d0
  189.  add.l  d3,d0
  190.  move.l clist2(pc),a0
  191.  move.l (a0),a0
  192.  add.l  delta(pc),a0
  193.  dbf    d2,.colp
  194. .noflip:
  195.  lea     jptab(pc),a2
  196. .lp:
  197.  move.l  (a2)+,a3
  198.  cmp.l   #0,a3
  199.  beq.s   .ok
  200.  jsr     (a3)
  201. .ok:
  202.  tst.l   (a2)
  203.  bge.s   .lp
  204.  move.w  #1,vbi
  205.  movem.l (a7)+,d1-d7/a0-a6
  206.  moveq   #0,d0
  207.  rts
  208.  
  209. jptab:
  210.  dc.l 0
  211. anadr:
  212.  dc.l 0
  213. joyadr:
  214.  dc.l 0
  215.  dc.l -1
  216.  
  217. move:
  218.  movem.l d2-d3/a2-a3,-(a7)
  219.  move.l strptr(pc),a2
  220.  move.l rootptr(pc),a3
  221.  move.w (a2)+,d2
  222.  subq.w #1,d2
  223. .lab
  224.  move.l (a2)+,a1
  225.  tst.w  16(a3)
  226.  bne    .end
  227.  move.l 4(a3),a0
  228.  subq.w #1,8(a3)
  229.  bge.s  .ok
  230.  lea    14(a0),a0
  231. .ok3:
  232.  cmp.w  #-1,(a0)
  233.  bgt.s  .ok2
  234.  blt.s  .doloop
  235.  move.w #1,16(a3)
  236.  movem.l (a7)+,d2-d3/a2-a3
  237.  rts
  238. .doloop:
  239.  cmp.w  #-2,(a0)
  240.  blt.s  .dlp
  241.  move.l #nilobj,-4(a2)
  242.  move.w #1,16(a3)
  243.  bra    .end
  244. .dlp:
  245.  cmp.w  #-3,(a0)
  246.  blt.s  .bf
  247.  addq.l #2,a0
  248.  move.l a0,10(a3)
  249.  bra.s  .ok3
  250. .bf
  251.  tst.w  14(a3)
  252.  bge.s  .nonewcnt
  253.  move.w 2(a0),14(a3)
  254. .nonewcnt:
  255.  subq.w #1,14(a3)
  256.  blt.s  .endlp
  257.  move.l 10(a3),a0
  258.  bra.s  .ok3
  259. .endlp:
  260.  addq.l #4,a0
  261.  bra.s  .ok3
  262. .ok2:
  263.  move.w (a0),8(a3)
  264.  subq.w #1,8(a3)
  265.  move.l a0,4(a3)
  266. .ok:
  267.  move.l offset(pc),d0
  268.  addq.l #4,d0
  269.  cmp.l  a2,d0
  270.  beq.s  .end
  271.  addq.l #2,a0
  272.  move.w (a0)+,d0
  273.  add.w  d0,14(a1)
  274.  move.w (a0)+,d0
  275.  add.w  d0,16(a1)
  276.  move.w (a0)+,d0
  277.  add.w  d0,18(a1)
  278.  move.w #360,d1
  279.  move.w d1,d3
  280.  neg.w  d3
  281.  move.w (a0)+,d0
  282.  add.w  d0,20(a1)
  283.  cmp.w  20(a1),d3
  284.  blt.s  .okx
  285.  add.w  d1,20(a1)
  286. .okx:
  287.  cmp.w  20(a1),d1
  288.  bgt.s  .ok1x
  289.  sub.w  d1,20(a1)
  290. .ok1x:
  291.  move.w (a0)+,d0
  292.  add.w  d0,22(a1)
  293.  cmp.w  22(a1),d3
  294.  blt.s  .oky
  295.  add.w  d1,22(a1)
  296. .oky:
  297.  cmp.w  22(a1),d1
  298.  bgt.s  .ok1y
  299.  sub.w  d1,22(a1)
  300. .ok1y:
  301.  move.w (a0)+,d0
  302.  add.w  d0,24(a1)
  303.  cmp.w  24(a1),d3
  304.  blt.s  .okz
  305.  add.w  d1,24(a1)
  306. .okz:
  307.  cmp.w  24(a1),d1
  308.  bgt.s  .end
  309.  sub.w  d1,24(a1)
  310. .end:
  311.  lea    18(a3),a3
  312.  dbf    d2,.lab
  313.  movem.l (a7)+,d2-d3/a2-a3
  314.  rts
  315.  
  316. nilobj:
  317.  dc.l 0
  318.  
  319. joy:                     ; JOYSTICK
  320.  movem.l d2-d3,-(a7)
  321.  move.l offset(pc),a1
  322.  move.l (a1),a1
  323.  move.w #360,d1
  324.  move.w d1,d2
  325.  neg.w  d2
  326.  move.w $dff00c,d3
  327.  btst   #1,d3
  328.  bne.s  right
  329.  btst   #9,d3
  330.  bne.s  left
  331. testud:
  332.  move.w d3,d0
  333.  asr.w  #1,d0
  334.  eor.w  d0,d3
  335.  btst   #0,d3
  336.  bne    bckw
  337.  btst   #8,d3
  338.  bne    forw
  339.  movem.l (a7)+,d2-d3
  340.  rts
  341. right:                   ; rechts
  342.  btst   #7,$bfe001       ; rechts + Feuer ?
  343.  bne.s  nfr
  344.  move.w rsz(pc),d0
  345.  add.w  d0,24(a1)           ; Feuer -> z-rot + 3°
  346.  cmp.w  24(a1),d2
  347.  blt.s  okz1
  348.  add.w  d1,24(a1)
  349. okz1:
  350.  cmp.w  24(a1),d1
  351.  bgt.s  testud
  352.  sub.w  d1,24(a1)
  353.  bra.s  testud
  354. nfr:                     ; kein Feuer -> y-rot + 3°
  355.  move.w rsy(pc),d0
  356.  add.w  d0,22(a1)
  357.  cmp.w  22(a1),d2
  358.  blt.s  oky1
  359.  add.w  d1,22(a1)
  360. oky1:
  361.  cmp.w  22(a1),d1
  362.  bgt.s  testud
  363.  sub.w  d1,22(a1)
  364.  bra.s  testud
  365. left:                    ; links
  366.  btst   #7,$bfe001       ; links + Feuer?
  367.  bne.s  nfr1
  368.  move.w rsz(pc),d0
  369.  sub.w  d0,24(a1)           ; Feuer -> z-rot + 3°
  370.  cmp.w  24(a1),d2
  371.  blt.s  okz2
  372.  add.w  d1,24(a1)
  373. okz2:
  374.  cmp.w  24(a1),d1
  375.  bgt    testud
  376.  sub.w  d1,24(a1)
  377.  bra    testud
  378. nfr1:
  379.  move.w rsy(pc),d0
  380.  sub.w  d0,22(a1)        ; kein Feuer -> y-rot - 3°
  381.  cmp.w  22(a1),d2
  382.  blt.s  oky2
  383.  add.w  d1,22(a1)
  384. oky2:
  385.  cmp.w  22(a1),d1
  386.  bgt    testud
  387.  sub.w  d1,22(a1)
  388.  bra    testud
  389. bckw:                    ; zurück
  390.  btst   #7,$bfe001       ; zurück + Feuer?
  391.  bne.s  nfr2
  392.  move.w mtrv(pc),d0
  393.  cmp.w  18(a1),d0     ; Feuer -> 1000 Punkte näher ran
  394.  blt.s  ok22
  395.  move.w msz(pc),d0
  396.  add.w  d0,18(a1)
  397. ok22:
  398.  movem.l (a7)+,d2-d3
  399.  rts
  400. nfr2:                    ; kein Feuer -> x-rot - 3°
  401.  move.w rsx(pc),d0
  402.  sub.w  d0,20(a1)
  403.  cmp.w  20(a1),d2
  404.  blt.s  okx1
  405.  add.w  d1,20(a1)
  406. okx1:
  407.  cmp.w  20(a1),d1
  408.  bgt.s  okx2
  409.  sub.w  d1,20(a1)
  410. okx2:
  411.  movem.l (a7)+,d2-d3
  412.  rts
  413. forw:                    ; vorwärts
  414.  btst   #7,$bfe001       ; vorwärts + Feuer?
  415.  bne.s  nfr3
  416.  move.w mtrh(pc),d0
  417.  cmp.w  18(a1),d0   ; Feuer -> 1000 Punkte weiter weg
  418.  bge.s  ok24
  419.  move.w msz(pc),d0
  420.  sub.w  d0,18(a1)
  421. ok24:
  422.  movem.l (a7)+,d2-d3
  423.  rts
  424. nfr3:                    ; kein Feuer -> x-rot + 3°
  425.  move.w rsx(pc),d0
  426.  add.w  d0,20(a1)
  427.  cmp.w  20(a1),d2
  428.  blt.s  okx3
  429.  add.w  d1,20(a1)
  430. okx3:
  431.  cmp.w  20(a1),d1
  432.  bgt.s  okx4
  433.  sub.w  d1,20(a1)
  434. okx4:
  435.  movem.l (a7)+,d2-d3
  436.  rts
  437.  
  438. Close:
  439.  moveq  #0,d0 
  440.  subq.w #1,LIB_OPENCNT(a6)
  441.  bne.s  lab1
  442.  btst   #LIBB_DELEXP,ml_Flags(a6)
  443.  beq.s  lab1
  444.  bsr    Expunge
  445. lab1:
  446.  tst.w  LIB_OPENCNT(a6)
  447.  bne.s  .end
  448.  movem.l d0-d1/a0-a1/a6,-(a7)
  449.  move.l 4.w,a6
  450.  lea    vbistruc(pc),a1
  451.  moveq  #5,d0
  452.  jsr    -174(a6)
  453.  move.l intbase(pc),a1
  454.  jsr    -414(a6)
  455.  move.l gfxbase(pc),a1
  456.  jsr    -414(a6)
  457.  movem.l (a7)+,d0-d1/a0-a1/a6
  458. .end:
  459.  rts
  460.  
  461. Expunge:
  462.  movem.l d2/a5-a6,-(a7)
  463.  move.l a6,a5
  464.  move.l ml_SysLib(a5),a6
  465.  tst.w  LIB_OPENCNT(a5)
  466.  beq.s  lab2
  467.  bset   #LIBB_DELEXP,ml_Flags(a5)
  468.  moveq  #0,d0
  469.  bra.s  Exp_End
  470. lab2:
  471.  move.l ml_SegList(a5),d2
  472.  move.l a5,a1
  473.  jsr    -252(a6)
  474.  move.l ml_DosLib(a5),a1
  475.  jsr    -414(a6)
  476.  moveq  #0,d0
  477.  move.l a5,a1
  478.  move.w LIB_NEGSIZE(a5),d0
  479.  sub.l  d0,a1
  480.  add.w  LIB_POSSIZE(a5),d0
  481.  jsr    -210(a6)
  482.  move.l d2,d0
  483. Exp_End:
  484.  movem.l (a7)+,d2/a5-a6
  485.  rts
  486.  
  487. Nil:
  488.  moveq  #0,d0
  489.  rts
  490.  
  491. SetVBI:
  492.  move.l a1,anbuf
  493.  moveq #0,d0
  494.  rts
  495. anbuf:
  496.  dc.l 0
  497.  
  498. InitVBOBs:
  499.  movem.l d2/a2-a6,-(a7)
  500.  move.w d0,bobdepth
  501.  move.l a1,bobptr
  502.  sub.l  #10,bobptr
  503.  bsr    .loadbobs
  504.  tst.w  d1
  505.  bne    .endinit
  506.  move.w d0,d3
  507.  move.l bobptr(pc),a0
  508.  move.w 10(a0),d0
  509.  move.w d0,d2
  510.  asl.w  #3,d0
  511.  asl.w  #2,d2
  512.  add.w  d0,d2
  513.  ext.l  d2
  514.  add.l  a0,d2
  515.  move.l d2,endbob
  516.  move.l #normsiztab,vsizptr
  517.  cmp.l  #0,a2
  518.  beq.s  .ok
  519.  move.l a2,vsizptr
  520.  move.l (a2)+,d0
  521.  subq.w #1,d0
  522. .mlp:
  523.  move.l (a2),d1
  524.  asl.l  #4,d1
  525.  move.l d1,(a2)+
  526.  dbf    d0,.mlp
  527. .ok:
  528.  move.w (a1)+,d5
  529.  subq.w #1,d5
  530.  move.w d5,d6
  531.  move.l a1,a2
  532.  move.l a1,a3
  533.  move.l 4.w,a6
  534. .allp:
  535.  addq.w #1,(a3)
  536.  moveq  #0,d0
  537.  move.w (a3),d0
  538.  asl.w  #1,d0
  539.  mulu   2(a3),d0
  540.  move.l #$10003,d1
  541.  jsr    -198(a6)
  542.  move.l d0,8(a3)
  543.  beq.s  .endinit
  544.  lea    12(a3),a3
  545.  dbf    d5,.allp
  546.  subq.w #1,d3
  547. .maskloop:
  548.  move.l 4(a2),a0
  549.  move.w d3,d2
  550. .mo:
  551.  move.l 8(a2),a1
  552.  move.w 2(a2),d4
  553.  subq.w #1,d4
  554. .masko:
  555.  move.w (a2),d1
  556.  subq.w #2,d1
  557. .maski:
  558.  move.w (a0)+,d0
  559.  or.w   d0,(a1)+
  560.  dbf    d1,.maski
  561.  move.w #0,(a1)+
  562.  dbf    d4,.masko
  563.  dbf    d2,.mo
  564.  lea    12(a2),a2
  565.  dbf    d6,.maskloop
  566.  movem.l (a7)+,d2/a2-a6
  567.  moveq #0,d0
  568.  rts
  569. .endinit:
  570.  movem.l (a7)+,d2/a2-a6
  571.  moveq #-1,d0
  572.  rts
  573. .loadbobs:
  574.  movem.l d0/a1-a2,-(a7)
  575.  move.l a0,a2
  576. .test:
  577.  tst.b  (a0)
  578.  beq    .endbob
  579.  cmp.b  #"?",(a0)+
  580.  bne.s  .test
  581.  cmp.b  #"?",(a0)
  582.  bne.s  .test
  583. .endtest
  584.  subq.l #1,a0
  585.  move.l a0,a3
  586.  lea    2(a1),a4
  587.  move.w (a1),-(a7)
  588.  moveq  #-1,d6
  589. .lp:
  590.  move.l 4.w,a6
  591.  move.w (a4),d0
  592.  asl.w  #1,d0
  593.  mulu   2(a4),d0
  594.  mulu   bobdepth(pc),d0
  595.  move.l d0,d4
  596.  move.l #$10003,d1
  597.  jsr    -198(a6)
  598.  move.l d0,4(a4)
  599.  beq.s  .endbob
  600.  move.l d0,a5
  601.  move.l dosbase(pc),a6
  602.  addq.w #1,d6
  603.  move.w d6,d0
  604.  move.w d6,d1
  605.  divu   #10,d1
  606.  mulu   #10,d1
  607.  sub.w  d1,d0
  608.  divu   #10,d1
  609.  add.w  #$30,d1
  610.  add.w  #$30,d0
  611.  move.b d1,(a3)
  612.  move.b d0,1(a3)
  613.  move.l a2,d1
  614.  move.w #1005,d2
  615.  jsr    -30(a6)
  616.  move.l d0,d5
  617.  move.l d0,d1
  618.  move.l a5,d2
  619.  move.l d4,d3
  620.  jsr    -42(a6)
  621.  move.l d5,d1
  622.  jsr    -36(a6)
  623.  lea    12(a4),a4
  624.  subq.w #1,(a7)
  625.  bgt.s  .lp
  626.  addq.l #2,a7
  627.  movem.l (a7)+,d0/a1-a2
  628.  moveq  #0,d1
  629.  rts
  630. .endbob
  631.  addq.l #2,a7
  632.  movem.l (a7)+,d0/a1-a2
  633.  moveq  #-1,d1
  634.  rts
  635.  
  636. bobdepth dc.w 0
  637.  
  638. FreeVBOBs:
  639.  movem.l d3/a3/a6,-(a7)
  640.  move.l bobptr(pc),a3
  641.  lea    10(a3),a3
  642.  move.w (a3)+,d3
  643.  subq.w #1,d3
  644.  move.l 4.w,a6
  645. .deallp:
  646.  moveq  #0,d0
  647.  move.w (a3),d0
  648.  asl.w  #1,d0
  649.  mulu   2(a3),d0
  650.  move.l 8(a3),a1
  651.  subq.w #1,(a3)
  652.  cmp.l  #0,a1
  653.  beq.s  .notalloc1
  654.  jsr    -210(a6)
  655. .notalloc1
  656.  move.w (a3),d0
  657.  asl.w  #1,d0
  658.  mulu   2(a3),d0
  659.  mulu   bobdepth(pc),d0
  660.  move.l 4(a3),a1
  661.  cmp.l  #0,a1
  662.  beq.s  .notalloc2
  663.  jsr    -210(a6)
  664. .notalloc2
  665.  lea    12(a3),a3
  666.  dbf    d3,.deallp
  667.  movem.l (a7)+,d3/a3/a6
  668.  moveq  #0,d0
  669.  rts
  670.  
  671. OpenVScreen:
  672.  movem.l d2-d3/a2-a3/a6,-(a7)
  673.  lea    newscreen(pc),a3
  674.  move.w (a1)+,(a3)
  675.  move.w (a1)+,2(a3)
  676.  move.w (a1)+,4(a3)
  677.  move.w (a1)+,6(a3)
  678.  move.w (a1),depth
  679.  move.w (a1)+,8(a3)
  680.  move.w (a1)+,10(a3)
  681.  move.w (a1),flags
  682.  move.w (a1)+,12(a3)
  683.  move.l (a1)+,16(a3)
  684.  move.l (a1)+,20(a3)
  685.  move.w (a1)+,d0
  686.  move.w (a1)+,d0
  687.  move.w (a1)+,d0
  688.  move.w (a1)+,d0
  689.  move.w d0,pwidth
  690.  subq.w #1,pwidth
  691.  asr.w  #3,d0
  692.  move.w d0,width
  693.  asr.w  #1,d0
  694.  move.w d0,wwidth
  695.  move.w (a1)+,height
  696.  move.w (a1)+,used
  697.  move.l a1,-(a7)
  698.  movem.w width(pc),d0-d1
  699.  mulu   d0,d1
  700.  move.l d1,d3
  701.  move.l d1,d0
  702.  move.l #$10003,d1
  703.  move.l 4.w,a6
  704.  jsr    -198(a6)
  705.  move.l d0,tmpadr
  706.  beq    .endinit
  707.  mulu   depth(pc),d3
  708.  move.l d3,d0
  709.  move.l #$10003,d1
  710.  jsr    -198(a6)
  711.  move.l d0,plnh
  712.  beq    .endinit
  713.  move.l d3,d0
  714.  move.l #$10003,d1
  715.  jsr    -198(a6)
  716.  move.l d0,plns
  717.  beq    .endinit
  718.  lea    bm1(pc),a0
  719.  lea    bm2(pc),a1
  720.  move.l a0,bms
  721.  move.l a1,bmh
  722.  move.w width(pc),(a0)
  723.  move.w width(pc),(a1)
  724.  move.w height(pc),2(a0)
  725.  move.w height(pc),2(a1)
  726.  move.b depth+1(pc),5(a0)
  727.  move.b depth+1(pc),5(a1)
  728.  move.w width(pc),d1
  729.  mulu   height(pc),d1
  730.  addq.l #8,a0
  731.  addq.l #8,a1
  732.  move.l plnh(pc),d3
  733.  move.w used(pc),d2
  734.  moveq  #4,d4
  735.  btst   #2,flags
  736.  beq.s  .nodpf
  737.  moveq  #8,d4
  738. .nodpf:
  739.  subq.w #1,d2
  740. .ulp:
  741.  move.l d0,(a0)
  742.  move.l d3,(a1)
  743.  add.l  d1,d0
  744.  add.l  d1,d3
  745.  add.l  d4,a0
  746.  add.l  d4,a1
  747.  dbf    d2,.ulp
  748.  btst   #2,flags
  749.  beq.s  .nodpf2
  750.  lea    bm1+12(pc),a0
  751.  lea    bm2+12(pc),a1
  752. .nodpf2:
  753.  move.w depth(pc),d2
  754.  sub.w  used(pc),d2
  755.  beq.s  .erlp
  756.  subq.w #1,d2
  757. .rlp:
  758.  move.l d0,(a0)
  759.  move.l d0,(a1)
  760.  add.l  d1,d0
  761.  add.l  d4,a0
  762.  add.l  d4,a1
  763.  dbf    d2,.rlp
  764. .erlp:
  765.  lea    newscreen(pc),a0
  766.  move.w width(pc),d0
  767.  asl.w  #3,d0
  768.  move.w d0,pwidth
  769.  subq.w #1,pwidth
  770.  move.w d0,d1
  771.  asr.w  #1,d1
  772.  asl.w  #4,d1
  773.  move.w d1,midx
  774.  move.w height,d1
  775.  subq.w #1,d1
  776.  move.w d1,heightm1
  777.  addq.w #1,d1
  778.  asr.w  #1,d1
  779.  asl.w  #4,d1
  780.  move.w d1,midy
  781.  move.l (a7)+,a1
  782.  move.l #bm1,28(a0)
  783.  move.l intbase(pc),a6
  784.  jsr    -198(a6)
  785.  move.l d0,screen
  786.  beq    .endinit
  787.  move.l d0,a0
  788.  move.l 80(a0),oldras
  789.  move.l #rasinfo,80(a0)
  790.  move.l intbase(pc),a6
  791.  jsr    -294(a6)
  792.  move.l d0,view
  793.  beq    .endinit
  794.  move.w width(pc),d0
  795.  asr.w  #1,d0
  796.  move.w d0,wwidth
  797.  move.l #clrnorm,clrroutine
  798.  move.w used(pc),d1
  799.  mulu   height(pc),d1
  800.  cmp.w  #1024,d1
  801.  blt.s  .ok
  802.  move.w d0,clrx
  803.  move.w d1,clry
  804.  move.l #clrbig,clrroutine
  805. .ok:
  806.  asl.w  #6,d1
  807.  add.w  d1,d0
  808.  move.w d0,clrsize
  809.  move.w width(pc),d0
  810.  mulu   height(pc),d0
  811.  move.l d0,onepln
  812.  move.l screen(pc),a0
  813.  move.l a0,userback
  814.  lea    44(a0),a0
  815.  move.l a0,userback+4
  816.  lea    40(a0),a0
  817.  move.l a0,userback+8
  818.  move.l userback+4(pc),a0
  819.  move.l 8(a0),a0
  820.  lea    20(a0),a0
  821.  move.l a0,clist1
  822.  move.l a0,clist2
  823.  addq.l #4,clist2
  824.  bsr    findcop
  825.  move.l #userback,d0
  826.  movem.l (a7)+,d2-d3/a2-a3/a6
  827.  rts
  828. .endinit:
  829.  movem.l (a7)+,d2-d3/a2-a3/a6
  830.  moveq  #0,d0
  831.  rts
  832.  
  833. findcop:
  834.  move.l clist1(pc),a0
  835.  move.l (a0),a0
  836.  move.l a0,a1
  837.  moveq  #100,d0
  838. .search:
  839.  cmp.w  #$e0,(a0)
  840.  beq.s  .found
  841.  addq.l #4,a0
  842.  dbf    d0,.search
  843. .found:
  844.  cmp.w  #$e2,4(a0)
  845.  beq.s  .ok
  846.  sub.l  a0,a0
  847.  rts
  848. .ok:
  849.  addq.l #2,a0
  850.  sub.l  a1,a0
  851.  move.l a0,delta
  852.  rts
  853.  
  854. screen     dc.l 0
  855. width      dc.w 0
  856. height     dc.w 0
  857. heightm1   dc.w 0
  858. depth      dc.w 0
  859. used       dc.w 0
  860. flags      dc.w 0
  861. view       dc.l 0
  862. bmh        dc.l 0
  863. bms        dc.l 0
  864. clrsize    dc.w 0
  865. wwidth     dc.w 0
  866. pwidth     dc.w 0
  867. midx       dc.w 0
  868. midy       dc.w 0
  869. userback   dc.l 0,0,0
  870. onepln     dc.l 0
  871. clrroutine dc.l 0
  872. clrx       dc.w 0
  873. clry       dc.w 0
  874. clist1     dc.l 0
  875. clist2     dc.l 0
  876. delta      dc.l 0
  877. oldras     dc.l 0
  878.  
  879. bm1:
  880.  dc.w 0,0,0,0
  881.  dc.l 0,0,0,0,0,0,0,0,0
  882.  
  883. bm2:
  884.  dc.w 0,0,0,0
  885.  dc.l 0,0,0,0,0,0,0,0,0
  886.  
  887. rasinfo:
  888.  dc.l 0
  889.  dc.l bm1
  890.  dc.w 0,0
  891.  
  892. newscreen:
  893.  dc.w 0,0, 0,0, 0
  894.  dc.b 0,0
  895.  dc.w 0,$4f
  896.  dc.l 0
  897.  dc.l 0
  898.  dc.l 0
  899.  dc.l 0
  900.  
  901. rp2:
  902.  dcb.b 100
  903.  
  904. CloseVScreen:
  905.  movem.l d2-d7/a2-a6,-(a7)
  906.  move.l intbase(pc),a6
  907.  move.l screen(pc),a0
  908.  move.l oldras(pc),80(a0)
  909.  jsr    -66(a6)
  910.  move.l 4.w,a6
  911.  move.w width(pc),d3
  912.  mulu   height(pc),d3
  913.  move.l tmpadr,a1
  914.  move.l d3,d0
  915.  jsr    -210(a6)
  916.  mulu   depth(pc),d3
  917.  move.l plnh,a1
  918.  move.l d3,d0
  919.  jsr    -210(a6)
  920.  move.l plns,a1
  921.  move.l d3,d0
  922.  jsr    -210(a6)
  923.  movem.l (a7)+,d2-d7/a2-a6
  924.  moveq  #0,d0
  925.  rts
  926. .endinit:
  927.  movem.l (a7)+,d2-d7/a2-a6
  928.  moveq  #-1,d0
  929.  rts
  930.  
  931. DoAnim:
  932.  movem.l d2-d7/a2-a6,-(a7)
  933.  move.w (a1)+,objflg
  934.  move.l #dline,linrout
  935.  btst   #0,objflg+1
  936.  beq.s  .ok
  937.  move.l #oline,linrout
  938. .ok:
  939.  move.l a1,strptr
  940.  bsr    allocstrucs
  941.  bne    endanimerr
  942.  move.l strptr(pc),a1
  943.  move.l rootptr(pc),a2
  944.  move.w (a1)+,d0
  945.  subq.w #1,d0
  946. .lp:
  947.  move.l (a1)+,a0
  948.  cmp.l  #nilobj,a0
  949.  beq    endanimerrm2
  950.  move.l 8(a0),a3
  951.  lea    -14(a3),a3
  952.  move.l a3,4(a2)
  953.  move.w #0,8(a2)
  954.  lea    18(a2),a2
  955.  dbf    d0,.lp
  956.  bsr    move
  957.  move.l #move,jptab
  958.  move.l anbuf(pc),anadr
  959.  move.l strptr(pc),d0
  960.  add.l  d0,offset
  961.  move.l joybuf(pc),joyadr
  962. vcloop:
  963.  move.w #0,vbi
  964. .wvbi:
  965.  tst.w  vbi
  966.  beq.s  .wvbi
  967.  move.l clrroutine(pc),a0
  968.  jsr    (a0)
  969.  move.l zorgptr(pc),ztabptr
  970.  move.l dtorgptr(pc),dttabptr
  971.  move.w #-1,drawnum
  972.  move.l rootptr(pc),a2
  973.  move.l (a2),tmom
  974.  move.l strptr(pc),a1
  975.  move.w (a1)+,d0
  976.  subq.w #1,d0
  977. .ok:
  978.  move.l (a1)+,a0
  979.  cmp.l  #nilobj,a0
  980.  beq.s  .nocalc
  981.  movem.l d0/a1-a2,-(a7)
  982.  move.l (a0)+,pdptr
  983.  move.l (a0)+,atabptr
  984.  lea    addx(pc),a1
  985.  addq.l #6,a0
  986.  movem.w (a0),d0-d5
  987.  add.w  d3,d3
  988.  bge.s  .ok1
  989.  add.w  #720,d3
  990. .ok1:
  991.  add.w  d4,d4
  992.  bge.s  .ok2
  993.  add.w  #720,d4
  994. .ok2:
  995.  add.w  d5,d5
  996.  bge.s  .ok3
  997.  add.w  #720,d5
  998. .ok3:
  999.  ext.l d0
  1000.  asl.l #4,d0
  1001.  ext.l d1
  1002.  asl.l #4,d1
  1003.  ext.l d2
  1004.  asl.l #4,d2
  1005.  movem.l d0-d2,(a1)
  1006.  lea   12(a1),a1
  1007.  movem.w d3-d5,(a1)
  1008.  bsr    vector1
  1009.  movem.l (a7)+,d0/a1-a2
  1010. .nocalc:
  1011.  lea    18(a2),a2
  1012.  move.l (a2),tmom
  1013.  dbf    d0,.ok
  1014.  bsr    vector2
  1015.  move.l strptr(pc),a1
  1016.  move.w (a1),d2
  1017.  subq.w #1,d2
  1018.  move.l rootptr(pc),a3
  1019. endlp:
  1020.  tst.w  16(a3)
  1021.  beq    vcloop
  1022.  lea    18(a3),a3
  1023.  dbf    d2,endlp
  1024. endanim
  1025.  move.w #0,vbi
  1026. .wvbi2:
  1027.  tst.w  vbi
  1028.  beq.s  .wvbi2
  1029.  move.l #0,jptab
  1030.  move.l #0,anadr
  1031.  move.l #0,joyadr
  1032.  bsr    deallocstrucs
  1033.  movem.l (a7)+,d2-d7/a2-a6
  1034.  moveq  #0,d0
  1035.  rts
  1036. endanimerr:
  1037.  bsr    deallocstrucs
  1038.  movem.l (a7)+,d2-d7/a2-a6
  1039.  moveq  #-1,d0
  1040.  rts
  1041. endanimerrm2:
  1042.  bsr    deallocstrucs
  1043.  movem.l (a7)+,d2-d7/a2-a6
  1044.  moveq  #-2,d0
  1045.  rts
  1046. allocstrucs:
  1047.  move.l 4.w,a6
  1048.  move.l a1,a2
  1049.  move.w (a2)+,d7
  1050.  move.w d7,d0
  1051.  mulu   #18,d0
  1052.  move.l #$10001,d1
  1053.  jsr    -198(a6)
  1054.  move.l d0,rootptr
  1055.  beq    .enderr
  1056.  move.l d0,a3
  1057.  move.w d7,d2
  1058.  moveq  #0,d6
  1059.  moveq  #0,d3
  1060.  subq.w #1,d2
  1061. .lp:
  1062.  move.l (a2)+,a1
  1063.  move.l (a1)+,a0
  1064.  move.w (a0),d0
  1065.  cmp.w  d0,d3
  1066.  bge.s  .ok
  1067.  move.w d0,d3
  1068. .ok:
  1069.  move.l (a1),a0
  1070.  add.w  (a0),d6
  1071.  mulu   #4,d0
  1072.  move.l #$10001,d1
  1073.  jsr    -198(a6)
  1074.  move.l d0,(a3)
  1075.  beq.s  .enderr
  1076.  move.w #-1,14(a3)
  1077.  lea    18(a3),a3
  1078.  dbf    d2,.lp
  1079.  move.w d3,d0
  1080.  mulu   #4,d0
  1081.  move.l #$10001,d1
  1082.  jsr    -198(a6)
  1083.  move.l d0,z2orgptr
  1084.  beq.s  .enderr
  1085.  move.w d6,d0
  1086.  mulu   #4,d0
  1087.  move.l #$10001,d1
  1088.  jsr    -198(a6)
  1089.  move.l d0,lrtabptr
  1090.  beq.s  .enderr
  1091.  move.w d6,d0
  1092.  mulu   #14,d0
  1093.  move.l #$10001,d1
  1094.  jsr    -198(a6)
  1095.  move.l d0,dtorgptr
  1096.  beq.s  .enderr
  1097.  move.w d6,d0
  1098.  mulu   #4,d0
  1099.  move.l #$10001,d1
  1100.  jsr    -198(a6)
  1101.  move.l d0,zorgptr
  1102.  beq.s  .enderr
  1103.  moveq  #0,d0
  1104.  rts
  1105. .enderr:
  1106.  moveq  #-1,d0
  1107.  rts
  1108. deallocstrucs:
  1109.  move.l 4.w,a6
  1110.  move.l strptr(pc),a1
  1111.  move.l a1,a2
  1112.  move.w (a2)+,d7
  1113.  move.l rootptr(pc),a3
  1114.  move.w d7,d2
  1115.  moveq  #0,d6
  1116.  moveq  #0,d3
  1117.  subq.w #1,d2
  1118. .lp:
  1119.  move.l (a2)+,a1
  1120.  move.l (a1)+,a0
  1121.  move.w (a0),d0
  1122.  cmp.w  d0,d3
  1123.  bge.s  .ok
  1124.  move.w d0,d3
  1125. .ok:
  1126.  move.l (a1),a0
  1127.  add.w  (a0),d6
  1128.  mulu   #4,d0
  1129.  move.l (a3),a1
  1130.  jsr    -210(a6)
  1131.  lea    18(a3),a3
  1132.  dbf    d2,.lp
  1133.  move.w d3,d0
  1134.  mulu   #4,d0
  1135.  move.l z2orgptr(pc),a1
  1136.  jsr    -210(a6)
  1137.  move.w d7,d0
  1138.  mulu   #18,d0
  1139.  move.l rootptr(pc),a1
  1140.  jsr    -210(a6)
  1141.  move.w d6,d0
  1142.  mulu   #4,d0
  1143.  move.l lrtabptr(pc),a1
  1144.  jsr    -210(a6)
  1145.  move.w d6,d0
  1146.  mulu   #14,d0
  1147.  move.l dtorgptr(pc),a1
  1148.  jsr    -210(a6)
  1149.  move.w d6,d0
  1150.  mulu   #4,d0
  1151.  move.l zorgptr(pc),a1
  1152.  jsr    -210(a6)
  1153.  rts
  1154.  
  1155.  
  1156. clrnorm:
  1157.  move.l gfxbase(pc),a6
  1158.  jsr    -456(a6)
  1159.  move.l chipbase(pc),a6
  1160.  wblt          
  1161.  moveq  #-1,d0
  1162.  move.l d0,$44(a6)
  1163.  move.w #0,$66(a6)
  1164.  move.l #$1000000,$40(a6)  ; Trotz voller Priorität des Blitters
  1165.  move.l plnh(pc),$54(a6)         ; kaum Einschränkung des 68000, da
  1166.  move.w clrsize(pc),$58(a6) ; nur DMA-Kanal D genutzt wird!
  1167.  move.l gfxbase(pc),a6
  1168.  jsr    -462(a6)
  1169.  rts
  1170.  
  1171. clrbig:
  1172.  move.l gfxbase(pc),a6
  1173.  jsr    -456(a6)
  1174.  move.l chipbase(pc),a6
  1175.  wblt  
  1176.  moveq  #-1,d0
  1177.  move.l d0,$44(a6)
  1178.  move.w #0,$66(a6)  
  1179.  move.l #$1000000,$40(a6)  ; Trotz voller Priorität des Blitters
  1180.  move.l plnh(pc),$54(a6)         ; kaum Einschränkung des 68000, da
  1181.  move.w clry(pc),$5c(a6)
  1182.  move.w clrx(pc),$5e(a6) ; nur DMA-Kanal D genutzt wird!
  1183.  move.l gfxbase(pc),a6
  1184.  jsr    -462(a6)
  1185.  rts
  1186.  
  1187. drawb:
  1188.  move.l bobptr(pc),a0
  1189.  move.w 10(a0),d1
  1190.  move.l (a5)+,d5
  1191.  move.w (a5)+,d6
  1192.  move.l endbob(pc),d2
  1193. eigenlp:
  1194.  lea    12(a0),a0
  1195.  cmp.l  a0,d2
  1196.  beq.s  ok
  1197.  dbf    d6,eigenlp
  1198.  move.l vsizptr(pc),a1
  1199.  subq.w #1,d1
  1200. sizelp:
  1201.  move.l (a1)+,d0
  1202.  cmp.l  d5,d0
  1203.  ble.s  ok
  1204.  lea    12(a0),a0
  1205.  cmp.l  a0,d2
  1206.  beq.s  ok
  1207.  dbf    d1,sizelp
  1208. ok:
  1209.  move.w (a0),d5            ; Ball-Breite in Worten
  1210.  move.w 2(a0),d6           ; Ball-Höhe in Pixel (= Ball-Breite)
  1211.  movem.l 4(a0),a0-a1
  1212.  move.w d6,d2
  1213.  asr.w  #1,d2
  1214.  sub.w  d2,d3              ; angegebene Ball-Koordinaten in d3/d4 von
  1215.  sub.w  d2,d4              ; "oben rechts" in die Ball-Mitte schieben
  1216.  move.w d3,d2
  1217.  and.w  #15,d3
  1218.  sub.w  d3,d2
  1219.  ror.w  #4,d3
  1220.  movem.l a0-a1,-(a7)
  1221.  move.l gfxbase(pc),a6
  1222.  jsr    -456(a6)
  1223.  move.l chipbase(pc),a6
  1224.  movem.l (a7)+,a0-a1
  1225.  asr.w  #4,d2
  1226.  blt    nodraw
  1227.  move.w d2,d0
  1228.  add.w  d5,d0
  1229.  cmp.w  wwidth(pc),d0
  1230.  bgt    nodraw
  1231.  tst.w  d4
  1232.  blt    nodraw
  1233.  move.w d4,d0
  1234.  add.w  d6,d0
  1235.  cmp.w  height(pc),d0
  1236.  bge    nodraw
  1237.  asl.w  #1,d2
  1238.  mulu   width(pc),d4
  1239.  add.w  d2,d4
  1240.  add.l  plnh(pc),d4
  1241.  move.w d6,d2              ; Blitter-Fenster berechnen
  1242.  asl.w  #6,d2
  1243.  add.w  d5,d2
  1244.  move.w width(pc),d0             ; Modulo berechnen
  1245.  asl.w  #1,d5
  1246.  sub.w  d5,d0
  1247.  wblt
  1248.  move.l #$0000fffe,$62(a6)
  1249.  move.l #$ffff0000,$44(a6)
  1250.  move.w d0,$60(a6)
  1251.  move.w d0,$66(a6)
  1252.  move.l #$0fc20000,d0      ; A-Shift u. B-Shift für Reg. $40/42
  1253.  or.w   d3,d0
  1254.  swap   d0
  1255.  or.w   d3,d0
  1256.  swap   d0
  1257.  move.l d0,$40(a6)
  1258.  move.l a0,$50(a6)
  1259.  move.l d4,a0              ; Startadressen ausrechnen
  1260.  move.w used(pc),d1        ; Blit-Schleife für 3 Planes
  1261.  subq.w #1,d1
  1262. blitlp:
  1263.  wblt
  1264.  move.l a0,$48(a6)
  1265.  move.l a1,$4c(a6)
  1266.  move.l a0,$54(a6)
  1267.  move.w d2,$58(a6)
  1268.  add.l  onepln(pc),a0
  1269.  dbf    d1,blitlp
  1270. nodraw:
  1271.  rts
  1272.  
  1273. quicksort:                 ; üblicher Quicksort-Algorithmus
  1274.  moveq  #0,d4
  1275.  move.l zorgptr(pc),d5
  1276.  move.l lrtabptr(pc),a0
  1277.  move.l dtorgptr(pc),a1
  1278.  move.l d5,0(a0,d4.w)
  1279.  move.l zend(pc),a5
  1280.  move.l a5,4(a0,d4.w)
  1281. l20:
  1282.  move.l 0(a0,d4.w),d5
  1283.  move.l 4(a0,d4.w),a5
  1284.  subq.w #8,d4
  1285. l30:
  1286.  move.l d5,a2
  1287.  move.l a5,a3
  1288.  move.l a2,d1
  1289.  sub.l  zorgptr(pc),d1
  1290.  move.w d1,d3
  1291.  add.w  d1,d1
  1292.  add.w  d3,d1
  1293.  asr.w  #1,d3
  1294.  add.w  d3,d1
  1295.  move.l a3,d2
  1296.  sub.l  zorgptr(pc),d2
  1297.  move.w d2,d3
  1298.  add.w  d2,d2
  1299.  add.w  d3,d2
  1300.  asr.w  #1,d3
  1301.  add.w  d3,d2
  1302.  move.l d5,d0
  1303.  add.l  a5,d0
  1304.  asr.l  #3,d0
  1305.  asl.l  #2,d0
  1306.  move.l d0,a6
  1307.  move.l (a6),d3
  1308. l40:
  1309.  cmp.l  (a2),d3
  1310.  ble.s  l41
  1311.  addq.l #4,a2
  1312.  add.w  #14,d1
  1313.  bra.s  l40
  1314. l41:
  1315.  cmp.l  (a3),d3
  1316.  bge.s  l42
  1317.  subq.l #4,a3
  1318.  sub.w  #14,d2
  1319.  bra.s  l41
  1320. l42:
  1321.  cmp.l  a3,a2
  1322.  bgt.s  l50
  1323.  move.l (a3),d0
  1324.  move.l (a2),(a3)
  1325.  move.l d0,(a2)
  1326.  exg.l  d0,d5
  1327.  movem.l 0(a1,d1.w),d5-d7
  1328.  move.l 0(a1,d2.w),0(a1,d1.w)
  1329.  move.l 4(a1,d2.w),4(a1,d1.w)
  1330.  move.l 8(a1,d2.w),8(a1,d1.w)
  1331.  movem.l d5-d7,0(a1,d2.w)
  1332.  move.w 12(a1,d1.w),d5
  1333.  move.w 12(a1,d2.w),12(a1,d1.w)
  1334.  move.w d5,12(a1,d2.w)
  1335.  exg.l  d0,d5
  1336.  addq.l #4,a2
  1337.  subq.l #4,a3
  1338.  add.w  #14,d1
  1339.  sub.w  #14,d2
  1340.  cmp.l  a3,a2
  1341.  ble.s  l40
  1342. l50:
  1343.  cmp.l  a5,a2
  1344.  blt.s  l52
  1345. l51:
  1346.  move.l a3,a5
  1347.  cmp.l  a5,d5
  1348.  blt    l30
  1349.  tst.w  d4
  1350.  bge    l20
  1351.  rts
  1352. l52:
  1353.  addq.w #8,d4
  1354.  move.l a2,0(a0,d4.w)
  1355.  move.l a5,4(a0,d4.w)
  1356.  bra.s  l51
  1357.  
  1358.  
  1359.  
  1360. vector1:
  1361.  bsr    transform     ; Rotation + 3D-Projektion
  1362.  btst   #0,objflg+1
  1363.  bne.s  .wire
  1364.  bsr    backs
  1365.  rts
  1366. .wire:
  1367.  bsr    wrbacks
  1368.  rts
  1369. vector2:
  1370.  tst.w  drawnum        ; keine Fläche zu sehen?
  1371.  blt    end           ; dann raus
  1372.  bsr    quicksort     ; klar
  1373.  move.l dtorgptr(pc),a5   ; Sortierte Nummern der zu verbleibenden Flächen
  1374.  move.w drawnum(pc),d7
  1375. lp:
  1376.  move.l (a5)+,a3       ; Flächen-Info-Adresse holen, da Infos jeder Fläche 22 Bytes lang ist
  1377.  move.l 6(a5),a2
  1378. vp4:
  1379.  move.l linrout(pc),liner
  1380.  move.w (a3)+,d5       ; Eckenzahl holen
  1381.  blt    vballd
  1382.  bne.s  nolin
  1383.  move.l #oline,liner
  1384.  moveq  #1,d5
  1385. nolin:
  1386.  lea    10(a5),a5
  1387.  subq.w #1,d5
  1388.  move.w (a3)+,-(a7)    ; Farbe auf Stägg
  1389.  moveq  #-1,d0
  1390.  lea    hix(pc),a1
  1391.  move.w #640,2(a1)       ; Ausmaße für Füll- und Kopier-Fenster reseten
  1392.  move.w d0,(a1)
  1393.  move.w #640,6(a1)
  1394.  move.w d0,4(a1)
  1395.  move.w #0,line
  1396.  lea    scx1(pc),a4
  1397.  move.l d0,(a4)
  1398.  move.l d0,4(a4)
  1399.  move.l a1,-(a7)
  1400.  move.l gfxbase(pc),a6
  1401.  jsr    -456(a6)
  1402.  move.l chipbase(pc),a6
  1403.  move.l (a7)+,a1
  1404. .lnlp:
  1405.  move.w (a3)+,d6       ; Eckpunkt holen
  1406.  movem.w (a2,d6),d0-d1 ; 2D-Punkt-Koordinaten aus ttab
  1407.  move.w (a3),d6
  1408.  movem.w (a2,d6),d2-d3
  1409.  asr.w  #4,d0
  1410.  asr.w  #4,d1
  1411.  asr.w  #4,d2
  1412.  asr.w  #4,d3
  1413.  bsr    drawl           ; klar ...
  1414.  dbf    d5,.lnlp
  1415.  cmp.l  #dline,liner
  1416.  bne.s  nodr
  1417.  tst.w  scx1
  1418.  blt.s  noclip
  1419.  tst.w  scx2
  1420.  blt.s  noclip
  1421.  lea    scx1(pc),a4
  1422.  movem.w (a4),d0-d3
  1423.  bsr.s  drawl          ; zeichnen
  1424. noclip:               ; kein Rechter Rand
  1425.  tst.w  line
  1426.  beq.s  nodr
  1427.  bsr    csize          ; erhaltene Füll-/Copy-Fenster Maße umrechnen
  1428.  move.w (a7),d4        ; Farbe holen
  1429.  bsr    copy           ; Füllen, Copy, Fenster löschen
  1430. nodr:
  1431.  addq.l #2,a7         ; Farbe holen
  1432. vok:
  1433.  move.l gfxbase(pc),a6
  1434.  jsr    -462(a6)
  1435.  dbf    d7,lp         ; alle Flächen?
  1436. end
  1437.  move.l chipbase(pc),a6
  1438.  rts
  1439. vballd:
  1440.  move.w 2(a3),d6
  1441.  movem.w (a2,d6),d3-d4
  1442.  asr.w  #4,d3
  1443.  asr.w  #4,d4
  1444.  bsr    drawb
  1445.  addq.l #4,a5
  1446.  bra.s  vok
  1447.  
  1448. drawl:                      ; Linie clippen + zeichnen
  1449.  movem.l d4-d7/a5-a6,-(a7)
  1450.  cmp.w  d1,d3
  1451.  bge.s  .ec
  1452.  exg.l  d0,d2
  1453.  exg.l  d1,d3
  1454. .ec
  1455.  cmp.w  6(a1),d1             ; hiy,loy,hix,lox für Window-Maße
  1456.  bge.s  .lyk
  1457.  move.w d1,6(a1)
  1458. .lyk:
  1459.  cmp.w  4(a1),d3             ; hiy,loy,hix,lox für Window-Maße
  1460.  ble.s  .hyk
  1461.  move.w d3,4(a1)
  1462. .hyk:
  1463.  move.w d0,d4
  1464.  move.w d2,d5
  1465.  cmp.w  d4,d5
  1466.  bge.s  .ok
  1467.  exg.l  d4,d5
  1468. .ok
  1469.  cmp.w  2(a1),d4             ; hiy,loy,hix,lox für Window-Maße
  1470.  bge.s  .lxk0
  1471.  move.w d4,2(a1)
  1472. .lxk0:
  1473.  cmp.w  (a1),d5             ; hiy,loy,hix,lox für Window-Maße
  1474.  ble.s  chky
  1475.  move.w d5,(a1)
  1476.  
  1477. chky:                      ; Clipping, rechts zuerst
  1478.  move.w pwidth(pc),d6
  1479.  cmp.w  d6,d0              ; p1 rechts von rechter Kante
  1480.  bgt.s  ctx21
  1481.  cmp.w  d6,d2              ; p2 rechts von rechter Kante
  1482.  bgt.s  ctx22
  1483.  moveq  #0,d6
  1484.  tst.w  d1
  1485.  bmi.s  cty11              ; p1 über Oberkante ?
  1486.  tst.w  d3
  1487.  bmi.s  cty12              ; p2 über Oberkante ?
  1488.  move.w heightm1(pc),d6
  1489.  cmp.w  d6,d1              ; p1 unter Unterkante ?
  1490.  bgt.s  cty21
  1491.  cmp.w  d6,d3              ; p2 unter Unterkante ?
  1492.  bgt.s  cty22
  1493. chkx:
  1494.  moveq  #0,d6
  1495.  tst.w  d0                 ; p1 links von linker Kante ?
  1496.  bmi.s  ctx11
  1497.  tst.w  d2                 ; p2 links von linker Kante ?
  1498.  bmi.s  ctx12
  1499.  move.l liner(pc),a0
  1500.  jmp    (a0)
  1501. cty11:                     ; Clip Oberkante
  1502.  tst.w  d3                 ; auch p2 über Oberkante (-> Line
  1503.  bmi.s  clpend             ; unsichtbar) ?
  1504.  bsr.s  clipy
  1505.  move.w d4,d0              ; berechnete x-Koordinate
  1506.  moveq  #0,d1              ; y logischerweise = 0
  1507.  bra.s  chky
  1508. cty12:
  1509.  bsr.s  clipy              ; s.o.
  1510.  move.w d4,d2
  1511.  moveq  #0,d3
  1512.  bra.s  chky
  1513. cty21:                     ; Clip Unterkante
  1514.  cmp.w  d6,d3              ; auch p2 unter Unterkante ?
  1515.  bgt.s  clpend
  1516.  bsr.s  clipy
  1517.  move.w d4,d0              ; berechnete x-Koordinate
  1518.  move.w d6,d1              ; y=255
  1519.  bra.s  chky
  1520. cty22:
  1521.  bsr.s  clipy              ; s.o.
  1522.  move.w d4,d2
  1523.  move.w d6,d3
  1524.  bra.s  chky
  1525. ctx11:                     ; Clip linke Kante
  1526.  tst.w  d2                 ; auch p2 links von
  1527.  bmi.s  clpend             ; linker Kante ?
  1528.  bsr.s  clipx
  1529.  move.w d4,d1              ; berechnete y-Koordinate
  1530.  moveq  #0,d0              ; x logischerweise = 0
  1531.  bra.s  chky               ; noch einmal überprüfen
  1532. ctx12:                     ; s.o.
  1533.  bsr.s  clipx
  1534.  move.w d4,d3
  1535.  moveq  #0,d2
  1536.  bra.s  chky               ; noch einmal überprüfen
  1537. ctx21:                     ; Clip rechte Kante
  1538.  cmp.w  d6,d2              ; auch p2 rechts davon ?
  1539.  bgt.s  clpend
  1540.  bsr.s  clipx
  1541.  move.w d4,d1              ; berechnete y-Koordinate
  1542.  move.w d6,d0              ; x=319
  1543.  cmp.l  #endsc,a4
  1544.  beq.s  .ok
  1545.  movem.w d0-1,(a4)
  1546.  addq.l #4,a4
  1547. .ok:
  1548.  bra    chky               ; noch einmal überprüfen
  1549. ctx22:                     ; s.o.
  1550.  bsr.s  clipx
  1551.  move.w d4,d3
  1552.  move.w d6,d2
  1553.  cmp.l  #endsc,a4
  1554.  beq.s  .ok
  1555.  movem.w d2-3,(a4)
  1556.  addq.l #4,a4
  1557. .ok:
  1558.  bra    chky               ; noch einmal überprüfen
  1559. clpend:
  1560.  movem.l (a7)+,d4-d7/a5-a6
  1561.  rts
  1562. clipy:                     ; y-Koord. bekannt, x berechnen
  1563.  move.w d0,d4
  1564.  sub.w  d2,d4
  1565.  move.w d3,d5
  1566.  move.w d3,d7
  1567.  sub.w  d6,d7
  1568.  muls   d7,d4              ; d4=(x2-x1) * (y bek. - y2)
  1569.  sub.w  d1,d5
  1570.  divs   d5,d4              ; d4=d4 / (y2-y1)
  1571.  add.w  d2,d4              ; d4=d4 + y2
  1572.  rts
  1573. clipx:                     ; x-Koordinate bek., y berechnen
  1574.  move.w d1,d4
  1575.  sub.w  d3,d4
  1576.  move.w d2,d5
  1577.  move.w d2,d7
  1578.  sub.w  d6,d7
  1579.  muls   d7,d4              ; d4=(y2-y1) * (x bek. -x2)
  1580.  sub.w  d0,d5
  1581.  divs   d5,d4              ; d4=d4 / (x2-x1)
  1582.  add.w  d3,d4              ; d4=d4 + y2
  1583.  rts
  1584.  
  1585. dline:                  ; hier wird gezeichnet
  1586.  cmp.w  d1,d3
  1587.  beq    drawend
  1588.  move.w d1,d5         ; übliche Linien-Sache
  1589.  mulu   width(pc),d5
  1590.  move.l tmpadr(pc),a5
  1591.  add.l  d5,a5
  1592.  move.w d0,d4
  1593.  asr.w  #4,d4
  1594.  add.w  d4,d4
  1595.  lea    0(a5,d4.w),a5
  1596.  sub.w  d0,d2
  1597.  sub.w  d1,d3
  1598.  moveq  #15,d5
  1599.  and.l  d5,d0
  1600.  move.w d0,d4
  1601.  ror.l  #4,d0
  1602.  eor.w  d5,d4
  1603.  moveq  #0,d5
  1604.  bset   d4,d5
  1605.  move.w #4,d0
  1606.  tst.w  d2
  1607.  bpl.s  .l1
  1608.  addq.w #1,d0
  1609.  neg.w  d2
  1610. .l1:
  1611.  cmp.w  d2,d3
  1612.  ble.s  .l2
  1613.  exg.l  d2,d3
  1614.  subq.w #4,d0
  1615.  add.w  d0,d0
  1616. .l2:
  1617.  move.w d3,d4
  1618.  sub.w  d2,d4
  1619.  add.w  d4,d4
  1620.  add.w  d4,d4
  1621.  add.w  d3,d3
  1622.  moveq  #0,d6
  1623.  move.w d3,d6
  1624.  sub.w  d2,d6
  1625.  bpl.s  .l3
  1626.  or.w   #16,d0
  1627. .l3:
  1628.  add.w  d3,d3
  1629.  add.w  d0,d0
  1630.  add.w  d0,d0
  1631.  addq.w #1,d2
  1632.  asl.w  #6,d2
  1633.  addq.w #2,d2
  1634.  swap   d3
  1635.  move.w d4,d3
  1636.  or.l   #$b4a0003,d0
  1637.  move.w width(pc),d1
  1638.  wblt
  1639.  move.w d1,$60(a6)
  1640.  move.w d1,$66(a6)
  1641.  moveq  #-1,d1
  1642.  move.l d1,$44(a6)
  1643.  move.w d1,$72(a6)
  1644.  move.w #$8000,$74(a6)
  1645.  move.l d3,$62(a6)
  1646.  eor.w  d5,(a5)
  1647.  move.l a5,$48(a6)
  1648.  move.l a5,$54(a6)
  1649.  move.w d6,$52(a6)
  1650.  move.l d0,$40(a6)
  1651.  move.w d2,$58(a6)
  1652.  addq.w #1,line
  1653. drawend:
  1654.  movem.l (a7)+,d4-d7/a5-a6
  1655.  rts
  1656.  
  1657. oline:                  ; hier wird gezeichnet
  1658.  move.w d1,d5         ; übliche Linien-Sache
  1659.  mulu   width(pc),d5
  1660.  move.l plnh(pc),a5
  1661.  add.l  d5,a5
  1662.  move.w d0,d4
  1663.  asr.w  #4,d4
  1664.  add.w  d4,d4
  1665.  lea    0(a5,d4.w),a5
  1666.  sub.w  d0,d2
  1667.  sub.w  d1,d3
  1668.  moveq  #15,d5
  1669.  and.l  d5,d0
  1670.  ror.l  #4,d0
  1671.  move.w #4,d0
  1672.  tst.w  d2
  1673.  bpl.s  .l1
  1674.  addq.w #1,d0
  1675.  neg.w  d2
  1676. .l1:
  1677.  cmp.w  d2,d3
  1678.  ble.s  .l2
  1679.  exg.l  d2,d3
  1680.  subq.w #4,d0
  1681.  add.w  d0,d0
  1682. .l2:
  1683.  move.w d3,d4
  1684.  sub.w  d2,d4
  1685.  add.w  d4,d4
  1686.  add.w  d4,d4
  1687.  add.w  d3,d3
  1688.  moveq  #0,d6
  1689.  move.w d3,d6
  1690.  sub.w  d2,d6
  1691.  bpl.s  .l3
  1692.  or.w   #16,d0
  1693. .l3:
  1694.  add.w  d3,d3
  1695.  add.w  d0,d0
  1696.  add.w  d0,d0
  1697.  addq.w #1,d2
  1698.  asl.w  #6,d2
  1699.  addq.w #2,d2
  1700.  swap   d3
  1701.  move.w d4,d3
  1702.  or.l   #$bca0001,d0
  1703.  move.w width(pc),d1
  1704.  wblt
  1705.  move.w d1,$60(a6)
  1706.  move.w d1,$66(a6)
  1707.  moveq  #-1,d1
  1708.  move.l d1,$44(a6)
  1709.  move.w d1,$72(a6)
  1710.  move.w #$8000,$74(a6)
  1711.  move.l d3,$62(a6)
  1712.  move.w 28(a7),d1
  1713.  moveq  #0,d3
  1714. .lp:
  1715.  btst   d3,d1
  1716.  bne.s  .ok
  1717.  and.l  #$ff0fffff,d0
  1718. .ok:
  1719.  wblt
  1720.  move.l a5,$48(a6)
  1721.  move.l a5,$54(a6)
  1722.  move.w d6,$52(a6)
  1723.  move.l d0,$40(a6)
  1724.  move.w d2,$58(a6)
  1725.  or.l   #$00c00000,d0
  1726.  add.l  onepln(pc),a5
  1727.  addq.w #1,d3
  1728.  cmp.w  used(pc),d3
  1729.  blt.s  .lp
  1730.  addq.w #1,line
  1731.  movem.l (a7)+,d4-d7/a5-a6
  1732.  rts
  1733.  
  1734.  
  1735.  
  1736. csize:           ; Window-Maße in Adressen u. Modulo umrechnen
  1737.  move.w pwidth(pc),d0
  1738.  cmp.w  (a1),d0
  1739.  bge.s  .ok1
  1740.  move.w d0,(a1)
  1741. .ok1:
  1742.  tst.w  2(a1)
  1743.  bge.s  .ok2
  1744.  move.w #0,2(a1)
  1745. .ok2:
  1746.  move.w heightm1(pc),d0
  1747.  cmp.w  4(a1),d0
  1748.  bge.s  .ok3
  1749.  move.w d0,4(a1)
  1750. .ok3:
  1751.  tst.w  6(a1)
  1752.  bge.s  .ok4
  1753.  move.w #0,6(a1)
  1754. .ok4:
  1755.  move.w (a1),d0
  1756.  asr.w  #4,d0
  1757.  asl.w  #1,d0
  1758.  move.w d0,woffx
  1759.  asr.w  #1,d0
  1760.  move.w 2(a1),d1
  1761.  asr.w  #4,d1
  1762.  sub.w  d1,d0
  1763.  addq.w #1,d0
  1764.  move.w d0,wsizex
  1765.  asl.w  #1,d0
  1766.  move.w width(pc),d1
  1767.  sub.w  d0,d1
  1768.  move.w d1,tmpmod
  1769.  move.w 4(a1),d0
  1770.  sub.w  6(a1),d0
  1771.  addq.w #1,d0
  1772.  move.w d0,wsizey
  1773.  move.w 4(a1),d0
  1774.  mulu   width(pc),d0
  1775.  move.w d0,woffy
  1776.  rts
  1777.  
  1778.  
  1779. transform:              ; Transformation
  1780.  move.l pdptr(pc),a2     ; 3D-Eckpunt-Daten
  1781.  move.l tmom(pc),a3     ; Platz für 2D-Daten
  1782.  lea    sintab(pc),a0
  1783.  lea    costab(pc),a1
  1784.  move.l z2orgptr(pc),a4    ; Tabelle für 3D-Z-Koords der Punkte
  1785.  move.w (a2)+,d5
  1786.  subq.w #1,d5
  1787. .lp:
  1788.  movem.w (a2)+,d0-d2
  1789.  moveq  #4,d4
  1790.  asl.w  d4,d0
  1791.  asl.w  d4,d1
  1792.  asl.w  d4,d2
  1793.  move.w rx(pc),d3
  1794.  move.w d1,d4
  1795.  move.w d2,d7
  1796.  muls   0(a1,d3.w),d1       ; neu_y=y*cos(al)
  1797.  muls   0(a0,d3.w),d2       ; neu_z=z*sin(al)
  1798.  sub.l  d2,d1               ; fertig_y=neu_y-neu_z
  1799.  add.l  d1,d1
  1800.  swap   d1
  1801.  muls   0(a0,d3.w),d4          ; neu_y=y*sin(al)
  1802.  muls   0(a1,d3.w),d7          ; neu_z=z*cos(al)
  1803.  add.l  d7,d4               ; fertig_z=neu_y-neu_z
  1804.  add.l  d4,d4
  1805.  swap   d4
  1806.  move.w d4,d2               ; d2=z
  1807.  
  1808.  move.w ry(pc),d3
  1809.  move.w d0,d4
  1810.  move.w d2,d7
  1811.  muls   0(a1,d3.w),d0          ; nx=x*cos(be)
  1812.  muls   0(a0,d3.w),d2          ; nz=z*sin(be)
  1813.  add.l  d2,d0               ; fx=nx+nz
  1814.  add.l  d0,d0
  1815.  swap   d0
  1816.  neg.w  d4                  ; d4=-x
  1817.  muls   0(a0,d3.w),d4          ; nx=-x*sin(be)
  1818.  muls   0(a1,d3.w),d7          ; ny=y*cos(be)
  1819.  add.l  d7,d4               ; fz=nx+ny
  1820.  add.l  d4,d4
  1821.  swap   d4
  1822.  move.w d4,d2
  1823.  
  1824.  move.w rz(pc),d3
  1825.  move.w d0,d4
  1826.  move.w d1,d7
  1827.  muls   0(a1,d3.w),d0          ; nx=x*cos(ga)
  1828.  muls   0(a0,d3.w),d1          ; ny=y*sin(ga)
  1829.  sub.l  d1,d0                  ; fx=nx-ny
  1830.  add.l  d0,d0
  1831.  swap   d0
  1832.  muls   0(a0,d3.w),d4          ; nx=x*sin(ga)
  1833.  muls   0(a1,d3.w),d7          ; ny=y*cos(ga)
  1834.  add.l  d7,d4               ; fy=nx+ny
  1835.  add.l  d4,d4
  1836.  swap   d4
  1837.  move.w d4,d1       ; *************
  1838.  
  1839.  move.w d2,(a4)+    ; 3D-Z von Punkten nach z2tab
  1840.  ext.l  d0
  1841.  ext.l  d1
  1842.  ext.l  d2
  1843.  add.l  addx(pc),d0
  1844.  add.l  addy(pc),d1
  1845.  add.l  addz(pc),d2
  1846.  moveq  #10,d3
  1847.  asl.l  d3,d0
  1848.  asl.l  d3,d1
  1849.  asr.l  #3,d2
  1850.  beq.s  .pjtend
  1851.  divs   d2,d0
  1852.  divs   d2,d1
  1853.  neg.w  d0
  1854.  move.w xscale(pc),d2
  1855.  asl.w  d2,d0
  1856.  move.w yscale(pc),d2
  1857.  asl.w  d2,d1
  1858.  add.w  midx(pc),d0            ; Zentrieren
  1859.  add.w  midy(pc),d1
  1860. .pjtend:
  1861.  movem.w d0-d1,(a3)
  1862.  move.w (a2)+,(a4)+
  1863.  addq.l #4,a3
  1864.  dbf    d5,.lp
  1865.  rts
  1866.  
  1867. backs:               ; Promax
  1868.  move.l atabptr(pc),a2
  1869.  move.l tmom(pc),a3
  1870.  move.l z2orgptr(pc),a1
  1871.  move.l ztabptr(pc),a0
  1872.  move.l dttabptr(pc),a4
  1873.  move.w (a2)+,d7
  1874.  subq.w #1,d7
  1875. lpb:
  1876.  tst.w  (a2)
  1877.  blt    vballb
  1878.  beq    olinb
  1879. vp3:
  1880.  move.w 4(a2),d5
  1881.  movem.w 0(a3,d5.w),d0-d1
  1882.  move.w 6(a2),d5
  1883.  movem.w 0(a3,d5.w),d2-d3
  1884.  move.w 8(a2),d5
  1885.  movem.w 0(a3,d5.w),d4-d5
  1886.  sub.w  d0,d2
  1887.  sub.w  d1,d3
  1888.  sub.w  d0,d4
  1889.  sub.w  d1,d5
  1890.  muls   d2,d5
  1891.  muls   d3,d4
  1892.  sub.l  d4,d5
  1893.  bmi.s  notvisib               
  1894. visib:
  1895.  move.w (a2),d6    ; von gültiger Fläche Z's aus z2tab addieren,
  1896.  subq.w #1,d6      ; Durchschnitt berechnen und nach ztab -> Quicksort
  1897.  moveq  #4,d5
  1898.  moveq  #0,d1
  1899. .slp:
  1900.  move.w (a2,d5),d0
  1901.  add.w  (a1,d0),d1
  1902.  addq.w #2,d5
  1903.  dbf    d6,.slp
  1904.  addq.w #1,drawnum
  1905.  ext.l  d1
  1906.  divs   (a2),d1
  1907.  ext.l  d1
  1908.  add.l  addz(pc),d1
  1909.  move.l d1,(a0)+
  1910.  move.l a2,(a4)+
  1911.  addq.l #6,a4
  1912.  move.l a3,(a4)+
  1913. notvisib:
  1914.  lea    22(a2),a2
  1915.  dbf    d7,lpb     ; alle Flächen
  1916.  move.l a0,ztabptr
  1917.  move.l a4,dttabptr
  1918.  subq.l #4,a0
  1919.  move.l a0,zend    ; Ende von ztab (für Quicksort)
  1920.  rts
  1921. vballb:
  1922.  move.w 4(a2),d0
  1923.  movem.w (a1,d0),d0-d1
  1924.  move.l a2,(a4)+
  1925.  ext.l  d0
  1926.  add.l  addz(pc),d0
  1927.  move.l d0,(a0)+
  1928.  move.l d0,(a4)+
  1929.  move.w d1,(a4)+
  1930.  move.l a3,(a4)+
  1931.  addq.w #1,drawnum
  1932.  bra.s  notvisib
  1933. olinb:
  1934.  move.w 4(a2),d0
  1935.  move.w (a1,d0),d1
  1936.  move.w 6(a2),d0
  1937.  add.w  (a1,d0),d1
  1938.  asr.w  #1,d1
  1939.  ext.l  d1
  1940.  add.l  addz(pc),d1
  1941.  move.l d1,(a0)+
  1942.  move.l a2,(a4)+
  1943.  addq.l #6,a4
  1944.  move.l a3,(a4)+
  1945.  addq.w #1,drawnum
  1946.  bra    notvisib
  1947. wrbacks:
  1948.  move.l atabptr(pc),a2
  1949.  move.l tmom(pc),a3
  1950.  move.l z2orgptr(pc),a1
  1951.  move.l ztabptr(pc),a0
  1952.  move.l dttabptr(pc),a4
  1953.  move.w (a2)+,d7
  1954.  subq.w #1,d7
  1955. .lpb:
  1956.  tst.w  (a2)
  1957.  blt    vballb
  1958.  beq    olinb
  1959. .vp3:
  1960.  move.w (a2),d6    ; von gültiger Fläche Z's aus z2tab addieren,
  1961.  subq.w #1,d6      ; Durchschnitt berechnen und nach ztab -> Quicksort
  1962.  moveq  #4,d5
  1963.  moveq  #0,d1
  1964. .slp:
  1965.  move.w (a2,d5),d0
  1966.  add.w  (a1,d0),d1
  1967.  addq.w #2,d5
  1968.  dbf    d6,.slp
  1969.  addq.w #1,drawnum
  1970.  ext.l  d1
  1971.  divs   (a2),d1
  1972.  ext.l  d1
  1973.  add.l  addz(pc),d1
  1974.  move.l d1,(a0)+
  1975.  move.l a2,(a4)+
  1976.  addq.l #6,a4
  1977.  move.l a3,(a4)+
  1978.  lea    22(a2),a2
  1979.  dbf    d7,.lpb     ; alle Flächen
  1980.  move.l a0,ztabptr
  1981.  move.l a4,dttabptr
  1982.  subq.l #4,a0
  1983.  move.l a0,zend    ; Ende von ztab (für Quicksort)
  1984.  rts
  1985.  
  1986. copy:              ; klar
  1987.  move.l tmpadr(pc),a0
  1988.  move.l plnh(pc),a1
  1989.  moveq  #0,d2
  1990.  move.w woffx(pc),d2
  1991.  add.w  woffy(pc),d2
  1992.  add.l  d2,a0
  1993.  add.l  d2,a1
  1994.  move.w wsizey(pc),d2
  1995.  asl.w  #6,d2
  1996.  add.w  wsizex(pc),d2
  1997.  move.w tmpmod(pc),d0
  1998.  moveq  #-1,d1
  1999.  wblt
  2000.  move.w d0,$62(a6)
  2001.  move.w d0,$64(a6)
  2002.  move.w d0,$66(a6)
  2003.  move.l d1,$44(a6)
  2004.  move.l a0,$50(a6)
  2005.  move.l a0,$54(a6)
  2006.  move.l #$9f00012,$40(a6)
  2007.  move.w d2,$58(a6)        ; Füllen
  2008.  move.l #$dfc0002,d1
  2009.  moveq  #0,d0
  2010.  move.l #$f00000,d3
  2011. .loop:
  2012.  btst   d0,d4
  2013.  bne.s  .ok
  2014.  sub.l  d3,d1
  2015. .ok:
  2016.  wblt
  2017.  move.l d1,$40(a6)
  2018.  move.l a0,$50(a6)
  2019.  move.l a1,$4c(a6)
  2020.  move.l a1,$54(a6)
  2021.  move.w d2,$58(a6)     ; nach Farb-Werten kopieren
  2022.  or.l   d3,d1
  2023.  add.l  onepln(pc),a1
  2024.  addq.w #1,d0
  2025.  cmp.w  used(pc),d0
  2026.  blt.s  .loop
  2027.  wblt
  2028.  move.l #$1000002,$40(a6)
  2029.  move.l a0,$54(a6)
  2030.  move.w d2,$58(a6)   ; Window löschen
  2031.  rts
  2032.  
  2033. RotateX:
  2034.  movem.l d5/d7,-(a7)
  2035.  asl.w  #1,d6
  2036.  bge.s  .ok
  2037.  add.w  #720,d6
  2038. .ok:
  2039.  sub.w  d3,d0
  2040.  sub.w  d4,d1
  2041.  sub.w  d5,d2
  2042.  lea    sintab(pc),a0
  2043.  lea    costab(pc),a1
  2044.  move.w d1,d5
  2045.  move.w d2,d7
  2046.  muls   0(a1,d6.w),d1       ; neu_y=y*cos(al)
  2047.  muls   0(a0,d6.w),d2       ; neu_z=z*sin(al)
  2048.  sub.l  d2,d1               ; fertig_y=neu_y-neu_z
  2049.  add.l  d1,d1
  2050.  swap   d1
  2051.  muls   0(a0,d6.w),d5          ; neu_y=y*sin(al)
  2052.  muls   0(a1,d6.w),d7          ; neu_z=z*cos(al)
  2053.  add.l  d7,d5               ; fertig_z=neu_y-neu_z
  2054.  add.l  d5,d5
  2055.  swap   d5
  2056.  move.w d5,d2               ; d2=z
  2057.  movem.l (a7)+,d5/d7
  2058.  add.w  d3,d0
  2059.  add.w  d4,d1
  2060.  add.w  d5,d2
  2061.  rts
  2062.  
  2063. RotateY: 
  2064.  movem.l d5/d7,-(a7)
  2065.  asl.w  #1,d6
  2066.  bge.s  .ok
  2067.  add.w  #720,d6
  2068. .ok:
  2069.  sub.w  d3,d0
  2070.  sub.w  d4,d1
  2071.  sub.w  d5,d2
  2072.  lea    sintab(pc),a0
  2073.  lea    costab(pc),a1
  2074.  move.w d0,d5
  2075.  move.w d2,d7
  2076.  muls   0(a1,d6.w),d0          ; nx=x*cos(be)
  2077.  muls   0(a0,d6.w),d2          ; nz=z*sin(be)
  2078.  add.l  d2,d0               ; fx=nx+nz
  2079.  add.l  d0,d0
  2080.  swap   d0
  2081.  neg.w  d5                  ; d5=-x
  2082.  muls   0(a0,d6.w),d5          ; nx=-x*sin(be)
  2083.  muls   0(a1,d6.w),d7          ; ny=y*cos(be)
  2084.  add.l  d7,d5               ; fz=nx+ny
  2085.  add.l  d5,d5
  2086.  swap   d5
  2087.  move.w d5,d2
  2088.  movem.l (a7)+,d5/d7
  2089.  add.w  d3,d0
  2090.  add.w  d4,d1
  2091.  add.w  d5,d2
  2092.  rts
  2093.  
  2094. RotateZ:
  2095.  movem.l d5/d7,-(a7)
  2096.  asl.w  #1,d6
  2097.  bge.s  .ok
  2098.  add.w  #720,d6
  2099. .ok:
  2100.  sub.w  d3,d0
  2101.  sub.w  d4,d1
  2102.  sub.w  d5,d2
  2103.  lea    sintab(pc),a0
  2104.  lea    costab(pc),a1
  2105.  move.w d0,d5
  2106.  move.w d1,d7
  2107.  muls   0(a1,d4.w),d0          ; nx=x*cos(ga)
  2108.  muls   0(a0,d4.w),d1          ; ny=y*sin(ga)
  2109.  sub.l  d1,d0                  ; fx=nx-ny
  2110.  add.l  d0,d0
  2111.  swap   d0
  2112.  muls   0(a0,d4.w),d5          ; nx=x*sin(ga)
  2113.  muls   0(a1,d4.w),d7          ; ny=y*cos(ga)
  2114.  add.l  d7,d5               ; fy=nx+ny
  2115.  add.l  d5,d5
  2116.  swap   d5
  2117.  move.w d5,d1       ; *************
  2118.  movem.l (a7)+,d5/d7
  2119.  add.w  d3,d0
  2120.  add.w  d4,d1
  2121.  add.w  d5,d2
  2122.  rts
  2123.  
  2124. UseJoy:
  2125.  tst.l  offset
  2126.  bne.s  .err
  2127.  asl.w  #2,d0
  2128.  addq.w #2,d0
  2129.  ext.l  d0
  2130.  move.l d0,offset
  2131.  move.w #3,rsx
  2132.  move.w #3,rsy
  2133.  move.w #3,rsz
  2134.  move.w #50,msz
  2135.  move.w #-300,mtrv
  2136.  move.w #-16000,mtrh
  2137.  move.l #joy,joybuf
  2138.  cmp.l  #0,a1
  2139.  bne.s  .tab
  2140.  moveq  #0,d0
  2141.  rts
  2142. .err:
  2143.  moveq  #-1,d0
  2144.  rts
  2145. .tab:
  2146.  move.w (a1)+,msz
  2147.  move.w (a1)+,mtrv
  2148.  move.w (a1)+,mtrh
  2149.  move.w (a1)+,rsx
  2150.  move.w (a1)+,rsy
  2151.  move.w (a1)+,rsz
  2152.  moveq  #0,d0
  2153.  rts
  2154.  
  2155. FreeJoy:
  2156.  move.l #0,offset
  2157.  move.l #0,joyadr
  2158.  move.l #0,joybuf
  2159.  move.l #0,offset
  2160.  moveq  #0,d0
  2161.  rts
  2162.  
  2163. offset dc.l 0
  2164. rsx    dc.w 0
  2165. rsy    dc.w 0
  2166. rsz    dc.w 0
  2167. msz    dc.w 0
  2168. mtrv   dc.w 0
  2169. mtrh   dc.w 0
  2170. joybuf dc.l 0
  2171.  
  2172. KillSystem:
  2173.  moveq #0,d0
  2174.  rts
  2175.  
  2176. AutoScaleOn:
  2177.  move.w #0,xscale
  2178.  btst   #15,d0
  2179.  beq.s  .nohires
  2180.  move.w #1,xscale
  2181. .nohires
  2182.  move.w #0,yscale
  2183.  btst   #2,d0
  2184.  beq.s  .nolace
  2185.  move.w #1,yscale
  2186. .nolace
  2187.  moveq  #0,d0
  2188.  rts
  2189.  
  2190. AutoScaleOff:
  2191.  move.w #0,xscale
  2192.  move.w #0,yscale
  2193.  moveq  #0,d0
  2194.  rts
  2195.  
  2196. SetColors:
  2197.  movem.l a2-a3/a6,-(a7)
  2198.  move.l 4(a0),a2
  2199.  move.l a1,a3
  2200.  move.l gfxbase(pc),a6
  2201. .lab:
  2202.  move.w (a3)+,d0
  2203.  move.w (a3)+,d1
  2204.  move.w (a3)+,d2
  2205.  move.w (a3)+,d3
  2206.  move.l a2,a0
  2207.  jsr    -288(a6)
  2208.  tst.w  (a3)
  2209.  bge.s  .lab
  2210.  movem.l (a7)+,a2-a3/a6
  2211.  moveq   #0,d0
  2212.  rts
  2213.  
  2214. plnh     dc.l 0
  2215. plns     dc.l 0
  2216. tmpadr   dc.l 0
  2217. vbi      dc.w 0
  2218. moveptr  dc.l 0
  2219. addx     dc.l 0
  2220. addy     dc.l 0
  2221. addz     dc.l 0
  2222. rx       dc.w 0
  2223. ry       dc.w 0
  2224. rz       dc.w 0
  2225.          dc.w 0
  2226. objflg   dc.w 0
  2227. vcnt     dc.l 0
  2228. movecnt  dc.w 0
  2229. pdptr    dc.l 0
  2230. anptr    dc.l 0
  2231. mvptr    dc.l 0
  2232. atabptr  dc.l 0
  2233. zend     dc.l 0
  2234. hix      dc.w 0
  2235. lox      dc.w 0
  2236. hiy      dc.w 0
  2237. loy      dc.w 0
  2238. wsizex   dc.w 1
  2239. wsizey   dc.w 1
  2240. woffx    dc.w 0
  2241. woffy    dc.w 0
  2242. tmpmod   dc.w 0
  2243. scx1     dc.w 0
  2244. scy1     dc.w 0
  2245. scx2     dc.w 0
  2246. scy2     dc.w 0
  2247. endsc
  2248. drawnum  dc.w 0
  2249. line     dc.w 0
  2250. liner    dc.l 0
  2251. linrout  dc.l 0
  2252. ana0     dc.l 0
  2253. ana1     dc.l 0
  2254. ana2     dc.l 0
  2255. ana3     dc.l 0
  2256. ana4     dc.l 0
  2257. animcnt  dc.w 0
  2258. dttabptr dc.l 0
  2259. ztabptr  dc.l 0
  2260. zorgptr  dc.l 0
  2261. z2orgptr dc.l 0
  2262. rootptr  dc.l 0
  2263. dtorgptr dc.l 0
  2264. lrtabptr dc.l 0
  2265. bobptr   dc.l 0
  2266. endbob   dc.l 0
  2267. vsizptr  dc.l 0
  2268. strptr   dc.l 0
  2269. starptr  dc.l 0
  2270. tmom     dc.l 0
  2271. gfxbase  dc.l 0
  2272. intbase  dc.l 0
  2273. dosbase  dc.l 0
  2274. chipbase dc.l $dff000
  2275. xscale   dc.w 0
  2276. yscale   dc.w 0
  2277.  
  2278. normsiztab:
  2279.  dc.l -1188*16,-1281*16,-1375*16,-1531*16,-1688*16,-1938*16,-2188*16,-2656*16,-3125*16,-3750*16,-4375*16,-5000*16,-5625*16,-6563*16,-7500*16,-17000*16
  2280.  
  2281.  
  2282. sintab    DC.W    0,$23B,$477,$6B2,$8ED,$B27,$D61,$F99
  2283.     DC.W    $11D0,$1405,$1639,$186C,$1A9C,$1CCA,$1EF7,$2120
  2284.     DC.W    $2347,$256C,$278D,$29AB,$2BC6,$2DDE,$2FF2,$3203
  2285.     DC.W    $340F,$3617,$381C,$3A1B,$3C17,$3E0D,$3FFF,$41EC
  2286.     DC.W    $43D3,$45B6,$4793,$496A,$4B3B,$4D07,$4ECD,$508C
  2287.     DC.W    $5246,$53F9,$55A5,$574B,$58E9,$5A81,$5C12,$5D9C
  2288.     DC.W    $5F1E,$6099,$620C,$6378,$64DC,$6638,$678D,$68D9
  2289.     DC.W    $6A1D,$6B58,$6C8C,$6DB6,$6ED9,$6FF2,$7103,$720B
  2290.     DC.W    $730A,$7400,$74EE,$75D2,$76AD,$777E,$7846,$7905
  2291.     DC.W    $79BB,$7A67,$7B09,$7BA2,$7C31,$7CB7,$7D32,$7DA4
  2292.     DC.W    $7E0D,$7E6B,$7EC0,$7F0A,$7F4B,$7F82,$7FAF,$7FD2
  2293.     DC.W    $7FEB,$7FFA
  2294. costab    DC.W    $7FFF,$7FFA,$7FEB,$7FD2,$7FAF,$7F82
  2295.     DC.W    $7F4B,$7F0A,$7EC0,$7E6B,$7E0D,$7DA4,$7D32,$7CB7
  2296.     DC.W    $7C31,$7BA2,$7B09,$7A67,$79BB,$7905,$7846,$777E
  2297.     DC.W    $76AD,$75D2,$74EE,$7400,$730A,$720B,$7103,$6FF2
  2298.     DC.W    $6ED9,$6DB6,$6C8B,$6B58,$6A1D,$68D9,$678D,$6638
  2299.     DC.W    $64DC,$6378,$620C,$6099,$5F1E,$5D9C,$5C12,$5A81
  2300.     DC.W    $58E9,$574B,$55A5,$53F9,$5246,$508C,$4ECD,$4D07
  2301.     DC.W    $4B3B,$496A,$4793,$45B6,$43D3,$41EC,$3FFF,$3E0D
  2302.     DC.W    $3C17,$3A1B,$381C,$3618,$340F,$3203,$2FF2,$2DDE
  2303.     DC.W    $2BC7,$29AB,$278D,$256C,$2347,$2120,$1EF7,$1CCB
  2304.     DC.W    $1A9C,$186C,$163A,$1406,$11D0,$F99,$D61,$B27
  2305.     DC.W    $8ED,$6B3,$477,$23C,0,$FDC5,$FB89,$F94E
  2306.     DC.W    $F713,$F4D9,$F2A0,$F067,$EE30,$EBFB,$E9C7,$E794
  2307.     DC.W    $E564,$E336,$E10A,$DEE0,$DCB9,$DA95,$D873,$D655
  2308.     DC.W    $D43A,$D222,$D00E,$CDFE,$CBF1,$C9E9,$C7E5,$C5E5
  2309.     DC.W    $C3EA,$C1F3,$C001,$BE14,$BC2D,$BA4B,$B86E,$B696
  2310.     DC.W    $B4C5,$B2F9,$B133,$AF74,$ADBB,$AC08,$AA5B,$A8B6
  2311.     DC.W    $A717,$A57F,$A3EE,$A264,$A0E2,$9F67,$9DF4,$9C88
  2312.     DC.W    $9B24,$99C8,$9874,$9728,$95E4,$94A8,$9375,$924A
  2313.     DC.W    $9128,$900E,$8EFD,$8DF5,$8CF6,$8C00,$8B13,$8A2E
  2314.     DC.W    $8954,$8882,$87BA,$86FB,$8645,$8599,$84F7,$845E
  2315.     DC.W    $83CF,$8349,$82CE,$825C,$81F3,$8195,$8140,$80F6
  2316.     DC.W    $80B5,$807E,$8051,$802E,$8015,$8006,$8001,$8006
  2317.     DC.W    $8015,$802E,$8051,$807E,$80B5,$80F6,$8140,$8195
  2318.     DC.W    $81F3,$825B,$82CD,$8349,$83CF,$845E,$84F7,$8599
  2319.     DC.W    $8645,$86FB,$87B9,$8882,$8953,$8A2E,$8B12,$8BFF
  2320.     DC.W    $8CF5,$8DF5,$8EFD,$900E,$9127,$9249,$9374,$94A7
  2321.     DC.W    $95E3,$9727,$9873,$99C7,$9B23,$9C87,$9DF3,$9F67
  2322.     DC.W    $A0E1,$A264,$A3ED,$A57E,$A716,$A8B5,$AA5B,$AC07
  2323.     DC.W    $ADBA,$AF73,$B133,$B2F8,$B4C4,$B696,$B86D,$BA4A
  2324.     DC.W    $BC2C,$BE14,$C000,$C1F2,$C3E9,$C5E4,$C7E4,$C9E8
  2325.     DC.W    $CBF0,$CDFD,$D00D,$D221,$D439,$D654,$D872,$DA94
  2326.     DC.W    $DCB8,$DEDF,$E109,$E335,$E563,$E794,$E9C6,$EBFA
  2327.     DC.W    $EE30,$F066,$F29F,$F4D8,$F712,$F94D,$FB88,$FDC4
  2328. sinend    DC.W    0,$23B,$477,$6B2,$8ED,$B27,$D61,$F99
  2329.     DC.W    $11D0,$1405,$1639,$186C,$1A9C,$1CCA,$1EF7,$2120
  2330.     DC.W    $2347,$256C,$278D,$29AB,$2BC6,$2DDE,$2FF2,$3203
  2331.     DC.W    $340F,$3617,$381C,$3A1B,$3C17,$3E0D,$3FFF,$41EC
  2332.     DC.W    $43D3,$45B6,$4793,$496A,$4B3B,$4D07,$4ECD,$508C
  2333.     DC.W    $5246,$53F9,$55A5,$574B,$58E9,$5A81,$5C12,$5D9C
  2334.     DC.W    $5F1E,$6099,$620C,$6378,$64DC,$6638,$678D,$68D9
  2335.     DC.W    $6A1D,$6B58,$6C8C,$6DB6,$6ED9,$6FF2,$7103,$720B
  2336.     DC.W    $730A,$7400,$74EE,$75D2,$76AD,$777E,$7846,$7905
  2337.     DC.W    $79BB,$7A67,$7B09,$7BA2,$7C31,$7CB7,$7D32,$7DA4
  2338.     DC.W    $7E0D,$7E6B,$7EC0,$7F0A,$7F4B,$7F82,$7FAF,$7FD2
  2339.     DC.W    $7FEB,$7FFA
  2340. cosend
  2341.  
  2342. gfxname dc.b "graphics.library",0
  2343. intname dc.b "intuition.library",0
  2344.