Dann versuch es doch mal mit der einfachen Version, ohne AVR-DOS.
Ich weiß nicht, wieviel dein sonstiger Code ausmacht, aber der hier inklusive Lesen und Schreiben von 1000 Sektoren und Ausgabe auf den UART belegt gerade mal 1492 Byte, also noch viel Platz bis 4K.
Code:
$regfile = "M128def.dat"
$crystal = 16000000

$baud1 = 115200
Open "Com2:" As Binary As #1
Enable Interrupts

Dim Mmc_error As Byte
Dim In_ptr As Word                                          ' Address-Pointer for read
Dim In_sect As Long
Dim In_buffer As String * 512
Print #1 , "Wait for Drive"
$include "Config_MMC.bas"
'Hier werden als Test die ersten 1000 Sektoren der Karte eingelesen und auf den UART ausgegeben und dann wieder auf die SD geschrieben.
In_ptr = Varptr(in_buffer)
If Gbdriveerror = 0 Then
   Mmc_error = Driveinit()
   If Mmc_error = 0 Then
      Print #1 , "Driveinit Ok. "
      For In_sect = 0 To 1000
         Mmc_error = Drivereadsector(in_ptr , In_sect)
         If Mmc_error = 0 Then
            Print #1 , "ReadSector(" ; In_sect ; ") ok."    'Zum Inhalt drucken, Kommentare entfernen !!!!!!!!!!
            Print #1 , In_buffer                            'Dann wird es aber langsamer, 115200 baud beim übertragen
            Mmc_error = Drivewritesector(in_ptr , In_sect)
         Else
            Print #1 , "Error during ReadSector(" ; In_sect ; ") : " ; Mmc_error
         End If
      Next In_sect
   Else
      Print #1 , "Error during Driveinit(): " ; Mmc_error
   End If
End If

End
Hierbei werden die Sektoren direkt geschrieben. Das reicht für die Ein- und Ausgabe im µC.
Wenn du eine Datei in Windows sehen willst, legst du vorher eine dummy-Datei der benötigten Größe an und schreibst dann deren Sektoren.

Gruß

Rolf