home *** CD-ROM | disk | FTP | other *** search
/ Go64! / Go64_2002-09_2002_CSW_Side_A.d64 / rotfilledfac.txt < prev    next >
Text File  |  2023-02-26  |  46KB  |  2,181 lines

  1.         ; go64! tutorial on 3-d graphics
  2.         ; part 7: filling planes
  3.  
  4.         ; go64! 3d-kurs
  5.         ; teil 7: flaechen fuellen
  6.  
  7. sincoslo = $4d00
  8. sincoshi = $4f00
  9. log2tabl = $5480
  10. log2tbh0 = $5500
  11. log2tbh1 = $5580
  12. reciptbl = $5600
  13. reciptbh = $5700
  14. persptab = $5800
  15.  
  16. vicbank  = %00000011; $0000-$4000
  17. v        = vicbank($03*$4000;=$0000
  18. scrn     = $0400
  19. spdxofsl = $0e00
  20. spdxofsh = $0f00
  21. charset0 = $2000
  22. charset1 = $2800
  23. charset2 = $3000
  24. fillbuff = $3800
  25. spidcod0 = $5900
  26. spidcod1 = $6480
  27. spidcod2 = $7000
  28. filspid0 = $7b80
  29. filspid1 = $a300
  30. filspid2 = $ca80
  31. eraspeed = $f200
  32. spdt1ofs = $0400
  33. spdt2ofs = $07c0
  34.  
  35. basezp   = $02
  36. currscrn = $00+basezp
  37. pointers = $01+basezp
  38. alphalo  = $04+basezp
  39. betalo   = $05+basezp
  40. gammalo  = $06+basezp
  41. alphahi  = $07+basezp
  42. betahi   = $08+basezp
  43. gammahi  = $09+basezp
  44. alpha    = $0a+basezp
  45. beta     = $0b+basezp
  46. gamma    = $0c+basezp
  47. sinbufl0 = $0d+basezp
  48. sinbufh0 = $0e+basezp
  49. sinbufl1 = $0f+basezp
  50. sinbufh1 = $10+basezp
  51. unitxxlo = $11+basezp
  52. unitxxhi = $12+basezp
  53. unitxylo = $13+basezp
  54. unitxyhi = $14+basezp
  55. unitxzlo = $15+basezp
  56. unitxzhi = $16+basezp
  57. unityxlo = $17+basezp
  58. unityxhi = $18+basezp
  59. unityylo = $19+basezp
  60. unityyhi = $1a+basezp
  61. unityzlo = $1b+basezp
  62. unityzhi = $1c+basezp
  63. unitzxlo = $1d+basezp
  64. unitzxhi = $1e+basezp
  65. unitzylo = $1f+basezp
  66. unitzyhi = $20+basezp
  67. unitzzlo = $21+basezp
  68. unitzzhi = $22+basezp
  69. x2dcords = $27+basezp
  70. y2dcords = $2f+basezp
  71. z2dcords = $37+basezp
  72. oldxcrds = $3f+basezp
  73. oldycrds = $47+basezp
  74. oldvisib = $4f+basezp
  75. begx     = $0d+basezp
  76. endx     = $0e+basezp
  77. begy     = $0f+basezp
  78. endy     = $10+basezp
  79. deltax   = $11+basezp
  80. deltay   = $12+basezp
  81. linslopl = $13+basezp
  82. linsloph = $14+basezp
  83. multizpg = $15+basezp
  84. cullbuff = $17+basezp
  85. visiblin = $19+basezp
  86.  
  87. backgndc = $06
  88. darkcol  = $0e
  89. mediumcl = $03
  90. britecol = $0d
  91.  
  92. xpos     = $0c; char matrix coordinates
  93. ypos     = $05; zeichenmatrixkoordinaten
  94.  
  95. alphaadd = $ff55
  96. betaadd  = $0255; angle add values
  97. gammaadd = $0100; winkeladditionswerte
  98.  
  99. numpoint = $08
  100.  
  101.  
  102.          *= $4000
  103.  
  104.          sei
  105.          lda #$35
  106.          sta $01
  107.          lda #<return;nmi
  108.          sta $fffa
  109.          lda #>return;nmi
  110.          sta $fffb
  111.          bit $d011
  112.          bpl *-$03
  113.          bit $d011
  114.          bmi *-$03
  115.          lda #$00
  116.          sta $d011
  117.          lda #backgndc
  118.          sta $d020
  119.  
  120.  
  121.          ; build tables
  122.          ; tabellen generieren
  123.  
  124.          lda #spidraw1-spidraw0
  125.          ldx #$00
  126.          jsr mkxofstb
  127.          lda #spidrawe-spidraw1
  128.          ldx #$40
  129.          jsr mkxofstb
  130.          lda #erasraw1-erasraw0
  131.          ldx #$80
  132.          jsr mkxofstb
  133.          lda #erasrawe-erasraw1
  134.          ldx #$c0
  135.          jsr mkxofstb
  136.  
  137.          ldx #$00
  138.          lda sincoslo+$00,x
  139.          sta sincoslo+$0100,x
  140.          lda sincoshi+$00,x
  141.          sta sincoshi+$0100,x
  142.          inx
  143.          bne *-$0d
  144.  
  145.  
  146.          ; build speedcode
  147.          ; speedcode generieren
  148.  
  149.          lda #%01000000
  150.          ldx #<spidcod0
  151.          ldy #>spidcod0
  152.          jsr maklinsp
  153.          lda #%10000000
  154.          ldx #<spidcod1
  155.          ldy #>spidcod1
  156.          jsr maklinsp
  157.          lda #%11000000
  158.          ldx #<spidcod2
  159.          ldy #>spidcod2
  160.          jsr maklinsp
  161.  
  162.          lda #$30
  163.          sta $01
  164.          lda #>charset0+v
  165.          ldx #<filspid0
  166.          ldy #>filspid0
  167.          jsr mkfilspd
  168.          lda #>charset1+v
  169.          ldx #<filspid1
  170.          ldy #>filspid1
  171.          jsr mkfilspd
  172.          lda #>charset2+v
  173.          ldx #<filspid2
  174.          ldy #>filspid2
  175.          jsr mkfilspd
  176.          lda #$35
  177.          sta $01
  178.  
  179.          clc
  180.          lda #<eraspeed
  181.          sta pointers+$00
  182.          sta pointers+$02
  183.          lda #>eraspeed
  184.          sta pointers+$01
  185.          sta pointers+$03
  186.          lda #>fillbuff
  187.          sta pointers+$04
  188.          sta erasraw0+$04
  189.          lda #$04
  190.          sta pointers+$05
  191.          ldx #$40; 64 pixels width
  192.                  ; 64 pixel breite
  193. mkers0lp ldy #erasraw1-erasraw0-$01
  194.          lda erasraw0,y
  195.          sta (pointers+$00),y
  196.          dey
  197.          bpl mkers0lp+$02
  198.          lda #erasraw1-erasraw0
  199.          ldy #erasraw0-erasraw0
  200.          jsr nexteras
  201.          bne mkers0lp+$00
  202.  
  203.          lda #$88; op-code for dey
  204.                  ; op-code fuer dey
  205.          ldx #<eraspeed+$0340
  206.          ldy #>eraspeed+$0340
  207.          jsr mkers1sb
  208.  
  209.          lda #$c8; op-code for iny
  210.                  ; op-code fuer iny
  211.          ldx #<eraspeed+$0640
  212.          ldy #>eraspeed+$0640
  213.          jsr mkers1sb
  214.  
  215.  
  216.          ; clear the charsets and the
  217.          ;  filling buffer
  218.          ; die zeichensaetze und den
  219.          ;  fuellpuffer loeschen
  220.  
  221.          ldy #<charset0+v
  222.          sty pointers+$00
  223.          sty pointers+$02
  224.          sty pointers+$04
  225.          lda #>charset0+v
  226.          sta pointers+$01
  227.          lda #>charset1+v
  228.          sta pointers+$03
  229.          lda #>charset2+v
  230.          sta pointers+$05
  231.          lda #<fillbuff
  232.          sta pointers+$06
  233.          lda #>fillbuff
  234.          sta pointers+$07
  235.          ldx #$08
  236. clearchr lda #%11111111
  237.          sta (pointers+$00),y
  238.          sta (pointers+$02),y
  239.          sta (pointers+$04),y
  240.          lda #%00000000
  241.          sta (pointers+$06),y
  242.          iny
  243.          bne clearchr
  244.          inc pointers+$01
  245.          inc pointers+$03
  246.          inc pointers+$05
  247.          inc pointers+$07
  248.          dex
  249.          bne clearchr
  250.  
  251.  
  252.          ; clear screen
  253.          ; bildschirm loeschen
  254.  
  255.          lda #$00
  256.          tax
  257.          sta scrn+v+$00,x
  258.          sta scrn+v+$0100,x
  259.          sta scrn+v+$0200,x
  260.          sta scrn+v+$0300,x
  261.          inx
  262.          bne *-$0d
  263.  
  264.  
  265.          ; set up screen matrix
  266.          ; bildschirmmatrix bilden
  267.  
  268.          clc
  269.          lda #<xpos+(ypos*$28)+scrn+v
  270.          sta pointers+$00
  271.          lda #>xpos+(ypos*$28)+scrn+v
  272.          sta pointers+$01
  273.          ldx #$00
  274. setupscr txa
  275.          ldy #$00
  276.          sta (pointers+$00),y
  277.          adc #$10
  278.          iny
  279.          cpy #$10
  280.          bne setupscr+$03
  281.          lda #$27
  282.          adc pointers+$00
  283.          sta pointers+$00
  284.          bcc *+$04
  285.          inc pointers+$01
  286.          inx
  287.          cpx #$10
  288.          bne setupscr
  289.  
  290.  
  291.          ; set colours
  292.          ; farben setzen
  293.  
  294.          lda #britecol
  295.          sta $d021
  296.          lda #mediumcl
  297.          sta $d022
  298.          lda #darkcol
  299.          sta $d023
  300.          lda #backgndc.$08; multicolour
  301.          ldx #$00
  302.          sta $d800,x
  303.          sta $d900,x
  304.          sta $da00,x
  305.          sta $db00,x
  306.          inx
  307.          bne *-$0d
  308.          stx currscrn
  309.  
  310.  
  311.          ; set vic registers
  312.          ; vic-register setzen
  313.  
  314.          bit $d011
  315.          bpl *-$03
  316.          bit $d011
  317.          bmi *-$03
  318.          lda #%00011011
  319.          sta $d011
  320.          lda #%00011000
  321.          sta $d016
  322.          lda #scrn/64.(charset0/1024).1
  323.          sta $d018
  324.          lda $dd00
  325.          and #%11111100
  326.          ora #vicbank
  327.          sta $dd00
  328.          lda #$ff
  329.          sta $d012
  330.          lda #$01
  331.          sta $d01a
  332.          lda #$7f
  333.          sta $dc0d
  334.          lda #<irq
  335.          sta $fffe
  336.          lda #>irq
  337.          sta $ffff
  338.          bit $dc0d
  339.          dec $d019
  340.          cli
  341.  
  342.  
  343.          ; reset angles and coordinates
  344.          ; koordinaten&winkel nullsetzen
  345.  
  346.          lda #$00
  347.          ldx #numpoint-$01
  348.          sta oldvisib,x
  349.          dex
  350.          bpl *-$03
  351.          sta alphalo
  352.          sta betalo
  353.          sta gammalo
  354.          sta alphahi
  355.          sta betahi
  356.          sta gammahi
  357.  
  358.  
  359.          ; main loop
  360.          ; hauptschleife
  361.  
  362. mainloop ; rotate unit vectors
  363.          ;  (absolutely unoptimized)
  364.          ; einheitsvektoren rotieren
  365.          ;  (absolut unoptimiert)
  366.  
  367.          sei
  368.          lda alphahi
  369.          sta alpha
  370.          lda gammahi
  371.          sta gamma
  372.          lda betahi
  373.          sta beta
  374.          cli
  375.  
  376.           ;   cos (beta) * cos (gamma)
  377.          clc
  378.          adc #$40          ; (cos)
  379.          sec
  380.          sbc gamma
  381.          sec
  382.          sbc #$40          ; (cos)
  383.          tax               ; beta-gamma
  384.          clc
  385.          lda beta
  386.          adc #$40          ; (cos)
  387.          clc
  388.          adc gamma
  389.          clc
  390.          adc #$40          ; (cos)
  391.          tay               ; beta+gamma
  392.          sec
  393.          lda sincoslo+$40,x
  394.          sbc sincoslo+$40,y
  395.          sta unitxxlo
  396.          lda sincoshi+$40,x;    cos(b-g)
  397.          sbc sincoshi+$40,y;  - cos(b+g)
  398.          sta unitxxhi
  399.  
  400.           ; - sin(a) * sin(b) * cos(g)
  401.           ; - cos(a) * sin(g)
  402.          clc
  403.          lda beta
  404.          adc gamma
  405.          clc
  406.          adc #$40     ; (cos)
  407.          sec
  408.          sbc alpha
  409.          sec
  410.          sbc #$80     ; (-)
  411.          tax          ; beta+gamma-alpha
  412.          clc
  413.          lda alpha
  414.          adc #$80     ; (-)
  415.          clc
  416.          adc gamma
  417.          clc
  418.          adc #$40     ; (cos)
  419.          sec
  420.          sbc beta
  421.          tay          ; alpha+gamma-beta
  422.          clc
  423.          lda sincoslo+$00,x
  424.          adc sincoslo+$00,y
  425.          sta sinbufl0
  426.          lda sincoshi+$00,x;  sin(b+g-a)
  427.          adc sincoshi+$00,y;+ sin(a+g-b)
  428.          cmp #$80
  429.          ror a
  430.          ror sinbufl0
  431.          sta sinbufh0
  432.          clc
  433.          lda alpha
  434.          adc #$80     ; (-)
  435.          clc
  436.          adc beta
  437.          sec
  438.          sbc gamma
  439.          sec
  440.          sbc #$40     ; (cos)
  441.          tax          ; alpha+beta-gamma
  442.          clc
  443.          lda alpha
  444.          adc #$80     ; (-)
  445.          clc
  446.          adc beta
  447.          clc
  448.          adc gamma
  449.          clc
  450.          adc #$40     ; (cos)
  451.          tay          ; alpha+beta+gamma
  452.          sec
  453.          lda sincoslo+$00,x
  454.          sbc sincoslo+$00,y
  455.          sta sinbufl1
  456.          lda sincoshi+$00,x;  sin(a+b-g)
  457.          sbc sincoshi+$00,y;- sin(a+b+g)
  458.          cmp #$80
  459.          ror a
  460.          tax
  461.          lda sinbufl1
  462.          ror a
  463.          clc
  464.          adc sinbufl0
  465.          sta sinbufl1
  466.          txa
  467.          adc sinbufh0; - sin(a) * sin(b)
  468.          sta sinbufh1;          * cos(g)
  469.  
  470.          clc
  471.          lda alpha
  472.          adc #$40+$80      ; (-cos)
  473.          sec
  474.          sbc gamma
  475.          tax               ; alpha-gamma
  476.          clc
  477.          lda alpha
  478.          adc #$40+$80      ; (-cos)
  479.          clc
  480.          adc gamma
  481.          tay               ; alpha+gamma
  482.          sec
  483.          lda sincoslo+$40,x
  484.          sbc sincoslo+$40,y
  485.          sta sinbufl0      ;    cos(a-g)
  486.          lda sincoshi+$40,x;  - cos(a+g)
  487.          sbc sincoshi+$40,y
  488.          sta sinbufh0  ; - cos(a)*sin(g)
  489.  
  490.          clc
  491.          lda sinbufl0
  492.          adc sinbufl1
  493.          sta unitxylo
  494.          lda sinbufh0
  495.          adc sinbufh1
  496.          sta unitxyhi
  497.  
  498.  
  499.           ;   cos(a) * sin(b) * cos(g)
  500.           ; - sin(a) * sin(g)
  501.          clc
  502.          lda beta
  503.          adc gamma
  504.          clc
  505.          adc #$40     ; (cos)
  506.          sec
  507.          sbc alpha
  508.          sec
  509.          sbc #$40     ; (cos)
  510.          tax          ; beta+gamma-alpha
  511.          clc
  512.          lda alpha
  513.          adc #$40     ; (cos)
  514.          clc
  515.          adc gamma
  516.          clc
  517.          adc #$40     ; (cos)
  518.          sec
  519.          sbc beta
  520.          tay          ; alpha+gamma-beta
  521.          clc
  522.          lda sincoslo+$00,x
  523.          adc sincoslo+$00,y
  524.          sta sinbufl0
  525.          lda sincoshi+$00,x;  sin(b+g-a)
  526.          adc sincoshi+$00,y;+ sin(a+g-b)
  527.          cmp #$80
  528.          ror a
  529.          ror sinbufl0
  530.          sta sinbufh0
  531.          clc
  532.          lda alpha
  533.          adc #$40     ; (cos)
  534.          clc
  535.          adc beta
  536.          sec
  537.          sbc gamma
  538.          sec
  539.          sbc #$40     ; (cos)
  540.          tax          ; alpha+beta-gamma
  541.          clc
  542.          lda alpha
  543.          adc #$40     ; (cos)
  544.          clc
  545.          adc beta
  546.          clc
  547.          adc gamma
  548.          clc
  549.          adc #$40     ; (cos)
  550.          tay          ; alpha+beta+gamma
  551.          sec
  552.          lda sincoslo+$00,x
  553.          sbc sincoslo+$00,y
  554.          sta sinbufl1
  555.          lda sincoshi+$00,x;  sin(a+b-g)
  556.          sbc sincoshi+$00,y;- sin(a+b+g)
  557.          cmp #$80
  558.          ror a
  559.          tax
  560.          lda sinbufl1
  561.          ror a
  562.          clc
  563.          adc sinbufl0
  564.          sta sinbufl1
  565.          txa
  566.          adc sinbufh0; cos(a) * sin(b)
  567.          sta sinbufh1;        * cos(g)
  568.  
  569.          clc
  570.          lda alpha
  571.          adc #$80          ; (-)
  572.          sec
  573.          sbc gamma
  574.          tax               ; alpha-gamma
  575.          clc
  576.          lda alpha
  577.          adc #$80          ; (-)
  578.          clc
  579.          adc gamma
  580.          tay               ; alpha+gamma
  581.          sec
  582.          lda sincoslo+$40,x
  583.          sbc sincoslo+$40,y
  584.          sta sinbufl0      ;    cos(a-g)
  585.          lda sincoshi+$40,x;  - cos(a+g)
  586.          sbc sincoshi+$40,y
  587.          sta sinbufh0  ; - sin(a)*sin(g)
  588.  
  589.          clc
  590.          lda sinbufl0
  591.          adc sinbufl1
  592.          sta unitxzlo
  593.          lda sinbufh0
  594.          adc sinbufh1
  595.          sta unitxzhi
  596.  
  597.  
  598.           ; - cos (beta) * sin (gamma)
  599.          clc
  600.          lda beta
  601.          adc #$40+$80      ; (-cos)
  602.          sec
  603.          sbc gamma
  604.          tax               ; beta-gamma
  605.          clc
  606.          lda beta
  607.          adc #$40+$80      ; (-cos)
  608.          clc
  609.          adc gamma
  610.          tay               ; beta+gamma
  611.          sec
  612.          lda sincoslo+$40,x
  613.          sbc sincoslo+$40,y
  614.          sta unityxlo
  615.          lda sincoshi+$40,x;    cos(b-g)
  616.          sbc sincoshi+$40,y;  - cos(b+g)
  617.          sta unityxhi
  618.  
  619.           ;   sin(a) * sin(b) * sin(g)
  620.           ; - cos(a) * cos(g)
  621.          clc
  622.          lda beta
  623.          adc gamma
  624.          sec
  625.          sbc alpha
  626.          tax          ; beta+gamma-alpha
  627.          clc
  628.          lda alpha
  629.          adc gamma
  630.          sec
  631.          sbc beta
  632.          tay          ; alpha+gamma-beta
  633.          clc
  634.          lda sincoslo+$00,x
  635.          adc sincoslo+$00,y
  636.          sta sinbufl0
  637.          lda sincoshi+$00,x;  sin(b+g-a)
  638.          adc sincoshi+$00,y;+ sin(a+g-b)
  639.          cmp #$80
  640.          ror a
  641.          ror sinbufl0
  642.          sta sinbufh0
  643.          clc
  644.          lda alpha
  645.          adc beta
  646.          sec
  647.          sbc gamma
  648.          tax          ; alpha+beta-gamma
  649.          clc
  650.          lda alpha
  651.          adc beta
  652.          clc
  653.          adc gamma
  654.          tay          ; alpha+beta+gamma
  655.          sec
  656.          lda sincoslo+$00,x
  657.          sbc sincoslo+$00,y
  658.          sta sinbufl1
  659.          lda sincoshi+$00,x;  sin(a+b-g)
  660.          sbc sincoshi+$00,y;- sin(a+b+g)
  661.          cmp #$80
  662.          ror a
  663.          tax
  664.          lda sinbufl1
  665.          ror a
  666.          clc
  667.          adc sinbufl0
  668.          sta sinbufl1
  669.          txa
  670.          adc sinbufh0; sin(a) * sin(b)
  671.          sta sinbufh1;        * sin(g)
  672.  
  673.          clc
  674.          lda alpha
  675.          adc #$40+$80      ; (-cos)
  676.          sec
  677.          sbc gamma
  678.          sec
  679.          sbc #$40          ; (cos)
  680.          tax               ; alpha-gamma
  681.          clc
  682.          lda alpha
  683.          adc #$40+$80      ; (-cos)
  684.          clc
  685.          adc gamma
  686.          clc
  687.          adc #$40          ; (cos)
  688.          tay               ; alpha+gamma
  689.          sec
  690.          lda sincoslo+$40,x
  691.          sbc sincoslo+$40,y
  692.          sta sinbufl0      ;    cos(a-g)
  693.          lda sincoshi+$40,x;  - cos(a+g)
  694.          sbc sincoshi+$40,y
  695.          sta sinbufh0  ; - cos(a)*cos(g)
  696.  
  697.          clc
  698.          lda sinbufl0
  699.          adc sinbufl1
  700.          sta unityylo
  701.          lda sinbufh0
  702.          adc sinbufh1
  703.          sta unityyhi
  704.  
  705.  
  706.           ; - cos(a) * sin(b) * sin(g)
  707.           ; - sin(a) * cos(g)
  708.          clc
  709.          lda beta
  710.          adc gamma
  711.          sec
  712.          sbc alpha
  713.          sec
  714.          sbc #$40+$80 ; (-cos)
  715.          tax          ; beta+gamma-alpha
  716.          clc
  717.          lda alpha
  718.          adc #$40+$80 ; (-cos)
  719.          clc
  720.          adc gamma
  721.          sec
  722.          sbc beta
  723.          tay          ; alpha+gamma-beta
  724.          clc
  725.          lda sincoslo+$00,x
  726.          adc sincoslo+$00,y
  727.          sta sinbufl0
  728.          lda sincoshi+$00,x;  sin(b+g-a)
  729.          adc sincoshi+$00,y;+ sin(a+g-b)
  730.          cmp #$80
  731.          ror a
  732.          ror sinbufl0
  733.          sta sinbufh0
  734.          clc
  735.          lda alpha
  736.          adc #$40+$80 ; (-cos)
  737.          clc
  738.          adc beta
  739.          sec
  740.          sbc gamma
  741.          tax          ; alpha+beta-gamma
  742.          clc
  743.          lda alpha
  744.          adc #$40+$80 ; (-cos)
  745.          clc
  746.          adc beta
  747.          clc
  748.          adc gamma
  749.          tay          ; alpha+beta+gamma
  750.          sec
  751.          lda sincoslo+$00,x
  752.          sbc sincoslo+$00,y
  753.          sta sinbufl1
  754.          lda sincoshi+$00,x;  sin(a+b-g)
  755.          sbc sincoshi+$00,y;- sin(a+b+g)
  756.          cmp #$80
  757.          ror a
  758.          tax
  759.          lda sinbufl1
  760.          lsr a
  761.          clc
  762.          adc sinbufl0
  763.          sta sinbufl1
  764.          txa
  765.          adc sinbufh0; - cos(a) * sin(b)
  766.          sta sinbufh1;          * sin(g)
  767.  
  768.          clc
  769.          lda alpha
  770.          adc #$80          ; (-)
  771.          sec
  772.          sbc gamma
  773.          sec
  774.          sbc #$40          ; (cos)
  775.          tax               ; alpha-gamma
  776.          clc
  777.          lda alpha
  778.          adc #$80          ; (-)
  779.          clc
  780.          adc gamma
  781.          clc
  782.          adc #$40          ; (cos)
  783.          tay               ; alpha+gamma
  784.          sec
  785.          lda sincoslo+$40,x
  786.          sbc sincoslo+$40,y
  787.          sta sinbufl0      ;    cos(a-g)
  788.          lda sincoshi+$40,x;  - cos(a+g)
  789.          sbc sincoshi+$40,y
  790.          sta sinbufh0  ; - sin(a)*cos(g)
  791.  
  792.          clc
  793.          lda sinbufl0
  794.          adc sinbufl1
  795.          sta unityzlo
  796.          lda sinbufh0
  797.          adc sinbufh1
  798.          sta unityzhi
  799.  
  800.  
  801.           ;   sin (beta)
  802.          ldx beta
  803.          lda sincoslo+$00,x
  804.          asl a
  805.          sta unitzxlo
  806.          lda sincoshi+$00,x
  807.          rol a
  808.          sta unitzxhi
  809.  
  810.           ;   sin (alpha) * cos (beta)
  811.          sec
  812.          lda alpha
  813.          sbc beta
  814.          sec
  815.          sbc #$40          ; (cos)
  816.          tax               ; alpha-beta
  817.          clc
  818.          lda alpha
  819.          adc beta
  820.          clc
  821.          adc #$40          ; (cos)
  822.          tay               ; alpha+beta
  823.          sec
  824.          lda sincoslo+$40,x
  825.          sbc sincoslo+$40,y
  826.          sta unitzylo
  827.          lda sincoshi+$40,x;    cos(a-b)
  828.          sbc sincoshi+$40,y;  - cos(a+b)
  829.          sta unitzyhi
  830.  
  831.           ; - cos (alpha) * cos (beta)
  832.          clc
  833.          lda alpha
  834.          adc #$80+$40      ; (-cos)
  835.          sec
  836.          sbc beta
  837.          sec
  838.          sbc #$40          ; (cos)
  839.          tax               ; alpha-beta
  840.          clc
  841.          lda alpha
  842.          adc #$80+$40      ; (-cos)
  843.          clc
  844.          adc beta
  845.          clc
  846.          adc #$40          ; (cos)
  847.          tay               ; alpha+beta
  848.          sec
  849.          lda sincoslo+$40,x
  850.          sbc sincoslo+$40,y
  851.          sta unitzzlo
  852.          lda sincoshi+$40,x;    cos(a-b)
  853.          sbc sincoshi+$40,y;  - cos(a+b)
  854.          sta unitzzhi
  855.  
  856.  
  857.          ; calculate new coordinates,
  858.          ;  pretty unoptimized too
  859.          ; neue koordinaten berechnen,
  860.          ;  auch ziemlich unoptimiert
  861.  
  862.           ; p(-1;+1;+1)
  863.          clc
  864.          lda unitxylo
  865.          adc unitxzlo
  866.          tax
  867.          lda unitxyhi
  868.          adc unitxzhi
  869.          cpx unitxxlo
  870.          sbc unitxxhi
  871.          sta x2dcords+$00
  872.  
  873.          clc
  874.          lda unityylo
  875.          adc unityzlo
  876.          tax
  877.          lda unityyhi
  878.          adc unityzhi
  879.          cpx unityxlo
  880.          sbc unityxhi
  881.          sta y2dcords+$00
  882.  
  883.          clc
  884.          lda unitzylo
  885.          adc unitzzlo
  886.          tax
  887.          lda unitzyhi
  888.          adc unitzzhi
  889.          cpx unitzxlo
  890.          sbc unitzxhi
  891.          sta z2dcords+$00
  892.  
  893.           ; p(+1;+1;+1)
  894.          clc
  895.          lda unitxxlo
  896.          adc unitxylo
  897.          tax
  898.          lda unitxxhi
  899.          adc unitxyhi
  900.          tay
  901.          clc
  902.          txa
  903.          adc unitxzlo
  904.          tya
  905.          adc unitxzhi
  906.          sta x2dcords+$01
  907.  
  908.          clc
  909.          lda unityxlo
  910.          adc unityylo
  911.          tax
  912.          lda unityxhi
  913.          adc unityyhi
  914.          tay
  915.          clc
  916.          txa
  917.          adc unityzlo
  918.          tya
  919.          adc unityzhi
  920.          sta y2dcords+$01
  921.  
  922.          clc
  923.          lda unitzxlo
  924.          adc unitzylo
  925.          tax
  926.          lda unitzxhi
  927.          adc unitzyhi
  928.          tay
  929.          clc
  930.          txa
  931.          adc unitzzlo
  932.          tya
  933.          adc unitzzhi
  934.          sta z2dcords+$01
  935.  
  936.           ; p(-1;+1;-1)
  937.          sec
  938.          lda unitxylo
  939.          sbc unitxxlo
  940.          tax
  941.          lda unitxyhi
  942.          sbc unitxxhi
  943.          cpx unitxzlo
  944.          sbc unitxzhi
  945.          sta x2dcords+$02
  946.  
  947.          sec
  948.          lda unityylo
  949.          sbc unityxlo
  950.          tax
  951.          lda unityyhi
  952.          sbc unityxhi
  953.          cpx unityzlo
  954.          sbc unityzhi
  955.          sta y2dcords+$02
  956.  
  957.          sec
  958.          lda unitzylo
  959.          sbc unitzxlo
  960.          tax
  961.          lda unitzyhi
  962.          sbc unitzxhi
  963.          cpx unitzzlo
  964.          sbc unitzzhi
  965.          sta z2dcords+$02
  966.  
  967.           ; p(+1;+1;-1)
  968.          clc
  969.          lda unitxxlo
  970.          adc unitxylo
  971.          tax
  972.          lda unitxxhi
  973.          adc unitxyhi
  974.          cpx unitxzlo
  975.          sbc unitxzhi
  976.          sta x2dcords+$03
  977.  
  978.          clc
  979.          lda unityxlo
  980.          adc unityylo
  981.          tax
  982.          lda unityxhi
  983.          adc unityyhi
  984.          cpx unityzlo
  985.          sbc unityzhi
  986.          sta y2dcords+$03
  987.  
  988.          clc
  989.          lda unitzxlo
  990.          adc unitzylo
  991.          tax
  992.          lda unitzxhi
  993.          adc unitzyhi
  994.          cpx unitzzlo
  995.          sbc unitzzhi
  996.          sta z2dcords+$03
  997.  
  998.           ; p(-1;-1;+1)
  999.          sec
  1000.          lda unitxzlo
  1001.          sbc unitxxlo
  1002.          tax
  1003.          lda unitxzhi
  1004.          sbc unitxxhi
  1005.          cpx unitxylo
  1006.          sbc unitxyhi
  1007.          sta x2dcords+$04
  1008.  
  1009.          sec
  1010.          lda unityzlo
  1011.          sbc unityxlo
  1012.          tax
  1013.          lda unityzhi
  1014.          sbc unityxhi
  1015.          cpx unityylo
  1016.          sbc unityyhi
  1017.          sta y2dcords+$04
  1018.  
  1019.          sec
  1020.          lda unitzzlo
  1021.          sbc unitzxlo
  1022.          tax
  1023.          lda unitzzhi
  1024.          sbc unitzxhi
  1025.          cpx unitzylo
  1026.          sbc unitzyhi
  1027.          sta z2dcords+$04
  1028.  
  1029.           ; p(+1;-1;+1)
  1030.          clc
  1031.          lda unitxxlo
  1032.          adc unitxzlo
  1033.          tax
  1034.          lda unitxxhi
  1035.          adc unitxzhi
  1036.          cpx unitxylo
  1037.          sbc unitxyhi
  1038.          sta x2dcords+$05
  1039.  
  1040.          clc
  1041.          lda unityxlo
  1042.          adc unityzlo
  1043.          tax
  1044.          lda unityxhi
  1045.          adc unityzhi
  1046.          cpx unityylo
  1047.          sbc unityyhi
  1048.          sta y2dcords+$05
  1049.  
  1050.          clc
  1051.          lda unitxzlo
  1052.          adc unitzzlo
  1053.          tax
  1054.          lda unitzxhi
  1055.          adc unitzzhi
  1056.          cpx unitzylo
  1057.          sbc unitzyhi
  1058.          sta z2dcords+$05
  1059.  
  1060.           ; p(-1;-1;-1)
  1061.          sec
  1062.          lda #$00
  1063.          sbc unitxxlo
  1064.          tax
  1065.          lda #$00
  1066.          sbc unitxxhi
  1067.          tay
  1068.          sec
  1069.          txa
  1070.          sbc unitxylo
  1071.          tax
  1072.          tya
  1073.          sbc unitxyhi
  1074.          cpx unitxzlo
  1075.          sbc unitxzhi
  1076.          sta x2dcords+$06
  1077.  
  1078.          sec
  1079.          lda #$00
  1080.          sbc unityxlo
  1081.          tax
  1082.          lda #$00
  1083.          sbc unityxhi
  1084.          tay
  1085.          sec
  1086.          txa
  1087.          sbc unityylo
  1088.          tax
  1089.          tya
  1090.          sbc unityyhi
  1091.          cpx unityzlo
  1092.          sbc unityzhi
  1093.          sta y2dcords+$06
  1094.  
  1095.          sec
  1096.          lda #$00
  1097.          sbc unitzxlo
  1098.          tax
  1099.          lda #$00
  1100.          sbc unitzxhi
  1101.          tay
  1102.          sec
  1103.          txa
  1104.          sbc unitzylo
  1105.          tax
  1106.          tya
  1107.          sbc unitzyhi
  1108.          cpx unitzzlo
  1109.          sbc unitzzhi
  1110.          sta z2dcords+$06
  1111.  
  1112.           ; p(+1;-1;-1)
  1113.          sec
  1114.          lda unitxxlo
  1115.          sbc unitxylo
  1116.          tax
  1117.          lda unitxxhi
  1118.          sbc unitxyhi
  1119.          cpx unitxzlo
  1120.          sbc unitxzhi
  1121.          sta x2dcords+$07
  1122.  
  1123.          sec
  1124.          lda unityxlo
  1125.          sbc unityylo
  1126.          tax
  1127.          lda unityxhi
  1128.          sbc unityyhi
  1129.          cpx unityzlo
  1130.          sbc unityzhi
  1131.          sta y2dcords+$07
  1132.  
  1133.          sec
  1134.          lda unitzxlo
  1135.          sbc unitzylo
  1136.          tax
  1137.          lda unitzxhi
  1138.          sbc unitzyhi
  1139.          cpx unitzzlo
  1140.          sbc unitzzhi
  1141.          sta z2dcords+$07
  1142.  
  1143.  
  1144.          ; convert coordinates to 2-d
  1145.          ; koordinaten nach 2d wandeln
  1146.  
  1147.          ldx #numpoint-$01
  1148. convto2d ldy y2dcords,x
  1149.          lda persptab,y
  1150.          ldy x2dcords,x
  1151.          jsr perspmul
  1152.          clc
  1153.          adc #$40
  1154.          lsr a         ; multicolour
  1155.          sta x2dcords,x
  1156.          ldy y2dcords,x
  1157.          lda persptab,y
  1158.          ldy z2dcords,x
  1159.          jsr perspmul
  1160.          clc
  1161.          adc #$40
  1162.          sta y2dcords,x
  1163.          dex
  1164.          bpl convto2d
  1165.  
  1166.  
  1167.          ; perform backface culling
  1168.          ; backface culling vollfuehren
  1169.  
  1170.          lda #%00000000
  1171.          ldx #linepnt1-linepnt0-$01
  1172.          sta visiblin,x
  1173.          dex
  1174.          bpl *-$03
  1175.  
  1176.          ldx #facepnt1-facepnt0-$01
  1177. backcull sec
  1178.          ldy facepnt0,x; z1 - z2
  1179.          lda y2dcords,y
  1180.          ldy facepnt1,x
  1181.          sbc y2dcords,y
  1182.          pha
  1183.          sec
  1184.          ldy facepnt2,x; x3 - x2
  1185.          lda x2dcords,y
  1186.          ldy facepnt1,x
  1187.          sbc x2dcords,y
  1188.          tay
  1189.          pla
  1190.          jsr cullmul
  1191.          sta cullbuff+$00
  1192.          sty cullbuff+$01
  1193.  
  1194.          sec
  1195.          ldy facepnt0,x; x1 - x2
  1196.          lda x2dcords,y
  1197.          ldy facepnt1,x
  1198.          sbc x2dcords,y
  1199.          pha
  1200.          sec
  1201.          ldy facepnt2,x; z3 - z2
  1202.          lda y2dcords,y
  1203.          ldy facepnt1,x
  1204.          sbc y2dcords,y
  1205.          tay
  1206.          pla
  1207.          jsr cullmul
  1208.          cpy cullbuff+$01; compare
  1209.          sbc cullbuff+$00;  factors
  1210.          bpl notvisib
  1211.  
  1212.          lda facecols,x
  1213.          ldy facelin0,x
  1214.          eor visiblin,y
  1215.          sta visiblin,y
  1216.          lda facecols,x
  1217.          ldy facelin1,x
  1218.          eor visiblin,y
  1219.          sta visiblin,y
  1220.          lda facecols,x
  1221.          ldy facelin2,x
  1222.          eor visiblin,y
  1223.          sta visiblin,y
  1224.          lda facecols,x
  1225.          ldy facelin3,x
  1226.          eor visiblin,y
  1227.          sta visiblin,y
  1228. notvisib dex
  1229.          bpl backcull
  1230.  
  1231.  
  1232.          ; erase vector object
  1233.          ; vektorobjekt loeschen
  1234.  
  1235.          ldy #linepnt1-linepnt0-$01
  1236. erasloop lda oldvisib,y
  1237.          beq donteras
  1238.          sty pointers+$02
  1239.          ldx linepnt0,y
  1240.          lda oldxcrds,x
  1241.          sta begx
  1242.          lda oldycrds,x
  1243.          sta begy
  1244.          ldx linepnt1,y
  1245.          lda oldxcrds,x
  1246.          ldy oldycrds,x
  1247.          tax
  1248.          jsr erasline
  1249.          ldy pointers+$02
  1250. donteras dey
  1251.          bpl erasloop
  1252.  
  1253.  
  1254.          ; draw vector object
  1255.          ; vektorobjekt zeichnen
  1256.  
  1257.          ldy #linepnt1-linepnt0-$01
  1258. drawloop lda visiblin,y
  1259.          beq dontdraw
  1260.          pha
  1261.          sty pointers+$02
  1262.          ldx linepnt0,y
  1263.          lda x2dcords,x
  1264.          sta begx
  1265.          lda y2dcords,x
  1266.          sta begy
  1267.          ldx linepnt1,y
  1268.          lda x2dcords,x
  1269.          ldy y2dcords,x
  1270.          tax
  1271.          pla
  1272.          jsr drawline
  1273.          ldy pointers+$02
  1274. dontdraw dey
  1275.          bpl drawloop
  1276.  
  1277.          ldx #linepnt1-linepnt0-$01
  1278. putoldvi lda visiblin,x
  1279.          sta oldvisib,x
  1280.          dex
  1281.          bpl putoldvi
  1282.          ldx #numpoint-$01
  1283. putoldco lda x2dcords,x
  1284.          sta oldxcrds,x
  1285.          lda y2dcords,x
  1286.          sta oldycrds,x
  1287.          dex
  1288.          bpl putoldco
  1289.  
  1290.  
  1291.          ; fill the object
  1292.          ; das objekt fuellen
  1293.  
  1294.          ldx currscrn
  1295.          lda scrntabl+$01,x
  1296.          cmp $d018
  1297.          beq *-$03
  1298.          lda #$30
  1299.          sta $01
  1300.          lda #%11111111
  1301.          dex
  1302.          bpl *+$08
  1303.          jsr filspid2
  1304.          jmp postfill
  1305.          dex
  1306.          bpl *+$08
  1307.          jsr filspid0
  1308.          jmp postfill
  1309.          jsr filspid1
  1310. postfill lda #$35
  1311.          sta $01
  1312.  
  1313.  
  1314.          ; switch visible screen
  1315.          ; sichtbaren bildschirm
  1316.          ;  umschalten
  1317.  
  1318.          ldx currscrn
  1319.          inx
  1320.          cpx #$03
  1321.          bne *+$04
  1322.          ldx #$00
  1323.          stx currscrn
  1324.  
  1325.  
  1326.          jmp mainloop
  1327.  
  1328.  
  1329.          ; irq routine
  1330.          ; irq-routine
  1331.  
  1332. irq      pha
  1333.          txa
  1334.          pha
  1335.          lda $01
  1336.          pha
  1337.          lda #$35
  1338.          sta $01
  1339.          ldx currscrn
  1340.          lda scrntabl,x
  1341.          sta $d018
  1342.  
  1343.  
  1344.          ; advance angles
  1345.          ; winkel erhoehen
  1346.  
  1347.          clc
  1348.          lda #<alphaadd
  1349.          adc alphalo
  1350.          sta alphalo
  1351.          lda #>alphaadd
  1352.          adc alphahi
  1353.          sta alphahi
  1354.          clc
  1355.          lda #<betaadd
  1356.          adc betalo
  1357.          sta betalo
  1358.          lda #>betaadd
  1359.          adc betahi
  1360.          sta betahi
  1361.          clc
  1362.          lda #<gammaadd
  1363.          adc gammalo
  1364.          sta gammalo
  1365.          lda #>gammaadd
  1366.          adc gammahi
  1367.          sta gammahi
  1368.  
  1369.          dec $d019
  1370.          pla
  1371.          sta $01
  1372.          pla
  1373.          tax
  1374.          pla
  1375.          rti
  1376.  
  1377.  
  1378.          ; perform multiply, fully
  1379.          ;  optimized
  1380.          ; multiplikation vollfuehren,
  1381.          ;  vollkommen optimiert
  1382.  
  1383.          pla
  1384. zeromul  lda #$00
  1385.          tay
  1386.          rts
  1387.  
  1388. cullmul  beq zeromul+$02
  1389.          pha
  1390.          tya
  1391.          beq zeromul-$01
  1392.          sec
  1393.          ldy #$00
  1394.          sbc #$01
  1395.          bpl *+$07
  1396.          eor #$ff
  1397.          sbc #$01
  1398.          iny
  1399.          sta multizpg+$01
  1400.          pla
  1401.          bne mulmain
  1402.  
  1403. perspmul sec
  1404.          sbc #$01
  1405.          bcc zeromul+$00
  1406.          sta multizpg+$01
  1407.          tya
  1408.          beq zeromul+$03
  1409.          ldy #$00
  1410.  
  1411. mulmain  cmp #$80
  1412.          bcc *+$07
  1413.          dey
  1414.          sbc #$01
  1415.          eor #$ff
  1416.          lsr a
  1417.          sta multizpg+$00
  1418.          lda #$00
  1419.          bcc *+$04
  1420.          adc multizpg+$01
  1421.          ror a
  1422.          ror multizpg+$00
  1423.          bcc *+$04
  1424.          adc multizpg+$01
  1425.          ror a
  1426.          ror multizpg+$00
  1427.          bcc *+$04
  1428.          adc multizpg+$01
  1429.          ror a
  1430.          ror multizpg+$00
  1431.          bcc *+$04
  1432.          adc multizpg+$01
  1433.          ror a
  1434.          ror multizpg+$00
  1435.          bcc *+$04
  1436.          adc multizpg+$01
  1437.          ror a
  1438.          ror multizpg+$00
  1439.          bcc *+$04
  1440.          adc multizpg+$01
  1441.          ror a
  1442.          ror multizpg+$00
  1443.          bcc *+$04
  1444.          adc multizpg+$01
  1445.          ror a
  1446.          ror multizpg+$00
  1447.          bcc *+$04
  1448.          adc multizpg+$01
  1449.          ror a
  1450.          ror multizpg+$00
  1451.          cpy #$00
  1452.          bne *+$05
  1453.          ldy multizpg+$00
  1454.          rts
  1455.          sta multizpg+$01
  1456.          lda #$00
  1457.          sbc multizpg+$00
  1458.          tay
  1459.          lda #$00
  1460.          sbc multizpg+$01
  1461.          rts
  1462.  
  1463.  
  1464.          ; draw a line
  1465.          ; eine linie zeichnen
  1466.  
  1467. drawline sta pointers+$00
  1468.          stx endx
  1469.          sty endy
  1470.          cpx begx
  1471.          beq drawline-$01
  1472.          bcs *+$0e; swap line end points
  1473.          lda begx ; if the line runs
  1474.          sta endx ; from right to left
  1475.          lda begy ; linienendpunkte ver-
  1476.          sta endy ; tauschen, wenn die
  1477.          stx begx ; linie von rechts
  1478.          sty begy ; nach links verlaeuft
  1479.          sec
  1480.          lda endx
  1481.          sbc begx
  1482.          sta deltax
  1483.          lda begy
  1484.          sbc endy
  1485.          bcc lintype2
  1486.          sta deltay
  1487.          cmp deltax
  1488.          bcs lintype3
  1489.  
  1490.  
  1491.           ; line angles from -45 to 0
  1492.           ;  degrees
  1493.           ; linienwinkel von -45 bis 0
  1494.           ;  grad
  1495.  
  1496. lintype1 lda #<spdt1ofs
  1497.          pha
  1498.          lda #>spdt1ofs
  1499.          bcc putline
  1500.  
  1501. lintype2 eor #$ff
  1502.          adc #$01
  1503.          sta deltay
  1504.          cmp deltax
  1505.          bcs lintype3
  1506.  
  1507.  
  1508.           ; line angles from 0 to 45
  1509.           ;  degrees
  1510.           ; linienwinkel von 0 bis 45
  1511.           ;  grad
  1512.  
  1513.          lda #<spdt2ofs
  1514.          pha
  1515.          lda #>spdt2ofs
  1516.          bcc putline
  1517.  
  1518.  
  1519.           ; line angles from +/-45 to
  1520.           ;  +/-90 degrees
  1521.           ; linienwinkel von +/-45 bis
  1522.           ;  +/-90 grad
  1523.  
  1524. lintype3 lda #$00
  1525.          pha
  1526.  
  1527. putline  pha
  1528.          ldx deltax
  1529.          ldy deltay
  1530.          bcc *+$06
  1531.          ldx deltay
  1532.          ldy deltax
  1533.  
  1534.          sec             ;perform divi-
  1535.          lda log2tabl,x  ; sion to calc-
  1536.          sbc log2tabl,y  ; ulate the
  1537.          sta clcslope+$01; line slope
  1538.          lda log2tbh0,x  ;division voll-
  1539.          sbc log2tbh1,y  ; fuehren, um
  1540.          sta clcslope+$02; den linien-
  1541. clcslope lda !$00        ; anstieg zu
  1542.          sta linslopl    ; berechnen
  1543.  
  1544.          clc
  1545.          pla
  1546.          tay
  1547.          pla
  1548.          ldx pointers+$00
  1549.          adc spidadrl-$01,x
  1550.          sta pointers+$00
  1551.          tya
  1552.          adc spidadrh-$01,x
  1553.          sta pointers+$01
  1554.          lda deltay
  1555.          cmp deltax
  1556.          ldx begx
  1557.          bcs bigslope
  1558.  
  1559.          lda pointers+$00  ; determine
  1560.          adc spdxofsl+$40,x;  jump-in
  1561.          sta speedjsr+$01  ;  address
  1562.          lda pointers+$01  ; einsprung-
  1563.          adc spdxofsh+$40,x;  adresse
  1564.          sta speedjsr+$02  ;  bestimmen
  1565.          ldx endx
  1566.          dex
  1567.          lda spdxofsl+$40,x
  1568.          adc pointers+$00
  1569.          sta pointers+$00
  1570.          lda spdxofsh+$40,x
  1571.          jmp linedraw
  1572.  
  1573. bigslope ldy linslopl      ; determine
  1574.          lda begy          ;  perpendi-
  1575.          cmp endy          ;  cular
  1576.          lda reciptbl,y    ;  slope
  1577.          bcc *+$04
  1578.          eor #$ff          ; senkrechten
  1579.          sta linslopl      ;  anstieg
  1580.          lda reciptbh,y    ;  bestimmen
  1581.          bcc *+$04
  1582.          eor #$ff
  1583.          sta linsloph
  1584.  
  1585.          clc               ; determine
  1586.          lda pointers+$00  ;  jump-in
  1587.          adc spdxofsl+$00,x;  address
  1588.          sta speedjsr+$01
  1589.          lda pointers+$01  ; einsprung-
  1590.          adc spdxofsh+$00,x;  adresse
  1591.          sta speedjsr+$02  ;  bestimmen
  1592.          ldx endx
  1593.          dex
  1594.          lda spdxofsl+$00,x; determine
  1595.          adc pointers+$00  ;  return
  1596.          sta pointers+$00  ;  address
  1597.          lda spdxofsh+$00,x; rueckkehr-
  1598.  
  1599. linedraw adc pointers+$01;  adresse
  1600.          sta pointers+$01;  bestimmen
  1601.  
  1602.          ldy #$08
  1603.          lda #$60; op-code for rts
  1604.          sta (pointers+$00),y; op-code
  1605.                              ;  fuer rts
  1606.          ldx #$80
  1607.          ldy begy
  1608. speedjsr jsr !$00; draw the line
  1609.                  ; die linie zeichnen
  1610.  
  1611.          ldy #$08
  1612.          lda #$8a; op-code for txa
  1613.          sta (pointers+$00),y; op-code
  1614.                              ;  fuer txa
  1615.          rts
  1616.  
  1617.  
  1618.          ; erase a line
  1619.          ; eine linie loeschen
  1620.  
  1621. erasline sta pointers+$00
  1622.          stx endx
  1623.          sty endy
  1624.          cpx begx
  1625.          beq erasline-$01
  1626.          bcs *+$0e; swap line end points
  1627.          lda begx ; if the line runs
  1628.          sta endx ; from right to left
  1629.          lda begy ; linienendpunkte ver-
  1630.          sta endy ; tauschen, wenn die
  1631.          stx begx ; linie von rechts
  1632.          sty begy ; nach links verlaeuft
  1633.          sec
  1634.          lda endx
  1635.          sbc begx
  1636.          sta deltax
  1637.          lda begy
  1638.          sbc endy
  1639.          bcc erstype2
  1640.          sta deltay
  1641.          cmp deltax
  1642.          bcs erstype3
  1643.  
  1644.  
  1645.           ; line angles from -45 to 0
  1646.           ;  degrees
  1647.           ; linienwinkel von -45 bis 0
  1648.           ;  grad
  1649.  
  1650. erstype1 ldx #<eraspeed+$0340
  1651.          ldy #>eraspeed+$0340
  1652.          bcc linerase
  1653.  
  1654. erstype2 eor #$ff
  1655.          adc #$01
  1656.          sta deltay
  1657.          cmp deltax
  1658.          bcs erstype3
  1659.  
  1660.  
  1661.           ; line angles from 0 to 45
  1662.           ;  degrees
  1663.           ; linienwinkel von 0 bis 45
  1664.           ;  grad
  1665.  
  1666.          ldx #<eraspeed+$0640
  1667.          ldy #>eraspeed+$0640
  1668.          bcc linerase
  1669.  
  1670.  
  1671.           ; line angles from +/-45 to
  1672.           ;  +/-90 degrees
  1673.           ; linienwinkel von +/-45 bis
  1674.           ;  +/-90 grad
  1675.  
  1676. erstype3 ldx #<eraspeed+$00
  1677.          ldy #>eraspeed+$00
  1678.  
  1679. linerase stx pointers+$00
  1680.          sty pointers+$01
  1681.          ldx deltax
  1682.          ldy deltay
  1683.          bcc *+$06
  1684.          ldx deltay
  1685.          ldy deltax
  1686.          sec             ;perform divi-
  1687.          lda log2tabl,x  ; sion to calc-
  1688.          sbc log2tabl,y  ; ulate the
  1689.          sta eraslope+$01; line slope
  1690.          lda log2tbh0,x  ;division voll-
  1691.          sbc log2tbh1,y  ; fuehren, um
  1692.          sta eraslope+$02; den linien-
  1693. eraslope lda !$00        ; anstieg zu
  1694.          sta linslopl    ; berechnen
  1695.  
  1696.          lda deltay
  1697.          cmp deltax
  1698.          ldx begx
  1699.          bcs ersbigsl
  1700.  
  1701.          lda pointers+$00  ; determine
  1702.          adc spdxofsl+$c0,x;  jump-in
  1703.          sta erasejsr+$01  ;  address
  1704.          lda pointers+$01  ; einsprung-
  1705.          adc spdxofsh+$c0,x;  adresse
  1706.          sta erasejsr+$02  ;  bestimmen
  1707.          ldx endx
  1708.          dex
  1709.          lda spdxofsl+$c0,x
  1710.          adc pointers+$00
  1711.          sta pointers+$00
  1712.          lda spdxofsh+$c0,x
  1713.          jmp lineeras
  1714.  
  1715. ersbigsl ldy linslopl      ; determine
  1716.          lda begy          ;  perpendi-
  1717.          cmp endy          ;  cular
  1718.          lda reciptbl,y    ;  slope
  1719.          bcc *+$04
  1720.          eor #$ff          ; senkrechten
  1721.          sta linslopl      ;  anstieg
  1722.          lda reciptbh,y    ;  bestimmen
  1723.          bcc *+$04
  1724.          eor #$ff
  1725.          sta linsloph
  1726.  
  1727.          clc               ; determine
  1728.          lda pointers+$00  ;  jump-in
  1729.          adc spdxofsl+$80,x;  address
  1730.          sta erasejsr+$01
  1731.          lda pointers+$01  ; einsprung-
  1732.          adc spdxofsh+$80,x;  adresse
  1733.          sta erasejsr+$02  ;  bestimmen
  1734.          ldx endx
  1735.          dex
  1736.          lda spdxofsl+$80,x; determine
  1737.          adc pointers+$00  ;  return
  1738.          sta pointers+$00  ;  address
  1739.          lda spdxofsh+$80,x; rueckkehr-
  1740.  
  1741. lineeras adc pointers+$01;  adresse
  1742.          sta pointers+$01;  bestimmen
  1743.  
  1744.          ldy #$05
  1745.          lda #$60; op-code for rts
  1746.          sta (pointers+$00),y; op-code
  1747.                              ;  fuer rts
  1748.          ldx #$80
  1749.          ldy begy
  1750. erasejsr jsr !$00; draw the line
  1751.                  ; die linie zeichnen
  1752.  
  1753.          ldy #$05
  1754.          lda #$8a; op-code for txa
  1755.          sta (pointers+$00),y; op-code
  1756.                              ;  fuer txa
  1757.          rts
  1758.  
  1759.  
  1760. mkxofstb clc
  1761.          sta pointers+$00
  1762.          txa
  1763.          adc #$40
  1764.          sta pointers+$01
  1765.          lda #$00
  1766.          tay
  1767. mkxofslp sta spdxofsl+$00,x
  1768.          pha
  1769.          tya
  1770.          sta spdxofsh+$00,x
  1771.          pla
  1772.          clc
  1773.          adc pointers+$00
  1774.          bcc *+$03
  1775.          iny
  1776.          inx
  1777.          cpx pointers+$01
  1778.          bne mkxofslp
  1779.          rts
  1780.  
  1781.  
  1782.          ; subroutine to build
  1783.          ;  the line speedcode
  1784.          ; unterroutine zum generieren
  1785.          ;  des linienspeedcodes
  1786.  
  1787. maklinsp clc
  1788.          sta spidraw0+$01
  1789.          sta spidraw1+$01
  1790.          stx pointers+$02
  1791.          sty pointers+$03
  1792.          lda #>fillbuff
  1793.          sta pointers+$04
  1794.  
  1795.          lda pointers+$02
  1796.          sta pointers+$00
  1797.          lda pointers+$03
  1798.          sta pointers+$01
  1799.          lda pointers+$04
  1800.          sta spidraw0+$04
  1801.          sta spidraw0+$07
  1802.          ldx #$40; 64 pixels width
  1803.                  ; 64 pixel breite
  1804. mkspt0lp ldy #spidraw1-spidraw0-$01
  1805.          lda spidraw0,y
  1806.          sta (pointers+$00),y
  1807.          dey
  1808.          bpl mkspt0lp+$02
  1809.          lda #spidraw1-spidraw0
  1810.          ldy #spidraw0-spidraw0
  1811.          jsr nextline
  1812.          bne mkspt0lp+$00
  1813.  
  1814.          lda #$88; op-code for dey
  1815.                  ; op-code fuer dey
  1816.          ldx #<spdt1ofs
  1817.          ldy #>spdt1ofs
  1818.          jsr mkspt1sb
  1819.  
  1820.          lda #$c8; op-code for iny
  1821.                  ; op-code fuer iny
  1822.          ldx #<spdt2ofs
  1823.          ldy #>spdt2ofs
  1824.  
  1825. mkspt1sb clc
  1826.          sta sprw1dir
  1827.          txa
  1828.          adc pointers+$02
  1829.          sta pointers+$00
  1830.          tya
  1831.          adc pointers+$03
  1832.          sta pointers+$01
  1833.          lda pointers+$04
  1834.          sta spidraw1+$04
  1835.          sta spidraw1+$07
  1836.          ldx #$40; 64 pixels width
  1837.                  ; 64 pixel breite
  1838. mkspt1lp ldy #spidrawe-spidraw1-$01
  1839.          lda spidraw1,y
  1840.          sta (pointers+$00),y
  1841.          dey
  1842.          bpl mkspt1lp+$02
  1843.          lda #spidrawe-spidraw1
  1844.          ldy #spidraw1-spidraw0
  1845.          jsr nextline
  1846.          bne mkspt1lp+$00
  1847.          rts
  1848.  
  1849. nextline clc
  1850.          adc pointers+$00
  1851.          sta pointers+$00
  1852.          bcc *+$04
  1853.          inc pointers+$01
  1854.          lda spidraw0+$01,y
  1855.          pha
  1856.          lsr a
  1857.          pla
  1858.          ror a
  1859.          pha
  1860.          lsr a
  1861.          pla
  1862.          ror a
  1863.          sta spidraw0+$01,y
  1864.          cmp #%01000000
  1865.          bcc nxtspret
  1866.  
  1867.          lda #$7f; 1 char column is 128
  1868.                  ;  (16x8) bytes
  1869.                  ; 1 zeichenspalte sind
  1870.                  ;  128 (16*8) bytes
  1871.          adc spidraw0+$03,y
  1872.          sta spidraw0+$03,y
  1873.          sta spidraw0+$06,y
  1874.          lda #$00
  1875.          adc spidraw0+$04,y
  1876.          sta spidraw0+$04,y
  1877.          sta spidraw0+$07,y
  1878. nxtspret dex
  1879.          rts
  1880.  
  1881. mkers1sb clc
  1882.          sta ersrwdir
  1883.          stx pointers+$00
  1884.          sty pointers+$01
  1885.          lda pointers+$04
  1886.          sta erasraw1+$04
  1887.          ldx #$40; 64 pixels width
  1888.                  ; 64 pixel breite
  1889. mkers1lp ldy #erasrawe-erasraw1-$01
  1890.          lda erasraw1,y
  1891.          sta (pointers+$00),y
  1892.          dey
  1893.          bpl mkers1lp+$02
  1894.          lda #erasrawe-erasraw1
  1895.          ldy #erasraw1-erasraw0
  1896.          jsr nexteras
  1897.          bne mkers1lp+$00
  1898.          rts
  1899.  
  1900. nexteras clc
  1901.          adc pointers+$00
  1902.          sta pointers+$00
  1903.          bcc *+$04
  1904.          inc pointers+$01
  1905.          dec pointers+$05
  1906.          bne nxtersrt
  1907.          clc
  1908.          lda #$80; 1 char column is 128
  1909.                  ;  (16x8) bytes
  1910.                  ; 1 zeichenspalte sind
  1911.                  ;  128 (16*8) bytes
  1912.          adc erasraw0+$03,y
  1913.          sta erasraw0+$03,y
  1914.          lda #$00
  1915.          adc erasraw0+$04,y
  1916.          sta erasraw0+$04,y
  1917.          lda #$04
  1918.          sta pointers+$05
  1919. nxtersrt dex
  1920.          rts
  1921.  
  1922.  
  1923.          ; subroutine to build
  1924.          ;  the fill speedcode
  1925.          ; unterroutine zum generieren
  1926.          ;  des fuellspeedcodes
  1927.  
  1928. mkfilspd sta pointers+$04
  1929.          stx pointers+$00
  1930.          sty pointers+$01
  1931.          lda #<fillbuff
  1932.          sta pointers+$02
  1933.          lda #>fillbuff
  1934.          sta pointers+$03
  1935.          ldx #$00
  1936. mkfilup0 sec
  1937.          lda spidybeg,x
  1938.          ora pointers+$02
  1939.          sta pointers+$02
  1940.          ora #$7f
  1941.          sbc spidybeg,x
  1942.          sta pointers+$05
  1943. mkfilup1 ldy #$00
  1944.          lda #$4d     ; op-code eor abs
  1945.          sta (pointers+$00),y
  1946.          iny
  1947.          lda pointers+$02
  1948.          sta (pointers+$00),y
  1949.          iny
  1950.          lda pointers+$03
  1951.          sta (pointers+$00),y
  1952.          iny
  1953.          lda #$8d     ; op-code sta abs
  1954.          sta (pointers+$00),y
  1955.          iny
  1956.          lda pointers+$02
  1957.          sta (pointers+$00),y
  1958.          iny
  1959.          lda pointers+$04
  1960.          sta (pointers+$00),y
  1961.          iny
  1962.          clc
  1963.          tya
  1964.          adc pointers+$00
  1965.          sta pointers+$00
  1966.          bcc *+$04
  1967.          inc pointers+$01
  1968.          lda pointers+$02
  1969.          inc pointers+$02
  1970.          cmp pointers+$05
  1971.          bne mkfilup1
  1972.          and #%10000000
  1973.          adc #$80
  1974.          sta pointers+$02
  1975.          bcc *+$06
  1976.          inc pointers+$03
  1977.          inc pointers+$04
  1978.          inx
  1979.          cpx #$10    ; 16 char columns
  1980.                      ; 16 zeichenspalten
  1981.          bne mkfilup0
  1982.          ldy #$00
  1983.          lda #$60
  1984.          sta (pointers+$00),y
  1985.          rts
  1986.  
  1987.  
  1988.          ; speedcode element for a
  1989.          ;  slope angle of +/-90 to  
  1990.          ;  +/-45 degrees
  1991.          ; speedcodeelement fuer einen
  1992.          ;  steigungswinkel von +/-90
  1993.          ;  bis +/-45 grad
  1994.  
  1995. spidraw0 lda #$00
  1996.          eor !$00,y
  1997.          sta !$00,y
  1998.          txa
  1999.          adc linslopl
  2000.          tax
  2001.          tya
  2002.          adc linsloph
  2003.          tay
  2004.  
  2005.  
  2006.          ; speedcode element for a
  2007.          ;  slope angle of +/-45 to 0
  2008.          ;  degrees
  2009.          ; speedcodeelement fuer einen
  2010.          ;  steigungswinkel von +/-45
  2011.          ;  bis 0 grad
  2012.  
  2013. spidraw1 lda #$00
  2014.          eor !$00,y
  2015.          sta !$00,y
  2016.          txa
  2017.          adc linslopl
  2018.          tax
  2019.          bcc *+$03
  2020. sprw1dir .byte $00
  2021.  
  2022. spidrawe
  2023.  
  2024.          ; speedcode element for a
  2025.          ;  slope angle of +/-90 to  
  2026.          ;  +/-45 degrees
  2027.          ; speedcodeelement fuer einen
  2028.          ;  steigungswinkel von +/-90
  2029.          ;  bis +/-45 grad
  2030.  
  2031. erasraw0 lda #$00
  2032.          sta !$00,y
  2033.          txa
  2034.          adc linslopl
  2035.          tax
  2036.          tya
  2037.          adc linsloph
  2038.          tay
  2039.  
  2040.  
  2041.          ; speedcode element for a
  2042.          ;  slope angle of +/-45 to 0
  2043.          ;  degrees
  2044.          ; speedcodeelement fuer einen
  2045.          ;  steigungswinkel von +/-45
  2046.          ;  bis 0 grad
  2047.  
  2048. erasraw1 lda #$00
  2049.          sta !$00,y
  2050.          txa
  2051.          adc linslopl
  2052.          tax
  2053.          bcc *+$03
  2054. ersrwdir .byte $00
  2055.  
  2056. erasrawe
  2057.          ; table of the y start points
  2058.          ;  of the speed code
  2059.          ; tabelle der y-startpunkte
  2060.          ;  des fuellspeedcodes
  2061.  
  2062. spidybeg .byte $25,$17,$0f,$09,$05,$03
  2063.          .byte $01,$00,$00,$01,$03,$05
  2064.          .byte $09,$0f,$17,$25
  2065.  
  2066.  
  2067. scrntabl .byte scrn/64.(charset0/1024).1
  2068.          .byte scrn/64.(charset1/1024).1
  2069.          .byte scrn/64.(charset2/1024).1
  2070.          .byte scrn/64.(charset0/1024).1
  2071.  
  2072.  
  2073.          ; table of the face vertices
  2074.          ;  for the backface culling
  2075.          ; tabelle der seiteneckpunkte
  2076.          ;  fuer das backface culling
  2077.  
  2078. facepnt0 .byte $00,$00,$01,$02,$00,$04
  2079. facepnt1 .byte $01,$04,$05,$03,$02,$06
  2080. facepnt2 .byte $03,$01,$03,$06,$04,$05
  2081.  
  2082.          ; table of the face colours
  2083.          ; tabelle der seitenfarben
  2084.  
  2085. facecols .byte $01,$02,$03,$02,$03,$01
  2086.  
  2087.          ; table of the face lines
  2088.          ; tabelle der seitenlinien
  2089.  
  2090. facelin0 .byte $00,$00,$01,$02,$03,$08
  2091. facelin1 .byte $01,$04,$05,$06,$04,$09
  2092. facelin2 .byte $02,$05,$07,$07,$06,$0a
  2093. facelin3 .byte $03,$08,$09,$0a,$0b,$0b
  2094.  
  2095.          ; table of the line begin
  2096.          ;  and end points
  2097.          ; tabelle der linienanfangs-
  2098.          ;  und endpunkte
  2099.  
  2100. linepnt0 .byte $00,$01,$03,$02,$00,$01
  2101.          .byte $02,$03,$04,$05,$07,$06
  2102. linepnt1 .byte $01,$03,$02,$00,$04,$05
  2103.          .byte $06,$07,$05,$07,$06,$04
  2104.  
  2105.          ; table of speed code addresses
  2106.          ; tabelle der speedcodeadressen
  2107.  
  2108. spidadrl .byte <spidcod0,<spidcod1
  2109.          .byte <spidcod2
  2110. spidadrh .byte >spidcod0,>spidcod1
  2111.          .byte >spidcod2
  2112.  
  2113.  
  2114. nmi      rti
  2115.  
  2116.  
  2117.          *= $0800
  2118.  
  2119. return   sei
  2120.          lda #$37
  2121.          sta $01
  2122.          ldx #$ff
  2123.          txs
  2124.          jsr $fda3
  2125.          lda #$00
  2126.          tay
  2127.          sta $02,y
  2128.          sta $0200,y
  2129.          sta $0300,y
  2130.          iny
  2131.          bne *-$0a
  2132.          ldx #$3c
  2133.          ldy #$03
  2134.          stx $b2
  2135.          sty $b3
  2136.          ldx #$00
  2137.          ldy #$a0
  2138.          jsr $fd8c
  2139.          jsr $fd15
  2140.          jsr $ff5b
  2141.          jsr $e453
  2142.          jsr $e3bf
  2143.          ldx #$01
  2144.          stx $df06
  2145.          dex
  2146.          stx $df02
  2147.          stx $df04
  2148.          ldy #$08
  2149.          sty $df03
  2150.          sty $df05
  2151.          ldy #$f8
  2152.          sty $df07
  2153.          dey
  2154.          sty $df08
  2155.          stx $df0a
  2156.          lda #$ec
  2157.          sta $df01
  2158.          ldy #$1f
  2159.          lda doreturn,y
  2160.          sta $0340,y
  2161.          dey
  2162.          bpl *-$07
  2163.          jsr $0340
  2164.          stx $df06
  2165.          lda #$ed
  2166.          sta $df01
  2167.          lda #$8f
  2168.          pha
  2169.          lda #$ff
  2170.          pha
  2171.          jmp $0340
  2172. doreturn sei
  2173.          lda #$30
  2174.          sta $01
  2175.          lda $ff00
  2176.          sta $ff00
  2177.          lda #$37
  2178.          sta $01
  2179.          rts
  2180.  
  2181.