aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlonkaars <loek@pipeframe.xyz>2023-04-07 19:29:17 +0200
committerlonkaars <loek@pipeframe.xyz>2023-04-07 19:29:17 +0200
commitcc5fda1626ac77a74459bcfe3c422be3c2a5267b (patch)
tree07b46ae1a507359ac241869c7c3e5887d80880d0
parent892424ba4d0c979e4351f7a866b6fe777783e4d2 (diff)
WIP more debugging
-rw-r--r--assets/ppu-pipeline.svg2
-rw-r--r--basys3/basys3.srcs/io.xdc3
-rw-r--r--basys3/basys3.srcs/ppu.vhd5
-rw-r--r--basys3/basys3.srcs/ppu_dispctl.vhd2
-rw-r--r--basys3/basys3.srcs/ppu_pceg.vhd3
-rw-r--r--basys3/basys3.srcs/ppu_pceg_consts.vhd3
-rw-r--r--basys3/basys3.srcs/ppu_sprite_bg.vhd1
-rw-r--r--basys3/basys3.srcs/ppu_sprite_fg.vhd21
-rw-r--r--basys3/basys3.srcs/ppu_tb.vhd.m45
-rw-r--r--basys3/basys3.srcs/sources_1/ip/ppu_dispctl_pixclk/ppu_dispctl_pixclk.xci12
-rw-r--r--basys3/basys3.srcs/spi.vhd5
-rw-r--r--basys3/basys3.srcs/spi_tb.vhd967
-rw-r--r--basys3/basys3.srcs/spi_tb.vhd.m41
-rw-r--r--basys3/basys3.xpr26
-rw-r--r--basys3/ppu_tb_behav.wcfg375
-rw-r--r--docs/architecture.md4
-rw-r--r--docs/ppu.drawio2
-rw-r--r--src/demo.c12
-rw-r--r--src/main.c4
-rw-r--r--src/ppu/stm.c2
-rw-r--r--src/ppusim/mem.c11
-rw-r--r--src/ppusim/sim.h2
-rw-r--r--src/ppusim/work.c4
-rw-r--r--src/stm32/setup.c1
-rw-r--r--test/ppu-stm-integration-demo/capture-debug-5.pvc83
-rw-r--r--test/ppu-stm-integration-demo/data.h4
-rwxr-xr-xtest/ppu-stm-integration-demo/data2pputb.awk2
-rw-r--r--test/ppu-stm-integration-demo/test-background-color.txt5
-rw-r--r--test/ppu-stm-integration-demo/test-foreground-sprite.pngbin0 -> 964 bytes
-rw-r--r--test/ppu-stm-integration-demo/test-foreground-sprite.txt56
-rw-r--r--vhdl_ls.toml5
31 files changed, 1563 insertions, 65 deletions
diff --git a/assets/ppu-pipeline.svg b/assets/ppu-pipeline.svg
index 167ef3b..532e443 100644
--- a/assets/ppu-pipeline.svg
+++ b/assets/ppu-pipeline.svg
@@ -1,3 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="903px" height="152px" viewBox="-0.5 -0.5 903 152" style="background-color: rgb(255, 255, 255);"><defs/><g><path d="M 180 150 L 180 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 260 150 L 260 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 340 150 L 340 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 420 150 L 420 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 500 150 L 500 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 580 150 L 580 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 660 150 L 660 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 740 150 L 740 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 901 20 L 100 20" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><rect x="0" y="30" width="100" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 45px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ppu_sprite_bg</div></div></div></foreignObject><text x="96" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">ppu_sprite_bg</text></switch></g><rect x="100" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">0</div></div></div></foreignObject><text x="140" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">0</text></switch></g><rect x="180" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">1</div></div></div></foreignObject><text x="220" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">1</text></switch></g><rect x="260" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 261px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">2</div></div></div></foreignObject><text x="300" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">2</text></switch></g><rect x="340" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">3</div></div></div></foreignObject><text x="380" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">3</text></switch></g><rect x="420" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">4</div></div></div></foreignObject><text x="460" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">4</text></switch></g><rect x="500" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">5</div></div></div></foreignObject><text x="540" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">5</text></switch></g><rect x="580" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 581px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">6</div></div></div></foreignObject><text x="620" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">6</text></switch></g><rect x="660" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 661px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">7</div></div></div></foreignObject><text x="700" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">7</text></switch></g><path d="M 190 30 L 330 30 L 340 45 L 330 60 L 190 60 L 180 45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 45px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: normal; overflow-wrap: normal;">BAM address</div></div></div></foreignObject><text x="260" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">BAM address</text></switch></g><rect x="0" y="70" width="100" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 85px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ppu_sprite_fg</div></div></div></foreignObject><text x="96" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">ppu_sprite_fg</text></switch></g><path d="M 190 70 L 330 70 L 340 85 L 330 100 L 190 100 L 180 85 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 85px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: normal; overflow-wrap: normal;">TMM address</div></div></div></foreignObject><text x="260" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">TMM address</text></switch></g><rect x="0" y="0" width="100" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 10px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">clk</div></div></div></foreignObject><text x="96" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">clk</text></switch></g><rect x="0" y="110" width="100" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 125px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ppu_pceg</div></div></div></foreignObject><text x="96" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">ppu_pceg</text></switch></g><path d="M 750 110 L 810 110 L 820 125 L 810 140 L 750 140 L 740 125 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 125px; margin-left: 741px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: normal; overflow-wrap: normal;">pixel done</div></div></div></foreignObject><text x="780" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">pixel done</text></switch></g><path d="M 750 30 L 810 30 L 820 45 L 810 60 L 750 60 L 740 45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 741px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">TMM data</div></div></div></foreignObject><text x="780" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">TMM data</text></switch></g><path d="M 510 30 L 650 30 L 660 45 L 650 60 L 510 60 L 500 45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 45px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: normal; overflow-wrap: normal;">TMM address</div></div></div></foreignObject><text x="580" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">TMM address</text></switch></g><path d="M 830 110 L 890 110 L 900 125 L 890 140 L 830 140 L 820 125 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 125px; margin-left: 821px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: normal; overflow-wrap: normal;">pixel ready</div></div></div></foreignObject><text x="860" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">pixel ready</text></switch></g><path d="M 100 150 L 100 0" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 820 150 L 820 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 900 150 L 900 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><rect x="740" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 741px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">8</div></div></div></foreignObject><text x="780" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">8</text></switch></g><rect x="820" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 821px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">9</div></div></div></foreignObject><text x="860" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">9</text></switch></g><path d="M 430 30 L 490 30 L 500 45 L 490 60 L 430 60 L 420 45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">BAM data</div></div></div></foreignObject><text x="460" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">BAM data</text></switch></g><path d="M 430 70 L 490 70 L 500 85 L 490 100 L 430 100 L 420 85 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 85px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">TMM data</div></div></div></foreignObject><text x="460" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">TMM data</text></switch></g><path d="M 110 30 L 170 30 L 180 45 L 170 60 L 110 60 L 100 45 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="140" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 110 110 L 170 110 L 180 125 L 170 140 L 110 140 L 100 125 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 125px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">input<br />stability</div></div></div></foreignObject><text x="140" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">input...</text></switch></g><path d="M 110 70 L 170 70 L 180 85 L 170 100 L 110 100 L 100 85 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 85px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="140" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 350 30 L 410 30 L 420 45 L 410 60 L 350 60 L 340 45 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="380" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 350 70 L 410 70 L 420 85 L 410 100 L 350 100 L 340 85 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 85px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="380" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 670 30 L 730 30 L 740 45 L 730 60 L 670 60 L 660 45 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 661px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="700" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 510 70 L 570 70 L 580 85 L 570 100 L 510 100 L 500 85 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 85px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="540" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 830 30 L 890 30 L 900 45 L 890 60 L 830 60 L 820 45 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 821px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="860" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="903px" height="202px" viewBox="-0.5 -0.5 903 202" style="background-color: rgb(255, 255, 255);"><defs/><g><path d="M 100 200 L 100 0" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 200 L 180 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 260 200 L 260 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 340 200 L 340 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 420 200 L 420 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 500 200 L 500 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 580 200 L 580 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 660 200 L 660 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 740 200 L 740 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 820 200 L 820 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 900 200 L 900 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 190 110 L 490 110 L 500 125 L 490 140 L 190 140 L 180 125 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 318px; height: 1px; padding-top: 125px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">hold</div></div></div></foreignObject><text x="340" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">hold</text></switch></g><path d="M 901 20 L 100 20" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 45px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">ppu_sprite_bg</div></div></div></foreignObject><text x="96" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">ppu_sprite_bg</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">0</div></div></div></foreignObject><text x="140" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">0</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">1</div></div></div></foreignObject><text x="220" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">1</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 261px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">2</div></div></div></foreignObject><text x="300" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">2</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">3</div></div></div></foreignObject><text x="380" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">3</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">4</div></div></div></foreignObject><text x="460" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">4</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">5</div></div></div></foreignObject><text x="540" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">5</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 581px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">6</div></div></div></foreignObject><text x="620" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">6</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 661px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">7</div></div></div></foreignObject><text x="700" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">7</text></switch></g><path d="M 190 30 L 330 30 L 340 45 L 330 60 L 190 60 L 180 45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 45px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; text-decoration: underline; white-space: normal; overflow-wrap: normal;">BAM address</div></div></div></foreignObject><text x="260" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">BAM address</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 85px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">ppu_sprite_fg</div></div></div></foreignObject><text x="96" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">ppu_sprite_fg</text></switch></g><path d="M 190 70 L 330 70 L 340 85 L 330 100 L 190 100 L 180 85 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 85px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; text-decoration: underline; white-space: normal; overflow-wrap: normal;">TMM address</div></div></div></foreignObject><text x="260" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">TMM address</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 10px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">clk</div></div></div></foreignObject><text x="96" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">clk</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 165px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">ppu_pceg</div></div></div></foreignObject><text x="96" y="169" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">ppu_pceg</text></switch></g><path d="M 750 160 L 810 160 L 820 175 L 810 190 L 750 190 L 740 175 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 175px; margin-left: 741px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; text-decoration: underline; white-space: normal; overflow-wrap: normal;">pixel done</div></div></div></foreignObject><text x="780" y="179" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">pixel done</text></switch></g><path d="M 750 30 L 810 30 L 820 45 L 810 60 L 750 60 L 740 45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 741px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">TMM data</div></div></div></foreignObject><text x="780" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">TMM data</text></switch></g><path d="M 510 30 L 650 30 L 660 45 L 650 60 L 510 60 L 500 45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 45px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; text-decoration: underline; white-space: normal; overflow-wrap: normal;">TMM address</div></div></div></foreignObject><text x="580" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">TMM address</text></switch></g><path d="M 830 160 L 890 160 L 900 175 L 890 190 L 830 190 L 820 175 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 175px; margin-left: 821px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; text-decoration: underline; white-space: normal; overflow-wrap: normal;">pixel ready</div></div></div></foreignObject><text x="860" y="179" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">pixel ready</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 741px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">8</div></div></div></foreignObject><text x="780" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">8</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 821px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">9</div></div></div></foreignObject><text x="860" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">9</text></switch></g><path d="M 430 30 L 490 30 L 500 45 L 490 60 L 430 60 L 420 45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">BAM data</div></div></div></foreignObject><text x="460" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">BAM data</text></switch></g><path d="M 430 70 L 490 70 L 500 85 L 490 100 L 430 100 L 420 85 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 85px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">TMM data</div></div></div></foreignObject><text x="460" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">TMM data</text></switch></g><path d="M 110 30 L 170 30 L 180 45 L 170 60 L 110 60 L 100 45 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="140" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 110 150 L 170 150 L 180 165 L 170 180 L 110 180 L 100 165 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 165px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">input<br />stability</div></div></div></foreignObject><text x="140" y="169" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">input...</text></switch></g><path d="M 350 30 L 410 30 L 420 45 L 410 60 L 350 60 L 340 45 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="380" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 350 70 L 410 70 L 420 85 L 410 100 L 350 100 L 340 85 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 85px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="380" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 670 30 L 730 30 L 740 45 L 730 60 L 670 60 L 660 45 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 661px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="700" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 510 70 L 570 70 L 580 85 L 570 100 L 510 100 L 500 85 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 85px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="540" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 830 30 L 890 30 L 900 45 L 890 60 L 830 60 L 820 45 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 821px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="860" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 110 110 L 170 110 L 180 125 L 170 140 L 110 140 L 100 125 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 125px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; text-decoration: underline; white-space: normal; overflow-wrap: normal;">HIT (in-accurate)</div></div></div></foreignObject><text x="140" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">HIT (in-accur...</text></switch></g><path d="M 110 70 L 170 70 L 180 85 L 170 100 L 110 100 L 100 85 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 85px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="140" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 125px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">ppu_sprite_fg</div></div></div></foreignObject><text x="96" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">ppu_sprite_fg</text></switch></g><path d="M 510 110 L 570 110 L 580 125 L 570 140 L 510 140 L 500 125 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 125px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; text-decoration: underline; white-space: normal; overflow-wrap: normal;">HIT (real)</div></div></div></foreignObject><text x="540" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">HIT (real)</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file
diff --git a/basys3/basys3.srcs/io.xdc b/basys3/basys3.srcs/io.xdc
index cda8030..2f17073 100644
--- a/basys3/basys3.srcs/io.xdc
+++ b/basys3/basys3.srcs/io.xdc
@@ -91,3 +91,6 @@ set_property PACKAGE_PIN U19 [get_ports {DBG_LEDS_OUT[2]}]
set_property PACKAGE_PIN E19 [get_ports {DBG_LEDS_OUT[1]}]
set_property PACKAGE_PIN U16 [get_ports {DBG_LEDS_OUT[0]}]
+
+set_property CONFIG_VOLTAGE 3.3 [current_design]
+set_property CFGBVS VCCO [current_design]
diff --git a/basys3/basys3.srcs/ppu.vhd b/basys3/basys3.srcs/ppu.vhd
index 445ae14..e6f959d 100644
--- a/basys3/basys3.srcs/ppu.vhd
+++ b/basys3/basys3.srcs/ppu.vhd
@@ -23,6 +23,7 @@ architecture Behavioral of ppu is
RESET : in std_logic; -- async reset
SPRITE_BG : out ppu_sprite_bg_pl_state := PL_BG_IDLE; -- sprite info fetch + sprite pixel fetch
SPRITE_FG : out ppu_sprite_fg_pl_state := PL_FG_IDLE; -- sprite pixel fetch
+ SPRITE_FG_HIT : out ppu_sprite_fg_hit_pl_state := PL_HIT_INACCURATE; -- foreground hit accuracy
DONE : out std_logic; -- last pipeline stage done
READY : out std_logic); -- rgb buffer propagation ready
end component;
@@ -109,6 +110,7 @@ architecture Behavioral of ppu is
CLK : in std_logic; -- system clock
RESET : in std_logic; -- reset internal memory and clock counters
PL_STAGE : in ppu_sprite_fg_pl_state; -- pipeline stage
+ PL_HIT : in ppu_sprite_fg_hit_pl_state;
OE : in std_logic; -- output enable (of CIDX)
X : in std_logic_vector(PPU_POS_H_WIDTH-1 downto 0); -- current screen pixel x
Y : in std_logic_vector(PPU_POS_V_WIDTH-1 downto 0); -- current screen pixel y
@@ -166,6 +168,7 @@ architecture Behavioral of ppu is
signal PL_DONE, PL_READY : std_logic; -- pipeline stages
signal PL_SPRITE_BG : ppu_sprite_bg_pl_state;
signal PL_SPRITE_FG : ppu_sprite_fg_pl_state;
+ signal PL_SPRITE_FG_HIT : ppu_sprite_fg_hit_pl_state;
signal TMM_WEN, BAM_WEN, FAM_WEN, PAL_WEN, AUX_WEN : std_logic;
signal TMM_W_ADDR, TMM_R_ADDR : std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0); -- read/write TMM addr (dual port)
signal BAM_W_ADDR, BAM_R_ADDR : std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0); -- read/write BAM addr (dual port)
@@ -202,6 +205,7 @@ begin
RESET => PCEG_RESET,
SPRITE_FG => PL_SPRITE_FG,
SPRITE_BG => PL_SPRITE_BG,
+ SPRITE_FG_HIT => PL_SPRITE_FG_HIT,
DONE => PL_DONE,
READY => PL_READY);
@@ -289,6 +293,7 @@ begin
CLK => SYSCLK,
RESET => SYSRST,
PL_STAGE => PL_SPRITE_FG,
+ PL_HIT => PL_SPRITE_FG_HIT,
OE => FG_EN(FG_IDX),
X => X,
Y => Y,
diff --git a/basys3/basys3.srcs/ppu_dispctl.vhd b/basys3/basys3.srcs/ppu_dispctl.vhd
index ce53557..ac8fbcf 100644
--- a/basys3/basys3.srcs/ppu_dispctl.vhd
+++ b/basys3/basys3.srcs/ppu_dispctl.vhd
@@ -129,7 +129,7 @@ begin
if TMP_NHCOUNT = PPU_VGA_H_PORCH_BACK + PPU_VGA_H_ACTIVE + PPU_VGA_H_SYNC then TMP_NHSYNC := '0'; end if;
end if;
- if falling_edge(TPIXCLK) then -- NOTE: falling edge used because of clock offset of 90 (should be 270)
+ if rising_edge(TPIXCLK) then
T_POS_X <= TMP_T_POS_X;
if TMP_NACTIVE = '1' then
diff --git a/basys3/basys3.srcs/ppu_pceg.vhd b/basys3/basys3.srcs/ppu_pceg.vhd
index 67b7e1c..e3c16e8 100644
--- a/basys3/basys3.srcs/ppu_pceg.vhd
+++ b/basys3/basys3.srcs/ppu_pceg.vhd
@@ -8,6 +8,7 @@ entity ppu_pceg is port(
RESET : in std_logic; -- async reset
SPRITE_BG : out ppu_sprite_bg_pl_state := PL_BG_IDLE; -- sprite info fetch + sprite pixel fetch
SPRITE_FG : out ppu_sprite_fg_pl_state := PL_FG_IDLE; -- sprite pixel fetch
+ SPRITE_FG_HIT : out ppu_sprite_fg_hit_pl_state := PL_HIT_INACCURATE; -- foreground hit accuracy
DONE : out std_logic; -- last pipeline stage done
READY : out std_logic); -- rgb buffer propagation ready
end ppu_pceg;
@@ -32,6 +33,7 @@ begin
READY <= '0';
SPRITE_BG <= PL_BG_IDLE;
SPRITE_FG <= PL_FG_IDLE;
+ SPRITE_FG_HIT <= PL_HIT_INACCURATE;
when 1 =>
SPRITE_BG <= PL_BG_BAM_ADDR;
SPRITE_FG <= PL_FG_TMM_ADDR;
@@ -44,6 +46,7 @@ begin
when 5 =>
SPRITE_BG <= PL_BG_TMM_ADDR;
SPRITE_FG <= PL_FG_IDLE;
+ SPRITE_FG_HIT <= PL_HIT_ACCURATE;
when 6 => null;
when 7 =>
SPRITE_BG <= PL_BG_IDLE;
diff --git a/basys3/basys3.srcs/ppu_pceg_consts.vhd b/basys3/basys3.srcs/ppu_pceg_consts.vhd
index eac4d23..3a9775a 100644
--- a/basys3/basys3.srcs/ppu_pceg_consts.vhd
+++ b/basys3/basys3.srcs/ppu_pceg_consts.vhd
@@ -14,5 +14,8 @@ package ppu_pceg_consts is
PL_FG_IDLE,
PL_FG_TMM_ADDR,
PL_FG_TMM_DATA);
+ type ppu_sprite_fg_hit_pl_state is (
+ PL_HIT_INACCURATE,
+ PL_HIT_ACCURATE);
end package ppu_pceg_consts;
diff --git a/basys3/basys3.srcs/ppu_sprite_bg.vhd b/basys3/basys3.srcs/ppu_sprite_bg.vhd
index cc9c24b..ef8ffc8 100644
--- a/basys3/basys3.srcs/ppu_sprite_bg.vhd
+++ b/basys3/basys3.srcs/ppu_sprite_bg.vhd
@@ -7,7 +7,6 @@ use ieee.numeric_std.all;
use work.ppu_consts.all;
use work.ppu_pceg_consts.all;
--- TODO: add input stable / output stable pipeline stages if this doesn't work with propagation delays
entity ppu_sprite_bg is port(
-- inputs
CLK : in std_logic; -- system clock
diff --git a/basys3/basys3.srcs/ppu_sprite_fg.vhd b/basys3/basys3.srcs/ppu_sprite_fg.vhd
index 89e6e66..d6ffe16 100644
--- a/basys3/basys3.srcs/ppu_sprite_fg.vhd
+++ b/basys3/basys3.srcs/ppu_sprite_fg.vhd
@@ -1,13 +1,10 @@
library ieee;
-library work;
-
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
use work.ppu_consts.all;
use work.ppu_pceg_consts.all;
--- TODO: add input stable / output stable pipeline stages if this doesn't work with propagation delays
entity ppu_sprite_fg is -- foreground sprite
generic (
IDX : natural := 0); -- sprite index number
@@ -16,6 +13,7 @@ entity ppu_sprite_fg is -- foreground sprite
CLK : in std_logic; -- system clock
RESET : in std_logic; -- reset internal memory and clock counters
PL_STAGE : in ppu_sprite_fg_pl_state; -- pipeline stage
+ PL_HIT : in ppu_sprite_fg_hit_pl_state;
OE : in std_logic; -- output enable (of CIDX)
X : in std_logic_vector(PPU_POS_H_WIDTH-1 downto 0); -- current screen pixel x
Y : in std_logic_vector(PPU_POS_V_WIDTH-1 downto 0); -- current screen pixel y
@@ -72,7 +70,7 @@ architecture Behavioral of ppu_sprite_fg is
alias FAM_REG_FLIP_V is INT_FAM(30); -- Flip vertically
alias FAM_REG_POS_H is INT_FAM(29 downto 21); -- horizontal position (offset by -16)
alias FAM_REG_POS_V is INT_FAM(20 downto 13); -- vertical position (offset by -16)
- alias FAM_REG_COL_IDX is INT_FAM(12 downto 10); -- Palette index for tile
+ alias FAM_REG_PAL_IDX is INT_FAM(12 downto 10); -- Palette index for tile
alias FAM_REG_TILE_IDX is INT_FAM(9 downto 0); -- Tilemap index
signal SPRITE_ACTIVE : std_logic := '0'; -- is pixel in bounding box of sprite
@@ -83,7 +81,7 @@ architecture Behavioral of ppu_sprite_fg is
signal TRANS_TILE_PIDX : integer := 0; -- index of pixel within tile (reading order)
signal TILEMAP_WORD : unsigned(PPU_TMM_ADDR_WIDTH-1 downto 0) := (others => '0');
signal TILEMAP_WORD_OFFSET : integer := 0; -- word offset from tile start address in TMM
- signal TMM_DATA_PAL_IDX : std_logic_vector(PPU_PALETTE_COLOR_WIDTH-1 downto 0); -- color of palette
+ signal TMM_DATA_COL_IDX : std_logic_vector(PPU_PALETTE_COLOR_WIDTH-1 downto 0); -- color of palette
begin
-- FAM memory
@@ -102,7 +100,7 @@ begin
REG => INT_FAM);
-- CIDX combination
- T_CIDX <= FAM_REG_COL_IDX & TMM_DATA_PAL_IDX;
+ T_CIDX <= FAM_REG_PAL_IDX & TMM_DATA_COL_IDX;
-- output drivers
CIDX <= T_CIDX when OE = '1' else (others => 'Z');
-- TMM memory
@@ -136,14 +134,15 @@ begin
inaccurate_occlusion_shims: if IDX >= PPU_ACCURATE_FG_SPRITE_COUNT generate
-- state machine for synchronizing pipeline stages
begin
- HIT <= SPRITE_ACTIVE;
+ HIT <= (SPRITE_ACTIVE) when PL_HIT = PL_HIT_INACCURATE else
+ (SPRITE_ACTIVE and (or TMM_DATA_COL_IDX)) when PL_HIT = PL_HIT_ACCURATE else '0';
-- only fetch if OE is high, and during the second pipeline stage
TMM_ADDR <= R_TMM_ADDR when OE = '1' and PL_STAGE = PL_FG_TMM_ADDR else (others => 'Z');
T_TMM_ADDR <= std_logic_vector(TILEMAP_WORD + to_unsigned(TILEMAP_WORD_OFFSET, PPU_TMM_ADDR_WIDTH)); -- TMM address
-- TMM DATA
with PIXEL_BIT_OFFSET select
- TMM_DATA_PAL_IDX <= R_TMM_DATA(2 downto 0) when 0,
+ TMM_DATA_COL_IDX <= R_TMM_DATA(2 downto 0) when 0,
R_TMM_DATA(5 downto 3) when 1,
R_TMM_DATA(8 downto 6) when 2,
R_TMM_DATA(11 downto 9) when 3,
@@ -156,6 +155,8 @@ begin
-- reset internal pipeline registers
R_TMM_ADDR <= (others => '0');
R_TMM_DATA <= (others => '0');
+ elsif OE = '0' then
+ null; -- don't read/write if current sprite is not the top sprite
elsif rising_edge(CLK) then
case PL_STAGE is
when PL_FG_TMM_ADDR =>
@@ -175,10 +176,10 @@ begin
signal TMM_CACHE_ADDR : std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0) := (others => '0');
signal TMM_CACHE : std_logic_vector((PPU_SPRITE_WORD_COUNT * PPU_TMM_DATA_WIDTH)-1 downto 0);
begin
- HIT <= SPRITE_ACTIVE and (nor TMM_DATA_PAL_IDX);
+ HIT <= SPRITE_ACTIVE and (or TMM_DATA_COL_IDX);
-- palette color at pixel
- TMM_DATA_PAL_IDX <= TMM_CACHE(TRANS_TILE_PIDX * integer(PPU_PALETTE_COLOR_WIDTH) + integer(PPU_PALETTE_COLOR_WIDTH)-1 downto TRANS_TILE_PIDX * integer(PPU_PALETTE_COLOR_WIDTH));
+ TMM_DATA_COL_IDX <= TMM_CACHE(TRANS_TILE_PIDX * integer(PPU_PALETTE_COLOR_WIDTH) + integer(PPU_PALETTE_COLOR_WIDTH)-1 downto TRANS_TILE_PIDX * integer(PPU_PALETTE_COLOR_WIDTH));
TMM_ADDR <= T_TMM_ADDR when TMM_CACHE_UPDATE_TURN else (others => 'Z');
diff --git a/basys3/basys3.srcs/ppu_tb.vhd.m4 b/basys3/basys3.srcs/ppu_tb.vhd.m4
index 97f0aef..8e405a9 100644
--- a/basys3/basys3.srcs/ppu_tb.vhd.m4
+++ b/basys3/basys3.srcs/ppu_tb.vhd.m4
@@ -49,7 +49,10 @@ begin
process
begin
- -- undivert(`test-image-ppu.tb.vhd') -- m4 macro expansion (see makefile)
+ RESET <= '1';
+ wait for 50 ns;
+ RESET <= '0';
+ -- undivert(`test-foreground-sprite-ppu.tb.vhd') -- m4 macro expansion (see makefile)
wait; -- stop after one loop (process loops in simulator)
end process;
end Behavioral;
diff --git a/basys3/basys3.srcs/sources_1/ip/ppu_dispctl_pixclk/ppu_dispctl_pixclk.xci b/basys3/basys3.srcs/sources_1/ip/ppu_dispctl_pixclk/ppu_dispctl_pixclk.xci
index 064d3ff..97aad5e 100644
--- a/basys3/basys3.srcs/sources_1/ip/ppu_dispctl_pixclk/ppu_dispctl_pixclk.xci
+++ b/basys3/basys3.srcs/sources_1/ip/ppu_dispctl_pixclk/ppu_dispctl_pixclk.xci
@@ -88,7 +88,7 @@
"CLKOUT1_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ],
"CLKOUT1_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "user", "format": "float", "usage": "all" } ],
"CLKOUT2_REQUESTED_OUT_FREQ": [ { "value": "6.25", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
- "CLKOUT2_REQUESTED_PHASE": [ { "value": "90.000", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
+ "CLKOUT2_REQUESTED_PHASE": [ { "value": "0.000", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
"CLKOUT2_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "user", "format": "float", "usage": "all" } ],
"CLKOUT3_REQUESTED_OUT_FREQ": [ { "value": "100.000", "resolve_type": "user", "format": "float", "usage": "all" } ],
"CLKOUT3_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ],
@@ -173,7 +173,7 @@
"MMCM_CLKOUT0_USE_FINE_PS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],
"MMCM_CLKOUT1_DIVIDE": [ { "value": "128", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ],
"MMCM_CLKOUT1_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ],
- "MMCM_CLKOUT1_PHASE": [ { "value": "90.000", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
+ "MMCM_CLKOUT1_PHASE": [ { "value": "0.000", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
"MMCM_CLKOUT1_USE_FINE_PS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],
"MMCM_CLKOUT2_DIVIDE": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ],
"MMCM_CLKOUT2_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ],
@@ -339,7 +339,7 @@
"C_OUTCLK_SUM_ROW0A": [ { "value": " Output Output Phase Duty Cycle Pk-to-Pk Phase", "resolve_type": "generated", "usage": "all" } ],
"C_OUTCLK_SUM_ROW0B": [ { "value": " Clock Freq (MHz) (degrees) (%) Jitter (ps) Error (ps)", "resolve_type": "generated", "usage": "all" } ],
"C_OUTCLK_SUM_ROW1": [ { "value": "__npxclk__25.00000______0.000______50.0______191.696____114.212", "resolve_type": "generated", "usage": "all" } ],
- "C_OUTCLK_SUM_ROW2": [ { "value": "__tpxclk___6.25000_____90.000______50.0______251.196____114.212", "resolve_type": "generated", "usage": "all" } ],
+ "C_OUTCLK_SUM_ROW2": [ { "value": "__tpxclk___6.25000______0.000______50.0______251.196____114.212", "resolve_type": "generated", "usage": "all" } ],
"C_OUTCLK_SUM_ROW3": [ { "value": "no_CLK_OUT3_output", "resolve_type": "generated", "usage": "all" } ],
"C_OUTCLK_SUM_ROW4": [ { "value": "no_CLK_OUT4_output", "resolve_type": "generated", "usage": "all" } ],
"C_OUTCLK_SUM_ROW5": [ { "value": "no_CLK_OUT5_output", "resolve_type": "generated", "usage": "all" } ],
@@ -353,7 +353,7 @@
"C_CLKOUT6_REQUESTED_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
"C_CLKOUT7_REQUESTED_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
"C_CLKOUT1_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C_CLKOUT2_REQUESTED_PHASE": [ { "value": "90.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
+ "C_CLKOUT2_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
"C_CLKOUT3_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
"C_CLKOUT4_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
"C_CLKOUT5_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
@@ -374,7 +374,7 @@
"C_CLKOUT6_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
"C_CLKOUT7_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
"C_CLKOUT1_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C_CLKOUT2_PHASE": [ { "value": "90.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
+ "C_CLKOUT2_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
"C_CLKOUT3_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
"C_CLKOUT4_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
"C_CLKOUT5_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
@@ -424,7 +424,7 @@
"C_MMCM_CLKOUT6_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "generated", "format": "float", "usage": "all" } ],
"C_MMCM_CLKFBOUT_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
"C_MMCM_CLKOUT0_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C_MMCM_CLKOUT1_PHASE": [ { "value": "90.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
+ "C_MMCM_CLKOUT1_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
"C_MMCM_CLKOUT2_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
"C_MMCM_CLKOUT3_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
"C_MMCM_CLKOUT4_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
diff --git a/basys3/basys3.srcs/spi.vhd b/basys3/basys3.srcs/spi.vhd
index 6ca2828..ba96eee 100644
--- a/basys3/basys3.srcs/spi.vhd
+++ b/basys3/basys3.srcs/spi.vhd
@@ -22,7 +22,7 @@ architecture Behavioral of spi is
constant COUNTER_RESET_VALUE : integer := PPU_RAM_BUS_ADDR_WIDTH + PPU_RAM_BUS_DATA_WIDTH - 1;
begin
process (SYSCLK)
- variable i : integer range 0 to COUNTER_RESET_VALUE := COUNTER_RESET_VALUE; -- counter for data position
+ variable i : integer range 0 to COUNTER_RESET_VALUE := COUNTER_RESET_VALUE; -- received bits counter
variable data_r : std_logic_vector(PPU_RAM_BUS_ADDR_WIDTH+PPU_RAM_BUS_DATA_WIDTH-1 downto 0) := (others => '1'); -- data register
begin
if RESET = '1' then
@@ -53,7 +53,8 @@ begin
srFF2 <= srFF1;
if (clkFF3 = '0' and clkFF2 = '1') then
- data_r(i) := dataFF2;
+ -- data_r(i) := dataFF2;
+ data_r := data_r(data_r'high-1 downto data_r'low) & dataFF2;
if i = 0 then
i := COUNTER_RESET_VALUE;
diff --git a/basys3/basys3.srcs/spi_tb.vhd b/basys3/basys3.srcs/spi_tb.vhd
index fea96b9..c9c320e 100644
--- a/basys3/basys3.srcs/spi_tb.vhd
+++ b/basys3/basys3.srcs/spi_tb.vhd
@@ -38,7 +38,7 @@ begin
process
begin
- -- -- 0xdc00: 0f0f
+ -- -- 0xdc00: 0000
SPI_DATA <= '1';
wait for 50 ns;
SPI_CLK <= '1';
@@ -159,6 +159,247 @@ SPI_CLK <= '1';
wait for 50 ns;
SPI_CLK <= '0';
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+-- 0xffff: ffff
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+--
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
SPI_DATA <= '1';
wait for 50 ns;
SPI_CLK <= '1';
@@ -183,12 +424,43 @@ SPI_CLK <= '1';
wait for 50 ns;
SPI_CLK <= '0';
+-- 0xdc00: 0808
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
SPI_DATA <= '0';
wait for 50 ns;
SPI_CLK <= '1';
wait for 50 ns;
SPI_CLK <= '0';
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
SPI_DATA <= '0';
wait for 50 ns;
SPI_CLK <= '1';
@@ -207,6 +479,699 @@ SPI_CLK <= '1';
wait for 50 ns;
SPI_CLK <= '0';
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+--
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+-- 0xffff: ffff
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+--
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+-- 0xdc00: 0f0f
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+--
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '0';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+-- 0xffff: ffff
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+--
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
+SPI_DATA <= '1';
+wait for 50 ns;
+SPI_CLK <= '1';
+wait for 50 ns;
+SPI_CLK <= '0';
+
SPI_DATA <= '1';
wait for 50 ns;
SPI_CLK <= '1';
diff --git a/basys3/basys3.srcs/spi_tb.vhd.m4 b/basys3/basys3.srcs/spi_tb.vhd.m4
index cf76b2c..00bf088 100644
--- a/basys3/basys3.srcs/spi_tb.vhd.m4
+++ b/basys3/basys3.srcs/spi_tb.vhd.m4
@@ -21,6 +21,7 @@ begin
RESET => RESET,
DO => open,
DI => SPI_DATA,
+ SR => '0',
DCK => SPI_CLK,
WEN => open);
diff --git a/basys3/basys3.xpr b/basys3/basys3.xpr
index 6f6275c..c64023c 100644
--- a/basys3/basys3.xpr
+++ b/basys3/basys3.xpr
@@ -60,20 +60,20 @@
<Option Name="IPStaticSourceDir" Val="$PIPUSERFILESDIR/ipstatic"/>
<Option Name="EnableBDX" Val="FALSE"/>
<Option Name="DSABoardId" Val="basys3"/>
- <Option Name="WTXSimLaunchSim" Val="133"/>
+ <Option Name="WTXSimLaunchSim" Val="173"/>
<Option Name="WTModelSimLaunchSim" Val="0"/>
<Option Name="WTQuestaLaunchSim" Val="0"/>
<Option Name="WTIesLaunchSim" Val="0"/>
<Option Name="WTVcsLaunchSim" Val="0"/>
<Option Name="WTRivieraLaunchSim" Val="0"/>
<Option Name="WTActivehdlLaunchSim" Val="0"/>
- <Option Name="WTXSimExportSim" Val="6"/>
- <Option Name="WTModelSimExportSim" Val="6"/>
- <Option Name="WTQuestaExportSim" Val="6"/>
+ <Option Name="WTXSimExportSim" Val="7"/>
+ <Option Name="WTModelSimExportSim" Val="7"/>
+ <Option Name="WTQuestaExportSim" Val="7"/>
<Option Name="WTIesExportSim" Val="0"/>
- <Option Name="WTVcsExportSim" Val="6"/>
- <Option Name="WTRivieraExportSim" Val="6"/>
- <Option Name="WTActivehdlExportSim" Val="6"/>
+ <Option Name="WTVcsExportSim" Val="7"/>
+ <Option Name="WTRivieraExportSim" Val="7"/>
+ <Option Name="WTActivehdlExportSim" Val="7"/>
<Option Name="GenerateIPUpgradeLog" Val="TRUE"/>
<Option Name="XSimRadix" Val="hex"/>
<Option Name="XSimTimeUnit" Val="ns"/>
@@ -255,10 +255,20 @@
<Option Name="SrcSet" Val="sources_1"/>
<Option Name="Incremental" Val="0"/>
<Option Name="xsim.simulate.runtime" Val="18 ms"/>
+ <Option Name="xsim.simulate.log_all_signals" Val="true"/>
+ <Option Name="NLNetlistMode" Val="funcsim"/>
</Config>
</FileSet>
<FileSet Name="utils_1" Type="Utils" RelSrcDir="$PSRCDIR/utils_1" RelGenDir="$PGENDIR/utils_1">
<Filter Type="Utils"/>
+ <File Path="$PSRCDIR/utils_1/imports/synth_4/top.dcp">
+ <FileInfo>
+ <Attr Name="UsedIn" Val="synthesis"/>
+ <Attr Name="UsedIn" Val="implementation"/>
+ <Attr Name="UsedInSteps" Val="synth_4"/>
+ <Attr Name="AutoDcp" Val="1"/>
+ </FileInfo>
+ </File>
<Config>
<Option Name="TopAutoSet" Val="TRUE"/>
</Config>
@@ -382,7 +392,7 @@
<Report Name="ROUTE_DESIGN.REPORT_METHODOLOGY" Enabled="1"/>
<RQSFiles/>
</Run>
- <Run Id="synth_4" Type="Ft3:Synth" SrcSet="sources_1" Part="xc7a35tcpg236-1" ConstrsSet="constrs_1" Description="Vivado Synthesis Defaults" AutoIncrementalCheckpoint="true" WriteIncrSynthDcp="false" State="current" Dir="$PRUNDIR/synth_4" IncludeInArchive="true" IsChild="false" AutoIncrementalDir="$PSRCDIR/utils_1/imports/synth_4" AutoRQSDir="$PSRCDIR/utils_1/imports/synth_4">
+ <Run Id="synth_4" Type="Ft3:Synth" SrcSet="sources_1" Part="xc7a35tcpg236-1" ConstrsSet="constrs_1" Description="Vivado Synthesis Defaults" AutoIncrementalCheckpoint="true" IncrementalCheckpoint="$PSRCDIR/utils_1/imports/synth_4/top.dcp" WriteIncrSynthDcp="false" State="current" Dir="$PRUNDIR/synth_4" IncludeInArchive="true" IsChild="false" AutoIncrementalDir="$PSRCDIR/utils_1/imports/synth_4" AutoRQSDir="$PSRCDIR/utils_1/imports/synth_4">
<Strategy Version="1" Minor="2">
<StratHandle Name="Vivado Synthesis Defaults" Flow="Vivado Synthesis 2022">
<Desc>Vivado Synthesis Defaults</Desc>
diff --git a/basys3/ppu_tb_behav.wcfg b/basys3/ppu_tb_behav.wcfg
index c359e87..9acf47e 100644
--- a/basys3/ppu_tb_behav.wcfg
+++ b/basys3/ppu_tb_behav.wcfg
@@ -13,19 +13,18 @@
</db_ref>
</db_ref_list>
<zoom_setting>
- <ZoomStartTime time="136.205000 us"></ZoomStartTime>
- <ZoomEndTime time="1,382.205001 us"></ZoomEndTime>
- <Cursor1Time time="1,058.205000 us"></Cursor1Time>
+ <ZoomStartTime time="0.000000 us"></ZoomStartTime>
+ <ZoomEndTime time="2,716.000001 us"></ZoomEndTime>
+ <Cursor1Time time="450.650000 us"></Cursor1Time>
</zoom_setting>
<column_width_setting>
- <NameColumnWidth column_width="243"></NameColumnWidth>
- <ValueColumnWidth column_width="141"></ValueColumnWidth>
+ <NameColumnWidth column_width="257"></NameColumnWidth>
+ <ValueColumnWidth column_width="194"></ValueColumnWidth>
</column_width_setting>
- <WVObjectSize size="6" />
+ <WVObjectSize size="9" />
<wvobject type="group" fp_name="group136">
<obj_property name="label">clks</obj_property>
<obj_property name="DisplayName">label</obj_property>
- <obj_property name="isExpanded"></obj_property>
<wvobject type="logic" fp_name="/ppu_tb/uut/CLK100">
<obj_property name="ElementShortName">CLK100</obj_property>
<obj_property name="ObjectShortName">CLK100</obj_property>
@@ -236,7 +235,6 @@
<wvobject type="group" fp_name="group149">
<obj_property name="label">background sprite</obj_property>
<obj_property name="DisplayName">label</obj_property>
- <obj_property name="isExpanded"></obj_property>
<wvobject type="logic" fp_name="/ppu_tb/uut/background_sprite/CLK">
<obj_property name="ElementShortName">CLK</obj_property>
<obj_property name="ObjectShortName">CLK</obj_property>
@@ -249,10 +247,6 @@
<obj_property name="ElementShortName">PL_STAGE</obj_property>
<obj_property name="ObjectShortName">PL_STAGE</obj_property>
</wvobject>
- <wvobject type="logic" fp_name="/ppu_tb/uut/background_sprite/OE">
- <obj_property name="ElementShortName">OE</obj_property>
- <obj_property name="ObjectShortName">OE</obj_property>
- </wvobject>
<wvobject type="array" fp_name="/ppu_tb/uut/background_sprite/X">
<obj_property name="ElementShortName">X[8:0]</obj_property>
<obj_property name="ObjectShortName">X[8:0]</obj_property>
@@ -366,6 +360,10 @@
<obj_property name="ElementShortName">TMM_DATA_PAL_IDX[2:0]</obj_property>
<obj_property name="ObjectShortName">TMM_DATA_PAL_IDX[2:0]</obj_property>
</wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/background_sprite/OE">
+ <obj_property name="ElementShortName">OE</obj_property>
+ <obj_property name="ObjectShortName">OE</obj_property>
+ </wvobject>
<wvobject type="array" fp_name="/ppu_tb/uut/background_sprite/CIDX">
<obj_property name="ElementShortName">CIDX[5:0]</obj_property>
<obj_property name="ObjectShortName">CIDX[5:0]</obj_property>
@@ -374,12 +372,12 @@
<wvobject type="array" fp_name="/ppu_tb/uut/background_sprite/T_CIDX">
<obj_property name="ElementShortName">T_CIDX[5:0]</obj_property>
<obj_property name="ObjectShortName">T_CIDX[5:0]</obj_property>
+ <obj_property name="isExpanded"></obj_property>
</wvobject>
</wvobject>
<wvobject type="group" fp_name="group142">
<obj_property name="label">display coordinates</obj_property>
<obj_property name="DisplayName">label</obj_property>
- <obj_property name="isExpanded"></obj_property>
<wvobject type="array" fp_name="/ppu_tb/uut/display_controller/T_POS_X">
<obj_property name="ElementShortName">T_POS_X[8:0]</obj_property>
<obj_property name="ObjectShortName">T_POS_X[8:0]</obj_property>
@@ -407,7 +405,6 @@
<wvobject type="group" fp_name="group276">
<obj_property name="label">active</obj_property>
<obj_property name="DisplayName">label</obj_property>
- <obj_property name="isExpanded"></obj_property>
<wvobject type="logic" fp_name="/ppu_tb/uut/display_controller/NACTIVE">
<obj_property name="ElementShortName">NACTIVE</obj_property>
<obj_property name="ObjectShortName">NACTIVE</obj_property>
@@ -449,7 +446,6 @@
<wvobject type="group" fp_name="group115">
<obj_property name="label">pipeline stages</obj_property>
<obj_property name="DisplayName">label</obj_property>
- <obj_property name="isExpanded"></obj_property>
<wvobject type="logic" fp_name="/ppu_tb/uut/pipeline_clock_edge_generator/CLK">
<obj_property name="ElementShortName">CLK</obj_property>
<obj_property name="ObjectShortName">CLK</obj_property>
@@ -466,6 +462,10 @@
<obj_property name="ElementShortName">SPRITE_FG</obj_property>
<obj_property name="ObjectShortName">SPRITE_FG</obj_property>
</wvobject>
+ <wvobject type="other" fp_name="/ppu_tb/uut/pipeline_clock_edge_generator/SPRITE_FG_HIT">
+ <obj_property name="ElementShortName">SPRITE_FG_HIT</obj_property>
+ <obj_property name="ObjectShortName">SPRITE_FG_HIT</obj_property>
+ </wvobject>
<wvobject type="logic" fp_name="/ppu_tb/uut/pipeline_clock_edge_generator/DONE">
<obj_property name="ElementShortName">DONE</obj_property>
<obj_property name="ObjectShortName">DONE</obj_property>
@@ -519,4 +519,349 @@
<obj_property name="ObjectShortName">INT_REG[31:0]</obj_property>
</wvobject>
</wvobject>
+ <wvobject type="group" fp_name="group165">
+ <obj_property name="label">sprite[0]</obj_property>
+ <obj_property name="DisplayName">label</obj_property>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/CLK">
+ <obj_property name="ElementShortName">CLK</obj_property>
+ <obj_property name="ObjectShortName">CLK</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/RESET">
+ <obj_property name="ElementShortName">RESET</obj_property>
+ <obj_property name="ObjectShortName">RESET</obj_property>
+ </wvobject>
+ <wvobject type="other" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/PL_STAGE">
+ <obj_property name="ElementShortName">PL_STAGE</obj_property>
+ <obj_property name="ObjectShortName">PL_STAGE</obj_property>
+ </wvobject>
+ <wvobject type="other" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/PL_HIT">
+ <obj_property name="ElementShortName">PL_HIT</obj_property>
+ <obj_property name="ObjectShortName">PL_HIT</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/OE">
+ <obj_property name="ElementShortName">OE</obj_property>
+ <obj_property name="ObjectShortName">OE</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/X">
+ <obj_property name="ElementShortName">X[8:0]</obj_property>
+ <obj_property name="ObjectShortName">X[8:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/Y">
+ <obj_property name="ElementShortName">Y[7:0]</obj_property>
+ <obj_property name="ObjectShortName">Y[7:0]</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/FETCH">
+ <obj_property name="ElementShortName">FETCH</obj_property>
+ <obj_property name="ObjectShortName">FETCH</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/VBLANK">
+ <obj_property name="ElementShortName">VBLANK</obj_property>
+ <obj_property name="ObjectShortName">VBLANK</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/FAM_WEN">
+ <obj_property name="ElementShortName">FAM_WEN</obj_property>
+ <obj_property name="ObjectShortName">FAM_WEN</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/FAM_ADDR">
+ <obj_property name="ElementShortName">FAM_ADDR[7:0]</obj_property>
+ <obj_property name="ObjectShortName">FAM_ADDR[7:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/FAM_DATA">
+ <obj_property name="ElementShortName">FAM_DATA[15:0]</obj_property>
+ <obj_property name="ObjectShortName">FAM_DATA[15:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/TMM_ADDR">
+ <obj_property name="ElementShortName">TMM_ADDR[15:0]</obj_property>
+ <obj_property name="ObjectShortName">TMM_ADDR[15:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/TMM_DATA">
+ <obj_property name="ElementShortName">TMM_DATA[14:0]</obj_property>
+ <obj_property name="ObjectShortName">TMM_DATA[14:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/CIDX">
+ <obj_property name="ElementShortName">CIDX[5:0]</obj_property>
+ <obj_property name="ObjectShortName">CIDX[5:0]</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/HIT">
+ <obj_property name="ElementShortName">HIT</obj_property>
+ <obj_property name="ObjectShortName">HIT</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/T_TMM_ADDR">
+ <obj_property name="ElementShortName">T_TMM_ADDR[15:0]</obj_property>
+ <obj_property name="ObjectShortName">T_TMM_ADDR[15:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/R_TMM_ADDR">
+ <obj_property name="ElementShortName">R_TMM_ADDR[15:0]</obj_property>
+ <obj_property name="ObjectShortName">R_TMM_ADDR[15:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/T_TMM_DATA">
+ <obj_property name="ElementShortName">T_TMM_DATA[14:0]</obj_property>
+ <obj_property name="ObjectShortName">T_TMM_DATA[14:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/R_TMM_DATA">
+ <obj_property name="ElementShortName">R_TMM_DATA[14:0]</obj_property>
+ <obj_property name="ObjectShortName">R_TMM_DATA[14:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/T_CIDX">
+ <obj_property name="ElementShortName">T_CIDX[5:0]</obj_property>
+ <obj_property name="ObjectShortName">T_CIDX[5:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/INT_FAM">
+ <obj_property name="ElementShortName">INT_FAM[31:0]</obj_property>
+ <obj_property name="ObjectShortName">INT_FAM[31:0]</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/SPRITE_ACTIVE">
+ <obj_property name="ElementShortName">SPRITE_ACTIVE</obj_property>
+ <obj_property name="ObjectShortName">SPRITE_ACTIVE</obj_property>
+ </wvobject>
+ <wvobject type="other" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/PIXEL_ABS_X">
+ <obj_property name="ElementShortName">PIXEL_ABS_X</obj_property>
+ <obj_property name="ObjectShortName">PIXEL_ABS_X</obj_property>
+ </wvobject>
+ <wvobject type="other" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/PIXEL_ABS_Y">
+ <obj_property name="ElementShortName">PIXEL_ABS_Y</obj_property>
+ <obj_property name="ObjectShortName">PIXEL_ABS_Y</obj_property>
+ </wvobject>
+ <wvobject type="other" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/PIXEL_BIT_OFFSET">
+ <obj_property name="ElementShortName">PIXEL_BIT_OFFSET</obj_property>
+ <obj_property name="ObjectShortName">PIXEL_BIT_OFFSET</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/TILE_PIDX_X">
+ <obj_property name="ElementShortName">TILE_PIDX_X[3:0]</obj_property>
+ <obj_property name="ObjectShortName">TILE_PIDX_X[3:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/TRANS_TILE_PIDX_X">
+ <obj_property name="ElementShortName">TRANS_TILE_PIDX_X[3:0]</obj_property>
+ <obj_property name="ObjectShortName">TRANS_TILE_PIDX_X[3:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/TILE_PIDX_Y">
+ <obj_property name="ElementShortName">TILE_PIDX_Y[3:0]</obj_property>
+ <obj_property name="ObjectShortName">TILE_PIDX_Y[3:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/TRANS_TILE_PIDX_Y">
+ <obj_property name="ElementShortName">TRANS_TILE_PIDX_Y[3:0]</obj_property>
+ <obj_property name="ObjectShortName">TRANS_TILE_PIDX_Y[3:0]</obj_property>
+ </wvobject>
+ <wvobject type="other" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/TRANS_TILE_PIDX">
+ <obj_property name="ElementShortName">TRANS_TILE_PIDX</obj_property>
+ <obj_property name="ObjectShortName">TRANS_TILE_PIDX</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/TILEMAP_WORD">
+ <obj_property name="ElementShortName">TILEMAP_WORD[15:0]</obj_property>
+ <obj_property name="ObjectShortName">TILEMAP_WORD[15:0]</obj_property>
+ </wvobject>
+ <wvobject type="other" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/TILEMAP_WORD_OFFSET">
+ <obj_property name="ElementShortName">TILEMAP_WORD_OFFSET</obj_property>
+ <obj_property name="ObjectShortName">TILEMAP_WORD_OFFSET</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/TMM_DATA_COL_IDX">
+ <obj_property name="ElementShortName">TMM_DATA_COL_IDX[2:0]</obj_property>
+ <obj_property name="ObjectShortName">TMM_DATA_COL_IDX[2:0]</obj_property>
+ </wvobject>
+ <wvobject type="other" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/IDX">
+ <obj_property name="ElementShortName">IDX</obj_property>
+ <obj_property name="ObjectShortName">IDX</obj_property>
+ </wvobject>
+ </wvobject>
+ <wvobject type="group" fp_name="group166">
+ <obj_property name="label">sprite[16]</obj_property>
+ <obj_property name="DisplayName">label</obj_property>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/CLK">
+ <obj_property name="ElementShortName">CLK</obj_property>
+ <obj_property name="ObjectShortName">CLK</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/RESET">
+ <obj_property name="ElementShortName">RESET</obj_property>
+ <obj_property name="ObjectShortName">RESET</obj_property>
+ </wvobject>
+ <wvobject type="other" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/PL_STAGE">
+ <obj_property name="ElementShortName">PL_STAGE</obj_property>
+ <obj_property name="ObjectShortName">PL_STAGE</obj_property>
+ </wvobject>
+ <wvobject type="other" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/PL_HIT">
+ <obj_property name="ElementShortName">PL_HIT</obj_property>
+ <obj_property name="ObjectShortName">PL_HIT</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/OE">
+ <obj_property name="ElementShortName">OE</obj_property>
+ <obj_property name="ObjectShortName">OE</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/HIT">
+ <obj_property name="ElementShortName">HIT</obj_property>
+ <obj_property name="ObjectShortName">HIT</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/SPRITE_ACTIVE">
+ <obj_property name="ElementShortName">SPRITE_ACTIVE</obj_property>
+ <obj_property name="ObjectShortName">SPRITE_ACTIVE</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/X">
+ <obj_property name="ElementShortName">X[8:0]</obj_property>
+ <obj_property name="ObjectShortName">X[8:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/Y">
+ <obj_property name="ElementShortName">Y[7:0]</obj_property>
+ <obj_property name="ObjectShortName">Y[7:0]</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/FETCH">
+ <obj_property name="ElementShortName">FETCH</obj_property>
+ <obj_property name="ObjectShortName">FETCH</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/VBLANK">
+ <obj_property name="ElementShortName">VBLANK</obj_property>
+ <obj_property name="ObjectShortName">VBLANK</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/FAM_WEN">
+ <obj_property name="ElementShortName">FAM_WEN</obj_property>
+ <obj_property name="ObjectShortName">FAM_WEN</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/FAM_ADDR">
+ <obj_property name="ElementShortName">FAM_ADDR[7:0]</obj_property>
+ <obj_property name="ObjectShortName">FAM_ADDR[7:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/FAM_DATA">
+ <obj_property name="ElementShortName">FAM_DATA[15:0]</obj_property>
+ <obj_property name="ObjectShortName">FAM_DATA[15:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/TMM_ADDR">
+ <obj_property name="ElementShortName">TMM_ADDR[15:0]</obj_property>
+ <obj_property name="ObjectShortName">TMM_ADDR[15:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/TMM_DATA">
+ <obj_property name="ElementShortName">TMM_DATA[14:0]</obj_property>
+ <obj_property name="ObjectShortName">TMM_DATA[14:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/CIDX">
+ <obj_property name="ElementShortName">CIDX[5:0]</obj_property>
+ <obj_property name="ObjectShortName">CIDX[5:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/R_TMM_ADDR">
+ <obj_property name="ElementShortName">R_TMM_ADDR[15:0]</obj_property>
+ <obj_property name="ObjectShortName">R_TMM_ADDR[15:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/R_TMM_DATA">
+ <obj_property name="ElementShortName">R_TMM_DATA[14:0]</obj_property>
+ <obj_property name="ObjectShortName">R_TMM_DATA[14:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/T_TMM_ADDR">
+ <obj_property name="ElementShortName">T_TMM_ADDR[15:0]</obj_property>
+ <obj_property name="ObjectShortName">T_TMM_ADDR[15:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/T_TMM_DATA">
+ <obj_property name="ElementShortName">T_TMM_DATA[14:0]</obj_property>
+ <obj_property name="ObjectShortName">T_TMM_DATA[14:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/T_CIDX">
+ <obj_property name="ElementShortName">T_CIDX[5:0]</obj_property>
+ <obj_property name="ObjectShortName">T_CIDX[5:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/INT_FAM">
+ <obj_property name="ElementShortName">INT_FAM[31:0]</obj_property>
+ <obj_property name="ObjectShortName">INT_FAM[31:0]</obj_property>
+ </wvobject>
+ <wvobject type="other" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/PIXEL_ABS_X">
+ <obj_property name="ElementShortName">PIXEL_ABS_X</obj_property>
+ <obj_property name="ObjectShortName">PIXEL_ABS_X</obj_property>
+ </wvobject>
+ <wvobject type="other" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/PIXEL_ABS_Y">
+ <obj_property name="ElementShortName">PIXEL_ABS_Y</obj_property>
+ <obj_property name="ObjectShortName">PIXEL_ABS_Y</obj_property>
+ </wvobject>
+ <wvobject type="other" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/PIXEL_BIT_OFFSET">
+ <obj_property name="ElementShortName">PIXEL_BIT_OFFSET</obj_property>
+ <obj_property name="ObjectShortName">PIXEL_BIT_OFFSET</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/TILE_PIDX_X">
+ <obj_property name="ElementShortName">TILE_PIDX_X[3:0]</obj_property>
+ <obj_property name="ObjectShortName">TILE_PIDX_X[3:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/TRANS_TILE_PIDX_X">
+ <obj_property name="ElementShortName">TRANS_TILE_PIDX_X[3:0]</obj_property>
+ <obj_property name="ObjectShortName">TRANS_TILE_PIDX_X[3:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/TILE_PIDX_Y">
+ <obj_property name="ElementShortName">TILE_PIDX_Y[3:0]</obj_property>
+ <obj_property name="ObjectShortName">TILE_PIDX_Y[3:0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/TRANS_TILE_PIDX_Y">
+ <obj_property name="ElementShortName">TRANS_TILE_PIDX_Y[3:0]</obj_property>
+ <obj_property name="ObjectShortName">TRANS_TILE_PIDX_Y[3:0]</obj_property>
+ </wvobject>
+ <wvobject type="other" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/TRANS_TILE_PIDX">
+ <obj_property name="ElementShortName">TRANS_TILE_PIDX</obj_property>
+ <obj_property name="ObjectShortName">TRANS_TILE_PIDX</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/TILEMAP_WORD">
+ <obj_property name="ElementShortName">TILEMAP_WORD[15:0]</obj_property>
+ <obj_property name="ObjectShortName">TILEMAP_WORD[15:0]</obj_property>
+ </wvobject>
+ <wvobject type="other" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/TILEMAP_WORD_OFFSET">
+ <obj_property name="ElementShortName">TILEMAP_WORD_OFFSET</obj_property>
+ <obj_property name="ObjectShortName">TILEMAP_WORD_OFFSET</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/TMM_DATA_COL_IDX">
+ <obj_property name="ElementShortName">TMM_DATA_COL_IDX[2:0]</obj_property>
+ <obj_property name="ObjectShortName">TMM_DATA_COL_IDX[2:0]</obj_property>
+ <obj_property name="isExpanded"></obj_property>
+ </wvobject>
+ <wvobject type="other" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/IDX">
+ <obj_property name="ElementShortName">IDX</obj_property>
+ <obj_property name="ObjectShortName">IDX</obj_property>
+ </wvobject>
+ </wvobject>
+ <wvobject type="group" fp_name="group245">
+ <obj_property name="label">compositor</obj_property>
+ <obj_property name="DisplayName">label</obj_property>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/compositor/OE">
+ <obj_property name="ElementShortName">OE</obj_property>
+ <obj_property name="ObjectShortName">OE</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/compositor/FG_HIT[16]">
+ <obj_property name="DisplayName">label</obj_property>
+ <obj_property name="ElementShortName">[16]</obj_property>
+ <obj_property name="ObjectShortName">[16]</obj_property>
+ <obj_property name="label">FG_HIT[16]</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/compositor/FG_HIT[0]">
+ <obj_property name="DisplayName">label</obj_property>
+ <obj_property name="ElementShortName">[0]</obj_property>
+ <obj_property name="ObjectShortName">[0]</obj_property>
+ <obj_property name="label">FG_HIT[0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/compositor/FG_HIT">
+ <obj_property name="ElementShortName">FG_HIT[127:0]</obj_property>
+ <obj_property name="ObjectShortName">FG_HIT[127:0]</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/compositor/FG_EN[16]">
+ <obj_property name="DisplayName">label</obj_property>
+ <obj_property name="ElementShortName">[16]</obj_property>
+ <obj_property name="ObjectShortName">[16]</obj_property>
+ <obj_property name="label">FG_EN[16]</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/compositor/FG_EN[0]">
+ <obj_property name="DisplayName">label</obj_property>
+ <obj_property name="ElementShortName">[0]</obj_property>
+ <obj_property name="ObjectShortName">[0]</obj_property>
+ <obj_property name="label">FG_EN[0]</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/compositor/FG_EN">
+ <obj_property name="ElementShortName">FG_EN[127:0]</obj_property>
+ <obj_property name="ObjectShortName">FG_EN[127:0]</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/compositor/BG_EN">
+ <obj_property name="ElementShortName">BG_EN</obj_property>
+ <obj_property name="ObjectShortName">BG_EN</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/compositor/FG_HIT_EMPTY">
+ <obj_property name="ElementShortName">FG_HIT_EMPTY[127:0]</obj_property>
+ <obj_property name="ObjectShortName">FG_HIT_EMPTY[127:0]</obj_property>
+ </wvobject>
+ <wvobject type="logic" fp_name="/ppu_tb/uut/compositor/TMP_BG_EN">
+ <obj_property name="ElementShortName">TMP_BG_EN</obj_property>
+ <obj_property name="ObjectShortName">TMP_BG_EN</obj_property>
+ </wvobject>
+ <wvobject type="array" fp_name="/ppu_tb/uut/compositor/TMP_FG_EN">
+ <obj_property name="ElementShortName">TMP_FG_EN[127:0]</obj_property>
+ <obj_property name="ObjectShortName">TMP_FG_EN[127:0]</obj_property>
+ </wvobject>
+ </wvobject>
</wave_config>
diff --git a/docs/architecture.md b/docs/architecture.md
index 4e57be0..aa66276 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -239,7 +239,9 @@ Important notes:
This diagram describes which components use which lines during pipeline stages
0-9. The pipeline stage counter is reset after every pixel, and is run on the
-system clock (100 MHz).
+system clock (100 MHz). Underlined labels indicate when a signal is written,
+and normal text is used to indicate a signal read. Labels with a dotted outline
+are used for timing, but don't directly read/write any signals.
## Registers
diff --git a/docs/ppu.drawio b/docs/ppu.drawio
index 52160c1..9cef8a7 100644
--- a/docs/ppu.drawio
+++ b/docs/ppu.drawio
@@ -1 +1 @@
-<mxfile host="Electron" modified="2023-03-29T15:34:42.504Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="y_Tz0g61eYKg321pPkIq" version="20.8.16" type="device" pages="5"><diagram name="level-1" id="DBE48RpXtx8JnoEt3ekA">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</diagram><diagram id="MdQQJuunD4ehtDpxKxax" name="level-2">7Vxbe6JIEP01eXQ+7uqjcXPZL8kkM0km+9pCi0wamm0aL/Prt5FGLk0QjChunJdIUdhQdapOdVHOhTp2lzcE+LMHbEF0oUjW8kL960JRZLk/YH8iySqW9BU1FtjEsbhSKnh2/kAulLg0dCwY5BQpxog6fl5oYs+DJs3JACF4kVebYpRf1Qc2FATPJkCi9M2x6CyWDnQpld9Cx54lK8sSP+OCRJkLghmw8CIjUq8u1DHBmMaf3OUYosh4iV3i664/OLu5MQI9WucCfTwdzm+1+Z/Hu/lKDxG5/X3fM/rx18wBCvkTBz5xKIwu9KaY3zpdJfaAFjMPP8SEzrCNPYCuUuklwaFnwWhRiR0F75CaM36QXnCPsc+EMhP+hpSuuONBSDETzaiL+NmN1dZfRgGho8irTOBhDyayawchrjOHhDrMfyPk2B6TuY5lre8r8IHpePYlphS77MSAyUQbcrMGOCQmrDCcloAREBvSCkWd4z0yXGYJ7qMbiF1IyYopEIgAdeZ53AEOX3ujt7n0CTvsplMVPJ0G7E4yEGAfMiukojUwGoCkrwsgeXl42AEazJl+dHaK4JK78WBwmSBsvpfgBXpWAVFMkjm/O0QSz2+FiCa1AhH2WGCVUfAjwAQlCOLJWk2SGk/V8qCQUJrpsw/xHRwcr0lsZvB6Ccx3ew21yHOVGS4PyMWMqT6z1BGdXTCOy+PtQ3REaQguK73Jzypa3ozJ4SJDN1w0yzBNIitzf86gTa1niNF+poRalFA33vV+zXjnCJG+cZd0mCLUPVHEkaFSxlAWCGbrO6oM+Cw8vpPV34rnuX0zZJBb6iG8s3p7R0e7bCDLzdhgi/5HbJBwST9/dU8ppLfYvPyqFihDxO81JrCjlCHrO1GG1hZlJM7LWM9GeALQ+kERC9HYdBZ7vJNLCZ8gBK1uAThoJeQPWnNpAgTG2PVx4FBMjh4wxRrrkBFD/u3rVjAEsvWo/lg++tri7r4nCyb5P8eBXjcO2tkrN6U+xSik1y3Up3xKvdi2KfLqsEo9T6s7BHMpOpUzOiu2lWd0ZrQHh0enuD/9dTOKPM12d1HJ8bWhO7z7cRO+fn8bTaX7y1er9/rLe+u1g1yxipfyaNClAn/GNypU8Y07VR+s82Gnqlr/iJ0qEcvU8SJT5CEt2dCDBHSxlNKkeqWU0drm42vVUoO6bKXvO+Y/5yVFQDqxJxvB2YOH8ODB89tA7MQ/je538HYX3xwdAgIdeTNUKDlVbQvfVut/uiysNGoWa5veE8L4PfQ7R56qUo88W+vcGcOvlHrrv5HVukWeQwHal6NTewG/fyKV6nqzGxt3tRD8xpYkWqneTg5Nck8GaKPXf04MaC3wdd1hn47ytbxtf1yt3w7WdPGV23Pylo25yILd2+vKxrHpWqxxfGcZj1wCCr4Ul/ePxuW7tW2LjdWmndWq1upBRz3EN33XJ1eMtMARJbVl1RzIkeE4bFSLVGo3He2Qa3aF90Y04oxz14imONBxdKLpG4LNziO/25OAcWKFolYI7G1DXlv02ykUDbGJ+OIg6LI4VCQXupjj/ZgBrBen30oCWFYOGsFiqXjuGdTvGRjdoGnNaMTT1eothae4j8tN2wNKiTMJ13Tb0WgtmQZrLVhLRxpEEwYmgdCLHjQaoXOwJxiNPSstxBEl+B2OMcIkjZ0pC5uCCPA5eJNZkBU/FQPyZa7IOwuBCUSpv5OVLDgFIaJ7qo6KEy/9En9JJf4qDhHvLbkmQMi+a3h6ZYKfUYqVJmHwOYwXHULxWgET5w/2KEjyoOUQaK7Bwb4EBjTjWxJbIfmJw8s6FUup4Ce3UuVPHuq7SJO2RpRa4iB1Hx6q2mWdHbTMO6SZf+R9TG1UTSRl/OPFNHpCoy8bGtmyS9PbMqIiGPELTMIdc8Ct2JQzWhpwK66jD5s1Cwv6zZuFJSN0w2/D7L/8esU8sfPPddhh+pP4WD39jwXUq/8A</diagram><diagram id="lj51MlK96fuJFRP7cw84" name="level-3">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</diagram><diagram id="1ySgP4OewCsUoPnmkRD4" name="display">7VhNc9owEP01zKSHdGwMhB5joMmhzJAhpOQobGGryF6PLLDdX9+VLccYG0ImH21meor0pNVq39tdK3SsUZDeCBL5U3Ap73QNN+1Y4063a/bMHv5RSFYgw8FVAXiCuXpTBczZb6pBQ6Nb5tK4tlECcMmiOuhAGFJH1jAiBCT1bWvgda8R8WgDmDuEN9GfzJW+jqJvVPgtZZ5fejYNvRKQcrMGYp+4kOxB1qRjjQSALEZBOqJckVfyUth9P7L6dDFBQ3mOQUZuHxfT8TxJb2ZyMZXBww257Ban7Ajf6oD1ZWVWMuAJ2EZNZ9r/jgpJ0zYpyKo8oYoW04RCQKXIcF9S8WlZmiR/j8tuSTLRGnpPtlWYONCRtkc96W3WxrbvwPLbvBcPb+/uB3ctUdvE2ahAQ1cFQMId+uwOON7EXgkceWp0MegZaW9ofGlwlFtS5dLAfYnPJJ1HxFGrCdYFYr4M8IpjE4eKMoYZds2ZFyK2AikhwIUYTVjoqW3qmCbnJyU8FKJJeLmqac3q0305um1y9N5LDrNFj+spAhfocdRCN5ZSlHNLsgiYYseON1Q6vhZgzTif6+0xcOXcjovWMsBhbkPFZIfExlqUHMsD69ud/lgfMgIOAsEQQjS2BcVTdF4rPwIkkXvziAqGlFBl4lDlY1YhdhyS6B5mxYVzpy6J/TxrTqYF0QCnaxUpJyvKZxAzyUDBopDoyf7HwXrAXFfdcC+9Lq/eI732Eqg1f94gfVpvaDay59we9qKAz29spdVBoQ2ahWZetRBlWu9WaA2mZrMFAg+MJhEI2dLysBWkWPmvbHkttVTL/TOlOfbNeUWrMwdtCrxFrrYrYDUkiB1Bafi/2/0T3e78DPuAbteaQc0Eul4sEXhs5A118SWrp5SvIJlUgF0vX6x9HzwIkU+ASEv0i0qZ6Rc52UqolzTyKLKlsv/aL6eP+rh8Mk5rs0zPjr4kY9gKh56qHU2pJMKj8vk2p+I/KaGgnEi2q7/0377km123UGz51xSr6VXJd0Sx/CY4LkvuVSIOP6WGw+efGC/6HtZaYUvrjaWADT0Aj5J+Rrc68QH82Ke+8dmZTI8y2fpfk/lyJnFa/SqQr+39tmJN/gA=</diagram><diagram id="xwm_nTvbWLU7bshfNvv3" name="pipeline">7Vxbc6M2FP41fswMl9jAY+ykSaeTbqbuzq6fMjLIQIMRI+QY768vMgIDR06TDRZb7JeMOIAkvk/nKjkjc7bO7ilKgkfi4WhkaF42Mm9HhuFY4/wvF+wKwdixC4FPQ68Q6QfBPPyBhVAT0k3o4bTxICMkYmHSFLokjrHLGjJEKdk2H1uRqDlqgnwMBHMXRVD6LfRYUEjtsXaQP+DQD8qRdU3cWaPyYSFIA+SRbU1k3o3MGSWEFa11NsMRx67EpXjvtyN3q4lRHLP3vBB/mz371CTzdDd7sJ2HH4G7uDKKXl5RtBEfLCbLdiUCOPZuOJD5VUziXDj1UBpg3queXwRsHYkmJZvY29/Q8iuSIDdknPYxv4TTFV+AvQYDYvL3mKwxo7v8ge0B9xL2oAZ5KaM4Qix8bfKGBP1+1V01whMJ85kYmlipui36EQtVL/stu0jJhrpYvFXH+VhH5YsMUR8z8GLeqH3mQbSn7QMUmhcKBfLGpCMKq44UUXh9oVAgb153RGHVkSIKxxcKBfLXRkcUVh0ponByoTAru+mIwqojRRRaFwpL5LsKZ8aKwxn7QqFAftJVODNRHM44FwoF8lZX4YylOJwpP/VjHB6l7VfnydH0Bk/tyOPduV/LcSqOYAwYwiTJ5jlNaMjw89IHFDKcsSZvKaPkBc9IROiB11UYRS0RikI/zi9pwcX0FVMWuii6EfJ16Hl8lOk2yMee52rLh9xSlIDFkXKdjv2/BKvGW+uFD4OzN1eMgN4U0NcWUMVOfQWZ2vHF0uDno2SUFawaGdoJCHBziDD9HAOfgbu98mt42xK42xrRHdwGgFsfMNx233DDshP0EIOBuyoI9QY3LBGZw4W7Kt70Bjcs51wPF+6q0NIb3DBuGQ8X7nHvrhKWSSYDhrt3VwlLGtZw4Z707SoNCPf05pGP5HkUpymAPg1QwpsBzpBPcsSmCaZhPhmOZil9KkXGESBrzK3CDJdb2XsmRVMTBM7F2GjDCMyGym3i/dMkZuXT112GjW8kSROVSZIJk6Raxro6q4zV6jtjNWEK9ffjRXOkmiMjS63mwIzAjV7OQl/+S0FO5lpM6Fq4tUpcfFaGStd7t1RwiyHJTcf+5BkHsV9D1bHpAZsIEvhlEVYX6O+W1p/W/SKZLbZfXlbudrL65+sV3Bso3ISHGOoX+hOgLQmRlIL9a/vkjpd6++CByvhUij6scpZ2hmLk7YaFvt0+uaPQ0MhTOZgdAMQHtAvZ3j38+SOopzt2o+nf083i9vfvcRYvrpzZH/Z8KXEI76BpkBv+QIV+lkL7dFvHUgqhmzlXCp2utNBRrIXQV9mAw8GUGS2FW0RStGH67QwXbbvvHSIDJnxFUXcQOUf7yLTCnEOeXkNTMqAMr422pJR3KrSllgRufoZctXuF+eCzLa3t6LlV+9K83wEr7eBXoQ7IY1p4BCCMk03uuScRN+pLmrd8trfpaBlGHI0zp0xlvhg4MY5u7/wlTZ5Sd5Xt5l/vJHnI/1STAAcSpt5Ni0L7JmUFphbnyEr7l20K7ZuUFejiL6z0ryswqzhHVtq/fOlbVyShwBmy0i7O960rg4mbP8VKu+J4Ol3JLw//raIoWh3+5Yd59y8=</diagram></mxfile> \ No newline at end of file
+<mxfile host="Electron" modified="2023-04-07T12:17:33.499Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="PGJiEEFnzE3vIp279dd3" version="20.8.16" type="device" pages="5"><diagram name="level-1" id="DBE48RpXtx8JnoEt3ekA">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</diagram><diagram id="MdQQJuunD4ehtDpxKxax" name="level-2">7Vxbe6JIEP01eXQ+7uqjcXPZL8kkM0km+9pCi0wamm0aL/Prt5FGLk0QjChunJdIUdhQdapOdVHOhTp2lzcE+LMHbEF0oUjW8kL960JRZLk/YH8iySqW9BU1FtjEsbhSKnh2/kAulLg0dCwY5BQpxog6fl5oYs+DJs3JACF4kVebYpRf1Qc2FATPJkCi9M2x6CyWDnQpld9Cx54lK8sSP+OCRJkLghmw8CIjUq8u1DHBmMaf3OUYosh4iV3i664/OLu5MQI9WucCfTwdzm+1+Z/Hu/lKDxG5/X3fM/rx18wBCvkTBz5xKIwu9KaY3zpdJfaAFjMPP8SEzrCNPYCuUuklwaFnwWhRiR0F75CaM36QXnCPsc+EMhP+hpSuuONBSDETzaiL+NmN1dZfRgGho8irTOBhDyayawchrjOHhDrMfyPk2B6TuY5lre8r8IHpePYlphS77MSAyUQbcrMGOCQmrDCcloAREBvSCkWd4z0yXGYJ7qMbiF1IyYopEIgAdeZ53AEOX3ujt7n0CTvsplMVPJ0G7E4yEGAfMiukojUwGoCkrwsgeXl42AEazJl+dHaK4JK78WBwmSBsvpfgBXpWAVFMkjm/O0QSz2+FiCa1AhH2WGCVUfAjwAQlCOLJWk2SGk/V8qCQUJrpsw/xHRwcr0lsZvB6Ccx3ew21yHOVGS4PyMWMqT6z1BGdXTCOy+PtQ3REaQguK73Jzypa3ozJ4SJDN1w0yzBNIitzf86gTa1niNF+poRalFA33vV+zXjnCJG+cZd0mCLUPVHEkaFSxlAWCGbrO6oM+Cw8vpPV34rnuX0zZJBb6iG8s3p7R0e7bCDLzdhgi/5HbJBwST9/dU8ppLfYvPyqFihDxO81JrCjlCHrO1GG1hZlJM7LWM9GeALQ+kERC9HYdBZ7vJNLCZ8gBK1uAThoJeQPWnNpAgTG2PVx4FBMjh4wxRrrkBFD/u3rVjAEsvWo/lg++tri7r4nCyb5P8eBXjcO2tkrN6U+xSik1y3Up3xKvdi2KfLqsEo9T6s7BHMpOpUzOiu2lWd0ZrQHh0enuD/9dTOKPM12d1HJ8bWhO7z7cRO+fn8bTaX7y1er9/rLe+u1g1yxipfyaNClAn/GNypU8Y07VR+s82Gnqlr/iJ0qEcvU8SJT5CEt2dCDBHSxlNKkeqWU0drm42vVUoO6bKXvO+Y/5yVFQDqxJxvB2YOH8ODB89tA7MQ/je538HYX3xwdAgIdeTNUKDlVbQvfVut/uiysNGoWa5veE8L4PfQ7R56qUo88W+vcGcOvlHrrv5HVukWeQwHal6NTewG/fyKV6nqzGxt3tRD8xpYkWqneTg5Nck8GaKPXf04MaC3wdd1hn47ytbxtf1yt3w7WdPGV23Pylo25yILd2+vKxrHpWqxxfGcZj1wCCr4Ul/ePxuW7tW2LjdWmndWq1upBRz3EN33XJ1eMtMARJbVl1RzIkeE4bFSLVGo3He2Qa3aF90Y04oxz14imONBxdKLpG4LNziO/25OAcWKFolYI7G1DXlv02ykUDbGJ+OIg6LI4VCQXupjj/ZgBrBen30oCWFYOGsFiqXjuGdTvGRjdoGnNaMTT1eothae4j8tN2wNKiTMJ13Tb0WgtmQZrLVhLRxpEEwYmgdCLHjQaoXOwJxiNPSstxBEl+B2OMcIkjZ0pC5uCCPA5eJNZkBU/FQPyZa7IOwuBCUSpv5OVLDgFIaJ7qo6KEy/9En9JJf4qDhHvLbkmQMi+a3h6ZYKfUYqVJmHwOYwXHULxWgET5w/2KEjyoOUQaK7Bwb4EBjTjWxJbIfmJw8s6FUup4Ce3UuVPHuq7SJO2RpRa4iB1Hx6q2mWdHbTMO6SZf+R9TG1UTSRl/OPFNHpCoy8bGtmyS9PbMqIiGPELTMIdc8Ct2JQzWhpwK66jD5s1Cwv6zZuFJSN0w2/D7L/8esU8sfPPddhh+pP4WD39jwXUq/8A</diagram><diagram id="lj51MlK96fuJFRP7cw84" name="level-3">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</diagram><diagram id="1ySgP4OewCsUoPnmkRD4" name="display">7VhNc5swEP01nkkP6YDxV4/BdpNDPeOMk9Q5yiCDasEyQjbQX98ViGAMdpzJR5uZXjLSk1arfW93UdyxxkF6LUjkz8ClvNM13LRjTTrdbn/Yw78KyApgOOwWgCeYW0BmBSzYb6pBQ6Nb5tK4tlECcMmiOuhAGFJH1jAiBCT1bWvgda8R8WgDWDiEN9GfzJV+gY76RoXfUOb5pWfT0CsBKTdrIPaJC8keZE071lgAyGIUpGPKFXclL4Xd9yOrTxcTNJTnGGTk5vF+Nlkk6fVc3s9k8HBNLrUYO8K3OmB9WZmVDHgCtlHTmfa/o0LStE0KsipPqKLFLKEQUCky3JdUfFqWJsnf47Jbkky0ht6TbRUmDnSk7VFPe5u1se07sPy26MWjm9u7wW1L1DZxNirQ0FUBkHCHPrsDjjexVwJHnhpdDHpG2hsZXxoc5ZZUuTRwX+IzSRcRcdRqgmWBmC8DvOLExKGijGGGXXHmhYitQEoIcCFGExZ6aps6psn5SQkPhWgSXq5qWrP6dF+ObpscvfeSw2zR42qGwAV6HLfQjaUU5dySLAKm2LHjDZWOrwVYM84XensMXDm346K1DHCY21Ax3SGxsRYlx/LA+nanP9GHjIGDQDCEEI1tQfEUndfKjwBJ5N48ooIhJVSZOFT5mFeIHYckuoN5ceHcqUtiP8+ak2lBNMDpWkXKyYryOcRMMlCwKCR6sv9xsB4w11U33Euvy+F7pNdeArXmzxukT+sNzUb2nNvDXhTw+Y2ttDootEGz0MxhC1Gm9W6F1mBqPr9H4IHRJAIhW1oetoIUK/+VLa+llmq5f6Y0x745r2h15qBNgbfI1XYFrIYEsSMoDf93u3+i252fYR/Q7VozqJlAV/dLBB4beUNdfMnqKeUrSKYVYNfLF2vfBw9C5BMg0hL9olJm+kVOthLqJY08imyp7L/2y+mjPi6fTNLaLNOzoy/JGLbCoadqR1MqifCofL7NqfhPSigoJ5Lt6i/9ty/5ZtctFFv+NcVqelXyHVEsvwmOy5J7lYijT6nh6Pknxou+h7VW2NJ6YylgQw/Ao6Sf0a1OfAA/9qlvfHYm06NMtv7XZL6cSZxWvwrka3s/rVjTPw==</diagram><diagram id="xwm_nTvbWLU7bshfNvv3" name="pipeline">7Vxbc5s4GP01ntl98Ax37MfYSZN2m21m3U6bp4wMMqjBiBFybefXr2TANkghqcMlxTwFf5YQnPPdpXigT5ebawIi/xa7MBhoirsZ6JcDTVMVzWJ/uGSbSGxbSwQeQW466CCYoSeYzUylK+TCODeQYhxQFOWFDg5D6NCcDBCC1/lhCxzkV42ABwXBzAGBKP2OXOon0pGpHOQ3EHl+trKqpN8sQTY4FcQ+cPH6SKRfDfQpwZgmV8vNFAYcvAyXZN6HZ77dPxiBIX3NBPfzB99D1vzT0+On4efx+uf1ejLUk7v8AsEqfeH0Yek2Q8AjeBWlwyChcCPDHcyz4Yr4XOr+bZmaQLyElGzZkL2OpFPWR/hmMv8IWy0TgpRTb3+vw2uzi/TN5SiE36cPHtHxLN5Ob0bjmyffuR9mD10GAwzdC65P7FOIQyac+HTJVrlU2SWDKHQhX0Jhn0QEyrCHbk4DRZyOcDElsGQyAgNA0a+83sqgSle4w4g9nqZsn0E3xiviwHTUsV5lE7OBFBAPUmHgjon9a7yBnFO4cUHs7/hQy4jCEXAQ5QCYfx5vm8xUkhkn01i4T0OsvsLxnDOrqlURrfsbNcSr0fNaxqtmVMTr/kYN8Wr2vJbxqmsV8bq/UUO8Wj2vZbwaSkW8GsWJNfNq97yW8lpV2mQ0nDeNel7LeDWrypvMhvOmcc9rGa9WVXmTVV/epKg/4tX95ccf4SZkhE7/Gc3mQ7XntYxXu6q8ya4vb5Ly2nclXuhKVNaWqI1XKYxZ3/mIWJ/3jIvkxj6I+KUPN8DDIeMpggSx1SE5SO8yEYNpsvYRhTPGLZ+2JiDK68ACbWDW/+af4/QyrxG2UlQjCjf0S/779A3EZu3rlOjZTm0hZ1IzrI5Ual++HOuUXlvf9iTv+ht9W/VdGdVYUQtGdZpNqYJx1mVictbEmjOKVg9xRJiBPMw9gUKu4nneYkrwI5ziAJMDrwsUBAURCJDHbPOSJFxMuE0gBwQXqXyJXJevIjXOvHLE3MZC77+UVa1MXwTTEzVmmzeNIwVSZXsftZmQxN8pNRDgMIi4Z3wLA2+Bu3SvSYS7aBHVwS3mDWqH4R61Dbe4zSBGiM7ArVltwy12//Xuwq0bbcMtNuWN7sJtaG3DLeYtZnfhNlsPlWIL2+ow3K2HSrGzbHcXbqvtUKmJcE8ubvlKrktgHAvQN9pw4ATO0rXBimKxGsoOs+1G45Bmo40q08aSIslqskjSxSLpqGJdnFXFarddsepiCfX1trccqeXIyGrWcsSKwAkez8JeXjKQ2kKLLoYW7q0iB56Vo1LN1j2VuKkbMdexOyDPQWzXUVXseuzCDq36ygyrCvS3c/tf+/o+mt6vvzwunLW1+PlNsvOahAkXUNAu9DWgLUmRGgX7fcfkilXdVNrLT6Xoi13OzM8QCNxtt9Afae05GulRABH9UQ1x9p0UznaDTU8p2mJCOe4u2qO2e56amMIkbYpORFFDay2KyhNG0ZV0KGcpoi0pThv122I7H3HTbhXmk076VLMl3rwNyA9MiptaKIxWdKBZAXfqc8KuPLrz6WCOAo7GmVMmq3Tr4swfhzC4vPLmJLqLncVmO/t2Jcn+z9GS9PZqMikrYjDpWWk06khZEfPXc2TFst6XrUiCzhmyUmxstG0rfYYma3g0aCvyI/ICKzcfvzLBXygcAsdZEUDh3+2S9OZduBcOz/9mfiY5KN8oY53xbpXS0qB3k7JSegz+jztUcBo1JRZS216dlAxxzzR1agSC4Ky9WTEpqNGbsY+H38NK/t3k8Kti+tX/</diagram></mxfile> \ No newline at end of file
diff --git a/src/demo.c b/src/demo.c
index fe58758..a5a3a1e 100644
--- a/src/demo.c
+++ b/src/demo.c
@@ -10,8 +10,8 @@ hh_s_ppu_loc_fam_entry g_hh_demo_balls[HH_DEMO_BALL_COUNT];
void hh_demo_setup() {
// load sprites
- hh_ppu_update_sprite(0, HH_DBG_SPRITE_BALL);
- hh_ppu_update_sprite(1, HH_DBG_SPRITE_CHECKERBOARD);
+ hh_ppu_update_sprite(1, HH_DBG_SPRITE_BALL);
+ hh_ppu_update_sprite(2, HH_DBG_SPRITE_CHECKERBOARD);
// background pattern
hh_ppu_update_color(0, 0, (hh_ppu_rgb_color_t) {0x1, 0x1, 0x3});
@@ -21,7 +21,7 @@ void hh_demo_setup() {
.horizontal_flip = false,
.vertical_flip = false,
.palette_index = 0,
- .tilemap_index = 1,
+ .tilemap_index = 2,
});
}
@@ -37,11 +37,14 @@ void hh_demo_setup() {
g_hh_demo_balls[i].horizontal_flip = false;
g_hh_demo_balls[i].vertical_flip = false;
g_hh_demo_balls[i].palette_index = i+1;
- g_hh_demo_balls[i].tilemap_index = 0;
+ g_hh_demo_balls[i].tilemap_index = 1;
}
+ hh_ppu_flush();
}
void hh_demo_loop(unsigned long frame) {
+ // if (frame % 300 == 0) hh_demo_setup();
+
// set background pattern position
hh_ppu_update_background_pos((frame / 5) % HH_PPU_SPRITE_WIDTH, (frame / 20) % HH_PPU_SPRITE_HEIGHT);
@@ -50,7 +53,6 @@ void hh_demo_loop(unsigned long frame) {
g_hh_demo_balls[i].position_y = HH_PPU_SCREEN_HEIGHT/2 - HH_PPU_SPRITE_HEIGHT/2 + (int)(30 * (double)sin((2*(double)frame / 10) + (double)i * 12));
hh_ppu_update_foreground(i+16, g_hh_demo_balls[i]);
}
-
return;
/*
hh_ppu_update_foreground(32, (hh_s_ppu_loc_fam_entry) {
diff --git a/src/main.c b/src/main.c
index fb96d84..0676dd6 100644
--- a/src/main.c
+++ b/src/main.c
@@ -17,16 +17,16 @@ volatile unsigned short g_hh_hcount;
void hh_ppu_vblank_interrupt() {
static unsigned long frame = 0;
- static bool done = false;
#ifdef HH_TARGET_STM32
hh_ppu_flush();
hh_input_read();
hh_demo_loop(frame);
#endif
#ifdef HH_TARGET_DESKTOP
+ static bool done = false;
//hh_ppu_vram_dwrite((uint8_t*) HH_PPUINTDEMO_ARR, HH_PPUINTDEMO_LENGTH);
for (unsigned int limit = 0; limit < 1000; limit++) {
- if (frame * 4 > HH_PPUINTDEMO_LENGTH) {
+ if (frame * 4 >= HH_PPUINTDEMO_LENGTH) {
if (!done) printf("done\n");
done = true;
return;
diff --git a/src/ppu/stm.c b/src/ppu/stm.c
index ddd62b9..ccf3566 100644
--- a/src/ppu/stm.c
+++ b/src/ppu/stm.c
@@ -6,6 +6,8 @@
void hh_ppu_init() {
hh_ppu_update_aux((hh_s_ppu_loc_aux) { .sysreset = 1 });
+ hh_ppu_vram_buffer((uint8_t[4]) { 0xff, 0xff, 0xff, 0xff });
+ hh_ppu_flush();
}
void hh_ppu_deinit() {}
diff --git a/src/ppusim/mem.c b/src/ppusim/mem.c
index 20464cb..def14c0 100644
--- a/src/ppusim/mem.c
+++ b/src/ppusim/mem.c
@@ -1,5 +1,6 @@
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include "ppu/internals.h"
#include "ppusim/mem.h"
@@ -39,9 +40,10 @@ static void hh_ppu_dbg_memprint(hh_ppu_addr_t addr, hh_ppu_data_t data) {
}
case 3: {
unsigned short i = addr - HH_PPU_VRAM_PAL_OFFSET;
- printf(" (pal[%02i] = #%x%x%x%x%x%x)", i, (data >> 0) & 0xf, (data >> 0) & 0xf,
+ printf(" (pal[%02i] = #%x%x%x%x%x%x)", i,
+ (data >> 8) & 0xf, (data >> 8) & 0xf,
(data >> 4) & 0xf, (data >> 4) & 0xf,
- (data >> 8) & 0xf, (data >> 8) & 0xf);
+ (data >> 0) & 0xf, (data >> 0) & 0xf);
break;
}
case 4: {
@@ -68,6 +70,11 @@ void hh_ppu_vram_dwrite(uint8_t* data, size_t size) {
#endif
if (!hh_ppu_vram_valid_address(ppu_addr)) continue;
g_hh_ppusim_vram[ppu_addr] = ppu_data;
+
+ if (ppu_addr == HH_PPU_VRAM_AUX_OFFSET + 1) {
+ bool reset = HH_RESIZE(ppu_data, 2, 2);
+ if (reset) memset(g_hh_ppusim_vram, 0x0000, 0xffff * sizeof(hh_ppu_data_t));
+ }
}
}
diff --git a/src/ppusim/sim.h b/src/ppusim/sim.h
index 4d1d718..4911a06 100644
--- a/src/ppusim/sim.h
+++ b/src/ppusim/sim.h
@@ -1,7 +1,7 @@
#pragma once
/** @brief pixel-perfect upscale factor for PPUSIM */
-#define HH_PPUSIM_UPSCALE_FACTOR 3
+#define HH_PPUSIM_UPSCALE_FACTOR 1
/** @brief max framerate for PPUSIM */
#define HH_PPUSIM_FRAMERATE 60
diff --git a/src/ppusim/work.c b/src/ppusim/work.c
index 977b2c4..c8964cd 100644
--- a/src/ppusim/work.c
+++ b/src/ppusim/work.c
@@ -25,10 +25,6 @@ void *hh_ppusim_draw_thread(void *arg) {
}
void hh_ppusim_draw_frame(SDL_Renderer *renderer) {
- hh_ppu_data_t *aux = &g_hh_ppusim_vram[HH_PPU_VRAM_AUX_OFFSET];
- bool reset = HH_RESIZE(aux[1], 2, 2);
- if (reset) memset(g_hh_ppusim_vram, 0x0000, 0xffff * sizeof(hh_ppu_data_t));
-
for (unsigned core = 0; core < g_hh_ppusim_core_count; core++) pthread_create(&g_hh_ppusim_threads[core], NULL, hh_ppusim_draw_thread, (void *)(unsigned long)core);
for (unsigned core = 0; core < g_hh_ppusim_core_count; core++) pthread_join(g_hh_ppusim_threads[core], NULL);
diff --git a/src/stm32/setup.c b/src/stm32/setup.c
index d15c643..6975592 100644
--- a/src/stm32/setup.c
+++ b/src/stm32/setup.c
@@ -69,7 +69,6 @@ static void hh_io_usart2_setup();
static void hh_io_gpio_setup();
static void hh_io_clock_setup();
static void hh_io_setup_error_handler();
-static void hh_interrupt_setup();
static void hh_io_dma_setup();
void hh_setup() {
diff --git a/test/ppu-stm-integration-demo/capture-debug-5.pvc b/test/ppu-stm-integration-demo/capture-debug-5.pvc
new file mode 100644
index 0000000..a860c18
--- /dev/null
+++ b/test/ppu-stm-integration-demo/capture-debug-5.pvc
@@ -0,0 +1,83 @@
+0-8305305 SPI: MOSI transfer:
+8305423-8639335 SPI: MOSI transfer: DE 00 00 00 DE 01 00 04 00 00 00 00 00 01 12 49 00 02 00 01 00 03 10 00 00 04 12 49 00 05 02 49 00 06 10 00 00 07 12 49 00 08 12 49 00 09 10 01 00 0A 12 49 00 0B 12 49 00 0C 00 49 00 0D 12 49 00 0E 12 49 00 0F 02 49 00 10 12 49 00 11 12 49 00 12 12 49 00 13 12 49 00 14 12 49 00 15 12 49 00 16 12 49 00 17 12 49 00 18 12 49 00 19 12 49 00 1A 12 49 00 1B 12 49 00 1C 12 49 00 1D 12 49 00 1E 02 49 00 1F 12 49 00 20 12 49 00 21 12 49 00 22 12 41 00 23 12 41 00 24 00 49 00 25 10 00 00 26 12 01 00 27 12 49 00 28 10 49 00 29 00 09 00 2A 12 49 00 2B 10 49 00 2C 00 09 00 2D 12 40 00 2E 12 49 00 2F 00 09 00 30 00 00 00 31 12 49 00 32 00 01 00 33 00 00 00 34 00 01 00 35 02 08 00 36 10 00 00 37 00 00 00 38 02 00 00 39 00 00 00 3A 00 48 00 3B 02 00 00 3C 00 01 00 3D 10 08 00 3E 02 00 00 3F 00 40 00 40 00 08 00 41 02 08 00 42 10 00 00 43 00 08 00 44 02 00 00 45 00 00 00 46 00 08 00 47 02 00 00 48 00 01 00 49 02 08 00 4A 02 00 00 4B 00 40 00 4C 00 08 00 4D 02 01 00 4E 10 00 00 4F 00 08 00 50 00 40 00 51 00 00 00 52 00 08 00 53 10 00 00 54 00 01 00 55 02 08 00 56 10 00 00 57 00 40 00 58 00 08 00 59 10 01 00 5A 10 00 00 5B 00 08 00 5C 10 40 00 5D 00 00 00 5E 00 08 00 5F 10 00 00 60 00 00 00 61 02 08 00 62 10 00 00 63 00 08 00 64 00 08 00 65 10 01 00 66 02 00 00 67 00 00 DC 00 01 13 DC 01 04 46 D0 00 00 01 D0 01 00 01 D0 02 00 01 D0 03 00 01 D0 04 00 01 D0 05 00 01 D0 06 00 01 D0 07 00 01 D0 08 00 01 D0 09 00 01 D0 0A 00 01 D0 0B 00 01 D0 0C 00 01 D0 0D 00 01 D0 0E 00 01 D0 0F 00 01 D0 10 00 01 D0 11 00 01 D0 12 00 01 D0 13 00 01 D0 14 00 01 D0 15 00 01 D0 16 00 01 D0 17 00 01 D0 18 00 01 D0 19 00 01 D0 1A 00 01 D0 1B 00 01 D0 1C 00 01 D0 1D 00 01 D0 1E 00 01 D0 1F 00 01 D0 20 00 01 D0 21 00 01 D0 22 00 01 D0 23 00 01 D0 24 00 01 D0 25 00 01 D0 26 00 01 D0 27 00 01 D0 28 00 01 D0 29 00 01 D0 2A 00 01 D0 2B 00 01 D0 2C 00 01 D0 2D 00 01 D0 2E 00 01 D0 2F 00 01 D0 30 00 01 D0 31 00 01 D0 32 00 01 D0 33 00 01 D0 34 00 01 D0 35 00 01 D0 36 00 01 D0 37 00 01 D0 38 00 01 D0 39 00 01 D0 3A 00 01 D0 3B 00 01 D0 3C 00 01 D0 3D 00 01 D0 3E 00 01 D0 3F 00 01 D0 40 00 01 D0 41 00 01 D0 42 00 01 D0 43 00 01 D0 44 00 01 D0 45 00 01 D0 46 00 01 D0 47 00 01 D0 48 00 01 D0 49 00 01 D0 4A 00 01 D0 4B 00 01 D0 4C 00 01 D0 4D 00 01 D0 4E 00 01 D0 4F 00 01 D0 50 00 01 D0 51 00 01 D0 52 00 01 D0 53 00 01 D0 54 00 01 D0 55 00 01 D0 56 00 01 D0 57 00 01 D0 58 00 01 D0 59 00 01 D0 5A 00 01 D0 5B 00 01 D0 5C 00 01 D0 5D 00 01 D0 5E 00 01 D0 5F 00 01 D0 60 00 01 D0 61 00 01 D0 62 00 01 D0 63 00 01 D0 64 00 01 D0 65 00 01 D0 66 00 01 D0 67 00 01 D0 68 00 01 D0 69 00 01 D0 6A 00 01 D0 6B 00 01 D0 6C 00 01 D0 6D 00 01 D0 6E 00 01 D0 6F 00 01 D0 70 00 01 D0 71 00 01 D0 72 00 01 D0 73 00 01 D0 74 00 01 D0 75 00 01 D0 76 00 01 D0 77 00 01 D0 78 00 01 D0 79 00 01 D0 7A 00 01 D0 7B 00 01 D0 7C 00 01 D0 7D 00 01 D0 7E 00 01 D0 7F 00 01 D0 80 00 01 D0 81 00 01 D0 82 00 01 D0 83 00 01 D0 84 00 01 D0 85 00 01 D0 86 00 01 D0 87 00 01 D0 88 00 01 D0 89 00 01 D0 8A 00 01 D0 8B 00 01 D0 8C 00 01 D0 8D 00 01 D0 8E 00 01 D0 8F 00 01 D0 90 00 01 D0 91 00 01 D0 92 00 01 D0 93 00 01 D0 94 00 01 D0 95 00 01 D0 96 00 01 D0 97 00 01 D0 98 00 01 D0 99 00 01 D0 9A 00 01 D0 9B 00 01 D0 9C 00 01 D0 9D 00 01 D0 9E 00 01 D0 9F 00 01 D0 A0 00 01 D0 A1 00 01 D0 A2 00 01 D0 A3 00 01 D0 A4 00 01 D0 A5 00 01 D0 A6 00 01 D0 A7 00 01 D0 A8 00 01 D0 A9 00 01 D0 AA 00 01 D0 AB 00 01 D0 AC 00 01 D0 AD 00 01 D0 AE 00 01 D0 AF 00 01 D0 B0 00 01 D0 B1 00 01 D0 B2 00 01 D0 B3 00 01 D0 B4 00 01 D0 B5 00 01 D0 B6 00 01 D0 B7 00 01 D0 B8 00 01 D0 B9 00 01 D0 BA 00 01 D0 BB 00 01 D0 BC 00 01 D0 BD 00 01 D0 BE 00 01 D0 BF 00 01 D0 C0 00 01 D0 C1 00 01 D0 C2 00 01 D0 C3 00 01 D0 C4 00 01 D0 C5 00 01 D0 C6 00 01 D0 C7 00 01 D0 C8 00 01 D0 C9 00 01 D0 CA 00 01 D0 CB 00 01 D0 CC 00 01 D0 CD 00 01 D0 CE 00 01 D0 CF 00 01 D0 D0 00 01 D0 D1 00 01 D0 D2 00 01 D0 D3 00 01 D0 D4 00 01 D0 D5 00 01 D0 D6 00 01 D0 D7 00 01 D0 D8 00 01 D0 D9 00 01 D0 DA 00 01 D0 DB 00 01 D0 DC 00 01 D0 DD 00 01 D0 DE 00 01 D0 DF 00 01 D0 E0 00 01 D0 E1 00 01 D0 E2 00 01 D0 E3 00 01 D0 E4 00 01 D0 E5 00 01 D0 E6 00 01 D0 E7 00 01 D0 E8 00 01 D0 E9 00 01 D0 EA 00 01 D0 EB 00 01 D0 EC 00 01 D0 ED 00 01 D0 EE 00 01 D0 EF 00 01 D0 F0 00 01 D0 F1 00 01 D0 F2 00 01 D0 F3 00 01 D0 F4 00 01 D0 F5 00 01 D0 F6 00 01 D0 F7 00 01 D0 F8 00 01 D0 F9 00 01 D0 FA 00 01 D0 FB 00 01 D0 FC 00 01 D0 FD 00 01 D0 FE 00 01 D0 FF 00 01 D1 00 00 01 D1 01 00 01 D1 02 00 01 D1 03 00 01 D1 04 00 01 D1 05 00 01 D1 06 00 01 D1 07 00 01 D1 08 00 01 D1 09 00 01 D1 0A 00 01 D1 0B 00 01 D1 0C 00 01 D1 0D 00 01 D1 0E 00 01 D1 0F 00 01 D1 10 00 01 D1 11 00 01 D1 12 00 01 D1 13 00 01 D1 14 00 01 D1 15 00 01 D1 16 00 01 D1 17 00 01 D1 18 00 01 D1 19 00 01 D1 1A 00 01 D1 1B 00 01 D1 1C 00 01 D1 1D 00 01 D1 1E 00 01 D1 1F 00 01 D1 20 00 01 D1 21 00 01 D1 22 00 01 D1 23 00 01 D1 24 00 01 D1 25 00 01 D1 26 00 01 D1 27 00 01 D1 28 00 01 D1 29 00 01 D1 2A 00 01 D1 2B 00 01 D1 2C 00 01 D1 2D 00 01 D1 2E 00 01 D1 2F 00 01 D1 30 00 01 D1 31 00 01 D1 32 00 01 D1 33 00 01 D1 34 00 01 D1 35 00 01 D1 36 00 01 D1 37 00 01 D1 38 00 01 D1 39 00 01 D1 3A 00 01 D1 3B 00 01 D1 3C 00 01 D1 3D 00 01 D1 3E 00 01 D1 3F 00 01 D1 40 00 01 D1 41 00 01 D1 42 00 01 D1 43 00 01 D1 44 00 01 D1 45 00 01 D1 46 00 01 D1 47 00 01 D1 48 00 01 D1 49 00 01 D1 4A 00 01 D1 4B 00 01 D1 4C 00 01 D1 4D 00 01 D1 4E 00 01 D1 4F 00 01 D1 50 00 01 D1 51 00 01 D1 52 00 01 D1 53 00 01 D1 54 00 01 D1 55 00 01 D1 56 00 01 D1 57 00 01 D1 58 00 01 D1 59 00 01 D1 5A 00 01 D1 5B 00 01 D1 5C 00 01 D1 5D 00 01 D1 5E 00 01 D1 5F 00 01 D1 60 00 01 D1 61 00 01 D1 62 00 01 D1 63 00 01 D1 64 00 01 D1 65 00 01 D1 66 00 01 D1 67 00 01 D1 68 00 01 D1 69 00 01 D1 6A 00 01 D1 6B 00 01 D1 6C 00 01 D1 6D 00 01 D1 6E 00 01 D1 6F 00 01 D1 70 00 01 D1 71 00 01 D1 72 00 01 D1 73 00 01 D1 74 00 01 D1 75 00 01 D1 76 00 01 D1 77 00 01 D1 78 00 01 D1 79 00 01 D1 7A 00 01 D1 7B 00 01 D1 7C 00 01 D1 7D 00 01 D1 7E 00 01 D1 7F 00 01 D1 80 00 01 D1 81 00 01 D1 82 00 01 D1 83 00 01 D1 84 00 01 D1 85 00 01 D1 86 00 01 D1 87 00 01 D1 88 00 01 D1 89 00 01 D1 8A 00 01 D1 8B 00 01 D1 8C 00 01 D1 8D 00 01 D1 8E 00 01 D1 8F 00 01 D1 90 00 01 D1 91 00 01 D1 92 00 01 D1 93 00 01 D1 94 00 01 D1 95 00 01 D1 96 00 01 D1 97 00 01 D1 98 00 01 D1 99 00 01 D1 9A 00 01 D1 9B 00 01 D1 9C 00 01 D1 9D 00 01 D1 9E 00 01 D1 9F 00 01 D1 A0 00 01 D1 A1 00 01 D1 A2 00 01 D1 A3 00 01 D1 A4 00 01 D1 A5 00 01 D1 A6 00 01 D1 A7 00 01 D1 A8 00 01 D1 A9 00 01 D1 AA 00 01 D1 AB 00 01 D1 AC 00 01 D1 AD 00 01 D1 AE 00 01 D1 AF 00 01 D1 B0 00 01 D1 B1 00 01 D1 B2 00 01 D1 B3 00 01 D1 B4 00 01 D1 B5 00 01 D1 B6 00 01 D1 B7 00 01 D1 B8 00 01 D1 B9 00 01 D1 BA 00 01 D1 BB 00 01 D1 BC 00 01 D1 BD 00 01 D1 BE 00 01 D1 BF 00 01 D1 C0 00 01 D1 C1 00 01 D1 C2 00 01 D1 C3 00 01 D1 C4 00 01 D1 C5 00 01 D1 C6 00 01 D1 C7 00 01 D1 C8 00 01 D1 C9 00 01 D1 CA 00 01 D1 CB 00 01 D1 CC 00 01 D1 CD 00 01 D1 CE 00 01 D1 CF 00 01 D1 D0 00 01 D1 D1 00 01 D1 D2 00 01 D1 D3 00 01 D1 D4 00 01 D1 D5 00 01 D1 D6 00 01 D1 D7 00 01 D1 D8 00 01 D1 D9 00 01 D1 DA 00 01 D1 DB 00 01 D1 DC 00 01 D1 DD 00 01 D1 DE 00 01 D1 DF 00 01 D1 E0 00 01 D1 E1 00 01 D1 E2 00 01 D1 E3 00 01 D1 E4 00 01 D1 E5 00 01 D1 E6 00 01 D1 E7 00 01 D1 E8 00 01 D1 E9 00 01 D1 EA 00 01 D1 EB 00 01 D1 EC 00 01 D1 ED 00 01 D1 EE 00 01 D1 EF 00 01 D1 F0 00 01 D1 F1 00 01 D1 F2 00 01 D1 F3 00 01 D1 F4 00 01 D1 F5 00 01 D1 F6 00 01 D1 F7 00 01 D1 F8 00 01 D1 F9 00 01 D1 FA 00 01 D1 FB 00 01 D1 FC 00 01 D1 FD 00 01 D1 FE 00 01 D1 FF 00 01 D2 00 00 01 D2 01 00 01 D2 02 00 01 D2 03 00 01 D2 04 00 01 D2 05 00 01 D2 06 00 01 D2 07 00 01 D2 08 00 01 D2 09 00 01 D2 0A 00 01 D2 0B 00 01 D2 0C 00 01 D2 0D 00 01 D2 0E 00 01 D2 0F 00 01 D2 10 00 01 D2 11 00 01 D2 12 00 01 D2 13 00 01 D2 14 00 01 D2 15 00 01 D2 16 00 01 D2 17 00 01 D2 18 00 01 D2 19 00 01 D2 1A 00 01 D2 1B 00 01 D2 1C 00 01 D2 1D 00 01 D2 1E 00 01 D2 1F 00 01 D2 20 00 01 D2 21 00 01 D2 22 00 01 D2 23 00 01 D2 24 00 01 D2 25 00 01 D2 26 00 01 D2 27 00 01 D2 28 00 01 D2 29 00 01 D2 2A 00 01 D2 2B 00 01 D2 2C 00 01 D2 2D 00 01 D2 2E 00 01 D2 2F 00 01 D2 30 00 01 D2 31 00 01 D2 32 00 01 D2 33 00 01 D2 34 00 01 D2 35 00 01 D2 36 00 01 D2 37 00 01 D2 38 00 01 D2 39 00 01 D2 3A 00 01 D2 3B 00 01 D2 3C 00 01 D2 3D 00 01 D2 3E 00 01 D2 3F 00 01 D2 40 00 01 D2 41 00 01 D2 42 00 01 D2 43 00 01 D2 44 00 01 D2 45 00 01 D2 46 00 01 D2 47 00 01 D2 48 00 01 D2 49 00 01 D2 4A 00 01 D2 4B 00 01 D2 4C 00 01 D2 4D 00 01 D2 4E 00 01 D2 4F 00 01 D2 50 00 01 D2 51 00 01 D2 52 00 01 D2 53 00 01 D2 54 00 01 D2 55 00 01 D2 56 00 01 D2 57 00 01 D2 58 00 01 D2 59 00 01 D2 5A 00 01 D2 5B 00 01 D2 5C 00 01 D2 5D 00 01 D2 5E 00 01 D2 5F 00 01 D2 60 00 01 D2 61 00 01 D2 62 00 01 D2 63 00 01 D2 64 00 01 D2 65 00 01 D2 66 00 01 D2 67 00 01 D2 68 00 01 D2 69 00 01 D2 6A 00 01 D2 6B 00 01 D2 6C 00 01 D2 6D 00 01 D2 6E 00 01 D2 6F 00 01 D2 70 00 01 D2 71 00 01 D2 72 00 01 D2 73 00 01 D2 74 00 01 D2 75 00 01 D2 76 00 01 D2 77 00 01 D2 78 00 01 D2 79 00 01 D2 7A 00 01 D2 7B 00 01 D2 7C 00 01 D2 7D 00 01 D2 7E 00 01 D2 7F 00 01 D2 80 00 01 D2 81 00 01 D2 82 00 01 D2 83 00 01 D2 84 00 01 D2 85 00 01 D2 86 00 01 D2 87 00 01 D2 88 00 01 D2 89 00 01 D2 8A 00 01 D2 8B 00 01 D2 8C 00 01 D2 8D 00 01 D2 8E 00 01 D2 8F 00 01 D2 90 00 01 D2 91 00 01 D2 92 00 01 D2 93 00 01 D2 94 00 01 D2 95 00 01 D2 96 00 01 D2 97 00 01 D2 98 00 01 D2 99 00 01 D2 9A 00 01 D2 9B 00 01 D2 9C 00 01 D2 9D 00 01 D2 9E 00 01 D2 9F 00 01 D2 A0 00 01 D2 A1 00 01 D2 A2 00 01 D2 A3 00 01 D2 A4 00 01 D2 A5 00 01 D2 A6 00 01 D2 A7 00 01 D2 A8 00 01 D2 A9 00 01 D2 AA 00 01 D2 AB 00 01 D2 AC 00 01 D2 AD 00 01 D2 AE 00 01 D2 AF 00 01 D2 B0 00 01 D2 B1 00 01 D2 B2 00 01 D2 B3 00 01 D2 B4 00 01 D2 B5 00 01 D2 B6 00 01 D2 B7 00 01 D2 B8 00 01 D2 B9 00 01 D2 BA 00 01 D2 BB 00 01 D2 BC 00 01 D2 BD 00 01 D2 BE 00 01 D2 BF 00 01 D2 C0 00 01 D2 C1 00 01 D2 C2 00 01 D2 C3 00 01 D2 C4 00 01 D2 C5 00 01 D2 C6 00 01 D2 C7 00 01 D2 C8 00 01 D2 C9 00 01 D2 CA 00 01 D2 CB 00 01 D2 CC 00 01 D2 CD 00 01 D2 CE 00 01 D2 CF 00 01 D2 D0 00 01 D2 D1 00 01 D2 D2 00 01 D2 D3 00 01 D2 D4 00 01 D2 D5 00 01 D2 D6 00 01 D2 D7 00 01 D2 D8 00 01 D2 D9 00 01 D2 DA 00 01 D2 DB 00 01 D2 DC 00 01 D2 DD 00 01 D2 DE 00 01 D2 DF 00 01 D2 E0 00 01 D2 E1 00 01 D2 E2 00 01 D2 E3 00 01 D2 E4 00 01 D2 E5 00 01 D2 E6 00 01 D2 E7 00 01 D2 E8 00 01 D2 E9 00 01 D2 EA 00 01 D2 EB 00 01 D2 EC 00 01 D2 ED 00 01 D2 EE 00 01 D2 EF 00 01 D2 F0 00 01 D2 F1 00 01 D2 F2 00 01 D2 F3 00 01 D2 F4 00 01 D2 F5 00 01 D2 F6 00 01 D2 F7 00 01 D2 F8 00 01 D2 F9 00 01 D2 FA 00 01 D2 FB 00 01 D2 FC 00 01 D2 FD 00 01 D2 FE 00 01 D2 FF 00 01 D3 00 00 01 D3 01 00 01 D3 02 00 01 D3 03 00 01 D3 04 00 01 D3 05 00 01 D3 06 00 01 D3 07 00 01 D3 08 00 01 D3 09 00 01 D3 0A 00 01 D3 0B 00 01 D3 0C 00 01 D3 0D 00 01 D3 0E 00 01 D3 0F 00 01 D3 10 00 01 D3 11 00 01 D3 12 00 01 D3 13 00 01 D3 14 00 01 D3 15 00 01 D3 16 00 01 D3 17 00 01 D3 18 00 01 D3 19 00 01 D3 1A 00 01 D3 1B 00 01 D3 1C 00 01 D3 1D 00 01 D3 1E 00 01 D3 1F 00 01 D3 20 00 01 D3 21 00 01 D3 22 00 01 D3 23 00 01 D3 24 00 01 D3 25 00 01 D3 26 00 01 D3 27 00 01 D3 28 00 01 D3 29 00 01 D3 2A 00 01 D3 2B 00 01 D3 2C 00 01 D3 2D 00 01 D3 2E 00 01 D3 2F 00 01 D3 30 00 01 D3 31 00 01 D3 32 00 01 D3 33 00 01 D3 34 00 01 D3 35 00 01 D3 36 00 01 D3 37 00 01 D3 38 00 01 D3 39 00 01 D3 3A 00 01 D3 3B 00 01 D3 3C 00 01 D3 3D 00 01 D3 3E 00 01 D3 3F 00 01 D3 40 00 01 D3 41 00 01 D3 42 00 01 D3 43 00 01 D3 44 00 01 D3 45 00 01 D3 46 00 01 D3 47 00 01 D3 48 00 01 D3 49 00 01 D3 4A 00 01 D3 4B 00 01 D3 4C 00 01 D3 4D 00 01 D3 4E 00 01 D3 4F 00 01 D3 50 00 01 D3 51 00 01 D3 52 00 01 D3 53 00 01 D3 54 00 01 D3 55 00 01 D3 56 00 01 D3 57 00 01 D3 58 00 01 D3 59 00 01 D3 5A 00 01 D3 5B 00 01 D3 5C 00 01 D3 5D 00 01 D3 5E 00 01 D3 5F 00 01 D3 60 00 01 D3 61 00 01 D3 62 00 01 D3 63 00 01 D3 64 00 01 D3 65 00 01 D3 66 00 01 D3 67 00 01 D3 68 00 01 D3 69 00 01 D3 6A 00 01 D3 6B 00 01 D3 6C 00 01 D3 6D 00 01 D3 6E 00 01 D3 6F 00 01 D3 70 00 01 D3 71 00 01 D3 72 00 01 D3 73 00 01 D3 74 00 01 D3 75 00 01 D3 76 00 01 D3 77 00 01 D3 78 00 01 D3 79 00 01 D3 7A 00 01 D3 7B 00 01 D3 7C 00 01 D3 7D 00 01 D3 7E 00 01 D3 7F 00 01 D3 80 00 01 D3 81 00 01 D3 82 00 01 D3 83 00 01 D3 84 00 01 D3 85 00 01 D3 86 00 01 D3 87 00 01 D3 88 00 01 D3 89 00 01 D3 8A 00 01 D3 8B 00 01 D3 8C 00 01 D3 8D 00 01 D3 8E 00 01 D3 8F 00 01 D3 90 00 01 D3 91 00 01 D3 92 00 01 D3 93 00 01 D3 94 00 01 D3 95 00 01 D3 96 00 01 D3 97 00 01 D3 98 00 01 D3 99 00 01 D3 9A 00 01 D3 9B 00 01 D3 9C 00 01 D3 9D 00 01 D3 9E 00 01 D3 9F 00 01 D3 A0 00 01 D3 A1 00 01 D3 A2 00 01 D3 A3 00 01 D3 A4 00 01 D3 A5 00 01 D3 A6 00 01 D3 A7 00 01 D3 A8 00 01 D3 A9 00 01 D3 AA 00 01 D3 AB 00 01 D3 AC 00 01 D3 AD 00 01 D3 AE 00 01 D3 AF 00 01 D3 B0 00 01 D3 B1 00 01 D3 B2 00 01 D3 B3 00 01 D3 B4 00 01 D3 B5 00 01 D3 B6 00 01 D3 B7 00 01 D3 B8 00 01 D3 B9 00 01 D3 BA 00 01 D3 BB 00 01 D3 BC 00 01 D3 BD 00 01 D3 BE 00 01 D3 BF 00 01 D3 C0 00 01 D3 C1 00 01 D3 C2 00 01 D3 C3 00 01 D3 C4 00 01 D3 C5 00 01 D3 C6 00 01 D3 C7 00 01 D3 C8 00 01 D3 C9 00 01 D3 CA 00 01 D3 CB 00 01 D3 CC 00 01 D3 CD 00 01 D3 CE 00 01 D3 CF 00 01 D3 D0 00 01 D3 D1 00 01 D3 D2 00 01 D3 D3 00 01 D3 D4 00 01 D3 D5 00 01 D3 D6 00 01 D3 D7 00 01 D3 D8 00 01 D3 D9 00 01 D3 DA 00 01 D3 DB 00 01 D3 DC 00 01 D3 DD 00 01 D3 DE 00 01 D3 DF 00 01 D3 E0 00 01 D3 E1 00 01 D3 E2 00 01 D3 E3 00 01 D3 E4 00 01 D3 E5 00 01 D3 E6 00 01 D3 E7 00 01 D3 E8 00 01 D3 E9 00 01 D3 EA 00 01 D3 EB 00 01 D3 EC 00 01 D3 ED 00 01 D3 EE 00 01 D3 EF 00 01 D3 F0 00 01 D3 F1 00 01 D3 F2 00 01 D3 F3 00 01 D3 F4 00 01 D3 F5 00 01 D3 F6 00 01 D3 F7 00 01 D3 F8 00 01 D3 F9 00 01 D3 FA 00 01 D3 FB 00 01 D3 FC 00 01 D3 FD 00 01 D3 FE 00 01 D3 FF 00 01 D4 00 00 01 D4 01 00 01 D4 02 00 01 D4 03 00 01 D4 04 00 01 D4 05 00 01 D4 06 00 01 D4 07 00 01 D4 08 00 01 D4 09 00 01 D4 0A 00 01 D4 0B 00 01 D4 0C 00 01 D4 0D 00 01 D4 0E 00 01 D4 0F 00 01 D4 10 00 01 D4 11 00 01 D4 12 00 01 D4 13 00 01 D4 14 00 01 D4 15 00 01 D4 16 00 01 D4 17 00 01 D4 18 00 01 D4 19 00 01 D4 1A 00 01 D4 1B 00 01 D4 1C 00 01 D4 1D 00 01 D4 1E 00 01 D4 1F 00 01 D4 20 00 01 D4 21 00 01 D4 22 00 01 D4 23 00 01 D4 24 00 01 D4 25 00 01 D4 26 00 01 D4 27 00 01 D4 28 00 01 D4 29 00 01 D4 2A 00 01 D4 2B 00 01 D4 2C 00 01 D4 2D 00 01 D4 2E 00 01 D4 2F 00 01 D4 30 00 01 D4 31 00 01 D4 32 00 01 D4 33 00 01 D4 34 00 01 D4 35 00 01 D4 36 00 01 D4 37 00 01 D4 38 00 01 D4 39 00 01 D4 3A 00 01 D4 3B 00 01 D4 3C 00 01 D4 3D 00 01 D4 3E 00 01 D4 3F 00 01 D4 40 00 01 D4 41 00 01 D4 42 00 01 D4 43 00 01 D4 44 00 01 D4 45 00 01 D4 46 00 01 D4 47 00 01 D4 48 00 01 D4 49 00 01 D4 4A 00 01 D4 4B 00 01 D4 4C 00 01 D4 4D 00 01 D4 4E 00 01 D4 4F 00 01 D4 50 00 01 D4 51 00 01 D4 52 00 01 D4 53 00 01 D4 54 00 01 D4 55 00 01 D4 56 00 01 D4 57 00 01 D4 58 00 01 D4 59 00 01 D4 5A 00 01 D4 5B 00 01 D4 5C 00 01 D4 5D 00 01 D4 5E 00 01 D4 5F 00 01 D4 60 00 01 D4 61 00 01 D4 62 00 01 D4 63 00 01 D4 64 00 01 D4 65 00 01 D4 66 00 01 D4 67 00 01 D4 68 00 01 D4 69 00 01 D4 6A 00 01 D4 6B 00 01 D4 6C 00 01 D4 6D 00 01 D4 6E 00 01 D4 6F 00 01 D4 70 00 01 D4 71 00 01 D4 72 00 01 D4 73 00 01 D4 74 00 01 D4 75 00 01 D4 76 00 01 D4 77 00 01 D4 78 00 01 D4 79 00 01 D4 7A 00 01 D4 7B 00 01 D4 7C 00 01 D4 7D 00 01 D4 7E 00 01 D4 7F 00 01 D4 80 00 01 D4 81 00 01 D4 82 00 01 D4 83 00 01 D4 84 00 01 D4 85 00 01 D4 86 00 01 D4 87 00 01 D4 88 00 01 D4 89 00 01 D4 8A 00 01 D4 8B 00 01 D4 8C 00 01 D4 8D 00 01 D4 8E 00 01 D4 8F 00 01 D4 90 00 01 D4 91 00 01 D4 92 00 01 D4 93 00 01 D4 94 00 01 D4 95 00 01 D4 96 00 01 D4 97 00 01 D4 98 00 01 D4 99 00 01 D4 9A 00 01 D4 9B 00 01 D4 9C 00 01 D4 9D 00 01 D4 9E 00 01 D4 9F 00 01 D4 A0 00 01 D4 A1 00 01 D4 A2 00 01 D4 A3 00 01 D4 A4 00 01 D4 A5 00 01 D4 A6 00 01 D4 A7 00 01 D4 A8 00 01 D4 A9 00 01 D4 AA 00 01 D4 AB 00 01 D4 AC 00 01 D4 AD 00 01 D4 AE 00 01 D4 AF 00 01 DC 09 0F 0F DC 11 0F FF DC 19 0F 00 DC 21 00 FF DC 29 00 0F DE 00 00 00 DE 01 00 02 DE 00 00 00 DE 01 00 00 FF FF FF FF
+8639453-8906111 SPI: MOSI transfer: DE 00 00 00 DE 01 00 00 FF FF FF FF
+8906229-9172882 SPI: MOSI transfer: D8 20 04 00 D8 21 15 10 D8 22 08 00 D8 23 11 0E D8 24 AC 00 D8 25 0E 4C D8 26 70 00 D8 27 0D AC D8 28 34 00 D8 29 0F 4D DE 00 00 00 DE 01 00 00 FF FF FF FF
+9173000-9439659 SPI: MOSI transfer: D8 20 A4 00 D8 21 15 B0 D8 22 C8 00 D8 23 11 CE D8 24 0C 00 D8 25 0E AD D8 26 70 00 D8 27 0D AC D8 28 D4 00 D8 29 0E EC DE 00 00 00 DE 01 00 00 FF FF FF FF
+9439776-9706431 SPI: MOSI transfer: D8 20 64 00 D8 21 16 71 D8 22 88 00 D8 23 12 6F D8 24 8C 00 D8 25 0F 0D D8 26 90 00 D8 27 0D AC D8 28 94 00 D8 29 0E 8C DE 00 00 00 DE 01 00 00 FF FF FF FF
+9706549-9973203 SPI: MOSI transfer: D8 20 04 00 D8 21 17 32 D8 22 28 00 D8 23 13 30 D8 24 2C 00 D8 25 0F 8E D8 26 D0 00 D8 27 0D AC D8 28 74 00 D8 29 0E 2C DE 00 00 00 DE 01 00 00 FF FF FF FF
+9973321-10239980 SPI: MOSI transfer: D8 20 A4 00 D8 21 17 F2 D8 22 C8 00 D8 23 13 F0 D8 24 EC 00 D8 25 10 0E D8 26 30 00 D8 27 0D ED D8 28 74 00 D8 29 0D EC DE 00 00 00 DE 01 00 00 FF FF FF FF
+10240098-10506753 SPI: MOSI transfer: D8 20 24 00 D8 21 18 93 D8 22 88 00 D8 23 14 B1 D8 24 AC 00 D8 25 10 AF D8 26 B0 00 D8 27 0E 2D D8 28 94 00 D8 29 0D CC DE 00 01 00 DE 01 00 00 FF FF FF FF
+10506871-10773527 SPI: MOSI transfer: D8 20 64 00 D8 21 19 33 D8 22 28 00 D8 23 15 52 D8 24 4C 00 D8 25 11 50 D8 26 50 00 D8 27 0E 6E D8 28 D4 00 D8 29 0D AC DE 00 01 00 DE 01 00 00 FF FF FF FF
+10773645-11040282 SPI: MOSI transfer: D8 20 A4 00 D8 21 19 D3 D8 22 C8 00 D8 23 15 F2 D8 24 EC 00 D8 25 11 F0 D8 26 10 00 D8 27 0E CF D8 28 54 00 D8 29 0D AD DE 00 01 00 DE 01 00 00 FF FF FF FF
+11040399-11307072 SPI: MOSI transfer: D8 20 A4 00 D8 21 1A 73 D8 22 28 00 D8 23 16 B3 D8 24 AC 00 D8 25 12 B1 D8 26 D0 00 D8 27 0F 4F D8 28 D4 00 D8 29 0D AD DE 00 01 00 DE 01 00 00 FF FF FF FF
+11307190-11573847 SPI: MOSI transfer: D8 20 A4 00 D8 21 1A D3 D8 22 88 00 D8 23 17 73 D8 24 4C 00 D8 25 13 72 D8 26 70 00 D8 27 0F B0 D8 28 74 00 D8 29 0D CE DE 00 01 00 DE 01 00 00 FF FF FF FF
+11573965-11840620 SPI: MOSI transfer: D8 20 64 00 D8 21 1B 53 D8 22 A8 00 D8 23 18 33 D8 24 CC 00 D8 25 14 32 D8 26 10 00 D8 27 10 51 D8 28 34 00 D8 29 0D EF DE 00 02 00 DE 01 00 00 FF FF FF FF
+11840737-12107394 SPI: MOSI transfer: D8 20 04 00 D8 21 1B B3 D8 22 A8 00 D8 23 18 D3 D8 24 4C 00 D8 25 14 F3 D8 26 D0 00 D8 27 10 F1 D8 28 F4 00 D8 29 0E 2F DE 00 02 00 DE 01 00 00 FF FF FF FF
+12107512-12374166 SPI: MOSI transfer: D8 20 84 00 D8 21 1B F2 D8 22 88 00 D8 23 19 73 D8 24 8C 00 D8 25 15 93 D8 26 70 00 D8 27 11 92 D8 28 94 00 D8 29 0E 90 DE 00 02 00 DE 01 00 00 FF FF FF FF
+12374284-12640943 SPI: MOSI transfer: D8 20 E4 00 D8 21 1C 31 D8 22 48 00 D8 23 1A 13 D8 24 AC 00 D8 25 16 33 D8 26 F0 00 D8 27 12 32 D8 28 34 00 D8 29 0E F1 DE 00 02 00 DE 01 00 00 FF FF FF FF
+12641060-12907716 SPI: MOSI transfer: D8 20 44 00 D8 21 1C 71 D8 22 E8 00 D8 23 1A 92 D8 24 AC 00 D8 25 16 F3 D8 26 50 00 D8 27 12 F3 D8 28 F4 00 D8 29 0F 71 DE 00 02 00 DE 01 00 00 FF FF FF FF
+12907834-13174488 SPI: MOSI transfer: D8 20 84 00 D8 21 1C 70 D8 22 68 00 D8 23 1B 12 D8 24 8C 00 D8 25 17 B3 D8 26 90 00 D8 27 13 B3 D8 28 94 00 D8 29 0F F2 DE 00 03 00 DE 01 00 00 FF FF FF FF
+13174605-13441264 SPI: MOSI transfer: D8 20 E4 00 D8 21 1C 6F D8 22 C8 00 D8 23 1B 71 D8 24 4C 00 D8 25 18 73 D8 26 B0 00 D8 27 14 73 D8 28 14 00 D8 29 10 73 DE 00 03 00 DE 01 00 00 FF FF FF FF
+13441381-13708037 SPI: MOSI transfer: D8 20 24 00 D8 21 1C 6F D8 22 28 00 D8 23 1B D1 D8 24 EC 00 D8 25 19 12 D8 26 B0 00 D8 27 15 13 D8 28 74 00 D8 29 11 13 DE 00 03 00 DE 01 00 00 FF FF FF FF
+13708155-13974809 SPI: MOSI transfer: D8 20 64 00 D8 21 1C 4E D8 22 68 00 D8 23 1C 10 D8 24 4C 00 D8 25 19 B2 D8 26 90 00 D8 27 15 D3 D8 28 B4 00 D8 29 11 D3 DE 00 03 00 DE 01 00 00 FF FF FF FF
+13974927-14241584 SPI: MOSI transfer: D8 20 C4 00 D8 21 1C 0D D8 22 C8 00 D8 23 1C 4F D8 24 AC 00 D8 25 1A 31 D8 26 30 00 D8 27 16 73 D8 28 B4 00 D8 29 12 73 DE 00 03 00 DE 01 00 00 FF FF FF FF
+14241702-14508357 SPI: MOSI transfer: D8 20 44 00 D8 21 1B CD D8 22 08 00 D8 23 1C 6F D8 24 0C 00 D8 25 1A B1 D8 26 D0 00 D8 27 17 32 D8 28 B4 00 D8 29 13 33 DE 00 04 01 DE 01 00 00 FF FF FF FF
+14508475-14775129 SPI: MOSI transfer: D8 20 C4 00 D8 21 1B 6C D8 22 48 00 D8 23 1C 6E D8 24 4C 00 D8 25 1B 30 D8 26 30 00 D8 27 17 F2 D8 28 94 00 D8 29 13 F3 DE 00 04 01 DE 01 00 00 FF FF FF FF
+14775247-15041903 SPI: MOSI transfer: D8 20 84 00 D8 21 1B 0C D8 22 A8 00 D8 23 1C 6D D8 24 AC 00 D8 25 1B 8F D8 26 90 00 D8 27 18 91 D8 28 34 00 D8 29 14 B3 DE 00 04 01 DE 01 00 00 FF FF FF FF
+15042020-15308677 SPI: MOSI transfer: D8 20 64 00 D8 21 1A 8C D8 22 28 00 D8 23 1C 6D D8 24 EC 00 D8 25 1B EE D8 26 F0 00 D8 27 19 30 D8 28 B4 00 D8 29 15 52 DE 00 04 01 DE 01 00 00 FF FF FF FF
+15308794-15575453 SPI: MOSI transfer: D8 20 64 00 D8 21 1A 0C D8 22 C8 00 D8 23 1C 2C D8 24 2C 00 D8 25 1C 2E D8 26 30 00 D8 27 19 D0 D8 28 34 00 D8 29 16 12 DE 00 04 01 DE 01 00 00 FF FF FF FF
+15575571-15842225 SPI: MOSI transfer: D8 20 84 00 D8 21 19 6C D8 22 88 00 D8 23 1C 0C D8 24 AC 00 D8 25 1C 4D D8 26 90 00 D8 27 1A 6F D8 28 74 00 D8 29 16 B1 DE 00 05 01 DE 01 00 00 FF FF FF FF
+15842343-16108998 SPI: MOSI transfer: D8 20 C4 00 D8 21 18 CC D8 22 68 00 D8 23 1B AC D8 24 2C 00 D8 25 1C 6D D8 26 D0 00 D8 27 1A EE D8 28 D4 00 D8 29 17 70 DE 00 05 01 DE 01 00 00 FF FF FF FF
+16109115-16375773 SPI: MOSI transfer: D8 20 24 00 D8 21 18 2D D8 22 68 00 D8 23 1B 4C D8 24 AC 00 D8 25 1C 6C D8 26 30 00 D8 27 1B 4E D8 28 14 00 D8 29 18 30 DE 00 05 01 DE 01 00 00 FF FF FF FF
+16375890-16642546 SPI: MOSI transfer: D8 20 C4 00 D8 21 17 8D D8 22 88 00 D8 23 1A EC D8 24 6C 00 D8 25 1C 6C D8 26 90 00 D8 27 1B AD D8 28 74 00 D8 29 18 CF DE 00 05 01 DE 01 00 00 FF FF FF FF
+16642663-16909318 SPI: MOSI transfer: D8 20 64 00 D8 21 16 CE D8 22 C8 00 D8 23 1A 6C D8 24 6C 00 D8 25 1C 4C D8 26 10 00 D8 27 1B ED D8 28 B4 00 D8 29 19 6E DE 00 05 01 DE 01 00 00 FF FF FF FF
+16909436-17176093 SPI: MOSI transfer: D8 20 04 00 D8 21 16 0F D8 22 48 00 D8 23 19 ED D8 24 6C 00 D8 25 1C 2C D8 26 B0 00 D8 27 1C 2C D8 28 14 00 D8 29 1A 0E DE 00 06 01 DE 01 00 00 FF FF FF FF
+17176211-17442866 SPI: MOSI transfer: D8 20 C4 00 D8 21 15 4F D8 22 C8 00 D8 23 19 4D D8 24 8C 00 D8 25 1B EC D8 26 70 00 D8 27 1C 6C D8 28 74 00 D8 29 1A 8D DE 00 06 01 DE 01 00 00 FF FF FF FF
+17442984-17709643 SPI: MOSI transfer: D8 20 64 00 D8 21 14 B0 D8 22 68 00 D8 23 18 AE D8 24 EC 00 D8 25 1B 8C D8 26 70 00 D8 27 1C 6C D8 28 F4 00 D8 29 1B 0C DE 00 06 01 DE 01 00 00 FF FF FF FF
+17709760-17976412 SPI: MOSI transfer: D8 20 24 00 D8 21 13 F1 D8 22 28 00 D8 23 17 EF D8 24 6C 00 D8 25 1B 2D D8 26 70 00 D8 27 1C 6C D8 28 B4 00 D8 29 1B 6C DE 00 06 01 DE 01 00 00 FF FF FF FF
+17976530-18243186 SPI: MOSI transfer: D8 20 C4 00 D8 21 13 31 D8 22 E8 00 D8 23 17 4F D8 24 EC 00 D8 25 1A CD D8 26 B0 00 D8 27 1C 6C D8 28 74 00 D8 29 1B CC DE 00 06 01 DE 01 00 00 FF FF FF FF
+18243304-18509961 SPI: MOSI transfer: D8 20 64 00 D8 21 12 72 D8 22 88 00 D8 23 16 90 D8 24 8C 00 D8 25 1A 2E D8 26 10 00 D8 27 1C 4D D8 28 74 00 D8 29 1C 0C DE 00 07 01 DE 01 00 00 FF FF FF FF
+18510079-18776735 SPI: MOSI transfer: D8 20 E4 00 D8 21 11 D2 D8 22 48 00 D8 23 15 D1 D8 24 4C 00 D8 25 19 AF D8 26 70 00 D8 27 1C 0D D8 28 74 00 D8 29 1C 4C DE 00 07 01 DE 01 00 00 FF FF FF FF
+18776852-19043508 SPI: MOSI transfer: D8 20 44 00 D8 21 11 33 D8 22 E8 00 D8 23 15 11 D8 24 0C 00 D8 25 19 10 D8 26 10 00 D8 27 1B CE D8 28 B4 00 D8 29 1C 6C DE 00 07 01 DE 01 00 00 FF FF FF FF
+19043625-19310282 SPI: MOSI transfer: D8 20 A4 00 D8 21 10 93 D8 22 88 00 D8 23 14 72 D8 24 AC 00 D8 25 18 70 D8 26 B0 00 D8 27 1B 6E D8 28 14 00 D8 29 1C 6D DE 00 07 01 DE 01 00 00 FF FF FF FF
+19310400-19577058 SPI: MOSI transfer: D8 20 A4 00 D8 21 0F F3 D8 22 08 00 D8 23 13 B3 D8 24 6C 00 D8 25 17 B1 D8 26 70 00 D8 27 1B 0F D8 28 94 00 D8 29 1C 6D DE 00 07 01 DE 01 00 00 FF FF FF FF
+19577175-19843829 SPI: MOSI transfer: D8 20 A4 00 D8 21 0F 73 D8 22 68 00 D8 23 12 F3 D8 24 0C 00 D8 25 17 12 D8 26 10 00 D8 27 1A 90 D8 28 34 00 D8 29 1C 6E DE 00 08 02 DE 01 00 00 FF FF FF FF
+19843947-20110605 SPI: MOSI transfer: D8 20 84 00 D8 21 0E F3 D8 22 A8 00 D8 23 12 53 D8 24 AC 00 D8 25 16 52 D8 26 D0 00 D8 27 1A 10 D8 28 D4 00 D8 29 1C 2E DE 00 08 02 DE 01 00 00 FF FF FF FF
+20110723-20377377 SPI: MOSI transfer: D8 20 24 00 D8 21 0E 93 D8 22 A8 00 D8 23 11 93 D8 24 0C 00 D8 25 15 93 D8 26 90 00 D8 27 19 71 D8 28 94 00 D8 29 1C 0F DE 00 08 02 DE 01 00 00 FF FF FF FF
+20377495-20644152 SPI: MOSI transfer: D8 20 C4 00 D8 21 0E 52 D8 22 A8 00 D8 23 10 F3 D8 24 6C 00 D8 25 14 F3 D8 26 30 00 D8 27 18 D2 D8 28 34 00 D8 29 1B B0 DE 00 08 02 DE 01 00 00 FF FF FF FF
+20644269-20910925 SPI: MOSI transfer: D8 20 24 00 D8 21 0D F2 D8 22 68 00 D8 23 10 53 D8 24 AC 00 D8 25 14 33 D8 26 B0 00 D8 27 18 32 D8 28 F4 00 D8 29 1B 50 DE 00 08 02 DE 01 00 00 FF FF FF FF
+20911043-21177700 SPI: MOSI transfer: D8 20 84 00 D8 21 0D D1 D8 22 28 00 D8 23 0F D3 D8 24 AC 00 D8 25 13 73 D8 26 30 00 D8 27 17 93 D8 28 B4 00 D8 29 1A F1 DE 00 09 02 DE 01 00 00 FF FF FF FF
+21177818-21444472 SPI: MOSI transfer: D8 20 C4 00 D8 21 0D B0 D8 22 A8 00 D8 23 0F 52 D8 24 AC 00 D8 25 12 B3 D8 26 90 00 D8 27 16 D3 D8 28 54 00 D8 29 1A 72 DE 00 09 02 DE 01 00 00 FF FF FF FF
+21444590-21711247 SPI: MOSI transfer: D8 20 04 00 D8 21 0D B0 D8 22 08 00 D8 23 0E D2 D8 24 6C 00 D8 25 12 13 D8 26 B0 00 D8 27 16 13 D8 28 D4 00 D8 29 19 D2 DE 00 09 02 DE 01 00 00 FF FF FF FF
+21711365-21978018 SPI: MOSI transfer: D8 20 64 00 D8 21 0D AF D8 22 68 00 D8 23 0E 71 D8 24 0C 00 D8 25 11 53 D8 26 B0 00 D8 27 15 53 D8 28 54 00 D8 29 19 53 DE 00 09 02 DE 01 00 00 FF FF FF FF
+21978136-22244793 SPI: MOSI transfer: D8 20 C4 00 D8 21 0D CE D8 22 A8 00 D8 23 0E 30 D8 24 8C 00 D8 25 10 B2 D8 26 B0 00 D8 27 14 B3 D8 28 94 00 D8 29 18 B3 DE 00 09 02 DE 01 00 00 FF FF FF FF
+22244910-22511566 SPI: MOSI transfer: D8 20 04 00 D8 21 0D EE D8 22 08 00 D8 23 0D F0 D8 24 EC 00 D8 25 10 31 D8 26 70 00 D8 27 13 F3 D8 28 B4 00 D8 29 17 F3 DE 00 0A 02 DE 01 00 00 FF FF FF FF
+22511684-22778338 SPI: MOSI transfer: D8 20 84 00 D8 21 0E 2D D8 22 48 00 D8 23 0D AF D8 24 4C 00 D8 25 0F 91 D8 26 F0 00 D8 27 13 32 D8 28 B4 00 D8 29 17 53 DE 00 0A 02 DE 01 00 00 FF FF FF FF
+22778456-23045115 SPI: MOSI transfer: D8 20 04 00 D8 21 0E 6D D8 22 A8 00 D8 23 0D AE D8 24 8C 00 D8 25 0F 30 D8 26 70 00 D8 27 12 72 D8 28 94 00 D8 29 16 93 DE 00 0A 02 DE 01 00 00 FF FF FF FF
+23045232-23311890 SPI: MOSI transfer: D8 20 A4 00 D8 21 0E EC D8 22 E8 00 D8 23 0D AD D8 24 EC 00 D8 25 0E AF D8 26 F0 00 D8 27 11 D1 D8 28 54 00 D8 29 15 D3 DE 00 0A 02 DE 01 00 00 FF FF FF FF
+23312007-23578663 SPI: MOSI transfer: D8 20 64 00 D8 21 0F 4C D8 22 68 00 D8 23 0D AD D8 24 2C 00 D8 25 0E 4F D8 26 30 00 D8 27 11 31 D8 28 F4 00 D8 29 15 12 DE 00 0A 02 DE 01 00 00 FF FF FF FF
+23578781-23845435 SPI: MOSI transfer: D8 20 64 00 D8 21 0F CC D8 22 E8 00 D8 23 0D CC D8 24 8C 00 D8 25 0E 0E D8 26 70 00 D8 27 10 90 D8 28 74 00 D8 29 14 72 DE 00 0B 02 DE 01 00 00 FF FF FF FF
+23845552-24112209 SPI: MOSI transfer: D8 20 64 00 D8 21 10 6C D8 22 88 00 D8 23 0E 0C D8 24 EC 00 D8 25 0D CD D8 26 D0 00 D8 27 0F EF D8 28 D4 00 D8 29 13 B1 DE 00 0B 02 DE 01 00 00 FF FF FF FF
+24112327-24378982 SPI: MOSI transfer: D8 20 A4 00 D8 21 10 EC D8 22 68 00 D8 23 0E 4C D8 24 4C 00 D8 25 0D AD D8 26 10 00 D8 27 0F 6F D8 28 14 00 D8 29 12 F1 DE 00 0B 02 DE 01 00 00 FF FF FF FF
+24379099-24645757 SPI: MOSI transfer: D8 20 04 00 D8 21 11 AD D8 22 68 00 D8 23 0E 8C D8 24 EC 00 D8 25 0D AC D8 26 70 00 D8 27 0E EE D8 28 54 00 D8 29 12 50 DE 00 0B 02 DE 01 00 00 FF FF FF FF
+24645874-24912529 SPI: MOSI transfer: D8 20 84 00 D8 21 12 4D D8 22 68 00 D8 23 0F 0C D8 24 8C 00 D8 25 0D AC D8 26 D0 00 D8 27 0E 8D D8 28 B4 00 D8 29 11 8F DE 00 0B 02 DE 01 00 00 FF FF FF FF
+24912647-25179305 SPI: MOSI transfer: D8 20 04 00 D8 21 13 0E D8 22 A8 00 D8 23 0F 6C D8 24 6C 00 D8 25 0D AC D8 26 30 00 D8 27 0E 4D D8 28 F4 00 D8 29 10 EE DE 00 0C 03 DE 01 00 00 FF FF FF FF
+25179422-25446077 SPI: MOSI transfer: D8 20 C4 00 D8 21 13 CE D8 22 08 00 D8 23 10 0D D8 24 6C 00 D8 25 0D CC D8 26 D0 00 D8 27 0D EC D8 28 54 00 D8 29 10 4E DE 00 0C 03 DE 01 00 00 FF FF FF FF
+25446195-25712849 SPI: MOSI transfer: D8 20 84 00 D8 21 14 8F D8 22 88 00 D8 23 10 8D D8 24 8C 00 D8 25 0E 0C D8 26 90 00 D8 27 0D CC D8 28 B4 00 D8 29 0F CD DE 00 0C 03 DE 01 00 00 FF FF FF FF
+25712966-25979625 SPI: MOSI transfer: D8 20 24 00 D8 21 15 30 D8 22 28 00 D8 23 11 2E D8 24 CC 00 D8 25 0E 6C D8 26 70 00 D8 27 0D AC D8 28 34 00 D8 29 0F 4D DE 00 0C 03 DE 01 00 00 FF FF FF FF
+25979743-26246397 SPI: MOSI transfer: D8 20 C4 00 D8 21 15 D0 D8 22 E8 00 D8 23 11 CE D8 24 2C 00 D8 25 0E CD D8 26 70 00 D8 27 0D AC D8 28 D4 00 D8 29 0E CC DE 00 0C 03 DE 01 00 00 FF FF FF FF
+26246514-26513173 SPI: MOSI transfer: D8 20 84 00 D8 21 16 91 D8 22 A8 00 D8 23 12 8F D8 24 AC 00 D8 25 0F 2D D8 26 90 00 D8 27 0D AC D8 28 94 00 D8 29 0E 6C DE 00 0D 03 DE 01 00 00 FF FF FF FF
+26513290-26779944 SPI: MOSI transfer: D8 20 24 00 D8 21 17 52 D8 22 48 00 D8 23 13 50 D8 24 4C 00 D8 25 0F AE D8 26 D0 00 D8 27 0D CC D8 28 74 00 D8 29 0E 2C DE 00 0D 03 DE 01 00 00 FF FF FF FF
+26780062-27046717 SPI: MOSI transfer: D8 20 C4 00 D8 21 18 12 D8 22 E8 00 D8 23 14 10 D8 24 0C 00 D8 25 10 2F D8 26 50 00 D8 27 0D ED D8 28 74 00 D8 29 0D EC DE 00 0D 03 DE 01 00 00 FF FF FF FF
+27046834-27313491 SPI: MOSI transfer: D8 20 24 00 D8 21 18 B3 D8 22 A8 00 D8 23 14 D1 D8 24 CC 00 D8 25 10 CF D8 26 D0 00 D8 27 0E 2D D8 28 94 00 D8 29 0D AC DE 00 0D 03 DE 01 00 00 FF FF FF FF
+27313608-27580265 SPI: MOSI transfer: D8 20 84 00 D8 21 19 53 D8 22 48 00 D8 23 15 72 D8 24 6C 00 D8 25 11 70 D8 26 70 00 D8 27 0E 8E D8 28 F4 00 D8 29 0D AC DE 00 0D 03 DE 01 00 00 FF FF FF FF
+27580383-27847039 SPI: MOSI transfer: D8 20 A4 00 D8 21 19 F3 D8 22 C8 00 D8 23 16 12 D8 24 0C 00 D8 25 12 11 D8 26 30 00 D8 27 0E EF D8 28 54 00 D8 29 0D AD DE 00 0E 03 DE 01 00 00 FF FF FF FF
+27847157-28113815 SPI: MOSI transfer: D8 20 A4 00 D8 21 1A 73 D8 22 48 00 D8 23 16 D3 D8 24 CC 00 D8 25 12 D1 D8 26 F0 00 D8 27 0F 4F D8 28 F4 00 D8 29 0D AD DE 00 0E 03 DE 01 00 00 FF FF FF FF
+28113933-28380587 SPI: MOSI transfer: D8 20 84 00 D8 21 1A F3 D8 22 88 00 D8 23 17 93 D8 24 6C 00 D8 25 13 92 D8 26 90 00 D8 27 0F D0 D8 28 94 00 D8 29 0D CE DE 00 0E 03 DE 01 00 00 FF FF FF FF
+28380705-28647360 SPI: MOSI transfer: D8 20 44 00 D8 21 1B 73 D8 22 A8 00 D8 23 18 53 D8 24 EC 00 D8 25 14 52 D8 26 30 00 D8 27 10 71 D8 28 54 00 D8 29 0E 0F DE 00 0E 03 DE 01 00 00 FF FF FF FF
+28647477-28914136 SPI: MOSI transfer: D8 20 E4 00 D8 21 1B B2 D8 22 A8 00 D8 23 18 F3 D8 24 4C 00 D8 25 15 13 D8 26 F0 00 D8 27 11 11 D8 28 14 00 D8 29 0E 50 DE 00 0E 03 DE 01 00 00 FF FF FF FF
+28914253-29180909 SPI: MOSI transfer: D8 20 64 00 D8 21 1C 12 D8 22 88 00 D8 23 19 93 D8 24 8C 00 D8 25 15 B3 D8 26 90 00 D8 27 11 B2 D8 28 B4 00 D8 29 0E 90 DE 00 0F 03 DE 01 00 00 FF FF FF FF
+29181026-29447680 SPI: MOSI transfer: D8 20 C4 00 D8 21 1C 51 D8 22 48 00 D8 23 1A 13 D8 24 AC 00 D8 25 16 53 D8 26 10 00 D8 27 12 53 D8 28 54 00 D8 29 0F 11 DE 00 0F 03 DE 01 00 00 FF FF FF FF
+29447798-29714454 SPI: MOSI transfer: D8 20 24 00 D8 21 1C 71 D8 22 E8 00 D8 23 1A B2 D8 24 AC 00 D8 25 17 13 D8 26 70 00 D8 27 13 13 D8 28 14 00 D8 29 0F 72 DE 00 0F 03 DE 01 00 00 FF FF FF FF
+29714571-29981230 SPI: MOSI transfer: D8 20 64 00 D8 21 1C 70 D8 22 48 00 D8 23 1B 12 D8 24 8C 00 D8 25 17 D3 D8 26 B0 00 D8 27 13 D3 D8 28 94 00 D8 29 10 12 DE 00 0F 03 DE 01 00 00 FF FF FF FF
+29981347-30248001 SPI: MOSI transfer: D8 20 C4 00 D8 21 1C 6F D8 22 A8 00 D8 23 1B 91 D8 24 2C 00 D8 25 18 73 D8 26 B0 00 D8 27 14 93 D8 28 14 00 D8 29 10 93 DE 00 0F 03 DE 01 00 00 FF FF FF FF
diff --git a/test/ppu-stm-integration-demo/data.h b/test/ppu-stm-integration-demo/data.h
index 00665c7..a01974c 100644
--- a/test/ppu-stm-integration-demo/data.h
+++ b/test/ppu-stm-integration-demo/data.h
@@ -6,5 +6,7 @@
// #include "capture-debug-1.h"
// #include "capture-debug-2.h"
// #include "capture-debug-3.h"
-#include "capture-debug-4.h"
+// #include "capture-debug-4.h"
+#include "test-foreground-sprite.h"
+// #include "capture-debug-5.h"
diff --git a/test/ppu-stm-integration-demo/data2pputb.awk b/test/ppu-stm-integration-demo/data2pputb.awk
index db4b53f..b6c277c 100755
--- a/test/ppu-stm-integration-demo/data2pputb.awk
+++ b/test/ppu-stm-integration-demo/data2pputb.awk
@@ -7,7 +7,7 @@ BEGIN {
1 {
printf "\t\tADDR <= x\""$1"\";\n"
printf "\t\tDATA <= x\""$2"\";\n"
- printf "\t\twait for 10 ns;\n"
+ printf "\t\twait for 40 ns;\n"
printf "\n"
}
END {
diff --git a/test/ppu-stm-integration-demo/test-background-color.txt b/test/ppu-stm-integration-demo/test-background-color.txt
index 47ae2c2..ada115f 100644
--- a/test/ppu-stm-integration-demo/test-background-color.txt
+++ b/test/ppu-stm-integration-demo/test-background-color.txt
@@ -1 +1,6 @@
+dc00: 0000
+ffff: ffff
+dc00: 0808
+ffff: ffff
dc00: 0f0f
+ffff: ffff
diff --git a/test/ppu-stm-integration-demo/test-foreground-sprite.png b/test/ppu-stm-integration-demo/test-foreground-sprite.png
new file mode 100644
index 0000000..a2d616f
--- /dev/null
+++ b/test/ppu-stm-integration-demo/test-foreground-sprite.png
Binary files differ
diff --git a/test/ppu-stm-integration-demo/test-foreground-sprite.txt b/test/ppu-stm-integration-demo/test-foreground-sprite.txt
new file mode 100644
index 0000000..789fec2
--- /dev/null
+++ b/test/ppu-stm-integration-demo/test-foreground-sprite.txt
@@ -0,0 +1,56 @@
+0034: 0000
+0035: 1249
+0036: 0001
+0037: 1000
+0038: 1249
+0039: 0249
+003a: 1000
+003b: 1249
+003c: 1249
+003d: 1001
+003e: 1249
+003f: 1249
+0040: 0049
+0041: 1249
+0042: 1249
+0043: 0249
+0044: 1249
+0045: 1249
+0046: 1249
+0047: 1249
+0048: 1249
+0049: 1249
+004a: 1249
+004b: 1249
+004c: 1249
+004d: 1249
+004e: 1249
+004f: 1249
+0050: 1249
+0051: 1249
+0052: 0249
+0053: 1249
+0054: 1249
+0055: 1249
+0056: 1241
+0057: 1241
+0058: 0049
+0059: 1000
+005a: 1201
+005b: 1249
+005c: 1049
+005d: 0009
+005e: 1249
+005f: 1049
+0060: 0009
+0061: 1240
+0062: 1249
+0063: 0009
+0064: 0000
+0065: 1249
+0066: 0001
+0067: 0000
+dc00: 00f0
+dc01: 0f0f
+d820: 0001
+d821: 0202
diff --git a/vhdl_ls.toml b/vhdl_ls.toml
new file mode 100644
index 0000000..c519e5d
--- /dev/null
+++ b/vhdl_ls.toml
@@ -0,0 +1,5 @@
+[libraries]
+work.files = [
+ 'basys3/basys3.srcs/ppu_consts.vhd',
+ 'basys3/basys3.srcs/ppu_pceg_consts.vhd',
+]