﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-淡泊明志、宁静致远-随笔分类-嵌入式系统开发</title><link>http://www.cnitblog.com/houcy/category/6985.html</link><description>A Diamond is just a piece of Coal that did well under Pressure.</description><language>zh-cn</language><lastBuildDate>Tue, 27 Sep 2011 00:03:29 GMT</lastBuildDate><pubDate>Tue, 27 Sep 2011 00:03:29 GMT</pubDate><ttl>60</ttl><item><title>Interrupt table</title><link>http://www.cnitblog.com/houcy/archive/2011/03/10/73056.html</link><dc:creator>挑灯看剑</dc:creator><author>挑灯看剑</author><pubDate>Thu, 10 Mar 2011 09:31:00 GMT</pubDate><guid>http://www.cnitblog.com/houcy/archive/2011/03/10/73056.html</guid><wfw:comment>http://www.cnitblog.com/houcy/comments/73056.html</wfw:comment><comments>http://www.cnitblog.com/houcy/archive/2011/03/10/73056.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/houcy/comments/commentRss/73056.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/houcy/services/trackbacks/73056.html</trackback:ping><description><![CDATA[<h2><span class="mw-headline" id="Interrupt_table">Interrupt table</span></h2>
<p>A list of common BIOS interrupts can be found below. Note that some
BIOSes (particularly old ones) will not support all of these interrupts.</p>
<table class="wikitable" border="1">
    <tbody>
        <tr>
            <th>Interrupt vector</th>
            <th>Description</th>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​00h​</span></td>
            <td>CPU: Executed after an attempt to divide by zero or when the quotient does not fit in the destination</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​01h​</span></td>
            <td>CPU: Executed after every instruction while the trace flag is set</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​02h​</span></td>
            <td>CPU: <a  href="http://en.wikipedia.org/wiki/Non-maskable_interrupt" title="Non-maskable interrupt">NMI</a>, used e.g. by <a  href="http://en.wikipedia.org/wiki/Power-on_self-test" title="Power-on self-test">POST</a> for memory errors</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​03h​</span></td>
            <td>CPU: The lowest non-reserved interrupt, it is used exclusively for debugging, and the <span class="mw-geshi text source-text">​INT 03​</span> handler is always implemented by a debugging program</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​04h​</span></td>
            <td>CPU: Numeric Overflow. Usually caused by the <span class="mw-geshi text source-text">​INTO​</span> instruction when the overflow flag is set.</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​05h​</span></td>
            <td>Executed when Shift-<a  href="http://en.wikipedia.org/wiki/Print_screen">Print screen</a> is pressed, as well as when the <span class="mw-geshi text source-text">​BOUND​</span> instruction detects a bound failure.</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​06h​</span></td>
            <td>CPU: Called when the Undefined Opcode (invalid instruction) exception occurs. Usually installed by the operating system.</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​07h​</span></td>
            <td>CPU: Called when an attempt was made to execute a floating-point instruction and no numeric coprocessor was available.</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​08h​</span></td>
            <td>IRQ0: Implemented by the system timing component; called 18.2 times per second (once every 55 ms) by the <a  href="http://en.wikipedia.org/wiki/Programmable_Interrupt_Controller" title="Programmable Interrupt Controller">PIC</a></td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​09h​</span></td>
            <td>IRQ1: Called after every key press and release (as well as during the time when a key is being held)</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​0Bh​</span></td>
            <td>IRQ3: Called by <a  href="http://en.wikipedia.org/wiki/Serial_port" title="Serial port">serial ports</a> 2 and 4 (COM2/4) when in need of attention</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​0Ch​</span></td>
            <td>IRQ4: Called by serial ports 1 and 3 (COM1/3) when in need of attention</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​0Dh​</span></td>
            <td>IRQ5: Called by hard disk controller (PC/XT) or 2nd <a  href="http://en.wikipedia.org/wiki/Parallel_port">parallel port</a> LPT2 (AT) when in need of attention</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​0Eh​</span></td>
            <td>IRQ6: Called by <a  href="http://en.wikipedia.org/wiki/Floppy_disk_controller">floppy disk controller</a> when in need of attention</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​0Fh​</span></td>
            <td>IRQ7: Called by 1st parallel port LPT1 (printer) when in need of attention</td>
        </tr>
        <tr>
            <td><a  href="http://en.wikipedia.org/wiki/INT_10" title="INT 10" class="mw-redirect"><span class="mw-geshi text source-text">​10h​</span></a></td>
            <td>Video Services - installed by the BIOS or operating system; called by software programs
            <table class="wikitable" style="margin-left: 1em;" border="1">
                <tbody>
                    <tr>
                        <th><span class="mw-geshi text source-text">​AH​</span></th>
                        <th>Description</th>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​00h​</span></td>
                        <td>Set Video Mode</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​01h​</span></td>
                        <td>Set Cursor Shape</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​02h​</span></td>
                        <td>Set Cursor Position</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​03h​</span></td>
                        <td>Get Cursor Position And Shape</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​04h​</span></td>
                        <td>Get Light Pen Position</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​05h​</span></td>
                        <td>Set Display Page</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​06h​</span></td>
                        <td>Clear/Scroll Screen Up</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​07h​</span></td>
                        <td>Clear/Scroll Screen Down</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​08h​</span></td>
                        <td>Read Character and Attribute at Cursor</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​09h​</span></td>
                        <td>Write Character and Attribute at Cursor</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​0Ah​</span></td>
                        <td>Write Character at Cursor</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​0Bh​</span></td>
                        <td>Set Border Color</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​0Eh​</span></td>
                        <td>Write Character in TTY Mode</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​0Fh​</span></td>
                        <td>Get Video Mode</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​13h​</span></td>
                        <td>Write String</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​11h​</span></td>
            <td>Installed by the BIOS; returns equipment list</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​12h​</span></td>
            <td>Installed by the BIOS or operating system; returns Conventional Memory Size</td>
        </tr>
        <tr>
            <td><a  href="http://en.wikipedia.org/wiki/INT_13" title="INT 13" class="mw-redirect"><span class="mw-geshi text source-text">​13h​</span></a></td>
            <td>Low Level Disk Services; installed by the BIOS or operating system; called by software programs
            <table class="wikitable" style="margin-left: 1em;" border="1">
                <tbody>
                    <tr>
                        <th><span class="mw-geshi text source-text">​AH​</span></th>
                        <th>Description</th>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​00h​</span></td>
                        <td>Reset Disk Drives</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​01h​</span></td>
                        <td>Check Drive Status</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​02h​</span></td>
                        <td>Read Sectors From Drive</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​03h​</span></td>
                        <td>Write Sectors To Drive</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​04h​</span></td>
                        <td>Verify Sectors On Drive</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​05h​</span></td>
                        <td>Format Track On Drive</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​08h​</span></td>
                        <td>Get Drive Parameters</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​09h​</span></td>
                        <td>Init Fixed Drive Parameters</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​0Ch​</span></td>
                        <td>Seek To Specified Track</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​0Dh​</span></td>
                        <td>Reset Fixed Disk Controller</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​15h​</span></td>
                        <td>Get Drive Type</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​16h​</span></td>
                        <td>Get Floppy Drive Media Change Status</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
        <tr>
            <td><a  href="http://en.wikipedia.org/wiki/INT_14" title="INT 14" class="mw-redirect"><span class="mw-geshi text source-text">​14h​</span></a></td>
            <td>Routines for communicating via the serial port. Used by software programs.
            <table class="wikitable" style="margin-left: 1em;" border="1">
                <tbody>
                    <tr>
                        <th><span class="mw-geshi text source-text">​AH​</span></th>
                        <th>Description</th>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​00h​</span></td>
                        <td>Serial Port Initialization</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​01h​</span></td>
                        <td>Transmit Character</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​02h​</span></td>
                        <td>Receive Character</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​03h​</span></td>
                        <td>Status</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​15h​</span></td>
            <td>Miscellaneous (System services support routines)
            <table class="wikitable" style="margin-left: 1em;" border="1">
                <tbody>
                    <tr>
                        <th><span class="mw-geshi text source-text">​AH​</span></th>
                        <th><span class="mw-geshi text source-text">​AL​</span></th>
                        <th><span class="mw-geshi text source-text">​AX​</span></th>
                        <th>Description</th>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​4Fh​</span></td>
                        <td><br></td>
                        <td><br></td>
                        <td>Keyboard Intercept</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​83h​</span></td>
                        <td><br></td>
                        <td><br></td>
                        <td>Event Wait</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​84h​</span></td>
                        <td><br></td>
                        <td><br></td>
                        <td>Read Joystick</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​85h​</span></td>
                        <td><br></td>
                        <td><br></td>
                        <td>Sysreq Key Callout</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​86h​</span></td>
                        <td><br></td>
                        <td><br></td>
                        <td>Wait</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​87h​</span></td>
                        <td><br></td>
                        <td><br></td>
                        <td>Move Block</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​88h​</span></td>
                        <td><br></td>
                        <td><br></td>
                        <td>Get Extended Memory Size</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​C0h​</span></td>
                        <td><br></td>
                        <td><br></td>
                        <td>Get System Parameters</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​C1h​</span></td>
                        <td><br></td>
                        <td><br></td>
                        <td>Get Extended BIOS Data Area Segment</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​C2h​</span></td>
                        <td><br></td>
                        <td><br></td>
                        <td>Pointing Device Functions</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​E8h​</span></td>
                        <td><span class="mw-geshi text source-text">​01h​</span></td>
                        <td><span class="mw-geshi text source-text">​E801h​</span></td>
                        <td>Get Extended Memory Size(Newer function, since 1994). Gives results for memory size above 64 Mb.</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​E8h​</span></td>
                        <td><span class="mw-geshi text source-text">​20h​</span></td>
                        <td><span class="mw-geshi text source-text">​E820h​</span></td>
                        <td>Query System Address Map. The information returned from <a  href="http://en.wikipedia.org/wiki/E820">e820</a> supersedes what is returned from the older <code>AX=E801h</code> and <code>AH=88h</code> interfaces.</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​16h​</span></td>
            <td>Implemented by the BIOS or operating system. Provides routines to
            be called by software programs which communicate with the keyboard.
            <table class="wikitable" style="margin-left: 1em;" border="1">
                <tbody>
                    <tr>
                        <th><span class="mw-geshi text source-text">​AH​</span></th>
                        <th>Description</th>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​00h​</span></td>
                        <td>Read Character</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​01h​</span></td>
                        <td>Read Input Status</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​02h​</span></td>
                        <td>Read Keyboard Shift Status</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​10h​</span></td>
                        <td>Read Character Extended</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​11h​</span></td>
                        <td>Read Input Status Extended</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​12h​</span></td>
                        <td>Read Keyboard Shift Status Extended</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​17h​</span></td>
            <td>Print Services - used by software programs to communicate with the printer
            <table class="wikitable" style="margin-left: 1em;" border="1">
                <tbody>
                    <tr>
                        <th><span class="mw-geshi text source-text">​AH​</span></th>
                        <th>Description</th>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​00h​</span></td>
                        <td>Print Character to Printer</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​01h​</span></td>
                        <td>Initialize Printer</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​02h​</span></td>
                        <td>Check Printer Status</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​18h​</span></td>
            <td>Execute Cassette BASIC: True IBM computers contain BASIC in the ROM
            to be interpreted and executed by this routine in the event of a boot
            failure (called by the BIOS)</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​19h​</span></td>
            <td>After POST this interrupt is used by BIOS to load the operating system.</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​1Ah​</span></td>
            <td>Real Time Clock Services - called by software programs to communicate with the <a  href="http://en.wikipedia.org/wiki/Real_time_clock" title="Real time clock" class="mw-redirect">RTC</a>
            <table class="wikitable" style="margin-left: 1em;" border="1">
                <tbody>
                    <tr>
                        <th><span class="mw-geshi text source-text">​AH​</span></th>
                        <th>Description</th>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​00h​</span></td>
                        <td>Read RTC</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​01h​</span></td>
                        <td>Set RTC</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​02h​</span></td>
                        <td>Read RTC Time</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​03h​</span></td>
                        <td>Set RTC Time</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​04h​</span></td>
                        <td>Read RTC Date</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​05h​</span></td>
                        <td>Set RTC Date</td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​06h​</span></td>
                        <td>Set <a  href="http://en.wikipedia.org/wiki/RTC_Alarm" class="mw-redirect" title="RTC Alarm">RTC Alarm</a></td>
                    </tr>
                    <tr>
                        <td><span class="mw-geshi text source-text">​07h​</span></td>
                        <td>Reset RTC Alarm</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​1Bh​</span></td>
            <td>Installed by the operating system; automatically called by <span class="mw-geshi text source-text">​INT 9​</span> when Ctrl-<a  href="http://en.wikipedia.org/wiki/Break_key" title="Break key">Break</a> has been pressed</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​1Ch​</span></td>
            <td>Called automatically by <span class="mw-geshi text source-text">​INT 08​</span>; available for use by software programs when a routine needs to be executed regularly</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​1Dh​</span></td>
            <td>Not to be called; simply a pointer to the VPT (Video Parameter Table), which contains data on video modes</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​1Eh​</span></td>
            <td>Not to be called; simply a pointer to the DPT (Diskette Parameter
            Table), containing a variety of information concerning the diskette
            drives</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​1Fh​</span></td>
            <td>Not to be called; simply a pointer to the VGCT (Video Graphics Character Table), which contains the data for ASCII characters <span class="mw-geshi text source-text">​80h​</span> to <span class="mw-geshi text source-text">​FFh​</span></td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​41h​</span></td>
            <td>Address pointer: FDPT = Fixed Disk Parameter Table (1st hard drive)</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​46h​</span></td>
            <td>Address pointer: FDPT = Fixed Disk Parameter Table (2nd hard drive)</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​4Ah​</span></td>
            <td>Called by RTC for alarm</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​70h​</span></td>
            <td>IRQ8: Called by RTC</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​74h​</span></td>
            <td>IRQ12: Called by mouse</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​75h​</span></td>
            <td>IRQ13: Called by math coprocessor</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​76h​</span></td>
            <td>IRQ14: Called by primary IDE controller</td>
        </tr>
        <tr>
            <td><span class="mw-geshi text source-text">​77h​</span></td>
            <td>IRQ15: Called by secondary IDE controller</td>
        </tr>
    </tbody>
</table><img src ="http://www.cnitblog.com/houcy/aggbug/73056.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/houcy/" target="_blank">挑灯看剑</a> 2011-03-10 17:31 <a href="http://www.cnitblog.com/houcy/archive/2011/03/10/73056.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>街机游戏模拟器开发（2）</title><link>http://www.cnitblog.com/houcy/archive/2010/07/11/67408.html</link><dc:creator>挑灯看剑</dc:creator><author>挑灯看剑</author><pubDate>Sat, 10 Jul 2010 16:10:00 GMT</pubDate><guid>http://www.cnitblog.com/houcy/archive/2010/07/11/67408.html</guid><wfw:comment>http://www.cnitblog.com/houcy/comments/67408.html</wfw:comment><comments>http://www.cnitblog.com/houcy/archive/2010/07/11/67408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/houcy/comments/commentRss/67408.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/houcy/services/trackbacks/67408.html</trackback:ping><description><![CDATA[<br>一。CPU和ISA指令集架构&nbsp;&nbsp;&nbsp; <br>游戏模拟器本质上是个虚拟机，在宿主机上虚拟目标机(街机)的硬件运行原理，主要是虚拟CPU、指令、内存、中断、定时器、显示屏以及键盘。Space Invaders游戏机的主板是基于Intel的8080 CPU，这是一款8位的微处理器，是英特尔在1973年推出，它的可寻址空间为64K，有256个输入输出端口，一个8位的ALU累加器寄存器，一个8位的标志寄存器，6个8位的通用寄存器B,C,D,E,H,L，它们可以组合成16位的寄存器。一个16位的栈指针SP，一个16位的程序计数器PC。<br><br>
<table>
    <tbody>
        <tr vAlign=bottom>
            <td>
            <table>
                <tbody>
                    <tr>
                        <td colSpan=4>
                        <hr>
                        </td>
                    </tr>
                    <tr>
                        <td>&nbsp;</td>
                        <th align=middle>8 Bit<br>"General" Registers</th>
                        <td>&nbsp;</td>
                    </tr>
                    <tr>
                        <th>B</th>
                        <th>
                        <table cellSpacing=1 border=1>
                            <tbody>
                                <tr>
                                    <th width=64>&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th>0</th>
                        <th align=left><br></th>
                    </tr>
                    <tr>
                        <th>C</th>
                        <th>
                        <table cellSpacing=1 border=1>
                            <tbody>
                                <tr>
                                    <th width=64>&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th>1</th>
                        <th align=left><br></th>
                    </tr>
                    <tr>
                        <th>D</th>
                        <th>
                        <table cellSpacing=1 border=1>
                            <tbody>
                                <tr>
                                    <th width=64>&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th>2</th>
                        <th align=left><br></th>
                    </tr>
                    <tr>
                        <th>E</th>
                        <th>
                        <table cellSpacing=1 border=1>
                            <tbody>
                                <tr>
                                    <th width=64>&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th>3</th>
                        <th align=left><br></th>
                    </tr>
                    <tr>
                        <th>H</th>
                        <th>
                        <table cellSpacing=1 border=1>
                            <tbody>
                                <tr>
                                    <th width=64>&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th>4</th>
                        <th align=left>High Byte</th>
                    </tr>
                    <tr>
                        <th>L</th>
                        <th>
                        <table cellSpacing=1 border=1>
                            <tbody>
                                <tr>
                                    <th width=64>&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th>5</th>
                        <th align=left>Low Byte</th>
                    </tr>
                    <tr>
                        <th>A</th>
                        <th>
                        <table cellSpacing=1 border=1>
                            <tbody>
                                <tr>
                                    <th width=64>&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th>7</th>
                        <th align=left>Accumulator</th>
                    </tr>
                    <tr>
                        <td>&nbsp;</td>
                        <td align=middle>Program Registers</td>
                        <td>&nbsp;</td>
                    </tr>
                    <tr>
                        <th>SP</th>
                        <th>
                        <table cellSpacing=1 border=1>
                            <tbody>
                                <tr>
                                    <th width=128>&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th><br></th>
                        <th align=left>Stack Pointer</th>
                    </tr>
                    <tr>
                        <th>PC</th>
                        <th>
                        <table cellSpacing=1 border=1>
                            <tbody>
                                <tr>
                                    <th width=128>&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th><br></th>
                        <th align=left>Program Counter</th>
                    </tr>
                    <tr>
                        <th>PSW</th>
                        <th>
                        <table cellSpacing=1 border=1>
                            <tbody>
                                <tr>
                                    <th width=64>&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th><br></th>
                        <th align=left>Program Status Word</th>
                    </tr>
                </tbody>
            </table>
            </td>
            <td>
            <table border=0>
                <tbody>
                    <tr>
                        <th colSpan=3>Memory Space</th>
                    </tr>
                    <tr>
                        <th colSpan=3>
                        <hr>
                        </th>
                    </tr>
                    <tr vAlign=top>
                        <td>2<sup>16</sup>-1</td>
                        <td rowSpan=20>
                        <table border=2>
                            <tbody>
                                <tr>
                                    <td width=64 bgColor=lightblue height=80>&nbsp;</td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                        <td vAlign=top>65,535</td>
                    </tr>
                    <tr>
                        <td vAlign=bottom>0</td>
                    </tr>
                </tbody>
            </table>
            </td>
            <td>
            <table border=0>
                <tbody>
                    <tr>
                        <th colSpan=3>I/O Space</th>
                    </tr>
                    <tr>
                        <th colSpan=3>
                        <hr>
                        </th>
                    </tr>
                    <tr vAlign=top>
                        <td>2<sup>8</sup>-1</td>
                        <td rowSpan=20>
                        <table border=3>
                            <tbody>
                                <tr>
                                    <td width=64 bgColor=lightgreen height=20>&nbsp;</td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                        <td vAlign=top>255</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br>8080微处理器有四种寻址方式：<br>寄存器寻址、寄存器间接寻址、内存直接寻址、立即数寻址<br><br>二。软件架构设计<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设计的目标是使虚拟机有良好的结构关系和扩展性，最好建立一个虚拟机库，方便复用。使用面向对象的思想进行架构设计是很自然的考虑，CPU，寄存器，指令，上下文，内存，中断，定时器，显示屏等自然地映射成软件对象，这些对象相互通信，有机地组合成了虚拟机。8080是实模式运行，因此不需要模拟虚拟内存，MMU，页目录表，缓存等。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 考虑到扩展性，现在是针对英特尔的8080处理器，以后可能需要针对别的处理器，比如摩托罗拉的6500，Zilog的在Z80，或是x86系列，MIPS系列处理器，因此设计成抽象基类CPU、ISA指令集、内存和Context上下文。再用抽象工厂模式，IntelFactory生产Intel虚拟机，MotorolaFactory生产摩托罗拉虚拟机，ZilogFactory生产Zilog虚拟机，这样想玩哪一款游戏时就使用相应的工厂生产出对应的虚拟机来运行游戏，这种设计也很好低符合了开闭原则，对修改关闭，对扩展开放，假如以后想模拟PSP游戏，可以方便地扩展，这样岂不爽哉！<br><br>抽象工厂的UML类图如下：<br><img height=383 alt="" src="http://www.cnitblog.com/images/cnitblog_com/houcy/design.JPG" width=773 border=0><br>
<img src ="http://www.cnitblog.com/houcy/aggbug/67408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/houcy/" target="_blank">挑灯看剑</a> 2010-07-11 00:10 <a href="http://www.cnitblog.com/houcy/archive/2010/07/11/67408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>街机游戏模拟器开发 （1）</title><link>http://www.cnitblog.com/houcy/archive/2010/07/09/67320.html</link><dc:creator>挑灯看剑</dc:creator><author>挑灯看剑</author><pubDate>Thu, 08 Jul 2010 16:33:00 GMT</pubDate><guid>http://www.cnitblog.com/houcy/archive/2010/07/09/67320.html</guid><wfw:comment>http://www.cnitblog.com/houcy/comments/67320.html</wfw:comment><comments>http://www.cnitblog.com/houcy/archive/2010/07/09/67320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/houcy/comments/commentRss/67320.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/houcy/services/trackbacks/67320.html</trackback:ping><description><![CDATA[<p dir=ltr style="FONT-SIZE: 12pt"><br>上小学时玩过电子游戏机，当时很痴迷电子游戏，整个暑假都是和伙伴们一起玩，超级玛丽、街头霸王、双截龙等等好多经典的游戏，童年的记忆中留下最多的就是这些游戏吧，呵呵，贴一张超级玛丽和街头霸王的截图：<br><img height=224 alt="" src="http://www.cnitblog.com/images/cnitblog_com/houcy/mario.jpg" width=256 border=0>&nbsp;<img height=449 alt="" src="http://www.cnitblog.com/images/cnitblog_com/houcy/street.JPG" width=765 border=0><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 想不到20年后我还是喜欢它们，不过现在已经不愿意再去玩了，而是想弄明白游戏是怎么做出来的，毕竟我是计算机和自动化专业出身，在微电子设计行业工作，弄明白这些游戏的制作原理应该不是难事。本文及后续将从技术的角度讲解街机原理，并用软件模拟街机原理，制作一个软件游戏模拟器。<br><br>先来看看维基百科是怎么介绍街机：<br><strong>街机</strong>（Arcade game）是置于公共娱乐场所的经营性专用<a class=mw-redirect title=游戏机 href="http://zh.wikipedia.org/zh-cn/%E6%B8%B8%E6%88%8F%E6%9C%BA"><font color=#002bb8>游戏机</font></a>。也可称为<strong>大型电玩，在街机上运行的游戏叫街机游戏。 经典街机游戏有：<a class=mw-redirect title=拳皇 href="http://zh.wikipedia.org/zh-cn/%E6%8B%B3%E7%9A%87"><font color=#002bb8>拳皇</font></a>（KOF）、<a title=合金弹头 href="http://zh.wikipedia.org/zh-cn/%E5%90%88%E9%87%91%E5%BD%88%E9%A0%AD"><font color=#002bb8>合金弹头</font></a>、<a class=new title=雪人兄弟（尚未撰写） href="http://zh.wikipedia.org/w/index.php?title=%E9%9B%AA%E4%BA%BA%E5%85%84%E5%BC%9F&amp;action=edit&amp;redlink=1"><font color=#ba0000>雪人兄弟</font></a>、<a title=超级魂斗罗 href="http://zh.wikipedia.org/zh-cn/%E8%B6%85%E7%BA%A7%E9%AD%82%E6%96%97%E7%BD%97"><font color=#5a3696>超级魂斗罗</font></a>、<a class=new title=恶魔战士（尚未撰写） href="http://zh.wikipedia.org/w/index.php?title=%E6%81%B6%E9%AD%94%E6%88%98%E5%A3%AB&amp;action=edit&amp;redlink=1"><font color=#ba0000>恶魔战士</font></a> 、<a title=街头霸王 href="http://zh.wikipedia.org/zh-cn/%E5%BF%AB%E6%89%93%E6%97%8B%E9%A2%A8"><font color=#002bb8>街头霸王</font></a>、<a class=new title=怒之铁拳（尚未撰写） href="http://zh.wikipedia.org/w/index.php?title=%E6%80%92%E4%B9%8B%E9%93%81%E6%8B%B3&amp;action=edit&amp;redlink=1"><font color=#ba0000>怒之铁拳</font></a>、<a class=mw-redirect title=双截龙 href="http://zh.wikipedia.org/zh-cn/%E9%9B%99%E6%88%AA%E9%BE%8D"><font color=#002bb8>双截龙</font></a>、<a class=mw-redirect title=雷电 href="http://zh.wikipedia.org/zh-cn/%E9%9B%B7%E7%94%B5"><font color=#002bb8>雷电</font></a>等。</p>
<p dir=ltr style="FONT-SIZE: 12pt"></strong>街机模样大概如下：<br><br><img height=300 alt="" src="http://www.cnitblog.com/images/cnitblog_com/houcy/jieji.jpg" width=300 border=0><br><br><br>以一款经典的《太空入侵者》游戏为例讲解吧，《太空侵略者》（スペースインベーダー，Space Invaders）为一款于1978年在日本由太东公司发行的街机游戏，由西角友宏设计。在美国由Midway Games发行。常简称为《侵略者》，或翻做《宇宙入侵者》。<br>西角友宏设计此游戏时，原本的主角设计为坦克，但限于当时电脑运算速度相当慢，因此坦克移动并不顺畅，才改为太空大战的形式，太空侵略者游戏机是基于Intel公司的8080处理器而设计。<br><br>看看1978年在美国Midway Games发行的海报宣传片吧(估计当时很宣传很火爆)：<br><br><img height=768 alt="" src="http://www.cnitblog.com/images/cnitblog_com/houcy/s.JPG" width=593 border=0><br><br><br>这个是在线玩Space Invaders的网址：<br><a href="http://www.djgallagher.com/games/classics/spaceinvaders/game_flash.php">http://www.djgallagher.com/games/classics/spaceinvaders/game_flash.php</a><br><img height=420 alt="" src="http://www.cnitblog.com/images/cnitblog_com/houcy/spi.JPG" width=376 border=0><br><br>我们的目标是用软件模拟实际的街机，最后完成一个街机模拟器，完成后的样子截图如下所示（背景是C++程序代码）：<br><br><img height=560 alt="" src="http://www.cnitblog.com/images/cnitblog_com/houcy/si.JPG" width=532 border=0><br></p>
开始我们激动人心的街机游戏之旅吧，重温童年的美好回忆。。。。 
<img src ="http://www.cnitblog.com/houcy/aggbug/67320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/houcy/" target="_blank">挑灯看剑</a> 2010-07-09 00:33 <a href="http://www.cnitblog.com/houcy/archive/2010/07/09/67320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>8080 Instruction Set</title><link>http://www.cnitblog.com/houcy/archive/2010/07/08/67282.html</link><dc:creator>挑灯看剑</dc:creator><author>挑灯看剑</author><pubDate>Thu, 08 Jul 2010 08:14:00 GMT</pubDate><guid>http://www.cnitblog.com/houcy/archive/2010/07/08/67282.html</guid><wfw:comment>http://www.cnitblog.com/houcy/comments/67282.html</wfw:comment><comments>http://www.cnitblog.com/houcy/archive/2010/07/08/67282.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/houcy/comments/commentRss/67282.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/houcy/services/trackbacks/67282.html</trackback:ping><description><![CDATA[<br>
8080 Instruction Set<br>
&nbsp;&nbsp; &nbsp;<br>
Add Instructions&nbsp;&nbsp;&nbsp; &nbsp;Add Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * 80&nbsp; ADD&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add register B<br>
&nbsp;&nbsp;&nbsp; * 81&nbsp; ADD&nbsp;&nbsp; C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add register C<br>
&nbsp;&nbsp;&nbsp; * 82&nbsp; ADD&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add register D<br>
&nbsp;&nbsp;&nbsp; * 83&nbsp; ADD&nbsp;&nbsp; E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add register E<br>
&nbsp;&nbsp;&nbsp; * 84&nbsp; ADD&nbsp;&nbsp; H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add register H<br>
&nbsp;&nbsp;&nbsp; * 85&nbsp; ADD&nbsp;&nbsp; L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add register L<br>
&nbsp;&nbsp;&nbsp; * 86&nbsp; ADD&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add memory<br>
&nbsp;&nbsp;&nbsp; * 87&nbsp; ADD&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add register A<br>
&nbsp;&nbsp;&nbsp; * 88&nbsp; ADC&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add register B with carry<br>
&nbsp;&nbsp;&nbsp; * 89&nbsp; ADC&nbsp;&nbsp; C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add register C with carry<br>
&nbsp;&nbsp;&nbsp; * 8A&nbsp; ADC&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add register D with carry<br>
&nbsp;&nbsp;&nbsp; * 8B&nbsp; ADC&nbsp;&nbsp; E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add register E with carry<br>
&nbsp;&nbsp;&nbsp; * 8C&nbsp; ADC&nbsp;&nbsp; H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add register H with carry<br>
&nbsp;&nbsp;&nbsp; * 8D&nbsp; ADC&nbsp;&nbsp; L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add register L with carry<br>
&nbsp;&nbsp;&nbsp; * 8E&nbsp; ADC&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add memory with carry<br>
&nbsp;&nbsp;&nbsp; * 8F&nbsp; ADC&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add register A with carry<br>
&nbsp;&nbsp;&nbsp; * C6&nbsp; ADI&nbsp;&nbsp; Imm&nbsp;&nbsp;&nbsp; Add immediate<br>
&nbsp;&nbsp;&nbsp; * CE&nbsp; ACI&nbsp;&nbsp; Imm&nbsp;&nbsp;&nbsp; Add immediate with carry<br>
&nbsp;&nbsp;&nbsp; * 19&nbsp; DAD&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add register pair DE to HL<br>
&nbsp;&nbsp;&nbsp; * 29&nbsp; DAD&nbsp;&nbsp; H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add register pair HL to HL<br>
&nbsp;&nbsp;&nbsp; * 39&nbsp; DAD&nbsp;&nbsp; SP&nbsp;&nbsp;&nbsp;&nbsp; Add register SP to HL<br>
&nbsp;&nbsp;&nbsp; * 09&nbsp; DAD&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add register pair BC to HL<br>
<br>
And Instructions&nbsp;&nbsp;&nbsp; &nbsp;And Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * A0&nbsp; ANA&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; And register B<br>
&nbsp;&nbsp;&nbsp; * A1&nbsp; ANA&nbsp;&nbsp; C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; And register C<br>
&nbsp;&nbsp;&nbsp; * A2&nbsp; ANA&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; And register D<br>
&nbsp;&nbsp;&nbsp; * A3&nbsp; ANA&nbsp;&nbsp; E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; And register E<br>
&nbsp;&nbsp;&nbsp; * A4&nbsp; ANA&nbsp;&nbsp; H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; And register H<br>
&nbsp;&nbsp;&nbsp; * A5&nbsp; ANA&nbsp;&nbsp; L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; And register L<br>
&nbsp;&nbsp;&nbsp; * A6&nbsp; ANA&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; And memory<br>
&nbsp;&nbsp;&nbsp; * A7&nbsp; ANA&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; And register A<br>
&nbsp;&nbsp;&nbsp; * E6&nbsp; ANI&nbsp;&nbsp; Imm&nbsp;&nbsp;&nbsp; And immediate<br>
<br>
Call Instructions&nbsp;&nbsp;&nbsp; &nbsp;Call Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * C4&nbsp; CNZ&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Subroutine Call (Not Zero Flag)<br>
&nbsp;&nbsp;&nbsp; * CC&nbsp; CZ&nbsp;&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Subroutine Call (Zero Flag)<br>
&nbsp;&nbsp;&nbsp; * CD&nbsp; CALL&nbsp; Addr&nbsp;&nbsp; Subroutine Call<br>
&nbsp;&nbsp;&nbsp; * D4&nbsp; CNC&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Subroutine Call (Not Carry Flag)<br>
&nbsp;&nbsp;&nbsp; * DC&nbsp; CC&nbsp;&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Subroutine Call (Carry Flag)<br>
&nbsp;&nbsp;&nbsp; * E4&nbsp; CPO&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Subroutine Call (Parity Odd, Not Parity Flag)<br>
&nbsp;&nbsp;&nbsp; * EC&nbsp; CPE&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Subroutine Call (Parity Even, Parity Flag)<br>
&nbsp;&nbsp;&nbsp; * F4&nbsp; CP&nbsp;&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Subroutine Call (Positive, Not Sign Flag)<br>
&nbsp;&nbsp;&nbsp; * FC&nbsp; CM&nbsp;&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Subroutine Call (Minus, Sign Flag)<br>
<br>
Compare Instructions&nbsp;&nbsp;&nbsp; &nbsp;Compare Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * B8&nbsp; CMP&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Compare register B<br>
&nbsp;&nbsp;&nbsp; * B9&nbsp; CMP&nbsp;&nbsp; C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Compare register C<br>
&nbsp;&nbsp;&nbsp; * BA&nbsp; CMP&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Compare register D<br>
&nbsp;&nbsp;&nbsp; * BB&nbsp; CMP&nbsp;&nbsp; E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Compare register E<br>
&nbsp;&nbsp;&nbsp; * BC&nbsp; CMP&nbsp;&nbsp; H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Compare register H<br>
&nbsp;&nbsp;&nbsp; * BD&nbsp; CMP&nbsp;&nbsp; L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Compare register L<br>
&nbsp;&nbsp;&nbsp; * BE&nbsp; CMP&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Compare memory<br>
&nbsp;&nbsp;&nbsp; * BF&nbsp; CMP&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Compare register A<br>
&nbsp;&nbsp;&nbsp; * FE&nbsp; CPI&nbsp;&nbsp; Imm&nbsp;&nbsp;&nbsp; Compare immediate<br>
<br>
Decrement Instructions&nbsp;&nbsp;&nbsp; &nbsp;Decrement Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * 0B&nbsp; DCX&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Decrement register pair BC to HL<br>
&nbsp;&nbsp;&nbsp; * 0C&nbsp; INR&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Increment register C<br>
&nbsp;&nbsp;&nbsp; * 0D&nbsp; DCR&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Decrement register C<br>
&nbsp;&nbsp;&nbsp; * 13&nbsp; INX&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Increment register pair DE<br>
&nbsp;&nbsp;&nbsp; * 14&nbsp; INR&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Increment register D<br>
&nbsp;&nbsp;&nbsp; * 15&nbsp; DCR&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Decrement register D<br>
&nbsp;&nbsp;&nbsp; * 1B&nbsp; DCX&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Decrement register pair DE to HL<br>
&nbsp;&nbsp;&nbsp; * 1C&nbsp; INR&nbsp;&nbsp; E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Increment register E<br>
&nbsp;&nbsp;&nbsp; * 1D&nbsp; DCR&nbsp;&nbsp; E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Decrement register E<br>
&nbsp;&nbsp;&nbsp; * 03&nbsp; INX&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Increment register pair BC<br>
&nbsp;&nbsp;&nbsp; * 23&nbsp; INX&nbsp;&nbsp; H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Increment register pair HL<br>
&nbsp;&nbsp;&nbsp; * 24&nbsp; INR&nbsp;&nbsp; H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Increment register H<br>
&nbsp;&nbsp;&nbsp; * 25&nbsp; DCR&nbsp;&nbsp; H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Decrement register H<br>
&nbsp;&nbsp;&nbsp; * 04&nbsp; INR&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Increment register B<br>
&nbsp;&nbsp;&nbsp; * 2B&nbsp; DCX&nbsp;&nbsp; H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Decrement register pair HL to HL<br>
&nbsp;&nbsp;&nbsp; * 2C&nbsp; INR&nbsp;&nbsp; L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Increment register L<br>
&nbsp;&nbsp;&nbsp; * 2D&nbsp; DCR&nbsp;&nbsp; L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Decrement register L<br>
&nbsp;&nbsp;&nbsp; * 05&nbsp; DCR&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Decrement register B<br>
&nbsp;&nbsp;&nbsp; * 33&nbsp; INX&nbsp;&nbsp; SP&nbsp;&nbsp;&nbsp;&nbsp; Increment register SP<br>
&nbsp;&nbsp;&nbsp; * 34&nbsp; INR&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Increment memory (HL)<br>
&nbsp;&nbsp;&nbsp; * 35&nbsp; DCR&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Decrement memory (HL)<br>
&nbsp;&nbsp;&nbsp; * 3B&nbsp; DCX&nbsp;&nbsp; SP&nbsp;&nbsp;&nbsp;&nbsp; Decrement register SP to HL<br>
&nbsp;&nbsp;&nbsp; * 3C&nbsp; INR&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Increment register A<br>
&nbsp;&nbsp;&nbsp; * 3D&nbsp; DCR&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Decrement register A<br>
<br>
Exclusive Or Instructions&nbsp;&nbsp;&nbsp; &nbsp;Exclusive Or Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * A8&nbsp; XRA&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exclusive Or register B<br>
&nbsp;&nbsp;&nbsp; * A9&nbsp; XRA&nbsp;&nbsp; C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exclusive Or register C<br>
&nbsp;&nbsp;&nbsp; * AA&nbsp; XRA&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exclusive Or register D<br>
&nbsp;&nbsp;&nbsp; * AB&nbsp; XRA&nbsp;&nbsp; E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exclusive Or register E<br>
&nbsp;&nbsp;&nbsp; * AC&nbsp; XRA&nbsp;&nbsp; H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exclusive Or register H<br>
&nbsp;&nbsp;&nbsp; * AD&nbsp; XRA&nbsp;&nbsp; L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exclusive Or register L<br>
&nbsp;&nbsp;&nbsp; * AE&nbsp; XRA&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exclusive Or memory<br>
&nbsp;&nbsp;&nbsp; * AF&nbsp; XRA&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exclusive Or register A<br>
&nbsp;&nbsp;&nbsp; * EE&nbsp; XRI&nbsp;&nbsp; Imm&nbsp;&nbsp;&nbsp; Exclusive Or immediate<br>
<br>
Interrupt Instructions&nbsp;&nbsp;&nbsp; &nbsp;Interrupt Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * F3&nbsp; DI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Disable Interrupt<br>
&nbsp;&nbsp;&nbsp; * FB&nbsp; EI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable Interrupt<br>
<br>
Jump Instructions&nbsp;&nbsp;&nbsp; &nbsp;Jump Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * C2&nbsp; JNZ&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Jump (Not Zero Flag)<br>
&nbsp;&nbsp;&nbsp; * C3&nbsp; JMP&nbsp;&nbsp; Addr&nbsp;&nbsp; Jump to Direct Address<br>
&nbsp;&nbsp;&nbsp; * CA&nbsp; JZ&nbsp;&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Jump (Zero Flag)<br>
&nbsp;&nbsp;&nbsp; * D2&nbsp; JNC&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Jump (Not Carry Flag)<br>
&nbsp;&nbsp;&nbsp; * DA&nbsp; JC&nbsp;&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Jump (Carry Flag)<br>
&nbsp;&nbsp;&nbsp; * E2&nbsp; JPO&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Jump (Parity Odd, Not Parity Flag)<br>
&nbsp;&nbsp;&nbsp; * E9&nbsp; PCHL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Jump Indirect HL<br>
&nbsp;&nbsp;&nbsp; * EA&nbsp; JPE&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Jump (Parity Even, Parity Flag)<br>
&nbsp;&nbsp;&nbsp; * F2&nbsp; JP&nbsp;&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Jump (Positive, Not Sign Flag)<br>
&nbsp;&nbsp;&nbsp; * FA&nbsp; JM&nbsp;&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Jump (Minus, Sign Flag)<br>
<br>
Load Instructions&nbsp;&nbsp;&nbsp; &nbsp;Load Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * 01&nbsp; LXI&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Load Immediate register pair BC<br>
&nbsp;&nbsp;&nbsp; * 0A&nbsp; LDAX&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; * 0E&nbsp; MVI&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Move Immediate register C<br>
&nbsp;&nbsp;&nbsp; * 11&nbsp; LXI&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Load Immediate register pair DE<br>
&nbsp;&nbsp;&nbsp; * 16&nbsp; MVI&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Move Immediate register D<br>
&nbsp;&nbsp;&nbsp; * 1A&nbsp; LDAX&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; * 1E&nbsp; MVI&nbsp;&nbsp; E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Move Immediate register E<br>
&nbsp;&nbsp;&nbsp; * 21&nbsp; LXI&nbsp;&nbsp; H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Load Immediate register pair HL<br>
&nbsp;&nbsp;&nbsp; * 26&nbsp; MVI&nbsp;&nbsp; H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Move Immediate register H<br>
&nbsp;&nbsp;&nbsp; * 2A&nbsp; LHLD&nbsp; Addr&nbsp; <br>
&nbsp;&nbsp;&nbsp; * 2E&nbsp; MVI&nbsp;&nbsp; L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Move Immediate register L<br>
&nbsp;&nbsp;&nbsp; * 31&nbsp; LXI&nbsp;&nbsp; SP&nbsp;&nbsp;&nbsp;&nbsp; Load Immediate register SP<br>
&nbsp;&nbsp;&nbsp; * 3A&nbsp; LDA&nbsp;&nbsp; Addr&nbsp;&nbsp; Load Direct<br>
&nbsp;&nbsp;&nbsp; * 06&nbsp; MVI&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Move Immediate register B<br>
&nbsp;&nbsp;&nbsp; * 3E&nbsp; MVI&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Move Immediate register A<br>
<br>
Move Instructions&nbsp;&nbsp;&nbsp; &nbsp;Move Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * F9&nbsp; SPHL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
<br>
Or Instructions&nbsp;&nbsp;&nbsp; &nbsp;Or Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * B0&nbsp; ORA&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Or register B<br>
&nbsp;&nbsp;&nbsp; * B1&nbsp; ORA&nbsp;&nbsp; C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Or register C<br>
&nbsp;&nbsp;&nbsp; * B2&nbsp; ORA&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Or register D<br>
&nbsp;&nbsp;&nbsp; * B3&nbsp; ORA&nbsp;&nbsp; E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Or register E<br>
&nbsp;&nbsp;&nbsp; * B4&nbsp; ORA&nbsp;&nbsp; H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Or register H<br>
&nbsp;&nbsp;&nbsp; * B5&nbsp; ORA&nbsp;&nbsp; L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Or register L<br>
&nbsp;&nbsp;&nbsp; * B6&nbsp; ORA&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Or memory<br>
&nbsp;&nbsp;&nbsp; * B7&nbsp; ORA&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Or register A<br>
&nbsp;&nbsp;&nbsp; * F6&nbsp; ORI&nbsp;&nbsp; Imm&nbsp;&nbsp;&nbsp; Or immediate<br>
<br>
Other Instructions&nbsp;&nbsp;&nbsp; &nbsp;Other Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * 00&nbsp; NOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; No Operation<br>
&nbsp;&nbsp;&nbsp; * 76&nbsp; HLT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Halt<br>
&nbsp;&nbsp;&nbsp; * D3&nbsp; OUT&nbsp;&nbsp; Port&nbsp;&nbsp; Output from Port Direct<br>
&nbsp;&nbsp;&nbsp; * DB&nbsp; IN&nbsp;&nbsp;&nbsp; Port&nbsp;&nbsp; Input from Port Direct<br>
&nbsp;&nbsp;&nbsp; * E3&nbsp; XTHL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; * EB&nbsp; XCHG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; * 27&nbsp; DAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Decimal Adjust<br>
&nbsp;&nbsp;&nbsp; * 2F&nbsp; CMA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Complement Accumulator<br>
&nbsp;&nbsp;&nbsp; * 37&nbsp; STC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set Carry Flag<br>
&nbsp;&nbsp;&nbsp; * 3F&nbsp; CMC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Complement Carry Flag<br>
<br>
Reset Instructions&nbsp;&nbsp;&nbsp; &nbsp;Reset Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * C7&nbsp; RST&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reset 0<br>
&nbsp;&nbsp;&nbsp; * CF&nbsp; RST&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reset 4<br>
&nbsp;&nbsp;&nbsp; * D7&nbsp; RST&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reset 1<br>
&nbsp;&nbsp;&nbsp; * DF&nbsp; RST&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reset 5<br>
&nbsp;&nbsp;&nbsp; * E7&nbsp; RST&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reset 2<br>
&nbsp;&nbsp;&nbsp; * EF&nbsp; RST&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reset 6<br>
&nbsp;&nbsp;&nbsp; * F7&nbsp; RST&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reset 3<br>
&nbsp;&nbsp;&nbsp; * FF&nbsp; RST&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reset 7<br>
<br>
Return Instructions&nbsp;&nbsp;&nbsp; &nbsp;Return Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * C0&nbsp; RNZ&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Subroutine Return (Not Zero Flag)<br>
&nbsp;&nbsp;&nbsp; * C8&nbsp; RZ&nbsp;&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Subroutine Return (Zero Flag)<br>
&nbsp;&nbsp;&nbsp; * C9&nbsp; RET&nbsp;&nbsp; Addr&nbsp;&nbsp; Subroutine Return<br>
&nbsp;&nbsp;&nbsp; * D0&nbsp; RNC&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Subroutine Return (Not Carry Flag)<br>
&nbsp;&nbsp;&nbsp; * D8&nbsp; RC&nbsp;&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Subroutine Return (Carry Flag)<br>
&nbsp;&nbsp;&nbsp; * E0&nbsp; RPO&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Subroutine Return (Parity Odd, Not Parity Flag)<br>
&nbsp;&nbsp;&nbsp; * E8&nbsp; RPE&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Subroutine Return (Parity Even, Parity Flag)<br>
&nbsp;&nbsp;&nbsp; * F0&nbsp; RP&nbsp;&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Subroutine Return (Positive, Not Sign Flag)<br>
&nbsp;&nbsp;&nbsp; * F8&nbsp; RM&nbsp;&nbsp;&nbsp; Addr&nbsp;&nbsp; Conditional Subroutine Return (Minus, Sign Flag)<br>
<br>
Rotate Instructions&nbsp;&nbsp;&nbsp; &nbsp;Rotate Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * 0F&nbsp; RRC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rotate Right<br>
&nbsp;&nbsp;&nbsp; * 17&nbsp; RAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rotate Left with Carry<br>
&nbsp;&nbsp;&nbsp; * 1F&nbsp; RAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rotate Right with Carry<br>
&nbsp;&nbsp;&nbsp; * 07&nbsp; RLC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rotate Left<br>
<br>
Stack Instructions&nbsp;&nbsp;&nbsp; &nbsp;Stack Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * C1&nbsp; POP&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pop register pair BC<br>
&nbsp;&nbsp;&nbsp; * C5&nbsp; PUSH&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Push register pair BC<br>
&nbsp;&nbsp;&nbsp; * D1&nbsp; POP&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pop register pair DE<br>
&nbsp;&nbsp;&nbsp; * D5&nbsp; PUSH&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Push register pair DE<br>
&nbsp;&nbsp;&nbsp; * E1&nbsp; POP&nbsp;&nbsp; H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pop register pair HL<br>
&nbsp;&nbsp;&nbsp; * E5&nbsp; PUSH&nbsp; H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Push register pair HL<br>
&nbsp;&nbsp;&nbsp; * F1&nbsp; POP&nbsp;&nbsp; SP&nbsp;&nbsp;&nbsp;&nbsp; Pop register pair PSW &amp; A<br>
&nbsp;&nbsp;&nbsp; * F5&nbsp; PUSH&nbsp; SP&nbsp;&nbsp;&nbsp;&nbsp; Push register pair PSW &amp; A<br>
<br>
Store Instructions&nbsp;&nbsp;&nbsp; &nbsp;Store Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * 70&nbsp; MOV&nbsp;&nbsp; M,B&nbsp;&nbsp;&nbsp; Store register B<br>
&nbsp;&nbsp;&nbsp; * 71&nbsp; MOV&nbsp;&nbsp; M,C&nbsp;&nbsp;&nbsp; Store register C<br>
&nbsp;&nbsp;&nbsp; * 72&nbsp; MOV&nbsp;&nbsp; M,D&nbsp;&nbsp;&nbsp; Store register D<br>
&nbsp;&nbsp;&nbsp; * 73&nbsp; MOV&nbsp;&nbsp; M,E&nbsp;&nbsp;&nbsp; Store register E<br>
&nbsp;&nbsp;&nbsp; * 74&nbsp; MOV&nbsp;&nbsp; M,H&nbsp;&nbsp;&nbsp; Store register H<br>
&nbsp;&nbsp;&nbsp; * 75&nbsp; MOV&nbsp;&nbsp; M,L&nbsp;&nbsp;&nbsp; Store register L<br>
&nbsp;&nbsp;&nbsp; * 77&nbsp; MOV&nbsp;&nbsp; M,A&nbsp;&nbsp;&nbsp; Store register A<br>
&nbsp;&nbsp;&nbsp; * 12&nbsp; STAX&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; * 02&nbsp; STAX&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; * 22&nbsp; SHLD&nbsp; Addr&nbsp; <br>
&nbsp;&nbsp;&nbsp; * 36&nbsp; MVI&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Move Immediate memory (HL)<br>
&nbsp;&nbsp;&nbsp; * 3A&nbsp; LDA&nbsp;&nbsp; Addr&nbsp;&nbsp; Load Direct<br>
<br>
Store Instructions&nbsp;&nbsp;&nbsp; &nbsp;Store Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * 70&nbsp; MOV&nbsp;&nbsp; M,B&nbsp;&nbsp;&nbsp; Store register B<br>
&nbsp;&nbsp;&nbsp; * 71&nbsp; MOV&nbsp;&nbsp; M,C&nbsp;&nbsp;&nbsp; Store register C<br>
&nbsp;&nbsp;&nbsp; * 72&nbsp; MOV&nbsp;&nbsp; M,D&nbsp;&nbsp;&nbsp; Store register D<br>
&nbsp;&nbsp;&nbsp; * 73&nbsp; MOV&nbsp;&nbsp; M,E&nbsp;&nbsp;&nbsp; Store register E<br>
&nbsp;&nbsp;&nbsp; * 74&nbsp; MOV&nbsp;&nbsp; M,H&nbsp;&nbsp;&nbsp; Store register H<br>
&nbsp;&nbsp;&nbsp; * 75&nbsp; MOV&nbsp;&nbsp; M,L&nbsp;&nbsp;&nbsp; Store register L<br>
&nbsp;&nbsp;&nbsp; * 77&nbsp; MOV&nbsp;&nbsp; M,A&nbsp;&nbsp;&nbsp; Store register A<br>
&nbsp;&nbsp;&nbsp; * 12&nbsp; STAX&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; * 02&nbsp; STAX&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; * 22&nbsp; SHLD&nbsp; Addr&nbsp; <br>
&nbsp;&nbsp;&nbsp; * 36&nbsp; MVI&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Move Immediate memory (HL)<br>
&nbsp;&nbsp;&nbsp; * 3A&nbsp; LDA&nbsp;&nbsp; Addr&nbsp;&nbsp; Load Direct<br>
<br>
Subtraction Instructions&nbsp;&nbsp;&nbsp; &nbsp;Subtraction Instructions<br>
<br>
&nbsp;&nbsp;&nbsp; * 90&nbsp; SUB&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subtract register B<br>
&nbsp;&nbsp;&nbsp; * 91&nbsp; SUB&nbsp;&nbsp; C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subtract register C<br>
&nbsp;&nbsp;&nbsp; * 92&nbsp; SUB&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subtract register D<br>
&nbsp;&nbsp;&nbsp; * 93&nbsp; SUB&nbsp;&nbsp; E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subtract register E<br>
&nbsp;&nbsp;&nbsp; * 94&nbsp; SUB&nbsp;&nbsp; H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subtract register H<br>
&nbsp;&nbsp;&nbsp; * 95&nbsp; SUB&nbsp;&nbsp; L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subtract register L<br>
&nbsp;&nbsp;&nbsp; * 96&nbsp; SUB&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subtract memory<br>
&nbsp;&nbsp;&nbsp; * 97&nbsp; SUB&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subtract register A<br>
&nbsp;&nbsp;&nbsp; * 98&nbsp; SBB&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subtract register B with borrow<br>
&nbsp;&nbsp;&nbsp; * 99&nbsp; SBB&nbsp;&nbsp; C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subtract register C with borrow<br>
&nbsp;&nbsp;&nbsp; * 9A&nbsp; SBB&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subtract register D with borrow<br>
&nbsp;&nbsp;&nbsp; * 9B&nbsp; SBB&nbsp;&nbsp; E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subtract register E with borrow<br>
&nbsp;&nbsp;&nbsp; * 9C&nbsp; SBB&nbsp;&nbsp; H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subtract register H with borrow<br>
&nbsp;&nbsp;&nbsp; * 9D&nbsp; SBB&nbsp;&nbsp; L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subtract register L with borrow<br>
&nbsp;&nbsp;&nbsp; * 9E&nbsp; SBB&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subtract memory with borrow<br>
&nbsp;&nbsp;&nbsp; * 9F&nbsp; SBB&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subtract register A with borrow<br>
&nbsp;&nbsp;&nbsp; * D6&nbsp; SUI&nbsp;&nbsp; Imm&nbsp;&nbsp;&nbsp; Subtract immediate<br>
&nbsp;&nbsp;&nbsp; * DE&nbsp; SBI&nbsp;&nbsp; Imm&nbsp;&nbsp;&nbsp; Subtract immediate with borrow<br>
&nbsp;<br><img src ="http://www.cnitblog.com/houcy/aggbug/67282.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/houcy/" target="_blank">挑灯看剑</a> 2010-07-08 16:14 <a href="http://www.cnitblog.com/houcy/archive/2010/07/08/67282.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Intel 8080 microprocessor architecture</title><link>http://www.cnitblog.com/houcy/archive/2010/07/08/67278.html</link><dc:creator>挑灯看剑</dc:creator><author>挑灯看剑</author><pubDate>Thu, 08 Jul 2010 07:55:00 GMT</pubDate><guid>http://www.cnitblog.com/houcy/archive/2010/07/08/67278.html</guid><wfw:comment>http://www.cnitblog.com/houcy/comments/67278.html</wfw:comment><comments>http://www.cnitblog.com/houcy/archive/2010/07/08/67278.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/houcy/comments/commentRss/67278.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/houcy/services/trackbacks/67278.html</trackback:ping><description><![CDATA[<div class="dh_div">Memory</div>
<p>
Program, data and stack memories occupy the same memory space.
The total addressable memory size is 64 KB.
</p>
<p>
<strong>Program memory</strong> - program can be located anywhere in memory.
Jump, branch and call instructions use 16-bit addresses, i.e. they can be
used to jump/branch anywhere within 64 KB. All jump/branch instructions use
absolute addressing.
</p>
<p>
<strong>Data memory</strong> - the processor always uses 16-bit addresses so that data can be
placed anywhere.
</p>
<p>
<strong>Stack memory</strong> is limited only by the size of memory. Stack grows downward.
</p>
<p>
First 64 bytes in a zero memory page should be reserved for vectors used
by RST instructions.</p>
<div class="dh_div">Interrupts</div>
<p>
The processor supports maskable interrupts.
When an interrupt occurs the processor fetches from the bus one instruction,
usually one of these instructions:
</p>
<ul>
    <li>One of the 8 RST instructions (RST0 - RST7).
    The processor saves current program counter into stack and branches to
    memory location N * 8 (where N is a 3-bit number from 0 to 7 supplied with the RST instruction).
    </li>
    <li>CALL instruction (3 byte instruction). The processor calls the subroutine,
    address of which is specified in the second and third bytes of the instruction.
    </li>
</ul>
<p>
The interrupt can be enabled or disabled using EI and DI instructions.</p>
<div class="dh_div">I/O ports</div>
<p>
256 Input ports<br>
256 Output ports</p>
<div class="dh_div">Registers</div>
<p>
<strong>Accumulator</strong> or A register is an 8-bit register used for arithmetic, logic, I/O and
load/store operations.
</p>
<p>
<strong>Flag</strong> is an 8-bit register containing 5 1-bit flags:
</p>
<ul>
    <li>Sign - set if the most significant bit of the result is set.
    </li>
    <li>Zero - set if the result is zero.
    </li>
    <li>Auxiliary carry - set if there was a carry out from bit 3 to bit 4 of the result.
    </li>
    <li>Parity - set if the parity (the number of set bits in the result) is even.
    </li>
    <li>Carry - set if there was a carry during addition, or borrow during subtraction/comparison.
    </li>
</ul>
<p>
<strong>General registers</strong>:
</p>
<ul>
    <li>8-bit B and 8-bit C registers can be used as one 16-bit BC register pair.
    When used as a pair the C register contains low-order byte.
    Some instructions may use BC register as a data pointer.
    </li>
    <li>8-bit D and 8-bit E registers can be used as one 16-bit DE register pair.
    When used as a pair the E register contains low-order byte.
    Some instructions may use DE register as a data pointer.
    </li>
    <li>8-bit H and 8-bit L registers can be used as one 16-bit HL register pair.
    When used as a pair the L register contains low-order byte.
    HL register usually contains a data pointer used to reference memory addresses.
    </li>
</ul>
<p>
<strong>Stack pointer</strong> is a 16 bit register. This register is always incremented/decremented
by 2.
</p>
<p>
<strong>Program counter</strong> is a 16-bit register.</p>
<div class="dh_div">Instruction Set</div>
<p>
</p>
<p>
8080 instruction set consists of the following instructions:
</p>
<p>
</p>
<ul>
    <li>Data moving instructions.
    </li>
    <li>Arithmetic - add, subtract, increment and decrement.
    </li>
    <li>Logic - AND, OR, XOR and rotate.
    </li>
    <li>Control transfer - conditional, unconditional, call subroutine,
    return from subroutine and restarts.
    </li>
    <li>Input/Output instructions.
    </li>
    <li>Other - setting/clearing flag bits, enabling/disabling interrupts, stack operations, etc.
    </li>
</ul>
<div class="dh_div">Addressing modes</div>
<strong>Register</strong> - references the data in a register or in a register pair.<br>
<strong>Register indirect</strong> - instruction specifies register pair containing address,
where the data is located.<br>
<strong>Direct</strong>.<br>
<strong>Immediate</strong> - 8 or 16-bit data.
<br>
<br>
<table>
    <tbody>
        <tr valign="bottom">
            <td>
            <table>
                <tbody>
                    <tr>
                        <th colspan="4">8080 Register Set</th>
                        <td>&nbsp;</td>
                    </tr>
                    <tr>
                        <td colspan="4"><hr></td>
                    </tr>
                    <tr>
                        <td>&nbsp;</td>
                        <th align="center">8 Bit<br>"General" Registers</th>
                        <td>&nbsp;</td>
                    </tr>
                    <tr>
                        <th>B</th>
                        <th>
                        <table border="1" cellspacing="1">
                            <tbody>
                                <tr>
                                    <th width="64">&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th>0</th>
                        <th align="left"><br>
                        </th>
                    </tr>
                    <tr>
                        <th>C</th>
                        <th>
                        <table border="1" cellspacing="1">
                            <tbody>
                                <tr>
                                    <th width="64">&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th>1</th>
                        <th align="left"><br>
                        </th>
                    </tr>
                    <tr>
                        <th>D</th>
                        <th>
                        <table border="1" cellspacing="1">
                            <tbody>
                                <tr>
                                    <th width="64">&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th>2</th>
                        <th align="left"><br>
                        </th>
                    </tr>
                    <tr>
                        <th>E</th>
                        <th>
                        <table border="1" cellspacing="1">
                            <tbody>
                                <tr>
                                    <th width="64">&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th>3</th>
                        <th align="left"><br>
                        </th>
                    </tr>
                    <tr>
                        <th>H</th>
                        <th>
                        <table border="1" cellspacing="1">
                            <tbody>
                                <tr>
                                    <th width="64">&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th>4</th>
                        <th align="left">High Byte</th>
                    </tr>
                    <tr>
                        <th>L</th>
                        <th>
                        <table border="1" cellspacing="1">
                            <tbody>
                                <tr>
                                    <th width="64">&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th>5</th>
                        <th align="left">Low Byte</th>
                    </tr>
                    <tr>
                        <th>A</th>
                        <th>
                        <table border="1" cellspacing="1">
                            <tbody>
                                <tr>
                                    <th width="64">&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th>7</th>
                        <th align="left">Accumulator</th>
                    </tr>
                    <tr>
                        <td>&nbsp;</td>
                        <td align="center">Program Registers</td>
                        <td>&nbsp;</td>
                    </tr>
                    <tr>
                        <th>SP</th>
                        <th>
                        <table border="1" cellspacing="1">
                            <tbody>
                                <tr>
                                    <th width="128">&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th><br>
                        </th>
                        <th align="left">Stack Pointer</th>
                    </tr>
                    <tr>
                        <th>PC</th>
                        <th>
                        <table border="1" cellspacing="1">
                            <tbody>
                                <tr>
                                    <th width="128">&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th><br>
                        </th>
                        <th align="left">Program Counter</th>
                    </tr>
                    <tr>
                        <th>PSW</th>
                        <th>
                        <table border="1" cellspacing="1">
                            <tbody>
                                <tr>
                                    <th width="64">&nbsp;</th>
                                </tr>
                            </tbody>
                        </table>
                        </th>
                        <th><br>
                        </th>
                        <th align="left">Program Status Word</th>
                    </tr>
                </tbody>
            </table>
            </td>
            <td>
            <table border="0">
                <tbody>
                    <tr>
                        <th colspan="3">Memory Space</th>
                    </tr>
                    <tr>
                        <th colspan="3"><hr></th>
                    </tr>
                    <tr valign="top">
                        <td>2<sup>16</sup>-1</td>
                        <td rowspan="20">
                        <table border="2">
                            <tbody>
                                <tr>
                                    <td bgcolor="LIGHTBLUE" height="80" width="64">&nbsp;</td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                        <td valign="top">65,535</td>
                    </tr>
                    <tr>
                        <td valign="bottom">0</td>
                    </tr>
                </tbody>
            </table>
            </td>
            <td>
            <table border="0">
                <tbody>
                    <tr>
                        <th colspan="3">I/O Space</th>
                    </tr>
                    <tr>
                        <th colspan="3"><hr></th>
                    </tr>
                    <tr valign="top">
                        <td>2<sup>8</sup>-1</td>
                        <td rowspan="20">
                        <table border="3">
                            <tbody>
                                <tr>
                                    <td bgcolor="LIGHTGREEN" height="20" width="64">&nbsp;</td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                        <td valign="top">255</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp; <br><br><img src ="http://www.cnitblog.com/houcy/aggbug/67278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/houcy/" target="_blank">挑灯看剑</a> 2010-07-08 15:55 <a href="http://www.cnitblog.com/houcy/archive/2010/07/08/67278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> KH系统开发手记(1)</title><link>http://www.cnitblog.com/houcy/archive/2010/07/04/67170.html</link><dc:creator>挑灯看剑</dc:creator><author>挑灯看剑</author><pubDate>Sun, 04 Jul 2010 04:26:00 GMT</pubDate><guid>http://www.cnitblog.com/houcy/archive/2010/07/04/67170.html</guid><wfw:comment>http://www.cnitblog.com/houcy/comments/67170.html</wfw:comment><comments>http://www.cnitblog.com/houcy/archive/2010/07/04/67170.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/houcy/comments/commentRss/67170.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/houcy/services/trackbacks/67170.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;出于个人兴趣想自己开发一套系统软件，一来可以对系统软件的实现有更清楚的认识，二来可以
增强自己的技术水平。完全是利用闲暇时间来做，所以比较慢一些，但是如果坚持下来了会有很大收获。系统的开发是一项艰巨的任务，希望自己能坚持下来！<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; KH系统开发包括CPU芯片设计、指令集架构、汇编器开发、高级语言设计、编译器开发、虚拟机开发。系统的开发先从指令集入手，向下是芯片设计，向上是汇编语言、编译器等开发。<br>
<p style="font-size: 12pt;">
<table align="center">
    <tbody>
        <tr>
            <td style="font-size: 12pt;">
            <p style="font-size: 12pt;" align="center">高级语言、编译器</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="font-size: 12pt;">
<table align="center">
    <tbody>
        <tr>
            <td style="font-size: 12pt;">
            <p style="font-size: 12pt;" align="center">汇编器</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="font-size: 12pt;">
<table align="center">
    <tbody>
        <tr>
            <td style="font-size: 12pt;">
            <p style="font-size: 12pt;" align="center">汇编指令集、机器指令集</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="font-size: 12pt;">
<table align="center">
    <tbody>
        <tr>
            <td style="font-size: 12pt;">
            <p style="font-size: 12pt;" align="center">CPU</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="font-size: 12pt;">1.CPU芯片设计</p>
<p style="font-size: 12pt;">&nbsp;使用VHDL描述硬件连接和逻辑关系，使用Cadence公司的Virtuoso软件进行仿真综合得到CPU core的电路图。<br><br></p>
<p style="font-size: 12pt;">2.指令集架构</p>
<p style="font-size: 12pt;">&nbsp; 指令集的设计和CPU芯片设计密不可分，初步设计为RISC架构，指令长度固定，32位字长，32个通用寄存器，实现常用的指令集即可。<br><br></p>
<p style="font-size: 12pt;">3.汇编器设计</p>
<p style="font-size: 12pt;">&nbsp;用C++实现汇编器，有了汇编指令集就很容易翻译成机器指令集。<br><br>4.虚拟机设计<br>&nbsp;虚拟仿真CPU硬件工作原理，执行汇编器生成的机器指令。用C++实现虚拟机。<br><br>5.高级语言设计<br>&nbsp;语言是强类型的、LALR(1)、面向对象。是C语言的超集和C++的子集，不具有模板机制和一些特殊的语法。<br><br>6.编译器设计</p>
语言的文法采用BNF范式描述，句法采用正则表达式描述，用Flex和Bison工具生成编译器前端，再生成中间代码，优化后转换成汇编代码。用C++开发编译器。<br>
<br>
系统的开发先从虚拟机着手，以Space Invader游戏模拟器为例，开发一款基于Intel8080CPU的虚拟机，然后开发开发KH虚拟机。<br><img src ="http://www.cnitblog.com/houcy/aggbug/67170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/houcy/" target="_blank">挑灯看剑</a> 2010-07-04 12:26 <a href="http://www.cnitblog.com/houcy/archive/2010/07/04/67170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源机器人技术工具包[转贴]</title><link>http://www.cnitblog.com/houcy/archive/2008/10/10/50068.html</link><dc:creator>挑灯看剑</dc:creator><author>挑灯看剑</author><pubDate>Fri, 10 Oct 2008 13:56:00 GMT</pubDate><guid>http://www.cnitblog.com/houcy/archive/2008/10/10/50068.html</guid><wfw:comment>http://www.cnitblog.com/houcy/comments/50068.html</wfw:comment><comments>http://www.cnitblog.com/houcy/archive/2008/10/10/50068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/houcy/comments/commentRss/50068.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/houcy/services/trackbacks/50068.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width="100%">
            <h1>开源机器人技术工具包</h1>
            <p id=subtitle>使用虚拟舞台来测试机器人技术算法</p>
            <img class=display-img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=1></td>
            <td class=no-print width=192><img height=18 alt=developerWorks src="http://www-128.ibm.com/developerworks/i/dw.gif" width=192></td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width=10><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></td>
            <td width="100%">
            <table class=no-print cellSpacing=0 cellPadding=0 width=160 align=right border=0>
                <tbody>
                    <tr>
                        <td width=10><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></td>
                        <td>
                        <table cellSpacing=0 cellPadding=0 width=150 border=0>
                            <tbody>
                                <tr>
                                    <td class=v14-header-1-small></td>
                                </tr>
                            </tbody>
                        </table>
                        <table class=v14-gray-table-border cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td class=no-padding width=150>
                                    <table cellSpacing=0 cellPadding=0 width=143 border=0>
                                        <script language=JavaScript type=text/javascript>
                                        <!--
                                        document.write('
                                        <tr valign="top">
                                            <td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td>
                                            <td width="16"><img alt="将打印机的版面设置成横向打印模式" height="16" src="//www.ibm.com/i/v14/icons/printer.gif" width="16" vspace="3" /></td>
                                            <td width="122">
                                            <p><strong><a class="smallplainlink" href="javascript:print()">打印本页</a></strong></p>
                                            </td>
                                        </tr>
                                        ');
                                        //-->
                                        </script>
                                        <tbody>
                                            <tr vAlign=top>
                                                <td width=8><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8></td>
                                                <td width=16><img height=16 alt=将打印机的版面设置成横向打印模式 src="http://www.ibm.com/i/v14/icons/printer.gif" width=16 vspace=3></td>
                                                <td width=122>
                                                <p><strong><a class=smallplainlink href="javascript:print()" cmImpressionSent="1"></a></strong>&nbsp;</p>
                                                </td>
                                            </tr>
                                            <noscript></noscript>
                                            <form name=email action=https://www.ibm.com/developerworks/secure/email-it.jsp cM1="1">
                                                <input type=hidden value="构建机器人需要涉及很多学科的技能，包括嵌入式固件和硬件设计、传感器的选择、控制系统的设计，以及机械结构设计。而仿真环境可以为测试、评测和机器人技术算法的可视化提供一个虚拟的舞台，而不用花费高昂的开发成本（和时间）。本文将简要介绍一些 Linux 的开源机器人技术工具包及功能，并帮助我们判断哪些技术最适合我们使用。" name=body cM1="1" cM3 cM2="0"><input type=hidden value=开源机器人技术工具包 name=subject cM1="1" cM3 cM2="1"><input type=hidden value=cn name=lang cM1="1" cM3 cM2="2">
                                                <script language=JavaScript type=text/javascript>
                                                <!--
                                                document.write('
                                                <tr valign="top">
                                                    <td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td>
                                                    <td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送" /></td>
                                                    <td width="122">
                                                    <p><a class="smallplainlink" href="javascript:document.email.submit();"><strong>将此页作为电子邮件发送</strong></a></p>
                                                    </td>
                                                </tr>
                                                ');
                                                //-->
                                                </script>
                                                <tr vAlign=top>
                                                    <td width=8><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8></td>
                                                    <td width=16><img height=16 alt=将此页作为电子邮件发送 src="http://www.ibm.com/i/v14/icons/em.gif" width=16 vspace=3></td>
                                                    <td width=122>
                                                    <p>&nbsp;</p>
                                                    </td>
                                                </tr>
                                                <noscript>
                                                <tr valign="top">
                                                    <td width="8"><img alt="" height="1" width="8" src="//www.ibm.com/i/c.gif"/></td>
                                                    <td width="16"><img alt="" width="16" height="16" src="//www.ibm.com/i/c.gif"/></td>
                                                    <td class="small" width="122">
                                                    <p><span class="ast">未显示需要 JavaScript 的文档选项</span></p>
                                                    </td>
                                                </tr>
                                                </noscript>
                                            </form>
                                        </tbody>
                                    </table>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        <!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><!--end RESERVED FOR FUTURE USE INCLUDE FILES--><br></td>
                    </tr>
                </tbody>
            </table>
            <p>级别： 中级</p>
            <p><a href="http://www-128.ibm.com/developerworks/cn/linux/l-robotools/index.html#author" cmImpressionSent="1"><u><font color=#996699>M. Tim Jones</font></u></a> (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#109;&#116;&#106;&#64;&#109;&#116;&#106;&#111;&#110;&#101;&#115;&#46;&#99;&#111;&#109;&#63;&#115;&#117;&#98;&#106;&#101;&#99;&#116;&#61;&#24320;&#28304;&#26426;&#22120;&#20154;&#25216;&#26415;&#24037;&#20855;&#21253;&#38;&#97;&#109;&#112;&#59;&#99;&#99;&#61;&#116;&#111;&#109;&#121;&#111;&#117;&#110;&#103;&#64;&#117;&#115;&#46;&#105;&#98;&#109;&#46;&#99;&#111;&#109;" cmImpressionSent="1"><u><font color=#5c81a7>mtj@mtjones.com</font></u></a>), 顾问工程师, Emulex<br></p>
            <p>2006 年 10 月 08 日</p>
            <blockquote>构建机器人需要涉及很多学科的技能，包括嵌入式固件和硬件设计、传感器的选择、控制系统的设计，以及机械结构设计。而仿真环境可以为测试、评测和机器人技术算法的可视化提供一个虚拟的舞台，而不用花费高昂的开发成本（和时间）。本文将简要介绍一些 Linux 的开源机器人技术工具包及功能，并帮助我们判断哪些技术最适合我们使用。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
            <table cellSpacing=0 cellPadding=0 width="40%" align=right border=0>
                <tbody>
                    <tr>
                        <td width=10><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></td>
                        <td>
                        <table cellSpacing=0 cellPadding=5 width="100%" border=1>
                            <tbody>
                                <tr>
                                    <td bgColor=#eeeeee><a name=sidebar><strong>软件机器人？</strong></a><br>
                                    <p>华盛顿大学的研究人员创造了 <em>Softbots</em> 这个术语 —— 它是 <em>软件（software）</em> 和 <em>机器人（robot）</em> 这两个术语混合产生的。术语 <em>智能代理（intelligent agent）</em> 现在使用得更为广泛，尤其是在 Internet 实体内容中更是如此。在 1996 年，Franklin 和 Graesser 提出了第一种代理分类方法将病毒划分为自治代理。</p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <p>传统机器人的类型有很多，形式也各式各样，但是随着软件代理（虚拟机器人）的出现，这些变种又大大扩充了。虚拟机器人借鉴了物理机器人的很多特性。例如，物理机器人的机动性意味着某种形式的移动，但是移动软件机器人（或 <em>代理</em>）也可以有机动性 —— 此处是指在网络上不同主机之间迁移的能力。图 1 给出了物理和虚拟领域中自治机器人的一个简单的分类。本文将着重使用 <em>软件代理</em> 作为在人工合成环境中仿真机器人的机制。</p>
            <br><a name=fig1><strong>图 1. 自治机器人的简单分类</strong></a><br><img height=232 alt=自治机器人的简单分类 src="http://www-128.ibm.com/developerworks/cn/linux/l-robotools/figure1.gif" width=485> <br>
            <p><a name=N10086><span class=atitle>机器人的元素</span></a></p>
            <p>不管我们是在讨论物理机器人还是虚拟（<em>软件</em>）机器人，有一些基本的概念都是相同的。机器人用一些传感器用来感知环境，用一些效应器来对环境进行操作，用一个控制系统让机器人按照我们期望的方式进行反应（参见图 2）。</p>
            <br><a name=fig2><strong>图 2. 所有机器人系统的基本元素</strong></a><br><img height=194 alt=所有机器人系统的基本元素 src="http://www-128.ibm.com/developerworks/cn/linux/l-robotools/figure2.gif" width=218> <br>
            <p>在物理世界中，消防机器人可以使用温度传感器、红外（IR）传感器、全球定位系统（GPS）来感知环境，并使用发动机和灭火器作为效应器来对环境进行操作。而虚拟搜索代理则可以使用 Web 服务器和 HTTP 接口来感知环境（Internet）并对环境进行操作，并使用一个终端作为效应器来与用户进行通信。</p>
            <p>图 3 所示的系统是一个封闭循环，传感器负责为控制系统提供数据，而控制系统则驱动着环境中因素的变化。考虑这个问题的另外一种方法是采用反馈这个术语。如果控制系统指定了一个改变环境的操作，那么传感器就可以验证发生了这种变化，并将环境的新状态反馈给控制系统。而开放循环系统只能假设操作成功改变了环境的状态，这永远都不是什么好事。</p>
            <br><a name=fig3><strong>图 3. 对环境进行封闭循环操作</strong></a><br><img height=173 alt=对环境进行封闭循环操作 src="http://www-128.ibm.com/developerworks/cn/linux/l-robotools/figure3.gif" width=179> <br>
            <p>在构建机器人时，我们必须要从一个整体来考虑传感器、效应器和控制系统。对于本文来说，我们将着重介绍控制系统，以及在将其嵌入物理机器人之前可以对其进行仿真和验证的方法。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/l-robotools/index.html#main" cmImpressionSent="1"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N100B9><span class=atitle>机器人技术和仿真</span></a></p>
            <p>仿真在机器人技术领域扮演了一个关键的角色，因为它可以进行一些实验，如果没有仿真技术，这些实验可能会非常昂贵，而且需要花费大量的时间。仿真让我们可以在动态的合成环境中尝试一些做法，同时可以搜集这些响应数据，从而确定控制系统的品质。仿真还可以允许对机器人控制系统进行革新，这依赖于很多代控制系统的随机排列（遗传算法可以证实这一点）。</p>
            <table cellSpacing=0 cellPadding=0 width="40%" align=right border=0>
                <tbody>
                    <tr>
                        <td width=10><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></td>
                        <td>
                        <table cellSpacing=0 cellPadding=5 width="100%" border=1>
                            <tbody>
                                <tr>
                                    <td bgColor=#eeeeee><a name=sidebar2><strong>Linux 和机器人技术</strong></a><br>
                                    <p>Linux 是机器人技术采用的一个流行操作系统，因为从根源上来说，它与机器人技术的历史是类似的。机器人技术是一个实验领域。它是有关优化、尝试新事务和在将来不断革新的一种技术。Linux 从根本上来说，在这些方面也都具有相同的特性。早期的机器人都非常怪异，很少可以展示出实际应用价值。类似地，Linux 最开始也只是某些&#8220;瘾君子&#8221;的操作系统，但是它现在已经成长为一个功能强大而且十分稳定的操作系统了，我们在从嵌入式设备到超级计算机（包括很多机器人）上面都可以找到 Linux 的踪迹。</p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <p>仿真的一大优点表现在多机器人的仿真中。为这些仿真提供的一个流行比赛是机器人足球赛，在这种比赛中，参赛选手可以使用仿真机器人，也可以使用物理机器人，一组机器人会与另外一组机器人展开世界上流行的英式足球较量（这使得这项比赛非常适合成为一项国际赛事）。机器人必须能够完全与整个团队中的其他机器人进行合作（可能相互之间需要进行通信），并与对手团队中的机器人展开竞赛，这对于机器人的行为是一项挑战性极强的测试。</p>
            <p>但是对于仿真来说，也有些频感乏术的地方。真实的世界往往都非常凌乱，并且充满了各种噪音，因此这种合成环境基本上都很难进行建模。对机器人进行仿真通常都非常困难，因为真实世界中的传感器通常都可能呈现出不同的或非预期的特性。尽管有这些缺陷，我们依然可以通过在合成环境中对机器人进行仿真而学习到很多知识。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/l-robotools/index.html#main" cmImpressionSent="1"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N100D4><span class=atitle>Linux 上的开源工具包</span></a></p>
            <p>有几个开源工具包可以用来构建机器人控制系统。本文将介绍移动机器人仿真器和物理建模系统，最后再介绍一下一个可以支持在物理机器人中嵌入仿真控制系统的仿真器。这些工具包大部分都可以在 Linux 上运行，这主要是由于 Linux 的开源模型。开源软件是这样一个平台：我们在这种平台上只使用很少的努力就可以很快地开发软件，因此这种平台是非常理想的。Linux 也可以进行定制，这在其他操作系统中是不可能的（例如将内核做得最小并对内核进行扩充）。有关这些工具包的链接都在本文末尾 <a href="http://www-128.ibm.com/developerworks/cn/linux/l-robotools/index.html#resources" cmImpressionSent="1"><u><font color=#996699>参考资料</font></u></a> 一节中可以找到。</p>
            <p><a name=N100E1><span class=smalltitle><strong><font face=Arial>ODE</font></strong></span></a></p>
            <p>Russell Smith 的 Open Dynamics Engine（ODE）是一个开源的物理引擎，使用它可以仿真铰接式固形体运动。这样不管我们使用哪种图形库（可能使用 OpenGL），都可以对真实对象的物理特性进行仿真。我们可以使用 ODE 来对合成环境中的各种对象进行建模，例如三维游戏环境中的人物或虚拟驾驶中的交通工具。除了速度快之外， ODE 还可以支持实时仿真的碰撞检测。</p>
            <table cellSpacing=0 cellPadding=0 width="40%" align=right border=0>
                <tbody>
                    <tr>
                        <td width=10><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></td>
                        <td>
                        <table cellSpacing=0 cellPadding=5 width="100%" border=1>
                            <tbody>
                                <tr>
                                    <td bgColor=#eeeeee><a name=sidebar3><strong>什么是铰接式固形体？</strong></a><br>
                                    <p><em>铰接式固形体（articulated rigid body）</em> 就是一个使用各种连接手段将各种图形连接在一起而构成的一个结构。例如，我们可以认为构成腿或交通工具底盘、悬吊系统、轮子等元素的装置都是连接。ODE 可以有效地对这些元素进行建模，包括摩擦力模型。</p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <p>ODE 目前可以支持球窝、铰链、滑块、定轴、角电机和 hinge-2 （用于交通工具的连接）连接类型，以及其他一些连接类型。它还可以支持各种碰撞原语（例如球面碰撞和平面碰撞）和几个碰撞空间。</p>
            <p>ODE 主要是使用 <code>C++</code> 语言编写的，但是它也提供了 <code>C</code> 和 <code>C++</code> 的清晰接口来帮助我们与应用程序进行集成。有关 ODE 更好的一点是它发行所采用的许可证：LGPL（GNU Lesser General Public License）和 BSD License。在这两个许可证中，我们都可以在商业产品中使用 ODE 的源代码，而不需任何费用。其结果是我们在很多商业游戏、飞行模拟器和虚拟现实仿真中都可以找到 ODE。</p>
            <p>清单 1 中的源代码给出了一个简单的例子，这个环境中中存在火星的地心引力，里面有一个球具有向上的速度。由于这个环境中具有地心引力，因此向上的速度不会坚持很久；最后这个球会上升到顶点并开始下降。在初始化完成之后（即在这个环境中创建对象并设置好属性之后），我们就可以通过 <code>dWorldStep</code> 对这个世界中的物理特性进行仿真了。要理解发生的现象，可以经常调用 <code>dBodyGetPosition</code> 并给它传入球的标识符来获得它的当前位置。</p>
            <br><a name=list1><strong>清单 1. 简单的 ODE 实验：地心引力环境中的球</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="50%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>
                        #include &lt;iostream&gt;
                        #include &lt;ode/ode.h&gt;
                        #define time_step		 (float)0.1
                        int main()
                        {
                        dWorldID myWorld_id;
                        dBodyID mySphere_id;
                        dMass sphereMass;
                        const dReal *pos;
                        float time = 0.0;
                        /* Create a new world */
                        myWorld_id = <span class=boldcode><strong>dWorldCreate</strong></span>();
                        /* Create a sphere in the world */
                        mySphere_id  = <span class=boldcode><strong>dBodyCreate</strong></span>( myWorld_id );
                        /* Set the world's global gravity vector (Mars) -- x,y,z */
                        <span class=boldcode><strong>dWorldSetGravity</strong></span>( myWorld_id, 0, 0, -3.77 );
                        /* Set the Sphere's position in the world -- x,y,z */
                        <span class=boldcode><strong>dBodySetPosition</strong></span>( mySphere_id, 0, 0, 100 );
                        /* Set the Sphere's mass (density, radius) */
                        <span class=boldcode><strong>dMassSetSphere</strong></span>( &amp;sphereMass, 1, 2 );
                        <span class=boldcode><strong>dBodySetMass</strong></span>( mySphere_id, &amp;sphereMass );
                        /* Give the sphere a small amount of upward (z) velocity */
                        <span class=boldcode><strong>dBodySetLinearVel</strong></span>( mySphere_id, 0.0, 0.0, 5.0 );
                        /* Run the simulation */
                        while (time &lt; 5.0) {
                        /* Simulate the world for the defined time-step */
                        <span class=boldcode><strong>dWorldStep</strong></span>( myWorld_id, time_step );
                        /* Get the current position of the sphere */
                        pos = <span class=boldcode><strong>dBodyGetPosition</strong></span>( mySphere_id );
                        std::cout &lt;&lt; "position (" &lt;&lt; pos[0] &lt;&lt; ", "
                        &lt;&lt; pos[1] &lt;&lt; ", " &lt;&lt; pos[2] &lt;&lt; ")\n";
                        /* Next time step */
                        time += time_step;
                        }
                        /* Destroy the objects */
                        <span class=boldcode><strong>dBodyDestroy</strong></span>( mySphere_id );
                        <span class=boldcode><strong>dWorldDestroy</strong></span>( myWorld_id );
                        return 0;
                        }
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>因此，如果我们需要一个工业级质量的物理引擎（它可以在 Linux 上运行，也可以在其他平台上运行）来仿真移动机器人或现实环境中无人驾驶交通工具，那么 ODE 就是一个极好的选择。与 OpenGL 应用程序编程接口（API）一起使用，ODE 就可以生成由真实相片构成的图形，并且具有真实的物理特性。</p>
            <p><a name=N10143><span class=smalltitle><strong><font face=Arial>Simbad 机器人仿真器</font></strong></span></a></p>
            <p>Simbad 是一个使用 Java&#174; 编程语言编写的三维机器人仿真器（因此它可以在 Linux 或其他支持 Java 虚拟机（或 JVM）的平台上运行）；不过这个仿真器还包括了对 Python 脚本语言（通过 Jython）的支持。Simbad 设计用来研究自治机器人环境中的人工智能（AI）算法，它包括了一个 rich GUI（图形用户界面）进行可视化操作，它不但是对机器人的动作进行可视化，而且还是从机器人的角度来进行可视化的。</p>
            <p>使得 Simbad 如此有趣的原因是它的使用非常简单，可以让我们快速创建新机器人的行为。不过尽管为 Simbad 的开发都非常简单，但是它实际上是机器人仿真的一个扩展框架。</p>
            <p>使用这个仿真器，我们可以创建环境或对环境进行裁减，然后使用各种传感器来开发自己的机器人控制器。可用的传感器包括视觉传感器（彩色照相机）、范围传感器（声波和红外探测器）以及碰撞检测的缓冲。</p>
            <p>这些传感器的 API 都非常清晰直观，易于使用。清单 2 中的例子展示了仿真声波用法，以及如何检测命中（对象检测到了）。</p>
            <br><a name=list2><strong>清单 2. 展示仿真声波用法的代码片段</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="50%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>
                        int sonar_id, total_sonars;
                        // If at least one sensor has a hit
                        if (<span class=boldcode><strong>sonars.oneHasHit</strong></span>()) {
                        // Find out how many sonars are on the robot
                        total_sonars = <span class=boldcode><strong>sonars.getNumSensors</strong></span>();
                        // Iterate through each sonar
                        for ( sonar_id = 0 ; sonar_id &lt; total_sonars ; sonar_id++ ) {
                        // Does this one have a hit?
                        if (<span class=boldcode><strong>sonars.hasHit</strong></span>(sonar_id)) {
                        // Emit the details (angle, range)
                        System.out.println( "Sonar hit at angle " +
                        <span class=boldcode><strong>sonars.getAngle</strong></span>(i) +
                        " at range " +
                        <span class=boldcode><strong>sonars.getMeasurement</strong></span>(i) );
                        }
                        }
                        }
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>Simbad 中的其他传感器也遵循类似的模式，它们也创建了一组直观的 API。</p>
            <p>让 Simbad 变得如此有用的是它对机器人仿真和可视化而使用的终端。正如图 4 所显示的一样，Simbad 的终端给我们提供了世界的一个实时视图，一个提供了机器人详细信息（包括照相机）的监视器面板，以及一个用来对仿真进行管理的控制面板。</p>
            <br><a name=fig4><strong>图 4. Simbad 机器人仿真器和可视化终端</strong></a><br><img height=579 alt="Simbad 机器人仿真和可视化终端" src="http://www-128.ibm.com/developerworks/cn/linux/l-robotools/figure4.jpg" width=559> <br>
            <p>Simbad 还提供了很好的文档和教程来帮助我们迅速入门，并使用 Java 和 Python 语言快速运行它。除了单一机器人仿真之外，我们还可以同时对多个机器人进行仿真。总体上来说，Simbad 仿真器是一个非常适合测试智能机器人算法的环境。Simbad 可以按照 GPL 开源许可证的方式使用。</p>
            <p><a name=N10188><span class=smalltitle><strong><font face=Arial>TeamBots</font></strong></span></a></p>
            <p>TeamBots 是一个可移植的多代理机器人仿真器，它可以支持动态环境中多代理控制系统的仿真，并可以提供可视化功能。与 Simbad 之类的其他仿真器相比，TeamBots 有一点非常独特：它的控制系统具有很好的可移植性。我们可以开发自己的控制系统，并将其在仿真器上进行验证，然后再在真正的移动机器人上对控制系统进行测试（使用 Nomadic Technologies Nomad 150 机器人）。</p>
            <p>TeamBots API 为控制系统提供了一个抽象层（参见图 5）。结果是，控制系统无法知道到底是运行在合成环境（TBSim）的仿真器内还是运行在真实环境（TBHard）的移动机器人平台内。</p>
            <br><a name=fig5><strong>图 5. 控制系统的 TeamBots API 抽象层</strong></a><br><img height=381 alt="控制系统的 TeamBots API 抽象层" src="http://www-128.ibm.com/developerworks/cn/linux/l-robotools/figure5.gif" width=337> <br>
            <p>TeamBots 仿真环境非常灵活，也很容易用来使用对象和其他机器人构建合成环境。我们很容易就可以添加墙、任意对象、路以及其他运行相同或不同控制系统的机器人。通过这种方式，我们可以构建捕食/被捕食仿真（这是是一个例子）。另外，对象不需要是静态的。我们可以添加在环境中四处移动的对象，或者机器人推动的对象（例如球）。</p>
            <p>使用 TeamBots，我们可以对不同类型的机器人仿真进行建模。例如，在 1997 年，Georgia Tech 使用 TeamBots 赢得了美国人工智能协会（AAAI）的移动机器人竞赛，他在一个动态环境中使用了两个仿真 Nomad 150 机器人进行填料。这两个机器人的目标是对环境进行搜索，然后将蓝色对象放到蓝色柜子中，将橙色对象放到橙色柜子中（参见图 6）。为了增加竞赛的复杂性，橙色球是动态的，并且在整个环境中是不断移动的。</p>
            <br><a name=fig6><strong>图 6. TeamBots 的填料仿真</strong></a><br><img height=566 alt="TeamBots 的填料仿真" src="http://www-128.ibm.com/developerworks/cn/linux/l-robotools/figure6.jpg" width=491> <br>
            <p>在图 6 中，移动机器人 1 拿到一个蓝色对象，正在向一个蓝色柜子移动，以便将这个蓝色球放到蓝色柜子中。机器人 0 正在进行搜索。</p>
            <p>我们在机器人英式足球选手的开发中也可以使用 TeamBots。英式足球是一项国际流行的运动，它是国际上很多大学和组织进行竞争的一个很好的平台。机器人英式足球比赛的规则可能会稍有不同（尤其是在考虑到移动平台、双足平台或 Sony Aibo 之间的差异时），但是它们都使用了这项赛事的相同的基本模型。</p>
            <p>在图 7 中，机器人 1（黄/白）正在冲向球，试图射门。机器人 0（蓝/红）正在守门，它处于一个阻断的位置。机器人英式足球赛看起来实际上非常有趣，TeamBots 发行版提供了几个球队，我们可以使用它们来体验一下新策略。</p>
            <br><a name=fig7><strong>图 7. TeamBots 在 SoccerBots 中的展示</strong></a><br><img height=370 alt="TeamBots 在 SoccerBots 中的展示" src="http://www-128.ibm.com/developerworks/cn/linux/l-robotools/figure7.jpg" width=492> <br>
            <p>TeamBots 为英式足球塞提供了一个 Java API，它主要关注的是球员的 &#8220;大脑&#8221;。效应器 API 允许对机器人进行调优，以特定的速度移动、踢球或简单地带球。传感器是在高层构建的，它们提供了 API 来确定球的方向、其他球员（队友和对手）的方向、目前冲锋在前面的人、守门员的位置等等。</p>
            <p>为了让您对 TeamBots Soccer API 有个大概的了解，参见清单 3，它给出了一个非常简单的策略。这个策略（源自于 Tucker Balch 编写的 SoccerBots 源代码）简单地寻找球、冲向这个球，然后踢球（不管是否踢向球门）。这是一个随机策略，但是它展示了这个 API 的简单性。</p>
            <br><a name=list3><strong>清单 3. 使用 TeamBots SoccerBots API 的简单英式足球球员的代码片段</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="50%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>
                        public int TakeStep()
                        {
                        Vec2 ball;
                        long T;
                        T = <span class=boldcode><strong>abstract_robot.getTime</strong></span>();
                        // Get the vector to the ball
                        ball = <span class=boldcode><strong>abstract_robot.getBall</strong></span>(T);
                        // Point ourselves to it
                        <span class=boldcode><strong>abstract_robot.setSteerHeading</strong></span>(T, ball.t);
                        // Go to it (maximum speed)
                        <span class=boldcode><strong>abstract_robot.setSpeed</strong></span>(T, 1.0);
                        // If we can kick it, do so!
                        if (<span class=boldcode><strong>abstract_robot.canKick</strong></span>(T)) <span class=boldcode><strong>abstract_robot.kick</strong></span>(T);
                        return(CSSTAT_OK);
                        }
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>TeamBots 发行版对于移动机器人的原型和仿真来说都是一个很好的环境，也非常适合在使用 TBHard 环境的真实机器人中使用它们。TeamBots 是开源的（由 Georgia Tech 和 Carnegie Mellon University 的 Tucker Balch 开发），可以自由用于教育和研究目的。这个仿真器是使用 Java 语言开发的，发行版本中提供了完整的源代码和几个例子，可以帮助我们快速入门。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/l-robotools/index.html#main" cmImpressionSent="1"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N101F5><span class=atitle>其他工具包</span></a></p>
            <p>有很多仿真器都为之编写的最知名的移动机器人平台之一是 <em>Khepera</em>。不幸的是，Khepera 已经变成了一个商业软件，而不再是开源的了。所幸的是，诸如 KControl 之类的工具包依然可以用来在 Linux 系统上为 Khepera 开发控制系统。</p>
            <p>在 Gazebo 中有一个有趣的可以运动的三维机器人仿真器。Gazebo 不但可以对标准的机器人传感器（例如惯性度量单元、GPS 接收器和单筒相机）进行建模，而且还可以对机器人环境中使用的真实固形体物理部件进行建模。Gazebo 可以支持一个插件模型，在这个模型中我们可以将新的机器人传感器模型动态加载到环境中。</p>
            <p>最后，一个非常有用的机器人导航工具包是 Carmen —— Carnegie Mellon Robot Navigation Toolkit。Carmen 实现了一个模块化的架构，它提供了基本的导航原语，例如故障排除、路径规划和绘图。除了提供一个两维仿真器之外，Carmen 还可以支持几个在 Linux 上运行的物理机器人平台。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/l-robotools/index.html#main" cmImpressionSent="1"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N10207><span class=atitle>构建 Linux 机器人</span></a></p>
            <p>开始构建基于 Linux 的机器人并不像我们想像的那样困难。实际上，有些高中的科学课程正在使用 Linux 和现有的可用硬件作为基于 Linux 的机器人的核心。例如，可以使用老式的 PC 主板作为系统核心（或者稍微好些的，使用老式的笔记本），并从 USB 磁盘上来引导 Linux（这比 CD-ROM 或硬盘/软盘引导消耗的电量会少很多）。板载的并口可以很容易转换成很多设备，例如将输入和输出分离开，或者驱动一组步进马达。串口可以用来接收 GPS 坐标，或者连接外部设备，例如 A/D （模拟信号到数字信号）或 D/A（数字信号到模拟信号）转换器。最后，可以购买一些便宜的 USB Web 相机来为机器人添加视觉功能。</p>
            <p>但是真正使得 Linux 在这个环境中大放异彩的是它对环境的简化能力，从而使得所有人都可以通过 Python 之类的高级语言进行机器人控制系统的设计。位于 Maine 的 Greater Houlton Christian Academy 的 Michael Surran 最近（已经是第二年了）教授了一门高中的机器人课程，它充分利用了 Linux 和目前可用的硬件。这个课程的核心就是使用 Python。由于 Python 是一种解释语言，因此很容易来试验算法，而不需要经过长时间的编译过程（这点使得解释脚本语言显得如此有用）。</p>
            <p>如果我们正在寻找最新的 Linux 解决方案，Carnegie Mellon University 最近在自己的 Mobile Robot Programming Lab（MRPL）中推出了 &#8220;Qwerkbot&#8221; 平台，它可以在 2.6 版本的 Linux 内核上运行。&#8220;Qwerkbot&#8221; 是一个基于 ARM9 的主板，具有 8MB 的闪存和 32MB 的SDRAM；它包括了 4 个板载的马达控制器、16 个伺服控制器、16 个数字 I/O、8 个 12 位的模拟输入，以及其他组件。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/l-robotools/index.html#main" cmImpressionSent="1"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N10216><span class=atitle>结束语</span></a></p>
            <p>机器人仿真器可以极大地简化构建物理机器人的工作。使用这些仿真器，我们可以在将自己的想法和策略放入硬件之前就对它们进行测试。幸运的是，Linux 和开源社区有很多选择，它们不但非常容易使用，而且还可以支持与硬件平台的直接链接。</p>
            <br><br>
            <p><a name=resources><span class=atitle>参考资料 </span></a></p>
            <strong>学习</strong><br>
            <ul>
                <li>您可以参阅本文在 developerWorks 全球站点上的 <a href="http://www.ibm.com/developerworks/linux/library/l-robotools/?S_TACT=105AGX52&amp;S_CMP=cn-a-l" target=_blank cmImpressionSent="1"><u><font color=#5c81a7>英文原文</font></u></a> 。<br><br>
                <li><a href="http://www.ode.org/" cmImpressionSent="1"><u><font color=#5c81a7>Open Dynamics Engine</font></u></a> 是一个用来对固形体动作建模的物理引擎。 <br><br>
                <li><a href="http://simbad.sourceforge.net/" cmImpressionSent="1"><u><font color=#996699>Simbad</font></u></a> 机器人仿真器是一个进行机器人仿真和可视化处理的好工具。 <br><br>
                <li><a href="http://www.teambots.org/" cmImpressionSent="1"><u><font color=#5c81a7>TeamBots</font></u></a> 发行版对于移动机器人的原型建立和仿真来说都是一个很好的环境，还可以用来在使用 TBHard 环境的真实机器人中执行。TeamBots 是开源的（由 Georgia Tech 和 Carnegie Mellon University 的 Tucker Balch 开发），可以自由地用于教育和研究目的。 <br><br>
                <li><a href="http://www.cs.cmu.edu/~trb/TeamBots/Domains/SoccerBots/Docs/small.html" cmImpressionSent="1"><u><font color=#5c81a7>RoboCup Soccer 竞赛的扩展规则</font></u></a> 定义了比赛中可以进行哪些动作，内容从场地大小到比赛用球（一个橙色的高尔夫球）都有规定。 <br><br>
                <li><a href="http://www.robocup2005.org/home/default.aspx" cmImpressionSent="1"><u><font color=#5c81a7>2005 RoboCup</font></u></a> 在日本的大阪举办，进行了各种机器人英式足球比赛，包括传统的移动机器人球员、两足机器人、Sony Aibos、仿真虚拟球员以及其他一些机器人的展示。RoboCup Web 站点上提供了精彩的视频录像。 <br><br>
                <li><a href="http://www.aaai.org/" cmImpressionSent="1"><u><font color=#5c81a7>American Association for Artificial Intelligence</font></u></a> Web 站点上维护了一个有关 AI 主题和研究的讨论列表。其中的 <a href="http://www.aaai.org/AITopics/html/robots.html" cmImpressionSent="1"><u><font color=#5c81a7>robotics page</font></u></a> （以及 <a href="http://www.aaai.org/AITopics/html/soft.html" cmImpressionSent="1"><u><font color=#5c81a7>开源项目页面</font></u></a>）可以让我们了解软件机器人和硬件机器人领域发生的最新事件。 <br><br>
                <li><a href="http://www.aai.ca/robots/khep_2.html" cmImpressionSent="1"><u><font color=#996699>Khepera II</font></u></a> 依然是基于 Motorola 68331 CPU 的（微型的 Khepera 已经有点过时了）。除了移动平台之外，还有很多选择可以对这个平台进行扩充，例如视频照相机模块、钳子模块以及一个无线调制解调器用来与其他 Khepera 移动机器人进行通信。 <br><br>
                <li><a href="http://playerstage.sourceforge.net/index.php?src=gazebo" cmImpressionSent="1"><u><font color=#5c81a7>Gazebo multi-robot simulator</font></u></a> 不但实现了一个真实的机器人模拟，而且还实现了机器人环境中固形体物理组件的精确仿真。 <br><br>
                <li><a href="http://carmen.sourceforge.net/" cmImpressionSent="1"><u><font color=#5c81a7>Carmen</font></u></a> 是一个机器人导航工具包，它提供了对物理机器人系统的仿真和支持。它实现了几个导航原语，例如绘图和路径规划。 <br><br>
                <li>查看 CMU 的<a href="http://www.terk.ri.cmu.edu/recipes/index.php" cmImpressionSent="1"><u><font color=#5c81a7>interesting recipes for the Qwerkbot</font></u></a>，包括相机使用的一个底盘倾斜单元。 <br><br>
                <li>&#8220;<a href="http://www.linuxjournal.com/article/9103" cmImpressionSent="1"><u><font color=#996699>Do-It-Yourself Robots with Linux</font></u></a>&#8221;，Michael Surran 撰写的一篇 <em>Linux Journal</em> ，解释了为什么 Linux 和老式 PC 硬件可以成为构建移动机器人的很好平台。 <br><br>
                <li>要运行 <a href="http://www.blackdown.com/" cmImpressionSent="1"><u><font color=#5c81a7>Java on Linux</font></u></a>，我们需要使用 Blackdown Java Linux 包。 <br><br>
                <li>在 <a href="http://www.ibm.com/developerworks/cn/linux/" cmImpressionSent="1"><u><font color=#5c81a7>developerWorks Linux 专区</font></u></a> 中可以找到为 Linux 开发人员准备的更多资源。 <br><br>
                <li>随时关注 <a href="http://www.ibm.com/developerworks/offers/techbriefings/?S_TACT=105AGX52&amp;S_CMP=cn-a-l" cmImpressionSent="1"><u><font color=#5c81a7>developerWorks 技术事件和 Webcasts</font></u></a>。 </li>
            </ul>
            <br><strong>获得产品和技术</strong><br>
            <ul>
                <li><a href="http://www.ibm.com/developerworks/offers/sek/?S_TACT=105AGX52&amp;S_CMP=cn-a-l" cmImpressionSent="1"><u><font color=#5c81a7>订购免费的 SEK for Linux</font></u></a>，这有两张 DVD，包括最新的 IBM for Linux 的试用版件，包括 DB2&#174;、Lotus&#174;、Rational&#174;、Tivoli&#174; 和 WebSphere&#174;。 <br><br>
                <li>在您的下一个开发项目中采用 <a href="http://www.ibm.com/developerworks/downloads/?S_TACT=105AGX52&amp;S_CMP=cn-a-l" cmImpressionSent="1"><u><font color=#5c81a7>IBM 试用软件</font></u></a>，这些软件可以从 developerWorks 上直接下载。 <br><br></li>
            </ul>
            <br><strong>讨论</strong><br>
            <ul>
                <li>通过参与 <a href="http://www.ibm.com/developerworks/blogs/?S_TACT=105AGX52&amp;S_CMP=cn-a-l" cmImpressionSent="1"><u><font color=#5c81a7>developerWorks blogs</font></u></a> 加入 developerWorks 社区。 <br><br></li>
            </ul>
            <br><br>
            <p><a name=author><span class=atitle>关于作者</span></a></p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td colSpan=3><img height=5 alt="" src="http://www.ibm.com/i/c.gif" width="100%"></td>
                    </tr>
                    <tr vAlign=top align=left>
                        <td>
                        <p><img height=80 alt="M. Tim Jones" src="http://www.ibm.com/developerworks/i/p-mjones.jpg" width=64 align=left border=0 name="M. Tim Jones" valign="top"></p>
                        </td>
                        <td><img height=5 alt="" src="http://www.ibm.com/i/c.gif" width=4></td>
                        <td width="100%">
                        <p>Tim Jones 是一名嵌入式软件工程师，他是 <em>GNU/Linux Application Programming</em>、<em>AI Application Programming</em> 以及 <em>BSD Sockets Programming from a Multilanguage Perspective</em> 等书的作者。他的工程背景非常广泛，从同步宇宙飞船的内核开发到嵌入式架构设计，再到网络协议的开发。Tim 是 Emulex Corp. 的一名资深软件工程师。</p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cnitblog.com/houcy/aggbug/50068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/houcy/" target="_blank">挑灯看剑</a> 2008-10-10 21:56 <a href="http://www.cnitblog.com/houcy/archive/2008/10/10/50068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>