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

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
markusk
Norton Commander
Beiträge: 132
Registriert: Fr 19. Apr 2013, 11:12

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

Beitrag 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;
}
mkarcher
LAN Manager
Beiträge: 204
Registriert: Fr 5. Jun 2020, 19:38

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

Beitrag 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.
markusk
Norton Commander
Beiträge: 132
Registriert: Fr 19. Apr 2013, 11:12

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

Beitrag 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
mkarcher
LAN Manager
Beiträge: 204
Registriert: Fr 5. Jun 2020, 19:38

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

Beitrag 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.
markusk
Norton Commander
Beiträge: 132
Registriert: Fr 19. Apr 2013, 11:12

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

Beitrag 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
Antworten