Contributor: DJ MURDOCH

{
> I saw a message from someone that said you had compiled a list of all the
> bugs with BP 7.0... is it possible I could get a copy?

Look around for BP7BUGS2.ZIP.  That's the currently released version.  It's
available for Internet ftp from garbo.uwasa.fi:/pc/turbopas; it's also on
Compuserve, but in the CLMFORUM in the PC Techniques area, because Borland
didn't want it on BPASCAL.  It should also be available on a lot of BBS
systems.
That version isn't quite up to date; here are the newer entries:

54.  SetVisualPage doesn't take effect immediately, so writes to the old page
after the page change may show up on the screen.  Put in a delay or a wait for
the retrace if you intend to draw to the hidden page.

55.  In protected mode when using BGI with linked in fonts, repeated font
changes eventually cause the BGI driver to get messed up and abort.  There's no
problem if the .CHR files are available in the directory given to InitGraph.

56.  In BASM, "dw @variable" will not assemble properly.  BP and BPC abort,
while TURBO and TPC give a wrong answer.
58.  An array of zero length records (e.g. array[boolean] of record end;) gives
a spurious "structure too large error".
59.  Real numbers aren't parsed as the manual describes -- the decimal part and
number part of the scale factor are sometimes optional.  For example, "(1. )"
is a legal expression, but "(1.)" is not; both "1e +1" and "1e+1" are legal,
but have different values (2 and 10).
60.  Hardware interrupts during memory allocations in protected mode can cause
general protection faults.  For details and a patch, see PROTINT.FIX.

61.  Inline procedures are treated like forward declarations:  you can have a
duplicate definition of the same identifier later, and the compiler won't
declare an error unless the form of the declaration is different.  It's the
inline definition that will be used.
62.  The TEMSStream.Done destructor doesn't reset EMSCurhandle to $FFFF, so
that the next TEMSStream may work on the wrong page frame at first.  Fix: After
calling Done, manually set EMSCurhandle to $FFFF.

63.  OutText and OutTextXY don't update the current pointer properly in all
justification modes.  Use MoveTo(GetX,GetY) after a call if you want to be sure
to have CP act properly.
64.  For certain very rare pairs x and y, a $N+ division x/y will only be
accurate to about 4 decimal digits when calculated on a Pentium produced before
Fall 1994.  (This is the famous Pentium FDIV bug, not a BP bug.)

And here's the PROTINT.FIX file:


 #: 252543 S7/DOS Programming  [BPASCAL]
     14-Mar-94  04:01:44
 Sb: #252502-Increment Bug in BP7
 Fm: Peter Petersen 100120,1363
 To: DJ Murdoch 71631,122

DJ,

A protected mode program will crash when the first access to a newly allocated
segment is interrupted by a hardware interrupt. The following test program
demonstrates the bug within a few seconds:
}
   PROGRAM DPMIBug;
   USES
      DOS, CRT;
   CONST
      COM = 1;  { may be set to 1..4 }
      IRQ : ARRAY [1..4] OF byte = (4, 3, 4, 3);
      RXB  = $00; TXB  = $00; IER  = $01; IIR  = $02; LCR  = $03;
      MCR  = $04; LSR  = $05; MSR  = $06; DLL  = $00; DLM  = $01;
   VAR
      Base: Word;
      Count: LongInt;
      OrgHandler: Pointer;

      {$S- ------------------------------}
      PROCEDURE IntCOM; INTERRUPT;
      VAR
         Dummy: Byte;
      BEGIN
         Inc(Count);
         WHILE Port[Base+IIR] <> 1 DO
         BEGIN
            Dummy:=Port[Base+LSR];
            Dummy:=Port[Base+RXB];
            Port[Base+TXB]:=Ord(' ')
         END;
         Port[$20]:=$20
      END;

      {----------------------------------}
      PROCEDURE InitPort(P: Byte; Baud: LongInt);
      CONST
         MaxBaudRate = 115200;
      VAR
         Divider  : Word;
      BEGIN
         Base:=MemW[Seg0040:SizeOf(Word) * (P-1)];
         IF Base = 0 THEN
         BEGIN
            WriteLn('Port COM', P, ' not installed.');
            Halt(1)
         END;
         Port[Base + LCR]:=$80;
         Divider:=(MaxBaudRate + MaxBaudRate MOD Baud) DIV Baud;
         Port[Base + DLL]:=Lo(Divider);
         Port[Base + DLM]:=Hi(Divider);
         Port[Base + LCR]:=(8-5) + ((1-1) SHL 2) + 0;
         GetIntVec(8+IRQ[P], OrgHandler);
         SetIntVec(8+IRQ[P], Addr(IntCom));
         Port[$20+1]:=Port[$20+1] AND NOT (1 SHL IRQ[P]);
         Port[Base + MCR]:=$01 + $01 + $04 + $08;
         Port[Base + IER]:=$0F
      END;

      {----------------------------------}
      PROCEDURE DisableCOMInterrupt (P: Byte);
      BEGIN
         Port[Base + IER]:=0;
         SetIntVec(8+IRQ[P], OrgHandler)
      END;

   VAR
      P: ^Word;
   BEGIN
      System.Test8086:=0;
      {$IFDEF DPMI }
      System.HeapLimit:=0;
      {$ENDIF }
      Count:=0;
      InitPort(COM, 38400);
      Port[Base+TXB]:=Ord(' ');
      WHILE NOT keypressed DO
      BEGIN
         Write(^M, count);
         New(P);
         IF P = NIL THEN WriteLn('error in alloc!');
         IF p^ = 7 THEN ;  { read access }
         Dispose(P)
      END;
      DisableCOMInterrupt(COM);
      WHILE Keypressed DO IF ReadKey = ' ' THEN
   END.
{
The problem can be worked around by disabling interrupts during the first
access to the segment. This is achieved with the following changes to file
WMEM.ASM (part of unit System):
   Comparing files WMEM.ASM and C:\BP70\RTL\SYS\WMEM.ASM
   ***** WMEM.ASM
           OR      AX,AX
           JE      @@2                     ; line number 253
           STC                             ; error and return
           RET
   @@2:    PUSH    AX                      ; save return value
           MOV     AX, 0900H               ; DPMI ints off
           INT     31H                     ; leave int state in AX
           MOV     ES, DX                  ; load seg-reg to load segment
           INT     31H                     ; DPMI restore int state
           POP     AX                      ; restore return value
       ENDIF
   ***** C:\BP70\RTL\SYS\WMEM.ASM
           OR      AX,AX
           JE      @@1
           STC
       ENDIF
   *****

Please note that this fix only affects allocations of the heap. Others (such as
LoadLibrary, InitGraph, GlobalAlloc, etc.) are still affected.
}