diff options
author | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2021-09-25 16:21:20 +0300 |
---|---|---|
committer | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2021-09-25 16:21:20 +0300 |
commit | a02825f6bbc89915370319344e8b65d2a06d3c7a (patch) | |
tree | d4dc8082a44a765463f571b73e25547bee2a8888 /video.asm | |
parent | c80ee5cfb6e3f384e1d210cb6332fc1215fed66e (diff) |
New settings for stars
Diffstat (limited to 'video.asm')
-rw-r--r-- | video.asm | 169 |
1 files changed, 107 insertions, 62 deletions
@@ -13,6 +13,7 @@ LAST_LINE_GAME .rs 2 SCROLL_FINE .rs 1 ; fine scroll position SCROLL_LINES_TARGET .rs 2 ; scrolling target STAR_SPAWN_TIMER .rs 1 ; stars spawn timer +STAR_SPAWN_COUNTER .rs 1 ; stars spawn counter ; for build info CHR_RAM_SIZE .rs 1 ; CHR RAM size 8*2^xKB LAST_ATTRIBUTE_ADDRESS .rs 1 ; to prevent duplicate writes @@ -25,6 +26,15 @@ SCROLL_LOCK .rs 1 CHARS_PER_LINE .equ 32 LINES_PER_SCREEN .equ 15 +SPRITE_0_Y .equ SPRITES + 0 +SPRITE_0_TILE .equ SPRITES + 1 +SPRITE_0_ATTR .equ SPRITES + 2 +SPRITE_0_X .equ SPRITES + 3 +SPRITE_1_Y .equ SPRITES + 4 +SPRITE_1_TILE .equ SPRITES + 5 +SPRITE_1_ATTR .equ SPRITES + 6 +SPRITE_1_X .equ SPRITES + 7 + waitblank: pha tya @@ -61,7 +71,7 @@ waitblank: ; reading controller jsr read_controller ; stars on the background - .if ENABLE_STARS!=0 + .if STARS!=0 jsr stars .endif @@ -217,7 +227,7 @@ screen_wrap_down: jsr sprite_dma_copy jsr scroll_fix jsr move_cursors - .if ENABLE_STARS!=0 + .if STARS!=0 jsr stars .endif cpx #0 @@ -290,7 +300,7 @@ screen_wrap_up: jsr sprite_dma_copy jsr scroll_fix jsr move_cursors - .if ENABLE_STARS!=0 + .if STARS!=0 jsr stars .endif ; next line? @@ -780,6 +790,8 @@ set_line_attributes: bne .set_attribute_address rts .set_attribute_address: + lda #BANK(header_attribute_table) / 2 + jsr select_prg_bank ; calculating attributes address lda <TEXT_DRAW_ROW cmp #LINES_PER_SCREEN @@ -838,8 +850,6 @@ set_line_attributes: eor TMP lsr A bcc .only_header_attributes - lda #BANK(header_attribute_table) / 2 ; bank with header attribute table - jsr select_prg_bank .header_0_loop: lda header_attribute_table, y asl A @@ -857,8 +867,6 @@ set_line_attributes: eor TMP lsr A bcs .only_header_attributes - lda #BANK(header_attribute_table) / 2 - jsr select_prg_bank .header_1_loop: lda header_attribute_table, y lsr A @@ -1119,42 +1127,32 @@ wait_scroll_done: bne wait_scroll_done rts - .if ENABLE_STARS!=0 + .if STARS!=0 + .if STARS > 62 + .fail Number of STARS must be <= 62 + .endif stars: - lda <STAR_SPAWN_TIMER - cmp #$E0 ; stars count - beq .spawn_end + ; one time spawner + lda <STAR_SPAWN_COUNTER + cmp #STARS ; number of stars + beq .spawn_end ; spawner is not required anymore inc <STAR_SPAWN_TIMER lda <STAR_SPAWN_TIMER - and #$0F - cmp #0 - bne .spawn_end - lda <STAR_SPAWN_TIMER - lsr A - lsr A + cmp #STAR_SPAWN_INTERVAL ; spawn interval + bne .spawn_end ; too early + lda #0 + sta <STAR_SPAWN_TIMER + lda <STAR_SPAWN_COUNTER + asl A + asl A tay - lda <STAR_SPAWN_TIMER - lda #$FC ; Y, below screen - sta SPRITES+4, y - iny - jsr random ; random tile - and #$03 - clc - adc #1 - sta SPRITES+4, y - iny - jsr random ; attributes, random palette - and #%00000011 ; palette - tho lowest bits - ora #%00100000 ; low priority bit - sta SPRITES+4, y - iny - jsr random - sta SPRITES+4, y + jsr .spawn + inc <STAR_SPAWN_COUNTER .spawn_end: - ldy #8 + ldy #0 .move_next: - lda SPRITES, y - cmp #$FF + lda SPRITES+4*2, y + cmp #$FF ; end of stars marker beq .move_end tya lsr A @@ -1174,41 +1172,59 @@ stars: beq .move_slow cmp #$06 beq .move_slow -.move_very_slow: ; default - lda SPRITES, y + .if STARS_DIRECTION=0 +.move_very_slow: + lda SPRITES+4*2, y + sec sbc #1 jmp .moved .move_slow: - lda SPRITES, y + lda SPRITES+4*2, y sec sbc #2 jmp .moved .move_medium: - lda SPRITES, y + lda SPRITES+4*2, y sec sbc #3 jmp .moved .move_fast: - lda SPRITES, y + lda SPRITES+4*2, y sec sbc #4 -.moved: - sta SPRITES, y - cmp #$0A - bcs .move_next1 - lda #$FC - sta SPRITES, y ; reset Y - jsr random ; random tile - and #$03 + .else +.move_very_slow: + lda SPRITES+4*2, y clc adc #1 - sta SPRITES+1, y - jsr random ; random X - sta SPRITES+3, y - jsr random ; random attributes - and #%00000011 ; palette - lowest two bits - ora #%00100000 ; priority bit - sta SPRITES+2, y + jmp .moved +.move_slow: + lda SPRITES+4*2, y + clc + adc #2 + jmp .moved +.move_medium: + lda SPRITES+4*2, y + clc + adc #3 + jmp .moved +.move_fast: + lda SPRITES+4*2, y + clc + adc #4 + .endif +.moved: + sta SPRITES+4*2, y + ; reset Y coordinate + ; if sprite out of the screen + .if STARS_DIRECTION=0 + cmp #$04 + bcs .move_next1 + .else + cmp #$FB + bcc .move_next1 + .endif + jsr .spawn .move_next1: iny iny @@ -1217,6 +1233,29 @@ stars: bne .move_next .move_end: rts +.spawn: + ; set Y + .if STARS_DIRECTION=0 + lda #$FE ; Y, below the screen + .else + lda #$00 ; Y, top of the screen + .endif + sta SPRITES+4*2, y + ; set random tile + jsr random + and #$03 + clc + adc #1 + sta SPRITES+4*2+1, y + ; set random attributes + jsr random ; attributes, random palette + and #%00000011 ; palette - two lowest bits + ora #%00100000 ; low priority bit + sta SPRITES+4*2+2, y + ; set random X + jsr random + sta SPRITES+4*2+3, y + rts .endif load_text_attributes: @@ -1316,21 +1355,29 @@ detect_chr_ram_size: stx PPUADDR lda #$AA sta PPUDATA + ; to prevent open bus read + lda #$55 + sta PPUDATA ; check for $AA stx PPUADDR stx PPUADDR ldy PPUDATA ; dump read + lda #$AA cmp PPUDATA bne .end ; check failed ; store $55 stx PPUADDR stx PPUADDR lda #$55 - ; check for $55 sta PPUDATA + ; to prevent open bus read + lda #$AA + sta PPUDATA + ; check for $55 stx PPUADDR stx PPUADDR ldy PPUDATA ; dump read + lda #$55 cmp PPUDATA bne .end ; check failed ; select zero bank @@ -1347,11 +1394,9 @@ detect_chr_ram_size: inc <CHR_RAM_SIZE jmp .next_size .end: + ; return everything back lda #0 jsr select_chr_bank - lda #0 - sta PPUADDR - sta PPUADDR - sta PPUDATA + jsr load_base_chr jsr disable_chr_write rts |