tandy put their sound chip on the 1A interrupt?
-
this'll be (relatively) easy to do, since it turns out this program only needs 432 KB, since it targets a 512 KB RAM machine.
Since it's no longer 1990, I think I can safely bump that up a bit? I won't need more than another 64 KB, which means I'll just bump the game up to 496 KB memory required. Completely doable in any 640 KB or more machine!my added code will just load the CUSTOM.DAT file off the disk, and then inject pointers to it in the rest of the program.
-
my added code will just load the CUSTOM.DAT file off the disk, and then inject pointers to it in the rest of the program.
the applyPronouns function lets you adjust how it's encoded dynamically. Fancy!
So how it works is you do something like this:applyPronouns("\80 was bald", 0x80, "he\0him")
and it'll return "he was bald", right? But it's more than just a simple find-replace...
-
the applyPronouns function lets you adjust how it's encoded dynamically. Fancy!
So how it works is you do something like this:applyPronouns("\80 was bald", 0x80, "he\0him")
and it'll return "he was bald", right? But it's more than just a simple find-replace...
Because you can do:
applyPronouns("I saw \81. \80 was bald!", 0x80, "he\0him")
and it'll return "I saw him. he was bald!".
See, you can specify multiple replacements at once, by using \x80, \x81, \x82 and so on.
-
Because you can do:
applyPronouns("I saw \81. \80 was bald!", 0x80, "he\0him")
and it'll return "I saw him. he was bald!".
See, you can specify multiple replacements at once, by using \x80, \x81, \x82 and so on.
The way it actually works is the game uses "He/he/Him/him" for the pronouns, so \x80 is uppercase "He", \x81 is lowercase, \x82 is uppercase "Him", and \x83 is lowercase.
-
The way it actually works is the game uses "He/he/Him/him" for the pronouns, so \x80 is uppercase "He", \x81 is lowercase, \x82 is uppercase "Him", and \x83 is lowercase.
trying to figure out how to properly decode the fonts in this game is REALLY reminding me why I constantly cheat with The Death Generator. Staring at a decompilation/disassembly and hex editor is no fun
-
trying to figure out how to properly decode the fonts in this game is REALLY reminding me why I constantly cheat with The Death Generator. Staring at a decompilation/disassembly and hex editor is no fun
it makes some sense that I'm having trouble with it. I think it's technically DOUBLECOMPRESSED
-
it makes some sense that I'm having trouble with it. I think it's technically DOUBLECOMPRESSED
I should be able to put a breakpoint on "the palette changed"
-
I should be able to put a breakpoint on "the palette changed"
ooh, timing NOPs. Someone figured that PCs wouldn't get any faster after 1990
-
ooh, timing NOPs. Someone figured that PCs wouldn't get any faster after 1990
I got my floppy copy in the mail, I just need to image it.
Fun fact from the box: It has a letter from the player character to their cousin, and I believe this is the only place in the game and associated media that they name your character.
It's Dale.
-
I got my floppy copy in the mail, I just need to image it.
Fun fact from the box: It has a letter from the player character to their cousin, and I believe this is the only place in the game and associated media that they name your character.
It's Dale.
I also discovered that in the Amiga port, they redrew the crime computer to make it clearly an amiga. Cute!
-
I also discovered that in the Amiga port, they redrew the crime computer to make it clearly an amiga. Cute!
Imaged my original disks. Two 360kb 5.25" disks.
They're laid out like this:
Disk 1:
CARMEN.EXE
CARMEN.DAT
Disk 2:
CITIES.DAT
MIDISND.DAT
DIGISND.DAT -
Imaged my original disks. Two 360kb 5.25" disks.
They're laid out like this:
Disk 1:
CARMEN.EXE
CARMEN.DAT
Disk 2:
CITIES.DAT
MIDISND.DAT
DIGISND.DATFinally, we know the answer to the age-old question of Where in the World is Carmen Sandiego?
The answer is "My floppy drive"
-
Finally, we know the answer to the age-old question of Where in the World is Carmen Sandiego?
The answer is "My floppy drive"
it has been 0 days since foone has foolishly tried to hack a decompression algorithm.
-
it has been 0 days since foone has foolishly tried to hack a decompression algorithm.
well my "ignore the problem" solution of using bochscpu to embed a 16bit x86 emulator has failed. it's somehow broken and it's broken in the rust library or C core, not the python, and I really don't want to have to deal with debugging this.
time to switch to a completely different x86 emulator? PROBABLY!
-
well my "ignore the problem" solution of using bochscpu to embed a 16bit x86 emulator has failed. it's somehow broken and it's broken in the rust library or C core, not the python, and I really don't want to have to deal with debugging this.
time to switch to a completely different x86 emulator? PROBABLY!
unicorn has great documentation.
at least I assume it would be great, if it existed
-
unicorn has great documentation.
at least I assume it would be great, if it existed
x86 16bit segmentation and regular expressions:
BECAUSE FUCK IT
-
x86 16bit segmentation and regular expressions:
BECAUSE FUCK IT
I'm implementing unicorn as an x86 emulator to do the decompression, but I'm single-stepping the processor and I'm aiding debugging by showing what instruction I'm on.
but instead of having to set up an x86 disassembly engine, I'm just parsing a plain text ghidra dump of the disassembly. I'm parsing it with regexes
-
I'm implementing unicorn as an x86 emulator to do the decompression, but I'm single-stepping the processor and I'm aiding debugging by showing what instruction I'm on.
but instead of having to set up an x86 disassembly engine, I'm just parsing a plain text ghidra dump of the disassembly. I'm parsing it with regexes
it's too bad python's ctypes doesn't support 16-bit x86. it'd be handy right now
-
it's too bad python's ctypes doesn't support 16-bit x86. it'd be handy right now
my latest bad idea: DUMBPATCH.
to avoid the complexity of generating functions and mapping them into the address space of the emulated PC, I instead designed a simple syntax:
a 16bit segmented address plus a number. that function is emulated as if it returned that number in AX. There are no other options. I suspect I'll be able to emulate up to 80% of complex subfunctions with this one bit of functionality
-
my latest bad idea: DUMBPATCH.
to avoid the complexity of generating functions and mapping them into the address space of the emulated PC, I instead designed a simple syntax:
a 16bit segmented address plus a number. that function is emulated as if it returned that number in AX. There are no other options. I suspect I'll be able to emulate up to 80% of complex subfunctions with this one bit of functionality
I need this because the decompression routine I'm emulating isn't entirely standalone: it calls malloc() at the beginning and free() at the end
so I'm replacing malloc() with a static value and free() with a return value no one will check