Newsgroup: it.comp.programmare
Titolo: leggere settori di un floppy in memoria

salve a tutti!
vorrei porvi un quesito; dunque.... ho scritto un piccolo bootloader in
assembler che riesce unicamente a scrivere delle stringhe sul video (l'ho
fatto semplicemente per una prova) ho successivamente cercato (tramine la
funzione 02h dell' INT 13) di leggere un secondo programma, dallo stesso
floppy dal quale è stato caricato il bootloader,  e di copiarlo nella
memoria per poterlo eseguire e sfuggire così alla costrizione delle limitate
dimensioni che può assumere il bootloader.
tramite alcuni controlli ho potuto constatare che la funzione 02h non
restituisce alcune errore ed ho anche implementato la funzione 00h dell'INT
13 per resettare il floppy prime di provare a leggere; eppure il programma
da caricare non viene eseguito.
qui di seguito riporto il codice in questione.
qualcuno di voi sa per caso dove ho sbagliato?
grazie anticipatamente.
read:
mov ax, 1000
mov es, ax
mov bx, 00
mov ah, 02h
mov al, 01h ;numero settori
mov ch, 0 ;cilindro
mov dh, 0 ;testina
mov cl, 02h ;settore
mov dl, 0 ;driver
int 13h
cmp ah, 0
je gotcha ;controllo degli errori restituiti dalla funzione (se presenti)
jmp 1000:0000 ;questo jump dovrebbe passare il controllo al nuovo programma

 grazie anticipatamente.
Sotto è una funzione scritta da me in Pascal/Asm che funzionava.
Avevo dei problemi se lanciavo una sola volta Int 13h, lanciandolo 3 volte
funziona tutto correttamente, c'è un motivo per cui lo lancio tre volte,
c'era scritto da qualche parte, ma non ricordo dove :)
Function ReadSector:Boolean;Assembler;
Asm
 Mov Floppy.Error,0
 Xor Ah,Ah
 Xor Dl,Dl
 Int 13h
 Int 13h
 Int 13h
 Lea Bx,Floppy.BufferRW
 Mov Ax,Ds
 Mov Es,Ax
 Mov Ah,02h
 Mov AL,01h
 Mov Dl,Floppy.SelectedDrive
 Mov Dh,Floppy.Fac
 Mov Ch,Floppy.Trk
 Mov Cl,Floppy.Sec
 Int 13h
 JNB @NoErrR
  Mov Floppy.Error,1
 @NoErrR:
End;

// Meglio se allego tutto, altrimenti non si capisce niente.
Uses Crt;
Const MaxClusterSize=2048;
Type
 DiskStruct=Record
  Active:Boolean;
  Cylindres:Byte;
  Faces:Byte;
  Tracks:Byte;
  Sectors:Byte;
  SubSectors:Byte;
  RealClusters:Integer;
  VirtualClusters:Integer;
  RealClusterSize:Word;
  VirtualClusterSize:Word;
  VirtualClusterPerCluster:Byte;
  Error:Boolean;
  SelectedDrive:Byte;
  BufferRW:Array[0..MaxClusterSize-1] Of Byte;
  CYL,FAC,TRK,SEC,SUB:Byte
 End;
Var
 Floppy:DiskStruct;
 I:Integer;
 F:File;
 W:Word;
Procedure Create(Var Disk:DiskStruct);
  Var I:Integer;
 Begin
   Disk.Active:=True;
   Disk.Cylindres:=1;
   Disk.Faces:=1;
   Disk.Tracks:=1;
   Disk.Sectors:=1;
   Disk.SubSectors:=1;
   Disk.RealClusters:=1;
   Disk.VirtualClusters:=1;
   Disk.RealClusterSize:=1;
   Disk.VirtualClusterSize:=1;
   Disk.VirtualClusterPerCluster:=1;
   Disk.Error:=False;
   Disk.SelectedDrive:=0;
   For I:=0 To MaxClusterSize-1 Do Disk.BufferRW[I]:=0;
 End;
Procedure SetNumberOfCylindres(Var Disk:DiskStruct; N:Byte);
 Begin
   Disk.Cylindres:=N;
 End;
Procedure SetNumberOfFaces(Var Disk:DiskStruct; N:Byte);
 Begin
   Disk.Faces:=N;
 End;
Procedure SetNumberOfTracks(Var Disk:DiskStruct; N:Byte);
 Begin
   Disk.Tracks:=N;
 End;
Procedure SetNumberOfSectors(Var Disk:DiskStruct; N:Byte);
 Begin
   Disk.Sectors:=N;
 End;
Procedure SetNumberOfSubSectors(Var Disk:DiskStruct; N:Byte);
 Begin
   Disk.SubSectors:=N;
 End;
Procedure SetRealClusterSize(Var Disk:DiskStruct; N:Word);
 Begin
   Disk.RealClusterSize:=N;
   Disk.VirtualClusterSize:=N Div Disk.SubSectors;
 End;
Procedure SetVirtualClusterSize(Var Disk:DiskStruct; N:Word);
 Begin
   Disk.VirtualClusterSize:=N;
   Disk.SubSectors:=Disk.RealClusterSize Div Disk.VirtualClusterSize;
 End;
Procedure RealAddress(Var Disk:DiskStruct; LinearAddress:Word);
 Var Temporary:Word;
 Begin
   Disk.CYL:=LinearAddress Div (Disk.Faces * Disk.Tracks * Disk.Sectors *
Disk.SubSectors);
   Temporary:=LinearAddress Mod (Disk.Faces * Disk.Tracks * Disk.Sectors *
Disk.SubSectors);
   Disk.Fac:=Temporary Div (Disk.Tracks * Disk.Sectors * Disk.SubSectors);
   Temporary:=Temporary Mod (Disk.Tracks * Disk.Sectors * Disk.SubSectors);
   Disk.Trk:=Temporary Div (Disk.Sectors * Disk.SubSectors);
   Temporary:=Temporary Mod (Disk.Sectors * Disk.SubSectors);
   Disk.Sec:=Temporary Div Disk.SubSectors;
   Disk.Sub:=Temporary Mod Disk.SubSectors;
 End;
Function LinearAddress(Disk:DiskStruct):Word;
 Begin
   LinearAddress:=Disk.SUB+(Disk.SEC * Disk.SubSectors)+(Disk.TRK *
Disk.Sectors * Disk.SubSectors)
      +(Disk.FAC * Disk.Tracks * Disk.Sectors * Disk.SubSectors)
         +(Disk.CYL * Disk.Faces * Disk.Tracks * Disk.Sectors *
Disk.SubSectors);
 End;
Function WriteSector:Boolean;Assembler;
Asm
 Mov Floppy.Error,0
 Xor Ah,Ah
 Xor Dl,Dl
 Int 13h
 Int 13h
 Int 13h
 Lea Bx,Floppy.BufferRW
 Mov Ax,Ds
 Mov Es,Ax
 Mov Ah,03h
 Mov AL,01h
 Mov Dl,Floppy.SelectedDrive
 Mov Dh,Floppy.Fac
 Mov Ch,Floppy.Trk
 Mov Cl,Floppy.Sec
 Int 13h
 JNB @NoErrW
   Mov Floppy.Error,1
 @NoErrW:
End;
Function ReadSector:Boolean;Assembler;
Asm
 Mov Floppy.Error,0
 Xor Ah,Ah
 Xor Dl,Dl
 Int 13h
 Int 13h
 Int 13h
 Lea Bx,Floppy.BufferRW
 Mov Ax,Ds
 Mov Es,Ax
 Mov Ah,02h
 Mov AL,01h
 Mov Dl,Floppy.SelectedDrive
 Mov Dh,Floppy.Fac
 Mov Ch,Floppy.Trk
 Mov Cl,Floppy.Sec
 Int 13h
 JNB @NoErrR
  Mov Floppy.Error,1
 @NoErrR:
End;
Function IsSetOnBit(Value:Word;Bit:Byte):Boolean;
 Begin
   IsSetOnBit:=Not ((Value And (1 Shl Bit))=0);
 End;
Procedure SelectCluster(Var Disk:DiskStruct; Drv,C,F,T,S,SS:Byte);
 Begin
   Disk.SelectedDrive:=Drv;
   Disk.Cyl:=C;
   Disk.Fac:=F;
   Disk.Trk:=T;
   Disk.Sec:=S;
   Disk.Sub:=SS;
 End;
Begin
 ClrScr;
 Create(Floppy);
 SetNumberOfCylindres(Floppy,1);
 SetNumberOfFaces(Floppy,2);
 SetNumberOfTracks(Floppy,40);
 SetNumberOfSectors(Floppy,18);
 SetNumberOfSubSectors(Floppy,1);
 While (I<1440){ And (Readkey<>#27)} Do
   Begin
     RealAddress(Floppy,I);
     WriteLn('I=',I,'  -  CYL=',Floppy.Cyl,' FAC=',Floppy.Fac,'
TRK=',Floppy.Trk,' SEC=',Floppy.Sec,' SUB=',Floppy.Sub);
     GotoXY(1,WhereY-1);
     I:=I+1;
   End;
 WriteLn;
 RealAddress(Floppy,1);
 If ReadSector Then WriteLn('READING OK...') Else WriteLn('ERROR
READING...');
 For I:=0 To 511 Do
   Begin
     Write(Floppy.BufferRW[I],' ');
   End;
 ReadKey;
 WriteLn;
 WriteLn;
 For I:=0 To 2047 Do Floppy.BufferRW[I]:=0;
 Assign(F,'c:\nasm\
prova.com
');
 Reset(F,1);
 BlockRead(F,Floppy.BufferRW[0],446,w);
 Close(F);
 RealAddress(Floppy,1);
 If WriteSector Then WriteLn('WRITING OK...') Else WriteLn('ERROR
WRITING...');
 RealAddress(Floppy,1);
 If ReadSector Then WriteLn('READING OK...') Else WriteLn('ERROR
READING...');
 For I:=0 To 511 Do
   Begin
     Write(Floppy.BufferRW[I],' ');
   End;
 ReadKey;
End.