Aller au contenu
Eliott65wiki
Sommaire

Référence de l'API

Dans cette page

Fichier généré par tools/gen_api.py depuis api/definition.py : ne pas modifier à la main.

Principe de l’appel

La 6502 prépare un bloc de paramètres dans sa propre mémoire (jamais en page zéro), écrit l’adresse du bloc dans la porte $FFF8 (octet bas) puis $FFF9 (octet haut, ce qui déclenche l’appel), puis attend que le noyau remette $FFF9 à 0. Les résultats et le code d’erreur sont alors dans le bloc.

Octet du blocContenu
+0numéro de service
+1numéro de fonction
+2code d’erreur (écrit par le noyau ; 0 = succès)
+3…paramètres (petit-boutiste), et résultats
        .include "lib/e65.inc"

        lda #<bloc
        ldx #>bloc
        jsr e65_porte          ; ou la macro #E65_APPEL bloc
        lda bloc+E65_ERREUR    ; 0 = succès

bloc:   .byte E65_SVC_ECRAN, E65_ECRAN_TEXTE, 0
        .word $0400            ; page de texte
        .byte $1F              ; blanc sur bleu

Règles : seuls $FFF8–$FFFF sont réservés (porte et vecteurs) ; l’appel est synchrone ; FICHIERS EXECUTER ne revient pas en cas de succès.

Pendant l’appel

La 6502 n’est pas gelée : elle boucle sur $FFF9, et son horloge continue. Ses interruptions IRQ et NMI restent donc servies pendant un appel long (fichier, clé USB). Coût mesuré d’un appel complet (SYSTEME PING, programme LATENCE.E65) : ≈ 5 µs, soit 36 cycles à 7,26 MHz, dont environ 30 pour les instructions de la 6502 elle-même. Pire cas non mesuré : jusqu’à quelques millisecondes si l’appel tombe pendant une scrutation USB.

Interruptions

Pas d’appel système dans un gestionnaire d’interruption. Entre l’écriture de $FFF8 et celle de $FFF9, une interruption qui ferait son propre appel écraserait l’octet bas de l’appel en cours. Si un gestionnaire doit malgré tout appeler le noyau, le programme principal encadre ses appels par PHP / SEI … PLP.

Multitâche et préemption

Ctrl+Tab donne l’écran et le clavier au processus suivant, quel que soit le programme au premier plan (la touche n’est pas transmise).

Jusqu’à 8 processus peuvent tourner ensemble, chacun avec ses 64 Kio (ADR-0015, ADR-0018 : seules ses pages non nulles occupent de la mémoire quand il attend). Un programme peut céder la main (e65_ceder) ; sinon le noyau le préempte toutes les 10 ms par une NMI (ADR-0016), sans rien lui demander. Pendant ces quelques microsecondes, il emprunte les 16 octets $FFE8–$FFF7 et le vecteur NMI, puis les rend ; à la reprise, les 8 octets sous la pile sont écrasés, comme par toute interruption. Un programme qui pilote lui-même la NMI n’est pas compatible.

Numérotation, versions et découverte

  • Version de l’API : 1 (E65_VERSION_API). Elle change quand un numéro, un paramètre ou un format change de façon incompatible ; un ajout (nouvelle fonction, nouveau service) ne la change pas.
  • Plages de numéros de services : 0–15 noyau, 16–127 pilotes de périphériques, 128–255 extensions. Les fonctions sont numérotées à l’intérieur de leur service.
  • Découverte : SYSTEME INFO rend la version du noyau, celle de l’API et le masque des services présents. Un service présent peut répondre ERR_NON_PRET (périphérique absent).
  • Octets réservés par le système dans la mémoire de la 6502 : 8.

Codes d’erreur

CodeNomSignification
0OKsuccès
1ERR_SERVICEservice inconnu
2ERR_FONCTIONfonction inconnue
3ERR_PARAMETREparamètre invalide (adresse hors limites, valeur interdite…)
4ERR_NON_PRETpériphérique absent ou pas encore prêt
5ERR_PERIPHERIQUEerreur d’entrée-sortie
6ERR_FINplus d’entrée à lister
7ERR_ABSENTfichier introuvable
8ERR_FORMATfichier ou système de fichiers non reconnu
9ERR_PLEINsupport plein
10ERR_OCCUPEaucun processus ou mémoire libre, ou aucun autre processus

Services

0 · SYSTEME

Services de base et de diagnostic.

SYSTEME PING — service 0, fonction 0

Ne fait rien ; rend toujours OK. Sert à vérifier que le noyau répond.

Aucun paramètre.

SYSTEME TRACE — service 0, fonction 1

Diagnostic : rend 8 octets visibles depuis le PC (tools/sonde.py).

OctetTailleParamètreSensDescription
+38octets→8 octets recopiés dans l’état du noyau (lisible par SWD)

SYSTEME BATTEMENT — service 0, fonction 2

Signe de vie : incrémente un compteur de l’état du noyau.

Aucun paramètre.

SYSTEME INFO — service 0, fonction 3

Découverte : un programme peut vérifier la version et les services disponibles avant de s’en servir.

OctetTailleParamètreSensDescription
+33version←version du noyau : majeur, mineur, correctif
+61api←version de l’API (numérotation des appels)
+72services←masque des services présents (bit n = service n)
+92reserves←octets réservés par le système dans la mémoire 6502 (8)

SYSTEME TEMPS — service 0, fonction 4

Horloge : mesures de durée par la 6502. Erreur NON_PRET si la plate-forme ne fournit pas d’horloge.

OctetTailleParamètreSensDescription
+34microsecondes←temps depuis le démarrage (timer matériel, µs)
+74cycles←cycles de la 6502 depuis le démarrage (relevé toutes les 1 ms)

SYSTEME HIBERNER — service 0, fonction 5

Écrit l’état complet de la machine (en-tête de 512 octets : écran, clavier ; puis les 64 Kio de mémoire 6502) dans un fichier. Utiliser la routine e65_hiberner de libe65, qui sauvegarde aussi les registres Y, P et S (non visibles sur le bus). Reprise : FICHIERS EXECUTER sur le fichier .HIB (par exemple en tapant son nom dans le shell) ; la routine revient alors à son appelant avec A = $FF.

OctetTailleParamètreSensDescription
+32nom→adresse du nom du fichier d’hibernation (8.3, par exemple ETAT.HIB)
+52reprise→adresse où la 6502 redémarrera lors de la reprise

SYSTEME LANCER — service 0, fonction 6

Charge un programme (ou reprend un fichier d’hibernation .HIB) dans un espace mémoire libre (64 Kio complets, séparés de ceux de l’appelant) sans l’exécuter tout de suite : il démarrera, par son vecteur RESET, la première fois que l’appelant cédera la main. L’appelant garde l’écran et le clavier. ERR_OCCUPE si les 8 processus sont pris ou si la réserve de pages ne suffit pas (ADR-0018).

OctetTailleParamètreSensDescription
+32nom→adresse du nom d’un programme .E65
+51espace←numéro de l’espace mémoire attribué au nouveau processus

SYSTEME CEDER — service 0, fonction 7

Passe la main au processus suivant, sans attendre la préemption (≈ 10 ms). Utiliser la routine e65_ceder de libe65, qui sauvegarde Y, P et S ; elle revient avec A = $FF quand le processus retrouve la main, avec A = $00 tout de suite s’il n’y a pas d’autre processus. La mémoire du processus est intacte (rien n’est copié : la 6502 change simplement d’espace mémoire).

OctetTailleParamètreSensDescription
+32reprise→adresse où ce processus redémarrera quand il retrouvera la main

SYSTEME PROCESSUS — service 0, fonction 8

État du multitâche.

OctetTailleParamètreSensDescription
+31actif←espace du processus appelant
+41premier_plan←espace qui a l’écran et le clavier
+51occupes←masque des espaces occupés (bit n = espace n)
+61espaces←nombre d’espaces mémoire de la machine
+74commutations←nombre de commutations depuis le démarrage

SYSTEME PREMIER_PLAN — service 0, fonction 9

Donne l’écran et le clavier à un processus : l’écran affiche aussitôt sa page de texte, et les touches vont dans sa file. Les autres processus continuent de tourner et d’écrire dans leur propre page, sans rien afficher.

OctetTailleParamètreSensDescription
+31espace→espace qui reçoit l’écran et le clavier

SYSTEME TERMINER — service 0, fonction 10

Termine le processus appelant et libère son espace ; ne revient pas. S’il avait le premier plan, celui-ci passe au processus suivant. ERR_OCCUPE s’il est le seul processus. La routine libe65 e65_quitter enchaîne TERMINER puis, s’il est le dernier, l’exécution de SHELL.E65.

Aucun paramètre.

SYSTEME DORMIR — service 0, fonction 13

Comme CEDER, mais le processus n’est plus choisi jusqu’à son réveil : une touche pour lui (il est au premier plan) ou la fin du délai. Une touche réveille aussitôt, sans attendre la fin de la tranche de temps (ADR-0019). Revient tout de suite (A = $00) si aucun autre processus n’est éveillé ou si une touche l’attend déjà. Utiliser la routine e65_dormir (A, X = délai).

OctetTailleParamètreSensDescription
+32reprise→adresse où ce processus redémarrera à son réveil
+52delai→délai en ms avant le réveil (0 : seulement une touche)

SYSTEME NOM — service 0, fonction 11

Nom du programme qui tourne dans un espace (celui du fichier lancé, exécuté ou repris). ERR_PARAMETRE si l’espace est libre.

OctetTailleParamètreSensDescription
+31espace→espace d’un processus
+42adresse→où écrire le nom (13 octets : nom 8.3 terminé par 0)

SYSTEME TUER — service 0, fonction 12

Termine un autre processus et libère son espace ; s’il avait le premier plan, celui-ci revient à l’appelant. Pour se terminer soi-même : TERMINER.

OctetTailleParamètreSensDescription
+31espace→espace d’un autre processus

1 · ECRAN

Écran 640 × 480 (logique 320 × 240). Les pages de texte et d’attributs restent dans la mémoire de la 6502 et sont lues directement par le pilote vidéo, à chaque image (« zéro copie ») : il suffit d’y écrire.

ECRAN MIRE — service 1, fonction 0

Affiche la mire de diagnostic (barres et rampes de couleur).

Aucun paramètre.

ECRAN TEXTE — service 1, fonction 1

Écran texte 40 × 30, une seule couleur de texte et de fond. Erreur PARAMETRE si la page dépasse $FFF7.

OctetTailleParamètreSensDescription
+32page→adresse de la page de texte (40 × 30 = 1 200 octets, ASCII)
+51couleurs→fond « 4

ECRAN TEXTE_COULEUR — service 1, fonction 2

Écran texte 40 × 30 avec une couleur de texte et de fond par caractère.

OctetTailleParamètreSensDescription
+32page→adresse de la page de texte (1 200 octets)
+52attributs→adresse de la page d’attributs (1 200 octets, fond « 4

ECRAN GRAPHIQUE — service 1, fonction 3

Affiche le graphisme (service GRAPHIQUE, ADR-0025) : 320 × 240, deux plans et 128 lutins. Prend le graphisme comme le service GRAPHIQUE (OCCUPE s’il appartient à un autre processus, NON_PRET si la machine n’en a pas). Revenir au texte : TEXTE ou TEXTE_COULEUR (le graphisme reste au processus).

Aucun paramètre.

ECRAN HERCULES — service 1, fonction 4

Mode Hercules (E10-S8) : 720 × 350 en 1 bit par pixel, monochrome, au centre de l’écran (720 × 480). L’image est lue directement dans la mémoire du programme, sans copie : il dessine par de simples écritures. Ligne y à image + 90 × y ; bit 7 de chaque octet = pixel de gauche ; bit à 1 = encre.

OctetTailleParamètreSensDescription
+32image→adresse de l’image : 350 lignes de 90 octets (31 500 octets, au plus $84EC)
+51encre→0 blanc, 1 ambre, 2 vert

ECRAN HERCULES_TEXTE — service 1, fonction 5

Texte 80 × 25 du mode Hercules, en cellules de 9 × 14 pixels, lu sans copie dans la mémoire du programme (comme TEXTE). Attribut d’un caractère : bit 0 inverse, bit 1 souligné, bit 2 clignotant. Caractères $00 à $7F (bit 7 ignoré ; $00 à $1F : vides). Police 9 × 14 dessinée pour Eliott65.

OctetTailleParamètreSensDescription
+32page→adresse des caractères : 25 rangées de 80 (2 000 octets)
+52attributs→adresse des attributs (2 000 octets), ou 0 : aucun
+71encre→0 blanc, 1 ambre, 2 vert

2 · CLAVIER

Clavier USB (pilote hôte maison). Codes : ASCII, 13 Entrée, 8 retour arrière, 9 tabulation, 27 Échap, $7F Suppr, $81 haut, $82 bas, $83 gauche, $84 droite, Ctrl-A à Ctrl-Z = 1 à 26.

CLAVIER ZONE — service 2, fonction 0

Déclare une file clavier dans la mémoire de la 6502 : [0] tête (écrite par le noyau), [1] queue (écrite par la 6502), [2..17] 16 caractères. La 6502 lit ensuite son clavier sans aucun appel : une touche est en attente quand queue ≠ tête ; après lecture, queue = (queue + 1) & 15. La file est vidée par l’appel.

OctetTailleParamètreSensDescription
+32zone→adresse d’une file de 18 octets en mémoire 6502 (0 : file interne)

CLAVIER LIRE — service 2, fonction 1

Lecture classique, pour les programmes qui n’ont pas déclaré de zone.

OctetTailleParamètreSensDescription
+31caractere←caractère suivant de la file interne, 0 si aucun

CLAVIER DISPOSITION — service 2, fonction 2

Choisit la disposition du clavier.

OctetTailleParamètreSensDescription
+31disposition→0 : US (QWERTY, défaut), 1 : FR (AZERTY)

3 · STOCKAGE

Clé USB vue comme une suite de blocs de 512 octets. Les blocs sont lus et écrits directement à l’adresse choisie dans la mémoire de la 6502.

STOCKAGE INFO — service 3, fonction 0

Capacité de la clé. Erreur NON_PRET tant qu’elle n’est pas prête.

OctetTailleParamètreSensDescription
+34blocs←nombre de blocs
+72taille←taille d’un bloc (512)

STOCKAGE LIRE — service 3, fonction 1

Lit un bloc.

OctetTailleParamètreSensDescription
+34bloc→numéro du bloc
+72adresse→destination (512 octets) en mémoire 6502

STOCKAGE ECRIRE — service 3, fonction 2

Écrit un bloc. Attention : écriture brute, sans système de fichiers.

OctetTailleParamètreSensDescription
+34bloc→numéro du bloc
+72adresse→source (512 octets) en mémoire 6502

4 · FICHIERS

Système de fichiers de la clé ou de la disquette : FAT12, FAT16 ou FAT32 (lecture et écriture ; type détecté automatiquement). Les noms sont des chaînes ASCII terminées par 0 ; chemins avec « / », insensibles à la casse, nom court 8.3 ou nom long (64 caractères au plus).

FICHIERS LISTER — service 4, fonction 0

Une entrée du répertoire racine, en nom court. Erreur FIN après la dernière.

OctetTailleParamètreSensDescription
+32index→rang de l’entrée dans la racine (à partir de 0)
+52adresse→où écrire 18 octets : nom court (13, terminé par 0), attributs (1), taille (4)

FICHIERS LIRE — service 4, fonction 1

Charge un fichier (ou son début) directement en mémoire 6502.

OctetTailleParamètreSensDescription
+32nom→adresse du nom du fichier
+52destination→adresse de chargement en mémoire 6502
+72maximum↔nombre d’octets au plus ; au retour : nombre d’octets lus

FICHIERS EXECUTER — service 4, fonction 2

Charge et lance un programme .E65. En cas de succès, l’appel ne revient pas : la 6502 est suspendue, le programme est chargé à sa place, puis elle redémarre dessus (l’écran repasse en mire, la file clavier est oubliée). En cas d’erreur (FORMAT, ABSENT…), le programme appelant continue.

OctetTailleParamètreSensDescription
+32nom→adresse du nom d’un programme .E65

FICHIERS LISTER_LONG — service 4, fonction 3

Une entrée du répertoire racine, avec son nom long.

OctetTailleParamètreSensDescription
+32index→rang de l’entrée dans la racine
+52adresse→où écrire 70 octets : attributs (1), taille (4), nom long (65, terminé par 0)

FICHIERS ECRIRE — service 4, fonction 4

Crée le fichier, ou remplace son contenu s’il existe (nom court ou long). Ordre d’écriture prudent : données, table FAT, entrée de répertoire, puis libération de l’ancien contenu. Erreurs : PARAMETRE (nom non 8.3 pour une création, ou répertoire), PLEIN, ABSENT (répertoire parent).

OctetTailleParamètreSensDescription
+32nom→adresse du nom (chemin ; nom final 8.3 pour une création)
+52source→adresse des données en mémoire 6502
+72longueur→nombre d’octets (0 : fichier vide)

FICHIERS SUPPRIMER — service 4, fonction 5

Supprime le fichier, ses entrées de nom long, et libère ses clusters.

OctetTailleParamètreSensDescription
+32nom→adresse du nom du fichier (pas un répertoire)

5 · GRAPHIQUE

Graphisme 320 × 240 (ADR-0025) : mémoire vidéo de 32 Kio, palette de 256 couleurs (RVB 4:4:4, 0x0RVB), deux plans (tuiles ou image, 1 à 8 bits par pixel) et 128 lutins. Un seul processus à la fois le détient : son premier appel le prend s’il est libre (palette par défaut, plans éteints, lutins cachés, mémoire vidéo à 0), sinon OCCUPE. Il est rendu quand ce processus se termine, est tué ou exécute un autre programme ; l’hibernation ne le sauve pas. Cartes, images et dessins peuvent aussi être dans la mémoire du programme, lue à chaque image sans copie (sources du PLAN, bit 6 des attributs d’un lutin, TABLE_LUTINS) : il suffit d’y écrire. Formats : voir ADR-0025.

GRAPHIQUE ECRIRE — service 5, fonction 0

Copie de la mémoire 6502 vers la mémoire vidéo.

OctetTailleParamètreSensDescription
+32video→adresse en mémoire vidéo ($0000 à $7FFF)
+52source→adresse en mémoire 6502
+72longueur→nombre d’octets

GRAPHIQUE LIRE — service 5, fonction 1

Copie de la mémoire vidéo vers la mémoire 6502.

OctetTailleParamètreSensDescription
+32video→adresse en mémoire vidéo
+52destination→adresse en mémoire 6502 (au plus $FFF7 en fin)
+72longueur→nombre d’octets

GRAPHIQUE CHARGER — service 5, fonction 2

Charge un fichier de la clé directement en mémoire vidéo, sans passer par la mémoire de la 6502.

OctetTailleParamètreSensDescription
+32nom→adresse du nom du fichier
+52video→adresse en mémoire vidéo
+72decalage→position de départ dans le fichier
+92maximum↔nombre d’octets au plus ; au retour : nombre d’octets lus

GRAPHIQUE PALETTE — service 5, fonction 3

Change des couleurs de la palette. La couleur 0 est celle du fond.

OctetTailleParamètreSensDescription
+31premiere→première couleur modifiée (0 à 255)
+41nombre→nombre de couleurs (0 = 256)
+52source→adresse des couleurs : 2 octets chacune, 0x0RVB, petit-boutiste

GRAPHIQUE PLAN — service 5, fonction 4

Configure un plan. Entrée de carte : bits 0–9 tuile, bit 10 miroir horizontal, bit 11 miroir vertical, bits 12–15 banque de palette.

OctetTailleParamètreSensDescription
+31plan→0 (arrière) ou 1 (avant)
+41mode→0 éteint, 1 tuiles, 2 image
+51bpp→bits par pixel : 1, 2, 4 ou 8
+61tuiles16→0 : tuiles de 8 × 8 ; 1 : 16 × 16
+71log2_largeur→carte de 2^n tuiles de large (5, 6 ou 7)
+81log2_hauteur→carte de 2^n tuiles de haut (5, 6 ou 7)
+91banque→mode image sous 8 bpp : couleur = banque × 16 + valeur
+101sources→bit 0 : carte dans la mémoire 6502 ; bit 1 : tuiles ou image dans la mémoire 6502
+112carte→adresse de la carte (entrées de 16 bits)
+132donnees→adresse des tuiles, ou de l’image
+152defil_x→défilement horizontal
+172defil_y→défilement vertical

GRAPHIQUE DEFILER — service 5, fonction 5

Change seulement le défilement d’un plan.

OctetTailleParamètreSensDescription
+31plan→0 ou 1
+42x→défilement horizontal
+62y→défilement vertical

GRAPHIQUE LUTIN — service 5, fonction 6

Configure un lutin. Le bit 7 de la forme et des attributs est réservé (PARAMETRE).

OctetTailleParamètreSensDescription
+31numero→lutin 0 à 127 (le plus petit passe devant)
+42x→position X (signée)
+62y→position Y (signée)
+82adresse→adresse du dessin
+101forme→bits 0–1 largeur (8 « n), 2–3 hauteur, bit 4 : 8 bpp (sinon 4), bit 5 miroir H, bit 6 miroir V
+111attributs→bits 0–3 banque, 4–5 profondeur (0 caché, 1 derrière les plans, 2 entre eux, 3 devant), bit 6 : dessin dans la mémoire 6502

GRAPHIQUE TABLE_LUTINS — service 5, fonction 7

Table « fantôme » : relue au début de chaque image, elle remplace les lutins. Dans la mémoire 6502, le programme déplace ses lutins par de simples écritures, sans appel au noyau.

OctetTailleParamètreSensDescription
+31ou→0 aucune, 1 mémoire 6502, 2 mémoire vidéo
+42adresse→adresse de la table : 128 lutins de 8 octets (X, Y, adresse, forme, attributs)

GRAPHIQUE TRAME — service 5, fonction 8

Pour se caler sur l’affichage : attendre que le numéro change, puis modifier l’image (moins de déchirures).

OctetTailleParamètreSensDescription
+34image←numéro de l’image affichée (compteur de la vidéo)

GRAPHIQUE REMPLIR — service 5, fonction 9

Remplit une zone de la mémoire vidéo.

OctetTailleParamètreSensDescription
+32video→adresse en mémoire vidéo
+52longueur→nombre d’octets
+71valeur→octet de remplissage

GRAPHIQUE LIGNES — service 5, fonction 10

Table lue à chaque ligne (effets à la manière du HDMA de la SNES, sans copie) : le défilement de la ligne y remplace celui du plan (vagues, parallaxe) ; la banque de la ligne y remplace la banque d’un plan image, ou s’ajoute (modulo 16) à celle de chaque case d’un plan de tuiles. Une image en 16 couleurs peut ainsi montrer jusqu’à 256 couleurs (16 par ligne). Sans effet sous 8 bits par pixel. Le programme modifie la table quand il veut.

OctetTailleParamètreSensDescription
+31plan→0 ou 1
+41table→0 : défilement (240 × 4 octets : X, Y) ; 1 : banque (240 octets)
+51ou→0 aucune, 1 mémoire 6502, 2 mémoire vidéo
+62adresse→adresse de la table

GRAPHIQUE MEMOIRE — service 5, fonction 11

Étend la mémoire vidéo à 64 Kio en empruntant 8 cases libres de la réserve des processus (mises à zéro ; adresses $8000 à $FFFF), ou la ramène à 32 Kio en les rendant. OCCUPE s’il n’y a pas 8 cases libres. Tant qu’elles sont empruntées, elles manquent aux processus en attente (LANCER ou une commutation peuvent être refusés). Elles sont rendues aussi quand le graphisme est rendu. À 32 Kio, une adresse de $8000 à $FFFF se replie sur $0000 à $7FFF.

OctetTailleParamètreSensDescription
+31kio↔32 ou 64 ; au retour : la taille de la mémoire vidéo en Kio

6 · SON

Haut-parleur de la carte (transducteur magnétique sur GPIO20, signal carré par PWM ; le plus fort vers 2,7 kHz, sa résonance). Rien ne bloque : la note ou la mélodie se joue pendant que le programme continue. Une seule à la fois : un nouvel appel remplace la précédente, quel que soit le processus. Le son s’arrête quand son processus se termine, est tué ou exécute un autre programme. NON_PRET sur une plate-forme sans haut-parleur. Fréquences : 0 (silence) ou 20 à 20 000 Hz.

SON NOTE — service 6, fonction 0

Joue une note et rend la main aussitôt.

OctetTailleParamètreSensDescription
+32frequence→en Hz ; 0 : silence
+52duree→en millisecondes ; 0 : jusqu’au prochain appel
+71volume→1 à 255 (rapport cyclique volume / 512) ; 0 : silence

SON ETAT — service 6, fonction 1

Pour attendre la fin d’un son, ou suivre une mélodie.

OctetTailleParamètreSensDescription
+32reste←millisecondes restantes ; $FFFF : sans fin ; 0 : silence
+52note←mélodie : adresse de la note en cours ; 0 sinon

SON MELODIE — service 6, fonction 2

Joue une suite de notes en arrière-plan. Les notes sont lues une à une dans la mémoire du programme, sans copie : il peut changer la suite pendant qu’elle joue (musique générée, tempo). Une note de fréquence invalide arrête la mélodie.

OctetTailleParamètreSensDescription
+32adresse→première note : 4 octets chacune, fréquence (2, 0 : pause) puis durée en ms (2) ; durée 0 : fin
+51volume→1 à 255 ; 0 : silence
+61boucle→0 : une fois ; 1 : reprend au début après la fin

Mis à jour le 15 octobre 2026.