Autor Thema: Videospeicher in RM löschen  (Gelesen 8777 mal)

Stephan

  • Beiträge: 15
    • Profil anzeigen
Gespeichert
« am: 15. December 2005, 19:41 »
Hallo,

Habe leider nix gefunden. Ich arbeite der Zeit im Real-Mode und möchte gerne den Videospeicher komplett löschen und den Courser zurücksetzten.

Wie mache ich das?

Das möchte ich daher machen, mein Bootloader ist fertig, der Kernel wird aufgerufen und es wird ausgegeben:

"Welcome to OS.."

nun möchte ich gerne, bevor dies erscheint den Videospeicher löschen, sodass dieser Text ganz oben erscheint.

Danke :)

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 15. December 2005, 19:50 »
Am einfachsten machst du das mit folgendem Interrupt:
mov ax,3 ;Bildschirm löschen
int 0x10  


Gruss Nooooooooos

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #2 am: 15. December 2005, 20:04 »
Zitat von: nooooooooos
Am einfachsten machst du das mit folgendem Interrupt:
mov ax,3 ;Bildschirm löschen
int 0x10  


Gruss Nooooooooos
Bei manchen PCs wird der Cursor und der Text dadurch aber nicht verändert (bei mir nur bei einem aber trotzdem). Ich würde es so machen:

pusha
push es
mov ax,0B800h
mov es,ax
xor di,di
mov ax,0700h ;schwarz-grau
mov cx,80*25
rep stosw
mov ah,0Fh ;lese Bildschirmseite
int 10h ;und schreibe sie nach bh
mov ah,02h ;setzte Cursor
xor dx,dx ; X=0 , Y=0
int 10h
pop es
popa


Das löscht alle Zeichen im Video-RAM und setzt den Cursor nach Oben-Links. Müsste funktionieren.

bitmaster
In the Future everyone will need OS-64!!!

Stephan

  • Beiträge: 15
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 15. December 2005, 20:17 »
dann erhalte ich aber

prefetch: RIP > CS.limit

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #4 am: 15. December 2005, 20:27 »
Zitat von: Stephan
dann erhalte ich aber

prefetch: RIP > CS.limit
Hä? Ich dachte du arbeitest im Real-Mode? Im Protected-Mode kannst du keine BIOS-Interrupts benutzen und auch die Segmentregister nicht mit direkten Adressen laden. Das musst du dann über Deskriptore machen.
In the Future everyone will need OS-64!!!

Stephan

  • Beiträge: 15
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 15. December 2005, 20:33 »
also bin ich im PMode?

Wie würde ich dass den da machen? Also den Videospeicher löschen?

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #6 am: 15. December 2005, 20:36 »
Zitat von: Stephan
also bin ich im PMode?

Wie würde ich dass den da machen? Also den Videospeicher löschen?
Hä??? Du weist nicht ob du im PM oder RM bist? Wer hat denn für dich den Bootloader und Kernel geschrieben? Wenn du nicht mal das weist, dann wirst du auch nicht weiter kommen.
In the Future everyone will need OS-64!!!

Stephan

  • Beiträge: 15
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 15. December 2005, 20:49 »
eigentlich hab ich den von hier.

Bin das grad erst am lernen, habe es eigentlich auch soweit verstanden.
Nur das is jetzt doch nicht im RM bin wundert mich.

org 0x7C00 ; Unsere Startadresse

; -----------------------------------------
; Unser Bootloader
; -----------------------------------------

start:
; Erst brauchen wir einen Stack.
cli             ; Keine Interrupts!
mov ax, 0x9000   ; Stackadresse
mov ss, ax     ; SS = 9000 (unser Stack)
mov sp, 0       ; SP = 0000  (der Stackpointer)
sti             ; Interrupts zulassen
mov [bootdrv], dl ; Bootlaufwerk aus DL speichern

call empty
call load ;Lade unseren Kernel

mov ax, 0x1000 ; Die Adresse des Programms
mov es, ax     ; Segmentregister updaten
mov ds, ax
push ax
mov ax, 0
push ax
retf

; ----------------------------------------------
; Funktionen und Variablen
; ----------------------------------------------

bootdrv db 0 ;Das Bootlaufwerk
loadmsg db 13,10,"Betriebssystem wird geladen...",13,10,13,10,0 ;db=definebyte; 13,10=Zeilenumbruch; 0=Ende;
; Einen String ausgeben
putstr:
lodsb             ; Byte laden
or al,al
jz short putstrd ; 0-Byte? -> Ende!
mov ah,0x0E       ; Funktion 0x0E
mov bx,0x0007     ; Atrribut-Byte
int 0x10         ; schreiben
jmp putstr       ; nächstes Byte

putstrd:
retn
; Lade den Kernel vom Bootlaufwerk
load:
; Diskdrive reset (Interrupt 13h, 0)
push ds             ; Sichere DS
mov ax, 0           ; Die gewünschte Funktion (reset)
mov dl, [bootdrv]   ; Dieses Laufwerk ist gewünscht
int 13h             ; Den Interrupt ausführen
pop ds             ; DS wiederherstellen
jc load           ; Geht nicht? -> Noch mal!

load1:
mov ax,0x1000       ; ES:BX = 10000
mov es,ax
mov bx, 0
; Sektoren lesen (Interrupt 13h, 2)
mov ah, 2       ; Funktion 2 (Lesen)
mov al, 5       ; Lese 5 Sektoren
mov cx, 2       ; Cylinder=0, Sector=2
mov dx, 0       ; Head=0, Laufwerk=0
int 13h         ; ES:BX =  Daten vom Laufwerk
jc load1       ; Fehler? Noch mal!
mov si,loadmsg
call putstr     ; Meldung ausgeben
retn

empty:
mov ax,3                       ;Bildschirm löschen
    int 0x10  



times 512-($-$$)-2 db 0   ; Dateilänge: 512 Bytes
dw 0AA55h                 ; Bootsignatur


das is der Bootloader

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #8 am: 15. December 2005, 21:04 »
Also das ist der RM. Du hast aber unter dem mov ax,3 int 10h das ret vergessen. Wie gesagt würde ich lieber meinen Code nehmen da er bei allen PCs funktioniert.
In the Future everyone will need OS-64!!!

Stephan

  • Beiträge: 15
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 15. December 2005, 21:14 »
es kommt bei beiden Methoden der fehler

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #10 am: 15. December 2005, 21:16 »
Das kommt davon, dass ich dir meinen Code gegeben habe.
Ich habs dir gesagt, es bringt nix.
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,...

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #11 am: 15. December 2005, 21:17 »
Zitat von: Stephan
es kommt bei beiden Methoden der fehler
Dann liegt es am Kernel. Ich habe es mit Bochs ausprobiert und es hat funktioniert (der Bootloader mit dem ret hinter int 10h).
In the Future everyone will need OS-64!!!

Stephan

  • Beiträge: 15
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 15. December 2005, 21:26 »
Zitat von: joachim_neu
Das kommt davon, dass ich dir meinen Code gegeben habe.
Ich habs dir gesagt, es bringt nix.


jetzt nix gegen dich, aber was soll das?
Du hast mir deinen Code gegeben damit ich es verstehe. Habe ich nur eine Zeile kopiert?
Wenn ja zeig welche!! Also ;)


@bitmaster

hast du vllt. ICQ, MSN etc. könnten wir uns 5 mins unterhalten?

Danke :)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #13 am: 15. December 2005, 21:36 »
Zitat von: Stephan
Zitat von: joachim_neu
Das kommt davon, dass ich dir meinen Code gegeben habe.
Ich habs dir gesagt, es bringt nix.


jetzt nix gegen dich, aber was soll das?
Du hast mir deinen Code gegeben damit ich es verstehe. Habe ich nur eine Zeile kopiert?
Wenn ja zeig welche!! Also ;)


@bitmaster

hast du vllt. ICQ, MSN etc. könnten wir uns 5 mins unterhalten?

Danke :)
Ja ich habe MSN.
In the Future everyone will need OS-64!!!

Stephan

  • Beiträge: 15
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 15. December 2005, 21:44 »
Hallo,


Danke für die Antworten. Habs nun, klappt wunderbar!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #15 am: 15. December 2005, 21:45 »
Zitat von: Stephan
Hallo,


Danke für die Antworten. Habs nun, klappt wunderbar!!
Was war denn der Fehler?
In the Future everyone will need OS-64!!!

Stephan

  • Beiträge: 15
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 15. December 2005, 22:25 »
naja wie soll ich es sagen *g*

Blödheit von mir

einmal habe ich ret vergessen wie du sagtest und da ich es abgetippt hatte, hatte ich statt : ein ; nach empty stehen :-/

Eure Code-Teile stimmten ;)

 

Einloggen