Seite 1 von 1

Programm verhält sich unterschiedlich in Turbo Pascal und Turbo C

Verfasst: So 3. Jan 2021, 17:45
von markusk
Hallo,

ich stehe vor dem Problem daß die beiden folgenden Programme dasselbe tun sollten was aber leider nicht der Fall ist.

Die Turbo C Version verhält sich nicht so wie ich es erwarte, obwohl ich optisch nun echt keine Unterschiede mehr erkenne.

Seht ihr hier einen funktionellen Unterschied den ich vielleicht übersehen habe?

Es wird hier zunächst über eine Funktion des Video-Interrupts die Adresse des VGA 8x16 Fonts ermittelt und die Punktmuster aller 256 Zeichen in ein Array kopiert. Dann wird eine kleine Veränderung am Zeichen A vorgenommen und der so veränderte Font wird dann über eine andere Funktion des Video Interrupts aktiviert.

Wenn ich die Turbo C Version ausführe herrscht am Bildschirm das volle Chaos, sämtliche Zeichen scheinen mit zufälligen Mustern befüllt zu sein wohingegen bei der Turbo Pascal Version das erwartete Ergebnis entsteht (Buchstabe A ist leicht verändert, alles andere bleibt gleich).

lg, Markus

Hier die Turbo-Pascal Version:

Code: Alles auswählen

program test;
uses crt,dos;

var font : array [0..4095] of byte;
    cpu : registers;
    byteptr : ^byte;

begin
  clrscr;
  
  (* Adresse des 8x16 VGA Fonts ermitteln und die Punktmuster aller 256 Zeichen ins Array font kopieren *)
  cpu.ax:=$1130;
  cpu.bx:=$0600;
  intr($10,cpu);
  byteptr:=ptr(cpu.es,cpu.bp);
  move(byteptr^,font,4096);

  (* Buchstabe A geringfügig verändern *)
  font[65*16+0]:=$ff;
  font[65*16+1]:=$ff;

  (* Veränderten Font aktivieren *)
  cpu.ax:=$1100;
  cpu.bx:=$1000;
  cpu.cx:=256;
  cpu.dx:=0;
  cpu.es:=seg(font);
  cpu.bp:=ofs(font);
  intr($10,cpu);
end.
Und hier die Turbo C Version:

Code: Alles auswählen

#include <stdio.h>
#include <dos.h>
#include <string.h>

typedef unsigned char byte;

byte font[4096];
struct REGPACK cpu;
byte far *byteptr = NULL;

int main() {
   cpu.r_ax = 0x1130;
   cpu.r_bx = 0x0600;
   intr(0x10,&cpu);

   byteptr=MK_FP(cpu.r_es, cpu.r_bp);

   movedata(FP_SEG(byteptr), FP_OFF(byteptr), FP_SEG(font), FP_OFF(font), 4096);

   font[65*16+0]=255;
   font[65*16+1]=255;

   cpu.r_ax = 0x1100 ;
   cpu.r_bx = 0x1000;
   cpu.r_cx = 256;
   cpu.r_dx = 0;
   cpu.r_es = FP_SEG(font);
   cpu.r_bp = FP_OFF(font);

   intr(0x10,&cpu);
   
   return 0;
}

Re: Programm verhält sich unterschiedlich in Turbo Pascal und Turbo C

Verfasst: Mo 4. Jan 2021, 09:39
von mkarcher
Ich habe gerade kein Turbo C zum ausprobieren greifbar, aber ich könnte mir gut vorstellen, dass FP_SEG/FP_OFF nur mit "echten far-Zeigern" klarkommt, was bei "font" nicht der Fall ist, insbesondere, wenn das Programm im Speichermodell Tiny, Small oder Medium kompiliert wird. Ich schlage daher vor, zu probieren, in main eine Variable "byte far *fontptr = font;" einzufügen, und dann "FP_SEG(font)" durch "FP_SEG(fontptr)" zu ersetzen, analog für FP_OFF.

Re: Programm verhält sich unterschiedlich in Turbo Pascal und Turbo C

Verfasst: Mo 4. Jan 2021, 20:53
von markusk
mkarcher hat geschrieben: Mo 4. Jan 2021, 09:39 Ich habe gerade kein Turbo C zum ausprobieren greifbar, aber ich könnte mir gut vorstellen, dass FP_SEG/FP_OFF nur mit "echten far-Zeigern" klarkommt, was bei "font" nicht der Fall ist, insbesondere, wenn das Programm im Speichermodell Tiny, Small oder Medium kompiliert wird. Ich schlage daher vor, zu probieren, in main eine Variable "byte far *fontptr = font;" einzufügen, und dann "FP_SEG(font)" durch "FP_SEG(fontptr)" zu ersetzen, analog für FP_OFF.
Hallo,

Hat leider auch nicht funktioniert, ist mir echt ein Rätsel....

Lg, Markus

Re: Programm verhält sich unterschiedlich in Turbo Pascal und Turbo C

Verfasst: Di 5. Jan 2021, 10:54
von mkarcher
markusk hat geschrieben: Mo 4. Jan 2021, 20:53 Hallo,

Hat leider auch nicht funktioniert, ist mir echt ein Rätsel....

Lg, Markus
Ich habe Dein Programm unter DOSBox gerade in Turbo C++ 1.0 (dem Nachfolger von Turbo C 2.0) ausprobiert, und dort funktioniert es wie erwartet (sowohl im Modell Small wie im Modell Large). Es liegt also nahe, dass Du über einen Bug oder eine Unzulänglichkeit von Turbo C gestolpert bist, die Borland in einer späteren Version gefixt hat.

Re: Programm verhält sich unterschiedlich in Turbo Pascal und Turbo C

Verfasst: Mi 6. Jan 2021, 10:16
von markusk
Hallo,

super, danke für's Ausprobieren :) Hätt ich mir in diesem einfachen Fall nicht gedacht daß die Ursache eventuell im Turbo C selbst zu finden sein könnte.

Dann werd ich mal schaun ob ich irgendwo ein Turbo C++ rumliegen hab.....

lg, Markus