home *** CD-ROM | disk | FTP | other *** search
/ 64'er / 64ER_CD.iso / s85xx / s8504b.d64 / facet.src < prev    next >
Text File  |  1995-03-30  |  8KB  |  468 lines

  1. ; FACET - DRAW SHADED TRIANGULAR FACETS
  2. ; AND STRAIGHT LINES.
  3. ;
  4. ; RICHARD L. RYLANDER   11/4/84
  5. ;
  6. ; LOAD "ARITH.HEX" AND "GRAPH.HEX"
  7. ; BEFORE USING
  8. ;
  9. ORIGIN = $C26F
  10. RAM    = $034A
  11. ;
  12. XPLT   = $033F
  13. YPLT   = $0341
  14. NORM   = $C224
  15. NOSCAL = $0347
  16. PLOT   = $C143
  17. UNPLOT = $C146
  18. ;
  19. MLPCND = $AC
  20. MLPLER = $AD
  21. PROD   = $AE
  22. MULT   = $C011
  23. ;
  24. DVDND  = $FD
  25. DVSOR  = $FB
  26. QUOT   = $FD
  27. DIVIDE = $C025
  28. ;
  29.       *=RAM
  30. ;
  31. XMIN   *=*+2
  32. YMIN   *=*+1
  33. XMID   *=*+2
  34. YMID   *=*+1
  35. XMAX   *=*+2
  36. YMAX   *=*+1
  37. YTOP   *=*+1
  38. YBOT   *=*+1
  39. YBASE  *=*+1
  40. DLTAX1 *=*+2
  41. DLTAX2 *=*+1
  42. DLTAX3 *=*+1
  43. DELTAX *=*+1
  44. DLTAY1 *=*+1
  45. DLTAY2 *=*+1
  46. DLTAY3 *=*+1
  47. DELTAY *=*+1
  48. XDIFF  *=*+1
  49. FLAG1  *=*+1
  50. FLAG2  *=*+1
  51. FLAG3  *=*+1
  52. FLAG   *=*+1
  53. EDGES  *=*+1
  54. ERROR  *=*+2
  55. MODE   *=*+1
  56. COUNT  *=*+2
  57. ;
  58. ;
  59.       *=ORIGIN
  60. ;
  61. ;*****************************************
  62. ;
  63. ; SCALE ALL Y COORDINATES FROM 0..239
  64. ; PSUEDO-COORDINATE RANGE TO 0..199
  65. ; TRUE SCREEN COORDINATE RANGE
  66. ;
  67. SCALE  LDY #6
  68.        LDA #$D5
  69.        STA MLPCND
  70. SCLP   LDA YMIN,Y
  71.        STA MLPLER
  72.        JSR MULT
  73.        STA YMIN,Y
  74.        DEY
  75.        DEY
  76.        DEY
  77.        BPL SCLP
  78.        RTS
  79. ;
  80. ;
  81. ;*****************************************
  82. ;
  83. ; EXCHANGE 'MIN' AND 'MID' COORDINATES
  84. ;
  85. SWAP12 LDY #2
  86. LOOP1  LDA XMIN,Y
  87.        PHA
  88.        LDA XMID,Y
  89.        STA XMIN,Y
  90.        PLA
  91.        STA XMID,Y
  92.        DEY
  93.        BPL LOOP1
  94.        RTS
  95. ;
  96. ;*****************************************
  97. ;
  98. ; EXCHANGE 'MID' AND 'MAX' COORDINATES
  99. ;
  100. SWAP23 LDY #2
  101. LOOP2  LDA XMID,Y
  102.        PHA
  103.        LDA XMAX,Y
  104.        STA XMID,Y
  105.        PLA
  106.        STA XMAX,Y
  107.        DEY
  108.        BPL LOOP2
  109.        RTS
  110. ;
  111. ;*****************************************
  112. ;
  113. ; SORT COORDINATES ACCORDING TO X COMPONENTS
  114. ;
  115. SORTX  LDX #2
  116. SORTLP SEC
  117.        LDA XMID
  118.        SBC XMIN
  119.        LDA XMID+1
  120.        SBC XMIN+1
  121.        BCS NOSWP1
  122.        JSR SWAP12
  123. NOSWP1 DEX
  124.        BEQ SORTED
  125.        SEC
  126.        LDA XMAX
  127.        SBC XMID
  128.        LDA XMAX+1
  129.        SBC XMID+1
  130.        BCS SORTLP
  131.        JSR SWAP23
  132.        JMP SORTLP
  133. SORTED RTS
  134. ;
  135. ;*****************************************
  136. ;
  137. ; DRAW A LINE BETWEEN XMIN,YMIN AND XMID,YMID
  138. ; USING FAST DDA (DIGITAL DIFFERENTIAL ANALYZER)
  139. ; TECHNIQUE
  140. ;
  141. LINE   LDA #2        ; ENSURE XMAX IS
  142.        STA XMAX+1    ; LARGEST BEFORE
  143.        JSR SORTX     ; ORDERING 'MIN' AND 'MID'
  144.        LDA NOSCAL
  145.        BEQ OUTLN
  146.        JSR SCALE
  147. OUTLN  JSR FINDXY    ; ENTRY POINT TO
  148.        LDA XMIN       ; OUTLINE FACETS
  149.        STA XPLT
  150.        LDA XMIN+1
  151.        STA XPLT+1
  152.        LDA YMIN
  153.        STA YPLT
  154.        LDA DLTAX1+1  ; CHECK FOR DX>DY
  155.        BNE STEPX
  156.        SEC
  157.        LDA DLTAX1
  158.        SBC DLTAY1
  159.        BCS STEPX
  160. STEPY  LDA DLTAY1
  161.        STA ERROR
  162.        STA COUNT
  163.        LSR ERROR
  164.        SEC
  165.        LDA DLTAX1
  166.        SBC ERROR
  167.        STA ERROR
  168.        LDA DLTAX1+1
  169.        SBC #0
  170.        STA ERROR+1
  171.        INC COUNT
  172. LNLP1  LDA MODE      ; 0 = DRAW, 1 = ERASE
  173.        BNE ERASE1
  174.        JSR PLOT
  175.        JMP SK1
  176. ERASE1 JSR UNPLOT
  177. SK1    LDA FLAG1     ; 0 = POSITIVE SLOPE
  178.        BNE NSLOPE
  179.        INC YPLT
  180.        BNE SK2     ; ALWAYS BRANCH
  181. NSLOPE DEC YPLT
  182. SK2    BIT ERROR+1
  183.        BMI SK3
  184.        INC XPLT
  185.        BNE NOINC1
  186.        INC XPLT+1
  187. NOINC1 SEC
  188.        LDA ERROR
  189.        SBC DLTAY1
  190.        STA ERROR
  191.        LDA ERROR+1
  192.        SBC #0
  193.        STA ERROR+1
  194. SK3    CLC
  195.        LDA ERROR
  196.        ADC DLTAX1
  197.        STA ERROR
  198.        LDA ERROR+1
  199.        ADC DLTAX1+1
  200.        STA ERROR+1
  201.        DEC COUNT
  202.        BNE LNLP1
  203.        RTS
  204. ;
  205. STEPX  LDA DLTAX1
  206.        STA ERROR
  207.        STA COUNT
  208.        LDA DLTAX1+1
  209.        STA ERROR+1
  210.        STA COUNT+1
  211.        LSR ERROR+1
  212.        ROR ERROR
  213.        SEC
  214.        LDA DLTAY1
  215.        SBC ERROR
  216.        STA ERROR
  217.        LDA #0
  218.        SBC ERROR+1
  219.        STA ERROR+1
  220. LNLP2  LDA MODE
  221.        BNE ERASE2
  222.        JSR PLOT
  223.        JMP SKP1
  224. ERASE2 JSR UNPLOT
  225. SKP1   INC XPLT
  226.        BNE NOINC2
  227.        INC XPLT+1
  228. NOINC2 BIT ERROR+1
  229.        BMI SKP3
  230.        LDA FLAG1
  231.        BNE NGSLP
  232.        INC YPLT
  233.        BNE SKP2    ; ALWAYS BRANCH
  234. NGSLP  DEC YPLT
  235. SKP2   SEC
  236.        LDA ERROR
  237.        SBC DLTAX1
  238.        STA ERROR
  239.        LDA ERROR+1
  240.        SBC DLTAX1+1
  241.        STA ERROR+1
  242. SKP3   CLC
  243.        LDA ERROR
  244.        ADC DLTAY1
  245.        STA ERROR
  246.        LDA ERROR+1
  247.        ADC #0
  248.        STA ERROR+1
  249.        SEC
  250.        LDA COUNT
  251.        SBC #1
  252.        STA COUNT
  253.        BCS TEST
  254.        DEC COUNT+1
  255. TEST   BIT COUNT+1
  256.        BPL LNLP2
  257.        RTS
  258. ;
  259. ;*****************************************
  260. ; DRAW A SHADED VERTICAL LINE AT
  261. ; XPLT FROM YTOP TO YBOT
  262. ;
  263. VLINE  SEC         ; MAKE SURE YTOP>YBOT
  264.        LDA YTOP
  265.        SBC YBOT
  266.        BCS DRAW
  267.        LDA YTOP
  268.        PHA
  269.        LDA YBOT
  270.        STA YTOP
  271.        PLA
  272.        STA YBOT
  273. DRAW   LDA YTOP
  274.        STA YPLT
  275.        JSR NORM    ; PLOT A SHADE-WEIGHTED
  276.        LDA YTOP    ; PIXEL CHECKING ONLY
  277.        CMP YBOT    ; FOR SHADE STYLE
  278.        BEQ DONE
  279.        DEC YTOP
  280.        JMP DRAW
  281. DONE   RTS
  282. ;
  283. ;*****************************************
  284. ;
  285. ; FIND ENDPOINTS FOR VERTICAL LINES
  286. ; BETWEEN FACET EDGES
  287. ;
  288. ENDPTS LDA XDIFF
  289.        STA MLPCND
  290.        LDA DELTAY
  291.        STA MLPLER
  292.        JSR MULT
  293.        STA DVDND+1
  294.        LDA PROD
  295.        STA DVDND
  296.        LDA #0
  297.        STA DVSOR+1
  298.        LDA DELTAX
  299.        STA DVSOR
  300.        JSR DIVIDE
  301.        LDA FLAG
  302.        BNE NEGSLP
  303.        CLC
  304.        LDA YBASE
  305.        ADC QUOT
  306.        BCC SKIP2
  307. NEGSLP SEC
  308.        LDA YBASE
  309.        SBC QUOT
  310. SKIP2  RTS
  311. ;
  312. ;*****************************************
  313. ;
  314. ; FIND COORDINATE DIFFERENCES
  315. ;
  316. ; ALL "DELTA X" VALUES POSITIVE,
  317. ; SINGLE PRECISION (JUST LOWER BYTE)
  318. ;
  319. FINDXY SEC
  320.        LDA XMID
  321.        SBC XMIN
  322.        STA DLTAX1
  323.        LDA XMID+1
  324.        SBC XMIN+1
  325.        STA DLTAX1+1
  326.        SEC
  327.        LDA XMAX
  328.        SBC XMID
  329.        STA DLTAX2
  330.        SEC
  331.        LDA XMAX
  332.        SBC XMIN
  333.        STA DLTAX3
  334. ;
  335. ; USE ABS(DELTA Y) VALUES,
  336. ; FLAGS INDICATE SLOPE OF LIMIT LINES
  337. ;
  338.        LDA #$00
  339.        STA FLAG1
  340.        STA FLAG2
  341.        STA FLAG3
  342.        SEC
  343.        LDA YMID
  344.        SBC YMIN
  345.        BCS STORE1
  346.        INC FLAG1
  347.        LDA YMIN
  348.        SBC YMID
  349. STORE1 STA DLTAY1
  350.        SEC
  351.        LDA YMAX
  352.        SBC YMID
  353.        BCS STORE2
  354.        INC FLAG2
  355.        LDA YMID
  356.        SBC YMAX
  357. STORE2 STA DLTAY2
  358.        SEC
  359.        LDA YMAX
  360.        SBC YMIN
  361.        BCS STORE3
  362.        INC FLAG3
  363.        LDA YMIN
  364.        SBC YMAX
  365. STORE3 STA DLTAY3
  366.        RTS
  367. ;
  368. ;*****************************************
  369. ;
  370. ; DRAW A SHADED TRIANGULAR FACET
  371. ;
  372. FACET  JSR SORTX
  373.        LDA NOSCAL
  374.        BEQ YSOK
  375.        JSR SCALE
  376. YSOK   JSR FINDXY
  377.        LDA XMIN
  378.        STA XPLT
  379.        LDA XMIN+1
  380.        STA XPLT+1
  381. FCETLP SEC
  382.        LDA XPLT
  383.        SBC XMIN
  384.        STA XDIFF
  385.        LDA DLTAX1
  386.        BEQ CONT
  387.        STA DELTAX
  388.        LDA DLTAY1
  389.        STA DELTAY
  390.        LDA FLAG1
  391.        STA FLAG
  392.        LDA YMIN
  393.        STA YBASE
  394.        JSR ENDPTS
  395.        STA YTOP
  396.        LDA DLTAX3
  397.        BEQ CONT
  398.        STA DELTAX
  399.        LDA DLTAY3
  400.        STA DELTAY
  401.        LDA FLAG3
  402.        STA FLAG
  403.        JSR ENDPTS
  404.        STA YBOT
  405.        JSR VLINE
  406.        LDA XPLT+1
  407.        CMP XMID+1
  408.        BNE NEXTX1
  409.        LDA XPLT
  410.        CMP XMID
  411.        BEQ CONT
  412. NEXTX1 INC XPLT
  413.        BNE SKIP3
  414.        INC XPLT+1
  415. SKIP3  JMP FCETLP
  416. CONT   SEC
  417.        LDA XPLT
  418.        SBC XMIN
  419.        STA XDIFF
  420.        LDA DLTAX3
  421.        BEQ FINI
  422.        STA DELTAX
  423.        LDA DLTAY3
  424.        STA DELTAY
  425.        LDA FLAG3
  426.        STA FLAG
  427.        LDA YMIN
  428.        STA YBASE
  429.        JSR ENDPTS
  430.        STA YBOT
  431.        SEC
  432.        LDA XPLT
  433.        SBC XMID
  434.        STA XDIFF
  435.        LDA DLTAX2
  436.        BEQ FINI
  437.        STA DELTAX
  438.        LDA DLTAY2
  439.        STA DELTAY
  440.        LDA FLAG2
  441.        STA FLAG
  442.        LDA YMID
  443.        STA YBASE
  444.        JSR ENDPTS
  445.        STA YTOP
  446.        JSR VLINE
  447.        LDA XPLT+1
  448.        CMP XMAX+1
  449.        BNE NEXTX2
  450.        LDA XPLT
  451.        CMP XMAX
  452.        BEQ FINI
  453. NEXTX2 INC XPLT
  454.        BNE SKIP4
  455.        INC XPLT+1
  456. SKIP4  JMP CONT
  457. FINI   LDA EDGES
  458.        BEQ FINISH
  459.        JSR OUTLN
  460.        JSR SWAP23
  461.        JSR OUTLN
  462.        JSR SWAP12
  463.        JSR SWAP23
  464.        JSR SWAP12
  465.        JSR OUTLN
  466. FINISH RTS
  467. .END
  468.