Replies

This profile is from a federated server and may be incomplete. Browse more on the original instance.

foone, to random
@foone@digipres.club avatar

why do I keep hacking 16bit DOS games? do I hate myself?

32bit programs are SO MUCH EASIER to RE, because when you see an address, you know what it means. 0x12345678 always means 0x12345678!

foone,
@foone@digipres.club avatar

there's 65536 possible memory addresses it could be!

foone,
@foone@digipres.club avatar

not to mention that there's more than one way to address a given part of memory.

in 32bit and 64bit code, if you see 0x12345678, you know that some code that writes to 0x12335662 doesn't change it.

not so in 16bit games. you have plenty of ways to refer to the same address.

foone,
@foone@digipres.club avatar

This is why 16bit x86 is SO much more annoying than 8-bit computers.
with 8-bit computers, you have 16-bit addresses, because 256 bytes is rarely enough memory. So they work by having some addresses which are longer. simple, right? so instead of an 8bit number, you have a 16bit number.

foone,
@foone@digipres.club avatar

16bit x86 does this as well. 16bits of ram is only 64kb, and that's just not enough. So you expand it to 24bits or 32bits, for "long addresses", right? same as you use in 8bit computers?

NOPE

foone,
@foone@digipres.club avatar

segmented addressing, the solution they use, is not as simple as just adding some more bits. a 16bit segment and a 16bit offset.

so that's just a weird way of explaining a 32bit number, right?
NOPE

foone,
@foone@digipres.club avatar

no, you combine 16bits and 16bits and get... 20 bits.

it's a 20bit address.

foone,
@foone@digipres.club avatar

so what, they ignore all but the bottom 4 bits of the segment?

NO THAT WOULD MAKE SENSE

foone,
@foone@digipres.club avatar

instead the full 16bit segment is used, but it's turned into a 20bit address by shifting it 4 bits over and adding in the offset.

foone,
@foone@digipres.club avatar

So it's the TOP 4 bits that are important, not the bottom 4.

Okay that's fine, but wait, I said adding. Not "replacing".

Yes, all 16bits are used. So the address 0000:0000 is (linear) 0x0, and 0001:0000 is (linear) 0x10

foone,
@foone@digipres.club avatar

which also means that 0001:0000 and 0000:0010 are both linear 0x10.

So you can get pointer aliasing even though both pointers HAVE DIFFERENT VALUES

foone,
@foone@digipres.club avatar

And if that wasn't bad enough, there's also the A20 gate nonsense. Now, the A20 gate was added with the 286, for backwards compatibility with how the 8086/8088 worked, which is that memory wrapped.

foone,
@foone@digipres.club avatar

so not only are 0001:0000 and 0000:00010 the same address, so is FFFF:0020!

foone,
@foone@digipres.club avatar

but don't worry, for the 286 they wanted to add more than 1 megabyte of RAM, which is the max you can address with a 20bit address, so they added the ability to disable address wrapping.

on the keyboard controller.

foone,
@foone@digipres.club avatar

so now your memory wrapping changes based on what you write to the keyboard controller.

BRILLIANT IDEA

foone,
@foone@digipres.club avatar

anyway my favorite part of this A20 line thing is that it was supported by Intel chips up until Haswell, in 2013.

So in 2012 your 8 gigabyte of RAM PC booted up with every other megabyte of RAM mirrored to each other.

  • All
  • Subscribed
  • Moderated
  • Favorites
  • random
  • uselessserver093
  • Food
  • aaaaaaacccccccce
  • test
  • CafeMeta
  • testmag
  • MUD
  • RhythmGameZone
  • RSS
  • dabs
  • KamenRider
  • KbinCafe
  • Ask_kbincafe
  • TheResearchGuardian
  • Socialism
  • oklahoma
  • SuperSentai
  • feritale
  • All magazines