Interrupt-Aufruf in C funktioniert nicht richtig

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

Interrupt-Aufruf in C funktioniert nicht richtig

Beitrag von markusk »

Hallo,

steh hier gerade vor einem Problem und finde die Ursache nicht. Ich hab dasselbe Programm in Turbo Pascal, Assembler und Turbo C geschrieben, aber es funktioniert nur in den ersten beiden Sprachen, in Turbo C will es einfach nicht.

Assembler-Version:

.model small
.stack 100h

.code
START:
mov ax,1130h
mov bx,0600h
int 10h

mov ax,1110h
mov bx,1000h
mov cx,256;
mov dx,0;
int 10h


mov ah,4ch
int 21h

END START

Turbo C Version:

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

struct REGPACK cpu;
unsigned int es;
unsigned int bp;

int main () {

clrscr();
cpu.r_ax=0x1130;
cpu.r_bx=0x0600;
intr(0x10,&cpu);

es=cpu.r_es;
bp=cpu.r_bp;

cpu.r_ax=0x1110;
cpu.r_bx=0x1000;
cpu.r_cx=256;
cpu.r_dx=0;
cpu.r_es=es;
cpu.r_bp=bp;

intr(0x10,&cpu);

return 0;
}

Sollte eigentlich dasselbe bewirken oder?

Der erste Interrupt-Aufruf holt sich die Adresse des 8x16 VGA Fonts und der zweite installiert denselben Font dann gleich wieder als User defined Font. Ist zwar unsinnig ich weiß, aber warum funktioniert die C Version nicht? Die installiert nämlich nicht dieselben Zeichen sondern es sieht so aus als ob alle Zeichenmatrizen leer sind.

lg, Markus
markusk
Norton Commander
Beiträge: 132
Registriert: Fr 19. Apr 2013, 11:12

Re: Interrupt-Aufruf in C funktioniert nicht richtig

Beitrag von markusk »

Hallo,

Hat jemand eventuell die Möglichkeit dieses kleine C Programm bei sich unter DOS auszuprobieren? Würd mich interessieren ob es anderswo auch nicht geht. Falls nach dem Starten des Programms am Bildschirm nur Chaos herrscht bin ich mit dem Problem nicht allein, falls sich die Zeichen am Bildschirm nicht verändern passt alles.

Lg, Markus
Benutzeravatar
hofinger
DOS-Guru
Beiträge: 520
Registriert: Sa 22. Nov 2014, 22:56
Wohnort: BA

Re: Interrupt-Aufruf in C funktioniert nicht richtig

Beitrag von hofinger »

Was tut es? Bzw. Was soll es tun?
Der C Code ruft ja anscheinend nur Assembler-Befehle auf.
Hab leider nirgends nen Compiler für DOS drauf, wenn du ein Kompilat hochlädst würd ichs mal testen ;)
Power to the pixel!
markusk
Norton Commander
Beiträge: 132
Registriert: Fr 19. Apr 2013, 11:12

Re: Interrupt-Aufruf in C funktioniert nicht richtig

Beitrag von markusk »

Hallo,

das Programm holt sich zunächst über eine Funktion des Video-Interrupts die Adresse des 8x16 Standard VGA Fonts im ROM. Über eine andere Funktion wird dieser dann als benutzerdefinierter Zeichensatz installiert. Das macht praktisch in dieser Form keinerlei Sinn, es ging mir nur mal darum das in C zu implementieren nachdem ich es in Turbo Pascal und Assembler schon gemacht hatte.

Sinnvoll wäre gewesen, sich über die erste Funktion die Adresse des 8x16 Fonts aus dem ROM zu besorgen, die Zeichenmuster in einen eigenen Puffer umzukopieren, dort die Zeichenmuster nach Wunsch zu ändern und über die zweite Funktion diesen Font dann als neuen Zeichensatz zu aktivieren.

Das hab ich mir der Einfachheit halber jedoch erspart und hab zum Testen der Funktion deswegen gleich den Originalfont genommen. Es dürfte sich bei korrektem Ablauf also an den aktuellen Zeichen nichts verändern weil die Zeichenmuster ja gleich geblieben sind, aber bei mir sieht es so aus als ob die Zeichenmuster von irgendeiner beliebigen Stelle im Speicher kommen und es herrscht Chaos am Bildschirm.

Vom Code her kann ich jedoch keinen Unterschied zum Code in Turbo Pascal oder Assembler erkennen.

Bezüglich Hochladen des Kompilats: Wie mach ich das? Dateianhang .exe usw. ist nicht erlaubt. Hab schon versucht die Datei umzubenennen, aber es wird trotzdem nicht akzeptiert.

lg, Markus
Antworten