PC Intern-Reihe

Diskussion zum Thema Programmierung unter DOS (Intel x86)
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: PC Intern-Reihe

Beitrag von freecrac »

Locutus hat geschrieben:Sorry, daß ich diesen alten Thread nochmal rauskrame.
Das ist für mich kein Problem.
Kommt das Thema "direkte Programmierung des IDE-Controllers" in der PC Intern-Reihe denn überhaupt vor? Vielleicht bin ich ja komplett auf dem falschen Weg hier...

Kennt jemand ein Buch, was sich generell mit x86-Systemprogrammierung auf diesem Level beschäftigt mit Beispiel-Listings in C?

Gruß,
locutus
So ein Buch kenne ich leider auch nicht.

Auch kann ich nur mit einem Beispiel-Code in Assembler dienen welches "Annie" schon vor einiger Zeit in die Newsgroup nach "alt.lang.asm" gepostet hat :
http://groups.google.com/group/alt.lang ... 3878c2b45b
(Ich habe den Fehler im Listing (siehe dazu auch die nachfolgende Beiträge) hier bei uns im Code bereits berichtigt.)

Code: Alles auswählen

;
; Read a hard disk sector into our allocated buffer, by
; directly accessing the hard disk at the hardware port level.
;
my_buff db      512 dup 0       ;allocate a storage buffer  
;
        mov     dx,1F6h         ;drive and head port
        mov     al,0A6h         ;drive 0, head 6
        out     dx,al           ;send it

        mov     dx,1F2h         ;sector count port
        mov     al,1            ;read one sector
        out     dx,al           ;send it

        mov     dx,1F3h         ;sector number port
        mov     al,56           ;read sector 56
        out     dx,al           ;send it

        mov     dx,1F4h         ;cylinder low port
        mov     al,5            ;cylinder 5
        out     dx,al           ;send it

        mov     dx,1F5h         ;cylinder high port
        mov     al,0            ;the rest of the cylinder (here, 0)
        out     dx,al           ;send it

        mov     dx,1F7h         ;command port
        mov     al,20h          ;read with retry
        out     dx,al           ;send it

still_going:
        in      al,dx           ;read a byte
        test    al,8            ;are we ready to proceed yet?
        jz      still_going     ;no, so go again
        mov     cx,512/2        ;one sector (512 bytes/2 = 256 words)
        mov     di,offset my_buff ;point DI to our local storage buffer
        mov     dx,1F0h         ;data port - data comes in and out here

more:
        in      ax,dx           ;read a word from the port
        mov     [di],al         ;store first byte in our local buffer
        inc     di              ;bump the buffer pointer
        mov     [di],ah         ;store second byte in our local buffer
        inc     di              ;bump the buffer pointer
        loop    more            ;go again if CX > 0
        ...
        ...
        [ your code here ]
Wenn es damit ein Verständnissproblem gibt den Code zu verstehen, dann sage bescheid, ich helfe gerne weiter.

Edit: Vieleicht ist diese Seite hierbei hilfreich:
http://lateblt.tripod.com/atapi.htm

Dirk
Zuletzt geändert von freecrac am Mo 9. Mai 2011, 12:13, insgesamt 1-mal geändert.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: PC Intern-Reihe

Beitrag von freecrac »

Auf der Suche fand ich folgendes PC-Intern auf english im PDF-Format:
"PC Intern: System Programming: The Encyclopedia of DOS Programming Know How"
# Author: Michael Tischer
# ISBN-10: 1557551456
# Pages: 1009
# Category: Programming

http://www.downloadfreepdfbook.com/2011 ... mming.html
Bild

(Aber leider werden auch hier nur verschiedene Operationen mit INT13h gezeigt, aber kein Portzugriff über den IDE-Controller.)

Dirk
Brueggi

Re: PC Intern-Reihe

Beitrag von Brueggi »

Was die Programmierung eines IDE-Controllers angeht, bin ich eigentlich ganz fit. Allerdings: Ich kenne bisher nur Selbstbau-IDE-Interfaces vom Z80 her. Die Vorgehensweise ist die gleiche wie am PC, nur eben sind die Port-Adressen anders und einige Register gibt es dort nicht. Wie auch immer: Ich würde am PC definitiv die Finger davon lassen, den IDE-Controller direkt anzusprechen. Zumindest dann, wenn das Programm auch auf anderen PCs laufen soll.

Wem der normale INT 13 nicht reicht, der nimmt halt die LBA-Erweiterungen - und dann kann man sich auch auf großen Platten austoben. Nebenbei läuft das Programm dann wirklich überall - egal ob IDE oder SCSI oder sonst was :-))
Benutzeravatar
ChrisR3tro
Administrator
Beiträge: 1981
Registriert: Mo 7. Mär 2005, 23:33
Wohnort: NRW
Kontaktdaten:

Re: PC Intern-Reihe

Beitrag von ChrisR3tro »

@Brueggi: Es geht dabei um CDBQ. Mir bleibt also keine andere Option, als direkt den IDE-Controller anzusprechen. Wenn du Erfahrungen damit hast, kannst du ja mal einen Blick in den Code werfen. Vielleicht hast du ja ein paar Verbesserungsvorschläge :-)

Ist jetzt allerdings auch schon länger her, dass ich mich mit dem Thema befaßt habe...

Gruß
locutus
Brueggi

Re: PC Intern-Reihe

Beitrag von Brueggi »

Also ich habe (am Z80) auch mal probiert, per ATAPI dem CD-ROM Manieren beizubringen. Meine Ergebnisse (könnte aber am Z80 bzw. am Timing gelegen haben) waren die, dass man jedes "Paket" mind. 3 mal abschicken muss, bis eine Reaktion erfolgte. Bei guten CDs (z. B. TEAC) kam die Reaktion sofort, bei anderen (NoName) kam keine Reaktion oder erst beim 3. Mal. Meistens war da das Ergebnis, dass der IDE-BUS blockiert wurde. Ich möchte nix versprechen, aber ich kuck mir das gerne mal an. Ob ich dir allerdings helfen kann, möchte ich nicht versprechen (ist gut möglich, dass es einfach schon zu lange her ist und ich keinen PLan mehr davon hab).

Es wird aber erst Wochenende - dann hab ich frei und kann mich da mal drüber machen :-)
Antworten