Grafik in OS. . . nicht!

FishHead

Grünschnabel
Grafik in OS... nicht!

Hallo!
Ich bin neu hier aber kenn euer Forum schon seit längerem. Über das OS tutorial ich angefangen asm zu lernen. Und morgen kommt warscheinlich auch mein "PC Intern 5.0". Vielleicht kennts ja jemand. Also ich mal ne Frage zu meinem billigOS, Helix! Ich wollte mal über 10h einen pixel malen, also nicht in den grafikspeicher einimpfen-und dann kommt nur dieser Strich da: _ Bitte helft mir ! Ach übrigens: Dies hier ist nur der Kernel! Der Loader geht soweit...

; Kernel ist auf 0800:0000 geladen
ORG 0000h

JMP start
print_string:
lodsb ; lade das Byte auf ds:si in al
or al,al ; teste ob der character 0 ist(Ende)
jz done
mov ah,0eh ; put character
mov bx,0007 ; Attribut
int 0x10 ; rufe BIOS auf
jmp print_string
done:
ret
;==== data section =====================

; message:
msg DB 'Willkommen zu Helix!', 13, 10
;======================================
clear_screen:
MOV AH, 00h
MOV AL, 0Ch
INT 10h
ret
start:
; data segment:
PUSH CS
POP DS
; setzte auf: 640*480*16:
MOV AH, 00h
MOV AL, 0Ch
INT 10h
; clear screen:
CALL clear_screen
;die message
MOV SI, msg
CALL print_string
CALL getkey
MOV AH, 0Ch
MOV DX, 20
MOV CX, 30
MOV AL, 05h
INT 10h
HLT
CALL getkey
Call reboot




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


reboot:

db 0EAh ; Maschinensprache um auf FFFF:0000
;(reboot) zu springen

dw 0000h
dw 0FFFFh

DANKE!
 
Zuletzt bearbeitet:
mit bildschirmmode 0C wirste da nicht viel glück haben...

setz also erstmal einen entsprechenden mode
mov ax, 13h
int10h

dann gehts auch ;-)
 
Neee... :( Geht leider nicht! Weder mit ax noch al Immer nur dieses blinkende '_' ! Aber: Ich hab jetzt eine andere Möglichkeit gefunden pixel zu malen
 
Zuletzt bearbeitet:
also...
1.) mov ax, 13h
ist das gleiche wie
mov ah, 0h
mov al, 13h
2.)
des weiteren ist in der mode table für VGA genau definiert das der mode 640x480x16 als 0x12 also 12hex angesprochen wird...
13h is ähnlich,, das is 320x200x256
0Ch = reserved for internal use of the EGA Bios

die genaue tabelle ist nachzulesen unter http://www.ctyme.com/intr/rb-0069.htm

3.)
Das erste was du machen musst befor du irgend eine codestück aufrufst das graphik zeichnet, musst du den graphikmodus richtig setzen, wie aus 2.) herforgeht ist 0Ch kein allgemein benutzbarer modi, dem zu folge kann dein code nicht funktionieren..

entsprechend empfehl ich dir mal mode 12h oder 13h zu setzen
mov ax, 12h
int 10h
und dann kannst du auch problemlos deine pixel setzen

4.) dein stück code schreibt außerdem versehendlich auf page 07h!
also setz bitt bl = 0

5.) textausgabe im graphimodus kommt immer gut, tu also erstmal die textausgabe raus...

und dann sieht der kernel wohl eher so aus:

Code:
org 0000h

jmp start
clear_screen:
    mov ax, 12h
    int 10h
    ret

start:
    push cs
    pop ds
    call clear_screen

    mov ah, 0Ch
    mov dx, 20
    mov cx, 30
    mov al, 05h
    xor bl, bl 
    int 10h

    call getkey
    call reboot

getkey:
    mov ah, 0
    int 16h
    ret

reboot:
    db 0EAh
    dw 0000h
    dw 0FFFFh
 
Zuletzt bearbeitet:
Ich hoffe es funktioniert, hab es selbst nicht ausprobiert, aber bereits auf dem gebiet reichlich erfahrung, als ich nen bootmanager programmiert hab gesammelt von daher...

Denk aber bitte daran, wenn du mit dem code weiter arbeitest das du auf die art und weise nur 1MB arbeitsspeicher ansprechen kannst, willst du mehr musst du dich mit dem protected mode auseinander setzen....und dementsprechend auch mit eigenen graphikangelegenheiten ;-)
 
Re: Grafik in OS... nicht!

Original geschrieben von FishHead
Code:
; Kernel ist auf 0800:0000 geladen
ORG 0000h

JMP start
print_string:
		lodsb                   ; lade das Byte auf ds:si in al
                or al,al                         ; teste ob der character 0 ist(Ende)
                jz done
                mov ah,0eh              ; put character
                mov bx,0007             ; Attribut
                int 0x10                     ; rufe BIOS auf
                jmp print_string
done:
		ret
;==== data section =====================

; message:
		msg  DB 'Willkommen zu Helix!', 13, 10		
;======================================
clear_screen:
		MOV AH, 00h
		MOV AL, 0Ch
		INT 10h
	ret
start:
	; data segment:
		PUSH    CS
		POP     DS
	; setzte auf: 640*480*16:
		MOV     AH, 00h
		MOV     AL, 0Ch
		INT     10h
	; clear screen:
		CALL    clear_screen
;die message
		MOV     SI, msg
		CALL    print_string
		CALL getkey
		MOV AH, 0Ch
		MOV DX, 20
		MOV CX, 30
		MOV AL, 05h
		INT 10h
		HLT
		CALL getkey
		Call reboot
		



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


reboot:

               db 0EAh                 ; Maschinensprache um auf FFFF:0000 
                                        ;(reboot) zu springen

                dw 0000h
                dw 0FFFFh


Ich will echt nicht meckern, aber dieser Code sieht so aus wie jeder andere realmode os loader auch. Und da redet jeder noch, vom selber lernen und selbst programmierten obwoll man wirklick eindeutig sieht dass das verdammt noch mal der identische Code ist wie zig andere auch verwenden und in zahlreichen Tutorials veröffentlicht ist.

Schon mal was vom selbst entwickeln gehört...

Klar, es gibt zahlreiche Beispiele OS's, wenn ich ich nur an http://www.osdev.org denke, aber wird nicht allein schon aus dieser Tatsache klar, dass die Welt nicht noch ein OS brauch. Sicher du schreibst es zum "lernen" -> bzw. kopierst dir viel zusammen, aber gib es auf. Es werden viele Probleme kommen bei dennen du schnell die Lust verlierst.

- intreruppthandling
- protected mode (oder soll es nur ein kack dos werden?)
- speicher verwaltung
- acpi
- grafik (nen schönes X)
- netzwerk
- und vieles mehr...


Ich will damit nur sagen, gib es auf!

mfg
Christian Ries
 
Ja stimmt schon, ich hab den Loader aus einem anderen OS und den kernel auch hauptsächlich aus anderen Tutorials, und die grafikfunktion aus einem buch. das war auch nur mal so zum experimentieren, wie das denn so funktionert. Schliesslich hab ich ja auch nie gesagt dass ich mit meinem os geld verdienen will, eigentlich mach ich das ja nur zum spaß, bzw um assembler zu lernen! Und noch was: Wenn das sowas schlimmes ist, sich ein tutorial zur Hilfe zu nehmen, wozu sind die denn dann da? Für irgendwelche profis, die schon selber wissen wies geht?
 
Nicht entmutigen lassen, hauptsache es macht Spaß ;)

Mit welchen Tutorials und Tools hast du denn angefangen Assembler und OS-Programmierung zu lernen ? Ist ein Thema das mich auch mal interessieren würde.
 

Neue Beiträge

Zurück