;pass1 ldx sort+0 ldy spry,x ; get sprite y coord lax and#0fmul16,y ;get bucket startadress ora bucket1+15,x ;get adress INside the bucket inc bucket1+15,x ;inc nr of elements tax smod sty bucket1,x ;store spr to bucket ;pass2 ldx bucket1+15 beq next ;empty bucket dont bother blp1 ldy bucket1,x lda spry,y ;get spr y and #%11110000 ;upper 4 bits only this time tay ;which is exactly our pointer ora bucket2+15,y ;addy inside bucket inc bucket2+15,y ;inc bucket counter tay ;final bucket addy sta bucket2,y ;store sprite dex bne blp1 ;any more in bucket1? next ;pass3 ldy #$00 ; nr of sprites counter this is done only once ldx bucket2+15 beq next ;empty bucket? blp2 lda bucket2,x ;get sprite nr smod sta final,y ;store to final list iny ;final spr count dex bne blp2 ;any more in curr. bucket?
;; initialize the buckets ldx #$81 !for i,0,16 { sta lsd_bucket+i } lda #$fe !for i,0,6 { sax msd_bucket+i*2+0 stx msd_bucket+i*2+1 sbx #-3 } ;; lsd sort lda #$0f !for i,0,32 { ldx actor_ypos+i sbx #$00 ldy lsd_bucket,x sty actor_link+i ldy #i sty lsd_bucket,x } ;; msd sort !for i,0,13 { ldx lsd_bucket+i bmi .next .msd ldy actor_ypos,x lda msd_table,y tay lda msd_bucket,y stx msd_bucket,y ldy actor_link,x sta actor_link,x bmi .next ldx actor_ypos,y lda msd_table,x tax lda msd_bucket,x sty msd_bucket,x ldx actor_link,y sta actor_link,y bne .msd .next } ;; finally in the mux writer. ;; for each sprite, alternating x and y ldx actor_link,y bpl .ok .bucket lda msd_bucket-$80,x tax bmi .bucket .ok ...