[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
beginning.
> 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
clause).
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
> IBM DOS.
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. ;-)
Tomas
More information about the fpc-pascal
mailing list