Timing related SD card initialisation bug, new board release can fail to initialise and loop.
Former-commit-id: 5d6bcf94519d17176fd17db1cd82387cd8454f65
This commit is contained in:
@@ -47,12 +47,12 @@ HEADER1: IF BUILD_MZ80A = 1
|
||||
|
||||
HEADER2: IF BUILD_RFS = 1
|
||||
IF BUILD_80C = 0
|
||||
DB "MS-BASIC(RFS40))", 0DH, 0DH ; Title/Name (17 bytes).
|
||||
DB "MS-BASIC(RFS40)", 0DH, 0DH ; Title/Name (17 bytes).
|
||||
DW CODEEND - CODESTART ; Size of program.
|
||||
DW CODESTART ; Load address of program.
|
||||
DW CODESTART ; Exec address of program.
|
||||
ELSE
|
||||
DB "MS-BASIC(RFS80))", 0DH, 0DH ; Title/Name (17 bytes).
|
||||
DB "MS-BASIC(RFS80)", 0DH, 0DH ; Title/Name (17 bytes).
|
||||
DW CODEEND - CODESTART ; Size of program.
|
||||
DW CODESTART ; Load address of program.
|
||||
DW CODESTART ; Exec address of program.
|
||||
|
||||
@@ -108,25 +108,27 @@ CBIOS3_0: LD A,(BNKCTRLRST)
|
||||
LD A,000H ; CS to low (active)
|
||||
CALL SPICS
|
||||
|
||||
LD BC,01FFFH ; Number of retries before deciding card is not present.
|
||||
LD BC,SD_RETRIES ; Number of retries before deciding card is not present.
|
||||
SD_INIT1: LD A,CMD0 ; Command 0
|
||||
LD HL,00000H ; NB. Important, HL should be coded as LH due to little endian and the way it is used in SDCMD.
|
||||
LD DE,00000H ; NB. Important, DE should be coded as ED due to little endian and the way it is used in SDCMD.
|
||||
CALL SDCMD
|
||||
|
||||
PUSH BC
|
||||
;
|
||||
CALL SDCMD
|
||||
;
|
||||
LD A,(SDBUF+6) ; Get response code.
|
||||
DEC A ; Set Z flag to test if response is 0x01
|
||||
JP Z,SD_INIT2 ; Command response 0x01? Exit if match.
|
||||
POP BC
|
||||
JP Z,SD_INIT2 ; Command response 0x01? Exit if match.
|
||||
|
||||
DEC BC
|
||||
LD A,B
|
||||
OR C
|
||||
JR NZ,SD_INIT1 ; Retry for BC times.
|
||||
LD A,1
|
||||
JP SD_EXIT ; Error, card is not responding to CMD0
|
||||
SD_INIT2: POP BC
|
||||
; Now send CMD8 to get card details. This command can only be sent
|
||||
|
||||
SD_INIT2: ; Now send CMD8 to get card details. This command can only be sent
|
||||
; when the card is idle.
|
||||
LD A,CMD8 ; CMD8 has 0x00001AA as parameter, load up registers and call command routine.
|
||||
LD HL,00000H ; NB. Important, HL should be coded as LH due to little endian and the way it is used in SDCMD.
|
||||
@@ -254,10 +256,25 @@ SDCMD1: PUSH BC
|
||||
POP BC
|
||||
DJNZ SDCMD1
|
||||
PUSH HL
|
||||
SDCMD2: CALL SPIIN
|
||||
LD HL,SD_RETRIES
|
||||
SDCMD2: PUSH HL
|
||||
CALL SPIIN
|
||||
POP HL
|
||||
CP 0FFH
|
||||
JR Z,SDCMD2
|
||||
JR SDCMD4
|
||||
JR NZ,SDCMD4
|
||||
DEC HL
|
||||
LD A,H
|
||||
OR L
|
||||
JR NZ,SDCMD2
|
||||
;
|
||||
; Error as we are not receiving data.
|
||||
;
|
||||
POP HL
|
||||
POP BC
|
||||
LD A,1 ; Force return code to be error.
|
||||
LD (SDBUF+6),A
|
||||
RET
|
||||
|
||||
SDCMD3: PUSH BC
|
||||
PUSH HL
|
||||
CALL SPIIN ;
|
||||
@@ -286,15 +303,14 @@ SDACMD: PUSH AF
|
||||
POP DE
|
||||
LD A,(SDBUF+6) ; Should be a response of 0 or 1.
|
||||
CP 2
|
||||
JR NC,SDACMD0
|
||||
JR NC,SDACMDE
|
||||
POP AF
|
||||
CALL SDCMD
|
||||
LD A,(SDBUF+6) ; Should be a response of 0 whereby the card has left idle.
|
||||
SDACMD0: LD A,(SDBUF+6) ; Should be a response of 0 whereby the card has left idle.
|
||||
OR A
|
||||
RET
|
||||
SDACMD0: POP AF
|
||||
CP 1
|
||||
RET
|
||||
SDACMDE: POP AF
|
||||
JR SDACMD0
|
||||
|
||||
; Method to send Application Command 41 to the SD card. This command involves retries and delays
|
||||
; hence coded seperately.
|
||||
|
||||
@@ -437,6 +437,7 @@ CPM_SD_IMGSZ EQU CPM_SD_TRK * CPM_SD_SEC * SD_SECSIZE
|
||||
SD_SECSIZE EQU 512 ; Default size of an SD Sector
|
||||
SD_SECPTRK EQU CPM_SD_SEC ; Sectors of SD_SECSIZE per virtual track.
|
||||
SD_TRACKS EQU CPM_SD_TRK ; Number of virtual tracks per disk image.
|
||||
SD_RETRIES EQU 00100H ; Number of retries before giving up.
|
||||
|
||||
|
||||
;-----------------------------------------------
|
||||
|
||||
@@ -411,11 +411,11 @@ SDDIR_ENTSZ EQU 32
|
||||
;
|
||||
; Rom Filing System constants for the SD Card.
|
||||
;
|
||||
SDDIR_DIRENT EQU 256 ; Directory entries in the RFS directory.
|
||||
SDDIR_DIRENTSZ EQU 32 ; Size of a directory entry.
|
||||
SDDIR_DIRSIZE EQU SDDIR_DIRENT * SDDIR_DIRENTSZ ; Total size of the directory.
|
||||
SDDIR_BLOCKSZ EQU 65536 ; Size of a file block per directory entry.
|
||||
SDDIR_IMGSZ EQU SDDIR_DIRSIZE + (SDDIR_DIRENT * SDDIR_BLOCKSZ) ; Total size of the RFS image.
|
||||
SDDIR_DIRENT EQU 256 ; Directory entries in the RFS directory.
|
||||
SDDIR_DIRENTSZ EQU 32 ; Size of a directory entry.
|
||||
SDDIR_DIRSIZE EQU SDDIR_DIRENT * SDDIR_DIRENTSZ ; Total size of the directory.
|
||||
SDDIR_BLOCKSZ EQU 65536 ; Size of a file block per directory entry.
|
||||
SDDIR_IMGSZ EQU SDDIR_DIRSIZE + (SDDIR_DIRENT * SDDIR_BLOCKSZ) ; Total size of the RFS image.
|
||||
|
||||
OBJCD EQU 001H ; MZF contains a binary object.
|
||||
BTX1CD EQU 002H ; MZF contains an MZ-80K/80A BASIC program.
|
||||
|
||||
@@ -227,8 +227,19 @@ SIGNON2: LD DE,MSGSON ; Sign
|
||||
SIGNON3: LD HL,PRINTMSG
|
||||
CALL BKSW0to6
|
||||
|
||||
; Initialise SD card, report any errors.
|
||||
LD HL, SDINIT ; SD Card Initialisation
|
||||
CALL BKSW0to2 ; Call the initialisation routine.
|
||||
LD A,L
|
||||
OR A ; 0 = No error.
|
||||
JR Z,ST1X
|
||||
|
||||
; Place error code in C to print as a number and report with the error message.
|
||||
ADD A,'0'
|
||||
LD C,A
|
||||
LD DE,MSGSDINITER
|
||||
LD HL,PRINTMSG
|
||||
CALL BKSW0to6
|
||||
|
||||
; Command processor, table based.
|
||||
; A line is inpt then a comparison made with entries in the table. If a match is found then the bank and function
|
||||
|
||||
@@ -228,10 +228,10 @@ SDINIT: LD A,0FFH ; CS to
|
||||
;
|
||||
CALL SPIINIT ; Train SD with our clock.
|
||||
;
|
||||
XOR A ; CS to active (low)
|
||||
LD A,0 ; CS to active (low)
|
||||
CALL SPICS
|
||||
LD BC,SD_RETRIES ; Number of retries before giving up, card not responding.
|
||||
;
|
||||
LD BC,SD_RETRIES ; Number of retries before giving up, card not responding.
|
||||
SDINIT1: LD A,CMD0 ; Command 0
|
||||
LD HL,00000H ; NB. Important, HL should be coded as LH due to little endian and the way it is used in SDCMD.
|
||||
LD DE,00000H ; NB. Important, DE should be coded as ED due to little endian and the way it is used in SDCMD.
|
||||
@@ -241,8 +241,9 @@ SDINIT1: LD A,CMD0 ; Comma
|
||||
;
|
||||
LD A,(SDBUF+6) ; Get response code.
|
||||
DEC A ; Set Z flag to test if response is 0x01
|
||||
JP Z,SDINIT2 ; Command response 0x01? Exit if match.
|
||||
POP BC
|
||||
JP Z,SDINIT2 ; Command response 0x01? Exit if match.
|
||||
|
||||
DEC BC
|
||||
LD A,B
|
||||
OR C
|
||||
@@ -250,8 +251,7 @@ SDINIT1: LD A,CMD0 ; Comma
|
||||
LD A,1
|
||||
JP SD_EXIT ; Error, card is not responding to CMD0
|
||||
|
||||
SDINIT2: POP BC
|
||||
; Now send CMD8 to get card details. This command can only be sent
|
||||
SDINIT2: ; Now send CMD8 to get card details. This command can only be sent
|
||||
; when the card is idle.
|
||||
LD A,CMD8 ; CMD8 has 0x00001AA as parameter, load up registers and call command routine.
|
||||
LD HL,00000H ; NB. Important, HL should be coded as LH due to little endian and the way it is used in SDCMD.
|
||||
@@ -328,14 +328,15 @@ SDINIT12: DEC BC ; 6T
|
||||
LD A,4 ; Exit code, failed to initialise v1 MMC card.
|
||||
JP SD_EXIT
|
||||
|
||||
SDINIT13: LD A,CMD16 ; No response from the card for an ACMD41/CMD1 so try CMD16 with parameter 0x00000200
|
||||
SDINIT13: POP BC
|
||||
LD A,CMD16 ; No response from the card for an ACMD41/CMD1 so try CMD16 with parameter 0x00000200
|
||||
LD HL,00000H ; NB. Important, HL should be coded as LH due to little endian and the way it is used in SDCMD.
|
||||
LD DE,00002H ; NB. Important, DE should be coded as ED due to little endian and the way it is used in SDCMD.
|
||||
CALL SDCMD
|
||||
LD A,(SDBUF+6)
|
||||
OR A
|
||||
JR Z,SDINIT14
|
||||
XOR A
|
||||
LD A,0
|
||||
LD (SDCAP),A ; No capabilities on this unknown card.
|
||||
SDINIT14: XOR A
|
||||
JR SD_EXIT
|
||||
@@ -396,6 +397,7 @@ SDCMD2: PUSH HL
|
||||
; Error as we are not receiving data.
|
||||
;
|
||||
POP HL
|
||||
POP BC
|
||||
LD A,1 ; Force return code to be error.
|
||||
LD (SDBUF+6),A
|
||||
RET
|
||||
@@ -408,6 +410,8 @@ SDCMD4: POP HL
|
||||
INC HL
|
||||
POP BC ; Get back number of expected bytes. HL = place in buffer to store response.
|
||||
DJNZ SDCMD3
|
||||
LD A,DOUT_HIGH | CLOCK_LOW | CS_HIGH
|
||||
OUT (SPI_OUT),A
|
||||
RET
|
||||
|
||||
; Method to send an Application Command to the SD Card. This involves sending CMD55 followed by the required command.
|
||||
@@ -426,15 +430,14 @@ SDACMD: PUSH AF
|
||||
POP DE
|
||||
LD A,(SDBUF+6) ; Should be a response of 0 or 1.
|
||||
CP 2
|
||||
JR NC,SDACMD0
|
||||
JR NC,SDACMDE
|
||||
POP AF
|
||||
CALL SDCMD
|
||||
LD A,(SDBUF+6) ; Should be a response of 0 whereby the card has left idle.
|
||||
SDACMD0: LD A,(SDBUF+6) ; Should be a response of 0 whereby the card has left idle.
|
||||
OR A
|
||||
RET
|
||||
SDACMD0: POP AF
|
||||
CP 1
|
||||
RET
|
||||
SDACMDE: POP AF
|
||||
JR SDACMD0
|
||||
|
||||
; Method to send Application Command 41 to the SD card. This command involves retries and delays
|
||||
; hence coded seperately.
|
||||
|
||||
@@ -451,12 +451,13 @@ ATBL: DB 0CCH ; NUL '\0' (null character)
|
||||
; Message table
|
||||
;
|
||||
;--------------------------------------
|
||||
MSGSON: DB "+ RFS ", 0ABh, "2.1 **", 00DH, 000H ; Version 2.x-> as we are now using the v2.x PCB with 4 devices on-board
|
||||
MSGSONTZ: DB "+ TZ+RFS ", 0ABh, "2.1 **", 00DH, 000H ; Version 2.x with version 2.1+ of tranZPUter board installed.
|
||||
MSGSONTZ: DB "+ TZ" ; Version 2.x with version 2.1+ of tranZPUter board installed.
|
||||
MSGSON: DB "+ RFS ", 0ABh, "2.1a **", 00DH, 000H ; Version 2.x-> as we are now using the v2.x PCB with 4 devices on-board
|
||||
MSGNOTFND: DB "Not Found", 00DH, 000H
|
||||
MSGRDIRLST: DB "ROM Directory:", 00DH, 000H
|
||||
MSGTRM: DB 00DH, 000H
|
||||
MSGBADCMD: DB "???", 00DH, 000H
|
||||
MSGSDINITER:DB "SD Card Error ", 0F9H, 00DH, 000H
|
||||
MSGCDIRLST: DB "SD Card Directory ",0F9H,":", 00DH, 000H
|
||||
MSGSDRERR: DB "SD Read error, Sec:",0FBH, 000H
|
||||
MSGSDWERR: DB "SD Write error, Sec:",0FBH, 000H
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
525c4ebbbe5a910d57b5fd23ad26f04f262fb0a7
|
||||
@@ -0,0 +1 @@
|
||||
fc4eb8df3fdee87b14cc5ba34eef8204c33fc7fb
|
||||
@@ -0,0 +1 @@
|
||||
98c1948fc37352d7771102e2528f08a1cff6580f
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user