Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- procedure movePlayerUpOrScrollDown();
- // player moving up
- begin
- if viewRowStart = mapStart then begin
- // at top of map so don't scroll screen down
- // and move normally
- player.yPos := player.yPos + player.yVel;
- Exit;
- end;
- if player.ty >= VIEW_THRESHOLD_T then begin
- // don't scroll yet, not high enough up the screen
- // move normally
- player.yPos := player.yPos + player.yVel;
- Exit;
- end;
- vic_waitForRaster(IRQ_BLANK_LINE);
- // change scroll reg by y-vel (max 2 per frame)
- Dec(scrollY,abs8(player.yVel.b1));
- if scrollY and 128 then begin
- // is negative so wrap around and do hardscroll
- scrollY := scrollY and 7;
- asm
- .for(var y = SCREEN_HEIGHT - 2; y >= VIEW_ROW_OFFSET; y--) {
- ldx #MAP_WIDTH-1
- !:
- lda SCREEN0_ADDRESS + (y + 0) * SCREEN_WIDTH,x
- sta SCREEN0_ADDRESS + (y + 1) * SCREEN_WIDTH,x
- lda COLOR_ADDRESS + (y + 0) * SCREEN_WIDTH,x
- sta COLOR_ADDRESS + (y + 1) * SCREEN_WIDTH,x
- dex
- bpl !-
- }
- end;
- // move view up in map
- Dec(viewRowStart);
- Dec(viewRowEnd);
- // fill top row with level data
- addressPntr1 := levelRowOffset[viewRowStart];
- addressPntr2 := screenRowOffset[VIEW_ROW_OFFSET];
- asm
- clc
- lda addressPntr2 + 0
- adc #<(COLOR_ADDRESS-SCREEN0_ADDRESS)
- sta addressPntr3 + 0
- lda addressPntr2 + 1
- adc #>(COLOR_ADDRESS-SCREEN0_ADDRESS)
- sta addressPntr3 + 1
- ldy #MAP_WIDTH-1
- !:
- lda (addressPntr1),y
- // store level char for color attrib later
- pha
- sta (addressPntr2),y
- // restore level char for color attrib
- pla
- tax
- lda charAttribs,x
- sta (addressPntr3),y
- dey
- bpl !-
- end;
- end;
- end;
Advertisement
Add Comment
Please, Sign In to add comment