Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- lda link_buffer
- sta zp_tmp1
- lda link_buffer+1
- sta zp_tmp1+1
- ldy #3
- lda link_content
- sta (zp_tmp1),y
- iny
- lda link_content+1
- sta (zp_tmp1),y
- ;translate to origin -> signed numbers!
- lda pxpos
- sec
- sbc #80
- sta tmp1
- bpl ispositive0
- isnegative0
- clc
- eor #$ff
- adc #$01
- ispositive0
- ;------------------------
- and #7
- asl
- asl
- asl
- asl
- asl
- sta rem1
- lda tmp1 ;now re-attach the sign?
- bpl waspositive0
- wasnegative0
- lda rem1
- clc
- eor #$ff
- adc #$01
- sta rem1
- waspositive0
- ;------------------------
- ;------------------------
- lda pypos
- sec
- sbc #20
- sta tmp2
- ;------------------------
- ;tmp2 can be negative
- ;so check first
- bpl ispositive
- isnegative
- clc
- eor #$ff
- adc #$01
- ispositive
- and #3
- asl
- asl
- asl
- asl
- asl
- asl
- sta rem2
- lda tmp2 ;now re-attach the sign?
- bpl waspositive
- wasnegative
- lda rem2
- clc
- eor #$ff
- adc #$01
- sta rem2
- waspositive
- ;------------------------
- lda rem1
- clc
- adc rem2
- lda #0
- adc #0
- sta rem_msb1
- ;pxpos / 8
- lda tmp1 ;
- cmp #$80 ;copy bit 7 to carry
- ror ;shift right as before
- bpl *+4 ;if positive number then skip
- adc #$00 ;else round up
- sta tmp1
- lda tmp1 ;
- cmp #$80 ;copy bit 7 to carry
- ror ;shift right as before
- bpl *+4 ;if positive number then skip
- adc #$00 ;else round up
- sta tmp1
- lda tmp1 ;
- cmp #$80 ;copy bit 7 to carry
- ror ;shift right as before
- bpl *+4 ;if positive number then skip
- adc #$00 ;else round up
- sta tmp1
- ;pypos / 4
- lda tmp2 ;
- cmp #$80 ;copy bit 7 to carry
- ror ;shift right as before
- bpl *+4 ;if positive number then skip
- adc #$00 ;else round up
- sta tmp2
- lda tmp2 ;
- cmp #$80 ;copy bit 7 to carry
- ror ;shift right as before
- bpl *+4 ;if positive number then skip
- adc #$00 ;else round up
- sta tmp2
- ;tmp3=tmp1+tmp2 + ((rem1+rem2)>>8)
- lda tmp1
- clc
- adc tmp2
- adc rem_msb1
- sta tmp3
- lda tmp3 ;
- cmp #$80 ;copy bit 7 to carry
- ror ;shift right as before
- bpl *+4 ;if positive number then skip
- adc #$00 ;else round up
- sta tmp3
- ;tmp3 = map.x = (screen.x / TILE_WIDTH_HALF + screen.y / TILE_HEIGHT_HALF) /2;
- ;tmp4=tmp2-tmp1 + ((rem2-rem1)>>8)
- lda rem2
- sec
- sbc rem1
- lda #0
- sbc #0
- sta rem_msb2
- #ifdef DEBUG
- lda rem1
- ldx #10
- ldy #10
- jsr plot_a_xy
- lda rem2
- ldx #30
- ldy #10
- jsr plot_a_xy
- lda rem_msb1
- ldx #50
- ldy #10
- jsr plot_a_xy
- lda rem_msb2
- ldx #70
- ldy #10
- jsr plot_a_xy
- #endif
- lda tmp2
- sec
- sbc tmp1
- clc
- adc rem_msb2
- sta tmp4
- lda tmp4 ;
- cmp #$80 ;copy bit 7 to carry
- ror ;shift right as before
- bpl *+4 ;if positive number then skip
- adc #$00 ;else round up
- sta tmp4
- ;tmp4= map.y = (screen.y / TILE_HEIGHT_HALF -(screen.x / TILE_WIDTH_HALF)) /2;
- #ifdef DEBUG
- lda tmp3
- ldx #10
- ldy #90
- jsr plot_a_xy
- lda tmp4
- ldx #24
- ldy #90
- jsr plot_a_xy
- #endif
- lda tmp4
- sta MATHD ; Hardware multiply
- stz MATHC
- lda #10
- sta MATHB ; Hardware multiply
- stz MATHA
- bit $fc92;SPRSYS
- bmi *-3
- lda tmp3
- clc
- adc MATHH ;y*10
- sta player_map_pos
- #ifdef DEBUG
- ldx #50
- ldy #90
- jsr plot_a_xy
- #endif
- ;debug screeny
- ;just for debug
- ;------
- #ifdef DEBUG
- lda #0
- sta count
- loop2
- ldx count
- lda omappos,x
- pha;
- ldy #80
- lda count
- asl
- asl
- asl
- asl
- tax
- pla ;
- jsr plot_a_xy
- inc count
- lda count
- cmp #10
- bne loop2
- ;------
- #endif
- ;inject player;
- lda #0
- sta count
- loop3
- ldx count
- lda omappos,x
- cmp player_map_pos
- bcs inject_here
- inc count
- lda count
- cmp #10
- bne loop3
- ;rts
- inject_here
- ;x*11
- lda #<(object_chain)
- sta zp_tmp1
- lda #>(object_chain)
- sta zp_tmp1+1
- ; ldx #5
- stx player_position_in_list
- cpx #0
- beq skip_search
- dex ;WHY? TRY TO UNDERSTAND BUG NOTE TODO
- loop4 ;go through object chain in steps of OFFSET = 11
- lda zp_tmp1
- clc
- adc #11
- sta zp_tmp1
- bcc ok
- inc zp_tmp2
- ok
- dex
- bne loop4
- skip_search
- #ifdef DEBUG
- lda player_position_in_list
- ldx #10
- ldy #30
- jsr plot_a_xy
- #endif
- ;backup chain link
- lda zp_tmp1
- sta link_buffer
- lda zp_tmp1+1
- sta link_buffer+1
- ldy #3
- lda (zp_tmp1),y
- sta link_content
- iny
- lda (zp_tmp1),y
- sta link_content+1
- ;zp_tmp1 points to sprite to exchange
- ldy #3
- lda (zp_tmp1),y
- sta player_chain ;point player to next chain link
- lda #<player ;insert player into chain
- sta (zp_tmp1),y
- iny
- lda (zp_tmp1),y
- sta player_chain+1
- lda #>player ;insert player into chain
- sta (zp_tmp1),y
- rts
- link_buffer .word object_chain
- link_content .word object_chain+11
- player_position_in_list .byte 0
- player_map_pos .byte 0
- count .byte 0
- mapxp .byte 0
- mapyp .byte 0
- tmp1 .byte 0
- tmp2 .byte 0
- tmp3 .byte 0
- tmp4 .byte 0
- rem1 .byte 0
- rem2 .byte 0
- rem_msb1 .byte 0
- rem_msb2 .byte 0
- .)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement