aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--atk16.egg-info/PKG-INFO4
-rw-r--r--atk16.egg-info/SOURCES.txt30
-rw-r--r--atk16.egg-info/dependency_links.txt1
-rw-r--r--atk16.egg-info/entry_points.txt3
-rw-r--r--atk16.egg-info/requires.txt1
-rw-r--r--atk16.egg-info/top_level.txt3
-rw-r--r--atk16_emu/emu.py60
-rw-r--r--atk16_emu/memory.py56
-rw-r--r--atk16_emu/peripherals.py56
-rw-r--r--digital_diagrams/atk16_mem.dig422
10 files changed, 324 insertions, 312 deletions
diff --git a/atk16.egg-info/PKG-INFO b/atk16.egg-info/PKG-INFO
deleted file mode 100644
index 193ecdf..0000000
--- a/atk16.egg-info/PKG-INFO
+++ /dev/null
@@ -1,4 +0,0 @@
-Metadata-Version: 2.1
-Name: atk16
-Version: 0.1
-Requires-Dist: getch>=1.0
diff --git a/atk16.egg-info/SOURCES.txt b/atk16.egg-info/SOURCES.txt
deleted file mode 100644
index 069ea3e..0000000
--- a/atk16.egg-info/SOURCES.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-setup.py
-atk16.egg-info/PKG-INFO
-atk16.egg-info/SOURCES.txt
-atk16.egg-info/dependency_links.txt
-atk16.egg-info/entry_points.txt
-atk16.egg-info/requires.txt
-atk16.egg-info/top_level.txt
-atk16_asm/__init__.py
-atk16_asm/asm_eval.py
-atk16_asm/asm_ops.py
-atk16_asm/asm_pass0.py
-atk16_asm/asm_pass1.py
-atk16_asm/asm_pass2.py
-atk16_asm/asm_pass3.py
-atk16_asm/asm_pass4.py
-atk16_asm/assembler.py
-atk16_asm/optimizer.py
-atk16_asm/pad_bin.py
-atk16_asm/parser.py
-atk16_asm/tokenizer.py
-atk16_emu/__init__.py
-atk16_emu/cli.py
-atk16_emu/debugger.py
-atk16_emu/emu.py
-atk16_emu/opcodes.py
-atk16_emu/test/__init__.py
-atk16_emu/test/test_opcode_alr.py
-atk16_emu/test/test_opcode_hlt.py
-test/__init__.py
-test/utils.py \ No newline at end of file
diff --git a/atk16.egg-info/dependency_links.txt b/atk16.egg-info/dependency_links.txt
deleted file mode 100644
index 8b13789..0000000
--- a/atk16.egg-info/dependency_links.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/atk16.egg-info/entry_points.txt b/atk16.egg-info/entry_points.txt
deleted file mode 100644
index 543f53b..0000000
--- a/atk16.egg-info/entry_points.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-[console_scripts]
-atk16c = atk16_asm.assembler:main
-atk16emu = atk16_emu.cli:main
diff --git a/atk16.egg-info/requires.txt b/atk16.egg-info/requires.txt
deleted file mode 100644
index 36f298c..0000000
--- a/atk16.egg-info/requires.txt
+++ /dev/null
@@ -1 +0,0 @@
-getch>=1.0
diff --git a/atk16.egg-info/top_level.txt b/atk16.egg-info/top_level.txt
deleted file mode 100644
index b7ba0e4..0000000
--- a/atk16.egg-info/top_level.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-atk16_asm
-atk16_emu
-test
diff --git a/atk16_emu/emu.py b/atk16_emu/emu.py
index 1a08103..90b588d 100644
--- a/atk16_emu/emu.py
+++ b/atk16_emu/emu.py
@@ -1,68 +1,14 @@
import os
os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide"
-import random
+
import sys
from dataclasses import dataclass
from .opcodes import *
+from .memory import *
from .colors import C
from .peripherals import Graphics, DummyGraphics
-class Register:
- def __init__(self, bits: int):
- self.bits = bits
- self.value = random.randint(0, 2 ** bits)
-
- def set_value(self, value: int):
- if value < 0 or value >= 2 ** self.bits:
- raise ValueError(f"Value {value} is out of range for {self.bits}-bit register")
-
- self.value = value
-
-class Counter:
- def __init__(self, bits: int):
- self.bits = bits
- self.value = random.randint(0, 2 ** bits)
-
- def step(self):
- self.value = (self.value + 1) % (2 ** self.bits)
-
- def reset(self):
- self.value = 0
-
-class ROM:
- def __init__(self, addr_bits: int, data_bits: int):
- self.addr_bits = addr_bits
- self.data_bits = data_bits
- self.memory = [random.randint(0, 2 ** data_bits) for _ in range(2 ** addr_bits)]
-
- def read(self, addr: int) -> int:
- if addr < 0 or addr >= 2 ** self.addr_bits:
- raise ValueError(f"Address {addr} is out of range for {self.addr_bits}-bit ROM")
-
- return self.memory[addr]
-
-class RAM:
- def __init__(self, addr_bits: int, data_bits: int):
- self.addr_bits = addr_bits
- self.data_bits = data_bits
- self.memory = [random.randint(0, 2 ** data_bits) for _ in range(2 ** addr_bits)]
-
- def read(self, addr: int) -> int:
- if addr < 0 or addr >= 2 ** self.addr_bits:
- raise ValueError(f"Address {addr} is out of range for {self.addr_bits}-bit RAM")
-
- return self.memory[addr]
-
- def write(self, addr: int, value: int):
- if addr < 0 or addr >= 2 ** self.addr_bits:
- raise ValueError(f"Address {addr} is out of range for {self.addr_bits}-bit RAM")
-
- if value < 0 or value >= 2 ** self.data_bits:
- raise ValueError(f"Value {value} is out of range for {self.data_bits}-bit RAM")
-
- self.memory[addr] = value
-
@dataclass
class ALUFlags:
carry: bool
@@ -259,6 +205,8 @@ class Machine:
self.graphics.activate_tpu()
elif addr == 0xE002 and value == 0b10:
self.graphics.activate_ppu()
+ elif 0xF800 < addr <= 0xFFFF:
+ self.graphics.write(addr, value)
else:
self.ram.write(addr & 0x7FFF, value)
diff --git a/atk16_emu/memory.py b/atk16_emu/memory.py
new file mode 100644
index 0000000..2ce9c85
--- /dev/null
+++ b/atk16_emu/memory.py
@@ -0,0 +1,56 @@
+import random
+
+class Register:
+ def __init__(self, bits: int):
+ self.bits = bits
+ self.value = random.randrange(0, 2 ** bits)
+
+ def set_value(self, value: int):
+ if value < 0 or value >= 2 ** self.bits:
+ raise ValueError(f"Value {value} is out of range for {self.bits}-bit register")
+
+ self.value = value
+
+class Counter:
+ def __init__(self, bits: int):
+ self.bits = bits
+ self.value = random.randrange(0, 2 ** bits)
+
+ def step(self):
+ self.value = (self.value + 1) % (2 ** self.bits)
+
+ def reset(self):
+ self.value = 0
+
+class ROM:
+ def __init__(self, addr_bits: int, data_bits: int):
+ self.addr_bits = addr_bits
+ self.data_bits = data_bits
+ self.memory = [random.randrange(0, 2 ** data_bits) for _ in range(2 ** addr_bits)]
+
+ def read(self, addr: int) -> int:
+ if addr < 0 or addr >= 2 ** self.addr_bits:
+ raise ValueError(f"Address {addr} is out of range for {self.addr_bits}-bit ROM")
+
+ return self.memory[addr]
+
+class RAM:
+ def __init__(self, addr_bits: int, data_bits: int):
+ self.addr_bits = addr_bits
+ self.data_bits = data_bits
+ self.memory = [random.randrange(0, 2 ** data_bits) for _ in range(2 ** addr_bits)]
+
+ def read(self, addr: int) -> int:
+ if addr < 0 or addr >= 2 ** self.addr_bits:
+ raise ValueError(f"Address {addr} is out of range for {self.addr_bits}-bit RAM")
+
+ return self.memory[addr]
+
+ def write(self, addr: int, value: int):
+ if addr < 0 or addr >= 2 ** self.addr_bits:
+ raise ValueError(f"Address {addr} is out of range for {self.addr_bits}-bit RAM")
+
+ if value < 0 or value >= 2 ** self.data_bits:
+ raise ValueError(f"Value {value} is out of range for {self.data_bits}-bit RAM")
+
+ self.memory[addr] = value \ No newline at end of file
diff --git a/atk16_emu/peripherals.py b/atk16_emu/peripherals.py
index dc35e3e..c11bb55 100644
--- a/atk16_emu/peripherals.py
+++ b/atk16_emu/peripherals.py
@@ -1,47 +1,79 @@
import pygame
+import sys
+from .memory import RAM, ROM
class TPU:
def __init__(self):
- self.surface: pygame.Surface | None = None
- self.text_mem = []
+ self.surface = pygame.Surface((320, 240))
+ self.surface.fill((255, 0, 0))
+ self.text_mem = RAM(11, 8)
+ self.char_mem = ROM(11, 8)
+
+ with open("out/charmem.bin", "rb") as f:
+ charmem = f.read()
+ for i in range(len(charmem)):
+ self.char_mem.memory[i] = int(charmem[i]) & 0xFF
def frame(self):
- # TODO
- pass
+ if not self.surface:
+ return
+
+ for cy in range(2 ** 3):
+ for ty in range(2 ** 5):
+ for tx in range(2 ** 6):
+ text_addr = (ty << 6) + tx
+ char_s = self.text_mem.read(text_addr)
+ char_addr = (char_s << 3) + cy
+ char_d = self.char_mem.read(char_addr)
+
+ for cx in range(2 ** 3):
+ sx = (tx << 3) + cx
+ sy = (ty << 3) + cy
+ #print("cy", cy, "ty", ty, "cx", cx, "tx", tx, "text_addr", text_addr, "char_s", char_s, "char_addr", char_addr)
+ pixel_value_bit = (char_d >> cx) & 1
+
+ self.surface.set_at((sx, sy), (255 * pixel_value_bit, 255 * pixel_value_bit, 255))
+
+ def write_char(self, addr: int, char: int):
+ # address: 5 bits y, 6 bits x
+ self.text_mem.write(addr, char)
class Graphics:
def __init__(self):
pygame.init()
pygame.display.init()
- self.surface = None
+ surface_scale = 4
+ self.screen = pygame.display.set_mode((320 * surface_scale, 240 * surface_scale))
self.clock = pygame.time.Clock()
self.tpu = TPU()
self.active_picture_unit: TPU | None = None
def activate_tpu(self):
- if self.active_picture_unit:
- pygame.display.quit()
-
- pygame.display.init()
- self.surface = pygame.display.set_mode((320, 240))
self.active_picture_unit = self.tpu
- self.active_picture_unit.surface = self.surface
def activate_ppu(self):
raise NotImplementedError()
def deactivate(self):
self.active_picture_unit = None
- pygame.display.quit()
def step(self):
if self.active_picture_unit:
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ sys.exit(0)
+
self.active_picture_unit.frame()
+ self.screen.blit(pygame.transform.scale(self.tpu.surface, self.screen.get_size()), (0, 0))
pygame.display.flip()
self.clock.tick(60)
+ def write(self, addr: int, char: int):
+ # take only the lower 11 bits
+ self.tpu.write_char(addr & 0x7FF, char)
+
class DummyGraphics:
def __init__(self):
pass
diff --git a/digital_diagrams/atk16_mem.dig b/digital_diagrams/atk16_mem.dig
index 6ff9810..30579a7 100644
--- a/digital_diagrams/atk16_mem.dig
+++ b/digital_diagrams/atk16_mem.dig
@@ -1,10 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
<circuit>
<version>2</version>
<attributes>
<entry>
<string>romContent</string>
<romList>
- <roms />
+ <roms/>
</romList>
</entry>
<entry>
@@ -34,40 +35,57 @@
</entry>
<entry>
<string>Data</string>
- <data>4014,2e00,1dc0,6026,8000,8000,8000,8000,8000,8000,8000,8000,8000,8000,8000,8000,001b,001a,001a,001a,8000,e000,e001,e002,e800,f800,f000,31c0,1fc8,31c8,1fc8,4016,2000,2000,4215,2240,3040,1fc9,23c0,1fc9,21c0,e000,4017,2000,4200,3008,600d,0008,0000,0001,0002,0017,0019,9000,0100,0031,0061,0062,0063,0032,402f,2000,0fc0,4433,2480,31d0,1fc8,1fc9,25c0,2480,31d0,1fc8,1fc9,21c0,4200,0270,3040,4434,2480,31d0,1fc8,1fc9,25c0,2480,31d0,1fc8,1fc9,21c0,4201,0270,3040,4000,0180,2000,31c0,1fc8,4031,2000,31c0,1fc8,1fc9,23c0,1fc9,21c0,3008,4000,31c0,1fc8,1fc9,21c0,4035,2000,31c0,1fc8,4000,31c0,1fc8,1fc9,23c0,1fc9,21c0,0008,31c0,1fc8,4037,2000,31c0,1fc8,1fc9,23c0,1fc9,21c0,3008,4000,31c0,1fc8,1fc9,21c0,4035,2000,31c0,1fc8,4001,31c0,1fc8,1fc9,23c0,1fc9,21c0,0008,31c0,1fc8,4038,2000,31c0,1fc8,1fc9,23c0,1fc9,21c0,3008,4000,31c0,1fc8,1fc9,21c0,4035,2000,31c0,1fc8,4002,31c0,1fc8,1fc9,23c0,1fc9,21c0,0008,31c0,1fc8,4039,2000,31c0,1fc8,1fc9,23c0,1fc9,21c0,3008,4000,31c0,1fc8,1fc9,21c0,4035,2000,31c0,1fc8,4003,31c0,1fc8,1fc9,23c0,1fc9,21c0,0008,31c0,1fc8,403a,2000,31c0,1fc8,1fc9,23c0,1fc9,21c0,3008,4000,31c0,1fc8,1fc9,21c0,4035,2000,31c0,1fc8,4004,31c0,1fc8,1fc9,23c0,1fc9,21c0,0008,31c0,1fc8,403b,2000,31c0,1fc8,1fc9,23c0,1fc9,21c0,3008,4000,31c0,1fc8,1fc9,21c0,4035,2000,31c0,1fc8,4005,31c0,1fc8,1fc9,23c0,1fc9,21c0,0008,31c0,1fc8,4000,31c0,1fc8,1fc9,23c0,1fc9,21c0,3008,4000,31c0,1fc8,1fc9,21c0,4435,2480,31d0,1fc8,1fc9,21c0,4202,0270,3040,4400,31d0,1fc8,1fc9,21c0,4203,0270,3040,4402,0590,2480,31d0,1fc8,1fc9,25c0,2480,31d0,1fc8,1fc9,21c0,4204,0270,3040,4400,31d0,1fc8,1fc9,21c0,4205,0270,3040,4201,31c8,1fc8,1fc9,21c0,1000,8451,4435,2480,31d0,1fc8,4403,0590,2480,31d0,1fc8,1fc9,27c0,1fc9,25c0,0498,31d0,1fc8,1fc9,21c0,4206,0270,3040,4406,0590,2480,31d0,1fc8,1fc9,25c0,2480,31d0,1fc8,1fc9,21c0,4207,0270,3040,4007,0180,2000,31c0,1fc8,4000,31c0,1fc8,1fc9,21c0,1000,8402,6020,6000,4407,0590,2480,31d0,1fc8,1fc9,21c0,4205,0270,3040,4403,0590,2480,31d0,1fc8,4401,31d0,1fc8,1fc9,27c0,1fc9,25c0,0498,31d0,1fc8,1fc9,21c0,4203,0270,3040,61a8,4001,0180,2000,31c0,1fc8,4000,31c0,1fc8,1fc9,23c0,1fc9,21c0,0008,31c0,1fc8,4004,0180,2000,31c0,1fc8,1fc9,23c0,1fc9,21c0,3008,4000,31c0,1fc8,1fc9,21c0,4001,0180,2000,31c0,1fc8,4001,31c0,1fc8,1fc9,23c0,1fc9,21c0,0008,31c0,1fc8,4005,0180,2000,31c0,1fc8,1fc9,23c0,1fc9,21c0,3008,4000,31c0,1fc8,1fc9,21c0,1f80,f000</data>
+ <data>4014,2c00,6019,13*8000,c0,1a,1a,1a,8000,e000,e001,e002,e800,f800
+,4855,f000,4017,2000,4200,3008,6000,6001,f840,4422,2480,4220,3088
+,1488,4248,3088,1488,4245,3088,1488,424c,3088,1488,424c,3088,1488
+,424f,3088,1488,4220,3088,1488,4223,3088,1488,4276,3088,1488,4261
+,3088,1488,4269,3088,1488,426e,3088,1488,4263,3088,1488,426f,3088
+,1488,426f,3088,1488,4264,3088,1488,4269,3088,1488,426a,3088,1488
+,4275,3088,1488,4274,3088,1488,4275,3088,1488,4274,3088,1488,14b5
+,1488,14b7,4220,3088,1488,42bb,3088,1488,42bb,3088,1488,42bb,3088
+,1488,42bb,3088,1488,4220,3088,1488,4242,3088,1488,4259,3088,1488
+,4220,3088,1488,4240,3088,1488,426b,3088,1488,4261,3088,1488,426c
+,3088,1488,425f,3088,1488,426a,3088,1488,4261,3088,1488,426e,3088
+,1488,4220,3088,1488,42bb,3088,1488,42bb,3088,1488,42bb,3088,1488
+,42bb,3088,1488,14b5,1488,14b7,14b5,1488,14b7,4220,3088,1488,423e
+,3088,1488,4220,3088,1488,4017,2000,4201,3008,61ff,3140,1b48,3148
+,1b48,3158,1b48,4016,2000,2000,4215,2240,1600,16e9,16e9,8407,1600
+,16e9,16d9,8410,3080,1488,6012,14b5,1488,14b7,4220,3088,1488,423e
+,3088,1488,4220,3088,1488,6005,1489,4220,3088,1488,1489,3158,1b48
+,3148,1b48,3140,1b48,e000</data>
</entry>
</elementAttributes>
- <pos x="740" y="100" />
+ <pos x="740" y="100"/>
</visualElement>
<visualElement>
<elementName>Ground</elementName>
<elementAttributes>
<entry>
<string>rotation</string>
- <rotation rotation="1" />
+ <rotation rotation="1"/>
</entry>
</elementAttributes>
- <pos x="720" y="160" />
+ <pos x="720" y="160"/>
</visualElement>
<visualElement>
<elementName>VDD</elementName>
<elementAttributes>
<entry>
<string>rotation</string>
- <rotation rotation="1" />
+ <rotation rotation="1"/>
</entry>
</elementAttributes>
- <pos x="720" y="120" />
+ <pos x="720" y="120"/>
</visualElement>
<visualElement>
<elementName>VDD</elementName>
<elementAttributes>
<entry>
<string>rotation</string>
- <rotation reference="../../../../visualElement[3]/elementAttributes/entry/rotation" />
+ <rotation reference="../../../../visualElement[3]/elementAttributes/entry/rotation"/>
</entry>
</elementAttributes>
- <pos x="720" y="180" />
+ <pos x="720" y="180"/>
</visualElement>
<visualElement>
<elementName>In</elementName>
@@ -85,7 +103,7 @@
<int>16</int>
</entry>
</elementAttributes>
- <pos x="160" y="140" />
+ <pos x="160" y="140"/>
</visualElement>
<visualElement>
<elementName>Splitter</elementName>
@@ -99,12 +117,12 @@
<string>13,1,1,1</string>
</entry>
</elementAttributes>
- <pos x="220" y="140" />
+ <pos x="220" y="140"/>
</visualElement>
<visualElement>
<elementName>atk16_mem_mux.dig</elementName>
- <elementAttributes />
- <pos x="320" y="160" />
+ <elementAttributes/>
+ <pos x="320" y="160"/>
</visualElement>
<visualElement>
<elementName>Splitter</elementName>
@@ -118,7 +136,7 @@
<string>15</string>
</entry>
</elementAttributes>
- <pos x="320" y="80" />
+ <pos x="320" y="80"/>
</visualElement>
<visualElement>
<elementName>Splitter</elementName>
@@ -132,7 +150,7 @@
<string>2</string>
</entry>
</elementAttributes>
- <pos x="400" y="160" />
+ <pos x="400" y="160"/>
</visualElement>
<visualElement>
<elementName>Demultiplexer</elementName>
@@ -146,7 +164,7 @@
<int>15</int>
</entry>
</elementAttributes>
- <pos x="420" y="60" />
+ <pos x="420" y="60"/>
</visualElement>
<visualElement>
<elementName>Probe</elementName>
@@ -156,7 +174,7 @@
<string>ROM_OUT</string>
</entry>
</elementAttributes>
- <pos x="840" y="100" />
+ <pos x="840" y="100"/>
</visualElement>
<visualElement>
<elementName>Driver</elementName>
@@ -170,7 +188,7 @@
<boolean>true</boolean>
</entry>
</elementAttributes>
- <pos x="880" y="140" />
+ <pos x="880" y="140"/>
</visualElement>
<visualElement>
<elementName>Demultiplexer</elementName>
@@ -184,7 +202,7 @@
<boolean>true</boolean>
</entry>
</elementAttributes>
- <pos x="420" y="300" />
+ <pos x="420" y="300"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -194,7 +212,7 @@
<string>RAM_IE</string>
</entry>
</elementAttributes>
- <pos x="480" y="320" />
+ <pos x="480" y="320"/>
</visualElement>
<visualElement>
<elementName>In</elementName>
@@ -216,7 +234,7 @@
<boolean>true</boolean>
</entry>
</elementAttributes>
- <pos x="260" y="500" />
+ <pos x="260" y="500"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -226,7 +244,7 @@
<string>CLK</string>
</entry>
</elementAttributes>
- <pos x="180" y="280" />
+ <pos x="180" y="280"/>
</visualElement>
<visualElement>
<elementName>RAMDualPort</elementName>
@@ -244,59 +262,59 @@
<int>16</int>
</entry>
</elementAttributes>
- <pos x="660" y="280" />
+ <pos x="660" y="280"/>
</visualElement>
<visualElement>
<elementName>VDD</elementName>
<elementAttributes>
<entry>
<string>rotation</string>
- <rotation rotation="1" />
+ <rotation rotation="1"/>
</entry>
</elementAttributes>
- <pos x="640" y="360" />
+ <pos x="640" y="360"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
<elementAttributes>
<entry>
<string>rotation</string>
- <rotation rotation="2" />
+ <rotation rotation="2"/>
</entry>
<entry>
<string>NetName</string>
<string>CLK</string>
</entry>
</elementAttributes>
- <pos x="640" y="340" />
+ <pos x="640" y="340"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
<elementAttributes>
<entry>
<string>rotation</string>
- <rotation rotation="2" />
+ <rotation rotation="2"/>
</entry>
<entry>
<string>NetName</string>
<string>RAM_IE</string>
</entry>
</elementAttributes>
- <pos x="640" y="320" />
+ <pos x="640" y="320"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
<elementAttributes>
<entry>
<string>rotation</string>
- <rotation rotation="2" />
+ <rotation rotation="2"/>
</entry>
<entry>
<string>NetName</string>
<string>DBUS</string>
</entry>
</elementAttributes>
- <pos x="640" y="300" />
+ <pos x="640" y="300"/>
</visualElement>
<visualElement>
<elementName>Probe</elementName>
@@ -306,7 +324,7 @@
<string>RAM_OUT</string>
</entry>
</elementAttributes>
- <pos x="760" y="280" />
+ <pos x="760" y="280"/>
</visualElement>
<visualElement>
<elementName>Driver</elementName>
@@ -316,7 +334,7 @@
<int>16</int>
</entry>
</elementAttributes>
- <pos x="860" y="320" />
+ <pos x="860" y="320"/>
</visualElement>
<visualElement>
<elementName>In</elementName>
@@ -330,7 +348,7 @@
<string>CLK</string>
</entry>
</elementAttributes>
- <pos x="160" y="280" />
+ <pos x="160" y="280"/>
</visualElement>
<visualElement>
<elementName>Out</elementName>
@@ -344,7 +362,7 @@
<string>MMIO_IE</string>
</entry>
</elementAttributes>
- <pos x="880" y="540" />
+ <pos x="880" y="540"/>
</visualElement>
<visualElement>
<elementName>Out</elementName>
@@ -358,7 +376,7 @@
<string>MMIO_OE</string>
</entry>
</elementAttributes>
- <pos x="880" y="600" />
+ <pos x="880" y="600"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -368,7 +386,7 @@
<string>MMIO_S</string>
</entry>
</elementAttributes>
- <pos x="260" y="40" />
+ <pos x="260" y="40"/>
</visualElement>
<visualElement>
<elementName>Testcase</elementName>
@@ -394,7 +412,7 @@ C 0x8000 0 1 Z 0xAA
</testData>
</entry>
</elementAttributes>
- <pos x="540" y="480" />
+ <pos x="540" y="480"/>
</visualElement>
<visualElement>
<elementName>In</elementName>
@@ -408,7 +426,7 @@ C 0x8000 0 1 Z 0xAA
<string>MEM_IE</string>
</entry>
</elementAttributes>
- <pos x="160" y="340" />
+ <pos x="160" y="340"/>
</visualElement>
<visualElement>
<elementName>In</elementName>
@@ -422,17 +440,17 @@ C 0x8000 0 1 Z 0xAA
<string>MEM_OE</string>
</entry>
</elementAttributes>
- <pos x="260" y="560" />
+ <pos x="260" y="560"/>
</visualElement>
<visualElement>
<elementName>And</elementName>
<elementAttributes>
<entry>
<string>rotation</string>
- <rotation rotation="2" />
+ <rotation rotation="2"/>
</entry>
</elementAttributes>
- <pos x="960" y="280" />
+ <pos x="960" y="280"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -442,7 +460,7 @@ C 0x8000 0 1 Z 0xAA
<string>RAM_OE</string>
</entry>
</elementAttributes>
- <pos x="960" y="280" />
+ <pos x="960" y="280"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -452,7 +470,7 @@ C 0x8000 0 1 Z 0xAA
<string>MEM_OE</string>
</entry>
</elementAttributes>
- <pos x="280" y="560" />
+ <pos x="280" y="560"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -462,7 +480,7 @@ C 0x8000 0 1 Z 0xAA
<string>MEM_OE</string>
</entry>
</elementAttributes>
- <pos x="960" y="240" />
+ <pos x="960" y="240"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -472,17 +490,17 @@ C 0x8000 0 1 Z 0xAA
<string>DBUS</string>
</entry>
</elementAttributes>
- <pos x="900" y="320" />
+ <pos x="900" y="320"/>
</visualElement>
<visualElement>
<elementName>And</elementName>
<elementAttributes>
<entry>
<string>rotation</string>
- <rotation rotation="2" />
+ <rotation rotation="2"/>
</entry>
</elementAttributes>
- <pos x="960" y="200" />
+ <pos x="960" y="200"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -492,7 +510,7 @@ C 0x8000 0 1 Z 0xAA
<string>ROM_OE</string>
</entry>
</elementAttributes>
- <pos x="960" y="200" />
+ <pos x="960" y="200"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -502,7 +520,7 @@ C 0x8000 0 1 Z 0xAA
<string>MEM_OE</string>
</entry>
</elementAttributes>
- <pos x="960" y="160" />
+ <pos x="960" y="160"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -512,7 +530,7 @@ C 0x8000 0 1 Z 0xAA
<string>DBUS</string>
</entry>
</elementAttributes>
- <pos x="920" y="120" />
+ <pos x="920" y="120"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -522,7 +540,7 @@ C 0x8000 0 1 Z 0xAA
<string>DBUS</string>
</entry>
</elementAttributes>
- <pos x="280" y="500" />
+ <pos x="280" y="500"/>
</visualElement>
<visualElement>
<elementName>Decoder</elementName>
@@ -536,7 +554,7 @@ C 0x8000 0 1 Z 0xAA
<boolean>true</boolean>
</entry>
</elementAttributes>
- <pos x="460" y="180" />
+ <pos x="460" y="180"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -546,7 +564,7 @@ C 0x8000 0 1 Z 0xAA
<string>ROM_OE</string>
</entry>
</elementAttributes>
- <pos x="500" y="180" />
+ <pos x="500" y="180"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -556,7 +574,7 @@ C 0x8000 0 1 Z 0xAA
<string>RAM_OE</string>
</entry>
</elementAttributes>
- <pos x="500" y="200" />
+ <pos x="500" y="200"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -566,7 +584,7 @@ C 0x8000 0 1 Z 0xAA
<string>MMIO_OE</string>
</entry>
</elementAttributes>
- <pos x="500" y="220" />
+ <pos x="500" y="220"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -576,73 +594,73 @@ C 0x8000 0 1 Z 0xAA
<string>MMIO_IE</string>
</entry>
</elementAttributes>
- <pos x="480" y="340" />
+ <pos x="480" y="340"/>
</visualElement>
<visualElement>
<elementName>And</elementName>
- <elementAttributes />
- <pos x="780" y="580" />
+ <elementAttributes/>
+ <pos x="780" y="580"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
<elementAttributes>
<entry>
<string>rotation</string>
- <rotation rotation="2" />
+ <rotation rotation="2"/>
</entry>
<entry>
<string>NetName</string>
<string>MEM_OE</string>
</entry>
</elementAttributes>
- <pos x="780" y="620" />
+ <pos x="780" y="620"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
<elementAttributes>
<entry>
<string>rotation</string>
- <rotation rotation="2" />
+ <rotation rotation="2"/>
</entry>
<entry>
<string>NetName</string>
<string>MMIO_OE</string>
</entry>
</elementAttributes>
- <pos x="780" y="580" />
+ <pos x="780" y="580"/>
</visualElement>
<visualElement>
<elementName>And</elementName>
- <elementAttributes />
- <pos x="780" y="500" />
+ <elementAttributes/>
+ <pos x="780" y="500"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
<elementAttributes>
<entry>
<string>rotation</string>
- <rotation rotation="2" />
+ <rotation rotation="2"/>
</entry>
<entry>
<string>NetName</string>
<string>MEM_IE</string>
</entry>
</elementAttributes>
- <pos x="780" y="540" />
+ <pos x="780" y="540"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
<elementAttributes>
<entry>
<string>rotation</string>
- <rotation rotation="2" />
+ <rotation rotation="2"/>
</entry>
<entry>
<string>NetName</string>
<string>MMIO_IE</string>
</entry>
</elementAttributes>
- <pos x="780" y="500" />
+ <pos x="780" y="500"/>
</visualElement>
<visualElement>
<elementName>Out</elementName>
@@ -660,21 +678,21 @@ C 0x8000 0 1 Z 0xAA
<int>13</int>
</entry>
</elementAttributes>
- <pos x="880" y="460" />
+ <pos x="880" y="460"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
<elementAttributes>
<entry>
<string>rotation</string>
- <rotation rotation="2" />
+ <rotation rotation="2"/>
</entry>
<entry>
<string>NetName</string>
<string>MMIO_S</string>
</entry>
</elementAttributes>
- <pos x="860" y="460" />
+ <pos x="860" y="460"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -684,266 +702,266 @@ C 0x8000 0 1 Z 0xAA
<string>MEM_IE</string>
</entry>
</elementAttributes>
- <pos x="300" y="360" />
+ <pos x="300" y="360"/>
</visualElement>
</visualElements>
<wires>
<wire>
- <p1 x="720" y="160" />
- <p2 x="740" y="160" />
+ <p1 x="720" y="160"/>
+ <p2 x="740" y="160"/>
</wire>
<wire>
- <p1 x="240" y="160" />
- <p2 x="260" y="160" />
+ <p1 x="240" y="160"/>
+ <p2 x="260" y="160"/>
</wire>
<wire>
- <p1 x="380" y="160" />
- <p2 x="400" y="160" />
+ <p1 x="380" y="160"/>
+ <p2 x="400" y="160"/>
</wire>
<wire>
- <p1 x="420" y="160" />
- <p2 x="440" y="160" />
+ <p1 x="420" y="160"/>
+ <p2 x="440" y="160"/>
</wire>
<wire>
- <p1 x="260" y="160" />
- <p2 x="320" y="160" />
+ <p1 x="260" y="160"/>
+ <p2 x="320" y="160"/>
</wire>
<wire>
- <p1 x="440" y="160" />
- <p2 x="480" y="160" />
+ <p1 x="440" y="160"/>
+ <p2 x="480" y="160"/>
</wire>
<wire>
- <p1 x="460" y="320" />
- <p2 x="480" y="320" />
+ <p1 x="460" y="320"/>
+ <p2 x="480" y="320"/>
</wire>
<wire>
- <p1 x="640" y="320" />
- <p2 x="660" y="320" />
+ <p1 x="640" y="320"/>
+ <p2 x="660" y="320"/>
</wire>
<wire>
- <p1 x="720" y="320" />
- <p2 x="760" y="320" />
+ <p1 x="720" y="320"/>
+ <p2 x="760" y="320"/>
</wire>
<wire>
- <p1 x="880" y="320" />
- <p2 x="900" y="320" />
+ <p1 x="880" y="320"/>
+ <p2 x="900" y="320"/>
</wire>
<wire>
- <p1 x="760" y="320" />
- <p2 x="840" y="320" />
+ <p1 x="760" y="320"/>
+ <p2 x="840" y="320"/>
</wire>
<wire>
- <p1 x="620" y="100" />
- <p2 x="740" y="100" />
+ <p1 x="620" y="100"/>
+ <p2 x="740" y="100"/>
</wire>
<wire>
- <p1 x="260" y="100" />
- <p2 x="320" y="100" />
+ <p1 x="260" y="100"/>
+ <p2 x="320" y="100"/>
</wire>
<wire>
- <p1 x="380" y="100" />
- <p2 x="420" y="100" />
+ <p1 x="380" y="100"/>
+ <p2 x="420" y="100"/>
</wire>
<wire>
- <p1 x="860" y="260" />
- <p2 x="900" y="260" />
+ <p1 x="860" y="260"/>
+ <p2 x="900" y="260"/>
</wire>
<wire>
- <p1 x="240" y="200" />
- <p2 x="320" y="200" />
+ <p1 x="240" y="200"/>
+ <p2 x="320" y="200"/>
</wire>
<wire>
- <p1 x="640" y="360" />
- <p2 x="660" y="360" />
+ <p1 x="640" y="360"/>
+ <p2 x="660" y="360"/>
</wire>
<wire>
- <p1 x="280" y="360" />
- <p2 x="300" y="360" />
+ <p1 x="280" y="360"/>
+ <p2 x="300" y="360"/>
</wire>
<wire>
- <p1 x="240" y="40" />
- <p2 x="260" y="40" />
+ <p1 x="240" y="40"/>
+ <p2 x="260" y="40"/>
</wire>
<wire>
- <p1 x="840" y="520" />
- <p2 x="860" y="520" />
+ <p1 x="840" y="520"/>
+ <p2 x="860" y="520"/>
</wire>
<wire>
- <p1 x="640" y="300" />
- <p2 x="660" y="300" />
+ <p1 x="640" y="300"/>
+ <p2 x="660" y="300"/>
</wire>
<wire>
- <p1 x="800" y="140" />
- <p2 x="840" y="140" />
+ <p1 x="800" y="140"/>
+ <p2 x="840" y="140"/>
</wire>
<wire>
- <p1 x="160" y="140" />
- <p2 x="220" y="140" />
+ <p1 x="160" y="140"/>
+ <p2 x="220" y="140"/>
</wire>
<wire>
- <p1 x="840" y="140" />
- <p2 x="860" y="140" />
+ <p1 x="840" y="140"/>
+ <p2 x="860" y="140"/>
</wire>
<wire>
- <p1 x="860" y="460" />
- <p2 x="880" y="460" />
+ <p1 x="860" y="460"/>
+ <p2 x="880" y="460"/>
</wire>
<wire>
- <p1 x="240" y="80" />
- <p2 x="320" y="80" />
+ <p1 x="240" y="80"/>
+ <p2 x="320" y="80"/>
</wire>
<wire>
- <p1 x="340" y="80" />
- <p2 x="380" y="80" />
+ <p1 x="340" y="80"/>
+ <p2 x="380" y="80"/>
</wire>
<wire>
- <p1 x="460" y="80" />
- <p2 x="600" y="80" />
+ <p1 x="460" y="80"/>
+ <p2 x="600" y="80"/>
</wire>
<wire>
- <p1 x="260" y="560" />
- <p2 x="280" y="560" />
+ <p1 x="260" y="560"/>
+ <p2 x="280" y="560"/>
</wire>
<wire>
- <p1 x="720" y="180" />
- <p2 x="740" y="180" />
+ <p1 x="720" y="180"/>
+ <p2 x="740" y="180"/>
</wire>
<wire>
- <p1 x="240" y="180" />
- <p2 x="280" y="180" />
+ <p1 x="240" y="180"/>
+ <p2 x="280" y="180"/>
</wire>
<wire>
- <p1 x="380" y="180" />
- <p2 x="400" y="180" />
+ <p1 x="380" y="180"/>
+ <p2 x="400" y="180"/>
</wire>
<wire>
- <p1 x="880" y="180" />
- <p2 x="900" y="180" />
+ <p1 x="880" y="180"/>
+ <p2 x="900" y="180"/>
</wire>
<wire>
- <p1 x="280" y="180" />
- <p2 x="320" y="180" />
+ <p1 x="280" y="180"/>
+ <p2 x="320" y="180"/>
</wire>
<wire>
- <p1 x="640" y="340" />
- <p2 x="660" y="340" />
+ <p1 x="640" y="340"/>
+ <p2 x="660" y="340"/>
</wire>
<wire>
- <p1 x="160" y="340" />
- <p2 x="280" y="340" />
+ <p1 x="160" y="340"/>
+ <p2 x="280" y="340"/>
</wire>
<wire>
- <p1 x="460" y="340" />
- <p2 x="480" y="340" />
+ <p1 x="460" y="340"/>
+ <p2 x="480" y="340"/>
</wire>
<wire>
- <p1 x="280" y="340" />
- <p2 x="420" y="340" />
+ <p1 x="280" y="340"/>
+ <p2 x="420" y="340"/>
</wire>
<wire>
- <p1 x="260" y="500" />
- <p2 x="280" y="500" />
+ <p1 x="260" y="500"/>
+ <p2 x="280" y="500"/>
</wire>
<wire>
- <p1 x="160" y="280" />
- <p2 x="180" y="280" />
+ <p1 x="160" y="280"/>
+ <p2 x="180" y="280"/>
</wire>
<wire>
- <p1 x="600" y="280" />
- <p2 x="660" y="280" />
+ <p1 x="600" y="280"/>
+ <p2 x="660" y="280"/>
</wire>
<wire>
- <p1 x="720" y="120" />
- <p2 x="740" y="120" />
+ <p1 x="720" y="120"/>
+ <p2 x="740" y="120"/>
</wire>
<wire>
- <p1 x="280" y="120" />
- <p2 x="320" y="120" />
+ <p1 x="280" y="120"/>
+ <p2 x="320" y="120"/>
</wire>
<wire>
- <p1 x="900" y="120" />
- <p2 x="920" y="120" />
+ <p1 x="900" y="120"/>
+ <p2 x="920" y="120"/>
</wire>
<wire>
- <p1 x="840" y="600" />
- <p2 x="880" y="600" />
+ <p1 x="840" y="600"/>
+ <p2 x="880" y="600"/>
</wire>
<wire>
- <p1 x="460" y="60" />
- <p2 x="620" y="60" />
+ <p1 x="460" y="60"/>
+ <p2 x="620" y="60"/>
</wire>
<wire>
- <p1 x="860" y="540" />
- <p2 x="880" y="540" />
+ <p1 x="860" y="540"/>
+ <p2 x="880" y="540"/>
</wire>
<wire>
- <p1 x="480" y="160" />
- <p2 x="480" y="180" />
+ <p1 x="480" y="160"/>
+ <p2 x="480" y="180"/>
</wire>
<wire>
- <p1 x="260" y="100" />
- <p2 x="260" y="160" />
+ <p1 x="260" y="100"/>
+ <p2 x="260" y="160"/>
</wire>
<wire>
- <p1 x="900" y="120" />
- <p2 x="900" y="140" />
+ <p1 x="900" y="120"/>
+ <p2 x="900" y="140"/>
</wire>
<wire>
- <p1 x="840" y="100" />
- <p2 x="840" y="140" />
+ <p1 x="840" y="100"/>
+ <p2 x="840" y="140"/>
</wire>
<wire>
- <p1 x="620" y="60" />
- <p2 x="620" y="100" />
+ <p1 x="620" y="60"/>
+ <p2 x="620" y="100"/>
</wire>
<wire>
- <p1 x="240" y="40" />
- <p2 x="240" y="80" />
+ <p1 x="240" y="40"/>
+ <p2 x="240" y="80"/>
</wire>
<wire>
- <p1 x="240" y="80" />
- <p2 x="240" y="140" />
+ <p1 x="240" y="80"/>
+ <p2 x="240" y="140"/>
</wire>
<wire>
- <p1 x="880" y="160" />
- <p2 x="880" y="180" />
+ <p1 x="880" y="160"/>
+ <p2 x="880" y="180"/>
</wire>
<wire>
- <p1 x="280" y="120" />
- <p2 x="280" y="180" />
+ <p1 x="280" y="120"/>
+ <p2 x="280" y="180"/>
</wire>
<wire>
- <p1 x="280" y="340" />
- <p2 x="280" y="360" />
+ <p1 x="280" y="340"/>
+ <p2 x="280" y="360"/>
</wire>
<wire>
- <p1 x="440" y="140" />
- <p2 x="440" y="160" />
+ <p1 x="440" y="140"/>
+ <p2 x="440" y="160"/>
</wire>
<wire>
- <p1 x="440" y="160" />
- <p2 x="440" y="300" />
+ <p1 x="440" y="160"/>
+ <p2 x="440" y="300"/>
</wire>
<wire>
- <p1 x="600" y="80" />
- <p2 x="600" y="280" />
+ <p1 x="600" y="80"/>
+ <p2 x="600" y="280"/>
</wire>
<wire>
- <p1 x="760" y="280" />
- <p2 x="760" y="320" />
+ <p1 x="760" y="280"/>
+ <p2 x="760" y="320"/>
</wire>
<wire>
- <p1 x="380" y="80" />
- <p2 x="380" y="100" />
+ <p1 x="380" y="80"/>
+ <p2 x="380" y="100"/>
</wire>
<wire>
- <p1 x="860" y="520" />
- <p2 x="860" y="540" />
+ <p1 x="860" y="520"/>
+ <p2 x="860" y="540"/>
</wire>
<wire>
- <p1 x="860" y="260" />
- <p2 x="860" y="300" />
+ <p1 x="860" y="260"/>
+ <p2 x="860" y="300"/>
</wire>
</wires>
- <measurementOrdering />
+ <measurementOrdering/>
</circuit> \ No newline at end of file