This routine preps the 2LK data for player0 and turns on VDELP0 if required (if you're wondering, VDELP0 is turned off in VerticalSync):

; prep Humanoid's Y position for 2LK ldx #1 ; preload X for setting VDELPx lda ObjectY ; get the human's Y position lsr ; divide by 2 for the 2LK position sta Temp ; save for position calculations bcs NoDelay0 ; if carry is set we don't need Vertical Delay stx VDELP0 ; carry was clear, so set Vertical Delay NoDelay0: ; HumanDraw = ARENA_HEIGHT + HUMAN_HEIGHT - Y position lda #(ARENA_HEIGHT + HUMAN_HEIGHT) sec sbc Temp sta HumanDraw ; HumanPtr = HumanGfx + HUMAN_HEIGHT - 1 - Y position lda #<(HumanGfx + HUMAN_HEIGHT - 1) sec sbc Temp sta HumanPtr lda #>(HumanGfx + HUMAN_HEIGHT - 1) sbc #0 sta HumanPtr+1

One minor problem with the prior 2LK was that player1 could not show up on the topmost scanline of the Arena:

Closeup:

To fix this, we'll modify the kernel to prime GRP1 before it enters the loop that draws the Arena:

ldy #ARENA_HEIGHT+1 ; 2 7 - the arena will be 180 scanlines (from 0-89)*2 ; prime GRP1 so player1 can appear on topmost scanline of the Arena lda #BOX_HEIGHT-1 ; 2 9 - height of the box graphics, dcp BoxDraw ; 5 14 - Decrement BoxDraw and compare with height bcs DoDrawGrp1pre ; 2 16 - (3 17) if Carry is Set, then box is on current scanline lda #0 ; 2 18 - otherwise use 0 to turn off player1 .byte $2C ; 4 22 - $2C = BIT with absolute addressing, trick that ; causes the lda (BoxPtr),y to be skipped DoDrawGrp1pre: ; 17 - from bcs DoDrawGRP1pre lda (BoxPtr),y ; 5 22 - load the shape for the box sta GRP1 ; 3 25 - @0-22, update player1 to draw box dey ; 2 27 ArenaLoop: ; 13 - from bpl ArenaLoop

The 2LK calculations for player1 used to be the same as for player0, but now must be modified to compensate for the priming of GRP1:

; prep box's Y position for 2LK lda ObjectY+1 ; get the box's Y position clc adc #1 ; add 1 to compensate for priming of GRP1 lsr ; divide by 2 for the 2LK position sta Temp ; save for position calculations bcs NoDelay1 ; if carry is set we don't need Vertical Delay stx VDELP1 ; carry was clear, so set Vertical Delay NoDelay1: ; BoxDraw = ARENA_HEIGHT + BOX_HEIGHT - Y position + 1 ; the + 1 compensates for priming of GRP1 lda #(ARENA_HEIGHT + BOX_HEIGHT +1) sec sbc Temp sta BoxDraw ; BoxPtr = BoxGfx + BOX_HEIGHT - 1 - Y position lda #<(BoxGfx + BOX_HEIGHT - 1) sec sbc Temp sta BoxPtr lda #>(BoxGfx + BOX_HEIGHT - 1) sbc #0 sta BoxPtr+1

Added GRP1 priming which allows player1 to cover full Arena:

Closeup:

Lastly, I added a new Box graphic for player1

ROM

collect_20140704.bin

**(2KB)**

downloads: 137

Source

Collect_20140704.zip

**(44.99KB)**

downloads: 174

Is this series something you'll eventually want me to put on my web site?