Supporting both Intel 8088/8086 and 80x86 CPUs

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Deprecated
Posts: 12
Joined: Wed Jul 27, 2011 1:57 pm

Supporting both Intel 8088/8086 and 80x86 CPUs

Post by Deprecated »

There seems to be a slight disagreement concerning the amount platform specific code required to create an OS for both the 8086 and 80x86 CPUs. In particular the amount code specific to the 8086 required for the Os to function. Since I believe the results of such discussions may be beneficial to other developers working on 16 bit operating systems I decided to create a separate thread. To begin I would to make a few points to give the discussion some context.
  • The operating system is being written in C. Although I am still evaluating 16 bit compilers the one chosen will either support or will be modified to support segmented calls and jumps, segmented returns (retf), and interrupt service returns (iret).
  • The project is based on an old 8 bit OS. The behavior and overall structure of the OS is fairly well defined and documented. I have included a portion of the summary from the spec draft that I am currently working on.
  • I am predominately interested in the amount of code required to support 8086 specific platforms, portability issues, and it's usability on other x86 platforms.
  • While most references to a non 16 bit version will likely be to the 80386 CPU. This does not automatically eliminate other CPUs and is done so only to reduce unnecessary clutter.
  • I am not new to system level development. I have previously worked on kernels and written device drivers for various embedded operating systems.
Since the snippet provided gives only general overview of the OS there are some areas specific to the 8086 that are important to the discussion:
  • The interrupt vector table (IVT). Significantly different between on the x86 and will definitely require target specific implementations to initialize and provide redirects into the kernel.
  • Programmable Interrupt Controller. Vastly different than the APIC. The potential amount of code required has yet to be determined.
  • Programmable Interrupt Timer (PIT). Can be handled with only a few lines of code on the 8086.
  • Keyboard controller (KBC). As with the PIT the amount of code to deal with the KBC is fairly insignificant.
  • Memory mapped vs. ported IO. Obviously this is something that needs to be taken into account. I don't foresee any significant amount of additional code to make most drivers work with both when necessary.
  • Video. The text driver should usable on all intended targets with little to no modification. I believe the same would likely apply to just about any ISA based card slapped in an x86 machine.
  • ATA and FDC controllers. I intend on using the BIOS for early development but drivers for these devices are related to memory mapped vs ported IO.
  • Task switching. I don't foresee the actual switch as being more than 20-30 lines of 8086 assembly code triggered by the PIT handler
  • System calls. This will likely require the most amount of 8086 specific code although how much will depend on how the IVT is handled.
I'm sure I've missed a few things as I'm still documenting items about specific hardware and haven't taken into account things like DMA yet. Some issues in dealing with segmented memory also have not been taken into account yet. This is due to the fact that how much compiler support for far data access (if any) is currently unknown.


Futility/X Specification

Introduction

Futility/X is an open implementation of the OS-9 operating system originally created for the Motorola 6809 CPU. By following the original OS-9 architectural and functional specifications Futility/X provides services suitable enough to be usable in both embedded systems and general computing environments.

The primary target platform for Futility/X is the Intel x86 family of CPUs including 16 bit, 32 bit and 64 bit architectures. The 16 bit architecture is important as it provides a suitable reference platform for legacy embedded systems. Additionally it also allows primary development efforts to be focused on a single family of CPUs where test hardware is inexpensive and plentiful.


Architectural Overview

The overall functionality of Futility/X is based on the OS-9 /6809 operating system, specifically the "Level II" version. To that effect the general behavior, available services and interaction between system components are already well defined.

Futility/X utilizes a modular kernel design. This provides an inherent flexibility for use across multiple target architectures while isolating platform specific constraints away from the core system. The following diagram shows the basic hierarchy of kernel based modules.

http://imageshack.us/photo/my-images/204/os9.png/

The kernel resides at the top level and is responsible for task allocation, task and context switching, interrupt handling, event/signal dispatching and memory management. It also provides additional services to system components such as drivers and file system managers. The kernel performs only minimal interaction with the hardware and relies on additional modules to trigger specific tasks. For instance an external “clock” module is typically supplied to instruct the kernel when it shold switch between tasks. If a programmable timer is not available or a single task environment is desired this module can be excluded.

The IO Manager is primarily responsible for routing system calls to the appropriate file system handlers. It maintains a list of all devices available to the system and provides a unified interface for performing IO related tasks. It makes no assumptions about the underlying file system or devices and does not communicate directly with hardware.

Underneath the IO manager resides components known as File Managers. They are responsible for providing interaction with various types of data access points. For instance a file manager may be provided for FAT12, FAT16, NTFS or any number of block based file systems. Likewise a file manager may also be provided for communicating with stream devices such as serial ports and keyboards. File managers rely on device drivers for access to specific hardware.

At the bottom level are device drivers. These modules typically communicate directly with the hardware but are not required to. For instance a device driver for hard drives may communicate with the hardware or perform calls to the BIOS if available. Alternatively a RAM drive will simply use system memory or may communicate with a memory expansion card.


[More TBD]
User avatar
bluemoon
Member
Member
Posts: 1761
Joined: Wed Dec 01, 2010 3:41 am
Location: Hong Kong

Re: Supporting both Intel 8088/8086 and 80x86 CPUs

Post by bluemoon »

It depends on your objective.

80386 is compatible with 8086 to some extend, so if you plan to run the least common factor of the CPU family the least problem arise.
However, if you want to expose the features of each CPU, things become complicated.

The other issue is the related hardware, supporting a wide range of CPU imply supporting larger list of hardware, and that can be huge unless you want to do the least common factor - which still require a fair amount of knowledge of many aspect.
Deprecated
Posts: 12
Joined: Wed Jul 27, 2011 1:57 pm

Re: Supporting both Intel 8088/8086 and 80x86 CPUs

Post by Deprecated »

bluemoon wrote:It depends on your objective.

80386 is compatible with 8086 to some extend, so if you plan to run the least common factor of the CPU family the least problem arise. However, if you want to expose the features of each CPU, things become complicated.
Yes but that would apply primarily to processors that came after the 8086. Dealing with things like the the IVT and and APIC would be significantly different. That would have to be dealt with even if the 8086 wasn't supported. The question then becomes how much 8086 specific code is necessary and is the amount of code significant.
bluemoon wrote:The other issue is the related hardware, supporting a wide range of CPU imply supporting larger list of hardware, and that can be huge unless you want to do the least common factor - which still require a fair amount of knowledge of many aspect.
I think that with any independently developed OS you're going to start with the bare minimum of drivers and target only those which are most common. Additional drivers may come at a later time if the OS builds a relatively knowledgeable community. With an 8086 specific OS you have the option of easily utilizing the BIOS for hard drive and floppy access. General support for text output, keyboard input, and even ACIA communication is relatively simple and is a good starting point for providing basic device support. Once the OS has become stable and capable of supporting more capable devices drivers for them can be provided as necessary.
User avatar
Brendan
Member
Member
Posts: 8561
Joined: Sat Jan 15, 2005 12:00 am
Location: At his keyboard!
Contact:

Re: Supporting both Intel 8088/8086 and 80x86 CPUs

Post by Brendan »

Hi,

I'd suggest the following steps:
  1. Go to eBay and try to buy a working 8086, and fail
  2. Go to eBay and try to buy a working 80186, and fail
  3. Go to eBay and try to buy a working 80286, and fail
  4. Go to eBay and try to buy a working 80386, and fail
Of course an OS is useless without device drivers. See if you can still find programming information for any "Ad Lib" sound card, any ISA SCSI controller or any expansion card for "expanded memory". You'll fail, but it's important to get a good understanding of the problem.

As a final step, ask everyone you know if they happen to have anything this old stored away in their attic, junk room, back shed, etc. You could even ask people here (the oldest I have is 80486DX-66), people on IRC, people in newsgroups, etc.

After you've failed to find test machines, failed to find any information needed for the rest of the hardware, and also failed to find any end-user that will ever care; give up and write the OS for 64-bit 80x86 (long mode) or maybe ARM.


Cheers,

Brendan
For all things; perfection is, and will always remain, impossible to achieve in practice. However; by striving for perfection we create things that are as perfect as practically possible. Let the pursuit of perfection be our guide.
Deprecated
Posts: 12
Joined: Wed Jul 27, 2011 1:57 pm

Re: Supporting both Intel 8088/8086 and 80x86 CPUs

Post by Deprecated »

Brendan wrote:
  • Go to eBay and try to buy a working 8086, and fail
  • Go to eBay and try to buy a working 80186, and fail
  • Go to eBay and try to buy a working 80286, and fail
  • Go to eBay and try to buy a working 80386, and fail
Why would I need to do that when I already have 3 perfectly good 8086 machines? I also have several 8086 development boards just waiting for something spiffy to be loaded on them. I also have an assortment of old ISA cards all in working condition.

Even if I didn't I might consider visiting one of these links...

http://cgi.ebay.com/IBM-S50-8086-34U-3- ... 415be8516a
http://cgi.ebay.com/Zenith-Laptop-8086- ... 2c5d483834
http://www.salicontech.com/microprocess ... iners.html
http://www.flite-shop.co.uk/product.asp ... r=&PT_ID=1
http://www.microdesignsinc.com/products ... tiboard-88
Brendan wrote:See if you can still find programming information for any "Ad Lib" sound card, any ISA SCSI controller or any expansion card for "expanded memory". You'll fail, but it's important to get a good understanding of the problem.
Perhaps you should ask yourself if any of those are necessary? Are they important? Are there alternatives such as IDE or SoundBlaster? While there may not be documentation readily available for say the AHA 154x series of SCSI cards, I'm sure there's enough information contained in existing driver source to put together a new driver. It might not be the most optimal approach but if it became absolutely necessary the information is there.
Brendan wrote:After you've failed to find test machines, failed to find any information needed for the rest of the hardware, and also failed to find any end-user that will ever care; give up and write the OS for 64-bit 80x86 (long mode) or maybe ARM.
Your favorite Saturday morning cartoon was Assumption Jumption wasn't it? Or do you just think that coming up with hardware scenarios that don't apply or are totally irrelevant makes a particular project pointless? It's obvious that you have nothing constructive or even relevant to contribute to the topic so why bother posting? Is your purpose in life to just tell other people not to do something?
User avatar
Brendan
Member
Member
Posts: 8561
Joined: Sat Jan 15, 2005 12:00 am
Location: At his keyboard!
Contact:

Re: Supporting both Intel 8088/8086 and 80x86 CPUs

Post by Brendan »

Hi,
Deprecated wrote:
Brendan wrote:
  • Go to eBay and try to buy a working 8086, and fail
  • Go to eBay and try to buy a working 80186, and fail
  • Go to eBay and try to buy a working 80286, and fail
  • Go to eBay and try to buy a working 80386, and fail
Why would I need to do that when I already have 3 perfectly good 8086 machines? I also have several 8086 development boards just waiting for something spiffy to be loaded on them. I also have an assortment of old ISA cards all in working condition.
Wow. I didn't realise you collected historical memorabilia.
Deprecated wrote:Even if I didn't I might consider visiting one of these links...

http://cgi.ebay.com/IBM-S50-8086-34U-3- ... 415be8516a
That's a 3.4 GHz Pentium 4 (and is probably less than 1 decade old), and not an 8086.
These are not "PC/XT compatible" in any way. They won't run an OS designed for "PC/XT compatible" machines, and an OS designed for any of them won't run on "PC/XT compatible" machines or any of the others.

Out of 5 links, only one of them (the Zenith Laptop) was useful. Of course the person who buys the Zenith Laptop is probably going to put it in a glass cabinet in some museum - no sane person would intend to actually use it.
Deprecated wrote:
Brendan wrote:See if you can still find programming information for any "Ad Lib" sound card, any ISA SCSI controller or any expansion card for "expanded memory". You'll fail, but it's important to get a good understanding of the problem.
Perhaps you should ask yourself if any of those are necessary? Are they important? Are there alternatives such as IDE or SoundBlaster?
"Necessary" is relative. I'd say they're as necessary as an OS that supports 8086, which is extremely unnecessary; but if you think an OS that supports 8086 is necessary then drivers for as much hardware as possible (of similar age) is also necessary.
Deprecated wrote:While there may not be documentation readily available for say the AHA 154x series of SCSI cards, I'm sure there's enough information contained in existing driver source to put together a new driver. It might not be the most optimal approach but if it became absolutely necessary the information is there.
What existing driver source? In general, the main place to look is Linux and FreeBSD/NetBSD/OpenBSD kernel source code, but 8086 machines were obsolete trash back when these OSs began and I doubt you'd find much hope there.
Deprecated wrote:Your favorite Saturday morning cartoon was Assumption Jumption wasn't it? Or do you just think that coming up with hardware scenarios that don't apply or are totally irrelevant makes a particular project pointless? It's obvious that you have nothing constructive or even relevant to contribute to the topic so why bother posting? Is your purpose in life to just tell other people not to do something?
If someone came to these forums planning to set the world record for "largest amount of time wasted masturbating", I'd probably tell them not to waste their time and do something useful instead. How is this any different? In both cases success just means more people laughing at you.


Cheers,

Brendan
For all things; perfection is, and will always remain, impossible to achieve in practice. However; by striving for perfection we create things that are as perfect as practically possible. Let the pursuit of perfection be our guide.
User avatar
Solar
Member
Member
Posts: 7615
Joined: Thu Nov 16, 2006 12:01 pm
Location: Germany
Contact:

Re: Supporting both Intel 8088/8086 and 80x86 CPUs

Post by Solar »

Perhaps I need to introduce the both of you... :oops:

Brendan, this is Deprecated. He de-lurked in this thread, and as you can see there, was met with some disbelief of my own. But I actually think he's serious about this, and am willing to give him the benefit of doubt. At least he can express himself, which puts him heads and shoulders above the "usual" 8086-designers.

Deprecated, this is Brendan. While others might have a higher post count than he does, nobody surpasses his signal / noise ratio, or - I'm guessing here but I don't expect much contradiction - his experience in things OS-related. If there's a thing like being "forum god", he'd be the #1 contender.

I'd recommend both of you take a step back and re-start this conversation. 8)
Every good solution is obvious once you've found it.
User avatar
Brendan
Member
Member
Posts: 8561
Joined: Sat Jan 15, 2005 12:00 am
Location: At his keyboard!
Contact:

Re: Supporting both Intel 8088/8086 and 80x86 CPUs

Post by Brendan »

Hi,
Solar wrote:Brendan, this is Deprecated. He de-lurked in this thread, and as you can see there, was met with some disbelief of my own. But I actually think he's serious about this, and am willing to give him the benefit of doubt. At least he can express himself, which puts him heads and shoulders above the "usual" 8086-designers.
I remain dubious, but you're right - some "benefit of the doubt" isn't going to hurt.
Deprecated wrote:There seems to be a slight disagreement concerning the amount platform specific code required to create an OS for both the 8086 and 80x86 CPUs. In particular the amount code specific to the 8086 required for the Os to function.
The job of an OS (or at least one of them) is as an abstraction layer, so that the applications don't need to care so much about the underlying hardware details. The first problem is going to be defining this abstraction in an efficient way.

To support 8086 applications need to be designed for real mode. For later CPUs the kernel has to use either "16-bit protected mode" or protected mode to access all of the physical address space (without at least some support for this you can't access all RAM or access most memory mapped devices). None of these CPU modes support the direct execution of real mode code. For protected mode you can use "virtual8086 mode" (which is efficient). For "16-bit protected mode" you're basically screwed.

So, from the very start you need to decide how you're going to deal with this. Your choices are:
  • Run the OS/kernel in real mode; with code that temporarily switches to "16-bit protected mode" or protected mode to transfer data to/from otherwise inaccessible areas of the physical address space
  • Where possible, run the kernel in "16-bit protected mode" or protected mode and emulate real mode for applications
The first option sucks because you'd be wasting a lot of time switching between CPU modes and shuffling data into and out of the "less than 640 KiB" of accessible RAM (note: for 80286 switching from "16-bit protected mode" back to real mode is extremely expensive because the CPU doesn't support it and you need to do a "warm reset" of the computer as a work-around). There's also no way of having any security/protection (e.g. to prevent malicious code and/or bugs from doing whatever it likes). The only advantage here is that it'd cost the least development time.

The second option means you'd need 3 different kernels (one for real mode, one for "16-bit protected mode" and one for protected mode). That adds up to a lot of extra work. The advantage here is that (if it's done well) you'd be able to run real mode applications efficiently (and also isolate them so they can't trash each other). The other advantage is that you could add support for 16-bit and/or 32-bit applications so that applications themselves don't necessarily need to be limited to 1 MiB of space (unless those applications need to run on 8086).

There's a similar problem for device drivers. To reduce development time you want to use the same real mode device drivers under all kernels; but for efficiency/performance the last thing you'd want to do is use real mode device drivers for the "16-bit protected mode" and protected mode kernels and you'd probably want 3 different versions of each device driver.

If you forget about 80286 and older; then you will end up with better efficiency with a lot less work (as applications and drivers could be native 32-bit without the need for data shuffling, mode switches, emulation, etc). That's why (regardless of whether you choose development time or efficiency) it is very hard to justify supporting 80286 and older.


Cheers,

Brendan
For all things; perfection is, and will always remain, impossible to achieve in practice. However; by striving for perfection we create things that are as perfect as practically possible. Let the pursuit of perfection be our guide.
User avatar
Owen
Member
Member
Posts: 1700
Joined: Fri Jun 13, 2008 3:21 pm
Location: Cambridge, United Kingdom
Contact:

Re: Supporting both Intel 8088/8086 and 80x86 CPUs

Post by Owen »

There is a very large common subset of 16-bit protected mode and real mode. Indeed, remember that Windows 3.0 used this:
  • In Real Mode, it could run on an 8086 and all applications ran in real mode.
  • In Standard mode, it could run on an 80286 or higher. If my memory serves me correctly, apps ran in 16-bit protected mode, while the one permitted DOS box ran in real mode
  • In 386 Enhanced mode, it ran on a 386 or higher. Apps ran in 16-bit protected mode, drivers ran in 32-bit protected mode, and DOS boxes ran in v8086 mode
If I were going to undertake this process, I would architect my kernel carefully so that the majority of the code would be portable. I think I would make my kernel and (kernel mode, if monolithic kernel) device drivers memory model agnostic, while applications would be free to choose their own model. I think I would have a definition "LARGE", which would expand to FAR on 16-bit mode targets and nothing on 32-bit mode targets.

Translation would then become the responsibility of a single layer, whether this be at a kernel level (i.e. on the kernel side of a system all) or at the user level (i.e. in a library). I would define some kind of IDL and write a compiler for it to automate this translation process. I think I would generalize this IDL compiler so it can also generate library translation thunks - for example, you might want calls to a certain library from 16-bit apps to be redirected to the 32-bit version of the library. At the end of the day, generating the translation thunks shouldn't prove that difficult in the grand scheme of things.

The final thing I would consider is executable format. For 16-bit executables, you have the choice of DOS MZ, Win16/OS/2 NE, or OS/2 LX or roll your own. For 32-bit and 64-bit you have much more freedom. Though support for it is limited, I find the OS/2 LX interesting here; it is designed for 32-bit machines, and it appears that, for the 32-bit libraries, it would also be possible to build the 16-bit translation thunks into it. If you're using Watcom, WLINK supports generating LX executables.

Finally, I would make sure that only the 16-bit kernel code cared whether it was running on a 286 or an 8086 (probably because it would be a completely different kernel)
User avatar
Brendan
Member
Member
Posts: 8561
Joined: Sat Jan 15, 2005 12:00 am
Location: At his keyboard!
Contact:

Re: Supporting both Intel 8088/8086 and 80x86 CPUs

Post by Brendan »

Hi,
Owen wrote:There is a very large common subset of 16-bit protected mode and real mode.
...
You're right.

The largest difference between 16-bit and real mode is in the segmentation. If that difference is adequately abstracted (including "far pointer arithmetic" restrictions), then memory management and memory access could (from the application's perspective) be done with opaque "segment IDs", and the application needn't be aware of which mode it is running under.

In that case, the kernel could also be mostly 16-bit (everything except the memory manager); and you'd only need 4 different "memory management modules":
  • One for real mode (for 8086), where all tasks (individually and combined) are limited to a maximum of about 640 KiB of RAM
  • One for 16-bit protected mode (for 80286), where all tasks (individually and combined) are limited to a maximum of about 15.5 MiB of RAM
  • One for 32-bit protected mode (for 80386 or later), where all tasks (combined) are limited to a maximum of about 3.5 GiB of RAM and each task (individually) is limited to about 512 MiB (8192 descriptors in a private LDT per task, at 64 KiB per descriptor)
  • One for long mode or 32-bit protected mode with PAE, where all tasks (combined) are limited to a maximum of about 4096 TiB of RAM and each task (individually) is limited to about 512 MiB. In this case you'd probably also need special handling for any segments shared by different tasks, but that's not too hard to cope with.
You wouldn't need virtual8086 (or emulation of any kind) either; and you'd get binary portability (not just source code portability).

For device drivers the same applies. For memory mapped devices the driver would have to ask the kernel's memory management module to convert (normative 64-bit?) physical addresses into 64 KiB (or smaller) accessible chunks for use with the opaque segment IDs.

Programming in an environment like that might not be fun (anything that involves manipulating a large amount of data would seem like eating an elephant with a teaspoon); and there are other differences to consider (exception and IRQ handling/abstraction, etc); but it would be much more practical. It would also make my previous "development time vs. efficiency" argument mute.


Cheers,

Brendan
For all things; perfection is, and will always remain, impossible to achieve in practice. However; by striving for perfection we create things that are as perfect as practically possible. Let the pursuit of perfection be our guide.
User avatar
Owen
Member
Member
Posts: 1700
Joined: Fri Jun 13, 2008 3:21 pm
Location: Cambridge, United Kingdom
Contact:

Re: Supporting both Intel 8088/8086 and 80x86 CPUs

Post by Owen »

The biggest issue that I can see with making a 16-bit kernel and using it everywhere is that, in long mode, the kernel is still going to be stuck in the bottom 4GB of the address space with the application. If this is a microkernel, it may prove less of an issue (less kernel resource use), but then again... a microkernel would probably prove easy to make portable.
uri
Posts: 8
Joined: Tue Feb 22, 2011 12:53 pm

Re: Supporting both Intel 8088/8086 and 80x86 CPUs

Post by uri »

Brendan wrote: Of course an OS is useless without device drivers. See if you can still find programming information for any "Ad Lib" sound card, any ISA SCSI controller or any expansion card for "expanded memory". You'll fail, but it's important to get a good understanding of the problem.
I realize the discussion has moved on, but I think it is worth noting that programming information on old PC hardware isn't all that hard to find. The AdLib is not much more than a Yamaha YM3812 (datasheet, PC specific info). For the AHA 1540 controller mentioned by Deprecated there's a manual available; chapter 5 looks promising.
immibis
Posts: 19
Joined: Fri Dec 18, 2009 12:38 am

Re: Supporting both Intel 8088/8086 and 80x86 CPUs

Post by immibis »

Broken link, it looks like that site checks the referer to prevent hotlinking.
Gigasoft
Member
Member
Posts: 856
Joined: Sat Nov 21, 2009 5:11 pm

Re: Supporting both Intel 8088/8086 and 80x86 CPUs

Post by Gigasoft »

See if you can still find programming information for any "Ad Lib" sound card [...] You'll fail, but it's important to get a good understanding of the problem.
First hit in google: http://shipbrook.com/jeff/sb.html
Deprecated
Posts: 12
Joined: Wed Jul 27, 2011 1:57 pm

Re: Supporting both Intel 8088/8086 and 80x86 CPUs

Post by Deprecated »

I have no intention of using a 16 bit kernel when targeting 32 bit or 64 bit platforms. I just don't see that as a workable solution. I do however intend on writing the bulk of the kernel and associated modules so they may be compiled for the appropriate targets with little or no modification. Obviously there are some chunks of code that will need to be different based on the platform (task switching, memory management, etc.), the modular design will certainly help in this regard. It's unlikely I will put any effort into supporting the 80286, I see it as the retarded cousin that refers to the 80386 as it's uncle daddy.

Unless a more capable set of tools comes along it looks like I will be using the Open Watcom compiler for building the 16 bit version of the OS. This will allow for a certain level of transparency and provide the necessary level of general portability at the source code level. Of particular note are the __far and __loadds specifiers as they will eliminate most if not all requirements to manipulate segment registers in the common code base. For 32 and 64 bit targets a flat memory model is expected so the specifiers are simply removed with empty macros.

For the 8086 targets I had initially considered limiting the kernel and associated modules to having a total of 64k of memory for data. With the Watcom compiler that is no longer necessary and each module can have it's own data segment while still having access to global kernel memory. By specifying __loadds in addition to __far for all functions used as entry points there should be few if any issues with inter-module calls. Although Watcom does support the __huge specifier for data that crosses segment boundaries it's still too early to consider it's usage.

I'm currently working on a proof of concept to virtual the interrupt handlers. I hope to include examples for the clock module required for task switching and a keyboard input driver for calling functions across modules.
Post Reply