Autor Thema: Cursor bewegen  (Gelesen 6731 mal)

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« am: 25. January 2005, 16:05 »
Wie kann ich ohne BIOS-Interrupts im Textmodus die Cursorposition ändern?

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #1 am: 25. January 2005, 17:08 »
PM/RM?
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 25. January 2005, 17:42 »
kommt das darauf an? Im PM.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 25. January 2005, 17:58 »
Mal ne Frage: Geht das ueberhaupt?
Ich wuerde denken, es ginge einfacher, wenn man die Cursorposition selbst abspeichert und abruft... weiss ja nicht, wie Linux das tut...

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 25. January 2005, 18:00 »
Ja, aber ich meine den sichtbaren Cursor. Bei Bochs ist der jedenfalls vorhanden (auch im PM), wie es bei einem richtigen PC ist, weiss ich nicht.

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 25. January 2005, 18:26 »
Ist zwar angeblich für Monochrom, ich versuchs trotzdem...

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 25. January 2005, 18:58 »
B und D sind doch so ähnlich :D

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 25. January 2005, 19:07 »
Unter Bochs wird das nicht unterstützt.

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 25. January 2005, 19:14 »
Vielleicht kann ich den C-Code nicht in ASM übersetzen:

DI ist hier der schon gesetzte Offset (Cursorposition).


  MOV DX, 03D4h
  MOV AX, 14
  OUT DX, AX
  INC DX
  PUSH DI
  SHR DI, 8
  MOV AX, DI
  OUT DX, AX
  DEC DX
  MOV AX, 15
  OUT DX, AX
  INC DX
  POP AX
  OUT DX, AX

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 25. January 2005, 19:23 »
Der Code


  MOV DX, 03D4h
  MOV AL, 14
  OUT DX, AL
  INC DX
  PUSH DI
  SHR DI, 8
  MOV AX, DI
  OUT DX, AL
  DEC DX
  MOV AL, 15
  OUT DX, AL
  INC DX
  POP AX
  OUT DX, AL


gibt unter Bochs keine Fehlermeldung mehr, nur ist der Cursor nicht zu sehen...

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 25. January 2005, 20:11 »
Hab ich geändert, man sieht immer noch keinen Cursor.

B.G.

  • Beiträge: 27
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 25. January 2005, 22:03 »

unsigned char in(unsigned short _port)
{
  // "=a" (result) means: put AL register in variable result when finished
  // "d" (_port) means: load EDX with _port
  unsigned char result;
  __asm__  ("in %%dx, %%al" : "=a" (result) : "d" (_port));
  return result;
}

void out(unsigned short _port, unsigned char _data)
{
  // "a" (_data) means: load EAX with _data
  // "d" (_port) means: load EDX with _port
  __asm__ ("out %%al, %%dx" : :"a" (_data), "d" (_port));
}


Die benötigten Funktionen...

N' paar Beispiele

  // Setze Cursor-Position auf 0,0
  out(0x3D4, 14);
  out(0x3D5, 0);
  out(0x3D4, 15);
  out(0x3D5, 0);



  unsigned short offset;
  unsigned char *vidmem = (unsigned char *)0xB8000;

  // Lese Cursor Position
  out(0x3D4, 14);
  offset = in(0x3D5) << 8;
  out(0x3D4, 15);
  offset |= in(0x3D5);

  vidmem += offset*2;


Jetzt kannst du auf vidmem schön zugreifen ...


  // Setze Cursor zur 'line' Zeile
  out(0x3D4, 14);
  out(0x3D5, 0);
  out(0x3D4, 15);
  out(0x3D5, line*80);
[/code]

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 26. January 2005, 11:15 »
Zitat von: blueXseven

welches benutzt du?
das "VGABIOS-lgpl-latest" oder das "VGABIOS-elpin-2.40"?


Ich habe VGABIOS-elpin-2.40 drin, mit dem andern funktionierts auch nicht, ich debugge mal...

edited: Bis zur letzen Ausgabe vor einer Endlos(warte)schleife geht's, vielleicht braucht die Grafikkarte (unter Bochs) zuerst ein paar neue Zeichen zu schreiben, bis sie auch die Cursorposition aktualisiert...

edited: Wenn die VGA-Register 8 bit gross sind, kann der Cursor ja nicht mal alle 80x25 Zeichen abdecken?! Gut, bei mir geht's schon bei Position 0F0h nicht mehr, das würde ja (zumindest in ein unsigned) byte passen.

edited: Sorry, dazu dient ja die SHR, sodass doch alle 16 bit rüberkommen :)

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 31. January 2005, 14:53 »
Ähm...und wie schreibt man dann an die Position wo der Cursor ist im PMode?
denn:

mov edi, 0x000B8000
mov Byte [edi  ], 'P'

schreibt doch nur an den Anfang des VideoMemorys aber nicht an die Cursor Position...

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #14 am: 01. February 2005, 01:17 »
wie waers mit einem offset von edi weg? (kA ob das geht, hab im pm noch nichts verloren - is nur ein vorschlag =) ).
\\o
o//
\o/

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 05. February 2005, 16:28 »
Zitat von: blueXseven

oder verwendest du einen anderen modus?
Nein.
Zitat
bist du sicher das der wert in DI stimmt?
Absolut.

Ich habe inzwischen mehr Textausgabe eingefügt und es funktioniert wieder abgesehen vom letzten Mal Textausgeben einwandfrei :(, sowohl bei Bochs als auch auf einem echten PC.

 

Einloggen