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-05 15:17:22 +0300
committerAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2020-11-05 15:17:22 +0300
commit8aee7b8188ac6064dc1c5852e0b96a852bd97456 (patch)
treef34153f1668daa6e2cfb00ad852d0acdd51017b1
parentb06d852ae78f350b41ab12aa0dbac1bffca4fe6f (diff)
It's working!
-rw-r--r--Makefile25
-rw-r--r--bank0_subroutines.asm285
-rw-r--r--buttons.asm63
-rw-r--r--images/credits.pngbin2311 -> 3272 bytes
-rw-r--r--patterns.asm65
m---------tools_sources/NesTiler0
-rw-r--r--warface.asm221
7 files changed, 628 insertions, 31 deletions
diff --git a/Makefile b/Makefile
index cbba797..ec447e5 100644
--- a/Makefile
+++ b/Makefile
@@ -14,7 +14,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
+INCLUDES=bank0_subroutines.asm nametables.asm patterns.asm buttons.asm
EXECUTABLE=warface.nes
MUSIC=Warface-11.nsf
MUSIC_BIN=music.bin
@@ -135,7 +135,28 @@ SYMBOLS_PALETTE=symbols_palette.bin
all: $(SOURCE) $(EXECUTABLE)
-$(EXECUTABLE): $(SOURCE) $(INCLUDES) $(MUSIC_BIN) $(TITLE_PATTERN_0) $(TITLE_PATTERN_1) $(TITLE_PATTERN_2) $(TITLE_PATTERN_3) $(TITLE_NAME_TABLE_0) $(TITLE_NAME_TABLE_1) $(TITLE_NAME_TABLE_2) $(TITLE_NAME_TABLE_3) $(TITLE_ATTR_TABLE_0) $(TITLE_ATTR_TABLE_1) $(TITLE_ATTR_TABLE_2) $(TITLE_ATTR_TABLE_3) $(TITLE_PALETTE_0) $(TITLE_PALETTE_1) $(TITLE_PALETTE_2) $(TITLE_PALETTE_3) $(FRAME_0_PATTERN_0) $(FRAME_0_PATTERN_1) $(FRAME_0_PATTERN_2) $(FRAME_0_PATTERN_3) $(FRAME_0_NAME_TABLE_0) $(FRAME_0_NAME_TABLE_1) $(FRAME_0_NAME_TABLE_2) $(FRAME_0_NAME_TABLE_3) $(FRAME_0_ATTR_TABLE_0) $(FRAME_0_ATTR_TABLE_1) $(FRAME_0_ATTR_TABLE_2) $(FRAME_0_ATTR_TABLE_3) $(FRAME_0_PALETTE_0) $(FRAME_0_PALETTE_1) $(FRAME_0_PALETTE_2) $(FRAME_0_PALETTE_3) $(FRAME_1_PATTERN_0) $(FRAME_1_PATTERN_1) $(FRAME_1_PATTERN_2) $(FRAME_1_PATTERN_3) $(FRAME_1_NAME_TABLE_0) $(FRAME_1_NAME_TABLE_1) $(FRAME_1_NAME_TABLE_2) $(FRAME_1_NAME_TABLE_3) $(FRAME_1_ATTR_TABLE_0) $(FRAME_1_ATTR_TABLE_1) $(FRAME_1_ATTR_TABLE_2) $(FRAME_1_ATTR_TABLE_3) $(FRAME_1_PALETTE_0) $(FRAME_1_PALETTE_1) $(FRAME_1_PALETTE_2) $(FRAME_1_PALETTE_3) $(FRAME_2_PATTERN_0) $(FRAME_2_PATTERN_1) $(FRAME_2_PATTERN_2) $(FRAME_2_PATTERN_3) $(FRAME_2_NAME_TABLE_0) $(FRAME_2_NAME_TABLE_1) $(FRAME_2_NAME_TABLE_2) $(FRAME_2_NAME_TABLE_3) $(FRAME_2_ATTR_TABLE_0) $(FRAME_2_ATTR_TABLE_1) $(FRAME_2_ATTR_TABLE_2) $(FRAME_2_ATTR_TABLE_3) $(FRAME_2_PALETTE_0) $(FRAME_2_PALETTE_1) $(FRAME_2_PALETTE_2) $(FRAME_2_PALETTE_3) $(CREDITS_PATTERN_0) $(CREDITS_PATTERN_1) $(CREDITS_PATTERN_2) $(CREDITS_PATTERN_3) $(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) $(TEXT_0_BIN) $(TEXT_1_BIN) $(TEXT_2_BIN) $(TEXT_3_BIN) $(SYMBOLS_PATTERN) $(SYMBOLS_PALETTE)
+$(EXECUTABLE): $(SOURCE) $(INCLUDES) $(MUSIC_BIN) \
+$(TITLE_PATTERN_0) $(TITLE_PATTERN_1) $(TITLE_PATTERN_2) $(TITLE_PATTERN_3) \
+$(TITLE_NAME_TABLE_0) $(TITLE_NAME_TABLE_1) $(TITLE_NAME_TABLE_2) $(TITLE_NAME_TABLE_3) \
+$(TITLE_ATTR_TABLE_0) $(TITLE_ATTR_TABLE_1) $(TITLE_ATTR_TABLE_2) $(TITLE_ATTR_TABLE_3) \
+$(TITLE_PALETTE_0) $(TITLE_PALETTE_1) $(TITLE_PALETTE_2) $(TITLE_PALETTE_3) \
+$(FRAME_0_PATTERN_0) $(FRAME_0_PATTERN_1) $(FRAME_0_PATTERN_2) $(FRAME_0_PATTERN_3) \
+$(FRAME_0_NAME_TABLE_0) $(FRAME_0_NAME_TABLE_1) $(FRAME_0_NAME_TABLE_2) $(FRAME_0_NAME_TABLE_3) \
+$(FRAME_0_ATTR_TABLE_0) $(FRAME_0_ATTR_TABLE_1) $(FRAME_0_ATTR_TABLE_2) $(FRAME_0_ATTR_TABLE_3) \
+$(FRAME_0_PALETTE_0) $(FRAME_0_PALETTE_1) $(FRAME_0_PALETTE_2) $(FRAME_0_PALETTE_3) \
+$(FRAME_1_PATTERN_0) $(FRAME_1_PATTERN_1) $(FRAME_1_PATTERN_2) $(FRAME_1_PATTERN_3) \
+$(FRAME_1_NAME_TABLE_0) $(FRAME_1_NAME_TABLE_1) $(FRAME_1_NAME_TABLE_2) $(FRAME_1_NAME_TABLE_3) \
+$(FRAME_1_ATTR_TABLE_0) $(FRAME_1_ATTR_TABLE_1) $(FRAME_1_ATTR_TABLE_2) $(FRAME_1_ATTR_TABLE_3) \
+$(FRAME_1_PALETTE_0) $(FRAME_1_PALETTE_1) $(FRAME_1_PALETTE_2) $(FRAME_1_PALETTE_3) \
+$(FRAME_2_PATTERN_0) $(FRAME_2_PATTERN_1) $(FRAME_2_PATTERN_2) $(FRAME_2_PATTERN_3) \
+$(FRAME_2_NAME_TABLE_0) $(FRAME_2_NAME_TABLE_1) $(FRAME_2_NAME_TABLE_2) $(FRAME_2_NAME_TABLE_3) \
+$(FRAME_2_ATTR_TABLE_0) $(FRAME_2_ATTR_TABLE_1) $(FRAME_2_ATTR_TABLE_2) $(FRAME_2_ATTR_TABLE_3) \
+$(FRAME_2_PALETTE_0) $(FRAME_2_PALETTE_1) $(FRAME_2_PALETTE_2) $(FRAME_2_PALETTE_3) \
+$(CREDITS_PATTERN_0) $(CREDITS_PATTERN_1) $(CREDITS_PATTERN_2) $(CREDITS_PATTERN_3) \
+$(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) \
+$(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
diff --git a/bank0_subroutines.asm b/bank0_subroutines.asm
index 2c5885b..3f7a5f4 100644
--- a/bank0_subroutines.asm
+++ b/bank0_subroutines.asm
@@ -3,13 +3,32 @@
.org $8000
init:
- lda #%00000000 ; Выключаем пока что PPU
- sta PPUSTATUS
+ lda #%00000000 ; выключаем пока что PPU
+ sta PPUCTRL
sta PPUMASK
jsr wait_blank_simple
- jsr load_black ; Делаем экран чёрным
+ 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 #0
+ sta OAMADDR
+ ldx #0
+.clean_oam_next:
+ sta OAMDATA
+ inx
+ bne .clean_oam_next
+
+ ; определяем тип консоли
jsr wait_blank_simple
console_detect:
inx
@@ -76,7 +95,7 @@ clear_screen:
dey
bne .loop
rts
-
+
load_black:
; загружаем пустую палитру по адресу $3F00 в PPU
lda #$3F
@@ -125,6 +144,27 @@ load_palette:
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
@@ -180,6 +220,238 @@ dim_out_s:
jsr wait_blank
rts
+print_text:
+ ; выключаем 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 #2
+ sta TEXT_LINE
+ lda #1
+ sta TEXT_POS
+ lda #0
+ sta TEXT_NAMETABLE
+ sta TEXT_SCROLL_STARTED
+ jsr reset_scroll
+.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
+.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:
+ jsr wait_any_button
+ lda #LOW(symbols_palette)
+ sta PAL_SOURCE_ADDR
+ lda #HIGH(symbols_palette)
+ sta PAL_SOURCE_ADDR+1
+ jsr dim_out
+ rts
+
+ ; определяем адрес, куда писать символ
+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 #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
+ sta OAMDATA
+
+ pla
+ sta OAMDATA
+ pha
+ lda #0
+ sta OAMDATA
+ lda TEXT_POS
+ asl A
+ asl A
+ asl A
+ sta OAMDATA
+ jsr wait_blank
+
+ ; плавно увеличиваем яркость
+ jsr preload_palette
+ jsr dim
+ jsr dim
+ jsr load_sprite_palette
+ jsr wait_blank
+
+ jsr preload_palette
+ jsr dim
+ jsr load_sprite_palette
+ jsr wait_blank
+
+ ; скрываем спрайт
+ lda #0
+ sta OAMADDR
+ ldx #$FF
+ sta OAMDATA
+
+.skip_sprite_draw:
+ ; вычисляем адреса
+ jsr symbol_address
+ pla
+ ; печатаем символ
+ sta PPUDATA
+ jsr wait_blank
+ 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:
+ 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"
@@ -206,6 +478,9 @@ frame_2_palette:
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"
diff --git a/buttons.asm b/buttons.asm
new file mode 100644
index 0000000..ed83074
--- /dev/null
+++ b/buttons.asm
@@ -0,0 +1,63 @@
+BUTTONS .rs 1 ; currently pressed buttons
+BUTTONS_TMP .rs 1 ; temporary variable for buttons
+LAST_KONAMI_BUTTON .rs 1 ; last button state for Konami Code check
+KONAMI_CODE_STATE .rs 1 ; Konami Code state
+KONAMI_CODE_TRIGGERED .rs 1 ; Konami Code triggered flag
+
+ ; controller reading, two times
+read_controller:
+ jsr .real ; first read
+ ldx <BUTTONS_TMP
+ jsr .real ; second read
+ cpx <BUTTONS_TMP ; lets compare values
+ bne .end ; ignore it if not equal
+ stx <BUTTONS ; storing value
+.end:
+ jsr konami_code_check
+ rts
+
+ ; real controller read, stores buttons to BUTTONS_TMP
+.real:
+ ;php
+ lda #1
+ sta $4016
+ lda #0
+ sta $4016
+ ldy #8
+.read_button:
+ lda $4016
+ and #$03
+ cmp #$01
+ ror <BUTTONS_TMP
+ dey
+ bne .read_button
+ rts
+
+konami_code_check:
+ ldy <KONAMI_CODE_STATE
+ lda <BUTTONS
+ beq .end
+ cmp <LAST_KONAMI_BUTTON
+ beq .end
+ cmp konami_code, y
+ bne .check_fail
+ iny
+ cpy #konami_code_length
+ bne .end
+ ldy #1
+ sty KONAMI_CODE_TRIGGERED
+ jmp .end
+.check_fail:
+ ldy #0
+ lda konami_code ; in case when newpressed button is first button of code
+ cmp <BUTTONS
+ bne .end
+ iny
+.end:
+ sty <KONAMI_CODE_STATE
+ sta <LAST_KONAMI_BUTTON
+ rts
+
+konami_code:
+ .db $10, $10, $20, $20, $40, $80, $40, $80, $02, $01
+konami_code_length .equ 10
diff --git a/images/credits.png b/images/credits.png
index 747afe3..a2600a8 100644
--- a/images/credits.png
+++ b/images/credits.png
Binary files differ
diff --git a/patterns.asm b/patterns.asm
new file mode 100644
index 0000000..b07a133
--- /dev/null
+++ b/patterns.asm
@@ -0,0 +1,65 @@
+ .bank 16
+ .org $0000
+title_pattern:
+ .incbin "title_pattern_0.bin"
+ .org $1000
+ .incbin "title_pattern_1.bin"
+ .bank 17
+ .org $0000
+ .incbin "title_pattern_2.bin"
+ .org $1000
+ .incbin "title_pattern_3.bin"
+
+ .bank 18
+ .org $0000
+frame_0_pattern:
+ .incbin "frame_0_pattern_0.bin"
+ .org $1000
+ .incbin "frame_0_pattern_1.bin"
+ .bank 19
+ .org $0000
+ .incbin "frame_0_pattern_2.bin"
+ .org $1000
+ .incbin "frame_0_pattern_3.bin"
+
+ .bank 20
+ .org $0000
+frame_1_pattern:
+ .incbin "frame_1_pattern_0.bin"
+ .org $1000
+ .incbin "frame_1_pattern_1.bin"
+ .bank 21
+ .org $0000
+ .incbin "frame_1_pattern_2.bin"
+ .org $1000
+ .incbin "frame_1_pattern_3.bin"
+
+ .bank 22
+ .org $0000
+frame_2_pattern:
+ .incbin "frame_2_pattern_0.bin"
+ .org $1000
+ .incbin "frame_2_pattern_1.bin"
+ .bank 23
+ .org $0000
+ .incbin "frame_2_pattern_2.bin"
+ .org $1000
+ .incbin "frame_2_pattern_3.bin"
+
+ .bank 24
+ .org $0000
+credits_pattern:
+ .incbin "credits_pattern_0.bin"
+ .org $1000
+ .incbin "credits_pattern_1.bin"
+ .bank 25
+ .org $0000
+ .incbin "credits_pattern_2.bin"
+ .org $1000
+ .incbin "credits_pattern_3.bin"
+
+ .bank 31
+ .org $1000
+ .incbin "symbols_pattern.bin"
+ .db 0, 0, 0, 0, 0, 0, 0, 0
+ .db 0, 0, 0, 0, 0, 0, 0, 0
diff --git a/tools_sources/NesTiler b/tools_sources/NesTiler
-Subproject a6798009ec5a1da7ece61ab3c6f61faaee3aed1
+Subproject 24d6fc8baa4ecb687418f1d0ebf94ecfafed3f2
diff --git a/warface.asm b/warface.asm
index 9beb20d..504fb48 100644
--- a/warface.asm
+++ b/warface.asm
@@ -22,9 +22,17 @@ OAMDMA .equ $4014
.rsset $0020 ; адрес для переменных
ACTIVE_BANK .rs 1 ; текущий PRG банк
CONSOLE_TYPE .rs 1 ; тип консоли
-COPY_SOURCE_ADDR .rs 2
-PAL_SOURCE_ADDR .rs 2
-PALETTE_CACHE .rs 16
+COPY_SOURCE_ADDR .rs 2 ; исходный адрес для копирования данный
+PAL_SOURCE_ADDR .rs 2 ; исходный адрес для загрузки палитры
+PALETTE_CACHE .rs 16 ; кеш для временного хранения палитры
+TEXT_SOURCE_ADDR .rs 2 ; исходный адрес текста
+TEXT_LINE .rs 1 ; текущая строка текста на экране
+TEXT_POS .rs 2 ; текущая позиция текста в строке
+TEXT_NAMETABLE .rs 1 ; текущий nametable для текста
+TEXT_SCROLL_STARTED .rs 1 ; флаг, что запущен автоскроллинг
+SCROLL_POS .rs 1 ; текущая позиция скроллинга
+SCROLL_NT .rs 1 ; текущий nametable скроллинга
+SCROLL_TARGET_POS .rs 1 ; целевая позиция скроллинга
.bank 12 ; PRG банк #12, середина PRG
.org $9213
@@ -57,9 +65,9 @@ Start:
ldx CONSOLE_TYPE
jsr $A999 ; Инициализируем музыкальный проигрыватель
- cli
jsr disable_ppu
- jsr wait_blank_simple
+ ; обнуляем скроллинг
+ jsr reset_scroll
; загружаем nametable
lda #BANK(title_name_table)/2
jsr select_prg_bank
@@ -69,42 +77,159 @@ Start:
sta COPY_SOURCE_ADDR+1
jsr load_name_table
; выбираем CHR банк с автопереключением
- jsr wait_blank_simple
- lda #0
+ lda #(BANK(title_pattern)-16)/2
jsr select_chr_bank
+ ; включаем PPU
jsr enable_ppu
; загружаем палитру
- lda #BANK(title_palette)/2
+ lda #0
jsr select_prg_bank
lda #LOW(title_palette)
sta PAL_SOURCE_ADDR
lda #HIGH(title_palette)
sta PAL_SOURCE_ADDR+1
-
- ; бесконечный цикл
-main_loop:
+ ; плавно прибавляем яркость
jsr dim_in
+ cli ; музыка
+ ; ждём любую кнопку
+ jsr wait_any_button
+ ; убавляем яркость
+ 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
+ ; загружаем nametable
+ lda #BANK(frame_0_name_table)/2
+ jsr select_prg_bank
+ lda #LOW(frame_0_name_table)
+ sta COPY_SOURCE_ADDR
+ lda #HIGH(frame_0_name_table)
+ sta COPY_SOURCE_ADDR+1
+ jsr load_name_table
+ ; выбираем CHR банк с автопереключением
+ lda #(BANK(frame_0_pattern)-16)/2
+ jsr select_chr_bank
+ ; включаем PPU
+ jsr enable_ppu
+ ; загружаем палитру
+ lda #0
+ jsr select_prg_bank
+ lda #LOW(frame_0_palette)
+ sta PAL_SOURCE_ADDR
+ lda #HIGH(frame_0_palette)
+ sta PAL_SOURCE_ADDR+1
+ ; плавно прибавляем яркость
+ jsr dim_in
+ ; ждём любую кнопку
+ jsr wait_any_button
+ ; убавляем яркость
+ 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_1_name_table)/2
+ jsr select_prg_bank
+ lda #LOW(frame_1_name_table)
+ sta COPY_SOURCE_ADDR
+ lda #HIGH(frame_1_name_table)
+ sta COPY_SOURCE_ADDR+1
+ jsr load_name_table
+ ; выбираем CHR банк с автопереключением
+ lda #(BANK(frame_1_pattern)-16)/2
+ jsr select_chr_bank
+ ; включаем PPU
+ jsr enable_ppu
+ ; загружаем палитру
+ lda #0
+ jsr select_prg_bank
+ lda #LOW(frame_1_palette)
+ sta PAL_SOURCE_ADDR
+ lda #HIGH(frame_1_palette)
+ sta PAL_SOURCE_ADDR+1
+ ; плавно прибавляем яркость
+ jsr dim_in
+ ; ждём любую кнопку
+ jsr wait_any_button
+ ; убавляем яркость
+ jsr dim_out
+
jsr wait_blank
- jsr wait_blank
- jsr wait_blank
- jsr wait_blank
- jsr wait_blank
+ ; отображаем текст
+ lda #LOW(text_2)
+ 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
+ ; обнуляем скроллинг
+ jsr reset_scroll
+ ; загружаем nametable
+ lda #BANK(title_name_table)/2
+ jsr select_prg_bank
+ lda #LOW(title_name_table)
+ sta COPY_SOURCE_ADDR
+ lda #HIGH(title_name_table)
+ sta COPY_SOURCE_ADDR+1
+ jsr load_name_table
+ ; выбираем CHR банк с автопереключением
+ lda #(BANK(title_pattern)-16)/2
+ jsr select_chr_bank
+ ; включаем PPU
+ jsr enable_ppu
+ ; загружаем палитру
+ lda #0
+ jsr select_prg_bank
+ lda #LOW(title_palette)
+ sta PAL_SOURCE_ADDR
+ lda #HIGH(title_palette)
+ sta PAL_SOURCE_ADDR+1
+ ; плавно прибавляем яркость
+ jsr dim_in
+ ; ждём любую кнопку
+ jsr wait_any_button
+ ; убавляем яркость
jsr dim_out
+
jsr wait_blank
- jsr wait_blank
- jsr wait_blank
- jsr wait_blank
- jsr wait_blank
- jsr wait_blank
- jsr wait_blank
- jsr wait_blank
- jsr wait_blank
+ ; отображаем текст
+ lda #LOW(text_3)
+ sta TEXT_SOURCE_ADDR
+ lda #HIGH(text_3)
+ sta TEXT_SOURCE_ADDR+1
+ lda #0
+ jsr select_prg_bank
+ jsr print_text
+main_loop:
+ jsr wait_blank
jmp main_loop
IRQ:
@@ -120,6 +245,10 @@ IRQ:
lda #6
sta $6000
jsr $A99C ; играем музыку
+ ; читаем контроллер
+ lda #0
+ sta $6000
+ jsr read_controller
; возвращаем назад активный банк
lda ACTIVE_BANK
sta $6000
@@ -170,10 +299,17 @@ enable_ppu:
bit PPUSTATUS
lda #0
sta PPUSCROLL
+ lda SCROLL_POS
sta PPUSCROLL
+ lda SCROLL_NT
+ bne .second_nt
lda #%10000000
+ jmp .write_ppuctrl
+.second_nt:
+ lda #%10000010
+.write_ppuctrl
sta PPUCTRL
- lda #%00001010
+ lda #%00011110
sta PPUMASK
jsr wait_blank_simple
rts
@@ -204,6 +340,21 @@ wait_blank:
txa
pha
+ ; скроллим, если нужно
+ lda SCROLL_POS
+ cmp SCROLL_TARGET_POS
+ beq .end_scroll
+ inc SCROLL_POS
+ lda SCROLL_POS
+ cmp #240
+ bne .end_scroll
+ lda #0
+ sta SCROLL_POS
+ lda SCROLL_NT
+ eor #1
+ sta SCROLL_NT
+.end_scroll:
+
jsr enable_ppu
pla
@@ -251,6 +402,28 @@ dim_out:
jsr dim_out_s
rts
+reset_scroll:
+ lda #0
+ sta SCROLL_POS
+ sta SCROLL_NT
+ sta SCROLL_TARGET_POS
+ rts
+
+ ; waiting for button release
+wait_buttons_not_pressed:
+ jsr wait_blank ; waiting for v-blank
+ lda <BUTTONS
+ bne wait_buttons_not_pressed
+ rts
+
+ ; waiting for any button pressed
+wait_any_button:
+ jsr wait_blank ; waiting for v-blank
+ lda <BUTTONS
+ beq wait_any_button
+ rts
+
.include "bank0_subroutines.asm"
+ .include "buttons.asm"
.include "nametables.asm"
.include "patterns.asm"