48 ms·
> they only work in the real-address mode So it's not for i386, it's for XT by the sounds of it.
by tus88 7y ago
> they only work in the real-address mode
So it's not for i386, it's for XT by the sounds of it.
- Crinus 7y agoXT implies 8086 and there are more real address mode instructions than those available in 8086. AFAIK real address mode can use pretty much any 32bit instructions with a prefix, which is what this project is doing. (this incompatibility bit me a bit many years ago when i was writing a small real mode OS in assembly - i used a bunch of instructions i thought were available in 8086 but when i tried the OS on a real XT machine it would lock up :-P)
- qx89l4 7y agoTargeting 8086-level of instructions was actually my first idea. It wasn't possible with gcc/clang, but Turbo C is freeware these days, so... ;) In case you're interested, see https://github.com/luke8086/nf/ https://github.com/luke8086/nf/
- oso2k 7y agoHave you tried running `nf` or `boot2c` against NuXT [0] or Nano8088 [1]? [0] https://monotech.fwscart.com/NuXT_-_MicroATX_Turbo_XT_-_955MHz_832K_RAM_XT-CF_SVGA_Floppy_Serial/p6083514_19777986.aspx https://monotech.fwscart.com/NuXT_-_MicroATX_Turbo_XT_-_955M... [1] https://monotech.fwscart.com/Nano_8088_-_Turbo_XT_SBC_CompactFlash_832K_RAM_PS2_keyboard_64K_ROM/p6083514_19478757.aspx https://monotech.fwscart.com/Nano_8088_-_Turbo_XT_SBC_Compac...
- qx89l4 7y agoHadn't heard of them, thanks for the links!
- ofrzeta 7y agoYou could also use OpenWatcom, I think. https://github.com/open-watcom/open-watcom-v2 https://github.com/open-watcom/open-watcom-v2
- Crinus 7y agoAs someone mentioned below you could also use OpenWatcom, if for no other reason than it should have a slightly better optimizer (though from my tests i haven't seen much of a difference between the two, at least for code i tried to optimize a lot myself). AFAIK one of the OWv2 contributors is working on a 16bit OS so the 16bit support should be excellent. OWv2 is also available as a Linux binary so you could use it for crosscompiling in a similar way to GCC.
- qx89l4 7y agoGood point, OpenWatcom is obviously miles ahead of Turbo C, but it's also much more complex. I tinkered with it for a while, and ended up using the latter for its simplicity. DOSBox can be easily installed on any system, you can save the entire C: in a git repo and it'll probably keep working in any number of years from now :) Meanwhile, OWC doesn't have packages in popular Linux distros, only a custom binary installer, and on MacOS it doesn't even have that.
- rwmj 7y agoNo, he's using -m16 -march=i386 which creates 32 bit code that boots in 16 bit mode using the 32 bit size prefix on most instructions, and that will only work on 80386 and above.
- jacobush 7y agoThis is so insane, I had no idea such a thing was possible: 16 vs 32 bit It is possible to use 32-bit instructions in the real-address mode, they just need to be marked with address-size and operand-size prefixes. The -m16 option for clang/gcc, and .code16 directive in GNU assembler, do exactly that. The resulting code is 32-bit, only marked everywhere with those prefixes. It's not compatible with actual 16-bit CPUs. "Unfortunately the 32-bit addresses still cannot exceed the boundary of the segment (65535), otherwise they'll trigger an exception. QEMU doesn't emulate this behaviour, so it's useful to occasionally test with Bochs."
- deleted 7y ago[deleted]
- dexen 7y ago>> they only work in the real-address mode Presumably it would work just fine in the "Unreal mode"[1] - one which is very similar to real, with the added benefit of being 32bit address space, and 32bit instructions by default [1] https://en.wikipedia.org/wiki/Unreal_mode https://en.wikipedia.org/wiki/Unreal_mode
- qx89l4 7y agoI'm not sure if defaulting to 32-bit instructions would still allow calling BIOS, but good point! In this case the design goal was to show the easiest way to jump into C and start building the actual application, so I just tried to avoid any trickery (even enabling the A20 line)
- PixelOfDeath 7y agoYou just set your chosen segment register(s) in protect mode, jump back to real mode, and then can use this segment register(s) in combination with the 32bit prefix to make a 32 bit memory access. All other segment registers are untouched and you can call into the bios just fine.