Skip to content

Commit 623c138

Browse files
authored
Fix off by one in MMC3 8k banking linker script (#269)
This included one too many PRG-ROM sections before the 24KiB fixed region, which caused the ROM to be an invalid size.
1 parent 17de91b commit 623c138

File tree

5 files changed

+61
-41
lines changed

5 files changed

+61
-41
lines changed

mos-platform/nes-mmc3/_prg-rom-banked.ld

Lines changed: 47 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
PROVIDE(__prg_rom_size = 512);
32

43
ASSERT(__prg_rom_size > 32,
@@ -134,17 +133,23 @@ MEMORY {
134133
prg_rom_2 : ORIGIN = __prg_rom_2_lma, LENGTH = 0x2000
135134
prg_rom_3 : ORIGIN = __prg_rom_3_lma, LENGTH = 0x2000
136135
prg_rom_4 : ORIGIN = __prg_rom_4_lma, LENGTH = 0x2000
137-
prg_rom_5 : ORIGIN = __prg_rom_5_lma, LENGTH = 0x2000
138-
prg_rom_6 : ORIGIN = __prg_rom_6_lma, LENGTH = __prg_rom_size > 64 ? 0x2000 : 0
139-
prg_rom_7 : ORIGIN = __prg_rom_7_lma, LENGTH = __prg_rom_size > 64 ? 0x2000 : 0
136+
prg_rom_5 : ORIGIN = __prg_rom_5_lma,
137+
/* The fixed region may take either two or three banks. */
138+
LENGTH =
139+
__prg_rom_size >= 128 || __prg_rom_total_fixed_size == 0x4000 ? 0x2000 : 0
140+
prg_rom_6 : ORIGIN = __prg_rom_6_lma, LENGTH = __prg_rom_size >= 128 ? 0x2000 : 0
141+
prg_rom_7 : ORIGIN = __prg_rom_7_lma, LENGTH = __prg_rom_size >= 128 ? 0x2000 : 0
140142
prg_rom_8 : ORIGIN = __prg_rom_8_lma, LENGTH = __prg_rom_size >= 128 ? 0x2000 : 0
141143
prg_rom_9 : ORIGIN = __prg_rom_9_lma, LENGTH = __prg_rom_size >= 128 ? 0x2000 : 0
142144
prg_rom_10 : ORIGIN = __prg_rom_10_lma, LENGTH = __prg_rom_size >= 128 ? 0x2000 : 0
143145
prg_rom_11 : ORIGIN = __prg_rom_11_lma, LENGTH = __prg_rom_size >= 128 ? 0x2000 : 0
144146
prg_rom_12 : ORIGIN = __prg_rom_12_lma, LENGTH = __prg_rom_size >= 128 ? 0x2000 : 0
145-
prg_rom_13 : ORIGIN = __prg_rom_13_lma, LENGTH = __prg_rom_size >= 128 ? 0x2000 : 0
146-
prg_rom_14 : ORIGIN = __prg_rom_14_lma, LENGTH = __prg_rom_size > 128 ? 0x2000 : 0
147-
prg_rom_15 : ORIGIN = __prg_rom_15_lma, LENGTH = __prg_rom_size > 128 ? 0x2000 : 0
147+
prg_rom_13 : ORIGIN = __prg_rom_13_lma,
148+
LENGTH = (__prg_rom_size >= 128 &&
149+
(__prg_rom_size >= 256 ||
150+
__prg_rom_total_fixed_size == 0x4000)) ? 0x2000 : 0
151+
prg_rom_14 : ORIGIN = __prg_rom_14_lma, LENGTH = __prg_rom_size >= 256 ? 0x2000 : 0
152+
prg_rom_15 : ORIGIN = __prg_rom_15_lma, LENGTH = __prg_rom_size >= 256 ? 0x2000 : 0
148153
prg_rom_16 : ORIGIN = __prg_rom_16_lma, LENGTH = __prg_rom_size >= 256 ? 0x2000 : 0
149154
prg_rom_17 : ORIGIN = __prg_rom_17_lma, LENGTH = __prg_rom_size >= 256 ? 0x2000 : 0
150155
prg_rom_18 : ORIGIN = __prg_rom_18_lma, LENGTH = __prg_rom_size >= 256 ? 0x2000 : 0
@@ -158,38 +163,41 @@ MEMORY {
158163
prg_rom_26 : ORIGIN = __prg_rom_26_lma, LENGTH = __prg_rom_size >= 256 ? 0x2000 : 0
159164
prg_rom_27 : ORIGIN = __prg_rom_27_lma, LENGTH = __prg_rom_size >= 256 ? 0x2000 : 0
160165
prg_rom_28 : ORIGIN = __prg_rom_28_lma, LENGTH = __prg_rom_size >= 256 ? 0x2000 : 0
161-
prg_rom_29 : ORIGIN = __prg_rom_29_lma, LENGTH = __prg_rom_size >= 256 ? 0x2000 : 0
162-
prg_rom_30 : ORIGIN = __prg_rom_30_lma, LENGTH = __prg_rom_size > 256 ? 0x2000 : 0
163-
prg_rom_31 : ORIGIN = __prg_rom_31_lma, LENGTH = __prg_rom_size > 256 ? 0x2000 : 0
164-
prg_rom_32 : ORIGIN = __prg_rom_32_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
165-
prg_rom_33 : ORIGIN = __prg_rom_33_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
166-
prg_rom_34 : ORIGIN = __prg_rom_34_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
167-
prg_rom_35 : ORIGIN = __prg_rom_35_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
168-
prg_rom_36 : ORIGIN = __prg_rom_36_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
169-
prg_rom_37 : ORIGIN = __prg_rom_37_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
170-
prg_rom_38 : ORIGIN = __prg_rom_38_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
171-
prg_rom_39 : ORIGIN = __prg_rom_39_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
172-
prg_rom_40 : ORIGIN = __prg_rom_40_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
173-
prg_rom_41 : ORIGIN = __prg_rom_41_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
174-
prg_rom_42 : ORIGIN = __prg_rom_42_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
175-
prg_rom_43 : ORIGIN = __prg_rom_43_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
176-
prg_rom_44 : ORIGIN = __prg_rom_44_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
177-
prg_rom_45 : ORIGIN = __prg_rom_45_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
178-
prg_rom_46 : ORIGIN = __prg_rom_46_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
179-
prg_rom_47 : ORIGIN = __prg_rom_47_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
180-
prg_rom_48 : ORIGIN = __prg_rom_48_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
181-
prg_rom_49 : ORIGIN = __prg_rom_49_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
182-
prg_rom_50 : ORIGIN = __prg_rom_50_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
183-
prg_rom_51 : ORIGIN = __prg_rom_51_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
184-
prg_rom_52 : ORIGIN = __prg_rom_52_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
185-
prg_rom_53 : ORIGIN = __prg_rom_53_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
186-
prg_rom_54 : ORIGIN = __prg_rom_54_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
187-
prg_rom_55 : ORIGIN = __prg_rom_55_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
188-
prg_rom_56 : ORIGIN = __prg_rom_56_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
189-
prg_rom_57 : ORIGIN = __prg_rom_57_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
190-
prg_rom_58 : ORIGIN = __prg_rom_58_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
191-
prg_rom_59 : ORIGIN = __prg_rom_59_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
192-
prg_rom_60 : ORIGIN = __prg_rom_60_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
166+
prg_rom_29 : ORIGIN = __prg_rom_29_lma,
167+
LENGTH = (__prg_rom_size >= 256 &&
168+
(__prg_rom_size >= 512 ||
169+
__prg_rom_total_fixed_size == 0x4000)) ? 0x2000 : 0
170+
prg_rom_30 : ORIGIN = __prg_rom_30_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
171+
prg_rom_31 : ORIGIN = __prg_rom_31_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
172+
prg_rom_32 : ORIGIN = __prg_rom_32_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
173+
prg_rom_33 : ORIGIN = __prg_rom_33_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
174+
prg_rom_34 : ORIGIN = __prg_rom_34_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
175+
prg_rom_35 : ORIGIN = __prg_rom_35_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
176+
prg_rom_36 : ORIGIN = __prg_rom_36_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
177+
prg_rom_37 : ORIGIN = __prg_rom_37_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
178+
prg_rom_38 : ORIGIN = __prg_rom_38_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
179+
prg_rom_39 : ORIGIN = __prg_rom_39_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
180+
prg_rom_40 : ORIGIN = __prg_rom_40_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
181+
prg_rom_41 : ORIGIN = __prg_rom_41_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
182+
prg_rom_42 : ORIGIN = __prg_rom_42_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
183+
prg_rom_43 : ORIGIN = __prg_rom_43_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
184+
prg_rom_44 : ORIGIN = __prg_rom_44_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
185+
prg_rom_45 : ORIGIN = __prg_rom_45_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
186+
prg_rom_46 : ORIGIN = __prg_rom_46_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
187+
prg_rom_47 : ORIGIN = __prg_rom_47_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
188+
prg_rom_48 : ORIGIN = __prg_rom_48_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
189+
prg_rom_49 : ORIGIN = __prg_rom_49_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
190+
prg_rom_50 : ORIGIN = __prg_rom_50_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
191+
prg_rom_51 : ORIGIN = __prg_rom_51_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
192+
prg_rom_52 : ORIGIN = __prg_rom_52_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
193+
prg_rom_53 : ORIGIN = __prg_rom_53_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
194+
prg_rom_54 : ORIGIN = __prg_rom_54_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
195+
prg_rom_55 : ORIGIN = __prg_rom_55_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
196+
prg_rom_56 : ORIGIN = __prg_rom_56_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
197+
prg_rom_57 : ORIGIN = __prg_rom_57_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
198+
prg_rom_58 : ORIGIN = __prg_rom_58_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
199+
prg_rom_59 : ORIGIN = __prg_rom_59_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
200+
prg_rom_60 : ORIGIN = __prg_rom_60_lma, LENGTH = __prg_rom_size >= 512 ? 0x2000 : 0
193201
}
194202

195203
SECTIONS {

mos-platform/nes-mmc3/prg-rom-banked-8.ld

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ PROVIDE(__prg_rom_58 = 0x8000);
6060
PROVIDE(__prg_rom_59 = 0x8000);
6161
PROVIDE(__prg_rom_60 = 0x8000);
6262

63+
__prg_rom_total_fixed_size = 0x6000;
64+
6365
INCLUDE _prg-rom-banked.ld
6466

6567
/* This bank must be switched to on reset to establish a 24KiB fixed region. */
@@ -70,7 +72,10 @@ INPUT(reset-banked-8.o)
7072
__prg_rom_fixed_lma = 0xa000;
7173
__prg_rom_fixed_offset = __prg_rom_size * 1024 - 0x6000;
7274

73-
MEMORY { prg_rom_fixed : ORIGIN = __prg_rom_fixed_lma, LENGTH = 0x6000 }
75+
MEMORY {
76+
prg_rom_fixed : ORIGIN = __prg_rom_fixed_lma,
77+
LENGTH = __prg_rom_total_fixed_size
78+
}
7479
REGION_ALIAS("c_readonly", prg_rom_fixed)
7580

7681
INCLUDE dpcm.ld

mos-platform/nes-mmc3/prg-rom-banked-mode-0.ld

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ PROVIDE(__prg_rom_58 = 0x8000);
6060
PROVIDE(__prg_rom_59 = 0xa000);
6161
PROVIDE(__prg_rom_60 = 0x8000);
6262

63+
__prg_rom_total_fixed_size = 0x4000;
64+
6365
INCLUDE _prg-rom-banked.ld
6466

6567
INPUT(reset-banked-mode-0.o)
@@ -72,7 +74,7 @@ __prg_rom_fixed_offset = __prg_rom_size * 1024 - 0x4000;
7274

7375
MEMORY {
7476
prg_rom_61 : ORIGIN = __prg_rom_61_lma, LENGTH = __prg_rom_size == 512 ? 0x2000 : 0
75-
prg_rom_fixed : ORIGIN = __prg_rom_fixed_lma, LENGTH = 0x4000
77+
prg_rom_fixed : ORIGIN = __prg_rom_fixed_lma, LENGTH = __prg_rom_total_fixed_size
7678
}
7779
REGION_ALIAS("c_readonly", prg_rom_fixed)
7880

mos-platform/nes-mmc3/prg-rom-banked-mode-1.ld

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ PROVIDE(__prg_rom_58 = 0xc000);
6060
PROVIDE(__prg_rom_59 = 0xa000);
6161
PROVIDE(__prg_rom_60 = 0xc000);
6262

63+
__prg_rom_total_fixed_size = 0x4000;
64+
6365
INCLUDE _prg-rom-banked.ld
6466

6567
INPUT(reset-banked-mode-1.o)

test/nes-mmc3/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ project(test-nes-mmc3 LANGUAGES C)
55
include(../test.cmake)
66

77
add_nes_test(banked-8)
8+
add_nes_test(banked-8-64k)
9+
add_nes_test(banked-8-128k)
10+
add_nes_test(banked-8-256k)
811
add_nes_test(banked-mode-0)
912
target_link_options(banked-mode-0.nes PRIVATE -Tcommon.ld -Tc-in-ram.ld -Tprg-rom-banked-mode-0.ld)
1013
add_nes_test(banked-mode-1)

0 commit comments

Comments
 (0)