提交 79c162b1 创建 作者: 赵鹏翀's avatar 赵鹏翀

Initial commit

上级
*.cir
*.xml
*.bak
/.vs
\ No newline at end of file
[submodule "8086"]
path = 8086
url = https://zpc@www.codecode.net/engintime/Dream-Logic/Intel-classic-chips/8086.git
[submodule "8255"]
path = 8255
url = https://zpc@www.codecode.net/engintime/Dream-Logic/Intel-classic-chips/8255.git
[submodule "ADC0809"]
path = ADC0809
url = https://zpc@www.codecode.net/engintime/Dream-Logic/Intel-classic-chips/ADC0809.git
[submodule "DAC0832"]
path = DAC0832
url = https://zpc@www.codecode.net/engintime/Dream-Logic/Intel-classic-chips/DAC0832.git
8086 @ 0646239b
Subproject commit 0646239b4d1645f6a0da63d7f4bb3142942e567c
8255 @ 3579b6d7
Subproject commit 3579b6d7edcc93923c5467c914b30d9e4d0ce331
ADC0809 @ 59c65c04
Subproject commit 59c65c041ec4a54a3df92a5ac2d894b39c87f034
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<svg height="2364" version="1.1" width="5592" xmlns="http://www.w3.org/2000/svg">
<rect fill="#80ff80" height="1000" stroke="#800000" stroke-width="1" width="700" x="3468" y="966"/>
<text alignment-baseline="after-edge" fill="#000080" font-family="微软雅黑" font-size="90" font-weight="700" text-anchor="start" x="3468" y="866">DAC0832</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3468" y="916">DAC0832\DAC0832.dlsche</text>
<polygon fill="#ffff80" points="3468 1066, 3493 1041, 3543 1041, 3568 1066, 3543 1091, 3493 1091, 3468 1066" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3578" y="1066">CS</text>
<polygon fill="#ffff80" points="3468 1166, 3493 1141, 3543 1141, 3568 1166, 3543 1191, 3493 1191, 3468 1166" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3578" y="1166">WR1</text>
<polygon fill="#ffff80" points="3468 1266, 3493 1241, 3543 1241, 3568 1266, 3543 1291, 3493 1291, 3468 1266" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3578" y="1266">AGND</text>
<polygon fill="#ffff80" points="3468 1366, 3493 1341, 3543 1341, 3568 1366, 3543 1391, 3493 1391, 3468 1366" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3578" y="1366">D3</text>
<polygon fill="#ffff80" points="3468 1466, 3493 1441, 3543 1441, 3568 1466, 3543 1491, 3493 1491, 3468 1466" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3578" y="1466">D2</text>
<polygon fill="#ffff80" points="3468 1566, 3493 1541, 3543 1541, 3568 1566, 3543 1591, 3493 1591, 3468 1566" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3578" y="1566">D1</text>
<polygon fill="#ffff80" points="3468 1666, 3493 1641, 3543 1641, 3568 1666, 3543 1691, 3493 1691, 3468 1666" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3578" y="1666">D0</text>
<polygon fill="#ffff80" points="3468 1766, 3493 1741, 3543 1741, 3568 1766, 3543 1791, 3493 1791, 3468 1766" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3578" y="1766">VREF</text>
<polygon fill="#ffff80" points="3468 1866, 3493 1841, 3543 1841, 3568 1866, 3543 1891, 3493 1891, 3468 1866" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3578" y="1866">Rfb</text>
<polygon fill="#ffff80" points="4168 1066, 4143 1041, 4093 1041, 4068 1066, 4093 1091, 4143 1091, 4168 1066" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3958" y="1066">ILE</text>
<polygon fill="#ffff80" points="4168 1166, 4143 1141, 4093 1141, 4068 1166, 4093 1191, 4143 1191, 4168 1166" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3958" y="1166">WR2</text>
<polygon fill="#ffff80" points="4168 1266, 4143 1241, 4093 1241, 4068 1266, 4093 1291, 4143 1291, 4168 1266" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3958" y="1266">XFER</text>
<polygon fill="#ffff80" points="4168 1366, 4143 1341, 4093 1341, 4068 1366, 4093 1391, 4143 1391, 4168 1366" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3958" y="1366">D4</text>
<polygon fill="#ffff80" points="4168 1466, 4143 1441, 4093 1441, 4068 1466, 4093 1491, 4143 1491, 4168 1466" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3958" y="1466">D5</text>
<polygon fill="#ffff80" points="4168 1566, 4143 1541, 4093 1541, 4068 1566, 4093 1591, 4143 1591, 4168 1566" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3958" y="1566">D6</text>
<polygon fill="#ffff80" points="4168 1666, 4143 1641, 4093 1641, 4068 1666, 4093 1691, 4143 1691, 4168 1666" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3958" y="1666">D7</text>
<polygon fill="#ffff80" points="4168 1766, 4143 1741, 4093 1741, 4068 1766, 4093 1791, 4143 1791, 4168 1766" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3958" y="1766">Iout2</text>
<polygon fill="#ffff80" points="4168 1866, 4143 1841, 4093 1841, 4068 1866, 4093 1891, 4143 1891, 4168 1866" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3958" y="1866">Iout1</text>
<rect fill="#80ff80" height="1400" stroke="#800000" stroke-width="1" width="700" x="1468" y="856"/>
<text alignment-baseline="after-edge" fill="#000080" font-family="微软雅黑" font-size="90" font-weight="700" text-anchor="start" x="1468" y="756">ADC0809</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1468" y="806">ADC0809\ADC0809.dlsche</text>
<polygon fill="#ffff80" points="1468 956, 1493 931, 1543 931, 1568 956, 1543 981, 1493 981, 1468 956" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1578" y="956">IN3</text>
<polygon fill="#ffff80" points="1468 1056, 1493 1031, 1543 1031, 1568 1056, 1543 1081, 1493 1081, 1468 1056" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1578" y="1056">IN4</text>
<polygon fill="#ffff80" points="1468 1156, 1493 1131, 1543 1131, 1568 1156, 1543 1181, 1493 1181, 1468 1156" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1578" y="1156">IN5</text>
<polygon fill="#ffff80" points="1468 1256, 1493 1231, 1543 1231, 1568 1256, 1543 1281, 1493 1281, 1468 1256" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1578" y="1256">IN6</text>
<polygon fill="#ffff80" points="1468 1356, 1493 1331, 1543 1331, 1568 1356, 1543 1381, 1493 1381, 1468 1356" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1578" y="1356">IN7</text>
<polygon fill="#ffff80" points="1468 1456, 1493 1431, 1543 1431, 1568 1456, 1543 1481, 1493 1481, 1468 1456" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1578" y="1456">START</text>
<polygon fill="#ffff80" points="1468 1556, 1493 1531, 1543 1531, 1568 1556, 1543 1581, 1493 1581, 1468 1556" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1578" y="1556">EOC</text>
<polygon fill="#ffff80" points="1468 1656, 1493 1631, 1543 1631, 1568 1656, 1543 1681, 1493 1681, 1468 1656" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1578" y="1656">D3</text>
<polygon fill="#ffff80" points="1468 1756, 1493 1731, 1543 1731, 1568 1756, 1543 1781, 1493 1781, 1468 1756" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1578" y="1756">OE</text>
<polygon fill="#ffff80" points="1468 1856, 1493 1831, 1543 1831, 1568 1856, 1543 1881, 1493 1881, 1468 1856" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1578" y="1856">CLK</text>
<polygon fill="#ffff80" points="1468 1956, 1493 1931, 1543 1931, 1568 1956, 1543 1981, 1493 1981, 1468 1956" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1578" y="1956">VREF</text>
<polygon fill="#ffff80" points="1468 2056, 1493 2031, 1543 2031, 1568 2056, 1543 2081, 1493 2081, 1468 2056" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1578" y="2056">GND</text>
<polygon fill="#ffff80" points="1468 2156, 1493 2131, 1543 2131, 1568 2156, 1543 2181, 1493 2181, 1468 2156" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1578" y="2156">D1</text>
<polygon fill="#ffff80" points="2168 956, 2143 931, 2093 931, 2068 956, 2093 981, 2143 981, 2168 956" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1958" y="956">IN2</text>
<polygon fill="#ffff80" points="2168 1056, 2143 1031, 2093 1031, 2068 1056, 2093 1081, 2143 1081, 2168 1056" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1958" y="1056">IN1</text>
<polygon fill="#ffff80" points="2168 1156, 2143 1131, 2093 1131, 2068 1156, 2093 1181, 2143 1181, 2168 1156" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1958" y="1156">IN0</text>
<polygon fill="#ffff80" points="2168 1256, 2143 1231, 2093 1231, 2068 1256, 2093 1281, 2143 1281, 2168 1256" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1958" y="1256">ADDA</text>
<polygon fill="#ffff80" points="2168 1356, 2143 1331, 2093 1331, 2068 1356, 2093 1381, 2143 1381, 2168 1356" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1958" y="1356">ADDB</text>
<polygon fill="#ffff80" points="2168 1456, 2143 1431, 2093 1431, 2068 1456, 2093 1481, 2143 1481, 2168 1456" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1958" y="1456">ADDC</text>
<polygon fill="#ffff80" points="2168 1556, 2143 1531, 2093 1531, 2068 1556, 2093 1581, 2143 1581, 2168 1556" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1958" y="1556">ALE</text>
<polygon fill="#ffff80" points="2168 1656, 2143 1631, 2093 1631, 2068 1656, 2093 1681, 2143 1681, 2168 1656" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1958" y="1656">D7</text>
<polygon fill="#ffff80" points="2168 1756, 2143 1731, 2093 1731, 2068 1756, 2093 1781, 2143 1781, 2168 1756" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1958" y="1756">D6</text>
<polygon fill="#ffff80" points="2168 1856, 2143 1831, 2093 1831, 2068 1856, 2093 1881, 2143 1881, 2168 1856" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1958" y="1856">D5</text>
<polygon fill="#ffff80" points="2168 1956, 2143 1931, 2093 1931, 2068 1956, 2093 1981, 2143 1981, 2168 1956" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1958" y="1956">D4</text>
<polygon fill="#ffff80" points="2168 2056, 2143 2031, 2093 2031, 2068 2056, 2093 2081, 2143 2081, 2168 2056" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1958" y="2056">D0</text>
<polygon fill="#ffff80" points="2168 2156, 2143 2131, 2093 2131, 2068 2156, 2093 2181, 2143 2181, 2168 2156" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1958" y="2156">D2</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="68" x2="68" y1="556" y2="476"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="68" x2="68" y1="616" y2="696"/>
<polyline fill="none" points="18 556, 118 556" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="48 576, 88 576" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="18 596, 118 596" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="48 616, 88 616" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="119" y="548">V1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="102" y="654">DC8</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="148" y="596">0.1V</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="68" x2="68" y1="956" y2="856"/>
<polyline fill="none" points="18 956, 118 956" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="38 972, 98 972" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="58 987, 78 987" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="78" y="906"></text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="38" y="1036">GND</text>
<polyline fill="none" points="1468 1856, 568 1856" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="968" x2="1068" y1="1756" y2="1756"/>
<text alignment-baseline="after-edge" fill="#000080" font-family="微软雅黑" font-size="30" font-weight="700" text-anchor="start" x="909" y="1776">1</text>
<rect fill="#ffffff" fill-opacity="0.5" height="60" stroke="#800000" stroke-width="5" width="100" x="868" y="1726"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="912" y="1717">1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="629" y="1778">INTER_DIGITAL</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="869" y="1829">Key = E</text>
<polyline fill="none" points="1468 2056, 1268 2056" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1268" y="2056">GND</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="68" y="836">GND</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1338" y="486">IN7</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1148" y="476">IN6</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="968" y="476">IN5</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="798" y="476">IN4</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="618" y="476">IN3</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="448" y="476">IN2</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="268" y="476">IN1</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="68" y="476">IN0</text>
<polyline fill="none" points="1468 1756, 1068 1756" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1468 1456, 1068 1456" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="2508" x2="2508" y1="1106" y2="1156"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="17" font-weight="700" text-anchor="end" x="2503" y="1146">0</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="2488" x2="2488" y1="1106" y2="1156"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="17" font-weight="700" text-anchor="end" x="2483" y="1146">1</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="2468" x2="2468" y1="1106" y2="1156"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="17" font-weight="700" text-anchor="end" x="2463" y="1146">2</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="2448" x2="2448" y1="1106" y2="1156"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="17" font-weight="700" text-anchor="end" x="2443" y="1146">3</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="2428" x2="2428" y1="1106" y2="1156"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="17" font-weight="700" text-anchor="end" x="2423" y="1146">4</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="2408" x2="2408" y1="1106" y2="1156"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="17" font-weight="700" text-anchor="end" x="2403" y="1146">5</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="2388" x2="2388" y1="1106" y2="1156"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="17" font-weight="700" text-anchor="end" x="2383" y="1146">6</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="2368" x2="2368" y1="1106" y2="1156"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="17" font-weight="700" text-anchor="end" x="2363" y="1146">7</text>
<rect fill="#000000" fill-opacity="0.5" height="50" stroke="#a0a0a4" stroke-width="1" width="160" x="2358" y="1056"/>
<text alignment-baseline="after-edge" fill="#ff0000" font-family="微软雅黑" font-size="30" font-weight="400" text-anchor="start" x="2418" y="1103">00</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="2536" y="1102">2</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="15" font-weight="700" text-anchor="start" x="2368" y="1045">INTER_DIGITAL8</text>
<polyline fill="none" points="2168 1256, 2508 1256, 2508 1156" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="2168 1356, 2488 1356, 2488 1156" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="2168 1456, 2468 1456, 2468 1156" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="3468 1766, 3268 1766" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3268" y="1766">IN7</text>
<polyline fill="none" points="3468 1266, 3268 1266" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3268" y="1266">GND</text>
<polyline fill="none" points="4168 1066, 4468 1066" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="4468" x2="4468" y1="1016" y2="1066"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="4468 1016, 4518 966, 4418 966, 4468 1016" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="30" font-weight="700" text-anchor="start" x="4458" y="1006">1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="4458" y="936">U1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="4398" y="966">DIGITAL1</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="4528" x2="4468" y1="1826" y2="1826"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="4503" y="1826">2</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="4528" x2="4468" y1="1766" y2="1766"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="4503" y="1766">1</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="4628" x2="4688" y1="1796" y2="1796"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="4653" y="1796">3</text>
<polygon fill="#fffcf8" fill-opacity="0.5" points="4528 1736, 4528 1856, 4628 1796, 4528 1736" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="27" font-weight="700" text-anchor="start" x="4531" y="1843">+</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="27" font-weight="700" text-anchor="start" x="4534" y="1782">-</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="4568" y="1756">3</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="4528" y="1906">AMP</text>
<polyline fill="none" points="4168 1766, 4318 1766, 4318 1826, 4468 1826, 4468 2166" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="4168 1866, 4418 1866, 4418 1766, 4468 1766" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="4768 1796, 4688 1796" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="5408 1796, 5568 1796, 5568 2166, 4368 2166" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="4368" x2="4368" y1="2266" y2="2166"/>
<polyline fill="none" points="4318 2266, 4418 2266" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="4338 2282, 4398 2282" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="4358 2297, 4378 2297" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="4378" y="2216"></text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="4338" y="2346">GND</text>
<polyline fill="none" points="3468 1866, 3368 1866, 3368 2066, 4718 2066, 4718 1796" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="2568" x2="2668" y1="1756" y2="1756"/>
<rect fill="#ffffb0" height="100" stroke="#800000" stroke-width="5" width="100" x="2468" y="1706"/>
<polyline fill="none" points="2478 1656, 2558 1656" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="2518 1656, 2518 1706" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="2488 1786, 2518 1786, 2518 1726, 2548 1726" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="2508" y="1643">C3</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="2378" y="1766">SCLK</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="2468" y="1856">Key = A</text>
<polyline fill="none" points="2168 1556, 2668 1556, 2668 1756" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1468 1956, 1268 1956" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1268" y="1956">IN7</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="968" x2="1068" y1="1456" y2="1456"/>
<text alignment-baseline="after-edge" fill="#000080" font-family="微软雅黑" font-size="30" font-weight="700" text-anchor="start" x="908" y="1477">0</text>
<rect fill="#ffffff" fill-opacity="0.5" height="60" stroke="#800000" stroke-width="5" width="100" x="868" y="1426"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="912" y="1417">4</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="829" y="1568">INTER_DIGITAL</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="869" y="1529">Key = S</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="200" font-weight="700" text-anchor="start" x="1768" y="256">ADC0809功能测试电路</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="268" x2="268" y1="556" y2="476"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="268" x2="268" y1="616" y2="696"/>
<polyline fill="none" points="218 556, 318 556" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="248 576, 288 576" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="218 596, 318 596" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="248 616, 288 616" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="319" y="548">V2</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="302" y="654">DC11</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="348" y="596">0.5V</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="448" x2="448" y1="556" y2="476"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="448" x2="448" y1="616" y2="696"/>
<polyline fill="none" points="398 556, 498 556" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="428 576, 468 576" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="398 596, 498 596" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="428 616, 468 616" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="499" y="548">V3</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="482" y="654">DC21</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="528" y="596">1V</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="618" x2="618" y1="556" y2="476"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="618" x2="618" y1="616" y2="696"/>
<polyline fill="none" points="568 556, 668 556" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="598 576, 638 576" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="568 596, 668 596" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="598 616, 638 616" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="669" y="548">V4</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="652" y="654">DC31</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="698" y="596">1.7V</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="798" x2="798" y1="556" y2="476"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="798" x2="798" y1="616" y2="696"/>
<polyline fill="none" points="748 556, 848 556" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="778 576, 818 576" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="748 596, 848 596" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="778 616, 818 616" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="849" y="548">V5</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="832" y="654">DC41</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="878" y="596">2.3V</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="968" x2="968" y1="556" y2="476"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="968" x2="968" y1="616" y2="696"/>
<polyline fill="none" points="918 556, 1018 556" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="948 576, 988 576" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="918 596, 1018 596" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="948 616, 988 616" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1019" y="548">V6</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1002" y="654">DC51</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1048" y="596">3.15V</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1148" x2="1148" y1="556" y2="476"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1148" x2="1148" y1="616" y2="696"/>
<polyline fill="none" points="1098 556, 1198 556" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1128 576, 1168 576" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1098 596, 1198 596" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1128 616, 1168 616" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1199" y="548">V7</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1182" y="654">DC61</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1228" y="596">4.5V</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1338" x2="1338" y1="566" y2="486"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1338" x2="1338" y1="626" y2="706"/>
<polyline fill="none" points="1288 566, 1388 566" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1318 586, 1358 586" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1288 606, 1388 606" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1318 626, 1358 626" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1389" y="558">V8</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1372" y="664">DC71</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1418" y="606">5V</text>
<polyline fill="none" points="68 856, 68 696" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="68 756, 1338 756, 1338 706" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1148 696, 1148 756" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="968 696, 968 756" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="798 696, 798 756" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="618 696, 618 756" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="448 696, 448 746, 448 756" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="268 696, 268 756" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="4888" x2="4768" y1="1796" y2="1796"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="5288" x2="5408" y1="1796" y2="1796"/>
<rect fill="#808080" height="170" stroke="#808080" stroke-width="5" width="400" x="4888" y="1706"/>
<rect fill="#000000" height="100" stroke="#000000" stroke-width="5" width="250" x="4958" y="1746"/>
<text alignment-baseline="central" fill="#00ff00" font-family="微软雅黑" font-size="35" font-weight="700" text-anchor="end" x="5188" y="1796">0.957031</text>
<text alignment-baseline="after-edge" fill="#00ff00" font-family="微软雅黑" font-size="35" font-weight="700" text-anchor="start" x="5218" y="1816">V</text>
<text alignment-baseline="after-edge" fill="#00ff00" font-family="微软雅黑" font-size="35" font-weight="700" text-anchor="start" x="4928" y="1756">+</text>
<text alignment-baseline="after-edge" fill="#00ff00" font-family="微软雅黑" font-size="35" font-weight="700" text-anchor="start" x="5228" y="1756">-</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="5058" y="1698">U2</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="5058" y="1936">V</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="468" x2="568" y1="1856" y2="1856"/>
<rect fill="#ffffb0" height="100" stroke="#800000" stroke-width="5" width="100" x="368" y="1806"/>
<polyline fill="none" points="378 1756, 458 1756" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="418 1756, 418 1806" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="388 1886, 418 1886, 418 1826, 448 1826" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="408" y="1743">C1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="278" y="1866">SCLK</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="368" y="1956">Key = 1</text>
<circle cx="4468" cy="1826" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="4718" cy="1796" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="4468" cy="2166" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="68" cy="756" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="1148" cy="756" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="968" cy="756" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="798" cy="756" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="618" cy="756" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="448" cy="756" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="268" cy="756" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
</svg>
DAC0832 @ b916b418
Subproject commit b916b418cb55c5dd649f96006c5494ab6bd360eb
添加文件
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<svg height="1196" version="1.1" width="2060" xmlns="http://www.w3.org/2000/svg">
<polygon fill="#ffff80" points="36 697, 36 672, 211 672, 236 697, 211 722, 36 722, 36 697" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="36" y="697">A[7..0]</text>
<polyline fill="none" points="1136 717, 936 717, 786 717, 436 717" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1136 747, 936 747, 786 747, 436 747" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1136 777, 936 777, 786 777, 436 777" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="436" y="717">A3</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="436" y="747">A4</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="436" y="777">A5</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1186" x2="1136" y1="817" y2="817"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1232" y="816">G1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1159" y="816">6</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1176" x2="1136" y1="847" y2="847"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1256" y="846">^G2A</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1159" y="848">4</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1176" x2="1136" y1="877" y2="877"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1256" y="876">^G2B</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1158" y="877">5</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1186" x2="1136" y1="717" y2="717"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1213" y="717">A</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1146" y="716">1</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1186" x2="1136" y1="747" y2="747"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1219" y="747">B</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1160" y="747">2</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1186" x2="1136" y1="777" y2="777"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1213" y="777">C</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1147" y="777">3</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1346" x2="1386" y1="697" y2="697"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1307" y="694">Y0</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1355" y="697">15</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1346" x2="1386" y1="727" y2="727"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1307" y="724">Y1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1356" y="727">14</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1346" x2="1386" y1="757" y2="757"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1307" y="754">Y2</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1356" y="757">13</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1346" x2="1386" y1="787" y2="787"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1307" y="784">Y3</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1356" y="787">12</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1346" x2="1386" y1="817" y2="817"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1307" y="814">Y4</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1356" y="817">11</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1346" x2="1386" y1="847" y2="847"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1307" y="844">Y5</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1356" y="847">10</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1346" x2="1386" y1="877" y2="877"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1307" y="874">Y6</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1368" y="877">9</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1346" x2="1386" y1="907" y2="907"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1321" y="906">Y7</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1383" y="907">7</text>
<circle cx="1181" cy="877" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1341" cy="757" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1341" cy="788" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1342" cy="817" fill="#ffffff" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1341" cy="697" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1341" cy="847" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1341" cy="726" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1341" cy="876" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1341" cy="908" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1181" cy="847" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<rect fill="#ffffff" fill-opacity="0.5" height="264" stroke="#000000" stroke-width="5" width="146" x="1188" y="663"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1251" y="654">U1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1189" y="969">74LS138D</text>
<polygon fill="#ffff80" points="36 1147, 36 1122, 161 1122, 186 1147, 161 1172, 36 1172, 36 1147" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="36" y="1147">MIO</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="25" font-weight="400" text-anchor="start" x="16" y="1087">低电平表示访问IO端口</text>
<polygon fill="#ffff80" points="36 397, 36 372, 211 372, 236 397, 211 422, 36 422, 36 397" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="36" y="397">WR_OUT</text>
<polygon fill="#ffff80" points="36 547, 36 522, 211 522, 236 547, 211 572, 36 572, 36 547" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="36" y="547">READ_OUT</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="446" x2="386" y1="337" y2="337"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="446" x2="386" y1="397" y2="397"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="576" x2="636" y1="367" y2="367"/>
<path d="M442 321 C 468 360, 441 410, 441 410, 441 410, 441 410, 441 410" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="442 320, 500 320" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="441 410, 499 410" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<path d="M500 320 C 552 320, 576 367, 576 367" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<path d="M498 410 C 554 410, 576 367, 576 367" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="491" y="310">U3</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="479" y="461">OR</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="446" x2="386" y1="487" y2="487"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="446" x2="386" y1="547" y2="547"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="576" x2="636" y1="517" y2="517"/>
<path d="M442 471 C 468 510, 441 560, 441 560, 441 560, 441 560, 441 560" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="442 470, 500 470" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="441 560, 499 560" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<path d="M500 470 C 552 470, 576 517, 576 517" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<path d="M498 560 C 554 560, 576 517, 576 517" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="491" y="460">U4</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="479" y="611">OR</text>
<polyline fill="none" points="386 547, 236 547" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="386 337, 286 337, 286 487" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polygon fill="#ffff80" points="1836 367, 1836 342, 2011 342, 2036 367, 2011 392, 1836 392, 1836 367" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="367">IOW</text>
<polygon fill="#ffff80" points="1836 517, 1836 492, 2011 492, 2036 517, 2011 542, 1836 542, 1836 517" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="517">IOR</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="125" font-weight="700" text-anchor="start" x="456" y="167">I/O地址译码单元</text>
<polyline fill="none" points="386 397, 236 397" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polygon fill="#ffff80" points="36 487, 36 462, 211 462, 236 487, 211 512, 36 512, 36 487" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="36" y="487">MIO</text>
<polyline fill="none" points="386 487, 236 487" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="646" x2="586" y1="867" y2="867"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="726" x2="786" y1="867" y2="867"/>
<circle cx="722" cy="867" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="646 817, 646 917, 716 867, 646 817" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="666" y="831">U5</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="646" y="963">NOT</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="436" y="867">A6</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="846" x2="786" y1="867" y2="867"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="846" x2="786" y1="927" y2="927"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="976" x2="1036" y1="897" y2="897"/>
<path d="M924 845 A 47 47 0 1 1 924 938" fill="none" stroke="#000000" stroke-linecap="round" stroke-width="5"/>
<polyline fill="none" points="925 939, 846 939, 846 845, 925 845" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="887" y="839">U6</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="870" y="985">AND</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="436" y="927">A7</text>
<polyline fill="none" points="586 867, 436 867" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="786 927, 436 927" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="386" x2="436" y1="767" y2="717"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="386" x2="436" y1="797" y2="747"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="386" x2="436" y1="827" y2="777"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="386" x2="436" y1="917" y2="867"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="386" x2="436" y1="977" y2="927"/>
<polyline fill="none" points="236 697, 386 697, 386 977" stroke="#000080" stroke-linecap="round" stroke-linejoin="round" stroke-width="20"/>
<polyline fill="none" points="1136 817, 1036 817, 1036 897" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="186 1147, 1086 1147, 1086 847, 1136 847" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1386 697, 1836 697" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1386 727, 1836 727" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1386 757, 1836 757" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1386 787, 1836 787" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1386 817, 1836 817" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1386 847, 1836 847" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1386 877, 1836 877" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1386 907, 1836 907" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polygon fill="#ffff80" points="1836 697, 1836 682, 2021 682, 2036 697, 2021 712, 1836 712, 1836 697" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="697">CS0</text>
<polygon fill="#ffff80" points="1836 727, 1836 712, 2021 712, 2036 727, 2021 742, 1836 742, 1836 727" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="727">CS1</text>
<polygon fill="#ffff80" points="1836 757, 1836 742, 2021 742, 2036 757, 2021 772, 1836 772, 1836 757" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="757">CS2</text>
<polygon fill="#ffff80" points="1836 787, 1836 772, 2021 772, 2036 787, 2021 802, 1836 802, 1836 787" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="787">CS3</text>
<polygon fill="#ffff80" points="1836 817, 1836 802, 2021 802, 2036 817, 2021 832, 1836 832, 1836 817" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="817">CS4</text>
<polygon fill="#ffff80" points="1836 847, 1836 832, 2021 832, 2036 847, 2021 862, 1836 862, 1836 847" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="847">CS5</text>
<polygon fill="#ffff80" points="1836 877, 1836 862, 2021 862, 2036 877, 2021 892, 1836 892, 1836 877" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="877">CS6</text>
<polygon fill="#ffff80" points="1836 907, 1836 892, 2021 892, 2036 907, 2021 922, 1836 922, 1836 907" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="907">CS7</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="22" font-weight="400" text-anchor="start" x="1436" y="697">(80H~87H)</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="22" font-weight="400" text-anchor="start" x="1436" y="727">(88H~8FH)</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="22" font-weight="400" text-anchor="start" x="1436" y="757">(90H~97H)</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="22" font-weight="400" text-anchor="start" x="1436" y="787">(98H~9FH)</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="22" font-weight="400" text-anchor="start" x="1436" y="817">(A0H~A7H)</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="22" font-weight="400" text-anchor="start" x="1436" y="847">(A8H~AFH)</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="22" font-weight="400" text-anchor="start" x="1436" y="877">(B0H~B7H)</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="22" font-weight="400" text-anchor="start" x="1436" y="907">(B8H~BFH)</text>
<polyline fill="none" points="636 367, 1836 367" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="636 517, 1836 517" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<circle cx="286" cy="487" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
</svg>
# 说明
IO接口芯片地址译码模块
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<project id="3407fe40-bd78-42b5-914a-e269ea66b67f" name="Lab008" version="1">
<files>
<filefolder id="d7502e9e-b220-4715-a645-2f139d9b4f34" name="MEM">
<file relativepath="MEM\MEM.dlsche"/>
<file relativepath="MEM\ram.asm"/>
<file relativepath="MEM\ram.bat"/>
<file relativepath="MEM\ram.rxm"/>
<file relativepath="MEM\README.md"/>
</filefolder>
<filefolder id="c6ec748e-8eff-4fcb-9ff0-d62ba30af439" name="IO">
<file relativepath="IO\IO.dlsche"/>
<file relativepath="IO\README.md"/>
</filefolder>
<filefolder id="22adc1dc-1488-4ded-9864-ce70b5170f67" name="8086">
<file relativepath="8086\8086.dlsche"/>
<file relativepath="8086\8086.pdf"/>
<file relativepath="8086\ALU.dlsche"/>
<file relativepath="8086\BRANCH.dlsche"/>
<file relativepath="8086\CU.dlsche"/>
<file relativepath="8086\FLAG.dlsche"/>
<file relativepath="8086\PC.dlsche"/>
<file relativepath="8086\README.md"/>
<file relativepath="8086\REGS.dlsche"/>
<file relativepath="8086\rom.bat"/>
<file relativepath="8086\rom.masm"/>
<file relativepath="8086\rom.rxm"/>
<file relativepath="8086\uPC_NEXT.dlsche"/>
</filefolder>
<filefolder id="7a5174ce-3004-46e5-ac55-3f9457bd2998" name="8255">
<file relativepath="8255\8255.dlsche"/>
<file relativepath="8255\8255.pdf"/>
<file relativepath="8255\A0.dlsche"/>
<file relativepath="8255\A2.dlsche"/>
<file relativepath="8255\ac.dlsche"/>
<file relativepath="8255\ACh.dlsche"/>
<file relativepath="8255\AIN1.dlsche"/>
<file relativepath="8255\AOUT1.dlsche"/>
<file relativepath="8255\B0.dlsche"/>
<file relativepath="8255\bc.dlsche"/>
<file relativepath="8255\BCl.dlsche"/>
<file relativepath="8255\BIN1.dlsche"/>
<file relativepath="8255\BOUT1.dlsche"/>
<file relativepath="8255\README.md"/>
<file relativepath="8255\wrc.dlsche"/>
</filefolder>
<filefolder id="2f9f4c28-2aeb-4307-8936-6af065f0d703" name="ADC0809">
<file relativepath="ADC0809\ADC0809.dlsche"/>
<file relativepath="ADC0809\ADC0809.pdf"/>
<file relativepath="ADC0809\DAC.dlsche"/>
<file relativepath="ADC0809\README.md"/>
</filefolder>
<filefolder id="baed96b8-132b-4081-b1e1-818add710ea3" name="DAC0832">
<file relativepath="DAC0832\DAC.dlsche"/>
<file relativepath="DAC0832\DAC0832.dlsche"/>
<file relativepath="DAC0832\DAC0832.pdf"/>
<file relativepath="DAC0832\README.md"/>
</filefolder>
<file relativepath="ADC0809_test.dlsche"/>
<file relativepath="README.md"/>
<file relativepath="top.dlsche"/>
</files>
</project>
添加文件
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<svg height="1454" version="1.1" width="1952" xmlns="http://www.w3.org/2000/svg">
<polygon fill="#ffff80" points="21 402, 21 377, 146 377, 171 402, 146 427, 21 427, 21 402" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="21" y="402">ABUS[7..0]</text>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="422" y2="472"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="442" y2="492"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="462" y2="512"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="482" y2="532"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="502" y2="552"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="522" y2="572"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="542" y2="592"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="562" y2="612"/>
<polyline fill="none" points="271 472, 541 472" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 492, 541 492" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 512, 541 512" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 532, 541 532" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 552, 541 552" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 572, 541 572" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 592, 541 592" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 612, 541 612" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="341" y="472">ABUS0</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="341" y="492">ABUS1</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="341" y="512">ABUS2</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="341" y="532">ABUS3</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="341" y="552">ABUS4</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="341" y="572">ABUS5</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="341" y="592">ABUS6</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="341" y="612">ABUS7</text>
<polygon fill="#ffff80" points="21 682, 21 657, 146 657, 171 682, 146 707, 21 707, 21 682" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="21" y="682">DBUS[7..0]</text>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="862" y2="812"/>
<polyline fill="none" points="541 812, 271 812" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="842" y2="792"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="822" y2="772"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="802" y2="752"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="782" y2="732"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="762" y2="712"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="742" y2="692"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="722" y2="672"/>
<polyline fill="none" points="271 792, 541 792" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 772, 541 772" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 752, 541 752" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 732, 541 732" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 712, 541 712" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 692, 541 692" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 672, 541 672" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="311" y="672">DBUS0</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="311" y="692">DBUS1</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="311" y="712">DBUS2</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="311" y="732">DBUS3</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="311" y="752">DBUS4</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="311" y="772">DBUS5</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="311" y="792">DBUS6</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="311" y="812">DBUS7</text>
<polygon fill="#ffff80" points="21 1112, 21 1087, 146 1087, 171 1112, 146 1137, 21 1137, 21 1112" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="21" y="1112">WR_OUT</text>
<polygon fill="#ffff80" points="21 892, 21 867, 146 867, 171 892, 146 917, 21 917, 21 892" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="21" y="892">CLK</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="22" font-weight="400" text-anchor="start" x="1481" y="472">DBUS0</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="22" font-weight="400" text-anchor="start" x="1481" y="502">DBUS1</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="22" font-weight="400" text-anchor="start" x="1481" y="532">DBUS2</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="22" font-weight="400" text-anchor="start" x="1481" y="562">DBUS3</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="22" font-weight="400" text-anchor="start" x="1481" y="592">DBUS4</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="22" font-weight="400" text-anchor="start" x="1481" y="622">DBUS5</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="22" font-weight="400" text-anchor="start" x="1481" y="652">DBUS6</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="22" font-weight="400" text-anchor="start" x="1481" y="682">DBUS7</text>
<polyline fill="none" points="1431 472, 1631 472" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1431 502, 1631 502" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1431 532, 1631 532" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1431 562, 1631 562" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1431 592, 1631 592" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1431 622, 1631 622" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1431 652, 1631 652" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1431 682, 1631 682" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="1631" x2="1681" y1="472" y2="422"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="1631" x2="1681" y1="502" y2="452"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="1631" x2="1681" y1="532" y2="482"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="1631" x2="1681" y1="562" y2="512"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="1631" x2="1681" y1="592" y2="542"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="1631" x2="1681" y1="622" y2="572"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="1631" x2="1681" y1="652" y2="602"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="1631" x2="1681" y1="682" y2="632"/>
<polyline fill="none" points="791 472, 1181 472" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="791 492, 1081 492, 1081 502, 1181 502" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="791 512, 1061 512, 1061 532, 1181 532" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="791 532, 1041 532, 1041 562, 1181 562" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="791 552, 1011 552, 1011 592, 1181 592" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="791 572, 981 572, 981 622, 1181 622" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="791 592, 951 592, 951 652, 1181 652" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="791 612, 921 612, 921 682, 1181 682" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="150" font-weight="700" text-anchor="start" x="651" y="192">MEM模块</text>
<polygon fill="#ffff80" points="21 1172, 21 1147, 146 1147, 171 1172, 146 1197, 21 1197, 21 1172" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="21" y="1172">MIO</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="681" x2="621" y1="1112" y2="1112"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="681" x2="621" y1="1172" y2="1172"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="811" x2="871" y1="1142" y2="1142"/>
<path d="M677 1096 C 703 1135, 676 1185, 676 1185, 676 1185, 676 1185, 676 1185" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="677 1095, 735 1095" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="676 1185, 734 1185" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<path d="M735 1095 C 787 1095, 811 1142, 811 1142" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<path d="M733 1185 C 789 1185, 811 1142, 811 1142" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="726" y="1085">U1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="714" y="1236">OR</text>
<polygon fill="#ffff80" points="21 1372, 21 1347, 146 1347, 171 1372, 146 1397, 21 1397, 21 1372" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="21" y="1372">READ_OUT</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="681" x2="621" y1="1312" y2="1312"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="681" x2="621" y1="1372" y2="1372"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="811" x2="871" y1="1342" y2="1342"/>
<path d="M677 1296 C 703 1335, 676 1385, 676 1385, 676 1385, 676 1385, 676 1385" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="677 1295, 735 1295" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="676 1385, 734 1385" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<path d="M735 1295 C 787 1295, 811 1342, 811 1342" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<path d="M733 1385 C 789 1385, 811 1342, 811 1342" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="726" y="1285">U2</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="714" y="1436">OR</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="25" font-weight="400" text-anchor="start" x="21" y="1312">MIO为高电平表示访问存储器</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="281" x2="221" y1="1172" y2="1172"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="361" x2="421" y1="1172" y2="1172"/>
<circle cx="357" cy="1172" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="281 1122, 281 1222, 351 1172, 281 1122" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="301" y="1136">U3</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="281" y="1268">NOT</text>
<polyline fill="none" points="221 562, 221 402, 171 402" stroke="#000080" stroke-linecap="round" stroke-linejoin="round" stroke-width="20"/>
<polyline fill="none" points="221 862, 221 682, 171 682" stroke="#000080" stroke-linecap="round" stroke-linejoin="round" stroke-width="20"/>
<polyline fill="none" points="1681 632, 1681 412, 1781 412" stroke="#000080" stroke-linecap="round" stroke-linejoin="round" stroke-width="20"/>
<polygon fill="#ffff80" points="1781 412, 1781 387, 1906 387, 1931 412, 1906 437, 1781 437, 1781 412" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1781" y="412">DBUS[7..0]</text>
<polyline fill="none" points="171 1372, 621 1372" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="221 1172, 171 1172" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="421 1172, 621 1172" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="621 1112, 171 1112" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="621 1312, 521 1312, 521 1172" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="541 892, 171 892" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="871 1142, 921 1142, 921 1012, 471 1012, 471 872, 541 872" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="871 1342, 1121 1342, 1121 742, 1181 742" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="472" y2="472"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="472">A0</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="492" y2="492"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="492">A1</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="512" y2="512"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="512">A2</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="532" y2="532"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="532">A3</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="552" y2="552"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="552">A4</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="572" y2="572"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="572">A5</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="592" y2="592"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="592">A6</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="612" y2="612"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="612">A7</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="672" y2="672"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="672">D0</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="692" y2="692"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="692">D1</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="712" y2="712"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="712">D2</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="732" y2="732"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="732">D3</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="752" y2="752"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="752">D4</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="772" y2="772"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="772">D5</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="792" y2="792"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="792">D6</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="812" y2="812"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="812">D7</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="741" x2="791" y1="472" y2="472"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="708" y="472">Q0</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="741" x2="791" y1="492" y2="492"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="708" y="492">Q1</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="741" x2="791" y1="512" y2="512"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="708" y="512">Q2</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="741" x2="791" y1="532" y2="532"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="708" y="532">Q3</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="741" x2="791" y1="552" y2="552"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="708" y="552">Q4</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="741" x2="791" y1="572" y2="572"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="708" y="572">Q5</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="741" x2="791" y1="592" y2="592"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="708" y="592">Q6</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="741" x2="791" y1="612" y2="612"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="708" y="612">Q7</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="581" x2="541" y1="872" y2="872"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="657" y="872">^W\R</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="892" y2="892"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="644" y="892">CLK</text>
<rect fill="#ff8057" fill-opacity="0.5" height="490" stroke="#000000" stroke-width="5" width="150" x="591" y="442"/>
<polyline fill="none" points="591 882, 601 892, 591 902" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<circle cx="586" cy="872" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="90" font-weight="700" text-anchor="start" x="551" y="432">RAM</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="611" y="972">256RAM1</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1231" x2="1181" y1="472" y2="472"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1264" y="472">A0</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1231" x2="1181" y1="502" y2="502"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1264" y="502">A1</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1231" x2="1181" y1="532" y2="532"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1264" y="532">A2</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1231" x2="1181" y1="562" y2="562"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1264" y="562">A3</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1231" x2="1181" y1="592" y2="592"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1264" y="592">A4</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1231" x2="1181" y1="622" y2="622"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1264" y="622">A5</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1231" x2="1181" y1="652" y2="652"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1264" y="652">A6</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1231" x2="1181" y1="682" y2="682"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1264" y="682">A7</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1381" x2="1431" y1="472" y2="472"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1348" y="472">D0</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1381" x2="1431" y1="502" y2="502"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1348" y="502">D1</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1381" x2="1431" y1="532" y2="532"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1348" y="532">D2</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1381" x2="1431" y1="562" y2="562"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1348" y="562">D3</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1381" x2="1431" y1="592" y2="592"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1348" y="592">D4</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1381" x2="1431" y1="622" y2="622"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1348" y="622">D5</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1381" x2="1431" y1="652" y2="652"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1348" y="652">D6</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1381" x2="1431" y1="682" y2="682"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1348" y="682">D7</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1221" x2="1181" y1="742" y2="742"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1275" y="741">^EN</text>
<rect fill="#a0c0ff" fill-opacity="0.5" height="350" stroke="#000000" stroke-width="5" width="150" x="1231" y="432"/>
<circle cx="1226" cy="742" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1231" y="422">MEM_gate</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1231" y="832">BUS_TRANS8</text>
<circle cx="521" cy="1172" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
</svg>
# 说明
8086 微机系统的MEM主存储器,存储指令和数据
\ No newline at end of file
/*******************************************************************************
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef unsigned char BYTE;
typedef long BOOL;
#define FALSE 0
#define TRUE 1
#define MAX_LINE_LENGTH 256 // 一行代码最多可以有多少个字符
#define MAX_LINE_COUNT 1024 // 源代码文件最多可以有多少行
#define MAX_MACHINE_CODE_BYTE_COUNT 256 // 源代码编译后最多可以有多少个字节机器码
#define MAX_SYMBOL_LENGTH 64 // 一个符号最多可以包含多少个字符
#define MAX_SYMBOL_COUNT 256 // 源代码文件中最多可以包含多少个符号
#ifndef MAX_PATH
#define MAX_PATH 256 // 文件路径最多可以包含多少个字符
#endif
// 代码行数据库。记录源代码文件中所有代码行的信息(包括注释行、空行)
struct LINE_RECORD
{
char line_string[MAX_LINE_LENGTH]; // 代码行的内容
unsigned long line_num; // 行号
unsigned long address; // 此行代码转换的机器码在映像文件中的地址(偏移)
int machine_code_count; // 此行代码转换的机器码的字节数量
unsigned long flag; // 代码行标志位,32位
};
struct LINE_RECORD line_database[MAX_LINE_COUNT] = { 0 };
int line_count = 0;
int machine_code_line_count = 0; // 记录产生了机器码的代码行的数量
// 在此定义所有的代码行标志位。注意,代码行标志位是按位或的关系。
#define LF_INSTRUCTION 0x00000001 // 代码行标志位的最低位是1,表示此行是一条指令,否则表示此行是数据
// 重定位表。如果指令中使用了标号、变量名等符号,在第一次扫描时无法确定他们的地址,需要
// 在第二次扫描时进行重定位。
struct REALLOCATE
{
unsigned long address; // 第一次扫描时,在这里记录了需要重定位的机器码的地址(偏移),
// 第二次扫描时,根据符号的地址进行重定位。
char symbol_name[MAX_SYMBOL_LENGTH]; // 需要重定位的符号名称。
int line_num; // 行号。
};
struct REALLOCATE reallocate_table[MAX_LINE_COUNT] = { 0 };
int reallocate_count = 0;
// 符号表。符号包括源代码中的标号、变量名。
struct SYMBOL
{
char name[MAX_SYMBOL_LENGTH]; // 符号名称
unsigned long address; // 符号表示的地址。重定位时需要用到。
int machine_code_count; // 符号生成的机器码的数量(以字节为单位)。
int line_num; // 行号
int ref_count; // 引用计数
};
struct SYMBOL symbol_table[MAX_SYMBOL_COUNT] = { 0 };
int symbol_count = 0;
// 汇编过程的状态
enum
{
AS_BEGIN // 起始状态。在遇到代码段名称前,处于此状态
, AS_INT_TABLE // 正在处理中断向量列表。遇到向量列表名称后,遇到代码段名称前,处于此状态
, AS_TEXT // 正在处理代码段。遇到代码段名称后,遇到数据的名称前,处于此状态
, AS_DATA // 正在处理数据段。遇到数据段名称后,处于此状态
};
unsigned long assembler_state = AS_BEGIN;
//
// 在下面定义所有的关键字
//
// 段名称
const char* int_table_section_keyword = ".int_table"; // 中断向量列表标志
const char* code_section_keyword = ".text"; // 代码段标志
char const* data_section_keyword = ".data"; // 数据段标志
// 指令名称
const char* mov_instruction_keyword = "mov";
const char* add_instruction_keyword = "add";
const char* adc_instruction_keyword = "adc";
const char* sub_instruction_keyword = "sub";
const char* sbb_instruction_keyword = "sbb";
const char* and_instruction_keyword = "and";
const char* or_instruction_keyword = "or";
const char* xor_instruction_keyword = "xor";
const char* shr_instruction_keyword = "shr";
const char* shl_instruction_keyword = "shl";
const char* rcr_instruction_keyword = "rcr";
const char* rcl_instruction_keyword = "rcl";
const char* sal_instruction_keyword = "sal";
const char* sar_instruction_keyword = "sar";
const char* rol_instruction_keyword = "rol";
const char* ror_instruction_keyword = "ror";
const char* not_instruction_keyword = "not";
const char* push_instruction_keyword = "push";
const char* pop_instruction_keyword = "pop";
const char* in_instruction_keyword = "in";
const char* out_instruction_keyword = "out";
const char* call_instruction_keyword = "call";
const char* ret_instruction_keyword = "ret";
const char* int_instruction_keyword = "int";
const char* iret_instruction_keyword = "iret";
const char* inc_instruction_keyword = "inc";
const char* dec_instruction_keyword = "dec";
const char* lea_instruction_keyword = "lea";
const char* cmp_instruction_keyword = "cmp";
const char* nop_instruction_keyword = "nop";
const char* cli_instruction_keyword = "cli";
const char* sti_instruction_keyword = "sti";
const char* jmp_instruction_keyword = "jmp";
const char* jc_instruction_keyword = "jc";
const char* jz_instruction_keyword = "jz";
const char* je_instruction_keyword = "je";
const char* jne_instruction_keyword = "jne";
const char* jnz_instruction_keyword = "jnz";
// 通用寄存器名称
const char* al_register_keyword = "al";
const char* bl_register_keyword = "bl";
const char* cl_register_keyword = "cl";
const char* dl_register_keyword = "dl";
const char* sp_register_keyword = "sp";
const char* bp_register_keyword = "bp";
const char* si_register_keyword = "si";
const char* di_register_keyword = "di";
const char* cs_register_keyword = "cs";
const char* ds_register_keyword = "ds";
const char* ss_register_keyword = "ss";
const char* es_register_keyword = "es";
const char* al_register_indirect_keyword = "[al]";
const char* bl_register_indirect_keyword = "[bl]";
const char* cl_register_indirect_keyword = "[cl]";
const char* dl_register_indirect_keyword = "[dl]";
const char* sp_register_indirect_keyword = "[sp]";
const char* bp_register_indirect_keyword = "[bp]";
const char* si_register_indirect_keyword = "[si]";
const char* di_register_indirect_keyword = "[di]";
const char* cs_register_indirect_keyword = "[cs]";
const char* ds_register_indirect_keyword = "[ds]";
const char* ss_register_indirect_keyword = "[ss]";
const char* es_register_indirect_keyword = "[es]";
const char* delimit_char = "\n\t\r "; // 需要忽略的空白字符
const char* delimit_char_comma = "\n\t\r, "; // 需要忽略的空白字符,包括英文逗号
// 汇编产生的机器码
#define MAX_MACHINE_CODE 1024
BYTE machine_code[MAX_MACHINE_CODE];
unsigned long machine_code_address = 0;
unsigned long machine_code_old_address = 0;
const char* assembly_file_name = NULL; // 汇编文件路径
const char* target_file_name = NULL; // 目标文件路径
const char* list_file_name = NULL; // 列表文件路径
const char* dbg_file_name = NULL; // 调试信息文件路径
const unsigned long dbg_file_magic = 58;
const unsigned long dbg_file_version = 1;
// 输出汇编过程中发现的语法错误信息
void error_msg(const char* error_msg, int line_num)
{
if (line_num >= 1)
{
printf("%s:%d: error: %s\n", assembly_file_name, line_num, error_msg);
}
else
{
printf("%s: error: %s\n", assembly_file_name, error_msg);
}
exit(1);
}
char formated_msg[1024]; // 将格式化后的错误信息放在此字符串中。
void error_msg_miss_op(const char* instruction_name, int line_num)
{
sprintf(formated_msg, "%s 指令缺少操作数。", instruction_name);
error_msg(formated_msg, line_num);
}
void error_msg_wrong_op(const char* instruction_name, int line_num)
{
sprintf(formated_msg, "%s 指令不支持这样的操作数。", instruction_name);
error_msg(formated_msg, line_num);
}
void error_msg_same_symbol(const char* symbol, int line_num, int ref_line_num)
{
sprintf(formated_msg, "符号 %s 重复定义。参见第 %d 行。", symbol, ref_line_num);
error_msg(formated_msg, line_num);
}
void error_msg_keyword_symbol(const char* symbol, int line_num)
{
sprintf(formated_msg, "不能使用保留的关键字 %s 作为符号名称。", symbol);
error_msg(formated_msg, line_num);
}
void error_msg_keyword_int_vector(const char* vector, int line_num)
{
sprintf(formated_msg, "不能使用保留的关键字 %s 作为中断向量名称。", vector);
error_msg(formated_msg, line_num);
}
void error_msg_wrong_data(const char* data, int line_num)
{
sprintf(formated_msg, "%s 不是有效的数据。", data);
error_msg(formated_msg, line_num);
}
// 输出汇编过程中发现的警告信息
void warning_msg(const char* warning_msg, int line_num)
{
if (line_num >= 1)
{
printf("%s:%d: warning: %s\n", assembly_file_name, line_num, warning_msg);
}
else
{
printf("%s: warning: %s\n", assembly_file_name, warning_msg);
}
}
void warning_msg_invalid_line(int line_num)
{
warning_msg("忽略无效的代码行。", line_num);
}
void warning_msg_unref_symbol(const char* symbol, int line_num)
{
sprintf(formated_msg, "符号 %s 未被引用。", symbol);
warning_msg(formated_msg, line_num);
}
// 判断是否是立即数。如果是数字开头,或者是负号开头的,就认为是立即数。
int is_immediate(const char* token)
{
return (isdigit(token[0]) || '-' == token[0]) ? 1 : 0;
}
// 判断是否是立即数地址。类如,[4]
int is_immediate_address(const char* token)
{
// 最后一个字符必须是"]"
if (token[strlen(token) - 1] != ']')
{
return 0;
}
// 第一个字符必须是"["
if (token[0] != '[')
{
return 0;
}
// 后面的字符必须是数字开头
return (isdigit(token[1]) || ' ' == token[1]) ? 1 : 0;
}
// 判断是否是主存数据
int is_main_memory(const char* token)
{
return (isdigit(token[0]) || '@' == token[0]) ? 1 : 0;
}
// 指令操作数类型
enum
{
OT_REGISTER_AL // al
, OT_REGISTER_BL // bl
, OT_REGISTER_CL // cl
, OT_REGISTER_DL // dl
, OT_REGISTER_SP // sp
, OT_REGISTER_BP // bp
, OT_REGISTER_SI // si
, OT_REGISTER_DI // di
, OT_REGISTER_CS // cs
, OT_REGISTER_DS // ds
, OT_REGISTER_SS // ss
, OT_REGISTER_ES // es
, OT_REGISTER_AL_INDIRECT // [al]
, OT_REGISTER_BL_INDIRECT // [bl]
, OT_REGISTER_CL_INDIRECT // [cl]
, OT_REGISTER_DL_INDIRECT // [dl]
, OT_REGISTER_SP_INDIRECT // [sp]
, OT_REGISTER_BP_INDIRECT // [bp]
, OT_REGISTER_SI_INDIRECT // [si]
, OT_REGISTER_DI_INDIRECT // [di]
, OT_REGISTER_CS_INDIRECT // [cs]
, OT_REGISTER_DS_INDIRECT // [ds]
, OT_REGISTER_SS_INDIRECT // [ss]
, OT_REGISTER_ES_INDIRECT // [es]
, OT_IMMEDIATE // 立即数
, OT_SYMBOL // 符号
};
// 得到指令操作数的类型
unsigned long get_operand_type(const char* op)
{
unsigned long op_type;
if (stricmp(op, al_register_keyword) == 0)
{
op_type = OT_REGISTER_AL;
}
else if (stricmp(op, bl_register_keyword) == 0)
{
op_type = OT_REGISTER_BL;
}
else if (stricmp(op, cl_register_keyword) == 0)
{
op_type = OT_REGISTER_CL;
}
else if (stricmp(op, dl_register_keyword) == 0)
{
op_type = OT_REGISTER_DL;
}
else if (stricmp(op, sp_register_keyword) == 0)
{
op_type = OT_REGISTER_SP;
}
else if (stricmp(op, bp_register_keyword) == 0)
{
op_type = OT_REGISTER_BP;
}
else if (stricmp(op, si_register_keyword) == 0)
{
op_type = OT_REGISTER_SI;
}
else if (stricmp(op, di_register_keyword) == 0)
{
op_type = OT_REGISTER_DI;
}
else if (stricmp(op, cs_register_keyword) == 0)
{
op_type = OT_REGISTER_CS;
}
else if (stricmp(op, ds_register_keyword) == 0)
{
op_type = OT_REGISTER_DS;
}
else if (stricmp(op, ss_register_keyword) == 0)
{
op_type = OT_REGISTER_SS;
}
else if (stricmp(op, es_register_keyword) == 0)
{
op_type = OT_REGISTER_ES;
}
else if (stricmp(op, al_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_AL_INDIRECT;
}
else if (stricmp(op, bl_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_BL_INDIRECT;
}
else if (stricmp(op, cl_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_CL_INDIRECT;
}
else if (stricmp(op, dl_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_DL_INDIRECT;
}
else if (stricmp(op, sp_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_SP_INDIRECT;
}
else if (stricmp(op, bp_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_BP_INDIRECT;
}
else if (stricmp(op, si_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_SI_INDIRECT;
}
else if (stricmp(op, di_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_DI_INDIRECT;
}
else if (stricmp(op, cs_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_CS_INDIRECT;
}
else if (stricmp(op, ds_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_DS_INDIRECT;
}
else if (stricmp(op, ss_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_SS_INDIRECT;
}
else if (stricmp(op, es_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_ES_INDIRECT;
}
else if (is_immediate(op))
{
op_type = OT_IMMEDIATE;
}
else
{
op_type = OT_SYMBOL;
}
return op_type;
}
// 根据寄存器,得到一个机器码
char get_machine_code_from_r(unsigned long op_type)
{
return (char)(op_type - OT_REGISTER_AL);
}
// 根据通用寄存器和机器码的基础值,得到一个机器码
char get_machine_code_from_r_indirect(unsigned long op_type)
{
return (char)(op_type - OT_REGISTER_AL_INDIRECT);
}
// 根据立即数得到一个机器码。注意,允许使用负数,所以返回值是带符号的 8 位 char。
char get_machine_code_from_immediate(const char* immediate)
{
char* end;
int start_index = (immediate[0] == '-' ? 1 : 0);
int base = (immediate[start_index] == '0' && (immediate[start_index + 1] == 'x' || immediate[start_index + 1] == 'X')) ? 16 : 10;
return (char)strtol(immediate, &end, base);
}
// 根据立即数地址得到一个机器码。首先去除中括号,再将立即数转换为带符号的8位字符。
char get_machine_code_from_immediate_address(const char* immediate)
{
char d[7];
int i = 0;
int t = strlen(immediate);
for (; i < t - 2; i++)
{
d[i] = immediate[i + 1];
}
char* temp;
int base = (immediate[1] == '0' && (immediate[2] == 'x' || immediate[2] == 'X')) ? 16 : 10;
return (char)strtol(d, &temp, base);
}
// 向重定位表中添加一个重定位信息
void add_reallocate(const char* symbol, int line_num)
{
reallocate_table[reallocate_count].address = machine_code_address;
strcpy(reallocate_table[reallocate_count].symbol_name, symbol);
reallocate_table[reallocate_count].line_num = line_num;
reallocate_count++;
}
//////////////////////////////////////////////////////////////////////////////////////
// 汇编指令编译函数
// mov op1, op2
//
void parse_mov(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(mov_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_ES)
&& OT_IMMEDIATE == op2_type)
{
// mov reg, immediate
// 操作码
machine_code[machine_code_address] = 0x01;
machine_code_address++;
// reg为目的寄存器操作数
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数机器码
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_ES)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_ES))
{
// mov reg, reg
// 操作码
machine_code[machine_code_address] = 0x02;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_ES) && OT_SYMBOL == op2_type)
{
// mov reg, symbol
// 操作码
machine_code[machine_code_address] = 0x03;
machine_code_address++;
// 目的操作数机器码
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_ES)
&& (op2_type >= OT_REGISTER_AL_INDIRECT && op2_type <= OT_REGISTER_ES_INDIRECT))
{
// mov reg, [reg]
// 操作码
machine_code[machine_code_address] = 0x04;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r_indirect(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL_INDIRECT && op1_type <= OT_REGISTER_ES_INDIRECT)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_ES))
{
// mov [reg], reg
// 操作码
machine_code[machine_code_address] = 0x05;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r_indirect(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL_INDIRECT && op1_type <= OT_REGISTER_ES_INDIRECT) && OT_IMMEDIATE == op2_type)
{
// mov [reg], immediate
// 操作码
machine_code[machine_code_address] = 0x06;
machine_code_address++;
// 目的操作数
machine_code[machine_code_address] = get_machine_code_from_r_indirect(op1_type);
machine_code_address++;
// 立即数机器码
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else if (OT_SYMBOL == op1_type && (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_ES))
{
// mov symbol, reg
machine_code[machine_code_address] = 0x07;
machine_code_address++;
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
machine_code[machine_code_address] = rs;
machine_code_address++;
// 重定位
add_reallocate(op1, line_num);
machine_code_address++;
}
else
{
error_msg_wrong_op(mov_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////////////////////////
// 加法指令
// add op1, op2
void parse_add(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(add_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// add reg, reg
// 操作码
machine_code[machine_code_address] = 0x08;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL_INDIRECT && op2_type <= OT_REGISTER_DI_INDIRECT))
{
// add reg, [reg]
// 操作码
machine_code[machine_code_address] = 0x0a;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r_indirect(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_SYMBOL == op2_type)
{
// add reg, symbol
// 操作码
machine_code[machine_code_address] = 0x0c;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_IMMEDIATE == op2_type)
{
// add reg, immediate
machine_code[machine_code_address] = 0x0e;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else
{
error_msg_wrong_op(add_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
// 带进位的加法指令
// adc op1, op2
void parse_adc(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(adc_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// adc reg, reg
// 操作码
machine_code[machine_code_address] = 0x10;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL_INDIRECT && op2_type <= OT_REGISTER_DI_INDIRECT))
{
// adc reg, [reg]
// 操作码
machine_code[machine_code_address] = 0x12;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r_indirect(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_SYMBOL == op2_type)
{
// adc reg, symbol
// 操作码
machine_code[machine_code_address] = 0x14;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_IMMEDIATE == op2_type)
{
// adc reg, immediate
machine_code[machine_code_address] = 0x16;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else
{
error_msg_wrong_op(adc_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
////////////////////////////////////////////////////////////////////////////////////////////
// 减法指令
// sub op1, op2
void parse_sub(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(sub_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// sub reg, reg
// 操作码
machine_code[machine_code_address] = 0x18;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL_INDIRECT && op2_type <= OT_REGISTER_DI_INDIRECT))
{
// sub reg, [reg]
// 操作码
machine_code[machine_code_address] = 0x1a;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r_indirect(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_SYMBOL == op2_type)
{
// sub reg, symbol
// 操作码
machine_code[machine_code_address] = 0x1c;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_IMMEDIATE == op2_type)
{
// sub reg, immediate
machine_code[machine_code_address] = 0x1e;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else
{
error_msg_wrong_op(sub_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 借位减法指令
// sbb op1, op2
void parse_sbb(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(sbb_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// sbb reg, reg
// 操作码
machine_code[machine_code_address] = 0x20;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL_INDIRECT && op2_type <= OT_REGISTER_DI_INDIRECT))
{
// sbb reg, [reg]
// 操作码
machine_code[machine_code_address] = 0x22;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r_indirect(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_SYMBOL == op2_type)
{
// sbb reg, symbol
// 操作码
machine_code[machine_code_address] = 0x24;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_IMMEDIATE == op2_type)
{
// sbb reg, immediate
machine_code[machine_code_address] = 0x26;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else
{
error_msg_wrong_op(sbb_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
/////////////////////////////////////////////////////////////////////////////////////////
// 增减1指令
// inc reg
void parse_inc(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(inc_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (op_type >= OT_REGISTER_AL && op_type <= OT_REGISTER_DI)
{
//
machine_code[machine_code_address] = 0x78;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op_type);
machine_code_address++;
}
else
{
error_msg_wrong_op(inc_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// dec reg
void parse_dec(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(dec_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (op_type >= OT_REGISTER_AL && op_type <= OT_REGISTER_DI)
{
//
machine_code[machine_code_address] = 0x79;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op_type);
machine_code_address++;
}
else
{
error_msg_wrong_op(dec_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////////////////////////////////////////////
// 按位与指令
// and op1, op2
void parse_and(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(and_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// and reg, reg
// 操作码
machine_code[machine_code_address] = 0x2a;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL_INDIRECT && op2_type <= OT_REGISTER_DI_INDIRECT))
{
// and reg, [reg]
// 操作码
machine_code[machine_code_address] = 0x2c;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r_indirect(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_SYMBOL == op2_type)
{
// and reg, symbol
// 操作码
machine_code[machine_code_address] = 0x2e;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_IMMEDIATE == op2_type)
{
// and reg, immediate
machine_code[machine_code_address] = 0x30;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else
{
error_msg_wrong_op(and_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
/////////////////////////////////////////////////////////////////////////////////////
// 按位或指令
// or op1, op2
void parse_or(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(or_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// or reg, reg
// 操作码
machine_code[machine_code_address] = 0x32;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL_INDIRECT && op2_type <= OT_REGISTER_DI_INDIRECT))
{
// or reg, [reg]
// 操作码
machine_code[machine_code_address] = 0x34;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r_indirect(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_SYMBOL == op2_type)
{
// or reg, symbol
// 操作码
machine_code[machine_code_address] = 0x36;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_IMMEDIATE == op2_type)
{
// or reg, immediate
machine_code[machine_code_address] = 0x38;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else
{
error_msg_wrong_op(or_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
/////////////////////////////////////////////////////////////////////////////////////
// 按位异或指令
// xor op1, op2
void parse_xor(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(xor_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// xor reg, reg
// 操作码
machine_code[machine_code_address] = 0x3a;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL_INDIRECT && op2_type <= OT_REGISTER_DI_INDIRECT))
{
// xor reg, [reg]
// 操作码
machine_code[machine_code_address] = 0x3c;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r_indirect(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_SYMBOL == op2_type)
{
// xor reg, symbol
// 操作码
machine_code[machine_code_address] = 0x3e;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_IMMEDIATE == op2_type)
{
// xor reg, immediate
machine_code[machine_code_address] = 0x40;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else
{
error_msg_wrong_op(xor_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
////////////////////////////////////////////////////
//
// push reg
void parse_push(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char_comma);
if (NULL == op)
{
error_msg_miss_op(push_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (op_type >= OT_REGISTER_AL && op_type <= OT_REGISTER_ES)
{
machine_code[machine_code_address] = 0x42;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op_type);
machine_code_address++;
}
else
{
error_msg_wrong_op(push_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
/////////////////////////////////////////////////////////////////
//
// pop reg
void parse_pop(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char_comma);
if (NULL == op)
{
error_msg_miss_op(pop_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (op_type >= OT_REGISTER_AL && op_type <= OT_REGISTER_ES)
{
machine_code[machine_code_address] = 0x43;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op_type);
machine_code_address++;
}
else
{
error_msg_wrong_op(pop_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////////////////////////
//
// not reg
void parse_not(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(not_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
// 目标操作数只能是通用寄存器
if (op_type >= OT_REGISTER_AL && op_type <= OT_REGISTER_DI)
{
machine_code[machine_code_address] = 0x44;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op_type);
machine_code_address++;
}
else
{
error_msg_wrong_op(not_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////////////////////
//
// cmp op1, op2
void parse_cmp(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(cmp_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_IMMEDIATE == op2_type)
{
// cmp reg, immediate
machine_code[machine_code_address] = 0x47;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// cmp reg, reg
// 操作码
machine_code[machine_code_address] = 0x49;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(xor_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////////////
//
// 接口访问指令
// in op1, op2
void parse_in(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(in_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if (OT_REGISTER_AL == op1_type && OT_IMMEDIATE == op2_type)
{
// in al, imm
machine_code[machine_code_address] = 0x4b;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else if (OT_REGISTER_AL == op1_type && OT_REGISTER_DL == op2_type)
{
// in al, dl
machine_code[machine_code_address] = 0x4c;
machine_code_address++;
//
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
rd = get_machine_code_from_r(op1_type);
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(in_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// out op1, op2
void parse_out(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(out_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if (OT_REGISTER_DL == op1_type && OT_REGISTER_AL == op2_type)
{
// out dl, al
machine_code[machine_code_address] = 0x4d;
machine_code_address++;
//
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
rd = get_machine_code_from_r(op1_type);
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if (OT_IMMEDIATE == op1_type && OT_REGISTER_AL == op2_type)
{
// out imm, al
machine_code[machine_code_address] = 0x4e;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op2_type);
machine_code_address++;
machine_code[machine_code_address] = get_machine_code_from_immediate(op1);
machine_code_address++;
}
else
{
error_msg_wrong_op(out_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
///////////////////////////////////////////////////////
//
// lea reg, symbol
void parse_lea(int line_num)
{
char *op1, *op2;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(lea_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_SYMBOL == op2_type)
{
// lea reg, symbol
machine_code[machine_code_address] = 0x4f;
machine_code_address++;
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else
{
error_msg_wrong_op(lea_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////
//
// jz/je symbol
void parse_jz(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(jz_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (OT_SYMBOL == op_type)
{
// jz symbol
machine_code[machine_code_address] = 0x54;
machine_code_address++;
// 重定位
add_reallocate(op, line_num);
machine_code_address++;
}
else
{
error_msg_wrong_op(jz_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////
//
// jnz/jne symbol
void parse_jnz(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(jnz_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (OT_SYMBOL == op_type)
{
machine_code[machine_code_address] = 0x55;
machine_code_address++;
// 重定位
add_reallocate(op, line_num);
machine_code_address++;
}
else
{
error_msg_wrong_op(jnz_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////
//
// jc symbol
void parse_jc(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(jc_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (OT_SYMBOL == op_type)
{
machine_code[machine_code_address] = 0x56;
machine_code_address++;
// 重定位
add_reallocate(op, line_num);
machine_code_address++;
}
else
{
error_msg_wrong_op(jc_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////////
// jmp symbol
void parse_jmp(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(jmp_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (OT_SYMBOL == op_type)
{
// jmp symbol
machine_code[machine_code_address] = 0x57;
machine_code_address++;
// 重定位
add_reallocate(op, line_num);
machine_code_address++;
}
else
{
error_msg_wrong_op(jmp_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
////////////////////////////////////////////////////////////////////////////////////
//
// int immediate
void parse_int(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(int_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (OT_IMMEDIATE == op_type)
{
// int immediate
machine_code[machine_code_address] = 0x5a;
machine_code_address++;
//
machine_code[machine_code_address] = 0xB4;
machine_code_address++;
machine_code[machine_code_address] = get_machine_code_from_immediate(op);
machine_code_address++;
}
else
{
error_msg_wrong_op(int_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// iret
void parse_iret(int line_num)
{
machine_code[machine_code_address] = 0x5d;
machine_code_address++;
//
machine_code[machine_code_address] = 0x44;
machine_code_address++;
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
/////////////////////////////////////////////////////////////////
//
// 移位指令
// sal op1, op2
void parse_sal(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(sal_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// 操作码
machine_code[machine_code_address] = 0x5f;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(sal_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// sar op1, op2
void parse_sar(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(sar_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// 操作码
machine_code[machine_code_address] = 0x61;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(sar_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// shl op1, op2
void parse_shl(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(shl_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// 操作码
machine_code[machine_code_address] = 0x63;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(shl_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// shr op1, op2
void parse_shr(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(shr_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// 操作码
machine_code[machine_code_address] = 0x65;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(shr_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// rol op1, op2
void parse_rol(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(rol_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// 操作码
machine_code[machine_code_address] = 0x67;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(rol_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// ror op1, op2
void parse_ror(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(ror_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// 操作码
machine_code[machine_code_address] = 0x69;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(ror_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// rcl op1, op2
void parse_rcl(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(rcl_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// 操作码
machine_code[machine_code_address] = 0x6b;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(rcl_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// rcr op1, op2
void parse_rcr(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(rcr_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// 操作码
machine_code[machine_code_address] = 0x6d;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(rcr_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////////////////////////
//
// nop
void parse_nop(int line_num)
{
machine_code[machine_code_address] = 0x6f;
machine_code_address++;
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////////////////////////
//
// call symbol
void parse_call(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(call_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (OT_SYMBOL == op_type)
{
// call symbol
machine_code[machine_code_address] = 0x71;
machine_code_address++;
// 重定位
add_reallocate(op, line_num);
machine_code_address++;
}
else
{
error_msg_wrong_op(call_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
/////////////////////////////////////////////////////////////////////////////
//
// ret
void parse_ret(int line_num)
{
machine_code[machine_code_address] = 0x73;
machine_code_address++;
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
/////////////////////////////////////////////////////////////////////////////
//
// cli
void parse_cli(int line_num)
{
machine_code[machine_code_address] = 0x74;
machine_code_address++;
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
/////////////////////////////////////////////////////////////////////////////
//
// sti
void parse_sti(int line_num)
{
machine_code[machine_code_address] = 0x75;
machine_code_address++;
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// 向符号表中添加一个符号
void add_symbol(const char* symbol, int line_num)
{
int i;
// 符号名称不能重复
for (i = 0; i < symbol_count; i++)
{
if (stricmp(symbol, symbol_table[i].name) == 0)
{
error_msg_same_symbol(symbol, line_num, symbol_table[i].line_num);
}
}
// 符号数量有限
if (symbol_count == MAX_SYMBOL_COUNT)
{
sprintf(formated_msg, "定义了太多的符号。最多可以定义 %d 个符号。", MAX_SYMBOL_COUNT);
error_msg(formated_msg, line_num);
}
// 添加符号
strcpy(symbol_table[symbol_count].name, symbol);
symbol_table[symbol_count].address = machine_code_address;
symbol_table[symbol_count].line_num = line_num;
symbol_count++;
}
// 解析符号
void parse_symbol(const char* symbol_with_colon, int line_num)
{
char symbol[MAX_SYMBOL_LENGTH];
char* token;
// 删除符号末尾的冒号
strcpy(symbol, symbol_with_colon);
symbol[strlen(symbol) - 1] = 0;
if (AS_TEXT == assembler_state)
{
// 代码段中的标号作为符号。记录到符号表中,不产生机器码。
add_symbol(symbol, line_num);
// 标号必须单独占一行,否则报错
if (strtok(NULL, delimit_char) != NULL)
{
error_msg("标号必须单独占用一行。", line_num);
}
}
else if (AS_DATA == assembler_state)
{
// 数据段中的变量作为符号。一个变量可以包含多个字节数据。记录到符号表中,产生机器码。
add_symbol(symbol, line_num);
while ((token = strtok(NULL, delimit_char)) != NULL)
{
if (!is_immediate(token))
{
error_msg_wrong_data(token, line_num);
}
machine_code[machine_code_address] = get_machine_code_from_immediate(token);
machine_code_address++;
symbol_table[symbol_count - 1].machine_code_count++;
}
}
else
{
warning_msg_invalid_line(line_num);
}
}
// 解析中断向量
void parse_int_vector(const char* symbol_with_colon, int line_num)
{
char symbol[MAX_SYMBOL_LENGTH];
char* token;
if (AS_INT_TABLE == assembler_state)
{
// 重定位
add_reallocate(symbol_with_colon, line_num);
machine_code_address++;
// 中断向量必须单独占一行,否则报错
if (strtok(NULL, delimit_char) != NULL)
{
error_msg("中断向量必须单独占用一行。", line_num);
}
}
}
// 解析中断向量表开始标志
void parse_int_table_section_keyword(int line_num)
{
// 中断向量表标志
if (AS_TEXT == assembler_state)
{
error_msg("中断向量表不能定义在代码段的后面。", line_num);
}
else if (AS_INT_TABLE == assembler_state)
{
error_msg("定义了重复的中断向量列表。", line_num);
}
assembler_state = AS_INT_TABLE;
}
// 解析代码段开始标志
void parse_code_section_keyword(int line_num)
{
// 代码段标志
if (AS_DATA == assembler_state)
{
error_msg("代码段不能定义在数据段的后面。", line_num);
}
else if (AS_TEXT == assembler_state)
{
error_msg("定义了重复的代码段。", line_num);
}
//若当前地址小于0x10,则补充空行
for (; machine_code_address < 0x10;)
{
line_database[line_count].line_num = line_num;
line_database[line_count].address = machine_code_address;
machine_code_address++;
machine_code_old_address++;
}
// 代码段的起始地址为0x10
assembler_state = AS_TEXT;
}
// 解析数据段开始标志
void parse_data_section_keyword(int line_num)
{
// 数据段标志
if (AS_DATA == assembler_state)
{
error_msg("定义了重复的数据段。", line_num);
}
else if (AS_BEGIN == assembler_state)
{
error_msg("数据段不能定义在代码段的前面。", line_num);
}
assembler_state = AS_DATA;
}
// 定义关键字和解析函数的对应关系
typedef void(*PARSE_FUNCTION)(int line_num);
struct KEYWORD_FUNCTION_ENTRY
{
const char** keyword;
PARSE_FUNCTION parse_function;
};
//
// 必须将关键字及其解析函数放在下面的表中。从而可以使用“表驱动”的编程模式。
//
struct KEYWORD_FUNCTION_ENTRY keyword_function_table[] =
{
{ NULL, NULL } // 未用
,{ &int_table_section_keyword, parse_int_table_section_keyword }
,{ &code_section_keyword, parse_code_section_keyword }
,{ &data_section_keyword, parse_data_section_keyword }
,{ &mov_instruction_keyword, parse_mov }
,{ &jmp_instruction_keyword, parse_jmp }
,{ &add_instruction_keyword, parse_add }
,{ &adc_instruction_keyword, parse_adc }
,{ &sub_instruction_keyword, parse_sub }
,{ &sbb_instruction_keyword, parse_sbb }
,{ &and_instruction_keyword, parse_and }
,{ &or_instruction_keyword, parse_or }
,{ &jc_instruction_keyword, parse_jc }
,{ &jz_instruction_keyword, parse_jz }
,{ &je_instruction_keyword, parse_jz }
,{ &jnz_instruction_keyword, parse_jnz }
,{ &jne_instruction_keyword, parse_jnz }
,{ &call_instruction_keyword, parse_call }
,{ &push_instruction_keyword, parse_push }
,{ &pop_instruction_keyword, parse_pop }
,{ &in_instruction_keyword, parse_in }
,{ &out_instruction_keyword, parse_out }
,{ &ret_instruction_keyword, parse_ret }
,{ &shr_instruction_keyword, parse_shr }
,{ &shl_instruction_keyword, parse_shl }
,{ &rcr_instruction_keyword, parse_rcr }
,{ &rcl_instruction_keyword, parse_rcl }
,{ &sal_instruction_keyword, parse_sal }
,{ &sar_instruction_keyword, parse_sar }
,{ &rol_instruction_keyword, parse_rol }
,{ &ror_instruction_keyword, parse_ror }
,{ &not_instruction_keyword, parse_not }
,{ &iret_instruction_keyword, parse_iret }
,{ &nop_instruction_keyword, parse_nop }
,{ &int_instruction_keyword, parse_int }
,{ &lea_instruction_keyword, parse_lea }
,{ &inc_instruction_keyword, parse_inc }
,{ &dec_instruction_keyword, parse_dec }
,{ &cmp_instruction_keyword, parse_cmp }
,{ &cli_instruction_keyword, parse_cli }
,{ &sti_instruction_keyword, parse_sti }
,{ &al_register_keyword, NULL }
,{ &bl_register_keyword, NULL }
,{ &cl_register_keyword, NULL }
,{ &dl_register_keyword, NULL }
,{ &sp_register_keyword, NULL }
,{ &bp_register_keyword, NULL }
,{ &si_register_keyword, NULL }
,{ &di_register_keyword, NULL }
,{ &cs_register_keyword, NULL }
,{ &ds_register_keyword, NULL }
,{ &ss_register_keyword, NULL }
,{ &es_register_keyword, NULL }
,{ &al_register_indirect_keyword, NULL }
,{ &bl_register_indirect_keyword, NULL }
,{ &cl_register_indirect_keyword, NULL }
,{ &dl_register_indirect_keyword, NULL }
,{ &sp_register_indirect_keyword, NULL }
,{ &bp_register_indirect_keyword, NULL }
,{ &si_register_indirect_keyword, NULL }
,{ &di_register_indirect_keyword, NULL }
,{ &cs_register_indirect_keyword, NULL }
,{ &ds_register_indirect_keyword, NULL }
,{ &ss_register_indirect_keyword, NULL }
,{ &es_register_indirect_keyword, NULL }
};
// 判断是否是一个关键字。返回0,不是关键字;返回非0,是关键字,并且返回值就是关键字在表中的下标。
int match_keyword(const char* token)
{
int i;
for (i = 1; i < sizeof(keyword_function_table) / sizeof(keyword_function_table[0]); i++)
{
if (stricmp(token, *keyword_function_table[i].keyword) == 0)
{
return i;
}
}
return 0;
}
// 判断是否是一个符号
int is_symbol(const char* token, int line_num)
{
int i;
char symbol_name[MAX_SYMBOL_LENGTH];
// 最后一个字符必须是冒号
if (token[strlen(token) - 1] != ':')
{
return 0;
}
// 第一个字符必须是字母或者下划线
if (token[0] != '_' && !isalpha(token[0]))
{
return 0;
}
// 后面的字符必须是字母、数字、下划线
for (i = 0; i < (int)strlen(token) - 2; i++)
{
if (token[i] != '_' && !isalpha(token[i]) && !isdigit(token[i]))
{
return 0;
}
}
// 不能与关键字相同
strcpy(symbol_name, token);
symbol_name[strlen(symbol_name) - 1] = 0;
if (match_keyword(symbol_name) != 0)
{
error_msg_keyword_symbol(symbol_name, line_num);
}
return 1;
}
// 判断是否是一个中断向量
int is_int_vector(const char* token, int line_num)
{
int i;
char vector_name[MAX_SYMBOL_LENGTH];
// 第一个字符必须是字母或者下划线
if (token[0] != '_' && !isalpha(token[0]))
{
return 0;
}
// 后面的字符必须是字母、数字、下划线
for (i = 0; i < (int)strlen(token) - 2; i++)
{
if (token[i] != '_' && !isalpha(token[i]) && !isdigit(token[i]))
{
return 0;
}
}
// 不能与关键字相同
strcpy(vector_name, token);
if (match_keyword(vector_name) != 0)
{
error_msg_keyword_int_vector(vector_name, line_num);
}
return 1;
}
// 输出版本信息
void version_msg()
{
printf(
"Engintime 8086 汇编器 [版本 2.0]\n"
);
}
// 输出帮助信息
void help_msg()
{
printf(
"Engintime 8086 汇编器。\n\n"
"用法:\n\n"
" dmasm.exe assembly_file_name [options]\n\n"
"选项:\n\n"
" -g debug_file_name\t指定生成的调试信息文件路径。\n"
" -h\t\t\t打印此帮助信息。\n"
" -l list_file_name\t指定生成的列表文件路径。\n"
" -o target_file_name\t指定生成的目标文件路径。若未指定,默认生成 a.obj 文件。\n"
" -v\t\t\t打印版本信息。\n"
);
printf("\n");
version_msg();
exit(1);
}
void argument_error_msg()
{
printf("命令行参数错误。\n\n");
help_msg();
}
// 处理器用户输入的命令行参数
void process_argument(int argc, char* argv[])
{
int i;
// argv[0] 是 "easm.exe",所以可以忽略。
for (i = 1; i < argc; i++)
{
if (strcmp(argv[i], "-v") == 0)
{
version_msg();
exit(1);
}
else if (strcmp(argv[i], "-h") == 0)
{
help_msg();
}
else if (strcmp(argv[i], "-o") == 0)
{
if (i + 1 < argc)
{
i++;
target_file_name = argv[i];
}
else
{
argument_error_msg();
}
}
else if (strcmp(argv[i], "-l") == 0)
{
if (i + 1 < argc)
{
i++;
list_file_name = argv[i];
}
else
{
argument_error_msg();
}
}
else if (strcmp(argv[i], "-g") == 0)
{
if (i + 1 < argc)
{
i++;
dbg_file_name = argv[i];
}
else
{
argument_error_msg();
}
}
else if (NULL == assembly_file_name && argv[i][0] != '-')
{
// 输入的汇编源代码文件路径。
assembly_file_name = argv[i];
}
else
{
argument_error_msg();
}
}
//
// 如果命令行参数中没有指定输入的汇编文件,就打印错误信息后退出
//
if (NULL == assembly_file_name)
{
printf("命令行参数错误。没有指定汇编源代码文件的路径。\n");
help_msg();
}
}
// 将一个字符串写入二进制文件中。先将字符串长度写入文件,然后将字符串中的
// 每个字符依次写入文件,不包括字符串末尾的 0.
void write_string_to_binary_file(const char* str, FILE* fp)
{
int str_length;
if (str != NULL)
{
str_length = strlen(str);
fwrite(&str_length, 1, sizeof(str_length), fp);
fwrite(str, 1, str_length, fp);
}
else
{
str_length = 0;
fwrite(&str_length, 1, sizeof(str_length), fp);
}
}
int main(int argc, char* argv[])
{
FILE* fp;
char* token;
char line[MAX_LINE_LENGTH];
int i, j;
int line_num = 1; // 行号从第一行开始计数
int keyword_index;
//
// 处理命令行参数
//
process_argument(argc, argv);
//
// 打开汇编源代码文件
//
fp = fopen(assembly_file_name, "r");
if (NULL == fp)
{
printf("无法打开源代码文件 %s\n", assembly_file_name);
return 1;
}
//////////////////////////////////////////////////////////////////////////
// 第一遍扫描
version_msg();
printf("\n正在汇编 %s...\n", assembly_file_name);
//
// 一次读取一行文本,同时记录所有的代码行信息
//
while (fgets(line, sizeof(line), fp) != NULL)
{
//
// 将一行代码的信息记录到代码行数据库中
//
strcpy(line_database[line_count].line_string, line);
line_database[line_count].line_num = line_num;
line_database[line_count].address = machine_code_address;
//
// 将代码行中的注释剥离
//
line[strcspn(line, ";")] = 0;
//
// 开始解析代码行
//
token = strtok(line, delimit_char);
if (NULL == token)
{
// 如果是空行,不做任何处理
}
else if ((keyword_index = match_keyword(token)) != 0
&& keyword_function_table[keyword_index].parse_function != NULL)
{
// 根据关键字进行相应的处理
keyword_function_table[keyword_index].parse_function(line_num);
}
else if (is_int_vector(token, line_num))
{
// 必须首先判断是否是中断向量,然后再判断是否是标号。因为判断标号的时候会删除最后一个标志字符“:”,而中断向量名称后是没有冒号的
// 中断向量
parse_int_vector(token, line_num);
// 判断符号
if (is_symbol(token, line_num))
{
// 处理符号
parse_symbol(token, line_num);
}
}
else
{
error_msg("无法识别的代码行。", line_num);
}
//
// 补充代码行数据库信息
//
line_database[line_count].machine_code_count = machine_code_address - machine_code_old_address;
machine_code_old_address = machine_code_address;
//
// 检查机器码地址是否超过了最大地址,若超过则报错(一个地址单元存储一个字节机器码)
//
//
if (MAX_MACHINE_CODE_BYTE_COUNT == machine_code_address)
{
sprintf(formated_msg, "汇编代码的机器码过多,最多只能有 %d 个字节机器码。", MAX_MACHINE_CODE_BYTE_COUNT);
error_msg(formated_msg, -1);
}
//
// 记录产生了机器码的代码行数量
//
if (line_database[line_count].machine_code_count != 0)
{
machine_code_line_count++;
}
//
// 增加行号
//
line_count++;
line_num++;
if (line_count == MAX_LINE_COUNT)
{
sprintf(formated_msg, "汇编文件中的代码行过多,最多只能有 %d 行代码。", MAX_LINE_COUNT);
error_msg(formated_msg, -1);
}
}
fclose(fp);
//////////////////////////////////////////////////////////////////////////
// 第二遍扫描
//
// 根据符号表更新重定位表
//
for (i = 0; i < reallocate_count; i++)
{
for (j = 0; j < symbol_count; j++)
{
if (stricmp(symbol_table[j].name, reallocate_table[i].symbol_name) == 0)
{
machine_code[reallocate_table[i].address] = (BYTE)symbol_table[j].address;
symbol_table[j].ref_count++;
break;
}
}
if (j == symbol_count)
{
// 重定位表中使用的符号在符号表中未定义,报错
sprintf(formated_msg, "使用了未定义的符号 %s。", reallocate_table[i].symbol_name);
error_msg(formated_msg, reallocate_table[i].line_num);
}
}
//
// 如果存在未引用的符号,输出警告信息。
//
for (i = 0; i < symbol_count; i++)
{
if (0 == symbol_table[i].ref_count)
{
warning_msg_unref_symbol(symbol_table[i].name, symbol_table[i].line_num);
}
}
//////////////////////////////////////////////////////////////////////////
// 产生各种输出文件
//
// 将机器码写入二进制文件
//
if (NULL == target_file_name)
{
target_file_name = "a.obj";
}
fp = fopen(target_file_name, "wb");
if (NULL == fp)
{
printf("无法打开输出文件 %s\n", target_file_name);
return 1;
}
fwrite(machine_code, 1, machine_code_address, fp);
fclose(fp);
printf("\n生成目标文件 %s\n", target_file_name);
//
// 将代码行数据库中的信息写入列表文件
//
if (list_file_name != NULL)
{
fp = fopen(list_file_name, "w");
if (NULL == fp)
{
printf("无法打开列表文件 %s\n", list_file_name);
return 1;
}
for (i = 0; i < line_count; i++)
{
// 行号
fprintf(fp, "%04d ", line_database[i].line_num);
// 地址和机器码
if (line_database[i].machine_code_count > 0)
{
fprintf(fp, "%02X ", line_database[i].address);
for (j = 0; j < line_database[i].machine_code_count; j++)
{
// 确保每行最多写三个字节的机器码
if (j != 0 && j % 3 == 0)
{
if (3 == j)
{
fprintf(fp, " ");
}
else
{
fprintf(fp, "\n ");
}
}
fprintf(fp, "%02X ", machine_code[line_database[i].address + j]);
if (2 == j)
{
fprintf(fp, " ");
fprintf(fp, line_database[i].line_string);
}
}
if (1 == j)
{
// 单字节指令
fprintf(fp, " ");
fprintf(fp, line_database[i].line_string);
}
else if (2 == j)
{
fprintf(fp, " ");
fprintf(fp, line_database[i].line_string);
}
else if (j > 3)
{
fprintf(fp, "\n");
}
}
else
{
fprintf(fp, " ");
// 源代码
fprintf(fp, line_database[i].line_string);
}
}
fclose(fp);
printf("生成列表文件 %s\n", list_file_name);
}
//
// 将代码行数据库中的信息写入二进制的调试信息文件。
//
// 调试信息的基本格式为:
// 魔数(4字节),固定不可改变
// 版本号(4字节),固定不可改变
// 源代码文件绝对路径字符串长度(4字节)
// 源代码文件绝对路径字符串(不包括字符串结尾的0)
// 列表文件绝对路径字符串长度(4字节)
// 列表文件绝对路径字符串(不包括字符串结尾的0)
//
// 代码行数据库中元素的数量(4字节)
// 代码行数据库中的所有元素
//
// 符号表元素的数量(4字节)
// 符号表中的所有元素
//
if (dbg_file_name != NULL)
{
fp = fopen(dbg_file_name, "wb");
if (NULL == fp)
{
printf("无法打开调试信息文件 %s\n", dbg_file_name);
return 1;
}
// 魔数
fwrite(&dbg_file_magic, 1, sizeof(dbg_file_magic), fp);
// 版本号
fwrite(&dbg_file_version, 1, sizeof(dbg_file_version), fp);
// 源代码文件路径
write_string_to_binary_file(assembly_file_name, fp);
// 列表文件路径
write_string_to_binary_file(list_file_name, fp);
// 代码行数据库中的所有元素
fwrite(&machine_code_line_count, 1, sizeof(machine_code_line_count), fp);
for (i = 0; i < line_count; i++)
{
// 跳过没有产生机器码的代码行
if (0 == line_database[i].machine_code_count)
{
continue;
}
fwrite(&line_database[i].line_num, 1, sizeof(unsigned long), fp);
fwrite(&line_database[i].address, 1, sizeof(unsigned long), fp);
fwrite(&line_database[i].machine_code_count, 1, sizeof(unsigned long), fp);
fwrite(&line_database[i].flag, 1, sizeof(unsigned long), fp);
}
// 符号表中的所有元素
fwrite(&symbol_count, 1, sizeof(symbol_count), fp);
for (i = 0; i < symbol_count; i++)
{
write_string_to_binary_file(symbol_table[i].name, fp);
fwrite(&symbol_table[i].address, 1, sizeof(unsigned long), fp);
fwrite(&symbol_table[i].machine_code_count, 1, sizeof(int), fp);
fwrite(&symbol_table[i].line_num, 1, sizeof(int), fp);
}
fclose(fp);
printf("生成调试信息文件 %s\n", dbg_file_name);
}
return 0;
}
添加文件
;8路模拟量的循环数据采集程序
.text
mov al, 0x98 ; 设8255的A,B,C口均为方式0,A口入,B口出,C口高四位入
out 0x83, al
mov dl, 0xb0 ; 8路数据存储空间
mov bl, 0 ; 通道号,初始指向第0路通道IN0
AGAIN:
mov al, bl
out 0x81, al ; 送通道地址到B口
or al, 8 ; 使PB3=1
out 0x81, al ; 送ALE信号(上升沿),锁存通道号
and al, 0xf7 ; 使PB3=0,形成负脉冲START启动信号
out 0x81, al ; 输出START启动信号(下降沿)
nop ; 空操作等待转换
WAITING:
in al, 0x82 ; 读C口的PC7(即EOC)状态
and al, 0x80 ; 保留EOC的状态值
jZ WAITING ; 若EOC=0则等待
mov al, bl ; 若EOC=1,则转换结束,选择通道输出到B口
or al, 0x10 ; 使PB4=1
out 0x81, al ; 当检测到EOC=1时则输出读允许信号OE(=1)
in al, 0x80 ; 由A口读入转换数据
mov [dl], al ; 将转换后的数字量保存到存储区
Inc dl ; 修改存储指针
inc bl ; 修改通道号
mov cl, bl
sub cl, 8
jnz AGAIN ; 采集下一路模拟输入量
end:
jmp end ; 8路采集完毕,进入死循环
@echo off
dmasm.exe ram.asm -o ram.rxm -l ram.lst -g ram.dbg
pause
添加文件
0001 ;8路模拟量的循环数据采集程序
0002 .text
0003
0004 10 01 00 98 mov al, 0x98 ; 设8255的A,B,C口均为方式0,A口入,B口出,C口高四位入
0005 13 4E 00 83 out 0x83, al
0006 16 01 03 B0 mov dl, 0xb0 ; 8路数据存储空间
0007 19 01 01 00 mov bl, 0 ; 通道号,初始指向第0路通道IN0
0008
0009 AGAIN:
0010 1C 02 10 mov al, bl
0011 1E 4E 00 81 out 0x81, al ; 送通道地址到B口
0012
0013 21 38 00 08 or al, 8 ; 使PB3=1
0014 24 4E 00 81 out 0x81, al ; 送ALE信号(上升沿),锁存通道号
0015
0016 27 30 00 F7 and al, 0xf7 ; 使PB3=0,形成负脉冲START启动信号
0017 2A 4E 00 81 out 0x81, al ; 输出START启动信号(下降沿)
0018 2D 6F nop ; 空操作等待转换
0019
0020 WAITING:
0021 2E 4B 00 82 in al, 0x82 ; 读C口的PC7(即EOC)状态
0022 31 30 00 80 and al, 0x80 ; 保留EOC的状态值
0023 34 54 2E jZ WAITING ; 若EOC=0则等待
0024
0025 36 02 10 mov al, bl ; 若EOC=1,则转换结束,选择通道输出到B口
0026 38 38 00 10 or al, 0x10 ; 使PB4=1
0027 3B 4E 00 81 out 0x81, al ; 当检测到EOC=1时则输出读允许信号OE(=1)
0028
0029 3E 4B 00 80 in al, 0x80 ; 由A口读入转换数据
0030 41 05 03 mov [dl], al ; 将转换后的数字量保存到存储区
0031 43 78 03 Inc dl ; 修改存储指针
0032 45 78 01 inc bl ; 修改通道号
0033
0034 47 02 12 mov cl, bl
0035 49 1E 02 08 sub cl, 8
0036 4C 55 1C jnz AGAIN ; 采集下一路模拟输入量
0037
0038 end:
0039 4E 57 4E jmp end ; 8路采集完毕,进入死循环
0040
0041
添加文件
# 说明
模/数转换实验
# 原理图
![raw svg](ADC0809_test.dlsche.svg)
![raw svg](top.dlsche.svg)
\ No newline at end of file
添加文件
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<svg height="4971" version="1.1" width="12242" xmlns="http://www.w3.org/2000/svg">
<text alignment-baseline="after-edge" fill="#800000" font-family="微软雅黑" font-size="200" font-weight="700" text-anchor="start" x="27" y="3856">DBUS[7..0]</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="微软雅黑" font-size="200" font-weight="700" text-anchor="start" x="57" y="1086">ABUS[7..0]</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="微软雅黑" font-size="65" font-weight="700" text-anchor="start" x="1777" y="2556">CLK</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1167" x2="1267" y1="2556" y2="2556"/>
<rect fill="#ffffb0" height="100" stroke="#800000" stroke-width="5" width="100" x="1067" y="2506"/>
<polyline fill="none" points="1077 2456, 1157 2456" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1117 2456, 1117 2506" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1087 2586, 1117 2586, 1117 2526, 1147 2526" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="180" font-weight="700" text-anchor="start" x="687" y="2443">CLOCK</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="977" y="2566">SCLK</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="微软雅黑" font-size="65" font-weight="700" text-anchor="start" x="977" y="2676">Key = C</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="微软雅黑" font-size="90" font-weight="700" text-anchor="start" x="1447" y="1776">RESET</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1347" x2="1447" y1="1776" y2="1776"/>
<rect fill="#ffffb0" height="100" stroke="#800000" stroke-width="5" width="100" x="1247" y="1726"/>
<polyline fill="none" points="1257 1676, 1337 1676" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1297 1676, 1297 1726" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1267 1806, 1297 1806, 1297 1746, 1327 1746" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="180" font-weight="700" text-anchor="start" x="1027" y="1653">RESET</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1157" y="1786">SCLK</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="微软雅黑" font-size="180" font-weight="700" text-anchor="start" x="997" y="2076">Key = R</text>
<polyline fill="none" points="4817 156, 4817 4586" stroke="#000000" stroke-dasharray="200,100" stroke-linecap="round" stroke-linejoin="round" stroke-width="50"/>
<rect fill="#80ff80" height="1700" stroke="#800000" stroke-width="1" width="700" x="3217" y="1556"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="250" font-weight="700" text-anchor="start" x="3217" y="1456">8086</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3217" y="1506">8086\8086.dlsche</text>
<polygon fill="#ffff80" points="3217 1656, 3242 1631, 3292 1631, 3317 1656, 3292 1681, 3242 1681, 3217 1656" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3327" y="1656">CLK</text>
<polygon fill="#ffff80" points="3217 1756, 3242 1731, 3292 1731, 3317 1756, 3292 1781, 3242 1781, 3217 1756" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3327" y="1756">RESET</text>
<polygon fill="#ffff80" points="3217 1856, 3242 1831, 3292 1831, 3317 1856, 3292 1881, 3242 1881, 3217 1856" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3327" y="1856">INTR</text>
<polygon fill="#ffff80" points="3217 1956, 3242 1931, 3292 1931, 3317 1956, 3292 1981, 3242 1981, 3217 1956" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3327" y="1956">READY</text>
<polygon fill="#ffff80" points="3217 2056, 3242 2031, 3292 2031, 3317 2056, 3292 2081, 3242 2081, 3217 2056" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3327" y="2056">HOLD</text>
<polygon fill="#ffff80" points="3217 2156, 3242 2131, 3292 2131, 3317 2156, 3292 2181, 3242 2181, 3217 2156" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3327" y="2156">NMI</text>
<polygon fill="#ffff80" points="3217 2256, 3242 2231, 3292 2231, 3317 2256, 3292 2281, 3242 2281, 3217 2256" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3327" y="2256">TESET</text>
<polygon fill="#ffff80" points="3217 2356, 3242 2331, 3292 2331, 3317 2356, 3292 2381, 3242 2381, 3217 2356" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3327" y="2356">D0</text>
<polygon fill="#ffff80" points="3217 2456, 3242 2431, 3292 2431, 3317 2456, 3292 2481, 3242 2481, 3217 2456" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3327" y="2456">D1</text>
<polygon fill="#ffff80" points="3217 2556, 3242 2531, 3292 2531, 3317 2556, 3292 2581, 3242 2581, 3217 2556" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3327" y="2556">D2</text>
<polygon fill="#ffff80" points="3217 2656, 3242 2631, 3292 2631, 3317 2656, 3292 2681, 3242 2681, 3217 2656" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3327" y="2656">D3</text>
<polygon fill="#ffff80" points="3217 2756, 3242 2731, 3292 2731, 3317 2756, 3292 2781, 3242 2781, 3217 2756" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3327" y="2756">D4</text>
<polygon fill="#ffff80" points="3217 2856, 3242 2831, 3292 2831, 3317 2856, 3292 2881, 3242 2881, 3217 2856" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3327" y="2856">D5</text>
<polygon fill="#ffff80" points="3217 2956, 3242 2931, 3292 2931, 3317 2956, 3292 2981, 3242 2981, 3217 2956" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3327" y="2956">D6</text>
<polygon fill="#ffff80" points="3217 3056, 3242 3031, 3292 3031, 3317 3056, 3292 3081, 3242 3081, 3217 3056" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3327" y="3056">D7</text>
<polygon fill="#ffff80" points="3917 1656, 3892 1631, 3842 1631, 3817 1656, 3842 1681, 3892 1681, 3917 1656" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3707" y="1656">A0</text>
<polygon fill="#ffff80" points="3917 1756, 3892 1731, 3842 1731, 3817 1756, 3842 1781, 3892 1781, 3917 1756" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3707" y="1756">A1</text>
<polygon fill="#ffff80" points="3917 1856, 3892 1831, 3842 1831, 3817 1856, 3842 1881, 3892 1881, 3917 1856" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3707" y="1856">A2</text>
<polygon fill="#ffff80" points="3917 1956, 3892 1931, 3842 1931, 3817 1956, 3842 1981, 3892 1981, 3917 1956" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3707" y="1956">A3</text>
<polygon fill="#ffff80" points="3917 2056, 3892 2031, 3842 2031, 3817 2056, 3842 2081, 3892 2081, 3917 2056" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3707" y="2056">A4</text>
<polygon fill="#ffff80" points="3917 2156, 3892 2131, 3842 2131, 3817 2156, 3842 2181, 3892 2181, 3917 2156" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3707" y="2156">A5</text>
<polygon fill="#ffff80" points="3917 2256, 3892 2231, 3842 2231, 3817 2256, 3842 2281, 3892 2281, 3917 2256" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3707" y="2256">A6</text>
<polygon fill="#ffff80" points="3917 2356, 3892 2331, 3842 2331, 3817 2356, 3842 2381, 3892 2381, 3917 2356" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3707" y="2356">A7</text>
<polygon fill="#ffff80" points="3917 2456, 3892 2431, 3842 2431, 3817 2456, 3842 2481, 3892 2481, 3917 2456" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3687" y="2456">WR_OUT</text>
<polygon fill="#ffff80" points="3917 2556, 3892 2531, 3842 2531, 3817 2556, 3842 2581, 3892 2581, 3917 2556" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3687" y="2556">READ_OUT</text>
<polygon fill="#ffff80" points="3917 2656, 3892 2631, 3842 2631, 3817 2656, 3842 2681, 3892 2681, 3917 2656" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3707" y="2656">MIO</text>
<polygon fill="#ffff80" points="3917 2756, 3892 2731, 3842 2731, 3817 2756, 3842 2781, 3892 2781, 3917 2756" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3707" y="2756">INTA</text>
<polygon fill="#ffff80" points="3917 2856, 3892 2831, 3842 2831, 3817 2856, 3842 2881, 3892 2881, 3917 2856" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3707" y="2856">HLDA</text>
<polygon fill="#ffff80" points="3917 2956, 3892 2931, 3842 2931, 3817 2956, 3842 2981, 3892 2981, 3917 2956" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3707" y="2956">ALE</text>
<polygon fill="#ffff80" points="3917 3056, 3892 3031, 3842 3031, 3817 3056, 3842 3081, 3892 3081, 3917 3056" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3707" y="3056">DEN</text>
<polygon fill="#ffff80" points="3917 3156, 3892 3131, 3842 3131, 3817 3156, 3842 3181, 3892 3181, 3917 3156" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3707" y="3156">DTR</text>
<polyline fill="none" points="3217 2356, 2867 2356" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="3217 3056, 2867 3056" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="2817" x2="2867" y1="3106" y2="3056"/>
<polyline fill="none" points="2867 2456, 3217 2456" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="2867 2556, 3217 2556" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="2867 2656, 3217 2656" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="2867 2756, 3217 2756" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="2867 2856, 3217 2856" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="2867 2956, 3217 2956" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="2817" x2="2867" y1="3006" y2="2956"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="2817" x2="2867" y1="2906" y2="2856"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="2817" x2="2867" y1="2806" y2="2756"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="2817" x2="2867" y1="2706" y2="2656"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="2817" x2="2867" y1="2606" y2="2556"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="2817" x2="2867" y1="2506" y2="2456"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="2817" x2="2867" y1="2406" y2="2356"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="2867" y="2356">DBUS0</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="2867" y="2456">DBUS1</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="2867" y="2556">DBUS2</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="2867" y="2656">DBUS3</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="2867" y="2756">DBUS4</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="2867" y="2856">DBUS5</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="2867" y="2956">DBUS6</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="2867" y="3056">DBUS7</text>
<polyline fill="none" points="3907 1656, 4157 1656" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="3917 1756, 4167 1756" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="3917 1856, 4167 1856" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="3917 1956, 4167 1956" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="3917 2056, 4167 2056" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="3917 2156, 4167 2156" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="3917 2256, 4167 2256" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="3917 2356, 4167 2356" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="4157" x2="4207" y1="1656" y2="1606"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="4167" x2="4217" y1="1756" y2="1706"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="4167" x2="4217" y1="1856" y2="1806"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="4167" x2="4217" y1="1956" y2="1906"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="4167" x2="4217" y1="2056" y2="2006"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="4167" x2="4217" y1="2156" y2="2106"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="4167" x2="4217" y1="2256" y2="2206"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="4167" x2="4217" y1="2356" y2="2306"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4007" y="1656">ABUS0</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4017" y="1756">ABUS1</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4017" y="1856">ABUS2</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4017" y="1956">ABUS3</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4017" y="2056">ABUS4</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4017" y="2156">ABUS5</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4017" y="2256">ABUS6</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4017" y="2356">ABUS7</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1167" x2="1267" y1="2756" y2="2756"/>
<rect fill="#ffffb0" height="100" stroke="#800000" stroke-width="5" width="100" x="1067" y="2706"/>
<polyline fill="none" points="1077 2766, 1087 2766, 1087 2736, 1107 2736, 1107 2766, 1127 2766, 1127 2736, 1147 2736, 1147 2766" stroke="#000080" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1107" y="2696">C1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1063" y="2852">CLOCK11</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1207" y="2736">100Hz</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1167" x2="1267" y1="2956" y2="2956"/>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="30" font-weight="400" text-anchor="start" x="1108" y="2976">1</text>
<rect fill="#ffffff" fill-opacity="0.5" height="60" stroke="#800000" stroke-width="5" width="100" x="1067" y="2926"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1111" y="2917">2</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="998" y="2978">DCT</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1068" y="3029">Key = S</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1627" x2="1567" y1="2556" y2="2556"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1707" x2="1767" y1="2556" y2="2556"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1667" x2="1667" y1="2596" y2="2656"/>
<circle cx="1667" cy="2588" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="1627 2506, 1627 2606, 1707 2556, 1627 2506" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1677" y="2476">U3</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1627" y="2506">NBUFFER</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1627" x2="1567" y1="2756" y2="2756"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1707" x2="1767" y1="2756" y2="2756"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1667" x2="1667" y1="2796" y2="2856"/>
<circle cx="1667" cy="2788" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="1627 2706, 1627 2806, 1707 2756, 1627 2706" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1677" y="2676">U4</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1627" y="2706">NBUFFER</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1527" x2="1467" y1="2656" y2="2656"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1607" x2="1667" y1="2656" y2="2656"/>
<circle cx="1603" cy="2656" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="1527 2606, 1527 2706, 1597 2656, 1527 2606" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1547" y="2620">U5</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1527" y="2752">NOT</text>
<rect fill="#80ff80" height="600" stroke="#800000" stroke-width="1" width="700" x="5517" y="2656"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="250" font-weight="700" text-anchor="start" x="5517" y="2556">MEM</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="5517" y="2606">MEM\MEM.dlsche</text>
<polygon fill="#ffff80" points="5517 2756, 5542 2731, 5592 2731, 5617 2756, 5592 2781, 5542 2781, 5517 2756" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="5627" y="2756">WR_OUT</text>
<polygon fill="#ffff80" points="5517 2856, 5542 2831, 5592 2831, 5617 2856, 5592 2881, 5542 2881, 5517 2856" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="5627" y="2856">CLK</text>
<polygon fill="#ffff80" points="5517 2956, 5542 2931, 5592 2931, 5617 2956, 5592 2981, 5542 2981, 5517 2956" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="5627" y="2956">MIO</text>
<polygon fill="#ffff80" points="5517 3056, 5542 3031, 5592 3031, 5617 3056, 5592 3081, 5542 3081, 5517 3056" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="5627" y="3056">READ_OUT</text>
<polygon fill="#ffff80" points="5517 3156, 5542 3131, 5592 3131, 5617 3156, 5592 3181, 5542 3181, 5517 3156" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="5627" y="3156">ABUS[7..0]</text>
<polygon fill="#ffff80" points="6217 2756, 6192 2731, 6142 2731, 6117 2756, 6142 2781, 6192 2781, 6217 2756" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="6007" y="2756">DBUS[7..0]</text>
<polyline fill="none" points="4217 2306, 4217 1086" stroke="#ff8057" stroke-linecap="round" stroke-linejoin="round" stroke-width="20"/>
<polyline fill="none" points="5517 3156, 5317 3156, 5317 1086" stroke="#ff8057" stroke-linecap="round" stroke-linejoin="round" stroke-width="20"/>
<polyline fill="none" points="7417 2656, 7217 2656, 7217 1086" stroke="#ff8057" stroke-linecap="round" stroke-linejoin="round" stroke-width="20"/>
<polyline fill="none" points="2817 2406, 2817 3856" stroke="#000080" stroke-linecap="round" stroke-linejoin="round" stroke-width="20"/>
<polyline fill="none" points="6217 2756, 6417 2756, 6417 3856" stroke="#000080" stroke-linecap="round" stroke-linejoin="round" stroke-width="20"/>
<rect fill="#80ff80" height="1100" stroke="#800000" stroke-width="1" width="700" x="7417" y="2156"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="250" font-weight="700" text-anchor="start" x="7417" y="2056">IO</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="7417" y="2106">IO\IO.dlsche</text>
<polygon fill="#ffff80" points="7417 2256, 7442 2231, 7492 2231, 7517 2256, 7492 2281, 7442 2281, 7417 2256" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="7527" y="2256">MIO</text>
<polygon fill="#ffff80" points="7417 2356, 7442 2331, 7492 2331, 7517 2356, 7492 2381, 7442 2381, 7417 2356" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="7527" y="2356">WR_OUT</text>
<polygon fill="#ffff80" points="7417 2456, 7442 2431, 7492 2431, 7517 2456, 7492 2481, 7442 2481, 7417 2456" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="7527" y="2456">READ_OUT</text>
<polygon fill="#ffff80" points="7417 2556, 7442 2531, 7492 2531, 7517 2556, 7492 2581, 7442 2581, 7417 2556" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="7527" y="2556">MIO</text>
<polygon fill="#ffff80" points="7417 2656, 7442 2631, 7492 2631, 7517 2656, 7492 2681, 7442 2681, 7417 2656" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="7527" y="2656">A[7..0]</text>
<polygon fill="#ffff80" points="8117 2256, 8092 2231, 8042 2231, 8017 2256, 8042 2281, 8092 2281, 8117 2256" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="7907" y="2256">IOW</text>
<polygon fill="#ffff80" points="8117 2356, 8092 2331, 8042 2331, 8017 2356, 8042 2381, 8092 2381, 8117 2356" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="7907" y="2356">IOR</text>
<polygon fill="#ffff80" points="8117 2456, 8092 2431, 8042 2431, 8017 2456, 8042 2481, 8092 2481, 8117 2456" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="7907" y="2456">CS0</text>
<polygon fill="#ffff80" points="8117 2556, 8092 2531, 8042 2531, 8017 2556, 8042 2581, 8092 2581, 8117 2556" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="7907" y="2556">CS1</text>
<polygon fill="#ffff80" points="8117 2656, 8092 2631, 8042 2631, 8017 2656, 8042 2681, 8092 2681, 8117 2656" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="7907" y="2656">CS2</text>
<polygon fill="#ffff80" points="8117 2756, 8092 2731, 8042 2731, 8017 2756, 8042 2781, 8092 2781, 8117 2756" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="7907" y="2756">CS3</text>
<polygon fill="#ffff80" points="8117 2856, 8092 2831, 8042 2831, 8017 2856, 8042 2881, 8092 2881, 8117 2856" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="7907" y="2856">CS4</text>
<polygon fill="#ffff80" points="8117 2956, 8092 2931, 8042 2931, 8017 2956, 8042 2981, 8092 2981, 8117 2956" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="7907" y="2956">CS5</text>
<polygon fill="#ffff80" points="8117 3056, 8092 3031, 8042 3031, 8017 3056, 8042 3081, 8092 3081, 8117 3056" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="7907" y="3056">CS6</text>
<polygon fill="#ffff80" points="8117 3156, 8092 3131, 8042 3131, 8017 3156, 8042 3181, 8092 3181, 8117 3156" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="7907" y="3156">CS7</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="250" font-weight="700" text-anchor="start" x="47" y="316">实验八:ADC0809模/数转换器</text>
<polyline fill="none" points="57 1086, 8117 1086" stroke="#ff8057" stroke-linecap="round" stroke-linejoin="round" stroke-width="20"/>
<polyline fill="none" points="27 3856, 8117 3856" stroke="#000080" stroke-linecap="round" stroke-linejoin="round" stroke-width="20"/>
<polyline fill="none" points="1767 2556, 1867 2556, 1867 2756, 1767 2756" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1567 2756, 1267 2756" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1267 2956, 1667 2956, 1667 2856" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1467 2656, 1467 2956" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1567 2556, 1267 2556" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<rect fill="#80ff80" height="1400" stroke="#800000" stroke-width="1" width="700" x="11517" y="2056"/>
<text alignment-baseline="after-edge" fill="#000080" font-family="微软雅黑" font-size="105" font-weight="700" text-anchor="start" x="11517" y="1956">ADC0809</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11517" y="2006">ADC0809\ADC0809.dlsche</text>
<polygon fill="#ffff80" points="11517 2156, 11542 2131, 11592 2131, 11617 2156, 11592 2181, 11542 2181, 11517 2156" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11627" y="2156">IN3</text>
<polygon fill="#ffff80" points="11517 2256, 11542 2231, 11592 2231, 11617 2256, 11592 2281, 11542 2281, 11517 2256" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11627" y="2256">IN4</text>
<polygon fill="#ffff80" points="11517 2356, 11542 2331, 11592 2331, 11617 2356, 11592 2381, 11542 2381, 11517 2356" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11627" y="2356">IN5</text>
<polygon fill="#ffff80" points="11517 2456, 11542 2431, 11592 2431, 11617 2456, 11592 2481, 11542 2481, 11517 2456" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11627" y="2456">IN6</text>
<polygon fill="#ffff80" points="11517 2556, 11542 2531, 11592 2531, 11617 2556, 11592 2581, 11542 2581, 11517 2556" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11627" y="2556">IN7</text>
<polygon fill="#ffff80" points="11517 2656, 11542 2631, 11592 2631, 11617 2656, 11592 2681, 11542 2681, 11517 2656" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11627" y="2656">START</text>
<polygon fill="#ffff80" points="11517 2756, 11542 2731, 11592 2731, 11617 2756, 11592 2781, 11542 2781, 11517 2756" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11627" y="2756">EOC</text>
<polygon fill="#ffff80" points="11517 2856, 11542 2831, 11592 2831, 11617 2856, 11592 2881, 11542 2881, 11517 2856" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11627" y="2856">D3</text>
<polygon fill="#ffff80" points="11517 2956, 11542 2931, 11592 2931, 11617 2956, 11592 2981, 11542 2981, 11517 2956" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11627" y="2956">OE</text>
<polygon fill="#ffff80" points="11517 3056, 11542 3031, 11592 3031, 11617 3056, 11592 3081, 11542 3081, 11517 3056" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11627" y="3056">CLK</text>
<polygon fill="#ffff80" points="11517 3156, 11542 3131, 11592 3131, 11617 3156, 11592 3181, 11542 3181, 11517 3156" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11627" y="3156">VREF</text>
<polygon fill="#ffff80" points="11517 3256, 11542 3231, 11592 3231, 11617 3256, 11592 3281, 11542 3281, 11517 3256" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11627" y="3256">GND</text>
<polygon fill="#ffff80" points="11517 3356, 11542 3331, 11592 3331, 11617 3356, 11592 3381, 11542 3381, 11517 3356" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11627" y="3356">D1</text>
<polygon fill="#ffff80" points="12217 2156, 12192 2131, 12142 2131, 12117 2156, 12142 2181, 12192 2181, 12217 2156" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="12007" y="2156">IN2</text>
<polygon fill="#ffff80" points="12217 2256, 12192 2231, 12142 2231, 12117 2256, 12142 2281, 12192 2281, 12217 2256" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="12007" y="2256">IN1</text>
<polygon fill="#ffff80" points="12217 2356, 12192 2331, 12142 2331, 12117 2356, 12142 2381, 12192 2381, 12217 2356" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="12007" y="2356">IN0</text>
<polygon fill="#ffff80" points="12217 2456, 12192 2431, 12142 2431, 12117 2456, 12142 2481, 12192 2481, 12217 2456" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="12007" y="2456">ADDA</text>
<polygon fill="#ffff80" points="12217 2556, 12192 2531, 12142 2531, 12117 2556, 12142 2581, 12192 2581, 12217 2556" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="12007" y="2556">ADDB</text>
<polygon fill="#ffff80" points="12217 2656, 12192 2631, 12142 2631, 12117 2656, 12142 2681, 12192 2681, 12217 2656" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="12007" y="2656">ADDC</text>
<polygon fill="#ffff80" points="12217 2756, 12192 2731, 12142 2731, 12117 2756, 12142 2781, 12192 2781, 12217 2756" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="12007" y="2756">ALE</text>
<polygon fill="#ffff80" points="12217 2856, 12192 2831, 12142 2831, 12117 2856, 12142 2881, 12192 2881, 12217 2856" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="12007" y="2856">D7</text>
<polygon fill="#ffff80" points="12217 2956, 12192 2931, 12142 2931, 12117 2956, 12142 2981, 12192 2981, 12217 2956" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="12007" y="2956">D6</text>
<polygon fill="#ffff80" points="12217 3056, 12192 3031, 12142 3031, 12117 3056, 12142 3081, 12192 3081, 12217 3056" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="12007" y="3056">D5</text>
<polygon fill="#ffff80" points="12217 3156, 12192 3131, 12142 3131, 12117 3156, 12142 3181, 12192 3181, 12217 3156" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="12007" y="3156">D4</text>
<polygon fill="#ffff80" points="12217 3256, 12192 3231, 12142 3231, 12117 3256, 12142 3281, 12192 3281, 12217 3256" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="12007" y="3256">D0</text>
<polygon fill="#ffff80" points="12217 3356, 12192 3331, 12142 3331, 12117 3356, 12142 3381, 12192 3381, 12217 3356" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="12007" y="3356">D2</text>
<polyline fill="none" points="10117 3256, 10317 3256" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="10117 3156, 10317 3156" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="10117 3056, 10317 3056" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="10117 2956, 10317 2956" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="10117 2556, 10317 2556" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="10117 2756, 10317 2756" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="10317 2656, 10117 2656" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10217" y="2656">DBUS1</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10217" y="3256">DBUS7</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10217" y="3156">DBUS6</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10217" y="3056">DBUS5</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10217" y="2956">DBUS4</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10217" y="2556">DBUS0</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10217" y="2756">DBUS2</text>
<polyline fill="none" points="10317 2856, 10117 2856" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10217" y="2856">DBUS3</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11317" y="3256">GND</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="10547" x2="10547" y1="4456" y2="4376"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="10547" x2="10547" y1="4516" y2="4596"/>
<polyline fill="none" points="10497 4456, 10597 4456" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="10527 4476, 10567 4476" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="10497 4496, 10597 4496" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="10527 4516, 10567 4516" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="10598" y="4448">V1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="10581" y="4554">DC1</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10627" y="4496">0.1V</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="10747" x2="10747" y1="4456" y2="4376"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="10747" x2="10747" y1="4516" y2="4596"/>
<polyline fill="none" points="10697 4456, 10797 4456" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="10727 4476, 10767 4476" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="10697 4496, 10797 4496" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="10727 4516, 10767 4516" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="10798" y="4448">V2</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="10781" y="4554">DC2</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10827" y="4496">0.5V</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="10947" x2="10947" y1="4456" y2="4376"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="10947" x2="10947" y1="4516" y2="4596"/>
<polyline fill="none" points="10897 4456, 10997 4456" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="10927 4476, 10967 4476" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="10897 4496, 10997 4496" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="10927 4516, 10967 4516" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="10998" y="4448">V3</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="10981" y="4554">DC3</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11027" y="4496">1V</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="11147" x2="11147" y1="4456" y2="4376"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="11147" x2="11147" y1="4516" y2="4596"/>
<polyline fill="none" points="11097 4456, 11197 4456" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="11127 4476, 11167 4476" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="11097 4496, 11197 4496" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="11127 4516, 11167 4516" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="11198" y="4448">V4</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="11181" y="4554">DC4</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11227" y="4496">1.7V</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="11347" x2="11347" y1="4456" y2="4376"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="11347" x2="11347" y1="4516" y2="4596"/>
<polyline fill="none" points="11297 4456, 11397 4456" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="11327 4476, 11367 4476" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="11297 4496, 11397 4496" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="11327 4516, 11367 4516" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="11398" y="4448">V5</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="11381" y="4554">DC5</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11427" y="4496">2.3V</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="11547" x2="11547" y1="4456" y2="4376"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="11547" x2="11547" y1="4516" y2="4596"/>
<polyline fill="none" points="11497 4456, 11597 4456" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="11527 4476, 11567 4476" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="11497 4496, 11597 4496" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="11527 4516, 11567 4516" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="11598" y="4448">V6</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="11581" y="4554">DC6</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11627" y="4496">3.15V</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="11747" x2="11747" y1="4456" y2="4376"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="11747" x2="11747" y1="4516" y2="4596"/>
<polyline fill="none" points="11697 4456, 11797 4456" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="11727 4476, 11767 4476" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="11697 4496, 11797 4496" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="11727 4516, 11767 4516" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="11798" y="4448">V7</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="11781" y="4554">DC7</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11827" y="4496">4.5V</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="11947" x2="11947" y1="4456" y2="4376"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="11947" x2="11947" y1="4516" y2="4596"/>
<polyline fill="none" points="11897 4456, 11997 4456" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="11927 4476, 11967 4476" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="11897 4496, 11997 4496" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="11927 4516, 11967 4516" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="11998" y="4448">V8</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="11981" y="4554">DC</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="12027" y="4496">5V</text>
<polyline fill="none" points="10547 4776, 10547 4596, 11347 4596, 11947 4596" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="10547" x2="10547" y1="4876" y2="4776"/>
<polyline fill="none" points="10497 4876, 10597 4876" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="10517 4892, 10577 4892" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="10537 4907, 10557 4907" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="10557" y="4826"></text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="10517" y="4956">GND</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10547" y="4376">IN0</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10747" y="4376">IN1</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10947" y="4376">IN2</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11147" y="4376">IN3</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11347" y="4376">IN4</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11547" y="4376">IN5</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11747" y="4376">IN6</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11947" y="4376">IN7</text>
<polyline fill="none" points="11517 3156, 11317 3156" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="11317" y="3156">IN7</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="11117" x2="11217" y1="3056" y2="3056"/>
<rect fill="#ffffb0" fill-opacity="0.5" height="100" stroke="#800000" stroke-width="5" width="100" x="11017" y="3006"/>
<polyline fill="none" points="11027 3066, 11037 3066, 11037 3036, 11057 3036, 11057 3066, 11077 3066, 11077 3036, 11097 3036, 11097 3066" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="11057" y="2996">C2</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="11013" y="3152">CLOCK</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="微软雅黑" font-size="25" font-weight="700" text-anchor="start" x="11127" y="3046">200Hz</text>
<polyline fill="none" points="11517 3056, 11217 3056" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<rect fill="#80ff80" height="2000" stroke="#800000" stroke-width="1" width="700" x="9417" y="1856"/>
<text alignment-baseline="after-edge" fill="#000080" font-family="微软雅黑" font-size="105" font-weight="700" text-anchor="start" x="9417" y="1796">8255</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9417" y="1846">8255\8255.dlsche</text>
<polygon fill="#ffff80" points="9417 1956, 9442 1931, 9492 1931, 9517 1956, 9492 1981, 9442 1981, 9417 1956" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="1956">PA3</text>
<polygon fill="#ffff80" points="9417 2056, 9442 2031, 9492 2031, 9517 2056, 9492 2081, 9442 2081, 9417 2056" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="2056">PA2</text>
<polygon fill="#ffff80" points="9417 2156, 9442 2131, 9492 2131, 9517 2156, 9492 2181, 9442 2181, 9417 2156" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="2156">PA1</text>
<polygon fill="#ffff80" points="9417 2256, 9442 2231, 9492 2231, 9517 2256, 9492 2281, 9442 2281, 9417 2256" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="2256">PA0</text>
<polygon fill="#ffff80" points="9417 2356, 9442 2331, 9492 2331, 9517 2356, 9492 2381, 9442 2381, 9417 2356" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="2356">RD</text>
<polygon fill="#ffff80" points="9417 2456, 9442 2431, 9492 2431, 9517 2456, 9492 2481, 9442 2481, 9417 2456" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="2456">CS</text>
<polygon fill="#ffff80" points="9417 2556, 9442 2531, 9492 2531, 9517 2556, 9492 2581, 9442 2581, 9417 2556" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="2556">A1</text>
<polygon fill="#ffff80" points="9417 2656, 9442 2631, 9492 2631, 9517 2656, 9492 2681, 9442 2681, 9417 2656" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="2656">A0</text>
<polygon fill="#ffff80" points="9417 2756, 9442 2731, 9492 2731, 9517 2756, 9492 2781, 9442 2781, 9417 2756" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="2756">PC7</text>
<polygon fill="#ffff80" points="9417 2856, 9442 2831, 9492 2831, 9517 2856, 9492 2881, 9442 2881, 9417 2856" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="2856">PC6</text>
<polygon fill="#ffff80" points="9417 2956, 9442 2931, 9492 2931, 9517 2956, 9492 2981, 9442 2981, 9417 2956" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="2956">PC5</text>
<polygon fill="#ffff80" points="9417 3056, 9442 3031, 9492 3031, 9517 3056, 9492 3081, 9442 3081, 9417 3056" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="3056">PC4</text>
<polygon fill="#ffff80" points="9417 3156, 9442 3131, 9492 3131, 9517 3156, 9492 3181, 9442 3181, 9417 3156" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="3156">PC0</text>
<polygon fill="#ffff80" points="9417 3256, 9442 3231, 9492 3231, 9517 3256, 9492 3281, 9442 3281, 9417 3256" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="3256">PC1</text>
<polygon fill="#ffff80" points="9417 3356, 9442 3331, 9492 3331, 9517 3356, 9492 3381, 9442 3381, 9417 3356" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="3356">PC2</text>
<polygon fill="#ffff80" points="9417 3456, 9442 3431, 9492 3431, 9517 3456, 9492 3481, 9442 3481, 9417 3456" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="3456">PC3</text>
<polygon fill="#ffff80" points="9417 3556, 9442 3531, 9492 3531, 9517 3556, 9492 3581, 9442 3581, 9417 3556" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="3556">PB0</text>
<polygon fill="#ffff80" points="9417 3656, 9442 3631, 9492 3631, 9517 3656, 9492 3681, 9442 3681, 9417 3656" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="3656">PB1</text>
<polygon fill="#ffff80" points="9417 3756, 9442 3731, 9492 3731, 9517 3756, 9492 3781, 9442 3781, 9417 3756" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9527" y="3756">PB2</text>
<polygon fill="#ffff80" points="10117 1956, 10092 1931, 10042 1931, 10017 1956, 10042 1981, 10092 1981, 10117 1956" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="1956">PA4</text>
<polygon fill="#ffff80" points="10117 2056, 10092 2031, 10042 2031, 10017 2056, 10042 2081, 10092 2081, 10117 2056" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="2056">PA5</text>
<polygon fill="#ffff80" points="10117 2156, 10092 2131, 10042 2131, 10017 2156, 10042 2181, 10092 2181, 10117 2156" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="2156">PA6</text>
<polygon fill="#ffff80" points="10117 2256, 10092 2231, 10042 2231, 10017 2256, 10042 2281, 10092 2281, 10117 2256" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="2256">PA7</text>
<polygon fill="#ffff80" points="10117 2356, 10092 2331, 10042 2331, 10017 2356, 10042 2381, 10092 2381, 10117 2356" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="2356">WR</text>
<polygon fill="#ffff80" points="10117 2456, 10092 2431, 10042 2431, 10017 2456, 10042 2481, 10092 2481, 10117 2456" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="2456">RESET</text>
<polygon fill="#ffff80" points="10117 2556, 10092 2531, 10042 2531, 10017 2556, 10042 2581, 10092 2581, 10117 2556" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="2556">D0</text>
<polygon fill="#ffff80" points="10117 2656, 10092 2631, 10042 2631, 10017 2656, 10042 2681, 10092 2681, 10117 2656" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="2656">D1</text>
<polygon fill="#ffff80" points="10117 2756, 10092 2731, 10042 2731, 10017 2756, 10042 2781, 10092 2781, 10117 2756" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="2756">D2</text>
<polygon fill="#ffff80" points="10117 2856, 10092 2831, 10042 2831, 10017 2856, 10042 2881, 10092 2881, 10117 2856" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="2856">D3</text>
<polygon fill="#ffff80" points="10117 2956, 10092 2931, 10042 2931, 10017 2956, 10042 2981, 10092 2981, 10117 2956" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="2956">D4</text>
<polygon fill="#ffff80" points="10117 3056, 10092 3031, 10042 3031, 10017 3056, 10042 3081, 10092 3081, 10117 3056" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="3056">D5</text>
<polygon fill="#ffff80" points="10117 3156, 10092 3131, 10042 3131, 10017 3156, 10042 3181, 10092 3181, 10117 3156" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="3156">D6</text>
<polygon fill="#ffff80" points="10117 3256, 10092 3231, 10042 3231, 10017 3256, 10042 3281, 10092 3281, 10117 3256" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="3256">D7</text>
<polygon fill="#ffff80" points="10117 3356, 10092 3331, 10042 3331, 10017 3356, 10042 3381, 10092 3381, 10117 3356" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="3356">PB7</text>
<polygon fill="#ffff80" points="10117 3456, 10092 3431, 10042 3431, 10017 3456, 10042 3481, 10092 3481, 10117 3456" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="3456">PB6</text>
<polygon fill="#ffff80" points="10117 3556, 10092 3531, 10042 3531, 10017 3556, 10042 3581, 10092 3581, 10117 3556" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="3556">PB5</text>
<polygon fill="#ffff80" points="10117 3656, 10092 3631, 10042 3631, 10017 3656, 10042 3681, 10092 3681, 10117 3656" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="3656">PB4</text>
<polygon fill="#ffff80" points="10117 3756, 10092 3731, 10042 3731, 10017 3756, 10042 3781, 10092 3781, 10117 3756" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9907" y="3756">PB3</text>
<polyline fill="none" points="9417 2456, 9217 2456, 8117 2456" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9267" y="2456">CS0</text>
<polyline fill="none" points="9417 2556, 9217 2556" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="9417 2656, 9217 2656" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9267" y="2556">ABUS1</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9267" y="2656">ABUS0</text>
<polyline fill="none" points="9417 2356, 9217 2356, 8117 2356" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="9267" y="2356">IOR</text>
<polyline fill="none" points="10117 2356, 10317 2356, 10317 1656, 8417 1656, 8417 2256, 8117 2256" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10217" y="2356">IOW</text>
<polyline fill="none" points="11517 3256, 11317 3256" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10547" y="4776">GND</text>
<polyline fill="none" points="10117 2456, 10317 2456" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="10457" x2="10517" y1="2456" y2="2456"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="10377" x2="10317" y1="2456" y2="2456"/>
<circle cx="10381" cy="2456" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="10457 2506, 10457 2406, 10387 2456, 10457 2506" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="10427" y="2390">U1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="10417" y="2552">NOT</text>
<polyline fill="none" points="10517 2456, 10617 2456" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10517" y="2456">RESET</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10157" y="2456">RS</text>
<circle cx="7217" cy="1086" fill="#000080" r="25" stroke="#000080" stroke-width="5"/>
<circle cx="5317" cy="1086" fill="#000080" r="25" stroke="#000080" stroke-width="5"/>
<circle cx="4217" cy="1086" fill="#000080" r="25" stroke="#000080" stroke-width="5"/>
<circle cx="6417" cy="3856" fill="#000080" r="25" stroke="#000080" stroke-width="5"/>
<circle cx="2817" cy="3856" fill="#000080" r="25" stroke="#000080" stroke-width="5"/>
<circle cx="1467" cy="2956" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="10547" cy="4596" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="11347" cy="4596" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="10747" cy="4596" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="10947" cy="4596" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="11147" cy="4596" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="11547" cy="4596" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="11747" cy="4596" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
</svg>
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论