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

assembler

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.

Publié sur Linked In le 23/11/2024