# Simons' BASIC

Le Simons' BASIC est une extension du BASIC V2 de Commodore utilisé par le Commodore 64. Écrit en 1983 par un jeune programmeur anglais de 16 ans, David Simons, il a été commercialisé par Commodore sous forme de cartouche d'extension. Il a également été diffusé de façon non officielle sous forme de fichier exécutable.

## Contenu

114 instructions sont ajoutées au BASIC V2 de Commodore dans le but d'exploiter le potentiel multimédia du Commodore 64 de façon simplifiée. Le jeu d'instructions étendu ajoute des commandes pour gérer les sprites, les modes graphiques haute résolution, le SID pour le son. Le Simon's BASIC ajoute également des instructions permettant une approche de programmation structurée.

## Les instructions
### Gestion des sprites

* MOB SET - définit les attributs d'un sprite
* MMOB - position du sprite sur l'écran
* RLOCMOB - déplace un sprite d'une position à une autre
* CMOB - définit les deux couleurs principales pour des sprites multicouleurs
* MOB OFF - désactive un sprite
* DETECT - initialise la détection de collision du sprite
* CHECK - vérifie s'il y a collision d'un sprite

### Gestion graphique haute résolution

* HIRES - initialise un mode graphique haute résolution
* MULTI - initialise un mode graphique multicouleurs
* NRM - retourne à l'affichage textuel
* LOW COL - change la couleur du pixel de dessin
* HI COL - réinitialise la couleur du pixel de dessin à sa couleur d'origine
* PLOT - dessine un pixel
* LINE - dessine une ligne
* CIRCLE - dessine un cercle
* ARC - dessine un arc de cercle
* ANGL - dessine un angle de cercle
* PAINT - effectue une opération de remplissage de surface
* REC - dessine un rectangle
* BLOCK - dessine un rectangle plein
* DRAW - dessine un ensemble de lignes
* ROT - définit le facteur de zoom pour l'instruction DRAW
* CHAR - écrit un caractère sur un écran en haute résolution
* TEXT - écrit une chaîne de caractères sur un écran en haute résolution
* TEST - détermine si à un emplacement défini le pixel est dessiné ou non

### Autres commandes graphiques

* COLOUR - définit la couleur de fond d'écran et de la bordure d'écran
* CSET - sélectionne une police de caractères
* MEM - copie la police de caractères standard de la ROM en RAM
* BCKGNDS - configure le mode étendu de la couleur de fond
* FLASH - fait flasher l'écran
* OFF - annule le flashage de l'écran provoqué par l'instruction FLASH
* BFLASH - fait flasher la bordure de l'écran
* FCHR - rempli une zone d'écran avec un caractère
* FCOL - change la couleur des caractères dans une zone d'écran
* FILL - une combinaison des instructions FCHR et FCOL
* MOVE - copie une partie de l'écran
* INV - affiche une partie de l'écran à l'envers
* LEFT - déplace l'écran vers la gauche
* RIGHT - déplace l'écran vers la droite
* UP - déplace l'écran vers le haut
* DOWN - déplace l'écran vers le bas
* GRAPHICS - variable réservée toujours égale à $D000 (l'adresse de base du VIC-II)

### Gestion du son et du SID (microprocesseur)

* MUSIC - joue une série de notes contenue dans une variable de chaîne de caractères
* PLAY - détermine si le programme doit continuer ou non pendant l'exécution de l'instruction MUSIC
* VOL - définit le volume principal
* WAVE - définit la forme d'onde pour une voix
* ENVELOPE - définit l'enveloppe ADSR d'une voix
* SOUND - variable réservée, toujours égale à $D400 (l'adresse de base du SID)

### Gestion du clavier et des interruptions

* FETCH - attend une saisie sur le clavier avec les restrictions définies par la commande FETCH
* INKEY - teste si une touche de fonction a été saisie
* ON KEY - teste une touche particulière et exécute un saut si oui
* DISABLE - désactive la commande précédente ON KEY
* RESUME - réactive la commande précédente ON KEY

### Gestion des périphériques d'entrées

* JOY - informations en lecture de la position du joystick
* POT - informations en lecture du paddle
* PENX - informations en lecture de la position horizontale du stylo optique
* PENY - informations en lecture de la position verticale du stylo optique

### Définition des sprites et des caractères graphiques

* @ - représente une ligne de graphique d'un sprite ou d'un caractère graphique
* DESIGN - utilise les lignes @ pour définir un sprite ou un caractère graphique

### Gestion des événements d'erreurs

* ON ERROR - défini une séquence de code lors d'une détection d'une condition d'erreur
* OUT - fin d'une séquence de code de gestion d'erreur
* NO ERROR - annule ON ERROR et rend le contrôle des erreurs BASIC à l'interpréteur

### Gestion du lecteur de disquettes

* DIR - affiche le répertoire d'une disquette sans effacer un éventuel programme BASIC stocké en mémoire
* DISK - envoie une commande au lecteur de disquette
* SCRSV - sauvegarde un écran de texte sur disquette
* SCRLD - recharge un écran de texte depuis une disquette

### Gestion de l'imprimante

* HRDCPY - imprime le contenu d'un écran texte
* COPY - imprime le contenu graphique d'un écran

### Gestion des chaînes de caractères

* INSERT - insère un champ texte à l'intérieur d'un autre champ
* INST - similaire à INSERT, mais réécrit par-dessus au lieu d'insérer
* PLACE - recherche d'un champ texte dans le contenu d'un autre champ
* DUP - duplique un champ de texte un nombre donné de fois

### Gestion de format de texte

* AT - affiche un champ texte aux coordonnées d'un écran texte
* CENTER - centre un champ texte au milieu d'un écran texte
* USE - défini un format numérique d'un champ texte
* LIN - retourne la position verticale du curseur

### Instructions mathématiques

* MOD - effectue une division et restitue le reste de la division entière
* DIV - effectue une division et restitue le quotient de la division entière
* FRAC - restitue la partie fractionnelle d'un nombre
* EXOR - effectue une opération logique OR exclusive

### Instructions d'aides à la programmation

* AUTO - génère automatiquement des numéros de lignes lors de la saisie d'un programme BASIC
* RENUMBER - renumérote les lignes d'un programme BASIC (mais ne corrige pas les redirections GOTO/GOSUB)
* OLD - restaure un programme BASIC accidentellement effacé par l'instruction NEW
* KEY - assigne un champ texte en tant que macro à une touche de fonction
* DISPLAY - affiche toutes les touches de fonctions macro
* MERGE - fusionne un programme BASIC de la disquette à celui actuellement en mémoire
* PAGE - affiche un programme BASIC page par page
* OPTION - affiche en surbrillance les instructions spécifiques Simons' BASIC lors de l'instruction LIST
* DELAY - modifie la vitesse d'affichage du scroll lors d'une commande LIST
* FIND - recherche un champ texte dans un programme BASIC
* TRACE - affiche la ligne de programme actuellement en cours lorsqu'un programme est exécuté
* RETRACE - affiche le résultat d'un trace
* DUMP - affiche toutes les valeurs des variables excepté les tableaux de variables
* COLD - reset à froid du C64

### Gestion de la sécurité du code source

* DISAPA - cache une ligne de programme BASIC
* SECURE - cache toutes les lignes marqués avec DISAPA afin qu'elles n'apparaissent pas lors d'un affichage avec LIST

### Instructions de programmation structurée

* ELSE - permet un choix alternatif lors d'une condition IF/THEN
* REPEAT - démarre une boucle de type REPEAT/UNTIL
* UNTIL - défini la condition de boucle à REPEAT/UNTIL et en fixe la fin
* RCOMP - reprend la dernière condition IF/THEN
* LOOP - défini le début d'une boucle qui va jusqu'à ce que la condition EXIT IF soit vraie
* EXIT IF - si la condition est vrai, quitte la structure LOOP/END LOOP
* END LOOP - défini la fin de la boucle jusqu'à ce que la condition EXIT IF soit vrai
* PROC - défini le début d'une procédure nommée
* END PROC - défini la fin d'une procédure nommée
* CALL - saute à une procédure nommée défini par PROC/END PROC et y reste
* EXEC - saute à une procédure nommée défini par PROC/END PROC et revient à la suite du code après exécution
* LOCAL - redéfini une variable utilisée dans une procédure
* GLOBAL - inverse l'effet de la précédente commande LOCAL

### Instructions diverses

* CGOTO - équivalent du GOTO, mais accepte des expressions issues de calculs
* RESET - déplace le pointeur d'exécution DATA à une ligne définie
* PAUSE - suspend l'exécution du programme pour un temps spécifié en secondes

### Autres fonctionnalités

* $ and % sont également considérés comme instructions pour un total de 114 instructions supplémentaires.