Eigenes Betriebssystem... wie weiter?

PMTheQuick

Grünschnabel
Hi,

ich hatte erst gerade kürzlich nen alten Schrotthaufen-PC gekriegt (ein zweiter, Test-PC) ;) Jetzt habe ich ein eigenes kleines Betriebssystem durchgearbeitet, und habe noch ein 386-CPU Check eingebunden... Hier mal mein aktueller Code:

boot.asm:
Code:
org 0x7C00

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

start:

cli
mov ax, 0x9000
mov ss, ax
mov sp, 0
sti

; Bootlaufwerk aus DL speichern
mov [bootdrv], dl

; Lade unseren Kernel
call load

; Springe zu diesem Kernel
mov ax, 0x1000
mov es, ax
mov ds, ax
push ax
mov ax, 0
push ax
retf

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

bootdrv db 0
loadmsg db "Loading...", 13, 10, 0

; Einen String ausgeben
putstr:
lodsb
or al, al
jz short putstrd

mov ah, 0x0E
mov bx, 0x0007
int 0x10
putstrd:
retn

; Lade den Kernel vom Bootlaufwerk
load:

; Diskdrive reset
push ds
mov ax, 0
mov dl, [bootdrv]
int 13h
pop ds
jc load

load1:
mov ax, 0x1000
mov es, ax
mov bx, 0

; Sektoren lesen
mov ah, 2
mov al, 5
mov cx, 2
mov dx, 0
int 13h
jc load1
mov si, loadmsg
call putstr
retn

times 512-($-$$)-2 db 0
dw 0AA55h

kernel.asm:
Code:
; --------------------------------------------
; Unser Kernel
; --------------------------------------------

;- Interrupt vorbereiten
push dx
push es
xor ax, ax
mov es, ax
cli
mov word [es:0x21*4], _int0x21
mov [es:0x21*4+2], cs
sti
pop es
pop dx

mov ax, 1000h
mov ds, ax
mov es, ax

start:
; Willkommen
mov si, msg_welcome
mov al, 0x01
int 0x21

; CPU Check starten (Anfrage)
mov si, msg_cpu
mov al, 0x01
int 0x21
call getkey

; CPU Check Ausgabe
mov si, msg
mov al, 0x01
int 0x21
mov si, msg_cpu_check
mov al, 0x01
int 0x21
call cpu_check

; Rebootanforderung
mov si, msg
mov al, 0x01
int 0x21
mov si, msg_boot
mov al, 0x01
int 0x21

; Taste abwarten
call getkey

; Rebooten
jmp reboot

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

msg db "", 13, 10, 0
msg_welcome db "Willkommen bei Cats 1.0!", 13, 10, 0
msg_cpu db "Druecke eine beliebige Taste, um den CPU-Check durchzufuehren...", 13, 10, 0
msg_cpu_check db "CPU-Check:", 13, 10, 0
msg_is_386 db "Du hast eine 386-CPU!", 13, 10, 0
msg_not_386 db "Du hast keine 386 CPU!", 13, 10, 0
msg_boot db "Druecke eine beliebige Taste, um zu rebooten...", 13, 10, 0
msg_1 db "1", 13, 10, 0
msg_2 db "2", 13, 10, 0
msg_3 db "3", 13, 10, 0

; Warte auf einen Tastendruck
getkey:
mov ah, 0
int 016h
ret

; Rebooten
reboot:
db 0EAh
dw 0000h
dw 0FFFFh

; CPU Check
cpu_check:

cli
pushf
pushf
pop ax
mov bx, ax
and ax, 0x0FFF
or bx,0x7000
push ax
popf
pushf
pop ax
push bx
popf
pushf
pop bx
popf
and ax, 0xF000
cmp ax, 0xF000
je not_386
test bx, 0x7000
jne is_386
retn

not_386:
mov si, msg_not_386
mov al, 0x01
int 0x21
retn

is_386
mov si, msg_is_386
mov al, 0x01
int 0x21
retn

; --------------------------------------------
; Interrupts
; --------------------------------------------

; Text ausgeben
_int0x21:
 _int0x21_ser0x01:
 cmp al, 0x01
 jne _int0x21_end
 
 _int0x21_ser0x01_start:
 lodsb
 or al, al
 jz _int0x21_ser0x01_end
 mov ah, 0x0E
 mov bh, 0x00
 mov bl, 0x07
 int 0x10
 jmp _int0x21_ser0x01_start
 _int0x21_ser0x01_end:
 jmp _int0x21_end
 
 _int0x21_end:
 iret

Das funktioniert alles bestens! Nur... wie gehts weiter? Wie macht man Punkte auf den Bildschirm? Wie leert man den Bildschirm? Sorry, aber ich weiss das nicht, das es für NASM so gut wie gar kein deutsches Tutorial gibt! :mad: Ich verwende NASM... Bis jetzt alles prima! Und, hat jemand einen besseren Code, der das gleiche erreicht? Oder hat jemand ein NASM-Tut aus deutsch? Schon jetzt mal vielen, vielen Dank! ;) Seit aber bitte nicht zu streng, werde dieses Jahr erst 11, behersche aber MASM, C++, C, PureBasic, PHP und MySQL... Und nen bissel NASM... Allerdings! Ich will NASM für das BS verwenden!

Gruss
PMTheQuick ;-)
 
Das würde mich auch brennend interessieren, ich bin nämlich genau so
weit weiss aber leider nicht wie's weiter geht.

Hast du nach Tutorials schon auf http://www.robsite.de geschaut?

Tobee
 
Hi, das Ganze ist eigentlich recht simpel. Es gibt da einen Interrupt mit der Nummer 10h, der für alles rund um die Graka zuständig ist.

Bevor du allerdings punkten kannst (auf den Bildschirm ;)), musst du erstmal einen Grafikmodus einschalten. Für den Anfang empfehle ich den Modus 13h, das ist der, in dem die meisten DOS-Spiele laufen/liefen. Er hat eine Auflösung von 320x200 Punkten bei 256 Farben. Ist zwar nicht mehr ganz die Höhe der Zeit, aber dafür wenigstens standartisiert, d. H. er läuft auch ohne irgendwelche Treiber oder VESA...

Die Initialisierung geht dann so:
MOV AX,0013h ; Unterfunktion 00h, zuständig für die Videomodi, nach AH und der eigentliche Modus 13h nach AL

INT 10h ; und ab dafür ;)

Um jetzt Pixel zu setzen gibt es zwar auch Interruptfunktionen, aber schneller und einfacher geht es, indem du direkt den Grafikspeicher ansprichst. Der fängt ab Adresse A000:0000 an und ist im Modus 13h genau 64000 Byte lang (320*200).

Um jetzt einen Pixel zu setzen, schreibst du einfach einen Farbwert als 8-Bit Zahl an die Stelle im Grafik-RAM, wo es leuchten soll. 0 ist dabei schwarz, 255 weiss. (Das lässt sich über die Palette noch ändern, aber für den Anfang...) Die Koordinaten kannst ganz leicht in die entsprechende Adresse umrechnen: 320*Y+X=Offset. Übrigens werden die Pixel von oben links gezählt. Viel Spaß noch.
TheAlchimist
 
Zuletzt bearbeitet:
hi

ich bin neu hier und auch noch ein totaler anfänger was programierung und so angeht. wollte eigentlich mal n bisschen damit anfagnen, aber ich habe probs mit dem Netwide Assembler. wie kann ich das bei xp installieren? das geht bei mir irgendwie nicht.:confused:
vllt bin ich ja auch einfach zu blöd dazu aber ich hoffe ihr könnt mir da ein bisschen weiterhelfen.

gruß
genick
 
dieser Thread ist zwar schon zimlich alt aber ich gebe meinen senf mal dazu:
Da steht wie man system infos kriegt: http://www.codeplanet.eu/tutorials/assembler/9-bios-level-programmierung.html

da steht wir man pixel setzt und grafikmodi verwendet: http://www.codeplanet.eu/tutorials/assembler/9-bios-level-programmierung.html?start=2
oder da stehen noch einige grafik funktionen:http://de.wikibooks.org/wiki/Interrupts_80x86/_INT_10
für dateisysteme kenne ich keinte tutorials aber infos gibts überall.
wer noch mehr infos über funktionen haben will:
http://andremueller.gmxhome.de/referenz.html
da stehen genug infos fürs erste. und wer in den protected mode will liest am besten das:
http://www.fh-zwickau.de/doc/prmo/pmtutor/text/index.htm
http://www.tutorials.de/sonstige-sprachen/133551-assembler-und-treiber.html
lg BassBox
 
Moin, eben auch schon in nem anderen Thread gesagt:
www.lowlevel.eu die deutsch sprachige OS-Dev Community, da findest du (fast) alles was dur brauchst. Sonst auf osdev.net, die englische Schwester von lowlevel.eu
Skini
 
Hallo,
ich bin jetzt zwar auch nicht der helt, was Betriebssysteme angeht, man sollte sich aber von assembler wegbewegen, da ein Fehler hier fatale Folgen haben kann. Den Kernel musst du so umbauen, dass er mit C oder C++ interagiert, das macht das ganze sicherer und deutlich einfacher. Wie du das machst, kannst du hier in diesem Link lesen: http://www.henkessoft.de/OS_Dev/OS_Dev1.htm
Das sind 4 Teile, wenn du alle durch hast, kannst du in C Programmieren und alles läuft dann ganz normal in C. Du darfst aber auf keinen Fall ein Betriebssystem ausschließlich in Assembler schreiben.
 
was soll das problemm in assembler sein? in c hat das genau so schlimme folgen wenn du dich vertippst.
Mit assembler kannst du deinen pc nicht "Zerstören" du schaffst es maximal deine festplatte zu leren oder ein paar sachen zu verstellen die beim neustart wieder da sind. Das mit c muss nich sein. Ich arbeite ausschließlich mit assembler und mein os Hat Einen Editor (auf grafik und ANSI aufbauend) mitlerweile auch einen dos Emulator und zahlreiche featurs zum programmieren die ziemlich nützlich sind(zum programmieren von programmen auf meinem os) ach ja hätte ich fast vergessen einen Grafik Editor für 16 farben bitmaps. So und warum bitte sollte ich c nehmen? Ich müsste für C jede Funktion definieren. Ich spar mir die arbeit und entwickle lieber so an meinem os weiter.
 
Zuletzt bearbeitet von einem Moderator:
was soll das problemm in assembler sein? in c hat das genau so schlimme folgen wenn du dich vertippst.
Mit assembler kannst du deinen pc nicht "Zerstören" du schaffst es maximal deine festplatte zu leren oder ein paar sachen zu verstellen die beim neustart wieder da sind. Das mit c muss nich sein. Ich arbeite ausschließlich mit assembler und mein os Hat Einen Editor (auf grafik und ANSI aufbauend) mitlerweile auch einen dos Emulator und zahlreiche featurs zum programmieren die ziemlich nützlich sind(zum programmieren von programmen auf meinem os) ach ja hätte ich fast vergessen einen Grafik Editor für 16 farben bitmaps. So und warum bitte sollte ich c nehmen? Ich müsste für C jede Funktion definieren. Ich spar mir die arbeit und entwickle lieber so an meinem os weiter.

Kannst ud es hier Hochladen?
 

Neue Beiträge

Zurück