<?xml version="1.0"?>
<oembed><version>1.0</version><provider_name>MO5.COM</provider_name><provider_url>http://mo5.com/fr</provider_url><title>The beginnings of an emulator - MO5.COM</title><type>rich</type><width>600</width><height>338</height><html>&lt;blockquote class="wp-embedded-content" data-secret="iUIWpQy9ls"&gt;&lt;a href="http://mo5.com/fr/the-beginnings-of-an-emulator/"&gt;The beginnings of an emulator&lt;/a&gt;&lt;/blockquote&gt;&lt;iframe sandbox="allow-scripts" security="restricted" src="http://mo5.com/fr/the-beginnings-of-an-emulator/embed/#?secret=iUIWpQy9ls" width="600" height="338" title="&#xAB;&#xA0;The beginnings of an emulator&#xA0;&#xBB; &#x2014; MO5.COM" data-secret="iUIWpQy9ls" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" class="wp-embedded-content"&gt;&lt;/iframe&gt;&lt;script type="text/javascript"&gt;
/* &lt;![CDATA[ */
/*! This file is auto-generated */
!function(d,l){"use strict";l.querySelector&amp;&amp;d.addEventListener&amp;&amp;"undefined"!=typeof URL&amp;&amp;(d.wp=d.wp||{},d.wp.receiveEmbedMessage||(d.wp.receiveEmbedMessage=function(e){var t=e.data;if((t||t.secret||t.message||t.value)&amp;&amp;!/[^a-zA-Z0-9]/.test(t.secret)){for(var s,r,n,a=l.querySelectorAll('iframe[data-secret="'+t.secret+'"]'),o=l.querySelectorAll('blockquote[data-secret="'+t.secret+'"]'),c=new RegExp("^https?:$","i"),i=0;i&lt;o.length;i++)o[i].style.display="none";for(i=0;i&lt;a.length;i++)s=a[i],e.source===s.contentWindow&amp;&amp;(s.removeAttribute("style"),"height"===t.message?(1e3&lt;(r=parseInt(t.value,10))?r=1e3:~~r&lt;200&amp;&amp;(r=200),s.height=r):"link"===t.message&amp;&amp;(r=new URL(s.getAttribute("src")),n=new URL(t.value),c.test(n.protocol))&amp;&amp;n.host===r.host&amp;&amp;l.activeElement===s&amp;&amp;(d.top.location.href=t.value))}},d.addEventListener("message",d.wp.receiveEmbedMessage,!1),l.addEventListener("DOMContentLoaded",function(){for(var e,t,s=l.querySelectorAll("iframe.wp-embedded-content"),r=0;r&lt;s.length;r++)(t=(e=s[r]).getAttribute("data-secret"))||(t=Math.random().toString(36).substring(2,12),e.src+="#?secret="+t,e.setAttribute("data-secret",t)),e.contentWindow.postMessage({message:"ready",secret:t},"*")},!1)))}(window,document);
//# sourceURL=http://mo5.com/wp-includes/js/wp-embed.min.js
/* ]]&gt; */
&lt;/script&gt;
</html><thumbnail_url>https://mo5.com/wp-content/uploads/2023/01/20210218-Capture-Ecran-Emulateur-1024x620-1.png</thumbnail_url><thumbnail_width>1024</thumbnail_width><thumbnail_height>620</thumbnail_height><description>By Sylvain Glaize. Translation by S&#xE9;bastien Marty. Let&#x2019;s go back a bit. From the moment we first discussed the project, there was the idea of creating a Micral N simulator. And this for two main reasons. First of all to offer everyone, at the end of the day, the opportunity of virtually handling this rare machine. Second, to be able to study a machine we didn&#x2019;t know yet, and didn&#x2019;t know whether our unit was in working order or even complete. Having a simulator or an emulator, whatever you call it, makes it possible to work on a replica of a precious machine without risk of damaging it. It allows you to move forward in parallel between the real machine and its virtual twin. Later on, after studying the detailed physical arrangement of this Micral N, the interest of the simulator will be validated. Indeed, we are missing the connection cables between certain boards, so we will have to rebuild them. And to do that, we need to understand exactly how the boards communicate with each other. &nbsp; Simulating the 8008 Simulating a processor can be done at several different levels. At the very lowest and most detailed level, we can use an FPGA to reproduce its structure. At a much higher level, we can simulate the state changes due to the execution of each machine instruction. I decided to work at an intermediate level: simulating the state changes after each &#x201C;state&#x201D; of the processor. It is a way to simulate the processor&#x2019;s signals quite finely and to understand their detailed operation. The official documentation for the 8008 helps in that it contains a table of these states and of the elementary operations performed by the processor at each of these states. &nbsp; And that quite naturally translates into data describing how the processor works, step by step. The execution of the simulator is clocked by a scheduler which indicates, at each state change of the system, the simulated components that must be notified. If this component in turn causes a change in the state of the system, it indicates to the scheduler when this change will occur. Here again, with good knowledge of the system, it would be easier to have a fixed scheduler that knows who is talking to what and who is reacting to what. Not knowing the system, an architecture where each component talks with the scheduler provides flexibility, at the cost of a certain slowness. But for a processor that runs at 500 kHz, it&#x2019;s ok &#x2013; even on a Raspberry Pi 4. &nbsp; The wrapping PTo launch the emulator, two &#x201C;wrappings&#x201D; are provided. The first wrapping is a mode without direct interaction, but one can imagine opening a serial port or interfacing with BlinkenBone (http://retrocmp.com/projects/blinkenbone)&#xA0;&#x2013; an architecture which allows interaction with illuminated control panels, either real or replicas. The second wrapping is an interactive mode with many windows to visualize the state of the machine, the contents of its memory and reproduce the control panel at the front. This is the main one that will be used throughout our research work. This version uses [&hellip;]</description></oembed>
