Post

I ended up doing some more research yesterday and ended up rewriting the core of my decoder/encoder to better handle low-level op codes. But, I'm starting to feel like I have a better handle on what these opcodes actually do, what they were intended to do, and how they are implemented

thirty-two@j.holmes.codes

oh yea! FUCK YEA, even! okay, now we are getting somewhere... The first image is with nothing initialized, the second is with a stolen payload from the original PIC.077 and the last one is filled with all the same value 0x01. HUGE!

So the opcodes in question are extended SCI0/SCI01 opcodes, and there are 5 of them: 0xFE02 : Set the mono specific dither palette mapping (the engine only seems to support pal 0) 0xFE03 : Draw to the mono buffer, using the pal lookup 0xFE04/06 : Stop drawing 0xFE05 : Draw to the mono, no lookup

On engines that support these opcodes, mono PAL-0 is initialized to all zeros, and are solid black. The only game that seemingly has these specific mono opcodes is Colonel's Bequest, which does have the bytes to *attempt* to set palettes 1–3, but those seem to be ignored by the interpreter, afaict

The actual dithers are implemented in HERCMONO.DRV, of which there are many. And suprisingly enough, the HERCMONO.DRV that I have packaged with the demo of Colonel's Bequest is different than the one from the retail game. I need to pull my personal copy off the shelf and see which driver is included

Left are the 16 dither patterns of colonel's bequest demo, and right are the 16 dither patterns of the retail game (as far as I've been able to verify/research). I kinda like the demo ones better, tbh, but i'll probably implement both (or more if I find)

0 reposts0 likes

The dithers themselves appear to be 8x8 dithers, which would make sense. Though the latter versions definitely appear like they could be 4x4 dithers, maybe. Its also interesting that these are implemented on a totally separate buffer from the normal 16-color buffer channel, and exist simultaneously

The vast majority of the games that I have in my collection use the same EGA320.DRV, there are definitely some differences, but for the most part its pretty common.

However, for the HERCMONO.DRV, there are quire a few that are different. So I've got a few more to test to see if they hold any other insights into whats going on. So far, I've only really tried d63b31 and 9a0238. But there are some more possibilities to pick from as well.

My goal now is to implement a "mono" buffer channel along-side the normal visual/priority/control channels, and properly set pixels in this layer during the picture rendering, and implement a filter to both upscale to 720 × 350 and apply mono dither.