Browse Source

Add verify after write as default

pull/167/head
b1ackmai1er 5 years ago
parent
commit
608dc61e24
  1. 97
      Source/HBIOS/md.asm

97
Source/HBIOS/md.asm

@ -27,6 +27,7 @@ MD_AFSH .EQU %00111000 ; FLASH ATTRIBUTE
;
MD_FDBG .EQU 0 ; FLASH DEBUG CODE
MD_FVBS .EQU 1 ; FLASH VERBOSE OUTPUT
MD_FVAR .EQU 1 ; FLASH VERIFY AFTER WRITE
;
; DEVICE CONFIG TABLE (RAM DEVICE FIRST TO MAKE IT ALWAYS FIRST DRIVE)
;
@ -54,7 +55,7 @@ MD_CFGTBL:
;
MD_INIT:
#IF (MDFFENABLE)
CALL MD_FINIT ; PROBE FLASH CAPABILITY
CALL MD_FINIT ; PROBE FLASH CAPABILITY
#ENDIF
CALL NEWLINE ; FORMATTING
@ -411,7 +412,26 @@ MD_SECM1: ; DESIRED SECTOR IS IN BUFFER
LD BC,MD_FWRIT_R ; PUT ROUTINE TO CALL
CALL FF_FNCALL ; EXECUTE: WRITE 4K SECTOR
;
XOR A
XOR A ; PRESUME SUCCESS STATUS
;
#IF (MD_FVAR==1)
LD IX,MD_F4KBUF ; SET SOURCE ADDRESS
LD BC,MD_FVERI_R ; PUT ROUTINE TO CALL
CALL FF_FNCALL ; EXECUTE: VERIFY 4K SECTOR
;
OR A
RET Z ; RETURN IF SUCCESSFUL
;
LD IX,MD_F4KBUF ; SET SOURCE ADDRESS ; RETRY
LD BC,MD_FWRIT_R ; PUT ROUTINE TO CALL ; WRITE
CALL FF_FNCALL ; EXECUTE: WRITE 4K SECTOR ; ONCE
;
LD IX,MD_F4KBUF ; SET SOURCE ADDRESS ; VERIFY
LD BC,MD_FVERI_R ; PUT ROUTINE TO CALL ; AGAIN
CALL FF_FNCALL ; EXECUTE: VERIFY 4K SECTOR
;
OR A ; SET FINAL STATUS AFTER RETRY
#ENDIF
;
RET
;
@ -754,7 +774,12 @@ FF_NXT2:
; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS.
; IX POINTS TO WHERE TO SAVE DATA
; ON EXIT A NO STATUS IS RETURNED
;
; MD_VERI_R - VERIFY FLASH SECTOR
; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS.
; IX POINTS TO DATA TO COMPARE.
; ON EXIT A RETURNS STATUS 0=SUCCESS NZ=FAIL
;
; MD_FWRIT_R - WRITE FLASH SECTOR
; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS.
; IX POINTS TO DATA TO BE WRITTEN
@ -1024,6 +1049,65 @@ MD_FRD1:
;
MD_FRST .DW 0 ; SAVE STACK
MD_R_SZ .EQU $-MD_FREAD_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
;======================================================================
; FLASH VERIFY SECTOR.
;
; SELECT THE APPROPRIATE BANK / ADDRESS
; VERIFY SECTOR OF 4096 BYTES, BYTE AT A TIME
; SELECT SOURCE BANK, READ DATA,
; SELECT DESTINATION BANK, COMPARE DATA
; DESTINATION BANK IS ALWAYS CURRENT BANK
;
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
; DE = 0000 BYTE COUNT
; IX POINTS TO DATA TO BE VERIFIED
; A CONTAINS CURRENT BANK
; ON EXIT NO STATUS RETURNED
;======================================================================
;
MD_FVERI_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
LD H,C ; SECTOR ; LOCAL STACK
LD L,D ; ADDRESS ; LOCAL STACK
LD (HBX_BUF+MD_FVST-MD_FVERI_R),SP ; SAVE STACK ; LOCAL STACK
LD SP,HBX_BUF + (MD_FVE_S-MD_FVERI_R) ; SETUP TEMP STACK ; LOCAL STACK
MD_FVE_S:
;
PUSH AF ; SAVE CURRENT BANK
;
MD_FVE1:
LD A,B ; SELECT BANK
CALL HBX_BNKSEL ; TO READ
LD C,(HL) ; READ BYTE
;
POP AF
PUSH AF ; SELECT BANK
CALL HBX_BNKSEL ; TO WRITE
;
LD A,C
SUB (IX+0) ; COMPARE BYTE
LD C,A ; SET NON ZERO STATUS
JR NZ,MD_FVE2 ; EXIT IF MISMATCH
;
INC HL ; NEXT SOURCE LOCATION
INC IX ; NEXT DESTINATION LOCATION
;
INC DE ; CONTINUE READING UNTIL
BIT 4,D ; WE HAVE DONE ONE SECTOR
JR Z,MD_FVE1
;
LD C,E ; SET SUCCESS STATUS = 0
;
MD_FVE2:
POP AF ; RETURN TO ORIGINAL BANK
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
;
LD SP,(HBX_BUF+MD_FVST-MD_FVERI_R) ; RESTORE STACK
;
RET
;
MD_FVST .DW 0 ; SAVE STACK
MD_V_SZ .EQU $-MD_FVERI_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
;
;======================================================================
; FLASH WRITE SECTOR.
@ -1156,6 +1240,10 @@ MD_FFSEN .DB 00h ; FLASH FILES SYSTEM ENABLE
.ECHO "MD_FREAD_R "
.ECHO MD_R_SZ
.ECHO "\n"
;
.ECHO "MD_VERI_R "
.ECHO MD_V_SZ
.ECHO "\n"
;
.ECHO "MD_FERAS_R "
.ECHO MD_S_SZ
@ -1180,6 +1268,9 @@ MD_CSIZE .SET MD_I_SZ
#IF (MD_R_SZ>MD_CSIZE)
MD_CSIZE .SET MD_R_SZ
#ENDIF
#IF (MD_V_SZ>MD_CSIZE)
MD_CSIZE .SET MD_V_SZ
#ENDIF
;
#IF (MD_CSIZE>HBX_BUFSIZ)
.ECHO "Warning: Flash code exceeds available space by "

Loading…
Cancel
Save