ein weiteres mal floppy



  • ich habe einen totalen knoten... es gelingt mir nicht in meinem bootstrapper von floppy zu lesen. ich hab jetzt schon einmal den bootstrapper neu geschrieben und etwa 3 mal den floppy code:

    ;floppy reset
    reset:  mov ah,00h
        mov dl,0
        int 13h
        ret
    
    ;floppy lesen
    load:   mov cx,3
    retry:  call reset
        cmp cx,0
        dec cx
        je fehler
        push cx
        mov ah,02
        mov al,2
        mov ch,0
        mov cl,2
        mov dh,0
        mov dl,0
        mov bx,01000h
        push word 0000h
        pop es
        int 13h
        pop cx
        jc retry
    ende:   ret
    fehler: stc
        ret
    

    ich lass das immer in bochs laufen der meldet mir das folgende:

    Event type: PANIC
    Device: [PIC  ]
    Message: [PIC  ] io write to port 00a0, len=2
    

    ich habe aber noch nie den pic auch nur angetastet (jedenfalls nicht wissentlich)
    kann mir einer helfen ich verzweifle langsam



  • schieb 😃
    kann mir wirklich keiner helfen? oder braucht ihr den ganzen loader um das beurteilen zu können?



  • *nicht helfen kann*
    irgendwann, wenn ich mal gerade lust dazu habe, werde ich mich mal wieder eingehender mit der Thematik OS-Proggen beschaeftigen.

    Hast du deinen Bootsector ueberhaupt schonmal ausserhalb von Bochs laufen lassen? Ich wuerde da auch mal in erwaegung ziehen, dass Bochs nen Fehler hat und nicht dein Code 😉



  • Poste mal ein bisschen mehr von deinem Code.
    Hast du ganz sicher ss, sp und bp initialisiert (du benutzt ja kräftig den Stack)?

    btw:

    mov bx, 01000h
    push word 0000h
    pop es

    Ich bin mir nicht ganz sicher, aber ich glaube die physikalische adresse 1000h ist schon durch was anderes belegt. Ich würde es mal mit dem Segment 1000h und dem Offset 0 versuchen.



  • edit: die source geht jetzt *phreu*

    [BITS 16]
    [ORG 7c00h]
    
    ;stack initialisieren
    cli
    mov ax, 09000h
    mov ss, ax
    mov sp, 0
    sti
    
    push cs
    pop ds
    
    call a20
    
    mov si,msg
    call print
    
    call load
    jnc okey
    
    mov si,error
    call print
    cli
    hlt
    
    okey:
    mov si,ok
    call print
    
    jmp 0000h:0f000h
    
    ;daten
    
    msg     db 00000111b,"lade system",0
    ok      db 00000010b,"geladen",0
    error   db 00000100b,"konnte diskette nicht lesen!",0
    
    ;prozeduren
    
    ;warten bis keyboard fertig ist
    kbwait: in al,064h
            test al,02h
            jnz kbwait
            ret
    
    ;löscht den bildschirm
    clear:  push word 0B800h
            pop es
            xor ax,ax
            xor cx,cx
            xor di,di
    cloop:  cmp cx,2000
            stosw
            je cende
            inc cx
            jmp cloop
    cende:  mov di,0
            ret
    
    ;ausgabeprozedur
    print:  push word 0B800h
            pop es
            mov ah,[si]
    next:   inc si
            mov al,[si]
            cmp al,0
            je enext
            stosw
            jmp next
    enext:  mov ax,di
            mov dl,160
            div dl
            cmp ah,0
            je pende
            mov ax,0
            stosw
            jmp enext
    pende:  ret
    
    ;a20 aktivieren
    a20:    cli
            xor ax,ax
    
            call kbwait 
            mov al,0d1h
            out 064h,al
    
            call kbwait
            mov al,0dfh
            out 060h,al
    
            call kbwait
            sti
            ret
    
    ;floppy reset
    reset:  mov ah,00h
            mov dl,0
            int 13h
            ret
    
    ;floppy lesen
    load:   mov cx,3
    retry:  call reset
            cmp cx,0
            dec cx
            je fehler
            push cx
            mov ah,02
            mov al,2
            mov ch,0
            mov cl,2
            mov dh,0
            mov dl,0
            mov bx,0f000h
            push word 0000h
            pop es
            int 13h
            pop cx
            jc retry
    ende:   ret
    fehler: stc
            ret
    
    ;restart
    restart:db 0EAh
            dw 0000h
            dw 0ffffh
    
    times 510-($-$$) db 0           ;ergänzen auf 512 bytes
    dw 0AA55h                       ;bootsektor ende
    

    [ Dieser Beitrag wurde am 01.06.2002 um 18:23 Uhr von japro editiert. ]

    [ Dieser Beitrag wurde am 01.06.2002 um 18:24 Uhr von japro editiert. ]



  • Ich bin mir nicht sicher aber hast du vergessen, bp zu initialisieren?
    Und wie ich schon erwähnt hab: Ich würde mal probieren, 1000h als Segment und nicht als Offset zu benutzen. Ich bin mir mittlerweile immer sicherer dass die adresse 0:1000h schon durch das BIOS benutzt wird (IMHO die untersten 64kb des rams).



  • du hast recht 😃 dsa wars.... (wie doof das ich da nie was anderes probiert hab)
    ich passe den code vom vorigen beitrag an damit der richtige steht 😃
    danke!!!



  • Ich hab grad einen alten Beitrag gefunden. http://www.c-plusplus.net/ubb/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=17&t=000321

    Dort steht, dass der Bereich 1000h doch frei ist. Naja....

    [ Dieser Beitrag wurde am 01.06.2002 um 18:31 Uhr von cd9000 editiert. ]


Anmelden zum Antworten