Author |
Message |
- Joined: 01 Feb 2014
- Posts: 880
|
.SDSCtag and .SMSheader
Posted: Mon Sep 07, 2020 12:50 pm
|
In older versions of WLA-DX, if you didn't define .SMSheader and only used .SDSCtag, WLA-DX would automatically place the 'TMR SEGA' string, set the region to 4 (export SMS) and the romsize to 32 KB (regardless of actual size) then calculate the checksum for the first 32 KB minus the header. This was very convenient.
Now it seems to calculate romsize automatically. Does anyone know if it also calculates the correct checksum? The documentation still says that .computesmschecksum (which is invoked by .SDSCtag) only uses the range from $0000 - $7fef. Is that true? In that case it would be impossible to get a formally correct checksum for any ROM that's not 32 KB by using .SDSCtag alone.
Which would make .SMSheader a quasi-compulsive directive. Of course it's possible to just define .SMSheader, but I suspect it could lead to conflicts with .SDSCtag, if the two directives calculate their checksums from different ranges. It also means you can't define a smaller than real romsize deliberately to speed up the boot process.
Additionally, defining .SMSheader prevents you from placing something useful in the two unused bytes following the 'TMR SEGA' string (I like to put my callHL there).
Can someone shed a light on the exact workings of the two directives? Does one override the other?
|
|
|
- Site Admin
- Joined: 19 Oct 1999
- Posts: 14750
- Location: London
|
Posted: Mon Sep 07, 2020 6:37 pm
|
I think it calculates the checksum correctly, and SDSCTAG implies a default SMSTAG, but you can supply a non-default as you wish.
|
|
|
- Joined: 01 Feb 2014
- Posts: 880
|
Posted: Tue Sep 08, 2020 7:57 am
|
The question is: Does it calculate the checksum from the romsize specified in the header or from the actual size of the ROM? I think I'll run a few tests later this week to verify. I'll report back when I'm done.
However, another thing is definitely wrong: If not explicitly specified in SMSHEADER, the upper nibble of the byte at $7FFF defaults to 0, which is an invalid value for region information. In older versions of WLA-DX the default value used to be 4 (= export SMS), which it should be, as it's the only value any of the BIOSes actually checks for.
|
|
|
- Site Admin
- Joined: 19 Oct 1999
- Posts: 14750
- Location: London
|
Posted: Tue Sep 08, 2020 8:43 am
|
I feel partially responsible as I requested the feature, but I didn’t test all the possibilities. It should be easy enough to fix.
|
|
|
- Joined: 01 Feb 2014
- Posts: 880
|
Posted: Thu Sep 10, 2020 4:37 pm
|
In older versions of WLA-DX, the region-and-romsize byte at $7fff always defaults to $4C, and the checksum is calculated from $0000 to $7fef.
I ran a few tests with the current version, and these are the results:
- If no SMSHEADER is defined at all and only SDSCTAG is used, the checksum is still calculated as if for a 32 KB rom, but the region and romsize both default to 0, resulting in an invalid region nibble and a mismatch between romsize and checksum.
- If SMSHEADER is used, but romsize is not defined, it defaults to $c, and the checksum is calculated accordingly, but if region is not defined in the header, it still defaults to 0, which is an invalid value.
- If SMSHEADER is used and romsize is defined, the checksum is calculated according to the romsize defined. If the defined romsize is bigger than the actual ROM, there's an error message and the checksum is not calculated. It defaults to zero instead.
tl;dr: You absolutely must use SMSHEADER and at the very least define a value for region if you want a valid header.
|
|
|
- Joined: 05 Sep 2013
- Posts: 3832
- Location: Stockholm, Sweden
|
Posted: Thu Sep 10, 2020 9:00 pm
|
it's a bug and hopefully will be fixed soon...
meantime - yes, you have to define that explicitly.
|
|
|
- Joined: 01 Feb 2014
- Posts: 880
|
Posted: Sun Sep 20, 2020 10:24 am
|
It's fixed now.
|
|
|