Programmes en code machine
Il a été mentionné précédemment que les micro-ordinateurs ne comprennent pas encore les commandes anglaises normales, car elles sont ambiguës et idiosyncratiques. Le mieux qu'ils puissent faire est d'interpréter une langue comme Basic se rapprochant, dans une certaine mesure, d'un sous-ensemble limité de l'anglais.
Les langages informatiques peuvent être vus comme une hiérarchie, avec ceux étant proches du langage naturel en haut - les langages de haut niveau - et le code binaire du langage machine - de bas niveau - en bas.
Le langage de haut niveau fourni avec ORIC est Basic. La puce traduisant Basic en code machine s'appelle la ROM de base. La ROM signifie Read Only memory, et le programme d'interprétation qu'il contient est fixé lors de la fabrication et ne peut pas être modifié. Si vous avez un modèle 48 Ko, il contient en fait 64 Ko de RAM (mémoire à accès aléatoire pouvant être modifiée et contenant généralement vos programmes).
Si vous achetez des unités de disque pour un entreposage de mémoire important et rapide, la ROM interne est masquée, laissant près de 64 Ko de mémoire interne. De cette manière, d'autres langages de haut niveau, tels que Forth, Pascal, Logo, Prolog et Lisp pourraient être utilisés avec ORIC.
Avec tout ce potentiel pour les langages de haut niveau, étant beaucoup plus clairs à comprendre, vous vous demandez peut-être pourquoi quelqu'un devrait s'embarrasser de code machine. Après tout, on estime qu'il faut au moins dix fois plus de temps pour écrire que le programme équivalent dans un langage de haut niveau. Vous ne recevez pas de messages d'erreur utiles, les défauts sont beaucoup plus difficiles à retracer et le code machine est difficile à documenter et difficile à comprendre - alors pourquoi essayer de l'apprendre ?
Une compréhension du code machine vous aidera à comprendre le fonctionnement des ordinateurs, et les programmes de code machine efficaces sont exécutés à un rythme beaucoup plus rapide que n'importe quel langage de haut niveau. Si vous imaginez parler à un Allemand, qui à son tour traduit vos instructions à un Italien avant qu'un travail ne soit effectué, et vous verrez l'avantage de pouvoir parler à l'Italien dans sa propre langue !
Il existe plusieurs façons de rendre les langages machine plus compréhensibles. Premièrement, il est généralement écrit en hexadécimal, une page de binaire se transforme rapidement en une masse de zéros et de uns, et les nombres décimaux ne vous montrent pas facilement ce qui se passe au niveau des octets.
C'est pourquoi l'installation est fournie sur ORIC pour entrer des nombres sous forme décimale ou hexadécimale, plutôt que de perdre du temps à faire des conversions de base. Il fournit également un code plus facile à lire. Au coeur d'ORIC se trouve la puce la plus importante, l'unité centrale de traitement.
Tous les ordinateurs ont besoin d'un microprocesseur (C.P.U.) mais ils n'utilisent pas tous le même modèle. Tout autre ordinateur utilisant le même microprocesseur peut, dans les limites de l'ordinateur, utiliser le même programme de code machine. ORIC utilise un microprocesseur 6502 de Rockwell International Corporation. Les autres microprocesseurs que vous pouvez rencontreriez à cette époque étaient les 6800, 6809, Z80 et 8080. Ils fonctionnent tous de manière légèrement différente, alors comprenez des instructions différentes.
En interne, le processeur manipule les nombres, stockés sous forme de chiffres binaires 8 bits. Les nombres sont chargés dans différents emplacements de mémoire et traités soit comme des instructions, soit comme des données.
Par exemple, si le 6502 reçoit le numéro 10101001, il comprend qu'il s'agit d'une instruction : charger un registre ou une mémoire spéciale appelée accumulateur avec le prochain numéro reçu. Le 6502 ne comprend que les nombres 8 bits. ORIC vous permet de saisir des nombres décimaux ou hexadécimaux et de les convertir en leur équivalent binaire avant de les envoyer au 6502.
Pour faciliter la mémorisation, un nom court est donné à chaque instruction 6502, donc dans l'exemple précédent, 10101001, ou 169 (décimal) ou # A9 (hexadécimal) est appelé LDA (LoaD Accumulator). Ces rappels de mémoire sont appelés mnémoniques.
Bien que l'entrée de A9 dans l'ORIC soit comprise, le mnémonique ne serait pas reconnu. Pour le rendre plus clair, il pourrait être ajouté en tant qu'instruction REM, par exemple :
- 100 DATA # A9, # 20 'LDA# 20
Pour vous aider dans la saisie des programmes en code machine, il est possible d'avoir un programme court vous permettant de saisir directement des mnémoniques, ainsi que des variables, des données et des adresses,..., et il décodera cela en langage machine. C'est ce qu'on appelle un programme assembleur. L'utilisateur saisit les mnémoniques (le programme «source») et l'assembleur les traduit en code machine ou programme «objet». Un programme désassembleur fonctionne en sens inverse.
PEEK et POKE
Comment pouvons-nous savoir ce qui est entreposé dans n'importe quel emplacement de mémoire ? Vous vous souvenez peut-être d'avoir rencontré PEEK et POKE dans les autres pages. Taper :
Ceci examine la partie de la mémoire utilisée pour entreposer l'écran TEXT. Le nombre renvoyé est l'équivalent décimal du nombre binaire entreposé à cet emplacement. Comme cet emplacement est cartographié sur la zone d'écran, le nombre est le code ASCII du caractère à cette position. Pour modifier cette valeur, tapez :
- POKE 48225,128
Vous devriez pouvoir voir quelle position sur votre écran 48225 contrôle, car elle sera remplie avec le caractère représenté par ASCII 128, c'est-à-dire un bloc solide.
Si vous regardez la carte mémoire, vous verrez ce qui est entreposé à différents endroits. Vous pouvez essayer d'utiliser POKE pour mettre des caractères sur l'écran TEXT et HIRES.
Ce n'est pas une bonne idée d'essayer de POKE dans les pages 0 à 3 (0 à 1024 en décimal). Vous pouvez bien sûr expérimenter, car vous n'endommagerez pas ORIC, quoi que vous entriez.
Adresses
Peut-être vous êtes-vous demandé comment ORIC peut entreposer des nombres supérieurs à 255, d'autant plus qu'il existe 65536 emplacements de mémoire différents. Les adresses sont entreposées sous forme de nombres à deux octets. par exemple :
1er octet | 2ième octet | |
---|---|---|
128 est entreposé comme | 10000000 | 00000000 |
Si le nombre est supérieur à 255, le deuxième octet contient le nombre de 256 dans le nombre.
1er octet | 2ième octet | |
---|---|---|
258 est entreposé comme | 00000010 | 00000001 |
2 + | (1 x 256) |
Il peut sembler étrange que l'octet de poids faible vienne en premier, mais c'est l'ordre dans lequel le microprocesseur le décode. Donc, si vous savez qu'un nombre est entreposé aux emplacements 20345 et 20346, pour calculer le nombre entreposé, vous devrez taper :
ORIC vous évite d'avoir à le faire. L'instruction :
fera le même travail que la ligne ci-dessus. DEEK signifie Double PEEK. Si vous souhaitez modifier le nombre détenu à ces deux endroits, vous taperez :
- DOKE 20345, N
et N serait converti en un nombre à deux octets.
Parfois, il est utile de pouvoir utiliser de courtes routines de code machine, bien que le reste de votre programme puisse être écrit en Basic. Celles-ci peuvent être totalement originales ou vous pouvez emprunter des routines déjà écrites dans la ROM par PEEK.
Il existe plusieurs commandes dans ORIC BASIC vous permettant de le faire. CALL X, où X est une adresse en mémoire, transfère le contrôle à l'adresse spécifiée et commence la routine de code machine qui s'y trouve. Le retour à la base est accompli lorsque la routine atteint un RTS (Retour du sous-programme).
Une autre façon d'accéder aux informations d'une routine de code machine consiste à utiliser DEF USR et PRINT USR(0). La routine est écrite en code machine et l'adresse de départ est saisie par DEF USR = adresse de départ.
Si PRINT USR(0) est maintenant entré, le résultat de la routine est extrait de l'accumulateur à virgule flottante et affiché. Voici un exemple de la façon dont il peut être utilisé :
RUN le programme, puis tapez DEF USR = # 400 A tout moment, PRINT USR(0) affichera la constante de conversion des radians en degrés.
Voici une explication plus détaillée de son fonctionnement. La valeur entre parenthèses après que la fonction USR est effectivement transmise à l'accumulateur à virgule flottante et qu'une JSR à l'emplacement # 21 est exécutée. Les emplacements # 21 à # 23 doivent contenir un JMP à l'emplacement de début du sous-programme de langage machine. La valeur de retour de la fonction est placée dans l'accumulateur à virgule flottante.
Pour obtenir un entier de 2 octets à partir de la valeur dans l'accumulateur à virgule flottante, le sous-programme doit faire un JSR à # D867. Au retour, la valeur entière sera aux emplacements # 34 (octet de poids fort) et # 33 (octet de poids faible).
Si vous souhaitez convertir un résultat entier en son équivalent en virgule flottante, afin que la fonction puisse renvoyer cette valeur, l'entier à deux octets doit être placé dans les registres A (octet de poids fort) et Y (octet de poids faible). Si un JSR est fait à # D8D5 alors au retour, la valeur à virgule flottante aura été chargée dans l'accumulateur à virgule flottante.
Il y a deux autres opérations utiles qu'ORIC peut effectuer. «!» peut être défini comme une commande n'existant pas déjà dans ORIC Basic.
& (X) (où X = 0 à # FFFF) |
peut être défini comme une fonction n'existant pas déjà dans ORIC Basic.
Les routines doivent être écrites en code machine et chargées dans un emplacement particulier de la mémoire. L'adresse de début est chargée comme suit :
Définir «!» pour signifier PRINT AT, tapez :
- 5 REM ****** PROGRAMME D'EXTENSION CMD POUR 'PRINT @ X,Y ;JJJJ'.
- 10 REPEAT
- 20 READ DTA
- 30 POKE # 400+CL,DTA
- 40 CL=CL+1
- 50 UNTIL DTA = # FF :REM FIN DU PROGRAMME
- 100 DATA # 20, # 96, # D9 :REM JSR GTVALS
- 110 DATA # AC, # F8, # 0/2 :REM LDY GCOL
- 120 DATA # C8 :REM INY
- 130 DATA # 8C, # 69, # 02 :REM STY CURCOL
- 140 DATA # A5, # 1F :REM LDA GCL
- 150 DATA # A4, # 20 :REM LDY GHC
- 160 DATA # 85, # 12 :REM STA CURBAS
- 170 DATA # 84, # 13 :REM STY CURBAS + 1
- 180 DATA # A9, # 3B :REM LDA # ';'
- 190 DATA # 20, # DB, # CF :REM JSR SYNCHR
- 200 DATA # 4C, # 61, # CB :REM JMP PRINT
- 210 DATA # FF
- 220 DOKE # 2F5, # 400
Si vous tapez :
!X,Y:"ORIC" |
alors ORIC sera affiché aux coordonnées X et Y sur l'écran. Pour définir & pour signifier retour vertical, position du curseur :
Il est utile de savoir sur quelle ligne se trouve le curseur si vous devez utiliser la fonction de double hauteur, afin de ne pas vous retrouver avec le haut des lettres sous leur moitié inférieure.
Une ligne appropriée dans un programme pour se protéger contre cela serait :
Cela déplacera le curseur vers une ligne paire.
Une partie de la page 4 (emplacements # 0400 à # 0420) a été réservée pour vos propres routines de code machine. N'importe où dans la mémoire peut être utilisé pour des programmes plus longs, mais un programme de base peut l'écraser s'il occupe l'espace programme utilisateur dans la mémoire vive (RAM).
Pour réserver de la mémoire pour les programmes de code machine, le haut de la zone utilisateur peut être abaissé. Pour trouver sa position actuelle, entrez :
Déterminez le nombre d'octets dont vous avez besoin pour votre programme, ajoutez un petit nombre par sécurité (à moins que vous ne manquiez vraiment de mémoire) et soustrayez le total du nombre que vous avez trouvé précédemment. Saisissez ensuite :
- HIMEM X
où X est le nouveau sommet de mémoire utilisateur que vous venez de calculer.