The Wiert Corner – irregular stream of stuff

Jeroen W. Pluimers on .NET, C#, Delphi, databases, and personal interests

  • My badges

  • Twitter Updates

  • My Flickr Stream

  • Pages

  • All categories

  • Enter your email address to subscribe to this blog and receive notifications of new posts by email.

    Join 2,117 other followers

Archive for the ‘Turbo Pascal’ Category

Delphi and conditional compilation

Posted by jpluimers on 2020/10/15

There are various ways for Delphi code to verify what features are available.

Historically, testing for the existence of VER### defines with $IFDEF or $IFNDEF is the oldest means, and as of Delphi 6, you can also test for the existence and values of identifiers is $IF defined, $IF not defined and, especially for CompilerVersion and RTLVersion .

My versioned PowerShell script List-Delphi-Installed-Packages.ps1 tries to keep an up to date list of versions and features starting with BDS 1 (which was C# Builder) and BDS 2 (which was Delphi 8 with VER160). One day I will make it Pascal based in stead of BDS based.

The JEDI Code Library has kept a versioned JEDI.INC up to date since Delphi 1.0.

Binding those to specific features can be a tough thing when you depend on version numbers, but less hard when you rely on feature names.

Every couple of years, people start proposing units to replace include files, usually with an argument like this:

If you forget to include it into your source code, all your IFDEFS will fail and in the worst case your workaround won’t be active (the best case is that the compiler runs into an error so you will notice the missing include).

The problem is that for such a unit to work:

  1. you have to always use it (debunking the above argument)
  2. you will need to have the very latest version, even if you use old compilers (so you can use code written for any Delphi version)
    • See the quoted below “Do you expect that the old versions will get an update to know the new constants RTLVersion_Atlantis = 99.0; too?” below
  3. you need a central place where that version is available (like JEDI.INC)
  4. it will only work with booleans
    • See the quote below “Which is also backwards compatible because the compiler (at least in XE and up, haven’t checked any older versions) just evaluates a non existing value as False.”
  5. it requires $IF, which is a pain in the ass
    • See the quote below “Using $IF is a major pita because of $IFEND or $ENDIF depending on compiler version and $LEGACYIFEND setting.”

The only good thing is what Rudy Velthuis commented:

checking for a $DEFINE like DELPHI_RIO_UP can go wrong. If you have a typo, it will simply not be recognized as defined and compile the wrong code. Checking for {$IF CompilerVersion >= some_constant} will fail to compile if some_constant is not defined

A few people tried:


You might think that JEDI.INC was only introduced in 2003, but it is in fact much older as the JEDI Code Library had its own version control system (initially called FreeVCS) before first switching to SVN and later to GIT.

So these are only part of the history:

VER### got introduced as VER40 in Turbo Pascal 4

The product naming mess now completely has disconnected people from binding it to their Delphi version.

It helps knowing that VER### is the compiler version starting with Turbo Pascal 1, and remembering that Delphi 1 had VER80, and the three digits only started with Delphi 3 which introduced VER100.

Turbo Pascal 1 through 3 did not have any VER## defined, despite some sites

The first ever VER## conditional define was VER40 was introduced in Turbo Pascal 4, as you can see in Full text of “borland :: turbo pascal :: Turbo Pascal Version 4.0 Owners Manual 1987” (or PDF via borland :: turbo pascal :: Turbo Pascal Version 4.0 Owners Manual 1987 : Free Download, Borrow, and Streaming : Internet Archive)


JEDI History:


Read the rest of this entry »

Posted in Delphi, Development, Software Development, Turbo Pascal | Leave a Comment »

Reverse engineering Delphi and Turbo Pascal unit interfaces (and maybe DCP files too)

Posted by jpluimers on 2020/10/07

Boy, I wish there was both an Embarcadero sanctioned grammar (see Delphi code completion fail with anonymous methods – Stack Overflow) and a DCU parser.

This might work for DCP files as well, since the PKX0 signature at the start of DCP files is in [WayBack] DCU32INT/DCP.pas at master · rfrezino/DCU32INT · GitHub.

Being able to dump DCP files makes it way easier to create documenting a matrix of all DCP files and units, to their interdependencies and containments become clear (including any unit scopes).

Right now that is only documented from the unit to the package on the page of the unit (see for instance [WayBack] System.SysUtils – RAD Studio API Documentation), not the other way around. This is a pain to select which packages you need in your project when building with packages.

The list at [WayBack] Unit List – RAD Studio API Documentation (which actually is an “Alphabetical list of unit scopes, along with miscellaneous units that have no unit scope.” is only partially helpful, especially as for instance the System unit page at [WayBack] System – RAD Studio API Documentation is 90% about the System unit scope, has the System unit itself about a 3rd down and does not mention it lives in the rtl.dcp package.

The list at [WayBack] Deciding Which Runtime Packages to Use – RAD Studio is even worse than the unit list, as it misses many useful packages (like dsnap)

For my link archive:

Johan wanted to create a compiler symbol table from the binary DCU files (unlike DelphiAST which does it from the Pascal source files).

From the pre-Delphi era, I found back some info from my own archive:

In the Turbo Pascal days, you had TW1UNA and TPUUNA by William L. Peavy, which I think led to INTRFC from Duncan Murdoch (or maybe vice versa) which got updated to Turbo/Borland Pascal 7 format by Milan Dadok (see Since the basic format of DCU files is very similar to that, my guess is that DCU32INT built on that.

Later I found The Programmer’s Corner » TPU60C.ZIP » Pascal Source Code also by William L. Peavy and [WayBack] Duncan Murdoch’s Programs.


Posted in Borland Pascal, Delphi, Development, History, Pascal, Software Development, Turbo Pascal | Leave a Comment »

Borland’s legendary development tools…

Posted by jpluimers on 2019/12/12

From [WayBack] Borland’s legendary development tools Do you remember Turbo Languages from Borland? There are Pascal, C, Assembler, Basic, Prolog and many other produc… – Jaroslav Beran – Google+:

Borland’s legendary development tools

Do you remember Turbo Languages from Borland? There are Pascal, C, Assembler, Basic, Prolog and many other products. Here there is link to directory containing original documentation of many these products:

Did you work with some of them? Which one was your favorite?

[WayBack] Bitsavers Index of /pdf/borland:

[ICO] Name Last modified Size Description

[DIR] Ads/ 2011-09-01 20:47
[ ] BRIEF_for_DOS_and_OS2_Version_3.1_Users_Guide_1992.pdf 2009-06-30 22:57 8.9M
[ ] Borland_Brochure_1987.pdf 2009-11-05 02:18 2.1M
[ ] Borland_Turbo_BASIC_Owners_Handbook_1987.pdf 2009-07-30 05:33 15M
[ ] Eureka_The_Solver_Owners_Handbook_1987.pdf 2011-03-20 23:56 8.5M
[ ] Superkey_Owners_Handbook_1986.pdf 2011-02-04 02:01 7.1M
[ ] Turbo_Languages_Brochure_1988.pdf 2011-01-25 04:26 4.0M
[ ] Turbo_Vision_Version_2.0_Programming_Guide_1992.pdf 2010-06-18 19:07 25M
[ ] Windows_API_Guide_Reference_Volume_1_1991.pdf 2009-07-01 03:16 28M
[ ] Windows_API_Guide_Reference_Volume_2_1991.pdf 2009-07-01 03:16 8.7M
[ ] Windows_API_Guide_Reference_Volume_3_1992.pdf 2009-07-01 03:17 24M
[DIR] borland_C++/ 2013-01-17 00:07
[DIR] objectvision/ 2011-06-06 23:47
[DIR] paradox/ 2011-06-06 23:43
[DIR] quatro/ 2014-12-11 03:04
[DIR] quatro_pro/ 2011-06-06 23:47
[DIR] reflex/ 2011-06-06 23:37
[DIR] sidekick/ 2011-06-06 23:38
[DIR] sprint/ 2011-06-06 23:42
[DIR] turbo_assembler/ 2013-01-17 00:07
[DIR] turbo_c/ 2011-06-06 23:37
[DIR] turbo_pascal/ 2011-09-01 19:23
[DIR] turbo_prolog/ 2011-06-06 23:43

Via: [WayBack] Borland’s legendary development tools Do you remember Turbo Languages from Borland? There are Pascal, C, Assembler, Basic, Prolog and many other produc… – Adrian Marius Popa – Google+


Read the rest of this entry »

Posted in Development, History, Pascal, Software Development, Turbo Pascal | Leave a Comment »

Delphi ^A syntax: Documented, implied, or undocumented? – Stack Overflow

Posted by jpluimers on 2019/12/12

The syntax is documented. In the Turbo Pasal 3 documentation, i.e. the Z80 era.

Source my answer to [WayBackDelphi ^A syntax: Documented, implied, or undocumented? – Stack Overflow (I have added some WayBack Internet Archive links below) as it is from the Turbo Pascal era where the caret was introduced to support control characters:

This is from long ago as an escape character to enable you to have consts for control characters in a more readable way.
  CtrlC = ^C;

This defines a Char constant with value #3, then writes 3 in Borland Pascal 7, and I remember seeing it years before that too.

I just checked the Turbo Pascal 5.0 and Borland Pascal 7.0 languages guides, but could not find it, so it seems undocumented.

Edit: I do remember this was a Borland thing, and just [WayBack] checked: it is not part of the ISO Pascal standard (formerly this was ANSI Pascal Standard, thanks Sertac for noticing this).

It [WayBack] is documented in the Free Pascal documentation [WayBack].

SGI uses the backslash as escape character, as per their docs [WayBack].

More Edit: I found it [WayBackdocumented in Delphi in a Nutshell and the [WayBackDelphi Basics site.

Found it: Just found it on page 37 of the Turbo Pascal 3 Reference Manual [WayBack].

(Marco van de Voort found the Free Pascal documentation)

It in fact originates in the 1984 Turbo Pascal 1 edition, as per the [WayBack] Turbo_Pascal_Reference_Manual_Feb84.pdf:

Read the rest of this entry »

Posted in Borland Pascal, Delphi, Development, FreePascal, History, Pascal, Software Development, Turbo Pascal, Z80 | 1 Comment »

Turbo Pascal 7 compatible compiler for 8051 microcontrollers…

Posted by jpluimers on 2019/08/21

I had seen this before, but was glad about the reminder to put it in my blog: [WayBack] OMG, there is Turbo Pascal 7 compatible compiler for 8051 microcontrollers! – Primož Gabrijelčič – Google+:

[WayBack] Full-featured free Pascal compiler for 8051 microcontrollers, Borland Turbo Pascal 7 syntax, multi-pass optimizer, generates bin, hex, OMF-51 and asm source.

Program Turbo51;
Uses FastCompiler, AdvancedOptimizations, SmartLinker, AseemblerFileGenerator;
//  Turbo51 is released as freeware. You can download it and use it for FREE.
//  However, if you like Turbo51 you can donate some small amount via PayPal.
//  Donations are a great way to show your appreciation for my software.
    While ThereIsAProblem do
      Case ProblemSolved of
        True: Break;
        else  AskForHelp;
    If InstalledVersion < '' then Update;
    If Satisfied then Donate ($20);
  until NoMoreProjects;


Posted in Development, History, Pascal, Software Development, Turbo Pascal | Leave a Comment »

%d bloggers like this: