summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOxore <oxore@protonmail.com>2019-09-14 21:15:50 +0300
committerOxore <oxore@protonmail.com>2019-09-14 21:15:50 +0300
commit6851819789bc2c5a7b20d72d20c633440c5204a4 (patch)
treef35a85ecde3df805b97ea77a0fcc20bb16e0a83f
Initial commitHEADmaster
-rw-r--r--bench/vhdl/AsyncLog.vhd124
-rw-r--r--bench/vhdl/AsyncStim.vhd115
-rw-r--r--bench/vhdl/BinaryLog.vhd93
-rw-r--r--bench/vhdl/BinaryStim.vhd95
-rw-r--r--bench/vhdl/I2SLog.vhd106
-rw-r--r--bench/vhdl/I2SStim.vhd117
-rw-r--r--bench/vhdl/IntegerLog.vhd1
-rw-r--r--bench/vhdl/StimLog.vhd142
-rw-r--r--bench/vhdl/TestBench32.vhd116
-rw-r--r--bench/vhdl/TestBench52.vhd79
-rw-r--r--doc/Instruction Set.pdfbin0 -> 35952 bytes
-rw-r--r--rtl/vhdl/ROM52_BASIC.vhd8222
-rw-r--r--rtl/vhdl/SSRAM.vhd92
-rw-r--r--rtl/vhdl/SSRAM2.vhd92
-rw-r--r--rtl/vhdl/SSRAMX.vhd132
-rw-r--r--rtl/vhdl/T51.vhd1496
-rw-r--r--rtl/vhdl/T51_ALU.vhd744
-rw-r--r--rtl/vhdl/T51_Glue.vhd254
-rw-r--r--rtl/vhdl/T51_MD.vhd137
-rw-r--r--rtl/vhdl/T51_Pack.vhd369
-rw-r--r--rtl/vhdl/T51_Port.vhd107
-rw-r--r--rtl/vhdl/T51_RAM.vhd131
-rw-r--r--rtl/vhdl/T51_TC01.vhd270
-rw-r--r--rtl/vhdl/T51_TC2.vhd213
-rw-r--r--rtl/vhdl/T51_UART.vhd379
-rw-r--r--rtl/vhdl/T51s.vhd1551
-rw-r--r--rtl/vhdl/T8032.vhd459
-rw-r--r--rtl/vhdl/T8052.vhd519
-rw-r--r--sw/BASIC-52.asm7487
-rw-r--r--sw/hex2rom.cpp962
-rw-r--r--sw/xrom.cpp414
31 files changed, 25018 insertions, 0 deletions
diff --git a/bench/vhdl/AsyncLog.vhd b/bench/vhdl/AsyncLog.vhd
new file mode 100644
index 0000000..04a6a4d
--- /dev/null
+++ b/bench/vhdl/AsyncLog.vhd
@@ -0,0 +1,124 @@
+--
+-- Asynchronous serial input with binary file log
+--
+-- Version : 0146
+--
+-- Copyright (c) 2001 Daniel Wallner (jesus@opencores.org)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+entity AsyncLog is
+ generic(
+ FileName : string;
+ Baud : integer;
+ Bits : integer := 8; -- Data bits
+ Parity : boolean := false; -- Enable Parity
+ P_Odd_Even_n : boolean := false -- false => Even Parity, true => Odd Parity
+ );
+ port(
+ RXD : in std_logic
+ );
+end AsyncLog;
+
+architecture behaviour of AsyncLog is
+
+ function to_char(
+ constant Byte : std_logic_vector(7 downto 0)
+ ) return character is
+ begin
+ return character'val(to_integer(unsigned(Byte)));
+ end function;
+
+ signal Baud16 : std_logic := '0';
+
+ -- Receive signals
+ signal Bit_Phase : unsigned(3 downto 0) := "0000";
+ signal RX_ShiftReg : std_logic_vector(Bits - 1 downto 0) := (others => '0');
+ signal RX_Bit_Cnt : integer := 0;
+ signal ParTmp : boolean;
+
+begin
+
+ Baud16 <= not Baud16 after 1000000000 ns / 32 / Baud;
+
+ process (Baud16)
+ type ChFile is file of character;
+ file OutFile : ChFile open write_mode is FileName;
+ begin
+ if Baud16'event and Baud16 = '1' then
+ if RX_Bit_Cnt = 0 and (RXD = '1' or Bit_Phase = "0111") then
+ Bit_Phase <= "0000";
+ else
+ Bit_Phase <= Bit_Phase + 1;
+ end if;
+ if RX_Bit_Cnt = 0 then
+ if Bit_Phase = "0111" then
+ RX_Bit_Cnt <= RX_Bit_Cnt + 1;
+ end if;
+ ParTmp <= false;
+ elsif Bit_Phase = "1111" then
+ RX_Bit_Cnt <= RX_Bit_Cnt + 1;
+ if (RX_Bit_Cnt = Bits + 1 and not Parity) or
+ (RX_Bit_Cnt = Bits + 2 and Parity) then -- Stop bit
+ RX_Bit_Cnt <= 0;
+ assert RXD = '1'
+ report "Framing error"
+ severity error;
+ write(OutFile, to_char(RX_ShiftReg(7 downto 0)));
+ elsif RX_Bit_Cnt = Bits + 1 and Parity then -- Parity bit
+ assert ParTmp xor (RXD = '1') = P_Odd_Even_n
+ report "Parity error"
+ severity error;
+ else
+ ParTmp <= ParTmp xor (RXD = '1');
+ RX_ShiftReg(Bits - 2 downto 0) <= RX_ShiftReg(Bits - 1 downto 1);
+ RX_ShiftReg(Bits - 1) <= RXD;
+ end if;
+ end if;
+ end if;
+ end process;
+
+end;
+
diff --git a/bench/vhdl/AsyncStim.vhd b/bench/vhdl/AsyncStim.vhd
new file mode 100644
index 0000000..04834e4
--- /dev/null
+++ b/bench/vhdl/AsyncStim.vhd
@@ -0,0 +1,115 @@
+--
+-- Asynchronous serial generator with input from binary file
+--
+-- Version : 0146
+--
+-- Copyright (c) 2001 Daniel Wallner (jesus@opencores.org)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+entity AsyncStim is
+ generic(
+ FileName : string;
+ Baud : integer;
+ InterCharDelay : time := 0 ns;
+ Bits : integer := 8; -- Data bits
+ Parity : boolean := false; -- Enable Parity
+ P_Odd_Even_n : boolean := false -- false => Even Parity, true => Odd Parity
+ );
+ port(
+ TXD : out std_logic
+ );
+end AsyncStim;
+
+architecture behaviour of AsyncStim is
+
+ signal TX_ShiftReg : std_logic_vector(Bits - 1 downto 0);
+ signal TX_Bit_Cnt : integer range 0 to 15 := 0;
+ signal ParTmp : boolean;
+
+begin
+
+ process
+ type ChFile is file of character;
+ file InFile : ChFile open read_mode is FileName;
+ variable Inited : boolean := false;
+ variable CharTmp : character;
+ variable IntTmp : integer;
+ begin
+ if not Inited then
+ Inited := true;
+ TXD <= '1';
+ end if;
+ wait for 1000000000 ns / Baud;
+ TX_Bit_Cnt <= TX_Bit_Cnt + 1;
+ case TX_Bit_Cnt is
+ when 0 =>
+ TXD <= '1';
+ wait for InterCharDelay;
+ when 1 => -- Start bit
+ read(InFile, CharTmp);
+ IntTmp := character'pos(CharTmp);
+ TX_ShiftReg(Bits - 1 downto 0) <= std_logic_vector(to_unsigned(IntTmp, Bits));
+ TXD <= '0';
+ ParTmp <= P_Odd_Even_n;
+ when others =>
+ TXD <= TX_ShiftReg(0);
+ ParTmp <= ParTmp xor (TX_ShiftReg(0) = '1');
+ TX_ShiftReg(Bits - 2 downto 0) <= TX_ShiftReg(Bits - 1 downto 1);
+ if (TX_Bit_Cnt = Bits + 1 and not Parity) or
+ (TX_Bit_Cnt = Bits + 2 and Parity) then -- Stop bit
+ TX_Bit_Cnt <= 0;
+ end if;
+ if Parity and TX_Bit_Cnt = Bits + 2 then
+ if ParTmp then
+ TXD <= '1';
+ else
+ TXD <= '0';
+ end if;
+ end if;
+ end case;
+ end process;
+
+end;
diff --git a/bench/vhdl/BinaryLog.vhd b/bench/vhdl/BinaryLog.vhd
new file mode 100644
index 0000000..10c2670
--- /dev/null
+++ b/bench/vhdl/BinaryLog.vhd
@@ -0,0 +1,93 @@
+--
+-- Output port with binary file log
+--
+-- Version : 0146
+--
+-- Copyright (c) 2001 Daniel Wallner (jesus@opencores.org)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+entity BinaryLog is
+ generic(
+ FileName : string;
+ Bytes : integer := 1; -- Number of bytes per word
+ LittleEndian : boolean := true -- Byte order
+ );
+ port(
+ Clk : in std_logic;
+ En : in std_logic;
+ Data : in std_logic_vector(Bytes * 8 - 1 downto 0)
+ );
+end BinaryLog;
+
+architecture behaviour of BinaryLog is
+
+ function to_char(
+ constant Byte : std_logic_vector(7 downto 0)
+ ) return character is
+ begin
+ return character'val(to_integer(unsigned(Byte)));
+ end function;
+
+begin
+
+ process (clk)
+ type ChFile is file of character;
+ file OutFile : ChFile open write_mode is FileName;
+ begin
+ if Clk'event and Clk = '1' and En = '1' and now > 0 ns then
+ if LittleEndian then
+ for i in integer range 0 to Bytes - 1 loop
+ write(OutFile, to_char(Data(i * 8 + 7 downto i * 8)));
+ end loop;
+ else
+ for i in integer range Bytes - 1 downto 0 loop
+ write(OutFile, to_char(Data(i * 8 + 7 downto i * 8)));
+ end loop;
+ end if;
+ end if;
+ end process;
+
+end;
diff --git a/bench/vhdl/BinaryStim.vhd b/bench/vhdl/BinaryStim.vhd
new file mode 100644
index 0000000..626876a
--- /dev/null
+++ b/bench/vhdl/BinaryStim.vhd
@@ -0,0 +1,95 @@
+--
+-- Input port with stimuli from binary file
+--
+-- Version : 0146
+--
+-- Copyright (c) 2001 Daniel Wallner (jesus@opencores.org)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+entity BinaryStim is
+ generic(
+ FileName : string;
+ Bytes : integer := 1; -- Number of bytes per word
+ LittleEndian : boolean := true -- Byte order
+ );
+ port(
+ Rd : in std_logic;
+ Data : out std_logic_vector(Bytes * 8 - 1 downto 0)
+ );
+end BinaryStim;
+
+architecture behaviour of BinaryStim is
+
+begin
+
+ process (Rd)
+ type ChFile is file of character;
+ file InFile : ChFile open read_mode is FileName;
+ variable Inited : boolean := false;
+ variable CharTmp : character;
+ variable IntTmp : integer;
+ begin
+ if not Inited then
+ Inited := true;
+ end if;
+ if Rd'event and Rd = '1' and now > 0 ns then
+ if LittleEndian then
+ for i in integer range 0 to Bytes - 1 loop
+ read(InFile, CharTmp);
+ IntTmp := character'pos(CharTmp);
+ Data(i * 8 + 7 downto i * 8) <= std_logic_vector(to_unsigned(IntTmp, 8));
+ end loop;
+ else
+ for i in integer range Bytes - 1 downto 0 loop
+ read(InFile, CharTmp);
+ IntTmp := character'pos(CharTmp);
+ Data(i * 8 + 7 downto i * 8) <= std_logic_vector(to_unsigned(IntTmp, 8));
+ end loop;
+ end if;
+ end if;
+ end process;
+
+end;
diff --git a/bench/vhdl/I2SLog.vhd b/bench/vhdl/I2SLog.vhd
new file mode 100644
index 0000000..ed4dc6f
--- /dev/null
+++ b/bench/vhdl/I2SLog.vhd
@@ -0,0 +1,106 @@
+--
+-- I2S port with binary file log
+--
+-- Version : 0146
+--
+-- Copyright (c) 2001 Daniel Wallner (jesus@opencores.org)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+entity I2SLog is
+ generic(
+ FileName : string;
+ Bytes : integer := 2; -- Number of bytes per word
+ LittleEndian : boolean := true -- Byte order
+ );
+ port(
+ BClk : in std_logic;
+ FSync : in std_logic;
+ SData : in std_logic
+ );
+end I2SLog;
+
+architecture behaviour of I2SLog is
+
+ function to_char(
+ constant Byte : std_logic_vector(7 downto 0)
+ ) return character is
+ begin
+ return character'val(to_integer(unsigned(Byte)));
+ end function;
+
+begin
+ process (BClk)
+ type ChFile is file of character;
+ file OutFile : ChFile open write_mode is FileName;
+ variable Data : std_logic_vector(Bytes * 8 - 1 downto 0);
+ variable BPhase : integer := 64;
+ variable OldFS : std_logic;
+ begin
+ if BClk'event and BClk = '1' then
+ if BPhase mod 32 = Bytes * 8 then
+ if LittleEndian then
+ for i in integer range 0 to Bytes - 1 loop
+ write(OutFile, to_char(Data(i * 8 + 7 downto i * 8)));
+ end loop;
+ else
+ for i in integer range Bytes - 1 downto 0 loop
+ write(OutFile, to_char(Data(i * 8 + 7 downto i * 8)));
+ end loop;
+ end if;
+ end if;
+
+ if OldFS = '1' and FSync = '0' then
+ BPhase := 0;
+ else
+ BPhase := BPhase + 1;
+ end if;
+ OldFS := FSync;
+
+ Data(Bytes * 8 - 1 downto 1) := Data(Bytes * 8 - 2 downto 0);
+ Data(0) := SData;
+ end if;
+ end process;
+end;
diff --git a/bench/vhdl/I2SStim.vhd b/bench/vhdl/I2SStim.vhd
new file mode 100644
index 0000000..d052414
--- /dev/null
+++ b/bench/vhdl/I2SStim.vhd
@@ -0,0 +1,117 @@
+--
+-- I2S from binary file
+--
+-- Version : 0146
+--
+-- Copyright (c) 2001 Daniel Wallner (jesus@opencores.org)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+entity I2SStim is
+ generic(
+ FileName : string;
+ Bytes : integer := 2; -- Number of bytes per word (1 to 4)
+ LittleEndian : boolean := true -- Byte order
+ );
+ port(
+ BClk : in std_logic;
+ FSync : in std_logic;
+ SData : out std_logic
+ );
+end I2SStim;
+
+architecture behaviour of I2SStim is
+
+begin
+ process (BClk)
+ type ChFile is file of character;
+ file InFile : ChFile open read_mode is FileName;
+ variable Inited : boolean := false;
+ variable CharTmp : character;
+ variable IntTmp : integer;
+ variable Data : std_logic_vector(Bytes * 8 - 1 downto 0);
+ variable BPhase : integer;
+ variable OldFS : std_logic;
+ begin
+ if not Inited then
+ Inited := true;
+ BPhase := 64;
+ Data := (others => '0');
+ SData <= '0';
+ end if;
+ if BClk'event and BClk = '0' then
+ if BPhase = 0 or BPhase = 32 then
+ if LittleEndian then
+ for i in integer range 0 to Bytes - 1 loop
+ read(InFile, CharTmp);
+ IntTmp := character'pos(CharTmp);
+ Data(i * 8 + 7 downto i * 8) := std_logic_vector(to_unsigned(IntTmp, 8));
+ end loop;
+ else
+ for i in integer range Bytes - 1 downto 0 loop
+ read(InFile, CharTmp);
+ IntTmp := character'pos(CharTmp);
+ Data(i * 8 + 7 downto i * 8) := std_logic_vector(to_unsigned(IntTmp, 8));
+ end loop;
+ end if;
+ end if;
+
+ if BPhase mod 32 < Bytes * 8 then
+ SData <= Data(Bytes * 8 - 1);
+ Data(Bytes * 8 - 1 downto 1) := Data(Bytes * 8 - 2 downto 0);
+ else
+ SData <= '0';
+ end if;
+ end if;
+ if BClk'event and BClk = '1' then
+ if OldFS = '1' and FSync = '0' then
+ BPhase := 0;
+ else
+ BPhase := BPhase + 1;
+ end if;
+ OldFS := FSync;
+ end if;
+ end process;
+end;
diff --git a/bench/vhdl/IntegerLog.vhd b/bench/vhdl/IntegerLog.vhd
new file mode 100644
index 0000000..da77ce6
--- /dev/null
+++ b/bench/vhdl/IntegerLog.vhd
@@ -0,0 +1 @@
+-- -- File I/O test-bench utilities -- -- Version : 0146 -- -- Copyright (c) 2001 Daniel Wallner (jesus@opencores.org) -- -- All rights reserved -- -- Redistribution and use in source and synthezised forms, with or without -- modification, are permitted provided that the following conditions are met: -- -- Redistributions of source code must retain the above copyright notice, -- this list of conditions and the following disclaimer. -- -- Redistributions in synthesized form must reproduce the above copyright -- notice, this list of conditions and the following disclaimer in the -- documentation and/or other materials provided with the distribution. -- -- Neither the name of the author nor the names of other contributors may -- be used to endorse or promote products derived from this software without -- specific prior written permission. -- -- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE -- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -- POSSIBILITY OF SUCH DAMAGE. -- -- Please report bugs to the author, but before you do so, please -- make sure that this is not a derivative work and that -- you have the latest version of this file. -- -- The latest version of this file can be found at: -- http://www.opencores.org/cvsweb.shtml/t51/ -- -- Limitations : -- -- File history : -- library IEEE; use IEEE.std_logic_1164.all; use std.textio.all; entity IntegerLog is generic( FileName : string ); port( Clk : in std_logic; En : in std_logic; Data : in integer ); end IntegerLog; architecture behaviour of IntegerLog is begin process (Clk) file OutFile : text open write_mode is FileName; variable l : line; begin if Clk'event and Clk = '1' and En = '1' and now > 0 ns then write(l, Data); writeline(OutFile, l); end if; end process; end; \ No newline at end of file
diff --git a/bench/vhdl/StimLog.vhd b/bench/vhdl/StimLog.vhd
new file mode 100644
index 0000000..662f9fd
--- /dev/null
+++ b/bench/vhdl/StimLog.vhd
@@ -0,0 +1,142 @@
+--
+-- File I/O test-bench utilities
+--
+-- Version : 0146
+--
+-- Copyright (c) 2001 Daniel Wallner (jesus@opencores.org)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+
+package StimLog is
+
+ component AsyncStim
+ generic(
+ FileName : string;
+ Baud : integer;
+ InterCharDelay : time := 0 ns;
+ Bits : integer := 8; -- Data bits
+ Parity : boolean := false; -- Enable Parity
+ P_Odd_Even_n : boolean := false -- false => Even Parity, true => Odd Parity
+ );
+ port(
+ TXD : out std_logic
+ );
+ end component;
+
+ component AsyncLog
+ generic(
+ FileName : string;
+ Baud : integer;
+ Bits : integer := 8; -- Data bits
+ Parity : boolean := false; -- Enable Parity
+ P_Odd_Even_n : boolean := false -- false => Even Parity, true => Odd Parity
+ );
+ port(
+ RXD : in std_logic
+ );
+ end component;
+
+ component BinaryStim
+ generic(
+ FileName : string;
+ Bytes : integer := 1; -- Number of bytes per word
+ LittleEndian : boolean := true -- Byte order
+ );
+ port(
+ Rd : in std_logic;
+ Data : out std_logic_vector(Bytes * 8 - 1 downto 0)
+ );
+ end component;
+
+ component BinaryLog
+ generic(
+ FileName : string;
+ Bytes : integer := 1; -- Number of bytes per word
+ LittleEndian : boolean := true -- Byte order
+ );
+ port(
+ Clk : in std_logic;
+ En : in std_logic;
+ Data : in std_logic_vector(Bytes * 8 - 1 downto 0)
+ );
+ end component;
+
+ component I2SStim is
+ generic(
+ FileName : string;
+ Bytes : integer := 2; -- Number of bytes per word (1 to 4)
+ LittleEndian : boolean := true -- Byte order
+ );
+ port(
+ BClk : in std_logic;
+ FSync : in std_logic;
+ SData : out std_logic
+ );
+ end component;
+
+ component I2SLog is
+ generic(
+ FileName : string;
+ Bytes : integer := 2; -- Number of bytes per word
+ LittleEndian : boolean := true -- Byte order
+ );
+ port(
+ BClk : in std_logic;
+ FSync : in std_logic;
+ SData : in std_logic
+ );
+ end component;
+
+ component IntegerLog is
+ generic(
+ FileName : string
+ );
+ port(
+ Clk : in std_logic;
+ En : in std_logic;
+ Data : in integer
+ );
+ end component;
+
+end;
diff --git a/bench/vhdl/TestBench32.vhd b/bench/vhdl/TestBench32.vhd
new file mode 100644
index 0000000..af4189b
--- /dev/null
+++ b/bench/vhdl/TestBench32.vhd
@@ -0,0 +1,116 @@
+library IEEE;
+use IEEE.std_logic_1164.all;
+use work.StimLog.all;
+
+entity TestBench32 is
+end TestBench32;
+
+architecture behaviour of TestBench32 is
+
+ signal CLK_I : std_logic := '0';
+ signal RST_I : std_logic := '1';
+ signal ACK_I : std_logic;
+ signal TAG0_O : std_logic;
+ signal CYC_O : std_logic;
+ signal STB_O : std_logic;
+ signal WE_O : std_logic;
+ signal ADR_O : std_logic_vector(15 downto 0);
+ signal ADR_O_r : std_logic_vector(15 downto 0);
+ signal DAT_I : std_logic_vector(7 downto 0);
+ signal DAT_O : std_logic_vector(7 downto 0);
+ signal ROM_D : std_logic_vector(7 downto 0);
+ signal RAM_D : std_logic_vector(7 downto 0);
+ signal CS_n : std_logic;
+ signal WE_n : std_logic;
+ signal RXD : std_logic;
+ signal RXD_IsOut : std_logic;
+ signal RXD_Out : std_logic;
+ signal TXD : std_logic;
+ signal INT0 : std_logic := '0';
+ signal P0 : std_logic_vector(7 downto 0);
+ signal P1 : std_logic_vector(7 downto 0);
+ signal P2 : std_logic_vector(7 downto 0);
+ signal P3 : std_logic_vector(7 downto 0);
+ signal p3_out : std_logic_vector(7 downto 0);
+
+begin
+
+ u0 : entity work.T8032
+ port map(
+ CLK_I => CLK_I,
+ RST_I => RST_I,
+ ACK_I => ACK_I,
+ TAG0_O => TAG0_O,
+ CYC_O => CYC_O,
+ STB_O => STB_O,
+ WE_O => WE_O,
+ ADR_O => ADR_O,
+ DAT_I => DAT_I,
+ DAT_O => DAT_O,
+ P0_in => P0,
+ P1_in => P1,
+ P2_in => P2,
+ P3_in => P3,
+ P0_out => P0,
+ P1_out => P1,
+ P2_out => P2,
+ P3_out => P3_out,
+ INT0 => INT0,
+ INT1 => '1',
+ T0 => '1',
+ T1 => '1',
+ T2 => '1',
+ T2EX => '1',
+ RXD => RXD,
+ RXD_IsO => RXD_IsOut,
+ RXD_O => RXD_Out,
+ TXD => TXD);
+
+ rom : entity work.ROM52
+ port map(
+ Clk => CLK_I,
+ A => ADR_O(12 downto 0),
+ D => ROM_D);
+
+ WE_n <= WE_O nand ACK_I;
+ CS_n <= '0' when ADR_O(15 downto 11) = "00000" and TAG0_O = '1' else '1';
+
+ ram : entity work.SSRAM
+ generic map(
+ AddrWidth => 11)
+ port map(
+ Clk => CLK_I,
+ CE_n => '0',
+ WE_n => WE_n,
+ A => ADR_O(10 downto 0),
+ DIn => DAT_O,
+ DOut => RAM_D);
+
+ DAT_I <= ROM_D when TAG0_O = '0' else RAM_D when ADR_O(15 downto 11) = "00000" else "11111111";
+ ACK_I <= '1' when ADR_O_r = ADR_O else '0';
+
+ P3(0) <= RXD;
+ P3(7 downto 1) <= P3_out(7 downto 1);
+
+ process (CLK_I)
+ begin
+ if CLK_I'event and CLK_I = '1' then
+ ADR_O_r <= ADR_O;
+ end if;
+ end process;
+
+ as : AsyncStim
+ generic map(FileName => "BASIC.txt", InterCharDelay => 5000 us, Baud => 57600, Bits => 8)
+ port map(RXD);
+
+
+ al : AsyncLog
+ generic map(FileName => "RX_Log.txt", Baud => 57600, Bits => 8)
+ port map(TXD);
+
+ CLK_I <= not CLK_I after 45 ns;
+ RST_I <= '0' after 200 ns;
+
+ INT0 <= not INT0 after 100 us;
+
+end;
diff --git a/bench/vhdl/TestBench52.vhd b/bench/vhdl/TestBench52.vhd
new file mode 100644
index 0000000..faeb051
--- /dev/null
+++ b/bench/vhdl/TestBench52.vhd
@@ -0,0 +1,79 @@
+library IEEE;
+use IEEE.std_logic_1164.all;
+use work.StimLog.all;
+
+entity TestBench52 is
+end TestBench52;
+
+architecture behaviour of TestBench52 is
+
+ signal Clk : std_logic := '0';
+ signal Rst_n : std_logic := '0';
+ signal RXD : std_logic;
+ signal RXD_IsOut : std_logic;
+ signal RXD_Out : std_logic;
+ signal TXD : std_logic;
+ signal INT0 : std_logic := '0';
+ signal P0 : std_logic_vector(7 downto 0);
+ signal P1 : std_logic_vector(7 downto 0);
+ signal P2 : std_logic_vector(7 downto 0);
+ signal P3 : std_logic_vector(7 downto 0);
+ signal p3_out : std_logic_vector(7 downto 0);
+ signal XRAM_WE_s : std_logic;
+ signal XRAM_STB_s : std_logic;
+ signal XRAM_CYC_s : std_logic;
+ signal XRAM_ACK_s : std_logic;
+ signal XRAM_DATI_s : std_logic_vector(7 downto 0);
+ signal XRAM_ADR_s : std_logic_vector(15 downto 0);
+ signal XRAM_DATO_s : std_logic_vector(7 downto 0);
+
+begin
+
+ u0 : entity work.T8052
+ port map(
+ Clk => Clk,
+ Rst_n => Rst_n,
+ P0_in => P0,
+ P1_in => P1,
+ P2_in => P2,
+ P3_in => P3,
+ P0_out => P0,
+ P1_out => P1,
+ P2_out => P2,
+ P3_out => P3_out,
+ INT0 => INT0,
+ INT1 => '1',
+ T0 => '1',
+ T1 => '1',
+ T2 => '1',
+ T2EX => '1',
+ RXD => RXD,
+ RXD_IsO => RXD_IsOut,
+ RXD_O => RXD_Out,
+ TXD => TXD,
+ XRAM_WE_O => XRAM_WE_s,
+ XRAM_STB_O => XRAM_STB_s,
+ XRAM_CYC_O => XRAM_CYC_s,
+ XRAM_ACK_I => XRAM_ACK_s,
+ XRAM_DAT_O => XRAM_DATO_s,
+ XRAM_ADR_O => XRAM_ADR_s,
+ XRAM_DAT_I => XRAM_DATI_s
+ );
+
+ P3(0) <= RXD;
+ P3(7 downto 1) <= P3_out(7 downto 1);
+ XRAM_DATI_s <= (others => '1');
+ XRAM_ACK_s <= XRAM_STB_s;
+
+ as : AsyncStim generic map(FileName => "BASIC.txt", InterCharDelay => 5000 us, Baud => 57600, Bits => 8)
+ port map(RXD);
+
+ al : AsyncLog generic map(FileName => "RX_Log.txt", Baud => 57600, Bits => 8)
+ port map(TXD);
+
+ Clk <= not Clk after 45 ns;
+ Rst_n <= '1' after 200 ns;
+
+ INT0 <= not INT0 after 100 us;
+
+end;
diff --git a/doc/Instruction Set.pdf b/doc/Instruction Set.pdf
new file mode 100644
index 0000000..b6a15eb
--- /dev/null
+++ b/doc/Instruction Set.pdf
Binary files differ
diff --git a/rtl/vhdl/ROM52_BASIC.vhd b/rtl/vhdl/ROM52_BASIC.vhd
new file mode 100644
index 0000000..f1ab75f
--- /dev/null
+++ b/rtl/vhdl/ROM52_BASIC.vhd
@@ -0,0 +1,8222 @@
+-- BASIC-52 with updated baud rate recognition
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+entity ROM52 is
+ port(
+ Clk : in std_logic;
+ A : in std_logic_vector(12 downto 0);
+ D : out std_logic_vector(7 downto 0)
+ );
+end ROM52;
+
+architecture rtl of ROM52 is
+ signal A_r : std_logic_vector(12 downto 0);
+begin
+ process (Clk)
+ begin
+ if Clk'event and Clk = '1' then
+ A_r <= A;
+ end if;
+ end process;
+ process (A_r)
+ begin
+ case to_integer(unsigned(A_r)) is
+ when 000000 => D <= "01100001"; -- 0x0000
+ when 000001 => D <= "10000111"; -- 0x0001
+ when 000002 => D <= "00110111"; -- 0x0002
+ when 000003 => D <= "00100000"; -- 0x0003
+ when 000004 => D <= "00110001"; -- 0x0004
+ when 000005 => D <= "00101101"; -- 0x0005
+ when 000006 => D <= "11000000"; -- 0x0006
+ when 000007 => D <= "11010000"; -- 0x0007
+ when 000008 => D <= "00000010"; -- 0x0008
+ when 000009 => D <= "01000000"; -- 0x0009
+ when 000010 => D <= "00000011"; -- 0x000A
+ when 000011 => D <= "11000000"; -- 0x000B
+ when 000012 => D <= "11010000"; -- 0x000C
+ when 000013 => D <= "00100000"; -- 0x000D
+ when 000014 => D <= "00101110"; -- 0x000E
+ when 000015 => D <= "00010000"; -- 0x000F
+ when 000016 => D <= "00000010"; -- 0x0010
+ when 000017 => D <= "01000000"; -- 0x0011
+ when 000018 => D <= "00001011"; -- 0x0012
+ when 000019 => D <= "00100000"; -- 0x0013
+ when 000020 => D <= "00010010"; -- 0x0014
+ when 000021 => D <= "00101011"; -- 0x0015
+ when 000022 => D <= "11000000"; -- 0x0016
+ when 000023 => D <= "11010000"; -- 0x0017
+ when 000024 => D <= "00000010"; -- 0x0018
+ when 000025 => D <= "01000000"; -- 0x0019
+ when 000026 => D <= "00010011"; -- 0x001A
+ when 000027 => D <= "11000000"; -- 0x001B
+ when 000028 => D <= "11010000"; -- 0x001C
+ when 000029 => D <= "00000010"; -- 0x001D
+ when 000030 => D <= "00011111"; -- 0x001E
+ when 000031 => D <= "01111000"; -- 0x001F
+ when 000032 => D <= "00000010"; -- 0x0020
+ when 000033 => D <= "00011000"; -- 0x0021
+ when 000034 => D <= "11111100"; -- 0x0022
+ when 000035 => D <= "11000000"; -- 0x0023
+ when 000036 => D <= "11010000"; -- 0x0024
+ when 000037 => D <= "00100000"; -- 0x0025
+ when 000038 => D <= "00011111"; -- 0x0026
+ when 000039 => D <= "00011100"; -- 0x0027
+ when 000040 => D <= "00000010"; -- 0x0028
+ when 000041 => D <= "01000000"; -- 0x0029
+ when 000042 => D <= "00100011"; -- 0x002A
+ when 000043 => D <= "11000000"; -- 0x002B
+ when 000044 => D <= "11010000"; -- 0x002C
+ when 000045 => D <= "00000010"; -- 0x002D
+ when 000046 => D <= "01000000"; -- 0x002E
+ when 000047 => D <= "00101011"; -- 0x002F
+ when 000048 => D <= "00000010"; -- 0x0030
+ when 000049 => D <= "00011001"; -- 0x0031
+ when 000050 => D <= "00110110"; -- 0x0032
+ when 000051 => D <= "00100000"; -- 0x0033
+ when 000052 => D <= "00100110"; -- 0x0034
+ when 000053 => D <= "00001000"; -- 0x0035
+ when 000054 => D <= "11000010"; -- 0x0036
+ when 000055 => D <= "10010110"; -- 0x0037
+ when 000056 => D <= "00110000"; -- 0x0038
+ when 000057 => D <= "10110010"; -- 0x0039
+ when 000058 => D <= "11111101"; -- 0x003A
+ when 000059 => D <= "11010010"; -- 0x003B
+ when 000060 => D <= "10010110"; -- 0x003C
+ when 000061 => D <= "00110010"; -- 0x003D
+ when 000062 => D <= "00000010"; -- 0x003E
+ when 000063 => D <= "00100000"; -- 0x003F
+ when 000064 => D <= "01000000"; -- 0x0040
+ when 000065 => D <= "11010010"; -- 0x0041
+ when 000066 => D <= "00010110"; -- 0x0042
+ when 000067 => D <= "00110010"; -- 0x0043
+ when 000068 => D <= "00000010"; -- 0x0044
+ when 000069 => D <= "00100000"; -- 0x0045
+ when 000070 => D <= "01010000"; -- 0x0046
+ when 000071 => D <= "00010111"; -- 0x0047
+ when 000072 => D <= "01111110"; -- 0x0048
+ when 000073 => D <= "00010010"; -- 0x0049
+ when 000074 => D <= "00001110"; -- 0x004A
+ when 000075 => D <= "00001111"; -- 0x004B
+ when 000076 => D <= "11100000"; -- 0x004C
+ when 000077 => D <= "00001111"; -- 0x004D
+ when 000078 => D <= "11010110"; -- 0x004E
+ when 000079 => D <= "00000100"; -- 0x004F
+ when 000080 => D <= "10010101"; -- 0x0050
+ when 000081 => D <= "00000110"; -- 0x0051
+ when 000082 => D <= "11010010"; -- 0x0052
+ when 000083 => D <= "00000110"; -- 0x0053
+ when 000084 => D <= "10111001"; -- 0x0054
+ when 000085 => D <= "00000110"; -- 0x0055
+ when 000086 => D <= "10011111"; -- 0x0056
+ when 000087 => D <= "00010011"; -- 0x0057
+ when 000088 => D <= "10010111"; -- 0x0058
+ when 000089 => D <= "00010011"; -- 0x0059
+ when 000090 => D <= "00010110"; -- 0x005A
+ when 000091 => D <= "00010001"; -- 0x005B
+ when 000092 => D <= "10011011"; -- 0x005C
+ when 000093 => D <= "00010111"; -- 0x005D
+ when 000094 => D <= "00111000"; -- 0x005E
+ when 000095 => D <= "00010011"; -- 0x005F
+ when 000096 => D <= "11110101"; -- 0x0060
+ when 000097 => D <= "00010111"; -- 0x0061
+ when 000098 => D <= "00010011"; -- 0x0062
+ when 000099 => D <= "00010100"; -- 0x0063
+ when 000100 => D <= "10000011"; -- 0x0064
+ when 000101 => D <= "00010100"; -- 0x0065
+ when 000102 => D <= "01101111"; -- 0x0066
+ when 000103 => D <= "00010100"; -- 0x0067
+ when 000104 => D <= "01111000"; -- 0x0068
+ when 000105 => D <= "00010011"; -- 0x0069
+ when 000106 => D <= "10001100"; -- 0x006A
+ when 000107 => D <= "00010011"; -- 0x006B
+ when 000108 => D <= "11000110"; -- 0x006C
+ when 000109 => D <= "00010011"; -- 0x006D
+ when 000110 => D <= "11010010"; -- 0x006E
+ when 000111 => D <= "00010011"; -- 0x006F
+ when 000112 => D <= "11010110"; -- 0x0070
+ when 000113 => D <= "00010011"; -- 0x0071
+ when 000114 => D <= "11001100"; -- 0x0072
+ when 000115 => D <= "00010011"; -- 0x0073
+ when 000116 => D <= "11000001"; -- 0x0074
+ when 000117 => D <= "00010011"; -- 0x0075
+ when 000118 => D <= "10110000"; -- 0x0076
+ when 000119 => D <= "00010011"; -- 0x0077
+ when 000120 => D <= "01111010"; -- 0x0078
+ when 000121 => D <= "00010011"; -- 0x0079
+ when 000122 => D <= "01011000"; -- 0x007A
+ when 000123 => D <= "00010011"; -- 0x007B
+ when 000124 => D <= "10000000"; -- 0x007C
+ when 000125 => D <= "00010100"; -- 0x007D
+ when 000126 => D <= "10000001"; -- 0x007E
+ when 000127 => D <= "00010001"; -- 0x007F
+ when 000128 => D <= "01011000"; -- 0x0080
+ when 000129 => D <= "00010001"; -- 0x0081
+ when 000130 => D <= "10111011"; -- 0x0082
+ when 000131 => D <= "00010001"; -- 0x0083
+ when 000132 => D <= "01011100"; -- 0x0084
+ when 000133 => D <= "00010010"; -- 0x0085
+ when 000134 => D <= "01111000"; -- 0x0086
+ when 000135 => D <= "00010011"; -- 0x0087
+ when 000136 => D <= "10011000"; -- 0x0088
+ when 000137 => D <= "00010011"; -- 0x0089
+ when 000138 => D <= "00010010"; -- 0x008A
+ when 000139 => D <= "00010001"; -- 0x008B
+ when 000140 => D <= "11001011"; -- 0x008C
+ when 000141 => D <= "00010010"; -- 0x008D
+ when 000142 => D <= "10101011"; -- 0x008E
+ when 000143 => D <= "00010011"; -- 0x008F
+ when 000144 => D <= "10100001"; -- 0x0090
+ when 000145 => D <= "00010011"; -- 0x0091
+ when 000146 => D <= "10101001"; -- 0x0092
+ when 000147 => D <= "00010100"; -- 0x0093
+ when 000148 => D <= "01101010"; -- 0x0094
+ when 000149 => D <= "00010011"; -- 0x0095
+ when 000150 => D <= "11011100"; -- 0x0096
+ when 000151 => D <= "00010100"; -- 0x0097
+ when 000152 => D <= "10010100"; -- 0x0098
+ when 000153 => D <= "00010111"; -- 0x0099
+ when 000154 => D <= "00001000"; -- 0x009A
+ when 000155 => D <= "00010111"; -- 0x009B
+ when 000156 => D <= "00011000"; -- 0x009C
+ when 000157 => D <= "00001111"; -- 0x009D
+ when 000158 => D <= "11011100"; -- 0x009E
+ when 000159 => D <= "00010110"; -- 0x009F
+ when 000160 => D <= "00111010"; -- 0x00A0
+ when 000161 => D <= "00010111"; -- 0x00A1
+ when 000162 => D <= "00100000"; -- 0x00A2
+ when 000163 => D <= "00010100"; -- 0x00A3
+ when 000164 => D <= "10100100"; -- 0x00A4
+ when 000165 => D <= "00010100"; -- 0x00A5
+ when 000166 => D <= "10101000"; -- 0x00A6
+ when 000167 => D <= "00010100"; -- 0x00A7
+ when 000168 => D <= "10101100"; -- 0x00A8
+ when 000169 => D <= "00010100"; -- 0x00A9
+ when 000170 => D <= "10110010"; -- 0x00AA
+ when 000171 => D <= "00010100"; -- 0x00AB
+ when 000172 => D <= "10111000"; -- 0x00AC
+ when 000173 => D <= "00010100"; -- 0x00AD
+ when 000174 => D <= "10111110"; -- 0x00AE
+ when 000175 => D <= "00010100"; -- 0x00AF
+ when 000176 => D <= "11000010"; -- 0x00B0
+ when 000177 => D <= "00010100"; -- 0x00B1
+ when 000178 => D <= "11000110"; -- 0x00B2
+ when 000179 => D <= "00010100"; -- 0x00B3
+ when 000180 => D <= "11001010"; -- 0x00B4
+ when 000181 => D <= "00010100"; -- 0x00B5
+ when 000182 => D <= "11010000"; -- 0x00B6
+ when 000183 => D <= "00010100"; -- 0x00B7
+ when 000184 => D <= "11010100"; -- 0x00B8
+ when 000185 => D <= "00001111"; -- 0x00B9
+ when 000186 => D <= "01000110"; -- 0x00BA
+ when 000187 => D <= "00010110"; -- 0x00BB
+ when 000188 => D <= "01000111"; -- 0x00BC
+ when 000189 => D <= "00010100"; -- 0x00BD
+ when 000190 => D <= "11011011"; -- 0x00BE
+ when 000191 => D <= "00010101"; -- 0x00BF
+ when 000192 => D <= "10100101"; -- 0x00C0
+ when 000193 => D <= "00010000"; -- 0x00C1
+ when 000194 => D <= "10000101"; -- 0x00C2
+ when 000195 => D <= "00001101"; -- 0x00C3
+ when 000196 => D <= "01101000"; -- 0x00C4
+ when 000197 => D <= "00001110"; -- 0x00C5
+ when 000198 => D <= "11010000"; -- 0x00C6
+ when 000199 => D <= "00001110"; -- 0x00C7
+ when 000200 => D <= "11011000"; -- 0x00C8
+ when 000201 => D <= "00000111"; -- 0x00C9
+ when 000202 => D <= "10001011"; -- 0x00CA
+ when 000203 => D <= "00001000"; -- 0x00CB
+ when 000204 => D <= "00001000"; -- 0x00CC
+ when 000205 => D <= "00000001"; -- 0x00CD
+ when 000206 => D <= "00001111"; -- 0x00CE
+ when 000207 => D <= "00001110"; -- 0x00CF
+ when 000208 => D <= "00001010"; -- 0x00D0
+ when 000209 => D <= "00001000"; -- 0x00D1
+ when 000210 => D <= "00001010"; -- 0x00D2
+ when 000211 => D <= "00001000"; -- 0x00D3
+ when 000212 => D <= "00000011"; -- 0x00D4
+ when 000213 => D <= "00000101"; -- 0x00D5
+ when 000214 => D <= "00000100"; -- 0x00D6
+ when 000215 => D <= "00001100"; -- 0x00D7
+ when 000216 => D <= "00000110"; -- 0x00D8
+ when 000217 => D <= "00000110"; -- 0x00D9
+ when 000218 => D <= "00000110"; -- 0x00DA
+ when 000219 => D <= "00000110"; -- 0x00DB
+ when 000220 => D <= "00000110"; -- 0x00DC
+ when 000221 => D <= "00000110"; -- 0x00DD
+ when 000222 => D <= "00001111"; -- 0x00DE
+ when 000223 => D <= "00001111"; -- 0x00DF
+ when 000224 => D <= "00001111"; -- 0x00E0
+ when 000225 => D <= "00001111"; -- 0x00E1
+ when 000226 => D <= "00001111"; -- 0x00E2
+ when 000227 => D <= "00001111"; -- 0x00E3
+ when 000228 => D <= "00001111"; -- 0x00E4
+ when 000229 => D <= "00001111"; -- 0x00E5
+ when 000230 => D <= "00001111"; -- 0x00E6
+ when 000231 => D <= "00001111"; -- 0x00E7
+ when 000232 => D <= "00001111"; -- 0x00E8
+ when 000233 => D <= "00001111"; -- 0x00E9
+ when 000234 => D <= "00001111"; -- 0x00EA
+ when 000235 => D <= "00001111"; -- 0x00EB
+ when 000236 => D <= "01010011"; -- 0x00EC
+ when 000237 => D <= "01010100"; -- 0x00ED
+ when 000238 => D <= "01001111"; -- 0x00EE
+ when 000239 => D <= "01010000"; -- 0x00EF
+ when 000240 => D <= "00100010"; -- 0x00F0
+ when 000241 => D <= "01010100"; -- 0x00F1
+ when 000242 => D <= "01010010"; -- 0x00F2
+ when 000243 => D <= "01011001"; -- 0x00F3
+ when 000244 => D <= "00100000"; -- 0x00F4
+ when 000245 => D <= "01000001"; -- 0x00F5
+ when 000246 => D <= "01000111"; -- 0x00F6
+ when 000247 => D <= "01000001"; -- 0x00F7
+ when 000248 => D <= "01001001"; -- 0x00F8
+ when 000249 => D <= "01001110"; -- 0x00F9
+ when 000250 => D <= "00100010"; -- 0x00FA
+ when 000251 => D <= "01010010"; -- 0x00FB
+ when 000252 => D <= "01000101"; -- 0x00FC
+ when 000253 => D <= "01000001"; -- 0x00FD
+ when 000254 => D <= "01000100"; -- 0x00FE
+ when 000255 => D <= "01011001"; -- 0x00FF
+ when 000256 => D <= "00100010"; -- 0x0100
+ when 000257 => D <= "00100000"; -- 0x0101
+ when 000258 => D <= "00101101"; -- 0x0102
+ when 000259 => D <= "00100000"; -- 0x0103
+ when 000260 => D <= "01001001"; -- 0x0104
+ when 000261 => D <= "01001110"; -- 0x0105
+ when 000262 => D <= "00100000"; -- 0x0106
+ when 000263 => D <= "01001100"; -- 0x0107
+ when 000264 => D <= "01001001"; -- 0x0108
+ when 000265 => D <= "01001110"; -- 0x0109
+ when 000266 => D <= "01000101"; -- 0x010A
+ when 000267 => D <= "00100000"; -- 0x010B
+ when 000268 => D <= "00100010"; -- 0x010C
+ when 000269 => D <= "00001000"; -- 0x010D
+ when 000270 => D <= "00001000"; -- 0x010E
+ when 000271 => D <= "00010000"; -- 0x010F
+ when 000272 => D <= "00110011"; -- 0x0110
+ when 000273 => D <= "00001011"; -- 0x0111
+ when 000274 => D <= "00001011"; -- 0x0112
+ when 000275 => D <= "00000110"; -- 0x0113
+ when 000276 => D <= "01010110"; -- 0x0114
+ when 000277 => D <= "00011000"; -- 0x0115
+ when 000278 => D <= "00111000"; -- 0x0116
+ when 000279 => D <= "00000100"; -- 0x0117
+ when 000280 => D <= "01100001"; -- 0x0118
+ when 000281 => D <= "00010111"; -- 0x0119
+ when 000282 => D <= "01101010"; -- 0x011A
+ when 000283 => D <= "00010111"; -- 0x011B
+ when 000284 => D <= "01110110"; -- 0x011C
+ when 000285 => D <= "00000101"; -- 0x011D
+ when 000286 => D <= "00110110"; -- 0x011E
+ when 000287 => D <= "00000100"; -- 0x011F
+ when 000288 => D <= "01011010"; -- 0x0120
+ when 000289 => D <= "00001001"; -- 0x0121
+ when 000290 => D <= "01110001"; -- 0x0122
+ when 000291 => D <= "00000110"; -- 0x0123
+ when 000292 => D <= "10001001"; -- 0x0124
+ when 000293 => D <= "00001010"; -- 0x0125
+ when 000294 => D <= "01111001"; -- 0x0126
+ when 000295 => D <= "00001010"; -- 0x0127
+ when 000296 => D <= "10101101"; -- 0x0128
+ when 000297 => D <= "00010110"; -- 0x0129
+ when 000298 => D <= "01111101"; -- 0x012A
+ when 000299 => D <= "00001100"; -- 0x012B
+ when 000300 => D <= "00101100"; -- 0x012C
+ when 000301 => D <= "00011001"; -- 0x012D
+ when 000302 => D <= "00100101"; -- 0x012E
+ when 000303 => D <= "00011001"; -- 0x012F
+ when 000304 => D <= "00101010"; -- 0x0130
+ when 000305 => D <= "00001010"; -- 0x0131
+ when 000306 => D <= "10000000"; -- 0x0132
+ when 000307 => D <= "00001100"; -- 0x0133
+ when 000308 => D <= "00110000"; -- 0x0134
+ when 000309 => D <= "00001110"; -- 0x0135
+ when 000310 => D <= "01100110"; -- 0x0136
+ when 000311 => D <= "00001101"; -- 0x0137
+ when 000312 => D <= "01100100"; -- 0x0138
+ when 000313 => D <= "00000110"; -- 0x0139
+ when 000314 => D <= "00000110"; -- 0x013A
+ when 000315 => D <= "00010110"; -- 0x013B
+ when 000316 => D <= "11110000"; -- 0x013C
+ when 000317 => D <= "00011001"; -- 0x013D
+ when 000318 => D <= "00010010"; -- 0x013E
+ when 000319 => D <= "00001100"; -- 0x013F
+ when 000320 => D <= "00101110"; -- 0x0140
+ when 000321 => D <= "00001000"; -- 0x0141
+ when 000322 => D <= "01011110"; -- 0x0142
+ when 000323 => D <= "00001110"; -- 0x0143
+ when 000324 => D <= "01011001"; -- 0x0144
+ when 000325 => D <= "00010100"; -- 0x0145
+ when 000326 => D <= "00000100"; -- 0x0146
+ when 000327 => D <= "00001011"; -- 0x0147
+ when 000328 => D <= "00010001"; -- 0x0148
+ when 000329 => D <= "00001111"; -- 0x0149
+ when 000330 => D <= "00001000"; -- 0x014A
+ when 000331 => D <= "00001011"; -- 0x014B
+ when 000332 => D <= "11010001"; -- 0x014C
+ when 000333 => D <= "00001110"; -- 0x014D
+ when 000334 => D <= "11111111"; -- 0x014E
+ when 000335 => D <= "00001011"; -- 0x014F
+ when 000336 => D <= "01100010"; -- 0x0150
+ when 000337 => D <= "00010011"; -- 0x0151
+ when 000338 => D <= "11111010"; -- 0x0152
+ when 000339 => D <= "00001100"; -- 0x0153
+ when 000340 => D <= "11101110"; -- 0x0154
+ when 000341 => D <= "00001101"; -- 0x0155
+ when 000342 => D <= "11111000"; -- 0x0156
+ when 000343 => D <= "00001011"; -- 0x0157
+ when 000344 => D <= "11100110"; -- 0x0158
+ when 000345 => D <= "00001110"; -- 0x0159
+ when 000346 => D <= "11101111"; -- 0x015A
+ when 000347 => D <= "00001011"; -- 0x015B
+ when 000348 => D <= "00010011"; -- 0x015C
+ when 000349 => D <= "00001010"; -- 0x015D
+ when 000350 => D <= "10001001"; -- 0x015E
+ when 000351 => D <= "00001011"; -- 0x015F
+ when 000352 => D <= "00110000"; -- 0x0160
+ when 000353 => D <= "00001010"; -- 0x0161
+ when 000354 => D <= "00111111"; -- 0x0162
+ when 000355 => D <= "00001010"; -- 0x0163
+ when 000356 => D <= "11111111"; -- 0x0164
+ when 000357 => D <= "00001011"; -- 0x0165
+ when 000358 => D <= "00000100"; -- 0x0166
+ when 000359 => D <= "00010111"; -- 0x0167
+ when 000360 => D <= "01111110"; -- 0x0168
+ when 000361 => D <= "00011000"; -- 0x0169
+ when 000362 => D <= "01010101"; -- 0x016A
+ when 000363 => D <= "00001111"; -- 0x016B
+ when 000364 => D <= "11101000"; -- 0x016C
+ when 000365 => D <= "00001111"; -- 0x016D
+ when 000366 => D <= "11101100"; -- 0x016E
+ when 000367 => D <= "00000101"; -- 0x016F
+ when 000368 => D <= "00001100"; -- 0x0170
+ when 000369 => D <= "00000111"; -- 0x0171
+ when 000370 => D <= "10111110"; -- 0x0172
+ when 000371 => D <= "10000000"; -- 0x0173
+ when 000372 => D <= "01001100"; -- 0x0174
+ when 000373 => D <= "01000101"; -- 0x0175
+ when 000374 => D <= "01010100"; -- 0x0176
+ when 000375 => D <= "10000001"; -- 0x0177
+ when 000376 => D <= "01000011"; -- 0x0178
+ when 000377 => D <= "01001100"; -- 0x0179
+ when 000378 => D <= "01000101"; -- 0x017A
+ when 000379 => D <= "01000001"; -- 0x017B
+ when 000380 => D <= "01010010"; -- 0x017C
+ when 000381 => D <= "10000010"; -- 0x017D
+ when 000382 => D <= "01010000"; -- 0x017E
+ when 000383 => D <= "01010101"; -- 0x017F
+ when 000384 => D <= "01010011"; -- 0x0180
+ when 000385 => D <= "01001000"; -- 0x0181
+ when 000386 => D <= "10000011"; -- 0x0182
+ when 000387 => D <= "01000111"; -- 0x0183
+ when 000388 => D <= "01001111"; -- 0x0184
+ when 000389 => D <= "01010100"; -- 0x0185
+ when 000390 => D <= "01001111"; -- 0x0186
+ when 000391 => D <= "10000100"; -- 0x0187
+ when 000392 => D <= "01010000"; -- 0x0188
+ when 000393 => D <= "01010111"; -- 0x0189
+ when 000394 => D <= "01001101"; -- 0x018A
+ when 000395 => D <= "10000101"; -- 0x018B
+ when 000396 => D <= "01010000"; -- 0x018C
+ when 000397 => D <= "01001000"; -- 0x018D
+ when 000398 => D <= "00110000"; -- 0x018E
+ when 000399 => D <= "00101110"; -- 0x018F
+ when 000400 => D <= "10000110"; -- 0x0190
+ when 000401 => D <= "01010101"; -- 0x0191
+ when 000402 => D <= "01001001"; -- 0x0192
+ when 000403 => D <= "10000111"; -- 0x0193
+ when 000404 => D <= "01010101"; -- 0x0194
+ when 000405 => D <= "01001111"; -- 0x0195
+ when 000406 => D <= "10001000"; -- 0x0196
+ when 000407 => D <= "01010000"; -- 0x0197
+ when 000408 => D <= "01001111"; -- 0x0198
+ when 000409 => D <= "01010000"; -- 0x0199
+ when 000410 => D <= "10001001"; -- 0x019A
+ when 000411 => D <= "01010000"; -- 0x019B
+ when 000412 => D <= "01010010"; -- 0x019C
+ when 000413 => D <= "01001001"; -- 0x019D
+ when 000414 => D <= "01001110"; -- 0x019E
+ when 000415 => D <= "01010100"; -- 0x019F
+ when 000416 => D <= "10001001"; -- 0x01A0
+ when 000417 => D <= "01010000"; -- 0x01A1
+ when 000418 => D <= "00101110"; -- 0x01A2
+ when 000419 => D <= "10001001"; -- 0x01A3
+ when 000420 => D <= "00111111"; -- 0x01A4
+ when 000421 => D <= "10001010"; -- 0x01A5
+ when 000422 => D <= "01000011"; -- 0x01A6
+ when 000423 => D <= "01000001"; -- 0x01A7
+ when 000424 => D <= "01001100"; -- 0x01A8
+ when 000425 => D <= "01001100"; -- 0x01A9
+ when 000426 => D <= "10001011"; -- 0x01AA
+ when 000427 => D <= "01000100"; -- 0x01AB
+ when 000428 => D <= "01001001"; -- 0x01AC
+ when 000429 => D <= "01001101"; -- 0x01AD
+ when 000430 => D <= "10001100"; -- 0x01AE
+ when 000431 => D <= "01010011"; -- 0x01AF
+ when 000432 => D <= "01010100"; -- 0x01B0
+ when 000433 => D <= "01010010"; -- 0x01B1
+ when 000434 => D <= "01001001"; -- 0x01B2
+ when 000435 => D <= "01001110"; -- 0x01B3
+ when 000436 => D <= "01000111"; -- 0x01B4
+ when 000437 => D <= "10001101"; -- 0x01B5
+ when 000438 => D <= "01000010"; -- 0x01B6
+ when 000439 => D <= "01000001"; -- 0x01B7
+ when 000440 => D <= "01010101"; -- 0x01B8
+ when 000441 => D <= "01000100"; -- 0x01B9
+ when 000442 => D <= "10001110"; -- 0x01BA
+ when 000443 => D <= "01000011"; -- 0x01BB
+ when 000444 => D <= "01001100"; -- 0x01BC
+ when 000445 => D <= "01001111"; -- 0x01BD
+ when 000446 => D <= "01000011"; -- 0x01BE
+ when 000447 => D <= "01001011"; -- 0x01BF
+ when 000448 => D <= "10001111"; -- 0x01C0
+ when 000449 => D <= "01010000"; -- 0x01C1
+ when 000450 => D <= "01001000"; -- 0x01C2
+ when 000451 => D <= "00110001"; -- 0x01C3
+ when 000452 => D <= "00101110"; -- 0x01C4
+ when 000453 => D <= "10010000"; -- 0x01C5
+ when 000454 => D <= "01010011"; -- 0x01C6
+ when 000455 => D <= "01010100"; -- 0x01C7
+ when 000456 => D <= "01001111"; -- 0x01C8
+ when 000457 => D <= "01010000"; -- 0x01C9
+ when 000458 => D <= "10010001"; -- 0x01CA
+ when 000459 => D <= "01001111"; -- 0x01CB
+ when 000460 => D <= "01001110"; -- 0x01CC
+ when 000461 => D <= "01010100"; -- 0x01CD
+ when 000462 => D <= "01001001"; -- 0x01CE
+ when 000463 => D <= "01001101"; -- 0x01CF
+ when 000464 => D <= "01000101"; -- 0x01D0
+ when 000465 => D <= "10010010"; -- 0x01D1
+ when 000466 => D <= "01001111"; -- 0x01D2
+ when 000467 => D <= "01001110"; -- 0x01D3
+ when 000468 => D <= "01000101"; -- 0x01D4
+ when 000469 => D <= "01011000"; -- 0x01D5
+ when 000470 => D <= "00110001"; -- 0x01D6
+ when 000471 => D <= "10010011"; -- 0x01D7
+ when 000472 => D <= "01010010"; -- 0x01D8
+ when 000473 => D <= "01000101"; -- 0x01D9
+ when 000474 => D <= "01010100"; -- 0x01DA
+ when 000475 => D <= "01001001"; -- 0x01DB
+ when 000476 => D <= "10010100"; -- 0x01DC
+ when 000477 => D <= "01000100"; -- 0x01DD
+ when 000478 => D <= "01001111"; -- 0x01DE
+ when 000479 => D <= "10010101"; -- 0x01DF
+ when 000480 => D <= "01010010"; -- 0x01E0
+ when 000481 => D <= "01000101"; -- 0x01E1
+ when 000482 => D <= "01010011"; -- 0x01E2
+ when 000483 => D <= "01010100"; -- 0x01E3
+ when 000484 => D <= "01001111"; -- 0x01E4
+ when 000485 => D <= "01010010"; -- 0x01E5
+ when 000486 => D <= "01000101"; -- 0x01E6
+ when 000487 => D <= "10010110"; -- 0x01E7
+ when 000488 => D <= "01010010"; -- 0x01E8
+ when 000489 => D <= "01000101"; -- 0x01E9
+ when 000490 => D <= "01001101"; -- 0x01EA
+ when 000491 => D <= "10010111"; -- 0x01EB
+ when 000492 => D <= "01001110"; -- 0x01EC
+ when 000493 => D <= "01000101"; -- 0x01ED
+ when 000494 => D <= "01011000"; -- 0x01EE
+ when 000495 => D <= "01010100"; -- 0x01EF
+ when 000496 => D <= "10011000"; -- 0x01F0
+ when 000497 => D <= "01001111"; -- 0x01F1
+ when 000498 => D <= "01001110"; -- 0x01F2
+ when 000499 => D <= "01000101"; -- 0x01F3
+ when 000500 => D <= "01010010"; -- 0x01F4
+ when 000501 => D <= "01010010"; -- 0x01F5
+ when 000502 => D <= "10011001"; -- 0x01F6
+ when 000503 => D <= "01001111"; -- 0x01F7
+ when 000504 => D <= "01001110"; -- 0x01F8
+ when 000505 => D <= "10011010"; -- 0x01F9
+ when 000506 => D <= "01001001"; -- 0x01FA
+ when 000507 => D <= "01001110"; -- 0x01FB
+ when 000508 => D <= "01010000"; -- 0x01FC
+ when 000509 => D <= "01010101"; -- 0x01FD
+ when 000510 => D <= "01010100"; -- 0x01FE
+ when 000511 => D <= "10011011"; -- 0x01FF
+ when 000512 => D <= "01010010"; -- 0x0200
+ when 000513 => D <= "01000101"; -- 0x0201
+ when 000514 => D <= "01000001"; -- 0x0202
+ when 000515 => D <= "01000100"; -- 0x0203
+ when 000516 => D <= "10011100"; -- 0x0204
+ when 000517 => D <= "01000100"; -- 0x0205
+ when 000518 => D <= "01000001"; -- 0x0206
+ when 000519 => D <= "01010100"; -- 0x0207
+ when 000520 => D <= "01000001"; -- 0x0208
+ when 000521 => D <= "10011101"; -- 0x0209
+ when 000522 => D <= "01010010"; -- 0x020A
+ when 000523 => D <= "01000101"; -- 0x020B
+ when 000524 => D <= "01010100"; -- 0x020C
+ when 000525 => D <= "01010101"; -- 0x020D
+ when 000526 => D <= "01010010"; -- 0x020E
+ when 000527 => D <= "01001110"; -- 0x020F
+ when 000528 => D <= "10011110"; -- 0x0210
+ when 000529 => D <= "01001001"; -- 0x0211
+ when 000530 => D <= "01000110"; -- 0x0212
+ when 000531 => D <= "10011111"; -- 0x0213
+ when 000532 => D <= "01000111"; -- 0x0214
+ when 000533 => D <= "01001111"; -- 0x0215
+ when 000534 => D <= "01010011"; -- 0x0216
+ when 000535 => D <= "01010101"; -- 0x0217
+ when 000536 => D <= "01000010"; -- 0x0218
+ when 000537 => D <= "10100000"; -- 0x0219
+ when 000538 => D <= "01000110"; -- 0x021A
+ when 000539 => D <= "01001111"; -- 0x021B
+ when 000540 => D <= "01010010"; -- 0x021C
+ when 000541 => D <= "10100001"; -- 0x021D
+ when 000542 => D <= "01010111"; -- 0x021E
+ when 000543 => D <= "01001000"; -- 0x021F
+ when 000544 => D <= "01001001"; -- 0x0220
+ when 000545 => D <= "01001100"; -- 0x0221
+ when 000546 => D <= "01000101"; -- 0x0222
+ when 000547 => D <= "10100010"; -- 0x0223
+ when 000548 => D <= "01010101"; -- 0x0224
+ when 000549 => D <= "01001110"; -- 0x0225
+ when 000550 => D <= "01010100"; -- 0x0226
+ when 000551 => D <= "01001001"; -- 0x0227
+ when 000552 => D <= "01001100"; -- 0x0228
+ when 000553 => D <= "10100011"; -- 0x0229
+ when 000554 => D <= "01000101"; -- 0x022A
+ when 000555 => D <= "01001110"; -- 0x022B
+ when 000556 => D <= "01000100"; -- 0x022C
+ when 000557 => D <= "10100100"; -- 0x022D
+ when 000558 => D <= "01010100"; -- 0x022E
+ when 000559 => D <= "01000001"; -- 0x022F
+ when 000560 => D <= "01000010"; -- 0x0230
+ when 000561 => D <= "10100101"; -- 0x0231
+ when 000562 => D <= "01010100"; -- 0x0232
+ when 000563 => D <= "01001000"; -- 0x0233
+ when 000564 => D <= "01000101"; -- 0x0234
+ when 000565 => D <= "01001110"; -- 0x0235
+ when 000566 => D <= "10100110"; -- 0x0236
+ when 000567 => D <= "01010100"; -- 0x0237
+ when 000568 => D <= "01001111"; -- 0x0238
+ when 000569 => D <= "10100111"; -- 0x0239
+ when 000570 => D <= "01010011"; -- 0x023A
+ when 000571 => D <= "01010100"; -- 0x023B
+ when 000572 => D <= "01000101"; -- 0x023C
+ when 000573 => D <= "01010000"; -- 0x023D
+ when 000574 => D <= "10101000"; -- 0x023E
+ when 000575 => D <= "01000101"; -- 0x023F
+ when 000576 => D <= "01001100"; -- 0x0240
+ when 000577 => D <= "01010011"; -- 0x0241
+ when 000578 => D <= "01000101"; -- 0x0242
+ when 000579 => D <= "10101001"; -- 0x0243
+ when 000580 => D <= "01010011"; -- 0x0244
+ when 000581 => D <= "01010000"; -- 0x0245
+ when 000582 => D <= "01000011"; -- 0x0246
+ when 000583 => D <= "10101010"; -- 0x0247
+ when 000584 => D <= "01000011"; -- 0x0248
+ when 000585 => D <= "01010010"; -- 0x0249
+ when 000586 => D <= "10101011"; -- 0x024A
+ when 000587 => D <= "01001001"; -- 0x024B
+ when 000588 => D <= "01000100"; -- 0x024C
+ when 000589 => D <= "01001100"; -- 0x024D
+ when 000590 => D <= "01000101"; -- 0x024E
+ when 000591 => D <= "10101100"; -- 0x024F
+ when 000592 => D <= "01010011"; -- 0x0250
+ when 000593 => D <= "01010100"; -- 0x0251
+ when 000594 => D <= "01000000"; -- 0x0252
+ when 000595 => D <= "10101101"; -- 0x0253
+ when 000596 => D <= "01001100"; -- 0x0254
+ when 000597 => D <= "01000100"; -- 0x0255
+ when 000598 => D <= "01000000"; -- 0x0256
+ when 000599 => D <= "10101110"; -- 0x0257
+ when 000600 => D <= "01010000"; -- 0x0258
+ when 000601 => D <= "01000111"; -- 0x0259
+ when 000602 => D <= "01001101"; -- 0x025A
+ when 000603 => D <= "10101111"; -- 0x025B
+ when 000604 => D <= "01010010"; -- 0x025C
+ when 000605 => D <= "01010010"; -- 0x025D
+ when 000606 => D <= "01001111"; -- 0x025E
+ when 000607 => D <= "01001101"; -- 0x025F
+ when 000608 => D <= "11100000"; -- 0x0260
+ when 000609 => D <= "00101000"; -- 0x0261
+ when 000610 => D <= "11100001"; -- 0x0262
+ when 000611 => D <= "00101010"; -- 0x0263
+ when 000612 => D <= "00101010"; -- 0x0264
+ when 000613 => D <= "11100010"; -- 0x0265
+ when 000614 => D <= "00101010"; -- 0x0266
+ when 000615 => D <= "11100011"; -- 0x0267
+ when 000616 => D <= "00101011"; -- 0x0268
+ when 000617 => D <= "11100100"; -- 0x0269
+ when 000618 => D <= "00101111"; -- 0x026A
+ when 000619 => D <= "11100101"; -- 0x026B
+ when 000620 => D <= "00101101"; -- 0x026C
+ when 000621 => D <= "11100110"; -- 0x026D
+ when 000622 => D <= "00101110"; -- 0x026E
+ when 000623 => D <= "01011000"; -- 0x026F
+ when 000624 => D <= "01001111"; -- 0x0270
+ when 000625 => D <= "01010010"; -- 0x0271
+ when 000626 => D <= "00101110"; -- 0x0272
+ when 000627 => D <= "11100111"; -- 0x0273
+ when 000628 => D <= "00101110"; -- 0x0274
+ when 000629 => D <= "01000001"; -- 0x0275
+ when 000630 => D <= "01001110"; -- 0x0276
+ when 000631 => D <= "01000100"; -- 0x0277
+ when 000632 => D <= "00101110"; -- 0x0278
+ when 000633 => D <= "11101000"; -- 0x0279
+ when 000634 => D <= "00101110"; -- 0x027A
+ when 000635 => D <= "01001111"; -- 0x027B
+ when 000636 => D <= "01010010"; -- 0x027C
+ when 000637 => D <= "00101110"; -- 0x027D
+ when 000638 => D <= "11101010"; -- 0x027E
+ when 000639 => D <= "00111101"; -- 0x027F
+ when 000640 => D <= "11101011"; -- 0x0280
+ when 000641 => D <= "00111110"; -- 0x0281
+ when 000642 => D <= "00111101"; -- 0x0282
+ when 000643 => D <= "11101100"; -- 0x0283
+ when 000644 => D <= "00111100"; -- 0x0284
+ when 000645 => D <= "00111101"; -- 0x0285
+ when 000646 => D <= "11101101"; -- 0x0286
+ when 000647 => D <= "00111100"; -- 0x0287
+ when 000648 => D <= "00111110"; -- 0x0288
+ when 000649 => D <= "11101110"; -- 0x0289
+ when 000650 => D <= "00111100"; -- 0x028A
+ when 000651 => D <= "11101111"; -- 0x028B
+ when 000652 => D <= "00111110"; -- 0x028C
+ when 000653 => D <= "10110000"; -- 0x028D
+ when 000654 => D <= "01000001"; -- 0x028E
+ when 000655 => D <= "01000010"; -- 0x028F
+ when 000656 => D <= "01010011"; -- 0x0290
+ when 000657 => D <= "10110001"; -- 0x0291
+ when 000658 => D <= "01001001"; -- 0x0292
+ when 000659 => D <= "01001110"; -- 0x0293
+ when 000660 => D <= "01010100"; -- 0x0294
+ when 000661 => D <= "10110010"; -- 0x0295
+ when 000662 => D <= "01010011"; -- 0x0296
+ when 000663 => D <= "01000111"; -- 0x0297
+ when 000664 => D <= "01001110"; -- 0x0298
+ when 000665 => D <= "10110011"; -- 0x0299
+ when 000666 => D <= "01001110"; -- 0x029A
+ when 000667 => D <= "01001111"; -- 0x029B
+ when 000668 => D <= "01010100"; -- 0x029C
+ when 000669 => D <= "10110100"; -- 0x029D
+ when 000670 => D <= "01000011"; -- 0x029E
+ when 000671 => D <= "01001111"; -- 0x029F
+ when 000672 => D <= "01010011"; -- 0x02A0
+ when 000673 => D <= "10110101"; -- 0x02A1
+ when 000674 => D <= "01010100"; -- 0x02A2
+ when 000675 => D <= "01000001"; -- 0x02A3
+ when 000676 => D <= "01001110"; -- 0x02A4
+ when 000677 => D <= "10110110"; -- 0x02A5
+ when 000678 => D <= "01010011"; -- 0x02A6
+ when 000679 => D <= "01001001"; -- 0x02A7
+ when 000680 => D <= "01001110"; -- 0x02A8
+ when 000681 => D <= "10110111"; -- 0x02A9
+ when 000682 => D <= "01010011"; -- 0x02AA
+ when 000683 => D <= "01010001"; -- 0x02AB
+ when 000684 => D <= "01010010"; -- 0x02AC
+ when 000685 => D <= "10111000"; -- 0x02AD
+ when 000686 => D <= "01000011"; -- 0x02AE
+ when 000687 => D <= "01000010"; -- 0x02AF
+ when 000688 => D <= "01011001"; -- 0x02B0
+ when 000689 => D <= "10111001"; -- 0x02B1
+ when 000690 => D <= "01000101"; -- 0x02B2
+ when 000691 => D <= "01011000"; -- 0x02B3
+ when 000692 => D <= "01010000"; -- 0x02B4
+ when 000693 => D <= "10111010"; -- 0x02B5
+ when 000694 => D <= "01000001"; -- 0x02B6
+ when 000695 => D <= "01010100"; -- 0x02B7
+ when 000696 => D <= "01001110"; -- 0x02B8
+ when 000697 => D <= "10111011"; -- 0x02B9
+ when 000698 => D <= "01001100"; -- 0x02BA
+ when 000699 => D <= "01001111"; -- 0x02BB
+ when 000700 => D <= "01000111"; -- 0x02BC
+ when 000701 => D <= "10111100"; -- 0x02BD
+ when 000702 => D <= "01000100"; -- 0x02BE
+ when 000703 => D <= "01000010"; -- 0x02BF
+ when 000704 => D <= "01011001"; -- 0x02C0
+ when 000705 => D <= "10111101"; -- 0x02C1
+ when 000706 => D <= "01011000"; -- 0x02C2
+ when 000707 => D <= "01000010"; -- 0x02C3
+ when 000708 => D <= "01011001"; -- 0x02C4
+ when 000709 => D <= "10111110"; -- 0x02C5
+ when 000710 => D <= "01010000"; -- 0x02C6
+ when 000711 => D <= "01001001"; -- 0x02C7
+ when 000712 => D <= "10111111"; -- 0x02C8
+ when 000713 => D <= "01010010"; -- 0x02C9
+ when 000714 => D <= "01001110"; -- 0x02CA
+ when 000715 => D <= "01000100"; -- 0x02CB
+ when 000716 => D <= "11000000"; -- 0x02CC
+ when 000717 => D <= "01000111"; -- 0x02CD
+ when 000718 => D <= "01000101"; -- 0x02CE
+ when 000719 => D <= "01010100"; -- 0x02CF
+ when 000720 => D <= "11000001"; -- 0x02D0
+ when 000721 => D <= "01000110"; -- 0x02D1
+ when 000722 => D <= "01010010"; -- 0x02D2
+ when 000723 => D <= "01000101"; -- 0x02D3
+ when 000724 => D <= "01000101"; -- 0x02D4
+ when 000725 => D <= "11000010"; -- 0x02D5
+ when 000726 => D <= "01001100"; -- 0x02D6
+ when 000727 => D <= "01000101"; -- 0x02D7
+ when 000728 => D <= "01001110"; -- 0x02D8
+ when 000729 => D <= "11000011"; -- 0x02D9
+ when 000730 => D <= "01011000"; -- 0x02DA
+ when 000731 => D <= "01010100"; -- 0x02DB
+ when 000732 => D <= "01000001"; -- 0x02DC
+ when 000733 => D <= "01001100"; -- 0x02DD
+ when 000734 => D <= "11000100"; -- 0x02DE
+ when 000735 => D <= "01001101"; -- 0x02DF
+ when 000736 => D <= "01010100"; -- 0x02E0
+ when 000737 => D <= "01001111"; -- 0x02E1
+ when 000738 => D <= "01010000"; -- 0x02E2
+ when 000739 => D <= "11000110"; -- 0x02E3
+ when 000740 => D <= "01001001"; -- 0x02E4
+ when 000741 => D <= "01000101"; -- 0x02E5
+ when 000742 => D <= "11000111"; -- 0x02E6
+ when 000743 => D <= "01001001"; -- 0x02E7
+ when 000744 => D <= "01010000"; -- 0x02E8
+ when 000745 => D <= "11001000"; -- 0x02E9
+ when 000746 => D <= "01010100"; -- 0x02EA
+ when 000747 => D <= "01001001"; -- 0x02EB
+ when 000748 => D <= "01001101"; -- 0x02EC
+ when 000749 => D <= "01000101"; -- 0x02ED
+ when 000750 => D <= "01010010"; -- 0x02EE
+ when 000751 => D <= "00110000"; -- 0x02EF
+ when 000752 => D <= "11001001"; -- 0x02F0
+ when 000753 => D <= "01010100"; -- 0x02F1
+ when 000754 => D <= "01001001"; -- 0x02F2
+ when 000755 => D <= "01001101"; -- 0x02F3
+ when 000756 => D <= "01000101"; -- 0x02F4
+ when 000757 => D <= "01010010"; -- 0x02F5
+ when 000758 => D <= "00110001"; -- 0x02F6
+ when 000759 => D <= "11001010"; -- 0x02F7
+ when 000760 => D <= "01010100"; -- 0x02F8
+ when 000761 => D <= "01001001"; -- 0x02F9
+ when 000762 => D <= "01001101"; -- 0x02FA
+ when 000763 => D <= "01000101"; -- 0x02FB
+ when 000764 => D <= "01010010"; -- 0x02FC
+ when 000765 => D <= "00110010"; -- 0x02FD
+ when 000766 => D <= "11000101"; -- 0x02FE
+ when 000767 => D <= "01010100"; -- 0x02FF
+ when 000768 => D <= "01001001"; -- 0x0300
+ when 000769 => D <= "01001101"; -- 0x0301
+ when 000770 => D <= "01000101"; -- 0x0302
+ when 000771 => D <= "11001011"; -- 0x0303
+ when 000772 => D <= "01010100"; -- 0x0304
+ when 000773 => D <= "00110010"; -- 0x0305
+ when 000774 => D <= "01000011"; -- 0x0306
+ when 000775 => D <= "01001111"; -- 0x0307
+ when 000776 => D <= "01001110"; -- 0x0308
+ when 000777 => D <= "11001100"; -- 0x0309
+ when 000778 => D <= "01010100"; -- 0x030A
+ when 000779 => D <= "01000011"; -- 0x030B
+ when 000780 => D <= "01001111"; -- 0x030C
+ when 000781 => D <= "01001110"; -- 0x030D
+ when 000782 => D <= "11001101"; -- 0x030E
+ when 000783 => D <= "01010100"; -- 0x030F
+ when 000784 => D <= "01001101"; -- 0x0310
+ when 000785 => D <= "01001111"; -- 0x0311
+ when 000786 => D <= "01000100"; -- 0x0312
+ when 000787 => D <= "11001110"; -- 0x0313
+ when 000788 => D <= "01010010"; -- 0x0314
+ when 000789 => D <= "01000011"; -- 0x0315
+ when 000790 => D <= "01000001"; -- 0x0316
+ when 000791 => D <= "01010000"; -- 0x0317
+ when 000792 => D <= "00110010"; -- 0x0318
+ when 000793 => D <= "11001111"; -- 0x0319
+ when 000794 => D <= "01010000"; -- 0x031A
+ when 000795 => D <= "01001111"; -- 0x031B
+ when 000796 => D <= "01010010"; -- 0x031C
+ when 000797 => D <= "01010100"; -- 0x031D
+ when 000798 => D <= "00110001"; -- 0x031E
+ when 000799 => D <= "11010000"; -- 0x031F
+ when 000800 => D <= "01010000"; -- 0x0320
+ when 000801 => D <= "01000011"; -- 0x0321
+ when 000802 => D <= "01001111"; -- 0x0322
+ when 000803 => D <= "01001110"; -- 0x0323
+ when 000804 => D <= "11010001"; -- 0x0324
+ when 000805 => D <= "01000001"; -- 0x0325
+ when 000806 => D <= "01010011"; -- 0x0326
+ when 000807 => D <= "01000011"; -- 0x0327
+ when 000808 => D <= "00101000"; -- 0x0328
+ when 000809 => D <= "11010010"; -- 0x0329
+ when 000810 => D <= "01010101"; -- 0x032A
+ when 000811 => D <= "01010011"; -- 0x032B
+ when 000812 => D <= "01001001"; -- 0x032C
+ when 000813 => D <= "01001110"; -- 0x032D
+ when 000814 => D <= "01000111"; -- 0x032E
+ when 000815 => D <= "00101000"; -- 0x032F
+ when 000816 => D <= "11010010"; -- 0x0330
+ when 000817 => D <= "01010101"; -- 0x0331
+ when 000818 => D <= "00101110"; -- 0x0332
+ when 000819 => D <= "00101000"; -- 0x0333
+ when 000820 => D <= "11010011"; -- 0x0334
+ when 000821 => D <= "01000011"; -- 0x0335
+ when 000822 => D <= "01001000"; -- 0x0336
+ when 000823 => D <= "01010010"; -- 0x0337
+ when 000824 => D <= "00101000"; -- 0x0338
+ when 000825 => D <= "11110000"; -- 0x0339
+ when 000826 => D <= "01010010"; -- 0x033A
+ when 000827 => D <= "01010101"; -- 0x033B
+ when 000828 => D <= "01001110"; -- 0x033C
+ when 000829 => D <= "11110001"; -- 0x033D
+ when 000830 => D <= "01001100"; -- 0x033E
+ when 000831 => D <= "01001001"; -- 0x033F
+ when 000832 => D <= "01010011"; -- 0x0340
+ when 000833 => D <= "01010100"; -- 0x0341
+ when 000834 => D <= "11110010"; -- 0x0342
+ when 000835 => D <= "01001110"; -- 0x0343
+ when 000836 => D <= "01010101"; -- 0x0344
+ when 000837 => D <= "01001100"; -- 0x0345
+ when 000838 => D <= "01001100"; -- 0x0346
+ when 000839 => D <= "11110011"; -- 0x0347
+ when 000840 => D <= "01001110"; -- 0x0348
+ when 000841 => D <= "01000101"; -- 0x0349
+ when 000842 => D <= "01010111"; -- 0x034A
+ when 000843 => D <= "11110100"; -- 0x034B
+ when 000844 => D <= "01000011"; -- 0x034C
+ when 000845 => D <= "01001111"; -- 0x034D
+ when 000846 => D <= "01001110"; -- 0x034E
+ when 000847 => D <= "01010100"; -- 0x034F
+ when 000848 => D <= "11110101"; -- 0x0350
+ when 000849 => D <= "01010000"; -- 0x0351
+ when 000850 => D <= "01010010"; -- 0x0352
+ when 000851 => D <= "01001111"; -- 0x0353
+ when 000852 => D <= "01000111"; -- 0x0354
+ when 000853 => D <= "11110110"; -- 0x0355
+ when 000854 => D <= "01011000"; -- 0x0356
+ when 000855 => D <= "01000110"; -- 0x0357
+ when 000856 => D <= "01000101"; -- 0x0358
+ when 000857 => D <= "01010010"; -- 0x0359
+ when 000858 => D <= "11110111"; -- 0x035A
+ when 000859 => D <= "01010010"; -- 0x035B
+ when 000860 => D <= "01000001"; -- 0x035C
+ when 000861 => D <= "01001101"; -- 0x035D
+ when 000862 => D <= "11111000"; -- 0x035E
+ when 000863 => D <= "01010010"; -- 0x035F
+ when 000864 => D <= "01001111"; -- 0x0360
+ when 000865 => D <= "01001101"; -- 0x0361
+ when 000866 => D <= "11111001"; -- 0x0362
+ when 000867 => D <= "01000110"; -- 0x0363
+ when 000868 => D <= "01010000"; -- 0x0364
+ when 000869 => D <= "01010010"; -- 0x0365
+ when 000870 => D <= "01001111"; -- 0x0366
+ when 000871 => D <= "01000111"; -- 0x0367
+ when 000872 => D <= "11111111"; -- 0x0368
+ when 000873 => D <= "01000101"; -- 0x0369
+ when 000874 => D <= "01011000"; -- 0x036A
+ when 000875 => D <= "01010100"; -- 0x036B
+ when 000876 => D <= "01010010"; -- 0x036C
+ when 000877 => D <= "01000001"; -- 0x036D
+ when 000878 => D <= "00100000"; -- 0x036E
+ when 000879 => D <= "01001001"; -- 0x036F
+ when 000880 => D <= "01000111"; -- 0x0370
+ when 000881 => D <= "01001110"; -- 0x0371
+ when 000882 => D <= "01001111"; -- 0x0372
+ when 000883 => D <= "01010010"; -- 0x0373
+ when 000884 => D <= "01000101"; -- 0x0374
+ when 000885 => D <= "01000100"; -- 0x0375
+ when 000886 => D <= "00100010"; -- 0x0376
+ when 000887 => D <= "01000001"; -- 0x0377
+ when 000888 => D <= "00101101"; -- 0x0378
+ when 000889 => D <= "01010011"; -- 0x0379
+ when 000890 => D <= "01010100"; -- 0x037A
+ when 000891 => D <= "01000001"; -- 0x037B
+ when 000892 => D <= "01000011"; -- 0x037C
+ when 000893 => D <= "01001011"; -- 0x037D
+ when 000894 => D <= "00100010"; -- 0x037E
+ when 000895 => D <= "01000011"; -- 0x037F
+ when 000896 => D <= "00101101"; -- 0x0380
+ when 000897 => D <= "01010011"; -- 0x0381
+ when 000898 => D <= "01010100"; -- 0x0382
+ when 000899 => D <= "01000001"; -- 0x0383
+ when 000900 => D <= "01000011"; -- 0x0384
+ when 000901 => D <= "01001011"; -- 0x0385
+ when 000902 => D <= "00100010"; -- 0x0386
+ when 000903 => D <= "01110101"; -- 0x0387
+ when 000904 => D <= "10011000"; -- 0x0388
+ when 000905 => D <= "01011010"; -- 0x0389
+ when 000906 => D <= "01110101"; -- 0x038A
+ when 000907 => D <= "10001001"; -- 0x038B
+ when 000908 => D <= "00010000"; -- 0x038C
+ when 000909 => D <= "01110101"; -- 0x038D
+ when 000910 => D <= "10001000"; -- 0x038E
+ when 000911 => D <= "01010100"; -- 0x038F
+ when 000912 => D <= "01110101"; -- 0x0390
+ when 000913 => D <= "11001000"; -- 0x0391
+ when 000914 => D <= "00110100"; -- 0x0392
+ when 000915 => D <= "10010000"; -- 0x0393
+ when 000916 => D <= "00100000"; -- 0x0394
+ when 000917 => D <= "00000001"; -- 0x0395
+ when 000918 => D <= "11100100"; -- 0x0396
+ when 000919 => D <= "10010011"; -- 0x0397
+ when 000920 => D <= "10110100"; -- 0x0398
+ when 000921 => D <= "10101010"; -- 0x0399
+ when 000922 => D <= "00000011"; -- 0x039A
+ when 000923 => D <= "00010010"; -- 0x039B
+ when 000924 => D <= "00100000"; -- 0x039C
+ when 000925 => D <= "10010000"; -- 0x039D
+ when 000926 => D <= "01111000"; -- 0x039E
+ when 000927 => D <= "11111111"; -- 0x039F
+ when 000928 => D <= "11100100"; -- 0x03A0
+ when 000929 => D <= "11110110"; -- 0x03A1
+ when 000930 => D <= "11011000"; -- 0x03A2
+ when 000931 => D <= "11111101"; -- 0x03A3
+ when 000932 => D <= "01110101"; -- 0x03A4
+ when 000933 => D <= "00111110"; -- 0x03A5
+ when 000934 => D <= "01001101"; -- 0x03A6
+ when 000935 => D <= "10000101"; -- 0x03A7
+ when 000936 => D <= "00111110"; -- 0x03A8
+ when 000937 => D <= "10000001"; -- 0x03A9
+ when 000938 => D <= "01110101"; -- 0x03AA
+ when 000939 => D <= "00010011"; -- 0x03AB
+ when 000940 => D <= "10000000"; -- 0x03AC
+ when 000941 => D <= "01110101"; -- 0x03AD
+ when 000942 => D <= "00010100"; -- 0x03AE
+ when 000943 => D <= "00010001"; -- 0x03AF
+ when 000944 => D <= "10010000"; -- 0x03B0
+ when 000945 => D <= "10000000"; -- 0x03B1
+ when 000946 => D <= "00000000"; -- 0x03B2
+ when 000947 => D <= "11100000"; -- 0x03B3
+ when 000948 => D <= "11000011"; -- 0x03B4
+ when 000949 => D <= "10010100"; -- 0x03B5
+ when 000950 => D <= "00110001"; -- 0x03B6
+ when 000951 => D <= "11110101"; -- 0x03B7
+ when 000952 => D <= "01000101"; -- 0x03B8
+ when 000953 => D <= "11000010"; -- 0x03B9
+ when 000954 => D <= "11100010"; -- 0x03BA
+ when 000955 => D <= "11111111"; -- 0x03BB
+ when 000956 => D <= "10100011"; -- 0x03BC
+ when 000957 => D <= "10110001"; -- 0x03BD
+ when 000958 => D <= "10110100"; -- 0x03BE
+ when 000959 => D <= "00010010"; -- 0x03BF
+ when 000960 => D <= "00001000"; -- 0x03C0
+ when 000961 => D <= "10001011"; -- 0x03C1
+ when 000962 => D <= "10100011"; -- 0x03C2
+ when 000963 => D <= "10110001"; -- 0x03C3
+ when 000964 => D <= "10110100"; -- 0x03C4
+ when 000965 => D <= "10010000"; -- 0x03C5
+ when 000966 => D <= "00000000"; -- 0x03C6
+ when 000967 => D <= "01011111"; -- 0x03C7
+ when 000968 => D <= "11100000"; -- 0x03C8
+ when 000969 => D <= "10010000"; -- 0x03C9
+ when 000970 => D <= "00000000"; -- 0x03CA
+ when 000971 => D <= "00000000"; -- 0x03CB
+ when 000972 => D <= "10110100"; -- 0x03CC
+ when 000973 => D <= "10100101"; -- 0x03CD
+ when 000974 => D <= "00001000"; -- 0x03CE
+ when 000975 => D <= "11100101"; -- 0x03CF
+ when 000976 => D <= "01000101"; -- 0x03D0
+ when 000977 => D <= "11000010"; -- 0x03D1
+ when 000978 => D <= "11100000"; -- 0x03D2
+ when 000979 => D <= "01100100"; -- 0x03D3
+ when 000980 => D <= "00000100"; -- 0x03D4
+ when 000981 => D <= "01100000"; -- 0x03D5
+ when 000982 => D <= "00101001"; -- 0x03D6
+ when 000983 => D <= "10111111"; -- 0x03D7
+ when 000984 => D <= "00000010"; -- 0x03D8
+ when 000985 => D <= "00000010"; -- 0x03D9
+ when 000986 => D <= "10000000"; -- 0x03DA
+ when 000987 => D <= "00000011"; -- 0x03DB
+ when 000988 => D <= "10111111"; -- 0x03DC
+ when 000989 => D <= "00000011"; -- 0x03DD
+ when 000990 => D <= "00000100"; -- 0x03DE
+ when 000991 => D <= "11010001"; -- 0x03DF
+ when 000992 => D <= "01110111"; -- 0x03E0
+ when 000993 => D <= "10000000"; -- 0x03E1
+ when 000994 => D <= "00010001"; -- 0x03E2
+ when 000995 => D <= "10101011"; -- 0x03E3
+ when 000996 => D <= "10000011"; -- 0x03E4
+ when 000997 => D <= "10101001"; -- 0x03E5
+ when 000998 => D <= "10000010"; -- 0x03E6
+ when 000999 => D <= "10100011"; -- 0x03E7
+ when 001000 => D <= "01110100"; -- 0x03E8
+ when 001001 => D <= "01011010"; -- 0x03E9
+ when 001002 => D <= "11110000"; -- 0x03EA
+ when 001003 => D <= "11100000"; -- 0x03EB
+ when 001004 => D <= "10110100"; -- 0x03EC
+ when 001005 => D <= "01011010"; -- 0x03ED
+ when 001006 => D <= "00000101"; -- 0x03EE
+ when 001007 => D <= "11100100"; -- 0x03EF
+ when 001008 => D <= "11110000"; -- 0x03F0
+ when 001009 => D <= "10111011"; -- 0x03F1
+ when 001010 => D <= "11100000"; -- 0x03F2
+ when 001011 => D <= "11101111"; -- 0x03F3
+ when 001012 => D <= "10111011"; -- 0x03F4
+ when 001013 => D <= "00000011"; -- 0x03F5
+ when 001014 => D <= "00000000"; -- 0x03F6
+ when 001015 => D <= "01000000"; -- 0x03F7
+ when 001016 => D <= "10001110"; -- 0x03F8
+ when 001017 => D <= "10010000"; -- 0x03F9
+ when 001018 => D <= "00000001"; -- 0x03FA
+ when 001019 => D <= "00001010"; -- 0x03FB
+ when 001020 => D <= "10110001"; -- 0x03FC
+ when 001021 => D <= "11111101"; -- 0x03FD
+ when 001022 => D <= "11010001"; -- 0x03FE
+ when 001023 => D <= "01010110"; -- 0x03FF
+ when 001024 => D <= "11010001"; -- 0x0400
+ when 001025 => D <= "01101001"; -- 0x0401
+ when 001026 => D <= "00010010"; -- 0x0402
+ when 001027 => D <= "00010110"; -- 0x0403
+ when 001028 => D <= "01000010"; -- 0x0404
+ when 001029 => D <= "11100101"; -- 0x0405
+ when 001030 => D <= "01000101"; -- 0x0406
+ when 001031 => D <= "10110100"; -- 0x0407
+ when 001032 => D <= "00000101"; -- 0x0408
+ when 001033 => D <= "00000011"; -- 0x0409
+ when 001034 => D <= "00010010"; -- 0x040A
+ when 001035 => D <= "01000000"; -- 0x040B
+ when 001036 => D <= "00111001"; -- 0x040C
+ when 001037 => D <= "01010000"; -- 0x040D
+ when 001038 => D <= "00001101"; -- 0x040E
+ when 001039 => D <= "00110000"; -- 0x040F
+ when 001040 => D <= "11100000"; -- 0x0410
+ when 001041 => D <= "00100101"; -- 0x0411
+ when 001042 => D <= "10010000"; -- 0x0412
+ when 001043 => D <= "10000000"; -- 0x0413
+ when 001044 => D <= "00010000"; -- 0x0414
+ when 001045 => D <= "11100000"; -- 0x0415
+ when 001046 => D <= "10110100"; -- 0x0416
+ when 001047 => D <= "01010101"; -- 0x0417
+ when 001048 => D <= "00011110"; -- 0x0418
+ when 001049 => D <= "00000010"; -- 0x0419
+ when 001050 => D <= "00001000"; -- 0x041A
+ when 001051 => D <= "00001000"; -- 0x041B
+ when 001052 => D <= "11100100"; -- 0x041C
+ when 001053 => D <= "11111011"; -- 0x041D
+ when 001054 => D <= "11111001"; -- 0x041E
+ when 001055 => D <= "11110101"; -- 0x041F
+ when 001056 => D <= "11001100"; -- 0x0420
+ when 001057 => D <= "11000010"; -- 0x0421
+ when 001058 => D <= "11001010"; -- 0x0422
+ when 001059 => D <= "00100000"; -- 0x0423
+ when 001060 => D <= "10110000"; -- 0x0424
+ when 001061 => D <= "11111101"; -- 0x0425
+ when 001062 => D <= "01110101"; -- 0x0426
+ when 001063 => D <= "11001000"; -- 0x0427
+ when 001064 => D <= "00000101"; -- 0x0428
+ when 001065 => D <= "00010010"; -- 0x0429
+ when 001066 => D <= "00011001"; -- 0x042A
+ when 001067 => D <= "01101011"; -- 0x042B
+ when 001068 => D <= "00110000"; -- 0x042C
+ when 001069 => D <= "10110000"; -- 0x042D
+ when 001070 => D <= "11111101"; -- 0x042E
+ when 001071 => D <= "01110101"; -- 0x042F
+ when 001072 => D <= "11001000"; -- 0x0430
+ when 001073 => D <= "00110100"; -- 0x0431
+ when 001074 => D <= "00010010"; -- 0x0432
+ when 001075 => D <= "00001000"; -- 0x0433
+ when 001076 => D <= "10001011"; -- 0x0434
+ when 001077 => D <= "00000000"; -- 0x0435
+ when 001078 => D <= "00000000"; -- 0x0436
+ when 001079 => D <= "10010000"; -- 0x0437
+ when 001080 => D <= "00011111"; -- 0x0438
+ when 001081 => D <= "11010011"; -- 0x0439
+ when 001082 => D <= "11010001"; -- 0x043A
+ when 001083 => D <= "10100111"; -- 0x043B
+ when 001084 => D <= "00000010"; -- 0x043C
+ when 001085 => D <= "00010111"; -- 0x043D
+ when 001086 => D <= "01110110"; -- 0x043E
+ when 001087 => D <= "01111111"; -- 0x043F
+ when 001088 => D <= "00000000"; -- 0x0440
+ when 001089 => D <= "01111110"; -- 0x0441
+ when 001090 => D <= "00000001"; -- 0x0442
+ when 001091 => D <= "01111010"; -- 0x0443
+ when 001092 => D <= "01111111"; -- 0x0444
+ when 001093 => D <= "01111000"; -- 0x0445
+ when 001094 => D <= "11111111"; -- 0x0446
+ when 001095 => D <= "10010001"; -- 0x0447
+ when 001096 => D <= "10011000"; -- 0x0448
+ when 001097 => D <= "00001110"; -- 0x0449
+ when 001098 => D <= "11100101"; -- 0x044A
+ when 001099 => D <= "11001011"; -- 0x044B
+ when 001100 => D <= "10010001"; -- 0x044C
+ when 001101 => D <= "10011000"; -- 0x044D
+ when 001102 => D <= "11100101"; -- 0x044E
+ when 001103 => D <= "11001010"; -- 0x044F
+ when 001104 => D <= "01111110"; -- 0x0450
+ when 001105 => D <= "00000011"; -- 0x0451
+ when 001106 => D <= "01111001"; -- 0x0452
+ when 001107 => D <= "00001001"; -- 0x0453
+ when 001108 => D <= "01111011"; -- 0x0454
+ when 001109 => D <= "00000001"; -- 0x0455
+ when 001110 => D <= "10010001"; -- 0x0456
+ when 001111 => D <= "10011000"; -- 0x0457
+ when 001112 => D <= "10000000"; -- 0x0458
+ when 001113 => D <= "00110111"; -- 0x0459
+ when 001114 => D <= "10010000"; -- 0x045A
+ when 001115 => D <= "00000001"; -- 0x045B
+ when 001116 => D <= "00101010"; -- 0x045C
+ when 001117 => D <= "11010010"; -- 0x045D
+ when 001118 => D <= "00110011"; -- 0x045E
+ when 001119 => D <= "10000000"; -- 0x045F
+ when 001120 => D <= "00000101"; -- 0x0460
+ when 001121 => D <= "10010000"; -- 0x0461
+ when 001122 => D <= "00000001"; -- 0x0462
+ when 001123 => D <= "00101000"; -- 0x0463
+ when 001124 => D <= "11000010"; -- 0x0464
+ when 001125 => D <= "00110011"; -- 0x0465
+ when 001126 => D <= "10110001"; -- 0x0466
+ when 001127 => D <= "01111100"; -- 0x0467
+ when 001128 => D <= "11000010"; -- 0x0468
+ when 001129 => D <= "10010101"; -- 0x0469
+ when 001130 => D <= "00010010"; -- 0x046A
+ when 001131 => D <= "00001110"; -- 0x046B
+ when 001132 => D <= "11100100"; -- 0x046C
+ when 001133 => D <= "01110000"; -- 0x046D
+ when 001134 => D <= "11010000"; -- 0x046E
+ when 001135 => D <= "01111100"; -- 0x046F
+ when 001136 => D <= "11111110"; -- 0x0470
+ when 001137 => D <= "11010010"; -- 0x0471
+ when 001138 => D <= "00011101"; -- 0x0472
+ when 001139 => D <= "10110001"; -- 0x0473
+ when 001140 => D <= "01010101"; -- 0x0474
+ when 001141 => D <= "00010010"; -- 0x0475
+ when 001142 => D <= "00011000"; -- 0x0476
+ when 001143 => D <= "01001110"; -- 0x0477
+ when 001144 => D <= "11101100"; -- 0x0478
+ when 001145 => D <= "11110100"; -- 0x0479
+ when 001146 => D <= "00010010"; -- 0x047A
+ when 001147 => D <= "00010100"; -- 0x047B
+ when 001148 => D <= "10011100"; -- 0x047C
+ when 001149 => D <= "00010010"; -- 0x047D
+ when 001150 => D <= "00011001"; -- 0x047E
+ when 001151 => D <= "10100001"; -- 0x047F
+ when 001152 => D <= "10110001"; -- 0x0480
+ when 001153 => D <= "00010110"; -- 0x0481
+ when 001154 => D <= "11010001"; -- 0x0482
+ when 001155 => D <= "10011111"; -- 0x0483
+ when 001156 => D <= "10101000"; -- 0x0484
+ when 001157 => D <= "00001110"; -- 0x0485
+ when 001158 => D <= "10101010"; -- 0x0486
+ when 001159 => D <= "00001111"; -- 0x0487
+ when 001160 => D <= "01110100"; -- 0x0488
+ when 001161 => D <= "01010101"; -- 0x0489
+ when 001162 => D <= "00001110"; -- 0x048A
+ when 001163 => D <= "10111110"; -- 0x048B
+ when 001164 => D <= "00000000"; -- 0x048C
+ when 001165 => D <= "00000001"; -- 0x048D
+ when 001166 => D <= "00001111"; -- 0x048E
+ when 001167 => D <= "10010001"; -- 0x048F
+ when 001168 => D <= "10011011"; -- 0x0490
+ when 001169 => D <= "11010010"; -- 0x0491
+ when 001170 => D <= "10010101"; -- 0x0492
+ when 001171 => D <= "10100001"; -- 0x0493
+ when 001172 => D <= "00111010"; -- 0x0494
+ when 001173 => D <= "10001011"; -- 0x0495
+ when 001174 => D <= "10100000"; -- 0x0496
+ when 001175 => D <= "11100011"; -- 0x0497
+ when 001176 => D <= "00010010"; -- 0x0498
+ when 001177 => D <= "00010101"; -- 0x0499
+ when 001178 => D <= "01100001"; -- 0x049A
+ when 001179 => D <= "01111101"; -- 0x049B
+ when 001180 => D <= "00000001"; -- 0x049C
+ when 001181 => D <= "11111100"; -- 0x049D
+ when 001182 => D <= "10010001"; -- 0x049E
+ when 001183 => D <= "11010110"; -- 0x049F
+ when 001184 => D <= "10010001"; -- 0x04A0
+ when 001185 => D <= "11110000"; -- 0x04A1
+ when 001186 => D <= "00100000"; -- 0x04A2
+ when 001187 => D <= "00110011"; -- 0x04A3
+ when 001188 => D <= "00001100"; -- 0x04A4
+ when 001189 => D <= "01101100"; -- 0x04A5
+ when 001190 => D <= "01110000"; -- 0x04A6
+ when 001191 => D <= "00100000"; -- 0x04A7
+ when 001192 => D <= "00010010"; -- 0x04A8
+ when 001193 => D <= "00010110"; -- 0x04A9
+ when 001194 => D <= "00110010"; -- 0x04AA
+ when 001195 => D <= "01110000"; -- 0x04AB
+ when 001196 => D <= "11101000"; -- 0x04AC
+ when 001197 => D <= "01010011"; -- 0x04AD
+ when 001198 => D <= "11010000"; -- 0x04AE
+ when 001199 => D <= "11100111"; -- 0x04AF
+ when 001200 => D <= "00100010"; -- 0x04B0
+ when 001201 => D <= "01101100"; -- 0x04B1
+ when 001202 => D <= "01110000"; -- 0x04B2
+ when 001203 => D <= "00001111"; -- 0x04B3
+ when 001204 => D <= "11101100"; -- 0x04B4
+ when 001205 => D <= "10010001"; -- 0x04B5
+ when 001206 => D <= "11010110"; -- 0x04B6
+ when 001207 => D <= "10010001"; -- 0x04B7
+ when 001208 => D <= "11100000"; -- 0x04B8
+ when 001209 => D <= "10010001"; -- 0x04B9
+ when 001210 => D <= "11100000"; -- 0x04BA
+ when 001211 => D <= "10010001"; -- 0x04BB
+ when 001212 => D <= "11100000"; -- 0x04BC
+ when 001213 => D <= "11011101"; -- 0x04BD
+ when 001214 => D <= "11111000"; -- 0x04BE
+ when 001215 => D <= "10010001"; -- 0x04BF
+ when 001216 => D <= "11110000"; -- 0x04C0
+ when 001217 => D <= "10000000"; -- 0x04C1
+ when 001218 => D <= "11100010"; -- 0x04C2
+ when 001219 => D <= "00001101"; -- 0x04C3
+ when 001220 => D <= "11101100"; -- 0x04C4
+ when 001221 => D <= "10111101"; -- 0x04C5
+ when 001222 => D <= "00011001"; -- 0x04C6
+ when 001223 => D <= "11010101"; -- 0x04C7
+ when 001224 => D <= "11010010"; -- 0x04C8
+ when 001225 => D <= "10010101"; -- 0x04C9
+ when 001226 => D <= "01110101"; -- 0x04CA
+ when 001227 => D <= "11010000"; -- 0x04CB
+ when 001228 => D <= "00000000"; -- 0x04CC
+ when 001229 => D <= "00110000"; -- 0x04CD
+ when 001230 => D <= "00101111"; -- 0x04CE
+ when 001231 => D <= "11100000"; -- 0x04CF
+ when 001232 => D <= "10010000"; -- 0x04D0
+ when 001233 => D <= "00011111"; -- 0x04D1
+ when 001234 => D <= "10011010"; -- 0x04D2
+ when 001235 => D <= "00000010"; -- 0x04D3
+ when 001236 => D <= "00011000"; -- 0x04D4
+ when 001237 => D <= "10001001"; -- 0x04D5
+ when 001238 => D <= "10001000"; -- 0x04D6
+ when 001239 => D <= "10000000"; -- 0x04D7
+ when 001240 => D <= "10001010"; -- 0x04D8
+ when 001241 => D <= "10100000"; -- 0x04D9
+ when 001242 => D <= "10110001"; -- 0x04DA
+ when 001243 => D <= "00000101"; -- 0x04DB
+ when 001244 => D <= "11000010"; -- 0x04DC
+ when 001245 => D <= "10010011"; -- 0x04DD
+ when 001246 => D <= "11110101"; -- 0x04DE
+ when 001247 => D <= "10000000"; -- 0x04DF
+ when 001248 => D <= "00000000"; -- 0x04E0
+ when 001249 => D <= "00000000"; -- 0x04E1
+ when 001250 => D <= "00000000"; -- 0x04E2
+ when 001251 => D <= "00000000"; -- 0x04E3
+ when 001252 => D <= "00000000"; -- 0x04E4
+ when 001253 => D <= "00000000"; -- 0x04E5
+ when 001254 => D <= "10110001"; -- 0x04E6
+ when 001255 => D <= "00000101"; -- 0x04E7
+ when 001256 => D <= "11000010"; -- 0x04E8
+ when 001257 => D <= "10010100"; -- 0x04E9
+ when 001258 => D <= "10110001"; -- 0x04EA
+ when 001259 => D <= "00100111"; -- 0x04EB
+ when 001260 => D <= "00110000"; -- 0x04EC
+ when 001261 => D <= "10001111"; -- 0x04ED
+ when 001262 => D <= "11111101"; -- 0x04EE
+ when 001263 => D <= "00100010"; -- 0x04EF
+ when 001264 => D <= "11010010"; -- 0x04F0
+ when 001265 => D <= "10010100"; -- 0x04F1
+ when 001266 => D <= "10110001"; -- 0x04F2
+ when 001267 => D <= "00000101"; -- 0x04F3
+ when 001268 => D <= "00110000"; -- 0x04F4
+ when 001269 => D <= "10110010"; -- 0x04F5
+ when 001270 => D <= "11111101"; -- 0x04F6
+ when 001271 => D <= "01110101"; -- 0x04F7
+ when 001272 => D <= "10000000"; -- 0x04F8
+ when 001273 => D <= "11111111"; -- 0x04F9
+ when 001274 => D <= "11000010"; -- 0x04FA
+ when 001275 => D <= "10110111"; -- 0x04FB
+ when 001276 => D <= "10110001"; -- 0x04FC
+ when 001277 => D <= "00000101"; -- 0x04FD
+ when 001278 => D <= "11100101"; -- 0x04FE
+ when 001279 => D <= "10000000"; -- 0x04FF
+ when 001280 => D <= "11010010"; -- 0x0500
+ when 001281 => D <= "10110111"; -- 0x0501
+ when 001282 => D <= "11010010"; -- 0x0502
+ when 001283 => D <= "10010011"; -- 0x0503
+ when 001284 => D <= "00100010"; -- 0x0504
+ when 001285 => D <= "01110101"; -- 0x0505
+ when 001286 => D <= "00001111"; -- 0x0506
+ when 001287 => D <= "00001100"; -- 0x0507
+ when 001288 => D <= "11010101"; -- 0x0508
+ when 001289 => D <= "00001111"; -- 0x0509
+ when 001290 => D <= "11111101"; -- 0x050A
+ when 001291 => D <= "00100010"; -- 0x050B
+ when 001292 => D <= "11000010"; -- 0x050C
+ when 001293 => D <= "10010101"; -- 0x050D
+ when 001294 => D <= "01110101"; -- 0x050E
+ when 001295 => D <= "11010000"; -- 0x050F
+ when 001296 => D <= "00011000"; -- 0x0510
+ when 001297 => D <= "10010001"; -- 0x0511
+ when 001298 => D <= "10010101"; -- 0x0512
+ when 001299 => D <= "11010010"; -- 0x0513
+ when 001300 => D <= "10010101"; -- 0x0514
+ when 001301 => D <= "00100010"; -- 0x0515
+ when 001302 => D <= "10110001"; -- 0x0516
+ when 001303 => D <= "10000100"; -- 0x0517
+ when 001304 => D <= "10100011"; -- 0x0518
+ when 001305 => D <= "10101011"; -- 0x0519
+ when 001306 => D <= "00010011"; -- 0x051A
+ when 001307 => D <= "10101001"; -- 0x051B
+ when 001308 => D <= "00010100"; -- 0x051C
+ when 001309 => D <= "11000011"; -- 0x051D
+ when 001310 => D <= "11100101"; -- 0x051E
+ when 001311 => D <= "10000010"; -- 0x051F
+ when 001312 => D <= "10011001"; -- 0x0520
+ when 001313 => D <= "11111110"; -- 0x0521
+ when 001314 => D <= "11100101"; -- 0x0522
+ when 001315 => D <= "10000011"; -- 0x0523
+ when 001316 => D <= "10011011"; -- 0x0524
+ when 001317 => D <= "11111111"; -- 0x0525
+ when 001318 => D <= "00100010"; -- 0x0526
+ when 001319 => D <= "10110001"; -- 0x0527
+ when 001320 => D <= "00100110"; -- 0x0528
+ when 001321 => D <= "11000010"; -- 0x0529
+ when 001322 => D <= "10001110"; -- 0x052A
+ when 001323 => D <= "10000101"; -- 0x052B
+ when 001324 => D <= "01000000"; -- 0x052C
+ when 001325 => D <= "10001101"; -- 0x052D
+ when 001326 => D <= "10000101"; -- 0x052E
+ when 001327 => D <= "01000001"; -- 0x052F
+ when 001328 => D <= "10001011"; -- 0x0530
+ when 001329 => D <= "11000010"; -- 0x0531
+ when 001330 => D <= "10001111"; -- 0x0532
+ when 001331 => D <= "11010010"; -- 0x0533
+ when 001332 => D <= "10001110"; -- 0x0534
+ when 001333 => D <= "00100010"; -- 0x0535
+ when 001334 => D <= "11000010"; -- 0x0536
+ when 001335 => D <= "00010111"; -- 0x0537
+ when 001336 => D <= "10110001"; -- 0x0538
+ when 001337 => D <= "00111101"; -- 0x0539
+ when 001338 => D <= "00000010"; -- 0x053A
+ when 001339 => D <= "00010000"; -- 0x053B
+ when 001340 => D <= "01110111"; -- 0x053C
+ when 001341 => D <= "00010010"; -- 0x053D
+ when 001342 => D <= "00001110"; -- 0x053E
+ when 001343 => D <= "11100100"; -- 0x053F
+ when 001344 => D <= "01111100"; -- 0x0540
+ when 001345 => D <= "00000001"; -- 0x0541
+ when 001346 => D <= "01010000"; -- 0x0542
+ when 001347 => D <= "00000100"; -- 0x0543
+ when 001348 => D <= "00010010"; -- 0x0544
+ when 001349 => D <= "00001110"; -- 0x0545
+ when 001350 => D <= "10010001"; -- 0x0546
+ when 001351 => D <= "11111100"; -- 0x0547
+ when 001352 => D <= "10110001"; -- 0x0548
+ when 001353 => D <= "01010101"; -- 0x0549
+ when 001354 => D <= "10111100"; -- 0x054A
+ when 001355 => D <= "00000000"; -- 0x054B
+ when 001356 => D <= "00010001"; -- 0x054C
+ when 001357 => D <= "10100011"; -- 0x054D
+ when 001358 => D <= "10000101"; -- 0x054E
+ when 001359 => D <= "10000011"; -- 0x054F
+ when 001360 => D <= "00010011"; -- 0x0550
+ when 001361 => D <= "10000101"; -- 0x0551
+ when 001362 => D <= "10000010"; -- 0x0552
+ when 001363 => D <= "00010100"; -- 0x0553
+ when 001364 => D <= "00100010"; -- 0x0554
+ when 001365 => D <= "10010000"; -- 0x0555
+ when 001366 => D <= "10000000"; -- 0x0556
+ when 001367 => D <= "00010000"; -- 0x0557
+ when 001368 => D <= "11100000"; -- 0x0558
+ when 001369 => D <= "10110100"; -- 0x0559
+ when 001370 => D <= "01010101"; -- 0x055A
+ when 001371 => D <= "00001001"; -- 0x055B
+ when 001372 => D <= "11011100"; -- 0x055C
+ when 001373 => D <= "00000001"; -- 0x055D
+ when 001374 => D <= "00100010"; -- 0x055E
+ when 001375 => D <= "10100011"; -- 0x055F
+ when 001376 => D <= "10110001"; -- 0x0560
+ when 001377 => D <= "10100110"; -- 0x0561
+ when 001378 => D <= "10100011"; -- 0x0562
+ when 001379 => D <= "10000000"; -- 0x0563
+ when 001380 => D <= "11110011"; -- 0x0564
+ when 001381 => D <= "00010000"; -- 0x0565
+ when 001382 => D <= "00011101"; -- 0x0566
+ when 001383 => D <= "11110110"; -- 0x0567
+ when 001384 => D <= "10010000"; -- 0x0568
+ when 001385 => D <= "00011111"; -- 0x0569
+ when 001386 => D <= "11001001"; -- 0x056A
+ when 001387 => D <= "10000001"; -- 0x056B
+ when 001388 => D <= "11010011"; -- 0x056C
+ when 001389 => D <= "11100000"; -- 0x056D
+ when 001390 => D <= "11111010"; -- 0x056E
+ when 001391 => D <= "10100011"; -- 0x056F
+ when 001392 => D <= "11100000"; -- 0x0570
+ when 001393 => D <= "11111000"; -- 0x0571
+ when 001394 => D <= "00100010"; -- 0x0572
+ when 001395 => D <= "11001011"; -- 0x0573
+ when 001396 => D <= "11000101"; -- 0x0574
+ when 001397 => D <= "10000011"; -- 0x0575
+ when 001398 => D <= "11001011"; -- 0x0576
+ when 001399 => D <= "11001001"; -- 0x0577
+ when 001400 => D <= "11000101"; -- 0x0578
+ when 001401 => D <= "10000010"; -- 0x0579
+ when 001402 => D <= "11001001"; -- 0x057A
+ when 001403 => D <= "00100010"; -- 0x057B
+ when 001404 => D <= "11100000"; -- 0x057C
+ when 001405 => D <= "11110101"; -- 0x057D
+ when 001406 => D <= "01000000"; -- 0x057E
+ when 001407 => D <= "10100011"; -- 0x057F
+ when 001408 => D <= "11100000"; -- 0x0580
+ when 001409 => D <= "11110101"; -- 0x0581
+ when 001410 => D <= "01000001"; -- 0x0582
+ when 001411 => D <= "00100010"; -- 0x0583
+ when 001412 => D <= "11010010"; -- 0x0584
+ when 001413 => D <= "00101001"; -- 0x0585
+ when 001414 => D <= "00010010"; -- 0x0586
+ when 001415 => D <= "00001110"; -- 0x0587
+ when 001416 => D <= "10011110"; -- 0x0588
+ when 001417 => D <= "00010010"; -- 0x0589
+ when 001418 => D <= "00001010"; -- 0x058A
+ when 001419 => D <= "10100111"; -- 0x058B
+ when 001420 => D <= "01100000"; -- 0x058C
+ when 001421 => D <= "00010010"; -- 0x058D
+ when 001422 => D <= "10100011"; -- 0x058E
+ when 001423 => D <= "00100000"; -- 0x058F
+ when 001424 => D <= "00101001"; -- 0x0590
+ when 001425 => D <= "00001010"; -- 0x0591
+ when 001426 => D <= "10110001"; -- 0x0592
+ when 001427 => D <= "11000110"; -- 0x0593
+ when 001428 => D <= "10110001"; -- 0x0594
+ when 001429 => D <= "10111100"; -- 0x0595
+ when 001430 => D <= "11100000"; -- 0x0596
+ when 001431 => D <= "00100000"; -- 0x0597
+ when 001432 => D <= "00101010"; -- 0x0598
+ when 001433 => D <= "00000110"; -- 0x0599
+ when 001434 => D <= "01000000"; -- 0x059A
+ when 001435 => D <= "00000100"; -- 0x059B
+ when 001436 => D <= "10110001"; -- 0x059C
+ when 001437 => D <= "11011000"; -- 0x059D
+ when 001438 => D <= "10000000"; -- 0x059E
+ when 001439 => D <= "11101001"; -- 0x059F
+ when 001440 => D <= "11000010"; -- 0x05A0
+ when 001441 => D <= "00101001"; -- 0x05A1
+ when 001442 => D <= "00100010"; -- 0x05A2
+ when 001443 => D <= "10010000"; -- 0x05A3
+ when 001444 => D <= "00000010"; -- 0x05A4
+ when 001445 => D <= "00000000"; -- 0x05A5
+ when 001446 => D <= "11010010"; -- 0x05A6
+ when 001447 => D <= "00101001"; -- 0x05A7
+ when 001448 => D <= "10000000"; -- 0x05A8
+ when 001449 => D <= "11011111"; -- 0x05A9
+ when 001450 => D <= "11100000"; -- 0x05AA
+ when 001451 => D <= "11000000"; -- 0x05AB
+ when 001452 => D <= "11100000"; -- 0x05AC
+ when 001453 => D <= "10100011"; -- 0x05AD
+ when 001454 => D <= "11100000"; -- 0x05AE
+ when 001455 => D <= "11110101"; -- 0x05AF
+ when 001456 => D <= "10000010"; -- 0x05B0
+ when 001457 => D <= "11010000"; -- 0x05B1
+ when 001458 => D <= "10000011"; -- 0x05B2
+ when 001459 => D <= "00100010"; -- 0x05B3
+ when 001460 => D <= "11100000"; -- 0x05B4
+ when 001461 => D <= "11111011"; -- 0x05B5
+ when 001462 => D <= "10100011"; -- 0x05B6
+ when 001463 => D <= "11100000"; -- 0x05B7
+ when 001464 => D <= "11111001"; -- 0x05B8
+ when 001465 => D <= "00100010"; -- 0x05B9
+ when 001466 => D <= "10110001"; -- 0x05BA
+ when 001467 => D <= "10111100"; -- 0x05BB
+ when 001468 => D <= "11000101"; -- 0x05BC
+ when 001469 => D <= "10000010"; -- 0x05BD
+ when 001470 => D <= "01110000"; -- 0x05BE
+ when 001471 => D <= "00000010"; -- 0x05BF
+ when 001472 => D <= "00010101"; -- 0x05C0
+ when 001473 => D <= "10000011"; -- 0x05C1
+ when 001474 => D <= "00010100"; -- 0x05C2
+ when 001475 => D <= "11000101"; -- 0x05C3
+ when 001476 => D <= "10000010"; -- 0x05C4
+ when 001477 => D <= "00100010"; -- 0x05C5
+ when 001478 => D <= "11000010"; -- 0x05C6
+ when 001479 => D <= "00101010"; -- 0x05C7
+ when 001480 => D <= "11100000"; -- 0x05C8
+ when 001481 => D <= "10110101"; -- 0x05C9
+ when 001482 => D <= "00000011"; -- 0x05CA
+ when 001483 => D <= "00001010"; -- 0x05CB
+ when 001484 => D <= "10100011"; -- 0x05CC
+ when 001485 => D <= "11100000"; -- 0x05CD
+ when 001486 => D <= "10110001"; -- 0x05CE
+ when 001487 => D <= "10111100"; -- 0x05CF
+ when 001488 => D <= "10110101"; -- 0x05D0
+ when 001489 => D <= "00000001"; -- 0x05D1
+ when 001490 => D <= "00000011"; -- 0x05D2
+ when 001491 => D <= "10110011"; -- 0x05D3
+ when 001492 => D <= "10110010"; -- 0x05D4
+ when 001493 => D <= "00101010"; -- 0x05D5
+ when 001494 => D <= "10110011"; -- 0x05D6
+ when 001495 => D <= "00100010"; -- 0x05D7
+ when 001496 => D <= "00100101"; -- 0x05D8
+ when 001497 => D <= "10000010"; -- 0x05D9
+ when 001498 => D <= "11110101"; -- 0x05DA
+ when 001499 => D <= "10000010"; -- 0x05DB
+ when 001500 => D <= "01010000"; -- 0x05DC
+ when 001501 => D <= "00000010"; -- 0x05DD
+ when 001502 => D <= "00000101"; -- 0x05DE
+ when 001503 => D <= "10000011"; -- 0x05DF
+ when 001504 => D <= "00100010"; -- 0x05E0
+ when 001505 => D <= "11010001"; -- 0x05E1
+ when 001506 => D <= "10010100"; -- 0x05E2
+ when 001507 => D <= "10110001"; -- 0x05E3
+ when 001508 => D <= "10100011"; -- 0x05E4
+ when 001509 => D <= "01110100"; -- 0x05E5
+ when 001510 => D <= "00000110"; -- 0x05E6
+ when 001511 => D <= "10110001"; -- 0x05E7
+ when 001512 => D <= "11011000"; -- 0x05E8
+ when 001513 => D <= "10110001"; -- 0x05E9
+ when 001514 => D <= "01110011"; -- 0x05EA
+ when 001515 => D <= "10010000"; -- 0x05EB
+ when 001516 => D <= "00000001"; -- 0x05EC
+ when 001517 => D <= "00001000"; -- 0x05ED
+ when 001518 => D <= "10110001"; -- 0x05EE
+ when 001519 => D <= "11111111"; -- 0x05EF
+ when 001520 => D <= "10110001"; -- 0x05F0
+ when 001521 => D <= "10110100"; -- 0x05F1
+ when 001522 => D <= "10010000"; -- 0x05F2
+ when 001523 => D <= "00000001"; -- 0x05F3
+ when 001524 => D <= "00100010"; -- 0x05F4
+ when 001525 => D <= "10110001"; -- 0x05F5
+ when 001526 => D <= "10101010"; -- 0x05F6
+ when 001527 => D <= "00010010"; -- 0x05F7
+ when 001528 => D <= "00001010"; -- 0x05F8
+ when 001529 => D <= "00000101"; -- 0x05F9
+ when 001530 => D <= "10010000"; -- 0x05FA
+ when 001531 => D <= "00000001"; -- 0x05FB
+ when 001532 => D <= "00000100"; -- 0x05FC
+ when 001533 => D <= "10110001"; -- 0x05FD
+ when 001534 => D <= "11111111"; -- 0x05FE
+ when 001535 => D <= "11101011"; -- 0x05FF
+ when 001536 => D <= "11110000"; -- 0x0600
+ when 001537 => D <= "10100011"; -- 0x0601
+ when 001538 => D <= "11101001"; -- 0x0602
+ when 001539 => D <= "11110000"; -- 0x0603
+ when 001540 => D <= "10100011"; -- 0x0604
+ when 001541 => D <= "00100010"; -- 0x0605
+ when 001542 => D <= "00010010"; -- 0x0606
+ when 001543 => D <= "00001110"; -- 0x0607
+ when 001544 => D <= "10001000"; -- 0x0608
+ when 001545 => D <= "10010000"; -- 0x0609
+ when 001546 => D <= "00000001"; -- 0x060A
+ when 001547 => D <= "00100010"; -- 0x060B
+ when 001548 => D <= "10110001"; -- 0x060C
+ when 001549 => D <= "11111111"; -- 0x060D
+ when 001550 => D <= "00001110"; -- 0x060E
+ when 001551 => D <= "10001110"; -- 0x060F
+ when 001552 => D <= "00111111"; -- 0x0610
+ when 001553 => D <= "11000001"; -- 0x0611
+ when 001554 => D <= "01011110"; -- 0x0612
+ when 001555 => D <= "10010000"; -- 0x0613
+ when 001556 => D <= "00000001"; -- 0x0614
+ when 001557 => D <= "00000100"; -- 0x0615
+ when 001558 => D <= "10110001"; -- 0x0616
+ when 001559 => D <= "10101010"; -- 0x0617
+ when 001560 => D <= "10110001"; -- 0x0618
+ when 001561 => D <= "10111010"; -- 0x0619
+ when 001562 => D <= "11100000"; -- 0x061A
+ when 001563 => D <= "01100000"; -- 0x061B
+ when 001564 => D <= "00100000"; -- 0x061C
+ when 001565 => D <= "10100011"; -- 0x061D
+ when 001566 => D <= "10110101"; -- 0x061E
+ when 001567 => D <= "00000111"; -- 0x061F
+ when 001568 => D <= "00001111"; -- 0x0620
+ when 001569 => D <= "11100000"; -- 0x0621
+ when 001570 => D <= "10110101"; -- 0x0622
+ when 001571 => D <= "00000110"; -- 0x0623
+ when 001572 => D <= "00001011"; -- 0x0624
+ when 001573 => D <= "11100101"; -- 0x0625
+ when 001574 => D <= "10000010"; -- 0x0626
+ when 001575 => D <= "10010100"; -- 0x0627
+ when 001576 => D <= "00000010"; -- 0x0628
+ when 001577 => D <= "11111000"; -- 0x0629
+ when 001578 => D <= "11100101"; -- 0x062A
+ when 001579 => D <= "10000011"; -- 0x062B
+ when 001580 => D <= "10010100"; -- 0x062C
+ when 001581 => D <= "00000000"; -- 0x062D
+ when 001582 => D <= "11111010"; -- 0x062E
+ when 001583 => D <= "00100010"; -- 0x062F
+ when 001584 => D <= "11100101"; -- 0x0630
+ when 001585 => D <= "10000010"; -- 0x0631
+ when 001586 => D <= "11000011"; -- 0x0632
+ when 001587 => D <= "10010100"; -- 0x0633
+ when 001588 => D <= "00001001"; -- 0x0634
+ when 001589 => D <= "11110101"; -- 0x0635
+ when 001590 => D <= "10000010"; -- 0x0636
+ when 001591 => D <= "01010000"; -- 0x0637
+ when 001592 => D <= "11100001"; -- 0x0638
+ when 001593 => D <= "00010101"; -- 0x0639
+ when 001594 => D <= "10000011"; -- 0x063A
+ when 001595 => D <= "10000000"; -- 0x063B
+ when 001596 => D <= "11011101"; -- 0x063C
+ when 001597 => D <= "00010010"; -- 0x063D
+ when 001598 => D <= "00001101"; -- 0x063E
+ when 001599 => D <= "11110010"; -- 0x063F
+ when 001600 => D <= "11000011"; -- 0x0640
+ when 001601 => D <= "11010001"; -- 0x0641
+ when 001602 => D <= "00100101"; -- 0x0642
+ when 001603 => D <= "11101000"; -- 0x0643
+ when 001604 => D <= "10010100"; -- 0x0644
+ when 001605 => D <= "00000110"; -- 0x0645
+ when 001606 => D <= "11111001"; -- 0x0646
+ when 001607 => D <= "11101010"; -- 0x0647
+ when 001608 => D <= "10010100"; -- 0x0648
+ when 001609 => D <= "00000000"; -- 0x0649
+ when 001610 => D <= "11111011"; -- 0x064A
+ when 001611 => D <= "10010000"; -- 0x064B
+ when 001612 => D <= "00000001"; -- 0x064C
+ when 001613 => D <= "00000110"; -- 0x064D
+ when 001614 => D <= "10110001"; -- 0x064E
+ when 001615 => D <= "11111111"; -- 0x064F
+ when 001616 => D <= "10110001"; -- 0x0650
+ when 001617 => D <= "11000110"; -- 0x0651
+ when 001618 => D <= "01000000"; -- 0x0652
+ when 001619 => D <= "00110010"; -- 0x0653
+ when 001620 => D <= "11010011"; -- 0x0654
+ when 001621 => D <= "00100010"; -- 0x0655
+ when 001622 => D <= "10010000"; -- 0x0656
+ when 001623 => D <= "00000010"; -- 0x0657
+ when 001624 => D <= "00000000"; -- 0x0658
+ when 001625 => D <= "01110100"; -- 0x0659
+ when 001626 => D <= "00000001"; -- 0x065A
+ when 001627 => D <= "11110000"; -- 0x065B
+ when 001628 => D <= "11000010"; -- 0x065C
+ when 001629 => D <= "00010101"; -- 0x065D
+ when 001630 => D <= "10110001"; -- 0x065E
+ when 001631 => D <= "11100001"; -- 0x065F
+ when 001632 => D <= "10010000"; -- 0x0660
+ when 001633 => D <= "00000001"; -- 0x0661
+ when 001634 => D <= "00001010"; -- 0x0662
+ when 001635 => D <= "10110001"; -- 0x0663
+ when 001636 => D <= "10110100"; -- 0x0664
+ when 001637 => D <= "10110001"; -- 0x0665
+ when 001638 => D <= "10100011"; -- 0x0666
+ when 001639 => D <= "11010001"; -- 0x0667
+ when 001640 => D <= "01110111"; -- 0x0668
+ when 001641 => D <= "10010000"; -- 0x0669
+ when 001642 => D <= "00000000"; -- 0x066A
+ when 001643 => D <= "11111110"; -- 0x066B
+ when 001644 => D <= "11100100"; -- 0x066C
+ when 001645 => D <= "11110000"; -- 0x066D
+ when 001646 => D <= "01110101"; -- 0x066E
+ when 001647 => D <= "00010001"; -- 0x066F
+ when 001648 => D <= "11111110"; -- 0x0670
+ when 001649 => D <= "01110101"; -- 0x0671
+ when 001650 => D <= "00001001"; -- 0x0672
+ when 001651 => D <= "11111110"; -- 0x0673
+ when 001652 => D <= "11000010"; -- 0x0674
+ when 001653 => D <= "00010111"; -- 0x0675
+ when 001654 => D <= "00100010"; -- 0x0676
+ when 001655 => D <= "10100011"; -- 0x0677
+ when 001656 => D <= "11100100"; -- 0x0678
+ when 001657 => D <= "11110000"; -- 0x0679
+ when 001658 => D <= "11100000"; -- 0x067A
+ when 001659 => D <= "01110000"; -- 0x067B
+ when 001660 => D <= "00001001"; -- 0x067C
+ when 001661 => D <= "11101011"; -- 0x067D
+ when 001662 => D <= "10110101"; -- 0x067E
+ when 001663 => D <= "10000011"; -- 0x067F
+ when 001664 => D <= "11110110"; -- 0x0680
+ when 001665 => D <= "11101001"; -- 0x0681
+ when 001666 => D <= "10110101"; -- 0x0682
+ when 001667 => D <= "10000010"; -- 0x0683
+ when 001668 => D <= "11110010"; -- 0x0684
+ when 001669 => D <= "00100010"; -- 0x0685
+ when 001670 => D <= "00000010"; -- 0x0686
+ when 001671 => D <= "00010101"; -- 0x0687
+ when 001672 => D <= "10100000"; -- 0x0688
+ when 001673 => D <= "00010010"; -- 0x0689
+ when 001674 => D <= "00001110"; -- 0x068A
+ when 001675 => D <= "11100100"; -- 0x068B
+ when 001676 => D <= "01010000"; -- 0x068C
+ when 001677 => D <= "11010000"; -- 0x068D
+ when 001678 => D <= "00010010"; -- 0x068E
+ when 001679 => D <= "00001110"; -- 0x068F
+ when 001680 => D <= "11011010"; -- 0x0690
+ when 001681 => D <= "10110100"; -- 0x0691
+ when 001682 => D <= "01001001"; -- 0x0692
+ when 001683 => D <= "11010101"; -- 0x0693
+ when 001684 => D <= "00110000"; -- 0x0694
+ when 001685 => D <= "00010010"; -- 0x0695
+ when 001686 => D <= "00000010"; -- 0x0696
+ when 001687 => D <= "11000010"; -- 0x0697
+ when 001688 => D <= "10101010"; -- 0x0698
+ when 001689 => D <= "01010011"; -- 0x0699
+ when 001690 => D <= "00100010"; -- 0x069A
+ when 001691 => D <= "00100000"; -- 0x069B
+ when 001692 => D <= "00110010"; -- 0x069C
+ when 001693 => D <= "11010001"; -- 0x069D
+ when 001694 => D <= "10011111"; -- 0x069E
+ when 001695 => D <= "01111101"; -- 0x069F
+ when 001696 => D <= "00001101"; -- 0x06A0
+ when 001697 => D <= "11110001"; -- 0x06A1
+ when 001698 => D <= "00001011"; -- 0x06A2
+ when 001699 => D <= "01111101"; -- 0x06A3
+ when 001700 => D <= "00001010"; -- 0x06A4
+ when 001701 => D <= "11100001"; -- 0x06A5
+ when 001702 => D <= "00001011"; -- 0x06A6
+ when 001703 => D <= "11010001"; -- 0x06A7
+ when 001704 => D <= "10011111"; -- 0x06A8
+ when 001705 => D <= "11100100"; -- 0x06A9
+ when 001706 => D <= "10010011"; -- 0x06AA
+ when 001707 => D <= "11000010"; -- 0x06AB
+ when 001708 => D <= "11100111"; -- 0x06AC
+ when 001709 => D <= "10110100"; -- 0x06AD
+ when 001710 => D <= "00100010"; -- 0x06AE
+ when 001711 => D <= "00000001"; -- 0x06AF
+ when 001712 => D <= "00100010"; -- 0x06B0
+ when 001713 => D <= "11010010"; -- 0x06B1
+ when 001714 => D <= "00110100"; -- 0x06B2
+ when 001715 => D <= "11111101"; -- 0x06B3
+ when 001716 => D <= "11110001"; -- 0x06B4
+ when 001717 => D <= "00001011"; -- 0x06B5
+ when 001718 => D <= "10100011"; -- 0x06B6
+ when 001719 => D <= "10000000"; -- 0x06B7
+ when 001720 => D <= "00000100"; -- 0x06B8
+ when 001721 => D <= "10110001"; -- 0x06B9
+ when 001722 => D <= "01110011"; -- 0x06BA
+ when 001723 => D <= "01111100"; -- 0x06BB
+ when 001724 => D <= "00001101"; -- 0x06BC
+ when 001725 => D <= "00010000"; -- 0x06BD
+ when 001726 => D <= "00110100"; -- 0x06BE
+ when 001727 => D <= "11101001"; -- 0x06BF
+ when 001728 => D <= "11100000"; -- 0x06C0
+ when 001729 => D <= "01100000"; -- 0x06C1
+ when 001730 => D <= "00000011"; -- 0x06C2
+ when 001731 => D <= "10110101"; -- 0x06C3
+ when 001732 => D <= "00000100"; -- 0x06C4
+ when 001733 => D <= "00000001"; -- 0x06C5
+ when 001734 => D <= "00100010"; -- 0x06C6
+ when 001735 => D <= "10110100"; -- 0x06C7
+ when 001736 => D <= "00001101"; -- 0x06C8
+ when 001737 => D <= "11101001"; -- 0x06C9
+ when 001738 => D <= "00000010"; -- 0x06CA
+ when 001739 => D <= "00011000"; -- 0x06CB
+ when 001740 => D <= "01111111"; -- 0x06CC
+ when 001741 => D <= "10110100"; -- 0x06CD
+ when 001742 => D <= "00000100"; -- 0x06CE
+ when 001743 => D <= "00010110"; -- 0x06CF
+ when 001744 => D <= "11010001"; -- 0x06D0
+ when 001745 => D <= "10011111"; -- 0x06D1
+ when 001746 => D <= "01110101"; -- 0x06D2
+ when 001747 => D <= "10100000"; -- 0x06D3
+ when 001748 => D <= "00000000"; -- 0x06D4
+ when 001749 => D <= "01111000"; -- 0x06D5
+ when 001750 => D <= "00000111"; -- 0x06D6
+ when 001751 => D <= "11110001"; -- 0x06D7
+ when 001752 => D <= "10001011"; -- 0x06D8
+ when 001753 => D <= "11111101"; -- 0x06D9
+ when 001754 => D <= "10110100"; -- 0x06DA
+ when 001755 => D <= "01111111"; -- 0x06DB
+ when 001756 => D <= "11110000"; -- 0x06DC
+ when 001757 => D <= "10111000"; -- 0x06DD
+ when 001758 => D <= "00000111"; -- 0x06DE
+ when 001759 => D <= "00011000"; -- 0x06DF
+ when 001760 => D <= "01111101"; -- 0x06E0
+ when 001761 => D <= "00000111"; -- 0x06E1
+ when 001762 => D <= "11110001"; -- 0x06E2
+ when 001763 => D <= "00001011"; -- 0x06E3
+ when 001764 => D <= "10000000"; -- 0x06E4
+ when 001765 => D <= "11110001"; -- 0x06E5
+ when 001766 => D <= "11110010"; -- 0x06E6
+ when 001767 => D <= "10110100"; -- 0x06E7
+ when 001768 => D <= "00001101"; -- 0x06E8
+ when 001769 => D <= "00000010"; -- 0x06E9
+ when 001770 => D <= "11000001"; -- 0x06EA
+ when 001771 => D <= "10011111"; -- 0x06EB
+ when 001772 => D <= "10110100"; -- 0x06EC
+ when 001773 => D <= "00100000"; -- 0x06ED
+ when 001774 => D <= "00000000"; -- 0x06EE
+ when 001775 => D <= "01000000"; -- 0x06EF
+ when 001776 => D <= "11110001"; -- 0x06F0
+ when 001777 => D <= "00001000"; -- 0x06F1
+ when 001778 => D <= "10111000"; -- 0x06F2
+ when 001779 => D <= "01010110"; -- 0x06F3
+ when 001780 => D <= "11101101"; -- 0x06F4
+ when 001781 => D <= "00011000"; -- 0x06F5
+ when 001782 => D <= "10000000"; -- 0x06F6
+ when 001783 => D <= "11101000"; -- 0x06F7
+ when 001784 => D <= "00011000"; -- 0x06F8
+ when 001785 => D <= "01111101"; -- 0x06F9
+ when 001786 => D <= "00001000"; -- 0x06FA
+ when 001787 => D <= "11110001"; -- 0x06FB
+ when 001788 => D <= "00001011"; -- 0x06FC
+ when 001789 => D <= "11110001"; -- 0x06FD
+ when 001790 => D <= "00001001"; -- 0x06FE
+ when 001791 => D <= "01111101"; -- 0x06FF
+ when 001792 => D <= "00001000"; -- 0x0700
+ when 001793 => D <= "10000000"; -- 0x0701
+ when 001794 => D <= "11011111"; -- 0x0702
+ when 001795 => D <= "01111110"; -- 0x0703
+ when 001796 => D <= "00000000"; -- 0x0704
+ when 001797 => D <= "00000000"; -- 0x0705
+ when 001798 => D <= "01010000"; -- 0x0706
+ when 001799 => D <= "01100111"; -- 0x0707
+ when 001800 => D <= "01000001"; -- 0x0708
+ when 001801 => D <= "01111101"; -- 0x0709
+ when 001802 => D <= "00100000"; -- 0x070A
+ when 001803 => D <= "11000000"; -- 0x070B
+ when 001804 => D <= "11100000"; -- 0x070C
+ when 001805 => D <= "11000000"; -- 0x070D
+ when 001806 => D <= "10000011"; -- 0x070E
+ when 001807 => D <= "11000000"; -- 0x070F
+ when 001808 => D <= "10000010"; -- 0x0710
+ when 001809 => D <= "00110000"; -- 0x0711
+ when 001810 => D <= "00110101"; -- 0x0712
+ when 001811 => D <= "00000100"; -- 0x0713
+ when 001812 => D <= "11110001"; -- 0x0714
+ when 001813 => D <= "10000111"; -- 0x0715
+ when 001814 => D <= "10000000"; -- 0x0716
+ when 001815 => D <= "11111001"; -- 0x0717
+ when 001816 => D <= "11101101"; -- 0x0718
+ when 001817 => D <= "00110000"; -- 0x0719
+ when 001818 => D <= "00101100"; -- 0x071A
+ when 001819 => D <= "00000101"; -- 0x071B
+ when 001820 => D <= "00010010"; -- 0x071C
+ when 001821 => D <= "00100000"; -- 0x071D
+ when 001822 => D <= "01000000"; -- 0x071E
+ when 001823 => D <= "11100001"; -- 0x071F
+ when 001824 => D <= "01100000"; -- 0x0720
+ when 001825 => D <= "00110000"; -- 0x0721
+ when 001826 => D <= "00011100"; -- 0x0722
+ when 001827 => D <= "00000101"; -- 0x0723
+ when 001828 => D <= "00010010"; -- 0x0724
+ when 001829 => D <= "01000000"; -- 0x0725
+ when 001830 => D <= "00110000"; -- 0x0726
+ when 001831 => D <= "11100001"; -- 0x0727
+ when 001832 => D <= "01100000"; -- 0x0728
+ when 001833 => D <= "00110000"; -- 0x0729
+ when 001834 => D <= "00100111"; -- 0x072A
+ when 001835 => D <= "00001000"; -- 0x072B
+ when 001836 => D <= "00110000"; -- 0x072C
+ when 001837 => D <= "00011001"; -- 0x072D
+ when 001838 => D <= "00000101"; -- 0x072E
+ when 001839 => D <= "00010010"; -- 0x072F
+ when 001840 => D <= "01000000"; -- 0x0730
+ when 001841 => D <= "00111100"; -- 0x0731
+ when 001842 => D <= "11100001"; -- 0x0732
+ when 001843 => D <= "01100000"; -- 0x0733
+ when 001844 => D <= "00110000"; -- 0x0734
+ when 001845 => D <= "00011011"; -- 0x0735
+ when 001846 => D <= "00100010"; -- 0x0736
+ when 001847 => D <= "10010000"; -- 0x0737
+ when 001848 => D <= "00000001"; -- 0x0738
+ when 001849 => D <= "00100100"; -- 0x0739
+ when 001850 => D <= "10110001"; -- 0x073A
+ when 001851 => D <= "01111100"; -- 0x073B
+ when 001852 => D <= "11000010"; -- 0x073C
+ when 001853 => D <= "10010111"; -- 0x073D
+ when 001854 => D <= "10110001"; -- 0x073E
+ when 001855 => D <= "00100111"; -- 0x073F
+ when 001856 => D <= "11101101"; -- 0x0740
+ when 001857 => D <= "11010011"; -- 0x0741
+ when 001858 => D <= "01111101"; -- 0x0742
+ when 001859 => D <= "00001001"; -- 0x0743
+ when 001860 => D <= "00010011"; -- 0x0744
+ when 001861 => D <= "00110000"; -- 0x0745
+ when 001862 => D <= "10001111"; -- 0x0746
+ when 001863 => D <= "11111101"; -- 0x0747
+ when 001864 => D <= "10010010"; -- 0x0748
+ when 001865 => D <= "10010111"; -- 0x0749
+ when 001866 => D <= "10110001"; -- 0x074A
+ when 001867 => D <= "00100111"; -- 0x074B
+ when 001868 => D <= "11011101"; -- 0x074C
+ when 001869 => D <= "11110110"; -- 0x074D
+ when 001870 => D <= "00110000"; -- 0x074E
+ when 001871 => D <= "10001111"; -- 0x074F
+ when 001872 => D <= "11111101"; -- 0x0750
+ when 001873 => D <= "10110001"; -- 0x0751
+ when 001874 => D <= "00100111"; -- 0x0752
+ when 001875 => D <= "00110000"; -- 0x0753
+ when 001876 => D <= "10001111"; -- 0x0754
+ when 001877 => D <= "11111101"; -- 0x0755
+ when 001878 => D <= "11111101"; -- 0x0756
+ when 001879 => D <= "10000000"; -- 0x0757
+ when 001880 => D <= "00000111"; -- 0x0758
+ when 001881 => D <= "00110000"; -- 0x0759
+ when 001882 => D <= "10011001"; -- 0x075A
+ when 001883 => D <= "11111101"; -- 0x075B
+ when 001884 => D <= "11000010"; -- 0x075C
+ when 001885 => D <= "10011001"; -- 0x075D
+ when 001886 => D <= "10001101"; -- 0x075E
+ when 001887 => D <= "10011001"; -- 0x075F
+ when 001888 => D <= "10111101"; -- 0x0760
+ when 001889 => D <= "00001101"; -- 0x0761
+ when 001890 => D <= "00000011"; -- 0x0762
+ when 001891 => D <= "01110101"; -- 0x0763
+ when 001892 => D <= "00010110"; -- 0x0764
+ when 001893 => D <= "00000000"; -- 0x0765
+ when 001894 => D <= "10111101"; -- 0x0766
+ when 001895 => D <= "00001010"; -- 0x0767
+ when 001896 => D <= "00001011"; -- 0x0768
+ when 001897 => D <= "11100101"; -- 0x0769
+ when 001898 => D <= "00010101"; -- 0x076A
+ when 001899 => D <= "01100000"; -- 0x076B
+ when 001900 => D <= "00000111"; -- 0x076C
+ when 001901 => D <= "01111101"; -- 0x076D
+ when 001902 => D <= "00000000"; -- 0x076E
+ when 001903 => D <= "11110001"; -- 0x076F
+ when 001904 => D <= "00001011"; -- 0x0770
+ when 001905 => D <= "00010100"; -- 0x0771
+ when 001906 => D <= "01110000"; -- 0x0772
+ when 001907 => D <= "11111001"; -- 0x0773
+ when 001908 => D <= "10111101"; -- 0x0774
+ when 001909 => D <= "00001000"; -- 0x0775
+ when 001910 => D <= "00000010"; -- 0x0776
+ when 001911 => D <= "00010101"; -- 0x0777
+ when 001912 => D <= "00010110"; -- 0x0778
+ when 001913 => D <= "10111101"; -- 0x0779
+ when 001914 => D <= "00100000"; -- 0x077A
+ when 001915 => D <= "00000000"; -- 0x077B
+ when 001916 => D <= "01000000"; -- 0x077C
+ when 001917 => D <= "00000010"; -- 0x077D
+ when 001918 => D <= "00000101"; -- 0x077E
+ when 001919 => D <= "00010110"; -- 0x077F
+ when 001920 => D <= "11010000"; -- 0x0780
+ when 001921 => D <= "10000010"; -- 0x0781
+ when 001922 => D <= "11010000"; -- 0x0782
+ when 001923 => D <= "10000011"; -- 0x0783
+ when 001924 => D <= "11010000"; -- 0x0784
+ when 001925 => D <= "11100000"; -- 0x0785
+ when 001926 => D <= "00100010"; -- 0x0786
+ when 001927 => D <= "11110001"; -- 0x0787
+ when 001928 => D <= "11000110"; -- 0x0788
+ when 001929 => D <= "01010000"; -- 0x0789
+ when 001930 => D <= "00110010"; -- 0x078A
+ when 001931 => D <= "00110000"; -- 0x078B
+ when 001932 => D <= "00110010"; -- 0x078C
+ when 001933 => D <= "00000101"; -- 0x078D
+ when 001934 => D <= "00010010"; -- 0x078E
+ when 001935 => D <= "00100000"; -- 0x078F
+ when 001936 => D <= "01100000"; -- 0x0790
+ when 001937 => D <= "10000000"; -- 0x0791
+ when 001938 => D <= "00010001"; -- 0x0792
+ when 001939 => D <= "00110000"; -- 0x0793
+ when 001940 => D <= "00011110"; -- 0x0794
+ when 001941 => D <= "00000101"; -- 0x0795
+ when 001942 => D <= "00010010"; -- 0x0796
+ when 001943 => D <= "01000000"; -- 0x0797
+ when 001944 => D <= "00110011"; -- 0x0798
+ when 001945 => D <= "10000000"; -- 0x0799
+ when 001946 => D <= "00001001"; -- 0x079A
+ when 001947 => D <= "00110000"; -- 0x079B
+ when 001948 => D <= "10011000"; -- 0x079C
+ when 001949 => D <= "11111101"; -- 0x079D
+ when 001950 => D <= "11100101"; -- 0x079E
+ when 001951 => D <= "10011001"; -- 0x079F
+ when 001952 => D <= "11000010"; -- 0x07A0
+ when 001953 => D <= "10011000"; -- 0x07A1
+ when 001954 => D <= "11000010"; -- 0x07A2
+ when 001955 => D <= "11100111"; -- 0x07A3
+ when 001956 => D <= "10110100"; -- 0x07A4
+ when 001957 => D <= "00010011"; -- 0x07A5
+ when 001958 => D <= "00000010"; -- 0x07A6
+ when 001959 => D <= "11010010"; -- 0x07A7
+ when 001960 => D <= "00110101"; -- 0x07A8
+ when 001961 => D <= "10110100"; -- 0x07A9
+ when 001962 => D <= "00010001"; -- 0x07AA
+ when 001963 => D <= "00000010"; -- 0x07AB
+ when 001964 => D <= "11000010"; -- 0x07AC
+ when 001965 => D <= "00110101"; -- 0x07AD
+ when 001966 => D <= "10110100"; -- 0x07AE
+ when 001967 => D <= "00000011"; -- 0x07AF
+ when 001968 => D <= "00000100"; -- 0x07B0
+ when 001969 => D <= "00110000"; -- 0x07B1
+ when 001970 => D <= "00110000"; -- 0x07B2
+ when 001971 => D <= "00100110"; -- 0x07B3
+ when 001972 => D <= "00100010"; -- 0x07B4
+ when 001973 => D <= "11000010"; -- 0x07B5
+ when 001974 => D <= "00101000"; -- 0x07B6
+ when 001975 => D <= "10110100"; -- 0x07B7
+ when 001976 => D <= "00010111"; -- 0x07B8
+ when 001977 => D <= "00000010"; -- 0x07B9
+ when 001978 => D <= "11010010"; -- 0x07BA
+ when 001979 => D <= "00101000"; -- 0x07BB
+ when 001980 => D <= "11010011"; -- 0x07BC
+ when 001981 => D <= "00100010"; -- 0x07BD
+ when 001982 => D <= "11010010"; -- 0x07BE
+ when 001983 => D <= "00011101"; -- 0x07BF
+ when 001984 => D <= "10110001"; -- 0x07C0
+ when 001985 => D <= "00111101"; -- 0x07C1
+ when 001986 => D <= "00010000"; -- 0x07C2
+ when 001987 => D <= "00011101"; -- 0x07C3
+ when 001988 => D <= "01000011"; -- 0x07C4
+ when 001989 => D <= "00100010"; -- 0x07C5
+ when 001990 => D <= "00110000"; -- 0x07C6
+ when 001991 => D <= "00110010"; -- 0x07C7
+ when 001992 => D <= "00000011"; -- 0x07C8
+ when 001993 => D <= "00000010"; -- 0x07C9
+ when 001994 => D <= "00100000"; -- 0x07CA
+ when 001995 => D <= "01101000"; -- 0x07CB
+ when 001996 => D <= "00110000"; -- 0x07CC
+ when 001997 => D <= "00011110"; -- 0x07CD
+ when 001998 => D <= "00000011"; -- 0x07CE
+ when 001999 => D <= "00000010"; -- 0x07CF
+ when 002000 => D <= "01000000"; -- 0x07D0
+ when 002001 => D <= "00110110"; -- 0x07D1
+ when 002002 => D <= "10100010"; -- 0x07D2
+ when 002003 => D <= "10011000"; -- 0x07D3
+ when 002004 => D <= "00100010"; -- 0x07D4
+ when 002005 => D <= "10010000"; -- 0x07D5
+ when 002006 => D <= "00011001"; -- 0x07D6
+ when 002007 => D <= "01111000"; -- 0x07D7
+ when 002008 => D <= "11010001"; -- 0x07D8
+ when 002009 => D <= "10101001"; -- 0x07D9
+ when 002010 => D <= "11000010"; -- 0x07DA
+ when 002011 => D <= "00110101"; -- 0x07DB
+ when 002012 => D <= "00010010"; -- 0x07DC
+ when 002013 => D <= "00001100"; -- 0x07DD
+ when 002014 => D <= "00110100"; -- 0x07DE
+ when 002015 => D <= "11010001"; -- 0x07DF
+ when 002016 => D <= "10011111"; -- 0x07E0
+ when 002017 => D <= "00010000"; -- 0x07E1
+ when 002018 => D <= "00101000"; -- 0x07E2
+ when 002019 => D <= "11110001"; -- 0x07E3
+ when 002020 => D <= "00110000"; -- 0x07E4
+ when 002021 => D <= "00101111"; -- 0x07E5
+ when 002022 => D <= "01111111"; -- 0x07E6
+ when 002023 => D <= "10100001"; -- 0x07E7
+ when 002024 => D <= "00111010"; -- 0x07E8
+ when 002025 => D <= "11100101"; -- 0x07E9
+ when 002026 => D <= "01001000"; -- 0x07EA
+ when 002027 => D <= "10101001"; -- 0x07EB
+ when 002028 => D <= "01001001"; -- 0x07EC
+ when 002029 => D <= "10110101"; -- 0x07ED
+ when 002030 => D <= "01001000"; -- 0x07EE
+ when 002031 => D <= "11111001"; -- 0x07EF
+ when 002032 => D <= "11001001"; -- 0x07F0
+ when 002033 => D <= "10010101"; -- 0x07F1
+ when 002034 => D <= "01001100"; -- 0x07F2
+ when 002035 => D <= "11101001"; -- 0x07F3
+ when 002036 => D <= "10010101"; -- 0x07F4
+ when 002037 => D <= "01001011"; -- 0x07F5
+ when 002038 => D <= "00100010"; -- 0x07F6
+ when 002039 => D <= "11110001"; -- 0x07F7
+ when 002040 => D <= "11101001"; -- 0x07F8
+ when 002041 => D <= "01000000"; -- 0x07F9
+ when 002042 => D <= "01000000"; -- 0x07FA
+ when 002043 => D <= "11010010"; -- 0x07FB
+ when 002044 => D <= "00010100"; -- 0x07FC
+ when 002045 => D <= "11000010"; -- 0x07FD
+ when 002046 => D <= "00010000"; -- 0x07FE
+ when 002047 => D <= "10100010"; -- 0x07FF
+ when 002048 => D <= "00010001"; -- 0x0800
+ when 002049 => D <= "10010010"; -- 0x0801
+ when 002050 => D <= "00101011"; -- 0x0802
+ when 002051 => D <= "10010000"; -- 0x0803
+ when 002052 => D <= "00000001"; -- 0x0804
+ when 002053 => D <= "00100110"; -- 0x0805
+ when 002054 => D <= "10000000"; -- 0x0806
+ when 002055 => D <= "00111100"; -- 0x0807
+ when 002056 => D <= "00010010"; -- 0x0808
+ when 002057 => D <= "00000110"; -- 0x0809
+ when 002058 => D <= "01011100"; -- 0x080A
+ when 002059 => D <= "01110001"; -- 0x080B
+ when 002060 => D <= "11010011"; -- 0x080C
+ when 002061 => D <= "01010001"; -- 0x080D
+ when 002062 => D <= "10100111"; -- 0x080E
+ when 002063 => D <= "01100000"; -- 0x080F
+ when 002064 => D <= "01001010"; -- 0x0810
+ when 002065 => D <= "11010001"; -- 0x0811
+ when 002066 => D <= "10111011"; -- 0x0812
+ when 002067 => D <= "11110001"; -- 0x0813
+ when 002068 => D <= "00100110"; -- 0x0814
+ when 002069 => D <= "10010001"; -- 0x0815
+ when 002070 => D <= "00111111"; -- 0x0816
+ when 002071 => D <= "11000010"; -- 0x0817
+ when 002072 => D <= "00101111"; -- 0x0818
+ when 002073 => D <= "10000101"; -- 0x0819
+ when 002074 => D <= "00111110"; -- 0x081A
+ when 002075 => D <= "10000001"; -- 0x081B
+ when 002076 => D <= "00100000"; -- 0x081C
+ when 002077 => D <= "00101111"; -- 0x081D
+ when 002078 => D <= "00000110"; -- 0x081E
+ when 002079 => D <= "10000101"; -- 0x081F
+ when 002080 => D <= "00001010"; -- 0x0820
+ when 002081 => D <= "01000010"; -- 0x0821
+ when 002082 => D <= "10000101"; -- 0x0822
+ when 002083 => D <= "00001000"; -- 0x0823
+ when 002084 => D <= "01000011"; -- 0x0824
+ when 002085 => D <= "00010010"; -- 0x0825
+ when 002086 => D <= "00000111"; -- 0x0826
+ when 002087 => D <= "10000111"; -- 0x0827
+ when 002088 => D <= "00100000"; -- 0x0828
+ when 002089 => D <= "00101111"; -- 0x0829
+ when 002090 => D <= "00100100"; -- 0x082A
+ when 002091 => D <= "10110000"; -- 0x082B
+ when 002092 => D <= "00011000"; -- 0x082C
+ when 002093 => D <= "01010000"; -- 0x082D
+ when 002094 => D <= "00000110"; -- 0x082E
+ when 002095 => D <= "10010000"; -- 0x082F
+ when 002096 => D <= "00000001"; -- 0x0830
+ when 002097 => D <= "00000000"; -- 0x0831
+ when 002098 => D <= "11110000"; -- 0x0832
+ when 002099 => D <= "11010010"; -- 0x0833
+ when 002100 => D <= "00011000"; -- 0x0834
+ when 002101 => D <= "00100000"; -- 0x0835
+ when 002102 => D <= "00010100"; -- 0x0836
+ when 002103 => D <= "00010111"; -- 0x0837
+ when 002104 => D <= "00100000"; -- 0x0838
+ when 002105 => D <= "00010000"; -- 0x0839
+ when 002106 => D <= "10111100"; -- 0x083A
+ when 002107 => D <= "00110000"; -- 0x083B
+ when 002108 => D <= "00010110"; -- 0x083C
+ when 002109 => D <= "00010001"; -- 0x083D
+ when 002110 => D <= "00100000"; -- 0x083E
+ when 002111 => D <= "00010001"; -- 0x083F
+ when 002112 => D <= "00001110"; -- 0x0840
+ when 002113 => D <= "10010000"; -- 0x0841
+ when 002114 => D <= "00000001"; -- 0x0842
+ when 002115 => D <= "00100000"; -- 0x0843
+ when 002116 => D <= "01111100"; -- 0x0844
+ when 002117 => D <= "00000010"; -- 0x0845
+ when 002118 => D <= "01110001"; -- 0x0846
+ when 002119 => D <= "00111000"; -- 0x0847
+ when 002120 => D <= "11010010"; -- 0x0848
+ when 002121 => D <= "00010001"; -- 0x0849
+ when 002122 => D <= "00010010"; -- 0x084A
+ when 002123 => D <= "00000101"; -- 0x084B
+ when 002124 => D <= "01101101"; -- 0x084C
+ when 002125 => D <= "01000001"; -- 0x084D
+ when 002126 => D <= "11111011"; -- 0x084E
+ when 002127 => D <= "00010001"; -- 0x084F
+ when 002128 => D <= "11111011"; -- 0x0850
+ when 002129 => D <= "11110001"; -- 0x0851
+ when 002130 => D <= "00011010"; -- 0x0852
+ when 002131 => D <= "01010000"; -- 0x0853
+ when 002132 => D <= "11000100"; -- 0x0854
+ when 002133 => D <= "00110000"; -- 0x0855
+ when 002134 => D <= "00101111"; -- 0x0856
+ when 002135 => D <= "00000011"; -- 0x0857
+ when 002136 => D <= "00000010"; -- 0x0858
+ when 002137 => D <= "00010111"; -- 0x0859
+ when 002138 => D <= "10010100"; -- 0x085A
+ when 002139 => D <= "00000010"; -- 0x085B
+ when 002140 => D <= "00010111"; -- 0x085C
+ when 002141 => D <= "01111110"; -- 0x085D
+ when 002142 => D <= "11110001"; -- 0x085E
+ when 002143 => D <= "00011010"; -- 0x085F
+ when 002144 => D <= "10000101"; -- 0x0860
+ when 002145 => D <= "00001010"; -- 0x0861
+ when 002146 => D <= "01000010"; -- 0x0862
+ when 002147 => D <= "10000101"; -- 0x0863
+ when 002148 => D <= "00001000"; -- 0x0864
+ when 002149 => D <= "01000011"; -- 0x0865
+ when 002150 => D <= "11010010"; -- 0x0866
+ when 002151 => D <= "00010111"; -- 0x0867
+ when 002152 => D <= "10010000"; -- 0x0868
+ when 002153 => D <= "00000000"; -- 0x0869
+ when 002154 => D <= "11101100"; -- 0x086A
+ when 002155 => D <= "11010010"; -- 0x086B
+ when 002156 => D <= "00100000"; -- 0x086C
+ when 002157 => D <= "00000010"; -- 0x086D
+ when 002158 => D <= "00011000"; -- 0x086E
+ when 002159 => D <= "10100111"; -- 0x086F
+ when 002160 => D <= "10110100"; -- 0x0870
+ when 002161 => D <= "11001000"; -- 0x0871
+ when 002162 => D <= "00000101"; -- 0x0872
+ when 002163 => D <= "10001011"; -- 0x0873
+ when 002164 => D <= "10001100"; -- 0x0874
+ when 002165 => D <= "10001001"; -- 0x0875
+ when 002166 => D <= "10001010"; -- 0x0876
+ when 002167 => D <= "00100010"; -- 0x0877
+ when 002168 => D <= "10110100"; -- 0x0878
+ when 002169 => D <= "11001001"; -- 0x0879
+ when 002170 => D <= "00000101"; -- 0x087A
+ when 002171 => D <= "10001011"; -- 0x087B
+ when 002172 => D <= "10001101"; -- 0x087C
+ when 002173 => D <= "10001001"; -- 0x087D
+ when 002174 => D <= "10001011"; -- 0x087E
+ when 002175 => D <= "00100010"; -- 0x087F
+ when 002176 => D <= "10110100"; -- 0x0880
+ when 002177 => D <= "11001010"; -- 0x0881
+ when 002178 => D <= "00000101"; -- 0x0882
+ when 002179 => D <= "10001011"; -- 0x0883
+ when 002180 => D <= "11001101"; -- 0x0884
+ when 002181 => D <= "10001001"; -- 0x0885
+ when 002182 => D <= "11001100"; -- 0x0886
+ when 002183 => D <= "00100010"; -- 0x0887
+ when 002184 => D <= "10110100"; -- 0x0888
+ when 002185 => D <= "11001110"; -- 0x0889
+ when 002186 => D <= "00000101"; -- 0x088A
+ when 002187 => D <= "10001011"; -- 0x088B
+ when 002188 => D <= "11001011"; -- 0x088C
+ when 002189 => D <= "10001001"; -- 0x088D
+ when 002190 => D <= "11001010"; -- 0x088E
+ when 002191 => D <= "00100010"; -- 0x088F
+ when 002192 => D <= "00110001"; -- 0x0890
+ when 002193 => D <= "11011000"; -- 0x0891
+ when 002194 => D <= "10110100"; -- 0x0892
+ when 002195 => D <= "11001011"; -- 0x0893
+ when 002196 => D <= "00000011"; -- 0x0894
+ when 002197 => D <= "10001001"; -- 0x0895
+ when 002198 => D <= "11001000"; -- 0x0896
+ when 002199 => D <= "00100010"; -- 0x0897
+ when 002200 => D <= "10110100"; -- 0x0898
+ when 002201 => D <= "11000110"; -- 0x0899
+ when 002202 => D <= "00000011"; -- 0x089A
+ when 002203 => D <= "10001001"; -- 0x089B
+ when 002204 => D <= "10101000"; -- 0x089C
+ when 002205 => D <= "00100010"; -- 0x089D
+ when 002206 => D <= "10110100"; -- 0x089E
+ when 002207 => D <= "11000111"; -- 0x089F
+ when 002208 => D <= "00000011"; -- 0x08A0
+ when 002209 => D <= "10001001"; -- 0x08A1
+ when 002210 => D <= "10111000"; -- 0x08A2
+ when 002211 => D <= "00100010"; -- 0x08A3
+ when 002212 => D <= "10110100"; -- 0x08A4
+ when 002213 => D <= "11001100"; -- 0x08A5
+ when 002214 => D <= "00000011"; -- 0x08A6
+ when 002215 => D <= "10001001"; -- 0x08A7
+ when 002216 => D <= "10001000"; -- 0x08A8
+ when 002217 => D <= "00100010"; -- 0x08A9
+ when 002218 => D <= "10110100"; -- 0x08AA
+ when 002219 => D <= "11001101"; -- 0x08AB
+ when 002220 => D <= "00000011"; -- 0x08AC
+ when 002221 => D <= "10001001"; -- 0x08AD
+ when 002222 => D <= "10001001"; -- 0x08AE
+ when 002223 => D <= "00100010"; -- 0x08AF
+ when 002224 => D <= "10110100"; -- 0x08B0
+ when 002225 => D <= "11001111"; -- 0x08B1
+ when 002226 => D <= "00101111"; -- 0x08B2
+ when 002227 => D <= "10001001"; -- 0x08B3
+ when 002228 => D <= "10010000"; -- 0x08B4
+ when 002229 => D <= "00100010"; -- 0x08B5
+ when 002230 => D <= "11110101"; -- 0x08B6
+ when 002231 => D <= "00001111"; -- 0x08B7
+ when 002232 => D <= "11010001"; -- 0x08B8
+ when 002233 => D <= "11011010"; -- 0x08B9
+ when 002234 => D <= "00110001"; -- 0x08BA
+ when 002235 => D <= "11001011"; -- 0x08BB
+ when 002236 => D <= "11100101"; -- 0x08BC
+ when 002237 => D <= "00001111"; -- 0x08BD
+ when 002238 => D <= "10110100"; -- 0x08BE
+ when 002239 => D <= "11000011"; -- 0x08BF
+ when 002240 => D <= "00000011"; -- 0x08C0
+ when 002241 => D <= "00000010"; -- 0x08C1
+ when 002242 => D <= "00010110"; -- 0x08C2
+ when 002243 => D <= "01000111"; -- 0x08C3
+ when 002244 => D <= "11010001"; -- 0x08C4
+ when 002245 => D <= "10010011"; -- 0x08C5
+ when 002246 => D <= "11100101"; -- 0x08C6
+ when 002247 => D <= "00001111"; -- 0x08C7
+ when 002248 => D <= "10110100"; -- 0x08C8
+ when 002249 => D <= "11000100"; -- 0x08C9
+ when 002250 => D <= "00001001"; -- 0x08CA
+ when 002251 => D <= "10010000"; -- 0x08CB
+ when 002252 => D <= "00000001"; -- 0x08CC
+ when 002253 => D <= "00001010"; -- 0x08CD
+ when 002254 => D <= "00010010"; -- 0x08CE
+ when 002255 => D <= "00000101"; -- 0x08CF
+ when 002256 => D <= "11111111"; -- 0x08D0
+ when 002257 => D <= "00000010"; -- 0x08D1
+ when 002258 => D <= "00000110"; -- 0x08D2
+ when 002259 => D <= "01011110"; -- 0x08D3
+ when 002260 => D <= "10110100"; -- 0x08D4
+ when 002261 => D <= "11000101"; -- 0x08D5
+ when 002262 => D <= "10011001"; -- 0x08D6
+ when 002263 => D <= "10100010"; -- 0x08D7
+ when 002264 => D <= "10101111"; -- 0x08D8
+ when 002265 => D <= "11000010"; -- 0x08D9
+ when 002266 => D <= "10101111"; -- 0x08DA
+ when 002267 => D <= "10001011"; -- 0x08DB
+ when 002268 => D <= "01001000"; -- 0x08DC
+ when 002269 => D <= "10001001"; -- 0x08DD
+ when 002270 => D <= "01001001"; -- 0x08DE
+ when 002271 => D <= "10010010"; -- 0x08DF
+ when 002272 => D <= "10101111"; -- 0x08E0
+ when 002273 => D <= "00100010"; -- 0x08E1
+ when 002274 => D <= "10110100"; -- 0x08E2
+ when 002275 => D <= "11010000"; -- 0x08E3
+ when 002276 => D <= "01010110"; -- 0x08E4
+ when 002277 => D <= "10001001"; -- 0x08E5
+ when 002278 => D <= "10000111"; -- 0x08E6
+ when 002279 => D <= "00100010"; -- 0x08E7
+ when 002280 => D <= "10110100"; -- 0x08E8
+ when 002281 => D <= "11010001"; -- 0x08E9
+ when 002282 => D <= "11001011"; -- 0x08EA
+ when 002283 => D <= "11010001"; -- 0x08EB
+ when 002284 => D <= "11001110"; -- 0x08EC
+ when 002285 => D <= "10110100"; -- 0x08ED
+ when 002286 => D <= "00100100"; -- 0x08EE
+ when 002287 => D <= "01001011"; -- 0x08EF
+ when 002288 => D <= "01010001"; -- 0x08F0
+ when 002289 => D <= "00100001"; -- 0x08F1
+ when 002290 => D <= "10110001"; -- 0x08F2
+ when 002291 => D <= "10110000"; -- 0x08F3
+ when 002292 => D <= "00010010"; -- 0x08F4
+ when 002293 => D <= "00010100"; -- 0x08F5
+ when 002294 => D <= "10011111"; -- 0x08F6
+ when 002295 => D <= "00110001"; -- 0x08F7
+ when 002296 => D <= "11100000"; -- 0x08F8
+ when 002297 => D <= "00100001"; -- 0x08F9
+ when 002298 => D <= "00100100"; -- 0x08FA
+ when 002299 => D <= "11010001"; -- 0x08FB
+ when 002300 => D <= "11010000"; -- 0x08FC
+ when 002301 => D <= "00110000"; -- 0x08FD
+ when 002302 => D <= "00101101"; -- 0x08FE
+ when 002303 => D <= "00001110"; -- 0x08FF
+ when 002304 => D <= "10110100"; -- 0x0900
+ when 002305 => D <= "00100000"; -- 0x0901
+ when 002306 => D <= "00000000"; -- 0x0902
+ when 002307 => D <= "01010000"; -- 0x0903
+ when 002308 => D <= "00001001"; -- 0x0904
+ when 002309 => D <= "00010010"; -- 0x0905
+ when 002310 => D <= "00100000"; -- 0x0906
+ when 002311 => D <= "01110000"; -- 0x0907
+ when 002312 => D <= "11010001"; -- 0x0908
+ when 002313 => D <= "11011010"; -- 0x0909
+ when 002314 => D <= "01010100"; -- 0x090A
+ when 002315 => D <= "00001111"; -- 0x090B
+ when 002316 => D <= "10000000"; -- 0x090C
+ when 002317 => D <= "01010001"; -- 0x090D
+ when 002318 => D <= "10110100"; -- 0x090E
+ when 002319 => D <= "11000011"; -- 0x090F
+ when 002320 => D <= "00000000"; -- 0x0910
+ when 002321 => D <= "01010000"; -- 0x0911
+ when 002322 => D <= "11010101"; -- 0x0912
+ when 002323 => D <= "00110000"; -- 0x0913
+ when 002324 => D <= "11100111"; -- 0x0914
+ when 002325 => D <= "01011011"; -- 0x0915
+ when 002326 => D <= "10110100"; -- 0x0916
+ when 002327 => D <= "10111100"; -- 0x0917
+ when 002328 => D <= "00000110"; -- 0x0918
+ when 002329 => D <= "00110001"; -- 0x0919
+ when 002330 => D <= "11011100"; -- 0x091A
+ when 002331 => D <= "00110001"; -- 0x091B
+ when 002332 => D <= "11011000"; -- 0x091C
+ when 002333 => D <= "11110111"; -- 0x091D
+ when 002334 => D <= "00100010"; -- 0x091E
+ when 002335 => D <= "10110100"; -- 0x091F
+ when 002336 => D <= "10111101"; -- 0x0920
+ when 002337 => D <= "00000110"; -- 0x0921
+ when 002338 => D <= "00110001"; -- 0x0922
+ when 002339 => D <= "11011100"; -- 0x0923
+ when 002340 => D <= "10001011"; -- 0x0924
+ when 002341 => D <= "10100000"; -- 0x0925
+ when 002342 => D <= "11110011"; -- 0x0926
+ when 002343 => D <= "00100010"; -- 0x0927
+ when 002344 => D <= "10110100"; -- 0x0928
+ when 002345 => D <= "10101011"; -- 0x0929
+ when 002346 => D <= "00000000"; -- 0x092A
+ when 002347 => D <= "01000000"; -- 0x092B
+ when 002348 => D <= "00001001"; -- 0x092C
+ when 002349 => D <= "10110100"; -- 0x092D
+ when 002350 => D <= "10110000"; -- 0x092E
+ when 002351 => D <= "00000000"; -- 0x092F
+ when 002352 => D <= "01010000"; -- 0x0930
+ when 002353 => D <= "00001001"; -- 0x0931
+ when 002354 => D <= "00100100"; -- 0x0932
+ when 002355 => D <= "11111001"; -- 0x0933
+ when 002356 => D <= "10000000"; -- 0x0934
+ when 002357 => D <= "00011101"; -- 0x0935
+ when 002358 => D <= "10110100"; -- 0x0936
+ when 002359 => D <= "10100100"; -- 0x0937
+ when 002360 => D <= "00000000"; -- 0x0938
+ when 002361 => D <= "01000000"; -- 0x0939
+ when 002362 => D <= "00000011"; -- 0x093A
+ when 002363 => D <= "00000010"; -- 0x093B
+ when 002364 => D <= "00011000"; -- 0x093C
+ when 002365 => D <= "01111111"; -- 0x093D
+ when 002366 => D <= "00110000"; -- 0x093E
+ when 002367 => D <= "00101111"; -- 0x093F
+ when 002368 => D <= "00010010"; -- 0x0940
+ when 002369 => D <= "10110100"; -- 0x0941
+ when 002370 => D <= "10010000"; -- 0x0942
+ when 002371 => D <= "00000000"; -- 0x0943
+ when 002372 => D <= "01000000"; -- 0x0944
+ when 002373 => D <= "00001101"; -- 0x0945
+ when 002374 => D <= "10110100"; -- 0x0946
+ when 002375 => D <= "10100000"; -- 0x0947
+ when 002376 => D <= "00000010"; -- 0x0948
+ when 002377 => D <= "10000000"; -- 0x0949
+ when 002378 => D <= "00001000"; -- 0x094A
+ when 002379 => D <= "10110100"; -- 0x094B
+ when 002380 => D <= "10010111"; -- 0x094C
+ when 002381 => D <= "00000010"; -- 0x094D
+ when 002382 => D <= "10000000"; -- 0x094E
+ when 002383 => D <= "00000011"; -- 0x094F
+ when 002384 => D <= "10110100"; -- 0x0950
+ when 002385 => D <= "10010110"; -- 0x0951
+ when 002386 => D <= "11101000"; -- 0x0952
+ when 002387 => D <= "11010001"; -- 0x0953
+ when 002388 => D <= "11011010"; -- 0x0954
+ when 002389 => D <= "10010000"; -- 0x0955
+ when 002390 => D <= "00000001"; -- 0x0956
+ when 002391 => D <= "00100001"; -- 0x0957
+ when 002392 => D <= "10110100"; -- 0x0958
+ when 002393 => D <= "10000000"; -- 0x0959
+ when 002394 => D <= "00000010"; -- 0x095A
+ when 002395 => D <= "10000000"; -- 0x095B
+ when 002396 => D <= "10011110"; -- 0x095C
+ when 002397 => D <= "01010100"; -- 0x095D
+ when 002398 => D <= "00111111"; -- 0x095E
+ when 002399 => D <= "00100011"; -- 0x095F
+ when 002400 => D <= "00100101"; -- 0x0960
+ when 002401 => D <= "10000010"; -- 0x0961
+ when 002402 => D <= "11110101"; -- 0x0962
+ when 002403 => D <= "10000010"; -- 0x0963
+ when 002404 => D <= "11100100"; -- 0x0964
+ when 002405 => D <= "10010011"; -- 0x0965
+ when 002406 => D <= "11000000"; -- 0x0966
+ when 002407 => D <= "11100000"; -- 0x0967
+ when 002408 => D <= "10100011"; -- 0x0968
+ when 002409 => D <= "11100100"; -- 0x0969
+ when 002410 => D <= "10010011"; -- 0x096A
+ when 002411 => D <= "11010000"; -- 0x096B
+ when 002412 => D <= "10000011"; -- 0x096C
+ when 002413 => D <= "11110101"; -- 0x096D
+ when 002414 => D <= "10000010"; -- 0x096E
+ when 002415 => D <= "11100100"; -- 0x096F
+ when 002416 => D <= "01110011"; -- 0x0970
+ when 002417 => D <= "11010001"; -- 0x0971
+ when 002418 => D <= "11000010"; -- 0x0972
+ when 002419 => D <= "01000000"; -- 0x0973
+ when 002420 => D <= "01010000"; -- 0x0974
+ when 002421 => D <= "11000010"; -- 0x0975
+ when 002422 => D <= "00010101"; -- 0x0976
+ when 002423 => D <= "00010010"; -- 0x0977
+ when 002424 => D <= "00000101"; -- 0x0978
+ when 002425 => D <= "01110011"; -- 0x0979
+ when 002426 => D <= "01111111"; -- 0x097A
+ when 002427 => D <= "11101010"; -- 0x097B
+ when 002428 => D <= "10010001"; -- 0x097C
+ when 002429 => D <= "11101000"; -- 0x097D
+ when 002430 => D <= "11010001"; -- 0x097E
+ when 002431 => D <= "11010000"; -- 0x097F
+ when 002432 => D <= "10110100"; -- 0x0980
+ when 002433 => D <= "00100010"; -- 0x0981
+ when 002434 => D <= "00010001"; -- 0x0982
+ when 002435 => D <= "10101111"; -- 0x0983
+ when 002436 => D <= "00111111"; -- 0x0984
+ when 002437 => D <= "11010001"; -- 0x0985
+ when 002438 => D <= "11011010"; -- 0x0986
+ when 002439 => D <= "11010001"; -- 0x0987
+ when 002440 => D <= "11100100"; -- 0x0988
+ when 002441 => D <= "01100000"; -- 0x0989
+ when 002442 => D <= "10110000"; -- 0x098A
+ when 002443 => D <= "11110000"; -- 0x098B
+ when 002444 => D <= "10110100"; -- 0x098C
+ when 002445 => D <= "00100010"; -- 0x098D
+ when 002446 => D <= "00100110"; -- 0x098E
+ when 002447 => D <= "01110100"; -- 0x098F
+ when 002448 => D <= "00001101"; -- 0x0990
+ when 002449 => D <= "11110000"; -- 0x0991
+ when 002450 => D <= "11000001"; -- 0x0992
+ when 002451 => D <= "11011010"; -- 0x0993
+ when 002452 => D <= "11000000"; -- 0x0994
+ when 002453 => D <= "10000011"; -- 0x0995
+ when 002454 => D <= "11000000"; -- 0x0996
+ when 002455 => D <= "10000010"; -- 0x0997
+ when 002456 => D <= "11010001"; -- 0x0998
+ when 002457 => D <= "11000010"; -- 0x0999
+ when 002458 => D <= "01000000"; -- 0x099A
+ when 002459 => D <= "10011111"; -- 0x099B
+ when 002460 => D <= "11010000"; -- 0x099C
+ when 002461 => D <= "00000000"; -- 0x099D
+ when 002462 => D <= "11010000"; -- 0x099E
+ when 002463 => D <= "00000010"; -- 0x099F
+ when 002464 => D <= "10101111"; -- 0x09A0
+ when 002465 => D <= "00111111"; -- 0x09A1
+ when 002466 => D <= "00010010"; -- 0x09A2
+ when 002467 => D <= "00010101"; -- 0x09A3
+ when 002468 => D <= "10000001"; -- 0x09A4
+ when 002469 => D <= "10110100"; -- 0x09A5
+ when 002470 => D <= "00001101"; -- 0x09A6
+ when 002471 => D <= "00000001"; -- 0x09A7
+ when 002472 => D <= "00100010"; -- 0x09A8
+ when 002473 => D <= "11011111"; -- 0x09A9
+ when 002474 => D <= "00000101"; -- 0x09AA
+ when 002475 => D <= "01110100"; -- 0x09AB
+ when 002476 => D <= "00001101"; -- 0x09AC
+ when 002477 => D <= "11110010"; -- 0x09AD
+ when 002478 => D <= "11000001"; -- 0x09AE
+ when 002479 => D <= "01010001"; -- 0x09AF
+ when 002480 => D <= "00010010"; -- 0x09B0
+ when 002481 => D <= "00010101"; -- 0x09B1
+ when 002482 => D <= "01100001"; -- 0x09B2
+ when 002483 => D <= "10000000"; -- 0x09B3
+ when 002484 => D <= "11101101"; -- 0x09B4
+ when 002485 => D <= "11011111"; -- 0x09B5
+ when 002486 => D <= "00000110"; -- 0x09B6
+ when 002487 => D <= "00110001"; -- 0x09B7
+ when 002488 => D <= "10001111"; -- 0x09B8
+ when 002489 => D <= "11010001"; -- 0x09B9
+ when 002490 => D <= "01010001"; -- 0x09BA
+ when 002491 => D <= "11000001"; -- 0x09BB
+ when 002492 => D <= "11101111"; -- 0x09BC
+ when 002493 => D <= "10100011"; -- 0x09BD
+ when 002494 => D <= "10000000"; -- 0x09BE
+ when 002495 => D <= "11000101"; -- 0x09BF
+ when 002496 => D <= "10010000"; -- 0x09C0
+ when 002497 => D <= "00011000"; -- 0x09C1
+ when 002498 => D <= "00100010"; -- 0x09C2
+ when 002499 => D <= "10000001"; -- 0x09C3
+ when 002500 => D <= "00010001"; -- 0x09C4
+ when 002501 => D <= "00110001"; -- 0x09C5
+ when 002502 => D <= "11001001"; -- 0x09C6
+ when 002503 => D <= "11100001"; -- 0x09C7
+ when 002504 => D <= "11010110"; -- 0x09C8
+ when 002505 => D <= "11110001"; -- 0x09C9
+ when 002506 => D <= "00000100"; -- 0x09CA
+ when 002507 => D <= "11000000"; -- 0x09CB
+ when 002508 => D <= "00000010"; -- 0x09CC
+ when 002509 => D <= "11000000"; -- 0x09CD
+ when 002510 => D <= "00000000"; -- 0x09CE
+ when 002511 => D <= "01111111"; -- 0x09CF
+ when 002512 => D <= "11101010"; -- 0x09D0
+ when 002513 => D <= "11110001"; -- 0x09D1
+ when 002514 => D <= "01000100"; -- 0x09D2
+ when 002515 => D <= "11010000"; -- 0x09D3
+ when 002516 => D <= "00000001"; -- 0x09D4
+ when 002517 => D <= "11010000"; -- 0x09D5
+ when 002518 => D <= "00000011"; -- 0x09D6
+ when 002519 => D <= "00100010"; -- 0x09D7
+ when 002520 => D <= "10111011"; -- 0x09D8
+ when 002521 => D <= "00000000"; -- 0x09D9
+ when 002522 => D <= "11100101"; -- 0x09DA
+ when 002523 => D <= "00100010"; -- 0x09DB
+ when 002524 => D <= "11010001"; -- 0x09DC
+ when 002525 => D <= "11011010"; -- 0x09DD
+ when 002526 => D <= "10010001"; -- 0x09DE
+ when 002527 => D <= "11100010"; -- 0x09DF
+ when 002528 => D <= "00110001"; -- 0x09E0
+ when 002529 => D <= "11001011"; -- 0x09E1
+ when 002530 => D <= "00010010"; -- 0x09E2
+ when 002531 => D <= "00010100"; -- 0x09E3
+ when 002532 => D <= "10001100"; -- 0x09E4
+ when 002533 => D <= "11101110"; -- 0x09E5
+ when 002534 => D <= "10111111"; -- 0x09E6
+ when 002535 => D <= "00000000"; -- 0x09E7
+ when 002536 => D <= "11010111"; -- 0x09E8
+ when 002537 => D <= "00100010"; -- 0x09E9
+ when 002538 => D <= "11010001"; -- 0x09EA
+ when 002539 => D <= "10011000"; -- 0x09EB
+ when 002540 => D <= "00110001"; -- 0x09EC
+ when 002541 => D <= "11011000"; -- 0x09ED
+ when 002542 => D <= "00001001"; -- 0x09EE
+ when 002543 => D <= "11101001"; -- 0x09EF
+ when 002544 => D <= "01100000"; -- 0x09F0
+ when 002545 => D <= "11001110"; -- 0x09F1
+ when 002546 => D <= "10010000"; -- 0x09F2
+ when 002547 => D <= "00000001"; -- 0x09F3
+ when 002548 => D <= "00000100"; -- 0x09F4
+ when 002549 => D <= "10000101"; -- 0x09F5
+ when 002550 => D <= "00111111"; -- 0x09F6
+ when 002551 => D <= "11110000"; -- 0x09F7
+ when 002552 => D <= "01010001"; -- 0x09F8
+ when 002553 => D <= "00010011"; -- 0x09F9
+ when 002554 => D <= "10010000"; -- 0x09FA
+ when 002555 => D <= "00000001"; -- 0x09FB
+ when 002556 => D <= "00001010"; -- 0x09FC
+ when 002557 => D <= "00010010"; -- 0x09FD
+ when 002558 => D <= "00010101"; -- 0x09FE
+ when 002559 => D <= "10011011"; -- 0x09FF
+ when 002560 => D <= "10000101"; -- 0x0A00
+ when 002561 => D <= "00111111"; -- 0x0A01
+ when 002562 => D <= "10000010"; -- 0x0A02
+ when 002563 => D <= "00010101"; -- 0x0A03
+ when 002564 => D <= "10000011"; -- 0x0A04
+ when 002565 => D <= "11000011"; -- 0x0A05
+ when 002566 => D <= "11101001"; -- 0x0A06
+ when 002567 => D <= "10010101"; -- 0x0A07
+ when 002568 => D <= "10000010"; -- 0x0A08
+ when 002569 => D <= "11111001"; -- 0x0A09
+ when 002570 => D <= "11101011"; -- 0x0A0A
+ when 002571 => D <= "10010101"; -- 0x0A0B
+ when 002572 => D <= "10000011"; -- 0x0A0C
+ when 002573 => D <= "11111011"; -- 0x0A0D
+ when 002574 => D <= "01001001"; -- 0x0A0E
+ when 002575 => D <= "00100010"; -- 0x0A0F
+ when 002576 => D <= "01110101"; -- 0x0A10
+ when 002577 => D <= "11110000"; -- 0x0A11
+ when 002578 => D <= "00000110"; -- 0x0A12
+ when 002579 => D <= "00010010"; -- 0x0A13
+ when 002580 => D <= "00000101"; -- 0x0A14
+ when 002581 => D <= "10101010"; -- 0x0A15
+ when 002582 => D <= "11101001"; -- 0x0A16
+ when 002583 => D <= "10100100"; -- 0x0A17
+ when 002584 => D <= "00100101"; -- 0x0A18
+ when 002585 => D <= "10000010"; -- 0x0A19
+ when 002586 => D <= "11111001"; -- 0x0A1A
+ when 002587 => D <= "11100101"; -- 0x0A1B
+ when 002588 => D <= "11110000"; -- 0x0A1C
+ when 002589 => D <= "00110101"; -- 0x0A1D
+ when 002590 => D <= "10000011"; -- 0x0A1E
+ when 002591 => D <= "11111011"; -- 0x0A1F
+ when 002592 => D <= "00100010"; -- 0x0A20
+ when 002593 => D <= "00110001"; -- 0x0A21
+ when 002594 => D <= "11101010"; -- 0x0A22
+ when 002595 => D <= "11000000"; -- 0x0A23
+ when 002596 => D <= "00000011"; -- 0x0A24
+ when 002597 => D <= "11000000"; -- 0x0A25
+ when 002598 => D <= "00000001"; -- 0x0A26
+ when 002599 => D <= "01111111"; -- 0x0A27
+ when 002600 => D <= "00101100"; -- 0x0A28
+ when 002601 => D <= "10010001"; -- 0x0A29
+ when 002602 => D <= "11101000"; -- 0x0A2A
+ when 002603 => D <= "11010001"; -- 0x0A2B
+ when 002604 => D <= "10010001"; -- 0x0A2C
+ when 002605 => D <= "11101001"; -- 0x0A2D
+ when 002606 => D <= "10110101"; -- 0x0A2E
+ when 002607 => D <= "00111111"; -- 0x0A2F
+ when 002608 => D <= "00000000"; -- 0x0A30
+ when 002609 => D <= "01010000"; -- 0x0A31
+ when 002610 => D <= "10001101"; -- 0x0A32
+ when 002611 => D <= "00011001"; -- 0x0A33
+ when 002612 => D <= "11010000"; -- 0x0A34
+ when 002613 => D <= "11100000"; -- 0x0A35
+ when 002614 => D <= "00101001"; -- 0x0A36
+ when 002615 => D <= "11111001"; -- 0x0A37
+ when 002616 => D <= "11010000"; -- 0x0A38
+ when 002617 => D <= "00000011"; -- 0x0A39
+ when 002618 => D <= "01010000"; -- 0x0A3A
+ when 002619 => D <= "00000001"; -- 0x0A3B
+ when 002620 => D <= "00001011"; -- 0x0A3C
+ when 002621 => D <= "10000001"; -- 0x0A3D
+ when 002622 => D <= "11100110"; -- 0x0A3E
+ when 002623 => D <= "00110001"; -- 0x0A3F
+ when 002624 => D <= "11001001"; -- 0x0A40
+ when 002625 => D <= "11000000"; -- 0x0A41
+ when 002626 => D <= "00000011"; -- 0x0A42
+ when 002627 => D <= "11000000"; -- 0x0A43
+ when 002628 => D <= "00000001"; -- 0x0A44
+ when 002629 => D <= "11110001"; -- 0x0A45
+ when 002630 => D <= "11010110"; -- 0x0A46
+ when 002631 => D <= "01111111"; -- 0x0A47
+ when 002632 => D <= "10100110"; -- 0x0A48
+ when 002633 => D <= "11110001"; -- 0x0A49
+ when 002634 => D <= "01000100"; -- 0x0A4A
+ when 002635 => D <= "11010001"; -- 0x0A4B
+ when 002636 => D <= "11010000"; -- 0x0A4C
+ when 002637 => D <= "10110100"; -- 0x0A4D
+ when 002638 => D <= "10100111"; -- 0x0A4E
+ when 002639 => D <= "00000110"; -- 0x0A4F
+ when 002640 => D <= "11010001"; -- 0x0A50
+ when 002641 => D <= "11011010"; -- 0x0A51
+ when 002642 => D <= "11110001"; -- 0x0A52
+ when 002643 => D <= "01000110"; -- 0x0A53
+ when 002644 => D <= "10000000"; -- 0x0A54
+ when 002645 => D <= "00000011"; -- 0x0A55
+ when 002646 => D <= "00010010"; -- 0x0A56
+ when 002647 => D <= "00010100"; -- 0x0A57
+ when 002648 => D <= "00101110"; -- 0x0A58
+ when 002649 => D <= "01110100"; -- 0x0A59
+ when 002650 => D <= "11101111"; -- 0x0A5A
+ when 002651 => D <= "01110001"; -- 0x0A5B
+ when 002652 => D <= "10110100"; -- 0x0A5C
+ when 002653 => D <= "01110001"; -- 0x0A5D
+ when 002654 => D <= "11000000"; -- 0x0A5E
+ when 002655 => D <= "01111011"; -- 0x0A5F
+ when 002656 => D <= "00000000"; -- 0x0A60
+ when 002657 => D <= "10101001"; -- 0x0A61
+ when 002658 => D <= "00000000"; -- 0x0A62
+ when 002659 => D <= "11110001"; -- 0x0A63
+ when 002660 => D <= "11010110"; -- 0x0A64
+ when 002661 => D <= "11110001"; -- 0x0A65
+ when 002662 => D <= "11010110"; -- 0x0A66
+ when 002663 => D <= "11010001"; -- 0x0A67
+ when 002664 => D <= "10100101"; -- 0x0A68
+ when 002665 => D <= "10101000"; -- 0x0A69
+ when 002666 => D <= "00000001"; -- 0x0A6A
+ when 002667 => D <= "01110001"; -- 0x0A6B
+ when 002668 => D <= "00111100"; -- 0x0A6C
+ when 002669 => D <= "11010000"; -- 0x0A6D
+ when 002670 => D <= "00001000"; -- 0x0A6E
+ when 002671 => D <= "11010000"; -- 0x0A6F
+ when 002672 => D <= "00001010"; -- 0x0A70
+ when 002673 => D <= "01111100"; -- 0x0A71
+ when 002674 => D <= "00000001"; -- 0x0A72
+ when 002675 => D <= "01110001"; -- 0x0A73
+ when 002676 => D <= "00111100"; -- 0x0A74
+ when 002677 => D <= "11010001"; -- 0x0A75
+ when 002678 => D <= "10111011"; -- 0x0A76
+ when 002679 => D <= "00000001"; -- 0x0A77
+ when 002680 => D <= "00011001"; -- 0x0A78
+ when 002681 => D <= "11110001"; -- 0x0A79
+ when 002682 => D <= "01000110"; -- 0x0A7A
+ when 002683 => D <= "11010001"; -- 0x0A7B
+ when 002684 => D <= "11001001"; -- 0x0A7C
+ when 002685 => D <= "01010000"; -- 0x0A7D
+ when 002686 => D <= "11111010"; -- 0x0A7E
+ when 002687 => D <= "00100010"; -- 0x0A7F
+ when 002688 => D <= "11110001"; -- 0x0A80
+ when 002689 => D <= "00000100"; -- 0x0A81
+ when 002690 => D <= "11110001"; -- 0x0A82
+ when 002691 => D <= "11010100"; -- 0x0A83
+ when 002692 => D <= "11010001"; -- 0x0A84
+ when 002693 => D <= "11001001"; -- 0x0A85
+ when 002694 => D <= "01010000"; -- 0x0A86
+ when 002695 => D <= "11111000"; -- 0x0A87
+ when 002696 => D <= "00100010"; -- 0x0A88
+ when 002697 => D <= "01010001"; -- 0x0A89
+ when 002698 => D <= "11001010"; -- 0x0A8A
+ when 002699 => D <= "11111001"; -- 0x0A8B
+ when 002700 => D <= "11010001"; -- 0x0A8C
+ when 002701 => D <= "11010000"; -- 0x0A8D
+ when 002702 => D <= "10110100"; -- 0x0A8E
+ when 002703 => D <= "10100101"; -- 0x0A8F
+ when 002704 => D <= "00000010"; -- 0x0A90
+ when 002705 => D <= "11010001"; -- 0x0A91
+ when 002706 => D <= "11011010"; -- 0x0A92
+ when 002707 => D <= "10111001"; -- 0x0A93
+ when 002708 => D <= "00000000"; -- 0x0A94
+ when 002709 => D <= "00001011"; -- 0x0A95
+ when 002710 => D <= "01111111"; -- 0x0A96
+ when 002711 => D <= "10101000"; -- 0x0A97
+ when 002712 => D <= "11010001"; -- 0x0A98
+ when 002713 => D <= "11110001"; -- 0x0A99
+ when 002714 => D <= "01100000"; -- 0x0A9A
+ when 002715 => D <= "11101100"; -- 0x0A9B
+ when 002716 => D <= "11010001"; -- 0x0A9C
+ when 002717 => D <= "11011010"; -- 0x0A9D
+ when 002718 => D <= "10110100"; -- 0x0A9E
+ when 002719 => D <= "10101000"; -- 0x0A9F
+ when 002720 => D <= "11110101"; -- 0x0AA0
+ when 002721 => D <= "11110001"; -- 0x0AA1
+ when 002722 => D <= "00111000"; -- 0x0AA2
+ when 002723 => D <= "01010000"; -- 0x0AA3
+ when 002724 => D <= "01010110"; -- 0x0AA4
+ when 002725 => D <= "00000001"; -- 0x0AA5
+ when 002726 => D <= "11111011"; -- 0x0AA6
+ when 002727 => D <= "11100000"; -- 0x0AA7
+ when 002728 => D <= "00010100"; -- 0x0AA8
+ when 002729 => D <= "00100000"; -- 0x0AA9
+ when 002730 => D <= "11100111"; -- 0x0AAA
+ when 002731 => D <= "00101110"; -- 0x0AAB
+ when 002732 => D <= "00100010"; -- 0x0AAC
+ when 002733 => D <= "01010001"; -- 0x0AAD
+ when 002734 => D <= "11110101"; -- 0x0AAE
+ when 002735 => D <= "11010001"; -- 0x0AAF
+ when 002736 => D <= "10111011"; -- 0x0AB0
+ when 002737 => D <= "00010000"; -- 0x0AB1
+ when 002738 => D <= "00100101"; -- 0x0AB2
+ when 002739 => D <= "00001000"; -- 0x0AB3
+ when 002740 => D <= "00110000"; -- 0x0AB4
+ when 002741 => D <= "00010101"; -- 0x0AB5
+ when 002742 => D <= "00000011"; -- 0x0AB6
+ when 002743 => D <= "00010010"; -- 0x0AB7
+ when 002744 => D <= "00000110"; -- 0x0AB8
+ when 002745 => D <= "01011100"; -- 0x0AB9
+ when 002746 => D <= "00000001"; -- 0x0ABA
+ when 002747 => D <= "00010111"; -- 0x0ABB
+ when 002748 => D <= "00010000"; -- 0x0ABC
+ when 002749 => D <= "00010100"; -- 0x0ABD
+ when 002750 => D <= "00000101"; -- 0x0ABE
+ when 002751 => D <= "01010011"; -- 0x0ABF
+ when 002752 => D <= "00100010"; -- 0x0AC0
+ when 002753 => D <= "10111101"; -- 0x0AC1
+ when 002754 => D <= "00000001"; -- 0x0AC2
+ when 002755 => D <= "00011001"; -- 0x0AC3
+ when 002756 => D <= "10100010"; -- 0x0AC4
+ when 002757 => D <= "00101011"; -- 0x0AC5
+ when 002758 => D <= "10010010"; -- 0x0AC6
+ when 002759 => D <= "00010001"; -- 0x0AC7
+ when 002760 => D <= "00000001"; -- 0x0AC8
+ when 002761 => D <= "00011001"; -- 0x0AC9
+ when 002762 => D <= "11110001"; -- 0x0ACA
+ when 002763 => D <= "01000110"; -- 0x0ACB
+ when 002764 => D <= "00010010"; -- 0x0ACC
+ when 002765 => D <= "00010010"; -- 0x0ACD
+ when 002766 => D <= "00111010"; -- 0x0ACE
+ when 002767 => D <= "01100000"; -- 0x0ACF
+ when 002768 => D <= "00000010"; -- 0x0AD0
+ when 002769 => D <= "01110100"; -- 0x0AD1
+ when 002770 => D <= "11111111"; -- 0x0AD2
+ when 002771 => D <= "00100010"; -- 0x0AD3
+ when 002772 => D <= "11010001"; -- 0x0AD4
+ when 002773 => D <= "10011110"; -- 0x0AD5
+ when 002774 => D <= "11100000"; -- 0x0AD6
+ when 002775 => D <= "11111111"; -- 0x0AD7
+ when 002776 => D <= "11011111"; -- 0x0AD8
+ when 002777 => D <= "00000101"; -- 0x0AD9
+ when 002778 => D <= "10010000"; -- 0x0ADA
+ when 002779 => D <= "00011111"; -- 0x0ADB
+ when 002780 => D <= "10110101"; -- 0x0ADC
+ when 002781 => D <= "10000001"; -- 0x0ADD
+ when 002782 => D <= "00010001"; -- 0x0ADE
+ when 002783 => D <= "00100000"; -- 0x0ADF
+ when 002784 => D <= "11100111"; -- 0x0AE0
+ when 002785 => D <= "11111000"; -- 0x0AE1
+ when 002786 => D <= "10100011"; -- 0x0AE2
+ when 002787 => D <= "11100000"; -- 0x0AE3
+ when 002788 => D <= "10110101"; -- 0x0AE4
+ when 002789 => D <= "00000010"; -- 0x0AE5
+ when 002790 => D <= "00001000"; -- 0x0AE6
+ when 002791 => D <= "10100011"; -- 0x0AE7
+ when 002792 => D <= "00011111"; -- 0x0AE8
+ when 002793 => D <= "11100000"; -- 0x0AE9
+ when 002794 => D <= "10110101"; -- 0x0AEA
+ when 002795 => D <= "00000000"; -- 0x0AEB
+ when 002796 => D <= "00000010"; -- 0x0AEC
+ when 002797 => D <= "10100011"; -- 0x0AED
+ when 002798 => D <= "00100010"; -- 0x0AEE
+ when 002799 => D <= "11101111"; -- 0x0AEF
+ when 002800 => D <= "00010010"; -- 0x0AF0
+ when 002801 => D <= "00000101"; -- 0x0AF1
+ when 002802 => D <= "11011000"; -- 0x0AF2
+ when 002803 => D <= "10000000"; -- 0x0AF3
+ when 002804 => D <= "11100001"; -- 0x0AF4
+ when 002805 => D <= "11110001"; -- 0x0AF5
+ when 002806 => D <= "00110011"; -- 0x0AF6
+ when 002807 => D <= "01010001"; -- 0x0AF7
+ when 002808 => D <= "11010100"; -- 0x0AF8
+ when 002809 => D <= "11100001"; -- 0x0AF9
+ when 002810 => D <= "00011010"; -- 0x0AFA
+ when 002811 => D <= "01010001"; -- 0x0AFB
+ when 002812 => D <= "11010100"; -- 0x0AFC
+ when 002813 => D <= "01000001"; -- 0x0AFD
+ when 002814 => D <= "10101111"; -- 0x0AFE
+ when 002815 => D <= "01010001"; -- 0x0AFF
+ when 002816 => D <= "11001010"; -- 0x0B00
+ when 002817 => D <= "11110100"; -- 0x0B01
+ when 002818 => D <= "10000000"; -- 0x0B02
+ when 002819 => D <= "00000010"; -- 0x0B03
+ when 002820 => D <= "01010001"; -- 0x0B04
+ when 002821 => D <= "11001010"; -- 0x0B05
+ when 002822 => D <= "01111100"; -- 0x0B06
+ when 002823 => D <= "00000011"; -- 0x0B07
+ when 002824 => D <= "11111101"; -- 0x0B08
+ when 002825 => D <= "10000000"; -- 0x0B09
+ when 002826 => D <= "00001100"; -- 0x0B0A
+ when 002827 => D <= "11110001"; -- 0x0B0B
+ when 002828 => D <= "00110011"; -- 0x0B0C
+ when 002829 => D <= "10001000"; -- 0x0B0D
+ when 002830 => D <= "00010101"; -- 0x0B0E
+ when 002831 => D <= "00000001"; -- 0x0B0F
+ when 002832 => D <= "01011011"; -- 0x0B10
+ when 002833 => D <= "11010010"; -- 0x0B11
+ when 002834 => D <= "00100101"; -- 0x0B12
+ when 002835 => D <= "01111100"; -- 0x0B13
+ when 002836 => D <= "00000010"; -- 0x0B14
+ when 002837 => D <= "01111101"; -- 0x0B15
+ when 002838 => D <= "01010101"; -- 0x0B16
+ when 002839 => D <= "01110001"; -- 0x0B17
+ when 002840 => D <= "01001110"; -- 0x0B18
+ when 002841 => D <= "11100010"; -- 0x0B19
+ when 002842 => D <= "11110101"; -- 0x0B1A
+ when 002843 => D <= "10000011"; -- 0x0B1B
+ when 002844 => D <= "00001000"; -- 0x0B1C
+ when 002845 => D <= "11100010"; -- 0x0B1D
+ when 002846 => D <= "11110101"; -- 0x0B1E
+ when 002847 => D <= "10000010"; -- 0x0B1F
+ when 002848 => D <= "00001000"; -- 0x0B20
+ when 002849 => D <= "11100000"; -- 0x0B21
+ when 002850 => D <= "10110100"; -- 0x0B22
+ when 002851 => D <= "00000001"; -- 0x0B23
+ when 002852 => D <= "00000010"; -- 0x0B24
+ when 002853 => D <= "00000001"; -- 0x0B25
+ when 002854 => D <= "01011011"; -- 0x0B26
+ when 002855 => D <= "11101101"; -- 0x0B27
+ when 002856 => D <= "01100000"; -- 0x0B28
+ when 002857 => D <= "10000101"; -- 0x0B29
+ when 002858 => D <= "10001000"; -- 0x0B2A
+ when 002859 => D <= "00010001"; -- 0x0B2B
+ when 002860 => D <= "11110100"; -- 0x0B2C
+ when 002861 => D <= "01110000"; -- 0x0B2D
+ when 002862 => D <= "10000000"; -- 0x0B2E
+ when 002863 => D <= "00100010"; -- 0x0B2F
+ when 002864 => D <= "01010001"; -- 0x0B30
+ when 002865 => D <= "11110101"; -- 0x0B31
+ when 002866 => D <= "01111100"; -- 0x0B32
+ when 002867 => D <= "00000010"; -- 0x0B33
+ when 002868 => D <= "01110001"; -- 0x0B34
+ when 002869 => D <= "00111000"; -- 0x0B35
+ when 002870 => D <= "01000001"; -- 0x0B36
+ when 002871 => D <= "01110101"; -- 0x0B37
+ when 002872 => D <= "01110100"; -- 0x0B38
+ when 002873 => D <= "11111101"; -- 0x0B39
+ when 002874 => D <= "01110001"; -- 0x0B3A
+ when 002875 => D <= "10110100"; -- 0x0B3B
+ when 002876 => D <= "01110101"; -- 0x0B3C
+ when 002877 => D <= "10100000"; -- 0x0B3D
+ when 002878 => D <= "00000000"; -- 0x0B3E
+ when 002879 => D <= "11100101"; -- 0x0B3F
+ when 002880 => D <= "00001000"; -- 0x0B40
+ when 002881 => D <= "11110010"; -- 0x0B41
+ when 002882 => D <= "00011000"; -- 0x0B42
+ when 002883 => D <= "11100101"; -- 0x0B43
+ when 002884 => D <= "00001010"; -- 0x0B44
+ when 002885 => D <= "11110010"; -- 0x0B45
+ when 002886 => D <= "00011000"; -- 0x0B46
+ when 002887 => D <= "11101100"; -- 0x0B47
+ when 002888 => D <= "11110010"; -- 0x0B48
+ when 002889 => D <= "00100010"; -- 0x0B49
+ when 002890 => D <= "01110100"; -- 0x0B4A
+ when 002891 => D <= "00000011"; -- 0x0B4B
+ when 002892 => D <= "01110001"; -- 0x0B4C
+ when 002893 => D <= "10110100"; -- 0x0B4D
+ when 002894 => D <= "10101000"; -- 0x0B4E
+ when 002895 => D <= "00010001"; -- 0x0B4F
+ when 002896 => D <= "01110101"; -- 0x0B50
+ when 002897 => D <= "10100000"; -- 0x0B51
+ when 002898 => D <= "00000000"; -- 0x0B52
+ when 002899 => D <= "11100010"; -- 0x0B53
+ when 002900 => D <= "10110101"; -- 0x0B54
+ when 002901 => D <= "00000100"; -- 0x0B55
+ when 002902 => D <= "00000010"; -- 0x0B56
+ when 002903 => D <= "00001000"; -- 0x0B57
+ when 002904 => D <= "00100010"; -- 0x0B58
+ when 002905 => D <= "01100000"; -- 0x0B59
+ when 002906 => D <= "01101001"; -- 0x0B5A
+ when 002907 => D <= "10110100"; -- 0x0B5B
+ when 002908 => D <= "00000001"; -- 0x0B5C
+ when 002909 => D <= "11101100"; -- 0x0B5D
+ when 002910 => D <= "01110001"; -- 0x0B5E
+ when 002911 => D <= "10110010"; -- 0x0B5F
+ when 002912 => D <= "10000000"; -- 0x0B60
+ when 002913 => D <= "11101100"; -- 0x0B61
+ when 002914 => D <= "01111100"; -- 0x0B62
+ when 002915 => D <= "00000001"; -- 0x0B63
+ when 002916 => D <= "01110001"; -- 0x0B64
+ when 002917 => D <= "01001110"; -- 0x0B65
+ when 002918 => D <= "10001000"; -- 0x0B66
+ when 002919 => D <= "00001111"; -- 0x0B67
+ when 002920 => D <= "01111001"; -- 0x0B68
+ when 002921 => D <= "00001011"; -- 0x0B69
+ when 002922 => D <= "11100010"; -- 0x0B6A
+ when 002923 => D <= "11110111"; -- 0x0B6B
+ when 002924 => D <= "00001001"; -- 0x0B6C
+ when 002925 => D <= "00001000"; -- 0x0B6D
+ when 002926 => D <= "10111001"; -- 0x0B6E
+ when 002927 => D <= "00001111"; -- 0x0B6F
+ when 002928 => D <= "11111001"; -- 0x0B70
+ when 002929 => D <= "10110001"; -- 0x0B71
+ when 002930 => D <= "01101000"; -- 0x0B72
+ when 002931 => D <= "01010000"; -- 0x0B73
+ when 002932 => D <= "00000100"; -- 0x0B74
+ when 002933 => D <= "10101010"; -- 0x0B75
+ when 002934 => D <= "00001011"; -- 0x0B76
+ when 002935 => D <= "10101000"; -- 0x0B77
+ when 002936 => D <= "00001100"; -- 0x0B78
+ when 002937 => D <= "11101010"; -- 0x0B79
+ when 002938 => D <= "10110101"; -- 0x0B7A
+ when 002939 => D <= "00001011"; -- 0x0B7B
+ when 002940 => D <= "01000111"; -- 0x0B7C
+ when 002941 => D <= "11101000"; -- 0x0B7D
+ when 002942 => D <= "10110101"; -- 0x0B7E
+ when 002943 => D <= "00001100"; -- 0x0B7F
+ when 002944 => D <= "01000011"; -- 0x0B80
+ when 002945 => D <= "11110001"; -- 0x0B81
+ when 002946 => D <= "11100000"; -- 0x0B82
+ when 002947 => D <= "01110100"; -- 0x0B83
+ when 002948 => D <= "00001110"; -- 0x0B84
+ when 002949 => D <= "00100101"; -- 0x0B85
+ when 002950 => D <= "00001111"; -- 0x0B86
+ when 002951 => D <= "11111000"; -- 0x0B87
+ when 002952 => D <= "01111010"; -- 0x0B88
+ when 002953 => D <= "00000000"; -- 0x0B89
+ when 002954 => D <= "10001010"; -- 0x0B8A
+ when 002955 => D <= "10100000"; -- 0x0B8B
+ when 002956 => D <= "11100010"; -- 0x0B8C
+ when 002957 => D <= "00001000"; -- 0x0B8D
+ when 002958 => D <= "11000000"; -- 0x0B8E
+ when 002959 => D <= "11100000"; -- 0x0B8F
+ when 002960 => D <= "11110001"; -- 0x0B90
+ when 002961 => D <= "11100000"; -- 0x0B91
+ when 002962 => D <= "11000000"; -- 0x0B92
+ when 002963 => D <= "00000000"; -- 0x0B93
+ when 002964 => D <= "00010010"; -- 0x0B94
+ when 002965 => D <= "00010111"; -- 0x0B95
+ when 002966 => D <= "00111000"; -- 0x0B96
+ when 002967 => D <= "00010010"; -- 0x0B97
+ when 002968 => D <= "00010100"; -- 0x0B98
+ when 002969 => D <= "00010111"; -- 0x0B99
+ when 002970 => D <= "10101011"; -- 0x0B9A
+ when 002971 => D <= "00001011"; -- 0x0B9B
+ when 002972 => D <= "10101001"; -- 0x0B9C
+ when 002973 => D <= "00001100"; -- 0x0B9D
+ when 002974 => D <= "11110001"; -- 0x0B9E
+ when 002975 => D <= "11010110"; -- 0x0B9F
+ when 002976 => D <= "01111010"; -- 0x0BA0
+ when 002977 => D <= "00000000"; -- 0x0BA1
+ when 002978 => D <= "11010000"; -- 0x0BA2
+ when 002979 => D <= "00000000"; -- 0x0BA3
+ when 002980 => D <= "11110001"; -- 0x0BA4
+ when 002981 => D <= "11100000"; -- 0x0BA5
+ when 002982 => D <= "00010010"; -- 0x0BA6
+ when 002983 => D <= "00011001"; -- 0x0BA7
+ when 002984 => D <= "10010111"; -- 0x0BA8
+ when 002985 => D <= "11010000"; -- 0x0BA9
+ when 002986 => D <= "11100000"; -- 0x0BAA
+ when 002987 => D <= "01100000"; -- 0x0BAB
+ when 002988 => D <= "00000001"; -- 0x0BAC
+ when 002989 => D <= "10110011"; -- 0x0BAD
+ when 002990 => D <= "01110010"; -- 0x0BAE
+ when 002991 => D <= "11010101"; -- 0x0BAF
+ when 002992 => D <= "01000000"; -- 0x0BB0
+ when 002993 => D <= "00010111"; -- 0x0BB1
+ when 002994 => D <= "01110100"; -- 0x0BB2
+ when 002995 => D <= "00010001"; -- 0x0BB3
+ when 002996 => D <= "00100101"; -- 0x0BB4
+ when 002997 => D <= "00010001"; -- 0x0BB5
+ when 002998 => D <= "10110100"; -- 0x0BB6
+ when 002999 => D <= "01100001"; -- 0x0BB7
+ when 003000 => D <= "00000000"; -- 0x0BB8
+ when 003001 => D <= "01000000"; -- 0x0BB9
+ when 003002 => D <= "00001001"; -- 0x0BBA
+ when 003003 => D <= "11000101"; -- 0x0BBB
+ when 003004 => D <= "00010001"; -- 0x0BBC
+ when 003005 => D <= "00010100"; -- 0x0BBD
+ when 003006 => D <= "11111000"; -- 0x0BBE
+ when 003007 => D <= "00100010"; -- 0x0BBF
+ when 003008 => D <= "11110001"; -- 0x0BC0
+ when 003009 => D <= "00011010"; -- 0x0BC1
+ when 003010 => D <= "01010000"; -- 0x0BC2
+ when 003011 => D <= "11111011"; -- 0x0BC3
+ when 003012 => D <= "10010000"; -- 0x0BC4
+ when 003013 => D <= "00000011"; -- 0x0BC5
+ when 003014 => D <= "01111111"; -- 0x0BC6
+ when 003015 => D <= "10000001"; -- 0x0BC7
+ when 003016 => D <= "00010001"; -- 0x0BC8
+ when 003017 => D <= "10000101"; -- 0x0BC9
+ when 003018 => D <= "00001101"; -- 0x0BCA
+ when 003019 => D <= "00001010"; -- 0x0BCB
+ when 003020 => D <= "10000101"; -- 0x0BCC
+ when 003021 => D <= "00001110"; -- 0x0BCD
+ when 003022 => D <= "00001000"; -- 0x0BCE
+ when 003023 => D <= "00000001"; -- 0x0BCF
+ when 003024 => D <= "00011001"; -- 0x0BD0
+ when 003025 => D <= "01110001"; -- 0x0BD1
+ when 003026 => D <= "11011001"; -- 0x0BD2
+ when 003027 => D <= "11010001"; -- 0x0BD3
+ when 003028 => D <= "10011110"; -- 0x0BD4
+ when 003029 => D <= "11010001"; -- 0x0BD5
+ when 003030 => D <= "10111011"; -- 0x0BD6
+ when 003031 => D <= "11110001"; -- 0x0BD7
+ when 003032 => D <= "00100110"; -- 0x0BD8
+ when 003033 => D <= "11000101"; -- 0x0BD9
+ when 003034 => D <= "00001010"; -- 0x0BDA
+ when 003035 => D <= "11000101"; -- 0x0BDB
+ when 003036 => D <= "00010010"; -- 0x0BDC
+ when 003037 => D <= "11000101"; -- 0x0BDD
+ when 003038 => D <= "00001010"; -- 0x0BDE
+ when 003039 => D <= "11000101"; -- 0x0BDF
+ when 003040 => D <= "00001000"; -- 0x0BE0
+ when 003041 => D <= "11000101"; -- 0x0BE1
+ when 003042 => D <= "00010000"; -- 0x0BE2
+ when 003043 => D <= "11000101"; -- 0x0BE3
+ when 003044 => D <= "00001000"; -- 0x0BE4
+ when 003045 => D <= "00100010"; -- 0x0BE5
+ when 003046 => D <= "01110001"; -- 0x0BE6
+ when 003047 => D <= "11011001"; -- 0x0BE7
+ when 003048 => D <= "11010001"; -- 0x0BE8
+ when 003049 => D <= "11001001"; -- 0x0BE9
+ when 003050 => D <= "01000000"; -- 0x0BEA
+ when 003051 => D <= "00010110"; -- 0x0BEB
+ when 003052 => D <= "11110001"; -- 0x0BEC
+ when 003053 => D <= "01000110"; -- 0x0BED
+ when 003054 => D <= "11010001"; -- 0x0BEE
+ when 003055 => D <= "11010000"; -- 0x0BEF
+ when 003056 => D <= "10110100"; -- 0x0BF0
+ when 003057 => D <= "00101100"; -- 0x0BF1
+ when 003058 => D <= "00000010"; -- 0x0BF2
+ when 003059 => D <= "10000000"; -- 0x0BF3
+ when 003060 => D <= "00000010"; -- 0x0BF4
+ when 003061 => D <= "11110001"; -- 0x0BF5
+ when 003062 => D <= "00011010"; -- 0x0BF6
+ when 003063 => D <= "01110001"; -- 0x0BF7
+ when 003064 => D <= "11011001"; -- 0x0BF8
+ when 003065 => D <= "11110001"; -- 0x0BF9
+ when 003066 => D <= "00000100"; -- 0x0BFA
+ when 003067 => D <= "11110001"; -- 0x0BFB
+ when 003068 => D <= "11010100"; -- 0x0BFC
+ when 003069 => D <= "11010001"; -- 0x0BFD
+ when 003070 => D <= "11001001"; -- 0x0BFE
+ when 003071 => D <= "01010000"; -- 0x0BFF
+ when 003072 => D <= "11100101"; -- 0x0C00
+ when 003073 => D <= "00100010"; -- 0x0C01
+ when 003074 => D <= "10110100"; -- 0x0C02
+ when 003075 => D <= "10011100"; -- 0x0C03
+ when 003076 => D <= "00000100"; -- 0x0C04
+ when 003077 => D <= "11010001"; -- 0x0C05
+ when 003078 => D <= "11011010"; -- 0x0C06
+ when 003079 => D <= "10000000"; -- 0x0C07
+ when 003080 => D <= "11100011"; -- 0x0C08
+ when 003081 => D <= "10110100"; -- 0x0C09
+ when 003082 => D <= "00000001"; -- 0x0C0A
+ when 003083 => D <= "00001000"; -- 0x0C0B
+ when 003084 => D <= "01110001"; -- 0x0C0C
+ when 003085 => D <= "11011001"; -- 0x0C0D
+ when 003086 => D <= "10010000"; -- 0x0C0E
+ when 003087 => D <= "00011111"; -- 0x0C0F
+ when 003088 => D <= "10000001"; -- 0x0C10
+ when 003089 => D <= "00000010"; -- 0x0C11
+ when 003090 => D <= "00011000"; -- 0x0C12
+ when 003091 => D <= "10001001"; -- 0x0C13
+ when 003092 => D <= "11010001"; -- 0x0C14
+ when 003093 => D <= "11101111"; -- 0x0C15
+ when 003094 => D <= "11110001"; -- 0x0C16
+ when 003095 => D <= "00011010"; -- 0x0C17
+ when 003096 => D <= "01000000"; -- 0x0C18
+ when 003097 => D <= "11110010"; -- 0x0C19
+ when 003098 => D <= "10000000"; -- 0x0C1A
+ when 003099 => D <= "11001100"; -- 0x0C1B
+ when 003100 => D <= "11010001"; -- 0x0C1C
+ when 003101 => D <= "11010000"; -- 0x0C1D
+ when 003102 => D <= "10110100"; -- 0x0C1E
+ when 003103 => D <= "00100011"; -- 0x0C1F
+ when 003104 => D <= "00000100"; -- 0x0C20
+ when 003105 => D <= "11010010"; -- 0x0C21
+ when 003106 => D <= "00011011"; -- 0x0C22
+ when 003107 => D <= "11000001"; -- 0x0C23
+ when 003108 => D <= "11001110"; -- 0x0C24
+ when 003109 => D <= "10110100"; -- 0x0C25
+ when 003110 => D <= "01000000"; -- 0x0C26
+ when 003111 => D <= "11011001"; -- 0x0C27
+ when 003112 => D <= "11010010"; -- 0x0C28
+ when 003113 => D <= "00011001"; -- 0x0C29
+ when 003114 => D <= "11000001"; -- 0x0C2A
+ when 003115 => D <= "11001110"; -- 0x0C2B
+ when 003116 => D <= "11010010"; -- 0x0C2C
+ when 003117 => D <= "00110110"; -- 0x0C2D
+ when 003118 => D <= "11010010"; -- 0x0C2E
+ when 003119 => D <= "00110111"; -- 0x0C2F
+ when 003120 => D <= "10010001"; -- 0x0C30
+ when 003121 => D <= "00011100"; -- 0x0C31
+ when 003122 => D <= "10010001"; -- 0x0C32
+ when 003123 => D <= "00111011"; -- 0x0C33
+ when 003124 => D <= "01010011"; -- 0x0C34
+ when 003125 => D <= "00100011"; -- 0x0C35
+ when 003126 => D <= "11110101"; -- 0x0C36
+ when 003127 => D <= "01010011"; -- 0x0C37
+ when 003128 => D <= "00100110"; -- 0x0C38
+ when 003129 => D <= "00111111"; -- 0x0C39
+ when 003130 => D <= "00100010"; -- 0x0C3A
+ when 003131 => D <= "11010001"; -- 0x0C3B
+ when 003132 => D <= "11100100"; -- 0x0C3C
+ when 003133 => D <= "01000000"; -- 0x0C3D
+ when 003134 => D <= "00000111"; -- 0x0C3E
+ when 003135 => D <= "00000010"; -- 0x0C3F
+ when 003136 => D <= "00000110"; -- 0x0C40
+ when 003137 => D <= "10011111"; -- 0x0C41
+ when 003138 => D <= "11010001"; -- 0x0C42
+ when 003139 => D <= "11001001"; -- 0x0C43
+ when 003140 => D <= "01000000"; -- 0x0C44
+ when 003141 => D <= "11111001"; -- 0x0C45
+ when 003142 => D <= "11010001"; -- 0x0C46
+ when 003143 => D <= "10101100"; -- 0x0C47
+ when 003144 => D <= "01010000"; -- 0x0C48
+ when 003145 => D <= "11111000"; -- 0x0C49
+ when 003146 => D <= "10110100"; -- 0x0C4A
+ when 003147 => D <= "10100100"; -- 0x0C4B
+ when 003148 => D <= "00001000"; -- 0x0C4C
+ when 003149 => D <= "11010001"; -- 0x0C4D
+ when 003150 => D <= "10011000"; -- 0x0C4E
+ when 003151 => D <= "10010101"; -- 0x0C4F
+ when 003152 => D <= "00010110"; -- 0x0C50
+ when 003153 => D <= "01000000"; -- 0x0C51
+ when 003154 => D <= "11101111"; -- 0x0C52
+ when 003155 => D <= "10000000"; -- 0x0C53
+ when 003156 => D <= "00000101"; -- 0x0C54
+ when 003157 => D <= "10110100"; -- 0x0C55
+ when 003158 => D <= "10101001"; -- 0x0C56
+ when 003159 => D <= "00001010"; -- 0x0C57
+ when 003160 => D <= "11010001"; -- 0x0C58
+ when 003161 => D <= "10011000"; -- 0x0C59
+ when 003162 => D <= "01100000"; -- 0x0C5A
+ when 003163 => D <= "11100110"; -- 0x0C5B
+ when 003164 => D <= "00010010"; -- 0x0C5C
+ when 003165 => D <= "00000111"; -- 0x0C5D
+ when 003166 => D <= "00001001"; -- 0x0C5E
+ when 003167 => D <= "00010100"; -- 0x0C5F
+ when 003168 => D <= "10000000"; -- 0x0C60
+ when 003169 => D <= "11111000"; -- 0x0C61
+ when 003170 => D <= "10110100"; -- 0x0C62
+ when 003171 => D <= "11010011"; -- 0x0C63
+ when 003172 => D <= "00010011"; -- 0x0C64
+ when 003173 => D <= "11010001"; -- 0x0C65
+ when 003174 => D <= "11001110"; -- 0x0C66
+ when 003175 => D <= "10110100"; -- 0x0C67
+ when 003176 => D <= "00100100"; -- 0x0C68
+ when 003177 => D <= "00000110"; -- 0x0C69
+ when 003178 => D <= "11110001"; -- 0x0C6A
+ when 003179 => D <= "11111100"; -- 0x0C6B
+ when 003180 => D <= "11010001"; -- 0x0C6C
+ when 003181 => D <= "10010011"; -- 0x0C6D
+ when 003182 => D <= "10000000"; -- 0x0C6E
+ when 003183 => D <= "00000100"; -- 0x0C6F
+ when 003184 => D <= "11010001"; -- 0x0C70
+ when 003185 => D <= "10010001"; -- 0x0C71
+ when 003186 => D <= "10010001"; -- 0x0C72
+ when 003187 => D <= "11100110"; -- 0x0C73
+ when 003188 => D <= "10101101"; -- 0x0C74
+ when 003189 => D <= "00000001"; -- 0x0C75
+ when 003190 => D <= "10000000"; -- 0x0C76
+ when 003191 => D <= "00000111"; -- 0x0C77
+ when 003192 => D <= "10110100"; -- 0x0C78
+ when 003193 => D <= "10101010"; -- 0x0C79
+ when 003194 => D <= "00001001"; -- 0x0C7A
+ when 003195 => D <= "11010001"; -- 0x0C7B
+ when 003196 => D <= "11011010"; -- 0x0C7C
+ when 003197 => D <= "01111101"; -- 0x0C7D
+ when 003198 => D <= "00001101"; -- 0x0C7E
+ when 003199 => D <= "00010010"; -- 0x0C7F
+ when 003200 => D <= "00000111"; -- 0x0C80
+ when 003201 => D <= "00001011"; -- 0x0C81
+ when 003202 => D <= "10000000"; -- 0x0C82
+ when 003203 => D <= "10111110"; -- 0x0C83
+ when 003204 => D <= "10110100"; -- 0x0C84
+ when 003205 => D <= "11010010"; -- 0x0C85
+ when 003206 => D <= "01010011"; -- 0x0C86
+ when 003207 => D <= "11010001"; -- 0x0C87
+ when 003208 => D <= "11001110"; -- 0x0C88
+ when 003209 => D <= "10110100"; -- 0x0C89
+ when 003210 => D <= "01000110"; -- 0x0C8A
+ when 003211 => D <= "00010110"; -- 0x0C8B
+ when 003212 => D <= "01110101"; -- 0x0C8C
+ when 003213 => D <= "00010111"; -- 0x0C8D
+ when 003214 => D <= "11110000"; -- 0x0C8E
+ when 003215 => D <= "11010001"; -- 0x0C8F
+ when 003216 => D <= "11001110"; -- 0x0C90
+ when 003217 => D <= "11010001"; -- 0x0C91
+ when 003218 => D <= "11011010"; -- 0x0C92
+ when 003219 => D <= "01010100"; -- 0x0C93
+ when 003220 => D <= "00001111"; -- 0x0C94
+ when 003221 => D <= "01100000"; -- 0x0C95
+ when 003222 => D <= "00000111"; -- 0x0C96
+ when 003223 => D <= "10110100"; -- 0x0C97
+ when 003224 => D <= "00000011"; -- 0x0C98
+ when 003225 => D <= "00000000"; -- 0x0C99
+ when 003226 => D <= "01010000"; -- 0x0C9A
+ when 003227 => D <= "00000010"; -- 0x0C9B
+ when 003228 => D <= "01110100"; -- 0x0C9C
+ when 003229 => D <= "00000011"; -- 0x0C9D
+ when 003230 => D <= "01000010"; -- 0x0C9E
+ when 003231 => D <= "00010111"; -- 0x0C9F
+ when 003232 => D <= "10000000"; -- 0x0CA0
+ when 003233 => D <= "00101010"; -- 0x0CA1
+ when 003234 => D <= "10110100"; -- 0x0CA2
+ when 003235 => D <= "00110000"; -- 0x0CA3
+ when 003236 => D <= "00000111"; -- 0x0CA4
+ when 003237 => D <= "01110101"; -- 0x0CA5
+ when 003238 => D <= "00010111"; -- 0x0CA6
+ when 003239 => D <= "00000000"; -- 0x0CA7
+ when 003240 => D <= "11010001"; -- 0x0CA8
+ when 003241 => D <= "11011010"; -- 0x0CA9
+ when 003242 => D <= "10000000"; -- 0x0CAA
+ when 003243 => D <= "00100000"; -- 0x0CAB
+ when 003244 => D <= "10110100"; -- 0x0CAC
+ when 003245 => D <= "00100011"; -- 0x0CAD
+ when 003246 => D <= "00011101"; -- 0x0CAE
+ when 003247 => D <= "10010001"; -- 0x0CAF
+ when 003248 => D <= "11010000"; -- 0x0CB0
+ when 003249 => D <= "10001111"; -- 0x0CB1
+ when 003250 => D <= "00010111"; -- 0x0CB2
+ when 003251 => D <= "10110100"; -- 0x0CB3
+ when 003252 => D <= "00101110"; -- 0x0CB4
+ when 003253 => D <= "00010001"; -- 0x0CB5
+ when 003254 => D <= "11010001"; -- 0x0CB6
+ when 003255 => D <= "11001110"; -- 0x0CB7
+ when 003256 => D <= "10010001"; -- 0x0CB8
+ when 003257 => D <= "11010000"; -- 0x0CB9
+ when 003258 => D <= "11101111"; -- 0x0CBA
+ when 003259 => D <= "00100101"; -- 0x0CBB
+ when 003260 => D <= "00010111"; -- 0x0CBC
+ when 003261 => D <= "00100100"; -- 0x0CBD
+ when 003262 => D <= "11110111"; -- 0x0CBE
+ when 003263 => D <= "01010000"; -- 0x0CBF
+ when 003264 => D <= "00000010"; -- 0x0CC0
+ when 003265 => D <= "00100001"; -- 0x0CC1
+ when 003266 => D <= "00111011"; -- 0x0CC2
+ when 003267 => D <= "11101111"; -- 0x0CC3
+ when 003268 => D <= "11000100"; -- 0x0CC4
+ when 003269 => D <= "01000010"; -- 0x0CC5
+ when 003270 => D <= "00010111"; -- 0x0CC6
+ when 003271 => D <= "11100101"; -- 0x0CC7
+ when 003272 => D <= "00010111"; -- 0x0CC8
+ when 003273 => D <= "11000100"; -- 0x0CC9
+ when 003274 => D <= "11110101"; -- 0x0CCA
+ when 003275 => D <= "00010111"; -- 0x0CCB
+ when 003276 => D <= "10010001"; -- 0x0CCC
+ when 003277 => D <= "11100110"; -- 0x0CCD
+ when 003278 => D <= "10000001"; -- 0x0CCE
+ when 003279 => D <= "01000010"; -- 0x0CCF
+ when 003280 => D <= "01111111"; -- 0x0CD0
+ when 003281 => D <= "00000000"; -- 0x0CD1
+ when 003282 => D <= "10110100"; -- 0x0CD2
+ when 003283 => D <= "00100011"; -- 0x0CD3
+ when 003284 => D <= "00001100"; -- 0x0CD4
+ when 003285 => D <= "00001111"; -- 0x0CD5
+ when 003286 => D <= "11010001"; -- 0x0CD6
+ when 003287 => D <= "11001110"; -- 0x0CD7
+ when 003288 => D <= "10000000"; -- 0x0CD8
+ when 003289 => D <= "11111000"; -- 0x0CD9
+ when 003290 => D <= "11010001"; -- 0x0CDA
+ when 003291 => D <= "11100110"; -- 0x0CDB
+ when 003292 => D <= "01010000"; -- 0x0CDC
+ when 003293 => D <= "00000011"; -- 0x0CDD
+ when 003294 => D <= "10110100"; -- 0x0CDE
+ when 003295 => D <= "10101000"; -- 0x0CDF
+ when 003296 => D <= "00110100"; -- 0x0CE0
+ when 003297 => D <= "00100010"; -- 0x0CE1
+ when 003298 => D <= "01111111"; -- 0x0CE2
+ when 003299 => D <= "11100000"; -- 0x0CE3
+ when 003300 => D <= "11110001"; -- 0x0CE4
+ when 003301 => D <= "01000100"; -- 0x0CE5
+ when 003302 => D <= "01111111"; -- 0x0CE6
+ when 003303 => D <= "00101001"; -- 0x0CE7
+ when 003304 => D <= "11010001"; -- 0x0CE8
+ when 003305 => D <= "11011000"; -- 0x0CE9
+ when 003306 => D <= "10110101"; -- 0x0CEA
+ when 003307 => D <= "00000111"; -- 0x0CEB
+ when 003308 => D <= "11010100"; -- 0x0CEC
+ when 003309 => D <= "00100010"; -- 0x0CED
+ when 003310 => D <= "11010001"; -- 0x0CEE
+ when 003311 => D <= "10010001"; -- 0x0CEF
+ when 003312 => D <= "11010001"; -- 0x0CF0
+ when 003313 => D <= "11011000"; -- 0x0CF1
+ when 003314 => D <= "10110100"; -- 0x0CF2
+ when 003315 => D <= "10000011"; -- 0x0CF3
+ when 003316 => D <= "00000100"; -- 0x0CF4
+ when 003317 => D <= "10110001"; -- 0x0CF5
+ when 003318 => D <= "00000000"; -- 0x0CF6
+ when 003319 => D <= "01000001"; -- 0x0CF7
+ when 003320 => D <= "01110101"; -- 0x0CF8
+ when 003321 => D <= "10110100"; -- 0x0CF9
+ when 003322 => D <= "10011111"; -- 0x0CFA
+ when 003323 => D <= "11000101"; -- 0x0CFB
+ when 003324 => D <= "10110001"; -- 0x0CFC
+ when 003325 => D <= "00000000"; -- 0x0CFD
+ when 003326 => D <= "01100001"; -- 0x0CFE
+ when 003327 => D <= "00110010"; -- 0x0CFF
+ when 003328 => D <= "10111001"; -- 0x0D00
+ when 003329 => D <= "00000000"; -- 0x0D01
+ when 003330 => D <= "00000110"; -- 0x0D02
+ when 003331 => D <= "11110001"; -- 0x0D03
+ when 003332 => D <= "00110011"; -- 0x0D04
+ when 003333 => D <= "11010001"; -- 0x0D05
+ when 003334 => D <= "11101111"; -- 0x0D06
+ when 003335 => D <= "01000001"; -- 0x0D07
+ when 003336 => D <= "11110111"; -- 0x0D08
+ when 003337 => D <= "01111111"; -- 0x0D09
+ when 003338 => D <= "00101100"; -- 0x0D0A
+ when 003339 => D <= "11010001"; -- 0x0D0B
+ when 003340 => D <= "11110001"; -- 0x0D0C
+ when 003341 => D <= "10110100"; -- 0x0D0D
+ when 003342 => D <= "00101100"; -- 0x0D0E
+ when 003343 => D <= "10110001"; -- 0x0D0F
+ when 003344 => D <= "00011001"; -- 0x0D10
+ when 003345 => D <= "11010001"; -- 0x0D11
+ when 003346 => D <= "11011010"; -- 0x0D12
+ when 003347 => D <= "10000000"; -- 0x0D13
+ when 003348 => D <= "11101011"; -- 0x0D14
+ when 003349 => D <= "11010001"; -- 0x0D15
+ when 003350 => D <= "11000010"; -- 0x0D16
+ when 003351 => D <= "01000000"; -- 0x0D17
+ when 003352 => D <= "00000101"; -- 0x0D18
+ when 003353 => D <= "00010010"; -- 0x0D19
+ when 003354 => D <= "00000110"; -- 0x0D1A
+ when 003355 => D <= "10111001"; -- 0x0D1B
+ when 003356 => D <= "10000001"; -- 0x0D1C
+ when 003357 => D <= "01000010"; -- 0x0D1D
+ when 003358 => D <= "11110001"; -- 0x0D1E
+ when 003359 => D <= "01000110"; -- 0x0D1F
+ when 003360 => D <= "01110100"; -- 0x0D20
+ when 003361 => D <= "01001000"; -- 0x0D21
+ when 003362 => D <= "10110101"; -- 0x0D22
+ when 003363 => D <= "00010110"; -- 0x0D23
+ when 003364 => D <= "00000000"; -- 0x0D24
+ when 003365 => D <= "01010000"; -- 0x0D25
+ when 003366 => D <= "00000010"; -- 0x0D26
+ when 003367 => D <= "10010001"; -- 0x0D27
+ when 003368 => D <= "00111111"; -- 0x0D28
+ when 003369 => D <= "00110000"; -- 0x0D29
+ when 003370 => D <= "00110111"; -- 0x0D2A
+ when 003371 => D <= "00010100"; -- 0x0D2B
+ when 003372 => D <= "00010010"; -- 0x0D2C
+ when 003373 => D <= "00010001"; -- 0x0D2D
+ when 003374 => D <= "11101101"; -- 0x0D2E
+ when 003375 => D <= "01000000"; -- 0x0D2F
+ when 003376 => D <= "00001111"; -- 0x0D30
+ when 003377 => D <= "00010010"; -- 0x0D31
+ when 003378 => D <= "00010011"; -- 0x0D32
+ when 003379 => D <= "01111010"; -- 0x0D33
+ when 003380 => D <= "01110000"; -- 0x0D34
+ when 003381 => D <= "00000111"; -- 0x0D35
+ when 003382 => D <= "11010001"; -- 0x0D36
+ when 003383 => D <= "10010011"; -- 0x0D37
+ when 003384 => D <= "00010010"; -- 0x0D38
+ when 003385 => D <= "00011001"; -- 0x0D39
+ when 003386 => D <= "10101001"; -- 0x0D3A
+ when 003387 => D <= "10000001"; -- 0x0D3B
+ when 003388 => D <= "01000010"; -- 0x0D3C
+ when 003389 => D <= "00010010"; -- 0x0D3D
+ when 003390 => D <= "00010011"; -- 0x0D3E
+ when 003391 => D <= "10001100"; -- 0x0D3F
+ when 003392 => D <= "00010010"; -- 0x0D40
+ when 003393 => D <= "00011001"; -- 0x0D41
+ when 003394 => D <= "10100001"; -- 0x0D42
+ when 003395 => D <= "01110100"; -- 0x0D43
+ when 003396 => D <= "00000001"; -- 0x0D44
+ when 003397 => D <= "10000001"; -- 0x0D45
+ when 003398 => D <= "01011010"; -- 0x0D46
+ when 003399 => D <= "11010001"; -- 0x0D47
+ when 003400 => D <= "11001110"; -- 0x0D48
+ when 003401 => D <= "00010010"; -- 0x0D49
+ when 003402 => D <= "00011111"; -- 0x0D4A
+ when 003403 => D <= "11101101"; -- 0x0D4B
+ when 003404 => D <= "01000000"; -- 0x0D4C
+ when 003405 => D <= "00001100"; -- 0x0D4D
+ when 003406 => D <= "10110100"; -- 0x0D4E
+ when 003407 => D <= "01011111"; -- 0x0D4F
+ when 003408 => D <= "00000001"; -- 0x0D50
+ when 003409 => D <= "00100010"; -- 0x0D51
+ when 003410 => D <= "10110100"; -- 0x0D52
+ when 003411 => D <= "01000001"; -- 0x0D53
+ when 003412 => D <= "00000000"; -- 0x0D54
+ when 003413 => D <= "01000000"; -- 0x0D55
+ when 003414 => D <= "00000100"; -- 0x0D56
+ when 003415 => D <= "10110100"; -- 0x0D57
+ when 003416 => D <= "01011011"; -- 0x0D58
+ when 003417 => D <= "00000000"; -- 0x0D59
+ when 003418 => D <= "10110011"; -- 0x0D5A
+ when 003419 => D <= "00100010"; -- 0x0D5B
+ when 003420 => D <= "00110000"; -- 0x0D5C
+ when 003421 => D <= "11010101"; -- 0x0D5D
+ when 003422 => D <= "00111110"; -- 0x0D5E
+ when 003423 => D <= "10010000"; -- 0x0D5F
+ when 003424 => D <= "00010111"; -- 0x0D60
+ when 003425 => D <= "01011000"; -- 0x0D61
+ when 003426 => D <= "10000001"; -- 0x0D62
+ when 003427 => D <= "00010001"; -- 0x0D63
+ when 003428 => D <= "11010010"; -- 0x0D64
+ when 003429 => D <= "11010101"; -- 0x0D65
+ when 003430 => D <= "10000000"; -- 0x0D66
+ when 003431 => D <= "00000010"; -- 0x0D67
+ when 003432 => D <= "11000010"; -- 0x0D68
+ when 003433 => D <= "11010101"; -- 0x0D69
+ when 003434 => D <= "11010001"; -- 0x0D6A
+ when 003435 => D <= "11010000"; -- 0x0D6B
+ when 003436 => D <= "10110001"; -- 0x0D6C
+ when 003437 => D <= "01010010"; -- 0x0D6D
+ when 003438 => D <= "01010000"; -- 0x0D6E
+ when 003439 => D <= "00000100"; -- 0x0D6F
+ when 003440 => D <= "00100000"; -- 0x0D70
+ when 003441 => D <= "11010101"; -- 0x0D71
+ when 003442 => D <= "11101100"; -- 0x0D72
+ when 003443 => D <= "00100010"; -- 0x0D73
+ when 003444 => D <= "11111111"; -- 0x0D74
+ when 003445 => D <= "11100100"; -- 0x0D75
+ when 003446 => D <= "11111101"; -- 0x0D76
+ when 003447 => D <= "11111110"; -- 0x0D77
+ when 003448 => D <= "10110001"; -- 0x0D78
+ when 003449 => D <= "01000111"; -- 0x0D79
+ when 003450 => D <= "01000000"; -- 0x0D7A
+ when 003451 => D <= "00000111"; -- 0x0D7B
+ when 003452 => D <= "11001111"; -- 0x0D7C
+ when 003453 => D <= "00101101"; -- 0x0D7D
+ when 003454 => D <= "11001111"; -- 0x0D7E
+ when 003455 => D <= "01111101"; -- 0x0D7F
+ when 003456 => D <= "00011010"; -- 0x0D80
+ when 003457 => D <= "10000000"; -- 0x0D81
+ when 003458 => D <= "11110100"; -- 0x0D82
+ when 003459 => D <= "11000010"; -- 0x0D83
+ when 003460 => D <= "00010101"; -- 0x0D84
+ when 003461 => D <= "10110100"; -- 0x0D85
+ when 003462 => D <= "11100000"; -- 0x0D86
+ when 003463 => D <= "00101111"; -- 0x0D87
+ when 003464 => D <= "01000011"; -- 0x0D88
+ when 003465 => D <= "00000110"; -- 0x0D89
+ when 003466 => D <= "10000000"; -- 0x0D8A
+ when 003467 => D <= "00010010"; -- 0x0D8B
+ when 003468 => D <= "00000110"; -- 0x0D8C
+ when 003469 => D <= "00010011"; -- 0x0D8D
+ when 003470 => D <= "11000000"; -- 0x0D8E
+ when 003471 => D <= "00000010"; -- 0x0D8F
+ when 003472 => D <= "11000000"; -- 0x0D90
+ when 003473 => D <= "00000000"; -- 0x0D91
+ when 003474 => D <= "01010000"; -- 0x0D92
+ when 003475 => D <= "11001000"; -- 0x0D93
+ when 003476 => D <= "00100000"; -- 0x0D94
+ when 003477 => D <= "11010101"; -- 0x0D95
+ when 003478 => D <= "00101000"; -- 0x0D96
+ when 003479 => D <= "01111001"; -- 0x0D97
+ when 003480 => D <= "00001010"; -- 0x0D98
+ when 003481 => D <= "01111011"; -- 0x0D99
+ when 003482 => D <= "00000000"; -- 0x0D9A
+ when 003483 => D <= "10110001"; -- 0x0D9B
+ when 003484 => D <= "11001111"; -- 0x0D9C
+ when 003485 => D <= "11010001"; -- 0x0D9D
+ when 003486 => D <= "10011010"; -- 0x0D9E
+ when 003487 => D <= "10111011"; -- 0x0D9F
+ when 003488 => D <= "00000000"; -- 0x0DA0
+ when 003489 => D <= "10111101"; -- 0x0DA1
+ when 003490 => D <= "11010000"; -- 0x0DA2
+ when 003491 => D <= "10000010"; -- 0x0DA3
+ when 003492 => D <= "11010000"; -- 0x0DA4
+ when 003493 => D <= "10000011"; -- 0x0DA5
+ when 003494 => D <= "11100000"; -- 0x0DA6
+ when 003495 => D <= "00010100"; -- 0x0DA7
+ when 003496 => D <= "10011001"; -- 0x0DA8
+ when 003497 => D <= "01000000"; -- 0x0DA9
+ when 003498 => D <= "10110100"; -- 0x0DAA
+ when 003499 => D <= "00010010"; -- 0x0DAB
+ when 003500 => D <= "00000101"; -- 0x0DAC
+ when 003501 => D <= "10111010"; -- 0x0DAD
+ when 003502 => D <= "01010001"; -- 0x0DAE
+ when 003503 => D <= "00010000"; -- 0x0DAF
+ when 003504 => D <= "11001001"; -- 0x0DB0
+ when 003505 => D <= "11001000"; -- 0x0DB1
+ when 003506 => D <= "11001001"; -- 0x0DB2
+ when 003507 => D <= "11001011"; -- 0x0DB3
+ when 003508 => D <= "11001010"; -- 0x0DB4
+ when 003509 => D <= "11001011"; -- 0x0DB5
+ when 003510 => D <= "00100010"; -- 0x0DB6
+ when 003511 => D <= "00100000"; -- 0x0DB7
+ when 003512 => D <= "11010101"; -- 0x0DB8
+ when 003513 => D <= "10100101"; -- 0x0DB9
+ when 003514 => D <= "00010010"; -- 0x0DBA
+ when 003515 => D <= "00000110"; -- 0x0DBB
+ when 003516 => D <= "00010011"; -- 0x0DBC
+ when 003517 => D <= "11000011"; -- 0x0DBD
+ when 003518 => D <= "00100010"; -- 0x0DBE
+ when 003519 => D <= "11010001"; -- 0x0DBF
+ when 003520 => D <= "10011010"; -- 0x0DC0
+ when 003521 => D <= "10111011"; -- 0x0DC1
+ when 003522 => D <= "00000000"; -- 0x0DC2
+ when 003523 => D <= "10011011"; -- 0x0DC3
+ when 003524 => D <= "11010000"; -- 0x0DC4
+ when 003525 => D <= "00000000"; -- 0x0DC5
+ when 003526 => D <= "11010000"; -- 0x0DC6
+ when 003527 => D <= "00000010"; -- 0x0DC7
+ when 003528 => D <= "10110001"; -- 0x0DC8
+ when 003529 => D <= "11001111"; -- 0x0DC9
+ when 003530 => D <= "11010001"; -- 0x0DCA
+ when 003531 => D <= "11001001"; -- 0x0DCB
+ when 003532 => D <= "01010000"; -- 0x0DCC
+ when 003533 => D <= "10010110"; -- 0x0DCD
+ when 003534 => D <= "00100010"; -- 0x0DCE
+ when 003535 => D <= "00001001"; -- 0x0DCF
+ when 003536 => D <= "11101001"; -- 0x0DD0
+ when 003537 => D <= "01100000"; -- 0x0DD1
+ when 003538 => D <= "10001100"; -- 0x0DD2
+ when 003539 => D <= "11111100"; -- 0x0DD3
+ when 003540 => D <= "10010000"; -- 0x0DD4
+ when 003541 => D <= "00000001"; -- 0x0DD5
+ when 003542 => D <= "00001000"; -- 0x0DD6
+ when 003543 => D <= "01010001"; -- 0x0DD7
+ when 003544 => D <= "00010000"; -- 0x0DD8
+ when 003545 => D <= "10101111"; -- 0x0DD9
+ when 003546 => D <= "10000011"; -- 0x0DDA
+ when 003547 => D <= "10101110"; -- 0x0DDB
+ when 003548 => D <= "10000010"; -- 0x0DDC
+ when 003549 => D <= "10010000"; -- 0x0DDD
+ when 003550 => D <= "00000001"; -- 0x0DDE
+ when 003551 => D <= "00000110"; -- 0x0DDF
+ when 003552 => D <= "00010010"; -- 0x0DE0
+ when 003553 => D <= "00010101"; -- 0x0DE1
+ when 003554 => D <= "10011011"; -- 0x0DE2
+ when 003555 => D <= "10010000"; -- 0x0DE3
+ when 003556 => D <= "00000001"; -- 0x0DE4
+ when 003557 => D <= "00001000"; -- 0x0DE5
+ when 003558 => D <= "00010010"; -- 0x0DE6
+ when 003559 => D <= "00000101"; -- 0x0DE7
+ when 003560 => D <= "11111111"; -- 0x0DE8
+ when 003561 => D <= "10001000"; -- 0x0DE9
+ when 003562 => D <= "10000010"; -- 0x0DEA
+ when 003563 => D <= "10001010"; -- 0x0DEB
+ when 003564 => D <= "10000011"; -- 0x0DEC
+ when 003565 => D <= "11101100"; -- 0x0DED
+ when 003566 => D <= "11110000"; -- 0x0DEE
+ when 003567 => D <= "00010010"; -- 0x0DEF
+ when 003568 => D <= "00000101"; -- 0x0DF0
+ when 003569 => D <= "10111010"; -- 0x0DF1
+ when 003570 => D <= "11101111"; -- 0x0DF2
+ when 003571 => D <= "11110000"; -- 0x0DF3
+ when 003572 => D <= "10100011"; -- 0x0DF4
+ when 003573 => D <= "11101110"; -- 0x0DF5
+ when 003574 => D <= "11110000"; -- 0x0DF6
+ when 003575 => D <= "00100010"; -- 0x0DF7
+ when 003576 => D <= "11010001"; -- 0x0DF8
+ when 003577 => D <= "10101100"; -- 0x0DF9
+ when 003578 => D <= "11010001"; -- 0x0DFA
+ when 003579 => D <= "11001001"; -- 0x0DFB
+ when 003580 => D <= "01010000"; -- 0x0DFC
+ when 003581 => D <= "00000111"; -- 0x0DFD
+ when 003582 => D <= "10010001"; -- 0x0DFE
+ when 003583 => D <= "00111111"; -- 0x0DFF
+ when 003584 => D <= "01111101"; -- 0x0E00
+ when 003585 => D <= "00111111"; -- 0x0E01
+ when 003586 => D <= "00010010"; -- 0x0E02
+ when 003587 => D <= "00000111"; -- 0x0E03
+ when 003588 => D <= "00001011"; -- 0x0E04
+ when 003589 => D <= "11010010"; -- 0x0E05
+ when 003590 => D <= "00100010"; -- 0x0E06
+ when 003591 => D <= "00010010"; -- 0x0E07
+ when 003592 => D <= "00000110"; -- 0x0E08
+ when 003593 => D <= "11010010"; -- 0x0E09
+ when 003594 => D <= "11000010"; -- 0x0E0A
+ when 003595 => D <= "00100010"; -- 0x0E0B
+ when 003596 => D <= "01110101"; -- 0x0E0C
+ when 003597 => D <= "00001111"; -- 0x0E0D
+ when 003598 => D <= "00000000"; -- 0x0E0E
+ when 003599 => D <= "01110101"; -- 0x0E0F
+ when 003600 => D <= "00001110"; -- 0x0E10
+ when 003601 => D <= "00000111"; -- 0x0E11
+ when 003602 => D <= "11010001"; -- 0x0E12
+ when 003603 => D <= "11000010"; -- 0x0E13
+ when 003604 => D <= "01000000"; -- 0x0E14
+ when 003605 => D <= "00001101"; -- 0x0E15
+ when 003606 => D <= "10110001"; -- 0x0E16
+ when 003607 => D <= "10110000"; -- 0x0E17
+ when 003608 => D <= "10101011"; -- 0x0E18
+ when 003609 => D <= "00001111"; -- 0x0E19
+ when 003610 => D <= "10101001"; -- 0x0E1A
+ when 003611 => D <= "00001110"; -- 0x0E1B
+ when 003612 => D <= "00110001"; -- 0x0E1C
+ when 003613 => D <= "10100000"; -- 0x0E1D
+ when 003614 => D <= "11010001"; -- 0x0E1E
+ when 003615 => D <= "11001001"; -- 0x0E1F
+ when 003616 => D <= "01010000"; -- 0x0E20
+ when 003617 => D <= "11011110"; -- 0x0E21
+ when 003618 => D <= "00100010"; -- 0x0E22
+ when 003619 => D <= "00010010"; -- 0x0E23
+ when 003620 => D <= "00011000"; -- 0x0E24
+ when 003621 => D <= "01000111"; -- 0x0E25
+ when 003622 => D <= "00010010"; -- 0x0E26
+ when 003623 => D <= "00011001"; -- 0x0E27
+ when 003624 => D <= "01001110"; -- 0x0E28
+ when 003625 => D <= "01110000"; -- 0x0E29
+ when 003626 => D <= "00011000"; -- 0x0E2A
+ when 003627 => D <= "00010010"; -- 0x0E2B
+ when 003628 => D <= "00011000"; -- 0x0E2C
+ when 003629 => D <= "01001110"; -- 0x0E2D
+ when 003630 => D <= "11110001"; -- 0x0E2E
+ when 003631 => D <= "00000100"; -- 0x0E2F
+ when 003632 => D <= "11110001"; -- 0x0E30
+ when 003633 => D <= "11010100"; -- 0x0E31
+ when 003634 => D <= "00010010"; -- 0x0E32
+ when 003635 => D <= "00011000"; -- 0x0E33
+ when 003636 => D <= "01000111"; -- 0x0E34
+ when 003637 => D <= "11010001"; -- 0x0E35
+ when 003638 => D <= "11001001"; -- 0x0E36
+ when 003639 => D <= "01000000"; -- 0x0E37
+ when 003640 => D <= "00010011"; -- 0x0E38
+ when 003641 => D <= "11100000"; -- 0x0E39
+ when 003642 => D <= "10110100"; -- 0x0E3A
+ when 003643 => D <= "00101100"; -- 0x0E3B
+ when 003644 => D <= "00000110"; -- 0x0E3C
+ when 003645 => D <= "10100011"; -- 0x0E3D
+ when 003646 => D <= "00010010"; -- 0x0E3E
+ when 003647 => D <= "00011000"; -- 0x0E3F
+ when 003648 => D <= "01001110"; -- 0x0E40
+ when 003649 => D <= "10000000"; -- 0x0E41
+ when 003650 => D <= "11001111"; -- 0x0E42
+ when 003651 => D <= "10010000"; -- 0x0E43
+ when 003652 => D <= "00000000"; -- 0x0E44
+ when 003653 => D <= "11110001"; -- 0x0E45
+ when 003654 => D <= "00010010"; -- 0x0E46
+ when 003655 => D <= "00000110"; -- 0x0E47
+ when 003656 => D <= "10100111"; -- 0x0E48
+ when 003657 => D <= "00000010"; -- 0x0E49
+ when 003658 => D <= "00011000"; -- 0x0E4A
+ when 003659 => D <= "00111110"; -- 0x0E4B
+ when 003660 => D <= "11100000"; -- 0x0E4C
+ when 003661 => D <= "10110100"; -- 0x0E4D
+ when 003662 => D <= "00001101"; -- 0x0E4E
+ when 003663 => D <= "00000001"; -- 0x0E4F
+ when 003664 => D <= "00100010"; -- 0x0E50
+ when 003665 => D <= "10010000"; -- 0x0E51
+ when 003666 => D <= "00000011"; -- 0x0E52
+ when 003667 => D <= "01101001"; -- 0x0E53
+ when 003668 => D <= "00010010"; -- 0x0E54
+ when 003669 => D <= "00000110"; -- 0x0E55
+ when 003670 => D <= "10100111"; -- 0x0E56
+ when 003671 => D <= "10000001"; -- 0x0E57
+ when 003672 => D <= "00111111"; -- 0x0E58
+ when 003673 => D <= "11010001"; -- 0x0E59
+ when 003674 => D <= "10001000"; -- 0x0E5A
+ when 003675 => D <= "10001011"; -- 0x0E5B
+ when 003676 => D <= "01001011"; -- 0x0E5C
+ when 003677 => D <= "10001001"; -- 0x0E5D
+ when 003678 => D <= "01001100"; -- 0x0E5E
+ when 003679 => D <= "10010000"; -- 0x0E5F
+ when 003680 => D <= "00000001"; -- 0x0E60
+ when 003681 => D <= "00100110"; -- 0x0E61
+ when 003682 => D <= "11010010"; -- 0x0E62
+ when 003683 => D <= "00010000"; -- 0x0E63
+ when 003684 => D <= "10100001"; -- 0x0E64
+ when 003685 => D <= "11110010"; -- 0x0E65
+ when 003686 => D <= "11110001"; -- 0x0E66
+ when 003687 => D <= "00110011"; -- 0x0E67
+ when 003688 => D <= "10111010"; -- 0x0E68
+ when 003689 => D <= "00000000"; -- 0x0E69
+ when 003690 => D <= "00001010"; -- 0x0E6A
+ when 003691 => D <= "11101000"; -- 0x0E6B
+ when 003692 => D <= "00100000"; -- 0x0E6C
+ when 003693 => D <= "11100111"; -- 0x0E6D
+ when 003694 => D <= "00000110"; -- 0x0E6E
+ when 003695 => D <= "00101000"; -- 0x0E6F
+ when 003696 => D <= "10010000"; -- 0x0E70
+ when 003697 => D <= "01000001"; -- 0x0E71
+ when 003698 => D <= "00000000"; -- 0x0E72
+ when 003699 => D <= "11110101"; -- 0x0E73
+ when 003700 => D <= "10000010"; -- 0x0E74
+ when 003701 => D <= "00110001"; -- 0x0E75
+ when 003702 => D <= "01101111"; -- 0x0E76
+ when 003703 => D <= "01010011"; -- 0x0E77
+ when 003704 => D <= "11010000"; -- 0x0E78
+ when 003705 => D <= "11100111"; -- 0x0E79
+ when 003706 => D <= "00100010"; -- 0x0E7A
+ when 003707 => D <= "11010001"; -- 0x0E7B
+ when 003708 => D <= "10010001"; -- 0x0E7C
+ when 003709 => D <= "00010010"; -- 0x0E7D
+ when 003710 => D <= "00010110"; -- 0x0E7E
+ when 003711 => D <= "01110010"; -- 0x0E7F
+ when 003712 => D <= "10001011"; -- 0x0E80
+ when 003713 => D <= "01000000"; -- 0x0E81
+ when 003714 => D <= "10001001"; -- 0x0E82
+ when 003715 => D <= "01000001"; -- 0x0E83
+ when 003716 => D <= "01111111"; -- 0x0E84
+ when 003717 => D <= "00101100"; -- 0x0E85
+ when 003718 => D <= "10010001"; -- 0x0E86
+ when 003719 => D <= "11101000"; -- 0x0E87
+ when 003720 => D <= "11110001"; -- 0x0E88
+ when 003721 => D <= "01000110"; -- 0x0E89
+ when 003722 => D <= "01111111"; -- 0x0E8A
+ when 003723 => D <= "00101100"; -- 0x0E8B
+ when 003724 => D <= "11110001"; -- 0x0E8C
+ when 003725 => D <= "01000100"; -- 0x0E8D
+ when 003726 => D <= "00000010"; -- 0x0E8E
+ when 003727 => D <= "00010100"; -- 0x0E8F
+ when 003728 => D <= "10001100"; -- 0x0E90
+ when 003729 => D <= "11110001"; -- 0x0E91
+ when 003730 => D <= "01000110"; -- 0x0E92
+ when 003731 => D <= "00010010"; -- 0x0E93
+ when 003732 => D <= "00010010"; -- 0x0E94
+ when 003733 => D <= "00001110"; -- 0x0E95
+ when 003734 => D <= "11101001"; -- 0x0E96
+ when 003735 => D <= "00100010"; -- 0x0E97
+ when 003736 => D <= "11010001"; -- 0x0E98
+ when 003737 => D <= "11011010"; -- 0x0E99
+ when 003738 => D <= "10010001"; -- 0x0E9A
+ when 003739 => D <= "11100010"; -- 0x0E9B
+ when 003740 => D <= "10000000"; -- 0x0E9C
+ when 003741 => D <= "11110101"; -- 0x0E9D
+ when 003742 => D <= "10000101"; -- 0x0E9E
+ when 003743 => D <= "00010011"; -- 0x0E9F
+ when 003744 => D <= "10000011"; -- 0x0EA0
+ when 003745 => D <= "10000101"; -- 0x0EA1
+ when 003746 => D <= "00010100"; -- 0x0EA2
+ when 003747 => D <= "10000010"; -- 0x0EA3
+ when 003748 => D <= "00100010"; -- 0x0EA4
+ when 003749 => D <= "10000101"; -- 0x0EA5
+ when 003750 => D <= "00001010"; -- 0x0EA6
+ when 003751 => D <= "10000011"; -- 0x0EA7
+ when 003752 => D <= "10000101"; -- 0x0EA8
+ when 003753 => D <= "00001000"; -- 0x0EA9
+ when 003754 => D <= "10000010"; -- 0x0EAA
+ when 003755 => D <= "00100010"; -- 0x0EAB
+ when 003756 => D <= "11010001"; -- 0x0EAC
+ when 003757 => D <= "11010000"; -- 0x0EAD
+ when 003758 => D <= "10110100"; -- 0x0EAE
+ when 003759 => D <= "00100010"; -- 0x0EAF
+ when 003760 => D <= "01110011"; -- 0x0EB0
+ when 003761 => D <= "11010001"; -- 0x0EB1
+ when 003762 => D <= "10100101"; -- 0x0EB2
+ when 003763 => D <= "10100011"; -- 0x0EB3
+ when 003764 => D <= "01111100"; -- 0x0EB4
+ when 003765 => D <= "00100010"; -- 0x0EB5
+ when 003766 => D <= "00010010"; -- 0x0EB6
+ when 003767 => D <= "00000110"; -- 0x0EB7
+ when 003768 => D <= "10111101"; -- 0x0EB8
+ when 003769 => D <= "10100011"; -- 0x0EB9
+ when 003770 => D <= "11000011"; -- 0x0EBA
+ when 003771 => D <= "10000101"; -- 0x0EBB
+ when 003772 => D <= "10000011"; -- 0x0EBC
+ when 003773 => D <= "00001010"; -- 0x0EBD
+ when 003774 => D <= "10000101"; -- 0x0EBE
+ when 003775 => D <= "10000010"; -- 0x0EBF
+ when 003776 => D <= "00001000"; -- 0x0EC0
+ when 003777 => D <= "00100010"; -- 0x0EC1
+ when 003778 => D <= "11010001"; -- 0x0EC2
+ when 003779 => D <= "11010000"; -- 0x0EC3
+ when 003780 => D <= "10110100"; -- 0x0EC4
+ when 003781 => D <= "00100100"; -- 0x0EC5
+ when 003782 => D <= "01011101"; -- 0x0EC6
+ when 003783 => D <= "00100001"; -- 0x0EC7
+ when 003784 => D <= "11101010"; -- 0x0EC8
+ when 003785 => D <= "11010001"; -- 0x0EC9
+ when 003786 => D <= "11010000"; -- 0x0ECA
+ when 003787 => D <= "10110100"; -- 0x0ECB
+ when 003788 => D <= "00101100"; -- 0x0ECC
+ when 003789 => D <= "01010110"; -- 0x0ECD
+ when 003790 => D <= "11010001"; -- 0x0ECE
+ when 003791 => D <= "11011010"; -- 0x0ECF
+ when 003792 => D <= "11010010"; -- 0x0ED0
+ when 003793 => D <= "11010011"; -- 0x0ED1
+ when 003794 => D <= "10001010"; -- 0x0ED2
+ when 003795 => D <= "10100000"; -- 0x0ED3
+ when 003796 => D <= "11100010"; -- 0x0ED4
+ when 003797 => D <= "11000010"; -- 0x0ED5
+ when 003798 => D <= "11010011"; -- 0x0ED6
+ when 003799 => D <= "00100010"; -- 0x0ED7
+ when 003800 => D <= "11010001"; -- 0x0ED8
+ when 003801 => D <= "11010000"; -- 0x0ED9
+ when 003802 => D <= "11010010"; -- 0x0EDA
+ when 003803 => D <= "11010011"; -- 0x0EDB
+ when 003804 => D <= "00001000"; -- 0x0EDC
+ when 003805 => D <= "10111000"; -- 0x0EDD
+ when 003806 => D <= "00000000"; -- 0x0EDE
+ when 003807 => D <= "00000001"; -- 0x0EDF
+ when 003808 => D <= "00001010"; -- 0x0EE0
+ when 003809 => D <= "11000010"; -- 0x0EE1
+ when 003810 => D <= "11010011"; -- 0x0EE2
+ when 003811 => D <= "00100010"; -- 0x0EE3
+ when 003812 => D <= "11010001"; -- 0x0EE4
+ when 003813 => D <= "11010000"; -- 0x0EE5
+ when 003814 => D <= "10110100"; -- 0x0EE6
+ when 003815 => D <= "00001101"; -- 0x0EE7
+ when 003816 => D <= "00000010"; -- 0x0EE8
+ when 003817 => D <= "11100100"; -- 0x0EE9
+ when 003818 => D <= "00100010"; -- 0x0EEA
+ when 003819 => D <= "10110100"; -- 0x0EEB
+ when 003820 => D <= "00111010"; -- 0x0EEC
+ when 003821 => D <= "00110110"; -- 0x0EED
+ when 003822 => D <= "00100010"; -- 0x0EEE
+ when 003823 => D <= "01111111"; -- 0x0EEF
+ when 003824 => D <= "00001101"; -- 0x0EF0
+ when 003825 => D <= "11010001"; -- 0x0EF1
+ when 003826 => D <= "11100100"; -- 0x0EF2
+ when 003827 => D <= "01010000"; -- 0x0EF3
+ when 003828 => D <= "11111001"; -- 0x0EF4
+ when 003829 => D <= "10110101"; -- 0x0EF5
+ when 003830 => D <= "00000111"; -- 0x0EF6
+ when 003831 => D <= "00000001"; -- 0x0EF7
+ when 003832 => D <= "00100010"; -- 0x0EF8
+ when 003833 => D <= "11010001"; -- 0x0EF9
+ when 003834 => D <= "11011010"; -- 0x0EFA
+ when 003835 => D <= "10000000"; -- 0x0EFB
+ when 003836 => D <= "11110100"; -- 0x0EFC
+ when 003837 => D <= "11010001"; -- 0x0EFD
+ when 003838 => D <= "11011010"; -- 0x0EFE
+ when 003839 => D <= "11010001"; -- 0x0EFF
+ when 003840 => D <= "11100100"; -- 0x0F00
+ when 003841 => D <= "01110000"; -- 0x0F01
+ when 003842 => D <= "11111010"; -- 0x0F02
+ when 003843 => D <= "00100010"; -- 0x0F03
+ when 003844 => D <= "10110001"; -- 0x0F04
+ when 003845 => D <= "01101000"; -- 0x0F05
+ when 003846 => D <= "10000000"; -- 0x0F06
+ when 003847 => D <= "00101101"; -- 0x0F07
+ when 003848 => D <= "01110001"; -- 0x0F08
+ when 003849 => D <= "11000000"; -- 0x0F09
+ when 003850 => D <= "01111100"; -- 0x0F0A
+ when 003851 => D <= "00000011"; -- 0x0F0B
+ when 003852 => D <= "01110001"; -- 0x0F0C
+ when 003853 => D <= "00111000"; -- 0x0F0D
+ when 003854 => D <= "00000001"; -- 0x0F0E
+ when 003855 => D <= "00011001"; -- 0x0F0F
+ when 003856 => D <= "10110100"; -- 0x0F10
+ when 003857 => D <= "00111010"; -- 0x0F11
+ when 003858 => D <= "00000010"; -- 0x0F12
+ when 003859 => D <= "11000001"; -- 0x0F13
+ when 003860 => D <= "11011010"; -- 0x0F14
+ when 003861 => D <= "10110100"; -- 0x0F15
+ when 003862 => D <= "10101000"; -- 0x0F16
+ when 003863 => D <= "01101101"; -- 0x0F17
+ when 003864 => D <= "11010001"; -- 0x0F18
+ when 003865 => D <= "11111111"; -- 0x0F19
+ when 003866 => D <= "11010001"; -- 0x0F1A
+ when 003867 => D <= "11010000"; -- 0x0F1B
+ when 003868 => D <= "10110100"; -- 0x0F1C
+ when 003869 => D <= "00001101"; -- 0x0F1D
+ when 003870 => D <= "11110001"; -- 0x0F1E
+ when 003871 => D <= "11010001"; -- 0x0F1F
+ when 003872 => D <= "11001110"; -- 0x0F20
+ when 003873 => D <= "10110100"; -- 0x0F21
+ when 003874 => D <= "00000001"; -- 0x0F22
+ when 003875 => D <= "00000010"; -- 0x0F23
+ when 003876 => D <= "11010011"; -- 0x0F24
+ when 003877 => D <= "00100010"; -- 0x0F25
+ when 003878 => D <= "11000101"; -- 0x0F26
+ when 003879 => D <= "00001000"; -- 0x0F27
+ when 003880 => D <= "00100100"; -- 0x0F28
+ when 003881 => D <= "00000011"; -- 0x0F29
+ when 003882 => D <= "11000101"; -- 0x0F2A
+ when 003883 => D <= "00001000"; -- 0x0F2B
+ when 003884 => D <= "00010000"; -- 0x0F2C
+ when 003885 => D <= "11010111"; -- 0x0F2D
+ when 003886 => D <= "00000001"; -- 0x0F2E
+ when 003887 => D <= "00100010"; -- 0x0F2F
+ when 003888 => D <= "00000101"; -- 0x0F30
+ when 003889 => D <= "00001010"; -- 0x0F31
+ when 003890 => D <= "00100010"; -- 0x0F32
+ when 003891 => D <= "11110001"; -- 0x0F33
+ when 003892 => D <= "00111000"; -- 0x0F34
+ when 003893 => D <= "01000000"; -- 0x0F35
+ when 003894 => D <= "01001110"; -- 0x0F36
+ when 003895 => D <= "00100010"; -- 0x0F37
+ when 003896 => D <= "11010001"; -- 0x0F38
+ when 003897 => D <= "10100101"; -- 0x0F39
+ when 003898 => D <= "00010010"; -- 0x0F3A
+ when 003899 => D <= "00011001"; -- 0x0F3B
+ when 003900 => D <= "10100101"; -- 0x0F3C
+ when 003901 => D <= "11010001"; -- 0x0F3D
+ when 003902 => D <= "10111011"; -- 0x0F3E
+ when 003903 => D <= "10001010"; -- 0x0F3F
+ when 003904 => D <= "10000011"; -- 0x0F40
+ when 003905 => D <= "10001000"; -- 0x0F41
+ when 003906 => D <= "10000010"; -- 0x0F42
+ when 003907 => D <= "00100010"; -- 0x0F43
+ when 003908 => D <= "10010001"; -- 0x0F44
+ when 003909 => D <= "11101000"; -- 0x0F45
+ when 003910 => D <= "01111010"; -- 0x0F46
+ when 003911 => D <= "11001101"; -- 0x0F47
+ when 003912 => D <= "11000000"; -- 0x0F48
+ when 003913 => D <= "00000010"; -- 0x0F49
+ when 003914 => D <= "11000010"; -- 0x0F4A
+ when 003915 => D <= "00100100"; -- 0x0F4B
+ when 003916 => D <= "11100101"; -- 0x0F4C
+ when 003917 => D <= "10000001"; -- 0x0F4D
+ when 003918 => D <= "00100100"; -- 0x0F4E
+ when 003919 => D <= "00001100"; -- 0x0F4F
+ when 003920 => D <= "01010000"; -- 0x0F50
+ when 003921 => D <= "00000011"; -- 0x0F51
+ when 003922 => D <= "00000010"; -- 0x0F52
+ when 003923 => D <= "00011000"; -- 0x0F53
+ when 003924 => D <= "10000110"; -- 0x0F54
+ when 003925 => D <= "11100101"; -- 0x0F55
+ when 003926 => D <= "00001001"; -- 0x0F56
+ when 003927 => D <= "10010100"; -- 0x0F57
+ when 003928 => D <= "00111000"; -- 0x0F58
+ when 003929 => D <= "01010000"; -- 0x0F59
+ when 003930 => D <= "00000011"; -- 0x0F5A
+ when 003931 => D <= "00000010"; -- 0x0F5B
+ when 003932 => D <= "00010010"; -- 0x0F5C
+ when 003933 => D <= "00000101"; -- 0x0F5D
+ when 003934 => D <= "00100000"; -- 0x0F5E
+ when 003935 => D <= "00100100"; -- 0x0F5F
+ when 003936 => D <= "00010011"; -- 0x0F60
+ when 003937 => D <= "10110001"; -- 0x0F61
+ when 003938 => D <= "01101000"; -- 0x0F62
+ when 003939 => D <= "01010000"; -- 0x0F63
+ when 003940 => D <= "00001101"; -- 0x0F64
+ when 003941 => D <= "11110001"; -- 0x0F65
+ when 003942 => D <= "11110010"; -- 0x0F66
+ when 003943 => D <= "01010000"; -- 0x0F67
+ when 003944 => D <= "00001011"; -- 0x0F68
+ when 003945 => D <= "11010001"; -- 0x0F69
+ when 003946 => D <= "11010000"; -- 0x0F6A
+ when 003947 => D <= "10110100"; -- 0x0F6B
+ when 003948 => D <= "11100000"; -- 0x0F6C
+ when 003949 => D <= "00000110"; -- 0x0F6D
+ when 003950 => D <= "01110100"; -- 0x0F6E
+ when 003951 => D <= "11001110"; -- 0x0F6F
+ when 003952 => D <= "10000000"; -- 0x0F70
+ when 003953 => D <= "01010101"; -- 0x0F71
+ when 003954 => D <= "11110001"; -- 0x0F72
+ when 003955 => D <= "11100000"; -- 0x0F73
+ when 003956 => D <= "11010001"; -- 0x0F74
+ when 003957 => D <= "11010000"; -- 0x0F75
+ when 003958 => D <= "10110100"; -- 0x0F76
+ when 003959 => D <= "11100000"; -- 0x0F77
+ when 003960 => D <= "00000000"; -- 0x0F78
+ when 003961 => D <= "01010000"; -- 0x0F79
+ when 003962 => D <= "00001110"; -- 0x0F7A
+ when 003963 => D <= "10110100"; -- 0x0F7B
+ when 003964 => D <= "10110000"; -- 0x0F7C
+ when 003965 => D <= "00000000"; -- 0x0F7D
+ when 003966 => D <= "01010000"; -- 0x0F7E
+ when 003967 => D <= "00111011"; -- 0x0F7F
+ when 003968 => D <= "11010000"; -- 0x0F80
+ when 003969 => D <= "00000010"; -- 0x0F81
+ when 003970 => D <= "00100000"; -- 0x0F82
+ when 003971 => D <= "00100100"; -- 0x0F83
+ when 003972 => D <= "10111110"; -- 0x0F84
+ when 003973 => D <= "11000011"; -- 0x0F85
+ when 003974 => D <= "00000010"; -- 0x0F86
+ when 003975 => D <= "00011000"; -- 0x0F87
+ when 003976 => D <= "10000001"; -- 0x0F88
+ when 003977 => D <= "01010100"; -- 0x0F89
+ when 003978 => D <= "00011111"; -- 0x0F8A
+ when 003979 => D <= "00100000"; -- 0x0F8B
+ when 003980 => D <= "00100100"; -- 0x0F8C
+ when 003981 => D <= "00000101"; -- 0x0F8D
+ when 003982 => D <= "10110100"; -- 0x0F8E
+ when 003983 => D <= "00000101"; -- 0x0F8F
+ when 003984 => D <= "00111100"; -- 0x0F90
+ when 003985 => D <= "01110100"; -- 0x0F91
+ when 003986 => D <= "00001001"; -- 0x0F92
+ when 003987 => D <= "00100100"; -- 0x0F93
+ when 003988 => D <= "11001110"; -- 0x0F94
+ when 003989 => D <= "11111010"; -- 0x0F95
+ when 003990 => D <= "10010000"; -- 0x0F96
+ when 003991 => D <= "00000000"; -- 0x0F97
+ when 003992 => D <= "00000000"; -- 0x0F98
+ when 003993 => D <= "10010011"; -- 0x0F99
+ when 003994 => D <= "11111100"; -- 0x0F9A
+ when 003995 => D <= "11010000"; -- 0x0F9B
+ when 003996 => D <= "11100000"; -- 0x0F9C
+ when 003997 => D <= "11111101"; -- 0x0F9D
+ when 003998 => D <= "10010011"; -- 0x0F9E
+ when 003999 => D <= "10110101"; -- 0x0F9F
+ when 004000 => D <= "00000100"; -- 0x0FA0
+ when 004001 => D <= "00000100"; -- 0x0FA1
+ when 004002 => D <= "10110100"; -- 0x0FA2
+ when 004003 => D <= "00001100"; -- 0x0FA3
+ when 004004 => D <= "10011110"; -- 0x0FA4
+ when 004005 => D <= "11010011"; -- 0x0FA5
+ when 004006 => D <= "01010000"; -- 0x0FA6
+ when 004007 => D <= "10011011"; -- 0x0FA7
+ when 004008 => D <= "11000000"; -- 0x0FA8
+ when 004009 => D <= "00000101"; -- 0x0FA9
+ when 004010 => D <= "11000000"; -- 0x0FAA
+ when 004011 => D <= "00000010"; -- 0x0FAB
+ when 004012 => D <= "11010001"; -- 0x0FAC
+ when 004013 => D <= "11011010"; -- 0x0FAD
+ when 004014 => D <= "11110001"; -- 0x0FAE
+ when 004015 => D <= "01001000"; -- 0x0FAF
+ when 004016 => D <= "11010000"; -- 0x0FB0
+ when 004017 => D <= "11100000"; -- 0x0FB1
+ when 004018 => D <= "10010000"; -- 0x0FB2
+ when 004019 => D <= "00000000"; -- 0x0FB3
+ when 004020 => D <= "01010111"; -- 0x0FB4
+ when 004021 => D <= "00100100"; -- 0x0FB5
+ when 004022 => D <= "00110010"; -- 0x0FB6
+ when 004023 => D <= "00110001"; -- 0x0FB7
+ when 004024 => D <= "01011111"; -- 0x0FB8
+ when 004025 => D <= "11100001"; -- 0x0FB9
+ when 004026 => D <= "01001100"; -- 0x0FBA
+ when 004027 => D <= "11010001"; -- 0x0FBB
+ when 004028 => D <= "11011010"; -- 0x0FBC
+ when 004029 => D <= "00100100"; -- 0x0FBD
+ when 004030 => D <= "00101110"; -- 0x0FBE
+ when 004031 => D <= "00100000"; -- 0x0FBF
+ when 004032 => D <= "00100100"; -- 0x0FC0
+ when 004033 => D <= "11000011"; -- 0x0FC1
+ when 004034 => D <= "10110100"; -- 0x0FC2
+ when 004035 => D <= "11101100"; -- 0x0FC3
+ when 004036 => D <= "00000000"; -- 0x0FC4
+ when 004037 => D <= "01010000"; -- 0x0FC5
+ when 004038 => D <= "11101011"; -- 0x0FC6
+ when 004039 => D <= "11000000"; -- 0x0FC7
+ when 004040 => D <= "11100000"; -- 0x0FC8
+ when 004041 => D <= "10010001"; -- 0x0FC9
+ when 004042 => D <= "11100010"; -- 0x0FCA
+ when 004043 => D <= "10000000"; -- 0x0FCB
+ when 004044 => D <= "11100011"; -- 0x0FCC
+ when 004045 => D <= "10110100"; -- 0x0FCD
+ when 004046 => D <= "00000011"; -- 0x0FCE
+ when 004047 => D <= "10110101"; -- 0x0FCF
+ when 004048 => D <= "11010001"; -- 0x0FD0
+ when 004049 => D <= "11011010"; -- 0x0FD1
+ when 004050 => D <= "11100001"; -- 0x0FD2
+ when 004051 => D <= "01001100"; -- 0x0FD3
+ when 004052 => D <= "10110001"; -- 0x0FD4
+ when 004053 => D <= "10110000"; -- 0x0FD5
+ when 004054 => D <= "00010010"; -- 0x0FD6
+ when 004055 => D <= "00010010"; -- 0x0FD7
+ when 004056 => D <= "00111010"; -- 0x0FD8
+ when 004057 => D <= "00000010"; -- 0x0FD9
+ when 004058 => D <= "00010100"; -- 0x0FDA
+ when 004059 => D <= "01011101"; -- 0x0FDB
+ when 004060 => D <= "01111010"; -- 0x0FDC
+ when 004061 => D <= "00000001"; -- 0x0FDD
+ when 004062 => D <= "01111000"; -- 0x0FDE
+ when 004063 => D <= "00010011"; -- 0x0FDF
+ when 004064 => D <= "00010010"; -- 0x0FE0
+ when 004065 => D <= "00010001"; -- 0x0FE1
+ when 004066 => D <= "11110110"; -- 0x0FE2
+ when 004067 => D <= "11010010"; -- 0x0FE3
+ when 004068 => D <= "00100100"; -- 0x0FE4
+ when 004069 => D <= "00000010"; -- 0x0FE5
+ when 004070 => D <= "00010100"; -- 0x0FE6
+ when 004071 => D <= "01011101"; -- 0x0FE7
+ when 004072 => D <= "11010001"; -- 0x0FE8
+ when 004073 => D <= "10010001"; -- 0x0FE9
+ when 004074 => D <= "10000000"; -- 0x0FEA
+ when 004075 => D <= "11101010"; -- 0x0FEB
+ when 004076 => D <= "11010001"; -- 0x0FEC
+ when 004077 => D <= "10010001"; -- 0x0FED
+ when 004078 => D <= "10110001"; -- 0x0FEE
+ when 004079 => D <= "10110000"; -- 0x0FEF
+ when 004080 => D <= "10000000"; -- 0x0FF0
+ when 004081 => D <= "11101110"; -- 0x0FF1
+ when 004082 => D <= "11010001"; -- 0x0FF2
+ when 004083 => D <= "11010000"; -- 0x0FF3
+ when 004084 => D <= "10110100"; -- 0x0FF4
+ when 004085 => D <= "11010001"; -- 0x0FF5
+ when 004086 => D <= "00010011"; -- 0x0FF6
+ when 004087 => D <= "11010001"; -- 0x0FF7
+ when 004088 => D <= "11001110"; -- 0x0FF8
+ when 004089 => D <= "10110100"; -- 0x0FF9
+ when 004090 => D <= "00100100"; -- 0x0FFA
+ when 004091 => D <= "00000101"; -- 0x0FFB
+ when 004092 => D <= "01010001"; -- 0x0FFC
+ when 004093 => D <= "00100001"; -- 0x0FFD
+ when 004094 => D <= "00000010"; -- 0x0FFE
+ when 004095 => D <= "00010011"; -- 0x0FFF
+ when 004096 => D <= "10101011"; -- 0x1000
+ when 004097 => D <= "00010010"; -- 0x1001
+ when 004098 => D <= "00010100"; -- 0x1002
+ when 004099 => D <= "10011100"; -- 0x1003
+ when 004100 => D <= "00010010"; -- 0x1004
+ when 004101 => D <= "00001110"; -- 0x1005
+ when 004102 => D <= "11011010"; -- 0x1006
+ when 004103 => D <= "00000010"; -- 0x1007
+ when 004104 => D <= "00001100"; -- 0x1008
+ when 004105 => D <= "11100110"; -- 0x1009
+ when 004106 => D <= "00010010"; -- 0x100A
+ when 004107 => D <= "00001110"; -- 0x100B
+ when 004108 => D <= "10100101"; -- 0x100C
+ when 004109 => D <= "00010010"; -- 0x100D
+ when 004110 => D <= "00011001"; -- 0x100E
+ when 004111 => D <= "01001110"; -- 0x100F
+ when 004112 => D <= "10110100"; -- 0x1010
+ when 004113 => D <= "11111111"; -- 0x1011
+ when 004114 => D <= "00000010"; -- 0x1012
+ when 004115 => D <= "11010011"; -- 0x1013
+ when 004116 => D <= "00100010"; -- 0x1014
+ when 004117 => D <= "01110000"; -- 0x1015
+ when 004118 => D <= "00000110"; -- 0x1016
+ when 004119 => D <= "11000011"; -- 0x1017
+ when 004120 => D <= "11010010"; -- 0x1018
+ when 004121 => D <= "00100100"; -- 0x1019
+ when 004122 => D <= "00000010"; -- 0x101A
+ when 004123 => D <= "00001110"; -- 0x101B
+ when 004124 => D <= "10111011"; -- 0x101C
+ when 004125 => D <= "01010100"; -- 0x101D
+ when 004126 => D <= "00001011"; -- 0x101E
+ when 004127 => D <= "01100000"; -- 0x101F
+ when 004128 => D <= "11110011"; -- 0x1020
+ when 004129 => D <= "10010000"; -- 0x1021
+ when 004130 => D <= "00010111"; -- 0x1022
+ when 004131 => D <= "01001000"; -- 0x1023
+ when 004132 => D <= "00110000"; -- 0x1024
+ when 004133 => D <= "11100000"; -- 0x1025
+ when 004134 => D <= "00000011"; -- 0x1026
+ when 004135 => D <= "10010000"; -- 0x1027
+ when 004136 => D <= "00010111"; -- 0x1028
+ when 004137 => D <= "11111110"; -- 0x1029
+ when 004138 => D <= "00110000"; -- 0x102A
+ when 004139 => D <= "11100001"; -- 0x102B
+ when 004140 => D <= "00000011"; -- 0x102C
+ when 004141 => D <= "10010000"; -- 0x102D
+ when 004142 => D <= "00011111"; -- 0x102E
+ when 004143 => D <= "10001001"; -- 0x102F
+ when 004144 => D <= "00000010"; -- 0x1030
+ when 004145 => D <= "00011000"; -- 0x1031
+ when 004146 => D <= "10001001"; -- 0x1032
+ when 004147 => D <= "00010010"; -- 0x1033
+ when 004148 => D <= "00001100"; -- 0x1034
+ when 004149 => D <= "00011100"; -- 0x1035
+ when 004150 => D <= "01110001"; -- 0x1036
+ when 004151 => D <= "10110110"; -- 0x1037
+ when 004152 => D <= "00010010"; -- 0x1038
+ when 004153 => D <= "00001111"; -- 0x1039
+ when 004154 => D <= "00111000"; -- 0x103A
+ when 004155 => D <= "11100100"; -- 0x103B
+ when 004156 => D <= "11111011"; -- 0x103C
+ when 004157 => D <= "11111001"; -- 0x103D
+ when 004158 => D <= "01000000"; -- 0x103E
+ when 004159 => D <= "00010100"; -- 0x103F
+ when 004160 => D <= "00010010"; -- 0x1040
+ when 004161 => D <= "00011000"; -- 0x1041
+ when 004162 => D <= "01001110"; -- 0x1042
+ when 004163 => D <= "00010010"; -- 0x1043
+ when 004164 => D <= "00001110"; -- 0x1044
+ when 004165 => D <= "11011000"; -- 0x1045
+ when 004166 => D <= "10110100"; -- 0x1046
+ when 004167 => D <= "11100101"; -- 0x1047
+ when 004168 => D <= "00000111"; -- 0x1048
+ when 004169 => D <= "01010001"; -- 0x1049
+ when 004170 => D <= "00111010"; -- 0x104A
+ when 004171 => D <= "00010010"; -- 0x104B
+ when 004172 => D <= "00001111"; -- 0x104C
+ when 004173 => D <= "00110011"; -- 0x104D
+ when 004174 => D <= "10010001"; -- 0x104E
+ when 004175 => D <= "10011111"; -- 0x104F
+ when 004176 => D <= "10101011"; -- 0x1050
+ when 004177 => D <= "00001111"; -- 0x1051
+ when 004178 => D <= "10101001"; -- 0x1052
+ when 004179 => D <= "00001110"; -- 0x1053
+ when 004180 => D <= "00010010"; -- 0x1054
+ when 004181 => D <= "00000101"; -- 0x1055
+ when 004182 => D <= "10000110"; -- 0x1056
+ when 004183 => D <= "01100000"; -- 0x1057
+ when 004184 => D <= "00011110"; -- 0x1058
+ when 004185 => D <= "00010001"; -- 0x1059
+ when 004186 => D <= "00011010"; -- 0x105A
+ when 004187 => D <= "10100011"; -- 0x105B
+ when 004188 => D <= "11010001"; -- 0x105C
+ when 004189 => D <= "00111101"; -- 0x105D
+ when 004190 => D <= "00110001"; -- 0x105E
+ when 004191 => D <= "11110011"; -- 0x105F
+ when 004192 => D <= "01000000"; -- 0x1060
+ when 004193 => D <= "00010101"; -- 0x1061
+ when 004194 => D <= "00010010"; -- 0x1062
+ when 004195 => D <= "00000111"; -- 0x1063
+ when 004196 => D <= "10000111"; -- 0x1064
+ when 004197 => D <= "00110001"; -- 0x1065
+ when 004198 => D <= "11110110"; -- 0x1066
+ when 004199 => D <= "00010010"; -- 0x1067
+ when 004200 => D <= "00001110"; -- 0x1068
+ when 004201 => D <= "10100101"; -- 0x1069
+ when 004202 => D <= "00010001"; -- 0x106A
+ when 004203 => D <= "10001000"; -- 0x106B
+ when 004204 => D <= "00010001"; -- 0x106C
+ when 004205 => D <= "00011010"; -- 0x106D
+ when 004206 => D <= "00010001"; -- 0x106E
+ when 004207 => D <= "01111001"; -- 0x106F
+ when 004208 => D <= "10100011"; -- 0x1070
+ when 004209 => D <= "11100000"; -- 0x1071
+ when 004210 => D <= "11010101"; -- 0x1072
+ when 004211 => D <= "11100000"; -- 0x1073
+ when 004212 => D <= "11100100"; -- 0x1074
+ when 004213 => D <= "01010001"; -- 0x1075
+ when 004214 => D <= "00111010"; -- 0x1076
+ when 004215 => D <= "11100001"; -- 0x1077
+ when 004216 => D <= "01111110"; -- 0x1078
+ when 004217 => D <= "10010000"; -- 0x1079
+ when 004218 => D <= "00000000"; -- 0x107A
+ when 004219 => D <= "00000111"; -- 0x107B
+ when 004220 => D <= "00010010"; -- 0x107C
+ when 004221 => D <= "00000110"; -- 0x107D
+ when 004222 => D <= "10111011"; -- 0x107E
+ when 004223 => D <= "00010010"; -- 0x107F
+ when 004224 => D <= "00001110"; -- 0x1080
+ when 004225 => D <= "10100101"; -- 0x1081
+ when 004226 => D <= "00000010"; -- 0x1082
+ when 004227 => D <= "00000110"; -- 0x1083
+ when 004228 => D <= "10011111"; -- 0x1084
+ when 004229 => D <= "00010010"; -- 0x1085
+ when 004230 => D <= "00000101"; -- 0x1086
+ when 004231 => D <= "01110011"; -- 0x1087
+ when 004232 => D <= "01111011"; -- 0x1088
+ when 004233 => D <= "00000000"; -- 0x1089
+ when 004234 => D <= "01111001"; -- 0x108A
+ when 004235 => D <= "00000111"; -- 0x108B
+ when 004236 => D <= "10100011"; -- 0x108C
+ when 004237 => D <= "00010001"; -- 0x108D
+ when 004238 => D <= "00011010"; -- 0x108E
+ when 004239 => D <= "00010010"; -- 0x108F
+ when 004240 => D <= "00000101"; -- 0x1090
+ when 004241 => D <= "01101101"; -- 0x1091
+ when 004242 => D <= "00010010"; -- 0x1092
+ when 004243 => D <= "00011001"; -- 0x1093
+ when 004244 => D <= "10100011"; -- 0x1094
+ when 004245 => D <= "00010010"; -- 0x1095
+ when 004246 => D <= "00001110"; -- 0x1096
+ when 004247 => D <= "10100101"; -- 0x1097
+ when 004248 => D <= "10100011"; -- 0x1098
+ when 004249 => D <= "10111001"; -- 0x1099
+ when 004250 => D <= "00001101"; -- 0x109A
+ when 004251 => D <= "00000000"; -- 0x109B
+ when 004252 => D <= "01000000"; -- 0x109C
+ when 004253 => D <= "00100010"; -- 0x109D
+ when 004254 => D <= "10100011"; -- 0x109E
+ when 004255 => D <= "11100000"; -- 0x109F
+ when 004256 => D <= "11111110"; -- 0x10A0
+ when 004257 => D <= "00100000"; -- 0x10A1
+ when 004258 => D <= "11100111"; -- 0x10A2
+ when 004259 => D <= "00100100"; -- 0x10A3
+ when 004260 => D <= "10110100"; -- 0x10A4
+ when 004261 => D <= "00100000"; -- 0x10A5
+ when 004262 => D <= "00000000"; -- 0x10A6
+ when 004263 => D <= "01010000"; -- 0x10A7
+ when 004264 => D <= "00000011"; -- 0x10A8
+ when 004265 => D <= "10110100"; -- 0x10A9
+ when 004266 => D <= "00001101"; -- 0x10AA
+ when 004267 => D <= "00011100"; -- 0x10AB
+ when 004268 => D <= "10110100"; -- 0x10AC
+ when 004269 => D <= "00100010"; -- 0x10AD
+ when 004270 => D <= "00001001"; -- 0x10AE
+ when 004271 => D <= "00110001"; -- 0x10AF
+ when 004272 => D <= "00001100"; -- 0x10B0
+ when 004273 => D <= "00110001"; -- 0x10B1
+ when 004274 => D <= "00001110"; -- 0x10B2
+ when 004275 => D <= "10110100"; -- 0x10B3
+ when 004276 => D <= "00100010"; -- 0x10B4
+ when 004277 => D <= "11111011"; -- 0x10B5
+ when 004278 => D <= "10000000"; -- 0x10B6
+ when 004279 => D <= "11100001"; -- 0x10B7
+ when 004280 => D <= "10110100"; -- 0x10B8
+ when 004281 => D <= "00111010"; -- 0x10B9
+ when 004282 => D <= "00001001"; -- 0x10BA
+ when 004283 => D <= "00110001"; -- 0x10BB
+ when 004284 => D <= "00001010"; -- 0x10BC
+ when 004285 => D <= "11101110"; -- 0x10BD
+ when 004286 => D <= "00110001"; -- 0x10BE
+ when 004287 => D <= "00001100"; -- 0x10BF
+ when 004288 => D <= "00110001"; -- 0x10C0
+ when 004289 => D <= "00001010"; -- 0x10C1
+ when 004290 => D <= "10000000"; -- 0x10C2
+ when 004291 => D <= "11010101"; -- 0x10C3
+ when 004292 => D <= "00110001"; -- 0x10C4
+ when 004293 => D <= "00010000"; -- 0x10C5
+ when 004294 => D <= "10000000"; -- 0x10C6
+ when 004295 => D <= "11010001"; -- 0x10C7
+ when 004296 => D <= "00010001"; -- 0x10C8
+ when 004297 => D <= "00011010"; -- 0x10C9
+ when 004298 => D <= "10100010"; -- 0x10CA
+ when 004299 => D <= "00101101"; -- 0x10CB
+ when 004300 => D <= "10010010"; -- 0x10CC
+ when 004301 => D <= "11010101"; -- 0x10CD
+ when 004302 => D <= "10010000"; -- 0x10CE
+ when 004303 => D <= "00000001"; -- 0x10CF
+ when 004304 => D <= "01110011"; -- 0x10D0
+ when 004305 => D <= "00110000"; -- 0x10D1
+ when 004306 => D <= "11010101"; -- 0x10D2
+ when 004307 => D <= "00000011"; -- 0x10D3
+ when 004308 => D <= "00010010"; -- 0x10D4
+ when 004309 => D <= "00100000"; -- 0x10D5
+ when 004310 => D <= "01111000"; -- 0x10D6
+ when 004311 => D <= "11100100"; -- 0x10D7
+ when 004312 => D <= "10010011"; -- 0x10D8
+ when 004313 => D <= "10100011"; -- 0x10D9
+ when 004314 => D <= "10110100"; -- 0x10DA
+ when 004315 => D <= "11111111"; -- 0x10DB
+ when 004316 => D <= "00000101"; -- 0x10DC
+ when 004317 => D <= "00010000"; -- 0x10DD
+ when 004318 => D <= "11010101"; -- 0x10DE
+ when 004319 => D <= "11101110"; -- 0x10DF
+ when 004320 => D <= "11100001"; -- 0x10E0
+ when 004321 => D <= "01111110"; -- 0x10E1
+ when 004322 => D <= "10110101"; -- 0x10E2
+ when 004323 => D <= "00000110"; -- 0x10E3
+ when 004324 => D <= "11110010"; -- 0x10E4
+ when 004325 => D <= "10110100"; -- 0x10E5
+ when 004326 => D <= "10110000"; -- 0x10E6
+ when 004327 => D <= "00000000"; -- 0x10E7
+ when 004328 => D <= "01010000"; -- 0x10E8
+ when 004329 => D <= "00000010"; -- 0x10E9
+ when 004330 => D <= "00110001"; -- 0x10EA
+ when 004331 => D <= "00001010"; -- 0x10EB
+ when 004332 => D <= "11100100"; -- 0x10EC
+ when 004333 => D <= "10010011"; -- 0x10ED
+ when 004334 => D <= "00100000"; -- 0x10EE
+ when 004335 => D <= "11100111"; -- 0x10EF
+ when 004336 => D <= "00000111"; -- 0x10F0
+ when 004337 => D <= "01100000"; -- 0x10F1
+ when 004338 => D <= "00000101"; -- 0x10F2
+ when 004339 => D <= "00110001"; -- 0x10F3
+ when 004340 => D <= "00001100"; -- 0x10F4
+ when 004341 => D <= "10100011"; -- 0x10F5
+ when 004342 => D <= "10000000"; -- 0x10F6
+ when 004343 => D <= "11110100"; -- 0x10F7
+ when 004344 => D <= "00010010"; -- 0x10F8
+ when 004345 => D <= "00001110"; -- 0x10F9
+ when 004346 => D <= "10100101"; -- 0x10FA
+ when 004347 => D <= "11101110"; -- 0x10FB
+ when 004348 => D <= "01100100"; -- 0x10FC
+ when 004349 => D <= "10010110"; -- 0x10FD
+ when 004350 => D <= "01110000"; -- 0x10FE
+ when 004351 => D <= "00000100"; -- 0x10FF
+ when 004352 => D <= "00110001"; -- 0x1100
+ when 004353 => D <= "00001110"; -- 0x1101
+ when 004354 => D <= "10000000"; -- 0x1102
+ when 004355 => D <= "11111100"; -- 0x1103
+ when 004356 => D <= "01010000"; -- 0x1104
+ when 004357 => D <= "10010011"; -- 0x1105
+ when 004358 => D <= "00110001"; -- 0x1106
+ when 004359 => D <= "00001010"; -- 0x1107
+ when 004360 => D <= "10000000"; -- 0x1108
+ when 004361 => D <= "10001111"; -- 0x1109
+ when 004362 => D <= "01110100"; -- 0x110A
+ when 004363 => D <= "00100000"; -- 0x110B
+ when 004364 => D <= "11000001"; -- 0x110C
+ when 004365 => D <= "00101111"; -- 0x110D
+ when 004366 => D <= "10100011"; -- 0x110E
+ when 004367 => D <= "11100000"; -- 0x110F
+ when 004368 => D <= "10110100"; -- 0x1110
+ when 004369 => D <= "00001101"; -- 0x1111
+ when 004370 => D <= "11111001"; -- 0x1112
+ when 004371 => D <= "11000001"; -- 0x1113
+ when 004372 => D <= "00011011"; -- 0x1114
+ when 004373 => D <= "01111110"; -- 0x1115
+ when 004374 => D <= "00000000"; -- 0x1116
+ when 004375 => D <= "01010111"; -- 0x1117
+ when 004376 => D <= "00100010"; -- 0x1118
+ when 004377 => D <= "01100110"; -- 0x1119
+ when 004378 => D <= "00101000"; -- 0x111A
+ when 004379 => D <= "01111111"; -- 0x111B
+ when 004380 => D <= "00000001"; -- 0x111C
+ when 004381 => D <= "00110111"; -- 0x111D
+ when 004382 => D <= "01010111"; -- 0x111E
+ when 004383 => D <= "00010110"; -- 0x111F
+ when 004384 => D <= "00010110"; -- 0x1120
+ when 004385 => D <= "01111111"; -- 0x1121
+ when 004386 => D <= "00000000"; -- 0x1122
+ when 004387 => D <= "00010100"; -- 0x1123
+ when 004388 => D <= "10010110"; -- 0x1124
+ when 004389 => D <= "10010000"; -- 0x1125
+ when 004390 => D <= "01000010"; -- 0x1126
+ when 004391 => D <= "01111111"; -- 0x1127
+ when 004392 => D <= "00000001"; -- 0x1128
+ when 004393 => D <= "01000000"; -- 0x1129
+ when 004394 => D <= "10010110"; -- 0x112A
+ when 004395 => D <= "00101000"; -- 0x112B
+ when 004396 => D <= "01110101"; -- 0x112C
+ when 004397 => D <= "10000000"; -- 0x112D
+ when 004398 => D <= "00000000"; -- 0x112E
+ when 004399 => D <= "01100100"; -- 0x112F
+ when 004400 => D <= "01100010"; -- 0x1130
+ when 004401 => D <= "01100101"; -- 0x1131
+ when 004402 => D <= "00010000"; -- 0x1132
+ when 004403 => D <= "10000000"; -- 0x1133
+ when 004404 => D <= "00000001"; -- 0x1134
+ when 004405 => D <= "10011001"; -- 0x1135
+ when 004406 => D <= "10001000"; -- 0x1136
+ when 004407 => D <= "00100000"; -- 0x1137
+ when 004408 => D <= "00010100"; -- 0x1138
+ when 004409 => D <= "10000000"; -- 0x1139
+ when 004410 => D <= "00000000"; -- 0x113A
+ when 004411 => D <= "01010001"; -- 0x113B
+ when 004412 => D <= "00110101"; -- 0x113C
+ when 004413 => D <= "10011001"; -- 0x113D
+ when 004414 => D <= "00011001"; -- 0x113E
+ when 004415 => D <= "10000000"; -- 0x113F
+ when 004416 => D <= "00000001"; -- 0x1140
+ when 004417 => D <= "01000101"; -- 0x1141
+ when 004418 => D <= "00110001"; -- 0x1142
+ when 004419 => D <= "00110011"; -- 0x1143
+ when 004420 => D <= "00110011"; -- 0x1144
+ when 004421 => D <= "10000001"; -- 0x1145
+ when 004422 => D <= "00000000"; -- 0x1146
+ when 004423 => D <= "00000000"; -- 0x1147
+ when 004424 => D <= "00000000"; -- 0x1148
+ when 004425 => D <= "00000000"; -- 0x1149
+ when 004426 => D <= "00010000"; -- 0x114A
+ when 004427 => D <= "11111111"; -- 0x114B
+ when 004428 => D <= "10000001"; -- 0x114C
+ when 004429 => D <= "00000000"; -- 0x114D
+ when 004430 => D <= "00000000"; -- 0x114E
+ when 004431 => D <= "00000000"; -- 0x114F
+ when 004432 => D <= "00000000"; -- 0x1150
+ when 004433 => D <= "00100000"; -- 0x1151
+ when 004434 => D <= "01111100"; -- 0x1152
+ when 004435 => D <= "00000000"; -- 0x1153
+ when 004436 => D <= "00000000"; -- 0x1154
+ when 004437 => D <= "00000000"; -- 0x1155
+ when 004438 => D <= "00000100"; -- 0x1156
+ when 004439 => D <= "00010011"; -- 0x1157
+ when 004440 => D <= "00110001"; -- 0x1158
+ when 004441 => D <= "01111101"; -- 0x1159
+ when 004442 => D <= "11110001"; -- 0x115A
+ when 004443 => D <= "00111000"; -- 0x115B
+ when 004444 => D <= "10010001"; -- 0x115C
+ when 004445 => D <= "01101010"; -- 0x115D
+ when 004446 => D <= "00110001"; -- 0x115E
+ when 004447 => D <= "10100000"; -- 0x115F
+ when 004448 => D <= "11100101"; -- 0x1160
+ when 004449 => D <= "01000110"; -- 0x1161
+ when 004450 => D <= "01010100"; -- 0x1162
+ when 004451 => D <= "00000001"; -- 0x1163
+ when 004452 => D <= "01100010"; -- 0x1164
+ when 004453 => D <= "01000101"; -- 0x1165
+ when 004454 => D <= "10010001"; -- 0x1166
+ when 004455 => D <= "00010111"; -- 0x1167
+ when 004456 => D <= "00110001"; -- 0x1168
+ when 004457 => D <= "01111101"; -- 0x1169
+ when 004458 => D <= "00110001"; -- 0x116A
+ when 004459 => D <= "11110011"; -- 0x116B
+ when 004460 => D <= "01000000"; -- 0x116C
+ when 004461 => D <= "00000100"; -- 0x116D
+ when 004462 => D <= "10010001"; -- 0x116E
+ when 004463 => D <= "01101010"; -- 0x116F
+ when 004464 => D <= "11110001"; -- 0x1170
+ when 004465 => D <= "00010011"; -- 0x1171
+ when 004466 => D <= "01110001"; -- 0x1172
+ when 004467 => D <= "01111010"; -- 0x1173
+ when 004468 => D <= "10010000"; -- 0x1174
+ when 004469 => D <= "00010110"; -- 0x1175
+ when 004470 => D <= "11000101"; -- 0x1176
+ when 004471 => D <= "00110001"; -- 0x1177
+ when 004472 => D <= "10000110"; -- 0x1178
+ when 004473 => D <= "00110001"; -- 0x1179
+ when 004474 => D <= "11000101"; -- 0x117A
+ when 004475 => D <= "00100001"; -- 0x117B
+ when 004476 => D <= "11100111"; -- 0x117C
+ when 004477 => D <= "10010001"; -- 0x117D
+ when 004478 => D <= "01101010"; -- 0x117E
+ when 004479 => D <= "10010000"; -- 0x117F
+ when 004480 => D <= "00010001"; -- 0x1180
+ when 004481 => D <= "01001100"; -- 0x1181
+ when 004482 => D <= "10010001"; -- 0x1182
+ when 004483 => D <= "00011110"; -- 0x1183
+ when 004484 => D <= "01100001"; -- 0x1184
+ when 004485 => D <= "11110101"; -- 0x1185
+ when 004486 => D <= "10010001"; -- 0x1186
+ when 004487 => D <= "00010101"; -- 0x1187
+ when 004488 => D <= "00110001"; -- 0x1188
+ when 004489 => D <= "10011011"; -- 0x1189
+ when 004490 => D <= "10010001"; -- 0x118A
+ when 004491 => D <= "00110011"; -- 0x118B
+ when 004492 => D <= "10010001"; -- 0x118C
+ when 004493 => D <= "00011110"; -- 0x118D
+ when 004494 => D <= "10010001"; -- 0x118E
+ when 004495 => D <= "00111010"; -- 0x118F
+ when 004496 => D <= "00110001"; -- 0x1190
+ when 004497 => D <= "10011011"; -- 0x1191
+ when 004498 => D <= "10010001"; -- 0x1192
+ when 004499 => D <= "00011110"; -- 0x1193
+ when 004500 => D <= "11110001"; -- 0x1194
+ when 004501 => D <= "00111000"; -- 0x1195
+ when 004502 => D <= "11100100"; -- 0x1196
+ when 004503 => D <= "10010011"; -- 0x1197
+ when 004504 => D <= "10110100"; -- 0x1198
+ when 004505 => D <= "11111111"; -- 0x1199
+ when 004506 => D <= "11110011"; -- 0x119A
+ when 004507 => D <= "00010010"; -- 0x119B
+ when 004508 => D <= "00011001"; -- 0x119C
+ when 004509 => D <= "10011001"; -- 0x119D
+ when 004510 => D <= "00000001"; -- 0x119E
+ when 004511 => D <= "00011101"; -- 0x119F
+ when 004512 => D <= "10010001"; -- 0x11A0
+ when 004513 => D <= "01010111"; -- 0x11A1
+ when 004514 => D <= "01110001"; -- 0x11A2
+ when 004515 => D <= "11110101"; -- 0x11A3
+ when 004516 => D <= "01110001"; -- 0x11A4
+ when 004517 => D <= "01111010"; -- 0x11A5
+ when 004518 => D <= "11110101"; -- 0x11A6
+ when 004519 => D <= "01000101"; -- 0x11A7
+ when 004520 => D <= "10010001"; -- 0x11A8
+ when 004521 => D <= "00010101"; -- 0x11A9
+ when 004522 => D <= "01010001"; -- 0x11AA
+ when 004523 => D <= "00001110"; -- 0x11AB
+ when 004524 => D <= "11000000"; -- 0x11AC
+ when 004525 => D <= "00000011"; -- 0x11AD
+ when 004526 => D <= "10001001"; -- 0x11AE
+ when 004527 => D <= "01000110"; -- 0x11AF
+ when 004528 => D <= "01110001"; -- 0x11B0
+ when 004529 => D <= "01011000"; -- 0x11B1
+ when 004530 => D <= "11110001"; -- 0x11B2
+ when 004531 => D <= "00010011"; -- 0x11B3
+ when 004532 => D <= "10010001"; -- 0x11B4
+ when 004533 => D <= "01000001"; -- 0x11B5
+ when 004534 => D <= "00110001"; -- 0x11B6
+ when 004535 => D <= "10011011"; -- 0x11B7
+ when 004536 => D <= "11010000"; -- 0x11B8
+ when 004537 => D <= "00000011"; -- 0x11B9
+ when 004538 => D <= "00100010"; -- 0x11BA
+ when 004539 => D <= "10010001"; -- 0x11BB
+ when 004540 => D <= "00010111"; -- 0x11BC
+ when 004541 => D <= "00110001"; -- 0x11BD
+ when 004542 => D <= "01011100"; -- 0x11BE
+ when 004543 => D <= "10010001"; -- 0x11BF
+ when 004544 => D <= "01000101"; -- 0x11C0
+ when 004545 => D <= "00110001"; -- 0x11C1
+ when 004546 => D <= "01011000"; -- 0x11C2
+ when 004547 => D <= "01100001"; -- 0x11C3
+ when 004548 => D <= "11110101"; -- 0x11C4
+ when 004549 => D <= "01010001"; -- 0x11C5
+ when 004550 => D <= "00111110"; -- 0x11C6
+ when 004551 => D <= "01111011"; -- 0x11C7
+ when 004552 => D <= "00000001"; -- 0x11C8
+ when 004553 => D <= "01100001"; -- 0x11C9
+ when 004554 => D <= "01101100"; -- 0x11CA
+ when 004555 => D <= "01110001"; -- 0x11CB
+ when 004556 => D <= "01111010"; -- 0x11CC
+ when 004557 => D <= "11110101"; -- 0x11CD
+ when 004558 => D <= "01000101"; -- 0x11CE
+ when 004559 => D <= "01010001"; -- 0x11CF
+ when 004560 => D <= "00111110"; -- 0x11D0
+ when 004561 => D <= "00100100"; -- 0x11D1
+ when 004562 => D <= "01111111"; -- 0x11D2
+ when 004563 => D <= "10010010"; -- 0x11D3
+ when 004564 => D <= "00101010"; -- 0x11D4
+ when 004565 => D <= "01010000"; -- 0x11D5
+ when 004566 => D <= "00000010"; -- 0x11D6
+ when 004567 => D <= "01010001"; -- 0x11D7
+ when 004568 => D <= "01100111"; -- 0x11D8
+ when 004569 => D <= "10010000"; -- 0x11D9
+ when 004570 => D <= "00010001"; -- 0x11DA
+ when 004571 => D <= "00010101"; -- 0x11DB
+ when 004572 => D <= "00110001"; -- 0x11DC
+ when 004573 => D <= "10000110"; -- 0x11DD
+ when 004574 => D <= "00110000"; -- 0x11DE
+ when 004575 => D <= "00101010"; -- 0x11DF
+ when 004576 => D <= "00000110"; -- 0x11E0
+ when 004577 => D <= "01110001"; -- 0x11E1
+ when 004578 => D <= "10001100"; -- 0x11E2
+ when 004579 => D <= "00110001"; -- 0x11E3
+ when 004580 => D <= "01111101"; -- 0x11E4
+ when 004581 => D <= "11110001"; -- 0x11E5
+ when 004582 => D <= "00111000"; -- 0x11E6
+ when 004583 => D <= "11100101"; -- 0x11E7
+ when 004584 => D <= "01000101"; -- 0x11E8
+ when 004585 => D <= "01100000"; -- 0x11E9
+ when 004586 => D <= "00011001"; -- 0x11EA
+ when 004587 => D <= "01100001"; -- 0x11EB
+ when 004588 => D <= "10001100"; -- 0x11EC
+ when 004589 => D <= "10010001"; -- 0x11ED
+ when 004590 => D <= "00010111"; -- 0x11EE
+ when 004591 => D <= "01110001"; -- 0x11EF
+ when 004592 => D <= "10110110"; -- 0x11F0
+ when 004593 => D <= "10010001"; -- 0x11F1
+ when 004594 => D <= "01000101"; -- 0x11F2
+ when 004595 => D <= "00000010"; -- 0x11F3
+ when 004596 => D <= "00011001"; -- 0x11F4
+ when 004597 => D <= "10010111"; -- 0x11F5
+ when 004598 => D <= "01110100"; -- 0x11F6
+ when 004599 => D <= "11111010"; -- 0x11F7
+ when 004600 => D <= "00100101"; -- 0x11F8
+ when 004601 => D <= "00001001"; -- 0x11F9
+ when 004602 => D <= "10110100"; -- 0x11FA
+ when 004603 => D <= "00110010"; -- 0x11FB
+ when 004604 => D <= "00000000"; -- 0x11FC
+ when 004605 => D <= "01000000"; -- 0x11FD
+ when 004606 => D <= "00000110"; -- 0x11FE
+ when 004607 => D <= "11110101"; -- 0x11FF
+ when 004608 => D <= "00001001"; -- 0x1200
+ when 004609 => D <= "11111001"; -- 0x1201
+ when 004610 => D <= "01111011"; -- 0x1202
+ when 004611 => D <= "00000001"; -- 0x1203
+ when 004612 => D <= "00100010"; -- 0x1204
+ when 004613 => D <= "10010000"; -- 0x1205
+ when 004614 => D <= "00000011"; -- 0x1206
+ when 004615 => D <= "01110111"; -- 0x1207
+ when 004616 => D <= "00000001"; -- 0x1208
+ when 004617 => D <= "00110000"; -- 0x1209
+ when 004618 => D <= "10010001"; -- 0x120A
+ when 004619 => D <= "00011110"; -- 0x120B
+ when 004620 => D <= "00110001"; -- 0x120C
+ when 004621 => D <= "10011011"; -- 0x120D
+ when 004622 => D <= "11100100"; -- 0x120E
+ when 004623 => D <= "11111011"; -- 0x120F
+ when 004624 => D <= "11111001"; -- 0x1210
+ when 004625 => D <= "10101000"; -- 0x1211
+ when 004626 => D <= "00001001"; -- 0x1212
+ when 004627 => D <= "01110101"; -- 0x1213
+ when 004628 => D <= "10100000"; -- 0x1214
+ when 004629 => D <= "00000001"; -- 0x1215
+ when 004630 => D <= "11100010"; -- 0x1216
+ when 004631 => D <= "11000011"; -- 0x1217
+ when 004632 => D <= "10010100"; -- 0x1218
+ when 004633 => D <= "10000001"; -- 0x1219
+ when 004634 => D <= "11111100"; -- 0x121A
+ when 004635 => D <= "00011000"; -- 0x121B
+ when 004636 => D <= "11100010"; -- 0x121C
+ when 004637 => D <= "01110000"; -- 0x121D
+ when 004638 => D <= "01010110"; -- 0x121E
+ when 004639 => D <= "01000000"; -- 0x121F
+ when 004640 => D <= "00011001"; -- 0x1220
+ when 004641 => D <= "00001100"; -- 0x1221
+ when 004642 => D <= "11101000"; -- 0x1222
+ when 004643 => D <= "10010100"; -- 0x1223
+ when 004644 => D <= "00000101"; -- 0x1224
+ when 004645 => D <= "11111000"; -- 0x1225
+ when 004646 => D <= "00001000"; -- 0x1226
+ when 004647 => D <= "11100010"; -- 0x1227
+ when 004648 => D <= "11000100"; -- 0x1228
+ when 004649 => D <= "00010010"; -- 0x1229
+ when 004650 => D <= "00011001"; -- 0x122A
+ when 004651 => D <= "10100111"; -- 0x122B
+ when 004652 => D <= "01000000"; -- 0x122C
+ when 004653 => D <= "01000111"; -- 0x122D
+ when 004654 => D <= "11011100"; -- 0x122E
+ when 004655 => D <= "00000010"; -- 0x122F
+ when 004656 => D <= "10000000"; -- 0x1230
+ when 004657 => D <= "00001000"; -- 0x1231
+ when 004658 => D <= "11100010"; -- 0x1232
+ when 004659 => D <= "00010010"; -- 0x1233
+ when 004660 => D <= "00011001"; -- 0x1234
+ when 004661 => D <= "10100111"; -- 0x1235
+ when 004662 => D <= "01000000"; -- 0x1236
+ when 004663 => D <= "00111101"; -- 0x1237
+ when 004664 => D <= "11011100"; -- 0x1238
+ when 004665 => D <= "11101100"; -- 0x1239
+ when 004666 => D <= "01110100"; -- 0x123A
+ when 004667 => D <= "00000110"; -- 0x123B
+ when 004668 => D <= "10000000"; -- 0x123C
+ when 004669 => D <= "00000001"; -- 0x123D
+ when 004670 => D <= "11100100"; -- 0x123E
+ when 004671 => D <= "10101000"; -- 0x123F
+ when 004672 => D <= "00001001"; -- 0x1240
+ when 004673 => D <= "01111010"; -- 0x1241
+ when 004674 => D <= "00000001"; -- 0x1242
+ when 004675 => D <= "10001010"; -- 0x1243
+ when 004676 => D <= "10100000"; -- 0x1244
+ when 004677 => D <= "00101000"; -- 0x1245
+ when 004678 => D <= "01000000"; -- 0x1246
+ when 004679 => D <= "10111101"; -- 0x1247
+ when 004680 => D <= "11110101"; -- 0x1248
+ when 004681 => D <= "00001001"; -- 0x1249
+ when 004682 => D <= "11100010"; -- 0x124A
+ when 004683 => D <= "00100010"; -- 0x124B
+ when 004684 => D <= "10010001"; -- 0x124C
+ when 004685 => D <= "00101110"; -- 0x124D
+ when 004686 => D <= "00110001"; -- 0x124E
+ when 004687 => D <= "10100000"; -- 0x124F
+ when 004688 => D <= "10111011"; -- 0x1250
+ when 004689 => D <= "00000000"; -- 0x1251
+ when 004690 => D <= "00100010"; -- 0x1252
+ when 004691 => D <= "10010001"; -- 0x1253
+ when 004692 => D <= "01010111"; -- 0x1254
+ when 004693 => D <= "01010001"; -- 0x1255
+ when 004694 => D <= "00111010"; -- 0x1256
+ when 004695 => D <= "10010001"; -- 0x1257
+ when 004696 => D <= "00110011"; -- 0x1258
+ when 004697 => D <= "10010001"; -- 0x1259
+ when 004698 => D <= "00101110"; -- 0x125A
+ when 004699 => D <= "11100101"; -- 0x125B
+ when 004700 => D <= "01000110"; -- 0x125C
+ when 004701 => D <= "01110000"; -- 0x125D
+ when 004702 => D <= "00001110"; -- 0x125E
+ when 004703 => D <= "11100101"; -- 0x125F
+ when 004704 => D <= "01000101"; -- 0x1260
+ when 004705 => D <= "01100000"; -- 0x1261
+ when 004706 => D <= "11101000"; -- 0x1262
+ when 004707 => D <= "10010000"; -- 0x1263
+ when 004708 => D <= "00000001"; -- 0x1264
+ when 004709 => D <= "00011110"; -- 0x1265
+ when 004710 => D <= "11110000"; -- 0x1266
+ when 004711 => D <= "10010001"; -- 0x1267
+ when 004712 => D <= "00101110"; -- 0x1268
+ when 004713 => D <= "10010001"; -- 0x1269
+ when 004714 => D <= "01000101"; -- 0x126A
+ when 004715 => D <= "01100001"; -- 0x126B
+ when 004716 => D <= "11110101"; -- 0x126C
+ when 004717 => D <= "00010101"; -- 0x126D
+ when 004718 => D <= "01000110"; -- 0x126E
+ when 004719 => D <= "10010001"; -- 0x126F
+ when 004720 => D <= "00111010"; -- 0x1270
+ when 004721 => D <= "00110001"; -- 0x1271
+ when 004722 => D <= "10011011"; -- 0x1272
+ when 004723 => D <= "10000000"; -- 0x1273
+ when 004724 => D <= "11100110"; -- 0x1274
+ when 004725 => D <= "00000010"; -- 0x1275
+ when 004726 => D <= "00001001"; -- 0x1276
+ when 004727 => D <= "11000000"; -- 0x1277
+ when 004728 => D <= "01110001"; -- 0x1278
+ when 004729 => D <= "01111010"; -- 0x1279
+ when 004730 => D <= "01110000"; -- 0x127A
+ when 004731 => D <= "11111001"; -- 0x127B
+ when 004732 => D <= "10010001"; -- 0x127C
+ when 004733 => D <= "01010111"; -- 0x127D
+ when 004734 => D <= "10010001"; -- 0x127E
+ when 004735 => D <= "00110011"; -- 0x127F
+ when 004736 => D <= "01111000"; -- 0x1280
+ when 004737 => D <= "00011001"; -- 0x1281
+ when 004738 => D <= "11100010"; -- 0x1282
+ when 004739 => D <= "01100000"; -- 0x1283
+ when 004740 => D <= "00100100"; -- 0x1284
+ when 004741 => D <= "00100100"; -- 0x1285
+ when 004742 => D <= "10000000"; -- 0x1286
+ when 004743 => D <= "01010000"; -- 0x1287
+ when 004744 => D <= "00000101"; -- 0x1288
+ when 004745 => D <= "00000011"; -- 0x1289
+ when 004746 => D <= "01010100"; -- 0x128A
+ when 004747 => D <= "01111111"; -- 0x128B
+ when 004748 => D <= "10000000"; -- 0x128C
+ when 004749 => D <= "00000111"; -- 0x128D
+ when 004750 => D <= "11110100"; -- 0x128E
+ when 004751 => D <= "00000100"; -- 0x128F
+ when 004752 => D <= "00000011"; -- 0x1290
+ when 004753 => D <= "01010100"; -- 0x1291
+ when 004754 => D <= "01111111"; -- 0x1292
+ when 004755 => D <= "11110100"; -- 0x1293
+ when 004756 => D <= "00000100"; -- 0x1294
+ when 004757 => D <= "00100100"; -- 0x1295
+ when 004758 => D <= "10000000"; -- 0x1296
+ when 004759 => D <= "11110010"; -- 0x1297
+ when 004760 => D <= "10010001"; -- 0x1298
+ when 004761 => D <= "01000001"; -- 0x1299
+ when 004762 => D <= "10010001"; -- 0x129A
+ when 004763 => D <= "00111010"; -- 0x129B
+ when 004764 => D <= "01110001"; -- 0x129C
+ when 004765 => D <= "11110101"; -- 0x129D
+ when 004766 => D <= "10010001"; -- 0x129E
+ when 004767 => D <= "00111010"; -- 0x129F
+ when 004768 => D <= "11110001"; -- 0x12A0
+ when 004769 => D <= "00111000"; -- 0x12A1
+ when 004770 => D <= "00110001"; -- 0x12A2
+ when 004771 => D <= "01111111"; -- 0x12A3
+ when 004772 => D <= "01110001"; -- 0x12A4
+ when 004773 => D <= "00000111"; -- 0x12A5
+ when 004774 => D <= "00110000"; -- 0x12A6
+ when 004775 => D <= "11010101"; -- 0x12A7
+ when 004776 => D <= "11101111"; -- 0x12A8
+ when 004777 => D <= "10000001"; -- 0x12A9
+ when 004778 => D <= "00111010"; -- 0x12AA
+ when 004779 => D <= "01110001"; -- 0x12AB
+ when 004780 => D <= "01111010"; -- 0x12AC
+ when 004781 => D <= "01110000"; -- 0x12AD
+ when 004782 => D <= "11000110"; -- 0x12AE
+ when 004783 => D <= "11110101"; -- 0x12AF
+ when 004784 => D <= "01000110"; -- 0x12B0
+ when 004785 => D <= "00001000"; -- 0x12B1
+ when 004786 => D <= "11100010"; -- 0x12B2
+ when 004787 => D <= "01100000"; -- 0x12B3
+ when 004788 => D <= "11000000"; -- 0x12B4
+ when 004789 => D <= "10110100"; -- 0x12B5
+ when 004790 => D <= "10000001"; -- 0x12B6
+ when 004791 => D <= "00000000"; -- 0x12B7
+ when 004792 => D <= "10010010"; -- 0x12B8
+ when 004793 => D <= "00101010"; -- 0x12B9
+ when 004794 => D <= "01000000"; -- 0x12BA
+ when 004795 => D <= "00000010"; -- 0x12BB
+ when 004796 => D <= "01010001"; -- 0x12BC
+ when 004797 => D <= "01100111"; -- 0x12BD
+ when 004798 => D <= "10010001"; -- 0x12BE
+ when 004799 => D <= "00010111"; -- 0x12BF
+ when 004800 => D <= "10010001"; -- 0x12C0
+ when 004801 => D <= "00101110"; -- 0x12C1
+ when 004802 => D <= "00110001"; -- 0x12C2
+ when 004803 => D <= "11110011"; -- 0x12C3
+ when 004804 => D <= "01010000"; -- 0x12C4
+ when 004805 => D <= "00011101"; -- 0x12C5
+ when 004806 => D <= "01010001"; -- 0x12C6
+ when 004807 => D <= "00111110"; -- 0x12C7
+ when 004808 => D <= "00100100"; -- 0x12C8
+ when 004809 => D <= "10000101"; -- 0x12C9
+ when 004810 => D <= "01010000"; -- 0x12CA
+ when 004811 => D <= "00001110"; -- 0x12CB
+ when 004812 => D <= "10010001"; -- 0x12CC
+ when 004813 => D <= "00011011"; -- 0x12CD
+ when 004814 => D <= "01110100"; -- 0x12CE
+ when 004815 => D <= "00000001"; -- 0x12CF
+ when 004816 => D <= "00100101"; -- 0x12D0
+ when 004817 => D <= "01000110"; -- 0x12D1
+ when 004818 => D <= "01000000"; -- 0x12D2
+ when 004819 => D <= "10100001"; -- 0x12D3
+ when 004820 => D <= "11110101"; -- 0x12D4
+ when 004821 => D <= "01000110"; -- 0x12D5
+ when 004822 => D <= "00110001"; -- 0x12D6
+ when 004823 => D <= "10011011"; -- 0x12D7
+ when 004824 => D <= "10000000"; -- 0x12D8
+ when 004825 => D <= "11100100"; -- 0x12D9
+ when 004826 => D <= "10010000"; -- 0x12DA
+ when 004827 => D <= "00010111"; -- 0x12DB
+ when 004828 => D <= "11100110"; -- 0x12DC
+ when 004829 => D <= "10010001"; -- 0x12DD
+ when 004830 => D <= "00011110"; -- 0x12DE
+ when 004831 => D <= "01110100"; -- 0x12DF
+ when 004832 => D <= "00001011"; -- 0x12E0
+ when 004833 => D <= "10000000"; -- 0x12E1
+ when 004834 => D <= "11101101"; -- 0x12E2
+ when 004835 => D <= "10010001"; -- 0x12E3
+ when 004836 => D <= "01010111"; -- 0x12E4
+ when 004837 => D <= "10010001"; -- 0x12E5
+ when 004838 => D <= "00101110"; -- 0x12E6
+ when 004839 => D <= "11110001"; -- 0x12E7
+ when 004840 => D <= "00010011"; -- 0x12E8
+ when 004841 => D <= "10010001"; -- 0x12E9
+ when 004842 => D <= "01000001"; -- 0x12EA
+ when 004843 => D <= "10010001"; -- 0x12EB
+ when 004844 => D <= "00101110"; -- 0x12EC
+ when 004845 => D <= "11110001"; -- 0x12ED
+ when 004846 => D <= "00111000"; -- 0x12EE
+ when 004847 => D <= "01110001"; -- 0x12EF
+ when 004848 => D <= "11110101"; -- 0x12F0
+ when 004849 => D <= "10010000"; -- 0x12F1
+ when 004850 => D <= "00010110"; -- 0x12F2
+ when 004851 => D <= "10100000"; -- 0x12F3
+ when 004852 => D <= "00110001"; -- 0x12F4
+ when 004853 => D <= "10000110"; -- 0x12F5
+ when 004854 => D <= "10100011"; -- 0x12F6
+ when 004855 => D <= "10010001"; -- 0x12F7
+ when 004856 => D <= "00011110"; -- 0x12F8
+ when 004857 => D <= "00110001"; -- 0x12F9
+ when 004858 => D <= "10011011"; -- 0x12FA
+ when 004859 => D <= "11100101"; -- 0x12FB
+ when 004860 => D <= "01000110"; -- 0x12FC
+ when 004861 => D <= "10010001"; -- 0x12FD
+ when 004862 => D <= "10011100"; -- 0x12FE
+ when 004863 => D <= "11110001"; -- 0x12FF
+ when 004864 => D <= "00010011"; -- 0x1300
+ when 004865 => D <= "00110001"; -- 0x1301
+ when 004866 => D <= "11000101"; -- 0x1302
+ when 004867 => D <= "00110000"; -- 0x1303
+ when 004868 => D <= "00101010"; -- 0x1304
+ when 004869 => D <= "01110100"; -- 0x1305
+ when 004870 => D <= "00100010"; -- 0x1306
+ when 004871 => D <= "10010001"; -- 0x1307
+ when 004872 => D <= "00111010"; -- 0x1308
+ when 004873 => D <= "10010001"; -- 0x1309
+ when 004874 => D <= "01000101"; -- 0x130A
+ when 004875 => D <= "10010001"; -- 0x130B
+ when 004876 => D <= "00010111"; -- 0x130C
+ when 004877 => D <= "10010001"; -- 0x130D
+ when 004878 => D <= "00110011"; -- 0x130E
+ when 004879 => D <= "00000010"; -- 0x130F
+ when 004880 => D <= "00011001"; -- 0x1310
+ when 004881 => D <= "10010111"; -- 0x1311
+ when 004882 => D <= "10010001"; -- 0x1312
+ when 004883 => D <= "00011011"; -- 0x1313
+ when 004884 => D <= "10010001"; -- 0x1314
+ when 004885 => D <= "01000101"; -- 0x1315
+ when 004886 => D <= "01010001"; -- 0x1316
+ when 004887 => D <= "01001100"; -- 0x1317
+ when 004888 => D <= "10010000"; -- 0x1318
+ when 004889 => D <= "00000001"; -- 0x1319
+ when 004890 => D <= "00011111"; -- 0x131A
+ when 004891 => D <= "11100000"; -- 0x131B
+ when 004892 => D <= "01100000"; -- 0x131C
+ when 004893 => D <= "11101000"; -- 0x131D
+ when 004894 => D <= "10010001"; -- 0x131E
+ when 004895 => D <= "01000001"; -- 0x131F
+ when 004896 => D <= "10010001"; -- 0x1320
+ when 004897 => D <= "00111010"; -- 0x1321
+ when 004898 => D <= "01010001"; -- 0x1322
+ when 004899 => D <= "00111110"; -- 0x1323
+ when 004900 => D <= "01100000"; -- 0x1324
+ when 004901 => D <= "00000010"; -- 0x1325
+ when 004902 => D <= "01010001"; -- 0x1326
+ when 004903 => D <= "10101011"; -- 0x1327
+ when 004904 => D <= "00110001"; -- 0x1328
+ when 004905 => D <= "10011011"; -- 0x1329
+ when 004906 => D <= "10010001"; -- 0x132A
+ when 004907 => D <= "00011011"; -- 0x132B
+ when 004908 => D <= "10010001"; -- 0x132C
+ when 004909 => D <= "01000101"; -- 0x132D
+ when 004910 => D <= "01010001"; -- 0x132E
+ when 004911 => D <= "01001100"; -- 0x132F
+ when 004912 => D <= "01110101"; -- 0x1330
+ when 004913 => D <= "01000110"; -- 0x1331
+ when 004914 => D <= "00000000"; -- 0x1332
+ when 004915 => D <= "10010001"; -- 0x1333
+ when 004916 => D <= "00101110"; -- 0x1334
+ when 004917 => D <= "10010001"; -- 0x1335
+ when 004918 => D <= "00010111"; -- 0x1336
+ when 004919 => D <= "10010001"; -- 0x1337
+ when 004920 => D <= "00110011"; -- 0x1338
+ when 004921 => D <= "10010001"; -- 0x1339
+ when 004922 => D <= "01000001"; -- 0x133A
+ when 004923 => D <= "00110001"; -- 0x133B
+ when 004924 => D <= "10011011"; -- 0x133C
+ when 004925 => D <= "00000101"; -- 0x133D
+ when 004926 => D <= "01000110"; -- 0x133E
+ when 004927 => D <= "11100101"; -- 0x133F
+ when 004928 => D <= "01000110"; -- 0x1340
+ when 004929 => D <= "10010001"; -- 0x1341
+ when 004930 => D <= "10011100"; -- 0x1342
+ when 004931 => D <= "01110001"; -- 0x1343
+ when 004932 => D <= "11110101"; -- 0x1344
+ when 004933 => D <= "10010001"; -- 0x1345
+ when 004934 => D <= "00010111"; -- 0x1346
+ when 004935 => D <= "10010001"; -- 0x1347
+ when 004936 => D <= "00111010"; -- 0x1348
+ when 004937 => D <= "11110001"; -- 0x1349
+ when 004938 => D <= "00111000"; -- 0x134A
+ when 004939 => D <= "01110001"; -- 0x134B
+ when 004940 => D <= "00000111"; -- 0x134C
+ when 004941 => D <= "00110000"; -- 0x134D
+ when 004942 => D <= "11010101"; -- 0x134E
+ when 004943 => D <= "11101001"; -- 0x134F
+ when 004944 => D <= "01010001"; -- 0x1350
+ when 004945 => D <= "00111010"; -- 0x1351
+ when 004946 => D <= "10010001"; -- 0x1352
+ when 004947 => D <= "00111010"; -- 0x1353
+ when 004948 => D <= "00110001"; -- 0x1354
+ when 004949 => D <= "10011011"; -- 0x1355
+ when 004950 => D <= "00100001"; -- 0x1356
+ when 004951 => D <= "10011011"; -- 0x1357
+ when 004952 => D <= "01010001"; -- 0x1358
+ when 004953 => D <= "00111110"; -- 0x1359
+ when 004954 => D <= "10010100"; -- 0x135A
+ when 004955 => D <= "10000001"; -- 0x135B
+ when 004956 => D <= "01010000"; -- 0x135C
+ when 004957 => D <= "00000111"; -- 0x135D
+ when 004958 => D <= "01010001"; -- 0x135E
+ when 004959 => D <= "00111010"; -- 0x135F
+ when 004960 => D <= "10010000"; -- 0x1360
+ when 004961 => D <= "00000100"; -- 0x1361
+ when 004962 => D <= "11100000"; -- 0x1362
+ when 004963 => D <= "10000001"; -- 0x1363
+ when 004964 => D <= "00011110"; -- 0x1364
+ when 004965 => D <= "10010100"; -- 0x1365
+ when 004966 => D <= "00000111"; -- 0x1366
+ when 004967 => D <= "01010000"; -- 0x1367
+ when 004968 => D <= "00010000"; -- 0x1368
+ when 004969 => D <= "11110100"; -- 0x1369
+ when 004970 => D <= "00000100"; -- 0x136A
+ when 004971 => D <= "11111011"; -- 0x136B
+ when 004972 => D <= "00011000"; -- 0x136C
+ when 004973 => D <= "00011000"; -- 0x136D
+ when 004974 => D <= "11100010"; -- 0x136E
+ when 004975 => D <= "01010100"; -- 0x136F
+ when 004976 => D <= "11110000"; -- 0x1370
+ when 004977 => D <= "11110010"; -- 0x1371
+ when 004978 => D <= "11011011"; -- 0x1372
+ when 004979 => D <= "00000001"; -- 0x1373
+ when 004980 => D <= "00100010"; -- 0x1374
+ when 004981 => D <= "11100100"; -- 0x1375
+ when 004982 => D <= "11110010"; -- 0x1376
+ when 004983 => D <= "11011011"; -- 0x1377
+ when 004984 => D <= "11110100"; -- 0x1378
+ when 004985 => D <= "00100010"; -- 0x1379
+ when 004986 => D <= "01110001"; -- 0x137A
+ when 004987 => D <= "10001100"; -- 0x137B
+ when 004988 => D <= "01110000"; -- 0x137C
+ when 004989 => D <= "00011001"; -- 0x137D
+ when 004990 => D <= "11110010"; -- 0x137E
+ when 004991 => D <= "00100010"; -- 0x137F
+ when 004992 => D <= "01010001"; -- 0x1380
+ when 004993 => D <= "00111010"; -- 0x1381
+ when 004994 => D <= "01100000"; -- 0x1382
+ when 004995 => D <= "11011100"; -- 0x1383
+ when 004996 => D <= "00011000"; -- 0x1384
+ when 004997 => D <= "11100010"; -- 0x1385
+ when 004998 => D <= "11111111"; -- 0x1386
+ when 004999 => D <= "10010001"; -- 0x1387
+ when 005000 => D <= "00101110"; -- 0x1388
+ when 005001 => D <= "11101111"; -- 0x1389
+ when 005002 => D <= "01100000"; -- 0x138A
+ when 005003 => D <= "00001011"; -- 0x138B
+ when 005004 => D <= "01010001"; -- 0x138C
+ when 005005 => D <= "00111110"; -- 0x138D
+ when 005006 => D <= "00011000"; -- 0x138E
+ when 005007 => D <= "01100000"; -- 0x138F
+ when 005008 => D <= "00000110"; -- 0x1390
+ when 005009 => D <= "11100010"; -- 0x1391
+ when 005010 => D <= "01100100"; -- 0x1392
+ when 005011 => D <= "00000001"; -- 0x1393
+ when 005012 => D <= "11110010"; -- 0x1394
+ when 005013 => D <= "01100100"; -- 0x1395
+ when 005014 => D <= "00000001"; -- 0x1396
+ when 005015 => D <= "00100010"; -- 0x1397
+ when 005016 => D <= "01010001"; -- 0x1398
+ when 005017 => D <= "00001110"; -- 0x1399
+ when 005018 => D <= "00010010"; -- 0x139A
+ when 005019 => D <= "00000101"; -- 0x139B
+ when 005020 => D <= "01110011"; -- 0x139C
+ when 005021 => D <= "11100100"; -- 0x139D
+ when 005022 => D <= "10010011"; -- 0x139E
+ when 005023 => D <= "10000001"; -- 0x139F
+ when 005024 => D <= "10011100"; -- 0x13A0
+ when 005025 => D <= "01010001"; -- 0x13A1
+ when 005026 => D <= "00001110"; -- 0x13A2
+ when 005027 => D <= "00010010"; -- 0x13A3
+ when 005028 => D <= "00001001"; -- 0x13A4
+ when 005029 => D <= "11011000"; -- 0x13A5
+ when 005030 => D <= "11100111"; -- 0x13A6
+ when 005031 => D <= "10000001"; -- 0x13A7
+ when 005032 => D <= "10011100"; -- 0x13A8
+ when 005033 => D <= "01010001"; -- 0x13A9
+ when 005034 => D <= "00001110"; -- 0x13AA
+ when 005035 => D <= "10001011"; -- 0x13AB
+ when 005036 => D <= "10100000"; -- 0x13AC
+ when 005037 => D <= "11100011"; -- 0x13AD
+ when 005038 => D <= "10000001"; -- 0x13AE
+ when 005039 => D <= "10011100"; -- 0x13AF
+ when 005040 => D <= "00110001"; -- 0x13B0
+ when 005041 => D <= "11110011"; -- 0x13B1
+ when 005042 => D <= "01110010"; -- 0x13B2
+ when 005043 => D <= "11010101"; -- 0x13B3
+ when 005044 => D <= "01000000"; -- 0x13B4
+ when 005045 => D <= "10101010"; -- 0x13B5
+ when 005046 => D <= "10010000"; -- 0x13B6
+ when 005047 => D <= "00010011"; -- 0x13B7
+ when 005048 => D <= "10111011"; -- 0x13B8
+ when 005049 => D <= "10000001"; -- 0x13B9
+ when 005050 => D <= "00011110"; -- 0x13BA
+ when 005051 => D <= "10000101"; -- 0x13BB
+ when 005052 => D <= "00000000"; -- 0x13BC
+ when 005053 => D <= "00000000"; -- 0x13BD
+ when 005054 => D <= "01010000"; -- 0x13BE
+ when 005055 => D <= "01010011"; -- 0x13BF
+ when 005056 => D <= "01100101"; -- 0x13C0
+ when 005057 => D <= "00110001"; -- 0x13C1
+ when 005058 => D <= "11110011"; -- 0x13C2
+ when 005059 => D <= "10110011"; -- 0x13C3
+ when 005060 => D <= "10000000"; -- 0x13C4
+ when 005061 => D <= "11101110"; -- 0x13C5
+ when 005062 => D <= "00110001"; -- 0x13C6
+ when 005063 => D <= "11110011"; -- 0x13C7
+ when 005064 => D <= "10100010"; -- 0x13C8
+ when 005065 => D <= "11010101"; -- 0x13C9
+ when 005066 => D <= "10000000"; -- 0x13CA
+ when 005067 => D <= "11110111"; -- 0x13CB
+ when 005068 => D <= "00110001"; -- 0x13CC
+ when 005069 => D <= "11110011"; -- 0x13CD
+ when 005070 => D <= "10110010"; -- 0x13CE
+ when 005071 => D <= "11010101"; -- 0x13CF
+ when 005072 => D <= "10000000"; -- 0x13D0
+ when 005073 => D <= "11110110"; -- 0x13D1
+ when 005074 => D <= "00110001"; -- 0x13D2
+ when 005075 => D <= "11110011"; -- 0x13D3
+ when 005076 => D <= "10000000"; -- 0x13D4
+ when 005077 => D <= "11011110"; -- 0x13D5
+ when 005078 => D <= "00110001"; -- 0x13D6
+ when 005079 => D <= "11110011"; -- 0x13D7
+ when 005080 => D <= "01110010"; -- 0x13D8
+ when 005081 => D <= "11010101"; -- 0x13D9
+ when 005082 => D <= "10000000"; -- 0x13DA
+ when 005083 => D <= "11100111"; -- 0x13DB
+ when 005084 => D <= "10010000"; -- 0x13DC
+ when 005085 => D <= "00000001"; -- 0x13DD
+ when 005086 => D <= "00001100"; -- 0x13DE
+ when 005087 => D <= "00010010"; -- 0x13DF
+ when 005088 => D <= "00000101"; -- 0x13E0
+ when 005089 => D <= "10110100"; -- 0x13E1
+ when 005090 => D <= "11101001"; -- 0x13E2
+ when 005091 => D <= "11000011"; -- 0x13E3
+ when 005092 => D <= "00010011"; -- 0x13E4
+ when 005093 => D <= "11111000"; -- 0x13E5
+ when 005094 => D <= "01110100"; -- 0x13E6
+ when 005095 => D <= "00000110"; -- 0x13E7
+ when 005096 => D <= "00010011"; -- 0x13E8
+ when 005097 => D <= "00101001"; -- 0x13E9
+ when 005098 => D <= "11001000"; -- 0x13EA
+ when 005099 => D <= "00111011"; -- 0x13EB
+ when 005100 => D <= "11111010"; -- 0x13EC
+ when 005101 => D <= "00010101"; -- 0x13ED
+ when 005102 => D <= "10000010"; -- 0x13EE
+ when 005103 => D <= "10010001"; -- 0x13EF
+ when 005104 => D <= "00001111"; -- 0x13F0
+ when 005105 => D <= "10010001"; -- 0x13F1
+ when 005106 => D <= "10011111"; -- 0x13F2
+ when 005107 => D <= "01110001"; -- 0x13F3
+ when 005108 => D <= "10110110"; -- 0x13F4
+ when 005109 => D <= "00010010"; -- 0x13F5
+ when 005110 => D <= "00011001"; -- 0x13F6
+ when 005111 => D <= "10011011"; -- 0x13F7
+ when 005112 => D <= "00000001"; -- 0x13F8
+ when 005113 => D <= "00011101"; -- 0x13F9
+ when 005114 => D <= "00010010"; -- 0x13FA
+ when 005115 => D <= "00001111"; -- 0x13FB
+ when 005116 => D <= "00110011"; -- 0x13FC
+ when 005117 => D <= "11010010"; -- 0x13FD
+ when 005118 => D <= "00010011"; -- 0x13FE
+ when 005119 => D <= "10010000"; -- 0x13FF
+ when 005120 => D <= "00000001"; -- 0x1400
+ when 005121 => D <= "00000010"; -- 0x1401
+ when 005122 => D <= "10000000"; -- 0x1402
+ when 005123 => D <= "00001011"; -- 0x1403
+ when 005124 => D <= "00010010"; -- 0x1404
+ when 005125 => D <= "00001111"; -- 0x1405
+ when 005126 => D <= "00110011"; -- 0x1406
+ when 005127 => D <= "11010010"; -- 0x1407
+ when 005128 => D <= "00010010"; -- 0x1408
+ when 005129 => D <= "01000011"; -- 0x1409
+ when 005130 => D <= "10101000"; -- 0x140A
+ when 005131 => D <= "10000100"; -- 0x140B
+ when 005132 => D <= "10010000"; -- 0x140C
+ when 005133 => D <= "00000001"; -- 0x140D
+ when 005134 => D <= "00100000"; -- 0x140E
+ when 005135 => D <= "11101010"; -- 0x140F
+ when 005136 => D <= "11110000"; -- 0x1410
+ when 005137 => D <= "10100011"; -- 0x1411
+ when 005138 => D <= "11101000"; -- 0x1412
+ when 005139 => D <= "11110000"; -- 0x1413
+ when 005140 => D <= "00100010"; -- 0x1414
+ when 005141 => D <= "10010001"; -- 0x1415
+ when 005142 => D <= "00010111"; -- 0x1416
+ when 005143 => D <= "01010001"; -- 0x1417
+ when 005144 => D <= "00111110"; -- 0x1418
+ when 005145 => D <= "10000000"; -- 0x1419
+ when 005146 => D <= "00100011"; -- 0x141A
+ when 005147 => D <= "10010000"; -- 0x141B
+ when 005148 => D <= "00010111"; -- 0x141C
+ when 005149 => D <= "11101100"; -- 0x141D
+ when 005150 => D <= "00110001"; -- 0x141E
+ when 005151 => D <= "11110110"; -- 0x141F
+ when 005152 => D <= "10001011"; -- 0x1420
+ when 005153 => D <= "10100000"; -- 0x1421
+ when 005154 => D <= "01111011"; -- 0x1422
+ when 005155 => D <= "00000110"; -- 0x1423
+ when 005156 => D <= "11100100"; -- 0x1424
+ when 005157 => D <= "10010011"; -- 0x1425
+ when 005158 => D <= "11110011"; -- 0x1426
+ when 005159 => D <= "10100011"; -- 0x1427
+ when 005160 => D <= "00011001"; -- 0x1428
+ when 005161 => D <= "11011011"; -- 0x1429
+ when 005162 => D <= "11111001"; -- 0x142A
+ when 005163 => D <= "11010010"; -- 0x142B
+ when 005164 => D <= "00100100"; -- 0x142C
+ when 005165 => D <= "00100010"; -- 0x142D
+ when 005166 => D <= "10010000"; -- 0x142E
+ when 005167 => D <= "00010110"; -- 0x142F
+ when 005168 => D <= "11101001"; -- 0x1430
+ when 005169 => D <= "10000001"; -- 0x1431
+ when 005170 => D <= "00011110"; -- 0x1432
+ when 005171 => D <= "01111011"; -- 0x1433
+ when 005172 => D <= "00000001"; -- 0x1434
+ when 005173 => D <= "01111001"; -- 0x1435
+ when 005174 => D <= "00011001"; -- 0x1436
+ when 005175 => D <= "00000010"; -- 0x1437
+ when 005176 => D <= "00001111"; -- 0x1438
+ when 005177 => D <= "11010110"; -- 0x1439
+ when 005178 => D <= "01111000"; -- 0x143A
+ when 005179 => D <= "00011001"; -- 0x143B
+ when 005180 => D <= "01111010"; -- 0x143C
+ when 005181 => D <= "00000001"; -- 0x143D
+ when 005182 => D <= "00000010"; -- 0x143E
+ when 005183 => D <= "00001111"; -- 0x143F
+ when 005184 => D <= "11100000"; -- 0x1440
+ when 005185 => D <= "01111000"; -- 0x1441
+ when 005186 => D <= "00011111"; -- 0x1442
+ when 005187 => D <= "10000000"; -- 0x1443
+ when 005188 => D <= "11110111"; -- 0x1444
+ when 005189 => D <= "01010001"; -- 0x1445
+ when 005190 => D <= "00111110"; -- 0x1446
+ when 005191 => D <= "01110100"; -- 0x1447
+ when 005192 => D <= "00000110"; -- 0x1448
+ when 005193 => D <= "11111010"; -- 0x1449
+ when 005194 => D <= "00101000"; -- 0x144A
+ when 005195 => D <= "11111001"; -- 0x144B
+ when 005196 => D <= "11100010"; -- 0x144C
+ when 005197 => D <= "11111011"; -- 0x144D
+ when 005198 => D <= "11100011"; -- 0x144E
+ when 005199 => D <= "11110010"; -- 0x144F
+ when 005200 => D <= "11101011"; -- 0x1450
+ when 005201 => D <= "11110011"; -- 0x1451
+ when 005202 => D <= "00011001"; -- 0x1452
+ when 005203 => D <= "00011000"; -- 0x1453
+ when 005204 => D <= "11011010"; -- 0x1454
+ when 005205 => D <= "11110110"; -- 0x1455
+ when 005206 => D <= "00100010"; -- 0x1456
+ when 005207 => D <= "01010001"; -- 0x1457
+ when 005208 => D <= "00111110"; -- 0x1458
+ when 005209 => D <= "01111011"; -- 0x1459
+ when 005210 => D <= "00000001"; -- 0x145A
+ when 005211 => D <= "01111001"; -- 0x145B
+ when 005212 => D <= "00011111"; -- 0x145C
+ when 005213 => D <= "01111100"; -- 0x145D
+ when 005214 => D <= "00000110"; -- 0x145E
+ when 005215 => D <= "10001010"; -- 0x145F
+ when 005216 => D <= "10100000"; -- 0x1460
+ when 005217 => D <= "11100010"; -- 0x1461
+ when 005218 => D <= "10001011"; -- 0x1462
+ when 005219 => D <= "10100000"; -- 0x1463
+ when 005220 => D <= "11110011"; -- 0x1464
+ when 005221 => D <= "10110001"; -- 0x1465
+ when 005222 => D <= "01110110"; -- 0x1466
+ when 005223 => D <= "11011100"; -- 0x1467
+ when 005224 => D <= "11110110"; -- 0x1468
+ when 005225 => D <= "00100010"; -- 0x1469
+ when 005226 => D <= "10010000"; -- 0x146A
+ when 005227 => D <= "00010111"; -- 0x146B
+ when 005228 => D <= "11111000"; -- 0x146C
+ when 005229 => D <= "10000001"; -- 0x146D
+ when 005230 => D <= "00011110"; -- 0x146E
+ when 005231 => D <= "10010001"; -- 0x146F
+ when 005232 => D <= "10001100"; -- 0x1470
+ when 005233 => D <= "11101011"; -- 0x1471
+ when 005234 => D <= "01011111"; -- 0x1472
+ when 005235 => D <= "11111010"; -- 0x1473
+ when 005236 => D <= "11101001"; -- 0x1474
+ when 005237 => D <= "01011110"; -- 0x1475
+ when 005238 => D <= "10000000"; -- 0x1476
+ when 005239 => D <= "00100110"; -- 0x1477
+ when 005240 => D <= "10010001"; -- 0x1478
+ when 005241 => D <= "10001100"; -- 0x1479
+ when 005242 => D <= "11101011"; -- 0x147A
+ when 005243 => D <= "01001111"; -- 0x147B
+ when 005244 => D <= "11111010"; -- 0x147C
+ when 005245 => D <= "11101001"; -- 0x147D
+ when 005246 => D <= "01001110"; -- 0x147E
+ when 005247 => D <= "10000000"; -- 0x147F
+ when 005248 => D <= "00011101"; -- 0x1480
+ when 005249 => D <= "01110001"; -- 0x1481
+ when 005250 => D <= "10110110"; -- 0x1482
+ when 005251 => D <= "10010001"; -- 0x1483
+ when 005252 => D <= "10001100"; -- 0x1484
+ when 005253 => D <= "11101011"; -- 0x1485
+ when 005254 => D <= "01101111"; -- 0x1486
+ when 005255 => D <= "11111010"; -- 0x1487
+ when 005256 => D <= "11101001"; -- 0x1488
+ when 005257 => D <= "01101110"; -- 0x1489
+ when 005258 => D <= "10000000"; -- 0x148A
+ when 005259 => D <= "00010010"; -- 0x148B
+ when 005260 => D <= "01010001"; -- 0x148C
+ when 005261 => D <= "00001110"; -- 0x148D
+ when 005262 => D <= "10101111"; -- 0x148E
+ when 005263 => D <= "00000011"; -- 0x148F
+ when 005264 => D <= "10101110"; -- 0x1490
+ when 005265 => D <= "00000001"; -- 0x1491
+ when 005266 => D <= "01000001"; -- 0x1492
+ when 005267 => D <= "00001110"; -- 0x1493
+ when 005268 => D <= "10010000"; -- 0x1494
+ when 005269 => D <= "00000001"; -- 0x1495
+ when 005270 => D <= "00000000"; -- 0x1496
+ when 005271 => D <= "11100000"; -- 0x1497
+ when 005272 => D <= "00010000"; -- 0x1498
+ when 005273 => D <= "00011000"; -- 0x1499
+ when 005274 => D <= "00000001"; -- 0x149A
+ when 005275 => D <= "11100100"; -- 0x149B
+ when 005276 => D <= "01111010"; -- 0x149C
+ when 005277 => D <= "00000000"; -- 0x149D
+ when 005278 => D <= "11111000"; -- 0x149E
+ when 005279 => D <= "11010010"; -- 0x149F
+ when 005280 => D <= "00100100"; -- 0x14A0
+ when 005281 => D <= "00000010"; -- 0x14A1
+ when 005282 => D <= "00011001"; -- 0x14A2
+ when 005283 => D <= "10101011"; -- 0x14A3
+ when 005284 => D <= "11100101"; -- 0x14A4
+ when 005285 => D <= "10101000"; -- 0x14A5
+ when 005286 => D <= "10000000"; -- 0x14A6
+ when 005287 => D <= "11110100"; -- 0x14A7
+ when 005288 => D <= "11100101"; -- 0x14A8
+ when 005289 => D <= "10111000"; -- 0x14A9
+ when 005290 => D <= "10000000"; -- 0x14AA
+ when 005291 => D <= "11110000"; -- 0x14AB
+ when 005292 => D <= "10101010"; -- 0x14AC
+ when 005293 => D <= "10001100"; -- 0x14AD
+ when 005294 => D <= "10101000"; -- 0x14AE
+ when 005295 => D <= "10001010"; -- 0x14AF
+ when 005296 => D <= "10000000"; -- 0x14B0
+ when 005297 => D <= "11101101"; -- 0x14B1
+ when 005298 => D <= "10101010"; -- 0x14B2
+ when 005299 => D <= "10001101"; -- 0x14B3
+ when 005300 => D <= "10101000"; -- 0x14B4
+ when 005301 => D <= "10001011"; -- 0x14B5
+ when 005302 => D <= "10000000"; -- 0x14B6
+ when 005303 => D <= "11100111"; -- 0x14B7
+ when 005304 => D <= "10101010"; -- 0x14B8
+ when 005305 => D <= "11001101"; -- 0x14B9
+ when 005306 => D <= "10101000"; -- 0x14BA
+ when 005307 => D <= "11001100"; -- 0x14BB
+ when 005308 => D <= "10000000"; -- 0x14BC
+ when 005309 => D <= "11100001"; -- 0x14BD
+ when 005310 => D <= "11100101"; -- 0x14BE
+ when 005311 => D <= "11001000"; -- 0x14BF
+ when 005312 => D <= "10000000"; -- 0x14C0
+ when 005313 => D <= "11011010"; -- 0x14C1
+ when 005314 => D <= "11100101"; -- 0x14C2
+ when 005315 => D <= "10001000"; -- 0x14C3
+ when 005316 => D <= "10000000"; -- 0x14C4
+ when 005317 => D <= "11010110"; -- 0x14C5
+ when 005318 => D <= "11100101"; -- 0x14C6
+ when 005319 => D <= "10001001"; -- 0x14C7
+ when 005320 => D <= "10000000"; -- 0x14C8
+ when 005321 => D <= "11010010"; -- 0x14C9
+ when 005322 => D <= "10101010"; -- 0x14CA
+ when 005323 => D <= "11001011"; -- 0x14CB
+ when 005324 => D <= "10101000"; -- 0x14CC
+ when 005325 => D <= "11001010"; -- 0x14CD
+ when 005326 => D <= "10000000"; -- 0x14CE
+ when 005327 => D <= "11001111"; -- 0x14CF
+ when 005328 => D <= "11100101"; -- 0x14D0
+ when 005329 => D <= "10010000"; -- 0x14D1
+ when 005330 => D <= "10000000"; -- 0x14D2
+ when 005331 => D <= "11001000"; -- 0x14D3
+ when 005332 => D <= "11100101"; -- 0x14D4
+ when 005333 => D <= "10000111"; -- 0x14D5
+ when 005334 => D <= "10000000"; -- 0x14D6
+ when 005335 => D <= "11000100"; -- 0x14D7
+ when 005336 => D <= "00000010"; -- 0x14D8
+ when 005337 => D <= "00000101"; -- 0x14D9
+ when 005338 => D <= "01101000"; -- 0x14DA
+ when 005339 => D <= "11100101"; -- 0x14DB
+ when 005340 => D <= "00010011"; -- 0x14DC
+ when 005341 => D <= "10110100"; -- 0x14DD
+ when 005342 => D <= "00000010"; -- 0x14DE
+ when 005343 => D <= "11111000"; -- 0x14DF
+ when 005344 => D <= "00010010"; -- 0x14E0
+ when 005345 => D <= "00000101"; -- 0x14E1
+ when 005346 => D <= "10100011"; -- 0x14E2
+ when 005347 => D <= "10101100"; -- 0x14E3
+ when 005348 => D <= "10000010"; -- 0x14E4
+ when 005349 => D <= "10101101"; -- 0x14E5
+ when 005350 => D <= "10000011"; -- 0x14E6
+ when 005351 => D <= "10101011"; -- 0x14E7
+ when 005352 => D <= "00001111"; -- 0x14E8
+ when 005353 => D <= "10101001"; -- 0x14E9
+ when 005354 => D <= "00001110"; -- 0x14EA
+ when 005355 => D <= "00010010"; -- 0x14EB
+ when 005356 => D <= "00000101"; -- 0x14EC
+ when 005357 => D <= "10000110"; -- 0x14ED
+ when 005358 => D <= "01110000"; -- 0x14EE
+ when 005359 => D <= "00010010"; -- 0x14EF
+ when 005360 => D <= "11100101"; -- 0x14F0
+ when 005361 => D <= "00001101"; -- 0x14F1
+ when 005362 => D <= "10110100"; -- 0x14F2
+ when 005363 => D <= "00000100"; -- 0x14F3
+ when 005364 => D <= "00000001"; -- 0x14F4
+ when 005365 => D <= "00100010"; -- 0x14F5
+ when 005366 => D <= "10110001"; -- 0x14F6
+ when 005367 => D <= "10010011"; -- 0x14F7
+ when 005368 => D <= "10101010"; -- 0x14F8
+ when 005369 => D <= "00000101"; -- 0x14F9
+ when 005370 => D <= "10101000"; -- 0x14FA
+ when 005371 => D <= "00000100"; -- 0x14FB
+ when 005372 => D <= "10110001"; -- 0x14FC
+ when 005373 => D <= "01010001"; -- 0x14FD
+ when 005374 => D <= "01110100"; -- 0x14FE
+ when 005375 => D <= "00000001"; -- 0x14FF
+ when 005376 => D <= "10100001"; -- 0x1500
+ when 005377 => D <= "10000100"; -- 0x1501
+ when 005378 => D <= "11111111"; -- 0x1502
+ when 005379 => D <= "00010010"; -- 0x1503
+ when 005380 => D <= "00011000"; -- 0x1504
+ when 005381 => D <= "01001110"; -- 0x1505
+ when 005382 => D <= "11100101"; -- 0x1506
+ when 005383 => D <= "00001101"; -- 0x1507
+ when 005384 => D <= "01000000"; -- 0x1508
+ when 005385 => D <= "00001001"; -- 0x1509
+ when 005386 => D <= "10110100"; -- 0x150A
+ when 005387 => D <= "00000100"; -- 0x150B
+ when 005388 => D <= "00000001"; -- 0x150C
+ when 005389 => D <= "11100100"; -- 0x150D
+ when 005390 => D <= "10011111"; -- 0x150E
+ when 005391 => D <= "01100000"; -- 0x150F
+ when 005392 => D <= "00110110"; -- 0x1510
+ when 005393 => D <= "01000000"; -- 0x1511
+ when 005394 => D <= "00011111"; -- 0x1512
+ when 005395 => D <= "11111111"; -- 0x1513
+ when 005396 => D <= "11100101"; -- 0x1514
+ when 005397 => D <= "00001101"; -- 0x1515
+ when 005398 => D <= "10110100"; -- 0x1516
+ when 005399 => D <= "00000100"; -- 0x1517
+ when 005400 => D <= "00000001"; -- 0x1518
+ when 005401 => D <= "00100010"; -- 0x1519
+ when 005402 => D <= "11101111"; -- 0x151A
+ when 005403 => D <= "10110001"; -- 0x151B
+ when 005404 => D <= "10010011"; -- 0x151C
+ when 005405 => D <= "00010010"; -- 0x151D
+ when 005406 => D <= "00011000"; -- 0x151E
+ when 005407 => D <= "01000111"; -- 0x151F
+ when 005408 => D <= "10110001"; -- 0x1520
+ when 005409 => D <= "10001000"; -- 0x1521
+ when 005410 => D <= "00010010"; -- 0x1522
+ when 005411 => D <= "00001101"; -- 0x1523
+ when 005412 => D <= "10110000"; -- 0x1524
+ when 005413 => D <= "10101001"; -- 0x1525
+ when 005414 => D <= "00000100"; -- 0x1526
+ when 005415 => D <= "10101011"; -- 0x1527
+ when 005416 => D <= "00000101"; -- 0x1528
+ when 005417 => D <= "00001110"; -- 0x1529
+ when 005418 => D <= "10111110"; -- 0x152A
+ when 005419 => D <= "00000000"; -- 0x152B
+ when 005420 => D <= "00000001"; -- 0x152C
+ when 005421 => D <= "00001111"; -- 0x152D
+ when 005422 => D <= "10110001"; -- 0x152E
+ when 005423 => D <= "01101100"; -- 0x152F
+ when 005424 => D <= "10000000"; -- 0x1530
+ when 005425 => D <= "00010101"; -- 0x1531
+ when 005426 => D <= "11110100"; -- 0x1532
+ when 005427 => D <= "00000100"; -- 0x1533
+ when 005428 => D <= "00010010"; -- 0x1534
+ when 005429 => D <= "00000101"; -- 0x1535
+ when 005430 => D <= "11011000"; -- 0x1536
+ when 005431 => D <= "10110001"; -- 0x1537
+ when 005432 => D <= "10001000"; -- 0x1538
+ when 005433 => D <= "10101001"; -- 0x1539
+ when 005434 => D <= "10000010"; -- 0x153A
+ when 005435 => D <= "10101011"; -- 0x153B
+ when 005436 => D <= "10000011"; -- 0x153C
+ when 005437 => D <= "10101010"; -- 0x153D
+ when 005438 => D <= "00001111"; -- 0x153E
+ when 005439 => D <= "10101000"; -- 0x153F
+ when 005440 => D <= "00001110"; -- 0x1540
+ when 005441 => D <= "01100000"; -- 0x1541
+ when 005442 => D <= "00000010"; -- 0x1542
+ when 005443 => D <= "10110001"; -- 0x1543
+ when 005444 => D <= "01011000"; -- 0x1544
+ when 005445 => D <= "10010001"; -- 0x1545
+ when 005446 => D <= "11111110"; -- 0x1546
+ when 005447 => D <= "10101010"; -- 0x1547
+ when 005448 => D <= "00001111"; -- 0x1548
+ when 005449 => D <= "10101000"; -- 0x1549
+ when 005450 => D <= "00001110"; -- 0x154A
+ when 005451 => D <= "11100101"; -- 0x154B
+ when 005452 => D <= "00001101"; -- 0x154C
+ when 005453 => D <= "10110100"; -- 0x154D
+ when 005454 => D <= "00000100"; -- 0x154E
+ when 005455 => D <= "00000001"; -- 0x154F
+ when 005456 => D <= "00100010"; -- 0x1550
+ when 005457 => D <= "11100100"; -- 0x1551
+ when 005458 => D <= "01111001"; -- 0x1552
+ when 005459 => D <= "00000100"; -- 0x1553
+ when 005460 => D <= "11111011"; -- 0x1554
+ when 005461 => D <= "10101110"; -- 0x1555
+ when 005462 => D <= "00001101"; -- 0x1556
+ when 005463 => D <= "11111111"; -- 0x1557
+ when 005464 => D <= "10110001"; -- 0x1558
+ when 005465 => D <= "10000001"; -- 0x1559
+ when 005466 => D <= "10110001"; -- 0x155A
+ when 005467 => D <= "01100001"; -- 0x155B
+ when 005468 => D <= "11010001"; -- 0x155C
+ when 005469 => D <= "00110010"; -- 0x155D
+ when 005470 => D <= "01110000"; -- 0x155E
+ when 005471 => D <= "11111000"; -- 0x155F
+ when 005472 => D <= "00100010"; -- 0x1560
+ when 005473 => D <= "00001000"; -- 0x1561
+ when 005474 => D <= "10111000"; -- 0x1562
+ when 005475 => D <= "00000000"; -- 0x1563
+ when 005476 => D <= "00000001"; -- 0x1564
+ when 005477 => D <= "00001010"; -- 0x1565
+ when 005478 => D <= "00001001"; -- 0x1566
+ when 005479 => D <= "10111001"; -- 0x1567
+ when 005480 => D <= "00000000"; -- 0x1568
+ when 005481 => D <= "00000001"; -- 0x1569
+ when 005482 => D <= "00001011"; -- 0x156A
+ when 005483 => D <= "00100010"; -- 0x156B
+ when 005484 => D <= "10110001"; -- 0x156C
+ when 005485 => D <= "10000001"; -- 0x156D
+ when 005486 => D <= "10110001"; -- 0x156E
+ when 005487 => D <= "01110110"; -- 0x156F
+ when 005488 => D <= "11010001"; -- 0x1570
+ when 005489 => D <= "00110010"; -- 0x1571
+ when 005490 => D <= "01110000"; -- 0x1572
+ when 005491 => D <= "11111000"; -- 0x1573
+ when 005492 => D <= "00000000"; -- 0x1574
+ when 005493 => D <= "00100010"; -- 0x1575
+ when 005494 => D <= "00011000"; -- 0x1576
+ when 005495 => D <= "10111000"; -- 0x1577
+ when 005496 => D <= "11111111"; -- 0x1578
+ when 005497 => D <= "00000001"; -- 0x1579
+ when 005498 => D <= "00011010"; -- 0x157A
+ when 005499 => D <= "00011001"; -- 0x157B
+ when 005500 => D <= "10111001"; -- 0x157C
+ when 005501 => D <= "11111111"; -- 0x157D
+ when 005502 => D <= "11110101"; -- 0x157E
+ when 005503 => D <= "00011011"; -- 0x157F
+ when 005504 => D <= "00100010"; -- 0x1580
+ when 005505 => D <= "10001011"; -- 0x1581
+ when 005506 => D <= "10100000"; -- 0x1582
+ when 005507 => D <= "11100011"; -- 0x1583
+ when 005508 => D <= "10001010"; -- 0x1584
+ when 005509 => D <= "10100000"; -- 0x1585
+ when 005510 => D <= "11110010"; -- 0x1586
+ when 005511 => D <= "00100010"; -- 0x1587
+ when 005512 => D <= "11101100"; -- 0x1588
+ when 005513 => D <= "11000011"; -- 0x1589
+ when 005514 => D <= "10010101"; -- 0x158A
+ when 005515 => D <= "10000010"; -- 0x158B
+ when 005516 => D <= "11111110"; -- 0x158C
+ when 005517 => D <= "11101101"; -- 0x158D
+ when 005518 => D <= "10010101"; -- 0x158E
+ when 005519 => D <= "10000011"; -- 0x158F
+ when 005520 => D <= "11111111"; -- 0x1590
+ when 005521 => D <= "01001110"; -- 0x1591
+ when 005522 => D <= "00100010"; -- 0x1592
+ when 005523 => D <= "00101100"; -- 0x1593
+ when 005524 => D <= "11111001"; -- 0x1594
+ when 005525 => D <= "11100100"; -- 0x1595
+ when 005526 => D <= "00111101"; -- 0x1596
+ when 005527 => D <= "11111011"; -- 0x1597
+ when 005528 => D <= "10010000"; -- 0x1598
+ when 005529 => D <= "00000001"; -- 0x1599
+ when 005530 => D <= "00000100"; -- 0x159A
+ when 005531 => D <= "00010010"; -- 0x159B
+ when 005532 => D <= "00000101"; -- 0x159C
+ when 005533 => D <= "11000110"; -- 0x159D
+ when 005534 => D <= "01000000"; -- 0x159E
+ when 005535 => D <= "11110010"; -- 0x159F
+ when 005536 => D <= "10010000"; -- 0x15A0
+ when 005537 => D <= "00011000"; -- 0x15A1
+ when 005538 => D <= "00010000"; -- 0x15A2
+ when 005539 => D <= "00000001"; -- 0x15A3
+ when 005540 => D <= "00110000"; -- 0x15A4
+ when 005541 => D <= "11110001"; -- 0x15A5
+ when 005542 => D <= "01100011"; -- 0x15A6
+ when 005543 => D <= "00010010"; -- 0x15A7
+ when 005544 => D <= "00001111"; -- 0x15A8
+ when 005545 => D <= "00111000"; -- 0x15A9
+ when 005546 => D <= "00010010"; -- 0x15AA
+ when 005547 => D <= "00011000"; -- 0x15AB
+ when 005548 => D <= "01001110"; -- 0x15AC
+ when 005549 => D <= "10010010"; -- 0x15AD
+ when 005550 => D <= "11010101"; -- 0x15AE
+ when 005551 => D <= "10010000"; -- 0x15AF
+ when 005552 => D <= "00000000"; -- 0x15B0
+ when 005553 => D <= "00000101"; -- 0x15B1
+ when 005554 => D <= "10010001"; -- 0x15B2
+ when 005555 => D <= "00001111"; -- 0x15B3
+ when 005556 => D <= "10101000"; -- 0x15B4
+ when 005557 => D <= "00001000"; -- 0x15B5
+ when 005558 => D <= "01111001"; -- 0x15B6
+ when 005559 => D <= "00000111"; -- 0x15B7
+ when 005560 => D <= "11000010"; -- 0x15B8
+ when 005561 => D <= "00100100"; -- 0x15B9
+ when 005562 => D <= "10010000"; -- 0x15BA
+ when 005563 => D <= "00000001"; -- 0x15BB
+ when 005564 => D <= "01110011"; -- 0x15BC
+ when 005565 => D <= "10001000"; -- 0x15BD
+ when 005566 => D <= "00000101"; -- 0x15BE
+ when 005567 => D <= "11100100"; -- 0x15BF
+ when 005568 => D <= "10010011"; -- 0x15C0
+ when 005569 => D <= "11111111"; -- 0x15C1
+ when 005570 => D <= "11100010"; -- 0x15C2
+ when 005571 => D <= "11111011"; -- 0x15C3
+ when 005572 => D <= "10110100"; -- 0x15C4
+ when 005573 => D <= "01100001"; -- 0x15C5
+ when 005574 => D <= "00000000"; -- 0x15C6
+ when 005575 => D <= "01000000"; -- 0x15C7
+ when 005576 => D <= "00000111"; -- 0x15C8
+ when 005577 => D <= "10110100"; -- 0x15C9
+ when 005578 => D <= "01111011"; -- 0x15CA
+ when 005579 => D <= "00000000"; -- 0x15CB
+ when 005580 => D <= "01010000"; -- 0x15CC
+ when 005581 => D <= "00000010"; -- 0x15CD
+ when 005582 => D <= "11000010"; -- 0x15CE
+ when 005583 => D <= "11100101"; -- 0x15CF
+ when 005584 => D <= "11111010"; -- 0x15D0
+ when 005585 => D <= "11110010"; -- 0x15D1
+ when 005586 => D <= "10100011"; -- 0x15D2
+ when 005587 => D <= "11100100"; -- 0x15D3
+ when 005588 => D <= "10010011"; -- 0x15D4
+ when 005589 => D <= "10110101"; -- 0x15D5
+ when 005590 => D <= "00000010"; -- 0x15D6
+ when 005591 => D <= "00000011"; -- 0x15D7
+ when 005592 => D <= "00001000"; -- 0x15D8
+ when 005593 => D <= "10000000"; -- 0x15D9
+ when 005594 => D <= "11100111"; -- 0x15DA
+ when 005595 => D <= "00100000"; -- 0x15DB
+ when 005596 => D <= "11100111"; -- 0x15DC
+ when 005597 => D <= "00101111"; -- 0x15DD
+ when 005598 => D <= "01100000"; -- 0x15DE
+ when 005599 => D <= "00101101"; -- 0x15DF
+ when 005600 => D <= "10100011"; -- 0x15E0
+ when 005601 => D <= "11100100"; -- 0x15E1
+ when 005602 => D <= "10010011"; -- 0x15E2
+ when 005603 => D <= "00100000"; -- 0x15E3
+ when 005604 => D <= "11100111"; -- 0x15E4
+ when 005605 => D <= "00000011"; -- 0x15E5
+ when 005606 => D <= "01110000"; -- 0x15E6
+ when 005607 => D <= "11111000"; -- 0x15E7
+ when 005608 => D <= "10100011"; -- 0x15E8
+ when 005609 => D <= "10101000"; -- 0x15E9
+ when 005610 => D <= "00000101"; -- 0x15EA
+ when 005611 => D <= "10110100"; -- 0x15EB
+ when 005612 => D <= "11111111"; -- 0x15EC
+ when 005613 => D <= "11001111"; -- 0x15ED
+ when 005614 => D <= "10111010"; -- 0x15EE
+ when 005615 => D <= "00100000"; -- 0x15EF
+ when 005616 => D <= "00000011"; -- 0x15F0
+ when 005617 => D <= "00001000"; -- 0x15F1
+ when 005618 => D <= "10000000"; -- 0x15F2
+ when 005619 => D <= "11000100"; -- 0x15F3
+ when 005620 => D <= "00110000"; -- 0x15F4
+ when 005621 => D <= "00101101"; -- 0x15F5
+ when 005622 => D <= "00001010"; -- 0x15F6
+ when 005623 => D <= "00100000"; -- 0x15F7
+ when 005624 => D <= "00100100"; -- 0x15F8
+ when 005625 => D <= "00000111"; -- 0x15F9
+ when 005626 => D <= "11010010"; -- 0x15FA
+ when 005627 => D <= "00100100"; -- 0x15FB
+ when 005628 => D <= "00010010"; -- 0x15FC
+ when 005629 => D <= "00100000"; -- 0x15FD
+ when 005630 => D <= "01111000"; -- 0x15FE
+ when 005631 => D <= "10100001"; -- 0x15FF
+ when 005632 => D <= "10111101"; -- 0x1600
+ when 005633 => D <= "11010001"; -- 0x1601
+ when 005634 => D <= "00011010"; -- 0x1602
+ when 005635 => D <= "10110100"; -- 0x1603
+ when 005636 => D <= "00100010"; -- 0x1604
+ when 005637 => D <= "10110010"; -- 0x1605
+ when 005638 => D <= "11010001"; -- 0x1606
+ when 005639 => D <= "00011010"; -- 0x1607
+ when 005640 => D <= "10110100"; -- 0x1608
+ when 005641 => D <= "00100010"; -- 0x1609
+ when 005642 => D <= "11111011"; -- 0x160A
+ when 005643 => D <= "10000000"; -- 0x160B
+ when 005644 => D <= "10101011"; -- 0x160C
+ when 005645 => D <= "11101111"; -- 0x160D
+ when 005646 => D <= "11010001"; -- 0x160E
+ when 005647 => D <= "00101111"; -- 0x160F
+ when 005648 => D <= "10110100"; -- 0x1610
+ when 005649 => D <= "10010110"; -- 0x1611
+ when 005650 => D <= "10100101"; -- 0x1612
+ when 005651 => D <= "11101011"; -- 0x1613
+ when 005652 => D <= "11010001"; -- 0x1614
+ when 005653 => D <= "00011011"; -- 0x1615
+ when 005654 => D <= "11010001"; -- 0x1616
+ when 005655 => D <= "00011010"; -- 0x1617
+ when 005656 => D <= "10000000"; -- 0x1618
+ when 005657 => D <= "11111100"; -- 0x1619
+ when 005658 => D <= "11100010"; -- 0x161A
+ when 005659 => D <= "10110100"; -- 0x161B
+ when 005660 => D <= "00001101"; -- 0x161C
+ when 005661 => D <= "00010000"; -- 0x161D
+ when 005662 => D <= "11010000"; -- 0x161E
+ when 005663 => D <= "00000000"; -- 0x161F
+ when 005664 => D <= "11010000"; -- 0x1620
+ when 005665 => D <= "00000000"; -- 0x1621
+ when 005666 => D <= "11110011"; -- 0x1622
+ when 005667 => D <= "00001001"; -- 0x1623
+ when 005668 => D <= "01110100"; -- 0x1624
+ when 005669 => D <= "00000001"; -- 0x1625
+ when 005670 => D <= "11110011"; -- 0x1626
+ when 005671 => D <= "11101001"; -- 0x1627
+ when 005672 => D <= "10010100"; -- 0x1628
+ when 005673 => D <= "00000100"; -- 0x1629
+ when 005674 => D <= "11110101"; -- 0x162A
+ when 005675 => D <= "00001101"; -- 0x162B
+ when 005676 => D <= "01111001"; -- 0x162C
+ when 005677 => D <= "00000100"; -- 0x162D
+ when 005678 => D <= "00001000"; -- 0x162E
+ when 005679 => D <= "11110011"; -- 0x162F
+ when 005680 => D <= "00001001"; -- 0x1630
+ when 005681 => D <= "00100010"; -- 0x1631
+ when 005682 => D <= "00011110"; -- 0x1632
+ when 005683 => D <= "10111110"; -- 0x1633
+ when 005684 => D <= "11111111"; -- 0x1634
+ when 005685 => D <= "00000001"; -- 0x1635
+ when 005686 => D <= "00011111"; -- 0x1636
+ when 005687 => D <= "11101111"; -- 0x1637
+ when 005688 => D <= "01001110"; -- 0x1638
+ when 005689 => D <= "00100010"; -- 0x1639
+ when 005690 => D <= "10010000"; -- 0x163A
+ when 005691 => D <= "00000001"; -- 0x163B
+ when 005692 => D <= "00001010"; -- 0x163C
+ when 005693 => D <= "00010010"; -- 0x163D
+ when 005694 => D <= "00000101"; -- 0x163E
+ when 005695 => D <= "01101101"; -- 0x163F
+ when 005696 => D <= "10000001"; -- 0x1640
+ when 005697 => D <= "10011111"; -- 0x1641
+ when 005698 => D <= "10010000"; -- 0x1642
+ when 005699 => D <= "00010111"; -- 0x1643
+ when 005700 => D <= "11100000"; -- 0x1644
+ when 005701 => D <= "10010001"; -- 0x1645
+ when 005702 => D <= "00011110"; -- 0x1646
+ when 005703 => D <= "10010001"; -- 0x1647
+ when 005704 => D <= "00010101"; -- 0x1648
+ when 005705 => D <= "10010001"; -- 0x1649
+ when 005706 => D <= "00010111"; -- 0x164A
+ when 005707 => D <= "10010000"; -- 0x164B
+ when 005708 => D <= "00000111"; -- 0x164C
+ when 005709 => D <= "00000011"; -- 0x164D
+ when 005710 => D <= "11010001"; -- 0x164E
+ when 005711 => D <= "01110000"; -- 0x164F
+ when 005712 => D <= "10010000"; -- 0x1650
+ when 005713 => D <= "00000001"; -- 0x1651
+ when 005714 => D <= "00101000"; -- 0x1652
+ when 005715 => D <= "11110001"; -- 0x1653
+ when 005716 => D <= "00000101"; -- 0x1654
+ when 005717 => D <= "10010000"; -- 0x1655
+ when 005718 => D <= "00010111"; -- 0x1656
+ when 005719 => D <= "11110010"; -- 0x1657
+ when 005720 => D <= "11010001"; -- 0x1658
+ when 005721 => D <= "01110000"; -- 0x1659
+ when 005722 => D <= "10010000"; -- 0x165A
+ when 005723 => D <= "00000001"; -- 0x165B
+ when 005724 => D <= "00101010"; -- 0x165C
+ when 005725 => D <= "11110001"; -- 0x165D
+ when 005726 => D <= "00000101"; -- 0x165E
+ when 005727 => D <= "10010000"; -- 0x165F
+ when 005728 => D <= "00010001"; -- 0x1660
+ when 005729 => D <= "01010010"; -- 0x1661
+ when 005730 => D <= "01010001"; -- 0x1662
+ when 005731 => D <= "00001010"; -- 0x1663
+ when 005732 => D <= "11101001"; -- 0x1664
+ when 005733 => D <= "11110100"; -- 0x1665
+ when 005734 => D <= "00000100"; -- 0x1666
+ when 005735 => D <= "11110101"; -- 0x1667
+ when 005736 => D <= "01001010"; -- 0x1668
+ when 005737 => D <= "01111011"; -- 0x1669
+ when 005738 => D <= "00000001"; -- 0x166A
+ when 005739 => D <= "01111001"; -- 0x166B
+ when 005740 => D <= "00010011"; -- 0x166C
+ when 005741 => D <= "00000010"; -- 0x166D
+ when 005742 => D <= "00001111"; -- 0x166E
+ when 005743 => D <= "11010110"; -- 0x166F
+ when 005744 => D <= "01010001"; -- 0x1670
+ when 005745 => D <= "00001010"; -- 0x1671
+ when 005746 => D <= "11101001"; -- 0x1672
+ when 005747 => D <= "11110100"; -- 0x1673
+ when 005748 => D <= "00100100"; -- 0x1674
+ when 005749 => D <= "00001111"; -- 0x1675
+ when 005750 => D <= "11111001"; -- 0x1676
+ when 005751 => D <= "11101011"; -- 0x1677
+ when 005752 => D <= "11110100"; -- 0x1678
+ when 005753 => D <= "00110100"; -- 0x1679
+ when 005754 => D <= "00000000"; -- 0x167A
+ when 005755 => D <= "11111011"; -- 0x167B
+ when 005756 => D <= "00100010"; -- 0x167C
+ when 005757 => D <= "00010010"; -- 0x167D
+ when 005758 => D <= "00001110"; -- 0x167E
+ when 005759 => D <= "01111011"; -- 0x167F
+ when 005760 => D <= "11010001"; -- 0x1680
+ when 005761 => D <= "01110010"; -- 0x1681
+ when 005762 => D <= "11000010"; -- 0x1682
+ when 005763 => D <= "10010010"; -- 0x1683
+ when 005764 => D <= "11000010"; -- 0x1684
+ when 005765 => D <= "10001110"; -- 0x1685
+ when 005766 => D <= "10001011"; -- 0x1686
+ when 005767 => D <= "10001101"; -- 0x1687
+ when 005768 => D <= "10001001"; -- 0x1688
+ when 005769 => D <= "10001011"; -- 0x1689
+ when 005770 => D <= "11000010"; -- 0x168A
+ when 005771 => D <= "10001111"; -- 0x168B
+ when 005772 => D <= "11010010"; -- 0x168C
+ when 005773 => D <= "10001110"; -- 0x168D
+ when 005774 => D <= "11010001"; -- 0x168E
+ when 005775 => D <= "00110010"; -- 0x168F
+ when 005776 => D <= "00110000"; -- 0x1690
+ when 005777 => D <= "10001111"; -- 0x1691
+ when 005778 => D <= "11111101"; -- 0x1692
+ when 005779 => D <= "01110001"; -- 0x1693
+ when 005780 => D <= "10010111"; -- 0x1694
+ when 005781 => D <= "11010010"; -- 0x1695
+ when 005782 => D <= "10010010"; -- 0x1696
+ when 005783 => D <= "00010010"; -- 0x1697
+ when 005784 => D <= "00000101"; -- 0x1698
+ when 005785 => D <= "00101001"; -- 0x1699
+ when 005786 => D <= "00110000"; -- 0x169A
+ when 005787 => D <= "10001111"; -- 0x169B
+ when 005788 => D <= "11111101"; -- 0x169C
+ when 005789 => D <= "01110000"; -- 0x169D
+ when 005790 => D <= "11100011"; -- 0x169E
+ when 005791 => D <= "00100010"; -- 0x169F
+ when 005792 => D <= "10000000"; -- 0x16A0
+ when 005793 => D <= "00000000"; -- 0x16A1
+ when 005794 => D <= "01110001"; -- 0x16A2
+ when 005795 => D <= "00110111"; -- 0x16A3
+ when 005796 => D <= "00010011"; -- 0x16A4
+ when 005797 => D <= "00011001"; -- 0x16A5
+ when 005798 => D <= "01111111"; -- 0x16A6
+ when 005799 => D <= "00000000"; -- 0x16A7
+ when 005800 => D <= "01110110"; -- 0x16A8
+ when 005801 => D <= "01100100"; -- 0x16A9
+ when 005802 => D <= "00110111"; -- 0x16AA
+ when 005803 => D <= "10010100"; -- 0x16AB
+ when 005804 => D <= "10000000"; -- 0x16AC
+ when 005805 => D <= "00000000"; -- 0x16AD
+ when 005806 => D <= "00000111"; -- 0x16AE
+ when 005807 => D <= "00100010"; -- 0x16AF
+ when 005808 => D <= "01110101"; -- 0x16B0
+ when 005809 => D <= "00010111"; -- 0x16B1
+ when 005810 => D <= "10000000"; -- 0x16B2
+ when 005811 => D <= "00000000"; -- 0x16B3
+ when 005812 => D <= "01010010"; -- 0x16B4
+ when 005813 => D <= "00110101"; -- 0x16B5
+ when 005814 => D <= "10010011"; -- 0x16B6
+ when 005815 => D <= "00101000"; -- 0x16B7
+ when 005816 => D <= "10000000"; -- 0x16B8
+ when 005817 => D <= "00000000"; -- 0x16B9
+ when 005818 => D <= "01110001"; -- 0x16BA
+ when 005819 => D <= "10010001"; -- 0x16BB
+ when 005820 => D <= "10000101"; -- 0x16BC
+ when 005821 => D <= "10000110"; -- 0x16BD
+ when 005822 => D <= "11111111"; -- 0x16BE
+ when 005823 => D <= "10000001"; -- 0x16BF
+ when 005824 => D <= "00000000"; -- 0x16C0
+ when 005825 => D <= "01010001"; -- 0x16C1
+ when 005826 => D <= "01011000"; -- 0x16C2
+ when 005827 => D <= "00000010"; -- 0x16C3
+ when 005828 => D <= "00100011"; -- 0x16C4
+ when 005829 => D <= "01110111"; -- 0x16C5
+ when 005830 => D <= "00000000"; -- 0x16C6
+ when 005831 => D <= "01000100"; -- 0x16C7
+ when 005832 => D <= "10010000"; -- 0x16C8
+ when 005833 => D <= "00000101"; -- 0x16C9
+ when 005834 => D <= "00010110"; -- 0x16CA
+ when 005835 => D <= "01111001"; -- 0x16CB
+ when 005836 => D <= "00000001"; -- 0x16CC
+ when 005837 => D <= "00001000"; -- 0x16CD
+ when 005838 => D <= "00100001"; -- 0x16CE
+ when 005839 => D <= "00000101"; -- 0x16CF
+ when 005840 => D <= "00100101"; -- 0x16D0
+ when 005841 => D <= "01111011"; -- 0x16D1
+ when 005842 => D <= "00000000"; -- 0x16D2
+ when 005843 => D <= "00011001"; -- 0x16D3
+ when 005844 => D <= "01110011"; -- 0x16D4
+ when 005845 => D <= "01010101"; -- 0x16D5
+ when 005846 => D <= "00100111"; -- 0x16D6
+ when 005847 => D <= "01111101"; -- 0x16D7
+ when 005848 => D <= "00000001"; -- 0x16D8
+ when 005849 => D <= "01110000"; -- 0x16D9
+ when 005850 => D <= "00010010"; -- 0x16DA
+ when 005851 => D <= "10000100"; -- 0x16DB
+ when 005852 => D <= "00011001"; -- 0x16DC
+ when 005853 => D <= "01111110"; -- 0x16DD
+ when 005854 => D <= "00000000"; -- 0x16DE
+ when 005855 => D <= "00110011"; -- 0x16DF
+ when 005856 => D <= "00110011"; -- 0x16E0
+ when 005857 => D <= "00110011"; -- 0x16E1
+ when 005858 => D <= "10000011"; -- 0x16E2
+ when 005859 => D <= "10000000"; -- 0x16E3
+ when 005860 => D <= "00000001"; -- 0x16E4
+ when 005861 => D <= "01100111"; -- 0x16E5
+ when 005862 => D <= "01100110"; -- 0x16E6
+ when 005863 => D <= "01100110"; -- 0x16E7
+ when 005864 => D <= "00010110"; -- 0x16E8
+ when 005865 => D <= "10000001"; -- 0x16E9
+ when 005866 => D <= "00000000"; -- 0x16EA
+ when 005867 => D <= "00000000"; -- 0x16EB
+ when 005868 => D <= "00000000"; -- 0x16EC
+ when 005869 => D <= "00000000"; -- 0x16ED
+ when 005870 => D <= "00010000"; -- 0x16EE
+ when 005871 => D <= "11111111"; -- 0x16EF
+ when 005872 => D <= "00010010"; -- 0x16F0
+ when 005873 => D <= "00001111"; -- 0x16F1
+ when 005874 => D <= "11011100"; -- 0x16F2
+ when 005875 => D <= "00010010"; -- 0x16F3
+ when 005876 => D <= "00001111"; -- 0x16F4
+ when 005877 => D <= "01000110"; -- 0x16F5
+ when 005878 => D <= "01110100"; -- 0x16F6
+ when 005879 => D <= "00001100"; -- 0x16F7
+ when 005880 => D <= "10010001"; -- 0x16F8
+ when 005881 => D <= "10011100"; -- 0x16F9
+ when 005882 => D <= "00110001"; -- 0x16FA
+ when 005883 => D <= "10011011"; -- 0x16FB
+ when 005884 => D <= "01110001"; -- 0x16FC
+ when 005885 => D <= "11110101"; -- 0x16FD
+ when 005886 => D <= "01010001"; -- 0x16FE
+ when 005887 => D <= "00001110"; -- 0x16FF
+ when 005888 => D <= "11010001"; -- 0x1700
+ when 005889 => D <= "01110010"; -- 0x1701
+ when 005890 => D <= "10010000"; -- 0x1702
+ when 005891 => D <= "00000001"; -- 0x1703
+ when 005892 => D <= "00100100"; -- 0x1704
+ when 005893 => D <= "00000010"; -- 0x1705
+ when 005894 => D <= "00000101"; -- 0x1706
+ when 005895 => D <= "11111111"; -- 0x1707
+ when 005896 => D <= "11010001"; -- 0x1708
+ when 005897 => D <= "00111010"; -- 0x1709
+ when 005898 => D <= "00010010"; -- 0x170A
+ when 005899 => D <= "00000101"; -- 0x170B
+ when 005900 => D <= "10100011"; -- 0x170C
+ when 005901 => D <= "10101000"; -- 0x170D
+ when 005902 => D <= "10000010"; -- 0x170E
+ when 005903 => D <= "10101010"; -- 0x170F
+ when 005904 => D <= "10000011"; -- 0x1710
+ when 005905 => D <= "10010001"; -- 0x1711
+ when 005906 => D <= "10011111"; -- 0x1712
+ when 005907 => D <= "00010010"; -- 0x1713
+ when 005908 => D <= "00011001"; -- 0x1714
+ when 005909 => D <= "10010101"; -- 0x1715
+ when 005910 => D <= "00000001"; -- 0x1716
+ when 005911 => D <= "00011101"; -- 0x1717
+ when 005912 => D <= "00010010"; -- 0x1718
+ when 005913 => D <= "00000101"; -- 0x1719
+ when 005914 => D <= "00010110"; -- 0x171A
+ when 005915 => D <= "10101010"; -- 0x171B
+ when 005916 => D <= "00000111"; -- 0x171C
+ when 005917 => D <= "11101110"; -- 0x171D
+ when 005918 => D <= "10000001"; -- 0x171E
+ when 005919 => D <= "10011110"; -- 0x171F
+ when 005920 => D <= "10100010"; -- 0x1720
+ when 005921 => D <= "10101111"; -- 0x1721
+ when 005922 => D <= "11000010"; -- 0x1722
+ when 005923 => D <= "10101111"; -- 0x1723
+ when 005924 => D <= "11000000"; -- 0x1724
+ when 005925 => D <= "01000111"; -- 0x1725
+ when 005926 => D <= "10101010"; -- 0x1726
+ when 005927 => D <= "01001000"; -- 0x1727
+ when 005928 => D <= "11100101"; -- 0x1728
+ when 005929 => D <= "01001001"; -- 0x1729
+ when 005930 => D <= "10010010"; -- 0x172A
+ when 005931 => D <= "10101111"; -- 0x172B
+ when 005932 => D <= "10010001"; -- 0x172C
+ when 005933 => D <= "10011110"; -- 0x172D
+ when 005934 => D <= "11010000"; -- 0x172E
+ when 005935 => D <= "11100000"; -- 0x172F
+ when 005936 => D <= "10010001"; -- 0x1730
+ when 005937 => D <= "10011100"; -- 0x1731
+ when 005938 => D <= "01110100"; -- 0x1732
+ when 005939 => D <= "11001000"; -- 0x1733
+ when 005940 => D <= "10010001"; -- 0x1734
+ when 005941 => D <= "10011100"; -- 0x1735
+ when 005942 => D <= "01110001"; -- 0x1736
+ when 005943 => D <= "11110101"; -- 0x1737
+ when 005944 => D <= "00010010"; -- 0x1738
+ when 005945 => D <= "00011001"; -- 0x1739
+ when 005946 => D <= "10010011"; -- 0x173A
+ when 005947 => D <= "00000001"; -- 0x173B
+ when 005948 => D <= "00011101"; -- 0x173C
+ when 005949 => D <= "01000010"; -- 0x173D
+ when 005950 => D <= "01000001"; -- 0x173E
+ when 005951 => D <= "01000100"; -- 0x173F
+ when 005952 => D <= "00100000"; -- 0x1740
+ when 005953 => D <= "01010011"; -- 0x1741
+ when 005954 => D <= "01011001"; -- 0x1742
+ when 005955 => D <= "01001110"; -- 0x1743
+ when 005956 => D <= "01010100"; -- 0x1744
+ when 005957 => D <= "01000001"; -- 0x1745
+ when 005958 => D <= "01011000"; -- 0x1746
+ when 005959 => D <= "00100010"; -- 0x1747
+ when 005960 => D <= "10001010"; -- 0x1748
+ when 005961 => D <= "01000100"; -- 0x1749
+ when 005962 => D <= "01001001"; -- 0x174A
+ when 005963 => D <= "01010110"; -- 0x174B
+ when 005964 => D <= "01001001"; -- 0x174C
+ when 005965 => D <= "01000100"; -- 0x174D
+ when 005966 => D <= "01000101"; -- 0x174E
+ when 005967 => D <= "00100000"; -- 0x174F
+ when 005968 => D <= "01000010"; -- 0x1750
+ when 005969 => D <= "01011001"; -- 0x1751
+ when 005970 => D <= "00100000"; -- 0x1752
+ when 005971 => D <= "01011010"; -- 0x1753
+ when 005972 => D <= "01000101"; -- 0x1754
+ when 005973 => D <= "01010010"; -- 0x1755
+ when 005974 => D <= "01001111"; -- 0x1756
+ when 005975 => D <= "00100010"; -- 0x1757
+ when 005976 => D <= "01000001"; -- 0x1758
+ when 005977 => D <= "01010010"; -- 0x1759
+ when 005978 => D <= "01010010"; -- 0x175A
+ when 005979 => D <= "01000001"; -- 0x175B
+ when 005980 => D <= "01011001"; -- 0x175C
+ when 005981 => D <= "00100000"; -- 0x175D
+ when 005982 => D <= "01010011"; -- 0x175E
+ when 005983 => D <= "01001001"; -- 0x175F
+ when 005984 => D <= "01011010"; -- 0x1760
+ when 005985 => D <= "01000101"; -- 0x1761
+ when 005986 => D <= "00100010"; -- 0x1762
+ when 005987 => D <= "01110101"; -- 0x1763
+ when 005988 => D <= "00001010"; -- 0x1764
+ when 005989 => D <= "00000000"; -- 0x1765
+ when 005990 => D <= "01110101"; -- 0x1766
+ when 005991 => D <= "00001000"; -- 0x1767
+ when 005992 => D <= "00000111"; -- 0x1768
+ when 005993 => D <= "00100010"; -- 0x1769
+ when 005994 => D <= "00010010"; -- 0x176A
+ when 005995 => D <= "00000101"; -- 0x176B
+ when 005996 => D <= "00010110"; -- 0x176C
+ when 005997 => D <= "01111010"; -- 0x176D
+ when 005998 => D <= "00000010"; -- 0x176E
+ when 005999 => D <= "01111000"; -- 0x176F
+ when 006000 => D <= "00000000"; -- 0x1770
+ when 006001 => D <= "10110001"; -- 0x1771
+ when 006002 => D <= "01011000"; -- 0x1772
+ when 006003 => D <= "00010010"; -- 0x1773
+ when 006004 => D <= "00000110"; -- 0x1774
+ when 006005 => D <= "01011110"; -- 0x1775
+ when 006006 => D <= "11000010"; -- 0x1776
+ when 006007 => D <= "00010111"; -- 0x1777
+ when 006008 => D <= "01110101"; -- 0x1778
+ when 006009 => D <= "00010011"; -- 0x1779
+ when 006010 => D <= "00000010"; -- 0x177A
+ when 006011 => D <= "01110101"; -- 0x177B
+ when 006012 => D <= "00010100"; -- 0x177C
+ when 006013 => D <= "00000000"; -- 0x177D
+ when 006014 => D <= "00010010"; -- 0x177E
+ when 006015 => D <= "00001100"; -- 0x177F
+ when 006016 => D <= "00110100"; -- 0x1780
+ when 006017 => D <= "11000010"; -- 0x1781
+ when 006018 => D <= "00101101"; -- 0x1782
+ when 006019 => D <= "11100100"; -- 0x1783
+ when 006020 => D <= "10010000"; -- 0x1784
+ when 006021 => D <= "00100000"; -- 0x1785
+ when 006022 => D <= "00000010"; -- 0x1786
+ when 006023 => D <= "10010011"; -- 0x1787
+ when 006024 => D <= "10110100"; -- 0x1788
+ when 006025 => D <= "01011010"; -- 0x1789
+ when 006026 => D <= "00000011"; -- 0x178A
+ when 006027 => D <= "00010010"; -- 0x178B
+ when 006028 => D <= "00100000"; -- 0x178C
+ when 006029 => D <= "01001000"; -- 0x178D
+ when 006030 => D <= "10010000"; -- 0x178E
+ when 006031 => D <= "00000000"; -- 0x178F
+ when 006032 => D <= "11111011"; -- 0x1790
+ when 006033 => D <= "00010010"; -- 0x1791
+ when 006034 => D <= "00000110"; -- 0x1792
+ when 006035 => D <= "10100111"; -- 0x1793
+ when 006036 => D <= "11010010"; -- 0x1794
+ when 006037 => D <= "00101111"; -- 0x1795
+ when 006038 => D <= "10000101"; -- 0x1796
+ when 006039 => D <= "00111110"; -- 0x1797
+ when 006040 => D <= "10000001"; -- 0x1798
+ when 006041 => D <= "00010001"; -- 0x1799
+ when 006042 => D <= "10000010"; -- 0x179A
+ when 006043 => D <= "11000010"; -- 0x179B
+ when 006044 => D <= "00011000"; -- 0x179C
+ when 006045 => D <= "10010000"; -- 0x179D
+ when 006046 => D <= "00000000"; -- 0x179E
+ when 006047 => D <= "01011110"; -- 0x179F
+ when 006048 => D <= "11100000"; -- 0x17A0
+ when 006049 => D <= "01100100"; -- 0x17A1
+ when 006050 => D <= "00110100"; -- 0x17A2
+ when 006051 => D <= "01110000"; -- 0x17A3
+ when 006052 => D <= "00000011"; -- 0x17A4
+ when 006053 => D <= "00000010"; -- 0x17A5
+ when 006054 => D <= "00001000"; -- 0x17A6
+ when 006055 => D <= "00001000"; -- 0x17A7
+ when 006056 => D <= "01111101"; -- 0x17A8
+ when 006057 => D <= "00111110"; -- 0x17A9
+ when 006058 => D <= "00010010"; -- 0x17AA
+ when 006059 => D <= "00000111"; -- 0x17AB
+ when 006060 => D <= "00001011"; -- 0x17AC
+ when 006061 => D <= "00010010"; -- 0x17AD
+ when 006062 => D <= "00000110"; -- 0x17AE
+ when 006063 => D <= "11010010"; -- 0x17AF
+ when 006064 => D <= "10110001"; -- 0x17B0
+ when 006065 => D <= "10100101"; -- 0x17B1
+ when 006066 => D <= "00100000"; -- 0x17B2
+ when 006067 => D <= "11010101"; -- 0x17B3
+ when 006068 => D <= "00001111"; -- 0x17B4
+ when 006069 => D <= "10010001"; -- 0x17B5
+ when 006070 => D <= "11011011"; -- 0x17B6
+ when 006071 => D <= "00010010"; -- 0x17B7
+ when 006072 => D <= "00000101"; -- 0x17B8
+ when 006073 => D <= "11100001"; -- 0x17B9
+ when 006074 => D <= "00100000"; -- 0x17BA
+ when 006075 => D <= "00010101"; -- 0x17BB
+ when 006076 => D <= "11011110"; -- 0x17BC
+ when 006077 => D <= "11010010"; -- 0x17BD
+ when 006078 => D <= "00010101"; -- 0x17BE
+ when 006079 => D <= "00010010"; -- 0x17BF
+ when 006080 => D <= "00000110"; -- 0x17C0
+ when 006081 => D <= "01011110"; -- 0x17C1
+ when 006082 => D <= "10000000"; -- 0x17C2
+ when 006083 => D <= "11010111"; -- 0x17C3
+ when 006084 => D <= "11110001"; -- 0x17C4
+ when 006085 => D <= "01100011"; -- 0x17C5
+ when 006086 => D <= "00010010"; -- 0x17C6
+ when 006087 => D <= "00001110"; -- 0x17C7
+ when 006088 => D <= "11100100"; -- 0x17C8
+ when 006089 => D <= "01100000"; -- 0x17C9
+ when 006090 => D <= "11001001"; -- 0x17CA
+ when 006091 => D <= "10010000"; -- 0x17CB
+ when 006092 => D <= "00000001"; -- 0x17CC
+ when 006093 => D <= "00001101"; -- 0x17CD
+ when 006094 => D <= "10110100"; -- 0x17CE
+ when 006095 => D <= "11110000"; -- 0x17CF
+ when 006096 => D <= "00000000"; -- 0x17D0
+ when 006097 => D <= "01000000"; -- 0x17D1
+ when 006098 => D <= "00001010"; -- 0x17D2
+ when 006099 => D <= "00010010"; -- 0x17D3
+ when 006100 => D <= "00001110"; -- 0x17D4
+ when 006101 => D <= "11011010"; -- 0x17D5
+ when 006102 => D <= "01010100"; -- 0x17D6
+ when 006103 => D <= "00001111"; -- 0x17D7
+ when 006104 => D <= "00010010"; -- 0x17D8
+ when 006105 => D <= "00001001"; -- 0x17D9
+ when 006106 => D <= "01011111"; -- 0x17DA
+ when 006107 => D <= "10000000"; -- 0x17DB
+ when 006108 => D <= "10110111"; -- 0x17DC
+ when 006109 => D <= "00000010"; -- 0x17DD
+ when 006110 => D <= "00001000"; -- 0x17DE
+ when 006111 => D <= "00011001"; -- 0x17DF
+ when 006112 => D <= "10001000"; -- 0x17E0
+ when 006113 => D <= "00000000"; -- 0x17E1
+ when 006114 => D <= "00000000"; -- 0x17E2
+ when 006115 => D <= "10010010"; -- 0x17E3
+ when 006116 => D <= "00000101"; -- 0x17E4
+ when 006117 => D <= "00010001"; -- 0x17E5
+ when 006118 => D <= "10000101"; -- 0x17E6
+ when 006119 => D <= "00000000"; -- 0x17E7
+ when 006120 => D <= "01000010"; -- 0x17E8
+ when 006121 => D <= "01000001"; -- 0x17E9
+ when 006122 => D <= "10000111"; -- 0x17EA
+ when 006123 => D <= "01011001"; -- 0x17EB
+ when 006124 => D <= "10000001"; -- 0x17EC
+ when 006125 => D <= "00000000"; -- 0x17ED
+ when 006126 => D <= "00011000"; -- 0x17EE
+ when 006127 => D <= "00101000"; -- 0x17EF
+ when 006128 => D <= "00011000"; -- 0x17F0
+ when 006129 => D <= "00100111"; -- 0x17F1
+ when 006130 => D <= "01111100"; -- 0x17F2
+ when 006131 => D <= "00000000"; -- 0x17F3
+ when 006132 => D <= "00000000"; -- 0x17F4
+ when 006133 => D <= "00000000"; -- 0x17F5
+ when 006134 => D <= "01110101"; -- 0x17F6
+ when 006135 => D <= "10000011"; -- 0x17F7
+ when 006136 => D <= "10000001"; -- 0x17F8
+ when 006137 => D <= "00000000"; -- 0x17F9
+ when 006138 => D <= "00100110"; -- 0x17FA
+ when 006139 => D <= "01011001"; -- 0x17FB
+ when 006140 => D <= "01000001"; -- 0x17FC
+ when 006141 => D <= "00110001"; -- 0x17FD
+ when 006142 => D <= "10011110"; -- 0x17FE
+ when 006143 => D <= "01000001"; -- 0x17FF
+ when 006144 => D <= "01010010"; -- 0x1800
+ when 006145 => D <= "01001001"; -- 0x1801
+ when 006146 => D <= "01010100"; -- 0x1802
+ when 006147 => D <= "01001000"; -- 0x1803
+ when 006148 => D <= "00101110"; -- 0x1804
+ when 006149 => D <= "00100000"; -- 0x1805
+ when 006150 => D <= "01010101"; -- 0x1806
+ when 006151 => D <= "01001110"; -- 0x1807
+ when 006152 => D <= "01000100"; -- 0x1808
+ when 006153 => D <= "01000101"; -- 0x1809
+ when 006154 => D <= "01010010"; -- 0x180A
+ when 006155 => D <= "01000110"; -- 0x180B
+ when 006156 => D <= "01001100"; -- 0x180C
+ when 006157 => D <= "01001111"; -- 0x180D
+ when 006158 => D <= "01010111"; -- 0x180E
+ when 006159 => D <= "00100010"; -- 0x180F
+ when 006160 => D <= "01001101"; -- 0x1810
+ when 006161 => D <= "01000101"; -- 0x1811
+ when 006162 => D <= "01001101"; -- 0x1812
+ when 006163 => D <= "01001111"; -- 0x1813
+ when 006164 => D <= "01010010"; -- 0x1814
+ when 006165 => D <= "01011001"; -- 0x1815
+ when 006166 => D <= "00100000"; -- 0x1816
+ when 006167 => D <= "01000001"; -- 0x1817
+ when 006168 => D <= "01001100"; -- 0x1818
+ when 006169 => D <= "01001100"; -- 0x1819
+ when 006170 => D <= "01001111"; -- 0x181A
+ when 006171 => D <= "01000011"; -- 0x181B
+ when 006172 => D <= "01000001"; -- 0x181C
+ when 006173 => D <= "01010100"; -- 0x181D
+ when 006174 => D <= "01001001"; -- 0x181E
+ when 006175 => D <= "01001111"; -- 0x181F
+ when 006176 => D <= "01001110"; -- 0x1820
+ when 006177 => D <= "00100010"; -- 0x1821
+ when 006178 => D <= "10101000"; -- 0x1822
+ when 006179 => D <= "01000010"; -- 0x1823
+ when 006180 => D <= "01000001"; -- 0x1824
+ when 006181 => D <= "01000100"; -- 0x1825
+ when 006182 => D <= "00100000"; -- 0x1826
+ when 006183 => D <= "01000001"; -- 0x1827
+ when 006184 => D <= "01010010"; -- 0x1828
+ when 006185 => D <= "01000111"; -- 0x1829
+ when 006186 => D <= "01010101"; -- 0x182A
+ when 006187 => D <= "01001101"; -- 0x182B
+ when 006188 => D <= "01000101"; -- 0x182C
+ when 006189 => D <= "01001110"; -- 0x182D
+ when 006190 => D <= "01010100"; -- 0x182E
+ when 006191 => D <= "00100010"; -- 0x182F
+ when 006192 => D <= "01001001"; -- 0x1830
+ when 006193 => D <= "00101101"; -- 0x1831
+ when 006194 => D <= "01010011"; -- 0x1832
+ when 006195 => D <= "01010100"; -- 0x1833
+ when 006196 => D <= "01000001"; -- 0x1834
+ when 006197 => D <= "01000011"; -- 0x1835
+ when 006198 => D <= "01001011"; -- 0x1836
+ when 006199 => D <= "00100010"; -- 0x1837
+ when 006200 => D <= "10010000"; -- 0x1838
+ when 006201 => D <= "00011111"; -- 0x1839
+ when 006202 => D <= "10100110"; -- 0x183A
+ when 006203 => D <= "00110000"; -- 0x183B
+ when 006204 => D <= "00010111"; -- 0x183C
+ when 006205 => D <= "01001011"; -- 0x183D
+ when 006206 => D <= "10000101"; -- 0x183E
+ when 006207 => D <= "01000010"; -- 0x183F
+ when 006208 => D <= "00001010"; -- 0x1840
+ when 006209 => D <= "10000101"; -- 0x1841
+ when 006210 => D <= "01000011"; -- 0x1842
+ when 006211 => D <= "00001000"; -- 0x1843
+ when 006212 => D <= "00000010"; -- 0x1844
+ when 006213 => D <= "00001000"; -- 0x1845
+ when 006214 => D <= "00010101"; -- 0x1846
+ when 006215 => D <= "10000101"; -- 0x1847
+ when 006216 => D <= "00001111"; -- 0x1848
+ when 006217 => D <= "10000011"; -- 0x1849
+ when 006218 => D <= "10000101"; -- 0x184A
+ when 006219 => D <= "00001110"; -- 0x184B
+ when 006220 => D <= "10000010"; -- 0x184C
+ when 006221 => D <= "00100010"; -- 0x184D
+ when 006222 => D <= "10000101"; -- 0x184E
+ when 006223 => D <= "10000011"; -- 0x184F
+ when 006224 => D <= "00001111"; -- 0x1850
+ when 006225 => D <= "10000101"; -- 0x1851
+ when 006226 => D <= "10000010"; -- 0x1852
+ when 006227 => D <= "00001110"; -- 0x1853
+ when 006228 => D <= "00100010"; -- 0x1854
+ when 006229 => D <= "00100000"; -- 0x1855
+ when 006230 => D <= "00101111"; -- 0x1856
+ when 006231 => D <= "00100111"; -- 0x1857
+ when 006232 => D <= "11000010"; -- 0x1858
+ when 006233 => D <= "10010110"; -- 0x1859
+ when 006234 => D <= "01000011"; -- 0x185A
+ when 006235 => D <= "10000111"; -- 0x185B
+ when 006236 => D <= "00000001"; -- 0x185C
+ when 006237 => D <= "00100000"; -- 0x185D
+ when 006238 => D <= "00010110"; -- 0x185E
+ when 006239 => D <= "00001011"; -- 0x185F
+ when 006240 => D <= "00010000"; -- 0x1860
+ when 006241 => D <= "00100001"; -- 0x1861
+ when 006242 => D <= "00001000"; -- 0x1862
+ when 006243 => D <= "00110000"; -- 0x1863
+ when 006244 => D <= "00010000"; -- 0x1864
+ when 006245 => D <= "11110100"; -- 0x1865
+ when 006246 => D <= "00010010"; -- 0x1866
+ when 006247 => D <= "00000111"; -- 0x1867
+ when 006248 => D <= "11101001"; -- 0x1868
+ when 006249 => D <= "01000000"; -- 0x1869
+ when 006250 => D <= "11101111"; -- 0x186A
+ when 006251 => D <= "11010010"; -- 0x186B
+ when 006252 => D <= "10010110"; -- 0x186C
+ when 006253 => D <= "00100010"; -- 0x186D
+ when 006254 => D <= "10100011"; -- 0x186E
+ when 006255 => D <= "00100000"; -- 0x186F
+ when 006256 => D <= "00101111"; -- 0x1870
+ when 006257 => D <= "00100011"; -- 0x1871
+ when 006258 => D <= "00110000"; -- 0x1872
+ when 006259 => D <= "00010011"; -- 0x1873
+ when 006260 => D <= "00100000"; -- 0x1874
+ when 006261 => D <= "10010000"; -- 0x1875
+ when 006262 => D <= "00000001"; -- 0x1876
+ when 006263 => D <= "00000001"; -- 0x1877
+ when 006264 => D <= "00010010"; -- 0x1878
+ when 006265 => D <= "00000110"; -- 0x1879
+ when 006266 => D <= "01101101"; -- 0x187A
+ when 006267 => D <= "10100011"; -- 0x187B
+ when 006268 => D <= "00000010"; -- 0x187C
+ when 006269 => D <= "00001000"; -- 0x187D
+ when 006270 => D <= "01001010"; -- 0x187E
+ when 006271 => D <= "10100010"; -- 0x187F
+ when 006272 => D <= "00101111"; -- 0x1880
+ when 006273 => D <= "10010000"; -- 0x1881
+ when 006274 => D <= "00010111"; -- 0x1882
+ when 006275 => D <= "00111101"; -- 0x1883
+ when 006276 => D <= "10000000"; -- 0x1884
+ when 006277 => D <= "00000100"; -- 0x1885
+ when 006278 => D <= "10010000"; -- 0x1886
+ when 006279 => D <= "00011000"; -- 0x1887
+ when 006280 => D <= "00110000"; -- 0x1888
+ when 006281 => D <= "11000011"; -- 0x1889
+ when 006282 => D <= "10000101"; -- 0x188A
+ when 006283 => D <= "00111110"; -- 0x188B
+ when 006284 => D <= "10000001"; -- 0x188C
+ when 006285 => D <= "00010010"; -- 0x188D
+ when 006286 => D <= "00001100"; -- 0x188E
+ when 006287 => D <= "00110100"; -- 0x188F
+ when 006288 => D <= "11100100"; -- 0x1890
+ when 006289 => D <= "10010011"; -- 0x1891
+ when 006290 => D <= "00010000"; -- 0x1892
+ when 006291 => D <= "11100111"; -- 0x1893
+ when 006292 => D <= "11011001"; -- 0x1894
+ when 006293 => D <= "00010001"; -- 0x1895
+ when 006294 => D <= "01001110"; -- 0x1896
+ when 006295 => D <= "01000000"; -- 0x1897
+ when 006296 => D <= "00000011"; -- 0x1898
+ when 006297 => D <= "00010010"; -- 0x1899
+ when 006298 => D <= "00000110"; -- 0x189A
+ when 006299 => D <= "01101001"; -- 0x189B
+ when 006300 => D <= "00010010"; -- 0x189C
+ when 006301 => D <= "00000110"; -- 0x189D
+ when 006302 => D <= "10011101"; -- 0x189E
+ when 006303 => D <= "10010000"; -- 0x189F
+ when 006304 => D <= "00011111"; -- 0x18A0
+ when 006305 => D <= "11111000"; -- 0x18A1
+ when 006306 => D <= "00010010"; -- 0x18A2
+ when 006307 => D <= "00000110"; -- 0x18A3
+ when 006308 => D <= "10101001"; -- 0x18A4
+ when 006309 => D <= "00010001"; -- 0x18A5
+ when 006310 => D <= "01000111"; -- 0x18A6
+ when 006311 => D <= "00010010"; -- 0x18A7
+ when 006312 => D <= "00000110"; -- 0x18A8
+ when 006313 => D <= "10101001"; -- 0x18A9
+ when 006314 => D <= "00110000"; -- 0x18AA
+ when 006315 => D <= "00101111"; -- 0x18AB
+ when 006316 => D <= "00000101"; -- 0x18AC
+ when 006317 => D <= "11000010"; -- 0x18AD
+ when 006318 => D <= "00100000"; -- 0x18AE
+ when 006319 => D <= "00000010"; -- 0x18AF
+ when 006320 => D <= "00010111"; -- 0x18B0
+ when 006321 => D <= "01111110"; -- 0x18B1
+ when 006322 => D <= "10010000"; -- 0x18B2
+ when 006323 => D <= "00000001"; -- 0x18B3
+ when 006324 => D <= "00000001"; -- 0x18B4
+ when 006325 => D <= "00010010"; -- 0x18B5
+ when 006326 => D <= "00000110"; -- 0x18B6
+ when 006327 => D <= "10101001"; -- 0x18B7
+ when 006328 => D <= "00010010"; -- 0x18B8
+ when 006329 => D <= "00001110"; -- 0x18B9
+ when 006330 => D <= "10011110"; -- 0x18BA
+ when 006331 => D <= "11100100"; -- 0x18BB
+ when 006332 => D <= "00010001"; -- 0x18BC
+ when 006333 => D <= "01001110"; -- 0x18BD
+ when 006334 => D <= "00010010"; -- 0x18BE
+ when 006335 => D <= "00000101"; -- 0x18BF
+ when 006336 => D <= "11011000"; -- 0x18C0
+ when 006337 => D <= "00010001"; -- 0x18C1
+ when 006338 => D <= "11110101"; -- 0x18C2
+ when 006339 => D <= "01000000"; -- 0x18C3
+ when 006340 => D <= "00000110"; -- 0x18C4
+ when 006341 => D <= "01100000"; -- 0x18C5
+ when 006342 => D <= "00000100"; -- 0x18C6
+ when 006343 => D <= "11100000"; -- 0x18C7
+ when 006344 => D <= "10110100"; -- 0x18C8
+ when 006345 => D <= "00000001"; -- 0x18C9
+ when 006346 => D <= "11110001"; -- 0x18CA
+ when 006347 => D <= "00010001"; -- 0x18CB
+ when 006348 => D <= "01000111"; -- 0x18CC
+ when 006349 => D <= "00010001"; -- 0x18CD
+ when 006350 => D <= "11110101"; -- 0x18CE
+ when 006351 => D <= "11101001"; -- 0x18CF
+ when 006352 => D <= "00100100"; -- 0x18D0
+ when 006353 => D <= "00001010"; -- 0x18D1
+ when 006354 => D <= "11110101"; -- 0x18D2
+ when 006355 => D <= "01000101"; -- 0x18D3
+ when 006356 => D <= "10100011"; -- 0x18D4
+ when 006357 => D <= "00010010"; -- 0x18D5
+ when 006358 => D <= "00010110"; -- 0x18D6
+ when 006359 => D <= "00111101"; -- 0x18D7
+ when 006360 => D <= "00110001"; -- 0x18D8
+ when 006361 => D <= "10100001"; -- 0x18D9
+ when 006362 => D <= "00100000"; -- 0x18DA
+ when 006363 => D <= "00100000"; -- 0x18DB
+ when 006364 => D <= "11010000"; -- 0x18DC
+ when 006365 => D <= "00010010"; -- 0x18DD
+ when 006366 => D <= "00000110"; -- 0x18DE
+ when 006367 => D <= "10011101"; -- 0x18DF
+ when 006368 => D <= "00010001"; -- 0x18E0
+ when 006369 => D <= "01000111"; -- 0x18E1
+ when 006370 => D <= "00010010"; -- 0x18E2
+ when 006371 => D <= "00010000"; -- 0x18E3
+ when 006372 => D <= "10001000"; -- 0x18E4
+ when 006373 => D <= "00010010"; -- 0x18E5
+ when 006374 => D <= "00010000"; -- 0x18E6
+ when 006375 => D <= "01111001"; -- 0x18E7
+ when 006376 => D <= "01111101"; -- 0x18E8
+ when 006377 => D <= "00101101"; -- 0x18E9
+ when 006378 => D <= "00110001"; -- 0x18EA
+ when 006379 => D <= "10010000"; -- 0x18EB
+ when 006380 => D <= "11010101"; -- 0x18EC
+ when 006381 => D <= "01000101"; -- 0x18ED
+ when 006382 => D <= "11111001"; -- 0x18EE
+ when 006383 => D <= "01111101"; -- 0x18EF
+ when 006384 => D <= "01011000"; -- 0x18F0
+ when 006385 => D <= "00110001"; -- 0x18F1
+ when 006386 => D <= "10010000"; -- 0x18F2
+ when 006387 => D <= "00000001"; -- 0x18F3
+ when 006388 => D <= "10101101"; -- 0x18F4
+ when 006389 => D <= "10101011"; -- 0x18F5
+ when 006390 => D <= "00001010"; -- 0x18F6
+ when 006391 => D <= "10101001"; -- 0x18F7
+ when 006392 => D <= "00001000"; -- 0x18F8
+ when 006393 => D <= "00000010"; -- 0x18F9
+ when 006394 => D <= "00001010"; -- 0x18FA
+ when 006395 => D <= "00000101"; -- 0x18FB
+ when 006396 => D <= "10000101"; -- 0x18FC
+ when 006397 => D <= "01001010"; -- 0x18FD
+ when 006398 => D <= "10001100"; -- 0x18FE
+ when 006399 => D <= "11000101"; -- 0x18FF
+ when 006400 => D <= "01000111"; -- 0x1900
+ when 006401 => D <= "00000100"; -- 0x1901
+ when 006402 => D <= "10110100"; -- 0x1902
+ when 006403 => D <= "11001000"; -- 0x1903
+ when 006404 => D <= "00001000"; -- 0x1904
+ when 006405 => D <= "11100100"; -- 0x1905
+ when 006406 => D <= "00000101"; -- 0x1906
+ when 006407 => D <= "01001001"; -- 0x1907
+ when 006408 => D <= "10110101"; -- 0x1908
+ when 006409 => D <= "01001001"; -- 0x1909
+ when 006410 => D <= "00000010"; -- 0x190A
+ when 006411 => D <= "00000101"; -- 0x190B
+ when 006412 => D <= "01001000"; -- 0x190C
+ when 006413 => D <= "11000101"; -- 0x190D
+ when 006414 => D <= "01000111"; -- 0x190E
+ when 006415 => D <= "11010000"; -- 0x190F
+ when 006416 => D <= "11010000"; -- 0x1910
+ when 006417 => D <= "00110010"; -- 0x1911
+ when 006418 => D <= "00110001"; -- 0x1912
+ when 006419 => D <= "00101111"; -- 0x1913
+ when 006420 => D <= "11000010"; -- 0x1914
+ when 006421 => D <= "10101001"; -- 0x1915
+ when 006422 => D <= "11000010"; -- 0x1916
+ when 006423 => D <= "00101110"; -- 0x1917
+ when 006424 => D <= "01010000"; -- 0x1918
+ when 006425 => D <= "00001010"; -- 0x1919
+ when 006426 => D <= "01010011"; -- 0x191A
+ when 006427 => D <= "10001001"; -- 0x191B
+ when 006428 => D <= "11110000"; -- 0x191C
+ when 006429 => D <= "11010010"; -- 0x191D
+ when 006430 => D <= "00101110"; -- 0x191E
+ when 006431 => D <= "01000011"; -- 0x191F
+ when 006432 => D <= "10101000"; -- 0x1920
+ when 006433 => D <= "10000010"; -- 0x1921
+ when 006434 => D <= "11010010"; -- 0x1922
+ when 006435 => D <= "10001100"; -- 0x1923
+ when 006436 => D <= "00100010"; -- 0x1924
+ when 006437 => D <= "00110001"; -- 0x1925
+ when 006438 => D <= "00101111"; -- 0x1926
+ when 006439 => D <= "10010010"; -- 0x1927
+ when 006440 => D <= "00011110"; -- 0x1928
+ when 006441 => D <= "00100010"; -- 0x1929
+ when 006442 => D <= "00110001"; -- 0x192A
+ when 006443 => D <= "00101111"; -- 0x192B
+ when 006444 => D <= "10010010"; -- 0x192C
+ when 006445 => D <= "00011100"; -- 0x192D
+ when 006446 => D <= "00100010"; -- 0x192E
+ when 006447 => D <= "00010010"; -- 0x192F
+ when 006448 => D <= "00001110"; -- 0x1930
+ when 006449 => D <= "11011000"; -- 0x1931
+ when 006450 => D <= "10010100"; -- 0x1932
+ when 006451 => D <= "00110001"; -- 0x1933
+ when 006452 => D <= "10110011"; -- 0x1934
+ when 006453 => D <= "00100010"; -- 0x1935
+ when 006454 => D <= "00100000"; -- 0x1936
+ when 006455 => D <= "11010100"; -- 0x1937
+ when 006456 => D <= "11111100"; -- 0x1938
+ when 006457 => D <= "00100000"; -- 0x1939
+ when 006458 => D <= "11010011"; -- 0x193A
+ when 006459 => D <= "11111001"; -- 0x193B
+ when 006460 => D <= "00010000"; -- 0x193C
+ when 006461 => D <= "11100111"; -- 0x193D
+ when 006462 => D <= "00000110"; -- 0x193E
+ when 006463 => D <= "10010000"; -- 0x193F
+ when 006464 => D <= "00000000"; -- 0x1940
+ when 006465 => D <= "01000111"; -- 0x1941
+ when 006466 => D <= "00000010"; -- 0x1942
+ when 006467 => D <= "00001001"; -- 0x1943
+ when 006468 => D <= "01011111"; -- 0x1944
+ when 006469 => D <= "00100000"; -- 0x1945
+ when 006470 => D <= "11100000"; -- 0x1946
+ when 006471 => D <= "01010111"; -- 0x1947
+ when 006472 => D <= "01100000"; -- 0x1948
+ when 006473 => D <= "01000110"; -- 0x1949
+ when 006474 => D <= "10010000"; -- 0x194A
+ when 006475 => D <= "00011001"; -- 0x194B
+ when 006476 => D <= "10010001"; -- 0x194C
+ when 006477 => D <= "01110011"; -- 0x194D
+ when 006478 => D <= "00110001"; -- 0x194E
+ when 006479 => D <= "10011101"; -- 0x194F
+ when 006480 => D <= "01010000"; -- 0x1950
+ when 006481 => D <= "01001101"; -- 0x1951
+ when 006482 => D <= "00110001"; -- 0x1952
+ when 006483 => D <= "10100101"; -- 0x1953
+ when 006484 => D <= "01110000"; -- 0x1954
+ when 006485 => D <= "00110100"; -- 0x1955
+ when 006486 => D <= "11000000"; -- 0x1956
+ when 006487 => D <= "10000011"; -- 0x1957
+ when 006488 => D <= "11000000"; -- 0x1958
+ when 006489 => D <= "10000010"; -- 0x1959
+ when 006490 => D <= "00110001"; -- 0x195A
+ when 006491 => D <= "10101011"; -- 0x195B
+ when 006492 => D <= "11010000"; -- 0x195C
+ when 006493 => D <= "10000010"; -- 0x195D
+ when 006494 => D <= "11010000"; -- 0x195E
+ when 006495 => D <= "10000011"; -- 0x195F
+ when 006496 => D <= "11100100"; -- 0x1960
+ when 006497 => D <= "00100010"; -- 0x1961
+ when 006498 => D <= "10000101"; -- 0x1962
+ when 006499 => D <= "11001100"; -- 0x1963
+ when 006500 => D <= "11100000"; -- 0x1964
+ when 006501 => D <= "00100000"; -- 0x1965
+ when 006502 => D <= "11100011"; -- 0x1966
+ when 006503 => D <= "11111010"; -- 0x1967
+ when 006504 => D <= "00010010"; -- 0x1968
+ when 006505 => D <= "00010101"; -- 0x1969
+ when 006506 => D <= "01111010"; -- 0x196A
+ when 006507 => D <= "10000101"; -- 0x196B
+ when 006508 => D <= "11001100"; -- 0x196C
+ when 006509 => D <= "11100000"; -- 0x196D
+ when 006510 => D <= "00110000"; -- 0x196E
+ when 006511 => D <= "11100011"; -- 0x196F
+ when 006512 => D <= "11111010"; -- 0x1970
+ when 006513 => D <= "00110000"; -- 0x1971
+ when 006514 => D <= "10110000"; -- 0x1972
+ when 006515 => D <= "11101110"; -- 0x1973
+ when 006516 => D <= "00100000"; -- 0x1974
+ when 006517 => D <= "10110000"; -- 0x1975
+ when 006518 => D <= "11111101"; -- 0x1976
+ when 006519 => D <= "00100010"; -- 0x1977
+ when 006520 => D <= "00101100"; -- 0x1978
+ when 006521 => D <= "00100000"; -- 0x1979
+ when 006522 => D <= "01001001"; -- 0x197A
+ when 006523 => D <= "11001110"; -- 0x197B
+ when 006524 => D <= "11010100"; -- 0x197C
+ when 006525 => D <= "11000101"; -- 0x197D
+ when 006526 => D <= "11001100"; -- 0x197E
+ when 006527 => D <= "10100000"; -- 0x197F
+ when 006528 => D <= "11000011"; -- 0x1980
+ when 006529 => D <= "11001111"; -- 0x1981
+ when 006530 => D <= "11010010"; -- 0x1982
+ when 006531 => D <= "11010000"; -- 0x1983
+ when 006532 => D <= "00101110"; -- 0x1984
+ when 006533 => D <= "00100000"; -- 0x1985
+ when 006534 => D <= "00110001"; -- 0x1986
+ when 006535 => D <= "10111001"; -- 0x1987
+ when 006536 => D <= "00111000"; -- 0x1988
+ when 006537 => D <= "00110101"; -- 0x1989
+ when 006538 => D <= "00100010"; -- 0x198A
+ when 006539 => D <= "--------"; -- 0x198B
+ when 006540 => D <= "--------"; -- 0x198C
+ when 006541 => D <= "--------"; -- 0x198D
+ when 006542 => D <= "--------"; -- 0x198E
+ when 006543 => D <= "--------"; -- 0x198F
+ when 006544 => D <= "00000010"; -- 0x1990
+ when 006545 => D <= "00000111"; -- 0x1991
+ when 006546 => D <= "00001011"; -- 0x1992
+ when 006547 => D <= "00100001"; -- 0x1993
+ when 006548 => D <= "10110111"; -- 0x1994
+ when 006549 => D <= "00100001"; -- 0x1995
+ when 006550 => D <= "10101101"; -- 0x1996
+ when 006551 => D <= "01000001"; -- 0x1997
+ when 006552 => D <= "01101010"; -- 0x1998
+ when 006553 => D <= "01000001"; -- 0x1999
+ when 006554 => D <= "10011010"; -- 0x199A
+ when 006555 => D <= "01000001"; -- 0x199B
+ when 006556 => D <= "11001111"; -- 0x199C
+ when 006557 => D <= "10000001"; -- 0x199D
+ when 006558 => D <= "10010110"; -- 0x199E
+ when 006559 => D <= "10000001"; -- 0x199F
+ when 006560 => D <= "11001111"; -- 0x19A0
+ when 006561 => D <= "10100001"; -- 0x19A1
+ when 006562 => D <= "10000111"; -- 0x19A2
+ when 006563 => D <= "11100001"; -- 0x19A3
+ when 006564 => D <= "00000100"; -- 0x19A4
+ when 006565 => D <= "11000001"; -- 0x19A5
+ when 006566 => D <= "10101011"; -- 0x19A6
+ when 006567 => D <= "11000001"; -- 0x19A7
+ when 006568 => D <= "11100000"; -- 0x19A8
+ when 006569 => D <= "11100001"; -- 0x19A9
+ when 006570 => D <= "01001100"; -- 0x19AA
+ when 006571 => D <= "10000001"; -- 0x19AB
+ when 006572 => D <= "11000011"; -- 0x19AC
+ when 006573 => D <= "01110101"; -- 0x19AD
+ when 006574 => D <= "10100000"; -- 0x19AE
+ when 006575 => D <= "00000001"; -- 0x19AF
+ when 006576 => D <= "10101000"; -- 0x19B0
+ when 006577 => D <= "00001001"; -- 0x19B1
+ when 006578 => D <= "00011000"; -- 0x19B2
+ when 006579 => D <= "11100010"; -- 0x19B3
+ when 006580 => D <= "10110010"; -- 0x19B4
+ when 006581 => D <= "11100000"; -- 0x19B5
+ when 006582 => D <= "11110010"; -- 0x19B6
+ when 006583 => D <= "10010001"; -- 0x19B7
+ when 006584 => D <= "01110111"; -- 0x19B8
+ when 006585 => D <= "11101111"; -- 0x19B9
+ when 006586 => D <= "01100000"; -- 0x19BA
+ when 006587 => D <= "00001101"; -- 0x19BB
+ when 006588 => D <= "10111110"; -- 0x19BC
+ when 006589 => D <= "00000000"; -- 0x19BD
+ when 006590 => D <= "00010010"; -- 0x19BE
+ when 006591 => D <= "10010001"; -- 0x19BF
+ when 006592 => D <= "01101011"; -- 0x19C0
+ when 006593 => D <= "01111111"; -- 0x19C1
+ when 006594 => D <= "00000110"; -- 0x19C2
+ when 006595 => D <= "11100010"; -- 0x19C3
+ when 006596 => D <= "11110011"; -- 0x19C4
+ when 006597 => D <= "00011000"; -- 0x19C5
+ when 006598 => D <= "00011001"; -- 0x19C6
+ when 006599 => D <= "11011111"; -- 0x19C7
+ when 006600 => D <= "11111010"; -- 0x19C8
+ when 006601 => D <= "11100101"; -- 0x19C9
+ when 006602 => D <= "00001001"; -- 0x19CA
+ when 006603 => D <= "00100100"; -- 0x19CB
+ when 006604 => D <= "00000110"; -- 0x19CC
+ when 006605 => D <= "11110101"; -- 0x19CD
+ when 006606 => D <= "00001001"; -- 0x19CE
+ when 006607 => D <= "11100100"; -- 0x19CF
+ when 006608 => D <= "00100010"; -- 0x19D0
+ when 006609 => D <= "10011110"; -- 0x19D1
+ when 006610 => D <= "10001111"; -- 0x19D2
+ when 006611 => D <= "00110000"; -- 0x19D3
+ when 006612 => D <= "10001100"; -- 0x19D4
+ when 006613 => D <= "00101111"; -- 0x19D5
+ when 006614 => D <= "01010000"; -- 0x19D6
+ when 006615 => D <= "00001001"; -- 0x19D7
+ when 006616 => D <= "10001110"; -- 0x19D8
+ when 006617 => D <= "00110000"; -- 0x19D9
+ when 006618 => D <= "10001011"; -- 0x19DA
+ when 006619 => D <= "00101111"; -- 0x19DB
+ when 006620 => D <= "11110100"; -- 0x19DC
+ when 006621 => D <= "00000100"; -- 0x19DD
+ when 006622 => D <= "11001000"; -- 0x19DE
+ when 006623 => D <= "11001001"; -- 0x19DF
+ when 006624 => D <= "11001000"; -- 0x19E0
+ when 006625 => D <= "11111111"; -- 0x19E1
+ when 006626 => D <= "11000010"; -- 0x19E2
+ when 006627 => D <= "00100011"; -- 0x19E3
+ when 006628 => D <= "10111101"; -- 0x19E4
+ when 006629 => D <= "00000000"; -- 0x19E5
+ when 006630 => D <= "00000010"; -- 0x19E6
+ when 006631 => D <= "11010010"; -- 0x19E7
+ when 006632 => D <= "00100011"; -- 0x19E8
+ when 006633 => D <= "10010001"; -- 0x19E9
+ when 006634 => D <= "10001000"; -- 0x19EA
+ when 006635 => D <= "10111111"; -- 0x19EB
+ when 006636 => D <= "00001011"; -- 0x19EC
+ when 006637 => D <= "00000000"; -- 0x19ED
+ when 006638 => D <= "01000000"; -- 0x19EE
+ when 006639 => D <= "00000010"; -- 0x19EF
+ when 006640 => D <= "01111111"; -- 0x19F0
+ when 006641 => D <= "00001010"; -- 0x19F1
+ when 006642 => D <= "01110101"; -- 0x19F2
+ when 006643 => D <= "00101010"; -- 0x19F3
+ when 006644 => D <= "00000000"; -- 0x19F4
+ when 006645 => D <= "01110001"; -- 0x19F5
+ when 006646 => D <= "11001000"; -- 0x19F6
+ when 006647 => D <= "01111111"; -- 0x19F7
+ when 006648 => D <= "00000100"; -- 0x19F8
+ when 006649 => D <= "01111001"; -- 0x19F9
+ when 006650 => D <= "00101110"; -- 0x19FA
+ when 006651 => D <= "01110100"; -- 0x19FB
+ when 006652 => D <= "10011110"; -- 0x19FC
+ when 006653 => D <= "11000011"; -- 0x19FD
+ when 006654 => D <= "10011100"; -- 0x19FE
+ when 006655 => D <= "11010100"; -- 0x19FF
+ when 006656 => D <= "11001100"; -- 0x1A00
+ when 006657 => D <= "01110000"; -- 0x1A01
+ when 006658 => D <= "00000001"; -- 0x1A02
+ when 006659 => D <= "11111100"; -- 0x1A03
+ when 006660 => D <= "10110100"; -- 0x1A04
+ when 006661 => D <= "01010000"; -- 0x1A05
+ when 006662 => D <= "00000000"; -- 0x1A06
+ when 006663 => D <= "00110000"; -- 0x1A07
+ when 006664 => D <= "00100011"; -- 0x1A08
+ when 006665 => D <= "00011000"; -- 0x1A09
+ when 006666 => D <= "10110011"; -- 0x1A0A
+ when 006667 => D <= "01010001"; -- 0x1A0B
+ when 006668 => D <= "00011001"; -- 0x1A0C
+ when 006669 => D <= "01010000"; -- 0x1A0D
+ when 006670 => D <= "00001000"; -- 0x1A0E
+ when 006671 => D <= "00000101"; -- 0x1A0F
+ when 006672 => D <= "00101010"; -- 0x1A10
+ when 006673 => D <= "01111111"; -- 0x1A11
+ when 006674 => D <= "00000001"; -- 0x1A12
+ when 006675 => D <= "01110001"; -- 0x1A13
+ when 006676 => D <= "11001000"; -- 0x1A14
+ when 006677 => D <= "01110001"; -- 0x1A15
+ when 006678 => D <= "01111111"; -- 0x1A16
+ when 006679 => D <= "01100001"; -- 0x1A17
+ when 006680 => D <= "01110000"; -- 0x1A18
+ when 006681 => D <= "11100010"; -- 0x1A19
+ when 006682 => D <= "00110111"; -- 0x1A1A
+ when 006683 => D <= "11010100"; -- 0x1A1B
+ when 006684 => D <= "11110111"; -- 0x1A1C
+ when 006685 => D <= "00011000"; -- 0x1A1D
+ when 006686 => D <= "00011001"; -- 0x1A1E
+ when 006687 => D <= "11011111"; -- 0x1A1F
+ when 006688 => D <= "11111000"; -- 0x1A20
+ when 006689 => D <= "00100010"; -- 0x1A21
+ when 006690 => D <= "11100010"; -- 0x1A22
+ when 006691 => D <= "11111110"; -- 0x1A23
+ when 006692 => D <= "11100100"; -- 0x1A24
+ when 006693 => D <= "00110100"; -- 0x1A25
+ when 006694 => D <= "10011001"; -- 0x1A26
+ when 006695 => D <= "10010111"; -- 0x1A27
+ when 006696 => D <= "00101110"; -- 0x1A28
+ when 006697 => D <= "11010100"; -- 0x1A29
+ when 006698 => D <= "11110111"; -- 0x1A2A
+ when 006699 => D <= "00011000"; -- 0x1A2B
+ when 006700 => D <= "00011001"; -- 0x1A2C
+ when 006701 => D <= "11011111"; -- 0x1A2D
+ when 006702 => D <= "11110011"; -- 0x1A2E
+ when 006703 => D <= "01000000"; -- 0x1A2F
+ when 006704 => D <= "00010001"; -- 0x1A30
+ when 006705 => D <= "10110010"; -- 0x1A31
+ when 006706 => D <= "01111000"; -- 0x1A32
+ when 006707 => D <= "01111001"; -- 0x1A33
+ when 006708 => D <= "00101110"; -- 0x1A34
+ when 006709 => D <= "01111111"; -- 0x1A35
+ when 006710 => D <= "00000100"; -- 0x1A36
+ when 006711 => D <= "01110100"; -- 0x1A37
+ when 006712 => D <= "10011010"; -- 0x1A38
+ when 006713 => D <= "10010111"; -- 0x1A39
+ when 006714 => D <= "00100100"; -- 0x1A3A
+ when 006715 => D <= "00000000"; -- 0x1A3B
+ when 006716 => D <= "11010100"; -- 0x1A3C
+ when 006717 => D <= "11110111"; -- 0x1A3D
+ when 006718 => D <= "00011001"; -- 0x1A3E
+ when 006719 => D <= "10110011"; -- 0x1A3F
+ when 006720 => D <= "11011111"; -- 0x1A40
+ when 006721 => D <= "11110101"; -- 0x1A41
+ when 006722 => D <= "01111000"; -- 0x1A42
+ when 006723 => D <= "00101011"; -- 0x1A43
+ when 006724 => D <= "01111111"; -- 0x1A44
+ when 006725 => D <= "00000000"; -- 0x1A45
+ when 006726 => D <= "11100110"; -- 0x1A46
+ when 006727 => D <= "01110000"; -- 0x1A47
+ when 006728 => D <= "00001000"; -- 0x1A48
+ when 006729 => D <= "00001111"; -- 0x1A49
+ when 006730 => D <= "00001111"; -- 0x1A4A
+ when 006731 => D <= "00001000"; -- 0x1A4B
+ when 006732 => D <= "10111000"; -- 0x1A4C
+ when 006733 => D <= "00101111"; -- 0x1A4D
+ when 006734 => D <= "11110111"; -- 0x1A4E
+ when 006735 => D <= "01100001"; -- 0x1A4F
+ when 006736 => D <= "10111000"; -- 0x1A50
+ when 006737 => D <= "10110100"; -- 0x1A51
+ when 006738 => D <= "00010000"; -- 0x1A52
+ when 006739 => D <= "00000000"; -- 0x1A53
+ when 006740 => D <= "01010000"; -- 0x1A54
+ when 006741 => D <= "00000001"; -- 0x1A55
+ when 006742 => D <= "00001111"; -- 0x1A56
+ when 006743 => D <= "11100101"; -- 0x1A57
+ when 006744 => D <= "00110000"; -- 0x1A58
+ when 006745 => D <= "11000011"; -- 0x1A59
+ when 006746 => D <= "10011111"; -- 0x1A5A
+ when 006747 => D <= "01100000"; -- 0x1A5B
+ when 006748 => D <= "00001011"; -- 0x1A5C
+ when 006749 => D <= "01000000"; -- 0x1A5D
+ when 006750 => D <= "00001001"; -- 0x1A5E
+ when 006751 => D <= "11110101"; -- 0x1A5F
+ when 006752 => D <= "00110000"; -- 0x1A60
+ when 006753 => D <= "10010001"; -- 0x1A61
+ when 006754 => D <= "00000010"; -- 0x1A62
+ when 006755 => D <= "01110101"; -- 0x1A63
+ when 006756 => D <= "00101010"; -- 0x1A64
+ when 006757 => D <= "00000000"; -- 0x1A65
+ when 006758 => D <= "01100001"; -- 0x1A66
+ when 006759 => D <= "01110000"; -- 0x1A67
+ when 006760 => D <= "01100001"; -- 0x1A68
+ when 006761 => D <= "10110010"; -- 0x1A69
+ when 006762 => D <= "10010001"; -- 0x1A6A
+ when 006763 => D <= "01110111"; -- 0x1A6B
+ when 006764 => D <= "11100101"; -- 0x1A6C
+ when 006765 => D <= "00001001"; -- 0x1A6D
+ when 006766 => D <= "00100100"; -- 0x1A6E
+ when 006767 => D <= "00001100"; -- 0x1A6F
+ when 006768 => D <= "11110101"; -- 0x1A70
+ when 006769 => D <= "00001001"; -- 0x1A71
+ when 006770 => D <= "11101110"; -- 0x1A72
+ when 006771 => D <= "11000010"; -- 0x1A73
+ when 006772 => D <= "11010101"; -- 0x1A74
+ when 006773 => D <= "10011111"; -- 0x1A75
+ when 006774 => D <= "01100000"; -- 0x1A76
+ when 006775 => D <= "00001010"; -- 0x1A77
+ when 006776 => D <= "01000000"; -- 0x1A78
+ when 006777 => D <= "00000011"; -- 0x1A79
+ when 006778 => D <= "11101011"; -- 0x1A7A
+ when 006779 => D <= "10000000"; -- 0x1A7B
+ when 006780 => D <= "00000001"; -- 0x1A7C
+ when 006781 => D <= "11101100"; -- 0x1A7D
+ when 006782 => D <= "01100000"; -- 0x1A7E
+ when 006783 => D <= "00000001"; -- 0x1A7F
+ when 006784 => D <= "10110011"; -- 0x1A80
+ when 006785 => D <= "00100010"; -- 0x1A81
+ when 006786 => D <= "10111101"; -- 0x1A82
+ when 006787 => D <= "00000000"; -- 0x1A83
+ when 006788 => D <= "11110101"; -- 0x1A84
+ when 006789 => D <= "01111111"; -- 0x1A85
+ when 006790 => D <= "00000100"; -- 0x1A86
+ when 006791 => D <= "00011000"; -- 0x1A87
+ when 006792 => D <= "00011000"; -- 0x1A88
+ when 006793 => D <= "00011000"; -- 0x1A89
+ when 006794 => D <= "00011001"; -- 0x1A8A
+ when 006795 => D <= "00011001"; -- 0x1A8B
+ when 006796 => D <= "00011001"; -- 0x1A8C
+ when 006797 => D <= "11100010"; -- 0x1A8D
+ when 006798 => D <= "11111110"; -- 0x1A8E
+ when 006799 => D <= "11100011"; -- 0x1A8F
+ when 006800 => D <= "10011110"; -- 0x1A90
+ when 006801 => D <= "01110000"; -- 0x1A91
+ when 006802 => D <= "11101010"; -- 0x1A92
+ when 006803 => D <= "00001000"; -- 0x1A93
+ when 006804 => D <= "00001001"; -- 0x1A94
+ when 006805 => D <= "11011111"; -- 0x1A95
+ when 006806 => D <= "11110110"; -- 0x1A96
+ when 006807 => D <= "11010010"; -- 0x1A97
+ when 006808 => D <= "11010101"; -- 0x1A98
+ when 006809 => D <= "00100010"; -- 0x1A99
+ when 006810 => D <= "10010001"; -- 0x1A9A
+ when 006811 => D <= "01110101"; -- 0x1A9B
+ when 006812 => D <= "10111110"; -- 0x1A9C
+ when 006813 => D <= "00000000"; -- 0x1A9D
+ when 006814 => D <= "00000010"; -- 0x1A9E
+ when 006815 => D <= "01100001"; -- 0x1A9F
+ when 006816 => D <= "10111000"; -- 0x1AA0
+ when 006817 => D <= "10001101"; -- 0x1AA1
+ when 006818 => D <= "00101111"; -- 0x1AA2
+ when 006819 => D <= "11101111"; -- 0x1AA3
+ when 006820 => D <= "01100000"; -- 0x1AA4
+ when 006821 => D <= "11111001"; -- 0x1AA5
+ when 006822 => D <= "00101110"; -- 0x1AA6
+ when 006823 => D <= "00100000"; -- 0x1AA7
+ when 006824 => D <= "11100111"; -- 0x1AA8
+ when 006825 => D <= "00000101"; -- 0x1AA9
+ when 006826 => D <= "00010000"; -- 0x1AAA
+ when 006827 => D <= "11010111"; -- 0x1AAB
+ when 006828 => D <= "00000110"; -- 0x1AAC
+ when 006829 => D <= "01100001"; -- 0x1AAD
+ when 006830 => D <= "10110010"; -- 0x1AAE
+ when 006831 => D <= "01010000"; -- 0x1AAF
+ when 006832 => D <= "00000010"; -- 0x1AB0
+ when 006833 => D <= "01100001"; -- 0x1AB1
+ when 006834 => D <= "10100001"; -- 0x1AB2
+ when 006835 => D <= "10010100"; -- 0x1AB3
+ when 006836 => D <= "10000001"; -- 0x1AB4
+ when 006837 => D <= "11111110"; -- 0x1AB5
+ when 006838 => D <= "01110001"; -- 0x1AB6
+ when 006839 => D <= "10001011"; -- 0x1AB7
+ when 006840 => D <= "01111011"; -- 0x1AB8
+ when 006841 => D <= "00000100"; -- 0x1AB9
+ when 006842 => D <= "10101100"; -- 0x1ABA
+ when 006843 => D <= "00000001"; -- 0x1ABB
+ when 006844 => D <= "10001100"; -- 0x1ABC
+ when 006845 => D <= "00000001"; -- 0x1ABD
+ when 006846 => D <= "11100011"; -- 0x1ABE
+ when 006847 => D <= "11111010"; -- 0x1ABF
+ when 006848 => D <= "10010001"; -- 0x1AC0
+ when 006849 => D <= "00111000"; -- 0x1AC1
+ when 006850 => D <= "11101010"; -- 0x1AC2
+ when 006851 => D <= "11000100"; -- 0x1AC3
+ when 006852 => D <= "10010001"; -- 0x1AC4
+ when 006853 => D <= "00111000"; -- 0x1AC5
+ when 006854 => D <= "00011100"; -- 0x1AC6
+ when 006855 => D <= "11011011"; -- 0x1AC7
+ when 006856 => D <= "11110011"; -- 0x1AC8
+ when 006857 => D <= "10001110"; -- 0x1AC9
+ when 006858 => D <= "00110000"; -- 0x1ACA
+ when 006859 => D <= "10001101"; -- 0x1ACB
+ when 006860 => D <= "00101111"; -- 0x1ACC
+ when 006861 => D <= "01100001"; -- 0x1ACD
+ when 006862 => D <= "00110000"; -- 0x1ACE
+ when 006863 => D <= "10010001"; -- 0x1ACF
+ when 006864 => D <= "01110111"; -- 0x1AD0
+ when 006865 => D <= "10001101"; -- 0x1AD1
+ when 006866 => D <= "00101111"; -- 0x1AD2
+ when 006867 => D <= "10111111"; -- 0x1AD3
+ when 006868 => D <= "00000000"; -- 0x1AD4
+ when 006869 => D <= "00000110"; -- 0x1AD5
+ when 006870 => D <= "01110001"; -- 0x1AD6
+ when 006871 => D <= "10100001"; -- 0x1AD7
+ when 006872 => D <= "11100100"; -- 0x1AD8
+ when 006873 => D <= "11010010"; -- 0x1AD9
+ when 006874 => D <= "11100011"; -- 0x1ADA
+ when 006875 => D <= "00100010"; -- 0x1ADB
+ when 006876 => D <= "11101110"; -- 0x1ADC
+ when 006877 => D <= "01100000"; -- 0x1ADD
+ when 006878 => D <= "11000000"; -- 0x1ADE
+ when 006879 => D <= "10011111"; -- 0x1ADF
+ when 006880 => D <= "00100000"; -- 0x1AE0
+ when 006881 => D <= "11100111"; -- 0x1AE1
+ when 006882 => D <= "00000100"; -- 0x1AE2
+ when 006883 => D <= "01010000"; -- 0x1AE3
+ when 006884 => D <= "00000100"; -- 0x1AE4
+ when 006885 => D <= "01100001"; -- 0x1AE5
+ when 006886 => D <= "10110010"; -- 0x1AE6
+ when 006887 => D <= "01010000"; -- 0x1AE7
+ when 006888 => D <= "11001000"; -- 0x1AE8
+ when 006889 => D <= "00100100"; -- 0x1AE9
+ when 006890 => D <= "10000001"; -- 0x1AEA
+ when 006891 => D <= "11110101"; -- 0x1AEB
+ when 006892 => D <= "00110000"; -- 0x1AEC
+ when 006893 => D <= "10010001"; -- 0x1AED
+ when 006894 => D <= "10001000"; -- 0x1AEE
+ when 006895 => D <= "01111010"; -- 0x1AEF
+ when 006896 => D <= "00110100"; -- 0x1AF0
+ when 006897 => D <= "10101011"; -- 0x1AF1
+ when 006898 => D <= "00000000"; -- 0x1AF2
+ when 006899 => D <= "01110101"; -- 0x1AF3
+ when 006900 => D <= "00101010"; -- 0x1AF4
+ when 006901 => D <= "00000000"; -- 0x1AF5
+ when 006902 => D <= "01111101"; -- 0x1AF6
+ when 006903 => D <= "11111111"; -- 0x1AF7
+ when 006904 => D <= "11010011"; -- 0x1AF8
+ when 006905 => D <= "10001011"; -- 0x1AF9
+ when 006906 => D <= "00000000"; -- 0x1AFA
+ when 006907 => D <= "01111001"; -- 0x1AFB
+ when 006908 => D <= "00101110"; -- 0x1AFC
+ when 006909 => D <= "01111111"; -- 0x1AFD
+ when 006910 => D <= "00000100"; -- 0x1AFE
+ when 006911 => D <= "01010000"; -- 0x1AFF
+ when 006912 => D <= "00010111"; -- 0x1B00
+ when 006913 => D <= "11100010"; -- 0x1B01
+ when 006914 => D <= "11111110"; -- 0x1B02
+ when 006915 => D <= "11100100"; -- 0x1B03
+ when 006916 => D <= "00110100"; -- 0x1B04
+ when 006917 => D <= "10011001"; -- 0x1B05
+ when 006918 => D <= "10011110"; -- 0x1B06
+ when 006919 => D <= "00100111"; -- 0x1B07
+ when 006920 => D <= "11010100"; -- 0x1B08
+ when 006921 => D <= "11110111"; -- 0x1B09
+ when 006922 => D <= "00011000"; -- 0x1B0A
+ when 006923 => D <= "00011001"; -- 0x1B0B
+ when 006924 => D <= "11011111"; -- 0x1B0C
+ when 006925 => D <= "11110011"; -- 0x1B0D
+ when 006926 => D <= "00001101"; -- 0x1B0E
+ when 006927 => D <= "01000000"; -- 0x1B0F
+ when 006928 => D <= "11101000"; -- 0x1B10
+ when 006929 => D <= "11100111"; -- 0x1B11
+ when 006930 => D <= "10010100"; -- 0x1B12
+ when 006931 => D <= "00000001"; -- 0x1B13
+ when 006932 => D <= "11110111"; -- 0x1B14
+ when 006933 => D <= "10110011"; -- 0x1B15
+ when 006934 => D <= "10000000"; -- 0x1B16
+ when 006935 => D <= "11100001"; -- 0x1B17
+ when 006936 => D <= "01010001"; -- 0x1B18
+ when 006937 => D <= "00011001"; -- 0x1B19
+ when 006938 => D <= "01110111"; -- 0x1B1A
+ when 006939 => D <= "00000000"; -- 0x1B1B
+ when 006940 => D <= "10001010"; -- 0x1B1C
+ when 006941 => D <= "00000000"; -- 0x1B1D
+ when 006942 => D <= "10100110"; -- 0x1B1E
+ when 006943 => D <= "00000101"; -- 0x1B1F
+ when 006944 => D <= "00001010"; -- 0x1B20
+ when 006945 => D <= "01111111"; -- 0x1B21
+ when 006946 => D <= "00000001"; -- 0x1B22
+ when 006947 => D <= "10010001"; -- 0x1B23
+ when 006948 => D <= "00000000"; -- 0x1B24
+ when 006949 => D <= "10111010"; -- 0x1B25
+ when 006950 => D <= "00111110"; -- 0x1B26
+ when 006951 => D <= "11001110"; -- 0x1B27
+ when 006952 => D <= "11010101"; -- 0x1B28
+ when 006953 => D <= "00110000"; -- 0x1B29
+ when 006954 => D <= "00000010"; -- 0x1B2A
+ when 006955 => D <= "01100001"; -- 0x1B2B
+ when 006956 => D <= "10110010"; -- 0x1B2C
+ when 006957 => D <= "01110101"; -- 0x1B2D
+ when 006958 => D <= "00101010"; -- 0x1B2E
+ when 006959 => D <= "00000000"; -- 0x1B2F
+ when 006960 => D <= "01111000"; -- 0x1B30
+ when 006961 => D <= "00110100"; -- 0x1B31
+ when 006962 => D <= "11100110"; -- 0x1B32
+ when 006963 => D <= "11111110"; -- 0x1B33
+ when 006964 => D <= "01100000"; -- 0x1B34
+ when 006965 => D <= "00000011"; -- 0x1B35
+ when 006966 => D <= "01110001"; -- 0x1B36
+ when 006967 => D <= "01111111"; -- 0x1B37
+ when 006968 => D <= "00011000"; -- 0x1B38
+ when 006969 => D <= "00001000"; -- 0x1B39
+ when 006970 => D <= "01110100"; -- 0x1B3A
+ when 006971 => D <= "00001000"; -- 0x1B3B
+ when 006972 => D <= "11111001"; -- 0x1B3C
+ when 006973 => D <= "00101000"; -- 0x1B3D
+ when 006974 => D <= "11111000"; -- 0x1B3E
+ when 006975 => D <= "10110110"; -- 0x1B3F
+ when 006976 => D <= "00000101"; -- 0x1B40
+ when 006977 => D <= "00000000"; -- 0x1B41
+ when 006978 => D <= "01000000"; -- 0x1B42
+ when 006979 => D <= "00010011"; -- 0x1B43
+ when 006980 => D <= "11010011"; -- 0x1B44
+ when 006981 => D <= "11100100"; -- 0x1B45
+ when 006982 => D <= "00011000"; -- 0x1B46
+ when 006983 => D <= "00110110"; -- 0x1B47
+ when 006984 => D <= "11010100"; -- 0x1B48
+ when 006985 => D <= "11010110"; -- 0x1B49
+ when 006986 => D <= "00110000"; -- 0x1B4A
+ when 006987 => D <= "11100100"; -- 0x1B4B
+ when 006988 => D <= "00001001"; -- 0x1B4C
+ when 006989 => D <= "11011001"; -- 0x1B4D
+ when 006990 => D <= "11110101"; -- 0x1B4E
+ when 006991 => D <= "00011000"; -- 0x1B4F
+ when 006992 => D <= "01110110"; -- 0x1B50
+ when 006993 => D <= "00000001"; -- 0x1B51
+ when 006994 => D <= "01110001"; -- 0x1B52
+ when 006995 => D <= "01111111"; -- 0x1B53
+ when 006996 => D <= "10000000"; -- 0x1B54
+ when 006997 => D <= "00000110"; -- 0x1B55
+ when 006998 => D <= "00011001"; -- 0x1B56
+ when 006999 => D <= "11101001"; -- 0x1B57
+ when 007000 => D <= "11000011"; -- 0x1B58
+ when 007001 => D <= "11001000"; -- 0x1B59
+ when 007002 => D <= "10011000"; -- 0x1B5A
+ when 007003 => D <= "11111000"; -- 0x1B5B
+ when 007004 => D <= "01111001"; -- 0x1B5C
+ when 007005 => D <= "00101011"; -- 0x1B5D
+ when 007006 => D <= "11100110"; -- 0x1B5E
+ when 007007 => D <= "11000100"; -- 0x1B5F
+ when 007008 => D <= "00001000"; -- 0x1B60
+ when 007009 => D <= "11010110"; -- 0x1B61
+ when 007010 => D <= "01000010"; -- 0x1B62
+ when 007011 => D <= "00000110"; -- 0x1B63
+ when 007012 => D <= "11110111"; -- 0x1B64
+ when 007013 => D <= "00001000"; -- 0x1B65
+ when 007014 => D <= "00001001"; -- 0x1B66
+ when 007015 => D <= "10111001"; -- 0x1B67
+ when 007016 => D <= "00101111"; -- 0x1B68
+ when 007017 => D <= "11110100"; -- 0x1B69
+ when 007018 => D <= "11101110"; -- 0x1B6A
+ when 007019 => D <= "01110000"; -- 0x1B6B
+ when 007020 => D <= "00000011"; -- 0x1B6C
+ when 007021 => D <= "01110101"; -- 0x1B6D
+ when 007022 => D <= "00110000"; -- 0x1B6E
+ when 007023 => D <= "00000000"; -- 0x1B6F
+ when 007024 => D <= "10010001"; -- 0x1B70
+ when 007025 => D <= "01101011"; -- 0x1B71
+ when 007026 => D <= "10001001"; -- 0x1B72
+ when 007027 => D <= "00001001"; -- 0x1B73
+ when 007028 => D <= "01111000"; -- 0x1B74
+ when 007029 => D <= "00110000"; -- 0x1B75
+ when 007030 => D <= "11100110"; -- 0x1B76
+ when 007031 => D <= "11110011"; -- 0x1B77
+ when 007032 => D <= "00011000"; -- 0x1B78
+ when 007033 => D <= "00011001"; -- 0x1B79
+ when 007034 => D <= "10111000"; -- 0x1B7A
+ when 007035 => D <= "00101010"; -- 0x1B7B
+ when 007036 => D <= "11111001"; -- 0x1B7C
+ when 007037 => D <= "11100100"; -- 0x1B7D
+ when 007038 => D <= "00100010"; -- 0x1B7E
+ when 007039 => D <= "00000101"; -- 0x1B7F
+ when 007040 => D <= "00110000"; -- 0x1B80
+ when 007041 => D <= "11100101"; -- 0x1B81
+ when 007042 => D <= "00110000"; -- 0x1B82
+ when 007043 => D <= "01110000"; -- 0x1B83
+ when 007044 => D <= "11111001"; -- 0x1B84
+ when 007045 => D <= "11010000"; -- 0x1B85
+ when 007046 => D <= "11100000"; -- 0x1B86
+ when 007047 => D <= "11010000"; -- 0x1B87
+ when 007048 => D <= "11100000"; -- 0x1B88
+ when 007049 => D <= "01100001"; -- 0x1B89
+ when 007050 => D <= "10100001"; -- 0x1B8A
+ when 007051 => D <= "11000000"; -- 0x1B8B
+ when 007052 => D <= "00000001"; -- 0x1B8C
+ when 007053 => D <= "01111001"; -- 0x1B8D
+ when 007054 => D <= "00110010"; -- 0x1B8E
+ when 007055 => D <= "11100010"; -- 0x1B8F
+ when 007056 => D <= "01010100"; -- 0x1B90
+ when 007057 => D <= "00001111"; -- 0x1B91
+ when 007058 => D <= "11110111"; -- 0x1B92
+ when 007059 => D <= "11100010"; -- 0x1B93
+ when 007060 => D <= "11000100"; -- 0x1B94
+ when 007061 => D <= "01010100"; -- 0x1B95
+ when 007062 => D <= "00001111"; -- 0x1B96
+ when 007063 => D <= "00011001"; -- 0x1B97
+ when 007064 => D <= "11110111"; -- 0x1B98
+ when 007065 => D <= "00011000"; -- 0x1B99
+ when 007066 => D <= "00011001"; -- 0x1B9A
+ when 007067 => D <= "10111001"; -- 0x1B9B
+ when 007068 => D <= "00101010"; -- 0x1B9C
+ when 007069 => D <= "11110001"; -- 0x1B9D
+ when 007070 => D <= "11010000"; -- 0x1B9E
+ when 007071 => D <= "00000001"; -- 0x1B9F
+ when 007072 => D <= "00100010"; -- 0x1BA0
+ when 007073 => D <= "01111000"; -- 0x1BA1
+ when 007074 => D <= "00101110"; -- 0x1BA2
+ when 007075 => D <= "01110100"; -- 0x1BA3
+ when 007076 => D <= "10011001"; -- 0x1BA4
+ when 007077 => D <= "11110110"; -- 0x1BA5
+ when 007078 => D <= "00011000"; -- 0x1BA6
+ when 007079 => D <= "10111000"; -- 0x1BA7
+ when 007080 => D <= "00101010"; -- 0x1BA8
+ when 007081 => D <= "11111011"; -- 0x1BA9
+ when 007082 => D <= "01110101"; -- 0x1BAA
+ when 007083 => D <= "00110000"; -- 0x1BAB
+ when 007084 => D <= "11111111"; -- 0x1BAC
+ when 007085 => D <= "01110001"; -- 0x1BAD
+ when 007086 => D <= "01110000"; -- 0x1BAE
+ when 007087 => D <= "11010010"; -- 0x1BAF
+ when 007088 => D <= "11100001"; -- 0x1BB0
+ when 007089 => D <= "00100010"; -- 0x1BB1
+ when 007090 => D <= "01110001"; -- 0x1BB2
+ when 007091 => D <= "10111000"; -- 0x1BB3
+ when 007092 => D <= "11100100"; -- 0x1BB4
+ when 007093 => D <= "11010010"; -- 0x1BB5
+ when 007094 => D <= "11100000"; -- 0x1BB6
+ when 007095 => D <= "00100010"; -- 0x1BB7
+ when 007096 => D <= "01110001"; -- 0x1BB8
+ when 007097 => D <= "10111111"; -- 0x1BB9
+ when 007098 => D <= "01110001"; -- 0x1BBA
+ when 007099 => D <= "01110000"; -- 0x1BBB
+ when 007100 => D <= "11010010"; -- 0x1BBC
+ when 007101 => D <= "11100010"; -- 0x1BBD
+ when 007102 => D <= "00100010"; -- 0x1BBE
+ when 007103 => D <= "11100100"; -- 0x1BBF
+ when 007104 => D <= "01111000"; -- 0x1BC0
+ when 007105 => D <= "00111101"; -- 0x1BC1
+ when 007106 => D <= "11110110"; -- 0x1BC2
+ when 007107 => D <= "00011000"; -- 0x1BC3
+ when 007108 => D <= "10111000"; -- 0x1BC4
+ when 007109 => D <= "00101001"; -- 0x1BC5
+ when 007110 => D <= "11111011"; -- 0x1BC6
+ when 007111 => D <= "00100010"; -- 0x1BC7
+ when 007112 => D <= "01111100"; -- 0x1BC8
+ when 007113 => D <= "00000000"; -- 0x1BC9
+ when 007114 => D <= "11000011"; -- 0x1BCA
+ when 007115 => D <= "11101111"; -- 0x1BCB
+ when 007116 => D <= "01100000"; -- 0x1BCC
+ when 007117 => D <= "00100010"; -- 0x1BCD
+ when 007118 => D <= "10010100"; -- 0x1BCE
+ when 007119 => D <= "00000010"; -- 0x1BCF
+ when 007120 => D <= "01010000"; -- 0x1BD0
+ when 007121 => D <= "00011111"; -- 0x1BD1
+ when 007122 => D <= "11000000"; -- 0x1BD2
+ when 007123 => D <= "00000000"; -- 0x1BD3
+ when 007124 => D <= "11000000"; -- 0x1BD4
+ when 007125 => D <= "00000001"; -- 0x1BD5
+ when 007126 => D <= "01111001"; -- 0x1BD6
+ when 007127 => D <= "00101110"; -- 0x1BD7
+ when 007128 => D <= "01111000"; -- 0x1BD8
+ when 007129 => D <= "00101101"; -- 0x1BD9
+ when 007130 => D <= "11101100"; -- 0x1BDA
+ when 007131 => D <= "11010111"; -- 0x1BDB
+ when 007132 => D <= "11000100"; -- 0x1BDC
+ when 007133 => D <= "11111100"; -- 0x1BDD
+ when 007134 => D <= "11100111"; -- 0x1BDE
+ when 007135 => D <= "11010110"; -- 0x1BDF
+ when 007136 => D <= "11000100"; -- 0x1BE0
+ when 007137 => D <= "11110111"; -- 0x1BE1
+ when 007138 => D <= "00011000"; -- 0x1BE2
+ when 007139 => D <= "00011001"; -- 0x1BE3
+ when 007140 => D <= "10111001"; -- 0x1BE4
+ when 007141 => D <= "00101010"; -- 0x1BE5
+ when 007142 => D <= "11110111"; -- 0x1BE6
+ when 007143 => D <= "11100111"; -- 0x1BE7
+ when 007144 => D <= "11000100"; -- 0x1BE8
+ when 007145 => D <= "01010100"; -- 0x1BE9
+ when 007146 => D <= "00001111"; -- 0x1BEA
+ when 007147 => D <= "11110111"; -- 0x1BEB
+ when 007148 => D <= "11010000"; -- 0x1BEC
+ when 007149 => D <= "00000001"; -- 0x1BED
+ when 007150 => D <= "11010000"; -- 0x1BEE
+ when 007151 => D <= "00000000"; -- 0x1BEF
+ when 007152 => D <= "00100010"; -- 0x1BF0
+ when 007153 => D <= "11111111"; -- 0x1BF1
+ when 007154 => D <= "11100100"; -- 0x1BF2
+ when 007155 => D <= "11000101"; -- 0x1BF3
+ when 007156 => D <= "00101010"; -- 0x1BF4
+ when 007157 => D <= "11000101"; -- 0x1BF5
+ when 007158 => D <= "00101011"; -- 0x1BF6
+ when 007159 => D <= "11000101"; -- 0x1BF7
+ when 007160 => D <= "00101100"; -- 0x1BF8
+ when 007161 => D <= "11000101"; -- 0x1BF9
+ when 007162 => D <= "00101101"; -- 0x1BFA
+ when 007163 => D <= "11000101"; -- 0x1BFB
+ when 007164 => D <= "00101110"; -- 0x1BFC
+ when 007165 => D <= "11111100"; -- 0x1BFD
+ when 007166 => D <= "10000000"; -- 0x1BFE
+ when 007167 => D <= "11001011"; -- 0x1BFF
+ when 007168 => D <= "01111100"; -- 0x1C00
+ when 007169 => D <= "00000000"; -- 0x1C01
+ when 007170 => D <= "11000011"; -- 0x1C02
+ when 007171 => D <= "11101111"; -- 0x1C03
+ when 007172 => D <= "01100000"; -- 0x1C04
+ when 007173 => D <= "00100010"; -- 0x1C05
+ when 007174 => D <= "10010100"; -- 0x1C06
+ when 007175 => D <= "00000010"; -- 0x1C07
+ when 007176 => D <= "01010000"; -- 0x1C08
+ when 007177 => D <= "00011111"; -- 0x1C09
+ when 007178 => D <= "11000000"; -- 0x1C0A
+ when 007179 => D <= "00000000"; -- 0x1C0B
+ when 007180 => D <= "11000000"; -- 0x1C0C
+ when 007181 => D <= "00000001"; -- 0x1C0D
+ when 007182 => D <= "01111000"; -- 0x1C0E
+ when 007183 => D <= "00101010"; -- 0x1C0F
+ when 007184 => D <= "01111001"; -- 0x1C10
+ when 007185 => D <= "00101011"; -- 0x1C11
+ when 007186 => D <= "11100110"; -- 0x1C12
+ when 007187 => D <= "11000100"; -- 0x1C13
+ when 007188 => D <= "11110110"; -- 0x1C14
+ when 007189 => D <= "11100111"; -- 0x1C15
+ when 007190 => D <= "11000100"; -- 0x1C16
+ when 007191 => D <= "11010110"; -- 0x1C17
+ when 007192 => D <= "11110111"; -- 0x1C18
+ when 007193 => D <= "00001000"; -- 0x1C19
+ when 007194 => D <= "00001001"; -- 0x1C1A
+ when 007195 => D <= "10111000"; -- 0x1C1B
+ when 007196 => D <= "00101110"; -- 0x1C1C
+ when 007197 => D <= "11110111"; -- 0x1C1D
+ when 007198 => D <= "11101100"; -- 0x1C1E
+ when 007199 => D <= "11000100"; -- 0x1C1F
+ when 007200 => D <= "11010110"; -- 0x1C20
+ when 007201 => D <= "01010100"; -- 0x1C21
+ when 007202 => D <= "11110000"; -- 0x1C22
+ when 007203 => D <= "11111100"; -- 0x1C23
+ when 007204 => D <= "11010000"; -- 0x1C24
+ when 007205 => D <= "00000001"; -- 0x1C25
+ when 007206 => D <= "11010000"; -- 0x1C26
+ when 007207 => D <= "00000000"; -- 0x1C27
+ when 007208 => D <= "00100010"; -- 0x1C28
+ when 007209 => D <= "11111111"; -- 0x1C29
+ when 007210 => D <= "11100100"; -- 0x1C2A
+ when 007211 => D <= "11001100"; -- 0x1C2B
+ when 007212 => D <= "11000101"; -- 0x1C2C
+ when 007213 => D <= "00101110"; -- 0x1C2D
+ when 007214 => D <= "11000101"; -- 0x1C2E
+ when 007215 => D <= "00101101"; -- 0x1C2F
+ when 007216 => D <= "11000101"; -- 0x1C30
+ when 007217 => D <= "00101100"; -- 0x1C31
+ when 007218 => D <= "11000101"; -- 0x1C32
+ when 007219 => D <= "00101011"; -- 0x1C33
+ when 007220 => D <= "11000101"; -- 0x1C34
+ when 007221 => D <= "00101010"; -- 0x1C35
+ when 007222 => D <= "10000000"; -- 0x1C36
+ when 007223 => D <= "11001011"; -- 0x1C37
+ when 007224 => D <= "01010100"; -- 0x1C38
+ when 007225 => D <= "00001111"; -- 0x1C39
+ when 007226 => D <= "11111111"; -- 0x1C3A
+ when 007227 => D <= "01111000"; -- 0x1C3B
+ when 007228 => D <= "00111100"; -- 0x1C3C
+ when 007229 => D <= "01111001"; -- 0x1C3D
+ when 007230 => D <= "00110010"; -- 0x1C3E
+ when 007231 => D <= "11100100"; -- 0x1C3F
+ when 007232 => D <= "11110101"; -- 0x1C40
+ when 007233 => D <= "00110011"; -- 0x1C41
+ when 007234 => D <= "00011000"; -- 0x1C42
+ when 007235 => D <= "00100110"; -- 0x1C43
+ when 007236 => D <= "11010100"; -- 0x1C44
+ when 007237 => D <= "00110000"; -- 0x1C45
+ when 007238 => D <= "11100100"; -- 0x1C46
+ when 007239 => D <= "00000011"; -- 0x1C47
+ when 007240 => D <= "00011000"; -- 0x1C48
+ when 007241 => D <= "00000110"; -- 0x1C49
+ when 007242 => D <= "00001000"; -- 0x1C4A
+ when 007243 => D <= "11010110"; -- 0x1C4B
+ when 007244 => D <= "10001111"; -- 0x1C4C
+ when 007245 => D <= "11110000"; -- 0x1C4D
+ when 007246 => D <= "11100111"; -- 0x1C4E
+ when 007247 => D <= "10100100"; -- 0x1C4F
+ when 007248 => D <= "01110101"; -- 0x1C50
+ when 007249 => D <= "11110000"; -- 0x1C51
+ when 007250 => D <= "00001010"; -- 0x1C52
+ when 007251 => D <= "10000100"; -- 0x1C53
+ when 007252 => D <= "11000101"; -- 0x1C54
+ when 007253 => D <= "11110000"; -- 0x1C55
+ when 007254 => D <= "00100110"; -- 0x1C56
+ when 007255 => D <= "11010100"; -- 0x1C57
+ when 007256 => D <= "00110000"; -- 0x1C58
+ when 007257 => D <= "11100100"; -- 0x1C59
+ when 007258 => D <= "00000010"; -- 0x1C5A
+ when 007259 => D <= "00000101"; -- 0x1C5B
+ when 007260 => D <= "11110000"; -- 0x1C5C
+ when 007261 => D <= "00001000"; -- 0x1C5D
+ when 007262 => D <= "11010110"; -- 0x1C5E
+ when 007263 => D <= "00011000"; -- 0x1C5F
+ when 007264 => D <= "11100101"; -- 0x1C60
+ when 007265 => D <= "11110000"; -- 0x1C61
+ when 007266 => D <= "00011001"; -- 0x1C62
+ when 007267 => D <= "10111001"; -- 0x1C63
+ when 007268 => D <= "00101010"; -- 0x1C64
+ when 007269 => D <= "11011100"; -- 0x1C65
+ when 007270 => D <= "00100101"; -- 0x1C66
+ when 007271 => D <= "00110011"; -- 0x1C67
+ when 007272 => D <= "11010100"; -- 0x1C68
+ when 007273 => D <= "11110110"; -- 0x1C69
+ when 007274 => D <= "00100010"; -- 0x1C6A
+ when 007275 => D <= "01110101"; -- 0x1C6B
+ when 007276 => D <= "10100000"; -- 0x1C6C
+ when 007277 => D <= "00000001"; -- 0x1C6D
+ when 007278 => D <= "10101000"; -- 0x1C6E
+ when 007279 => D <= "00001001"; -- 0x1C6F
+ when 007280 => D <= "01110100"; -- 0x1C70
+ when 007281 => D <= "00000110"; -- 0x1C71
+ when 007282 => D <= "00101000"; -- 0x1C72
+ when 007283 => D <= "11111001"; -- 0x1C73
+ when 007284 => D <= "00100010"; -- 0x1C74
+ when 007285 => D <= "01110001"; -- 0x1C75
+ when 007286 => D <= "10111111"; -- 0x1C76
+ when 007287 => D <= "10010001"; -- 0x1C77
+ when 007288 => D <= "01101011"; -- 0x1C78
+ when 007289 => D <= "11100010"; -- 0x1C79
+ when 007290 => D <= "11111111"; -- 0x1C7A
+ when 007291 => D <= "11100011"; -- 0x1C7B
+ when 007292 => D <= "11111110"; -- 0x1C7C
+ when 007293 => D <= "00011000"; -- 0x1C7D
+ when 007294 => D <= "00011001"; -- 0x1C7E
+ when 007295 => D <= "11100010"; -- 0x1C7F
+ when 007296 => D <= "11111100"; -- 0x1C80
+ when 007297 => D <= "11100011"; -- 0x1C81
+ when 007298 => D <= "11111011"; -- 0x1C82
+ when 007299 => D <= "01101100"; -- 0x1C83
+ when 007300 => D <= "11111101"; -- 0x1C84
+ when 007301 => D <= "00011000"; -- 0x1C85
+ when 007302 => D <= "00011001"; -- 0x1C86
+ when 007303 => D <= "00100010"; -- 0x1C87
+ when 007304 => D <= "11000000"; -- 0x1C88
+ when 007305 => D <= "00000000"; -- 0x1C89
+ when 007306 => D <= "01111000"; -- 0x1C8A
+ when 007307 => D <= "00101110"; -- 0x1C8B
+ when 007308 => D <= "11100011"; -- 0x1C8C
+ when 007309 => D <= "11110110"; -- 0x1C8D
+ when 007310 => D <= "00011001"; -- 0x1C8E
+ when 007311 => D <= "00011000"; -- 0x1C8F
+ when 007312 => D <= "10111000"; -- 0x1C90
+ when 007313 => D <= "00101010"; -- 0x1C91
+ when 007314 => D <= "11111001"; -- 0x1C92
+ when 007315 => D <= "11010000"; -- 0x1C93
+ when 007316 => D <= "00000000"; -- 0x1C94
+ when 007317 => D <= "00100010"; -- 0x1C95
+ when 007318 => D <= "10110001"; -- 0x1C96
+ when 007319 => D <= "01101100"; -- 0x1C97
+ when 007320 => D <= "11000000"; -- 0x1C98
+ when 007321 => D <= "10000011"; -- 0x1C99
+ when 007322 => D <= "11000000"; -- 0x1C9A
+ when 007323 => D <= "10000010"; -- 0x1C9B
+ when 007324 => D <= "11100000"; -- 0x1C9C
+ when 007325 => D <= "11110001"; -- 0x1C9D
+ when 007326 => D <= "11101101"; -- 0x1C9E
+ when 007327 => D <= "01000000"; -- 0x1C9F
+ when 007328 => D <= "00010010"; -- 0x1CA0
+ when 007329 => D <= "10010001"; -- 0x1CA1
+ when 007330 => D <= "10110110"; -- 0x1CA2
+ when 007331 => D <= "01000000"; -- 0x1CA3
+ when 007332 => D <= "00001110"; -- 0x1CA4
+ when 007333 => D <= "11000010"; -- 0x1CA5
+ when 007334 => D <= "11100101"; -- 0x1CA6
+ when 007335 => D <= "10110100"; -- 0x1CA7
+ when 007336 => D <= "01001000"; -- 0x1CA8
+ when 007337 => D <= "00000011"; -- 0x1CA9
+ when 007338 => D <= "11010011"; -- 0x1CAA
+ when 007339 => D <= "10000000"; -- 0x1CAB
+ when 007340 => D <= "00000001"; -- 0x1CAC
+ when 007341 => D <= "11000011"; -- 0x1CAD
+ when 007342 => D <= "11010000"; -- 0x1CAE
+ when 007343 => D <= "10000010"; -- 0x1CAF
+ when 007344 => D <= "11010000"; -- 0x1CB0
+ when 007345 => D <= "10000011"; -- 0x1CB1
+ when 007346 => D <= "00100010"; -- 0x1CB2
+ when 007347 => D <= "10100011"; -- 0x1CB3
+ when 007348 => D <= "10000000"; -- 0x1CB4
+ when 007349 => D <= "11100110"; -- 0x1CB5
+ when 007350 => D <= "11000010"; -- 0x1CB6
+ when 007351 => D <= "11100101"; -- 0x1CB7
+ when 007352 => D <= "10110100"; -- 0x1CB8
+ when 007353 => D <= "01000111"; -- 0x1CB9
+ when 007354 => D <= "00000000"; -- 0x1CBA
+ when 007355 => D <= "01000000"; -- 0x1CBB
+ when 007356 => D <= "00000001"; -- 0x1CBC
+ when 007357 => D <= "00100010"; -- 0x1CBD
+ when 007358 => D <= "10110100"; -- 0x1CBE
+ when 007359 => D <= "01000001"; -- 0x1CBF
+ when 007360 => D <= "00000000"; -- 0x1CC0
+ when 007361 => D <= "10110011"; -- 0x1CC1
+ when 007362 => D <= "00100010"; -- 0x1CC2
+ when 007363 => D <= "01111011"; -- 0x1CC3
+ when 007364 => D <= "00000000"; -- 0x1CC4
+ when 007365 => D <= "01111001"; -- 0x1CC5
+ when 007366 => D <= "01011000"; -- 0x1CC6
+ when 007367 => D <= "11110001"; -- 0x1CC7
+ when 007368 => D <= "00000100"; -- 0x1CC8
+ when 007369 => D <= "01110100"; -- 0x1CC9
+ when 007370 => D <= "00001101"; -- 0x1CCA
+ when 007371 => D <= "11110011"; -- 0x1CCB
+ when 007372 => D <= "10010000"; -- 0x1CCC
+ when 007373 => D <= "00000000"; -- 0x1CCD
+ when 007374 => D <= "01011000"; -- 0x1CCE
+ when 007375 => D <= "01110001"; -- 0x1CCF
+ when 007376 => D <= "10111111"; -- 0x1CD0
+ when 007377 => D <= "10110001"; -- 0x1CD1
+ when 007378 => D <= "01101100"; -- 0x1CD2
+ when 007379 => D <= "10110001"; -- 0x1CD3
+ when 007380 => D <= "01110010"; -- 0x1CD4
+ when 007381 => D <= "10010010"; -- 0x1CD5
+ when 007382 => D <= "01111000"; -- 0x1CD6
+ when 007383 => D <= "01111000"; -- 0x1CD7
+ when 007384 => D <= "00110100"; -- 0x1CD8
+ when 007385 => D <= "01111110"; -- 0x1CD9
+ when 007386 => D <= "01111111"; -- 0x1CDA
+ when 007387 => D <= "11010010"; -- 0x1CDB
+ when 007388 => D <= "11010101"; -- 0x1CDC
+ when 007389 => D <= "11110001"; -- 0x1CDD
+ when 007390 => D <= "11101011"; -- 0x1CDE
+ when 007391 => D <= "01010000"; -- 0x1CDF
+ when 007392 => D <= "00000111"; -- 0x1CE0
+ when 007393 => D <= "01010100"; -- 0x1CE1
+ when 007394 => D <= "00001111"; -- 0x1CE2
+ when 007395 => D <= "10110001"; -- 0x1CE3
+ when 007396 => D <= "01000101"; -- 0x1CE4
+ when 007397 => D <= "10100011"; -- 0x1CE5
+ when 007398 => D <= "10000000"; -- 0x1CE6
+ when 007399 => D <= "11110101"; -- 0x1CE7
+ when 007400 => D <= "10110100"; -- 0x1CE8
+ when 007401 => D <= "00101110"; -- 0x1CE9
+ when 007402 => D <= "00001100"; -- 0x1CEA
+ when 007403 => D <= "00100000"; -- 0x1CEB
+ when 007404 => D <= "01010001"; -- 0x1CEC
+ when 007405 => D <= "01100011"; -- 0x1CED
+ when 007406 => D <= "11010010"; -- 0x1CEE
+ when 007407 => D <= "01010001"; -- 0x1CEF
+ when 007408 => D <= "10111000"; -- 0x1CF0
+ when 007409 => D <= "00110100"; -- 0x1CF1
+ when 007410 => D <= "11110010"; -- 0x1CF2
+ when 007411 => D <= "11010010"; -- 0x1CF3
+ when 007412 => D <= "01010010"; -- 0x1CF4
+ when 007413 => D <= "10000000"; -- 0x1CF5
+ when 007414 => D <= "11101110"; -- 0x1CF6
+ when 007415 => D <= "00100000"; -- 0x1CF7
+ when 007416 => D <= "11010101"; -- 0x1CF8
+ when 007417 => D <= "01010111"; -- 0x1CF9
+ when 007418 => D <= "10110100"; -- 0x1CFA
+ when 007419 => D <= "01100101"; -- 0x1CFB
+ when 007420 => D <= "00000010"; -- 0x1CFC
+ when 007421 => D <= "10000000"; -- 0x1CFD
+ when 007422 => D <= "00000011"; -- 0x1CFE
+ when 007423 => D <= "10110100"; -- 0x1CFF
+ when 007424 => D <= "01000101"; -- 0x1D00
+ when 007425 => D <= "00110011"; -- 0x1D01
+ when 007426 => D <= "10110001"; -- 0x1D02
+ when 007427 => D <= "01101011"; -- 0x1D03
+ when 007428 => D <= "10110001"; -- 0x1D04
+ when 007429 => D <= "01110010"; -- 0x1D05
+ when 007430 => D <= "10010010"; -- 0x1D06
+ when 007431 => D <= "01010000"; -- 0x1D07
+ when 007432 => D <= "11110001"; -- 0x1D08
+ when 007433 => D <= "11101011"; -- 0x1D09
+ when 007434 => D <= "01010000"; -- 0x1D0A
+ when 007435 => D <= "01000101"; -- 0x1D0B
+ when 007436 => D <= "01010100"; -- 0x1D0C
+ when 007437 => D <= "00001111"; -- 0x1D0D
+ when 007438 => D <= "11111101"; -- 0x1D0E
+ when 007439 => D <= "10100011"; -- 0x1D0F
+ when 007440 => D <= "11110001"; -- 0x1D10
+ when 007441 => D <= "11101011"; -- 0x1D11
+ when 007442 => D <= "01010000"; -- 0x1D12
+ when 007443 => D <= "00001101"; -- 0x1D13
+ when 007444 => D <= "01010100"; -- 0x1D14
+ when 007445 => D <= "00001111"; -- 0x1D15
+ when 007446 => D <= "11001101"; -- 0x1D16
+ when 007447 => D <= "01110101"; -- 0x1D17
+ when 007448 => D <= "11110000"; -- 0x1D18
+ when 007449 => D <= "00001010"; -- 0x1D19
+ when 007450 => D <= "10100100"; -- 0x1D1A
+ when 007451 => D <= "00101101"; -- 0x1D1B
+ when 007452 => D <= "11111101"; -- 0x1D1C
+ when 007453 => D <= "01010000"; -- 0x1D1D
+ when 007454 => D <= "11110000"; -- 0x1D1E
+ when 007455 => D <= "01111101"; -- 0x1D1F
+ when 007456 => D <= "11111111"; -- 0x1D20
+ when 007457 => D <= "11101101"; -- 0x1D21
+ when 007458 => D <= "00110000"; -- 0x1D22
+ when 007459 => D <= "01010000"; -- 0x1D23
+ when 007460 => D <= "00001001"; -- 0x1D24
+ when 007461 => D <= "11000011"; -- 0x1D25
+ when 007462 => D <= "10011110"; -- 0x1D26
+ when 007463 => D <= "11110100"; -- 0x1D27
+ when 007464 => D <= "00000100"; -- 0x1D28
+ when 007465 => D <= "01000000"; -- 0x1D29
+ when 007466 => D <= "00001001"; -- 0x1D2A
+ when 007467 => D <= "01110100"; -- 0x1D2B
+ when 007468 => D <= "00000001"; -- 0x1D2C
+ when 007469 => D <= "00100010"; -- 0x1D2D
+ when 007470 => D <= "00101110"; -- 0x1D2E
+ when 007471 => D <= "01010000"; -- 0x1D2F
+ when 007472 => D <= "00000011"; -- 0x1D30
+ when 007473 => D <= "01110100"; -- 0x1D31
+ when 007474 => D <= "00000010"; -- 0x1D32
+ when 007475 => D <= "00100010"; -- 0x1D33
+ when 007476 => D <= "11001110"; -- 0x1D34
+ when 007477 => D <= "10001110"; -- 0x1D35
+ when 007478 => D <= "00110000"; -- 0x1D36
+ when 007479 => D <= "10111000"; -- 0x1D37
+ when 007480 => D <= "00110100"; -- 0x1D38
+ when 007481 => D <= "00000010"; -- 0x1D39
+ when 007482 => D <= "01110001"; -- 0x1D3A
+ when 007483 => D <= "10111111"; -- 0x1D3B
+ when 007484 => D <= "11100101"; -- 0x1D3C
+ when 007485 => D <= "00001001"; -- 0x1D3D
+ when 007486 => D <= "11000011"; -- 0x1D3E
+ when 007487 => D <= "10010100"; -- 0x1D3F
+ when 007488 => D <= "00001100"; -- 0x1D40
+ when 007489 => D <= "11110101"; -- 0x1D41
+ when 007490 => D <= "00001001"; -- 0x1D42
+ when 007491 => D <= "01100001"; -- 0x1D43
+ when 007492 => D <= "00110000"; -- 0x1D44
+ when 007493 => D <= "11000010"; -- 0x1D45
+ when 007494 => D <= "11010101"; -- 0x1D46
+ when 007495 => D <= "01110000"; -- 0x1D47
+ when 007496 => D <= "00001011"; -- 0x1D48
+ when 007497 => D <= "10111000"; -- 0x1D49
+ when 007498 => D <= "00110100"; -- 0x1D4A
+ when 007499 => D <= "00001000"; -- 0x1D4B
+ when 007500 => D <= "00110000"; -- 0x1D4C
+ when 007501 => D <= "01010010"; -- 0x1D4D
+ when 007502 => D <= "00000100"; -- 0x1D4E
+ when 007503 => D <= "11011110"; -- 0x1D4F
+ when 007504 => D <= "00000010"; -- 0x1D50
+ when 007505 => D <= "01110100"; -- 0x1D51
+ when 007506 => D <= "11111111"; -- 0x1D52
+ when 007507 => D <= "00100010"; -- 0x1D53
+ when 007508 => D <= "00100000"; -- 0x1D54
+ when 007509 => D <= "01010011"; -- 0x1D55
+ when 007510 => D <= "00000010"; -- 0x1D56
+ when 007511 => D <= "11000010"; -- 0x1D57
+ when 007512 => D <= "01010010"; -- 0x1D58
+ when 007513 => D <= "00100000"; -- 0x1D59
+ when 007514 => D <= "01010010"; -- 0x1D5A
+ when 007515 => D <= "11110011"; -- 0x1D5B
+ when 007516 => D <= "00100000"; -- 0x1D5C
+ when 007517 => D <= "01010001"; -- 0x1D5D
+ when 007518 => D <= "00000001"; -- 0x1D5E
+ when 007519 => D <= "00001110"; -- 0x1D5F
+ when 007520 => D <= "00100000"; -- 0x1D60
+ when 007521 => D <= "01010011"; -- 0x1D61
+ when 007522 => D <= "11110000"; -- 0x1D62
+ when 007523 => D <= "10111000"; -- 0x1D63
+ when 007524 => D <= "00111101"; -- 0x1D64
+ when 007525 => D <= "00000010"; -- 0x1D65
+ when 007526 => D <= "11010010"; -- 0x1D66
+ when 007527 => D <= "01010011"; -- 0x1D67
+ when 007528 => D <= "11110110"; -- 0x1D68
+ when 007529 => D <= "00001000"; -- 0x1D69
+ when 007530 => D <= "00100010"; -- 0x1D6A
+ when 007531 => D <= "10100011"; -- 0x1D6B
+ when 007532 => D <= "11100000"; -- 0x1D6C
+ when 007533 => D <= "10110100"; -- 0x1D6D
+ when 007534 => D <= "00100000"; -- 0x1D6E
+ when 007535 => D <= "00010110"; -- 0x1D6F
+ when 007536 => D <= "10000000"; -- 0x1D70
+ when 007537 => D <= "11111001"; -- 0x1D71
+ when 007538 => D <= "10110100"; -- 0x1D72
+ when 007539 => D <= "11100011"; -- 0x1D73
+ when 007540 => D <= "00000010"; -- 0x1D74
+ when 007541 => D <= "10000000"; -- 0x1D75
+ when 007542 => D <= "00001110"; -- 0x1D76
+ when 007543 => D <= "10110100"; -- 0x1D77
+ when 007544 => D <= "00101011"; -- 0x1D78
+ when 007545 => D <= "00000010"; -- 0x1D79
+ when 007546 => D <= "10000000"; -- 0x1D7A
+ when 007547 => D <= "00001001"; -- 0x1D7B
+ when 007548 => D <= "10110100"; -- 0x1D7C
+ when 007549 => D <= "11100101"; -- 0x1D7D
+ when 007550 => D <= "00000010"; -- 0x1D7E
+ when 007551 => D <= "10000000"; -- 0x1D7F
+ when 007552 => D <= "00000011"; -- 0x1D80
+ when 007553 => D <= "10110100"; -- 0x1D81
+ when 007554 => D <= "00101101"; -- 0x1D82
+ when 007555 => D <= "00000010"; -- 0x1D83
+ when 007556 => D <= "11010011"; -- 0x1D84
+ when 007557 => D <= "10100011"; -- 0x1D85
+ when 007558 => D <= "00100010"; -- 0x1D86
+ when 007559 => D <= "10010001"; -- 0x1D87
+ when 007560 => D <= "01110111"; -- 0x1D88
+ when 007561 => D <= "00110001"; -- 0x1D89
+ when 007562 => D <= "11001001"; -- 0x1D8A
+ when 007563 => D <= "11101111"; -- 0x1D8B
+ when 007564 => D <= "11111110"; -- 0x1D8C
+ when 007565 => D <= "01110001"; -- 0x1D8D
+ when 007566 => D <= "10001011"; -- 0x1D8E
+ when 007567 => D <= "01111000"; -- 0x1D8F
+ when 007568 => D <= "00101011"; -- 0x1D90
+ when 007569 => D <= "11100101"; -- 0x1D91
+ when 007570 => D <= "00010111"; -- 0x1D92
+ when 007571 => D <= "11111011"; -- 0x1D93
+ when 007572 => D <= "01100000"; -- 0x1D94
+ when 007573 => D <= "01001001"; -- 0x1D95
+ when 007574 => D <= "10110100"; -- 0x1D96
+ when 007575 => D <= "11110000"; -- 0x1D97
+ when 007576 => D <= "00000000"; -- 0x1D98
+ when 007577 => D <= "01010000"; -- 0x1D99
+ when 007578 => D <= "01110011"; -- 0x1D9A
+ when 007579 => D <= "11101110"; -- 0x1D9B
+ when 007580 => D <= "01110000"; -- 0x1D9C
+ when 007581 => D <= "00000010"; -- 0x1D9D
+ when 007582 => D <= "01111110"; -- 0x1D9E
+ when 007583 => D <= "10000000"; -- 0x1D9F
+ when 007584 => D <= "11101011"; -- 0x1DA0
+ when 007585 => D <= "11000100"; -- 0x1DA1
+ when 007586 => D <= "01010100"; -- 0x1DA2
+ when 007587 => D <= "00001111"; -- 0x1DA3
+ when 007588 => D <= "11111010"; -- 0x1DA4
+ when 007589 => D <= "11010001"; -- 0x1DA5
+ when 007590 => D <= "01110100"; -- 0x1DA6
+ when 007591 => D <= "11001010"; -- 0x1DA7
+ when 007592 => D <= "11000011"; -- 0x1DA8
+ when 007593 => D <= "10011010"; -- 0x1DA9
+ when 007594 => D <= "11111111"; -- 0x1DAA
+ when 007595 => D <= "01010000"; -- 0x1DAB
+ when 007596 => D <= "00000110"; -- 0x1DAC
+ when 007597 => D <= "01111101"; -- 0x1DAD
+ when 007598 => D <= "00111111"; -- 0x1DAE
+ when 007599 => D <= "11010001"; -- 0x1DAF
+ when 007600 => D <= "10101001"; -- 0x1DB0
+ when 007601 => D <= "10100001"; -- 0x1DB1
+ when 007602 => D <= "11011111"; -- 0x1DB2
+ when 007603 => D <= "10111010"; -- 0x1DB3
+ when 007604 => D <= "00000000"; -- 0x1DB4
+ when 007605 => D <= "00000111"; -- 0x1DB5
+ when 007606 => D <= "00011111"; -- 0x1DB6
+ when 007607 => D <= "11010001"; -- 0x1DB7
+ when 007608 => D <= "10010110"; -- 0x1DB8
+ when 007609 => D <= "11010001"; -- 0x1DB9
+ when 007610 => D <= "10100011"; -- 0x1DBA
+ when 007611 => D <= "10000000"; -- 0x1DBB
+ when 007612 => D <= "00000110"; -- 0x1DBC
+ when 007613 => D <= "11010001"; -- 0x1DBD
+ when 007614 => D <= "10010110"; -- 0x1DBE
+ when 007615 => D <= "11101010"; -- 0x1DBF
+ when 007616 => D <= "11111111"; -- 0x1DC0
+ when 007617 => D <= "11010001"; -- 0x1DC1
+ when 007618 => D <= "01011000"; -- 0x1DC2
+ when 007619 => D <= "11101011"; -- 0x1DC3
+ when 007620 => D <= "01010100"; -- 0x1DC4
+ when 007621 => D <= "00001111"; -- 0x1DC5
+ when 007622 => D <= "11111010"; -- 0x1DC6
+ when 007623 => D <= "01100000"; -- 0x1DC7
+ when 007624 => D <= "10111101"; -- 0x1DC8
+ when 007625 => D <= "11010001"; -- 0x1DC9
+ when 007626 => D <= "10011111"; -- 0x1DCA
+ when 007627 => D <= "11010001"; -- 0x1DCB
+ when 007628 => D <= "01111101"; -- 0x1DCC
+ when 007629 => D <= "10110101"; -- 0x1DCD
+ when 007630 => D <= "00000010"; -- 0x1DCE
+ when 007631 => D <= "00000011"; -- 0x1DCF
+ when 007632 => D <= "11101010"; -- 0x1DD0
+ when 007633 => D <= "11000001"; -- 0x1DD1
+ when 007634 => D <= "10001101"; -- 0x1DD2
+ when 007635 => D <= "01010000"; -- 0x1DD3
+ when 007636 => D <= "11111011"; -- 0x1DD4
+ when 007637 => D <= "11001010"; -- 0x1DD5
+ when 007638 => D <= "11000011"; -- 0x1DD6
+ when 007639 => D <= "10011010"; -- 0x1DD7
+ when 007640 => D <= "11001010"; -- 0x1DD8
+ when 007641 => D <= "11010001"; -- 0x1DD9
+ when 007642 => D <= "10001101"; -- 0x1DDA
+ when 007643 => D <= "11101010"; -- 0x1DDB
+ when 007644 => D <= "11111111"; -- 0x1DDC
+ when 007645 => D <= "11000001"; -- 0x1DDD
+ when 007646 => D <= "01011000"; -- 0x1DDE
+ when 007647 => D <= "11101110"; -- 0x1DDF
+ when 007648 => D <= "01110000"; -- 0x1DE0
+ when 007649 => D <= "00000100"; -- 0x1DE1
+ when 007650 => D <= "11010001"; -- 0x1DE2
+ when 007651 => D <= "10100111"; -- 0x1DE3
+ when 007652 => D <= "11000001"; -- 0x1DE4
+ when 007653 => D <= "10100011"; -- 0x1DE5
+ when 007654 => D <= "01111011"; -- 0x1DE6
+ when 007655 => D <= "11110000"; -- 0x1DE7
+ when 007656 => D <= "01110100"; -- 0x1DE8
+ when 007657 => D <= "01110111"; -- 0x1DE9
+ when 007658 => D <= "00101110"; -- 0x1DEA
+ when 007659 => D <= "01000000"; -- 0x1DEB
+ when 007660 => D <= "00100001"; -- 0x1DEC
+ when 007661 => D <= "10010100"; -- 0x1DED
+ when 007662 => D <= "11110111"; -- 0x1DEE
+ when 007663 => D <= "01000000"; -- 0x1DEF
+ when 007664 => D <= "00011101"; -- 0x1DF0
+ when 007665 => D <= "11010001"; -- 0x1DF1
+ when 007666 => D <= "10011000"; -- 0x1DF2
+ when 007667 => D <= "11010001"; -- 0x1DF3
+ when 007668 => D <= "01110100"; -- 0x1DF4
+ when 007669 => D <= "10110100"; -- 0x1DF5
+ when 007670 => D <= "00001000"; -- 0x1DF6
+ when 007671 => D <= "00000010"; -- 0x1DF7
+ when 007672 => D <= "11000001"; -- 0x1DF8
+ when 007673 => D <= "01011000"; -- 0x1DF9
+ when 007674 => D <= "11010001"; -- 0x1DFA
+ when 007675 => D <= "01011000"; -- 0x1DFB
+ when 007676 => D <= "11010001"; -- 0x1DFC
+ when 007677 => D <= "01101010"; -- 0x1DFD
+ when 007678 => D <= "01100000"; -- 0x1DFE
+ when 007679 => D <= "01010111"; -- 0x1DFF
+ when 007680 => D <= "11010001"; -- 0x1E00
+ when 007681 => D <= "10011111"; -- 0x1E01
+ when 007682 => D <= "01111111"; -- 0x1E02
+ when 007683 => D <= "00000001"; -- 0x1E03
+ when 007684 => D <= "11010001"; -- 0x1E04
+ when 007685 => D <= "01011000"; -- 0x1E05
+ when 007686 => D <= "01110000"; -- 0x1E06
+ when 007687 => D <= "01001111"; -- 0x1E07
+ when 007688 => D <= "11010001"; -- 0x1E08
+ when 007689 => D <= "01101010"; -- 0x1E09
+ when 007690 => D <= "01100000"; -- 0x1E0A
+ when 007691 => D <= "01001011"; -- 0x1E0B
+ when 007692 => D <= "10000000"; -- 0x1E0C
+ when 007693 => D <= "11110100"; -- 0x1E0D
+ when 007694 => D <= "11010001"; -- 0x1E0E
+ when 007695 => D <= "10011000"; -- 0x1E0F
+ when 007696 => D <= "01111111"; -- 0x1E10
+ when 007697 => D <= "00000001"; -- 0x1E11
+ when 007698 => D <= "11010001"; -- 0x1E12
+ when 007699 => D <= "01011000"; -- 0x1E13
+ when 007700 => D <= "11010001"; -- 0x1E14
+ when 007701 => D <= "10011111"; -- 0x1E15
+ when 007702 => D <= "11101011"; -- 0x1E16
+ when 007703 => D <= "01010100"; -- 0x1E17
+ when 007704 => D <= "00001111"; -- 0x1E18
+ when 007705 => D <= "01100000"; -- 0x1E19
+ when 007706 => D <= "00000110"; -- 0x1E1A
+ when 007707 => D <= "11111111"; -- 0x1E1B
+ when 007708 => D <= "00011111"; -- 0x1E1C
+ when 007709 => D <= "11010001"; -- 0x1E1D
+ when 007710 => D <= "01011000"; -- 0x1E1E
+ when 007711 => D <= "10000000"; -- 0x1E1F
+ when 007712 => D <= "00000010"; -- 0x1E20
+ when 007713 => D <= "11010001"; -- 0x1E21
+ when 007714 => D <= "00000010"; -- 0x1E22
+ when 007715 => D <= "11010001"; -- 0x1E23
+ when 007716 => D <= "10100111"; -- 0x1E24
+ when 007717 => D <= "01111101"; -- 0x1E25
+ when 007718 => D <= "01000101"; -- 0x1E26
+ when 007719 => D <= "11010001"; -- 0x1E27
+ when 007720 => D <= "10101001"; -- 0x1E28
+ when 007721 => D <= "11101110"; -- 0x1E29
+ when 007722 => D <= "01100000"; -- 0x1E2A
+ when 007723 => D <= "00000100"; -- 0x1E2B
+ when 007724 => D <= "00010100"; -- 0x1E2C
+ when 007725 => D <= "10110100"; -- 0x1E2D
+ when 007726 => D <= "10000000"; -- 0x1E2E
+ when 007727 => D <= "00000101"; -- 0x1E2F
+ when 007728 => D <= "11010001"; -- 0x1E30
+ when 007729 => D <= "10100111"; -- 0x1E31
+ when 007730 => D <= "11100100"; -- 0x1E32
+ when 007731 => D <= "10000000"; -- 0x1E33
+ when 007732 => D <= "00001100"; -- 0x1E34
+ when 007733 => D <= "01000000"; -- 0x1E35
+ when 007734 => D <= "00000110"; -- 0x1E36
+ when 007735 => D <= "01111101"; -- 0x1E37
+ when 007736 => D <= "00101011"; -- 0x1E38
+ when 007737 => D <= "11010001"; -- 0x1E39
+ when 007738 => D <= "10101001"; -- 0x1E3A
+ when 007739 => D <= "10000000"; -- 0x1E3B
+ when 007740 => D <= "00000100"; -- 0x1E3C
+ when 007741 => D <= "11010001"; -- 0x1E3D
+ when 007742 => D <= "10011011"; -- 0x1E3E
+ when 007743 => D <= "11110100"; -- 0x1E3F
+ when 007744 => D <= "00000100"; -- 0x1E40
+ when 007745 => D <= "11000010"; -- 0x1E41
+ when 007746 => D <= "11100111"; -- 0x1E42
+ when 007747 => D <= "11111000"; -- 0x1E43
+ when 007748 => D <= "01111010"; -- 0x1E44
+ when 007749 => D <= "00000000"; -- 0x1E45
+ when 007750 => D <= "01111001"; -- 0x1E46
+ when 007751 => D <= "01011000"; -- 0x1E47
+ when 007752 => D <= "01111011"; -- 0x1E48
+ when 007753 => D <= "00000000"; -- 0x1E49
+ when 007754 => D <= "11110001"; -- 0x1E4A
+ when 007755 => D <= "00000100"; -- 0x1E4B
+ when 007756 => D <= "01111000"; -- 0x1E4C
+ when 007757 => D <= "01011000"; -- 0x1E4D
+ when 007758 => D <= "11100010"; -- 0x1E4E
+ when 007759 => D <= "11111101"; -- 0x1E4F
+ when 007760 => D <= "11010001"; -- 0x1E50
+ when 007761 => D <= "10101001"; -- 0x1E51
+ when 007762 => D <= "00001000"; -- 0x1E52
+ when 007763 => D <= "11101000"; -- 0x1E53
+ when 007764 => D <= "10110101"; -- 0x1E54
+ when 007765 => D <= "00000001"; -- 0x1E55
+ when 007766 => D <= "11110111"; -- 0x1E56
+ when 007767 => D <= "00100010"; -- 0x1E57
+ when 007768 => D <= "11101111"; -- 0x1E58
+ when 007769 => D <= "01100000"; -- 0x1E59
+ when 007770 => D <= "00001110"; -- 0x1E5A
+ when 007771 => D <= "11100110"; -- 0x1E5B
+ when 007772 => D <= "01000100"; -- 0x1E5C
+ when 007773 => D <= "00110000"; -- 0x1E5D
+ when 007774 => D <= "00001000"; -- 0x1E5E
+ when 007775 => D <= "00011111"; -- 0x1E5F
+ when 007776 => D <= "11111101"; -- 0x1E60
+ when 007777 => D <= "11010001"; -- 0x1E61
+ when 007778 => D <= "10101001"; -- 0x1E62
+ when 007779 => D <= "11100100"; -- 0x1E63
+ when 007780 => D <= "10111000"; -- 0x1E64
+ when 007781 => D <= "00110011"; -- 0x1E65
+ when 007782 => D <= "11110001"; -- 0x1E66
+ when 007783 => D <= "01110100"; -- 0x1E67
+ when 007784 => D <= "01010101"; -- 0x1E68
+ when 007785 => D <= "00100010"; -- 0x1E69
+ when 007786 => D <= "10101001"; -- 0x1E6A
+ when 007787 => D <= "00000000"; -- 0x1E6B
+ when 007788 => D <= "11100111"; -- 0x1E6C
+ when 007789 => D <= "01110000"; -- 0x1E6D
+ when 007790 => D <= "00000100"; -- 0x1E6E
+ when 007791 => D <= "00001001"; -- 0x1E6F
+ when 007792 => D <= "10111001"; -- 0x1E70
+ when 007793 => D <= "00110011"; -- 0x1E71
+ when 007794 => D <= "11111001"; -- 0x1E72
+ when 007795 => D <= "00100010"; -- 0x1E73
+ when 007796 => D <= "11101110"; -- 0x1E74
+ when 007797 => D <= "11000011"; -- 0x1E75
+ when 007798 => D <= "10010100"; -- 0x1E76
+ when 007799 => D <= "10000000"; -- 0x1E77
+ when 007800 => D <= "01010000"; -- 0x1E78
+ when 007801 => D <= "00000001"; -- 0x1E79
+ when 007802 => D <= "11100100"; -- 0x1E7A
+ when 007803 => D <= "11111111"; -- 0x1E7B
+ when 007804 => D <= "00100010"; -- 0x1E7C
+ when 007805 => D <= "11000011"; -- 0x1E7D
+ when 007806 => D <= "01110100"; -- 0x1E7E
+ when 007807 => D <= "10000000"; -- 0x1E7F
+ when 007808 => D <= "10011110"; -- 0x1E80
+ when 007809 => D <= "01010000"; -- 0x1E81
+ when 007810 => D <= "00000001"; -- 0x1E82
+ when 007811 => D <= "11100100"; -- 0x1E83
+ when 007812 => D <= "00100010"; -- 0x1E84
+ when 007813 => D <= "11101111"; -- 0x1E85
+ when 007814 => D <= "01100000"; -- 0x1E86
+ when 007815 => D <= "11111100"; -- 0x1E87
+ when 007816 => D <= "11010001"; -- 0x1E88
+ when 007817 => D <= "10100111"; -- 0x1E89
+ when 007818 => D <= "00011111"; -- 0x1E8A
+ when 007819 => D <= "10000000"; -- 0x1E8B
+ when 007820 => D <= "11111000"; -- 0x1E8C
+ when 007821 => D <= "11111111"; -- 0x1E8D
+ when 007822 => D <= "11101111"; -- 0x1E8E
+ when 007823 => D <= "01100000"; -- 0x1E8F
+ when 007824 => D <= "11110011"; -- 0x1E90
+ when 007825 => D <= "11010001"; -- 0x1E91
+ when 007826 => D <= "10100011"; -- 0x1E92
+ when 007827 => D <= "00011111"; -- 0x1E93
+ when 007828 => D <= "10000000"; -- 0x1E94
+ when 007829 => D <= "11111000"; -- 0x1E95
+ when 007830 => D <= "11010001"; -- 0x1E96
+ when 007831 => D <= "10000101"; -- 0x1E97
+ when 007832 => D <= "11101100"; -- 0x1E98
+ when 007833 => D <= "01100000"; -- 0x1E99
+ when 007834 => D <= "00001100"; -- 0x1E9A
+ when 007835 => D <= "01111101"; -- 0x1E9B
+ when 007836 => D <= "00101101"; -- 0x1E9C
+ when 007837 => D <= "10000000"; -- 0x1E9D
+ when 007838 => D <= "00001010"; -- 0x1E9E
+ when 007839 => D <= "01111101"; -- 0x1E9F
+ when 007840 => D <= "00101110"; -- 0x1EA0
+ when 007841 => D <= "10000000"; -- 0x1EA1
+ when 007842 => D <= "00000110"; -- 0x1EA2
+ when 007843 => D <= "01111101"; -- 0x1EA3
+ when 007844 => D <= "00110000"; -- 0x1EA4
+ when 007845 => D <= "10000000"; -- 0x1EA5
+ when 007846 => D <= "00000010"; -- 0x1EA6
+ when 007847 => D <= "01111101"; -- 0x1EA7
+ when 007848 => D <= "00100000"; -- 0x1EA8
+ when 007849 => D <= "00100001"; -- 0x1EA9
+ when 007850 => D <= "10010000"; -- 0x1EAA
+ when 007851 => D <= "10010001"; -- 0x1EAB
+ when 007852 => D <= "10010110"; -- 0x1EAC
+ when 007853 => D <= "10010010"; -- 0x1EAD
+ when 007854 => D <= "00100011"; -- 0x1EAE
+ when 007855 => D <= "11110001"; -- 0x1EAF
+ when 007856 => D <= "11101011"; -- 0x1EB0
+ when 007857 => D <= "10110011"; -- 0x1EB1
+ when 007858 => D <= "01000000"; -- 0x1EB2
+ when 007859 => D <= "00101000"; -- 0x1EB3
+ when 007860 => D <= "01111011"; -- 0x1EB4
+ when 007861 => D <= "00000000"; -- 0x1EB5
+ when 007862 => D <= "01111001"; -- 0x1EB6
+ when 007863 => D <= "00000000"; -- 0x1EB7
+ when 007864 => D <= "10000000"; -- 0x1EB8
+ when 007865 => D <= "00010101"; -- 0x1EB9
+ when 007866 => D <= "10100011"; -- 0x1EBA
+ when 007867 => D <= "10001001"; -- 0x1EBB
+ when 007868 => D <= "00000000"; -- 0x1EBC
+ when 007869 => D <= "10001011"; -- 0x1EBD
+ when 007870 => D <= "00000010"; -- 0x1EBE
+ when 007871 => D <= "11110001"; -- 0x1EBF
+ when 007872 => D <= "11101011"; -- 0x1EC0
+ when 007873 => D <= "01000000"; -- 0x1EC1
+ when 007874 => D <= "00001100"; -- 0x1EC2
+ when 007875 => D <= "00110000"; -- 0x1EC3
+ when 007876 => D <= "00100011"; -- 0x1EC4
+ when 007877 => D <= "00010110"; -- 0x1EC5
+ when 007878 => D <= "10010001"; -- 0x1EC6
+ when 007879 => D <= "10110110"; -- 0x1EC7
+ when 007880 => D <= "01000000"; -- 0x1EC8
+ when 007881 => D <= "00000011"; -- 0x1EC9
+ when 007882 => D <= "10100011"; -- 0x1ECA
+ when 007883 => D <= "10000000"; -- 0x1ECB
+ when 007884 => D <= "00001111"; -- 0x1ECC
+ when 007885 => D <= "00100100"; -- 0x1ECD
+ when 007886 => D <= "00001001"; -- 0x1ECE
+ when 007887 => D <= "01110101"; -- 0x1ECF
+ when 007888 => D <= "11110000"; -- 0x1ED0
+ when 007889 => D <= "00001010"; -- 0x1ED1
+ when 007890 => D <= "00110000"; -- 0x1ED2
+ when 007891 => D <= "00100011"; -- 0x1ED3
+ when 007892 => D <= "00000011"; -- 0x1ED4
+ when 007893 => D <= "01110101"; -- 0x1ED5
+ when 007894 => D <= "11110000"; -- 0x1ED6
+ when 007895 => D <= "00010000"; -- 0x1ED7
+ when 007896 => D <= "11010001"; -- 0x1ED8
+ when 007897 => D <= "11100011"; -- 0x1ED9
+ when 007898 => D <= "01010000"; -- 0x1EDA
+ when 007899 => D <= "11011110"; -- 0x1EDB
+ when 007900 => D <= "11100100"; -- 0x1EDC
+ when 007901 => D <= "10010010"; -- 0x1EDD
+ when 007902 => D <= "11100001"; -- 0x1EDE
+ when 007903 => D <= "00100010"; -- 0x1EDF
+ when 007904 => D <= "01110101"; -- 0x1EE0
+ when 007905 => D <= "11110000"; -- 0x1EE1
+ when 007906 => D <= "00001010"; -- 0x1EE2
+ when 007907 => D <= "11000000"; -- 0x1EE3
+ when 007908 => D <= "11100000"; -- 0x1EE4
+ when 007909 => D <= "11000000"; -- 0x1EE5
+ when 007910 => D <= "11110000"; -- 0x1EE6
+ when 007911 => D <= "11101001"; -- 0x1EE7
+ when 007912 => D <= "10100100"; -- 0x1EE8
+ when 007913 => D <= "11111001"; -- 0x1EE9
+ when 007914 => D <= "11101011"; -- 0x1EEA
+ when 007915 => D <= "10101011"; -- 0x1EEB
+ when 007916 => D <= "11110000"; -- 0x1EEC
+ when 007917 => D <= "11010000"; -- 0x1EED
+ when 007918 => D <= "11110000"; -- 0x1EEE
+ when 007919 => D <= "10100100"; -- 0x1EEF
+ when 007920 => D <= "10100010"; -- 0x1EF0
+ when 007921 => D <= "11010010"; -- 0x1EF1
+ when 007922 => D <= "10010010"; -- 0x1EF2
+ when 007923 => D <= "11010101"; -- 0x1EF3
+ when 007924 => D <= "00101011"; -- 0x1EF4
+ when 007925 => D <= "11111011"; -- 0x1EF5
+ when 007926 => D <= "11010000"; -- 0x1EF6
+ when 007927 => D <= "11100000"; -- 0x1EF7
+ when 007928 => D <= "01110010"; -- 0x1EF8
+ when 007929 => D <= "11010101"; -- 0x1EF9
+ when 007930 => D <= "01000000"; -- 0x1EFA
+ when 007931 => D <= "00000111"; -- 0x1EFB
+ when 007932 => D <= "01010100"; -- 0x1EFC
+ when 007933 => D <= "00001111"; -- 0x1EFD
+ when 007934 => D <= "00101001"; -- 0x1EFE
+ when 007935 => D <= "11111001"; -- 0x1EFF
+ when 007936 => D <= "11100100"; -- 0x1F00
+ when 007937 => D <= "00111011"; -- 0x1F01
+ when 007938 => D <= "11111011"; -- 0x1F02
+ when 007939 => D <= "00100010"; -- 0x1F03
+ when 007940 => D <= "11100100"; -- 0x1F04
+ when 007941 => D <= "10010000"; -- 0x1F05
+ when 007942 => D <= "00100111"; -- 0x1F06
+ when 007943 => D <= "00010000"; -- 0x1F07
+ when 007944 => D <= "11110001"; -- 0x1F08
+ when 007945 => D <= "00100001"; -- 0x1F09
+ when 007946 => D <= "10010000"; -- 0x1F0A
+ when 007947 => D <= "00000011"; -- 0x1F0B
+ when 007948 => D <= "11101000"; -- 0x1F0C
+ when 007949 => D <= "11110001"; -- 0x1F0D
+ when 007950 => D <= "00100001"; -- 0x1F0E
+ when 007951 => D <= "10010000"; -- 0x1F0F
+ when 007952 => D <= "00000000"; -- 0x1F10
+ when 007953 => D <= "01100100"; -- 0x1F11
+ when 007954 => D <= "11110001"; -- 0x1F12
+ when 007955 => D <= "00100001"; -- 0x1F13
+ when 007956 => D <= "10010000"; -- 0x1F14
+ when 007957 => D <= "00000000"; -- 0x1F15
+ when 007958 => D <= "00001010"; -- 0x1F16
+ when 007959 => D <= "11110001"; -- 0x1F17
+ when 007960 => D <= "00100001"; -- 0x1F18
+ when 007961 => D <= "10010000"; -- 0x1F19
+ when 007962 => D <= "00000000"; -- 0x1F1A
+ when 007963 => D <= "00000001"; -- 0x1F1B
+ when 007964 => D <= "11110001"; -- 0x1F1C
+ when 007965 => D <= "00100001"; -- 0x1F1D
+ when 007966 => D <= "01100000"; -- 0x1F1E
+ when 007967 => D <= "00100000"; -- 0x1F1F
+ when 007968 => D <= "00100010"; -- 0x1F20
+ when 007969 => D <= "01111110"; -- 0x1F21
+ when 007970 => D <= "11111111"; -- 0x1F22
+ when 007971 => D <= "00001110"; -- 0x1F23
+ when 007972 => D <= "11001010"; -- 0x1F24
+ when 007973 => D <= "10110101"; -- 0x1F25
+ when 007974 => D <= "10000011"; -- 0x1F26
+ when 007975 => D <= "00000000"; -- 0x1F27
+ when 007976 => D <= "11001010"; -- 0x1F28
+ when 007977 => D <= "01000000"; -- 0x1F29
+ when 007978 => D <= "00010010"; -- 0x1F2A
+ when 007979 => D <= "11001000"; -- 0x1F2B
+ when 007980 => D <= "10010101"; -- 0x1F2C
+ when 007981 => D <= "10000010"; -- 0x1F2D
+ when 007982 => D <= "11001000"; -- 0x1F2E
+ when 007983 => D <= "11001010"; -- 0x1F2F
+ when 007984 => D <= "10010101"; -- 0x1F30
+ when 007985 => D <= "10000011"; -- 0x1F31
+ when 007986 => D <= "11001010"; -- 0x1F32
+ when 007987 => D <= "01010000"; -- 0x1F33
+ when 007988 => D <= "11101110"; -- 0x1F34
+ when 007989 => D <= "11001000"; -- 0x1F35
+ when 007990 => D <= "00100101"; -- 0x1F36
+ when 007991 => D <= "10000010"; -- 0x1F37
+ when 007992 => D <= "11001000"; -- 0x1F38
+ when 007993 => D <= "11001010"; -- 0x1F39
+ when 007994 => D <= "00110101"; -- 0x1F3A
+ when 007995 => D <= "10000011"; -- 0x1F3B
+ when 007996 => D <= "11001010"; -- 0x1F3C
+ when 007997 => D <= "01001110"; -- 0x1F3D
+ when 007998 => D <= "01100000"; -- 0x1F3E
+ when 007999 => D <= "11100000"; -- 0x1F3F
+ when 008000 => D <= "01110100"; -- 0x1F40
+ when 008001 => D <= "00110000"; -- 0x1F41
+ when 008002 => D <= "00101110"; -- 0x1F42
+ when 008003 => D <= "10001011"; -- 0x1F43
+ when 008004 => D <= "10100000"; -- 0x1F44
+ when 008005 => D <= "11110011"; -- 0x1F45
+ when 008006 => D <= "00001001"; -- 0x1F46
+ when 008007 => D <= "10111001"; -- 0x1F47
+ when 008008 => D <= "00000000"; -- 0x1F48
+ when 008009 => D <= "00000001"; -- 0x1F49
+ when 008010 => D <= "00001011"; -- 0x1F4A
+ when 008011 => D <= "00100010"; -- 0x1F4B
+ when 008012 => D <= "11010001"; -- 0x1F4C
+ when 008013 => D <= "10100111"; -- 0x1F4D
+ when 008014 => D <= "10100010"; -- 0x1F4E
+ when 008015 => D <= "00110110"; -- 0x1F4F
+ when 008016 => D <= "10010010"; -- 0x1F50
+ when 008017 => D <= "00100011"; -- 0x1F51
+ when 008018 => D <= "11101011"; -- 0x1F52
+ when 008019 => D <= "11110001"; -- 0x1F53
+ when 008020 => D <= "01101111"; -- 0x1F54
+ when 008021 => D <= "11101011"; -- 0x1F55
+ when 008022 => D <= "11110001"; -- 0x1F56
+ when 008023 => D <= "01110000"; -- 0x1F57
+ when 008024 => D <= "11000010"; -- 0x1F58
+ when 008025 => D <= "00100011"; -- 0x1F59
+ when 008026 => D <= "11101001"; -- 0x1F5A
+ when 008027 => D <= "11110001"; -- 0x1F5B
+ when 008028 => D <= "01101111"; -- 0x1F5C
+ when 008029 => D <= "11101001"; -- 0x1F5D
+ when 008030 => D <= "11110001"; -- 0x1F5E
+ when 008031 => D <= "01110000"; -- 0x1F5F
+ when 008032 => D <= "01111101"; -- 0x1F60
+ when 008033 => D <= "01001000"; -- 0x1F61
+ when 008034 => D <= "11000001"; -- 0x1F62
+ when 008035 => D <= "10101001"; -- 0x1F63
+ when 008036 => D <= "11000010"; -- 0x1F64
+ when 008037 => D <= "00100011"; -- 0x1F65
+ when 008038 => D <= "00100100"; -- 0x1F66
+ when 008039 => D <= "10010000"; -- 0x1F67
+ when 008040 => D <= "11010100"; -- 0x1F68
+ when 008041 => D <= "00110100"; -- 0x1F69
+ when 008042 => D <= "01000000"; -- 0x1F6A
+ when 008043 => D <= "11010100"; -- 0x1F6B
+ when 008044 => D <= "11111101"; -- 0x1F6C
+ when 008045 => D <= "10000000"; -- 0x1F6D
+ when 008046 => D <= "11110011"; -- 0x1F6E
+ when 008047 => D <= "11000100"; -- 0x1F6F
+ when 008048 => D <= "01010100"; -- 0x1F70
+ when 008049 => D <= "00001111"; -- 0x1F71
+ when 008050 => D <= "01110000"; -- 0x1F72
+ when 008051 => D <= "11110000"; -- 0x1F73
+ when 008052 => D <= "00110000"; -- 0x1F74
+ when 008053 => D <= "00100011"; -- 0x1F75
+ when 008054 => D <= "11101101"; -- 0x1F76
+ when 008055 => D <= "00100010"; -- 0x1F77
+ when 008056 => D <= "00100000"; -- 0x1F78
+ when 008057 => D <= "00011010"; -- 0x1F79
+ when 008058 => D <= "00000011"; -- 0x1F7A
+ when 008059 => D <= "00000010"; -- 0x1F7B
+ when 008060 => D <= "01000000"; -- 0x1F7C
+ when 008061 => D <= "00011011"; -- 0x1F7D
+ when 008062 => D <= "00000010"; -- 0x1F7E
+ when 008063 => D <= "00100000"; -- 0x1F7F
+ when 008064 => D <= "10001000"; -- 0x1F80
+ when 008065 => D <= "01001110"; -- 0x1F81
+ when 008066 => D <= "01001111"; -- 0x1F82
+ when 008067 => D <= "00100000"; -- 0x1F83
+ when 008068 => D <= "01000100"; -- 0x1F84
+ when 008069 => D <= "01000001"; -- 0x1F85
+ when 008070 => D <= "01010100"; -- 0x1F86
+ when 008071 => D <= "01000001"; -- 0x1F87
+ when 008072 => D <= "00100010"; -- 0x1F88
+ when 008073 => D <= "10010100"; -- 0x1F89
+ when 008074 => D <= "01000001"; -- 0x1F8A
+ when 008075 => D <= "01010010"; -- 0x1F8B
+ when 008076 => D <= "01001001"; -- 0x1F8C
+ when 008077 => D <= "01010100"; -- 0x1F8D
+ when 008078 => D <= "01001000"; -- 0x1F8E
+ when 008079 => D <= "00101110"; -- 0x1F8F
+ when 008080 => D <= "00100000"; -- 0x1F90
+ when 008081 => D <= "01001111"; -- 0x1F91
+ when 008082 => D <= "01010110"; -- 0x1F92
+ when 008083 => D <= "01000101"; -- 0x1F93
+ when 008084 => D <= "01010010"; -- 0x1F94
+ when 008085 => D <= "01000110"; -- 0x1F95
+ when 008086 => D <= "01001100"; -- 0x1F96
+ when 008087 => D <= "01001111"; -- 0x1F97
+ when 008088 => D <= "01010111"; -- 0x1F98
+ when 008089 => D <= "00100010"; -- 0x1F99
+ when 008090 => D <= "01010000"; -- 0x1F9A
+ when 008091 => D <= "01010010"; -- 0x1F9B
+ when 008092 => D <= "01001111"; -- 0x1F9C
+ when 008093 => D <= "01000111"; -- 0x1F9D
+ when 008094 => D <= "01010010"; -- 0x1F9E
+ when 008095 => D <= "01000001"; -- 0x1F9F
+ when 008096 => D <= "01001101"; -- 0x1FA0
+ when 008097 => D <= "01001101"; -- 0x1FA1
+ when 008098 => D <= "01001001"; -- 0x1FA2
+ when 008099 => D <= "01001110"; -- 0x1FA3
+ when 008100 => D <= "01000111"; -- 0x1FA4
+ when 008101 => D <= "00100010"; -- 0x1FA5
+ when 008102 => D <= "01000011"; -- 0x1FA6
+ when 008103 => D <= "01000001"; -- 0x1FA7
+ when 008104 => D <= "01001110"; -- 0x1FA8
+ when 008105 => D <= "00100111"; -- 0x1FA9
+ when 008106 => D <= "01010100"; -- 0x1FAA
+ when 008107 => D <= "00100000"; -- 0x1FAB
+ when 008108 => D <= "01000011"; -- 0x1FAC
+ when 008109 => D <= "01001111"; -- 0x1FAD
+ when 008110 => D <= "01001110"; -- 0x1FAE
+ when 008111 => D <= "01010100"; -- 0x1FAF
+ when 008112 => D <= "01001001"; -- 0x1FB0
+ when 008113 => D <= "01001110"; -- 0x1FB1
+ when 008114 => D <= "01010101"; -- 0x1FB2
+ when 008115 => D <= "01000101"; -- 0x1FB3
+ when 008116 => D <= "00100010"; -- 0x1FB4
+ when 008117 => D <= "01001001"; -- 0x1FB5
+ when 008118 => D <= "01001110"; -- 0x1FB6
+ when 008119 => D <= "01010110"; -- 0x1FB7
+ when 008120 => D <= "01000001"; -- 0x1FB8
+ when 008121 => D <= "01001100"; -- 0x1FB9
+ when 008122 => D <= "01001001"; -- 0x1FBA
+ when 008123 => D <= "01000100"; -- 0x1FBB
+ when 008124 => D <= "00100000"; -- 0x1FBC
+ when 008125 => D <= "01001100"; -- 0x1FBD
+ when 008126 => D <= "01001001"; -- 0x1FBE
+ when 008127 => D <= "01001110"; -- 0x1FBF
+ when 008128 => D <= "01000101"; -- 0x1FC0
+ when 008129 => D <= "00100000"; -- 0x1FC1
+ when 008130 => D <= "01001110"; -- 0x1FC2
+ when 008131 => D <= "01010101"; -- 0x1FC3
+ when 008132 => D <= "01001101"; -- 0x1FC4
+ when 008133 => D <= "01000010"; -- 0x1FC5
+ when 008134 => D <= "01000101"; -- 0x1FC6
+ when 008135 => D <= "01010010"; -- 0x1FC7
+ when 008136 => D <= "00100010"; -- 0x1FC8
+ when 008137 => D <= "01010000"; -- 0x1FC9
+ when 008138 => D <= "01010010"; -- 0x1FCA
+ when 008139 => D <= "01001111"; -- 0x1FCB
+ when 008140 => D <= "01001101"; -- 0x1FCC
+ when 008141 => D <= "00100000"; -- 0x1FCD
+ when 008142 => D <= "01001101"; -- 0x1FCE
+ when 008143 => D <= "01001111"; -- 0x1FCF
+ when 008144 => D <= "01000100"; -- 0x1FD0
+ when 008145 => D <= "01000101"; -- 0x1FD1
+ when 008146 => D <= "00100010"; -- 0x1FD2
+ when 008147 => D <= "00101010"; -- 0x1FD3
+ when 008148 => D <= "01001101"; -- 0x1FD4
+ when 008149 => D <= "01000011"; -- 0x1FD5
+ when 008150 => D <= "01010011"; -- 0x1FD6
+ when 008151 => D <= "00101101"; -- 0x1FD7
+ when 008152 => D <= "00110101"; -- 0x1FD8
+ when 008153 => D <= "00110001"; -- 0x1FD9
+ when 008154 => D <= "00101000"; -- 0x1FDA
+ when 008155 => D <= "01110100"; -- 0x1FDB
+ when 008156 => D <= "01101101"; -- 0x1FDC
+ when 008157 => D <= "00101001"; -- 0x1FDD
+ when 008158 => D <= "00100000"; -- 0x1FDE
+ when 008159 => D <= "01000010"; -- 0x1FDF
+ when 008160 => D <= "01000001"; -- 0x1FE0
+ when 008161 => D <= "01010011"; -- 0x1FE1
+ when 008162 => D <= "01001001"; -- 0x1FE2
+ when 008163 => D <= "01000011"; -- 0x1FE3
+ when 008164 => D <= "00100000"; -- 0x1FE4
+ when 008165 => D <= "01010110"; -- 0x1FE5
+ when 008166 => D <= "00110001"; -- 0x1FE6
+ when 008167 => D <= "00101110"; -- 0x1FE7
+ when 008168 => D <= "00110001"; -- 0x1FE8
+ when 008169 => D <= "00101010"; -- 0x1FE9
+ when 008170 => D <= "00100010"; -- 0x1FEA
+ when 008171 => D <= "10110001"; -- 0x1FEB
+ when 008172 => D <= "01101100"; -- 0x1FEC
+ when 008173 => D <= "10110100"; -- 0x1FED
+ when 008174 => D <= "00111010"; -- 0x1FEE
+ when 008175 => D <= "00000000"; -- 0x1FEF
+ when 008176 => D <= "01000000"; -- 0x1FF0
+ when 008177 => D <= "00000001"; -- 0x1FF1
+ when 008178 => D <= "00100010"; -- 0x1FF2
+ when 008179 => D <= "10110100"; -- 0x1FF3
+ when 008180 => D <= "00110000"; -- 0x1FF4
+ when 008181 => D <= "00000000"; -- 0x1FF5
+ when 008182 => D <= "10110011"; -- 0x1FF6
+ when 008183 => D <= "00100010"; -- 0x1FF7
+ when 008184 => D <= "01000101"; -- 0x1FF8
+ when 008185 => D <= "01010010"; -- 0x1FF9
+ when 008186 => D <= "01010010"; -- 0x1FFA
+ when 008187 => D <= "01001111"; -- 0x1FFB
+ when 008188 => D <= "01010010"; -- 0x1FFC
+ when 008189 => D <= "00111010"; -- 0x1FFD
+ when 008190 => D <= "00100000"; -- 0x1FFE
+ when 008191 => D <= "00100010"; -- 0x1FFF
+ when others => D <= "--------";
+ end case;
+ end process;
+end;
diff --git a/rtl/vhdl/SSRAM.vhd b/rtl/vhdl/SSRAM.vhd
new file mode 100644
index 0000000..29af2a1
--- /dev/null
+++ b/rtl/vhdl/SSRAM.vhd
@@ -0,0 +1,92 @@
+--
+-- Inferrable Synchronous SRAM for XST synthesis
+--
+-- Version : 0220
+--
+-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+-- 0208 : Initial release
+-- 0218 : Fixed data out at write
+-- 0220 : Added support for XST
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+entity SSRAM is
+ generic(
+ AddrWidth : integer := 11;
+ DataWidth : integer := 8
+ );
+ port(
+ Clk : in std_logic;
+ CE_n : in std_logic;
+ WE_n : in std_logic;
+ A : in std_logic_vector(AddrWidth - 1 downto 0);
+ DIn : in std_logic_vector(DataWidth - 1 downto 0);
+ DOut : out std_logic_vector(DataWidth - 1 downto 0)
+ );
+end SSRAM;
+
+architecture behaviour of SSRAM is
+
+ type Memory_Image is array (natural range <>) of std_logic_vector(DataWidth - 1 downto 0);
+ signal RAM : Memory_Image(0 to 2 ** AddrWidth - 1);
+ signal A_r : std_logic_vector(AddrWidth - 1 downto 0);
+
+begin
+
+ process (Clk)
+ begin
+ if Clk'event and Clk = '1' then
+ if (CE_n nor WE_n) = '1' then
+ RAM(to_integer(unsigned(A))) <= DIn;
+ end if;
+ A_r <= A;
+ end if;
+ end process;
+
+ DOut <= RAM(to_integer(unsigned(A_r)))
+-- pragma translate_off
+ when not is_x(A_r) else (others => '-')
+-- pragma translate_on
+ ;
+end;
diff --git a/rtl/vhdl/SSRAM2.vhd b/rtl/vhdl/SSRAM2.vhd
new file mode 100644
index 0000000..dcbfca7
--- /dev/null
+++ b/rtl/vhdl/SSRAM2.vhd
@@ -0,0 +1,92 @@
+--
+-- Inferrable Synchronous SRAM for Leonardo synthesis, no write through!
+--
+-- Version : 0236
+--
+-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+entity SSRAM is
+ generic(
+ AddrWidth : integer := 16;
+ DataWidth : integer := 8
+ );
+ port(
+ Clk : in std_logic;
+ CE_n : in std_logic;
+ WE_n : in std_logic;
+ A : in std_logic_vector(AddrWidth - 1 downto 0);
+ DIn : in std_logic_vector(DataWidth - 1 downto 0);
+ DOut : out std_logic_vector(DataWidth - 1 downto 0)
+ );
+end SSRAM;
+
+architecture behaviour of SSRAM is
+
+ type Memory_Image is array (natural range <>) of std_logic_vector(DataWidth - 1 downto 0);
+ signal RAM : Memory_Image(0 to 2 ** AddrWidth - 1);
+-- signal A_r : std_logic_vector(AddrWidth - 1 downto 0);
+
+begin
+
+ process (Clk)
+ begin
+ if Clk'event and Clk = '1' then
+-- pragma translate_off
+ if not is_x(A) then
+-- pragma translate_on
+ DOut <= RAM(to_integer(unsigned(A(AddrWidth - 1 downto 0))));
+-- pragma translate_off
+ end if;
+-- pragma translate_on
+ if CE_n = '0' and WE_n = '0' then
+ RAM(to_integer(unsigned(A))) <= DIn;
+ end if;
+-- A_r <= A;
+ end if;
+ end process;
+
+end;
diff --git a/rtl/vhdl/SSRAMX.vhd b/rtl/vhdl/SSRAMX.vhd
new file mode 100644
index 0000000..5cabb5c
--- /dev/null
+++ b/rtl/vhdl/SSRAMX.vhd
@@ -0,0 +1,132 @@
+--
+-- Xilinx Block RAM, 8 bit wide and variable size (Min. 512 bytes)
+--
+-- Version : 0247
+--
+-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+-- 0240 : Initial release
+--
+-- 0242 : Changed RAMB4_S8 to map by name
+--
+-- 0247 : Added RAMB4_S8 component declaration
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+entity SSRAM is
+ generic(
+ AddrWidth : integer := 11;
+ DataWidth : integer := 8
+ );
+ port(
+ Clk : in std_logic;
+ CE_n : in std_logic;
+ WE_n : in std_logic;
+ A : in std_logic_vector(AddrWidth - 1 downto 0);
+ DIn : in std_logic_vector(DataWidth - 1 downto 0);
+ DOut : out std_logic_vector(DataWidth - 1 downto 0)
+ );
+end SSRAM;
+
+architecture rtl of SSRAM is
+
+ component RAMB4_S8
+ port(
+ DO : out std_logic_vector(7 downto 0);
+ ADDR : in std_logic_vector(8 downto 0);
+ CLK : in std_ulogic;
+ DI : in std_logic_vector(7 downto 0);
+ EN : in std_ulogic;
+ RST : in std_ulogic;
+ WE : in std_ulogic);
+ end component;
+
+ constant RAMs : integer := (2 ** AddrWidth) / 512;
+
+ type bRAMOut_a is array(0 to RAMs - 1) of std_logic_vector(7 downto 0);
+
+ signal bRAMOut : bRAMOut_a;
+ signal biA_r : integer;
+ signal A_r : unsigned(A'left downto 0);
+-- signal A_i : std_logic_vector(8 downto 0);
+ signal WEA : std_logic_vector(RAMs - 1 downto 0);
+
+begin
+
+ process (Clk)
+ begin
+ if Clk'event and Clk = '1' then
+ A_r <= unsigned(A);
+ end if;
+ end process;
+
+ biA_r <= to_integer(A_r(A'left downto 9));
+-- A_i <= std_logic_vector(A_r(8 downto 0)) when (CE_n nor WE_n) = '1' else A(8 downto 0);
+
+ bG1: for I in 0 to RAMs - 1 generate
+ begin
+ WEA(I) <= '1' when (CE_n nor WE_n) = '1' and biA_r = I else '0';
+ BSSRAM : RAMB4_S8
+ port map(
+ DI => DIn,
+ EN => '1',
+ WE => WEA(I),
+ RST => '0',
+ CLK => Clk,
+ ADDR => A,
+ DO => bRAMOut(I));
+ end generate;
+
+ process (biA_r, bRAMOut)
+ begin
+ DOut <= bRAMOut(0);
+ for I in 1 to RAMs - 1 loop
+ if biA_r = I then
+ DOut <= bRAMOut(I);
+ end if;
+ end loop;
+ end process;
+
+end;
diff --git a/rtl/vhdl/T51.vhd b/rtl/vhdl/T51.vhd
new file mode 100644
index 0000000..2254dc5
--- /dev/null
+++ b/rtl/vhdl/T51.vhd
@@ -0,0 +1,1496 @@
+--
+-- 8051 compatible microcontroller core
+--
+-- Version : 0300
+--
+-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
+-- (c) 2004-2005 Andreas Voggeneder (andreas.voggeneder@fh-hagenberg.at)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+-- 16-Dec-05 : Bugfix for JBC instruction
+-- 21-Jan-06 : Bugfix for INC DPTR instruction for special cases
+-- 19-Feb-06 : Bugfix for Interrupts at stalled instructions
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+use work.T51_Pack.all;
+
+entity T51 is
+ generic(
+ DualBus : integer := 1; -- FALSE: single bus movx
+ RAMAddressWidth : integer := 8;
+ SecondDPTR : integer := 0;
+ t8032 : integer := 0; -- 0== advanced movx timing, not compatible to T8032
+ tristate : integer := 1;
+ simenv : integer := 0
+ );
+ port(
+ Clk : in std_logic;
+ Rst_n : in std_logic;
+ Ready : in std_logic;
+ ROM_Addr : out std_logic_vector(15 downto 0);
+ ROM_Data : in std_logic_vector(7 downto 0);
+ RAM_Addr : out std_logic_vector(15 downto 0);
+ RAM_RData : in std_logic_vector(7 downto 0);
+ RAM_WData : out std_logic_vector(7 downto 0);
+ RAM_Cycle : out std_logic;
+ RAM_Rd : out std_logic;
+ RAM_Wr : out std_logic;
+ Int_Trig : in std_logic_vector(6 downto 0);
+ Int_Acc : out std_logic_vector(6 downto 0);
+ SFR_Rd_RMW : out std_logic;
+ SFR_Wr : out std_logic;
+ SFR_Addr : out std_logic_vector(6 downto 0);
+ SFR_WData : out std_logic_vector(7 downto 0);
+ SFR_RData_in : in std_logic_vector(7 downto 0);
+ IRAM_Wr : out std_logic;
+ IRAM_Addr : out std_logic_vector(7 downto 0);
+ IRAM_WData : out std_logic_vector(7 downto 0)
+ );
+end T51;
+
+architecture rtl of T51 is
+ constant Altera_IRAM_c : boolean :=false;
+ -- speeds up instructions "mov @Ri,direct" and "mov Ri,direct" by one cycle
+ -- but not fully testet. So use it with care
+ constant fast_cpu_c : integer := 0;
+
+ -- Registers
+ signal ACC : std_logic_vector(7 downto 0);
+ signal B : std_logic_vector(7 downto 0);
+ signal PSW : std_logic_vector(7 downto 1); -- Bit 0 is parity
+ signal PSW0 : std_logic;
+ signal IP : std_logic_vector(7 downto 0);
+ signal SP : unsigned(7 downto 0);
+ signal DPL0 : std_logic_vector(7 downto 0); -- DPTR 0
+ signal DPH0 : std_logic_vector(7 downto 0); -- DPTR 0
+ signal DPL1 : std_logic_vector(7 downto 0); -- DPTR 1
+ signal DPH1 : std_logic_vector(7 downto 0); -- DPTR 1
+ signal DPL : std_logic_vector(7 downto 0); -- current DPTR
+ signal DPH : std_logic_vector(7 downto 0); -- current DPTR
+ signal DPS,next_DPS : std_logic;
+ signal dptr_inc : std_logic_vector(15 downto 0);
+ signal DPS_r : std_logic;
+ signal PC : unsigned(15 downto 0);
+ signal P2R : std_logic_vector(7 downto 0);
+
+ signal PCC : std_logic_vector(15 downto 0);
+ signal NPC : unsigned(15 downto 0);
+ signal OPC : unsigned(15 downto 0);
+
+ -- ALU signals
+ signal Op_A : std_logic_vector(7 downto 0);
+ signal Op_B : std_logic_vector(7 downto 0);
+ signal Mem_A : std_logic_vector(7 downto 0);
+ signal Mem_B : std_logic_vector(7 downto 0);
+ signal Old_Mem_B : std_logic_vector(7 downto 0);
+ signal ACC_Q : std_logic_vector(7 downto 0);
+ signal B_Q : std_logic_vector(7 downto 0);
+ signal Res_Bus : std_logic_vector(7 downto 0);
+ signal Status_D : std_logic_vector(7 downto 5);
+ signal Status_Wr : std_logic_vector(7 downto 5);
+
+ -- Misc signals
+ signal Int_AddrA : std_logic_vector(7 downto 0);
+ signal Int_AddrA_r : std_logic_vector(7 downto 0);
+ signal Int_AddrB : std_logic_vector(7 downto 0);
+
+ signal MCode : std_logic_vector(3 downto 0);
+ signal FCycle : std_logic_vector(1 downto 0);
+
+ signal RET_r : std_logic;
+ signal RET : std_logic;
+
+ signal Stall_pipe : std_logic;
+ signal Ri_Stall : std_logic;
+ signal PSW_Stall : std_logic;
+ signal ACC_Stall : std_logic;
+ signal SP_Stall : std_logic;
+ signal movx_Stall : std_logic;
+ signal iReady : std_logic;
+
+ signal Next_PSW7 : std_logic;
+ signal Next_ACC_Z : std_logic;
+ signal ACC_Wr : std_logic;
+ signal B_Wr : std_logic;
+
+ signal SFR_RData_r : std_logic_vector(7 downto 0);
+ signal SFR_RData : std_logic_vector(7 downto 0);
+
+ signal Mem_Din : std_logic_vector(7 downto 0);
+
+ signal Bit_Pattern : std_logic_vector(7 downto 0);
+
+ -- Registered instruction words.
+ signal Inst : std_logic_vector(7 downto 0);
+ signal Inst1 : std_logic_vector(7 downto 0);
+ signal Inst2 : std_logic_vector(7 downto 0);
+
+ -- Control signals
+ signal Rst_r_n : std_logic;
+ signal Last : std_logic;
+ signal SFR_Wr_i : std_logic;
+ signal Mem_Wr : std_logic;
+ signal J_Skip : std_logic;
+ signal IPending : std_logic;
+ signal Int_Trig_r : std_logic_vector(6 downto 0);
+ signal IStart : std_logic;
+ signal ICall : std_logic;
+ signal HPInt : std_logic;
+ signal LPInt : std_logic;
+ signal PCPaused : std_logic_vector(3 downto 0);
+ signal PCPause : std_logic;
+ signal Inst_Skip : std_logic;
+ signal Div_Rdy : std_logic;
+ signal RAM_Rd_i : std_logic;
+ signal RAM_Wr_i : std_logic;
+ signal INC_DPTR : std_logic;
+ signal CJNE : std_logic;
+ signal DJNZ : std_logic;
+
+ -- Mux control
+ signal AMux_SFR : std_logic;
+ signal BMux_Inst2 : std_logic;
+ signal RMux_PCL : std_logic;
+ signal RMux_PCH : std_logic;
+
+ signal next_Mem_Wr : std_logic;
+
+ signal rd_flag,xxx_flag : std_logic;
+ signal rd_flag_r : std_ulogic;
+ signal rd_sfr_flag : std_logic;
+ signal Do_ACC_Wr : std_logic;
+
+ signal ramc,ramc_r,ramrw_r : std_logic;
+begin
+
+ iReady <= Ready and not xxx_flag;
+ ram_cycle <= ramc;
+
+ Last <= '1' when ICall = '1' and FCycle = "11" else
+ '0' when ICall = '1' else
+ '1' when MCode(1 downto 0) = FCycle and iReady = '1' else
+ '0';
+
+ -- (ROM_Data, ICall, Inst, Inst1, Inst2, Last, FCycle, PSW, Mem_B, SP, Old_Mem_B, Ready, Int_AddrA_r)
+ process (FCycle, ICall, Inst, Inst1, Inst2, Int_AddrA_r, Last, Mem_B, Old_Mem_B, PSW,
+ ROM_Data, Ready, SP, SFR_Wr_i, Res_Bus)
+ begin
+ Int_AddrA <= "--------";
+-- Int_AddrB <= "--------";
+ Int_AddrB <= "000" & PSW(4 downto 3) & "00" & Inst(0);
+ rd_flag <= '0';
+ rd_sfr_flag <= '0';
+
+ if Inst(3 downto 0) = "0000" or Inst(3 downto 0) = "0010" then
+ if Inst(3 downto 0) = "0000" or (Inst(3 downto 0) = "0010" and (Inst(7) = '1' or Inst(6 downto 4) = "111")) then
+ if Inst1(7) = '0' then
+ Int_AddrA <= "0010" & Inst1(6 downto 3);
+ else
+ Int_AddrA <= "1" & Inst1(6 downto 3) & "000";
+ end if;
+ else
+ Int_AddrA <= Inst1;
+ end if;
+ if Inst = "00010010" or ICall = '1' then
+ -- LCALL
+ if FCycle = "01" then
+ Int_AddrA <= std_logic_vector(SP + 1);
+ else
+ Int_AddrA <= std_logic_vector(SP + 2);
+ end if;
+ end if;
+ if Inst = "11000000" then
+ -- 11000000 2 PUSH data addr INC SP: MOV "@SP",<src>
+ if FCycle = "10" then
+ Int_AddrA <= std_logic_vector(SP);
+ else
+ Int_AddrA <= Inst1;
+ end if;
+ end if;
+ if Inst = "11010000" then
+ -- 11010000 2 POP data addr MOV <dest>,"@SP": DEC SP
+ if FCycle = "10" then
+ Int_AddrA <= Inst1;
+ else
+ Int_AddrA <= std_logic_vector(SP);
+ end if;
+ end if;
+ if Inst(7 downto 5) = "001" and Inst(3 downto 0) = "0010" then
+ -- RET, RETI
+ Int_AddrA <= std_logic_vector(SP);
+ Int_AddrB <= std_logic_vector(SP - 1);
+ end if;
+ elsif Inst(4 downto 0) = "10001" then
+ -- ACALL
+ if FCycle = "01" then
+ Int_AddrA <= std_logic_vector(SP + 1);
+ else
+ Int_AddrA <= std_logic_vector(SP + 2);
+ end if;
+ elsif Inst(3 downto 0) = "0011" then
+ Int_AddrA <= inst1;
+ elsif Inst(3 downto 0) = "0100" then
+ elsif Inst(3 downto 0) = "0101" then
+ if Inst(7 downto 4) = "1000" and FCycle = "11" then
+ Int_AddrA <= Inst2;
+ else
+ Int_AddrA <= Inst1;
+ end if;
+ elsif Inst(3 downto 1) = "011" then -- @Ri Adressing mode
+ if FCycle(1 downto 0) = "01" then
+ Int_AddrA <= Mem_B;
+ else
+ Int_AddrA <= Old_Mem_B;
+ end if;
+ if Inst(7 downto 4) = "1000" and FCycle = "10" then
+ Int_AddrA <= Inst1; -- mov direct,@Ri
+ end if;
+ if Inst(7 downto 4) = "1010" and FCycle = "01" then
+ Int_AddrA <= ROM_Data; -- mov @Ri,direct
+ rd_flag <= '1';
+ end if;
+ elsif Inst(3) = '1' then
+ Int_AddrA <= "000" & PSW(4 downto 3) & Inst(2 downto 0);
+ if Inst(7 downto 4) = "1000" and FCycle = "10" then
+ Int_AddrA <= Inst1;
+ end if;
+ if Inst(7 downto 4) = "1010" and FCycle = "01" then
+ Int_AddrA <= ROM_Data; -- mov Ri,data
+ rd_flag <= '1';
+ end if;
+ end if;
+
+-- if Last = '1' then
+ -- Modified by AVG
+ if (Inst(7 downto 5) /= "001" or Inst(3 downto 0) /= "0010") and -- not a RET, RETI
+ (ROM_Data(3 downto 1) = "011" or -- Next or current Instruction has @Ri Addressing Mode
+ Inst(3 downto 1) = "011" or
+ ROM_Data(7 downto 1)="1110001" or ROM_Data(7 downto 1)="1111001") then -- MOVX @Ri,A ; MOVX A,@Ri
+ if Last = '1' then
+ Int_AddrB <= "000" & PSW(4 downto 3) & "00" & ROM_Data(0);
+ -- write to psw is in progress => forward argument
+ -- decreases timing !!!
+ if fast_cpu_c/=0 and SFR_Wr_i = '1' and Int_AddrA_r = "11010000" then
+ Int_AddrB <= "000" & Res_Bus(4 downto 3) & "00" & ROM_Data(0);
+ end if;
+ end if;
+ rd_sfr_flag <= '1';
+
+ end if;
+-- end if;
+-- if Inst(7 downto 1) = "1011011" then -- cjne @ri,#im
+-- Int_AddrB <= "000" & PSW(4 downto 3) & "00" & Inst(0);
+-- end if;
+
+ if Ready = '0' then
+ Int_AddrA <= Int_AddrA_r;
+ end if;
+ end process;
+
+ Op_A <= SFR_RData_r when AMux_SFR = '1' else
+ Mem_A;
+
+ Op_B <= Inst2 when BMux_Inst2 = '1' else
+ Inst1;
+
+ -- Store return Address to mem (Stack) when a call (or interrupt) occured
+ Mem_Din <= PCC(7 downto 0) when RMux_PCL = '1' else
+ PCC(15 downto 8) when RMux_PCH = '1' else
+ Res_Bus;
+
+
+ process (Clk)
+ begin
+ if Clk'event and Clk = '1' then
+ AMux_SFR <= '0';
+ BMux_Inst2 <= '0';
+ RMux_PCL <= '0';
+ RMux_PCH <= '0';
+
+ if Int_AddrA(7) = '1' then
+ AMux_SFR <= '1';
+ end if;
+ if Inst(3 downto 1) = "011" then -- relative addressing mode
+ -- not "mov @ri,direct"
+ if not (Inst(7 downto 4) = "1010") then -- and FCycle = "10") then
+ -- Indirect addressing
+ AMux_SFR <= '0';
+ end if;
+ end if;
+ if Inst = "11010000" then
+ -- 11010000 2 POP data addr MOV <dest>,"@SP": DEC SP
+-- if FCycle = "10" then
+ AMux_SFR <= '0';
+-- end if;
+ end if;
+
+ if Inst(3 downto 0) = "0011" or Inst(3 downto 0) = "0101" then
+ BMux_Inst2 <= '1';
+ end if;
+
+ -- LCALL, ACALL, Int
+ if (Inst = "00010010" or Inst(4 downto 0) = "10001" or ICall = '1') then
+ if FCycle = "01" then
+ RMux_PCL <= '1';
+ elsif FCycle = "10" then
+ RMux_PCH <= '1';
+ end if;
+ end if;
+ end if;
+ end process;
+
+ SFR_Wr <= SFR_Wr_i;
+ SFR_Addr <= Int_AddrA(6 downto 0);
+ SFR_WData <= Res_Bus;
+
+ SFR_Rd_RMW <= '1' when Last = '1' and MCode(3) = '1' and Int_AddrA(7) = '1' and
+ (Inst(7 downto 4) = "1000" or Inst(3 downto 1) /= "011") and
+ Inst /= "11000000" else -- no push
+ '0';
+
+ next_Mem_Wr <= '1' when Last = '1' and MCode(3) = '1' and
+ (Int_AddrA(7) = '0' or
+ -- Instruction is no MOV and indirect addressing mode
+ (Inst(7 downto 4) /= "1000" and Inst(3 downto 1) = "011") or
+ Inst = "11000000" ) else -- PUSH Instruction
+ '0';
+
+
+ process (Clk)
+ begin
+ if Clk'event and Clk = '1' then
+ SFR_Wr_i <= '0';
+ Mem_Wr <= '0';
+ if Last = '1' and MCode(3) = '1' then
+ -- MOV or no indirect addressing
+ if Int_AddrA(7) = '1' and (Inst(7 downto 4) = "1000" or Inst(3 downto 1) /= "011") and
+ Inst /= "11000000" then
+ -- Direct addressing
+ if(Inst = "00010000") then -- JBC, write result only back if jump is taken
+ SFR_Wr_i <= J_Skip;
+ else
+ -- Direct addressing
+ SFR_Wr_i <= '1';
+ end if;
+ else
+ Mem_Wr <= '1';
+ end if;
+ end if;
+
+ -- LCALL, ACALL, Int
+ if iReady = '1' and (Inst = "00010010" or Inst(4 downto 0) = "10001" or ICall = '1') then
+ if FCycle /= "11" then -- LCALL
+ Mem_Wr <= '1';
+ end if;
+ end if;
+ end if;
+ end process;
+
+ -- Instruction register
+ Inst_Skip <= RET_r or J_Skip; -- '1' when (RET_r = '1' and unsigned(Mem_B) /= PC(15 downto 8)) else J_Skip; ????????????
+-- Ri_Stall <= '1' when Inst /= "00000000" and
+-- Int_AddrA = "000" & PSW(4 downto 3) & Inst(2 downto 0) and --Write to Ri in Progress
+-- ROM_Data(3 downto 1) = "011" and --@Ri at next opcode
+-- Last = '1' and MCode(3) = '1' else '0';
+
+-- WHEN MCODE(3)==1 => Write to Memory or FSR is in Progress
+
+ -- Modified by AVG
+ Ri_Stall <= '1' when Inst /= "00000000" and
+ next_Mem_Wr ='1' and
+ (Int_AddrA = "000" & PSW(4 downto 3) & "00"&ROM_Data(0) and
+ (ROM_Data(3 downto 1) = "011" or -- @Ri at next opcode
+ ROM_Data(7 downto 1)="1110001" or -- movx a,@ri at next opcode
+ ROM_Data(7 downto 1)="1111001")) -- movx @ri,a at next opcod
+ else '0';
+
+-- WHEN MCODE(3)==1 => Write to Memory or FSR is in Progress
+ -- Modified by AVG
+ PSW_Stall <= '1' when Int_AddrA = "11010000" and
+ next_Mem_Wr='0' and -- PSW Adressed and no memory write
+ (ROM_Data(3 downto 1) = "011" or -- @Ri at next opcode
+ ROM_Data(3) = '1') and -- Rx at next opcode
+ Last = '1' and
+ MCode(3) = '1' else
+ '0';
+
+-- WHEN MCODE(2)==1 => Write to ACC in Progress
+-- Stall Pipe when Write to ACC is in Progress and next Instruction is JMP @A+DPTR
+-- Modified by AVG
+ ACC_Stall <= '1' when ROM_Data = "01110011" and
+ Last = '1' and MCode(2) = '1' else
+ '0';
+
+ -- when a write to SP is in progress
+ -- and next opcode is a call or interrupt
+ -- -> stall pipe (nop insertion)
+ -- Modified by AVG
+ SP_Stall <= '1' when Last = '1' and MCode(3) = '1' and
+ Int_AddrA = "10000001" and
+ (Inst(7 downto 4) = "1000" or -- mov opcode
+ Inst(3 downto 1) /= "011") and -- and no indirect addressing
+ Inst /= "11000000" and -- and not PUSH
+ (ROM_Data = "00010010" or
+ ROM_Data(4 downto 0) = "10001" or
+ IStart = '1') else -- LCALL, ACALL, Int
+ '0';
+
+ -- to subsequent movx instructions
+ movx_Stall <= '1' when Last = '1' and
+ -- movx opcode at current instruction
+ Inst(7 downto 5) = "111" and Inst(3 downto 2) = "00" and
+ Inst(1 downto 0) /= "01" and
+ -- movx opcode at next instruction
+ ROM_Data(7 downto 5) = "111" and ROM_Data(3 downto 2) = "00" and
+ ROM_Data(1 downto 0) /= "01" else
+ '0';
+
+ Stall_pipe <= (Ri_Stall or PSW_Stall or ACC_Stall or SP_Stall or movx_Stall) and not IStart;
+
+ process (Rst_n, Clk)
+ variable bitnr_v : natural range 0 to 7;
+ begin
+ if Rst_n = '0' then
+ Rst_r_n <= '0';
+ Inst <= (others => '0'); -- Force NOP at reset.
+ Inst1 <= (others => '0');
+ Inst2 <= (others => '0');
+ Bit_Pattern <= "00000000";
+ elsif Clk'event and Clk = '1' then
+ Rst_r_n <= '1';
+ if iReady = '0' then
+ elsif Rst_r_n = '0' or
+ Inst_Skip = '1' or IStart = '1' or
+ Stall_pipe = '1' then
+-- Ri_Stall = '1' or PSW_Stall = '1' or ACC_Stall = '1' then
+ -- Skip/Stall/Flush: NOP insertion
+ Inst <= (others => '0');
+ elsif Inst = "10000100" and PCPause = '1' then -- DIV
+ else
+ if Last = '1' then
+ Inst <= ROM_Data;
+ end if;
+ if FCycle = "01" then
+ Inst1 <= ROM_Data;
+ end if;
+ if FCycle = "10" then
+ Inst2 <= ROM_Data;
+ end if;
+ end if;
+ if FCycle = "01" then
+ Bit_Pattern <= "00000000";
+ bitnr_v := to_integer(unsigned(ROM_Data(2 downto 0)));
+ Bit_Pattern(bitnr_v) <= '1';
+
+-- case ROM_Data(2 downto 0) is
+-- when "000" =>
+-- Bit_Pattern <= "00000001";
+-- when "001" =>
+-- Bit_Pattern <= "00000010";
+-- when "010" =>
+-- Bit_Pattern <= "00000100";
+-- when "011" =>
+-- Bit_Pattern <= "00001000";
+-- when "100" =>
+-- Bit_Pattern <= "00010000";
+-- when "101" =>
+-- Bit_Pattern <= "00100000";
+-- when "110" =>
+-- Bit_Pattern <= "01000000";
+-- when others =>
+-- Bit_Pattern <= "10000000";
+-- end case;
+ end if;
+ end if;
+ end process;
+
+ -- Accumulator, B and status register
+ tristate_mux: if tristate/=0 generate
+ SFR_RData <= PSW & PSW0 when Int_AddrA = "11010000" else "ZZZZZZZZ";
+ SFR_RData <= ACC when Int_AddrA = "11100000" else "ZZZZZZZZ";
+ SFR_RData <= B when Int_AddrA = "11110000" else "ZZZZZZZZ";
+ -- Stack pointer
+ SFR_RData <= std_logic_vector(SP) when Int_AddrA = "10000001" else "ZZZZZZZZ";
+
+ SFR_RData <= dptr_inc(7 downto 0) when (SecondDPTR/=0 and (INC_DPTR and next_DPS) = '1' and Int_AddrA = "10000100") or
+ ((INC_DPTR and not next_DPS) = '1' and Int_AddrA = "10000010") else "ZZZZZZZZ";
+ SFR_RData <= dptr_inc(15 downto 8) when (SecondDPTR/=0 and (INC_DPTR and next_DPS) = '1' and Int_AddrA = "10000101") or
+ ((INC_DPTR and not next_DPS) = '1' and Int_AddrA = "10000011") else "ZZZZZZZZ";
+
+ SFR_RData <= DPL1 when SecondDPTR/=0 and INC_DPTR='0' and Int_AddrA = "10000100" else "ZZZZZZZZ";
+ SFR_RData <= DPH1 when SecondDPTR/=0 and INC_DPTR='0' and Int_AddrA = "10000101" else "ZZZZZZZZ";
+ SFR_RData <= "0000000"&DPS when SecondDPTR/=0 and Int_AddrA = "10000110" else "ZZZZZZZZ";
+
+ SFR_RData <= DPL0 when INC_DPTR='0' and Int_AddrA = "10000010" else "ZZZZZZZZ";
+ SFR_RData <= DPH0 when INC_DPTR='0' and Int_AddrA = "10000011" else "ZZZZZZZZ";
+ SFR_RData <= IP when Int_AddrA = "10111000" else "ZZZZZZZZ";
+ SFR_RData <= SFR_RData_in;
+ end generate;
+
+ std_mux: if tristate=0 generate
+ SFR_RData <= PSW & PSW0 when Int_AddrA = "11010000" else
+ ACC when Int_AddrA = "11100000" else
+ B when Int_AddrA = "11110000" else
+ std_logic_vector(SP) when Int_AddrA = "10000001" else
+
+ dptr_inc(7 downto 0) when (SecondDPTR/=0 and (INC_DPTR and next_DPS) = '1' and Int_AddrA = "10000100") or
+ ((INC_DPTR and not next_DPS) = '1' and Int_AddrA = "10000010") else
+ dptr_inc(15 downto 8) when (SecondDPTR/=0 and (INC_DPTR and next_DPS) = '1' and Int_AddrA = "10000101") or
+ ((INC_DPTR and not next_DPS) = '1' and Int_AddrA = "10000011") else
+ DPL1 when SecondDPTR/=0 and INC_DPTR='0' and Int_AddrA = "10000100" else
+ DPH1 when SecondDPTR/=0 and INC_DPTR='0' and Int_AddrA = "10000101" else
+ "0000000"&DPS when SecondDPTR/=0 and Int_AddrA = "10000110" else
+
+ DPL0 when INC_DPTR='0' and Int_AddrA = "10000010" else
+ DPH0 when INC_DPTR='0' and Int_AddrA = "10000011" else
+ IP when Int_AddrA = "10111000" else
+ SFR_RData_in;
+
+ -- -- is it an internal or external read
+ -- Int_Read <= '1' when Int_AddrA = "11010000" or
+ -- Int_AddrA = "11100000" or
+ -- Int_AddrA = "11110000" or
+ -- Int_AddrA = "10000001" or
+ --
+ -- (SecondDPTR and Int_AddrA = "10000100") or
+ -- (SecondDPTR and Int_AddrA = "10000101") or
+ -- (SecondDPTR and Int_AddrA = "10000110") or
+ --
+ -- Int_AddrA = "10000010" or
+ -- Int_AddrA = "10000011" or
+ -- Int_AddrA = "10111000" else
+ -- '0';
+
+ end generate;
+
+ PSW0 <= ACC(7) xor ACC(6) xor ACC(5) xor ACC(4) xor ACC(3) xor ACC(2) xor ACC(1) xor ACC(0);
+ Next_PSW7 <= Res_Bus(7) when SFR_Wr_i = '1' and Int_AddrA_r = "11010000" else
+ Status_D(7) when Status_Wr(7) = '1' else
+ PSW(7);
+ Next_ACC_Z <= '1' when ACC_Q = "00000000" and ACC_Wr = '1' else
+ '1' when ACC = "00000000" else '0';
+
+ process (Rst_n, Clk)
+-- variable B_Wr : std_logic;
+ begin
+ if Rst_n = '0' then
+ PSW <= "0000000";
+ ACC <= "00000000";
+ B <= "00000000";
+ ACC_Wr <= '0';
+ B_Wr <= '0';
+ elsif Clk'event and Clk = '1' then
+ if ACC_Wr = '1' then
+ ACC <= ACC_Q;
+ end if;
+ if B_Wr = '1' then
+ B <= B_Q;
+ end if;
+ if (MCode(2) and Last) = '1' or (Inst = "10000100" and PCPause = '0') then
+ ACC_Wr <= '1';
+ else
+ ACC_Wr <= '0';
+ end if;
+ if ((Inst = "10000100" and PCPause = '0') or Inst = "10100100") and Last = '1' then -- DIV, MUL
+ B_Wr <= '1';
+ else
+ B_Wr <= '0';
+ end if;
+
+ if SFR_Wr_i = '1' and Int_AddrA_r = "11100000" then
+ ACC <= Res_Bus;
+ end if;
+
+ if RAM_Rd_i = '1' then
+ ACC <= RAM_RData;
+ end if;
+
+ if SFR_Wr_i = '1' and Int_AddrA_r = "11110000" then
+ B <= Res_Bus;
+ end if;
+
+ if Inst(7 downto 5) = "100" and Inst(3 downto 0) = "0011" then -- MOVC
+ if FCycle = "11" then
+ ACC <= ROM_Data;
+ end if;
+ end if;
+
+ if SFR_Wr_i = '1' and Int_AddrA_r = "11010000" then
+ PSW <= Res_Bus(7 downto 1);
+ end if;
+ -- CY
+ if Status_Wr(7) = '1' then PSW(7) <= Status_D(7); end if;
+ -- AC
+ if Status_Wr(6) = '1' then PSW(6) <= Status_D(6); end if;
+ -- OV
+ if Status_Wr(5) = '1' then PSW(2) <= Status_D(5); end if;
+ end if;
+ end process;
+
+
+ process (Rst_n, Clk)
+ begin
+ if Rst_n = '0' then
+ SP <= "00000111";
+ elsif Clk'event and Clk = '1' then
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10000001" then
+ SP <= unsigned(Res_Bus);
+ end if;
+ if iReady = '1' then
+ if Inst(7 downto 5) = "001" and Inst(3 downto 0) = "0010" then
+ SP <= SP - 2;
+ end if;
+ if (Inst = "00010010" or Inst(4 downto 0) = "10001" or ICall = '1') and Last = '1' then
+ -- LCALL, ACALL, ICall
+ SP <= SP + 2;
+ end if;
+ if Inst = "11000000" and PCPaused(0) = '1' then
+ -- 11000000 2 PUSH data addr INC SP: MOV "@SP",<src>
+ SP <= SP + 1;
+ end if;
+ if Inst = "11010000" and Last = '1' then
+ -- 11010000 2 POP data addr MOV <dest>,"@SP": DEC SP
+ SP <= SP - 1;
+ end if;
+ end if;
+ end if;
+ end process;
+
+ twoDPTR: if SecondDPTR/=0 generate
+ next_DPS <= Res_Bus(0) when SFR_Wr_i = '1' and Int_AddrA_r = "10000110" else
+ DPS;
+
+ DPL <= DPL0 when next_DPS='0' else
+ DPL1;
+ DPH <= DPH0 when next_DPS='0' else
+ DPH1;
+-- SFR_RData <= DPL1 when Int_AddrA = "10000100" else "ZZZZZZZZ";
+-- SFR_RData <= DPH1 when Int_AddrA = "10000101" else "ZZZZZZZZ";
+-- SFR_RData <= "0000000"&DPS when Int_AddrA = "10000110" else "ZZZZZZZZ";
+ end generate;
+ oneDPTR: if SecondDPTR=0 generate
+ DPL <= DPL0;
+ DPH <= DPH0;
+ next_DPS <= '0';
+ end generate;
+
+ -- DPTR/RAM_Addr
+ RAM_WData <= ACC;
+ --(Inst, P2R, DPH, DPL, Int_AddrA_r, SFR_Wr_i, Res_Bus, INC_DPTR, Mem_B)
+ process (DPH, DPL, INC_DPTR, dptr_inc, Inst, Int_AddrA_r, Mem_B, P2R, Res_Bus, SFR_Wr_i, DPS)
+ begin
+ RAM_Addr <= DPH & DPL;
+ if Inst(1) = '0' then
+ if (SFR_Wr_i = '1' and Int_AddrA_r = "10000010" and DPS = '0') or
+ (SecondDPTR/=0 and SFR_Wr_i = '1' and Int_AddrA_r = "10000100" and DPS = '1')
+ then
+ RAM_Addr(7 downto 0) <= Res_Bus;
+ end if;
+ if (SFR_Wr_i = '1' and Int_AddrA_r = "10000011" and DPS = '0') or
+ (SecondDPTR/=0 and SFR_Wr_i = '1' and Int_AddrA_r = "10000101" and DPS = '1')
+ then
+ RAM_Addr(15 downto 8) <= Res_Bus;
+ end if;
+ -- 10100011 1 INC DPTR
+ if INC_DPTR = '1' then
+-- RAM_Addr <= std_logic_vector(unsigned(DPH) & unsigned(DPL) + 1);
+ RAM_Addr <= dptr_inc;
+ end if;
+ else -- movx a,@ri or movx @ri,a
+ RAM_Addr <= P2R & Mem_B;
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10100000" then
+ RAM_Addr(15 downto 8) <= Res_Bus;
+ end if;
+ end if;
+ end process;
+
+ --if Inst(7 downto 2) = "111000" and Inst(1 downto 0) /= "01" then
+ -- MOVX Instruction
+ ramc <= '1' when Inst(7 downto 5) = "111" and Inst(3 downto 2) = "00" and
+ Inst(1 downto 0) /= "01" and
+ PCPaused(0) = '0' else
+ '0';
+
+-- RAM_Rd <= RAM_Rd_i and ramc and not ramrw_r when DualBus=0 else
+-- RAM_Rd_i and ramc;
+ RAM_Rd <= RAM_Rd_i and ramc when t8032=0 else
+ RAM_Rd_i;
+
+ RAM_Wr <= RAM_Wr_i;
+
+ Do_ACC_Wr <= '1' when (ACC_Wr or RAM_Rd_i)='1' or
+ (SFR_Wr_i = '1' and Int_AddrA_r = "11100000") else
+ '0';
+
+-- Gefählich sind:
+-- mov @Ri,direct
+-- mov Ri,data
+-- da diese Befehle die Quelldaten einen Takt früher lesen als alle anderen Befehle
+
+-- xxx_flag <= '1' when ((SFR_Wr_i and rd_flag)= '1' and Int_AddrA_r=Int_AddrA) or
+-- ((Do_ACC_Wr and rd_flag)='1' and Int_AddrA = "11010000") or
+-- (Status_Wr/="000" and rd_flag='1' and Int_AddrA="11010000") or
+-- (fast_cpu_c=0 and (rd_sfr_flag and SFR_Wr_i) = '1' and Int_AddrA_r = "11010000") else
+-- '0';
+ fast: if fast_cpu_c/=0 generate
+ xxx_flag <= '1' when ((SFR_Wr_i and rd_flag)= '1' and Int_AddrA_r=Int_AddrA) or
+ ((Do_ACC_Wr and rd_flag)='1' and Int_AddrA = "11010000") or -- WR to ACC in Progress and read from PSW
+ ((B_Wr and rd_flag)= '1' and Int_AddrA = "11110000") or
+ (Status_Wr/="000" and rd_flag='1' and Int_AddrA="11010000") or
+-- (ramc='1' and ramc_r='0')
+ (t8032=0 and Inst(7 downto 2) = "111000" and Inst(1 downto 0) /= "01" and ramc_r='0') --MOVX A,??
+-- (((RAM_Rd_i and ramc)='1' or RAM_Wr_i='1') and ramrw_r='0' and DualBus=0)
+ else
+ '0';
+ end generate;
+ slow: if fast_cpu_c=0 generate
+ -- Inserts an Waitstate on every mov @Ri,direct or mov Ri,data Instruction
+ xxx_flag <= '1' when (rd_flag and not rd_flag_r) = '1' or -- mov @ri,direct or mov ri,direct
+ ((rd_sfr_flag and SFR_Wr_i) = '1' and Int_AddrA_r = "11010000") or -- Wr to PSW and @Ri Adressing at next instruction
+-- (ramc='1' and ramc_r='0')
+ (t8032=0 and Inst(7 downto 2) = "111000" and Inst(1 downto 0) /= "01" and ramc_r='0') or --MOVX A,??
+-- (((RAM_Rd_i and ramc)='1' or RAM_Wr_i='1') and ramrw_r='0' and DualBus=0)
+ (t8032=0 and (RAM_Wr_i='1') and ramrw_r='0' and DualBus=0)
+ else
+ '0';
+
+ process(Rst_n, Clk)
+ begin
+ if Rst_n = '0' then
+ rd_flag_r <= '0';
+ elsif Clk'event and Clk = '1' then
+ rd_flag_r <= rd_flag;
+ end if;
+ end process;
+
+ end generate;
+
+ process (Rst_n, Clk)
+ variable tmp : unsigned(15 downto 0);
+ begin
+ if Rst_n = '0' then
+ P2R <= "11111111";
+ DPL0 <= "00000000";
+ DPH0 <= "00000000";
+ INC_DPTR <= '0';
+ RAM_Rd_i <= '0';
+ RAM_Wr_i <= '0';
+ if SecondDPTR/=0 then
+ DPL1 <= "00000000";
+ DPH1 <= "00000000";
+ DPS_r <= '0';
+ end if;
+ ramc_r <= '0';
+ ramrw_r <= '0';
+ elsif Clk'event and Clk = '1' then
+ if Ready='1' then
+ ramc_r <= ramc;
+ ramrw_r <= (RAM_Rd_i and ramc) or RAM_Wr_i;
+ end if;
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10100000" then
+ P2R <= Res_Bus;
+ end if;
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10000010" then
+ DPL0 <= Res_Bus;
+ end if;
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10000011" then
+ DPH0 <= Res_Bus;
+ end if;
+ if SecondDPTR/=0 then
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10000100" then
+ DPL1 <= Res_Bus;
+ end if;
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10000101" then
+ DPH1 <= Res_Bus;
+ end if;
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10000110" then
+ DPS_r <= Res_Bus(0);
+ end if;
+ end if;
+ if iReady = '1' then
+ if SecondDPTR=0 or
+ (SecondDPTR/=0 and DPS='0') then
+ -- 10010000 3 MOV DPTR,#data
+ if Inst = "10010000" and FCycle = "10" then
+ DPH0 <= Inst1;
+ end if;
+ if Inst = "10010000" and FCycle = "11" then
+ DPL0 <= Inst2;
+ end if;
+ -- 10100011 1 INC DPTR
+ if INC_DPTR = '1' then
+-- tmp := unsigned(DPH) & unsigned(DPL) + 1;
+-- DPH0 <= std_logic_vector(tmp(15 downto 8));
+-- DPL0 <= std_logic_vector(tmp(7 downto 0));
+ DPH0 <= dptr_inc(15 downto 8);
+ DPL0 <= dptr_inc(7 downto 0);
+ end if;
+ elsif SecondDPTR/=0 and DPS='1' then
+ -- 10010000 3 MOV DPTR,#data
+ if Inst = "10010000" and FCycle = "10" then
+ DPH1 <= Inst1;
+ end if;
+ if Inst = "10010000" and FCycle = "11" then
+ DPL1 <= Inst2;
+ end if;
+ -- 10100011 1 INC DPTR
+ if INC_DPTR = '1' then
+-- tmp := unsigned(DPH) & unsigned(DPL) + 1;
+-- DPH1 <= std_logic_vector(tmp(15 downto 8));
+-- DPL1 <= std_logic_vector(tmp(7 downto 0));
+ DPH1 <= dptr_inc(15 downto 8);
+ DPL1 <= dptr_inc(7 downto 0);
+ end if;
+ end if;
+ INC_DPTR <= '0';
+ if Inst = "10100011" then
+ INC_DPTR <= '1';
+ end if;
+ end if;
+ if Ready='1' or t8032/=0 then
+ RAM_Wr_i <= '0';
+ -- movx instruction
+ if t8032=0 then
+ if (Inst(7 downto 2) = "111100" and Inst(1 downto 0) /= "01") then
+ RAM_Wr_i <= '1';
+ end if;
+ elsif (Inst(7 downto 2) = "111100" and Inst(1 downto 0) /= "01" and DualBus/=0) or
+ (Inst(7 downto 2) = "111100" and Inst(1 downto 0) /= "01" and iReady = '0' and DualBus=0) then
+ RAM_Wr_i <= '1';
+ end if;
+ RAM_Rd_i <= '0';
+ -- if Inst(7 downto 2) = "111000" and Inst(1 downto 0) /= "01" and iReady = '1' then
+ if Inst(7 downto 2) = "111000" and Inst(1 downto 0) /= "01" then
+ RAM_Rd_i <= '1';
+ end if;
+ end if;
+ end if;
+ end process;
+
+ dptr_inc <= std_logic_vector(unsigned(DPH) & unsigned(DPL) + 1);
+
+ process(DPS_r)
+ begin
+ if SecondDPTR/=0 then
+ DPS <= DPS_r;
+ else
+ DPS <= '0';
+ end if;
+ end process;
+
+ -- Interrupts
+ IStart <= Last and IPending and not Inst_Skip;
+
+ process (Rst_n, Clk)
+ begin
+ if Rst_n = '0' then
+ LPInt <= '0';
+ HPInt <= '0';
+ Int_Acc <= (others => '0');
+ Int_Trig_r <= (others => '0');
+ IPending <= '0';
+ IP <= "00000000";
+ ICall <= '0';
+ elsif Clk'event and Clk = '1' then
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10111000" then
+ IP <= Res_Bus;
+ end if;
+ if iReady = '1' then
+ if (Int_Trig and IP(6 downto 0)) /= "0000000" and HPInt = '0' and IPending = '0' and ICall = '0' then
+ Int_Trig_r <= Int_Trig and IP(6 downto 0);
+ IPending <= '1';
+ HPInt <= '1';
+ elsif Int_Trig /= "0000000" and LPInt = '0' and HPInt = '0' and IPending = '0' and ICall = '0' then
+ IPending <= '1';
+ Int_Trig_r <= Int_Trig;
+ LPInt <= '1';
+ end if;
+ if ICall = '1' then
+ IPending <= '0';
+ end if;
+ if IStart = '1' and SP_Stall='0' then
+ ICall <= '1';
+ end if;
+ if ICall = '1' and Last = '1' then
+ ICall <= '0';
+ Int_Trig_r <= (others => '0');
+ end if;
+ Int_Acc <= (others => '0');
+ if IPending = '1' and ICall = '1' then
+ if Int_Trig_r(0) = '1' then Int_Acc(0) <= '1';
+ elsif Int_Trig_r(1) = '1' then Int_Acc(1) <= '1';
+ elsif Int_Trig_r(2) = '1' then Int_Acc(2) <= '1';
+ elsif Int_Trig_r(3) = '1' then Int_Acc(3) <= '1';
+ elsif Int_Trig_r(4) = '1' then Int_Acc(4) <= '1';
+ elsif Int_Trig_r(5) = '1' then Int_Acc(5) <= '1';
+ elsif Int_Trig_r(6) = '1' then Int_Acc(6) <= '1';
+ end if;
+ end if;
+ if Inst = "00110010" then -- reti
+ if HPInt = '0' then
+ LPInt <= '0';
+ else
+ HPInt <= '0';
+ end if;
+ end if;
+ end if;
+ end if;
+ end process;
+
+ -- Program counter
+ ROM_Addr <= std_logic_vector(NPC);
+ process (Rst_n, Clk)
+ begin
+ if Rst_n = '0' then
+ PC <= (others => '0');
+ OPC <= (others => '0');
+ FCycle <= "01";
+ RET_r <= '0';
+ PCPaused <= (others => '0');
+ elsif Clk'event and Clk = '1' then
+ if iReady = '1' then
+ PC <= NPC;
+ RET_r <= RET;
+
+ if PCPause = '1' then
+ PCPaused <= std_logic_vector(unsigned(PCPaused) + 1);
+ else
+ PCPaused <= (others => '0');
+ end if;
+
+ if PCPause = '0' then
+ FCycle <= std_logic_vector(unsigned(FCycle) + 1);
+ if Last = '1' then
+ FCycle <= "01";
+ end if;
+ end if;
+
+ if Inst(7 downto 5) = "100" and Inst(3 downto 0) = "0011" then -- MOVC
+ if FCycle = "01" then
+ OPC <= PC;
+ end if;
+ end if;
+ end if;
+ end if;
+ end process;
+
+-- (FCycle, Inst, Inst2, CJNE, DJNZ, PC, OPC, Inst1, ROM_Data,
+-- Next_PSW7, Next_ACC_Z, DPL, DPH, ACC, PCPaused, Op_A, Mem_A, Mem_B,
+-- Bit_Pattern, Ri_Stall, PSW_Stall, ACC_Stall, RET_r, Div_Rdy, ICall,
+-- Int_Trig_r, Ready, Rst_r_n)
+
+ process (ACC, Bit_Pattern, CJNE, DJNZ, DPH, DPL, Div_Rdy, FCycle, ICall,
+ Inst, Inst1, Inst2, Int_Trig_r, Mem_A, Mem_B, Next_ACC_Z, Next_PSW7, OPC,
+ Op_A, PC, PCPaused, RET_r, ROM_Data, iReady, Rst_r_n, Stall_pipe,RAM_Rd_i,RAM_Wr_i,ramc)
+ begin
+ NPC <= PC;
+ J_Skip <= '0';
+ RET <= '0';
+ PCPause <= '0';
+ -- push,pop
+ if (Inst(7 downto 5) = "110" and Inst(3 downto 0) = "0000" and FCycle = "01" and PCPaused(0) = '0') or -- PUSH, POP
+ (t8032=0 and Inst(7 downto 2) = "111000" and Inst(1 downto 0) /= "01" and DualBus=0 and PCPaused(0) = '0') or
+ (t8032/=0 and Inst(7 downto 5) = "111" and Inst(3 downto 2) = "00" and Inst(1 downto 0) /= "01" and DualBus=0 and PCPaused(0) = '0') or -- Single bus MOVX
+ (Inst = "10000100" and (PCPaused(3 downto 1) = "000" or Div_Rdy = '0')) then -- DIV
+ PCPause <= '1';
+ else
+-- if Ri_Stall = '0' and PSW_Stall = '0' and ACC_Stall='0' then
+ if Stall_pipe = '0' then
+ NPC <= PC + 1;
+ end if;
+ end if;
+ -- Single bus MOVX
+ if (t8032=0 and Inst(7 downto 2) = "111000" and Inst(1 downto 0) /= "01" and DualBus=0) or
+ (t8032/=0 and Inst(7 downto 5) = "111" and Inst(3 downto 2) = "00" and Inst(1 downto 0) /= "01" and DualBus=0) then
+ J_Skip <= '1';
+ end if;
+ -- Return
+ if Inst(7 downto 5) = "001" and Inst(3 downto 0) = "0010" then -- RET, RETI
+ RET <= '1';
+ J_Skip <= '1';
+ end if;
+ -- MOVC
+ if Inst(7 downto 5) = "100" and Inst(3 downto 0) = "0011" and FCycle = "11" then
+ NPC <= OPC;
+ J_Skip <= '1';
+ end if;
+ -- 2 byte 8 bit relative jump
+ if FCycle = "10" then
+ if (Inst = "01000000" and Next_PSW7 = '1') or -- JC
+ (Inst = "01010000" and Next_PSW7 = '0') or -- JNC
+ (Inst = "01100000" and Next_ACC_Z = '1') or -- JZ
+ (Inst = "01110000" and Next_ACC_Z = '0') or -- JNZ
+ (Inst(7 downto 3) = "11011" and DJNZ = '1') or -- DJNZ
+ Inst = "10000000" then -- SJMP
+ NPC <= PC + unsigned(resize(signed(Inst1),16));
+ J_Skip <= '1';
+ end if;
+ end if;
+
+ -- 3 byte 8 bit relative jump
+ if FCycle = "11" then
+ if (Inst = "00100000" or Inst = "00010000") and (Bit_Pattern and Op_A) /= "00000000" then -- JB, JBC
+ NPC <= PC + unsigned(resize(signed(Inst2),16));
+ J_Skip <= '1';
+ end if;
+ if Inst = "00110000" and (Bit_Pattern and Op_A) = "00000000" then -- JNB
+ NPC <= PC + unsigned(resize(signed(Inst2),16));
+ J_Skip <= '1';
+ end if;
+ if Inst(7 downto 4) = "1011" and Inst(3 downto 2) /= "00" and CJNE = '1' then -- CJNE
+ NPC <= PC + unsigned(resize(signed(Inst2),16));
+ J_Skip <= '1';
+ end if;
+ if Inst = "11010101" and DJNZ = '1' then -- DJNZ
+ NPC <= PC + unsigned(resize(signed(Inst2),16));
+ J_Skip <= '1';
+ end if;
+ end if;
+ -- 11 bit absolute
+ if FCycle = "10" then
+ if Inst(4 downto 0) = "00001" or Inst(4 downto 0) = "10001" then
+ -- AJMP, ACALL
+ NPC(15 downto 11) <= PC(15 downto 11);
+ NPC(10 downto 8) <= unsigned(Inst(7 downto 5));
+ NPC(7 downto 0) <= unsigned(Inst1);
+ J_Skip <= '1';
+ end if;
+ end if;
+ -- 16 bit absolute
+ if FCycle = "10" then
+ if Inst = "00000010" or Inst = "00010010" then
+ -- LJMP, LCALL
+ NPC(15 downto 8) <= unsigned(Inst1);
+ NPC(7 downto 0) <= unsigned(ROM_Data);
+ end if;
+ if ICall = '1' then
+ NPC <= (1 => '1', 0 => '1', others => '0');
+ if Int_Trig_r(1) = '1' then NPC(5 downto 3) <= "001";
+ elsif Int_Trig_r(2) = '1' then NPC(5 downto 3) <= "010";
+ elsif Int_Trig_r(3) = '1' then NPC(5 downto 3) <= "011";
+ elsif Int_Trig_r(4) = '1' then NPC(5 downto 3) <= "100";
+ elsif Int_Trig_r(5) = '1' then NPC(5 downto 3) <= "101";
+ elsif Int_Trig_r(6) = '1' then NPC(5 downto 3) <= "110";
+ end if;
+ end if;
+ end if;
+ -- A+DPTR Absolute
+ if Inst = "01110011" then
+ -- JMP @A+DPTR
+ NPC <= (unsigned(DPH) & unsigned(DPL)) + unsigned(resize(signed(ACC),16));
+ J_Skip <= '1';
+ end if;
+
+ if Inst(7 downto 5) = "100" and Inst(3 downto 0) = "0011" then -- MOVC
+ if FCycle = "10" then
+ if Inst(4) = '0' then
+ NPC <= unsigned(ACC) + OPC;
+ else
+ NPC <= unsigned(ACC) + (unsigned(DPH) & unsigned(DPL));
+ end if;
+ end if;
+ end if;
+
+ if RET_r = '1' then -- and unsigned(Mem_A) /= PC(15 downto 8) then ???????????????????????????
+ NPC <= unsigned(Mem_A) & unsigned(Mem_B);
+ end if;
+
+ if iReady = '0' then
+ NPC <= PC;
+ end if;
+ if Rst_r_n = '0' then
+ NPC <= (others => '0');
+ end if;
+ end process;
+
+ -- ALU
+ alu : T51_ALU
+ generic map(
+ tristate => tristate
+ )
+ port map(
+ Clk => Clk,
+ Last => Last,
+ OpCode => Inst,
+ ACC => ACC,
+ B => B,
+ IA => Op_A,
+ IB => Op_B,
+ Bit_Pattern => Bit_Pattern,
+ CY_In => PSW(7),
+ AC_In => PSW(6),
+ ACC_Q => ACC_Q,
+ B_Q => B_Q,
+ IDCPBL_Q => Res_Bus,
+ Div_Rdy => Div_Rdy,
+ CJNE => CJNE,
+ DJNZ => DJNZ,
+ CY_Out => Status_D(7),
+ AC_Out => Status_D(6),
+ OV_Out => Status_D(5),
+ CY_Wr => Status_Wr(7),
+ AC_Wr => Status_Wr(6),
+ OV_Wr => Status_Wr(5));
+
+ process (Clk)
+ begin
+ if Clk'event and Clk = '1' then
+ Old_Mem_B <= Mem_B;
+ if FCycle = "01" then
+ if Inst(1) = '1' then
+ PCC <= std_logic_vector(PC + 2);
+ else
+ PCC <= std_logic_vector(PC + 1);
+ end if;
+ if ICall = '1' then
+ PCC <= std_logic_vector(PC - 1);
+ end if;
+ end if;
+ SFR_RData_r <= SFR_RData;
+ end if;
+ end process;
+
+ Generic_MODEL: if not Altera_IRAM_c generate
+ ram : T51_RAM
+ generic map(
+ RAMAddressWidth => RAMAddressWidth)
+ port map(
+ Clk => Clk,
+ Rst_n => Rst_n,
+ ARE => Ready,
+ Wr => Mem_Wr,
+ DIn => Mem_Din,
+ Int_AddrA => Int_AddrA,
+ Int_AddrA_r => Int_AddrA_r,
+ Int_AddrB => Int_AddrB,
+ Mem_A => Mem_A,
+ Mem_B => Mem_B);
+ end generate;
+ Altera_MODEL: if Altera_IRAM_c generate
+ ram : T51_RAM_Altera
+ generic map(
+ RAMAddressWidth => RAMAddressWidth)
+ port map(
+ Clk => Clk,
+ Rst_n => Rst_n,
+ ARE => Ready,
+ Wr => Mem_Wr,
+ DIn => Mem_Din,
+ Int_AddrA => Int_AddrA,
+ Int_AddrA_r => Int_AddrA_r,
+ Int_AddrB => Int_AddrB,
+ Mem_A => Mem_A,
+ Mem_B => Mem_B);
+ end generate;
+
+ IRAM_Wr <= Mem_Wr;
+ IRAM_Addr <= Int_AddrA_r;
+ IRAM_WData <= Mem_Din;
+
+ process (Inst)
+ begin
+ case Inst is
+ -- 1 downto 0 instruction length
+ -- 2 write ACC
+ -- 3 write register file
+ when "00000000" => MCode <= "0001"; -- 00000000 1 NOP
+ when "00000001" => MCode <= "0010"; -- aaa00001 2 AJMP code addr
+ when "00000010" => MCode <= "0011"; -- 00000010 3 LJMP code addr
+ when "00000011" => MCode <= "0101"; -- 00000011 1 RR A
+ when "00000100" => MCode <= "0101"; -- 00000100 1 INC A
+ when "00000101" => MCode <= "1010"; -- 00000101 2 INC data addr
+ when "00000110" => MCode <= "1001"; -- 0000011i 1 INC @Ri
+ when "00000111" => MCode <= "1001"; -- 0000011i 1 INC @Ri
+ when "00001000" => MCode <= "1001"; -- 00001rrr 1 INC Rn
+ when "00001001" => MCode <= "1001"; -- 00001rrr 1 INC Rn
+ when "00001010" => MCode <= "1001"; -- 00001rrr 1 INC Rn
+ when "00001011" => MCode <= "1001"; -- 00001rrr 1 INC Rn
+ when "00001100" => MCode <= "1001"; -- 00001rrr 1 INC Rn
+ when "00001101" => MCode <= "1001"; -- 00001rrr 1 INC Rn
+ when "00001110" => MCode <= "1001"; -- 00001rrr 1 INC Rn
+ when "00001111" => MCode <= "1001"; -- 00001rrr 1 INC Rn
+ when "00010000" => MCode <= "1011"; -- 00010000 3 JBC bit addr, code addr
+ when "00010001" => MCode <= "0010"; -- aaa10001 2 ACALL code addr
+ when "00010010" => MCode <= "0011"; -- 00010010 3 LCALL code addr
+ when "00010011" => MCode <= "0101"; -- 00010011 1 RRC A
+ when "00010100" => MCode <= "0101"; -- 00010100 1 DEC A
+ when "00010101" => MCode <= "1010"; -- 00010101 2 DEC data addr
+ when "00010110" => MCode <= "1001"; -- 0001011i 1 DEC @Ri
+ when "00010111" => MCode <= "1001"; -- 0001011i 1 DEC @Ri
+ when "00011000" => MCode <= "1001"; -- 00011rrr 1 DEC Rn
+ when "00011001" => MCode <= "1001"; -- 00011rrr 1 DEC Rn
+ when "00011010" => MCode <= "1001"; -- 00011rrr 1 DEC Rn
+ when "00011011" => MCode <= "1001"; -- 00011rrr 1 DEC Rn
+ when "00011100" => MCode <= "1001"; -- 00011rrr 1 DEC Rn
+ when "00011101" => MCode <= "1001"; -- 00011rrr 1 DEC Rn
+ when "00011110" => MCode <= "1001"; -- 00011rrr 1 DEC Rn
+ when "00011111" => MCode <= "1001"; -- 00011rrr 1 DEC Rn
+ when "00100000" => MCode <= "0011"; -- 00100000 3 JB bit addr, code addr
+ when "00100001" => MCode <= "0010"; -- aaa00001 2 AJMP code addr
+ when "00100010" => MCode <= "0001"; -- 00100010 1 RET
+ when "00100011" => MCode <= "0101"; -- 00100011 1 RL A
+ when "00100100" => MCode <= "0110"; -- 00100100 2 ADD A,#data
+ when "00100101" => MCode <= "0110"; -- 00100101 2 ADD A,data addr
+ when "00100110" => MCode <= "0101"; -- 0010011i 1 ADD A,@Ri
+ when "00100111" => MCode <= "0101"; -- 0010011i 1 ADD A,@Ri
+ when "00101000" => MCode <= "0101"; -- 00101rrr 1 ADD A,Rn
+ when "00101001" => MCode <= "0101"; -- 00101rrr 1 ADD A,Rn
+ when "00101010" => MCode <= "0101"; -- 00101rrr 1 ADD A,Rn
+ when "00101011" => MCode <= "0101"; -- 00101rrr 1 ADD A,Rn
+ when "00101100" => MCode <= "0101"; -- 00101rrr 1 ADD A,Rn
+ when "00101101" => MCode <= "0101"; -- 00101rrr 1 ADD A,Rn
+ when "00101110" => MCode <= "0101"; -- 00101rrr 1 ADD A,Rn
+ when "00101111" => MCode <= "0101"; -- 00101rrr 1 ADD A,Rn
+ when "00110000" => MCode <= "0011"; -- 00110000 3 JNB bit addr, code addr
+ when "00110001" => MCode <= "0010"; -- aaa10001 2 ACALL code addr
+ when "00110010" => MCode <= "0001"; -- 00110010 1 RETI
+ when "00110011" => MCode <= "0101"; -- 00110011 1 RLC A
+ when "00110100" => MCode <= "0110"; -- 00110100 2 ADDC A,#data
+ when "00110101" => MCode <= "0110"; -- 00110101 2 ADDC A,data addr
+ when "00110110" => MCode <= "0101"; -- 0011011i 1 ADDC A,@Ri
+ when "00110111" => MCode <= "0101"; -- 0011011i 1 ADDC A,@Ri
+ when "00111000" => MCode <= "0101"; -- 00111rrr 1 ADDC A,Rn
+ when "00111001" => MCode <= "0101"; -- 00111rrr 1 ADDC A,Rn
+ when "00111010" => MCode <= "0101"; -- 00111rrr 1 ADDC A,Rn
+ when "00111011" => MCode <= "0101"; -- 00111rrr 1 ADDC A,Rn
+ when "00111100" => MCode <= "0101"; -- 00111rrr 1 ADDC A,Rn
+ when "00111101" => MCode <= "0101"; -- 00111rrr 1 ADDC A,Rn
+ when "00111110" => MCode <= "0101"; -- 00111rrr 1 ADDC A,Rn
+ when "00111111" => MCode <= "0101"; -- 00111rrr 1 ADDC A,Rn
+ when "01000000" => MCode <= "0010"; -- 01000000 2 JC code addr
+ when "01000001" => MCode <= "0010"; -- aaa00001 2 AJMP code addr
+ when "01000010" => MCode <= "1010"; -- 01000010 2 ORL data addr,A
+ when "01000011" => MCode <= "1011"; -- 01000011 3 ORL data addr,#data
+ when "01000100" => MCode <= "0110"; -- 01000100 2 ORL A,#data
+ when "01000101" => MCode <= "0110"; -- 01000101 2 ORL A,data addr
+ when "01000110" => MCode <= "0101"; -- 0100011i 1 ORL A,@Ri
+ when "01000111" => MCode <= "0101"; -- 0100011i 1 ORL A,@Ri
+ when "01001000" => MCode <= "0101"; -- 01001rrr 1 ORL A,Rn
+ when "01001001" => MCode <= "0101"; -- 01001rrr 1 ORL A,Rn
+ when "01001010" => MCode <= "0101"; -- 01001rrr 1 ORL A,Rn
+ when "01001011" => MCode <= "0101"; -- 01001rrr 1 ORL A,Rn
+ when "01001100" => MCode <= "0101"; -- 01001rrr 1 ORL A,Rn
+ when "01001101" => MCode <= "0101"; -- 01001rrr 1 ORL A,Rn
+ when "01001110" => MCode <= "0101"; -- 01001rrr 1 ORL A,Rn
+ when "01001111" => MCode <= "0101"; -- 01001rrr 1 ORL A,Rn
+ when "01010000" => MCode <= "0010"; -- 01010000 2 JNC code addr
+ when "01010001" => MCode <= "0010"; -- aaa10001 2 ACALL code addr
+ when "01010010" => MCode <= "1010"; -- 01010010 2 ANL data addr,A
+ when "01010011" => MCode <= "1011"; -- 01010011 3 ANL data addr,#data
+ when "01010100" => MCode <= "0110"; -- 01010100 2 ANL A,#data
+ when "01010101" => MCode <= "0110"; -- 01010101 2 ANL A,data addr
+ when "01010110" => MCode <= "0101"; -- 0101011i 1 ANL A,@Ri
+ when "01010111" => MCode <= "0101"; -- 0101011i 1 ANL A,@Ri
+ when "01011000" => MCode <= "0101"; -- 01011rrr 1 ANL A,Rn
+ when "01011001" => MCode <= "0101"; -- 01011rrr 1 ANL A,Rn
+ when "01011010" => MCode <= "0101"; -- 01011rrr 1 ANL A,Rn
+ when "01011011" => MCode <= "0101"; -- 01011rrr 1 ANL A,Rn
+ when "01011100" => MCode <= "0101"; -- 01011rrr 1 ANL A,Rn
+ when "01011101" => MCode <= "0101"; -- 01011rrr 1 ANL A,Rn
+ when "01011110" => MCode <= "0101"; -- 01011rrr 1 ANL A,Rn
+ when "01011111" => MCode <= "0101"; -- 01011rrr 1 ANL A,Rn
+ when "01100000" => MCode <= "0010"; -- 01100000 2 JZ code addr
+ when "01100001" => MCode <= "0010"; -- aaa00001 2 AJMP code addr
+ when "01100010" => MCode <= "1010"; -- 01100010 2 XRL data addr,A
+ when "01100011" => MCode <= "1011"; -- 01100011 3 XRL data addr,#data
+ when "01100100" => MCode <= "0110"; -- 01100100 2 XRL A,#data
+ when "01100101" => MCode <= "0110"; -- 01100101 2 XRL A,data addr
+ when "01100110" => MCode <= "0101"; -- 0110011i 1 XRL A,@Ri
+ when "01100111" => MCode <= "0101"; -- 0110011i 1 XRL A,@Ri
+ when "01101000" => MCode <= "0101"; -- 01101rrr 1 XRL A,Rn
+ when "01101001" => MCode <= "0101"; -- 01101rrr 1 XRL A,Rn
+ when "01101010" => MCode <= "0101"; -- 01101rrr 1 XRL A,Rn
+ when "01101011" => MCode <= "0101"; -- 01101rrr 1 XRL A,Rn
+ when "01101100" => MCode <= "0101"; -- 01101rrr 1 XRL A,Rn
+ when "01101101" => MCode <= "0101"; -- 01101rrr 1 XRL A,Rn
+ when "01101110" => MCode <= "0101"; -- 01101rrr 1 XRL A,Rn
+ when "01101111" => MCode <= "0101"; -- 01101rrr 1 XRL A,Rn
+ when "01110000" => MCode <= "0010"; -- 01110000 2 JNZ code addr
+ when "01110001" => MCode <= "0010"; -- aaa10001 2 ACALL code addr
+ when "01110010" => MCode <= "0010"; -- 01110010 2 ORL C, bit addr
+ when "01110011" => MCode <= "0001"; -- 01110011 1 JMP @A+DPTR
+ when "01110100" => MCode <= "0110"; -- 01110100 2 MOV A,#data
+ when "01110101" => MCode <= "1011"; -- 01110101 3 MOV data addr,#data
+ when "01110110" => MCode <= "1010"; -- 0111011i 2 MOV @Ri,#data
+ when "01110111" => MCode <= "1010"; -- 0111011i 2 MOV @Ri,#data
+ when "01111000" => MCode <= "1010"; -- 01111rrr 2 MOV Rn,#data
+ when "01111001" => MCode <= "1010"; -- 01111rrr 2 MOV Rn,#data
+ when "01111010" => MCode <= "1010"; -- 01111rrr 2 MOV Rn,#data
+ when "01111011" => MCode <= "1010"; -- 01111rrr 2 MOV Rn,#data
+ when "01111100" => MCode <= "1010"; -- 01111rrr 2 MOV Rn,#data
+ when "01111101" => MCode <= "1010"; -- 01111rrr 2 MOV Rn,#data
+ when "01111110" => MCode <= "1010"; -- 01111rrr 2 MOV Rn,#data
+ when "01111111" => MCode <= "1010"; -- 01111rrr 2 MOV Rn,#data
+ when "10000000" => MCode <= "0010"; -- 10000000 2 SJMP code addr
+ when "10000001" => MCode <= "0010"; -- aaa00001 2 AJMP code addr
+ when "10000010" => MCode <= "0010"; -- 10000010 2 ANL C,bit addr
+ when "10000011" => MCode <= "0011"; -- 10000011 1 MOVC A,@A+PC
+ when "10000100" => MCode <= "0001"; -- 10000100 1 DIV AB
+ when "10000101" => MCode <= "1011"; -- 10000101 3 MOV data addr,data addr
+ when "10000110" => MCode <= "1010"; -- 1000011i 2 MOV data addr,@Ri
+ when "10000111" => MCode <= "1010"; -- 1000011i 2 MOV data addr,@Ri
+ when "10001000" => MCode <= "1010"; -- 10001rrr 2 MOV data addr,Rn
+ when "10001001" => MCode <= "1010"; -- 10001rrr 2 MOV data addr,Rn
+ when "10001010" => MCode <= "1010"; -- 10001rrr 2 MOV data addr,Rn
+ when "10001011" => MCode <= "1010"; -- 10001rrr 2 MOV data addr,Rn
+ when "10001100" => MCode <= "1010"; -- 10001rrr 2 MOV data addr,Rn
+ when "10001101" => MCode <= "1010"; -- 10001rrr 2 MOV data addr,Rn
+ when "10001110" => MCode <= "1010"; -- 10001rrr 2 MOV data addr,Rn
+ when "10001111" => MCode <= "1010"; -- 10001rrr 2 MOV data addr,Rn
+ when "10010000" => MCode <= "0011"; -- 10010000 3 MOV DPTR,#data
+ when "10010001" => MCode <= "0010"; -- aaa10001 2 ACALL code addr
+ when "10010010" => MCode <= "1010"; -- 10010010 2 MOV bit addr,C
+ when "10010011" => MCode <= "0011"; -- 10010011 1 MOVC A,@A+DPTR
+ when "10010100" => MCode <= "0110"; -- 10010100 2 SUBB A,#data
+ when "10010101" => MCode <= "0110"; -- 10010101 2 SUBB A,data addr
+ when "10010110" => MCode <= "0101"; -- 1001011i 1 SUBB A,@Ri
+ when "10010111" => MCode <= "0101"; -- 1001011i 1 SUBB A,@Ri
+ when "10011000" => MCode <= "0101"; -- 10011rrr 1 SUBB A,Rn
+ when "10011001" => MCode <= "0101"; -- 10011rrr 1 SUBB A,Rn
+ when "10011010" => MCode <= "0101"; -- 10011rrr 1 SUBB A,Rn
+ when "10011011" => MCode <= "0101"; -- 10011rrr 1 SUBB A,Rn
+ when "10011100" => MCode <= "0101"; -- 10011rrr 1 SUBB A,Rn
+ when "10011101" => MCode <= "0101"; -- 10011rrr 1 SUBB A,Rn
+ when "10011110" => MCode <= "0101"; -- 10011rrr 1 SUBB A,Rn
+ when "10011111" => MCode <= "0101"; -- 10011rrr 1 SUBB A,Rn
+ when "10100000" => MCode <= "0010"; -- 10100000 2 ORL C,/bit addr
+ when "10100001" => MCode <= "0010"; -- aaa00001 2 AJMP code addr
+ when "10100010" => MCode <= "0010"; -- 10100010 2 MOV C,bit addr
+ when "10100011" => MCode <= "0001"; -- 10100011 1 INC DPTR
+ when "10100100" => MCode <= "0101"; -- 10100100 1 MUL AB
+ when "10100101" => MCode <= "0001"; -- 10100101 reserved
+ when "10100110" => MCode <= "1010"; -- 1010011i 2 MOV @Ri,data addr
+ when "10100111" => MCode <= "1010"; -- 1010011i 2 MOV @Ri,data addr
+ when "10101000" => MCode <= "1010"; -- 10101rrr 2 MOV Rn,data addr
+ when "10101001" => MCode <= "1010"; -- 10101rrr 2 MOV Rn,data addr
+ when "10101010" => MCode <= "1010"; -- 10101rrr 2 MOV Rn,data addr
+ when "10101011" => MCode <= "1010"; -- 10101rrr 2 MOV Rn,data addr
+ when "10101100" => MCode <= "1010"; -- 10101rrr 2 MOV Rn,data addr
+ when "10101101" => MCode <= "1010"; -- 10101rrr 2 MOV Rn,data addr
+ when "10101110" => MCode <= "1010"; -- 10101rrr 2 MOV Rn,data addr
+ when "10101111" => MCode <= "1010"; -- 10101rrr 2 MOV Rn,data addr
+ when "10110000" => MCode <= "0010"; -- 10110000 2 ANL C,/bit addr
+ when "10110001" => MCode <= "0010"; -- aaa10001 2 ACALL code addr
+ when "10110010" => MCode <= "1010"; -- 10110010 2 CPL bit addr
+ when "10110011" => MCode <= "0001"; -- 10110011 1 CPL C
+ when "10110100" => MCode <= "0011"; -- 10110100 3 CJNE A,#data,code addr
+ when "10110101" => MCode <= "0011"; -- 10110101 3 CJNE A,data addr,code addr
+ when "10110110" => MCode <= "0011"; -- 1011011i 3 CJNE @Ri,#data,code addr
+ when "10110111" => MCode <= "0011"; -- 1011011i 3 CJNE @Ri,#data,code addr
+ when "10111000" => MCode <= "0011"; -- 10111rrr 3 CJNE Rn,#data,code addr
+ when "10111001" => MCode <= "0011"; -- 10111rrr 3 CJNE Rn,#data,code addr
+ when "10111010" => MCode <= "0011"; -- 10111rrr 3 CJNE Rn,#data,code addr
+ when "10111011" => MCode <= "0011"; -- 10111rrr 3 CJNE Rn,#data,code addr
+ when "10111100" => MCode <= "0011"; -- 10111rrr 3 CJNE Rn,#data,code addr
+ when "10111101" => MCode <= "0011"; -- 10111rrr 3 CJNE Rn,#data,code addr
+ when "10111110" => MCode <= "0011"; -- 10111rrr 3 CJNE Rn,#data,code addr
+ when "10111111" => MCode <= "0011"; -- 10111rrr 3 CJNE Rn,#data,code addr
+ when "11000000" => MCode <= "1010"; -- 11000000 2 PUSH data addr
+ when "11000001" => MCode <= "0010"; -- aaa00001 2 AJMP code addr
+ when "11000010" => MCode <= "1010"; -- 11000010 2 CLR bit addr
+ when "11000011" => MCode <= "0001"; -- 11000011 1 CLR C
+ when "11000100" => MCode <= "0101"; -- 11000100 1 SWAP A
+ when "11000101" => MCode <= "1110"; -- 11000101 2 XCH A,data addr
+ when "11000110" => MCode <= "1101"; -- 1100011i 1 XCH A,@Ri
+ when "11000111" => MCode <= "1101"; -- 1100011i 1 XCH A,@Ri
+ when "11001000" => MCode <= "1101"; -- 11001rrr 1 XCH A,Rn
+ when "11001001" => MCode <= "1101"; -- 11001rrr 1 XCH A,Rn
+ when "11001010" => MCode <= "1101"; -- 11001rrr 1 XCH A,Rn
+ when "11001011" => MCode <= "1101"; -- 11001rrr 1 XCH A,Rn
+ when "11001100" => MCode <= "1101"; -- 11001rrr 1 XCH A,Rn
+ when "11001101" => MCode <= "1101"; -- 11001rrr 1 XCH A,Rn
+ when "11001110" => MCode <= "1101"; -- 11001rrr 1 XCH A,Rn
+ when "11001111" => MCode <= "1101"; -- 11001rrr 1 XCH A,Rn
+ when "11010000" => MCode <= "1010"; -- 11010000 2 POP data addr
+ when "11010001" => MCode <= "0010"; -- aaa10001 2 ACALL code addr
+ when "11010010" => MCode <= "1010"; -- 11010010 2 SETB bit addr
+ when "11010011" => MCode <= "0001"; -- 11010011 1 SETB C
+ when "11010100" => MCode <= "0101"; -- 11010100 1 DA A
+ when "11010101" => MCode <= "1011"; -- 11010101 3 DJNZ data addr, code addr
+ when "11010110" => MCode <= "1101"; -- 1101011i 1 XCHD A,@Ri
+ when "11010111" => MCode <= "1101"; -- 1101011i 1 XCHD A,@Ri
+ when "11011000" => MCode <= "1010"; -- 11011rrr 2 DJNZ Rn,code addr
+ when "11011001" => MCode <= "1010"; -- 11011rrr 2 DJNZ Rn,code addr
+ when "11011010" => MCode <= "1010"; -- 11011rrr 2 DJNZ Rn,code addr
+ when "11011011" => MCode <= "1010"; -- 11011rrr 2 DJNZ Rn,code addr
+ when "11011100" => MCode <= "1010"; -- 11011rrr 2 DJNZ Rn,code addr
+ when "11011101" => MCode <= "1010"; -- 11011rrr 2 DJNZ Rn,code addr
+ when "11011110" => MCode <= "1010"; -- 11011rrr 2 DJNZ Rn,code addr
+ when "11011111" => MCode <= "1010"; -- 11011rrr 2 DJNZ Rn,code addr
+ when "11100000" => MCode <= "0101"; -- 11100000 1 MOVX A,@DPTR
+ when "11100001" => MCode <= "0010"; -- aaa00001 2 AJMP code addr
+ when "11100010" => MCode <= "0101"; -- 1110001i 1 MOVX A,@Ri
+ when "11100011" => MCode <= "0101"; -- 1110001i 1 MOVX A,@Ri
+ when "11100100" => MCode <= "0101"; -- 11100100 1 CLR A
+ when "11100101" => MCode <= "0110"; -- 11100101 2 MOV A,data addr
+ when "11100110" => MCode <= "0101"; -- 1110011i 1 MOV A,@Ri
+ when "11100111" => MCode <= "0101"; -- 1110011i 1 MOV A,@Ri
+ when "11101000" => MCode <= "0101"; -- 11101rrr 1 MOV A,Rn
+ when "11101001" => MCode <= "0101"; -- 11101rrr 1 MOV A,Rn
+ when "11101010" => MCode <= "0101"; -- 11101rrr 1 MOV A,Rn
+ when "11101011" => MCode <= "0101"; -- 11101rrr 1 MOV A,Rn
+ when "11101100" => MCode <= "0101"; -- 11101rrr 1 MOV A,Rn
+ when "11101101" => MCode <= "0101"; -- 11101rrr 1 MOV A,Rn
+ when "11101110" => MCode <= "0101"; -- 11101rrr 1 MOV A,Rn
+ when "11101111" => MCode <= "0101"; -- 11101rrr 1 MOV A,Rn
+ when "11110000" => MCode <= "0001"; -- 11110000 1 MOVX @DPTR,A
+ when "11110001" => MCode <= "0010"; -- aaa10001 2 ACALL code addr
+ when "11110010" => MCode <= "0001"; -- 1111001i 1 MOVX @Ri,A
+ when "11110011" => MCode <= "0001"; -- 1111001i 1 MOVX @Ri,A
+ when "11110100" => MCode <= "0101"; -- 11110100 1 CPL A
+ when "11110101" => MCode <= "1010"; -- 11110101 2 MOV data addr,A
+ when "11110110" => MCode <= "1001"; -- 1111011i 1 MOV @Ri,A
+ when "11110111" => MCode <= "1001"; -- 1111011i 1 MOV @Ri,A
+ when "11111000" => MCode <= "1001"; -- 11111rrr 1 MOV Rn,A
+ when "11111001" => MCode <= "1001"; -- 11111rrr 1 MOV Rn,A
+ when "11111010" => MCode <= "1001"; -- 11111rrr 1 MOV Rn,A
+ when "11111011" => MCode <= "1001"; -- 11111rrr 1 MOV Rn,A
+ when "11111100" => MCode <= "1001"; -- 11111rrr 1 MOV Rn,A
+ when "11111101" => MCode <= "1001"; -- 11111rrr 1 MOV Rn,A
+ when "11111110" => MCode <= "1001"; -- 11111rrr 1 MOV Rn,A
+ when "11111111" => MCode <= "1001"; -- 11111rrr 1 MOV Rn,A
+ when others => MCode <= "----";
+ end case;
+ end process;
+
+end;
diff --git a/rtl/vhdl/T51_ALU.vhd b/rtl/vhdl/T51_ALU.vhd
new file mode 100644
index 0000000..715ee53
--- /dev/null
+++ b/rtl/vhdl/T51_ALU.vhd
@@ -0,0 +1,744 @@
+--
+-- 8051 compatible microcontroller core
+--
+-- Version : 0300
+--
+-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
+-- (c) 2004-2005 Andreas Voggeneder (andreas.voggeneder@fh-hagenberg.at)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+use WORK.T51_Pack.all;
+
+entity T51_ALU is
+ generic(
+ tristate : integer := 0
+ );
+ port(
+ Clk : in std_logic;
+ Last : in std_logic;
+ OpCode : in std_logic_vector(7 downto 0);
+ ACC : in std_logic_vector(7 downto 0);
+ B : in std_logic_vector(7 downto 0);
+ IA : in std_logic_vector(7 downto 0);
+ IB : in std_logic_vector(7 downto 0);
+ Bit_Pattern : in std_logic_vector(7 downto 0);
+ CY_In : in std_logic;
+ AC_In : in std_logic;
+ ACC_Q : out std_logic_vector(7 downto 0);
+ B_Q : out std_logic_vector(7 downto 0);
+ IDCPBL_Q : out std_logic_vector(7 downto 0);
+ Div_Rdy : out std_logic;
+ CJNE : out std_logic;
+ DJNZ : out std_logic;
+ CY_Out : out std_logic;
+ AC_Out : out std_logic;
+ OV_Out : out std_logic;
+ CY_Wr : out std_logic;
+ AC_Wr : out std_logic;
+ OV_Wr : out std_logic
+ );
+end T51_ALU;
+
+architecture rtl of T51_ALU is
+
+ signal Do_A_Imm : std_logic;
+ signal Do_A_Carry : std_logic;
+ signal Do_A_RR : std_logic;
+ signal Do_A_INC : std_logic;
+ signal Do_A_RRC : std_logic;
+ signal Do_A_DEC : std_logic;
+ signal Do_A_RL : std_logic;
+ signal Do_A_ADD : std_logic;
+ signal Do_A_RLC : std_logic;
+ signal Do_A_ORL : std_logic;
+ signal Do_A_ANL : std_logic;
+ signal Do_A_XRL : std_logic;
+ signal Do_A_MOV : std_logic;
+ signal Do_A_DIV : std_logic;
+ signal Do_A_SUBB : std_logic;
+ signal Do_A_MUL : std_logic;
+ signal Do_A_CJNE : std_logic;
+ signal Do_A_SWAP : std_logic;
+ signal Do_A_XCH : std_logic;
+ signal Do_A_DA : std_logic;
+ signal Do_A_XCHD : std_logic;
+ signal Do_A_CLR : std_logic;
+ signal Do_A_CPL : std_logic;
+
+ -- Accumulator ALU input mux
+ signal AOP2 : std_logic_vector(7 downto 0);
+
+ -- AD intermediate signal
+ signal ADA : std_logic_vector(8 downto 0);
+
+ -- AddSub intermediate signals
+ signal AS_Carry7 : std_logic;
+ signal AS_AC : std_logic;
+ signal AS_CY : std_logic;
+ signal AS_Q : std_logic_vector(7 downto 0);
+
+ signal Do_I_Imm : std_logic;
+ signal Do_I_INC : std_logic;
+ signal Do_I_DEC : std_logic;
+ signal Do_I_ORL : std_logic;
+ signal Do_I_ANL : std_logic;
+ signal Do_I_XRL : std_logic;
+ signal Do_I_MOV : std_logic;
+ signal Do_I_MOVD : std_logic;
+ signal Do_I_CJNE : std_logic;
+
+ -- Auxiliary ALU input mux
+ signal IOP : std_logic_vector(7 downto 0);
+
+ -- Auxiliary ALU delayed input
+ signal IA_d : std_logic_vector(7 downto 0);
+
+ -- AddSub intermediate signals
+ signal CJNE_CY_n : std_logic;
+ signal CJNE_Q : std_logic_vector(7 downto 0);
+ signal CJNE_Q_ZERO : std_logic;
+ signal CJNE_CY : std_logic;
+
+ -- MOV intermediate signals
+ signal MOV_Op : std_logic_vector(3 downto 0);
+ signal MOV_Q : std_logic_vector(7 downto 0);
+
+ signal Do_B_Inv : std_logic;
+ signal Do_B_C_BA : std_logic;
+ signal Do_B_C_Dir : std_logic;
+ signal Do_B_BA_Dir : std_logic;
+ signal Do_B_MOV : std_logic;
+ signal Do_B_JBC : std_logic;
+ signal Do_B_Op : std_logic_vector(1 downto 0);
+
+ -- Bit intermediate signals
+ signal Bit_Op1 : std_logic_vector(7 downto 0);
+ signal Bit_Op2 : std_logic_vector(7 downto 0);
+ signal Bit_IsOne : std_logic;
+ signal Bit_Result : std_logic_vector(7 downto 0);
+
+ signal Last_r : std_logic;
+
+ -- MulDiv intermediate signals
+ signal Mul_Q : std_logic_vector(15 downto 0);
+ signal Mul_OV : std_logic;
+ signal Div_Q : std_logic_vector(15 downto 0);
+ signal Div_OV : std_logic;
+
+begin
+
+ -- Simplify some of the conditions, not all must be exclusive !!!!
+
+ process (Clk)
+ begin
+ if Clk'event and Clk = '1' then
+
+ -- ACC Operations
+
+ Do_A_Imm <= '0';
+ Do_A_Carry <= '0';
+ Do_A_RR <= '0';
+ Do_A_INC <= '0';
+ Do_A_RRC <= '0';
+ Do_A_DEC <= '0';
+ Do_A_RL <= '0';
+ Do_A_ADD <= '0';
+ Do_A_RLC <= '0';
+ Do_A_ORL <= '0';
+ Do_A_ANL <= '0';
+ Do_A_XRL <= '0';
+ Do_A_MOV <= '0';
+ Do_A_DIV <= '0';
+ Do_A_SUBB <= '0';
+ Do_A_MUL <= '0';
+ Do_A_CJNE <= '0';
+ Do_A_SWAP <= '0';
+ Do_A_XCH <= '0';
+ Do_A_DA <= '0';
+ Do_A_XCHD <= '0';
+ Do_A_CLR <= '0';
+ Do_A_CPL <= '0';
+ Do_A_Imm <= '0';
+ if OpCode(3 downto 0) = "0100" then
+ Do_A_Imm <= '1';
+ end if;
+ if OpCode = "00000011" then
+ -- 00000011 1 RR A
+ Do_A_RR <= '1';
+ end if;
+ if OpCode = "00000100" then
+ -- 00000100 1 INC A
+ Do_A_INC <= '1';
+ end if;
+ if OpCode = "00010011" then
+ -- 00010011 1 RRC A
+ Do_A_RRC <= '1';
+ end if;
+ if OpCode = "00010100" then
+ -- 00010100 1 DEC A
+ Do_A_DEC <= '1';
+ end if;
+ if OpCode = "00100011" then
+ -- 00100011 1 RL A
+ Do_A_RL <= '1';
+ end if;
+ if OpCode = "00100100" or
+ OpCode = "00100101" or
+ OpCode(7 downto 1) = "0010011" or
+ OpCode(7 downto 3) = "00101" then
+ -- 00100100 2 ADD A,#data
+ -- 00100101 2 ADD A,data addr
+ -- 0010011i 1 ADD A,@Ri
+ -- 00101rrr 1 ADD A,Rn
+ Do_A_ADD <= '1';
+ end if;
+ if OpCode = "00110011" then
+ -- 00110011 1 RLC A
+ Do_A_RLC <= '1';
+ end if;
+ if OpCode = "00110100" or
+ OpCode = "00110101" or
+ OpCode(7 downto 1) = "0011011" or
+ OpCode(7 downto 3) = "00111" then
+ -- 00110100 2 ADDC A,#data
+ -- 00110101 2 ADDC A,data addr
+ -- 0011011i 1 ADDC A,@Ri
+ -- 00111rrr 1 ADDC A,Rn
+ Do_A_ADD <= '1';
+ Do_A_Carry <= '1';
+ end if;
+ if OpCode = "01000100" or
+ OpCode = "01000101" or
+ OpCode(7 downto 1) = "0100011" or
+ OpCode(7 downto 3) = "01001" then
+ -- 01000100 2 ORL A,#data
+ -- 01000101 2 ORL A,data addr
+ -- 0100011i 1 ORL A,@Ri
+ -- 01001rrr 1 ORL A,Rn
+ Do_A_ORL <= '1';
+ end if;
+ if OpCode = "01010100" or
+ OpCode = "01010101" or
+ OpCode(7 downto 1) = "0101011" or
+ OpCode(7 downto 3) = "01011" then
+ -- 01010100 2 ANL A,#data
+ -- 01010101 2 ANL A,data addr
+ -- 0101011i 1 ANL A,@Ri
+ -- 01011rrr 1 ANL A,Rn
+ Do_A_ANL <= '1';
+ end if;
+ if OpCode = "01100100" or
+ OpCode = "01100101" or
+ OpCode(7 downto 1) = "0110011" or
+ OpCode(7 downto 3) = "01101" then
+ -- 01100100 2 XRL A,#data
+ -- 01100101 2 XRL A,data addr
+ -- 0110011i 1 XRL A,@Ri
+ -- 01101rrr 1 XRL A,Rn
+ Do_A_XRL <= '1';
+ end if;
+ if OpCode = "01110100" or
+ OpCode = "11100101" or
+ OpCode(7 downto 1) = "1110011" or
+ OpCode(7 downto 3) = "11101" then
+ -- 01110100 2 MOV A,#data
+ -- 10000011 1 MOVC A,@A+PC -- Not handled here
+ -- 10010011 1 MOVC A,@A+DPTR -- Not handled here
+ -- 11100000 1 MOVX A,@DPTR
+ -- 1110001i 1 MOVX A,@Ri
+ -- 11100101 2 MOV A,data addr
+ -- 1110011i 1 MOV A,@Ri
+ -- 11101rrr 1 MOV A,Rn
+ Do_A_MOV <= '1';
+ end if;
+ if OpCode = "10000100" then
+ -- 10000100 1 DIV AB
+ Do_A_DIV <= '1';
+ end if;
+ if OpCode = "10010100" or
+ OpCode = "10010101" or
+ OpCode(7 downto 1) = "1001011" or
+ OpCode(7 downto 3) = "10011" then
+ -- 10010100 2 SUBB A,#data
+ -- 10010101 2 SUBB A,data addr
+ -- 1001011i 1 SUBB A,@Ri
+ -- 10011rrr 1 SUBB A,Rn
+ Do_A_SUBB <= '1';
+ Do_A_Carry <= '1';
+ end if;
+ if OpCode = "10100100" then
+ -- 10100100 1 MUL AB
+ Do_A_MUL <= '1';
+ end if;
+ if OpCode(7 downto 1) = "1011010" then
+ -- 10110100 3 CJNE A,#data,code addr
+ -- 10110101 3 CJNE A,data addr,code addr
+ Do_A_SUBB <= '1';
+ Do_A_CJNE <= '1';
+ end if;
+ if OpCode = "11000100" then
+ -- 11000100 1 SWAP A
+ Do_A_SWAP <= '1';
+ end if;
+ if OpCode = "11000101" or
+ OpCode(7 downto 1) = "1100011" or
+ OpCode(7 downto 3) = "11001" then
+ -- 11000101 2 XCH A,data addr
+ -- 1100011i 1 XCH A,@Ri
+ -- 11001rrr 1 XCH A,Rn
+ Do_A_XCH <= '1';
+ end if;
+ if OpCode = "11010100" then
+ -- 11010100 1 DA A
+ Do_A_DA <= '1';
+ end if;
+ if OpCode(7 downto 1) = "1101011" then
+ -- 1101011i 1 XCHD A,@Ri
+ Do_A_XCHD <= '1';
+ end if;
+ if OpCode = "11100100" then
+ -- 11100100 1 CLR A
+ Do_A_CLR <= '1';
+ end if;
+ if OpCode = "11110100" then
+ -- 11110100 1 CPL A
+ Do_A_CPL <= '1';
+ end if;
+
+ -- IDCPBL Operations
+
+ Do_I_Imm <= '0';
+ Do_I_INC <= '0';
+ Do_I_DEC <= '0';
+ Do_I_ORL <= '0';
+ Do_I_ANL <= '0';
+ Do_I_XRL <= '0';
+ Do_I_MOV <= '0';
+ Do_I_MOVD <= '0';
+ Do_I_CJNE <= '0';
+ IA_d <= IA;
+ MOV_Op <= OpCode(7 downto 4);
+ if OpCode(3 downto 0) = "0011" then
+ Do_I_Imm <= '1';
+ end if;
+ if OpCode = "00000101" or
+ OpCode(7 downto 1) = "0000011" or
+ OpCode(7 downto 3) = "00001" then
+ -- 00000101 2 INC data addr
+ -- 0000011i 1 INC @Ri
+ -- 00001rrr 1 INC Rn
+ Do_I_INC <= '1';
+ end if;
+ if OpCode = "00010101" or
+ OpCode(7 downto 1) = "0001011" or
+ OpCode(7 downto 3) = "00011" or
+ OpCode(7 downto 3) = "11011" or
+ OpCode = "11010101" then
+ -- 00010101 2 DEC data addr
+ -- 0001011i 1 DEC @Ri
+ -- 00011rrr 1 DEC Rn
+ -- 11011rrr 2 DJNZ Rn,code addr
+ -- 11010101 3 DJNZ data addr, code addr
+ Do_I_DEC <= '1';
+ end if;
+ if OpCode(7 downto 1) = "0100001" then
+ -- 01000010 2 ORL data addr,A
+ -- 01000011 3 ORL data addr,#data
+ Do_I_ORL <= '1';
+ end if;
+ if OpCode(7 downto 1) = "0101001" then
+ -- 01010010 2 ANL data addr,A
+ -- 01010011 3 ANL data addr,#data
+ Do_I_ANL <= '1';
+ end if;
+ if OpCode(7 downto 1) = "0110001" then
+ -- 01100010 2 XRL data addr,A
+ -- 01100011 3 XRL data addr,#data
+ Do_I_XRL <= '1';
+ end if;
+ if OpCode = "01110101" or
+ OpCode(7 downto 1) = "0111011" or
+ OpCode(7 downto 3) = "01111" or
+ OpCode(7 downto 1) = "1000011" or
+ OpCode(7 downto 3) = "10001" or
+ OpCode = "10010000" or
+ OpCode(7 downto 1) = "1010011" or
+ OpCode(7 downto 3) = "10101" or
+ OpCode = "11110000" or
+ OpCode(7 downto 1) = "1111001" or
+ OpCode = "11110101" or
+ OpCode(7 downto 1) = "1111011" or
+ OpCode(7 downto 3) = "11111" or
+ (OpCode(7 downto 5) = "110" and OpCode(3 downto 0) = "0000") then
+ -- 01110101 3 MOV data addr,#data
+ -- 0111011i 2 MOV @Ri,#data
+ -- 01111rrr 2 MOV Rn,#data
+ -- 1000011i 2 MOV data addr,@Ri
+ -- 10001rrr 2 MOV data addr,Rn
+ -- 10010000 3 MOV DPTR,#data -- Not handled here
+ -- 1010011i 2 MOV @Ri,data addr
+ -- 10101rrr 2 MOV Rn,data addr
+ -- 11110000 1 MOVX @DPTR,A
+ -- 1111001i 1 MOVX @Ri,A
+ -- 11110101 2 MOV data addr,A
+ -- 1111011i 1 MOV @Ri,A
+ -- 11111rrr 1 MOV Rn,A
+ -- 11000000 2 PUSH data addr INC SP: MOV "@SP",<src>
+ -- 11010000 2 POP data addr MOV <dest>,"@SP": DEC SP
+ Do_I_MOV <= '1';
+ end if;
+ if OpCode = "10000101" then
+ -- 10000101 3 MOV data addr,data addr
+ Do_I_MOVD <= '1';
+ end if;
+ if OpCode(7 downto 1) = "1011011" or
+ OpCode(7 downto 3) = "10111" then
+ -- 1011011i 3 CJNE @Ri,#data,code addr
+ -- 10111rrr 3 CJNE Rn,#data,code addr
+ Do_I_CJNE <= '1';
+ end if;
+
+ -- Bit Operations
+
+ Do_B_Inv <= '0';
+ Do_B_C_BA <= '0';
+ Do_B_C_Dir <= '0';
+ Do_B_BA_Dir <= '0';
+ Do_B_MOV <= '0';
+ Do_B_JBC <= '0';
+ Do_B_Op <= OpCode(5 downto 4);
+ if OpCode(1 downto 0) = "00" then
+ Do_B_Inv <= '1';
+ end if;
+ if OpCode = "01110010" or
+ OpCode = "10000010" or
+ OpCode = "10100000" or
+ OpCode = "10100010" or
+ OpCode = "10110000" then
+ -- 01110010 2 ORL C, bit addr
+ -- 10000010 2 ANL C,bit addr
+ -- 10100000 2 ORL C,/bit addr
+ -- 10100010 2 MOV C,bit addr
+ -- 10110000 2 ANL C,/bit addr
+ Do_B_C_BA <= '1';
+ end if;
+ if OpCode = "10110011" or
+ OpCode = "11000011" or
+ OpCode = "11010011" then
+ -- 10110011 1 CPL C
+ -- 11000011 1 CLR C
+ -- 11010011 1 SETB C
+ Do_B_C_Dir <= '1';
+ end if;
+ if OpCode = "10110010" or
+ OpCode = "11000010" or
+ OpCode = "11010010" then
+ -- 10110010 2 CPL bit addr
+ -- 11000010 2 CLR bit addr
+ -- 11010010 2 SETB bit addr
+ Do_B_BA_Dir <= '1';
+ end if;
+ if OpCode = "10010010" then
+ -- 10010010 2 MOV bit addr,C
+ Do_B_MOV <= '1';
+ end if;
+ if OpCode = "00010000" then
+ -- 00010000 3 JBC bit addr, code addr
+ Do_B_JBC <= '1';
+ end if;
+
+ Last_r <= Last;
+ end if;
+ end process;
+
+ -- Accumulator ALU
+ AddSub(ACC(3 downto 0), AOP2(3 downto 0), Do_A_SUBB, Do_A_SUBB xor (Do_A_Carry and CY_In), AS_Q(3 downto 0), AS_AC);
+ AddSub(ACC(6 downto 4), AOP2(6 downto 4), Do_A_SUBB, AS_AC, AS_Q(6 downto 4), AS_Carry7);
+ AddSub(ACC(7 downto 7), AOP2(7 downto 7), Do_A_SUBB, AS_Carry7, AS_Q(7 downto 7), AS_CY);
+
+ -- Mul / Div
+
+ md : T51_MD port map(Clk, ACC, B, Mul_Q, Mul_OV, Div_Q, Div_OV, Div_Rdy);
+
+ AOP2 <= IB when Do_A_Imm = '1' else IA;
+
+ tristate_mux: if tristate/=0 generate
+ ACC_Q <= "00000000" when Do_A_CLR = '1' else "ZZZZZZZZ"; -- No flags
+ ACC_Q <= ACC(0) & ACC(7 downto 1) when Do_A_RR = '1' else "ZZZZZZZZ"; -- No flags
+ ACC_Q <= CY_In & ACC(7 downto 1) when Do_A_RRC = '1' else "ZZZZZZZZ"; -- Sets CY
+ ACC_Q <= ACC(6 downto 0) & ACC(7) when Do_A_RL = '1' else "ZZZZZZZZ"; -- No flags
+ ACC_Q <= ACC(6 downto 0) & CY_In when Do_A_RLC = '1' else "ZZZZZZZZ"; -- Sets CY
+ ACC_Q <= std_logic_vector(unsigned(ACC) + 1) when Do_A_INC = '1' else "ZZZZZZZZ"; -- No flags
+ ACC_Q <= std_logic_vector(unsigned(ACC) - 1) when Do_A_DEC = '1' else "ZZZZZZZZ"; -- No flags
+ ACC_Q <= not ACC when Do_A_CPL = '1' else "ZZZZZZZZ"; -- No flags
+ ACC_Q <= ACC or AOP2 when Do_A_ORL = '1' else "ZZZZZZZZ"; -- No flags
+ ACC_Q <= ACC and AOP2 when Do_A_ANL = '1' else "ZZZZZZZZ"; -- No flags
+ ACC_Q <= ACC xor AOP2 when Do_A_XRL = '1' else "ZZZZZZZZ"; -- No flags
+ ACC_Q <= ACC(3 downto 0) & ACC(7 downto 4) when Do_A_SWAP = '1' else "ZZZZZZZZ"; -- No flags
+ ACC_Q <= IA when Do_A_XCH = '1' else "ZZZZZZZZ"; -- No flags
+ ACC_Q <= ACC(7 downto 4) & IA(3 downto 0) when Do_A_XCHD = '1' else "ZZZZZZZZ"; -- No flags
+ ACC_Q <= AOP2 when Do_A_MOV = '1' else "ZZZZZZZZ"; -- No flags
+ ACC_Q <= ADA(7 downto 0) when Do_A_DA = '1' else "ZZZZZZZZ"; -- Sets CY
+ ACC_Q <= AS_Q when Do_A_ADD = '1' or Do_A_SUBB = '1' else "ZZZZZZZZ"; -- Sets CY, (AC, OV)
+ ACC_Q <= Mul_Q(7 downto 0) when Do_A_MUL = '1' else "ZZZZZZZZ"; -- Sets OV
+ ACC_Q <= Div_Q(7 downto 0) when Do_A_DIV = '1' else "ZZZZZZZZ"; -- Sets OV
+
+ CY_Out <= CJNE_CY when Do_I_CJNE = '1' else 'Z';
+ CY_Out <= ADA(8) when Do_A_DA = '1' else 'Z';
+ CY_Out <= ACC(0) when Do_A_RRC = '1' else 'Z';
+ CY_Out <= ACC(7) when Do_A_RLC = '1' else 'Z';
+ CY_Out <= AS_CY xor Do_A_SUBB when Do_A_ADD = '1' or Do_A_SUBB = '1' else 'Z';
+ CY_Out <= '0' when Do_A_DIV = '1' or Do_A_MUL = '1' else 'Z';
+
+ CY_Out <= not CY_In when Do_B_C_Dir = '1' and Do_B_Op = "11" else
+ '0' when Do_B_C_Dir = '1' and Do_B_Op = "00" else
+ '1' when Do_B_C_Dir = '1' and Do_B_Op = "01" else 'Z';
+
+ CY_Out <= CY_In or Bit_IsOne when Do_B_C_BA = '1' and Do_B_Op = "11" and Do_B_Inv = '0' else
+ CY_In and Bit_IsOne when Do_B_C_BA = '1' and Do_B_Op = "00" and Do_B_Inv = '0' else
+ CY_In or Bit_IsOne when Do_B_C_BA = '1' and Do_B_Op = "10" and Do_B_Inv = '1' else
+ Bit_IsOne when Do_B_C_BA = '1' and Do_B_Op = "10" and Do_B_Inv = '0' else
+ CY_In and Bit_IsOne when Do_B_C_BA = '1' and Do_B_Op = "11" and Do_B_Inv = '1' else 'Z';
+
+
+ AC_Out <= AS_AC xor Do_A_SUBB when Do_A_ADD = '1' or Do_A_SUBB = '1' else 'Z';
+
+ B_Q <= Mul_Q(15 downto 8) when Do_A_MUL = '1' else "ZZZZZZZZ"; -- Sets OV
+ B_Q <= Div_Q(15 downto 8) when Do_A_DIV = '1' else "ZZZZZZZZ"; -- Sets OV
+
+ OV_Out <= AS_CY xor AS_Carry7 when Do_A_ADD = '1' or Do_A_SUBB = '1' else 'Z';
+ OV_Out <= Div_OV when Do_A_DIV = '1' else 'Z';
+ OV_Out <= Mul_OV when Do_A_MUL = '1' else 'Z';
+
+ IDCPBL_Q <= std_logic_vector(unsigned(IA) + 1) when Do_I_INC = '1' else "ZZZZZZZZ"; -- No flags
+ IDCPBL_Q <= std_logic_vector(unsigned(IA) - 1) when Do_I_DEC = '1' else "ZZZZZZZZ"; -- No flags
+ IDCPBL_Q <= IOP or IA when Do_I_ORL = '1' else "ZZZZZZZZ"; -- No flags
+ IDCPBL_Q <= IOP and IA when Do_I_ANL = '1' else "ZZZZZZZZ"; -- No flags
+ IDCPBL_Q <= IOP xor IA when Do_I_XRL = '1' else "ZZZZZZZZ"; -- No flags
+ IDCPBL_Q <= ACC when Do_A_XCH = '1' else "ZZZZZZZZ"; -- No flags
+ IDCPBL_Q <= IA(7 downto 4) & ACC(3 downto 0) when Do_A_XCHD = '1' else "ZZZZZZZZ"; -- No flags
+ IDCPBL_Q <= Bit_Result when Do_B_JBC = '1' or Do_B_BA_Dir = '1' or Do_B_MOV = '1' else "ZZZZZZZZ";
+ IDCPBL_Q <= MOV_Q when Do_I_MOV = '1' else "ZZZZZZZZ"; -- No flags
+ IDCPBL_Q <= IA_d when Do_I_MOVD = '1' else "ZZZZZZZZ"; -- No flags
+ end generate;
+
+ std_mux: if tristate=0 generate
+ ACC_Q <= "00000000" when Do_A_CLR = '1' else -- No flags
+ ACC(0) & ACC(7 downto 1) when Do_A_RR = '1' else -- No flags
+ CY_In & ACC(7 downto 1) when Do_A_RRC = '1' else -- Sets CY
+ ACC(6 downto 0) & ACC(7) when Do_A_RL = '1' else -- No flags
+ ACC(6 downto 0) & CY_In when Do_A_RLC = '1' else -- Sets CY
+ std_logic_vector(unsigned(ACC) + 1) when Do_A_INC = '1' else -- No flags
+ std_logic_vector(unsigned(ACC) - 1) when Do_A_DEC = '1' else -- No flags
+ not ACC when Do_A_CPL = '1' else -- No flags
+ ACC or AOP2 when Do_A_ORL = '1' else -- No flags
+ ACC and AOP2 when Do_A_ANL = '1' else -- No flags
+ ACC xor AOP2 when Do_A_XRL = '1' else -- No flags
+ ACC(3 downto 0) & ACC(7 downto 4) when Do_A_SWAP = '1' else -- No flags
+ IA when Do_A_XCH = '1' else -- No flags
+ ACC(7 downto 4) & IA(3 downto 0) when Do_A_XCHD = '1' else -- No flags
+ AOP2 when Do_A_MOV = '1' else -- No flags
+ ADA(7 downto 0) when Do_A_DA = '1' else -- Sets CY
+ AS_Q when Do_A_ADD = '1' or Do_A_SUBB = '1' else -- Sets CY, (AC, OV)
+ Mul_Q(7 downto 0) when Do_A_MUL = '1' else -- Sets OV
+ Div_Q(7 downto 0) when Do_A_DIV = '1' else -- Sets OV
+ (others =>'-');
+
+ CY_Out <= CJNE_CY when Do_I_CJNE = '1' else
+ ADA(8) when Do_A_DA = '1' else
+ ACC(0) when Do_A_RRC = '1' else
+ ACC(7) when Do_A_RLC = '1' else
+ AS_CY xor Do_A_SUBB when Do_A_ADD = '1' or Do_A_SUBB = '1' else
+ '0' when Do_A_DIV = '1' or Do_A_MUL = '1' else
+
+ not CY_In when Do_B_C_Dir = '1' and Do_B_Op = "11" else
+ '0' when Do_B_C_Dir = '1' and Do_B_Op = "00" else
+ '1' when Do_B_C_Dir = '1' and Do_B_Op = "01" else
+
+ CY_In or Bit_IsOne when Do_B_C_BA = '1' and Do_B_Op = "11" and Do_B_Inv = '0' else
+ CY_In and Bit_IsOne when Do_B_C_BA = '1' and Do_B_Op = "00" and Do_B_Inv = '0' else
+ CY_In or Bit_IsOne when Do_B_C_BA = '1' and Do_B_Op = "10" and Do_B_Inv = '1' else
+ Bit_IsOne when Do_B_C_BA = '1' and Do_B_Op = "10" and Do_B_Inv = '0' else
+ CY_In and Bit_IsOne when Do_B_C_BA = '1' and Do_B_Op = "11" and Do_B_Inv = '1' else
+ '-';
+
+ AC_Out <= AS_AC xor Do_A_SUBB when Do_A_ADD = '1' or Do_A_SUBB = '1' else
+ '-';
+
+ B_Q <= Mul_Q(15 downto 8) when Do_A_MUL = '1' else -- Sets OV
+ Div_Q(15 downto 8) when Do_A_DIV = '1' else -- Sets OV
+ (others =>'-');
+
+ OV_Out <= AS_CY xor AS_Carry7 when Do_A_ADD = '1' or Do_A_SUBB = '1' else
+ Div_OV when Do_A_DIV = '1' else
+ Mul_OV when Do_A_MUL = '1' else
+ '-';
+
+ IDCPBL_Q <= std_logic_vector(unsigned(IA) + 1) when Do_I_INC = '1' else -- No flags
+ std_logic_vector(unsigned(IA) - 1) when Do_I_DEC = '1' else -- No flags
+ IOP or IA when Do_I_ORL = '1' else -- No flags
+ IOP and IA when Do_I_ANL = '1' else -- No flags
+ IOP xor IA when Do_I_XRL = '1' else -- No flags
+ ACC when Do_A_XCH = '1' else -- No flags
+ IA(7 downto 4) & ACC(3 downto 0) when Do_A_XCHD = '1' else -- No flags
+ Bit_Result when Do_B_JBC = '1' or Do_B_BA_Dir = '1' or Do_B_MOV = '1' else
+ MOV_Q when Do_I_MOV = '1' else -- No flags
+ IA_d when Do_I_MOVD = '1' else -- No flags
+ (others =>'-');
+
+ end generate;
+
+ DJNZ <= '1' when std_logic_vector(unsigned(IA) - 1) /= "00000000" else '0';
+
+ -- DAA Opcode
+ DA : process (ACC, CY_In, AC_In)
+ variable accu : unsigned(8 downto 0);
+-- variable lc : std_logic;
+ variable add : unsigned(7 downto 0);
+-- variable do_add_lsb : boolean;
+ begin
+ accu := unsigned("0" & ACC);
+ add := (others =>'0');
+-- do_add_lsb := false;
+ if AC_In = '1' or accu(3 downto 0) > 9 then
+-- accu(3 downto 0) := accu(3 downto 0) + 6;
+ add(3 downto 0) := "0110"; --6
+-- do_add_lsb := true;
+ end if;
+-- lc := accu(8);
+ if CY_In = '1' or accu(7 downto 4) > 9 or
+ (accu(7 downto 4) = 9 and accu(3 downto 0) > 9) then
+-- accu := accu + 96;
+ add(7 downto 4) := "0110"; --6
+ end if;
+ accu := accu + add;
+-- accu(8) := accu(8) or lc or CY_In;
+ ADA <= std_logic_vector(accu);
+ ADA(8) <= accu(8) or CY_In; -- calculate Carry Out
+ end process;
+
+
+
+
+ -- Auxiliary ALU
+
+ IOP <= IB when Do_I_Imm = '1' else ACC;
+
+ MOV : process (MOV_Op, IB, ACC, IA_d)
+ begin
+ case MOV_Op is
+ when "0111" =>
+ -- 01110101 3 MOV data addr,#data
+ -- 0111011i 2 MOV @Ri,#data
+ -- 01111rrr 2 MOV Rn,#data
+ MOV_Q <= IB;
+ when "1000" =>
+ -- 10000101 3 MOV data addr,data addr
+ -- 1000011i 2 MOV data addr,@Ri
+ -- 10001rrr 2 MOV data addr,Rn
+ MOV_Q <= IA_d;
+ when "1010" =>
+ -- 1010011i 2 MOV @Ri,data addr
+ -- 10101rrr 2 MOV Rn,data addr
+ MOV_Q <= IA_d;
+ when "1111" =>
+ -- 11110000 1 MOVX @DPTR,A
+ -- 1111001i 1 MOVX @Ri,A
+ -- 11110101 2 MOV data addr,A
+ -- 1111011i 1 MOV @Ri,A
+ -- 11111rrr 1 MOV Rn,A
+ MOV_Q <= ACC;
+ when "1100"|"1101"=>
+ -- 11000000 2 PUSH data addr INC SP: MOV "@SP",<src>
+ -- 11010000 2 POP data addr MOV <dest>,"@SP": DEC SP
+ MOV_Q <= IA_d;
+ when others =>
+ MOV_Q <= "--------";
+ end case;
+ end process;
+
+
+ AddSub(IA, IB, '1', '1', CJNE_Q, CJNE_CY_n);
+ CJNE_CY <= not CJNE_CY_n;
+-- CY_Out <= not CJNE_CY_n when Do_I_CJNE = '1' else 'Z';
+
+
+ CJNE_Q_ZERO <= '1' when CJNE_Q = "00000000" else
+ '0';
+
+-- CJNE <= '1' when Do_I_CJNE = '1' and CJNE_Q /= "00000000" else
+ CJNE <= '1' when Do_I_CJNE = '1' and CJNE_Q_ZERO='0' else
+ '0' when Do_I_CJNE = '1' else
+ '1' when AS_Q /= "00000000" else '0'; -- Sets CY
+
+ -- Bit operations
+
+ Bit_Op1 <= IA and not Bit_Pattern;
+ Bit_Op2 <= Bit_Pattern and not IA when Do_B_Inv = '1' else Bit_Pattern and IA;
+ Bit_IsOne <= '0' when Bit_Op2 = "00000000" else '1';
+
+
+
+ Bit_Result <= IA xor Bit_Pattern when Do_B_BA_Dir = '1' and Do_B_Op = "11" else
+ Bit_Op1 when (Do_B_BA_Dir = '1' and Do_B_Op = "00") or Do_B_JBC = '1' else
+ IA or Bit_Pattern when Do_B_BA_Dir = '1' and Do_B_Op = "01" else
+ Bit_Op1 or (Bit_Pattern and CY_In & CY_In & CY_In & CY_In & CY_In & CY_In & CY_In & CY_In) when Do_B_MOV = '1' else "--------";
+
+
+
+ -- Flags
+
+ AC_Wr <= Last_r when (Do_A_ADD = '1' or Do_A_SUBB = '1') and Do_A_CJNE = '0' else '0';
+
+ OV_Wr <= Last_r when ((Do_A_ADD = '1' or Do_A_SUBB = '1') and Do_A_CJNE = '0') or
+ Do_A_DIV = '1' or Do_A_MUL = '1' else '0';
+
+ CY_Wr <= Last_r when Do_A_ADD = '1' or Do_A_SUBB = '1' or
+ Do_A_RRC = '1' or Do_A_RLC = '1' or
+ Do_I_CJNE = '1' or Do_A_DA = '1' or
+ Do_B_C_BA = '1' or Do_B_C_Dir = '1' or
+ Do_A_DIV = '1' or Do_A_MUL = '1' else '0';
+
+end;
diff --git a/rtl/vhdl/T51_Glue.vhd b/rtl/vhdl/T51_Glue.vhd
new file mode 100644
index 0000000..dde72f6
--- /dev/null
+++ b/rtl/vhdl/T51_Glue.vhd
@@ -0,0 +1,254 @@
+--
+-- 8052 compatible microcontroller
+--
+-- Version : 0300
+--
+-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
+-- (c) 2004-2005 Andreas Voggeneder (andreas.voggeneder@fh-hagenberg.at)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use work.T51_Pack.all;
+
+entity T51_Glue is
+ generic(
+ tristate : integer := 1
+ );
+ port(
+ Clk : in std_logic;
+ Rst_n : in std_logic;
+ INT0 : in std_logic;
+ INT1 : in std_logic;
+ RI : in std_logic;
+ TI : in std_logic;
+ OF0 : in std_logic;
+ OF1 : in std_logic;
+ OF2 : in std_logic;
+ IO_Wr : in std_logic;
+ IO_Addr : in std_logic_vector(6 downto 0);
+ IO_Addr_r : in std_logic_vector(6 downto 0);
+ IO_WData : in std_logic_vector(7 downto 0);
+ IO_RData : out std_logic_vector(7 downto 0);
+ Selected : out std_logic;
+ Int_Acc : in std_logic_vector(6 downto 0); -- Acknowledge
+ R0 : out std_logic;
+ R1 : out std_logic;
+ SMOD : out std_logic;
+ P0_Sel : out std_logic;
+ P1_Sel : out std_logic;
+ P2_Sel : out std_logic;
+ P3_Sel : out std_logic;
+ TMOD_Sel : out std_logic;
+ TL0_Sel : out std_logic;
+ TL1_Sel : out std_logic;
+ TH0_Sel : out std_logic;
+ TH1_Sel : out std_logic;
+ T2CON_Sel : out std_logic;
+ RCAP2L_Sel : out std_logic;
+ RCAP2H_Sel : out std_logic;
+ TL2_Sel : out std_logic;
+ TH2_Sel : out std_logic;
+ SCON_Sel : out std_logic;
+ SBUF_Sel : out std_logic;
+ P0_Wr : out std_logic;
+ P1_Wr : out std_logic;
+ P2_Wr : out std_logic;
+ P3_Wr : out std_logic;
+ TMOD_Wr : out std_logic;
+ TL0_Wr : out std_logic;
+ TL1_Wr : out std_logic;
+ TH0_Wr : out std_logic;
+ TH1_Wr : out std_logic;
+ T2CON_Wr : out std_logic;
+ RCAP2L_Wr : out std_logic;
+ RCAP2H_Wr : out std_logic;
+ TL2_Wr : out std_logic;
+ TH2_Wr : out std_logic;
+ SCON_Wr : out std_logic;
+ SBUF_Wr : out std_logic;
+ Int_Trig : out std_logic_vector(6 downto 0)
+ );
+end T51_Glue;
+
+architecture rtl of T51_Glue is
+
+ signal IE : std_logic_vector(7 downto 0);
+ signal TCON : std_logic_vector(7 downto 0);
+ signal PCON : std_logic_vector(7 downto 0);
+
+ signal Int0_r : std_logic_vector(1 downto 0);
+ signal Int1_r : std_logic_vector(1 downto 0);
+
+begin
+
+ R0 <= TCON(4);
+ R1 <= TCON(6);
+ SMOD <= PCON(7);
+
+ -- Registers/Interrupts
+ tristate_mux: if tristate/=0 generate
+ IO_RData <= TCON when IO_Addr = "0001000" else "ZZZZZZZZ"; -- $88 TCON
+ IO_RData <= PCON when IO_Addr = "0000111" else "ZZZZZZZZ"; -- $87 TCON
+ IO_RData <= IE when IO_Addr = "0101000" else "ZZZZZZZZ";
+ Selected <= '0';
+ end generate;
+
+ std_mux: if tristate=0 generate
+ IO_RData <= TCON when IO_Addr = "0001000" else
+ PCON when IO_Addr = "0000111" else
+ IE when IO_Addr = "0101000" else
+ (others =>'-');
+ Selected <= '1' when IO_Addr = "0001000" or
+ IO_Addr = "0000111" or
+ IO_Addr = "0101000" else
+ '0';
+ end generate;
+
+ process (Rst_n, Clk)
+ begin
+ if Rst_n = '0' then
+ IE <= "00000000";
+ TCON <= "00000000";
+ PCON <= "00000000";
+ Int0_r <= "11";
+ Int1_r <= "11";
+ elsif Clk'event and Clk = '1' then
+ Int0_r(0) <= INT0;
+ Int0_r(1) <= Int0_r(0);
+ Int1_r(0) <= INT1;
+ Int1_r(1) <= Int1_r(0);
+
+ if IO_Wr = '1' and IO_Addr_r = "0101000" then
+ IE <= IO_WData;
+ end if;
+ if IO_Wr = '1' and IO_Addr_r = "0001000" then
+ TCON <= IO_WData;
+ end if;
+ if IO_Wr = '1' and IO_Addr_r = "0000111" then
+ PCON <= IO_WData;
+ end if;
+
+ if OF0 = '1' then
+ TCON(5) <= '1';
+ end if;
+ if Int_Acc(1) = '1' then
+ TCON(5) <= '0';
+ end if;
+ if OF1 = '1' then
+ TCON(7) <= '1';
+ end if;
+ if Int_Acc(3) = '1' then
+ TCON(7) <= '0';
+ end if;
+
+ -- External interrupts
+ if TCON(0) = '1' then
+ if Int_Acc(0) = '1' then
+ TCON(1) <= '0';
+ end if;
+ if Int0_r = "10" then
+ TCON(1) <= '1';
+ end if;
+ else
+ TCON(1) <= not Int0_r(0);
+ end if;
+ if TCON(2) = '1' then
+ if Int_Acc(2) = '1' then
+ TCON(3) <= '0';
+ end if;
+ if Int1_r = "10" then
+ TCON(3) <= '1';
+ end if;
+ else
+ TCON(3) <= not Int1_r(0);
+ end if;
+ end if;
+ end process;
+
+ Int_Trig(0) <= '0' when IE(7) = '0' or IE(0) = '0' else not Int0_r(1) when TCON(0) = '0' else TCON(1);
+ Int_Trig(1) <= '1' when IE(7) = '1' and IE(1) = '1' and TCON(5) = '1' else '0';
+ Int_Trig(2) <= '0' when IE(7) = '0' or IE(2) = '0' else not Int1_r(1) when TCON(2) = '0' else TCON(3);
+ Int_Trig(3) <= '1' when IE(7) = '1' and IE(3) = '1' and TCON(7) = '1' else '0';
+ Int_Trig(4) <= '1' when IE(7) = '1' and IE(4) = '1' and (RI = '1' or TI = '1') else '0';
+ Int_Trig(5) <= '1' when IE(7) = '1' and IE(5) = '1' and OF2 = '1' else '0';
+ Int_Trig(6) <= '0';
+
+ P0_Sel <= '1' when IO_Addr = "0000000" else '0';
+ P0_Wr <= '1' when IO_Addr_r = "0000000" and IO_Wr = '1' else '0';
+
+ P1_Sel <= '1' when IO_Addr = "0010000" else '0';
+ P1_Wr <= '1' when IO_Addr_r = "0010000" and IO_Wr = '1' else '0';
+
+ P2_Sel <= '1' when IO_Addr = "0100000" else '0';
+ P2_Wr <= '1' when IO_Addr_r = "0100000" and IO_Wr = '1' else '0';
+
+ P3_Sel <= '1' when IO_Addr = "0110000" else '0';
+ P3_Wr <= '1' when IO_Addr_r = "0110000" and IO_Wr = '1' else '0';
+
+ TMOD_Sel <= '1' when IO_Addr = "0001001" else '0';
+ TMOD_Wr <= '1' when IO_Addr_r = "0001001" and IO_Wr = '1' else '0';
+ TL0_Sel <= '1' when IO_Addr = "0001010" else '0';
+ TL0_Wr <= '1' when IO_Addr_r = "0001010" and IO_Wr = '1' else '0';
+ TL1_Sel <= '1' when IO_Addr = "0001011" else '0';
+ TL1_Wr <= '1' when IO_Addr_r = "0001011" and IO_Wr = '1' else '0';
+ TH0_Sel <= '1' when IO_Addr = "0001100" else '0';
+ TH0_Wr <= '1' when IO_Addr_r = "0001100" and IO_Wr = '1' else '0';
+ TH1_Sel <= '1' when IO_Addr = "0001101" else '0';
+ TH1_Wr <= '1' when IO_Addr_r = "0001101" and IO_Wr = '1' else '0';
+
+ T2CON_Sel <= '1' when IO_Addr = "1001000" else '0';
+ T2CON_Wr <= '1' when IO_Addr_r = "1001000" and IO_Wr = '1' else '0';
+ RCAP2L_Sel <= '1' when IO_Addr = "1001010" else '0';
+ RCAP2L_Wr <= '1' when IO_Addr_r = "1001010" and IO_Wr = '1' else '0';
+ RCAP2H_Sel <= '1' when IO_Addr = "1001011" else '0';
+ RCAP2H_Wr <= '1' when IO_Addr_r = "1001011" and IO_Wr = '1' else '0';
+ TL2_Sel <= '1' when IO_Addr = "1001100" else '0';
+ TL2_Wr <= '1' when IO_Addr_r = "1001100" and IO_Wr = '1' else '0';
+ TH2_Sel <= '1' when IO_Addr = "1001101" else '0';
+ TH2_Wr <= '1' when IO_Addr_r = "1001101" and IO_Wr = '1' else '0';
+
+ SCON_Sel <= '1' when IO_Addr = "0011000" else '0';
+ SCON_Wr <= '1' when IO_Addr_r = "0011000" and IO_Wr = '1' else '0';
+ SBUF_Sel <= '1' when IO_Addr = "0011001" else '0';
+ SBUF_Wr <= '1' when IO_Addr_r = "0011001" and IO_Wr = '1' else '0';
+end;
diff --git a/rtl/vhdl/T51_MD.vhd b/rtl/vhdl/T51_MD.vhd
new file mode 100644
index 0000000..7a433df
--- /dev/null
+++ b/rtl/vhdl/T51_MD.vhd
@@ -0,0 +1,137 @@
+--
+-- 8051 compatible microcontroller core
+--
+-- Version : 0300
+--
+-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
+-- (c) 2004-2005 Andreas Voggeneder (andreas.voggeneder@fh-hagenberg.at)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+use WORK.T51_Pack.all;
+
+entity T51_MD is
+ port(
+ Clk : in std_logic;
+ ACC : in std_logic_vector(7 downto 0);
+ B : in std_logic_vector(7 downto 0);
+ Mul_Q : out std_logic_vector(15 downto 0);
+ Mul_OV : out std_logic;
+ Div_Q : out std_logic_vector(15 downto 0);
+ Div_OV : out std_logic;
+ Div_Rdy : out std_logic
+ );
+end T51_MD;
+
+architecture rtl of T51_MD is
+
+ signal Old_ACC : std_logic_vector(7 downto 0);
+ signal Old_B : std_logic_vector(7 downto 0);
+
+begin
+
+ process (ACC, B)
+ variable Tmp : unsigned(15 downto 0);
+ begin
+ Tmp := unsigned(ACC) * unsigned(B);
+ Mul_Q <= std_logic_vector(Tmp);
+ if Tmp(15 downto 8) = "00000000" then
+ Mul_OV <= '0';
+ else
+ Mul_OV <= '1';
+ end if;
+ end process;
+
+ process (Clk)
+ variable Tmp1 : unsigned(15 downto 0);
+ variable Tmp2 : unsigned(8 downto 0);
+ variable Tmp3 : unsigned(7 downto 0);
+ variable Cnt : unsigned(3 downto 0);
+ begin
+ if Clk'event and Clk = '1' then
+ Old_ACC <= ACC;
+ Old_B <= B;
+ Div_Rdy <= '0';
+ Div_OV <= '0';
+
+ if Cnt(3) = '1' then
+ Div_Rdy <= '1';
+ end if;
+
+ if B = "00000000" then
+ Div_Q <= (others => '-');
+ Div_OV <= '1';
+ Div_Rdy <= '1';
+ elsif ACC = B then
+ Div_Q(7 downto 0) <= "00000001";
+ Div_Q(15 downto 8) <= "00000000";
+ elsif ACC < B then
+ Div_Q(7 downto 0) <= "00000000";
+ Div_Q(15 downto 8) <= std_logic_vector(ACC);
+ Div_Rdy <= '1';
+ elsif Cnt(3) = '0' then
+ Tmp1(15 downto 1) := Tmp1(14 downto 0);
+ Tmp1(0) := '0';
+ Tmp2 := ("1" & Tmp1(15 downto 8)) - ("0" & Tmp3);
+ if Tmp2(8) = '1' then
+ Tmp1(0) := '1';
+ Tmp1(15 downto 8) := Tmp2(7 downto 0);
+ end if;
+ Div_Q <= std_logic_Vector(Tmp1);
+ end if;
+
+ if Old_ACC /= ACC or Old_B /= B then
+ Tmp1(7 downto 0) := unsigned(ACC);
+ Tmp1(15 downto 8) := "00000000";
+ Tmp3 := unsigned(B);
+ Cnt := "0000";
+ Div_Rdy <= '0';
+ else
+ cnt := cnt + 1;
+ end if;
+
+ end if;
+ end process;
+
+end;
diff --git a/rtl/vhdl/T51_Pack.vhd b/rtl/vhdl/T51_Pack.vhd
new file mode 100644
index 0000000..ff29a6f
--- /dev/null
+++ b/rtl/vhdl/T51_Pack.vhd
@@ -0,0 +1,369 @@
+--
+-- 8051 compatible microcontroller core
+--
+-- Version : 0300
+--
+-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
+-- (c) 2004-2005 Andreas Voggeneder (andreas.voggeneder@fh-hagenberg.at)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+package T51_Pack is
+
+ component T51_MD
+ port(
+ Clk : in std_logic;
+ ACC : in std_logic_vector(7 downto 0);
+ B : in std_logic_vector(7 downto 0);
+ Mul_Q : out std_logic_vector(15 downto 0);
+ Mul_OV : out std_logic;
+ Div_Q : out std_logic_vector(15 downto 0);
+ Div_OV : out std_logic;
+ Div_Rdy : out std_logic
+ );
+ end component;
+
+ component T51_ALU
+ generic(
+ tristate : integer := 0
+ );
+ port(
+ Clk : in std_logic;
+ Last : in std_logic;
+ OpCode : in std_logic_vector(7 downto 0);
+ ACC : in std_logic_vector(7 downto 0);
+ B : in std_logic_vector(7 downto 0);
+ IA : in std_logic_vector(7 downto 0);
+ IB : in std_logic_vector(7 downto 0);
+ Bit_Pattern : in std_logic_vector(7 downto 0);
+ CY_In : in std_logic;
+ AC_In : in std_logic;
+ ACC_Q : out std_logic_vector(7 downto 0);
+ B_Q : out std_logic_vector(7 downto 0);
+ IDCPBL_Q : out std_logic_vector(7 downto 0);
+ Div_Rdy : out std_logic;
+ CJNE : out std_logic;
+ DJNZ : out std_logic;
+ CY_Out : out std_logic;
+ AC_Out : out std_logic;
+ OV_Out : out std_logic;
+ CY_Wr : out std_logic;
+ AC_Wr : out std_logic;
+ OV_Wr : out std_logic
+ );
+ end component;
+
+ component T51_RAM
+ generic(
+ RAMAddressWidth : integer
+ );
+ port (
+ Clk : in std_logic;
+ ARE : in std_logic;
+ Rst_n : in std_logic;
+ Wr : in std_logic;
+ DIn : in std_logic_vector(7 downto 0);
+ Int_AddrA : in std_logic_vector(7 downto 0);
+ Int_AddrA_r : out std_logic_vector(7 downto 0);
+ Int_AddrB : in std_logic_vector(7 downto 0);
+ Mem_A : out std_logic_vector(7 downto 0);
+ Mem_B : out std_logic_vector(7 downto 0)
+ );
+ end component;
+
+ component T51_RAM_Altera
+ generic(
+ RAMAddressWidth : integer
+ );
+ port (
+ Clk : in std_logic;
+ ARE : in std_logic;
+ Rst_n : in std_logic;
+ Wr : in std_logic;
+ DIn : in std_logic_vector(7 downto 0);
+ Int_AddrA : in std_logic_vector(7 downto 0);
+ Int_AddrA_r : out std_logic_vector(7 downto 0);
+ Int_AddrB : in std_logic_vector(7 downto 0);
+ Mem_A : out std_logic_vector(7 downto 0);
+ Mem_B : out std_logic_vector(7 downto 0)
+ );
+ end component;
+
+ component T51
+ generic(
+ DualBus : integer := 1;
+ RAMAddressWidth : integer := 8;
+ SecondDPTR : integer := 0;
+ t8032 : integer := 0;
+ tristate : integer := 1
+ );
+ port(
+ Clk : in std_logic;
+ Rst_n : in std_logic;
+ Ready : in std_logic;
+ ROM_Addr : out std_logic_vector(15 downto 0);
+ ROM_Data : in std_logic_vector(7 downto 0);
+ RAM_Addr : out std_logic_vector(15 downto 0);
+ RAM_RData : in std_logic_vector(7 downto 0);
+ RAM_WData : out std_logic_vector(7 downto 0);
+ RAM_Cycle : out std_logic;
+ RAM_Rd : out std_logic;
+ RAM_Wr : out std_logic;
+ Int_Trig : in std_logic_vector(6 downto 0);
+ Int_Acc : out std_logic_vector(6 downto 0);
+ SFR_Rd_RMW : out std_logic;
+ SFR_Wr : out std_logic;
+ SFR_Addr : out std_logic_vector(6 downto 0);
+ SFR_WData : out std_logic_vector(7 downto 0);
+ SFR_RData_in : in std_logic_vector(7 downto 0);
+ IRAM_Wr : out std_logic;
+ IRAM_Addr : out std_logic_vector(7 downto 0);
+ IRAM_WData : out std_logic_vector(7 downto 0)
+ );
+ end component;
+
+ component T51_Glue
+ generic(
+ tristate : integer := 1
+ );
+ port(
+ Clk : in std_logic;
+ Rst_n : in std_logic;
+ INT0 : in std_logic;
+ INT1 : in std_logic;
+ RI : in std_logic;
+ TI : in std_logic;
+ OF0 : in std_logic;
+ OF1 : in std_logic;
+ OF2 : in std_logic;
+ IO_Wr : in std_logic;
+ IO_Addr : in std_logic_vector(6 downto 0);
+ IO_Addr_r : in std_logic_vector(6 downto 0);
+ IO_WData : in std_logic_vector(7 downto 0);
+ IO_RData : out std_logic_vector(7 downto 0);
+ Selected : out std_logic;
+ Int_Acc : in std_logic_vector(6 downto 0); -- Acknowledge
+ R0 : out std_logic;
+ R1 : out std_logic;
+ SMOD : out std_logic;
+ P0_Sel : out std_logic;
+ P1_Sel : out std_logic;
+ P2_Sel : out std_logic;
+ P3_Sel : out std_logic;
+ TMOD_Sel : out std_logic;
+ TL0_Sel : out std_logic;
+ TL1_Sel : out std_logic;
+ TH0_Sel : out std_logic;
+ TH1_Sel : out std_logic;
+ T2CON_Sel : out std_logic;
+ RCAP2L_Sel : out std_logic;
+ RCAP2H_Sel : out std_logic;
+ TL2_Sel : out std_logic;
+ TH2_Sel : out std_logic;
+ SCON_Sel : out std_logic;
+ SBUF_Sel : out std_logic;
+ P0_Wr : out std_logic;
+ P1_Wr : out std_logic;
+ P2_Wr : out std_logic;
+ P3_Wr : out std_logic;
+ TMOD_Wr : out std_logic;
+ TL0_Wr : out std_logic;
+ TL1_Wr : out std_logic;
+ TH0_Wr : out std_logic;
+ TH1_Wr : out std_logic;
+ T2CON_Wr : out std_logic;
+ RCAP2L_Wr : out std_logic;
+ RCAP2H_Wr : out std_logic;
+ TL2_Wr : out std_logic;
+ TH2_Wr : out std_logic;
+ SCON_Wr : out std_logic;
+ SBUF_Wr : out std_logic;
+ Int_Trig : out std_logic_vector(6 downto 0)
+ );
+ end component;
+
+ component T51_Port
+ generic(
+ tristate : integer := 1
+ );
+ port(
+ Clk : in std_logic;
+ Rst_n : in std_logic;
+ Sel : in std_logic;
+ Rd_RMW : in std_logic;
+ Wr : in std_logic;
+ Data_In : in std_logic_vector(7 downto 0);
+ Data_Out : out std_logic_vector(7 downto 0);
+ IOPort_in : in std_logic_vector(7 downto 0);
+ IOPort_out : out std_logic_vector(7 downto 0)
+ );
+ end component;
+
+ component T51_TC01
+ generic(
+ FastCount : integer := 0;
+ tristate : integer := 1
+ );
+ port(
+ Clk : in std_logic;
+ Rst_n : in std_logic;
+ T0 : in std_logic;
+ T1 : in std_logic;
+ INT0 : in std_logic;
+ INT1 : in std_logic;
+ M_Sel : in std_logic;
+ H0_Sel : in std_logic;
+ L0_Sel : in std_logic;
+ H1_Sel : in std_logic;
+ L1_Sel : in std_logic;
+ R0 : in std_logic;
+ R1 : in std_logic;
+ M_Wr : in std_logic;
+ H0_Wr : in std_logic;
+ L0_Wr : in std_logic;
+ H1_Wr : in std_logic;
+ L1_Wr : in std_logic;
+ Data_In : in std_logic_vector(7 downto 0);
+ Data_Out : out std_logic_vector(7 downto 0);
+ OF0 : out std_logic;
+ OF1 : out std_logic
+ );
+ end component;
+
+ component T51_TC2
+ generic(
+ FastCount : integer := 0;
+ tristate : integer := 1
+ );
+ port(
+ Clk : in std_logic;
+ Rst_n : in std_logic;
+ T2 : in std_logic;
+ T2EX : in std_logic;
+ C_Sel : in std_logic;
+ CH_Sel : in std_logic;
+ CL_Sel : in std_logic;
+ H_Sel : in std_logic;
+ L_Sel : in std_logic;
+ C_Wr : in std_logic;
+ CH_Wr : in std_logic;
+ CL_Wr : in std_logic;
+ H_Wr : in std_logic;
+ L_Wr : in std_logic;
+ Data_In : in std_logic_vector(7 downto 0);
+ Data_Out : out std_logic_vector(7 downto 0);
+ UseR2 : out std_logic;
+ UseT2 : out std_logic;
+ UART_Clk : out std_logic;
+ F : out std_logic
+ );
+ end component;
+
+ component T51_UART
+ generic(
+ FastCount : integer := 0;
+ tristate : integer := 1
+ );
+ port(
+ Clk : in std_logic;
+ Rst_n : in std_logic;
+ UseR2 : in std_logic;
+ UseT2 : in std_logic;
+ BaudC2 : in std_logic;
+ BaudC1 : in std_logic;
+ SC_Sel : in std_logic;
+ SB_Sel : in std_logic;
+ SC_Wr : in std_logic;
+ SB_Wr : in std_logic;
+ SMOD : in std_logic;
+ Data_In : in std_logic_vector(7 downto 0);
+ Data_Out : out std_logic_vector(7 downto 0);
+ RXD : in std_logic;
+ RXD_IsO : out std_logic;
+ RXD_O : out std_logic;
+ TXD : out std_logic;
+ RI : out std_logic;
+ TI : out std_logic
+ );
+ end component;
+
+ procedure AddSub(A : std_logic_vector;
+ B : std_logic_vector;
+ Sub : std_logic;
+ Carry_In : std_logic;
+ signal Res : out std_logic_vector;
+ signal Carry : out std_logic);
+
+end T51_Pack;
+
+package body T51_Pack is
+
+ procedure AddSub(A : std_logic_vector;
+ B : std_logic_vector;
+ Sub : std_logic;
+ Carry_In : std_logic;
+ signal Res : out std_logic_vector;
+ signal Carry : out std_logic) is
+ variable B_i : unsigned(A'length downto 0);
+ variable Full_Carry : unsigned(A'length downto 0);
+ variable Res_i : unsigned(A'length downto 0);
+ begin
+ if Sub = '1' then
+ B_i := "0" & unsigned(not B);
+ else
+ B_i := "0" & unsigned(B);
+ end if;
+ if (Sub = '1' and Carry_In = '1') or (Sub = '0' and Carry_In = '1') then
+ Full_Carry := (others => '0');
+ Full_Carry(0) := '1';
+ else
+ Full_Carry := (others => '0');
+ end if;
+ Res_i := unsigned("0" & A) + B_i + Full_Carry;
+ Carry <= Res_i(A'length);
+ Res <= std_logic_vector(Res_i(A'length - 1 downto 0));
+ end;
+
+end;
diff --git a/rtl/vhdl/T51_Port.vhd b/rtl/vhdl/T51_Port.vhd
new file mode 100644
index 0000000..1095957
--- /dev/null
+++ b/rtl/vhdl/T51_Port.vhd
@@ -0,0 +1,107 @@
+--
+-- 8051 compatible microcontroller core
+--
+-- Version : 0300
+--
+-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
+-- (c) 2004-2005 Andreas Voggeneder (andreas.voggeneder@fh-hagenberg.at)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+-- No pull-ups
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+--library unisim;
+--use unisim.all;
+
+entity T51_Port is
+ generic(
+ tristate : integer := 1
+ );
+ port(
+ Clk : in std_logic;
+ Rst_n : in std_logic;
+ Sel : in std_logic;
+ Rd_RMW : in std_logic;
+ Wr : in std_logic;
+ Data_In : in std_logic_vector(7 downto 0);
+ Data_Out : out std_logic_vector(7 downto 0);
+ IOPort_in : in std_logic_vector(7 downto 0);
+ IOPort_out : out std_logic_vector(7 downto 0)
+ );
+end T51_Port;
+
+architecture rtl of T51_Port is
+ signal Port_Output : std_logic_vector(7 downto 0);
+ signal Port_Input : std_logic_vector(7 downto 0);
+-- signal P_trans : std_logic_vector(7 downto 0);
+
+begin
+
+ tristate_mux: if tristate/=0 generate
+ Data_Out <= Port_Input when Sel = '1' and Rd_RMW = '0' else (others =>'Z');
+ Data_Out <= Port_Output when Sel = '1' and Rd_RMW = '1' else (others =>'Z');
+ end generate;
+
+ std_mux: if tristate=0 generate
+ Data_Out <= Port_Input when Sel = '1' and Rd_RMW = '0' else
+ Port_Output when Sel = '1' and Rd_RMW = '1' else
+ (others =>'-');
+ end generate;
+
+iop: for i in 0 to 7 generate
+
+ IOPort_out(i) <= Port_Output(i);
+ Port_Input(i) <= To_X01Z(IOPort_in(i));
+end generate;
+
+ process (Rst_n, Clk)
+ begin
+ if Rst_n = '0' then
+ Port_Output <= (others =>'1');
+ elsif Clk'event and Clk = '1' then
+ if Wr = '1' then
+ Port_Output <= Data_In;
+ end if;
+ end if;
+ end process;
+
+end;
diff --git a/rtl/vhdl/T51_RAM.vhd b/rtl/vhdl/T51_RAM.vhd
new file mode 100644
index 0000000..4448549
--- /dev/null
+++ b/rtl/vhdl/T51_RAM.vhd
@@ -0,0 +1,131 @@
+--
+-- 8051 compatible microcontroller core
+--
+-- Version : 0300
+--
+-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
+-- (c) 2004-2005 Andreas Voggeneder (andreas.voggeneder@fh-hagenberg.at)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+-- Uses two RAMs instead of DP-RAM as not all synthesis tools support DP-RAM inferring
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+entity T51_RAM is
+ generic(
+ RAMAddressWidth : integer := 8
+ );
+ port (
+ Clk : in std_logic;
+ Rst_n : in std_logic;
+ ARE : in std_logic;
+ Wr : in std_logic;
+ DIn : in std_logic_vector(7 downto 0);
+ Int_AddrA : in std_logic_vector(7 downto 0);
+ Int_AddrA_r : out std_logic_vector(7 downto 0);
+ Int_AddrB : in std_logic_vector(7 downto 0);
+ Mem_A : out std_logic_vector(7 downto 0);
+ Mem_B : out std_logic_vector(7 downto 0)
+ );
+end T51_RAM;
+
+architecture rtl of T51_RAM is
+
+ type RAM_Image is array (2**RAMAddressWidth - 1 downto 0) of std_logic_vector(7 downto 0);
+ signal IRAMA : RAM_Image;
+ signal IRAMB : RAM_Image;
+
+ signal Int_AddrA_r_i : std_logic_vector(7 downto 0);
+
+begin
+
+ Int_AddrA_r <= Int_AddrA_r_i;
+
+ process (Rst_n, Clk)
+ begin
+-- pragma translate_off
+ if Rst_n = '0' then
+ Int_AddrA_r_i <= (others => '0');
+ IRAMA <= (others => "00000000");
+ IRAMB <= (others => "00000000");
+ else
+-- pragma translate_on
+ if Clk'event and Clk = '1' then
+-- pragma translate_off
+ if not is_x(Int_AddrA) then
+-- pragma translate_on
+ if ARE = '1' then
+ Mem_A <= IRAMA(to_integer(unsigned(Int_AddrA)));
+ end if;
+-- pragma translate_off
+ else
+ Mem_A <= (others =>'-');
+ end if;
+ if not is_x(Int_AddrB) then
+-- pragma translate_on
+ if ARE = '1' then
+ Mem_B <= IRAMB(to_integer(unsigned(Int_AddrB)));
+ end if;
+-- pragma translate_off
+ else
+ Mem_B <= (others =>'-');
+ end if;
+-- pragma translate_on
+ if Wr = '1' then
+ IRAMA(to_integer(unsigned(Int_AddrA_r_i))) <= DIn;
+ IRAMB(to_integer(unsigned(Int_AddrA_r_i))) <= DIn;
+ if Int_AddrA_r_i = Int_AddrA then
+ Mem_A <= DIn;
+ end if;
+ if Int_AddrA_r_i = Int_AddrB then
+ Mem_B <= DIn;
+ end if;
+ end if;
+ Int_AddrA_r_i <= Int_AddrA;
+ end if;
+-- pragma translate_off
+ end if;
+-- pragma translate_on
+ end process;
+
+end;
diff --git a/rtl/vhdl/T51_TC01.vhd b/rtl/vhdl/T51_TC01.vhd
new file mode 100644
index 0000000..5740192
--- /dev/null
+++ b/rtl/vhdl/T51_TC01.vhd
@@ -0,0 +1,270 @@
+--
+-- 8051 compatible microcontroller core
+--
+-- Version : 0300
+--
+-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
+-- (c) 2004-2005 Andreas Voggeneder (andreas.voggeneder@fh-hagenberg.at)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+entity T51_TC01 is
+ generic(
+ FastCount : integer := 0;
+ tristate : integer := 1
+ );
+ port(
+ Clk : in std_logic;
+ Rst_n : in std_logic;
+ T0 : in std_logic;
+ T1 : in std_logic;
+ INT0 : in std_logic;
+ INT1 : in std_logic;
+ M_Sel : in std_logic;
+ H0_Sel : in std_logic;
+ L0_Sel : in std_logic;
+ H1_Sel : in std_logic;
+ L1_Sel : in std_logic;
+ R0 : in std_logic;
+ R1 : in std_logic;
+ M_Wr : in std_logic;
+ H0_Wr : in std_logic;
+ L0_Wr : in std_logic;
+ H1_Wr : in std_logic;
+ L1_Wr : in std_logic;
+ Data_In : in std_logic_vector(7 downto 0);
+ Data_Out : out std_logic_vector(7 downto 0);
+ OF0 : out std_logic;
+ OF1 : out std_logic
+ );
+end T51_TC01;
+
+architecture rtl of T51_TC01 is
+
+ signal TMOD : std_logic_vector(7 downto 0);
+ signal Cnt0 : std_logic_vector(15 downto 0);
+ signal Cnt1 : std_logic_vector(15 downto 0);
+
+ signal Tick0 : std_logic;
+ signal Tick1 : std_logic;
+ signal Tick12 : std_logic;
+
+begin
+
+ -- Registers and counter
+ tristate_mux: if tristate/=0 generate
+ Data_Out <= Cnt0(15 downto 8) when H0_Sel = '1' else "ZZZZZZZZ";
+ Data_Out <= Cnt0(7 downto 0) when L0_Sel = '1' else "ZZZZZZZZ";
+ Data_Out <= Cnt1(15 downto 8) when H1_Sel = '1' else "ZZZZZZZZ";
+ Data_Out <= Cnt1(7 downto 0) when L1_Sel = '1' else "ZZZZZZZZ";
+ Data_Out <= TMOD when M_Sel = '1' else "ZZZZZZZZ";
+ end generate;
+
+ std_mux: if tristate=0 generate
+ Data_Out <= Cnt0(15 downto 8) when H0_Sel = '1' else
+ Cnt0(7 downto 0) when L0_Sel = '1' else
+ Cnt1(15 downto 8) when H1_Sel = '1' else
+ Cnt1(7 downto 0) when L1_Sel = '1' else
+ TMOD when M_Sel = '1' else
+ (others =>'-');
+ end generate;
+
+ process (Rst_n, Clk)
+ begin
+ if Rst_n = '0' then
+ TMOD <= (others => '0');
+ Cnt0 <= (others => '0');
+ Cnt1 <= (others => '0');
+ OF0 <= '0';
+ OF1 <= '0';
+ elsif Clk'event and Clk = '1' then
+ OF0 <= '0';
+ OF1 <= '0';
+ if TMOD(1 downto 0) = "00" then
+ if Tick0 = '1' then
+ Cnt0(12 downto 0) <= std_logic_vector(unsigned(Cnt0(12 downto 0)) + 1);
+ if Cnt0(12 downto 0) = "1111111111111" then
+ OF0 <= '1';
+ end if;
+ end if;
+ end if;
+ if TMOD(5 downto 4) = "00" then
+ if Tick1 = '1' then
+ Cnt1(12 downto 0) <= std_logic_vector(unsigned(Cnt1(12 downto 0)) + 1);
+ if Cnt1(12 downto 0) = "1111111111111" then
+ OF1 <= '1';
+ end if;
+ end if;
+ end if;
+ if TMOD(1 downto 0) = "01" then
+ if Tick0 = '1' then
+ Cnt0 <= std_logic_vector(unsigned(Cnt0) + 1);
+ if Cnt0 = "1111111111111111" then
+ OF0 <= '1';
+ end if;
+ end if;
+ end if;
+ if TMOD(5 downto 4) = "01" then
+ if Tick1 = '1' then
+ Cnt1 <= std_logic_vector(unsigned(Cnt1) + 1);
+ if Cnt1 = "1111111111111111" then
+ OF1 <= '1';
+ end if;
+ end if;
+ end if;
+ if TMOD(1 downto 0) = "10" then
+ if Tick0 = '1' then
+ Cnt0(7 downto 0) <= std_logic_vector(unsigned(Cnt0(7 downto 0)) + 1);
+ if Cnt0(7 downto 0) = "11111111" then
+ Cnt0(7 downto 0) <= Cnt0(15 downto 8);
+ OF0 <= '1';
+ end if;
+ end if;
+ end if;
+ if TMOD(5 downto 4) = "10" then
+ if Tick1 = '1' then
+ Cnt1(7 downto 0) <= std_logic_vector(unsigned(Cnt1(7 downto 0)) + 1);
+ if Cnt1(7 downto 0) = "11111111" then
+ Cnt1(7 downto 0) <= Cnt1(15 downto 8);
+ OF1 <= '1';
+ end if;
+ end if;
+ end if;
+ if TMOD(1 downto 0) = "11" then
+ if Tick0 = '1' then
+ Cnt0(7 downto 0) <= std_logic_vector(unsigned(Cnt0(7 downto 0)) + 1);
+ if Cnt0(7 downto 0) = "11111111" then
+ OF0 <= '1';
+ end if;
+ end if;
+ OF1 <= '0';
+ if R1 = '1' and Tick12 = '1' then
+ Cnt0(15 downto 8) <= std_logic_vector(unsigned(Cnt0(15 downto 8)) + 1);
+ if Cnt1(15 downto 8) = "11111111" then
+ OF1 <= '1';
+ end if;
+ end if;
+ end if;
+
+ -- Register write
+ if M_Wr = '1' then
+ TMOD <= Data_In;
+ end if;
+ if H0_Wr = '1' then
+ Cnt0(15 downto 8) <= Data_In;
+ end if;
+ if L0_Wr = '1' then
+ Cnt0(7 downto 0) <= Data_In;
+ end if;
+ if H1_Wr = '1' then
+ Cnt1(15 downto 8) <= Data_In;
+ end if;
+ if L1_Wr = '1' then
+ Cnt1(7 downto 0) <= Data_In;
+ end if;
+ end if;
+ end process;
+
+ -- Tick generator
+ process (Clk, Rst_n)
+ variable Prescaler : unsigned(3 downto 0);
+ variable T0_r : std_logic_vector(1 downto 0);
+ variable T1_r : std_logic_vector(1 downto 0);
+ variable I0_r : std_logic_vector(1 downto 0);
+ variable I1_r : std_logic_vector(1 downto 0);
+ begin
+ if Rst_n = '0' then
+ Prescaler := (others => '0');
+ Tick0 <= '0';
+ Tick1 <= '0';
+ Tick12 <= '0';
+ T0_r := "00";
+ T1_r := "00";
+ I0_r := "00";
+ I1_r := "00";
+ elsif Clk'event and Clk='1' then
+ Tick0 <= '0';
+ Tick1 <= '0';
+ Tick12 <= '0';
+
+ if R0 = '1' and (I0_r(1) = '1' or TMOD(3) = '0') then
+ if TMOD(2) = '1' then
+ Tick0 <= T0_r(0) and not T0_r(1);
+ else
+ Tick0 <= Tick12;
+ end if;
+ end if;
+
+ if R1 = '1' and (I1_r(1) = '1' or TMOD(7) = '0') then
+ if TMOD(6) = '1' then
+ Tick1 <= T1_r(0) and not T1_r(1);
+ else
+ Tick1 <= Tick12;
+ end if;
+ end if;
+
+ T0_r(1) := T0_r(0);
+ T1_r(1) := T1_r(0);
+ T0_r(0) := T0;
+ T1_r(0) := T1;
+
+ I0_r(1) := I0_r(0);
+ I1_r(1) := I1_r(0);
+ I0_r(0) := INT0;
+ I1_r(0) := INT1;
+
+ if Prescaler = "1011" then
+ Prescaler := "0000";
+ Tick12 <= '1';
+ else
+ Prescaler := Prescaler + 1;
+ end if;
+ if FastCount/=0 then
+ Tick12 <= '1';
+ end if;
+ end if;
+ end process;
+
+end;
diff --git a/rtl/vhdl/T51_TC2.vhd b/rtl/vhdl/T51_TC2.vhd
new file mode 100644
index 0000000..34a01e0
--- /dev/null
+++ b/rtl/vhdl/T51_TC2.vhd
@@ -0,0 +1,213 @@
+--
+-- 8051 compatible microcontroller core
+--
+-- Version : 0300
+--
+-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
+-- (c) 2004-2005 Andreas Voggeneder (andreas.voggeneder@fh-hagenberg.at)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+entity T51_TC2 is
+ generic(
+ FastCount : integer := 0;
+ tristate : integer := 1
+ );
+ port(
+ Clk : in std_logic;
+ Rst_n : in std_logic;
+ T2 : in std_logic;
+ T2EX : in std_logic;
+ C_Sel : in std_logic;
+ CH_Sel : in std_logic;
+ CL_Sel : in std_logic;
+ H_Sel : in std_logic;
+ L_Sel : in std_logic;
+ C_Wr : in std_logic;
+ CH_Wr : in std_logic;
+ CL_Wr : in std_logic;
+ H_Wr : in std_logic;
+ L_Wr : in std_logic;
+ Data_In : in std_logic_vector(7 downto 0);
+ Data_Out : out std_logic_vector(7 downto 0);
+ UseR2 : out std_logic;
+ UseT2 : out std_logic;
+ UART_Clk : out std_logic;
+ F : out std_logic
+ );
+end T51_TC2;
+
+architecture rtl of T51_TC2 is
+
+ signal TCON : std_logic_vector(7 downto 0);
+ signal Cnt : std_logic_vector(15 downto 0);
+ signal Cpt : std_logic_vector(15 downto 0);
+
+ signal Tick : std_logic;
+ signal Tick12 : std_logic;
+ signal Capture : std_logic;
+
+begin
+
+ F <= TCON(6) or TCON(7);
+ UseR2 <= TCON(5);
+ UseT2 <= TCON(4);
+
+ -- Registers and counter
+ tristate_mux: if tristate/=0 generate
+ Data_Out <= Cnt(15 downto 8) when H_Sel = '1' else "ZZZZZZZZ";
+ Data_Out <= Cnt(7 downto 0) when L_Sel = '1' else "ZZZZZZZZ";
+ Data_Out <= Cpt(15 downto 8) when CH_Sel = '1' else "ZZZZZZZZ";
+ Data_Out <= Cpt(7 downto 0) when CL_Sel = '1' else "ZZZZZZZZ";
+ Data_Out <= TCON when C_Sel = '1' else "ZZZZZZZZ";
+ end generate;
+
+ std_mux: if tristate=0 generate
+ Data_Out <= Cnt(15 downto 8) when H_Sel = '1' else
+ Cnt(7 downto 0) when L_Sel = '1' else
+ Cpt(15 downto 8) when CH_Sel = '1' else
+ Cpt(7 downto 0) when CL_Sel = '1' else
+ TCON when C_Sel = '1' else
+ (others =>'-');
+ end generate;
+
+ process (Rst_n, Clk)
+ begin
+ if Rst_n = '0' then
+ TCON <= (others => '0');
+ Cnt <= (others => '0');
+ Cpt <= (others => '0');
+ UART_Clk <= '0';
+ elsif Clk'event and Clk = '1' then
+-- TCON(7) <= '0';
+ UART_Clk <= '0';
+ if Tick = '1' then
+ Cnt <= std_logic_vector(unsigned(Cnt) + 1);
+ if Cnt = "1111111111111111" then
+ if TCON(4) = '0' and TCON(5) = '0' then
+ TCON(7) <= '1';
+ end if;
+ if TCON(0) = '0' or TCON(4) = '1' or TCON(5) = '1' then
+ Cnt <= Cpt;
+ end if;
+ UART_Clk <= '1';
+ end if;
+ end if;
+ if Capture = '1' and TCON(0) = '0' and TCON(4) = '0' and TCON(5) = '0' then
+ Cnt <= Cpt;
+ TCON(6) <= '1';
+ end if;
+ if Capture = '1' and TCON(0) = '1' and TCON(4) = '0' and TCON(5) = '0' then
+ Cpt <= Cnt;
+ TCON(6) <= '1';
+ end if;
+
+ -- Register write
+ if C_Wr = '1' then
+ TCON <= Data_In;
+ end if;
+ if H_Wr = '1' then
+ Cnt(15 downto 8) <= Data_In;
+ end if;
+ if L_Wr = '1' then
+ Cnt(7 downto 0) <= Data_In;
+ end if;
+ if CH_Wr = '1' then
+ Cpt(15 downto 8) <= Data_In;
+ end if;
+ if CL_Wr = '1' then
+ Cpt(7 downto 0) <= Data_In;
+ end if;
+ end if;
+ end process;
+
+ -- Tick generator
+ process (Clk, Rst_n)
+ variable Prescaler : unsigned(3 downto 0);
+ variable T_r : std_logic_vector(1 downto 0);
+ variable E_r : std_logic_vector(1 downto 0);
+ begin
+ if Rst_n = '0' then
+ Prescaler := (others => '0');
+ Tick <= '0';
+ Tick12 <= '0';
+ Capture <= '0';
+ T_r := "00";
+ elsif Clk'event and Clk='1' then
+ Tick <= '0';
+ Tick12 <= '0';
+ Capture <= '0';
+
+ if TCON(2) = '1' then
+ if TCON(1) = '1' then
+ Tick <= T_r(0) and not T_r(1);
+ else
+ Tick <= Tick12;
+ end if;
+ end if;
+
+ if TCON(3) = '1' then
+ Capture <= E_r(1) and not E_r(0);
+ end if;
+
+ T_r(1) := T_r(0);
+ T_r(0) := T2;
+
+ E_r(1) := E_r(0);
+ E_r(0) := T2EX;
+
+ if (Prescaler(0) = '1' and (TCON(4) = '1' or TCON(5) = '1')) or Prescaler = "1011" then
+ Prescaler := "0000";
+ Tick12 <= '1';
+ else
+ Prescaler := Prescaler + 1;
+ end if;
+ if FastCount/=0 then
+ Tick12 <= '1';
+ end if;
+ end if;
+ end process;
+
+end;
diff --git a/rtl/vhdl/T51_UART.vhd b/rtl/vhdl/T51_UART.vhd
new file mode 100644
index 0000000..e24fa32
--- /dev/null
+++ b/rtl/vhdl/T51_UART.vhd
@@ -0,0 +1,379 @@
+--
+-- 8051 compatible microcontroller core
+--
+-- Version : 0300
+--
+-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
+-- (c) 2004-2005 Andreas Voggeneder (andreas.voggeneder@fh-hagenberg.at)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+-- 15-Jan-06 : Bugfix for writing SCON Register in mode 0
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+entity T51_UART is
+ generic(
+ FastCount : integer := 0;
+ tristate : integer := 1
+ );
+ port(
+ Clk : in std_logic;
+ Rst_n : in std_logic;
+ UseR2 : in std_logic;
+ UseT2 : in std_logic;
+ BaudC2 : in std_logic;
+ BaudC1 : in std_logic;
+ SC_Sel : in std_logic;
+ SB_Sel : in std_logic;
+ SC_Wr : in std_logic;
+ SB_Wr : in std_logic;
+ SMOD : in std_logic;
+ Data_In : in std_logic_vector(7 downto 0);
+ Data_Out : out std_logic_vector(7 downto 0);
+ RXD : in std_logic;
+ RXD_IsO : out std_logic;
+ RXD_O : out std_logic;
+ TXD : out std_logic;
+ RI : out std_logic;
+ TI : out std_logic
+ );
+end T51_UART;
+
+architecture rtl of T51_UART is
+
+ signal SCON : std_logic_vector(7 downto 0);
+ signal SBUF : std_logic_vector(7 downto 0);
+
+ signal Baud16R_i : std_logic;
+ signal Baud16T_i : std_logic;
+ signal BaudC1_g : std_logic;
+ signal BaudFix : std_logic;
+
+ signal Bit_Phase : unsigned(3 downto 0);
+ signal RX_Filtered : std_logic;
+ signal RX_ShiftReg : std_logic_vector(8 downto 0);
+ signal RX_Bit_Cnt : integer range 0 to 11;
+ signal RX_Shifting : std_logic;
+-- signal Overflow_t : std_logic;
+
+ signal TXD_i : std_logic;
+ signal TX_Tick : std_logic;
+ signal TX_Start : std_logic;
+ signal TX_Shifting : std_logic;
+ signal TX_Data : std_logic_vector(7 downto 0);
+ signal TX_ShiftReg : std_logic_vector(8 downto 0);
+ signal TX_Bit_Cnt : integer range 0 to 11;
+
+ signal Tick6 : std_logic;
+
+begin
+
+ -- Registers
+ tristate_mux: if tristate/=0 generate
+ Data_Out <= SCON when SC_Sel = '1' else "ZZZZZZZZ";
+ Data_Out <= SBUF when SB_Sel = '1' else "ZZZZZZZZ";
+ end generate;
+
+ std_mux: if tristate=0 generate
+ Data_Out <= SCON when SC_Sel = '1' else
+ SBUF when SB_Sel = '1' else
+ (others =>'-');
+ end generate;
+
+ process (Rst_n, Clk)
+ begin
+ if Rst_n = '0' then
+ SCON(7 downto 3) <= "00000";
+ elsif Clk'event and Clk = '1' then
+ if SC_Wr = '1' then
+ SCON(7 downto 3) <= Data_In(7 downto 3);
+ end if;
+ end if;
+ end process;
+
+ Baud16T_i <= (UseT2 and BaudC2) or (not UseT2 and BaudC1 and BaudC1_g) when SCON(6) = '1' else
+ BaudFix;
+ Baud16R_i <= (UseR2 and BaudC2) or (not UseR2 and BaudC1 and BaudC1_g) when SCON(6) = '1' else
+ BaudFix;
+
+ -- Baud x 16 clock generator
+ process (Clk, Rst_n)
+ variable Baud_Cnt : unsigned(5 downto 0);
+ begin
+ if Rst_n = '0' then
+ Baud_Cnt := "000000";
+ BaudFix <= '0';
+ BaudC1_g <= '0';
+ elsif Clk'event and Clk='1' then
+ BaudFix <= '0';
+ if SMOD = '0' and BaudC1 = '1' then
+ BaudC1_g <= not BaudC1_g;
+ elsif SMOD = '1' then
+ BaudC1_g <= '1';
+ end if;
+ if Baud_Cnt(4 downto 0) = "11111" and (SMOD = '1' or Baud_Cnt(5) = '1') then
+ BaudFix <= '1';
+ end if;
+ Baud_Cnt := Baud_Cnt - 1;
+ end if;
+ end process;
+
+ -- Input filter
+ process (Clk, Rst_n)
+ variable Samples : std_logic_vector(1 downto 0);
+ begin
+ if Rst_n = '0' then
+ Samples := "11";
+ RX_Filtered <= '1';
+ elsif Clk'event and Clk = '1' then
+ if Baud16R_i = '1' then
+ Samples(1) := Samples(0);
+ Samples(0) := RXD;
+ end if;
+ if Samples = "00" then
+ RX_Filtered <= '0';
+ end if;
+ if Samples = "11" then
+ RX_Filtered <= '1';
+ end if;
+ end if;
+ end process;
+
+ -- Receive state machine
+ RI <= SCON(0);
+ process (Clk, Rst_n)
+ begin
+ if Rst_n = '0' then
+ SCON(0) <= '0';
+ SCON(2) <= '0';
+ SBUF <= "00000000";
+ Bit_Phase <= "0000";
+ RX_ShiftReg(8 downto 0) <= "000000000";
+ RX_Bit_Cnt <= 0;
+ RX_Shifting <= '0';
+ elsif Clk'event and Clk = '1' then
+ if SC_Wr = '1' then
+ SCON(0) <= Data_In(0);
+ SCON(2) <= Data_In(2);
+-- RX_Shifting <= '0';
+ end if;
+ if SCON(7 downto 6) /= "00" then
+ RX_Shifting <= '0';
+ end if;
+ if SCON(7 downto 6) = "00" and Tick6 = '1' and (TXD_i = '0' or RX_Bit_Cnt = 0) then
+ if SCON(4) = '1' and SCON(0) = '0' and RX_Bit_Cnt = 0 then
+ RX_Shifting <= '1';
+ RX_Bit_Cnt <= 1;
+ elsif RX_Bit_Cnt /= 0 then
+ if RX_Bit_Cnt = 8 then
+ RX_Shifting <= '0';
+ SCON(0) <= '1';
+ SBUF(6 downto 0) <= RX_ShiftReg(7 downto 1);
+ SBUF(7) <= RX_Filtered;
+ RX_Bit_Cnt <= 0;
+ else
+ RX_ShiftReg(7 downto 0) <= RX_ShiftReg(8 downto 1);
+ RX_ShiftReg(7) <= RX_Filtered;
+ RX_Bit_Cnt <= RX_Bit_Cnt + 1;
+ end if;
+ end if;
+ elsif Baud16R_i = '1' and SCON(4) = '1' then
+ if RX_Bit_Cnt = 0 and (RX_Filtered = '1' or Bit_Phase = "0111") then
+ Bit_Phase <= "0000";
+ else
+ Bit_Phase <= Bit_Phase + 1;
+ end if;
+ if RX_Bit_Cnt = 0 then
+ if Bit_Phase = "0111" then
+ RX_Bit_Cnt <= RX_Bit_Cnt + 1;
+ end if;
+ elsif Bit_Phase = "1111" then
+ RX_Bit_Cnt <= RX_Bit_Cnt + 1;
+ if (SCON(7) = '0' and RX_Bit_Cnt = 9) or
+ (SCON(7) = '1' and RX_Bit_Cnt = 10) then -- Stop bit
+ RX_Bit_Cnt <= 0;
+ if not (SCON(5) = '1' and RX_ShiftReg(8) = '0') then
+ SCON(0) <= '1';
+ end if;
+ if SCON(7 downto 5) = "010" then
+ SCON(2) <= RX_Filtered;
+ end if;
+ if SCON(7) = '1' then
+ SCON(2) <= RX_ShiftReg(8);
+ end if;
+ SBUF <= RX_ShiftReg(7 downto 0);
+ else
+ RX_ShiftReg(7 downto 0) <= RX_ShiftReg(8 downto 1);
+ if SCON(7) = '1' then
+ RX_ShiftReg(8) <= RX_Filtered;
+ else
+ RX_ShiftReg(7) <= RX_Filtered;
+ end if;
+ end if;
+ end if;
+ end if;
+ end if;
+ end process;
+
+ -- Transmit bit tick
+ process (Clk, Rst_n)
+ variable TX_Cnt : unsigned(3 downto 0);
+ begin
+ if Rst_n = '0' then
+ TX_Cnt := "0000";
+ TX_Tick <= '0';
+ elsif Clk'event and Clk = '1' then
+ TX_Tick <= '0';
+ if Baud16T_i = '1' then
+ if TX_Cnt = "1111" then
+ TX_Tick <= '1';
+ end if;
+ TX_Cnt := TX_Cnt + 1;
+ end if;
+ end if;
+ end process;
+
+ -- Transmit state machine
+ RXD_IsO <= TX_Shifting;
+ TI <= SCON(1);
+ TXD <= TXD_i;
+ process (Clk, Rst_n)
+ begin
+ if Rst_n = '0' then
+ SCON(1) <= '0';
+ TX_Bit_Cnt <= 0;
+ TX_ShiftReg <= (others => '0');
+ TX_Data <= (others => '0');
+ TX_Start <= '0';
+ TX_Shifting <= '0';
+ TXD_i <= '1';
+ RXD_O <= '1';
+ elsif Clk'event and Clk = '1' then
+ if SC_Wr = '1' then
+ SCON(1) <= Data_In(1);
+-- TX_Shifting <= '0';
+ end if;
+ if SB_Wr = '1' then
+ TX_Data <= Data_In;
+ TX_Start <= '1';
+ end if;
+ if SCON(7 downto 6) /= "00" then
+ TX_Shifting <= '0';
+ end if;
+ if Tick6 = '1' and (RX_Shifting = '1' or TX_Shifting = '1') then
+ TXD_i <= not TXD_i;
+ end if;
+ if SCON(7 downto 6) = "00" and Tick6 = '1' and (TXD_i = '0' or TX_Bit_Cnt = 0) then
+ if TX_Start = '1' and TX_Bit_Cnt = 0 then
+ TX_ShiftReg(6 downto 0) <= TX_Data(7 downto 1);
+ TX_Shifting <= '1';
+ TX_Bit_Cnt <= 1;
+ TX_Start <= '0';
+ RXD_O <= TX_Data(0);
+ elsif TX_Bit_Cnt /= 0 then
+ if TX_Bit_Cnt = 8 then
+ TX_Shifting <= '0';
+ SCON(1) <= '1';
+ RXD_O <= '1';
+ TX_Bit_Cnt <= 0;
+ else
+ RXD_O <= TX_ShiftReg(0);
+-- SCON(1) <= '1';
+ TX_Bit_Cnt <= TX_Bit_Cnt + 1;
+ end if;
+ TX_ShiftReg(7 downto 0) <= TX_ShiftReg(8 downto 1);
+ end if;
+ elsif TX_Tick = '1' then
+ case TX_Bit_Cnt is
+ when 0 =>
+ if TX_Start = '1' then
+ TX_Bit_Cnt <= 1;
+ end if;
+ TXD_i <= '1';
+ when 1 => -- Start bit
+ TX_ShiftReg(7 downto 0) <= TX_Data;
+ TX_ShiftReg(8) <= SCON(3);
+ TX_Start <= '0';
+ TXD_i <= '0';
+ TX_Bit_Cnt <= TX_Bit_Cnt + 1;
+ when others =>
+ TX_Bit_Cnt <= TX_Bit_Cnt + 1;
+ if SCON(7) = '1' then
+ if TX_Bit_Cnt = 10 then
+ TX_Bit_Cnt <= 0;
+ SCON(1) <= '1';
+ end if;
+ else
+ if TX_Bit_Cnt = 9 then
+ TX_Bit_Cnt <= 0;
+ SCON(1) <= '1';
+ end if;
+ end if;
+ TXD_i <= TX_ShiftReg(0);
+ TX_ShiftReg(7 downto 0) <= TX_ShiftReg(8 downto 1);
+ end case;
+ end if;
+ end if;
+ end process;
+
+ -- Tick generator
+ process (Clk, Rst_n)
+ variable Prescaler : unsigned(2 downto 0);
+ begin
+ if Rst_n = '0' then
+ Prescaler := (others => '0');
+ Tick6 <= '0';
+ elsif Clk'event and Clk='1' then
+ Tick6 <= '0';
+ if Prescaler = "101" then
+ Prescaler := "000";
+ Tick6 <= '1';
+ else
+ Prescaler := Prescaler + 1;
+ end if;
+ if FastCount/=0 then
+ Tick6 <= '1';
+ end if;
+ end if;
+ end process;
+
+end;
diff --git a/rtl/vhdl/T51s.vhd b/rtl/vhdl/T51s.vhd
new file mode 100644
index 0000000..5a9b006
--- /dev/null
+++ b/rtl/vhdl/T51s.vhd
@@ -0,0 +1,1551 @@
+--
+-- 8051 compatible microcontroller core
+--
+-- Version : 0300
+--
+-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
+-- (c) 2004-2005 Andreas Voggeneder (andreas.voggeneder@fh-hagenberg.ac.at)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+-- 16-Dec-05 : Bugfix for JBC Instruction
+-- 21-Jan-06 : Bugfix for INC DPTR instruction for special cases
+-- 19-Feb-06 : Bugfix for interrupts at stalled instructions
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+use work.T51_Pack.all;
+
+entity T51s is
+ generic(
+ DualBus : integer := 0; -- FALSE: single bus movx
+ SecondDPTR : integer := 0;
+ tristate : integer := 0);
+ port(
+ Clk : in std_logic;
+ Rst_n : in std_logic;
+ Ready : in std_logic;
+ ROM_Addr : out std_logic_vector(15 downto 0);
+ ROM_Data : in std_logic_vector(7 downto 0);
+ RAM_Addr : out std_logic_vector(15 downto 0);
+ RAM_RData : in std_logic_vector(7 downto 0);
+ RAM_WData : out std_logic_vector(7 downto 0);
+ RAM_Cycle : out std_logic;
+ RAM_Rd : out std_logic;
+ RAM_Wr : out std_logic;
+ Int_Trig : in std_logic_vector(6 downto 0);
+ Int_Acc : out std_logic_vector(6 downto 0);
+ SFR_Rd_RMW : out std_logic;
+ SFR_Wr : out std_logic;
+ SFR_Addr : out std_logic_vector(6 downto 0);
+ SFR_WData : out std_logic_vector(7 downto 0);
+ SFR_RData_in : in std_logic_vector(7 downto 0);
+ -- DEBUG
+ opcode_o : out std_logic_vector(7 downto 0);
+
+ -- external iram (standard synchronous dual ported ram)
+ -- Port A (only read)
+ IRAM_AddrA : out std_logic_vector(7 downto 0);
+ IRAM_DoutA : in std_logic_vector(7 downto 0);
+ -- Port B (read and write)
+ IRAM_AddrB : out std_logic_vector(7 downto 0);
+ IRAM_DoutB : in std_logic_vector(7 downto 0);
+ IRAM_Wr : out std_logic;
+ IRAM_WData : out std_logic_vector(7 downto 0)
+ );
+end T51s;
+
+architecture rtl of T51s is
+ -- speeds up instructions "mov @Ri,direct" and "mov Ri,direct" by one cycle
+ -- but not fully testet. So use it with care
+ constant fast_cpu_c : integer := 0;
+ -- Registers
+ signal ACC : std_logic_vector(7 downto 0);
+ signal B : std_logic_vector(7 downto 0);
+ signal PSW : std_logic_vector(7 downto 1); -- Bit 0 is parity
+ signal PSW0 : std_logic;
+ signal IP : std_logic_vector(7 downto 0);
+ signal SP : unsigned(7 downto 0);
+ signal DPL0 : std_logic_vector(7 downto 0); -- DPTR 0
+ signal DPH0 : std_logic_vector(7 downto 0); -- DPTR 0
+ signal DPL1 : std_logic_vector(7 downto 0); -- DPTR 1
+ signal DPH1 : std_logic_vector(7 downto 0); -- DPTR 1
+ signal DPL : std_logic_vector(7 downto 0); -- current DPTR
+ signal DPH : std_logic_vector(7 downto 0); -- current DPTR
+ signal DPS, next_DPS : std_logic;
+ signal dptr_inc : std_logic_vector(15 downto 0);
+ signal DPS_r : std_logic;
+ signal PC : unsigned(15 downto 0);
+ signal P2R : std_logic_vector(7 downto 0);
+
+ signal PCC : std_logic_vector(15 downto 0);
+ signal NPC : unsigned(15 downto 0);
+ signal OPC : unsigned(15 downto 0);
+
+ -- ALU signals
+ signal Op_A : std_logic_vector(7 downto 0);
+ signal Op_B : std_logic_vector(7 downto 0);
+ signal Mem_A : std_logic_vector(7 downto 0);
+ signal Mem_B : std_logic_vector(7 downto 0);
+ signal Old_Mem_B : std_logic_vector(7 downto 0);
+ signal ACC_Q : std_logic_vector(7 downto 0);
+ signal B_Q : std_logic_vector(7 downto 0);
+ signal Res_Bus : std_logic_vector(7 downto 0);
+ signal Status_D : std_logic_vector(7 downto 5);
+ signal Status_Wr : std_logic_vector(7 downto 5);
+
+ -- Misc signals
+ signal Int_AddrA : std_logic_vector(7 downto 0);
+ signal Int_AddrA_r : std_logic_vector(7 downto 0);
+ signal Int_AddrB : std_logic_vector(7 downto 0);
+
+ signal MCode : std_logic_vector(3 downto 0);
+ signal FCycle : std_logic_vector(1 downto 0);
+
+ signal RET_r : std_logic;
+ signal RET : std_logic;
+
+ signal Stall_pipe : std_logic;
+ signal Ri_Stall : std_logic;
+ signal PSW_Stall : std_logic;
+ signal ACC_Stall : std_logic;
+ signal SP_Stall : std_logic;
+ signal movx_Stall : std_logic;
+ signal DPRAM_Stall : std_logic;
+ signal iReady : std_logic;
+
+ signal Next_PSW7 : std_logic;
+ signal Next_ACC_Z : std_logic;
+ signal ACC_Wr : std_logic;
+ signal B_Wr : std_logic;
+
+ signal SFR_RData_r : std_logic_vector(7 downto 0);
+ signal SFR_RData : std_logic_vector(7 downto 0);
+
+ signal Mem_Din : std_logic_vector(7 downto 0);
+
+ signal Bit_Pattern : std_logic_vector(7 downto 0);
+
+ -- Registered instruction words.
+ signal Inst : std_logic_vector(7 downto 0);
+ signal Inst1 : std_logic_vector(7 downto 0);
+ signal Inst2 : std_logic_vector(7 downto 0);
+
+ -- Control signals
+ signal Rst_r_n : std_logic;
+ signal Last : std_logic;
+ signal SFR_Wr_i : std_logic;
+ signal Mem_Wr : std_logic;
+ signal J_Skip : std_logic;
+ signal IPending : std_logic;
+ signal Int_Trig_r : std_logic_vector(6 downto 0);
+ signal IStart : std_logic;
+ signal ICall : std_logic;
+ signal HPInt : std_logic;
+ signal LPInt : std_logic;
+ signal PCPaused : std_logic_vector(3 downto 0);
+ signal PCPause : std_logic;
+ signal Inst_Skip : std_logic;
+ signal Div_Rdy : std_logic;
+ signal RAM_Rd_i : std_logic;
+ signal RAM_Wr_i : std_logic;
+ signal INC_DPTR : std_logic;
+ signal CJNE : std_logic;
+ signal DJNZ : std_logic;
+
+ -- Mux control
+ signal AMux_SFR : std_logic;
+ signal BMux_Inst2 : std_logic;
+ signal RMux_PCL : std_logic;
+ signal RMux_PCH : std_logic;
+
+ signal next_Mem_Wr : std_logic;
+
+ signal rd_flag, xxx_flag : std_logic;
+ signal rd_flag_r : std_ulogic;
+ signal rd_sfr_flag : std_logic;
+ signal Do_ACC_Wr : std_logic;
+
+ signal ramc, ramc_r, ramrw_r : std_logic;
+
+ -- external iram
+ signal Int_AddrA_unique : std_logic_vector(7 downto 0);
+ signal wren_mux_a : std_logic;
+ signal wrdata_r : std_logic_vector(7 downto 0);
+begin
+
+
+ -- DEBUG
+ opcode_o <= Inst;
+
+ -----------------------------------------------------------------------------
+ -- bypass logic for external iram
+ -----------------------------------------------------------------------------
+ Mem_A <= IRAM_DoutA when wren_mux_a = '0' else
+ wrdata_r;
+
+---- -- if a W/R instruction is executed on Port B a stall is inserted
+ Mem_B <= IRAM_DoutB;
+
+
+------ to avoid R/W on same address (others => '1') can not be accessed by write
+------ Port B
+ Int_AddrA_unique <= (others => '1') when (Mem_Wr='1' and (Int_AddrA=Int_AddrA_r)) else
+ Int_AddrA;
+
+ process (Rst_n, Clk)
+ begin
+ if Rst_n = '0' then
+ wren_mux_a <= '0';
+ wrdata_r <= (others => '0');
+ Int_AddrA_r <= (others => '0');
+ elsif Clk'event and Clk = '1' then
+ Int_AddrA_r <= Int_AddrA;
+ wrdata_r <= Mem_Din;
+ wren_mux_a <= '0';
+ if (Mem_Wr = '1' and Int_AddrA = Int_AddrA_r) then
+ wren_mux_a <= '1';
+ end if;
+ end if;
+ end process;
+
+
+ IRAM_AddrB <= Int_AddrA_r when Mem_Wr = '1' else
+ Int_AddrB;
+
+
+
+ IRAM_AddrA <= Int_AddrA_unique;
+-- IRAM_AddrA <= Int_AddrA;
+-------------------------------------------------------------------------------
+-- end bypass logic for external iram
+---------------------------------------------------------------------------------
+
+ iReady <= Ready and not xxx_flag;
+ ram_cycle <= ramc;
+
+ Last <= '1' when ICall = '1' and FCycle = "11" else
+ '0' when ICall = '1' else
+ '1' when MCode(1 downto 0) = FCycle and iReady = '1' else
+ '0';
+
+ -- (ROM_Data, ICall, Inst, Inst1, Inst2, Last, FCycle, PSW, Mem_B, SP, Old_Mem_B, Ready, Int_AddrA_r)
+ process (FCycle, ICall, Inst, Inst1, Inst2, Int_AddrA_r, Last, Mem_B, Old_Mem_B, PSW,
+ ROM_Data, Ready, SP)
+ begin
+ Int_AddrA <= "--------";
+-- Int_AddrB <= "--------";
+ Int_AddrB <= "000" & PSW(4 downto 3) & "00" & Inst(0);
+ rd_flag <= '0';
+ rd_sfr_flag <= '0';
+
+ if Inst(3 downto 0) = "0000" or Inst(3 downto 0) = "0010" then
+ if Inst(3 downto 0) = "0000" or (Inst(3 downto 0) = "0010" and (Inst(7) = '1' or Inst(6 downto 4) = "111")) then
+ if Inst1(7) = '0' then
+ Int_AddrA <= "0010" & Inst1(6 downto 3);
+ else
+ Int_AddrA <= "1" & Inst1(6 downto 3) & "000";
+ end if;
+ else
+ Int_AddrA <= Inst1;
+ end if;
+ if Inst = "00010010" or ICall = '1' then
+ -- LCALL
+ if FCycle = "01" then
+ Int_AddrA <= std_logic_vector(SP + 1);
+ else
+ Int_AddrA <= std_logic_vector(SP + 2);
+ end if;
+ end if;
+ if Inst = "11000000" then
+ -- 11000000 2 PUSH data addr INC SP: MOV "@SP",<src>
+ if FCycle = "10" then
+ Int_AddrA <= std_logic_vector(SP);
+ else
+ Int_AddrA <= Inst1;
+ end if;
+ end if;
+ if Inst = "11010000" then
+ -- 11010000 2 POP data addr MOV <dest>,"@SP": DEC SP
+ if FCycle = "10" then
+ Int_AddrA <= Inst1;
+ else
+ Int_AddrA <= std_logic_vector(SP);
+ end if;
+ end if;
+ if Inst(7 downto 5) = "001" and Inst(3 downto 0) = "0010" then
+ -- RET, RETI
+ Int_AddrA <= std_logic_vector(SP);
+ Int_AddrB <= std_logic_vector(SP - 1);
+ end if;
+ elsif Inst(4 downto 0) = "10001" then
+ -- ACALL
+ if FCycle = "01" then
+ Int_AddrA <= std_logic_vector(SP + 1);
+ else
+ Int_AddrA <= std_logic_vector(SP + 2);
+ end if;
+ elsif Inst(3 downto 0) = "0011" then
+ Int_AddrA <= Inst1; --inst1;
+ elsif Inst(3 downto 0) = "0100" then
+ elsif Inst(3 downto 0) = "0101" then
+ if Inst(7 downto 4) = "1000" and FCycle = "11" then
+ Int_AddrA <= Inst2;
+ else
+ Int_AddrA <= Inst1;
+ end if;
+ elsif Inst(3 downto 1) = "011" then -- @Ri Adressing mode
+ if FCycle(1 downto 0) = "01" then
+ Int_AddrA <= Mem_B;
+ else
+ Int_AddrA <= Old_Mem_B;
+ end if;
+ if Inst(7 downto 4) = "1000" and FCycle = "10" then
+ Int_AddrA <= Inst1; -- mov direct,@Ri
+ end if;
+ if Inst(7 downto 4) = "1010" and FCycle = "01" then
+ Int_AddrA <= ROM_Data; -- mov @Ri,direct
+ rd_flag <= '1';
+ end if;
+ elsif Inst(3) = '1' then
+ Int_AddrA <= "000" & PSW(4 downto 3) & Inst(2 downto 0);
+ if Inst(7 downto 4) = "1000" and FCycle = "10" then
+ Int_AddrA <= Inst1;
+ end if;
+ if Inst(7 downto 4) = "1010" and FCycle = "01" then
+ Int_AddrA <= ROM_Data; -- mov Ri,data
+ rd_flag <= '1';
+ end if;
+ end if;
+
+-- if Last = '1' then
+ -- Modified by AVG
+ if (Inst(7 downto 5) /= "001" or Inst(3 downto 0) /= "0010") and -- not a RET, RETI
+ (ROM_Data(3 downto 1) = "011" or -- Next or current Instruction has @Ri Addressing Mode
+ Inst(3 downto 1) = "011" or
+ ROM_Data(7 downto 1) = "1110001" or ROM_Data(7 downto 1)="1111001") then -- MOVX @Ri,A ; MOVX A,@Ri
+ if Last = '1' then
+ Int_AddrB <= "000" & PSW(4 downto 3) & "00" & ROM_Data(0);
+ -- write to psw is in progress => forward argument
+ -- decreases timing !!!
+-- if fast_cpu_c /= 0 and SFR_Wr_i = '1' and Int_AddrA_r = "11010000" then
+-- Int_AddrB <= "000" & Res_Bus(4 downto 3) & "00" & ROM_Data(0);
+-- end if;
+ end if;
+ rd_sfr_flag <= '1';
+
+ end if;
+-- end if;
+-- if Inst(7 downto 1) = "1011011" then -- cjne @ri,#im
+-- Int_AddrB <= "000" & PSW(4 downto 3) & "00" & Inst(0);
+-- end if;
+
+ if Ready = '0' then
+ Int_AddrA <= Int_AddrA_r;
+ end if;
+ end process;
+
+ Op_A <= SFR_RData_r when AMux_SFR = '1' else
+ Mem_A;
+
+ Op_B <= Inst2 when BMux_Inst2 = '1' else
+ Inst1;
+
+ -- Store return Address to mem (Stack) when a call (or interrupt) occured
+ Mem_Din <= PCC(7 downto 0) when RMux_PCL = '1' else
+ PCC(15 downto 8) when RMux_PCH = '1' else
+ Res_Bus;
+
+
+ process (Clk)
+ begin
+ if Clk'event and Clk = '1' then
+ AMux_SFR <= '0';
+ BMux_Inst2 <= '0';
+ RMux_PCL <= '0';
+ RMux_PCH <= '0';
+
+ if Int_AddrA(7) = '1' then
+ AMux_SFR <= '1';
+ end if;
+ if Inst(3 downto 1) = "011" then -- relative addressing mode
+ -- not "mov @ri,direct"
+ if not (Inst(7 downto 4) = "1010") then -- and FCycle = "10") then
+ -- Indirect addressing
+ AMux_SFR <= '0';
+ end if;
+ end if;
+ if Inst = "11010000" then
+ -- 11010000 2 POP data addr MOV <dest>,"@SP": DEC SP
+-- if FCycle = "10" then
+ AMux_SFR <= '0';
+-- end if;
+ end if;
+
+ if Inst(3 downto 0) = "0011" or Inst(3 downto 0) = "0101" then
+ BMux_Inst2 <= '1';
+ end if;
+
+ -- LCALL, ACALL, Int
+ if (Inst = "00010010" or Inst(4 downto 0) = "10001" or ICall = '1') then
+ if FCycle = "01" then
+ RMux_PCL <= '1';
+ elsif FCycle = "10" then
+ RMux_PCH <= '1';
+ end if;
+ end if;
+ end if;
+ end process;
+
+ SFR_Wr <= SFR_Wr_i;
+ SFR_Addr <= Int_AddrA(6 downto 0);
+ SFR_WData <= Res_Bus;
+
+ SFR_Rd_RMW <= '1' when Last = '1' and MCode(3) = '1' and Int_AddrA(7) = '1' and
+ (Inst(7 downto 4) = "1000" or Inst(3 downto 1) /= "011") and
+ Inst /= "11000000" else -- no push
+ '0';
+
+ next_Mem_Wr <= '1' when Last = '1' and MCode(3) = '1' and
+ (Int_AddrA(7) = '0' or
+ -- Instruction is no MOV and indirect addressing mode
+ (Inst(7 downto 4) /= "1000" and Inst(3 downto 1) = "011") or
+ Inst = "11000000" ) else -- PUSH Instruction
+ '0';
+
+
+ process (Clk)
+ begin
+ if Clk'event and Clk = '1' then
+ SFR_Wr_i <= '0';
+ Mem_Wr <= '0';
+ if Last = '1' and MCode(3) = '1' then
+ -- MOV or no indirect addressing
+ if Int_AddrA(7) = '1' and (Inst(7 downto 4) = "1000" or Inst(3 downto 1) /= "011") and
+ Inst /= "11000000" then
+ -- Direct addressing
+ if(Inst = "00010000") then -- JBC, write result only back if jump is taken
+ SFR_Wr_i <= J_Skip;
+ else
+ -- Direct addressing
+ SFR_Wr_i <= '1';
+ end if;
+ else
+ Mem_Wr <= '1';
+ end if;
+ end if;
+
+ -- LCALL, ACALL, Int
+ if iReady = '1' and (Inst = "00010010" or Inst(4 downto 0) = "10001" or ICall = '1') then
+ if FCycle /= "11" then -- LCALL
+ Mem_Wr <= '1';
+ end if;
+ end if;
+ end if;
+ end process;
+
+ -- Instruction register
+ Inst_Skip <= RET_r or J_Skip; -- '1' when (RET_r = '1' and unsigned(Mem_B) /= PC(15 downto 8)) else J_Skip; ????????????
+-- Ri_Stall <= '1' when Inst /= "00000000" and
+-- Int_AddrA = "000" & PSW(4 downto 3) & Inst(2 downto 0) and --Write to Ri in Progress
+-- ROM_Data(3 downto 1) = "011" and --@Ri at next opcode
+-- Last = '1' and MCode(3) = '1' else '0';
+
+-- WHEN MCODE(3)==1 => Write to Memory or FSR is in Progress
+
+ -- Modified by AVG
+ Ri_Stall <= '1' when Inst /= "00000000" and
+ next_Mem_Wr = '1' and
+ (Int_AddrA = "000" & PSW(4 downto 3) & "00"&ROM_Data(0) and
+ (ROM_Data(3 downto 1) = "011" or -- @Ri at next opcode
+ ROM_Data(7 downto 1) = "1110001" or -- movx a,@ri at next opcode
+ ROM_Data(7 downto 1) = "1111001")) -- movx @ri,a at next opcod
+ else '0';
+
+
+
+-- WHEN MCODE(3)==1 => Write to Memory or FSR is in Progress
+ -- Modified by AVG
+ PSW_Stall <= '1' when Int_AddrA = "11010000" and
+ next_Mem_Wr = '0' and -- PSW Adressed and no memory write
+ (ROM_Data(3 downto 1) = "011" or -- @Ri at next opcode
+ ROM_Data(3) = '1') and -- Rx at next opcode
+ Last = '1' and
+ MCode(3) = '1' else
+ '0';
+
+-- WHEN MCODE(2)==1 => Write to ACC in Progress
+-- Stall Pipe when Write to ACC is in Progress and next Instruction is JMP @A+DPTR
+-- Modified by AVG
+ ACC_Stall <= '1' when ROM_Data = "01110011" and
+ Last = '1' and MCode(2) = '1' else
+ '0';
+
+ -- when a write to SP is in progress
+ -- and next opcode is a call or interrupt
+ -- -> stall pipe (nop insertion)
+ -- Modified by AVG
+ SP_Stall <= '1' when Last = '1' and MCode(3) = '1' and
+ Int_AddrA = "10000001" and
+ (Inst(7 downto 4) = "1000" or -- mov opcode
+ Inst(3 downto 1) /= "011") and -- and no indirect addressing
+ Inst /= "11000000" and -- and not PUSH
+ (ROM_Data = "00010010" or
+ ROM_Data(4 downto 0) = "10001" or
+ IStart = '1') else -- LCALL, ACALL, Int
+ '0';
+
+ -- to subsequent movx instructions
+ movx_Stall <= '1' when Last = '1' and
+ -- movx opcode at current instruction
+ Inst(7 downto 5) = "111" and Inst(3 downto 2) = "00" and
+ Inst(1 downto 0) /= "01" and
+ -- movx opcode at next instruction
+ ROM_Data(7 downto 5) = "111" and ROM_Data(3 downto 2) = "00" and
+ ROM_Data(1 downto 0) /= "01" else
+ '0';
+
+ -- Modified by Markus Lang
+ -- for the DPRAM a Stall is needed if a read and a write instruction should
+ -- be processed at the same cycle on AddrB
+ DPRAM_Stall <= '1' when Last = '1' and
+ -- Ret(i), MOV dir, @Rx
+ ((next_Mem_Wr = '1' and (ROM_Data = "00110010" or ROM_Data = "00100010" or ROM_Data(7 downto 1) = "1010011")) or
+ (Mem_Wr = '1' and
+ -- @Ri
+ (ROM_Data(3 downto 1) = "011" or
+ -- movx a,@ri at next opcode
+ ROM_Data(7 downto 1) = "1110001" or
+ -- movx @ri,a at next opcode
+ ROM_Data(7 downto 1) = "1111001"))) else
+ '0';
+
+
+
+ Stall_pipe <= (Ri_Stall or PSW_Stall or ACC_Stall or SP_Stall or movx_Stall or DPRAM_Stall) and not IStart;
+
+ process (Rst_n, Clk)
+ variable bitnr_v : natural range 0 to 7;
+ begin
+ if Rst_n = '0' then
+ Rst_r_n <= '0';
+ Inst <= (others => '0'); -- Force NOP at reset.
+ Inst1 <= (others => '0');
+ Inst2 <= (others => '0');
+ Bit_Pattern <= "00000000";
+ elsif Clk'event and Clk = '1' then
+ Rst_r_n <= '1';
+ if iReady = '0' then
+ elsif Rst_r_n = '0' or
+ Inst_Skip = '1' or IStart = '1' or
+ Stall_pipe = '1' then
+-- Ri_Stall = '1' or PSW_Stall = '1' or ACC_Stall = '1' then
+ -- Skip/Stall/Flush: NOP insertion
+ Inst <= (others => '0');
+ elsif Inst = "10000100" and PCPause = '1' then -- DIV
+ else
+ if Last = '1' then
+ Inst <= ROM_Data;
+ end if;
+ if FCycle = "01" then
+ Inst1 <= ROM_Data;
+ end if;
+ if FCycle = "10" then
+ Inst2 <= ROM_Data;
+ end if;
+ end if;
+ if FCycle = "01" then
+ Bit_Pattern <= "00000000";
+ bitnr_v := to_integer(unsigned(ROM_Data(2 downto 0)));
+ Bit_Pattern(bitnr_v) <= '1';
+
+-- case ROM_Data(2 downto 0) is
+-- when "000" =>
+-- Bit_Pattern <= "00000001";
+-- when "001" =>
+-- Bit_Pattern <= "00000010";
+-- when "010" =>
+-- Bit_Pattern <= "00000100";
+-- when "011" =>
+-- Bit_Pattern <= "00001000";
+-- when "100" =>
+-- Bit_Pattern <= "00010000";
+-- when "101" =>
+-- Bit_Pattern <= "00100000";
+-- when "110" =>
+-- Bit_Pattern <= "01000000";
+-- when others =>
+-- Bit_Pattern <= "10000000";
+-- end case;
+ end if;
+ end if;
+ end process;
+
+ -- Accumulator, B and status register
+ tristate_mux : if tristate /= 0 generate
+ SFR_RData <= PSW & PSW0 when Int_AddrA = "11010000" else "ZZZZZZZZ";
+ SFR_RData <= ACC when Int_AddrA = "11100000" else "ZZZZZZZZ";
+ SFR_RData <= B when Int_AddrA = "11110000" else "ZZZZZZZZ";
+ -- Stack pointer
+ SFR_RData <= std_logic_vector(SP) when Int_AddrA = "10000001" else "ZZZZZZZZ";
+
+ SFR_RData <= dptr_inc(7 downto 0) when (SecondDPTR /= 0 and (INC_DPTR and next_DPS) = '1' and Int_AddrA = "10000100") or
+ ((INC_DPTR and not next_DPS) = '1' and Int_AddrA = "10000010") else "ZZZZZZZZ";
+ SFR_RData <= dptr_inc(15 downto 8) when (SecondDPTR /= 0 and (INC_DPTR and next_DPS) = '1' and Int_AddrA = "10000101") or
+ ((INC_DPTR and not next_DPS) = '1' and Int_AddrA = "10000011") else "ZZZZZZZZ";
+
+ SFR_RData <= DPL1 when SecondDPTR /= 0 and INC_DPTR = '0' and Int_AddrA = "10000100" else "ZZZZZZZZ";
+ SFR_RData <= DPH1 when SecondDPTR /= 0 and INC_DPTR = '0' and Int_AddrA = "10000101" else "ZZZZZZZZ";
+ SFR_RData <= "0000000"&DPS when SecondDPTR/=0 and Int_AddrA = "10000110" else "ZZZZZZZZ";
+
+ SFR_RData <= DPL0 when INC_DPTR = '0' and Int_AddrA = "10000010" else "ZZZZZZZZ";
+ SFR_RData <= DPH0 when INC_DPTR = '0' and Int_AddrA = "10000011" else "ZZZZZZZZ";
+ SFR_RData <= IP when Int_AddrA = "10111000" else "ZZZZZZZZ";
+ SFR_RData <= SFR_RData_in;
+ end generate;
+
+ std_mux : if tristate = 0 generate
+ SFR_RData <= PSW & PSW0 when Int_AddrA = "11010000" else
+ ACC when Int_AddrA = "11100000" else
+ B when Int_AddrA = "11110000" else
+ std_logic_vector(SP) when Int_AddrA = "10000001" else
+
+ dptr_inc(7 downto 0) when (SecondDPTR /= 0 and (INC_DPTR and next_DPS) = '1' and Int_AddrA = "10000100") or
+ ((INC_DPTR and not next_DPS) = '1' and Int_AddrA = "10000010") else
+ dptr_inc(15 downto 8) when (SecondDPTR /= 0 and (INC_DPTR and next_DPS) = '1' and Int_AddrA = "10000101") or
+ ((INC_DPTR and not next_DPS) = '1' and Int_AddrA = "10000011") else
+ DPL1 when SecondDPTR /= 0 and INC_DPTR = '0' and Int_AddrA = "10000100" else
+ DPH1 when SecondDPTR /= 0 and INC_DPTR = '0' and Int_AddrA = "10000101" else
+ "0000000"&DPS when SecondDPTR/=0 and Int_AddrA = "10000110" else
+
+ DPL0 when INC_DPTR = '0' and Int_AddrA = "10000010" else
+ DPH0 when INC_DPTR = '0' and Int_AddrA = "10000011" else
+ IP when Int_AddrA = "10111000" else
+ SFR_RData_in;
+
+ -- -- is it an internal or external read
+ -- Int_Read <= '1' when Int_AddrA = "11010000" or
+ -- Int_AddrA = "11100000" or
+ -- Int_AddrA = "11110000" or
+ -- Int_AddrA = "10000001" or
+ --
+ -- (SecondDPTR and Int_AddrA = "10000100") or
+ -- (SecondDPTR and Int_AddrA = "10000101") or
+ -- (SecondDPTR and Int_AddrA = "10000110") or
+ --
+ -- Int_AddrA = "10000010" or
+ -- Int_AddrA = "10000011" or
+ -- Int_AddrA = "10111000" else
+ -- '0';
+
+ end generate;
+
+ PSW0 <= ACC(7) xor ACC(6) xor ACC(5) xor ACC(4) xor ACC(3) xor ACC(2) xor ACC(1) xor ACC(0);
+ Next_PSW7 <= Res_Bus(7) when SFR_Wr_i = '1' and Int_AddrA_r = "11010000" else
+ Status_D(7) when Status_Wr(7) = '1' else
+ PSW(7);
+ Next_ACC_Z <= '1' when ACC_Q = "00000000" and ACC_Wr = '1' else
+ '1' when ACC = "00000000" else '0';
+
+ process (Rst_n, Clk)
+-- variable B_Wr : std_logic;
+ begin
+ if Rst_n = '0' then
+ PSW <= "0000000";
+ ACC <= "00000000";
+ B <= "00000000";
+ ACC_Wr <= '0';
+ B_Wr <= '0';
+ elsif Clk'event and Clk = '1' then
+ if ACC_Wr = '1' then
+ ACC <= ACC_Q;
+ end if;
+ if B_Wr = '1' then
+ B <= B_Q;
+ end if;
+ if (MCode(2) and Last) = '1' or (Inst = "10000100" and PCPause = '0') then
+ ACC_Wr <= '1';
+ else
+ ACC_Wr <= '0';
+ end if;
+ if ((Inst = "10000100" and PCPause = '0') or Inst = "10100100") and Last = '1' then -- DIV, MUL
+ B_Wr <= '1';
+ else
+ B_Wr <= '0';
+ end if;
+
+ if SFR_Wr_i = '1' and Int_AddrA_r = "11100000" then
+ ACC <= Res_Bus;
+ end if;
+
+ if RAM_Rd_i = '1' then
+ ACC <= RAM_RData;
+ end if;
+
+ if SFR_Wr_i = '1' and Int_AddrA_r = "11110000" then
+ B <= Res_Bus;
+ end if;
+
+ if Inst(7 downto 5) = "100" and Inst(3 downto 0) = "0011" then -- MOVC
+ if FCycle = "11" then
+ ACC <= ROM_Data;
+ end if;
+ end if;
+
+ if SFR_Wr_i = '1' and Int_AddrA_r = "11010000" then
+ PSW <= Res_Bus(7 downto 1);
+ end if;
+ -- CY
+ if Status_Wr(7) = '1' then PSW(7) <= Status_D(7); end if;
+ -- AC
+ if Status_Wr(6) = '1' then PSW(6) <= Status_D(6); end if;
+ -- OV
+ if Status_Wr(5) = '1' then PSW(2) <= Status_D(5); end if;
+ end if;
+ end process;
+
+
+ process (Rst_n, Clk)
+ begin
+ if Rst_n = '0' then
+ SP <= "00000111";
+ elsif Clk'event and Clk = '1' then
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10000001" then
+ SP <= unsigned(Res_Bus);
+ end if;
+ if iReady = '1' then
+ if Inst(7 downto 5) = "001" and Inst(3 downto 0) = "0010" then
+ SP <= SP - 2;
+ end if;
+ if (Inst = "00010010" or Inst(4 downto 0) = "10001" or ICall = '1') and Last = '1' then
+ -- LCALL, ACALL, ICall
+ SP <= SP + 2;
+ end if;
+ if Inst = "11000000" and PCPaused(0) = '1' then
+ -- 11000000 2 PUSH data addr INC SP: MOV "@SP",<src>
+ SP <= SP + 1;
+ end if;
+ if Inst = "11010000" and Last = '1' then
+ -- 11010000 2 POP data addr MOV <dest>,"@SP": DEC SP
+ SP <= SP - 1;
+ end if;
+ end if;
+ end if;
+ end process;
+
+ twoDPTR : if SecondDPTR /= 0 generate
+ next_DPS <= Res_Bus(0) when SFR_Wr_i = '1' and Int_AddrA_r = "10000110" else
+ DPS;
+
+ DPL <= DPL0 when next_DPS = '0' else
+ DPL1;
+ DPH <= DPH0 when next_DPS = '0' else
+ DPH1;
+-- SFR_RData <= DPL1 when Int_AddrA = "10000100" else "ZZZZZZZZ";
+-- SFR_RData <= DPH1 when Int_AddrA = "10000101" else "ZZZZZZZZ";
+-- SFR_RData <= "0000000"&DPS when Int_AddrA = "10000110" else "ZZZZZZZZ";
+ end generate;
+ oneDPTR : if SecondDPTR = 0 generate
+ DPL <= DPL0;
+ DPH <= DPH0;
+ next_DPS <= '0';
+ end generate;
+
+ -- DPTR/RAM_Addr
+ RAM_WData <= ACC;
+ --(Inst, P2R, DPH, DPL, Int_AddrA_r, SFR_Wr_i, Res_Bus, INC_DPTR, Mem_B)
+ process (DPH, DPL, INC_DPTR, dptr_inc, Inst, Int_AddrA_r, Mem_B, P2R, Res_Bus, SFR_Wr_i, DPS)
+ begin
+ RAM_Addr <= DPH & DPL;
+ if Inst(1) = '0' then
+ if (SFR_Wr_i = '1' and Int_AddrA_r = "10000010" and DPS = '0') or
+ (SecondDPTR /= 0 and SFR_Wr_i = '1' and Int_AddrA_r = "10000100" and DPS = '1')
+ then
+ RAM_Addr(7 downto 0) <= Res_Bus;
+ end if;
+ if (SFR_Wr_i = '1' and Int_AddrA_r = "10000011" and DPS = '0') or
+ (SecondDPTR /= 0 and SFR_Wr_i = '1' and Int_AddrA_r = "10000101" and DPS = '1')
+ then
+ RAM_Addr(15 downto 8) <= Res_Bus;
+ end if;
+ -- 10100011 1 INC DPTR
+ if INC_DPTR = '1' then
+-- RAM_Addr <= std_logic_vector(unsigned(DPH) & unsigned(DPL) + 1);
+ RAM_Addr <= dptr_inc;
+ end if;
+ else -- movx a,@ri or movx @ri,a
+ RAM_Addr <= P2R & Mem_B;
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10100000" then
+ RAM_Addr(15 downto 8) <= Res_Bus;
+ end if;
+ end if;
+ end process;
+
+ --if Inst(7 downto 2) = "111000" and Inst(1 downto 0) /= "01" then
+ -- MOVX Instruction
+ ramc <= '1' when Inst(7 downto 5) = "111" and Inst(3 downto 2) = "00" and
+ Inst(1 downto 0) /= "01" and
+ PCPaused(0) = '0' else
+ '0';
+
+-- RAM_Rd <= RAM_Rd_i and ramc and not ramrw_r when DualBus=0 else
+-- RAM_Rd_i and ramc;
+ RAM_Rd <= RAM_Rd_i and ramc;
+
+ RAM_Wr <= RAM_Wr_i;
+
+ Do_ACC_Wr <= '1' when (ACC_Wr or RAM_Rd_i) = '1' or
+ (SFR_Wr_i = '1' and Int_AddrA_r = "11100000") else
+ '0';
+
+-- Gefählich sind:
+-- mov @Ri,direct
+-- mov Ri,data
+-- da diese Befehle die Quelldaten einen Takt früher lesen als alle anderen Befehle
+-- xxx_flag <= '1' when ((SFR_Wr_i and rd_flag)= '1' and Int_AddrA_r=Int_AddrA) or
+-- ((Do_ACC_Wr and rd_flag)='1' and Int_AddrA = "11010000") or
+-- (Status_Wr/="000" and rd_flag='1' and Int_AddrA="11010000") or
+-- (fast_cpu_c=0 and (rd_sfr_flag and SFR_Wr_i) = '1' and Int_AddrA_r = "11010000") else
+-- '0';
+ fast : if fast_cpu_c /= 0 generate
+ xxx_flag <= '1' when ((SFR_Wr_i and rd_flag) = '1' and Int_AddrA_r = Int_AddrA) or
+ ((Do_ACC_Wr and rd_flag) = '1' and Int_AddrA = "11010000") or -- WR to ACC in Progress and read from PSW
+ ((B_Wr and rd_flag) = '1' and Int_AddrA = "11110000") or
+ (Status_Wr /= "000" and rd_flag='1' and Int_AddrA="11010000") or
+-- (ramc='1' and ramc_r='0')
+ (Inst(7 downto 2) = "111000" and Inst(1 downto 0) /= "01" and ramc_r='0') --MOVX A,??
+-- (((RAM_Rd_i and ramc)='1' or RAM_Wr_i='1') and ramrw_r='0' and DualBus=0)
+ else
+ '0';
+ end generate;
+ slow : if fast_cpu_c = 0 generate
+ -- Inserts an Waitstate on every mov @Ri,direct or mov Ri,data Instruction
+ xxx_flag <= '1' when (rd_flag and not rd_flag_r) = '1' or -- mov @ri,direct or mov ri,direct
+ ((rd_sfr_flag and SFR_Wr_i) = '1' and Int_AddrA_r = "11010000") or -- Wr to PSW and @Ri Adressing at next instruction
+-- (ramc='1' and ramc_r='0')
+ (Inst(7 downto 2) = "111000" and Inst(1 downto 0) /= "01" and ramc_r='0') or --MOVX A,??
+-- (((RAM_Rd_i and ramc)='1' or RAM_Wr_i='1') and ramrw_r='0' and DualBus=0)
+ ((RAM_Wr_i = '1') and ramrw_r = '0' and DualBus = 0)
+ else
+ '0';
+
+ process(Rst_n, Clk)
+ begin
+ if Rst_n = '0' then
+ rd_flag_r <= '0';
+ elsif Clk'event and Clk = '1' then
+ rd_flag_r <= rd_flag;
+ end if;
+ end process;
+
+ end generate;
+
+ process (Rst_n, Clk)
+ variable tmp : unsigned(15 downto 0);
+ begin
+ if Rst_n = '0' then
+ P2R <= "11111111";
+ DPL0 <= "00000000";
+ DPH0 <= "00000000";
+ INC_DPTR <= '0';
+ RAM_Rd_i <= '0';
+ RAM_Wr_i <= '0';
+ if SecondDPTR /= 0 then
+ DPL1 <= "00000000";
+ DPH1 <= "00000000";
+ DPS_r <= '0';
+ end if;
+ ramc_r <= '0';
+ ramrw_r <= '0';
+ elsif Clk'event and Clk = '1' then
+ if Ready = '1' then
+ ramc_r <= ramc;
+ ramrw_r <= (RAM_Rd_i and ramc) or RAM_Wr_i;
+ end if;
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10100000" then
+ P2R <= Res_Bus;
+ end if;
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10000010" then
+ DPL0 <= Res_Bus;
+ end if;
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10000011" then
+ DPH0 <= Res_Bus;
+ end if;
+ if SecondDPTR /= 0 then
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10000100" then
+ DPL1 <= Res_Bus;
+ end if;
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10000101" then
+ DPH1 <= Res_Bus;
+ end if;
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10000110" then
+ DPS_r <= Res_Bus(0);
+ end if;
+ end if;
+ if iReady = '1' then
+ if SecondDPTR = 0 or
+ (SecondDPTR /= 0 and DPS = '0') then
+ -- 10010000 3 MOV DPTR,#data
+ if Inst = "10010000" and FCycle = "10" then
+ DPH0 <= Inst1;
+ end if;
+ if Inst = "10010000" and FCycle = "11" then
+ DPL0 <= Inst2;
+ end if;
+ -- 10100011 1 INC DPTR
+ if INC_DPTR = '1' then
+-- tmp := unsigned(DPH) & unsigned(DPL) + 1;
+-- DPH0 <= std_logic_vector(tmp(15 downto 8));
+-- DPL0 <= std_logic_vector(tmp(7 downto 0));
+ DPH0 <= dptr_inc(15 downto 8);
+ DPL0 <= dptr_inc(7 downto 0);
+ end if;
+ elsif SecondDPTR /= 0 and DPS = '1' then
+ -- 10010000 3 MOV DPTR,#data
+ if Inst = "10010000" and FCycle = "10" then
+ DPH1 <= Inst1;
+ end if;
+ if Inst = "10010000" and FCycle = "11" then
+ DPL1 <= Inst2;
+ end if;
+ -- 10100011 1 INC DPTR
+ if INC_DPTR = '1' then
+-- tmp := unsigned(DPH) & unsigned(DPL) + 1;
+-- DPH1 <= std_logic_vector(tmp(15 downto 8));
+-- DPL1 <= std_logic_vector(tmp(7 downto 0));
+ DPH1 <= dptr_inc(15 downto 8);
+ DPL1 <= dptr_inc(7 downto 0);
+ end if;
+ end if;
+ INC_DPTR <= '0';
+ if Inst = "10100011" then
+ INC_DPTR <= '1';
+ end if;
+ end if;
+ if Ready = '1' then
+ RAM_Wr_i <= '0';
+ -- movx instruction
+ if (Inst(7 downto 2) = "111100" and Inst(1 downto 0) /= "01") then -- and DualBus/=0) or
+ -- (Inst(7 downto 2) = "111100" and Inst(1 downto 0) /= "01" and iReady = '0' and DualBus=0) then
+ RAM_Wr_i <= '1';
+ end if;
+ RAM_Rd_i <= '0';
+ -- if Inst(7 downto 2) = "111000" and Inst(1 downto 0) /= "01" and iReady = '1' then
+ if Inst(7 downto 2) = "111000" and Inst(1 downto 0) /= "01" then
+ RAM_Rd_i <= '1';
+ end if;
+ end if;
+ end if;
+ end process;
+
+ dptr_inc <= std_logic_vector(unsigned(DPH) & unsigned(DPL) + 1);
+
+-- process(DPS_r)
+-- begin
+-- if SecondDPTR /= 0 then
+-- DPS <= DPS_r;
+-- else
+-- DPS <= '0';
+-- end if;
+-- end process;
+
+ DPS <= DPS_r when SecondDPTR /= 0 else
+ '0';
+
+
+ -- Interrupts
+ IStart <= Last and IPending and not Inst_Skip;
+
+ process (Rst_n, Clk)
+ begin
+ if Rst_n = '0' then
+ LPInt <= '0';
+ HPInt <= '0';
+ Int_Acc <= (others => '0');
+ Int_Trig_r <= (others => '0');
+ IPending <= '0';
+ IP <= "00000000";
+ ICall <= '0';
+ elsif Clk'event and Clk = '1' then
+ if SFR_Wr_i = '1' and Int_AddrA_r = "10111000" then
+ IP <= Res_Bus;
+ end if;
+ if iReady = '1' then
+ if (Int_Trig and IP(6 downto 0)) /= "0000000" and HPInt = '0' and IPending = '0' and ICall = '0' then
+ Int_Trig_r <= Int_Trig and IP(6 downto 0);
+ IPending <= '1';
+ HPInt <= '1';
+ elsif Int_Trig /= "0000000" and LPInt = '0' and HPInt = '0' and IPending = '0' and ICall = '0' then
+ IPending <= '1';
+ Int_Trig_r <= Int_Trig;
+ LPInt <= '1';
+ end if;
+ if ICall = '1' then
+ IPending <= '0';
+ end if;
+ if IStart = '1' and SP_Stall = '0' then
+ ICall <= '1';
+ end if;
+ if ICall = '1' and Last = '1' then
+ ICall <= '0';
+ Int_Trig_r <= (others => '0');
+ end if;
+ Int_Acc <= (others => '0');
+ if IPending = '1' and ICall = '1' then
+ if Int_Trig_r(0) = '1' then Int_Acc(0) <= '1';
+ elsif Int_Trig_r(1) = '1' then Int_Acc(1) <= '1';
+ elsif Int_Trig_r(2) = '1' then Int_Acc(2) <= '1';
+ elsif Int_Trig_r(3) = '1' then Int_Acc(3) <= '1';
+ elsif Int_Trig_r(4) = '1' then Int_Acc(4) <= '1';
+ elsif Int_Trig_r(5) = '1' then Int_Acc(5) <= '1';
+ elsif Int_Trig_r(6) = '1' then Int_Acc(6) <= '1';
+ end if;
+ end if;
+ if Inst = "00110010" then -- reti
+ if HPInt = '0' then
+ LPInt <= '0';
+ else
+ HPInt <= '0';
+ end if;
+ end if;
+ end if;
+ end if;
+ end process;
+
+ -- Program counter
+ ROM_Addr <= std_logic_vector(NPC);
+ process (Rst_n, Clk)
+ begin
+ if Rst_n = '0' then
+ PC <= (others => '0');
+ OPC <= (others => '0');
+ FCycle <= "01";
+ RET_r <= '0';
+ PCPaused <= (others => '0');
+ elsif Clk'event and Clk = '1' then
+ if iReady = '1' then
+ PC <= NPC;
+ RET_r <= RET;
+
+ if PCPause = '1' then
+ PCPaused <= std_logic_vector(unsigned(PCPaused) + 1);
+ else
+ PCPaused <= (others => '0');
+ end if;
+
+ if PCPause = '0' then
+ FCycle <= std_logic_vector(unsigned(FCycle) + 1);
+ if Last = '1' then
+ FCycle <= "01";
+ end if;
+ end if;
+
+ if Inst(7 downto 5) = "100" and Inst(3 downto 0) = "0011" then -- MOVC
+ if FCycle = "01" then
+ OPC <= PC;
+ end if;
+ end if;
+ end if;
+ end if;
+ end process;
+
+
+ process (ACC, Bit_Pattern, CJNE, DJNZ, DPH, DPL, Div_Rdy, FCycle, ICall,
+ Inst, Inst1, Inst2, Int_Trig_r, Mem_A, Mem_B, Next_ACC_Z, Next_PSW7, OPC,
+ Op_A, PC, PCPaused, RET_r, ROM_Data, iReady, Rst_r_n, Stall_pipe)
+ begin
+ NPC <= PC;
+ J_Skip <= '0';
+ RET <= '0';
+ PCPause <= '0';
+ -- push,pop
+ if (Inst(7 downto 5) = "110" and Inst(3 downto 0) = "0000" and FCycle = "01" and PCPaused(0) = '0') or -- PUSH, POP
+ -- Single bus MOVX
+ (Inst(7 downto 2) = "111000" and Inst(1 downto 0) /= "01" and DualBus=0 and PCPaused(0) = '0') or
+ (Inst = "10000100" and (PCPaused(3 downto 1) = "000" or Div_Rdy = '0')) then -- DIV
+ PCPause <= '1';
+ else
+-- if Ri_Stall = '0' and PSW_Stall = '0' and ACC_Stall='0' then
+ if Stall_pipe = '0' then
+ NPC <= PC + 1;
+ end if;
+ end if;
+ -- Single bus MOVX
+ if (Inst(7 downto 2) = "111000" and Inst(1 downto 0) /= "01" and DualBus=0) then
+ J_Skip <= '1';
+ end if;
+ -- Return
+ if Inst(7 downto 5) = "001" and Inst(3 downto 0) = "0010" then -- RET, RETI
+ RET <= '1';
+ J_Skip <= '1';
+ end if;
+ -- MOVC
+ if Inst(7 downto 5) = "100" and Inst(3 downto 0) = "0011" and FCycle = "11" then
+ NPC <= OPC;
+ J_Skip <= '1';
+ end if;
+ -- 2 byte 8 bit relative jump
+ if FCycle = "10" then
+ if (Inst = "01000000" and Next_PSW7 = '1') or -- JC
+ (Inst = "01010000" and Next_PSW7 = '0') or -- JNC
+ (Inst = "01100000" and Next_ACC_Z = '1') or -- JZ
+ (Inst = "01110000" and Next_ACC_Z = '0') or -- JNZ
+ (Inst(7 downto 3) = "11011" and DJNZ = '1') or -- DJNZ
+ Inst = "10000000" then -- SJMP
+ NPC <= PC + unsigned(resize(signed(Inst1), 16));
+ J_Skip <= '1';
+ end if;
+ end if;
+
+ -- 3 byte 8 bit relative jump
+ if FCycle = "11" then
+ if (Inst = "00100000" or Inst = "00010000") and (Bit_Pattern and Op_A) /= "00000000" then -- JB, JBC
+ NPC <= PC + unsigned(resize(signed(Inst2), 16));
+ J_Skip <= '1';
+ end if;
+ if Inst = "00110000" and (Bit_Pattern and Op_A) = "00000000" then -- JNB
+ NPC <= PC + unsigned(resize(signed(Inst2), 16));
+ J_Skip <= '1';
+ end if;
+ if Inst(7 downto 4) = "1011" and Inst(3 downto 2) /= "00" and CJNE = '1' then -- CJNE
+ NPC <= PC + unsigned(resize(signed(Inst2), 16));
+ J_Skip <= '1';
+ end if;
+ if Inst = "11010101" and DJNZ = '1' then -- DJNZ
+ NPC <= PC + unsigned(resize(signed(Inst2), 16));
+ J_Skip <= '1';
+ end if;
+ end if;
+ -- 11 bit absolute
+ if FCycle = "10" then
+ if Inst(4 downto 0) = "00001" or Inst(4 downto 0) = "10001" then
+ -- AJMP, ACALL
+ NPC(15 downto 11) <= PC(15 downto 11);
+ NPC(10 downto 8) <= unsigned(Inst(7 downto 5));
+ NPC(7 downto 0) <= unsigned(Inst1);
+ J_Skip <= '1';
+ end if;
+ end if;
+ -- 16 bit absolute
+ if FCycle = "10" then
+ if Inst = "00000010" or Inst = "00010010" then
+ -- LJMP, LCALL
+ NPC(15 downto 8) <= unsigned(Inst1);
+ NPC(7 downto 0) <= unsigned(ROM_Data);
+ end if;
+ if ICall = '1' then
+ NPC <= (1 => '1', 0 => '1', others => '0');
+ if Int_Trig_r(1) = '1' then NPC(5 downto 3) <= "001";
+ elsif Int_Trig_r(2) = '1' then NPC(5 downto 3) <= "010";
+ elsif Int_Trig_r(3) = '1' then NPC(5 downto 3) <= "011";
+ elsif Int_Trig_r(4) = '1' then NPC(5 downto 3) <= "100";
+ elsif Int_Trig_r(5) = '1' then NPC(5 downto 3) <= "101";
+ elsif Int_Trig_r(6) = '1' then NPC(5 downto 3) <= "110";
+ end if;
+ end if;
+ end if;
+ -- A+DPTR Absolute
+ if Inst = "01110011" then
+ -- JMP @A+DPTR
+ NPC <= (unsigned(DPH) & unsigned(DPL)) + unsigned(resize(signed(ACC), 16));
+ J_Skip <= '1';
+ end if;
+
+ if Inst(7 downto 5) = "100" and Inst(3 downto 0) = "0011" then -- MOVC
+ if FCycle = "10" then
+ if Inst(4) = '0' then
+ NPC <= unsigned(ACC) + OPC;
+ else
+ NPC <= unsigned(ACC) + (unsigned(DPH) & unsigned(DPL));
+ end if;
+ end if;
+ end if;
+
+ if RET_r = '1' then -- and unsigned(Mem_A) /= PC(15 downto 8) then ???????????????????????????
+ NPC <= unsigned(Mem_A) & unsigned(Mem_B);
+ end if;
+
+ if iReady = '0' then
+ NPC <= PC;
+ end if;
+ if Rst_r_n = '0' then
+ NPC <= (others => '0');
+ end if;
+ end process;
+
+ -- ALU
+ alu : T51_ALU
+ generic map(
+ tristate => tristate
+ )
+ port map(
+ Clk => Clk,
+ Last => Last,
+ OpCode => Inst,
+ ACC => ACC,
+ B => B,
+ IA => Op_A,
+ IB => Op_B,
+ Bit_Pattern => Bit_Pattern,
+ CY_In => PSW(7),
+ AC_In => PSW(6),
+ ACC_Q => ACC_Q,
+ B_Q => B_Q,
+ IDCPBL_Q => Res_Bus,
+ Div_Rdy => Div_Rdy,
+ CJNE => CJNE,
+ DJNZ => DJNZ,
+ CY_Out => Status_D(7),
+ AC_Out => Status_D(6),
+ OV_Out => Status_D(5),
+ CY_Wr => Status_Wr(7),
+ AC_Wr => Status_Wr(6),
+ OV_Wr => Status_Wr(5));
+
+ process (Clk)
+ begin
+ if Clk'event and Clk = '1' then
+ Old_Mem_B <= Mem_B;
+ if FCycle = "01" then
+ if Inst(1) = '1' then
+ PCC <= std_logic_vector(PC + 2);
+ else
+ PCC <= std_logic_vector(PC + 1);
+ end if;
+ if ICall = '1' then
+ PCC <= std_logic_vector(PC - 1);
+ end if;
+ end if;
+ SFR_RData_r <= SFR_RData;
+ end if;
+ end process;
+
+
+-- iram : T51_RAM
+-- generic map (
+-- RAMAddressWidth => RAMAddressWidth)
+-- port map (
+-- Clk => Clk,
+-- Rst_n => Rst_n,
+-- ARE => Ready,
+-- Wr => Mem_Wr,
+-- DIn => Mem_Din,
+-- Int_AddrA => Int_AddrA,
+-- Int_AddrA_r => Int_AddrA_r,
+-- Int_AddrB => Int_AddrB,
+-- Mem_A => Mem_A,
+-- Mem_B => Mem_B);
+
+
+ IRAM_Wr <= Mem_Wr;
+ -- IRAM_Addr <= Int_AddrA_r;
+ IRAM_WData <= Mem_Din;
+
+ process (Inst)
+ begin
+ case Inst is
+ -- 1 downto 0 instruction length
+ -- 2 write ACC
+ -- 3 write register file
+ when "00000000" => MCode <= "0001"; -- 00000000 1 NOP
+ when "00000001" => MCode <= "0010"; -- aaa00001 2 AJMP code addr
+ when "00000010" => MCode <= "0011"; -- 00000010 3 LJMP code addr
+ when "00000011" => MCode <= "0101"; -- 00000011 1 RR A
+ when "00000100" => MCode <= "0101"; -- 00000100 1 INC A
+ when "00000101" => MCode <= "1010"; -- 00000101 2 INC data addr
+ when "00000110" => MCode <= "1001"; -- 0000011i 1 INC @Ri
+ when "00000111" => MCode <= "1001"; -- 0000011i 1 INC @Ri
+ when "00001000" => MCode <= "1001"; -- 00001rrr 1 INC Rn
+ when "00001001" => MCode <= "1001"; -- 00001rrr 1 INC Rn
+ when "00001010" => MCode <= "1001"; -- 00001rrr 1 INC Rn
+ when "00001011" => MCode <= "1001"; -- 00001rrr 1 INC Rn
+ when "00001100" => MCode <= "1001"; -- 00001rrr 1 INC Rn
+ when "00001101" => MCode <= "1001"; -- 00001rrr 1 INC Rn
+ when "00001110" => MCode <= "1001"; -- 00001rrr 1 INC Rn
+ when "00001111" => MCode <= "1001"; -- 00001rrr 1 INC Rn
+ when "00010000" => MCode <= "1011"; -- 00010000 3 JBC bit addr, code addr
+ when "00010001" => MCode <= "0010"; -- aaa10001 2 ACALL code addr
+ when "00010010" => MCode <= "0011"; -- 00010010 3 LCALL code addr
+ when "00010011" => MCode <= "0101"; -- 00010011 1 RRC A
+ when "00010100" => MCode <= "0101"; -- 00010100 1 DEC A
+ when "00010101" => MCode <= "1010"; -- 00010101 2 DEC data addr
+ when "00010110" => MCode <= "1001"; -- 0001011i 1 DEC @Ri
+ when "00010111" => MCode <= "1001"; -- 0001011i 1 DEC @Ri
+ when "00011000" => MCode <= "1001"; -- 00011rrr 1 DEC Rn
+ when "00011001" => MCode <= "1001"; -- 00011rrr 1 DEC Rn
+ when "00011010" => MCode <= "1001"; -- 00011rrr 1 DEC Rn
+ when "00011011" => MCode <= "1001"; -- 00011rrr 1 DEC Rn
+ when "00011100" => MCode <= "1001"; -- 00011rrr 1 DEC Rn
+ when "00011101" => MCode <= "1001"; -- 00011rrr 1 DEC Rn
+ when "00011110" => MCode <= "1001"; -- 00011rrr 1 DEC Rn
+ when "00011111" => MCode <= "1001"; -- 00011rrr 1 DEC Rn
+ when "00100000" => MCode <= "0011"; -- 00100000 3 JB bit addr, code addr
+ when "00100001" => MCode <= "0010"; -- aaa00001 2 AJMP code addr
+ when "00100010" => MCode <= "0001"; -- 00100010 1 RET
+ when "00100011" => MCode <= "0101"; -- 00100011 1 RL A
+ when "00100100" => MCode <= "0110"; -- 00100100 2 ADD A,#data
+ when "00100101" => MCode <= "0110"; -- 00100101 2 ADD A,data addr
+ when "00100110" => MCode <= "0101"; -- 0010011i 1 ADD A,@Ri
+ when "00100111" => MCode <= "0101"; -- 0010011i 1 ADD A,@Ri
+ when "00101000" => MCode <= "0101"; -- 00101rrr 1 ADD A,Rn
+ when "00101001" => MCode <= "0101"; -- 00101rrr 1 ADD A,Rn
+ when "00101010" => MCode <= "0101"; -- 00101rrr 1 ADD A,Rn
+ when "00101011" => MCode <= "0101"; -- 00101rrr 1 ADD A,Rn
+ when "00101100" => MCode <= "0101"; -- 00101rrr 1 ADD A,Rn
+ when "00101101" => MCode <= "0101"; -- 00101rrr 1 ADD A,Rn
+ when "00101110" => MCode <= "0101"; -- 00101rrr 1 ADD A,Rn
+ when "00101111" => MCode <= "0101"; -- 00101rrr 1 ADD A,Rn
+ when "00110000" => MCode <= "0011"; -- 00110000 3 JNB bit addr, code addr
+ when "00110001" => MCode <= "0010"; -- aaa10001 2 ACALL code addr
+ when "00110010" => MCode <= "0001"; -- 00110010 1 RETI
+ when "00110011" => MCode <= "0101"; -- 00110011 1 RLC A
+ when "00110100" => MCode <= "0110"; -- 00110100 2 ADDC A,#data
+ when "00110101" => MCode <= "0110"; -- 00110101 2 ADDC A,data addr
+ when "00110110" => MCode <= "0101"; -- 0011011i 1 ADDC A,@Ri
+ when "00110111" => MCode <= "0101"; -- 0011011i 1 ADDC A,@Ri
+ when "00111000" => MCode <= "0101"; -- 00111rrr 1 ADDC A,Rn
+ when "00111001" => MCode <= "0101"; -- 00111rrr 1 ADDC A,Rn
+ when "00111010" => MCode <= "0101"; -- 00111rrr 1 ADDC A,Rn
+ when "00111011" => MCode <= "0101"; -- 00111rrr 1 ADDC A,Rn
+ when "00111100" => MCode <= "0101"; -- 00111rrr 1 ADDC A,Rn
+ when "00111101" => MCode <= "0101"; -- 00111rrr 1 ADDC A,Rn
+ when "00111110" => MCode <= "0101"; -- 00111rrr 1 ADDC A,Rn
+ when "00111111" => MCode <= "0101"; -- 00111rrr 1 ADDC A,Rn
+ when "01000000" => MCode <= "0010"; -- 01000000 2 JC code addr
+ when "01000001" => MCode <= "0010"; -- aaa00001 2 AJMP code addr
+ when "01000010" => MCode <= "1010"; -- 01000010 2 ORL data addr,A
+ when "01000011" => MCode <= "1011"; -- 01000011 3 ORL data addr,#data
+ when "01000100" => MCode <= "0110"; -- 01000100 2 ORL A,#data
+ when "01000101" => MCode <= "0110"; -- 01000101 2 ORL A,data addr
+ when "01000110" => MCode <= "0101"; -- 0100011i 1 ORL A,@Ri
+ when "01000111" => MCode <= "0101"; -- 0100011i 1 ORL A,@Ri
+ when "01001000" => MCode <= "0101"; -- 01001rrr 1 ORL A,Rn
+ when "01001001" => MCode <= "0101"; -- 01001rrr 1 ORL A,Rn
+ when "01001010" => MCode <= "0101"; -- 01001rrr 1 ORL A,Rn
+ when "01001011" => MCode <= "0101"; -- 01001rrr 1 ORL A,Rn
+ when "01001100" => MCode <= "0101"; -- 01001rrr 1 ORL A,Rn
+ when "01001101" => MCode <= "0101"; -- 01001rrr 1 ORL A,Rn
+ when "01001110" => MCode <= "0101"; -- 01001rrr 1 ORL A,Rn
+ when "01001111" => MCode <= "0101"; -- 01001rrr 1 ORL A,Rn
+ when "01010000" => MCode <= "0010"; -- 01010000 2 JNC code addr
+ when "01010001" => MCode <= "0010"; -- aaa10001 2 ACALL code addr
+ when "01010010" => MCode <= "1010"; -- 01010010 2 ANL data addr,A
+ when "01010011" => MCode <= "1011"; -- 01010011 3 ANL data addr,#data
+ when "01010100" => MCode <= "0110"; -- 01010100 2 ANL A,#data
+ when "01010101" => MCode <= "0110"; -- 01010101 2 ANL A,data addr
+ when "01010110" => MCode <= "0101"; -- 0101011i 1 ANL A,@Ri
+ when "01010111" => MCode <= "0101"; -- 0101011i 1 ANL A,@Ri
+ when "01011000" => MCode <= "0101"; -- 01011rrr 1 ANL A,Rn
+ when "01011001" => MCode <= "0101"; -- 01011rrr 1 ANL A,Rn
+ when "01011010" => MCode <= "0101"; -- 01011rrr 1 ANL A,Rn
+ when "01011011" => MCode <= "0101"; -- 01011rrr 1 ANL A,Rn
+ when "01011100" => MCode <= "0101"; -- 01011rrr 1 ANL A,Rn
+ when "01011101" => MCode <= "0101"; -- 01011rrr 1 ANL A,Rn
+ when "01011110" => MCode <= "0101"; -- 01011rrr 1 ANL A,Rn
+ when "01011111" => MCode <= "0101"; -- 01011rrr 1 ANL A,Rn
+ when "01100000" => MCode <= "0010"; -- 01100000 2 JZ code addr
+ when "01100001" => MCode <= "0010"; -- aaa00001 2 AJMP code addr
+ when "01100010" => MCode <= "1010"; -- 01100010 2 XRL data addr,A
+ when "01100011" => MCode <= "1011"; -- 01100011 3 XRL data addr,#data
+ when "01100100" => MCode <= "0110"; -- 01100100 2 XRL A,#data
+ when "01100101" => MCode <= "0110"; -- 01100101 2 XRL A,data addr
+ when "01100110" => MCode <= "0101"; -- 0110011i 1 XRL A,@Ri
+ when "01100111" => MCode <= "0101"; -- 0110011i 1 XRL A,@Ri
+ when "01101000" => MCode <= "0101"; -- 01101rrr 1 XRL A,Rn
+ when "01101001" => MCode <= "0101"; -- 01101rrr 1 XRL A,Rn
+ when "01101010" => MCode <= "0101"; -- 01101rrr 1 XRL A,Rn
+ when "01101011" => MCode <= "0101"; -- 01101rrr 1 XRL A,Rn
+ when "01101100" => MCode <= "0101"; -- 01101rrr 1 XRL A,Rn
+ when "01101101" => MCode <= "0101"; -- 01101rrr 1 XRL A,Rn
+ when "01101110" => MCode <= "0101"; -- 01101rrr 1 XRL A,Rn
+ when "01101111" => MCode <= "0101"; -- 01101rrr 1 XRL A,Rn
+ when "01110000" => MCode <= "0010"; -- 01110000 2 JNZ code addr
+ when "01110001" => MCode <= "0010"; -- aaa10001 2 ACALL code addr
+ when "01110010" => MCode <= "0010"; -- 01110010 2 ORL C, bit addr
+ when "01110011" => MCode <= "0001"; -- 01110011 1 JMP @A+DPTR
+ when "01110100" => MCode <= "0110"; -- 01110100 2 MOV A,#data
+ when "01110101" => MCode <= "1011"; -- 01110101 3 MOV data addr,#data
+ when "01110110" => MCode <= "1010"; -- 0111011i 2 MOV @Ri,#data
+ when "01110111" => MCode <= "1010"; -- 0111011i 2 MOV @Ri,#data
+ when "01111000" => MCode <= "1010"; -- 01111rrr 2 MOV Rn,#data
+ when "01111001" => MCode <= "1010"; -- 01111rrr 2 MOV Rn,#data
+ when "01111010" => MCode <= "1010"; -- 01111rrr 2 MOV Rn,#data
+ when "01111011" => MCode <= "1010"; -- 01111rrr 2 MOV Rn,#data
+ when "01111100" => MCode <= "1010"; -- 01111rrr 2 MOV Rn,#data
+ when "01111101" => MCode <= "1010"; -- 01111rrr 2 MOV Rn,#data
+ when "01111110" => MCode <= "1010"; -- 01111rrr 2 MOV Rn,#data
+ when "01111111" => MCode <= "1010"; -- 01111rrr 2 MOV Rn,#data
+ when "10000000" => MCode <= "0010"; -- 10000000 2 SJMP code addr
+ when "10000001" => MCode <= "0010"; -- aaa00001 2 AJMP code addr
+ when "10000010" => MCode <= "0010"; -- 10000010 2 ANL C,bit addr
+ when "10000011" => MCode <= "0011"; -- 10000011 1 MOVC A,@A+PC
+ when "10000100" => MCode <= "0001"; -- 10000100 1 DIV AB
+ when "10000101" => MCode <= "1011"; -- 10000101 3 MOV data addr,data addr
+ when "10000110" => MCode <= "1010"; -- 1000011i 2 MOV data addr,@Ri
+ when "10000111" => MCode <= "1010"; -- 1000011i 2 MOV data addr,@Ri
+ when "10001000" => MCode <= "1010"; -- 10001rrr 2 MOV data addr,Rn
+ when "10001001" => MCode <= "1010"; -- 10001rrr 2 MOV data addr,Rn
+ when "10001010" => MCode <= "1010"; -- 10001rrr 2 MOV data addr,Rn
+ when "10001011" => MCode <= "1010"; -- 10001rrr 2 MOV data addr,Rn
+ when "10001100" => MCode <= "1010"; -- 10001rrr 2 MOV data addr,Rn
+ when "10001101" => MCode <= "1010"; -- 10001rrr 2 MOV data addr,Rn
+ when "10001110" => MCode <= "1010"; -- 10001rrr 2 MOV data addr,Rn
+ when "10001111" => MCode <= "1010"; -- 10001rrr 2 MOV data addr,Rn
+ when "10010000" => MCode <= "0011"; -- 10010000 3 MOV DPTR,#data
+ when "10010001" => MCode <= "0010"; -- aaa10001 2 ACALL code addr
+ when "10010010" => MCode <= "1010"; -- 10010010 2 MOV bit addr,C
+ when "10010011" => MCode <= "0011"; -- 10010011 1 MOVC A,@A+DPTR
+ when "10010100" => MCode <= "0110"; -- 10010100 2 SUBB A,#data
+ when "10010101" => MCode <= "0110"; -- 10010101 2 SUBB A,data addr
+ when "10010110" => MCode <= "0101"; -- 1001011i 1 SUBB A,@Ri
+ when "10010111" => MCode <= "0101"; -- 1001011i 1 SUBB A,@Ri
+ when "10011000" => MCode <= "0101"; -- 10011rrr 1 SUBB A,Rn
+ when "10011001" => MCode <= "0101"; -- 10011rrr 1 SUBB A,Rn
+ when "10011010" => MCode <= "0101"; -- 10011rrr 1 SUBB A,Rn
+ when "10011011" => MCode <= "0101"; -- 10011rrr 1 SUBB A,Rn
+ when "10011100" => MCode <= "0101"; -- 10011rrr 1 SUBB A,Rn
+ when "10011101" => MCode <= "0101"; -- 10011rrr 1 SUBB A,Rn
+ when "10011110" => MCode <= "0101"; -- 10011rrr 1 SUBB A,Rn
+ when "10011111" => MCode <= "0101"; -- 10011rrr 1 SUBB A,Rn
+ when "10100000" => MCode <= "0010"; -- 10100000 2 ORL C,/bit addr
+ when "10100001" => MCode <= "0010"; -- aaa00001 2 AJMP code addr
+ when "10100010" => MCode <= "0010"; -- 10100010 2 MOV C,bit addr
+ when "10100011" => MCode <= "0001"; -- 10100011 1 INC DPTR
+ when "10100100" => MCode <= "0101"; -- 10100100 1 MUL AB
+ when "10100101" => MCode <= "0001"; -- 10100101 reserved
+ when "10100110" => MCode <= "1010"; -- 1010011i 2 MOV @Ri,data addr
+ when "10100111" => MCode <= "1010"; -- 1010011i 2 MOV @Ri,data addr
+ when "10101000" => MCode <= "1010"; -- 10101rrr 2 MOV Rn,data addr
+ when "10101001" => MCode <= "1010"; -- 10101rrr 2 MOV Rn,data addr
+ when "10101010" => MCode <= "1010"; -- 10101rrr 2 MOV Rn,data addr
+ when "10101011" => MCode <= "1010"; -- 10101rrr 2 MOV Rn,data addr
+ when "10101100" => MCode <= "1010"; -- 10101rrr 2 MOV Rn,data addr
+ when "10101101" => MCode <= "1010"; -- 10101rrr 2 MOV Rn,data addr
+ when "10101110" => MCode <= "1010"; -- 10101rrr 2 MOV Rn,data addr
+ when "10101111" => MCode <= "1010"; -- 10101rrr 2 MOV Rn,data addr
+ when "10110000" => MCode <= "0010"; -- 10110000 2 ANL C,/bit addr
+ when "10110001" => MCode <= "0010"; -- aaa10001 2 ACALL code addr
+ when "10110010" => MCode <= "1010"; -- 10110010 2 CPL bit addr
+ when "10110011" => MCode <= "0001"; -- 10110011 1 CPL C
+ when "10110100" => MCode <= "0011"; -- 10110100 3 CJNE A,#data,code addr
+ when "10110101" => MCode <= "0011"; -- 10110101 3 CJNE A,data addr,code addr
+ when "10110110" => MCode <= "0011"; -- 1011011i 3 CJNE @Ri,#data,code addr
+ when "10110111" => MCode <= "0011"; -- 1011011i 3 CJNE @Ri,#data,code addr
+ when "10111000" => MCode <= "0011"; -- 10111rrr 3 CJNE Rn,#data,code addr
+ when "10111001" => MCode <= "0011"; -- 10111rrr 3 CJNE Rn,#data,code addr
+ when "10111010" => MCode <= "0011"; -- 10111rrr 3 CJNE Rn,#data,code addr
+ when "10111011" => MCode <= "0011"; -- 10111rrr 3 CJNE Rn,#data,code addr
+ when "10111100" => MCode <= "0011"; -- 10111rrr 3 CJNE Rn,#data,code addr
+ when "10111101" => MCode <= "0011"; -- 10111rrr 3 CJNE Rn,#data,code addr
+ when "10111110" => MCode <= "0011"; -- 10111rrr 3 CJNE Rn,#data,code addr
+ when "10111111" => MCode <= "0011"; -- 10111rrr 3 CJNE Rn,#data,code addr
+ when "11000000" => MCode <= "1010"; -- 11000000 2 PUSH data addr
+ when "11000001" => MCode <= "0010"; -- aaa00001 2 AJMP code addr
+ when "11000010" => MCode <= "1010"; -- 11000010 2 CLR bit addr
+ when "11000011" => MCode <= "0001"; -- 11000011 1 CLR C
+ when "11000100" => MCode <= "0101"; -- 11000100 1 SWAP A
+ when "11000101" => MCode <= "1110"; -- 11000101 2 XCH A,data addr
+ when "11000110" => MCode <= "1101"; -- 1100011i 1 XCH A,@Ri
+ when "11000111" => MCode <= "1101"; -- 1100011i 1 XCH A,@Ri
+ when "11001000" => MCode <= "1101"; -- 11001rrr 1 XCH A,Rn
+ when "11001001" => MCode <= "1101"; -- 11001rrr 1 XCH A,Rn
+ when "11001010" => MCode <= "1101"; -- 11001rrr 1 XCH A,Rn
+ when "11001011" => MCode <= "1101"; -- 11001rrr 1 XCH A,Rn
+ when "11001100" => MCode <= "1101"; -- 11001rrr 1 XCH A,Rn
+ when "11001101" => MCode <= "1101"; -- 11001rrr 1 XCH A,Rn
+ when "11001110" => MCode <= "1101"; -- 11001rrr 1 XCH A,Rn
+ when "11001111" => MCode <= "1101"; -- 11001rrr 1 XCH A,Rn
+ when "11010000" => MCode <= "1010"; -- 11010000 2 POP data addr
+ when "11010001" => MCode <= "0010"; -- aaa10001 2 ACALL code addr
+ when "11010010" => MCode <= "1010"; -- 11010010 2 SETB bit addr
+ when "11010011" => MCode <= "0001"; -- 11010011 1 SETB C
+ when "11010100" => MCode <= "0101"; -- 11010100 1 DA A
+ when "11010101" => MCode <= "1011"; -- 11010101 3 DJNZ data addr, code addr
+ when "11010110" => MCode <= "1101"; -- 1101011i 1 XCHD A,@Ri
+ when "11010111" => MCode <= "1101"; -- 1101011i 1 XCHD A,@Ri
+ when "11011000" => MCode <= "1010"; -- 11011rrr 2 DJNZ Rn,code addr
+ when "11011001" => MCode <= "1010"; -- 11011rrr 2 DJNZ Rn,code addr
+ when "11011010" => MCode <= "1010"; -- 11011rrr 2 DJNZ Rn,code addr
+ when "11011011" => MCode <= "1010"; -- 11011rrr 2 DJNZ Rn,code addr
+ when "11011100" => MCode <= "1010"; -- 11011rrr 2 DJNZ Rn,code addr
+ when "11011101" => MCode <= "1010"; -- 11011rrr 2 DJNZ Rn,code addr
+ when "11011110" => MCode <= "1010"; -- 11011rrr 2 DJNZ Rn,code addr
+ when "11011111" => MCode <= "1010"; -- 11011rrr 2 DJNZ Rn,code addr
+ when "11100000" => MCode <= "0101"; -- 11100000 1 MOVX A,@DPTR
+ when "11100001" => MCode <= "0010"; -- aaa00001 2 AJMP code addr
+ when "11100010" => MCode <= "0101"; -- 1110001i 1 MOVX A,@Ri
+ when "11100011" => MCode <= "0101"; -- 1110001i 1 MOVX A,@Ri
+ when "11100100" => MCode <= "0101"; -- 11100100 1 CLR A
+ when "11100101" => MCode <= "0110"; -- 11100101 2 MOV A,data addr
+ when "11100110" => MCode <= "0101"; -- 1110011i 1 MOV A,@Ri
+ when "11100111" => MCode <= "0101"; -- 1110011i 1 MOV A,@Ri
+ when "11101000" => MCode <= "0101"; -- 11101rrr 1 MOV A,Rn
+ when "11101001" => MCode <= "0101"; -- 11101rrr 1 MOV A,Rn
+ when "11101010" => MCode <= "0101"; -- 11101rrr 1 MOV A,Rn
+ when "11101011" => MCode <= "0101"; -- 11101rrr 1 MOV A,Rn
+ when "11101100" => MCode <= "0101"; -- 11101rrr 1 MOV A,Rn
+ when "11101101" => MCode <= "0101"; -- 11101rrr 1 MOV A,Rn
+ when "11101110" => MCode <= "0101"; -- 11101rrr 1 MOV A,Rn
+ when "11101111" => MCode <= "0101"; -- 11101rrr 1 MOV A,Rn
+ when "11110000" => MCode <= "0001"; -- 11110000 1 MOVX @DPTR,A
+ when "11110001" => MCode <= "0010"; -- aaa10001 2 ACALL code addr
+ when "11110010" => MCode <= "0001"; -- 1111001i 1 MOVX @Ri,A
+ when "11110011" => MCode <= "0001"; -- 1111001i 1 MOVX @Ri,A
+ when "11110100" => MCode <= "0101"; -- 11110100 1 CPL A
+ when "11110101" => MCode <= "1010"; -- 11110101 2 MOV data addr,A
+ when "11110110" => MCode <= "1001"; -- 1111011i 1 MOV @Ri,A
+ when "11110111" => MCode <= "1001"; -- 1111011i 1 MOV @Ri,A
+ when "11111000" => MCode <= "1001"; -- 11111rrr 1 MOV Rn,A
+ when "11111001" => MCode <= "1001"; -- 11111rrr 1 MOV Rn,A
+ when "11111010" => MCode <= "1001"; -- 11111rrr 1 MOV Rn,A
+ when "11111011" => MCode <= "1001"; -- 11111rrr 1 MOV Rn,A
+ when "11111100" => MCode <= "1001"; -- 11111rrr 1 MOV Rn,A
+ when "11111101" => MCode <= "1001"; -- 11111rrr 1 MOV Rn,A
+ when "11111110" => MCode <= "1001"; -- 11111rrr 1 MOV Rn,A
+ when "11111111" => MCode <= "1001"; -- 11111rrr 1 MOV Rn,A
+ when others => MCode <= "----";
+ end case;
+ end process;
+
+end;
+
+-----------------------------------------------------------------------------------------
+
diff --git a/rtl/vhdl/T8032.vhd b/rtl/vhdl/T8032.vhd
new file mode 100644
index 0000000..637b6f1
--- /dev/null
+++ b/rtl/vhdl/T8032.vhd
@@ -0,0 +1,459 @@
+--
+-- 8032 compatible microcontroller, wishbone compatible
+--
+-- Version : 0222
+--
+-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
+-- (c) 2004-2005 Andreas Voggeneder (andreas.voggeneder@fh-hagenberg.at)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use work.T51_Pack.all;
+
+entity T8032 is
+ generic(
+ tristate : integer := 0;
+ RAMAddressWidth : integer := 8);
+ port(
+ -- Wishbone signals
+ CLK_I : in std_logic;
+ RST_I : in std_logic;
+ ACK_I : in std_logic;
+ TAG0_O : out std_logic; -- PSEN_n
+ CYC_O : out std_logic;
+ STB_O : out std_logic;
+ WE_O : out std_logic;
+ ADR_O : out std_logic_vector(15 downto 0);
+ DAT_I : in std_logic_vector(7 downto 0);
+ DAT_O : out std_logic_vector(7 downto 0);
+ -- Peripheral signals
+ P0_in : in std_logic_vector(7 downto 0);
+ P1_in : in std_logic_vector(7 downto 0);
+ P2_in : in std_logic_vector(7 downto 0);
+ P3_in : in std_logic_vector(7 downto 0);
+ P0_out : out std_logic_vector(7 downto 0);
+ P1_out : out std_logic_vector(7 downto 0);
+ P2_out : out std_logic_vector(7 downto 0);
+ P3_out : out std_logic_vector(7 downto 0);
+ INT0 : in std_logic;
+ INT1 : in std_logic;
+ T0 : in std_logic;
+ T1 : in std_logic;
+ T2 : in std_logic;
+ T2EX : in std_logic;
+ RXD : in std_logic;
+ RXD_IsO : out std_logic;
+ RXD_O : out std_logic;
+ TXD : out std_logic
+ );
+end T8032;
+
+architecture rtl of T8032 is
+ constant ext_mux_in_num : integer := 8; --63;
+ type ext_mux_din_type is array(0 to ext_mux_in_num-1) of std_logic_vector(7 downto 0);
+ subtype ext_mux_en_type is std_logic_vector(0 to ext_mux_in_num-1);
+
+ signal Rst_n : std_logic;
+ signal ROM_Addr : std_logic_vector(15 downto 0);
+ signal ROM_Data : std_logic_vector(7 downto 0);
+ signal RAM_Addr : std_logic_vector(15 downto 0);
+ signal RAM_RData : std_logic_vector(7 downto 0);
+ signal RAM_WData : std_logic_vector(7 downto 0);
+ signal RAM_Cycle : std_logic;
+ signal RAM_Cycle_r : std_logic;
+ signal CYC_s : std_logic;
+ signal RAM_Rd : std_logic;
+ signal RAM_Wr : std_logic;
+ signal IO_Rd : std_logic;
+ signal IO_Wr : std_logic;
+ signal IO_Addr : std_logic_vector(6 downto 0);
+ signal IO_Addr_r : std_logic_vector(6 downto 0);
+ signal IO_WData : std_logic_vector(7 downto 0);
+ signal IO_RData : std_logic_vector(7 downto 0);
+ signal IO_RData_arr : ext_mux_din_type;
+ signal IO_RData_en : ext_mux_en_type;
+
+ signal P0_Sel : std_logic;
+ signal P1_Sel : std_logic;
+ signal P2_Sel : std_logic;
+ signal P3_Sel : std_logic;
+ signal TMOD_Sel : std_logic;
+ signal TL0_Sel : std_logic;
+ signal TL1_Sel : std_logic;
+ signal TH0_Sel : std_logic;
+ signal TH1_Sel : std_logic;
+ signal T2CON_Sel : std_logic;
+ signal RCAP2L_Sel : std_logic;
+ signal RCAP2H_Sel : std_logic;
+ signal TL2_Sel : std_logic;
+ signal TH2_Sel : std_logic;
+ signal SCON_Sel : std_logic;
+ signal SBUF_Sel : std_logic;
+
+ signal P0_Wr : std_logic;
+ signal P1_Wr : std_logic;
+ signal P2_Wr : std_logic;
+ signal P3_Wr : std_logic;
+ signal TMOD_Wr : std_logic;
+ signal TL0_Wr : std_logic;
+ signal TL1_Wr : std_logic;
+ signal TH0_Wr : std_logic;
+ signal TH1_Wr : std_logic;
+ signal T2CON_Wr : std_logic;
+ signal RCAP2L_Wr : std_logic;
+ signal RCAP2H_Wr : std_logic;
+ signal TL2_Wr : std_logic;
+ signal TH2_Wr : std_logic;
+ signal SCON_Wr : std_logic;
+ signal SBUF_Wr : std_logic;
+
+ signal UseR2 : std_logic;
+ signal UseT2 : std_logic;
+ signal UART_Clk : std_logic;
+ signal R0 : std_logic;
+ signal R1 : std_logic;
+ signal SMOD : std_logic;
+
+ signal Int_Trig : std_logic_vector(6 downto 0);
+ signal Int_Acc : std_logic_vector(6 downto 0);
+
+ signal RI : std_logic;
+ signal TI : std_logic;
+ signal OF0 : std_logic;
+ signal OF1 : std_logic;
+ signal OF2 : std_logic;
+
+begin
+
+ Rst_n <= not RST_I;
+
+ -- Wishbone interface
+ DAT_O <= RAM_WData;
+ ROM_Data <= DAT_I;
+ WE_O <= RAM_Wr and RAM_Cycle;
+ TAG0_O <= RAM_Cycle_r; -- PSEN_n
+ STB_O <= CYC_s;
+ CYC_O <= CYC_s;
+
+ process(Rst_n, CLK_I)
+ begin
+ if Rst_n = '0' then
+ CYC_s <= '0';
+ ADR_O <= (others => '0');
+ RAM_Cycle_r <= '0';
+ RAM_RData <= (others => '0');
+ elsif CLK_I'event and CLK_I = '1' then
+ CYC_s <= '1';
+ RAM_Cycle_r <= RAM_Cycle;
+ if ACK_I='1' then
+ RAM_RData <= DAT_I;
+ end if;
+
+ if RAM_Cycle = '1' and (RAM_Cycle_r = '0' or ACK_I = '0') then
+ ADR_O <= RAM_Addr;
+ else
+ ADR_O <= ROM_Addr;
+ end if;
+ end if;
+ end process;
+
+ process (CLK_I)
+ begin
+ if CLK_I'event and CLK_I = '1' then
+ IO_Addr_r <= IO_Addr;
+ end if;
+ end process;
+
+ core51 : T51
+ generic map(
+ RAMAddressWidth => RAMAddressWidth,
+ tristate => tristate,
+ t8032 => 1,
+ DualBus => 0)
+ port map(
+ Clk => CLK_I,
+ Rst_n => Rst_n,
+ Ready => ACK_I,
+ ROM_Addr => ROM_Addr,
+ ROM_Data => ROM_Data,
+ RAM_Addr => RAM_Addr,
+ RAM_RData => RAM_RData,
+ RAM_WData => RAM_WData,
+ RAM_Cycle => RAM_Cycle,
+ RAM_Rd => RAM_Rd,
+ RAM_Wr => RAM_Wr,
+ Int_Trig => Int_Trig,
+ Int_Acc => Int_Acc,
+ SFR_Rd_RMW => IO_Rd,
+ SFR_Wr => IO_Wr,
+ SFR_Addr => IO_Addr,
+ SFR_WData => IO_WData,
+ SFR_RData_in => IO_RData);
+
+ glue51 : T51_Glue
+ generic map(
+ tristate => tristate)
+ port map(
+ Clk => CLK_I,
+ Rst_n => Rst_n,
+ INT0 => INT0,
+ INT1 => INT1,
+ RI => RI,
+ TI => TI,
+ OF0 => OF0,
+ OF1 => OF1,
+ OF2 => OF2,
+ IO_Wr => IO_Wr,
+ IO_Addr => IO_Addr,
+ IO_Addr_r => IO_Addr_r,
+ IO_WData => IO_WData,
+ IO_RData => IO_RData_arr(0),
+ Selected => IO_RData_en(0),
+ Int_Acc => Int_Acc,
+ R0 => R0,
+ R1 => R1,
+ SMOD => SMOD,
+ P0_Sel => P0_Sel,
+ P1_Sel => P1_Sel,
+ P2_Sel => P2_Sel,
+ P3_Sel => P3_Sel,
+ TMOD_Sel => TMOD_Sel,
+ TL0_Sel => TL0_Sel,
+ TL1_Sel => TL1_Sel,
+ TH0_Sel => TH0_Sel,
+ TH1_Sel => TH1_Sel,
+ T2CON_Sel => T2CON_Sel,
+ RCAP2L_Sel => RCAP2L_Sel,
+ RCAP2H_Sel => RCAP2H_Sel,
+ TL2_Sel => TL2_Sel,
+ TH2_Sel => TH2_Sel,
+ SCON_Sel => SCON_Sel,
+ SBUF_Sel => SBUF_Sel,
+ P0_Wr => P0_Wr,
+ P1_Wr => P1_Wr,
+ P2_Wr => P2_Wr,
+ P3_Wr => P3_Wr,
+ TMOD_Wr => TMOD_Wr,
+ TL0_Wr => TL0_Wr,
+ TL1_Wr => TL1_Wr,
+ TH0_Wr => TH0_Wr,
+ TH1_Wr => TH1_Wr,
+ T2CON_Wr => T2CON_Wr,
+ RCAP2L_Wr => RCAP2L_Wr,
+ RCAP2H_Wr => RCAP2H_Wr,
+ TL2_Wr => TL2_Wr,
+ TH2_Wr => TH2_Wr,
+ SCON_Wr => SCON_Wr,
+ SBUF_Wr => SBUF_Wr,
+ Int_Trig => Int_Trig);
+
+ tp0 : T51_Port
+ generic map(
+ tristate => tristate)
+ port map(
+ Clk => CLK_I,
+ Rst_n => Rst_n,
+ Sel => P0_Sel,
+ Rd_RMW => IO_Rd,
+ Wr => P0_Wr,
+ Data_In => IO_WData,
+ Data_Out => IO_RData_arr(1),
+ IOPort_in => P0_in,
+ IOPort_out => P0_out);
+
+ IO_RData_en(1) <= P0_Sel;
+
+
+ tp1 : T51_Port
+ generic map(
+ tristate => tristate)
+ port map(
+ Clk => CLK_I,
+ Rst_n => Rst_n,
+ Sel => P1_Sel,
+ Rd_RMW => IO_Rd,
+ Wr => P1_Wr,
+ Data_In => IO_WData,
+ Data_Out => IO_RData_arr(2),
+ IOPort_in => P1_in,
+ IOPort_out => P1_out);
+
+ IO_RData_en(2) <= P1_Sel;
+
+ tp2 : T51_Port
+ generic map(
+ tristate => tristate)
+ port map(
+ Clk => CLK_I,
+ Rst_n => Rst_n,
+ Sel => P2_Sel,
+ Rd_RMW => IO_Rd,
+ Wr => P2_Wr,
+ Data_In => IO_WData,
+ Data_Out => IO_RData_arr(3),
+ IOPort_in => P2_in,
+ IOPort_out => P2_out);
+
+ IO_RData_en(3) <= P2_Sel;
+
+ tp3 : T51_Port
+ generic map(
+ tristate => tristate)
+ port map(
+ Clk => CLK_I,
+ Rst_n => Rst_n,
+ Sel => P3_Sel,
+ Rd_RMW => IO_Rd,
+ Wr => P3_Wr,
+ Data_In => IO_WData,
+ Data_Out => IO_RData_arr(4),
+ IOPort_in => P3_in,
+ IOPort_out => P3_out);
+
+ IO_RData_en(4) <= P3_Sel;
+
+ tc01 : T51_TC01
+ generic map(
+ FastCount => 0,
+ tristate => tristate)
+ port map(
+ Clk => CLK_I,
+ Rst_n => Rst_n,
+ T0 => T0,
+ T1 => T1,
+ INT0 => INT0,
+ INT1 => INT1,
+ M_Sel => TMOD_Sel,
+ H0_Sel => TH0_Sel,
+ L0_Sel => TL0_Sel,
+ H1_Sel => TH1_Sel,
+ L1_Sel => TL1_Sel,
+ R0 => R0,
+ R1 => R1,
+ M_Wr => TMOD_Wr,
+ H0_Wr => TH0_Wr,
+ L0_Wr => TL0_Wr,
+ H1_Wr => TH1_Wr,
+ L1_Wr => TL1_Wr,
+ Data_In => IO_WData,
+ Data_Out => IO_RData_arr(5),
+ OF0 => OF0,
+ OF1 => OF1);
+
+ IO_RData_en(5) <= TMOD_Sel or TH0_Sel or TL0_Sel or TH1_Sel or TL1_Sel;
+
+ tc2 : T51_TC2
+ generic map(
+ FastCount => 0,
+ tristate => tristate)
+ port map(
+ Clk => CLK_I,
+ Rst_n => Rst_n,
+ T2 => T2,
+ T2EX => T2EX,
+ C_Sel => T2CON_Sel,
+ CH_Sel => RCAP2H_Sel,
+ CL_Sel => RCAP2L_Sel,
+ H_Sel => TH2_Sel,
+ L_Sel => TL2_Sel,
+ C_Wr => T2CON_Wr,
+ CH_Wr => RCAP2H_Wr,
+ CL_Wr => RCAP2L_Wr,
+ H_Wr => TH2_Wr,
+ L_Wr => TL2_Wr,
+ Data_In => IO_WData,
+ Data_Out => IO_RData_arr(6),
+ UseR2 => UseR2,
+ UseT2 => UseT2,
+ UART_Clk => UART_Clk,
+ F => OF2);
+
+ IO_RData_en(6) <= T2CON_Sel or RCAP2H_Sel or RCAP2L_Sel or TH2_Sel or TL2_Sel;
+
+
+ uart : T51_UART
+ generic map(
+ FastCount => 0,
+ tristate => tristate)
+ port map(
+ Clk => CLK_I,
+ Rst_n => Rst_n,
+ UseR2 => UseR2,
+ UseT2 => UseT2,
+ BaudC2 => UART_Clk,
+ BaudC1 => OF1,
+ SC_Sel => SCON_Sel,
+ SB_Sel => SBUF_Sel,
+ SC_Wr => SCON_Wr,
+ SB_Wr => SBUF_Wr,
+ SMOD => SMOD,
+ Data_In => IO_WData,
+ Data_Out => IO_RData_arr(7),
+ RXD => RXD,
+ RXD_IsO => RXD_IsO,
+ RXD_O => RXD_O,
+ TXD => TXD,
+ RI => RI,
+ TI => TI);
+
+ IO_RData_en(7) <= SCON_Sel or SBUF_Sel;
+
+ tristate_mux: if tristate/=0 generate
+ drive: for i in 0 to ext_mux_in_num-1 generate
+ IO_RData <= IO_RData_arr(i);
+ end generate;
+ end generate;
+
+ std_mux: if tristate=0 generate
+ process(IO_RData_en,IO_RData_arr)
+ begin
+ IO_RData <= IO_RData_arr(0);
+ for i in 1 to ext_mux_in_num-1 loop
+ if IO_RData_en(i)='1' then
+ IO_RData <= IO_RData_arr(i);
+ end if;
+ end loop;
+ end process;
+ end generate;
+
+end;
diff --git a/rtl/vhdl/T8052.vhd b/rtl/vhdl/T8052.vhd
new file mode 100644
index 0000000..033ed70
--- /dev/null
+++ b/rtl/vhdl/T8052.vhd
@@ -0,0 +1,519 @@
+--
+-- 8052 compatible microcontroller, with internal RAM & ROM
+--
+-- Version : 0300
+--
+-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
+-- (c) 2004-2005 Andreas Voggeneder (andreas.voggeneder@fh-hagenberg.at)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use work.T51_Pack.all;
+
+entity T8052 is
+ generic(
+ tristate : integer := 0;
+ ROMAddressWidth : integer := 13;
+ IRAMAddressWidth : integer := 8;
+ XRAMAddressWidth : integer := 11);
+ port(
+ Clk : in std_logic;
+ Rst_n : in std_logic;
+ P0_in : in std_logic_vector(7 downto 0);
+ P1_in : in std_logic_vector(7 downto 0);
+ P2_in : in std_logic_vector(7 downto 0);
+ P3_in : in std_logic_vector(7 downto 0);
+ P0_out : out std_logic_vector(7 downto 0);
+ P1_out : out std_logic_vector(7 downto 0);
+ P2_out : out std_logic_vector(7 downto 0);
+ P3_out : out std_logic_vector(7 downto 0);
+ INT0 : in std_logic;
+ INT1 : in std_logic;
+ T0 : in std_logic;
+ T1 : in std_logic;
+ T2 : in std_logic;
+ T2EX : in std_logic;
+ RXD : in std_logic;
+ RXD_IsO : out std_logic;
+ RXD_O : out std_logic;
+ TXD : out std_logic;
+ -- External XRAM Wishbone:
+ XRAM_WE_O : out std_logic;
+ XRAM_STB_O : out std_logic;
+ XRAM_CYC_O : out std_logic;
+ XRAM_ACK_I : in std_logic;
+ XRAM_DAT_O : out std_logic_vector(7 downto 0);
+ XRAM_ADR_O : out std_logic_vector(15 downto 0);
+ XRAM_DAT_I : in std_logic_vector(7 downto 0)
+ );
+end T8052;
+
+architecture rtl of T8052 is
+
+ component ROM52
+ port(
+ Clk : in std_logic;
+ A : in std_logic_vector(ROMAddressWidth - 1 downto 0);
+ D : out std_logic_vector(7 downto 0)
+ );
+ end component;
+
+ component SSRAM
+ generic(
+ AddrWidth : integer := 16;
+ DataWidth : integer := 8
+ );
+ port(
+ Clk : in std_logic;
+ CE_n : in std_logic;
+ WE_n : in std_logic;
+ A : in std_logic_vector(AddrWidth - 1 downto 0);
+ DIn : in std_logic_vector(DataWidth - 1 downto 0);
+ DOut : out std_logic_vector(DataWidth - 1 downto 0)
+ );
+ end component;
+
+ constant ext_mux_in_num : integer := 8; --63;
+ type ext_mux_din_type is array(0 to ext_mux_in_num-1) of std_logic_vector(7 downto 0);
+ subtype ext_mux_en_type is std_logic_vector(0 to ext_mux_in_num-1);
+
+ signal Ready : std_logic;
+ signal ROM_Addr : std_logic_vector(15 downto 0);
+ signal ROM_Data : std_logic_vector(7 downto 0);
+ signal RAM_Addr,RAM_Addr_r : std_logic_vector(15 downto 0);
+ signal XRAM_Addr : std_logic_vector(15 downto 0);
+ signal RAM_RData : std_logic_vector(7 downto 0);
+ signal RAM_DO : std_logic_vector(7 downto 0);
+ signal RAM_WData : std_logic_vector(7 downto 0);
+ signal RAM_Rd : std_logic;
+ signal RAM_Wr : std_logic;
+ signal RAM_WE_n : std_logic;
+ signal zeros : std_logic_vector(15 downto XRAMAddressWidth);
+ signal ram_access : std_logic;
+ signal mux_sel : std_logic;
+ signal mux_sel_r : std_logic;
+ signal ext_ram_en : std_logic;
+ signal int_xram_sel_n : std_logic;
+ signal IO_Rd : std_logic;
+ signal IO_Wr : std_logic;
+ signal IO_Addr : std_logic_vector(6 downto 0);
+ signal IO_Addr_r : std_logic_vector(6 downto 0);
+ signal IO_WData : std_logic_vector(7 downto 0);
+ signal IO_RData : std_logic_vector(7 downto 0);
+ signal IO_RData_arr : ext_mux_din_type;
+ signal IO_RData_en : ext_mux_en_type;
+
+ signal P0_Sel : std_logic;
+ signal P1_Sel : std_logic;
+ signal P2_Sel : std_logic;
+ signal P3_Sel : std_logic;
+ signal TMOD_Sel : std_logic;
+ signal TL0_Sel : std_logic;
+ signal TL1_Sel : std_logic;
+ signal TH0_Sel : std_logic;
+ signal TH1_Sel : std_logic;
+ signal T2CON_Sel : std_logic;
+ signal RCAP2L_Sel : std_logic;
+ signal RCAP2H_Sel : std_logic;
+ signal TL2_Sel : std_logic;
+ signal TH2_Sel : std_logic;
+ signal SCON_Sel : std_logic;
+ signal SBUF_Sel : std_logic;
+
+ signal P0_Wr : std_logic;
+ signal P1_Wr : std_logic;
+ signal P2_Wr : std_logic;
+ signal P3_Wr : std_logic;
+ signal TMOD_Wr : std_logic;
+ signal TL0_Wr : std_logic;
+ signal TL1_Wr : std_logic;
+ signal TH0_Wr : std_logic;
+ signal TH1_Wr : std_logic;
+ signal T2CON_Wr : std_logic;
+ signal RCAP2L_Wr : std_logic;
+ signal RCAP2H_Wr : std_logic;
+ signal TL2_Wr : std_logic;
+ signal TH2_Wr : std_logic;
+ signal SCON_Wr : std_logic;
+ signal SBUF_Wr : std_logic;
+
+ signal UseR2 : std_logic;
+ signal UseT2 : std_logic;
+ signal UART_Clk : std_logic;
+ signal R0 : std_logic;
+ signal R1 : std_logic;
+ signal SMOD : std_logic;
+
+ signal Int_Trig : std_logic_vector(6 downto 0);
+ signal Int_Acc : std_logic_vector(6 downto 0);
+
+ signal RI : std_logic;
+ signal TI : std_logic;
+ signal OF0 : std_logic;
+ signal OF1 : std_logic;
+ signal OF2 : std_logic;
+
+begin
+
+ Ready <= '0' when (XRAM_ACK_I='0' and (ext_ram_en and ram_access)='1') else
+ '1';
+
+ XRAM_ADR_O <= XRAM_Addr(15 downto 0); -- Registered address
+ XRAM_DAT_O <= RAM_WData;
+ XRAM_CYC_O <= ext_ram_en and ram_access;
+ XRAM_STB_O <= ext_ram_en and ram_access;
+ XRAM_WE_O <= RAM_Wr;
+
+ process (Rst_n,clk)
+ begin
+ if Rst_n='0' then
+ IO_Addr_r <= (others =>'0');
+ RAM_Addr_r <= (others =>'0');
+ mux_sel_r <= '0';
+ elsif clk'event and clk = '1' then
+ IO_Addr_r <= IO_Addr;
+ if Ready = '1' then
+ RAM_Addr_r <= RAM_Addr;
+ end if;
+ mux_sel_r <= mux_sel;
+ end if;
+ end process;
+
+ XRAM_Addr <= RAM_Addr_r;
+
+ rom : ROM52 port map(
+ Clk => Clk,
+ A => ROM_Addr(ROMAddressWidth - 1 downto 0),
+ D => ROM_Data);
+
+ zeros <= (others => '0');
+ g_rams0 : if XRAMAddressWidth > 15 generate
+ ext_ram_en <= '0'; -- no external XRAM
+ end generate;
+
+ g_rams1 : if XRAMAddressWidth < 16 and XRAMAddressWidth > 0 generate
+ ext_ram_en <= '1' when XRAM_Addr(15 downto XRAMAddressWidth) /= zeros else
+ '0';
+ end generate;
+
+ ram_access <= '1' when (RAM_Rd or RAM_Wr)='1' else
+ '0';
+
+ -- xram bus access is pipelined.
+ -- so use registered signal for selecting read data
+ RAM_RData <= RAM_DO when mux_sel_r = '0' else
+ XRAM_DAT_I;
+
+ -- select data mux
+ mux_sel <= ext_ram_en;
+
+ -- internal XRAM select signal is active low.
+ -- so internal xram is selected when external XRAM is not selected (ext_ram_en = '0')
+ int_xram_sel_n <= ext_ram_en;
+ RAM_WE_n <= not RAM_Wr;
+
+ g_ram : if XRAMAddressWidth > 0 generate
+ ram : SSRAM
+ generic map(
+ AddrWidth => XRAMAddressWidth)
+ port map(
+ Clk => Clk,
+ CE_n => int_xram_sel_n,
+ WE_n => RAM_WE_n,
+ A => XRAM_Addr(XRAMAddressWidth - 1 downto 0),
+ DIn => RAM_WData,
+ DOut => RAM_DO);
+ end generate;
+
+ core51 : T51
+ generic map(
+ DualBus => 1,
+ tristate => tristate,
+ t8032 => 0,
+ RAMAddressWidth => IRAMAddressWidth)
+ port map(
+ Clk => Clk,
+ Rst_n => Rst_n,
+ Ready => Ready,
+ ROM_Addr => ROM_Addr,
+ ROM_Data => ROM_Data,
+ RAM_Addr => RAM_Addr,
+ RAM_RData => RAM_RData,
+ RAM_WData => RAM_WData,
+ RAM_Rd => RAM_Rd,
+ RAM_Wr => RAM_Wr,
+ Int_Trig => Int_Trig,
+ Int_Acc => Int_Acc,
+ SFR_Rd_RMW => IO_Rd,
+ SFR_Wr => IO_Wr,
+ SFR_Addr => IO_Addr,
+ SFR_WData => IO_WData,
+ SFR_RData_in => IO_RData);
+
+ glue51 : T51_Glue
+ generic map(
+ tristate => tristate)
+ port map(
+ Clk => Clk,
+ Rst_n => Rst_n,
+ INT0 => INT0,
+ INT1 => INT1,
+ RI => RI,
+ TI => TI,
+ OF0 => OF0,
+ OF1 => OF1,
+ OF2 => OF2,
+ IO_Wr => IO_Wr,
+ IO_Addr => IO_Addr,
+ IO_Addr_r => IO_Addr_r,
+ IO_WData => IO_WData,
+ IO_RData => IO_RData_arr(0),
+ Selected => IO_RData_en(0),
+ Int_Acc => Int_Acc,
+ R0 => R0,
+ R1 => R1,
+ SMOD => SMOD,
+ P0_Sel => P0_Sel,
+ P1_Sel => P1_Sel,
+ P2_Sel => P2_Sel,
+ P3_Sel => P3_Sel,
+ TMOD_Sel => TMOD_Sel,
+ TL0_Sel => TL0_Sel,
+ TL1_Sel => TL1_Sel,
+ TH0_Sel => TH0_Sel,
+ TH1_Sel => TH1_Sel,
+ T2CON_Sel => T2CON_Sel,
+ RCAP2L_Sel => RCAP2L_Sel,
+ RCAP2H_Sel => RCAP2H_Sel,
+ TL2_Sel => TL2_Sel,
+ TH2_Sel => TH2_Sel,
+ SCON_Sel => SCON_Sel,
+ SBUF_Sel => SBUF_Sel,
+ P0_Wr => P0_Wr,
+ P1_Wr => P1_Wr,
+ P2_Wr => P2_Wr,
+ P3_Wr => P3_Wr,
+ TMOD_Wr => TMOD_Wr,
+ TL0_Wr => TL0_Wr,
+ TL1_Wr => TL1_Wr,
+ TH0_Wr => TH0_Wr,
+ TH1_Wr => TH1_Wr,
+ T2CON_Wr => T2CON_Wr,
+ RCAP2L_Wr => RCAP2L_Wr,
+ RCAP2H_Wr => RCAP2H_Wr,
+ TL2_Wr => TL2_Wr,
+ TH2_Wr => TH2_Wr,
+ SCON_Wr => SCON_Wr,
+ SBUF_Wr => SBUF_Wr,
+ Int_Trig => Int_Trig);
+
+ tp0 : T51_Port
+ generic map(
+ tristate => tristate)
+ port map(
+ Clk => Clk,
+ Rst_n => Rst_n,
+ Sel => P0_Sel,
+ Rd_RMW => IO_Rd,
+ Wr => P0_Wr,
+ Data_In => IO_WData,
+ Data_Out => IO_RData_arr(1),
+ IOPort_in => P0_in,
+ IOPort_out => P0_out);
+
+ IO_RData_en(1) <= P0_Sel;
+
+
+ tp1 : T51_Port
+ generic map(
+ tristate => tristate)
+ port map(
+ Clk => Clk,
+ Rst_n => Rst_n,
+ Sel => P1_Sel,
+ Rd_RMW => IO_Rd,
+ Wr => P1_Wr,
+ Data_In => IO_WData,
+ Data_Out => IO_RData_arr(2),
+ IOPort_in => P1_in,
+ IOPort_out => P1_out);
+
+ IO_RData_en(2) <= P1_Sel;
+
+ tp2 : T51_Port
+ generic map(
+ tristate => tristate)
+ port map(
+ Clk => Clk,
+ Rst_n => Rst_n,
+ Sel => P2_Sel,
+ Rd_RMW => IO_Rd,
+ Wr => P2_Wr,
+ Data_In => IO_WData,
+ Data_Out => IO_RData_arr(3),
+ IOPort_in => P2_in,
+ IOPort_out => P2_out);
+
+ IO_RData_en(3) <= P2_Sel;
+
+ tp3 : T51_Port
+ generic map(
+ tristate => tristate)
+ port map(
+ Clk => Clk,
+ Rst_n => Rst_n,
+ Sel => P3_Sel,
+ Rd_RMW => IO_Rd,
+ Wr => P3_Wr,
+ Data_In => IO_WData,
+ Data_Out => IO_RData_arr(4),
+ IOPort_in => P3_in,
+ IOPort_out => P3_out);
+
+ IO_RData_en(4) <= P3_Sel;
+
+ tc01 : T51_TC01
+ generic map(
+ FastCount => 0,
+ tristate => tristate)
+ port map(
+ Clk => Clk,
+ Rst_n => Rst_n,
+ T0 => T0,
+ T1 => T1,
+ INT0 => INT0,
+ INT1 => INT1,
+ M_Sel => TMOD_Sel,
+ H0_Sel => TH0_Sel,
+ L0_Sel => TL0_Sel,
+ H1_Sel => TH1_Sel,
+ L1_Sel => TL1_Sel,
+ R0 => R0,
+ R1 => R1,
+ M_Wr => TMOD_Wr,
+ H0_Wr => TH0_Wr,
+ L0_Wr => TL0_Wr,
+ H1_Wr => TH1_Wr,
+ L1_Wr => TL1_Wr,
+ Data_In => IO_WData,
+ Data_Out => IO_RData_arr(5),
+ OF0 => OF0,
+ OF1 => OF1);
+
+ IO_RData_en(5) <= TMOD_Sel or TH0_Sel or TL0_Sel or TH1_Sel or TL1_Sel;
+
+ tc2 : T51_TC2
+ generic map(
+ FastCount => 0,
+ tristate => tristate)
+ port map(
+ Clk => Clk,
+ Rst_n => Rst_n,
+ T2 => T2,
+ T2EX => T2EX,
+ C_Sel => T2CON_Sel,
+ CH_Sel => RCAP2H_Sel,
+ CL_Sel => RCAP2L_Sel,
+ H_Sel => TH2_Sel,
+ L_Sel => TL2_Sel,
+ C_Wr => T2CON_Wr,
+ CH_Wr => RCAP2H_Wr,
+ CL_Wr => RCAP2L_Wr,
+ H_Wr => TH2_Wr,
+ L_Wr => TL2_Wr,
+ Data_In => IO_WData,
+ Data_Out => IO_RData_arr(6),
+ UseR2 => UseR2,
+ UseT2 => UseT2,
+ UART_Clk => UART_Clk,
+ F => OF2);
+
+ IO_RData_en(6) <= T2CON_Sel or RCAP2H_Sel or RCAP2L_Sel or TH2_Sel or TL2_Sel;
+
+
+ uart : T51_UART
+ generic map(
+ FastCount => 0,
+ tristate => tristate)
+ port map(
+ Clk => Clk,
+ Rst_n => Rst_n,
+ UseR2 => UseR2,
+ UseT2 => UseT2,
+ BaudC2 => UART_Clk,
+ BaudC1 => OF1,
+ SC_Sel => SCON_Sel,
+ SB_Sel => SBUF_Sel,
+ SC_Wr => SCON_Wr,
+ SB_Wr => SBUF_Wr,
+ SMOD => SMOD,
+ Data_In => IO_WData,
+ Data_Out => IO_RData_arr(7),
+ RXD => RXD,
+ RXD_IsO => RXD_IsO,
+ RXD_O => RXD_O,
+ TXD => TXD,
+ RI => RI,
+ TI => TI);
+
+ IO_RData_en(7) <= SCON_Sel or SBUF_Sel;
+
+ tristate_mux: if tristate/=0 generate
+ drive: for i in 0 to ext_mux_in_num-1 generate
+ IO_RData <= IO_RData_arr(i);
+ end generate;
+ end generate;
+
+ std_mux: if tristate=0 generate
+ process(IO_RData_en,IO_RData_arr)
+ begin
+ IO_RData <= IO_RData_arr(0);
+ for i in 1 to ext_mux_in_num-1 loop
+ if IO_RData_en(i)='1' then
+ IO_RData <= IO_RData_arr(i);
+ end if;
+ end loop;
+ end process;
+ end generate;
+
+end;
diff --git a/sw/BASIC-52.asm b/sw/BASIC-52.asm
new file mode 100644
index 0000000..b975037
--- /dev/null
+++ b/sw/BASIC-52.asm
@@ -0,0 +1,7487 @@
+;*****************************************************************************
+;* *
+;* MCS BASIC-52 (tm) Source Listing *
+;* December 18, 1986 *
+;* The original source code of V1.1 (BASIC.SRC and FP52.SRC) by *
+;* Intel Corporation, Embedded Controller Operations *
+;* is public donain *
+;* *
+;*---------------------------------------------------------------------------*
+;* Alterations made by D. Wulf , December 18, 1999 *
+;* Alterations made by D. Wallner , May 4, 2002 *
+;* *
+;*****************************************************************************
+;
+; The BASIC.a51 source listing, when compiled without modification,
+; create the same object code that is found on the MCS BASIC-52
+; Version 1.1 microcontrollers but with a timing independent baud rate
+; recognition routine and a shorter ego message.
+;
+; The following alterations are made to the original source code:
+;
+; The original source code had 2 files BASIC.SRC and FP52.SRC those have
+; been incorporated into this file for ease of assembly.
+;
+; All absolute and relativ jumps and calls without labels were providet
+; with labels.
+;
+; All machine code in the original source, codet in databytes is replaced
+; by the menomics.
+;
+; One routine in the source was different to the ROM code and is replaced
+; by the ROM code.
+;
+; Daniel Wallner , May 4, 2002:
+; Part of ego message replaced with a different baud recognition routine.
+;
+;*****************************************************************************
+;
+T2CON EQU 0C8H ; This three lines are necessary for MS-DOS freeware
+TL2 EQU 0CCH ; MCS-51 Family Cross Assembler ASEM-51 V1.2
+TH2 EQU 0CDH ; from W.W. Heinz (e-mail: ww@andiunx.m.isar.de)
+;
+;*****************************************************************************
+;
+$EJECT
+ ;**************************************************************
+ ;
+ ; TRAP VECTORS TO MONITOR
+ ;
+ ; RESET TAG (0AAH) ---------2001H
+ ;
+ ; TAG LOCATION (5AH) ------ 2002H
+ ;
+ ; EXTERNAL INTERRUPT 0 ---- 2040H
+ ;
+ ; COMMAND MODE ENTRY ------ 2048H
+ ;
+ ; SERIAL PORT ------------- 2050H
+ ;
+ ; MONITOR (BUBBLE) OUTPUT - 2058H
+ ;
+ ; MONITOR (BUBBLE) INPUT -- 2060H
+ ;
+ ; MONITOR (BUBBLE) CSTS --- 2068H
+ ;
+ ; GET USER JUMP VECTOR ---- 2070H
+ ;
+ ; GET USER LOOKUP VECTOR -- 2078H
+ ;
+ ; PRINT AT VECTOR --------- 2080H
+ ;
+ ; INTERRUPT PWM ----------- 2088H
+ ;
+ ; EXTERNAL RESET ---------- 2090H
+ ;
+ ; USER OUTPUT-------------- 4030H
+ ;
+ ; USER INPUT -------------- 4033H
+ ;
+ ; USER CSTS --------------- 4036H
+ ;
+ ; USER RESET -------------- 4039H
+ ;
+ ; USER DEFINED PRINT @ --- 403CH
+ ;
+ ;***************************************************************
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; MCS - 51 - 8K BASIC VERSION 1.1
+ ;
+ ;***************************************************************
+ ;
+ AJMP CRST ;START THE PROGRAM
+ ADDC A,@R1
+ ;
+ ORG 3H
+ ;
+ ;***************************************************************
+ ;
+ ;EXTERNAL INTERRUPT 0
+ ;
+ ;***************************************************************
+ ;
+ JB DRQ,STQ ;SEE IF DMA IS SET
+ PUSH PSW ;SAVE THE STATUS
+ LJMP 4003H ;JUMP TO USER IF NOT SET
+ ;
+ ORG 0BH
+ ;
+ ;***************************************************************
+ ;
+ ;TIMER 0 OVERFLOW INTERRUPT
+ ;
+ ;***************************************************************
+ ;
+ PUSH PSW ;SAVE THE STATUS
+ JB C_BIT,STJ ;SEE IF USER WANTS INTERRUPT
+ LJMP 400BH ;EXIT IF USER WANTS INTERRUPTS
+ ;
+ ORG 13H
+ ;
+ ;***************************************************************
+ ;
+ ;EXTERNAL INTERRUPT 1
+ ;
+ ;***************************************************************
+ ;
+ JB INTBIT,STK
+ PUSH PSW
+ LJMP 4013H
+ ;
+$EJECT
+ ;
+ ORG 1BH
+ ;
+ ;***************************************************************
+ ;
+ ;TIMER 1 OVERFLOW INTERRUPT
+ ;
+ ;***************************************************************
+ ;
+ PUSH PSW
+ LJMP CKS_I
+ ;
+STJ: LJMP I_DR ;DO THE INTERRUPT
+ ;
+ ;***************************************************************
+ ;
+ ;SERIAL PORT INTERRUPT
+ ;
+ ;***************************************************************
+ ;
+ ORG 23H
+ ;
+ PUSH PSW
+ JB SPINT,STU ;SEE IF MONITOR EANTS INTERRUPT
+ LJMP 4023H
+ ;
+ ORG 2BH
+ ;
+ ;**************************************************************
+ ;
+ ;TIMER 2 OVERFLOW INTERRUPT
+ ;
+ ;**************************************************************
+ ;
+ PUSH PSW
+ LJMP 402BH
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+ ;USER ENTRY
+ ;
+ ;**************************************************************
+ ;
+ ORG 30H
+ ;
+ LJMP IBLK ;LINK TO USER BLOCK
+ ;
+STQ: JB I_T0,STS ;SEE IF MONITOR WANTS IT
+ CLR DACK
+ JNB P3.2,$ ;WAIT FOR DMA TO END
+ SETB DACK
+ RETI
+ ;
+STS: LJMP 2040H ;GO TO THE MONITOR
+ ;
+STK: SETB INTPEN ;TELL BASIC AN INTERRUPT WAS RECEIVED
+ RETI
+ ;
+STU: LJMP 2050H ;SERIAL PORT INTERRUPT
+ ;
+$EJECT
+
+;$INCLUDE(:F2:LOOK52.SRC)
+; INCLUDED BELOW
+
+ ;
+ ;**************************************************************
+ ;
+ ; This is the equate table for 8052 basic.
+ ;
+ ;**************************************************************
+ ;
+ ; The register to direct equates for CJNE instructions.
+ ;
+R0B0 EQU 0
+R1B0 EQU 1
+R2B0 EQU 2
+R3B0 EQU 3
+R4B0 EQU 4
+R5B0 EQU 5
+R6B0 EQU 6
+R7B0 EQU 7
+ ;
+ ; Register bank 1 contains the text pointer
+ ; and the arg stack pointer.
+ ;
+TXAL EQU 8 ;R0 BANK 1 = TEXT POINTER LOW
+ASTKA EQU 9 ;R1 BANK 1 = ARG STACK
+TXAH EQU 10 ;R2 BANK 1 = TEXT POINTER HIGH
+ ;
+ ; Now five temporary locations that are used by basic.
+ ;
+TEMP1 EQU 11
+TEMP2 EQU 12
+TEMP3 EQU 13
+TEMP4 EQU 14
+TEMP5 EQU 15
+ ;
+$EJECT
+ ; Register bank 2 contains the read text pointer
+ ; and the control stack pointer.
+ ;
+RTXAL EQU 16 ;R0 BANK 2 = READ TEXT POINTER LOW
+CSTKA EQU 17 ;R1 BANK 2 = CONTROL STACK POINTER
+RTXAH EQU 18 ;R2 BANK 2 = READ TEXT POINTER HIGH
+ ;
+ ; Now some internal system equates.
+ ;
+BOFAH EQU 19 ;START OF THE BASIC PROGRAM, HIGH BYTE
+BOFAL EQU 20 ;START OF THE BASIC PROGRAM, LOW BYTE
+NULLCT EQU 21 ;NULL COUNT
+PHEAD EQU 22 ;PRINT HEAD POSITION
+FORMAT EQU 23
+ ;
+ ; Register bank 3 is for the user and can be loaded
+ ; by basic
+ ;
+ ;
+ ;
+ ; Now everything else is used by basic.
+ ; First the bit locations, these use bytes 34, 35, 36, 37 and 38
+ ;
+$EJECT
+OTS BIT 16 ;34.0-ON TIME INSTRUCTION EXECUTED
+INPROG BIT 17 ;34.1-INTERRUPT IN PROCESS
+INTBIT BIT 18 ;34.2-INTERRUPT SET BIT
+ON_ERR BIT 19 ;34.3-ON ERROR EXECUTED
+OTI BIT 20 ;34.4-ON TIME INTERRUPT IN PROGRESS
+LINEB BIT 21 ;34.5-LINE CHANGE OCCURED
+INTPEN BIT 22 ;34.6-INTERRUPT PENDING BIT
+CONB BIT 23 ;34.7-CAN CONTINUE IF SET
+GTRD BIT 24 ;35.0-READ GET LOCATION
+LPB BIT 25 ;35.1-PRINT TO LINE PRINTER PORT
+CKS_B BIT 26 ;35.2-FOR PWM INTERRUPT
+COB BIT 27 ;35.3-CONSOLE OUT BIT
+ ; 0 = SERIAL PORT
+ ; 1 = LINE PRINTER
+COUB BIT 28 ;35.4-USER CONSOLE OUT BIT
+ ; 0 = SERIAL PORT
+ ; 1 = USER DRIVER
+INBIT BIT 29 ;35.5-INITIALIZATION BIT
+CIUB BIT 30 ;35.6-USER CONSOLE IN BIT
+ ; 0 = SERIAL PORT
+ ; 1 = USER ROUTINE
+SPINT BIT 31 ;35.7-SERIAL PORT INTERRUPT
+STOPBIT BIT 32 ;36.0-PROGRAM STOP ENCOUNTERED
+U_IDL BIT 33 ;36.1-USER IDLE BREAK
+INP_B BIT 34 ;36.2-SET DURING INPUT INSTRUCTION
+;DCMPXZ BIT 35 ;36.3-DCMPX ZERO FLAG
+ARGF BIT 36 ;36.4-ARG STACK HAS A VALUE
+RETBIT BIT 37 ;36.5-RET FROM INTERRUPT EXECUTED
+I_T0 BIT 38 ;36.6-TRAP INTERRUPT ZERO TO MON
+UPB BIT 39 ;36.7-SET WHEN @ IS VALID
+JKBIT BIT 40 ;37.0-WB TRIGGER
+ENDBIT BIT 41 ;37.1-GET END OF PROGRAM
+UBIT BIT 42 ;37.2-FOR DIM STATEMENT
+ISAV BIT 43 ;37.3-SAVE INTERRUPT STATUS
+BO BIT 44 ;37.4-BUBBLE OUTPUT
+XBIT BIT 45 ;37.5-EXTERNAL PROGRAM PRESENT
+C_BIT BIT 46 ;37.6-SET WHEN CLOCK RUNNING
+DIRF BIT 47 ;37.7-DIRECT INPUT MODE
+NO_C BIT 48 ;38.0-NO CONTROL C
+DRQ BIT 49 ;38.1-DMA ENABLED
+BI BIT 50 ;38.2-BUBBLE INPUT
+INTELB BIT 51 ;38.3-INTELLIGENT PROM PROGRAMMING
+C0ORX1 BIT 52 ;38.4-PRINT FROM ROM OR RAM
+CNT_S BIT 53 ;38.5-CONTROL S ENCOUNTERED
+ZSURP BIT 54 ;38.6-ZERO SUPRESS
+HMODE BIT 55 ;38.7-HEX MODE PRINT
+LP BIT P1.7 ;SOFTWARE LINE PRINTER
+DACK BIT P1.6 ;DMA ACK
+PROMV BIT P1.5 ;TURN ON PROM VOLTAGE
+PROMP BIT P1.4 ;PROM PULSE
+ALED BIT P1.3 ;ALE DISABLE
+T_BIT BIT P1.2 ;I/O TOGGLE BIT
+ ;
+$EJECT
+ ;
+ ; The next location is a bit addressable byte counter
+ ;
+BABC EQU 39
+ ;
+ ; Now floating point and the other temps
+ ;
+ ; FP Uses to locations 03CH
+ ;
+ ; Now the stack designators.
+ ;
+SPSAV EQU 3EH
+S_LEN EQU 3FH
+T_HH EQU 40H
+T_LL EQU 41H
+INTXAH EQU 42H
+INTXAL EQU 43H
+MT1 EQU 45H
+MT2 EQU 46H
+MILLIV EQU 47H ;TIMER LOCATIONS
+TVH EQU 48H
+TVL EQU 49H
+SAVE_T EQU 4AH
+SP_H EQU 4BH ;SERIAL PORT TIME OUT
+SP_L EQU 4CH
+CMNDSP EQU 4DH ;SYSTEM STACK POINTER
+RCAPH2 EQU 0CBH
+RCAPL2 EQU 0CAH
+IRAMTOP EQU 0FFH ;TOP OF RAM
+STACKTP EQU 0FEH ;ARG AND CONTROL STACK TOPS
+ ;
+ ; The character equates
+ ;
+CR EQU 0DH ;CARRIAGE RETURN
+LF EQU 0AH ;LINE FEED
+BELL EQU 07H ;BELL CHARACTER
+BS EQU 08H ;BACK SPACE
+CNTRLC EQU 03H ;CONTROL C
+CNTRLD EQU 04H ;CONTROL D
+NULL EQU 00H ;NULL
+ ;
+$EJECT
+ ;
+ ; The internal system equates
+ ;
+LINLEN EQU 73 ;THE LENGTH OF AN INPUT LINE
+EOF EQU 01 ;END OF FILE CHARACTER
+ASTKAH EQU 01 ;ASTKA IS IN PAGE 1 OF RAM
+CSTKAH EQU 00 ;CSTKA IS IN PAGE 0 OF RAM
+FTYPE EQU 01 ;CONTROL STACK "FOR"
+GTYPE EQU 02 ;CONTROL STACK "GOSUB"
+DTYPE EQU 03 ;DO-WHILE/UNTIL TYPE
+ROMADR EQU 8000H ;LOCATION OF ROM
+ ;
+ ; The floating point equates
+ ;
+FPSIZ EQU 6 ;NO. OF BYTES IN A FLOATING NUM
+DIGIT EQU FPSIZ-2 ;THE MANTISSA OF A FLOATING NUM
+STESIZ EQU FPSIZ+3 ;SIZE OF SYMBOL ADJUSTED TABLE ELEMENT
+;FP_BASE EQU 1993H ;BASE OF FLOATING POINT ROUTINES
+PSTART EQU 512 ;START OF A PROGRAM IN RAM
+FSIZE EQU FPSIZ+FPSIZ+2+2+1
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+USENT: ; User entry jump table
+ ;
+ ;**************************************************************
+ ;
+ DW CMND1 ;(00, 00H)COMMAND MODE JUMP
+ DW IFIX ;(01, 01H)CONVERT FP TO INT
+ DW PUSHAS ;(02, 02H)PUSH VALUE ONTO ARG STACK
+ DW POPAS ;(03, 03H)POP VALUE OFF ARG STACK
+ DW PG1 ;(04, 04H)PROGRAM A PROM
+ DW INLINE ;(05, 05H)INPUT A LINE
+ DW UPRNT ;(06, 06H)PRINT A LINR
+ DW CRLF ;(07, 07H)OUTPUT A CRLF
+ ;
+ ;**************************************************************
+ ;
+ ; This is the operation jump table for arithmetics
+ ;
+ ;**************************************************************
+ ;
+OPTAB: DW ALPAR ;(08, 08H)LEFT PAREN
+ DW AEXP ;(09, 09H)EXPONENTAION
+ DW AMUL ;(10, 0AH)FP MUL
+ DW AADD ;(11, 0BH)FLOATING POINT ADD
+ DW ADIV ;(12, 0CH)FLOATING POINT DIVIDE
+ DW ASUB ;(13, 0DH)FLOATING POINT SUBTRACTION
+ DW AXRL ;(14, 0EH)XOR
+ DW AANL ;(15, 0FH)AND
+ DW AORL ;(16, 10H)OR
+ DW ANEG ;(17, 11H)NEGATE
+ DW AEQ ;(18, 12H)EQUAL
+ DW AGE ;(19, 13H)GREATER THAN OR EQUAL
+ DW ALE ;(20, 14H)LESS THAN OR EQUAL
+ DW ANE ;(21, 15H)NOT EQUAL
+ DW ALT ;(22, 16H)LESS THAN
+ DW AGT ;(23, 17H)GREATER THAN
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; This is the jump table for unary operators
+ ;
+ ;***************************************************************
+ ;
+ DW AABS ;(24, 18H)ABSOLUTE VALUE
+ DW AINT ;(25, 19H)INTEGER OPERATOR
+ DW ASGN ;(26, 1AH)SIGN OPERATOR
+ DW ANOT ;(27, 1BH)ONE'S COMPLEMENT
+ DW ACOS ;(28, 1CH)COSINE
+ DW ATAN ;(29, 1DH)TANGENT
+ DW ASIN ;(30, 1EH)SINE
+ DW ASQR ;(31, 1FH)SQUARE ROOT
+ DW ACBYTE ;(32, 20H)READ CODE
+ DW AETOX ;(33, 21H)E TO THE X
+ DW AATAN ;(34, 22H)ARC TANGENT
+ DW ALN ;(35, 23H)NATURAL LOG
+ DW ADBYTE ;(36, 24H)READ DATA MEMORY
+ DW AXBYTE ;(37, 25H)READ EXTERNAL MEMORY
+ DW PIPI ;(38, 26H)PI
+ DW ARND ;(39, 27H)RANDOM NUMBER
+ DW AGET ;(40, 28H)GET INPUT CHARACTER
+ DW AFREE ;(41, 29H)COMPUTE #BYTES FREE
+ DW ALEN ;(42, 2AH) COMPUTE LEN OF PORGRAM
+ DW AXTAL ;(43, 2BH) CRYSTAL
+ DW PMTOP ;(44, 2CH)TOP OF MEMORY
+ DW ATIME ;(45, 2DH) TIME
+ DW A_IE ;(46, 2EH) IE
+ DW A_IP ;(47, 2FH) IP
+ DW ATIM0 ;(48, 30H) TIMER 0
+ DW ATIM1 ;(49, 31H) TIMER 1
+ DW ATIM2 ;(50, 32H) TIMER 2
+ DW AT2CON ;(51, 33H) T2CON
+ DW ATCON ;(52, 34H) TCON
+ DW ATMOD ;(53, 35H) ATMOD
+ DW ARCAP2 ;(54, 36H) RCAP2
+ DW AP1 ;(55, 37H) P1
+ DW APCON ;(56, 38H) PCON
+ DW EXPRB ;(57, 39H) EVALUATE AN EXPRESSION
+ DW AXTAL1 ;(58, 3AH) CALCULATE CRYSTAL
+ DW LINE ;(59, 3BH) EDIT A LINE
+ DW PP ;(60, 3CH) PROCESS A LINE
+ DW UPPL0 ;(61, 3DH) UNPROCESS A LINE
+ DW VAR ;(62, 3EH) FIND A VARIABLE
+ DW GC ;(63, 3FH) GET A CHARACTER
+ DW GCI ;(64, 40H) GET CHARACTER AND INCREMENT
+ DW INCHAR ;(65, 41H) INPUT A CHARACTER
+ DW CRUN ;(66, 42H) RUN A PROGRAM
+$EJECT
+OPBOL: DB 1 ;
+ ;
+ DB 15 ;LEFT PAREN
+ DB 14 ;EXPONENTIAN **
+ DB 10 ;MUL
+ DB 8 ;ADD
+ DB 10 ;DIVIDE
+ DB 8 ;SUB
+ DB 3 ;XOR
+ DB 5 ;AND
+ DB 4 ;OR
+ DB 12 ;NEGATE
+ DB 6 ;EQ
+ DB 6 ;GT
+ DB 6 ;LT
+ DB 6 ;NE
+ DB 6 ;LE
+ DB 6 ;GE
+ ;
+UOPBOL: DB 15 ;AABS
+ DB 15 ;AAINT
+ DB 15 ;ASGN
+ DB 15 ;ANOT
+ DB 15 ;ACOS
+ DB 15 ;ATAN
+ DB 15 ;ASIN
+ DB 15 ;ASQR
+ DB 15 ;ACBYTE
+ DB 15 ;E TO THE X
+ DB 15 ;AATAN
+ DB 15 ;NATURAL LOG
+ DB 15 ;DBYTE
+ DB 15 ;XBYTE
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; The ASCII printed messages.
+ ;
+ ;***************************************************************
+ ;
+STP: DB 'STOP"'
+ ;
+IAN: DB 'TRY AGAIN"'
+ ;
+RDYS: DB 'READY"'
+ ;
+INS: DB ' - IN LINE "'
+ ;
+ ;**************************************************************
+ ;
+ ; This is the command jump table
+ ;
+ ;**************************************************************
+ ;
+CMNDD: DW CRUN ;RUN
+ DW CLIST ;LIST
+ DW CNULL ;NULL
+ DW CNEW ;NEW
+ DW CCONT ;CONTINUE
+ DW CPROG ;PROGRAM A PROM
+ DW CXFER ;TRANSFER FROM ROM TO RAM
+ DW CRAM ;RAM MODE
+ DW CROM ;ROM MODE
+ DW CIPROG ;INTELLIGENT PROM PROGRAMMING
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; This is the statement jump table.
+ ;
+ ;**************************************************************
+ ;
+STATD: ;
+ DW SLET ;LET 80H
+ DW SCLR ;CLEAR 81H
+ DW SPUSH ;PUSH VAR 82H
+ DW SGOTO ;GO TO 83H
+ DW STONE ;TONE 84H
+ DW SPH0 ;PRINT MODE 0 85H
+ DW SUI ;USER INPUT 86H
+ DW SUO ;USER OUTPUT 87H
+ DW SPOP ;POP VAR 88H
+ DW SPRINT ;PRINT 89H
+ DW SCALL ;CALL 8AH
+ DW SDIMX ;DIMENSION 8BH
+ DW STRING ;STRING ALLO 8CH
+ DW SBAUD ;SET BAUD 8DH
+ DW SCLOCK ;CLOCK 8EH
+ DW SPH1 ;PRINT MODE 1 8FH
+ ;
+ ; No direct mode from here on
+ ;
+ DW SSTOP ;STOP 90H
+ DW SOT ;ON TIME 91H
+ DW SONEXT ;ON EXT INT 92H
+ DW SRETI ;RET FROM INT 93H
+ DW S_DO ;DO 94H
+ DW SRESTR ;RESTOR 95H
+ DW WCR ;REM 96H
+ DW SNEXT ;NEXT 97H
+ DW SONERR ;ON ERROR 98H
+ DW S_ON ;ON 99H
+ DW SINPUT ;INPUT 9AH
+ DW SREAD ;READ 9BH
+ DW FINDCR ;DATA 9CH
+ DW SRETRN ;RETURN 9DH
+ DW SIF ;IF 9EH
+ DW SGOSUB ;GOSUB 9FH
+ DW SFOR ;FOR A0H
+ DW SWHILE ;WHILE A1H
+ DW SUNTIL ;UNTIL A2H
+ DW CMND1 ;END A3H
+ DW I_DL ;IDLE A4H
+ DW ST_A ;STORE AT A5H
+ DW LD_A ;LOAD AT A6H
+ DW PGU ;PGM A7H
+ DW RROM ;RUN A ROM A9H
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+TOKTAB: ; This is the basic token table
+ ;
+ ;**************************************************************
+ ;
+ ; First the tokens for statements
+ ;
+ DB 80H ;LET TOKEN
+ DB 'LET'
+ ;
+ DB 81H ;CLEAR TOKEN
+ DB 'CLEAR'
+ ;
+ DB 82H ;PUSH TOKEN
+ DB 'PUSH'
+ ;
+T_GOTO EQU 83H
+ ;
+ DB 83H ;GO TO TOKEN
+ DB 'GOTO'
+ ;
+ DB 84H ;TOGGLE TOKEN
+ DB 'PWM'
+ ;
+ DB 85H ;PRINT HEX MODE 0
+ DB 'PH0.'
+ ;
+ DB 86H ;USER IN TOKEN
+ DB 'UI'
+ ;
+ DB 87H ;USER OUT TOKEN
+ DB 'UO'
+ ;
+ DB 88H ;POP TOKEN
+ DB 'POP'
+ ;
+$EJECT
+ DB 89H ;PRINT TOKEN
+ DB 'PRINT'
+ DB 89H
+ DB 'P.' ;P. ALSO MEANS PRINT
+ DB 89H ;? ALSO
+ DB '?'
+ ;
+ DB 8AH ;CALL TOKEN
+ DB 'CALL'
+ ;
+ DB 8BH ;DIMENSION TOKEN
+ DB 'DIM'
+ ;
+ DB 8CH ;STRING TOKEN
+ DB 'STRING'
+ ;
+ DB 8DH ;SET BAUD RATE
+ DB 'BAUD'
+ ;
+ DB 8EH ;CLOCK
+ DB 'CLOCK'
+ ;
+ DB 8FH ;PRINT HEX MODE 1
+ DB 'PH1.'
+ ;
+T_STOP EQU 90H ;STOP TOKEN
+ DB T_STOP
+ DB 'STOP'
+ ;
+T_DIR EQU T_STOP ;NO DIRECT FROM HERE ON
+ ;
+ DB T_STOP+1 ;ON TIMER INTERRUPT
+ DB 'ONTIME'
+ ;
+ DB T_STOP+2 ;ON EXTERNAL INTERRUPT
+ DB 'ONEX1'
+ ;
+ DB T_STOP+3 ;RETURN FROM INTERRUPT
+ DB 'RETI'
+ ;
+ DB T_STOP+4 ;DO TOKEN
+ DB 'DO'
+ ;
+ DB T_STOP+5 ;RESTORE TOKEN
+ DB 'RESTORE'
+ ;
+$EJECT
+T_REM EQU T_STOP+6 ;REMARK TOKEN
+ DB T_REM
+ DB 'REM'
+ ;
+ DB T_REM+1 ;NEXT TOKEN
+ DB 'NEXT'
+ ;
+ DB T_REM+2 ;ON ERROR TOKEN
+ DB 'ONERR'
+ ;
+ DB T_REM+3 ;ON TOKEN
+ DB 'ON'
+ ;
+ DB T_REM+4 ;INPUT
+ DB 'INPUT'
+ ;
+ DB T_REM+5 ;READ
+ DB 'READ'
+ ;
+T_DATA EQU T_REM+6 ;DATA
+ DB T_DATA
+ DB 'DATA'
+ ;
+ DB T_DATA+1 ;RETURN
+ DB 'RETURN'
+ ;
+ DB T_DATA+2 ;IF
+ DB 'IF'
+ ;
+T_GOSB EQU T_DATA+3 ;GOSUB
+ DB T_GOSB
+ DB 'GOSUB'
+ ;
+ DB T_GOSB+1 ;FOR
+ DB 'FOR'
+ ;
+ DB T_GOSB+2 ;WHILE
+ DB 'WHILE'
+ ;
+ DB T_GOSB+3 ;UNTIL
+ DB 'UNTIL'
+ ;
+ DB T_GOSB+4 ;END
+ DB 'END'
+ ;
+$EJECT
+T_LAST EQU T_GOSB+5 ;LAST INITIAL TOKEN
+ ;
+T_TAB EQU T_LAST ;TAB TOKEN
+ DB T_TAB
+ DB 'TAB'
+ ;
+T_THEN EQU T_LAST+1 ;THEN TOKEN
+ DB T_THEN
+ DB 'THEN'
+ ;
+T_TO EQU T_LAST+2 ;TO TOKEN
+ DB T_TO
+ DB 'TO'
+ ;
+T_STEP EQU T_LAST+3 ;STEP TOKEN
+ DB T_STEP
+ DB 'STEP'
+ ;
+T_ELSE EQU T_LAST+4 ;ELSE TOKEN
+ DB T_ELSE
+ DB 'ELSE'
+ ;
+T_SPC EQU T_LAST+5 ;SPACE TOKEN
+ DB T_SPC
+ DB 'SPC'
+ ;
+T_CR EQU T_LAST+6
+ DB T_CR
+ DB 'CR'
+ ;
+ DB T_CR+1
+ DB 'IDLE'
+ ;
+ DB T_CR+2
+ DB 'ST@'
+ ;
+ DB T_CR+3
+ DB 'LD@'
+ ;
+ DB T_CR+4
+ DB 'PGM'
+ ;
+ DB T_CR+5
+ DB 'RROM'
+ ;
+$EJECT
+ ; Operator tokens
+ ;
+T_LPAR EQU 0E0H ;LEFT PAREN
+ DB T_LPAR
+ DB '('
+ ;
+ DB T_LPAR+1 ;EXPONENTIAN
+ DB '**'
+ ;
+ DB T_LPAR+2 ;FP MULTIPLY
+ DB '*'
+ ;
+T_ADD EQU T_LPAR+3
+ DB T_LPAR+3 ;ADD TOKEN
+ DB '+'
+ ;
+ DB T_LPAR+4 ;DIVIDE TOKEN
+ DB '/'
+ ;
+T_SUB EQU T_LPAR+5 ;SUBTRACT TOKEN
+ DB T_SUB
+ DB '-'
+ ;
+ DB T_LPAR+6 ;LOGICAL EXCLUSIVE OR
+ DB '.XOR.'
+ ;
+ DB T_LPAR+7 ;LOGICAL AND
+ DB '.AND.'
+ ;
+ DB T_LPAR+8 ;LOGICAL OR
+ DB '.OR.'
+ ;
+T_NEG EQU T_LPAR+9
+ ;
+T_EQU EQU T_LPAR+10 ;EQUAL
+ DB T_EQU
+ DB '='
+ ;
+ DB T_LPAR+11 ;GREATER THAN OR EQUAL
+ DB '>='
+ ;
+ DB T_LPAR+12 ;LESS THAN OR EQUAL
+ DB '<='
+ ;
+ DB T_LPAR+13 ;NOT EQUAL
+ DB '<>'
+ ;
+ DB T_LPAR+14 ;LESS THAN
+ DB '<'
+ ;
+ DB T_LPAR+15 ;GREATER THAN
+ DB '>'
+ ;
+ ;
+T_UOP EQU 0B0H ;UNARY OP BASE TOKEN
+ ;
+ DB T_UOP ;ABS TOKEN
+ DB 'ABS'
+ ;
+ DB T_UOP+1 ;INTEGER TOKEN
+ DB 'INT'
+ ;
+ DB T_UOP+2 ;SIGN TOKEN
+ DB 'SGN'
+ ;
+ DB T_UOP+3 ;GET TOKEN
+ DB 'NOT'
+ ;
+ DB T_UOP+4 ;COSINE TOKEN
+ DB 'COS'
+ ;
+ DB T_UOP+5 ;TANGENT TOKEN
+ DB 'TAN'
+ ;
+ DB T_UOP+6 ;SINE TOKEN
+ DB 'SIN'
+ ;
+ DB T_UOP+7 ;SQUARE ROOT TOKEN
+ DB 'SQR'
+ ;
+ DB T_UOP+8 ;CBYTE TOKEN
+ DB 'CBY'
+ ;
+ DB T_UOP+9 ;EXP (E TO THE X) TOKEN
+ DB 'EXP'
+ ;
+ DB T_UOP+10
+ DB 'ATN'
+ ;
+ DB T_UOP+11
+ DB 'LOG'
+ ;
+ DB T_UOP+12 ;DBYTE TOKEN
+ DB 'DBY'
+ ;
+ DB T_UOP+13 ;XBYTE TOKEN
+ DB 'XBY'
+ ;
+T_ULAST EQU T_UOP+14 ;LAST OPERATOR NEEDING PARENS
+ ;
+ DB T_ULAST
+ DB 'PI'
+ ;
+ DB T_ULAST+1 ;RND TOKEN
+ DB 'RND'
+ ;
+ DB T_ULAST+2 ;GET TOKEN
+ DB 'GET'
+ ;
+ DB T_ULAST+3 ;FREE TOKEN
+ DB 'FREE'
+ ;
+ DB T_ULAST+4 ;LEN TOKEN
+ DB 'LEN'
+ ;
+T_XTAL EQU T_ULAST+5 ;CRYSTAL TOKEN
+ DB T_XTAL
+ DB 'XTAL'
+ ;
+T_MTOP EQU T_ULAST+6 ;MTOP
+ DB T_MTOP
+ DB 'MTOP'
+ ;
+T_IE EQU T_ULAST+8 ;IE REGISTER
+ DB T_IE
+ DB 'IE'
+ ;
+T_IP EQU T_ULAST+9 ;IP REGISTER
+ DB T_IP
+ DB 'IP'
+ ;
+TMR0 EQU T_ULAST+10 ;TIMER 0
+ DB TMR0
+ DB 'TIMER0'
+ ;
+TMR1 EQU T_ULAST+11 ;TIMER 1
+ DB TMR1
+ DB 'TIMER1'
+ ;
+TMR2 EQU T_ULAST+12 ;TIMER 2
+ DB TMR2
+ DB 'TIMER2'
+ ;
+T_TIME EQU T_ULAST+7 ;TIME
+ DB T_TIME
+ DB 'TIME'
+ ;
+TT2C EQU T_ULAST+13 ;T2CON
+ DB TT2C
+ DB 'T2CON'
+ ;
+TTC EQU T_ULAST+14 ;TCON
+ DB TTC
+ DB 'TCON'
+ ;
+TTM EQU T_ULAST+15 ;TMOD
+ DB TTM
+ DB 'TMOD'
+ ;
+TRC2 EQU T_ULAST+16 ;RCAP2
+ DB TRC2
+ DB 'RCAP2'
+ ;
+T_P1 EQU T_ULAST+17 ;P1
+ DB T_P1
+ DB 'PORT1'
+ ;
+T_PC EQU T_ULAST+18 ;PCON
+ DB T_PC
+ DB 'PCON'
+ ;
+T_ASC EQU T_ULAST+19 ;ASC TOKEN
+ DB T_ASC
+ DB 'ASC('
+ ;
+T_USE EQU T_ULAST+20 ;USING TOKEN
+ DB T_USE
+ DB 'USING('
+ DB T_USE
+ DB 'U.('
+ ;
+T_CHR EQU T_ULAST+21 ;CHR TOKEN
+ DB T_CHR
+ DB 'CHR('
+ ;
+$EJECT
+T_CMND EQU 0F0H ;COMMAND BASE
+ ;
+ DB 0F0H ;RUN TOKEN
+ DB 'RUN'
+ ;
+ DB 0F1H ;LIST TOKEN
+ DB 'LIST'
+ ;
+ DB 0F2H ;NULL TOKEN
+ DB 'NULL'
+ ;
+ DB 0F3H ;NEW TOKEN
+ DB 'NEW'
+ ;
+ DB 0F4H ;CONTINUE TOKEN
+ DB 'CONT'
+ ;
+ DB 0F5H ;PROGRAM TOKEN
+ DB 'PROG'
+ ;
+ DB 0F6H ;TRANSFER TOKEN
+ DB 'XFER'
+ ;
+ DB 0F7H ;RAM MODE
+ DB 'RAM'
+ ;
+ DB 0F8H ;ROM MODE
+ DB 'ROM'
+ ;
+ DB 0F9H ;INTELLIGENT PROM PROGRAMMING
+ DB 'FPROG'
+ ;
+ DB 0FFH ;END OF TABLE
+ ;
+
+; END OF INCLUDE LOOK52
+;$INCLUDE(:F2:LOOK52.SRC)
+ ;
+EIG: DB 'EXTRA IGNORED"'
+ ;
+EXA: DB 'A-STACK"'
+ ;
+EXC: DB 'C-STACK"'
+ ;
+$EJECT
+;$INCLUDE(:F2:BAS52.RST)
+; BEGINNING
+
+ ;**************************************************************
+ ;
+CRST: ; This performs system initialzation, it was moved here so the
+ ; new power on reset functions could be tested in an 8751.
+ ;
+ ;**************************************************************
+ ;
+ ; First, initialize SFR's
+ ;
+ MOV SCON,#5AH ;INITIALIZE SFR'S
+ MOV TMOD,#10H
+ MOV TCON,#54H
+ MOV T2CON,#34H
+; DB 75H ;MOV DIRECT, # OP CODE
+; DB 0C8H ;T2CON LOCATION
+; DB 34H ;CONFIGURATION BYTE
+ ;
+ MOV DPTR,#2001H ;READ CODE AT 2001H
+ CLR A
+ MOVC A,@A+DPTR
+ CJNE A,#0AAH,CRST1 ;IF IT IS AN AAH, DO USER RESET
+ LCALL 2090H
+ ;
+CRST1: MOV R0,#IRAMTOP ;PUT THE TOP OF RAM IN R0
+ CLR A ;ZERO THE ACC
+ ;
+CRST2: MOV @R0,A ;CLEAR INTERNAL MEMORY
+ DJNZ R0,CRST2 ;LOOP TIL DONE
+ ;
+ ; Now, test the external memory
+ ;
+ MOV SPSAV,#CMNDSP ;SET UP THE STACK
+ MOV SP,SPSAV
+ ;
+ MOV BOFAH,#HIGH ROMADR
+ MOV BOFAL,#LOW ROMADR+17
+ MOV DPTR,#ROMADR ;GET THE BYTE AT 8000H
+ MOVX A,@DPTR
+ CLR C
+ SUBB A,#31H ;FOR BIAS
+ MOV MT1,A ;SAVE IN DIRECT MATH LOC
+ CLR ACC.2 ;SAVE FOR RESET
+ MOV R7,A ;SAVE IT IN R7
+ INC DPTR
+ ACALL L31DPI ;SAVE BAUD RATE
+ LCALL RCL
+ INC DPTR ;GET MEMTOP
+ ACALL L31DPI
+ MOV DPTR,#5FH ;READ THE EXTERNAL BYTE
+ MOVX A,@DPTR
+ MOV DPTR,#0 ;ESTABLISH BASE FOR CLEAR
+ CJNE A,#0A5H,CRS
+ MOV A,MT1
+ CLR ACC.0 ;CLEAR BIT ONE
+ XRL A,#4H
+ JZ CR2
+ ;
+CRS: CJNE R7,#2,CRS1
+ SJMP CRS2
+CRS1: CJNE R7,#3,CR0
+CRS2: ACALL CL_1
+ SJMP CR1
+ ;
+CR0: MOV R3,DPH ;SAVE THE DPTR
+ MOV R1,DPL
+ INC DPTR
+ MOV A,#5AH
+ MOVX @DPTR,A
+ MOVX A,@DPTR
+ CJNE A,#5AH,CR1
+ CLR A
+ MOVX @DPTR,A
+ CJNE R3,#0E0H,CR0
+ ;
+CR1: CJNE R3,#03H,CR11 ;NEED THIS MUCH RAM
+CR11: JC CRST
+ MOV DPTR,#MEMTOP ;SAVE MEMTOP
+ ACALL S31DP2 ;SAVE MEMTOP AND SEED RCELL
+ ACALL CNEW ;CLEAR THE MEMORY AND SET UP POINTERS
+ ;
+CR2: ACALL RC1 ;SET UP STACKS IF NOT DONE
+ ;
+ LCALL AXTAL0 ;DO THE CRYSTAL
+ MOV A,MT1 ;GET THE RESET BYTE
+ CJNE A,#5,CR20
+ LCALL 4039H
+CR20: JNC BG1 ;CHECK FOR 0,1,2,3, OR 4
+ JNB ACC.0,BG3 ;NO RUN IF WRONG TYPE
+ MOV DPTR,#ROMADR+16
+ MOVX A,@DPTR ;READ THE BYTE
+ CJNE A,#55H,BG3
+ LJMP CRUN
+
+ ; START OF BAUD RATE MODIFICATIONS BY DANIEL WALLNER
+
+BG1: CLR A ;DO BAUD RATE
+ MOV R3,A
+ MOV R1,A
+ MOV TL2,A
+ CLR T2CON.2
+ JB RXD,$ ;LOOP UNTIL A CHARACTER IS RECEIVED
+ MOV T2CON,#5
+ CALL TIB2
+ JNB RXD,$
+ MOV T2CON,#34H
+ CALL RCL ;LOAD THE TIMER
+ NOP
+ NOP
+
+ ; END OF BAUD RATE MODIFICATIONS BY DANIEL WALLNER
+
+
+BG3: MOV DPTR,#S_N ;GET THE MESSAGE
+ ACALL CRP ;PRINT IT
+ LJMP CRAM
+
+; END
+;$INCLUDE(:F2:BAS52.RST)
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; CIPROG AND CPROG - Program a prom
+ ;
+ ;***************************************************************
+ ;
+;$INCLUDE(:F2:BAS52.PGM)
+;BEGINNING
+
+PG8: MOV R7,#00H ;PROGRAM ONE BYTE AT A TIME
+ MOV R6,#01H
+ MOV R2,#HIGH ROMADR-1
+ MOV R0,#LOW ROMADR-1;LOAD PROM ADDRESS
+ ACALL PG101
+ INC R6
+ MOV A,RCAPH2
+; DB 0E5H ;MOV A DIRECT OP CODE
+; DB 0CBH ;ADDRESS OF R2CAP HIGH
+ ACALL PG101
+ MOV A,RCAPL2
+; DB 0E5H ;MOV A, DIRECT OP CODE
+; DB 0CAH ;R2CAP LOW
+ MOV R6,#3
+ MOV R1,#LOW MEMTOP-1
+ MOV R3,#HIGH MEMTOP
+ ACALL PG101 ;SAVE MEMTOP
+ SJMP PGR
+ ;
+CIPROG: MOV DPTR,#IPROGS ;LOAD IPROG LOCATION
+ SETB INTELB
+ SJMP CPROG1 ;GO DO PROG
+ ;
+CPROG: MOV DPTR,#PROGS ;LOAD PROG LOCATION
+ CLR INTELB
+ ;
+CPROG1: ACALL LD_T ;LOAD THE TIMER
+ CLR PROMV ;TURN ON THE PROM VOLTAGE
+ CALL DELTST ;SEE IF A CR
+ JNZ PG8 ;SAVE TIMER IF SO
+ MOV R4,#0FEH
+ SETB INBIT
+ ACALL ROMFD ;GET THE ROM ADDRESS OF THE LAST LOCATION
+ CALL TEMPD ;SAVE THE ADDRESS
+ MOV A,R4 ;GET COUNT
+ CPL A
+ CALL TWO_R2 ;PUT IT ON THE STACK
+ CALL FP_BASE7 ;OUTPUT IT
+ ACALL CCAL ;GET THE PROGRAM
+ ACALL CRLF ;DO CRLF
+ MOV R0,TEMP4 ;GET ADDRESS
+ MOV R2,TEMP5
+ MOV A,#55H ;LOAD SIGNIFIER
+ INC R6 ;LOAD LEN + 1
+ CJNE R6,#00,CPROG2
+ INC R7
+CPROG2: ACALL PG102
+ ;
+$EJECT
+PGR: SETB PROMV
+ AJMP C_K
+ ;
+PG1: MOV P2,R3 ;GET THE BYTE TO PROGRAM
+ MOVX A,@R1
+PG101: LCALL INC3210 ;BUMP POINTERS
+PG102: MOV R5,#1 ;SET UP INTELLIGENT COUMTER
+ ;
+PG2: MOV R4,A ;SAVE THE BYTE IN R4
+ ACALL PG7 ;PROGRAM THE BYTE
+ ACALL PG9
+ JB INTELB,PG4 ;SEE IF INTELLIGENT PROGRAMMING
+ ;
+PG3: XRL A,R4
+ JNZ PG6 ;ERROR IF NOT THE SAME
+ CALL DEC76 ;BUMP THE COUNTERS
+ JNZ PG1 ;LOOP IF NOT DONE
+ ANL PSW,#11100111B ;INSURE RB0
+PG31: RET
+ ;
+PG4: XRL A,R4 ;SEE IF PROGRAMMED
+ JNZ PG5 ;JUMP IF NOT
+ MOV A,R4 ;GET THE DATA BACK
+ ACALL PG7 ;PROGRAM THE LOCATION
+PG41: ACALL ZRO ;AGAIN
+ ACALL ZRO ;AND AGAIN
+ ACALL ZRO ;AND AGAIN
+ DJNZ R5,PG41 ;KEEP DOING IT
+ ACALL PG9 ;RESET PROG
+ SJMP PG3 ;FINISH THE LOOP
+ ;
+PG5: INC R5 ;BUMP THE COUNTER
+ MOV A,R4 ;GET THE BYTE
+ CJNE R5,#25,PG2 ;SEE IF TRIED 25 TIMES
+ ;
+PG6: SETB PROMV ;TURN OFF PROM VOLTAGE
+ MOV PSW,#0 ;INSURE RB0
+ JNB DIRF,PG31 ;EXIT IF IN RUN MODE
+ MOV DPTR,#E16X ;PROGRAMMING ERROR
+ ;
+ERRLK: LJMP ERROR ;PROCESS THE ERROR
+ ;
+$EJECT
+PG7: MOV P0,R0 ;SET UP THE PORTS
+ MOV P2,R2 ;LATCH LOW ORDER ADDRESS
+ ACALL PG11 ;DELAY FOR 8748/9
+ CLR ALED
+ MOV P0,A ;PUT DATA ON THE PORT
+ ;
+ZRO: NOP ;SETTLEING TIME + FP ZERO
+ NOP
+ NOP
+ NOP
+ NOP
+ NOP
+ ACALL PG11 ;DELAY A WHILE
+ CLR PROMP ;START PROGRAMMING
+ ACALL TIMER_LOAD ;START THE TIMER
+ JNB TF1,$ ;WAIT FOR PART TO PROGRAM
+ RET ;EXIT
+ ;
+PG9: SETB PROMP
+ ACALL PG11 ;DELAY FOR A WHILE
+ JNB P3.2,$ ;LOOP FOR EEPROMS
+ MOV P0,#0FFH
+ CLR P3.7 ;LOWER READ
+ ACALL PG11
+ MOV A,P0 ;READ THE PORT
+ SETB P3.7
+ SETB ALED
+ RET
+ ;
+PG11: MOV TEMP5,#12 ;DELAY 30uS AT 12 MHZ
+ DJNZ TEMP5,$
+ RET
+ ;
+
+;END
+;$INCLUDE(:F2:BAS52.PGM)
+$EJECT
+ ;**************************************************************
+ ;
+PGU: ;PROGRAM A PROM FOR THE USER
+ ;
+ ;**************************************************************
+ ;
+ CLR PROMV ;TURN ON THE VOLTAGE
+ MOV PSW,#00011000B ;SELECT RB3
+ ACALL PG1 ;DO IT
+ SETB PROMV ;TURN IT OFF
+ RET
+ ;
+ ;
+ ;*************************************************************
+ ;
+CCAL: ; Set up for prom moves
+ ; R3:R1 gets source
+ ; R7:R6 gets # of bytes
+ ;
+ ;*************************************************************
+ ;
+ ACALL GETEND ;GET THE LAST LOCATION
+ INC DPTR ;BUMP TO LOAD EOF
+ MOV R3,BOFAH
+ MOV R1,BOFAL ;RESTORE START
+ CLR C ;PREPARE FOR SUBB
+ MOV A,DPL ;SUB DPTR - BOFA > R7:R6
+ SUBB A,R1
+ MOV R6,A
+ MOV A,DPH
+ SUBB A,R3
+ MOV R7,A
+CCAL1: RET
+ ;
+ ;
+;$INCLUDE(:F2:BAS52.TL)
+;BEGINNING
+
+ ;**************************************************************
+ ;
+TIMER_LOAD:; Load the timer
+ ;
+ ;*************************************************************
+ ;
+ ACALL CCAL1 ;DELAY FOUR CLOCKS
+TIMER_LOAD1:
+ CLR TR1 ;STOP IT WHILE IT'S LOADED
+ MOV TH1,T_HH
+ MOV TL1,T_LL
+ CLR TF1 ;CLEAR THE OVERFLOW FLAG
+ SETB TR1 ;START IT NOW
+ RET
+ ;
+
+;END
+;$INCLUDE(:F2:BAS52.TL)
+$EJECT
+ ;***************************************************************
+ ;
+CROM: ; The command action routine - ROM - Run out of rom
+ ;
+ ;***************************************************************
+ ;
+ CLR CONB ;CAN'T CONTINUE IF MODE CHANGE
+ ACALL RO1 ;DO IT
+ ;
+C_K: LJMP CL3 ;EXIT
+ ;
+;RO1: CALL INTGER ;SEE IF INTGER PRESENT
+; MOV R4,R0B0 ;SAVE THE NUMBER
+; JNC $+4
+; MOV R4,#01H ;ONE IF NO INTEGER PRESENT
+; CALL ROMFD ;FIND THE PROGRAM
+; ACALL ROMFD ;FIND THE PROGRAM
+
+RO1: CALL DELTST
+ MOV R4,#1
+ JNC RO11
+ CALL ONE
+ MOV R4,A
+RO11: ACALL ROMFD
+ CJNE R4,#0,RFX ;EXIT IF R4 <> 0
+ INC DPTR ;BUMP PAST TAG
+ MOV BOFAH,DPH ;SAVE THE ADDRESS
+ MOV BOFAL,DPL
+ RET
+ ;
+ROMFD: MOV DPTR,#ROMADR+16 ;START OF USER PROGRAM
+ ;
+RF1: MOVX A,@DPTR ;GET THE BYTE
+ CJNE A,#55H,RF3 ;SEE IF PROPER TAG
+ DJNZ R4,RF2 ;BUMP COUNTER
+ ;
+RFX: RET ;DPTR HAS THE START ADDRESS
+ ;
+RF2: INC DPTR ;BUMP PAST TAG
+ ACALL G5
+ INC DPTR ;BUMP TO NEXT PROGRAM
+ SJMP RF1 ;DO IT AGAIN
+ ;
+RF3: JBC INBIT,RFX ;EXIT IF SET
+ ;
+NOGO: MOV DPTR,#NOROM
+ AJMP ERRLK
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+L20DPI: ; load R2:R0 with the location the DPTR is pointing to
+ ;
+ ;***************************************************************
+ ;
+ MOVX A,@DPTR
+ MOV R2,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV R0,A
+ RET ;DON'T BUMP DPTR
+ ;
+ ;***************************************************************
+ ;
+X31DP: ; swap R3:R1 with DPTR
+ ;
+ ;***************************************************************
+ ;
+ XCH A,R3
+ XCH A,DPH
+ XCH A,R3
+ XCH A,R1
+ XCH A,DPL
+ XCH A,R1
+ RET
+ ;
+ ;***************************************************************
+ ;
+LD_T: ; Load the timer save location with the value the DPTR is
+ ; pointing to.
+ ;
+ ;****************************************************************
+ ;
+ MOVX A,@DPTR
+ MOV T_HH,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV T_LL,A
+ RET
+ ;
+$EJECT
+ ;
+ ;***************************************************************
+ ;
+ ;GETLIN - FIND THE LOCATION OF THE LINE NUMBER IN R3:R1
+ ; IF ACC = 0 THE LINE WAS NOT FOUND I.E. R3:R1
+ ; WAS TOO BIG, ELSE ACC <> 0 AND THE DPTR POINTS
+ ; AT THE LINE THAT IS GREATER THAN OR EQUAL TO THE
+ ; VALUE IN R3:R1.
+ ;
+ ;***************************************************************
+ ;
+GETEND: SETB ENDBIT ;GET THE END OF THE PROGRAM
+ ;
+GETLIN: CALL DP_B ;GET BEGINNING ADDRESS
+ ;
+G1: CALL B_C
+ JZ G3 ;EXIT WITH A ZERO IN A IF AT END
+ INC DPTR ;POINT AT THE LINE NUMBER
+ JB ENDBIT,G2 ;SEE IF WE WANT TO FIND THE END
+ ACALL DCMPX ;SEE IF (DPTR) = R3:R1
+ ACALL DECDP ;POINT AT LINE COUNT
+ MOVX A,@DPTR ;PUT LINE LENGTH INTO ACC
+ JB UBIT,G3 ;EXIT IF EQUAL
+ JC G3 ;SEE IF LESS THAN OR ZERO
+ ;
+G2: ACALL ADDPTR ;ADD IT TO DPTR
+ SJMP G1 ;LOOP
+ ;
+G3: CLR ENDBIT ;RESET ENDBIT
+ RET ;EXIT
+ ;
+G4: MOV DPTR,#PSTART ;DO RAM
+ ;
+G5: SETB ENDBIT
+ SJMP G1 ;NOW DO TEST
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; LDPTRI - Load the DATA POINTER with the value it is pointing
+ ; to - DPH = (DPTR) , DPL = (DPTR+1)
+ ;
+ ; acc gets wasted
+ ;
+ ;***************************************************************
+ ;
+LDPTRI: MOVX A,@DPTR ;GET THE HIGH BYTE
+ PUSH ACC ;SAVE IT
+ INC DPTR ;BUMP THE POINTER
+ MOVX A,@DPTR ;GET THE LOW BYTE
+ MOV DPL,A ;PUT IT IN DPL
+ POP DPH ;GET THE HIGH BYTE
+ RET ;GO BACK
+ ;
+ ;***************************************************************
+ ;
+ ;L31DPI - LOAD R3 WITH (DPTR) AND R1 WITH (DPTR+1)
+ ;
+ ;ACC GETS CLOBBERED
+ ;
+ ;***************************************************************
+ ;
+L31DPI: MOVX A,@DPTR ;GET THE HIGH BYTE
+ MOV R3,A ;PUT IT IN THE REG
+ INC DPTR ;BUMP THE POINTER
+ MOVX A,@DPTR ;GET THE NEXT BYTE
+ MOV R1,A ;SAVE IT
+ RET
+ ;
+ ;***************************************************************
+ ;
+ ;DECDP - DECREMENT THE DATA POINTER - USED TO SAVE SPACE
+ ;
+ ;***************************************************************
+ ;
+DECDP2: ACALL DECDP
+ ;
+DECDP: XCH A,DPL ;GET DPL
+ JNZ DECDP1 ;BUMP IF ZERO
+ DEC DPH
+DECDP1: DEC A ;DECREMENT IT
+ XCH A,DPL ;GET A BACK
+ RET ;EXIT
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ;DCMPX - DOUBLE COMPARE - COMPARE (DPTR) TO R3:R1
+ ;R3:R1 - (DPTR) = SET CARRY FLAG
+ ;
+ ;IF R3:R1 > (DPTR) THEN C = 0
+ ;IF R3:R1 < (DPTR) THEN C = 1
+ ;IF R3:R1 = (DPTR) THEN C = 0
+ ;
+ ;***************************************************************
+ ;
+DCMPX: CLR UBIT ;ASSUME NOT EQUAL
+ MOVX A,@DPTR ;GET THE BYTE
+ CJNE A,R3B0,D1 ;IF A IS GREATER THAN R3 THEN NO CARRY
+ ;WHICH IS R3<@DPTR = NO CARRY AND
+ ;R3>@DPTR CARRY IS SET
+ INC DPTR ;BUMP THE DATA POINTER
+ MOVX A,@DPTR ;GET THE BYTE
+ ACALL DECDP ;PUT DPTR BACK
+ CJNE A,R1B0,D1 ;DO THE COMPARE
+ CPL C ;FLIP CARRY
+ ;
+ CPL UBIT ;SET IT
+D1: CPL C ;GET THE CARRY RIGHT
+ RET ;EXIT
+ ;
+ ;***************************************************************
+ ;
+ ; ADDPTR - Add acc to the dptr
+ ;
+ ; acc gets wasted
+ ;
+ ;***************************************************************
+ ;
+ADDPTR: ADD A,DPL ;ADD THE ACC TO DPL
+ MOV DPL,A ;PUT IT IN DPL
+ JNC ADDPTR1 ;JUMP IF NO CARRY
+ INC DPH ;BUMP DPH
+ADDPTR1:RET ;EXIT
+ ;
+$EJECT
+ ;*************************************************************
+ ;
+LCLR: ; Set up the storage allocation
+ ;
+ ;*************************************************************
+ ;
+ ACALL ICLR ;CLEAR THE INTERRUPTS
+ ACALL G4 ;PUT END ADDRESS INTO DPTR
+ MOV A,#6 ;ADJUST MATRIX SPACE
+ ACALL ADDPTR ;ADD FOR PROPER BOUNDS
+ ACALL X31DP ;PUT MATRIX BOUNDS IN R3:R1
+ MOV DPTR,#MT_ALL ;SAVE R3:R1 IN MATRIX FREE SPACE
+ ACALL S31DP ;DPTR POINTS TO MEMTOP
+ ACALL L31DPI ;LOAD MEMTOP INTO R3:R1
+ MOV DPTR,#STR_AL ;GET MEMORY ALLOCATED FOR STRINGS
+ ACALL LDPTRI
+ CALL DUBSUB ;R3:R1 = MEMTOP - STRING ALLOCATION
+ MOV DPTR,#VARTOP ;SAVE R3:R1 IN VARTOP
+ ;
+ ; FALL THRU TO S31DP2
+ ;
+ ;***************************************************************
+ ;
+ ;S31DP - STORE R3 INTO (DPTR) AND R1 INTO (DPTR+1)
+ ;
+ ;ACC GETS CLOBBERED
+ ;
+ ;***************************************************************
+ ;
+S31DP2: ACALL S31DP ;DO IT TWICE
+ ;
+S31DP: MOV A,R3 ;GET R3 INTO ACC
+ MOVX @DPTR,A ;STORE IT
+ INC DPTR ;BUMP DPTR
+ MOV A,R1 ;GET R1
+ MOVX @DPTR,A ;STORE IT
+ INC DPTR ;BUMP IT AGAIN TO SAVE PROGRAM SPACE
+ RET ;GO BACK
+ ;
+ ;
+ ;***************************************************************
+ ;
+STRING: ; Allocate memory for strings
+ ;
+ ;***************************************************************
+ ;
+ LCALL TWO ;R3:R1 = NUMBER, R2:R0 = LEN
+ MOV DPTR,#STR_AL ;SAVE STRING ALLOCATION
+ ACALL S31DP
+ INC R6 ;BUMP
+ MOV S_LEN,R6 ;SAVE STRING LENGTH
+ AJMP RCLEAR ;CLEAR AND SET IT UP
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; F_VAR - Find the variable in symbol table
+ ; R7:R6 contain the variable name
+ ; If not found create a zero entry and set the carry
+ ; R2:R0 has the address of variable on return
+ ;
+ ;***************************************************************
+ ;
+F_VAR: MOV DPTR,#VARTOP ;PUT VARTOP IN DPTR
+ ACALL LDPTRI
+ ACALL DECDP2 ;ADJUST DPTR FOR LOOKUP
+ ;
+F_VAR0: MOVX A,@DPTR ;LOAD THE VARIABLE
+ JZ F_VAR2 ;TEST IF AT THE END OF THE TABLE
+ INC DPTR ;BUMP FOR NEXT BYTE
+ CJNE A,R7B0,F_VAR1 ;SEE IF MATCH
+ MOVX A,@DPTR ;LOAD THE NAME
+ CJNE A,R6B0,F_VAR1
+ ;
+ ; Found the variable now adjust and put in R2:R0
+ ;
+DLD: MOV A,DPL ;R2:R0 = DPTR-2
+ SUBB A,#2
+ MOV R0,A
+ MOV A,DPH
+ SUBB A,#0 ;CARRY IS CLEARED
+ MOV R2,A
+ RET
+ ;
+F_VAR1: MOV A,DPL ;SUBTRACT THE STACK SIZE+ADJUST
+ CLR C
+ SUBB A,#STESIZ
+ MOV DPL,A ;RESTORE DPL
+ JNC F_VAR0
+ DEC DPH
+ SJMP F_VAR0 ;CONTINUE COMPARE
+ ;
+$EJECT
+ ;
+ ; Add the entry to the symbol table
+ ;
+F_VAR2: LCALL R76S ;SAVE R7 AND R6
+ CLR C
+ ACALL DLD ;BUMP THE POINTER TO GET ENTRY ADDRESS
+ ;
+ ; Adjust pointer and save storage allocation
+ ; and make sure we aren't wiping anything out
+ ; First calculate new storage allocation
+ ;
+ MOV A,R0
+ SUBB A,#STESIZ-3 ;NEED THIS MUCH RAM
+ MOV R1,A
+ MOV A,R2
+ SUBB A,#0
+ MOV R3,A
+ ;
+ ; Now save the new storage allocation
+ ;
+ MOV DPTR,#ST_ALL
+ CALL S31DP ;SAVE STORAGE ALLOCATION
+ ;
+ ; Now make sure we didn't blow it, by wiping out MT_ALL
+ ;
+ ACALL DCMPX ;COMPARE STORAGE ALLOCATION
+ JC CCLR3 ;ERROR IF CARRY
+ SETB C ;DID NOT FIND ENTRY
+ RET ;EXIT IF TEST IS OK
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; Command action routine - NEW
+ ;
+ ;***************************************************************
+ ;
+CNEW: MOV DPTR,#PSTART ;SAVE THE START OF PROGRAM
+ MOV A,#EOF ;END OF FILE
+ MOVX @DPTR,A ;PUT IT IN MEMORY
+ ;
+ ; falls thru
+ ;
+ ;*****************************************************************
+ ;
+ ; The statement action routine - CLEAR
+ ;
+ ;*****************************************************************
+ ;
+CNEW1: CLR LINEB ;SET UP FOR RUN AND GOTO
+ ;
+RCLEAR: ACALL LCLR ;CLEAR THE INTERRUPTS, SET UP MATRICES
+ MOV DPTR,#MEMTOP ;PUT MEMTOP IN R3:R1
+ ACALL L31DPI
+ ACALL G4 ;DPTR GETS END ADDRESS
+ ACALL CL_1 ;CLEAR THE MEMORY
+ ;
+RC1: MOV DPTR,#STACKTP ;POINT AT CONTROL STACK TOP
+ CLR A ;CONTROL UNDERFLOW
+ ;
+RC2: MOVX @DPTR,A ;SAVE IN MEMORY
+ MOV CSTKA,#STACKTP
+ MOV ASTKA,#STACKTP
+ CLR CONB ;CAN'T CONTINUE
+ RET
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; Loop until the memory is cleared
+ ;
+ ;***************************************************************
+ ;
+CL_1: INC DPTR ;BUMP MEMORY POINTER
+ CLR A ;CLEAR THE MEMORY
+ MOVX @DPTR,A ;CLEAR THE RAM
+ MOVX A,@DPTR ;READ IT
+ JNZ CCLR3 ;MAKE SURE IT IS CLEARED
+ MOV A,R3 ;GET POINTER FOR COMPARE
+ CJNE A,DPH,CL_1 ;SEE TO LOOP
+ MOV A,R1 ;NOW TEST LOW BYTE
+ CJNE A,DPL,CL_1
+ ;
+CL_2: RET
+ ;
+CCLR3: JMP TB ;ALLOCATED MEMORY DOESN'T EXSIST
+ ;
+ ;**************************************************************
+ ;
+SCLR: ;Entry point for clear return
+ ;
+ ;**************************************************************
+ ;
+ CALL DELTST ;TEST FOR A CR
+ JNC RCLEAR
+ CALL GCI1 ;BUMP THE TEST POINTER
+ CJNE A,#'I',RC1 ;SEE IF I, ELSE RESET THE STACK
+ ;
+ ;**************************************************************
+ ;
+ICLR: ; Clear interrupts and system garbage
+ ;
+ ;**************************************************************
+ ;
+ JNB INTBIT,ICLR1 ;SEE IF BASIC HAS INTERRUPTS
+ CLR EX1 ;IF SO, CLEAR INTERRUPTS
+ICLR1: ANL 34,#00100000B ;SET INTERRUPTS + CONTINUE
+ RETI
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ;OUTPUT ROUTINES
+ ;
+ ;***************************************************************
+ ;
+CRLF2: ACALL CRLF ;DO TWO CRLF'S
+ ;
+CRLF: MOV R5,#CR ;LOAD THE CR
+ ACALL TEROT ;CALL TERMINAL OUT
+ MOV R5,#LF ;LOAD THE LF
+ AJMP TEROT ;OUTPUT IT AND RETURN
+ ;
+ ;PRINT THE MESSAGE ADDRESSED IN ROM OR RAM BY THE DPTR
+ ;ENDS WITH THE CHARACTER IN R4
+ ;DPTR HAS THE ADDRESS OF THE TERMINATOR
+ ;
+CRP: ACALL CRLF ;DO A CR THEN PRINT ROM
+ ;
+ROM_P: CLR A ;CLEAR A FOR LOOKUP
+ MOVC A,@A+DPTR ;GET THE CHARACTER
+ CLR ACC.7 ;CLEAR MS BIT
+ CJNE A,#'"',ROM_P1 ;EXIT IF TERMINATOR
+ RET
+ROM_P1: SETB C0ORX1
+ ;
+PN1: MOV R5,A ;OUTPUT THE CHARACTER
+ ACALL TEROT
+ INC DPTR ;BUMP THE POINTER
+ SJMP PN0
+ ;
+UPRNT: ACALL X31DP
+ ;
+PRNTCR: MOV R4,#CR ;OUTPUT UNTIL A CR
+ ;
+PN0: JBC C0ORX1,ROM_P
+ MOVX A,@DPTR ;GET THE RAM BYTE
+ JZ PN01
+ CJNE A,R4B0,PN02 ;SEE IF THE SAME AS TERMINATOR
+PN01: RET ;EXIT IF THE SAME
+PN02: CJNE A,#CR,PN1 ;NEVER PRINT A CR IN THIS ROUTINE
+ LJMP E1XX ;BAD SYNTAX
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; INLINE - Input a line to IBUF, exit when a CR is received
+ ;
+ ;***************************************************************
+ ;
+INL2: CJNE A,#CNTRLD,INL2B ;SEE IF A CONTROL D
+ ;
+INL0: ACALL CRLF ;DO A CR
+ ;
+INLINE: MOV P2,#HIGH IBUF ;IBUF IS IN THE ZERO PAGE
+ MOV R0,#LOW IBUF ;POINT AT THE INPUT BUFFER
+ ;
+INL1: ACALL INCHAR ;GET A CHARACTER
+ MOV R5,A ;SAVE IN R5 FOR OUTPUT
+ CJNE A,#7FH,INL2 ;SEE IF A DELETE CHARACTER
+ CJNE R0,#LOW IBUF,INL6
+INL11: MOV R5,#BELL ;OUTPUT A BELL
+ ;
+INLX: ACALL TEROT ;OUTPUT CHARACTER
+ SJMP INL1 ;DO IT AGAIN
+ ;
+INL2B: MOVX @R0,A ;SAVE THE CHARACTER
+ CJNE A,#CR,INL2B1 ;IS IT A CR
+ AJMP CRLF ;OUTPUT A CRLF AND EXIT
+INL2B1: CJNE A,#20H,INL2B2
+INL2B2: JC INLX ;ONLY ECHO CONTROL CHARACTERS
+ INC R0 ;BUMP THE POINTER
+ CJNE R0,#IBUF+79,INLX
+ DEC R0 ;FORCE 79
+ SJMP INL11 ;OUTPUT A BELL
+ ;
+INL6: DEC R0 ;DEC THE RAM POINTER
+ MOV R5,#BS ;OUTPUT A BACK SPACE
+ ACALL TEROT
+ ACALL STEROT ;OUTPUT A SPACE
+ MOV R5,#BS ;ANOTHER BACK SPACE
+ SJMP INLX ;OUTPUT IT
+ ;
+PTIME: DB 128-2 ; PROM PROGRAMMER TIMER
+ DB 00H
+ DB 00H
+ DB 50H
+ DB 67H
+ DB 41H
+ ;
+$EJECT
+;$INCLUDE(:F2:BAS52.OUT)
+;BEGINNING
+ ;***************************************************************
+ ;
+ ; TEROT - Output a character to the system console
+ ; update PHEAD position.
+ ;
+ ;***************************************************************
+ ;
+STEROT: MOV R5,#' ' ;OUTPUT A SPACE
+ ;
+TEROT: PUSH ACC ;SAVE THE ACCUMULATOR
+ PUSH DPH ;SAVE THE DPTR
+ PUSH DPL
+TEROT01:JNB CNT_S,TEROT02 ;WAIT FOR A CONTROL Q
+ ACALL BCK ;GET SERIAL STATUS
+ SJMP TEROT01
+TEROT02:MOV A,R5 ;PUT OUTPUT BYTE IN A
+ JNB BO,TEROT03 ;CHECK FOR MONITOR
+ LCALL 2040H ;DO THE MONITOR
+ AJMP TEROT1 ;CLEAN UP
+TEROT03:JNB COUB,TEROT04 ;SEE IF USER WANTS OUTPUT
+ LCALL 4030H
+ AJMP TEROT1
+TEROT04:JNB UPB,T_1 ;NO AT IF NO XBIT
+ JNB LPB,T_1 ;AT PRINT
+ LCALL 403CH ;CALL AT LOCATION
+ AJMP TEROT1 ;FINISH OFF OUTPUT
+ ;
+T_1: JNB COB,TXX ;SEE IF LIST SET
+ MOV DPTR,#SPV ;LOAD BAUD RATE
+ ACALL LD_T
+ CLR LP ;OUTPUT START BIT
+ ACALL TIMER_LOAD ;LOAD AND START THE TIMER
+ MOV A,R5 ;GET THE OUTPUT BYTE
+ SETB C ;SET CARRY FOR LAST OUTPUT
+ MOV R5,#9 ;LOAD TIMER COUNTDOWN
+ ;
+LTOUT1: RRC A ;ROTATE A
+ JNB TF1,$ ;WAIT TILL TIMER READY
+ MOV LP,C ;OUTPUT THE BIT
+ ACALL TIMER_LOAD ;DO THE NEXT BIT
+ DJNZ R5,LTOUT1 ;LOOP UNTIL DONE
+ JNB TF1,$ ;FIRST STOP BIT
+ ACALL TIMER_LOAD
+ JNB TF1,$ ;SECOND STOP BIT
+ MOV R5,A ;RESTORE R5
+ SJMP TEROT1 ;BACK TO TEROT
+ ;
+$EJECT
+TXX: JNB TI,$ ;WAIT FOR TRANSMIT READY
+ CLR TI
+ MOV SBUF,R5 ;SEND OUT THE CHARACTER
+ ;
+TEROT1: CJNE R5,#CR,TEROT11 ;SEE IF A CR
+ MOV PHEAD,#00H ;IF A CR, RESET PHEAD AND
+ ;
+TEROT11:CJNE R5,#LF,NLC ;SEE IF A LF
+ MOV A,NULLCT ;GET THE NULL COUNT
+ JZ NLC ;NO NULLS IF ZERO
+ ;
+TEROT2: MOV R5,#NULL ;PUT THE NULL IN THE OUTPUT REGISTER
+ ACALL TEROT ;OUTPUT THE NULL
+ DEC A ;DECREMENT NULL COUNT
+ JNZ TEROT2 ;LOOP UNTIL DONE
+ ;
+NLC: CJNE R5,#BS,NLC1 ;DEC PHEAD IF A BACKSPACE
+ DEC PHEAD
+NLC1: CJNE R5,#20H,NLC2 ;IS IT A PRINTABLE CHARACTER?
+NLC2: JC NLC3 ;DON'T INCREMENT PHEAD IF NOT PRINTABLE
+ INC PHEAD ;BUMP PRINT HEAD
+NLC3: POP DPL ;RESTORE DPTR
+ POP DPH
+ POP ACC ;RESTORE ACC
+ RET ;EXIT
+ ;
+
+;END
+;$INCLUDE(:F2:BAS52.OUT)
+ ;
+BCK: ACALL CSTS ;CHECK STATUS
+ JNC CI_RET1 ;EXIT IF NO CHARACTER
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ;INPUTS A CHARACTER FROM THE SYSTEM CONSOLE.
+ ;
+ ;***************************************************************
+ ;
+INCHAR: JNB BI,INCHAR1 ;CHECK FOR MONITOR (BUBBLE)
+ LCALL 2060H
+ SJMP INCH1
+INCHAR1:JNB CIUB,INCHAR2 ;CHECK FOR USER
+ LCALL 4033H
+ SJMP INCH1
+INCHAR2:JNB RI,$ ;WAIT FOR RECEIVER READY.
+ MOV A,SBUF
+ CLR RI ;RESET READY
+ CLR ACC.7 ;NO BIT 7
+ ;
+INCH1: CJNE A,#13H,INCH11
+ SETB CNT_S
+INCH11: CJNE A,#11H,INCH12
+ CLR CNT_S
+INCH12: CJNE A,#CNTRLC,INCH13
+ JNB NO_C,C_EX ;TRAP NO CONTROL C
+ RET
+ ;
+INCH13: CLR JKBIT
+ CJNE A,#17H,CI_RET ;CONTROL W
+ SETB JKBIT
+ ;
+CI_RET: SETB C ;CARRY SET IF A CHARACTER
+CI_RET1:RET ;EXIT
+ ;
+ ;*************************************************************
+ ;
+ ;RROM - The Statement Action Routine RROM
+ ;
+ ;*************************************************************
+ ;
+RROM: SETB INBIT ;SO NO ERRORS
+ ACALL RO1 ;FIND THE LINE NUMBER
+ JBC INBIT,CRUN
+ RET ;EXIT
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+CSTS: ; RETURNS CARRY = 1 IF THERE IS A CHARACTER WAITING FROM
+ ; THE SYSTEM CONSOLE. IF NO CHARACTER THE READY CHARACTER
+ ; WILL BE CLEARED
+ ;
+ ;***************************************************************
+ ;
+ JNB BI,CSTS1 ;BUBBLE STATUS
+ LJMP 2068H
+CSTS1: JNB CIUB,CSTS2 ;SEE IF EXTERNAL CONSOLE
+ LJMP 4036H
+CSTS2: MOV C,RI
+ RET
+ ;
+C_EX0: MOV DPTR,#WB ;EGO MESSAGE
+ ACALL ROM_P
+ ;
+C_EX: CLR CNT_S ;NO OUTPUT STOP
+ LCALL SPRINT1 ;ASSURE CONSOLE
+ ACALL CRLF
+ JBC JKBIT,C_EX0
+ ;
+ JNB DIRF,SSTOP0
+ AJMP C_K ;CLEAR COB AND EXIT
+ ;
+T_CMP: MOV A,TVH ;COMPARE TIMER TO SP_H AND SP_L
+ MOV R1,TVL
+ CJNE A,TVH,T_CMP
+ XCH A,R1
+ SUBB A,SP_L
+ MOV A,R1
+ SUBB A,SP_H
+ RET
+ ;
+ ;*************************************************************
+ ;
+BR0: ; Trap the timer interrupt
+ ;
+ ;*************************************************************
+ ;
+ CALL T_CMP ;COMPARE TIMER
+ JC BCHR1 ;EXIT IF TEST FAILS
+ SETB OTI ;DOING THE TIMER INTERRUPT
+ CLR OTS ;CLEAR TIMER BIT
+ MOV C,INPROG ;SAVE IN PROGRESS
+ MOV ISAV,C
+ MOV DPTR,#TIV
+ SJMP BR2
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; The command action routine - RUN
+ ;
+ ;***************************************************************
+ ;
+CRUN: LCALL CNEW1 ;CLEAR THE STORAGE ARRAYS
+ ACALL SRESTR1 ;GET THE STARTING ADDRESS
+ ACALL B_C
+ JZ CMNDLK ;IF NULL GO TO COMMAND MODE
+ ;
+ ACALL T_DP
+ ACALL B_TXA ;BUMP TO STARTING LINE
+ ;
+CILOOP: ACALL SP0 ;DO A CR AND A LF
+CILOOP1:CLR DIRF ;NOT IN DIRECT MODE
+ ;
+ ;INTERPERTER DRIVER
+ ;
+ILOOP: MOV SP,SPSAV ;RESTORE THE STACK EACH TIME
+ JB DIRF,ILOOP1 ;NO INTERRUPTS IF IN DIRECT MODE
+ MOV INTXAH,TXAH ;SAVE THE TEXT POINTER
+ MOV INTXAL,TXAL
+ILOOP1: LCALL BCK ;GET CONSOLE STATUS
+ JB DIRF,I_L ;DIRECT MODE
+ ANL C,/GTRD ;SEE IF CHARACTER READY
+ JNC BCHR ;NO CHARACTER = NO CARRY
+ ;
+ ; DO TRAP OPERATION
+ ;
+ MOV DPTR,#GTB ;SAVE TRAP CHARACTER
+ MOVX @DPTR,A
+ SETB GTRD ;SAYS READ A BYTE
+ ;
+BCHR: JB OTI,I_L ;EXIT IF TIMER INTERRUPT IN PROGRESS
+ JB OTS,BR0 ;TEST TIMER VALUE IF SET
+BCHR1: JNB INTPEN,I_L ;SEE IF INTERRUPT PENDING
+ JB INPROG,I_L ;DON'T DO IT AGAIN IF IN PROGRESS
+ MOV DPTR,#INTLOC ;POINT AT INTERRUPT LOCATION
+ ;
+BR2: MOV R4,#GTYPE ;SETUP FOR A FORCED GOSUB
+ ACALL SGS1 ;PUT TXA ON STACK
+ SETB INPROG ;INTERRUPT IN PROGRESS
+ ;
+ERL4: CALL L20DPI
+ AJMP D_L1 ;GET THE LINE NUMBER
+ ;
+I_L: ACALL ISTAT ;LOOP
+ ACALL CLN_UP ;FINISH IT OFF
+ JNC ILOOP ;LOOP ON THE DRIVER
+ JNB DIRF,CMNDLK ;CMND1 IF IN RUN MODE
+ LJMP CMNDR ;DON'T PRINT READY
+ ;
+CMNDLK: JMP CMND1 ;DONE
+$EJECT
+ ;**************************************************************
+ ;
+ ; The Statement Action Routine - STOP
+ ;
+ ;**************************************************************
+ ;
+SSTOP: ACALL CLN_UP ;FINISH OFF THIS LINE
+ MOV INTXAH,TXAH ;SAVE TEXT POINTER FOR CONT
+ MOV INTXAL,TXAL
+ ;
+SSTOP0: SETB CONB ;CONTINUE WILL WORK
+ MOV DPTR,#STP ;PRINT THE STOP MESSAGE
+ SETB STOPBIT ;SET FOR ERROR ROUTINE
+ JMP ERRS ;JUMP TO ERROR ROUTINE
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+ ; ITRAP - Trap special function register operators
+ ;
+ ;**************************************************************
+ ;
+ITRAP: CJNE A,#TMR0,ITRAP1 ;TIMER 0
+ MOV TH0,R3
+ MOV TL0,R1
+ RET
+ ;
+ITRAP1: CJNE A,#TMR1,ITRAP2 ;TIMER 1
+ MOV TH1,R3
+ MOV TL1,R1
+ RET
+ ;
+ITRAP2: CJNE A,#TMR2,ITRAP3 ;TIMER 2
+ MOV TH2,R3
+ MOV TL2,R1
+; DB 8BH ;MOV R3 DIRECT OP CODE
+; DB 0CDH ;T2H LOCATION
+; DB 89H ;MOV R1 DIRECT OP CODE
+; DB 0CCH ;T2L LOCATION
+ RET
+ ;
+ITRAP3: CJNE A,#TRC2,RCL1 ;RCAP2 TOKEN
+RCL: MOV RCAPH2,R3
+ MOV RCAPL2,R1
+; DB 8BH ;MOV R3 DIRECT OP CODE
+; DB 0CBH ;RCAP2H LOCATION
+; DB 89H ;MOV R1 DIRECT OP CODE
+; DB 0CAH ;RCAP2L LOCATION
+ RET
+ ;
+RCL1: ACALL R3CK ;MAKE SURE THAT R3 IS ZERO
+ CJNE A,#TT2C,RCL2
+ MOV T2CON,R1
+; DB 89H ;MOV R1 DIRECT OP CODE
+; DB 0C8H ;T2CON LOCATION
+ RET
+ ;
+RCL2: CJNE A,#T_IE,RCL3 ;IE TOKEN
+ MOV IE,R1
+ RET
+ ;
+RCL3: CJNE A,#T_IP,RCL4 ;IP TOKEN
+ MOV IP,R1
+ RET
+ ;
+RCL4: CJNE A,#TTC,RCL5 ;TCON TOKEN
+ MOV TCON,R1
+ RET
+ ;
+RCL5: CJNE A,#TTM,RCL6 ;TMOD TOKEN
+ MOV TMOD,R1
+ RET
+ ;
+RCL6: CJNE A,#T_P1,T_T2 ;P1 TOKEN
+ MOV P1,R1
+ RET
+ ;
+ ;***************************************************************
+ ;
+ ; T_TRAP - Trap special operators
+ ;
+ ;***************************************************************
+ ;
+T_T: MOV TEMP5,A ;SAVE THE TOKEN
+ ACALL GCI1 ;BUMP POINTER
+ ACALL SLET2 ;EVALUATE AFTER =
+ MOV A,TEMP5 ;GET THE TOKEN BACK
+ CJNE A,#T_XTAL,T_T01
+ LJMP AXTAL1 ;SET UP CRYSTAL
+ ;
+T_T01: ACALL IFIXL ;R3:R1 HAS THE TOS
+ MOV A,TEMP5 ;GET THE TOKEN AGAIN
+ CJNE A,#T_MTOP,T_T1 ;SEE IF MTOP TOKEN
+ MOV DPTR,#MEMTOP
+ CALL S31DP
+ JMP RCLEAR ;CLEAR THE MEMORY
+ ;
+T_T1: CJNE A,#T_TIME,ITRAP ;SEE IF A TIME TOKEN
+ MOV C,EA ;SAVE INTERRUPTS
+ CLR EA ;NO TIMER 0 INTERRUPTS DURING LOAD
+ MOV TVH,R3 ;SAVE THE TIME
+ MOV TVL,R1
+ MOV EA,C ;RESTORE INTERRUPTS
+ RET ;EXIT
+ ;
+T_T2: CJNE A,#T_PC,INTERX ;PCON TOKEN
+ MOV PCON,R1
+; DB 89H ;MOV DIRECT, R1 OP CODE
+; DB 87H ;ADDRESS OF PCON
+ RET ;EXIT
+ ;
+T_TRAP: CJNE A,#T_ASC,T_T ;SEE IF ASC TOKEN
+ ACALL IGC ;EAT IT AND GET THE NEXT CHARACTER
+ CJNE A,#'$',INTERX ;ERROR IF NOT A STRING
+ ACALL CSY ;CALCULATE ADDRESS
+ ACALL X3120
+ CALL TWO_EY
+ ACALL SPEOP1 ;EVALUATE AFTER EQUALS
+ AJMP ISTAX1 ;SAVE THE CHARACTER
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+ ;INTERPERT THE STATEMENT POINTED TO BY TXAL AND TXAH
+ ;
+ ;**************************************************************
+ ;
+ISTAT: ACALL GC ;GET THR FIRST CHARACTER
+ JNB XBIT,IAT ;TRAP TO EXTERNAL RUN PACKAGE
+ CJNE A,#20H,ISTAT1
+ISTAT1: JNC IAT
+ LCALL 2070H ;LET THE USER SET UP THE DPTR
+ ACALL GCI1
+ ANL A,#0FH ;STRIP OFF BIAS
+ SJMP ISTA1
+ ;
+IAT: CJNE A,#T_XTAL,IAT1
+IAT1: JNC T_TRAP
+ JNB ACC.7,SLET ;IMPLIED LET IF BIT 7 NOT SET
+ CJNE A,#T_UOP+12,ISTAX ;DBYTE TOKEN
+ ACALL SPEOP ;EVALUATE SPECIAL OPERATOR
+ ACALL R3CK ;CHECK LOCATION
+ MOV @R1,A ;SAVE IT
+ RET
+ ;
+ISTAX: CJNE A,#T_UOP+13,ISTAY ;XBYTE TOKEN
+ ACALL SPEOP
+ ;
+ISTAX1: MOV P2,R3
+ MOVX @R1,A
+ RET
+ ;
+ISTAY: CJNE A,#T_CR+1,ISTAY1;TRAP NEW OPERATORS
+ISTAY1: JC I_S
+ CJNE A,#0B0H,ISTAY2 ;SEE IF TOO BIG
+ISTAY2: JNC INTERX
+ ADD A,#0F9H ;BIAS FOR LOOKUP TABLE
+ SJMP ISTA0 ;DO THE OPERATION
+ ;
+I_S: CJNE A,#T_LAST,I_S1 ;MAKE SURE AN INITIAL RESERVED WORD
+I_S1: JC INTERX1 ;ERROR IF NOT
+ ;
+INTERX: LJMP E1XX ;SYNTAX ERROR
+ ;
+INTERX1:JNB DIRF,ISTA0 ;EXECUTE ALL STATEMENTS IF IN RUN MODE
+ CJNE A,#T_DIR,INTERX2;SEE IF ON TOKEN
+INTERX2:JC ISTA0 ;OK IF DIRECT
+ CJNE A,#T_GOSB+1,INTERX3;SEE IF FOR
+ SJMP ISTA0 ;FOR IS OK
+INTERX3:CJNE A,#T_REM+1,INTERX4 ;NEXT IS OK
+ SJMP ISTA0
+INTERX4:CJNE A,#T_STOP+6,INTERX ;SO IS REM
+ ;
+$EJECT
+ISTA0: ACALL GCI1 ;ADVANCE THE TEXT POINTER
+ MOV DPTR,#STATD ;POINT DPTR TO LOOKUP TABLE
+ CJNE A,#T_GOTO-3,ISTA01;SEE IF LET TOKEN
+ SJMP ISTAT ;WASTE LET TOKEN
+ISTA01: ANL A,#3FH ;STRIP OFF THE GARBAGE
+ ;
+ISTA1: RL A ;ROTATE FOR OFFSET
+ ADD A,DPL ;BUMP
+ MOV DPL,A ;SAVE IT
+ CLR A
+ MOVC A,@A+DPTR ;GET HIGH BYTE
+ PUSH ACC ;SAVE IT
+ INC DPTR
+ CLR A
+ MOVC A,@A+DPTR ;GET LOW BYTE
+ POP DPH
+ MOV DPL,A
+ ;
+AC1: CLR A
+ JMP @A+DPTR ;GO DO IT
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; The statement action routine - LET
+ ;
+ ;***************************************************************
+ ;
+SLET: ACALL S_C ;CHECK FOR POSSIBLE STRING
+ JC SLET0 ;NO STRING
+ CLR LINEB ;USED STRINGS
+ ;
+ CALL X31DP ;PUT ADDRESS IN DPTR
+ MOV R7,#T_EQU ;WASTE =
+ ACALL EATC
+ ACALL GC ;GET THE NEXT CHARACTER
+ CJNE A,#'"',S_3 ;CHECK FOR A "
+ MOV R7,S_LEN ;GET THE STRING LENGTH
+ ;
+S_0: ACALL GCI1 ;BUMP PAST "
+ ACALL DELTST ;CHECK FOR DELIMITER
+ JZ INTERX ;EXIT IF CARRIAGE RETURN
+ MOVX @DPTR,A ;SAVE THE CHARACTER
+ CJNE A,#'"',S_1 ;SEE IF DONE
+ ;
+S_E: MOV A,#CR ;PUT A CR IN A
+ MOVX @DPTR,A ;SAVE CR
+ AJMP GCI1
+ ;
+S_3: PUSH DPH
+ PUSH DPL ;SAVE DESTINATION
+ ACALL S_C ;CALCULATE SOURCE
+ JC INTERX ;ERROR IF CARRY
+ POP R0B0 ;GET DESTINATION BACK
+ POP R2B0
+ ;
+SSOOP: MOV R7,S_LEN ;SET UP COUNTER
+ ;
+S_4: CALL TBYTE ;TRANSFER THE BYTE
+ CJNE A,#CR,S_41 ;EXIT IF A CR
+ RET
+S_41: DJNZ R7,S_5 ;BUMP COUNTER
+ MOV A,#CR ;SAVE A CR
+ MOVX @R0,A
+ AJMP EIGP ;PRINT EXTRA IGNORED
+ ;
+$EJECT
+ ;
+S_5: CALL INC3210 ;BUMP POINTERS
+ SJMP S_4 ;LOOP
+ ;
+S_1: DJNZ R7,S_11 ;SEE IF DONE
+ ACALL S_E
+ ACALL EIGP ;PRINT EXTRA IGNORED
+ AJMP FINDCR ;GO FIND THE END
+S_11: INC DPTR ;BUMP THE STORE POINTER
+ SJMP S_0 ;CONTINUE TO LOOP
+ ;
+E3XX: MOV DPTR,#E3X ;BAD ARG ERROR
+ AJMP EK
+ ;
+SLET0: ACALL SLET1
+ AJMP POPAS ;COPY EXPRESSION TO VARIABLE
+ ;
+SLET1: ACALL VAR_ER ;CHECK FOR A"VARIABLE"
+ ;
+SLET2: PUSH R2B0 ;SAVE THE VARIABLE ADDRESS
+ PUSH R0B0
+ MOV R7,#T_EQU ;GET EQUAL TOKEN
+ ACALL WE
+ POP R1B0 ;POP VARIABLE TO R3:R1
+ POP R3B0
+ RET ;EXIT
+ ;
+R3CK: CJNE R3,#00H,E3XX ;CHECK TO SEE IF R3 IS ZERO
+ RET
+ ;
+SPEOP: ACALL GCI1 ;BUMP TXA
+ ACALL P_E ;EVALUATE PAREN
+SPEOP1: ACALL SLET2 ;EVALUATE AFTER =
+ CALL TWOL ;R7:R6 GETS VALUE, R3:R1 GETS LOCATION
+ MOV A,R6 ;SAVE THE VALUE
+ ;
+ CJNE R7,#00H,E3XX ;R2 MUST BE = 0
+ RET
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+ ; ST_CAL - Calculate string Address
+ ;
+ ;**************************************************************
+ ;
+IST_CAL:;
+ ;
+ ACALL I_PI ;BUMP TEXT, THEN EVALUATE
+ ACALL R3CK ;ERROR IF R3 <> 0
+ INC R1 ;BUMP FOR OFFSET
+ MOV A,R1 ;ERROR IF R1 = 255
+ JZ E3XX
+ MOV DPTR,#VARTOP ;GET TOP OF VARIABLE STORAGE
+ MOV B,S_LEN ;MULTIPLY FOR LOCATION
+ ACALL VARD ;CALCULATE THE LOCATION
+ MOV DPTR,#MEMTOP ;SEE IF BLEW IT
+ CALL FUL1
+ MOV DPL,S_LEN ;GET STRING LENGTH, DPH = 00H
+ DEC DPH ;DPH = 0
+ ;
+DUBSUB: CLR C
+ MOV A,R1
+ SUBB A,DPL
+ MOV R1,A
+ MOV A,R3
+ SUBB A,DPH
+ MOV R3,A
+ ORL A,R1
+ RET
+ ;
+ ;***************************************************************
+ ;
+ ;VARD - Calculate the offset base
+ ;
+ ;***************************************************************
+ ;
+VARB: MOV B,#FPSIZ ;SET UP FOR OPERATION
+ ;
+VARD: CALL LDPTRI ;LOAD DPTR
+ MOV A,R1 ;MULTIPLY BASE
+ MUL AB
+ ADD A,DPL
+ MOV R1,A
+ MOV A,B
+ ADDC A,DPH
+ MOV R3,A
+ RET
+ ;
+$EJECT
+ ;*************************************************************
+ ;
+CSY: ; Calculate a biased string address and put in R3:R1
+ ;
+ ;*************************************************************
+ ;
+ ACALL IST_CAL ;CALCULATE IT
+ PUSH R3B0 ;SAVE IT
+ PUSH R1B0
+ MOV R7,#',' ;WASTE THE COMMA
+ ACALL EATC
+ ACALL ONE ;GET THE NEXT EXPRESSION
+ MOV A,R1 ;CHECK FOR BOUNDS
+ CJNE A,S_LEN,CSY1
+CSY1: JNC E3XX ;MUST HAVE A CARRY
+ DEC R1 ;BIAS THE POINTER
+ POP ACC ;GET VALUE LOW
+ ADD A,R1 ;ADD IT TO BASE
+ MOV R1,A ;SAVE IT
+ POP R3B0 ;GET HIGH ADDRESS
+ JNC CSY2 ;PROPAGATE THE CARRY
+ INC R3
+CSY2: AJMP ERPAR ;WASTE THE RIGHT PAREN
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; The statement action routine FOR
+ ;
+ ;***************************************************************
+ ;
+SFOR: ACALL SLET1 ;SET UP CONTROL VARIABLE
+ PUSH R3B0 ;SAVE THE CONTROL VARIABLE LOCATION
+ PUSH R1B0
+ ACALL POPAS ;POP ARG STACK AND COPY CONTROL VAR
+ MOV R7,#T_TO ;GET TO TOKEN
+ ACALL WE
+ ACALL GC ;GET NEXT CHARACTER
+ CJNE A,#T_STEP,SF2
+ ACALL GCI1 ;EAT THE TOKEN
+ ACALL EXPRB ;EVALUATE EXPRESSION
+ SJMP SF21 ;JUMP OVER
+ ;
+SF2: LCALL PUSH_ONE ;PUT ONE ON THE STACK
+ ;
+SF21: MOV A,#-FSIZE ;ALLOCATE FSIZE BYTES ON THE CONTROL STACK
+ ACALL PUSHCS ;GET CS IN R0
+ ACALL CSC ;CHECK CONTROL STACK
+ MOV R3,#CSTKAH ;IN CONTROL STACK
+ MOV R1,R0B0 ;STACK ADDRESS
+ ACALL POPAS ;PUT STEP ON STACK
+ ACALL POPAS ;PUT LIMIT ON STACK
+ ACALL DP_T ;DPTR GETS TEXT
+ MOV R0,R1B0 ;GET THE POINTER
+ ACALL T_X_S ;SAVE THE TEXT
+ POP TXAL ;GET CONTROL VARIABLE
+ POP TXAH
+ MOV R4,#FTYPE ;AND THE TYPE
+ ACALL T_X_S ;SAVE IT
+ ;
+SF3: ACALL T_DP ;GET THE TEXT POINTER
+ AJMP ILOOP ;CONTINUE TO PROCESS
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+ ; The statement action routines - PUSH and POP
+ ;
+ ;**************************************************************
+ ;
+SPUSH: ACALL EXPRB ;PUT EXPRESSION ON STACK
+ ACALL C_TST ;SEE IF MORE TO DO
+ JNC SPUSH ;IF A COMMA PUSH ANOTHER
+ RET
+ ;
+ ;
+SPOP: ACALL VAR_ER ;GET VARIABLE
+ ACALL XPOP ;FLIP THE REGISTERS FOR POPAS
+ ACALL C_TST ;SEE IF MORE TO DO
+ JNC SPOP
+ ;
+SPOP1: RET
+ ;
+ ;***************************************************************
+ ;
+ ; The statement action routine - IF
+ ;
+ ;***************************************************************
+ ;
+SIF: ACALL RTST ;EVALUATE THE EXPRESSION
+ MOV R1,A ;SAVE THE RESULT
+ ACALL GC ;GET THE CHARACTER AFTER EXPR
+ CJNE A,#T_THEN,SIF1 ;SEE IF THEN TOKEN
+ ACALL GCI1 ;WASTE THEN TOKEN
+SIF1: CJNE R1,#0,T_F1 ;CHECK R_OP RESULT
+ ;
+E_FIND: MOV R7,#T_ELSE ;FIND ELSE TOKEN
+ ACALL FINDC
+ JZ SPOP1 ;EXIT IF A CR
+ ACALL GCI1 ;BUMP PAST TOKEN
+ CJNE A,#T_ELSE,E_FIND;WASTE IF NO ELSE
+ ;
+T_F1: ACALL INTGER ;SEE IF NUMBER
+ JNC D_L1 ;EXECUTE LINE NUMBER
+ AJMP ISTAT ;EXECUTE STATEMENT IN NOT
+ ;
+B_C: MOVX A,@DPTR
+ DEC A
+ JB ACC.7,FL11
+ RET
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; The statement action routine - GOTO
+ ;
+ ;***************************************************************
+ ;
+SGOTO: ACALL RLINE ;R2:R0 AND DPTR GET INTGER
+ ;
+SGT1: ACALL T_DP ;TEXT POINTER GETS DPTR
+ ;
+ JBC RETBIT,SGT2 ;SEE IF RETI EXECUTED
+ ;
+ JNB LINEB,SGT11 ;SEE IF A LINE WAS EDITED
+ LCALL CNEW1 ;CLEAR THE MEMORY IF SET
+SGT11: AJMP CILOOP1 ;CLEAR DIRF AND LOOP
+ ;
+SGT2: JBC OTI,SGT21 ;SEE IF TIMER INTERRUPT
+ ANL 34,#10111101B ;CLEAR INTERRUPTS
+ AJMP ILOOP ;EXECUTE
+SGT21: MOV C,ISAV
+ MOV INPROG,C
+ AJMP ILOOP ;RESTORE INTERRUPTS AND RET
+ ;
+ ;
+ ;*************************************************************
+ ;
+RTST: ; Test for ZERO
+ ;
+ ;*************************************************************
+ ;
+ ACALL EXPRB ;EVALUATE EXPRESSION
+ CALL INC_ASTKA ;BUMP ARG STACK
+ JZ RTST1 ;EXIT WITH ZERO OR 0FFH
+ MOV A,#0FFH
+RTST1: RET
+ ;
+$EJECT
+ ;
+ ;**************************************************************
+ ;
+ ; GLN - get the line number in R2:R0, return in DPTR
+ ;
+ ;**************************************************************
+ ;
+GLN: ACALL DP_B ;GET THE BEGINNING ADDRESS
+ ;
+FL1: MOVX A,@DPTR ;GET THE LENGTH
+ MOV R7,A ;SAVE THE LENGTH
+ DJNZ R7,FL3 ;SEE IF END OF FILE
+ ;
+FL11: MOV DPTR,#E10X ;NO LINE NUMBER
+ AJMP EK ;HANDLE THE ERROR
+ ;
+FL3: JB ACC.7,FL11 ;CHECK FOR BIT 7
+ INC DPTR ;POINT AT HIGH BYTE
+ MOVX A,@DPTR ;GET HIGH BYTE
+ CJNE A,R2B0,FL2 ;SEE IF MATCH
+ INC DPTR ;BUMP TO LOW BYTE
+ DEC R7 ;ADJUST AGAIN
+ MOVX A,@DPTR ;GET THE LOW BYTE
+ CJNE A,R0B0,FL2 ;SEE IF LOW BYTE MATCH
+ INC DPTR ;POINT AT FIRST CHARACTER
+ RET ;FOUND IT
+ ;
+FL2: MOV A,R7 ;GET THE LENGTH COUNTER
+ CALL ADDPTR ;ADD A TO DATA POINTER
+ SJMP FL1 ;LOOP
+ ;
+ ;
+ ;*************************************************************
+ ;
+ ;RLINE - Read in ASCII string, get line, and clean it up
+ ;
+ ;*************************************************************
+ ;
+RLINE: ACALL INTERR ;GET THE INTEGER
+ ;
+RL1: ACALL GLN
+ AJMP CLN_UP
+ ;
+ ;
+D_L1: ACALL GLN ;GET THE LINE
+ AJMP SGT1 ;EXECUTE THE LINE
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; The statement action routines WHILE and UNTIL
+ ;
+ ;***************************************************************
+ ;
+SWHILE: ACALL RTST ;EVALUATE RELATIONAL EXPRESSION
+ CPL A
+ SJMP S_WU
+ ;
+SUNTIL: ACALL RTST ;EVALUATE RELATIONAL EXPRESSION
+ ;
+S_WU: MOV R4,#DTYPE ;DO EXPECTED
+ MOV R5,A ;SAVE R_OP RESULT
+ SJMP SR0 ;GO PROCESS
+ ;
+ ;
+ ;***************************************************************
+ ;
+CNULL: ; The Command Action Routine - NULL
+ ;
+ ;***************************************************************
+ ;
+ ACALL INTERR ;GET AN INTEGER FOLLOWING NULL
+ MOV NULLCT,R0 ;SAVE THE NULLCOUNT
+ AJMP CMNDLK ;JUMP TO COMMAND MODE
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; The statement action routine - RETI
+ ;
+ ;***************************************************************
+ ;
+SRETI: SETB RETBIT ;SAYS THAT RETI HAS BEEN EXECUTED
+ ;
+ ;***************************************************************
+ ;
+ ; The statement action routine - RETURN
+ ;
+ ;***************************************************************
+ ;
+SRETRN: MOV R4,#GTYPE ;MAKE SURE OF GOSUB
+ MOV R5,#55H ;TYPE RETURN TYPE
+ ;
+SR0: ACALL CSETUP ;SET UP CONTROL STACK
+ MOVX A,@R0 ;GET RETURN TEXT ADDRESS
+ MOV DPH,A
+ INC R0
+ MOVX A,@R0
+ MOV DPL,A
+ INC R0 ;POP CONTROL STACK
+ MOVX A,@DPTR ;SEE IF GOSUB WAS THE LAST STATEMENT
+ CJNE A,#EOF,SR01
+ AJMP CMNDLK
+SR01: MOV A,R5 ;GET TYPE
+ JZ SGT1 ;EXIT IF ZERO
+ MOV CSTKA,R0 ;POP THE STACK
+ CPL A ;OPTION TEST, 00H, 55H, 0FFH, NOW 55H
+ JNZ SGT1 ;MUST BE GOSUB
+ RET ;NORMAL FALL THRU EXIT FOR NO MATCH
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; The statement action routine - GOSUB
+ ;
+ ;***************************************************************
+ ;
+SGOSUB: ACALL RLINE ;NEW TXA IN DPTR
+ ;
+SGS0: MOV R4,#GTYPE
+ ACALL SGS1 ;SET EVERYTHING UP
+ AJMP SF3 ;EXIT
+ ;
+SGS1: MOV A,#-3 ;ALLOCATE 3 BYTES ON CONTROL STACK
+ ACALL PUSHCS
+ ;
+T_X_S: MOV P2,#CSTKAH ;SET UP PORT FOR CONTROL STACK
+ MOV A,TXAL ;GET RETURN ADDRESS AND SAVE IT
+ MOVX @R0,A
+ DEC R0
+ MOV A,TXAH
+ MOVX @R0,A
+ DEC R0
+ MOV A,R4 ;GET TYPE
+ MOVX @R0,A ;SAVE TYPE
+ RET ;EXIT
+ ;
+ ;
+CS1: MOV A,#3 ;POP 3 BYTES
+ ACALL PUSHCS
+ ;
+CSETUP: MOV R0,CSTKA ;GET CONTROL STACK
+ MOV P2,#CSTKAH
+ MOVX A,@R0 ;GET BYTE
+ CJNE A,R4B0,CSETUP1 ;SEE IF TYPE MATCH
+ INC R0
+ RET
+CSETUP1:JZ E4XX ;EXIT IF STACK UNDERFLOW
+ CJNE A,#FTYPE,CS1 ;SEE IF FOR TYPE
+ ACALL XXI3 ;WASTE THE FOR TYPE
+ SJMP CSETUP ;LOOP
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; The statement action routine - NEXT
+ ;
+ ;***************************************************************
+ ;
+SNEXT: MOV R4,#FTYPE ;FOR TYPE
+ ACALL CSETUP ;SETUP CONTROL STACK
+ MOV TEMP5,R0 ;SAVE CONTROL VARIABLE ADDRESS
+ MOV R1,#TEMP1 ;SAVE VAR + RETURN IN TEMP1-4
+ ;
+XXI: MOVX A,@R0 ;LOOP UNTIL DONE
+ MOV @R1,A
+ INC R1
+ INC R0
+ CJNE R1,#TEMP5,XXI
+ ;
+ ACALL VAR ;SEE IF THE USER HAS A VARIABLE
+ JNC XXI1
+ MOV R2,TEMP1
+ MOV R0,TEMP2
+XXI1: MOV A,R2 ;SEE IF VAR'S AGREE
+ CJNE A,TEMP1,E4XX
+ MOV A,R0
+ CJNE A,TEMP2,E4XX
+ ACALL PUSHAS ;PUT CONTROL VARIABLE ON STACK
+ MOV A,#FPSIZ+FPSIZ+2;COMPUTE ADDRESS TO STEP VALUE SIGN
+ ADD A,TEMP5 ;ADD IT TO BASE OF STACK
+ MOV R0,A ;SAVE IN R0
+ MOV R2,#CSTKAH ;SET UP TO PUSH STEP VALUE
+ MOV P2,R2 ;SET UP PORT
+ MOVX A,@R0 ;GET SIGN
+ INC R0 ;BACK TO EXPONENT
+ PUSH ACC ;SAVE SIGN OF STEP
+ ACALL PUSHAS ;PUT STEP VALUE ON STACK
+ PUSH R0B0 ;SAVE LIMIT VALUE LOCATION
+ CALL AADD ;ADD STEP VALUE TO VARIABLE
+ CALL CSTAKA ;COPY STACK
+ MOV R3,TEMP1 ;GET CONTROL VARIABLE
+ MOV R1,TEMP2
+ ACALL POPAS ;SAVE THE RESULT
+ MOV R2,#CSTKAH ;RESTORE LIMIT LOCATION
+ POP R0B0
+ ACALL PUSHAS ;PUT LIMIT ON STACK
+ CALL FP_BASE2 ;DO THE COMPARE
+ POP ACC ;GET LIMIT SIGN BACK
+ JZ XXI2 ;IF SIGN NEGATIVE, TEST "BACKWARDS"
+ CPL C
+XXI2: ORL C,F0 ;SEE IF EQUAL
+ JC N4 ;STILL SMALLER THAN LIMIT?
+XXI3: MOV A,#FSIZE ;REMOVE CONTROL STACK ENTRY
+ ;
+ ; Fall thru to PUSHCS
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; PUSHCS - push frame onto control stack
+ ; acc has - number of bytes, also test for overflow
+ ;
+ ;***************************************************************
+ ;
+PUSHCS: ADD A,CSTKA ;BUMP CONTROL STACK
+ CJNE A,#CONVT+17,PUSHCS1 ;SEE IF OVERFLOWED
+PUSHCS1:JC E4XX ;EXIT IF STACK OVERFLOW
+ XCH A,CSTKA ;STORE NEW CONTROL STACK VALUE, GET OLD
+ DEC A ;BUMP OLD VALUE
+ MOV R0,A ;PUT OLD-1 IN R0
+ ;
+PUSHCS2:RET ;EXIT
+ ;
+CSC: ACALL CLN_UP ;FINISH OFF THE LINE
+ JNC PUSHCS2 ;EXIT IF NO TERMINATOR
+ ;
+E4XX: MOV DPTR,#EXC ;CONTROL STACK ERROR
+ AJMP EK ;STACK ERROR
+ ;
+N4: MOV TXAH,TEMP3 ;GET TEXT POINTER
+ MOV TXAL,TEMP4
+ AJMP ILOOP ;EXIT
+ ;
+ ;***************************************************************
+ ;
+ ; The statement action routine - RESTORE
+ ;
+ ;***************************************************************
+ ;
+SRESTR: ACALL X_TR ;SWAP POINTERS
+SRESTR1:ACALL DP_B ;GET THE STARTING ADDRESS
+ ACALL T_DP ;PUT STARTING ADDRESS IN TEXT POINTER
+ ACALL B_TXA ;BUMP TXA
+ ;
+ ; Fall thru
+ ;
+X_TR: ;swap txa and rtxa
+ ;
+ XCH A,TXAH
+ XCH A,RTXAH
+ XCH A,TXAH
+ XCH A,TXAL
+ XCH A,RTXAL
+ XCH A,TXAL
+ RET ;EXIT
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; The statement action routine - READ
+ ;
+ ;***************************************************************
+ ;
+SREAD: ACALL X_TR ;SWAP POINTERS
+ ;
+SRD0: ACALL C_TST ;CHECK FOR COMMA
+ JC SRD4 ;SEE WHAT IT IS
+ ;
+SRD: ACALL EXPRB ;EVALUATE THE EXPRESSION
+ ACALL GC ;GET THE CHARACTER AFTER EXPRESSION
+ CJNE A,#',',SRD1 ;SEE IF MORE DATA
+ SJMP SRD2 ;BYBASS CLEAN UP IF A COMMA
+ ;
+SRD1: ACALL CLN_UP ;FINISH OFF THE LINE, IF AT END
+ ;
+SRD2: ACALL X_TR ;RESTORE POINTERS
+ ACALL VAR_ER ;GET VARIABLE ADDRESS
+ ACALL XPOP ;FLIP THE REGISTERS FOR POPAS
+ ACALL C_TST ;SEE IF A COMMA
+ JNC SREAD ;READ AGAIN IF A COMMA
+SRD21: RET ;EXIT IF NOT
+ ;
+SRD4: CJNE A,#T_DATA,SRD5 ;SEE IF DATA
+ ACALL GCI1 ;BUMP POINTER
+ SJMP SRD
+ ;
+SRD5: CJNE A,#EOF,SRD6 ;SEE IF YOU BLEW IT
+SRD51: ACALL X_TR ;GET THE TEXT POINTER BACK
+ MOV DPTR,#E14X ;READ ERROR
+ ;
+EK: LJMP ERROR
+ ;
+SRD6: ACALL FINDCR ;WASTE THIS LINE
+ ACALL CLN_UP ;CLEAN IT UP
+ JC SRD51 ;ERROR IF AT END
+ SJMP SRD0
+ ;
+NUMC: ACALL GC ;GET A CHARACTER
+ CJNE A,#'#',NUMC1 ;SEE IF A #
+ SETB COB ;VALID LINE PRINT
+ AJMP IGC ;BUMP THE TEXT POINTER
+ ;
+NUMC1: CJNE A,#'@',SRD21 ;EXIT IF NO GOOD
+ SETB LPB
+ AJMP IGC
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; The statement action routine - PRINT
+ ;
+ ;***************************************************************
+ ;
+SPH0: SETB ZSURP ;NO ZEROS
+ ;
+SPH1: SETB HMODE ;HEX MODE
+ ;
+SPRINT: ACALL NUMC ;TEST FOR A LINE PRINT
+ ACALL SPRINT2 ;PROCEED
+SPRINT1:ANL 35,#11110101B ;CLEAR COB AND LPB
+ ANL 38,#00111111B ;NO HEX MODE
+ ;
+ RET
+ ;
+SPRINT2:ACALL DELTST ;CHECK FOR A DELIMITER
+ JC SP1
+ ;
+SP0: JMP CRLF ;EXIT WITH A CR IF SO
+ ;
+SP2: ACALL C_TST ;CHECK FOR A COMMA
+ JC SP0 ;EXIT IF NO COMMA
+ ;
+SP1: ACALL CPS ;SEE IF A STRING TO PRINT
+ JNC SP2 ;IF A STRING, CHECK FOR A COMMA
+ ;
+SP4: CJNE A,#T_TAB,SP6
+ ACALL I_PI ;ALWAYS CLEARS CARRY
+ SUBB A,PHEAD ;TAKE DELTA BETWEEN TAB AND PHEAD
+ JC SP2 ;EXIT IF PHEAD > TAB
+ SJMP SP7 ;OUTPUT SPACES
+ ;
+SP6: CJNE A,#T_SPC,SM
+ ACALL I_PI ;SET UP PAREN VALUE
+ ;
+SP7: JZ SP2
+ LCALL STEROT ;OUTPUT A SPACE
+ DEC A ;DECREMENT COUNTER
+ SJMP SP7 ;LOOP
+ ;
+$EJECT
+SM: CJNE A,#T_CHR,SP8
+ ACALL IGC
+ CJNE A,#'$',SM01
+ ACALL CNX ;PUT THE CHARACTER ON THE STACK
+ ACALL IFIXL ;PUT THE CHARACTER IN R1
+ SJMP SM02
+SM01: ACALL ONE ;EVALUATE THE EXPRESSION, PUT IN R3:R1
+ ACALL ERPAR
+SM02: MOV R5,R1B0 ;BYTE TO OUTPUT
+ SJMP SQ
+ ;
+SP8: CJNE A,#T_CR,SX
+ ACALL GCI1 ;EAT THE TOKEN
+ MOV R5,#CR
+ ;
+SQ: CALL TEROT
+ SJMP SP2 ;OUTPUT A CR AND DO IT AGAIN
+ ;
+SX: CJNE A,#T_USE,SP9 ;USING TOKEN
+ ACALL IGC ;GE THE CHARACTER AFTER THE USING TOKEN
+ CJNE A,#'F',U4 ;SEE IF FLOATING
+ MOV FORMAT,#0F0H ;SET FLOATING
+ ACALL IGC ;BUMP THE POINTER AND GET THE CHARACTER
+ ACALL GCI1 ;BUMP IT AGAIN
+ ANL A,#0FH ;STRIP OFF ASCII BIAS
+ JZ U3 ;EXIT IF ZERO
+ CJNE A,#3,SX1 ;SEE IF AT LEAST A THREE
+SX1: JNC U3 ;FORCE A THREE IF NOT A THREE
+ MOV A,#3
+ ;
+U3: ORL FORMAT,A ;PUT DIGIT IN FORMAT
+ SJMP U8 ;CLEAN UP END
+ ;
+U4: CJNE A,#'0',U5
+ MOV FORMAT,#0 ;FREE FORMAT
+ ACALL GCI1 ;BUMP THE POINTER
+ SJMP U8
+ ;
+U5: CJNE A,#'#',U8 ;SEE IF INTGER FORMAT
+ ACALL U6
+ MOV FORMAT,R7 ;SAVE THE FORMAT
+ CJNE A,#'.',U8A ;SEE IF TERMINATOR WAS RADIX
+ ACALL IGC ;BUMP PAST .
+ ACALL U6 ;LOOP AGAIN
+ MOV A,R7 ;GET COUNT
+ ADD A,FORMAT ;SEE IF TOO BIG
+ ADD A,#0F7H
+ JNC U5A
+ ;
+$EJECT
+SE0: AJMP INTERX ;ERROR, BAD SYNTAX
+ ;
+U5A: MOV A,R7 ;GET THE COUNT BACK
+ SWAP A ;ADJUST
+ ORL FORMAT,A ;GET THE COUNT
+ ;
+U8A: MOV A,FORMAT
+ ;
+U8B: SWAP A ;GET THE FORMAT RIGHT
+ MOV FORMAT,A
+ ;
+U8: ACALL ERPAR
+ AJMP SP2 ;DONE
+ ;
+U6: MOV R7,#0 ;SET COUNTER
+ ;
+U7: CJNE A,#'#',SP9A ;EXIT IF NOT A #
+ INC R7 ;BUMP COUNTER
+ ACALL IGC ;GET THE NEXT CHARACTER
+ SJMP U7 ;LOOP
+ ;
+SP9: ACALL DELTST1 ;CHECK FOR DELIMITER
+ JNC SP9A ;EXIT IF A DELIMITER
+ ;
+ CJNE A,#T_ELSE,SS
+ ;
+SP9A: RET ;EXIT IF ELSE TOKEN
+ ;
+ ;**************************************************************
+ ;
+ ; P_E - Evaluate an expression in parens ( )
+ ;
+ ;**************************************************************
+ ;
+P_E: MOV R7,#T_LPAR
+ ACALL WE
+ ;
+ERPAR: MOV R7,#')' ;EAT A RIGHT PAREN
+ ;
+EATC: ACALL GCI ;GET THE CHARACTER
+ CJNE A,R7B0,SE0 ;ERROR IF NOT THE SAME
+ RET
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+S_ON: ; ON Statement
+ ;
+ ;***************************************************************
+ ;
+ ACALL ONE ;GET THE EXPRESSION
+ ACALL GCI ;GET THE NEXT CHARACTER
+ CJNE A,#T_GOTO,C0
+ ACALL C1 ;EAT THE COMMAS
+ AJMP SF3 ;DO GOTO
+ ;
+C0: CJNE A,#T_GOSB,SE0
+ ACALL C1
+ AJMP SGS0 ;DO GOSUB
+ ;
+C1: CJNE R1,#0,C2
+ ACALL INTERR ;GET THE LINE NUMBER
+ ACALL FINDCR
+ AJMP RL1 ;FINISH UP THIS LINE
+ ;
+C2: MOV R7,#','
+ ACALL FINDC
+ CJNE A,#',',SE0 ;ERROR IF NOT A COMMA
+ DEC R1
+ ACALL GCI1 ;BUMP PAST COMMA
+ SJMP C1
+ ;
+$EJECT
+ ;
+SS: ACALL S_C ;SEE IF A STRING
+ JC SA ;NO STRING IF CARRY IS SET
+ LCALL UPRNT ;PUT POINTER IN DPTR
+ AJMP SP2 ;SEE IF MORE
+ ;
+SA: ACALL EXPRB ;MUST BE AN EXPRESSION
+ MOV A,#72
+ CJNE A,PHEAD,SA1 ;CHECK PHEAD POSITION
+SA1: JNC SA2
+ ACALL SP0 ;FORCE A CRLF
+SA2: JNB HMODE,S13 ;HEX MODE?
+ CALL FCMP ;SEE IF TOS IS < 0FFFH
+ JC S13 ;EXIT IF GREATER
+ CALL AABS ;GET THE SIGN
+ JNZ OOPS ;WASTE IF NEGATIVE
+ ACALL IFIXL
+ CALL FP_BASE11 ;PRINT HEXMODE
+ AJMP SP2
+OOPS: CALL ANEG ;MAKE IT NEGATIVE
+ ;
+S13: CALL FP_BASE7 ;DO FP OUTPUT
+ MOV A,#1 ;OUTPUT A SPACE
+ AJMP SP7
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; ANU - Get variable name from text - set carry if not found
+ ; if succeeds returns variable in R7:R6
+ ; R6 = 0 if no digit in name
+ ;
+ ;***************************************************************
+ ;
+ANU: ACALL IGC ;INCREMENT AND GET CHARACTER
+ LCALL DIGIT_CHECK ;CHECK FOR DIGIT
+ JC AL2 ;EXIT IF VALID DIGIT
+ CJNE A,#'_',AL ;SEE IF A _
+ RET
+ ;
+AL: CJNE A,#'A',AL1 ;IS IT AN ASCII A?
+AL1: JC AL3 ;EXIT IF CARRY IS SET
+ CJNE A,#'Z'+1,AL2 ;IS IT LESS THAN AN ASCII Z
+AL2: CPL C ;FLIP CARRY
+AL3: RET
+ ;
+SD01: JNB F0,VAR2
+ ;
+SD0: MOV DPTR,#E6X
+ AJMP EK
+ ;
+SDIMX: SETB F0 ;SAYS DOING A DIMENSION
+ SJMP VAR1
+ ;
+VAR: CLR F0 ;SAYS DOING A VARIABLE
+ ;
+VAR1: ACALL GC ;GET THE CHARACTER
+ ACALL AL ;CHECK FOR ALPHA
+ JNC VAR11 ;ERROR IF IN DIM
+ JB F0,SD0
+ RET
+VAR11: MOV R7,A ;SAVE ALPHA CHARACTER
+ CLR A ;ZERO IN CASE OF FAILURE
+ MOV R5,A ;SAVE IT
+ ;
+VY: MOV R6,A
+ ACALL ANU ;CHECK FOR ALPHA OR NUMBER
+ JC VX ;EXIT IF NO ALPHA OR NUM
+ ;
+ XCH A,R7
+ ADD A,R5 ;NUMBER OF CHARACTERS IN ALPHABET
+ XCH A,R7 ;PUT IT BACK
+ MOV R5,#26 ;FOR THE SECOND TIME AROUND
+ SJMP VY
+ ;
+VX: CLR LINEB ;TELL EDITOR A VARIABLE IS DECLARED
+ CJNE A,#T_LPAR,V4 ;SEE IF A LEFT PAREN
+ ;
+ ORL R6B0,#80H ;SET BIT 7 TO SIGINIFY MATRIX
+ CALL F_VAR ;FIND THE VARIABLE
+ PUSH R2B0 ;SAVE THE LOCATION
+ PUSH R0B0
+ JNC SD01 ;DEFAULT IF NOT IN TABLE
+ JB F0,SDI ;NO DEFAULT FOR DIMENSION
+ MOV R1,#10
+ MOV R3,#0
+ ACALL D_CHK
+ ;
+VAR2: ACALL PAREN_INT ;EVALUATE INTEGER IN PARENS
+ CJNE R3,#0,SD0 ;ERROR IF R3<>0
+ POP DPL ;GET VAR FOR LOOKUP
+ POP DPH
+ MOVX A,@DPTR ;GET DIMENSION
+ DEC A ;BUMP OFFSET
+ SUBB A,R1 ;A MUST BE > R1
+ JC SD0
+ LCALL DECDP2 ;BUMP POINTER TWICE
+ ACALL VARB ;CALCULATE THE BASE
+ ;
+X3120: XCH A,R1 ;SWAP R2:R0, R3:R1
+ XCH A,R0
+ XCH A,R1
+ XCH A,R3
+ XCH A,R2
+ XCH A,R3
+ RET
+ ;
+V4: JB F0,SD0 ;ERROR IF NO LPAR FOR DIM
+ LCALL F_VAR ;GET SCALAR VARIABLE
+ CLR C
+ RET
+ ;
+$EJECT
+ ;
+SDI: ACALL PAREN_INT ;EVALUATE PAREN EXPRESSION
+ CJNE R3,#0,SD0 ;ERROR IF NOT ZERO
+ POP R0B0 ;SET UP R2:R0
+ POP R2B0
+ ACALL D_CHK ;DO DIM
+ ACALL C_TST ;CHECK FOR COMMA
+ JNC SDIMX ;LOOP IF COMMA
+ RET ;RETURN IF NO COMMA
+ ;
+D_CHK: INC R1 ;BUMP FOR TABLE LOOKUP
+ MOV A,R1
+ JZ SD0 ;ERROR IF 0FFFFH
+ MOV R4,A ;SAVE FOR LATER
+ MOV DPTR,#MT_ALL ;GET MATRIX ALLOCATION
+ ACALL VARB ;DO THE CALCULATION
+ MOV R7,DPH ;SAVE MATRIX ALLOCATION
+ MOV R6,DPL
+ MOV DPTR,#ST_ALL ;SEE IF TOO MUCH MEMORY TAKEN
+ CALL FUL1 ;ST_ALL SHOULD BE > R3:R1
+ MOV DPTR,#MT_ALL ;SAVE THE NEW MATRIX POINTER
+ CALL S31DP
+ MOV DPL,R0 ;GET VARIABLE ADDRESS
+ MOV DPH,R2
+ MOV A,R4 ;DIMENSION SIZE
+ MOVX @DPTR,A ;SAVE IT
+ CALL DECDP2 ;SAVE TARGET ADDRESS
+ ;
+R76S: MOV A,R7
+ MOVX @DPTR,A
+ INC DPTR
+ MOV A,R6 ;ELEMENT SIZE
+ MOVX @DPTR,A
+ RET ;R2:R0 STILL HAS SYMBOL TABLE ADDRESS
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; The statement action routine - INPUT
+ ;
+ ;***************************************************************
+ ;
+SINPUT: ACALL CPS ;PRINT STRING IF THERE
+ ;
+ ACALL C_TST ;CHECK FOR A COMMA
+ JNC IN2A ;NO CRLF
+ ACALL SP0 ;DO A CRLF
+ ;
+IN2: MOV R5,#'?' ;OUTPUT A ?
+ CALL TEROT
+ ;
+IN2A: SETB INP_B ;DOING INPUT
+ CALL INLINE ;INPUT THE LINE
+ CLR INP_B
+ MOV TEMP5,#HIGH IBUF
+ MOV TEMP4,#LOW IBUF
+ ;
+IN3: ACALL S_C ;SEE IF A STRING
+ JC IN3A ;IF CARRY IS SET, NO STRING
+ ACALL X3120 ;FLIP THE ADDRESSES
+ MOV R3,TEMP5
+ MOV R1,TEMP4
+ ACALL SSOOP
+ ACALL C_TST ;SEE IF MORE TO DO
+ JNC IN2
+ RET
+ ;
+IN3A: CALL DTEMP ;GET THE USER LOCATION
+ CALL GET_NUM ;GET THE USER SUPPLIED NUMBER
+ JNZ IN5 ;ERROR IF NOT ZERO
+ CALL TEMPD ;SAVE THE DATA POINTER
+ ACALL VAR_ER ;GET THE VARIABLE
+ ACALL XPOP ;SAVE THE VARIABLE
+ CALL DTEMP ;GET DPTR BACK FROM VAR_ER
+ ACALL C_TST ;SEE IF MORE TO DO
+ JC IN6 ;EXIT IF NO COMMA
+ MOVX A,@DPTR ;GET INPUT TERMINATOR
+ CJNE A,#',',IN5 ;IF NOT A COMMA DO A CR AND TRY AGAIN
+ INC DPTR ;BUMP PAST COMMA AND READ NEXT VALUE
+ CALL TEMPD
+ SJMP IN3
+ ;
+$EJECT
+ ;
+IN5: MOV DPTR,#IAN ;PRINT INPUT A NUMBER
+ CALL CRP ;DO A CR, THEN, PRINT FROM ROM
+ LJMP CC1 ;TRY IT AGAIN
+ ;
+IN6: MOVX A,@DPTR
+ CJNE A,#CR,EIGP
+ RET
+ ;
+EIGP: MOV DPTR,#EIG
+ CALL CRP ;PRINT THE MESSAGE AND EXIT
+ AJMP SP0 ;EXIT WITH A CRLF
+ ;
+ ;***************************************************************
+ ;
+SOT: ; On timer interrupt
+ ;
+ ;***************************************************************
+ ;
+ ACALL TWO ;GET THE NUMBERS
+ MOV SP_H,R3
+ MOV SP_L,R1
+ MOV DPTR,#TIV ;SAVE THE NUMBER
+ SETB OTS
+ AJMP R76S ;EXIT
+ ;
+ ;
+ ;***************************************************************
+ ;
+SCALL: ; Call a user rountine
+ ;
+ ;***************************************************************
+ ;
+ ACALL INTERR ;CONVERT INTEGER
+ CJNE R2,#0,S_C_1 ;SEE IF TRAP
+ MOV A,R0
+ JB ACC.7,S_C_1
+ ADD A,R0
+ MOV DPTR,#4100H
+ MOV DPL,A
+ ;
+S_C_1: ACALL AC1 ;JUMP TO USER PROGRAM
+ ANL PSW,#11100111B ;BACK TO BANK 0
+ RET ;EXIT
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+THREE: ; Save value for timer function
+ ;
+ ;**************************************************************
+ ;
+ ACALL ONE ;GET THE FIRST INTEGER
+ CALL CBIAS ;BIAS FOR TIMER LOAD
+ MOV T_HH,R3
+ MOV T_LL,R1
+ MOV R7,#',' ;WASTE A COMMA
+ ACALL EATC ;FALL THRU TO TWO
+ ;
+ ;**************************************************************
+ ;
+TWO: ; Get two values seperated by a comma off the stack
+ ;
+ ;**************************************************************
+ ;
+ ACALL EXPRB
+ MOV R7,#',' ;WASTE THE COMMA
+ ACALL WE
+ JMP TWOL ;EXIT
+ ;
+ ;*************************************************************
+ ;
+ONE: ; Evaluate an expression and get an integer
+ ;
+ ;*************************************************************
+ ;
+ ACALL EXPRB ;EVALUATE EXPERSSION
+ ;
+IFIXL: CALL IFIX ;INTEGERS IN R3:R1
+ MOV A,R1
+ RET
+ ;
+ ;
+ ;*************************************************************
+ ;
+I_PI: ; Increment text pointer then get an integer
+ ;
+ ;*************************************************************
+ ;
+ ACALL GCI1 ;BUMP TEXT, THEN GET INTEGER
+ ;
+PAREN_INT:; Get an integer in parens ( )
+ ;
+ ACALL P_E
+ SJMP IFIXL
+ ;
+$EJECT
+ ;
+DP_B: MOV DPH,BOFAH
+ MOV DPL,BOFAL
+ RET
+ ;
+DP_T: MOV DPH,TXAH
+ MOV DPL,TXAL
+ RET
+ ;
+CPS: ACALL GC ;GET THE CHARACTER
+ CJNE A,#'"',NOPASS ;EXIT IF NO STRING
+ ACALL DP_T ;GET TEXT POINTER
+ INC DPTR ;BUMP PAST "
+ MOV R4,#'"'
+ CALL PN0 ;DO THE PRINT
+ INC DPTR ;GO PAST QUOTE
+ CLR C ;PASSED TEST
+ ;
+T_DP: MOV TXAH,DPH ;TEXT POINTER GETS DPTR
+ MOV TXAL,DPL
+ RET
+ ;
+ ;*************************************************************
+ ;
+S_C: ; Check for a string
+ ;
+ ;*************************************************************
+ ;
+ ACALL GC ;GET THE CHARACTER
+ CJNE A,#'$',NOPASS ;SET CARRY IF NOT A STRING
+ AJMP IST_CAL ;CLEAR CARRY, CALCULATE OFFSET
+ ;
+ ;
+ ;
+ ;**************************************************************
+ ;
+C_TST: ACALL GC ;GET A CHARACTER
+ CJNE A,#',',NOPASS ;SEE IF A COMMA
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ;GC AND GCI - GET A CHARACTER FROM TEXT (NO BLANKS)
+ ; PUT CHARACTER IN THE ACC
+ ;
+ ;***************************************************************
+ ;
+IGC: ACALL GCI1 ;BUMP POINTER, THEN GET CHARACTER
+ ;
+GC: SETB RS0 ;USE BANK 1
+ MOV P2,R2 ;SET UP PORT 2
+ MOVX A,@R0 ;GET EXTERNAL BYTE
+ CLR RS0 ;BACK TO BANK 0
+ RET ;EXIT
+ ;
+GCI: ACALL GC
+ ;
+ ; This routine bumps txa by one and always clears the carry
+ ;
+GCI1: SETB RS0 ;BANK 1
+ INC R0 ;BUMP TXA
+ CJNE R0,#0,GCI11
+ INC R2
+GCI11: CLR RS0
+ RET ;EXIT
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+ ; Check delimiters
+ ;
+ ;**************************************************************
+ ;
+DELTST: ACALL GC ;GET A CHARACTER
+DELTST1:CJNE A,#CR,DT1 ;SEE IF A CR
+ CLR A
+ RET
+ ;
+DT1: CJNE A,#':',NOPASS ;SET CARRY IF NO MATCH
+ ;
+L_RET: RET
+ ;
+ ;
+ ;***************************************************************
+ ;
+ ; FINDC - Find the character in R7, update TXA
+ ;
+ ;***************************************************************
+ ;
+FINDCR: MOV R7,#CR ;KILL A STATEMENT LINE
+ ;
+FINDC: ACALL DELTST
+ JNC L_RET
+ ;
+ CJNE A,R7B0,FNDCL2 ;MATCH?
+ RET
+ ;
+FNDCL2: ACALL GCI1
+ SJMP FINDC ;LOOP
+ ;
+FNDCL3: ACALL GCI1
+ ;
+WCR: ACALL DELTST ;WASTE UNTIL A "REAL" CR
+ JNZ FNDCL3
+ RET
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; VAR_ER - Check for a variable, exit if error
+ ;
+ ;***************************************************************
+ ;
+VAR_ER: ACALL VAR
+ SJMP INTERR1
+ ;
+ ;
+ ;***************************************************************
+ ;
+ ; S_D0 - The Statement Action Routine DO
+ ;
+ ;***************************************************************
+ ;
+S_DO: ACALL CSC ;FINISH UP THE LINE
+ MOV R4,#DTYPE ;TYPE FOR STACK
+ ACALL SGS1 ;SAVE ON STACK
+ AJMP ILOOP ;EXIT
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; CLN_UP - Clean up the end of a statement, see if at end of
+ ; file, eat character and line count after CR
+ ;
+ ;***************************************************************
+ ;
+C_2: CJNE A,#':',C_1 ;SEE IF A TERMINATOR
+ AJMP GCI1 ;BUMP POINTER AND EXIT, IF SO
+ ;
+C_1: CJNE A,#T_ELSE,EP5
+ ACALL WCR ;WASTE UNTIL A CR
+ ;
+CLN_UP: ACALL GC ;GET THE CHARACTER
+ CJNE A,#CR,C_2 ;SEE IF A CR
+ ACALL IGC ;GET THE NEXT CHARACTER
+ CJNE A,#EOF,B_TXA ;SEE IF TERMINATOR
+ ;
+NOPASS: SETB C
+ RET
+ ;
+B_TXA: XCH A,TXAL ;BUMP TXA BY THREE
+ ADD A,#3
+ XCH A,TXAL
+ JBC CY,B_TXA1
+ RET
+B_TXA1: INC TXAH
+ RET
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; Get an INTEGER from the text
+ ; sets CARRY if not found
+ ; returns the INTGER value in DPTR and R2:R0
+ ; returns the terminator in ACC
+ ;
+ ;***************************************************************
+ ;
+INTERR: ACALL INTGER ;GET THE INTEGER
+INTERR1:JC EP5 ;ERROR IF NOT FOUND
+ RET ;EXIT IF FOUND
+ ;
+INTGER: ACALL DP_T
+ CALL FP_BASE9 ;CONVERT THE INTEGER
+ ACALL T_DP
+ MOV DPH,R2 ;PUT THE RETURNED VALUE IN THE DPTR
+ MOV DPL,R0
+ ;
+ITRET: RET ;EXIT
+ ;
+ ;
+WE: ACALL EATC ;WASTE THE CHARACTER
+ ;
+ ; Fall thru to evaluate the expression
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; EXPRB - Evaluate an expression
+ ;
+ ;***************************************************************
+ ;
+EXPRB: MOV R2,#LOW OPBOL ;BASE PRECEDENCE
+ ;
+EP1: PUSH R2B0 ;SAVE OPERATOR PRECEDENCE
+ CLR ARGF ;RESET STACK DESIGNATOR
+ ;
+EP2: MOV A,SP ;GET THE STACK POINTER
+ ADD A,#12 ;NEED AT LEAST 12 BYTES
+ JNC EP21
+ LJMP E1XX2
+EP21: MOV A,ASTKA ;GET THE ARG STACK
+ SUBB A,#LOW TM_TOP+12;NEED 12 BYTES ALSO
+ JNC EP22
+ LJMP E4YY
+EP22: JB ARGF,EP4 ;MUST BE AN OPERATOR, IF SET
+ ACALL VAR ;IS THE VALUE A VARIABLE?
+ JNC EP3 ;PUT VARIABLE ON STACK
+ ;
+ ACALL CONST ;IS THE VALUE A NUMERIC CONSTANT?
+ JNC EP4 ;IF SO, CONTINUE, IF NOT, SEE WHAT
+ CALL GC ;GET THE CHARACTER
+ CJNE A,#T_LPAR,EP4 ;SEE IF A LEFT PAREN
+ MOV A,#(LOW OPBOL+1)
+ SJMP XLPAR ;PROCESS THE LEFT PAREN
+ ;
+EP3: ACALL PUSHAS ;SAVE VAR ON STACK
+ ;
+EP4: ACALL GC ;GET THE OPERATOR
+ ;
+ CJNE A,#T_LPAR,EP41 ;IS IT AN OPERATOR
+EP41: JNC XOP ;PROCESS OPERATOR
+ CJNE A,#T_UOP,EP42 ;IS IT A UNARY OPERATOR
+EP42: JNC XBILT ;PROCESS UNARY (BUILT IN) OPERATOR
+ POP R2B0 ;GET BACK PREVIOUS OPERATOR PRECEDENCE
+ JB ARGF,ITRET ;OK IF ARG FLAG IS SET
+ ;
+EP5: CLR C ;NO RECOVERY
+ LJMP E1XX1
+ ;
+ ; Process the operator
+ ;
+XOP: ANL A,#1FH ;STRIP OFF THE TOKE BITS
+ JB ARGF,XOP1 ;IF ARG FLAG IS SET, PROCESS
+ CJNE A,#T_SUB-T_LPAR,XOP3
+ MOV A,#T_NEG-T_LPAR
+ ;
+$EJECT
+XOP1: ADD A,#LOW OPBOL+1 ;BIAS THE TABLE
+ MOV R2,A
+ MOV DPTR,#00H
+ MOVC A,@A+DPTR ;GET THE CURRENT PRECEDENCE
+ MOV R4,A
+ POP ACC ;GET THE PREVIOUS PRECEDENCE
+ MOV R5,A ;SAVE THE PREVIOUS PRECEDENCE
+ MOVC A,@A+DPTR ;GET IT
+ CJNE A,R4B0,XOP11 ;SEE WHICH HAS HIGHER PRECEDENCE
+ CJNE A,#12,ITRET ;SEE IF ANEG
+ SETB C
+XOP11: JNC ITRET ;PROCESS NON-INCREASING PRECEDENCE
+ ;
+ ; Save increasing precedence
+ ;
+ PUSH R5B0 ;SAVE OLD PRECEDENCE ADDRESS
+ PUSH R2B0 ;SAVE NEW PRECEDENCE ADDRESS
+ ACALL GCI1 ;EAT THE OPERATOR
+ ACALL EP1 ;EVALUATE REMAINING EXPRESSION
+XOP12: POP ACC
+ ;
+ ; R2 has the action address, now setup and perform operation
+ ;
+XOP2: MOV DPTR,#OPTAB
+ ADD A,#LOW (NOT OPBOL)
+ CALL ISTA1 ;SET UP TO RETURN TO EP2
+ AJMP EP2 ;JUMP TO EVALUATE EXPRESSION
+ ;
+ ; Built-in operator processing
+ ;
+XBILT: ACALL GCI1 ;EAT THE TOKEN
+ ADD A,#LOW (50H+LOW UOPBOL)
+ JB ARGF,EP5 ;XBILT MUST COME AFTER AN OPERATOR
+ CJNE A,#STP,XBILT1
+XBILT1: JNC XOP2
+ ;
+XLPAR: PUSH ACC ;PUT ADDRESS ON THE STACK
+ ACALL P_E
+ SJMP XOP12 ;PERFORM OPERATION
+ ;
+XOP3: CJNE A,#T_ADD-T_LPAR,EP5
+ ACALL GCI1
+ AJMP EP2 ;WASTE + SIGN
+ ;
+$EJECT
+XPOP: ACALL X3120 ;FLIP ARGS THEN POP
+ ;
+ ;***************************************************************
+ ;
+ ; POPAS - Pop arg stack and copy variable to R3:R1
+ ;
+ ;***************************************************************
+ ;
+POPAS: LCALL INC_ASTKA
+ JMP VARCOP ;COPY THE VARIABLE
+ ;
+AXTAL: MOV R2,#HIGH CXTAL
+ MOV R0,#LOW CXTAL
+ ;
+ ; fall thru
+ ;
+ ;***************************************************************
+ ;
+PUSHAS: ; Push the Value addressed by R2:R0 onto the arg stack
+ ;
+ ;***************************************************************
+ ;
+ CALL DEC_ASTKA
+ SETB ARGF ;SAYS THAT SOMTHING IS ON THE STACK
+ LJMP VARCOP
+ ;
+ ;
+ ;***************************************************************
+ ;
+ST_A: ; Store at expression
+ ;
+ ;***************************************************************
+ ;
+ ACALL ONE ;GET THE EXPRESSION
+ SJMP POPAS ;SAVE IT
+ ;
+ ;
+ ;***************************************************************
+ ;
+LD_A: ; Load at expression
+ ;
+ ;***************************************************************
+ ;
+ ACALL ONE ;GET THE EXPRESSION
+ ACALL X3120 ;FLIP ARGS
+ SJMP PUSHAS
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+CONST: ; Get a constant fron the text
+ ;
+ ;***************************************************************
+ ;
+ CALL GC ;FIRST SEE IF LITERAL
+ CJNE A,#T_ASC,C0C ;SEE IF ASCII TOKEN
+ CALL IGC ;GET THE CHARACTER AFTER TOKEN
+ CJNE A,#'$',CN0 ;SEE IF A STRING
+ ;
+CNX: CALL CSY ;CALCULATE IT
+ JMP AXBYTE1 ;SAVE IT ON THE STACK
+ ;
+CN0: CALL TWO_R2 ;PUT IT ON THE STACK
+ CALL GCI1 ;BUMP THE POINTER
+ JMP ERPAR ;WASTE THE RIGHT PAREN
+ ;
+ ;
+C0C: CALL DP_T ;GET THE TEXT POINTER
+ CALL GET_NUM ;GET THE NUMBER
+ CJNE A,#0FFH,C1C ;SEE IF NO NUMBER
+ SETB C
+C2C: RET
+ ;
+C1C: JNZ FPTST
+ CLR C
+ SETB ARGF
+ ;
+C3C: JMP T_DP
+ ;
+FPTST: ANL A,#00001011B ;CHECK FOR ERROR
+ JZ C2C ;EXIT IF ZERO
+ ;
+ ; Handle the error condition
+ ;
+ MOV DPTR,#E2X ;DIVIDE BY ZERO
+ JNB ACC.0,FPTST1 ;UNDERFLOW
+ MOV DPTR,#E7X
+FPTST1: JNB ACC.1,FPTS ;OVERFLOW
+ MOV DPTR,#E11X
+ ;
+FPTS: JMP ERROR
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; The Command action routine - LIST
+ ;
+ ;***************************************************************
+ ;
+CLIST: CALL NUMC ;SEE IF TO LINE PORT
+ ACALL FSTK ;PUT 0FFFFH ON THE STACK
+ CALL INTGER ;SEE IF USER SUPPLIES LN
+ CLR A ;LN = 0 TO START
+ MOV R3,A
+ MOV R1,A
+ JC CL1 ;START FROM ZERO
+ ;
+ CALL TEMPD ;SAVE THE START ADDTESS
+ CALL GCI ;GET THE CHARACTER AFTER LIST
+ CJNE A,#T_SUB,CLIST1 ;CHECK FOR TERMINATION ADDRESS '-'
+ ACALL INC_ASTKA ;WASTE 0FFFFH
+ LCALL INTERR ;GET TERMINATION ADDRESS
+ ACALL TWO_EY ;PUT TERMINATION ON THE ARG STACK
+CLIST1: MOV R3,TEMP5 ;GET THE START ADDTESS
+ MOV R1,TEMP4
+ ;
+CL1: CALL GETLIN ;GET THE LINE NO IN R3:R1
+ JZ CL3 ;RET IF AT END
+ ;
+CL2: ACALL C3C ;SAVE THE ADDRESS
+ INC DPTR ;POINT TO LINE NUMBER
+ ACALL PMTOP1 ;PUT LINE NUMBER ON THE STACK
+ ACALL CMPLK ;COMPARE LN TO END ADDRESS
+ JC CL3 ;EXIT IF GREATER
+ CALL BCK ;CHECK FOR A CONTROL C
+ ACALL DEC_ASTKA ;SAVE THE COMPARE ADDRESS
+ CALL DP_T ;RESTORE ADDRESS
+ ACALL UPPL ;UN-PROCESS THE LINE
+ ACALL C3C ;SAVE THE CR ADDRESS
+ ACALL CL6 ;PRINT IT
+ INC DPTR ;BUMP POINTER TO NEXT LINE
+ MOVX A,@DPTR ;GET LIN LENGTH
+ DJNZ ACC,CL2 ;LOOP
+ ACALL INC_ASTKA ;WASTE THE COMPARE BYTE
+ ;
+CL3: AJMP CMND1 ;BACK TO COMMAND PROCESSOR
+ ;
+CL6: MOV DPTR,#IBUF ;PRINT IBUF
+ CALL PRNTCR ;PRINT IT
+ CALL DP_T
+ ;
+CL7: JMP CRLF
+ ;
+UPPL0: LCALL X31DP
+$EJECT
+ ;***************************************************************
+ ;
+ ;UPPL - UN PREPROCESS A LINE ADDRESSED BY DPTR INTO IBUF
+ ; RETURN SOURCE ADDRESS OF CR IN DPTR ON RETURN
+ ;
+ ;***************************************************************
+ ;
+UPPL: MOV R3,#HIGH IBUF ;POINT R3 AT HIGH IBUF
+ MOV R1,#LOW IBUF ;POINT R1 AT IBUF
+ INC DPTR ;SKIP OVER LINE LENGTH
+ ACALL C3C ;SAVE THE DPTR (DP_T)
+ CALL L20DPI ;PUT LINE NUMBER IN R2:R0
+ CALL FP_BASE8 ;CONVERT R2:R0 TO INTEGER
+ CALL DP_T
+ INC DPTR ;BUMP DPTR PAST THE LINE NUMBER
+ ;
+UPP0: CJNE R1,#LOW IBUF+6,UPP01
+UPP01: JC UPP91 ;PUT SPACES IN TEXT
+ INC DPTR ;BUMP PAST LN HIGH
+ MOVX A,@DPTR ;GET USER TEXT
+ MOV R6,A ;SAVE A IN R6 FOR TOKE COMPARE
+ JB ACC.7,UPP1 ;IF TOKEN, PROCESS
+ CJNE A,#20H,UPP02 ;TRAP THE USER TOKENS
+UPP02: JNC UPP03
+ CJNE A,#CR,UPP1 ;DO IT IF NOT A CR
+UPP03: CJNE A,#'"',UPP9 ;SEE IF STRING
+ ACALL UPP7 ;SAVE IT
+UPP04: ACALL UPP8 ;GET THE NEXT CHARACTER AND SAVE IT
+ CJNE A,#'"',UPP04 ;LOOP ON QUOTES
+ SJMP UPP0
+ ;
+UPP9: CJNE A,#':',UPP1A ;PUT A SPACE IN DELIMITER
+ ACALL UPP7A
+ MOV A,R6
+ ACALL UPP7
+UPP91: ACALL UPP7A
+ SJMP UPP0
+ ;
+UPP1A: ACALL UPP81 ;SAVE THE CHARACTER, UPDATE POINTER
+ SJMP UPP0 ;EXIT IF A CR, ELSE LOOP
+ ;
+UPP1: ACALL C3C ;SAVE THE TEXT POINTER
+ MOV C,XBIT
+ MOV F0,C ;SAVE XBIT IN F0
+UPP11: MOV DPTR,#TOKTAB ;POINT AT TOKEN TABLE
+ JNB F0,UPP2
+ LCALL 2078H ;SET UP DPTR FOR LOOKUP
+ ;
+UPP2: CLR A ;ZERO A FOR LOOKUP
+ MOVC A,@A+DPTR ;GET TOKEN
+ INC DPTR ;ADVANCE THE TOKEN POINTER
+ CJNE A,#0FFH,UP_2 ;SEE IF DONE
+ JBC F0,UPP11 ;NOW DO NORMAL TABLE
+ AJMP CMND1 ;EXIT IF NOT FOUND
+ ;
+UP_2: CJNE A,R6B0,UPP2 ;LOOP UNTIL THE SAME
+ ;
+UP_3: CJNE A,#T_UOP,UP_4
+UP_4: JNC UPP3
+ ACALL UPP7A ;PRINT THE SPACE IF OK
+ ;
+UPP3: CLR A ;DO LOOKUP
+ MOVC A,@A+DPTR
+ JB ACC.7,UPP4 ;EXIT IF DONE, ELSE SAVE
+ JZ UPP4 ;DONE IF ZERO
+ ACALL UPP7 ;SAVE THE CHARACTER
+ INC DPTR
+ SJMP UPP3 ;LOOP
+ ;
+UPP4: CALL DP_T ;GET IT BACK
+ MOV A,R6 ;SEE IF A REM TOKEN
+ XRL A,#T_REM
+ JNZ UPP42
+UPP41: ACALL UPP8
+ SJMP UPP41
+UPP42: JNC UPP0 ;START OVER AGAIN IF NO TOKEN
+ ACALL UPP7A ;PRINT THE SPACE IF OK
+ SJMP UPP0 ;DONE
+ ;
+UPP7A: MOV A,#' ' ;OUTPUT A SPACE
+ ;
+UPP7: AJMP PPL91 ;SAVE A
+ ;
+UPP8: INC DPTR
+ MOVX A,@DPTR
+UPP81: CJNE A,#CR,UPP7
+ AJMP PPL71
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+ ; This table contains all of the floating point constants
+ ;
+ ; The constants in ROM are stored "backwards" from the way
+ ; basic normally treats floating point numbers. Instead of
+ ; loading from the exponent and decrementing the pointer,
+ ; ROM constants pointers load from the most significant
+ ; digits and increment the pointers. This is done to 1) make
+ ; arg stack loading faster and 2) compensate for the fact that
+ ; no decrement data pointer instruction exsist.
+ ;
+ ; The numbers are stored as follows:
+ ;
+ ; BYTE X+5 = MOST SIGNIFICANT DIGITS IN BCD
+ ; BYTE X+4 = NEXT MOST SIGNIFICANT DIGITS IN BCD
+ ; BYTE X+3 = NEXT LEAST SIGNIFICANT DIGITS IN BCD
+ ; BYTE X+2 = LEAST SIGNIFICANT DIGITS IN BCD
+ ; BYTE X+1 = SIGN OF THE ABOVE MANTISSA 0 = +, 1 = -
+ ; BYTE X = EXPONENT IN TWO'S COMPLEMENT BINARY
+ ; ZERO EXPONENT = THE NUMBER ZERO
+ ;
+ ;**************************************************************
+ ;
+ATTAB: DB 128-2 ; ARCTAN LOOKUP
+ DB 00H
+ DB 57H
+ DB 22H
+ DB 66H
+ DB 28H
+ ;
+ DB 128-1
+ DB 01H
+ DB 37H
+ DB 57H
+ DB 16H
+ DB 16H
+ ;
+ DB 128-1
+ DB 00H
+ DB 14H
+ DB 96H
+ DB 90H
+ DB 42H
+ ;
+ DB 128-1
+ DB 01H
+ DB 40H
+ DB 96H
+ DB 28H
+ DB 75H
+ ;
+ DB 128
+ DB 00H
+ DB 64H
+ DB 62H
+ DB 65H
+ DB 10H
+ ;
+ DB 128
+ DB 01H
+ DB 99H
+ DB 88H
+ DB 20H
+ DB 14H
+ ;
+ DB 128
+ DB 00H
+ DB 51H
+ DB 35H
+ DB 99H
+ DB 19H
+ ;
+ DB 128
+ DB 01H
+ DB 45H
+ DB 31H
+ DB 33H
+ DB 33H
+ ;
+ DB 129
+ DB 00H
+ DB 00H
+ DB 00H
+ DB 00H
+ DB 10H
+ ;
+ DB 0FFH ;END OF TABLE
+ ;
+NTWO: DB 129
+ DB 0
+ DB 0
+ DB 0
+ DB 0
+ DB 20H
+ ;
+TTIME: DB 128-4 ; CLOCK CALCULATION
+ DB 00H
+ DB 00H
+ DB 00H
+ DB 04H
+ DB 13H
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; COSINE - Add pi/2 to stack, then fall thru to SIN
+ ;
+ ;***************************************************************
+ ;
+ACOS: ACALL POTWO ;PUT PI/2 ON THE STACK
+ ACALL AADD ;TOS = TOS+PI/2
+ ;
+ ;***************************************************************
+ ;
+ ; SINE - use taylor series to calculate sin function
+ ;
+ ;***************************************************************
+ ;
+ASIN: ACALL PIPI ;PUT PI ON THE STACK
+ ACALL RV ;REDUCE THE VALUE
+ MOV A,MT2 ;CALCULATE THE SIGN
+ ANL A,#01H ;SAVE LSB
+ XRL MT1,A ;SAVE SIGN IN MT1
+ ACALL CSTAKA ;NOW CONVERT TO ONE QUADRANT
+ ACALL POTWO
+ ACALL CMPLK ;DO COMPARE
+ JC ASIN1
+ ACALL PIPI
+ ACALL ASUB
+ASIN1: ACALL AABS
+ MOV DPTR,#SINTAB ;SET UP LOOKUP TABLE
+ ACALL POLYC ;CALCULATE THE POLY
+ ACALL STRIP
+ AJMP SIN0
+ ;
+ ; Put PI/2 on the stack
+ ;
+POTWO: ACALL PIPI ;PUT PI ON THE STACK, NOW DIVIDE
+ ;
+DBTWO: MOV DPTR,#NTWO
+ ACALL PUSHC
+ ;MOV A,#2 ;BY TWO
+ ;ACALL TWO_R2
+ AJMP ADIV
+ ;
+$EJECT
+ ;*************************************************************
+ ;
+POLYC: ; Expand a power series to calculate a polynomial
+ ;
+ ;*************************************************************
+ ;
+ ACALL CSTAKA2 ;COPY THE STACK
+ ACALL AMUL ;SQUARE THE STACK
+ ACALL POP_T1 ;SAVE X*X
+ ACALL PUSHC ;PUT CONSTANT ON STACK
+ ;
+POLY1: ACALL PUSH_T1 ;PUT COMPUTED VALUE ON STACK
+ ACALL AMUL ;MULTIPLY CONSTANT AND COMPUTED VALUE
+ ACALL PUSHC ;PUT NEXT CONSTANT ON STACK
+ ACALL AADD ;ADD IT TO THE OLD VALUE
+ CLR A ;CHECK TO SEE IF DONE
+ MOVC A,@A+DPTR
+ CJNE A,#0FFH,POLY1 ;LOOP UNTIL DONE
+ ;
+AMUL: LCALL FP_BASE3
+ AJMP FPTST
+ ;
+ ;*************************************************************
+ ;
+RV: ; Reduce a value for Trig and A**X functions
+ ;
+ ; value = (value/x - INT(value/x)) * x
+ ;
+ ;*************************************************************
+ ;
+ ACALL C2_T2 ;COPY TOS TO T2
+ ACALL ADIV ;TOS = TOS/TEMP2
+ ACALL AABS ;MAKE THE TOS A POSITIVE NUMBER
+ MOV MT1,A ;SAVE THE SIGN
+ ACALL CSTAKA2 ;COPY THE STACK TWICE
+ ACALL IFIX ;PUT THE NUMBER IN R3:R1
+ PUSH R3B0 ;SAVE R3
+ MOV MT2,R1 ;SAVE THE LS BYTE IN MT2
+ ACALL AINT ;MAKE THE TOS AN INTEGER
+ ACALL ASUB ;TOS = TOS/T2 - INT(TOS/T2)
+ ACALL P_T2 ;TOS = T2
+ ACALL AMUL ;TOS = T2*(TOS/T2 - INT(TOS/T2)
+ POP R3B0 ;RESTORE R3
+ RET ;EXIT
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+ ; TAN
+ ;
+ ;**************************************************************
+ ;
+ATAN: ACALL CSTAKA ;DUPLACATE STACK
+ ACALL ASIN ;TOS = SIN(X)
+ ACALL SWAP_ASTKA ;TOS = X
+ ACALL ACOS ;TOS = COS(X)
+ AJMP ADIV ;TOS = SIN(X)/COS(X)
+ ;
+STRIP: ACALL SETREG ;SETUP R0
+ MOV R3,#1 ;LOOP COUNT
+ AJMP AI11 ;WASTE THE LSB
+ ;
+ ;************************************************************
+ ;
+ ; ARC TAN
+ ;
+ ;************************************************************
+ ;
+AATAN: ACALL AABS
+ MOV MT1,A ;SAVE THE SIGN
+ ACALL SETREG ;GET THE EXPONENT
+ ADD A,#7FH ;BIAS THE EXPONENT
+ MOV UBIT,C ;SAVE CARRY STATUS
+ JNC AATAN1 ;SEE IF > 1
+ ACALL RECIP ;IF > 1, TAKE RECIP
+AATAN1: MOV DPTR,#ATTAB ;SET UP TO CALCULATE THE POLY
+ ACALL POLYC ;CALCULATE THE POLY
+ JNB UBIT,SIN0 ;JUMP IF NOT SET
+ ACALL ANEG ;MAKE X POLY NEGATIVE
+ ACALL POTWO ;SUBTRACT PI/2
+ ACALL AADD
+ ;
+SIN0: MOV A,MT1 ;GET THE SIGN
+ JZ SRT
+ AJMP ANEG
+ ;
+$EJECT
+ ;*************************************************************
+ ;
+ ; FCOMP - COMPARE 0FFFFH TO TOS
+ ;
+ ;*************************************************************
+ ;
+FCMP: ACALL CSTAKA ;COPY THE STACK
+ ACALL FSTK ;MAKE THE TOS = 0FFFFH
+ ACALL SWAP_ASTKA ;NOW COMPARE IS 0FFFFH - X
+ ;
+CMPLK: JMP FP_BASE2 ;DO THE COMPARE
+ ;
+ ;*************************************************************
+ ;
+DEC_ASTKA: ;Push ARG STACK and check for underflow
+ ;
+ ;*************************************************************
+ ;
+ MOV A,#-FPSIZ
+ ADD A,ASTKA
+ CJNE A,#LOW TM_TOP+6,DEC_ASTKA1
+DEC_ASTKA1:
+ JC E4YY
+ MOV ASTKA,A
+ MOV R1,A
+ MOV R3,#ASTKAH
+ ;
+SRT: RET
+ ;
+E4YY: MOV DPTR,#EXA
+ AJMP FPTS ;ARG STACK ERROR
+ ;
+ ;
+AXTAL3: ACALL PUSHC ;PUSH CONSTANT, THEN MULTIPLY
+ ACALL AMUL
+ ;
+ ; Fall thru to IFIX
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+IFIX: ; Convert a floating point number to an integer, put in R3:R1
+ ;
+ ;***************************************************************
+ ;
+ CLR A ;RESET THE START
+ MOV R3,A
+ MOV R1,A
+ MOV R0,ASTKA ;GET THE ARG STACK
+ MOV P2,#ASTKAH
+ MOVX A,@R0 ;READ EXPONENT
+ CLR C
+ SUBB A,#81H ;BASE EXPONENT
+ MOV R4,A ;SAVE IT
+ DEC R0 ;POINT AT SIGN
+ MOVX A,@R0 ;GET THE SIGN
+ JNZ SQ_ERR ;ERROR IF NEGATIVE
+ JC INC_ASTKA ;EXIT IF EXPONENT IS < 81H
+ INC R4 ;ADJUST LOOP COUNTER
+ MOV A,R0 ;BUMP THE POINTER REGISTER
+ SUBB A,#FPSIZ-1
+ MOV R0,A
+ ;
+I2: INC R0 ;POINT AT DIGIT
+ MOVX A,@R0 ;GET DIGIT
+ SWAP A ;FLIP
+ CALL FP_BASE10 ;ACCUMULATE
+ JC SQ_ERR
+ DJNZ R4,I21
+ SJMP INC_ASTKA
+I21: MOVX A,@R0 ;GET DIGIT
+ CALL FP_BASE10
+ JC SQ_ERR
+ DJNZ R4,I2
+ ;
+$EJECT
+ ;************************************************************
+ ;
+INC_ASTKA: ; Pop the ARG STACK and check for overflow
+ ;
+ ;************************************************************
+ ;
+ MOV A,#FPSIZ ;NUMBER TO POP
+ SJMP SETREG1
+ ;
+SETREG: CLR A ;DON'T POP ANYTHING
+SETREG1:MOV R0,ASTKA
+ MOV R2,#ASTKAH
+ MOV P2,R2
+ ADD A,R0
+ JC E4YY
+ MOV ASTKA,A
+ MOVX A,@R0
+A_D: RET
+ ;
+ ;************************************************************
+ ;
+ ; EBIAS - Bias a number for E to the X calculations
+ ;
+ ;************************************************************
+ ;
+EBIAS: ACALL PUSH_ONE
+ ACALL RV
+ CJNE R3,#00H,SQ_ERR ;ERROR IF R3 <> 0
+ ACALL C2_T2 ;TEMP 2 GETS FRACTIONS
+ ACALL INC_ASTKA
+ ACALL POP_T1
+ ACALL PUSH_ONE
+ ;
+AELP: MOV A,MT2
+ JNZ AEL1
+ ;
+ MOV A,MT1
+ JZ A_D
+ MOV DPTR,#FPT2-1
+ MOVX @DPTR,A ;MAKE THE FRACTIONS NEGATIVE
+ ;
+RECIP: ACALL PUSH_ONE
+ ACALL SWAP_ASTKA
+ AJMP ADIV
+ ;
+AEL1: DEC MT2
+ ACALL PUSH_T1
+ ACALL AMUL
+ SJMP AELP
+ ;
+SQ_ERR: LJMP E3XX ;LINK TO BAD ARG
+ ;
+$EJECT
+ ;************************************************************
+ ;
+ ; SQUARE ROOT
+ ;
+ ;************************************************************
+ ;
+ASQR: ACALL AABS ;GET THE SIGN
+ JNZ SQ_ERR ;ERROR IF NEGATIVE
+ ACALL C2_T2 ;COPY VARIABLE TO T2
+ ACALL POP_T1 ;SAVE IT IN T1
+ MOV R0,#LOW FPT1
+ MOVX A,@R0 ;GET EXPONENT
+ JZ SQR41 ;EXIT IF ZERO
+ ADD A,#128 ;BIAS THE EXPONENT
+ JNC SQR1 ;SEE IF < 80H
+ RR A
+ ANL A,#127
+ SJMP SQR2
+ ;
+SQR1: CPL A ;FLIP BITS
+ INC A
+ RR A
+ ANL A,#127 ;STRIP MSB
+ CPL A
+ INC A
+ ;
+SQR2: ADD A,#128 ;BIAS EXPONENT
+ MOVX @R0,A ;SAVE IT
+ ;
+ ; NEWGUESS = ( X/OLDGUESS + OLDGUESS) / 2
+ ;
+SQR4: ACALL P_T2 ;TOS = X
+ ACALL PUSH_T1 ;PUT NUMBER ON STACK
+ ACALL ADIV ;TOS = X/GUESS
+ ACALL PUSH_T1 ;PUT ON AGAIN
+ ACALL AADD ;TOS = X/GUESS + GUESS
+ ACALL DBTWO ;TOS = ( X/GUESS + GUESS ) / 2
+ ACALL TEMP_COMP ;SEE IF DONE
+ JNB F0,SQR4
+ ;
+SQR41: AJMP PUSH_T1 ;PUT THE ANSWER ON THE STACK
+ ;
+$EJECT
+ ;*************************************************************
+ ;
+ ; NATURAL LOG
+ ;
+ ;*************************************************************
+ ;
+ALN: ACALL AABS ;MAKE SURE THAT NUM IS POSITIVE
+ JNZ SQ_ERR ;ERROR IF NOT
+ MOV MT2,A ;CLEAR FOR LOOP
+ INC R0 ;POINT AT EXPONENT
+ MOVX A,@R0 ;READ THE EXPONENT
+ JZ SQ_ERR ;ERROR IF EXPONENT IS ZERO
+ CJNE A,#81H,ALN1 ;SEE IF NUM >= 1
+ALN1: MOV UBIT,C ;SAVE CARRY STATUS
+ JC ALNL ;TAKE RECIP IF >= 1
+ ACALL RECIP
+ ;
+ ; Loop to reduce
+ ;
+ALNL: ACALL CSTAKA ;COPY THE STACK FOR COMPARE
+ ACALL PUSH_ONE ;COMPARE NUM TO ONE
+ ACALL CMPLK
+ JNC ALNO ;EXIT IF DONE
+ ACALL SETREG ;GET THE EXPONENT
+ ADD A,#85H ;SEE HOW BIG IT IS
+ JNC ALN11 ;BUMP BY EXP(11) IF TOO SMALL
+ ACALL PLNEXP ;PUT EXP(1) ON STACK
+ MOV A,#1 ;BUMP COUNT
+ ;
+ALNE: ADD A,MT2
+ JC SQ_ERR
+ MOV MT2,A
+ ACALL AMUL ;BIAS THE NUMBER
+ SJMP ALNL
+ ;
+ALN11: MOV DPTR,#EXP11 ;PUT EXP(11) ON STACK
+ ACALL PUSHC
+ MOV A,#11
+ SJMP ALNE
+ ;
+$EJECT
+ALNO: ACALL C2_T2 ;PUT NUM IN TEMP 2
+ ACALL PUSH_ONE ;TOS = 1
+ ACALL ASUB ;TOS = X - 1
+ ACALL P_T2 ;TOS = X
+ ACALL PUSH_ONE ;TOS = 1
+ ACALL AADD ;TOS = X + 1
+ ACALL ADIV ;TOS = (X-1)/(X+1)
+ MOV DPTR,#LNTAB ;LOG TABLE
+ ACALL POLYC
+ INC DPTR ;POINT AT LN(10)
+ ACALL PUSHC
+ ACALL AMUL
+ MOV A,MT2 ;GET THE COUNT
+ ACALL TWO_R2 ;PUT IT ON THE STACK
+ ACALL ASUB ;INT - POLY
+ ACALL STRIP
+ JNB UBIT,AABS
+ ;
+LN_D: RET
+ ;
+ ;*************************************************************
+ ;
+TEMP_COMP: ; Compare FPTEMP1 to TOS, FPTEMP1 gets TOS
+ ;
+ ;*************************************************************
+ ;
+ ACALL PUSH_T1 ;SAVE THE TEMP
+ ACALL SWAP_ASTKA ;TRADE WITH THE NEXT NUMBER
+ ACALL CSTAKA ;COPY THE STACK
+ ACALL POP_T1 ;SAVE THE NEW NUMBER
+ JMP FP_BASE2 ;DO THE COMPARE
+ ;
+$EJECT
+AETOX: ACALL PLNEXP ;EXP(1) ON TOS
+ ACALL SWAP_ASTKA ;X ON TOS
+ ;
+AEXP: ;EXPONENTIATION
+ ;
+ ACALL EBIAS ;T1=BASE,T2=FRACTIONS,TOS=INT MULTIPLIED
+ MOV DPTR,#FPT2 ;POINT AT FRACTIONS
+ MOVX A,@DPTR ;READ THE EXP OF THE FRACTIONS
+ JZ LN_D ;EXIT IF ZERO
+ ACALL P_T2 ;TOS = FRACTIONS
+ ACALL PUSH_T1 ;TOS = BASE
+ ACALL SETREG ;SEE IF BASE IS ZERO
+ JZ AEXP1
+ ACALL ALN ;TOS = LN(BASE)
+AEXP1: ACALL AMUL ;TOS = FRACTIONS * LN(BASE)
+ ACALL PLNEXP ;TOS = EXP(1)
+ ACALL SWAP_ASTKA ;TOS = FRACTIONS * LN(BASE)
+ ACALL EBIAS ;T2 = FRACTIONS, TOS = INT MULTIPLIED
+ MOV MT2,#00H ;NOW CALCULATE E**X
+ ACALL PUSH_ONE
+ ACALL CSTAKA
+ ACALL POP_T1 ;T1 = 1
+ ;
+AEXL: ACALL P_T2 ;TOS = FRACTIONS
+ ACALL AMUL ;TOS = FRACTIONS * ACCUMLATION
+ INC MT2 ;DO THE DEMONIATOR
+ MOV A,MT2
+ ACALL TWO_R2
+ ACALL ADIV
+ ACALL CSTAKA ;SAVE THE ITERATION
+ ACALL PUSH_T1 ;NOW ACCUMLATE
+ ACALL AADD ;ADD ACCUMLATION
+ ACALL TEMP_COMP
+ JNB F0,AEXL ;LOOP UNTIL DONE
+ ;
+ ACALL INC_ASTKA
+ ACALL PUSH_T1
+ ACALL AMUL ;LAST INT MULTIPLIED
+ ;
+MU1: AJMP AMUL ;FIRST INT MULTIPLIED
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; integer operator - INT
+ ;
+ ;***************************************************************
+ ;
+AINT: ACALL SETREG ;SET UP THE REGISTERS, CLEAR CARRY
+ SUBB A,#129 ;SUBTRACT EXPONENT BIAS
+ JNC AI1 ;JUMP IF ACC > 81H
+ ;
+ ; Force the number to be a zero
+ ;
+ ACALL INC_ASTKA ;BUMP THE STACK
+ ;
+P_Z: MOV DPTR,#ZRO ;PUT ZERO ON THE STACK
+ AJMP PUSHC
+ ;
+AI1: SUBB A,#7
+ JNC AI3
+ CPL A
+ INC A
+ MOV R3,A
+AI11: DEC R0 ;POINT AT SIGN
+ ;
+AI2: DEC R0 ;NOW AT LSB'S
+ MOVX A,@R0 ;READ BYTE
+ ANL A,#0F0H ;STRIP NIBBLE
+ MOVX @R0,A ;WRITE BYTE
+ DJNZ R3,AI21
+ RET
+AI21: CLR A
+ MOVX @R0,A ;CLEAR THE LOCATION
+ DJNZ R3,AI2
+ ;
+AI3: RET ;EXIT
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+AABS: ; Absolute value - Make sign of number positive
+ ; return sign in ACC
+ ;
+ ;***************************************************************
+ ;
+ ACALL ANEG ;CHECK TO SEE IF + OR -
+ JNZ ALPAR ;EXIT IF NON ZERO, BECAUSE THE NUM IS
+ MOVX @R0,A ;MAKE A POSITIVE SIGN
+ RET
+ ;
+ ;***************************************************************
+ ;
+ASGN: ; Returns the sign of the number 1 = +, -1 = -
+ ;
+ ;***************************************************************
+ ;
+ ACALL INC_ASTKA ;POP STACK, GET EXPONENT
+ JZ P_Z ;EXIT IF ZERO
+ DEC R0 ;BUMP TO SIGN
+ MOVX A,@R0 ;GET THE SIGN
+ MOV R7,A ;SAVE THE SIGN
+ ACALL PUSH_ONE ;PUT A ONE ON THE STACK
+ MOV A,R7 ;GET THE SIGN
+ JZ ALPAR ;EXIT IF ZERO
+ ;
+ ; Fall thru to ANEG
+ ;
+ ;***************************************************************
+ ;
+ANEG: ; Flip the sign of the number on the tos
+ ;
+ ;***************************************************************
+ ;
+ ACALL SETREG
+ DEC R0 ;POINT AT THE SIGN OF THE NUMBER
+ JZ ALPAR ;EXIT IF ZERO
+ MOVX A,@R0
+ XRL A,#01H ;FLIP THE SIGN
+ MOVX @R0,A
+ XRL A,#01H ;RESTORE THE SIGN
+ ;
+ALPAR: RET
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ACBYTE: ; Read the ROM
+ ;
+ ;***************************************************************
+ ;
+ ACALL IFIX ;GET EXPRESSION
+ CALL X31DP ;PUT R3:R1 INTO THE DP
+ CLR A
+ MOVC A,@A+DPTR
+ AJMP TWO_R2
+ ;
+ ;***************************************************************
+ ;
+ADBYTE: ; Read internal memory
+ ;
+ ;***************************************************************
+ ;
+ ACALL IFIX ;GET THE EXPRESSION
+ CALL R3CK ;MAKE SURE R3 = 0
+ MOV A,@R1
+ AJMP TWO_R2
+ ;
+ ;***************************************************************
+ ;
+AXBYTE: ; Read external memory
+ ;
+ ;***************************************************************
+ ;
+ ACALL IFIX ;GET THE EXPRESSION
+AXBYTE1:MOV P2,R3
+ MOVX A,@R1
+ AJMP TWO_R2
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; The relational operators - EQUAL (=)
+ ; GREATER THAN (>)
+ ; LESS THAN (<)
+ ; GREATER THAN OR EQUAL (>=)
+ ; LESS THAN OR EQUAL (<=)
+ ; NOT EQUAL (<>)
+ ;
+ ;***************************************************************
+ ;
+AGT: ACALL CMPLK
+ ORL C,F0 ;SEE IF EITHER IS A ONE
+AGT1: JC P_Z
+ ;
+FSTK: MOV DPTR,#FS
+ AJMP PUSHC
+ ;
+FS: DB 85H
+ DB 00H
+ DB 00H
+ DB 50H
+ DB 53H
+ DB 65H
+ ;
+ALT: ACALL CMPLK
+ALT1: CPL C
+ SJMP AGT1
+ ;
+AEQ: ACALL CMPLK
+AEQ1: MOV C,F0
+ SJMP ALT1
+ ;
+ANE: ACALL CMPLK
+ CPL F0
+ SJMP AEQ1
+ ;
+AGE: ACALL CMPLK
+ SJMP AGT1
+ ;
+ALE: ACALL CMPLK
+ ORL C,F0
+ SJMP ALT1
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ARND: ; Generate a random number
+ ;
+ ;***************************************************************
+ ;
+ MOV DPTR,#RCELL ;GET THE BINARY SEED
+ CALL L31DPI
+ MOV A,R1
+ CLR C
+ RRC A
+ MOV R0,A
+ MOV A,#6
+ RRC A
+ ADD A,R1
+ XCH A,R0
+ ADDC A,R3
+ MOV R2,A
+ DEC DPL ;SAVE THE NEW SEED
+ ACALL S20DP
+ ACALL TWO_EY
+ ACALL FSTK
+ ;
+ADIV: LCALL FP_BASE4
+ AJMP FPTST
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+SONERR: ; ON ERROR Statement
+ ;
+ ;***************************************************************
+ ;
+ LCALL INTERR ;GET THE LINE NUMBER
+ SETB ON_ERR
+ MOV DPTR,#ERRNUM ;POINT AT THR ERROR LOCATION
+ SJMP S20DP
+ ;
+ ;
+ ;**************************************************************
+ ;
+SONEXT: ; ON EXT1 Statement
+ ;
+ ;**************************************************************
+ ;
+ LCALL INTERR
+ SETB INTBIT
+ ORL IE,#10000100B ;ENABLE INTERRUPTS
+ MOV DPTR,#INTLOC
+ ;
+S20DP: MOV A,R2 ;SAVE R2:R0 @DPTR
+ MOVX @DPTR,A
+ INC DPTR
+ MOV A,R0
+ MOVX @DPTR,A
+ RET
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; CASTAK - Copy and push another top of arg stack
+ ;
+ ;***************************************************************
+ ;
+CSTAKA2:ACALL CSTAKA ;COPY STACK TWICE
+ ;
+CSTAKA: ACALL SETREG ;SET UP R2:R0
+ SJMP PUSH_T12
+ ;
+PLNEXP: MOV DPTR,#EXP1
+ ;
+ ;***************************************************************
+ ;
+ ; PUSHC - Push constant on to the arg stack
+ ;
+ ;***************************************************************
+ ;
+PUSHC: ACALL DEC_ASTKA
+ MOV P2,R3
+ MOV R3,#FPSIZ ;LOOP COUNTER
+ ;
+PCL: CLR A ;SET UP A
+ MOVC A,@A+DPTR ;LOAD IT
+ MOVX @R1,A ;SAVE IT
+ INC DPTR ;BUMP POINTERS
+ DEC R1
+ DJNZ R3,PCL ;LOOP
+ ;
+ SETB ARGF
+ RET ;EXIT
+ ;
+PUSH_ONE:;
+ ;
+ MOV DPTR,#FPONE
+ AJMP PUSHC
+ ;
+$EJECT
+ ;
+POP_T1:
+ ;
+ MOV R3,#HIGH FPT1
+ MOV R1,#LOW FPT1
+ JMP POPAS
+ ;
+PUSH_T1:
+ ;
+ MOV R0,#LOW FPT1
+PUSH_T11:
+ MOV R2,#HIGH FPT1
+PUSH_T12:
+ LJMP PUSHAS
+ ;
+P_T2: MOV R0,#LOW FPT2
+ SJMP PUSH_T11 ;JUMP TO PUSHAS
+ ;
+ ;****************************************************************
+ ;
+SWAP_ASTKA: ; SWAP TOS<>TOS-1
+ ;
+ ;****************************************************************
+ ;
+ ACALL SETREG ;SET UP R2:R0 AND P2
+ MOV A,#FPSIZ ;PUT TOS+1 IN R1
+ MOV R2,A
+ ADD A,R0
+ MOV R1,A
+ ;
+S_L: MOVX A,@R0
+ MOV R3,A
+ MOVX A,@R1
+ MOVX @R0,A
+ MOV A,R3
+ MOVX @R1,A
+ DEC R1
+ DEC R0
+ DJNZ R2,S_L
+ RET
+ ;
+$EJECT
+ ;
+C2_T2: ACALL SETREG ;SET UP R2:R0
+ MOV R3,#HIGH FPT2
+ MOV R1,#LOW FPT2 ;TEMP VALUE
+ ;
+ ; Fall thru
+ ;
+ ;***************************************************************
+ ;
+ ; VARCOP - Copy a variable from R2:R0 to R3:R1
+ ;
+ ;***************************************************************
+ ;
+VARCOP: MOV R4,#FPSIZ ;LOAD THE LOOP COUNTER
+ ;
+V_C: MOV P2,R2 ;SET UP THE PORTS
+ MOVX A,@R0 ;READ THE VALUE
+ MOV P2,R3 ;PORT TIME AGAIN
+ MOVX @R1,A ;SAVE IT
+ ACALL DEC3210 ;BUMP POINTERS
+ DJNZ R4,V_C ;LOOP
+ RET ;EXIT
+ ;
+PIPI: MOV DPTR,#PIE
+ AJMP PUSHC
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; The logical operators ANL, ORL, XRL, NOT
+ ;
+ ;***************************************************************
+ ;
+AANL: ACALL TWOL ;GET THE EXPRESSIONS
+ MOV A,R3 ;DO THE AND
+ ANL A,R7
+ MOV R2,A
+ MOV A,R1
+ ANL A,R6
+ SJMP TWO_EX
+ ;
+AORL: ACALL TWOL ;SAME THING FOR OR
+ MOV A,R3
+ ORL A,R7
+ MOV R2,A
+ MOV A,R1
+ ORL A,R6
+ SJMP TWO_EX
+ ;
+ANOT: ACALL FSTK ;PUT 0FFFFH ON THE STACK
+ ;
+AXRL: ACALL TWOL
+ MOV A,R3
+ XRL A,R7
+ MOV R2,A
+ MOV A,R1
+ XRL A,R6
+ SJMP TWO_EX
+ ;
+TWOL: ACALL IFIX
+ MOV R7,R3B0
+ MOV R6,R1B0
+ AJMP IFIX
+ ;
+$EJECT
+ ;*************************************************************
+ ;
+AGET: ; READ THE BREAK BYTE AND PUT IT ON THE ARG STACK
+ ;
+ ;*************************************************************
+ ;
+ MOV DPTR,#GTB ;GET THE BREAK BYTE
+ MOVX A,@DPTR
+ JBC GTRD,TWO_R2
+ CLR A
+ ;
+TWO_R2: MOV R2,#00H ;ACC GOES TO STACK
+ ;
+ ;
+TWO_EX: MOV R0,A ;R2:ACC GOES TO STACK
+ ;
+ ;
+TWO_EY: SETB ARGF ;R2:R0 GETS PUT ON THE STACK
+ JMP FP_BASE12 ;DO IT
+ ;
+$EJECT
+ ;*************************************************************
+ ;
+ ; Put directs onto the stack
+ ;
+ ;**************************************************************
+ ;
+A_IE: MOV A,IE ;IE
+ SJMP TWO_R2
+ ;
+A_IP: MOV A,IP ;IP
+ SJMP TWO_R2
+ ;
+ATIM0: MOV R2,TH0 ;TIMER 0
+ MOV R0,TL0
+ SJMP TWO_EY
+ ;
+ATIM1: MOV R2,TH1 ;TIMER 1
+ MOV R0,TL1
+ SJMP TWO_EY
+ ;
+ATIM2: MOV R2,TH2
+ MOV R0,TL2
+; DB 0AAH ;MOV R2 DIRECT OP CODE
+; DB 0CDH ;T2 HIGH
+; DB 0A8H ;MOV R0 DIRECT OP CODE
+; DB 0CCH ;T2 LOW
+ SJMP TWO_EY ;TIMER 2
+ ;
+AT2CON: MOV A,T2CON
+; DB 0E5H ;MOV A,DIRECT OPCODE
+; DB 0C8H ;T2CON LOCATION
+ SJMP TWO_R2
+ ;
+ATCON: MOV A,TCON ;TCON
+ SJMP TWO_R2
+ ;
+ATMOD: MOV A,TMOD ;TMOD
+ SJMP TWO_R2
+ ;
+ARCAP2: MOV R2,RCAPH2
+ MOV R0,RCAPL2
+; DB 0AAH ;MOV R2, DIRECT OP CODE
+; DB 0CBH ;RCAP2H LOCATION
+; DB 0A8H ;MOV R0, DIRECT OP CODE
+; DB 0CAH ;R2CAPL LOCATION
+ SJMP TWO_EY
+ ;
+AP1: MOV A,P1 ;GET P1
+ SJMP TWO_R2 ;PUT IT ON THE STACK
+ ;
+APCON: MOV A,PCON
+; DB 0E5H ;MOV A, DIRECT OP CODE
+; DB 87H ;ADDRESS OF PCON
+ SJMP TWO_R2 ;PUT PCON ON THE STACK
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ;THIS IS THE LINE EDITOR
+ ;
+ ;TAKE THE PROCESSED LINE IN IBUF AND INSERT IT INTO THE
+ ;BASIC TEXT FILE.
+ ;
+ ;***************************************************************
+ ;
+LINE0: LJMP NOGO ;CAN'T EDIT A ROM
+ ;
+LINE: MOV A,BOFAH
+ CJNE A,#HIGH PSTART,LINE0
+ CALL G4 ;GET END ADDRESS FOR EDITING
+ MOV R4,DPL
+ MOV R5,DPH
+ MOV R3,TEMP5 ;GET HIGH ORDER IBLN
+ MOV R1,TEMP4 ;LOW ORDER IBLN
+ ;
+ CALL GETLIN ;FIND THE LINE
+ JNZ INSR ;INSERT IF NOT ZERO, ELSE APPEND
+ ;
+ ;APPEND THE LINE AT THE END
+ ;
+ MOV A,TEMP3 ;PUT IBCNT IN THE ACC
+ CJNE A,#4H,LINE1 ;SEE IF NO ENTRY
+ RET ;RET IF NO ENTRY
+ ;
+LINE1: ACALL FULL ;SEE IF ENOUGH SPACE LEFT
+ MOV R2,R5B0 ;PUT END ADDRESS A INTO TRANSFER
+ MOV R0,R4B0 ;REGISTERS
+ ACALL IMOV ;DO THE BLOCK MOVE
+ ;
+UE: MOV A,#EOF ;SAVE EOF CHARACTER
+ AJMP TBR
+ ;
+ ;INSERT A LINE INTO THE FILE
+ ;
+INSR: MOV R7,A ;SAVE IT IN R7
+ CALL TEMPD ;SAVE INSERATION ADDRESS
+ MOV A,TEMP3 ;PUT THE COUNT LENGTH IN THE ACC
+ JC LTX ;JUMP IF NEW LINE # NOT = OLD LINE #
+ CJNE A,#04H,INSR1 ;SEE IF NULL
+ CLR A
+ ;
+INSR1: SUBB A,R7 ;SUBTRACT LINE COUNT FROM ACC
+ JZ LIN1 ;LINE LENGTHS EQUAL
+ JC GTX ;SMALLER LINE
+ ;
+$EJECT
+ ;
+ ;EXPAND FOR A NEW LINE OR A LARGER LINE
+ ;
+LTX: MOV R7,A ;SAVE A IN R7
+ MOV A,TEMP3 ;GET THE COUNT IN THE ACC
+ CJNE A,#04H,LTX1 ;DO NO INSERTATION IF NULL LINE
+ RET ;EXIT IF IT IS
+ ;
+LTX1: MOV A,R7 ;GET THE COUNT BACK - DELTA IN A
+ ACALL FULL ;SEE IF ENOUGH MEMORY NEW EOFA IN R3:R1
+ CALL DTEMP ;GET INSERATION ADDRESS
+ ACALL NMOV ;R7:R6 GETS (EOFA)-DPTR
+ CALL X3120
+ MOV R1,R4B0 ;EOFA LOW
+ MOV R3,R5B0 ;EOFA HIGH
+ INC R6 ;INCREMENT BYTE COUNT
+ CJNE R6,#00,LTX2 ;NEED TO BUMP HIGH BYTE?
+ INC R7
+ ;
+LTX2: ACALL RMOV ;GO DO THE INSERTION
+ SJMP LIN1 ;INSERT THE CURRENT LINE
+ ;
+GTX: CPL A ;FLIP ACC
+ INC A ;TWOS COMPLEMENT
+ CALL ADDPTR ;DO THE ADDITION
+ ACALL NMOV ;R7:R6 GETS (EOFA)-DPTR
+ MOV R1,DPL ;SET UP THE REGISTERS
+ MOV R3,DPH
+ MOV R2,TEMP5 ;PUT INSERTATION ADDRESS IN THE RIGHT REG
+ MOV R0,TEMP4
+ JZ GTX1 ;IF ACC WAS ZERO FROM NMOV, JUMP
+ ACALL LMOV ;IF NO ZERO DO A LMOV
+ ;
+GTX1: ACALL UE ;SAVE NEW END ADDRESS
+ ;
+LIN1: MOV R2,TEMP5 ;GET THE INSERTATION ADDRESS
+ MOV R0,TEMP4
+ MOV A,TEMP3 ;PUT THE COUNT LENGTH IN ACC
+ CJNE A,#04H,IMOV ;SEE IF NULL
+ RET ;EXIT IF NULL
+$EJECT
+ ;***************************************************************
+ ;
+ ;INSERT A LINE AT ADDRESS R2:R0
+ ;
+ ;***************************************************************
+ ;
+IMOV: CLR A ;TO SET UP
+ MOV R1,#LOW IBCNT ;INITIALIZE THE REGISTERS
+ MOV R3,A
+ MOV R6,TEMP3 ;PUT THE BYTE COUNT IN R6 FOR LMOV
+ MOV R7,A ;PUT A 0 IN R7 FOR LMOV
+ ;
+ ;***************************************************************
+ ;
+ ;COPY A BLOCK FROM THE BEGINNING
+ ;
+ ;R2:R0 IS THE DESTINATION ADDRESS
+ ;R3:R1 IS THE SOURCE ADDRESS
+ ;R7:R6 IS THE COUNT REGISTER
+ ;
+ ;***************************************************************
+ ;
+LMOV: ACALL TBYTE ;TRANSFER THE BYTE
+ ACALL INC3210 ;BUMP THE POINTER
+ ACALL DEC76 ;BUMP R7:R6
+ JNZ LMOV ;LOOP
+ RET ;GO BACK TO CALLING ROUTINE
+ ;
+INC3210:INC R0
+ CJNE R0,#00H,INC3211
+ INC R2
+ ;
+INC3211:INC R1
+ CJNE R1,#00H,INC3212
+ INC R3
+INC3212:RET
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ;COPY A BLOCK STARTING AT THE END
+ ;
+ ;R2:R0 IS THE DESTINATION ADDRESS
+ ;R3:R1 IS THE SOURCE ADDRESS
+ ;R6:R7 IS THE COUNT REGISTER
+ ;
+ ;***************************************************************
+ ;
+RMOV: ACALL TBYTE ;TRANSFER THE BYTE
+ ACALL DEC3210 ;DEC THE LOCATIONS
+ ACALL DEC76 ;BUMP THE COUNTER
+ JNZ RMOV ;LOOP
+ ;
+DEC_R: NOP ;CREATE EQUAL TIMING
+ RET ;EXIT
+ ;
+DEC3210:DEC R0 ;BUMP THE POINTER
+ CJNE R0,#0FFH,DEC3212;SEE IF OVERFLOWED
+DEC3211:DEC R2 ;BUMP THE HIGH BYTE
+DEC3212:DEC R1 ;BUMP THE POINTER
+ CJNE R1,#0FFH,DEC_R ;SEE IF OVERFLOWED
+ DEC R3 ;CHANGE THE HIGH BYTE
+ RET ;EXIT
+ ;
+ ;***************************************************************
+ ;
+ ;TBYTE - TRANSFER A BYTE
+ ;
+ ;***************************************************************
+ ;
+TBYTE: MOV P2,R3 ;OUTPUT SOURCE REGISTER TO PORT
+ MOVX A,@R1 ;PUT BYTE IN ACC
+ ;
+TBR: MOV P2,R2 ;OUTPUT DESTINATION TO PORT
+ MOVX @R0,A ;SAVE THE BYTE
+ RET ;EXIT
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ;NMOV - R7:R6 = END ADDRESS - DPTR
+ ;
+ ;ACC GETS CLOBBERED
+ ;
+ ;***************************************************************
+ ;
+NMOV: MOV A,R4 ;THE LOW BYTE OF EOFA
+ CLR C ;CLEAR THE CARRY FOR SUBB
+ SUBB A,DPL ;SUBTRACT DATA POINTER LOW
+ MOV R6,A ;PUT RESULT IN R6
+ MOV A,R5 ;HIGH BYTE OF EOFA
+ SUBB A,DPH ;SUBTRACT DATA POINTER HIGH
+ MOV R7,A ;PUT RESULT IN R7
+ ORL A,R6 ;SEE IF ZERO
+NMOV1: RET ;EXIT
+ ;
+ ;***************************************************************
+ ;
+ ;CHECK FOR A FILE OVERFLOW
+ ;LEAVES THE NEW END ADDRESS IN R3:R1
+ ;A HAS THE INCREASE IN SIZE
+ ;
+ ;***************************************************************
+ ;
+FULL: ADD A,R4 ;ADD A TO END ADDRESS
+ MOV R1,A ;SAVE IT
+ CLR A
+ ADDC A,R5 ;ADD THE CARRY
+ MOV R3,A
+ MOV DPTR,#VARTOP ;POINT AT VARTOP
+ ;
+FUL1: CALL DCMPX ;COMPARE THE TWO
+ JC NMOV1 ;OUT OF ROOM
+ ;
+TB: MOV DPTR,#E5X ;OUT OF MEMORY
+ AJMP FPTS
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; PP - Preprocesses the line in IBUF back into IBUF
+ ; sets F0 if no line number
+ ; leaves the correct length of processed line in IBCNT
+ ; puts the line number in IBLN
+ ; wastes the text address TXAL and TXAH
+ ;
+ ;***************************************************************
+ ;
+PP: ACALL T_BUF ;TXA GETS IBUF
+ CALL INTGER ;SEE IF A NUMBER PRESENT
+ CALL TEMPD ;SAVE THE INTEGER IN TEMP5:TEMP4
+ MOV F0,C ;SAVE INTEGER IF PRESENT
+ MOV DPTR,#IBLN ;SAVE THE LINE NUMBER, EVEN IF NONE
+ ACALL S20DP
+ MOV R0,TXAL ;TEXT POINTER
+ MOV R1,#LOW IBUF ;STORE POINTER
+ ;
+ ; Now process the line back into IBUF
+ ;
+PPL: CLR ARGF ;FIRST PASS DESIGNATOR
+ MOV DPTR,#TOKTAB ;POINT DPTR AT LOOK UP TABLE
+ ;
+PPL1: MOV R5B0,R0 ;SAVE THE READ POINTER
+ CLR A ;ZERO A FOR LOOKUP
+ MOVC A,@A+DPTR ;GET THE TOKEN
+ MOV R7,A ;SAVE TOKEN IN CASE OF MATCH
+ ;
+PPL2: MOVX A,@R0 ;GET THE USER CHARACTER
+ MOV R3,A ;SAVE FOR REM
+ CJNE A,#'a',PPL21
+PPL21: JC PPX ;CONVERT LOWER TO UPPER CASE
+ CJNE A,#('z'+1),PPL22
+PPL22: JNC PPX
+ CLR ACC.5
+ ;
+PPX: MOV R2,A
+ MOVX @R0,A ;SAVE UPPER CASE
+ INC DPTR ;BUMP THE LOOKUP POINTER
+ CLR A
+ MOVC A,@A+DPTR
+ CJNE A,R2B0,PPL3 ;LEAVE IF NOT THE SAME
+ INC R0 ;BUMP THE USER POINTER
+ SJMP PPL2 ;CONTINUE TO LOOP
+ ;
+PPL3: JB ACC.7,PPL6 ;JUMP IF FOUND MATCH
+ JZ PPL6 ;USER MATCH
+ ;
+ ;
+ ; Scan to the next TOKTAB entry
+ ;
+PPL4: INC DPTR ;ADVANCE THE POINTER
+ CLR A ;ZERO A FOR LOOKUP
+ MOVC A,@A+DPTR ;LOAD A WITH TABLE
+ JB ACC.7,PPL41 ;KEEP SCANNING IF NOT A RESERVED WORD
+ JNZ PPL4
+ INC DPTR
+ ;
+ ; See if at the end of TOKTAB
+ ;
+PPL41: MOV R0,R5B0 ;RESTORE THE POINTER
+ CJNE A,#0FFH,PPL1 ;SEE IF END OF TABLE
+ ;
+ ; Character not in TOKTAB, so see what it is
+ ;
+ CJNE R2,#' ',PPLX ;SEE IF A SPACE
+ INC R0 ;BUMP USER POINTER
+ SJMP PPL ;TRY AGAIN
+ ;
+PPLX: JNB XBIT,PPLY ;EXTERNAL TRAP
+ JB ARGF,PPLY
+ SETB ARGF ;SAYS THAT THE USER HAS TABLE
+ LCALL 2078H ;SET UP POINTER
+ AJMP PPL1
+ ;
+PPLY: ACALL PPL7 ;SAVE CHARACTER, EXIT IF A CR
+ CJNE A,#'"',PPL ;SEE IF QUOTED STRING, START AGAIN IF NOT
+ ;
+ ; Just copy a quoted string
+ ;
+PPLY1: ACALL PPL7 ;SAVE THE CHARACTER, TEST FOR CR
+ CJNE A,#'"',PPLY1 ;IS THERE AN ENDQUOTE, IF NOT LOOP
+ SJMP PPL ;DO IT AGAIN IF ENDQUOTE
+ ;
+PPL6: MOV A,R7 ;GET THE TOKEN
+ ACALL PPL91 ;SAVE THE TOKEN
+ CJNE A,#T_REM,PPL ;SEE IF A REM TOKEN
+ MOV A,R3
+ ACALL PPL71 ;WASTE THE REM STATEMENT
+PPL61: ACALL PPL7 ;LOOP UNTIL A CR
+ SJMP PPL61
+ ;
+PPL7: MOVX A,@R0 ;GET THE CHARACTER
+PPL71: CJNE A,#CR,PPL9 ;FINISH IF A CR
+ POP R0B0 ;WASTE THE CALLING STACK
+ POP R0B0
+ MOVX @R1,A ;SAVE CR IN MEMORY
+ INC R1 ;SAVE A TERMINATOR
+ MOV A,#EOF
+ MOVX @R1,A
+ MOV A,R1 ;SUBTRACT FOR LENGTH
+ SUBB A,#4
+ MOV TEMP3,A ;SAVE LENGTH
+ MOV R1,#LOW IBCNT ;POINT AT BUFFER COUNT
+ ;
+PPL9: INC R0
+PPL91: MOVX @R1,A ;SAVE THE CHARACTER
+ INC R1 ;BUMP THE POINTERS
+ RET ;EXIT TO CALLING ROUTINE
+ ;
+ ;
+ ;***************************************************************
+ ;
+ ;DEC76 - DECREMENT THE REGISTER PAIR R7:R6
+ ;
+ ;ACC = ZERO IF R7:R6 = ZERO ; ELSE ACC DOES NOT
+ ;
+ ;***************************************************************
+ ;
+DEC76: DEC R6 ;BUMP R6
+ CJNE R6,#0FFH,DEC77 ;SEE IF RAPPED AROUND
+ DEC R7
+DEC77: MOV A,R7 ;SEE IF ZERO
+ ORL A,R6
+ RET ;EXIT
+ ;
+ ;***************************************************************
+ ;
+ ; MTOP - Get or Put the top of assigned memory
+ ;
+ ;***************************************************************
+ ;
+PMTOP: MOV DPTR,#MEMTOP
+PMTOP1: CALL L20DPI
+ AJMP TWO_EY ;PUT R2:R0 ON THE STACK
+ ;
+$EJECT
+ ;*************************************************************
+ ;
+ ; AXTAL - Crystal value calculations
+ ;
+ ;*************************************************************
+ ;
+AXTAL0: MOV DPTR,#XTALV ;CRYSTAL VALUE
+ ACALL PUSHC
+ ;
+AXTAL1: ACALL CSTAKA2 ;COPY CRYSTAL VALUE TWICE
+ ACALL CSTAKA
+ MOV DPTR,#PTIME ;PROM TIMER
+ ACALL AXTAL2
+ MOV DPTR,#PROGS
+ ACALL S31L
+ MOV DPTR,#IPTIME ;IPROM TIMER
+ ACALL AXTAL2
+ MOV DPTR,#IPROGS
+ ACALL S31L
+ MOV DPTR,#TTIME ;CLOCK CALCULATION
+ ACALL AXTAL3
+ MOV A,R1
+ CPL A
+ INC A
+ MOV SAVE_T,A
+ MOV R3,#HIGH CXTAL
+ MOV R1,#LOW CXTAL
+ JMP POPAS
+ ;
+AXTAL2: ACALL AXTAL3
+ ;
+CBIAS: ;Bias the crystal calculations
+ ;
+ MOV A,R1 ;GET THE LOW COUNT
+ CPL A ;FLIP IT FOR TIMER LOAD
+ ADD A,#15 ;BIAS FOR CALL AND LOAD TIMES
+ MOV R1,A ;RESTORE IT
+ MOV A,R3 ;GET THE HIGH COUNT
+ CPL A ;FLIP IT
+ ADDC A,#00H ;ADD THE CARRY
+ MOV R3,A ;RESTORE IT
+ RET
+ ;
+$EJECT
+;$INCLUDE(:F2:BAS52.PWM)
+;BEGINNING
+ ;**************************************************************
+ ;
+STONE: ; Toggle the I/O port
+ ;
+ ;**************************************************************
+ ;
+ CALL THREE ;GET THE NUMBERS
+ ACALL CBIAS ;BIAS R3:R1 FOR COUNT LOOP
+ ;
+STONE1: CLR T_BIT ;TOGGLE THE BIT
+ CLR TR1 ;STOP THE TIMER
+ MOV TH1,R3 ;LOAD THE TIMER
+ MOV TL1,R1
+ CLR TF1 ;CLEAR THE OVERFLOW FLAG
+ SETB TR1 ;TURN IT ON
+ ACALL DEC76
+ JNB TF1,$ ;WAIT
+ ACALL ALPAR
+ SETB T_BIT ;BACK TO A ONE
+ CALL TIMER_LOAD1 ;LOAD THE HIGH VALUE
+ JNB TF1,$ ;WAIT
+ JNZ STONE1 ;LOOP
+ RET
+ ;
+
+;END
+;$INCLUDE(:F2:BAS52.PWM)
+$EJECT
+ ;LNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLN
+ ;
+LNTAB: ; Natural log lookup table
+ ;
+ ;LNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLN
+ ;
+ DB 80H
+ DB 00H
+ DB 71H
+ DB 37H
+ DB 13H
+ DB 19H
+ ;
+ DB 7FH
+ DB 00H
+ DB 76H
+ DB 64H
+ DB 37H
+ DB 94H
+ ;
+ DB 80H
+ DB 00H
+ DB 07H
+ DB 22H
+ DB 75H
+ DB 17H
+ ;
+ DB 80H
+ DB 00H
+ DB 52H
+ DB 35H
+ DB 93H
+ DB 28H
+ ;
+ DB 80H
+ DB 00H
+ DB 71H
+ DB 91H
+ DB 85H
+ DB 86H
+ ;
+ DB 0FFH
+ ;
+ DB 81H
+ DB 00H
+ DB 51H
+ DB 58H
+ DB 02H
+ DB 23H
+ ;
+$EJECT
+ ;SINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSIN
+ ;
+SINTAB: ; Sin lookup table
+ ;
+ ;SINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSIN
+ ;
+ DB 128-9
+ DB 00H
+ DB 44H
+ DB 90H
+ DB 05H
+ DB 16H
+ ;
+ DB 128-7
+ DB 01H
+ DB 08H
+ DB 21H
+ DB 05H
+ DB 25H
+ ;
+ DB 128-5
+ DB 00H
+ DB 19H
+ DB 73H
+ DB 55H
+ DB 27H
+ ;
+$EJECT
+ ;
+ DB 128-3
+ DB 01H
+ DB 70H
+ DB 12H
+ DB 84H
+ DB 19H
+ ;
+ DB 128-2
+ DB 00H
+ DB 33H
+ DB 33H
+ DB 33H
+ DB 83H
+ ;
+ DB 128
+ DB 01H
+ DB 67H
+ DB 66H
+ DB 66H
+ DB 16H
+ ;
+FPONE: DB 128+1
+ DB 00H
+ DB 00H
+ DB 00H
+ DB 00H
+ DB 10H
+ ;
+ DB 0FFH ;END OF TABLE
+ ;
+$EJECT
+ ;
+SBAUD: CALL AXTAL ;PUT CRYSTAL ON THE STACK
+ CALL EXPRB ;PUT THE NUMBER AFTER BAUD ON STACK
+ MOV A,#12
+ ACALL TWO_R2 ;TOS = 12
+ ACALL AMUL ;TOS = 12*BAUD
+ ACALL ADIV ;TOS = XTAL/(12*BAUD)
+ ACALL IFIX
+ ACALL CBIAS
+ MOV DPTR,#SPV
+ ;
+S31L: JMP S31DP
+ ;
+AFREE: CALL PMTOP ;PUT MTOP ON STACK
+ CALL G4 ;GET END ADDRESS
+ MOV R0,DPL
+ MOV R2,DPH
+ ACALL TWO_EY
+ ;
+ASUB: LCALL FP_BASE1 ;DO FP SUB
+ AJMP FPTST
+ ;
+ALEN: CALL CCAL ;CALCULATE THE LEN OF THE SELECTED PROGRAM
+ MOV R2,R7B0 ;SAVE THE HIGH BYTE
+ MOV A,R6 ;SAVE THE LOW BYTE
+ AJMP TWO_EX ;PUT IT ON THE STACK
+ ;
+ATIME: MOV C,EA ;SAVE INTERRUTS
+ CLR EA
+ PUSH MILLIV ;SAVE MILLI VALUE
+ MOV R2,TVH ;GET THE TIMER
+ MOV A,TVL
+ MOV EA,C ;SAVE INTERRUPTS
+ ACALL TWO_EX ;PUT TIMER ON THE STACK
+ POP ACC ;GET MILLI
+ ACALL TWO_R2 ;PUT MILLI ON STACK
+ MOV A,#200
+ ACALL TWO_R2 ;DIVIDE MILLI BY 200
+ ACALL ADIV
+ ;
+AADD: LCALL FP_BASE ;DO FP ADDITION
+ AJMP FPTST ;CHECK FOR ERRORS
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+ ; Here are some error messages that were moved
+ ;
+ ;**************************************************************
+ ;
+ ;
+E1X: DB 'BAD SYNTAX"'
+E2X: DB 128+10
+ DB 'DIVIDE BY ZERO"'
+ ;
+E6X: DB 'ARRAY SIZE"'
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+T_BUF: ; TXA gets IBUF
+ ;
+ ;**************************************************************
+ ;
+ MOV TXAH,#HIGH IBUF
+ MOV TXAL,#LOW IBUF
+ RET
+ ;
+ ;
+ ;***************************************************************
+ ;
+CXFER: ; Transfer a program from rom to ram
+ ;
+ ;***************************************************************
+ ;
+ CALL CCAL ;GET EVERYTHING SET UP
+ MOV R2,#HIGH PSTART
+ MOV R0,#LOW PSTART
+ ACALL LMOV ;DO THE TRANSFER
+ CALL RCLEAR ;CLEAR THE MEMORY
+ ;
+ ; Fall thru to CRAM
+ ;
+ ;***************************************************************
+ ;
+CRAM: ; The command action routine - RAM - Run out of ram
+ ;
+ ;***************************************************************
+ ;
+ CLR CONB ;CAN'T CONTINUE IF MODE CHANGE
+ MOV BOFAH,#HIGH PSTART
+ MOV BOFAL,#LOW PSTART
+ ;
+ ; Fall thru to Command Processor
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+CMND1: ; The entry point for the command processor
+ ;
+ ;***************************************************************
+ ;
+ LCALL SPRINT1 ;WASTE AT AND HEX
+ CLR XBIT ;TO RESET IF NEEDED
+ CLR A
+ MOV DPTR,#2002H ;CHECK FOR EXTERNAL TRAP PACKAGE
+ MOVC A,@A+DPTR
+ CJNE A,#5AH,CMND11
+ LCALL 2048H ;IF PRESENT JUMP TO LOCATION 200BH
+CMND11: MOV DPTR,#RDYS ;PRINT THE READY MESSAGE
+ CALL CRP ;DO A CR, THEN, PRINT FROM THE ROM
+ ;
+CMNDR: SETB DIRF ;SET THE DIRECT INPUT BIT
+ MOV SP,SPSAV ;LOAD THE STACK
+ ACALL CL7 ;DO A CRLF
+ ;
+CMNX: CLR GTRD ;CLEAR BREAK
+ MOV DPTR,#5EH ;DO RUN TRAP
+ MOVX A,@DPTR
+ XRL A,#52
+ JNZ CMNX1
+ LJMP CRUN
+CMNX1: MOV R5,#'>' ;OUTPUT A PROMPT
+ LCALL TEROT
+ CALL INLINE ;INPUT A LINE INTO IBUF
+ CALL PP ;PRE-PROCESS THE LINE
+ JB F0,CMND3 ;NO LINE NUMBER
+ CALL LINE ;PROCESS THE LINE
+ LCALL LCLR
+ JB LINEB,CMNX ;DON'T CLEAR MEMORY IF NO NEED
+ SETB LINEB
+ LCALL RCLEAR ;CLEAR THE MEMORY
+ SJMP CMNX ;LOOP BACK
+ ;
+CMND3: CALL T_BUF ;SET UP THE TEXT POINTER
+ CALL DELTST ;GET THE CHARACTER
+ JZ CMNDR ;IF CR, EXIT
+ MOV DPTR,#CMNDD ;POINT AT THE COMMAND LOOKUP
+ CJNE A,#T_CMND,CMND31;PROCESS STATEMENT IF NOT A COMMAND
+CMND31: JC CMND5
+ CALL GCI1 ;BUMP TXA
+ ANL A,#0FH ;STRIP MSB'S FOR LOOKUP
+ LCALL ISTA1 ;PROCESS COMMAND
+ SJMP CMNDR
+ ;
+CMND5: LJMP ILOOP ;CHECK FOR A POSSIBLE BREAK
+ ;
+ ;
+ ;
+ ;CONSTANTS
+ ;
+XTALV: DB 128+8 ; DEFAULT CRYSTAL VALUE
+ DB 00H
+ DB 00H
+ DB 92H
+ DB 05H
+ DB 11H
+ ;
+EXP11: DB 85H
+ DB 00H
+ DB 42H
+ DB 41H
+ DB 87H
+ DB 59H
+ ;
+EXP1: DB 128+1 ; EXP(1)
+ DB 00H
+ DB 18H
+ DB 28H
+ DB 18H
+ DB 27H
+ ;
+IPTIME: DB 128-4 ;FPROG TIMING
+ DB 00H
+ DB 00H
+ DB 00H
+ DB 75H
+ DB 83H
+ ;
+PIE: DB 128+1 ;PI
+ DB 00H
+ DB 26H
+ DB 59H
+ DB 41H
+ DB 31H ; 3.1415926
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; The error messages, some have been moved
+ ;
+ ;***************************************************************
+ ;
+E7X: DB 128+30
+ DB 'ARITH. UNDERFLOW"'
+ ;
+E5X: DB 'MEMORY ALLOCATION"'
+ ;
+E3X: DB 128+40
+ DB 'BAD ARGUMENT"'
+ ;
+EXI: DB 'I-STACK"'
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; The command action routine - CONTINUE
+ ;
+ ;***************************************************************
+ ;
+CCONT: MOV DPTR,#E15X
+ JNB CONB,ERROR ;ERROR IF CONTINUE IS NOT SET
+ ;
+CC1: ;used for input statement entry
+ ;
+ MOV TXAH,INTXAH ;RESTORE TXA
+ MOV TXAL,INTXAL
+ JMP CILOOP ;EXECUTE
+ ;
+DTEMP: MOV DPH,TEMP5 ;RESTORE DPTR
+ MOV DPL,TEMP4
+ RET
+ ;
+TEMPD: MOV TEMP5,DPH
+ MOV TEMP4,DPL
+ RET
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+I_DL: ; IDLE
+ ;
+ ;**************************************************************
+ ;
+ JB DIRF,E1XX ;SYNTAX ERROR IN DIRECT INPUT
+ CLR DACK ;ACK IDLE
+ ;
+U_ID1: ORL PCON,#01H
+; DB 01000011B ;ORL DIRECT OP CODE
+; DB 87H ;PCON ADDRESS
+; DB 01H ;SET IDLE BIT
+ JB INTPEN,I_RET ;EXIT IF EXTERNAL INTERRUPT
+ JBC U_IDL,I_RET ;EXIT IF USER WANTS TO
+ JNB OTS,U_ID1 ;LOOP IF TIMER NOT ENABLED
+ LCALL T_CMP ;CHECK THE TIMER
+ JC U_ID1 ;LOOP IF TIME NOT BIG ENOUGH
+ ;
+I_RET: SETB DACK ;RESTORE EXECUTION
+ RET ;EXIT IF IT IS
+ ;
+ ;
+ ;
+ER0: INC DPTR ;BUMP TO TEXT
+ JB DIRF,ERROR0 ;CAN'T GET OUT OF DIRECT MODE
+ JNB ON_ERR,ERROR0 ;IF ON ERROR ISN'T SET, GO BACK
+ MOV DPTR,#ERRLOC ;SAVE THE ERROR CODE
+ CALL RC2 ;SAVE ERROR AND SET UP THE STACKS
+ INC DPTR ;POINT AT ERRNUM
+ JMP ERL4 ;LOAD ERR NUM AND EXIT
+ ;
+$EJECT
+ ;
+ ; Syntax error
+ ;
+E1XX: MOV C,DIRF ;SEE IF IN DIRECT MODE
+E1XX1: MOV DPTR,#E1X ;ERROR MESSAGE
+ SJMP ERROR1 ;TRAP ON SET DIRF
+ ;
+E1XX2: MOV DPTR,#EXI ;STACK ERROR
+ ;
+ ; Falls through
+ ;
+ ;***************************************************************
+ ;
+ ;ERROR PROCESSOR - PRINT OUT THE ERROR TYPE, CHECK TO SEE IF IN
+ ; RUN OR COMMAND MODE, FIND AND PRINT OUT THE
+ ; LINE NUMBER IF IN RUN MODE
+ ;
+ ;***************************************************************
+ ;
+ERROR: CLR C ;RESET STACK
+ERROR1: MOV SP,SPSAV ;RESET THE STACK
+ LCALL SPRINT1 ;CLEAR LINE AND AT MODE
+ CLR A ;SET UP TO GET ERROR CODE
+ MOVC A,@A+DPTR
+ JBC ACC.7,ER0 ;PROCESS ERROR
+ ;
+ERROR0: ACALL TEMPD ;SAVE THE DATA POINTER
+ JC ERROR01 ;NO RESET IF CARRY IS SET
+ LCALL RC1 ;RESET THE STACKS
+ERROR01:CALL CRLF2 ;DO TWO CARRIAGE RET - LINE FEED
+ MOV DPTR,#ERS ;OUTPUT ERROR MESSAGE
+ CALL ROM_P
+ CALL DTEMP ;GET THE ERROR MESSAGE BACK
+ ;
+ERRS: CALL ROM_P ;PRINT ERROR TYPE
+ JNB DIRF,ER1 ;DO NOT PRINT IN LINE IF DIRF=1
+ ;
+SERR1: CLR STOPBIT ;PRINT STOP THEN EXIT, FOR LIST
+ JMP CMND1
+ ;
+ER1: MOV DPTR,#INS ;OUTPUT IN LINE
+ CALL ROM_P
+ ;
+ ;NOW, FIND THE LINE NUMBER
+ ;
+ ;
+$EJECT
+ ;
+ ;
+ CALL DP_B ;GET THE FIRST ADDRESS OF THE PROGRAM
+ CLR A ;FOR INITIALIZATION
+ ;
+ER2: ACALL TEMPD ;SAVE THE DPTR
+ CALL ADDPTR ;ADD ACC TO DPTR
+ ACALL ER4 ;R3:R1 = TXA-DPTR
+ JC ER3 ;EXIT IF DPTR>TXA
+ JZ ER3 ;EXIT IF DPTR=TXA
+ MOVX A,@DPTR ;GET LENGTH
+ CJNE A,#EOF,ER2 ;SEE IF AT THE END
+ ;
+ER3: ACALL DTEMP ;PUT THE LINE IN THE DPTR
+ ACALL ER4 ;R3:R1 = TXA - BEGINNING OF LINE
+ MOV A,R1 ;GET LENGTH
+ ADD A,#10 ;ADD 10 TO LENGTH, DPTR STILL HAS ADR
+ MOV MT1,A ;SAVE THE COUNT
+ INC DPTR ;POINT AT LINE NUMBER HIGH BYTE
+ CALL PMTOP1 ;LOAD R2:R0, PUT IT ON THE STACK
+ ACALL FP_BASE7 ;OUTPUT IT
+ JB STOPBIT,SERR1 ;EXIT IF STOP BIT SET
+ CALL CRLF2 ;DO SOME CRLF'S
+ CALL DTEMP
+ CALL UPPL ;UNPROCESS THE LINE
+ CALL CL6 ;PRINT IT
+ER31: MOV R5,#'-' ;OUTPUT DASHES, THEN AN X
+ ACALL T_L ;PRINT AN X IF ERROR CHARACTER FOUND
+ DJNZ MT1,ER31 ;LOOP UNTIL DONE
+ MOV R5,#'X'
+ ACALL T_L
+ AJMP SERR1
+ ;
+ER4: MOV R3,TXAH ;GET TEXT POINTER AND PERFORM SUBTRACTION
+ MOV R1,TXAL
+ JMP DUBSUB
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+ ; Interrupt driven timer
+ ;
+ ;**************************************************************
+ ;
+I_DR: MOV TH0,SAVE_T ;LOAD THE TIMER
+ XCH A,MILLIV ;SAVE A, GET MILLI COUNTER
+ INC A ;BUMP COUNTER
+ CJNE A,#200,TR ;CHECK OUT TIMER VALUE
+ CLR A ;FORCE ACC TO BE ZERO
+ INC TVL ;INCREMENT LOW TIMER
+ CJNE A,TVL,TR ;CHECK LOW VALUE
+ INC TVH ;BUMP TIMER HIGH
+ ;
+TR: XCH A,MILLIV
+ POP PSW
+ RETI
+ ;
+$EJECT
+;$INCLUDE(:F2:BAS52.CLK)
+;BEGINNING
+ ;**************************************************************
+ ;
+ ; The statement action routine - CLOCK
+ ;
+ ;**************************************************************
+ ;
+SCLOCK: ACALL OTST ;GET CHARACTER AFTER CLOCK TOKEN
+ CLR ET0
+ CLR C_BIT
+ JNC SC_R ;EXIT IF A ZERO
+ ANL TMOD,#0F0H ;SET UP THE MODE
+ SETB C_BIT ;USER INTERRUPTS
+ ORL IE,#82H ;ENABLE ET0 AND EA
+ SETB TR0 ;TURN ON THE TIMER
+ ;
+SC_R: RET
+ ;
+
+;END
+;$INCLUDE(:F2:BAS52.CLK)
+ ;***************************************************************
+ ;
+SUI: ; Statement USER IN action routine
+ ;
+ ;***************************************************************
+ ;
+ ACALL OTST
+ MOV CIUB,C ;SET OR CLEAR CIUB
+ RET
+ ;
+ ;***************************************************************
+ ;
+SUO: ; Statement USER OUT action routine
+ ;
+ ;***************************************************************
+ ;
+ ACALL OTST
+ MOV COUB,C
+ RET
+ ;
+OTST: ; Check for a one
+ ;
+ LCALL GCI ;GET THE CHARACTER, CLEARS CARRY
+ SUBB A,#'1' ;SEE IF A ONE
+ CPL C ;SETS CARRY IF ONE, CLEARS IT IF ZERO
+OTST1: RET
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+ ; IBLK - EXECUTE USER SUPPLIED TOKEN
+ ;
+ ;**************************************************************
+ ;
+IBLK: JB PSW.4,OTST1 ;EXIT IF REGISTER BANK <> 0
+ JB PSW.3,OTST1
+ JBC ACC.7,IBLK1 ;SEE IF BIT SEVEN IS SET
+ MOV DPTR,#USENT ;USER ENTRY LOCATION
+ LJMP ISTA1
+ ;
+IBLK1: JB ACC.0,FP_BASE6 ;FLOATING POINT INPUT
+ JZ T_L ;DO OUTPUT ON 80H
+ MOV DPTR,#FP_BASE-2
+ JMP @A+DPTR
+ ;
+ ;
+ ;**************************************************************
+ ;
+ ; GET_NUM - GET A NUMBER, EITHER HEX OR FLOAT
+ ;
+ ;**************************************************************
+ ;
+GET_NUM:ACALL FP_BASE5 ;SCAN FOR HEX
+ JNC FP_BASE6 ;DO FP INPUT
+ ;
+ ACALL FP_BASE9 ;ASCII STRING TO R2:R0
+ JNZ H_RET
+ PUSH DPH ;SAVE THE DATA_POINTER
+ PUSH DPL
+ ACALL FP_BASE12 ;PUT R2:R0 ON THE STACK
+ POP DPL ;RESTORE THE DATA_POINTER
+ POP DPH
+ CLR A ;NO ERRORS
+ RET ;EXIT
+ ;
+$EJECT
+
+ ; START OF BAUD RATE MODIFICATIONS BY DANIEL WALLNER
+TIB1:MOV ACC,TL2
+ JB ACC.3,TIB1
+ CALL DEC3211
+TIB2: MOV ACC,TL2
+ JNB ACC.3,TIB2
+ JNB RXD,TIB1 ;16x12 CLOCKS, LOOP UNTIL DONE
+ JB RXD,$ ;WAIT FOR STOP CHARACTER TO END
+ RET
+
+ ;**************************************************************
+ ;
+ ; WB - THE EGO MESSAGE
+ ;
+ ;**************************************************************
+ ;
+WB:
+; DB 'W'+80H,'R'+80H
+; DB 'I'+80H,'T'+80H,'T','E'+80H,'N'+80H
+; DB ' ','B'+80H,'Y'+80H,' '
+; DB 'J'+80H,'O'+80H,'H'+80H,'N'+80H,' '+80H
+; DB 'K','A'+80H,'T'+80H,'A'+80H,'U'+80H
+; DB 'S','K'+80H,'Y'+80H
+
+ ; END OF BAUD RATE MODIFICATIONS BY DANIEL WALLNER
+
+ DB ', I','N'+80H,'T'+80H,'E'+80H,'L'+80H
+ DB ' '+80H,'C'+80H,'O'+80H,'R'+80H,'P'+80H
+ DB '. 1','9'+80H,'85'
+H_RET: RET
+ ;
+$EJECT
+ ORG 1990H
+ ;
+OUTPUT:
+T_L: LJMP TEROT
+ ;
+ ORG 1F78H
+ ;
+CKS_I: JB CKS_B,CS_I
+ LJMP 401BH
+ ;
+CS_I: LJMP 2088H
+ ;
+E14X: DB 'NO DATA"'
+ ;
+E11X: DB 128+20
+ DB 'ARITH. OVERFLOW"'
+ ;
+E16X: DB 'PROGRAMMING"'
+ ;
+E15X: DB 'CAN'
+ DB 27H
+ DB 'T CONTINUE"'
+ ;
+E10X: DB 'INVALID LINE NUMBER"'
+ ;
+NOROM: DB 'PROM MODE"'
+ ;
+S_N: DB '*MCS-51(tm) BASIC V1.1*"'
+ ;
+ ORG 1FF8H
+ ;
+ERS: DB 'ERROR: "'
+ ;
+$EJECT
+
+
+;************************************************************
+;
+; This is a complete BCD floating point package for the 8051 micro-
+; controller. It provides 8 digits of accuracy with exponents that
+; range from +127 to -127. The mantissa is in packed BCD, while the
+; exponent is expressed in pseudo-twos complement. A ZERO exponent
+; is used to express the number ZERO. An exponent value of 80H or
+; greater than means the exponent is positive, i.e. 80H = E 0,
+; 81H = E+1, 82H = E+2 and so on. If the exponent is 7FH or less,
+; the exponent is negative, 7FH = E-1, 7EH = E-2, and so on.
+; ALL NUMBERS ARE ASSUMED TO BE NORMALIZED and all results are
+; normalized after calculation. A normalized mantissa is >=.10 and
+; <=.99999999.
+;
+; The numbers in memory assumed to be stored as follows:
+;
+; EXPONENT OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE
+; SIGN OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE-1
+; DIGIT 78 OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE-2
+; DIGIT 56 OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE-3
+; DIGIT 34 OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE-4
+; DIGIT 12 OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE-5
+;
+; EXPONENT OF ARGUMENT 1 = VALUE OF ARG_STACK
+; SIGN OF ARGUMENT 1 = VALUE OF ARG_STACK-1
+; DIGIT 78 OF ARGUMENT 1 = VALUE OF ARG_STACK-2
+; DIGIT 56 OF ARGUMENT 1 = VALUE OF ARG_STACK-3
+; DIGIT 34 OF ARGUMENT 1 = VALUE OF ARG_STACK-4
+; DIGIT 12 OF ARGUMENT 1 = VALUE OF ARG_STACK-5
+;
+; The operations are performed thusly:
+;
+; ARG_STACK+FP_NUMBER_SIZE = ARG_STACK+FP_NUMBER_SIZE # ARG_STACK
+;
+; Which is ARGUMENT 2 = ARGUMENT 2 # ARGUMENT 1
+;
+; Where # can be ADD, SUBTRACT, MULTIPLY OR DIVIDE.
+;
+; Note that the stack gets popped after an operation.
+;
+; The FP_COMP instruction POPS the ARG_STACK TWICE and returns status.
+;
+;**********************************************************************
+;
+$EJECT
+;**********************************************************************
+;
+; STATUS ON RETURN - After performing an operation (+, -, *, /)
+; the accumulator contains the following status
+;
+; ACCUMULATOR - BIT 0 - FLOATING POINT UNDERFLOW OCCURED
+;
+; - BIT 1 - FLOATING POINT OVERFLOW OCCURED
+;
+; - BIT 2 - RESULT WAS ZER0
+;
+; - BIT 3 - DIVIDE BY ZERO ATTEMPTED
+;
+; - BIT 4 - NOT USED, 0 RETURNED
+;
+; - BIT 5 - NOT USED, 0 RETURNED
+;
+; - BIT 6 - NOT USED, 0 RETURNED
+;
+; - BIT 7 - NOT USED, 0 RETURNED
+;
+; NOTE: When underflow occures, a ZERO result is returned.
+; When overflow or divide by zero occures, a result of
+; .99999999 E+127 is returned and it is up to the user
+; to handle these conditions as needed in the program.
+;
+; NOTE: The Compare instruction returns F0 = 0 if ARG 1 = ARG 2
+; and returns a CARRY FLAG = 1 if ARG 1 is > ARG 2
+;
+;***********************************************************************
+;
+$EJECT
+;***********************************************************************
+;
+; The following values MUST be provided by the user
+;
+;***********************************************************************
+;
+ARG_STACK EQU 9 ;ARGUMENT STACK POINTER
+ARG_STACK_PAGE EQU 1
+;OUTPUT EQU 1990H ;CALL LOCATION TO OUTPUT A CHARACTER
+CONVERT EQU 58H ;LOCATION TO CONVERT NUMBERS
+INTGRC BIT 25 ;BIT SET IF INTGER ERROR
+;
+;***********************************************************************
+;
+; The following equates are used internally
+;
+;***********************************************************************
+;
+FP_NUMBER_SIZE EQU 6
+UNDERFLOW EQU 0
+OVERFLOW EQU 1
+ZERO EQU 2
+ZERO_DIVIDE EQU 3
+;
+;***********************************************************************
+$EJECT
+ ;**************************************************************
+ ;
+ ; The following internal locations are used by the math pack
+ ; ordering is important and the FP_DIGITS must be bit
+ ; addressable
+ ;
+ ;***************************************************************
+ ;
+FP_STATUS EQU 28H ;NOT USED
+FP_TEMP EQU FP_STATUS+1 ;NOT USED
+FP_CARRY EQU FP_STATUS+2 ;USED FOR BITS
+ADD_IN BIT 35 ;DCMPXZ IN BASIC BACKAGE
+XSIGN BIT FP_CARRY.0
+FOUND_RADIX BIT FP_CARRY.1
+FIRST_RADIX BIT FP_CARRY.2
+DONE_LOAD BIT FP_CARRY.3
+FP_DIG12 EQU FP_CARRY+1
+FP_DIG34 EQU FP_CARRY+2
+FP_DIG56 EQU FP_CARRY+3
+FP_DIG78 EQU FP_CARRY+4
+FP_SIGN EQU FP_CARRY+5
+MSIGN BIT FP_SIGN.0
+FP_EXP EQU FP_CARRY+6
+FP_NIB1 EQU FP_DIG12
+FP_NIB2 EQU FP_NIB1+1
+FP_NIB3 EQU FP_NIB1+2
+FP_NIB4 EQU FP_NIB1+3
+FP_NIB5 EQU FP_NIB1+4
+FP_NIB6 EQU FP_NIB1+5
+FP_NIB7 EQU FP_NIB1+6
+FP_NIB8 EQU FP_NIB1+7
+FP_ACCX EQU FP_NIB1+8
+FP_ACCC EQU FP_NIB1+9
+FP_ACC1 EQU FP_NIB1+10
+FP_ACC2 EQU FP_NIB1+11
+FP_ACC3 EQU FP_NIB1+12
+FP_ACC4 EQU FP_NIB1+13
+FP_ACC5 EQU FP_NIB1+14
+FP_ACC6 EQU FP_NIB1+15
+FP_ACC7 EQU FP_NIB1+16
+FP_ACC8 EQU FP_NIB1+17
+FP_ACCS EQU FP_NIB1+18
+ ;
+$EJECT
+ ORG 1993H
+ ;
+ ;**************************************************************
+ ;
+ ; The floating point entry points and jump table
+ ;
+ ;**************************************************************
+ ;
+FP_BASE: AJMP FLOATING_ADD
+FP_BASE1: AJMP FLOATING_SUB
+FP_BASE2: AJMP FLOATING_COMP
+FP_BASE3: AJMP FLOATING_MUL
+FP_BASE4: AJMP FLOATING_DIV
+FP_BASE5: AJMP HEXSCAN
+FP_BASE6: AJMP FLOATING_POINT_INPUT
+FP_BASE7: AJMP FLOATING_POINT_OUTPUT
+FP_BASE8: AJMP CONVERT_BINARY_TO_ASCII_STRING
+FP_BASE9: AJMP CONVERT_ASCII_STRING_TO_BINARY
+FP_BASE10: AJMP MULNUM10
+FP_BASE11: AJMP HEXOUT
+FP_BASE12: AJMP PUSHR2R0
+ ;
+$EJECT
+ ;
+FLOATING_SUB:
+ ;
+ MOV P2,#ARG_STACK_PAGE
+ MOV R0,ARG_STACK
+ DEC R0 ;POINT TO SIGN
+ MOVX A,@R0 ;READ SIGN
+ CPL ACC.0
+ MOVX @R0,A
+ ;
+ ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ;
+FLOATING_ADD:
+ ;
+ ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ;
+ ;
+ ACALL MDES1 ;R7=TOS EXP, R6=TOS-1 EXP, R4=TOS SIGN
+ ;R3=TOS-1 SIGN, OPERATION IS R1 # R0
+ ;
+ MOV A,R7 ;GET TOS EXPONENT
+ JZ POP_AND_EXIT ;IF TOS=0 THEN POP AND EXIT
+ CJNE R6,#0,LOAD1 ;CLEAR CARRY EXIT IF ZERO
+ ;
+ ;**************************************************************
+ ;
+SWAP_AND_EXIT: ; Swap external args and return
+ ;
+ ;**************************************************************
+ ;
+ ACALL LOAD_POINTERS
+ MOV R7,#FP_NUMBER_SIZE
+ ;
+SE1: MOVX A,@R0 ;SWAP THE ARGUMENTS
+ MOVX @R1,A
+ DEC R0
+ DEC R1
+ DJNZ R7,SE1
+ ;
+POP_AND_EXIT:
+ ;
+ MOV A,ARG_STACK ;POP THE STACK
+ ADD A,#FP_NUMBER_SIZE
+ MOV ARG_STACK,A
+ CLR A
+ RET
+ ;
+ ;
+LOAD1: SUBB A,R6 ;A = ARG 1 EXP - ARG 2 EXP
+ MOV FP_EXP,R7 ;SAVE EXPONENT AND SIGN
+ MOV FP_SIGN,R4
+ JNC LOAD2 ;ARG1 EXPONENT IS LARGER OR SAME
+ MOV FP_EXP,R6
+ MOV FP_SIGN,R3
+ CPL A
+ INC A ;COMPENSATE FOR EXP DELTA
+ XCH A,R0 ;FORCE R0 TO POINT AT THE LARGEST
+ XCH A,R1 ;EXPONENT
+ XCH A,R0
+ ;
+LOAD2: MOV R7,A ;SAVE THE EXPONENT DELTA IN R7
+ CLR ADD_IN
+ CJNE R5,#0,LOAD21
+ SETB ADD_IN
+ ;
+$EJECT
+ ; Load the R1 mantissa
+ ;
+LOAD21: ACALL LOADR1_MANTISSA ;LOAD THE SMALLEST NUMBER
+ ;
+ ; Now align the number to the delta exponent
+ ; R4 points to the string of the last digits lost
+ ;
+ CJNE R7,#DIGIT+DIGIT+3,LOAD22
+LOAD22: JC LOAD23
+ MOV R7,#DIGIT+DIGIT+2
+ ;
+LOAD23: MOV FP_CARRY,#00 ;CLEAR THE CARRY
+ ACALL RIGHT ;SHIFT THE NUMBER
+ ;
+ ; Set up for addition and subtraction
+ ;
+ MOV R7,#DIGIT ;LOOP COUNT
+ MOV R1,#FP_DIG78
+ MOV A,#9EH
+ CLR C
+ SUBB A,R4
+ DA A
+ XCH A,R4
+ JNZ LOAD24
+ MOV R4,A
+LOAD24: CJNE A,#50H,LOAD25 ;TEST FOR SUBTRACTION
+LOAD25: JNB ADD_IN,SUBLP ;DO SUBTRACTION IF NO ADD_IN
+ CPL C ;FLIP CARRY FOR ADDITION
+ ACALL ADDLP ;DO ADDITION
+ ;
+ JNC ADD_R
+ INC FP_CARRY
+ MOV R7,#1
+ ACALL RIGHT
+ ACALL INC_FP_EXP ;SHIFT AND BUMP EXPONENT
+ ;
+ADD_R: AJMP STORE_ALIGN_TEST_AND_EXIT
+ ;
+ADDLP: MOVX A,@R0
+ ADDC A,@R1
+ DA A
+ MOV @R1,A
+ DEC R0
+ DEC R1
+ DJNZ R7,ADDLP ;LOOP UNTIL DONE
+ RET
+ ;
+$EJECT
+ ;
+SUBLP: MOVX A,@R0 ;NOW DO SUBTRACTION
+ MOV R6,A
+ CLR A
+ ADDC A,#99H
+ SUBB A,@R1
+ ADD A,R6
+ DA A
+ MOV @R1,A
+ DEC R0
+ DEC R1
+ DJNZ R7,SUBLP
+ JC FSUB6
+ ;
+$EJECT
+ ;
+ ; Need to complement the result and sign because the floating
+ ; point accumulator mantissa was larger than the external
+ ; memory and their signs were equal.
+ ;
+ CPL FP_SIGN.0
+ MOV R1,#FP_DIG78
+ MOV R7,#DIGIT ;LOOP COUNT
+ ;
+FSUB5: MOV A,#9AH
+ SUBB A,@R1
+ ADD A,#0
+ DA A
+ MOV @R1,A
+ DEC R1
+ CPL C
+ DJNZ R7,FSUB5 ;LOOP
+ ;
+ ; Now see how many zeros their are
+ ;
+FSUB6: MOV R0,#FP_DIG12
+ MOV R7,#0
+ ;
+FSUB7: MOV A,@R0
+ JNZ FSUB8
+ INC R7
+ INC R7
+ INC R0
+ CJNE R0,#FP_SIGN,FSUB7
+ AJMP ZERO_AND_EXIT
+ ;
+FSUB8: CJNE A,#10H,FSUB81
+FSUB81: JNC FSUB9
+ INC R7
+ ;
+ ; Now R7 has the number of leading zeros in the FP ACC
+ ;
+FSUB9: MOV A,FP_EXP ;GET THE OLD EXPONENT
+ CLR C
+ SUBB A,R7 ;SUBTRACT FROM THE NUMBER OF ZEROS
+ JZ FSUB10
+ JC FSUB10
+ ;
+ MOV FP_EXP,A ;SAVE THE NEW EXPONENT
+ ;
+ ACALL LEFT1 ;SHIFT THE FP ACC
+ MOV FP_CARRY,#0
+ AJMP STORE_ALIGN_TEST_AND_EXIT
+ ;
+FSUB10: AJMP UNDERFLOW_AND_EXIT
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+FLOATING_COMP: ; Compare two floating point numbers
+ ; used for relational operations and is faster
+ ; than subtraction. ON RETURN, The carry is set
+ ; if ARG1 is > ARG2, else carry is not set
+ ; if ARG1 = ARG2, F0 gets set
+ ;
+ ;***************************************************************
+ ;
+ ACALL MDES1 ;SET UP THE REGISTERS
+ MOV A,ARG_STACK
+ ADD A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
+ MOV ARG_STACK,A ;POP THE STACK TWICE, CLEAR THE CARRY
+ MOV A,R6 ;CHECK OUT EXPONENTS
+ CLR F0
+ SUBB A,R7
+ JZ EXPONENTS_EQUAL
+ JC ARG1_EXP_IS_LARGER
+ ;
+ ; Now the ARG2 EXPONENT is > ARG1 EXPONENT
+ ;
+SIGNS_DIFFERENT:
+ ;
+ MOV A,R3 ;SEE IF SIGN OF ARG2 IS POSITIVE
+ SJMP ARG1_EXP_IS_LARGER1
+ ;
+ARG1_EXP_IS_LARGER:
+ ;
+ MOV A,R4 ;GET THE SIGN OF ARG1 EXPONENT
+ARG1_EXP_IS_LARGER1:
+ JZ ARG1_EXP_IS_LARGER2
+ CPL C
+ARG1_EXP_IS_LARGER2:
+ RET
+ ;
+EXPONENTS_EQUAL:
+ ;
+ ; First, test the sign, then the mantissa
+ ;
+ CJNE R5,#0,SIGNS_DIFFERENT
+ ;
+BOTH_PLUS:
+ ;
+ MOV R7,#DIGIT ;POINT AT MS DIGIT
+ DEC R0
+ DEC R0
+ DEC R0
+ DEC R1
+ DEC R1
+ DEC R1
+ ;
+ ; Now do the compare
+ ;
+CLOOP: MOVX A,@R0
+ MOV R6,A
+ MOVX A,@R1
+ SUBB A,R6
+ JNZ ARG1_EXP_IS_LARGER
+ INC R0
+ INC R1
+ DJNZ R7,CLOOP
+ ;
+ ; If here, the numbers are the same, the carry is cleared
+ ;
+ SETB F0
+ RET ;EXIT WITH EQUAL
+ ;
+$EJECT
+;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
+;
+FLOATING_MUL: ; Floating point multiply
+;
+;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
+;
+ ACALL MUL_DIV_EXP_AND_SIGN
+ ;
+ ; check for zero exponents
+ ;
+ CJNE R6,#00,FMUL1 ;ARG 2 EXP ZERO?
+FMUL0: AJMP ZERO_AND_EXIT
+ ;
+ ; calculate the exponent
+ ;
+FMUL1: MOV FP_SIGN,R5 ;SAVE THE SIGN, IN CASE OF FAILURE
+ ;
+ MOV A,R7
+ JZ FMUL0
+ ADD A,R6 ;ADD THE EXPONENTS
+ JB ACC.7,FMUL_OVER
+ JBC CY,FMUL2 ;SEE IF CARRY IS SET
+ ;
+ AJMP UNDERFLOW_AND_EXIT
+ ;
+FMUL_OVER:
+ ;
+ JNC FMUL2 ;OK IF SET
+ ;
+FOV: AJMP OVERFLOW_AND_EXIT
+ ;
+FMUL2: SUBB A,#129 ;SUBTRACT THE EXPONENT BIAS
+ MOV R6,A ;SAVE IT FOR LATER
+ ;
+ ; Unpack and load R0
+ ;
+ ACALL UNPACK_R0
+ ;
+ ; Now set up for loop multiply
+ ;
+ MOV R3,#DIGIT
+ MOV R4,R1B0
+ ;
+$EJECT
+ ;
+ ; Now, do the multiply and accumulate the product
+ ;
+FMUL3: MOV R1B0,R4
+ MOVX A,@R1
+ MOV R2,A
+ ACALL MUL_NIBBLE
+ ;
+ MOV A,R2
+ SWAP A
+ ACALL MUL_NIBBLE
+ DEC R4
+ DJNZ R3,FMUL3
+ ;
+ ; Now, pack and restore the sign
+ ;
+ MOV FP_EXP,R6
+ MOV FP_SIGN,R5
+ AJMP PACK ;FINISH IT OFF
+ ;
+$EJECT
+ ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
+ ;
+FLOATING_DIV:
+ ;
+ ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
+ ;
+ ACALL MDES1
+ ;
+ ; Check the exponents
+ ;
+ MOV FP_SIGN,R5 ;SAVE THE SIGN
+ CJNE R7,#0,DIV0 ;CLEARS THE CARRY
+ ACALL OVERFLOW_AND_EXIT
+ CLR A
+ SETB ACC.ZERO_DIVIDE
+ RET
+ ;
+DIV0: MOV A,R6 ;GET EXPONENT
+ JZ FMUL0 ;EXIT IF ZERO
+ SUBB A,R7 ;DELTA EXPONENT
+ JB ACC.7,D_UNDER
+ JNC DIV3
+ AJMP UNDERFLOW_AND_EXIT
+ ;
+D_UNDER:JNC FOV
+ ;
+DIV3: ADD A,#129 ;CORRECTLY BIAS THE EXPONENT
+ MOV FP_EXP,A ;SAVE THE EXPONENT
+ ACALL LOADR1_MANTISSA ;LOAD THE DIVIDED
+ ;
+ MOV R2,#FP_ACCC ;SAVE LOCATION
+ MOV R3,R0B0 ;SAVE POINTER IN R3
+ MOV FP_CARRY,#0 ;ZERO CARRY BYTE
+ ;
+DIV4: MOV R5,#0FFH ;LOOP COUNT
+ SETB C
+ ;
+DIV5: MOV R0B0,R3 ;RESTORE THE EXTERNAL POINTER
+ MOV R1,#FP_DIG78 ;SET UP INTERNAL POINTER
+ MOV R7,#DIGIT ;LOOP COUNT
+ JNC DIV7 ;EXIT IF NO CARRY
+ ;
+DIV6: MOVX A,@R0 ;DO ACCUMLATION
+ MOV R6,A
+ CLR A
+ ADDC A,#99H
+ SUBB A,R6
+ ADD A,@R1
+ DA A
+ MOV @R1,A
+ DEC R0
+ DEC R1
+ DJNZ R7,DIV6 ;LOOP
+ ;
+ INC R5 ;SUBTRACT COUNTER
+ JC DIV5 ;KEEP LOOPING IF CARRY
+ MOV A,@R1 ;GET CARRY
+ SUBB A,#1 ;CARRY IS CLEARED
+ MOV @R1,A ;SAVE CARRY DIGIT
+ CPL C
+ SJMP DIV5 ;LOOP
+ ;
+ ; Restore the result if carry was found
+ ;
+DIV7: ACALL ADDLP ;ADD NUMBER BACK
+ MOV @R1,#0 ;CLEAR CARRY
+ MOV R0B0,R2 ;GET SAVE COUNTER
+ MOV @R0,5 ;SAVE COUNT BYTE
+ ;
+ INC R2 ;ADJUST SAVE COUNTER
+ MOV R7,#1 ;BUMP DIVIDEND
+ ACALL LEFT
+ CJNE R2,#FP_ACC8+2,DIV4
+ ;
+ DJNZ FP_EXP,DIV8
+ AJMP UNDERFLOW_AND_EXIT
+ ;
+DIV8: MOV FP_CARRY,#0
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+PACK: ; Pack the mantissa
+ ;
+ ;***************************************************************
+ ;
+ ; First, set up the pointers
+ ;
+ MOV R0,#FP_ACCC
+ MOV A,@R0 ;GET FP_ACCC
+ MOV R6,A ;SAVE FOR ZERO COUNT
+ JZ PACK0 ;JUMP OVER IF ZERO
+ ACALL INC_FP_EXP ;BUMP THE EXPONENT
+ DEC R0
+ ;
+PACK0: INC R0 ;POINT AT FP_ACC1
+ ;
+PACK1: MOV A,#8 ;ADJUST NIBBLE POINTER
+ MOV R1,A
+ ADD A,R0
+ MOV R0,A
+ CJNE @R0,#5,PACK11 ;SEE IF ADJUSTING NEEDED
+PACK11: JC PACK31
+ ;
+PACK2: SETB C
+ CLR A
+ DEC R0
+ ADDC A,@R0
+ DA A
+ XCHD A,@R0 ;SAVE THE VALUE
+ JNB ACC.4,PACK3
+ DJNZ R1,PACK2
+ ;
+ DEC R0
+ MOV @R0,#1
+ ACALL INC_FP_EXP
+ SJMP PACK4
+ ;
+PACK3: DEC R1
+PACK31: MOV A,R1
+ CLR C
+ XCH A,R0
+ SUBB A,R0
+ MOV R0,A
+ ;
+PACK4: MOV R1,#FP_DIG12
+ ;
+ ; Now, pack
+ ;
+PLOOP: MOV A,@R0
+ SWAP A ;FLIP THE DIGITS
+ INC R0
+ XCHD A,@R0
+ ORL 6,A ;ACCUMULATE THE OR'ED DIGITS
+ MOV @R1,A
+ INC R0
+ INC R1
+ CJNE R1,#FP_SIGN,PLOOP
+ MOV A,R6
+ JNZ STORE_ALIGN_TEST_AND_EXIT
+ MOV FP_EXP,#0 ;ZERO EXPONENT
+ ;
+ ;**************************************************************
+ ;
+STORE_ALIGN_TEST_AND_EXIT: ;Save the number align carry and exit
+ ;
+ ;**************************************************************
+ ;
+ ACALL LOAD_POINTERS
+ MOV ARG_STACK,R1 ;SET UP THE NEW STACK
+ MOV R0,#FP_EXP
+ ;
+ ; Now load the numbers
+ ;
+STORE2: MOV A,@R0
+ MOVX @R1,A ;SAVE THE NUMBER
+ DEC R0
+ DEC R1
+ CJNE R0,#FP_CARRY,STORE2
+ ;
+ CLR A ;NO ERRORS
+ ;
+PRET: RET ;EXIT
+ ;
+$EJECT
+INC_FP_EXP:
+ ;
+ INC FP_EXP
+ MOV A,FP_EXP
+ JNZ PRET ;EXIT IF NOT ZERO
+ POP ACC ;WASTE THE CALLING STACK
+ POP ACC
+ AJMP OVERFLOW_AND_EXIT
+ ;
+;***********************************************************************
+;
+UNPACK_R0: ; Unpack BCD digits and load into nibble locations
+;
+;***********************************************************************
+ ;
+ PUSH R1B0
+ MOV R1,#FP_NIB8
+ ;
+ULOOP: MOVX A,@R0
+ ANL A,#0FH
+ MOV @R1,A ;SAVE THE NIBBLE
+ MOVX A,@R0
+ SWAP A
+ ANL A,#0FH
+ DEC R1
+ MOV @R1,A ;SAVE THE NIBBLE AGAIN
+ DEC R0
+ DEC R1
+ CJNE R1,#FP_NIB1-1,ULOOP
+ ;
+ POP R1B0
+ ;
+LOAD7: RET
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+OVERFLOW_AND_EXIT: ;LOAD 99999999 E+127, SET OV BIT, AND EXIT
+ ;
+ ;**************************************************************
+ ;
+ MOV R0,#FP_DIG78
+ MOV A,#99H
+ ;
+OVE1: MOV @R0,A
+ DEC R0
+ CJNE R0,#FP_CARRY,OVE1
+ ;
+ MOV FP_EXP,#0FFH
+ ACALL STORE_ALIGN_TEST_AND_EXIT
+ ;
+ SETB ACC.OVERFLOW
+ RET
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+UNDERFLOW_AND_EXIT: ;LOAD 0, SET UF BIT, AND EXIT
+ ;
+ ;**************************************************************
+ ;
+ ACALL ZERO_AND_EXIT
+ CLR A
+ SETB ACC.UNDERFLOW
+ RET
+ ;
+ ;**************************************************************
+ ;
+ZERO_AND_EXIT: ;LOAD 0, SET ZERO BIT, AND EXIT
+ ;
+ ;**************************************************************
+ ;
+ ACALL FP_CLEAR
+ ACALL STORE_ALIGN_TEST_AND_EXIT
+ SETB ACC.ZERO
+ RET ;EXIT
+ ;
+ ;**************************************************************
+ ;
+FP_CLEAR:
+ ;
+ ; Clear internal storage
+ ;
+ ;**************************************************************
+ ;
+ CLR A
+ MOV R0,#FP_ACC8+1
+ ;
+FPC1: MOV @R0,A
+ DEC R0
+ CJNE R0,#FP_TEMP,FPC1
+ RET
+ ;
+$EJECT
+ ;**************************************************************
+ ;
+RIGHT: ; Shift ACCUMULATOR RIGHT the number of nibbles in R7
+ ; Save the shifted values in R4 if SAVE_ROUND is set
+ ;
+ ;**************************************************************
+ ;
+ MOV R4,#0 ;IN CASE OF NO SHIFT
+ ;
+RIGHT1: CLR C
+RIGHT2: MOV A,R7 ;GET THE DIGITS TO SHIFT
+ JZ RIGHTL1 ;EXIT IF ZERO
+ SUBB A,#2 ;TWO TO DO?
+ JNC RIGHT5 ;SHIFT TWO NIBBLES
+ ;
+ ; Swap one nibble then exit
+ ;
+RIGHT3: PUSH R0B0 ;SAVE POINTER REGISTER
+ PUSH R1B0
+ ;
+ MOV R1,#FP_DIG78 ;LOAD THE POINTERS
+ MOV R0,#FP_DIG56
+ MOV A,R4 ;GET THE OVERFLOW REGISTER
+ XCHD A,@R1 ;GET DIGIT 8
+ SWAP A ;FLIP FOR LOAD
+ MOV R4,A
+ ;
+RIGHTL: MOV A,@R1 ;GET THE LOW ORDER BYTE
+ XCHD A,@R0 ;SWAP NIBBLES
+ SWAP A ;FLIP FOR STORE
+ MOV @R1,A ;SAVE THE DIGITS
+ DEC R0 ;BUMP THE POINTERS
+ DEC R1
+ CJNE R1,#FP_DIG12-1,RIGHTL ;LOOP
+ ;
+ MOV A,@R1 ;ACC = CH8
+ SWAP A ;ACC = 8CH
+ ANL A,#0FH ;ACC = 0CH
+ MOV @R1,A ;CARRY DONE
+ POP R1B0 ;EXIT
+ POP R0B0 ;RESTORE REGISTER
+RIGHTL1:RET
+ ;
+RIGHT5: MOV R7,A ;SAVE THE NEW SHIFT NUMBER
+ CLR A
+ XCH A,FP_CARRY ;SWAP THE NIBBLES
+ XCH A,FP_DIG12
+ XCH A,FP_DIG34
+ XCH A,FP_DIG56
+ XCH A,FP_DIG78
+ MOV R4,A ;SAVE THE LAST DIGIT SHIFTED
+ SJMP RIGHT2
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+LEFT: ; Shift ACCUMULATOR LEFT the number of nibbles in R7
+ ;
+ ;***************************************************************
+ ;
+ MOV R4,#00H ;CLEAR FOR SOME ENTRYS
+ ;
+LEFT1: CLR C
+LEFT2: MOV A,R7 ;GET SHIFT VALUE
+ JZ LEFTL1 ;EXIT IF ZERO
+ SUBB A,#2 ;SEE HOW MANY BYTES TO SHIFT
+ JNC LEFT5
+ ;
+LEFT3: PUSH R0B0 ;SAVE POINTER
+ PUSH R1B0
+ MOV R0,#FP_CARRY
+ MOV R1,#FP_DIG12
+ ;
+ MOV A,@R0 ;ACC=CHCL
+ SWAP A ;ACC = CLCH
+ MOV @R0,A ;ACC = CLCH, @R0 = CLCH
+ ;
+LEFTL: MOV A,@R1 ;DIG 12
+ SWAP A ;DIG 21
+ XCHD A,@R0
+ MOV @R1,A ;SAVE IT
+ INC R0 ;BUMP POINTERS
+ INC R1
+ CJNE R0,#FP_DIG78,LEFTL
+ ;
+ MOV A,R4
+ SWAP A
+ XCHD A,@R0
+ ANL A,#0F0H
+ MOV R4,A
+ ;
+ POP R1B0
+ POP R0B0 ;RESTORE
+LEFTL1: RET ;DONE
+ ;
+LEFT5: MOV R7,A ;RESTORE COUNT
+ CLR A
+ XCH A,R4 ;GET THE RESTORATION BYTE
+ XCH A,FP_DIG78 ;DO THE SWAP
+ XCH A,FP_DIG56
+ XCH A,FP_DIG34
+ XCH A,FP_DIG12
+ XCH A,FP_CARRY
+ SJMP LEFT2
+ ;
+$EJECT
+MUL_NIBBLE:
+ ;
+ ; Multiply the nibble in R7 by the FP_NIB locations
+ ; accumulate the product in FP_ACC
+ ;
+ ; Set up the pointers for multiplication
+ ;
+ ANL A,#0FH ;STRIP OFF MS NIBBLE
+ MOV R7,A
+ MOV R0,#FP_ACC8
+ MOV R1,#FP_NIB8
+ CLR A
+ MOV FP_ACCX,A
+ ;
+MNLOOP: DEC R0 ;BUMP POINTER TO PROPAGATE CARRY
+ ADD A,@R0 ;ATTEMPT TO FORCE CARRY
+ DA A ;BCD ADJUST
+ JNB ACC.4,MNL0 ;DON'T ADJUST IF NO NEED
+ DEC R0 ;PROPAGATE CARRY TO THE NEXT DIGIT
+ INC @R0 ;DO THE ADJUSTING
+ INC R0 ;RESTORE R0
+ ;
+MNL0: XCHD A,@R0 ;RESTORE INITIAL NUMBER
+ MOV B,R7 ;GET THE NUBBLE TO MULTIPLY
+ MOV A,@R1 ;GET THE OTHER NIBBLE
+ MUL AB ;DO THE MULTIPLY
+ MOV B,#10 ;NOW BCD ADJUST
+ DIV AB
+ XCH A,B ;GET THE REMAINDER
+ ADD A,@R0 ;PROPAGATE THE PARTIAL PRODUCTS
+ DA A ;BCD ADJUST
+ JNB ACC.4,MNL1 ;PROPAGATE PARTIAL PRODUCT CARRY
+ INC B
+ ;
+MNL1: INC R0
+ XCHD A,@R0 ;SAVE THE NEW PRODUCT
+ DEC R0
+ MOV A,B ;GET BACK THE QUOTIENT
+ DEC R1
+ CJNE R1,#FP_NIB1-1,MNLOOP
+ ;
+ ADD A,FP_ACCX ;GET THE OVERFLOW
+ DA A ;ADJUST
+ MOV @R0,A ;SAVE IT
+ RET ;EXIT
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+LOAD_POINTERS: ; Load the ARG_STACK into R0 and bump R1
+ ;
+ ;***************************************************************
+ ;
+ MOV P2,#ARG_STACK_PAGE
+ MOV R0,ARG_STACK
+ MOV A,#FP_NUMBER_SIZE
+ ADD A,R0
+ MOV R1,A
+ RET
+ ;
+ ;***************************************************************
+ ;
+MUL_DIV_EXP_AND_SIGN:
+ ;
+ ; Load the sign into R7, R6. R5 gets the sign for
+ ; multiply and divide.
+ ;
+ ;***************************************************************
+ ;
+ ACALL FP_CLEAR ;CLEAR INTERNAL MEMORY
+ ;
+MDES1: ACALL LOAD_POINTERS ;LOAD REGISTERS
+ MOVX A,@R0 ;ARG 1 EXP
+ MOV R7,A ;SAVED IN R7
+ MOVX A,@R1 ;ARG 2 EXP
+ MOV R6,A ;SAVED IN R6
+ DEC R0 ;BUMP POINTERS TO SIGN
+ DEC R1
+ MOVX A,@R0 ;GET THE SIGN
+ MOV R4,A ;SIGN OF ARG1
+ MOVX A,@R1 ;GET SIGN OF NEXT ARG
+ MOV R3,A ;SIGN OF ARG2
+ XRL A,R4 ;ACC GETS THE NEW SIGN
+ MOV R5,A ;R5 GETS THE NEW SIGN
+ ;
+ ; Bump the pointers to point at the LS digit
+ ;
+ DEC R0
+ DEC R1
+ ;
+ RET
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+LOADR1_MANTISSA:
+ ;
+ ; Load the mantissa of R0 into FP_Digits
+ ;
+ ;***************************************************************
+ ;
+ PUSH R0B0 ;SAVE REGISTER 1
+ MOV R0,#FP_DIG78 ;SET UP THE POINTER
+ ;
+LOADR1: MOVX A,@R1
+ MOV @R0,A
+ DEC R1
+ DEC R0
+ CJNE R0,#FP_CARRY,LOADR1
+ ;
+ POP R0B0
+ RET
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+HEXSCAN: ; Scan a string to determine if it is a hex number
+ ; set carry if hex, else carry = 0
+ ;
+ ;***************************************************************
+ ;
+ ACALL GET_DPTR_CHARACTER
+ PUSH DPH
+ PUSH DPL ;SAVE THE POINTER
+ ;
+HEXSC1: MOVX A,@DPTR ;GET THE CHARACTER
+ ACALL DIGIT_CHECK ;SEE IF A DIGIT
+ JC HS1 ;CONTINUE IF A DIGIT
+ ACALL HEX_CHECK ;SEE IF HEX
+ JC HS1
+ ;
+ CLR ACC.5 ;NO LOWER CASE
+ CJNE A,#'H',HEXDON
+ SETB C
+ SJMP HEXDO1 ;NUMBER IS VALID HEX, MAYBE
+ ;
+HEXDON: CLR C
+ ;
+HEXDO1: POP DPL ;RESTORE POINTER
+ POP DPH
+ RET
+ ;
+HS1: INC DPTR ;BUMP TO NEXT CHARACTER
+ SJMP HEXSC1 ;LOOP
+ ;
+HEX_CHECK: ;CHECK FOR A VALID ASCII HEX, SET CARRY IF FOUND
+ ;
+ CLR ACC.5 ;WASTE LOWER CASE
+ CJNE A,#'F'+1,HEX_CHECK1 ;SEE IF F OR LESS
+HEX_CHECK1:
+ JC HC1
+ RET
+ ;
+HC1: CJNE A,#'A',HC11 ;SEE IF A OR GREATER
+HC11: CPL C
+ RET
+ ;
+$EJECT
+ ;
+PUSHR2R0:
+ ;
+ MOV R3,#HIGH CONVERT;CONVERSION LOCATION
+ MOV R1,#LOW CONVERT
+ ACALL CONVERT_BINARY_TO_ASCII_STRING
+ MOV A,#0DH ;A CR TO TERMINATE
+ MOVX @R1,A ;SAVE THE CR
+ MOV DPTR,#CONVERT
+ ;
+ ; Falls thru to FLOATING INPUT
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+FLOATING_POINT_INPUT: ; Input a floating point number pointed to by
+ ; the DPTR
+ ;
+ ;***************************************************************
+ ;
+ ACALL FP_CLEAR ;CLEAR EVERYTHING
+ ACALL GET_DPTR_CHARACTER
+ ACALL PLUS_MINUS_TEST
+ MOV MSIGN,C ;SAVE THE MANTISSA SIGN
+ ;
+ ; Now, set up for input loop
+ ;
+ MOV R0,#FP_ACCC
+ MOV R6,#7FH ;BASE EXPONENT
+ SETB F0 ;SET INITIAL FLAG
+ ;
+INLOOP: ACALL GET_DIGIT_CHECK
+ JNC GTEST ;IF NOT A CHARACTER, WHAT IS IT?
+ ANL A,#0FH ;STRIP ASCII
+ ACALL STDIG ;STORE THE DIGITS
+ ;
+INLPIK: INC DPTR ;BUMP POINTER FOR LOOP
+ SJMP INLOOP ;LOOP FOR INPUT
+ ;
+GTEST: CJNE A,#'.',GT1 ;SEE IF A RADIX
+ JB FOUND_RADIX,INERR
+ SETB FOUND_RADIX
+ CJNE R0,#FP_ACCC,INLPIK
+ SETB FIRST_RADIX ;SET IF FIRST RADIX
+ SJMP INLPIK ;GET ADDITIONAL DIGITS
+ ;
+GT1: JB F0,INERR ;ERROR IF NOT CLEARED
+ CJNE A,#'e',GT11 ;CHECK FOR LOWER CASE
+ SJMP GT12
+GT11: CJNE A,#'E',FINISH_UP
+GT12: ACALL INC_AND_GET_DPTR_CHARACTER
+ ACALL PLUS_MINUS_TEST
+ MOV XSIGN,C ;SAVE SIGN STATUS
+ ACALL GET_DIGIT_CHECK
+ JNC INERR
+ ;
+ ANL A,#0FH ;STRIP ASCII BIAS OFF THE CHARACTER
+ MOV R5,A ;SAVE THE CHARACTER IN R5
+ ;
+GT2: INC DPTR
+ ACALL GET_DIGIT_CHECK
+ JNC FINISH1
+ ANL A,#0FH ;STRIP OFF BIAS
+ XCH A,R5 ;GET THE LAST DIGIT
+ MOV B,#10 ;MULTIPLY BY TEN
+ MUL AB
+ ADD A,R5 ;ADD TO ORIGINAL VALUE
+ MOV R5,A ;SAVE IN R5
+ JNC GT2 ;LOOP IF NO CARRY
+ MOV R5,#0FFH ;FORCE AN ERROR
+ ;
+FINISH1:MOV A,R5 ;GET THE SIGN
+ JNB XSIGN,POSNUM ;SEE IF EXPONENT IS POS OR NEG
+ CLR C
+ SUBB A,R6
+ CPL A
+ INC A
+ JC FINISH2
+ MOV A,#01H
+ RET
+ ;
+POSNUM: ADD A,R6 ;ADD TO EXPONENT
+ JNC FINISH2
+ ;
+POSNM1: MOV A,#02H
+ RET
+ ;
+FINISH2:XCH A,R6 ;SAVE THE EXPONENT
+ ;
+FINISH_UP:
+ ;
+ MOV FP_EXP,R6 ;SAVE EXPONENT
+ CJNE R0,#FP_ACCC,FINISH_UP1
+ ACALL FP_CLEAR ;CLEAR THE MEMORY IF 0
+FINISH_UP1:
+ MOV A,ARG_STACK ;GET THE ARG STACK
+ CLR C
+ SUBB A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
+ MOV ARG_STACK,A ;ADJUST FOR STORE
+ AJMP PACK
+ ;
+STDIG: CLR F0 ;CLEAR INITIAL DESIGNATOR
+ JNZ STDIG1 ;CONTINUE IF NOT ZERO
+ CJNE R0,#FP_ACCC,STDIG1
+ JNB FIRST_RADIX,RET_X
+ ;
+DECX: DJNZ R6,RET_X
+ ;
+INERR: MOV A,#0FFH
+ ;
+RET_X: RET
+ ;
+STDIG1: JB DONE_LOAD,FRTEST
+ CLR FIRST_RADIX
+ ;
+FRTEST: JB FIRST_RADIX,DECX
+ ;
+FDTEST: JB FOUND_RADIX,FDT1
+ INC R6
+ ;
+FDT1: JB DONE_LOAD,RET_X
+ CJNE R0,#FP_ACC8+1,FDT2
+ SETB DONE_LOAD
+ ;
+FDT2: MOV @R0,A ;SAVE THE STRIPPED ACCUMULATOR
+ INC R0 ;BUMP THE POINTER
+ RET ;EXIT
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+ ; I/O utilities
+ ;
+ ;***************************************************************
+ ;
+INC_AND_GET_DPTR_CHARACTER:
+ ;
+ INC DPTR
+ ;
+GET_DPTR_CHARACTER:
+ ;
+ MOVX A,@DPTR ;GET THE CHARACTER
+ CJNE A,#' ',PMT1 ;SEE IF A SPACE
+ ;
+ ; Kill spaces
+ ;
+ SJMP INC_AND_GET_DPTR_CHARACTER
+ ;
+PLUS_MINUS_TEST:
+ ;
+ CJNE A,#0E3H,PMT11 ;SEE IF A PLUS, PLUS TOKEN FROM BASIC
+ SJMP PMT3
+PMT11: CJNE A,#'+',PMT12
+ SJMP PMT3
+PMT12: CJNE A,#0E5H,PMT13 ;SEE IF MINUS, MINUS TOKEN FROM BASIC
+ SJMP PMT2
+PMT13: CJNE A,#'-',PMT1
+ ;
+PMT2: SETB C
+ ;
+PMT3: INC DPTR
+ ;
+PMT1: RET
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+FLOATING_POINT_OUTPUT: ; Output the number, format is in location 23
+ ;
+ ; IF FORMAT = 00 - FREE FLOATING
+ ; = FX - EXPONENTIAL (X IS THE NUMBER OF SIG DIGITS)
+ ; = NX - N = NUM BEFORE RADIX, X = NUM AFTER RADIX
+ ; N + X = 8 MAX
+ ;
+ ;***************************************************************
+ ;
+ ACALL MDES1 ;GET THE NUMBER TO OUTPUT, R0 IS POINTER
+ ACALL POP_AND_EXIT ;OUTPUT POPS THE STACK
+ MOV A,R7
+ MOV R6,A ;PUT THE EXPONENT IN R6
+ ACALL UNPACK_R0 ;UNPACK THE NUMBER
+ MOV R0,#FP_NIB1 ;POINT AT THE NUMBER
+ MOV A,FORMAT ;GET THE FORMAT
+ MOV R3,A ;SAVE IN CASE OF EXP FORMAT
+ JZ FREE ;FREE FLOATING?
+ CJNE A,#0F0H,FPO1 ;SEE IF EXPONENTIAL
+FPO1: JNC EXPOUT
+ ;
+ ; If here, must be integer USING format
+ ;
+ MOV A,R6 ;GET THE EXPONENT
+ JNZ FPO2
+ MOV R6,#80H
+FPO2: MOV A,R3 ;GET THE FORMAT
+ SWAP A ;SPLIT INTEGER AND FRACTION
+ ANL A,#0FH
+ MOV R2,A ;SAVE INTEGER
+ ACALL NUM_LT ;GET THE NUMBER OF INTEGERS
+ XCH A,R2 ;FLIP FOR SUBB
+ CLR C
+ SUBB A,R2
+ MOV R7,A
+ JNC FPO3
+ MOV R5,#'?' ;OUTPUT A QUESTION MARK
+ ACALL SOUT1 ;NUMBER IS TOO LARGE FOR FORMAT
+ AJMP FREE
+FPO3: CJNE R2,#00,USING0 ;SEE IF ZERO
+ DEC R7
+ ACALL SS7
+ ACALL ZOUT ;OUTPUT A ZERO
+ SJMP USING1
+ ;
+USING0: ACALL SS7 ;OUTPUT SPACES, IF NEED TO
+ MOV A,R2 ;OUTPUT DIGITS
+ MOV R7,A
+ ACALL OUTR0
+ ;
+USING1: MOV A,R3
+ ANL A,#0FH ;GET THE NUMBER RIGHT OF DP
+ MOV R2,A ;SAVE IT
+ JZ PMT1 ;EXIT IF ZERO
+ ACALL ROUT ;OUTPUT DP
+ ACALL NUM_RT
+ CJNE A,2,USINGX ;COMPARE A TO R2
+ ;
+USINGY: MOV A,R2
+ AJMP Z7R7
+ ;
+USINGX: JNC USINGY
+ ;
+USING2: XCH A,R2
+ CLR C
+ SUBB A,R2
+ XCH A,R2
+ ACALL Z7R7 ;OUTPUT ZEROS IF NEED TO
+ MOV A,R2
+ MOV R7,A
+ AJMP OUTR0
+ ;
+ ; First, force exponential output, if need to
+ ;
+FREE: MOV A,R6 ;GET THE EXPONENT
+ JNZ FREE1 ;IF ZERO, PRINT IT
+ ACALL SOUT
+ AJMP ZOUT
+ ;
+FREE1: MOV R3,#0F0H ;IN CASE EXP NEEDED
+ MOV A,#80H-DIGIT-DIGIT-1
+ ADD A,R6
+ JC EXPOUT
+ SUBB A,#0F7H
+ JC EXPOUT
+ ;
+ ; Now, just print the number
+ ;
+ ACALL SINOUT ;PRINT THE SIGN OF THE NUMBER
+ ACALL NUM_LT ;GET THE NUMBER LEFT OF DP
+ CJNE A,#8,FREE4
+ AJMP OUTR0
+ ;
+FREE4: ACALL OUTR0
+ ACALL ZTEST ;TEST FOR TRAILING ZEROS
+ JZ U_RET ;DONE IF ALL TRAILING ZEROS
+ ACALL ROUT ;OUTPUT RADIX
+ ;
+FREE2: MOV R7,#1 ;OUTPUT ONE DIGIT
+ ACALL OUTR0
+ JNZ U_RET
+ ACALL ZTEST
+ JZ U_RET
+ SJMP FREE2 ;LOOP
+ ;
+EXPOUT: ACALL SINOUT ;PRINT THE SIGN
+ MOV R7,#1 ;OUTPUT ONE CHARACTER
+ ACALL OUTR0
+ ACALL ROUT ;OUTPUT RADIX
+ MOV A,R3 ;GET FORMAT
+ ANL A,#0FH ;STRIP INDICATOR
+ JZ EXPOTX
+ ;
+ MOV R7,A ;OUTPUT THE NUMBER OF DIGITS
+ DEC R7 ;ADJUST BECAUSE ONE CHAR ALREADY OUT
+ ACALL OUTR0
+ SJMP EXPOT4
+ ;
+EXPOTX: ACALL FREE2 ;OUTPUT UNTIL TRAILING ZEROS
+ ;
+EXPOT4: ACALL SOUT ;OUTPUT A SPACE
+ MOV R5,#'E'
+ ACALL SOUT1 ;OUTPUT AN E
+ MOV A,R6 ;GET THE EXPONENT
+ JZ XOUT0 ;EXIT IF ZERO
+ DEC A ;ADJUST FOR THE DIGIT ALREADY OUTPUT
+ CJNE A,#80H,XOUT2 ;SEE WHAT IT IS
+ ;
+XOUT0: ACALL SOUT
+ CLR A
+ SJMP XOUT4
+ ;
+XOUT2: JC XOUT3 ;NEGATIVE EXPONENT
+ MOV R5,#'+' ;OUTPUT A PLUS SIGN
+ ACALL SOUT1
+ SJMP XOUT4
+ ;
+XOUT3: ACALL MOUT
+ CPL A ;FLIP BITS
+ INC A ;BUMP
+ ;
+XOUT4: CLR ACC.7
+ MOV R0,A
+ MOV R2,#0
+ MOV R1,#LOW CONVERT ;CONVERSION LOCATION
+ MOV R3,#HIGH CONVERT
+ ACALL CONVERT_BINARY_TO_ASCII_STRING
+ MOV R0,#LOW CONVERT ;NOW, OUTPUT EXPONENT
+ ;
+EXPOT5: MOVX A,@R0 ;GET THE CHARACTER
+ MOV R5,A ;OUTPUT IT
+ ACALL SOUT1
+ INC R0 ;BUMP THE POINTER
+ MOV A,R0 ;GET THE POINTER
+ CJNE A,R1B0,EXPOT5 ;LOOP
+ ;
+U_RET: RET ;EXIT
+ ;
+OUTR0: ; Output the characters pointed to by R0, also bias ascii
+ ;
+ MOV A,R7 ;GET THE COUNTER
+ JZ OUTR ;EXIT IF DONE
+ MOV A,@R0 ;GET THE NUMBER
+ ORL A,#30H ;ASCII BIAS
+ INC R0 ;BUMP POINTER AND COUNTER
+ DEC R7
+ MOV R5,A ;PUT CHARACTER IN OUTPUT REGISTER
+ ACALL SOUT1 ;OUTPUT THE CHARACTER
+ CLR A ;JUST FOR TEST
+ CJNE R0,#FP_NIB8+1,OUTR0
+ MOV A,#55H ;KNOW WHERE EXIT OCCURED
+ ;
+OUTR: RET
+ ;
+ZTEST: MOV R1,R0B0 ;GET POINTER REGISTER
+ ;
+ZT0: MOV A,@R1 ;GET THE VALUE
+ JNZ ZT1
+ INC R1 ;BUMP POINTER
+ CJNE R1,#FP_NIB8+1,ZT0
+ ;
+ZT1: RET
+ ;
+NUM_LT: MOV A,R6 ;GET EXPONENT
+ CLR C ;GET READY FOR SUBB
+ SUBB A,#80H ;SUB EXPONENT BIAS
+ JNC NL1 ;OK IF NO CARRY
+ CLR A ;NO DIGITS LEFT
+ ;
+NL1: MOV R7,A ;SAVE THE COUNT
+ RET
+ ;
+NUM_RT: CLR C ;SUBB AGAIN
+ MOV A,#80H ;EXPONENT BIAS
+ SUBB A,R6 ;GET THE BIASED EXPONENT
+ JNC NR1
+ CLR A
+ ;
+NR1: RET ;EXIT
+ ;
+SPACE7: MOV A,R7 ;GET THE NUMBER OF SPACES
+ JZ NR1 ;EXIT IF ZERO
+ ACALL SOUT ;OUTPUT A SPACE
+ DEC R7 ;BUMP COUNTER
+ SJMP SPACE7 ;LOOP
+ ;
+Z7R7: MOV R7,A
+ ;
+ZERO7: MOV A,R7 ;GET COUNTER
+ JZ NR1 ;EXIT IF ZERO
+ ACALL ZOUT ;OUTPUT A ZERO
+ DEC R7 ;BUMP COUNTER
+ SJMP ZERO7 ;LOOP
+ ;
+SS7: ACALL SPACE7
+ ;
+SINOUT: MOV A,R4 ;GET THE SIGN
+ JZ SOUT ;OUTPUT A SPACE IF ZERO
+ ;
+MOUT: MOV R5,#'-'
+ SJMP SOUT1 ;OUTPUT A MINUS IF NOT
+ ;
+ROUT: MOV R5,#'.' ;OUTPUT A RADIX
+ SJMP SOUT1
+ ;
+ZOUT: MOV R5,#'0' ;OUTPUT A ZERO
+ SJMP SOUT1
+ ;
+SOUT: MOV R5,#' ' ;OUTPUT A SPACE
+ ;
+SOUT1: AJMP OUTPUT
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+CONVERT_ASCII_STRING_TO_BINARY:
+ ;
+ ;DPTR POINTS TO ASCII STRING
+ ;PUT THE BINARY NUMBER IN R2:R0, ERROR IF >64K
+ ;
+ ;***************************************************************
+ ;
+CASB: ACALL HEXSCAN ;SEE IF HEX NUMBER
+ MOV ADD_IN,C ;IF ADD_IN IS SET, THE NUMBER IS HEX
+ ACALL GET_DIGIT_CHECK
+ CPL C ;FLIP FOR EXIT
+ JC RCASB
+ MOV R3,#00H ;ZERO R3:R1 FOR LOOP
+ MOV R1,#00H
+ SJMP CASB5
+ ;
+CASB2: INC DPTR
+ MOV R0B0,R1 ;SAVE THE PRESENT CONVERTED VALUE
+ MOV R2B0,R3 ;IN R2:R0
+ ACALL GET_DIGIT_CHECK
+ JC CASB5
+ JNB ADD_IN,RCASB ;CONVERSION COMPLETE
+ ACALL HEX_CHECK ;SEE IF HEX NUMBER
+ JC CASB4 ;PROCEED IF GOOD
+ INC DPTR ;BUMP PAST H
+ SJMP RCASB
+ ;
+CASB4: ADD A,#9 ;ADJUST HEX ASCII BIAS
+ ;
+CASB5: MOV B,#10
+ JNB ADD_IN,CASB6
+ MOV B,#16 ;HEX MODE
+ ;
+CASB6: ACALL MULNUM ;ACCUMULATE THE DIGITS
+ JNC CASB2 ;LOOP IF NO CARRY
+ ;
+RCASB: CLR A ;RESET ACC
+ MOV ACC.OVERFLOW,C ;IF OVERFLOW, SAY SO
+ RET ;EXIT
+ ;
+$EJECT
+ ;
+MULNUM10:MOV B,#10
+ ;
+ ;***************************************************************
+ ;
+MULNUM: ; Take the next digit in the acc (masked to 0FH)
+ ; accumulate in R3:R1
+ ;
+ ;***************************************************************
+ ;
+ PUSH ACC ;SAVE ACC
+ PUSH B ;SAVE MULTIPLIER
+ MOV A,R1 ;PUT LOW ORDER BITS IN ACC
+ MUL AB ;DO THE MULTIPLY
+ MOV R1,A ;PUT THE RESULT BACK
+ MOV A,R3 ;GET THE HIGH ORDER BYTE
+ MOV R3,B ;SAVE THE OVERFLOW
+ POP B ;GET THE MULTIPLIER
+ MUL AB ;DO IT
+ MOV C,OV ;SAVE OVERFLOW IN F0
+ MOV F0,C
+ ADD A,R3 ;ADD OVERFLOW TO HIGH RESULT
+ MOV R3,A ;PUT IT BACK
+ POP ACC ;GET THE ORIGINAL ACC BACK
+ ORL C,F0 ;OR CARRY AND OVERFLOW
+ JC MULX ;NO GOOD IF THE CARRY IS SET
+ ;
+MUL11: ANL A,#0FH ;MASK OFF HIGH ORDER BITS
+ ADD A,R1 ;NOW ADD THE ACC
+ MOV R1,A ;PUT IT BACK
+ CLR A ;PROPAGATE THE CARRY
+ ADDC A,R3
+ MOV R3,A ;PUT IT BACK
+ ;
+MULX: RET ;EXIT WITH OR WITHOUT CARRY
+ ;
+ ;***************************************************************
+ ;
+CONVERT_BINARY_TO_ASCII_STRING:
+ ;
+ ;R3:R1 contains the address of the string
+ ;R2:R0 contains the value to convert
+ ;DPTR, R7, R6, and ACC gets clobbered
+ ;
+ ;***************************************************************
+ ;
+ CLR A ;NO LEADING ZEROS
+ MOV DPTR,#10000 ;SUBTRACT 10000
+ ACALL RSUB ;DO THE SUBTRACTION
+ MOV DPTR,#1000 ;NOW 1000
+ ACALL RSUB
+ MOV DPTR,#100 ;NOW 100
+ ACALL RSUB
+ MOV DPTR,#10 ;NOW 10
+ ACALL RSUB
+ MOV DPTR,#1 ;NOW 1
+ ACALL RSUB
+ JZ RSUB2 ;JUMP OVER RET
+ ;
+RSUB_R: RET
+ ;
+RSUB: MOV R6,#-1 ;SET UP THE COUNTER
+ ;
+RSUB1: INC R6 ;BUMP THE COUNTER
+ XCH A,R2 ;DO A FAST COMPARE
+ CJNE A,DPH,RSUB11
+RSUB11: XCH A,R2
+ JC FAST_DONE
+ XCH A,R0 ;GET LOW BYTE
+ SUBB A,DPL ;SUBTRACT, CARRY IS CLEARED
+ XCH A,R0 ;PUT IT BACK
+ XCH A,R2 ;GET THE HIGH BYTE
+ SUBB A,DPH ;ADD THE HIGH BYTE
+ XCH A,R2 ;PUT IT BACK
+ JNC RSUB1 ;LOOP UNTIL CARRY
+ ;
+ XCH A,R0
+ ADD A,DPL ;RESTORE R2:R0
+ XCH A,R0
+ XCH A,R2
+ ADDC A,DPH
+ XCH A,R2
+ ;
+FAST_DONE:
+ ;
+ ORL A,R6 ;OR THE COUNT VALUE
+ JZ RSUB_R ;RETURN IF ZERO
+ ;
+RSUB2: MOV A,#'0' ;GET THE ASCII BIAS
+ ADD A,R6 ;ADD THE COUNT
+ ;
+RSUB4: MOV P2,R3 ;SET UP P2
+ MOVX @R1,A ;PLACE THE VALUE IN MEMORY
+ INC R1
+ CJNE R1,#00H,RSUB3 ;SEE IF RAPPED AROUND
+ INC R3 ;BUMP HIGH BYTE
+ ;
+RSUB3: RET ;EXIT
+ ;
+$EJECT
+ ;***************************************************************
+ ;
+HEXOUT: ; Output the hex number in R3:R1, supress leading zeros, if set
+ ;
+ ;***************************************************************
+ ;
+ ACALL SOUT ;OUTPUT A SPACE
+ MOV C,ZSURP ;GET ZERO SUPPRESSION BIT
+ MOV ADD_IN,C
+ MOV A,R3 ;GET HIGH NIBBLE AND PRINT IT
+ ACALL HOUTHI
+ MOV A,R3
+ ACALL HOUTLO
+ ;
+HEX2X: CLR ADD_IN ;DON'T SUPPRESS ZEROS
+ MOV A,R1 ;GET LOW NIBBLE AND PRINT IT
+ ACALL HOUTHI
+ MOV A,R1
+ ACALL HOUTLO
+ MOV R5,#'H' ;OUTPUT H TO INDICATE HEX MODE
+ ;
+SOUT_1: AJMP SOUT1
+ ;
+HOUT1: CLR ADD_IN ;PRINTED SOMETHING, SO CLEAR ADD_IN
+ ADD A,#90H ;CONVERT TO ASCII
+ DA A
+ ADDC A,#40H
+ DA A ;GOT IT HERE
+ MOV R5,A ;OUTPUT THE BYTE
+ SJMP SOUT_1
+ ;
+HOUTHI: SWAP A ;SWAP TO OUTPUT HIGH NIBBLE
+ ;
+HOUTLO: ANL A,#0FH ;STRIP
+ JNZ HOUT1 ;PRINT IF NOT ZERO
+ JNB ADD_IN,HOUT1 ;OUTPUT A ZERO IF NOT SUPRESSED
+ RET
+ ;
+$EJECT
+ ORG 1FEBH ;FOR LINK COMPATABILITY
+ ;
+ ;
+GET_DIGIT_CHECK: ; Get a character, then check for digit
+ ;
+ ACALL GET_DPTR_CHARACTER
+ ;
+DIGIT_CHECK: ;CHECK FOR A VALID ASCII DIGIT, SET CARRY IF FOUND
+ ;
+ CJNE A,#'9'+1,DC10 ;SEE IF ASCII 9 OR LESS
+DC10: JC DC1
+ RET
+ ;
+DC1: CJNE A,#'0',DC11 ;SEE IF ASCII 0 OR GREATER
+DC11: CPL C
+ RET
+ ;
+ ;***************************************************************
+ ;
+ XSEG ;External Ram
+ ;
+ ;***************************************************************
+ ;
+ DS 4
+IBCNT: DS 1 ;LENGTH OF A LINE
+IBLN: DS 2 ;THE LINE NUMBER
+IBUF: DS LINLEN ;THE INPUT BUFFER
+CONVT: DS 15 ;CONVERSION LOCATION FOR FPIN
+ ;
+ ORG 100H
+ ;
+GTB: DS 1 ;GET LOCATION
+ERRLOC: DS 1 ;ERROR TYPE
+ERRNUM: DS 2 ;WHERE TO GO ON AN ERROR
+VARTOP: DS 2 ;TOP OF VARIABLE STORAGE
+ST_ALL: DS 2 ;STORAGE ALLOCATION
+MT_ALL: DS 2 ;MATRIX ALLOCATION
+MEMTOP: DS 2 ;TOP OF MEMORY
+RCELL: DS 2 ;RANDOM NUMBER CELL
+ DS FPSIZ-1
+CXTAL: DS 1 ;CRYSTAL
+ DS FPSIZ-1
+FPT1: DS 1 ;FLOATINP POINT TEMP 1
+ DS FPSIZ-1
+FPT2: DS 1 ;FLOATING POINT TEMP 2
+INTLOC: DS 2 ;LOCATION TO GO TO ON INTERRUPT
+STR_AL: DS 2 ;STRING ALLOCATION
+SPV: DS 2 ;SERIAL PORT BAUD RATE
+TIV: DS 2 ;TIMER INTERRUPT NUM AND LOC
+PROGS: DS 2 ;PROGRAM A PROM TIME OUT
+IPROGS: DS 2 ;INTELLIGENT PROM PROGRAMMER TIMEOUT
+TM_TOP: DS 1
+
+ END
+
+
diff --git a/sw/hex2rom.cpp b/sw/hex2rom.cpp
new file mode 100644
index 0000000..20e5c5d
--- /dev/null
+++ b/sw/hex2rom.cpp
@@ -0,0 +1,962 @@
+//
+// Binary and intel/motorola hex to VHDL ROM converter
+//
+// Version : 0244
+//
+// Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
+//
+// All rights reserved
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+//
+// Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+//
+// Neither the name of the author nor the names of other contributors may
+// be used to endorse or promote products derived from this software without
+// specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+// Please report bugs to the author, but before you do so, please
+// make sure that this is not a derivative work and that
+// you have the latest version of this file.
+//
+// The latest version of this file can be found at:
+// http://www.opencores.org/cvsweb.shtml/t51/
+//
+// Limitations :
+// No support for wrapped intel segments
+// Requires stl to compile
+//
+// File history :
+//
+// 0146 : Initial release
+//
+// 0150 : Added binary read
+//
+// 0208 : Changed some errors to warnings
+//
+// 0215 : Added support for synchronous ROM
+//
+// 0220 : Changed array ROM format, added support for Xilinx .UCF generation
+//
+// 0221 : Fixed small .UCF generation for small ROMs
+//
+// 0244 : Added Leonardo .UCF option
+//
+
+#include <stdio.h>
+#include <string>
+#include <vector>
+#include <iostream>
+
+using namespace std;
+
+#if !(defined(max)) && _MSC_VER
+ // VC fix
+ #define max __max
+#endif
+
+class MemBlock
+{
+public:
+ unsigned long m_startAddress;
+ vector<unsigned char> m_bytes;
+};
+
+class File
+{
+public:
+ explicit File(const char *fileName, const char *mode)
+ {
+ m_file = fopen(fileName, mode);
+ if (m_file != NULL)
+ {
+ return;
+ }
+ string errorStr = "Error opening ";
+ errorStr += fileName;
+ errorStr += "\n";
+ throw errorStr;
+ }
+
+ ~File()
+ {
+ fclose(m_file);
+ }
+
+ // Read binary file
+ void ReadBin(unsigned long limit)
+ {
+ m_top = 0;
+
+ m_chunks.push_back(MemBlock());
+ m_chunks.back().m_startAddress = 0;
+
+ cerr << "Reading binary file\n";
+
+ int tmp = fgetc(m_file);
+
+ while (!feof(m_file))
+ {
+ m_chunks.back().m_bytes.push_back(tmp);
+
+ if (m_chunks.back().m_bytes.size() > limit + 1)
+ {
+ m_chunks.back().m_bytes.pop_back();
+ m_top = m_chunks.back().m_bytes.size() - 1;
+ cerr << "Ignoring data above address space!\n";
+ cerr << " Limit: " << limit << "\n";
+ return;
+ }
+
+ tmp = fgetc(m_file);
+ }
+
+ m_top = m_chunks.back().m_bytes.size() - 1;
+
+ if (!m_chunks.back().m_bytes.size())
+ {
+ cerr << "No data!\n";
+
+ m_chunks.pop_back();
+ }
+ }
+
+ // Read hex file
+ void ReadHex(unsigned long limit)
+ {
+ char szLine[1024];
+ bool formatDetected = false;
+ bool intel;
+ bool endSeen = false;
+ bool linear = true; // Only used for intel hex
+ unsigned long addressBase = 0; // Only used for intel hex
+ unsigned long dataRecords = 0; // Only used for s-record
+ while (!feof(m_file))
+ {
+ if (fgets(szLine, 1024, m_file) == 0)
+ {
+ if (ferror(m_file))
+ {
+ throw "Error reading input!\n";
+ }
+ continue;
+ }
+
+ if (szLine[strlen(szLine) - 1] == 0xA || szLine[strlen(szLine) - 1] == 0xD)
+ {
+ szLine[strlen(szLine) - 1] = 0;
+ }
+
+ if (szLine[strlen(szLine) - 1] == 0xA || szLine[strlen(szLine) - 1] == 0xD)
+ {
+ szLine[strlen(szLine) - 1] = 0;
+ }
+
+ if (strlen(szLine) == 1023)
+ {
+ throw "Hex file lines to long!\n";
+ }
+ // Ignore blank lines
+ if (szLine[0] == '\n')
+ {
+ continue;
+ }
+ // Detect format and warn if garbage lines are found
+ if (!formatDetected)
+ {
+ if (szLine[0] != ':' && szLine[0] != 'S')
+ {
+ cerr << "Ignoring garbage line!\n";
+ continue;
+ }
+ if (szLine[0] == 'S')
+ {
+ intel = false;
+ cerr << "Detected S-Record\n";
+ }
+ else
+ {
+ intel = true;
+ cerr << "Detected intel hex file\n";
+ }
+ formatDetected = true;
+ }
+ else if ((intel && szLine[0] != ':') ||
+ (!intel && szLine[0] != 'S'))
+ {
+ cerr << "Ignoring garbage line!\n";
+ continue;
+ }
+
+ if (endSeen)
+ {
+ throw "Hex line after end of file record!\n";
+ }
+
+ if (intel)
+ {
+ unsigned long dataBytes;
+ unsigned long startAddress;
+ unsigned long type;
+ if (sscanf(&szLine[1], "%2lx%4lx%2lx", &dataBytes, &startAddress, &type) != 3)
+ {
+ throw "Hex line beginning corrupt!\n";
+ }
+ // Check line length
+ if (szLine[11 + dataBytes * 2] != '\n' && szLine[11 + dataBytes * 2] != 0)
+ {
+ throw "Hex line length incorrect!\n";
+ }
+ // Check line checksum
+ unsigned char checkSum = 0;
+ unsigned long tmp;
+ for (unsigned int i = 0; i <= dataBytes + 4; ++i)
+ {
+ if (sscanf(&szLine[1 + i * 2], "%2lx", &tmp) != 1)
+ {
+ throw "Hex line data corrupt!\n";
+ }
+ checkSum += tmp;
+ }
+ if (checkSum != 0)
+ {
+ throw "Hex line checksum error!\n";
+ }
+
+ switch (type)
+ {
+ case 0:
+ // Data record
+ if (!linear)
+ {
+ // Segmented
+ unsigned long test = startAddress;
+ test += dataBytes;
+ if (test > 0xffff)
+ {
+ throw "Can't handle wrapped segments!\n";
+ }
+ }
+ if (!m_chunks.size() ||
+ m_chunks.back().m_startAddress + m_chunks.back().m_bytes.size() !=
+ addressBase + startAddress)
+ {
+ m_chunks.push_back(MemBlock());
+ m_chunks.back().m_startAddress = addressBase + startAddress;
+ }
+ {
+ unsigned char i = 0;
+ for (i = 0; i < dataBytes; ++i)
+ {
+ sscanf(&szLine[9 + i * 2], "%2lx", &tmp);
+ if (addressBase + startAddress + i > limit)
+ {
+ cerr << "Ignoring data above address space!\n";
+ cerr << "Data address: " << addressBase + startAddress + i;
+ cerr << " Limit: " << limit << "\n";
+ if (!m_chunks.back().m_bytes.size())
+ {
+ m_chunks.pop_back();
+ }
+ continue;
+ }
+ m_chunks.back().m_bytes.push_back(tmp);
+ }
+ }
+ break;
+
+ case 1:
+ // End-of-file record
+ if (dataBytes != 0)
+ {
+ cerr << "Warning: End of file record not zero length!\n";
+ }
+ if (startAddress != 0)
+ {
+ cerr << "Warning: End of file record address not zero!\n";
+ }
+ endSeen = true;
+ break;
+
+ case 2:
+ // Extended segment address record
+ if (dataBytes != 2)
+ {
+ throw "Length field must be 2 in extended segment address record!\n";
+ }
+ if (startAddress != 0)
+ {
+ throw "Address field must be zero in extended segment address record!\n";
+ }
+ sscanf(&szLine[9], "%4lx", &startAddress);
+ addressBase = startAddress << 4;
+ linear = false;
+ break;
+
+ case 3:
+ // Start segment address record
+ if (dataBytes != 4)
+ {
+ cerr << "Warning: Length field must be 4 in start segment address record!\n";
+ }
+ if (startAddress != 0)
+ {
+ cerr << "Warning: Address field must be zero in start segment address record!\n";
+ }
+ if (dataBytes == 4)
+ {
+ unsigned long ssa;
+ char ssaStr[16];
+ sscanf(&szLine[9], "%8lx", &ssa);
+ sprintf(ssaStr, "%08X\n", ssa);
+ cerr << "Segment start address (CS/IP): ";
+ cerr << ssaStr;
+ }
+ break;
+
+ case 4:
+ // Extended linear address record
+ if (dataBytes != 2)
+ {
+ throw "Length field must be 2 in extended linear address record!\n";
+ }
+ if (startAddress != 0)
+ {
+ throw "Address field must be zero in extended linear address record!\n";
+ }
+ sscanf(&szLine[9], "%4lx", &startAddress);
+ addressBase = ((unsigned long)startAddress) << 16;
+ linear = true;
+ break;
+
+ case 5:
+ // Start linear address record
+ if (dataBytes != 4)
+ {
+ cerr << "Warning: Length field must be 4 in start linear address record!\n";
+ }
+ if (startAddress != 0)
+ {
+ cerr << "Warning: Address field must be zero in start linear address record!\n";
+ }
+ if (dataBytes == 4)
+ {
+ unsigned long lsa;
+ char lsaStr[16];
+ sscanf(&szLine[9], "%8lx", &lsa);
+ sprintf(lsaStr, "%08X\n", lsa);
+ cerr << "Linear start address: ";
+ cerr << lsaStr;
+ }
+ break;
+
+ default:
+ cerr << "Waring: Unknown record found!\n";
+ }
+ }
+ else
+ {
+ // S-record
+ unsigned long count;
+ char type;
+ if (sscanf(&szLine[1], "%c%2lx", &type, &count) != 2)
+ {
+ throw "Hex line beginning corrupt!\n";
+ }
+ // Check line length
+ if (szLine[4 + count * 2] != '\n' && szLine[4 + count * 2] != 0)
+ {
+ throw "Hex line length incorrect!\n";
+ }
+ // Check line checksum
+ unsigned char checkSum = 0;
+ unsigned long tmp;
+ for (unsigned int i = 0; i < count + 1; ++i)
+ {
+ if (sscanf(&szLine[2 + i * 2], "%2lx", &tmp) != 1)
+ {
+ throw "Hex line data corrupt!\n";
+ }
+ checkSum += tmp;
+ }
+ if (checkSum != 255)
+ {
+ throw "Hex line checksum error!\n";
+ }
+
+ switch (type)
+ {
+ case '0':
+ // Header record
+ {
+ char header[256];
+ unsigned char i = 0;
+ for (i = 0; i + 3 < count; ++i)
+ {
+ sscanf(&szLine[8 + i * 2], "%2lx", &tmp);
+ header[i] = tmp;
+ }
+ header[i] = 0;
+ if (i > 0)
+ {
+ cerr << "Module name: " << header << "\n";
+ }
+ }
+ break;
+
+ case '1':
+ case '2':
+ case '3':
+ // Data record
+ {
+ dataRecords++;
+ unsigned long startAddress;
+ if (type == '1')
+ {
+ sscanf(&szLine[4], "%4lx", &startAddress);
+ }
+ else if (type == '2')
+ {
+ sscanf(&szLine[4], "%6lx", &startAddress);
+ }
+ else
+ {
+ sscanf(&szLine[4], "%8lx", &startAddress);
+ }
+
+ if (!m_chunks.size() ||
+ m_chunks.back().m_startAddress + m_chunks.back().m_bytes.size() !=
+ startAddress)
+ {
+ m_chunks.push_back(MemBlock());
+ m_chunks.back().m_startAddress = startAddress;
+ }
+ unsigned char i = 0;
+ for (i = (type - '1'); i + 3 < count; ++i)
+ {
+ sscanf(&szLine[8 + i * 2], "%2lx", &tmp);
+ if (startAddress + i > limit)
+ {
+ cerr << "Ignoring data above address space!\n";
+ cerr << "Data address: " << startAddress + i;
+ cerr << " Limit: " << limit << "\n";
+ if (!m_chunks.back().m_bytes.size())
+ {
+ m_chunks.pop_back();
+ }
+ continue;
+ }
+ m_chunks.back().m_bytes.push_back(tmp);
+ }
+ }
+ break;
+
+ case '5':
+ // Count record
+ {
+ unsigned long address;
+ sscanf(&szLine[4], "%4lx", &address);
+ if (address != dataRecords)
+ {
+ throw "Wrong number of data records!\n";
+ }
+ }
+ break;
+
+ case '7':
+ case '8':
+ case '9':
+ // Start address record
+ cerr << "Ignoring start address record!\n";
+ break;
+
+ default:
+ cerr << "Unknown record found!\n";
+ }
+ }
+ }
+ if (intel && !endSeen)
+ {
+ cerr << "No end of file record!\n";
+ }
+ if (!m_chunks.size())
+ {
+ throw "No data in file!\n";
+ }
+ vector<MemBlock>::iterator vi;
+ m_top = 0;
+ for (vi = m_chunks.begin(); vi < m_chunks.end(); vi++)
+ {
+ m_top = max(m_top, vi->m_startAddress + vi->m_bytes.size() - 1);
+ }
+ }
+
+ // Rather inefficient this one, fix sometime
+ bool GetByte(const unsigned long address, unsigned char &chr)
+ {
+ vector<MemBlock>::iterator vi;
+
+ for (vi = m_chunks.begin(); vi < m_chunks.end(); vi++)
+ {
+ if (vi->m_startAddress + vi->m_bytes.size() > address && vi->m_startAddress <= address)
+ {
+ break;
+ }
+ }
+ if (vi == m_chunks.end())
+ {
+ return false;
+ }
+ chr = vi->m_bytes[address - vi->m_startAddress];
+ return true;
+ }
+
+ bool BitString(const unsigned long address, const unsigned char bits, const bool lEndian, string &str)
+ {
+ bool ok = false;
+ long i;
+ unsigned char chr;
+ unsigned long data = 0;
+ unsigned long tmp;
+
+ if (lEndian)
+ {
+ for (i = 0; i < (bits + 7) / 8; ++i)
+ {
+ ok |= GetByte(address + i, chr);
+ tmp = chr;
+ data |= tmp << (8 * i);
+ }
+ }
+ else
+ {
+ for (i = 0; i < (bits + 7) / 8; ++i)
+ {
+ ok |= GetByte(address + i, chr);
+ tmp = chr;
+ data |= tmp << (8 * ((bits + 7) / 8 - i - 1));
+ }
+ }
+
+ if (!ok)
+ {
+ return false;
+ }
+
+ unsigned long mask = 1;
+
+ str = "";
+ for (i = 0; i < bits; i++)
+ {
+ if (data & mask)
+ {
+ str.insert(0,"1");
+ }
+ else
+ {
+ str.insert(0,"0");
+ }
+ mask <<= 1;
+ }
+ return true;
+ }
+
+ FILE *Handle() { return m_file; };
+ vector<MemBlock> m_chunks;
+ unsigned long m_top;
+private:
+ FILE *m_file;
+};
+
+
+int main (int argc, char *argv[])
+{
+ cerr << "Hex to VHDL ROM converter by Daniel Wallner. Version 0244\n";
+
+ try
+ {
+ unsigned long aWidth;
+ unsigned long dWidth;
+ char endian;
+ char O = 0;
+
+ if (!(argc == 4 || argc == 5))
+ {
+ cerr << "\nUsage: hex2rom [-b] <input file> <entity name> <format>\n";
+ cerr << "\nIf the -b option is specified the file is read as a binary file\n";
+ cerr << "Hex input files must be intel hex or motorola s-record\n";
+ cerr << "\nThe format string has the format AEDOS where:\n";
+ cerr << " A = Address bits\n";
+ cerr << " E = Endianness, l or b\n";
+ cerr << " D = Data bits\n";
+ cerr << " O = ROM type: (one optional character)\n";
+ cerr << " z for tri-state output\n";
+ cerr << " a for array ROM\n";
+ cerr << " s for synchronous ROM\n";
+ cerr << " u for XST ucf\n";
+ cerr << " l for Leonardo ucf\n";
+ cerr << " S = SelectRAM usage in 1/16 parts (only used when O = u)\n";
+ cerr << "\nExample:\n";
+ cerr << " hex2rom test.hex Test_ROM 18b16z\n\n";
+ return -1;
+ }
+
+ string inFileName;
+ string outFileName;
+
+ unsigned long bytes;
+ unsigned long select = 0;
+
+ if (argc == 5)
+ {
+ if (strcmp(argv[1], "-b"))
+ {
+ throw "Error in arguments!\n";
+ }
+ }
+
+ int result;
+
+ result = sscanf(argv[argc - 1], "%lu%c%lu%c%lu", &aWidth, &endian, &dWidth, &O, &select);
+ if (result < 3)
+ {
+ throw "Error in output format argument!\n";
+ }
+
+ if (aWidth > 32 || (endian != 'l' && endian != 'b') || dWidth > 32 || (result > 3 && O != 'z' && O != 'a' && O != 's' && O != 'u' && O != 'l'))
+ {
+ throw "Error in output format argument!\n";
+ }
+ inFileName = argv[argc - 3];
+ outFileName = argv[argc - 2];
+
+ bytes = (dWidth + 7) / 8;
+
+ File inFile(inFileName.c_str(), "rb");
+
+ if (argc == 4)
+ {
+ inFile.ReadHex((1UL << aWidth) * bytes - 1);
+ }
+ else
+ {
+ inFile.ReadBin((1UL << aWidth) * bytes - 1);
+ }
+
+ string line;
+
+ unsigned long words = 1;
+ unsigned long i = inFile.m_top;
+ i /= bytes;
+
+ while (i != 0)
+ {
+ i >>= 1;
+ words <<= 1;
+ }
+
+ if (O != 'u' && O != 'l')
+ {
+ printf("-- This file was generated with hex2rom written by Daniel Wallner\n");
+ printf("\nlibrary IEEE;");
+ printf("\nuse IEEE.std_logic_1164.all;");
+ printf("\nuse IEEE.numeric_std.all;");
+ printf("\n\nentity %s is", outFileName.c_str());
+ printf("\n\tport(");
+ if (O == 'z')
+ {
+ printf("\n\t\tCE_n\t: in std_logic;", dWidth - 1);
+ printf("\n\t\tOE_n\t: in std_logic;", dWidth - 1);
+ }
+ if (O == 's')
+ {
+ printf("\n\t\tClk\t: in std_logic;", dWidth - 1);
+ }
+ printf("\n\t\tA\t: in std_logic_vector(%d downto 0);", aWidth - 1);
+ printf("\n\t\tD\t: out std_logic_vector(%d downto 0)", dWidth - 1);
+ printf("\n\t);");
+ printf("\nend %s;", outFileName.c_str());
+ printf("\n\narchitecture rtl of %s is", outFileName.c_str());
+ if (!O)
+ {
+ printf("\nbegin");
+ printf("\n\tprocess (A)");
+ printf("\n\tbegin");
+ printf("\n\t\tcase to_integer(unsigned(A)) is");
+ }
+ else if (O == 's')
+ {
+ printf("\n\tsignal A_r : std_logic_vector(%d downto 0);", aWidth - 1);
+ printf("\nbegin");
+ printf("\n\tprocess (Clk)");
+ printf("\n\tbegin");
+ printf("\n\t\tif Clk'event and Clk = '1' then");
+ printf("\n\t\t\tA_r <= A;");
+ printf("\n\t\tend if;");
+ printf("\n\tend process;");
+ printf("\n\tprocess (A_r)");
+ printf("\n\tbegin");
+ printf("\n\t\tcase to_integer(unsigned(A_r)) is");
+ }
+ else
+ {
+ printf("\n\tsubtype ROM_WORD is std_logic_vector(%d downto 0);", dWidth - 1);
+ printf("\n\ttype ROM_TABLE is array(0 to %d) of ROM_WORD;", words - 1);
+ printf("\n\tconstant ROM: ROM_TABLE := ROM_TABLE'(");
+ }
+
+ string str;
+ string strDC;
+ for (i = 0; i < dWidth; i++)
+ {
+ strDC.insert(0, "-");
+ }
+ for (i = 0; i < words; i++)
+ {
+ if (!inFile.BitString(i * bytes, dWidth, endian == 'l', str))
+ {
+ str = strDC;
+ }
+ if (!O || O == 's')
+ {
+ if (inFile.m_top / bytes >= i)
+ {
+ printf("\n\t\twhen %06d => D <= \"%s\";",i, str.c_str());
+ printf("\t-- 0x%04X", i * bytes);
+ }
+ }
+ else
+ {
+ printf("\n\t\t\"%s", str.c_str());
+ if (i != words - 1)
+ {
+ printf("\",");
+ }
+ else
+ {
+ printf("\");");
+ }
+ printf("\t-- 0x%04X", i * bytes);
+ }
+ }
+
+ if (!O || O == 's')
+ {
+ printf("\n\t\twhen others => D <= \"%s\";", strDC.c_str());
+ printf("\n\t\tend case;");
+ printf("\n\tend process;");
+ }
+ else
+ {
+ printf("\nbegin");
+ if (O == 'z')
+ {
+ printf("\n\tD <= ROM(to_integer(unsigned(A))) when CE_n = '0' and OE_n = '0' else (others => 'Z');");
+ }
+ else
+ {
+ printf("\n\tD <= ROM(to_integer(unsigned(A)));");
+ }
+ }
+ printf("\nend;\n");
+ }
+ else
+ {
+ unsigned long selectIter = 0;
+ unsigned long blockIter = 0;
+
+ if (!select)
+ {
+ blockIter = ((1UL << aWidth) + 511) / 512;
+ }
+ else if (select == 16)
+ {
+ selectIter = ((1UL << aWidth) + 15) / 16;
+ }
+ else
+ {
+ blockIter = ((1UL << aWidth) * (16 - select) / 16 + 511) / 512;
+ selectIter = ((1UL << aWidth) - blockIter * 512 + 15) / 16;
+ }
+
+ cerr << "Creating .ucf file with " << selectIter * bytes;
+ cerr << " LUTs and " << blockIter * bytes << " block RAMs\n";
+
+ unsigned long blockTotal = ((1UL << aWidth) + 511) / 512;
+
+ printf("# This file was generated with hex2rom written by Daniel Wallner\n");
+
+ for (i = 0; i < selectIter; i++)
+ {
+ unsigned long base = i * 16 * bytes;
+ unsigned long j;
+ unsigned char c;
+ unsigned long pos;
+
+ // Check that there is any actual data in segment
+ bool init = false;
+ for (pos = 0; pos < bytes * 16; pos++)
+ {
+ init = inFile.GetByte(base + pos, c);
+ if (init)
+ {
+ break;
+ }
+ }
+
+ if (init)
+ {
+ for (j = 0; j < dWidth; j++)
+ {
+ unsigned long bitMask = 1;
+ unsigned long bits = 0;
+
+ for (pos = 0; pos < 16; pos++)
+ {
+ unsigned long addr;
+
+ if (endian = 'l')
+ {
+ addr = base + bytes * pos + j / 8;
+ }
+ else
+ {
+ addr = base + bytes * pos + bytes - j / 8 - 1;
+ }
+
+ c = 0;
+ inFile.GetByte(addr, c);
+ if (c & (1 << (j % 8)))
+ {
+ bits |= bitMask;
+ }
+ bitMask <<= 1;
+ }
+
+ if (O == 'u')
+ {
+ if (selectIter == 1)
+ {
+ printf("\nINST *s%s%d INIT = %04X;", outFileName.c_str(), j, bits);
+ }
+ else
+ {
+ printf("\nINST *s%s%d%d INIT = %04X;", outFileName.c_str(), i, j, bits);
+ }
+ }
+ else
+ {
+ if (selectIter == 1)
+ {
+ printf("\nINST *sG1_%d_S%s INIT = %04X;", j, outFileName.c_str(), bits);
+ }
+ else
+ {
+ printf("\nINST *sG1_%d_sG2_%d_S%s INIT = %04X;", i, j, outFileName.c_str(), bits);
+ }
+ }
+ }
+ }
+ }
+
+ for (i = blockTotal - blockIter; i < blockTotal; i++)
+ {
+ unsigned long j;
+ for (j = 0; j < bytes; j++)
+ {
+ unsigned long k;
+ for (k = 0; k < 16; k++)
+ {
+ unsigned long base = i * 512 * bytes + k * 32 * bytes;
+ unsigned char c;
+ unsigned long pos;
+
+ // Check that there is any actual data in segment
+ bool init = false;
+ for (pos = 0; pos < 32; pos++)
+ {
+ init = inFile.GetByte(base + bytes * pos + j, c);
+ if (init)
+ {
+ break;
+ }
+ }
+
+ if (init)
+ {
+ if (O == 'u')
+ {
+ if (blockIter == 1)
+ {
+ printf("\nINST *b%s%d INIT_%02X = ", outFileName.c_str(), j, k);
+ }
+ else
+ {
+ printf("\nINST *b%s%d%d INIT_%02X = ", outFileName.c_str(), i, j, k);
+ }
+ }
+ else
+ {
+ if (blockIter == 1)
+ {
+ printf("\nINST *bG1_%d_B%s INIT_%02X = ", j, outFileName.c_str(), k);
+ }
+ else
+ {
+ printf("\nINST *bG1_%d_bG2_%d_B%s INIT_%02X = ", i, j, outFileName.c_str(), k);
+ }
+ }
+ for (pos = 0; pos < 32; pos++)
+ {
+ unsigned long addr;
+
+ if (endian = 'l')
+ {
+ addr = base + bytes * (31 - pos) + j;
+ }
+ else
+ {
+ addr = base + bytes * (31 - pos) + bytes - j - 1;
+ }
+
+ c = 0;
+ inFile.GetByte(addr, c);
+ printf("%02X", c);
+ }
+ printf(";");
+ }
+ }
+ }
+ }
+ printf("\n");
+ }
+ return 0;
+ }
+ catch (string error)
+ {
+ cerr << "Fatal: " << error;
+ }
+ catch (const char *error)
+ {
+ cerr << "Fatal: " << error;
+ }
+ return -1;
+}
diff --git a/sw/xrom.cpp b/sw/xrom.cpp
new file mode 100644
index 0000000..79326b4
--- /dev/null
+++ b/sw/xrom.cpp
@@ -0,0 +1,414 @@
+//
+// Xilinx VHDL ROM generator
+//
+// Version : 0244
+//
+// Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
+//
+// All rights reserved
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+//
+// Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+//
+// Neither the name of the author nor the names of other contributors may
+// be used to endorse or promote products derived from this software without
+// specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+// Please report bugs to the author, but before you do so, please
+// make sure that this is not a derivative work and that
+// you have the latest version of this file.
+//
+// The latest version of this file can be found at:
+// http://www.opencores.org/cvsweb.shtml/t51/
+//
+// Limitations :
+// Not all address/data widths produce working code
+// Requires stl to compile
+//
+// File history :
+//
+// 0220 : Initial release
+//
+// 0221 : Fixed block ROMs with partial bytes
+//
+// 0241 : Updated for WebPack 5.1
+//
+// 0244 : Added -n option and component declaration
+//
+
+#include <stdio.h>
+#include <string>
+#include <vector>
+#include <iostream>
+
+using namespace std;
+
+#if !(defined(max)) && _MSC_VER
+ // VC fix
+ #define max __max
+#endif
+
+int main (int argc, char *argv[])
+{
+ cerr << "Xilinx VHDL ROM generator by Daniel Wallner. Version 0244\n";
+
+ try
+ {
+ unsigned long aWidth;
+ unsigned long dWidth;
+ unsigned long select = 0;
+ unsigned long length = 0;
+ char z = 0;
+
+ if (argc < 4)
+ {
+ cerr << "\nUsage: xrom <entity name> <address bits> <data bits> <options>\n";
+ cerr << "\nThe options can be:\n";
+ cerr << " -[decimal number] = SelectRAM usage in 1/16 parts\n";
+ cerr << " -z = use tri-state buses\n";
+ cerr << " -n [decimal size] = limit rom size\n";
+ cerr << "\nExample:\n";
+ cerr << " xrom Test_ROM 13 8 -6\n\n";
+ return -1;
+ }
+
+ int result;
+
+ result = sscanf(argv[2], "%lu", &aWidth);
+ if (result < 1)
+ {
+ throw "Error in address bits argument!\n";
+ }
+
+ result = sscanf(argv[3], "%lu", &dWidth);
+ if (result < 1)
+ {
+ throw "Error in data bits argument!\n";
+ }
+
+ int argument = 4;
+
+ while (argument < argc)
+ {
+ char tmpC = 0;
+ unsigned long tmpL = 0;
+
+ result = sscanf(argv[argument], "%c%lu", &tmpC, &tmpL);
+ if (result < 1 || tmpC != '-' )
+ {
+ throw "Error in options!\n";
+ }
+
+ if (result < 2)
+ {
+ sscanf(argv[argument], "%c%c", &tmpC, &tmpC);
+ if (tmpC != 'z' && tmpC != 'n')
+ {
+ throw "Unkown option!\n";
+ }
+ if (tmpC == 'z')
+ {
+ z = tmpC;
+ }
+ else
+ {
+ argument++;
+
+ if (argument == argc)
+ {
+ throw "No memory size argument!\n";
+ }
+
+ result = sscanf(argv[argument], "%lu", &tmpL);
+ if (!result)
+ {
+ throw "Memory size not a number!\n";
+ }
+ length = tmpL;
+ }
+ }
+ else
+ {
+ select = tmpL;
+ }
+ argument++;
+ }
+
+ unsigned long selectIter = 0;
+ unsigned long blockIter = 0;
+ unsigned long bytes = (dWidth + 7) / 8;
+
+ if (!select)
+ {
+ blockIter = ((1UL << aWidth) + 511) / 512;
+ if (length && length < blockIter * 512)
+ {
+ blockIter = (length + 511) / 512;
+ }
+ }
+ else if (select == 16)
+ {
+ selectIter = ((1UL << aWidth) + 15) / 16;
+ if (length && length < selectIter * 16)
+ {
+ selectIter = (length + 15) / 16;
+ }
+ }
+ else
+ {
+ blockIter = ((1UL << aWidth) * (16 - select) / 16 + 511) / 512;
+ selectIter = ((1UL << aWidth) - blockIter * 512 + 15) / 16;
+ }
+
+ unsigned long blockTotal = ((1UL << aWidth) + 511) / 512;
+ if (length && length < blockTotal * 512)
+ {
+ blockTotal = (length + 511) / 512;
+ }
+
+ if (length)
+ {
+ if (length > selectIter * 16)
+ {
+ blockIter -= ((1UL << aWidth) + 511) / 512 - blockTotal;
+ }
+ else
+ {
+ blockIter = 0;
+ }
+ }
+ if (length && !blockIter && length < selectIter * 16)
+ {
+ selectIter = (length + 15) / 16;
+ }
+
+ cerr << "Creating ROM with " << selectIter * bytes;
+ cerr << " RAM16X1S and " << blockIter * bytes << " RAMB4_S8\n";
+
+ printf("-- This file was generated with xrom written by Daniel Wallner\n");
+ printf("\nlibrary IEEE;");
+ printf("\nuse IEEE.std_logic_1164.all;");
+ printf("\nuse IEEE.numeric_std.all;");
+ printf("\n\nentity %s is", argv[1]);
+ printf("\n\tport(");
+ printf("\n\t\tClk\t: in std_logic;");
+ printf("\n\t\tA\t: in std_logic_vector(%d downto 0);", aWidth - 1);
+ printf("\n\t\tD\t: out std_logic_vector(%d downto 0)", dWidth - 1);
+ printf("\n\t);");
+ printf("\nend %s;", argv[1]);
+ printf("\n\narchitecture rtl of %s is", argv[1]);
+
+ if (selectIter)
+ {
+ printf("\n\tcomponent RAM16X1S");
+ printf("\n\t\tport(");
+ printf("\n\t\t\tO : out std_ulogic;");
+ printf("\n\t\t\tA0 : in std_ulogic;");
+ printf("\n\t\t\tA1 : in std_ulogic;");
+ printf("\n\t\t\tA2 : in std_ulogic;");
+ printf("\n\t\t\tA3 : in std_ulogic;");
+ printf("\n\t\t\tD : in std_ulogic;");
+ printf("\n\t\t\tWCLK : in std_ulogic;");
+ printf("\n\t\t\tWE : in std_ulogic);");
+ printf("\n\tend component;\n");
+ }
+ if (blockIter)
+ {
+ printf("\n\tcomponent RAMB4_S8");
+ printf("\n\t\tport(");
+ printf("\n\t\t\tDO : out std_logic_vector(7 downto 0);");
+ printf("\n\t\t\tADDR : in std_logic_vector(8 downto 0);");
+ printf("\n\t\t\tCLK : in std_ulogic;");
+ printf("\n\t\t\tDI : in std_logic_vector(7 downto 0);");
+ printf("\n\t\t\tEN : in std_ulogic;");
+ printf("\n\t\t\tRST : in std_ulogic;");
+ printf("\n\t\t\tWE : in std_ulogic);");
+ printf("\n\tend component;\n");
+ }
+
+ if (selectIter > 0)
+ {
+ printf("\n\tsignal A_r: unsigned(A'range);");
+ }
+ if (selectIter > 1)
+ {
+ printf("\n\ttype sRAMOut_a is array(0 to %d) of std_logic_vector(D'range);", selectIter - 1);
+ printf("\n\tsignal sRAMOut : sRAMOut_a;");
+ printf("\n\tsignal siA_r : integer;");
+ }
+ if (selectIter && blockIter)
+ {
+ printf("\n\tsignal sD : std_logic_vector(D'range);");
+ }
+ if (blockIter == 1)
+ {
+ printf("\n\tsignal bRAMOut : std_logic_vector(%d downto 0);", bytes * 8 - 1);
+ }
+ if (blockIter > 1)
+ {
+ printf("\n\ttype bRAMOut_a is array(%d to %d) of std_logic_vector(%d downto 0);", blockTotal - blockIter, blockTotal - 1, bytes * 8 - 1);
+ printf("\n\tsignal bRAMOut : bRAMOut_a;");
+ printf("\n\tsignal biA_r : integer;");
+ if (!selectIter)
+ {
+ printf("\n\tsignal A_r : unsigned(A'left downto 9);");
+ }
+ }
+ if (selectIter && blockIter)
+ {
+ printf("\n\tsignal bD : std_logic_vector(D'range);");
+ }
+
+ printf("\nbegin");
+
+ if (selectIter > 0 || blockIter > 1)
+ {
+ printf("\n\tprocess (Clk)");
+ printf("\n\tbegin");
+ printf("\n\t\tif Clk'event and Clk = '1' then");
+ if (!selectIter)
+ {
+ printf("\n\t\t\tA_r <= unsigned(A(A'left downto 9));");
+ }
+ else
+ {
+ printf("\n\t\t\tA_r <= unsigned(A);");
+ }
+ printf("\n\t\tend if;");
+ printf("\n\tend process;");
+ }
+
+ if (selectIter == 1)
+ {
+ printf("\n\n\tsG1: for I in 0 to %d generate", dWidth - 1);
+ printf("\n\t\tS%s : RAM16X1S\n\t\t\tport map (", argv[1]);
+ if (blockIter)
+ {
+ printf("s");
+ }
+ printf("WE => '0', WCLK => '0', D => '0', O => D(I), A0 => A_r(0), A1 => A_r(1), A2 => A_r(2), A3 => A_r(3));");
+ printf("\n\tend generate;");
+ }
+ if (selectIter > 1)
+ {
+ printf("\n\n\tsiA_r <= to_integer(A_r(A'left downto 4));");
+ printf("\n\n\tsG1: for I in 0 to %d generate", selectIter - 1);
+ printf("\n\t\tsG2: for J in 0 to %d generate", dWidth - 1);
+ printf("\n\t\t\tS%s : RAM16X1S\n\t\t\t\tport map (WE => '0', WCLK => '0', D => '0', O => sRAMOut(I)(J), A0 => A_r(0), A1 => A_r(1), A2 => A_r(2), A3 => A_r(3));", argv[1]);
+ printf("\n\t\tend generate;");
+ if (z == 'z')
+ {
+ printf("\n\t\t");
+ if (blockIter)
+ {
+ printf("s");
+ }
+ printf("D <= sRAMOut(I) when siA_r = I else (others => 'Z');");
+ }
+ printf("\n\tend generate;");
+ if (z != 'z')
+ {
+ printf("\n\n\tprocess (siA_r, sRAMOut)\n\tbegin\n\t\t");
+ if (blockIter)
+ {
+ printf("s");
+ }
+ printf("D <= sRAMOut(0);");
+ printf("\n\t\tfor I in 1 to %d loop", selectIter - 1);
+ printf("\n\t\t\tif siA_r = I then\n\t\t\t\t");
+ if (blockIter)
+ {
+ printf("s");
+ }
+ printf("D <= sRAMOut(I);\n\t\t\tend if;");
+ printf("\n\t\tend loop;\n\tend process;");
+ }
+ }
+
+ if (blockIter == 1)
+ {
+ printf("\n\n\tbG1: for J in 0 to %d generate", bytes - 1);
+ printf("\n\t\tB%s : RAMB4_S8", argv[1]);
+ printf("\n\t\t\tport map (DI => \"00000000\", EN => '1', RST => '0', WE => '0', CLK => Clk, ADDR => A(8 downto 0), DO => bRAMOut(7 + 8 * J downto 8 * J));", argv[1]);
+ printf("\n\tend generate;");
+ printf("\n\n\t");
+ if (selectIter)
+ {
+ printf("b");
+ }
+ printf("D <= bRAMOut(D'range);");
+ }
+ if (blockIter > 1)
+ {
+ printf("\n\n\tbiA_r <= to_integer(A_r(A'left downto 9));");
+ printf("\n\n\tbG1: for I in %d to %d generate", blockTotal - blockIter, blockTotal - 1);
+ printf("\n\t\tbG2: for J in 0 to %d generate", bytes - 1);
+ printf("\n\t\t\tB%s : RAMB4_S8\n\t\t\t\tport map (DI => \"00000000\", EN => '1', RST => '0', WE => '0', CLK => Clk, ADDR => A(8 downto 0), DO => bRAMOut(I)(7 + 8 * J downto 8 * J));", argv[1]);
+ printf("\n\t\tend generate;");
+ if (z == 'z')
+ {
+ printf("\n\t\t");
+ if (selectIter)
+ {
+ printf("b");
+ }
+ printf("D <= bRAMOut(I) when biA_r = I else (others => 'Z');");
+ }
+ printf("\n\tend generate;");
+ if (z != 'z')
+ {
+ printf("\n\n\tprocess (biA_r, bRAMOut)\n\tbegin\n\t\t");
+ if (selectIter)
+ {
+ printf("b");
+ }
+ printf("D <= bRAMOut(%d)(D'range);", blockTotal - blockIter);
+ printf("\n\t\tfor I in %d to %d loop", blockTotal - blockIter + 1, blockTotal - 1);
+ printf("\n\t\t\tif biA_r = I then\n\t\t\t\t");
+ if (selectIter)
+ {
+ printf("b");
+ }
+ printf("D <= bRAMOut(I)(D'range);\n\t\t\tend if;");
+ printf("\n\t\tend loop;\n\tend process;");
+ }
+ }
+
+ if (selectIter && blockIter)
+ {
+ printf("\n\n\tD <= bD when A_r(A'left downto 9) >= %d else sD;", blockTotal - blockIter);
+ }
+
+ printf("\nend;\n");
+
+ return 0;
+ }
+ catch (string error)
+ {
+ cerr << "Fatal: " << error;
+ }
+ catch (const char *error)
+ {
+ cerr << "Fatal: " << error;
+ }
+ return -1;
+}