tandy put their sound chip on the 1A interrupt?
-
they're sending a... internal soundblaster test command?
(DSP 0xF0)I dunno why this code is like this.
I suspect there may be an issue here: I identified a variable as containing the Soundblaster IO port, right? and I'm assuming everything that uses it is Soundblaster code.
But it may just be "soundcard IO port" and there's other sound device code mixed in here. So that's why some of it doesn't make sense as soundblaster, it's actually tandy 3voice or something
-
I suspect there may be an issue here: I identified a variable as containing the Soundblaster IO port, right? and I'm assuming everything that uses it is Soundblaster code.
But it may just be "soundcard IO port" and there's other sound device code mixed in here. So that's why some of it doesn't make sense as soundblaster, it's actually tandy 3voice or something
I just found a function (inside another function!) that's a fixed delay. How long is it?
it's a loop that runs 256 times! -
I just found a function (inside another function!) that's a fixed delay. How long is it?
it's a loop that runs 256 times!that's so cute that this code considers "256 instructions" to be a meaningful length of time.
-
that's so cute that this code considers "256 instructions" to be a meaningful length of time.
there's code in here specifically to detect if it's running on an IBM PS/1 by looking at the CMOS area?
WHAT THE
-
there's code in here specifically to detect if it's running on an IBM PS/1 by looking at the CMOS area?
WHAT THE
the menu system limits menus to having a maximum of 32 items.
which is weird because ONLY 17 WILL FIT ON SCREEN
-
the menu system limits menus to having a maximum of 32 items.
which is weird because ONLY 17 WILL FIT ON SCREEN
I did some experimenting with MSVC 5.1, and it's weird. I get the same strings in the exe as carmen.exe has, but the code itself looks completely different.
either I set up my compiler wrong, or this game is full of assembly even for very simple functions
-
I did some experimenting with MSVC 5.1, and it's weird. I get the same strings in the exe as carmen.exe has, but the code itself looks completely different.
either I set up my compiler wrong, or this game is full of assembly even for very simple functions
I don't know exactly what this function does (I know it sets some flags based on something in the graphics context) but I DO know one important thing about it:
they included it in the final binary FOUR TIMES.
-
I don't know exactly what this function does (I know it sets some flags based on something in the graphics context) but I DO know one important thing about it:
they included it in the final binary FOUR TIMES.
byte-identical.
this is a compiler & linker from 1988, it doesn't understand how to merge identical copies of functions apparently
-
byte-identical.
this is a compiler & linker from 1988, it doesn't understand how to merge identical copies of functions apparently
I found another function which has 4 copies.
I'm starting to suspect this program originally had 4 C source files and the linker wasn't optimizing this
-
I found another function which has 4 copies.
I'm starting to suspect this program originally had 4 C source files and the linker wasn't optimizing this
wait I bet it's drivers!
like, one version of this function is called by VGA_DrawFuncUnknown and nothing else.
Another one? CGA/Hercules.
the third? EGA
The last? Tandy.They compiled the 4 video drivers separately, and then linked them into the EXE, with no deduplication across compile units
-
wait I bet it's drivers!
like, one version of this function is called by VGA_DrawFuncUnknown and nothing else.
Another one? CGA/Hercules.
the third? EGA
The last? Tandy.They compiled the 4 video drivers separately, and then linked them into the EXE, with no deduplication across compile units
yeah. Found another: VGAMalloc is the same as CGAMalloc (and Hercules doesn't have it's own HerculesMalloc, because it's in the same code unit as CGA: So it just uses CGAMalloc)
Tandy has TandyMalloc.But not EGAMalloc. That one is completely different.
-
yeah. Found another: VGAMalloc is the same as CGAMalloc (and Hercules doesn't have it's own HerculesMalloc, because it's in the same code unit as CGA: So it just uses CGAMalloc)
Tandy has TandyMalloc.But not EGAMalloc. That one is completely different.
the DrawLine API is weird.
To draw the horizontal underline for the hotkeys in the menu, it calls DrawLine(0, -width).It's DrawLine(int y, int x), and yeah you pass negative numbers
-
the DrawLine API is weird.
To draw the horizontal underline for the hotkeys in the menu, it calls DrawLine(0, -width).It's DrawLine(int y, int x), and yeah you pass negative numbers
it's also off by one.
because 0,0 is silly, you're always drawing at least one pixel. So DrawLine(0, -5) draws a six pixel wide horizontal line to the left -
it's also off by one.
because 0,0 is silly, you're always drawing at least one pixel. So DrawLine(0, -5) draws a six pixel wide horizontal line to the leftPUSH BX
PUSH ES
PUSH SI
CALL StartPlayingSound
POP BX
POP ES
POP SIsince when has the x86 stack been FIFO instead of LIFO?
-
PUSH BX
PUSH ES
PUSH SI
CALL StartPlayingSound
POP BX
POP ES
POP SIsince when has the x86 stack been FIFO instead of LIFO?
the internal audio API used by this game is interesting.
LoadAndPlaySoundChunk is called with a chunk name from digisnd.dat, but you can also pass -1 or 0. I'm not sure what -1 does yet (maybe silence a currently playing sound?) but 0 means "wait until the sound finishes" -
the internal audio API used by this game is interesting.
LoadAndPlaySoundChunk is called with a chunk name from digisnd.dat, but you can also pass -1 or 0. I'm not sure what -1 does yet (maybe silence a currently playing sound?) but 0 means "wait until the sound finishes"I'm not really sure why it works that way, especially because calling LoadAndPlaySoundChunk(0) is equivalent to calling WaitUntilSoundFinishes().
So why not just do that instead?
-
I'm not really sure why it works that way, especially because calling LoadAndPlaySoundChunk(0) is equivalent to calling WaitUntilSoundFinishes().
So why not just do that instead?
uh oh. the computer noise is triggered with:
LoadAndPlaySoundChunk(217)but I look in the DIGISND.DAT file and it has chunks 200-216.
So either my DAT file parsing is wrong or it's loading sounds from elsewhere, somehow? because the sound DOES play, so it's not just an error
-
uh oh. the computer noise is triggered with:
LoadAndPlaySoundChunk(217)but I look in the DIGISND.DAT file and it has chunks 200-216.
So either my DAT file parsing is wrong or it's loading sounds from elsewhere, somehow? because the sound DOES play, so it's not just an error
I thought it might just be playing from MIDISND.DAT instead (since the computer noise is very beepy, maybe it's just a synth sound?) but MIDISND.DAT starts at chunk id 218 and goes up.
WHERE IS 217?
-
I thought it might just be playing from MIDISND.DAT instead (since the computer noise is very beepy, maybe it's just a synth sound?) but MIDISND.DAT starts at chunk id 218 and goes up.
WHERE IS 217?
huh. weird. when you try to backspace too far in the name entry screen, it goes "duh-nuh" at you, but that isn't connected to a LoadAndPlaySoundChunk call.
So it's using a different function for this ONE NOISE?
-
huh. weird. when you try to backspace too far in the name entry screen, it goes "duh-nuh" at you, but that isn't connected to a LoadAndPlaySoundChunk call.
So it's using a different function for this ONE NOISE?
maybe it's hardcoded to pc speaker and I can't tell the difference between soundblaster and pc speaker because they're both coming out of the same laptop