That reminds me of some of the tricks I've used while tinkering with a voxel space rendering tech demo on the PlayStation.
The quirks of that console for this is that the CPU takes a 6 cycle stall on any read from main RAM (it's not even stall-on-use) and doesn't have a data cache. That would make it a very poor fit for this, so I had to improvise a bunch of tricks to reclaim performance:
- Made all of my hot loop fit within one function, so that it fits entirely in the 4 KiB direct-mapped instruction cache (so less than 1024 instructions)
- Wrote a C++ template that can trampoline a function call into the 2 KiB scratchpad
- Used the rest of the scratchpad for a CLUT table because it doesn't stall on read
- Used the GTE to transform the N set of coordinates while the CPU stalls fetching the N+1 set of heightmap data
- Figured ways to abuse the GTE into transforming more points per instructions than it theoretically can, taking advantage of simplified formulas compared to real 3D projection
- Write the rectangle primitives straight to the GPU registers instead of going through a display list
It's such an abuse of the PlayStation that PCSX-Redux and DuckStation disagree on its performance by up to a factor of two. I should finish it someday and see how it runs on real hardware...
At work, DC power systems for the telecommunication market. Deceptively complex, think UPSes if they were made of Lego and scaled from kilowatts to hundreds of kilowatts, with installed bases stretching across decades.
At home, ghidra-delinker-extension [1], a Ghidra extension for exporting relocatable object files (or in other words, stripping programs for parts like Doctor Frankenstein). Absurdly complex, got me a poster session at SURE workshop at ACM CCS last year, as a hobbyist.
It's not just about treasure bonds. The mood is shifting in Europe that, maybe, putting all the eggs in the USA basket is perhaps not that great of an idea.
It's the vindication of Gaullism half a century after De Gaulle's death, the concept of strategic autonomy is getting traction in the rest of Europe. It's not that we can't be friends, but that we shouldn't let our future be gambled in the hands of Wisconsin voters every two years.
> the concept of strategic autonomy is getting traction in the rest of Europe.
I think you may have missed the part where Sweden just joined NATO recently. As long as the EU countries are in NATO which is de facto under American leadership, then there will be no strategic autonomy.
Secondly, even if the mood is sour between the US and the EU currently, Germany, Poland and other small eastern states very much still like to have the US as backers if only just for the fact that there is no EU army.
If the EU countries were leaving NATO to form their own military alliance, then I would agree with you but that hasn't happened and maybe never will.
Countries aren't leaving NATO yet, but they are setting up and strengthening alternatives which will make such an option easier. For an example, Canada just joined SAFE.
> If the EU countries were leaving NATO to form their own military alliance, then I would agree with you but that hasn't happened and maybe never will.
The whole point is that, in general, global cooperation has worked well in the last 80 years. Europe doesn't want that to change but the US didn't vote for this guy once, but twice. Fool me once, shame on me, fool me twice, shame on you.
So Europe won't leave NATO, but it is pivoting to being more self sufficient. It's another area where the US is quickly spending the political capital it accumulated for decades.
That can happen with a high stress tolerance too, it just needs to be pushed past the breaking point. Some of us have gone through harrowing experiences and the NPC lifestyle is one coping mechanism among many others.
It took me a minute to understand that this asserts on pointer change within the container, rather than lock/unlock the data structure like a SDL surface.
I recently implemented a custom C++ container for a path whose components could be iterated, backed by a std::string. I just store indices and a reference to the string, such that my iterators are not invalidated if the std::string gets reallocated after being modified. Far less error prone for little added cost.
I wrote a C++ library at work that, among other things, serializes/deserializes to JSON, CBOR and BSON. I don't get that point.
The first two formats I've implemented as fully streaming, the serializers emit into an output iterator one character/byte at a time and the deserializers only need to hold one value at a time (mostly for strings, and not even for CBOR's byte arrays, which are streamed). BSON requires full document instantiation because of byte offsets and is genuinely anti-streaming in its design.
I happen to have implemented a serializer for YAML, fully streaming, mostly as a compact-ish human-readable debug data representation. I can scarcely think of fates worse than having to write a spec-compliant YAML parser.
Isn't biology the applied reverse-engineering of a billion years of DNA evolution, where the laziest solution that works wins, is all written in assembly, with tremendous amounts of dead code and hardly any refactorings?
I've already seen the horrors that lurk inside of poorly-written 90s video games. Hard pass.
Because being smart doesn't mean being wise. Lack of wisdom can fuck up your life far, far worse than lack of intelligence... and I for one am not wise when it comes to people.
ghidra-delinker-extension [1]. It's a Ghidra extension for exporting relocatable object files from programs, which enables all kinds of heresy I've dubbed "Mad Max-driven development".
Somehow, it landed me an academic poster presentation [2] at the 2025 SURE Workshop, part of ACM CCS 2025 held in Taiwan. As a hobbyist playing Doctor Frankenstein with bits instead of gibs in my spare time, that is "received an invitation from Hogwarts"-levels of impossible, given that ACM CCS is the biggest academic cybersecurity conference in the world.
It also somehow grew a small community online around it, mostly within the Windows decompilation scene. It's not finished (as it is the kind of project that is practically endless), but I don't see how I could top that.
The quirks of that console for this is that the CPU takes a 6 cycle stall on any read from main RAM (it's not even stall-on-use) and doesn't have a data cache. That would make it a very poor fit for this, so I had to improvise a bunch of tricks to reclaim performance:
- Made all of my hot loop fit within one function, so that it fits entirely in the 4 KiB direct-mapped instruction cache (so less than 1024 instructions)
- Wrote a C++ template that can trampoline a function call into the 2 KiB scratchpad
- Used the rest of the scratchpad for a CLUT table because it doesn't stall on read
- Used the GTE to transform the N set of coordinates while the CPU stalls fetching the N+1 set of heightmap data
- Figured ways to abuse the GTE into transforming more points per instructions than it theoretically can, taking advantage of simplified formulas compared to real 3D projection
- Write the rectangle primitives straight to the GPU registers instead of going through a display list
It's such an abuse of the PlayStation that PCSX-Redux and DuckStation disagree on its performance by up to a factor of two. I should finish it someday and see how it runs on real hardware...
reply