Autor Thema: standardfarbe 0x07 ändern bei int 0x10  (Gelesen 5337 mal)

chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« am: 30. August 2008, 23:32 »
ich hab vor längerer zeit die tuts aus der wiki mir durchgelesen und auch ein os, zumindest die anfänge, geschrieben.
einige funktionen hab ich auch übernommen wie z.b. die putstr funktion und da ist jetzt meine frage wie man diese funktion umschreiben müsste um jetzt die standard farbe 0x07 auf z.b. 0x14 zu ändern oder könnte man das auch z.b an den anfang der konsole schreiben das gleich die farbe geändert wird und man dann arbeiten kann? :? :? :?
ich hab mir Ralf Brown's Interrupt List angesehen und da stand bei INT 10/AH=0Eh
Zitat
AH = 0Eh
AL = character to write
BH = page number
BL = foreground color (graphics modes only)
...

mit BL z.b= 14h oder 0x14 oder 0x1 oder anderem hat nicht gefunzt :-(
dann hab ich's mit BX z.b = 0x001 oder 0x13 oä alles hatte keine wirkung es blieb grauer text auf schwarzem grund :cry:
heir der code:

putstr:
    lodsb           
    or al,al
    jz short putstrd
    mov ah,0Eh   
    mov bx, 0x0007 ;<---- hier dacht ich wär die farbe definiert
    int 0x10
    jmp putstr       
    putstrd:
    retn


ich hoffe es hört sich nicht so an, als wenn ich  nicht gesucht hätt aber alles was ich probiert hab funzte nicht bz nicht so wie ich es gern haben wollte :-(


ich hoffe ihr könnt mir helfen sonst muss es halt grau-schwarz bleiben





mfg bb





chris12
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #1 am: 30. August 2008, 23:43 »
Ich verwende die Funktion 0x09
Damit geht es auf jeden fall. 0x0E funktionierte bei mir damals auch nicht richtig.

    mov cx, 1    ; Anzahl der ausgaben
    xor bh, bh   ; Codepage 0
    mov bl, 0x14 ; Farbe laden
    mov ah, 0x09 ; Int 10>09
    int 0x10

chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 30. August 2008, 23:59 »
danke für die schnelle antwort aber nun stimmt zwar die farbe aber es wird nichts mehr ausgegeben
sondern nur noch

anstat




aber trotzdem danke :-D



mfg bb

chris12
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 31. August 2008, 00:21 »
Zitat
BL = foreground color (graphics modes only)
80x25 oä sind keine Grafikmodi sondern Textmodi...
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 31. August 2008, 00:26 »
also nur damit ich es richtig verstehe :
80x25 is textmodus und bl funzt nur im grafikmodus
so richtig?


bb chris
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #5 am: 31. August 2008, 00:37 »
Ja.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 31. August 2008, 00:41 »
und auf diese weise kann ich die farben nicht ändern, oder? :-)




mfg bb


chris
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #7 am: 31. August 2008, 00:54 »
offensichtlich.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 31. August 2008, 01:06 »
danke :-D
jetzt weiss ich entlich, dass es so nicht geht :-D :-D :-D






mfg bb



chris12
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 31. August 2008, 10:59 »






mfg bb



chris12
Wie wäre es mit ein paar Leerzeilen weniger? Die stören beim Lesen. Davon abgesehen zeigt das Forum deinen Benutzernamen auch so an, es gibt also keinen Grund, ihn nochmal drunterzusetzen.

Ja, ich weiß, es ist doof, inhaltlich nichts beizutragen und nur über sowas zu meckern. Aber es erleichtert das Lesen wirklich, wenn sich alle dran halten.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 31. August 2008, 11:09 »
ok ich werd mich versuchen dran zu halten
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #11 am: 31. August 2008, 11:55 »
Also int 0x10, ah=0x09 läuft bei mir im 80x25 und 80x50 TEXTMODE

"Beweisfoto":

Bis Execute video16.bin ist es unverändert der 80x25 textmode. In video16.bin wechsel ich dann in den 80x50 textmode.

getestet unter bochs, qemu, und zwei echten PCs

evtl musst du per hand, die neue Position für das nächste zeichen eingeben...
So hab ich es gemacht - ist aber bestimmt nicht die besste Lösung... Ich hatte damals noch ne menge anderen Mist in dieser funktion stehen (\t \b und sonstiges zeug wurde mit berücksichtigt). Aber sie Tut ihren dienst :)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; putchar                            ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; al    = Zeichen
;; ah    = Farbe
putchar:
   push ax
   push bx
   push cx
   push dx

    cmp al, 10 ; Newline
    jz  putchar.newline
   
    mov cx, 1    ; Anzahl der ausgaben (f�r int)
    xor bh, bh   ; Codepage 0
    mov bl, ah   ; Farbe laden (f�r int)
    mov ah, 0x09 ; Int 10>09
    int 0x10

    putchar.nextchar:
     call getcursorpos
     cmp  dl, 79          ; ende der Zeile erreicht?
     jz   putchar.newline ; Dann die Zeile wechseln
     inc  dl              ; Sonst die n�chste spalte
     call setcursorpos
     jmp  putchar.ende

    putchar.newline:
     call getcursorpos
     inc dh           ; N�chste reihe
     xor dl,dl        ; Spalte 0
     call setcursorpos
     jmp  putchar.ende
   
   putchar.ende:
   pop  dx
   pop  cx
   pop  bx
   pop  ax
   ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; getcursorpos                       ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; dh    = reihe
;; dl    = Spalte
getcursorpos:
    push ax
    push bx
     xor bh, bh   ;
     mov ah, 0x03 ; INT 10>03
     int 0x10     ; getcursorposition ( dh <reihe ; dl <spalte )
    pop  bx
    pop  ax
    ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; setcursorpos                       ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; dh    = reihe
;; dl    = Spalte
setcursorpos:
    push ax
    push bx
   
     xor bh, bh   ; codepage
     mov ah, 0x02 ; INT 10>02
     int 0x10     ; Setcursorpos (dh <Reihe ; dl <Spalte)
    pop  bx
    pop  ax
    ret


chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 31. August 2008, 12:13 »
ok danke die farbe ist jetzt ne anderre aber wie defienierst du dann die strings die du ausgeben willst, ich hab sie immer mit
nachricht db "bla bla bla...",13,10,0
defieniert und das geht so bei mir nicht
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

jgraef

  • Beiträge: 67
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 31. August 2008, 12:45 »
Hi,

Sieht so aus als würdet ihr eure Strings mit BIOS-Interrupts auf den Bildschirm bringen. Das geht natürlich nur im Realmode und früher oder später müsst ihr in den Protected Mode, wenn ihr ein OS haben wollt. Mit ein wenig Suche hättet ihr auch sicher den Artikel "Textausgabe" in dem Wiki gefunden. Da steht dann erklärt, wie man im PMode Text ausgibt und auch mit Farbe ;)

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #14 am: 31. August 2008, 12:52 »
Ich gehe davon aus, das chris12 im RM arbeitet...
Meinse writestring:
;;INPUT
;; si    = Adresse der Zeichenkette (offset) 1. Zeichen == Farbe
writestring:
   push ax
   push bx
   push cx
   push dx
   push si
   
   ;Daten vorher �ber die rs232 schicken
   call rs232sendstring
   
   mov  ah, [si] ; Farbe in ch laden
   inc  si       ; Zum 1. Zeichen gehen

  writestring.next:
   mov  al, [si]         ; N�chste zeichen laden
   inc  si
   or   al, al           ; ISt das Byte 0??
   jz   writestring.end

;   mov  ah, ch           ; Farbe laden
   call putchar

   jmp  writestring.next

  writestring.end:
 
   pop  si
   pop  dx
   pop  cx
   pop  bx
   pop  ax
   ret
auch sehr umständlich, da ich stringfunktionen der CPU damals noch nicht kannte  :-P

chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 31. August 2008, 14:10 »
thx @ all jetzt funztz :-D
aber ich glaub ich bleib doch erstmal bei dem den ich schon hab und bei der farbe 0x07 :-)
und ja ich arbeite noch im RM
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

Feuermonster

  • Beiträge: 24
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 12. September 2008, 18:03 »
Hallo.

Ich hab ein aehnliches Problem

putstr:
    lodsb         
    or al,al
    jz short putstrd
    mov cx, 1   
    xor bh, bh   
    mov ah,0x09   
    int 0x10
    jmp putstr
    putstrd:
    retn

Jedoch wird bei einer Ausgabe nur ein Zeichen ausgegeben. (Aber ein falsches)
Die Farbe setz ich ueber bl.

msg db "[]",0
mov si,msg
mov bl, 0x03

call putstr


Was mach ich hier falsch?

chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 12. September 2008, 18:50 »
ich hab nochmal ein bisschen probiert und entlich code gefunden der funzt und das ganze hab ich mit zuhilfename dar wiki das als int definiert
hier mal der code:
_int0x21:
     _int0x21_ser0x01:     
     cmp al, 0x01           
     jne _int0x21_end       
cmp ah, 0x01
jne _int0x21_ser0x01_start

_int0x21_ser0x01_ser0x01_start:
lodsb
or al,al
jz _int0x21_ser0x01__ser0x01_end

mov ah,09h
;<--- Farbattribut  0 = Schwarz  1 = Blau  2 = Grün 3 = Türkis 4 = Rot 5 = Magenta 6 = braun 7 = Hellgrau 8 = Dunkelgrau 9 = Hellblau a = Hellgrün b = Helltürkis c = Hellrot d = Hellmagenta e = gelb f = weiß
mov cx,0001h
int 10h

;Cursorposition auslesen
mov ah,03h
int 10h
inc dl

;und Cursorposition schreiben
mov ah,02h
int 10h
jmp _int0x21_ser0x01_ser0x01_start
_int0x21_ser0x01__ser0x01_end:
jmp _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
und auf rufen kann man das mit:

mov si, <text>
mov al, 0x01 ;<--- normale bios teletype output
int 0x21 ;<--- int 21h

mov si, <text>
mov al, 01h  ;<--- schreiben
mov ah, 01h  ;<--- mit farbe
mov bl, 0x7E  ;<--- welche farbe: 0xhintergrund/textfarbe
int 21h  ;<--- int 21h

und wie in der wiki steht man muss es noch intialiesieren:

    push dx
    push es
    xor ax, ax
    mov es, ax
    cli
    mov word [es:0x21*4], _int0x21  ; Pointer auf den Handler
    mov [es:0x21*4+2], cs           ; Pointer auf CS
    sti
    pop es
    pop dx
ich hoffe ich konnte helfen
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

Feuermonster

  • Beiträge: 24
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 12. September 2008, 19:06 »
Ich hab mal versucht dass hier gepostete in meinen Kernel zu verpacken:



 
    mov ax, 0x1000
    mov ds, ax
    mov es, ax
 
    start:

mov ah,0x0
mov al,0x3
int 0x10 ; Textmodus, 80 x 25, 16 Farben

    mov si, _s_noos_logo
    mov ah, 0x03
    call _v_noos_tprintf

    mov si, _s_noos_jmp_good
    mov ah, 0x0A
    call _v_noos_tprintf
 
    mov si,msg_boot
mov ah, 0x07
    call _v_noos_tprintf 
 
    call _v_noos_getkey   
    jmp _v_noos_reboot   
 
   
 
    _s_noos_logo db "[ NoOS ]",0
    _s_noos_jmp_good db " Jump into kernel successful",13,10,0
    msg_boot db "Press any key...",10,0
 
    ; Funktionen

;%%%%%%%
;AL = Farbe
;SI = String
;==========
    _v_noos_clrstrout:
lodsb         
or al,al
jz short _v_noos_clrstroutd
mov cx, 1   
xor bh, bh   
mov ah,0x09   
    int 0x10
jmp _v_noos_clrstrout
_v_noos_clrstroutd
retn
 
;%%%%%%%%
;SI = String
;============
_v_noos_stdstrout:
lodsb           
or al,al
jz short _v_noos_stdstroutd
mov ah,0x0E     
mov bx,0x0007 
int 0x10     
jmp _v_noos_stdstrout
_v_noos_stdstroutd:
retn

    _v_noos_getkey:
    mov ah, 0
    int 0x16 
    ret
 

    _v_noos_reboot:
    jmp 0xffff:0x0000

;%%%%%%%%%%
;AH = Farbe
;SI = String
;===============
_v_noos_tprintf:
lodsb
or al,al
jz short _v_noos_tprintfd

mov cx, 1   
xor bh, bh   
mov bl, ah   
mov ah, 0x09
int 0x10

call _v_noos_inccrs

jmp _v_noos_tprintf

_v_noos_tprintfd:
call _v_noos_inccrs
retn

;%%%%%%%%%%%%
;AL = Zeichen
;==================
_v_noos_inccrs:
cmp al,10
jz _v_noos_incrsa

call _v_noos_get_cursor_pos
cmp dl,79
jz _v_noos_incrsa

inc dl
call _v_noos_set_cursor_pos
retn

_v_noos_incrsa:
call _v_noos_pnewline
retn

;%%%%%%%%%%%%%
_v_noos_pnewline:
call _v_noos_get_cursor_pos
inc dh,
xor dl,dl
call _v_noos_set_cursor_pos
retn

;%%%%%%%%%%
;DL = Spalte
;DH = Reihe
;===============
_v_noos_set_cursor_pos:
push ax
push bx
xor bh,bh
mov ah,0x02
int 0x10
pop bx
pop ax
retn
;%%%%%%%%%%%%%
;ret: DL = Spalte
;ret DH = Reihe
;===================
_v_noos_get_cursor_pos:
push ax
push bx
xor bh,bh
mov ah,0x03
int 0x10
push bx
push ax
retn


Unlustigerweise wird jedoch nur ein '[' ausgegeben.

chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 13. September 2008, 09:24 »
ich würd sgen, dass 'inc dl,' nur 'inc dl heißen muss
und ein {enter} muss mit einer 'normalen' 'bios_string_output' geschrieben werden ich hab das bei mir so gelöst:
;unmengen zeilen an code .....
mov si, sys_msg    ;<---- das ist farbig
mov al, 01h
mov ah, 01h
mov bl, 09h
int 21h
mov si, ent ;<-------- das ist das 'Enter'-zeichen
mov al, 0x01
int 0x21
;########
;#Variablen#
;########
;andere variablen...
ent db "",13,10,0
sys_msg db "SolOS System Ready.",0
;noch mehr variablen
;##############
;#int's und funktionen#
;##############
;int....
_int0x21:
     _int0x21_ser0x01:       
     cmp al, 0x01         
     jne _int0x21_end       
cmp ah, 0x01
jne _int0x21_ser0x01_start

_int0x21_ser0x01_ser0x01_start:
lodsb
or al,al
jz _int0x21_ser0x01__ser0x01_end

mov ah,09h
;<--- Farbattribut  0 = Schwarz  1 = Blau  2 = Grün 3 = Türkis 4 = Rot 5 = Magenta 6 = braun 7 = Hellgrau 8 = Dunkelgrau 9 = Hellblau a = Hellgrün b = Helltürkis c = Hellrot d = Hellmagenta e = gelb f = weiß
mov cx,0001h
int 10h

;Cursorposition auslesen
mov ah,03h
int 10h
inc dl

;und Cursorposition schreiben
mov ah,02h
int 10h
jmp _int0x21_ser0x01_ser0x01_start
_int0x21_ser0x01__ser0x01_end:
jmp _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
;funktionen
;....
ich hoffe du kannst damit was anfangen
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

 

Einloggen