Compare commits

..

2 Commits

Author SHA1 Message Date
Virgil Dupras
5219887ad7 sdc: implement _crc16 in z80 2020-04-24 20:46:01 -04:00
Virgil Dupras
8d78ca9dac tests: add test_sdc
The SD card driver is a bit too slow to be bearable. I'll write
_crc16 in z80 and see how it goes.
2020-04-24 18:23:29 -04:00
7 changed files with 56 additions and 57 deletions

View File

@ -10,4 +10,5 @@
0xe6 OP2n ANDn,
0xf6 OP2n ORn,
0xd6 OP2n SUBn,
0xee OP2n XORn,

23
blk/373
View File

@ -1,9 +1,16 @@
CODE _sdcSel
SDC_CSLOW OUTnA,
CODE _sdcSel SDC_CSLOW OUTnA, ;CODE
CODE _sdcDesel SDC_CSHIGH OUTnA, ;CODE
( Computes n into crc c with polynomial 0x1021 )
CODE _crc16 ( c n -- c )
HL POPqq, ( n ) DE POPqq, ( c )
A L LDrr, D XORr, D A LDrr,
B 8 LDrn,
BEGIN,
E SLAr, D RLr,
IFC, ( msb is set, apply polynomial )
A D LDrr, 0x10 XORn, D A LDrr,
A E LDrr, 0x21 XORn, E A LDrr,
THEN,
DJNZ, AGAIN,
DE PUSHqq,
;CODE
CODE _sdcDesel
SDC_CSHIGH OUTnA,
;CODE

12
blk/377
View File

@ -1,15 +1,3 @@
( c n -- c )
( Computes n into crc c with polynomial 0x1021 )
: _crc16
SWAP DUP 256 / ( n c c>>8 )
ROT XOR ( c x )
DUP 16 / XOR ( c x^x>>4 )
SWAP 256 * ( x c<<8 )
OVER 4096 * XOR ( x c^x<<12 )
OVER 32 * XOR ( x c^x<<5 )
XOR ( c )
;
( send-and-crc7 )
( n c -- c )
: _s+crc SWAP DUP _sdcSR DROP _crc7 ;

28
blk/380
View File

@ -1,16 +1,16 @@
: _err _sdcDesel ABORT" SDerr" ;
( Initialize a SD card. This should be called at least 1ms
after the powering up of the card. )
: SDC$
( Wake the SD card up. After power up, a SD card has to receive
at least 74 dummy clocks with CS and DI high. We send 80. )
10 0 DO _idle DROP LOOP
( call cmd0 and expect a 0x01 response (card idle)
this should be called multiple times. we're actually
expected to. let's call this for a maximum of 10 times. )
0 ( dummy )
10 0 DO ( r )
DROP 0x40 0 0 SDCMDR1 ( CMD0 )
DUP 0x01 = IF LEAVE THEN
LOOP 0x01 = NOT IF _err THEN ( cont. )
( Tight definition ahead, pre-comment.
Initialize a SD card. This should be called at least 1ms
after the powering up of the card. We begin by waking up the
SD card. After power up, a SD card has to receive at least
74 dummy clocks with CS and DI high. We send 80.
Then send cmd0 for a maximum of 10 times, success is when
we get 0x01. Then comes the CMD8. We send it with a 0x01aa
argument and expect a 0x01aa argument back, along with a
0x01 R1 response. After that, we need to repeatedly run
CMD55+CMD41 (0x40000000) until the card goes out of idle
mode, that is, when it stops sending us 0x01 response and
send us 0x00 instead. Any other response means that
initialization failed. )

20
blk/381
View File

@ -1,10 +1,16 @@
( Then comes the CMD8. We send it with a 0x01aa argument and
expect a 0x01aa argument back, along with a 0x01 R1
response. )
0x48 0 0x1aa ( CMD8 )
SDCMDR7 ( r arg1 arg2 )
: SDC$
10 0 DO _idle DROP LOOP
0 ( dummy ) 10 0 DO ( r )
DROP 0x40 0 0 SDCMDR1 ( CMD0 )
DUP 0x01 = IF LEAVE THEN
LOOP 0x01 = NOT IF _err THEN
0x48 0 0x1aa ( CMD8 ) SDCMDR7 ( r arg1 arg2 )
0x1aa = NOT IF _err THEN ( arg2 check )
0 = NOT IF _err THEN ( arg1 check )
0x01 = NOT IF _err THEN ( r check )
( cont. )
BEGIN
0x77 0 0 SDCMDR1 ( CMD55 )
0x01 = NOT IF _err THEN
0x69 0x4000 0x0000 SDCMDR1 ( CMD41 )
DUP 0x01 > IF _err THEN
NOT UNTIL ; ( out of idle mode, success! )

13
blk/382
View File

@ -1,13 +0,0 @@
( Now we need to repeatedly run CMD55+CMD41 (0x40000000)
until the card goes out of idle mode, that is, when it stops
sending us 0x01 response and send us 0x00 instead. Any other
response means that initialization failed. )
BEGIN
0x77 0 0 SDCMDR1 ( CMD55 )
0x01 = NOT IF _err THEN
0x69 0x4000 0x0000 SDCMDR1 ( CMD41 )
DUP 0x01 > IF _err THEN
NOT UNTIL
( Out of idle mode! Success! )
;

10
tests/forth/test_sdc.fs Normal file
View File

@ -0,0 +1,10 @@
212 LOAD ( z80a )
: SDC_SPI 4 ;
: SDC_CSLOW 5 ;
: SDC_CSHIGH 6 ;
372 LOAD ( sdc.z80 )
374 LOAD ( sdc.fs )
0x0000 0x00 _crc16 0x0000 #eq
0x0000 0x01 _crc16 0x1021 #eq
0x5678 0x34 _crc16 0x34e4 #eq