Ein Betriebsystem mit Bootloader von einem 12 Jährigen!
Bootloader:
Code:
[org 0x07C0] ; Beginne bei dem MBR-Einsprungspunkt
jmp start ; Springe zu Marke Start
start:
cli ; KEINE INTERUPTS VERWENDEN
mov ax, 0x9000 ; Setze das Addressenregister auf 0x9000
mov ss, ax ; Erstelle den Stack auf 0x9000
mov sp, 0 ; Resette den Stackpointer
sti ; INTERUPTS WIEDER ERLAUBT
mov ax, 0x0000 ; Resette das Adressenregister
mov es, ax ; Setze einen Zeiger auf ein neues Dateisegment in Stelle 0x0000
mov ds, ax ; Setze den Datenzeiger auf die datei 0x0000 (Bootloader)
mov [bootdrv],dl ; setze die Variable BOOTDRV auf den Wert von dem 2. Byte von DX
call load ; Rufe die Funktion load auf
mov ax, 0x1000 ; Setze das Adressregister auf 0x1000
mov es, ax ; Setze einen Zeiger auf ein neues Dateisegment in Stelle 0x1000
mov ds, ax ; Setze den Datenzeiger auf die datei 0x1000 (Kernel)
jmp 0x1000:0x0000 ; Springe zum Kernel
bootdrv db 0 ; Definiert die Variable BOOTDRV
loadmsg db "Laden...",13,10,0 ; Ladenachricht
putstr:
lodsb
or al,al
jz putstrd
mov ah,0x0E
mov bx,0x0007
int 0x10
jmp putstr
putstrd:
retn
load:
mov ax, 0
mov dl, [bootdrv]
int 13h
jc load
mov ax,0x1000
mov es,ax
mov bx,0
mov ah,2
mov al,5
mov cx,2
mov dh, 0
mov dl, [bootdrv]
int 0x13
jc load
mov si,loadmsg
call putstr
retn
times 512-($-$$)-2 db 0
dw 0x0AA55
Kernel:
Code:
mov ax, 0x1000
mov ds, ax
mov es, ax
start:
call load
mov si, msg
mov al, 0x00
int 0x21
mov si,msg_boot
mov al, 0x00
int 0x21
mov si,mtg_load
mov al, 0x00
int 0x21
putstr:
lodsb
or al,al
jz short putstrd
mov ah,0x0E
mov bx,0x0007
int 0x10
jmp putstr
putstrd:
retn
getkey:
mov ah, 0
int 0x16
ret
reboot:
jmp 0xffff:0x0000
db "DEKOMPILIEREN VERBOTEN!"
_int0x21:
_int0x21_ser0x00:
cmp al, 0x00
je _int0x21_ser0x00_start
jmp _int0x21_end
_int0x21_ser0x00_start:
lodsb
or al, al
jz _int0x21_ser0x00_end
mov ah, 0x0E
mov bh, 0x00
mov bl, 0x07
int 0x10
jmp _int0x21_ser0x00_start
_int0x21_ser0x00_end:
jmp _int0x21_end
_int0x21_end:
iret
_int0x21_ser0x01:
cmp al, 0x01
jne _int0x21_end
push ax
mov ah, 0
int 0x16
pop ax
jmp _int0x21_end
_int0x21_ser0x02:
cmp al, 0x02
jne _int0x21_end
mov si, msg_herunterfahren
mov al, 0x00
int 0x21
mov al, 0x01
int 0x21
jmp 0xffff:0x0000
load:
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
ret
msg db "Herzlich Wilkommen bei MTG 1.0!¦",13,10,0
msg_boot db "Beliebige Taste druecken...",10,0
mtg_load db "MTG wurde geladen!",13,10,0
msg_herunterfahren db "MTG wird heruntergefahren! Beliebige Taste druecken...",10,0
times 512-($-$$) db 0
Ein Betriebsystem mit Bootloader von einem 12 Jährigen!
Bootloader:
Code:
[org 0x07C0] ; Beginne bei dem MBR-Einsprungspunkt
jmp start ; Springe zu Marke Start
start:
cli ; KEINE INTERUPTS VERWENDEN
mov ax, 0x9000 ; Setze das Addressenregister auf 0x9000
mov ss, ax ; Erstelle den Stack auf 0x9000
mov sp, 0 ; Resette den Stackpointer
sti ; INTERUPTS WIEDER ERLAUBT
mov ax, 0x0000 ; Resette das Adressenregister
mov es, ax ; Setze einen Zeiger auf ein neues Dateisegment in Stelle 0x0000
mov ds, ax ; Setze den Datenzeiger auf die datei 0x0000 (Bootloader)
mov [bootdrv],dl ; setze die Variable BOOTDRV auf den Wert von dem 2. Byte von DX
call load ; Rufe die Funktion load auf
mov ax, 0x1000 ; Setze das Adressregister auf 0x1000
mov es, ax ; Setze einen Zeiger auf ein neues Dateisegment in Stelle 0x1000
mov ds, ax ; Setze den Datenzeiger auf die datei 0x1000 (Kernel)
jmp 0x1000:0x0000 ; Springe zum Kernel
bootdrv db 0 ; Definiert die Variable BOOTDRV
loadmsg db "Laden...",13,10,0 ; Ladenachricht
putstr:
lodsb
or al,al
jz putstrd
mov ah,0x0E
mov bx,0x0007
int 0x10
jmp putstr
putstrd:
retn
load:
mov ax, 0
mov dl, [bootdrv]
int 13h
jc load
mov ax,0x1000
mov es,ax
mov bx,0
mov ah,2
mov al,5
mov cx,2
mov dh, 0
mov dl, [bootdrv]
int 0x13
jc load
mov si,loadmsg
call putstr
retn
times 512-($-$$)-2 db 0
dw 0x0AA55
Kernel:
Code:
mov ax, 0x1000
mov ds, ax
mov es, ax
start:
call load
mov si, msg
mov al, 0x00
int 0x21
mov si,msg_boot
mov al, 0x00
int 0x21
mov si,mtg_load
mov al, 0x00
int 0x21
putstr:
lodsb
or al,al
jz short putstrd
mov ah,0x0E
mov bx,0x0007
int 0x10
jmp putstr
putstrd:
retn
getkey:
mov ah, 0
int 0x16
ret
reboot:
jmp 0xffff:0x0000
db "DEKOMPILIEREN VERBOTEN!"
_int0x21:
_int0x21_ser0x00:
cmp al, 0x00
je _int0x21_ser0x00_start
jmp _int0x21_end
_int0x21_ser0x00_start:
lodsb
or al, al
jz _int0x21_ser0x00_end
mov ah, 0x0E
mov bh, 0x00
mov bl, 0x07
int 0x10
jmp _int0x21_ser0x00_start
_int0x21_ser0x00_end:
jmp _int0x21_end
_int0x21_end:
iret
_int0x21_ser0x01:
cmp al, 0x01
jne _int0x21_end
push ax
mov ah, 0
int 0x16
pop ax
jmp _int0x21_end
_int0x21_ser0x02:
cmp al, 0x02
jne _int0x21_end
mov si, msg_herunterfahren
mov al, 0x00
int 0x21
mov al, 0x01
int 0x21
jmp 0xffff:0x0000
load:
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
ret
msg db "Herzlich Wilkommen bei MTG 1.0!¦",13,10,0
msg_boot db "Beliebige Taste druecken...",10,0
mtg_load db "MTG wurde geladen!",13,10,0
msg_herunterfahren db "MTG wird heruntergefahren! Beliebige Taste druecken...",10,0
times 512-($-$$) db 0