Merge branch '42-implement-memory-mapper' into 'master'

Resolve "Implement Memory Mapper"

Closes #42

See merge request bslathi19/super6502!36
This commit is contained in:
Byron Lathi
2023-10-22 21:06:37 +00:00
14 changed files with 1088 additions and 263 deletions

View File

@@ -116,3 +116,32 @@ full sim:
dependencies:
- build toolchain
mapper sim:
tags:
- linux
- iverilog
stage: simulate
artifacts:
paths:
- hw/efinix_fpga/simulation/mapper_tb.vcd
script:
- source init_env.sh
- cd hw/efinix_fpga/simulation
- make clean
- make mapper_tb
- ./mapper_tb
mapper_code sim:
tags:
- linux
- iverilog
stage: simulate
artifacts:
paths:
- hw/efinix_fpga/simulation/mapper_code_tb.vcd
script:
- source init_env.sh
- cd hw/efinix_fpga/simulation
- make clean
- TEST_PROGRAM_NAME=mapper_test make mapper_code_tb
- ./mapper_code_tb

293
doc/memory_mapper.drawio Normal file
View File

@@ -0,0 +1,293 @@
<mxfile host="Electron" modified="2023-10-17T05:15:31.071Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.2.8 Chrome/112.0.5615.165 Electron/24.2.0 Safari/537.36" etag="9k0BoEPw61JX0v_Fimzr" version="21.2.8" type="device">
<diagram name="Page-1" id="GhyEJFUGB68-PMfAT87G">
<mxGraphModel dx="2408" dy="1069" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="NXSZnqqENL-7S4XXd65T-59" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;shape=flexArrow;fillColor=none;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-1" target="NXSZnqqENL-7S4XXd65T-58">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-1" value="MM00" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="240" y="400" width="160" height="40" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-60" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;shape=flexArrow;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-3" target="NXSZnqqENL-7S4XXd65T-58">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="450" y="460" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-3" value="MM01" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="240" y="440" width="160" height="40" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-61" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.75;entryY=1;entryDx=0;entryDy=0;shape=flexArrow;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-4" target="NXSZnqqENL-7S4XXd65T-58">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="420" y="540" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-4" value="MMnn" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="240" y="520" width="160" height="40" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-15" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;shape=flexArrow;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-12" target="NXSZnqqENL-7S4XXd65T-14">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-28" value="ADDR[15:0]" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="NXSZnqqENL-7S4XXd65T-15">
<mxGeometry x="-0.2088" y="-1" relative="1" as="geometry">
<mxPoint x="-8" y="-21" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-12" value="" style="triangle;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="290" y="120" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;shape=flexArrow;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-14" target="NXSZnqqENL-7S4XXd65T-35">
<mxGeometry relative="1" as="geometry">
<mxPoint x="585" y="345" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-27" value="ADDR[15:12]" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="NXSZnqqENL-7S4XXd65T-26">
<mxGeometry x="-0.0783" relative="1" as="geometry">
<mxPoint y="-11" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-37" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;shape=flexArrow;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-14" target="NXSZnqqENL-7S4XXd65T-36">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-38" value="ADDR[11:0" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="NXSZnqqENL-7S4XXd65T-37">
<mxGeometry x="0.1934" y="4" relative="1" as="geometry">
<mxPoint x="-18" y="-16" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-48" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;shape=flexArrow;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-64" target="NXSZnqqENL-7S4XXd65T-47">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-10" y="630" />
<mxPoint x="-10" y="390" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-14" value="n-4&lt;br&gt;4" style="ellipse;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="490" y="210" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-32" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;fillColor=default;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="480" y="430" as="sourcePoint" />
<mxPoint x="520" y="420" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-33" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;fillColor=default;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-3">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="480" y="430" as="sourcePoint" />
<mxPoint x="520" y="460" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-34" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;fillColor=default;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-4">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="480" y="430" as="sourcePoint" />
<mxPoint x="520" y="540" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-40" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;shape=flexArrow;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-35" target="NXSZnqqENL-7S4XXd65T-36">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-42" value="ADDR[24:12]" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="NXSZnqqENL-7S4XXd65T-40">
<mxGeometry x="-0.5389" y="-2" relative="1" as="geometry">
<mxPoint x="7" y="-17" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-35" value="" style="shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;fixedSize=1;rotation=90;size=55;" vertex="1" parent="1">
<mxGeometry x="465" y="445" width="170" height="60" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;shape=flexArrow;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-36">
<mxGeometry relative="1" as="geometry">
<mxPoint x="890" y="250" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-43" value="ADDR[24:0]" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="NXSZnqqENL-7S4XXd65T-41">
<mxGeometry x="-0.3158" relative="1" as="geometry">
<mxPoint x="6" y="-20" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-36" value="+" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="690" y="210" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-45" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" target="NXSZnqqENL-7S4XXd65T-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="320" y="320" as="sourcePoint" />
<mxPoint x="310" y="320" as="targetPoint" />
<Array as="points">
<mxPoint x="320" y="360" />
<mxPoint x="280" y="360" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-50" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;shape=arrow;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-47" target="NXSZnqqENL-7S4XXd65T-49">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-47" value="Decoder" style="shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;fixedSize=1;rotation=-90;size=30;" vertex="1" parent="1">
<mxGeometry x="-10" y="370" width="120" height="40" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-55" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-49" target="NXSZnqqENL-7S4XXd65T-1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="220" y="360" />
<mxPoint x="220" y="420" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-81" value="we[1:0]" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="NXSZnqqENL-7S4XXd65T-55">
<mxGeometry x="-0.3218" relative="1" as="geometry">
<mxPoint x="-17" y="-10" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-56" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-49" target="NXSZnqqENL-7S4XXd65T-3">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="210" y="390" />
<mxPoint x="210" y="460" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-82" value="we[1:0]" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="NXSZnqqENL-7S4XXd65T-56">
<mxGeometry x="-0.7003" relative="1" as="geometry">
<mxPoint x="8" y="-10" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-57" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-49" target="NXSZnqqENL-7S4XXd65T-4">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="190" y="420" />
<mxPoint x="190" y="540" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-83" value="we[1:0]" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="NXSZnqqENL-7S4XXd65T-57">
<mxGeometry x="-0.7895" y="1" relative="1" as="geometry">
<mxPoint x="9" y="-9" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-49" value="&amp;amp;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="120" y="330" width="40" height="120" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-51" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" target="NXSZnqqENL-7S4XXd65T-49">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="130" y="300" as="sourcePoint" />
<mxPoint x="210" y="310" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-52" value="CS" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="NXSZnqqENL-7S4XXd65T-51">
<mxGeometry x="-0.7662" relative="1" as="geometry">
<mxPoint y="-14" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-53" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" target="NXSZnqqENL-7S4XXd65T-49">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="150" y="300" as="sourcePoint" />
<mxPoint x="210" y="310" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-54" value="WE" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="NXSZnqqENL-7S4XXd65T-53">
<mxGeometry x="-0.7143" relative="1" as="geometry">
<mxPoint y="-14" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-63" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;shape=flexArrow;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-58" target="NXSZnqqENL-7S4XXd65T-62">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-71" value="data[15:0]" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=none;" vertex="1" connectable="0" parent="NXSZnqqENL-7S4XXd65T-63">
<mxGeometry x="-0.258" y="-1" relative="1" as="geometry">
<mxPoint x="31" y="-5" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-58" value="" style="shape=trapezoid;perimeter=trapezoidPerimeter;fixedSize=1;size=20;rotation=-180;html=1;whiteSpace=wrap;horizontal=1;" vertex="1" parent="1">
<mxGeometry x="390" y="610" width="120" height="40" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-72" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;shape=flexArrow;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-62">
<mxGeometry relative="1" as="geometry">
<mxPoint x="450" y="780" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-73" value="DATA_OUT[7:0]" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="NXSZnqqENL-7S4XXd65T-72">
<mxGeometry x="0.3305" y="-2" relative="1" as="geometry">
<mxPoint x="52" y="-13" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-62" value="" style="shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;fixedSize=1;size=20;rotation=-180;" vertex="1" parent="1">
<mxGeometry x="390" y="690" width="120" height="40" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-66" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-77" target="NXSZnqqENL-7S4XXd65T-62">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="250" y="630" />
<mxPoint x="250" y="710" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-68" value="ADDR[0]" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="NXSZnqqENL-7S4XXd65T-66">
<mxGeometry x="0.4898" relative="1" as="geometry">
<mxPoint x="3" y="-10" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-64" value="" style="triangle;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-160" y="590" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-65" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;shape=flexArrow;fillColor=default;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-64" target="NXSZnqqENL-7S4XXd65T-77">
<mxGeometry relative="1" as="geometry">
<mxPoint x="200" y="630" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-67" value="ADDR[4:0]" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=none;" vertex="1" connectable="0" parent="NXSZnqqENL-7S4XXd65T-65">
<mxGeometry x="0.1394" relative="1" as="geometry">
<mxPoint x="-115" y="-15" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-69" value="WORD MUX" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="410" y="615" width="80" height="30" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-70" value="BYTE MUX" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="410" y="695" width="80" height="30" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-74" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;fillColor=default;" edge="1" parent="1" target="NXSZnqqENL-7S4XXd65T-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="320" y="310" as="sourcePoint" />
<mxPoint x="340" y="380" as="targetPoint" />
<Array as="points">
<mxPoint x="320" y="360" />
<mxPoint x="360" y="360" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-75" value="DATA_IN[7:0]" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="NXSZnqqENL-7S4XXd65T-74">
<mxGeometry x="-0.5016" y="-1" relative="1" as="geometry">
<mxPoint x="41" y="-2" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-77" value="4&lt;br&gt;1" style="ellipse;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="190" y="590" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-78" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;shape=flexArrow;fillColor=default;" edge="1" parent="1" source="NXSZnqqENL-7S4XXd65T-77" target="NXSZnqqENL-7S4XXd65T-58">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-79" value="ADDR[4:1]" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="NXSZnqqENL-7S4XXd65T-78">
<mxGeometry x="0.1248" relative="1" as="geometry">
<mxPoint x="-11" y="-15" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-85" value="&lt;h1&gt;MM Registers&lt;/h1&gt;&lt;p&gt;MM Registers are 16 bit.&lt;/p&gt;&lt;p&gt;There are 16 MM registers&lt;/p&gt;&lt;p&gt;There are 2 write enables, one for the high byte and one for the low byte.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;For reading, first the register is selected, then the byte in the register is selected&lt;/p&gt;" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" vertex="1" parent="1">
<mxGeometry x="610" y="570" width="230" height="210" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-86" value="" style="triangle;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="1">
<mxGeometry x="290" y="240" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-87" value="" style="triangle;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="1">
<mxGeometry x="420" y="770" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="NXSZnqqENL-7S4XXd65T-88" value="" style="triangle;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="890" y="210" width="60" height="80" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

107
doc/top.drawio Normal file
View File

@@ -0,0 +1,107 @@
<mxfile host="Electron" modified="2023-09-08T06:35:22.343Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.2.8 Chrome/112.0.5615.165 Electron/24.2.0 Safari/537.36" etag="Vup8A8Ew0YNgsrP0aR2d" version="21.2.8" type="device">
<diagram name="Page-1" id="W38x1XGtULFemG_pfs-W">
<mxGraphModel dx="528" dy="362" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="qp9JQkSkVBdRz7zZg5ij-1" value="65C02" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="400" y="470" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-2" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;" vertex="1" parent="1">
<mxGeometry x="560" y="400" width="410" height="300" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-3" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="560" y="440" width="130" height="120" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-4" value="Control Registers" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="595" y="450" width="60" height="40" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-8" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;strokeColor=#FF0000;" edge="1" parent="1" source="qp9JQkSkVBdRz7zZg5ij-5" target="qp9JQkSkVBdRz7zZg5ij-7">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-5" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;M&lt;/font&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;strokeColor=#FF0000;" vertex="1" parent="1">
<mxGeometry x="510" y="495" width="10" height="10" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;strokeColor=#FF0000;" edge="1" parent="1" source="qp9JQkSkVBdRz7zZg5ij-7" target="qp9JQkSkVBdRz7zZg5ij-4">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="580" y="500" />
<mxPoint x="580" y="470" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;strokeColor=#FF0000;" edge="1" parent="1" source="qp9JQkSkVBdRz7zZg5ij-7" target="qp9JQkSkVBdRz7zZg5ij-9">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="580" y="500" />
<mxPoint x="580" y="530" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-7" value="&lt;font color=&quot;#ffffff&quot; style=&quot;font-size: 8px;&quot;&gt;S&lt;/font&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;strokeColor=#FF0000;fillColor=#000000;" vertex="1" parent="1">
<mxGeometry x="560" y="495" width="10" height="10" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#FF0000;endArrow=none;endFill=0;" edge="1" parent="1" source="qp9JQkSkVBdRz7zZg5ij-9" target="qp9JQkSkVBdRz7zZg5ij-40">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-9" value="MMU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="595" y="510" width="60" height="40" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-18" value="Boot Rom" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="600" y="610" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="qp9JQkSkVBdRz7zZg5ij-19" target="qp9JQkSkVBdRz7zZg5ij-32">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-19" value="SDRAM" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="850" y="427.5" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-26" value="UART" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="850" y="520" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-28" value="&lt;font color=&quot;#ffffff&quot; style=&quot;font-size: 8px;&quot;&gt;S&lt;/font&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;strokeColor=#FF0000;fillColor=#000000;" vertex="1" parent="1">
<mxGeometry x="710" y="635" width="10" height="10" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-29" value="&lt;font color=&quot;#ffffff&quot; style=&quot;font-size: 8px;&quot;&gt;S&lt;/font&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;strokeColor=#FF0000;fillColor=#000000;" vertex="1" parent="1">
<mxGeometry x="850" y="545" width="10" height="10" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-30" value="&lt;font color=&quot;#ffffff&quot; style=&quot;font-size: 8px;&quot;&gt;S&lt;/font&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;strokeColor=#FF0000;fillColor=#000000;" vertex="1" parent="1">
<mxGeometry x="850" y="452.5" width="10" height="10" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-32" value="SDRAM" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="1000" y="427.5" width="80" height="60" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-35" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="770" y="427.5" width="30" height="242.5" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-45" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;strokeColor=#FF0000;" edge="1" parent="1" source="qp9JQkSkVBdRz7zZg5ij-36" target="qp9JQkSkVBdRz7zZg5ij-28">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-36" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;M&lt;/font&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;strokeColor=#FF0000;" vertex="1" parent="1">
<mxGeometry x="770" y="635" width="10" height="10" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;strokeColor=#FF0000;" edge="1" parent="1" source="qp9JQkSkVBdRz7zZg5ij-37" target="qp9JQkSkVBdRz7zZg5ij-29">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-37" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;M&lt;/font&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;strokeColor=#FF0000;" vertex="1" parent="1">
<mxGeometry x="790" y="545" width="10" height="10" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;strokeColor=#FF0000;" edge="1" parent="1" source="qp9JQkSkVBdRz7zZg5ij-38" target="qp9JQkSkVBdRz7zZg5ij-30">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-38" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;M&lt;/font&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;strokeColor=#FF0000;" vertex="1" parent="1">
<mxGeometry x="790" y="452.5" width="10" height="10" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-39" value="&lt;font color=&quot;#ffffff&quot; style=&quot;font-size: 8px;&quot;&gt;S&lt;/font&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;strokeColor=#FF0000;fillColor=#000000;" vertex="1" parent="1">
<mxGeometry x="770" y="525" width="10" height="10" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;strokeColor=#FF0000;" edge="1" parent="1" source="qp9JQkSkVBdRz7zZg5ij-40" target="qp9JQkSkVBdRz7zZg5ij-39">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="qp9JQkSkVBdRz7zZg5ij-40" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;M&lt;/font&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;strokeColor=#FF0000;" vertex="1" parent="1">
<mxGeometry x="680" y="525" width="10" height="10" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -1,9 +1,9 @@
@00000000
00 80 4C 00 00 8D 13 92 8E 14 92 8D 1A 92 8E 1B
92 88 B9 FF FF 8D 24 92 88 B9 FF FF 8D 23 92 8C
26 92 20 FF FF A0 FF D0 E8 60 00 00 4B FD 00 00
00 00 A2 FF 9A D8 A9 00 85 04 A9 DF 85 05 20 C3
FD 20 38 FA 20 52 F0 58 20 69 F2 6C FC FF 20 2C
26 92 20 FF FF A0 FF D0 E8 60 00 00 4C FD 00 00
00 00 A2 FF 9A D8 A9 00 85 04 A9 DF 85 05 20 C4
FD 20 39 FA 20 52 F0 58 20 69 F2 6C FC FF 20 2D
FA 00 A0 00 F0 07 A9 52 A2 F0 4C 05 92 60 AD FF
EF A2 00 60 8D FF EF 60 20 4F F2 C9 0A D0 05 A9
0D 20 4F F2 60 DA 5A A8 B2 04 AA A9 1B 20 4F F2
@@ -13,19 +13,19 @@ A9 63 20 4F F2 68 60 40 DA BA 48 E8 E8 BD 00 01
29 10 D0 06 68 FA 20 68 F2 40 68 FA 7C BF F0 C5
F0 C9 F0 CA F0 20 9A F0 40 40 20 68 F0 40 48 A0
04 B1 04 09 40 20 3F F2 88 B1 04 20 3F F2 88 10
F8 68 09 01 20 3F F2 20 28 FB 60 A2 08 A9 FF 20
F8 68 09 01 20 3F F2 20 29 FB 60 A2 08 A9 FF 20
3F F2 C9 FF D0 03 CA D0 F4 60 85 0C 86 0D 20 EB
F0 92 0C A9 FF 20 3F F2 A0 01 91 0C 20 15 FB 60
AA 20 9F FC A9 FF 20 3F F2 92 0C E6 0C D0 02 E6
F0 92 0C A9 FF 20 3F F2 A0 01 91 0C 20 16 FB 60
AA 20 A0 FC A9 FF 20 3F F2 92 0C E6 0C D0 02 E6
0D CA D0 F0 60 85 0C 86 0D 20 EB F0 C9 02 B0 12
E6 0C D0 02 E6 0C A5 0C A6 0D 20 CC FC A9 04 20
E6 0C D0 02 E6 0C A5 0C A6 0D 20 CD FC A9 04 20
10 F1 60 48 A9 FF 20 3F F2 A9 00 20 33 F2 A9 FF
20 3F F2 68 20 CE F0 20 EB F0 A8 A9 FF 20 3F F2
A9 00 20 39 F2 A9 FF 20 3F F2 98 A2 00 60 A9 00
20 39 F2 20 8B F1 A9 FF 20 3F F2 A9 00 20 39 F2
A2 50 A9 FF 20 3F F2 CA D0 F8 60 A2 01 A9 C8 3A
D0 FD CA D0 F8 60 85 0E 86 0F A9 FF 92 0E 20 9F
FC A5 04 85 10 A5 05 85 11 20 D0 FA A0 00 B1 10
D0 FD CA D0 F8 60 85 0E 86 0F A9 FF 92 0E 20 A0
FC A5 04 85 10 A5 05 85 11 20 D1 FA A0 00 B1 10
91 04 C8 B1 10 91 04 C8 B1 10 91 04 C8 B1 10 91
04 A9 FF 20 3F F2 A9 00 20 33 F2 A9 FF 20 3F F2
A9 11 A0 04 91 04 A9 00 20 CE F0 20 EB F0 C9 FF
@@ -37,91 +37,91 @@ EB A9 FF 20 3F F2 A9 FF 20 3F F2 A5 15 92 0E A5
F2 68 60 A9 01 8D DB EF 60 9C DB EF 60 A9 00 8D
DA EF AD DB EF 30 FB AD D9 EF 60 8D E6 EF 60 48
8D E6 EF AD E7 EF 89 02 D0 F9 68 60 AD E6 EF A2
00 60 AD E7 EF A2 00 60 60 20 F3 FA A2 00 86 06
86 07 A9 00 20 8A FB 20 D9 FA A9 05 A2 FE 20 99
FA 20 3A F3 C9 00 20 37 FC D0 03 4C 98 F2 A9 FE
A2 FD 20 99 FA 4C 2E F3 A9 F5 A2 FD 20 99 FA A0
05 20 46 FB 20 8A FB AD 00 92 AE 01 92 20 CC FC
A9 0C 20 57 FB 20 96 F1 A0 07 91 04 A0 07 A2 00
B1 04 C9 00 20 3D FC D0 03 4C DC F2 A0 06 A2 00
B1 04 C9 FE 20 3D FC F0 03 4C E5 F2 A2 00 A9 00
00 60 AD E7 EF A2 00 60 60 20 F4 FA A2 00 86 06
86 07 A9 00 20 8B FB 20 DA FA A9 06 A2 FE 20 9A
FA 20 3A F3 C9 00 20 38 FC D0 03 4C 98 F2 A9 FF
A2 FD 20 9A FA 4C 2E F3 A9 F6 A2 FD 20 9A FA A0
05 20 47 FB 20 8B FB AD 00 92 AE 01 92 20 CD FC
A9 0C 20 58 FB 20 96 F1 A0 07 91 04 A0 07 A2 00
B1 04 C9 00 20 3E FC D0 03 4C DC F2 A0 06 A2 00
B1 04 C9 FE 20 3E FC F0 03 4C E5 F2 A2 00 A9 00
D0 03 4C E9 F2 A2 00 A9 01 D0 03 4C FA F2 AD 00
92 AE 01 92 20 BB F5 4C 2B F3 A0 06 A2 00 B1 04
A2 00 29 F0 20 1E FA D0 03 4C 16 F3 A9 FE A2 FD
20 99 FA 4C 2B F3 A9 E6 A2 FD 20 CC FC A0 08 A2
00 B1 04 20 CC FC A0 04 20 65 FA 6C 00 92 4C 31
F3 4C 31 F3 A0 0C 20 04 FA 60 20 00 FB A9 00 20
B6 FC 20 6E F1 4C 71 F3 A0 00 A2 00 18 A9 01 71
04 91 04 A0 00 A2 00 B1 04 C9 FF 20 3D FC D0 03
4C 71 F3 A9 24 A2 FE 20 99 FA A2 00 A9 01 4C 27
F4 20 2B F4 A0 01 91 04 C9 01 20 37 FC D0 C9 A9
01 20 57 FB 20 48 F4 A0 01 A2 00 B1 04 C9 01 20
37 FC D0 03 4C A5 F3 A9 1B A2 FE 20 99 FA A2 00
A9 01 4C 27 F4 A0 05 A2 00 B1 04 C9 AA 20 37 FC
A2 00 29 F0 20 1F FA D0 03 4C 16 F3 A9 FF A2 FD
20 9A FA 4C 2B F3 A9 E7 A2 FD 20 CD FC A0 08 A2
00 B1 04 20 CD FC A0 04 20 66 FA 6C 00 92 4C 31
F3 4C 31 F3 A0 0C 20 05 FA 60 20 01 FB A9 00 20
B7 FC 20 6E F1 4C 71 F3 A0 00 A2 00 18 A9 01 71
04 91 04 A0 00 A2 00 B1 04 C9 FF 20 3E FC D0 03
4C 71 F3 A9 25 A2 FE 20 9A FA A2 00 A9 01 4C 27
F4 20 2B F4 A0 01 91 04 C9 01 20 38 FC D0 C9 A9
01 20 58 FB 20 48 F4 A0 01 A2 00 B1 04 C9 01 20
38 FC D0 03 4C A5 F3 A9 1C A2 FE 20 9A FA A2 00
A9 01 4C 27 F4 A0 05 A2 00 B1 04 C9 AA 20 38 FC
D0 03 4C BC F3 A2 00 A9 01 4C 27 F4 A2 00 A9 00
A0 00 91 04 A0 00 A2 00 B1 04 C9 FF 20 3D FC D0
03 4C E2 F3 A9 0C A2 FE 20 99 FA A2 00 A9 01 4C
A0 00 91 04 A0 00 A2 00 B1 04 C9 FF 20 3E FC D0
03 4C E2 F3 A9 0D A2 FE 20 9A FA A2 00 A9 01 4C
27 F4 20 6A F5 A0 01 91 04 A0 01 A2 00 B1 04 C9
02 20 56 FC D0 03 4C 00 F4 20 87 F5 A0 01 91 04
02 20 57 FC D0 03 4C 00 F4 20 87 F5 A0 01 91 04
A0 00 A2 00 18 A9 01 71 04 91 04 A0 01 A2 00 B1
04 C9 00 20 37 FC D0 AC A9 01 20 57 FB 20 F0 F4
A2 00 A9 00 4C 27 F4 20 2D FB 60 A2 00 A9 00 20
B6 FC A2 00 86 06 86 07 A9 00 20 8A FB A2 00 A9
94 20 43 F1 4C 47 F4 60 20 CC FC A2 00 A9 FF 20
04 C9 00 20 38 FC D0 AC A9 01 20 58 FB 20 F0 F4
A2 00 A9 00 4C 27 F4 20 2E FB 60 A2 00 A9 00 20
B7 FC A2 00 86 06 86 07 A9 00 20 8B FB A2 00 A9
94 20 43 F1 4C 47 F4 60 20 CD FC A2 00 A9 FF 20
3F F2 A2 00 A9 00 20 33 F2 A2 00 A9 FF 20 3F F2
A2 00 A9 08 20 B6 FC A2 01 A9 00 85 06 A9 00 85
07 A9 AA 20 8A FB A2 00 A9 86 20 CE F0 A0 01 20
3D FB 20 25 F1 A2 00 A9 FF 20 3F F2 A2 00 A9 00
20 39 F2 A2 00 A9 FF 20 3F F2 20 15 FB 60 20 CC
A2 00 A9 08 20 B7 FC A2 01 A9 00 85 06 A9 00 85
07 A9 AA 20 8B FB A2 00 A9 86 20 CE F0 A0 01 20
3E FB 20 25 F1 A2 00 A9 FF 20 3F F2 A2 00 A9 00
20 39 F2 A2 00 A9 FF 20 3F F2 20 16 FB 60 20 CD
FC A2 00 A9 FF 20 3F F2 A2 00 A9 00 20 33 F2 A2
00 A9 FF 20 3F F2 A2 00 A9 0D 20 B6 FC A2 00 86
06 86 07 A9 00 20 8A FB A2 00 A9 00 20 CE F0 A0
01 20 3D FB 20 FA F0 A2 00 A9 FF 20 3F F2 A2 00
A9 00 20 39 F2 A2 00 A9 FF 20 3F F2 20 15 FB 60
20 CC FC 20 D0 FA A2 00 A9 FF 20 3F F2 A2 00 A9
00 A9 FF 20 3F F2 A2 00 A9 0D 20 B7 FC A2 00 86
06 86 07 A9 00 20 8B FB A2 00 A9 00 20 CE F0 A0
01 20 3E FB 20 FA F0 A2 00 A9 FF 20 3F F2 A2 00
A9 00 20 39 F2 A2 00 A9 FF 20 3F F2 20 16 FB 60
20 CD FC 20 D1 FA A2 00 A9 FF 20 3F F2 A2 00 A9
00 20 33 F2 A2 00 A9 FF 20 3F F2 A0 00 91 04 A0
00 A2 00 B1 04 C9 FF 20 37 FC D0 03 4C 30 F5 4C
22 F5 A2 00 A9 FF 20 3F F2 C9 FF 20 37 FC D0 F2
A2 00 A9 3A 20 B6 FC A2 00 86 06 86 07 A9 00 20
8A FB A2 00 A9 00 20 CE F0 A0 02 20 3D FB 20 25
00 A2 00 B1 04 C9 FF 20 38 FC D0 03 4C 30 F5 4C
22 F5 A2 00 A9 FF 20 3F F2 C9 FF 20 38 FC D0 F2
A2 00 A9 3A 20 B7 FC A2 00 86 06 86 07 A9 00 20
8B FB A2 00 A9 00 20 CE F0 A0 02 20 3E FB 20 25
F1 A2 00 A9 FF 20 3F F2 A2 00 A9 00 20 39 F2 A2
00 A9 FF 20 3F F2 20 23 FB 60 A2 00 A9 37 20 B6
FC A2 00 86 06 86 07 A9 00 20 8A FB A2 00 A9 00
20 43 F1 4C 86 F5 60 A2 00 A9 29 20 B6 FC A2 00
86 06 A9 40 85 07 A9 00 20 8A FB A2 00 A9 00 20
43 F1 4C A5 F5 60 20 CC FC 20 F3 FA A0 03 A2 00
B1 04 4C B5 F5 A0 0E 20 04 FA 60 20 CC FC A9 00
20 B6 FC 20 D9 FA A2 00 A9 00 A0 00 20 E4 FC A0
01 20 3D FB E0 02 20 56 FC F0 03 4C E1 F5 4C 43
F6 A9 2D A2 FE 20 CC FC A0 06 20 3D FB A0 00 20
32 FB 20 CC FC A0 07 A2 00 A9 01 20 F4 F9 A0 04
20 65 FA A0 02 A2 00 B1 04 C9 1F 20 3D FC D0 03
4C 25 F6 A9 31 A2 FE 20 99 FA A2 00 A9 00 A0 02
00 A9 FF 20 3F F2 20 24 FB 60 A2 00 A9 37 20 B7
FC A2 00 86 06 86 07 A9 00 20 8B FB A2 00 A9 00
20 43 F1 4C 86 F5 60 A2 00 A9 29 20 B7 FC A2 00
86 06 A9 40 85 07 A9 00 20 8B FB A2 00 A9 00 20
43 F1 4C A5 F5 60 20 CD FC 20 F4 FA A0 03 A2 00
B1 04 4C B5 F5 A0 0E 20 05 FA 60 20 CD FC A9 00
20 B7 FC 20 DA FA A2 00 A9 00 A0 00 20 E5 FC A0
01 20 3E FB E0 02 20 57 FC F0 03 4C E1 F5 4C 43
F6 A9 2E A2 FE 20 CD FC A0 06 20 3E FB A0 00 20
33 FB 20 CD FC A0 07 A2 00 A9 01 20 F5 F9 A0 04
20 66 FA A0 02 A2 00 B1 04 C9 1F 20 3E FC D0 03
4C 25 F6 A9 32 A2 FE 20 9A FA A2 00 A9 00 A0 02
91 04 4C 37 F6 A2 00 A9 20 20 68 F0 A0 02 A2 00
18 A9 01 71 04 91 04 A0 00 A2 00 A9 01 20 F4 F9
4C CF F5 A9 31 A2 FE 20 99 FA 20 28 FB 60 A0 00
18 A9 01 71 04 91 04 A0 00 A2 00 A9 01 20 F5 F9
4C CF F5 A9 32 A2 FE 20 9A FA 20 29 FB 60 A0 00
B1 1A E6 1A D0 02 E6 1B 60 AD 4A 92 8D 45 92 20
FA F6 A9 45 A2 92 20 CC FC 20 AD FC 4C 02 92 A5
FA F6 A9 45 A2 92 20 CD FC 20 AE FC 4C 02 92 A5
18 38 E9 02 85 18 B0 02 C6 19 60 AD 4F 92 D0 11
20 98 F6 4C 17 FA AD 4F 92 D0 06 20 98 F6 4C 11
20 98 F6 4C 18 FA AD 4F 92 D0 06 20 98 F6 4C 12
FA 20 98 F6 85 06 86 07 20 6F F6 A0 01 B1 18 AA
88 B1 18 60 A0 00 84 0C 84 0D B1 1A 38 E9 30 90
2C C9 0A B0 28 20 52 F6 48 A5 0C A6 0D 06 0C 26
0D 06 0C 26 0D 65 0C 85 0C 8A 65 0D 85 0D 06 0C
26 0D 68 65 0C 85 0C 90 D1 E6 0D B0 CD A5 0C A6
0D 60 AC 51 92 EE 51 92 99 52 92 60 A9 52 A2 92
18 6D 51 92 90 01 E8 4C CC FC A5 1C A6 1D 4C CC
18 6D 51 92 90 01 E8 4C CD FC A5 1C A6 1D 4C CD
FC 20 59 F6 EE 4B 92 D0 F8 EE 4C 92 D0 F3 60 20
FA F6 AD 66 92 AE 67 92 20 CC FC AD 68 92 AE 69
92 20 CC FC 4C 02 92 84 0C 20 8A FB 20 EC F6 A5
0C 4C BA FB 84 0C 20 8A FB 20 EC F6 A5 0C 4C FB
FA F6 AD 66 92 AE 67 92 20 CD FC AD 68 92 AE 69
92 20 CD FC 4C 02 92 84 0C 20 8B FB 20 EC F6 A5
0C 4C BB FB 84 0C 20 8B FB 20 EC F6 A5 0C 4C FC
FB 48 A0 05 B9 18 00 99 3F 92 88 10 F7 68 85 18
86 19 20 0D FB 85 1A 86 1B 20 0D FB 85 1C 86 1D
86 19 20 0E FB 85 1A 86 1B 20 0E FB 85 1C 86 1D
A9 00 A8 91 1C C8 91 1C C8 B1 1C 8D 03 92 C8 B1
1C 8D 04 92 A5 1A 85 0C A5 1B 85 0D A0 00 B1 1A
F0 0B C9 25 F0 07 C8 D0 F5 E6 1B D0 F1 98 18 65
1A 85 1A 90 02 E6 1B 38 E5 0C 85 0E A5 1B E5 0D
85 0F 05 0E F0 25 20 F3 FA A0 05 A5 1D 91 04 88
85 0F 05 0E F0 25 20 F4 FA A0 05 A5 1D 91 04 88
A5 1C 91 04 88 A5 0D 91 04 88 A5 0C 91 04 88 A5
0F 91 04 88 A5 0E 91 04 20 02 92 20 4E F6 AA D0
0B A2 05 BD 3F 92 95 18 CA 10 F8 60 C9 25 D0 09
@@ -137,102 +137,102 @@ C9 2E D0 1B 20 52 F6 B1 1A C9 2A D0 09 20 52 F6
1A C9 7A F0 19 C9 68 F0 15 C9 74 F0 11 C9 6A F0
08 C9 4C F0 04 C9 6C D0 0B A9 FF 8D 4F 92 20 52
F6 4C 6F F8 8C 51 92 A2 52 8E 66 92 A2 92 8E 67
92 20 52 F6 C9 63 D0 0D 20 98 F6 8D 52 92 A2 00
A9 01 4C 9B F9 C9 64 F0 04 C9 69 D0 2D A2 00 AD
48 92 F0 02 A2 20 AD 47 92 F0 02 A2 2B 8E 50 92
20 86 F6 A4 07 30 0B AC 50 92 F0 06 8C 52 92 EE
51 92 A0 0A 20 27 F7 4C 92 F9 C9 6E D0 15 20 98
F6 85 0C 86 0D A0 00 B1 1C 91 0C C8 B1 1C 91 0C
4C 74 F7 C9 6F D0 27 20 86 F6 AC 49 92 F0 17 48
86 14 05 14 05 06 05 07 0D 4D 92 0D 4E 92 F0 06
A9 30 20 E2 F6 68 A0 08 20 27 F7 4C 92 F9 C9 70
D0 0D A2 00 8E 4F 92 E8 8E 49 92 A9 78 D0 27 C9
73 D0 0C 20 98 F6 8D 66 92 8E 67 92 4C 92 F9 C9
75 D0 0B 20 7B F6 A0 0A 20 34 F7 4C 92 F9 C9 78
F0 04 C9 58 D0 29 48 AD 49 92 F0 0A A9 30 20 E2
F6 A9 58 20 E2 F6 20 7B F6 A0 10 20 34 F7 68 C9
78 D0 09 AD 66 92 AE 67 92 20 24 FD 4C 92 F9 4C
74 F7 AD 66 92 AE 67 92 20 0E FD 8D 68 92 8E 69
92 AD 4D 92 0D 4E 92 F0 15 AE 4D 92 EC 68 92 AD
4E 92 A8 ED 69 92 B0 06 8E 68 92 8C 69 92 38 AD
4B 92 ED 68 92 AA AD 4C 92 ED 69 92 B0 03 A9 00
AA 49 FF 8D 4C 92 8A 49 FF 8D 4B 92 AD 46 92 D0
03 20 04 F7 20 0F F7 AD 46 92 F0 03 20 04 F7 4C
74 F7 A0 00 18 71 04 91 04 48 C8 8A 71 04 91 04
AA 68 60 C8 48 18 98 65 04 85 04 90 02 E6 05 68
60 A0 FF E0 80 B0 02 A0 00 84 06 84 07 60 E0 00
D0 06 AA D0 03 A9 01 60 A2 00 8A 60 A0 00 F0 07
A9 52 A2 F0 4C 05 92 60 A9 00 85 0C A9 F0 85 0D
A9 00 85 0E A9 92 85 0F A2 CD A9 FF 85 14 A0 00
E8 F0 0D B1 0C 91 0E C8 D0 F6 E6 0D E6 0F D0 F0
E6 14 D0 EF 60 8C 6A 92 88 88 98 18 65 04 85 0C
A6 05 90 01 E8 86 0D A0 01 B1 0C AA 88 B1 0C 20
CC FC A5 0C A6 0D 20 93 FD AC 6A 92 4C 04 FA 85
0C 86 0D 20 75 F0 4C 9D FA 85 0C 86 0D A0 00 B1
0C F0 0E C8 84 14 20 68 F0 A4 14 D0 F2 E6 0D D0
EE 60 E0 00 D0 15 4A AA BD 5A FE 90 05 4A 4A 4A
4A 18 29 0F AA BD 4F FE A2 00 60 38 A9 00 AA 60
A4 04 D0 02 C6 05 C6 04 60 A5 04 38 E9 02 85 04
90 01 60 C6 05 60 A5 04 38 E9 04 85 04 90 01 60
C6 05 60 A5 04 38 E9 06 85 04 90 01 60 C6 05 60
A5 04 38 E9 07 85 04 90 01 60 C6 05 60 A0 01 B1
04 AA 88 B1 04 E6 04 F0 05 E6 04 F0 03 60 E6 04
E6 05 60 A0 03 4C 04 FA A0 05 4C 04 FA A0 08 4C
04 FA 85 0C 86 0D A2 00 B1 0C 60 A0 01 B1 04 AA
88 B1 04 60 A0 03 B1 04 85 07 88 B1 04 85 06 88
B1 04 AA 88 B1 04 60 A2 00 18 65 04 48 8A 65 05
AA 68 60 18 49 FF 69 01 48 8A 49 FF 69 00 AA A5
06 49 FF 69 00 85 06 A5 07 49 FF 69 00 85 07 68
60 A9 00 AA A0 00 84 06 84 07 48 20 E6 FA A0 03
A5 07 91 04 88 A5 06 91 04 88 8A 91 04 68 88 91
04 60 85 14 20 0D FB 85 0E 86 0F 85 10 86 11 20
9F FC 20 0D FB 85 06 86 07 60 20 A2 FB A6 07 A4
14 C0 0A D0 39 A5 06 05 0D 05 0C D0 11 E0 80 D0
0D A0 0B B9 43 FE 91 0E 88 10 F8 4C 32 FC 8A 10
1D A9 2D A0 00 91 0E E6 0E D0 02 E6 0F A5 0C A6
0D 20 63 FB 85 0C 86 0D 4C FE FB 20 A2 FB A9 00
48 A0 20 A9 00 06 0C 26 0D 26 06 26 07 2A C5 14
90 04 E5 14 E6 0C 88 D0 EC A8 B9 33 FE 48 A5 0C
05 0D 05 06 05 07 D0 D9 A0 00 68 91 0E F0 03 C8
D0 F8 A5 10 A6 11 60 D0 06 A2 00 8A 60 D0 FA A2
00 A9 01 60 F0 F9 30 F7 A2 00 8A 60 F0 02 10 EF
A2 00 8A 60 F0 E9 90 E7 A2 00 8A 60 F0 DB A2 00
8A 2A 60 20 8C FC A6 11 F0 13 B1 0C 91 0E C8 B1
0C 91 0E C8 D0 F4 E6 0D E6 0F CA D0 ED A6 10 F0
08 B1 0C 91 0E C8 CA D0 F8 4C 0D FB 85 10 86 11
20 9F FC C8 B1 04 AA 86 0F 88 B1 04 85 0E 60 A0
01 B1 04 85 0D 88 B1 04 85 0C 4C 15 FB A9 01 4C
CA FC A0 00 B1 04 A4 04 F0 07 C6 04 A0 00 91 04
60 C6 05 C6 04 91 04 60 A9 00 A2 00 48 A5 04 38
E9 02 85 04 B0 02 C6 05 A0 01 8A 91 04 68 88 91
04 60 A0 00 91 04 C8 48 8A 91 04 68 60 85 0E 86
0F 20 9F FC B1 0C D1 0E D0 0C AA F0 10 C8 D0 F4
E6 0D E6 0F D0 EE B0 03 A2 FF 60 A2 01 60 85 0E
86 0F A2 00 A0 00 B1 0E F0 08 C8 D0 F9 E6 0F E8
D0 F4 98 60 85 0C 86 0D 85 0E 86 0F A0 00 B1 0C
F0 14 20 B6 FA 29 02 F0 06 B1 0C 69 20 91 0C C8
D0 EC E6 0D D0 E8 A5 0E A6 0F 60 20 0D FB 85 0E
86 0F E8 8E 31 92 AA E8 8E 30 92 20 9F FC 20 0D
FB 85 10 86 11 A0 00 84 14 B1 10 18 65 0E 91 10
C8 B1 10 65 0F 91 10 CE 30 92 F0 11 A4 14 B1 0C
C8 D0 02 E6 0D 84 14 20 68 F0 4C 77 FD CE 31 92
D0 EA 60 85 0C 86 0D A9 00 8D 2A 92 8D 2B 92 A0
01 B1 04 AA 88 B1 04 20 CC FC A0 02 A9 2A 91 04
C8 A9 92 91 04 A5 0C A6 0D 20 41 F7 AD 2A 92 AE
2B 92 60 A9 32 85 0C A9 92 85 0D A9 00 A8 A2 00
F0 0A 91 0C C8 D0 FB E6 0D CA D0 F6 C0 39 F0 05
91 0C C8 D0 F7 60 62 61 64 20 74 6F 6B 65 6E 3A
20 25 78 0A 00 53 75 63 63 65 73 73 0A 00 45 72
72 6F 72 0A 00 53 74 61 72 74 0A 00 6F 70 5F 63
6F 6E 64 20 65 72 72 6F 72 0A 00 49 46 20 43 6F
6E 64 0A 00 47 6F 20 49 44 4C 45 0A 00 25 32 78
00 0A 00 30 31 32 33 34 35 36 37 38 39 41 42 43
44 45 46 2D 32 31 34 37 34 38 33 36 34 38 00 00
01 02 0C 09 0A 10 40 50 A0 D0 66 66 66 66 A6 88
88 66 66 66 66 66 66 66 66 66 09 00 00 00 00 00
00 00 33 33 33 33 33 00 00 00 50 55 55 25 22 22
22 22 22 22 22 22 22 02 00 00 40 44 44 14 11 11
11 11 11 11 11 11 11 01 00 70 00 00 00 00 00 00
92 20 52 F6 C9 63 D0 0E 20 98 F6 8D 52 92 A9 00
8D 53 92 4C 93 F9 C9 64 F0 04 C9 69 D0 2D A2 00
AD 48 92 F0 02 A2 20 AD 47 92 F0 02 A2 2B 8E 50
92 20 86 F6 A4 07 30 0B AC 50 92 F0 06 8C 52 92
EE 51 92 A0 0A 20 27 F7 4C 93 F9 C9 6E D0 15 20
98 F6 85 0C 86 0D A0 00 B1 1C 91 0C C8 B1 1C 91
0C 4C 74 F7 C9 6F D0 27 20 86 F6 AC 49 92 F0 17
48 86 14 05 14 05 06 05 07 0D 4D 92 0D 4E 92 F0
06 A9 30 20 E2 F6 68 A0 08 20 27 F7 4C 93 F9 C9
70 D0 0D A2 00 8E 4F 92 E8 8E 49 92 A9 78 D0 27
C9 73 D0 0C 20 98 F6 8D 66 92 8E 67 92 4C 93 F9
C9 75 D0 0B 20 7B F6 A0 0A 20 34 F7 4C 93 F9 C9
78 F0 04 C9 58 D0 29 48 AD 49 92 F0 0A A9 30 20
E2 F6 A9 58 20 E2 F6 20 7B F6 A0 10 20 34 F7 68
C9 78 D0 09 AD 66 92 AE 67 92 20 25 FD 4C 93 F9
4C 74 F7 AD 66 92 AE 67 92 20 0F FD 8D 68 92 8E
69 92 AD 4D 92 0D 4E 92 F0 15 AE 4D 92 EC 68 92
AD 4E 92 A8 ED 69 92 B0 06 8E 68 92 8C 69 92 38
AD 4B 92 ED 68 92 AA AD 4C 92 ED 69 92 B0 03 A9
00 AA 49 FF 8D 4C 92 8A 49 FF 8D 4B 92 AD 46 92
D0 03 20 04 F7 20 0F F7 AD 46 92 F0 03 20 04 F7
4C 74 F7 A0 00 18 71 04 91 04 48 C8 8A 71 04 91
04 AA 68 60 C8 48 18 98 65 04 85 04 90 02 E6 05
68 60 A0 FF E0 80 B0 02 A0 00 84 06 84 07 60 E0
00 D0 06 AA D0 03 A9 01 60 A2 00 8A 60 A0 00 F0
07 A9 52 A2 F0 4C 05 92 60 A9 00 85 0C A9 F0 85
0D A9 00 85 0E A9 92 85 0F A2 CD A9 FF 85 14 A0
00 E8 F0 0D B1 0C 91 0E C8 D0 F6 E6 0D E6 0F D0
F0 E6 14 D0 EF 60 8C 6A 92 88 88 98 18 65 04 85
0C A6 05 90 01 E8 86 0D A0 01 B1 0C AA 88 B1 0C
20 CD FC A5 0C A6 0D 20 94 FD AC 6A 92 4C 05 FA
85 0C 86 0D 20 75 F0 4C 9E FA 85 0C 86 0D A0 00
B1 0C F0 0E C8 84 14 20 68 F0 A4 14 D0 F2 E6 0D
D0 EE 60 E0 00 D0 15 4A AA BD 5B FE 90 05 4A 4A
4A 4A 18 29 0F AA BD 50 FE A2 00 60 38 A9 00 AA
60 A4 04 D0 02 C6 05 C6 04 60 A5 04 38 E9 02 85
04 90 01 60 C6 05 60 A5 04 38 E9 04 85 04 90 01
60 C6 05 60 A5 04 38 E9 06 85 04 90 01 60 C6 05
60 A5 04 38 E9 07 85 04 90 01 60 C6 05 60 A0 01
B1 04 AA 88 B1 04 E6 04 F0 05 E6 04 F0 03 60 E6
04 E6 05 60 A0 03 4C 05 FA A0 05 4C 05 FA A0 08
4C 05 FA 85 0C 86 0D A2 00 B1 0C 60 A0 01 B1 04
AA 88 B1 04 60 A0 03 B1 04 85 07 88 B1 04 85 06
88 B1 04 AA 88 B1 04 60 A2 00 18 65 04 48 8A 65
05 AA 68 60 18 49 FF 69 01 48 8A 49 FF 69 00 AA
A5 06 49 FF 69 00 85 06 A5 07 49 FF 69 00 85 07
68 60 A9 00 AA A0 00 84 06 84 07 48 20 E7 FA A0
03 A5 07 91 04 88 A5 06 91 04 88 8A 91 04 68 88
91 04 60 85 14 20 0E FB 85 0E 86 0F 85 10 86 11
20 A0 FC 20 0E FB 85 06 86 07 60 20 A3 FB A6 07
A4 14 C0 0A D0 39 A5 06 05 0D 05 0C D0 11 E0 80
D0 0D A0 0B B9 44 FE 91 0E 88 10 F8 4C 33 FC 8A
10 1D A9 2D A0 00 91 0E E6 0E D0 02 E6 0F A5 0C
A6 0D 20 64 FB 85 0C 86 0D 4C FF FB 20 A3 FB A9
00 48 A0 20 A9 00 06 0C 26 0D 26 06 26 07 2A C5
14 90 04 E5 14 E6 0C 88 D0 EC A8 B9 34 FE 48 A5
0C 05 0D 05 06 05 07 D0 D9 A0 00 68 91 0E F0 03
C8 D0 F8 A5 10 A6 11 60 D0 06 A2 00 8A 60 D0 FA
A2 00 A9 01 60 F0 F9 30 F7 A2 00 8A 60 F0 02 10
EF A2 00 8A 60 F0 E9 90 E7 A2 00 8A 60 F0 DB A2
00 8A 2A 60 20 8D FC A6 11 F0 13 B1 0C 91 0E C8
B1 0C 91 0E C8 D0 F4 E6 0D E6 0F CA D0 ED A6 10
F0 08 B1 0C 91 0E C8 CA D0 F8 4C 0E FB 85 10 86
11 20 A0 FC C8 B1 04 AA 86 0F 88 B1 04 85 0E 60
A0 01 B1 04 85 0D 88 B1 04 85 0C 4C 16 FB A9 01
4C CB FC A0 00 B1 04 A4 04 F0 07 C6 04 A0 00 91
04 60 C6 05 C6 04 91 04 60 A9 00 A2 00 48 A5 04
38 E9 02 85 04 B0 02 C6 05 A0 01 8A 91 04 68 88
91 04 60 A0 00 91 04 C8 48 8A 91 04 68 60 85 0E
86 0F 20 A0 FC B1 0C D1 0E D0 0C AA F0 10 C8 D0
F4 E6 0D E6 0F D0 EE B0 03 A2 FF 60 A2 01 60 85
0E 86 0F A2 00 A0 00 B1 0E F0 08 C8 D0 F9 E6 0F
E8 D0 F4 98 60 85 0C 86 0D 85 0E 86 0F A0 00 B1
0C F0 14 20 B7 FA 29 02 F0 06 B1 0C 69 20 91 0C
C8 D0 EC E6 0D D0 E8 A5 0E A6 0F 60 20 0E FB 85
0E 86 0F E8 8E 31 92 AA E8 8E 30 92 20 A0 FC 20
0E FB 85 10 86 11 A0 00 84 14 B1 10 18 65 0E 91
10 C8 B1 10 65 0F 91 10 CE 30 92 F0 11 A4 14 B1
0C C8 D0 02 E6 0D 84 14 20 68 F0 4C 78 FD CE 31
92 D0 EA 60 85 0C 86 0D A9 00 8D 2A 92 8D 2B 92
A0 01 B1 04 AA 88 B1 04 20 CD FC A0 02 A9 2A 91
04 C8 A9 92 91 04 A5 0C A6 0D 20 41 F7 AD 2A 92
AE 2B 92 60 A9 32 85 0C A9 92 85 0D A9 00 A8 A2
00 F0 0A 91 0C C8 D0 FB E6 0D CA D0 F6 C0 39 F0
05 91 0C C8 D0 F7 60 62 61 64 20 74 6F 6B 65 6E
3A 20 25 78 0A 00 53 75 63 63 65 73 73 0A 00 45
72 72 6F 72 0A 00 53 74 61 72 74 0A 00 6F 70 5F
63 6F 6E 64 20 65 72 72 6F 72 0A 00 49 46 20 43
6F 6E 64 0A 00 47 6F 20 49 44 4C 45 0A 00 25 32
78 00 0A 00 30 31 32 33 34 35 36 37 38 39 41 42
43 44 45 46 2D 32 31 34 37 34 38 33 36 34 38 00
00 01 02 0C 09 0A 10 40 50 A0 D0 66 66 66 66 A6
88 88 66 66 66 66 66 66 66 66 66 09 00 00 00 00
00 00 00 33 33 33 33 33 00 00 00 50 55 55 25 22
22 22 22 22 22 22 22 22 02 00 00 40 44 44 14 11
11 11 11 11 11 11 11 11 01 00 70 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

View File

@@ -1,4 +1,5 @@
SRCS=$(shell find src/ -type f -name "*.*v")
TBS=$(shell find tbs/ -type f -name "*.*v")
SRCS+=$(shell find ../ip/ -type f -name "*.*v" -not \( -name "*tmpl*" \))
SRCS+=$(shell find ../src/ -type f -name "*.*v")
@@ -28,6 +29,12 @@ sim: $(TARGET)
full_sim: $(TARGET) $(SD_IMAGE)
vvp $(TARGET) -fst
mapper_tb: $(SRCS) $(TBS)
iverilog -g2005-sv $(FLAGS) -s $@ -o $@ $(INC) $(SRCS) $(TBS)
mapper_code_tb: $(SRCS) $(TBS) $(INIT_MEM)
iverilog -g2005-sv $(FLAGS) -s $@ -o $@ $(INC) $(SRCS) $(TBS)
$(TARGET): $(INIT_MEM) $(SRCS)
iverilog -g2005-sv $(FLAGS) -s $(TOP_MODULE) -o $(TARGET) $(INC) $(SRCS)
@@ -46,3 +53,5 @@ clean:
rm -rf $(TARGET)
rm -rf $(INIT_MEM)
rm -rf $(SD_IMAGE)
rm -rf mapper_tb
rm -rf mapper_tb.vcd

View File

@@ -0,0 +1,23 @@
`timescale 1ns/1ps
module mapper_code_tb();
sim_top u_sim_top();
always begin
if (
u_sim_top.w_cpu_addr == 16'h0 &&
u_sim_top.w_cpu_we == '1
) begin
if (u_sim_top.w_cpu_data_from_cpu == 8'h6d) begin
$display("Good finish!");
$finish();
end else begin
$display("Bad finish!");
$finish_and_return(-1);
end
end
# 1;
end
endmodule

View File

@@ -0,0 +1,125 @@
`timescale 1ns/1ps
module mapper_tb();
logic r_clk_cpu;
// clk_cpu
initial begin
r_clk_cpu <= '1;
forever begin
#125 r_clk_cpu <= ~r_clk_cpu;
end
end
logic reset;
logic [15:0] addr;
logic [24:0] map_addr;
logic [7:0] i_data;
logic [7:0] o_data;
logic cs;
logic rwb;
mapper u_mapper(
.i_reset(reset),
.i_clk(r_clk_cpu),
.i_cs(cs),
.i_we(~rwb),
.i_data(i_data),
.o_data(o_data),
.i_cpu_addr(addr),
.o_mapped_addr(map_addr)
);
/* These could be made better probably */
task write_reg(input logic [4:0] _addr, input logic [7:0] _data);
@(negedge r_clk_cpu);
cs <= '1;
addr <= _addr;
rwb <= '0;
i_data <= '1;
@(posedge r_clk_cpu);
i_data <= _data;
@(negedge r_clk_cpu);
cs <= '0;
rwb <= '1;
endtask
task read_reg(input logic [2:0] _addr, output logic [7:0] _data);
@(negedge r_clk_cpu);
cs <= '1;
addr <= _addr;
rwb <= '1;
i_data <= '1;
@(posedge r_clk_cpu);
_data <= o_data;
@(negedge r_clk_cpu);
cs <= '0;
rwb <= '1;
endtask
int errors;
int rnd_values [16];
int rnd_addr;
initial begin
for (int i = 0; i < 16; i++) begin
rnd_values[i] = $urandom();
end
errors = 0;
repeat (5) @(posedge r_clk_cpu);
reset = 1;
cs = 0;
rwb = 1;
addr = '0;
i_data = '0;
repeat (5) @(posedge r_clk_cpu);
reset = 0;
repeat (5) @(posedge r_clk_cpu);
for (int i = 0; i < 16; i++) begin
write_reg(2*i, rnd_values[i][7:0]);
write_reg(2*i + 1, rnd_values[i][15:8]);
end
repeat (5) @(posedge r_clk_cpu);
for (int i = 0; i < 16; i++) begin
assert (u_mapper.mm[i] == rnd_values[i][15:0]) else begin
$error("mm[%d] expected 0x%x got 0x%x", i, rnd_values[i][15:0], u_mapper.mm[i]);
errors += 1;
end
end
for (int i = 0; i < 16; i++) begin
rnd_addr = $urandom();
addr = i << 12 | rnd_addr[11:0];
#1 // Neccesary for this assertion to work
assert (map_addr == {rnd_values[i][12:0], rnd_addr[11:0]}) else begin
$error("Expected %x got %x", {rnd_values[i][12:0], rnd_addr[11:0]}, map_addr);
end
@(posedge r_clk_cpu);
end
if (errors != 0) begin
$finish_and_return(-1);
end else begin
$finish();
end
end
initial
begin
$dumpfile("mapper_tb.vcd");
$dumpvars(0,mapper_tb);
for (int i = 0; i < 16; i++) $dumpvars(0, u_mapper.mm[i]);
end
endmodule

View File

@@ -0,0 +1,57 @@
module mapper(
input i_reset,
input i_clk,
input i_cs,
input i_we,
input [7:0] i_data,
output logic [7:0] o_data,
input [15:0] i_cpu_addr,
output logic [24:0] o_mapped_addr
);
logic [15:0] mm [16];
logic [15:0] mm_next [16];
logic [31:0] we;
// TODO These have basically the same name.
logic [15:0] mm_sel;
logic [15:0] selected_mm;
always_comb begin
we = ((i_we & i_cs) << i_cpu_addr[4:0]);
mm_sel = (1 << i_cpu_addr[4:1]);
o_data = mm_sel[8*i_cpu_addr[0] +: 8];
selected_mm = mm[i_cpu_addr[15:12]];
o_mapped_addr = {selected_mm[12:0], i_cpu_addr[11:0]};
for (int i = 0; i < 16; i++) begin
mm_next[i] = mm[i];
end
for (int i = 0; i < 32; i++) begin
if (we[i]) begin
mm_next[i/2][(i%2)*8 +: 8] = i_data;
end
end
end
always_ff @(negedge i_clk or posedge i_reset) begin
if (i_reset) begin
for (int i = 0; i < 16; i++) begin
mm[i] <= i;
end
end else begin
for (int i = 0; i < 16; i++) begin
mm[i] <= mm_next[i];
end
end
end
endmodule

View File

@@ -72,6 +72,8 @@ always @(posedge clk_cpu) begin
end
logic w_mapper_cs;
logic w_rom_cs;
logic w_leds_cs;
logic w_sdram_cs;
@@ -91,19 +93,34 @@ logic [7:0] w_uart_data_out;
logic [7:0] w_spi_data_out;
logic [7:0] w_sdram_data_out;
logic [24:0] w_mapped_addr;
always_comb begin
w_rom_cs = cpu_addr >= 16'hf000 && cpu_addr <= 16'hffff;
w_timer_cs = cpu_addr >= 16'heff8 && cpu_addr <= 16'heffb;
w_multiplier_cs = cpu_addr >= 16'heff0 && cpu_addr <= 16'heff7;
w_divider_cs = cpu_addr >= 16'hefe8 && cpu_addr <= 16'hefef;
w_uart_cs = cpu_addr >= 16'hefe6 && cpu_addr <= 16'hefe7;
w_spi_cs = cpu_addr >= 16'hefd8 && cpu_addr <= 16'hefdb;
w_leds_cs = cpu_addr == 16'hefff;
w_sdram_cs = cpu_addr < 16'he000;
w_mapper_cs = cpu_addr >= 16'h200 && cpu_addr <= 16'h21f;
w_rom_cs = w_mapped_addr >= 16'hf000 && w_mapped_addr <= 16'hffff;
w_timer_cs = w_mapped_addr >= 16'heff8 && w_mapped_addr <= 16'heffb;
w_multiplier_cs = w_mapped_addr >= 16'heff0 && w_mapped_addr <= 16'heff7;
w_divider_cs = w_mapped_addr >= 16'hefe8 && w_mapped_addr <= 16'hefef;
w_uart_cs = w_mapped_addr >= 16'hefe6 && w_mapped_addr <= 16'hefe7;
w_spi_cs = w_mapped_addr >= 16'hefd8 && w_mapped_addr <= 16'hefdb;
w_leds_cs = w_mapped_addr == 16'hefff;
w_sdram_cs = ~(
w_rom_cs |
w_timer_cs |
w_multiplier_cs |
w_divider_cs |
w_uart_cs |
w_spi_cs |
w_leds_cs
);
if (w_rom_cs)
cpu_data_out = w_rom_data_out;
else if (w_mapper_cs)
cpu_data_out = w_mapper_data_out;
else if (w_leds_cs)
cpu_data_out = w_leds_data_out;
else if (w_timer_cs)
@@ -123,7 +140,7 @@ always_comb begin
end
rom #(.DATA_WIDTH(8), .ADDR_WIDTH(12)) u_rom(
.addr(cpu_addr[11:0]),
.addr(w_mapped_addr[11:0]),
.clk(clk_cpu),
.data(w_rom_data_out)
);
@@ -146,10 +163,21 @@ timer u_timer(
.o_data(w_timer_data_out),
.cs(w_timer_cs),
.rwb(cpu_rwb),
.addr(cpu_addr[1:0]),
.addr(w_mapped_addr[1:0]),
.irqb(w_timer_irqb)
);
mapper u_mapper(
.i_reset(~cpu_resb),
.i_clk(clk_cpu),
.i_cs(w_mapper_cs),
.i_we(~cpu_rwb),
.i_data(cpu_data_in),
.o_data(w_mapper_data_out),
.i_cpu_addr(cpu_addr),
.o_mapped_addr(w_mapped_addr)
);
multiplier u_multiplier(
.clk(clk_cpu),
.reset(~cpu_resb),
@@ -157,7 +185,7 @@ multiplier u_multiplier(
.o_data(w_multiplier_data_out),
.cs(w_multiplier_cs),
.rwb(cpu_rwb),
.addr(cpu_addr[2:0])
.addr(w_mapped_addr[2:0])
);
divider_wrapper u_divider(
@@ -168,7 +196,7 @@ divider_wrapper u_divider(
.o_data(w_divider_data_out),
.cs(w_divider_cs),
.rwb(cpu_rwb),
.addr(cpu_addr[2:0])
.addr(w_mapped_addr[2:0])
);
logic w_uart_irqb;
@@ -181,7 +209,7 @@ uart_wrapper u_uart(
.o_data(w_uart_data_out),
.cs(w_uart_cs),
.rwb(cpu_rwb),
.addr(cpu_addr[0]),
.addr(w_mapped_addr[0]),
.rx_i(uart_rx),
.tx_o(uart_tx),
.irqb(w_uart_irqb)
@@ -192,7 +220,7 @@ spi_controller spi_controller(
.i_rst(~cpu_resb),
.i_cs(w_spi_cs),
.i_rwb(cpu_rwb),
.i_addr(cpu_addr[1:0]),
.i_addr(w_mapped_addr[1:0]),
.i_data(cpu_data_in),
.o_data(w_spi_data_out),
@@ -213,7 +241,7 @@ sdram_adapter u_sdram_adapter(
.i_cs(w_sdram_cs),
.i_rwb(cpu_rwb),
.i_addr(cpu_addr),
.i_addr(w_mapped_addr),
.i_data(cpu_data_in),
.o_data(w_sdram_data_out),

View File

@@ -1,104 +1,106 @@
<efx:project xmlns:efx="http://www.efinixinc.com/enf_proj" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="super6502" description="" last_change_date="Sun Oct 15 2023 09:26:48 PM" location="/home/byron/Projects/super6502/hw/efinix_fpga" sw_version="2023.1.150" last_run_state="pass" last_run_tool="efx_pgm" last_run_flow="bitstream" config_result_in_sync="sync" design_ood="sync" place_ood="sync" route_ood="sync" xsi:schemaLocation="http://www.efinixinc.com/enf_proj enf_proj.xsd">
<?xml version="1.0" encoding="UTF-8"?>
<efx:project name="super6502" description="" last_change_date="Thu October 19 2023 18:55:10" location="/home/byron/ServerProjects/super6502/hw/efinix_fpga" sw_version="2022.2.322" last_run_state="fail" last_run_tool="efx_map" last_run_flow="syn" config_result_in_sync="sync" design_ood="" place_ood="sync" route_ood="sync" xmlns:efx="http://www.efinixinc.com/enf_proj" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.efinixinc.com/enf_proj enf_proj.xsd">
<efx:device_info>
<efx:family name="Trion" />
<efx:device name="T20F256" />
<efx:timing_model name="C4" />
<efx:family name="Trion"/>
<efx:device name="T20F256"/>
<efx:timing_model name="C4"/>
</efx:device_info>
<efx:design_info def_veri_version="sv_09" def_vhdl_version="vhdl_2008">
<efx:top_module name="super6502" />
<efx:design_file name="src/super6502.sv" version="default" library="default" />
<efx:design_file name="src/leds.sv" version="default" library="default" />
<efx:design_file name="src/sdram_adapter.sv" version="default" library="default" />
<efx:design_file name="src/timer.sv" version="default" library="default" />
<efx:design_file name="src/interrupt_controller.sv" version="default" library="default" />
<efx:design_file name="src/multiplier.sv" version="default" library="default" />
<efx:design_file name="src/divider_wrapper.sv" version="default" library="default" />
<efx:design_file name="src/uart_wrapper.sv" version="default" library="default" />
<efx:design_file name="src/sd_controller.sv" version="default" library="default" />
<efx:design_file name="src/crc7.sv" version="default" library="default" />
<efx:design_file name="src/rom.sv" version="default" library="default" />
<efx:design_file name="src/spi_controller.sv" version="default" library="default" />
<efx:top_vhdl_arch name="" />
<efx:top_module name="super6502"/>
<efx:design_file name="src/super6502.sv" version="default" library="default"/>
<efx:design_file name="src/leds.sv" version="default" library="default"/>
<efx:design_file name="src/sdram_adapter.sv" version="default" library="default"/>
<efx:design_file name="src/timer.sv" version="default" library="default"/>
<efx:design_file name="src/interrupt_controller.sv" version="default" library="default"/>
<efx:design_file name="src/multiplier.sv" version="default" library="default"/>
<efx:design_file name="src/divider_wrapper.sv" version="default" library="default"/>
<efx:design_file name="src/uart_wrapper.sv" version="default" library="default"/>
<efx:design_file name="src/sd_controller.sv" version="default" library="default"/>
<efx:design_file name="src/crc7.sv" version="default" library="default"/>
<efx:design_file name="src/rom.sv" version="default" library="default"/>
<efx:design_file name="src/spi_controller.sv" version="default" library="default"/>
<efx:design_file name="src/mapper.sv" version="default" library="default"/>
<efx:top_vhdl_arch name=""/>
</efx:design_info>
<efx:constraint_info>
<efx:sdc_file name="constraints/super6502.pt.sdc" />
<efx:inter_file name="" />
<efx:sdc_file name="constraints/super6502.pt.sdc"/>
<efx:inter_file name=""/>
</efx:constraint_info>
<efx:sim_info />
<efx:misc_info />
<efx:sim_info/>
<efx:misc_info/>
<efx:ip_info>
<efx:ip instance_name="sdram_controller" path="ip/sdram_controller/settings.json">
<efx:ip_src_file name="sdram_controller.v" />
<efx:ip_src_file name="sdram_controller.v"/>
</efx:ip>
<efx:ip instance_name="divider" path="ip/divider/settings.json">
<efx:ip_src_file name="divider.v" />
<efx:ip_src_file name="divider.v"/>
</efx:ip>
<efx:ip instance_name="uart" path="ip/uart/settings.json">
<efx:ip_src_file name="uart.v" />
<efx:ip_src_file name="uart.v"/>
</efx:ip>
</efx:ip_info>
<efx:synthesis tool_name="efx_map">
<efx:param name="work_dir" value="work_syn" value_type="e_string" />
<efx:param name="write_efx_verilog" value="on" value_type="e_bool" />
<efx:param name="mode" value="speed" value_type="e_option" />
<efx:param name="max_ram" value="-1" value_type="e_integer" />
<efx:param name="max_mult" value="-1" value_type="e_integer" />
<efx:param name="infer-clk-enable" value="3" value_type="e_option" />
<efx:param name="infer-sync-set-reset" value="1" value_type="e_option" />
<efx:param name="fanout-limit" value="0" value_type="e_integer" />
<efx:param name="bram_output_regs_packing" value="1" value_type="e_option" />
<efx:param name="retiming" value="1" value_type="e_option" />
<efx:param name="seq_opt" value="1" value_type="e_option" />
<efx:param name="blast_const_operand_adders" value="1" value_type="e_option" />
<efx:param name="operator-sharing" value="0" value_type="e_option" />
<efx:param name="optimize-adder-tree" value="0" value_type="e_option" />
<efx:param name="mult_input_regs_packing" value="1" value_type="e_option" />
<efx:param name="mult_output_regs_packing" value="1" value_type="e_option" />
<efx:param name="min-sr-fanout" value="0" value_type="e_option" />
<efx:param name="seq-opt-sync-only" value="0" value_type="e_option" />
<efx:param name="blackbox-error" value="1" value_type="e_option" />
<efx:param name="allow-const-ram-index" value="0" value_type="e_option" />
<efx:param name="hdl-compile-unit" value="1" value_type="e_option" />
<efx:param name="create-onehot-fsms" value="0" value_type="e_option" />
<efx:param name="min-ce-fanout" value="0" value_type="e_integer" />
<efx:param name="mult-decomp-retime" value="0" value_type="e_option" />
<efx:param name="optimize-zero-init-rom" value="1" value_type="e_option" />
<efx:param name="include" value="ip/sdram_controller" value_type="e_string" />
<efx:param name="include" value="ip/divider" value_type="e_string" />
<efx:param name="include" value="ip/uart" value_type="e_string" />
<efx:param name="work_dir" value="work_syn" value_type="e_string"/>
<efx:param name="write_efx_verilog" value="on" value_type="e_bool"/>
<efx:param name="mode" value="speed" value_type="e_option"/>
<efx:param name="max_ram" value="-1" value_type="e_integer"/>
<efx:param name="max_mult" value="-1" value_type="e_integer"/>
<efx:param name="infer-clk-enable" value="3" value_type="e_option"/>
<efx:param name="infer-sync-set-reset" value="1" value_type="e_option"/>
<efx:param name="fanout-limit" value="0" value_type="e_integer"/>
<efx:param name="bram_output_regs_packing" value="1" value_type="e_option"/>
<efx:param name="retiming" value="1" value_type="e_option"/>
<efx:param name="seq_opt" value="1" value_type="e_option"/>
<efx:param name="blast_const_operand_adders" value="1" value_type="e_option"/>
<efx:param name="operator-sharing" value="0" value_type="e_option"/>
<efx:param name="optimize-adder-tree" value="0" value_type="e_option"/>
<efx:param name="mult_input_regs_packing" value="1" value_type="e_option"/>
<efx:param name="mult_output_regs_packing" value="1" value_type="e_option"/>
<efx:param name="min-sr-fanout" value="0" value_type="e_option"/>
<efx:param name="seq-opt-sync-only" value="0" value_type="e_option"/>
<efx:param name="blackbox-error" value="1" value_type="e_option"/>
<efx:param name="allow-const-ram-index" value="0" value_type="e_option"/>
<efx:param name="hdl-compile-unit" value="1" value_type="e_option"/>
<efx:param name="create-onehot-fsms" value="0" value_type="e_option"/>
<efx:param name="min-ce-fanout" value="0" value_type="e_integer"/>
<efx:param name="mult-decomp-retime" value="0" value_type="e_option"/>
<efx:param name="optimize-zero-init-rom" value="1" value_type="e_option"/>
<efx:param name="include" value="ip/sdram_controller" value_type="e_string"/>
<efx:param name="include" value="ip/divider" value_type="e_string"/>
<efx:param name="include" value="ip/uart" value_type="e_string"/>
</efx:synthesis>
<efx:place_and_route tool_name="efx_pnr">
<efx:param name="work_dir" value="work_pnr" value_type="e_string" />
<efx:param name="verbose" value="off" value_type="e_bool" />
<efx:param name="load_delaym" value="on" value_type="e_bool" />
<efx:param name="optimization_level" value="NULL" value_type="e_option" />
<efx:param name="seed" value="1" value_type="e_integer" />
<efx:param name="placer_effort_level" value="2" value_type="e_option" />
<efx:param name="max_threads" value="-1" value_type="e_integer" />
<efx:param name="work_dir" value="work_pnr" value_type="e_string"/>
<efx:param name="verbose" value="off" value_type="e_bool"/>
<efx:param name="load_delaym" value="on" value_type="e_bool"/>
<efx:param name="optimization_level" value="NULL" value_type="e_option"/>
<efx:param name="seed" value="1" value_type="e_integer"/>
<efx:param name="placer_effort_level" value="2" value_type="e_option"/>
<efx:param name="max_threads" value="-1" value_type="e_integer"/>
</efx:place_and_route>
<efx:bitstream_generation tool_name="efx_pgm">
<efx:param name="mode" value="active" value_type="e_option" />
<efx:param name="width" value="1" value_type="e_option" />
<efx:param name="enable_roms" value="smart" value_type="e_option" />
<efx:param name="spi_low_power_mode" value="on" value_type="e_bool" />
<efx:param name="io_weak_pullup" value="on" value_type="e_bool" />
<efx:param name="oscillator_clock_divider" value="DIV8" value_type="e_option" />
<efx:param name="bitstream_compression" value="off" value_type="e_bool" />
<efx:param name="enable_external_master_clock" value="off" value_type="e_bool" />
<efx:param name="active_capture_clk_edge" value="posedge" value_type="e_option" />
<efx:param name="jtag_usercode" value="0xFFFFFFFF" value_type="e_string" />
<efx:param name="release_tri_then_reset" value="on" value_type="e_bool" />
<efx:param name="cold_boot" value="off" value_type="e_bool" />
<efx:param name="cascade" value="off" value_type="e_option" />
<efx:param name="generate_bit" value="on" value_type="e_bool" />
<efx:param name="generate_bitbin" value="off" value_type="e_bool" />
<efx:param name="generate_hex" value="on" value_type="e_bool" />
<efx:param name="generate_hexbin" value="off" value_type="e_bool" />
<efx:param name="four_byte_addressing" value="off" value_type="e_bool" />
<efx:param name="mode" value="active" value_type="e_option"/>
<efx:param name="width" value="1" value_type="e_option"/>
<efx:param name="enable_roms" value="smart" value_type="e_option"/>
<efx:param name="spi_low_power_mode" value="on" value_type="e_bool"/>
<efx:param name="io_weak_pullup" value="on" value_type="e_bool"/>
<efx:param name="oscillator_clock_divider" value="DIV8" value_type="e_option"/>
<efx:param name="bitstream_compression" value="off" value_type="e_bool"/>
<efx:param name="enable_external_master_clock" value="off" value_type="e_bool"/>
<efx:param name="active_capture_clk_edge" value="posedge" value_type="e_option"/>
<efx:param name="jtag_usercode" value="0xFFFFFFFF" value_type="e_string"/>
<efx:param name="release_tri_then_reset" value="on" value_type="e_bool"/>
<efx:param name="cold_boot" value="off" value_type="e_bool"/>
<efx:param name="cascade" value="off" value_type="e_option"/>
<efx:param name="generate_bit" value="on" value_type="e_bool"/>
<efx:param name="generate_bitbin" value="off" value_type="e_bool"/>
<efx:param name="generate_hex" value="on" value_type="e_bool"/>
<efx:param name="generate_hexbin" value="off" value_type="e_bool"/>
<efx:param name="four_byte_addressing" value="off" value_type="e_bool"/>
</efx:bitstream_generation>
<efx:debugger>
<efx:param name="work_dir" value="work_dbg" value_type="e_string" />
<efx:param name="auto_instantiation" value="off" value_type="e_bool" />
<efx:param name="profile" value="debug_profile.wizard.json" value_type="e_string" />
<efx:param name="work_dir" value="work_dbg" value_type="e_string"/>
<efx:param name="auto_instantiation" value="off" value_type="e_bool"/>
<efx:param name="profile" value="debug_profile.wizard.json" value_type="e_string"/>
</efx:debugger>
</efx:project>
</efx:project>

View File

@@ -0,0 +1,39 @@
CC=../../cc65/bin/cl65
LD=../../cc65/bin/cl65
CFLAGS=-T -t none -I. --cpu "65C02"
LDFLAGS=-C link.ld -m $(NAME).map
NAME=mapper_test
BIN=$(NAME).bin
HEX=$(NAME).hex
LISTS=lists
SRCS=$(wildcard *.s) $(wildcard *.c)
SRCS+=$(wildcard **/*.s) $(wildcard **/*.c)
OBJS+=$(patsubst %.s,%.o,$(filter %s,$(SRCS)))
OBJS+=$(patsubst %.c,%.o,$(filter %c,$(SRCS)))
# Make sure the kernel linked to correct address, no relocation!
all: $(HEX)
$(HEX): $(BIN)
objcopy --input-target=binary --output-target=verilog $(BIN) $(HEX)
$(BIN): $(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) -o $@
%.o: %.c $(LISTS)
$(CC) $(CFLAGS) -l $(LISTS)/$<.list -c $< -o $@
%.o: %.s $(LISTS)
$(CC) $(CFLAGS) -l $(LISTS)/$<.list -c $< -o $@
$(LISTS):
mkdir -p $(addprefix $(LISTS)/,$(sort $(dir $(SRCS))))
.PHONY: clean
clean:
rm -rf $(OBJS) $(BIN) $(HEX) $(LISTS) $(NAME).map

View File

@@ -0,0 +1,35 @@
MEMORY
{
ZP: start = $0, size = $100, type = rw, define = yes;
SDRAM: start = $9200, size = $4d00, type = rw, define = yes;
ROM: start = $F000, size = $1000, file = %O;
}
SEGMENTS {
ZEROPAGE: load = ZP, type = zp, define = yes;
DATA: load = ROM, type = rw, define = yes, run = SDRAM;
BSS: load = SDRAM, type = bss, define = yes;
HEAP: load = SDRAM, type = bss, optional = yes;
STARTUP: load = ROM, type = ro;
ONCE: load = ROM, type = ro, optional = yes;
CODE: load = ROM, type = ro;
RODATA: load = ROM, type = ro;
VECTORS: load = ROM, type = ro, start = $FFFA;
}
FEATURES {
CONDES: segment = STARTUP,
type = constructor,
label = __CONSTRUCTOR_TABLE__,
count = __CONSTRUCTOR_COUNT__;
CONDES: segment = STARTUP,
type = destructor,
label = __DESTRUCTOR_TABLE__,
count = __DESTRUCTOR_COUNT__;
}
SYMBOLS {
# Define the stack size for the application
__STACKSIZE__: value = $0200, type = weak;
__STACKSTART__: type = weak, value = $0800; # 2k stack
}

View File

@@ -0,0 +1,64 @@
.export _init, _nmi_int, _irq_int
.code
_nmi_int:
_irq_int:
MAPPER_BASE = $200
_init:
ldx #$ff
txs
lda #$10
sta MAPPER_BASE + 2
; This should store 0x55aa to memory $010000, instead of $001000
lda #$aa
sta $1000
lda #$55
sta $1001
lda #$01
sta MAPPER_BASE + 2
; This should store 0xddcc to memory $001000
lda #$cc
sta $1000
lda #$dd
sta $1001
lda #$10
sta MAPPER_BASE + 2
lda $1000
cmp #$aa
bne @bad
lda $1001
cmp #$55
bne @bad
lda #$01
sta MAPPER_BASE + 2
lda $1000
cmp #$cc
bne @bad
lda $1001
cmp #$dd
bne @bad
@end:
lda #$6d
sta $00
bra @end
@bad:
lda #$bd
sta $00
bra @bad

View File

@@ -0,0 +1,14 @@
; ---------------------------------------------------------------------------
; vectors.s
; ---------------------------------------------------------------------------
;
; Defines the interrupt vector table.
.import _init
.import _nmi_int, _irq_int
.segment "VECTORS"
.addr _nmi_int ; NMI vector
.addr _init ; Reset vector
.addr _irq_int ; IRQ/BRK vector