diff options
author | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2021-05-26 01:21:12 +0300 |
---|---|---|
committer | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2021-05-26 01:21:12 +0300 |
commit | cbbddf64791c23b817ad906fd3e26da243594333 (patch) | |
tree | af5f9ecab7be0b524f81c00b811858a7e215e6cb | |
parent | f87c42b55b913177953dff79f412d1fbe3af426b (diff) |
Dimming feature
-rw-r--r-- | Makefile | 8 | ||||
-rw-r--r-- | buildinfo.asm | 12 | ||||
-rw-r--r-- | buttons.asm | 1 | ||||
-rw-r--r-- | menu.asm | 92 | ||||
-rw-r--r-- | preloader.asm | 6 | ||||
-rw-r--r-- | saves.asm | 2 | ||||
-rw-r--r-- | tests.asm | 4 | ||||
-rw-r--r-- | video.asm | 175 |
8 files changed, 195 insertions, 105 deletions
@@ -44,16 +44,16 @@ all: $(UNIF) $(NES20) $(BIN) build: $(UNIF) $(MENU_ROM): $(SOURCES) games.asm header footer symbols sprites - $(NESASM) $(SOURCES) --output=$(MENU_ROM) $(NESASM_OPTS) + $(NESASM) menu.asm --output=$(MENU_ROM) $(NESASM_OPTS) menu: $(MENU_ROM) games.asm $(OFFSETS): $(CONFIGS_DIR)/$(GAMES) $(COMBINER) prepare --games $(CONFIGS_DIR)/$(GAMES) --asm games.asm --maxromsize $(SIZE) --maxchrsize $(MAXCHRSIZE) --offsets $(OFFSETS) $(REPORT_OPTION) $(SORT_OPTION) --language $(LANGUAGE) $(BADS_OPTION) -$(UNIF): $(SOURCES) header footer symbols sprites - $(COMBINER) build --games $(CONFIGS_DIR)/$(GAMES) --asm games.asm --maxromsize $(SIZE) --maxchrsize $(MAXCHRSIZE) $(REPORT_OPTION) $(SORT_OPTION) --language $(LANGUAGE) --nesasm $(NESASM) --unif $(UNIF) $(BADS_OPTION) -# $(COMBINER) combine --loader $(MENU_ROM) --offsets $(OFFSETS) --unif $(UNIF) +$(UNIF): $(SOURCES) header footer symbols sprites $(MENU_ROM) $(OFFSETS) +# $(COMBINER) build --games $(CONFIGS_DIR)/$(GAMES) --asm games.asm --maxromsize $(SIZE) --maxchrsize $(MAXCHRSIZE) $(REPORT_OPTION) $(SORT_OPTION) --language $(LANGUAGE) --nesasm $(NESASM) --unif $(UNIF) $(BADS_OPTION) + $(COMBINER) combine --loader $(MENU_ROM) --offsets $(OFFSETS) --unif $(UNIF) unif: $(UNIF) diff --git a/buildinfo.asm b/buildinfo.asm index 7a72202..905223a 100644 --- a/buildinfo.asm +++ b/buildinfo.asm @@ -183,7 +183,7 @@ print_prg_ram: sta PPUADDR jsr draw_footer1 jsr draw_footer2 - jsr load_text_palette + jsr load_text_attributes lda #$FF sta <SPRITE_Y_TARGET @@ -200,10 +200,16 @@ print_prg_ram: sta <SELECTED_GAME+1 sta <SCROLL_LINES_MODULO -show_build_info_infin: - jsr waitblank + ; enable PPU + jsr waitblank_simple lda #%00011110 sta PPUMASK + + ; start dimming + jsr dim_base_palette_in + +show_build_info_infin: + jsr waitblank jmp show_build_info_infin prg_ram_detect: diff --git a/buttons.asm b/buttons.asm index 50f3907..99ca19d 100644 --- a/buttons.asm +++ b/buttons.asm @@ -74,7 +74,6 @@ buttons_check: lda <BUTTONS and #%00000001 beq .button_b - jsr start_sound jmp start_game .button_b: @@ -6,12 +6,15 @@ ; settings ENABLE_STARS .equ 1 -ENABLE_START_SCROLLING .equ 1 ENABLE_LAST_GAME_SAVING .equ 1 ENABLE_RIGHT_CURSOR .equ 1 GAME_NAMES_OFFSET .equ 2 BUTTON_REPEAT_FRAMES .equ 30 WRAP_GAMES .equ 30 +ENABLE_DIM_IN .equ 1 +DIM_IN_DELAY .equ 5 +ENABLE_DIM_OUT .equ 1 +DIM_OUT_DELAY .equ 1 ; games settings .include "games.asm" @@ -63,11 +66,15 @@ Start: ldx #$ff txs - lda #%00000000 ; PPU disabled + ; disable PPU + lda #%00000000 sta PPUCTRL sta PPUMASK - + ; warm-up jsr waitblank_simple + jsr waitblank_simple + ; load black screen + jsr load_black ; clean memory lda #$00 @@ -83,24 +90,6 @@ Start: dex bne .loop - jsr clear_screen - jsr load_black - - ; enable PPU to show black screen - lda #%00001010 - sta PPUMASK - - ; wait some time - ldx #15 -.start_wait: - jsr waitblank_simple - dex - bne .start_wait - - lda #%00000000 ; disable PPU - sta PPUMASK - jsr waitblank_simple - ; loading loader and other RAM routines ldx #$00 .load_ram_routines: @@ -119,18 +108,20 @@ Start: jsr console_detect ; load CHR data jsr load_base_chr - ; palette - jsr load_base_pal ; clear all sprites data jsr clear_sprites ; load this empty sprites data jsr sprite_dma_copy - - jsr read_controller ; read buttons - jsr load_state ; loading saved cursor position and other data - jsr save_all_saves ; сохраняем предыдущую сейвку во флеш, если есть - jsr check_separator_down ; skip separator if any - + ; read buttons + jsr read_controller + ; loading saved cursor position and other data + jsr load_state + ; saving last started game to flash (if any) + jsr save_all_saves + ; skip separator if any + jsr check_separator_down + + ; init variables lda <SCROLL_LINES_TARGET sta <SCROLL_LINES sta <LAST_LINE_GAME @@ -261,48 +252,17 @@ Start: dex bne .print_next_game_at_start - jsr waitblank_simple - lda #%00001010 ; second nametable + ; enable PPU + lda #%00001000 ; first nametable sta PPUCTRL - lda #%00001010 ; disabled sprites + lda #%00011110 ; enable sprites sta PPUMASK - ; start scrolling - .if ENABLE_START_SCROLLING!=0 - lda <SELECTED_GAME ; but only if first game selected - bne .intro_scroll_end - lda <SELECTED_GAME+1 - bne .intro_scroll_end - ldx #8 -.intro_scroll: - bit PPUSTATUS - lda #0 - sta PPUSCROLL - stx PPUSCROLL - jsr waitblank_simple - jsr read_controller - ldy #0 - cmp <BUTTONS - bne .intro_scroll_end - inx - inx - inx - inx - cpx #$f0 - bne .intro_scroll - .intro_scroll_end: - .endif - - jsr scroll_fix - ; updating sprites - jsr sprite_dma_copy - lda #%00001000 ; switch to first nametable - sta PPUCTRL - lda #%00011110 ; enable sprites - sta PPUMASK + ; start dimming + jsr dim_base_palette_in ; do not hold buttons! - jsr wait_buttons_not_pressed + ;jsr wait_buttons_not_pressed ; main loop infin: diff --git a/preloader.asm b/preloader.asm index a276739..5e1be9e 100644 --- a/preloader.asm +++ b/preloader.asm @@ -1,5 +1,7 @@ ; starting game! start_game: + jsr start_sound + jsr dim_base_palette_out ; disable PPU lda #%00000000 sta PPUCTRL @@ -39,7 +41,7 @@ start_game: jsr save_state ; print error message jsr clear_screen - jsr load_text_palette + jsr load_text_attributes lda #$21 sta PPUADDR lda #$A0 @@ -88,8 +90,6 @@ compatible_console: jsr clear_sprites ; load this empty data jsr sprite_dma_copy - ; load black palette - jsr load_black ; loading game settings ldx <SELECTED_GAME lda loader_data_reg_0, x @@ -210,11 +210,11 @@ save_all_saves: iny cpy #4 bne .write + jsr saving_warning_hide .done: lda #0 sta <LAST_STARTED_SAVE ; no more last started save ID jsr save_state - jsr saving_warning_hide rts saves_signature: @@ -132,7 +132,7 @@ do_tests_again: jsr select_chr_bank jsr load_base_chr jsr clear_screen - jsr load_text_palette + jsr load_text_attributes lda #$21 sta PPUADDR lda #$A4 @@ -225,7 +225,7 @@ crc_tests: lda #HIGH(string_calculating_crc) sta COPY_SOURCE_ADDR+1 jsr print_text - jsr load_text_palette + jsr load_text_attributes jsr waitblank_simple bit PPUSTATUS lda #0 @@ -1,3 +1,4 @@ +PALETTE_CACHE .rs 32 ; temporary memory for palette, for dimming ; cursors target coordinates SPRITE_0_X_TARGET .rs 1 SPRITE_1_X_TARGET .rs 1 @@ -28,7 +29,6 @@ waitblank: pha txa pha - bit PPUSTATUS ; reset vblank bit .loop: lda PPUSTATUS ; load A with value at location PPUSTATUS @@ -76,6 +76,17 @@ waitblank_simple: pla rts +waitblank_x: + ; for for v-blank X times + cpy #0 + bne .loop + rts +.loop: + jsr waitblank + dex + bne .loop + rts + scroll_fix: pha tya @@ -275,7 +286,7 @@ screen_wrap_up: load_base_chr: ; loading CHR - lda #$06 + lda #BANK(chr_data) / 2 ; bank with CHR jsr select_prg_bank lda #LOW(chr_data) sta COPY_SOURCE_ADDR @@ -284,21 +295,136 @@ load_base_chr: jsr load_chr rts -load_base_pal: - ; loading palette into $3F00 of PPU - lda #$3F - sta PPUADDR - lda #$00 - sta PPUADDR +preload_base_palette: + ; loading palette into palette cache + lda #BANK(tilepal) / 2 ; bank with palette + jsr select_prg_bank ldx #$00 .loop: lda tilepal, x - sta PPUDATA + sta PALETTE_CACHE, x + inx + cpx #32 + bne .loop + rts + + ; loading palette from cache to PPU +load_palette: + jsr waitblank_simple + lda #LOW(PALETTE_CACHE) + sta <COPY_SOURCE_ADDR + lda #HIGH(PALETTE_CACHE) + sta <COPY_SOURCE_ADDR+1 + lda #$3F + sta $2006 + lda #$00 + sta $2006 + ldy #$00 + ldx #32 +.loop: + lda [COPY_SOURCE_ADDR], y + sta $2007 + iny + dex + bne .loop + jsr scroll_fix + rts + +;load_base_pal: + ; loading palette into $3F00 of PPU + ;lda #$3F + ;sta PPUADDR + ;lda #$00 + ;sta PPUADDR + ;ldx #$00 +;.loop: + ;lda tilepal, x + ;sta PPUDATA + ;inx + ;cpx #32 + ;bne .loop + ;rts + +dim: + ; dimming preloaded palette + ldx #0 +.loop: + lda PALETTE_CACHE, x + sec + sbc #$10 + bpl .not_minus + lda #$1D +.not_minus: + cmp #$0D + bne .not_very_black + lda #$1D +.not_very_black: + sta PALETTE_CACHE, x inx cpx #32 bne .loop rts + ; dimming base palette in +dim_base_palette_in: + lda BUTTONS + bne .done ; skip if any button pressed + .if ENABLE_DIM_IN!=0 + jsr preload_base_palette + jsr dim + jsr dim + jsr dim + jsr load_palette + ldx #DIM_IN_DELAY + jsr waitblank_x + lda BUTTONS + bne .done ; skip if any button pressed + jsr preload_base_palette + jsr dim + jsr dim + jsr load_palette + ldx #DIM_IN_DELAY + jsr waitblank_x + lda BUTTONS + bne .done ; skip if any button pressed + jsr preload_base_palette + jsr dim + jsr load_palette + ldx #DIM_IN_DELAY + jsr waitblank_x + .endif +.done: + jsr preload_base_palette + jsr load_palette + jsr waitblank + rts + + ; dimming base palette out in +dim_base_palette_out: + .if ENABLE_DIM_OUT!=0 + jsr preload_base_palette + jsr dim + jsr load_palette + ldx #DIM_OUT_DELAY + jsr waitblank_x + jsr preload_base_palette + jsr dim + jsr dim + jsr load_palette + ldx #DIM_OUT_DELAY + jsr waitblank_x + jsr preload_base_palette + jsr dim + jsr dim + jsr dim + jsr load_palette + ldx #DIM_OUT_DELAY + jsr waitblank_x + .endif + jsr load_black + jsr waitblank + rts + ; loading empty black palette into $3F00 of PPU load_black: ; waiting for vblank @@ -357,7 +483,7 @@ sprite_dma_copy: ; loading header (image on the top), first part draw_header1: - lda #$06 + lda #BANK(nametable_header) / 2 ; bank with header jsr select_prg_bank ldx #0 ldy #$40 @@ -371,7 +497,7 @@ draw_header1: ; loading header (image on the top), second part draw_header2: - lda #$06 + lda #BANK(nametable_header) / 2 ; bank with header jsr select_prg_bank ldx #$40 ldy #$40 @@ -631,8 +757,6 @@ set_line_attributes: bne .set_attribute_address rts .set_attribute_address: - lda #6 - jsr select_prg_bank ; calculating attributes address lda <TEXT_DRAW_ROW cmp #LINES_PER_SCREEN @@ -691,6 +815,8 @@ 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 @@ -708,6 +834,8 @@ 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 @@ -1068,17 +1196,17 @@ stars: rts .endif -load_text_palette: +load_text_attributes: lda #$23 sta PPUADDR lda #$C8 sta PPUADDR lda #$FF ldy #$38 -.print_warning_palette: +.loop: sta PPUDATA dey - bne .print_warning_palette + bne .loop rts ; print null-terminated string from [COPY_SOURCE_ADDR] @@ -1099,6 +1227,7 @@ saving_warning_show: sta PPUCTRL sta PPUMASK jsr waitblank_simple + ; print text jsr clear_screen lda #$21 sta PPUADDR @@ -1109,26 +1238,21 @@ saving_warning_show: lda #HIGH(string_saving) sta COPY_SOURCE_ADDR+1 jsr print_text - jsr load_text_palette - jsr waitblank_simple - bit PPUSTATUS - lda #0 - sta PPUSCROLL - sta PPUSCROLL + jsr load_text_attributes + ; enable PPU lda #%00001000 sta PPUCTRL lda #%00001010 sta PPUMASK - jsr waitblank_simple + jsr dim_base_palette_in rts ; hide this message (clear screen) saving_warning_hide: + jsr dim_base_palette_out lda #%00000000 ; disable PPU sta PPUCTRL sta PPUMASK - jsr waitblank_simple - jsr clear_screen rts detect_chr_ram_size: @@ -1204,3 +1328,4 @@ detect_chr_ram_size: sta PPUDATA jsr disable_chr_write rts + |