Close
0%
0%

JADE: Not Just Another DOOM Engine

Jade is not just another DOOM engine, because right now, JADE doesn't even play DOOM. But maybe someday, it will on an FPGA or "NOR machine"

Similar projects worth following
1.8k views
0 followers
Jade is not just another DOOM engine, because right now, JADE doesn't even play DOOM: Yet. Instead, this project will explore some novel and interesting ways to do things like x86 emulation on alternative platforms, like Propeller, Arduino, or other not-even-quite-half-baked NOR machines. Of course, we will want VM, multi-core, TLB, FPU, and maybe even discover some new hacks, or forms of abuse that have relevance on real hardware. You have been warned.

If you haven't noticed by now, at some point in time, I managed to successfully remove an AMD Duron chip that is, I think, at least 25 years old, if not older, from whatever long since dead PC that it was associated with.  Not only that, I successfully managed to unsolder the original ZIF socket from the now completely bricked motherboard, by a time-honored method that I will not otherwise describe in too much detail in these parts.  Yet, having come to the realization that turning a possibly still functional legacy CPU into an interesting paperweight is a perfectly valid form of abuse, I therefore decided to start this project.  Which, for now, does absolutely nothing, except sit there and look nice.

Then again, even if it doesn't quite play doom, so what?  The PC that it came from was clearly doomed for other reasons, so why not have some fun?  Obviously, there is something weird and wonderful about this particular vintage of CPU, so who knows, maybe someday, a new hardware project might actually get built based on the design principles that otherwise should seem so evident, even if they are not.  Like, what if we could somehow build a Parallax Propeller P2-based PC, or maybe create something ESP32-based, or "whatever", and just somehow put it on a circuit board that might not cost all that much to have made, in this day and age, so that it can, in turn, be plugged into an existing legacy PC.

Just because.  For the same reason that some people climb Everest, or any other mountain, for that matter.  Because it is there.  And because it might actually be possible to do.

Yet, as far as finding other ways to run DOOM on alternative hardware is concerned, all hope is not lost.  At some point, once upon a long time ago, I took a DOOM distribution, I think of the original DOOM, and went to work at trying to see how hard it would be to get DOOM running as a Microsoft Foundation Class library C++ application, i.e., in Visual Studio 2005, no less.  And even if I never quite got that to work, I did make considerable progress, wherever that was, in some other timeline.

I mean, at least I got most of the DOOM codebase to compile, not as an application, but as a library, which I suppose, could also possibly be compiled as a DLL, or maybe as an Active-X control.  Or maybe I should try using some modern AI-based tools to rewrite all of this in TypeScript.  I did have some issues with some of the files that were giving me some trouble, of course, so I put those into a separate project, at least for the time being.  Thus, i_sound, I_system and I_video remain non-functional in this build.

Yet, really, the 115 or so errors that are preventing this project from compiling doesn't really seem like that big of a deal. I just need some compatibility code that deals with the requirements for some non-Windows API's like just why it is that I am getting errors like "XPending : cannot convert parameter 1 from XWIN::Display  to 'Display" and so on.  So let's take a closer look at the real world of application building, and what I had to work with while trying to build my entry for a previous contest, i.e. the One Hertz challenge.  Thus staring from a workspace that actually included something like 14 separate projects, I was able to jump right in, locked and loaded with the ability to interact with a COM port that was in turn connected via USB to a GPS module, right from the get go.

And that meant, of course, that creating a working One Hertz application was almost already in the bag, allowing me to focus on the intricacies of the methods of Euclid, and Ptolemy, for that matter.

And that is because, as some people might say, a design isn't perfect when this is nothing left that needs to be added, rather a design is perfect when there is nothing left that can't be removed.  That is to say, as we go from this: 

... Read more »

  • In Praise of INTERCAL

    glgorman12/18/2025 at 05:00 0 comments

    INTERCAL is a programming language that I know almost nothing about, other than that I have read some things online about it being a joke or parody language from the 60's or perhaps 70's, or whenever, that I now think should perhaps be taken a bit more seriously,  Right now the only thing that I can remember about INTERCAL is that (I think) that INTERCAL is a BASIC or FORTRAN like language that has some weird requirements, like the requirement that every INTERCAL program must contain exactly four or five PLEASE statements.  So maybe an INTERCAL variant of BASIC, if such a thing could exist, might look like this:

    10 PRINT "Hello World"
    20 FOR X=1 TO 10
    30 PLEASE PRINT X
    35 PLEASE LET Y = X*X
    40 NEXT X
    50 PLEASE GOTO 100
    60 PLEASE PRINT "Error - Goto Failure"
    70 PRINT "Thanks for Playing"
    80 WHEN "The Sun comes up", DISPENSE "Cat Food"
    100 PLEASE END
     

    It is easy to see that in this proposed version of INTERCAL BASIC, the requirement that there be exactly four, or five PLEASE statements is satisfied, so hopefully the interpreter or compiler won't issue an error that the program is too rude or too sycophantic.  So, one way to implement a version of INTECAL BASIC would be to have a preprocessor that checks for the required number of PLEASE statements, while possibly emitting a "Feature not supported" warning, with respect to the otherwise unreachable WHEN statement.  This, of course, could get messy, very messy, very fast.  Like what if in some version of INTERCAL the PLEASE statement does nothing, and the statement following the PLEASE statement simply executes as if the PLEASE statement were not there.  

    Yet, then again, what if PLEASE statements in BASIC programs could be used to tell the interpreter or compiler that the program should attempt to launch a separate execution thread for the statement that follows the PLEASE statement? Now, things could get very interesting if all of the needed locks, semaphores, signals, or event handles could be taken care of automatically.  Then some operations, such as I/O, might be handled asynchronously, with any needed FIFOs, message queues, or other ways of storing intermediate values of various calculations queued up and processed accordingly.

    Yet what would that imply with respect to how to interpret statements like PLEASE GOTO, or PLEASE END?  Perhaps a PLEASE GOTO might imply that the runtime should fork a copy of the currently running application, which on a system that has virtual memory with copy only upon modify semantics, might actually be able to be implemented with fairly good efficiency.  Thus, the currently running copy might be suspended before the branch is taken, and a forked copy might take over at the branch target, in effect taking a snapshot of all currently active variables, along with an appropriate time stamp, in effect creating an execution checkpoint, which might then turn out to be useful for such things as implementing transactional, or "journaling" file systems, with or without certain features such as "commit" or "roll back", as needed.  Yes, this is a VERY tricky problem, indeed.  Thus, it is also easy to see that INTERCAL's already included FORGET statement might come in useful.  Yet, like I said, VERY messy indeed.

    Then there is the lack of a usable WHEN statement in most, if not all, programming languages that I know of, which is another matter that I will have something more to say about, that is to say, when I get around to it.

    Now obviously, if you look up the Wikipedia article on INTERCAL, you will see that my proposed version of INTERCAL BASIC is substantially different from the original INTERCAL, being similar only in the use of the PLEASE statement, along with my very own new and improved proposed WHEN statement.  Thus, I could perhaps make INTERCAL BASIC more INTERCAL-like by making use of READ IN and WRITE OUT, for example, instead of INPUT and PRINT, like this:

    ... Read more »

View project log

Enjoy this project?

Share

Discussions

Does this project spark your interest?

Become a member to follow this project and never miss any updates