home *** CD-ROM | disk | FTP | other *** search
/ Go64! / Go64_2002-11_2002_CSW_Side_B.d64 / rotflatshadn.txt < prev    next >
Text File  |  2023-02-26  |  48KB  |  2,259 lines

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