Advertisement
ZodiacMentor

6502 Sierpinski for KAPE 8bit

Jan 9th, 2022
3,763
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     .include KAPE_GPU.i
  2.  
  3. ZP_COLOR                = $ff
  4. ZP_X1                   = $03
  5. ZP_Y1                   = $04
  6. ZP_X2                   = $05
  7. ZP_Y2                   = $06
  8.  
  9. ZP_TRI_ADDR_CUR         = $E0
  10. ZP_TRI_ADDR_NEXT        = $E2
  11.  
  12. ZP_LOOP                 = $0D
  13. ZP_DEPTH                = $0E
  14. ZP_TEMP                 = $10
  15.  
  16. CONST_TOP_X             = $3f
  17. CONST_TOP_Y             = $00
  18. CONST_LEFT_X            = $00
  19. CONST_LEFT_Y            = $5f
  20. CONST_RIGHT_X           = $7f
  21. CONST_RIGHT_Y           = $5f
  22. CONST_STARTDEPTH        = 1
  23. CONST_DEPTH             = 6
  24.  
  25.     .byte   $00         ; this needs to be here, otherwise the first org directive has no effect!
  26.     .org    $0200
  27.  
  28. start:
  29.     jsr GPU_SetLoresMode
  30.     jsr GPU_ClearScreen
  31.    
  32.     lda #CONST_STARTDEPTH
  33.     sta ZP_DEPTH
  34.  
  35.     lda #$0f
  36.     sta ZP_COLOR
  37.  
  38.     lda #<trianglePoints
  39.     sta ZP_TRI_ADDR_CUR
  40.     lda #>trianglePoints
  41.     sta ZP_TRI_ADDR_CUR+1
  42.  
  43.     lda #<nextTrianglePoints
  44.     sta ZP_TRI_ADDR_NEXT
  45.     lda #>nextTrianglePoints
  46.     sta ZP_TRI_ADDR_NEXT+1
  47.    
  48.     ; reset starting triangle points
  49.     ldy #$00
  50.     lda #CONST_LEFT_X
  51.     sta (ZP_TRI_ADDR_CUR), Y
  52.     iny
  53.     lda #CONST_LEFT_Y
  54.     sta (ZP_TRI_ADDR_CUR), Y
  55.     iny
  56.     lda #CONST_TOP_X
  57.     sta (ZP_TRI_ADDR_CUR), Y
  58.     iny
  59.     lda #CONST_TOP_Y
  60.     sta (ZP_TRI_ADDR_CUR), Y
  61.     iny
  62.     lda #CONST_RIGHT_X
  63.     sta (ZP_TRI_ADDR_CUR), Y
  64.     iny
  65.     lda #CONST_RIGHT_Y
  66.     sta (ZP_TRI_ADDR_CUR), Y
  67.    
  68.     ; zero out next triangle point
  69.     lda #$00
  70.     ldy #$00
  71.     sta (ZP_TRI_ADDR_NEXT), Y
  72.     iny
  73.     sta (ZP_TRI_ADDR_NEXT), Y
  74.     iny
  75.     sta (ZP_TRI_ADDR_NEXT), Y
  76.     iny
  77.     sta (ZP_TRI_ADDR_NEXT), Y
  78.     iny
  79.     sta (ZP_TRI_ADDR_NEXT), Y
  80.     iny
  81.     sta (ZP_TRI_ADDR_NEXT), Y
  82.  
  83. main_loop:
  84.     jsr drawTriangle
  85.    
  86.     inc ZP_DEPTH
  87.     lda ZP_DEPTH
  88.     sta ZP_LOOP
  89.     jsr drawLoop
  90.  
  91.     lda #CONST_DEPTH
  92.     cmp ZP_DEPTH
  93.     bne .skipReset
  94.     lda #63
  95.     jsr ROM_WaitFrames
  96.     jsr GPU_ClearScreen
  97.     lda #CONST_STARTDEPTH
  98.     sta ZP_DEPTH
  99. .skipReset:
  100.     jsr increase_color
  101.  
  102.     jsr ROM_WaitForVBlank
  103.     jmp main_loop
  104.  
  105. drawLoop:
  106.     dec ZP_LOOP
  107.     beq .return
  108.  
  109. ; Calculate top triangle, draw the bottom of the next triangle, and enter the it for recursion (drawLoop)
  110.     jsr copyTriangleToNext
  111.     jsr calculateNextTriangle1
  112.     jsr increase_color
  113.     jsr drawBottomLine
  114.  
  115.     jsr nextAddress
  116.     jsr drawLoop ; next recursion for Triangle1
  117.     jsr prevAddress
  118.  
  119. ; Calculate left triangle, draw the right line of the next triangle, and enter the it for recursion (drawLoop)
  120.     jsr copyTriangleToNext
  121.     jsr calculateNextTriangle2
  122.     jsr drawRightLine
  123.  
  124.     jsr nextAddress
  125.     jsr drawLoop ; next recursion for Triangle2
  126.     jsr prevAddress
  127.  
  128. ; Calculate right triangle, draw the left of the next triangle, and enter it for recursion (drawLoop)
  129.     jsr copyTriangleToNext
  130.     jsr calculateNextTriangle3
  131.     jsr drawLeftLine
  132.  
  133.     jsr nextAddress
  134.     jsr drawLoop ; next recursion for Triangle3
  135.     jsr prevAddress
  136.  
  137. .return:
  138.     inc ZP_LOOP
  139.     rts
  140.  
  141. nextAddress:
  142.     lda ZP_TRI_ADDR_NEXT
  143.     sta ZP_TRI_ADDR_CUR
  144.     clc
  145.     adc #$06
  146.     sta ZP_TRI_ADDR_NEXT
  147.     rts
  148.  
  149. prevAddress:
  150.     lda ZP_TRI_ADDR_CUR
  151.     sta ZP_TRI_ADDR_NEXT
  152.     sec
  153.     sbc #$06
  154.     sta ZP_TRI_ADDR_CUR
  155.     rts
  156.  
  157. drawTriangle:
  158.     ldy #$00
  159.     lda (ZP_TRI_ADDR_CUR), Y
  160.     sta ZP_X1
  161.     iny
  162.     lda (ZP_TRI_ADDR_CUR), Y
  163.     sta ZP_Y1
  164.     ldy #$02
  165.     lda (ZP_TRI_ADDR_CUR), Y
  166.     sta ZP_X2
  167.     iny
  168.     lda (ZP_TRI_ADDR_CUR), Y
  169.     sta ZP_Y2
  170.  
  171.     jsr drawLine
  172.  
  173.     ldy #$04
  174.     lda (ZP_TRI_ADDR_CUR), Y
  175.     sta ZP_X2
  176.     iny
  177.     lda (ZP_TRI_ADDR_CUR), Y
  178.     sta ZP_Y2
  179.  
  180.     jsr drawLine
  181.  
  182.     ldy #$02
  183.     lda (ZP_TRI_ADDR_CUR), Y
  184.     sta ZP_X1
  185.     iny
  186.     lda (ZP_TRI_ADDR_CUR), Y
  187.     sta ZP_Y1
  188.    
  189.     jsr drawLine
  190.  
  191.     lda #CF_CMD_FLUSH_FRAME
  192.     sta GPU_CMDQ_ADDRESS
  193.  
  194.     rts
  195.  
  196. drawNextTriangle:
  197.     ldy #$00
  198.     lda (ZP_TRI_ADDR_NEXT), Y
  199.     sta ZP_X1
  200.     iny
  201.     lda (ZP_TRI_ADDR_NEXT), Y
  202.     sta ZP_Y1
  203.     ldy #$02
  204.     lda (ZP_TRI_ADDR_NEXT), Y
  205.     sta ZP_X2
  206.     iny
  207.     lda (ZP_TRI_ADDR_NEXT), Y
  208.     sta ZP_Y2
  209.  
  210.     jsr drawLine
  211.  
  212.     ldy #$04
  213.     lda (ZP_TRI_ADDR_NEXT), Y
  214.     sta ZP_X2
  215.     iny
  216.     lda (ZP_TRI_ADDR_NEXT), Y
  217.     sta ZP_Y2
  218.  
  219.     jsr drawLine
  220.  
  221.     ldy #$02
  222.     lda (ZP_TRI_ADDR_NEXT), Y
  223.     sta ZP_X1
  224.     iny
  225.     lda (ZP_TRI_ADDR_NEXT), Y
  226.     sta ZP_Y1
  227.    
  228.     jsr drawLine
  229.  
  230.     lda #CF_CMD_FLUSH_FRAME
  231.     sta GPU_CMDQ_ADDRESS
  232.  
  233.     rts
  234.  
  235. drawBottomLine:
  236.     ldy #$00
  237.     lda (ZP_TRI_ADDR_NEXT), Y
  238.     sta ZP_X1
  239.     iny
  240.     lda (ZP_TRI_ADDR_NEXT), Y
  241.     sta ZP_Y1
  242.  
  243.     ldy #$04
  244.     lda (ZP_TRI_ADDR_NEXT), Y
  245.     sta ZP_X2
  246.     iny
  247.     lda (ZP_TRI_ADDR_NEXT), Y
  248.     sta ZP_Y2
  249.  
  250.     jsr drawLine
  251.  
  252.     lda #CF_CMD_FLUSH_FRAME
  253.     sta GPU_CMDQ_ADDRESS
  254.  
  255.     rts
  256.  
  257. drawRightLine:
  258.     ldy #$02
  259.     lda (ZP_TRI_ADDR_NEXT), Y
  260.     sta ZP_X1
  261.     iny
  262.     lda (ZP_TRI_ADDR_NEXT), Y
  263.     sta ZP_Y1
  264.  
  265.     ldy #$04
  266.     lda (ZP_TRI_ADDR_NEXT), Y
  267.     sta ZP_X2
  268.     iny
  269.     lda (ZP_TRI_ADDR_NEXT), Y
  270.     sta ZP_Y2
  271.  
  272.     jsr drawLine
  273.  
  274.     lda #CF_CMD_FLUSH_FRAME
  275.     sta GPU_CMDQ_ADDRESS
  276.  
  277.     rts
  278.  
  279. drawLeftLine:
  280.     ldy #$02
  281.     lda (ZP_TRI_ADDR_NEXT), Y
  282.     sta ZP_X1
  283.     iny
  284.     lda (ZP_TRI_ADDR_NEXT), Y
  285.     sta ZP_Y1
  286.  
  287.     ldy #$00
  288.     lda (ZP_TRI_ADDR_NEXT), Y
  289.     sta ZP_X2
  290.     iny
  291.     lda (ZP_TRI_ADDR_NEXT), Y
  292.     sta ZP_Y2
  293.  
  294.     jsr drawLine
  295.  
  296.     lda #CF_CMD_FLUSH_FRAME
  297.     sta GPU_CMDQ_ADDRESS
  298.  
  299.     rts
  300.  
  301. copyTriangleToNext:
  302.     ldy #$00
  303. .copyTri:
  304.     lda (ZP_TRI_ADDR_CUR), Y
  305.     sta (ZP_TRI_ADDR_NEXT), Y
  306.     iny
  307.     cpy #$06
  308.     bne .copyTri
  309.     rts
  310.  
  311. calculateNextTriangle1:
  312. ; new left X = (top X + left X) / 2
  313.     ldy #$02
  314.     lda (ZP_TRI_ADDR_CUR), Y
  315.     ldy #$00
  316.     sec
  317.     adc (ZP_TRI_ADDR_CUR), Y
  318.     lsr A
  319.     sta (ZP_TRI_ADDR_NEXT), Y
  320.  
  321. ; new right X = (top X + right X) / 2
  322.     ldy #$02
  323.     lda (ZP_TRI_ADDR_CUR), Y
  324.     ldy #$04
  325.     clc
  326.     adc (ZP_TRI_ADDR_CUR), Y
  327.     lsr A
  328.     sta (ZP_TRI_ADDR_NEXT), Y
  329.  
  330.  
  331. ; new bottom y = (bottom y + top y) / 2
  332.     ldy #$03
  333.     lda (ZP_TRI_ADDR_CUR), Y
  334.     ldy #$01
  335.     clc
  336.     adc (ZP_TRI_ADDR_CUR), Y
  337.     lsr A
  338.     sta (ZP_TRI_ADDR_NEXT), Y
  339.     ldy #$05
  340.     sta (ZP_TRI_ADDR_NEXT), Y
  341.  
  342.     rts
  343.  
  344. calculateNextTriangle2:
  345. ; new right x = (left x + right x) / 2
  346.     ldy #$00
  347.     lda (ZP_TRI_ADDR_CUR), Y
  348.     ldy #$04
  349.     clc
  350.     adc (ZP_TRI_ADDR_CUR), Y
  351.     lsr A
  352.     ldy #$04
  353.     sta (ZP_TRI_ADDR_NEXT), Y
  354. ; A holds new right x, new top X = (left X + new right X) / 2
  355.     ldy #$00
  356.     sec
  357.     adc (ZP_TRI_ADDR_CUR), Y
  358.     lsr A
  359.     ldy #$02
  360.     sta (ZP_TRI_ADDR_NEXT), Y
  361.  
  362. ; new top Y = (bottom Y + top Y) / 2
  363.     ldy #$01
  364.     lda (ZP_TRI_ADDR_CUR), Y
  365.     ldy #$03
  366.     clc
  367.     adc (ZP_TRI_ADDR_CUR), Y
  368.     lsr A
  369.     sta (ZP_TRI_ADDR_NEXT), Y
  370.  
  371.     rts
  372.  
  373. calculateNextTriangle3:
  374.  
  375. ; Left X modification to right (new left x = (right x + left x) / 2)
  376.     ldy #$04 ; get right X
  377.     lda (ZP_TRI_ADDR_CUR), Y
  378.     ldy #$00 ; add left X
  379.     sec
  380.     adc (ZP_TRI_ADDR_CUR), Y
  381.     lsr A ; A has halved X (left X)
  382.     sta (ZP_TRI_ADDR_NEXT), Y
  383. ; end left X modification to right
  384.  
  385. ; top X modification to right (new top x = (new left X + right X) / 2)
  386.     ldy #$04 ; add right X
  387.     clc
  388.     adc (ZP_TRI_ADDR_CUR), Y
  389.     lsr A ; A had halved X (top X)
  390.     ldy #$02
  391.     sta (ZP_TRI_ADDR_NEXT), Y
  392. ; end top X modification to right
  393.  
  394. ; new top Y = (bottom Y + top Y) / 2
  395.     ldy #$01
  396.     lda (ZP_TRI_ADDR_CUR), Y
  397.     ldy #$03
  398.     clc
  399.     adc (ZP_TRI_ADDR_CUR), Y
  400.     lsr A
  401.     sta (ZP_TRI_ADDR_NEXT), Y
  402.  
  403.     rts
  404.  
  405. drawLine:
  406.     lda #CF_CMD_DRAW_LINE
  407.     sta GPU_CMDQ_ADDRESS
  408.    
  409.     lda ZP_X1
  410.     sta GPU_CMDQ_ADDRESS
  411.     lda ZP_Y1
  412.     sta GPU_CMDQ_ADDRESS
  413.     lda ZP_X2
  414.     sta GPU_CMDQ_ADDRESS
  415.     lda ZP_Y2
  416.     sta GPU_CMDQ_ADDRESS
  417.     lda ZP_COLOR
  418.     sta GPU_CMDQ_ADDRESS
  419.  
  420.     rts
  421.  
  422. increase_color:
  423.     lda ZP_COLOR
  424.     clc
  425.     adc #$01
  426.     and #$0f
  427.     cmp #$00
  428.     bne .incend
  429.     clc
  430.     adc #$01
  431. .incend:
  432.     sta ZP_COLOR
  433.     rts
  434.  
  435. trianglePoints:
  436.     .word   $5f00
  437.     .word   $003f
  438.     .word   $5f7f
  439. nextTrianglePoints:
  440.     .word   $0000
  441.     .word   $0000
  442.     .word   $0000
  443.  
  444. ; reserve memory for triangle data
  445.     .rept CONST_DEPTH
  446.     .word $0000
  447.     .word $0000
  448.     .word $0000
  449.     .endr
  450.  
  451.     .include KAPE_GPU.s
  452.     .include KAPE_ROM.s
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement