Schreiben und Lesen auf Diskette funzt nur in Bochs
-
Hallo!
Ich habe ein Problem:
Ich bin im PMode und möchte mithilfe der DMA auf die Diskette schreiben / von ihr lesen.Das funktioniert im emulator (Bochs) auch perfekt, wenn ich nun aber meinen Rechner mit der Bootdiskette starte, schlägt dass schreiben und lesen auf Diskette fehl.
Weiß einer, wiso?
-
*Glaskugel raushol* *Beschwoerungsformel murmel* *schuettel*
Ah jetzt, ja! Du wartest nicht lang genug, bis das langsame Laufwerk bereit ist.
-
Dochdoch, ich warte.
Uns sry, für zu wenig info.
Ein wenig code:
typedef struct fdisk { char size_no; short base; int sr0; int motor_on; int track; } fdisk_t; fdisk_t fda; #define LOW_BYTE(x) (x & 0x00FF) #define HI_BYTE(x) ((x & 0xFF00) >> 8) [...] void set_dma(unsigned char *buff, short size, int read, int channel) { char page = 0; char mode = 0; short offset = 0; if(read) mode = 0x48 + (char)channel; else mode = 0x44 + (char)channel; page = (char)((int)buff >> 16); offset = (short)((int)buff & 0xFFFF); size--; cli(); outport(maskport[channel], (0x04 | channel)); // mask channel outport(clearport[channel], 0x00); // stop trans outport(modeport[channel], mode); // type of trans outport(addrport[channel], LOW_BYTE(offset)); // send address outport(addrport[channel], HI_BYTE(offset)); // send address outport(pageport[channel], page); // send page outport(countport[channel], LOW_BYTE(size)); // send size outport(countport[channel], HI_BYTE(size)); // send size outport(maskport[channel], channel); // unmask channel //sti(); //Kommentier ich das aus, gibts einen Neustart !? (Bochs sagt "3. Exception with no resolution") } [...] void floppy_read_sectors(unsigned char *buf, int pos, int count) { int sec, cyl, head, max_pos = pos + count; start_motor(&fda); for(; pos < max_pos; pos++) { sec = (pos % 18) + 1; cyl = pos / 36; head = (pos / 18) % 2; outport((fda.base + 0x7), 0); while(fdc_seek((char)cyl, &fda) == -1); set_dma(0x00000000, 512, 0, 2); delay(250); if(inport(fda.base + 0x4) != 0x80) { print("The DMA bit wasn't set",0x07); stop_motor(&fda); return; } sendbyte(0xE6, &fda); sendbyte((unsigned char)head << 2, &fda); sendbyte((unsigned char)cyl, &fda); sendbyte((unsigned char)head, &fda); sendbyte((unsigned char)sec, &fda); sendbyte(0x02, &fda); sendbyte(0x12, &fda); sendbyte(0x1B, &fda); sendbyte(0xFF, &fda); wait_irq6(&fda); // == delay(100); (void)getbyte(&fda); (void)getbyte(&fda); (void)getbyte(&fda); (void)getbyte(&fda); (void)getbyte(&fda); (void)getbyte(&fda); (void)getbyte(&fda); memcpyi((unsigned int *)buf, (unsigned int *)0x00000000, 128); buf += 0x200; } stop_motor(&fda); } [...]
-
Warum die vielen Leerzeilen !??
-
poste doch mal deine fdc_seek(), wartest du lediglich auf einen interrupt oder checkst du auch das busy bit?
-
Nun ja...
Interrupts habe ich noch nicht implementiert, ich ignoriere sie im moment.Was mich im moment unheimlich stört, ist der Fehler mit
asm("sti");int main() { asm("sti"); }
Wenn ich das ausführe, bricht Bochs (und mein echter PC) ab und macht einen Neustart. "exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting"
Wiso das denn? Das interruptflag setzen kann an sich ja nicht sooo schlimm sein oO
-
maxOS schrieb:
Nun ja...
Interrupts habe ich noch nicht implementiert, ich ignoriere sie im moment.Schonmal suboptimal...
maxOS schrieb:
Was mich im moment unheimlich stört, ist der Fehler mit
asm("sti");int main() { asm("sti"); }
Wenn ich das ausführe, bricht Bochs (und mein echter PC) ab und macht einen Neustart. "exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting"
Wiso das denn? Das interruptflag setzen kann an sich ja nicht sooo schlimm sein oO
Doch, im ProtectedMode schon. Hat dein Code denn die erforderlichen Rechte zum Ausfuehren privilegierter Instruktionen (sprich, laeuft er in Ring 0)? Sonst gibt's schliesslich die von Win9x vielleicht noch wohl bekannte schwere Schmutzverletzung.
Edit: Was aber wahrscheinlicher ist: Du sagst, du ignorierst die Interrupts. Hast du dann ueberhaupt die IDT schon mit funktionierenden handlern eingerichtet?
Sonst ist ein sti natuerlich fatal.Ansonsten wurde ja schon gesagt: Interessanten Funktionen wie start_motor() und fdc_seek() fehlen noch.
-
IDT? Ne, ich weiß nichtmal, was das ist.
Und da mein linux komischerweise mit den Newlines nicht klarkommt:
http://www.rafb.net/paste/results/G4oVAE48.htmlDann werde ich mich mal über der/die/das IDT informieren...
-
Also ich komme mit der Interrupt descriptor table einfach nicht klar.
Ich möchte einfach nur einen Handler schreiben, der bei jedem Interrupt und jeder Exception reagiert.
Doch ich finde einfach kein brauchbares Manual im Netz und aus den anderen Kerneln (lemon-os, DOS-C (KE2029), ObjetcsOS) werde ich nicht schlau.
Wenn mir einfach mal einer ganz grob so ungefähr sagen könnte was ich tuen müsste, was das ganz toll.
(Das hier ist schon mal ganz gut: http://pdos.csail.mit.edu/6.828/2005/readings/i386/c09.htm)
-
In die FAQ schauen -> PMode/MMX?
-
Ui, vielen Dank, den Thread kannte ich noch nicht!