fl 4 wconstant _sd_cs 5 wconstant _sd_di \ connected SD's di 6 wconstant _sd_clk 7 wconstant _sd_do \ connected SD's do 1 _sd_cs lshift wconstant _sd_csm 1 _sd_di lshift wconstant _sd_dim 1 _sd_clk lshift wconstant _sd_clkm 1 _sd_do lshift wconstant _sd_dom : _sd_cs_out _sd_cs pinout ; : _sd_di_out _sd_di pinout ; : _sd_clk_out _sd_clk pinout ; : _sd_do_in _sd_do pinin ; : _sd_cs_out_l _sd_csm _maskoutlo ; : _sd_cs_out_h _sd_csm _maskouthi ; : _sd_di_out_l _sd_dim _maskoutlo ; : _sd_di_out_h _sd_dim _maskouthi ; : _sd_clk_out_l _sd_clkm _maskoutlo ; : _sd_clk_out_h _sd_clkm _maskouthi ; : sd_shift_out 8 0 do dup 1 7 i - lshift and 0> if _sd_di_out_h else _sd_di_out_l then _sd_clk_out_l _sd_clk_out_h \ H=10usec L=5usec loop drop ; : sd_shift_in 0 8 0 do _sd_clk_out_l _sd_clk_out_h \ H=10usec L=5usec ina COG@ _sd_dom and 0> if 1+ then 1 lshift loop 1 rshift ; : dummy ff sd_shift_out ; \ dummy 8clock : i_change _rsptr COG@ 3 + COG! ; : get_cid 4a sd_shift_out \ CMD10 0 4 0 do dup sd_shift_out loop drop 1 sd_shift_out dummy begin sd_shift_in 0= until dummy begin sd_shift_in fe = until \ start-byte for data token 10 0 do sd_shift_in . loop \ data block begin sd_shift_in ff = until \ drop crc dummy ; : get_csd 49 sd_shift_out \ CMD9 0 4 0 do dup sd_shift_out loop drop 1 sd_shift_out dummy begin sd_shift_in 0= until dummy begin sd_shift_in fe = until \ start-byte for data token 10 0 do sd_shift_in . loop \ data block begin sd_shift_in ff = until \ drop crc dummy ; : sd_init _sd_di_out _sd_di_out_h _sd_clk_out _sd_clk_out_h _sd_do_in _sd_cs_out _sd_cs_out_h 4a 0 do \ 74 clock _sd_clk_out_h _sd_clk_out_l loop _sd_cs_out_l 40 sd_shift_out \ CMD0 0 4 0 do dup sd_shift_out loop drop 95 sd_shift_out \ CRC begin sd_shift_in 1- 0= until dummy begin 77 sd_shift_out \ CMD55 0 4 0 do dup sd_shift_out loop drop 1 sd_shift_out 3 0 do sd_shift_in drop loop \ skip response dummy 69 sd_shift_out \ ACMD41 0 4 0 do dup sd_shift_out loop drop 1 sd_shift_out 5 0 do sd_shift_in 0= if 4 i_change 1 else i 4 = if 0 then then loop dummy until _sd_cs_out_h _sd_cs_out_l \ get_csd \ cr \ get_cid _sd_cs_out_h ; : conv_data 4 rshift swap 4 rshift 4 lshift or swap 4 rshift ; \ [B(8)][G(8)][R(8)] --- [G(upper4)R(lower4)][0(upper4][B(lower4)] : test sd_init _sd_cs_out_l 51 sd_shift_out \ CMD17 Single Block read \ 0 4 0 do dup sd_shift_out loop drop 0 sd_shift_out 5 sd_shift_out 0 sd_shift_out 0 sd_shift_out 1 sd_shift_out \ CRC begin sd_shift_in 0= until dummy begin sd_shift_in fe = until \ start-byte for data token 20 0 do i 10 u* . 10 0 do sd_shift_in . loop cr \ data block loop begin sd_shift_in ff = until \ drop crc dummy _sd_cs_out_h ; : test1 sd_init _sd_cs_out_l 52 sd_shift_out \ CMD18 Multi Block read 0 sd_shift_out 5 sd_shift_out 0 sd_shift_out 0 sd_shift_out 1 sd_shift_out \ CRC begin sd_shift_in 0= until dummy begin sd_shift_in fe = until \ start-byte for data token 64 0 do 20 0 do i 10 u* . 10 0 do sd_shift_in . loop cr \ data block loop begin sd_shift_in ff = until \ drop crc dummy loop 52 sd_shift_out \ CMD12 Transfer Stop 0 4 0 do dup sd_shift_out loop drop 1 sd_shift_out \ CRC begin sd_shift_in 0= until \ response begin sd_shift_in ff = until \ check H-level dummy _sd_cs_out_h ;