******************************* * LE HARDWARE * * par COCOHP le HARDOS * ******************************* INTRODUCTION Ce cours paraissant pourtant secondaire est pourtant le plus important. On ne peut pas commencer a programmer directement ou alors vous allez partir de travers et c'est dur a ratraper. Si on programmais maintenant vous deviendriez des pecnos qui font des scrolling a deux sous. Mon but est que vous me depassiez, il faut donc une formation en BETON et surtout une comprehension TOTALE de ce qui se passe dans la machine.Bonne chance. Le hard c'est la configuration technique Dans la HP il y a en gros -le saturn qui est le microprocesseur qui s'occupe de tout -les periferiques: la memoire, l'‚cran, le clavier, le buzer, l'IR et le cable. LA NOTATION HEXADECIMALE Les machines ne comprennent que les 0 ou les 1. Il faudrait donc utiliser la base binaire(que des 0 ou des 1) et traduire tout nos chiffres decimals en chiffres binaires pour comprendre comment marche le processeur. Cependant cela serait tres tres lourd (8 se note deja 1000 en binaire). On utilise donc la base 16 ou hexadecimale plus pratique: en effet un chiffre hexa code EXACTEMENT pour 4 chiffres binaires. Je mettrais quand c'est ambigu un h apres les nombres hexa pour les differencier avec les nombres decimals. ex: 01001001 binaire s'ecrit 49h en hexa(soit 73 en decimal) pour traduire on fait des paquet de 4: 0100 1001 et on prend le chiffre hexa correspondant: 4 9 (voir la table apres) LES BUS: Le microprocesseur est relie a la memoire par des "fils" mais ces "fils" ne peuvent pas rester comme cela: il faut savoir ou on ecris dans la memoire, Tout verifier l'integrite des donnes...Ca c'est le role des BUS. On lui envoit du courant sur ces lignes(fils). Il existe deux BUS principaux(parfois il y en a un troisieme qui sert a tout verifier (BUS de controle) mais sur HP je sais pas). Il y a le bus d'adresse et le bus de donnee. Le bus d'adresse fait 20 bits et celui de donn‚e 4 bit(he oui c'est pas terrible). Cela signifie que sur le BUS d'addresse on peut obtenir des chiffres de 0h a FFFFFh(5 chiffres hexa=20 chiffres binaires) et que sur celui de donn‚e cela se limite a 0h a Fh. Quand on envoit nos 5 chiffres hexa sur le bus d'addresse en fait ces chiffres agissent comme des selecteurs. Je dis ca au pif mais si par exemple il y a 16 rams dans la HP(16 puces avec de la RAM) le premier des cinqs chiffre par un systeme de porte va selectionner la bonne RAM. Si c'est 0 ca sera la RAM numero 1, si c'est F ca sera la 16eme. Ensuite les 4 dernier chiffres vont selectionner une position dans cette RAM. Il faut savoir que les RAM sont structures sous forme de grille avec ligne et colonnes. Par exemple les 4eme et 3eme chiffres vont selectionner la ligne et le 5 et 6eme la colonne. A l'intersection des deux se trouve un chiffre hexa. Ce chiffre peut etre lu ou ecris. Si on le lit on envoit la position dans les RAM (dans 5 chiffres hexa sur le bus d'addresse) et on recoit par miracle du courant sur le BUS de donn‚e(on recoit 4 bits, un chiffre entre 0 et F). En fait on recoit le contenue de la case(dans les grilles de la RAM) dont on a donn‚ la position. De meme pour ecrire un chiffre hexa dans une case memoire il suffi d'envoyer du courant sur le bus d'adresse et sur le bus de donn‚e: le chiffre envoy‚ sur le BUS de donn‚es est alors ecris dans la RAM a la position donn‚e par le BUS d'addresse. vous connaissez tous le diagramme: _ _ / ou \:une patte de la puce du microproc _ --- _ /_| C |_\ BUS /_| |_\ BUS de donne‚s(4 ligne, chiffre de 0 a F) d'addresage/_| P |_\ 20 ligne /_| | \ (0 a FFFFF)/_| U | /_| | /.. .. --- CPU veut dire microprocesseur(Central Processing Unit)(ca fait plus fun) Il y a bien sur aussi des pates pour l'allimentations, l'horloge, le RESET, le control des BUS etc... LES ADDRESSES MEMOIRE Voila le cauchemard de tout d‚butant. Si vous avez compris ca alors vous savez programmer. Imaginer une immense rue avec des adresses not‚s en hexadecimales. Cette rue aurait FFFFFh numeros (en decimal 1048575) et il y aurait 16 types de maisons differentes. A chaque adresse on aurait une maison qui serait d'un des 16 types(que l'on notera type 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F tous les chiffres hexa quoi). on peut donc avoir par exemple au milieu de la rue ceci: adresse dans la rue type de maison(en hexa aussi) 70000h Ah 70001h 0h 70002h 9h 70003h 5h 70004h 6h 70005h 8h a l'adresse 70000h une maison de type Ah... bon jusqu'ici vous suivez. Et bien la memoire se structure exactement ainsi il y a FFFFFh cases avec 16 contenus possible: les chiffres 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F(hexa) On appelle une de ces cases un quartet(de ces maisons) pour une raison simple cette case contient 4 bits il y a donc 16 possibilites: binaire hexa(le h veut juste dire hexa) 0000 0h 0001 1h 0010 2h 0011 3h 0100 4h 0101 5h 0110 6h 0111 7h 1000 8h 1001 9h 1010 Ah 1011 Bh 1100 Ch 1101 Dh 1110 Eh 1111 Fh On peut ecrire ou lire a une adresse precise(regarder le type des maisons ou changer le type des maison a l'adresse indiquee dans la rue). Cependant il existe 3 types de memoires: -la RAM(random acess memory) c'est a dire que l'on peut acceder comme l'on veut a cette memoire(lecture ou ecriture)qui va de l'adresse 70000h a 80000h et meme plus avec les cartes. -la ROM(read only memory) est une memoire que l'on peut uniquement lire(read only). Le systeme(le fonctionnement de la calculatrice...) est ecris dans cette zone qui va de a peu pres 150h a 6FFFFh. -La RAM des entres-sorties(de 100h a 13Fh voyage page 163) quand on ecris,ou lit, dans cette partie de la memoire on a en fait acces aux periferiques: -en 114h si on ecris cela envoit un caractere sur le port serie. -en 11Ch c'est sur le port Infra rouge -en 138h on a acces a l'horloge interne(qui bouge tout le temps) -en 128h c'est la hbl(horizontal blank line) qui indique si l'ecran a ete balaye ou pas. enfin il y toutes les indication pour les periferiques(adresse de l'ecran ,taille...) Vous croyer avoir compris, c'est hyper simple. Il vous faudra lire et relire cela car c'est la base et c'est ce qu'il est le plus dur a comprendre. Resumons on a donc une longue rue avec FFFFFh adresses et a chaque adresse une maison de type 0h a Fh. L'ECRAN Comment ecrire dans l'ecran? en fait l'ecran est une partie de la memoire. Imagine que une partie des maisons de la rue aient un toit fluorescent alors on ne voit qu'elles dans la nuit. Si on ecris dans une partie de la memoire alors on vera s'afficher quelque chose a l'ecran. Maintenant l'adresse (sa position dans la rue) de l'ecran se trouve a l'adresse #7050E code sur 5 quartets(sur 5 cases ou sur 5 maisons): adresse contenu(maison) 7050Eh 7h 7050Fh 3h 70510h 0h 70511h 0h 70512h 0h comme vous pouvez le lire l'ecran a l'adresse 70300h c'est a dire: 70300h 0h 70301h 0h ... l'adresse 70300h corespond au coin superieur gauche.Le chiffre qu'il y a a L'adresse 70300h code pour 4 pixels(points sur l'ecran voir la notation binaire). Par exemple si on a Fh en 70300h alors il y a forcement 4 points noirs dans le coin en haut a gauche(vous avez le chiffre traduisez dans la table binaire-hexa et deduisez en les pixel allumes). L'adresse #70301 corespond au 4 pixels suivant etc... Ce qui se passe c'est que l'ecran faisant 132 de large au bout de (132/4=33) on arrive au bout de l'ecran (adresse 70321h en hexa (33 donne 21h en hexa)) que se passe t'il alors. Et ben il y a une case inutilise(adresse 70322h) et puis on passe a la deuxieme ligne. Si on ecris en 70322h un Fh alors on aura 4 pixel alumes sur la deuxieme ligne de l'ecran.Quand on arrive en bas de l'ecran et ben il faut arreter d'ecrire car la la memoire recommence et ca devient dangereux. Donc resumons: si on lit en 7050Eh l'adresse de l'ecran et que l'on ecris ensuite a cette adresse (70300h) 34 fois Fh on obtient une ligne noire en haut. Si on continu tout l'ecran devient noir car au bout de 34 quartet c'est la ligne suivante 70322h adresse debut de la deuxieme ligne 70344h adresse debut de la troisieme ligne(64 lignes en tout) LE CLAVIER Beaucoups de programmeur se demandent comment tester une touche en assembleur. Tout le monde a vu que l'exemple de voyage ne marche qu'a 50 pur cent. En fait il est rigoureusement bon a un detail pres que nous verons plus tard. Sur la table propose par voyage page 73 a chaque lettre correspond 2 chiffres, le premier est le code de sorie le second le code d'entre. En fait il aurait ete preferables que ces chiffres soit mis en binaire, on comprend mieux: ex pour la lettre A masque de sortie 002 soit 0000 0000 0010 en binaire masque d'entree 0010 soit 0000 0000 0001 0000 en binaire (les espaces dans le nombre binaire sont pour une meilleure lecture) La on comprend mieux si on envoit du courant sur la ligne electrique numero 2(le 1 est en deuxieme position pour la sortie) et qu'il en reviens par la ligne electrique numero 5(le 1 est en 5 eme position pour l'entree) alors la touche A a ete tester. Concretement on fait un out=c(avec c=002) un c=in et on teste si le bit numero 5 de c est a 1 ou pas (avec ?cbit=1 5,5 etant le numero du bit a tester). Ultra simple non. En pratique ca ne marche pas pour une raison debile que j'espliquerais plus tard quand on aura fait la structure d'un programme en langage machine. LES PORT Programmer le port serie ou IR en assembleur est ultra simple mais cela ne vous servirais a rien en ce moment. Je ferais peut etre un cours complet la dessus. Juste quelques d‚tails: -le port RS232C(le cable) est hyper simple a utiliser. Pour envoyer un carac- tere sur ce port il suffit de l'ecrire en 00116h(lire voyage page 168). -le port IR est beaucoups plus chiant. Il ne connait que deux ‚tats, soit il recoit, soit il ne recoit pas. Ou encore soit il envoit, soit il envoit pas. Il n'a que deux ‚tats. LE PROCESSEUR A on arrive aux choses serieuse. Le processeur de la HP48 est le saturn. C'est un 4 bit cadense a une vitesse hallucinante de 2 megahertz(en gros une vrai daube, mais ca monte jusqu'a 4 pour la GX). Surtout n'essayez pas de comprendre la signification des instructions qui sont donn‚es juste pour exemple. Ici on va juste voir comment ca fonctionne: ce processeur est non seulement une vrai daube mais c'est aussi un abruti profond: il ne fait que ce qu'on lui dit de faire. Il ne comprend de plus que les chiffres, par exemple si vous lui envoyer 801 pour lui ca voudra dire out=c(la table de traduction est a la fin de voyage page 366 et 367), en faisant 802 on fait a=in. Si on met les deux a la suite 801802 il reconnais automatiquement la taille et fait out=c puis a=in. Ainsi si on veut programmer il suffit d'ecrire sont prog(a=0..a=in..) puis de traduire chaque instruction en son nombre hexadecimal correspondant et de les mettres a la suite: ex: A=DAT0 A cod‚ 142 A=A+1 A cod‚ E4 DAT0=A A cod‚ 140 on lui envoit 142E4140 et il nous fait tout cela(on vera ce que ca veut dire) Voici comment cela fonctionne: le microprocesseur possede une variable speciale que l'on appelle PC(pour program counter). Cette variable indique l'adresse de la prochaine instruction. Par exemple si mon programme se situe a l'adresse 70400h on a: adresse contenu 70400h 1h \ 70401h 4h |A=DAT0 A 70402h 2h / 70403h Eh \ 70404h 4h /A=A+1 A 70405h 1h \ 70406h 4h |DAT0=A A 70407h 0h / ... au debut PC=70400h le processeur lit une instruction il trouve la taille automatiquement il lit donc 142h(le contenu ou le type de 3 maisons(=3 addresses) Il execute ensuite cette instruction(il fait l'operation qu'on lui demande ici A=DAT0 A) et incremente automatiquement le PC de la taille de l'instruction(ici 3 cases(=3 quartets)) on a donc apres cette instruction PC=70403h et le processeur lit la nouvelle instruction qui est E4h,incremente le PC de 2(car l'instruction fait 2 quatets (ou deux cases)). Voila comment ca marche, pour resumer le PC pointe sur l'instruction a executer, le processeur l'execute et incremente le PC qui pointe alors sur l'instruction suivante. CONCLUSION SUR LE HARD On ne peut pas programmer en assembleur si on ne maitrise pas parfaitement le hard. Si vous avez hate de programme passez au cours suivant qui traite de l'assembleur directement mais de toute facon vous serez oblige de revenir. Au fait je peu maintenant vous expliquer pourquoi le A=IN ne marche qu'une fois sur deux: Il faut que l'instruction codant pour A=IN (c'est 802h) se situe a une addresse paire(il faut que le PC soit pair) sinon ca bug mais on reviendra la dessu. Le hard est la raison pour laquelle on ne peut pas passer d'un ordinateur a l'autre facilement. Je suis personnellement assez faible en assembleur 68000 et 80x86 tout simplement parce que je ne maitrise pas le hard, la programation etant pourtant la meme sur a peu pres tous les types de machines.