Wie am besten in die Konsole Zeichen ausgeben?

Für Fragen von Einsteigern und Programmieranfängern...
Mathias
Beiträge: 6208
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Mathias »

Wenn man mit TP einen Grafikmodus aktiviert kann mit Write/WriteLn kein Text mehr ausgegeben werden, außer man setzt wieder DirectVideo vor der InitGraph Prozedur auf False. Ich kann es nicht testen weil ich kein FPC für DOS installiert hab. Es muss aber ein Modus sein, bei dem das BIOS die Zeichenausgabe noch unterstützt (z.B. 640x480x16), dann wüste man genau ob DirectVideo noch etwas bewirkt oder nicht.

Folgendes Test-Programm.

Code: Alles auswählen

program test;
uses
  Crt;
begin
  asm
    mov ax, $13
    int $10
  end;
  DirectVideo:=true;
  Writeln('Hello World');
  Readln;
end.

Turbo-Pascal:
Bei DirectVideo kommt kein "Hello World", ohne DirectVideo erscheint es.
Bei Readln, ist in beiden Moden der Text sichtbar, ausser man drückt direkt <enter>

FPC mit Cross8086:
Kommt in allen Varianten kein Text mehr.

Die ist auf einer extra Diskette. Die nennt sich 'Borland Pascal with Objects 7.0'.

Weist du zufällig noch die Disk-Nummer ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Nixsager »

Wie gesagt, es ist eine extra Diskette. Die gehört nicht zu den normalen Installationsdisketten.
Google mal nach der Bezeichnung die ich geschrieben habe. Da wird schnell was interessantes zu sehen sein.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Mathias
Beiträge: 6208
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Mathias »

Wie gesagt, es ist eine extra Diskette. Die gehört nicht zu den normalen Installationsdisketten.

Habe es gefunden, es ist die 12 Diskette.
Assembler pur. :shock:

Da hat man das seit Jahren und man hat es nicht mal gewusst. :oops:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Nixsager »

Die Installationsdisketten sind doch nur 10. Welche hast du noch?
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Mathias
Beiträge: 6208
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Mathias »

Code: Alles auswählen

./DISK1:
BGIDEMO.ZIP  BPC.ZIP  BPWHLP.CA4  BP.ZIP  BREAKOUT.ZIP  COMMDLGS.ZIP  DATEILST.DOC  DDEML.ZIP  DISK1.DSK  FILELIST.DOC  INSTALL.EXE  MCISOUND.ZIP  README  README.COM  TD.ZIP  UNZIP.EXE  WINTPH.CA2
 
./DISK10:
DISK10.DSK  RWLIB.ZIP  TASM.ZIP  TDVIDEO.ZIP  TPC.ZIP  TPROFW.ZIP  TURBO.ZIP  UNITS.ZIP  UTILDEMO.ZIP  WINSIGHT.ZIP
 
./DISK11:
DISK11.DSK  DOCDEMO.ZIP  OWLDEMOS.ZIP  RWED.ZIP  RWUTILS.ZIP  TDUTILS.ZIP  TFDEMOS.ZIP  TFDOC.ZIP  TOOLBAR.ZIP  TRUETYPE.ZIP  TURBO3.ZIP  TVDEMO.ZIP  TVFM.ZIP  UTILS.ZIP  WDOCDEMO.ZIP  WHEREIS.ZIP  WIN31.ZIP
 
./DISK12:
RTLCOM.ZIP  RTLCRT.ZIP  RTLDOS.ZIP  RTLINC.ZIP  RTLLIB.ZIP  RTLOVR.ZIP  RTLOWL.ZIP  RTLPRT.ZIP  RTLSTR.ZIP  RTLSYS.ZIP  RTLTV.ZIP  RTLW31.ZIP  RTLWIN.ZIP  RTL.ZIP
 
./DISK2:
BPWHLP.CA3  DISK2.DSK
 
./DISK3:
BPWHLP.CA2  DISK3.DSK
 
./DISK4:
BPWHLP.CA1  DISK4.DSK
 
./DISK5:
DISK5.DSK  WINTPH.CA1
 
./DISK6:
BGIBIN.ZIP  BGI.ZIP  BWCC.ZIP  CALC.ZIP  CHESS.ZIP  DDOCDEMO.ZIP  DISK6.DSK  DOC.ZIP  DOSDEMOS.ZIP  DPMISYS.ZIP  GREPDLL.ZIP  GREP.ZIP  GROUPS.ZIP  HEAPSPY.ZIP  HELPEX.ZIP  OLE.ZIP  QUEUE.ZIP  WINHELP.ZIP  WINUTILS.ZIP  WTPL.ZIP
 
./DISK7:
DISK7.DSK  HEAP.ZIP  OWL.ZIP  PAINT.ZIP  PENWIN.ZIP  PTPL.ZIP  PXWIN.ZIP  SHELLDEM.ZIP  TADOC.ZIP  TURBOHLP.ZIP  TVHLP.ZIP  WIN31DLL.ZIP
 
./DISK8:
DISK8.DSK  OWLTPH.ZIP  RTPL.ZIP  RWDEMOS.ZIP  RWDOC.ZIP  RW.ZIP  SWAT.ZIP  TASMEXMP.ZIP  TPROF.ZIP  TVISION.ZIP  WINSPECT.ZIP
 
./DISK9:
BPW.ZIP  DISK9.DSK  TDDEBUG.ZIP  TDDEMOS.ZIP  TDDOC.ZIP  TDW.ZIP  TDX.ZIP  TVDEBUG.ZIP  WINDEMOS.ZIP
 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Jole »

Nixsager hat geschrieben:Also in der im Init-Contructor funktioniert die Tastenabfrage, nur nicht wenn ich irgendwo die MessageBox aufrufe.

Wenn ich dich richtig versteh, dann hast du den Konstruktor mehrfach aufgerufen? Das geht nicht, für einen Mehrfachaufruf ist mein Beispiel nicht gedacht! Ich wollte dir eigentlich nur zeigen das es leider nicht so einfach möglich ist die MsgBox und Co. von TV zu verwenden. Der MsgBox-Aufruf gehört sowieso nicht in den Konstruktor, dass hab ich jetzt nur so gemacht das der Code nicht so lang wird.

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Nixsager »

Du meinst den TApp-Init-Contructor?
Nein, der Muss ja nur einmal aufgerufen werden.

Der Fehler ist gefunden.
Es lag ein meiner Unit zur Tastaturabfrage, diese Unit benutzt eine andere Unit für den Interrupt, und die Unit fängt den Interrupt ab, so das TV nicht mehr auf die Tasteneingabe reagiert.

Jetzt wieder zum eigentlichen Thema.
Also das man 'Write' vergessen kann ist jetzt klar. Beim schreiben in den Video-RAM sollte man vorher sicher gehen wo der liegt, falls der verschoben wurde.
Ich benutzte im Moment ja den Interrupt 10 aber der ist bei mir noch langsamer als Write.

Hier ist der Code für die Ausgabe einer Zeichenkette:

Code: Alles auswählen

 
Procedure StringColorPaint(Value: String; Page, X, Y: UInt8; ColorForeground, ColorBackground: UInt8);
var
   ColorTemp: UInt8;
   CharTemp: UInt8;
   Index: UInt8;
   XTemp: UInt8;
begin
   (*ColorTemp := ((ColorBackground shl 4) + ColorForeground);*)
   ColorTemp := ((ColorBackground * 16) + ColorForeground);
   For Index := 1 to Length(Value) do
      begin
         CharTemp := Ord(Value[Index]);
         XTemp:= X+Index-1;
         asm
            MOV AH, 02h
            MOV BH, Page
            MOV DL, XTemp
            MOV DH, Y
            INT 10h
            MOV AH, 09h
            MOV BH, Page
            MOV CX, 1
            MOV AL, CharTemp
            MOV BL, ColorTemp
            INT 10h
         end;
      end;
end;
 

Ich weiß, das es einen Interrupt für die Ausgabe einer Zeichenkette existiert. Aber wir der zu nutzen ist, werde ich noch raus finden.
Auch die For-Schleife verlängert die ganze Ausführung.

Hier der Code für die Ausgabe eines einzeln Zeichens:

Code: Alles auswählen

 
Procedure CharColorPaint(Value: Char; Count: UInt16; Page, X, Y: UInt8; ColorForeground, ColorBackground: UInt8);
var
   ColorTemp: UInt8;
   CharTemp: UInt8;
begin
   CharTemp := Ord(Value);
   ColorTemp := ((ColorBackground * 16) + ColorForeground);
   asm
      MOV   AH, 2h
      MOV   BH, Page
      MOV   DL, X
      MOV   DH, Y
      INT 10H
      MOV   AH, 9
      MOV   BH, Page
      MOV   CX, Count
      MOV   AL, CharTemp
      MOV   BL, ColorTemp
      INT 10H
   end;
end;
 

Wenn ich nur ein Zeichen ausgebe, ist die Write-Methode am langsamsten die Video-RAM-Methode am schnellsten, und die Interrupt-Methode.

Ich muss mal schauen, ob ich die Interrupt-Methode verbessern kann.

Aber wie gibt TV, FV oder der Dos Navigator die Zeichen aus?
Denn dort kann man ein Fenster öffnen schließen und verschieben oder das das Bild zerstört wird. Das ist ja auch klar, sonst wäre es ja nicht sauber gelöst.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Jole »

Nixsager hat geschrieben:Also das man 'Write' vergessen kann ist jetzt klar. Beim schreiben in den Video-RAM sollte man vorher sicher gehen wo der liegt, falls der verschoben wurde.

Ich hab das Videosegment immer über den aktuellen Modus ermittelt, z.B so:

Code: Alles auswählen

 
function GetVideoSeg: Word;
var Segment: Word;
begin
  case Mem[SEG0040:$49] of
    2, 3: Segment:= SEGB800;
        7: Segment:= SEGB00;
    else Segment:= 0;
  end;
  GetVideoSeg:= Segment;
end;
 

Hier wird aber nur Textmodus mit Auflösung 80x25 berücksichtigt.
Nixsager hat geschrieben:Aber wie gibt TV, FV oder der Dos Navigator die Zeichen aus?
Denn dort kann man ein Fenster öffnen schließen und verschieben oder das das Bild zerstört wird. Das ist ja auch klar, sonst wäre es ja nicht sauber gelöst.

Die schreiben garantiert direkt in den Bildschirmspeicher. Wenn es nur um eine Box geht würde ich den Bildschirm sichern, die Box zeichnen und nach beenden den Bildschirm wieder herstellen. Da du ja aber mehrere Boxen/Fenster hin und her schieben können willst wird das nicht ganz so einfach.

Mathias
Beiträge: 6208
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Mathias »

Ich hab das Videosegment immer über den aktuellen Modus ermittelt, z.B so:

Ich habe es mit int10h und al 0Fh.
Das sah dann so aus:

Code: Alles auswählen

  asm                                   { Ermittelt Grafikkarte }
        mov     ah, 0Fh
        int     10h
        cmp     al, 7                  { ist Monocromer - Modus }
        je      @Mono
        mov     Monocrom, 0
        mov     ax, SegB800
        mov     VioSeg, ax
        jmp     @L1
@Mono:  mov     Monocrom, 1
        mov     ax, SegB000
        mov     VioSeg, ax
@L1:...


Ich hatte sogar ein OutTextXY voll in Assembler gemacht.

Code: Alles auswählen

procedure OutTextXY(x, y : Word; s : String);
asm
        mov     bl, textattr    { Attribut in BL sichern }
        push    ds              { Datensegment auf Stack sichern }
        mov     ax, y           { AX = y }
        mul     maxX            { AX = AX * maxX }
        add     ax, x           { AX = AX + x }
        mov     di, ax          { Offset = AX }
        shl     di, 1           { Offset verdoppeln }
        mov     es, VioSeg      { Segment = VioSeg }
        lds     si, s
        xor     ch, ch
        mov     cl, ds:[si]
        cmp     cl, 0           { if Str[0] = 0 then }
        je      @Ende           { Goto @Ende         }
        inc     si
        mov     ah, bl          { Attribut in ah laden }
@L:     lodsb                   { N„chstes zeichen in al laden }
        stosw                   { AX in Vio-Ram schreiben }
        loop    @L
@Ende:  pop     ds              { Datensegment von Stack holen }
end;


Das waren schon noch Zeiten, wo man alle aus der Kiste raus holte. Da könnte M$ noch einiges abgucken mit seinem aufgeblähten Windows. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Nixsager »

Also deinen zweiten Code kapiere ich nicht so ganz.

Aber mein neuer zur Textausgabe scheint murks zu sein.

Code: Alles auswählen

 
Procedure SCP(Const Value: String; Page, X, Y: UInt8; ForegroundColor, BackgroundColor: UInt8);
var
   ColorTemp: UInt8;
   LengTemp: UInt16;
   SegTemp: UInt16;
   OffTemp: UInt16;
begin
   ColorTemp := ((BackgroundColor * 16) + ForegroundColor);
   SegTemp := Seg(Value);
   OffTemp := Ofs(Value)+1;
   LengTemp := Length(Value);
 
      asm
         MOV AH, 13h
         MOV AL, 00h
         MOV BH, Page
         MOV BL, 123
         MOV CX, LengTemp
         MOV DL, X
         MOV DH, Y
         MOV ES, SegTemp
         MOV BP, OffTemp
         INT 10h
      end;
end;
 
 
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Mathias
Beiträge: 6208
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Mathias »

Also deinen zweiten Code kapiere ich nicht so ganz.

Einfach gesagt, der String wird direkt ins VRAM geschrieben.
VideoSeg ist entweder $B800 oder $B000.
Und TextAttr ist ein Byte, so wie es in der Unit Crt auch ist.

Aber mein neuer zur Textausgabe scheint murks zu sein.

Wieso Murks, du hast einfach eine Stringausgabe über int 10h gemacht.


So nebenbei war die Unit Crt, welche bei TP und BP dabei war fehlerhaft. Wen die CPU zu schnell ist, stürzte diese leider mit einem Laufzeit-Fehler ab.
Mit meinen Routinen konnte ich voll auf die Unit Crt verzichten, auch ReadKey und KeyPressed habe ich selbst gemacht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Nixsager »

Mathias hat geschrieben:So nebenbei war die Unit Crt, welche bei TP und BP dabei war fehlerhaft. Wen die CPU zu schnell ist, stürzte diese leider mit einem Laufzeit-Fehler ab.
Mit meinen Routinen konnte ich voll auf die Unit Crt verzichten, auch ReadKey und KeyPressed habe ich selbst gemacht.

ROFL
Das ist doch ein alter Hut, genauso wie die EXE-Datei ist so groß. :lol:

Mathias hat geschrieben:Wieso Murks, du hast einfach eine Stringausgabe über int 10h gemacht.

Das Programm hängt sich auf.
Gerade wurde sogar TP beendet und war wieder in der Kommandozeil.

Nachtrag:
Habe es mit folgendem Code getestet:

Code: Alles auswählen

 
program Project1;
uses
   Crt;
 
Procedure TextOutCrt(X, Y: Integer; S: String);
var
   I: Integer;
begin
   GotoXY(X + 1, Y + 1);
   TextAttr := $65;
   Write(S);
end;
 
Procedure TextOutVRAM(X, Y: integer; S: String);
var
   I, OffSet: Integer;
begin
   OffSet := X * 2 + Y * 160;
   for I:=0 to Byte(S[0]) -1 do
      begin
         MemW[$B800:OffSet + I * 2]:=Byte(S[I + 1]) + $56 SHL 8;
      end;
end;
 
Procedure IntTest(Const Value: String; Page, X, Y: Byte; ForegroundColor, BackgroundColor: Byte);
var
   ColorTemp: Byte;
   LengTemp: Integer;
   SegTemp: Integer;
   OffTemp: Integer;
begin
   ColorTemp := ((BackgroundColor shl 4) + ForegroundColor);
   SegTemp := Seg(Value);
   OffTemp := Ofs(Value)+1;
   LengTemp := Length(Value);
 
   asm
      MOV AH, 13h
      MOV AL, 01h
      MOV BH, Page
      MOV BL, ColorTemp
      MOV CX, LengTemp
      MOV DL, X
      MOV DH, Y
      MOV ES, SegTemp
      MOV BP, OffTemp
      INT 10h
   end;
end;
 
var
   Index: LongInt;
 
begin
   ClrScr;
   TextAttr := 15;
 
   For Index := 0 to 25000 do
      begin
         TextOutCrt(33, 11, 'Hallo Welt!');
      end;
 
   For Index := 0 to 25000 do
      begin
         TextOutVRAM(34, 12, 'Hallo Welt!');
      end;
 
   INTTEST('Hallo Welt!', 0, 10, 4, 2, 3);
 
   Repeat
   Until KeyPressed
end.
 

Und das Programm hängt sich auf.

Der folgende Code funktioniert:

Code: Alles auswählen

 
program Test;
uses
   Crt, Dos;
 
var
   ColorTemp: Byte;
   LengTemp: Integer;
   Index: Byte;
   SegTemp: Integer;
   OffTemp: Integer;
   Value: String;
   Page: Byte;
   X, Y: Byte;
 
begin
   Value := 'Hallo';
   Page := 0;
   ColorTemp := 123;
   SegTemp := Seg(Value);
   OffTemp := Ofs(Value)+1;
   LengTemp := Length(Value);
   X := 0;
   Y := 0;
 
   ClrScr;
 
   for index := 0 to 255 do
   begin
      x:=Index;
      asm
         MOV AH, 13h
         MOV AL, 00h
         MOV BH, Page
         MOV BL, ColorTemp
         MOV CX, LengTemp
         MOV DL, X
         MOV DH, Y
         MOV ES, SegTemp
         MOV BP, OffTemp
         INT 10h
      end;
   end;
end.
 

Was mir aufgefallen ist, wenn der Text über die maximal beschreibbare Spalte geht als 'X = 255' wird der Text am Anfang fortgesetzt.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Mathias
Beiträge: 6208
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Mathias »

Und das Programm hängt sich auf.

So läuft es ohne Fehler bei mir.
BP auf den Stack, und wen dieser auf einmal am einem anderem Ort ist, hängt sich das Programm logischer weise auf.
Dieser Fehler wird noch gern gemacht.

Code: Alles auswählen

   asm
      MOV AH, 13h
      MOV AL, 01h
      MOV BH, Page
      MOV BL, ColorTemp
      MOV CX, LengTemp
      MOV DL, X
      MOV DH, Y
      MOV ES, SegTemp
push bp
      MOV BP, OffTemp
      INT 10h
pop bp
   end;


Der folgende Code funktioniert:

Dürfte eigentlich nicht, vielleicht geht es aber, weil der Fehler am Programm-Ende ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Jole »

@Nixsager: Hier mal deine Int-Funktion 13h Testprozedur komplett als Assembler, da bist du mal dasVariablengewurschtle los :)

Code: Alles auswählen

 
  Procedure SCP(const Value: String; Page, X, Y: UInt8; ForegroundColor, BackgroundColor: UInt8);Assembler;
    Asm
      PUSH BP
      MOV  AX, 1301h
      MOV  BH, Page
      MOV  BL, BackgroundColor
      SHL  BL, 4
      OR   BL, ForegroundColor
      MOV  DL, X
      MOV  DH, Y
      LES  BP, Value
      XOR  CX, CX
      MOV  CL, ES:[BP]
      INC  BP
      INT  10h
      POP  BP
    End;
 

Mathias
Beiträge: 6208
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Mathias »

Sieht einiges aufgeräumter aus, ohne den Variablen-Salat.
Was ich noch machen würde, wären es die beiden Variablen ForegroundColor, BackgroundColor, zur einer zusammen zufassen.
Oder noch besser, so wie es die Unit Crt mit TextAttr macht, global deklarieren.

Einen Vorteil hat die int 10h Ausgabe gegenüber von direkten VRAM-Zugriffen, diese funktionieren auch in Grafik-Moden.

So nebenbei, wäre ich dazumal froh um diese Seite gewesen, dort sind alle int 10h-Funktionrn beschrieben.
https://de.wikibooks.org/wiki/Interrupts_80x86/_INT_10
Ich hatte nur einen Bruchteil von diesen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten