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

github.com/ClusterM/coolboy-multirom-builder.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2020-09-21 00:12:29 +0300
committerAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2020-09-21 00:12:29 +0300
commit5004c7f0e63de963b8ae987b10535f8fb921c646 (patch)
tree3ea80771337c905f28cab2cb7d21918d6da031d5
parentb03de3e3eaf063dce942de66bbb3ebef21619a38 (diff)
More build info
-rw-r--r--banking.asm78
-rw-r--r--buildinfo.asm219
-rw-r--r--buttons.asm4
-rw-r--r--flash.asm16
-rw-r--r--loader.asm7
-rw-r--r--menu.asm23
-rw-r--r--preloader.asm47
-rw-r--r--tests.asm58
-rw-r--r--tools_sources/CoolboyCombiner/CoolboyCombiner.csproj1
-rw-r--r--tools_sources/CoolboyCombiner/Program.cs82
-rw-r--r--video.asm98
11 files changed, 400 insertions, 233 deletions
diff --git a/banking.asm b/banking.asm
index 06be735..8f71f2b 100644
--- a/banking.asm
+++ b/banking.asm
@@ -1,44 +1,62 @@
banking_init:
+ ; CHR at $0000-$07FF
lda #$00
sta $8000
lda #$00
sta $8001
-
+ ; CHR at $0800-$0FFF
lda #$01
sta $8000
lda #$02
sta $8001
-
+ ; CHR at $1000-$13FF
lda #$02
sta $8000
lda #$04
sta $8001
-
+ ; CHR at $1400-$17FF
lda #$03
sta $8000
lda #$05
sta $8001
-
+ ; CHR at $1800-$1BFF
lda #$04
sta $8000
lda #$06
sta $8001
-
+ ; CHR at $1C00-$1FFF
lda #$05
sta $8000
lda #$07
sta $8001
-
+ ; mirroring
lda #$01
- sta $A000 ; mirroring
+ sta $A000
+ ; PRG-RAM protect
+ lda #$00
+ sta $A001
+ rts
+enable_prg_ram:
+ lda #$80
+ sta $A001
+ rts
+
+disable_prg_ram:
lda #$00
- sta $A001 ; PRG-RAM protect
+ sta $A001
+ rts
+enable_chr_write:
+ ; not supported on COOLBOY :(
+ rts
+
+disable_chr_write:
+ ; not supported on COOLBOY :(
rts
; select 16KB bank at $8000-$BFFF
-select_bank:
+select_prg_bank:
clc
adc #$18 ; start of ROM (+368K)
ldx #6
@@ -50,3 +68,45 @@ select_bank:
ora #1
sta $8001
rts
+
+ ; select 8KB bank
+select_chr_bank:
+ asl A
+ asl A
+ asl A
+ pha
+ lda #0
+ sta $8000
+ pla
+ pha
+ sta $8001
+ lda #1
+ sta $8000
+ pla
+ pha
+ ora #%00000010
+ sta $8001
+ lda #2
+ sta $8000
+ pla
+ pha
+ ora #%00000100
+ sta $8001
+ lda #3
+ sta $8000
+ pla
+ pha
+ ora #%00000101
+ sta $8001
+ lda #4
+ sta $8000
+ pla
+ pha
+ ora #%00000110
+ sta $8001
+ lda #5
+ sta $8000
+ pla
+ ora #%00000111
+ sta $8001
+ rts
diff --git a/buildinfo.asm b/buildinfo.asm
index a3dcde4..28f8ec2 100644
--- a/buildinfo.asm
+++ b/buildinfo.asm
@@ -1,182 +1,177 @@
+PRG_RAM_PRESENT .rs 1 ; PRG RAM present flag
+
; build info
show_build_info:
+ jsr prg_ram_detect
+
bit $2002
lda #$21
sta $2006
- lda #$44
+ lda #$24
sta $2006
; filename
- lda #LOW(build_info0)
+ lda #LOW(string_file)
sta <COPY_SOURCE_ADDR
- lda #HIGH(build_info0)
+ lda #HIGH(string_file)
sta <COPY_SOURCE_ADDR+1
jsr print_text
lda #$21
sta $2006
- lda #$84
+ lda #$64
sta $2006
; build date
- lda #LOW(build_info2)
+ lda #LOW(string_build_date)
sta <COPY_SOURCE_ADDR
- lda #HIGH(build_info2)
+ lda #HIGH(string_build_date)
sta <COPY_SOURCE_ADDR+1
jsr print_text
lda #$21
sta $2006
- lda #$C4
+ lda #$A4
sta $2006
; build time
- lda #LOW(build_info3)
+ lda #LOW(string_build_time)
sta <COPY_SOURCE_ADDR
- lda #HIGH(build_info3)
+ lda #HIGH(string_build_time)
sta <COPY_SOURCE_ADDR+1
jsr print_text
- lda #$22
+ lda #$21
sta $2006
- lda #$04
+ lda #$E4
sta $2006
; console region/type
- lda #LOW(console_type_text)
+ lda #LOW(string_console_type)
sta <COPY_SOURCE_ADDR
- lda #HIGH(console_type_text)
+ lda #HIGH(string_console_type)
sta <COPY_SOURCE_ADDR+1
jsr print_text
lda <CONSOLE_TYPE
and #$08
beq .console_type_no_NEW
- lda #LOW(console_type_NEW)
+ lda #LOW(string_new)
sta <COPY_SOURCE_ADDR
- lda #HIGH(console_type_NEW)
+ lda #HIGH(string_new)
sta <COPY_SOURCE_ADDR+1
jsr print_text
.console_type_no_NEW:
lda <CONSOLE_TYPE
and #$01
beq .console_type_no_NTSC
- lda #LOW(console_type_NTSC)
+ lda #LOW(string_ntsc)
sta <COPY_SOURCE_ADDR
- lda #HIGH(console_type_NTSC)
+ lda #HIGH(string_ntsc)
sta <COPY_SOURCE_ADDR+1
jsr print_text
.console_type_no_NTSC:
lda <CONSOLE_TYPE
and #$02
beq .console_type_no_PAL
- lda #LOW(console_type_PAL)
+ lda #LOW(string_pal)
sta <COPY_SOURCE_ADDR
- lda #HIGH(console_type_PAL)
+ lda #HIGH(string_pal)
sta <COPY_SOURCE_ADDR+1
jsr print_text
.console_type_no_PAL:
lda <CONSOLE_TYPE
and #$04
beq .console_type_no_DENDY
- lda #LOW(console_type_DENDY)
+ lda #LOW(string_dendy)
sta <COPY_SOURCE_ADDR
- lda #HIGH(console_type_DENDY)
+ lda #HIGH(string_dendy)
sta <COPY_SOURCE_ADDR+1
jsr print_text
.console_type_no_DENDY:
+ ; flash memory type and size
print_flash_type:
lda #$22
sta $2006
- lda #$44
+ lda #$24
sta $2006
- ; flash memory type and size
- ldy #0
-.next_char:
- lda flash_type, y
- sta $2007
- iny
- cmp #0
- bne .next_char
+ lda #LOW(string_flash)
+ sta <COPY_SOURCE_ADDR
+ lda #HIGH(string_flash)
+ sta <COPY_SOURCE_ADDR+1
+ jsr print_text
+
+ ; is it writable?
lda <FLASH_TYPE
bne .writable
-
- ldy #0
-.ro_next_char:
- lda flash_type_read_only, y
- sta $2007
- iny
- cmp #0
- bne .ro_next_char
- jmp .end
+ lda #LOW(string_read_only)
+ sta <COPY_SOURCE_ADDR
+ lda #HIGH(string_read_only)
+ sta <COPY_SOURCE_ADDR+1
+ jsr print_text
+ jmp print_chr_size
+ ; yes, it's writable
.writable:
- ldy #0
-.writable_next_char:
- lda flash_type_writable, y
- sta $2007
- iny
- cmp #0
- bne .writable_next_char
-
- lda <FLASH_TYPE
- cmp #21
- bne .not_2mb
- ldy #0
-.2mb_next_char:
- lda flash_type_2mb, y
- sta $2007
- iny
- cmp #0
- bne .2mb_next_char
-.not_2mb:
-
- lda <FLASH_TYPE
- cmp #22
- bne .not_4mb
- ldy #0
-.4mb_next_char:
- lda flash_type_4mb, y
- sta $2007
- iny
- cmp #0
- bne .4mb_next_char
-.not_4mb:
-
- lda <FLASH_TYPE
- cmp #23
- bne .not_8mb
- ldy #0
-.8mb_next_char:
- lda flash_type_8mb, y
- sta $2007
- iny
- cmp #0
- bne .8mb_next_char
-.not_8mb:
+ lda #LOW(string_writable)
+ sta <COPY_SOURCE_ADDR
+ lda #HIGH(string_writable)
+ sta <COPY_SOURCE_ADDR+1
+ jsr print_text
+ ; how many memory?
lda <FLASH_TYPE
- cmp #24
- bne .not_16mb
- ldy #0
-.16mb_next_char:
- lda flash_type_16mb, y
- sta $2007
- iny
- cmp #0
- bne .16mb_next_char
-.not_16mb:
+ sec
+ sbc #20
+ asl A
+ tay
+ lda flash_sizes, y
+ sta <COPY_SOURCE_ADDR
+ lda flash_sizes+1, y
+ sta <COPY_SOURCE_ADDR+1
+ jsr print_text
- lda <FLASH_TYPE
- cmp #25
- bne .not_32mb
- ldy #0
-.32mb_next_char:
- lda flash_type_32mb, y
- sta $2007
- iny
- cmp #0
- bne .32mb_next_char
-.not_32mb:
+print_chr_size:
+ lda #$22
+ sta $2006
+ lda #$64
+ sta $2006
+ lda #LOW(string_chr_ram)
+ sta <COPY_SOURCE_ADDR
+ lda #HIGH(string_chr_ram)
+ sta <COPY_SOURCE_ADDR+1
+ jsr print_text
+ lda <CHR_RAM_SIZE
+ asl A
+ tay
+ lda chr_ram_sizes, y
+ sta <COPY_SOURCE_ADDR
+ lda chr_ram_sizes+1, y
+ sta <COPY_SOURCE_ADDR+1
+ jsr print_text
+print_prg_ram:
+ lda #$22
+ sta $2006
+ lda #$A4
+ sta $2006
+ lda #LOW(string_prg_ram)
+ sta <COPY_SOURCE_ADDR
+ lda #HIGH(string_prg_ram)
+ sta <COPY_SOURCE_ADDR+1
+ jsr print_text
+ lda PRG_RAM_PRESENT
+ beq .not_present
+ lda #LOW(string_present)
+ sta <COPY_SOURCE_ADDR
+ lda #HIGH(string_present)
+ sta <COPY_SOURCE_ADDR+1
+ jmp .end
+.not_present:
+ lda #LOW(string_not_available)
+ sta <COPY_SOURCE_ADDR
+ lda #HIGH(string_not_available)
+ sta <COPY_SOURCE_ADDR+1
.end:
+ jsr print_text
+
lda #$23
sta $2006
lda #$00
@@ -206,3 +201,21 @@ show_build_info_infin:
lda #%00011110
sta $2001
jmp show_build_info_infin
+
+prg_ram_detect:
+ lda #0
+ sta PRG_RAM_PRESENT
+ jsr enable_prg_ram
+ lda #$AA
+ sta $7000
+ cmp $7000
+ bne .end
+ lda #$55
+ sta $7000
+ cmp $7000
+ bne .end
+ lda #1
+ sta PRG_RAM_PRESENT
+.end:
+ jsr disable_prg_ram
+ rts
diff --git a/buttons.asm b/buttons.asm
index 05a2953..1644888 100644
--- a/buttons.asm
+++ b/buttons.asm
@@ -261,7 +261,7 @@ buttons_check:
; need to skip separator when scrolling upwards
.check_separator_down:
lda <SELECTED_GAME+1
- jsr select_bank
+ jsr select_prg_bank
ldx <SELECTED_GAME
lda loader_data_game_type, x
and #$80
@@ -280,7 +280,7 @@ buttons_check:
; need to skip separator when scrolling downwards
.check_separator_up:
lda <SELECTED_GAME+1
- jsr select_bank
+ jsr select_prg_bank
ldx <SELECTED_GAME
lda loader_data_game_type, x
and #$80
diff --git a/flash.asm b/flash.asm
index 9028efb..71b9565 100644
--- a/flash.asm
+++ b/flash.asm
@@ -2,12 +2,12 @@ FLASH_TYPE .rs 1 ; flash memory type
STATE_CELL_NEXT .rs 2 ; address of cell for next state save
flash_detect:
- lda #$F0
- sta $8000
lda #0
sta <FLASH_TYPE
+ ; enter flash CFI mode
lda #$98
sta $8AAA
+ ; check for CFI signature
lda $8020
cmp #'Q'
bne .end
@@ -15,7 +15,7 @@ flash_detect:
cmp #'R'
bne .end
lda $8024
- cmp #'I'
+ cmp #'Y'
bne .end
lda $804E
sta <FLASH_TYPE
@@ -26,7 +26,7 @@ flash_detect:
; NROM_BANK_L, NROM_BANK_H - bank
flash_erase_sector:
- jsr select_16k_bank
+ jsr select_prg_chr_banks
lda #$F0
sta $8000
lda #$AA
@@ -51,7 +51,7 @@ flash_erase_sector:
; COPY_DEST_ADDR - dest. address
; x - count (bytes)
flash_write:
- jsr select_16k_bank
+ jsr select_prg_chr_banks
lda #$80 ; PRG-RAM unprotect
sta $A001
lda #$F0 ; reset flash
@@ -82,7 +82,7 @@ flash_write:
; COPY_SOURCE_ADDR - source address
; x - count (bytes)
flash_read:
- jsr select_16k_bank
+ jsr select_prg_chr_banks
ldy #$00
.loop:
lda [COPY_SOURCE_ADDR], y
@@ -149,7 +149,7 @@ flash_load_prg_ram:
; NROM_BANK_L, NROM_BANK_H - bank
; STATE_CELL_NEXT - start address, result
flash_find_empty_cell:
- jsr select_16k_bank
+ jsr select_prg_chr_banks
lda #0
ldx #0
.prep_loop:
@@ -158,7 +158,7 @@ flash_find_empty_cell:
adc #8
inx
bne .prep_loop
- jsr select_16k_bank
+ jsr select_prg_chr_banks
lda #$80
sta <STATE_CELL_NEXT+1
lda #$00
diff --git a/loader.asm b/loader.asm
index 1a7940d..7034199 100644
--- a/loader.asm
+++ b/loader.asm
@@ -134,7 +134,7 @@ load_all_chr_banks:
lda <LOADER_CHR_START_S
sta <COPY_SOURCE_ADDR+1
.loop:
- jsr select_16k_bank ; selecting source and target banks
+ jsr select_prg_chr_banks ; selecting source and target banks
jsr load_chr ; loading CHR data from COPY_SOURCE_ADDR to CHR RAM
lda <COPY_SOURCE_ADDR+1 ; increamenting source address
and #$A0 ; or from $A000 to $8000
@@ -167,8 +167,9 @@ load_all_chr_banks:
rts
; select 16KB NROM bank from the whole flash memory
- ; $C000-$FFFF is a mirror for $8000-$BFFF
-select_16k_bank:
+ ; and 8KB CHR bank from the whole CHR RAM memory
+ ; $C000-$FFFF is a mirror for $8000-$BFFF
+select_prg_chr_banks:
lda #$00
sta $A001 ; PRG-RAM protect
;<NROM_BANK_L (1-8) <NROM_BANK_H (9-11) <CHR_BANK8 (7-3)
diff --git a/menu.asm b/menu.asm
index 5ea2f8c..ea52a1c 100644
--- a/menu.asm
+++ b/menu.asm
@@ -93,18 +93,19 @@ Start:
sta $2001
jsr waitblank_simple
+ ; loading loader and other RAM routines
ldx #$00
-.loadloader:
- lda loader+$C000, x ; loading loader and other RAM routines
- sta loader, x
- lda loader+$C100, x
- sta loader+$100, x
- lda loader+$C200, x
- sta loader+$200, x
+.load_ram_routines:
+ lda ram_routines+$C000, x
+ sta ram_routines, x
+ lda ram_routines+$C100, x
+ sta ram_routines+$100, x
+ lda ram_routines+$C200, x
+ sta ram_routines+$200, x
inx
- bne .loadloader
+ bne .load_ram_routines
- ; init banks
+ ; init banks and other cart stuff
jsr banking_init
; detect console type
jsr console_detect
@@ -184,6 +185,7 @@ Start:
cmp <BUTTONS
bne .skip_build_info
; build and hardware info
+ jsr detect_chr_ram_size
jmp show_build_info
.skip_build_info:
ldx games_count
@@ -340,5 +342,6 @@ tilepal:
; routines to be executed from RAM
.bank 14
.org $0500 ; actually it's $C500 in cartridge memory
- .include "loader.asm"
+ram_routines:
.include "flash.asm"
+ .include "loader.asm"
diff --git a/preloader.asm b/preloader.asm
index bf25e21..65b066c 100644
--- a/preloader.asm
+++ b/preloader.asm
@@ -1,11 +1,12 @@
; starting game!
start_game:
- sei ; no interrupts
-
- lda #%00000000 ; disable PPU
+ ; disable PPU
+ lda #%00000000
sta $2000
lda #%00000000
sta $2001
+ ; wait for v-blank
+ jsr waitblank_simple
.if SECRETS>=3
; check for konami code
@@ -21,14 +22,10 @@ start_game:
sta <SELECTED_GAME+1
.no_konami_code:
.endif
- jsr waitblank_simple ; wait for vblank
- jsr clear_screen ; clear nametable
- jsr clear_sprites
- jsr sprite_dma_copy
; loading game settings
lda <SELECTED_GAME+1
- jsr select_bank
+ jsr select_prg_bank
ldx <SELECTED_GAME
lda loader_data_reg_0, x
sta <LOADER_REG_0
@@ -61,29 +58,16 @@ start_game:
lda #0
sta <LAST_STARTED_SAVE
jsr save_state
+ jsr load_text_palette
lda #$21
sta $2006
lda #$A0
sta $2006
- ldy #0
-.incompatible_print_error:
- ; text
- lda incompatible_console_text, y
- sta $2007
- iny
- cmp #0
- bne .incompatible_print_error
- lda #$23
- sta $2006
- lda #$C8
- sta $2006
- lda #$FF
- ldy #$38
-.incompatible_print_error_palette:
- sta $2007
- dey
- bne .incompatible_print_error_palette
- jsr waitblank_simple
+ lda #LOW(string_incompatible_console)
+ sta <COPY_SOURCE_ADDR
+ lda #HIGH(string_incompatible_console)
+ sta <COPY_SOURCE_ADDR+1
+ jsr print_text
bit $2002
lda #0
sta $2005
@@ -104,7 +88,14 @@ start_game:
jmp Start
.compatible_console:
- ;jsr load_black ; black color
+ jsr clear_screen
+ ; clear sprite data
+ jsr clear_sprites
+ ; load this empty data
+ jsr sprite_dma_copy
+ ; load black palette
+ jsr load_black
+ ; loading game settings
jsr save_state
jsr load_all_chr_banks
diff --git a/tests.asm b/tests.asm
index 916a13f..d882b0f 100644
--- a/tests.asm
+++ b/tests.asm
@@ -141,54 +141,58 @@ do_tests:
inc TEST_STATE
jmp .do_tests_chr_again
-.tests_end: ; results
+ ; results
+.tests_end:
jsr load_base_chr
jsr clear_screen
- lda #$23 ; palette for text
- sta $2006
- lda #$C8
- sta $2006
- lda #$FF
- ldy #$38
-.tests_end_palette:
- sta $2007
- dey
- bne .tests_end_palette
+ jsr load_text_palette
lda #$21
sta $2006
lda #$A4
sta $2006
- ldy #0
-.sram_test_result_next:
+ lda #LOW(string_prg_ram_test)
+ sta <COPY_SOURCE_ADDR
+ lda #HIGH(string_prg_ram_test)
+ sta <COPY_SOURCE_ADDR+1
+ jsr print_text
ldx TEST_SRAM_FAILED
bne .sram_test_result_fail
- lda sram_test_ok_text, y
+ lda #LOW(string_passed)
+ sta <COPY_SOURCE_ADDR
+ lda #HIGH(string_passed)
+ sta <COPY_SOURCE_ADDR+1
jmp .sram_test_result_print
.sram_test_result_fail:
- lda sram_test_failed_text, y
+ lda #LOW(string_failed)
+ sta <COPY_SOURCE_ADDR
+ lda #HIGH(string_failed)
+ sta <COPY_SOURCE_ADDR+1
.sram_test_result_print:
- sta $2007
- iny
- cmp #0
- bne .sram_test_result_next
+ jsr print_text
lda #$21
sta $2006
lda #$E4
sta $2006
- ldy #0
-.chr_test_result_next:
+ lda #LOW(string_chr_ram_test)
+ sta <COPY_SOURCE_ADDR
+ lda #HIGH(string_chr_ram_test)
+ sta <COPY_SOURCE_ADDR+1
+ jsr print_text
ldx TEST_CHR_RAM_FAILED
bne .chr_test_result_fail
- lda chr_test_ok_text, y
+ lda #LOW(string_passed)
+ sta <COPY_SOURCE_ADDR
+ lda #HIGH(string_passed)
+ sta <COPY_SOURCE_ADDR+1
jmp .chr_test_result_print
.chr_test_result_fail:
- lda chr_test_failed_text, y
+ lda #LOW(string_failed)
+ sta <COPY_SOURCE_ADDR
+ lda #HIGH(string_failed)
+ sta <COPY_SOURCE_ADDR+1
.chr_test_result_print:
- sta $2007
- iny
- cmp #0
- bne .chr_test_result_next
+ jsr print_text
lda #0
sta $2005
sta $2005
diff --git a/tools_sources/CoolboyCombiner/CoolboyCombiner.csproj b/tools_sources/CoolboyCombiner/CoolboyCombiner.csproj
index 6c88fff..8ef207b 100644
--- a/tools_sources/CoolboyCombiner/CoolboyCombiner.csproj
+++ b/tools_sources/CoolboyCombiner/CoolboyCombiner.csproj
@@ -41,7 +41,6 @@
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
- <Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
diff --git a/tools_sources/CoolboyCombiner/Program.cs b/tools_sources/CoolboyCombiner/Program.cs
index 9c905d1..1040753 100644
--- a/tools_sources/CoolboyCombiner/Program.cs
+++ b/tools_sources/CoolboyCombiner/Program.cs
@@ -584,57 +584,75 @@ namespace Cluster.Famicom
asmResult.AppendLine(" .dw " + Math.Max(0, games.Count - 11 - hiddenCount));
asmResult.AppendLine();
asmResult.AppendLine();
- asmResult.AppendLine("build_info0:");
+ asmResult.AppendLine("string_file:");
asmResult.Append(BytesToAsm(StringToTiles("FILE: " + Path.GetFileName(optionGames))));
- asmResult.AppendLine("build_info2:");
+ asmResult.AppendLine("string_build_date:");
asmResult.Append(BytesToAsm(StringToTiles("BUILD DATE: " + DateTime.Now.ToString("yyyy-MM-dd"))));
- asmResult.AppendLine("build_info3:");
+ asmResult.AppendLine("string_build_time:");
asmResult.Append(BytesToAsm(StringToTiles("BUILD TIME: " + DateTime.Now.ToString("HH:mm:ss"))));
- asmResult.AppendLine("console_type_text:");
+ asmResult.AppendLine("string_console_type:");
asmResult.Append(BytesToAsm(StringToTiles("CONSOLE TYPE:")));
- asmResult.AppendLine("console_type_NTSC:");
+ asmResult.AppendLine("string_ntsc:");
asmResult.Append(BytesToAsm(StringToTiles("NTSC")));
- asmResult.AppendLine("console_type_PAL:");
+ asmResult.AppendLine("string_pal:");
asmResult.Append(BytesToAsm(StringToTiles("PAL")));
- asmResult.AppendLine("console_type_DENDY:");
+ asmResult.AppendLine("string_dendy:");
asmResult.Append(BytesToAsm(StringToTiles("DENDY")));
- asmResult.AppendLine("console_type_NEW:");
+ asmResult.AppendLine("string_new:");
asmResult.Append(BytesToAsm(StringToTiles("NEW")));
- asmResult.AppendLine("flash_type:");
+ asmResult.AppendLine("string_flash:");
asmResult.Append(BytesToAsm(StringToTiles("FLASH:")));
- asmResult.AppendLine("flash_type_read_only:");
+ asmResult.AppendLine("string_read_only:");
asmResult.Append(BytesToAsm(StringToTiles("READ ONLY")));
- asmResult.AppendLine("flash_type_writable:");
+ asmResult.AppendLine("string_writable:");
asmResult.Append(BytesToAsm(StringToTiles("WRITABLE")));
- asmResult.AppendLine("flash_type_2mb:");
- asmResult.Append(BytesToAsm(StringToTiles("2MB")));
- asmResult.AppendLine("flash_type_4mb:");
- asmResult.Append(BytesToAsm(StringToTiles("4MB")));
- asmResult.AppendLine("flash_type_8mb:");
- asmResult.Append(BytesToAsm(StringToTiles("8MB")));
- asmResult.AppendLine("flash_type_16mb:");
- asmResult.Append(BytesToAsm(StringToTiles("16MB")));
- asmResult.AppendLine("flash_type_32mb:");
- asmResult.Append(BytesToAsm(StringToTiles("32MB")));
- asmResult.AppendLine("saving_text:");
+ asmResult.AppendLine("flash_sizes:");
+ for (int i = 0; i <= 8; i++)
+ asmResult.AppendLine($" .dw string_{1 << i}mb");
+ for (int i = 0; i <= 8; i++)
+ {
+ asmResult.AppendLine($"string_{1 << i}mb:");
+ asmResult.Append(BytesToAsm(StringToTiles($"{1 << i}MB")));
+ }
+ asmResult.AppendLine("string_chr_ram:");
+ asmResult.Append(BytesToAsm(StringToTiles("CHR RAM:")));
+ asmResult.AppendLine("chr_ram_sizes:");
+ for (int i = 0; i <= 8; i++)
+ asmResult.AppendLine($" .dw string_{8 * (1 << i)}kb");
+ for (int i = 0; i <= 8; i++)
+ {
+ asmResult.AppendLine($"string_{8 * (1 << i)}kb:");
+ asmResult.Append(BytesToAsm(StringToTiles($"{8 * (1 << i)}KB")));
+ }
+ asmResult.AppendLine("string_prg_ram:");
+ asmResult.Append(BytesToAsm(StringToTiles("PRG RAM:")));
+ asmResult.AppendLine("string_present:");
+ asmResult.Append(BytesToAsm(StringToTiles("PRESENT")));
+ asmResult.AppendLine("string_not_available:");
+ asmResult.Append(BytesToAsm(StringToTiles("NOT AVAILABLE")));
+ asmResult.AppendLine("string_saving:");
if (optionLanguage == "rus")
asmResult.Append(BytesToAsm(StringToTiles(" СОХРАНЯЕМСЯ... НЕ ВЫКЛЮЧАЙ! ")));
else
asmResult.Append(BytesToAsm(StringToTiles(" SAVING... DON'T TURN OFF! ")));
File.WriteAllText(optionAsm, asmResult.ToString());
- asmResult.AppendLine("incompatible_console_text:");
+ asmResult.AppendLine("string_incompatible_console:");
if (optionLanguage == "rus")
asmResult.Append(BytesToAsm(StringToTiles(" ИЗВИНИТЕ, ДАННАЯ ИГРА НЕСОВМЕСТИМА С ЭТОЙ КОНСОЛЬЮ НАЖМИТЕ ЛЮБУЮ КНОПКУ ")));
else
asmResult.Append(BytesToAsm(StringToTiles(" SORRY, THIS GAME IS NOT COMPATIBLE WITH THIS CONSOLE PRESS ANY BUTTON ")));
- asmResult.AppendLine("sram_test_ok_text:");
- asmResult.Append(BytesToAsm(StringToTiles("PRG RAM TEST: OK")));
- asmResult.AppendLine("sram_test_failed_text:");
- asmResult.Append(BytesToAsm(StringToTiles("PRG RAM TEST: FAILED")));
- asmResult.AppendLine("chr_test_ok_text:");
- asmResult.Append(BytesToAsm(StringToTiles("CHR RAM TEST: OK")));
- asmResult.AppendLine("chr_test_failed_text:");
- asmResult.Append(BytesToAsm(StringToTiles("CHR RAM TEST: FAILED")));
+ asmResult.AppendLine("string_prg_ram_test:");
+ asmResult.Append(BytesToAsm(StringToTiles("PRG RAM TEST:")));
+ asmResult.AppendLine("string_chr_ram_test:");
+ asmResult.Append(BytesToAsm(StringToTiles("CHR RAM TEST:")));
+ asmResult.AppendLine("string_passed:");
+ asmResult.Append(BytesToAsm(StringToTiles("PASSED")));
+ asmResult.AppendLine("string_failed:");
+ asmResult.Append(BytesToAsm(StringToTiles("FAILED")));
+ asmResult.AppendLine("string_ok:");
+ asmResult.Append(BytesToAsm(StringToTiles("OK")));
+ asmResult.AppendLine("string_error:");
+ asmResult.Append(BytesToAsm(StringToTiles("ERROR")));
asmResult.AppendLine();
asmResult.AppendLine();
@@ -653,7 +671,7 @@ namespace Cluster.Famicom
asmResult.AppendLine("COOLBOY_REG_3 .equ $5003");
break;
default:
- throw new Exception("Unknown version: 2");
+ throw new Exception($"Unknown version: {coolboyVersion}");
}
if (useFlashWriting)
{
diff --git a/video.asm b/video.asm
index 2c0be23..6d524a1 100644
--- a/video.asm
+++ b/video.asm
@@ -13,6 +13,8 @@ LAST_LINE_GAME .rs 2
SCROLL_FINE .rs 1 ; fine scroll position
SCROLL_LINES_TARGET .rs 2 ; scrolling target
STAR_SPAWN_TIMER .rs 1 ; stars spawn timer
+ ; for build info
+CHR_RAM_SIZE .rs 1 ; CHR RAM size 8*2^xKB
; constants
CHARS_PER_LINE .equ 32
@@ -159,7 +161,7 @@ scroll_line_up:
load_base_chr:
; loading CHR
lda #$06
- jsr select_bank
+ jsr select_prg_bank
lda #LOW(chr_data)
sta COPY_SOURCE_ADDR
lda #HIGH(chr_data)
@@ -247,7 +249,7 @@ sprite_dma_copy:
; loading header (image on the top), first part
draw_header1:
lda #$06
- jsr select_bank
+ jsr select_prg_bank
bit $2002
lda #$20
sta $2006
@@ -266,7 +268,7 @@ draw_header1:
; loading header (image on the top), second part
draw_header2:
lda #$06
- jsr select_bank
+ jsr select_prg_bank
bit $2002
lda #$20
sta $2006
@@ -298,7 +300,7 @@ draw_header2:
; loading footer (image on the bottom), first part
draw_footer1:
lda #$06
- jsr select_bank
+ jsr select_prg_bank
ldx #0
ldy #$40
.loop:
@@ -312,7 +314,7 @@ draw_footer1:
; loading footer (image on the bottom), second part
draw_footer2:
lda #$06
- jsr select_bank
+ jsr select_prg_bank
ldx #0
ldy #$40
.loop:
@@ -448,7 +450,7 @@ print_name:
jmp .end
.print_text_line:
lda <TEXT_DRAW_GAME+1
- jsr select_bank
+ jsr select_prg_bank
lda #LOW(game_names)
clc
adc <TEXT_DRAW_GAME
@@ -719,7 +721,7 @@ set_cursor_targets:
sta <SPRITE_0_X_TARGET
; right cursor, X
lda <SELECTED_GAME+1
- jsr select_bank
+ jsr select_prg_bank
ldx <SELECTED_GAME
ldy loader_data_cursor_pos, x
dey
@@ -839,7 +841,7 @@ stars:
jsr random ; random X
sta SPRITES+3, y
jsr random ; random attributes
- and #%00000011 ; palette - lowest tho bits
+ and #%00000011 ; palette - lowest two bits
ora #%00100000 ; priority bit
sta SPRITES+2, y
.move_next1:
@@ -875,6 +877,7 @@ print_text:
bne .loop
rts
+ ; show "saving... keep power on" message
saving_warning_show:
; disable PPU
lda #%00000000
@@ -886,9 +889,9 @@ saving_warning_show:
sta $2006
lda #$C0
sta $2006
- lda #LOW(saving_text)
+ lda #LOW(string_saving)
sta COPY_SOURCE_ADDR
- lda #HIGH(saving_text)
+ lda #HIGH(string_saving)
sta COPY_SOURCE_ADDR+1
jsr print_text
jsr load_text_palette
@@ -904,6 +907,7 @@ saving_warning_show:
jsr waitblank_simple
rts
+ ; hide this message (clear screen)
saving_warning_hide:
lda #%00000000 ; disable PPU
sta $2000
@@ -911,3 +915,77 @@ saving_warning_hide:
jsr waitblank_simple
jsr clear_screen
rts
+
+detect_chr_ram_size:
+ ; disable PPU
+ lda #%00000000
+ sta $2000
+ sta $2001
+ jsr waitblank_simple
+ jsr enable_chr_write
+ lda #$00
+ sta $2006
+ sta $2006
+ ; store $AA to zero bank
+ sta <CHR_RAM_SIZE
+ lda #$AA
+ sta $2007
+ ; calculate bank number
+.next_size:
+ lda #1
+ ldx CHR_RAM_SIZE
+ ; shift 1 to the left CHR_RAM_SIZE times
+.shift_loop:
+ dex
+ bmi .shift_done
+ asl A
+ beq .end ; overflow check
+ jmp .shift_loop
+.shift_done:
+ ; select this bank
+ jsr select_chr_bank
+ ; store $AA
+ ldx #$00
+ stx $2006
+ stx $2006
+ lda #$AA
+ sta $2007
+ ; check for $AA
+ stx $2006
+ stx $2006
+ ldy $2007 ; dump read
+ cmp $2007
+ bne .end ; check failed
+ ; store $55
+ stx $2006
+ stx $2006
+ lda #$55
+ ; check for $55
+ sta $2007
+ stx $2006
+ stx $2006
+ ldy $2007 ; dump read
+ cmp $2007
+ bne .end ; check failed
+ ; select zero bank
+ lda #0
+ jsr select_chr_bank
+ ; check that $AA is not overwrited
+ stx $2006
+ stx $2006
+ lda #$AA
+ ldy $2007 ; dump read
+ cmp $2007
+ bne .end ; check failed
+ ; OK! Let's check next bank
+ inc <CHR_RAM_SIZE
+ jmp .next_size
+.end:
+ lda #0
+ jsr select_chr_bank
+ lda #0
+ sta $2006
+ sta $2006
+ sta $2007
+ jsr disable_chr_write
+ rts