{"id":742,"date":"2019-03-23T21:07:00","date_gmt":"2019-03-23T20:07:00","guid":{"rendered":"https:\/\/ceobeta.oric.org\/?p=742"},"modified":"2019-03-23T21:07:00","modified_gmt":"2019-03-23T20:07:00","slug":"fonctionnement-de-la-pile-materielle-du-6502-1-8","status":"publish","type":"post","link":"https:\/\/oric.bqtt.net\/index.php\/2019\/03\/23\/fonctionnement-de-la-pile-materielle-du-6502-1-8\/","title":{"rendered":"Fonctionnement de la pile mat\u00e9rielle du 6502 (1\/8)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>EN GUISE D\u2019INTRODUCTION<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fascin\u00e9 par certaines utilisations d\u00e9tourn\u00e9es de la pile de mat\u00e9riel du 6502, telles que les programmes de protections, j\u2019ai voulu en apprendre davantage sur son fonctionnement. <br>Je vous propose donc ici la traduction partielle d\u2019un sujet dont la version originale se trouve \u00e0 l\u2019adresse suivante&nbsp;: <a href=\"http:\/\/wilsonminesco.com\/stacks\/\">http:\/\/wilsonminesco.com\/stacks\/<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>QUELQUES DEFINITIONS<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le type de pile dont il est question ici est une partie de la m\u00e9moire vive utilis\u00e9e pour le stockage temporaire de donn\u00e9es, qu\u2019il s\u2019agisse de variables ou d\u2019adresses, avec comme mode d\u2019acc\u00e8s, dernier entr\u00e9, premier sorti (Last In First Out).<br>On compare g\u00e9n\u00e9ralement ce type de pile \u00e0 une pile d\u2019assiettes dans un meuble \u00e0 ressorts que l\u2019on peut trouver \u00e0 c\u00f4t\u00e9 d\u2019un buffet restaurant.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/ceobeta.oric.org\/wp-content\/uploads\/2019\/05\/pile_buffet.jpg\" alt=\"\" class=\"wp-image-743\"\/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">La quantit\u00e9 de compression ou\nd\u2019\u00e9tirement des ressorts est proportionnelle au poids des assiettes que le\nmeuble contient, de sorte que tant que le meuble n\u2019est pas rempli compl\u00e8tement,\nun employ\u00e9 peut ajouter n\u2019importe quel nombre d\u2019assiettes r\u00e9cemment lav\u00e9es et\nles assiettes seront toujours dans la m\u00eame position au sommet, pr\u00eates pour le\nprochain client.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">D\u2019habitude, ni l\u2019employ\u00e9 ni le client\nn\u2019ont besoin de savoir combien d\u2019assiettes chaudes sont stock\u00e9es en dessous.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On peut aussi prendre l\u2019exemple d\u2019une tige m\u00e9tallique avec un tas de papiers embroch\u00e9s.&nbsp; Vous pouvez voir les documents qui sont sous le sommet, et vous pourriez m\u00eame lire ou \u00e9crire sur eux dans une certaine mesure sans retirer ceux qui sont au-dessus, mais le retrait ou l\u2019ajout r\u00e9el de documents a toujours lieu par le sommet.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/ceobeta.oric.org\/wp-content\/uploads\/2019\/05\/pile_pile.jpg\" alt=\"\" class=\"wp-image-744\"\/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Le contraire d\u2019une pile (ou m\u00e9moire\nLIFO) serait une m\u00e9moire de type premier entr\u00e9, premier sorti (FIFO) ou file\nd\u2019attente, qui peut dans ce cas \u00eatre compar\u00e9e au convoyeur d\u2019une machine \u00e0\nrayons X dans un a\u00e9roport. Sur cette machine, les affaires passent d\u2019un c\u00f4t\u00e9 \u00e0\nun autre des rayons X, dans le m\u00eame ordre qu\u2019elles sont entr\u00e9es.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Contrairement \u00e0 la pile d\u2019assiettes,\nune pile de nombres dans la m\u00e9moire de l\u2019ordinateur ne se d\u00e9place pas de haut\nen bas quand quelque chose est ajout\u00e9 ou enlev\u00e9 de la pile. Il serait en effet\ncontre-productif de d\u00e9placer toutes ces donn\u00e9es vers le haut ou vers le bas\ncomme pour les assiettes, alors qu\u2019il est plus simple d\u2019utiliser un pointeur\nr\u00e9glable pour savoir o\u00f9 se trouve le haut ou, en fait, dans le cas de la pile mat\u00e9riel\ndu 6502, quelle est l\u2019adresse RAM qui est la prochaine disponible pour mettre quelque\nchose sur la pile.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ce pointeur est le registre S (Stack\npointer) du 6502.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">D\u00e8s lors, si l\u2019analogie du\ndistributeur d\u2019assiettes ne tient plus, pourquoi l\u2019\u00e9voquer ?<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En fait, ce qu\u2019il convient surtout de\nretenir ici, c\u2019est qu\u2019habituellement, on ne s\u2019occupe que de ce qui se trouve\nau-dessus de la pile, sans se soucier de la profondeur de celle-ci, comme un\nnavire en pleine mer qui flotte de la m\u00eame mani\u00e8re que la profondeur de l\u2019eau\nsoit de 100 m\u00e8tres ou de 1000 m\u00e8tres. Tant qu\u2019une action ou une routine dispose\ndes \u00e9l\u00e9ments de la pile dont elle a besoin, peu importe combien d\u2019autres \u00e9l\u00e9ments\nsont plus bas dans la pile, en attendant d\u2019\u00eatre utilis\u00e9s par d\u2019autres routines\nou parties d\u2019une routine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La pile du processeur 6502 permet de\nstocker des adresses pour des sous-routines et des interruptions (moins\nfr\u00e9quentes que pour des sous-routines) ainsi que des variables.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C\u2019est dans la premi\u00e8re page du 6502 ($0100-$01FF)\nque r\u00e9side la pile de mat\u00e9riel. Les tests montrent d\u2019ailleurs que contrairement\n\u00e0 une l\u00e9gende urbaine, cette zone m\u00e9moire est beaucoup plus grande que ce dont\nle programmeur a r\u00e9ellement besoin.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le pointeur de la pile de mat\u00e9riel\nest le registre S qui n\u2019a que 8 bits de largeur; le 6502 ajustant\nautomatiquement le num\u00e9ro de page \u00e0 $01 pour tous les acc\u00e8s \u00e0 la pile. La pile\nde mat\u00e9riel en page 1 se d\u00e9veloppe vers le bas, et non vers le haut. Toute routine\nde r\u00e9initialisation doit donc initialiser le pointeur de pile au sommet de\nl\u2019espace disponible. Il s\u2019agit habituellement de l\u2019adresse $01FF. Cette routine\ns\u2019\u00e9crira simplement&nbsp;:<\/p>\n\n\n\n<p style=\"background-color:#fff6e3\" class=\"has-background article_code wp-block-paragraph\"><code>LDX&nbsp; #$FF&nbsp;; Initialise X au sommet de la pile<\/code><br><code>TXS&nbsp;; Transf\u00e8re dans le pointeur de pile<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Puisque la pile se d\u00e9veloppe vers le bas, le pointeur de pile se <strong>d\u00e9cr\u00e9mente<\/strong> apr\u00e8s chaque octet pouss\u00e9\nsur la pile, et s\u2019<strong>incr\u00e9mente<\/strong> avant\nque chaque octet ne soit tir\u00e9 hors de la pile.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ADRESSES DE SOUS-ROUTINE ET <em>NIDIFICATION<\/em><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Une sous-routine est une partie de votre\nprogramme dont vous avez besoin \u00e0 de multiples reprises et \u00e0 diff\u00e9rents\nendroits. Au lieu d\u2019avoir une copie de cette routine \u00e0 chaque endroit o\u00f9 vous en\navez besoin, vous l\u2019\u00e9crivez une fois pour toutes et vous l\u2019appelez depuis la\nportion de programme requise. Le compteur de programme se rend \u00e0 cette\nsous-routine puis doit pointer de nouveau sur la routine d\u2019appel pour reprendre\nl\u2019ex\u00e9cution. Pour savoir o\u00f9 revenir, le compteur de programme (donc l\u2019adresse\nde retour) a au pr\u00e9alable \u00e9t\u00e9 sauv\u00e9e sur la pile.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C\u2019est ce que r\u00e9alise l\u2019instruction JSR&nbsp;:\n\u00ab&nbsp;Jump, Saving\nReturn address&nbsp;\u00bb (JSR est habituellement traduit\npar \u00ab&nbsp;Jump to SubRoutine&nbsp;\u00bb, ce\nqui fonctionne tout aussi bien mais n\u2019est pas tout \u00e0 fait exact.) Supposons maintenant\nque cette routine doive en appeler d\u2019autres. Comme chaque JSR met l\u2019adresse de\nretour sur la pile, les adresses de retour n\u00e9cessaires en premier lieu seront\nles <strong>derni\u00e8res<\/strong> stock\u00e9es sur la pile.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La <em>nidification<\/em> est ce qui convient de mieux pour ce genre de\nsituation. On appelle <em>nidification<\/em>\n(ou imbrication), le fait qu\u2019une sous-routine en appelle une autre, qui \u00e0 son\ntour en appelle une autre, et ainsi de suite. Si vous n\u2019aviez pas besoin de la <em>nidification<\/em>, vous pourriez inscrire\nl\u2019adresse de retour dans une variable ou un registre; mais vous vous apercevez\nque d\u00e8s la premi\u00e8re <em>nidification<\/em>, la\nvariable serait \u00e9cras\u00e9e et la premi\u00e8re adresse de retour serait perdue.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C\u2019est l\u00e0 que la pile entre en jeu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Consid\u00e9rons \u00e0\npr\u00e9sent la <em>nidification<\/em> des\nsous-routines ci-dessous.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/ceobeta.oric.org\/wp-content\/uploads\/2019\/05\/pile_nidification.jpg\" alt=\"\" class=\"wp-image-745\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dans ce sc\u00e9nario, la pile contiendra les nombres hexad\u00e9cimaux suivants aux points &nbsp;(a), (b) et (c) ;&nbsp;(sans compter ce qui aurait d\u00e9j\u00e0 pu \u00eatre sur la pile avant (a).<\/p>\n\n\n\n<table class=\"wp-block-table aligncenter\"><tbody><tr><td>\n  &nbsp;\n  <\/td><td>(a)<\/td><td>(b)<\/td><td>(c)<\/td><\/tr><tr><td>\n  Sommet pile (*)\n  <\/td><td>\n  $1915\n  <\/td><td>\n  $2632\n  <\/td><td>\n  $2F43\n  <\/td><\/tr><tr><td>\n  &nbsp;\n  <\/td><td>\n  &nbsp;\n  <\/td><td>\n  $1915\n  <\/td><td>\n  $2632\n  <\/td><\/tr><tr><td>\n  &nbsp;\n  <\/td><td>\n  &nbsp;\n  <\/td><td>\n  &nbsp;\n  <\/td><td>\n  $1915\n  <\/td><\/tr><\/tbody><\/table>\n\n\n\n<p class=\"wp-block-paragraph\">(*) Top Of Stack (TOS)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ce tableau semble comporter des erreurs. En effet, au point (a)&nbsp;&nbsp;l\u2019adresse de la prochaine instruction est cens\u00e9e \u00eatre $1916, et non $1915.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En fait, l\u2019instruction RTS (Return\nFrom subroutine) incr\u00e9mentera l\u2019adresse de retour et l\u2019ex\u00e9cution du programme\nreprendra bien \u00e0 $1916 (ce qui n\u2019est pas le cas pour RTI, ReTurn-from-Interrupt, et fera\nl\u2019objet d\u2019un autre article).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Puisque le bus de donn\u00e9es et la\nm\u00e9moire du 6502 sont adress\u00e9s sur 8 bits, chaque adresse de retour \u00e9voqu\u00e9e ci-dessus\nn\u00e9cessite deux emplacements dans la pile. Lorsque JSR pousse l\u2019adresse\nde retour (moins 1) sur la pile, il pousse <strong>d\u2019abord\nl\u2019octet haut, puis l\u2019octet bas<\/strong>. N\u2019oubliez pas que la pile grandit, et que le\npointeur de la pile se d\u00e9cr\u00e9mente lorsque les octets sont pouss\u00e9s sur la pile,\nde sorte que l\u2019ordre d\u2019octet r\u00e9sultant est l\u2019octet de poids faible dans\nl\u2019adresse m\u00e9moire la plus basse, comme le sont les autres adresses dans le 6502.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Supposons par exemple que la valeur\ndu pointeur de pile (registre S) \u00e9tait $EF avant que le code n\u2019entre dans le\ndiagramme de pile ci-dessus. Cela donnerait une occupation de l\u2019espace m\u00e9moire\nde la pile selon le tableau suivant (ne sachant pas ce qui figurait de $EF \u00e0\n$FF, ces octets ne sont pas cartographi\u00e9s).<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/ceobeta.oric.org\/wp-content\/uploads\/2019\/05\/pile_table1.png\" alt=\"\" class=\"wp-image-750\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Lorsque vous\nquittez les sous routines et que vous revenez \u00e0 la routine principale, voici \u00e0\nquoi ressemble la m\u00e9moire de la pile.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/ceobeta.oric.org\/wp-content\/uploads\/2019\/05\/pile_table2.png\" alt=\"\" class=\"wp-image-751\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Les nombres entre parenth\u00e8ses sont\ntoujours l\u00e0, mais cette partie de la m\u00e9moire de la pile est lib\u00e9r\u00e9e. Retirer\nquelque chose de la pile signifie simplement que le processeur en lit le\ncontenu et incr\u00e9mente ensuite le pointeur de la pile. Pouvez-vous utiliser ces\nchiffres, puisqu\u2019ils sont toujours l\u00e0 ? Si vous avez des interruptions, la\nr\u00e9ponse est non, car une interruption pourrait survenir \u00e0 tout moment et les\n\u00e9craser. Cela violerait le protocole LIFO et le processus des interruptions n\u00e9cessite\nque ce protocole soit respect\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c0 suivre.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>EN GUISE D\u2019INTRODUCTION Fascin\u00e9 par certaines utilisations d\u00e9tourn\u00e9es de la pile de mat\u00e9riel du 6502, telles que les programmes de protections, j\u2019ai voulu en apprendre davantage sur son fonctionnement. Je vous propose donc ici la traduction partielle d\u2019un sujet dont la version originale se trouve \u00e0 l\u2019adresse suivante&nbsp;: http:\/\/wilsonminesco.com\/stacks\/ QUELQUES DEFINITIONS Le type de pile [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":754,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[346,22],"tags":[376,654],"class_list":["post-742","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-assembleur","category-ceomag","tag-376","tag-ceomag347"],"_links":{"self":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/posts\/742","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/comments?post=742"}],"version-history":[{"count":0,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/posts\/742\/revisions"}],"wp:attachment":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/media?parent=742"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/categories?post=742"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/tags?post=742"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}