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.


Themen - nore

Seiten: [1]
1
ich hab mit einigem abwandlungen eine zweite funktion daraus gebastelt, die sektoren schreiben soll. beim ersten test hat diese auch funktioniert, jetzt funktioniert sie nicht mehr. dabei hab ich auch hier einen seek- sowie calibrate-befehl drin. vielleicht entdeckt ja einer von euch den fehler:


  _writesec:
  push ebp
  mov ebp, esp
    push ecx
    push edx
    push ebx
    mov cl, [ebp+0x8]         ; cylinder
    mov ch, [ebp+0xc]         ; head
    mov ah, [ebp+0x10]        ; sector
    mov ebx, [ebp+0x14]       ; speicheradresse

    mov al, 0x14
    out 0x08, al               ; dma deaktivieren
    mov al, 0x5A
    out 0x0b, al               ; einzel, adressinc, kein autoinit, lesen, kanal2
    out 0x0c, al               ; flip-flop leeren
    mov al, bl
    out 0x04, al               ; niederwertiges adressbyte schicken
    shr ebx, 8
    mov al, bl
    out 0x04, al               ; höherwertiges adressbyte schicken
    shr ebx, 8
    mov al, bl
    out 0x81, al               ; page-byte senden
    out 0x0c, al               ; flip-flop leeren
    mov al, 0xFF
    out 0x05, al               ; wie viele zugriffe (bytes)(niederwertiges byte)  (gesamtzugriffe-1=angegebene zahl)
    mov al, 0x1
    out 0x05, al               ; wie viele zugriffe (bytes)(höherwertiges byte)
    mov al, 0x02
    out 0x0A, al               ; mögliche maskierung aufheben
    mov al, 0x10
    out 0x08, al               ; dma wieder aktivieren

    mov     al, 0x1c
    mov     dx, 0x03f2
    out     dx ,al           ; diskettenlaufwerks-motor einschalten (laufwerk A, über dma, ...)

    mov al,7
    call writediskdata
    mov al,0
    call writediskdata       ; neu kalibrieren
    push dword 200
    call _delay
    add esp, 0x4

    mov al,3
    call writediskdata
    mov al,0x0F
    call writediskdata
    mov al,2
    call writediskdata       ; laufwerkdaten festlegen

    mov al,0Fh               ;Seek (positionier) Kommando
    call writediskdata
    mov al, ch
    shl al, 2                ; head
    call writediskdata
    mov al,cl                ;Spur
    call writediskdata
    push dword 200
    call _delay
    add esp, 0x4

    mov al, 0x45             ; erstes byte des write-befehls
    call writediskdata
    mov al, ch
    shl al, 2                ; head
    call writediskdata
    mov al, cl               ; cylinder
    call writediskdata
    mov al, ch               ; head
    call writediskdata
    mov al, ah                ; sector
    call writediskdata
    mov al, 2                ; sectorsize (128*2^2)
    call writediskdata
    mov al, 18               ; secpertrack
    call writediskdata
    mov al, 27               ; länge von GAP3 (??)
    call writediskdata
    mov al, 0x00             ; bytes to read (standardwert, da sectorsize!=0) (??)
    call writediskdata

    push dword 1000
    call _delay
    add esp, 0x4

    mov     al, 00h
    mov     dx, 0x03f2
    out     dx,al           ; motor wieder aus
    pop ebx
    pop edx
    pop ecx
  mov esp, ebp
  pop ebp
  ret


der befehl sollte wie man sehen kann, einfach einen sektor von einer bestimmten speicheradresse auf diskette schreiben. aber hinterher ist der sektor auf der diskette unverändert.
2
hi, ich hab zum lesen eines tracks von diskette einen kleinen sofware-interrupt geschrieben, den ich dann mit einer funktion aufrufe. der hat anfangs sowohl unter bochs als auch an diversen richtigen PCs funktioniert. seit ungefähr einer woche tut er dies allerdings nicht mehr. unter bochs funktioniert es noch, aber am richtigen PC nicht mehr.
das interessante daran ist: ich habe unmittelbar davor an der ISR dieses interrupts nichts geändert. ich habe jetzt schon einige stunden mit fehlersuchen verbracht und bin mittlerweile echt am verzweifeln.

anbei poste ich den code der ISR und hoffe, ihr könnt mir helfen.

kurze bemerkungen: in eax steht beim aufruf die adresse, an die der track geladen werden soll, in ch steht der kopf und in cl der zylinder.
die funktion delay funktioniert (unabhängig von diesem interrupt getestet) und erwartet millisekunden in einem unsigned long.
ob der track in den arbeitsspeicher geladen wurde teste ich mit einer funktion, die mit sehr großer wahrscheinlichkeit fehlerfrei läuft (andere speicherstellen werden richtig angezeigt).

hier also der code der ISR:

  _int_0x30:
  push edx
  push eax
    mov al, 0x14
    out 0x08, al               ; dma deaktivieren
    mov al, 0x56
    out 0x0b, al               ; einzel, adressinc, kein autoinit, schreiben, kanal2
  pop eax
    out 0x0c, al               ; flip-flop leeren
    out 0x04, al               ; niederwertiges adressbyte schicken
    shr eax, 8
    out 0x04, al               ; höherwertiges adressbyte schicken
    shr eax, 8
    out 0x81, al               ; page-byte senden
    out 0x0c, al               ; flip-flop leeren
    mov al, 0xFF
    out 0x05, al               ; wie viele zugriffe (bytes)(niederwertiges byte)  (gesamtzugriffe-1=angegebene zahl)
    mov al, 0x23
    out 0x05, al               ; wie viele zugriffe (bytes)(höherwertiges byte)
    mov al, 0x02
    out 0x0A, al               ; mögliche maskierung aufheben
    mov al, 0x10
    out 0x08, al               ; dma wieder aktivieren

    mov     al, 0x1c
    mov     dx, 0x03f2
    out     dx ,al           ; diskettenlaufwerks-motor einschalten (laufwerk A, über dma, ...)

    mov al,7
    call writediskdata
    mov al,0
    call writediskdata       ; neu kalibrieren

    mov al,3
    call writediskdata
    mov al,0x0F
    call writediskdata
    mov al,2
    call writediskdata       ; laufwerkdaten festlegen

    mov al, 0x46             ; erstes byte des read-befehls
    call writediskdata
    mov al, ch
    shl al, 2                ; head
    call writediskdata
    mov al, cl               ; cylinder
    call writediskdata
    mov al, ch               ; head
    call writediskdata
    mov al, 1                ; sector
    call writediskdata
    mov al, 2                ; sectorsize (128*2^2)
    call writediskdata
    mov al, 18               ; secpertrack
    call writediskdata
    mov al, 27               ; länge von GAP3 (??)
    call writediskdata
    mov al, 0xFF             ; bytes to read (standaradwert, da sectorsize!=0) (??)
    call writediskdata

    push dword 0x400   ;1024
    call _delay
    pop eax

    mov     al, 00h
    mov     dx, 0x03f2
    out     dx,al           ; motor wieder aus
  pop edx
  iret
3
Lowlevel-Coding / irq 6 nach floppy-zugriff über dma?
« am: 21. March 2006, 16:58 »
hi, wenn ein datentransfer über den fdc mit dma zu ende ist, sollte doch normalerweise irq 6 ausgelöst werden, oder?

ich habe nämlich zurzeit das problem, dass ich nicht weiß, wann ich den diskettenmotor wieder ausstellen soll. zurzeit setzt meine isr für den irq 6 einfach nur eine variable auf 0 und meine funktion zum lesen von der diskette wartet vor dem motor-ausschalten solange bis die variable 0 ist. allerdings passiert das nie, ich komme in eine endlosschleife.

wenn ich diese abfrage einfach weglasse, schaltet die cpu anscheinend den motor aus, bevor der transfer beendet ist. unter bochs läuft diese variante. vllt weil es so langsam ist??
4
Das Wiki / tutorial section
« am: 10. March 2006, 07:28 »
Hi, auf der seite http://lowlevel.net.tc/ unter tutorials wird nur komisches zeug angezeigt, aber nicht mehr die tutorials.
5
Das Wiki / fehler? im lowlevel magazin
« am: 28. February 2006, 15:01 »
hi,
in ausgabe 1 des magazins unter OS "Dev-Tutorial, Teil 1" steht ja ein kleiner bootloader.  auf meinem 386er, wo ich mein "OS" teste, funktioniert der aber nicht, weil der am anfang DS nicht auf 0 setzt. also hab ich oben noch die zeilen xor ax, ax
mov ds, ax
eingefügt. damit klappt es dann.

weil mir das gerade aufgefallen ist und ich hier im forum schon öfter gehört habe, dass code aus den einzelnen ausgaben des magazins nicht 100% korrekt ist, wollte ich fragen, ob solche sachen vllt nachträglich noch reineditiert werden könnten.
zum beispiel:
nachträglich hinzugefügt: DS muss auch am anfang des codes auf 0 gesetzt werden, um die variablen richtig ansprechen zu können.

oder sowas in der art eben.
6
Lowlevel-Coding / diskette mit fat12 formatieren
« am: 12. February 2006, 12:05 »
hi, wenn ich eine diskette mit fat12 formatieren will, muss ich doch einfach nur  den bootsektor neu schreiben und dann 18 sektoren lang nullen schreiben, oder?
das hab ich zumindest dann mal probiert mit folgendem code (die werte fpr den bootsektor habe ich aus dem FAT12-tutorial, das auf der lowlevel-tutorials-seite verlinkt ist):


format_start dw 0          ; diskettenformatierung
db 0          ; JmpBoot
db "noreos  " ; OSName
dw 0xFF       ; BystesPerSec
db 1          ; SecPerClus
dw 1          ; RsvdSecCnt
db 2          ; NumFATs
dw 224        ; RootEntCnt
dw 2880       ; TotSec
db 0xF0       ; MediaType
dw 9          ; FATSize
dw 18         ; SecPerTrack
dw 2          ; NumHeads
dd 0          ; HiddenSec
dd 0          ; TotSec32
db 0          ; DrvNum
db 0          ; Reserved
db 0x29       ; BootSig
dd 0          ; VolumeID
times 11 db 20h ; VlumeLabel
db "FAT12"
times 3 db 20h  ; FileSysType
times 448 db 0  ; Dateilänge: 512 Bytes
dw 0AA55h       ; Bootsignatur
times 9216 db 0 ;

...

 diskreset:
 mov dl, 0             ; Erstes Diskettenlaufwerk
 mov ah, 0             ; Laufwerk zurücksetzen
 int 13h               ; int
 jc diskreset          ; fehler? nochmal
 diskformat:
 mov cx, 0             ; Cylinder=0 Sektor=0
 mov dx, 0             ; erstes diskettenlaufwerk, Head=0
 mov ax, ds            
 mov es, ax            ; segment
 mov bx, format_start  ; offset
 mov ah, 3             ; sektoren schreiben
 mov al, 19            ; 19 stück
 int 13h               ; int
 jc diskformat         ; fehler? nochmal


wenn ich das ausprobiere, macht an dieser stelle das betriebssystem einfach nichts mehr. hab das problem schon ein paar wochen und echt keine ahnung, was ich falsch mache.
wie ihr seht, bin ich seit dem letzten mal nicht viel weitergekommen.
deshalb wäre ich über hilfe sehr froh.
7
hi, ich weiß nicht, ob das in diesen teil des forums gehört, aber ich wusste nicht genau, wohin ichs posten sollte.

ich habe grade ein SEHR komisches problem:
ich assembliere bootloader und kernel in einzelne dateien und füge sie dann mit dem MS-DOS-Befehl copy zusammen. dann hab ich mir aber wegen nem fehler die endgültige datei mit dem netwide disassembler mal angeguckt und mir ist aufgefallen, dass am ende ein teil des codes fehlte (ca die letzten 20 byte oder so).
dann hab ich mir die einzeldateien von bootloader und kernel mit dem disassembler angeguckt und hier hat am ende nix gefehlt. also dachte ich, dass einfach nur der letzte teil der kerneldatei (warum auch immer) beim zusammenfügen abgeschnitten wird.
dann habe ich allerdings die größe der dateien verglichen und mir ist aufgefallen, dass die größen der beiden einzelnen dateien zusammen der größe der gesamtdatei entsprechen. im disassemblierten code sind die einzelnen bytes außerdem durchnummeriert und auch hier hat die nummer des letzten bytes mit der größe jeweils übereingestimmt.
außerdem geht der code vom bootloader in der gesamtdatei genau über die ersten 512 byte.

es sieht also für mich so aus, als würde beim zusammenfügen der beiden dateien irgendwo in den kernelteil code eingeschoben werden und das hinten abstehende dann abgeschnitten.

hat einer ne ahnung, woran das liegen könnte?
ansonsten muss ich halt den code mal zeile für zeile vergleichen und gucken, was passiert ist.
8
Lowlevel-Coding / Anfängerfrage
« am: 26. December 2005, 13:06 »
Hi, sry wenn's so ne Frage schonmal gab, hab lange hier im Forum gesucht und nichts entsprechendes gefunden.  
Mein Titel ist auch nicht sehr gut gewählt, aber ich wusste nicht, wie ich's ausdrücken soll.

Hier mein Problem:
ich habe zunächst den bootloader und auch den code vom kernel komplett aus dem lowlvl magazin übernommen. dann habe ich eine funktion hinzugefügt, die zeichenketten in einen puffer einliest und diese dann mit anderen zeichenketten vergleicht und entsprechend etwas tut. also wenn man "reboot" eingibt, dann startet der rechner neu, wenn man "fuck" eingibt, wird "you!" ausgebeben (waren nur kleine tests ;) ). das hat auch alles noch funktioniert.
dann hab ich mir ein paar sachen über fat12 durchgelesen und wollte einbauen, dass man eine diskette formatieren kann. dazu hab ich ersteinmal alle informationen, die in den bootsector kommen direkt in meinen assembler quelltext geschrieben, hinter die anderen variablen.
und ab da funktioniert es nicht mehr.
den bootloader hab ich ,glaub ich, so umgeändert, dass er genug von der diskette einliest.
ich hab leider nicht so viel ahnung von assembler. aber könnte es irgendwas mit den calls zu tun haben, weil die funktionen ja jetzt um einiges weiter weg von dem call sind.

wie ihr seht, bin ich noch nicht sehr weit und es ist ziemlich frustrierend für mich, dass ich nicht weiterkomme. deshalb wär ich euch sehr dankbar, wenn ihr mir helfen könntet.
9
Lowlevel-Coding / booten funktioniert nicht - newbie-fragen
« am: 31. October 2005, 12:38 »
Hi, tut mir leid, wenn ihr hier so fragen öfters gestellt bekommt, aber ich habe per suche nichts gefunden.

also mein problem:
ich habe bisher keine ahnung von betriebssystem programmierung, habe mir nur ausgabe 1 von lowlevel durchgelesen
nun wollte ich testhalber den code abgeschrieben, die beiden dateien assembliert und aneinander gefügt. dann hab ich mit rawwrite die entstandene datei auf ne diskette gefügt. alles genauso wie beschrieben.  im bios hab ich als first boot device "floppy" angegeben.
dann hab ich neugestartet und es wurde ganz normal windows gestartet.

ich kann mir das nicht erklären.  wäre euch sehr dankbar, wenn ihr mir helfen könntet.
Seiten: [1]

Einloggen