'*** INITIALIZATION OF MMC ***
Sub Minit
Nocard = 0
Set Cs
Dat = &HFF
For Isd = 1 To 10
Shiftout Mosi , Clk , Dat , Msbl
Next Isd
Resp = 255
Reset Cs
Cmd0:
Dat = &H40
Shiftout Mosi , Clk , Dat , Msbl
Addr = &H00000000
Shiftout Mosi , Clk , Addr , Msbl
Dat = &H95
Shiftout Mosi , Clk , Dat , Msbl
Isd = 1
While Resp <> &H01
Shiftin Miso , Clk , Resp , Msbl
Isd = Isd + 1
If Isd = 50 Then Exit While
Wend
If Isd = 50 Then
Nocard = 1
Reset Mosi
Return
End If
Set Cs
Waitms 50
Reset Cs
Dat = &HFF
Cmd1:
While Resp <> &H00
Set Cs
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
Reset Cs
Dat = &H41
Shiftout Mosi , Clk , Dat , Msbl
Addr = 0
Shiftout Mosi , Clk , Addr , Msbl
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
Wend
Dat = &HFF
Set Cs
Reset Mosi
End Sub
'**** READ routine assumes ADDR uses Status subroutine *****
Sub Mread(byval Addr As Long)
If Nocard = 1 Then Exit Sub
Addr = Addr * 512
Set Cs
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
Reset Cs
Dat = &H51
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Addr , Msbl
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
Isd = 1
While Resp <> 0
Shiftin Miso , Clk , Resp , Msbl
Isd = Isd + 1
If Isd = 50 Then
Nocard = 1
Return
End If
Wend
Isd = 1
While Resp <> &HFE
Shiftin Miso , Clk , Resp , Msbl
Isd = Isd + 1
If Isd = 50 Then
Nocard = 1
Return
End If
Wend
For Isd = 1 To 512
Shiftin Miso , Clk , Indat(isd) , Msbl
Next Isd
Shiftin Miso , Clk , Resp , Msbl
Shiftin Miso , Clk , Resp , Msbl
Set Cs
'Mstatus
Reset Mosi
End Sub
'****Block Start Tag / End Tag and ERASE ****
Sub Merase(byval Saddr As Long , Byval Eaddr As Long)
'erase first 1024 bytes
'Block START TAG
Cmd32:
Set Cs
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
Reset Cs
Dat = &H60
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Saddr , Msbl
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
While Resp <> &H00
Shiftin Miso , Clk , Resp , Msbl
Wend
'Block END TAG
Cmd33:
Set Cs
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
Reset Cs
Dat = &H61
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Eaddr , Msbl
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
While Resp <> &H00
Shiftin Miso , Clk , Resp , Msbl
Wend
'ERASE SELECTED BLOCK
Cmd38:
Set Cs
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
Reset Cs
Dat = &H66
Shiftout Mosi , Clk , Dat , Msbl
Addr = 0
Shiftout Mosi , Clk , Addr , Msbl
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
While Resp = 0
Shiftin Miso , Clk , Resp , Msbl
Wend
'Mstatus
End Sub
'** WRITE Routine assumes ADDR, BOUT uses Status subroutine **
Sub Mwrite(byval Addr As Long)
If Nocard = 1 Then Exit Sub
Addr = Addr * 512
Cmd24:
Set Cs
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
Reset Cs
Dat = &H58
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Addr , Msbl
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
While Resp <> 0
Shiftin Miso , Clk , Resp , Msbl
Wend
Dat = &HFE
Shiftout Mosi , Clk , Dat , Msbl
For Isd = 1 To 512
Shiftout Mosi , Clk , Indat(isd) , Msbl
Next Isd
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
Shiftin Miso , Clk , Resp , Msbl
While Resp = 0
Shiftin Miso , Clk , Resp , Msbl
Wend
Set Cs
'Mstatus
Reset Mosi
End Sub
'Get MMC Status
Sub Mstatusx
Cmd13:
Set Cs
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
Reset Cs
Dat = &H4D
Shiftout Mosi , Clk , Dat , Msbl
Addr = 0
Shiftout Mosi , Clk , Addr , Msbl
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp2 , Msbl
Set Cs
End Sub