From 44771793b228f95a8c4d53cf8fd7219515c51bca Mon Sep 17 00:00:00 2001 From: Alexey 'Cluster' Avdyukhin Date: Fri, 6 Nov 2020 12:37:41 +0300 Subject: New images, race condition fix --- Makefile | 78 +++++++++++++++++++++++++---- Mapper/WarfaceMapper.qsf | 41 +++++++++++++++- Mapper/WarfaceMapper.v | 32 ++++++------ bank0_subroutines.asm | 118 ++++++++++++++++++++++++++++++-------------- buttons.asm | 1 - images/buhanka.gif | Bin 0 -> 14414 bytes images/chernobyl.gif | Bin 0 -> 13409 bytes images/credits.png | Bin 3272 -> 8620 bytes images/myatej.gif | Bin 0 -> 14923 bytes images/sindikat.gif | Bin 0 -> 11067 bytes images/symbols.png | Bin 2435 -> 3589 bytes nametables.asm | 10 ++++ text/0_3.txt | 10 +++- tools_sources/NesTiler | 2 +- warface.asm | 125 ++++++++++++++++++++++++++++++++++++++--------- 15 files changed, 330 insertions(+), 87 deletions(-) create mode 100644 images/buhanka.gif create mode 100644 images/chernobyl.gif create mode 100644 images/myatej.gif create mode 100644 images/sindikat.gif diff --git a/Makefile b/Makefile index ec447e5..d18b64d 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,72 @@ +STORY?=1 + +ifeq ($(STORY),1) + FRAME_0_IMAGE=images/pagoda.jpg + FRAME_1_IMAGE=images/myatej.gif + FRAME_2_IMAGE=images/glaza.jpg + TEXT_0=text/0_0.txt + TEXT_1=text/0_1.txt + TEXT_2=text/0_2.txt + TEXT_3=text/0_3.txt +endif +ifeq ($(STORY),2) + FRAME_0_IMAGE=images/rayon4.jpg + FRAME_1_IMAGE=images/sputnik.jpg + FRAME_2_IMAGE=images/sindikat.gif + TEXT_0=text/1_0.txt + TEXT_1=text/1_1.txt + TEXT_2=text/1_2.txt + TEXT_3=text/1_3.txt +endif +ifeq ($(STORY),3) + FRAME_0_IMAGE=images/buhanka.gif + FRAME_1_IMAGE=images/chernobyl.gif + FRAME_2_IMAGE=images/sworm.jpg + TEXT_0=text/2_0.txt + TEXT_1=text/2_1.txt + TEXT_2=text/2_2.txt + TEXT_3=text/2_3.txt +endif +ifeq ($(STORY),4) + FRAME_0_IMAGE=images/gorgona.jpg + FRAME_1_IMAGE=images/dira.jpg + FRAME_2_IMAGE=images/sworm.jpg + TEXT_0=text/3_0.txt + TEXT_1=text/3_1.txt + TEXT_2=text/3_2.txt + TEXT_3=text/3_3.txt +endif +ifeq ($(STORY),5) + FRAME_0_IMAGE=images/shkola.jpg + FRAME_1_IMAGE=images/zapravka.jpg + FRAME_2_IMAGE=images/sputnik.jpg + TEXT_0=text/4_0.txt + TEXT_1=text/4_1.txt + TEXT_2=text/4_2.txt + TEXT_3=text/4_3.txt +endif +ifeq ($(STORY),6) + FRAME_0_IMAGE=images/trailer-park.jpg + FRAME_1_IMAGE=images/belaya_akula.jpg + FRAME_2_IMAGE=images/sworm.jpg + TEXT_0=text/5_0.txt + TEXT_1=text/5_1.txt + TEXT_2=text/5_2.txt + TEXT_3=text/5_3.txt +endif +ifeq ($(STORY),7) + FRAME_0_IMAGE=images/myatej.gif + FRAME_1_IMAGE=images/trailer-park.jpg + FRAME_2_IMAGE=images/zapravka.jpg + TEXT_0=text/6_0.txt + TEXT_1=text/6_1.txt + TEXT_2=text/6_2.txt + TEXT_3=text/6_3.txt +endif + TITLE_IMAGE=images/logo_warface.jpg -FRAME_0_IMAGE=images/pagoda.jpg -FRAME_1_IMAGE=images/myatej.jpg -FRAME_2_IMAGE=images/glaza.jpg -TEXT_0=text/0_0.txt -TEXT_1=text/0_1.txt -TEXT_2=text/0_2.txt -TEXT_3=text/0_3.txt CREDITS_IMAGE=images/credits.png +SYMBOLS_IMAGE=images/symbols.png NESASM=tools/NESASM.EXE EMU=fceux @@ -18,12 +78,12 @@ INCLUDES=bank0_subroutines.asm nametables.asm patterns.asm buttons.asm EXECUTABLE=warface.nes MUSIC=Warface-11.nsf MUSIC_BIN=music.bin -SYMBOLS_IMAGE=images/symbols.png TITLE_IMAGE_0=title_0.png TITLE_IMAGE_1=title_1.png TITLE_IMAGE_2=title_2.png TITLE_IMAGE_3=title_3.png + TITLE_PATTERN_0=title_pattern_0.bin TITLE_PATTERN_1=title_pattern_1.bin TITLE_PATTERN_2=title_pattern_2.bin @@ -133,7 +193,7 @@ TEXT_3_BIN=text_3.bin SYMBOLS_PATTERN=symbols_pattern.bin SYMBOLS_PALETTE=symbols_palette.bin -all: $(SOURCE) $(EXECUTABLE) +all: $(EXECUTABLE) $(EXECUTABLE): $(SOURCE) $(INCLUDES) $(MUSIC_BIN) \ $(TITLE_PATTERN_0) $(TITLE_PATTERN_1) $(TITLE_PATTERN_2) $(TITLE_PATTERN_3) \ diff --git a/Mapper/WarfaceMapper.qsf b/Mapper/WarfaceMapper.qsf index 1c7c2dc..60cc56f 100644 --- a/Mapper/WarfaceMapper.qsf +++ b/Mapper/WarfaceMapper.qsf @@ -48,4 +48,43 @@ set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 set_global_assignment -name EDA_DESIGN_ENTRY_SYNTHESIS_TOOL Custom set_global_assignment -name EDA_INPUT_DATA_FORMAT "VERILOG HDL" -section_id eda_design_synthesis -set_global_assignment -name VERILOG_FILE WarfaceMapper.v \ No newline at end of file +set_global_assignment -name VERILOG_FILE WarfaceMapper.v +set_global_assignment -name MAX7000_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_location_assignment PIN_12 -to prg_ce +set_location_assignment PIN_61 -to ppu_addr_out[10] +set_location_assignment PIN_63 -to chr_oe +set_location_assignment PIN_64 -to ppu_addr_out[11] +set_location_assignment PIN_67 -to ppu_addr_out[13] +set_location_assignment PIN_68 -to ppu_addr_out[12] +set_location_assignment PIN_69 -to ppu_addr_out[14] +set_location_assignment PIN_71 -to ppu_addr_out[15] +set_location_assignment PIN_75 -to ppu_addr_out[16] +set_location_assignment PIN_76 -to ppu_addr_in[13] +set_location_assignment PIN_79 -to ppu_addr_in[12] +set_location_assignment PIN_80 -to ppu_addr_in[11] +set_location_assignment PIN_81 -to ppu_addr_in[10] +set_location_assignment PIN_83 -to chr_prog +set_location_assignment PIN_84 -to ppu_wr +set_location_assignment PIN_85 -to ciram_a10 +set_location_assignment PIN_87 -to ppu_rd +set_location_assignment PIN_88 -to cpu_rw +set_location_assignment PIN_89 -to romsel +set_location_assignment PIN_90 -to m2 +set_location_assignment PIN_92 -to irq +set_location_assignment PIN_93 -to cpu_data[0] +set_location_assignment PIN_94 -to cpu_data[1] +set_location_assignment PIN_96 -to cpu_data[2] +set_location_assignment PIN_97 -to cpu_data[3] +set_location_assignment PIN_98 -to cpu_data[4] +set_location_assignment PIN_99 -to cpu_data[5] +set_location_assignment PIN_100 -to cpu_data[6] +set_location_assignment PIN_6 -to cpu_data[7] +set_location_assignment PIN_8 -to cpu_a14 +set_location_assignment PIN_9 -to cpu_a13 +set_location_assignment PIN_10 -to cpu_a0 +set_location_assignment PIN_13 -to prg_oe +set_location_assignment PIN_14 -to prg_addr[13] +set_location_assignment PIN_19 -to prg_addr[16] +set_location_assignment PIN_17 -to prg_addr[14] +set_location_assignment PIN_16 -to prg_addr[15] +set_location_assignment PIN_20 -to prg_prog \ No newline at end of file diff --git a/Mapper/WarfaceMapper.v b/Mapper/WarfaceMapper.v index 4a71b05..0d98614 100644 --- a/Mapper/WarfaceMapper.v +++ b/Mapper/WarfaceMapper.v @@ -15,8 +15,8 @@ module WarfaceMapper output prg_oe, output prg_prog, - input [13:10] ppu_addr, - output [16:10] chr_addr, + input [13:10] ppu_addr_in, + output [16:10] ppu_addr_out, output chr_ce, output chr_oe, output chr_prog, @@ -41,35 +41,35 @@ assign prg_addr = cpu_a14 ? {3'b111, cpu_a13} // fixed last bank @ $C000-$FFFF : {prg_bank, cpu_a13}; // selectable @ $8000-$BFFF -assign chr_ce = ppu_addr[13]; -assign chr_oe = ppu_addr[13] | ppu_rd; -assign chr_prog = ppu_addr[13] | ppu_wr; +assign chr_ce = ppu_addr_in[13]; +assign chr_oe = ppu_addr_in[13] | ppu_rd; +assign chr_prog = ppu_addr_in[13] | ppu_wr; reg prg_auto_switch = 0; reg [4:0] chr_bank; reg [1:0] chr_latch; -assign chr_addr[16:10] = !ppu_addr[12] +assign ppu_addr_out[16:10] = !ppu_addr_in[12] ? ( prg_auto_switch - ? {chr_bank[4:2], chr_latch[1:0], ppu_addr[11:10]} // $0000-$0FFF is autoswitchable - : {chr_bank[4:0], ppu_addr[11:10]} // $0000-$0FFF is switchable manually + ? {chr_bank[4:2], chr_latch[1:0], ppu_addr_in[11:10]} // $0000-$0FFF is autoswitchable + : {chr_bank[4:0], ppu_addr_in[11:10]} // $0000-$0FFF is switchable manually ) - : {5'b11111, ppu_addr[11:10]}; // $1000-$1FFF is fixed to last + : {5'b11111, ppu_addr_in[11:10]}; // $1000-$1FFF is fixed to last -assign ciram_a10 = ppu_addr[10]; // horizontal mirroring +assign ciram_a10 = ppu_addr_in[11]; // horizontal mirroring -reg [11:0] timer = 0; +reg [13:0] timer = 0; reg timer_elapsed = 0; assign irq = timer_elapsed ? 1'b0 : 1'bZ; always @ (negedge m2) begin - if (timer > 0) + if (timer != 0) begin - timer = timer - 1; + timer = timer - 1'b1; if (timer == 0) timer_elapsed = 1; end - if (!romsel && !cpu_rw && cpu_a13 && cpu_a14) // write to $6000-$7FFF + if (romsel && !cpu_rw && cpu_a13 && cpu_a14) // write to $6000-$7FFF begin if (!cpu_a0) begin // even @@ -110,16 +110,16 @@ begin new_screen_clear = 1; chr_latch = 0; end else - if (ppu_addr[13:12] == 2'b10) + if (ppu_addr_in[13:12] == 2'b10) begin if (ppu_nt_read_count < 3) begin ppu_nt_read_count = ppu_nt_read_count + 1'b1; end else begin - scanline = scanline + 1'b1; if (scanline == 64) chr_latch = 1; if (scanline == 128) chr_latch = 2; if (scanline == 192) chr_latch = 3; + scanline = scanline + 1'b1; end end else begin ppu_nt_read_count = 0; diff --git a/bank0_subroutines.asm b/bank0_subroutines.asm index 3f7a5f4..f3333ae 100644 --- a/bank0_subroutines.asm +++ b/bank0_subroutines.asm @@ -3,8 +3,9 @@ .org $8000 init: - lda #%00000000 ; выключаем пока что PPU + lda #%10000000 ; выключаем пока что PPU, но оставляем NMI sta PPUCTRL + lda #%00000000 sta PPUMASK jsr wait_blank_simple jsr load_black ; делаем экран чёрным @@ -22,6 +23,7 @@ init: lda #0 sta OAMADDR + lda #$FF ldx #0 .clean_oam_next: sta OAMDATA @@ -190,11 +192,13 @@ dim_in_s: jsr dim jsr dim jsr load_palette - jsr wait_blank5 + ldx #5 + jsr wait_blank_x jsr preload_palette jsr dim jsr load_palette - jsr wait_blank5 + ldx #5 + jsr wait_blank_x jsr preload_palette jsr load_palette jsr wait_blank @@ -204,18 +208,21 @@ dim_out_s: jsr preload_palette jsr dim jsr load_palette - jsr wait_blank5 + ldx #5 + jsr wait_blank_x jsr preload_palette jsr dim jsr dim jsr load_palette - jsr wait_blank5 + ldx #5 + jsr wait_blank_x jsr preload_palette jsr dim jsr dim jsr dim jsr load_palette - jsr wait_blank5 + ldx #5 + jsr wait_blank_x jsr load_black jsr wait_blank rts @@ -235,14 +242,17 @@ print_text: sta PAL_SOURCE_ADDR+1 jsr preload_palette jsr load_palette - lda #2 + lda #3 sta TEXT_LINE lda #1 sta TEXT_POS + sta SPRITES_ENABLED lda #0 sta TEXT_NAMETABLE sta TEXT_SCROLL_STARTED jsr reset_scroll + jsr wait_blank_simple + jsr enable_ppu .next_char: ldy #0 lda [TEXT_SOURCE_ADDR], y @@ -255,6 +265,8 @@ print_text: .not_next_line: ; печатаем символ jsr symbol_print + lda KONAMI_CODE_TRIGGERED + bne .exit_to_credits .inc_source_pos: inc TEXT_SOURCE_ADDR bne .inc_text_pos @@ -263,13 +275,33 @@ print_text: inc TEXT_POS jmp .next_char .end: + lda THE_END + beq .not_the_end +.endless_loop: + jsr wait_blank + lda KONAMI_CODE_TRIGGERED + bne .exit_to_credits + jmp .endless_loop +.not_the_end + jsr wait_buttons_not_pressed jsr wait_any_button lda #LOW(symbols_palette) sta PAL_SOURCE_ADDR lda #HIGH(symbols_palette) sta PAL_SOURCE_ADDR+1 jsr dim_out + lda #0 + sta SPRITES_ENABLED rts +.exit_to_credits: + lda #LOW(symbols_palette) + sta PAL_SOURCE_ADDR + lda #HIGH(symbols_palette) + sta PAL_SOURCE_ADDR+1 + jsr dim_out + lda #0 + sta SPRITES_ENABLED + jmp credits ; определяем адрес, куда писать символ symbol_address: @@ -310,32 +342,11 @@ symbol_print: ; при удержании любой кнопки ускоряем lda BUTTONS bne .skip_sprite_draw - ; подготавливаем палитру спрайтов - lda #LOW(symbols_palette) - sta PAL_SOURCE_ADDR - lda #HIGH(symbols_palette) - sta PAL_SOURCE_ADDR+1 - jsr preload_palette - jsr dim - jsr dim - jsr dim - jsr load_sprite_palette - + ; настраиваем спрайт - lda #0 - sta OAMADDR - lda TEXT_LINE - asl A - asl A - asl A - sec - sbc SCROLL_POS - bcs .not_ovf - sec - sbc #16 -.not_ovf + jsr wait_blank + lda #$FF sta OAMDATA - pla sta OAMDATA pha @@ -346,28 +357,32 @@ symbol_print: asl A asl A sta OAMDATA + jsr wait_blank ; плавно увеличиваем яркость jsr preload_palette jsr dim jsr dim - jsr load_sprite_palette jsr wait_blank + jsr .set_sprite_y + jsr load_sprite_palette jsr preload_palette jsr dim - jsr load_sprite_palette jsr wait_blank + jsr .set_sprite_y + jsr load_sprite_palette +.skip_sprite_draw: ; скрываем спрайт + jsr wait_blank lda #0 sta OAMADDR - ldx #$FF + lda #$FF sta OAMDATA - -.skip_sprite_draw: ; вычисляем адреса + ;jsr wait_blank jsr symbol_address pla ; печатаем символ @@ -375,6 +390,30 @@ symbol_print: jsr wait_blank rts +.set_sprite_y: + lda #0 + sta OAMADDR + lda TEXT_LINE + asl A + asl A + asl A + sec + sbc SCROLL_POS + bcs .not_ovf + sec + sbc #16 +.not_ovf + sec + sbc #1 + ldx SCROLL_POS + cpx SCROLL_TARGET_POS + beq .not_scrolling + sec + sbc #1 +.not_scrolling: + sta OAMDATA + rts + ; переход на следующую строку next_line: jsr wait_blank @@ -416,6 +455,7 @@ next_line: sta SCROLL_TARGET_POS ; очищаем строку на противоположном nametable .clear_line: + jsr wait_blank bit PPUSTATUS lda TEXT_NAMETABLE bne .second_nametable @@ -476,6 +516,12 @@ frame_2_palette: .incbin "frame_2_palette_2.bin" .incbin "frame_2_palette_3.bin" +credits_palette: + .incbin "credits_palette_0.bin" + .incbin "credits_palette_1.bin" + .incbin "credits_palette_2.bin" + .incbin "credits_palette_3.bin" + symbols_palette: .incbin "symbols_palette.bin" .db 0, 0, 0, 0 diff --git a/buttons.asm b/buttons.asm index ed83074..f42b777 100644 --- a/buttons.asm +++ b/buttons.asm @@ -18,7 +18,6 @@ read_controller: ; real controller read, stores buttons to BUTTONS_TMP .real: - ;php lda #1 sta $4016 lda #0 diff --git a/images/buhanka.gif b/images/buhanka.gif new file mode 100644 index 0000000..8a5e435 Binary files /dev/null and b/images/buhanka.gif differ diff --git a/images/chernobyl.gif b/images/chernobyl.gif new file mode 100644 index 0000000..69ad672 Binary files /dev/null and b/images/chernobyl.gif differ diff --git a/images/credits.png b/images/credits.png index a2600a8..d6fc648 100644 Binary files a/images/credits.png and b/images/credits.png differ diff --git a/images/myatej.gif b/images/myatej.gif new file mode 100644 index 0000000..5fc7153 Binary files /dev/null and b/images/myatej.gif differ diff --git a/images/sindikat.gif b/images/sindikat.gif new file mode 100644 index 0000000..6a5075c Binary files /dev/null and b/images/sindikat.gif differ diff --git a/images/symbols.png b/images/symbols.png index 0a7a423..9a9cabf 100644 Binary files a/images/symbols.png and b/images/symbols.png differ diff --git a/nametables.asm b/nametables.asm index 6010a1e..28f82c2 100644 --- a/nametables.asm +++ b/nametables.asm @@ -40,3 +40,13 @@ frame_2_name_table: .incbin "frame_2_attr_table_1.bin" .incbin "frame_2_attr_table_2.bin" .incbin "frame_2_attr_table_3.bin" + +credits_name_table: + .incbin "credits_name_table_0.bin" + .incbin "credits_name_table_1.bin" + .incbin "credits_name_table_2.bin" + .incbin "credits_name_table_3.bin" + .incbin "credits_attr_table_0.bin" + .incbin "credits_attr_table_1.bin" + .incbin "credits_attr_table_2.bin" + .incbin "credits_attr_table_3.bin" diff --git a/text/0_3.txt b/text/0_3.txt index fea9dd4..de92c2a 100644 --- a/text/0_3.txt +++ b/text/0_3.txt @@ -1,5 +1,13 @@ + + + + + + + + Тот, кто это прочтет. Не знаю, что со мной будет. Голоса в моей голове. Много голосов, похожих на жужжание жуков. -SWAAARRM. Что бы это могло значить? +*SWAAARRM*. Что бы это могло значить? diff --git a/tools_sources/NesTiler b/tools_sources/NesTiler index 24d6fc8..51a2214 160000 --- a/tools_sources/NesTiler +++ b/tools_sources/NesTiler @@ -1 +1 @@ -Subproject commit 24d6fc8baa4ecb687418f1d0ebf94ecfafed3f23 +Subproject commit 51a221465abe4412cbb550ac8aac9cf3dbe31406 diff --git a/warface.asm b/warface.asm index 504fb48..ae35a6b 100644 --- a/warface.asm +++ b/warface.asm @@ -20,11 +20,13 @@ PPUDATA .equ $2007 OAMDMA .equ $4014 .rsset $0020 ; адрес для переменных +FRAMES .rs 1 ; счётчик NMI ACTIVE_BANK .rs 1 ; текущий PRG банк CONSOLE_TYPE .rs 1 ; тип консоли COPY_SOURCE_ADDR .rs 2 ; исходный адрес для копирования данный PAL_SOURCE_ADDR .rs 2 ; исходный адрес для загрузки палитры PALETTE_CACHE .rs 16 ; кеш для временного хранения палитры +SPRITES_ENABLED .rs 1 ; включены ли спрайты TEXT_SOURCE_ADDR .rs 2 ; исходный адрес текста TEXT_LINE .rs 1 ; текущая строка текста на экране TEXT_POS .rs 2 ; текущая позиция текста в строке @@ -33,6 +35,7 @@ TEXT_SCROLL_STARTED .rs 1 ; флаг, что запущен автоскролл SCROLL_POS .rs 1 ; текущая позиция скроллинга SCROLL_NT .rs 1 ; текущий nametable скроллинга SCROLL_TARGET_POS .rs 1 ; целевая позиция скроллинга +THE_END .rs 1 ; флаг, что пора зациклить .bank 12 ; PRG банк #12, середина PRG .org $9213 @@ -62,9 +65,12 @@ Start: jsr select_prg_bank lda #0 ; номер трека ; в регистре X задаётся регион: PAL или NTSC - ldx CONSOLE_TYPE + ldx #CONSOLE_TYPE jsr $A999 ; Инициализируем музыкальный проигрыватель + ldx #30 + jsr wait_blank_x + jsr disable_ppu ; обнуляем скроллинг jsr reset_scroll @@ -96,16 +102,6 @@ Start: ; убавляем яркость jsr dim_out - jsr wait_blank - ; отображаем текст - lda #LOW(text_0) - sta TEXT_SOURCE_ADDR - lda #HIGH(text_0) - sta TEXT_SOURCE_ADDR+1 - lda #0 - jsr select_prg_bank - jsr print_text - jsr wait_blank jsr disable_ppu ; обнуляем скроллинг @@ -139,9 +135,9 @@ Start: jsr wait_blank ; отображаем текст - lda #LOW(text_1) + lda #LOW(text_0) sta TEXT_SOURCE_ADDR - lda #HIGH(text_1) + lda #HIGH(text_0) sta TEXT_SOURCE_ADDR+1 lda #0 jsr select_prg_bank @@ -178,6 +174,47 @@ Start: ; убавляем яркость jsr dim_out + jsr wait_blank + ; отображаем текст + lda #LOW(text_1) + sta TEXT_SOURCE_ADDR + lda #HIGH(text_1) + sta TEXT_SOURCE_ADDR+1 + lda #0 + jsr select_prg_bank + jsr print_text + + jsr wait_blank + jsr disable_ppu + ; обнуляем скроллинг + jsr reset_scroll + ; загружаем nametable + lda #BANK(frame_2_name_table)/2 + jsr select_prg_bank + lda #LOW(frame_2_name_table) + sta COPY_SOURCE_ADDR + lda #HIGH(frame_2_name_table) + sta COPY_SOURCE_ADDR+1 + jsr load_name_table + ; выбираем CHR банк с автопереключением + lda #(BANK(frame_2_pattern)-16)/2 + jsr select_chr_bank + ; включаем PPU + jsr enable_ppu + ; загружаем палитру + lda #0 + jsr select_prg_bank + lda #LOW(frame_2_palette) + sta PAL_SOURCE_ADDR + lda #HIGH(frame_2_palette) + sta PAL_SOURCE_ADDR+1 + ; плавно прибавляем яркость + jsr dim_in + ; ждём любую кнопку + jsr wait_any_button + ; убавляем яркость + jsr dim_out + jsr wait_blank ; отображаем текст lda #LOW(text_2) @@ -226,11 +263,42 @@ Start: sta TEXT_SOURCE_ADDR+1 lda #0 jsr select_prg_bank + lda #1 + sta THE_END jsr print_text + + ; конец -main_loop: + ; авторы проекта +credits: + jsr disable_ppu + ; обнуляем скроллинг + jsr reset_scroll + ; загружаем nametable + lda #BANK(credits_name_table)/2 + jsr select_prg_bank + lda #LOW(credits_name_table) + sta COPY_SOURCE_ADDR + lda #HIGH(credits_name_table) + sta COPY_SOURCE_ADDR+1 + jsr load_name_table + ; выбираем CHR банк с автопереключением + lda #(BANK(credits_pattern)-16)/2 + jsr select_chr_bank + ; включаем PPU + jsr enable_ppu + ; загружаем палитру + lda #0 + jsr select_prg_bank + lda #LOW(credits_palette) + sta PAL_SOURCE_ADDR + lda #HIGH(credits_palette) + sta PAL_SOURCE_ADDR+1 + ; плавно прибавляем яркость + jsr dim_in +.loop: jsr wait_blank - jmp main_loop + jmp .loop IRQ: php @@ -269,7 +337,8 @@ NMI: txa pha - ; запускаем таймер, чтобы потом играть музыку + inc FRAMES + ; активируем прерывание lda ACTIVE_BANK ora #%10000000 sta $6000 @@ -309,7 +378,11 @@ enable_ppu: lda #%10000010 .write_ppuctrl sta PPUCTRL - lda #%00011110 + lda #%00001110 + ldx SPRITES_ENABLED + beq .sprites_disabled + ora #%00010000 +.sprites_disabled: sta PPUMASK jsr wait_blank_simple rts @@ -322,13 +395,19 @@ disable_ppu: jsr wait_blank_simple rts + ; субрутина простого ожидания vblank +wait_blank_ppu_status: + bit PPUSTATUS + bpl wait_blank_ppu_status + rts + ; субрутина простого ожидания vblank wait_blank_simple: pha - bit PPUSTATUS + lda FRAMES .loop: - lda PPUSTATUS ; load A with value at location $2002 - bpl .loop ; if bit 7 is not set (not VBlank) keep checking + cmp FRAMES + beq .loop pla rts @@ -364,8 +443,7 @@ wait_blank: pla rts -wait_blank5: - ldx #5 +wait_blank_x: .loop: jsr wait_blank dex @@ -419,8 +497,11 @@ wait_buttons_not_pressed: ; waiting for any button pressed wait_any_button: jsr wait_blank ; waiting for v-blank + lda KONAMI_CODE_TRIGGERED + bne .end lda