No handler yet, just initialization.
Bochs boots up; Qemu gets into a reboot loop.
Unlike the keyboard where I did the minimum necessary for Qemu, here I
am blindly copying something alleged to work on "real hardware." Makes
no difference to the failure modes I'm seeing.
Even in this tiny endeavor I see the abyss open up. Poke bytes at some
sequence of ports, read back bytes from some sequence ports; it's like
sending out prayers.
This was tedious for three reasons beyond the usual one of having to
track and update offsets several time while I debug:
- The Bochs troubles of the previous commit kept polluting my brain
even though they were irrelevant.
- I had to keep some changes locally to allow myself to use Bochs,
which polluted my working directory.
- I had to travel the long way to the realization that I'm not
actually initializing the stack anywhere. BIOS was starting my stack
off at 0x10000, which was promptly clobbered by my second read from
disk.
The good news: while I'm here I grow the interrupt descriptor table. So
I don't have to go through this exercise when I get back to supporting
the mouse.
Oh, stupid mistake in segmented address calculation. Now Qemu's working
again everywhere. Bochs is again broken everywhere. But I think we're
getting closer. I think Bochs's BIOS implementation for reading sectors
has two interacting constraints:
- Can't write to more than 0x10000 bytes past segment register.
- Can't write across segment alignment boundaries.
Qemu only cares about the first.
While baremetal has been working with Qemu, it's been broken with Bochs
since commit 7547, where we started reading more than 63 sectors (1
track) from disk.
Good to know that Bochs simulates native hardware with so much
verisimilitude!
Unfortunately things aren't fixed yet. The current state:
- Qemu - - Bochs -
ex2.hex never switches modes works
ex2.subx never switches modes works
ex2.mu never switches modes fails unit tests
It sucks that Bochs doesn't have strictly superior verisimilitude
compared to Qemu :(
Still in progress. Known bugs:
* Cursor management is broken. Every line currently seems to leave
behind a shadow cursor.
* No shift-key support yet, which means no addition or multiplication.
(This app doesn't have division yet.)
I was wrong in commit 7437 that only one keystroke was working. The problem
was just that I was getting _too_ many events. I wasn't handling key-up
events, and they were entering the buffer, and I was not skipping null
events since the circular buffer is currently considered to be null-terminated.
ex3 isn't done yet; it can only handle 16 events. Apps need to be clearing
the keyboard buffer.
I'm trying to read the status register, but I'm still not seeing the breakpoint
being hit a second time. (And I again ran into the Bochs bug that breakpoints
at the first instruction of an interrupt handler don't work.)
Maybe this is just a debugger issue. Let's keep going, and try to start
using the keyboard events.
I'd missed that VBE call 0x4f01 (get video mode) can write up to 256 bytes.
Unexpected areas were getting clobbered because I wasn't reserving enough
space.
If it's large enough that I have doubts whether my top-of-the-line Mac
is showing the bottom of the screen inside an emulator, it's too large.
This way I also feel more confident that most modern hardware will support
this graphics mode, and that these programs will work for others.