Heroes & Shadows Posted November 15, 2018 Share Posted November 15, 2018 I am trying to get my "character" to bounce between the left and right parts of the screen. Here is the code I'm using: First, the global equates: LEFTBOUNDRY equ #20 RIGHTBOUNDRY equ #144 and then the actual code: ; pet movement code lda PetX ; load pet x position into accumulator clc ; clear carry flag adc PetVX ; add the pet's velocity constant sta PetX ; store pet's new x position cmp #LEFTBOUNDRY ; does it intersect the left boundry? bcs SkipReversePetDirection ; if not branch cmp #RIGHTBOUNDRY ; does it intersect the right boundry? bcc SkipReversePetDirection ; if not branch lda PetVX ; load the pet's x velocity eor #$ff ; negate it adc PetVX ; add pet's current velocity sta PetVX ; store the pet's new velocity SkipReversePetDirection Also here is a link to the full source code: https://www.dropbox.com/s/6g6fmpmksvx7dmo/Source_11-14-18.zip?dl=0 Thanks for the support so far, Heroes & Shadows Quote Link to comment Share on other sites More sharing options...
ZackAttack Posted November 15, 2018 Share Posted November 15, 2018 Second adc PetVX should be adc #0 since carry is set and you need to add 1? Also, shouldn't the reverse direction only be skipped when PetX is greater than left AND less than right? 1 Quote Link to comment Share on other sites More sharing options...
Heroes & Shadows Posted November 15, 2018 Author Share Posted November 15, 2018 (edited) Second adc PetVX should be adc #0 since carry is set and you need to add 1? Also, shouldn't the reverse direction only be skipped when PetX is greater than left AND less than right? Fixed the first issue, same problem. About the second: Cite: http://6502.org/tutorials/compare_instructions.htm So for left, I use bcs to not reverse the velocity if pet's x position is greater then 20 For right, I use bcc to not reverse the velocity if pet's x position is less then 144 x > 20 OR x < 144 Regards, Heroes & Shadows Edited November 15, 2018 by Heroes & Shadows Quote Link to comment Share on other sites More sharing options...
ZackAttack Posted November 15, 2018 Share Posted November 15, 2018 So for left, I use bcs to not reverse the velocity if pet's x position is greater then 20 For right, I use bcc to not reverse the velocity if pet's x position is less then 144 Still feels wrong to me. If your position is 155 you are greater than 20 and branch past the reversedirection code as well as the second check for the right-boundary condition. In a higher level language I think you've created this: if(x < 20) { if(x > 144) { ReverseDirection(); } } But what you really want is this: if((x < 20) || (x > 144)) ReverseDirection(); Or with the logic inverted: if(!(20 < x && x < 144)) ReverseDirection(); 1 Quote Link to comment Share on other sites More sharing options...
Heroes & Shadows Posted November 15, 2018 Author Share Posted November 15, 2018 (edited) Still feels wrong to me. If your position is 155 you are greater than 20 and branch past the reversedirection code as well as the second check for the right-boundary condition. In a higher level language I think you've created this: if(x < 20) { if(x > 144) { ReverseDirection(); } } But what you really want is this: if((x < 20) || (x > 144)) ReverseDirection(); Or with the logic inverted: if(!(20 < x && x < 144)) ReverseDirection(); Ok, this is what I came up with: ; pet movement code lda PetX ; load pet x position into accumulator clc ; clear carry flag adc PetVX ; add the pet's velocity constant sta PetX ; store pet's new x position cmp #LEFTBOUNDRY ; does it intersect the left boundry? bcs SkipReversePetXVelocityRight ; if not branch lda PetVX ; load the pet's x velocity eor #$ff ; negate it adc #0 ; add 0 sta PetVX ; store the pet's new velocity SkipReversePetXVelocityRight cmp #RIGHTBOUNDRY ; does it intersect the right boundry? bcc SkipReversePetXVelocityLeft ; if not branch lda PetVX ; load the pet's x velocity eor #$ff ; negate it adc #0 ; add 0 sta PetVX ; store the pet's new velocity SkipReversePetXVelocityLeft Seems very convoluted and something that seems like it can be very easily optimized but, hey it works thanks. Regards, Heroes & Shadows Edited November 15, 2018 by Heroes & Shadows Quote Link to comment Share on other sites More sharing options...
ZackAttack Posted November 15, 2018 Share Posted November 15, 2018 Off the top of my head without testing or optimizing I think something like this would work: ; pet movement code lda PetX clc adc PetVX sta PetX cmp #LEFTBOUNDRY bcc ReversePetDirection ; PetX < 20 cmp #RIGHTBOUNDRY bcs ReversePetDirection ; PetX > 144 jmp SkipReversePetDirection ; 20 < PetX && PetX < 144 ReversePetDirection: lda PetVX eor #$ff clc ; must clear carry because it's set or cleared depending on which boundary violation got us here adc #1 sta PetVX ; TODO This would be a good place to toggle the reflection flag if Pet has a directional sprite SkipReversePetDirection Regarding your solution, I think the first adc #0 should actually be adc #1 since the carry flag would need to be cleared to take that code path. If you find that the pet is speeding up each time it crosses the screen twice, that's why. Personally I'd probably just clc before every adc operation until you have a need to start optimizing. Even then you'll probably find better places to start optimizing (low hanging fruit). Hope that helps. -Zack 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.