|
16 | 16 | .Op Fl o Ar out_file
|
17 | 17 | .Op Fl p Ar pad_value
|
18 | 18 | .Op Fl S Ar spec
|
| 19 | +.Op Fl s Ar symbol |
19 | 20 | .Ar
|
20 | 21 | .Sh DESCRIPTION
|
21 | 22 | The
|
|
105 | 106 | .Sx Scrambling algorithm
|
106 | 107 | below for an explanation and a description of
|
107 | 108 | .Ar spec .
|
| 109 | +.It Fl s Ar sect_name , Fl Fl smart Ar sect_name |
| 110 | +This option specifies the name of a section that will be used as a starting point for smart linking; it may appear several times per |
| 111 | +.Nm |
| 112 | +invocation. |
| 113 | +See |
| 114 | +.Sx SMART LINKING |
| 115 | +below. |
| 116 | +If no section with that name is found, |
| 117 | +.Nm |
| 118 | +will error out. |
108 | 119 | .It Fl t , Fl \-tiny
|
109 | 120 | Expand the ROM0 section size from 16 KiB to the full 32 KiB assigned to ROM.
|
110 | 121 | ROMX sections that are fixed to a bank other than 1 become errors, other ROMX sections are treated as ROM0.
|
@@ -192,6 +203,103 @@ to fix these so that the program will actually run in a Game Boy:
|
192 | 203 | Here is a more complete example:
|
193 | 204 | .Pp
|
194 | 205 | .Dl $ rgblink -o bin/game.gb -n bin/game.sym -p 0xFF obj/title.o obj/engine.o
|
| 206 | +.Sh SMART LINKING |
| 207 | +Smart linking is a feature of |
| 208 | +.Nm |
| 209 | +that allows "trimming the fat" off of a ROM. |
| 210 | +It is enabled only if at least one |
| 211 | +.Fl s |
| 212 | +option is given on the command line. |
| 213 | +.Pp |
| 214 | +The smart linking process begins by finding all the |
| 215 | +.Ql referenced |
| 216 | +sections. |
| 217 | +A section is referenced if its name is specified using a |
| 218 | +.Fl s |
| 219 | +option, or if it is referred to by a referenced section. |
| 220 | +This definition applies recursively, so if section |
| 221 | +.Ql A |
| 222 | +is specified using |
| 223 | +.Fl s Va A , |
| 224 | +section |
| 225 | +.Ql A |
| 226 | +references section |
| 227 | +.Ql B , |
| 228 | +and section |
| 229 | +.Ql B |
| 230 | +references section |
| 231 | +.Ql C , |
| 232 | +then all three sections |
| 233 | +.Ql A , |
| 234 | +.Ql B , |
| 235 | +and |
| 236 | +.Ql C |
| 237 | +are referenced. |
| 238 | +.Pp |
| 239 | +Sections refer to each other through expressions. For example: |
| 240 | +.Bd -literal -offset indent |
| 241 | +SECTION "A", ROM0 |
| 242 | + db Someplace |
| 243 | + db BANK("C") |
| 244 | +SECTION "B", ROM0 |
| 245 | +Someplace: |
| 246 | +SECTION "C", ROMX |
| 247 | + db 42 |
| 248 | +.Ed |
| 249 | +Here, section |
| 250 | +.Ql A |
| 251 | +references section |
| 252 | +.Ql B |
| 253 | +via the label |
| 254 | +.Ql Someplace , |
| 255 | +and references section |
| 256 | +.Ql C |
| 257 | +via its name in |
| 258 | +.Ql BANK("C") . |
| 259 | +.Pp |
| 260 | +After all the referenced sections are found, all sections that were not referenced are deleted, and the linking process continues as normal. |
| 261 | +.Sy This should not cause any symbols not to be found, please report a bug (see Sx BUGS Ns Sy ) if this occurs. |
| 262 | +.Pp |
| 263 | +This is useful to detect |
| 264 | +.Dq unused |
| 265 | +sections, i.e. sections that contain data not used by anything. |
| 266 | +Typically, the section containing the header, including the entry point at |
| 267 | +.Ad $00:0100 |
| 268 | +will be one of the starting sections; more exotic use cases may require more starting sections. |
| 269 | +It may be a good idea to start with the header as the only root, and if needed, add more root sections. |
| 270 | +.Pp |
| 271 | +Be careful, as numeric expressions do |
| 272 | +.Sy not |
| 273 | +cause references: |
| 274 | +.Bd -literal -offset indent |
| 275 | +DEF BASE_ADDR EQU $4000 |
| 276 | +SECTION "A", ROM0 |
| 277 | + dw BASE_ADDR |
| 278 | +SECTION "B", ROMX[BASE_ADDR] |
| 279 | + db 42 |
| 280 | +.Ed |
| 281 | +Section |
| 282 | +.Ql A |
| 283 | +does |
| 284 | +.Sy not |
| 285 | +reference section |
| 286 | +.Ql B , |
| 287 | +since |
| 288 | +.Va BASE_ADDR |
| 289 | +is a constant, and thus does not belong to section |
| 290 | +.Ql B . |
| 291 | +.Pp |
| 292 | +Finally, be careful that |
| 293 | +.Xr rgbasm 1 |
| 294 | +tries to fill in data by itself to speed up |
| 295 | +.Nm Ap s |
| 296 | +work, which may cause |
| 297 | +.Nm |
| 298 | +not to see references to sections whose bank and/or address are fixed. |
| 299 | +It may be advisable to avoid fixing those (notably, to enable |
| 300 | +.Nm |
| 301 | +to improve section placement), but they can still be manually referenced using |
| 302 | +.Fl s . |
195 | 303 | .Sh BUGS
|
196 | 304 | Please report bugs on
|
197 | 305 | .Lk https://github.com/gbdev/rgbds/issues GitHub .
|
|
0 commit comments