Hier ein Beispiel, welches Sektoren von der MMC/SD Karte einliest und auf der Seriellen Schnittstelle ausgibt.
Bei den Funktionen DriveReadSector und DriveWriteSector ist zu beachten, dass ein Adresspointer übergeben wird.
Das gibt den Funktionen die Möglichkeiten, jeden Bereich im SRAM auf die Karte zu schreiben, bzw vor dort zu überschreiben, ohne dass dort eine Variable deklariert sein muss. Soll jedoch in eine Variable (Byte-Array mit 512 Bytes) geschrieben werden, muss man zuerst mit VarPtr die Adresse auslesen (siehe dazu das Beispiel)
Code:
$Regfile = "M162def.dat"
$Crystal = 8000000
$HWStack = 32
$SWStack = 32
$FrameSize = 64
$Baud = 9600
Declare Sub Sramdump(byval pwsrampointer As Word , Byval Pwlength As Word)
$Include "Config_MMC.bas"
'$Include "Config_XRAMDrive0.bas" ' Zum Testen mit dem Simulator
If gbDriveError <> 0 then
Print "MMC/SD Initialisierung fehlgeschlagen"
end
Endif
Dim bError as Byte
Dim aBuffer(512) as Byte ' SRAM-Bereich für den Transfer
Dim wSRAMPointer as Word ' Adress-Pointer für den Drive... Routine
Dim lSectorNumber as Long ' Variable für Sektor-Nummer
' Adresse des Buffers in die Variable
wSRAMPointer =VarPtr(aBuffer(1))
' Die ersten 100 Sektoren ausgeben
For lSectorNumber = 0 to 100
bError = DriveReadSector( wSRAMPointer , lSectorNumber)
' Konnte der Sektor eingelesen werden?
if bError > 0 then
Print "Drive Fehler: " ; bError ; " bei Sektor " ; lSectorNumber
exit for
endif
Print "Sektor " ; lSectorNumber
' Sektor ausgeben
SRAMDump wSRAMPointer, 512
next
end
Sub Sramdump(byval pwsrampointer As Word , Byval Pwlength As Word)
' Dump a Part of SRAM to Print-Output #1
' pwSRAMPointer: (Word) Variable which holds the address of SRAM to dump
' pwLength: (Word) Count of Bytes to be dumped (1-based)
Local Lsdump As String * 16
Local Lbyte1 As Byte , Lbyte2 As Byte
Local Lword1 As Word , Lword2 As Word
Local Llong1 As Long
If Pwlength > 0 Then
Decr Pwlength
For Lword1 = 0 To Pwlength
Lword2 = Lword1 Mod 8
If Lword2 = 0 Then
If Lword1 > 0 Then
Print " " ;
End If
End If
Lword2 = Lword1 Mod 16
If Lword2 = 0 Then
If Lword1 > 0 Then
Print " " ; Lsdump
End If
Llong1 = Lword1
Print Hex(llong1) ; " " ;
Lsdump = " "
Lbyte2 = 1
End If
Lbyte1 = Inp(pwsrampointer)
Incr Pwsrampointer
Print Hex(lbyte1) ; " " ;
If Lbyte1 > 31 Then
Mid(lsdump , Lbyte2 , 1) = Lbyte1
Else
Mid(lsdump , Lbyte2 , 1) = "."
End If
Incr Lbyte2
Next
Print " " ; Lsdump
End If
Incr Pwlength
End Sub
Für den Transfer vom SRAM auf die Karte ist die Funktion DriveWriteSector in gleicher Weise zu verwenden.
Lesezeichen