Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Themen - TPSeverino

Seiten: [1]
1
Lowlevel-Coding / Bootloader teilen
« am: 01. March 2005, 20:52 »
Da mir die 512 Bytes für den Bootloader nicht ausreichen bevor ich in den PMode schalte, will ich meinen Bootloader teilen. Der erste Teil lädt (unter anderem :-) ) den Code des zweiten Teils des Bootloaders in den Speicher und führt in aus. Im zweiten Teil soll der PMode aktiviert werden. Nun funktioniert der Code, welcher vor dem Teilen funktioniert hat, nicht mehr.
Ich denke es liegt daran dass die Adresse der GDT nicht mehr stimmt...
Hier der Code des zweiten Teils meines Bootloaders, welcher in den PMode schalten soll. Er liegt an 1000h:0000h im Speicher.


cli                      
call _enable_a20

xor ax ,ax
mov ax, ds

gdt [gdt_descriptor]

mov eax, cr0
or eax, 1
mov cr0, eax

jmp gdt_code:_init

[bits 32]

_init:

mov ax, 10h
mov ds, ax
mov es, ax
mov ss, ax
mov esp, 090000h

jmp $

; Es folgen Funktionen und Variablen


THX
2
Lowlevel-Coding / VESA-Problem mit Bochs
« am: 27. February 2005, 10:03 »
Hi,
mein Problem ist, dass Bochs nicht in die VESA-Modi mit mehr als 256 Farben schaltet. Beim Booten funktionierts aber Bochs verweilt ohne Aktion und auch ohne Fehler ...
Wo liegt der Fehler??
THX
3
Lowlevel-Coding / Include bei NASM
« am: 08. February 2005, 16:10 »
Hi,
ist vielleicht eine sehr blöde Frage, aber wie kann ich mit NASM Dateien einbinden. Prinzipiell ist mir das schon klar, aber wenn ich mein OS in kleine Module aufteilen will und meine eigenen Codeteile aus einer externen Datei wieder einbinden will, geht das nicht. Mir gehts lediglich darum, dass ich nicht den gesamten Kernel in einer Datei hab.
Thx
4
Lowlevel-Coding / Grafik im Real-Mode
« am: 11. August 2004, 12:08 »
Hi,
ich hab mir aus Spaß und Interesse eine kleine Grafikdemo im Real-Mode gebastelt. Dazu hab ich den Grafik-Modus 13h (320*200, 256 Farben) benutzt. Mein Ziel war es einen Interpolationseffekt zu erzeugen. Für alle die nicht wissen was ich meine, erklär ich es mal. Ich hab die Farbpalette über Ports mit 240 Farben belegt, wobei Eintrag 0 schwarz ist und die Palette mit aufsteigenden Einträgen dunkelrot, hellrot, gelb und bei Eintrag Nummer 240 schließlich mit weiß belegt ist. Wenn ich jetzt ein weißes Objekt zeichne und der Interpolationseffekt anwende, entsteht eine Art Feuereffekt. Ist keine neue Sache, aber ich wollte es halt mal machen.
Mein Problem ist die Geschwindigkeit der Interpolationsroutine. Ich habe vor Jahren den gleichen Algorithmus mit Pascal umgesetzt und es lief auf einem 60 MHz - Rechner recht gut. Jetzt mit NASM und auf einem 2,7 GHz - Rechner, kann ich die Durchgänge fast mitzählen. Vielleicht hab ich irgendwas verhauhen. Hier ist der Quelltext des Interpolationsalgorithmus:

   
.start:
mov ax, 0a000h            ; Segment-Adresse vom Bildschirmspeicher
mov es, ax                    ; nach es schreiben
mov si, 0                    ; si auf null setzen -> Anfang des Bildschirmspeichers
mov cx, 64000           ; Zähler auf 64000 -> jeder Punkt

.loop:
xor dx, dx           ; dx auf null setzen
xor ax, ax                   ; ax auf null setzen
mov al, [es:si-1]          ; Farbwert des linken Punktes nach al
mov dl, [es:si+1]         ; Farbwert des rechten Punktes nach al
add ax, dx                  ; Beide Werte addieren, Ergebnis in ax
mov dl, [es:si-320]      ; Farbwert des oberen Punktes nach dl
add ax, dx                  ; und zu ax addieren
mov dl, [es:si+320]      ; Farbwert des unteren Punktes nach dl
add ax, dx                  ; und zu ax addieren
shr ax, 2              ; Summenfarbwert in ax durch 4 teilen
or ax, ax              ; Flags setzen
jz .zero              ; Wenn ax = 0, springe zu .zero
dec ax              ; Wenn ax nicht null, um eins erniedrigen

.zero:
mov [es:si], al           ; neuen Farbwert setzen
inc si                 ; si erhöhen -> nächster Punkt
dec cx                      ; Zähler erniedrigen
jnz .loop                   ; Solange Zähler nicht 0, springe zu .loop

mov ah, 01h               ; Funktion zur Überprüfung des Tastaturpuffers
int 16h             ; Wenn ZF = 1 dann ist kein Zeichen vorhanden
jz .start             ; Wenn kein Taste gedrückt, dann nächster Durchgang

       
Noch mal zur Erklärung: Der Algorithmus berechnet für jeden der 64000 Bildpunkte den Farbwert aus den 4 angrenzenden Punkten, indem ein Mittelwert ihrer Farbwerte gebildet wird und dieser um eins erniedrigt wird.
thx for your help!!
5
Lowlevel-Coding / 64kb Speicher reservieren
« am: 14. July 2004, 12:11 »
hi, ich hoff ich nerve niemanden mit meinen andauernden Fragen :)
folgendes, ich will im Real-Mode im Mode 13h eine kleine Grafikdemo schreiben.
Damit dass aber ordentlich funktioniert, will ich die Punkte nich direkt in den Bildschirmspeicher schreiben, sondern vorher in einen, naja virtuellen Bildschirmspeicher schieben. Bei der Auflösung 320*200 müsste der 64000 Bytes groß sein.
Wenn ich nun am Anfang von meinem Testkernel
resb 64000
schreibe, bekomme ich einen schwarzen Bildschirm und nicht einmal mehr meine Konsole aus dem Kernel wird angezeigt. er wird also schlicht nicht ausgeführt. Jetzt weiß ich nicht woran es liegen kann. kann mir jemand helfen?? thx
6
Lowlevel-Coding / Farbpalleten im Mode 13h (Real Mode)
« am: 13. July 2004, 19:07 »
Ich will im Grafik-Mode 13h (320*200 Pixel, 256) eine kleine Grafikdemo basteln. Dieser Modus besitzt ja genügend Farben. Nun ist nur die Frage, wie ich alle 256 Farben selber mischen kann (rot-, grün-, blau-Anteil setzen). Es gibt eine Biosfunktion mit der man sogenannte DAC-Register in dieser Art un Weise mit Farbwerten belegen kann, allerdings weiß ich nicht, wie man dem Punkt, den man dann schreibt auch diesen Farbwert zuordnet. Falls jemand versteht was ich hier will, bin ich für Hilfe sehr dankbar! :-)
7
Lowlevel-Coding / Problem mit Datenzugriff im Kernel
« am: 26. May 2004, 20:42 »
Hi,
Ich programmiere seit einiger Zeit mit NASM und habe, nachdem ich das Low-Level-Tutorial gelesen habe, auch ein kleines OS geschrieben. Mein Bootloader funktioniert und lädt den Kernel von Diskette in den Speicher. Nach dem Sprung zum Kernel wird der Code des Kernels auch ausgeführt (der Computer wartet wie vorgesehen auf einen Tastendruck und rebootet anschließend). Das einzige Problem ist, dass die Variablen die ich ausgeben will, nicht auf dem Bildschirm erscheinen! (Im Bootloader hats funktioniert). Nun wurde in allen Tutorial, die ich gefunden habe, ds auf die Segmentadresse gesetzt, an die der Kernel geladen wurde. Also wenn der Kernel bei 1000h:0000h steht, wurde im Kernel immer ds auf 1000h gesetzt. Das führt aber bei mir zu keiner Ausgabe.
Ich habe jetzt schon unzählige Tutorials gelesen und alles mögliche probiert aber meine Strings werden nicht ausgegeben. Was muss ich tun?? Helft mir!! *fleh*
Seiten: [1]

Einloggen