Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: RedEagle am 04. November 2005, 20:05

Titel: Textausgabe im PMODE??
Beitrag von: RedEagle am 04. November 2005, 20:05
Hi
Ich befinde mich jetzt im PMODE. Wie kann ich da Texte ausgeben??
Interrupts sind ja ausgeschaltet.
Titel: Textausgabe im PMODE??
Beitrag von: SSJ7Gohan 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.
Titel: Textausgabe im PMODE??
Beitrag von: RedEagle 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??
Titel: Textausgabe im PMODE??
Beitrag von: SSJ7Gohan 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^^;;
Titel: Textausgabe im PMODE??
Beitrag von: RedEagle am 04. November 2005, 20:54
Vielen Danke!!
Titel: Textausgabe im PMODE??
Beitrag von: RedEagle 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 :(
Titel: Textausgabe im PMODE??
Beitrag von: SSJ7Gohan 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.
Titel: Textausgabe im PMODE??
Beitrag von: RedEagle am 04. November 2005, 22:16
ok, DANKE
Titel: Textausgabe im PMODE??
Beitrag von: bitmaster 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.
Titel: Textausgabe im PMODE??
Beitrag von: Thoth 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.
Titel: Textausgabe im PMODE??
Beitrag von: SSJ7Gohan 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.
Titel: Textausgabe im PMODE??
Beitrag von: RedEagle 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)...
Titel: Textausgabe im PMODE??
Beitrag von: SSJ7Gohan 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.
Titel: Textausgabe im PMODE??
Beitrag von: RedEagle 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)
Titel: Textausgabe im PMODE??
Beitrag von: SSJ7Gohan am 05. November 2005, 12:04
Ja, ich meinte EDI ^^;;

cmp bx, 0 ; in "cmp bl, 0" ändern
Titel: Textausgabe im PMODE??
Beitrag von: RedEagle 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??)
Titel: Textausgabe im PMODE??
Beitrag von: SSJ7Gohan 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.
Titel: Textausgabe im PMODE??
Beitrag von: RedEagle 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)
Titel: Textausgabe im PMODE??
Beitrag von: RedEagle 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.
Titel: Textausgabe im PMODE??
Beitrag von: RedEagle 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....
Titel: Textausgabe im PMODE??
Beitrag von: RedEagle am 12. November 2005, 10:32
So ich weiß jetzt auch, wo in etwa der Fehler ist.
Vor dem Wechsel in den PMode ist mit SI noch alle klar; nachher nicht mehr.

ABER WAS IST FALSCH??
ps.: Ich habe den code, so die es in dem PMode-Tutorial steht.
Titel: Textausgabe im PMODE??
Beitrag von: RedEagle am 13. November 2005, 10:47
Ich hab den Kernel nochmal ganz anders und neu gemacht (und in 16Bit und 32Bit aufgeteilt). Das wechseln in den PMode habe ich mit hilfe eines anderen Tutorials gemacht. Das einzigste, was unverendert geblieben ist, ist die A20Gate - sache, und meine printstr.
Es läuft immer noch nicht -> immer noch der gleiche Fehler
Ich habe allerdings in dem Code eines Anderen OS's gesehen, das die bei der GDT extra noch Was für den VRAM gemacht haben. Ist das notwendig??

UND:
Was für ursachen kann den die Fehlfunktion von ESI haben?? Wonach muss ich suchen??
Titel: Textausgabe im PMODE??
Beitrag von: RedEagle am 19. November 2005, 08:39
Auch nach fast 3 Wochen habe ich noch nicht ausgegeben...

Ich habe jetzt eine Funktion geschrieben, die mir HEX-Werte ausgibt, um den Fehler genauer zu "untersuchen"
mir ist aufgefallen, das ESI auf eine Bitfolge zeigt, die in meinem Code überhaupt nicht vorkommt (hab mit HEX-Editor danach gesucht)

Hier mal ein ScreenShot (ich hoffe die mit Paint eingefügten Kommentare sind ausreichend)
(http://www.directupload.net/images/051119/temp/MO8IykU7.gif) (http://www.directupload.net/show/d/521/MO8IykU7.gif)

Ich weiß immer noch nicht, was falsch ist. Ich habe mir schon den Code vom PiratOS; U-OS; ObjectOS und MenuetOS angeguckt, aber da ist es auch nicht viel anders.

Mache ich vieleicht schon beim Kompiliern ein Fehler??
Hier mal eine Kurtzform des Batch-Codes:
echo -- Compile Kernel ----------------------
 cd "d:\nasm\"
 nasmw -f bin -o d:\reos\_boot\boot.bin d:\reos\_boot\boot.asm
 nasmw -f bin -o d:\reos\_kernel\kernel16.bin d:\reos\_kernel\kernel16.asm
 nasmw -f bin -o d:\reos\_kernel\kernel32.bin d:\reos\_kernel\kernel32.asm

echo -- MergeKernel -------------------------
 cd "d:\REOS\"
 MergeKernel d:\reos\_kernel\kernelxx.bin d:\reos\_kernel\kernel16.bin d:\reos\_kernel\kernel32.bin

echo -- Create image-file -------------------
 copy d:\reos\_boot\boot.bin + d:\reos\_kernel\kernelxx.bin d:\reos\reos.img

echo -- Copy image-file to bochs ------------
 copy d:\reos\reos.img d:\reos\testumgebung\reos.img
Titel: Textausgabe im PMODE??
Beitrag von: Jidder am 19. November 2005, 11:27
hi,

esi = 5, 6, 7 bedeutet, dass du auf die IVT zeigst. die zahl 0xFF53F000 könnte sehr gut die adresse F000:FF53 darstellen, und dass sieht aus wie ein zeiger auf einen bios interrupt.

an welche adresse lädst du deinen 32bit kernel und bist du sicher, das du org 0x.... entsprechend gemacht hast?
Titel: Textausgabe im PMODE??
Beitrag von: RedEagle am 20. November 2005, 11:35
Vom bootloader zum 16Bit Kernelteil
; Springe zu diesem Kernel
   mov ax, 0x1000 ; Adresse des Programms
   mov  es, ax   ; Segmentregister updaten
   xor  bx, bx     ; bx auf 0 wegen ES:BX
   ; Jetzt die Anresse des Kernels in den Stack laden
   push ax
   mov ax, 0
   push ax

retf ; und zum kernel springen


Anfang des 16Bit Kernelteils
[Bits 16]
;org 0x1000 ; Geht nicht (bochs startet neu)
jmp start

start:
   mov ax, 0x1000 ; Segmentregister update
   mov ds, ax
   mov es, ax
;...


Ende des 16Bit Kernelteils
   ; Selector
    mov ax, codesel
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    mov ss, ax
    mov esp, 0x1FFFFF ; Stack mit 2 MB

   PM3:
    jmp ende

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Ende                               ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
times 512-($-$$) db 0
ende:


Anfang des 32Bit Kernelteils (der 16Bit - Teil und der 32Bit - Teil sind mit MergeKernel.exe "verbunden"

[Bits 32]
jmp start ; Variablen überspringen

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Variablen                               ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
msg_REOS db 0x0C,'RedEagle Operating System',0

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Start                                   ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

start:


Immer wenn ich irgendwas mit "org" mache restartet bochs (außer "org 0")
Titel: Textausgabe im PMODE??
Beitrag von: Gawag am 23. November 2005, 23:35
Also ich mach das alles ganz ohne org.

Ich hatte dasselbe Problem und habe es so gelöst, dass ich nicht wie im RM:
mov al, [esi]
sondern:
 mov al, [esi+0x10000]
benutze.

0x10000 ist bei mir die Position des Kernels also allgemein:
mov al, [esi+kernel_position]

An deinem Code war also so nichts falsch, nur die Idee fehlte ;) Passiert mir auch dauernd.

So nebenbei: ich mag org sowieso nicht, das fuscht so "blöde" rum. Ich greife lieber ueber die genauen Adressen auf den RAM zu. Also so dass 0x10000 auch 0x10000 ist und nicht irgendwie 0x20000 oder so. Da ist mir die Fehleranfälligkeit zu hoch ;) (also zumindest wenn die orgs so funktionieren wie ich das verstanden habe).

Klappts mit meiner Methode?
Titel: Textausgabe im PMODE??
Beitrag von: RedEagle am 26. November 2005, 10:19
DANKE ES LÄUFT :!: :!:
Titel: Textausgabe im PMODE??
Beitrag von: Gawag am 26. November 2005, 11:10
Juhu!  :D

Ich dacht schon es käme gar keine Antwort mehr.  :D
Titel: Textausgabe im PMODE??
Beitrag von: RedEagle am 26. November 2005, 22:52
sorry, hatte unter der Woche keine Zeit, nachzusehen, ob jemand geantwortet hat :)