Bonjour !
Je suis tombé sur Programming:Unlocking ASIC. Des trucs vraiment sympas dans les routines optimisées ! ![]()
Et voici mon petit grain de sel sur le sujet.
Comme mentionné dans le fil de l’ancien forum en lien, c’est de la responsabilité de l’appelant de gérer les interruptions, donc exit tous les DI/EI ! -2 octets
Pour rappel, la séquence complète de déverrouillage du RMR2 à écrire sur le port d’E/S #BCxx est :
NZB, #00,#FF,#77...#8A, STATE (#CD), EOK
NZB : N’importe quelle valeur sauf zéro.
STATE : #CD va déverrouiller (toute autre valeur verrouillera).
EOK : Elle doit être envoyée pour sortir l’ASIC de sa séquence de déverrouillage et récupérer la sélection du registre CRTC. Il peut s’agir de n’importe quelle valeur.
La routine optimisée classique n’exploite pas certaines propriétés de la séquence de déverrouillage. Comme :
- On place les données de la séquence juste après la fin de la routine, avec un
RET, c’est-à-dire un opcode&C9, pas un zéro, hmm… ça m’a tout l’air d’unNZB! : -1 octet - Pourquoi stocker la valeur
EOKdans les données de la séquence ? Peu importe la valeur, on enverra ce qu’on trouve : -1 octet
Cela donne une version un peu plus compacte :
; Send a 17 bytes sequence to I/O port #BCxx to unlock RMR2
; register access. KISS approach using a table of raw values.
;
; Size: 28 bytes
; Time: 178 µs
;
; Output:
; BC=&BC00
; Trashes HL and Flags
rmr2_unlock:
ld bc,&BC00+17
ld hl,_rmr2_data_key
_rmr2_send_key inc b
outi
dec c
jr nz,_rmr2_send_key
_rmr2_data_key ret ; This opcode is also used as SYNC/NZB value (#C9)
db 0, &FF,&77,&B3,&51,&A8,&D4,&62,&39,&9C,&46,&2B,&15,&8A
_rmr2_data_lock db 205 ; 205 to Unlock, anything else to lock
; The routine will over-read one byte at this location
; to retrieve an EOK value, necessary for proper unlocking.
Et maintenant, avec ses 28 octets de long, cette routine très KISS fait passer les routines optimisées pour… Enfin bref, peu importe. (on vous aime quand même !)
Mais la réimplémentation du LFSR par @Urusergi m’a titillé la curiosité. Il y a tellement de façons et de bidouilles de bits pour implémenter ce petit truc LFSR qu’il pourrait y avoir des variations plus courtes quelque part…
…quelques jours, larmes et saignements de nez plus tard : eh bien, pas tant que ça finalement !
J’en ai trouvé une seule :
; Software re-implementation of the LFSR logic described in
; the Amstrad Patent (GB2243701A). It generates a 15 bytes
; sequence as verified by the ASIC to unlock RMR2 access.
;
; Designed by Urusergi
; Modified by Grim (shaving a single byte, pfew!)
;
; Size: 27 bytes
; Time: 389 µs
;
; Output:
; BC=&BCFF
; Trashes HL and AF
rmr2_unlock:
ld bc,&BCFF
out (c),c ; SYNC/NZB
out (c),0 ; SYNC/NUL
ld a,c
_rmr2_send_key
out (c),a
ld h,a
add hl,hl
rra
add hl,hl
ld l,a
xor h
and &F7
xor l
add a,h
and &88
xor l
cp c
jr nz,_rmr2_send_key
ret
J’ai essayé d’abandonner le (mignon) test de sortie cp c pour utiliser un flag à la place après le dernier xor l, mais sans succès pour l’instant. Le cp c survit ! ![]()