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 20:14:09 +0300
committerAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2020-11-06 20:14:09 +0300
commitf65fd9057469bb859e2a7d67e28970e4e9782e1d (patch)
tree7eef936a2c5de502632a291473104aca51755c02
parent8b0b463f4fded396a6ad90874f8766f769f05e35 (diff)
Refactoring, logo
-rw-r--r--Makefile34
-rw-r--r--bank0_subroutines.asm563
-rw-r--r--clean.asm121
-rw-r--r--dimming.asm147
-rw-r--r--images/dira.gifbin0 -> 16250 bytes
-rw-r--r--images/glaza.gifbin0 -> 3315 bytes
-rw-r--r--images/gorgona.gifbin0 -> 7117 bytes
-rw-r--r--images/sworm.gifbin0 -> 14057 bytes
-rw-r--r--images/symbols.pngbin4005 -> 4010 bytes
-rw-r--r--images/warface_logo_small.pngbin0 -> 1680 bytes
-rw-r--r--nametables.asm3
-rw-r--r--patterns.asm2
-rw-r--r--sprites.asm75
-rw-r--r--text.asm279
-rw-r--r--text/1_0.txt23
-rw-r--r--text/1_1.txt31
-rw-r--r--text/1_2.txt27
-rw-r--r--text/1_3.txt12
-rw-r--r--text/2_0.txt13
-rw-r--r--text/2_1.txt31
-rw-r--r--text/2_2.txt13
-rw-r--r--text/2_3.txt13
-rw-r--r--text/3_0.txt29
-rw-r--r--text/3_1.txt35
-rw-r--r--text/3_2.txt5
-rw-r--r--text/3_3.txt14
-rw-r--r--text/4_0.txt19
-rw-r--r--text/4_1.txt33
-rw-r--r--text/4_2.txt13
-rw-r--r--text/4_3.txt12
-rw-r--r--text/5_0.txt9
-rw-r--r--text/5_1.txt25
-rw-r--r--text/5_2.txt19
-rw-r--r--text/5_3.txt11
-rw-r--r--text/6_0.txt19
-rw-r--r--text/6_1.txt15
-rw-r--r--text/6_2.txt15
-rw-r--r--text/6_3.txt15
-rw-r--r--tools/EraseCheck.cs65
-rw-r--r--tools/WriteWarface.cs65
-rw-r--r--warface.asm93
41 files changed, 1298 insertions, 600 deletions
diff --git a/Makefile b/Makefile
index d18b64d..42a20a4 100644
--- a/Makefile
+++ b/Makefile
@@ -1,9 +1,9 @@
-STORY?=1
+STORY?=3
ifeq ($(STORY),1)
FRAME_0_IMAGE=images/pagoda.jpg
FRAME_1_IMAGE=images/myatej.gif
- FRAME_2_IMAGE=images/glaza.jpg
+ FRAME_2_IMAGE=images/glaza.gif
TEXT_0=text/0_0.txt
TEXT_1=text/0_1.txt
TEXT_2=text/0_2.txt
@@ -21,16 +21,16 @@ endif
ifeq ($(STORY),3)
FRAME_0_IMAGE=images/buhanka.gif
FRAME_1_IMAGE=images/chernobyl.gif
- FRAME_2_IMAGE=images/sworm.jpg
+ FRAME_2_IMAGE=images/sworm.gif
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
+ FRAME_0_IMAGE=images/gorgona.gif
+ FRAME_1_IMAGE=images/dira.gif
+ FRAME_2_IMAGE=images/sworm.gif
TEXT_0=text/3_0.txt
TEXT_1=text/3_1.txt
TEXT_2=text/3_2.txt
@@ -48,7 +48,7 @@ endif
ifeq ($(STORY),6)
FRAME_0_IMAGE=images/trailer-park.jpg
FRAME_1_IMAGE=images/belaya_akula.jpg
- FRAME_2_IMAGE=images/sworm.jpg
+ FRAME_2_IMAGE=images/sworm.gif
TEXT_0=text/5_0.txt
TEXT_1=text/5_1.txt
TEXT_2=text/5_2.txt
@@ -67,6 +67,7 @@ endif
TITLE_IMAGE=images/logo_warface.jpg
CREDITS_IMAGE=images/credits.png
SYMBOLS_IMAGE=images/symbols.png
+LOGO_IMAGE=images/warface_logo_small.png
NESASM=tools/NESASM.EXE
EMU=fceux
@@ -74,7 +75,7 @@ SPLITTER=tools/ImageSplitter.exe
TILER=tools/NesTiler.exe
TEXT_CONVERTER=tools/TextConverter.exe
SOURCE=warface.asm
-INCLUDES=bank0_subroutines.asm nametables.asm patterns.asm buttons.asm
+INCLUDES=clean.asm dimming.asm text.asm nametables.asm patterns.asm buttons.asm sprites.asm
EXECUTABLE=warface.nes
MUSIC=Warface-11.nsf
MUSIC_BIN=music.bin
@@ -185,6 +186,9 @@ CREDITS_PALETTE_1=credits_palette_1.bin
CREDITS_PALETTE_2=credits_palette_2.bin
CREDITS_PALETTE_3=credits_palette_3.bin
+WARFACE_PATTERN=warface_logo_pattern.bin
+WARFACE_PALETTE=warface_palette.bin
+
TEXT_0_BIN=text_0.bin
TEXT_1_BIN=text_1.bin
TEXT_2_BIN=text_2.bin
@@ -216,6 +220,7 @@ $(CREDITS_PATTERN_0) $(CREDITS_PATTERN_1) $(CREDITS_PATTERN_2) $(CREDITS_PATTERN
$(CREDITS_NAME_TABLE_0) $(CREDITS_NAME_TABLE_1) $(CREDITS_NAME_TABLE_2) $(CREDITS_NAME_TABLE_3) \
$(CREDITS_ATTR_TABLE_0) $(CREDITS_ATTR_TABLE_1) $(CREDITS_ATTR_TABLE_2) $(CREDITS_ATTR_TABLE_3) \
$(CREDITS_PALETTE_0) $(CREDITS_PALETTE_1) $(CREDITS_PALETTE_2) $(CREDITS_PALETTE_3) \
+$(WARFACE_PATTERN) $(WARFACE_PALETTE) \
$(TEXT_0_BIN) $(TEXT_1_BIN) $(TEXT_2_BIN) $(TEXT_3_BIN) $(SYMBOLS_PATTERN) $(SYMBOLS_PALETTE)
rm -f $(EXECUTABLE)
$(NESASM) $(SOURCE) -o $(EXECUTABLE) --symbols=$(EXECUTABLE) -iWss
@@ -281,6 +286,9 @@ $(CREDITS_PATTERN_0) $(CREDITS_PATTERN_1) $(CREDITS_PATTERN_2) $(CREDITS_PATTERN
--out-attribute-table0 $(CREDITS_ATTR_TABLE_0) --out-attribute-table1 $(CREDITS_ATTR_TABLE_1) --out-attribute-table2 $(CREDITS_ATTR_TABLE_2) --out-attribute-table3 $(CREDITS_ATTR_TABLE_3) \
--out-palette0 $(CREDITS_PALETTE_0) --out-palette1 $(CREDITS_PALETTE_1) --out-palette2 $(CREDITS_PALETTE_2) --out-palette3 $(CREDITS_PALETTE_3)
+$(WARFACE_PATTERN) $(WARFACE_PALETTE): $(LOGO_IMAGE)
+ $(TILER) -i0 $(LOGO_IMAGE) --mode sprites --enable-palettes 1 --out-pattern-table0 $(WARFACE_PATTERN) --out-palette1 $(WARFACE_PALETTE)
+
$(TEXT_0_BIN): $(TEXT_0)
$(TEXT_CONVERTER) $(TEXT_0) $(TEXT_0_BIN)
@@ -294,6 +302,12 @@ $(TEXT_3_BIN): $(TEXT_3)
$(TEXT_CONVERTER) $(TEXT_3) $(TEXT_3_BIN)
$(SYMBOLS_PATTERN) $(SYMBOLS_PALETTE): $(SYMBOLS_IMAGE)
- $(TILER) -i0 $(SYMBOLS_IMAGE) --enable-palettes 0 --out-pattern-table0 $(SYMBOLS_PATTERN) --out-palette0 $(SYMBOLS_PALETTE)
+ $(TILER) -i0 $(SYMBOLS_IMAGE) --enable-palettes 0 --out-pattern-table0 $(SYMBOLS_PATTERN) --out-palette0 $(SYMBOLS_PALETTE) --bgcolor #000000
+
+write: $(EXECUTABLE)
+ tools\FamicomDumper.exe script --csfile tools\WriteWarface.cs --sound
+
+erase: $(EXECUTABLE)
+ tools\FamicomDumper.exe script --csfile tools\EraseCheck.cs --sound
-.PHONY: clean
+.PHONY: clean write erase
diff --git a/bank0_subroutines.asm b/bank0_subroutines.asm
deleted file mode 100644
index 4aa8c78..0000000
--- a/bank0_subroutines.asm
+++ /dev/null
@@ -1,563 +0,0 @@
- ; далее методы в нулевом банке
- .bank 0
- .org $8000
-
-init:
- lda #%10000000 ; выключаем пока что PPU, но оставляем NMI
- sta PPUCTRL
- lda #%00000000
- sta PPUMASK
- jsr wait_blank_simple
- jsr load_black ; делаем экран чёрным
-
- ; очистка памяти
- lda #$00
- sta COPY_SOURCE_ADDR
- sta COPY_SOURCE_ADDR+1
- lda #0
- ldy #$22
-.memory_clean_loop:
- sta [COPY_SOURCE_ADDR], y
- iny
- bne .memory_clean_loop
-
- ; очистка спрайтов
- lda #LOW(SPRITES)
- sta COPY_SOURCE_ADDR
- lda #HIGH(SPRITES)
- sta COPY_SOURCE_ADDR+1
- lda #$FF
- ldy #0
-.sprites_clean_loop:
- sta [COPY_SOURCE_ADDR], y
- iny
- bne .sprites_clean_loop
- lda #0
- sta OAMADDR
- lda #HIGH(SPRITES)
- sta OAMDMA
-
- ; определяем тип консоли
- lda #%00000000 ; отключаем NMI
- sta PPUCTRL
-console_detect_init:
- bit PPUSTATUS
- bpl console_detect_init
-console_detect_loop:
- inx
- bne console_detect_s
- iny
-console_detect_s:
- bit PPUSTATUS
- bpl console_detect_loop
- lda #$01
- cpy #$09
- bne console_detect_end
- lda #$00
-console_detect_end:
- sta <CONSOLE_TYPE
- ; включаем NMI
- lda #%10000000
- sta PPUCTRL
-
- ; Обнуляем звуковые регистры
- lda #0
- sta $4000
- sta $4001
- sta $4002
- sta $4003
- sta $4004
- sta $4005
- sta $4006
- sta $4007
- sta $4009
- sta $400A
- sta $400C
- sta $400D
- sta $400E
- sta $400F
- sta $4010
- sta $4011
- sta $4012
- sta $4013
- lda #$0F
- sta $4015
- lda #$40
- sta $4017
- lda #0
-
- rts
-
- ; очищаем nametable
-clear_screen:
- lda #$20
- sta PPUADDR
- lda #$00
- sta PPUADDR
- lda #$00
- ldx #0
- ldy #$10
-.loop:
- sta PPUDATA
- inx
- bne .loop
- dey
- bne .loop
- rts
-
-load_black:
- ; загружаем пустую палитру по адресу $3F00 в PPU
- lda #$3F
- sta PPUADDR
- lda #$00
- sta PPUADDR
- ldx #$00
- lda #$1D ; чёрный цвет
-.loop:
- sta PPUDATA
- inx
- cpx #32
- bne .loop
- rts
-
- ; загружаем 16 байт палитры во временную память
-preload_palette:
- ldy #$00
- ldx #16
-.loop:
- lda [PAL_SOURCE_ADDR], y
- sta PALETTE_CACHE, y
- iny
- dex
- bne .loop
- rts
-
- ; загружаем 16 байт палитры в $3F00
-load_palette:
- 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 #16
-.loop:
- lda [COPY_SOURCE_ADDR], y
- sta $2007
- iny
- dex
- bne .loop
- bit PPUSTATUS
- rts
-
- ; загружаем 16 байт палитры в $3F10
-load_sprite_palette:
- lda #LOW(PALETTE_CACHE)
- sta <COPY_SOURCE_ADDR
- lda #HIGH(PALETTE_CACHE)
- sta <COPY_SOURCE_ADDR+1
- lda #$3F
- sta $2006
- lda #$10
- sta $2006
- ldy #$00
- ldx #16
-.loop:
- lda [COPY_SOURCE_ADDR], y
- sta $2007
- iny
- dex
- bne .loop
- bit PPUSTATUS
- rts
-
- ; затемняет загруженную палитру
-dim:
- 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 #16
- bne .loop
- rts
-
-dim_in_s:
- jsr preload_palette
- jsr dim
- jsr dim
- jsr load_palette
- ldx #5
- jsr wait_blank_x
- jsr preload_palette
- jsr dim
- jsr load_palette
- ldx #5
- jsr wait_blank_x
- jsr preload_palette
- jsr load_palette
- jsr wait_blank
- rts
-
-dim_out_s:
- jsr preload_palette
- jsr dim
- jsr load_palette
- ldx #5
- jsr wait_blank_x
- jsr preload_palette
- jsr dim
- jsr dim
- jsr load_palette
- ldx #5
- jsr wait_blank_x
- jsr preload_palette
- jsr dim
- jsr dim
- jsr dim
- jsr load_palette
- ldx #5
- jsr wait_blank_x
- jsr load_black
- jsr wait_blank
- rts
-
-print_text:
- jsr wait_blank
- ; выключаем PPU
- jsr disable_ppu
- ; выбираем последний CHR банк
- lda #%00011111
- sta $6001
- ; очищаем экран
- jsr clear_screen
- ; загружаем палитру
- lda #LOW(symbols_palette)
- sta <PAL_SOURCE_ADDR
- lda #HIGH(symbols_palette)
- sta <PAL_SOURCE_ADDR+1
- jsr preload_palette
- jsr load_palette
- 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
- beq .end
- cmp #$FF
- bne .not_next_line
- ; переходим на следующую строку
- jsr next_line
- jmp .inc_source_pos
-.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
- inc <TEXT_SOURCE_ADDR+1
-.inc_text_pos:
- 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:
- pha
- bit PPUSTATUS
- lda <TEXT_NAMETABLE
- bne .second_nametable
- lda <TEXT_LINE
- lsr A
- lsr A
- lsr A
- clc
- adc #$20
- jmp .write_nametable_hi
-.second_nametable:
- lda <TEXT_LINE
- lsr A
- lsr A
- lsr A
- clc
- adc #$28
-.write_nametable_hi
- sta PPUADDR
- lda <TEXT_LINE
- asl A
- asl A
- asl A
- asl A
- asl A
- ora <TEXT_POS
- sta PPUADDR
- pla
- rts
-
- ; печать символа из регистра A
-symbol_print:
- pha
- ; при удержании любой кнопки ускоряем
- lda <BUTTONS
- bne .skip_sprite_draw
-
- ; настраиваем спрайт
- lda #$FF
- sta SPRITES
- pla
- sta SPRITES+1
- pha
- lda #0
- sta SPRITES+2
- lda <TEXT_POS
- asl A
- asl A
- asl A
- sta SPRITES+3
- jsr wait_blank
- lda #0
- sta OAMADDR
- lda #HIGH(SPRITES)
- sta OAMDMA
-
- ; плавно увеличиваем яркость
- jsr preload_palette
- jsr dim
- jsr dim
- jsr wait_blank
- jsr .set_sprite_y
- jsr load_sprite_palette
-
- jsr preload_palette
- jsr dim
- jsr wait_blank
- jsr .set_sprite_y
- jsr load_sprite_palette
-
- ; скрываем спрайт
- lda #$FF
- sta SPRITES
- jsr wait_blank
- lda #0
- sta OAMADDR
- lda #HIGH(SPRITES)
- sta OAMDMA
-.skip_sprite_draw:
- ; вычисляем адреса
- jsr symbol_address
- pla
- ; печатаем символ
- sta PPUDATA
- inc <SYMBOL_COUNTER
- ; если зажата кнопка, то ждём vlank раз в 4 символа
- lda <BUTTONS
- beq .not_skip_vblank
- lda <SYMBOL_COUNTER
- and #%11
- bne .skip_vblank
-.not_skip_vblank:
- jsr wait_blank
-.skip_vblank:
- rts
-
-.set_sprite_y:
- 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 SPRITES
- lda #0
- sta OAMADDR
- lda #HIGH(SPRITES)
- sta OAMDMA
- rts
-
- ; переход на следующую строку
-next_line:
- jsr wait_blank
- lda #0
- sta <TEXT_POS
- ; увеличиваем номер строки
- inc <TEXT_LINE
- lda <TEXT_LINE
- ; если он равен 30...
- cmp #30
- bne .scroll_check
- ; обнуляем строку
- lda #0
- sta <TEXT_LINE
- ; меняем nametable
- lda TEXT_NAMETABLE
- eor #1
- sta <TEXT_NAMETABLE
- ; проверка, не пора ли начинать скроллинг
-.scroll_check:
- lda <TEXT_LINE
- cmp #27 ; на какой строке начинать скроллить
- bne .not_scroll_start
- ; пора
- inc <TEXT_SCROLL_STARTED
-.not_scroll_start:
- ; включен ли сейчас скроллиг?
- lda <TEXT_SCROLL_STARTED
- beq .clear_line
- ; увеличиваем скроллинг на 8 пикселей
- lda <SCROLL_TARGET_POS
- clc
- adc #8
- ; если дошли до 240й строки, обнуляем
- cmp #240
- bne .not_next_nt
- lda #0
-.not_next_nt:
- sta <SCROLL_TARGET_POS
- ; очищаем строку на противоположном nametable
-.clear_line:
- jsr wait_blank
- bit PPUSTATUS
- lda <TEXT_NAMETABLE
- bne .second_nametable
- lda <TEXT_LINE
- lsr A
- lsr A
- lsr A
- clc
- adc #$28
- jmp .write_nametable_hi
-.second_nametable:
- lda <TEXT_LINE
- lsr A
- lsr A
- lsr A
- clc
- adc #$20
-.write_nametable_hi
- sta PPUADDR
- lda <TEXT_LINE
- asl A
- asl A
- asl A
- asl A
- asl A
- sta PPUADDR
- ldx #32
- lda #0
-.next_char:
- sta PPUDATA
- dex
- bne .next_char
-.end:
- jsr wait_blank
- rts
-
-title_palette:
- .incbin "title_palette_0.bin"
- .incbin "title_palette_1.bin"
- .incbin "title_palette_2.bin"
- .incbin "title_palette_3.bin"
-
-frame_0_palette:
- .incbin "frame_0_palette_0.bin"
- .incbin "frame_0_palette_1.bin"
- .incbin "frame_0_palette_2.bin"
- .incbin "frame_0_palette_3.bin"
-
-frame_1_palette:
- .incbin "frame_1_palette_0.bin"
- .incbin "frame_1_palette_1.bin"
- .incbin "frame_1_palette_2.bin"
- .incbin "frame_1_palette_3.bin"
-
-frame_2_palette:
- .incbin "frame_2_palette_0.bin"
- .incbin "frame_2_palette_1.bin"
- .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
- .db 0, 0, 0, 0
- .db 0, 0, 0, 0
-
-text_0:
- .incbin "text_0.bin"
-
-text_1:
- .incbin "text_1.bin"
-
-text_2:
- .incbin "text_2.bin"
-
-text_3:
- .incbin "text_3.bin"
diff --git a/clean.asm b/clean.asm
new file mode 100644
index 0000000..bd29fca
--- /dev/null
+++ b/clean.asm
@@ -0,0 +1,121 @@
+init:
+ lda #%10000000 ; выключаем пока что PPU, но оставляем NMI
+ sta PPUCTRL
+ lda #%00000000
+ sta PPUMASK
+ jsr wait_blank_simple
+ jsr load_black ; делаем экран чёрным
+
+ ; очистка памяти
+ lda #$00
+ sta <COPY_SOURCE_ADDR
+ sta <COPY_SOURCE_ADDR+1
+ lda #0
+ ldy #$22
+.memory_clean_loop:
+ sta [COPY_SOURCE_ADDR], y
+ iny
+ bne .memory_clean_loop
+
+ ; загрузка спрайтов
+ lda #LOW(sprites_data)
+ sta <COPY_SOURCE_ADDR
+ lda #HIGH(sprites_data)
+ sta <COPY_SOURCE_ADDR+1
+ lda #LOW(SPRITES)
+ sta <COPY_DEST_ADDR
+ lda #HIGH(SPRITES)
+ sta <COPY_DEST_ADDR+1
+ ldy #0
+.sprites_clean_loop:
+ lda [COPY_SOURCE_ADDR], y
+ sta [COPY_DEST_ADDR], y
+ iny
+ bne .sprites_clean_loop
+ lda #0
+ sta OAMADDR
+ lda #HIGH(SPRITES)
+ sta OAMDMA
+
+ ; определяем тип консоли
+ lda #%00000000 ; отключаем NMI
+ sta PPUCTRL
+console_detect_init:
+ bit PPUSTATUS
+ bpl console_detect_init
+console_detect_loop:
+ inx
+ bne console_detect_s
+ iny
+console_detect_s:
+ bit PPUSTATUS
+ bpl console_detect_loop
+ lda #$01
+ cpy #$09
+ bne console_detect_end
+ lda #$00
+console_detect_end:
+ sta <CONSOLE_TYPE
+ ; включаем NMI
+ lda #%10000000
+ sta PPUCTRL
+
+ ; Обнуляем звуковые регистры
+ lda #0
+ sta $4000
+ sta $4001
+ sta $4002
+ sta $4003
+ sta $4004
+ sta $4005
+ sta $4006
+ sta $4007
+ sta $4009
+ sta $400A
+ sta $400C
+ sta $400D
+ sta $400E
+ sta $400F
+ sta $4010
+ sta $4011
+ sta $4012
+ sta $4013
+ lda #$0F
+ sta $4015
+ lda #$40
+ sta $4017
+ lda #0
+
+ rts
+
+ ; очищаем nametable
+clear_screen:
+ lda #$20
+ sta PPUADDR
+ lda #$00
+ sta PPUADDR
+ lda #$00
+ ldx #0
+ ldy #$10
+.loop:
+ sta PPUDATA
+ inx
+ bne .loop
+ dey
+ bne .loop
+ rts
+
+load_black:
+ ; загружаем пустую палитру по адресу $3F00 в PPU
+ lda #$3F
+ sta PPUADDR
+ lda #$00
+ sta PPUADDR
+ ldx #$00
+ lda #$1D ; чёрный цвет
+.loop:
+ sta PPUDATA
+ inx
+ cpx #32
+ bne .loop
+ rts
diff --git a/dimming.asm b/dimming.asm
new file mode 100644
index 0000000..98d4e6c
--- /dev/null
+++ b/dimming.asm
@@ -0,0 +1,147 @@
+ ; загружаем 16 байт палитры во временную память
+preload_palette:
+ ldy #$00
+ ldx #16
+.loop:
+ lda [PAL_SOURCE_ADDR], y
+ sta PALETTE_CACHE, y
+ iny
+ dex
+ bne .loop
+ rts
+
+ ; загружаем 4 байта палитры во временную память
+preload_palette_4:
+ ldy #$00
+ ldx #4
+.loop:
+ lda [PAL_SOURCE_ADDR], y
+ sta PALETTE_CACHE, y
+ iny
+ dex
+ bne .loop
+ rts
+
+ ; загружаем 16 байт палитры в $3F00
+load_palette:
+ 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 #16
+.loop:
+ lda [COPY_SOURCE_ADDR], y
+ sta $2007
+ iny
+ dex
+ bne .loop
+ bit PPUSTATUS
+ rts
+
+ ; загружаем 16 байт палитры в $3F10
+load_sprite_palette:
+ lda #LOW(PALETTE_CACHE)
+ sta <COPY_SOURCE_ADDR
+ lda #HIGH(PALETTE_CACHE)
+ sta <COPY_SOURCE_ADDR+1
+ lda #$3F
+ sta $2006
+ lda #$10
+ sta $2006
+ ldy #$00
+ ldx #16
+.loop:
+ lda [COPY_SOURCE_ADDR], y
+ sta $2007
+ iny
+ dex
+ bne .loop
+ bit PPUSTATUS
+ rts
+
+ ; затемняет загруженную палитру
+dim:
+ 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 #16
+ bne .loop
+ rts
+
+ ; затемняет загруженную палитру, только 4 байта
+dim_4:
+ 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 #4
+ bne .loop
+ rts
+
+ ; плавно проявляет экран
+dim_in_s:
+ jsr preload_palette
+ jsr dim
+ jsr dim
+ jsr load_palette
+ ldx #5
+ jsr wait_blank_x
+ jsr preload_palette
+ jsr dim
+ jsr load_palette
+ ldx #5
+ jsr wait_blank_x
+ jsr preload_palette
+ jsr load_palette
+ jsr wait_blank
+ rts
+
+ ; плавно затухает экран
+dim_out_s:
+ jsr preload_palette
+ jsr dim
+ jsr load_palette
+ ldx #5
+ jsr wait_blank_x
+ jsr preload_palette
+ jsr dim
+ jsr dim
+ jsr load_palette
+ ldx #5
+ jsr wait_blank_x
+ jsr preload_palette
+ jsr dim
+ jsr dim
+ jsr dim
+ jsr load_palette
+ ldx #5
+ jsr wait_blank_x
+ jsr load_black
+ jsr wait_blank
+ rts
diff --git a/images/dira.gif b/images/dira.gif
new file mode 100644
index 0000000..93209de
--- /dev/null
+++ b/images/dira.gif
Binary files differ
diff --git a/images/glaza.gif b/images/glaza.gif
new file mode 100644
index 0000000..cbf8a8a
--- /dev/null
+++ b/images/glaza.gif
Binary files differ
diff --git a/images/gorgona.gif b/images/gorgona.gif
new file mode 100644
index 0000000..a6b14b9
--- /dev/null
+++ b/images/gorgona.gif
Binary files differ
diff --git a/images/sworm.gif b/images/sworm.gif
new file mode 100644
index 0000000..5daab08
--- /dev/null
+++ b/images/sworm.gif
Binary files differ
diff --git a/images/symbols.png b/images/symbols.png
index 6566d41..82ac111 100644
--- a/images/symbols.png
+++ b/images/symbols.png
Binary files differ
diff --git a/images/warface_logo_small.png b/images/warface_logo_small.png
new file mode 100644
index 0000000..4f30cc7
--- /dev/null
+++ b/images/warface_logo_small.png
Binary files differ
diff --git a/nametables.asm b/nametables.asm
index 28f82c2..c7c9b8b 100644
--- a/nametables.asm
+++ b/nametables.asm
@@ -1,6 +1,3 @@
- .bank 2
- .org $8000
-
title_name_table:
.incbin "title_name_table_0.bin"
.incbin "title_name_table_1.bin"
diff --git a/patterns.asm b/patterns.asm
index b07a133..052f7d5 100644
--- a/patterns.asm
+++ b/patterns.asm
@@ -63,3 +63,5 @@ credits_pattern:
.incbin "symbols_pattern.bin"
.db 0, 0, 0, 0, 0, 0, 0, 0
.db 0, 0, 0, 0, 0, 0, 0, 0
+ .org $1C00
+ .incbin "warface_logo_pattern.bin" \ No newline at end of file
diff --git a/sprites.asm b/sprites.asm
new file mode 100644
index 0000000..6aef39b
--- /dev/null
+++ b/sprites.asm
@@ -0,0 +1,75 @@
+logo_x .equ 220
+logo_y .equ 10
+
+sprites_data:
+
+ .db $FF, $FF, $FF, $FF
+ .db logo_y, $C0, %00100001, logo_x
+ .db logo_y, $C1, %00100001, logo_x+8
+ .db logo_y, $C1, %01100001, logo_x+16
+ .db logo_y, $C0, %01100001, logo_x+24
+ .db logo_y+8, $C2, %00100001, logo_x
+ .db logo_y+8, $C3, %00100001, logo_x+8
+ .db logo_y+8, $C3, %01100001, logo_x+16
+ .db logo_y+8, $C2, %01100001, logo_x+24
+ .db logo_y+16, $C2, %00100001, logo_x
+ .db logo_y+16, $C4, %00100001, logo_x+8
+ .db logo_y+16, $C4, %01100001, logo_x+16
+ .db logo_y+16, $C2, %01100001, logo_x+24
+ .db logo_y+24, $C5, %00100001, logo_x
+ .db logo_y+24, $C6, %00100001, logo_x+8
+ .db logo_y+24, $C6, %01100001, logo_x+16
+ .db logo_y+24, $C5, %01100001, logo_x+24
+
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
+ .db $FF, $FF, $FF, $FF
diff --git a/text.asm b/text.asm
new file mode 100644
index 0000000..89abdd0
--- /dev/null
+++ b/text.asm
@@ -0,0 +1,279 @@
+print_text_s:
+ jsr wait_blank
+ ; выключаем PPU
+ jsr disable_ppu
+ ; выбираем последний CHR банк
+ lda #%00011111
+ sta $6001
+ ; очищаем экран
+ jsr clear_screen
+ ; загружаем палитру
+ lda #LOW(symbols_palette)
+ sta <PAL_SOURCE_ADDR
+ lda #HIGH(symbols_palette)
+ sta <PAL_SOURCE_ADDR+1
+ jsr preload_palette
+ jsr load_palette
+ 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
+ beq .end
+ cmp #$FF
+ bne .not_next_line
+ ; переходим на следующую строку
+ jsr next_line
+ jmp .inc_source_pos
+.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
+ inc <TEXT_SOURCE_ADDR+1
+.inc_text_pos:
+ 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 #0
+ sta SPRITES_ENABLED
+ lda #LOW(symbols_palette)
+ sta <PAL_SOURCE_ADDR
+ lda #HIGH(symbols_palette)
+ sta <PAL_SOURCE_ADDR+1
+ jsr dim_out
+ rts
+.exit_to_credits:
+ lda #0
+ sta SPRITES_ENABLED
+ lda #LOW(symbols_palette)
+ sta <PAL_SOURCE_ADDR
+ lda #HIGH(symbols_palette)
+ sta <PAL_SOURCE_ADDR+1
+ jsr dim_out
+ jmp credits
+
+ ; определяем адрес, куда писать символ
+symbol_address:
+ pha
+ bit PPUSTATUS
+ lda <TEXT_NAMETABLE
+ bne .second_nametable
+ lda <TEXT_LINE
+ lsr A
+ lsr A
+ lsr A
+ clc
+ adc #$20
+ jmp .write_nametable_hi
+.second_nametable:
+ lda <TEXT_LINE
+ lsr A
+ lsr A
+ lsr A
+ clc
+ adc #$28
+.write_nametable_hi
+ sta PPUADDR
+ lda <TEXT_LINE
+ asl A
+ asl A
+ asl A
+ asl A
+ asl A
+ ora <TEXT_POS
+ sta PPUADDR
+ pla
+ rts
+
+ ; печать символа из регистра A
+symbol_print:
+ pha
+ ; при удержании любой кнопки ускоряем
+ lda <BUTTONS
+ bne .skip_sprite_draw
+
+ ; настраиваем спрайт
+ lda #$FF
+ sta SPRITES
+ pla
+ sta SPRITES+1
+ pha
+ lda #0
+ sta SPRITES+2
+ lda <TEXT_POS
+ asl A
+ asl A
+ asl A
+ sta SPRITES+3
+ jsr wait_blank
+ lda #0
+ sta OAMADDR
+ lda #HIGH(SPRITES)
+ sta OAMDMA
+
+ ; плавно увеличиваем яркость
+ jsr preload_palette
+ jsr dim_4
+ jsr dim_4
+ jsr wait_blank
+ jsr .set_sprite_y
+ jsr load_sprite_palette
+
+ jsr preload_palette
+ jsr dim_4
+ jsr wait_blank
+ jsr .set_sprite_y
+ jsr load_sprite_palette
+
+ ; скрываем спрайт
+ lda #$FF
+ sta SPRITES
+ jsr wait_blank
+ lda #0
+ sta OAMADDR
+ lda #HIGH(SPRITES)
+ sta OAMDMA
+.skip_sprite_draw:
+ ; вычисляем адреса
+ jsr symbol_address
+ pla
+ ; печатаем символ
+ sta PPUDATA
+ inc <SYMBOL_COUNTER
+ ; если зажата кнопка, то ждём vlank раз в 4 символа
+ lda <BUTTONS
+ beq .not_skip_vblank
+ lda <SYMBOL_COUNTER
+ and #%11
+ bne .skip_vblank
+.not_skip_vblank:
+ jsr wait_blank
+.skip_vblank:
+ rts
+
+.set_sprite_y:
+ 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 SPRITES
+ lda #0
+ sta OAMADDR
+ lda #HIGH(SPRITES)
+ sta OAMDMA
+ rts
+
+ ; переход на следующую строку
+next_line:
+ jsr wait_blank
+ lda #0
+ sta <TEXT_POS
+ ; увеличиваем номер строки
+ inc <TEXT_LINE
+ lda <TEXT_LINE
+ ; если он равен 30...
+ cmp #30
+ bne .scroll_check
+ ; обнуляем строку
+ lda #0
+ sta <TEXT_LINE
+ ; меняем nametable
+ lda TEXT_NAMETABLE
+ eor #1
+ sta <TEXT_NAMETABLE
+ ; проверка, не пора ли начинать скроллинг
+.scroll_check:
+ lda <TEXT_LINE
+ cmp #27 ; на какой строке начинать скроллить
+ bne .not_scroll_start
+ ; пора
+ inc <TEXT_SCROLL_STARTED
+.not_scroll_start:
+ ; включен ли сейчас скроллиг?
+ lda <TEXT_SCROLL_STARTED
+ beq .clear_line
+ ; увеличиваем скроллинг на 8 пикселей
+ lda <SCROLL_TARGET_POS
+ clc
+ adc #8
+ ; если дошли до 240й строки, обнуляем
+ cmp #240
+ bne .not_next_nt
+ lda #0
+.not_next_nt:
+ sta <SCROLL_TARGET_POS
+ ; очищаем строку на противоположном nametable
+.clear_line:
+ jsr wait_blank
+ bit PPUSTATUS
+ lda <TEXT_NAMETABLE
+ bne .second_nametable
+ lda <TEXT_LINE
+ lsr A
+ lsr A
+ lsr A
+ clc
+ adc #$28
+ jmp .write_nametable_hi
+.second_nametable:
+ lda <TEXT_LINE
+ lsr A
+ lsr A
+ lsr A
+ clc
+ adc #$20
+.write_nametable_hi
+ sta PPUADDR
+ lda <TEXT_LINE
+ asl A
+ asl A
+ asl A
+ asl A
+ asl A
+ sta PPUADDR
+ ldx #32
+ lda #0
+.next_char:
+ sta PPUDATA
+ dex
+ bne .next_char
+.end:
+ jsr wait_blank
+ rts
diff --git a/text/1_0.txt b/text/1_0.txt
new file mode 100644
index 0000000..069f0d6
--- /dev/null
+++ b/text/1_0.txt
@@ -0,0 +1,23 @@
+Случилось землетрясение.
+
+Отец сказал, что скоро вернется. Что-то случилось за чертой города - срочно вызвали на дежурство.
+
+Мы с сестрой были готовы к такому. Это и раньше случалось.
+
+После ужина мы сели смотреть телевизор. По всем каналам новости.
+
+Что-то случилось, раз отменили мультфильмы.
+
+Затем телевизор потерял сигнал антенны.
+
+Мы пытались позвонить отцу, но не было связи.
+
+Мы попробовали городской телефон - но не было гудков.
+
+Послышалась полицейская сирена.
+
+Погас свет.
+
+Сестра испугалась и стала плакать. Я включил фонарик на телефоне, но так получилось еще страшнее.
+
+Землетрясение, отключение электричества, обрыв телефонной линии.
diff --git a/text/1_1.txt b/text/1_1.txt
new file mode 100644
index 0000000..862eb05
--- /dev/null
+++ b/text/1_1.txt
@@ -0,0 +1,31 @@
+Мы спрятались под столом. Кругом кромешная тьма.
+
+Тишина. Странно, что не слышно соседей. Обычно в это время они уже начинают выяснять отношения.
+
+Сестра перестала плакать, но выходить из укрытия отказалась.
+
+Что же произошло?
+
+Скорее бы вернулся отец.
+
+Внезапно у соседей снизу раздался грохот. Я прислушался.
+
+Похоже на стук в дверь. Раз, два, три. Никто не отвечает. Странно, готов поклясться, что до отключения электричества они были дома.
+
+Снова стук.
+
+Как будто кто-то пытается выбить дверь! Стук все громче!
+
+Я услышал треск и сестра снова заплакала. Затем был слышен топот, а после...
+
+Я закрыл ладонями уши сестры.
+
+Выстрелы. Я точно слышал выстрелы. Каждый выстрел словно ударом молотка отзывался в голове.
+
+Я подумал, что надо выбираться отсюда. Они могут прийти и за нами. Оставаться здесь было слишком опасно.
+
+Я оставил сестру с телефоном в руках, чтобы фонарик освещал мой путь до входной двери.
+
+Бесшумно пробежался вперед, проверил замок. Перевел дыхание. Надо выбираться отсюда, но как?
+
+Лифт не работает. Пожарная лестница наверняка под наблюдением.
diff --git a/text/1_2.txt b/text/1_2.txt
new file mode 100644
index 0000000..7479d19
--- /dev/null
+++ b/text/1_2.txt
@@ -0,0 +1,27 @@
+Я услышал шаги по коридору. Несколько человек.
+
+Замер. Затаил дыхание. Боялся пошевелиться.
+
+Люди остановились у входной двери.
+
+Сколько их? Зачем они пришли?
+
+Стук в дверь. Я молчу. Сестра трясется от страха.
+
+Снова стук в дверь. Надо прятаться, но куда?
+
+Может, ванна? Шкаф? Будут ли они искать нас?
+
+Стук в дверь.
+
+Надо спрятать сестру!
+
+...дверь слетает с петель. Я слышу треск, падаю на спину. Комната заливается ослепительно-ярким светом.
+
+Я вижу людей в противогазах. Один из них медленно подходит ко мне.
+
+Замахивается прикладом.
+
+Я пытаюсь отползти, но оказываюсь парализован от страха.
+
+Глухой удар - и я теряю сознание.
diff --git a/text/1_3.txt b/text/1_3.txt
new file mode 100644
index 0000000..269f13f
--- /dev/null
+++ b/text/1_3.txt
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+Я очнулся в тюремной камере. Сестры не было рядом.
+
+Пол камеры был залит кровью, а ее стены были исписаны словом ECDYSOZOA.
+
+Где моя сестра? И что это за надпись *ECDYSOZOA*? Я снова теряю сознание.
diff --git a/text/2_0.txt b/text/2_0.txt
new file mode 100644
index 0000000..936123b
--- /dev/null
+++ b/text/2_0.txt
@@ -0,0 +1,13 @@
+Сколько раз мы с ней обсуждали это, но так и не пришли к согласию.
+
+Моя гипотеза заключалась в том, что если она перестанет душнить - мы сможем двигаться дальше.
+
+Ее гипотеза заключалась в том, что я мудак.
+
+Мы не нашли способа проверить это.
+
+И разошлись.
+
+А потом случилось все это.
+
+Сначала в городе появились военные. Или наемники? Знаете, как в тех играх про зомби, где у фармацевтических компаний есть свои маленькие частные армии.
diff --git a/text/2_1.txt b/text/2_1.txt
new file mode 100644
index 0000000..8817d3e
--- /dev/null
+++ b/text/2_1.txt
@@ -0,0 +1,31 @@
+Я подумал: ну и что с того?
+
+Последнее время в стране всякое происходило. Все еще не повод открывать Twitter!
+
+А потом они отключили связь с внешним миром.
+
+Отключили электричество.
+
+Мы оказались заперты в своих домах, пока они прочесывали квартиру за квартирой - в поисках чего?
+
+Я решил во что бы то ни стало найти ее.
+
+Рискнуть всем - но убедиться, что она в порядке и в безопасности.
+
+Рыцарские замашки, а?
+
+Я тысячи раз прокручивал в голове нашу встречу.
+
+Или фантазию о ней.
+
+Как я спасаю ее из рук злодеев, понимаете?
+
+И как мы вместе уезжаем в закат.
+
+И живем долго и счастливо.
+
+Но в реальности...
+
+В реальности мы оказались обречены заранее.
+
+Эти твари...
diff --git a/text/2_2.txt b/text/2_2.txt
new file mode 100644
index 0000000..09c11dc
--- /dev/null
+++ b/text/2_2.txt
@@ -0,0 +1,13 @@
+Они обглодали каждую ее кость.
+
+Они сожрали ее на моих глазах - и я ничего не смог сделать.
+
+Не смог перебороть свой страх.
+
+Я спрятался, а затем убежал.
+
+Потому что все эти рыцарские замашки...
+
+Что ж, выходит, я и правда мудак?
+
+Получается, одну гипотезу мы все-таки проверили...
diff --git a/text/2_3.txt b/text/2_3.txt
new file mode 100644
index 0000000..0632f16
--- /dev/null
+++ b/text/2_3.txt
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+Не знаю, кто это прочтет.
+
+Да это, в сущности, и неважно.
+
+Перед тем, как вышибить себе мозги, я скопировал все данные своих наработок в облако.
+
+Для подключения к нему используйте VPN и пароль *SYMPHYLA*.
diff --git a/text/3_0.txt b/text/3_0.txt
new file mode 100644
index 0000000..92fb5e0
--- /dev/null
+++ b/text/3_0.txt
@@ -0,0 +1,29 @@
+Взяла за привычку рассматривать себя в зеркале в ванной комнате.
+
+В полной тишине и изоляции, отсеченная от внешнего мира, она не сводила глаз с себя самой, изучая лицо, волосы, запоминая скулы, губы, избегая лишь глаз.
+
+Так повторялось двадцать девять дней, а на тридцатый день зеркало исчезло - вместо него в ванной зияла некрасивая дыра с торчащими металлическими прутьями.
+
+Из дыры веяло сыростью, прохладой.
+
+Сквозняк бил о дверь ванной, но она нарочно поснимала все замки в дверях и не боялась оказаться запертой.
+
+Сперва она подумала заделать дыру, но тщетность идеи быстро осадила жар фантазии.
+
+Тогда она попробовала чем-нибудь ее заслонить.
+
+Сломала картонные коробки, сложила в стенку, склеила скотчем и той же липкой лентой приклеила к стене.
+
+Конструкция продержалась несколько минут, после чего ветер плюнул заслоном в сторону.
+
+Она попробовала покричать в дыру, но никто не отозвался.
+
+Ей вдруг стало не по себе.
+
+Выйти из ванной и оставить дыру без присмотра она не могла, но и стоять здесь целый день тоже.
+
+Почему-то отверстие в стене начало казаться ей угрозой, и чем дольше она находилась рядом с ним, тем большую опасность дыра источала.
+
+Во всяком случае, так ей казалось.
+
+Где-то раньше она такое видела.
diff --git a/text/3_1.txt b/text/3_1.txt
new file mode 100644
index 0000000..f60b5dd
--- /dev/null
+++ b/text/3_1.txt
@@ -0,0 +1,35 @@
+Она подошла вплотную к дыре и сказала: "Здесь кто-то есть?"
+
+Ответа не было.
+
+Тогда она сказала: "Кажется: там копошится много мелких жуков".
+
+Ответа не последовало.
+
+Это ее страшно разозлило.
+
+Со всей силы она пнула дыру - но нога пролетела внутрь, она поскользнулась и кубарем покатилась вниз.
+
+Все глубже и глубже.
+
+Все чудесатее и чудесатее.
+
+Интересно, что ее ждет внизу?
+
+Она больно ударилась головой о что-то, что с треском рассыпалось.
+
+Повсюду царил кромешный мрак.
+
+Ничего не понятно.
+
+Она спросила: "Где я?"
+
+Но вместо ответа - звериный визг.
+
+Она зажмурилась как можно сильнее: если игнорировать, то оно исчезнет.
+
+Открыла глаза и увидела его - смотрел из-за решетки, глаза наполнены ужасом, мертвенно-бледное лицо.
+
+Он беззвучно шепчет: "ЗА ТВОЕЙ СПИНОЙ!"
+
+Да какая разница, в сущности?
diff --git a/text/3_2.txt b/text/3_2.txt
new file mode 100644
index 0000000..7bcc72d
--- /dev/null
+++ b/text/3_2.txt
@@ -0,0 +1,5 @@
+Десятки зубов впились из шею.
+
+Кровь брызнула в разные стороны.
+
+Он завизжал как девчонка.
diff --git a/text/3_3.txt b/text/3_3.txt
new file mode 100644
index 0000000..423eeb7
--- /dev/null
+++ b/text/3_3.txt
@@ -0,0 +1,14 @@
+
+
+
+
+
+Я открыл глаза.
+
+Мир выглядел по-новому, будто вместо двух глаз у меня их стало десять.
+
+Почему у меня клешни вместо рук?
+
+Почему я слышу голос в своей голове? Что со мной случилось?
+
+Что еще за *MYRIAPODA*?
diff --git a/text/4_0.txt b/text/4_0.txt
new file mode 100644
index 0000000..7b6a6d4
--- /dev/null
+++ b/text/4_0.txt
@@ -0,0 +1,19 @@
+Я была стажером с восьмого класса школы.
+
+А ты сколько была стажером?
+
+Я пыталась найти про тебя информацию в Интернете, но про иностранцев там почти ничего не написано.
+
+Там и не написано что ты иностранка, но если бы ты была кореянкой, тогда бы про тебя давно все раскопали?
+
+Верно говорю?
+
+Я думаю, ты могла бы подтянуть рейтинг, если бы стала чуть более открытой - в смысле, показала бы себя.
+
+У тебя есть инстаграм?
+
+Тебе не разрешили пока по контракту? Это отстойно.
+
+Сейчас родители заранее делают все учетные записи в социальных сетях для детей, чтобы вписать их в контракт.
+
+Цепляются за любую возможность дать детям все шансы на успех.
diff --git a/text/4_1.txt b/text/4_1.txt
new file mode 100644
index 0000000..d8eccd2
--- /dev/null
+++ b/text/4_1.txt
@@ -0,0 +1,33 @@
+А ты не любишь разговаривать?
+
+Я тоже, если честно, не сильно люблю языком чесать.
+
+Хочешь правду скажу?
+
+Меня не должна были брать в этот состав, все получилось случайно - девочку, чье место я заняла, сняли в самый последний момент.
+
+Какие-то проблемы со здоровьем.
+
+Мне перезвонили, я вещи собрала, и вот тут, они сами не ожидали как быстро все по документам пройдет.
+
+Вообще-то они никогда не селят никого из разных коллективов, но почему-то сказали что здесь мне будет очень хорошо, прием-то конечно прохладный.
+
+Ну да я тебя не виню - жила себе одна, да тут подоспела соседка, разве это подарок, разочарование одно.
+
+Что с той стало я понятия не имею, говорю как есть, видели на прослушиваниях много раз, никогда не понимала что в ней люди находят - ни рожи, ни жопы, ничего хорошего.
+
+Хотела бы я узнать что с ней приключилось!
+
+В интернете писали, что что-то совсем ужасное, что она никогда больше не станет выступать, а раз так, я думаю, то мне опасаться в целом нечего.
+
+Я свое место хорошо знаю: буду танцовщицей в группе.
+
+Петь умею, речитатив заучить могу, но танцовщица - это правильно: тебя замечают не сразу.
+
+Есть дебют и пара камбеков, чтобы расцвести, обрести и закрепить и любовь фанатов, а там и слова в песню дадут, и камеры больше внимания уделять станут.
+
+Подожди, в дверь звонят.
+
+Кто бы это мог быть в такое время.
+
+Оп - электричество тоже отключили.
diff --git a/text/4_2.txt b/text/4_2.txt
new file mode 100644
index 0000000..6dc92d1
--- /dev/null
+++ b/text/4_2.txt
@@ -0,0 +1,13 @@
+Ты еще тут?
+
+Эй!
+
+А, ищет сеть.
+
+Да кто пришел в такое время?
+
+Не стану я дверь открывать!
+
+Ладно, пойду хоть посмотрю на них.
+
+Не отключайся.
diff --git a/text/4_3.txt b/text/4_3.txt
new file mode 100644
index 0000000..4033d74
--- /dev/null
+++ b/text/4_3.txt
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+Эй, ты все еще здесь? Кажется, нам надо отсюда уходить.
+
+Забери наши паспорта из сейфа. Код *PAUROPODA*. Скорее!
diff --git a/text/5_0.txt b/text/5_0.txt
new file mode 100644
index 0000000..c0f9af0
--- /dev/null
+++ b/text/5_0.txt
@@ -0,0 +1,9 @@
+Вы прибыли в пустынный город в штате Невада.
+
+В доме рядом плачет женщина.
+
+Ваше имя - [ВВЕСТИ ЗНАЧЕНИЕ].
+
+Перед самым рождеством в девушке по имени Мелисса бушует пламя митохондрий.
+
+Ваше имя - [ВВЕСТИ ЗНАЧЕНИЕ].
diff --git a/text/5_1.txt b/text/5_1.txt
new file mode 100644
index 0000000..f8d5cc7
--- /dev/null
+++ b/text/5_1.txt
@@ -0,0 +1,25 @@
+Эта злая корпорация загрязняет воздух и выкачивает энергию планеты.
+
+Только древние могут спасти нас!
+
+Ваше имя - [ВВЕСТИ ЗНАЧЕНИЕ].
+
+Быстрые гонки, гигантский вражеский краб, первая CG-модель и маскот в индустрии видеоигр.
+
+Ваше имя - [ВВЕДИТЕ ЗНАЧЕНИЕ].
+
+Сбой системы.
+
+Сбой системы.
+
+Сбой системы.
+
+Архивные данные перенесены в резервное хранилище.
+
+Сбой системы.
+
+Вы хотите выполнить проверку системы?
+
+Сбой системы.
+
+Выполняется проверка системы.
diff --git a/text/5_2.txt b/text/5_2.txt
new file mode 100644
index 0000000..09c6de7
--- /dev/null
+++ b/text/5_2.txt
@@ -0,0 +1,19 @@
+Митохондрии - древнейшие паразиты, ставшие частью человеческой клетки.
+
+Сбой системы.
+
+Сбой системы.
+
+Экстренная посадка будет завершена через 3, 2, 1.
+
+Связь потеряна.
+
+Сбой системы.
+
+Красная черепашка обладает способностью автоматического наведения на противника.
+
+Сбой системы.
+
+DORADO PULIDO 72.755 - 69.057 - CARNE CLARA 70.928
+
+Ответная реакция.
diff --git a/text/5_3.txt b/text/5_3.txt
new file mode 100644
index 0000000..adba9c4
--- /dev/null
+++ b/text/5_3.txt
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+Доступ разрешен. Для получения данных для дальнейших исследований, введите в главный мэйнфрейм год *BEETLE*.
diff --git a/text/6_0.txt b/text/6_0.txt
new file mode 100644
index 0000000..814cac6
--- /dev/null
+++ b/text/6_0.txt
@@ -0,0 +1,19 @@
+Мой командир пообещал, что это мое последнее задание перед уходом на покой.
+
+Наш командир для нас — как отец. И раз он сказал, что это последнее задание, так оно и будет.
+
+Да и заданием это назвать сложно — нужно всего-то перекрыть дорогу, ведущую из Ниптона в Примм.
+
+Местные жители говорят, что видели в небе над Мохаве яркую вспышку.
+
+Казалось бы, что там фантазии местных — эти сумасшедшие живут посреди проклятой пустыни. Может, перепили муншайна и словили коллективную галлюцинацию.
+
+И никто бы не обратил внимание на их россказни, но наутро поступили страшные вести — все жители небольшого шахтерского поселка Брант пропали без вести.
+
+Мы, и еще несколько отрядов Национальной Гвардии, отправились на оцепление близлежащих дорог — мы обязательно поймаем этих ублюдков и предадим их суду.
+
+Стоять в заграждении — работенка одновременно лучшая и худшая в солдатской жизни.
+
+Казалось бы, стой себе, жуй жвачку и ожидай приказа отправиться домой.
+
+С другой стороны, вы бывали в пустыне Мохаве? Это чертово место доведет до суицида даже Чак Норриса.
diff --git a/text/6_1.txt b/text/6_1.txt
new file mode 100644
index 0000000..8fe4651
--- /dev/null
+++ b/text/6_1.txt
@@ -0,0 +1,15 @@
+Вы вообще знаете, что такое палящее солнце пустыни? А когда вы находитесь в пулеметном гнезде “Хаммера”, без возможности спрятать голову от вездесущей жары?
+
+Сил мне придавали две мысли — скоро это чертово задание кончится и я, наконец-то, уйду на заслуженный солдатский покой, а после отправляюсь в отпуск в Вегас.
+
+Первый день работы в патруле прошел скучно и без каких-либо новостей. Лишь под утро к нам пришла шифровка, что преступники продолжают оставаться в районе оцепления.
+
+А значит, им рано или поздно придется выбираться к цивилизации, где мы ждем их с распростертыми объятиями.
+
+Признаюсь, я рад, что ухожу с военной службы. Год муштры сделали из меня машину для убийства, но ни одного убийства я так и не совершил.
+
+Надеюсь, эти засранцы поедут по нашей дороге и что они не будут сдаваться без боя — мой шестиствольный “Гатлинг” щедро накормит их горячим пирогом двадцатого калибра.
+
+Второй день тоже не принес радостных вестей — несколько БПЛА облетали всю территорию чертовой пустыни, но не нашли ни единого следа преступников.
+
+Значило это лишь одно — торчать нам здесь долго.
diff --git a/text/6_2.txt b/text/6_2.txt
new file mode 100644
index 0000000..71bca71
--- /dev/null
+++ b/text/6_2.txt
@@ -0,0 +1,15 @@
+Я вообще не нытик. Но конкретно это задание стало самым скучным за всю мою карьеру.
+
+Жара, летающая мошкара, чертов пыльный ветер, который забивает глаза — кто те люди, что добровольно живут здесь? Какая ваша, черт возьми, мотивация?
+
+Мошкара тоже достала — с каждым часом от нее становилось все сложнее отмахиваться.
+
+И треск, постоянный звук треска насекомых. Это чертова пустыня, все, что здесь может быть — звук ветра, несущего перекати-поле к месту его будущей стоянки!
+
+"ЗЗЗЗЗЗ", "ЗЗЗЗЗЗЗ", "ЗЗЗЗЗЗЗ" - этот чертов треск врезался в мою голову и на дает уснуть!
+
+С каждой минутой этот звук только усиливается. И это не мои глюки — парни из нашего отряда тоже слышат его.
+
+Связь с Базой тоже оборвалась. Не удивлюсь, если это дело рук чертовых последователей Апокалипсиса, которые продолжают жечь вышки 5G.
+
+Прошло уже столько лет, а они продолжают верить в эту чертову сказку... А я очень хочу спать. Закрою глаза на минутку. Ничего не произойдет.
diff --git a/text/6_3.txt b/text/6_3.txt
new file mode 100644
index 0000000..6e9a9d8
--- /dev/null
+++ b/text/6_3.txt
@@ -0,0 +1,15 @@
+...
+
+...
+
+Без надежды, что это кто-то однажды прочтет. Я, сержант Реймонд Паулюс, отправляю свой последний рапорт.
+
+Если вы получили его, срочно отправляйтесь по приложенным координатам.
+
+На наш отряд было совершено нападение. Огромные жуки утащили Раймонда и Бековски.
+
+Я смог укрыться в “Хаммере”, но надежды на мое спасение мало — я слышу, как эти жуки ждут, когда я выберусь наружу, чтобы превратить меня в свой ужин.
+
+Передайте моей матери ключ от моего банковского сейфа - *CENTIPEDE*. Она должна получить подарок, что я готовил к ее шестидесятилетию.
+
+Мама, я люблю тебя.
diff --git a/tools/EraseCheck.cs b/tools/EraseCheck.cs
new file mode 100644
index 0000000..cd5392e
--- /dev/null
+++ b/tools/EraseCheck.cs
@@ -0,0 +1,65 @@
+namespace com.clusterrr.Warface
+{
+ class EraseEeprom
+ {
+ void Run(IFamicomDumperConnection dumper)
+ {
+ var rom = new NesFile("warface.nes");
+ const int prgBankSize = 0x4000;
+ const int chrBankSize = 0x1000;
+ int problems = 0;
+
+ for (var bank = 0; bank < 128 * 1024 / prgBankSize; bank++)
+ {
+ int minProblems = -1;
+ do
+ {
+ problems = 0;
+ Console.WriteLine("Reading PRG bank #{0}...", bank);
+ dumper.WriteCpu(0x6000, (byte)bank);
+ var dataVerify = dumper.ReadCpu(0x8000, prgBankSize);
+ for (var i = 0; i < prgBankSize; i++)
+ {
+ if (0xFF != dataVerify[i])
+ {
+ //Console.Write("{0:X2} != {1:X2} @ {2:X4} ", dataVerify[i], 0xFF, i);
+ problems++;
+ }
+ }
+ if (problems > 0)
+ Console.WriteLine("{0} bytes @ PRG bank #{1} are not clean", problems, bank);
+ // if (problems < minProblems)
+ // Console.Beep();
+ if (minProblems < 0 || problems < minProblems)
+ minProblems = problems;
+ } while (problems > 0);
+ }
+
+ for (var bank = 0; bank < 128 * 1024 / chrBankSize; bank++)
+ {
+ int minProblems = -1;
+ do
+ {
+ problems = 0;
+ Console.WriteLine("Reading CHR bank #{0}...", bank);
+ dumper.WriteCpu(0x6001, (byte)bank);
+ var dataVerify = dumper.ReadPpu(0x0000, chrBankSize);
+ for (var i = 0; i < chrBankSize; i++)
+ {
+ if (0xFF != dataVerify[i])
+ {
+ //Console.Write("{0:X2} != {1:X2} @ {2:X4} ", dataVerify[i], 0xFF, i);
+ problems++;
+ }
+ }
+ if (problems > 0)
+ Console.WriteLine("{0} bytes @ CHR bank #{1} are not clean", problems, bank);
+ // if (problems < minProblems)
+ // Console.Beep();
+ if (minProblems < 0 || problems < minProblems)
+ minProblems = problems;
+ } while (problems > 0);
+ }
+ }
+ }
+}
diff --git a/tools/WriteWarface.cs b/tools/WriteWarface.cs
new file mode 100644
index 0000000..01f32f4
--- /dev/null
+++ b/tools/WriteWarface.cs
@@ -0,0 +1,65 @@
+using System.Linq;
+
+namespace com.clusterrr.Warface
+{
+ class WriteWarface
+ {
+ void Run(IFamicomDumperConnection dumper)
+ {
+ var rom = new NesFile("warface.nes");
+ const int prgBankSize = 0x4000;
+ const int chrBankSize = 0x1000;
+ bool problem = false;
+
+ for (var bank = 0; bank < 128 * 1024 / prgBankSize; bank++)
+ {
+ do
+ {
+ problem = false;
+ Console.WriteLine("Writing PRG bank #{0}...", bank);
+ dumper.WriteCpu(0x6000, (byte)bank);
+ var data = new byte[prgBankSize];
+ Array.Copy(rom.PRG, bank * prgBankSize, data, 0, prgBankSize);
+ if (data.Where(b => b != 0xFF).Any())
+ dumper.WriteCpu(0x8000, data);
+ var dataVerify = dumper.ReadCpu(0x8000, prgBankSize);
+ for (var i = 0; i < prgBankSize; i++)
+ {
+ if (data[i] != dataVerify[i])
+ {
+ Console.Write("{0:X2} != {1:X2} @ {2:X4} ", dataVerify[i], data[i], i);
+ problem = true;
+ }
+ }
+ if (problem)
+ Console.WriteLine("Problems @ bank #{0}", bank);
+ } while (problem);
+ }
+
+ for (var bank = 0; bank < 128 * 1024 / chrBankSize; bank++)
+ {
+ do
+ {
+ problem = false;
+ Console.WriteLine("Writing CHR bank #{0}...", bank);
+ dumper.WriteCpu(0x6001, (byte)bank);
+ var data = new byte[chrBankSize];
+ Array.Copy(rom.CHR, bank * chrBankSize, data, 0, chrBankSize);
+ if (data.Where(b => b != 0xFF).Any())
+ dumper.WritePpu(0x0000, data);
+ var dataVerify = dumper.ReadPpu(0x0000, chrBankSize);
+ for (var i = 0; i < chrBankSize; i++)
+ {
+ if (data[i] != dataVerify[i])
+ {
+ Console.Write("{0:X2} != {1:X2} @ {2:X4} ", dataVerify[i], data[i], i);
+ problem = true;
+ }
+ }
+ if (problem)
+ Console.WriteLine("Problems @ bank #{0}", bank);
+ } while (problem);
+ }
+ }
+ }
+}
diff --git a/warface.asm b/warface.asm
index d67bd6e..f22ae6c 100644
--- a/warface.asm
+++ b/warface.asm
@@ -24,6 +24,7 @@ FRAMES .rs 1 ; счётчик NMI
ACTIVE_BANK .rs 1 ; текущий PRG банк
CONSOLE_TYPE .rs 1 ; тип консоли
COPY_SOURCE_ADDR .rs 2 ; исходный адрес для копирования данный
+COPY_DEST_ADDR .rs 2 ; целевой адрес для копирования данный
PAL_SOURCE_ADDR .rs 2 ; исходный адрес для загрузки палитры
PALETTE_CACHE .rs 16 ; кеш для временного хранения палитры
SPRITES_ENABLED .rs 1 ; включены ли спрайты
@@ -97,8 +98,6 @@ Start:
; включаем PPU
jsr enable_ppu
; загружаем палитру
- lda #0
- jsr select_prg_bank
lda #LOW(title_palette)
sta <PAL_SOURCE_ADDR
lda #HIGH(title_palette)
@@ -129,8 +128,6 @@ Start:
; включаем PPU
jsr enable_ppu
; загружаем палитру
- lda #0
- jsr select_prg_bank
lda #LOW(frame_0_palette)
sta <PAL_SOURCE_ADDR
lda #HIGH(frame_0_palette)
@@ -148,8 +145,6 @@ Start:
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
@@ -170,8 +165,6 @@ Start:
; включаем PPU
jsr enable_ppu
; загружаем палитру
- lda #0
- jsr select_prg_bank
lda #LOW(frame_1_palette)
sta <PAL_SOURCE_ADDR
lda #HIGH(frame_1_palette)
@@ -189,8 +182,6 @@ Start:
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
@@ -211,8 +202,6 @@ Start:
; включаем PPU
jsr enable_ppu
; загружаем палитру
- lda #0
- jsr select_prg_bank
lda #LOW(frame_2_palette)
sta <PAL_SOURCE_ADDR
lda #HIGH(frame_2_palette)
@@ -230,8 +219,6 @@ Start:
sta <TEXT_SOURCE_ADDR
lda #HIGH(text_2)
sta <TEXT_SOURCE_ADDR+1
- lda #0
- jsr select_prg_bank
jsr print_text
jsr disable_ppu
@@ -251,8 +238,6 @@ Start:
; включаем PPU
jsr enable_ppu
; загружаем палитру
- lda #0
- jsr select_prg_bank
lda #LOW(title_palette)
sta <PAL_SOURCE_ADDR
lda #HIGH(title_palette)
@@ -270,8 +255,6 @@ Start:
sta <TEXT_SOURCE_ADDR
lda #HIGH(text_3)
sta <TEXT_SOURCE_ADDR+1
- lda #0
- jsr select_prg_bank
lda #1
sta <THE_END
jsr print_text
@@ -297,8 +280,6 @@ credits:
; включаем PPU
jsr enable_ppu
; загружаем палитру
- lda #0
- jsr select_prg_bank
lda #LOW(credits_palette)
sta <PAL_SOURCE_ADDR
lda #HIGH(credits_palette)
@@ -453,7 +434,7 @@ wait_blank_x:
bne .loop
rts
- ; загружаем nametable в $1000
+ ; загружаем nametable в $2000
load_name_table:
lda #$20
sta $2006
@@ -483,6 +464,12 @@ dim_out:
jsr dim_out_s
rts
+print_text:
+ lda #0
+ jsr select_prg_bank
+ jsr print_text_s
+ rts
+
reset_scroll:
lda #0
sta <SCROLL_POS
@@ -509,12 +496,70 @@ wait_any_button:
pause:
jsr wait_buttons_not_pressed
- ldx #150
- jsr wait_blank_x
+ ;ldx #150
+ ;jsr wait_blank_x
jsr wait_any_button
rts
- .include "bank0_subroutines.asm"
+ .bank 0
+ .org $8000
+
+ .include "clean.asm"
+ .include "dimming.asm"
+ .include "text.asm"
.include "buttons.asm"
+
+ .bank 1
+ .org $A000
+
+title_palette:
+ .incbin "title_palette_0.bin"
+ .incbin "title_palette_1.bin"
+ .incbin "title_palette_2.bin"
+ .incbin "title_palette_3.bin"
+
+frame_0_palette:
+ .incbin "frame_0_palette_0.bin"
+ .incbin "frame_0_palette_1.bin"
+ .incbin "frame_0_palette_2.bin"
+ .incbin "frame_0_palette_3.bin"
+
+frame_1_palette:
+ .incbin "frame_1_palette_0.bin"
+ .incbin "frame_1_palette_1.bin"
+ .incbin "frame_1_palette_2.bin"
+ .incbin "frame_1_palette_3.bin"
+
+frame_2_palette:
+ .incbin "frame_2_palette_0.bin"
+ .incbin "frame_2_palette_1.bin"
+ .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"
+ .incbin "warface_palette.bin"
+ .db 0, 0, 0, 0
+ .db 0, 0, 0, 0
+
+text_0:
+ .incbin "text_0.bin"
+
+text_1:
+ .incbin "text_1.bin"
+
+text_2:
+ .incbin "text_2.bin"
+
+text_3:
+ .incbin "text_3.bin"
+
+ .include "sprites.asm"
.include "nametables.asm"
.include "patterns.asm"