Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/nes-warface.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2020-11-06 12:37:41 +0300
committerAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2020-11-06 12:37:41 +0300
commit44771793b228f95a8c4d53cf8fd7219515c51bca (patch)
treeccf4598e13f42614867d521b6dc272dc7073e2d2
parent8aee7b8188ac6064dc1c5852e0b96a852bd97456 (diff)
New images, race condition fix
-rw-r--r--Makefile78
-rw-r--r--Mapper/WarfaceMapper.qsf41
-rw-r--r--Mapper/WarfaceMapper.v32
-rw-r--r--bank0_subroutines.asm118
-rw-r--r--buttons.asm1
-rw-r--r--images/buhanka.gifbin0 -> 14414 bytes
-rw-r--r--images/chernobyl.gifbin0 -> 13409 bytes
-rw-r--r--images/credits.pngbin3272 -> 8620 bytes
-rw-r--r--images/myatej.gifbin0 -> 14923 bytes
-rw-r--r--images/sindikat.gifbin0 -> 11067 bytes
-rw-r--r--images/symbols.pngbin2435 -> 3589 bytes
-rw-r--r--nametables.asm10
-rw-r--r--text/0_3.txt10
m---------tools_sources/NesTiler0
-rw-r--r--warface.asm125
15 files changed, 329 insertions, 86 deletions
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
--- /dev/null
+++ b/images/buhanka.gif
Binary files differ
diff --git a/images/chernobyl.gif b/images/chernobyl.gif
new file mode 100644
index 0000000..69ad672
--- /dev/null
+++ b/images/chernobyl.gif
Binary files differ
diff --git a/images/credits.png b/images/credits.png
index a2600a8..d6fc648 100644
--- a/images/credits.png
+++ b/images/credits.png
Binary files differ
diff --git a/images/myatej.gif b/images/myatej.gif
new file mode 100644
index 0000000..5fc7153
--- /dev/null
+++ b/images/myatej.gif
Binary files differ
diff --git a/images/sindikat.gif b/images/sindikat.gif
new file mode 100644
index 0000000..6a5075c
--- /dev/null
+++ b/images/sindikat.gif
Binary files differ
diff --git a/images/symbols.png b/images/symbols.png
index 0a7a423..9a9cabf 100644
--- a/images/symbols.png
+++ b/images/symbols.png
Binary files 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
-Subproject 24d6fc8baa4ecb687418f1d0ebf94ecfafed3f2
+Subproject 51a221465abe4412cbb550ac8aac9cf3dbe3140
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
@@ -97,16 +103,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
; обнуляем скроллинг
jsr reset_scroll
@@ -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
@@ -180,6 +176,47 @@ Start:
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)
sta TEXT_SOURCE_ADDR
lda #HIGH(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
@@ -323,12 +396,18 @@ disable_ppu:
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 <BUTTONS
beq wait_any_button
+.end
rts
.include "bank0_subroutines.asm"