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.
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;
}