Radio logicielle

⚠ AVERTISSEMENT : Toutes les informations fournies dans cette publication le sont à des fins éducatives uniquement. Le site n'est en aucun cas responsable de toute utilisation abusive de ces informations. Vous êtes seul responsable de vos actes devant la loi.

Radio logicielle ? C’est quoi donc ?

Un peu d’histoire…

En 2012, Antti Palosaari (aidé par Eric Fry et Osmocom) se sont aperçus que certains dongles DVB-T (qui permettent de capter la TNT) pouvait être « dévié » grâce au chipset RTL2832U dont ils étaient composés. De leurs découvertes est né le projet rtl-sdr.

Le signal I/Q pouvait être directement écouté sur la gamme de fréquence de 22 Mhz à 2200 Mhz et être utilisé par des applications.

Et que trouve-t-on entre 22Mhz et 2200Mhz ?

DescriptionFréquences
Radio FM 87,5 à 108 MHz
Radio DAB 174 à 240 MHz
Les bandes ISM 433 et 866 Mhz

Il y a quelques années donc, j’avais acheté un Cinergy TStick RC Rev3 qui, manque d’outils, ne m’a pas beaucoup servit.

Je l’ai ressorti il y a quelques semaines et fait un tour sur la distribution linux (ubuntu mate) de mon GPD Pocket 3 pour voir ce qu’ils proposaient pour le RTL2832U…

Installons les packages kivonbien:

sudo apt-get install rtl-sdr alsa-utils sox

Et nous commencerons simplement par la radio en FM.

rtl_fm -f 103.6M -M fm -s 170k -A fast -r 32k -l 0 -E deemp | play -r 32k -t raw -e s -b 16 -c 1 -V1 -

Cette commande permet d’écouter la fréquence 103.6 Mhz (Bel-RTL en Belgique) en 32kbits et l’envoie sur la sortie son.

Nous continuerons la découverte du SDR bientôt avec, par exemple, l’espionnage de thermomètre sans-fil… Même pas peur.

Mais ceci est une autre histoire, qui sera contée une autre fois.

(c) Pexels – David McBee

Récupération de Bitcoin

Lors de mes recherches de documentation pour la création de l’article sur les chaines de blocs, je me suis rappelé que j’avais crée un wallet Bitcoin il y a quelques années. Ce wallet était toujours dans ma Dropbox (ce qui n’est vraiment pas à faire !).

Et si ce wallet contenait des bitcoins et que j’étais devenu millionnaire ?

tl;dr: Non

 √ bitcoin % ls -latr
 total 144
 -rw-r--r--@  1 miguelvanhove  staff  73728 30 nov  2013 Untitled.dat

Après un examen rapide, il semblerait que les fichiers wallet du client officiel étaient sauvés dans un format BerkleyDB.

Pour notre facilité, Jim Zhou a réalisé une application (disponible via docker pour plus de facilité) qui permet d’extraire les clefs de ce wallet. Les commandes suivantes générent un fichier wallet_output.txt que nous pouvons utiliser ensuite.

docker pull jimzhou/walletlib:latest
docker run -v "$(pwd):/app" jimzhou/walletlib:latest Untitled.dat -o wallet_output.txt --keys

Le fichier wallet_output.txt résultant contient des lignes telles que

1Kd4srBoYo8AncnbJJZts6xoJDbzPy1RGW:Kwtk6bFMbnU8gkDuHno4ot2RqZSh8Dcy98RMqKdN3ps4htEDoeRt
15W4WWX2YzagGAMEkj8Y1wsta35FpC6Ys6:L36x7eB8LJPFBkxgUt6CJYaqc8A5fmUYL3crnHbi4zTyYbSTVqav

Dans un premier lieu, nous n’aurons besoin que des adresses avant le :.

cat wallet_output.txt|cut -d ':' -f 1|tr 'n' ' '

Il ne reste plus qu’à copier le résultat vers un site de Bitcoin Addresse Lookup tel que blockonomics.co.

Résultat

Comme vous pouvez le voir, ce n’est pas encore cette fois que je serai millionaire. Mais j’imagine tout ces wallets qui doivent trainer sur d’autres disques dur et que leur propriétaire ont oublié…

Dans le cas contraire, il aurait été nécessaire d’extraire également les private_key… mais ceci est une autre histoire, qui sera contée une autre fois.

CrocoDS

Fin 2006, je m’achète une Nintendo DS et nostalgique de mon Amstrad CPC, j’aimerai pouvoir emporter mes vieux jeux sur cette petite console.

Je me met donc à chercher un émulateur Amstrad qui serait assez propre que pour être porté sur la Nintendo DS.

Je tombe assez rapidement sur WinCPC dont le code est très propre et bien structuré et contacte Demoniak, son auteur, pour avoir l’autorisation de porter son code sur la DS. Permission reçue, je sors vite une version qui tourne à 70% de la vitesse réelle du CPC.

Mais je ne suis pas seul, un concurrent arrive. Une compétition saine a lieu entre Alekmaul qui fera AmeDS et moi pour faire la version la plus jouable. Après de nombreuses optimisations, ma version atteint la première une vitesse de 100% mais je serai vite rejoint par Alekmaul.

Pendant cette période, j’enverrai quelques bug report à Demoniak qui en tiendra compte et améliorera WinCPC suite à mes retours (désolé – et merci – Ludo).

AmeDS utilisant le core de Caprice, sa version émule mieux l’Amstrad que CrocoDS (et possède une base de donnée en ligne – profitant du Wifi intégré de la DS).

Ma version à l’avantage d’avoir quelques options tel que le redimensionnement automatique et profite de meilleurs graphismes (icônes et clavier) grâce à Kukulcan.

Si vous possédez une Nintendo DS et êtes fans d’Amstrad, les deux versions sont absolument à avoir.

Le code source est disponible sur GitHub mais je n’arrive plus à le recompiler. Le devkit sur lequel il était basé a trop évolué et il y aurait beaucoup à modifier pour rendre cette version encore compilable. Avis à celui qui est tenté par le challenge.

Quelques années plus tard, je sortirai CrocoDS sur d’autres devices (dont la version OpenDingux – ma préférée), une version retroArch, une version iPad, iPhone, macOS et une version Web disponible sur crocods.org/web.

Du coeur d’origine de WinCPC, il ne reste presque plus rien. CrocoDS est devenu un Gloubi-boulga de Arnold, Caprice et de quelques restes de WinCPC.

Ayant fait en sorte que le code soit le plus portable possible, développer pour de nouveaux matériels est assez rapide.

J’ai un peu abandonné le développement de cet émulateur (d’autres en font de bien meilleur que moi) et j’ai rediriger mes envies Amstrad sur le développement de jeux pour Crazy Piri… mais ceci est une autre histoire, qui sera contée une autre fois.

Boulder dash

Introduction

J’ai eu mon premier ordinateur en 1987. Après avoir goûté à la programmation par le Logo sur le Thomson TO7 de l’école, il me fallait ma propre machine.

Mes parents ne voulant pas que j’utilise la télévision familiale pour cet usage, je devais donc m’orienter vers un ensemble clavier-écran (ou bien acheter un écran supplémentaire qui aurait dépassé mon budget). Cela m’arrangeait vu qu’il prendrait ainsi place dans ma chambre et me serait attribuer à temps plein.

Mon choix (ou plutôt celui de mes parents) s’est donc porté vers le Schneider CPC464 version monochrome (la version belge de l’Amstrad). Heureux choix avec le recul.

Mon premier jeu acheté avec le CPC fût Jumpman , un jeu « budget » basé sur le jeu d’arcade Q*Bert.

Quelques mois plus tard, mon meilleur ami a reçu un CPC6128 avec lecteur de disquette. Lecteur de disquette auquel je n’aurais accès que quelques années plus tard avec le Schneider EuroPC… Mais ceci est une autre histoire, qui sera contée une autre fois..

Vu que nous étions quelques un à avoir un CPC464 à l’école, mon meilleur ami pris donc un lecteur de cassette à connecter sur son 6128. Cela me permit d’avoir le jeu auxquels j’ai le plus joué sur le CPC: Boulder Dash !

Boulder Dash

Boulder Dash est un open-world.. Si, si… N’ayons pas peur des mots. C’est juste un petit vu que la cave n’est composées que de 40 blocs horizontaux sur 22 verticaux.

C’est en partie pour ça que j’adore ce jeu. Le joueur dispose d’une grande liberté de mouvement et chaque cave (les différents niveaux) peut être refaite plusieurs fois sans lassitude.

Aimant tellement ce jeu, j’ai voulu faire ma version sur mes devices Apple (à voir si je la sors un jour… comme beaucoup de mes développements).

Construction des niveaux

Boulder Dash comptant 64 (16 x 4) caves, si il fallait décrire chaque cave, il faudrait 70400 (16 x 5 x 40 x 22) octets. Il y aurait moyen d’optimiser cela étant donné qu’un octet est trop large pour la description d’un bloc mais cela resterait beaucoup trop pour un pauvre Amstrad avec ses 64ko (donc 16ko utilisé pour la gestion de l’écran).

En 2005, Arno Weber interviewa Peter Liepa à propos de son jeu:

[…] L’éditeur m’a mis en contact avec Chris Gray, qui avait soumis un jeu en Basic, mais qui à l’époque n’avait pas les compétences nécessaires pour le convertir en langage machine. Donc, cela semblait être un bon projet pour acquérir de l’experience et je me suis assis et j’ai commencé. Le jeu ressemblait à un jeu d’arcade appelé The Pit, mais après l’avoir examiné de plus près, je ne pensais pas que le jeu avait du potentiel – trop de choses étaient prédéterminées. Mais j’ai commencé à jouer avec des éléments de base tels que la terre, les rochers et les diamants et, en quelques jours, j’ai construit le « moteur physique » de base de ce qui allait devenir Boulder Dash. Je me suis rendu compte qu’en utilisant un générateur de nombres aléatoires, vous pouviez générer des grottes aléatoires, et qu’en contrôlant la densité de rochers et de diamants, vous pouviez jouer à des jeux intéressants. Le jeu était non seulement intéressant du point de vue des casse-tête, mais il faisait également appel à diverses motivations émotionnelles – non seulement psychotiques évidentes telles que la cupidité (collectionner des diamants), la destruction (déloger des rochers et tuer des lucioles) – mais aussi des névrotiques comme le nettoyage de toute les saletés de la grotte. Et je pense que le jeu avait un sens de l’humour – si vous trouvez quelqu’un qui s’ecrase par inadvertance sous un rocher délogé drôle. […] Peter Liepa (via boulder-dash.nl)

Les caves sont donc décrites via des primitives (remplissage de rectangles aléatoires, placement de lignes et de points, …), l’occupation mémoire est ainsi grandement réduite.

La cave I du premier Boulder Dash, par exemple, est décrite de cette façon en format BDCFF (Boulder Dash Construction Kit File Format)

[cave]
DiamondValue=5 10
DiamondsRequired=75 75 80 85 90
CaveTime=150 150 130 130 120
Colors=Orange Purple White
RandSeed=100 137 140 251 51
RandomFill=BOULDER 240 DIAMOND 120

[objects]
FillRect=5 8 17 20 WALL SPACE
Point=12 8 DIRT
FillRect=25 8 37 20 WALL SPACE
Point=31 8 DIRT
Line=17 16 25 16 WALL
Line=17 17 25 17 SPACE
Point=7 10 INBOX
Point=8 10 OUTBOX
[/objects]

[/cave]

Cela donne la cave suivante:

Attachment.png
Cave I

Le gain de mémoire est donc évident et en utilisant une routine de génération de nombres aléatoires avec une graine prédéfinie (RandSeed), les niveaux seront toujours les mêmes (et même sur des plateformes différentes telles que le C64 ou le PC)

La description du format BDCFF est disponible sur ce site: http://www.gratissaugen.de/erbsen/bdcff.html

Génération de nombres aléatoires

Pour ceux qui sont interressé par la génération des nombres aléatoires pour la création des niveaux, cela se passe comme cela:

void boulderdashRandom(int *RandSeed1, int *RandSeed2) // Random generator used on C64
    {
    short TempRand1;
    short TempRand2;
    short carry;
    short result;

    TempRand1 = (*RandSeed1 & 0x01) * 0x80;
    TempRand2 = (*RandSeed2 >> 1) & 0x7F;
    result = (*RandSeed2) + (*RandSeed2 & 0x01) * 0x80;
    carry = (result > 0xFF);
    result = result & 0xFF;
    result = result + carry + 0x13;
    carry = (result > 0xFF);
    *RandSeed2 = result & 0xFF;
    result = *RandSeed1 + carry + TempRand1;
    carry = (result > 0xFF);
    result = result & 0xFF;
    result = result + carry + TempRand2;
    *RandSeed1 = result & 0xFF;
    }

Heritage

Si vous voulez rejouez à cet excellent jeu, je vous conseille d’essayer Rocks’n’Diamonds qui contient tous les niveaux originaux de Boulder Dash, mais aussi ceux de Emerald Mine ou de Sokoban.

Source:

Module

Est-ce que les noms de Jugi, Scorpik, Captain, Lizardking ou Jogeir Liljedahl ? Si vous êtes au courant de la scène démo des années 1990, la réponse est forcément oui !

Ces personnes (et bien d’autres) nous ont fourni des modules (les .mod, .s3m ou .xm) qui ont enchantées nos oreilles.

Mes principales sources étaient le CD du magazine PC Team, les partages lors de demoparty et les BBS (saviez-vous qu’il en existe encore ? cela fera l’object d’un futur article)

Mon player préféré était (et reste) Cubic Player du groupe Cubic Team & $eeN (regardez leur intro 64k Lasse Reinbøng quand vous aurez le temps). Je l’ai encore beaucoup utilisé lors de l’arrivée du mp3 jusqu’à mon passage à Windows 95 et son Winamp… Fan de la ligne de commande, il m’a fallu très longtemps pour passer à Windows et abandonner mon cher MS-DOS.

J’ai été agréablement surpris lorsque j’ai vu que Cubic Player continuait à vivre sous Linux (et sur d’autres OS aussi) sous la forme de Open Cubic Player et qu’il est encore bien suivi.

apt-get install opencubicplayer
ocp -dcurses  # pour le lancer en ligne de commande dans la fenêtre active

Mon top 5 (pas facile de choisir)

  • Space Debris – Markus « Captain » Kaarlonen (SPACEDEBRIS.mod). Captain nous raconté de la genèse sur son site. A lire absolument !
  • Onward Ride – Jukka Jugi Kaartinen (onward.xm). Extrait de la demo Dope du groupe Complex
  • Fountain of Sighs – Adam « Scorpik » Skorupa (FOUNTAIN.mod). Gagnant de la 4channel music à la The Party 1995
  • Lasse Reinbøng – Dirk « Doj » Jagdmann (INTRO15C). Musique de l’intro Lasse Reinbøng
  • Dance of the goblins – Maarten « Crystal Score » van Strien (DANCE.IT). Souvenir de la Wired 1997.

Et si vous vous allez plus loin, sachez que FastTracker II a été refait en SDL2 aussi !

AC 2021

Le virus est là depuis 1 an et demi. Le monde se meurt. Nous avons besoin de sortir de chez nous !

J’ai fais beaucoup de démoparty auparavant, mais n’avais jamais fait de conventions. M’étant remis sur Amstrad depuis peu, l’AC 2021 ne pouvait que m’attirer.

C’est donc le weekend du 27 et 28 novembre 2021 que je suis parti, seul loin de ma famille, à cette convention dans le petit village de Congis pas loin de Paris.

C’est l’occasion de rencontrer IRL tout des gens avec qui je parle sur les forums, groupe facebook et autres Discord.

L’occasion aussi de présenter la dernière version de notre remake de Puzzle Bobble.

L’association RGC organise, depuis 2006, deux conventions retrogaming. La plus grande, la RGC, est dédié principalement aux consoles. Celle-ci, l’AC, est plus dédiée aux ordinateurs (Amiga/Commodore, Atari, Amstrad, MSX, Thomson, Oric, etc).

Je ne me souvenais plus avoir vu autant d’Amstrad CPC. Même aux démoparty il y a 25 ans, il n’y en avait pas autant. Quand on voit les productions qui sortent sur cette machine actuellement, ce n’est pas étonnant. Le CPC est plus en forme que jamais.

Les époques ont changé, Covid oblige, nous ne pouvons plus dormir sous les tables. De toute façon, avec mon grand age, je n’en avais pas l’intention. Une nuit d’hôtel (même spartiate) m’était nécessaire. Les pizzas ont disparu aussi, nous nous faisons un beau restaurant en fin de journée. L’embourgeoisement nous a rattrapés.

Beaucoup de belles rencontres. Je ne citerai personne de peur d’oublier quelqu’un, mais ils se reconnaitront.

Je n’avais qu’une envie à la fin de cette convention: d’assister à la prochaine !

Flipper Zero

J’adore Kickstarter même si les délais pour recevoir la récompense sont souvent très longs. (J’attend toujours mon Spectrum Next commandé en octobre 2020).

Fin juillet 2020, j’ai commandé le Flipper Zero. Le couteau suisse pour les hackers (dixit les créateurs) et il est enfin arrivé !

Cet petit accessoire, de la grandeur d’une grosse clef usb (oui, une bien grosse de 98 x 39 x 24 mm et 140 grammes) est bourré de fonctionnalités :

  • un lecteur et émulateur RFID et NFC
  • un lecteur et émulateur de iButton Reader & Emulator (Dallas)
  • un émetteur-récepteur infrarouge (800-950 nm)
  • un émetteur-récepteur Gigahertz (300-928 Mhz)
  • un module Bluetooth LE
  • des GPIO
  • un port USB
  • un slot MicroSD
  • un écran monochrome de 128×64 pixels
  • un buzzer
  • une batterie de 2000 mAh
  • un processeur STM32 ARM Cortex-M4
  • un firmware totalement open source et totalement scriptable

Tellement de trucs que cela en est abusé.

Je ne pourrais évidemment pas faire le tour du module avec un seul article mais vous pouvez déjà imaginer tout ce qu’il permet.

Nous commencerons par la copie de code infrarouge. Histoire d’en faire un télécommande d’arrêt d’urgence de TV par exemple 😉

Mais ceci est une autre histoire, qui sera contée une autre fois.

Edito – Septembre 2022

Plus de 3 mois sans rien poster.. alors que j’ai plein de textes déjà écrits… J’abuse vraiment !

Beaucoup de raisons à tout cela. Des bonnes mais aussi des mauvaises (Qui a dit procrastination ?)

Le secteur technologique souffre. Rupture de stock partout, inflation galopante. Une impression que l’innovation n’est plus la priorité pour beaucoup.

Mais sinon, de mon côté, que c’est-il passé ces 3 derniers mois ?

J’ai enfin eu mon Flipper Zero, je vous en parle plus en détail rapidement.
J’ai aussi eu une nouvelle console portable qui mérite que l’on s’attarde sur elle (la Miyoo Mini)
Le GPD Pocket 3 a remplacé mon GPD Pocket 2. Et j’ai remplacé tous mes claviers Azerty par des Qwerty.
J’ai découvert avec plaisir (oui, oui) Windows 11

De quoi vous gaver jusqu’au bout de l’année sans problème.

Développement de BriXen: épisode 3 – Visual studio code

Après quelques années d’utilisation de Sublime Text, j’utilise maintenant Visual Studio Code qui a toutes les qualités de mon précédent éditeur avec l’avantage d’être gratuit.

Pour développer une application Amstrad CPC en C, j’ai besoin au minimum:

d’un raccourci me permettant de compiler rapidement (via shift+cmd+b idéalement)
d’un raccourci me permettant de tester mon application (shift+cmd+r)
de coloration syntaxique
d’une indentation automatique de mon code

Visual Studio Code étant facilement personnalisable, rien de ceci ne lui est impossible.

Compilation

Notre fichier build.sh étant déjà disponible dans notre template, il suffit de créer un raccourci pour l’exécuter.

Pour cela, nous créons un fichier tasks.json dans le dossier .vscode présent à la racine de notre projet.

Ce fichier (disponible à la fin de l’article) sera constitué de:

Ce fichier json décrit une tâche qui:

tue les instances de Retro Virtual Machine qui seraient encore en train de fonctionner.
exécute notre commande build.sh (L’emplacement de votre projet doit être modifié).
prend le retour de la commande build.sh et en retire les warning et error pour une affichage plus propre

Pour lier la tache à notre raccourci (cmd+shift+b), il faut modifier le fichier keybindings.json (cmd+shift+p pour afficher la Command Palette et entrez ‘open keyboard shortcuts (JSON)’)

Dans ce fichier json, créez l’entrée suivante

{
"key": "shift+cmd+b",
"command": "workbench.action.tasks.runTask",
"args": "SDCC - make"
}

Execution

Pour notre tâche d’exécution, le principe est le même que pour la compilation, le shortcut étant juste:

{
"key": "shift+cmd+r",
"command": "workbench.action.tasks.runTask",
"args": "SDCC - Retro Virtual Machine"
}

3. La coloration syntaxique

Visual Studio Code dispose déjà (évidemment) d’un plugin de coloration syntaxique pour le source code. J’ai pris celui que propose Microsoft, c’est-à-dire C/C++. En plus de la coloration syntaxique, il propose aussi:

l’Intellisense (code completion, information sur les paramètres des fonctions, …),
le debugging (que je n’utilise pas encore)
et la navigation dans le code (pratique pour trouver la définition d’une fonction par exemple)

Pour l’installer, cmd+shift+x, recherche de C/C++ et bouton vert ‘install’. Trop facile.

Pour la facilité, j’ai ajouté le « format on save » à configurer dans les settings via le menu Text Editor/Formatting.

4. L’indentation automatique

Là non plus, nous n’allons pas nous compliquer la vie. Uncrustify a fait ses preuves et il existe un module pour VS Code.

J’utilise celui de Laurent Tréguier que je configure avec mon fichier uncrustify.cfg kivabien.

A suivre pour un prochain épisode

Télécharger

Arduboy

Une console de jeu d’une taille de 85.60 x 53.98 x 5mm (soit une carte de crédit un peu épaisse), ça vous tente ?

J’ai craqué pour cette console en avril 2017 après avoir raté la campagne Kickstarter en 2015.

Les specifications sont largement suffisantes pour faire de petits jeux sympas:

  • écran : OLED monochrome de 1.3 pouce et de résolution 128 x 64
  • processeur : ATmega32u4 de 8MHz
  • mémoire : 32KB Flash, 2.5KB RAM, 1KB EEPROM
  • connectivité : USB 2.0
  • 6 boutons
  • sorties : 128×64 1Bit OLED, 2 Ch. Piezo Speaker et une LED Blinky8
  • batterie : 180 mAh

Lors de sa réception, j’ai vite ressenti les plaisirs de développement que j’avais eu sur l’Amstrad CPC ou encore plus, sur la HP48 ! Celle-ci (la calculatrice de mes années Polytech) avait presque la même résolution (131×64) en monochrome aussi. Sur celle-ci, je jouais principalement à Diamonds de Doug Cannon. Ayant déjà fait une version de Diamonds sur Pocket PC (jamais sortie), le porter sur l’Arduboy était une évidence…

La facilité de programmation sur cette console était tel qu’il ne me fallut pas plus de 2-3 jours pour avoir une version jouable. Cette version est disponible sur GitHub pour ceux que ça intéresse.

J’ai fait un deuxième jeu plus tard: un video poker aussi disponible sur GitHub