[fpc-pascal] Compiling for DOS

Tomas Hajny XHajT03 at mbox.vol.cz
Sat Nov 12 19:19:01 CET 2005

Date sent:      	Sat, 12 Nov 2005 08:01:30 -0200
From:           	Felipe Monteiro de Carvalho <felipemonteiro.carvalho at gmail.com>
To:             	XHajT03 at vol.cz,
	FPC-Pascal users discussions <fpc-pascal at lists.freepascal.org>
Subject:        	Re: [fpc-pascal] Compiling for DOS

Hi Felipe,

> > Your best choice probably is GO32v2. However, as for any other
> > target, you need RTL compiled for the given target, the appropriate
> > binutils (as and ld) and the right configuration.
> Was FPC compiler able to create real-mode programs in the past? It
> would be very important for my use, a very precise osciloscope.

No, FPC was being created as a protected-mode compiler from the very 

> Can I still use interrupts and IN / OUT assembler opcodes in protected
> mode?

Yes, you can, although especially interrupts might be somewhat more 
complicated (depending on what you need to achieve).

For ports, you can use in/out instructions and the special array 
port[] as supported by TP/BP (requires adding unit ports to uses 

Regarding interrupts, there are (at least) two things to be aware of. 
First, there is one interrupt vector table for the protected mode and 
another table for the real mode. Calling "int xx" in your protected 
mode program calls the protected mode interrupt. This will work if 
interrupt handler for the protected mode version is installed - e.g. 
protected mode version of interrupt 21h, i.e. DOS services, is 
probably installed for most DPMI servers as far as I remember 
correctly, but the same doesn't have to be true for other interrupts. 
Calling the real mode version is possibly e.g. using GO32.RealIntr 
(or SysRealIntr).

Second, working with pointers/memory addresses is little bit more 
difficult. If you need to pass a memory block to some interrupt (e.g. 
a buffer to be filled with some information by the interrupt), you 
need to allocate this memory block within the first MB of your 
address space (real-mode code cannot access/address more), and you 
have to remember that this memory block is addressed different way 
while under real-mode (16-bit segment and offset must be passed to 
real-mode code) and when accessing it from protected-mode (32-bit 
flat address is used). Functions Global_Dos_Alloc and Global_Dos_Free 
provided in unit Go32 are your friends here.

> > If you can compile
> > on a Win 9x/ME machine (or even machine with plain DOS), the easiest
> > solution (not requiring you to play with configuration, proper setup
> > of directories, etc.) is to download the old 1.0.10 version
> Thanks, I'll try that.
> > Hopefully a DOS (GO32v2) version of FPC 2.x gets released with one
> > of the next releases.
> Maybe I can help get it released. What is missing? Code or just
> someone that compiles the whole thing? I have access to a machine with

Machine is not such a big problem (although our makefiles don't work 
under plain DOS, but require some LFN-capable system - it isn't a 
problem of the compiler, that one works under plain DOS without 
problems). There have been some bugs which prevented us from having 
version 2.0.0 released for GO32v2 target too. The most important 
issues should be hopefully fixed now, but some smaller ones still 
remain. Anybody able to help with debugging the remaining issues is 
certainly welcome. ;-)


More information about the fpc-pascal mailing list