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.


Nachrichten - Feuermonster

Seiten: [1] 2
1
OS-Design / Re: Multitasking und Warten auf Ressourcen
« am: 15. May 2009, 00:26 »
Nur kann das nicht funktionieren. get_key wird ueber ein rpc_call_func aufgerufen. (rpc_call_func ist eine Funktion vom Int21h). Solange get_key also nicht returnt, wird kein weiterer Interrupt mehr ausgeloest. D.h schlussendlich klappt das dann doch nicht.

Oder gehen dann nur Hardwareinterrupts nicht mehr? (Was bei get_key auch ziemlich doof waere) Ich meinte jedoch bevor ich ein iret mache, gehe nichts mehr. Und iret kann ich erst machen, wenn get_key fertig ist.

Irgendwie kann Multitasking so gar nicht aufgehen :( Daraus schliesse ich, eine Funktion im Kernel darf keinen Polling enthalten sonst geht Multitasking kaputt. Das einzige was geht sind wirklich Messages irgendwie zu verschicken.
2
OS-Design / Re: Multitasking und Warten auf Ressourcen
« am: 14. May 2009, 23:48 »
Hier nimmst du einfach an, dass der focus_task wenn er einen Status von SLEEPING hat, eine Taste angefordert hat, muss er ja aber nicht zwingend.

unsigned int request_count = 0;
void get_key(void* ptr, unsigned short process_id) {
request_count++;  //Wir wollen ja den naechsten Key, nicht den, den wir 1 Sekunde
              //Zuvor gedrueckt haben.
start:
  if(process_has_focus(process_id)) {
     if(new_key == 1) {
       *ptr = key;
       new_key = 0;
       request_count--;
     } else {
       add_to_request_list(process_id);
       schd_dont_schedule(process_id);
       goto start;
     }
  } else {
     add_to_request_list(process_id);
     schd_dont_schedule(process_id);
     goto start;
  }
}
 
void irq1() {
  key = read_key();
  if(request_count > 0) new_key = 1;
  reschedule_all_in_requst_list();
}

Koennte das so klappen?

Edit: Nein. new_key = 0; macht Probleme da new_key nicht auf dem Stack liegen darf. Das ist kniffliger als ich dachte.

IRQ1 muesste ueberpruefen, ob jemand eine Taste angefordert hat, wenn nicht, darf es new_key nicht auf 1 setzen.

Edit2: Mit request_count muesste es aber gehen.


Ausserdem gefaellt mir die Idee dass Treiber dem Scheduler Befehle geben irgendwie nicht? Machen das Windows/Linux-Treiber auch so?


In Tyndur laeuft das alles anscheinend ueber Callbacks. Das ist wohl am einfachsten. Jeder Task der Tastendruecke empfangen will, erhaelt sie, ob er sie zu der Zeit braucht, muss der Task dann halt selber entscheiden. (Eg. der GUI-Prozess leitet sie dann selber weiter)


Edit3

Dann bleibt noch die Frage, wie ich die Callbacks aufrufen soll. Wenn ich sie einfach so aufrufe, geht das natuerlich nicht. (Wenn jemand ein while(1); im Callbackhandler hat, steht der Rechner still).

Laeuft das ueber den Scheduler? Wenn der Scheduler einen Task wechselt, schaut er ob Nachrichten fuer ihn da sind und schickt die ihm dann?
3
OS-Design / Re: Multitasking und Warten auf Ressourcen
« am: 14. May 2009, 23:25 »
Angenommen ich leg den Task schlafen wenn er get_key aufruft und keinen Fokus hat. So, wann ist es Zeit ihn wieder zu wecken? Theoretisch muesste ich dann bei jedem IRQ1 pruefen, ob ein Task der frueher get_key gemacht hat, mittlerweile den Fokus erhalten hat?


Pseudocodemaessig wohl etwa so:

get_key(void* ptr, pid)
start
  Hat Prozess Fokus?
    Nein:
      In Requestliste fuegen
      Schlafen Legen
      goto start
    Ja:
     taste_angekommen = true?
       Nein:
        In Requestliste fuegen
        Schlafen legen
        goto start
       Ja:
       *ptr = taste
      return
IRQ1:
  taste_angekommen = true
  gehe alle eintrage in der Requestliste durch
     alle prozesse in der warte listen wieder schedulen
4
OS-Design / Re: Multitasking und Warten auf Ressourcen
« am: 14. May 2009, 23:03 »
Was waere wenn zwei Tasks auf Daten vom COM1 warten? Da kann ich ja schlecht einen Vordergrund und einen Hintergrundtask definieren.

Da koennte ich Notfalls eine Queue einbauen, die die Daten halt der Reihe nach zurueckgibt.

Das ganze geht dann aber weiter: Angenommen ein Task wartet auf eine Taste und einen Antwort vom COM1. Wenn ich den Prozess bei get_key schlafen lege, kann er keine Antwort mehr vom COM1 erhalten, bis er eine Taste erhalten hat. Wenn ich ihn nicht schlafen lege, returnt get_key ohne dass er eine Taste erhalten hat.


Fraglich ist auch, wie get_key den Task schlafen legen lassen soll?

Task A befindet sich ja in get_key drin. Kann ein Task sich selber schlafen legen?

Mein get_key sieht etwa so aus, taste_angekommen wird auf true gesetzt, wenn irq1 gecallt wurde.

get_key(void* ptr)
  do while taste_angekommen = false
  loop
  *ptr = taste
 return

Das koennte ich erweitern zu

get_key(void* ptr,pid)
  if(pid->has_focus()) {
   while(taste_angekommen == false);
   *ptr = taste; return;
  }
  else {
    dont_schedule(pid);
  }

irq1:
 taste_angekommen = true

Wann weiss ich nun, wann ich den Task wieder schedulen muss?
5
OS-Design / Multitasking und Warten auf Ressourcen
« am: 14. May 2009, 22:34 »
Guten Abend,

Das Problem an  präemptivem Multitasking ist einerseits, was passiert wenn zwei Tasks die gleiche Ressource anfordern, bzw. auf das gleiche warten?

In meinem Fallbeispiel gibt es zwei Tasks die immer gerne Zeichen von der Tastatur erhalten moechten.

Task A ruft nun get_key auf.
Task B kommt zum Zug
Task B ruft auch get_key auf -> Booom!
Eine Taste wird gedrueckt

Problem Nr 1.)

Rufen zwei Tasks die gleiche Funktion auf, greifen sie auf die gleichen Adressen zu (int i; in get_key ist ja immer an der gleichen Stelle)

Problem Nr 2.)

Wer bekommt die Taste?


get_key muss auf IRQ1 warten. Der Tastaturtreiber soll dem Scheduler also sagen, dass der aufrufende Task erst wieder gescheduled werden soll, wenn der Tastenanschlag da ist? (Ein Tastaturtreiber???)


Ich konnte mir noch keine Loesung die 100%ig passt zusammen denken, und waere daher dankbar fuer eine kleine Unterstuetzung ;)
6
Lowlevel-Coding / Re: Calls und IVT
« am: 01. May 2009, 16:17 »
Vielen Dank fuer die Hilfe. Ich habe den Code jetzt mal aufgeraeumt.

;===========
; Kernel
;===========

; Update segment registers
mov ax, 0x1000
mov ds, ax
mov es, ax

push dx
push es
xor ax, ax
mov es, ax
mov bx, cs
cli
mov word [es:0x21*4], noos_int21h
mov [es:0x21*4+2], bx         
mov word[es:(9*4)  ], noos_keyboard_handler    ;Offset
mov word[es:(9*4)+2], bx                 ;Segment
sti
pop es
pop dx

mov si, s_noos_logo
xor bh, bh
mov bl, 0x05
mov dl, 0x01
int 0x21

noos_loop:
jmp noos_loop

;=============
; Variables
;=============

s_noos_logo db "[ NoOS ]",0
s_noos_jmp_good db  " Jump into kernel successful",0
s_noos_step1 db " Setting up syscalls",0
s_noos_step2 db " Syscalls (INT 0x021) set",0
s_noos_step3 db " Reading from CMOS (Month)",0
s_noos_step4 db " And the month is: ",0
s_noos_keyp db "KEY_PRESSED",0
s_noos_i_info db "Options",13,9,"1.) Show copyright",13,9,"2.) Calc test",0
s_noos_i_autor db "NoOS (c) by Roman Muentener",0
s_noos_i_calc_end db "Calc test done...",0

;==============
; Handlers
;==============

noos_keyboard_handler:
  pusha
 
  ; Print dummy message
  mov bl, 0x06
  xor bh, bh
  mov dl, 0x01
  mov si, s_noos_keyp
  int 0x21
 
  ; Tell the PIC we handled the interrupt
  mov  al, 0x20
  out  0x20, al
 
  popa
  iret

;==============
; Functions
;==============

noos_int21h:
 
  ;Jump to the right function
  cmp dl, 0x01
  je noos_int21h_0x1
  cmp dl, 0x02
  je noos_int21h_0x2
  cmp dl, 0x03
  je noos_int21h_0x3
  cmp dl, 0x04
  je noos_int21h_0x4
  cmp dl, 0x05
  je noos_int21h_0x5
 
  iret
 
  ;=========
  ;noos_print
  ; BL = Attribute, SI = String
  ;=========
  noos_int21h_0x1:
    lodsb ;Load byte
or al, al ;Zero byte?
jz noos_int21h_0x1_end

; Call noos_putchar
mov dl, 0x02
int 0x21

;Loop
jmp noos_int21h_0x1

noos_int21h_0x1_end:
  iret
 
  ;============
  ;noos_putchar
  ; BL = Attribute, AL = Character, BH = Page
  ;============
  noos_int21h_0x2:
mov cx, 1
    mov ah, 0x09
    int 0x10

; Call noos_inc_column
mov dl, 0x05
int 0x21

iret

  ;===================
  ;noos_get_cursor_pos
  ; ret: AL = Column, ret: AH = Row
  ;===================
  noos_int21h_0x3:
mov ah, 0x03
int 0x10
mov al, dl
mov ah, dh
iret

  ;===================
  ;noos_set_cursor_pos
  ; AL = Column, AH = Row, BH = Page
  ;===================
  noos_int21h_0x4:
mov dl, al
mov dh, ah
mov ah, 0x02
int 0x10
iret

  ;============
  ;noos_inc_column
  ;============
  noos_int21h_0x5:

; Call noos_get_cursor_pos
mov dl, 0x03
int 0x21

; Increment
inc al

; Call noos_set_cursor_pos
mov dl, 0x04
    int 0x21

iret



times 1474048-($-$$) db 0

Der Handler wird jetzt aufgerufen, jedoch nur einmal. Was ist noch falsch?
7
Lowlevel-Coding / Re: Calls und IVT
« am: 01. May 2009, 15:45 »
Kann ich wenn ich innerhalb des Interrupts 0x21 bin,
einen weiteren Interrupt 0x21 ausloesen?

Genau gesagt, wenn die Funktion 0x3 fuer jedes Byte die Funktion 0x2 aufruft mittels mov dl,0x02 int 0x21, geht das in Ordnung?

Edit: Hat jemand eine Idee wieso der keyboard_handler nicht funktioniert?
8
Lowlevel-Coding / Re: Calls und IVT
« am: 01. May 2009, 15:31 »
Ein iret geht nicht, da ich ja zwischen den Interrupts auch calls habe. wenn func4 mittels call func5 aufruft und func5 wuerde mit iret ja sofort den ganzen Interrupt zufrueh beenden.

D.h ich muss das Design der Interrupts wohl umschreiben.
9
Lowlevel-Coding / Re: Calls und IVT
« am: 01. May 2009, 14:38 »
Zitat
Du registrierst einen IRQ1 Handler, richtig? Und du willst den BIOS Interrupts zum Empfangen einer Taste verwenden richtig? Beides zusammen geht nicht, wie MNemo bereits sagte, da damit der BIOS Interrupt funktioniert der IRQ1 Handler nicht verändert werden darf. Das BIOS wartet ja schließlich auf einen IRQ1, um vom Tastendruck was mitzubekommen. Und du klaust dem BIOS durch das Umbiegen der IVT einfach so den IRQ1.

Eben registriere ich ihn nicht. Der keyboard handler funktioniert nicht. Ich will den int 16h gar nicht, der steht einfach so da damit ich wenigstens etwas habe womit ich Eingaben verwerten kann (was irgendwie auch nicht so richtig funktionert, er springt nicht mehr nach loopi zurueck).

Eigentlich will ich nur dass bei jedem Tastendruck mein keyboard_handler aufgerufen wird. Die Funktion zum den Tastendruck nachher auszulesen bau ich dann schon selber, aber dazu muss erst mal der Handler funktionieren.

Edit: Ich hab jetzt mal folgendes getaetigt

push dx
push es
xor ax, ax
mov es, ax
mov bx, cs
cli
mov word [es:0x21*4], _int0x021 
mov [es:0x21*4+2], bx         

mov word[es:(9*4)  ], keyboard_handler    ;Offset
mov word[es:(9*4)+2], bx                 ;Segment


sti
pop es
pop dx

Der Int 16h funktioniert nun nicht mehr, dass ist soweit ja wie es sein sollte.

Doch der keyboard_handler wird nicht aufgerufen. Oder die Nachrichtenausgabe failt, aber wenn ich ein int 0x09 schreibe, wird sie ausgegeben. Also tendiere ich eher dazu, dass die CPU meinen keyboard_handler nicht aufruft.
10
Lowlevel-Coding / Re: Calls und IVT
« am: 01. May 2009, 14:21 »
>hier wirst du nicht vorbei kommen, wenn du nicht den int0x16 auch noch selbst machst. Wie soll denn das BIOS mitkriegen das ne taste gedrückt wurde wenn du ihm den IRQ klaust und deine keyboard_handler dran hängst.

Wenn der keyboard_handler funktioniert, dann ja. Momentan tut er das nicht, der int 16h funktioniert.

Wenn ich die Taste 1.) druecke, wird die Nachricht "[..] (c) Roman [...]" ausgegeben. Danach ist jedoch fertig. Theoretisch sollte ich ja wieder zur Auswahl kommen -> ist jedoch nicht der Fall.

>außerdem gehst du für den handler von codsegemnt 0 aus. für den int 21 nimmst du das aktuelle cs, die sollten beide im aktuellen cs liegen, sonst stimmen die offsets nicht.

CS aendere ich ja noch nicht. Soll ich das auch wie es auf 0 setzen?


Wenn ich

push dx
    push es
    xor ax, ax
    mov es, ax
mov cs, ax
    cli
    mov word [es:0x21*4], _int0x021 
    mov [es:0x21*4+2], cs         

mov word[es:(9*4)  ], keyboard_handler    ;Offset
mov word[es:(9*4)+2], cs                  ;Segment


    sti
    pop es
    pop dx

schreibe, bleibt der Kernel haengen. (Die nachricht Syscalls set kommt dann gar nicht mehr).
11
Lowlevel-Coding / Calls und IVT
« am: 01. May 2009, 13:15 »
Hallo,

ich habe versucht einen Handler fuer das Keyboard zu setzen, doch leider klappt dies irgendwie nicht. (keyboard_handler wird nie aufgerufen)

Ein weiteres Problem ist, dass nach dem call show_info der Kernel irgendwie haengen bleibt und ich kann mir nichts ausdenken, was dazu fuehren koennte. Eine unmittelbare Ausgabe auf den Bildschirm nach call show_info funktioniert nicht, d.h das jmp _continue nach call show_info wird gar nicht erst aufgerufen.

Code:

mov ax, 0x1000 ;update segment register...
mov ds, ax
mov es, ax

init0:
mov si,s_noos_init0
call noos_putstr


mov bl, 0x05
mov si, s_noos_logo
call noos_printf
mov bl, 0x02
mov si, s_noos_jmp_good
call noos_printf
call noos_inc_line
call noos_reset_line

mov bl, 0x05
mov si, s_noos_logo
call noos_printf
mov bl, 0x02
mov si, s_noos_step1
call noos_printf
call noos_inc_line
call noos_reset_line


push dx
    push es
    xor ax, ax
    mov es, ax
    cli
    mov word [es:0x21*4], _int0x021 
    mov [es:0x21*4+2], cs         

mov word[ds:(9*4)  ], keyboard_handler    ;Offset
mov word[ds:(9*4)+2], 0                  ;Segment


    sti
    pop es
    pop dx


mov bl, 0x05
mov si, s_noos_logo
mov dl, 0x03
int 0x021


mov bl, 0x02
mov si, s_noos_step2
mov dl, 0x03
int 0x021
mov dl, 0x07
int 0x021
mov dl, 0x08
int 0x021


mov bl, 0x05
mov si, s_noos_logo
mov dl, 0x03
int 0x021


mov bl, 0x02
mov si, s_noos_step3
mov dl, 0x03
int 0x021
mov dl, 0x07
int 0x021
mov dl, 0x08
int 0x021

mov bl, 0x05
mov si, s_noos_logo
mov dl, 0x03
int 0x021


mov bl, 0x02
mov si, s_noos_step4
mov dl, 0x03
int 0x021


mov dl, 0x09
int 0x021

mov bl, 0x06
mov dl, 0x03
int 0x021
mov dl, 0x07
int 0x021
mov dl, 0x08
int 0x021

mov bl, 0x0A
mov si, s_noos_i_info
mov dl, 0x03
int 0x021
mov dl, 0x07
int 0x021
mov dl, 0x08
int 0x021

loopi:
mov ah,00h
int 16h


mov bl,0x08
cmp al,0x31
je do_show_info
cmp al,0x32
je do_calc_test

jmp _continue


do_show_info:
 call show_info
 jmp _continue
do_calc_test:
 call calc_test
 jmp _continue
 
 
_continue:
call noos_putchar
call noos_inc_row
call noos_inc_line
call noos_reset_line
jmp loopi
;Variablen
;========

s_noos_init0 db "Init 0",13,10,0
s_noos_logo db "[ NoOS ]",0
s_noos_jmp_good db  " Jump into kernel successful",0
s_noos_step1 db " Setting up syscalls",0
s_noos_step2 db " Syscalls (INT 0x021) set",0
s_noos_step3 db " Reading from CMOS (Month)",0
s_noos_step4 db " And the month is: ",0
s_noos_keyp db "KEY_PRESSED",0
s_noos_i_info db "Options",13,9,"1.) Show copyright",13,9,"2.) Calc test",0
s_noos_i_autor db "NoOS (c) by Roman Muentener",0
s_noos_i_calc_end db "Calc test done...",0

;Funktionen
;========

calc_test:
 mov cx, 0xFFFF
 calc_test_loop:
   cmp cx,0
   je calc_test_end
   dec cx
   jmp calc_test_loop
 calc_test_end:
   mov bl,0xA8
   mov si,s_noos_i_calc_end
   mov dl,0x03
   int 0x021
  retn

show_info:
 mov bl,0x0D
 mov si,s_noos_i_autor
 mov dl,0x03
 int 0x021
 retn

keyboard_handler:
 mov si,s_noos_keyp
 mov bl,0x02
 mov dl,0x03
 int 0x021
 mov  al, 0x20
 out  0x20, al
 iret

noos_reset_line:
call noos_get_cursor_pos
mov dl,0
call noos_set_cursor_pos
retn

;ret: DL = Spalte; ret: DH = Zeile
noos_get_cursor_pos:
mov ah, 0x03
int 0x10
retn


;DL = Spalte; DH = Zeile
noos_set_cursor_pos:
mov ah, 0x02
push bx
xor bh, bh
int 0x10
pop bx
retn

noos_inc_line:
call noos_get_cursor_pos
inc dh
call noos_set_cursor_pos
retn

noos_inc_row:
call noos_get_cursor_pos
inc dl
call noos_set_cursor_pos
retn

;SI = string
noos_printf:
lodsb
or al,al
jz noos_printf_end
call noos_putchar
call noos_inc_row
jmp noos_printf
noos_printf_end:
retn

;AL = char; BL = Farbe
noos_putchar:
push cx
mov cx, 1
mov ah, 0x09
int 0x10
pop cx
retn

;SI = string
noos_putstr:
lodsb
or al, al
jz noos_putstr_end
mov ah, 0x0E
mov bx, 0x07
int 0x10
jmp noos_putstr
noos_putstr_end:
retn

noos_reboot:
jmp 0xffff:0x0000

noos_getkey:
mov ah,00h
int 0x16
retn


;-------
;Syscalls
;-------


_int0x021:
 cmp dl, 0x01
 je _int0x021_f1
 cmp dl, 0x02
 je _int0x021_f2
 cmp dl, 0x03
 je _int0x021_f3
 cmp dl, 0x04
 je _int0x021_f4
 cmp dl, 0x05
 je _int0x021_f5
 cmp dl, 0x06
 je _int0x021_f6
 cmp dl, 0x07
 je _int0x021_f7
 cmp dl, 0x08
 je _int0x021_f8
 cmp dl, 0x09
 je _int0x021_f9
 iret
 
 ;noos_putstr: SI = string
 _int0x021_f1:
   push dx
   lodsb
   or al, al
   jmp _int0x021_f1_end
   mov ah, 0x0E
   mov bx, 0x07
   int 0x10
   _int0x021_f1_end:
    pop dx
   retn
 
 ;noos_putchar: AL = char, BL = farbe
 _int0x021_f2:
   push dx
   push cx
   cmp al, 0xD
   je _int0x021_f2_newline
   cmp al, 0x09
   je _int0x021_f2_tab
   mov cx, 1
   mov bh, 0x00
   mov ah, 0x09
   int 0x10
   call _int0x021_f4
   jmp _int0x021_f2_end
   _int0x021_f2_tab:
     call _int0x021_f4
call _int0x021_f4
call _int0x021_f4
call _int0x021_f4
jmp _int0x021_f2_end
   _int0x021_f2_newline:
     call _int0x021_f7
call _int0x021_f8
   _int0x021_f2_end:
    pop cx
    pop dx
    retn
   
  ;noos_printf: SI = string, BL = farbe
  _int0x021_f3:
    push dx
    lodsb
    or al,al
    jz _int0x021_f3_end
    call _int0x021_f2
pop dx
    jmp _int0x021_f3
_int0x021_f3_end:
pop dx
retn

  ;noos_inc_row
  _int0x021_f4:
    push dx
    call _int0x021_f5
    inc al
    call _int0x021_f6
pop dx
retn
 
  ;noos_get_cursor_pos: ret: AL = Spalte; ret: AH = Zeile
  _int0x021_f5:
    push dx
    mov ah, 0x03
    int 0x10
mov al,dl
mov ah,dh
pop dx
    retn

  ;noos_set_cursor_pos: ;AL = Spalte; AH = Zeile
  _int0x021_f6:
    push dx
    mov dl,al
mov dh,ah
    mov ah, 0x02
    push bx
    xor bh, bh
    int 0x10
    pop bx
pop dx
retn

  ;noos_inc_line
  _int0x021_f7:
    push dx
    call _int0x021_f5
    inc ah
    call _int0x021_f6
pop dx
retn
 
  ;noos_reset_line
  _int0x021_f8:
    push dx
    call _int0x021_f5
    mov al,0
    call _int0x021_f6
pop dx
retn

  ;noos_get_month
  _int0x021_f9:
    push dx
    mov al,0x08
out 0x70,al
in al,0x71

cmp al,0x01
je _int0x021_f9_jan
cmp al,0x02
je _int0x021_f9_feb
cmp al,0x03
je _int0x021_f9_mar
cmp al,0x04
je _int0x021_f9_apr
cmp al,0x05
je _int0x021_f9_may
cmp al,0x06
je _int0x021_f9_jun
cmp al,0x07
je _int0x021_f9_jul
cmp al,0x08
je _int0x021_f9_aug
cmp al,0x09
je _int0x021_f9_sep
cmp al,0x0A
je _int0x021_f9_oct
cmp al,0x0B
je _int0x021_f9_nov
cmp al,0x0C
je _int0x021_f9_dec

je _int0x021_f9_end

_int0x021_f9_jan:
  mov si,jan
  jmp _int0x021_f9_end
 
_int0x021_f9_feb:
  mov si,feb
  jmp _int0x021_f9_end
 
_int0x021_f9_mar:
  mov si,mar
  jmp _int0x021_f9_end

_int0x021_f9_apr:
  mov si,apr
  jmp _int0x021_f9_end
 
_int0x021_f9_may:
  mov si,may
  jmp _int0x021_f9_end
 
_int0x021_f9_jun:
  mov si,jun
  jmp _int0x021_f9_end
 
_int0x021_f9_jul:
  mov si,jul
  jmp _int0x021_f9_end
 
_int0x021_f9_aug:
  mov si,aug
  jmp _int0x021_f9_end
 
_int0x021_f9_sep:
  mov si,sep
  jmp _int0x021_f9_end
 
_int0x021_f9_oct:
  mov si,oct
  jmp _int0x021_f9_end
 
_int0x021_f9_nov:
  mov si,nov
  jmp _int0x021_f9_end
 
_int0x021_f9_dec:
  mov si,dec_
  jmp _int0x021_f9_end

mov si,unk
_int0x021_f9_end:
pop dx
retn
 
 
  retn
 _int0x021_end:
  iret
 
jan db "January",0
feb db "February",0
mar db "March",0
apr db "April",0
may db "May",0
jun db "June",0
jul db "July",0
aug db "August",0
sep db "September",0
oct db "October",0
nov db "November",0
dec_ db "December",0
unk db "Unknown",0

times 1474048-($-$$) db 0


Etwas viel ich weiss, aber ich hoffe ihr koennt mir weiterhelfen.
12
tyndur / Re: Wir suchen...
« am: 22. September 2008, 11:05 »
Ich wuerde auch gerne meinen kleinen Teil zum Community-OS beitragen. Gibt es vlt schon irgendwelche Dokumente wie man Applikationen hinzufuegt/kompiliert. (Evtl ist auch eine API-Dokumentation vorhanden?)
13
tyndur / Re: Bescherung: 0.1.1
« am: 20. September 2008, 10:07 »
Den GRUB haben wir aber seither nicht ausgetauscht. ;)

Reale Hardware? Ist evtl. die Floppy kaputt?

floppy-img unter Virtual Box.

Neuste Nightly Builds funktionieren. (Mit der Ausnahme wenn man ein Modul versucht wie eine Anwendung zu starten, das OS stehen bleibt :))
14
tyndur / Re: Bescherung: 0.1.1
« am: 16. September 2008, 20:49 »
Bei mir klappt das booten nicht.

Auf dem Bildschirm erscheint nur:

GRUB
15
Lowlevel-Coding / Re: standardfarbe 0x07 ändern bei int 0x10
« am: 15. September 2008, 20:27 »
noos_set_cursor_pos:
bei mir ist es schon bei getkey einen weiter gerückt, wenn du das meintest

Stimmt, vor getkey sollte ich die Cursorpos wieder auf 0 setzen.
16
Lowlevel-Coding / Re: standardfarbe 0x07 ändern bei int 0x10
« am: 15. September 2008, 18:52 »
so wie ich das sehe wird sie erst bei set_key geändert
vermeiden kanst du es in dem du  set_key weg lässt ... xD

set_key?
17
Das Wiki / Re: Ausgabe 10
« am: 15. September 2008, 17:50 »
Wie man Hersteller von z.b Festplatten oder aehnliches ausliest wuerde mich noch interessieren ;)
18
Lowlevel-Coding / Re: standardfarbe 0x07 ändern bei int 0x10
« am: 15. September 2008, 17:08 »
So. Ich habs nun hingekriegt.

main:
mov ax, 0x1000 ;update segment register...
mov ds, ax
mov es, ax

init0:
mov si,s_noos_init0
call noos_putstr

mov bl, 0x05
mov si, s_noos_logo
call noos_printf
mov bl, 0x02
mov si, s_noos_jmp_good
call noos_printf
call noos_inc_line

call noos_getkey

;Variablen
;========

s_noos_init0 db "Init 0",13,10,0
s_noos_logo db "[ NoOS ]",0
s_noos_jmp_good db  " Jump into kernel successful",0

;Funktionen
;========

;ret: DL = Spalte; ret: DH = Zeile
noos_get_cursor_pos:
mov ah, 0x03
int 0x10
retn


;DL = Spalte; DH = Zeile
noos_set_cursor_pos:
mov ah, 0x02
push bx
xor bh, bh
int 0x10
pop bx
retn

noos_inc_line:
call noos_get_cursor_pos
inc dh
call noos_set_cursor_pos
retn

noos_inc_row:
call noos_get_cursor_pos
inc dl
call noos_set_cursor_pos
retn

;SI = string
noos_printf:
lodsb
or al,al
jz noos_printf_end
call noos_putchar
call noos_inc_row
jmp noos_printf
noos_printf_end:
retn

;AL = char; BL = Farbe
noos_putchar:
push cx
mov cx, 1
mov ah, 0x09
int 0x10
pop cx
retn

;SI = string
noos_putstr:
lodsb
or al, al
jz noos_putstr_end
mov ah, 0x0E
mov bx, 0x07
int 0x10
jmp noos_putstr
noos_putstr_end:
retn

noos_reboot:
jmp 0xffff:0x0000

noos_getkey:
mov ah,0
int 0x16
retn

Ich hoffe das hilft vlt auch anderen weiter.



Eine kleine Frage verbleibt jedoch:

Bei getkey wird irgendwie die Cursorposition veraendert, seh ich das richtig?
Und wie kann ich dafuer sorgen, dass sie das nicht wird?
19
Lowlevel-Coding / Re: standardfarbe 0x07 ändern bei int 0x10
« am: 13. September 2008, 11:04 »
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:

ich hoffe du kannst damit was anfangen


Erstmal danke.

Ich hab es mal so probiert (die ints hab ich nicht registriert im interrupt table registriert, ich verwende call)



 
    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_stdstrout
mov si, _s_noos_jmp_good
    mov ah, 0x0A
    call _v_noos_stdstrout

call _v_noos_printlogo
mov si, _s_noos_detdrvs
mov ah, 0x07
call _v_noos_stdstrout

mov si, _s_noos_drv00
mov ah, 0x07
call _v_noos_stdstrout

mov dl,0x00
call _v_noos_get_drv_state
cmp ah,00h
jne _l_noos_gdrvchk_error

mov si, _s_noos_drv01
mov ah, 0x07
call _v_noos_stdstrout

;mov dl,0x01
;call _v_noos_get_drv_state
;cmp ah,00h
;jne _l_noos_gdrvchk_error

jmp _l_noos_chk_end

_l_noos_gdrvchk_error:
call _v_noos_drvchk_error
retn

_l_noos_chk_end:


 
    mov si,msg_boot
mov ah, 0x07
    call _v_noos_stdstrout ;_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",0
_s_noos_detdrvs db " Detecting drives...",0
_s_noos_drv00 db "         drive 00...",0
_s_noos_drv01 db "         drive 01...",0
_s_noos_drv80 db "         drive 80....",0
_s_noos_drv81 db "         drive 81....",0
_s_noos_drvchk_error db "          DRIVE ERROR!",0
    msg_boot db "Press any key...",0
ent db "",13,10,0
 
    ; Funktionen

;%%%%%%%%%%%
_v_noos_drvchk_error:
mov si,_s_noos_drvchk_error
mov ah,0x04
call _v_noos_stdstrout
retn

;%%%%%%%%%
;ret: AH = Fehlercode
;DL = Laufwerknummer
;==============

_v_noos_get_drv_state:
mov ah,0x00
int 0x13
retn

;%%%%%%%%%
_v_noos_printlogo:
mov si, _s_noos_logo
call _v_noos_stdstrout

;%%%%%%%
;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:
push bx
mov bl,ah
mov al,0x01
mov ah,01h
call _int0x21
mov si, ent
mov al, 0x01
call _int0x21
pop bx
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

_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:
retn
;funktionen

Die Ausgabe sieht so aus:

]


 Detecting drives
             drive 00...
             drive 01...
Press any key...




Das ']' hat die Farbe gelb. Irgendwie heisst das ja, dass alles ausgegeben wird, was bl,0x07 hat, nicht aber das, was eine andere Farbe hat?
20
Lowlevel-Coding / Re: standardfarbe 0x07 ändern bei int 0x10
« 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.
Seiten: [1] 2

Einloggen