For Xerox Internal Use Only -- September 14, 1979 MicroD August 1, 1978 1 MicroD - Dorado/D0 instruction placer MicroD takes microprograms for the Dorado or D0, assembled by Micro, and completes the assembly process by assigning absolute locations to the microinstructions. The resulting file can be loaded into a D- machine by Midas and run. MicroD's job is to find a way to assign locations to microinstructions in a way that satisfies both the semantics of the source program and the peculiar addressing restrictions of the hardware. This document is deliberately somewhat sketchy, since it assumes that its readers have already absorbed the necessary "culture" surrounding D-machine microprogramming and just want to know how to convert Micro output into Midas input. At some future date it may be expanded to be more helpful to people just getting started. The simplest way to use MicroD is to assemble your entire microprogram at once with Micro, producing a single file xxx.DIB. (DIB stands for "D-machine Intermediate Binary".) Then you invoke MicroD as follows: MicroD xxx to produce a listing file xxx.DLS and a final binary file xxx.MB which can be fed to Midas. MicroD normally produces a listing with the following parts: The name and initial contents of each defined R memory location. The initial contents of each IFU and ALUF memory location. The label and octal representation of each microinstruction. A summary of how much of each page of I (microinstruction) memory was used. MicroD accepts the following global flags which affect the listing: /N (No listing) - only produce the summary /C (Concise) - produce everything but the octal contents of I memory The following global flags produce additional information, not useful to the ordinary user: /D (Debug) - print a large amount of debugging information /T (Trace) - print a trace of the calls on the storage allocator Normally MicroD produces its output on xxx.DLS and xxx.MB, where xxx is the name of the last (or only) input file. You can specify a different name with the local /O switch, e.g. MicroD xxx yyy/o to process xxx.DIB but produce yyy.DLS and yyy.MB. If you wish, you can assemble your microprogram in pieces and let MicroD link the pieces together. (This can save a large amount of assembly time for large programs.) Suppose your program consists of the following parts: some definitions defs1.MC and defs2.MC; one large piece of code this1.MC and this2.MC; another large piece of code that.MC. Then you can proceed as follows: Micro saveit/s defs/b defs1 defs2 This assembles the definitions, saves Micro's state on saveit.ST, and produces a file defs.DIB. Micro saveit/r this/b this1 this2 This resumes assembly with the definitions saved in saveit, producing this.DIB. Micro will give you a list of "undefined symbols", which are references to symbols not defined in this1 or this2 (presumably defined in that). For Xerox Internal Use Only -- September 14, 1979 MicroD August 1, 1978 2 Micro saveit/r that This again resumes assembly with the saved definitions, producing that.DIB. Again, Micro will list the symbols not defined in that (presumably defined in this1 or this2). MicroD myprog/o defs this that MicroD will link together any references from this to that (or vice versa) and produce the output files myprog.DLS and myprog.MB. Note that you do not need to do anything special in your source files to declare labels which are exported (defined here, used elsewhere) or imported (used here, defined elsewhere): Micro assumes that any undefined symbol is meant to be imported (but gives you the list just so you can check), and MicroD assumes that all labels are exported. MicroD also discards all but the last definition of a name (e.g. the name ILC is defined in every file as the address of the last microinstruction). If you have multiple .DIB files, you can control the listing mode (normal, No listing, or Concise) for each file individually by using /L (List), /N, or /C as a local switch on the file name. The global switch, if any, applies to any input file that lacks a local switch. For example, to get only a concise listing for the second part of the program in the above example, you can use MicroD/n myprog/o defs this that/c