fuzziqersoftware / resource_dasm Goto Github PK
View Code? Open in Web Editor NEWClassic Mac OS resource fork and application disassembler, with reverse-engineering tools for specific applications
License: MIT License
Classic Mac OS resource fork and application disassembler, with reverse-engineering tools for specific applications
License: MIT License
Pretty sure there are snd
and csnd
resources in this file, but the tool doesn't work on it? I'm probably doing something wrong, but I had to run the installer in Basilisk II and then extract the installed files from the hard disk using HFVExplorer. Maybe doing this copy screwed something up? Any tips on how to extract sounds from this game?
I'm trying to pull the pictures and sounds out of old HyperCard stacks in an environment where I don't have root/sudo so I can't install phosg as a library.
I've been playing with the make files to try to merge the two codebases. There's probably a trick to make it easy, since the macOS release.zip has all the binaries and they seem to run. Can we have a Debian release?
I got the following compile error with g++ 11.2.1_p20211127
/var/tmp/portage/app-arch/resource-dasm-0_p20220101/work/resource_dasm-master/src/hypercard_dasm.cc: In function ‘int main(int, char**)’:
/var/tmp/portage/app-arch/resource-dasm-0_p20220101/work/resource_dasm-master/src/hypercard_dasm.cc:1220:74: error: cannot bind packed field ‘header.BlockHeader::id’ to ‘int&’
1220 | backgrounds.emplace(piecewise_construct, forward_as_tuple(header.id),
| ~~~~~~~^~
/var/tmp/portage/app-arch/resource-dasm-0_p20220101/work/resource_dasm-master/src/hypercard_dasm.cc:1224:68: error: cannot bind packed field ‘header.BlockHeader::id’ to ‘int&’
1224 | cards.emplace(piecewise_construct, forward_as_tuple(header.id),
| ~~~~~~~^~
/var/tmp/portage/app-arch/resource-dasm-0_p20220101/work/resource_dasm-master/src/hypercard_dasm.cc:1228:70: error: cannot bind packed field ‘header.BlockHeader::id’ to ‘int&’
1228 | bitmaps.emplace(piecewise_construct, forward_as_tuple(header.id),
| ~~~~~~~^~
Which led me to this report: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=36566
Also got this error:
/var/tmp/portage/app-arch/resource-dasm-0_p20220101/work/resource_dasm-master/src/RealmzLib.cc: In member function ‘void ComplexEncounter::byteswap()’:
/var/tmp/portage/app-arch/resource-dasm-0_p20220101/work/resource_dasm-master/src/RealmzLib.cc:810:53: error: iteration 5 invokes undefined behavior [-Werror=aggressive-loop-optimizations]
810 | this->item_codes[x] = bswap16(this->item_codes[x]);
| ~~~~~~~~~~~~~~~~~~^
/var/tmp/portage/app-arch/resource-dasm-0_p20220101/work/resource_dasm-master/src/RealmzLib.cc:809:21: note: within this loop
809 | for (int x = 0; x < 10; x++) {
| ~~^~~~
That and some other errors led me to this patch to fix the issues:
diff -Naur a/CMakeLists.txt b/CMakeLists.txt
--- a/CMakeLists.txt 2022-01-01 19:29:02.196919666 -0500
+++ b/CMakeLists.txt 2022-01-01 19:29:31.827894405 -0500
@@ -12,7 +12,7 @@
if (MSVC)
add_compile_options(/W4 /WX)
else()
- add_compile_options(-Wall -Wextra -Werror)
+ add_compile_options(-Wall -Wextra -Werror -Wno-strict-aliasing -Wno-unused-result -Wno-overflow -Wno-maybe-uninitialized -Wno-format -Wno-aggressive-loop-optimizations)
endif()
include_directories("/usr/local/include")
diff -Naur a/src/hypercard_dasm.cc b/src/hypercard_dasm.cc
--- a/src/hypercard_dasm.cc 2022-01-01 19:29:15.748908114 -0500
+++ b/src/hypercard_dasm.cc 2022-01-01 19:24:45.749129132 -0500
@@ -1201,6 +1201,7 @@
size_t block_offset = r.where();
BlockHeader header = r.get_sw<BlockHeader>(false);
size_t block_end = block_offset + header.size;
+ const int& header_id(header.id);
if (dump_raw_blocks) {
string type_str = string_for_resource_type(header.type);
@@ -1217,15 +1218,15 @@
stack_format = stack->format;
break;
case 0x424B4744: // BKGD
- backgrounds.emplace(piecewise_construct, forward_as_tuple(header.id),
+ backgrounds.emplace(piecewise_construct, forward_as_tuple(header_id),
forward_as_tuple(r, stack_format));
break;
case 0x43415244: // CARD
- cards.emplace(piecewise_construct, forward_as_tuple(header.id),
+ cards.emplace(piecewise_construct, forward_as_tuple(header_id),
forward_as_tuple(r, stack_format));
break;
case 0x424D4150: // BMAP
- bitmaps.emplace(piecewise_construct, forward_as_tuple(header.id),
+ bitmaps.emplace(piecewise_construct, forward_as_tuple(header_id),
forward_as_tuple(r, stack_format));
break;
The data format of SilverCreator is a proprietary non-resource fork format, but in v1.5.1 and earlier it stored styled text in that file using "styl" data. However it seems the only way to convert a TEXT/styl pair with resource_dasm is to put it into a resource fork first, but that's super awkward. A SilverCreator file may have 100s of old TEXT/styl parings in it.
Maybe if --decode-single-resource could be specified twice, something like this (where the output name would also have to be specified, due to the ambiguity of two input files)
resource_dasm --decode-single-resource TEXT text.data --decode-single-resource styl styl.data OutputFile.rtf
Or this syntax would be a bit cleaner. If no output file is specified then stdout is assumed.
resource_dasm --decode-text-styl-pair text.data styl.data
Thanks for these great tools, I'm glad I found them! I used resource_dasm to extract the resources from the DOCMaker readme for Marathon Infinity and convert its PICTs, but the tool got tripped up converting a couple of the resources, attached. As you'll see, the resulting bitmaps seem to contain only the top-left quadrant of the original image. I've called this an "incorrect canvas size" in the issue title; not sure if that's an accurate description of the problem.
P.S.: Almost all of the other PICT resources in the app fail conversion with the error "(subheader has incorrect version (00000000 or 0000)); attempting rendering using picttoppm", however picttoppm converts them correctly. Do you want me to open another issue with samples of those problem PICTs, or is it considered acceptable behavior to punt those to picttoppm since it handles the resources successfully?
Using Maelstrom_1.4.3_f.zip https://macintoshgarden.org/games/maelstrom-13-original
The image behind is the .icns file showing the color image and the mask. The foreground img is the converted bmp (or png) - which is just the mask.
Using resource_dasm --image-format=bmp --icon-family-format=image,icns --filename-format="%f:%T:%i" archive/Maelstrom_1.4.3_f/ Maelstrom_1.4.3_f/rsrc/
Attached are two PICTs. One contains a standard PNG, and the other contains a standard JPEG. These PICTs are obtained from "resource_dasm --save-raw=yes" using the latest source available.
Besides the compressed image, each PICT also contains a few other opcodes, the purpose of which are to draw a warning message that says, "QuickTime™ and a XXXX decompressor are needed to see this picture." where XXXX may be either "PNG" or "Photo - JPEG" (but perhaps other formats as well, which I have yet to personally encounter).
I am dealing with some game files right now that seem to use this "Compressed Image within a PICT" format. Currently, the compressed image is ignored and the PICT is passed off (I assume to) picttoppm which renders the "QuickTime... needed" text and ignores the compressed image.
PICTs with Compressed Images.zip
My July 2022 build of resource_dasm was 13 MB, and the one I did just now is 12.5 MB (Intel)
I thought maybe separating the disassembly stuff would make the build smaller, but it didn't seem to help?
It's a low priority issue. But I plan to bundle resource_dasm, picttoppm, and a 3rd program I am developing (a converter) which will convert 90's (Al Staffieri) GameMaker games to a new modern runtime (a 4th program that's long been written). All the program sizes add up I guess, and my first computer was an LC II with 4 MB of RAM and an 80 MB hard drive and I never quite shed that mentality ;)
I remember ~2 years ago hacking a build of resource_dasm that was much smaller after cutting out everything except for the PICT and 'snd ' converters.
I could probably take a stab at it, basically would just be a bunch of #ifdef statements?
I've got an old texture CD my buddy gave me and I stumbled across this program while searching for ways to decode it. In the extracted files, there are files labeled stuff like 1.MOV, 2.MOV, 3.MOV... etc. with correspondingly-named files in the .rsrc folder. I do have to use the --data-fork
tag for this to decode anything at all though, so maybe that means something.
Playing some of these files in something like VLC or MPV works, but most of them don't. I imagine that's because some of them are split up, but I attempted to run this program on them and it only gives me a few bmps, some bin files, or disassemblies of the viewer program meant to run on the actual machine. I had a look through the command line arguments and tried a few more, but to no avail.
I'm wondering if maybe you've come across this before. I haven't included the files here due to the actual CD being quite large, I'm unsure of the proper way I could split them to send examples of the files I'm decoding, but if you happen to know a little bit about this and know what files I'd need to potentially send for examples, I can provide.
(Not sure if I should file this here or in phosg)
I'm using master (f0950b7) and phosg master (9336a3a) with AppleClang 11.0.0.11000033. Compiling results in the following error:
Encoding.hh:14:66: error: shifting a negative signed value is undefined
[-Werror,-Wshift-negative-value]
return static_cast<ResultT>(src) | (static_cast<ResultT>(-1) << (sizeof(SrcT) << 3));
Fix that uses unsigned for the shift and then converts to the result type:
template <typename ResultT, typename SrcT>
ResultT sign_extend(SrcT src) {
using UResultT = std::make_unsigned_t<ResultT>;
if (src & (1 << ((sizeof(SrcT) << 3) - 1))) {
return static_cast<ResultT>(src) | (static_cast<ResultT>(static_cast<UResultT>(-1) << (sizeof(SrcT) << 3)));
} else {
return static_cast<ResultT>(src);
}
}
Running g++ 13.2.1 20230826
and cmake 3.27.4
and the latest resource_dasm 2023-08-31
and phosg 2023-09-21
I get this error:
[20/100] /usr/bin/x86_64-pc-linux-gnu-g++ -Dresource_file_EXPORTS -I/usr/local/include -O2 -march=native -pipe -std=gnu++20 -fPIC -Wall -Wextra -Werror -Wno-strict-aliasing -O2 -MD -MT CMakeFiles/resource_file.dir/src/ExecutableFormats/PEFile.cc.o -MF CMakeFiles/resource_file.dir/src/ExecutableFormats/PEFile.cc.o.d -o CMakeFiles/resource_file.dir/src/ExecutableFormats/PEFile.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/ExecutableFormats/PEFile.cc
FAILED: CMakeFiles/resource_file.dir/src/ExecutableFormats/PEFile.cc.o
/usr/bin/x86_64-pc-linux-gnu-g++ -Dresource_file_EXPORTS -I/usr/local/include -O2 -march=native -pipe -std=gnu++20 -fPIC -Wall -Wextra -Werror -Wno-strict-aliasing -O2 -MD -MT CMakeFiles/resource_file.dir/src/ExecutableFormats/PEFile.cc.o -MF CMakeFiles/resource_file.dir/src/ExecutableFormats/PEFile.cc.o.d -o CMakeFiles/resource_file.dir/src/ExecutableFormats/PEFile.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/ExecutableFormats/PEFile.cc
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/ExecutableFormats/PEFile.cc: In member function ‘void PEFile::parse(const void*, size_t)’:
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/ExecutableFormats/PEFile.cc:195:17: error: possibly dangling reference to a temporary [-Werror=dangling-reference]
195 | const auto& header = this->read_from_rva(
| ^~~~~~
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/ExecutableFormats/PEFile.cc:197:55: note: the temporary was destroyed at the end of the full expression ‘PEFile::read_from_rva(uint32_t, uint32_t) const(((PEFile*)this)->PEFile::header.PEHeader::export_table_rva.little_endian<unsigned int>::<anonymous>.same_endian<unsigned int, unsigned int>::<anonymous>.converted_endian<unsigned int, unsigned int, ident_st<unsigned int, unsigned int>, ident_st<unsigned int, unsigned int> >::operator unsigned int(), ((PEFile*)this)->PEFile::header.PEHeader::export_table_size.little_endian<unsigned int>::<anonymous>.same_endian<unsigned int, unsigned int>::<anonymous>.converted_endian<unsigned int, unsigned int, ident_st<unsigned int, unsigned int>, ident_st<unsigned int, unsigned int> >::operator unsigned int()).StringReader::get<PEExportTableHeader>(1, sizeof (PEExportTableHeader))’
195 | const auto& header = this->read_from_rva(
| ~~~~~~~~~~~~~~~~~~~~
196 | this->header.export_table_rva, this->header.export_table_size)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
197 | .get<PEExportTableHeader>();
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~
cc1plus: all warnings being treated as errors
and
[54/100] /usr/bin/x86_64-pc-linux-gnu-g++ -I/usr/local/include -O2 -march=native -pipe -std=gnu++20 -Wall -Wextra -Werror -Wno-strict-aliasing -Wno-dangling-reference -O2 -MD -MT CMakeFiles/resource_dasm.dir/src/resource_dasm.cc.o -MF CMakeFiles/resource_dasm.dir/src/resource_dasm.cc.o.d -o CMakeFiles/resource_dasm.dir/src/resource_dasm.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/resource_dasm.cc
FAILED: CMakeFiles/resource_dasm.dir/src/resource_dasm.cc.o
/usr/bin/x86_64-pc-linux-gnu-g++ -I/usr/local/include -O2 -march=native -pipe -std=gnu++20 -Wall -Wextra -Werror -Wno-strict-aliasing -Wno-dangling-reference -O2 -MD -MT CMakeFiles/resource_dasm.dir/src/resource_dasm.cc.o -MF CMakeFiles/resource_dasm.dir/src/resource_dasm.cc.o.d -o CMakeFiles/resource_dasm.dir/src/resource_dasm.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/resource_dasm.cc
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/resource_dasm.cc:533:120: error: ‘std::uint32_t’ has not been declared
533 | shared_ptr<const ResourceFile::Resource> load_family_icon(const std::shared_ptr<const ResourceFile::Resource>& icon, std::uint32_t type) {
| ^~~
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/resource_dasm.cc: In member function ‘std::shared_ptr<const ResourceFile::Resource> ResourceExporter::load_family_icon(const std::shared_ptr<const ResourceFile::Resource>&, int)’:
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/resource_dasm.cc:534:20: error: comparison of integer expressions of different signedness: ‘const uint32_t’ {aka ‘const unsigned int’} and ‘int’ [-Werror=sign-compare]
534 | if (icon->type == type) {
| ~~~~~~~~~~~^~~~~~~
cc1plus: all warnings being treated as errors
Disabling the errors with -Wno-dangling-reference
and -Wno-sign-compare
allows it to continue but then I get:
[48/100] /usr/bin/x86_64-pc-linux-gnu-g++ -Dresource_file_EXPORTS -I/usr/local/include -O2 -march=native -pipe -std=gnu++20 -fPIC -Wall -Wextra -Werror -Wno-strict-aliasing -Wno-dangling-reference -O2 -MD -MT CMakeFiles/resource_file.dir/src/TextCodecs.cc.o -MF CMakeFiles/resource_file.dir/src/TextCodecs.cc.o.d -o CMakeFiles/resource_file.dir/src/TextCodecs.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.cc
FAILED: CMakeFiles/resource_file.dir/src/TextCodecs.cc.o
/usr/bin/x86_64-pc-linux-gnu-g++ -Dresource_file_EXPORTS -I/usr/local/include -O2 -march=native -pipe -std=gnu++20 -fPIC -Wall -Wextra -Werror -Wno-strict-aliasing -Wno-dangling-reference -O2 -MD -MT CMakeFiles/resource_file.dir/src/TextCodecs.cc.o -MF CMakeFiles/resource_file.dir/src/TextCodecs.cc.o.d -o CMakeFiles/resource_file.dir/src/TextCodecs.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.cc
In file included from /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.cc:1:
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.hh:11:38: error: ‘uint32_t’ was not declared in this scope
11 | std::string string_for_resource_type(uint32_t type, bool for_filename = false);
| ^~~~~~~~
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.hh:4:1: note: ‘uint32_t’ is defined in header ‘<cstdint>’; did you forget to ‘#include <cstdint>’?
3 | #include <string>
+++ |+#include <cstdint>
4 |
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.hh:11:53: error: expected primary-expression before ‘bool’
11 | std::string string_for_resource_type(uint32_t type, bool for_filename = false);
| ^~~~
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.hh:12:42: error: ‘uint32_t’ was not declared in this scope
12 | std::string raw_string_for_resource_type(uint32_t type);
| ^~~~~~~~
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.hh:12:42: note: ‘uint32_t’ is defined in header ‘<cstdint>’; did you forget to ‘#include <cstdint>’?
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.cc:98:65: error: ‘std::string string_for_resource_type(uint32_t, bool)’ redeclared as different kind of entity
98 | string string_for_resource_type(uint32_t type, bool for_filename) {
| ^
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.hh:11:13: note: previous declaration ‘std::string string_for_resource_type’
11 | std::string string_for_resource_type(uint32_t type, bool for_filename = false);
| ^~~~~~~~~~~~~~~~~~~~~~~~
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.cc:113:50: error: ‘std::string raw_string_for_resource_type(uint32_t)’ redeclared as different kind of entity
113 | string raw_string_for_resource_type(uint32_t type) {
| ^
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.hh:12:13: note: previous declaration ‘std::string raw_string_for_resource_type’
12 | std::string raw_string_for_resource_type(uint32_t type);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
Which I can fix by adding #include <cstdint>
to src/TextCodecs.hh
But then I get:
[21/22] /usr/bin/x86_64-pc-linux-gnu-g++ -I/usr/local/include -O2 -march=native -pipe -std=gnu++20 -Wall -Wextra -Werror -Wno-strict-aliasing -Wno-dangling-reference -Wno-sign-compare -O2 -MD -MT CMakeFiles/hypercard_dasm.dir/src/hypercard_dasm.cc.o -MF CMakeFiles/hypercard_dasm.dir/src/hypercard_dasm.cc.o.d -o CMakeFiles/hypercard_dasm.dir/src/hypercard_dasm.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/hypercard_dasm.cc
FAILED: CMakeFiles/hypercard_dasm.dir/src/hypercard_dasm.cc.o
/usr/bin/x86_64-pc-linux-gnu-g++ -I/usr/local/include -O2 -march=native -pipe -std=gnu++20 -Wall -Wextra -Werror -Wno-strict-aliasing -Wno-dangling-reference -Wno-sign-compare -O2 -MD -MT CMakeFiles/hypercard_dasm.dir/src/hypercard_dasm.cc.o -MF CMakeFiles/hypercard_dasm.dir/src/hypercard_dasm.cc.o.d -o CMakeFiles/hypercard_dasm.dir/src/hypercard_dasm.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/hypercard_dasm.cc
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/hypercard_dasm.cc: In function ‘int main(int, char**)’:
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/hypercard_dasm.cc:1163:29: error: redundant move in initialization [-Werror=redundant-move]
1163 | string dir = std::move(*it);
| ~~~~~~~~~^~~~~
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/hypercard_dasm.cc:1163:29: note: remove ‘std::move’ call
cc1plus: all warnings being treated as errors
If I disable that error with -Wno-redundant-move
then everything finishes compiling ok.
I am posting the .bin file that I got instead of a .wav. The sound seems to be compressed with MAC3. (MACE 3:1).
Hi, I'm not a C++ expert, this is my output on my Debian 10
make
g++ -I/opt/local/include -g -Wall -std=c++14 -c -o render_bits.o render_bits.cc
In file included from resource_fork.hh:14,
from render_bits.cc:10:
quickdraw_formats.hh:48:8: warning: ignoring packed attribute because of unpacked non-POD field ‘rect bit_map_header::bounds’
rect bounds;
^~~~~~
quickdraw_formats.hh:55:8: warning: ignoring packed attribute because of unpacked non-POD field ‘rect pixel_map_header::bounds’
rect bounds;
^~~~~~
render_bits.cc: In function ‘int main(int, char**)’:
render_bits.cc:136:24: warning: comparison of integer expressions of different signedness: ‘size_t’ {aka ‘long unsigned int’} and ‘int’ [-Wsign-compare]
for (size_t x = 1; x < argc; x++) {
~~^~~~~~
render_bits.cc:176:16: error: ‘sqrt’ was not declared in this scope
double z = sqrt(pixel_count);
^~~~
render_bits.cc:176:16: note: suggested alternative: ‘stat’
double z = sqrt(pixel_count);
^~~~
stat
render_bits.cc:177:14: error: ‘floor’ was not declared in this scope
if (z != floor(z)) {
^~~~~
render_bits.cc:177:14: note: suggested alternative: ‘flock’
if (z != floor(z)) {
^~~~~
flock
make: *** [: render_bits.o] Error 1
Hi, I was recently extracting the files from slithereen and managed to use your library to extract all I wanted to extract.
I did realize as I was starting to compress my images into png that the lossless compression of the file format makes a massive difference for the color lookup table generated images. The file size goes from 1.9MB to 47kB.
Perhaps that format should be used for any image extracted to make the extract files lighter while not loosing any data.
I used resource_dasm
revision b435972 to convert a PICT file: resource_dasm --decode-pict-file Test.pict
. The result was a bmp
of the correct size and contents except that close to the edges the image was black. See attached files
Test.pict.zip and Test.pict_PICT_1.bmp.zip (zipped, because Github likes neither PICT nor BMP).
I created the PICT file with Superpaint 3.5, it should contain only a pixmap, no drawing commands. Preview.app displays it correctly.
Line 49 in d80b6be
These are indeed 3D models. In Spectre VR, the "... Matrix" files contain a TMPL
resource that describe the format. In Spectre Supreme, this TMPL
is missing, but the shap
format is almost identical; just the last field has been removed (some of the shap
exist in both VR and Supreme, making it easy to compare).
Here's a HQX-encoded resource file with the Supreme TMPL
: shap_SpectreSupreme.rsrc.hqx (txt
extension because Github).
I'm on OS 10.15.7 Intel Mac Mini (late 2012) and when I run I get this:
-bash: ./resource_dasm: Bad CPU type in executable
What systems is this utility expected to work on?
I keep receiving this error while trying to build the library in Fedora 40
[ 71%] Building CXX object CMakeFiles/dupe_finder.dir/src/dupe_finder.cc.o
/home/maria/scratchpad/resource_dasm/src/dupe_finder.cc: In function ‘int main(int, const char**)’:
/home/maria/scratchpad/resource_dasm/src/dupe_finder.cc:117:13: error: ‘find_if’ was not declared in this scope; did you mean ‘std::ranges::find_if’?
117 | if (find_if(input_filenames.begin(), input_filenames.end(), [&](auto s) { return !strcmp(s, argv[x]); }) == input_filenames.end())
| ^~~~~~~
| std::ranges::find_if
In file included from /usr/include/c++/14/tuple:44,
from /usr/include/c++/14/bits/uses_allocator_args.h:39,
from /usr/include/c++/14/bits/memory_resource.h:41,
from /usr/include/c++/14/string:67,
from /usr/include/c++/14/bitset:52,
from /home/maria/scratchpad/resource_dasm/src/ResourceIDs.hh:3,
from /home/maria/scratchpad/resource_dasm/src/Cli.hh:3,
from /home/maria/scratchpad/resource_dasm/src/dupe_finder.cc:3:
/usr/include/c++/14/bits/ranges_util.h:543:33: note: ‘std::ranges::find_if’ declared here
543 | inline constexpr __find_if_fn find_if{};
| ^~~~~~~
make[2]: *** [CMakeFiles/dupe_finder.dir/build.make:76: CMakeFiles/dupe_finder.dir/src/dupe_finder.cc.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:307: CMakeFiles/dupe_finder.dir/all] Error 2
make: *** [Makefile:136: all] Error 2
For example:
See Wikipedia and Mac OS Runtime Architectures chapter 8 (pdf file). peff
is merely used in the PEF header. Apocryphal origin story.
I have a bunch of old Mail.app message files (.emlx) that contain resource forks.
I tried using resource_dasm on one of them, and it produced a .emlx_cmpf_1.bin file.
Is this a compressed resource of some kind?
Any suggestions on what to do with it?
there's one in:
https://macintoshgarden.org/apps/finderhack
they seem to be code resources.
[ 12%] Building CXX object CMakeFiles/resource_file.dir/src/Emulators/MemoryContext.cc.o
/home/pi/programs/resource_dasm/src/Emulators/MemoryContext.cc: In member function ‘std::__cxx11::string MemoryContext::Arena::str() const’:
/home/pi/programs/resource_dasm/src/Emulators/MemoryContext.cc:193:30: error: format ‘%lX’ expects argument of type ‘long unsigned int’, but argument 3 has type ‘unsigned int’ [-Werror=format=]
string ret = string_printf("[Arena %08" PRIX32 "-%08lX at %p alloc=%zX free=%zX alloc_blocks=[",
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/pi/programs/resource_dasm/src/Emulators/MemoryContext.cc:195:7:
this->addr + this->size,
~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors
make[2]: *** [CMakeFiles/resource_file.dir/build.make:206: CMakeFiles/resource_file.dir/src/Emulators/MemoryContext.cc.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:224: CMakeFiles/resource_file.dir/all] Error 2
make: *** [Makefile:130: all] Error 2
changing the source line to the following seems to allow it to compile OK (take out the L from %08lX):
string ret = string_printf("[Arena %08" PRIX32 "-%08X at %p alloc=%zX free=%zX alloc_blocks=[",
Always make a new build before submitting issues 🤣
I got a new one for you 😊
Most of the PICT resources in Dude 2000 v2.71 fail to decode. (Disclaimer: I wrote this game when I was like, 11)
... dudenew/Dude 2000 v2.71_PICT_1118.pict
warning: PICT rendering failed (mask region rect Rect(x1=-27892, y1=26790, x2=0, y2=256) is not same as source rect Rect(x1=152, y1=163, x2=398, y2=388)); attempting rendering using picttoppm
picttoppm: Invalid PICT: compressed line of 63232 bytes for Row 0 is too big to represent a 256-byte padded row, even with worse case compression.
warning: failed to decode resource: picttoppm failed (256)
PICT 1118 totally fails both resource_dasm and picttoppm. I will raise this issue separately with the NetPBM guy. The picttoppm error here doesn't make sense to me, since the entire PICT is only 6826 bytes.
... dudenew/Dude 2000 v2.71_PICT_1119.pict
warning: PICT rendering failed (mask region rect Rect(x1=-27892, y1=26790, x2=0, y2=256) is not same as source rect Rect(x1=152, y1=163, x2=398, y2=388)); attempting rendering using picttoppm
PICT 1119 fails in resource_dasm, and picttoppm does not have an error but I still don't get the BMP output for some reason?
Actually, now I'm confused, because for 1120 I did get a BMP file, but the program output looks identical to 1118, which failed totally and gave me the raw PICT output?
... dudenew/Dude 2000 v2.71_PICT_1120.bmp
warning: PICT rendering failed (mask region rect Rect(x1=-27892, y1=26790, x2=0, y2=256) is not same as source rect Rect(x1=27, y1=163, x2=523, y2=388)); attempting rendering using picttoppm
picttoppm: Invalid PICT: compressed line of 1153 bytes for Row 0 is too big to represent a 496-byte padded row, even with worse case compression.
warning: failed to decode resource: picttoppm failed (256)
I ran resource_dasm again with skip-decode and the 3 PICTs (1118, 1119, 1120) are in the attached ZIP. The entire game is available here, use The Unarchiver to decompress: https://mikerichardson.name/graveyard/dude2000_271.sit
Even weirder: 1118 and 1119 render fine in Catalina (Preview, QuickLook, etc). 1120 does not (just shows white). The BMP output I got from (whatever managed to decode it) is correct (just shows blue).
My build of resource_dasm is from master on July 11, 2022. If any PICT stuff changed since then let me know and I'll try with the latest sources. (It's not super easy to build for me, for some reason.)
I'm using master (f0950b7) with AppleClang 11.0.0.11000033. Compiling results in the following error:
resource_dasm.cc:287:77: error: format specifies type 'unsigned short' but the argument has type 'uint8_t' (aka 'unsigned char')
Fix: replace %hu
with %hhu
:
add_line(prefix + string_printf("(align to %hhu-byte boundary)", entry->end_alignment));
Then:
RealmzScenarioData.cc:587:14: error: format specifies type 'short' but the argument has type 'int8_t' (aka 'signed char')
RealmzScenarioData.cc:645:14: error: format specifies type 'short' but the argument has type 'int8_t' (aka 'signed char')
Fix: replace %hd
with %hhd
(twice):
string ret = string_printf("===== SIMPLE ENCOUNTER id=%zu can_backout=%hhd max_times=%hhd prompt=%s [SEC%zu]\n",
^^^ ^^^
And finally:
RealmzScenarioData.cc:2046:23: error: format specifies type 'short' but the argument has type 'uint8_t' (aka 'unsigned char')
Fix: replace %hd
with %hhu
:
map.draw_text(text_xp, text_yp, 0xFFFFFFFF, 0x00000080, "%d-%hhu%%",
Attempting to compile with GCC 11.1 produces the error:
In file included from AudioCodecs.cc:1:
AudioCodecs.hh:5:55: error: ‘size_t’ has not been declared
5 | std::vector<int16_t> decode_mace(const uint8_t* data, size_t size, bool stereo,
| ^~~~~~
AudioCodecs.hh:7:55: error: ‘size_t’ has not been declared
7 | std::vector<int16_t> decode_ima4(const uint8_t* data, size_t size, bool stereo);
| ^~~~~~
AudioCodecs.hh:8:55: error: ‘size_t’ has not been declared
8 | std::vector<int16_t> decode_alaw(const uint8_t* data, size_t size);
| ^~~~~~
AudioCodecs.hh:9:55: error: ‘size_t’ has not been declared
9 | std::vector<int16_t> decode_ulaw(const uint8_t* data, size_t size);
| ^~~~~~
make: *** [<builtin>: AudioCodecs.o] Error 1
Adding this to the top of AudioCodecs.hh
fixes it:
#include <stddef.h>
I got the following compile error with latest git code from Mar 28 using g++ 11.2.1_p20220115:
[2/57] /usr/bin/x86_64-pc-linux-gnu-g++ -Dresource_file_EXPORTS -I/usr/local/include -DNDEBUG -O2 -march=native -pipe -fPIC -Wall -Wextra -Werror -Wno-strict-aliasing -std=gnu++20 -MD -MT CMakeFiles/resource_file.dir/src/Decompressors/System2.cc.o -MF CMakeFiles/resource_file.dir/src/Decompressors/System2.cc.o.d -o CMakeFiles/resource_file.dir/src/Decompressors/System2.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20220329/work/resource_dasm-master/src/Decompressors/System2.cc
FAILED: CMakeFiles/resource_file.dir/src/Decompressors/System2.cc.o
/usr/bin/x86_64-pc-linux-gnu-g++ -Dresource_file_EXPORTS -I/usr/local/include -DNDEBUG -O2 -march=native -pipe -fPIC -Wall -Wextra -Werror -Wno-strict-aliasing -std=gnu++20 -MD -MT CMakeFiles/resource_file.dir/src/Decompressors/System2.cc.o -MF CMakeFiles/resource_file.dir/src/Decompressors/System2.cc.o.d -o CMakeFiles/resource_file.dir/src/Decompressors/System2.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20220329/work/resource_dasm-master/src/Decompressors/System2.cc
/var/tmp/portage/app-arch/resource-dasm-0_p20220329/work/resource_dasm-master/src/Decompressors/System2.cc: In function ‘std::string decompress_system2(const CompressedResourceHeader&, const void*, size_t)’:
/var/tmp/portage/app-arch/resource-dasm-0_p20220329/work/resource_dasm-master/src/Decompressors/System2.cc:106:20: error: ‘source_types’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
106 | source_types <<= 1;
| ~~~~~~~~~~~~~^~~~~
cc1plus: all warnings being treated as errors
Modifying the initial value of source_types with uint8_t source_types=0;
fixes it.
Got the following build error with g++ (Gentoo 10.2.0-r5 p6) 10.2.0
for file hypercard_dasm.cc
:
hypercard_dasm.cc: In function ‘std::string autoformat_hypertalk(const string&)’:
hypercard_dasm.cc:66:94: error: no matching function for call to ‘transform(std::__cxx11::basic_string<char>::iterator, std::__cxx11::basic_string<char>::iterator, std::__cxx11::basic_string<char>::iterator, <unresolved overloaded function type>)’
66 | transform(lowercase_line.begin(), lowercase_line.end(), lowercase_line.begin(), tolower);
| ^
In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/include/g++-v10/functional:65,
from /usr/include/phosg/Filesystem.hh:15,
from hypercard_dasm.cc:9:
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/include/g++-v10/bits/stl_algo.h:4302:5: note: candidate: ‘template<class _IIter, class _OIter, class _UnaryOperation> _OIter std::transform(_IIter, _IIter, _OIter, _UnaryOperation)’
4302 | transform(_InputIterator __first, _InputIterator __last,
| ^~~~~~~~~
Replacing Line #66 in hypercard_dasm.cc from:
resource_dasm/hypercard_dasm.cc
Line 66 in fffe888
transform(lowercase_line.begin(), lowercase_line.end(), lowercase_line.begin(), ::tolower);
Fixed it.
I suggest that someone (maybe fuzziqer) reworks this into something that can rip .rmf/.hsb files.
It also uses snd/esnd/csnd, midi/emid/cmid/ecmi, SONG and INST.
Documentation on hsb/rmf can be found in the miniBAE source code. ALIS is for duplicate patches.
Hi,
I've been trying to dump the Blobbo lite 1.0.1 resource files for a personal project of mine (a "demake" of the original game for the Playdate). The issue is, attempting to invoke resource_dasm
on the Blobbo.rsrc file produced by unar
yields
./resource_dasm ./Blobbo.rsrc
>>> ./Blobbo.rsrc (resource fork missing or empty)
Platform used : Ubuntu 22.04 on WSL2
resource_dasm build : whatever was on master last night
I reckon I'm probably doing it wrong because I know little about classic Mac files. Do you have any insights into this ?
"Inside Macintosh: Toolbox Essentials" says that, in vers
resources the first two binary bytes are encoded in binary coded decimal or BCD. (Page 7-69)
For instance, resource_dasm output suggests that Dark Castle 1.1 is version 1.16 because the first two bytes of the vers
resource are 0x01 0x10
. 1.16 would be correct if taking the bytes were sufficient. However, each digit is encoded in a nibble rather than a byte. So there are 4 digits and the version number is 01.10
in hex aka 1.1
in decimal
resource_dasm/src/ResourceFile.cc
Line 1160 in 1cd70f3
Attached is a mac .rsrc file (Appearance Extension.rsrc.zip) file that resource_dasm (compiled with latest code as of today) is not able to parse:
$ resource_dasm --data-fork Appearance\ Extension.rsrc out
>>> Appearance Extension.rsrc
failed on Appearance Extension.rsrc: corrupt resource index
However, at some point in the past, probably in early to mid 2022, resource_dasm was able to process it.
The results of this processing can be seen here: http://discmaster.textfiles.com/browse/639/Ducks%20Unlimited%20Ducks%20&%20Dogs%20Screen%20Saver%20&%20Wallpaper.iso/mac/Ducks%20and%20Dogs%20Installer/Ducks%20and%20Dogs%20Installer/Appearance%20Extension.rsrc
Thus this is technically a regression, as resource_dasm used to be able to extract 700+ things from this file, and now is unable to extract anything.
If this isn't a bug, my guess is in the past 2 years, resource_dasm must have gotten more strict about what it would and wouldn't parse and now rejects this file as invalid?
If that's the case would it possible to add a --relaxed
flag that would allow resource_dasm to extract as much as it 'can' from a mac .rsrc file, even if it's not formed perfectly?
I was wondering if there's any chance to group the items by resource type while extracting the items? rezycle works this way and it keeps things organized: https://evolutioninteractive.com/rezycle/rezycle.html
Thanks!
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.