Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .include KAPE_GPU.i
- ZP_COLOR = $ff
- ZP_X1 = $03
- ZP_Y1 = $04
- ZP_X2 = $05
- ZP_Y2 = $06
- ZP_TRI_ADDR_CUR = $E0
- ZP_TRI_ADDR_NEXT = $E2
- ZP_LOOP = $0D
- ZP_DEPTH = $0E
- ZP_TEMP = $10
- CONST_TOP_X = $3f
- CONST_TOP_Y = $00
- CONST_LEFT_X = $00
- CONST_LEFT_Y = $5f
- CONST_RIGHT_X = $7f
- CONST_RIGHT_Y = $5f
- CONST_STARTDEPTH = 1
- CONST_DEPTH = 6
- .byte $00 ; this needs to be here, otherwise the first org directive has no effect!
- .org $0200
- start:
- jsr GPU_SetLoresMode
- jsr GPU_ClearScreen
- lda #CONST_STARTDEPTH
- sta ZP_DEPTH
- lda #$0f
- sta ZP_COLOR
- lda #<trianglePoints
- sta ZP_TRI_ADDR_CUR
- lda #>trianglePoints
- sta ZP_TRI_ADDR_CUR+1
- lda #<nextTrianglePoints
- sta ZP_TRI_ADDR_NEXT
- lda #>nextTrianglePoints
- sta ZP_TRI_ADDR_NEXT+1
- ; reset starting triangle points
- ldy #$00
- lda #CONST_LEFT_X
- sta (ZP_TRI_ADDR_CUR), Y
- iny
- lda #CONST_LEFT_Y
- sta (ZP_TRI_ADDR_CUR), Y
- iny
- lda #CONST_TOP_X
- sta (ZP_TRI_ADDR_CUR), Y
- iny
- lda #CONST_TOP_Y
- sta (ZP_TRI_ADDR_CUR), Y
- iny
- lda #CONST_RIGHT_X
- sta (ZP_TRI_ADDR_CUR), Y
- iny
- lda #CONST_RIGHT_Y
- sta (ZP_TRI_ADDR_CUR), Y
- ; zero out next triangle point
- lda #$00
- ldy #$00
- sta (ZP_TRI_ADDR_NEXT), Y
- iny
- sta (ZP_TRI_ADDR_NEXT), Y
- iny
- sta (ZP_TRI_ADDR_NEXT), Y
- iny
- sta (ZP_TRI_ADDR_NEXT), Y
- iny
- sta (ZP_TRI_ADDR_NEXT), Y
- iny
- sta (ZP_TRI_ADDR_NEXT), Y
- main_loop:
- jsr drawTriangle
- inc ZP_DEPTH
- lda ZP_DEPTH
- sta ZP_LOOP
- jsr drawLoop
- lda #CONST_DEPTH
- cmp ZP_DEPTH
- bne .skipReset
- lda #63
- jsr ROM_WaitFrames
- jsr GPU_ClearScreen
- lda #CONST_STARTDEPTH
- sta ZP_DEPTH
- .skipReset:
- jsr increase_color
- jsr ROM_WaitForVBlank
- jmp main_loop
- drawLoop:
- dec ZP_LOOP
- beq .return
- ; Calculate top triangle, draw the bottom of the next triangle, and enter the it for recursion (drawLoop)
- jsr copyTriangleToNext
- jsr calculateNextTriangle1
- jsr increase_color
- jsr drawBottomLine
- jsr nextAddress
- jsr drawLoop ; next recursion for Triangle1
- jsr prevAddress
- ; Calculate left triangle, draw the right line of the next triangle, and enter the it for recursion (drawLoop)
- jsr copyTriangleToNext
- jsr calculateNextTriangle2
- jsr drawRightLine
- jsr nextAddress
- jsr drawLoop ; next recursion for Triangle2
- jsr prevAddress
- ; Calculate right triangle, draw the left of the next triangle, and enter it for recursion (drawLoop)
- jsr copyTriangleToNext
- jsr calculateNextTriangle3
- jsr drawLeftLine
- jsr nextAddress
- jsr drawLoop ; next recursion for Triangle3
- jsr prevAddress
- .return:
- inc ZP_LOOP
- rts
- nextAddress:
- lda ZP_TRI_ADDR_NEXT
- sta ZP_TRI_ADDR_CUR
- clc
- adc #$06
- sta ZP_TRI_ADDR_NEXT
- rts
- prevAddress:
- lda ZP_TRI_ADDR_CUR
- sta ZP_TRI_ADDR_NEXT
- sec
- sbc #$06
- sta ZP_TRI_ADDR_CUR
- rts
- drawTriangle:
- ldy #$00
- lda (ZP_TRI_ADDR_CUR), Y
- sta ZP_X1
- iny
- lda (ZP_TRI_ADDR_CUR), Y
- sta ZP_Y1
- ldy #$02
- lda (ZP_TRI_ADDR_CUR), Y
- sta ZP_X2
- iny
- lda (ZP_TRI_ADDR_CUR), Y
- sta ZP_Y2
- jsr drawLine
- ldy #$04
- lda (ZP_TRI_ADDR_CUR), Y
- sta ZP_X2
- iny
- lda (ZP_TRI_ADDR_CUR), Y
- sta ZP_Y2
- jsr drawLine
- ldy #$02
- lda (ZP_TRI_ADDR_CUR), Y
- sta ZP_X1
- iny
- lda (ZP_TRI_ADDR_CUR), Y
- sta ZP_Y1
- jsr drawLine
- lda #CF_CMD_FLUSH_FRAME
- sta GPU_CMDQ_ADDRESS
- rts
- drawNextTriangle:
- ldy #$00
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_X1
- iny
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_Y1
- ldy #$02
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_X2
- iny
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_Y2
- jsr drawLine
- ldy #$04
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_X2
- iny
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_Y2
- jsr drawLine
- ldy #$02
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_X1
- iny
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_Y1
- jsr drawLine
- lda #CF_CMD_FLUSH_FRAME
- sta GPU_CMDQ_ADDRESS
- rts
- drawBottomLine:
- ldy #$00
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_X1
- iny
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_Y1
- ldy #$04
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_X2
- iny
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_Y2
- jsr drawLine
- lda #CF_CMD_FLUSH_FRAME
- sta GPU_CMDQ_ADDRESS
- rts
- drawRightLine:
- ldy #$02
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_X1
- iny
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_Y1
- ldy #$04
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_X2
- iny
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_Y2
- jsr drawLine
- lda #CF_CMD_FLUSH_FRAME
- sta GPU_CMDQ_ADDRESS
- rts
- drawLeftLine:
- ldy #$02
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_X1
- iny
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_Y1
- ldy #$00
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_X2
- iny
- lda (ZP_TRI_ADDR_NEXT), Y
- sta ZP_Y2
- jsr drawLine
- lda #CF_CMD_FLUSH_FRAME
- sta GPU_CMDQ_ADDRESS
- rts
- copyTriangleToNext:
- ldy #$00
- .copyTri:
- lda (ZP_TRI_ADDR_CUR), Y
- sta (ZP_TRI_ADDR_NEXT), Y
- iny
- cpy #$06
- bne .copyTri
- rts
- calculateNextTriangle1:
- ; new left X = (top X + left X) / 2
- ldy #$02
- lda (ZP_TRI_ADDR_CUR), Y
- ldy #$00
- sec
- adc (ZP_TRI_ADDR_CUR), Y
- lsr A
- sta (ZP_TRI_ADDR_NEXT), Y
- ; new right X = (top X + right X) / 2
- ldy #$02
- lda (ZP_TRI_ADDR_CUR), Y
- ldy #$04
- clc
- adc (ZP_TRI_ADDR_CUR), Y
- lsr A
- sta (ZP_TRI_ADDR_NEXT), Y
- ; new bottom y = (bottom y + top y) / 2
- ldy #$03
- lda (ZP_TRI_ADDR_CUR), Y
- ldy #$01
- clc
- adc (ZP_TRI_ADDR_CUR), Y
- lsr A
- sta (ZP_TRI_ADDR_NEXT), Y
- ldy #$05
- sta (ZP_TRI_ADDR_NEXT), Y
- rts
- calculateNextTriangle2:
- ; new right x = (left x + right x) / 2
- ldy #$00
- lda (ZP_TRI_ADDR_CUR), Y
- ldy #$04
- clc
- adc (ZP_TRI_ADDR_CUR), Y
- lsr A
- ldy #$04
- sta (ZP_TRI_ADDR_NEXT), Y
- ; A holds new right x, new top X = (left X + new right X) / 2
- ldy #$00
- sec
- adc (ZP_TRI_ADDR_CUR), Y
- lsr A
- ldy #$02
- sta (ZP_TRI_ADDR_NEXT), Y
- ; new top Y = (bottom Y + top Y) / 2
- ldy #$01
- lda (ZP_TRI_ADDR_CUR), Y
- ldy #$03
- clc
- adc (ZP_TRI_ADDR_CUR), Y
- lsr A
- sta (ZP_TRI_ADDR_NEXT), Y
- rts
- calculateNextTriangle3:
- ; Left X modification to right (new left x = (right x + left x) / 2)
- ldy #$04 ; get right X
- lda (ZP_TRI_ADDR_CUR), Y
- ldy #$00 ; add left X
- sec
- adc (ZP_TRI_ADDR_CUR), Y
- lsr A ; A has halved X (left X)
- sta (ZP_TRI_ADDR_NEXT), Y
- ; end left X modification to right
- ; top X modification to right (new top x = (new left X + right X) / 2)
- ldy #$04 ; add right X
- clc
- adc (ZP_TRI_ADDR_CUR), Y
- lsr A ; A had halved X (top X)
- ldy #$02
- sta (ZP_TRI_ADDR_NEXT), Y
- ; end top X modification to right
- ; new top Y = (bottom Y + top Y) / 2
- ldy #$01
- lda (ZP_TRI_ADDR_CUR), Y
- ldy #$03
- clc
- adc (ZP_TRI_ADDR_CUR), Y
- lsr A
- sta (ZP_TRI_ADDR_NEXT), Y
- rts
- drawLine:
- lda #CF_CMD_DRAW_LINE
- sta GPU_CMDQ_ADDRESS
- lda ZP_X1
- sta GPU_CMDQ_ADDRESS
- lda ZP_Y1
- sta GPU_CMDQ_ADDRESS
- lda ZP_X2
- sta GPU_CMDQ_ADDRESS
- lda ZP_Y2
- sta GPU_CMDQ_ADDRESS
- lda ZP_COLOR
- sta GPU_CMDQ_ADDRESS
- rts
- increase_color:
- lda ZP_COLOR
- clc
- adc #$01
- and #$0f
- cmp #$00
- bne .incend
- clc
- adc #$01
- .incend:
- sta ZP_COLOR
- rts
- trianglePoints:
- .word $5f00
- .word $003f
- .word $5f7f
- nextTrianglePoints:
- .word $0000
- .word $0000
- .word $0000
- ; reserve memory for triangle data
- .rept CONST_DEPTH
- .word $0000
- .word $0000
- .word $0000
- .endr
- .include KAPE_GPU.s
- .include KAPE_ROM.s
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement