The Meta-Machine Code Interface Concept As this writing is a collection of my ideas that have not been written down in full before now, this page will be gradually updated and refined whenever I recall or conceive more and more of my ideas concerning the topic and feel the want. In particular, I intend to update this article with illustrations, later. The Meta-Machine Code interface concept began as a vague notion of machine-assisted creation of machine instructions through reasonably structured use of questioning and whatnot. Among the first examples was, having chosen the instruction through a single action, having the system guide operand questioning in a way that prevented invalid such operands from being entered. To provide a concrete example, the peculiarities of ARM literals could be accomodated for in the integer collecting routine in a way that doesn't permit an invalid such integer to be entered. Given the inherently interactive nature of the tool, it was important to prevent errors of this type; the notion of an invalid literal loses its meaning at this level, as something will always be present. Due to distaste with Emacs' notion of a mode-line and minibuffer, the interface eventually became entirely uniform, with an unimportant number of rows spanning ranges filling the display area. The interface uses these rows to display contiguous regions of memory, with each row containing identity information, such as address and range contents in various bases, and the remainder being available to the meta-machine code routines for custom purposes, such as displaying the contents of the memory as an instruction for ease of understanding. Making this former half of each row customizable proved too complicated for my tastes and so the idea was discarded. An interesting consequence of this design is how the tool functions properly with even only one row of display, given it's wide enough The question arose as to where input should be collected, with either a transient area, such as a ``popup window'', appearing for such or the commandeering of a row for such use. The commandeering of a row is simpler in some display primitive sets and is currently what is being pursued. This choice also preserves the quality of needing just one row for proper operation. Associated meta-machine code routines are run in order; it was thought that disallowing range changes would allow for parallel processing, but this restriction would prevent, say, instruction bytes from being interpreted in several ways related to an offset within the instruction and this was considered an important and interesting feature; it has later been decided that enabling such range changes interferes too deeply with screen consistency and that a separate mechanism can be provided for this interesting, albeit perhaps rare case. Originally these display routines could potentially alter previous displayed rows, and this wasn't considered an issue, as the programmer was expected to know how such a feature would be used or abused, but maintaining display consistency has been a prime bother and disallowing display routines from asking questions, modifying the program, and other such actions, making them idempotent, has been a key to alleviating this bother. By funneling all program changes through a single mechanism, originally for making any undo functionality possible to implement, it can also easily be calculated whether redisplay should occur. It was not considered acceptable to make a copy of any information to determine if redisplay should occur. By funneling all changes through this mechanism, it can be checked each time and a single flag set to determine this. The current row is always redisplayed and changes outside of the view need no redisplay; this reduces the check to four integer comparisons: testing the bounds of the first region, between the beginning of the display and the current row, and also testing the bounds of the second region, between the current row and the end of the display. By requiring all changes to occur through this mechanism, including name changes, it can easily be tested whether a full redisplay is necessary or not. More complex algorithms could be employed to avoid requiring full redisplay, but this will not be done. As for manual screen redisplay, a rather necessary traversal command was found to also be suitable for this, without explicitly creating such a command, as that was explicitly not going to be done, and so avoided tainting the MMC with such concerns. Along with traversal among the rows and the scrolling of rows through memory, this command for selecting an address was envisioned to be useful and an unoptimizing, and so realistic, version would always redisplay to accomodate all cases; this necessarily makes it work for redisplay. Having the default address result in redisplay of the screen beginning from the current row nicely solves this bother.