J'ai un peu simplifié en allant chercher directement le numéro de cluster en RAM sans le charger dans le registre D.
Code : Tout sélectionner
*------------------------------------------------------
* INITIALISATION DU LBA DE LA DISQUETTE DE DEMARRAGE
* SD_LB0 = nombre de secteurs par cluster (1 octet)
* SD_LB0+2 = numero de secteur du boot sector (2 octets)
* 26,X = n° cluster relatif au boot sector (poids faible)
* 27,X = n° cluster relatif au boot sector (poids fort)
*
* LBA0 = XX YY
* N*CLUSTER = UU VV 00 (UU VV = N*A)
* + 00 ZZ TT (ZZ TT = N*B)
* LBA = (UU+carry2) (VV+XX+ZZ+carry1) (TT+YY)
* /|\ | /|\ |
* |_____| |_____|
*
* Code original de Samuel Devulder
*------------------------------------------------------
FBOOT
LDA 27,X ; Cluster poids fort
LDB SD_LB0 ; Nombre de secteurs par cluster
MUL ; D = msb(CLUSTER)*N = UU VV
ADDB SD_LB0+2
ADCA #0 ; D = UU (VV+XX). Nota: Si SD_LB0+1 contient déjà 0, ADDD SD_LB0+1 suffit.
STD SD_LB0+1 ; sauvé en SD_LB0+1
LDA 26,X ; Cluster poids faible
LDB SD_LB0 ; Nombre de secteurs par cluster
MUL ; D = lsb(CLUSTER)*N = ZZ TT
ADDD SD_LB0+2 ; D = (VV+XX+ZZ+carry1) (TT+YY)
STD SD_LB0+2 ; (VV+XX+ZZ+carry1) (TT+YY) placé en LB0+2
LDB SD_LB0+1 ; B=UU
ADCB #0 ; B=UU+carry2
CLRA ; A=0
STD SD_LB0 ; SD_LB0 = 00 (UU+carry2) (VV+XX+ZZ+carry1) (TT+YY)
TST SD_TYP
BNE FBOOT9 ; ben oui tout est déjà fait pour les cartes SDHC
* recopie + decalage pour carte SD
STB ,-S ; sauvegarde UU+carry2
LDD SD_LB0+2 ; D=(VV+XX+ZZ+carry1) (TT+YY)
LSLB
ROLA ; D*2
STD SD_LB0+1 ; sauvé en SD_LB0+1
LDB ,S+ ; UU+carry2
ROLB ; (UU+carry2)*2 + "carry de D*2"
STB SD_LB0 ; sauvé en SD_B0
CLR SD_LB0+3 ; 0 au bon endroit
FBOOT9
CLRA 0 dans code condition
RTS retour