Programmation sous BC 0010 en 2019

Pourquoi?


Si vous êtes un passionné d'ordinateurs rétro, vous pouvez sauter en toute sécurité le discours de motivation et passer à la section suivante.

Tout août 2018, moi et mon fils de 13 ans, Ivanq, avons passé à écrire une démo de Good Apple . Au festival Chaos Constructions , notre travail a pris la deuxième place, pour laquelle nous avons reçu un prix en espèces de 35 mille roubles, que nous avons honnêtement répartis également. Pour un enfant, c'est un bon revenu, bien qu'en créant des sites il ait gagné le même montant en moins de temps. Évidemment, je pourrais passer mon temps avec un plus grand avantage économique ... Mais pas en août! Nous devons une fois nous reposer du travail. La programmation pour votre propre plaisir est un luxe que vous ne pouvez vous permettre qu'en vacances.

Bonne démo Apple par SandS

La récompense matérielle, bien sûr, ne sert pas de motivation, mais renforce les émotions positives. Étonnamment, la démo d'un ordinateur soviétique oublié a collecté des milliers de vues sur YouTube et s'est retrouvée dans une liste de lecture avec près de cent mille vues. Mais encore plus surprenant, en 2018, un prix en espèces lui est décerné! Peut-être que l'improbabilité même de ce qui se passe donne lieu à une telle recrudescence émotionnelle.

Cependant, il y a quelque chose de plus important.

Lors de la création de «Good Apple», nous avons dû travailler avec du vrai matériel, car nous avons utilisé les capacités de l'ordinateur, que les émulateurs ne reproduisent pas correctement. Tout d'abord, je voulais réaliser un travail tout aussi stable avec les disques durs IDE et avec leurs substituts modernes sous la forme de Compact Flash.

C'est sur ce projet que mon fils de 13 ans a acquis une expérience inestimable en développement industriel. Fer défectueux. Bon matériel qui ne se comporte pas comme décrit dans la documentation. Documentation rédigée avec des erreurs. Manque de documentation sur un certain nombre de questions. Rédiger vos propres tests pour identifier les problèmes de fer. Délais de sortie. Test sur différentes machines et configurations. Rédaction de votre propre assembleur croisé (quand il est devenu clair que les solutions existantes entravent le processus de développement). Et enfin, après une courte célébration du succès - la sortie obligatoire de la version finale, corrigeant un certain nombre de bugs.

À première vue, il semble qu'une expérience similaire pourrait être obtenue avec certains Arduino modernes. En fait, nous avons dû plonger dans la jungle même des circuits. Nous avons calculé le nombre de mesures pour lesquelles les instructions sont exécutées. Dans différents types de mémoire, cette fois est différente. Le contrôleur de mémoire et le processeur fonctionnent à des fréquences différentes, de sorte que les mêmes commandes peuvent être exécutées à des moments différents, même dans le même type de mémoire. La durée d'exécution du sous-programme n'est pas égale à la somme des durées des instructions de ce sous-programme. Nous avons dû écrire nos propres outils pour tester et optimiser le code sur du matériel réel.

Utilitaire pour mesurer la vitesse d'exécution d'un fragment de code

Il s'est avéré que mon fils étudiait les circuits du BK 0011 (vers quels fronts de signal arrivent lorsque RPLY est déclenché, etc. - je ne comprends plus rien à ce sujet). Il a donc eu l'idée de créer son propre émulateur BK, compatible avec du vrai matériel précis au rythme, et a même écrit le noyau ... Cependant, c'est une autre histoire.

Au total, en un mois - de l'étude de l'assembleur à la création de vos propres outils de développement, des tests rigoureux au travail multimédia terminé. Tout cela serait impossible sans l'essentiel: la planification. Peut-être la leçon la plus précieuse apprise. Vous prenez une tâche impossible. Vous comprenez que vous rencontrerez des difficultés insurmontables. Planifient Oui. Le résultat étonne tellement tout le monde que même les connaisseurs blâment la triche ("vous avez overclocké le processeur!").

Pourquoi pas le ZX Spectrum?


Démonstration d'Odnazhdy par l'équipe excédentaire

Encore une fois, je vais commencer par une étrange: la finance. À en juger par les annonces sur Avito, le BC 0010 coûte en moyenne plusieurs fois plus cher que le ZX Spectrum. Il est clair que pour une rare occurrence du Spectre natif en parfait état, ils demanderont une somme ronde. Mais le BC 0011m à pleine charge sortira toujours plus cher. Si jamais en mesure de trouver. Les prix parlent d'eux-mêmes: la valeur de collecte du BC 0010 est plus élevée. Et BK 0011m - et plus encore. Avoir un tel ordinateur à la maison est très agréable.

Le deuxième argument est 16 bits. Il n'y a rien de 8 bits dans BC 0010. Le processeur ne sait même pas comment ajouter des nombres 8 bits, il n'a pas de commande ADDB. 16 bits en tout. La raison en est l'architecture DEC PDP-11. Beaucoup appellent le système de commande du processeur PDP-11 le plus réussi et le plus pratique jamais créé. Bien sûr, il y a ceux qui veulent contester cette affirmation. Mais voici un fait: au Yandex Demodulation Festival, trois séminaires ont été consacrés aux architectures de processeurs, dont deux sur PDP-11. Il s'agit, en effet, d'une légende, d'un jalon dans l'histoire de la technologie informatique, qui continue encore d'exciter l'esprit des passionnés. BK 0010 permet de toucher cette légende. Et pas seulement le toucher, mais le comprendre dans les moindres détails, ressentez la beauté et la grâce de l'assembleur DEC: registres absolument égaux, huit méthodes d'adressage, mémoire linéaire - beauté!

Troisième argument: de nombreuses démos ont été écrites pour le ZX Spectrum. Pour BC 0010 - moins de cinquante , en comptant les petits de 256 octets et 4 kilo-octets. La place sur la demi-scène est presque gratuite, c'est là que même un débutant peut se montrer!

Et la dernière considération, purement subjective. Je regarde la demoscene russe depuis 1994. Le parti spektrumistov me semble, malheureusement, plus toxique et hostile. Bien sûr, il y a des gens formidables et sympathiques! J'ai un grand respect pour eux et leur travail. Mais en général - probablement en raison de son caractère de masse - la scène Spectrum était remplie de conflits, de clarifications des relations et même d'intrigues telles que le vote par nom (quand ils ne votent que pour «leur propre» lors des concours). Sur la petite scène BC-shnoy, ils ne posent pas de questions comme «qui est plus cool» et sont heureux de chaque nouveau participant. Je le répète: c'est mon impression purement personnelle, que vous pouvez ignorer.

Du vrai fer


20 ans se sont écoulés avant de retourner à des programmes d'écriture pour la Colombie-Britannique. Au cours des 20 dernières années, beaucoup de choses ont changé. Pour moi personnellement, un changement majeur s'est produit dans l'esprit: «Think Different». Ce slogan est placé au générique final de notre démo «Good Apple».

Nous avions l'habitude de charger des jeux à partir d'un magnétophone pendant 5 minutes. Puis sont venus les contrôleurs de lecteur. Derrière eux se trouvent les disques durs. Puis de nouvelles répliques de contrôleurs avec Compact Flash à bord. Maintenant, il est de coutume d'émuler des lecteurs flash sur la scène rétro ... Mais attendez, en 2019, nous avons une source sonore portable de haute qualité - iPhone. Prenons donc le cordon audio standard DIN-5 - mini-jack (vous n'aurez même pas à ressouder) et chargez le BK depuis l'iPhone à grande vitesse.

J'ai parcouru la trace de la ROM, révélé comment je pouvais légèrement déjouer l'algorithme de démarrage du magnétophone et rendre les données de lecture BC 4 fois plus rapides.

L'étape suivante consistait à écrire un micro-bootloader qui lit les données dans un format turbo spécialement conçu. Le chargeur et les données ont été placés l'un après l'autre dans un seul fichier WAV (le convertisseur a été écrit par Lenar Zakirov ). Le BK 0010 lit et démarre automatiquement le microchargeur, qui, à son tour, lit le reste des données du fichier. Les fréquences au format turbo atteignent 22 KHz, donc les exigences de qualité de la source sonore sont élevées. iPhone fait face. Un bon lecteur de musique d'autant plus. Carte son d'ordinateur aussi.

Puis ce fut au tour de l' assembleur en croix . Il a ajouté des options pour enregistrer le programme en WAV (à la fois au format standard et au format turbo). De plus, le cross-assembleur peut jouer immédiatement WAV via une carte son. Imaginez à quel point le développement a été accéléré! Pas besoin de s'embêter à écrire une image disque sur une carte CF après chaque compilation. Apportez simplement des modifications au code, cliquez sur «Build», le son circule dans le CD et après quelques secondes, le programme fonctionne déjà sur du vrai matériel. Pour recevoir le son dans un format standard, il suffit d'appuyer sur les touches L (Charger) et Entrée du BC 0011 (charger le premier programme rencontré). Pour transmettre le son au format turbo, vous devez d'abord exécuter le micro-bootloader (pour moi, il démarre automatiquement à partir du disque dur lorsque le BC est allumé; à tout moment, vous pouvez vous connecter au système en appuyant sur la touche STOP).

Téléchargement de programmes vers le BC 0011m depuis un ordinateur

Il est plus facile de connecter le BK au téléviseur en mode monochrome, dans l'entrée AV composite habituelle. Il est nécessaire de souder le câble avec une «tulipe» à une extrémité et DIN-5 à l'autre. Un signal monochrome provient de la 4ème broche DIN-5 du connecteur BK, désignée «TV». Le sol est traditionnellement associé à la 2ème broche de DIN-5.

Personnellement, je suis un fan des écrans CRT monochromes - ils offrent une clarté d'image inaccessible sur les moniteurs couleur avec leur grille d'ouverture. Mais la plupart des jeux et toutes les démos sont préférables à regarder en couleur. Pour ce faire, utilisez la sortie «TVC» BK et connectez-vous au téléviseur via RGB SCART. Contacts 3, 4, 5 sur DIN-5 - respectivement rouge, bleu, vert. Broche 1 - Sync. La broche 2 est mise à la terre. Lorsqu'il est connecté à un téléviseur LCD, il est utile d'appliquer +5 volts à la 16e broche de la péritel (via une résistance de 200 ohms environ). 5 volts sont généralement prélevés sur le connecteur «TV» adjacent (broche 1).

Vous pouvez utiliser un convertisseur péritel-HDMI. Je vous préviens immédiatement que BC affiche une image avec une fréquence non pas de 48 images par seconde, mais de 48,83, donc au lieu d'un défilement fluide sur les moniteurs LCD, un contraction périodique sera perceptible. J'ai résolu ce problème en remplaçant le résonateur à cristal de quartz de 12 mégahertz à 12,288 MHz. Cependant, les contractions n'étaient perceptibles que dans certaines démos. La plupart des programmes BC n'utilisent pas la synchronisation de la fréquence d'images.

Pourquoi ne pas se contenter de l'émulateur, pour lequel un véritable ordinateur peut être nécessaire? J'ai trouvé quatre choses mal émulées:

  1. Comportement de l'enceinte aux hautes fréquences.
  2. Synchronisation de l'image et des palettes avec le faisceau.
  3. Heure exacte d'exécution des commandes (important pour la musique via Covox).
  4. Travaillez avec des disques durs IDE à des vitesses élevées.

Si vous ne prévoyez pas d'effectuer l'une des opérations ci-dessus, l'émulateur vous suffit.

Émulation


Sur MacOS, j'utilise l'émulateur BK2010 . Il n'est pas très précis, mais convient à la plupart des tâches.

L'émulateur GID le plus avancé fonctionne actuellement sous Windows. Il fonctionne également sur CrossOver pour MacOS et Wine pour Linux. L'émulateur a un bon débogueur, une visionneuse de pages mémoire et autres.

Pour écrire des images de disque sur Compact Flash, j'utilise l'utilitaire multi-plateforme Etcher . Mais le plus souvent, je transmets des données via le canal audio.

Outils de développement


Compilation à partir de texte sublime avec PDPy11 Cross Assembler

Les gars du groupe de démonstration Excess Team ont incité le cross-assembleur Alexei Morozov. Au début, nous l'avons utilisé, mais bientôt Ivanq a écrit le sien - multi-plateforme, en Python. Cela fonctionne plus lentement, mais beaucoup plus riche en fonctionnalités. Cela inclut la prise en charge des projets multi-fichiers et des expressions arithmétiques complexes, des types de données à double mot, l'intégration avec Sublime Text et une prise en charge étendue des erreurs de compilation, l'enregistrement du résultat dans un format de fichier audio, la compilation non seulement pour BC, mais aussi pour UKSC, et bien plus encore. Vous pouvez lire tout cela dans la documentation officielle.

L'assembleur croisé est appelé PDPy11 .

Certains vétérans se plaignent que PDPy11 manque de macros de l'assembleur de macro DEC classique (Macro-11). L'assembleur de macros est, en un sens, un langage différent. C'est probablement bon pour écrire des programmes système, mais des jeux sérieux et des démos pour BC ont été écrits, pour autant que je sache, en assembleur classique ordinaire. Ironiquement: pour le code source des programmes BK, il est habituel d’utiliser l’extension de fichier .mac (de «macro») même dans les assembleurs qui ne prennent pas en charge les macros. Dans tous les cas, les capacités de PDPy11 sont suffisantes pour écrire des programmes de n'importe quel niveau de complexité.

Le débogueur est intégré à l'émulateur GID . Il vous permet de définir les adresses des points d'arrêt, d'interrompre ou de poursuivre l'exécution du programme à tout moment, de regarder le contenu des registres et de la mémoire, d'exécuter le programme étape par étape, de modifier le contenu de la mémoire, etc.

Pour convertir des graphiques au format BC, nous avons écrit un convertisseur en ligne . Résolution BK - 256x256 pixels en mode couleur ou 512x256 en monochrome. Il est préférable de ne pas saisir d'images plus grandes dans le convertisseur.

La documentation


Un excellent didacticiel sur la programmation en langage assembleur a été écrit par Yuri Zaltsman. Les différences entre BC 0011m et BC 0010 sont écrites ici . Il y avait aussi un modèle BK 0011 (sans «m»), mais il a été rapidement retiré de la production, reconnaissant son échec.

Malgré le fait que le BC 0011m possède de grandes capacités (palettes de couleurs, pages de mémoire supplémentaires), je vous conseille d'abord de programmer pour le BC 0010 - ce modèle est plus simple et plus compréhensible. Tout programme correctement écrit pour BC 0010 s'exécutera également sur BC 0011m.

Le processeur et le jeu d'instructions sont bien décrits sur Wikipedia .

Pour les plus courageux - programmation en codes .

Bonjour tout le monde!


La zone de mémoire d'écran dans BC 0010 commence par l'adresse 40000 (coin supérieur gauche) et se termine par l'adresse 77777 (coin inférieur droit de l'écran). Comme vous pouvez le deviner, l'architecture PDP-11 utilise un système de nombres à 8 décimales. Mais l'assembleur croisé PDPy11, bien sûr, vous permet d'écrire des nombres également dans des systèmes binaires, décimaux et hexadécimaux - faites comme vous le souhaitez.

Pour mettre un point sur l'écran , vous devez écrire un certain nombre dans la zone de mémoire d'écran. Les arguments dans l'assembleur DEC sont écrits de gauche à droite: source, puis récepteur. Par exemple:

MOV #100000,@#60040 ;      

Le signe # signifie que l'argument n'est qu'un nombre (pas une adresse). Le signe @ # signifie que l'argument est une adresse absolue (c'est-à-dire qu'il ne changera pas lorsque le programme est déplacé vers un autre emplacement mémoire).
Le nettoyage de l'écran ressemble à ceci:

    MOV #40000,R1 ;     MOV #20000,R0 ;   1: CLR (R1)+ ;    ,   R1   SOB R0,1 ;   

L'adressage indirect (R1) utilise le registre R1 comme pointeur d'adresse. La mémoire du BC est adressée octet par octet, mais l'instruction CLR efface immédiatement deux octets adjacents: d'abord 40000 et 40001, à l'étape suivante du cycle 40002 et 40003, et ainsi de suite. La notation (R1) + signifie qu'après avoir utilisé l'argument, vous devez l'augmenter. Dans ce cas, par 2, car la commande traite 2 octets. Le compteur de boucles peut être n'importe quel registre. SOB soustrait une unité du registre et passe à l'étiquette 1. Les étiquettes locales sont indiquées par des chiffres et deux points, leur portée entre deux étiquettes globales. Les étiquettes globales doivent commencer par une lettre et se terminer également par deux points.

Il est possible de faire fonctionner l'instruction CLR avec des octets en ajoutant la lettre «B». Alors CLRB (R1) + augmentera le registre R1 non pas de 2, mais de 1.

    MOV #40000,R1   MOV R1,R0 ;        1: CLRB (R1)+   SOB R0,1 

Vous pouvez faire la même chose plus court. Nous effaçons l'écran de bas en haut en utilisant la méthode d'indexation de l'adressage:

    MOV #40000,R0 1: CLRB 37777(R0) ;    (37777+R0)   SOB R0,1 

Si une vitesse élevée est nécessaire, il est préférable d'effacer la mémoire non pas par octets, mais immédiatement avec des mots. Ce sera deux fois plus rapide. Mais vous pouvez accélérer au-delà de cela: pour une raison quelconque, la commande CLR est plus lente que le MOV. Par conséquent:

    CLR R2 ;     R2   MOV #40000,R1 ;     MOV #20000,R0 ;   1: MOV R2,(R1)+ ;    ,   R1   SOB R0,1 ;   

Maintenant, en choisissant l'une des quatre façons d'effacer l'écran, vous pouvez déjà définir des points. En mode couleur, chaque point correspond à deux bits. En monochrome, un bit. BC n'a pas de changement de programme des modes d'écran. À quelle sortie j'ai connecté le moniteur, j'ai reçu une telle image.
Pour plus de clarté, nous écrivons les couleurs des points dans le système de nombres binaires:

    MOVB #0b00001100,@#50010   MOVB #0b00110000,@#50112   MOVB #0b11000000,@#50313 

Les couleurs de chaque paire de bits sont codées comme suit: si seul un bit pair est défini - un point vert, uniquement un bit impair - bleu, les deux bits sont définis - rouge, les deux bits sont réinitialisés - noir. Eh bien, un moniteur monochrome montre chaque bit comme un point distinct.
La commande MOVB écrit 4 points simultanément dans la mémoire à l'écran et la commande MOV écrit 8 points. Si vous ne souhaitez pas affecter les points voisins, utilisez les commandes BIC (Bit Clear) et BIS (Bit Set), par exemple:

    BICB #0b00001100,@#50112 ;     BISB #0b00000100,@#50112 ;    

Un point intéressant: dans le texte, nous écrivons les bits les moins significatifs à droite des plus significatifs. Et sur l'écran, au contraire: les points correspondant aux bits les moins significatifs apparaissent à gauche.
En fait, tout cela concerne le dispositif de mémoire à l'écran BK 0010.

Mais qu'en est-il de la sortie de texte ?

       MOV #Text,R1 ;         EMT 20 ;             HALT ;   Text: .ASCII “Hello, World!”      .BYTE 0 ;      

Montrez la source!


Introduction à Road2CAFe 256 octets par l'équipe Excess

Il sera plus facile de commencer par regarder le code source des démos terminées:

In Your Space - démo pour Covox, sources dans les archives.
Good Apple - sources sur GitLab (un projet multi-fichiers complexe).
EIS est un émulateur d'instructions arithmétiques étendues avec des codes source.
Sources de trois démos de 256 octets.
Dans le 28e numéro du magazine Downgrade, un grand article sur l'évolution des algorithmes de musique tracker sur BC 0010, avec des fragments de programme et des explications détaillées. Une histoire nostalgique d'une première demoscene pour démarrer.

Quand commencer?


Maintenant. Après 4 semaines à Kazan aura lieu Demopati CAFe 2019 . Le programme du festival a un concours BK 0010 - 512 octets . Cette taille convient à 85 à 256 instructions - idéal pour les débutants. Deux semaines vous suffisent pour gérer les outils et écrire la première démo simple. Après cela, il restera encore une semaine et demie pour écrire un second travail plus sérieux.

Allez-y, vous le pouvez! Telegram chat , forum zx-pk - ils vous aideront partout. envoyez du travail au concours, et mieux encore venez vous-même. La scène est vivante !

Source: https://habr.com/ru/post/fr469117/


All Articles