- work on basic/interpreter option for for Z80/CPM

- add warm/cold reset option for the 6809
- add tools and docs to build 6809 interpreter
- revert the basMon files
This commit is contained in:
Fred VanEijk
2024-12-05 21:22:14 -05:00
parent 1dae91a05e
commit f219ef5c22
41 changed files with 40009 additions and 8104 deletions

View File

@@ -1,325 +1,345 @@
-- This file is copyright by Grant Searle 2014
-- You are free to use this file in your own projects but must never charge for it nor use it without
-- acknowledgement.
-- Please ask permission from Grant Searle before republishing elsewhere.
-- If you use this file or any part of it, please add an acknowledgement to myself and
-- a link back to my main web site http://searle.hostei.com/grant/
-- and to the "multicomp" page at http://searle.hostei.com/grant/Multicomp/index.html
--
-- Please check on the above web pages to see if there are any updates before using this file.
-- If for some reason the page is no longer available, please search for "Grant Searle"
-- on the internet to see if I have moved to another web hosting service.
--
-- Grant Searle
-- eMail address available on my main web page link above.
library ieee;
use ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity Microcomputer6502Basic is
port(
N_RESET : in std_logic;
clk : in std_logic;
baud_increment : in std_logic_vector(15 downto 0);
sramData : inout std_logic_vector(7 downto 0);
sramAddress : out std_logic_vector(15 downto 0);
n_sRamWE : out std_logic;
n_sRamCS : out std_logic;
n_sRamOE : out std_logic;
n_sRamLB : out std_logic;
n_sRamUB : out std_logic;
rxd1 : in std_logic;
txd1 : out std_logic;
rts1 : out std_logic;
cts1 : in std_logic; -- Added CTS input
rxd2 : in std_logic;
txd2 : out std_logic;
rts2 : out std_logic;
videoSync : out std_logic;
video : out std_logic;
R : out std_logic_vector(1 downto 0);
G : out std_logic_vector(1 downto 0);
B : out std_logic_vector(1 downto 0);
HS : out std_logic;
VS : out std_logic;
hBlank : out std_logic;
vBlank : out std_logic;
cepix : out std_logic;
ps2Clk : in std_logic;
ps2Data : in std_logic;
sdCS : out std_logic;
sdMOSI : out std_logic;
sdMISO : in std_logic;
sdSCLK : out std_logic;
sd_ctrl_sel : in std_logic;
driveLED : out std_logic :='1'
);
end Microcomputer6502Basic;
architecture struct of Microcomputer6502Basic is
signal n_WR : std_logic;
signal n_RD : std_logic;
signal cpuAddress : std_logic_vector(15 downto 0);
signal cpuDataOut : std_logic_vector(7 downto 0);
signal cpuDataIn : std_logic_vector(7 downto 0);
signal basRomData : std_logic_vector(7 downto 0);
signal internalRam1DataOut : std_logic_vector(7 downto 0);
signal internalRam2DataOut : std_logic_vector(7 downto 0);
signal interface1DataOut : std_logic_vector(7 downto 0);
signal interface2DataOut : std_logic_vector(7 downto 0);
signal sdCardDataOut : std_logic_vector(7 downto 0);
signal n_memWR : std_logic :='1';
signal n_memRD : std_logic :='1';
signal n_ioWR : std_logic :='1';
signal n_ioRD : std_logic :='1';
signal n_MREQ : std_logic :='1';
signal n_IORQ : std_logic :='1';
signal n_int1 : std_logic :='1';
signal n_int2 : std_logic :='1';
signal n_externalRamCS : std_logic :='1';
signal n_internalRam1CS : std_logic :='1';
signal n_internalRam2CS : std_logic :='1';
signal n_basRomCS : std_logic :='1';
signal n_interface1CS : std_logic :='1';
signal n_interface2CS : std_logic :='1';
signal n_sdCardCS : std_logic :='1';
signal sdCardDataOut_sd : std_logic_vector(7 downto 0);
signal sdCardDataOut_img : std_logic_vector(7 downto 0);
signal driveLED_sd, driveLED_img : std_logic;
signal sdMISO_int : std_logic; -- Add this signal declaration
signal serialClkCount : unsigned(15 downto 0);
signal cpuClkCount : std_logic_vector(5 downto 0);
signal sdClkCount : std_logic_vector(5 downto 0);
signal cpuClock : std_logic;
signal serialClock : std_logic;
signal sdClock : std_logic;
begin
-- ____________________________________________________________________________________
-- CPU CHOICE GOES HERE
cpu1 : entity work.T65
port map(
Enable => '1',
Mode => "00",
Res_n => N_RESET,
Clk => cpuClock,
Rdy => '1',
Abort_n => '1',
IRQ_n => '1',
NMI_n => '1',
SO_n => '1',
R_W_n => n_WR,
A(15 downto 0) => cpuAddress,
DI => cpuDataIn,
DO => cpuDataOut
);
-- ____________________________________________________________________________________
-- ROM GOES HERE
rom1 : entity work.M6502_BASIC_ROM -- 8KB BASIC
port map(
address => cpuAddress(12 downto 0),
clock => clk,
q => basRomData
);
-- ____________________________________________________________________________________
-- RAM GOES HERE
ram1: entity work.InternalRam64K
port map
(
address => cpuAddress(15 downto 0),
clock => clk,
data => cpuDataOut,
wren => not(n_memWR or n_internalRam1CS),
q => internalRam1DataOut
);
-- ____________________________________________________________________________________
-- INPUT/OUTPUT DEVICES GO HERE
io1 : entity work.SBCTextDisplayRGB
port map (
n_reset => N_RESET,
clk => clk,
-- RGB video signals
hSync => HS,
vSync => VS,
videoR0 => R(1),
videoR1 => R(0),
videoG0 => G(1),
videoG1 => G(0),
videoB0 => B(1),
videoB1 => B(0),
hBlank => hBlank,
vBlank => vBlank,
cepix => cepix,
-- Monochrome video signals (when using TV timings only)
sync => videoSync,
video => video,
n_wr => n_interface1CS or cpuClock or n_WR,
n_rd => n_interface1CS or cpuClock or (not n_WR),
n_int => n_int1,
regSel => cpuAddress(0),
dataIn => cpuDataOut,
dataOut => interface1DataOut,
ps2Clk => ps2Clk,
ps2Data => ps2Data
);
io2 : entity work.bufferedUART
port map(
clk => clk,
n_wr => n_interface2CS or cpuClock or n_WR,
n_rd => n_interface2CS or cpuClock or (not n_WR),
n_int => n_int2,
regSel => cpuAddress(0),
dataIn => cpuDataOut,
dataOut => interface2DataOut,
rxClock => serialClock,
txClock => serialClock,
rxd => rxd1,
txd => txd1,
n_cts => cts1, -- Connect CTS signal
n_dcd => '0',
n_rts => rts1
);
sd1 : entity work.sd_controller
port map(
sdCS => sdCS,
sdMOSI => sdMOSI,
sdMISO => sdMISO_int,
sdSCLK => sdSCLK,
n_wr => n_sdCardCS or cpuClock or n_WR,
n_rd => n_sdCardCS or cpuClock or (not n_WR),
n_reset => n_reset,
dataIn => cpuDataOut,
dataOut => sdCardDataOut_sd,
regAddr => cpuAddress(2 downto 0),
driveLED => driveLED_sd,
clk => sdClock -- twice the spi clk
);
-- Add signal assignment outside port map:
sdMISO_int <= sdMISO when sd_ctrl_sel = '0' else '1';
-- New image controller
img1 : entity work.image_controller
port map(
clk => clk,
n_reset => N_RESET,
n_rd => n_sdCardCS or n_ioRD,
n_wr => n_sdCardCS or n_ioWR,
dataIn => cpuDataOut,
dataOut => sdCardDataOut_img,
regAddr => cpuAddress(2 downto 0),
driveLED => driveLED_img
);
-- ____________________________________________________________________________________
-- MEMORY READ/WRITE LOGIC GOES HERE
n_memRD <= not(cpuClock) nand n_WR;
n_memWR <= not(cpuClock) nand (not n_WR);
-- ____________________________________________________________________________________
-- CHIP SELECTS GO HERE
n_basRomCS <= '0' when cpuAddress(15 downto 13) = "111" else '1'; --8K at top of memory
n_interface1CS <= '0' when cpuAddress(15 downto 1) = "111111111101000" else '1'; -- 2 bytes FFD0-FFD1
n_interface2CS <= '0' when cpuAddress(15 downto 1) = "111111111101001" else '1'; -- 2 bytes FFD2-FFD3
n_sdCardCS <= '0' when cpuAddress(15 downto 3) = "1111111111011" else '1'; -- 8 bytes FFD8-FFDF
n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K
-- ____________________________________________________________________________________
-- BUS ISOLATION GOES HERE
-- Mux controller outputs based on selection
sdCardDataOut <= sdCardDataOut_img when sd_ctrl_sel = '1' else
sdCardDataOut_sd;
driveLED <= driveLED_img when sd_ctrl_sel = '1' else
driveLED_sd;
cpuDataIn <=
interface1DataOut when n_interface1CS = '0' else
interface2DataOut when n_interface2CS = '0' else
sdCardDataOut when n_sdCardCS = '0' else
basRomData when n_basRomCS = '0' else
internalRam1DataOut when n_internalRam1CS= '0' else
sramData when n_externalRamCS= '0' else
x"FF";
-- ____________________________________________________________________________________
-- SYSTEM CLOCKS GO HERE
-- SUB-CIRCUIT CLOCK SIGNALS
serialClock <= serialClkCount(15);
process (clk)
begin
if rising_edge(clk) then
if cpuClkCount < 4 then -- 4 = 10MHz, 3 = 12.5MHz, 2=16.6MHz, 1=25MHz
cpuClkCount <= cpuClkCount + 1;
else
cpuClkCount <= (others=>'0');
end if;
if cpuClkCount < 2 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz
cpuClock <= '0';
else
cpuClock <= '1';
end if;
if sdClkCount < 49 then -- 1MHz
sdClkCount <= sdClkCount + 1;
else
sdClkCount <= (others=>'0');
end if;
if sdClkCount < 25 then
sdClock <= '0';
else
sdClock <= '1';
end if;
-- Serial clock DDS
-- 50MHz master input clock:
-- Baud Increment
-- 115200 2416
-- 38400 805
-- 19200 403
-- 9600 201
-- 4800 101
-- 2400 50
serialClkCount <= serialClkCount + unsigned(baud_increment);
end if;
end process;
-- This file is copyright by Grant Searle 2014
-- You are free to use this file in your own projects but must never charge for it nor use it without
-- acknowledgement.
-- Please ask permission from Grant Searle before republishing elsewhere.
-- If you use this file or any part of it, please add an acknowledgement to myself and
-- a link back to my main web site http://searle.hostei.com/grant/
-- and to the "multicomp" page at http://searle.hostei.com/grant/Multicomp/index.html
--
-- Please check on the above web pages to see if there are any updates before using this file.
-- If for some reason the page is no longer available, please search for "Grant Searle"
-- on the internet to see if I have moved to another web hosting service.
--
-- Grant Searle
-- eMail address available on my main web page link above.
library ieee;
use ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity Microcomputer6502Basic is
port(
N_RESET : in std_logic;
clk : in std_logic;
baud_increment : in std_logic_vector(15 downto 0);
sramData : inout std_logic_vector(7 downto 0);
sramAddress : out std_logic_vector(15 downto 0);
n_sRamWE : out std_logic;
n_sRamCS : out std_logic;
n_sRamOE : out std_logic;
n_sRamLB : out std_logic;
n_sRamUB : out std_logic;
rxd1 : in std_logic;
txd1 : out std_logic;
rts1 : out std_logic;
cts1 : in std_logic; -- Added CTS input
rxd2 : in std_logic;
txd2 : out std_logic;
rts2 : out std_logic;
videoSync : out std_logic;
video : out std_logic;
R : out std_logic_vector(1 downto 0);
G : out std_logic_vector(1 downto 0);
B : out std_logic_vector(1 downto 0);
HS : out std_logic;
VS : out std_logic;
hBlank : out std_logic;
vBlank : out std_logic;
cepix : out std_logic;
ps2Clk : in std_logic;
ps2Data : in std_logic;
sdCS : out std_logic;
sdMOSI : out std_logic;
sdMISO : in std_logic;
sdSCLK : out std_logic;
sd_ctrl_sel : in std_logic;
driveLED : out std_logic :='1'
);
end Microcomputer6502Basic;
architecture struct of Microcomputer6502Basic is
signal reset_counter : unsigned(15 downto 0) := (others => '0');
signal reset_n_internal : std_logic := '0'; -- Active low internal reset
signal n_WR : std_logic;
signal n_RD : std_logic;
signal cpuAddress : std_logic_vector(15 downto 0);
signal cpuDataOut : std_logic_vector(7 downto 0);
signal cpuDataIn : std_logic_vector(7 downto 0);
signal basRomData : std_logic_vector(7 downto 0);
signal internalRam1DataOut : std_logic_vector(7 downto 0);
signal internalRam2DataOut : std_logic_vector(7 downto 0);
signal interface1DataOut : std_logic_vector(7 downto 0);
signal interface2DataOut : std_logic_vector(7 downto 0);
signal sdCardDataOut : std_logic_vector(7 downto 0);
signal n_memWR : std_logic :='1';
signal n_memRD : std_logic :='1';
signal n_ioWR : std_logic :='1';
signal n_ioRD : std_logic :='1';
signal n_MREQ : std_logic :='1';
signal n_IORQ : std_logic :='1';
signal n_int1 : std_logic :='1';
signal n_int2 : std_logic :='1';
signal n_externalRamCS : std_logic :='1';
signal n_internalRam1CS : std_logic :='1';
signal n_internalRam2CS : std_logic :='1';
signal n_basRomCS : std_logic :='1';
signal n_interface1CS : std_logic :='1';
signal n_interface2CS : std_logic :='1';
signal n_sdCardCS : std_logic :='1';
signal sdCardDataOut_sd : std_logic_vector(7 downto 0);
signal sdCardDataOut_img : std_logic_vector(7 downto 0);
signal driveLED_sd, driveLED_img : std_logic;
signal sdMISO_int : std_logic; -- Add this signal declaration
signal serialClkCount : unsigned(15 downto 0);
signal cpuClkCount : std_logic_vector(5 downto 0);
signal sdClkCount : std_logic_vector(5 downto 0);
signal cpuClock : std_logic;
signal serialClock : std_logic;
signal sdClock : std_logic;
begin
process(clk)
begin
if rising_edge(clk) then
if N_RESET = '0' then
reset_counter <= (others => '0');
reset_n_internal <= '0';
else
if reset_counter /= unsigned'(X"FFFF") then
reset_counter <= reset_counter + 1;
reset_n_internal <= '0';
else
reset_n_internal <= '1';
end if;
end if;
end if;
end process;
-- ____________________________________________________________________________________
-- CPU CHOICE GOES HERE
cpu1 : entity work.T65
port map(
Enable => '1',
Mode => "00",
Res_n => reset_n_internal,
Clk => cpuClock,
Rdy => '1',
Abort_n => '1',
IRQ_n => '1',
NMI_n => '1',
SO_n => '1',
R_W_n => n_WR,
A(15 downto 0) => cpuAddress,
DI => cpuDataIn,
DO => cpuDataOut
);
-- ____________________________________________________________________________________
-- ROM GOES HERE
rom1 : entity work.M6502_BASIC_ROM -- 8KB BASIC
port map(
address => cpuAddress(12 downto 0),
clock => clk,
q => basRomData
);
-- ____________________________________________________________________________________
-- RAM GOES HERE
ram1: entity work.InternalRam64K
port map
(
address => cpuAddress(15 downto 0),
clock => clk,
data => cpuDataOut,
wren => not(n_memWR or n_internalRam1CS),
q => internalRam1DataOut
);
-- ____________________________________________________________________________________
-- INPUT/OUTPUT DEVICES GO HERE
io1 : entity work.SBCTextDisplayRGB
port map (
n_reset => N_RESET,
clk => clk,
-- RGB video signals
hSync => HS,
vSync => VS,
videoR0 => R(1),
videoR1 => R(0),
videoG0 => G(1),
videoG1 => G(0),
videoB0 => B(1),
videoB1 => B(0),
hBlank => hBlank,
vBlank => vBlank,
cepix => cepix,
-- Monochrome video signals (when using TV timings only)
sync => videoSync,
video => video,
n_wr => n_interface1CS or cpuClock or n_WR,
n_rd => n_interface1CS or cpuClock or (not n_WR),
n_int => n_int1,
regSel => cpuAddress(0),
dataIn => cpuDataOut,
dataOut => interface1DataOut,
ps2Clk => ps2Clk,
ps2Data => ps2Data
);
io2 : entity work.bufferedUART
port map(
clk => clk,
n_wr => n_interface2CS or cpuClock or n_WR,
n_rd => n_interface2CS or cpuClock or (not n_WR),
n_int => n_int2,
regSel => cpuAddress(0),
dataIn => cpuDataOut,
dataOut => interface2DataOut,
rxClock => serialClock,
txClock => serialClock,
rxd => rxd1,
txd => txd1,
n_cts => cts1, -- Connect CTS signal
n_dcd => '0',
n_rts => rts1
);
sd1 : entity work.sd_controller
port map(
sdCS => sdCS,
sdMOSI => sdMOSI,
sdMISO => sdMISO_int,
sdSCLK => sdSCLK,
n_wr => n_sdCardCS or cpuClock or n_WR,
n_rd => n_sdCardCS or cpuClock or (not n_WR),
n_reset => N_RESET,
dataIn => cpuDataOut,
dataOut => sdCardDataOut_sd,
regAddr => cpuAddress(2 downto 0),
driveLED => driveLED_sd,
clk => sdClock -- twice the spi clk
);
-- Add signal assignment outside port map:
sdMISO_int <= sdMISO when sd_ctrl_sel = '0' else '1';
-- New image controller
img1 : entity work.image_controller
port map(
clk => clk,
n_reset => N_RESET,
n_rd => n_sdCardCS or n_ioRD,
n_wr => n_sdCardCS or n_ioWR,
dataIn => cpuDataOut,
dataOut => sdCardDataOut_img,
regAddr => cpuAddress(2 downto 0),
driveLED => driveLED_img
);
-- ____________________________________________________________________________________
-- MEMORY READ/WRITE LOGIC GOES HERE
n_memRD <= not(cpuClock) nand n_WR;
n_memWR <= not(cpuClock) nand (not n_WR);
-- ____________________________________________________________________________________
-- CHIP SELECTS GO HERE
n_basRomCS <= '0' when cpuAddress(15 downto 13) = "111" else '1'; --8K at top of memory
n_interface1CS <= '0' when cpuAddress(15 downto 1) = "111111111101000" else '1'; -- 2 bytes FFD0-FFD1
n_interface2CS <= '0' when cpuAddress(15 downto 1) = "111111111101001" else '1'; -- 2 bytes FFD2-FFD3
n_sdCardCS <= '0' when cpuAddress(15 downto 3) = "1111111111011" else '1'; -- 8 bytes FFD8-FFDF
n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K
-- ____________________________________________________________________________________
-- BUS ISOLATION GOES HERE
-- Mux controller outputs based on selection
sdCardDataOut <= sdCardDataOut_img when sd_ctrl_sel = '1' else
sdCardDataOut_sd;
driveLED <= driveLED_img when sd_ctrl_sel = '1' else
driveLED_sd;
cpuDataIn <=
interface1DataOut when n_interface1CS = '0' else
interface2DataOut when n_interface2CS = '0' else
sdCardDataOut when n_sdCardCS = '0' else
basRomData when n_basRomCS = '0' else
internalRam1DataOut when n_internalRam1CS= '0' else
sramData when n_externalRamCS= '0' else
x"FF";
-- ____________________________________________________________________________________
-- SYSTEM CLOCKS GO HERE
-- SUB-CIRCUIT CLOCK SIGNALS
serialClock <= serialClkCount(15);
process (clk)
begin
if rising_edge(clk) then
if cpuClkCount < 4 then -- 4 = 10MHz, 3 = 12.5MHz, 2=16.6MHz, 1=25MHz
cpuClkCount <= cpuClkCount + 1;
else
cpuClkCount <= (others=>'0');
end if;
if cpuClkCount < 2 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz
cpuClock <= '0';
else
cpuClock <= '1';
end if;
if sdClkCount < 49 then -- 1MHz
sdClkCount <= sdClkCount + 1;
else
sdClkCount <= (others=>'0');
end if;
if sdClkCount < 25 then
sdClock <= '0';
else
sdClock <= '1';
end if;
-- Serial clock DDS
-- 50MHz master input clock:
-- Baud Increment
-- 115200 2416
-- 38400 805
-- 19200 403
-- 9600 201
-- 4800 101
-- 2400 50
serialClkCount <= serialClkCount + unsigned(baud_increment);
end if;
end process;
end;

View File

@@ -1,323 +1,343 @@
-- This file is copyright by Grant Searle 2014
-- You are free to use this file in your own projects but must never charge for it nor use it without
-- acknowledgement.
-- Please ask permission from Grant Searle before republishing elsewhere.
-- If you use this file or any part of it, please add an acknowledgement to myself and
-- a link back to my main web site http://searle.hostei.com/grant/
-- and to the "multicomp" page at http://searle.hostei.com/grant/Multicomp/index.html
--
-- Please check on the above web pages to see if there are any updates before using this file.
-- If for some reason the page is no longer available, please search for "Grant Searle"
-- on the internet to see if I have moved to another web hosting service.
--
-- Grant Searle
-- eMail address available on my main web page link above.
library ieee;
use ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity Microcomputer6809Basic is
port(
N_RESET : in std_logic;
clk : in std_logic;
baud_increment : in std_logic_vector(15 downto 0);
sramData : inout std_logic_vector(7 downto 0);
sramAddress : out std_logic_vector(15 downto 0);
n_sRamWE : out std_logic;
n_sRamCS : out std_logic;
n_sRamOE : out std_logic;
n_sRamLB : out std_logic;
n_sRamUB : out std_logic;
rxd1 : in std_logic;
txd1 : out std_logic;
rts1 : out std_logic;
cts1 : in std_logic; -- Added CTS input
rxd2 : in std_logic;
txd2 : out std_logic;
rts2 : out std_logic;
videoSync : out std_logic;
video : out std_logic;
R : out std_logic_vector(1 downto 0);
G : out std_logic_vector(1 downto 0);
B : out std_logic_vector(1 downto 0);
HS : out std_logic;
VS : out std_logic;
hBlank : out std_logic;
vBlank : out std_logic;
cepix : out std_logic;
ps2Clk : in std_logic;
ps2Data : in std_logic;
sdCS : out std_logic;
sdMOSI : out std_logic;
sdMISO : in std_logic;
sdSCLK : out std_logic;
sd_ctrl_sel : in std_logic;
driveLED : out std_logic :='1'
);
end Microcomputer6809Basic;
architecture struct of Microcomputer6809Basic is
signal n_WR : std_logic;
signal n_RD : std_logic;
signal cpuAddress : std_logic_vector(15 downto 0);
signal cpuDataOut : std_logic_vector(7 downto 0);
signal cpuDataIn : std_logic_vector(7 downto 0);
signal basRomData : std_logic_vector(7 downto 0);
signal internalRam1DataOut : std_logic_vector(7 downto 0);
signal internalRam2DataOut : std_logic_vector(7 downto 0);
signal interface1DataOut : std_logic_vector(7 downto 0);
signal interface2DataOut : std_logic_vector(7 downto 0);
signal sdCardDataOut : std_logic_vector(7 downto 0);
signal n_memWR : std_logic :='1';
signal n_memRD : std_logic :='1';
signal n_ioWR : std_logic :='1';
signal n_ioRD : std_logic :='1';
signal n_MREQ : std_logic :='1';
signal n_IORQ : std_logic :='1';
signal n_int1 : std_logic :='1';
signal n_int2 : std_logic :='1';
signal n_externalRamCS : std_logic :='1';
signal n_internalRam1CS : std_logic :='1';
signal n_internalRam2CS : std_logic :='1';
signal n_basRomCS : std_logic :='1';
signal n_interface1CS : std_logic :='1';
signal n_interface2CS : std_logic :='1';
signal n_sdCardCS : std_logic :='1';
signal sdCardDataOut_sd : std_logic_vector(7 downto 0);
signal sdCardDataOut_img : std_logic_vector(7 downto 0);
signal driveLED_sd, driveLED_img : std_logic;
signal sdMISO_int : std_logic; -- Add this signal declaration
signal serialClkCount : unsigned(15 downto 0);
signal cpuClkCount : std_logic_vector(5 downto 0);
signal sdClkCount : std_logic_vector(5 downto 0);
signal cpuClock : std_logic;
signal serialClock : std_logic;
signal sdClock : std_logic;
begin
-- ____________________________________________________________________________________
-- CPU CHOICE GOES HERE
cpu1 : entity work.cpu09
port map(
clk => not(cpuClock),
rst => not N_RESET,
rw => n_WR,
addr => cpuAddress,
data_in => cpuDataIn,
data_out => cpuDataOut,
halt => '0',
hold => '0',
irq => '0',
firq => '0',
nmi => '0'
);
-- ____________________________________________________________________________________
-- ROM GOES HERE
rom1 : entity work.M6809_EXT_BASIC_ROM -- 8KB BASIC
port map(
address => cpuAddress(12 downto 0),
clock => clk,
q => basRomData
);
-- ____________________________________________________________________________________
-- RAM GOES HERE
ram1: entity work.InternalRam64K
port map
(
address => cpuAddress(15 downto 0),
clock => clk,
data => cpuDataOut,
wren => not(n_memWR or n_internalRam1CS),
q => internalRam1DataOut
);
-- ____________________________________________________________________________________
-- INPUT/OUTPUT DEVICES GO HERE
io1 : entity work.SBCTextDisplayRGB
port map (
n_reset => N_RESET,
clk => clk,
-- RGB video signals
hSync => HS,
vSync => VS,
videoR0 => R(1),
videoR1 => R(0),
videoG0 => G(1),
videoG1 => G(0),
videoB0 => B(1),
videoB1 => B(0),
hBlank => hBlank,
vBlank => vBlank,
cepix => cepix,
-- Monochrome video signals (when using TV timings only)
sync => videoSync,
video => video,
n_wr => n_interface1CS or cpuClock or n_WR,
n_rd => n_interface1CS or cpuClock or (not n_WR),
n_int => n_int1,
regSel => cpuAddress(0),
dataIn => cpuDataOut,
dataOut => interface1DataOut,
ps2Clk => ps2Clk,
ps2Data => ps2Data
);
io2 : entity work.bufferedUART
port map(
clk => clk,
n_wr => n_interface2CS or cpuClock or n_WR,
n_rd => n_interface2CS or cpuClock or (not n_WR),
n_int => n_int2,
regSel => cpuAddress(0),
dataIn => cpuDataOut,
dataOut => interface2DataOut,
rxClock => serialClock,
txClock => serialClock,
rxd => rxd1,
txd => txd1,
n_cts => cts1, -- Connect CTS signal
n_dcd => '0',
n_rts => rts1
);
sd1 : entity work.sd_controller
port map(
sdCS => sdCS,
sdMOSI => sdMOSI,
sdMISO => sdMISO_int,
sdSCLK => sdSCLK,
n_wr => n_sdCardCS or cpuClock or n_WR,
n_rd => n_sdCardCS or cpuClock or (not n_WR),
n_reset => n_reset,
dataIn => cpuDataOut,
dataOut => sdCardDataOut_sd,
regAddr => cpuAddress(2 downto 0),
driveLED => driveLED_sd,
clk => sdClock -- twice the spi clk
);
-- Add signal assignment outside port map:
sdMISO_int <= sdMISO when sd_ctrl_sel = '0' else '1';
-- New image controller
img1 : entity work.image_controller
port map(
clk => clk,
n_reset => N_RESET,
n_rd => n_sdCardCS or n_ioRD,
n_wr => n_sdCardCS or n_ioWR,
dataIn => cpuDataOut,
dataOut => sdCardDataOut_img,
regAddr => cpuAddress(2 downto 0),
driveLED => driveLED_img
);
-- ____________________________________________________________________________________
-- MEMORY READ/WRITE LOGIC GOES HERE
n_memRD <= not(cpuClock) nand n_WR;
n_memWR <= not(cpuClock) nand (not n_WR);
-- ____________________________________________________________________________________
-- CHIP SELECTS GO HERE
n_basRomCS <= '0' when cpuAddress(15 downto 13) = "111" else '1'; --8K at top of memory
n_interface1CS <= '0' when cpuAddress(15 downto 1) = "111111111101000" else '1'; -- 2 bytes FFD0-FFD1
n_interface2CS <= '0' when cpuAddress(15 downto 1) = "111111111101001" else '1'; -- 2 bytes FFD2-FFD3
n_sdCardCS <= '0' when cpuAddress(15 downto 3) = "1111111111011" else '1'; -- 8 bytes FFD8-FFDF
n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K
-- ____________________________________________________________________________________
-- BUS ISOLATION GOES HERE
-- Mux controller outputs based on selection
sdCardDataOut <= sdCardDataOut_img when sd_ctrl_sel = '1' else
sdCardDataOut_sd;
driveLED <= driveLED_img when sd_ctrl_sel = '1' else
driveLED_sd;
cpuDataIn <=
interface1DataOut when n_interface1CS = '0' else
interface2DataOut when n_interface2CS = '0' else
sdCardDataOut when n_sdCardCS = '0' else
basRomData when n_basRomCS = '0' else
internalRam1DataOut when n_internalRam1CS= '0' else
sramData when n_externalRamCS= '0' else
x"FF";
-- ____________________________________________________________________________________
-- SYSTEM CLOCKS GO HERE
-- SUB-CIRCUIT CLOCK SIGNALS
serialClock <= serialClkCount(15);
process (clk)
begin
if rising_edge(clk) then
if cpuClkCount < 4 then -- 4 = 10MHz, 3 = 12.5MHz, 2=16.6MHz, 1=25MHz
cpuClkCount <= cpuClkCount + 1;
else
cpuClkCount <= (others=>'0');
end if;
if cpuClkCount < 2 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz
cpuClock <= '0';
else
cpuClock <= '1';
end if;
if sdClkCount < 49 then -- 1MHz
sdClkCount <= sdClkCount + 1;
else
sdClkCount <= (others=>'0');
end if;
if sdClkCount < 25 then
sdClock <= '0';
else
sdClock <= '1';
end if;
-- Serial clock DDS
-- 50MHz master input clock:
-- Baud Increment
-- 115200 2416
-- 38400 805
-- 19200 403
-- 9600 201
-- 4800 101
-- 2400 50
serialClkCount <= serialClkCount + unsigned(baud_increment);
end if;
end process;
-- This file is copyright by Grant Searle 2014
-- You are free to use this file in your own projects but must never charge for it nor use it without
-- acknowledgement.
-- Please ask permission from Grant Searle before republishing elsewhere.
-- If you use this file or any part of it, please add an acknowledgement to myself and
-- a link back to my main web site http://searle.hostei.com/grant/
-- and to the "multicomp" page at http://searle.hostei.com/grant/Multicomp/index.html
--
-- Please check on the above web pages to see if there are any updates before using this file.
-- If for some reason the page is no longer available, please search for "Grant Searle"
-- on the internet to see if I have moved to another web hosting service.
--
-- Grant Searle
-- eMail address available on my main web page link above.
library ieee;
use ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity Microcomputer6809Basic is
port(
N_RESET : in std_logic;
clk : in std_logic;
baud_increment : in std_logic_vector(15 downto 0);
sramData : inout std_logic_vector(7 downto 0);
sramAddress : out std_logic_vector(15 downto 0);
n_sRamWE : out std_logic;
n_sRamCS : out std_logic;
n_sRamOE : out std_logic;
n_sRamLB : out std_logic;
n_sRamUB : out std_logic;
rxd1 : in std_logic;
txd1 : out std_logic;
rts1 : out std_logic;
cts1 : in std_logic; -- Added CTS input
rxd2 : in std_logic;
txd2 : out std_logic;
rts2 : out std_logic;
videoSync : out std_logic;
video : out std_logic;
R : out std_logic_vector(1 downto 0);
G : out std_logic_vector(1 downto 0);
B : out std_logic_vector(1 downto 0);
HS : out std_logic;
VS : out std_logic;
hBlank : out std_logic;
vBlank : out std_logic;
cepix : out std_logic;
ps2Clk : in std_logic;
ps2Data : in std_logic;
sdCS : out std_logic;
sdMOSI : out std_logic;
sdMISO : in std_logic;
sdSCLK : out std_logic;
sd_ctrl_sel : in std_logic;
driveLED : out std_logic :='1'
);
end Microcomputer6809Basic;
architecture struct of Microcomputer6809Basic is
signal reset_counter : unsigned(15 downto 0) := (others => '0');
signal reset_n_internal : std_logic := '0'; -- Active low internal reset
signal n_WR : std_logic;
signal n_RD : std_logic;
signal cpuAddress : std_logic_vector(15 downto 0);
signal cpuDataOut : std_logic_vector(7 downto 0);
signal cpuDataIn : std_logic_vector(7 downto 0);
signal basRomData : std_logic_vector(7 downto 0);
signal internalRam1DataOut : std_logic_vector(7 downto 0);
signal internalRam2DataOut : std_logic_vector(7 downto 0);
signal interface1DataOut : std_logic_vector(7 downto 0);
signal interface2DataOut : std_logic_vector(7 downto 0);
signal sdCardDataOut : std_logic_vector(7 downto 0);
signal n_memWR : std_logic :='1';
signal n_memRD : std_logic :='1';
signal n_ioWR : std_logic :='1';
signal n_ioRD : std_logic :='1';
signal n_MREQ : std_logic :='1';
signal n_IORQ : std_logic :='1';
signal n_int1 : std_logic :='1';
signal n_int2 : std_logic :='1';
signal n_externalRamCS : std_logic :='1';
signal n_internalRam1CS : std_logic :='1';
signal n_internalRam2CS : std_logic :='1';
signal n_basRomCS : std_logic :='1';
signal n_interface1CS : std_logic :='1';
signal n_interface2CS : std_logic :='1';
signal n_sdCardCS : std_logic :='1';
signal sdCardDataOut_sd : std_logic_vector(7 downto 0);
signal sdCardDataOut_img : std_logic_vector(7 downto 0);
signal driveLED_sd, driveLED_img : std_logic;
signal sdMISO_int : std_logic; -- Add this signal declaration
signal serialClkCount : unsigned(15 downto 0);
signal cpuClkCount : std_logic_vector(5 downto 0);
signal sdClkCount : std_logic_vector(5 downto 0);
signal cpuClock : std_logic;
signal serialClock : std_logic;
signal sdClock : std_logic;
begin
process(cpuClock) -- Use cpuClock instead of clk
begin
if falling_edge(cpuClock) then -- Match CPU's falling edge trigger
if N_RESET = '0' then
reset_counter <= (others => '0');
reset_n_internal <= '0';
else
if reset_counter /= unsigned'(X"FFFF") then
reset_counter <= reset_counter + 1;
reset_n_internal <= '0';
else
reset_n_internal <= '1';
end if;
end if;
end if;
end process;
-- ____________________________________________________________________________________
-- CPU CHOICE GOES HERE
cpu1 : entity work.cpu09
port map(
clk => not(cpuClock),
rst => not(reset_n_internal),
rw => n_WR,
addr => cpuAddress,
data_in => cpuDataIn,
data_out => cpuDataOut,
halt => '0',
hold => '0',
irq => '0',
firq => '0',
nmi => '0'
);
-- ____________________________________________________________________________________
-- ROM GOES HERE
rom1 : entity work.M6809_EXT_BASIC_ROM -- 8KB BASIC
port map(
address => cpuAddress(12 downto 0),
clock => clk,
q => basRomData
);
-- ____________________________________________________________________________________
-- RAM GOES HERE
ram1: entity work.InternalRam64K
port map
(
address => cpuAddress(15 downto 0),
clock => clk,
data => cpuDataOut,
wren => not(n_memWR or n_internalRam1CS),
q => internalRam1DataOut
);
-- ____________________________________________________________________________________
-- INPUT/OUTPUT DEVICES GO HERE
io1 : entity work.SBCTextDisplayRGB
port map (
n_reset => reset_n_internal,
clk => clk,
-- RGB video signals
hSync => HS,
vSync => VS,
videoR0 => R(1),
videoR1 => R(0),
videoG0 => G(1),
videoG1 => G(0),
videoB0 => B(1),
videoB1 => B(0),
hBlank => hBlank,
vBlank => vBlank,
cepix => cepix,
-- Monochrome video signals (when using TV timings only)
sync => videoSync,
video => video,
n_wr => n_interface1CS or cpuClock or n_WR,
n_rd => n_interface1CS or cpuClock or (not n_WR),
n_int => n_int1,
regSel => cpuAddress(0),
dataIn => cpuDataOut,
dataOut => interface1DataOut,
ps2Clk => ps2Clk,
ps2Data => ps2Data
);
io2 : entity work.bufferedUART
port map(
clk => clk,
n_wr => n_interface2CS or cpuClock or n_WR,
n_rd => n_interface2CS or cpuClock or (not n_WR),
n_int => n_int2,
regSel => cpuAddress(0),
dataIn => cpuDataOut,
dataOut => interface2DataOut,
rxClock => serialClock,
txClock => serialClock,
rxd => rxd1,
txd => txd1,
n_cts => cts1, -- Connect CTS signal
n_dcd => '0',
n_rts => rts1
);
sd1 : entity work.sd_controller
port map(
sdCS => sdCS,
sdMOSI => sdMOSI,
sdMISO => sdMISO_int,
sdSCLK => sdSCLK,
n_wr => n_sdCardCS or cpuClock or n_WR,
n_rd => n_sdCardCS or cpuClock or (not n_WR),
n_reset => reset_n_internal,
dataIn => cpuDataOut,
dataOut => sdCardDataOut_sd,
regAddr => cpuAddress(2 downto 0),
driveLED => driveLED_sd,
clk => sdClock -- twice the spi clk
);
-- Add signal assignment outside port map:
sdMISO_int <= sdMISO when sd_ctrl_sel = '0' else '1';
-- New image controller
img1 : entity work.image_controller
port map(
clk => clk,
n_reset => reset_n_internal,
n_rd => n_sdCardCS or n_ioRD,
n_wr => n_sdCardCS or n_ioWR,
dataIn => cpuDataOut,
dataOut => sdCardDataOut_img,
regAddr => cpuAddress(2 downto 0),
driveLED => driveLED_img
);
-- ____________________________________________________________________________________
-- MEMORY READ/WRITE LOGIC GOES HERE
n_memRD <= not(cpuClock) nand n_WR;
n_memWR <= not(cpuClock) nand (not n_WR);
-- ____________________________________________________________________________________
-- CHIP SELECTS GO HERE
n_basRomCS <= '0' when cpuAddress(15 downto 13) = "111" else '1'; --8K at top of memory
n_interface1CS <= '0' when cpuAddress(15 downto 1) = "111111111101000" else '1'; -- 2 bytes FFD0-FFD1
n_interface2CS <= '0' when cpuAddress(15 downto 1) = "111111111101001" else '1'; -- 2 bytes FFD2-FFD3
n_sdCardCS <= '0' when cpuAddress(15 downto 3) = "1111111111011" else '1'; -- 8 bytes FFD8-FFDF
n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K
-- ____________________________________________________________________________________
-- BUS ISOLATION GOES HERE
-- Mux controller outputs based on selection
sdCardDataOut <= sdCardDataOut_img when sd_ctrl_sel = '1' else
sdCardDataOut_sd;
driveLED <= driveLED_img when sd_ctrl_sel = '1' else
driveLED_sd;
cpuDataIn <=
interface1DataOut when n_interface1CS = '0' else
interface2DataOut when n_interface2CS = '0' else
sdCardDataOut when n_sdCardCS = '0' else
basRomData when n_basRomCS = '0' else
internalRam1DataOut when n_internalRam1CS= '0' else
sramData when n_externalRamCS= '0' else
x"FF";
-- ____________________________________________________________________________________
-- SYSTEM CLOCKS GO HERE
-- SUB-CIRCUIT CLOCK SIGNALS
serialClock <= serialClkCount(15);
process (clk)
begin
if rising_edge(clk) then
if cpuClkCount < 4 then -- 4 = 10MHz, 3 = 12.5MHz, 2=16.6MHz, 1=25MHz
cpuClkCount <= cpuClkCount + 1;
else
cpuClkCount <= (others=>'0');
end if;
if cpuClkCount < 2 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz
cpuClock <= '0';
else
cpuClock <= '1';
end if;
if sdClkCount < 49 then -- 1MHz
sdClkCount <= sdClkCount + 1;
else
sdClkCount <= (others=>'0');
end if;
if sdClkCount < 25 then
sdClock <= '0';
else
sdClock <= '1';
end if;
-- Serial clock DDS
-- 50MHz master input clock:
-- Baud Increment
-- 115200 2416
-- 38400 805
-- 19200 403
-- 9600 201
-- 4800 101
-- 2400 50
serialClkCount <= serialClkCount + unsigned(baud_increment);
end if;
end process;
end;

View File

@@ -1,332 +1,352 @@
-- This file is copyright by Grant Searle 2014
-- You are free to use this file in your own projects but must never charge for it nor use it without
-- acknowledgement.
-- Please ask permission from Grant Searle before republishing elsewhere.
-- If you use this file or any part of it, please add an acknowledgement to myself and
-- a link back to my main web site http://searle.hostei.com/grant/
-- and to the "multicomp" page at http://searle.hostei.com/grant/Multicomp/index.html
--
-- Please check on the above web pages to see if there are any updates before using this file.
-- If for some reason the page is no longer available, please search for "Grant Searle"
-- on the internet to see if I have moved to another web hosting service.
--
-- Grant Searle
-- eMail address available on my main web page link above.
library ieee;
use ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity MicrocomputerZ80Basic is
port(
N_RESET : in std_logic;
clk : in std_logic;
baud_increment : in std_logic_vector(15 downto 0);
sramData : inout std_logic_vector(7 downto 0);
sramAddress : out std_logic_vector(15 downto 0);
n_sRamWE : out std_logic;
n_sRamCS : out std_logic;
n_sRamOE : out std_logic;
n_sRamLB : out std_logic;
n_sRamUB : out std_logic;
rxd1 : in std_logic;
txd1 : out std_logic;
rts1 : out std_logic;
cts1 : in std_logic; -- Added CTS input
rxd2 : in std_logic;
txd2 : out std_logic;
rts2 : out std_logic;
videoSync : out std_logic;
video : out std_logic;
R : out std_logic_vector(1 downto 0);
G : out std_logic_vector(1 downto 0);
B : out std_logic_vector(1 downto 0);
HS : out std_logic;
VS : out std_logic;
hBlank : out std_logic;
vBlank : out std_logic;
cepix : out std_logic;
ps2Clk : in std_logic;
ps2Data : in std_logic;
sdCS : out std_logic;
sdMOSI : out std_logic;
sdMISO : in std_logic;
sdSCLK : out std_logic;
sd_ctrl_sel : in std_logic;
driveLED : out std_logic :='1'
);
end MicrocomputerZ80Basic;
architecture struct of MicrocomputerZ80Basic is
signal n_WR : std_logic;
signal n_RD : std_logic;
signal cpuAddress : std_logic_vector(15 downto 0);
signal cpuDataOut : std_logic_vector(7 downto 0);
signal cpuDataIn : std_logic_vector(7 downto 0);
signal basRomData : std_logic_vector(7 downto 0);
signal internalRam1DataOut : std_logic_vector(7 downto 0);
signal internalRam2DataOut : std_logic_vector(7 downto 0);
signal interface1DataOut : std_logic_vector(7 downto 0);
signal interface2DataOut : std_logic_vector(7 downto 0);
signal sdCardDataOut : std_logic_vector(7 downto 0);
signal n_memWR : std_logic :='1';
signal n_memRD : std_logic :='1';
signal n_ioWR : std_logic :='1';
signal n_ioRD : std_logic :='1';
signal n_MREQ : std_logic :='1';
signal n_IORQ : std_logic :='1';
signal n_int1 : std_logic :='1';
signal n_int2 : std_logic :='1';
signal n_externalRamCS : std_logic :='1';
signal n_internalRam1CS : std_logic :='1';
signal n_internalRam2CS : std_logic :='1';
signal n_basRomCS : std_logic :='1';
signal n_interface1CS : std_logic :='1';
signal n_interface2CS : std_logic :='1';
signal n_sdCardCS : std_logic :='1';
signal sdCardDataOut_sd : std_logic_vector(7 downto 0);
signal sdCardDataOut_img : std_logic_vector(7 downto 0);
signal driveLED_sd, driveLED_img : std_logic;
signal sdMISO_int : std_logic; -- Add this signal declaration
signal serialClkCount : unsigned(15 downto 0);
signal cpuClkCount : std_logic_vector(5 downto 0);
signal sdClkCount : std_logic_vector(5 downto 0);
signal cpuClock : std_logic;
signal serialClock : std_logic;
signal sdClock : std_logic;
begin
-- ____________________________________________________________________________________
-- CPU CHOICE GOES HERE
cpu1 : entity work.t80s
generic map(mode => 1, t2write => 1, iowait => 0)
port map(
reset_n => N_RESET,
clk_n => cpuClock,
wait_n => '1',
int_n => '1',
nmi_n => '1',
busrq_n => '1',
mreq_n => n_MREQ,
iorq_n => n_IORQ,
rd_n => n_RD,
wr_n => n_WR,
a => cpuAddress,
di => cpuDataIn,
do => cpuDataOut
);
-- ____________________________________________________________________________________
-- ROM GOES HERE
rom1 : entity work.Z80_BASIC_ROM -- 8KB BASIC
port map(
address => cpuAddress(12 downto 0),
clock => clk,
q => basRomData
);
-- ____________________________________________________________________________________
-- RAM GOES HERE
ram1: entity work.InternalRam64K
port map
(
address => cpuAddress(15 downto 0),
clock => clk,
data => cpuDataOut,
wren => not(n_memWR or n_internalRam1CS),
q => internalRam1DataOut
);
-- ____________________________________________________________________________________
-- INPUT/OUTPUT DEVICES GO HERE
io1 : entity work.SBCTextDisplayRGB
port map (
n_reset => N_RESET,
clk => clk,
-- RGB video signals
hSync => HS,
vSync => VS,
videoR0 => R(1),
videoR1 => R(0),
videoG0 => G(1),
videoG1 => G(0),
videoB0 => B(1),
videoB1 => B(0),
hBlank => hBlank,
vBlank => vBlank,
cepix => cepix,
-- Monochrome video signals (when using TV timings only)
sync => videoSync,
video => video,
n_wr => n_interface1CS or n_ioWR,
n_rd => n_interface1CS or n_ioRD,
n_int => n_int1,
regSel => cpuAddress(0),
dataIn => cpuDataOut,
dataOut => interface1DataOut,
ps2Clk => ps2Clk,
ps2Data => ps2Data
);
io2 : entity work.bufferedUART
port map(
clk => clk,
n_wr => n_interface2CS or n_ioWR,
n_rd => n_interface2CS or n_ioRD,
n_int => n_int2,
regSel => cpuAddress(0),
dataIn => cpuDataOut,
dataOut => interface2DataOut,
rxClock => serialClock,
txClock => serialClock,
rxd => rxd1,
txd => txd1,
n_cts => cts1, -- Connect CTS signal
n_dcd => '0',
n_rts => rts1
);
sd1 : entity work.sd_controller
port map(
sdCS => sdCS,
sdMOSI => sdMOSI,
sdMISO => sdMISO_int,
sdSCLK => sdSCLK,
n_wr => n_sdCardCS or n_ioWR,
n_rd => n_sdCardCS or n_ioRD,
n_reset => N_RESET,
dataIn => cpuDataOut,
dataOut => sdCardDataOut_sd,
regAddr => cpuAddress(2 downto 0),
driveLED => driveLED_sd,
clk => sdClock -- twice the spi clk
);
-- Add signal assignment outside port map:
sdMISO_int <= sdMISO when sd_ctrl_sel = '0' else '1';
-- New image controller
img1 : entity work.image_controller
port map(
clk => clk,
n_reset => N_RESET,
n_rd => n_sdCardCS or n_ioRD,
n_wr => n_sdCardCS or n_ioWR,
dataIn => cpuDataOut,
dataOut => sdCardDataOut_img,
regAddr => cpuAddress(2 downto 0),
driveLED => driveLED_img
);
-- ____________________________________________________________________________________
-- MEMORY READ/WRITE LOGIC GOES HERE
n_ioWR <= n_WR or n_IORQ;
n_memWR <= n_WR or n_MREQ;
n_ioRD <= n_RD or n_IORQ;
n_memRD <= n_RD or n_MREQ;
-- ____________________________________________________________________________________
-- CHIP SELECTS GO HERE
n_basRomCS <= '0' when cpuAddress(15 downto 13) = "000" else '1'; --8K at bottom of memory
n_interface1CS <= '0' when cpuAddress(7 downto 1) = "1000000" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $80-$81
n_interface2CS <= '0' when cpuAddress(7 downto 1) = "1000001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $82-$83
n_sdCardCS <= '0' when cpuAddress(7 downto 3) = "10001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 8 Bytes $88-$8F
n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K
-- ____________________________________________________________________________________
-- BUS ISOLATION GOES HERE
-- Mux controller outputs based on selection
sdCardDataOut <= sdCardDataOut_img when sd_ctrl_sel = '1' else
sdCardDataOut_sd;
driveLED <= driveLED_img when sd_ctrl_sel = '1' else
driveLED_sd;
cpuDataIn <=
interface1DataOut when n_interface1CS = '0' else
interface2DataOut when n_interface2CS = '0' else
sdCardDataOut when n_sdCardCS = '0' else
basRomData when n_basRomCS = '0' else
internalRam1DataOut when n_internalRam1CS= '0' else
sramData when n_externalRamCS= '0' else
x"FF";
-- ____________________________________________________________________________________
-- SYSTEM CLOCKS GO HERE
-- SUB-CIRCUIT CLOCK SIGNALS
serialClock <= serialClkCount(15);
process (clk)
begin
if rising_edge(clk) then
if cpuClkCount < 4 then -- 4 = 10MHz, 3 = 12.5MHz, 2=16.6MHz, 1=25MHz
cpuClkCount <= cpuClkCount + 1;
else
cpuClkCount <= (others=>'0');
end if;
if cpuClkCount < 2 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz
cpuClock <= '0';
else
cpuClock <= '1';
end if;
if sdClkCount < 49 then -- 1MHz
sdClkCount <= sdClkCount + 1;
else
sdClkCount <= (others=>'0');
end if;
if sdClkCount < 25 then
sdClock <= '0';
else
sdClock <= '1';
end if;
-- Serial clock DDS
-- 50MHz master input clock:
-- Baud Increment
-- 115200 2416
-- 38400 805
-- 19200 403
-- 9600 201
-- 4800 101
-- 2400 50
serialClkCount <= serialClkCount + unsigned(baud_increment);
end if;
end process;
end;
-- This file is copyright by Grant Searle 2014
-- You are free to use this file in your own projects but must never charge for it nor use it without
-- acknowledgement.
-- Please ask permission from Grant Searle before republishing elsewhere.
-- If you use this file or any part of it, please add an acknowledgement to myself and
-- a link back to my main web site http://searle.hostei.com/grant/
-- and to the "multicomp" page at http://searle.hostei.com/grant/Multicomp/index.html
--
-- Please check on the above web pages to see if there are any updates before using this file.
-- If for some reason the page is no longer available, please search for "Grant Searle"
-- on the internet to see if I have moved to another web hosting service.
--
-- Grant Searle
-- eMail address available on my main web page link above.
library ieee;
use ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity MicrocomputerZ80Basic is
port(
N_RESET : in std_logic;
clk : in std_logic;
baud_increment : in std_logic_vector(15 downto 0);
sramData : inout std_logic_vector(7 downto 0);
sramAddress : out std_logic_vector(15 downto 0);
n_sRamWE : out std_logic;
n_sRamCS : out std_logic;
n_sRamOE : out std_logic;
n_sRamLB : out std_logic;
n_sRamUB : out std_logic;
rxd1 : in std_logic;
txd1 : out std_logic;
rts1 : out std_logic;
cts1 : in std_logic; -- Added CTS input
rxd2 : in std_logic;
txd2 : out std_logic;
rts2 : out std_logic;
videoSync : out std_logic;
video : out std_logic;
R : out std_logic_vector(1 downto 0);
G : out std_logic_vector(1 downto 0);
B : out std_logic_vector(1 downto 0);
HS : out std_logic;
VS : out std_logic;
hBlank : out std_logic;
vBlank : out std_logic;
cepix : out std_logic;
ps2Clk : in std_logic;
ps2Data : in std_logic;
sdCS : out std_logic;
sdMOSI : out std_logic;
sdMISO : in std_logic;
sdSCLK : out std_logic;
sd_ctrl_sel : in std_logic;
driveLED : out std_logic :='1'
);
end MicrocomputerZ80Basic;
architecture struct of MicrocomputerZ80Basic is
signal reset_counter : unsigned(15 downto 0) := (others => '0');
signal reset_n_internal : std_logic := '0'; -- Active low internal reset
signal n_WR : std_logic;
signal n_RD : std_logic;
signal cpuAddress : std_logic_vector(15 downto 0);
signal cpuDataOut : std_logic_vector(7 downto 0);
signal cpuDataIn : std_logic_vector(7 downto 0);
signal basRomData : std_logic_vector(7 downto 0);
signal internalRam1DataOut : std_logic_vector(7 downto 0);
signal internalRam2DataOut : std_logic_vector(7 downto 0);
signal interface1DataOut : std_logic_vector(7 downto 0);
signal interface2DataOut : std_logic_vector(7 downto 0);
signal sdCardDataOut : std_logic_vector(7 downto 0);
signal n_memWR : std_logic :='1';
signal n_memRD : std_logic :='1';
signal n_ioWR : std_logic :='1';
signal n_ioRD : std_logic :='1';
signal n_MREQ : std_logic :='1';
signal n_IORQ : std_logic :='1';
signal n_int1 : std_logic :='1';
signal n_int2 : std_logic :='1';
signal n_externalRamCS : std_logic :='1';
signal n_internalRam1CS : std_logic :='1';
signal n_internalRam2CS : std_logic :='1';
signal n_basRomCS : std_logic :='1';
signal n_interface1CS : std_logic :='1';
signal n_interface2CS : std_logic :='1';
signal n_sdCardCS : std_logic :='1';
signal sdCardDataOut_sd : std_logic_vector(7 downto 0);
signal sdCardDataOut_img : std_logic_vector(7 downto 0);
signal driveLED_sd, driveLED_img : std_logic;
signal sdMISO_int : std_logic; -- Add this signal declaration
signal serialClkCount : unsigned(15 downto 0);
signal cpuClkCount : std_logic_vector(5 downto 0);
signal sdClkCount : std_logic_vector(5 downto 0);
signal cpuClock : std_logic;
signal serialClock : std_logic;
signal sdClock : std_logic;
begin
process(clk)
begin
if rising_edge(clk) then
if N_RESET = '0' then
reset_counter <= (others => '0');
reset_n_internal <= '0';
else
if reset_counter /= unsigned'(X"FFFF") then
reset_counter <= reset_counter + 1;
reset_n_internal <= '0';
else
reset_n_internal <= '1';
end if;
end if;
end if;
end process;
-- ____________________________________________________________________________________
-- CPU CHOICE GOES HERE
cpu1 : entity work.t80s
generic map(mode => 1, t2write => 1, iowait => 0)
port map(
reset_n => reset_n_internal,
clk_n => cpuClock,
wait_n => '1',
int_n => '1',
nmi_n => '1',
busrq_n => '1',
mreq_n => n_MREQ,
iorq_n => n_IORQ,
rd_n => n_RD,
wr_n => n_WR,
a => cpuAddress,
di => cpuDataIn,
do => cpuDataOut
);
-- ____________________________________________________________________________________
-- ROM GOES HERE
rom1 : entity work.Z80_BASIC_ROM -- 8KB BASIC
port map(
address => cpuAddress(12 downto 0),
clock => clk,
q => basRomData
);
-- ____________________________________________________________________________________
-- RAM GOES HERE
ram1: entity work.InternalRam64K
port map
(
address => cpuAddress(15 downto 0),
clock => clk,
data => cpuDataOut,
wren => not(n_memWR or n_internalRam1CS),
q => internalRam1DataOut
);
-- ____________________________________________________________________________________
-- INPUT/OUTPUT DEVICES GO HERE
io1 : entity work.SBCTextDisplayRGB
port map (
n_reset => N_RESET,
clk => clk,
-- RGB video signals
hSync => HS,
vSync => VS,
videoR0 => R(1),
videoR1 => R(0),
videoG0 => G(1),
videoG1 => G(0),
videoB0 => B(1),
videoB1 => B(0),
hBlank => hBlank,
vBlank => vBlank,
cepix => cepix,
-- Monochrome video signals (when using TV timings only)
sync => videoSync,
video => video,
n_wr => n_interface1CS or n_ioWR,
n_rd => n_interface1CS or n_ioRD,
n_int => n_int1,
regSel => cpuAddress(0),
dataIn => cpuDataOut,
dataOut => interface1DataOut,
ps2Clk => ps2Clk,
ps2Data => ps2Data
);
io2 : entity work.bufferedUART
port map(
clk => clk,
n_wr => n_interface2CS or n_ioWR,
n_rd => n_interface2CS or n_ioRD,
n_int => n_int2,
regSel => cpuAddress(0),
dataIn => cpuDataOut,
dataOut => interface2DataOut,
rxClock => serialClock,
txClock => serialClock,
rxd => rxd1,
txd => txd1,
n_cts => cts1, -- Connect CTS signal
n_dcd => '0',
n_rts => rts1
);
sd1 : entity work.sd_controller
port map(
sdCS => sdCS,
sdMOSI => sdMOSI,
sdMISO => sdMISO_int,
sdSCLK => sdSCLK,
n_wr => n_sdCardCS or n_ioWR,
n_rd => n_sdCardCS or n_ioRD,
n_reset => N_RESET,
dataIn => cpuDataOut,
dataOut => sdCardDataOut_sd,
regAddr => cpuAddress(2 downto 0),
driveLED => driveLED_sd,
clk => sdClock -- twice the spi clk
);
-- Add signal assignment outside port map:
sdMISO_int <= sdMISO when sd_ctrl_sel = '0' else '1';
-- New image controller
img1 : entity work.image_controller
port map(
clk => clk,
n_reset => N_RESET,
n_rd => n_sdCardCS or n_ioRD,
n_wr => n_sdCardCS or n_ioWR,
dataIn => cpuDataOut,
dataOut => sdCardDataOut_img,
regAddr => cpuAddress(2 downto 0),
driveLED => driveLED_img
);
-- ____________________________________________________________________________________
-- MEMORY READ/WRITE LOGIC GOES HERE
n_ioWR <= n_WR or n_IORQ;
n_memWR <= n_WR or n_MREQ;
n_ioRD <= n_RD or n_IORQ;
n_memRD <= n_RD or n_MREQ;
-- ____________________________________________________________________________________
-- CHIP SELECTS GO HERE
n_basRomCS <= '0' when cpuAddress(15 downto 13) = "000" else '1'; --8K at bottom of memory
n_interface1CS <= '0' when cpuAddress(7 downto 1) = "1000000" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $80-$81
n_interface2CS <= '0' when cpuAddress(7 downto 1) = "1000001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $82-$83
n_sdCardCS <= '0' when cpuAddress(7 downto 3) = "10001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 8 Bytes $88-$8F
n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K
-- ____________________________________________________________________________________
-- BUS ISOLATION GOES HERE
-- Mux controller outputs based on selection
sdCardDataOut <= sdCardDataOut_img when sd_ctrl_sel = '1' else
sdCardDataOut_sd;
driveLED <= driveLED_img when sd_ctrl_sel = '1' else
driveLED_sd;
cpuDataIn <=
interface1DataOut when n_interface1CS = '0' else
interface2DataOut when n_interface2CS = '0' else
sdCardDataOut when n_sdCardCS = '0' else
basRomData when n_basRomCS = '0' else
internalRam1DataOut when n_internalRam1CS= '0' else
sramData when n_externalRamCS= '0' else
x"FF";
-- ____________________________________________________________________________________
-- SYSTEM CLOCKS GO HERE
-- SUB-CIRCUIT CLOCK SIGNALS
serialClock <= serialClkCount(15);
process (clk)
begin
if rising_edge(clk) then
if cpuClkCount < 4 then -- 4 = 10MHz, 3 = 12.5MHz, 2=16.6MHz, 1=25MHz
cpuClkCount <= cpuClkCount + 1;
else
cpuClkCount <= (others=>'0');
end if;
if cpuClkCount < 2 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz
cpuClock <= '0';
else
cpuClock <= '1';
end if;
if sdClkCount < 49 then -- 1MHz
sdClkCount <= sdClkCount + 1;
else
sdClkCount <= (others=>'0');
end if;
if sdClkCount < 25 then
sdClock <= '0';
else
sdClock <= '1';
end if;
-- Serial clock DDS
-- 50MHz master input clock:
-- Baud Increment
-- 115200 2416
-- 38400 805
-- 19200 403
-- 9600 201
-- 4800 101
-- 2400 50
serialClkCount <= serialClkCount + unsigned(baud_increment);
end if;
end process;
end;

View File

@@ -1,391 +1,412 @@
-- This file is copyright by Grant Searle 2014
-- You are free to use this file in your own projects but must never charge for it nor use it without
-- acknowledgement.
-- Please ask permission from Grant Searle before republishing elsewhere.
-- If you use this file or any part of it, please add an acknowledgement to myself and
-- a link back to my main web site http://searle.hostei.com/grant/
-- and to the "multicomp" page at http://searle.hostei.com/grant/Multicomp/index.html
--
-- Please check on the above web pages to see if there are any updates before using this file.
-- If for some reason the page is no longer available, please search for "Grant Searle"
-- on the internet to see if I have moved to another web hosting service.
--
-- Grant Searle
-- eMail address available on my main web page link above.
library ieee;
use ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity MicrocomputerZ80CPM is
port(
N_RESET : in std_logic;
clk : in std_logic;
baud_increment : in std_logic_vector(15 downto 0);
sramData : inout std_logic_vector(7 downto 0);
sramAddress : out std_logic_vector(15 downto 0);
n_sRamWE : out std_logic;
n_sRamCS : out std_logic;
n_sRamOE : out std_logic;
n_sRamLB : out std_logic;
n_sRamUB : out std_logic;
rxd1 : in std_logic;
txd1 : out std_logic;
rts1 : out std_logic;
cts1 : in std_logic; -- Added CTS input
rxd2 : in std_logic;
txd2 : out std_logic;
rts2 : out std_logic;
videoSync : out std_logic;
video : out std_logic;
R : out std_logic_vector(1 downto 0);
G : out std_logic_vector(1 downto 0);
B : out std_logic_vector(1 downto 0);
HS : out std_logic;
VS : out std_logic;
hBlank : out std_logic;
vBlank : out std_logic;
cepix : out std_logic;
ps2Clk : in std_logic;
ps2Data : in std_logic;
sdCS : out std_logic;
sdMOSI : out std_logic;
sdMISO : in std_logic;
sdSCLK : out std_logic;
sd_ctrl_sel : in std_logic;
driveLED : out std_logic :='1';
usbCS : out std_logic;
usbMOSI : out std_logic;
usbMISO : in std_logic;
usbSCLK : out std_logic
);
end MicrocomputerZ80CPM;
architecture struct of MicrocomputerZ80CPM is
signal n_WR : std_logic;
signal n_RD : std_logic;
signal cpuAddress : std_logic_vector(15 downto 0);
signal cpuDataOut : std_logic_vector(7 downto 0);
signal cpuDataIn : std_logic_vector(7 downto 0);
signal basRomData : std_logic_vector(7 downto 0);
signal internalRam1DataOut : std_logic_vector(7 downto 0);
signal internalRam2DataOut : std_logic_vector(7 downto 0);
signal interface1DataOut : std_logic_vector(7 downto 0);
signal interface2DataOut : std_logic_vector(7 downto 0);
signal ch376sDataOut : std_logic_vector(7 downto 0);
signal sdCardDataOut : std_logic_vector(7 downto 0);
signal n_memWR : std_logic :='1';
signal n_memRD : std_logic :='1';
signal n_ioWR : std_logic :='1';
signal n_ioRD : std_logic :='1';
signal n_MREQ : std_logic :='1';
signal n_IORQ : std_logic :='1';
signal n_int1 : std_logic :='1';
signal n_int2 : std_logic :='1';
signal n_externalRamCS : std_logic :='1';
signal n_internalRam1CS : std_logic :='1';
signal n_internalRam2CS : std_logic :='1';
signal n_basRomCS : std_logic :='1';
signal n_interface1CS : std_logic :='1';
signal n_interface2CS : std_logic :='1';
signal n_ch376sCS : std_logic :='1';
signal n_sdCardCS : std_logic :='1';
signal serialClkCount : unsigned(15 downto 0);
signal cpuClkCount : std_logic_vector(5 downto 0);
signal sdClkCount : std_logic_vector(5 downto 0);
signal cpuClock : std_logic;
signal serialClock : std_logic;
signal sdClock : std_logic;
signal sdCardDataOut_sd : std_logic_vector(7 downto 0);
signal sdCardDataOut_img : std_logic_vector(7 downto 0);
signal driveLED_sd, driveLED_img : std_logic;
signal sdMISO_int : std_logic; -- Add this signal declaration
--CPM
signal n_RomActive : std_logic := '0';
component ch376s_module is
port (
-- interface
clk : in std_logic;
rd : in std_logic;
wr : in std_logic;
reset : in std_logic;
a0 : in std_logic;
-- SPI wires
sck : out std_logic;
sdcs : out std_logic;
sdo : out std_logic; -- reg
sdi : in std_logic;
-- data
din : in std_logic_vector (7 downto 0);
dout : out std_logic_vector (7 downto 0) -- reg
);
end component;
begin
--CPM
-- Disable ROM if out 38. Re-enable when (asynchronous) reset pressed
process (n_ioWR, N_RESET) begin
if (N_RESET = '0') then
n_RomActive <= '0';
elsif (rising_edge(n_ioWR)) then
if cpuAddress(7 downto 0) = "00111000" then -- $38
n_RomActive <= '1';
end if;
end if;
end process;
-- ____________________________________________________________________________________
-- CPU CHOICE GOES HERE
cpu1 : entity work.t80s
generic map(mode => 1, t2write => 1, iowait => 0)
port map(
reset_n => N_RESET,
clk_n => cpuClock,
wait_n => '1',
int_n => '1',
nmi_n => '1',
busrq_n => '1',
mreq_n => n_MREQ,
iorq_n => n_IORQ,
rd_n => n_RD,
wr_n => n_WR,
a => cpuAddress,
di => cpuDataIn,
do => cpuDataOut
);
-- ____________________________________________________________________________________
-- ROM GOES HERE
rom1 : entity work.Z80_CPM_BASIC_ROM
port map(
address => cpuAddress(12 downto 0),
clock => clk,
q => basRomData
);
-- ____________________________________________________________________________________
-- RAM GOES HERE
ram1: entity work.InternalRam64K
port map
(
address => cpuAddress(15 downto 0),
clock => clk,
data => cpuDataOut,
wren => not(n_memWR or n_internalRam1CS),
q => internalRam1DataOut
);
-- ____________________________________________________________________________________
-- INPUT/OUTPUT DEVICES GO HERE
io1 : entity work.SBCTextDisplayRGB
port map (
n_reset => N_RESET,
clk => clk,
-- RGB video signals
hSync => HS,
vSync => VS,
videoR0 => R(1),
videoR1 => R(0),
videoG0 => G(1),
videoG1 => G(0),
videoB0 => B(1),
videoB1 => B(0),
hBlank => hBlank,
vBlank => vBlank,
cepix => cepix,
-- Monochrome video signals (when using TV timings only)
sync => videoSync,
video => video,
n_wr => n_interface1CS or n_ioWR,
n_rd => n_interface1CS or n_ioRD,
n_int => n_int1,
regSel => cpuAddress(0),
dataIn => cpuDataOut,
dataOut => interface1DataOut,
ps2Clk => ps2Clk,
ps2Data => ps2Data
);
io2 : entity work.bufferedUART
port map(
clk => clk,
n_wr => n_interface2CS or n_ioWR,
n_rd => n_interface2CS or n_ioRD,
n_int => n_int2,
regSel => cpuAddress(0),
dataIn => cpuDataOut,
dataOut => interface2DataOut,
rxClock => serialClock,
txClock => serialClock,
rxd => rxd1,
txd => txd1,
n_cts => cts1, -- Connect CTS signal
n_dcd => '0',
n_rts => rts1
);
sd1 : entity work.sd_controller
port map(
sdCS => sdCS,
sdMOSI => sdMOSI,
sdMISO => sdMISO_int, -- Use the internal signal
sdSCLK => sdSCLK,
n_wr => n_sdCardCS or n_ioWR,
n_rd => n_sdCardCS or n_ioRD,
n_reset => N_RESET,
dataIn => cpuDataOut,
dataOut => sdCardDataOut_sd,
regAddr => cpuAddress(2 downto 0),
driveLED => driveLED_sd,
clk => clk
);
-- Add signal assignment outside port map:
sdMISO_int <= sdMISO when sd_ctrl_sel = '0' else '1';
-- New image controller
img1 : entity work.image_controller
port map(
clk => clk,
n_reset => N_RESET,
n_rd => n_sdCardCS or n_ioRD,
n_wr => n_sdCardCS or n_ioWR,
dataIn => cpuDataOut,
dataOut => sdCardDataOut_img,
regAddr => cpuAddress(2 downto 0),
driveLED => driveLED_img
);
usb : ch376s_module
port map (
sdcs => usbCS,
sdo => usbMOSI,
sdi => usbMISO,
sck => usbSCLK,
wr => not (n_ch376sCS or n_ioWR),
rd => not (n_ch376sCS or n_ioRD),
dout => ch376sDataOut,
din => cpuDataOut,
a0 => cpuAddress (0),
reset => not (N_RESET),
clk => sdClock -- twice the spi clk
);
-- ____________________________________________________________________________________
-- MEMORY READ/WRITE LOGIC GOES HERE
n_ioWR <= n_WR or n_IORQ;
n_memWR <= n_WR or n_MREQ;
n_ioRD <= n_RD or n_IORQ;
n_memRD <= n_RD or n_MREQ;
-- ____________________________________________________________________________________
-- CHIP SELECTS GO HERE
n_basRomCS <= '0' when cpuAddress(15 downto 13) = "000" and n_RomActive = '0' else '1'; --8K at bottom of memory
n_interface1CS <= '0' when cpuAddress(7 downto 1) = "1000000" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $80-$81
n_interface2CS <= '0' when cpuAddress(7 downto 1) = "1000001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $82-$83
n_ch376sCS <= '0' when cpuAddress(7 downto 1) = "0010000" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $20-$21
n_sdCardCS <= '0' when cpuAddress(7 downto 3) = "10001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 8 Bytes $88-$8F
n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K
-- ____________________________________________________________________________________
-- BUS ISOLATION GOES HERE
-- Mux controller outputs based on selection
sdCardDataOut <= sdCardDataOut_img when sd_ctrl_sel = '1' else
sdCardDataOut_sd;
driveLED <= driveLED_img when sd_ctrl_sel = '1' else
driveLED_sd;
-- CPU data input mux needs to be written like this:
cpuDataIn <= interface1DataOut when (n_interface1CS = '0') else
interface2DataOut when (n_interface2CS = '0') else
ch376sDataOut when (n_ch376sCS = '0') else
sdCardDataOut when (n_sdCardCS = '0') else
basRomData when (n_basRomCS = '0') else
internalRam1DataOut when (n_internalRam1CS = '0') else
sramData when (n_externalRamCS = '0') else
x"FF";
-- ____________________________________________________________________________________
-- SYSTEM CLOCKS GO HERE
-- SUB-CIRCUIT CLOCK SIGNALS
serialClock <= serialClkCount(15);
--sdClock <= clk;
process (clk)
begin
if rising_edge(clk) then
if cpuClkCount < 4 then -- 4 = 10MHz, 3 = 12.5MHz, 2=16.6MHz, 1=25MHz
cpuClkCount <= cpuClkCount + 1;
else
cpuClkCount <= (others=>'0');
end if;
if cpuClkCount < 2 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz
cpuClock <= '0';
else
cpuClock <= '1';
end if;
if sdClkCount < 16 then -- 5MHz
sdClkCount <= sdClkCount + 1;
else
sdClkCount <= (others=>'0');
end if;
sdClock <= sdClkCount (3); -- divide by 8 = 6.25 Mhz
--usbCS <= sdClkCount (4);
--usbMOSI <= sdClkCount (3);
--usbSCLK <= sdClkCount (2);
-- Serial clock DDS
-- 50MHz master input clock:
-- Baud Increment
-- 115200 2416
-- 38400 805
-- 19200 403
-- 9600 201
-- 4800 101
-- 2400 50
serialClkCount <= serialClkCount + unsigned(baud_increment);
end if;
end process;
end;
-- This file is copyright by Grant Searle 2014
-- You are free to use this file in your own projects but must never charge for it nor use it without
-- acknowledgement.
-- Please ask permission from Grant Searle before republishing elsewhere.
-- If you use this file or any part of it, please add an acknowledgement to myself and
-- a link back to my main web site http://searle.hostei.com/grant/
-- and to the "multicomp" page at http://searle.hostei.com/grant/Multicomp/index.html
--
-- Please check on the above web pages to see if there are any updates before using this file.
-- If for some reason the page is no longer available, please search for "Grant Searle"
-- on the internet to see if I have moved to another web hosting service.
--
-- Grant Searle
-- eMail address available on my main web page link above.
library ieee;
use ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity MicrocomputerZ80CPM is
port(
N_RESET : in std_logic;
clk : in std_logic;
baud_increment : in std_logic_vector(15 downto 0);
sramData : inout std_logic_vector(7 downto 0);
sramAddress : out std_logic_vector(15 downto 0);
n_sRamWE : out std_logic;
n_sRamCS : out std_logic;
n_sRamOE : out std_logic;
n_sRamLB : out std_logic;
n_sRamUB : out std_logic;
rxd1 : in std_logic;
txd1 : out std_logic;
rts1 : out std_logic;
cts1 : in std_logic; -- Added CTS input
rxd2 : in std_logic;
txd2 : out std_logic;
rts2 : out std_logic;
videoSync : out std_logic;
video : out std_logic;
R : out std_logic_vector(1 downto 0);
G : out std_logic_vector(1 downto 0);
B : out std_logic_vector(1 downto 0);
HS : out std_logic;
VS : out std_logic;
hBlank : out std_logic;
vBlank : out std_logic;
cepix : out std_logic;
ps2Clk : in std_logic;
ps2Data : in std_logic;
sdCS : out std_logic;
sdMOSI : out std_logic;
sdMISO : in std_logic;
sdSCLK : out std_logic;
sd_ctrl_sel : in std_logic;
driveLED : out std_logic :='1';
usbCS : out std_logic;
usbMOSI : out std_logic;
usbMISO : in std_logic;
usbSCLK : out std_logic
);
end MicrocomputerZ80CPM;
architecture struct of MicrocomputerZ80CPM is
signal reset_counter : unsigned(15 downto 0) := (others => '0');
signal reset_n_internal : std_logic := '0'; -- Active low internal reset
signal n_WR : std_logic;
signal n_RD : std_logic;
signal cpuAddress : std_logic_vector(15 downto 0);
signal cpuDataOut : std_logic_vector(7 downto 0);
signal cpuDataIn : std_logic_vector(7 downto 0);
signal basRomData : std_logic_vector(7 downto 0);
signal internalRam1DataOut : std_logic_vector(7 downto 0);
signal internalRam2DataOut : std_logic_vector(7 downto 0);
signal interface1DataOut : std_logic_vector(7 downto 0);
signal interface2DataOut : std_logic_vector(7 downto 0);
signal ch376sDataOut : std_logic_vector(7 downto 0);
signal sdCardDataOut : std_logic_vector(7 downto 0);
signal n_memWR : std_logic :='1';
signal n_memRD : std_logic :='1';
signal n_ioWR : std_logic :='1';
signal n_ioRD : std_logic :='1';
signal n_MREQ : std_logic :='1';
signal n_IORQ : std_logic :='1';
signal n_int1 : std_logic :='1';
signal n_int2 : std_logic :='1';
signal n_externalRamCS : std_logic :='1';
signal n_internalRam1CS : std_logic :='1';
signal n_internalRam2CS : std_logic :='1';
signal n_basRomCS : std_logic :='1';
signal n_interface1CS : std_logic :='1';
signal n_interface2CS : std_logic :='1';
signal n_ch376sCS : std_logic :='1';
signal n_sdCardCS : std_logic :='1';
signal serialClkCount : unsigned(15 downto 0);
signal cpuClkCount : std_logic_vector(5 downto 0);
signal sdClkCount : std_logic_vector(5 downto 0);
signal cpuClock : std_logic;
signal serialClock : std_logic;
signal sdClock : std_logic;
signal sdCardDataOut_sd : std_logic_vector(7 downto 0);
signal sdCardDataOut_img : std_logic_vector(7 downto 0);
signal driveLED_sd, driveLED_img : std_logic;
signal sdMISO_int : std_logic; -- Add this signal declaration
--CPM
signal n_RomActive : std_logic := '0';
component ch376s_module is
port (
-- interface
clk : in std_logic;
rd : in std_logic;
wr : in std_logic;
reset : in std_logic;
a0 : in std_logic;
-- SPI wires
sck : out std_logic;
sdcs : out std_logic;
sdo : out std_logic; -- reg
sdi : in std_logic;
-- data
din : in std_logic_vector (7 downto 0);
dout : out std_logic_vector (7 downto 0) -- reg
);
end component;
begin
--CPM
-- Disable ROM if out 38. Re-enable when (asynchronous) reset pressed
process (n_ioWR, N_RESET) begin
if (N_RESET = '0') then
n_RomActive <= '0';
elsif (rising_edge(n_ioWR)) then
if cpuAddress(7 downto 0) = "00111000" then -- $38
n_RomActive <= '1';
end if;
end if;
end process;
process(clk)
begin
if rising_edge(clk) then
if N_RESET = '0' then
reset_counter <= (others => '0');
reset_n_internal <= '0';
else
if reset_counter /= unsigned'(X"FFFF") then
reset_counter <= reset_counter + 1;
reset_n_internal <= '0';
else
reset_n_internal <= '1';
end if;
end if;
end if;
end process;
-- ____________________________________________________________________________________
-- CPU CHOICE GOES HERE
cpu1 : entity work.t80s
generic map(mode => 1, t2write => 1, iowait => 0)
port map(
reset_n => reset_n_internal,
clk_n => cpuClock,
wait_n => '1',
int_n => '1',
nmi_n => '1',
busrq_n => '1',
mreq_n => n_MREQ,
iorq_n => n_IORQ,
rd_n => n_RD,
wr_n => n_WR,
a => cpuAddress,
di => cpuDataIn,
do => cpuDataOut
);
-- ____________________________________________________________________________________
-- ROM GOES HERE
rom1 : entity work.Z80_CPM_BASIC_ROM
port map(
address => cpuAddress(12 downto 0),
clock => clk,
q => basRomData
);
-- ____________________________________________________________________________________
-- RAM GOES HERE
ram1: entity work.InternalRam64K
port map
(
address => cpuAddress(15 downto 0),
clock => clk,
data => cpuDataOut,
wren => not(n_memWR or n_internalRam1CS),
q => internalRam1DataOut
);
-- ____________________________________________________________________________________
-- INPUT/OUTPUT DEVICES GO HERE
io1 : entity work.SBCTextDisplayRGB
port map (
n_reset => N_RESET,
clk => clk,
-- RGB video signals
hSync => HS,
vSync => VS,
videoR0 => R(1),
videoR1 => R(0),
videoG0 => G(1),
videoG1 => G(0),
videoB0 => B(1),
videoB1 => B(0),
hBlank => hBlank,
vBlank => vBlank,
cepix => cepix,
-- Monochrome video signals (when using TV timings only)
sync => videoSync,
video => video,
n_wr => n_interface1CS or n_ioWR,
n_rd => n_interface1CS or n_ioRD,
n_int => n_int1,
regSel => cpuAddress(0),
dataIn => cpuDataOut,
dataOut => interface1DataOut,
ps2Clk => ps2Clk,
ps2Data => ps2Data
);
io2 : entity work.bufferedUART
port map(
clk => clk,
n_wr => n_interface2CS or n_ioWR,
n_rd => n_interface2CS or n_ioRD,
n_int => n_int2,
regSel => cpuAddress(0),
dataIn => cpuDataOut,
dataOut => interface2DataOut,
rxClock => serialClock,
txClock => serialClock,
rxd => rxd1,
txd => txd1,
n_cts => cts1, -- Connect CTS signal
n_dcd => '0',
n_rts => rts1
);
sd1 : entity work.sd_controller
port map(
sdCS => sdCS,
sdMOSI => sdMOSI,
sdMISO => sdMISO_int, -- Use the internal signal
sdSCLK => sdSCLK,
n_wr => n_sdCardCS or n_ioWR,
n_rd => n_sdCardCS or n_ioRD,
n_reset => N_RESET,
dataIn => cpuDataOut,
dataOut => sdCardDataOut_sd,
regAddr => cpuAddress(2 downto 0),
driveLED => driveLED_sd,
clk => clk
);
-- Add signal assignment outside port map:
sdMISO_int <= sdMISO when sd_ctrl_sel = '0' else '1';
-- New image controller
img1 : entity work.image_controller
port map(
clk => clk,
n_reset => N_RESET,
n_rd => n_sdCardCS or n_ioRD,
n_wr => n_sdCardCS or n_ioWR,
dataIn => cpuDataOut,
dataOut => sdCardDataOut_img,
regAddr => cpuAddress(2 downto 0),
driveLED => driveLED_img
);
usb : ch376s_module
port map (
sdcs => usbCS,
sdo => usbMOSI,
sdi => usbMISO,
sck => usbSCLK,
wr => not (n_ch376sCS or n_ioWR),
rd => not (n_ch376sCS or n_ioRD),
dout => ch376sDataOut,
din => cpuDataOut,
a0 => cpuAddress (0),
reset => not (N_RESET),
clk => sdClock -- twice the spi clk
);
-- ____________________________________________________________________________________
-- MEMORY READ/WRITE LOGIC GOES HERE
n_ioWR <= n_WR or n_IORQ;
n_memWR <= n_WR or n_MREQ;
n_ioRD <= n_RD or n_IORQ;
n_memRD <= n_RD or n_MREQ;
-- ____________________________________________________________________________________
-- CHIP SELECTS GO HERE
n_basRomCS <= '0' when cpuAddress(15 downto 13) = "000" and n_RomActive = '0' else '1'; --8K at bottom of memory
n_interface1CS <= '0' when cpuAddress(7 downto 1) = "1000000" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $80-$81
n_interface2CS <= '0' when cpuAddress(7 downto 1) = "1000001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $82-$83
n_ch376sCS <= '0' when cpuAddress(7 downto 1) = "0010000" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $20-$21
n_sdCardCS <= '0' when cpuAddress(7 downto 3) = "10001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 8 Bytes $88-$8F
n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K
-- ____________________________________________________________________________________
-- BUS ISOLATION GOES HERE
-- Mux controller outputs based on selection
sdCardDataOut <= sdCardDataOut_img when sd_ctrl_sel = '1' else
sdCardDataOut_sd;
driveLED <= driveLED_img when sd_ctrl_sel = '1' else
driveLED_sd;
-- CPU data input mux needs to be written like this:
cpuDataIn <= interface1DataOut when (n_interface1CS = '0') else
interface2DataOut when (n_interface2CS = '0') else
ch376sDataOut when (n_ch376sCS = '0') else
sdCardDataOut when (n_sdCardCS = '0') else
basRomData when (n_basRomCS = '0') else
internalRam1DataOut when (n_internalRam1CS = '0') else
sramData when (n_externalRamCS = '0') else
x"FF";
-- ____________________________________________________________________________________
-- SYSTEM CLOCKS GO HERE
-- SUB-CIRCUIT CLOCK SIGNALS
serialClock <= serialClkCount(15);
--sdClock <= clk;
process (clk)
begin
if rising_edge(clk) then
if cpuClkCount < 4 then -- 4 = 10MHz, 3 = 12.5MHz, 2=16.6MHz, 1=25MHz
cpuClkCount <= cpuClkCount + 1;
else
cpuClkCount <= (others=>'0');
end if;
if cpuClkCount < 2 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz
cpuClock <= '0';
else
cpuClock <= '1';
end if;
if sdClkCount < 16 then -- 5MHz
sdClkCount <= sdClkCount + 1;
else
sdClkCount <= (others=>'0');
end if;
sdClock <= sdClkCount (3); -- divide by 8 = 6.25 Mhz
--usbCS <= sdClkCount (4);
--usbMOSI <= sdClkCount (3);
--usbSCLK <= sdClkCount (2);
-- Serial clock DDS
-- 50MHz master input clock:
-- Baud Increment
-- 115200 2416
-- 38400 805
-- 19200 403
-- 9600 201
-- 4800 101
-- 2400 50
serialClkCount <= serialClkCount + unsigned(baud_increment);
end if;
end process;
end;

879
README.md
View File

@@ -1,439 +1,440 @@
MiSTer MultiComp
================
Port of Grant Searle's MultiComp to the MiSTer.
Ported by Cyril Venditti and Fred VanEijk.
Updated by S0urceror to use MiSTer image files, use all 4 machine types and have the MiSTer
UART connected to serial interface 2 of the core. The latter allows to use the core remotely.
## Using the MiSTer Serial Terminal/Console
### Connection Methods
1. USB: Connect the console port from the MiSTer FPGA to your computer using a USB cable.
2. Network: Use SSH to connect to the MiSTer FPGA if you have a Wireless or Ethernet connection.
3. USB/Serial cable: For more information see the Serial Port section of the Altair8800_MiSTer repository: <https://github.com/MiSTer-devel/Altair8800_MiSTer>
### Setting Up the Connection
#### For UART/Serial with PuTTY
- Connect at 115200 baud, 8 bits, no parity to the COM port.
#### USB to serial cable connection
##### User Port - extra USB 3.1A style connector on MiSTer
| USB | P7 | Name | PIN | Mister | emu wire |
|---|---|---|---|---|---|
|1 | +5V | +5V|
|2 | 2 | TX | SDA | AH9 | USER_IO[1] |
|3 | 1 |RX | SCL | AG11 | USER_IO[0] |
|4 | GND | GND|
|5 | 8 | DSR | IO10 | AF15 | USER_IO[5]|
|6 | 7 | DTR | IO11 | AG16 | USER_IO[4]|
|7 | 6 | CTS | IO12 | AH11 | USER_IO[3]|
|8 | 5 | RTS | IO13 | AH12 | USER_IO[2]|
|9 | 10 | IO6 | IO8 | AF17 | USER_IO[6]|
|10 | Shield | Shield |
##### FT232 USB to serial cable
|wire |name | mister usb IO port|
|---|---|---|
| Red|5V|N/C|
| Black|GND|GND|
| White|RXD|2|
| Green|TXD|3|
| Yellow|RTS|7|
| Blue|CTS|8|
#### For SSH with PuTTY
- Connect to the ip address of your MiSTer fpga.
#### Linux command line to establish the connection to the core
1. Identify the UART device:
- Usually mapped to `/dev/ttyS1` or `/dev/ttyUSB0`
- Use this command to help identify the correct device:
``` bash
dmesg | grep tty
```
2. Access the serial terminal:
- Use `screen` or `minicom`
- Example command with `screen`:
``` bash
screen /dev/ttyS1 115200
```
- Replace `/dev/ttyS1` with the correct device identifier
- Change 115200 to the appropriate baud rate if different
3. Enable Flow Control:
- Use `stty`
``` bash
stty -F /dev/ttyS1 crtscts
```
- Replace `/dev/ttyS1` with the correct device identifier
- This is done before the screen command
### Additional Information
For more details on console connection, refer to the official MiSTer documentation:
[MiSTer Console Connection Guide](https://MiSTer-devel.github.io/MkDocs_MiSTer/advanced/console/)
## The MiSTer OSD allows the access to four machines
### Z80 CP/M
You can now use both an external SDCard and/or select the image file within MiSTer. Whatever you like.
### Formatting the SD Card and Installing CP/M
Note this procedure has to be performed from a tty terminal as descibed above.
#### Formatting the Drive
1. Load the Intel-HEX dump of the `FORMAT` program into memory by copying the contents of `FORM128.HEX` (for 128MB SD card utilization) into the terminal window.
2. The `FORMAT` program will reside at memory address `$5000` when loaded. To start the formatting process, execute the program by typing `G5000` and pressing ENTER.
3. You will see the following message:
```
CP/M Formatter by G. Searle 2012
```
4. After a few seconds, the formatting process will display:
```
ABCDEFGHIJKLMNOP
Formatting complete
```
Each drive is 8MB, so a 128MB SD card will have drives labeled A: to P:.
#### Installing CP/M
CP/M is installed on the first track of the disk. When booted, the first track is read into memory and executed. To install CP/M, follow these steps:
1. Load the Intel-HEX dump of CP/M by copying the contents of `CPM22.HEX` into the terminal window (this takes about 10 seconds).
2. Load the Intel-HEX dump of the CBIOS by copying the contents of `CBIOS128.HEX` (for 128MB total drive space) into the terminal window (this takes about 3 seconds).
3. Load the Intel-HEX dump of `PUTSYS` by copying the contents of `PUTSYS.HEX` into the terminal window.
The `PUTSYS` program also resides at memory address `$5000`. To transfer CP/M and CBIOS to the disk, execute `PUTSYS` by typing `G5000` and pressing ENTER. You will see:
```
CP/M System Transfer by G. Searle 2012
System transfer complete
```
At this point, CP/M is installed and ready for boot. You can now proceed with installing applications.
#### Boot CP/M from image file
Note that currently the `DOWNLOAD.COM` program is not working reliably (we hope to fix this in the future). To get around the issues with `DOWNLOAD.COM` we have added the cpm image file and some Python based utilities, thus being able to get a working and custamizable CP/M sytem up and running.
In the CPM-sd-image directory, you will find a zip file that contains a cmp.img file that can be copied to the /media/fat/games/MultipComp directory. This file can be used to boot CP/M without the SD card. It contains the structure for disks A thru P with A having the DOWNLOAD program and other utilities available. Use this as a strating point to place CP/M applications on the image. See the Installing Applications section at <http://searle.x10host.com/Multicomp/cpm/fpgaCPM.html#InstallingCPM>.
Note the process for this is mostly described in PART 2 - Using the Windows packager program. The packager program is in windowsApp. Again, this process requires the use of the tty terminal not the console, as you will be pasting the file data into the terminal.
We have also added a zip file in the CPM-sd-image directory with a set of application pre installed. See cpm-apps.zip. This file can also be copied to the /media/fat/games/MultipComp directory and mounted. It contains 5 drives A,C,D,E, and F where A still only has the DOWNLOAD program and the other drives contain the following. The cpm.zip file contains just the basic utilities described in the [CPM-sd-image](CPM-sd-image/README.MD) directory.
| C: | D: | E: | F: |
|-----------------|-------------------|------------------|-----------------|
| 0_FILES.TXT | 0_GAMES | 0_OLDUTILS | 0_NEWUTILS |
| 1_BDS_TINY_C | 1_MUMATHSIMP | 1_F80M80BASIC | 1_ROMS |
| 2_APL | 2_CROSSTALK | 2_AZTEC_C_106D | 2_ZSYSTEM |
| 3_JANUS_ADA15 | 3_QTERM43 | 3_TPASCAL3 | 3_MICROPRO |
| 4_MS_COBOL | 4_CLINK | 4_DXFORTH401 | 4_MULTIPLAN |
| 5_PILOT | 5_SUPERSFTUTIL | 5_PLI14 | 5_DBASEII |
| 6_SYSLIB | 6_RCPM | 6_ALGOLM | 6_DWG_APPS |
| 7_BBC BASIC | 7_DDTZ SOURCES | 7_SUPERCALC | 8_MICROSHELL |
Note the use of user numbers here i.e. 0_, 1_ etc..
(Not all the applications were tested to run, so you are on your own)
The applications were obtained from the Obsolescence Guaranteed site.
Included in the CPM-sd-image directory are also some python scripts to initialize/build the image for the CP/M disks. Along with a script in the transient packages directory that can extract the .COM files from the package (note this was used to provide some content to build the cpm.img file provided in CPM-sd-image directory).
To use the Python scripts we recommend using Visual Studio Code and opening the MultiComp_MiSTer directory as its project location. Them just run the Python scripts from within Visual Studio Code.
__Other useful links.__
For convenience you can use the Multicomp FPGA - CP/M Demo Disk from Obsolescence Guaranteed:
<http://obsolescence.wixsite.com/obsolescence/multicomp-fpga-cpm-demo-disk>
After you have flashed the CP/M Demo Disk to the SD Card you will have to use the secondary SD Card on the MiSTer on the I/O Board:
<https://github.com/MiSTer-devel/Wiki_MiSTer/wiki/IO-Board>
Using CP/M - from Grant Searle website:
<http://searle.x10host.com/Multicomp/cpm/fpgaCPM.html>
DeRamp - This website focuses on early personal computers from the mid 70s into the early 80s. Here you'll find resources for restoring and maintaining many of the great computers and peripherals from this era, in addition it has a Downloads section where you can find the bits for many applications. <https://deramp.com/>
### Z80 Basic
SGN, INT, ABS ,USR, FRE, INP, POS, SQR, RND ,LOG, EXP, COS, SIN, TAN, ATN, PEEK ,DEEK ,LEN, STR$, VAL ,ASC, CHR$ ,LEFT$,
RIGHT$, MID$, END, FOR, NEXT, DATA, INPUT, DIM, READ, LET, GOTO, RUN, IF, RESTORE, GOSUB, RETURN, REM, STOP, OUT, ON,
NULL, WAIT, DEF, POKE, DOKE, LINES, CLS, WIDTH, MONITOR, PRINT, CONT, LIST, CLEAR, NEW, TAB, TO, FN, SPC, THEN, NOT,
STEP, +, -, *, /, ^, AND, OR, >, <, =
PLUS additional implementations here (making it version 4.7b):
HEX$(nn) - convert a SIGNED integer (-32768 to +32767) to a string containing the hex value
BIN$(nn) - convert a SIGNED integer (-32768 to +32767) to a string containing the binary value
&Hnn - interpret the value after the &H as a HEX value (signed 16 bit)
&Bnn - interpret the value after the &B as a BINARY value (signed 16 bit)
### 6502 Basic - No SD card support (No CSAVE/CLOAD)
END, FOR, NEXT, DATA, INPUT, DIM, READ, LET, GOTO, RUN, IF, RESTORE, GOSUB, RETURN, REM, STOP, ON, NULL, WAIT, DEF, POKE, PRINT,
CONT, LIST, CLEAR, NEW, TAB(, TO, FN, SPC(, THEN, NOT, STEP, SGN, INT, ABS, USR, FRE, POS, SQR, RND, LOG, EXP, COS, SIN, TAN, ATN,
PEEK, LEN, STR$, VAL, ASC, CHR$, LEFT$, RIGHT$, MID$, +, -, *, /, ^, AND, OR, >, +, <
### 6809 Basic - No SD card support(No CSAVE/CLOAD)
FOR, GO, REM, ELSE, IF, DATA, PRINT, ON GOSUB, ON GOTO, INPUT, LINE INPUT, END, NEXT, DIM, READ, RUN, RESTORE, RETURN, STOP, POKE,
CONT, LIST, CLEAR, NEW, EXEC, TAB, TO, SUB, THEN, NOT, STEP, +, -, *, /, ^, AND, OR, >, =, <, DEL, DEF, LET, RENUM, FN, &, &H, TRON,
TROFF, EDIT, SGN, INT, ABS, USR, RND, SIN, PEEK, LEN, STR$, VAL, ASC, CHR$, LEFT$, RIGHT$, MID$, INKEY$, MEM, ATN, COS, TAN, EXP, FIX,
LOG, SQR, HEX$, VARPTR, INSTR, STRING$, MID$ (MODIFICATION), POS
<http://searle.x10host.com/Multicomp/#BASICKeywords>
# MultiComp OSD Configuration
This section describes the On-Screen Display menu configuration for the MultiComp system, providing control over CPU selection, storage, and communication parameters.
## Menu Structure
### System Control
- __Mount *.IMG__: Provide the image in the games/Multicomp directory
- __Reset after Mount__: Configures system behavior after mounting storage - Options: No, Yes
- __Reset__: System reset function
### CPU and ROM Configuration
- __CPU-ROM Selection__:
- Z80 with CP/M
- Z80 with BASIC
- 6502 with BASIC
- 6809 with BASIC
### Communication Settings
- __Baud Rate__:
- 115200
- 38400
- 19200
- 9600
- 4800
- 2400
- __Serial Port__:
- Console Port - use the MiSTer console port
- User IO Port - use the MiSTer user I/O USB 3.1 port
- __Flow Control__:
- None - no hardware flow control
- RTS/CTS - enable hardware flow control using RTS/CTS signals
### Storage Configuration
- __Storage Controller__:
- SD Controller - select the secondary SD card as storage
- Image Controller - select this to access the cpm image from the games/Multicomp directory
- __Storage Images__: Allows mounting disk images (.IMG files)
### Additional Information
The OSD includes version information and build date tracking. This configuration interface provides comprehensive control over the MultiComp's core functionality, allowing users to switch between different CPU architectures, operating systems, and I/O configurations.
The menu system is designed for straightforward navigation and configuration of the MultiComp's essential features, making it accessible for both basic setup and advanced customization needs.
## Troubleshooting
### Serial Communication Issues
- If no response when typing:
- Verify correct baud rate is selected
- Check that the correct serial port is selected (Console vs User IO)
- Try enabling/disabling flow control
- For User IO port, verify cable connections match pinout documentation
### Storage Issues
- If unable to access CP/M:
- When using SD Controller, verify SD card is properly formatted
- When using Image Controller, ensure .IMG file is in the correct directory (/media/fat/games/MultiComp)
- Try toggling "Reset after Mount" option
### System Stability
- 6809 Basic has known reset issues (inherited from original design)
- If system becomes unresponsive:
- Use OSD Reset function
- Try power cycling the MiSTer
- Verify correct CPU-ROM selection for your intended use
### Known Limitations
- If the DOWNLOAD\.COM program has reliability issues in CP/M use a slower baud rate, we have had some sucess at 2400 and 9600 baud, 115200 baud seems to consistantly drop characters even with flow control enabled
- 6502 and 6809 Basic variants do not support SD card operations (no CSAVE/CLOAD)\
### License
__Software and VHDL project download link__
By downloading these files you must agree to the following: The original
copyright owners of ROM contents are respectfully acknowledged. Use of the
contents of any file within your own projects is permitted freely, but any
publishing of material containing whole or part of any file distributed
here, or derived from the work that I have done here will contain an
acknowledgment back to myself, Grant Searle, and a link back to this page.
Any file published or distributed that contains all or part of any file
arom this page must be made available free of charge.
### Original Author
Grant Searle
### URL
[Grant's MULTICOMP pick and mix computer](http://searle.x10host.com/Multicomp/)
# MiSTer MultiComp BASIC Keywords Reference
## Keywords by Category
### Mathematical Functions
| Keyword | Z80 | 6502 | 6809 | Description | Usage Example |
|---------|-----|------|------|-------------|---------------|
| ABS | ✓ | ✓ | ✓ | Returns absolute value | `X = ABS(-5)` |
| ATN | ✓ | ✓ | ✓ | Returns arctangent | `A = ATN(1)` |
| COS | ✓ | ✓ | ✓ | Returns cosine | `C = COS(3.14159/2)` |
| EXP | ✓ | ✓ | ✓ | Returns e raised to power | `E = EXP(2)` |
| FIX | - | - | ✓ | Truncates decimal portion | `F = FIX(3.7)` |
| INT | ✓ | ✓ | ✓ | Returns integer portion | `I = INT(5.7)` |
| LOG | ✓ | ✓ | ✓ | Returns natural logarithm | `L = LOG(100)` |
| SGN | ✓ | ✓ | ✓ | Returns sign of number (-1,0,1) | `S = SGN(-42)` |
| SIN | ✓ | ✓ | ✓ | Returns sine | `S = SIN(3.14159/2)` |
| SQR | ✓ | ✓ | ✓ | Returns square root | `R = SQR(16)` |
| TAN | ✓ | ✓ | ✓ | Returns tangent | `T = TAN(0.785)` |
### String Functions
| Keyword | Z80 | 6502 | 6809 | Description | Usage Example |
|---------|-----|------|------|-------------|---------------|
| ASC | ✓ | ✓ | ✓ | Returns ASCII value of character | `A = ASC("A")` |
| CHR$ | ✓ | ✓ | ✓ | Returns character for ASCII value | `C$ = CHR$(65)` |
| INSTR | - | - | ✓ | Searches for substring | `I = INSTR(A$, "FIND")` |
| LEFT$ | ✓ | ✓ | ✓ | Returns leftmost characters | `L$ = LEFT$("HELLO", 2)` |
| LEN | ✓ | ✓ | ✓ | Returns string length | `L = LEN("TEST")` |
| MID$ | ✓ | ✓ | ✓ | Returns substring | `M$ = MID$("HELLO", 2, 2)` |
| RIGHT$ | ✓ | ✓ | ✓ | Returns rightmost characters | `R$ = RIGHT$("WORLD", 3)` |
| STR$ | ✓ | ✓ | ✓ | Converts number to string | `S$ = STR$(123)` |
| STRING$ | - | - | ✓ | Creates string of repeated characters | `S$ = STRING$(5, "*")` |
| VAL | | | ✓ | Converts string to number | `V = VAL("123")` |
### Program Control
| Keyword | Z80 | 6502 | 6809 | Description | Usage Example |
|---------|-----|------|------|-------------|---------------|
| CONT | ✓ | ✓ | ✓ | Continues program execution | `CONT` |
| END | ✓ | ✓ | ✓ | Ends program | `END` |
| FOR/NEXT | ✓ | ✓ | ✓ | Loop structure | `FOR I=1 TO 10 : PRINT I : NEXT I` |
| GOSUB | ✓ | ✓ | ✓ | Calls subroutine | `GOSUB 1000` |
| GOTO | ✓ | ✓ | ✓ | Jumps to line number | `GOTO 100` |
| IF/THEN | ✓ | ✓ | ✓ | Conditional execution | `IF X=5 THEN PRINT "YES"` |
| ON GOSUB | - | - | ✓ | Multiple branch subroutine | `ON X GOSUB 100,200,300` |
| ON GOTO | - | - | ✓ | Multiple branch jump | `ON X GOTO 100,200,300` |
| RETURN | | | ✓ | Returns from subroutine | `RETURN` |
| STOP | ✓ | ✓ | ✓ | Halts program execution | `STOP` |
### Data and Variables
| Keyword | Z80 | 6502 | 6809 | Description | Usage Example |
|---------|-----|------|------|-------------|---------------|
| DATA | ✓ | ✓ | ✓ | Stores program data | `DATA 100,200,"TEXT"` |
| DEF FN | ✓ | ✓ | ✓ | Defines function | `DEF FNA(X)=X*X+2` |
| DIM | ✓ | ✓ | ✓ | Declares array dimensions | `DIM A(10),B$(20)` |
| INPUT | ✓ | ✓ | ✓ | Accepts user input | `INPUT "Name?";N$` |
| LET | ✓ | ✓ | ✓ | Assigns variable value | `LET A=5` or `A=5` |
| LINE INPUT | - | - | ✓ | Inputs entire line | `LINE INPUT "Text?";A$` |
| READ | ✓ | ✓ | ✓ | Reads DATA values | `READ A,B,C$` |
| RESTORE | ✓ | ✓ | ✓ | Resets DATA pointer | `RESTORE` |
### System and Memory
| Keyword | Z80 | 6502 | 6809 | Description | Usage Example |
|---------|-----|------|------|-------------|---------------|
| DEEK | ✓ | - | - | Reads word from memory | `D = DEEK(16384)` |
| DOKE | ✓ | - | - | Writes word to memory | `DOKE 16384,12345` |
| FRE | ✓ | | - | Returns free memory | `F = FRE(0)` |
| INP | ✓ | - | - | Reads from I/O port | `I = INP(255)` |
| MEM | - | - | ✓ | Returns memory size | `M = MEM` |
| OUT | ✓ | - | - | Writes to I/O port | `OUT 255,10` |
| PEEK | ✓ | | | Reads byte from memory | `P = PEEK(16384)` |
| POKE | ✓ | ✓ | ✓ | Writes byte to memory | `POKE 16384,255` |
| USR | ✓ | ✓ | ✓ | Calls machine language routine | `U = USR(32768)` |
| VARPTR | - | - | ✓ | Returns variable address | `V = VARPTR(A)` |
### Program Editing
| Keyword | Z80 | 6502 | 6809 | Description | Usage Example |
|---------|-----|------|------|-------------|---------------|
| CLEAR | ✓ | ✓ | ✓ | Clears variables | `CLEAR` |
| CLS | ✓ | - | - | Clears screen | `CLS` |
| DEL | - | - | ✓ | Deletes program lines | `DEL 100-200` |
| EDIT | - | - | ✓ | Edits program line | `EDIT 100` |
| LIST | | ✓ | ✓ | Lists program | `LIST` or `LIST 100-200` |
| NEW | ✓ | ✓ | ✓ | Clears program | `NEW` |
| RENUM | - | - | ✓ | Renumbers program lines | `RENUM 100,10` |
| RUN | | | ✓ | Executes program | `RUN` or `RUN 100` |
| TRON/TROFF | - | - | ✓ | Trace mode on/off | `TRON` or `TROFF` |
### Z80 BASIC Specific Extensions (v4.7b)
| Keyword | Description | Usage Example |
|---------|-------------|---------------|
| HEX$(nn) | Converts signed integer to hex string | `H$ = HEX$(255)` |
| BIN$(nn) | Converts signed integer to binary string | `B$ = BIN$(15)` |
| &Hnn | Interprets nn as hexadecimal value | `X = &H1F` |
| &Bnn | Interprets nn as binary value | `Y = &B1010` |
### Operators
| Operator | Z80 | 6502 | 6809 | Description | Usage Example |
|----------|-----|------|------|-------------|---------------|
| + | ✓ | ✓ | ✓ | Addition | `A = B + C` |
| - | ✓ | ✓ | ✓ | Subtraction | `X = Y - Z` |
| * | ✓ | ✓ | ✓ | Multiplication | `P = Q * R` |
| / | ✓ | ✓ | ✓ | Division | `D = N / 2` |
| ^ | ✓ | ✓ | ✓ | Exponentiation | `E = 2 ^ 3` |
| AND | ✓ | ✓ | ✓ | Logical AND | `IF A>0 AND B<10 THEN...` |
| OR | ✓ | ✓ | ✓ | Logical OR | `IF X=0 OR Y=0 THEN...` |
| NOT | ✓ | ✓ | ✓ | Logical NOT | `IF NOT A THEN...` |
| > | ✓ | ✓ | ✓ | Greater than | `IF X > 10 THEN...` |
| < | ✓ | ✓ | ✓ | Less than | `IF Y < 5 THEN...` |
| = | ✓ | ✓ | ✓ | Equal to | `IF A = B THEN...` |
| & | - | - | ✓ | Bitwise AND | `R = X & Y` |
Notes:
1. Z80 BASIC is the most commonly used version for CP/M systems
2. 6502 BASIC is a Microsoft BASIC variant
3. 6809 BASIC has the most extensive command set but lacks storage commands
4. None of the 6502 and 6809 variants support CSAVE/CLOAD operations
Each example shows the most common usage pattern for the command. Many commands have additional optional parameters or alternate syntaxes not shown in these basic examples.
MiSTer MultiComp
================
Port of Grant Searle's MultiComp to the MiSTer.
Ported by Cyril Venditti and Fred VanEijk.
Updated by S0urceror to use MiSTer image files, use all 4 machine types and have the MiSTer
UART connected to serial interface 2 of the core. The latter allows to use the core remotely.
## Using the MiSTer Serial Terminal/Console
### Connection Methods
1. USB: Connect the console port from the MiSTer FPGA to your computer using a USB cable.
2. Network: Use SSH to connect to the MiSTer FPGA if you have a Wireless or Ethernet connection.
3. USB/Serial cable: For more information see the Serial Port section of the Altair8800_MiSTer repository: <https://github.com/MiSTer-devel/Altair8800_MiSTer>
### Setting Up the Connection
#### For UART/Serial with PuTTY
- Connect at 115200 baud, 8 bits, no parity to the COM port.
#### USB to serial cable connection
##### User Port - extra USB 3.1A style connector on MiSTer
| USB | P7 | Name | PIN | Mister | emu wire |
|---|---|---|---|---|---|
|1 | +5V | +5V|
|2 | 2 | TX | SDA | AH9 | USER_IO[1] |
|3 | 1 |RX | SCL | AG11 | USER_IO[0] |
|4 | GND | GND|
|5 | 8 | DSR | IO10 | AF15 | USER_IO[5]|
|6 | 7 | DTR | IO11 | AG16 | USER_IO[4]|
|7 | 6 | CTS | IO12 | AH11 | USER_IO[3]|
|8 | 5 | RTS | IO13 | AH12 | USER_IO[2]|
|9 | 10 | IO6 | IO8 | AF17 | USER_IO[6]|
|10 | Shield | Shield |
##### FT232 USB to serial cable
|wire |name | mister usb IO port|
|---|---|---|
| Red|5V|N/C|
| Black|GND|GND|
| White|RXD|2|
| Green|TXD|3|
| Yellow|RTS|7|
| Blue|CTS|8|
#### For SSH with PuTTY
- Connect to the ip address of your MiSTer fpga.
#### Linux command line to establish the connection to the core
1. Identify the UART device:
- Usually mapped to `/dev/ttyS1` or `/dev/ttyUSB0`
- Use this command to help identify the correct device:
``` bash
dmesg | grep tty
```
2. Access the serial terminal:
- Use `screen` or `minicom`
- Example command with `screen`:
``` bash
screen /dev/ttyS1 115200
```
- Replace `/dev/ttyS1` with the correct device identifier
- Change 115200 to the appropriate baud rate if different
3. Enable Flow Control:
- Use `stty`
``` bash
stty -F /dev/ttyS1 crtscts
```
- Replace `/dev/ttyS1` with the correct device identifier
- This is done before the screen command
### Additional Information
For more details on console connection, refer to the official MiSTer documentation:
[MiSTer Console Connection Guide](https://MiSTer-devel.github.io/MkDocs_MiSTer/advanced/console/)
## The MiSTer OSD allows the access to four machines
### Z80 CP/M
You can now use both an external SDCard and/or select the image file within MiSTer. Whatever you like.
### Formatting the SD Card and Installing CP/M
Note this procedure has to be performed from a tty terminal as descibed above.
#### Formatting the Drive
1. Load the Intel-HEX dump of the `FORMAT` program into memory by copying the contents of `FORM128.HEX` (for 128MB SD card utilization) into the terminal window.
2. The `FORMAT` program will reside at memory address `$5000` when loaded. To start the formatting process, execute the program by typing `G5000` and pressing ENTER.
3. You will see the following message:
```
CP/M Formatter by G. Searle 2012
```
4. After a few seconds, the formatting process will display:
```
ABCDEFGHIJKLMNOP
Formatting complete
```
Each drive is 8MB, so a 128MB SD card will have drives labeled A: to P:.
#### Installing CP/M
CP/M is installed on the first track of the disk. When booted, the first track is read into memory and executed. To install CP/M, follow these steps:
1. Load the Intel-HEX dump of CP/M by copying the contents of `CPM22.HEX` into the terminal window (this takes about 10 seconds).
2. Load the Intel-HEX dump of the CBIOS by copying the contents of `CBIOS128.HEX` (for 128MB total drive space) into the terminal window (this takes about 3 seconds).
3. Load the Intel-HEX dump of `PUTSYS` by copying the contents of `PUTSYS.HEX` into the terminal window.
The `PUTSYS` program also resides at memory address `$5000`. To transfer CP/M and CBIOS to the disk, execute `PUTSYS` by typing `G5000` and pressing ENTER. You will see:
```
CP/M System Transfer by G. Searle 2012
System transfer complete
```
At this point, CP/M is installed and ready for boot. You can now proceed with installing applications.
#### Boot CP/M from image file
Note that currently the `DOWNLOAD.COM` program is not working reliably (we hope to fix this in the future). To get around the issues with `DOWNLOAD.COM` we have added the cpm image file and some Python based utilities, thus being able to get a working and custamizable CP/M sytem up and running.
In the CPM-sd-image directory, you will find a zip file that contains a cmp.img file that can be copied to the /media/fat/games/MultipComp directory. This file can be used to boot CP/M without the SD card. It contains the structure for disks A thru P with A having the DOWNLOAD program and other utilities available. Use this as a strating point to place CP/M applications on the image. See the Installing Applications section at <http://searle.x10host.com/Multicomp/cpm/fpgaCPM.html#InstallingCPM>.
Note the process for this is mostly described in PART 2 - Using the Windows packager program. The packager program is in windowsApp. Again, this process requires the use of the tty terminal not the console, as you will be pasting the file data into the terminal.
We have also added a zip file in the CPM-sd-image directory with a set of application pre installed. See cpm-apps.zip. This file can also be copied to the /media/fat/games/MultipComp directory and mounted. It contains 5 drives A,C,D,E, and F where A still only has the DOWNLOAD program and the other drives contain the following. The cpm.zip file contains just the basic utilities described in the [CPM-sd-image](CPM-sd-image/README.MD) directory.
| C: | D: | E: | F: |
|-----------------|-------------------|------------------|-----------------|
| 0_FILES.TXT | 0_GAMES | 0_OLDUTILS | 0_NEWUTILS |
| 1_BDS_TINY_C | 1_MUMATHSIMP | 1_F80M80BASIC | 1_ROMS |
| 2_APL | 2_CROSSTALK | 2_AZTEC_C_106D | 2_ZSYSTEM |
| 3_JANUS_ADA15 | 3_QTERM43 | 3_TPASCAL3 | 3_MICROPRO |
| 4_MS_COBOL | 4_CLINK | 4_DXFORTH401 | 4_MULTIPLAN |
| 5_PILOT | 5_SUPERSFTUTIL | 5_PLI14 | 5_DBASEII |
| 6_SYSLIB | 6_RCPM | 6_ALGOLM | 6_DWG_APPS |
| 7_BBC BASIC | 7_DDTZ SOURCES | 7_SUPERCALC | 8_MICROSHELL |
Note the use of user numbers here i.e. 0_, 1_ etc..
(Not all the applications were tested to run, so you are on your own)
The applications were obtained from the Obsolescence Guaranteed site.
Included in the CPM-sd-image directory are also some python scripts to initialize/build the image for the CP/M disks. Along with a script in the transient packages directory that can extract the .COM files from the package (note this was used to provide some content to build the cpm.img file provided in CPM-sd-image directory).
To use the Python scripts we recommend using Visual Studio Code and opening the MultiComp_MiSTer directory as its project location. Them just run the Python scripts from within Visual Studio Code.
__Other useful links.__
For convenience you can use the Multicomp FPGA - CP/M Demo Disk from Obsolescence Guaranteed:
<http://obsolescence.wixsite.com/obsolescence/multicomp-fpga-cpm-demo-disk>
After you have flashed the CP/M Demo Disk to the SD Card you will have to use the secondary SD Card on the MiSTer on the I/O Board:
<https://github.com/MiSTer-devel/Wiki_MiSTer/wiki/IO-Board>
Using CP/M - from Grant Searle website:
<http://searle.x10host.com/Multicomp/cpm/fpgaCPM.html>
DeRamp - This website focuses on early personal computers from the mid 70s into the early 80s. Here you'll find resources for restoring and maintaining many of the great computers and peripherals from this era, in addition it has a Downloads section where you can find the bits for many applications. <https://deramp.com/>
### Z80 Basic
SGN, INT, ABS ,USR, FRE, INP, POS, SQR, RND ,LOG, EXP, COS, SIN, TAN, ATN, PEEK ,DEEK ,LEN, STR$, VAL ,ASC, CHR$ ,LEFT$,
RIGHT$, MID$, END, FOR, NEXT, DATA, INPUT, DIM, READ, LET, GOTO, RUN, IF, RESTORE, GOSUB, RETURN, REM, STOP, OUT, ON,
NULL, WAIT, DEF, POKE, DOKE, LINES, CLS, WIDTH, MONITOR, PRINT, CONT, LIST, CLEAR, NEW, TAB, TO, FN, SPC, THEN, NOT,
STEP, +, -, *, /, ^, AND, OR, >, <, =
PLUS additional implementations here (making it version 4.7b):
HEX$(nn) - convert a SIGNED integer (-32768 to +32767) to a string containing the hex value
BIN$(nn) - convert a SIGNED integer (-32768 to +32767) to a string containing the binary value
&Hnn - interpret the value after the &H as a HEX value (signed 16 bit)
&Bnn - interpret the value after the &B as a BINARY value (signed 16 bit)
### 6502 Basic - No SD card support (No CSAVE/CLOAD)
END, FOR, NEXT, DATA, INPUT, DIM, READ, LET, GOTO, RUN, IF, RESTORE, GOSUB, RETURN, REM, STOP, ON, NULL, WAIT, DEF, POKE, PRINT,
CONT, LIST, CLEAR, NEW, TAB(, TO, FN, SPC(, THEN, NOT, STEP, SGN, INT, ABS, USR, FRE, POS, SQR, RND, LOG, EXP, COS, SIN, TAN, ATN,
PEEK, LEN, STR$, VAL, ASC, CHR$, LEFT$, RIGHT$, MID$, +, -, *, /, ^, AND, OR, >, +, <
### 6809 Basic - No SD card support(No CSAVE/CLOAD)
FOR, GO, REM, ELSE, IF, DATA, PRINT, ON GOSUB, ON GOTO, INPUT, LINE INPUT, END, NEXT, DIM, READ, RUN, RESTORE, RETURN, STOP, POKE,
CONT, LIST, CLEAR, NEW, EXEC, TAB, TO, SUB, THEN, NOT, STEP, +, -, *, /, ^, AND, OR, >, =, <, DEL, DEF, LET, RENUM, FN, &, &H, TRON,
TROFF, EDIT, SGN, INT, ABS, USR, RND, SIN, PEEK, LEN, STR$, VAL, ASC, CHR$, LEFT$, RIGHT$, MID$, INKEY$, MEM, ATN, COS, TAN, EXP, FIX,
LOG, SQR, HEX$, VARPTR, INSTR, STRING$, MID$ (MODIFICATION), POS
<http://searle.x10host.com/Multicomp/#BASICKeywords>
# MultiComp OSD Configuration
This section describes the On-Screen Display menu configuration for the MultiComp system, providing control over CPU selection, storage, and communication parameters.
## Menu Structure
### System Control
- __Mount *.IMG__: Provide the image in the games/Multicomp directory
- __Reset after Mount__: Configures system behavior after mounting storage - Options: No, Yes
- __Reset__: System reset function
### CPU and ROM Configuration
- __CPU-ROM Selection__:
- Z80 with CP/M
- Z80 with BASIC
- 6502 with BASIC
- 6809 with BASIC
### Communication Settings
- __Baud Rate__:
- 115200
- 38400
- 19200
- 9600
- 4800
- 2400
- __Serial Port__:
- Console Port - use the MiSTer console port
- User IO Port - use the MiSTer user I/O USB 3.1 port
- __Flow Control__:
- None - no hardware flow control
- RTS/CTS - enable hardware flow control using RTS/CTS signals
### Storage Configuration
- __Storage Controller__:
- SD Controller - select the secondary SD card as storage
- Image Controller - select this to access the cpm image from the games/Multicomp directory
- __Storage Images__: Allows mounting disk images (.IMG files)
### Additional Information
The OSD includes version information and build date tracking. This configuration interface provides comprehensive control over the MultiComp's core functionality, allowing users to switch between different CPU architectures, operating systems, and I/O configurations.
The menu system is designed for straightforward navigation and configuration of the MultiComp's essential features, making it accessible for both basic setup and advanced customization needs.
## Troubleshooting
### Serial Communication Issues
- Only the Z80 supports the external uart at this time
- If no response when typing:
- Verify correct baud rate is selected
- Check that the correct serial port is selected (Console vs User IO)
- Try enabling/disabling flow control
- For User IO port, verify cable connections match pinout documentation
### Storage Issues
- If unable to access CP/M:
- When using SD Controller, verify SD card is properly formatted
- When using Image Controller, ensure .IMG file is in the correct directory (/media/fat/games/MultiComp)
- Try toggling "Reset after Mount" option
### System Stability
- 6809 Basic had known reset issues (inherited from original design) the core was actually being reset but only a warm reset, now it supports a cold or warm reset with a prompt
- If system becomes unresponsive:
- Use OSD Reset function
- Try power cycling the MiSTer
- Verify correct CPU-ROM selection for your intended use
### Known Limitations
- If the DOWNLOAD\.COM program has reliability issues in CP/M use a slower baud rate, we have had some sucess at 2400 and 9600 baud, 115200 baud seems to consistantly drop characters even with flow control enabled
- 6502 and 6809 Basic variants do not support SD card operations (no CSAVE/CLOAD)\
### License
__Software and VHDL project download link__
By downloading these files you must agree to the following: The original
copyright owners of ROM contents are respectfully acknowledged. Use of the
contents of any file within your own projects is permitted freely, but any
publishing of material containing whole or part of any file distributed
here, or derived from the work that I have done here will contain an
acknowledgment back to myself, Grant Searle, and a link back to this page.
Any file published or distributed that contains all or part of any file
arom this page must be made available free of charge.
### Original Author
Grant Searle
### URL
[Grant's MULTICOMP pick and mix computer](http://searle.x10host.com/Multicomp/)
# MiSTer MultiComp BASIC Keywords Reference
## Keywords by Category
### Mathematical Functions
| Keyword | Z80 | 6502 | 6809 | Description | Usage Example |
|---------|-----|------|------|-------------|---------------|
| ABS | ✓ | ✓ | ✓ | Returns absolute value | `X = ABS(-5)` |
| ATN | ✓ | ✓ | ✓ | Returns arctangent | `A = ATN(1)` |
| COS | ✓ | ✓ | ✓ | Returns cosine | `C = COS(3.14159/2)` |
| EXP | | | ✓ | Returns e raised to power | `E = EXP(2)` |
| FIX | - | - | ✓ | Truncates decimal portion | `F = FIX(3.7)` |
| INT | ✓ | ✓ | ✓ | Returns integer portion | `I = INT(5.7)` |
| LOG | ✓ | ✓ | ✓ | Returns natural logarithm | `L = LOG(100)` |
| SGN | ✓ | ✓ | ✓ | Returns sign of number (-1,0,1) | `S = SGN(-42)` |
| SIN | ✓ | ✓ | ✓ | Returns sine | `S = SIN(3.14159/2)` |
| SQR | ✓ | ✓ | ✓ | Returns square root | `R = SQR(16)` |
| TAN | ✓ | ✓ | ✓ | Returns tangent | `T = TAN(0.785)` |
### String Functions
| Keyword | Z80 | 6502 | 6809 | Description | Usage Example |
|---------|-----|------|------|-------------|---------------|
| ASC | ✓ | ✓ | ✓ | Returns ASCII value of character | `A = ASC("A")` |
| CHR$ | | | ✓ | Returns character for ASCII value | `C$ = CHR$(65)` |
| INSTR | - | - | ✓ | Searches for substring | `I = INSTR(A$, "FIND")` |
| LEFT$ | ✓ | ✓ | ✓ | Returns leftmost characters | `L$ = LEFT$("HELLO", 2)` |
| LEN | ✓ | ✓ | ✓ | Returns string length | `L = LEN("TEST")` |
| MID$ | ✓ | ✓ | ✓ | Returns substring | `M$ = MID$("HELLO", 2, 2)` |
| RIGHT$ | ✓ | ✓ | ✓ | Returns rightmost characters | `R$ = RIGHT$("WORLD", 3)` |
| STR$ | | | ✓ | Converts number to string | `S$ = STR$(123)` |
| STRING$ | - | - | ✓ | Creates string of repeated characters | `S$ = STRING$(5, "*")` |
| VAL | ✓ | ✓ | ✓ | Converts string to number | `V = VAL("123")` |
### Program Control
| Keyword | Z80 | 6502 | 6809 | Description | Usage Example |
|---------|-----|------|------|-------------|---------------|
| CONT | ✓ | ✓ | ✓ | Continues program execution | `CONT` |
| END | ✓ | ✓ | ✓ | Ends program | `END` |
| FOR/NEXT | ✓ | ✓ | ✓ | Loop structure | `FOR I=1 TO 10 : PRINT I : NEXT I` |
| GOSUB | ✓ | ✓ | ✓ | Calls subroutine | `GOSUB 1000` |
| GOTO | ✓ | ✓ | ✓ | Jumps to line number | `GOTO 100` |
| IF/THEN | | | ✓ | Conditional execution | `IF X=5 THEN PRINT "YES"` |
| ON GOSUB | - | - | ✓ | Multiple branch subroutine | `ON X GOSUB 100,200,300` |
| ON GOTO | - | - | ✓ | Multiple branch jump | `ON X GOTO 100,200,300` |
| RETURN | ✓ | ✓ | ✓ | Returns from subroutine | `RETURN` |
| STOP | ✓ | ✓ | ✓ | Halts program execution | `STOP` |
### Data and Variables
| Keyword | Z80 | 6502 | 6809 | Description | Usage Example |
|---------|-----|------|------|-------------|---------------|
| DATA | ✓ | ✓ | ✓ | Stores program data | `DATA 100,200,"TEXT"` |
| DEF FN | ✓ | ✓ | ✓ | Defines function | `DEF FNA(X)=X*X+2` |
| DIM | ✓ | ✓ | ✓ | Declares array dimensions | `DIM A(10),B$(20)` |
| INPUT | ✓ | ✓ | ✓ | Accepts user input | `INPUT "Name?";N$` |
| LET | | | ✓ | Assigns variable value | `LET A=5` or `A=5` |
| LINE INPUT | - | - | ✓ | Inputs entire line | `LINE INPUT "Text?";A$` |
| READ | ✓ | ✓ | ✓ | Reads DATA values | `READ A,B,C$` |
| RESTORE | ✓ | ✓ | ✓ | Resets DATA pointer | `RESTORE` |
### System and Memory
| Keyword | Z80 | 6502 | 6809 | Description | Usage Example |
|---------|-----|------|------|-------------|---------------|
| DEEK | ✓ | - | - | Reads word from memory | `D = DEEK(16384)` |
| DOKE | ✓ | - | - | Writes word to memory | `DOKE 16384,12345` |
| FRE | ✓ | ✓ | - | Returns free memory | `F = FRE(0)` |
| INP | ✓ | - | - | Reads from I/O port | `I = INP(255)` |
| MEM | - | - | ✓ | Returns memory size | `M = MEM` |
| OUT | ✓ | - | - | Writes to I/O port | `OUT 255,10` |
| PEEK | ✓ | ✓ | ✓ | Reads byte from memory | `P = PEEK(16384)` |
| POKE | ✓ | ✓ | ✓ | Writes byte to memory | `POKE 16384,255` |
| USR | | | ✓ | Calls machine language routine | `U = USR(32768)` |
| VARPTR | - | - | ✓ | Returns variable address | `V = VARPTR(A)` |
### Program Editing
| Keyword | Z80 | 6502 | 6809 | Description | Usage Example |
|---------|-----|------|------|-------------|---------------|
| CLEAR | ✓ | | | Clears variables | `CLEAR` |
| CLS | ✓ | - | - | Clears screen | `CLS` |
| DEL | - | - | ✓ | Deletes program lines | `DEL 100-200` |
| EDIT | - | - | ✓ | Edits program line | `EDIT 100` |
| LIST | ✓ | ✓ | ✓ | Lists program | `LIST` or `LIST 100-200` |
| NEW | | | ✓ | Clears program | `NEW` |
| RENUM | - | - | ✓ | Renumbers program lines | `RENUM 100,10` |
| RUN | | | ✓ | Executes program | `RUN` or `RUN 100` |
| TRON/TROFF | - | - | ✓ | Trace mode on/off | `TRON` or `TROFF` |
### Z80 BASIC Specific Extensions (v4.7b)
| Keyword | Description | Usage Example |
|---------|-------------|---------------|
| HEX$(nn) | Converts signed integer to hex string | `H$ = HEX$(255)` |
| BIN$(nn) | Converts signed integer to binary string | `B$ = BIN$(15)` |
| &Hnn | Interprets nn as hexadecimal value | `X = &H1F` |
| &Bnn | Interprets nn as binary value | `Y = &B1010` |
### Operators
| Operator | Z80 | 6502 | 6809 | Description | Usage Example |
|----------|-----|------|------|-------------|---------------|
| + | ✓ | ✓ | ✓ | Addition | `A = B + C` |
| - | ✓ | ✓ | ✓ | Subtraction | `X = Y - Z` |
| * | ✓ | ✓ | ✓ | Multiplication | `P = Q * R` |
| / | ✓ | ✓ | ✓ | Division | `D = N / 2` |
| ^ | ✓ | ✓ | ✓ | Exponentiation | `E = 2 ^ 3` |
| AND | ✓ | ✓ | ✓ | Logical AND | `IF A>0 AND B<10 THEN...` |
| OR | ✓ | ✓ | ✓ | Logical OR | `IF X=0 OR Y=0 THEN...` |
| NOT | ✓ | ✓ | ✓ | Logical NOT | `IF NOT A THEN...` |
| > | ✓ | ✓ | ✓ | Greater than | `IF X > 10 THEN...` |
| < | ✓ | ✓ | ✓ | Less than | `IF Y < 5 THEN...` |
| = | | | ✓ | Equal to | `IF A = B THEN...` |
| & | - | - | ✓ | Bitwise AND | `R = X & Y` |
Notes:
1. Z80 BASIC is the most commonly used version for CP/M systems
2. 6502 BASIC is a Microsoft BASIC variant
3. 6809 BASIC has the most extensive command set but lacks storage commands
4. None of the 6502 and 6809 variants support CSAVE/CLOAD operations
Each example shows the most common usage pattern for the command. Many commands have additional optional parameters or alternate syntaxes not shown in these basic examples.

259
ROMS/6809/BASIC.S19 Normal file
View File

@@ -0,0 +1,259 @@
S10A007C0C8426020C83B67C
S10600857EE20212
S123E0008D0327FC39B6FFD085012706B6FFD1847F394F398D263402810D270DB7FFD10C50
S123E0207996799178251220100F798D0F860DB7FFD18D08860AB7FFD13502393402B6FF9F
S123E040D0850227F935023910CE01EE860CBDE0148EE157A6802705BDE01420F7B6FFD060
S123E060850127F9B6FFD1847F8143271481572706966E8155260A9E6FA684811226026EFF
S123E080848E02186F83300126FA8E02176F809F19A60243A702A10226063001630120F1B6
S123E0A09F719F279F233089FF389F211F148EE0F5CE0076C612BDE1F1CE00A7C604BDE1F6
S123E0C0F1863997F0BDE4FD8E00B59F8DCEEC11C60AEF815A26FB8695B7FFD08EE12ABD7B
S123E0E0F1258EE0ED9F6F8655976E200412BDE5177EE4653B1040FF00EC110C8426020CBC
S123E10083B600007EE2027EE2017EE0F47EEC11804FC7525932E260E36D1DE300E211003A
S123E12000000000000000000000003638303920455854454E4445442042415349430D28DC
S123E14043292031393832204259204D4943524F534F46540D0D00434F4C44204F52205756
S123E16041524D2053544152542028432F57293F200D0034169E76DC789F6AD76C976D3530
S123E180960F738E00F4C601BDE000810826075A27EF301F20348115260A5A27E48608BD3E
S123E1A0E01420F681031A012705810D260D4F3401BDF0E56F848E00F33581812025C98175
S123E1C07B24C5C1FA24C1A7805CBDE01420B92705BDEF049F7A6E9F007A7EE5E696732636
S123E1E003BDE0050F73975310260C6A97567EEE62A680A7C05A26F939399D8227FB7EEA82
S123E200433B813A240A812026020E7C803080D039F403F477F41C00ADF6A8F6FDEF17EE63
S123E22048ECC4EEDDEE67EE53F7ADF775F77EF8EFF921F843FAA9F87DFF7BEE72EE8FEE63
S123E24096E1DDECB5FAB1FB71FB4179F14E79F1457BF2557BF31A7FF88650EA9C46EA9B23
S123E260464FD247CF5245CDA7454C53C549C6444154C15052494ED44FCE494E5055D44541
S123E2804EC44E4558D44449CD524541C45255CE524553544F52C55245545552CE53544F44
S123E2A0D0504F4BC5434F4ED44C4953D4434C4541D24E45D7455845C354524FCE54524FBD
S123E2C046C64445CC4445C64C494EC552454E55CD454449D4544142A854CF5355C254488D
S123E2E045CE4E4FD4535445D04F46C6ABADAAAFDE414EC44FD2BEBDBC46CE5553494EC72B
S123E3005347CE494ED44142D35553D2524EC45349CE504545CB4C45CE535452A45641CC84
S123E3204153C3434852A44154CE434FD35441CE4558D04649D84C4FC7504FD35351D24870
S123E3404558A44C454654A45249474854A44D4944A4494E4B4559A44D45CD5641525054F9
S123E360D2494E5354D2535452494E47A4E52BE676E6D3E6D3E6D3E704E6D0F0ADE732E767
S123E380DFE5FDE8C4EB15E819E66BE5DFE6B0E601EF1EE626EF25E637E4FBE1CFFAA4FA08
S123E3A0A5FD20FC64FFBFFDAAF9304E46534E52474F4446434F564F4D554C425344442F91
S123E3C0304944544D4F534C535354434E4644414F444E494F464D4E4F4945445355464EE0
S123E3E045204552524F520020494E20000D4F4B0D000D425245414B003064C6129F0FA66D
S123E4008480802615AE019F119E3B27099C1127099E0F3A20E59E119F3B9E0F4D398D17A8
S123E420DE4133419E433001A68236029C4726F8DF45394F58D31FC3003A250810DF17109C
S123E440931725EEC60CBDE517BDF0E9BDF1388EE3AB3A8D318D2F8EE3E0BDF12596684CB6
S123E4602703BDF54EBDF0E98EE3EDBDF125BDE181CEFFFFDF6825F69F839D7C27F0250BD8
S123E480BDEFDA7EE5B4A6807EF13ABDE7579E2B9FF1BDEFDAD7038D4C2512DC47A384D32B
S123E4A01BDD1BEE843702A7809C1B26F896F3271CDC1BDD43DB038900DD41BDE41ECE00A9
S123E4C0EF3702A7809C4526F89E419F1B8D368D02209B9E19EC8427213304A6C026FCEF27
S123E4E084AE8420F0DC2B9E19EE84270910A3022306AE8420F31A019F473926FB9E196F4E
S123E500806F809F1B9E19BDE6AB9E279F23BDE5DF9E1B9F1D9F1F8E00C99F0BAEE410DE0D
S123E520216FE20F2D0F2E0F086E8486809708BDE779BDE3F9326226049E0F3285C609BDDA
S123E540E433BDE6D8DC683416C6A0BDEA3BBDE90FBDE90DD654CA7FD450D750108EE56343
S123E5607EE9B68EF24EBDF39D9D8281A426059D7CBDE90DBDF3F6BDE9B2DC3B34068680CF
S123E58034021CAF8D609E839F2FA6802707813A27227EEA43A68197002772EC80DD689FF0
S123E5A083968C270F865BBDE0149668BDF555865DBDE0149D7C8D0220C827294D102A01E9
S123E5C0B881FF270F819E22C9BEE118481F893A9D7C6E949D7C8197102714ED7EEA439E11
S123E5E019301F9F3339BDE005270A8103271281132703977339BDE00527FB20EE9D822002
S123E600021A0126319E839F2F060032629E688CFFFF27069F299E2F9F2D8EE3F10D00105C
S123E6202AFE427EE45A260EC6209E2D1027FE169F839E299F6839272CBDEBAD34069E27B0
S123E6409D82270CBDEA39BDEF04301F9C7122181F10A3E125121F0383003A250B931B2572
S123E66007DF219F277EE50A7EE4449D821027FE94BDE50A20191F899D7CC1A02716C1A128
S123E6802645C603BDE433DE839E6886A134528D037EE5829D82BDE7578D403001DC2B10B6
S123E6A0936822029E19BDE4E92517301F9F833926FD86FF973BBDE3F91F148121270BC630
S123E6C0048CC60E7EE4467EEA4335529F68DF838D068C8D069F8339C63A865FD7015F9EC8
S123E6E0831F98D6019701A68427EC3404A1E027E63001812227EA4C26023001818626E7CC
S123E7000C0420E3BDE90D9D8281812705C6A2BDEA3B964F26130F048DB64D27BA9D7C815C
S123E7208426F50A042AF19D7C9D821025FF657EE5BABDEED2C681BDEA3B340281A12704F6
S123E74081A026830A53260535047EE6789D7C8D06812C27EF35849E749F2B24618030977E
S123E76001DC2B811822DB58495849D32B5849DB018900DD2B9D7C20E2BDEB1E9F3BC6AE7A
S123E780BDEA3B96063402BDE922350246BDE91410270C289E52DC2110A30224119C1B25A4
S123E7A00DE684BDECD49E4DBDEE0A8E00569F4DBDEE3CDE4D9E3B3726A78410AF02393F45
S123E7C05245444F0D007EE446960927079E319F687EEA438EE7BEBDF1259E2F9F8339C614
S123E7E0169E68300127DF8D01398122260BBDEA10C63BBDEA3BBDF1288E00F36F848D06B0
S123E800C62CE7842016BDF138BDF135BDE181240532647EE609C62E399E33864F97099F3B
S123E82035BDEB1E9F3B9E839F2B9E35A684260996092651BDF1388DCD9F839D7CD6062754
S123E840239E8397018122270E301F4F9701BDE173863A9701862C9702BDECE5BDEA15BD0F
S123E860E7942006BDF49BBDF3BC9D822706812C1026FF529E839F359E2B9F839D82272174
S123E880BDEA39209C9F83BDE6D830014D260AC606EE812741EC81DD31A684818626E62012
S123E8A0989E35D6091026FD3AA68427068EE8B37EF125393F45585452412049474E4F52EE
S123E8C045440D0026049E742003BDEB1E9F3BBDE3F92704C60020471F143003BDF39DA655
S123E8E06897549E3BBDF14BBDF3BC3069BDF41FE068270CAE6E9F68AEE8109F837EE582CF
S123E90032E8129D82812C26F49D7C8DBD8D131CFE7D1A010D0625032A998C2B96C6187E85
S123E920E4468D6E4F8C34043402C601BDE433BDE9EF0F3F9D8280AD25138103240F81012A
S123E94049983F913F2564973F9D7C20E9D63F26331024006B8B072467990610270477893E
S123E960FF340248ABE08EE24B30863502A18424558D9C34028D299E3D3502261D4D102757
S123E980006A204B0806598D098EE997D73F0F0620D99E837EE6AB64EABBA184243120D3C9
S123E9A0EC0134068D08D63F16FF7B7EEA43D654A68435203404D64F9E50DE5234546EA489
S123E9C09E74A6E0272681642703BDE90F9F3D3504815A2719817D271554D70A3552975C71
S123E9E09F5DDF5F3504D761D854D762D64F39BDFC390F069D7C24037EF49BBDEB692450CC
S123EA00812E27F481A7274081A627E38122260A9E83BDECDF9E649F833981A3260D865A58
S123EA20BDE926BDEBB443537EECBB4C272E8D06BDE922C6298CC6288CC62CE19F008326E3
S123EA40020E7CC6027EE446867DBDE9267EF672BDEB1E9F52960626957EF39D9D7C1F8924
S123EA60589D7CC13823037EEA433404C12A251EC130241C8DC0A6E4BDE9228DBCBDE91220
S123EA803502DE523442BDEED2350234068E8D9E3504BEE11D3AAD947EE90F864F9703BDDC
S123EAA0EBB4DD01BDF3D3BDEBB40D0326069401D40220049A01DA027EECBBBDE91426109F
S123EAC096618A7F945D975D8E005CBDF41F20360F060A3FBDEE1ED7569F589E5FBDEE202A
S123EAE096563404A0E0270786012403D656409754DE585C5A2604D654200BA680A1C02722
S123EB00F3C6FF240150CB0159D40A2702C6FF7EF405BDEA39C6018D089D8226F5395F9DB1
S123EB2082D70597379D828D401025FF165FD7069D7C25048D33250A1F899D7C25FC8D296A
S123EB4024F8812426060306CB809D7CD7389A088028102700750F089E1BDC379C1D27127D
S123EB6010A381273E300520F381412504805B80A5398E0074EEE41183EA532728DC1FDDC0
S123EB8043C30007DD419E1D9F47BDE41E9E419F1F9E459F1D9E47DC37ED814F5FED84ED38
S123EBA002A7049F393990800000009D7CBDE90D96542B5DBDE90F964F819025088EEBA64E
S123EBC0BDF41F264CBDF451DC5239DC053406125F9E3734148DD435349F37DE5234605C1D
S123EBE09D82812C27EBD703BDEA333506DD059E1D9C1F2721DC3710A3842706EC02308B84
S123EC0020EFC6129605260BD603E1042759C6108CC6087EE446CC0005DD64DC37ED84D6BB
S123EC2003E704BDE4339F41C60B4F0D0527053506C30001ED058D5DDD6430020A0326E867
S123EC409F0FD30F1025F7FC1F01BDE437830035DD1F4F301FA7059C0F26F89E41961F9312
S123EC6041ED029605262DE604D7034F5FDD643506DD5210A305243ADE6427048D17D35209
S123EC8030020A0326E7EDE358495849E3E1308B30059F393986109745EC05DD174F5F58F0
S123ECA049250F086509642404D31725050A4526EE397EEC0E1F40931F214F0F06DD50C620
S123ECC0907EF40BBDE90FCE01F0BDF56532628E01EF200B9F4D8D5C9F58D75639301F8654
S123ECE0229701970230019F629F58C6FF5CA680270C91012704910226F381222702301F96
S123ED009F64D756DE62118301F022078DC69E62BDEE0C9E0B8C00F12605C61E7EE4469654
S123ED2056A700DC58ED0286FF97069F0D9F5230059F0B390F074F3406DC23A3E0109321F3
S123ED40250ADD239E2330019F253584C61A030727CA8D04350420DE9E279F234F5FDD4B11
S123ED609E219F478E00C99C0B27048D3220F89E1B9C1D27048D2220F89F419E419C1F27E5
S123ED8035EC02D341DD41A6012AF0E60458CB053A9C4127E88D0820F8A60130022A14E677
S123EDA0842710EC02109323220910934723049F4BDD473005399E4B27FB4FE6845AD347F0
S123EDC0DD439E239F41BDE4209E4BDC45ED029E45301F7EED5ADC523406BDE9EFBDE91208
S123EDE035109F62E6849E52EB842405C61C7EE446BDECD49E62E6848D109E4D8D228D0C96
S123EE009E628D1CBDED137EE934AE02DE255C2004A680A7C05A26F9DF2539BDE9129E52CF
S123EE20E6848D182613AE07301F9C2326083404D323DD233504300139AE02399C0D260705
S123EE409F0B301B9F0D4F398D037EECBA8DCC0F065D39BDEED5C601BDED349653BDECD83E
S123EE60A78432627EED138D0220DF8DE0275EE684398D484FE1842303E6844F3406BDECE3
S123EE80D69E4D8D9B35043A3504BDEE0C20D58D2BA0844020DFC6FFD7539D82812927052E
S123EEA0BDEA398D2D8D1527245F4AA18424CD1F89E08450D15323C4D65320C0BDEA33EED0
S123EEC0E4AE659F4DA664E66432671F357EEC119D7CBDE90DBDEBB04D26F20E82BDEE4D7E
S123EEE0102702DEDE839F833AA68434526F849D82BDF49B3552A784DF83398D079F2BBDC4
S123EF00EA3920CEBDE90D96542BC2964F819022BCBDF4519E52398DEEE6847EECBA8DDBE2
S123EF209E2BE784393401BDE757BDE4E59F66350127129D82271381A726099D7C2706BD83
S123EF40E757270639CEFFFFDF2B32629E66BDF0E9BDE1DAEC8426037EE4659F66EC02102A
S123EF60932B22F4BDF555BDF1359E668D10AE9F0066CE00F4A6C027D5BDF13A20F7300424
S123EF80108E00F4A68027512B15813A260DE684C18427F0C18327EC8C86218D3020E5CE2F
S123EFA0E10B81FF2604A6803345847F334A6DC427E7A0C42AF6ABC4EE414A2B066DC02A66
S123EFC0FC20F7A6C48D066DC02AF820B7108C01ED2406847FA7A06FA4399E83CE00F30FBC
S123EFE0430F44A68027210D43270FBDEB69241881302504813923100F438120270A974272
S123F000812227380D442719A7C02706813A27CF20D16FC06FC01F308300F18E00F29F8360
S123F02039813F2604868720DF81272613CC3A83EDC10F42A68027D0914227CCA7C020F4D6
S123F04081302504813C25C0301F34500F41CEE10B0F42334AA6C4273110AE41AEE4E6A0AC
S123F060E08027FAC180263832623540DA4296412606C1842606863AEDC12094E7C0C186C3
S123F08026020C44C18227AA2086CEE110034126C03550A680A7C0BDEB6925EC034320E8CF
S123F0A00C424A27AE313FE6A02AFC20AF27368D0139273E819F2753812C2737813B276083
S123F0C0BDE922960634022606BDF562BDECDD8D573504BDE1735D26089D82812C27148D7F
S123F0E0549D8226CF860D2051BDE17327F7966C26F339BDE173270AD66CD16B25068DE5C0
S123F100201ED66CD06A24FC502010BDEED081291026F92FBDE173D06C23058D185A26FB79
S123F1209D7C7EF0B2BDECDFBDEE1E5C5A27C3A6808D0720F786208C863F7EE0148EF6499A
S123F1402009BDF2B8035403622003BDF2B85D102702808E005C1F895D276CD04F27692569
S123F1600A974F966197548E004F50C1F82F594F6401BDF243D6622A0B63016302630363A6
S123F1800443890097639653996097539652995F97529651995E97519650995D97505D2AFC
S123F1A04425028D5D5F9650262E965197509652975196539752966397530F63CB08C128DC
S123F1C02DE44F974F9754398D6D5F20A85C086309530952095109502AF3964F3404A0E0B5
S123F1E0974F23DE8C2508086386009763200C0C4F2728065006510652065324048D0D2763
S123F200EE39035403500351035203539E5230019F5226069E5030019F5039C60A7EE4461D
S123F2208E0012A6049763A603A704A602A703A601A702965BA701CB082FE89663C0082725
S123F2400C6701660266036604465C26F43981000000008D6327608D788600971397149797
S123F260159716D6538D22D663D78BD6528D1AD663D78AD6518D12D663D789D6508D0CD6F8
S123F28063D788BDF3947EF1A52795439613562726241696169B6097169615995F97159692
S123F2A014995E97149613995D46971306140615061606634F20D539EC0197618A80DD5DA5
S123F2C0D661D854D762EC03DD5FA684975CD64F394D27169B4F464928108B80974F270C89
S123F2E0966297543996544320023262102AFED27EF21BBDF3E8270D8B0225F40F62BDF1E5
S123F300560C4F27EB398420000000BDF3E88EF3065FD762BDF39D8C8D9E2773004F8DB167
S123F3200C4F27CC8E0013C604D703C6019650915D26139651915E260D9652915F260796BE
S123F3405391602601431FA859240AE7800A032B34272EC6011F8A250E0860095F095E09A2
S123F3605D25E32BC820DF966090539760965F9252975F965E9251975E965D9250975D20DE
S123F380D8C64020D0565656D7638D087EF1A5C6147EE4469E139F509E159F52393402EC95
S123F3A00197548A80DD500F63E684AE039F52D74F35828E004520068E00408C9E3B964FBA
S123F3C0A78496548A7F9450A7019651A702DE52EF0339966197549E5C9F4F0F63965E97CD
S123F3E05196549E5F9F5239DC4FDD5C9E519F5E9E539F604D39D64F2708D65459C6FF2520
S123F4000150398DF1D7500F51C68896508080D74FDC74DD52976397547EF1A10F5439E609
S123F4208427D3E601D8542BD1D64FE184261DE601CA7FD450E1012613D651E102260DD6EC
S123F44052E1032607D653E00426013956D85420ABD64F273DC0A096542A05035BBDF20478
S123F4608E004FC1F82E06BDF2370F5B390F5B96544906507EF243D64FC1A0241D8DD2D792
S123F480639654D754808086A0974F965397017EF1A1D750D751D752D753399E749F549FD4
S123F4A04F9F519F529F479F452564BDFBD8812D260403552004812B26049D7C2551812ECD
S123F4C02728814526289D7C256481A7270E812D270A81A62708812B2704200603489D7C30
S123F4E0254C0D48270800472004034626CC96479045974727122A09BDF30B0C4726F92024
S123F50007BDF2F30A4726F996552A8E7EF672D645D046D7453402BDF2F33504C0308D0268
S123F5202098BDF3B8BDF4058E00407EF14BD6475858DB475880303404ABE09747209F9B77
S123F5403EBC1FFD9E6E6B27FD9E6E6B28008EE3E78D0CDC68DD50C69043BDF40F8D037E8E
S123F560F125CE01F18620D6542A02862DA7C0DF6497548630D64F102700C64FC1802208DB
S123F5808EF549BDF25386F797458EF544BDF4292E0F8EF53FBDF4292E0EBDF2F30A452079
S123F5A0F1BDF30B0C4520E2BDF13DBDF451C60196458B0A2B09810B24054A1F8986024A77
S123F5C04A9747D7452E0DDE64862EA7C05D27048630A7C08EF64EC6809653AB0397539677
S123F5E052A90297529651A90197519650A98497505C565928E32403C00B50CB2F30041F09
S123F60098847FA7C00A452604862EA7C053C4808CF67226C4A6C2813027FA812E26023397
S123F6205F862BD647271C2A03862D50A7428645A741862F4CC00A24FBCB3AED436F452097
S123F64004A7C46F418E01F1398000000000FA0A1F0000989680FFF0BDC0000186A0FFFFEC
S123F660D8F0000003E8FFFFFF9C0000000AFFFFFFFF964F27020354399F64BDF3B88D0599
S123F6808D088E00407EF2539F64BDF3B39E64E680D7559F648DEE9E6430059F64BDF14B95
S123F6A08E00450A5526EE39BDF3F62B1F27158D10BDF3B88D0E8E00408DCA8EF24EBDF15A
S123F6C04B7EF4779EB19F509EB39F52BEF6F99F5DBEF6FB9F5FBDF259DC8AC3658BDDB36B
S123F6E0DD52DC88C9B08905DDB1DD500F548680974F961597637EF1A540E64DABBDF3E8F3
S123F7008EF742D661BDF312BDF3E88DB40F62965CD64FBDF1458EF747BDF14296543402F5
S123F7202A09BDF13D96542B05030ABDF6728EF747BDF14B35024D2A03BDF6728EF74C7E71
S123F740F67983490FDAA27F000000000584E61A2D1B862807FBF88799688901872335DF17
S123F760E186A55DE72883490FDAA2A154468F138F524389CD8EF7A8BDF14B7EF6FDBDF318
S123F780B80F0A8DF68E004ABDF3BE8E0040BDF39D0F54960A8D0C0D4F1027FA7E8E004A31
S123F7A07EF31834027EF72B81490FDAA2965434022A028D24964F3402818125058EF24E7F
S123F7C08DDE8EF7DDBDF6793502818125068EF7A8BDF14235024D2A037EF672390B76B3A7
S123F7E083BDD3791EF4A6F57B83FCB0107C0C1F67CA7CDE53CBC17D1464704C7DB7EA51E1
S123F8007A7D6330887E7E9244993A7E4CCC91C77FAAAAAA138100000000037F5E56CB79B4
S123F82080139B0B6480763893168238AA3B20803504F334813504F334808000000080311F
S123F8407217F8BDF3F6102FF3C78EF82F964F808034028680974FBDF14B8EF834BDF3184D
S123F8608EF24EBDF1428EF81ABDF6798EF839BDF14B3504BDF5228EF83E7EF253BDF3E816
S123F8808EF649BDF39D27674D26037EF1C38E004ABDF3BE5F96612A10BDF4778E004A96A8
S123F8A061BDF429260343D601BDF3D53404BDF8438E004ABDF2538D363502461025FDB213
S123F8C0398138AA3B29077134583E5674167EB31B772FEEE3857A1D841C2A7C6359580ABF
S123F8E07E75FDE7C6803172181081000000008EF8C1BDF253BDF3B8964F818825037EF264
S123F900E5BDF47796018B8127F44A34028E0040BDF1428EF8C6BDF6880F623502BDF2D12B
S123F92039BDF3F62B037EF47703548DF97EF672BDFD5E326286019798BDE4E51025ED827E
S123F940BDEF7E1F208300F5D797DC2BBDF555BDF1358E00F4D69826255FBDFA84BDFFB61C
S123F960250B80303402860A3DEBE020EDC001C90181412605BDF0E520BB814C260B8D3127
S123F9800F98BDF0E520C33262810D260D8D22BDF0E58E00F49F837EE48E814527F181516D
S123F9A02606BDF0E57EE4658D0220AD812026108CC6F9A6842708BDE01430015A26F43958
S123F9C0814426486D8427F78D045A26F7390A97311F3121A621A7A426F83981492713816F
S123F9E058270D8148265C6F841F108300F5D7978DBFBDFA84810D278E811B2725810826C3
S123FA00228C00F427EC8D458DC420E6814326CB6D84270EBDFA84250220F5A7808D375A6D
S123FA2026EE39D697C1F9260220C734106D8026FCE682E701ACE426F83262A7808D170C83
S123FA409720AF810826128D045A26FB398C00F427D0301F86087EE014814B27058053277E
S123FA60013934028D1E3402A68427166D6126068DE430012003BDF9CEA684A1E426E95A6F
S123FA8026E635A0BDE000817F24F9815F2602861B810D270E811B270A8108270681202512
S123FAA0E31A0139864F978C398600D6791D7EECBBBDEA36DC1F3406BDEB1EBDEA333506D6
S123FAC01E109C1F26517EECBB9D7CBDEA36BDEB1E3410EC02109321230493272312E6846B
S123FAE0BDED343410AE62BDEE0A3550AF423440BDEEFF34045D271FC6FF81292703BDEE68
S123FB00FF3404BDEA33C6AEBDEA3B8D2E1F13AE62A684A06124037EEC114CA1E42402A712
S123FB20E4A6611E89AE025A3A4D270DA1E42302A6E41F891E31BDE1F13596BDE9227EEEB1
S123FB401BBDEA36BDEED23404BDEA39BDE922BDEA3396062605BDEED52003BDEE6B3404BA
S123FB60E661BDECD635062705A7805A26FB7EEE62BDEA36BDE922C601340496062610BDB1
S123FB80EED5E7E42791BDEA39BDE922BDE9129E523410BDEA39BDFB3B3414BDEA33AE6381
S123FBA0BDEE203404E1662523A661271CE6665A3A3184EE62E661A6E4A0664CA161250C2A
S123FBC0A680A1C0260C5A26F7E666215F32677EECBA6C66302120D98126265C32620F522E
S123FBE00F538E00529D7C814F2712814827239D82200C81381022EE4AC6038D2A9D7C255E
S123FC00F20F500F510F060F630F54C6A0D74F7EF1A59D7C250BBDEB6925E6814724E280F2
S123FC2007C6048D0220EB680169841025F5EC5A26F58030AB01A7013935400F069E839DEF
S123FC407C8126279981B0275E81FF26089D7C8183102700AB9F836EC49E68300126D9C60A
S123FC60167EE446AE9F00838CFF83102700748D238DE6BDEA36C680D708BDEB1E8D25BDDF
S123FC80EA33C6AEBDEA3B9E4BDC83ED84DC39ED027EE6D0C6B0BDEA3BC680D7088A80BDB8
S123FCA0EB239F4B7EE90F8DEB3410BDEA2E8DF43540C632AE4227A9109E83EEC4DF83A6A8
S123FCC0043402EC84EE023476BDF3BEBDE90D3576ED84EF023502A7049D821026ED641016
S123FCE09F83399D7C8D0934108D2D3540AFC4395F9D7C240680301F899D7C9E8D583A39CE
S123FD008DEEAE843410BDEA2E8E004F96062707BDEE1E9E52960639C6AEBDEA3B7EEF041D
S123FD201027EEEDBDE757BDE4E59F939D82271081A7263B9D7C27048D24200486FF972BBB
S123FD40DE938CEEC4ECC42706EC42932B23F49E938D15BDE5059E93BDE4D57EE465BDE784
S123FD60577EE1FAA6C0A78011931B26F79F1B39BDFC599D7C8122260BBDEA10C63BBDEA15
S123FD803BBDF128327EBDE80C3262BDEB1E9F3BBDE9128E00F34FBDECE37EE794BDE757B1
S123FDA09E2B399E919F2B7EE4E5BDE50ACC000ADD95DD8F5FDD919D8224068DE09F959D49
S123FDC082271BBDEA3924068DD39F919D82270EBDEA3924068DC69F8F2749BDE1FA8DC38A
S123FDE09F939E958DBF9C93253A8D1CBDFE7EBDE4D38DAF9F938D3A8D0F8D36BDFF19BD44
S123FE00E50ABDE4D37EE465864F97989E93DC958D150D982602ED02AE848D0BD38F25045B
S123FE2081FA25EE7EEC113406EC84350626023262399E19301F30018DED30033001A6849C
S123FE4027F49F0F4A270C4A272A4A26EF8603A78020E7EC016A0227014FE6036A04270158
S123FE605FED01DD2BBDE4E59E0F25E1DC476C80ED8420C66F84AE01AE029F4720EA9E1991
S123FE8020049E8330018D9F300230019F839D7C4D27EF2AF99E8381FF27EF81A227128104
S123FEA084270E818126E79D7C81A0270481A126DB9D7C25049D8220D79E833410BDE75736
S123FEC09E83A682BDFFB625F930011F10E061C0052720250A3384503085BDFD6820149FB8
S123FEE0479E1B9F435030859F419F1BBDE41E9E459F8335108601A784A702A704D62B2647
S123FF0004C6016C02E701D62C2604C6016C04E7039D82812C279A209C9E19301F3001EC03
S123FF2002DD68BDFE2730033001A68427EF4A271B800226F334108EFF76BDF125AEE4EC31
S123FF4001BDF555BDF54EBDF0E535103410EC01DD52BDFC01BDF5623540C6053001A684F5
S123FF6027055AA7C020F530C45D27BE31C433C5BDFD6830A420B3554C2000BDEF078E018C
S123FF80F0C60434045F860408530952594A26F85D260AA6E44A27058C01F0270CCB30C112
S123FFA0392302CB07E7806F8435045A26D532628E01EF7EECDF81302504803A80C6398136
S10BFFC0891027FDAB7EEA4322
S113FFF00000009B009E00AA00A700A100A4E04806
S9030000FC

1009
ROMS/6809/BASIC.SYM Normal file

File diff suppressed because it is too large Load Diff

5406
ROMS/6809/ExBasROM.LST Normal file

File diff suppressed because it is too large Load Diff

5398
ROMS/6809/ExBasROM.asm Normal file

File diff suppressed because it is too large Load Diff

513
ROMS/6809/ExBasROM.hex Normal file
View File

@@ -0,0 +1,513 @@
:20C00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
:20C02000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20
:20C04000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
:20C06000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
:20C08000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
:20C0A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
:20C0C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80
:20C0E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
:20C10000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F
:20C12000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F
:20C14000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
:20C16000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF
:20C18000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
:20C1A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
:20C1C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
:20C1E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F
:20C20000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E
:20C22000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E
:20C24000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
:20C26000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE
:20C28000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE
:20C2A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E
:20C2C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E
:20C2E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E
:20C30000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D
:20C32000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D
:20C34000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD
:20C36000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD
:20C38000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD
:20C3A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D
:20C3C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D
:20C3E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D
:20C40000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C
:20C42000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C
:20C44000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC
:20C46000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC
:20C48000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC
:20C4A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C
:20C4C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C
:20C4E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C
:20C50000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B
:20C52000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B
:20C54000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB
:20C56000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB
:20C58000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB
:20C5A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B
:20C5C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B
:20C5E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B
:20C60000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A
:20C62000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A
:20C64000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA
:20C66000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA
:20C68000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA
:20C6A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A
:20C6C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A
:20C6E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A
:20C70000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39
:20C72000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19
:20C74000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9
:20C76000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9
:20C78000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9
:20C7A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99
:20C7C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79
:20C7E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59
:20C80000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38
:20C82000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18
:20C84000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8
:20C86000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8
:20C88000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8
:20C8A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98
:20C8C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78
:20C8E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58
:20C90000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37
:20C92000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17
:20C94000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7
:20C96000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7
:20C98000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7
:20C9A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97
:20C9C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77
:20C9E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57
:20CA0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36
:20CA2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16
:20CA4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6
:20CA6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6
:20CA8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6
:20CAA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96
:20CAC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76
:20CAE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56
:20CB0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35
:20CB2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15
:20CB4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5
:20CB6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5
:20CB8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5
:20CBA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95
:20CBC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75
:20CBE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55
:20CC0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34
:20CC2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14
:20CC4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4
:20CC6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4
:20CC8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4
:20CCA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94
:20CCC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74
:20CCE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54
:20CD0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33
:20CD2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13
:20CD4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3
:20CD6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3
:20CD8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3
:20CDA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93
:20CDC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73
:20CDE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53
:20CE0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32
:20CE2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12
:20CE4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2
:20CE6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2
:20CE8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2
:20CEA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92
:20CEC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72
:20CEE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
:20CF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31
:20CF2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11
:20CF4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1
:20CF6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1
:20CF8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1
:20CFA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91
:20CFC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71
:20CFE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51
:20D00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30
:20D02000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10
:20D04000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
:20D06000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
:20D08000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
:20D0A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
:20D0C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70
:20D0E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
:20D10000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F
:20D12000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F
:20D14000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
:20D16000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF
:20D18000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
:20D1A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
:20D1C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F
:20D1E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F
:20D20000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E
:20D22000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E
:20D24000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE
:20D26000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE
:20D28000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE
:20D2A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E
:20D2C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E
:20D2E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E
:20D30000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D
:20D32000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D
:20D34000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED
:20D36000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD
:20D38000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD
:20D3A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D
:20D3C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D
:20D3E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D
:20D40000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C
:20D42000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C
:20D44000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC
:20D46000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC
:20D48000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC
:20D4A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C
:20D4C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C
:20D4E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C
:20D50000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B
:20D52000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B
:20D54000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB
:20D56000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB
:20D58000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB
:20D5A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B
:20D5C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B
:20D5E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B
:20D60000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A
:20D62000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A
:20D64000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA
:20D66000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA
:20D68000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA
:20D6A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A
:20D6C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A
:20D6E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A
:20D70000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29
:20D72000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09
:20D74000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9
:20D76000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9
:20D78000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9
:20D7A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89
:20D7C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69
:20D7E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49
:20D80000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28
:20D82000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08
:20D84000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8
:20D86000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8
:20D88000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8
:20D8A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88
:20D8C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68
:20D8E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48
:20D90000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27
:20D92000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07
:20D94000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7
:20D96000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7
:20D98000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7
:20D9A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87
:20D9C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67
:20D9E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47
:20DA0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26
:20DA2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06
:20DA4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6
:20DA6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6
:20DA8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6
:20DAA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86
:20DAC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66
:20DAE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46
:20DB00008D0327FC39B6A00085012706B6A001847F394F398D243402810D270BB7A0010CEA
:20DB2000799679917825100F798D0F860DB7A0018D08860AB7A0013502393402B6A0008512
:20DB40000227F935023910CE01EE966E8155260A9E6FA684811226026E848E02186F8330AE
:20DB60000126FA8E02176F809F19A60243A702A10226063001630120F19F719F279F233065
:20DB800089FF389F211F148EDBCECE0076C612BDDCAECE00A7C604BDDCAE863997F0BDDFD0
:20DBA000BA8E00B59F8DCEE6CEC60AEF815A26FB8695B7A0008EDC03BDEBE58EDBC69F6F56
:20DBC0008655976E200412BDDFD47EDF223B10405000E6CE0C8426020C83B600007EDCBF9B
:20DBE0007EDCBE7EDBCD7EE6CE804FC7525932DD1DDE2A1DDDBDDCCE0000000000000000DF
:20DC0000000000003638303920455854454E4445442042415349430D2843292031393832A5
:20DC2000204259204D4943524F534F46540D0D0034169E76DC789F6AD76C976D35960F73EA
:20DC40008E00F4C601BDDB00810826075A27EF301F20348115260A5A27E48608BDDB142095
:20DC6000F681031A012705810D260D4F3401BDEBA56F848E00F33581812025C9817B24C5B3
:20DC8000C1FA24C1A7805CBDDB1420B92705BDE9C19F7A6E9F007A7EE0A396732603BDDBDE
:20DCA000050F73975310260C6A97567EE91FA680A7C05A26F939399D8227FB7EE5003B81FC
:20DCC0003A240A812026020E7C803080D039EEC3EF37EEDC00ADF168F1BDE9D4E905E781E8
:20DCE000E99AE924E910F26DF235F23EF3AFF3E1F303F569F33DFA3BE92FE94CE953DC9AB7
:20DD0000E772F571F631F60179EC0E79EC057BED157BEDDA7FF34650E55946E558464FD25A
:20DD200047CF5245CDA7454C53C549C6444154C15052494ED44FCE494E5055D4454EC44E91
:20DD40004558D44449CD524541C45255CE524553544F52C55245545552CE53544FD0504F7E
:20DD60004BC5434F4ED44C4953D4434C4541D24E45D7455845C354524FCE54524F46C64425
:20DD800045CC4445C64C494EC552454E55CD454449D4544142A854CF5355C2544845CE4EC5
:20DDA0004FD4535445D04F46C6ABADAAAFDE414EC44FD2BEBDBC46CE5553494EC75347CE6D
:20DDC000494ED44142D35553D2524EC45349CE504545CB4C45CE535452A45641CC4153C3DF
:20DDE000434852A44154CE434FD35441CE4558D04649D84C4FC7504FD35351D2484558A4D0
:20DE00004C454654A45249474854A44D4944A4494E4B4559A44D45CD5641525054D2494E1A
:20DE20005354D2535452494E47A4DFE8E133E190E190E190E1C1E18DEB6AE1EFE29CE0BA73
:20DE4000E381E5D2E2D6E128E09CE16DE0BEE9DBE0E3E9E2E0F4DFB8DC8CF564F565F7E0CF
:20DE6000F724FECEF86AF3F04E46534E52474F4446434F564F4D554C425344442F304944A1
:20DE8000544D4F534C535354434E4644414F444E494F464D4E4F4945445355464E4520453C
:20DEA00052524F520020494E20000D4F4B0D000D425245414B003064C6129F0FA6848080DC
:20DEC0002615AE019F119E3B27099C1127099E0F3A20E59E119F3B9E0F4D398D17DE413324
:20DEE000419E433001A68236029C4726F8DF45394F58D31FC3003A250810DF171093172569
:20DF0000EEC60CBDDFD4BDEBA9BDEBF88EDE683A8D318D2F8EDE9DBDEBE596684C2703BD91
:20DF2000F00EBDEBA98EDEAABDEBE5BDDC3ECEFFFFDF6825F69F839D7C27F0250BBDEA972A
:20DF40007EE071A6807EEBFABDE2149E2B9FF1BDEA97D7038D4C2512DC47A384D31BDD1B05
:20DF6000EE843702A7809C1B26F896F3271CDC1BDD43DB038900DD41BDDEDBCE00EF370226
:20DF8000A7809C4526F89E419F1B8D368D02209B9E19EC8427213304A6C026FCEF84AE84E2
:20DFA00020F0DC2B9E19EE84270910A3022306AE8420F31A019F473926FB9E196F806F80DE
:20DFC0009F1B9E19BDE1689E279F23BDE09C9E1B9F1D9F1F8E00C99F0BAEE410DE216FE2E4
:20DFE0000F2D0F2E0F086E8486809708BDE236BDDEB6326226049E0F3285C609BDDEF0BD9B
:20E00000E195DC683416C6A0BDE4F8BDE3CCBDE3CAD654CA7FD450D750108EE0207EE473F6
:20E020008EED0EBDEE5D9D8281A426059D7CBDE3CABDEEB6BDE46FDC3B3406868034021C43
:20E04000AF8D609E839F2FA6802707813A27227EE500A68197002772EC80DD689F83968C2E
:20E06000270F865BBDDB149668BDF015865DBDDB149D7C8D0220C827294D102A01B881FFEE
:20E08000270F819E22C9BEDBF1481F893A9D7C6E949D7C8197102714F07EE5009E19301F9C
:20E0A0009F3339BDDB05270A8103271281132703977339BDDB0527FB20EE9D8220021A01A0
:20E0C00026319E839F2F060032629E688CFFFF27069F299E2F9F2D8EDEAE0D00102AFE42A1
:20E0E0007EDF17260EC6209E2D1027FE169F839E299F6839272CBDE66A34069E279D8227AE
:20E100000CBDE4F6BDE9C1301F9C7122181F10A3E125121F0383003A250B931B2507DF218C
:20E120009F277EDFC77EDF019D821027FE94BDDFC720191F899D7CC1A02716C1A12645C621
:20E1400003BDDEF0DE839E6886A134528D037EE03F9D82BDE2148D403001DC2B10936822EC
:20E16000029E19BDDFA62517301F9F833926FD86FF973BBDDEB61F148121270BC6048CC6D0
:20E180000E7EDF037EE50035529F68DF838D068C8D069F8339C63A865FD7015F9E831F98BD
:20E1A000D6019701A68427EC3404A1E027E63001812227EA4C26023001818626E70C04201F
:20E1C000E3BDE3CA9D8281812705C6A2BDE4F8964F26130F048DB64D27BA9D7C818426F5C9
:20E1E0000A042AF19D7C9D821025FF657EE077BDE98FC681BDE4F8340281A1270481A02671
:20E20000830A53260535047EE1359D7C8D06812C27EF35849E749F2B246180309701DC2B4E
:20E22000811822DB58495849D32B5849DB018900DD2B9D7C20E2BDE5DB9F3BC6AEBDE4F87B
:20E2400096063402BDE3DF350246BDE3D110270C2B9E52DC2110A30224119C1B250DE684E7
:20E26000BDE7919E4DBDE8C78E00569F4DBDE8F9DE4D9E3B3726A78410AF02393F52454404
:20E280004F0D007EDF03960927079E319F687EE5008EE27BBDEBE59E2F9F8339C6169E683A
:20E2A000300127DF8D01398122260BBDE4CDC63BBDE4F8BDEBE88E00F36F848D06C62CE714
:20E2C000842016BDEBF8BDEBF5BDDC3E240532647EE0C6C62E399E33864F97099F35BDE5A4
:20E2E000DB9F3B9E839F2B9E35A684260996092651BDEBF88DCD9F839D7CD60627239E83C0
:20E3000097018122270E301F4F9701BDDC30863A9701862C9702BDE7A2BDE4D2BDE2512022
:20E3200006BDEF5BBDEE7C9D822706812C1026FF529E839F359E2B9F839D822721BDE4F64B
:20E34000209C9F83BDE19530014D260AC606EE812741EC81DD31A684818626E620989E3518
:20E36000D6091026FD3AA68427068EE3707EEBE5393F45585452412049474E4F5245440D9A
:20E380000026049E742003BDE5DB9F3BBDDEB62704C60020471F143003BDEE5DA6689754B7
:20E3A0009E3BBDEC0BBDEE7C3069BDEEDFE068270CAE6E9F68AEE8109F837EE03F32E81257
:20E3C0009D82812C26F49D7C8DBD8D131CFE7D1A010D0625032A998C2B96C6187EDF038D8C
:20E3E0006E4F8C34043402C601BDDEF0BDE4AC0F3F9D8280AD25138103240F810149983F9C
:20E40000913F2564973F9D7C20E9D63F26331024006B8B07246799061027047789FF340272
:20E4200048ABE08EDD0830863502A18424558D9C34028D299E3D3502261D4D1027006A2093
:20E440004B0806598D098EE454D73F0F0620D99E837EE16864E578A184243120D3EC013453
:20E46000068D08D63F16FF7B7EE500D654A68435203404D64F9E50DE5234546EA49E74A683
:20E48000E0272681642703BDE3CC9F3D3504815A2719817D271554D70A3552975C9F5DDFE0
:20E4A0005F3504D761D854D762D64F39BDF6F90F069D7C24037EEF5BBDE6262450812E27ED
:20E4C000F481A7274081A627E38122260A9E83BDE79C9E649F833981A3260D865ABDE3E33D
:20E4E000BDE67143537EE7784C272E8D06BDE3DFC6298CC6288CC62CE19F008326020E7C46
:20E50000C6027EDF03867DBDE3E37EF132BDE5DB9F52960626957EEE5D9D7C1F89589D7CEC
:20E52000C13823037EE5003404C12A251EC130241C8DC0A6E4BDE3DF8DBCBDE3CF3502DE9F
:20E54000523442BDE98F350234068E8D9E3504BEDBF63AAD947EE3CC864F9703BDE671DDC4
:20E5600001BDEE93BDE6710D0326069401D40220049A01DA027EE778BDE3D1261096618A01
:20E580007F945D975D8E005CBDEEDF20360F060A3FBDE8DBD7569F589E5FBDE8DD965634AC
:20E5A00004A0E0270786012403D656409754DE585C5A2604D654200BA680A1C027F3C6FFD3
:20E5C000240150CB0159D40A2702C6FF7EEEC5BDE4F6C6018D089D8226F5395F9D82D705E4
:20E5E00097379D828D401025FF165FD7069D7C25048D33250A1F899D7C25FC8D2924F88175
:20E600002426060306CB809D7CD7389A088028102700750F089E1BDC379C1D271210A3812F
:20E62000273E300520F381412504805B80A5398E0074EEE41183E5102728DC1FDD43C3007F
:20E6400007DD419E1D9F47BDDEDB9E419F1F9E459F1D9E47DC37ED814F5FED84ED02A70423
:20E660009F393990800000009D7CBDE3CA96542B5DBDE3CC964F819025088EE663BDEEDF94
:20E68000264CBDEF11DC5239DC053406125F9E3734148DD435349F37DE5234605C9D8281DB
:20E6A0002C27EBD703BDE4F03506DD059E1D9C1F2721DC3710A3842706EC02308B20EFC6E1
:20E6C000129605260BD603E1042759C6108CC6087EDF03CC0005DD64DC37ED84D603E70434
:20E6E000BDDEF09F41C60B4F0D0527053506C30001ED058D5DDD6430020A0326E89F0FD367
:20E700000F1025F7FC1F01BDDEF4830035DD1F4F301FA7059C0F26F89E41961F9341ED02F5
:20E720009605262DE604D7034F5FDD643506DD5210A305243ADE6427048D17D35230020A46
:20E740000326E7EDE358495849E3E1308B30059F393986109745EC05DD174F5F5849250FF8
:20E76000086509642404D31725050A4526EE397EE6CB1F40931F214F0F06DD50C6907EEE33
:20E78000CBBDE3CCCE01F0BDF02532628E01EF200B9F4D8D5C9F58D75639301F86229701B3
:20E7A000970230019F629F58C6FF5CA680270C91012704910226F381222702301F9F64D7BF
:20E7C00056DE62118301F022078DC69E62BDE8C99E0B8C00F12605C61E7EDF039656A7000C
:20E7E000DC58ED0286FF97069F0D9F5230059F0B390F074F3406DC23A3E0109321250ADD2E
:20E80000239E2330019F253584C61A030727CA8D04350420DE9E279F234F5FDD4B9E219F08
:20E82000478E00C99C0B27048D3220F89E1B9C1D27048D2220F89F419E419C1F2735EC0269
:20E84000D341DD41A6012AF0E60458CB053A9C4127E88D0820F8A60130022A14E684271028
:20E86000EC02109323220910934723049F4BDD473005399E4B27FB4FE6845AD347DD439E36
:20E88000239F41BDDEDD9E4BDC45ED029E45301F7EE817DC523406BDE4ACBDE3CF35109F4D
:20E8A00062E6849E52EB842405C61C7EDF03BDE7919E62E6848D109E4D8D228D0C9E628DC6
:20E8C0001CBDE7D07EE3F1AE02DE255C2004A680A7C05A26F9DF2539BDE3CF9E52E6848D8A
:20E8E000182613AE07301F9C2326083404D323DD233504300139AE02399C0D26079F0B306C
:20E900001B9F0D4F398D037EE7778DCC0F065D39BDE992C601BDE7F19653BDE795A7843225
:20E92000627EE7D08D0220DF8DE0275EE684398D484FE1842303E6844F3406BDE7939E4D59
:20E940008D9B35043A3504BDE8C920D58D2BA0844020DFC6FFD7539D8281292705BDE4F6EA
:20E960008D2D8D1527245F4AA18424CD1F89E08450D15323C4D65320C0BDE4F0EEE4AE654B
:20E980009F4DA664E66432671F357EE6CE9D7CBDE3CABDE66D4D26F20E82BDE90A102702A7
:20E9A000E1DE839F833AA68434526F849D82BDEF5B3552A784DF83398D079F2BBDE4F6208E
:20E9C000CEBDE3CA96542BC2964F819022BCBDEF119E52398DEEE6847EE7778DDB9E2BE795
:20E9E00084393401BDE214BDDFA29F66350127129D82271381A726099D7C2706BDE21427F0
:20EA00000639CEFFFFDF2B32629E66BDEBA9BDDC97EC8426037EDF229F66EC0210932B22CD
:20EA2000F4BDF015BDEBF59E668D10AE9F0066CE00F4A6C027D5BDEBFA20F73004108E0080
:20EA4000F4A68027512B15813A260DE684C18427F0C18327EC8C86218D3020E5CEDBE481D6
:20EA6000FF2604A6803345847F334A6DC427E7A0C42AF6ABC4EE414A2B066DC02AFC20F709
:20EA8000A6C48D066DC02AF820B7108C01ED2406847FA7A06FA4399E83CE00F30F430F4482
:20EAA000A68027210D43270FBDE626241881302504813923100F438120270A9742812227CF
:20EAC000380D442719A7C02706813A27CF20D16FC06FC01F308300F18E00F29F8339813F7B
:20EAE0002604868720DF81272613CC3A83EDC10F42A68027D0914227CCA7C020F481302543
:20EB000004813C25C0301F34500F41CEDBE40F42334AA6C4273110AE41AEE4E6A0E0802771
:20EB2000FAC180263832623540DA4296412606C1842606863AEDC12094E7C0C18626020C5F
:20EB400044C18227AA2086CEDBE9034126C03550A680A7C0BDE62625EC034320E80C424A29
:20EB600027AE313FE6A02AFC20AF27398D0139BDFACF273E819F2753812C2737813B2760DB
:20EB8000BDE3DF960634022606BDF022BDE79A8D573504BDDC305D26089D82812C27148DE6
:20EBA000549D8226CF860D2051BDDC3027F7966C26F339BDDC30270AD66CD16B25068DE599
:20EBC000201ED66CD06A24FC502010BDE98D81291026F92CBDDC30D06C23058D185A26FB56
:20EBE0009D7C7EEB72BDE79CBDE8DB5C5A27C3A6808D0720F786208C863F7EDB148EF10904
:20EC00002009BDED78035403622003BDED785D102702808E005C1F895D276CD04F2769253C
:20EC20000A974F966197548E004F50C1F82F594F6401BDED03D6622A0B6301630263036334
:20EC40000443890097639653996097539652995F97529651995E97519650995D97505D2A45
:20EC60004425028D5D5F9650262E965197509652975196539752966397530F63CB08C12825
:20EC80002DE44F974F9754398D6D5F20A85C086309530952095109502AF3964F3404A0E0FE
:20ECA000974F23DE8C2508086386009763200C0C4F2728065006510652065324048D0D27AC
:20ECC000EE39035403500351035203539E5230019F5226069E5030019F5039C60A7EDF03AF
:20ECE0008E0012A6049763A603A704A602A703A601A702965BA701CB082FE89663C008276F
:20ED00000C6701660266036604465C26F43981000000008D6327608D7886009713971497E0
:20ED2000159716D6538D22D663D78BD6528D1AD663D78AD6518D12D663D789D6508D0CD641
:20ED400063D788BDEE547EEC652795439613562726241696169B6097169615995F97159665
:20ED600014995E97149613995D46971306140615061606634F20D539EC0197618A80DD5DEE
:20ED8000D661D854D762EC03DD5FA684975CD64F394D27169B4F464928108B80974F270CD2
:20EDA000966297543996544320023262102AFED27EECDBBDEEA8270D8B0225F40F62BDECBE
:20EDC000160C4F27EB398420000000BDEEA88EEDC65FD762BDEE5D8C8D9E2773004F8DB1C1
:20EDE0000C4F27CC8E0013C604D703C6019650915D26139651915E260D9652915F26079608
:20EE00005391602601431FA859240AE7800A032B34272EC6011F8A250E0860095F095E09EB
:20EE20005D25E32BC820DF966090539760965F9252975F965E9251975E965D9250975D2027
:20EE4000D8C64020D0565656D7638D087EEC65C6147EDF039E139F509E159F52393402EC6B
:20EE60000197548A80DD500F63E684AE039F52D74F35828E004520068E00408C9E3B964F03
:20EE8000A78496548A7F9450A7019651A702DE52EF0339966197549E5C9F4F0F63965E9716
:20EEA0005196549E5F9F5239DC4FDD5C9E519F5E9E539F604D39D64F2708D65459C6FF2569
:20EEC0000150398DF1D7500F51C68896508080D74FDC74DD52976397547EEC610F5439E698
:20EEE0008427D3E601D8542BD1D64FE184261DE601CA7FD450E1012613D651E102260DD636
:20EF000052E1032607D653E00426013956D85420ABD64F273DC0A096542A05035BBDECC407
:20EF20008E004FC1F82E06BDECF70F5B390F5B96544906507EED03D64FC1A0241D8DD2D766
:20EF4000639654D754808086A0974F965397017EEC61D750D751D752D753399E749F549F62
:20EF60004F9F519F529F479F452564BDF698812D260403552004812B26049D7C2551812E5B
:20EF80002728814526289D7C256481A7270E812D270A81A62708812B2704200603489D7C79
:20EFA000254C0D48270800472004034626CC96479045974727122A09BDEDCB0C4726F920B3
:20EFC00007BDEDB30A4726F996552A8E7EF132D645D046D7453402BDEDB33504C0308D0281
:20EFE0002098BDEE78BDEEC58E00407EEC0BD6475858DB475880303404ABE09747209F9B91
:20F000003EBC1FFD9E6E6B27FD9E6E6B28008EDEA48D0CDC68DD50C69043BDEECF8D037E65
:20F02000EBE5CE01F18620D6542A02862DA7C0DF6497548630D64F102700C64FC18022086A
:20F040008EF009BDED1386F797458EF004BDEEE92E0F8EEFFFBDEEE92E0EBDEDB30A4520A8
:20F06000F1BDEDCB0C4520E2BDEBFDBDEF11C60196458B0A2B09810B24054A1F8986024A91
:20F080004A9747D7452E0DDE64862EA7C05D27048630A7C08EF10EC6809653AB0397539605
:20F0A00052A90297529651A90197519650A98497505C565928E32403C00B50CB2F30041F52
:20F0C00098847FA7C00A452604862EA7C053C4808CF13226C4A6C2813027FA812E26023326
:20F0E0005F862BD647271C2A03862D50A7428645A741862F4CC00A24FBCB3AED436F4520E1
:20F1000004A7C46F418E01F1398000000000FA0A1F0000989680FFF0BDC0000186A0FFFF35
:20F12000D8F0000003E8FFFFFF9C0000000AFFFFFFFF964F27020354399F64BDEE788D0527
:20F140008D088E00407EED139F64BDEE739E64E680D7559F648DEE9E6430059F64BDEC0BAD
:20F160008E00450A5526EE39BDEEB62B1F27158D10BDEE788D0E8E00408DCA8EED0EBDEC77
:20F180000B7EEF379EB19F509EB39F52BEF1B99F5DBEF1BB9F5FBDED19DC8AC3658BDDB308
:20F1A000DD52DC88C9B08905DDB1DD500F548680974F961597637EEC6540E64DABBDEEA8C6
:20F1C0008EF202D661BDEDD2BDEEA88DB40F62965CD64FBDEC058EF207BDEC0296543402DE
:20F1E0002A09BDEBFD96542B05030ABDF1328EF207BDEC0B35024D2A03BDF1328EF20C7E5A
:20F20000F13983490FDAA27F000000000584E61A2D1B862807FBF88799688901872335DFA5
:20F22000E186A55DE72883490FDAA2A154468F138F524389CD8EF268BDEC0B7EF1BDBDEE35
:20F24000780F0A8DF68E004ABDEE7E8E0040BDEE5D0F54960A8D0C0D4F1027FA7E8E004A44
:20F260007EEDD834027EF1EB81490FDAA2965434022A028D24964F3402818125058EED0E99
:20F280008DDE8EF29DBDF1393502818125068EF268BDEC0235024D2A037EF132390B76B349
:20F2A00083BDD3791EF4A6F57B83FCB0107C0C1F67CA7CDE53CBC17D1464704C7DB7EA512A
:20F2C0007A7D6330887E7E9244993A7E4CCC91C77FAAAAAA138100000000037F5E56CB79FE
:20F2E00080139B0B6480763893168238AA3B20803504F334813504F3348080000000803169
:20F300007217F8BDEEB6102FF3C48EF2EF964F808034028680974FBDEC0B8EF2F4BDEDD8F5
:20F320008EED0EBDEC028EF2DABDF1398EF2F9BDEC0B3504BDEFE28EF2FE7EED13BDEEA815
:20F340008EF109BDEE5D27674D26037EEC838E004ABDEE7E5F96612A10BDEF378E004A964A
:20F3600061BDEEE9260343D601BDEE953404BDF3038E004ABDED138D363502461025FDB271
:20F38000398138AA3B29077134583E5674167EB31B772FEEE3857A1D841C2A7C6359580A08
:20F3A0007E75FDE7C6803172181081000000008EF381BDED13BDEE78964F818825037EED81
:20F3C000A5BDEF3796018B8127F44A34028E0040BDEC028EF386BDF1480F623502BDED910E
:20F3E00039BDEEB62B037EEF3703548DF97EF132BDF81E326286019798BDDFA21025ED7F27
:20F40000BDEA3B1F208300F5D797DC2BBDF015BDEBF58E00F4D69826255FBDF544BDFCE94D
:20F42000250B80303402860A3DEBE020EDC001C90181412605BDEBA520BB814C260B8D31B5
:20F440000F98BDEBA520C33262810D260D8D22BDEBA58E00F49F837EDF4B814527F1815188
:20F460002606BDEBA57EDF228D0220AD812026108CC6F9A6842708BDDB1430015A26F43933
:20F48000814426486D8427F78D045A26F7390A97311F3121A621A7A426F8398149271381B8
:20F4A00058270D8148265C6F841F108300F5D7978DBFBDF544810D278E811B272581082651
:20F4C000228C00F427EC8D458DC420E6814326CB6D84270EBDF544250220F5A7808D375AFC
:20F4E00026EE39D697C1F9260220C734106D8026FCE682E701ACE426F83262A7808D170CCD
:20F500009720AF810826128D045A26FB398C00F427D0301F86087EDB14814B2705805327CC
:20F52000013934028D1E3402A68427166D6126068DE430012003BDF48EA684A1E426E95AFD
:20F5400026E635A0BDDB00817F24F9815F2602861B810D270E811B270A8108270681202560
:20F56000E31A0139864F978C398600D6791D7EE778BDE4F3DC1F3406BDE5DBBDE4F0350642
:20F580001E109C1F26517EE7789D7CBDE4F3BDE5DB3410EC02109321230493272312E6848E
:20F5A000BDE7F13410AE62BDE8C73550AF423440BDE9BC34045D271FC6FF81292703BDE990
:20F5C000BC3404BDE4F0C6AEBDE4F88D2E1F13AE62A684A06124037EE6CE4CA1E42402A77A
:20F5E000E4A6611E89AE025A3A4D270DA1E42302A6E41F891E31BDDCAE3596BDE3DF7EE892
:20F60000D8BDE4F3BDE98F3404BDE4F6BDE3DFBDE4F096062605BDE9922003BDE928340442
:20F62000E661BDE79335062705A7805A26FB7EE91FBDE4F3BDE3DFC601340496062610BD1C
:20F64000E992E7E42791BDE4F6BDE3DFBDE3CF9E523410BDE4F6BDF5FB3414BDE4F0AE63C5
:20F66000BDE8DD3404E1662523A661271CE6665A3A3184EE62E661A6E4A0664CA161250CBC
:20F68000A680A1C0260C5A26F7E666215F32677EE7776C66302120D98126265C32620F52BF
:20F6A0000F538E00529D7C814F2712814827239D82200C81381022EE47C6038D2A9D7C25AA
:20F6C000F20F500F510F060F630F54C6A0D74F7EEC659D7C250BBDE62625E6814724E280C9
:20F6E00007C6048D0220EB680169841025F5EC5A26F58030AB01A7013935400F069E839D39
:20F700007C8126279981B0275E81FF26089D7C8183102700AB9F836EC49E68300126D9C653
:20F72000167EDF03AE9F00838CFF83102700748D238DE6BDE4F3C680D708BDE5DB8D25BD02
:20F74000E4F0C6AEBDE4F89E4BDC83ED84DC39ED027EE18DC6B0BDE4F8C680D7088A80BD24
:20F76000E5E09F4B7EE3CC8DEB3410BDE4EB8DF43540C632AE4227A9109E83EEC4DF83A6CC
:20F78000043402EC84EE023476BDEE7EBDE3CA3576ED84EF023502A7049D821026ED6110F0
:20F7A0009F83399D7C8D0934108D2D3540AFC4395F9D7C240680301F899D7C9E8D583A3917
:20F7C0008DEEAE843410BDE4EB8E004F96062707BDE8DB9E52960639C6AEBDE4F87EE9C18B
:20F7E0001027EEEABDE214BDDFA29F939D82271081A7263B9D7C27048D24200486FF972B98
:20F80000DE938CEEC4ECC42706EC42932B23F49E938D15BDDFC29E93BDDF927EDF22BDE2AB
:20F82000147EDCB7A6C0A78011931B26F79F1B39BDF7199D7C8122260BBDE4CDC63BBDE47D
:20F84000F8BDEBE8327EBDE2C93262BDE5DB9F3BBDE3CF8E00F34FBDE7A07EE251BDE21436
:20F860009E2B399E919F2B7EDFA2BDDFC7CC000ADD95DD8F5FDD919D8224068DE09F959D23
:20F8800082271BBDE4F624068DD39F919D82270EBDE4F624068DC69F8F2749BDDCB78DC3AD
:20F8A0009F939E958DBF9C93253A8D1CBDF93EBDDF908DAF9F938D3A8D0F8D36BDF9D9BD60
:20F8C000DFC7BDDF907EDF22864F97989E93DC958D150D982602ED02AE848D0BD38F25047E
:20F8E00081FA25EE7EE6CE3406EC84350626023262399E19301F30018DED30033001A6842F
:20F9000027F49F0F4A270C4A272A4A26EF8603A78020E7EC016A0227014FE6036A042701A1
:20F920005FED01DD2BBDDFA29E0F25E1DC476C80ED8420C66F84AE01AE029F4720EA9E1922
:20F9400020049E8330018D9F300230019F839D7C4D27EF2AF99E8381FF27EF81A22712814D
:20F9600084270E818126E79D7C81A0270481A126DB9D7C25049D8220D79E833410BDE214C7
:20F980009E83A682BDFCE925F930011F10E061C0052720250A3384503085BDF82820149F16
:20F9A000479E1B9F435030859F419F1BBDDEDB9E459F8335108601A784A702A704D62B26D9
:20F9C00004C6016C02E701D62C2604C6016C04E7039D82812C279A209C9E19301F3001EC4D
:20F9E00002DD68BDF8E730033001A68427EF4A271B800226F334108EFA36BDEBE5AEE4EC4C
:20FA000001BDF015BDF00EBDEBA535103410EC01DD52BDF6C1BDF0223540C6053001A68498
:20FA200027055AA7C020F530C45D27BE31C433C5BDF82830A420B3554C2000BDE9C48E0163
:20FA4000F0C60434045F860408530952594A26F85D260AA6E44A27058C01F0270CCB30C15B
:20FA6000392302CB07E7806F8435045A26D532628E01EF7EE79C860197995ABDFC179D825B
:20FA800010270093D793BDE3DFBDE3CF9E529F4DD699BDE931BDEBE89E52D699E0845A1065
:20FAA0002B014FBDEBF520F6D7939F0F86029799A684812527C4812026070C9930015A2669
:20FAC000EF9E0FD6938625BDFC17BDDB14202981B12701393262BDE3E1BDE3CFC63BBDE4F8
:20FAE000F89E529F952006969727089E950F97E68426037EE6CEAE020F9A0F99A680812101
:20FB00001027FF728123275B5A2616BDFC17BDDB149D8226D296972603BDEBA59E957EE8B2
:20FB2000DD812B2609BDFC178608979A20CC812E274E81251027FF70A184268B8124271967
:20FB4000812A26F6969A8A20979AC1022511A6018124260B5A30010C99969A8A10979A3002
:20FB6000010C990F980C995A2749A680812E271E812327F1812C2621969A8A40979A20E5CF
:20FB8000A68481231026FF3F8601979830010C985A2720A680812327F5815E2616A18426AB
:20FBA00012A101260EA102260AC1042506C00430040C9A301F0C99969A850826180A995D0D
:20FBC0002713A684802D270681FE260986088A049A9A979A5A9D821027FF3CD793BDE3CAF9
:20FBE00096999B9881111022EAE4BDFC24301FBDEBE50F979D82270D9797813B2705BDE4A8
:20FC0000F620029D7C9E95E684D093AE023AD6931026FEE47EFB113402862B0D9A2703BD49
:20FC2000DB143582CE01F2C620969A85082702C62B0D542A040F54C62DE7C0C630E7C084F3
:20FC400001102601078EF009BDEEE92B15BDF022A68026FCA682A7018C01F126F78625A736
:20FC60008439964F97472703BDFE0C9647102B0081409B998009BDFD29BDFEA2BDFE4196AB
:20FC800047BDFEC09647BDFE8896982602335F4ABDFD29BDFDC44D2706C12A2702E7C06F4B
:20FCA000C48E01F130019F0F963A901090992738A684812027EE812A27EA4F3402A6808161
:20FCC0002D27F8812B27F4910027F08130260EA6018D1625083502A78226FA20C735024D22
:20FCE00026FB9E0F8625A7823981302504803A80C639969827014A9B472B014F34022A0AAF
:20FD00003402BDEDCB35024C20F49647A0E097478B092B199699800990478D0DBDFEA220E8
:20FD20001D34028630A7C035024A2AF53996998DF8BDFE8C86F790478DEF0F450F97BDFEFA
:20FD40004196982602DE399B4716FF43964F34022703BDFE0C969827014A9B997F01F1D694
:20FD60009AC40426037301F1BB01F1800934022A0A3402BDEDCB35024C20F4A6E42B014FAC
:20FD8000409B994CBB01F197450F97BDFE413502BDFEC096982602335FE6E02709D647CB00
:20FDA00009D099F001F1862B5D2A03862D50A7418645A7C1862F4CC00A24FBCB3AEDC16F8A
:20FDC000C47EFC938E01F2E68434048620D69AC52035042708862AC12026021F893404A78C
:20FDE00080E6842710C145270CC13027F2C12C27EEC12E26048630A782969A85102704C6EF
:20FE000024E782840435042602E7823934404F9747D64FC18022118EF009BDED13964780EF
:20FE20000920ECBDEDCB0C478EF004BDEEE92EF38EEFFFBDEEE92E07BDEDB30A4720F13575
:20FE4000C03440BDEBFDBDEF1135408EF10EC6808D369653AB0397539652A902975296511D
:20FE6000A90197519650A98497505C565928E32403C00B50CB2F30041F98847FA7C053C438
:20FE8000808CF13226CA6FC40A452609DF39862EA7C00F97390A97260886039797862CA7A1
:20FEA000C03996478B0A97454C800324FC8B059797969A8440260297973934028DCA350207
:20FEC0004A2B0A34028630A7C0A6E026ED3981891027F95C7EE500FFFFFFFFFFFFFFFFFF8E
:20FEE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22
:20FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01
:20FF2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1
:20FF4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1
:20FF6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1
:20FF8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81
:20FFA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61
:20FFC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41
:20FFE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000009B009E00AA00A700A100A4DB4621
:00000001FF

BIN
ROMS/6809/ExBasRom.zip Normal file

Binary file not shown.

View File

@@ -62,7 +62,7 @@ BEGIN
address_aclr_a => "NONE",
clock_enable_input_a => "BYPASS",
clock_enable_output_a => "BYPASS",
init_file => "./ROMS/6809/EXT_BASIC_NO_USING.hex",
init_file => "./ROMS/6809/basic_remap.hex",
intended_device_family => "Cyclone V",
lpm_hint => "ENABLE_RUNTIME_MOD=NO",
lpm_type => "altsyncram",

BIN
ROMS/6809/as11v2.pdf Normal file

Binary file not shown.

BIN
ROMS/6809/as9.exe Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

258
ROMS/6809/basic.hex Normal file
View File

@@ -0,0 +1,258 @@
:20006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C842602E4
:200080000C83B6FFFF7EE202FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3
:20E000008D0327FC39B6FFD085012706B6FFD1847F394F398D263402810D270DB7FFD10C54
:20E020007996799178251220100F798D0F860DB7FFD18D08860AB7FFD13502393402B6FFA3
:20E04000D0850227F935023910CE01EE860CBDE0148EE157A6802705BDE01420F7B6FFD064
:20E06000850127F9B6FFD1847F8143271481572706966E8155260A9E6FA684811226026E03
:20E08000848E02186F83300126FA8E02176F809F19A60243A702A10226063001630120F1BA
:20E0A0009F719F279F233089FF389F211F148EE0F5CE0076C612BDE1F1CE00A7C604BDE1FA
:20E0C000F1863997F0BDE4FD8E00B59F8DCEEC11C60AEF815A26FB8695B7FFD08EE12ABD7F
:20E0E000F1258EE0ED9F6F8655976E200412BDE5177EE4653B1040FF00EC110C8426020CC0
:20E1000083B600007EE2027EE2017EE0F47EEC11804FC7525932E260E36D1DE300E211003E
:20E1200000000000000000000000003638303920455854454E4445442042415349430D28E0
:20E1400043292031393832204259204D4943524F534F46540D0D00434F4C44204F5220575A
:20E1600041524D2053544152542028432F57293F200D0034169E76DC789F6AD76C976D3534
:20E18000960F738E00F4C601BDE000810826075A27EF301F20348115260A5A27E48608BD42
:20E1A000E01420F681031A012705810D260D4F3401BDF0E56F848E00F33581812025C98179
:20E1C0007B24C5C1FA24C1A7805CBDE01420B92705BDEF049F7A6E9F007A7EE5E69673263A
:20E1E00003BDE0050F73975310260C6A97567EEE62A680A7C05A26F939399D8227FB7EEA86
:20E20000433B813A240A812026020E7C803080D039F403F477F41C00ADF6A8F6FDEF17EE67
:20E2200048ECC4EEDDEE67EE53F7ADF775F77EF8EFF921F843FAA9F87DFF7BEE72EE8FEE67
:20E2400096E1DDECB5FAB1FB71FB4179F14E79F1457BF2557BF31A7FF88650EA9C46EA9B27
:20E26000464FD247CF5245CDA7454C53C549C6444154C15052494ED44FCE494E5055D44545
:20E280004EC44E4558D44449CD524541C45255CE524553544F52C55245545552CE53544F48
:20E2A000D0504F4BC5434F4ED44C4953D4434C4541D24E45D7455845C354524FCE54524FC1
:20E2C00046C64445CC4445C64C494EC552454E55CD454449D4544142A854CF5355C2544891
:20E2E00045CE4E4FD4535445D04F46C6ABADAAAFDE414EC44FD2BEBDBC46CE5553494EC72F
:20E300005347CE494ED44142D35553D2524EC45349CE504545CB4C45CE535452A45641CC88
:20E320004153C3434852A44154CE434FD35441CE4558D04649D84C4FC7504FD35351D24874
:20E340004558A44C454654A45249474854A44D4944A4494E4B4559A44D45CD5641525054FD
:20E36000D2494E5354D2535452494E47A4E52BE676E6D3E6D3E6D3E704E6D0F0ADE732E76B
:20E38000DFE5FDE8C4EB15E819E66BE5DFE6B0E601EF1EE626EF25E637E4FBE1CFFAA4FA0C
:20E3A000A5FD20FC64FFBFFDAAF9304E46534E52474F4446434F564F4D554C425344442F95
:20E3C000304944544D4F534C535354434E4644414F444E494F464D4E4F4945445355464EE4
:20E3E00045204552524F520020494E20000D4F4B0D000D425245414B003064C6129F0FA671
:20E400008480802615AE019F119E3B27099C1127099E0F3A20E59E119F3B9E0F4D398D17AC
:20E42000DE4133419E433001A68236029C4726F8DF45394F58D31FC3003A250810DF1710A0
:20E44000931725EEC60CBDE517BDF0E9BDF1388EE3AB3A8D318D2F8EE3E0BDF12596684CBA
:20E460002703BDF54EBDF0E98EE3EDBDF125BDE181CEFFFFDF6825F69F839D7C27F0250BDC
:20E48000BDEFDA7EE5B4A6807EF13ABDE7579E2B9FF1BDEFDAD7038D4C2512DC47A384D32F
:20E4A0001BDD1BEE843702A7809C1B26F896F3271CDC1BDD43DB038900DD41BDE41ECE00AD
:20E4C000EF3702A7809C4526F89E419F1B8D368D02209B9E19EC8427213304A6C026FCEF2B
:20E4E00084AE8420F0DC2B9E19EE84270910A3022306AE8420F31A019F473926FB9E196F52
:20E50000806F809F1B9E19BDE6AB9E279F23BDE5DF9E1B9F1D9F1F8E00C99F0BAEE410DE11
:20E52000216FE20F2D0F2E0F086E8486809708BDE779BDE3F9326226049E0F3285C609BDDE
:20E54000E433BDE6D8DC683416C6A0BDEA3BBDE90FBDE90DD654CA7FD450D750108EE56347
:20E560007EE9B68EF24EBDF39D9D8281A426059D7CBDE90DBDF3F6BDE9B2DC3B34068680D3
:20E5800034021CAF8D609E839F2FA6802707813A27227EEA43A68197002772EC80DD689FF4
:20E5A00083968C270F865BBDE0149668BDF555865DBDE0149D7C8D0220C827294D102A01ED
:20E5C000B881FF270F819E22C9BEE118481F893A9D7C6E949D7C8197102714ED7EEA439E15
:20E5E00019301F9F3339BDE005270A8103271281132703977339BDE00527FB20EE9D822006
:20E60000021A0126319E839F2F060032629E688CFFFF27069F299E2F9F2D8EE3F10D001060
:20E620002AFE427EE45A260EC6209E2D1027FE169F839E299F6839272CBDEBAD34069E27B4
:20E640009D82270CBDEA39BDEF04301F9C7122181F10A3E125121F0383003A250B931B2576
:20E6600007DF219F277EE50A7EE4449D821027FE94BDE50A20191F899D7CC1A02716C1A12C
:20E680002645C603BDE433DE839E6886A134528D037EE5829D82BDE7578D403001DC2B10BA
:20E6A000936822029E19BDE4E92517301F9F833926FD86FF973BBDE3F91F148121270BC634
:20E6C000048CC60E7EE4467EEA4335529F68DF838D068C8D069F8339C63A865FD7015F9ECC
:20E6E000831F98D6019701A68427EC3404A1E027E63001812227EA4C26023001818626E7D0
:20E700000C0420E3BDE90D9D8281812705C6A2BDEA3B964F26130F048DB64D27BA9D7C8160
:20E720008426F50A042AF19D7C9D821025FF657EE5BABDEED2C681BDEA3B340281A12704FA
:20E7400081A026830A53260535047EE6789D7C8D06812C27EF35849E749F2B246180309782
:20E7600001DC2B811822DB58495849D32B5849DB018900DD2B9D7C20E2BDEB1E9F3BC6AE7E
:20E78000BDEA3B96063402BDE922350246BDE91410270C289E52DC2110A30224119C1B25A8
:20E7A0000DE684BDECD49E4DBDEE0A8E00569F4DBDEE3CDE4D9E3B3726A78410AF02393F49
:20E7C0005245444F0D007EE446960927079E319F687EEA438EE7BEBDF1259E2F9F8339C618
:20E7E000169E68300127DF8D01398122260BBDEA10C63BBDEA3BBDF1288E00F36F848D06B4
:20E80000C62CE7842016BDF138BDF135BDE181240532647EE609C62E399E33864F97099F3F
:20E8200035BDEB1E9F3B9E839F2B9E35A684260996092651BDF1388DCD9F839D7CD6062758
:20E84000239E8397018122270E301F4F9701BDE173863A9701862C9702BDECE5BDEA15BD13
:20E86000E7942006BDF49BBDF3BC9D822706812C1026FF529E839F359E2B9F839D82272178
:20E88000BDEA39209C9F83BDE6D830014D260AC606EE812741EC81DD31A684818626E62016
:20E8A000989E35D6091026FD3AA68427068EE8B37EF125393F45585452412049474E4F52F2
:20E8C00045440D0026049E742003BDEB1E9F3BBDE3F92704C60020471F143003BDF39DA659
:20E8E0006897549E3BBDF14BBDF3BC3069BDF41FE068270CAE6E9F68AEE8109F837EE582D3
:20E9000032E8129D82812C26F49D7C8DBD8D131CFE7D1A010D0625032A998C2B96C6187E89
:20E92000E4468D6E4F8C34043402C601BDE433BDE9EF0F3F9D8280AD25138103240F81012E
:20E9400049983F913F2564973F9D7C20E9D63F26331024006B8B0724679906102704778942
:20E96000FF340248ABE08EE24B30863502A18424558D9C34028D299E3D3502261D4D10275B
:20E98000006A204B0806598D098EE997D73F0F0620D99E837EE6AB64EABBA184243120D3CD
:20E9A000EC0134068D08D63F16FF7B7EEA43D654A68435203404D64F9E50DE5234546EA48D
:20E9C0009E74A6E0272681642703BDE90F9F3D3504815A2719817D271554D70A3552975C75
:20E9E0009F5DDF5F3504D761D854D762D64F39BDFC390F069D7C24037EF49BBDEB692450D0
:20EA0000812E27F481A7274081A627E38122260A9E83BDECDF9E649F833981A3260D865A5C
:20EA2000BDE926BDEBB443537EECBB4C272E8D06BDE922C6298CC6288CC62CE19F008326E7
:20EA4000020E7CC6027EE446867DBDE9267EF672BDEB1E9F52960626957EF39D9D7C1F8928
:20EA6000589D7CC13823037EEA433404C12A251EC130241C8DC0A6E4BDE9228DBCBDE91224
:20EA80003502DE523442BDEED2350234068E8D9E3504BEE11D3AAD947EE90F864F9703BDE0
:20EAA000EBB4DD01BDF3D3BDEBB40D0326069401D40220049A01DA027EECBBBDE9142610A3
:20EAC00096618A7F945D975D8E005CBDF41F20360F060A3FBDEE1ED7569F589E5FBDEE202E
:20EAE00096563404A0E0270786012403D656409754DE585C5A2604D654200BA680A1C02726
:20EB0000F3C6FF240150CB0159D40A2702C6FF7EF405BDEA39C6018D089D8226F5395F9DB5
:20EB200082D70597379D828D401025FF165FD7069D7C25048D33250A1F899D7C25FC8D296E
:20EB400024F8812426060306CB809D7CD7389A088028102700750F089E1BDC379C1D271281
:20EB600010A381273E300520F381412504805B80A5398E0074EEE41183EA532728DC1FDDC4
:20EB800043C30007DD419E1D9F47BDE41E9E419F1F9E459F1D9E47DC37ED814F5FED84ED3C
:20EBA00002A7049F393990800000009D7CBDE90D96542B5DBDE90F964F819025088EEBA652
:20EBC000BDF41F264CBDF451DC5239DC053406125F9E3734148DD435349F37DE5234605C21
:20EBE0009D82812C27EBD703BDEA333506DD059E1D9C1F2721DC3710A3842706EC02308B88
:20EC000020EFC6129605260BD603E1042759C6108CC6087EE446CC0005DD64DC37ED84D6BF
:20EC200003E704BDE4339F41C60B4F0D0527053506C30001ED058D5DDD6430020A0326E86B
:20EC40009F0FD30F1025F7FC1F01BDE437830035DD1F4F301FA7059C0F26F89E41961F9316
:20EC600041ED029605262DE604D7034F5FDD643506DD5210A305243ADE6427048D17D3520D
:20EC800030020A0326E7EDE358495849E3E1308B30059F393986109745EC05DD174F5F58F4
:20ECA00049250F086509642404D31725050A4526EE397EEC0E1F40931F214F0F06DD50C624
:20ECC000907EF40BBDE90FCE01F0BDF56532628E01EF200B9F4D8D5C9F58D75639301F8658
:20ECE000229701970230019F629F58C6FF5CA680270C91012704910226F381222702301F9A
:20ED00009F64D756DE62118301F022078DC69E62BDEE0C9E0B8C00F12605C61E7EE4469658
:20ED200056A700DC58ED0286FF97069F0D9F5230059F0B390F074F3406DC23A3E0109321F7
:20ED4000250ADD239E2330019F253584C61A030727CA8D04350420DE9E279F234F5FDD4B15
:20ED60009E219F478E00C99C0B27048D3220F89E1B9C1D27048D2220F89F419E419C1F27E9
:20ED800035EC02D341DD41A6012AF0E60458CB053A9C4127E88D0820F8A60130022A14E67B
:20EDA000842710EC02109323220910934723049F4BDD473005399E4B27FB4FE6845AD347F4
:20EDC000DD439E239F41BDE4209E4BDC45ED029E45301F7EED5ADC523406BDE9EFBDE9120C
:20EDE00035109F62E6849E52EB842405C61C7EE446BDECD49E62E6848D109E4D8D228D0C9A
:20EE00009E628D1CBDED137EE934AE02DE255C2004A680A7C05A26F9DF2539BDE9129E52D3
:20EE2000E6848D182613AE07301F9C2326083404D323DD233504300139AE02399C0D260709
:20EE40009F0B301B9F0D4F398D037EECBA8DCC0F065D39BDEED5C601BDED349653BDECD842
:20EE6000A78432627EED138D0220DF8DE0275EE684398D484FE1842303E6844F3406BDECE7
:20EE8000D69E4D8D9B35043A3504BDEE0C20D58D2BA0844020DFC6FFD7539D828129270532
:20EEA000BDEA398D2D8D1527245F4AA18424CD1F89E08450D15323C4D65320C0BDEA33EED4
:20EEC000E4AE659F4DA664E66432671F357EEC119D7CBDE90DBDEBB04D26F20E82BDEE4D82
:20EEE000102702DEDE839F833AA68434526F849D82BDF49B3552A784DF83398D079F2BBDC8
:20EF0000EA3920CEBDE90D96542BC2964F819022BCBDF4519E52398DEEE6847EECBA8DDBE6
:20EF20009E2BE784393401BDE757BDE4E59F66350127129D82271381A726099D7C2706BD87
:20EF4000E757270639CEFFFFDF2B32629E66BDF0E9BDE1DAEC8426037EE4659F66EC02102E
:20EF6000932B22F4BDF555BDF1359E668D10AE9F0066CE00F4A6C027D5BDF13A20F7300428
:20EF8000108E00F4A68027512B15813A260DE684C18427F0C18327EC8C86218D3020E5CE33
:20EFA000E10B81FF2604A6803345847F334A6DC427E7A0C42AF6ABC4EE414A2B066DC02A6A
:20EFC000FC20F7A6C48D066DC02AF820B7108C01ED2406847FA7A06FA4399E83CE00F30FC0
:20EFE000430F44A68027210D43270FBDEB69241881302504813923100F438120270A974276
:20F00000812227380D442719A7C02706813A27CF20D16FC06FC01F308300F18E00F29F8364
:20F0200039813F2604868720DF81272613CC3A83EDC10F42A68027D0914227CCA7C020F4DA
:20F0400081302504813C25C0301F34500F41CEE10B0F42334AA6C4273110AE41AEE4E6A0B0
:20F06000E08027FAC180263832623540DA4296412606C1842606863AEDC12094E7C0C186C7
:20F0800026020C44C18227AA2086CEE110034126C03550A680A7C0BDEB6925EC034320E8D3
:20F0A0000C424A27AE313FE6A02AFC20AF27368D0139273E819F2753812C2737813B276087
:20F0C000BDE922960634022606BDF562BDECDD8D573504BDE1735D26089D82812C27148D83
:20F0E000549D8226CF860D2051BDE17327F7966C26F339BDE173270AD66CD16B25068DE5C4
:20F10000201ED66CD06A24FC502010BDEED081291026F92FBDE173D06C23058D185A26FB7D
:20F120009D7C7EF0B2BDECDFBDEE1E5C5A27C3A6808D0720F786208C863F7EE0148EF6499E
:20F140002009BDF2B8035403622003BDF2B85D102702808E005C1F895D276CD04F2769256D
:20F160000A974F966197548E004F50C1F82F594F6401BDF243D6622A0B63016302630363AA
:20F180000443890097639653996097539652995F97529651995E97519650995D97505D2A00
:20F1A0004425028D5D5F9650262E965197509652975196539752966397530F63CB08C128E0
:20F1C0002DE44F974F9754398D6D5F20A85C086309530952095109502AF3964F3404A0E0B9
:20F1E000974F23DE8C2508086386009763200C0C4F2728065006510652065324048D0D2767
:20F20000EE39035403500351035203539E5230019F5226069E5030019F5039C60A7EE44621
:20F220008E0012A6049763A603A704A602A703A601A702965BA701CB082FE89663C0082729
:20F240000C6701660266036604465C26F43981000000008D6327608D78860097139714979B
:20F26000159716D6538D22D663D78BD6528D1AD663D78AD6518D12D663D789D6508D0CD6FC
:20F2800063D788BDF3947EF1A52795439613562726241696169B6097169615995F97159696
:20F2A00014995E97149613995D46971306140615061606634F20D539EC0197618A80DD5DA9
:20F2C000D661D854D762EC03DD5FA684975CD64F394D27169B4F464928108B80974F270C8D
:20F2E000966297543996544320023262102AFED27EF21BBDF3E8270D8B0225F40F62BDF1E9
:20F30000560C4F27EB398420000000BDF3E88EF3065FD762BDF39D8C8D9E2773004F8DB16B
:20F320000C4F27CC8E0013C604D703C6019650915D26139651915E260D9652915F260796C2
:20F340005391602601431FA859240AE7800A032B34272EC6011F8A250E0860095F095E09A6
:20F360005D25E32BC820DF966090539760965F9252975F965E9251975E965D9250975D20E2
:20F38000D8C64020D0565656D7638D087EF1A5C6147EE4469E139F509E159F52393402EC99
:20F3A0000197548A80DD500F63E684AE039F52D74F35828E004520068E00408C9E3B964FBE
:20F3C000A78496548A7F9450A7019651A702DE52EF0339966197549E5C9F4F0F63965E97D1
:20F3E0005196549E5F9F5239DC4FDD5C9E519F5E9E539F604D39D64F2708D65459C6FF2524
:20F400000150398DF1D7500F51C68896508080D74FDC74DD52976397547EF1A10F5439E60D
:20F420008427D3E601D8542BD1D64FE184261DE601CA7FD450E1012613D651E102260DD6F0
:20F4400052E1032607D653E00426013956D85420ABD64F273DC0A096542A05035BBDF2047C
:20F460008E004FC1F82E06BDF2370F5B390F5B96544906507EF243D64FC1A0241D8DD2D796
:20F48000639654D754808086A0974F965397017EF1A1D750D751D752D753399E749F549FD8
:20F4A0004F9F519F529F479F452564BDFBD8812D260403552004812B26049D7C2551812ED1
:20F4C0002728814526289D7C256481A7270E812D270A81A62708812B2704200603489D7C34
:20F4E000254C0D48270800472004034626CC96479045974727122A09BDF30B0C4726F92028
:20F5000007BDF2F30A4726F996552A8E7EF672D645D046D7453402BDF2F33504C0308D026C
:20F520002098BDF3B8BDF4058E00407EF14BD6475858DB475880303404ABE09747209F9B7B
:20F540003EBC1FFD9E6E6B27FD9E6E6B28008EE3E78D0CDC68DD50C69043BDF40F8D037E92
:20F56000F125CE01F18620D6542A02862DA7C0DF6497548630D64F102700C64FC1802208DF
:20F580008EF549BDF25386F797458EF544BDF4292E0F8EF53FBDF4292E0EBDF2F30A45207D
:20F5A000F1BDF30B0C4520E2BDF13DBDF451C60196458B0A2B09810B24054A1F8986024A7B
:20F5C0004A9747D7452E0DDE64862EA7C05D27048630A7C08EF64EC6809653AB039753967B
:20F5E00052A90297529651A90197519650A98497505C565928E32403C00B50CB2F30041F0D
:20F6000098847FA7C00A452604862EA7C053C4808CF67226C4A6C2813027FA812E2602339B
:20F620005F862BD647271C2A03862D50A7428645A741862F4CC00A24FBCB3AED436F45209B
:20F6400004A7C46F418E01F1398000000000FA0A1F0000989680FFF0BDC0000186A0FFFFF0
:20F66000D8F0000003E8FFFFFF9C0000000AFFFFFFFF964F27020354399F64BDF3B88D059D
:20F680008D088E00407EF2539F64BDF3B39E64E680D7559F648DEE9E6430059F64BDF14B99
:20F6A0008E00450A5526EE39BDF3F62B1F27158D10BDF3B88D0E8E00408DCA8EF24EBDF15E
:20F6C0004B7EF4779EB19F509EB39F52BEF6F99F5DBEF6FB9F5FBDF259DC8AC3658BDDB36F
:20F6E000DD52DC88C9B08905DDB1DD500F548680974F961597637EF1A540E64DABBDF3E8F7
:20F700008EF742D661BDF312BDF3E88DB40F62965CD64FBDF1458EF747BDF14296543402F9
:20F720002A09BDF13D96542B05030ABDF6728EF747BDF14B35024D2A03BDF6728EF74C7E75
:20F74000F67983490FDAA27F000000000584E61A2D1B862807FBF88799688901872335DF1B
:20F76000E186A55DE72883490FDAA2A154468F138F524389CD8EF7A8BDF14B7EF6FDBDF31C
:20F78000B80F0A8DF68E004ABDF3BE8E0040BDF39D0F54960A8D0C0D4F1027FA7E8E004A35
:20F7A0007EF31834027EF72B81490FDAA2965434022A028D24964F3402818125058EF24E83
:20F7C0008DDE8EF7DDBDF6793502818125068EF7A8BDF14235024D2A037EF672390B76B3AB
:20F7E00083BDD3791EF4A6F57B83FCB0107C0C1F67CA7CDE53CBC17D1464704C7DB7EA51E5
:20F800007A7D6330887E7E9244993A7E4CCC91C77FAAAAAA138100000000037F5E56CB79B8
:20F8200080139B0B6480763893168238AA3B20803504F334813504F3348080000000803123
:20F840007217F8BDF3F6102FF3C78EF82F964F808034028680974FBDF14B8EF834BDF31851
:20F860008EF24EBDF1428EF81ABDF6798EF839BDF14B3504BDF5228EF83E7EF253BDF3E81A
:20F880008EF649BDF39D27674D26037EF1C38E004ABDF3BE5F96612A10BDF4778E004A96AC
:20F8A00061BDF429260343D601BDF3D53404BDF8438E004ABDF2538D363502461025FDB217
:20F8C000398138AA3B29077134583E5674167EB31B772FEEE3857A1D841C2A7C6359580AC3
:20F8E0007E75FDE7C6803172181081000000008EF8C1BDF253BDF3B8964F818825037EF268
:20F90000E5BDF47796018B8127F44A34028E0040BDF1428EF8C6BDF6880F623502BDF2D12F
:20F9200039BDF3F62B037EF47703548DF97EF672BDFD5E326286019798BDE4E51025ED8282
:20F94000BDEF7E1F208300F5D797DC2BBDF555BDF1358E00F4D69826255FBDFA84BDFFB620
:20F96000250B80303402860A3DEBE020EDC001C90181412605BDF0E520BB814C260B8D312B
:20F980000F98BDF0E520C33262810D260D8D22BDF0E58E00F49F837EE48E814527F1815171
:20F9A0002606BDF0E57EE4658D0220AD812026108CC6F9A6842708BDE01430015A26F4395C
:20F9C000814426486D8427F78D045A26F7390A97311F3121A621A7A426F839814927138173
:20F9E00058270D8148265C6F841F108300F5D7978DBFBDFA84810D278E811B2725810826C7
:20FA0000228C00F427EC8D458DC420E6814326CB6D84270EBDFA84250220F5A7808D375A71
:20FA200026EE39D697C1F9260220C734106D8026FCE682E701ACE426F83262A7808D170C87
:20FA40009720AF810826128D045A26FB398C00F427D0301F86087EE014814B270580532782
:20FA6000013934028D1E3402A68427166D6126068DE430012003BDF9CEA684A1E426E95A73
:20FA800026E635A0BDE000817F24F9815F2602861B810D270E811B270A8108270681202516
:20FAA000E31A0139864F978C398600D6791D7EECBBBDEA36DC1F3406BDEB1EBDEA333506DA
:20FAC0001E109C1F26517EECBB9D7CBDEA36BDEB1E3410EC02109321230493272312E6846F
:20FAE000BDED343410AE62BDEE0A3550AF423440BDEEFF34045D271FC6FF81292703BDEE6C
:20FB0000FF3404BDEA33C6AEBDEA3B8D2E1F13AE62A684A06124037EEC114CA1E42402A716
:20FB2000E4A6611E89AE025A3A4D270DA1E42302A6E41F891E31BDE1F13596BDE9227EEEB5
:20FB40001BBDEA36BDEED23404BDEA39BDE922BDEA3396062605BDEED52003BDEE6B3404BE
:20FB6000E661BDECD635062705A7805A26FB7EEE62BDEA36BDE922C601340496062610BDB5
:20FB8000EED5E7E42791BDEA39BDE922BDE9129E523410BDEA39BDFB3B3414BDEA33AE6385
:20FBA000BDEE203404E1662523A661271CE6665A3A3184EE62E661A6E4A0664CA161250C2E
:20FBC000A680A1C0260C5A26F7E666215F32677EECBA6C66302120D98126265C32620F5232
:20FBE0000F538E00529D7C814F2712814827239D82200C81381022EE4AC6038D2A9D7C2562
:20FC0000F20F500F510F060F630F54C6A0D74F7EF1A59D7C250BBDEB6925E6814724E280F6
:20FC200007C6048D0220EB680169841025F5EC5A26F58030AB01A7013935400F069E839DF3
:20FC40007C8126279981B0275E81FF26089D7C8183102700AB9F836EC49E68300126D9C60E
:20FC6000167EE446AE9F00838CFF83102700748D238DE6BDEA36C680D708BDEB1E8D25BDE3
:20FC8000EA33C6AEBDEA3B9E4BDC83ED84DC39ED027EE6D0C6B0BDEA3BC680D7088A80BDBC
:20FCA000EB239F4B7EE90F8DEB3410BDEA2E8DF43540C632AE4227A9109E83EEC4DF83A6AC
:20FCC000043402EC84EE023476BDF3BEBDE90D3576ED84EF023502A7049D821026ED64101A
:20FCE0009F83399D7C8D0934108D2D3540AFC4395F9D7C240680301F899D7C9E8D583A39D2
:20FD00008DEEAE843410BDEA2E8E004F96062707BDEE1E9E52960639C6AEBDEA3B7EEF0421
:20FD20001027EEEDBDE757BDE4E59F939D82271081A7263B9D7C27048D24200486FF972BBF
:20FD4000DE938CEEC4ECC42706EC42932B23F49E938D15BDE5059E93BDE4D57EE465BDE788
:20FD6000577EE1FAA6C0A78011931B26F79F1B39BDFC599D7C8122260BBDEA10C63BBDEA19
:20FD80003BBDF128327EBDE80C3262BDEB1E9F3BBDE9128E00F34FBDECE37EE794BDE757B5
:20FDA0009E2B399E919F2B7EE4E5BDE50ACC000ADD95DD8F5FDD919D8224068DE09F959D4D
:20FDC00082271BBDEA3924068DD39F919D82270EBDEA3924068DC69F8F2749BDE1FA8DC38E
:20FDE0009F939E958DBF9C93253A8D1CBDFE7EBDE4D38DAF9F938D3A8D0F8D36BDFF19BD48
:20FE0000E50ABDE4D37EE465864F97989E93DC958D150D982602ED02AE848D0BD38F25045F
:20FE200081FA25EE7EEC113406EC84350626023262399E19301F30018DED30033001A684A0
:20FE400027F49F0F4A270C4A272A4A26EF8603A78020E7EC016A0227014FE6036A0427015C
:20FE60005FED01DD2BBDE4E59E0F25E1DC476C80ED8420C66F84AE01AE029F4720EA9E1995
:20FE800020049E8330018D9F300230019F839D7C4D27EF2AF99E8381FF27EF81A227128108
:20FEA00084270E818126E79D7C81A0270481A126DB9D7C25049D8220D79E833410BDE7573A
:20FEC0009E83A682BDFFB625F930011F10E061C0052720250A3384503085BDFD6820149FBC
:20FEE000479E1B9F435030859F419F1BBDE41E9E459F8335108601A784A702A704D62B264B
:20FF000004C6016C02E701D62C2604C6016C04E7039D82812C279A209C9E19301F3001EC07
:20FF200002DD68BDFE2730033001A68427EF4A271B800226F334108EFF76BDF125AEE4EC35
:20FF400001BDF555BDF54EBDF0E535103410EC01DD52BDFC01BDF5623540C6053001A684F9
:20FF600027055AA7C020F530C45D27BE31C433C5BDFD6830A420B3554C2000BDEF078E0190
:20FF8000F0C60434045F860408530952594A26F85D260AA6E44A27058C01F0270CCB30C116
:20FFA000392302CB07E7806F8435045A26D532628E01EF7EECDF81302504803A80C639813A
:20FFC000891027FDAB7EEA43FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26
:20FFE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000009B009E00AA00A700A100A4E0481A

4818
ROMS/6809/basic.lst Normal file

File diff suppressed because it is too large Load Diff

257
ROMS/6809/basic_remap.hex Normal file
View File

@@ -0,0 +1,257 @@
:200000008D0327FC39B6FFD085012706B6FFD1847F394F398D263402810D270DB7FFD10C34
:200020007996799178251220100F798D0F860DB7FFD18D08860AB7FFD13502393402B6FF83
:20004000D0850227F935023910CE01EE860CBDE0148EE157A6802705BDE01420F7B6FFD044
:20006000850127F9B6FFD1847F8143271481572706966E8155260A9E6FA684811226026EE3
:20008000848E02186F83300126FA8E02176F809F19A60243A702A10226063001630120F19A
:2000A0009F719F279F233089FF389F211F148EE0F5CE0076C612BDE1F1CE00A7C604BDE1DA
:2000C000F1863997F0BDE4FD8E00B59F8DCEEC11C60AEF815A26FB8695B7FFD08EE12ABD5F
:2000E000F1258EE0ED9F6F8655976E200412BDE5177EE4653B1040FF00EC110C8426020CA0
:2001000083B600007EE2027EE2017EE0F47EEC11804FC7525932E260E36D1DE300E211001E
:2001200000000000000000000000003638303920455854454E4445442042415349430D28C0
:2001400043292031393832204259204D4943524F534F46540D0D00434F4C44204F5220573A
:2001600041524D2053544152542028432F57293F200D0034169E76DC789F6AD76C976D3514
:20018000960F738E00F4C601BDE000810826075A27EF301F20348115260A5A27E48608BD22
:2001A000E01420F681031A012705810D260D4F3401BDF0E56F848E00F33581812025C98159
:2001C0007B24C5C1FA24C1A7805CBDE01420B92705BDEF049F7A6E9F007A7EE5E69673261A
:2001E00003BDE0050F73975310260C6A97567EEE62A680A7C05A26F939399D8227FB7EEA66
:20020000433B813A240A812026020E7C803080D039F403F477F41C00ADF6A8F6FDEF17EE47
:2002200048ECC4EEDDEE67EE53F7ADF775F77EF8EFF921F843FAA9F87DFF7BEE72EE8FEE47
:2002400096E1DDECB5FAB1FB71FB4179F14E79F1457BF2557BF31A7FF88650EA9C46EA9B07
:20026000464FD247CF5245CDA7454C53C549C6444154C15052494ED44FCE494E5055D44525
:200280004EC44E4558D44449CD524541C45255CE524553544F52C55245545552CE53544F28
:2002A000D0504F4BC5434F4ED44C4953D4434C4541D24E45D7455845C354524FCE54524FA1
:2002C00046C64445CC4445C64C494EC552454E55CD454449D4544142A854CF5355C2544871
:2002E00045CE4E4FD4535445D04F46C6ABADAAAFDE414EC44FD2BEBDBC46CE5553494EC70F
:200300005347CE494ED44142D35553D2524EC45349CE504545CB4C45CE535452A45641CC68
:200320004153C3434852A44154CE434FD35441CE4558D04649D84C4FC7504FD35351D24854
:200340004558A44C454654A45249474854A44D4944A4494E4B4559A44D45CD5641525054DD
:20036000D2494E5354D2535452494E47A4E52BE676E6D3E6D3E6D3E704E6D0F0ADE732E74B
:20038000DFE5FDE8C4EB15E819E66BE5DFE6B0E601EF1EE626EF25E637E4FBE1CFFAA4FAEC
:2003A000A5FD20FC64FFBFFDAAF9304E46534E52474F4446434F564F4D554C425344442F75
:2003C000304944544D4F534C535354434E4644414F444E494F464D4E4F4945445355464EC4
:2003E00045204552524F520020494E20000D4F4B0D000D425245414B003064C6129F0FA651
:200400008480802615AE019F119E3B27099C1127099E0F3A20E59E119F3B9E0F4D398D178C
:20042000DE4133419E433001A68236029C4726F8DF45394F58D31FC3003A250810DF171080
:20044000931725EEC60CBDE517BDF0E9BDF1388EE3AB3A8D318D2F8EE3E0BDF12596684C9A
:200460002703BDF54EBDF0E98EE3EDBDF125BDE181CEFFFFDF6825F69F839D7C27F0250BBC
:20048000BDEFDA7EE5B4A6807EF13ABDE7579E2B9FF1BDEFDAD7038D4C2512DC47A384D30F
:2004A0001BDD1BEE843702A7809C1B26F896F3271CDC1BDD43DB038900DD41BDE41ECE008D
:2004C000EF3702A7809C4526F89E419F1B8D368D02209B9E19EC8427213304A6C026FCEF0B
:2004E00084AE8420F0DC2B9E19EE84270910A3022306AE8420F31A019F473926FB9E196F32
:20050000806F809F1B9E19BDE6AB9E279F23BDE5DF9E1B9F1D9F1F8E00C99F0BAEE410DEF1
:20052000216FE20F2D0F2E0F086E8486809708BDE779BDE3F9326226049E0F3285C609BDBE
:20054000E433BDE6D8DC683416C6A0BDEA3BBDE90FBDE90DD654CA7FD450D750108EE56327
:200560007EE9B68EF24EBDF39D9D8281A426059D7CBDE90DBDF3F6BDE9B2DC3B34068680B3
:2005800034021CAF8D609E839F2FA6802707813A27227EEA43A68197002772EC80DD689FD4
:2005A00083968C270F865BBDE0149668BDF555865DBDE0149D7C8D0220C827294D102A01CD
:2005C000B881FF270F819E22C9BEE118481F893A9D7C6E949D7C8197102714ED7EEA439EF5
:2005E00019301F9F3339BDE005270A8103271281132703977339BDE00527FB20EE9D8220E6
:20060000021A0126319E839F2F060032629E688CFFFF27069F299E2F9F2D8EE3F10D001040
:200620002AFE427EE45A260EC6209E2D1027FE169F839E299F6839272CBDEBAD34069E2794
:200640009D82270CBDEA39BDEF04301F9C7122181F10A3E125121F0383003A250B931B2556
:2006600007DF219F277EE50A7EE4449D821027FE94BDE50A20191F899D7CC1A02716C1A10C
:200680002645C603BDE433DE839E6886A134528D037EE5829D82BDE7578D403001DC2B109A
:2006A000936822029E19BDE4E92517301F9F833926FD86FF973BBDE3F91F148121270BC614
:2006C000048CC60E7EE4467EEA4335529F68DF838D068C8D069F8339C63A865FD7015F9EAC
:2006E000831F98D6019701A68427EC3404A1E027E63001812227EA4C26023001818626E7B0
:200700000C0420E3BDE90D9D8281812705C6A2BDEA3B964F26130F048DB64D27BA9D7C8140
:200720008426F50A042AF19D7C9D821025FF657EE5BABDEED2C681BDEA3B340281A12704DA
:2007400081A026830A53260535047EE6789D7C8D06812C27EF35849E749F2B246180309762
:2007600001DC2B811822DB58495849D32B5849DB018900DD2B9D7C20E2BDEB1E9F3BC6AE5E
:20078000BDEA3B96063402BDE922350246BDE91410270C289E52DC2110A30224119C1B2588
:2007A0000DE684BDECD49E4DBDEE0A8E00569F4DBDEE3CDE4D9E3B3726A78410AF02393F29
:2007C0005245444F0D007EE446960927079E319F687EEA438EE7BEBDF1259E2F9F8339C6F8
:2007E000169E68300127DF8D01398122260BBDEA10C63BBDEA3BBDF1288E00F36F848D0694
:20080000C62CE7842016BDF138BDF135BDE181240532647EE609C62E399E33864F97099F1F
:2008200035BDEB1E9F3B9E839F2B9E35A684260996092651BDF1388DCD9F839D7CD6062738
:20084000239E8397018122270E301F4F9701BDE173863A9701862C9702BDECE5BDEA15BDF3
:20086000E7942006BDF49BBDF3BC9D822706812C1026FF529E839F359E2B9F839D82272158
:20088000BDEA39209C9F83BDE6D830014D260AC606EE812741EC81DD31A684818626E620F6
:2008A000989E35D6091026FD3AA68427068EE8B37EF125393F45585452412049474E4F52D2
:2008C00045440D0026049E742003BDEB1E9F3BBDE3F92704C60020471F143003BDF39DA639
:2008E0006897549E3BBDF14BBDF3BC3069BDF41FE068270CAE6E9F68AEE8109F837EE582B3
:2009000032E8129D82812C26F49D7C8DBD8D131CFE7D1A010D0625032A998C2B96C6187E69
:20092000E4468D6E4F8C34043402C601BDE433BDE9EF0F3F9D8280AD25138103240F81010E
:2009400049983F913F2564973F9D7C20E9D63F26331024006B8B0724679906102704778922
:20096000FF340248ABE08EE24B30863502A18424558D9C34028D299E3D3502261D4D10273B
:20098000006A204B0806598D098EE997D73F0F0620D99E837EE6AB64EABBA184243120D3AD
:2009A000EC0134068D08D63F16FF7B7EEA43D654A68435203404D64F9E50DE5234546EA46D
:2009C0009E74A6E0272681642703BDE90F9F3D3504815A2719817D271554D70A3552975C55
:2009E0009F5DDF5F3504D761D854D762D64F39BDFC390F069D7C24037EF49BBDEB692450B0
:200A0000812E27F481A7274081A627E38122260A9E83BDECDF9E649F833981A3260D865A3C
:200A2000BDE926BDEBB443537EECBB4C272E8D06BDE922C6298CC6288CC62CE19F008326C7
:200A4000020E7CC6027EE446867DBDE9267EF672BDEB1E9F52960626957EF39D9D7C1F8908
:200A6000589D7CC13823037EEA433404C12A251EC130241C8DC0A6E4BDE9228DBCBDE91204
:200A80003502DE523442BDEED2350234068E8D9E3504BEE11D3AAD947EE90F864F9703BDC0
:200AA000EBB4DD01BDF3D3BDEBB40D0326069401D40220049A01DA027EECBBBDE914261083
:200AC00096618A7F945D975D8E005CBDF41F20360F060A3FBDEE1ED7569F589E5FBDEE200E
:200AE00096563404A0E0270786012403D656409754DE585C5A2604D654200BA680A1C02706
:200B0000F3C6FF240150CB0159D40A2702C6FF7EF405BDEA39C6018D089D8226F5395F9D95
:200B200082D70597379D828D401025FF165FD7069D7C25048D33250A1F899D7C25FC8D294E
:200B400024F8812426060306CB809D7CD7389A088028102700750F089E1BDC379C1D271261
:200B600010A381273E300520F381412504805B80A5398E0074EEE41183EA532728DC1FDDA4
:200B800043C30007DD419E1D9F47BDE41E9E419F1F9E459F1D9E47DC37ED814F5FED84ED1C
:200BA00002A7049F393990800000009D7CBDE90D96542B5DBDE90F964F819025088EEBA632
:200BC000BDF41F264CBDF451DC5239DC053406125F9E3734148DD435349F37DE5234605C01
:200BE0009D82812C27EBD703BDEA333506DD059E1D9C1F2721DC3710A3842706EC02308B68
:200C000020EFC6129605260BD603E1042759C6108CC6087EE446CC0005DD64DC37ED84D69F
:200C200003E704BDE4339F41C60B4F0D0527053506C30001ED058D5DDD6430020A0326E84B
:200C40009F0FD30F1025F7FC1F01BDE437830035DD1F4F301FA7059C0F26F89E41961F93F6
:200C600041ED029605262DE604D7034F5FDD643506DD5210A305243ADE6427048D17D352ED
:200C800030020A0326E7EDE358495849E3E1308B30059F393986109745EC05DD174F5F58D4
:200CA00049250F086509642404D31725050A4526EE397EEC0E1F40931F214F0F06DD50C604
:200CC000907EF40BBDE90FCE01F0BDF56532628E01EF200B9F4D8D5C9F58D75639301F8638
:200CE000229701970230019F629F58C6FF5CA680270C91012704910226F381222702301F7A
:200D00009F64D756DE62118301F022078DC69E62BDEE0C9E0B8C00F12605C61E7EE4469638
:200D200056A700DC58ED0286FF97069F0D9F5230059F0B390F074F3406DC23A3E0109321D7
:200D4000250ADD239E2330019F253584C61A030727CA8D04350420DE9E279F234F5FDD4BF5
:200D60009E219F478E00C99C0B27048D3220F89E1B9C1D27048D2220F89F419E419C1F27C9
:200D800035EC02D341DD41A6012AF0E60458CB053A9C4127E88D0820F8A60130022A14E65B
:200DA000842710EC02109323220910934723049F4BDD473005399E4B27FB4FE6845AD347D4
:200DC000DD439E239F41BDE4209E4BDC45ED029E45301F7EED5ADC523406BDE9EFBDE912EC
:200DE00035109F62E6849E52EB842405C61C7EE446BDECD49E62E6848D109E4D8D228D0C7A
:200E00009E628D1CBDED137EE934AE02DE255C2004A680A7C05A26F9DF2539BDE9129E52B3
:200E2000E6848D182613AE07301F9C2326083404D323DD233504300139AE02399C0D2607E9
:200E40009F0B301B9F0D4F398D037EECBA8DCC0F065D39BDEED5C601BDED349653BDECD822
:200E6000A78432627EED138D0220DF8DE0275EE684398D484FE1842303E6844F3406BDECC7
:200E8000D69E4D8D9B35043A3504BDEE0C20D58D2BA0844020DFC6FFD7539D828129270512
:200EA000BDEA398D2D8D1527245F4AA18424CD1F89E08450D15323C4D65320C0BDEA33EEB4
:200EC000E4AE659F4DA664E66432671F357EEC119D7CBDE90DBDEBB04D26F20E82BDEE4D62
:200EE000102702DEDE839F833AA68434526F849D82BDF49B3552A784DF83398D079F2BBDA8
:200F0000EA3920CEBDE90D96542BC2964F819022BCBDF4519E52398DEEE6847EECBA8DDBC6
:200F20009E2BE784393401BDE757BDE4E59F66350127129D82271381A726099D7C2706BD67
:200F4000E757270639CEFFFFDF2B32629E66BDF0E9BDE1DAEC8426037EE4659F66EC02100E
:200F6000932B22F4BDF555BDF1359E668D10AE9F0066CE00F4A6C027D5BDF13A20F7300408
:200F8000108E00F4A68027512B15813A260DE684C18427F0C18327EC8C86218D3020E5CE13
:200FA000E10B81FF2604A6803345847F334A6DC427E7A0C42AF6ABC4EE414A2B066DC02A4A
:200FC000FC20F7A6C48D066DC02AF820B7108C01ED2406847FA7A06FA4399E83CE00F30FA0
:200FE000430F44A68027210D43270FBDEB69241881302504813923100F438120270A974256
:20100000812227380D442719A7C02706813A27CF20D16FC06FC01F308300F18E00F29F8344
:2010200039813F2604868720DF81272613CC3A83EDC10F42A68027D0914227CCA7C020F4BA
:2010400081302504813C25C0301F34500F41CEE10B0F42334AA6C4273110AE41AEE4E6A090
:20106000E08027FAC180263832623540DA4296412606C1842606863AEDC12094E7C0C186A7
:2010800026020C44C18227AA2086CEE110034126C03550A680A7C0BDEB6925EC034320E8B3
:2010A0000C424A27AE313FE6A02AFC20AF27368D0139273E819F2753812C2737813B276067
:2010C000BDE922960634022606BDF562BDECDD8D573504BDE1735D26089D82812C27148D63
:2010E000549D8226CF860D2051BDE17327F7966C26F339BDE173270AD66CD16B25068DE5A4
:20110000201ED66CD06A24FC502010BDEED081291026F92FBDE173D06C23058D185A26FB5D
:201120009D7C7EF0B2BDECDFBDEE1E5C5A27C3A6808D0720F786208C863F7EE0148EF6497E
:201140002009BDF2B8035403622003BDF2B85D102702808E005C1F895D276CD04F2769254D
:201160000A974F966197548E004F50C1F82F594F6401BDF243D6622A0B630163026303638A
:201180000443890097639653996097539652995F97529651995E97519650995D97505D2AE0
:2011A0004425028D5D5F9650262E965197509652975196539752966397530F63CB08C128C0
:2011C0002DE44F974F9754398D6D5F20A85C086309530952095109502AF3964F3404A0E099
:2011E000974F23DE8C2508086386009763200C0C4F2728065006510652065324048D0D2747
:20120000EE39035403500351035203539E5230019F5226069E5030019F5039C60A7EE44601
:201220008E0012A6049763A603A704A602A703A601A702965BA701CB082FE89663C0082709
:201240000C6701660266036604465C26F43981000000008D6327608D78860097139714977B
:20126000159716D6538D22D663D78BD6528D1AD663D78AD6518D12D663D789D6508D0CD6DC
:2012800063D788BDF3947EF1A52795439613562726241696169B6097169615995F97159676
:2012A00014995E97149613995D46971306140615061606634F20D539EC0197618A80DD5D89
:2012C000D661D854D762EC03DD5FA684975CD64F394D27169B4F464928108B80974F270C6D
:2012E000966297543996544320023262102AFED27EF21BBDF3E8270D8B0225F40F62BDF1C9
:20130000560C4F27EB398420000000BDF3E88EF3065FD762BDF39D8C8D9E2773004F8DB14B
:201320000C4F27CC8E0013C604D703C6019650915D26139651915E260D9652915F260796A2
:201340005391602601431FA859240AE7800A032B34272EC6011F8A250E0860095F095E0986
:201360005D25E32BC820DF966090539760965F9252975F965E9251975E965D9250975D20C2
:20138000D8C64020D0565656D7638D087EF1A5C6147EE4469E139F509E159F52393402EC79
:2013A0000197548A80DD500F63E684AE039F52D74F35828E004520068E00408C9E3B964F9E
:2013C000A78496548A7F9450A7019651A702DE52EF0339966197549E5C9F4F0F63965E97B1
:2013E0005196549E5F9F5239DC4FDD5C9E519F5E9E539F604D39D64F2708D65459C6FF2504
:201400000150398DF1D7500F51C68896508080D74FDC74DD52976397547EF1A10F5439E6ED
:201420008427D3E601D8542BD1D64FE184261DE601CA7FD450E1012613D651E102260DD6D0
:2014400052E1032607D653E00426013956D85420ABD64F273DC0A096542A05035BBDF2045C
:201460008E004FC1F82E06BDF2370F5B390F5B96544906507EF243D64FC1A0241D8DD2D776
:20148000639654D754808086A0974F965397017EF1A1D750D751D752D753399E749F549FB8
:2014A0004F9F519F529F479F452564BDFBD8812D260403552004812B26049D7C2551812EB1
:2014C0002728814526289D7C256481A7270E812D270A81A62708812B2704200603489D7C14
:2014E000254C0D48270800472004034626CC96479045974727122A09BDF30B0C4726F92008
:2015000007BDF2F30A4726F996552A8E7EF672D645D046D7453402BDF2F33504C0308D024C
:201520002098BDF3B8BDF4058E00407EF14BD6475858DB475880303404ABE09747209F9B5B
:201540003EBC1FFD9E6E6B27FD9E6E6B28008EE3E78D0CDC68DD50C69043BDF40F8D037E72
:20156000F125CE01F18620D6542A02862DA7C0DF6497548630D64F102700C64FC1802208BF
:201580008EF549BDF25386F797458EF544BDF4292E0F8EF53FBDF4292E0EBDF2F30A45205D
:2015A000F1BDF30B0C4520E2BDF13DBDF451C60196458B0A2B09810B24054A1F8986024A5B
:2015C0004A9747D7452E0DDE64862EA7C05D27048630A7C08EF64EC6809653AB039753965B
:2015E00052A90297529651A90197519650A98497505C565928E32403C00B50CB2F30041FED
:2016000098847FA7C00A452604862EA7C053C4808CF67226C4A6C2813027FA812E2602337B
:201620005F862BD647271C2A03862D50A7428645A741862F4CC00A24FBCB3AED436F45207B
:2016400004A7C46F418E01F1398000000000FA0A1F0000989680FFF0BDC0000186A0FFFFD0
:20166000D8F0000003E8FFFFFF9C0000000AFFFFFFFF964F27020354399F64BDF3B88D057D
:201680008D088E00407EF2539F64BDF3B39E64E680D7559F648DEE9E6430059F64BDF14B79
:2016A0008E00450A5526EE39BDF3F62B1F27158D10BDF3B88D0E8E00408DCA8EF24EBDF13E
:2016C0004B7EF4779EB19F509EB39F52BEF6F99F5DBEF6FB9F5FBDF259DC8AC3658BDDB34F
:2016E000DD52DC88C9B08905DDB1DD500F548680974F961597637EF1A540E64DABBDF3E8D7
:201700008EF742D661BDF312BDF3E88DB40F62965CD64FBDF1458EF747BDF14296543402D9
:201720002A09BDF13D96542B05030ABDF6728EF747BDF14B35024D2A03BDF6728EF74C7E55
:20174000F67983490FDAA27F000000000584E61A2D1B862807FBF88799688901872335DFFB
:20176000E186A55DE72883490FDAA2A154468F138F524389CD8EF7A8BDF14B7EF6FDBDF3FC
:20178000B80F0A8DF68E004ABDF3BE8E0040BDF39D0F54960A8D0C0D4F1027FA7E8E004A15
:2017A0007EF31834027EF72B81490FDAA2965434022A028D24964F3402818125058EF24E63
:2017C0008DDE8EF7DDBDF6793502818125068EF7A8BDF14235024D2A037EF672390B76B38B
:2017E00083BDD3791EF4A6F57B83FCB0107C0C1F67CA7CDE53CBC17D1464704C7DB7EA51C5
:201800007A7D6330887E7E9244993A7E4CCC91C77FAAAAAA138100000000037F5E56CB7998
:2018200080139B0B6480763893168238AA3B20803504F334813504F3348080000000803103
:201840007217F8BDF3F6102FF3C78EF82F964F808034028680974FBDF14B8EF834BDF31831
:201860008EF24EBDF1428EF81ABDF6798EF839BDF14B3504BDF5228EF83E7EF253BDF3E8FA
:201880008EF649BDF39D27674D26037EF1C38E004ABDF3BE5F96612A10BDF4778E004A968C
:2018A00061BDF429260343D601BDF3D53404BDF8438E004ABDF2538D363502461025FDB2F7
:2018C000398138AA3B29077134583E5674167EB31B772FEEE3857A1D841C2A7C6359580AA3
:2018E0007E75FDE7C6803172181081000000008EF8C1BDF253BDF3B8964F818825037EF248
:20190000E5BDF47796018B8127F44A34028E0040BDF1428EF8C6BDF6880F623502BDF2D10F
:2019200039BDF3F62B037EF47703548DF97EF672BDFD5E326286019798BDE4E51025ED8262
:20194000BDEF7E1F208300F5D797DC2BBDF555BDF1358E00F4D69826255FBDFA84BDFFB600
:20196000250B80303402860A3DEBE020EDC001C90181412605BDF0E520BB814C260B8D310B
:201980000F98BDF0E520C33262810D260D8D22BDF0E58E00F49F837EE48E814527F1815151
:2019A0002606BDF0E57EE4658D0220AD812026108CC6F9A6842708BDE01430015A26F4393C
:2019C000814426486D8427F78D045A26F7390A97311F3121A621A7A426F839814927138153
:2019E00058270D8148265C6F841F108300F5D7978DBFBDFA84810D278E811B2725810826A7
:201A0000228C00F427EC8D458DC420E6814326CB6D84270EBDFA84250220F5A7808D375A51
:201A200026EE39D697C1F9260220C734106D8026FCE682E701ACE426F83262A7808D170C67
:201A40009720AF810826128D045A26FB398C00F427D0301F86087EE014814B270580532762
:201A6000013934028D1E3402A68427166D6126068DE430012003BDF9CEA684A1E426E95A53
:201A800026E635A0BDE000817F24F9815F2602861B810D270E811B270A81082706812025F6
:201AA000E31A0139864F978C398600D6791D7EECBBBDEA36DC1F3406BDEB1EBDEA333506BA
:201AC0001E109C1F26517EECBB9D7CBDEA36BDEB1E3410EC02109321230493272312E6844F
:201AE000BDED343410AE62BDEE0A3550AF423440BDEEFF34045D271FC6FF81292703BDEE4C
:201B0000FF3404BDEA33C6AEBDEA3B8D2E1F13AE62A684A06124037EEC114CA1E42402A7F6
:201B2000E4A6611E89AE025A3A4D270DA1E42302A6E41F891E31BDE1F13596BDE9227EEE95
:201B40001BBDEA36BDEED23404BDEA39BDE922BDEA3396062605BDEED52003BDEE6B34049E
:201B6000E661BDECD635062705A7805A26FB7EEE62BDEA36BDE922C601340496062610BD95
:201B8000EED5E7E42791BDEA39BDE922BDE9129E523410BDEA39BDFB3B3414BDEA33AE6365
:201BA000BDEE203404E1662523A661271CE6665A3A3184EE62E661A6E4A0664CA161250C0E
:201BC000A680A1C0260C5A26F7E666215F32677EECBA6C66302120D98126265C32620F5212
:201BE0000F538E00529D7C814F2712814827239D82200C81381022EE4AC6038D2A9D7C2542
:201C0000F20F500F510F060F630F54C6A0D74F7EF1A59D7C250BBDEB6925E6814724E280D6
:201C200007C6048D0220EB680169841025F5EC5A26F58030AB01A7013935400F069E839DD3
:201C40007C8126279981B0275E81FF26089D7C8183102700AB9F836EC49E68300126D9C6EE
:201C6000167EE446AE9F00838CFF83102700748D238DE6BDEA36C680D708BDEB1E8D25BDC3
:201C8000EA33C6AEBDEA3B9E4BDC83ED84DC39ED027EE6D0C6B0BDEA3BC680D7088A80BD9C
:201CA000EB239F4B7EE90F8DEB3410BDEA2E8DF43540C632AE4227A9109E83EEC4DF83A68C
:201CC000043402EC84EE023476BDF3BEBDE90D3576ED84EF023502A7049D821026ED6410FA
:201CE0009F83399D7C8D0934108D2D3540AFC4395F9D7C240680301F899D7C9E8D583A39B2
:201D00008DEEAE843410BDEA2E8E004F96062707BDEE1E9E52960639C6AEBDEA3B7EEF0401
:201D20001027EEEDBDE757BDE4E59F939D82271081A7263B9D7C27048D24200486FF972B9F
:201D4000DE938CEEC4ECC42706EC42932B23F49E938D15BDE5059E93BDE4D57EE465BDE768
:201D6000577EE1FAA6C0A78011931B26F79F1B39BDFC599D7C8122260BBDEA10C63BBDEAF9
:201D80003BBDF128327EBDE80C3262BDEB1E9F3BBDE9128E00F34FBDECE37EE794BDE75795
:201DA0009E2B399E919F2B7EE4E5BDE50ACC000ADD95DD8F5FDD919D8224068DE09F959D2D
:201DC00082271BBDEA3924068DD39F919D82270EBDEA3924068DC69F8F2749BDE1FA8DC36E
:201DE0009F939E958DBF9C93253A8D1CBDFE7EBDE4D38DAF9F938D3A8D0F8D36BDFF19BD28
:201E0000E50ABDE4D37EE465864F97989E93DC958D150D982602ED02AE848D0BD38F25043F
:201E200081FA25EE7EEC113406EC84350626023262399E19301F30018DED30033001A68480
:201E400027F49F0F4A270C4A272A4A26EF8603A78020E7EC016A0227014FE6036A0427013C
:201E60005FED01DD2BBDE4E59E0F25E1DC476C80ED8420C66F84AE01AE029F4720EA9E1975
:201E800020049E8330018D9F300230019F839D7C4D27EF2AF99E8381FF27EF81A2271281E8
:201EA00084270E818126E79D7C81A0270481A126DB9D7C25049D8220D79E833410BDE7571A
:201EC0009E83A682BDFFB625F930011F10E061C0052720250A3384503085BDFD6820149F9C
:201EE000479E1B9F435030859F419F1BBDE41E9E459F8335108601A784A702A704D62B262B
:201F000004C6016C02E701D62C2604C6016C04E7039D82812C279A209C9E19301F3001ECE7
:201F200002DD68BDFE2730033001A68427EF4A271B800226F334108EFF76BDF125AEE4EC15
:201F400001BDF555BDF54EBDF0E535103410EC01DD52BDFC01BDF5623540C6053001A684D9
:201F600027055AA7C020F530C45D27BE31C433C5BDFD6830A420B3554C2000BDEF078E0170
:201F8000F0C60434045F860408530952594A26F85D260AA6E44A27058C01F0270CCB30C1F6
:201FA000392302CB07E7806F8435045A26D532628E01EF7EECDF81302504803A80C639811A
:201FC000891027FDAB7EEA43FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06
:201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000009B009E00AA00A700A100A4E048FA
:00000001FF

43
ROMS/6809/hex_addr_remap Normal file
View File

@@ -0,0 +1,43 @@
#!/usr/bin/perl -w
#
# read .HEX file. Apply offset to each record's address field and
# recompute the checksum accordingly.
# Application: .HEX file has absolute address. To go into a ROM, needs to
# relative address (ie relative to the start of the ROM)
#
# usage: hex_addr_remap <hex-offset> foo.hex > foo2.hex
#
# The offset, which should be in hex, is SUBTRACTED from each entry. Eg
# ROM assembled at 0xE000 will be
# hex_addr_remap e000 foo.hex > foo2.hex
$offset = hex($ARGV[0]);
open INFILE, $ARGV[1] or die "Could not open input file $ARGV[1]";
while (my $line = <INFILE>) {
$line =~/(\:)([0-9A-F][0-9A-F])([0-9A-F][0-9A-F][0-9A-F][0-9A-F])([0-9A-F][0-9A-F])(\w+)/;
my $len=hex($2); # 2 digits
my $adr=hex($3); # 4 digits
my $typ=hex($4); # 2 digits
my $dat=$5; # data and checksum
my $char = length $dat;
# adjust addresss
$adr = 0xffff & ($adr - $offset);
# do len adr typ
my $sum = $len + ($adr & 0xff) + (($adr>>8) & 0xff) + $typ;
printf ":%02X%04X%02X", $len, $adr, $typ;
# process the rest upto but excluding the last byte (the old checksum)
for (my $i=0; $i<($char-2); $i=$i+2) {
my $hex=substr $dat, $i, 2;
printf "%02X", hex($hex);
$sum = $sum + hex($hex);
}
my $current_csum = hex(substr $dat, $char -2, 2);
my $new_csum = (($sum ^ 0xff) + 1) & 0xff;
printf "%02X\r\n", $new_csum;
}
close INFILE;

View File

@@ -0,0 +1,54 @@
#!/usr/bin/env python3
# Direct port of the original Perl script
# Usage: python hex_addr_remap.py <hex-offset> foo.hex > foo2.hex
import sys
import re
# Check arguments
if len(sys.argv) != 3:
print("Usage: python hex_addr_remap.py <hex-offset> <input-file>")
sys.exit(1)
offset = int(sys.argv[1], 16) # Convert hex string to integer
try:
with open(sys.argv[2], 'r') as infile:
for line in infile:
# Match the same pattern as the Perl script
match = re.match(r'(\:)([0-9A-F][0-9A-F])([0-9A-F]{4})([0-9A-F][0-9A-F])(\w+)', line.upper())
if match:
# Extract components exactly as in Perl
len_hex = int(match.group(2), 16) # 2 digits
adr = int(match.group(3), 16) # 4 digits
typ = int(match.group(4), 16) # 2 digits
dat = match.group(5) # data and checksum
char = len(dat)
# Adjust address
adr = 0xffff & (adr - offset)
# Calculate sum as in original
sum_val = len_hex + (adr & 0xff) + ((adr>>8) & 0xff) + typ
# Build output string
output = f":{len_hex:02X}{adr:04X}{typ:02X}"
# Process data bytes
for i in range(0, char-2, 2):
hex_val = dat[i:i+2]
output += f"{int(hex_val, 16):02X}"
sum_val = sum_val + int(hex_val, 16)
# Calculate and append new checksum
new_csum = ((sum_val ^ 0xff) + 1) & 0xff
output += f"{new_csum:02X}"
# Print with single \r
sys.stdout.write(output + "\r")
# Add EOF record at the end
sys.stdout.write(":00000001FF\r")
except FileNotFoundError:
print(f"Could not open input file {sys.argv[2]}")
sys.exit(1)

10
ROMS/6809/readme.md Normal file
View File

@@ -0,0 +1,10 @@
Instructions to build the 6809 basic interpreter
- must run in dosbox
as9 basic.asm -now l s19
srec_cat basic.s19 -fill 0xFF -within basic.s19 -range-pad 32 -o basic.hex -intel -data-only -address-length=2
python hex_addr_remap.py E000 basic.hex >basic_remap.hex
remove the 1st 2 lines from basic_remap.hex

BIN
ROMS/6809/srec_cat.exe Normal file

Binary file not shown.

View File

@@ -1,345 +1,343 @@
:0430060000000000C6
:18000000F3C3A40000000000C332000000000000C31B000000000000BB
:18001800C36C003A0030FE002008CD730028FBDB81C9CD7A0028FBDB44
:1800300083C9F53A0030FE00200D1801F5CD600028FBF1D381C9F5CDB4
:18004800660028FBF1D383C9F5CD66002004F1E600C9F1D383F6FFC916
:18006000DB800FCB47C9DB820FCB47C93A0030FE002007DB80E601FE2D
:1800780000C9DB82E601FE00C9D7FE0A28FBFE1B20023E03C9FE0D2822
:180090000AFE0C2804FE203801CFC93E0DCF3E0ACF3E0DC9312A303E1B
:1800A80095D380D3823E00320030218103CD37012181032204302A0490
:1800C000307EB7280CCD5000280723220430C3BE00CD7300280F3E0094
:1800D800320030CD1B00FE20C2D1001812CD7A0028D43E01320030CD3A
:1800F0001B00FE20C2BE003E0CCD3C00CD5000CD3E0121B202CD3701E9
:18010800210801E5CD3E013E3ECFCD8100FE2038F9FE3ACAB501CD8DCA
:1801200000E65FFE42CAF601FE47CAAF01FE58CA0D023E3FCF18D57EDC
:18013800B7C8CF2318F93E0DCF3E0ACFC9CD8100FE03C8FE2038F6C907
:18015000CD450147CD45014FCD8F014F7B915F79C9210000CDA801FEED
:180168000D200E37C9210000CDA801FE0DC8FE2CC8FE0328EE29292956
:1801800029D630FE0A3802D607E60F856F18E178D630FE0A3802D6079A
:18019800070707074779D630FE0A3802D60780C9CD8100CD8D00C9CDC7
:1801B0006101D8E5C91E00CD500157CD500167CD50016FCD5001FE018D
:1801C8002009CD50017BA7281E18157AA7280BCD500177233E2ECF15E7
:1801E00018F1CD50017BA7C8217003CD3701C921AB03CD3701C9215E78
:1801F80003CD3701CD4501C8E65FFE43CAB603FE57CAB903C9211F021D
:18021000CD3701CD4501C8E65FFE59CA4002C90D0A426F6F7420435027
:180228002F4D3F000D0A4C6F6164696E672043502F4D2E2E2E0D0A005E
:18024000212C02CD370106183E0032063032073032083032093021002F
:18025800D0220230CD8A021100022A0230192202303A06303C32063021
:1802700010EA3A0030F52AFEFFE93A0830D38C3A0730D38B3A0630D32A
:180288008AC9F5C5E5DB89FE8020FACD7A023E00D3890E040680DB8991
:1802A000FEE020FADB8877230520F30D20EEE1C1F1C943502F4D204251
:1802B8006F6F7420524F4D20322E3020627920472E20536561726C6512
:1802D0000D0A0D0A4243206F72204257202D20524F4D204241534943CC
:1802E80020436F6C642F5761726D0D0A5820202020202020202D204298
:180300006F6F742043502F4D20286C6F61642024443030302D24464687
:180318004646290D0A3A6E6E6E6E2E2E2E202D204C6F616420496E744D
:18033000656C2D4865782066696C65207265636F72640D0A476E6E6E8B
:180348006E202020202D2052756E206C6F63206E6E6E6E0D0A000D0AC9
:18036000436F6C64206F72207761726D3F0D0A00436865636B73756DA2
:18037800206572726F720D0A000C5072657373205B73706163655D20EF
:18039000746F2061637469766174652074686520636F6E736F6C652E5F
:1803A8000D0A00436F6D706C6574650D0A00C3BC03C35A04DD21000035
:1803C000C3C7036D0CE31321B030F9C30220119406066321B0301A77A4
:1803D800231305C2D603F9CD9508CD630E325A3132A93121A904CD0131
:1803F00015CDB208CDBB0BB7C21004210D32237CB5CA22047E472F772A
:18040800BE70CAFE03C32204CD870CB7C26307EB2B3ED94677BE70C2DD
:18042000EB032B110C32CD2B0ADAEB0311CEFF225F3119220A31CD704F
:18043800082A0A3111EFFF1911A9317D936F7C9A67E5217204CD0115E1
:18045000E1CDA41B216304CD0115311631CD9508C3AE072042797465AE
:180468007320667265650D0A00005A383020424153494320566572207F
:18048000342E37620D0A436F70797269676874202843292031393738EC
:18049800206279204D6963726F736F66740D0A00004D656D6F727920CB
:1804B000746F7000191ADD1A2F1AB330C1134617EF13A31C821DBE1824
:1804C800F11CF71DFD1D5E1E731E9A17DE1E013173168B140D17821611
:1804E0009316001F931FA316D316DD16C54E44C64F52CE455854C44173
:1804F8005441C94E505554C4494DD2454144CC4554C74F544FD2554EBE
:18051000C946D24553544F5245C74F535542D2455455524ED2454DD389
:18052800544F50CF5554CF4ECE554C4CD7414954C44546D04F4B45C401
:180540004F4B45D3435245454ECC494E4553C34C53D749445448CD4F0B
:180558004E49544F52D34554D245534554D052494E54C34F4E54CC49BA
:180570005354C34C454152C34C4F4144C353415645CE4557D441422827
:18058800D44FC64ED3504328D448454ECE4F54D3544550ABADAAAFDE2B
:1805A000C14E44CF52BEBDBCD3474EC94E54C14253D55352C65245C9CF
:1805B8004E50D04F53D35152D24E44CC4F47C55850C34F53D3494ED4CF
:1805D000414EC1544ED045454BC445454BD04F494E54CC454ED3545201
:1805E80024D6414CC15343C3485224C8455824C2494E24CC45465424C7
:18060000D24947485424CD49442480050C020BDD0F520DE40E19121329
:180618000F690D0F0DF20CE10DCB0BFE0C2D0D540D030C5217C30D4436
:180630000C5817F713A117E91E540DCF1EC21EC71EFF1F0431073105CB
:180648000E310C770AAC0C540D540D6F08798B1B79BF177CFD187C5E04
:18066000197FAC1C5072114671114E46534E52474F4446434F564F4D5C
:18067800554C425344442F304944544D4F534C535354434E55464D4F6F
:180690004858424EC35A04C3820CD300C9D6006F7CDE006778DE004771
:1806A8003E00C9000000354ACA99391C76982295B3980ADD479853D102
:1806C00099990A1A9F9865BCCD98D6773E9852C74F80DB00C901FF1C44
:1806D80000001400140000000000C3A809C30000C30000C300000D32E6
:1806F000FEFFAA31204572726F720020696E20004F6B0D0A0000427254
:1807080065616B00210400397E23FE81C04E234623E569607AB3EBCA00
:180720002607EBCD2B0A010D00E1C809C31007CD4907C5E3C1CD2B0A85
:180738007E02C80B2BC33507E52A8A31060009093EE53ED0956F3EFFD8
:180750009CDA58076739E1D81E0CC377072A7931220C311E02011E1472
:18076800011E00011E12011E22011E0A011E18CD950832F530CD560E96
:18078000216A06573E3FCD3C0A197ECD3C0ACDBB0BCD3C0A21F406CDB1
:1807980001152A0C3111FEFFCD2B0ACAC7037CA53CC49C1B3EC1AF3270
:1807B000F530CD560E210007CD011521FFFF220C31CDA809DABB07CD6B
:1807C800BB0B3C3DCABB07F5CD870CD5CDBF0847D1F1D29B0BD5C5AFC6
:1807E000327C31CDBB0BB7F5CD4F08DAF407F1F5CA280DB7C5D20B08A4
:1807F800EB2A86311A020313CD2B0AC2FC076069228631D1F1CA3208BC
:180810002A8631E3C109E5CD2F07E1228631EB74D123237323722311EE
:1808280011311A772313B7C22A08CD7B0823EB626B7E23B6CABB0723D3
:180840002323AFBE23C24308EB732372C337082A0E31444D7E23B62B4C
:18085800C823237E23666FCD2B0A60697E23666F3FC83FD0C35208C0D0
:180870002A0E31AF772377232286312A0E312B227E312A5F3122733166
:18088800AFCDCB0B2A8631228831228A31C12A0A31F9216331226131E5
:1808A000AF6F67228431327B31228E31E5C52A7E31C93E3FCD3C0A3E0B
:1808B80020CD3C0AC3FE30AF325E310E051111317EFE20CA470947FE33
:1808D00022CA6709B7CA6E093A5E31B77EC24709FE3F3E9ECA47097EFB
:1808E800FE30DAF208FE3CDA4709D511EB04C5014309C5067F7EFE6184
:18090000DA0B09FE7BD20B09E65F774EEB23B6F20D09047EE67FC8B954
:18091800C20D09EBE5131AB7FA3F094F78FE88C22E09CDBB0B2B237E54
:18093000FE61DA3709E65FB9CA1D09E1C30B0948F1EBC9EB79C1D1238A
:1809480012130CD63ACA5509FE49C25809325E31D654C2C808477EB7CB
:18096000CA6E09B8CA470923120C13C35E092110311213121312C93A2D
:18097800F430B73E0032F430C28B0905CAA809CD3C0A3E052BCA9F092F
:180990007ECD3C0AC3B109052BCD3C0AC2B109CD3C0ACD630EC3A809BD
:1809A8002111310601AF32F430CD660A4FFE7FCA77093AF430B7CACACC
:1809C000093E00CD3C0AAF32F43079FE07CA0E0AFE03CC630E37C8FE25
:1809D8000DCA5E0EFE15CAA209FE40CA9F09FE5FCA9709FE08CA970955
:1809F000FE12C2090AC5D5E53600CD1320211131CD0115E1D1C1C3B128
:180A080009FE20DAB10978FE493E07D2230A7971327C312304CD3C0A15
:180A2000C3B109CD3C0A3E08C31D0A7C92C07D93C97EE3BE23E3CABBAD
:180A38000BC36307F53AF530B7C23615F1C5F5FE20DA600A3AF23047A6
:180A50003A5B3104CA5C0A05B8CC630E3C325B31F1C1CDFC1FC9CDC0B0
:180A68001EE67FFE0FC03AF5302F32F530AFC9CD870CC0C1CD4F08C5FF
:180A8000CDCD0AE14E23462378B1CAAE07CDD60ACDE60BC5CD630E5E8B
:180A9800235623E5EBCDA41B3E20E1CD3C0A7EB723CA830AF2A30AD6D8
:180AB0007F4F11EC041A13B7F2B50A0DC2B50AE67FCD3C0A1A13B7F2EE
:180AC800BF0AC3A60AE52AF83022F630E1C9E5D52AF63011FFFFED5A51
:180AE00022F630D1E1F0E52AF83022F630CDC01EFE03CAF90AE1C3D6A2
:180AF8000A2AF83022F630C35D043E64327B31CD690DC1E5CD520D2267
:180B1000773121020039CD1007D1C2320B09D52B562B5E2323E52A7761
:180B280031CD2B0AE1C2160BD1F9EB0E08CD4007E52A7731E3E52A0C2A
:180B400031E3CD2B10CD310AA6CD2810E5CD561AE1C5D5010081515A04
:180B58007EFEAB3E01C26E0BCDBB0BCD2810E5CD561ACD0A1AE1C5D5BE
:180B7000F533E52A7E31E30681C533CDE60B227E317EFE3ACA9B0BB7B9
:180B8800C26307237E23B6CA0D0C235E2356EB220C31EBCDBB0B117B7E
:180BA0000BD5C8D680DA690DFE25D26307074F0600EB210B06094E239D
:180BB80046C5EB237EFE3AD0FE20CABB0BFE303F3C3DC9EB2A0E31CA0B
:180BD000E00BEBCD870CE5CD4F086069D1D2280D2B228C31EBC9DFC8C8
:180BE800D7FE1B2811FE03280DFE13C0D7FE11C8FE03280718F63EFF9C
:180C000032FD30C0F6C0227E3121F6FFC12A0C31F57DA43CCA200C228E
:180C180082312A7E31228431AF32F530CD560EF1210607C29707C3AE3A
:180C3000072A84317CB51E20CA7707EB2A8231220C31EBC9CD8917C007
:180C480032F130C9E52AFA3006004F0922FA30E1C97EFE41D8FE5B3FBE
:180C6000C9CDBB0BCD2810CD0A1AFA820C3A9731FE90DAB21A0180905B
:180C7800110000E5CD851AE151C81E08C377072B110000CDBB0BD0E51D
:180C9000F5219819CD2B0ADA6307626B19291929F1D6305F160019EB7E
:180CA800E1C38B0CCA7F08CD640C2BCDBB0BE52A5F31CACF0CE1CD318A
:180CC0000A2CD5CD640C2BCDBB0BC26307E3EB7D935F7C9A57DA580707
:180CD800E52A863101280009CD2B0AD25807EB220A31E1225F31E1C35A
:180CF0007F08CA7B08CD7F08017B0BC30E0D0E03CD4007C1E5E52A0C79
:180D080031E33E8CF533C5CD870CCD540DE52A0C31CD2B0AE123DC52FA
:180D200008D44F0860692BD81E0EC37707C016FFCD0C07F9FE8C1E04F5
:180D3800C27707E1220C31237CB5C24C0D3A7C31B7C2AD07217B0BE316
:180D50003EE1013A0E0006007948477EB7C8B8C823FE22CA580DC35B08
:180D68000DCD1E12CD310AB4D53A5D31F5CD3A10F1E3227E311FCD2D46
:180D800010CABC0DE52A9431E523235E23562A0E31CD2B0AD2AB0D2AC3
:180D98000A31CD2B0AD1D2B30D216F31CD2B0AD2B30D3ED1CD6216EB0F
:180DB000CD9B14CD6216E1CD651AE1C9E5CD621AD1E1C9CD89177E47B8
:180DC800FE8CCAD20DCD310A882B4B0D78CAA30BCD880CFE2CC0C3D3FC
:180DE0000DCD3A107EFE88CAEF0DCD310AA92BCD2B10CD0A1ACA540D0D
:180DF800CDBB0BDA0F0DC3A20B2BCDBB0BCA630EC8FEA5CA960EFEA872
:180E1000CA960EE5FE2CCA7F0EFE3BCAB90EC1CD3A10E53A5D31B7C22E
:180E28004F0ECDAF1BCDBF1436202A9431342A94313AF2304704CA4BFA
:180E40000E043A5B31863DB8D4630ECD0415AFC40415E1C3010E3A5B48
:180E580031B7C8C3630E36002110313E0DCD3C0A3E0ACD3C0AAF325B11
:180E7000313AF1303DC8F5AFCD3C0AF1C3740E3AF330473A5B31B8D4F6
:180E8800630ED2B90ED60ED28D0E2FC3AE0EF5CD8617CD310A292BF19D
:180EA000D6A8E5CAA90E3A5B312F83D2B90E3C473E20CD3C0A05C2B2D8
:180EB8000EE1CDBB0BC3080E3F5265646F2066726F6D207374617274DC
:180ED0000D0A003A7D31B7C25D07C121C00ECD0115C3AE08CD6C147E57
:180EE800FE223E0032F530C2FE0ECDC014CD310A3BE5CD04153EE5CDD0
:180F0000B208C1DA0A0C237EB72BC5CA510D362CC3180FE52A8C31F6F0
:180F1800AF327D31E3C3240FCD310A2CCD1E12E3D57EFE2CCA4C0F3A69
:180F30007D31B7C2B90F3E3FCD3C0ACDB208D1C1DA0A0C237EB72BC5D9
:180F4800CA510DD53A5D31B7CA760FCDBB0B5747FE22CA6A0F3A7D314A
:180F6000B757CA670F163A062C2BCDC314EB21810FE3D5C3840DCDBBAA
:180F78000BCD111BE3CD621AE12BCDBB0BCA8D0FFE2CC2D30EE32BCD84
:180F9000BB0BC2200FD13A7D31B7EBC2E10BD5B621A80FC40115E1C9A2
:180FA8003F45787472612069676E6F7265640D0A00CD520DB7C2D20F49
:180FC000237E23B61E06CA7707235E2356EB227931EBCDBB0BFE83C2C1
:180FD800B90FC34C0F110000C41E12227E31CD0C07C26907F9D57E23C4
:180FF000F5D5CD481AE3E5CDB517E1CD621AE1CD591AE5CD851AE1C151
:1810080090CD591ACA1810EB220C316960C3770BF92A7E317EFE2CC27A
:181020007B0BCDBB0BCDE00FCD3A10F6373A5D318FB7E8C37507CD316C
:181038000A282B1600D50E01CD4007CDB1102280312A8031C178FE784A
:18105000D42B107E1600D6B3DA7210FE03D27210FE0117AABA57DA639D
:1810680007227531CDBB0BC356107AB7C299117E227531D6ACD8FE07A3
:18108000D05F3A5D313DB37BCAF71507835F215506197856BAD023CD5A
:181098002B10C5014910C5434ACD3B1A58514E234623C52A7531C33D5A
:1810B00010AF325D31CDBB0B1E24CA7707DA111BCD590CD21811FE2635
:1810C8002012CDBB0BFE48CA551FFE42CAC51F1E02CA7707FEACCAB14C
:1810E00010FE2ECA111BFEADCA0711FE22CAC014FEAACAF911FEA7CA90
:1810F8002414D6B6D22911CD3610CD310A29C9167DCD3D102A8031E596
:18111000CD331ACD2B10E1C9CD1E12E5EB2294313A5D31B7CC481AE1B9
:18112800C90600074FC5CDBB0B79FE31DA5011CD3610CD310A2CCD2C0F
:1811400010EB2A9431E3E5EBCD8917EBE3C35811CDFF10E3111311D5CA
:1811580001B404094E236669E915FEADC8FE2DC814FE2BC8FEACC82B77
:18117000C9F6AFF5CD2B10CD6D0CF1EBC1E3EBCD4B1AF5CD6D0CF1C12C
:181188007921E213C29411A34F78A2E9B34F78B2E921AB113A5D311F8B
:1811A0007A175F166478BAD0C39A10AD1179B71FC1D1F5CD2D1021EFB0
:1811B80011E5CA851AAF325D31D5CD44167E23234E2346D1C5F5CD483A
:1811D00016CD591AF157E17BB2C87AD601D8AFBB3CD0151D0ABE2303D4
:1811E800CAD7113FC3151A3C8FC1A0C6FF9FC31C1A165ACD3D10CD2B01
:1812000010CD6D0C7B2F4F7A2FCDE213C1C349102BCDBB0BC8CD310AB1
:181218002C011012C5F6AF325C3146CD590CDA6307AF4F325D31CDBB44
:181230000BDA3A12CD590CDA47124FCDBB0BDA3B12CD590CD23B12D6E0
:1812480024C256123C325D310F814FCDBB0B3A7B313DCA0313F2661265
:181260007ED628CADB12AF327B31E550592A8E31CD2B0A119031CA4B56
:18127800192A8831EB2A8631CD2B0ACA9912799623C28E12789623CA90
:18129000CD1223232323C38012E1E3D5111B11CD2B0AD1CAD012E3E569
:1812A800C50106002A8A31E509C1E5CD2F07E1228A3160692288312B59
:1812C0003600CD2B0AC2BF12D173237223EBE1C932973121FF062294E4
:1812D80031E1C9E52A5C31E357D5C5CD610CC1F1EBE3E5EB3C577EFE1A
:1812F0002CCAE112CD310A29228031E1225C311E00D511E5F52A8831A8
:181308003E19EB2A8A31EBCD2B0ACA3B137EB923C21D137EB8235E237B
:181320005623C209133A5C31B7C26C07F1444DCA4B1996CA99131E10C1
:18133800C37707110400F1CA820C712370234FCD4007232322753171F5
:18135000233A5C311779010B00D25E13C10371237023F5E5CDF61AEB2F
:18136800E1F13DC25613F5424BEB19DA5807CD4907228A312B3600CD4C
:181380002B0AC27C1303572A75315EEB2909EB2B2B73237223F1DABD36
:1813980013474F7E2316E15E235623E3F5CD2B0AD23613E5CDF61AD17A
:1813B00019F13D444DC29E132929C109EB2A8031C92A8A31EB2100003E
:1813C800393A5D31B7CADD13CD4416CD44152A0A31EB2A73317D934FD1
:1813E0007C9A41501E00215D31730690C3211A3A5B3147AFC3E313CD38
:1813F8007A14CD6C1401520DC5D5CD310A28CD1E12E5EB2B562B5EE120
:18141000CD2B10CD310A29CD310AB4444DE3712370C3B914CD7A14D597
:18142800CDFF10CD2B10E35E2356237AB3CA6F077E23666FE52A8E313A
:18144000E3228E312A9231E52A9031E5219031D5CD621AE1CD28102B1D
:18145800CDBB0BC26307E1229031E1229231E1228E31E1C9E52A0C317B
:18147000237CB5E1C01E16C37707CD310AA73E80327B31B647CD2312B0
:18148800C32B10CD2B10CDAF1BCDBF14CD4416019F16C57E2323E5CDF7
:1814A0001A15E14E2346CDB314E56FCD3716D1C9CD1A15216F31E577B8
:1814B8002323732372E1C92B062250E50EFF237E0CB7CAD514BACAD51F
:1814D00014B8C2C614FE22CCBB0BE323EB79CDB314116F312A6131225D
:1814E80094313E01325D31CD651ACD2B0A226131E17EC01E1EC377078A
:1815000023CDBF14CD4416CD591A1C1DC80ACD3C0AFE0DCC6D0E03C373
:181518000B15B70EF1F52A0A31EB2A73312F4F06FF0923CD2B0ADA380F
:181530001522733123EBF1C9F11E1ACA7707BFF5011C15C52A5F312208
:181548007331210000E52A0A31E5216331EB2A6131EBCD2B0A015515E3
:18156000C2A9152A8631EB2A8831EBCD2B0ACA7C157E2323B7CDAC15F3
:18157800C36615C1EB2A8A31EBCD2B0ACAD215CD591A7BE509B7F27B21
:1815900015227531E14E0600090923EB2A7531EBCD2B0ACA7C15019B5D
:1815A80015C5F6807E23235E235623F0B7C8444D2A7331CD2B0A606984
:1815C000D8E1E3CD2B0AE3E56069D0C1F1F1E5D5C5C9D1E17DB4C82B53
:1815D800462B4EE52B2B6E26000950592B444D2A7331CD3207E17123B6
:1815F0007069602BC34715C5E52A9431E3CDB110E3CD2C107EE52A9449
:1816080031E5861E1CDA7707CDB014D1CD4816E3CD4716E52A7131EB66
:18162000CD2E16CD2E16214610E3E5C3E114E1E37E23234E23466F2CBF
:181638002DC80A120313C33816CD2C102A9431EBCD6216EBC0D5505911
:181650001B4E2A7331CD2B0AC260164709227331E1C92A61312B462BF9
:181668004E2B2BCD2B0AC0226131C901F213C5CD4116AF57325D317E54
:18168000B7C901F213C5CD7716CA820C23235E23561AC93E01CDB01485
:18169800CD8C172A713173C1C3E114CD3C17AFE34FE57EB8DAB11678DD
:1816B000110E00C5CD1A15C1E1E5232346236668060009444DCDB3140A
:1816C8006FCD3716D1CD4816C3E114CD3C17D1D51A90C3A716EB7ECDA7
:1816E00041170405CA820CC51EFFFE29CAF616CD310A2CCD8917CD31BB
:1816F8000A29F1E301A916C53DBE0600D04F7E91BB47D843C9CD7716DF
:18171000CA2A185F23237E23666FE5194672E3C57EFE24C22B17CD5576
:181728001F180DFE25C23517CDC51F1803CD111BC1E170C9EBCD310AA1
:1817400029C1D1C543C9CD8C1732EF30CDEE30C3F213CD7617C3B6308E
:18175800CD7617F51E002BCDBB0BCA6C17CD310A2CCD8917C1CDEE30B4
:18177000ABA0CA6D17C9CD891732EF3032B730CD310A2CC38917CDBB09
:181788000BCD2810CD670C7AB7C2820C2BCDBB0B7BC9CD6D0C1AC3F261
:1817A00013CD2810CD6D0CD5CD310A2CCD8917D112C921881CCD591AAC
:1817B800C3C417CD591A21C1D1CD331A78B7C83A9731B7CA4B1A90D22D
:1817D000DE172F3CEBCD3B1AEBCD4B1AC1D1FE19D0F5CD701A67F1CD8D
:1817E8008918B4219431F20418CD6918D24A182334CA72072E01CD9FE9
:1818000018C34A18AF90477E9B5F237E9A57237E994FDC75186863AF97
:181818004779B7C237184A54656F78D608FEE0C21818AF329731C90521
:18183000297A1757798F4FF22F18785C45B7CA4A182197318677D22A21
:1818480018C878219731B7FC5C1846237EE680A94FC34B1A1CC014C003
:181860000CC00E8034C0C372077E835F237E8A57237E894FC9219831D8
:181878007E2F77AF6F90477D9B5F7D9A577D994FC90600D608DA9818BE
:18189000435A510E00C38B18C6096FAF2DC8791F4F7A1F577B1F5F78B4
:1818A8001F47C39B180000008103AA561980F122768045AA3882CD0AA6
:1818C0001AB7EA820C2197317E01358011F30490F570D5C5CDC417C1AA
:1818D800D104CD601921AD18CDBB1721B118CD521D018080110000CD53
:1818F000C417F1CD851B01318011187221C1D1CD0A1AC82E00CDC81912
:181908007932A631EB22A7310100005058211518E5212119E5E52194AA
:18192000317E23B7CA4D19E52E081F6779D23B19E52AA73119EBE13AB0
:18193800A631891F4F7A1F577B1F5F781F472D7CC22A19E1C9435A51BC
:181950004FC9CD3B1A012084110000CD4B1AC1D1CD0A1ACA66072EFF76
:18196800CDC81934342B7E32C2302B7E32BE302B7E32BA3041EBAF4FCC
:18198000575F32C530E5C57DCDB930DE003FD2981932C530F1F137D2E3
:18199800C1E1793C3D1FFA4B18177B175F7A175779174F297817473A1F
:1819B000C5301732C53079B2B3C28519E521973135E1C28519C372072E
:1819C80078B7CAEC197D219731AE80471FA878F2EB19C68077CA4B190E
:1819E000CD701A772BC9CD0A1A2FE1B7E1F22A18C37207CD561A78B7B8
:1819F800C8C602DA720747CDC41721973134C0C372073A9731B7C83A31
:181A10009631FE2F179FC03CC9CD0A1A06881100002197314F70060011
:181A280023368017C31218CD0A1AF02196317EEE8077C9EB2A9431E317
:181A4000E52A9631E3E5EBC9CD591AEB2294316069229631EBC921940F
:181A5800315E2356234E234623C911943106041A77132305C2671AC9F0
:181A70002196317E07371F773F1F2323777907371F4F1FAEC978B7CA55
:181A88000A1A21131AE5CD0A1A79C8219631AE79F8CD9F1A1FA9C9237C
:181AA00078BEC02B79BEC02B7ABEC02B7B96C0E1E1C9474F575FB7C8A1
:181AB800E5CD561ACD701AAE67FCD61A3E9890CD89187C17DC5C1806DF
:181AD00000DC7518E1C91B7AA33CC00BC92197317EFE983A9431D07E99
:181AE800CDB21A36987BF57917CD1218F1C921000078B1C83E1029DA6B
:181B00003613EB29EBD20C1B09DA36133DC2FE1AC9FE2DF5CA1D1BFE60
:181B18002BCA1D1B2BCD2A1847575F2F4FCDBB0BDA6E1BFE2ECA491B83
:181B3000FE45C24D1BCDBB0BCD6111CDBB0BDA901B14C24D1BAF935F67
:181B48000C0CCA251BE57B90F4661BF25C1BF5CD5219F13CC2501BD13D
:181B6000F1CC331AEBC9C8F5CDF319F13DC9D557788947C5E5D5CDF36F
:181B780019F1D630CD851BE1C1D1C3251BCD3B1ACD1C1AC1D1C3C4170D
:181B90007B0707830786D6305FC33B1BE521FB06CD0115E1EBAF069823
:181BA800CD211A210015E5219931E5CD0A1A3620F2BD1B362D23363035
:181BC000CA731CE5FC331AAFF5CD791C01439111F84FCD851AB7E2EA64
:181BD8001BF1CD671BF5C3CC1BCD5219F13CF5CD791CCDB2173CCDB2EE
:181BF0001ACD4B1A010603F1813CFA061CFE08D2061C3C473E023D3D86
:181C0800E1F5118C1C05C2171C362E2336302305362ECC601AC5E5D5FD
:181C2000CD561AE1062F047B965F237A9E5723799E4F2B2BD2261CCD93
:181C3800691823CD4B1AEBE17023C10DC2171C05CA571C2B7EFE30CAB9
:181C50004B1CFE2EC4601AF1CA761C364523362BF2671C362D2F3C0616
:181C68002F04D60AD2691CC63A237023772371E1C901749411F723CD8E
:181C8000851AB7E1E2E11BE900000080A08601102700E8030064000021
:181C98000A000001000021331AE3E9CD3B1A21881CCD481AC1D1CD0A70
:181CB0001A78CAF11CF2BC1CB7CA6607B7CA2B18D5C579F67FCD561A72
:181CC800F2D91CD5C5CDDD1AC1D1F5CD851AE17C1FE1229631E12294EF
:181CE00031DC9E1CCC331AD5C5CDBE18C1D1CDFF18CD3B1A013881116C
:181CF8003BAACDFF183A9731FE88D2E619CDDD1AC680C602DAE619F512
:181D100021AD18CDB517CDF618F1C1D1F5CDC117CD331A21311DCD618D
:181D28001D110000C14AC3FF1808402E9474704F2E776E02887AE6A0B6
:181D40002A7C50AAAA7EFFFF7F7F0000808100000081CD3B1A11FD18FD
:181D5800D5E5CD561ACDFF18E1CD3B1A7E23CD481A06F1C1D13DC8D562
:181D7000C5F5E5CDFF18E1CD591AE5CDC417E1C36A1DCD0A1A21C930F4
:181D8800FAE31D21EA30CD481A21C930C886E6070600772387874F0984
:181DA000CD591ACDFF183AC8303CE6030600FE018832C83021E71D874D
:181DB800874F09CDB517CD561A7B59EE4F4F36802B46368021C73034D5
:181DD0007ED6ABC2DA1D770C151CCD151821EA30C3621A772B772B7760
:181DE800C3BE1D68B1466899E9926910D1756821411ECDB517CD3B1A08
:181E000001498311DB0FCD4B1AC1D1CD6019CD3B1ACDDD1AC1D1CDC1F2
:181E18001721451ECDBB17CD0A1A37F22D1ECDB217CD0A1AB7F5F433B9
:181E30001A21451ECDB517F1D4331A21491EC3521DDB0F4981000000E3
:181E48007F05BAD71E866426998758342387E05DA586DA0F4983CD3BC4
:181E60001ACDFD1DC1E1CD3B1AEBCD4B1ACDF71DC35E19CD0A1AFC9EE2
:181E78001CFC331A3A9731FE81DA901E0100815159CD601921BB17E59A
:181E9000219A1ECD521D21411EC9094AD73B78026E847BFEC12F7C74B2
:181EA800319A7D843D5A7DC87F917EE4BB4C7E6CAAAA7F00000081C9FA
:181EC000D7C93E0CC3FC1FCD89177B32F230C9CD2810CD6D0CED53F6BC
:181ED80030ED53F830C9CD6D0CD5E146237EC3E313CD2810CD6D0CD5D5
:181EF000CD310A2CCD2810CD6D0CE3732372E1C9CD2B10CD6D0CC52192
:181F080099317AFE00280CCD381F78FE302802702371237BCD381F7A17
:181F2000FE00200578FE30280270237123AF772377C1219931C39114BB
:181F380047E60FFE0A3802C607C6304F780F0F0F0FE60FFE0A3802C650
:181F500007C63047C9EB210000CD6E1FDA8E1F1805CD6E1F381F29295F
:181F68002929B56F18F3131AFE20CA6E1FD630D8FE0A3805D607FE0A36
:181F8000D8FE103FC9EB7A4BE5CDE213E1C91E26C37707CD2B10CD6D93
:181F98000CC521993106110578FE012808CB13CB1230F41804CB13CB0E
:181FB000123E30CE0077230520F3AF772377C1219931C39114EB210039
:181FC80000CDE21FDAF01FD63029B56FCDE21F30F6EB7A4BE5CDE213AC
:181FE000E1C9131AFE20CAE21FFE30D8FE323FC91E28C37707DD21FF67
:181FF800FFC3C703C30800C300003E0032FD30C3CE03ED45F5A0C1B846
:092010003E00C9CD3C0AC3630E79
:00000001FF
:0430040000000000C8
:18000000F3C3940000000000C332000000000000C31B000000000000CB
:18001800C35C003A0030FE002008CD630028FBDB81C9CD6A0028FBDB74
:1800300083C9F53A0030FE00200D1801F5CD500028FBF1D381C9F5CDC4
:18004800560028FBF1D383C9DB800FCB47C9DB820FCB47C93A0030FE23
:18006000002007DB80E601FE00C9DB82E601FE00C9D7FE0A28FBFE1B32
:1800780020023E03C9FE0D280AFE0C2804FE203801CFC93E0DCF3E0A80
:18009000CF3E0DC93128303E95D380D3823E00320030216503CD1B015F
:1800A8003E01320030216503CD1B01CD6300280F3E00320030CD1B003E
:1800C000FE20C2B3001814CD6A0028E73E01320030CD1B00FE20C2B307
:1800D8000018003E0CCD3C00CD4600CD2201219602CD1B0121EC00E50E
:1800F000CD22013E3ECFCD7100FE2038F9FE3ACA9901CD7D00E65FFE07
:1801080042CADA01FE47CA9301FE58CAF1013E3FCF18D57EB7C8CF231B
:1801200018F93E0DCF3E0ACFC9CD7100FE03C8FE2038F6C9CD29014762
:18013800CD29014FCD73014F7B915F79C9210000CD8C01FE0D200E3741
:18015000C9210000CD8C01FE0DC8FE2CC8FE0328EE29292929D630FECF
:180168000A3802D607E60F856F18E178D630FE0A3802D60707070707C3
:180180004779D630FE0A3802D60780C9CD7100CD7D00C9CD4501D8E518
:18019800C91E00CD340157CD340167CD34016FCD3401FE012009CD340A
:1801B000017BA7281E18157AA7280BCD340177233E2ECF1518F1CD3457
:1801C800017BA7C8215403CD1B01C9218A03CD1B01C9214203CD1B015B
:1801E000CD2901C8E65FFE43CA9503FE57CA9803C9210302CD1B01CD01
:1801F8002901C8E65FFE59CA2402C90D0A426F6F742043502F4D3F008F
:180210000D0A4C6F6164696E672043502F4D2E2E2E0D0A00211002CD31
:180228001B0106183E003204303205303206303207302100D022023063
:18024000CD6E021100022A0230192202303A04303C32043010EA3A0049
:1802580030F52AFEFFE93A0630D38C3A0530D38B3A0430D38AC9F5C56F
:18027000E5DB89FE8020FACD5E023E00D3890E040680DB89FEE020FADA
:18028800DB8877230520F30D20EEE1C1F1C943502F4D20426F6F7420EF
:1802A000524F4D20322E3020627920472E20536561726C650D0A0D0A6E
:1802B8004243206F72204257202D20524F4D20424153494320436F6CD4
:1802D000642F5761726D0D0A5820202020202020202D20426F6F74207C
:1802E80043502F4D20286C6F61642024443030302D2446464646290D50
:180300000A3A6E6E6E6E2E2E2E202D204C6F616420496E74656C2D48E1
:1803180065782066696C65207265636F72640D0A476E6E6E6E2020201B
:18033000202D2052756E206C6F63206E6E6E6E0D0A000D0A436F6C642D
:18034800206F72207761726D3F0D0A00436865636B73756D20657272D3
:180360006F720D0A000C5072657373205B53504143455D20746F2061AC
:180378006374697661746520636F6E736F6C650D0A00436F6D706C65F3
:1803900074650D0A00C39B03C33904DD210000C3A6034C0CC21321B09C
:1803A80030F9C3E11F117306066321B0301A77231305C2B503F9CD74DD
:1803C00008CD420E325A3132A931218804CDE014CD9108CD9A0BB7C278
:1803D800EF03210D32237CB5CA01047E472F77BE70CADD03C30104CDC0
:1803F000660CB7C24207EB2B3ED94677BE70C2CA032B110C32CD0A0ABF
:18040800DACA0311CEFF225F3119220A31CD4F082A0A3111EFFF19117D
:18042000A9317D936F7C9A67E5215104CDE014E1CD831B214204CDE072
:1804380014311631CD7408C38D0720427974657320667265650D0A0080
:18045000005A38302042415349432056657220342E37620D0A436F70AF
:18046800797269676874202843292031393738206279204D6963726F23
:18048000736F66740D0A00004D656D6F727920746F7000F819BC1A0EB0
:180498001AB330A0132517CE13821C611D9D18D01CD61DDC1D3D1E5229
:1804B0001E7917BD1E013152166A14EC1661167216DF1E721F8216B2BA
:1804C80016BC16C54E44C64F52CE455854C4415441C94E505554C44900
:1804E0004DD2454144CC4554C74F544FD2554EC946D24553544F5245D5
:1804F800C74F535542D2455455524ED2454DD3544F50CF5554CF4ECEFF
:18051000554C4CD7414954C44546D04F4B45C44F4B45D3435245454E50
:18052800CC494E4553C34C53D749445448CD4F4E49544F52D34554D278
:1805400045534554D052494E54C34F4E54CC495354C34C454152C34CFF
:180558004F4144C353415645CE4557D4414228D44FC64ED3504328D443
:1805700048454ECE4F54D3544550ABADAAAFDEC14E44CF52BEBDBCD35E
:18058800474EC94E54C14253D55352C65245C94E50D04F53D35152D20D
:1805A0004E44CC4F47C55850C34F53D3494ED4414EC1544ED045454BA8
:1805B800C445454BD04F494E54CC454ED3545224D6414CC15343C348C7
:1805D0005224C8455824C2494E24CC45465424D24947485424CD49444C
:1805E8002480E40BE10ABC0F310DC30EF811F20E480DEE0CD10CC00DA1
:18060000AA0BDD0C0C0D330DE20B3117A20D230C3717D6138017C81E24
:18061800330DAE1EA11EA61EDE1F04310731E40D100C560A8B0C330D8D
:18063000330D4E08796A1B799E177CDC187C3D197F8B1C505111465040
:18064800114E46534E52474F4446434F564F4D554C425344442F3049F8
:1806600044544D4F534C535354434E55464D4F4858424EC33904C36199
:180678000CD300C9D6006F7CDE006778DE00473E00C9000000354ACACF
:1806900099391C76982295B3980ADD479853D199990A1A9F9865BCCDEF
:1806A80098D6773E9852C74F80DB00C901FF1C000014001400000000AF
:1806C00000C38709C30000C30000C300000D32FEFFAA31204572726FB7
:1806D800720020696E20004F6B0D0A0000427265616B00210400397EEF
:1806F00023FE81C04E234623E569607AB3EBCA0507EBCD0A0A010D0040
:18070800E1C809C3EF06CD2807C5E3C1CD0A0A7E02C80B2BC31407E5E8
:180720002A8A31060009093EE53ED0956F3EFF9CDA37076739E1D81E27
:180738000CC356072A7931220C311E02011E14011E00011E12011E2266
:18075000011E0A011E18CD740832F530CD350E214906573E3FCD1B0A4B
:18076800197ECD1B0ACD9A0BCD1B0A21D306CDE0142A0C3111FEFFCD8F
:180780000A0ACAA6037CA53CC47B1B3EC1AF32F530CD350E21DF06CD3B
:18079800E01421FFFF220C31CD8709DA9A07CD9A0B3C3DCA9A07F5CDE7
:1807B000660CD5CD9E0847D1F1D27A0BD5C5AF327C31CD9A0BB7F5CD04
:1807C8002E08DAD307F1F5CA070DB7C5D2EA07EB2A86311A020313CD61
:1807E0000A0AC2DB076069228631D1F1CA11082A8631E3C109E5CD0EB4
:1807F80007E1228631EB74D12323732372231111311A772313B7C209EB
:1808100008CD5A0823EB626B7E23B6CA9A07232323AFBE23C22208EB2C
:18082800732372C316082A0E31444D7E23B62BC823237E23666FCD0AF8
:180840000A60697E23666F3FC83FD0C33108C02A0E31AF772377232217
:1808580086312A0E312B227E312A5F31227331AFCDAA0B2A8631228830
:1808700031228A31C12A0A31F9216331226131AF6F67228431327B31A0
:18088800228E31E5C52A7E31C93E3FCD1B0A3E20CD1B0AC3FE30AF329A
:1808A0005E310E051111317EFE20CA260947FE22CA4609B7CA4D093A25
:1808B8005E31B77EC22609FE3F3E9ECA26097EFE30DAD108FE3CDA26C8
:1808D00009D511CA04C5012209C5067F7EFE61DAEA08FE7BD2EA08E64C
:1808E8005F774EEB23B6F2EC08047EE67FC8B9C2EC08EBE5131AB7FA5E
:180900001E094F78FE88C20D09CD9A0B2B237EFE61DA1609E65FB9CA35
:18091800FC08E1C3EA0848F1EBC9EB79C1D12312130CD63ACA3409FEE1
:1809300049C23709325E31D654C2A708477EB7CA4D09B8CA2609231286
:180948000C13C33D092110311213121312C93AF430B73E0032F430C27D
:180960006A0905CA8709CD1B0A3E052BCA7E097ECD1B0AC39009052B00
:18097800CD1B0AC29009CD1B0ACD420EC387092111310601AF32F43049
:18099000CD450A4FFE7FCA56093AF430B7CAA9093E00CD1B0AAF32F4A8
:1809A8003079FE07CAED09FE03CC420E37C8FE0DCA3D0EFE15CA810926
:1809C000FE40CA7E09FE5FCA7609FE08CA7609FE12C2E809C5D5E53623
:1809D80000CDF21F211131CDE014E1D1C1C39009FE20DA900978FE49E6
:1809F0003E07D2020A7971327C312304CD1B0AC39009CD1B0A3E08C393
:180A0800FC097C92C07D93C97EE3BE23E3CA9A0BC34207F53AF530B77F
:180A2000C21515F1C5F5FE20DA3F0A3AF230473A5B3104CA3B0A05B8AD
:180A3800CC420E3C325B31F1C1CDDB1FC9CD9F1EE67FFE0FC03AF53033
:180A50002F32F530AFC9CD660CC0C1CD2E08C5CDAC0AE14E2346237852
:180A6800B1CA8D07CDB50ACDC50BC5CD420E5E235623E5EBCD831B3EE9
:180A800020E1CD1B0A7EB723CA620AF2820AD67F4F11CB041A13B7F205
:180A9800940A0DC2940AE67FCD1B0A1A13B7F29E0AC3850AE52AF830DD
:180AB00022F630E1C9E5D52AF63011FFFFED5A22F630D1E1F0E52AF8EB
:180AC8003022F630CD9F1EFE03CAD80AE1C3B50A2AF83022F630C33C6B
:180AE000043E64327B31CD480DC1E5CD310D22773121020039CDEF06BF
:180AF800D1C2110B09D52B562B5E2323E52A7731CD0A0AE1C2F50AD1FE
:180B1000F9EB0E08CD1F07E52A7731E3E52A0C31E3CD0A10CD100AA6A3
:180B2800CD0710E5CD351AE1C5D5010081515A7EFEAB3E01C24D0BCDDB
:180B40009A0BCD0710E5CD351ACDE919E1C5D5F533E52A7E31E3068179
:180B5800C533CDC50B227E317EFE3ACA7A0BB7C24207237E23B6CAEC28
:180B70000B235E2356EB220C31EBCD9A0B115A0BD5C8D680DA480DFE2B
:180B880025D24207074F0600EB21EA05094E2346C5EB237EFE3AD0FEA7
:180BA00020CA9A0BFE303F3C3DC9EB2A0E31CABF0BEBCD660CE5CD2E0D
:180BB800086069D1D2070D2B228C31EBC9DFC8D7FE1B2811FE03280DD9
:180BD000FE13C0D7FE11C8FE03280718F63EFF32FD30C0F6C0227E316D
:180BE80021F6FFC12A0C31F57DA43CCAFF0B2282312A7E31228431AF5D
:180C000032F530CD350EF121E506C27607C38D072A84317CB51E20CACA
:180C18005607EB2A8231220C31EBC9CD6817C032F130C9E52AFA300625
:180C3000004F0922FA30E1C97EFE41D8FE5B3FC9CD9A0BCD0710CDE95C
:180C480019FA610C3A9731FE90DA911A018090110000E5CD641AE1517B
:180C6000C81E08C356072B110000CD9A0BD0E5F5219819CD0A0ADA4247
:180C780007626B19291929F1D6305F160019EBE1C36A0CCA5E08CD4342
:180C90000C2BCD9A0BE52A5F31CAAE0CE1CD100A2CD5CD430C2BCD9A09
:180CA8000BC24207E3EB7D935F7C9A57DA3707E52A863101280009CD97
:180CC0000A0AD23707EB220A31E1225F31E1C35E08CA5A08CD5E0801B3
:180CD8005A0BC3ED0C0E03CD1F07C1E5E52A0C31E33E8CF533C5CD6620
:180CF0000CCD330DE52A0C31CD0A0AE123DC3108D42E0860692BD81E99
:180D08000EC35607C016FFCDEB06F9FE8C1E04C25607E1220C31237C6F
:180D2000B5C22B0D3A7C31B7C28C07215A0BE33EE1013A0E00060079C9
:180D380048477EB7C8B8C823FE22CA370DC33A0DCDFD11CD100AB4D5F1
:180D50003A5D31F5CD1910F1E3227E311FCD0C10CA9B0DE52A9431E500
:180D680023235E23562A0E31CD0A0AD28A0D2A0A31CD0A0AD1D2920D1B
:180D8000216F31CD0A0AD2920D3ED1CD4116EBCD7A14CD4116E1CD44B9
:180D98001AE1C9E5CD411AD1E1C9CD68177E47FE8CCAB10DCD100A8865
:180DB0002B4B0D78CA820BCD670CFE2CC0C3B20DCD19107EFE88CACE9B
:180DC8000DCD100AA92BCD0A10CDE919CA330DCD9A0BDAEE0CC3810BF6
:180DE0002BCD9A0BCA420EC8FEA5CA750EFEA8CA750EE5FE2CCA5E0E54
:180DF800FE3BCA980EC1CD1910E53A5D31B7C22E0ECD8E1BCD9E1436F6
:180E1000202A9431342A94313AF2304704CA2A0E043A5B31863DB8D4D6
:180E2800420ECDE314AFC4E314E1C3E00D3A5B31B7C8C3420E360021F4
:180E400010313E0DCD1B0A3E0ACD1B0AAF325B313AF1303DC8F5AFCDA4
:180E58001B0AF1C3530E3AF330473A5B31B8D4420ED2980ED60ED26C68
:180E70000E2FC38D0EF5CD6517CD100A292BF1D6A8E5CA880E3A5B31DC
:180E88002F83D2980E3C473E20CD1B0A05C2910EE1CD9A0BC3E70D3FA6
:180EA0005265646F2066726F6D2073746172740D0A003A7D31B7C23CDA
:180EB80007C1219F0ECDE014C38D08CD4B147EFE223E0032F530C2DD75
:180ED0000ECD9F14CD100A3BE5CDE3143EE5CD9108C1DAE90B237EB741
:180EE8002BC5CA300D362CC3F70EE52A8C31F6AF327D31E3C3030FCDFB
:180F0000100A2CCDFD11E3D57EFE2CCA2B0F3A7D31B7C2980F3E3FCD02
:180F18001B0ACD9108D1C1DAE90B237EB72BC5CA300DD53A5D31B7CA69
:180F3000550FCD9A0B5747FE22CA490F3A7D31B757CA460F163A062C5C
:180F48002BCDA214EB21600FE3D5C3630DCD9A0BCDF01AE3CD411AE148
:180F60002BCD9A0BCA6C0FFE2CC2B20EE32BCD9A0BC2FF0ED13A7D31E3
:180F7800B7EBC2C00BD5B621870FC4E014E1C93F45787472612069675B
:180F90006E6F7265640D0A00CD310DB7C2B10F237E23B61E06CA560711
:180FA800235E2356EB227931EBCD9A0BFE83C2980FC32B0F110000C467
:180FC000FD11227E31CDEB06C24807F9D57E23F5D5CD271AE3E5CD94FB
:180FD80017E1CD411AE1CD381AE5CD641AE1C190CD381ACAF70FEB2283
:180FF0000C316960C3560BF92A7E317EFE2CC25A0BCD9A0BCDBF0FCD44
:181008001910F6373A5D318FB7E8C35407CD100A282B1600D50E01CD65
:181020001F07CD90102280312A8031C178FE78D40A107E1600D6B3DAE3
:181038005110FE03D25110FE0117AABA57DA4207227531CD9A0BC335E5
:18105000107AB7C278117E227531D6ACD8FE07D05F3A5D313DB37BCA2B
:18106800D61507835F213406197856BAD023CD0A10C5012810C5434A76
:18108000CD1A1A58514E234623C52A7531C31C10AF325D31CD9A0B1E51
:1810980024CA5607DAF01ACD380CD2F710FE262012CD9A0BFE48CA341B
:1810B0001FFE42CAA41F1E02CA5607FEACCA9010FE2ECAF01AFEADCA6C
:1810C800E610FE22CA9F14FEAACAD811FEA7CA0314D6B6D20811CD1543
:1810E00010CD100A29C9167DCD1C102A8031E5CD121ACD0A10E1C9CD6C
:1810F800FD11E5EB2294313A5D31B7CC271AE1C90600074FC5CD9A0B52
:1811100079FE31DA2F11CD1510CD100A2CCD0B10EB2A9431E3E5EBCDBE
:181128006817EBE3C33711CDDE10E311F210D5019304094E236669E907
:1811400015FEADC8FE2DC814FE2BC8FEACC82BC9F6AFF5CD0A10CD4C17
:181158000CF1EBC1E3EBCD2A1AF5CD4C0CF1C17921C113C27311A34F85
:1811700078A2E9B34F78B2E9218A113A5D311F7A175F166478BAD0C37D
:1811880079108C1179B71FC1D1F5CD0C1021CE11E5CA641AAF325D31CE
:1811A000D5CD23167E23234E2346D1C5F5CD2716CD381AF157E17BB2D7
:1811B800C87AD601D8AFBB3CD0151D0ABE2303CAB6113FC3F4193C8F2D
:1811D000C1A0C6FF9FC3FB19165ACD1C10CD0A10CD4C0C7B2F4F7A2F54
:1811E800CDC113C1C328102BCD9A0BC8CD100A2C01EF11C5F6AF325C21
:181200003146CD380CDA4207AF4F325D31CD9A0BDA1912CD380CDA26E5
:18121800124FCD9A0BDA1A12CD380CD21A12D624C235123C325D310FC8
:18123000814FCD9A0B3A7B313DCAE212F245127ED628CABA12AF327BCC
:1812480031E550592A8E31CD0A0A119031CA2A192A8831EB2A8631CDAA
:181260000A0ACA7812799623C26D12789623CAAC1223232323C35F1222
:18127800E1E3D511FA10CD0A0AD1CAAF12E3E5C50106002A8A31E50906
:18129000C1E5CD0E07E1228A3160692288312B3600CD0A0AC29E12D1D7
:1812A80073237223EBE1C932973121DE06229431E1C9E52A5C31E35708
:1812C000D5C5CD400CC1F1EBE3E5EB3C577EFE2CCAC012CD100A29220A
:1812D8008031E1225C311E00D511E5F52A88313E19EB2A8A31EBCD0A13
:1812F0000ACA1A137EB923C2FC127EB8235E235623C2E8123A5C31B72E
:18130800C24B07F1444DCA2A1996CA78131E10C35607110400F1CA61C0
:181320000C712370234FCD1F07232322753171233A5C311779010B003B
:18133800D23D13C10371237023F5E5CDD51AEBE1F13DC23513F5424B74
:18135000EB19DA3707CD2807228A312B3600CD0A0AC25B1303572A7525
:18136800315EEB2909EB2B2B73237223F1DA9C13474F7E2316E15E232C
:181380005623E3F5CD0A0AD21513E5CDD51AD119F13D444DC27D132964
:1813980029C109EB2A8031C92A8A31EB210000393A5D31B7CABC13CDAC
:1813B0002316CD23152A0A31EB2A73317D934F7C9A41501E00215D31F6
:1813C800730690C3001A3A5B3147AFC3C213CD5914CD4B1401310DC569
:1813E000D5CD100A28CDFD11E5EB2B562B5EE1CD0A10CD100A29CD10A7
:1813F8000AB4444DE3712370C39814CD5914D5CDDE10CD0A10E35E2323
:1814100056237AB3CA4E077E23666FE52A8E31E3228E312A9231E52AFB
:181428009031E5219031D5CD411AE1CD07102BCD9A0BC24207E1229027
:1814400031E1229231E1228E31E1C9E52A0C31237CB5E1C01E16C356A3
:1814580007CD100AA73E80327B31B647CD0212C30A10CD0A10CD8E1B33
:18147000CD9E14CD2316017E16C57E2323E5CDF914E14E2346CD9214F7
:18148800E56FCD1616D1C9CDF914216F31E5772323732372E1C92B0645
:1814A0002250E50EFF237E0CB7CAB414BACAB414B8C2A514FE22CC9AD5
:1814B8000BE323EB79CD9214116F312A61312294313E01325D31CD44D0
:1814D0001ACD0A0A226131E17EC01E1EC3560723CD9E14CD2316CD382D
:1814E8001A1C1DC80ACD1B0AFE0DCC4C0E03C3EA14B70EF1F52A0A31D0
:18150000EB2A73312F4F06FF0923CD0A0ADA171522733123EBF1C9F105
:181518001E1ACA5607BFF501FB14C52A5F31227331210000E52A0A31E8
:18153000E5216331EB2A6131EBCD0A0A013415C288152A8631EB2A886F
:1815480031EBCD0A0ACA5B157E2323B7CD8B15C34515C1EB2A8A31EBD3
:18156000CD0A0ACAB115CD381A7BE509B7F25A15227531E14E0600095C
:181578000923EB2A7531EBCD0A0ACA5B15017A15C5F6807E23235E235E
:181590005623F0B7C8444D2A7331CD0A0A6069D8E1E3CD0A0AE3E560AD
:1815A80069D0C1F1F1E5D5C5C9D1E17DB4C82B462B4EE52B2B6E2600A3
:1815C0000950592B444D2A7331CD1107E171237069602BC32615C5E571
:1815D8002A9431E3CD9010E3CD0B107EE52A9431E5861E1CDA5607CDF6
:1815F0008F14D1CD2716E3CD2616E52A7131EBCD0D16CD0D16212510A7
:18160800E3E5C3C014E1E37E23234E23466F2C2DC80A120313C317167A
:18162000CD0B102A9431EBCD4116EBC0D550591B4E2A7331CD0A0AC2C9
:181638003F164709227331E1C92A61312B462B4E2B2BCD0A0AC0226165
:1816500031C901D113C5CD2016AF57325D317EB7C901D113C5CD561634
:18166800CA610C23235E23561AC93E01CD8F14CD6B172A713173C1C372
:18168000C014CD1B17AFE34FE57EB8DA901678110E00C5CDF914C1E12B
:18169800E5232346236668060009444DCD92146FCD1616D1CD2716C3BF
:1816B000C014CD1B17D1D51A90C38616EB7ECD20170405CA610CC51E10
:1816C800FFFE29CAD516CD100A2CCD6817CD100A29F1E3018816C53D4B
:1816E000BE0600D04F7E91BB47D843C9CD5616CA09185F23237E23664A
:1816F8006FE5194672E3C57EFE24C20A17CD341F180DFE25C21417CD68
:18171000A41F1803CDF01AC1E170C9EBCD100A29C1D1C543C9CD6B1784
:1817280032EF30CDEE30C3D113CD5517C3B630CD5517F51E002BCD9A06
:181740000BCA4B17CD100A2CCD6817C1CDEE30ABA0CA4C17C9CD6817C2
:1817580032EF3032B730CD100A2CC36817CD9A0BCD0710CD460C7AB714
:18177000C2610C2BCD9A0B7BC9CD4C0C1AC3D113CD0710CD4C0CD5CDC0
:18178800100A2CCD6817D112C921671CCD381AC3A317CD381A21C1D1F9
:1817A000CD121A78B7C83A9731B7CA2A1A90D2BD172F3CEBCD1A1AEB02
:1817B800CD2A1AC1D1FE19D0F5CD4F1A67F1CD6818B4219431F2E31739
:1817D000CD4818D229182334CA51072E01CD7E18C32918AF90477E9B13
:1817E8005F237E9A57237E994FDC54186863AF4779B7C216184A546543
:181800006F78D608FEE0C2F717AF329731C905297A1757798F4FF20E7E
:1818180018785C45B7CA29182197318677D20918C878219731B7FC3BD5
:181830001846237EE680A94FC32A1A1CC014C00CC00E8034C0C3510723
:181848007E835F237E8A57237E894FC92198317E2F77AF6F90477D9B49
:181860005F7D9A577D994FC90600D608DA7718435A510E00C36A18C621
:18187800096FAF2DC8791F4F7A1F577B1F5F781F47C37A1800000081B8
:1818900003AA561980F122768045AA3882CDE919B7EA610C2197317EAE
:1818A80001358011F30490F570D5C5CDA317C1D104CD3F19218C18CD07
:1818C0009A17219018CD311D018080110000CDA317F1CD641B013180F3
:1818D80011187221C1D1CDE919C82E00CDA7197932A631EB22A73101F0
:1818F0000000505821F417E5210019E5E52194317E23B7CA2C19E52EC3
:18190800081F6779D21A19E52AA73119EBE13AA631891F4F7A1F577B7C
:181920001F5F781F472D7CC20919E1C9435A514FC9CD1A1A012084115F
:181938000000CD2A1AC1D1CDE919CA45072EFFCDA71934342B7E32C250
:18195000302B7E32BE302B7E32BA3041EBAF4F575F32C530E5C57DCDC6
:18196800B930DE003FD2771932C530F1F137D2C1E1793C3D1FFA2A18FE
:18198000177B175F7A175779174F297817473AC5301732C53079B2B336
:18199800C26419E521973135E1C26419C3510778B7CACB197D21973177
:1819B000AE80471FA878F2CA19C68077CA2A19CD4F1A772BC9CDE9195C
:1819C8002FE1B7E1F20918C35107CD351A78B7C8C602DA510747CDA36D
:1819E0001721973134C0C351073A9731B7C83A9631FE2F179FC03CC9B6
:1819F800CDE91906881100002197314F70060023368017C3F117CDE94A
:181A100019F02196317EEE8077C9EB2A9431E3E52A9631E3E5EBC9CDC5
:181A2800381AEB2294316069229631EBC92194315E2356234E23462362
:181A4000C911943106041A77132305C2461AC92196317E07371F773FB5
:181A58001F2323777907371F4F1FAEC978B7CAE91921F219E5CDE91904
:181A700079C8219631AE79F8CD7E1A1FA9C92378BEC02B79BEC02B7A40
:181A8800BEC02B7B96C0E1E1C9474F575FB7C8E5CD351ACD4F1AAE672A
:181AA000FCB51A3E9890CD68187C17DC3B180600DC5418E1C91B7AA3BE
:181AB8003CC00BC92197317EFE983A9431D07ECD911A36987BF57917B6
:181AD000CDF117F1C921000078B1C83E1029DA1513EB29EBD2EB1A0905
:181AE800DA15133DC2DD1AC9FE2DF5CAFC1AFE2BCAFC1A2BCD091847BC
:181B0000575F2F4FCD9A0BDA4D1BFE2ECA281BFE45C22C1BCD9A0BCD21
:181B18004011CD9A0BDA6F1B14C22C1BAF935F0C0CCA041BE57B90F4EB
:181B3000451BF23B1BF5CD3119F13CC22F1BD1F1CC121AEBC9C8F5CDB8
:181B4800D219F13DC9D557788947C5E5D5CDD219F1D630CD641BE1C113
:181B6000D1C3041BCD1A1ACDFB19C1D1C3A3177B0707830786D6305FCB
:181B7800C31A1BE521DA06CDE014E1EBAF0698CD001A21DF14E5219903
:181B900031E5CDE9193620F29C1B362D233630CA521CE5FC121AAFF584
:181BA800CD581C01439111F84FCD641AB7E2C91BF1CD461BF5C3AB1B52
:181BC000CD3119F13CF5CD581CCD91173CCD911ACD2A1A010603F181DD
:181BD8003CFAE51BFE08D2E51B3C473E023D3DE1F5116B1C05C2F61B64
:181BF000362E2336302305362ECC3F1AC5E5D5CD351AE1062F047B9679
:181C08005F237A9E5723799E4F2B2BD2051CCD481823CD2A1AEBE17064
:181C200023C10DC2F61B05CA361C2B7EFE30CA2A1CFE2EC43F1AF1CADC
:181C3800551C364523362BF2461C362D2F3C062F04D60AD2481CC63AB3
:181C5000237023772371E1C901749411F723CD641AB7E1E2C01BE90054
:181C6800000080A08601102700E803006400000A000001000021121ADF
:181C8000E3E9CD1A1A21671CCD271AC1D1CDE91978CAD01CF29B1CB7DE
:181C9800CA4507B7CA0A18D5C579F67FCD351AF2B81CD5C5CDBC1AC113
:181CB000D1F5CD641AE17C1FE1229631E1229431DC7D1CCC121AD5C5F6
:181CC800CD9D18C1D1CDDE18CD1A1A013881113BAACDDE183A9731FEB9
:181CE00088D2C519CDBC1AC680C602DAC519F5218C18CD9417CDD5185F
:181CF800F1C1D1F5CDA017CD121A21101DCD401D110000C14AC3DE1892
:181D100008402E9474704F2E776E02887AE6A02A7C50AAAA7EFFFF7F9C
:181D28007F0000808100000081CD1A1A11DC18D5E5CD351ACDDE18E122
:181D4000CD1A1A7E23CD271A06F1C1D13DC8D5C5F5E5CDDE18E1CD3830
:181D58001AE5CDA317E1C3491DCDE91921C930FAC21D21EA30CD271AD8
:181D700021C930C886E6070600772387874F09CD381ACDDE183AC830EC
:181D88003CE6030600FE018832C83021C61D87874F09CD9417CD351A69
:181DA0007B59EE4F4F36802B46368021C730347ED6ABC2B91D770C1573
:181DB8001CCDF41721EA30C3411A772B772B77C39D1D68B1466899E945
:181DD000926910D1756821201ECD9417CD1A1A01498311DB0FCD2A1A91
:181DE800C1D1CD3F19CD1A1ACDBC1AC1D1CDA01721241ECD9A17CDE9DB
:181E00001937F20C1ECD9117CDE919B7F5F4121A21241ECD9417F1D4AE
:181E1800121A21281EC3311DDB0F49810000007F05BAD71E866426997E
:181E30008758342387E05DA586DA0F4983CD1A1ACDDC1DC1E1CD1A1A56
:181E4800EBCD2A1ACDD61DC33D19CDE919FC7D1CFC121A3A9731FE81A0
:181E6000DA6F1E0100815159CD3F19219A17E521791ECD311D21201EC9
:181E7800C9094AD73B78026E847BFEC12F7C74319A7D843D5A7DC87F38
:181E9000917EE4BB4C7E6CAAAA7F00000081C9D7C93E0CC3DB1FCD685D
:181EA800177B32F230C9CD0710CD4C0CED53F630ED53F830C9CD4C0CAE
:181EC000D5E146237EC3C213CD0710CD4C0CD5CD100A2CCD0710CD4CE7
:181ED8000CE3732372E1C9CD0A10CD4C0CC52199317AFE00280CCD1705
:181EF0001F78FE302802702371237BCD171F7AFE00200578FE302802D9
:181F080070237123AF772377C1219931C3701447E60FFE0A3802C6079C
:181F2000C6304F780F0F0F0FE60FFE0A3802C607C63047C9EB2100009A
:181F3800CD4D1FDA6D1F1805CD4D1F381F29292929B56F18F3131AFE47
:181F500020CA4D1FD630D8FE0A3805D607FE0AD8FE103FC9EB7A4BE598
:181F6800CDC113E1C91E26C35607CD0A10CD4C0CC52199310611057862
:181F8000FE012808CB13CB1230F41804CB13CB123E30CE007723052069
:181F9800F3AF772377C1219931C37014EB210000CDC11FDACF1FD63004
:181FB00029B56FCDC11F30F6EB7A4BE5CDC113E1C9131AFE20CAC11F24
:181FC800FE30D8FE323FC91E28C35607DD21FFFFC3A603C30800C30067
:181FE000003E0032FD30C3AD03ED45F5A0C1B83E00C9CD1B0AC3420E8D
:00000001FF

View File

@@ -1,144 +1,144 @@
-- megafunction wizard: %ROM: 1-PORT%
-- GENERATION: STANDARD
-- VERSION: WM1.0
-- MODULE: altsyncram
-- ============================================================
-- File Name: Z80_CPM_BASIC_ROM.vhd
-- Megafunction Name(s):
-- altsyncram
--
-- Simulation Library Files(s):
-- altera_mf
-- ============================================================
-- ************************************************************
-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
--
-- 17.0.0 Build 595 04/25/2017 SJ Lite Edition
-- ************************************************************
--Copyright (C) 2017 Intel Corporation. All rights reserved.
--Your use of Intel Corporation's design tools, logic functions
--and other software and tools, and its AMPP partner logic
--functions, and any output files from any of the foregoing
--(including device programming or simulation files), and any
--associated documentation or information are expressly subject
--to the terms and conditions of the Intel Program License
--Subscription Agreement, the Intel Quartus Prime License Agreement,
--the Intel MegaCore Function License Agreement, or other
--applicable license agreement, including, without limitation,
--that your use is for the sole purpose of programming logic
--devices manufactured by Intel and sold by Intel or its
--authorized distributors. Please refer to the applicable
--agreement for further details.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY altera_mf;
USE altera_mf.altera_mf_components.all;
ENTITY Z80_CPM_BASIC_ROM IS
PORT
(
address : IN STD_LOGIC_VECTOR (12 DOWNTO 0);
clock : IN STD_LOGIC := '1';
q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
);
END Z80_CPM_BASIC_ROM;
ARCHITECTURE SYN OF z80_cpm_basic_rom IS
SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0);
BEGIN
q <= sub_wire0(7 DOWNTO 0);
altsyncram_component : altsyncram
GENERIC MAP (
address_aclr_a => "NONE",
clock_enable_input_a => "BYPASS",
clock_enable_output_a => "BYPASS",
init_file => "./ROMS/Z80/BASMON.HEX",
intended_device_family => "Cyclone V",
lpm_hint => "ENABLE_RUNTIME_MOD=NO",
lpm_type => "altsyncram",
numwords_a => 8192,
operation_mode => "ROM",
outdata_aclr_a => "NONE",
outdata_reg_a => "UNREGISTERED",
widthad_a => 13,
width_a => 8,
width_byteena_a => 1
)
PORT MAP (
address_a => address,
clock0 => clock,
q_a => sub_wire0
);
END SYN;
-- ============================================================
-- CNX file retrieval info
-- ============================================================
-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0"
-- Retrieval info: PRIVATE: AclrAddr NUMERIC "0"
-- Retrieval info: PRIVATE: AclrByte NUMERIC "0"
-- Retrieval info: PRIVATE: AclrOutput NUMERIC "0"
-- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0"
-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8"
-- Retrieval info: PRIVATE: BlankMemory NUMERIC "0"
-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0"
-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0"
-- Retrieval info: PRIVATE: Clken NUMERIC "0"
-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0"
-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A"
-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0"
-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone V"
-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0"
-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE"
-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0"
-- Retrieval info: PRIVATE: MIFfilename STRING "./ROMS/Z80/CPM_BASIC.HEX"
-- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "8192"
-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0"
-- Retrieval info: PRIVATE: RegAddr NUMERIC "1"
-- Retrieval info: PRIVATE: RegOutput NUMERIC "0"
-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"
-- Retrieval info: PRIVATE: SingleClock NUMERIC "1"
-- Retrieval info: PRIVATE: UseDQRAM NUMERIC "0"
-- Retrieval info: PRIVATE: WidthAddr NUMERIC "13"
-- Retrieval info: PRIVATE: WidthData NUMERIC "8"
-- Retrieval info: PRIVATE: rden NUMERIC "0"
-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
-- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE"
-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS"
-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS"
-- Retrieval info: CONSTANT: INIT_FILE STRING "./ROMS/Z80/CPM_BASIC.HEX"
-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone V"
-- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO"
-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram"
-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "8192"
-- Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM"
-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE"
-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "UNREGISTERED"
-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "13"
-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8"
-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1"
-- Retrieval info: USED_PORT: address 0 0 13 0 INPUT NODEFVAL "address[12..0]"
-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock"
-- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]"
-- Retrieval info: CONNECT: @address_a 0 0 13 0 address 0 0 13 0
-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0
-- Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0
-- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM.vhd TRUE
-- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM.inc FALSE
-- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM.cmp TRUE
-- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM.bsf FALSE
-- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM_inst.vhd FALSE
-- Retrieval info: LIB_FILE: altera_mf
-- megafunction wizard: %ROM: 1-PORT%
-- GENERATION: STANDARD
-- VERSION: WM1.0
-- MODULE: altsyncram
-- ============================================================
-- File Name: Z80_CPM_BASIC_ROM.vhd
-- Megafunction Name(s):
-- altsyncram
--
-- Simulation Library Files(s):
-- altera_mf
-- ============================================================
-- ************************************************************
-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
--
-- 17.0.0 Build 595 04/25/2017 SJ Lite Edition
-- ************************************************************
--Copyright (C) 2017 Intel Corporation. All rights reserved.
--Your use of Intel Corporation's design tools, logic functions
--and other software and tools, and its AMPP partner logic
--functions, and any output files from any of the foregoing
--(including device programming or simulation files), and any
--associated documentation or information are expressly subject
--to the terms and conditions of the Intel Program License
--Subscription Agreement, the Intel Quartus Prime License Agreement,
--the Intel MegaCore Function License Agreement, or other
--applicable license agreement, including, without limitation,
--that your use is for the sole purpose of programming logic
--devices manufactured by Intel and sold by Intel or its
--authorized distributors. Please refer to the applicable
--agreement for further details.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY altera_mf;
USE altera_mf.altera_mf_components.all;
ENTITY Z80_CPM_BASIC_ROM IS
PORT
(
address : IN STD_LOGIC_VECTOR (12 DOWNTO 0);
clock : IN STD_LOGIC := '1';
q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
);
END Z80_CPM_BASIC_ROM;
ARCHITECTURE SYN OF z80_cpm_basic_rom IS
SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0);
BEGIN
q <= sub_wire0(7 DOWNTO 0);
altsyncram_component : altsyncram
GENERIC MAP (
address_aclr_a => "NONE",
clock_enable_input_a => "BYPASS",
clock_enable_output_a => "BYPASS",
init_file => "./ROMS/Z80/intMon.hex",
intended_device_family => "Cyclone V",
lpm_hint => "ENABLE_RUNTIME_MOD=NO",
lpm_type => "altsyncram",
numwords_a => 8192,
operation_mode => "ROM",
outdata_aclr_a => "NONE",
outdata_reg_a => "UNREGISTERED",
widthad_a => 13,
width_a => 8,
width_byteena_a => 1
)
PORT MAP (
address_a => address,
clock0 => clock,
q_a => sub_wire0
);
END SYN;
-- ============================================================
-- CNX file retrieval info
-- ============================================================
-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0"
-- Retrieval info: PRIVATE: AclrAddr NUMERIC "0"
-- Retrieval info: PRIVATE: AclrByte NUMERIC "0"
-- Retrieval info: PRIVATE: AclrOutput NUMERIC "0"
-- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0"
-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8"
-- Retrieval info: PRIVATE: BlankMemory NUMERIC "0"
-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0"
-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0"
-- Retrieval info: PRIVATE: Clken NUMERIC "0"
-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0"
-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A"
-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0"
-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone V"
-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0"
-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE"
-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0"
-- Retrieval info: PRIVATE: MIFfilename STRING "./ROMS/Z80/CPM_BASIC.HEX"
-- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "8192"
-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0"
-- Retrieval info: PRIVATE: RegAddr NUMERIC "1"
-- Retrieval info: PRIVATE: RegOutput NUMERIC "0"
-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"
-- Retrieval info: PRIVATE: SingleClock NUMERIC "1"
-- Retrieval info: PRIVATE: UseDQRAM NUMERIC "0"
-- Retrieval info: PRIVATE: WidthAddr NUMERIC "13"
-- Retrieval info: PRIVATE: WidthData NUMERIC "8"
-- Retrieval info: PRIVATE: rden NUMERIC "0"
-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
-- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE"
-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS"
-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS"
-- Retrieval info: CONSTANT: INIT_FILE STRING "./ROMS/Z80/CPM_BASIC.HEX"
-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone V"
-- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO"
-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram"
-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "8192"
-- Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM"
-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE"
-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "UNREGISTERED"
-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "13"
-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8"
-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1"
-- Retrieval info: USED_PORT: address 0 0 13 0 INPUT NODEFVAL "address[12..0]"
-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock"
-- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]"
-- Retrieval info: CONNECT: @address_a 0 0 13 0 address 0 0 13 0
-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0
-- Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0
-- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM.vhd TRUE
-- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM.inc FALSE
-- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM.cmp TRUE
-- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM.bsf FALSE
-- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM_inst.vhd FALSE
-- Retrieval info: LIB_FILE: altera_mf

341
ROMS/Z80/intMon.hex Normal file
View File

@@ -0,0 +1,341 @@
:0430060000000000C6
:18000000F3C3A40000000000C332000000000000C31B000000000000BB
:18001800C36C003A0030FE002008CD730028FBDB81C9CD7A0028FBDB44
:1800300083C9F53A0030FE00200D1801F5CD600028FBF1D381C9F5CDB4
:18004800660028FBF1D383C9F5CD66002004F1E600C9F1D383F6FFC916
:18006000DB800FCB47C9DB820FCB47C93A0030FE002007DB80E601FE2D
:1800780000C9DB82E601FE00C9D7FE0A28FBFE1B20023E03C9FE0D2822
:180090000AFE0C2804FE203801CFC93E0DCF3E0ACF3E0DC9312A303E1B
:1800A80095D380D3823E00320030210E03CD3701210E032204302A0476
:1800C000307EB7280CCD5000280723220430C3BE00CD7300280F3E0094
:1800D800320030CD1B00FE20C2D1001812CD7A0028D43E01320030CD3A
:1800F0001B00FE20C2BE003E0CCD3C00CD5000CD3E01219C02CD3701FF
:18010800210801E5CD3E013E3ECFCD8100FE2038F9FE3ACAB501CD8DCA
:1801200000E65FFE49CAF601FE47CAAF01FE58CAFA013E3FCF18D57EE9
:18013800B7C8CF2318F93E0DCF3E0ACFC9CD8100FE03C8FE2038F6C907
:18015000CD450147CD45014FCD8F014F7B915F79C9210000CDA801FEED
:180168000D200E37C9210000CDA801FE0DC8FE2CC8FE0328EE29292956
:1801800029D630FE0A3802D607E60F856F18E178D630FE0A3802D6079A
:18019800070707074779D630FE0A3802D60780C9CD8100CD8D00C9CDC7
:1801B0006101D8E5C91E00CD500157CD500167CD50016FCD5001FE018D
:1801C8002009CD50017BA7281E18157AA7280BCD500177233E2ECF15E7
:1801E00018F1CD50017BA7C821FD02CD3701C9213403CD3701C9C33FE0
:1801F80003C9210C02CD3701CD4501C8E65FFE59CA2A02C90D0A426FF1
:180210006F742043502F4D3F000D0A4C6F6164696E672043502F4D0D74
:180228000A00211902CD370106183E0032063032073032083032093071
:180240002100D0220230CD74021100022A0230192202303A06303C3264
:18025800063010EA3A0030F52AFEFFE93A0830D38C3A0730D38B3A060F
:1802700030D38AC9F5C5E5DB89FE8020FACD64023E00D3890E04068020
:18028800DB89FEE020FADB8877230520F30D20EEE1C1F1C943502F4D67
:1802A00020426F6F7420524F4D20322E300D0A492D5374727420496EC3
:1802B8007472700D0A582D426F6F742043502F4D0D0A3A6E6E6E6E2D43
:1802D0004C6F6164204920726372640D0A476E6E6E6E2D52206C6F636F
:1802E8000D0A000D0A436F6C64206F72207761726D3F0D0A0043686510
:18030000636B73756D206572726F720D0A000C5072657373205B7370EA
:180318006163655D20746F20616374697661746520636F6E736F6C65C0
:180330002E0D0A00436F6D706C6574650D0A0021EB02CD3701CD4501FA
:18034800C8E65FFE43CA5603FE57CA5903C9C35C03C3FA03DD21000008
:18036000C367030D0C831321B030F9C3A21F113406066321B0301A77E5
:18037800231305C27603F9CD3508CD030E325A3132A931214904CDA171
:1803900014CD5208CD5B0BB7C2B003210D32237CB5CAC2037E472F770D
:1803A800BE70CA9E03C3C203CD270CB7C20307EB2B3ED94677BE70C2BF
:1803C0008B032B110C32CDCB09DA8B0311CEFF225F3119220A31CD1031
:1803D800082A0A3111EFFF1911A9317D936F7C9A67E5211204CDA11403
:1803F000E1CD441B210304CDA114311631CD3508C34E072042797465F0
:180408007320667265650D0A00005A38302042415349432056657220DF
:18042000342E37620D0A436F707972696768742028432920313937384C
:18043800206279204D6963726F736F66740D0A00004D656D6F7279202B
:18045000746F7000B9197D1ACF19B3306113E6168F13431C221D5E18E7
:18046800911C971D9D1DFE1D131E3A177E1E013113162B14AD16221693
:180480003316A01E331F431673167D16C54E44C64F52CE455854C44114
:180498005441C94E505554C4494DD2454144CC4554C74F544FD2554E1E
:1804B000C946D24553544F5245C74F535542D2455455524ED2454DD3EA
:1804C800544F50CF5554CF4ECE554C4CD7414954C44546D04F4B45C462
:1804E0004F4B45D3435245454ECC494E4553C34C53D749445448CD4F6C
:1804F8004E49544F52D34554D245534554D052494E54C34F4E54CC491B
:180510005354C34C454152C34C4F4144C353415645CE4557D441422887
:18052800D44FC64ED3504328D448454ECE4F54D3544550ABADAAAFDE8B
:18054000C14E44CF52BEBDBCD3474EC94E54C14253D55352C65245C92F
:180558004E50D04F53D35152D24E44CC4F47C55850C34F53D3494ED42F
:18057000414EC1544ED045454BC445454BD04F494E54CC454ED3545261
:1805880024D6414CC15343C3485224C8455824C2494E24CC4546542427
:1805A000D24947485424CD49442480A50BA20A7D0FF20C840EB911B32E
:1805B8000E090DAF0C920C810D6B0B9E0CCD0CF40CA30BF216630DE41D
:1805D0000BF81697134117891EF40C6F1E621E671E9F1F04310731A5EF
:1805E8000DD10B170A4C0CF40CF40C0F08792B1B795F177C9D187CFE29
:18060000187F4C1C5012114611114E46534E52474F4446434F564F4DDD
:18061800554C425344442F304944544D4F534C535354434E55464D4FCF
:180630004858424EC3FA03C3220CD300C9D6006F7CDE006778DE004792
:180648003E00C9000000354ACA99391C76982295B3980ADD479853D162
:1806600099990A1A9F9865BCCD98D6773E9852C74F80DB00C901FF1CA4
:1806780000001400140000000000C34809C30000C30000C300000D32A6
:18069000FEFFAA31204572726F720020696E20004F6B0D0A00004272B4
:1806A80065616B00210400397E23FE81C04E234623E569607AB3EBCA61
:1806C000C606EBCDCB09010D00E1C809C3B006CDE906C5E3C1CDCB09CB
:1806D8007E02C80B2BC3D506E52A8A31060009093EE53ED0956F3EFF9A
:1806F0009CDAF8066739E1D81E0CC317072A7931220C311E02011E1494
:18070800011E00011E12011E22011E0A011E18CD350832F530CDF60DB7
:18072000210A06573E3FCDDC09197ECDDC09CD5B0BCDDC09219406CD54
:18073800A1142A0C3111FEFFCDCB09CA67037CA53CC43C1B3EC1AF3252
:18075000F530CDF60D21A006CDA11421FFFF220C31CD4809DA5B07CDAE
:180768005B0B3C3DCA5B07F5CD270CD5CD5F0847D1F1D23B0BD5C5AF06
:18078000327C31CD5B0BB7F5CDEF07DA9407F1F5CAC80CB7C5D2AB07E7
:18079800EB2A86311A020313CDCB09C29C076069228631D1F1CAD2073E
:1807B0002A8631E3C109E5CDCF06E1228631EB74D123237323722311B0
:1807C80011311A772313B7C2CA07CD1B0823EB626B7E23B6CA5B072355
:1807E0002323AFBE23C2E307EB732372C3D7072A0E31444D7E23B62B6F
:1807F800C823237E23666FCDCB0960697E23666F3FC83FD0C3F207C0F3
:180810002A0E31AF772377232286312A0E312B227E312A5F31227331C6
:18082800AFCD6B0B2A8631228831228A31C12A0A31F9216331226131A5
:18084000AF6F67228431327B31228E31E5C52A7E31C93E3FCDDC093ECC
:1808580020CDDC09C3FE30AF325E310E051111317EFE20CAE70847FE55
:1808700022CA0709B7CA0E093A5E31B77EC2E708FE3F3E9ECAE7087EDD
:18088800FE30DA9208FE3CDAE708D5118B04C501E308C5067F7EFE6166
:1808A000DAAB08FE7BD2AB08E65F774EEB23B6F2AD08047EE67FC8B9D8
:1808B800C2AD08EBE5131AB7FADF084F78FE88C2CE08CD5B0B2B237E38
:1808D000FE61DAD708E65FB9CABD08E1C3AB0848F1EBC9EB79C1D1230E
:1808E80012130CD63ACAF508FE49C2F808325E31D654C26808477EB74E
:18090000CA0E09B8CAE70823120C13C3FE082110311213121312C93AAF
:18091800F430B73E0032F430C22B0905CA4809CDDC093E052BCA3F0910
:180930007ECDDC09C35109052BCDDC09C25109CDDC09CD030EC34809C0
:180948002111310601AF32F430CD060A4FFE7FCA17093AF430B7CA6A4C
:18096000093E00CDDC09AF32F43079FE07CAAE09FE03CC030E37C8FEA7
:180978000DCAFE0DFE15CA4209FE40CA3F09FE5FCA3709FE08CA370996
:18099000FE12C2A909C5D5E53600CDB31F211131CDA114E1D1C1C3510B
:1809A80009FE20DA510978FE493E07D2C3097971327C312304CDDC0998
:1809C000C35109CDDC093E08C3BD097C92C07D93C97EE3BE23E3CA5B90
:1809D8000BC30307F53AF530B7C2D614F1C5F5FE20DA000A3AF2304728
:1809F0003A5B3104CAFC0905B8CC030E3C325B31F1C1CD9C1FC9CD6092
:180A08001EE67FFE0FC03AF5302F32F530AFC9CD270CC0C1CDEF07C520
:180A2000CD6D0AE14E23462378B1CA4E07CD760ACD860BC5CD030E5ECB
:180A3800235623E5EBCD441B3E20E1CDDC097EB723CA230AF2430AD6B9
:180A50007F4F118C041A13B7F2550A0DC2550AE67FCDDC091A13B7F2CF
:180A68005F0AC3460AE52AF83022F630E1C9E5D52AF63011FFFFED5A71
:180A800022F630D1E1F0E52AF83022F630CD601EFE03CA990AE1C37622
:180A98000A2AF83022F630C3FD033E64327B31CD090DC1E5CDF20C22E9
:180AB000773121020039CDB006D1C2D20A09D52B562B5E2323E52A7784
:180AC80031CDCB09E1C2B60AD1F9EB0E08CDE006E52A7731E3E52A0CAE
:180AE00031E3CDCB0FCDD109A6CDC80FE5CDF619E1C5D5010081515AE9
:180AF8007EFEAB3E01C20E0BCD5B0BCDC80FE5CDF619CDAA19E1C5D502
:180B1000F533E52A7E31E30681C533CD860B227E317EFE3ACA3B0BB7D9
:180B2800C20307237E23B6CAAD0B235E2356EB220C31EBCD5B0B111B5F
:180B40000BD5C8D680DA090DFE25D20307074F0600EB21AB05094E231E
:180B580046C5EB237EFE3AD0FE20CA5B0BFE303F3C3DC9EB2A0E31CACB
:180B7000800BEBCD270CE5CDEF076069D1D2C80C2B228C31EBC9DFC8AA
:180B8800D7FE1B2811FE03280DFE13C0D7FE11C8FE03280718F63EFFFC
:180BA00032FD30C0F6C0227E3121F6FFC12A0C31F57DA43CCAC00B2250
:180BB80082312A7E31228431AF32F530CDF60DF121A606C23707C34E1D
:180BD000072A84317CB51E20CA1707EB2A8231220C31EBC9CD2917C028
:180BE80032F130C9E52AFA3006004F0922FA30E1C97EFE41D8FE5B3F1F
:180C0000C9CD5B0BCDC80FCDAA19FA220C3A9731FE90DA521A0180909D
:180C1800110000E5CD251AE151C81E08C317072B110000CD5B0BD0E59D
:180C3000F5219819CDCB09DA0307626B19291929F1D6305F160019EB9F
:180C4800E1C32B0CCA1F08CD040C2BCD5B0BE52A5F31CA6F0CE1CDD12A
:180C6000092CD5CD040C2BCD5B0BC20307E3EB7D935F7C9A57DAF806E9
:180C7800E52A863101280009CDCB09D2F806EB220A31E1225F31E1C37C
:180C90001F08CA1B08CD1F08011B0BC3AE0C0E03CDE006C1E5E52A0C1B
:180CA80031E33E8CF533C5CD270CCDF40CE52A0C31CDCB09E123DCF2DD
:180CC00007D4EF0760692BD81E0EC31707C016FFCDAC06F9FE8C1E0479
:180CD800C21707E1220C31237CB5C2EC0C3A7C31B7C24D07211B0BE3F8
:180CF0003EE1013A0E0006007948477EB7C8B8C823FE22CAF80CC3FB2A
:180D08000CCDBE11CDD109B4D53A5D31F5CDDA0FF1E3227E311FCDCD2A
:180D20000FCA5C0DE52A9431E523235E23562A0E31CDCB09D24B0D2A45
:180D38000A31CDCB09D1D2530D216F31CDCB09D2530D3ED1CD0216EB51
:180D5000CD3B14CD0216E1CD051AE1C9E5CD021AD1E1C9CD29177E47F8
:180D6800FE8CCA720DCDD109882B4B0D78CA430BCD280CFE2CC0C3733D
:180D80000DCDDA0F7EFE88CA8F0DCDD109A92BCDCB0FCDAA19CAF40CB2
:180D9800CD5B0BDAAF0CC3420B2BCD5B0BCA030EC8FEA5CA360EFEA813
:180DB000CA360EE5FE2CCA1F0EFE3BCA590EC1CDDA0FE53A5D31B7C210
:180DC800EF0DCD4F1BCD5F1436202A9431342A94313AF2304704CAEBDC
:180DE0000D043A5B31863DB8D4030ECDA414AFC4A414E1C3A10D3A5B2D
:180DF80031B7C8C3030E36002110313E0DCDDC093E0ACDDC09AF325B94
:180E1000313AF1303DC8F5AFCDDC09F1C3140E3AF330473A5B31B8D417
:180E2800030ED2590ED60ED22D0E2FC34E0EF5CD2617CDD109292BF13E
:180E4000D6A8E5CA490E3A5B312F83D2590E3C473E20CDDC0905C252B9
:180E58000EE1CD5B0BC3A80D3F5265646F2066726F6D207374617274FD
:180E70000D0A003A7D31B7C2FD06C121600ECDA114C34E08CD0C147E99
:180E8800FE223E0032F530C29E0ECD6014CDD1093BE5CDA4143EE5CDB2
:180EA0005208C1DAAA0B237EB72BC5CAF10C362CC3B80EE52A8C31F6D4
:180EB800AF327D31E3C3C40ECDD1092CCDBE11E3D57EFE2CCAEC0E3A4E
:180ED0007D31B7C2590F3E3FCDDC09CD5208D1C1DAAA0B237EB72BC5BC
:180EE800CAF10CD53A5D31B7CA160FCD5B0B5747FE22CA0A0F3A7D312C
:180F0000B757CA070F163A062C2BCD6314EB21210FE3D5C3240DCD5BEA
:180F18000BCDB11AE3CD021AE12BCD5B0BCA2D0FFE2CC2730EE32BCDC5
:180F30005B0BC2C00ED13A7D31B7EBC2810BD5B621480FC4A114E1C9E4
:180F48003F45787472612069676E6F7265640D0A00CDF20CB7C2720F6A
:180F6000237E23B61E06CA1707235E2356EB227931EBCD5B0BFE83C2E1
:180F7800590FC3EC0E110000C4BE11227E31CDAC06C20907F9D57E2307
:180F9000F5D5CDE819E3E5CD5517E1CD021AE1CDF919E5CD251AE1C193
:180FA80090CDF919CAB80FEB220C316960C3170BF92A7E317EFE2CC2FD
:180FC0001B0BCD5B0BCD800FCDDA0FF6373A5D318FB7E8C31507CDD10E
:180FD80009282B1600D50E01CDE006CD51102280312A8031C178FE786D
:180FF000D4CB0F7E1600D6B3DA1210FE03D21210FE0117AABA57DA037F
:1810080007227531CD5B0BC3F60F7AB7C239117E227531D6ACD8FE0724
:18102000D05F3A5D313DB37BCA971507835F21F505197856BAD023CD7B
:18103800CB0FC501E90FC5434ACDDB1958514E234623C52A7531C3DD3D
:181050000FAF325D31CD5B0B1E24CA1707DAB11ACDF90BD2B810FE2679
:181068002012CD5B0BFE48CAF51EFE42CA651F1E02CA1707FEACCA518D
:1810800010FE2ECAB11AFEADCAA710FE22CA6014FEAACA9911FEA7CA72
:18109800C413D6B6D2C910CDD60FCDD10929C9167DCDDD0F2A8031E5DB
:1810B000CDD319CDCB0FE1C9CDBE11E5EB2294313A5D31B7CCE819E19E
:1810C800C90600074FC5CD5B0B79FE31DAF010CDD60FCDD1092CCDCC53
:1810E0000FEB2A9431E3E5EBCD2917EBE3C3F810CD9F10E311B310D5AE
:1810F800015404094E236669E915FEADC8FE2DC814FE2BC8FEACC82B38
:18111000C9F6AFF5CDCB0FCD0D0CF1EBC1E3EBCDEB19F5CD0D0CF1C10E
:1811280079218213C23411A34F78A2E9B34F78B2E9214B113A5D311F0B
:181140007A175F166478BAD0C33A104D1179B71FC1D1F5CDCD0F218F91
:1811580011E5CA251AAF325D31D5CDE4157E23234E2346D1C5F5CDE8BB
:1811700015CDF919F157E17BB2C87AD601D8AFBB3CD0151D0ABE230396
:18118800CA77113FC3B5193C8FC1A0C6FF9FC3BC19165ACDDD0FCDCB44
:1811A0000FCD0D0C7B2F4F7A2FCD8213C1C3E90F2BCD5B0BC8CDD109F5
:1811B8002C01B011C5F6AF325C3146CDF90BDA0307AF4F325D31CD5B27
:1811D0000BDADA11CDF90BDAE7114FCD5B0BDADB11CDF90BD2DB11D6E7
:1811E80024C2F6113C325D310F814FCD5B0B3A7B313DCAA312F2061248
:181200007ED628CA7B12AF327B31E550592A8E31CDCB09119031CAEBD7
:18121800182A8831EB2A8631CDCB09CA3912799623C22E12789623CA12
:181230006D1223232323C32012E1E3D511BB10CDCB09D1CA7012E3E5AB
:18124800C50106002A8A31E509C1E5CDCF06E1228A3160692288312B1A
:181260003600CDCB09C25F12D173237223EBE1C9329731219F06229465
:1812780031E1C9E52A5C31E357D5C5CD010CC1F1EBE3E5EB3C577EFEDA
:181290002CCA8112CDD10929228031E1225C311E00D511E5F52A8831C9
:1812A8003E19EB2A8A31EBCDCB09CADB127EB923C2BD127EB8235E23FF
:1812C0005623C2A9123A5C31B7C20C07F1444DCAEB1896CA39131E10A4
:1812D800C31707110400F1CA220C712370234FCDE00623232275317177
:1812F000233A5C311779010B00D2FE12C10371237023F5E5CD961AEB51
:18130800E1F13DC2F612F5424BEB19DAF806CDE906228A312B3600CDCF
:18132000CB09C21C1303572A75315EEB2909EB2B2B73237223F1DA5DB7
:1813380013474F7E2316E15E235623E3F5CDCB09D2D612E5CD961AD1FC
:1813500019F13D444DC23E132929C109EB2A8031C92A8A31EB210000FE
:18136800393A5D31B7CA7D13CDE415CDE4142A0A31EB2A73317D934F53
:181380007C9A41501E00215D31730690C3C1193A5B3147AFC38313CD59
:181398001A14CD0C1401F20CC5D5CDD10928CDBE11E5EB2B562B5EE163
:1813B000CDCB0FCDD10929CDD109B4444DE3712370C35914CD1A14D5DB
:1813C800CD9F10CDCB0FE35E2356237AB3CA0F077E23666FE52A8E31BC
:1813E000E3228E312A9231E52A9031E5219031D5CD021AE1CDC80F2B3F
:1813F800CD5B0BC20307E1229031E1229231E1228E31E1C9E52A0C319C
:18141000237CB5E1C01E16C31707CDD109A73E80327B31B647CDC31132
:18142800C3CB0FCDCB0FCD4F1BCD5F14CDE415013F16C57E2323E5CD9A
:18144000BA14E14E2346CD5314E56FCDD715D1C9CDBA14216F31E5779B
:181458002323732372E1C92B062250E50EFF237E0CB7CA7514BACA753F
:1814700014B8C26614FE22CC5B0BE323EB79CD5314116F312A613122DD
:1814880094313E01325D31CD051ACDCB09226131E17EC01E1EC317070B
:1814A00023CD5F14CDE415CDF9191C1DC80ACDDC09FE0DCC0D0E03C3B7
:1814B800AB14B70EF1F52A0A31EB2A73312F4F06FF0923CDCB09DAD892
:1814D0001422733123EBF1C9F11E1ACA1707BFF501BC14C52A5F31222B
:1814E8007331210000E52A0A31E5216331EB2A6131EBCDCB0901F51406
:18150000C249152A8631EB2A8831EBCDCB09CA1C157E2323B7CD4C15D4
:18151800C30615C1EB2A8A31EBCDCB09CA7215CDF9197BE509B7F21B63
:1815300015227531E14E0600090923EB2A7531EBCDCB09CA1C15013BDE
:1815480015C5F6807E23235E235623F0B7C8444D2A7331CDCB09606945
:18156000D8E1E3CDCB09E3E56069D0C1F1F1E5D5C5C9D1E17DB4C82B14
:18157800462B4EE52B2B6E26000950592B444D2A7331CDD206E1712377
:181590007069602BC3E714C5E52A9431E3CD5110E3CDCC0F7EE52A94CB
:1815A80031E5861E1CDA1707CD5014D1CDE815E3CDE715E52A7131EB49
:1815C000CDCE15CDCE1521E60FE3E5C38114E1E37E23234E23466F2CA3
:1815D8002DC80A120313C3D815CDCC0F2A9431EBCD0216EBC0D5505994
:1815F0001B4E2A7331CDCB09C200164709227331E1C92A61312B462B1B
:181608004E2B2BCDCB09C0226131C9019213C5CDE115AF57325D317ED6
:18162000B7C9019213C5CD1716CA220C23235E23561AC93E01CD501465
:18163800CD2C172A713173C1C38114CDDC16AFE34FE57EB8DA511678BE
:18165000110E00C5CDBA14C1E1E5232346236668060009444DCD53142B
:181668006FCDD715D1CDE815C38114CDDC16D1D51A90C34716EB7ECDEA
:18168000E1160405CA220CC51EFFFE29CA9616CDD1092CCD2917CDD15D
:181698000929F1E3014916C53DBE0600D04F7E91BB47D843C9CD171600
:1816B000CACA175F23237E23666FE5194672E3C57EFE24C2CB16CDF5F9
:1816C8001E180DFE25C2D516CD651F1803CDB11AC1E170C9EBCDD10986
:1816E00029C1D1C543C9CD2C1732EF30CDEE30C39213CD1617C3B6300F
:1816F800CD1617F51E002BCD5B0BCA0C17CDD1092CCD2917C1CDEE30F6
:18171000ABA0CA0D17C9CD291732EF3032B730CDD1092CC32917CD5B4A
:181728000BCDC80FCD070C7AB7C2220C2BCD5B0B7BC9CD0D0C1AC39202
:1817400013CDC80FCD0D0CD5CDD1092CCD2917D112C921281CCDF9194F
:18175800C36417CDF91921C1D1CDD31978B7C83A9731B7CAEB1990D210
:181770007E172F3CEBCDDB19EBCDEB19C1D1FE19D0F5CD101A67F1CD6F
:181788002918B4219431F2A417CD0918D2EA172334CA12072E01CD3F8B
:1817A00018C3EA17AF90477E9B5F237E9A57237E994FDC15186863AFB9
:1817B8004779B7C2D7174A54656F78D608FEE0C2B817AF329731C90544
:1817D000297A1757798F4FF2CF17785C45B7CAEA172197318677D2CAA4
:1817E80017C878219731B7FCFC1746237EE680A94FC3EB191CC014C027
:181800000CC00E8034C0C312077E835F237E8A57237E894FC921983198
:181818007E2F77AF6F90477D9B5F7D9A577D994FC90600D608DA38187E
:18183000435A510E00C32B18C6096FAF2DC8791F4F7A1F577B1F5F7874
:181848001F47C33B180000008103AA561980F122768045AA3882CDAAC6
:1818600019B7EA220C2197317E01358011F30490F570D5C5CD6417C1CB
:18187800D104CD0019214D18CD5B17215118CDF21C018080110000CD94
:181890006417F1CD251B01318011187221C1D1CDAA19C82E00CD6819F3
:1818A8007932A631EB22A731010000505821B517E521C118E5E52194CD
:1818C000317E23B7CAED18E52E081F6779D2DB18E52AA73119EBE13AD3
:1818D800A631891F4F7A1F577B1F5F781F472D7CC2CA18E1C9435A517E
:1818F0004FC9CDDB19012084110000CDEB19C1D1CDAA19CA06072EFF5A
:18190800CD681934342B7E32C2302B7E32BE302B7E32BA3041EBAF4F8C
:18192000575F32C530E5C57DCDB930DE003FD2381932C530F1F137D2A3
:18193800C1E1793C3D1FFAEB17177B175F7A175779174F297817473AE0
:18195000C5301732C53079B2B3C22519E521973135E1C22519C31207AE
:1819680078B7CA8C197D219731AE80471FA878F28B19C68077CAEB188F
:18198000CD101A772BC9CDAA192FE1B7E1F2CA17C31207CDF61978B7FB
:18199800C8C602DA120747CD641721973134C0C312073A9731B7C83AB1
:1819B0009631FE2F179FC03CC9CDAA1906881100002197314F700600D3
:1819C80023368017C3B217CDAA19F02196317EEE8077C9EB2A9431E33A
:1819E000E52A9631E3E5EBC9CDF919EB2294316069229631EBC92194D1
:1819F800315E2356234E234623C911943106041A77132305C2071AC9B1
:181A10002196317E07371F773F1F2323777907371F4F1FAEC978B7CAB5
:181A2800AA1921B319E5CDAA1979C8219631AE79F8CD3F1A1FA9C9235F
:181A400078BEC02B79BEC02B7ABEC02B7B96C0E1E1C9474F575FB7C801
:181A5800E5CDF619CD101AAE67FC761A3E9890CD29187C17DCFC170621
:181A700000DC1518E1C91B7AA33CC00BC92197317EFE983A9431D07E59
:181A8800CD521A36987BF57917CDB217F1C921000078B1C83E1029DA8C
:181AA000D612EB29EBD2AC1A09DAD6123DC29E1AC9FE2DF5CABD1AFEA5
:181AB8002BCABD1A2BCDCA1747575F2F4FCD5B0BDA0E1BFE2ECAE91AC7
:181AD000FE45C2ED1ACD5B0BCD0111CD5B0BDA301B14C2ED1AAF935F0A
:181AE8000C0CCAC51AE57B90F4061BF2FC1AF5CDF218F13CC2F01AD182
:181B0000F1CCD319EBC9C8F5CD9319F13DC9D557788947C5E5D5CD93F0
:181B180019F1D630CD251BE1C1D1C3C51ACDDB19CDBC19C1D1C3641750
:181B30007B0707830786D6305FC3DB1AE5219B06CDA114E1EBAF0698A5
:181B4800CDC11921A014E5219931E5CDAA193620F25D1B362D23363018
:181B6000CA131CE5FCD319AFF5CD191C01439111F84FCD251AB7E28AA5
:181B78001BF1CD071BF5C36C1BCDF218F13CF5CD191CCD52173CCD528F
:181B90001ACDEB19010603F1813CFAA61BFE08D2A61B3C473E023D3D09
:181BA800E1F5112C1C05C2B71B362E2336302305362ECC001AC5E5D57F
:181BC000CDF619E1062F047B965F237A9E5723799E4F2B2BD2C61BCDB6
:181BD800091823CDEB19EBE17023C10DC2B71B05CAF71B2B7EFE30CA9D
:181BF000EB1BFE2EC4001AF1CA161C364523362BF2071C362D2F3C06F8
:181C08002F04D60AD2091CC63A237023772371E1C901749411F723CD4E
:181C2000251AB7E1E2811BE900000080A08601102700E8030064000041
:181C38000A000001000021D319E3E9CDDB1921281CCDE819C1D1CDAAB3
:181C50001978CA911CF25C1CB7CA0607B7CACB17D5C579F67FCDF619B5
:181C6800F2791CD5C5CD7D1AC1D1F5CD251AE17C1FE1229631E122946F
:181C800031DC3E1CCCD319D5C5CD5E18C1D1CD9F18CDDB1901388111AE
:181C98003BAACD9F183A9731FE88D28619CD7D1AC680C602DA8619F5F2
:181CB000214D18CD5517CD9618F1C1D1F5CD6117CDD31921D11CCD0190
:181CC8001D110000C14AC39F1808402E9474704F2E776E02887AE6A077
:181CE0002A7C50AAAA7EFFFF7F7F0000808100000081CDDB19119D181F
:181CF800D5E5CDF619CD9F18E1CDDB197E23CDE81906F1C1D13DC8D546
:181D1000C5F5E5CD9F18E1CDF919E5CD6417E1C30A1DCDAA1921C93036
:181D2800FA831D21EA30CDE81921C930C886E6070600772387874F09A5
:181D4000CDF919CD9F183AC8303CE6030600FE018832C83021871D87CE
:181D5800874F09CD5517CDF6197B59EE4F4F36802B46368021C73034F6
:181D70007ED6ABC27A1D770C151CCDB51721EA30C3021A772B772B77E1
:181D8800C35E1D68B1466899E9926910D1756821E11DCD5517CDDB19EA
:181DA00001498311DB0FCDEB19C1D1CD0019CDDB19CD7D1AC1D1CD6135
:181DB8001721E51DCD5B17CDAA1937F2CD1DCD5217CDAA19B7F5F4D3BE
:181DD0001921E51DCD5517F1D4D31921E91DC3F21CDB0F498100000029
:181DE8007F05BAD71E866426998758342387E05DA586DA0F4983CDDB85
:181E000019CD9D1DC1E1CDDB19EBCDEB19CD971DC3FE18CDAA19FC3EE7
:181E18001CFCD3193A9731FE81DA301E0100815159CD0019215B17E57B
:181E3000213A1ECDF21C21E11DC9094AD73B78026E847BFEC12F7C7434
:181E4800319A7D843D5A7DC87F917EE4BB4C7E6CAAAA7F00000081C95A
:181E6000D7C93E0CC39C1FCD29177B32F230C9CDC80FCD0D0CED53F69D
:181E780030ED53F830C9CD0D0CD5E146237EC38313CDC80FCD0D0CD5B6
:181E9000CDD1092CCDC80FCD0D0CE3732372E1C9CDCB0FCD0D0CC521D5
:181EA80099317AFE00280CCDD81E78FE302802702371237BCDD81E7A3A
:181EC000FE00200578FE30280270237123AF772377C1219931C331147C
:181ED80047E60FFE0A3802C607C6304F780F0F0F0FE60FFE0A3802C6B1
:181EF00007C63047C9EB210000CD0E1FDA2E1F1805CD0E1F381F2929E0
:181F08002929B56F18F3131AFE20CA0E1FD630D8FE0A3805D607FE0AF6
:181F2000D8FE103FC9EB7A4BE5CD8213E1C91E26C31707CDCB0FCD0D74
:181F38000CC521993106110578FE012808CB13CB1230F41804CB13CB6E
:181F5000123E30CE0077230520F3AF772377C1219931C33114EB2100F9
:181F680000CD821FDA901FD63029B56FCD821F30F6EB7A4BE5CD82138C
:181F8000E1C9131AFE20CA821FFE30D8FE323FC91E28C31707DD21FF87
:181F9800FFC36703C30800C300003E0032FD30C36E03ED45F5A0C1B866
:091FB0003E00C9CDDC09C3030E9B
:00000001FF

View File

@@ -0,0 +1,431 @@
import sys
from typing import Dict, List, Tuple
class Z80Disassembler:
def __init__(self):
# Complete Z80 instruction set
self.instructions = {
# 8-bit load group
0x40: ("LD B,B", 1),
0x41: ("LD B,C", 1),
0x42: ("LD B,D", 1),
0x43: ("LD B,E", 1),
0x44: ("LD B,H", 1),
0x45: ("LD B,L", 1),
0x46: ("LD B,(HL)", 1),
0x47: ("LD B,A", 1),
0x48: ("LD C,B", 1),
0x49: ("LD C,C", 1),
0x4A: ("LD C,D", 1),
0x4B: ("LD C,E", 1),
0x4C: ("LD C,H", 1),
0x4D: ("LD C,L", 1),
0x4E: ("LD C,(HL)", 1),
0x4F: ("LD C,A", 1),
0x50: ("LD D,B", 1),
0x51: ("LD D,C", 1),
0x52: ("LD D,D", 1),
0x53: ("LD D,E", 1),
0x54: ("LD D,H", 1),
0x55: ("LD D,L", 1),
0x56: ("LD D,(HL)", 1),
0x57: ("LD D,A", 1),
0x58: ("LD E,B", 1),
0x59: ("LD E,C", 1),
0x5A: ("LD E,D", 1),
0x5B: ("LD E,E", 1),
0x5C: ("LD E,H", 1),
0x5D: ("LD E,L", 1),
0x5E: ("LD E,(HL)", 1),
0x5F: ("LD E,A", 1),
0x60: ("LD H,B", 1),
0x61: ("LD H,C", 1),
0x62: ("LD H,D", 1),
0x63: ("LD H,E", 1),
0x64: ("LD H,H", 1),
0x65: ("LD H,L", 1),
0x66: ("LD H,(HL)", 1),
0x67: ("LD H,A", 1),
0x68: ("LD L,B", 1),
0x69: ("LD L,C", 1),
0x6A: ("LD L,D", 1),
0x6B: ("LD L,E", 1),
0x6C: ("LD L,H", 1),
0x6D: ("LD L,L", 1),
0x6E: ("LD L,(HL)", 1),
0x6F: ("LD L,A", 1),
0x70: ("LD (HL),B", 1),
0x71: ("LD (HL),C", 1),
0x72: ("LD (HL),D", 1),
0x73: ("LD (HL),E", 1),
0x74: ("LD (HL),H", 1),
0x75: ("LD (HL),L", 1),
0x76: ("HALT", 1),
0x77: ("LD (HL),A", 1),
0x78: ("LD A,B", 1),
0x79: ("LD A,C", 1),
0x7A: ("LD A,D", 1),
0x7B: ("LD A,E", 1),
0x7C: ("LD A,H", 1),
0x7D: ("LD A,L", 1),
0x7E: ("LD A,(HL)", 1),
0x7F: ("LD A,A", 1),
# 16-bit load group
0x01: ("LD BC,", 3),
0x11: ("LD DE,", 3),
0x21: ("LD HL,", 3),
0x31: ("LD SP,", 3),
0x2A: ("LD HL,(", 3),
0x22: ("LD (", 3), # LD (nn),HL
0xF9: ("LD SP,HL", 1),
0xC5: ("PUSH BC", 1),
0xD5: ("PUSH DE", 1),
0xE5: ("PUSH HL", 1),
0xF5: ("PUSH AF", 1),
0xC1: ("POP BC", 1),
0xD1: ("POP DE", 1),
0xE1: ("POP HL", 1),
0xF1: ("POP AF", 1),
# Exchange group
0xEB: ("EX DE,HL", 1),
0x08: ("EX AF,AF'", 1),
0xE3: ("EX (SP),HL", 1),
0xD9: ("EXX", 1),
# 8-bit arithmetic/logical group
0x80: ("ADD A,B", 1),
0x81: ("ADD A,C", 1),
0x82: ("ADD A,D", 1),
0x83: ("ADD A,E", 1),
0x84: ("ADD A,H", 1),
0x85: ("ADD A,L", 1),
0x86: ("ADD A,(HL)", 1),
0x87: ("ADD A,A", 1),
0x88: ("ADC A,B", 1),
0x89: ("ADC A,C", 1),
0x8A: ("ADC A,D", 1),
0x8B: ("ADC A,E", 1),
0x8C: ("ADC A,H", 1),
0x8D: ("ADC A,L", 1),
0x8E: ("ADC A,(HL)", 1),
0x8F: ("ADC A,A", 1),
0x90: ("SUB B", 1),
0x91: ("SUB C", 1),
0x92: ("SUB D", 1),
0x93: ("SUB E", 1),
0x94: ("SUB H", 1),
0x95: ("SUB L", 1),
0x96: ("SUB (HL)", 1),
0x97: ("SUB A", 1),
0x98: ("SBC A,B", 1),
0x99: ("SBC A,C", 1),
0x9A: ("SBC A,D", 1),
0x9B: ("SBC A,E", 1),
0x9C: ("SBC A,H", 1),
0x9D: ("SBC A,L", 1),
0x9E: ("SBC A,(HL)", 1),
0x9F: ("SBC A,A", 1),
0xA0: ("AND B", 1),
0xA1: ("AND C", 1),
0xA2: ("AND D", 1),
0xA3: ("AND E", 1),
0xA4: ("AND H", 1),
0xA5: ("AND L", 1),
0xA6: ("AND (HL)", 1),
0xA7: ("AND A", 1),
0xA8: ("XOR B", 1),
0xA9: ("XOR C", 1),
0xAA: ("XOR D", 1),
0xAB: ("XOR E", 1),
0xAC: ("XOR H", 1),
0xAD: ("XOR L", 1),
0xAE: ("XOR (HL)", 1),
0xAF: ("XOR A", 1),
0xB0: ("OR B", 1),
0xB1: ("OR C", 1),
0xB2: ("OR D", 1),
0xB3: ("OR E", 1),
0xB4: ("OR H", 1),
0xB5: ("OR L", 1),
0xB6: ("OR (HL)", 1),
0xB7: ("OR A", 1),
0xB8: ("CP B", 1),
0xB9: ("CP C", 1),
0xBA: ("CP D", 1),
0xBB: ("CP E", 1),
0xBC: ("CP H", 1),
0xBD: ("CP L", 1),
0xBE: ("CP (HL)", 1),
0xBF: ("CP A", 1),
0x04: ("INC B", 1),
0x0C: ("INC C", 1),
0x14: ("INC D", 1),
0x1C: ("INC E", 1),
0x24: ("INC H", 1),
0x2C: ("INC L", 1),
0x34: ("INC (HL)", 1),
0x3C: ("INC A", 1),
0x05: ("DEC B", 1),
0x0D: ("DEC C", 1),
0x15: ("DEC D", 1),
0x1D: ("DEC E", 1),
0x25: ("DEC H", 1),
0x2D: ("DEC L", 1),
0x35: ("DEC (HL)", 1),
0x3D: ("DEC A", 1),
# General purpose arithmetic and control groups
0x27: ("DAA", 1),
0x2F: ("CPL", 1),
0x37: ("SCF", 1),
0x3F: ("CCF", 1),
0x00: ("NOP", 1),
0x76: ("HALT", 1),
0xF3: ("DI", 1),
0xFB: ("EI", 1),
# 16-bit arithmetic group
0x09: ("ADD HL,BC", 1),
0x19: ("ADD HL,DE", 1),
0x29: ("ADD HL,HL", 1),
0x39: ("ADD HL,SP", 1),
0x03: ("INC BC", 1),
0x13: ("INC DE", 1),
0x23: ("INC HL", 1),
0x33: ("INC SP", 1),
0x0B: ("DEC BC", 1),
0x1B: ("DEC DE", 1),
0x2B: ("DEC HL", 1),
0x3B: ("DEC SP", 1),
# Rotate and shift group
0x07: ("RLCA", 1),
0x17: ("RLA", 1),
0x0F: ("RRCA", 1),
0x1F: ("RRA", 1),
# Jump group
0xC3: ("JP", 3),
0xDA: ("JP C,", 3),
0xD2: ("JP NC,", 3),
0xCA: ("JP Z,", 3),
0xC2: ("JP NZ,", 3),
0xFA: ("JP M,", 3),
0xF2: ("JP P,", 3),
0xEA: ("JP PE,", 3),
0xE2: ("JP PO,", 3),
0x18: ("JR", 2),
0x38: ("JR C,", 2),
0x30: ("JR NC,", 2),
0x28: ("JR Z,", 2),
0x20: ("JR NZ,", 2),
0xE9: ("JP (HL)", 1),
0x10: ("DJNZ", 2),
# Call and return group
0xCD: ("CALL", 3),
0xDC: ("CALL C,", 3),
0xD4: ("CALL NC,", 3),
0xCC: ("CALL Z,", 3),
0xC4: ("CALL NZ,", 3),
0xFC: ("CALL M,", 3),
0xF4: ("CALL P,", 3),
0xEC: ("CALL PE,", 3),
0xE4: ("CALL PO,", 3),
0xC9: ("RET", 1),
0xD8: ("RET C", 1),
0xD0: ("RET NC", 1),
0xC8: ("RET Z", 1),
0xC0: ("RET NZ", 1),
0xF8: ("RET M", 1),
0xF0: ("RET P", 1),
0xE8: ("RET PE", 1),
0xE0: ("RET PO", 1),
0xC7: ("RST 00H", 1),
0xCF: ("RST 08H", 1),
0xD7: ("RST 10H", 1),
0xDF: ("RST 18H", 1),
0xE7: ("RST 20H", 1),
0xEF: ("RST 28H", 1),
0xF7: ("RST 30H", 1),
0xFF: ("RST 38H", 1),
# Input and output group
0xDB: ("IN A,(", 2),
0xD3: ("OUT (", 2),
# Additional load instructions
0x3E: ("LD A,", 2),
0x06: ("LD B,", 2),
0x0E: ("LD C,", 2),
0x16: ("LD D,", 2),
0x1E: ("LD E,", 2),
0x26: ("LD H,", 2),
0x2E: ("LD L,", 2),
0x36: ("LD (HL),", 2),
0x32: ("LD (", 3), # LD (nn),A
0x3A: ("LD A,(", 3), # LD A,(nn)
}
def parse_hex_file(self, hex_content: str) -> Dict[int, int]:
memory = {}
for line in hex_content.splitlines():
if not line.startswith(':'):
continue
# Remove the starting ':'
line = line[1:]
# Parse the Intel HEX record
byte_count = int(line[0:2], 16)
address = int(line[2:6], 16)
record_type = int(line[6:8], 16)
data = line[8:8+byte_count*2]
if record_type == 0: # Data record
for i in range(0, len(data), 2):
byte = int(data[i:i+2], 16)
memory[address + (i//2)] = byte
return memory
def disassemble(self, memory: Dict[int, int], start_address: int = 0) -> List[str]:
output = []
current_address = start_address
while current_address in memory:
opcode = memory[current_address]
# Check for CB prefix (bit instructions)
if opcode == 0xCB and (current_address + 1) in memory:
cb_opcode = memory[current_address + 1]
instruction = self.decode_cb_instruction(cb_opcode)
if instruction:
output.append(f"{current_address:04X}: {instruction}")
current_address += 2
continue
# Check for ED prefix
if opcode == 0xED and (current_address + 1) in memory:
ed_opcode = memory[current_address + 1]
instruction = self.decode_ed_instruction(ed_opcode)
if instruction:
output.append(f"{current_address:04X}: {instruction}")
current_address += 2
continue
# Check for DD/FD prefix (IX/IY instructions)
if opcode in [0xDD, 0xFD]:
prefix = "IX" if opcode == 0xDD else "IY"
if (current_address + 1) in memory:
ix_opcode = memory[current_address + 1]
instruction = self.decode_indexed_instruction(ix_opcode, prefix)
if instruction:
output.append(f"{current_address:04X}: {instruction}")
current_address += 2
continue
instruction_info = self.instructions.get(opcode)
if instruction_info:
mnemonic, length = instruction_info
operand_bytes = []
# Get operand bytes if any
for i in range(1, length):
if current_address + i in memory:
operand_bytes.append(memory[current_address + i])
# Format the instruction
if length == 1:
line = f"{current_address:04X}: {mnemonic}"
elif length == 2:
if len(operand_bytes) >= 1:
line = f"{current_address:04X}: {mnemonic}{operand_bytes[0]:02X}H"
elif length == 3:
if len(operand_bytes) >= 2:
value = operand_bytes[0] + (operand_bytes[1] << 8)
if mnemonic.endswith("("):
line = f"{current_address:04X}: {mnemonic}{value:04X}H),A"
else:
line = f"{current_address:04X}: {mnemonic}{value:04X}H"
output.append(line)
current_address += length
else:
# Unknown opcode
output.append(f"{current_address:04X}: DB {opcode:02X}H ; Unknown opcode")
current_address += 1
return output
def decode_cb_instruction(self, opcode: int) -> str:
"""Decode CB-prefixed bit manipulation instructions"""
op_type = opcode >> 6
bit_num = (opcode >> 3) & 0x07
reg = opcode & 0x07
reg_names = ['B', 'C', 'D', 'E', 'H', 'L', '(HL)', 'A']
if op_type == 0: # Rotates and shifts
operations = ['RLC', 'RRC', 'RL', 'RR', 'SLA', 'SRA', 'SLL', 'SRL']
return f"{operations[bit_num]} {reg_names[reg]}"
elif op_type == 1: # BIT
return f"BIT {bit_num},{reg_names[reg]}"
elif op_type == 2: # RES
return f"RES {bit_num},{reg_names[reg]}"
elif op_type == 3: # SET
return f"SET {bit_num},{reg_names[reg]}"
return None
def decode_ed_instruction(self, opcode: int) -> str:
"""Decode ED-prefixed instructions"""
ed_instructions = {
0x40: "IN B,(C)",
0x41: "OUT (C),B",
0x42: "SBC HL,BC",
0x43: "LD (nn),BC",
0x44: "NEG",
0x45: "RETN",
0x46: "IM 0",
0x47: "LD I,A",
# Add more ED instructions as needed
}
return ed_instructions.get(opcode)
def decode_indexed_instruction(self, opcode: int, prefix: str) -> str:
"""Decode IX/IY indexed instructions"""
if opcode == 0x21: # LD IX/IY,nn
return f"LD {prefix},"
elif opcode == 0x22: # LD (nn),IX/IY
return f"LD (,{prefix})"
elif opcode == 0x2A: # LD IX/IY,(nn)
return f"LD {prefix},("
# Add more indexed instructions as needed
return None
def main(hex_file_path: str):
try:
with open(hex_file_path, 'r') as f:
hex_content = f.read()
disassembler = Z80Disassembler()
memory = disassembler.parse_hex_file(hex_content)
disassembly = disassembler.disassemble(memory)
for line in disassembly:
print(line)
except FileNotFoundError:
print(f"Error: Could not find file {hex_file_path}")
except Exception as e:
print(f"Error: {str(e)}")
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python z80_disassembler.py <hex_file>")
else:
main(sys.argv[1])

View File

@@ -1,3 +1,4 @@
tasm -80 source\mon.asm hexFiles\intMon.hex
tasm -80 source\basMon.asm hexFiles\basMon.hex
tasm -80 source\cbios128.asm hexFiles\cbios128.hex
tasm -80 source\cpm22.asm hexFiles\cpm22.hex

View File

@@ -1,345 +1,343 @@
:0430060000000000C6
:18000000F3C3A40000000000C332000000000000C31B000000000000BB
:18001800C36C003A0030FE002008CD730028FBDB81C9CD7A0028FBDB44
:1800300083C9F53A0030FE00200D1801F5CD600028FBF1D381C9F5CDB4
:18004800660028FBF1D383C9F5CD66002004F1E600C9F1D383F6FFC916
:18006000DB800FCB47C9DB820FCB47C93A0030FE002007DB80E601FE2D
:1800780000C9DB82E601FE00C9D7FE0A28FBFE1B20023E03C9FE0D2822
:180090000AFE0C2804FE203801CFC93E0DCF3E0ACF3E0DC9312A303E1B
:1800A80095D380D3823E00320030218103CD37012181032204302A0490
:1800C000307EB7280CCD5000280723220430C3BE00CD7300280F3E0094
:1800D800320030CD1B00FE20C2D1001812CD7A0028D43E01320030CD3A
:1800F0001B00FE20C2BE003E0CCD3C00CD5000CD3E0121B202CD3701E9
:18010800210801E5CD3E013E3ECFCD8100FE2038F9FE3ACAB501CD8DCA
:1801200000E65FFE42CAF601FE47CAAF01FE58CA0D023E3FCF18D57EDC
:18013800B7C8CF2318F93E0DCF3E0ACFC9CD8100FE03C8FE2038F6C907
:18015000CD450147CD45014FCD8F014F7B915F79C9210000CDA801FEED
:180168000D200E37C9210000CDA801FE0DC8FE2CC8FE0328EE29292956
:1801800029D630FE0A3802D607E60F856F18E178D630FE0A3802D6079A
:18019800070707074779D630FE0A3802D60780C9CD8100CD8D00C9CDC7
:1801B0006101D8E5C91E00CD500157CD500167CD50016FCD5001FE018D
:1801C8002009CD50017BA7281E18157AA7280BCD500177233E2ECF15E7
:1801E00018F1CD50017BA7C8217003CD3701C921AB03CD3701C9215E78
:1801F80003CD3701CD4501C8E65FFE43CAB603FE57CAB903C9211F021D
:18021000CD3701CD4501C8E65FFE59CA4002C90D0A426F6F7420435027
:180228002F4D3F000D0A4C6F6164696E672043502F4D2E2E2E0D0A005E
:18024000212C02CD370106183E0032063032073032083032093021002F
:18025800D0220230CD8A021100022A0230192202303A06303C32063021
:1802700010EA3A0030F52AFEFFE93A0830D38C3A0730D38B3A0630D32A
:180288008AC9F5C5E5DB89FE8020FACD7A023E00D3890E040680DB8991
:1802A000FEE020FADB8877230520F30D20EEE1C1F1C943502F4D204251
:1802B8006F6F7420524F4D20322E3020627920472E20536561726C6512
:1802D0000D0A0D0A4243206F72204257202D20524F4D204241534943CC
:1802E80020436F6C642F5761726D0D0A5820202020202020202D204298
:180300006F6F742043502F4D20286C6F61642024443030302D24464687
:180318004646290D0A3A6E6E6E6E2E2E2E202D204C6F616420496E744D
:18033000656C2D4865782066696C65207265636F72640D0A476E6E6E8B
:180348006E202020202D2052756E206C6F63206E6E6E6E0D0A000D0AC9
:18036000436F6C64206F72207761726D3F0D0A00436865636B73756DA2
:18037800206572726F720D0A000C5072657373205B73706163655D20EF
:18039000746F2061637469766174652074686520636F6E736F6C652E5F
:1803A8000D0A00436F6D706C6574650D0A00C3BC03C35A04DD21000035
:1803C000C3C7036D0CE31321B030F9C30220119406066321B0301A77A4
:1803D800231305C2D603F9CD9508CD630E325A3132A93121A904CD0131
:1803F00015CDB208CDBB0BB7C21004210D32237CB5CA22047E472F772A
:18040800BE70CAFE03C32204CD870CB7C26307EB2B3ED94677BE70C2DD
:18042000EB032B110C32CD2B0ADAEB0311CEFF225F3119220A31CD704F
:18043800082A0A3111EFFF1911A9317D936F7C9A67E5217204CD0115E1
:18045000E1CDA41B216304CD0115311631CD9508C3AE072042797465AE
:180468007320667265650D0A00005A383020424153494320566572207F
:18048000342E37620D0A436F70797269676874202843292031393738EC
:18049800206279204D6963726F736F66740D0A00004D656D6F727920CB
:1804B000746F7000191ADD1A2F1AB330C1134617EF13A31C821DBE1824
:1804C800F11CF71DFD1D5E1E731E9A17DE1E013173168B140D17821611
:1804E0009316001F931FA316D316DD16C54E44C64F52CE455854C44173
:1804F8005441C94E505554C4494DD2454144CC4554C74F544FD2554EBE
:18051000C946D24553544F5245C74F535542D2455455524ED2454DD389
:18052800544F50CF5554CF4ECE554C4CD7414954C44546D04F4B45C401
:180540004F4B45D3435245454ECC494E4553C34C53D749445448CD4F0B
:180558004E49544F52D34554D245534554D052494E54C34F4E54CC49BA
:180570005354C34C454152C34C4F4144C353415645CE4557D441422827
:18058800D44FC64ED3504328D448454ECE4F54D3544550ABADAAAFDE2B
:1805A000C14E44CF52BEBDBCD3474EC94E54C14253D55352C65245C9CF
:1805B8004E50D04F53D35152D24E44CC4F47C55850C34F53D3494ED4CF
:1805D000414EC1544ED045454BC445454BD04F494E54CC454ED3545201
:1805E80024D6414CC15343C3485224C8455824C2494E24CC45465424C7
:18060000D24947485424CD49442480050C020BDD0F520DE40E19121329
:180618000F690D0F0DF20CE10DCB0BFE0C2D0D540D030C5217C30D4436
:180630000C5817F713A117E91E540DCF1EC21EC71EFF1F0431073105CB
:180648000E310C770AAC0C540D540D6F08798B1B79BF177CFD187C5E04
:18066000197FAC1C5072114671114E46534E52474F4446434F564F4D5C
:18067800554C425344442F304944544D4F534C535354434E55464D4F6F
:180690004858424EC35A04C3820CD300C9D6006F7CDE006778DE004771
:1806A8003E00C9000000354ACA99391C76982295B3980ADD479853D102
:1806C00099990A1A9F9865BCCD98D6773E9852C74F80DB00C901FF1C44
:1806D80000001400140000000000C3A809C30000C30000C300000D32E6
:1806F000FEFFAA31204572726F720020696E20004F6B0D0A0000427254
:1807080065616B00210400397E23FE81C04E234623E569607AB3EBCA00
:180720002607EBCD2B0A010D00E1C809C31007CD4907C5E3C1CD2B0A85
:180738007E02C80B2BC33507E52A8A31060009093EE53ED0956F3EFFD8
:180750009CDA58076739E1D81E0CC377072A7931220C311E02011E1472
:18076800011E00011E12011E22011E0A011E18CD950832F530CD560E96
:18078000216A06573E3FCD3C0A197ECD3C0ACDBB0BCD3C0A21F406CDB1
:1807980001152A0C3111FEFFCD2B0ACAC7037CA53CC49C1B3EC1AF3270
:1807B000F530CD560E210007CD011521FFFF220C31CDA809DABB07CD6B
:1807C800BB0B3C3DCABB07F5CD870CD5CDBF0847D1F1D29B0BD5C5AFC6
:1807E000327C31CDBB0BB7F5CD4F08DAF407F1F5CA280DB7C5D20B08A4
:1807F800EB2A86311A020313CD2B0AC2FC076069228631D1F1CA3208BC
:180810002A8631E3C109E5CD2F07E1228631EB74D123237323722311EE
:1808280011311A772313B7C22A08CD7B0823EB626B7E23B6CABB0723D3
:180840002323AFBE23C24308EB732372C337082A0E31444D7E23B62B4C
:18085800C823237E23666FCD2B0A60697E23666F3FC83FD0C35208C0D0
:180870002A0E31AF772377232286312A0E312B227E312A5F3122733166
:18088800AFCDCB0B2A8631228831228A31C12A0A31F9216331226131E5
:1808A000AF6F67228431327B31228E31E5C52A7E31C93E3FCD3C0A3E0B
:1808B80020CD3C0AC3FE30AF325E310E051111317EFE20CA470947FE33
:1808D00022CA6709B7CA6E093A5E31B77EC24709FE3F3E9ECA47097EFB
:1808E800FE30DAF208FE3CDA4709D511EB04C5014309C5067F7EFE6184
:18090000DA0B09FE7BD20B09E65F774EEB23B6F20D09047EE67FC8B954
:18091800C20D09EBE5131AB7FA3F094F78FE88C22E09CDBB0B2B237E54
:18093000FE61DA3709E65FB9CA1D09E1C30B0948F1EBC9EB79C1D1238A
:1809480012130CD63ACA5509FE49C25809325E31D654C2C808477EB7CB
:18096000CA6E09B8CA470923120C13C35E092110311213121312C93A2D
:18097800F430B73E0032F430C28B0905CAA809CD3C0A3E052BCA9F092F
:180990007ECD3C0AC3B109052BCD3C0AC2B109CD3C0ACD630EC3A809BD
:1809A8002111310601AF32F430CD660A4FFE7FCA77093AF430B7CACACC
:1809C000093E00CD3C0AAF32F43079FE07CA0E0AFE03CC630E37C8FE25
:1809D8000DCA5E0EFE15CAA209FE40CA9F09FE5FCA9709FE08CA970955
:1809F000FE12C2090AC5D5E53600CD1320211131CD0115E1D1C1C3B128
:180A080009FE20DAB10978FE493E07D2230A7971327C312304CD3C0A15
:180A2000C3B109CD3C0A3E08C31D0A7C92C07D93C97EE3BE23E3CABBAD
:180A38000BC36307F53AF530B7C23615F1C5F5FE20DA600A3AF23047A6
:180A50003A5B3104CA5C0A05B8CC630E3C325B31F1C1CDFC1FC9CDC0B0
:180A68001EE67FFE0FC03AF5302F32F530AFC9CD870CC0C1CD4F08C5FF
:180A8000CDCD0AE14E23462378B1CAAE07CDD60ACDE60BC5CD630E5E8B
:180A9800235623E5EBCDA41B3E20E1CD3C0A7EB723CA830AF2A30AD6D8
:180AB0007F4F11EC041A13B7F2B50A0DC2B50AE67FCD3C0A1A13B7F2EE
:180AC800BF0AC3A60AE52AF83022F630E1C9E5D52AF63011FFFFED5A51
:180AE00022F630D1E1F0E52AF83022F630CDC01EFE03CAF90AE1C3D6A2
:180AF8000A2AF83022F630C35D043E64327B31CD690DC1E5CD520D2267
:180B1000773121020039CD1007D1C2320B09D52B562B5E2323E52A7761
:180B280031CD2B0AE1C2160BD1F9EB0E08CD4007E52A7731E3E52A0C2A
:180B400031E3CD2B10CD310AA6CD2810E5CD561AE1C5D5010081515A04
:180B58007EFEAB3E01C26E0BCDBB0BCD2810E5CD561ACD0A1AE1C5D5BE
:180B7000F533E52A7E31E30681C533CDE60B227E317EFE3ACA9B0BB7B9
:180B8800C26307237E23B6CA0D0C235E2356EB220C31EBCDBB0B117B7E
:180BA0000BD5C8D680DA690DFE25D26307074F0600EB210B06094E239D
:180BB80046C5EB237EFE3AD0FE20CABB0BFE303F3C3DC9EB2A0E31CA0B
:180BD000E00BEBCD870CE5CD4F086069D1D2280D2B228C31EBC9DFC8C8
:180BE800D7FE1B2811FE03280DFE13C0D7FE11C8FE03280718F63EFF9C
:180C000032FD30C0F6C0227E3121F6FFC12A0C31F57DA43CCA200C228E
:180C180082312A7E31228431AF32F530CD560EF1210607C29707C3AE3A
:180C3000072A84317CB51E20CA7707EB2A8231220C31EBC9CD8917C007
:180C480032F130C9E52AFA3006004F0922FA30E1C97EFE41D8FE5B3FBE
:180C6000C9CDBB0BCD2810CD0A1AFA820C3A9731FE90DAB21A0180905B
:180C7800110000E5CD851AE151C81E08C377072B110000CDBB0BD0E51D
:180C9000F5219819CD2B0ADA6307626B19291929F1D6305F160019EB7E
:180CA800E1C38B0CCA7F08CD640C2BCDBB0BE52A5F31CACF0CE1CD318A
:180CC0000A2CD5CD640C2BCDBB0BC26307E3EB7D935F7C9A57DA580707
:180CD800E52A863101280009CD2B0AD25807EB220A31E1225F31E1C35A
:180CF0007F08CA7B08CD7F08017B0BC30E0D0E03CD4007C1E5E52A0C79
:180D080031E33E8CF533C5CD870CCD540DE52A0C31CD2B0AE123DC52FA
:180D200008D44F0860692BD81E0EC37707C016FFCD0C07F9FE8C1E04F5
:180D3800C27707E1220C31237CB5C24C0D3A7C31B7C2AD07217B0BE316
:180D50003EE1013A0E0006007948477EB7C8B8C823FE22CA580DC35B08
:180D68000DCD1E12CD310AB4D53A5D31F5CD3A10F1E3227E311FCD2D46
:180D800010CABC0DE52A9431E523235E23562A0E31CD2B0AD2AB0D2AC3
:180D98000A31CD2B0AD1D2B30D216F31CD2B0AD2B30D3ED1CD6216EB0F
:180DB000CD9B14CD6216E1CD651AE1C9E5CD621AD1E1C9CD89177E47B8
:180DC800FE8CCAD20DCD310A882B4B0D78CAA30BCD880CFE2CC0C3D3FC
:180DE0000DCD3A107EFE88CAEF0DCD310AA92BCD2B10CD0A1ACA540D0D
:180DF800CDBB0BDA0F0DC3A20B2BCDBB0BCA630EC8FEA5CA960EFEA872
:180E1000CA960EE5FE2CCA7F0EFE3BCAB90EC1CD3A10E53A5D31B7C22E
:180E28004F0ECDAF1BCDBF1436202A9431342A94313AF2304704CA4BFA
:180E40000E043A5B31863DB8D4630ECD0415AFC40415E1C3010E3A5B48
:180E580031B7C8C3630E36002110313E0DCD3C0A3E0ACD3C0AAF325B11
:180E7000313AF1303DC8F5AFCD3C0AF1C3740E3AF330473A5B31B8D4F6
:180E8800630ED2B90ED60ED28D0E2FC3AE0EF5CD8617CD310A292BF19D
:180EA000D6A8E5CAA90E3A5B312F83D2B90E3C473E20CD3C0A05C2B2D8
:180EB8000EE1CDBB0BC3080E3F5265646F2066726F6D207374617274DC
:180ED0000D0A003A7D31B7C25D07C121C00ECD0115C3AE08CD6C147E57
:180EE800FE223E0032F530C2FE0ECDC014CD310A3BE5CD04153EE5CDD0
:180F0000B208C1DA0A0C237EB72BC5CA510D362CC3180FE52A8C31F6F0
:180F1800AF327D31E3C3240FCD310A2CCD1E12E3D57EFE2CCA4C0F3A69
:180F30007D31B7C2B90F3E3FCD3C0ACDB208D1C1DA0A0C237EB72BC5D9
:180F4800CA510DD53A5D31B7CA760FCDBB0B5747FE22CA6A0F3A7D314A
:180F6000B757CA670F163A062C2BCDC314EB21810FE3D5C3840DCDBBAA
:180F78000BCD111BE3CD621AE12BCDBB0BCA8D0FFE2CC2D30EE32BCD84
:180F9000BB0BC2200FD13A7D31B7EBC2E10BD5B621A80FC40115E1C9A2
:180FA8003F45787472612069676E6F7265640D0A00CD520DB7C2D20F49
:180FC000237E23B61E06CA7707235E2356EB227931EBCDBB0BFE83C2C1
:180FD800B90FC34C0F110000C41E12227E31CD0C07C26907F9D57E23C4
:180FF000F5D5CD481AE3E5CDB517E1CD621AE1CD591AE5CD851AE1C151
:1810080090CD591ACA1810EB220C316960C3770BF92A7E317EFE2CC27A
:181020007B0BCDBB0BCDE00FCD3A10F6373A5D318FB7E8C37507CD316C
:181038000A282B1600D50E01CD4007CDB1102280312A8031C178FE784A
:18105000D42B107E1600D6B3DA7210FE03D27210FE0117AABA57DA639D
:1810680007227531CDBB0BC356107AB7C299117E227531D6ACD8FE07A3
:18108000D05F3A5D313DB37BCAF71507835F215506197856BAD023CD5A
:181098002B10C5014910C5434ACD3B1A58514E234623C52A7531C33D5A
:1810B00010AF325D31CDBB0B1E24CA7707DA111BCD590CD21811FE2635
:1810C8002012CDBB0BFE48CA551FFE42CAC51F1E02CA7707FEACCAB14C
:1810E00010FE2ECA111BFEADCA0711FE22CAC014FEAACAF911FEA7CA90
:1810F8002414D6B6D22911CD3610CD310A29C9167DCD3D102A8031E596
:18111000CD331ACD2B10E1C9CD1E12E5EB2294313A5D31B7CC481AE1B9
:18112800C90600074FC5CDBB0B79FE31DA5011CD3610CD310A2CCD2C0F
:1811400010EB2A9431E3E5EBCD8917EBE3C35811CDFF10E3111311D5CA
:1811580001B404094E236669E915FEADC8FE2DC814FE2BC8FEACC82B77
:18117000C9F6AFF5CD2B10CD6D0CF1EBC1E3EBCD4B1AF5CD6D0CF1C12C
:181188007921E213C29411A34F78A2E9B34F78B2E921AB113A5D311F8B
:1811A0007A175F166478BAD0C39A10AD1179B71FC1D1F5CD2D1021EFB0
:1811B80011E5CA851AAF325D31D5CD44167E23234E2346D1C5F5CD483A
:1811D00016CD591AF157E17BB2C87AD601D8AFBB3CD0151D0ABE2303D4
:1811E800CAD7113FC3151A3C8FC1A0C6FF9FC31C1A165ACD3D10CD2B01
:1812000010CD6D0C7B2F4F7A2FCDE213C1C349102BCDBB0BC8CD310AB1
:181218002C011012C5F6AF325C3146CD590CDA6307AF4F325D31CDBB44
:181230000BDA3A12CD590CDA47124FCDBB0BDA3B12CD590CD23B12D6E0
:1812480024C256123C325D310F814FCDBB0B3A7B313DCA0313F2661265
:181260007ED628CADB12AF327B31E550592A8E31CD2B0A119031CA4B56
:18127800192A8831EB2A8631CD2B0ACA9912799623C28E12789623CA90
:18129000CD1223232323C38012E1E3D5111B11CD2B0AD1CAD012E3E569
:1812A800C50106002A8A31E509C1E5CD2F07E1228A3160692288312B59
:1812C0003600CD2B0AC2BF12D173237223EBE1C932973121FF062294E4
:1812D80031E1C9E52A5C31E357D5C5CD610CC1F1EBE3E5EB3C577EFE1A
:1812F0002CCAE112CD310A29228031E1225C311E00D511E5F52A8831A8
:181308003E19EB2A8A31EBCD2B0ACA3B137EB923C21D137EB8235E237B
:181320005623C209133A5C31B7C26C07F1444DCA4B1996CA99131E10C1
:18133800C37707110400F1CA820C712370234FCD4007232322753171F5
:18135000233A5C311779010B00D25E13C10371237023F5E5CDF61AEB2F
:18136800E1F13DC25613F5424BEB19DA5807CD4907228A312B3600CD4C
:181380002B0AC27C1303572A75315EEB2909EB2B2B73237223F1DABD36
:1813980013474F7E2316E15E235623E3F5CD2B0AD23613E5CDF61AD17A
:1813B00019F13D444DC29E132929C109EB2A8031C92A8A31EB2100003E
:1813C800393A5D31B7CADD13CD4416CD44152A0A31EB2A73317D934FD1
:1813E0007C9A41501E00215D31730690C3211A3A5B3147AFC3E313CD38
:1813F8007A14CD6C1401520DC5D5CD310A28CD1E12E5EB2B562B5EE120
:18141000CD2B10CD310A29CD310AB4444DE3712370C3B914CD7A14D597
:18142800CDFF10CD2B10E35E2356237AB3CA6F077E23666FE52A8E313A
:18144000E3228E312A9231E52A9031E5219031D5CD621AE1CD28102B1D
:18145800CDBB0BC26307E1229031E1229231E1228E31E1C9E52A0C317B
:18147000237CB5E1C01E16C37707CD310AA73E80327B31B647CD2312B0
:18148800C32B10CD2B10CDAF1BCDBF14CD4416019F16C57E2323E5CDF7
:1814A0001A15E14E2346CDB314E56FCD3716D1C9CD1A15216F31E577B8
:1814B8002323732372E1C92B062250E50EFF237E0CB7CAD514BACAD51F
:1814D00014B8C2C614FE22CCBB0BE323EB79CDB314116F312A6131225D
:1814E80094313E01325D31CD651ACD2B0A226131E17EC01E1EC377078A
:1815000023CDBF14CD4416CD591A1C1DC80ACD3C0AFE0DCC6D0E03C373
:181518000B15B70EF1F52A0A31EB2A73312F4F06FF0923CD2B0ADA380F
:181530001522733123EBF1C9F11E1ACA7707BFF5011C15C52A5F312208
:181548007331210000E52A0A31E5216331EB2A6131EBCD2B0A015515E3
:18156000C2A9152A8631EB2A8831EBCD2B0ACA7C157E2323B7CDAC15F3
:18157800C36615C1EB2A8A31EBCD2B0ACAD215CD591A7BE509B7F27B21
:1815900015227531E14E0600090923EB2A7531EBCD2B0ACA7C15019B5D
:1815A80015C5F6807E23235E235623F0B7C8444D2A7331CD2B0A606984
:1815C000D8E1E3CD2B0AE3E56069D0C1F1F1E5D5C5C9D1E17DB4C82B53
:1815D800462B4EE52B2B6E26000950592B444D2A7331CD3207E17123B6
:1815F0007069602BC34715C5E52A9431E3CDB110E3CD2C107EE52A9449
:1816080031E5861E1CDA7707CDB014D1CD4816E3CD4716E52A7131EB66
:18162000CD2E16CD2E16214610E3E5C3E114E1E37E23234E23466F2CBF
:181638002DC80A120313C33816CD2C102A9431EBCD6216EBC0D5505911
:181650001B4E2A7331CD2B0AC260164709227331E1C92A61312B462BF9
:181668004E2B2BCD2B0AC0226131C901F213C5CD4116AF57325D317E54
:18168000B7C901F213C5CD7716CA820C23235E23561AC93E01CDB01485
:18169800CD8C172A713173C1C3E114CD3C17AFE34FE57EB8DAB11678DD
:1816B000110E00C5CD1A15C1E1E5232346236668060009444DCDB3140A
:1816C8006FCD3716D1CD4816C3E114CD3C17D1D51A90C3A716EB7ECDA7
:1816E00041170405CA820CC51EFFFE29CAF616CD310A2CCD8917CD31BB
:1816F8000A29F1E301A916C53DBE0600D04F7E91BB47D843C9CD7716DF
:18171000CA2A185F23237E23666FE5194672E3C57EFE24C22B17CD5576
:181728001F180DFE25C23517CDC51F1803CD111BC1E170C9EBCD310AA1
:1817400029C1D1C543C9CD8C1732EF30CDEE30C3F213CD7617C3B6308E
:18175800CD7617F51E002BCDBB0BCA6C17CD310A2CCD8917C1CDEE30B4
:18177000ABA0CA6D17C9CD891732EF3032B730CD310A2CC38917CDBB09
:181788000BCD2810CD670C7AB7C2820C2BCDBB0B7BC9CD6D0C1AC3F261
:1817A00013CD2810CD6D0CD5CD310A2CCD8917D112C921881CCD591AAC
:1817B800C3C417CD591A21C1D1CD331A78B7C83A9731B7CA4B1A90D22D
:1817D000DE172F3CEBCD3B1AEBCD4B1AC1D1FE19D0F5CD701A67F1CD8D
:1817E8008918B4219431F20418CD6918D24A182334CA72072E01CD9FE9
:1818000018C34A18AF90477E9B5F237E9A57237E994FDC75186863AF97
:181818004779B7C237184A54656F78D608FEE0C21818AF329731C90521
:18183000297A1757798F4FF22F18785C45B7CA4A182197318677D22A21
:1818480018C878219731B7FC5C1846237EE680A94FC34B1A1CC014C003
:181860000CC00E8034C0C372077E835F237E8A57237E894FC9219831D8
:181878007E2F77AF6F90477D9B5F7D9A577D994FC90600D608DA9818BE
:18189000435A510E00C38B18C6096FAF2DC8791F4F7A1F577B1F5F78B4
:1818A8001F47C39B180000008103AA561980F122768045AA3882CD0AA6
:1818C0001AB7EA820C2197317E01358011F30490F570D5C5CDC417C1AA
:1818D800D104CD601921AD18CDBB1721B118CD521D018080110000CD53
:1818F000C417F1CD851B01318011187221C1D1CD0A1AC82E00CDC81912
:181908007932A631EB22A7310100005058211518E5212119E5E52194AA
:18192000317E23B7CA4D19E52E081F6779D23B19E52AA73119EBE13AB0
:18193800A631891F4F7A1F577B1F5F781F472D7CC22A19E1C9435A51BC
:181950004FC9CD3B1A012084110000CD4B1AC1D1CD0A1ACA66072EFF76
:18196800CDC81934342B7E32C2302B7E32BE302B7E32BA3041EBAF4FCC
:18198000575F32C530E5C57DCDB930DE003FD2981932C530F1F137D2E3
:18199800C1E1793C3D1FFA4B18177B175F7A175779174F297817473A1F
:1819B000C5301732C53079B2B3C28519E521973135E1C28519C372072E
:1819C80078B7CAEC197D219731AE80471FA878F2EB19C68077CA4B190E
:1819E000CD701A772BC9CD0A1A2FE1B7E1F22A18C37207CD561A78B7B8
:1819F800C8C602DA720747CDC41721973134C0C372073A9731B7C83A31
:181A10009631FE2F179FC03CC9CD0A1A06881100002197314F70060011
:181A280023368017C31218CD0A1AF02196317EEE8077C9EB2A9431E317
:181A4000E52A9631E3E5EBC9CD591AEB2294316069229631EBC921940F
:181A5800315E2356234E234623C911943106041A77132305C2671AC9F0
:181A70002196317E07371F773F1F2323777907371F4F1FAEC978B7CA55
:181A88000A1A21131AE5CD0A1A79C8219631AE79F8CD9F1A1FA9C9237C
:181AA00078BEC02B79BEC02B7ABEC02B7B96C0E1E1C9474F575FB7C8A1
:181AB800E5CD561ACD701AAE67FCD61A3E9890CD89187C17DC5C1806DF
:181AD00000DC7518E1C91B7AA33CC00BC92197317EFE983A9431D07E99
:181AE800CDB21A36987BF57917CD1218F1C921000078B1C83E1029DA6B
:181B00003613EB29EBD20C1B09DA36133DC2FE1AC9FE2DF5CA1D1BFE60
:181B18002BCA1D1B2BCD2A1847575F2F4FCDBB0BDA6E1BFE2ECA491B83
:181B3000FE45C24D1BCDBB0BCD6111CDBB0BDA901B14C24D1BAF935F67
:181B48000C0CCA251BE57B90F4661BF25C1BF5CD5219F13CC2501BD13D
:181B6000F1CC331AEBC9C8F5CDF319F13DC9D557788947C5E5D5CDF36F
:181B780019F1D630CD851BE1C1D1C3251BCD3B1ACD1C1AC1D1C3C4170D
:181B90007B0707830786D6305FC33B1BE521FB06CD0115E1EBAF069823
:181BA800CD211A210015E5219931E5CD0A1A3620F2BD1B362D23363035
:181BC000CA731CE5FC331AAFF5CD791C01439111F84FCD851AB7E2EA64
:181BD8001BF1CD671BF5C3CC1BCD5219F13CF5CD791CCDB2173CCDB2EE
:181BF0001ACD4B1A010603F1813CFA061CFE08D2061C3C473E023D3D86
:181C0800E1F5118C1C05C2171C362E2336302305362ECC601AC5E5D5FD
:181C2000CD561AE1062F047B965F237A9E5723799E4F2B2BD2261CCD93
:181C3800691823CD4B1AEBE17023C10DC2171C05CA571C2B7EFE30CAB9
:181C50004B1CFE2EC4601AF1CA761C364523362BF2671C362D2F3C0616
:181C68002F04D60AD2691CC63A237023772371E1C901749411F723CD8E
:181C8000851AB7E1E2E11BE900000080A08601102700E8030064000021
:181C98000A000001000021331AE3E9CD3B1A21881CCD481AC1D1CD0A70
:181CB0001A78CAF11CF2BC1CB7CA6607B7CA2B18D5C579F67FCD561A72
:181CC800F2D91CD5C5CDDD1AC1D1F5CD851AE17C1FE1229631E12294EF
:181CE00031DC9E1CCC331AD5C5CDBE18C1D1CDFF18CD3B1A013881116C
:181CF8003BAACDFF183A9731FE88D2E619CDDD1AC680C602DAE619F512
:181D100021AD18CDB517CDF618F1C1D1F5CDC117CD331A21311DCD618D
:181D28001D110000C14AC3FF1808402E9474704F2E776E02887AE6A0B6
:181D40002A7C50AAAA7EFFFF7F7F0000808100000081CD3B1A11FD18FD
:181D5800D5E5CD561ACDFF18E1CD3B1A7E23CD481A06F1C1D13DC8D562
:181D7000C5F5E5CDFF18E1CD591AE5CDC417E1C36A1DCD0A1A21C930F4
:181D8800FAE31D21EA30CD481A21C930C886E6070600772387874F0984
:181DA000CD591ACDFF183AC8303CE6030600FE018832C83021E71D874D
:181DB800874F09CDB517CD561A7B59EE4F4F36802B46368021C73034D5
:181DD0007ED6ABC2DA1D770C151CCD151821EA30C3621A772B772B7760
:181DE800C3BE1D68B1466899E9926910D1756821411ECDB517CD3B1A08
:181E000001498311DB0FCD4B1AC1D1CD6019CD3B1ACDDD1AC1D1CDC1F2
:181E18001721451ECDBB17CD0A1A37F22D1ECDB217CD0A1AB7F5F433B9
:181E30001A21451ECDB517F1D4331A21491EC3521DDB0F4981000000E3
:181E48007F05BAD71E866426998758342387E05DA586DA0F4983CD3BC4
:181E60001ACDFD1DC1E1CD3B1AEBCD4B1ACDF71DC35E19CD0A1AFC9EE2
:181E78001CFC331A3A9731FE81DA901E0100815159CD601921BB17E59A
:181E9000219A1ECD521D21411EC9094AD73B78026E847BFEC12F7C74B2
:181EA800319A7D843D5A7DC87F917EE4BB4C7E6CAAAA7F00000081C9FA
:181EC000D7C93E0CC3FC1FCD89177B32F230C9CD2810CD6D0CED53F6BC
:181ED80030ED53F830C9CD6D0CD5E146237EC3E313CD2810CD6D0CD5D5
:181EF000CD310A2CCD2810CD6D0CE3732372E1C9CD2B10CD6D0CC52192
:181F080099317AFE00280CCD381F78FE302802702371237BCD381F7A17
:181F2000FE00200578FE30280270237123AF772377C1219931C39114BB
:181F380047E60FFE0A3802C607C6304F780F0F0F0FE60FFE0A3802C650
:181F500007C63047C9EB210000CD6E1FDA8E1F1805CD6E1F381F29295F
:181F68002929B56F18F3131AFE20CA6E1FD630D8FE0A3805D607FE0A36
:181F8000D8FE103FC9EB7A4BE5CDE213E1C91E26C37707CD2B10CD6D93
:181F98000CC521993106110578FE012808CB13CB1230F41804CB13CB0E
:181FB000123E30CE0077230520F3AF772377C1219931C39114EB210039
:181FC80000CDE21FDAF01FD63029B56FCDE21F30F6EB7A4BE5CDE213AC
:181FE000E1C9131AFE20CAE21FFE30D8FE323FC91E28C37707DD21FF67
:181FF800FFC3C703C30800C300003E0032FD30C3CE03ED45F5A0C1B846
:092010003E00C9CD3C0AC3630E79
:00000001FF
:0430040000000000C8
:18000000F3C3940000000000C332000000000000C31B000000000000CB
:18001800C35C003A0030FE002008CD630028FBDB81C9CD6A0028FBDB74
:1800300083C9F53A0030FE00200D1801F5CD500028FBF1D381C9F5CDC4
:18004800560028FBF1D383C9DB800FCB47C9DB820FCB47C93A0030FE23
:18006000002007DB80E601FE00C9DB82E601FE00C9D7FE0A28FBFE1B32
:1800780020023E03C9FE0D280AFE0C2804FE203801CFC93E0DCF3E0A80
:18009000CF3E0DC93128303E95D380D3823E00320030216503CD1B015F
:1800A8003E01320030216503CD1B01CD6300280F3E00320030CD1B003E
:1800C000FE20C2B3001814CD6A0028E73E01320030CD1B00FE20C2B307
:1800D8000018003E0CCD3C00CD4600CD2201219602CD1B0121EC00E50E
:1800F000CD22013E3ECFCD7100FE2038F9FE3ACA9901CD7D00E65FFE07
:1801080042CADA01FE47CA9301FE58CAF1013E3FCF18D57EB7C8CF231B
:1801200018F93E0DCF3E0ACFC9CD7100FE03C8FE2038F6C9CD29014762
:18013800CD29014FCD73014F7B915F79C9210000CD8C01FE0D200E3741
:18015000C9210000CD8C01FE0DC8FE2CC8FE0328EE29292929D630FECF
:180168000A3802D607E60F856F18E178D630FE0A3802D60707070707C3
:180180004779D630FE0A3802D60780C9CD7100CD7D00C9CD4501D8E518
:18019800C91E00CD340157CD340167CD34016FCD3401FE012009CD340A
:1801B000017BA7281E18157AA7280BCD340177233E2ECF1518F1CD3457
:1801C800017BA7C8215403CD1B01C9218A03CD1B01C9214203CD1B015B
:1801E000CD2901C8E65FFE43CA9503FE57CA9803C9210302CD1B01CD01
:1801F8002901C8E65FFE59CA2402C90D0A426F6F742043502F4D3F008F
:180210000D0A4C6F6164696E672043502F4D2E2E2E0D0A00211002CD31
:180228001B0106183E003204303205303206303207302100D022023063
:18024000CD6E021100022A0230192202303A04303C32043010EA3A0049
:1802580030F52AFEFFE93A0630D38C3A0530D38B3A0430D38AC9F5C56F
:18027000E5DB89FE8020FACD5E023E00D3890E040680DB89FEE020FADA
:18028800DB8877230520F30D20EEE1C1F1C943502F4D20426F6F7420EF
:1802A000524F4D20322E3020627920472E20536561726C650D0A0D0A6E
:1802B8004243206F72204257202D20524F4D20424153494320436F6CD4
:1802D000642F5761726D0D0A5820202020202020202D20426F6F74207C
:1802E80043502F4D20286C6F61642024443030302D2446464646290D50
:180300000A3A6E6E6E6E2E2E2E202D204C6F616420496E74656C2D48E1
:1803180065782066696C65207265636F72640D0A476E6E6E6E2020201B
:18033000202D2052756E206C6F63206E6E6E6E0D0A000D0A436F6C642D
:18034800206F72207761726D3F0D0A00436865636B73756D20657272D3
:180360006F720D0A000C5072657373205B53504143455D20746F2061AC
:180378006374697661746520636F6E736F6C650D0A00436F6D706C65F3
:1803900074650D0A00C39B03C33904DD210000C3A6034C0CC21321B09C
:1803A80030F9C3E11F117306066321B0301A77231305C2B503F9CD74DD
:1803C00008CD420E325A3132A931218804CDE014CD9108CD9A0BB7C278
:1803D800EF03210D32237CB5CA01047E472F77BE70CADD03C30104CDC0
:1803F000660CB7C24207EB2B3ED94677BE70C2CA032B110C32CD0A0ABF
:18040800DACA0311CEFF225F3119220A31CD4F082A0A3111EFFF19117D
:18042000A9317D936F7C9A67E5215104CDE014E1CD831B214204CDE072
:1804380014311631CD7408C38D0720427974657320667265650D0A0080
:18045000005A38302042415349432056657220342E37620D0A436F70AF
:18046800797269676874202843292031393738206279204D6963726F23
:18048000736F66740D0A00004D656D6F727920746F7000F819BC1A0EB0
:180498001AB330A0132517CE13821C611D9D18D01CD61DDC1D3D1E5229
:1804B0001E7917BD1E013152166A14EC1661167216DF1E721F8216B2BA
:1804C80016BC16C54E44C64F52CE455854C4415441C94E505554C44900
:1804E0004DD2454144CC4554C74F544FD2554EC946D24553544F5245D5
:1804F800C74F535542D2455455524ED2454DD3544F50CF5554CF4ECEFF
:18051000554C4CD7414954C44546D04F4B45C44F4B45D3435245454E50
:18052800CC494E4553C34C53D749445448CD4F4E49544F52D34554D278
:1805400045534554D052494E54C34F4E54CC495354C34C454152C34CFF
:180558004F4144C353415645CE4557D4414228D44FC64ED3504328D443
:1805700048454ECE4F54D3544550ABADAAAFDEC14E44CF52BEBDBCD35E
:18058800474EC94E54C14253D55352C65245C94E50D04F53D35152D20D
:1805A0004E44CC4F47C55850C34F53D3494ED4414EC1544ED045454BA8
:1805B800C445454BD04F494E54CC454ED3545224D6414CC15343C348C7
:1805D0005224C8455824C2494E24CC45465424D24947485424CD49444C
:1805E8002480E40BE10ABC0F310DC30EF811F20E480DEE0CD10CC00DA1
:18060000AA0BDD0C0C0D330DE20B3117A20D230C3717D6138017C81E24
:18061800330DAE1EA11EA61EDE1F04310731E40D100C560A8B0C330D8D
:18063000330D4E08796A1B799E177CDC187C3D197F8B1C505111465040
:18064800114E46534E52474F4446434F564F4D554C425344442F3049F8
:1806600044544D4F534C535354434E55464D4F4858424EC33904C36199
:180678000CD300C9D6006F7CDE006778DE00473E00C9000000354ACACF
:1806900099391C76982295B3980ADD479853D199990A1A9F9865BCCDEF
:1806A80098D6773E9852C74F80DB00C901FF1C000014001400000000AF
:1806C00000C38709C30000C30000C300000D32FEFFAA31204572726FB7
:1806D800720020696E20004F6B0D0A0000427265616B00210400397EEF
:1806F00023FE81C04E234623E569607AB3EBCA0507EBCD0A0A010D0040
:18070800E1C809C3EF06CD2807C5E3C1CD0A0A7E02C80B2BC31407E5E8
:180720002A8A31060009093EE53ED0956F3EFF9CDA37076739E1D81E27
:180738000CC356072A7931220C311E02011E14011E00011E12011E2266
:18075000011E0A011E18CD740832F530CD350E214906573E3FCD1B0A4B
:18076800197ECD1B0ACD9A0BCD1B0A21D306CDE0142A0C3111FEFFCD8F
:180780000A0ACAA6037CA53CC47B1B3EC1AF32F530CD350E21DF06CD3B
:18079800E01421FFFF220C31CD8709DA9A07CD9A0B3C3DCA9A07F5CDE7
:1807B000660CD5CD9E0847D1F1D27A0BD5C5AF327C31CD9A0BB7F5CD04
:1807C8002E08DAD307F1F5CA070DB7C5D2EA07EB2A86311A020313CD61
:1807E0000A0AC2DB076069228631D1F1CA11082A8631E3C109E5CD0EB4
:1807F80007E1228631EB74D12323732372231111311A772313B7C209EB
:1808100008CD5A0823EB626B7E23B6CA9A07232323AFBE23C22208EB2C
:18082800732372C316082A0E31444D7E23B62BC823237E23666FCD0AF8
:180840000A60697E23666F3FC83FD0C33108C02A0E31AF772377232217
:1808580086312A0E312B227E312A5F31227331AFCDAA0B2A8631228830
:1808700031228A31C12A0A31F9216331226131AF6F67228431327B31A0
:18088800228E31E5C52A7E31C93E3FCD1B0A3E20CD1B0AC3FE30AF329A
:1808A0005E310E051111317EFE20CA260947FE22CA4609B7CA4D093A25
:1808B8005E31B77EC22609FE3F3E9ECA26097EFE30DAD108FE3CDA26C8
:1808D00009D511CA04C5012209C5067F7EFE61DAEA08FE7BD2EA08E64C
:1808E8005F774EEB23B6F2EC08047EE67FC8B9C2EC08EBE5131AB7FA5E
:180900001E094F78FE88C20D09CD9A0B2B237EFE61DA1609E65FB9CA35
:18091800FC08E1C3EA0848F1EBC9EB79C1D12312130CD63ACA3409FEE1
:1809300049C23709325E31D654C2A708477EB7CA4D09B8CA2609231286
:180948000C13C33D092110311213121312C93AF430B73E0032F430C27D
:180960006A0905CA8709CD1B0A3E052BCA7E097ECD1B0AC39009052B00
:18097800CD1B0AC29009CD1B0ACD420EC387092111310601AF32F43049
:18099000CD450A4FFE7FCA56093AF430B7CAA9093E00CD1B0AAF32F4A8
:1809A8003079FE07CAED09FE03CC420E37C8FE0DCA3D0EFE15CA810926
:1809C000FE40CA7E09FE5FCA7609FE08CA7609FE12C2E809C5D5E53623
:1809D80000CDF21F211131CDE014E1D1C1C39009FE20DA900978FE49E6
:1809F0003E07D2020A7971327C312304CD1B0AC39009CD1B0A3E08C393
:180A0800FC097C92C07D93C97EE3BE23E3CA9A0BC34207F53AF530B77F
:180A2000C21515F1C5F5FE20DA3F0A3AF230473A5B3104CA3B0A05B8AD
:180A3800CC420E3C325B31F1C1CDDB1FC9CD9F1EE67FFE0FC03AF53033
:180A50002F32F530AFC9CD660CC0C1CD2E08C5CDAC0AE14E2346237852
:180A6800B1CA8D07CDB50ACDC50BC5CD420E5E235623E5EBCD831B3EE9
:180A800020E1CD1B0A7EB723CA620AF2820AD67F4F11CB041A13B7F205
:180A9800940A0DC2940AE67FCD1B0A1A13B7F29E0AC3850AE52AF830DD
:180AB00022F630E1C9E5D52AF63011FFFFED5A22F630D1E1F0E52AF8EB
:180AC8003022F630CD9F1EFE03CAD80AE1C3B50A2AF83022F630C33C6B
:180AE000043E64327B31CD480DC1E5CD310D22773121020039CDEF06BF
:180AF800D1C2110B09D52B562B5E2323E52A7731CD0A0AE1C2F50AD1FE
:180B1000F9EB0E08CD1F07E52A7731E3E52A0C31E3CD0A10CD100AA6A3
:180B2800CD0710E5CD351AE1C5D5010081515A7EFEAB3E01C24D0BCDDB
:180B40009A0BCD0710E5CD351ACDE919E1C5D5F533E52A7E31E3068179
:180B5800C533CDC50B227E317EFE3ACA7A0BB7C24207237E23B6CAEC28
:180B70000B235E2356EB220C31EBCD9A0B115A0BD5C8D680DA480DFE2B
:180B880025D24207074F0600EB21EA05094E2346C5EB237EFE3AD0FEA7
:180BA00020CA9A0BFE303F3C3DC9EB2A0E31CABF0BEBCD660CE5CD2E0D
:180BB800086069D1D2070D2B228C31EBC9DFC8D7FE1B2811FE03280DD9
:180BD000FE13C0D7FE11C8FE03280718F63EFF32FD30C0F6C0227E316D
:180BE80021F6FFC12A0C31F57DA43CCAFF0B2282312A7E31228431AF5D
:180C000032F530CD350EF121E506C27607C38D072A84317CB51E20CACA
:180C18005607EB2A8231220C31EBC9CD6817C032F130C9E52AFA300625
:180C3000004F0922FA30E1C97EFE41D8FE5B3FC9CD9A0BCD0710CDE95C
:180C480019FA610C3A9731FE90DA911A018090110000E5CD641AE1517B
:180C6000C81E08C356072B110000CD9A0BD0E5F5219819CD0A0ADA4247
:180C780007626B19291929F1D6305F160019EBE1C36A0CCA5E08CD4342
:180C90000C2BCD9A0BE52A5F31CAAE0CE1CD100A2CD5CD430C2BCD9A09
:180CA8000BC24207E3EB7D935F7C9A57DA3707E52A863101280009CD97
:180CC0000A0AD23707EB220A31E1225F31E1C35E08CA5A08CD5E0801B3
:180CD8005A0BC3ED0C0E03CD1F07C1E5E52A0C31E33E8CF533C5CD6620
:180CF0000CCD330DE52A0C31CD0A0AE123DC3108D42E0860692BD81E99
:180D08000EC35607C016FFCDEB06F9FE8C1E04C25607E1220C31237C6F
:180D2000B5C22B0D3A7C31B7C28C07215A0BE33EE1013A0E00060079C9
:180D380048477EB7C8B8C823FE22CA370DC33A0DCDFD11CD100AB4D5F1
:180D50003A5D31F5CD1910F1E3227E311FCD0C10CA9B0DE52A9431E500
:180D680023235E23562A0E31CD0A0AD28A0D2A0A31CD0A0AD1D2920D1B
:180D8000216F31CD0A0AD2920D3ED1CD4116EBCD7A14CD4116E1CD44B9
:180D98001AE1C9E5CD411AD1E1C9CD68177E47FE8CCAB10DCD100A8865
:180DB0002B4B0D78CA820BCD670CFE2CC0C3B20DCD19107EFE88CACE9B
:180DC8000DCD100AA92BCD0A10CDE919CA330DCD9A0BDAEE0CC3810BF6
:180DE0002BCD9A0BCA420EC8FEA5CA750EFEA8CA750EE5FE2CCA5E0E54
:180DF800FE3BCA980EC1CD1910E53A5D31B7C22E0ECD8E1BCD9E1436F6
:180E1000202A9431342A94313AF2304704CA2A0E043A5B31863DB8D4D6
:180E2800420ECDE314AFC4E314E1C3E00D3A5B31B7C8C3420E360021F4
:180E400010313E0DCD1B0A3E0ACD1B0AAF325B313AF1303DC8F5AFCDA4
:180E58001B0AF1C3530E3AF330473A5B31B8D4420ED2980ED60ED26C68
:180E70000E2FC38D0EF5CD6517CD100A292BF1D6A8E5CA880E3A5B31DC
:180E88002F83D2980E3C473E20CD1B0A05C2910EE1CD9A0BC3E70D3FA6
:180EA0005265646F2066726F6D2073746172740D0A003A7D31B7C23CDA
:180EB80007C1219F0ECDE014C38D08CD4B147EFE223E0032F530C2DD75
:180ED0000ECD9F14CD100A3BE5CDE3143EE5CD9108C1DAE90B237EB741
:180EE8002BC5CA300D362CC3F70EE52A8C31F6AF327D31E3C3030FCDFB
:180F0000100A2CCDFD11E3D57EFE2CCA2B0F3A7D31B7C2980F3E3FCD02
:180F18001B0ACD9108D1C1DAE90B237EB72BC5CA300DD53A5D31B7CA69
:180F3000550FCD9A0B5747FE22CA490F3A7D31B757CA460F163A062C5C
:180F48002BCDA214EB21600FE3D5C3630DCD9A0BCDF01AE3CD411AE148
:180F60002BCD9A0BCA6C0FFE2CC2B20EE32BCD9A0BC2FF0ED13A7D31E3
:180F7800B7EBC2C00BD5B621870FC4E014E1C93F45787472612069675B
:180F90006E6F7265640D0A00CD310DB7C2B10F237E23B61E06CA560711
:180FA800235E2356EB227931EBCD9A0BFE83C2980FC32B0F110000C467
:180FC000FD11227E31CDEB06C24807F9D57E23F5D5CD271AE3E5CD94FB
:180FD80017E1CD411AE1CD381AE5CD641AE1C190CD381ACAF70FEB2283
:180FF0000C316960C3560BF92A7E317EFE2CC25A0BCD9A0BCDBF0FCD44
:181008001910F6373A5D318FB7E8C35407CD100A282B1600D50E01CD65
:181020001F07CD90102280312A8031C178FE78D40A107E1600D6B3DAE3
:181038005110FE03D25110FE0117AABA57DA4207227531CD9A0BC335E5
:18105000107AB7C278117E227531D6ACD8FE07D05F3A5D313DB37BCA2B
:18106800D61507835F213406197856BAD023CD0A10C5012810C5434A76
:18108000CD1A1A58514E234623C52A7531C31C10AF325D31CD9A0B1E51
:1810980024CA5607DAF01ACD380CD2F710FE262012CD9A0BFE48CA341B
:1810B0001FFE42CAA41F1E02CA5607FEACCA9010FE2ECAF01AFEADCA6C
:1810C800E610FE22CA9F14FEAACAD811FEA7CA0314D6B6D20811CD1543
:1810E00010CD100A29C9167DCD1C102A8031E5CD121ACD0A10E1C9CD6C
:1810F800FD11E5EB2294313A5D31B7CC271AE1C90600074FC5CD9A0B52
:1811100079FE31DA2F11CD1510CD100A2CCD0B10EB2A9431E3E5EBCDBE
:181128006817EBE3C33711CDDE10E311F210D5019304094E236669E907
:1811400015FEADC8FE2DC814FE2BC8FEACC82BC9F6AFF5CD0A10CD4C17
:181158000CF1EBC1E3EBCD2A1AF5CD4C0CF1C17921C113C27311A34F85
:1811700078A2E9B34F78B2E9218A113A5D311F7A175F166478BAD0C37D
:1811880079108C1179B71FC1D1F5CD0C1021CE11E5CA641AAF325D31CE
:1811A000D5CD23167E23234E2346D1C5F5CD2716CD381AF157E17BB2D7
:1811B800C87AD601D8AFBB3CD0151D0ABE2303CAB6113FC3F4193C8F2D
:1811D000C1A0C6FF9FC3FB19165ACD1C10CD0A10CD4C0C7B2F4F7A2F54
:1811E800CDC113C1C328102BCD9A0BC8CD100A2C01EF11C5F6AF325C21
:181200003146CD380CDA4207AF4F325D31CD9A0BDA1912CD380CDA26E5
:18121800124FCD9A0BDA1A12CD380CD21A12D624C235123C325D310FC8
:18123000814FCD9A0B3A7B313DCAE212F245127ED628CABA12AF327BCC
:1812480031E550592A8E31CD0A0A119031CA2A192A8831EB2A8631CDAA
:181260000A0ACA7812799623C26D12789623CAAC1223232323C35F1222
:18127800E1E3D511FA10CD0A0AD1CAAF12E3E5C50106002A8A31E50906
:18129000C1E5CD0E07E1228A3160692288312B3600CD0A0AC29E12D1D7
:1812A80073237223EBE1C932973121DE06229431E1C9E52A5C31E35708
:1812C000D5C5CD400CC1F1EBE3E5EB3C577EFE2CCAC012CD100A29220A
:1812D8008031E1225C311E00D511E5F52A88313E19EB2A8A31EBCD0A13
:1812F0000ACA1A137EB923C2FC127EB8235E235623C2E8123A5C31B72E
:18130800C24B07F1444DCA2A1996CA78131E10C35607110400F1CA61C0
:181320000C712370234FCD1F07232322753171233A5C311779010B003B
:18133800D23D13C10371237023F5E5CDD51AEBE1F13DC23513F5424B74
:18135000EB19DA3707CD2807228A312B3600CD0A0AC25B1303572A7525
:18136800315EEB2909EB2B2B73237223F1DA9C13474F7E2316E15E232C
:181380005623E3F5CD0A0AD21513E5CDD51AD119F13D444DC27D132964
:1813980029C109EB2A8031C92A8A31EB210000393A5D31B7CABC13CDAC
:1813B0002316CD23152A0A31EB2A73317D934F7C9A41501E00215D31F6
:1813C800730690C3001A3A5B3147AFC3C213CD5914CD4B1401310DC569
:1813E000D5CD100A28CDFD11E5EB2B562B5EE1CD0A10CD100A29CD10A7
:1813F8000AB4444DE3712370C39814CD5914D5CDDE10CD0A10E35E2323
:1814100056237AB3CA4E077E23666FE52A8E31E3228E312A9231E52AFB
:181428009031E5219031D5CD411AE1CD07102BCD9A0BC24207E1229027
:1814400031E1229231E1228E31E1C9E52A0C31237CB5E1C01E16C356A3
:1814580007CD100AA73E80327B31B647CD0212C30A10CD0A10CD8E1B33
:18147000CD9E14CD2316017E16C57E2323E5CDF914E14E2346CD9214F7
:18148800E56FCD1616D1C9CDF914216F31E5772323732372E1C92B0645
:1814A0002250E50EFF237E0CB7CAB414BACAB414B8C2A514FE22CC9AD5
:1814B8000BE323EB79CD9214116F312A61312294313E01325D31CD44D0
:1814D0001ACD0A0A226131E17EC01E1EC3560723CD9E14CD2316CD382D
:1814E8001A1C1DC80ACD1B0AFE0DCC4C0E03C3EA14B70EF1F52A0A31D0
:18150000EB2A73312F4F06FF0923CD0A0ADA171522733123EBF1C9F105
:181518001E1ACA5607BFF501FB14C52A5F31227331210000E52A0A31E8
:18153000E5216331EB2A6131EBCD0A0A013415C288152A8631EB2A886F
:1815480031EBCD0A0ACA5B157E2323B7CD8B15C34515C1EB2A8A31EBD3
:18156000CD0A0ACAB115CD381A7BE509B7F25A15227531E14E0600095C
:181578000923EB2A7531EBCD0A0ACA5B15017A15C5F6807E23235E235E
:181590005623F0B7C8444D2A7331CD0A0A6069D8E1E3CD0A0AE3E560AD
:1815A80069D0C1F1F1E5D5C5C9D1E17DB4C82B462B4EE52B2B6E2600A3
:1815C0000950592B444D2A7331CD1107E171237069602BC32615C5E571
:1815D8002A9431E3CD9010E3CD0B107EE52A9431E5861E1CDA5607CDF6
:1815F0008F14D1CD2716E3CD2616E52A7131EBCD0D16CD0D16212510A7
:18160800E3E5C3C014E1E37E23234E23466F2C2DC80A120313C317167A
:18162000CD0B102A9431EBCD4116EBC0D550591B4E2A7331CD0A0AC2C9
:181638003F164709227331E1C92A61312B462B4E2B2BCD0A0AC0226165
:1816500031C901D113C5CD2016AF57325D317EB7C901D113C5CD561634
:18166800CA610C23235E23561AC93E01CD8F14CD6B172A713173C1C372
:18168000C014CD1B17AFE34FE57EB8DA901678110E00C5CDF914C1E12B
:18169800E5232346236668060009444DCD92146FCD1616D1CD2716C3BF
:1816B000C014CD1B17D1D51A90C38616EB7ECD20170405CA610CC51E10
:1816C800FFFE29CAD516CD100A2CCD6817CD100A29F1E3018816C53D4B
:1816E000BE0600D04F7E91BB47D843C9CD5616CA09185F23237E23664A
:1816F8006FE5194672E3C57EFE24C20A17CD341F180DFE25C21417CD68
:18171000A41F1803CDF01AC1E170C9EBCD100A29C1D1C543C9CD6B1784
:1817280032EF30CDEE30C3D113CD5517C3B630CD5517F51E002BCD9A06
:181740000BCA4B17CD100A2CCD6817C1CDEE30ABA0CA4C17C9CD6817C2
:1817580032EF3032B730CD100A2CC36817CD9A0BCD0710CD460C7AB714
:18177000C2610C2BCD9A0B7BC9CD4C0C1AC3D113CD0710CD4C0CD5CDC0
:18178800100A2CCD6817D112C921671CCD381AC3A317CD381A21C1D1F9
:1817A000CD121A78B7C83A9731B7CA2A1A90D2BD172F3CEBCD1A1AEB02
:1817B800CD2A1AC1D1FE19D0F5CD4F1A67F1CD6818B4219431F2E31739
:1817D000CD4818D229182334CA51072E01CD7E18C32918AF90477E9B13
:1817E8005F237E9A57237E994FDC54186863AF4779B7C216184A546543
:181800006F78D608FEE0C2F717AF329731C905297A1757798F4FF20E7E
:1818180018785C45B7CA29182197318677D20918C878219731B7FC3BD5
:181830001846237EE680A94FC32A1A1CC014C00CC00E8034C0C3510723
:181848007E835F237E8A57237E894FC92198317E2F77AF6F90477D9B49
:181860005F7D9A577D994FC90600D608DA7718435A510E00C36A18C621
:18187800096FAF2DC8791F4F7A1F577B1F5F781F47C37A1800000081B8
:1818900003AA561980F122768045AA3882CDE919B7EA610C2197317EAE
:1818A80001358011F30490F570D5C5CDA317C1D104CD3F19218C18CD07
:1818C0009A17219018CD311D018080110000CDA317F1CD641B013180F3
:1818D80011187221C1D1CDE919C82E00CDA7197932A631EB22A73101F0
:1818F0000000505821F417E5210019E5E52194317E23B7CA2C19E52EC3
:18190800081F6779D21A19E52AA73119EBE13AA631891F4F7A1F577B7C
:181920001F5F781F472D7CC20919E1C9435A514FC9CD1A1A012084115F
:181938000000CD2A1AC1D1CDE919CA45072EFFCDA71934342B7E32C250
:18195000302B7E32BE302B7E32BA3041EBAF4F575F32C530E5C57DCDC6
:18196800B930DE003FD2771932C530F1F137D2C1E1793C3D1FFA2A18FE
:18198000177B175F7A175779174F297817473AC5301732C53079B2B336
:18199800C26419E521973135E1C26419C3510778B7CACB197D21973177
:1819B000AE80471FA878F2CA19C68077CA2A19CD4F1A772BC9CDE9195C
:1819C8002FE1B7E1F20918C35107CD351A78B7C8C602DA510747CDA36D
:1819E0001721973134C0C351073A9731B7C83A9631FE2F179FC03CC9B6
:1819F800CDE91906881100002197314F70060023368017C3F117CDE94A
:181A100019F02196317EEE8077C9EB2A9431E3E52A9631E3E5EBC9CDC5
:181A2800381AEB2294316069229631EBC92194315E2356234E23462362
:181A4000C911943106041A77132305C2461AC92196317E07371F773FB5
:181A58001F2323777907371F4F1FAEC978B7CAE91921F219E5CDE91904
:181A700079C8219631AE79F8CD7E1A1FA9C92378BEC02B79BEC02B7A40
:181A8800BEC02B7B96C0E1E1C9474F575FB7C8E5CD351ACD4F1AAE672A
:181AA000FCB51A3E9890CD68187C17DC3B180600DC5418E1C91B7AA3BE
:181AB8003CC00BC92197317EFE983A9431D07ECD911A36987BF57917B6
:181AD000CDF117F1C921000078B1C83E1029DA1513EB29EBD2EB1A0905
:181AE800DA15133DC2DD1AC9FE2DF5CAFC1AFE2BCAFC1A2BCD091847BC
:181B0000575F2F4FCD9A0BDA4D1BFE2ECA281BFE45C22C1BCD9A0BCD21
:181B18004011CD9A0BDA6F1B14C22C1BAF935F0C0CCA041BE57B90F4EB
:181B3000451BF23B1BF5CD3119F13CC22F1BD1F1CC121AEBC9C8F5CDB8
:181B4800D219F13DC9D557788947C5E5D5CDD219F1D630CD641BE1C113
:181B6000D1C3041BCD1A1ACDFB19C1D1C3A3177B0707830786D6305FCB
:181B7800C31A1BE521DA06CDE014E1EBAF0698CD001A21DF14E5219903
:181B900031E5CDE9193620F29C1B362D233630CA521CE5FC121AAFF584
:181BA800CD581C01439111F84FCD641AB7E2C91BF1CD461BF5C3AB1B52
:181BC000CD3119F13CF5CD581CCD91173CCD911ACD2A1A010603F181DD
:181BD8003CFAE51BFE08D2E51B3C473E023D3DE1F5116B1C05C2F61B64
:181BF000362E2336302305362ECC3F1AC5E5D5CD351AE1062F047B9679
:181C08005F237A9E5723799E4F2B2BD2051CCD481823CD2A1AEBE17064
:181C200023C10DC2F61B05CA361C2B7EFE30CA2A1CFE2EC43F1AF1CADC
:181C3800551C364523362BF2461C362D2F3C062F04D60AD2481CC63AB3
:181C5000237023772371E1C901749411F723CD641AB7E1E2C01BE90054
:181C6800000080A08601102700E803006400000A000001000021121ADF
:181C8000E3E9CD1A1A21671CCD271AC1D1CDE91978CAD01CF29B1CB7DE
:181C9800CA4507B7CA0A18D5C579F67FCD351AF2B81CD5C5CDBC1AC113
:181CB000D1F5CD641AE17C1FE1229631E1229431DC7D1CCC121AD5C5F6
:181CC800CD9D18C1D1CDDE18CD1A1A013881113BAACDDE183A9731FEB9
:181CE00088D2C519CDBC1AC680C602DAC519F5218C18CD9417CDD5185F
:181CF800F1C1D1F5CDA017CD121A21101DCD401D110000C14AC3DE1892
:181D100008402E9474704F2E776E02887AE6A02A7C50AAAA7EFFFF7F9C
:181D28007F0000808100000081CD1A1A11DC18D5E5CD351ACDDE18E122
:181D4000CD1A1A7E23CD271A06F1C1D13DC8D5C5F5E5CDDE18E1CD3830
:181D58001AE5CDA317E1C3491DCDE91921C930FAC21D21EA30CD271AD8
:181D700021C930C886E6070600772387874F09CD381ACDDE183AC830EC
:181D88003CE6030600FE018832C83021C61D87874F09CD9417CD351A69
:181DA0007B59EE4F4F36802B46368021C730347ED6ABC2B91D770C1573
:181DB8001CCDF41721EA30C3411A772B772B77C39D1D68B1466899E945
:181DD000926910D1756821201ECD9417CD1A1A01498311DB0FCD2A1A91
:181DE800C1D1CD3F19CD1A1ACDBC1AC1D1CDA01721241ECD9A17CDE9DB
:181E00001937F20C1ECD9117CDE919B7F5F4121A21241ECD9417F1D4AE
:181E1800121A21281EC3311DDB0F49810000007F05BAD71E866426997E
:181E30008758342387E05DA586DA0F4983CD1A1ACDDC1DC1E1CD1A1A56
:181E4800EBCD2A1ACDD61DC33D19CDE919FC7D1CFC121A3A9731FE81A0
:181E6000DA6F1E0100815159CD3F19219A17E521791ECD311D21201EC9
:181E7800C9094AD73B78026E847BFEC12F7C74319A7D843D5A7DC87F38
:181E9000917EE4BB4C7E6CAAAA7F00000081C9D7C93E0CC3DB1FCD685D
:181EA800177B32F230C9CD0710CD4C0CED53F630ED53F830C9CD4C0CAE
:181EC000D5E146237EC3C213CD0710CD4C0CD5CD100A2CCD0710CD4CE7
:181ED8000CE3732372E1C9CD0A10CD4C0CC52199317AFE00280CCD1705
:181EF0001F78FE302802702371237BCD171F7AFE00200578FE302802D9
:181F080070237123AF772377C1219931C3701447E60FFE0A3802C6079C
:181F2000C6304F780F0F0F0FE60FFE0A3802C607C63047C9EB2100009A
:181F3800CD4D1FDA6D1F1805CD4D1F381F29292929B56F18F3131AFE47
:181F500020CA4D1FD630D8FE0A3805D607FE0AD8FE103FC9EB7A4BE598
:181F6800CDC113E1C91E26C35607CD0A10CD4C0CC52199310611057862
:181F8000FE012808CB13CB1230F41804CB13CB123E30CE007723052069
:181F9800F3AF772377C1219931C37014EB210000CDC11FDACF1FD63004
:181FB00029B56FCDC11F30F6EB7A4BE5CDC113E1C9131AFE20CAC11F24
:181FC800FE30D8FE323FC91E28C35607DD21FFFFC3A603C30800C30067
:181FE000003E0032FD30C3AD03ED45F5A0C1B83E00C9CD1B0AC3420E8D
:00000001FF

View File

@@ -0,0 +1,341 @@
:0430060000000000C6
:18000000F3C3A40000000000C332000000000000C31B000000000000BB
:18001800C36C003A0030FE002008CD730028FBDB81C9CD7A0028FBDB44
:1800300083C9F53A0030FE00200D1801F5CD600028FBF1D381C9F5CDB4
:18004800660028FBF1D383C9F5CD66002004F1E600C9F1D383F6FFC916
:18006000DB800FCB47C9DB820FCB47C93A0030FE002007DB80E601FE2D
:1800780000C9DB82E601FE00C9D7FE0A28FBFE1B20023E03C9FE0D2822
:180090000AFE0C2804FE203801CFC93E0DCF3E0ACF3E0DC9312A303E1B
:1800A80095D380D3823E00320030210E03CD3701210E032204302A0476
:1800C000307EB7280CCD5000280723220430C3BE00CD7300280F3E0094
:1800D800320030CD1B00FE20C2D1001812CD7A0028D43E01320030CD3A
:1800F0001B00FE20C2BE003E0CCD3C00CD5000CD3E01219C02CD3701FF
:18010800210801E5CD3E013E3ECFCD8100FE2038F9FE3ACAB501CD8DCA
:1801200000E65FFE49CAF601FE47CAAF01FE58CAFA013E3FCF18D57EE9
:18013800B7C8CF2318F93E0DCF3E0ACFC9CD8100FE03C8FE2038F6C907
:18015000CD450147CD45014FCD8F014F7B915F79C9210000CDA801FEED
:180168000D200E37C9210000CDA801FE0DC8FE2CC8FE0328EE29292956
:1801800029D630FE0A3802D607E60F856F18E178D630FE0A3802D6079A
:18019800070707074779D630FE0A3802D60780C9CD8100CD8D00C9CDC7
:1801B0006101D8E5C91E00CD500157CD500167CD50016FCD5001FE018D
:1801C8002009CD50017BA7281E18157AA7280BCD500177233E2ECF15E7
:1801E00018F1CD50017BA7C821FD02CD3701C9213403CD3701C9C33FE0
:1801F80003C9210C02CD3701CD4501C8E65FFE59CA2A02C90D0A426FF1
:180210006F742043502F4D3F000D0A4C6F6164696E672043502F4D0D74
:180228000A00211902CD370106183E0032063032073032083032093071
:180240002100D0220230CD74021100022A0230192202303A06303C3264
:18025800063010EA3A0030F52AFEFFE93A0830D38C3A0730D38B3A060F
:1802700030D38AC9F5C5E5DB89FE8020FACD64023E00D3890E04068020
:18028800DB89FEE020FADB8877230520F30D20EEE1C1F1C943502F4D67
:1802A00020426F6F7420524F4D20322E300D0A492D5374727420496EC3
:1802B8007472700D0A582D426F6F742043502F4D0D0A3A6E6E6E6E2D43
:1802D0004C6F6164204920726372640D0A476E6E6E6E2D52206C6F636F
:1802E8000D0A000D0A436F6C64206F72207761726D3F0D0A0043686510
:18030000636B73756D206572726F720D0A000C5072657373205B7370EA
:180318006163655D20746F20616374697661746520636F6E736F6C65C0
:180330002E0D0A00436F6D706C6574650D0A0021EB02CD3701CD4501FA
:18034800C8E65FFE43CA5603FE57CA5903C9C35C03C3FA03DD21000008
:18036000C367030D0C831321B030F9C3A21F113406066321B0301A77E5
:18037800231305C27603F9CD3508CD030E325A3132A931214904CDA171
:1803900014CD5208CD5B0BB7C2B003210D32237CB5CAC2037E472F770D
:1803A800BE70CA9E03C3C203CD270CB7C20307EB2B3ED94677BE70C2BF
:1803C0008B032B110C32CDCB09DA8B0311CEFF225F3119220A31CD1031
:1803D800082A0A3111EFFF1911A9317D936F7C9A67E5211204CDA11403
:1803F000E1CD441B210304CDA114311631CD3508C34E072042797465F0
:180408007320667265650D0A00005A38302042415349432056657220DF
:18042000342E37620D0A436F707972696768742028432920313937384C
:18043800206279204D6963726F736F66740D0A00004D656D6F7279202B
:18045000746F7000B9197D1ACF19B3306113E6168F13431C221D5E18E7
:18046800911C971D9D1DFE1D131E3A177E1E013113162B14AD16221693
:180480003316A01E331F431673167D16C54E44C64F52CE455854C44114
:180498005441C94E505554C4494DD2454144CC4554C74F544FD2554E1E
:1804B000C946D24553544F5245C74F535542D2455455524ED2454DD3EA
:1804C800544F50CF5554CF4ECE554C4CD7414954C44546D04F4B45C462
:1804E0004F4B45D3435245454ECC494E4553C34C53D749445448CD4F6C
:1804F8004E49544F52D34554D245534554D052494E54C34F4E54CC491B
:180510005354C34C454152C34C4F4144C353415645CE4557D441422887
:18052800D44FC64ED3504328D448454ECE4F54D3544550ABADAAAFDE8B
:18054000C14E44CF52BEBDBCD3474EC94E54C14253D55352C65245C92F
:180558004E50D04F53D35152D24E44CC4F47C55850C34F53D3494ED42F
:18057000414EC1544ED045454BC445454BD04F494E54CC454ED3545261
:1805880024D6414CC15343C3485224C8455824C2494E24CC4546542427
:1805A000D24947485424CD49442480A50BA20A7D0FF20C840EB911B32E
:1805B8000E090DAF0C920C810D6B0B9E0CCD0CF40CA30BF216630DE41D
:1805D0000BF81697134117891EF40C6F1E621E671E9F1F04310731A5EF
:1805E8000DD10B170A4C0CF40CF40C0F08792B1B795F177C9D187CFE29
:18060000187F4C1C5012114611114E46534E52474F4446434F564F4DDD
:18061800554C425344442F304944544D4F534C535354434E55464D4FCF
:180630004858424EC3FA03C3220CD300C9D6006F7CDE006778DE004792
:180648003E00C9000000354ACA99391C76982295B3980ADD479853D162
:1806600099990A1A9F9865BCCD98D6773E9852C74F80DB00C901FF1CA4
:1806780000001400140000000000C34809C30000C30000C300000D32A6
:18069000FEFFAA31204572726F720020696E20004F6B0D0A00004272B4
:1806A80065616B00210400397E23FE81C04E234623E569607AB3EBCA61
:1806C000C606EBCDCB09010D00E1C809C3B006CDE906C5E3C1CDCB09CB
:1806D8007E02C80B2BC3D506E52A8A31060009093EE53ED0956F3EFF9A
:1806F0009CDAF8066739E1D81E0CC317072A7931220C311E02011E1494
:18070800011E00011E12011E22011E0A011E18CD350832F530CDF60DB7
:18072000210A06573E3FCDDC09197ECDDC09CD5B0BCDDC09219406CD54
:18073800A1142A0C3111FEFFCDCB09CA67037CA53CC43C1B3EC1AF3252
:18075000F530CDF60D21A006CDA11421FFFF220C31CD4809DA5B07CDAE
:180768005B0B3C3DCA5B07F5CD270CD5CD5F0847D1F1D23B0BD5C5AF06
:18078000327C31CD5B0BB7F5CDEF07DA9407F1F5CAC80CB7C5D2AB07E7
:18079800EB2A86311A020313CDCB09C29C076069228631D1F1CAD2073E
:1807B0002A8631E3C109E5CDCF06E1228631EB74D123237323722311B0
:1807C80011311A772313B7C2CA07CD1B0823EB626B7E23B6CA5B072355
:1807E0002323AFBE23C2E307EB732372C3D7072A0E31444D7E23B62B6F
:1807F800C823237E23666FCDCB0960697E23666F3FC83FD0C3F207C0F3
:180810002A0E31AF772377232286312A0E312B227E312A5F31227331C6
:18082800AFCD6B0B2A8631228831228A31C12A0A31F9216331226131A5
:18084000AF6F67228431327B31228E31E5C52A7E31C93E3FCDDC093ECC
:1808580020CDDC09C3FE30AF325E310E051111317EFE20CAE70847FE55
:1808700022CA0709B7CA0E093A5E31B77EC2E708FE3F3E9ECAE7087EDD
:18088800FE30DA9208FE3CDAE708D5118B04C501E308C5067F7EFE6166
:1808A000DAAB08FE7BD2AB08E65F774EEB23B6F2AD08047EE67FC8B9D8
:1808B800C2AD08EBE5131AB7FADF084F78FE88C2CE08CD5B0B2B237E38
:1808D000FE61DAD708E65FB9CABD08E1C3AB0848F1EBC9EB79C1D1230E
:1808E80012130CD63ACAF508FE49C2F808325E31D654C26808477EB74E
:18090000CA0E09B8CAE70823120C13C3FE082110311213121312C93AAF
:18091800F430B73E0032F430C22B0905CA4809CDDC093E052BCA3F0910
:180930007ECDDC09C35109052BCDDC09C25109CDDC09CD030EC34809C0
:180948002111310601AF32F430CD060A4FFE7FCA17093AF430B7CA6A4C
:18096000093E00CDDC09AF32F43079FE07CAAE09FE03CC030E37C8FEA7
:180978000DCAFE0DFE15CA4209FE40CA3F09FE5FCA3709FE08CA370996
:18099000FE12C2A909C5D5E53600CDB31F211131CDA114E1D1C1C3510B
:1809A80009FE20DA510978FE493E07D2C3097971327C312304CDDC0998
:1809C000C35109CDDC093E08C3BD097C92C07D93C97EE3BE23E3CA5B90
:1809D8000BC30307F53AF530B7C2D614F1C5F5FE20DA000A3AF2304728
:1809F0003A5B3104CAFC0905B8CC030E3C325B31F1C1CD9C1FC9CD6092
:180A08001EE67FFE0FC03AF5302F32F530AFC9CD270CC0C1CDEF07C520
:180A2000CD6D0AE14E23462378B1CA4E07CD760ACD860BC5CD030E5ECB
:180A3800235623E5EBCD441B3E20E1CDDC097EB723CA230AF2430AD6B9
:180A50007F4F118C041A13B7F2550A0DC2550AE67FCDDC091A13B7F2CF
:180A68005F0AC3460AE52AF83022F630E1C9E5D52AF63011FFFFED5A71
:180A800022F630D1E1F0E52AF83022F630CD601EFE03CA990AE1C37622
:180A98000A2AF83022F630C3FD033E64327B31CD090DC1E5CDF20C22E9
:180AB000773121020039CDB006D1C2D20A09D52B562B5E2323E52A7784
:180AC80031CDCB09E1C2B60AD1F9EB0E08CDE006E52A7731E3E52A0CAE
:180AE00031E3CDCB0FCDD109A6CDC80FE5CDF619E1C5D5010081515AE9
:180AF8007EFEAB3E01C20E0BCD5B0BCDC80FE5CDF619CDAA19E1C5D502
:180B1000F533E52A7E31E30681C533CD860B227E317EFE3ACA3B0BB7D9
:180B2800C20307237E23B6CAAD0B235E2356EB220C31EBCD5B0B111B5F
:180B40000BD5C8D680DA090DFE25D20307074F0600EB21AB05094E231E
:180B580046C5EB237EFE3AD0FE20CA5B0BFE303F3C3DC9EB2A0E31CACB
:180B7000800BEBCD270CE5CDEF076069D1D2C80C2B228C31EBC9DFC8AA
:180B8800D7FE1B2811FE03280DFE13C0D7FE11C8FE03280718F63EFFFC
:180BA00032FD30C0F6C0227E3121F6FFC12A0C31F57DA43CCAC00B2250
:180BB80082312A7E31228431AF32F530CDF60DF121A606C23707C34E1D
:180BD000072A84317CB51E20CA1707EB2A8231220C31EBC9CD2917C028
:180BE80032F130C9E52AFA3006004F0922FA30E1C97EFE41D8FE5B3F1F
:180C0000C9CD5B0BCDC80FCDAA19FA220C3A9731FE90DA521A0180909D
:180C1800110000E5CD251AE151C81E08C317072B110000CD5B0BD0E59D
:180C3000F5219819CDCB09DA0307626B19291929F1D6305F160019EB9F
:180C4800E1C32B0CCA1F08CD040C2BCD5B0BE52A5F31CA6F0CE1CDD12A
:180C6000092CD5CD040C2BCD5B0BC20307E3EB7D935F7C9A57DAF806E9
:180C7800E52A863101280009CDCB09D2F806EB220A31E1225F31E1C37C
:180C90001F08CA1B08CD1F08011B0BC3AE0C0E03CDE006C1E5E52A0C1B
:180CA80031E33E8CF533C5CD270CCDF40CE52A0C31CDCB09E123DCF2DD
:180CC00007D4EF0760692BD81E0EC31707C016FFCDAC06F9FE8C1E0479
:180CD800C21707E1220C31237CB5C2EC0C3A7C31B7C24D07211B0BE3F8
:180CF0003EE1013A0E0006007948477EB7C8B8C823FE22CAF80CC3FB2A
:180D08000CCDBE11CDD109B4D53A5D31F5CDDA0FF1E3227E311FCDCD2A
:180D20000FCA5C0DE52A9431E523235E23562A0E31CDCB09D24B0D2A45
:180D38000A31CDCB09D1D2530D216F31CDCB09D2530D3ED1CD0216EB51
:180D5000CD3B14CD0216E1CD051AE1C9E5CD021AD1E1C9CD29177E47F8
:180D6800FE8CCA720DCDD109882B4B0D78CA430BCD280CFE2CC0C3733D
:180D80000DCDDA0F7EFE88CA8F0DCDD109A92BCDCB0FCDAA19CAF40CB2
:180D9800CD5B0BDAAF0CC3420B2BCD5B0BCA030EC8FEA5CA360EFEA813
:180DB000CA360EE5FE2CCA1F0EFE3BCA590EC1CDDA0FE53A5D31B7C210
:180DC800EF0DCD4F1BCD5F1436202A9431342A94313AF2304704CAEBDC
:180DE0000D043A5B31863DB8D4030ECDA414AFC4A414E1C3A10D3A5B2D
:180DF80031B7C8C3030E36002110313E0DCDDC093E0ACDDC09AF325B94
:180E1000313AF1303DC8F5AFCDDC09F1C3140E3AF330473A5B31B8D417
:180E2800030ED2590ED60ED22D0E2FC34E0EF5CD2617CDD109292BF13E
:180E4000D6A8E5CA490E3A5B312F83D2590E3C473E20CDDC0905C252B9
:180E58000EE1CD5B0BC3A80D3F5265646F2066726F6D207374617274FD
:180E70000D0A003A7D31B7C2FD06C121600ECDA114C34E08CD0C147E99
:180E8800FE223E0032F530C29E0ECD6014CDD1093BE5CDA4143EE5CDB2
:180EA0005208C1DAAA0B237EB72BC5CAF10C362CC3B80EE52A8C31F6D4
:180EB800AF327D31E3C3C40ECDD1092CCDBE11E3D57EFE2CCAEC0E3A4E
:180ED0007D31B7C2590F3E3FCDDC09CD5208D1C1DAAA0B237EB72BC5BC
:180EE800CAF10CD53A5D31B7CA160FCD5B0B5747FE22CA0A0F3A7D312C
:180F0000B757CA070F163A062C2BCD6314EB21210FE3D5C3240DCD5BEA
:180F18000BCDB11AE3CD021AE12BCD5B0BCA2D0FFE2CC2730EE32BCDC5
:180F30005B0BC2C00ED13A7D31B7EBC2810BD5B621480FC4A114E1C9E4
:180F48003F45787472612069676E6F7265640D0A00CDF20CB7C2720F6A
:180F6000237E23B61E06CA1707235E2356EB227931EBCD5B0BFE83C2E1
:180F7800590FC3EC0E110000C4BE11227E31CDAC06C20907F9D57E2307
:180F9000F5D5CDE819E3E5CD5517E1CD021AE1CDF919E5CD251AE1C193
:180FA80090CDF919CAB80FEB220C316960C3170BF92A7E317EFE2CC2FD
:180FC0001B0BCD5B0BCD800FCDDA0FF6373A5D318FB7E8C31507CDD10E
:180FD80009282B1600D50E01CDE006CD51102280312A8031C178FE786D
:180FF000D4CB0F7E1600D6B3DA1210FE03D21210FE0117AABA57DA037F
:1810080007227531CD5B0BC3F60F7AB7C239117E227531D6ACD8FE0724
:18102000D05F3A5D313DB37BCA971507835F21F505197856BAD023CD7B
:18103800CB0FC501E90FC5434ACDDB1958514E234623C52A7531C3DD3D
:181050000FAF325D31CD5B0B1E24CA1707DAB11ACDF90BD2B810FE2679
:181068002012CD5B0BFE48CAF51EFE42CA651F1E02CA1707FEACCA518D
:1810800010FE2ECAB11AFEADCAA710FE22CA6014FEAACA9911FEA7CA72
:18109800C413D6B6D2C910CDD60FCDD10929C9167DCDDD0F2A8031E5DB
:1810B000CDD319CDCB0FE1C9CDBE11E5EB2294313A5D31B7CCE819E19E
:1810C800C90600074FC5CD5B0B79FE31DAF010CDD60FCDD1092CCDCC53
:1810E0000FEB2A9431E3E5EBCD2917EBE3C3F810CD9F10E311B310D5AE
:1810F800015404094E236669E915FEADC8FE2DC814FE2BC8FEACC82B38
:18111000C9F6AFF5CDCB0FCD0D0CF1EBC1E3EBCDEB19F5CD0D0CF1C10E
:1811280079218213C23411A34F78A2E9B34F78B2E9214B113A5D311F0B
:181140007A175F166478BAD0C33A104D1179B71FC1D1F5CDCD0F218F91
:1811580011E5CA251AAF325D31D5CDE4157E23234E2346D1C5F5CDE8BB
:1811700015CDF919F157E17BB2C87AD601D8AFBB3CD0151D0ABE230396
:18118800CA77113FC3B5193C8FC1A0C6FF9FC3BC19165ACDDD0FCDCB44
:1811A0000FCD0D0C7B2F4F7A2FCD8213C1C3E90F2BCD5B0BC8CDD109F5
:1811B8002C01B011C5F6AF325C3146CDF90BDA0307AF4F325D31CD5B27
:1811D0000BDADA11CDF90BDAE7114FCD5B0BDADB11CDF90BD2DB11D6E7
:1811E80024C2F6113C325D310F814FCD5B0B3A7B313DCAA312F2061248
:181200007ED628CA7B12AF327B31E550592A8E31CDCB09119031CAEBD7
:18121800182A8831EB2A8631CDCB09CA3912799623C22E12789623CA12
:181230006D1223232323C32012E1E3D511BB10CDCB09D1CA7012E3E5AB
:18124800C50106002A8A31E509C1E5CDCF06E1228A3160692288312B1A
:181260003600CDCB09C25F12D173237223EBE1C9329731219F06229465
:1812780031E1C9E52A5C31E357D5C5CD010CC1F1EBE3E5EB3C577EFEDA
:181290002CCA8112CDD10929228031E1225C311E00D511E5F52A8831C9
:1812A8003E19EB2A8A31EBCDCB09CADB127EB923C2BD127EB8235E23FF
:1812C0005623C2A9123A5C31B7C20C07F1444DCAEB1896CA39131E10A4
:1812D800C31707110400F1CA220C712370234FCDE00623232275317177
:1812F000233A5C311779010B00D2FE12C10371237023F5E5CD961AEB51
:18130800E1F13DC2F612F5424BEB19DAF806CDE906228A312B3600CDCF
:18132000CB09C21C1303572A75315EEB2909EB2B2B73237223F1DA5DB7
:1813380013474F7E2316E15E235623E3F5CDCB09D2D612E5CD961AD1FC
:1813500019F13D444DC23E132929C109EB2A8031C92A8A31EB210000FE
:18136800393A5D31B7CA7D13CDE415CDE4142A0A31EB2A73317D934F53
:181380007C9A41501E00215D31730690C3C1193A5B3147AFC38313CD59
:181398001A14CD0C1401F20CC5D5CDD10928CDBE11E5EB2B562B5EE163
:1813B000CDCB0FCDD10929CDD109B4444DE3712370C35914CD1A14D5DB
:1813C800CD9F10CDCB0FE35E2356237AB3CA0F077E23666FE52A8E31BC
:1813E000E3228E312A9231E52A9031E5219031D5CD021AE1CDC80F2B3F
:1813F800CD5B0BC20307E1229031E1229231E1228E31E1C9E52A0C319C
:18141000237CB5E1C01E16C31707CDD109A73E80327B31B647CDC31132
:18142800C3CB0FCDCB0FCD4F1BCD5F14CDE415013F16C57E2323E5CD9A
:18144000BA14E14E2346CD5314E56FCDD715D1C9CDBA14216F31E5779B
:181458002323732372E1C92B062250E50EFF237E0CB7CA7514BACA753F
:1814700014B8C26614FE22CC5B0BE323EB79CD5314116F312A613122DD
:1814880094313E01325D31CD051ACDCB09226131E17EC01E1EC317070B
:1814A00023CD5F14CDE415CDF9191C1DC80ACDDC09FE0DCC0D0E03C3B7
:1814B800AB14B70EF1F52A0A31EB2A73312F4F06FF0923CDCB09DAD892
:1814D0001422733123EBF1C9F11E1ACA1707BFF501BC14C52A5F31222B
:1814E8007331210000E52A0A31E5216331EB2A6131EBCDCB0901F51406
:18150000C249152A8631EB2A8831EBCDCB09CA1C157E2323B7CD4C15D4
:18151800C30615C1EB2A8A31EBCDCB09CA7215CDF9197BE509B7F21B63
:1815300015227531E14E0600090923EB2A7531EBCDCB09CA1C15013BDE
:1815480015C5F6807E23235E235623F0B7C8444D2A7331CDCB09606945
:18156000D8E1E3CDCB09E3E56069D0C1F1F1E5D5C5C9D1E17DB4C82B14
:18157800462B4EE52B2B6E26000950592B444D2A7331CDD206E1712377
:181590007069602BC3E714C5E52A9431E3CD5110E3CDCC0F7EE52A94CB
:1815A80031E5861E1CDA1707CD5014D1CDE815E3CDE715E52A7131EB49
:1815C000CDCE15CDCE1521E60FE3E5C38114E1E37E23234E23466F2CA3
:1815D8002DC80A120313C3D815CDCC0F2A9431EBCD0216EBC0D5505994
:1815F0001B4E2A7331CDCB09C200164709227331E1C92A61312B462B1B
:181608004E2B2BCDCB09C0226131C9019213C5CDE115AF57325D317ED6
:18162000B7C9019213C5CD1716CA220C23235E23561AC93E01CD501465
:18163800CD2C172A713173C1C38114CDDC16AFE34FE57EB8DA511678BE
:18165000110E00C5CDBA14C1E1E5232346236668060009444DCD53142B
:181668006FCDD715D1CDE815C38114CDDC16D1D51A90C34716EB7ECDEA
:18168000E1160405CA220CC51EFFFE29CA9616CDD1092CCD2917CDD15D
:181698000929F1E3014916C53DBE0600D04F7E91BB47D843C9CD171600
:1816B000CACA175F23237E23666FE5194672E3C57EFE24C2CB16CDF5F9
:1816C8001E180DFE25C2D516CD651F1803CDB11AC1E170C9EBCDD10986
:1816E00029C1D1C543C9CD2C1732EF30CDEE30C39213CD1617C3B6300F
:1816F800CD1617F51E002BCD5B0BCA0C17CDD1092CCD2917C1CDEE30F6
:18171000ABA0CA0D17C9CD291732EF3032B730CDD1092CC32917CD5B4A
:181728000BCDC80FCD070C7AB7C2220C2BCD5B0B7BC9CD0D0C1AC39202
:1817400013CDC80FCD0D0CD5CDD1092CCD2917D112C921281CCDF9194F
:18175800C36417CDF91921C1D1CDD31978B7C83A9731B7CAEB1990D210
:181770007E172F3CEBCDDB19EBCDEB19C1D1FE19D0F5CD101A67F1CD6F
:181788002918B4219431F2A417CD0918D2EA172334CA12072E01CD3F8B
:1817A00018C3EA17AF90477E9B5F237E9A57237E994FDC15186863AFB9
:1817B8004779B7C2D7174A54656F78D608FEE0C2B817AF329731C90544
:1817D000297A1757798F4FF2CF17785C45B7CAEA172197318677D2CAA4
:1817E80017C878219731B7FCFC1746237EE680A94FC3EB191CC014C027
:181800000CC00E8034C0C312077E835F237E8A57237E894FC921983198
:181818007E2F77AF6F90477D9B5F7D9A577D994FC90600D608DA38187E
:18183000435A510E00C32B18C6096FAF2DC8791F4F7A1F577B1F5F7874
:181848001F47C33B180000008103AA561980F122768045AA3882CDAAC6
:1818600019B7EA220C2197317E01358011F30490F570D5C5CD6417C1CB
:18187800D104CD0019214D18CD5B17215118CDF21C018080110000CD94
:181890006417F1CD251B01318011187221C1D1CDAA19C82E00CD6819F3
:1818A8007932A631EB22A731010000505821B517E521C118E5E52194CD
:1818C000317E23B7CAED18E52E081F6779D2DB18E52AA73119EBE13AD3
:1818D800A631891F4F7A1F577B1F5F781F472D7CC2CA18E1C9435A517E
:1818F0004FC9CDDB19012084110000CDEB19C1D1CDAA19CA06072EFF5A
:18190800CD681934342B7E32C2302B7E32BE302B7E32BA3041EBAF4F8C
:18192000575F32C530E5C57DCDB930DE003FD2381932C530F1F137D2A3
:18193800C1E1793C3D1FFAEB17177B175F7A175779174F297817473AE0
:18195000C5301732C53079B2B3C22519E521973135E1C22519C31207AE
:1819680078B7CA8C197D219731AE80471FA878F28B19C68077CAEB188F
:18198000CD101A772BC9CDAA192FE1B7E1F2CA17C31207CDF61978B7FB
:18199800C8C602DA120747CD641721973134C0C312073A9731B7C83AB1
:1819B0009631FE2F179FC03CC9CDAA1906881100002197314F700600D3
:1819C80023368017C3B217CDAA19F02196317EEE8077C9EB2A9431E33A
:1819E000E52A9631E3E5EBC9CDF919EB2294316069229631EBC92194D1
:1819F800315E2356234E234623C911943106041A77132305C2071AC9B1
:181A10002196317E07371F773F1F2323777907371F4F1FAEC978B7CAB5
:181A2800AA1921B319E5CDAA1979C8219631AE79F8CD3F1A1FA9C9235F
:181A400078BEC02B79BEC02B7ABEC02B7B96C0E1E1C9474F575FB7C801
:181A5800E5CDF619CD101AAE67FC761A3E9890CD29187C17DCFC170621
:181A700000DC1518E1C91B7AA33CC00BC92197317EFE983A9431D07E59
:181A8800CD521A36987BF57917CDB217F1C921000078B1C83E1029DA8C
:181AA000D612EB29EBD2AC1A09DAD6123DC29E1AC9FE2DF5CABD1AFEA5
:181AB8002BCABD1A2BCDCA1747575F2F4FCD5B0BDA0E1BFE2ECAE91AC7
:181AD000FE45C2ED1ACD5B0BCD0111CD5B0BDA301B14C2ED1AAF935F0A
:181AE8000C0CCAC51AE57B90F4061BF2FC1AF5CDF218F13CC2F01AD182
:181B0000F1CCD319EBC9C8F5CD9319F13DC9D557788947C5E5D5CD93F0
:181B180019F1D630CD251BE1C1D1C3C51ACDDB19CDBC19C1D1C3641750
:181B30007B0707830786D6305FC3DB1AE5219B06CDA114E1EBAF0698A5
:181B4800CDC11921A014E5219931E5CDAA193620F25D1B362D23363018
:181B6000CA131CE5FCD319AFF5CD191C01439111F84FCD251AB7E28AA5
:181B78001BF1CD071BF5C36C1BCDF218F13CF5CD191CCD52173CCD528F
:181B90001ACDEB19010603F1813CFAA61BFE08D2A61B3C473E023D3D09
:181BA800E1F5112C1C05C2B71B362E2336302305362ECC001AC5E5D57F
:181BC000CDF619E1062F047B965F237A9E5723799E4F2B2BD2C61BCDB6
:181BD800091823CDEB19EBE17023C10DC2B71B05CAF71B2B7EFE30CA9D
:181BF000EB1BFE2EC4001AF1CA161C364523362BF2071C362D2F3C06F8
:181C08002F04D60AD2091CC63A237023772371E1C901749411F723CD4E
:181C2000251AB7E1E2811BE900000080A08601102700E8030064000041
:181C38000A000001000021D319E3E9CDDB1921281CCDE819C1D1CDAAB3
:181C50001978CA911CF25C1CB7CA0607B7CACB17D5C579F67FCDF619B5
:181C6800F2791CD5C5CD7D1AC1D1F5CD251AE17C1FE1229631E122946F
:181C800031DC3E1CCCD319D5C5CD5E18C1D1CD9F18CDDB1901388111AE
:181C98003BAACD9F183A9731FE88D28619CD7D1AC680C602DA8619F5F2
:181CB000214D18CD5517CD9618F1C1D1F5CD6117CDD31921D11CCD0190
:181CC8001D110000C14AC39F1808402E9474704F2E776E02887AE6A077
:181CE0002A7C50AAAA7EFFFF7F7F0000808100000081CDDB19119D181F
:181CF800D5E5CDF619CD9F18E1CDDB197E23CDE81906F1C1D13DC8D546
:181D1000C5F5E5CD9F18E1CDF919E5CD6417E1C30A1DCDAA1921C93036
:181D2800FA831D21EA30CDE81921C930C886E6070600772387874F09A5
:181D4000CDF919CD9F183AC8303CE6030600FE018832C83021871D87CE
:181D5800874F09CD5517CDF6197B59EE4F4F36802B46368021C73034F6
:181D70007ED6ABC27A1D770C151CCDB51721EA30C3021A772B772B77E1
:181D8800C35E1D68B1466899E9926910D1756821E11DCD5517CDDB19EA
:181DA00001498311DB0FCDEB19C1D1CD0019CDDB19CD7D1AC1D1CD6135
:181DB8001721E51DCD5B17CDAA1937F2CD1DCD5217CDAA19B7F5F4D3BE
:181DD0001921E51DCD5517F1D4D31921E91DC3F21CDB0F498100000029
:181DE8007F05BAD71E866426998758342387E05DA586DA0F4983CDDB85
:181E000019CD9D1DC1E1CDDB19EBCDEB19CD971DC3FE18CDAA19FC3EE7
:181E18001CFCD3193A9731FE81DA301E0100815159CD0019215B17E57B
:181E3000213A1ECDF21C21E11DC9094AD73B78026E847BFEC12F7C7434
:181E4800319A7D843D5A7DC87F917EE4BB4C7E6CAAAA7F00000081C95A
:181E6000D7C93E0CC39C1FCD29177B32F230C9CDC80FCD0D0CED53F69D
:181E780030ED53F830C9CD0D0CD5E146237EC38313CDC80FCD0D0CD5B6
:181E9000CDD1092CCDC80FCD0D0CE3732372E1C9CDCB0FCD0D0CC521D5
:181EA80099317AFE00280CCDD81E78FE302802702371237BCDD81E7A3A
:181EC000FE00200578FE30280270237123AF772377C1219931C331147C
:181ED80047E60FFE0A3802C607C6304F780F0F0F0FE60FFE0A3802C6B1
:181EF00007C63047C9EB210000CD0E1FDA2E1F1805CD0E1F381F2929E0
:181F08002929B56F18F3131AFE20CA0E1FD630D8FE0A3805D607FE0AF6
:181F2000D8FE103FC9EB7A4BE5CD8213E1C91E26C31707CDCB0FCD0D74
:181F38000CC521993106110578FE012808CB13CB1230F41804CB13CB6E
:181F5000123E30CE0077230520F3AF772377C1219931C33114EB2100F9
:181F680000CD821FDA901FD63029B56FCD821F30F6EB7A4BE5CD82138C
:181F8000E1C9131AFE20CA821FFE30D8FE323FC91E28C31707DD21FF87
:181F9800FFC36703C30800C300003E0032FD30C36E03ED45F5A0C1B866
:091FB0003E00C9CDDC09C3030E9B
:00000001FF

File diff suppressed because it is too large Load Diff

View File

@@ -69,7 +69,6 @@ SD_LBA2 .EQU 08CH
primaryIO .ds 1
secNo .ds 1
dmaAddr .ds 2
InitTxtB .ds 2
lba0 .DB 00h
lba1 .DB 00h
@@ -169,25 +168,6 @@ conoutB1: CALL CKACIA1 ; See if ACIA channel B is finished transmitting
OUT (ACIA1_D),A ; OUTput the character
RET
;------------------------------------------------------------------------------
; Non blocking console output routine
; On return Z flag is 0, if the character could be written, else 1
; Use the "primaryIO" flag to determine which output port to send a character.
;------------------------------------------------------------------------------
nbconoutB:
PUSH AF
nbconoutB1: CALL CKACIA1 ; See if ACIA channel B has finished transmitting
JR NZ, nbconoutB2 ; Ready to write
POP AF ; Remove the parameter we don't need
AND $00 ; Indicate failure
RET ; Return if ACIA flag signals not ready
nbconoutB2:
POP AF ; RETrieve character
OUT (ACIA1_D),A ; OUTput the character
OR $ff ; Indicate success
RET
;------------------------------------------------------------------------------
; I/O status check routine
; Use the "primaryIO" flag to determine which port to check.
@@ -269,25 +249,17 @@ M_INIT LD SP,M_STACK ; Set the Stack Pointer
LD (primaryIO),A
LD HL,INITTXT
CALL M_PRINT
; On Display B we need to take care that it does not hang.
LD A,$01
LD (primaryIO),A
LD HL,INITTXT
LD (InitTxtB),HL
CALL M_PRINT
printInitB: LD HL,(InitTxtB)
LD A,(HL) ; Get character
OR A ; Is it $00 ?
JR Z, waitForSpace
CALL nbconoutB ; Print it
JR Z, waitForSpace ; If we can't write, don't increment
INC HL
LD (InitTxtB),HL ; Store pointer into message for next round
JP printInitB
; Wait until space is in one of the buffers to determine the active console
waitForSpace:
CALL ckincharA
JR Z,chkSpaceB
jr Z,notInA
LD A,$00
LD (primaryIO),A
CALL conin
@@ -295,25 +267,22 @@ waitForSpace:
JP NZ, waitForSpace
JR spacePressed
chkSpaceB:
notInA:
CALL ckincharB
JR Z,printInitB ; If no key pressed, try to continue writing the init message on B
JR Z,waitForSpace
LD A,$01
LD (primaryIO),A
CALL conin
CP ' '
JP NZ, printInitB ; If space not pressed, try to continue writing the init message on B
JP NZ, waitForSpace
JR spacePressed
spacePressed:
; Clear message on both consoles
LD A,$0C
CALL conoutA
CALL nbconoutB
;; We only clear the message on the active console,
;; because trying to write on a console not connected could
;; make the system freeze.
CALL conoutB
; primaryIO is now set to the channel where SPACE was pressed
@@ -686,7 +655,7 @@ CKSUMERR .BYTE "Checksum error"
INITTXT
.BYTE $0C
.TEXT "Press [space] to activate the console."
.TEXT "Press [SPACE] to activate console"
.BYTE $0D,$0A, $00
LDETXT

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,693 @@
;==================================================================================
; Contents of this file are copyright Grant Searle
; HEX routines from Joel Owens.
;
; You have permission to use this for NON COMMERCIAL USE ONLY
; If you wish to use it elsewhere, please include an acknowledgement to myself.
;
; http://searle.hostei.com/grant/index.html
;
; eMail: home.micros01@btinternet.com
;
; If the above don't work, please perform an Internet search to see if I have
; updated the web page hosting service.
;
;==================================================================================
;------------------------------------------------------------------------------
;
; Z80 Monitor Rom
;
;------------------------------------------------------------------------------
; General Equates
;------------------------------------------------------------------------------
;CR .EQU 0DH
;LF .EQU 0AH
;ESC .EQU 1BH
;CTRLC .EQU 03H
M_CLS .EQU 0CH
loadAddr .EQU 0D000h ; CP/M load address
numSecs .EQU 24 ; Number of 512 sectors to be loaded
RTS_HIGH .EQU 0D5H
RTS_LOW .EQU 095H
ACIA0_D .EQU $81
ACIA0_C .EQU $80
ACIA1_D .EQU $83
ACIA1_C .EQU $82
SD_DATA .EQU 088H
SD_CONTROL .EQU 089H
SD_STATUS .EQU 089H
SD_LBA0 .EQU 08AH
SD_LBA1 .EQU 08BH
SD_LBA2 .EQU 08CH
.ORG $3000
primaryIO .ds 1
secNo .ds 1
dmaAddr .ds 2
InitTxtB .ds 2
lba0 .DB 00h
lba1 .DB 00h
lba2 .DB 00h
lba3 .DB 00h
stackSpace .ds 32
M_STACK .EQU $ ; Stack top
;------------------------------------------------------------------------------
; START OF MONITOR ROM
;------------------------------------------------------------------------------
MON .ORG $0000 ; MONITOR ROM RESET VECTOR
;------------------------------------------------------------------------------
; Reset
;------------------------------------------------------------------------------
RST00 DI ;Disable INTerrupts
JP M_INIT ;Initialize Hardware and go
NOP
NOP
NOP
NOP
;------------------------------------------------------------------------------
; TX a character over RS232 wait for TXDONE first.
;------------------------------------------------------------------------------
RST08 JP conout
NOP
NOP
NOP
NOP
NOP
;------------------------------------------------------------------------------
; RX a character from buffer wait until char ready.
;------------------------------------------------------------------------------
RST10 JP conin
NOP
NOP
NOP
NOP
NOP
;------------------------------------------------------------------------------
; Check input buffer status
;------------------------------------------------------------------------------
RST18 JP CKINCHAR
;------------------------------------------------------------------------------
; Console input routine
; Use the "primaryIO" flag to determine which input port to monitor.
;------------------------------------------------------------------------------
conin:
LD A,(primaryIO)
CP 0
JR NZ,coninB
coninA:
waitForCharA:
call ckincharA
JR Z, waitForCharA
IN A,(ACIA0_D)
RET ; Char ready in A
coninB:
waitForCharB:
call ckincharB
JR Z, waitForCharB
IN A,(ACIA1_D)
RET ; Char ready in A
;------------------------------------------------------------------------------
; Console output routine
; Use the "primaryIO" flag to determine which output port to send a character.
;------------------------------------------------------------------------------
conout: PUSH AF ; Store character
LD A,(primaryIO)
CP 0
JR NZ,conoutB1
JR conoutA1
conoutA:
PUSH AF
conoutA1: CALL CKACIA0 ; See if ACIA channel A is finished transmitting
JR Z,conoutA1 ; Loop until ACIA flag signals ready
POP AF ; RETrieve character
OUT (ACIA0_D),A ; OUTput the character
RET
conoutB:
PUSH AF
conoutB1: CALL CKACIA1 ; See if ACIA channel B is finished transmitting
JR Z,conoutB1 ; Loop until ACIA flag signals ready
POP AF ; RETrieve character
OUT (ACIA1_D),A ; OUTput the character
RET
;------------------------------------------------------------------------------
; Non blocking console output routine
; On return Z flag is 0, if the character could be written, else 1
; Use the "primaryIO" flag to determine which output port to send a character.
;------------------------------------------------------------------------------
nbconoutB:
PUSH AF
nbconoutB1: CALL CKACIA1 ; See if ACIA channel B has finished transmitting
JR NZ, nbconoutB2 ; Ready to write
POP AF ; Remove the parameter we don't need
AND $00 ; Indicate failure
RET ; Return if ACIA flag signals not ready
nbconoutB2:
POP AF ; RETrieve character
OUT (ACIA1_D),A ; OUTput the character
OR $ff ; Indicate success
RET
;------------------------------------------------------------------------------
; I/O status check routine
; Use the "primaryIO" flag to determine which port to check.
;------------------------------------------------------------------------------
CKACIA0
IN A,(ACIA0_C) ; Status byte D1=TX Buff Empty, D0=RX char ready
RRCA ; Rotates RX status into Carry Flag,
BIT 0,A ; Set Zero flag if still transmitting character
RET
CKACIA1
IN A,(ACIA1_C) ; Status byte D1=TX Buff Empty, D0=RX char ready
RRCA ; Rotates RX status into Carry Flag,
BIT 0,A ; Set Zero flag if still transmitting character
RET
;------------------------------------------------------------------------------
; Check if there is a character in the input buffer
; Use the "primaryIO" flag to determine which port to check.
;------------------------------------------------------------------------------
CKINCHAR
LD A,(primaryIO)
CP 0
JR NZ,ckincharB
ckincharA:
IN A,(ACIA0_C) ; Status byte
AND $01
CP $0 ; Z flag set if no char
RET
ckincharB:
IN A,(ACIA1_C) ; Status byte
AND $01
CP $0 ; Z flag set if no char
RET
;------------------------------------------------------------------------------
; Filtered Character I/O
;------------------------------------------------------------------------------
RDCHR RST 10H
CP LF
JR Z,RDCHR ; Ignore LF
CP ESC
JR NZ,RDCHR1
LD A,CTRLC ; Change ESC to CTRL-C
RDCHR1 RET
WRCHR CP CR
JR Z,WRCRLF ; When CR, write CRLF
CP M_CLS
JR Z,WR ; Allow write of "CLS"
CP ' ' ; Don't write out any other control codes
JR C,NOWR ; ie. < space
WR RST 08H
NOWR RET
WRCRLF LD A,CR
RST 08H
LD A,LF
RST 08H
LD A,CR
RET
;------------------------------------------------------------------------------
; Initialise hardware and start main loop
;------------------------------------------------------------------------------
M_INIT LD SP,M_STACK ; Set the Stack Pointer
LD A,RTS_LOW
OUT (ACIA0_C),A ; Initialise ACIA0
OUT (ACIA1_C),A ; Initialise ACIA1
; Display the "Press space to start" message on both consoles
LD A,$00
LD (primaryIO),A
LD HL,INITTXT
CALL M_PRINT
; On Display B we need to take care that it does not hang.
LD HL,INITTXT
LD (InitTxtB),HL
printInitB: LD HL,(InitTxtB)
LD A,(HL) ; Get character
OR A ; Is it $00 ?
JR Z, waitForSpace
CALL nbconoutB ; Print it
JR Z, waitForSpace ; If we can't write, don't increment
INC HL
LD (InitTxtB),HL ; Store pointer into message for next round
JP printInitB
; Wait until space is in one of the buffers to determine the active console
waitForSpace:
CALL ckincharA
JR Z,chkSpaceB
LD A,$00
LD (primaryIO),A
CALL conin
CP ' '
JP NZ, waitForSpace
JR spacePressed
chkSpaceB:
CALL ckincharB
JR Z,printInitB ; If no key pressed, try to continue writing the init message on B
LD A,$01
LD (primaryIO),A
CALL conin
CP ' '
JP NZ, printInitB ; If space not pressed, try to continue writing the init message on B
spacePressed:
; Clear message on both consoles
LD A,$0C
CALL conoutA
CALL nbconoutB
;; We only clear the message on the active console,
;; because trying to write on a console not connected could
;; make the system freeze.
; primaryIO is now set to the channel where SPACE was pressed
CALL TXCRLF ; TXCRLF
LD HL,M_SIGNON ; Print SIGNON message
CALL M_PRINT
;------------------------------------------------------------------------------
; Monitor command loop
;------------------------------------------------------------------------------
MAIN LD HL,MAIN ; Save entry point for Monitor
PUSH HL ; This is the return address
MAIN0 CALL TXCRLF ; Entry point for Monitor, Normal
LD A,'>' ; Get a ">"
RST 08H ; print it
MAIN1 CALL RDCHR ; Get a character from the input port
CP ' ' ; <spc> or less?
JR C,MAIN1 ; Go back
CP ':' ; ":"?
JP Z,LOAD ; First character of a HEX load
CALL WRCHR ; Print char on console
AND $5F ; Make character uppercase
CP 'I'
JP Z,INTERPRT
CP 'G'
JP Z,M_GOTO
CP 'X'
JP Z,CPMLOAD
LD A,'?' ; Get a "?"
RST 08H ; Print it
JR MAIN0
;------------------------------------------------------------------------------
; Print string of characters to Serial A until byte=$00, WITH CR, LF
;------------------------------------------------------------------------------
M_PRINT LD A,(HL) ; Get character
OR A ; Is it $00 ?
RET Z ; Then RETurn on terminator
RST 08H ; Print it
INC HL ; Next Character
JR M_PRINT ; Continue until $00
TXCRLF LD A,$0D ;
RST 08H ; Print character
LD A,$0A ;
RST 08H ; Print character
RET
;------------------------------------------------------------------------------
; Get a character from the console, must be $20-$7F to be valid (no control characters)
; <Ctrl-c> and <SPACE> breaks with the Zero Flag set
;------------------------------------------------------------------------------
M_GETCHR CALL RDCHR ; RX a Character
CP $03 ; <ctrl-c> User break?
RET Z
CP $20 ; <space> or better?
JR C,M_GETCHR ; Do it again until we get something usable
RET
;------------------------------------------------------------------------------
; Gets two ASCII characters from the console (assuming them to be HEX 0-9 A-F)
; Moves them into B and C, converts them into a byte value in A and updates a
; Checksum value in E
;------------------------------------------------------------------------------
GET2 CALL M_GETCHR ; Get us a valid character to work with
LD B,A ; Load it in B
CALL M_GETCHR ; Get us another character
LD C,A ; load it in C
CALL BCTOA ; Convert ASCII to byte
LD C,A ; Build the checksum
LD A,E
SUB C ; The checksum should always equal zero when checked
LD E,A ; Save the checksum back where it came from
LD A,C ; Retrieve the byte and go back
RET
;------------------------------------------------------------------------------
; Gets four Hex characters from the console, converts them to values in HL
;------------------------------------------------------------------------------
GETHL LD HL,$0000 ; Gets xxxx but sets Carry Flag on any Terminator
CALL ECHO ; RX a Character
CP $0D ; <CR>?
JR NZ,GETX2 ; other key
SETCY SCF ; Set Carry Flag
RET ; and Return to main program
;------------------------------------------------------------------------------
; This routine converts last four hex characters (0-9 A-F) user types into a value in HL
; Rotates the old out and replaces with the new until the user hits a terminating character
;------------------------------------------------------------------------------
GETX LD HL,$0000 ; CLEAR HL
GETX1 CALL ECHO ; RX a character from the console
CP $0D ; <CR>
RET Z ; quit
CP $2C ; <,> can be used to safely quit for multiple entries
RET Z ; (Like filling both DE and HL from the user)
GETX2 CP $03 ; Likewise, a <ctrl-C> will terminate clean, too, but
JR Z,SETCY ; It also sets the Carry Flag for testing later.
ADD HL,HL ; Otherwise, rotate the previous low nibble to high
ADD HL,HL ; rather slowly
ADD HL,HL ; until we get to the top
ADD HL,HL ; and then we can continue on.
SUB $30 ; Convert ASCII to byte value
CP $0A ; Are we in the 0-9 range?
JR C,GETX3 ; Then we just need to sub $30, but if it is A-F
SUB $07 ; We need to take off 7 more to get the value down to
GETX3 AND $0F ; to the right hex value
ADD A,L ; Add the high nibble to the low
LD L,A ; Move the byte back to A
JR GETX1 ; and go back for next character until he terminates
;------------------------------------------------------------------------------
; Convert ASCII characters in B C registers to a byte value in A
;------------------------------------------------------------------------------
BCTOA LD A,B ; Move the hi order byte to A
SUB $30 ; Take it down from Ascii
CP $0A ; Are we in the 0-9 range here?
JR C,BCTOA1 ; If so, get the next nybble
SUB $07 ; But if A-F, take it down some more
BCTOA1 RLCA ; Rotate the nybble from low to high
RLCA ; One bit at a time
RLCA ; Until we
RLCA ; Get there with it
LD B,A ; Save the converted high nybble
LD A,C ; Now get the low order byte
SUB $30 ; Convert it down from Ascii
CP $0A ; 0-9 at this point?
JR C,BCTOA2 ; Good enough then, but
SUB $07 ; Take off 7 more if it's A-F
BCTOA2 ADD A,B ; Add in the high order nybble
RET
;------------------------------------------------------------------------------
; Get a character and echo it back to the user
;------------------------------------------------------------------------------
ECHO CALL RDCHR
CALL WRCHR
RET
;------------------------------------------------------------------------------
; GOTO command
;------------------------------------------------------------------------------
M_GOTO CALL GETHL ; ENTRY POINT FOR <G>oto addr. Get XXXX from user.
RET C ; Return if invalid
PUSH HL
RET ; Jump to HL address value
;------------------------------------------------------------------------------
; LOAD Intel Hex format file from the console.
; [Intel Hex Format is:
; 1) Colon (Frame 0)
; 2) Record Length Field (Frames 1 and 2)
; 3) Load Address Field (Frames 3,4,5,6)
; 4) Record Type Field (Frames 7 and 8)
; 5) Data Field (Frames 9 to 9+2*(Record Length)-1
; 6) Checksum Field - Sum of all byte values from Record Length to and
; including Checksum Field = 0 ]
;------------------------------------------------------------------------------
LOAD LD E,0 ; First two Characters is the Record Length Field
CALL GET2 ; Get us two characters into BC, convert it to a byte <A>
LD D,A ; Load Record Length count into D
CALL GET2 ; Get next two characters, Memory Load Address <H>
LD H,A ; put value in H register.
CALL GET2 ; Get next two characters, Memory Load Address <L>
LD L,A ; put value in L register.
CALL GET2 ; Get next two characters, Record Field Type
CP $01 ; Record Field Type 00 is Data, 01 is End of File
JR NZ,LOAD2 ; Must be the end of that file
CALL GET2 ; Get next two characters, assemble into byte
LD A,E ; Recall the Checksum byte
AND A ; Is it Zero?
JR Z,LOAD00 ; Print footer reached message
JR LOADERR ; Checksums don't add up, Error out
LOAD2 LD A,D ; Retrieve line character counter
AND A ; Are we done with this line?
JR Z,LOAD3 ; Get two more ascii characters, build a byte and checksum
CALL GET2 ; Get next two chars, convert to byte in A, checksum it
LD (HL),A ; Move converted byte in A to memory location
INC HL ; Increment pointer to next memory location
LD A,'.' ; Print out a "." for every byte loaded
RST 08H ;
DEC D ; Decrement line character counter
JR LOAD2 ; and keep loading into memory until line is complete
LOAD3 CALL GET2 ; Get two chars, build byte and checksum
LD A,E ; Check the checksum value
AND A ; Is it zero?
RET Z
LOADERR LD HL,CKSUMERR ; Get "Checksum Error" message
CALL M_PRINT ; Print Message from (HL) and terminate the load
RET
LOAD00 LD HL,LDETXT ; Print load complete message
CALL M_PRINT
RET
;------------------------------------------------------------------------------
; Start Interpreter
;------------------------------------------------------------------------------
INTERPRT
JP STARTINT
RET
;------------------------------------------------------------------------------
; CP/M load command
;------------------------------------------------------------------------------
CPMLOAD
LD HL,CPMTXT
CALL M_PRINT
CALL M_GETCHR
RET Z ; Cancel if CTRL-C
AND $5F ; uppercase
CP 'Y'
JP Z,CPMLOAD2
RET
CPMTXT
.BYTE $0D,$0A
.TEXT "Boot CP/M?"
.BYTE $00
CPMTXT2
.BYTE $0D,$0A
.TEXT "Loading CP/M"
.BYTE $0D,$0A,$00
CPMLOAD2
LD HL,CPMTXT2
CALL M_PRINT
LD B,numSecs
LD A,0
LD (lba0),A
ld (lba1),A
ld (lba2),A
ld (lba3),A
LD HL,loadAddr
LD (dmaAddr),HL
processSectors:
call readhst
LD DE,0200H
LD HL,(dmaAddr)
ADD HL,DE
LD (dmaAddr),HL
LD A,(lba0)
INC A
LD (lba0),A
djnz processSectors
; Start CP/M using entry at top of BIOS
; The current active console stream ID is pushed onto the stack
; to allow the CBIOS to pick it up
; 0 = ACIA0, 1 = ACIA1
ld A,(primaryIO)
PUSH AF
ld HL,($FFFE)
jp (HL)
;------------------------------------------------------------------------------
; ROUTINES AS USED IN BIOS
;------------------------------------------------------------------------------
;================================================================================================
; Convert track/head/sector into LBA for physical access to the disk
;================================================================================================
setLBAaddr:
; Transfer LBA to disk (LBA3 not used on SD card)
LD A,(lba2)
OUT (SD_LBA2),A
LD A,(lba1)
OUT (SD_LBA1),A
LD A,(lba0)
OUT (SD_LBA0),A
RET
;================================================================================================
; Read physical sector from host
;================================================================================================
readhst:
PUSH AF
PUSH BC
PUSH HL
rdWait1: IN A,(SD_STATUS)
CP 128
JR NZ,rdWait1
CALL setLBAaddr
LD A,$00 ; 00 = Read block
OUT (SD_CONTROL),A
LD c,4
; LD HL,hstbuf
rd4secs:
LD b,128
rdByte:
rdWait2: IN A,(SD_STATUS)
CP 224 ; Read byte waiting
JR NZ,rdWait2
IN A,(SD_DATA)
LD (HL),A
INC HL
dec b
JR NZ, rdByte
dec c
JR NZ,rd4secs
POP HL
POP BC
POP AF
; XOR a
; ld (erflag),a
RET
;------------------------------------------------------------------------------
; END OF ROUTINES AS USED IN BIOS
;------------------------------------------------------------------------------
M_SIGNON .BYTE "CP/M Boot ROM 2.0"
; .BYTE " based on design by G. Searle"
; .BYTE $0D,$0A
.BYTE $0D,$0A
.TEXT "I-Strt Intrp"
.BYTE $0D,$0A
.TEXT "X-Boot CP/M"
.BYTE $0D,$0A
.TEXT ":nnnn-Load I rcrd"
.BYTE $0D,$0A
.TEXT "Gnnnn-R loc"
.BYTE $0D,$0A
.BYTE $00
M_BASTXT
.BYTE $0D,$0A
.TEXT "Cold or warm?"
.BYTE $0D,$0A,$00
CKSUMERR .BYTE "Checksum error"
.BYTE $0D,$0A,$00
INITTXT
.BYTE $0C
.TEXT "Press [space] to activate console."
.BYTE $0D,$0A, $00
LDETXT
.TEXT "Complete"
.BYTE $0D,$0A, $00
; ==========================================================================================================================
; GENERAL EQUATES
CTRLC .EQU 03H ; Control "C"
CTRLG .EQU 07H ; Control "G"
BKSP .EQU 08H ; Back space
LF .EQU 0AH ; Line feed
CS .EQU 0CH ; Clear screen
CR .EQU 0DH ; Carriage return
CTRLO .EQU 0FH ; Control "O"
CTRLQ .EQU 11H ; Control "Q"
CTRLR .EQU 12H ; Control "R"
CTRLS .EQU 13H ; Control "S"
CTRLU .EQU 15H ; Control "U"
ESC .EQU 1BH ; Escape
DEL .EQU 7FH ; Delete
;===========================================================================================================================
; NASCOM ROM BASIC Ver 4.7,
; used to be here, removed to get rid of the '(C) 1978 Microsoft'
STARTINT:
#INCLUDE "SOURCE\\INTPRT.ASM"
.end

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -0,0 +1,222 @@
"TASM 6502 Assembler. "
/****************************************************************************
/* $Id: tasm65.tab 1.1 1993/07/31 01:12:40 toma Exp $
/****************************************************************************
/* This is the instruction set definition table for the 6502 version of TASM.
/* Thomas N. Anderson, Speech Technology Incorported, June 1987.
/* Note that there are two classes of extended instructions beyond
/* the standard set. The classes are assigned bits as follows:
/* bit 0 = standard set
/* bit 1 = extended instructions for R65C02
/* bit 2 = extended instructions for R65C00/21
/*
/*INSTR ARGS OPCODE BYTES MOD CLASS SHIFT OR */
/*-------------------------------------------*/
ADC #* 69 2 NOP 1
ADC (*,X) 61 2 NOP 1
ADC (*),Y 71 2 NOP 1
ADC (*) 72 2 NOP 2
ADC *,X 7D 3 ZP 1
ADC *,Y 79 3 NOP 1
ADC * 6D 3 ZP 1
AND #* 29 2 NOP 1
AND (*,X) 21 2 NOP 1
AND (*),Y 31 2 NOP 1
AND (*) 32 2 NOP 2
AND *,X 3D 3 ZP 1
AND *,Y 39 3 NOP 1
AND * 2D 3 ZP 1
ASL A 0A 1 NOP 1
ASL *,X 1E 3 ZP 1
ASL * 0E 3 ZP 1
BBR0 *,* 0f 3 CR 6
BBR1 *,* 1f 3 CR 6
BBR2 *,* 2f 3 CR 6
BBR3 *,* 3f 3 CR 6
BBR4 *,* 4f 3 CR 6
BBR5 *,* 5f 3 CR 6
BBR6 *,* 6f 3 CR 6
BBR7 *,* 7f 3 CR 6
BBS0 *,* 8f 3 CR 6
BBS1 *,* 9f 3 CR 6
BBS2 *,* af 3 CR 6
BBS3 *,* bf 3 CR 6
BBS4 *,* cf 3 CR 6
BBS5 *,* df 3 CR 6
BBS6 *,* ef 3 CR 6
BBS7 *,* ff 3 CR 6
BCC * 90 2 R1 1
BCS * B0 2 R1 1
BEQ * F0 2 R1 1
BMI * 30 2 R1 1
BNE * D0 2 R1 1
BPL * 10 2 R1 1
BRA * 80 2 R1 6
BVC * 50 2 R1 1
BVS * 70 2 R1 1
BIT #* 89 2 NOP 2
BIT *,X 3C 3 ZP 2
BIT * 2C 3 ZP 1
BRK "" 00 1 NOP 1
CLC "" 18 1 NOP 1
CLD "" D8 1 NOP 1
CLI "" 58 1 NOP 1
CLV "" B8 1 NOP 1
CMP #* C9 2 NOP 1
CMP (*,X) C1 2 NOP 1
CMP (*),Y D1 2 NOP 1
CMP (*) D2 2 NOP 2
CMP *,X DD 3 ZP 1
CMP *,Y D9 3 NOP 1
CMP * CD 3 ZP 1
CPX #* E0 2 NOP 1
CPX * EC 3 ZP 1
CPY #* C0 2 NOP 1
CPY * CC 3 ZP 1
DEC A 3A 1 NOP 2
DEC *,X DE 3 ZP 1
DEC * CE 3 ZP 1
DEX "" CA 1 NOP 1
DEY "" 88 1 NOP 1
EOR #* 49 2 NOP 1
EOR (*,X) 41 2 NOP 1
EOR (*),Y 51 2 NOP 1
EOR (*) 52 2 NOP 2
EOR *,X 5D 3 ZP 1
EOR *,Y 59 3 NOP 1
EOR * 4D 3 ZP 1
INC A 1A 1 NOP 2
INC *,X FE 3 ZP 1
INC * EE 3 ZP 1
INX "" E8 1 NOP 1
INY "" C8 1 NOP 1
JMP (*,X) 7C 3 NOP 2
JMP (*) 6C 3 NOP 1
JMP * 4C 3 NOP 1
JSR * 20 3 NOP 1
LDA #* A9 2 NOP 1
LDA (*,X) A1 2 NOP 1
LDA (*),Y B1 2 NOP 1
LDA (*) B2 2 NOP 2
LDA *,X BD 3 ZP 1
LDA *,Y B9 3 NOP 1
LDA * AD 3 ZP 1
LDX #* A2 2 NOP 1
LDX *,Y BE 3 ZP 1
LDX * AE 3 ZP 1
LDY #* A0 2 NOP 1
LDY *,X BC 3 ZP 1
LDY * AC 3 ZP 1
LSR A 4A 1 NOP 1
LSR *,X 5E 3 ZP 1
LSR * 4E 3 ZP 1
MUL "" 02 1 NOP 4 /* R65C00/21 only*/
NOP "" EA 1 NOP 1
ORA #* 09 2 NOP 1
ORA (*,X) 01 2 NOP 1
ORA (*),Y 11 2 NOP 1
ORA (*) 12 2 NOP 2
ORA *,X 1D 3 ZP 1
ORA *,Y 19 3 NOP 1
ORA * 0D 3 ZP 1
PHA "" 48 1 NOP 1
PHP "" 08 1 NOP 1
PHX "" DA 1 NOP 6
PHY "" 5A 1 NOP 6
PLA "" 68 1 NOP 1
PLP "" 28 1 NOP 1
PLX "" FA 1 NOP 6
PLY "" 7A 1 NOP 6
RMB0 * 07 2 NOP 6
RMB1 * 17 2 NOP 6
RMB2 * 27 2 NOP 6
RMB3 * 37 2 NOP 6
RMB4 * 47 2 NOP 6
RMB5 * 57 2 NOP 6
RMB6 * 67 2 NOP 6
RMB7 * 77 2 NOP 6
ROL A 2A 1 NOP 1
ROL *,X 3E 3 ZP 1
ROL * 2E 3 ZP 1
ROR A 6A 1 NOP 1
ROR *,X 7E 3 ZP 1
ROR * 6E 3 ZP 1
RTI "" 40 1 NOP 1
RTS "" 60 1 NOP 1
SBC #* E9 2 NOP 1
SBC (*,X) E1 2 NOP 1
SBC (*),Y F1 2 NOP 1
SBC (*) F2 2 NOP 2
SBC *,X FD 3 ZP 1
SBC *,Y F9 3 NOP 1
SBC * ED 3 ZP 1
SEC "" 38 1 NOP 1
SED "" F8 1 NOP 1
SEI "" 78 1 NOP 1
SMB0 * 87 2 NOP 6
SMB1 * 97 2 NOP 6
SMB2 * a7 2 NOP 6
SMB3 * b7 2 NOP 6
SMB4 * c7 2 NOP 6
SMB5 * d7 2 NOP 6
SMB6 * e7 2 NOP 6
SMB7 * f7 2 NOP 6
STA (*,X) 81 2 NOP 1
STA (*),Y 91 2 NOP 1
STA (*) 92 2 NOP 2
STA *,X 9D 3 ZP 1
STA *,Y 99 3 NOP 1
STA * 8D 3 ZP 1
STX *,Y 96 2 ZP 1
STX * 8E 3 ZP 1
STY *,X 94 2 NOP 1
STY * 8C 3 ZP 1
STZ *,X 9e 3 ZP 2
STZ * 9c 3 ZP 2
TAX "" AA 1 NOP 1
TAY "" A8 1 NOP 1
TRB * 1c 3 ZP 2
TSB * 0c 3 ZP 2
TSX "" BA 1 NOP 1
TXA "" 8A 1 NOP 1
TXS "" 9A 1 NOP 1
TYA "" 98 1 NOP 1

View File

@@ -0,0 +1,257 @@
"TASM 8085 Assembler. "
/****************************************************************************
/* $Id: tasm85.tab 1.1 1993/07/31 01:12:40 toma Exp $
/****************************************************************************
/* This is the instruction set definition table for the 8085 version of TASM.
/* Thomas N. Anderson, Speech Technology Incorporated
/* This table authored and submitted by Gary Kirk Bach.
/*
/*INSTR ARGS OPCODE BYTES MOD CLASS */
/*-----------------*/
ACI * CE 2 NOP 1
ADC B 88 1 NOP 1
ADC C 89 1 NOP 1
ADC D 8A 1 NOP 1
ADC E 8B 1 NOP 1
ADC H 8C 1 NOP 1
ADC L 8D 1 NOP 1
ADC M 8E 1 NOP 1
ADC A 8F 1 NOP 1
ADD B 80 1 NOP 1
ADD C 81 1 NOP 1
ADD D 82 1 NOP 1
ADD E 83 1 NOP 1
ADD H 84 1 NOP 1
ADD L 85 1 NOP 1
ADD M 86 1 NOP 1
ADD A 87 1 NOP 1
ADI * C6 2 NOP 1
ANA B A0 1 NOP 1
ANA C A1 1 NOP 1
ANA D A2 1 NOP 1
ANA E A3 1 NOP 1
ANA H A4 1 NOP 1
ANA L A5 1 NOP 1
ANA M A6 1 NOP 1
ANA A A7 1 NOP 1
ANI * E6 2 NOP 1
CALL * CD 3 NOP 1
CC * DC 3 NOP 1
CM * FC 3 NOP 1
CMA "" 2F 1 NOP 1
CMC "" 3F 1 NOP 1
CMP B B8 1 NOP 1
CMP C B9 1 NOP 1
CMP D BA 1 NOP 1
CMP E BB 1 NOP 1
CMP H BC 1 NOP 1
CMP L BD 1 NOP 1
CMP M BE 1 NOP 1
CMP A BF 1 NOP 1
CNC * D4 3 NOP 1
CNZ * C4 3 NOP 1
CP * F4 3 NOP 1
CPE * EC 3 NOP 1
CPI * FE 2 NOP 1
CPO * E4 3 NOP 1
CZ * CC 3 NOP 1
DAA "" 27 1 NOP 1
DAD B 09 1 NOP 1
DAD D 19 1 NOP 1
DAD H 29 1 NOP 1
DAD SP 39 1 NOP 1
DCR B 05 1 NOP 1
DCR C 0D 1 NOP 1
DCR D 15 1 NOP 1
DCR E 1D 1 NOP 1
DCR H 25 1 NOP 1
DCR L 2D 1 NOP 1
DCR M 35 1 NOP 1
DCR A 3D 1 NOP 1
DCX B 0B 1 NOP 1
DCX D 1B 1 NOP 1
DCX H 2B 1 NOP 1
DCX SP 3B 1 NOP 1
DI "" F3 1 NOP 1
EI "" FB 1 NOP 1
HLT "" 76 1 NOP 1
IN * DB 2 NOP 1
INR B 04 1 NOP 1
INR C 0C 1 NOP 1
INR D 14 1 NOP 1
INR E 1C 1 NOP 1
INR H 24 1 NOP 1
INR L 2C 1 NOP 1
INR M 34 1 NOP 1
INR A 3C 1 NOP 1
INX B 03 1 NOP 1
INX D 13 1 NOP 1
INX H 23 1 NOP 1
INX SP 33 1 NOP 1
JC * DA 3 NOP 1
JM * FA 3 NOP 1
JMP * C3 3 NOP 1
JNC * D2 3 NOP 1
JNZ * C2 3 NOP 1
JP * F2 3 NOP 1
JPE * EA 3 NOP 1
JPO * E2 3 NOP 1
JZ * CA 3 NOP 1
LDA * 3A 3 NOP 1
LDAX B 0A 1 NOP 1
LDAX D 1A 1 NOP 1
LHLD * 2A 3 NOP 1
LXI B,* 01 3 NOP 1
LXI D,* 11 3 NOP 1
LXI H,* 21 3 NOP 1
LXI SP,* 31 3 NOP 1
MOV B,B 40 1 NOP 1
MOV B,C 41 1 NOP 1
MOV B,D 42 1 NOP 1
MOV B,E 43 1 NOP 1
MOV B,H 44 1 NOP 1
MOV B,L 45 1 NOP 1
MOV B,M 46 1 NOP 1
MOV B,A 47 1 NOP 1
MOV C,B 48 1 NOP 1
MOV C,C 49 1 NOP 1
MOV C,D 4A 1 NOP 1
MOV C,E 4B 1 NOP 1
MOV C,H 4C 1 NOP 1
MOV C,L 4D 1 NOP 1
MOV C,M 4E 1 NOP 1
MOV C,A 4F 1 NOP 1
MOV D,B 50 1 NOP 1
MOV D,C 51 1 NOP 1
MOV D,D 52 1 NOP 1
MOV D,E 53 1 NOP 1
MOV D,H 54 1 NOP 1
MOV D,L 55 1 NOP 1
MOV D,M 56 1 NOP 1
MOV D,A 57 1 NOP 1
MOV E,B 58 1 NOP 1
MOV E,C 59 1 NOP 1
MOV E,D 5A 1 NOP 1
MOV E,E 5B 1 NOP 1
MOV E,H 5C 1 NOP 1
MOV E,L 5D 1 NOP 1
MOV E,M 5E 1 NOP 1
MOV E,A 5F 1 NOP 1
MOV H,B 60 1 NOP 1
MOV H,C 61 1 NOP 1
MOV H,D 62 1 NOP 1
MOV H,E 63 1 NOP 1
MOV H,H 64 1 NOP 1
MOV H,L 65 1 NOP 1
MOV H,M 66 1 NOP 1
MOV H,A 67 1 NOP 1
MOV L,B 68 1 NOP 1
MOV L,C 69 1 NOP 1
MOV L,D 6A 1 NOP 1
MOV L,E 6B 1 NOP 1
MOV L,H 6C 1 NOP 1
MOV L,L 6D 1 NOP 1
MOV L,M 6E 1 NOP 1
MOV L,A 6F 1 NOP 1
MOV M,B 70 1 NOP 1
MOV M,C 71 1 NOP 1
MOV M,D 72 1 NOP 1
MOV M,E 73 1 NOP 1
MOV M,H 74 1 NOP 1
MOV M,L 75 1 NOP 1
MOV M,A 77 1 NOP 1
MOV A,B 78 1 NOP 1
MOV A,C 79 1 NOP 1
MOV A,D 7A 1 NOP 1
MOV A,E 7B 1 NOP 1
MOV A,H 7C 1 NOP 1
MOV A,L 7D 1 NOP 1
MOV A,M 7E 1 NOP 1
MOV A,A 7F 1 NOP 1
MVI B,* 06 2 NOP 1
MVI C,* 0E 2 NOP 1
MVI D,* 16 2 NOP 1
MVI E,* 1E 2 NOP 1
MVI H,* 26 2 NOP 1
MVI L,* 2E 2 NOP 1
MVI M,* 36 2 NOP 1
MVI A,* 3E 2 NOP 1
NOP "" 00 1 NOP 1
ORA B B0 1 NOP 1
ORA C B1 1 NOP 1
ORA D B2 1 NOP 1
ORA E B3 1 NOP 1
ORA H B4 1 NOP 1
ORA L B5 1 NOP 1
ORA M B6 1 NOP 1
ORA A B7 1 NOP 1
ORI * F6 2 NOP 1
OUT * D3 2 NOP 1
PCHL "" E9 1 NOP 1
POP B C1 1 NOP 1
POP D D1 1 NOP 1
POP H E1 1 NOP 1
POP PSW F1 1 NOP 1
PUSH B C5 1 NOP 1
PUSH D D5 1 NOP 1
PUSH H E5 1 NOP 1
PUSH PSW F5 1 NOP 1
RAL "" 17 1 NOP 1
RAR "" 1F 1 NOP 1
RC "" D8 1 NOP 1
RET "" C9 1 NOP 1
RIM "" 20 1 NOP 1
RLC "" 07 1 NOP 1
RM "" F8 1 NOP 1
RNC "" D0 1 NOP 1
RNZ "" C0 1 NOP 1
RP "" F0 1 NOP 1
RPE "" E8 1 NOP 1
RPO "" E0 1 NOP 1
RRC "" 0F 1 NOP 1
RST 0 C7 1 NOP 1
RST 1 CF 1 NOP 1
RST 2 D7 1 NOP 1
RST 3 DF 1 NOP 1
RST 4 E7 1 NOP 1
RST 5 EF 1 NOP 1
RST 6 F7 1 NOP 1
RST 7 FF 1 NOP 1
RZ "" C8 1 NOP 1
SBB B 98 1 NOP 1
SBB C 99 1 NOP 1
SBB D 9A 1 NOP 1
SBB E 9B 1 NOP 1
SBB H 9C 1 NOP 1
SBB L 9D 1 NOP 1
SBB M 9E 1 NOP 1
SBB A 9F 1 NOP 1
SBI * DE 2 NOP 1
SHLD * 22 3 NOP 1
SIM "" 30 1 NOP 1
SPHL "" F9 1 NOP 1
STA * 32 3 NOP 1
STAX B 02 1 NOP 1
STAX D 12 1 NOP 1
STC "" 37 1 NOP 1
SUB B 90 1 NOP 1
SUB C 91 1 NOP 1
SUB D 92 1 NOP 1
SUB E 93 1 NOP 1
SUB H 94 1 NOP 1
SUB L 95 1 NOP 1
SUB M 96 1 NOP 1
SUB A 97 1 NOP 1
SUI * D6 2 NOP 1
XCHG "" EB 1 NOP 1
XRA B A8 1 NOP 1
XRA C A9 1 NOP 1
XRA D AA 1 NOP 1
XRA E AB 1 NOP 1
XRA H AC 1 NOP 1
XRA L AD 1 NOP 1
XRA M AE 1 NOP 1
XRA A AF 1 NOP 1
XRI * EE 2 NOP 1
XTHL "" E3 1 NOP 1

View File

@@ -0,0 +1,2 @@
@echo off
C:\winevdm\otvdm.exe tasm.exe %*

File diff suppressed because it is too large Load Diff

View File

@@ -1 +1 @@
`define BUILD_DATE "241202"
`define BUILD_DATE "241205"

Binary file not shown.