Session du Dojo de Développement du 22/11/2024
[coding, heuristics]
Session du Dojo de Développement du 22/11/2024
Sujet retenu : Démo (i.e. une persone présente une session de code, en répondant aux questions et en empruntant éventuellement les directions suggérées).
Langage : assembleur 6502.
Sujet : dessiner une mosaïque de pixels
Présentation de l’émulateur 6502 en ligne :
- un écran de 32x32 pouvant allumer des pixels de 16 couleurs possibles, “mappé” sur la plage d’adresse $0200-05FF
- un générateur aléatoire accessible par lecture de l’adresse $00FE
- un flot d’entrée clavier accessible par lecture de l’adresse $00FF
Présentation sommaire du 6502 :
Créé en 1975, a équipé ces ordis 8 bits avec lesquels un enfant pouvait apprendre à programmer.
- 3 registres A,X,Y
- un registre des drapeaux NV-BDIZC
- un compteur de programme PC
- un pointeur de pile SP
- chargement, stockage, addition avec retenue
- adressage absolu, indexé, indirect indexé
Pendant toute la session, les questions fusent. Vers 20h30, nous avons notre programme (mais non commenté).
lda #$00 ; $42-$43 : destination
sta $42 ; destination partie basse
boucle:
lda $fe ; A = valeur aléatoire
and #$03 ; A = 0,1,2 ou 3
clc
adc #$02 ; A = 2,3,4 ou 5
sta $43 ; destination = $200, $300, $400 ou $500
ldy $fe ; Y = aléatoire
lda $fe ; A = aléatoire
sta ($42),y ; pixel sur destination [$200..$5ff]
jmp boucle
(Non, le programme ne s’arrête pas).
B. demande : en combien de temps l’écran est totalement rempli ? Ça me paraît bizarre que ça aille aussi vite. (J’ai affirmé à tort que l’écran comprenait 4096 pixels. Stupide).
Discussion. Le programme repeint aussi certains pixels en noir, donc c’est difficile à dire. Mais ça pourrait se tracer.
P. suggère qu’on peigne en une seule couleur.
On met en place un contrôle : dès que l’écran est “rempli”, appuyer sur . stoppe le programme.
On met en place un compteur à l’adresse $1000
lda #$00
sta $42
sta $1000 ; init compteur
sta $1001
boucle:
lda $fe
and #$03
clc
adc #$02
sta $43
ldy $fe
lda #$01 ; une seule couleur
sta ($42),y
clc
inc $1000 ; compteur++ poids faible
bne suite
inc $1001 ; compteur++ poids fort
suite:
lda $ff ; lecture touche pressée
cmp #$2E ; c'est le point ?
bne boucle
Valeurs de compteur obtenues sur 5 tests :
$26C6 = 9926
$19F3 = 6643
$19F3 = 6643
$1C62 = 7266
$2426 = 9254
B. fait remarquer que ce problème est du type “collectionneur de vignettes” : quelle est l’espérance pour finir la collection de N valeurs dans un tirage avec remise.
B. juge que pour N = 4096, moins de 10000 c’est anormalement peu.
Je déclare que cette solution mathématiquement impossible est pourtant ce que nous obtenons, en tenant compte de la lenteur de réaction pour arrêter le programme.
Mais en fait il y a 1024 pixels à remplir et non 4096.
L’espérance = N x Somme des 1/K pour K de 1 à N
Pour N = 1024 : 7689.395888412807
Somme toute, ça se tient.