Autor Thema: Textausgabe im PMODE??  (Gelesen 9627 mal)

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« am: 04. November 2005, 20:05 »
Hi
Ich befinde mich jetzt im PMODE. Wie kann ich da Texte ausgeben??
Interrupts sind ja ausgeschaltet.

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 04. November 2005, 20:07 »
Der Viedospeicher beginnt im normalen Textmode an 0xB8000, du musst deinen Text dort reinschreiben. Genauer stehts im C Kernel oder C++ Kernel Tutorial.

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #2 am: 04. November 2005, 20:32 »
Ich hab schon einiges Versuch, aber irgendwie komme ich nicht weiter.
!Wenn! NASM meinen code akzeptiert, dann macht bochs nicht mit (restart an der Stelle)

Wie mache ich das in ASM??

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 04. November 2005, 20:47 »
print:
; erwartet den text in esi
; spalte in ebx
; zeile in ecx
; attribut in dx

mul ecx, 80
add ebx, ecx
mul ebx, 2

mov edi, 0xB8000
add edi, ebx

; ich bin mir jetzt nicht ganz sicher, ob das bei nasm "mov byte ..." heißen muss
.char:
mov bx, [esi]
cmp bx, 0
jz .done

mov [edi], bx
inc edi
mov [edi], dx
inc esi
inc edi
jmp .char

.done:
ret

Das ganze ist ungetestet und könnte Fehler enthalten^^;;

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #4 am: 04. November 2005, 20:54 »
Vielen Danke!!

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #5 am: 04. November 2005, 21:47 »
Hab noch nen Problem mit den Grafikmodus:
setscreenservice:
   xor ax, ax   ; ax löschen
   mov ah, 0x00 ; Funktion 00 -> Set video mode and clear screen
   mov al, 0x12 ;  Einstellung
   int 0x10     ; Screen servive aufrufen
   ret

  mov esi, text
   mov ebx, 0
   mov ecx, 0
   mov dx,  0x0E
   call printstr ; GEHLT IM AKTUELLEN GRAFIKMODUS NICHT :(
   
  ; ,,:: WEITERSCHREIBEN ::,, ;
  ; '':: WEITERSCHREIBEN ::'' ;

ENDLESS:
   jmp ENDLESS ; Endlosschleife


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
;; Variablen                               ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

text db "Test",0


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
;; Funktionen                              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;ESI>Test EBX>Spalte ECX>Zeile DX>Attribut
printstr:
   imul ecx, 80     ; 80 Zeichen pro Reihe
   add  ebx, ecx    ; und die Aktuelle spalte dazu
   imul ebx, 2      ; mal 2 wegen dem Attr.-byte

   mov edi, 0xB8000 ; VideoRam
   add edi, ebx     ; Zur gewünschten adresse springen

  .char:
   mov bx, [esi]
   cmp bx, 0        ; Ist das Aktuelle Byte 0?
   jz  .done        ; dann ist jetzt schluss
   
   mov [edi], bx    ; Zeichen ausgeben
   inc edi          ; Weiter im VRAM
   mov [edi], dx    ; Attribut ausgeben
   inc edi          ; Weiter im VRAM
   inc esi          ; Nächste Zeichen
   jmp .char
 
  .done:
   ret


Es wird nichts ausgegeben :(

Mein Ziel:
Ich möchte wehren des Bootvorgangs alle möglichen tätigkeiten ausgeben,
und bei erfolg in grün "[OK]" dahinter schreiben.

Wie mache ich das?? So wie's jetzt ist, gehts offensichtlich nicht :(

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 04. November 2005, 21:51 »
Nein, das geht im Grafikmodus nicht so leicht, ich würde dir empfehlen, erstmal den Textmodus zu benutzen. Im Grafikmodus musst du ja deine Schrift aus einzelnen Pixeln zeichnen.
Du bräuchtest eine Font (z.B. im bmp Format), die du dann in den Videospeicher zeichnest, wobei im Grafikmodus der Videospeicher an einer anderen Stelle ist,  beim normalen Grafikmodus ist das glaubich 0xA8000. IMHO ist es zumindest am Anfang unnötig, den Grafikmodus zu benutzen, da es ja doch schon ziehlich aufwendig ist, im Grafikmodus Text zu zeichnen.

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #7 am: 04. November 2005, 22:16 »
ok, DANKE

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #8 am: 04. November 2005, 22:44 »
Zitat von: RedEagle
Hab noch nen Problem mit den Grafikmodus:
setscreenservice:
   xor ax, ax   ; ax löschen
   mov ah, 0x00 ; Funktion 00 -> Set video mode and clear screen
   mov al, 0x12 ;  Einstellung
   int 0x10     ; Screen servive aufrufen
   ret
Sorry wenn ich jetzt vom Thema abkomme aber der Code sieht so hässlich aus. Wieso löscht du ax vorher wenn du es sowieso neu beschreibst. Und dann nochmal ah auf Null zu setzten ist doch blöd. Also ich würde deinen Code durch diesen ersetzen:

setscreenservice:
mov ax,0x12 ;ah = Null und al = 12h
int 0x10
ret
Dieser Code mag zwar vom aussehen oder Geschwindigkeit nichts verändern (zumindest nicht viel) aber wenn man schon mit Assembler programmiert dann sollte man auch auf einen sauberen und schönen Code achten.
In the Future everyone will need OS-64!!!

Thoth

  • Beiträge: 62
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 05. November 2005, 01:50 »
Ich hätte da noch eine Frage, die sich mir aufgrund von Beobachtungen stellt: In Windows, Linux usw. ist ja die Grafik so wie man sie kennt schnell, sauber und glatt.
Aber wenn ich mir z.B. ReactOS anschaue, dann ist sie langsam und pixelig und ich würde gerne wissen warum.

Verwendet React irgendeinen komischen VESA-Modus während Windows einen eigenen Grafiktreiber hat? Und wenn dem so ist, wie würde man sowas schreiben?

Danke schonmal.
Madness isn't a bug - it's a feature

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 05. November 2005, 10:44 »
Ich kenne den Source von ReactOS nicht, aber Windows ist mit Standarttreibern auch nicht so schnell. Mit Treibern für die Grafikkarte ist Windows natürlich schneller, nur gibt es  keine Spezifikationen für den Aufbau von heutigen Grafikkarten.

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #11 am: 05. November 2005, 10:56 »
Geht immer noch ich :(
  mov ebx, 1
   mov ecx, 1
   mov esi, textausgabe
   call printstr ; GEHLT NICHT :(

   

ENDLESS:
   jmp ENDLESS ; Endlosschleife


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
;; Variablen                               ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; 1. Byte ist das Attribut
textausgabe db 0x8E,"REOS",0,0


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
;; Funktionen                              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;ESI>Test EBX>Spalten ECX>Zeilen
printstr:
   ; Position berechnen
   imul ecx, 80     ; 80 Zeichen pro Reihe
   add  ebx, ecx    ; und die Aktuelle spalte dazu
   imul ebx, 2      ; mal 2 wegen dem Attr.-byte

   ; VRAM initialisieren
   mov edi, 0xB8000 ; VideoRam
   add edi, ebx     ; Zur gewünschten adresse springen
   ; Farbe laden
   mov dl, [esi]    ; 1. Zeichen laden (Farbcode) in dl

   ; ausgabeschleife
  .char:
   ; Auf abbruch prüfen
   inc esi          ; Zum Nächsten Zeichen gehen
   mov bl, [esi]    ; und in bx laden
   cmp bx, 0        ; ist das Byte = 0 ?
   jz  .done        ; Dann ist jetzt schluss

   ; Zeichen ausgeben
   mov [edi], bx    ; Zeichen ausgeben
   inc edi          ; Weiter im VRAM
   mov [edi], dx    ; Attribut ausgeben
   inc edi          ; Weiter im VRAM
   jmp .char

  .done:
   ret


Und zwar ist das, was in ESI steht, nicht das , was ich an die Funktion übergeben -> Farbe, Zeichen, anzahl der Zeichen stimmt nicht mit dem überein, was ich definiert habe :(

Wenn ich ein Konstantes Zeichen, und ein Konstantes Attribut benutze (auf esi verzichte) funktioniert es (hab ne ClearScreen-Funktion gemacht)...

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 05. November 2005, 11:42 »
argh, ich hatte einen Fehler im Code, es muss
mov [esi], bl
bzw.
mov [esi], dl
heißen statt bx und dx.

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #13 am: 05. November 2005, 11:58 »
hä??
Ich will doch von [esi] in dl bzw bl schreiben... (mov bl, [esi])

fals du [edi] meinst: geht auch nicht :( (mov [edi], bl)

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 05. November 2005, 12:04 »
Ja, ich meinte EDI ^^;;

cmp bx, 0 ; in "cmp bl, 0" ändern

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #15 am: 05. November 2005, 12:10 »
Geht leider auch nicht...

Hier mal das, was ausgegeben wird (evtl hilfts ja)
Ein Schwartzes (großes) 'S' auf weißem Hintergrund
und entweder ASCII 219 in weiß, oder ein Leerzeichen mit weißem Hintergrund.
Position ist 1×1 (also so, wie ich es möchte)

Kann es evtl am PMODE liegen (das ich da was Falsch gemacht habe??)

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 05. November 2005, 12:44 »
Kannst du mal deinen gesammten Code irgentwo uploaden, so das ich ihn mal debuggen kann?
Am PM kann das eigentlich nicht liegen.

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #17 am: 05. November 2005, 12:57 »
Uploaden ist schlecht... (hab keinen server)
Wenn du mir ne e-mail adresse gibts, kann ich dir die Daten zuschicken.
(3.8 KB rar-archiv)

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #18 am: 05. November 2005, 14:13 »
Ich habs mal auf meine HP geladen, da die e-mail adresse irgendwie nicht funktionierte:
http://www.redeagle-software.de.vu
Auf der Startseite ist unten rechts eine Fläche mit der Überschrift "Administration". Der letzte "punkt" (in kleiner schrift "REOS-Files")
ist ein link zu dem Archiv.

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #19 am: 09. November 2005, 15:05 »
Ich habe inzwischen den Fehler gefunden.:
  mov ebx, 1
mov ecx, 1
mov esi, msg_REOS
add esi, 0x10000-1 ; So gehts !! (Komisch)
call printstr


Ich weiß nur nich, warum, und wo der Fehler auftritt....

 

Einloggen