Interrupt-Vector?



  • Ok ich hab mal folgenden test-Code geschrieben:

    IDEAL
    model tiny
    P386
    codeseg
      org 0h
    
    @@Entry:
      jmp @@SkipData
      Message db "Kernel geladen!", 13, 10, 0
    
    @@SkipData:
      assume cs:@code, ds:@code, es:@code
      mov ax, cs
      mov ds, ax
      mov es, ax
    
      mov eax, [0:19h*4h]
      ;mov [dword ptr Int19], eax
      mov [Int19], ax
      shr eax, 16
      mov [Int19+2], ax
      pushf
      db 0FFh
      Int19 dw ?, ?
    
    end @@Entry
    

    Da müsste doch eigentlich int 19h (neustart) aufgerufen werden? Aber es tut sich einfach nix 😞



  • hm. der Opcode fuer den far call stimmt ja wohl auch net.
    Ich wurde folgendes vorschlagen:

    IDEAL
    model tiny
    P386
    codeseg
    org 0h

    @@Entry:
    jmp @@SkipData
    Message db "Kernel geladen!", 13, 10, 0

    @@SkipData:
    assume cs:@code, ds:@code, es:@code
    mov ax, cs
    mov ds, ax
    mov es, ax

    mov eax, [0:19h*4h]
    mov [Int19], eax
    pushf
    call [dword ptr Int19]

    Int19 dd ?

    end @@Entry



  • Ich habs hingekriegt! Nach einigen Stunden Ausprobierens.

    IDEAL
    model tiny
    P386
    
    macro NewLine
      mov al, 13
      mov ah, 0Eh
      mov bx, 7
      int 10h
      mov al, 10
      mov ah, 0Eh
      mov bx, 7
      int 10h
    endm NewLine
    
    codeseg
      org 0h
    
    @@Entry:
      jmp @@SkipData
      StartMsg db "Kernel geladen, cs = ", 0
    
    @@SkipData:
      assume cs:@code, ds:@code, es:@code
      mov ax, cs
      mov ds, ax
      mov es, ax
    
      mov si, offset StartMsg
      call Print
    
      mov ax, 0
      mov ds, ax
    
      mov ax, cs
      mov es, ax
      mov ax, [word ptr 24h]
      mov [es:OldInt9], ax
      mov ax, [word ptr 26h]
      mov [es:OldInt9+2], ax
    
      cli
      mov [word ptr 24h], offset Int21Handler
      mov [word ptr 26h], 1000h
      sti
    
    @@hang:
      jmp @@hang
    
    ; Erwartet die Adresse des auszugebenden nullterminierten Puffers in DS:SI
    proc Print far
    @@PrintLoop:
      lodsb
      cmp al, 0
      je @@PrintEnde
      mov ah, 0Eh
      mov bx, 7
      int 10h
      jmp @@PrintLoop
    @@PrintEnde:
      retf
    endp Print
    
    TasteGedrueckt db "Taste gedrueckt!", 0
    proc Int9Handler far
    
      ; Den Original-Handler des BIOS aufrufen
      pushf
      db 09Ah         ; far call
      OldInt9 dw ?, ?
    
      mov si, offset TasteGedrueckt
    
      iret
    endp Int9Handler
    
    end @@Entry
    

    Ich weiß nicht so ganz wo der Fehler jetzt eigentlich lag. Vielleicht daran, dass ich nicht den alten int9 handler des BIOS aufgerufen habe.
    Ist ja auch egal, hauptsache es klappt 🙂 🙂



  • Aja jetzt fällts mir wieder ein, der Fehler ist folgender:
    [0:24h]
    Das wird vom TASM seltsamerweise zu [ds:24h] ausgewertet. Und da ds natürlich nicht 0 war hat es nicht geklappt.



  • Das wuerde nicht nur TASM so interpretieren. Ein Speicherzugriff wird immer aus einem Segmentregister und dem Offset errechnet.
    Ist mir gar nicht aufgefallen... In den ersten Codeausschnitten, die du gepostet hast, wars schliesslich auch noch richtig 😕



  • Naja ich versteh ja auch nicht so ganz warum es nicht geklappt hat, aber das ist doch jetzt eh egal 🙂

    Eine sache noch:
    Wenn ich den alten Handler des BIOS nicht aufrufe, reagiert er auf einen einzigen Tastendruck und dann hängt er sich (anscheinend) auf und macht nix mehr. Was macht denn der Handler des BIOS so wichtiges?



  • Dann poste doch bitte nochmal den richtigen code bzw. berichtige den im letzten Post...
    Da wird schliesslich irgendwie ein Offset von einem "Int21Handler" den ich da nirgends sehe in den Int9-Vector geschrieben und im int9Handler wird nur der alte int9 aufgerufen und dann si gesetzt. Also sollte eigentlich sowieso gar nichts passieren, wenn eine Taste gedrueckt wird. 😕



  • Der Code war schon fast richtig: 😉

    IDEAL
    model tiny
    P386
    
    macro NewLine
      mov al, 13
      mov ah, 0Eh
      mov bx, 7
      int 10h
      mov al, 10
      mov ah, 0Eh
      mov bx, 7
      int 10h
    endm NewLine
    
    codeseg
      org 0h
    
    @@Entry:
      jmp @@SkipData
      StartMsg db "Kernel geladen!", 0
    
    @@SkipData:
      assume cs:@code, ds:@code, es:@code
      mov ax, cs
      mov ds, ax
      mov es, ax
    
      mov si, offset StartMsg
      call Print
      NewLine
    
      mov ax, 0
      mov ds, ax
    
      mov ax, cs
      mov es, ax
      mov ax, [word ptr 24h]
      mov [es:OldInt9], ax
      mov ax, [word ptr 26h]
      mov [es:OldInt9+2], ax
    
      cli
      mov [word ptr 24h], offset Int9Handler
      mov [word ptr 26h], 1000h
      sti
    
    @@hang:
      jmp @@hang
    
    ; Erwartet die Adresse des auszugebenden nullterminierten Puffers in DS:SI
    proc Print far
    @@PrintLoop:
      lodsb
      cmp al, 0
      je @@PrintEnde
      mov ah, 0Eh
      mov bx, 7
      int 10h
      jmp @@PrintLoop
    @@PrintEnde:
      retf
    endp Print
    
    TasteGedrueckt db "Taste gedrueckt!", 0
    proc Int9Handler far
      pusha
      push ds
    
      ; Den Original-Handler des BIOS aufrufen
      pushf
      db 09Ah         ; far call
      OldInt9 dw ?, ?
    
      mov ax, cs
      mov ds, ax
      mov si, offset TasteGedrueckt
      call Print
    
      pop ds
      popa
      iret
    endp Int9Handler
    
    end @@Entry
    


  • hey,will auch 😞 😃
    komisch auf die idee cs auszugeben bin ich auch mal gekommen ,allerdings gings bei mir um org 100h
    wenn ich sowas lese kriege ich immer lustig auch wieder was zu machen und werde aktiv,ich hab s recht schnell hinbekommen aber es funzt nur einmal danach is sense!? 😮

    .model tiny
    .code
    org 0100h
    START:
    jmp go
    
    go:
    mov ax,7b00h
    xor dx,dx
    mov bx,16
    div bx
    push ax
    pop ds
    cli;
    mov ax,9000
    mov ss,ax
    mov sp,00h
    sti;
    cld;
    call print
    
    cli
    xor ax,ax
    push ax
    pop es
    mov ax,4
    mov bx,9
    mul bx
    push ax
    pop di
    mov ax,offset key;
    add ax,7b00h
    stosw
    xor ax,ax
    stosw
    sti
    
    hang:
    jmp hang
    
    message db "Hello this is bigOS v0.002 and cs is: ",0
    
    print:
    mov si, offset message
    xor di,di;
    
    read:
    lodsb
    mov ah,0eh
    or al,al
    jz ende
    int 10h
    jmp read;
    ende:
    push cs
    pop ax
    call intout;
    ret
    
    intout:  ;parameter in ax!!!!!!!
    or ax,ax
    jz was_zero
    mov cx,5
    mov bx,10000
    loop________1:
    xor dx,dx
    div bx
    mov ah,0eh
    or al,al
    add al,48
    int 10h
    mov ax,bx
    push dx
    xor dx,dx
    mov bx,10
    div bx
    mov bx,ax
    pop ax
    loop loop________1
    ret
    was_zero:
    zero_________2:
    mov ah,0eh
    add al,48
    int 10h
    ret;
    
    key:
    mov al,'.'
    mov bl,33
    mov ah,0eh
    int 10h;
    iret
    
    org 2feh
    db 0aah,055h
    END START
    


  • @ cd9000 das dein system ohne den orginal tastaturhandler nur ein zeichen auswertet und dann einfriert liegt daran, dass du auch die tastaturpuffer weieder freischalten must, und die interuptsperre wieder aufheben musst. ( letzteres weis ich nicht genau. was ein hwint alles macht. ersteres sind glaubich 2 bis 3 out befehle um den tastaturbaustein wieder entsprechend vorzubereiten.(müsste heut abend mal nachschauen, hab mal so nen tastaturhandler selber geschrieben))

    gruss termite


Anmelden zum Antworten