diff options
author | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2020-09-21 00:12:29 +0300 |
---|---|---|
committer | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2020-09-21 00:12:29 +0300 |
commit | 5004c7f0e63de963b8ae987b10535f8fb921c646 (patch) | |
tree | 3ea80771337c905f28cab2cb7d21918d6da031d5 | |
parent | b03de3e3eaf063dce942de66bbb3ebef21619a38 (diff) |
More build info
-rw-r--r-- | banking.asm | 78 | ||||
-rw-r--r-- | buildinfo.asm | 219 | ||||
-rw-r--r-- | buttons.asm | 4 | ||||
-rw-r--r-- | flash.asm | 16 | ||||
-rw-r--r-- | loader.asm | 7 | ||||
-rw-r--r-- | menu.asm | 23 | ||||
-rw-r--r-- | preloader.asm | 47 | ||||
-rw-r--r-- | tests.asm | 58 | ||||
-rw-r--r-- | tools_sources/CoolboyCombiner/CoolboyCombiner.csproj | 1 | ||||
-rw-r--r-- | tools_sources/CoolboyCombiner/Program.cs | 82 | ||||
-rw-r--r-- | video.asm | 98 |
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
@@ -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 @@ -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)
@@ -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 @@ -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)
{
@@ -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 |